summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2023-07-07 19:41:06 +0200
committerMoonchild <moonchild@palemoon.org>2023-07-07 19:41:06 +0200
commitea9077a8a5fd8b9f7d5397d18e84aa20fb87f406 (patch)
tree64c21104a540df2812482dcc520952869db04ebf
parentb4af6b6265ed489acbc3dc5a2fd9d4ed7f783b13 (diff)
parentaf5dbfc12003e61f21d2a7c71f239d18ae3945cf (diff)
downloaduxp-ea9077a8a5fd8b9f7d5397d18e84aa20fb87f406.tar.gz
Merge branch 'master' into releaseRC_20230707RB_20230711
-rw-r--r--build/moz.configure/compile-checks.configure148
-rw-r--r--build/moz.configure/flags.configure13
-rw-r--r--build/moz.configure/toolchain.configure47
-rw-r--r--build/moz.configure/warnings.configure6
-rw-r--r--config/check_spidermonkey_style.py1
-rw-r--r--db/sqlite3/src/sqlite3.c37406
-rw-r--r--db/sqlite3/src/sqlite3.h1081
-rw-r--r--devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js6
-rw-r--r--devtools/client/shared/autocomplete-popup.js2
-rw-r--r--devtools/client/shared/test/browser_html_tooltip_arrow-01.js6
-rw-r--r--devtools/client/shared/test/browser_html_tooltip_arrow-02.js6
-rw-r--r--devtools/client/shared/test/browser_inplace-editor_autocomplete_offset.js2
-rw-r--r--devtools/client/shared/widgets/tooltip/HTMLTooltip.js6
-rw-r--r--devtools/server/actors/inspector.js5
-rw-r--r--devtools/shared/layout/utils.js22
-rw-r--r--dom/base/DOMMatrix.cpp408
-rw-r--r--dom/base/DOMMatrix.h171
-rw-r--r--dom/base/DOMPoint.cpp63
-rw-r--r--dom/base/DOMPoint.h22
-rw-r--r--dom/base/DOMQuad.cpp171
-rw-r--r--dom/base/DOMQuad.h26
-rw-r--r--dom/base/DOMRect.cpp61
-rw-r--r--dom/base/DOMRect.h77
-rw-r--r--dom/base/StructuredCloneHolder.cpp134
-rw-r--r--dom/base/StructuredCloneTags.h9
-rw-r--r--dom/base/WebKitCSSMatrix.cpp7
-rw-r--r--dom/base/WebKitCSSMatrix.h3
-rw-r--r--dom/base/nsDeprecatedOperationList.h1
-rw-r--r--dom/bindings/Bindings.conf2
-rw-r--r--dom/bindings/Errors.msg3
-rw-r--r--dom/filesystem/GetDirectoryListingTask.cpp11
-rw-r--r--dom/filesystem/GetFilesHelper.cpp82
-rw-r--r--dom/filesystem/GetFilesHelper.h9
-rw-r--r--dom/filesystem/tests/filesystem_commons.js4
-rw-r--r--dom/filesystem/tests/script_fileList.js29
-rw-r--r--dom/filesystem/tests/test_webkitdirectory.html86
-rw-r--r--dom/locales/en-US/chrome/dom/dom.properties1
-rw-r--r--dom/webidl/DOMMatrix.webidl57
-rw-r--r--dom/webidl/DOMPoint.webidl19
-rw-r--r--dom/webidl/DOMQuad.webidl33
-rw-r--r--dom/webidl/DOMRect.webidl15
-rw-r--r--dom/webidl/WebKitCSSMatrix.webidl3
-rw-r--r--js/public/Class.h2
-rw-r--r--js/public/Equality.h68
-rw-r--r--js/public/GCVector.h36
-rw-r--r--js/public/Proxy.h9
-rw-r--r--js/public/Result.h223
-rw-r--r--js/public/TypeDecls.h15
-rw-r--r--js/src/NamespaceImports.h8
-rw-r--r--js/src/builtin/Array.js95
-rw-r--r--js/src/builtin/Date.js6
-rw-r--r--js/src/builtin/MapObject.cpp1
-rw-r--r--js/src/builtin/Object.cpp2
-rw-r--r--js/src/builtin/Object.js9
-rw-r--r--js/src/builtin/RegExp.cpp76
-rw-r--r--js/src/builtin/RegExp.h20
-rw-r--r--js/src/builtin/String.js88
-rw-r--r--js/src/builtin/SymbolObject.cpp48
-rw-r--r--js/src/builtin/SymbolObject.h5
-rw-r--r--js/src/builtin/TypedArray.js85
-rw-r--r--js/src/builtin/Utilities.js8
-rw-r--r--js/src/builtin/intl/Collator.cpp237
-rw-r--r--js/src/builtin/intl/Collator.h20
-rw-r--r--js/src/builtin/intl/Collator.js298
-rw-r--r--js/src/builtin/intl/CommonFunctions.cpp91
-rw-r--r--js/src/builtin/intl/CommonFunctions.h71
-rw-r--r--js/src/builtin/intl/CommonFunctions.js1231
-rw-r--r--js/src/builtin/intl/DateTimeFormat.cpp699
-rw-r--r--js/src/builtin/intl/DateTimeFormat.h62
-rw-r--r--js/src/builtin/intl/DateTimeFormat.js533
-rw-r--r--js/src/builtin/intl/ICUHeader.h1
-rw-r--r--js/src/builtin/intl/IntlObject.cpp288
-rw-r--r--js/src/builtin/intl/IntlObject.h29
-rw-r--r--js/src/builtin/intl/IntlObject.js101
-rw-r--r--js/src/builtin/intl/LangTagMappingsGenerated.js382
-rw-r--r--js/src/builtin/intl/LanguageTag.cpp1728
-rw-r--r--js/src/builtin/intl/LanguageTag.h770
-rw-r--r--js/src/builtin/intl/LanguageTagGenerated.cpp950
-rw-r--r--js/src/builtin/intl/Locale.cpp1430
-rw-r--r--js/src/builtin/intl/Locale.h63
-rw-r--r--js/src/builtin/intl/NumberFormat.cpp208
-rw-r--r--js/src/builtin/intl/NumberFormat.h16
-rw-r--r--js/src/builtin/intl/NumberFormat.js270
-rw-r--r--js/src/builtin/intl/PluralRules.cpp49
-rw-r--r--js/src/builtin/intl/PluralRules.h11
-rw-r--r--js/src/builtin/intl/PluralRules.js159
-rw-r--r--js/src/builtin/intl/RelativeTimeFormat.cpp44
-rw-r--r--js/src/builtin/intl/RelativeTimeFormat.h11
-rw-r--r--js/src/builtin/intl/RelativeTimeFormat.js50
-rw-r--r--js/src/builtin/intl/SharedIntlData.cpp320
-rw-r--r--js/src/builtin/intl/SharedIntlData.h142
-rw-r--r--js/src/builtin/intl/make_intl_data.py1642
-rw-r--r--js/src/gc/Allocator.cpp2
-rw-r--r--js/src/gc/GCRuntime.h29
-rw-r--r--js/src/gc/Marking.cpp50
-rw-r--r--js/src/gc/Zone.h8
-rw-r--r--js/src/jit-test/tests/auto-regress/bug1263558.js2
-rw-r--r--js/src/jit-test/tests/basic/bug920484.js9
-rw-r--r--js/src/jit-test/tests/ion/bug913749.js3
-rw-r--r--js/src/jit/InlinableNatives.h6
-rw-r--r--js/src/jit/MCallOptimize.cpp17
-rw-r--r--js/src/jit/VMFunctions.cpp1
-rw-r--r--js/src/js.msg6
-rw-r--r--js/src/jsapi-tests/testLooselyEqual.cpp10
-rw-r--r--js/src/jsapi-tests/testSameValue.cpp5
-rw-r--r--js/src/jsapi-tests/tests.h7
-rw-r--r--js/src/jsapi.cpp30
-rw-r--r--js/src/jsapi.h13
-rw-r--r--js/src/jsarray.cpp6
-rw-r--r--js/src/jscntxt.cpp35
-rw-r--r--js/src/jscntxt.h39
-rw-r--r--js/src/jsfriendapi.h14
-rw-r--r--js/src/jsgc.cpp276
-rw-r--r--js/src/jsgc.h3
-rw-r--r--js/src/jsiter.cpp8
-rw-r--r--js/src/jsobj.cpp37
-rw-r--r--js/src/jsobj.h10
-rw-r--r--js/src/jsobjinlines.h4
-rw-r--r--js/src/jspubtd.h1
-rw-r--r--js/src/jsstr.cpp639
-rw-r--r--js/src/jsstr.h27
-rw-r--r--js/src/jsweakmap.cpp4
-rw-r--r--js/src/moz.build7
-rw-r--r--js/src/old-configure.in2
-rw-r--r--js/src/proxy/ScriptedProxyHandler.cpp2
-rw-r--r--js/src/shell/js.cpp6
-rw-r--r--js/src/tests/Intl/Collator/call.js69
-rw-r--r--js/src/tests/Intl/Collator/caseFirst.js197
-rw-r--r--js/src/tests/Intl/DateTimeFormat/call.js167
-rw-r--r--js/src/tests/Intl/DateTimeFormat/hourCycle.js145
-rw-r--r--js/src/tests/Intl/DateTimeFormat/mozExtensions.js58
-rw-r--r--js/src/tests/Intl/DateTimeFormat/unwrapping.js224
-rw-r--r--js/src/tests/Intl/NumberFormat/call.js167
-rw-r--r--js/src/tests/Intl/NumberFormat/unwrapping.js226
-rw-r--r--js/src/tests/Intl/PluralRules/call.js71
-rw-r--r--js/src/tests/Intl/String/shell.js0
-rw-r--r--js/src/tests/Intl/String/toLocaleLowerCase.js69
-rw-r--r--js/src/tests/Intl/String/toLocaleUpperCase.js69
-rw-r--r--js/src/tests/ecma/String/15.5.4.12-5.js3
-rw-r--r--js/src/tests/ecma_5/String/string-space-trim.js28
-rw-r--r--js/src/tests/ecma_5/String/string-upper-lower-mapping.js131077
-rw-r--r--js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js5556
-rw-r--r--js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js900
-rw-r--r--js/src/tests/jstests.list23
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js69
-rw-r--r--js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js64
-rw-r--r--js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js11
-rw-r--r--js/src/tests/non262/Intl/Locale/browser.js0
-rw-r--r--js/src/tests/non262/Intl/Locale/cross-compartment.js28
-rw-r--r--js/src/tests/non262/Intl/Locale/grandfathered.js75
-rw-r--r--js/src/tests/non262/Intl/Locale/likely-subtags-generated.js3433
-rw-r--r--js/src/tests/non262/Intl/Locale/likely-subtags.js61
-rw-r--r--js/src/tests/non262/Intl/Locale/same-compartment.js26
-rw-r--r--js/src/tests/non262/Intl/Locale/shell.js0
-rw-r--r--js/src/tests/non262/Intl/Locale/surface.js98
-rw-r--r--js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js64
-rw-r--r--js/src/tests/non262/Intl/best-available-locale-from-default-locale.js107
-rw-r--r--js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js74
-rw-r--r--js/src/tests/non262/Intl/tolower-ascii-equivalent.js47
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js21
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-grandfathered.js52
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js39
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js21
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js57
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js22
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js18
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js71
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js12
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js15
-rw-r--r--js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js31
-rw-r--r--js/src/tests/non262/Intl/variant-with-preferred-value.js58
-rw-r--r--js/src/vm/ArgumentsObject.cpp10
-rw-r--r--js/src/vm/CommonPropertyNames.h10
-rw-r--r--js/src/vm/Debugger.cpp10
-rw-r--r--js/src/vm/EnvironmentObject.cpp43
-rw-r--r--js/src/vm/EqualityOperations.cpp215
-rw-r--r--js/src/vm/EqualityOperations.h44
-rw-r--r--js/src/vm/GlobalObject.cpp1
-rw-r--r--js/src/vm/GlobalObject.h20
-rw-r--r--js/src/vm/Initialization.cpp2
-rw-r--r--js/src/vm/Interpreter.cpp165
-rw-r--r--js/src/vm/Interpreter.h10
-rw-r--r--js/src/vm/NativeObject-inl.h11
-rw-r--r--js/src/vm/NativeObject.cpp1
-rw-r--r--js/src/vm/Runtime.h4
-rw-r--r--js/src/vm/SelfHosting.cpp63
-rw-r--r--js/src/vm/SpecialCasing.txt281
-rw-r--r--js/src/vm/String.h14
-rw-r--r--js/src/vm/StringBuffer.cpp6
-rw-r--r--js/src/vm/TypedArrayObject.cpp2
-rw-r--r--js/src/vm/Unicode.cpp2616
-rw-r--r--js/src/vm/Unicode.h57
-rw-r--r--js/src/vm/UnicodeNonBMP.h24
-rwxr-xr-xjs/src/vm/make_unicode.py675
-rw-r--r--layout/style/nsCSSParser.cpp121
-rw-r--r--mfbt/Assertions.h14
-rw-r--r--mfbt/FloatingPoint.h14
-rw-r--r--mfbt/Maybe.h67
-rw-r--r--mfbt/Result.h312
-rw-r--r--mfbt/TextUtils.h149
-rw-r--r--mfbt/Vector.h11
-rw-r--r--mfbt/moz.build1
-rw-r--r--mfbt/tests/TestResult.cpp212
-rw-r--r--mfbt/tests/moz.build1
-rw-r--r--modules/libpref/init/all.js9
-rw-r--r--moz.configure2
-rw-r--r--netwerk/protocol/http/nsCORSListenerProxy.cpp32
-rw-r--r--old-configure.in2
-rw-r--r--python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py6
-rw-r--r--toolkit/locales/en-US/chrome/global/aboutSupport.dtd9
-rw-r--r--toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd11
-rw-r--r--toolkit/locales/en-US/chrome/mozapps/extensions/extensions.properties39
-rw-r--r--toolkit/mozapps/extensions/content/extensions.css34
-rw-r--r--toolkit/mozapps/extensions/content/extensions.xml46
-rw-r--r--toolkit/mozapps/extensions/content/extensions.xul27
-rw-r--r--toolkit/mozapps/extensions/internal/XPIProvider.jsm121
-rw-r--r--toolkit/themes/linux/mozapps/extensions/category-experiments.pngbin822 -> 0 bytes
-rw-r--r--toolkit/themes/linux/mozapps/extensions/experimentGeneric.pngbin822 -> 0 bytes
-rw-r--r--toolkit/themes/linux/mozapps/extensions/extensions.css34
-rw-r--r--toolkit/themes/linux/mozapps/jar.mn2
-rw-r--r--toolkit/themes/osx/mozapps/extensions/category-experiments.pngbin822 -> 0 bytes
-rw-r--r--toolkit/themes/osx/mozapps/extensions/experimentGeneric.pngbin822 -> 0 bytes
-rw-r--r--toolkit/themes/osx/mozapps/extensions/extensions.css34
-rw-r--r--toolkit/themes/osx/mozapps/jar.mn2
-rw-r--r--toolkit/themes/windows/mozapps/extensions/experimentGeneric.pngbin822 -> 0 bytes
-rw-r--r--toolkit/themes/windows/mozapps/extensions/extensions.css34
-rw-r--r--toolkit/themes/windows/mozapps/jar.mn1
-rw-r--r--xpcom/base/nsCycleCollector.cpp5
-rw-r--r--xpcom/io/nsLocalFileWin.cpp2
229 files changed, 116666 insertions, 86887 deletions
diff --git a/build/moz.configure/compile-checks.configure b/build/moz.configure/compile-checks.configure
index 9ef9496db5..7f45b2d4b1 100644
--- a/build/moz.configure/compile-checks.configure
+++ b/build/moz.configure/compile-checks.configure
@@ -74,55 +74,45 @@ def check_headers(*headers, **kwargs):
return checks
-@depends(c_compiler)
-def warnings_cflags(c_compiler):
- return []
-
-@depends(cxx_compiler)
-def warnings_cxxflags(cxx_compiler):
- return []
-
-
-# Tests whether GCC or clang support the given warning flag, and if it is,
-# add it to the list of warning flags for the build.
-# - `warning` is the warning flag (e.g. -Wfoo)
+# Determine whether to add a given flag to the given lists of flags for C or
+# C++ compilation.
+# - `flag` is the flag to test
+# - `cflags` is a @depends function for the list of C compiler flags to add to
+# - `cxxflags` is a @depends function for the list of C++ compiler flags to
+# add to
+# - `test_flags` is a list of flags to pass to the compiler instead of merely
+# passing `flag`. This is especially useful for checking warning flags. If
+# this list is empty, `flag` will be passed on its own.
# - `compiler` (optional) is the compiler to test against (c_compiler or
# cxx_compiler, from toolchain.configure). When omitted, both compilers
-# are tested.
+# are tested; the list of flags added to is dependent on the compiler tested.
# - `when` (optional) is a @depends function or option name conditioning
# when the warning flag is wanted.
# - `check`, when not set, skips checking whether the flag is supported and
-# adds it to the list of warning flags unconditionally. This is only meant
-# for add_gcc_warning().
+# adds it to the list of flags unconditionally.
@template
-def check_and_add_gcc_warning(warning, compiler=None, when=None, check=True):
- if compiler:
+def check_and_add_flags(flag, cflags, cxxflags, test_flags,
+ compiler=None, when=None, check=True):
+ if compiler is not None:
compilers = (compiler,)
else:
compilers = (c_compiler, cxx_compiler)
- when = when or always
+ if when is None:
+ when = always
+
+ if test_flags:
+ flags = test_flags
+ else:
+ flags = [flag]
for c in compilers:
assert c in (c_compiler, cxx_compiler)
- lang, warnings_flags = {
- c_compiler: ('C', warnings_cflags),
- cxx_compiler: ('C++', warnings_cxxflags),
+ lang, list_of_flags = {
+ c_compiler: ('C', cflags),
+ cxx_compiler: ('C++', cxxflags),
}[c]
- # GCC and clang will fail if given an unknown warning option like
- # -Wfoobar. But later versions won't fail if given an unknown negated
- # warning option like -Wno-foobar. So when we are checking for support
- # of a negated warning option, we actually test the positive form, but
- # add the negated form to the flags variable.
- if (warning.startswith('-Wno-') and
- not warning.startswith('-Wno-error=')):
- flags = ['-Werror', '-W' + warning[5:]]
- elif warning.startswith('-Werror='):
- flags = [warning]
- else:
- flags = ['-Werror', warning]
-
@depends(c, when)
def result(c, when):
if when and c.type in ('clang', 'gcc'):
@@ -131,13 +121,51 @@ def check_and_add_gcc_warning(warning, compiler=None, when=None, check=True):
if check:
result = c.try_compile(
flags=flags, when=result,
- check_msg='whether the %s compiler supports %s' % (lang,
- warning))
+ check_msg='whether the %s compiler supports %s' % (lang, flag))
- @depends(result, warnings_flags)
- def maybe_add_flag(result, warnings_flags):
+ @depends(result, list_of_flags)
+ def maybe_add_flag(result, list_of_flags):
if result:
- warnings_flags.append(warning)
+ list_of_flags.append(flag)
+
+
+@depends(c_compiler)
+def warnings_cflags(c_compiler):
+ return []
+
+@depends(cxx_compiler)
+def warnings_cxxflags(cxx_compiler):
+ return []
+
+
+# Tests whether GCC or clang support the given warning flag, and if it is,
+# add it to the list of warning flags for the build.
+# - `warning` is the warning flag (e.g. -Wfoo)
+# - `compiler` (optional) is the compiler to test against (c_compiler or
+# cxx_compiler, from toolchain.configure). When omitted, both compilers
+# are tested.
+# - `when` (optional) is a @depends function or option name conditioning
+# when the warning flag is wanted.
+# - `check`, when not set, skips checking whether the flag is supported and
+# adds it to the list of warning flags unconditionally. This is only meant
+# for add_gcc_warning().
+@template
+def check_and_add_gcc_warning(warning, compiler=None, when=None, check=True):
+ # GCC and clang will fail if given an unknown warning option like
+ # -Wfoobar. But later versions won't fail if given an unknown negated
+ # warning option like -Wno-foobar. So when we are checking for support
+ # of a negated warning option, we actually test the positive form, but
+ # add the negated form to the flags variable.
+ if warning.startswith('-Wno-') and not warning.startswith('-Wno-error='):
+ flags = ['-Werror', '-W' + warning[5:]]
+ elif warning.startswith('-Werror='):
+ flags = [warning]
+ else:
+ flags = ['-Werror', warning]
+
+ check_and_add_flags(warning, warnings_cflags, warnings_cxxflags,
+ flags, compiler=compiler, when=when, check=check)
+
# Add the given warning to the list of warning flags for the build.
# - `warning` is the warning flag (e.g. -Wfoo)
@@ -149,3 +177,45 @@ def check_and_add_gcc_warning(warning, compiler=None, when=None, check=True):
@template
def add_gcc_warning(warning, compiler=None, when=None):
check_and_add_gcc_warning(warning, compiler, when, check=False)
+
+
+# Like the warning checks above, but for general compilation flags.
+@dependable
+def compilation_cflags():
+ return []
+
+
+@dependable
+def compilation_cxxflags():
+ return []
+
+
+# Tests whether GCC or clang support the given compilation flag; if the flag
+# is supported, add it to the list of compilation flags for the build.
+# - `flag` is the flag to test
+# - `compiler` (optional) is the compiler to test against (c_compiler or
+# cxx_compiler, from toolchain.configure). When omitted, both compilers
+# are tested.
+# - `when` (optional) is a @depends function or option name conditioning
+# when the warning flag is wanted.
+# - `check`, when not set, skips checking whether the flag is supported and
+# adds it to the list of flags unconditionally. This is only meant for
+# add_gcc_flag().
+@template
+def check_and_add_gcc_flag(flag, compiler=None, when=None, check=True):
+ flags = ['-Werror', flag]
+
+ check_and_add_flags(flag, compilation_cflags, compilation_cxxflags,
+ flags, compiler=compiler, when=when, check=check)
+
+
+# Add the given flag to the list of flags for the build.
+# - `flag` is the flag (e.g. -fno-sized-deallocation)
+# - `compiler` (optional) is the compiler to add the flag for (c_compiler or
+# cxx_compiler, from toolchain.configure). When omitted, the flag is added
+# for both compilers.
+# - `when` (optional) is a @depends function or option name conditioning
+# when the flag is wanted.
+@template
+def add_gcc_flag(warning, compiler=None, when=None):
+ check_and_add_gcc_flag(warning, compiler, when, check=False)
diff --git a/build/moz.configure/flags.configure b/build/moz.configure/flags.configure
new file mode 100644
index 0000000000..c98f5088db
--- /dev/null
+++ b/build/moz.configure/flags.configure
@@ -0,0 +1,13 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# We support C++14, but we don't want to enable the sized deallocation
+# facilities in C++14 yet.
+check_and_add_gcc_flag('-fno-sized-deallocation', compiler=cxx_compiler)
+
+# Please keep these last in this file.
+add_old_configure_assignment('_COMPILATION_CFLAGS', compilation_cflags)
+add_old_configure_assignment('_COMPILATION_CXXFLAGS', compilation_cxxflags)
diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
index 5f03cb2b74..cc0540ea1c 100644
--- a/build/moz.configure/toolchain.configure
+++ b/build/moz.configure/toolchain.configure
@@ -171,6 +171,9 @@ include('compilers-util.configure')
def try_preprocess(compiler, language, source):
return try_invoke_compiler(compiler, language, source, ['-E'])
+def msvc_std14(): return '-std:c++14'
+def msvc_std17(): return '-std:c++17'
+
@imports(_from='mozbuild.configure.constants', _import='CompilerType')
@imports(_from='mozbuild.configure.constants',
_import='CPU_preprocessor_checks')
@@ -279,6 +282,13 @@ def get_compiler_info(compiler, language):
'Unknown compiler or compiler not supported.')
cplusplus = int(data.get('cplusplus', '0L').rstrip('L'))
+ if language == 'C++' and type=='msvc' and cplusplus == 199711:
+ # Note: MSVC still reports 199711L for __cplusplus. Fix the report by
+ # assuming it does what we asked it to do.
+ if msvc_std14() in compiler:
+ cplusplus = 201402
+ elif msvc_std17() in compiler:
+ cplusplus = 201703
stdc_version = int(data.get('STDC_VERSION', '0L').rstrip('L'))
version = data.get('VERSION')
@@ -330,16 +340,17 @@ def check_compiler(compiler, language, target):
if info.type in ('clang-cl', 'clang', 'gcc'):
append_flag('-std=gnu99')
- # Note: MSVC, while supporting C++11, still reports 199711L for __cplusplus.
# Note: this is a strict version check because we used to always add
- # -std=gnu++11.
+ # -std=gnu++14.
+ cxx14_version = 201402
if info.language == 'C++':
- if info.type in ('clang', 'gcc') and info.language_version != 201103:
- append_flag('-std=gnu++11')
+ if info.type in ('clang', 'gcc') and info.language_version != cxx14_version:
+ append_flag('-std=gnu++14')
# MSVC 2015 headers include C++14 features, but don't guard them
# with appropriate checks.
- if info.type == 'clang-cl' and info.language_version != 201402:
+ if info.type == 'clang-cl' and info.language_version != cxx14_version:
append_flag('-std=c++14')
+ # MSVC from 2015 on defaults to C++14.
# We force clang-cl to emulate Visual C++ 2015 Update 3 with fallback to
# cl.exe.
@@ -644,11 +655,17 @@ def compiler(language, host_or_target, c_compiler=None, other_compiler=None,
host_or_target)
# Check that the additional flags we got are enough to not require any
- # more flags.
- if info.flags:
- flags += info.flags
- info = check_compiler(wrapper + [compiler] + flags, language,
- host_or_target)
+ # more flags. If we get an exception, just ignore it; it's liable to be
+ # invalid command-line flags, which means the compiler we're checking
+ # doesn't support those command-line flags and will fail one or more of
+ # the checks below.
+ try:
+ if info.flags:
+ flags += info.flags
+ info = check_compiler(wrapper + [compiler] + flags, language,
+ host_or_target)
+ except FatalCheckError:
+ pass
if not info.target_cpu or info.target_cpu != host_or_target.cpu:
raise FatalCheckError(
@@ -674,10 +691,6 @@ def compiler(language, host_or_target, c_compiler=None, other_compiler=None,
info.target_endianness or 'unknown', host_or_target_str,
host_or_target.endianness))
- if info.flags:
- raise FatalCheckError(
- 'Unknown compiler or compiler not supported.')
-
# Compiler version checks
# ===================================================
# Check the compiler version here instead of in `compiler_version` so
@@ -689,7 +702,7 @@ def compiler(language, host_or_target, c_compiler=None, other_compiler=None,
% info.version)
# If you want to bump the version check here search for
- # __cpp_static_assert above, and see the associated comment.
+ # cxx_alignof above, and see the associated comment.
if info.type == 'clang' and not info.version:
raise FatalCheckError(
'Only clang/llvm 3.6 or newer is supported.')
@@ -704,6 +717,10 @@ def compiler(language, host_or_target, c_compiler=None, other_compiler=None,
'See https://developer.mozilla.org/en/'
'Windows_Build_Prerequisites' % info.version)
+ if info.flags:
+ raise FatalCheckError(
+ 'Unknown compiler or compiler not supported.')
+
return namespace(
wrapper=wrapper,
compiler=compiler,
diff --git a/build/moz.configure/warnings.configure b/build/moz.configure/warnings.configure
index b2c3758047..2edf1748ad 100644
--- a/build/moz.configure/warnings.configure
+++ b/build/moz.configure/warnings.configure
@@ -18,9 +18,6 @@ add_old_configure_assignment(
# lots of useful warnings
add_gcc_warning('-Wall')
-# catches C++ version forward-compat issues
-add_gcc_warning('-Wc++11-compat', cxx_compiler)
-
# catches bugs, e.g. "if (c); foo();", few false positives
add_gcc_warning('-Wempty-body')
@@ -55,9 +52,6 @@ check_and_add_gcc_warning('-Wclass-varargs')
check_and_add_gcc_warning('-Wloop-analysis')
# catches C++ version forward-compat issues
-check_and_add_gcc_warning('-Wc++11-compat-pedantic', cxx_compiler)
-check_and_add_gcc_warning('-Wc++14-compat', cxx_compiler)
-check_and_add_gcc_warning('-Wc++14-compat-pedantic', cxx_compiler)
check_and_add_gcc_warning('-Wc++1z-compat', cxx_compiler)
# catches unintentional switch case fallthroughs
diff --git a/config/check_spidermonkey_style.py b/config/check_spidermonkey_style.py
index cb9e2418f2..5f06e6ad93 100644
--- a/config/check_spidermonkey_style.py
+++ b/config/check_spidermonkey_style.py
@@ -82,6 +82,7 @@ included_inclnames_to_ignore = set([
'unicode/plurrule.h', # ICU
'unicode/timezone.h', # ICU
'unicode/ucal.h', # ICU
+ 'unicode/uchar.h', # ICU
'unicode/uclean.h', # ICU
'unicode/ucol.h', # ICU
'unicode/udat.h', # ICU
diff --git a/db/sqlite3/src/sqlite3.c b/db/sqlite3/src/sqlite3.c
index 89faea5b23..dd3b5c5757 100644
--- a/db/sqlite3/src/sqlite3.c
+++ b/db/sqlite3/src/sqlite3.c
@@ -1,6 +1,6 @@
/******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite
-** version 3.36.0. By combining all the individual C code files into this
+** version 3.42.0. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a single translation
** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements
@@ -22,793 +22,6 @@
#ifndef SQLITE_PRIVATE
# define SQLITE_PRIVATE static
#endif
-/************** Begin file ctime.c *******************************************/
-/*
-** 2010 February 23
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-*************************************************************************
-**
-** This file implements routines used to report what compile-time options
-** SQLite was built with.
-*/
-
-#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS /* IMP: R-16824-07538 */
-
-/*
-** Include the configuration header output by 'configure' if we're using the
-** autoconf-based build
-*/
-#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H)
-#include "config.h"
-#define SQLITECONFIG_H 1
-#endif
-
-/* These macros are provided to "stringify" the value of the define
-** for those options in which the value is meaningful. */
-#define CTIMEOPT_VAL_(opt) #opt
-#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
-
-/* Like CTIMEOPT_VAL, but especially for SQLITE_DEFAULT_LOOKASIDE. This
-** option requires a separate macro because legal values contain a single
-** comma. e.g. (-DSQLITE_DEFAULT_LOOKASIDE="100,100") */
-#define CTIMEOPT_VAL2_(opt1,opt2) #opt1 "," #opt2
-#define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt)
-
-/*
-** An array of names of all compile-time options. This array should
-** be sorted A-Z.
-**
-** This array looks large, but in a typical installation actually uses
-** only a handful of compile-time options, so most times this array is usually
-** rather short and uses little memory space.
-*/
-static const char * const sqlite3azCompileOpt[] = {
-
-/*
-** BEGIN CODE GENERATED BY tool/mkctime.tcl
-*/
-#if SQLITE_32BIT_ROWID
- "32BIT_ROWID",
-#endif
-#if SQLITE_4_BYTE_ALIGNED_MALLOC
- "4_BYTE_ALIGNED_MALLOC",
-#endif
-#if SQLITE_64BIT_STATS
- "64BIT_STATS",
-#endif
-#ifdef SQLITE_ALLOW_COVERING_INDEX_SCAN
-# if SQLITE_ALLOW_COVERING_INDEX_SCAN != 1
- "ALLOW_COVERING_INDEX_SCAN=" CTIMEOPT_VAL(SQLITE_ALLOW_COVERING_INDEX_SCAN),
-# endif
-#endif
-#if SQLITE_ALLOW_URI_AUTHORITY
- "ALLOW_URI_AUTHORITY",
-#endif
-#ifdef SQLITE_BITMASK_TYPE
- "BITMASK_TYPE=" CTIMEOPT_VAL(SQLITE_BITMASK_TYPE),
-#endif
-#if SQLITE_BUG_COMPATIBLE_20160819
- "BUG_COMPATIBLE_20160819",
-#endif
-#if SQLITE_CASE_SENSITIVE_LIKE
- "CASE_SENSITIVE_LIKE",
-#endif
-#if SQLITE_CHECK_PAGES
- "CHECK_PAGES",
-#endif
-#if defined(__clang__) && defined(__clang_major__)
- "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "."
- CTIMEOPT_VAL(__clang_minor__) "."
- CTIMEOPT_VAL(__clang_patchlevel__),
-#elif defined(_MSC_VER)
- "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER),
-#elif defined(__GNUC__) && defined(__VERSION__)
- "COMPILER=gcc-" __VERSION__,
-#endif
-#if SQLITE_COVERAGE_TEST
- "COVERAGE_TEST",
-#endif
-#if SQLITE_DEBUG
- "DEBUG",
-#endif
-#if SQLITE_DEFAULT_AUTOMATIC_INDEX
- "DEFAULT_AUTOMATIC_INDEX",
-#endif
-#if SQLITE_DEFAULT_AUTOVACUUM
- "DEFAULT_AUTOVACUUM",
-#endif
-#ifdef SQLITE_DEFAULT_CACHE_SIZE
- "DEFAULT_CACHE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_CACHE_SIZE),
-#endif
-#if SQLITE_DEFAULT_CKPTFULLFSYNC
- "DEFAULT_CKPTFULLFSYNC",
-#endif
-#ifdef SQLITE_DEFAULT_FILE_FORMAT
- "DEFAULT_FILE_FORMAT=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_FORMAT),
-#endif
-#ifdef SQLITE_DEFAULT_FILE_PERMISSIONS
- "DEFAULT_FILE_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_PERMISSIONS),
-#endif
-#if SQLITE_DEFAULT_FOREIGN_KEYS
- "DEFAULT_FOREIGN_KEYS",
-#endif
-#ifdef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
- "DEFAULT_JOURNAL_SIZE_LIMIT=" CTIMEOPT_VAL(SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT),
-#endif
-#ifdef SQLITE_DEFAULT_LOCKING_MODE
- "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE),
-#endif
-#ifdef SQLITE_DEFAULT_LOOKASIDE
- "DEFAULT_LOOKASIDE=" CTIMEOPT_VAL2(SQLITE_DEFAULT_LOOKASIDE),
-#endif
-#ifdef SQLITE_DEFAULT_MEMSTATUS
-# if SQLITE_DEFAULT_MEMSTATUS != 1
- "DEFAULT_MEMSTATUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_MEMSTATUS),
-# endif
-#endif
-#ifdef SQLITE_DEFAULT_MMAP_SIZE
- "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE),
-#endif
-#ifdef SQLITE_DEFAULT_PAGE_SIZE
- "DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_PAGE_SIZE),
-#endif
-#ifdef SQLITE_DEFAULT_PCACHE_INITSZ
- "DEFAULT_PCACHE_INITSZ=" CTIMEOPT_VAL(SQLITE_DEFAULT_PCACHE_INITSZ),
-#endif
-#ifdef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS
- "DEFAULT_PROXYDIR_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_PROXYDIR_PERMISSIONS),
-#endif
-#if SQLITE_DEFAULT_RECURSIVE_TRIGGERS
- "DEFAULT_RECURSIVE_TRIGGERS",
-#endif
-#ifdef SQLITE_DEFAULT_ROWEST
- "DEFAULT_ROWEST=" CTIMEOPT_VAL(SQLITE_DEFAULT_ROWEST),
-#endif
-#ifdef SQLITE_DEFAULT_SECTOR_SIZE
- "DEFAULT_SECTOR_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_SECTOR_SIZE),
-#endif
-#ifdef SQLITE_DEFAULT_SYNCHRONOUS
- "DEFAULT_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_SYNCHRONOUS),
-#endif
-#ifdef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT
- "DEFAULT_WAL_AUTOCHECKPOINT=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_AUTOCHECKPOINT),
-#endif
-#ifdef SQLITE_DEFAULT_WAL_SYNCHRONOUS
- "DEFAULT_WAL_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_SYNCHRONOUS),
-#endif
-#ifdef SQLITE_DEFAULT_WORKER_THREADS
- "DEFAULT_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WORKER_THREADS),
-#endif
-#if SQLITE_DIRECT_OVERFLOW_READ
- "DIRECT_OVERFLOW_READ",
-#endif
-#if SQLITE_DISABLE_DIRSYNC
- "DISABLE_DIRSYNC",
-#endif
-#if SQLITE_DISABLE_FTS3_UNICODE
- "DISABLE_FTS3_UNICODE",
-#endif
-#if SQLITE_DISABLE_FTS4_DEFERRED
- "DISABLE_FTS4_DEFERRED",
-#endif
-#if SQLITE_DISABLE_INTRINSIC
- "DISABLE_INTRINSIC",
-#endif
-#if SQLITE_DISABLE_LFS
- "DISABLE_LFS",
-#endif
-#if SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS
- "DISABLE_PAGECACHE_OVERFLOW_STATS",
-#endif
-#if SQLITE_DISABLE_SKIPAHEAD_DISTINCT
- "DISABLE_SKIPAHEAD_DISTINCT",
-#endif
-#ifdef SQLITE_ENABLE_8_3_NAMES
- "ENABLE_8_3_NAMES=" CTIMEOPT_VAL(SQLITE_ENABLE_8_3_NAMES),
-#endif
-#if SQLITE_ENABLE_API_ARMOR
- "ENABLE_API_ARMOR",
-#endif
-#if SQLITE_ENABLE_ATOMIC_WRITE
- "ENABLE_ATOMIC_WRITE",
-#endif
-#if SQLITE_ENABLE_BATCH_ATOMIC_WRITE
- "ENABLE_BATCH_ATOMIC_WRITE",
-#endif
-#if SQLITE_ENABLE_BYTECODE_VTAB
- "ENABLE_BYTECODE_VTAB",
-#endif
-#ifdef SQLITE_ENABLE_CEROD
- "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD),
-#endif
-#if SQLITE_ENABLE_COLUMN_METADATA
- "ENABLE_COLUMN_METADATA",
-#endif
-#if SQLITE_ENABLE_COLUMN_USED_MASK
- "ENABLE_COLUMN_USED_MASK",
-#endif
-#if SQLITE_ENABLE_COSTMULT
- "ENABLE_COSTMULT",
-#endif
-#if SQLITE_ENABLE_CURSOR_HINTS
- "ENABLE_CURSOR_HINTS",
-#endif
-#if SQLITE_ENABLE_DBPAGE_VTAB
- "ENABLE_DBPAGE_VTAB",
-#endif
-#if SQLITE_ENABLE_DBSTAT_VTAB
- "ENABLE_DBSTAT_VTAB",
-#endif
-#if SQLITE_ENABLE_EXPENSIVE_ASSERT
- "ENABLE_EXPENSIVE_ASSERT",
-#endif
-#if SQLITE_ENABLE_EXPLAIN_COMMENTS
- "ENABLE_EXPLAIN_COMMENTS",
-#endif
-#if SQLITE_ENABLE_FTS3
- "ENABLE_FTS3",
-#endif
-#if SQLITE_ENABLE_FTS3_PARENTHESIS
- "ENABLE_FTS3_PARENTHESIS",
-#endif
-#if SQLITE_ENABLE_FTS3_TOKENIZER
- "ENABLE_FTS3_TOKENIZER",
-#endif
-#if SQLITE_ENABLE_FTS4
- "ENABLE_FTS4",
-#endif
-#if SQLITE_ENABLE_FTS5
- "ENABLE_FTS5",
-#endif
-#if SQLITE_ENABLE_GEOPOLY
- "ENABLE_GEOPOLY",
-#endif
-#if SQLITE_ENABLE_HIDDEN_COLUMNS
- "ENABLE_HIDDEN_COLUMNS",
-#endif
-#if SQLITE_ENABLE_ICU
- "ENABLE_ICU",
-#endif
-#if SQLITE_ENABLE_IOTRACE
- "ENABLE_IOTRACE",
-#endif
-#if SQLITE_ENABLE_JSON1
- "ENABLE_JSON1",
-#endif
-#if SQLITE_ENABLE_LOAD_EXTENSION
- "ENABLE_LOAD_EXTENSION",
-#endif
-#ifdef SQLITE_ENABLE_LOCKING_STYLE
- "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE),
-#endif
-#if SQLITE_ENABLE_MATH_FUNCTIONS
- "ENABLE_MATH_FUNCTIONS",
-#endif
-#if SQLITE_ENABLE_MEMORY_MANAGEMENT
- "ENABLE_MEMORY_MANAGEMENT",
-#endif
-#if SQLITE_ENABLE_MEMSYS3
- "ENABLE_MEMSYS3",
-#endif
-#if SQLITE_ENABLE_MEMSYS5
- "ENABLE_MEMSYS5",
-#endif
-#if SQLITE_ENABLE_MULTIPLEX
- "ENABLE_MULTIPLEX",
-#endif
-#if SQLITE_ENABLE_NORMALIZE
- "ENABLE_NORMALIZE",
-#endif
-#if SQLITE_ENABLE_NULL_TRIM
- "ENABLE_NULL_TRIM",
-#endif
-#if SQLITE_ENABLE_OFFSET_SQL_FUNC
- "ENABLE_OFFSET_SQL_FUNC",
-#endif
-#if SQLITE_ENABLE_OVERSIZE_CELL_CHECK
- "ENABLE_OVERSIZE_CELL_CHECK",
-#endif
-#if SQLITE_ENABLE_PREUPDATE_HOOK
- "ENABLE_PREUPDATE_HOOK",
-#endif
-#if SQLITE_ENABLE_QPSG
- "ENABLE_QPSG",
-#endif
-#if SQLITE_ENABLE_RBU
- "ENABLE_RBU",
-#endif
-#if SQLITE_ENABLE_RTREE
- "ENABLE_RTREE",
-#endif
-#if SQLITE_ENABLE_SELECTTRACE
- "ENABLE_SELECTTRACE",
-#endif
-#if SQLITE_ENABLE_SESSION
- "ENABLE_SESSION",
-#endif
-#if SQLITE_ENABLE_SNAPSHOT
- "ENABLE_SNAPSHOT",
-#endif
-#if SQLITE_ENABLE_SORTER_REFERENCES
- "ENABLE_SORTER_REFERENCES",
-#endif
-#if SQLITE_ENABLE_SQLLOG
- "ENABLE_SQLLOG",
-#endif
-#if SQLITE_ENABLE_STAT4
- "ENABLE_STAT4",
-#endif
-#if SQLITE_ENABLE_STMTVTAB
- "ENABLE_STMTVTAB",
-#endif
-#if SQLITE_ENABLE_STMT_SCANSTATUS
- "ENABLE_STMT_SCANSTATUS",
-#endif
-#if SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
- "ENABLE_UNKNOWN_SQL_FUNCTION",
-#endif
-#if SQLITE_ENABLE_UNLOCK_NOTIFY
- "ENABLE_UNLOCK_NOTIFY",
-#endif
-#if SQLITE_ENABLE_UPDATE_DELETE_LIMIT
- "ENABLE_UPDATE_DELETE_LIMIT",
-#endif
-#if SQLITE_ENABLE_URI_00_ERROR
- "ENABLE_URI_00_ERROR",
-#endif
-#if SQLITE_ENABLE_VFSTRACE
- "ENABLE_VFSTRACE",
-#endif
-#if SQLITE_ENABLE_WHERETRACE
- "ENABLE_WHERETRACE",
-#endif
-#if SQLITE_ENABLE_ZIPVFS
- "ENABLE_ZIPVFS",
-#endif
-#if SQLITE_EXPLAIN_ESTIMATED_ROWS
- "EXPLAIN_ESTIMATED_ROWS",
-#endif
-#if SQLITE_EXTRA_IFNULLROW
- "EXTRA_IFNULLROW",
-#endif
-#ifdef SQLITE_EXTRA_INIT
- "EXTRA_INIT=" CTIMEOPT_VAL(SQLITE_EXTRA_INIT),
-#endif
-#ifdef SQLITE_EXTRA_SHUTDOWN
- "EXTRA_SHUTDOWN=" CTIMEOPT_VAL(SQLITE_EXTRA_SHUTDOWN),
-#endif
-#ifdef SQLITE_FTS3_MAX_EXPR_DEPTH
- "FTS3_MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_FTS3_MAX_EXPR_DEPTH),
-#endif
-#if SQLITE_FTS5_ENABLE_TEST_MI
- "FTS5_ENABLE_TEST_MI",
-#endif
-#if SQLITE_FTS5_NO_WITHOUT_ROWID
- "FTS5_NO_WITHOUT_ROWID",
-#endif
-#if HAVE_ISNAN || SQLITE_HAVE_ISNAN
- "HAVE_ISNAN",
-#endif
-#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
-# if SQLITE_HOMEGROWN_RECURSIVE_MUTEX != 1
- "HOMEGROWN_RECURSIVE_MUTEX=" CTIMEOPT_VAL(SQLITE_HOMEGROWN_RECURSIVE_MUTEX),
-# endif
-#endif
-#if SQLITE_IGNORE_AFP_LOCK_ERRORS
- "IGNORE_AFP_LOCK_ERRORS",
-#endif
-#if SQLITE_IGNORE_FLOCK_LOCK_ERRORS
- "IGNORE_FLOCK_LOCK_ERRORS",
-#endif
-#if SQLITE_INLINE_MEMCPY
- "INLINE_MEMCPY",
-#endif
-#if SQLITE_INT64_TYPE
- "INT64_TYPE",
-#endif
-#ifdef SQLITE_INTEGRITY_CHECK_ERROR_MAX
- "INTEGRITY_CHECK_ERROR_MAX=" CTIMEOPT_VAL(SQLITE_INTEGRITY_CHECK_ERROR_MAX),
-#endif
-#if SQLITE_LIKE_DOESNT_MATCH_BLOBS
- "LIKE_DOESNT_MATCH_BLOBS",
-#endif
-#if SQLITE_LOCK_TRACE
- "LOCK_TRACE",
-#endif
-#if SQLITE_LOG_CACHE_SPILL
- "LOG_CACHE_SPILL",
-#endif
-#ifdef SQLITE_MALLOC_SOFT_LIMIT
- "MALLOC_SOFT_LIMIT=" CTIMEOPT_VAL(SQLITE_MALLOC_SOFT_LIMIT),
-#endif
-#ifdef SQLITE_MAX_ATTACHED
- "MAX_ATTACHED=" CTIMEOPT_VAL(SQLITE_MAX_ATTACHED),
-#endif
-#ifdef SQLITE_MAX_COLUMN
- "MAX_COLUMN=" CTIMEOPT_VAL(SQLITE_MAX_COLUMN),
-#endif
-#ifdef SQLITE_MAX_COMPOUND_SELECT
- "MAX_COMPOUND_SELECT=" CTIMEOPT_VAL(SQLITE_MAX_COMPOUND_SELECT),
-#endif
-#ifdef SQLITE_MAX_DEFAULT_PAGE_SIZE
- "MAX_DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_DEFAULT_PAGE_SIZE),
-#endif
-#ifdef SQLITE_MAX_EXPR_DEPTH
- "MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_EXPR_DEPTH),
-#endif
-#ifdef SQLITE_MAX_FUNCTION_ARG
- "MAX_FUNCTION_ARG=" CTIMEOPT_VAL(SQLITE_MAX_FUNCTION_ARG),
-#endif
-#ifdef SQLITE_MAX_LENGTH
- "MAX_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LENGTH),
-#endif
-#ifdef SQLITE_MAX_LIKE_PATTERN_LENGTH
- "MAX_LIKE_PATTERN_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LIKE_PATTERN_LENGTH),
-#endif
-#ifdef SQLITE_MAX_MEMORY
- "MAX_MEMORY=" CTIMEOPT_VAL(SQLITE_MAX_MEMORY),
-#endif
-#ifdef SQLITE_MAX_MMAP_SIZE
- "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE),
-#endif
-#ifdef SQLITE_MAX_MMAP_SIZE_
- "MAX_MMAP_SIZE_=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE_),
-#endif
-#ifdef SQLITE_MAX_PAGE_COUNT
- "MAX_PAGE_COUNT=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_COUNT),
-#endif
-#ifdef SQLITE_MAX_PAGE_SIZE
- "MAX_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_SIZE),
-#endif
-#ifdef SQLITE_MAX_SCHEMA_RETRY
- "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY),
-#endif
-#ifdef SQLITE_MAX_SQL_LENGTH
- "MAX_SQL_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_SQL_LENGTH),
-#endif
-#ifdef SQLITE_MAX_TRIGGER_DEPTH
- "MAX_TRIGGER_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_TRIGGER_DEPTH),
-#endif
-#ifdef SQLITE_MAX_VARIABLE_NUMBER
- "MAX_VARIABLE_NUMBER=" CTIMEOPT_VAL(SQLITE_MAX_VARIABLE_NUMBER),
-#endif
-#ifdef SQLITE_MAX_VDBE_OP
- "MAX_VDBE_OP=" CTIMEOPT_VAL(SQLITE_MAX_VDBE_OP),
-#endif
-#ifdef SQLITE_MAX_WORKER_THREADS
- "MAX_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_MAX_WORKER_THREADS),
-#endif
-#if SQLITE_MEMDEBUG
- "MEMDEBUG",
-#endif
-#if SQLITE_MIXED_ENDIAN_64BIT_FLOAT
- "MIXED_ENDIAN_64BIT_FLOAT",
-#endif
-#if SQLITE_MMAP_READWRITE
- "MMAP_READWRITE",
-#endif
-#if SQLITE_MUTEX_NOOP
- "MUTEX_NOOP",
-#endif
-#if SQLITE_MUTEX_OMIT
- "MUTEX_OMIT",
-#endif
-#if SQLITE_MUTEX_PTHREADS
- "MUTEX_PTHREADS",
-#endif
-#if SQLITE_MUTEX_W32
- "MUTEX_W32",
-#endif
-#if SQLITE_NEED_ERR_NAME
- "NEED_ERR_NAME",
-#endif
-#if SQLITE_NOINLINE
- "NOINLINE",
-#endif
-#if SQLITE_NO_SYNC
- "NO_SYNC",
-#endif
-#if SQLITE_OMIT_ALTERTABLE
- "OMIT_ALTERTABLE",
-#endif
-#if SQLITE_OMIT_ANALYZE
- "OMIT_ANALYZE",
-#endif
-#if SQLITE_OMIT_ATTACH
- "OMIT_ATTACH",
-#endif
-#if SQLITE_OMIT_AUTHORIZATION
- "OMIT_AUTHORIZATION",
-#endif
-#if SQLITE_OMIT_AUTOINCREMENT
- "OMIT_AUTOINCREMENT",
-#endif
-#if SQLITE_OMIT_AUTOINIT
- "OMIT_AUTOINIT",
-#endif
-#if SQLITE_OMIT_AUTOMATIC_INDEX
- "OMIT_AUTOMATIC_INDEX",
-#endif
-#if SQLITE_OMIT_AUTORESET
- "OMIT_AUTORESET",
-#endif
-#if SQLITE_OMIT_AUTOVACUUM
- "OMIT_AUTOVACUUM",
-#endif
-#if SQLITE_OMIT_BETWEEN_OPTIMIZATION
- "OMIT_BETWEEN_OPTIMIZATION",
-#endif
-#if SQLITE_OMIT_BLOB_LITERAL
- "OMIT_BLOB_LITERAL",
-#endif
-#if SQLITE_OMIT_CAST
- "OMIT_CAST",
-#endif
-#if SQLITE_OMIT_CHECK
- "OMIT_CHECK",
-#endif
-#if SQLITE_OMIT_COMPLETE
- "OMIT_COMPLETE",
-#endif
-#if SQLITE_OMIT_COMPOUND_SELECT
- "OMIT_COMPOUND_SELECT",
-#endif
-#if SQLITE_OMIT_CONFLICT_CLAUSE
- "OMIT_CONFLICT_CLAUSE",
-#endif
-#if SQLITE_OMIT_CTE
- "OMIT_CTE",
-#endif
-#if defined(SQLITE_OMIT_DATETIME_FUNCS) || defined(SQLITE_OMIT_FLOATING_POINT)
- "OMIT_DATETIME_FUNCS",
-#endif
-#if SQLITE_OMIT_DECLTYPE
- "OMIT_DECLTYPE",
-#endif
-#if SQLITE_OMIT_DEPRECATED
- "OMIT_DEPRECATED",
-#endif
-#if SQLITE_OMIT_DESERIALIZE
- "OMIT_DESERIALIZE",
-#endif
-#if SQLITE_OMIT_DISKIO
- "OMIT_DISKIO",
-#endif
-#if SQLITE_OMIT_EXPLAIN
- "OMIT_EXPLAIN",
-#endif
-#if SQLITE_OMIT_FLAG_PRAGMAS
- "OMIT_FLAG_PRAGMAS",
-#endif
-#if SQLITE_OMIT_FLOATING_POINT
- "OMIT_FLOATING_POINT",
-#endif
-#if SQLITE_OMIT_FOREIGN_KEY
- "OMIT_FOREIGN_KEY",
-#endif
-#if SQLITE_OMIT_GET_TABLE
- "OMIT_GET_TABLE",
-#endif
-#if SQLITE_OMIT_HEX_INTEGER
- "OMIT_HEX_INTEGER",
-#endif
-#if SQLITE_OMIT_INCRBLOB
- "OMIT_INCRBLOB",
-#endif
-#if SQLITE_OMIT_INTEGRITY_CHECK
- "OMIT_INTEGRITY_CHECK",
-#endif
-#if SQLITE_OMIT_INTROSPECTION_PRAGMAS
- "OMIT_INTROSPECTION_PRAGMAS",
-#endif
-#if SQLITE_OMIT_LIKE_OPTIMIZATION
- "OMIT_LIKE_OPTIMIZATION",
-#endif
-#if SQLITE_OMIT_LOAD_EXTENSION
- "OMIT_LOAD_EXTENSION",
-#endif
-#if SQLITE_OMIT_LOCALTIME
- "OMIT_LOCALTIME",
-#endif
-#if SQLITE_OMIT_LOOKASIDE
- "OMIT_LOOKASIDE",
-#endif
-#if SQLITE_OMIT_MEMORYDB
- "OMIT_MEMORYDB",
-#endif
-#if SQLITE_OMIT_OR_OPTIMIZATION
- "OMIT_OR_OPTIMIZATION",
-#endif
-#if SQLITE_OMIT_PAGER_PRAGMAS
- "OMIT_PAGER_PRAGMAS",
-#endif
-#if SQLITE_OMIT_PARSER_TRACE
- "OMIT_PARSER_TRACE",
-#endif
-#if SQLITE_OMIT_POPEN
- "OMIT_POPEN",
-#endif
-#if SQLITE_OMIT_PRAGMA
- "OMIT_PRAGMA",
-#endif
-#if SQLITE_OMIT_PROGRESS_CALLBACK
- "OMIT_PROGRESS_CALLBACK",
-#endif
-#if SQLITE_OMIT_QUICKBALANCE
- "OMIT_QUICKBALANCE",
-#endif
-#if SQLITE_OMIT_REINDEX
- "OMIT_REINDEX",
-#endif
-#if SQLITE_OMIT_SCHEMA_PRAGMAS
- "OMIT_SCHEMA_PRAGMAS",
-#endif
-#if SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
- "OMIT_SCHEMA_VERSION_PRAGMAS",
-#endif
-#if SQLITE_OMIT_SHARED_CACHE
- "OMIT_SHARED_CACHE",
-#endif
-#if SQLITE_OMIT_SHUTDOWN_DIRECTORIES
- "OMIT_SHUTDOWN_DIRECTORIES",
-#endif
-#if SQLITE_OMIT_SUBQUERY
- "OMIT_SUBQUERY",
-#endif
-#if SQLITE_OMIT_TCL_VARIABLE
- "OMIT_TCL_VARIABLE",
-#endif
-#if SQLITE_OMIT_TEMPDB
- "OMIT_TEMPDB",
-#endif
-#if SQLITE_OMIT_TEST_CONTROL
- "OMIT_TEST_CONTROL",
-#endif
-#ifdef SQLITE_OMIT_TRACE
-# if SQLITE_OMIT_TRACE != 1
- "OMIT_TRACE=" CTIMEOPT_VAL(SQLITE_OMIT_TRACE),
-# endif
-#endif
-#if SQLITE_OMIT_TRIGGER
- "OMIT_TRIGGER",
-#endif
-#if SQLITE_OMIT_TRUNCATE_OPTIMIZATION
- "OMIT_TRUNCATE_OPTIMIZATION",
-#endif
-#if SQLITE_OMIT_UTF16
- "OMIT_UTF16",
-#endif
-#if SQLITE_OMIT_VACUUM
- "OMIT_VACUUM",
-#endif
-#if SQLITE_OMIT_VIEW
- "OMIT_VIEW",
-#endif
-#if SQLITE_OMIT_VIRTUALTABLE
- "OMIT_VIRTUALTABLE",
-#endif
-#if SQLITE_OMIT_WAL
- "OMIT_WAL",
-#endif
-#if SQLITE_OMIT_WSD
- "OMIT_WSD",
-#endif
-#if SQLITE_OMIT_XFER_OPT
- "OMIT_XFER_OPT",
-#endif
-#if SQLITE_PCACHE_SEPARATE_HEADER
- "PCACHE_SEPARATE_HEADER",
-#endif
-#if SQLITE_PERFORMANCE_TRACE
- "PERFORMANCE_TRACE",
-#endif
-#ifdef SQLITE_POWERSAFE_OVERWRITE
-# if SQLITE_POWERSAFE_OVERWRITE != 1
- "POWERSAFE_OVERWRITE=" CTIMEOPT_VAL(SQLITE_POWERSAFE_OVERWRITE),
-# endif
-#endif
-#if SQLITE_PREFER_PROXY_LOCKING
- "PREFER_PROXY_LOCKING",
-#endif
-#if SQLITE_PROXY_DEBUG
- "PROXY_DEBUG",
-#endif
-#if SQLITE_REVERSE_UNORDERED_SELECTS
- "REVERSE_UNORDERED_SELECTS",
-#endif
-#if SQLITE_RTREE_INT_ONLY
- "RTREE_INT_ONLY",
-#endif
-#if SQLITE_SECURE_DELETE
- "SECURE_DELETE",
-#endif
-#if SQLITE_SMALL_STACK
- "SMALL_STACK",
-#endif
-#ifdef SQLITE_SORTER_PMASZ
- "SORTER_PMASZ=" CTIMEOPT_VAL(SQLITE_SORTER_PMASZ),
-#endif
-#if SQLITE_SOUNDEX
- "SOUNDEX",
-#endif
-#ifdef SQLITE_STAT4_SAMPLES
- "STAT4_SAMPLES=" CTIMEOPT_VAL(SQLITE_STAT4_SAMPLES),
-#endif
-#ifdef SQLITE_STMTJRNL_SPILL
- "STMTJRNL_SPILL=" CTIMEOPT_VAL(SQLITE_STMTJRNL_SPILL),
-#endif
-#if SQLITE_SUBSTR_COMPATIBILITY
- "SUBSTR_COMPATIBILITY",
-#endif
-#if (!defined(SQLITE_WIN32_MALLOC) \
- && !defined(SQLITE_ZERO_MALLOC) \
- && !defined(SQLITE_MEMDEBUG) \
- ) || defined(SQLITE_SYSTEM_MALLOC)
- "SYSTEM_MALLOC",
-#endif
-#if SQLITE_TCL
- "TCL",
-#endif
-#ifdef SQLITE_TEMP_STORE
- "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE),
-#endif
-#if SQLITE_TEST
- "TEST",
-#endif
-#if defined(SQLITE_THREADSAFE)
- "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE),
-#elif defined(THREADSAFE)
- "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE),
-#else
- "THREADSAFE=1",
-#endif
-#if SQLITE_UNLINK_AFTER_CLOSE
- "UNLINK_AFTER_CLOSE",
-#endif
-#if SQLITE_UNTESTABLE
- "UNTESTABLE",
-#endif
-#if SQLITE_USER_AUTHENTICATION
- "USER_AUTHENTICATION",
-#endif
-#if SQLITE_USE_ALLOCA
- "USE_ALLOCA",
-#endif
-#if SQLITE_USE_FCNTL_TRACE
- "USE_FCNTL_TRACE",
-#endif
-#if SQLITE_USE_URI
- "USE_URI",
-#endif
-#if SQLITE_VDBE_COVERAGE
- "VDBE_COVERAGE",
-#endif
-#if SQLITE_WIN32_MALLOC
- "WIN32_MALLOC",
-#endif
-#if SQLITE_ZERO_MALLOC
- "ZERO_MALLOC",
-#endif
-/*
-** END CODE GENERATED BY tool/mkctime.tcl
-*/
-};
-
-SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){
- *pnOpt = sizeof(sqlite3azCompileOpt) / sizeof(sqlite3azCompileOpt[0]);
- return (const char**)sqlite3azCompileOpt;
-}
-
-#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
-
-/************** End of ctime.c ***********************************************/
/************** Begin file sqliteInt.h ***************************************/
/*
** 2001 September 15
@@ -910,6 +123,10 @@ SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){
#define SQLITE_4_BYTE_ALIGNED_MALLOC
#endif /* defined(_MSC_VER) && !defined(_WIN64) */
+#if !defined(HAVE_LOG2) && defined(_MSC_VER) && _MSC_VER<1800
+#define HAVE_LOG2 0
+#endif /* !defined(HAVE_LOG2) && defined(_MSC_VER) && _MSC_VER<1800 */
+
#endif /* SQLITE_MSVC_H */
/************** End of msvc.h ************************************************/
@@ -1074,6 +291,17 @@ SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){
# define _USE_32BIT_TIME_T
#endif
+/* Optionally #include a user-defined header, whereby compilation options
+** may be set prior to where they take effect, but after platform setup.
+** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include
+** file.
+*/
+#ifdef SQLITE_CUSTOM_INCLUDE
+# define INC_STRINGIFY_(f) #f
+# define INC_STRINGIFY(f) INC_STRINGIFY_(f)
+# include INC_STRINGIFY(SQLITE_CUSTOM_INCLUDE)
+#endif
+
/* The public SQLite interface. The _FILE_OFFSET_BITS macro must appear
** first in QNX. Also, the _USE_32BIT_TIME_T macro must appear first for
** MinGW.
@@ -1125,7 +353,30 @@ extern "C" {
/*
-** Provide the ability to override linkage features of the interface.
+** Facilitate override of interface linkage and calling conventions.
+** Be aware that these macros may not be used within this particular
+** translation of the amalgamation and its associated header file.
+**
+** The SQLITE_EXTERN and SQLITE_API macros are used to instruct the
+** compiler that the target identifier should have external linkage.
+**
+** The SQLITE_CDECL macro is used to set the calling convention for
+** public functions that accept a variable number of arguments.
+**
+** The SQLITE_APICALL macro is used to set the calling convention for
+** public functions that accept a fixed number of arguments.
+**
+** The SQLITE_STDCALL macro is no longer used and is now deprecated.
+**
+** The SQLITE_CALLBACK macro is used to set the calling convention for
+** function pointers.
+**
+** The SQLITE_SYSAPI macro is used to set the calling convention for
+** functions provided by the operating system.
+**
+** Currently, the SQLITE_CDECL, SQLITE_APICALL, SQLITE_CALLBACK, and
+** SQLITE_SYSAPI macros are used only when building for environments
+** that require non-default calling conventions.
*/
#ifndef SQLITE_EXTERN
# define SQLITE_EXTERN extern
@@ -1205,9 +456,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-#define SQLITE_VERSION "3.36.0"
-#define SQLITE_VERSION_NUMBER 3036000
-#define SQLITE_SOURCE_ID "2021-06-18 18:36:39 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5"
+#define SQLITE_VERSION "3.42.0"
+#define SQLITE_VERSION_NUMBER 3042000
+#define SQLITE_SOURCE_ID "2023-05-16 12:36:15 831d0fb2836b71c9bc51067c49fee4b8f18047814f2ff22d817d25195cf350b0"
/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -1619,12 +870,14 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8))
#define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8))
#define SQLITE_CONSTRAINT_PINNED (SQLITE_CONSTRAINT |(11<<8))
+#define SQLITE_CONSTRAINT_DATATYPE (SQLITE_CONSTRAINT |(12<<8))
#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8))
#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8))
+#define SQLITE_NOTICE_RBU (SQLITE_NOTICE | (3<<8))
#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8))
#define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8))
#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8))
-#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8))
+#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8)) /* internal use only */
/*
** CAPI3REF: Flags For File Open Operations
@@ -1632,6 +885,19 @@ SQLITE_API int sqlite3_exec(
** These bit values are intended for use in the
** 3rd parameter to the [sqlite3_open_v2()] interface and
** in the 4th parameter to the [sqlite3_vfs.xOpen] method.
+**
+** Only those flags marked as "Ok for sqlite3_open_v2()" may be
+** used as the third argument to the [sqlite3_open_v2()] interface.
+** The other flags have historically been ignored by sqlite3_open_v2(),
+** though future versions of SQLite might change so that an error is
+** raised if any of the disallowed bits are passed into sqlite3_open_v2().
+** Applications should not depend on the historical behavior.
+**
+** Note in particular that passing the SQLITE_OPEN_EXCLUSIVE flag into
+** [sqlite3_open_v2()] does *not* cause the underlying database file
+** to be opened using O_EXCL. Passing SQLITE_OPEN_EXCLUSIVE into
+** [sqlite3_open_v2()] has historically be a no-op and might become an
+** error in future versions of SQLite.
*/
#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */
@@ -1654,6 +920,7 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */
#define SQLITE_OPEN_NOFOLLOW 0x01000000 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_EXRESCODE 0x02000000 /* Extended result codes */
/* Reserved: 0x00F00000 */
/* Legacy compatibility: */
@@ -1714,13 +981,17 @@ SQLITE_API int sqlite3_exec(
**
** SQLite uses one of these integer values as the second
** argument to calls it makes to the xLock() and xUnlock() methods
-** of an [sqlite3_io_methods] object.
+** of an [sqlite3_io_methods] object. These values are ordered from
+** lest restrictive to most restrictive.
+**
+** The argument to xLock() is always SHARED or higher. The argument to
+** xUnlock is either SHARED or NONE.
*/
-#define SQLITE_LOCK_NONE 0
-#define SQLITE_LOCK_SHARED 1
-#define SQLITE_LOCK_RESERVED 2
-#define SQLITE_LOCK_PENDING 3
-#define SQLITE_LOCK_EXCLUSIVE 4
+#define SQLITE_LOCK_NONE 0 /* xUnlock() only */
+#define SQLITE_LOCK_SHARED 1 /* xLock() or xUnlock() */
+#define SQLITE_LOCK_RESERVED 2 /* xLock() only */
+#define SQLITE_LOCK_PENDING 3 /* xLock() only */
+#define SQLITE_LOCK_EXCLUSIVE 4 /* xLock() only */
/*
** CAPI3REF: Synchronization Type Flags
@@ -1798,7 +1069,14 @@ struct sqlite3_file {
** <li> [SQLITE_LOCK_PENDING], or
** <li> [SQLITE_LOCK_EXCLUSIVE].
** </ul>
-** xLock() increases the lock. xUnlock() decreases the lock.
+** xLock() upgrades the database file lock. In other words, xLock() moves the
+** database file lock in the direction NONE toward EXCLUSIVE. The argument to
+** xLock() is always on of SHARED, RESERVED, PENDING, or EXCLUSIVE, never
+** SQLITE_LOCK_NONE. If the database file lock is already at or above the
+** requested lock, then the call to xLock() is a no-op.
+** xUnlock() downgrades the database file lock to either SHARED or NONE.
+* If the lock is already at or below the requested lock state, then the call
+** to xUnlock() is a no-op.
** The xCheckReservedLock() method checks whether any database connection,
** either in this process or in some other process, is holding a RESERVED,
** PENDING, or EXCLUSIVE lock on the file. It returns true
@@ -1903,9 +1181,8 @@ struct sqlite3_io_methods {
** opcode causes the xFileControl method to write the current state of
** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED],
** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE])
-** into an integer that the pArg argument points to. This capability
-** is used during testing and is only available when the SQLITE_TEST
-** compile-time option is used.
+** into an integer that the pArg argument points to.
+** This capability is only available if SQLite is compiled with [SQLITE_DEBUG].
**
** <li>[[SQLITE_FCNTL_SIZE_HINT]]
** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS
@@ -2209,7 +1486,6 @@ struct sqlite3_io_methods {
** in wal mode after the client has finished copying pages from the wal
** file to the database file, but before the *-shm file is updated to
** record the fact that the pages have been checkpointed.
-** </ul>
**
** <li>[[SQLITE_FCNTL_EXTERNAL_READER]]
** The EXPERIMENTAL [SQLITE_FCNTL_EXTERNAL_READER] opcode is used to detect
@@ -2222,10 +1498,16 @@ struct sqlite3_io_methods {
** the database is not a wal-mode db, or if there is no such connection in any
** other process. This opcode cannot be used to detect transactions opened
** by clients within the current process, only within other processes.
-** </ul>
**
** <li>[[SQLITE_FCNTL_CKSM_FILE]]
-** Used by the cksmvfs VFS module only.
+** The [SQLITE_FCNTL_CKSM_FILE] opcode is for use interally by the
+** [checksum VFS shim] only.
+**
+** <li>[[SQLITE_FCNTL_RESET_CACHE]]
+** If there is currently no transaction open on the database, and the
+** database is not a temp db, then the [SQLITE_FCNTL_RESET_CACHE] file-control
+** purges the contents of the in-memory page cache. If there is an open
+** transaction, or if the db is a temp-db, this opcode is a no-op, not an error.
** </ul>
*/
#define SQLITE_FCNTL_LOCKSTATE 1
@@ -2268,6 +1550,7 @@ struct sqlite3_io_methods {
#define SQLITE_FCNTL_CKPT_START 39
#define SQLITE_FCNTL_EXTERNAL_READER 40
#define SQLITE_FCNTL_CKSM_FILE 41
+#define SQLITE_FCNTL_RESET_CACHE 42
/* deprecated names */
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
@@ -2298,6 +1581,26 @@ typedef struct sqlite3_mutex sqlite3_mutex;
typedef struct sqlite3_api_routines sqlite3_api_routines;
/*
+** CAPI3REF: File Name
+**
+** Type [sqlite3_filename] is used by SQLite to pass filenames to the
+** xOpen method of a [VFS]. It may be cast to (const char*) and treated
+** as a normal, nul-terminated, UTF-8 buffer containing the filename, but
+** may also be passed to special APIs such as:
+**
+** <ul>
+** <li> sqlite3_filename_database()
+** <li> sqlite3_filename_journal()
+** <li> sqlite3_filename_wal()
+** <li> sqlite3_uri_parameter()
+** <li> sqlite3_uri_boolean()
+** <li> sqlite3_uri_int64()
+** <li> sqlite3_uri_key()
+** </ul>
+*/
+typedef const char *sqlite3_filename;
+
+/*
** CAPI3REF: OS Interface Object
**
** An instance of the sqlite3_vfs object defines the interface between
@@ -2475,7 +1778,7 @@ struct sqlite3_vfs {
sqlite3_vfs *pNext; /* Next registered VFS */
const char *zName; /* Name of this virtual file system */
void *pAppData; /* Pointer to application-specific data */
- int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*,
+ int (*xOpen)(sqlite3_vfs*, sqlite3_filename zName, sqlite3_file*,
int flags, int *pOutFlags);
int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir);
int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut);
@@ -2662,20 +1965,23 @@ SQLITE_API int sqlite3_os_end(void);
** must ensure that no other SQLite interfaces are invoked by other
** threads while sqlite3_config() is running.</b>
**
-** The sqlite3_config() interface
-** may only be invoked prior to library initialization using
-** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()].
-** ^If sqlite3_config() is called after [sqlite3_initialize()] and before
-** [sqlite3_shutdown()] then it will return SQLITE_MISUSE.
-** Note, however, that ^sqlite3_config() can be called as part of the
-** implementation of an application-defined [sqlite3_os_init()].
-**
** The first argument to sqlite3_config() is an integer
** [configuration option] that determines
** what property of SQLite is to be configured. Subsequent arguments
** vary depending on the [configuration option]
** in the first argument.
**
+** For most configuration options, the sqlite3_config() interface
+** may only be invoked prior to library initialization using
+** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()].
+** The exceptional configuration options that may be invoked at any time
+** are called "anytime configuration options".
+** ^If sqlite3_config() is called after [sqlite3_initialize()] and before
+** [sqlite3_shutdown()] with a first argument that is not an anytime
+** configuration option, then the sqlite3_config() call will return SQLITE_MISUSE.
+** Note, however, that ^sqlite3_config() can be called as part of the
+** implementation of an application-defined [sqlite3_os_init()].
+**
** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK].
** ^If the option is unknown or SQLite is unable to set the option
** then this routine returns a non-zero [error code].
@@ -2783,6 +2089,23 @@ struct sqlite3_mem_methods {
** These constants are the available integer configuration options that
** can be passed as the first argument to the [sqlite3_config()] interface.
**
+** Most of the configuration options for sqlite3_config()
+** will only work if invoked prior to [sqlite3_initialize()] or after
+** [sqlite3_shutdown()]. The few exceptions to this rule are called
+** "anytime configuration options".
+** ^Calling [sqlite3_config()] with a first argument that is not an
+** anytime configuration option in between calls to [sqlite3_initialize()] and
+** [sqlite3_shutdown()] is a no-op that returns SQLITE_MISUSE.
+**
+** The set of anytime configuration options can change (by insertions
+** and/or deletions) from one release of SQLite to the next.
+** As of SQLite version 3.42.0, the complete set of anytime configuration
+** options is:
+** <ul>
+** <li> SQLITE_CONFIG_LOG
+** <li> SQLITE_CONFIG_PCACHE_HDRSZ
+** </ul>
+**
** New configuration options may be added in future releases of SQLite.
** Existing configuration options might be discontinued. Applications
** should check the return code from [sqlite3_config()] to make sure that
@@ -3129,28 +2452,28 @@ struct sqlite3_mem_methods {
** compile-time option is not set, then the default maximum is 1073741824.
** </dl>
*/
-#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
-#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */
-#define SQLITE_CONFIG_SERIALIZED 3 /* nil */
-#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */
-#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */
-#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */
-#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */
-#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */
-#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */
-#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */
-#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */
-/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */
-#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */
-#define SQLITE_CONFIG_PCACHE 14 /* no-op */
-#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */
-#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */
-#define SQLITE_CONFIG_URI 17 /* int */
-#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */
-#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */
+#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
+#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */
+#define SQLITE_CONFIG_SERIALIZED 3 /* nil */
+#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */
+#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */
+#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */
+#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */
+#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */
+#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */
+#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */
+#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */
+/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */
+#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */
+#define SQLITE_CONFIG_PCACHE 14 /* no-op */
+#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */
+#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */
+#define SQLITE_CONFIG_URI 17 /* int */
+#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */
+#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */
#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */
-#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */
-#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */
+#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */
+#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */
#define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */
#define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
@@ -3191,7 +2514,7 @@ struct sqlite3_mem_methods {
** configuration for a database connection can only be changed when that
** connection is not currently using lookaside memory, or in other words
** when the "current value" returned by
-** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero.
+** [sqlite3_db_status](D,[SQLITE_DBSTATUS_LOOKASIDE_USED],...) is zero.
** Any attempt to change the lookaside memory configuration when lookaside
** memory is in use leaves the configuration unchanged and returns
** [SQLITE_BUSY].)^</dd>
@@ -3341,8 +2664,12 @@ struct sqlite3_mem_methods {
** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
** </ol>
** Because resetting a database is destructive and irreversible, the
-** process requires the use of this obscure API and multiple steps to help
-** ensure that it does not happen by accident.
+** process requires the use of this obscure API and multiple steps to
+** help ensure that it does not happen by accident. Because this
+** feature must be capable of resetting corrupt databases, and
+** shutting down virtual tables may require access to that corrupt
+** storage, the library must abandon any installed virtual tables
+** without calling their xDestroy() methods.
**
** [[SQLITE_DBCONFIG_DEFENSIVE]] <dt>SQLITE_DBCONFIG_DEFENSIVE</dt>
** <dd>The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the
@@ -3353,6 +2680,7 @@ struct sqlite3_mem_methods {
** <ul>
** <li> The [PRAGMA writable_schema=ON] statement.
** <li> The [PRAGMA journal_mode=OFF] statement.
+** <li> The [PRAGMA schema_version=N] statement.
** <li> Writes to the [sqlite_dbpage] virtual table.
** <li> Direct writes to [shadow tables].
** </ul>
@@ -3380,7 +2708,7 @@ struct sqlite3_mem_methods {
** </dd>
**
** [[SQLITE_DBCONFIG_DQS_DML]]
-** <dt>SQLITE_DBCONFIG_DQS_DML</td>
+** <dt>SQLITE_DBCONFIG_DQS_DML</dt>
** <dd>The SQLITE_DBCONFIG_DQS_DML option activates or deactivates
** the legacy [double-quoted string literal] misfeature for DML statements
** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The
@@ -3389,7 +2717,7 @@ struct sqlite3_mem_methods {
** </dd>
**
** [[SQLITE_DBCONFIG_DQS_DDL]]
-** <dt>SQLITE_DBCONFIG_DQS_DDL</td>
+** <dt>SQLITE_DBCONFIG_DQS_DDL</dt>
** <dd>The SQLITE_DBCONFIG_DQS option activates or deactivates
** the legacy [double-quoted string literal] misfeature for DDL statements,
** such as CREATE TABLE and CREATE INDEX. The
@@ -3398,7 +2726,7 @@ struct sqlite3_mem_methods {
** </dd>
**
** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]]
-** <dt>SQLITE_DBCONFIG_TRUSTED_SCHEMA</td>
+** <dt>SQLITE_DBCONFIG_TRUSTED_SCHEMA</dt>
** <dd>The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to
** assume that database schemas are untainted by malicious content.
** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite
@@ -3418,7 +2746,7 @@ struct sqlite3_mem_methods {
** </dd>
**
** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]]
-** <dt>SQLITE_DBCONFIG_LEGACY_FILE_FORMAT</td>
+** <dt>SQLITE_DBCONFIG_LEGACY_FILE_FORMAT</dt>
** <dd>The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates
** the legacy file format flag. When activated, this flag causes all newly
** created database file to have a schema format version number (the 4-byte
@@ -3427,7 +2755,7 @@ struct sqlite3_mem_methods {
** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting,
** newly created databases are generally not understandable by SQLite versions
** prior to 3.3.0 ([dateof:3.3.0]). As these words are written, there
-** is now scarcely any need to generated database files that are compatible
+** is now scarcely any need to generate database files that are compatible
** all the way back to version 3.0.0, and so this setting is of little
** practical use, but is provided so that SQLite can continue to claim the
** ability to generate new database files that are compatible with version
@@ -3438,6 +2766,38 @@ struct sqlite3_mem_methods {
** not considered a bug since SQLite versions 3.3.0 and earlier do not support
** either generated columns or decending indexes.
** </dd>
+**
+** [[SQLITE_DBCONFIG_STMT_SCANSTATUS]]
+** <dt>SQLITE_DBCONFIG_STMT_SCANSTATUS</dt>
+** <dd>The SQLITE_DBCONFIG_STMT_SCANSTATUS option is only useful in
+** SQLITE_ENABLE_STMT_SCANSTATUS builds. In this case, it sets or clears
+** a flag that enables collection of the sqlite3_stmt_scanstatus_v2()
+** statistics. For statistics to be collected, the flag must be set on
+** the database handle both when the SQL statement is prepared and when it
+** is stepped. The flag is set (collection of statistics is enabled)
+** by default. This option takes two arguments: an integer and a pointer to
+** an integer.. The first argument is 1, 0, or -1 to enable, disable, or
+** leave unchanged the statement scanstatus option. If the second argument
+** is not NULL, then the value of the statement scanstatus setting after
+** processing the first argument is written into the integer that the second
+** argument points to.
+** </dd>
+**
+** [[SQLITE_DBCONFIG_REVERSE_SCANORDER]]
+** <dt>SQLITE_DBCONFIG_REVERSE_SCANORDER</dt>
+** <dd>The SQLITE_DBCONFIG_REVERSE_SCANORDER option changes the default order
+** in which tables and indexes are scanned so that the scans start at the end
+** and work toward the beginning rather than starting at the beginning and
+** working toward the end. Setting SQLITE_DBCONFIG_REVERSE_SCANORDER is the
+** same as setting [PRAGMA reverse_unordered_selects]. This option takes
+** two arguments which are an integer and a pointer to an integer. The first
+** argument is 1, 0, or -1 to enable, disable, or leave unchanged the
+** reverse scan order flag, respectively. If the second argument is not NULL,
+** then 0 or 1 is written into the integer that the second argument points to
+** depending on if the reverse scan order flag is set after processing the
+** first argument.
+** </dd>
+**
** </dl>
*/
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
@@ -3458,7 +2818,9 @@ struct sqlite3_mem_methods {
#define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */
#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016 /* int int* */
#define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */
-#define SQLITE_DBCONFIG_MAX 1017 /* Largest DBCONFIG */
+#define SQLITE_DBCONFIG_STMT_SCANSTATUS 1018 /* int int* */
+#define SQLITE_DBCONFIG_REVERSE_SCANORDER 1019 /* int int* */
+#define SQLITE_DBCONFIG_MAX 1019 /* Largest DBCONFIG */
/*
** CAPI3REF: Enable Or Disable Extended Result Codes
@@ -3546,11 +2908,14 @@ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64);
** CAPI3REF: Count The Number Of Rows Modified
** METHOD: sqlite3
**
-** ^This function returns the number of rows modified, inserted or
+** ^These functions return the number of rows modified, inserted or
** deleted by the most recently completed INSERT, UPDATE or DELETE
** statement on the database connection specified by the only parameter.
-** ^Executing any other type of SQL statement does not modify the value
-** returned by this function.
+** The two functions are identical except for the type of the return value
+** and that if the number of rows modified by the most recent INSERT, UPDATE
+** or DELETE is greater than the maximum value supported by type "int", then
+** the return value of sqlite3_changes() is undefined. ^Executing any other
+** type of SQL statement does not modify the value returned by these functions.
**
** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are
** considered - auxiliary changes caused by [CREATE TRIGGER | triggers],
@@ -3599,16 +2964,21 @@ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64);
** </ul>
*/
SQLITE_API int sqlite3_changes(sqlite3*);
+SQLITE_API sqlite3_int64 sqlite3_changes64(sqlite3*);
/*
** CAPI3REF: Total Number Of Rows Modified
** METHOD: sqlite3
**
-** ^This function returns the total number of rows inserted, modified or
+** ^These functions return the total number of rows inserted, modified or
** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed
** since the database connection was opened, including those executed as
-** part of trigger programs. ^Executing any other type of SQL statement
-** does not affect the value returned by sqlite3_total_changes().
+** part of trigger programs. The two functions are identical except for the
+** type of the return value and that if the number of rows modified by the
+** connection exceeds the maximum value supported by type "int", then
+** the return value of sqlite3_total_changes() is undefined. ^Executing
+** any other type of SQL statement does not affect the value returned by
+** sqlite3_total_changes().
**
** ^Changes made as part of [foreign key actions] are included in the
** count, but those made as part of REPLACE constraint resolution are
@@ -3636,6 +3006,7 @@ SQLITE_API int sqlite3_changes(sqlite3*);
** </ul>
*/
SQLITE_API int sqlite3_total_changes(sqlite3*);
+SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3*);
/*
** CAPI3REF: Interrupt A Long-Running Query
@@ -3671,8 +3042,12 @@ SQLITE_API int sqlite3_total_changes(sqlite3*);
** ^A call to sqlite3_interrupt(D) that occurs when there are no running
** SQL statements is a no-op and has no effect on SQL statements
** that are started after the sqlite3_interrupt() call returns.
+**
+** ^The [sqlite3_is_interrupted(D)] interface can be used to determine whether
+** or not an interrupt is currently in effect for [database connection] D.
*/
SQLITE_API void sqlite3_interrupt(sqlite3*);
+SQLITE_API int sqlite3_is_interrupted(sqlite3*);
/*
** CAPI3REF: Determine If An SQL Statement Is Complete
@@ -4290,8 +3665,8 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*,
** <dd>^An SQLITE_TRACE_PROFILE callback provides approximately the same
** information as is provided by the [sqlite3_profile()] callback.
** ^The P argument is a pointer to the [prepared statement] and the
-** X argument points to a 64-bit integer which is the estimated of
-** the number of nanosecond that the prepared statement took to run.
+** X argument points to a 64-bit integer which is approximately
+** the number of nanoseconds that the prepared statement took to run.
** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes.
**
** [[SQLITE_TRACE_ROW]] <dt>SQLITE_TRACE_ROW</dt>
@@ -4354,7 +3729,7 @@ SQLITE_API int sqlite3_trace_v2(
**
** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback
** function X to be invoked periodically during long running calls to
-** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for
+** [sqlite3_step()] and [sqlite3_prepare()] and similar for
** database connection D. An example use for this
** interface is to keep a GUI updated during a large query.
**
@@ -4379,6 +3754,13 @@ SQLITE_API int sqlite3_trace_v2(
** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
** database connections for the meaning of "modify" in this paragraph.
**
+** The progress handler callback would originally only be invoked from the
+** bytecode engine. It still might be invoked during [sqlite3_prepare()]
+** and similar because those routines might force a reparse of the schema
+** which involves running the bytecode engine. However, beginning with
+** SQLite version 3.41.0, the progress handler callback might also be
+** invoked directly from [sqlite3_prepare()] while analyzing and generating
+** code for complex queries.
*/
SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
@@ -4415,13 +3797,18 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
**
** <dl>
** ^(<dt>[SQLITE_OPEN_READONLY]</dt>
-** <dd>The database is opened in read-only mode. If the database does not
-** already exist, an error is returned.</dd>)^
+** <dd>The database is opened in read-only mode. If the database does
+** not already exist, an error is returned.</dd>)^
**
** ^(<dt>[SQLITE_OPEN_READWRITE]</dt>
-** <dd>The database is opened for reading and writing if possible, or reading
-** only if the file is write protected by the operating system. In either
-** case the database must already exist, otherwise an error is returned.</dd>)^
+** <dd>The database is opened for reading and writing if possible, or
+** reading only if the file is write protected by the operating
+** system. In either case the database must already exist, otherwise
+** an error is returned. For historical reasons, if opening in
+** read-write mode fails due to OS-level permissions, an attempt is
+** made to open it in read-only mode. [sqlite3_db_readonly()] can be
+** used to determine whether the database is actually
+** read-write.</dd>)^
**
** ^(<dt>[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]</dt>
** <dd>The database is opened for reading and writing, and is created if
@@ -4459,20 +3846,39 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
** <dd>The database is opened [shared cache] enabled, overriding
** the default shared cache setting provided by
** [sqlite3_enable_shared_cache()].)^
+** The [use of shared cache mode is discouraged] and hence shared cache
+** capabilities may be omitted from many builds of SQLite. In such cases,
+** this option is a no-op.
**
** ^(<dt>[SQLITE_OPEN_PRIVATECACHE]</dt>
** <dd>The database is opened [shared cache] disabled, overriding
** the default shared cache setting provided by
** [sqlite3_enable_shared_cache()].)^
**
+** [[OPEN_EXRESCODE]] ^(<dt>[SQLITE_OPEN_EXRESCODE]</dt>
+** <dd>The database connection comes up in "extended result code mode".
+** In other words, the database behaves has if
+** [sqlite3_extended_result_codes(db,1)] where called on the database
+** connection as soon as the connection is created. In addition to setting
+** the extended result code mode, this flag also causes [sqlite3_open_v2()]
+** to return an extended result code.</dd>
+**
** [[OPEN_NOFOLLOW]] ^(<dt>[SQLITE_OPEN_NOFOLLOW]</dt>
-** <dd>The database filename is not allowed to be a symbolic link</dd>
+** <dd>The database filename is not allowed to contain a symbolic link</dd>
** </dl>)^
**
** If the 3rd parameter to sqlite3_open_v2() is not one of the
** required combinations shown above optionally combined with other
** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits]
-** then the behavior is undefined.
+** then the behavior is undefined. Historic versions of SQLite
+** have silently ignored surplus bits in the flags parameter to
+** sqlite3_open_v2(), however that behavior might not be carried through
+** into future versions of SQLite and so applications should not rely
+** upon it. Note in particular that the SQLITE_OPEN_EXCLUSIVE flag is a no-op
+** for sqlite3_open_v2(). The SQLITE_OPEN_EXCLUSIVE does *not* cause
+** the open to fail if the database already exists. The SQLITE_OPEN_EXCLUSIVE
+** flag is intended for use by the [sqlite3_vfs|VFS interface] only, and not
+** by sqlite3_open_v2().
**
** ^The fourth parameter to sqlite3_open_v2() is the name of the
** [sqlite3_vfs] object that defines the operating system interface that
@@ -4717,10 +4123,10 @@ SQLITE_API int sqlite3_open_v2(
**
** See the [URI filename] documentation for additional information.
*/
-SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam);
-SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault);
-SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64);
-SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N);
+SQLITE_API const char *sqlite3_uri_parameter(sqlite3_filename z, const char *zParam);
+SQLITE_API int sqlite3_uri_boolean(sqlite3_filename z, const char *zParam, int bDefault);
+SQLITE_API sqlite3_int64 sqlite3_uri_int64(sqlite3_filename, const char*, sqlite3_int64);
+SQLITE_API const char *sqlite3_uri_key(sqlite3_filename z, int N);
/*
** CAPI3REF: Translate filenames
@@ -4749,9 +4155,9 @@ SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N);
** return value from [sqlite3_db_filename()], then the result is
** undefined and is likely a memory access violation.
*/
-SQLITE_API const char *sqlite3_filename_database(const char*);
-SQLITE_API const char *sqlite3_filename_journal(const char*);
-SQLITE_API const char *sqlite3_filename_wal(const char*);
+SQLITE_API const char *sqlite3_filename_database(sqlite3_filename);
+SQLITE_API const char *sqlite3_filename_journal(sqlite3_filename);
+SQLITE_API const char *sqlite3_filename_wal(sqlite3_filename);
/*
** CAPI3REF: Database File Corresponding To A Journal
@@ -4817,14 +4223,14 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*);
** then the corresponding [sqlite3_module.xClose() method should also be
** invoked prior to calling sqlite3_free_filename(Y).
*/
-SQLITE_API char *sqlite3_create_filename(
+SQLITE_API sqlite3_filename sqlite3_create_filename(
const char *zDatabase,
const char *zJournal,
const char *zWal,
int nParam,
const char **azParam
);
-SQLITE_API void sqlite3_free_filename(char*);
+SQLITE_API void sqlite3_free_filename(sqlite3_filename);
/*
** CAPI3REF: Error Codes And Messages
@@ -4843,13 +4249,14 @@ SQLITE_API void sqlite3_free_filename(char*);
** sqlite3_extended_errcode() might change with each API call.
** Except, there are some interfaces that are guaranteed to never
** change the value of the error code. The error-code preserving
-** interfaces are:
+** interfaces include the following:
**
** <ul>
** <li> sqlite3_errcode()
** <li> sqlite3_extended_errcode()
** <li> sqlite3_errmsg()
** <li> sqlite3_errmsg16()
+** <li> sqlite3_error_offset()
** </ul>
**
** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
@@ -4864,6 +4271,13 @@ SQLITE_API void sqlite3_free_filename(char*);
** ^(Memory to hold the error message string is managed internally
** and must not be freed by the application)^.
**
+** ^If the most recent error references a specific token in the input
+** SQL, the sqlite3_error_offset() interface returns the byte offset
+** of the start of that token. ^The byte offset returned by
+** sqlite3_error_offset() assumes that the input SQL is UTF8.
+** ^If the most recent error does not reference a specific token in the input
+** SQL, then the sqlite3_error_offset() function returns -1.
+**
** When the serialized [threading mode] is in use, it might be the
** case that a second error occurs on a separate thread in between
** the time of the first error and the call to these interfaces.
@@ -4883,6 +4297,7 @@ SQLITE_API int sqlite3_extended_errcode(sqlite3 *db);
SQLITE_API const char *sqlite3_errmsg(sqlite3*);
SQLITE_API const void *sqlite3_errmsg16(sqlite3*);
SQLITE_API const char *sqlite3_errstr(int);
+SQLITE_API int sqlite3_error_offset(sqlite3 *db);
/*
** CAPI3REF: Prepared Statement Object
@@ -5240,12 +4655,17 @@ SQLITE_API int sqlite3_prepare16_v3(
** are managed by SQLite and are automatically freed when the prepared
** statement is finalized.
** ^The string returned by sqlite3_expanded_sql(P), on the other hand,
-** is obtained from [sqlite3_malloc()] and must be free by the application
+** is obtained from [sqlite3_malloc()] and must be freed by the application
** by passing it to [sqlite3_free()].
+**
+** ^The sqlite3_normalized_sql() interface is only available if
+** the [SQLITE_ENABLE_NORMALIZE] compile-time option is defined.
*/
SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt);
SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt);
+#ifdef SQLITE_ENABLE_NORMALIZE
SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt);
+#endif
/*
** CAPI3REF: Determine If An SQL Statement Writes The Database
@@ -5289,6 +4709,10 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt);
** be false. ^Similarly, a CREATE TABLE IF NOT EXISTS statement is a
** read-only no-op if the table already exists, but
** sqlite3_stmt_readonly() still returns false for such a statement.
+**
+** ^If prepared statement X is an [EXPLAIN] or [EXPLAIN QUERY PLAN]
+** statement, then sqlite3_stmt_readonly(X) returns the same value as
+** if the EXPLAIN or EXPLAIN QUERY PLAN prefix were omitted.
*/
SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);
@@ -5357,6 +4781,8 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*);
**
** ^The sqlite3_value objects that are passed as parameters into the
** implementation of [application-defined SQL functions] are protected.
+** ^The sqlite3_value objects returned by [sqlite3_vtab_rhs_value()]
+** are protected.
** ^The sqlite3_value object returned by
** [sqlite3_column_value()] is unprotected.
** Unprotected sqlite3_value objects may only be used as arguments
@@ -5978,6 +5404,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** even empty strings, are always zero-terminated. ^The return
** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
**
+** ^Strings returned by sqlite3_column_text16() always have the endianness
+** which is native to the platform, regardless of the text encoding set
+** for the database.
+**
** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
** [unprotected sqlite3_value] object. In a multithreaded environment,
** an unprotected sqlite3_value object may only be used safely with
@@ -5991,7 +5421,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** [application-defined SQL functions] or [virtual tables], not within
** top-level application code.
**
-** The these routines may attempt to convert the datatype of the result.
+** These routines may attempt to convert the datatype of the result.
** ^For example, if the internal representation is FLOAT and a text result
** is requested, [sqlite3_snprintf()] is used internally to perform the
** conversion automatically. ^(The following table details the conversions
@@ -6016,7 +5446,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** <tr><td> TEXT <td> BLOB <td> No change
** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER
** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL
-** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed
+** <tr><td> BLOB <td> TEXT <td> [CAST] to TEXT, ensure zero terminator
** </table>
** </blockquote>)^
**
@@ -6359,10 +5789,21 @@ SQLITE_API int sqlite3_create_window_function(
** from top-level SQL, and cannot be used in VIEWs or TRIGGERs nor in
** schema structures such as [CHECK constraints], [DEFAULT clauses],
** [expression indexes], [partial indexes], or [generated columns].
-** The SQLITE_DIRECTONLY flags is a security feature which is recommended
-** for all [application-defined SQL functions], and especially for functions
-** that have side-effects or that could potentially leak sensitive
-** information.
+** <p>
+** The SQLITE_DIRECTONLY flag is recommended for any
+** [application-defined SQL function]
+** that has side-effects or that could potentially leak sensitive information.
+** This will prevent attacks in which an application is tricked
+** into using a database file that has had its schema surreptiously
+** modified to invoke the application-defined function in ways that are
+** harmful.
+** <p>
+** Some people say it is good practice to set SQLITE_DIRECTONLY on all
+** [application-defined SQL functions], regardless of whether or not they
+** are security sensitive, as doing so prevents those functions from being used
+** inside of the database schema, and thus ensures that the database
+** can be inspected and modified using generic tools (such as the [CLI])
+** that do not have access to the application-defined functions.
** </dd>
**
** [[SQLITE_INNOCUOUS]] <dt>SQLITE_INNOCUOUS</dt><dd>
@@ -6569,6 +6010,28 @@ SQLITE_API int sqlite3_value_nochange(sqlite3_value*);
SQLITE_API int sqlite3_value_frombind(sqlite3_value*);
/*
+** CAPI3REF: Report the internal text encoding state of an sqlite3_value object
+** METHOD: sqlite3_value
+**
+** ^(The sqlite3_value_encoding(X) interface returns one of [SQLITE_UTF8],
+** [SQLITE_UTF16BE], or [SQLITE_UTF16LE] according to the current text encoding
+** of the value X, assuming that X has type TEXT.)^ If sqlite3_value_type(X)
+** returns something other than SQLITE_TEXT, then the return value from
+** sqlite3_value_encoding(X) is meaningless. ^Calls to
+** [sqlite3_value_text(X)], [sqlite3_value_text16(X)], [sqlite3_value_text16be(X)],
+** [sqlite3_value_text16le(X)], [sqlite3_value_bytes(X)], or
+** [sqlite3_value_bytes16(X)] might change the encoding of the value X and
+** thus change the return from subsequent calls to sqlite3_value_encoding(X).
+**
+** This routine is intended for used by applications that test and validate
+** the SQLite implementation. This routine is inquiring about the opaque
+** internal state of an [sqlite3_value] object. Ordinary applications should
+** not need to know what the internal state of an sqlite3_value object is and
+** hence should not need to use this interface.
+*/
+SQLITE_API int sqlite3_value_encoding(sqlite3_value*);
+
+/*
** CAPI3REF: Finding The Subtype Of SQL Values
** METHOD: sqlite3_value
**
@@ -6588,7 +6051,8 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*);
** object D and returns a pointer to that copy. ^The [sqlite3_value] returned
** is a [protected sqlite3_value] object even if the input is not.
** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a
-** memory allocation fails.
+** memory allocation fails. ^If V is a [pointer value], then the result
+** of sqlite3_value_dup(V) is a NULL value.
**
** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object
** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer
@@ -6619,7 +6083,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*);
**
** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer
** when first called if N is less than or equal to zero or if a memory
-** allocate error occurs.
+** allocation error occurs.
**
** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
** determined by the N parameter on first successful call. Changing the
@@ -6824,9 +6288,10 @@ typedef void (*sqlite3_destructor_type)(void*);
** of [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE].
** ^SQLite takes the text result from the application from
** the 2nd parameter of the sqlite3_result_text* interfaces.
-** ^If the 3rd parameter to the sqlite3_result_text* interfaces
-** is negative, then SQLite takes result text from the 2nd parameter
-** through the first zero character.
+** ^If the 3rd parameter to any of the sqlite3_result_text* interfaces
+** other than sqlite3_result_text64() is negative, then SQLite computes
+** the string length itself by searching the 2nd parameter for the first
+** zero character.
** ^If the 3rd parameter to the sqlite3_result_text* interfaces
** is non-negative, then as many bytes (not characters) of the text
** pointed to by the 2nd parameter are taken as the application-defined
@@ -7100,6 +6565,13 @@ SQLITE_API void sqlite3_activate_cerod(
** of the default VFS is not implemented correctly, or not implemented at
** all, then the behavior of sqlite3_sleep() may deviate from the description
** in the previous paragraphs.
+**
+** If a negative argument is passed to sqlite3_sleep() the results vary by
+** VFS and operating system. Some system treat a negative argument as an
+** instruction to sleep forever. Others understand it to mean do not sleep
+** at all. ^In SQLite version 3.42.0 and later, a negative
+** argument passed into sqlite3_sleep() is changed to zero before it is relayed
+** down into the xSleep method of the VFS.
*/
SQLITE_API int sqlite3_sleep(int);
@@ -7271,6 +6743,28 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*);
SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
/*
+** CAPI3REF: Return The Schema Name For A Database Connection
+** METHOD: sqlite3
+**
+** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name
+** for the N-th database on database connection D, or a NULL pointer of N is
+** out of range. An N value of 0 means the main database file. An N of 1 is
+** the "temp" schema. Larger values of N correspond to various ATTACH-ed
+** databases.
+**
+** Space to hold the string that is returned by sqlite3_db_name() is managed
+** by SQLite itself. The string might be deallocated by any operation that
+** changes the schema, including [ATTACH] or [DETACH] or calls to
+** [sqlite3_serialize()] or [sqlite3_deserialize()], even operations that
+** occur on a different thread. Applications that need to
+** remember the string long-term should make their own copy. Applications that
+** are accessing the same database connection simultaneously on multiple
+** threads should mutex-protect calls to this API and should make their own
+** private copy of the result prior to releasing the mutex.
+*/
+SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N);
+
+/*
** CAPI3REF: Return The Filename For A Database Connection
** METHOD: sqlite3
**
@@ -7300,7 +6794,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
** <li> [sqlite3_filename_wal()]
** </ul>
*/
-SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName);
+SQLITE_API sqlite3_filename sqlite3_db_filename(sqlite3 *db, const char *zDbName);
/*
** CAPI3REF: Determine if a database is read-only
@@ -7430,6 +6924,72 @@ SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
/*
+** CAPI3REF: Autovacuum Compaction Amount Callback
+** METHOD: sqlite3
+**
+** ^The sqlite3_autovacuum_pages(D,C,P,X) interface registers a callback
+** function C that is invoked prior to each autovacuum of the database
+** file. ^The callback is passed a copy of the generic data pointer (P),
+** the schema-name of the attached database that is being autovacuumed,
+** the size of the database file in pages, the number of free pages,
+** and the number of bytes per page, respectively. The callback should
+** return the number of free pages that should be removed by the
+** autovacuum. ^If the callback returns zero, then no autovacuum happens.
+** ^If the value returned is greater than or equal to the number of
+** free pages, then a complete autovacuum happens.
+**
+** <p>^If there are multiple ATTACH-ed database files that are being
+** modified as part of a transaction commit, then the autovacuum pages
+** callback is invoked separately for each file.
+**
+** <p><b>The callback is not reentrant.</b> The callback function should
+** not attempt to invoke any other SQLite interface. If it does, bad
+** things may happen, including segmentation faults and corrupt database
+** files. The callback function should be a simple function that
+** does some arithmetic on its input parameters and returns a result.
+**
+** ^The X parameter to sqlite3_autovacuum_pages(D,C,P,X) is an optional
+** destructor for the P parameter. ^If X is not NULL, then X(P) is
+** invoked whenever the database connection closes or when the callback
+** is overwritten by another invocation of sqlite3_autovacuum_pages().
+**
+** <p>^There is only one autovacuum pages callback per database connection.
+** ^Each call to the sqlite3_autovacuum_pages() interface overrides all
+** previous invocations for that database connection. ^If the callback
+** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer,
+** then the autovacuum steps callback is cancelled. The return value
+** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might
+** be some other error code if something goes wrong. The current
+** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other
+** return codes might be added in future releases.
+**
+** <p>If no autovacuum pages callback is specified (the usual case) or
+** a NULL pointer is provided for the callback,
+** then the default behavior is to vacuum all free pages. So, in other
+** words, the default behavior is the same as if the callback function
+** were something like this:
+**
+** <blockquote><pre>
+** &nbsp; unsigned int demonstration_autovac_pages_callback(
+** &nbsp; void *pClientData,
+** &nbsp; const char *zSchema,
+** &nbsp; unsigned int nDbPage,
+** &nbsp; unsigned int nFreePage,
+** &nbsp; unsigned int nBytePerPage
+** &nbsp; ){
+** &nbsp; return nFreePage;
+** &nbsp; }
+** </pre></blockquote>
+*/
+SQLITE_API int sqlite3_autovacuum_pages(
+ sqlite3 *db,
+ unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int),
+ void*,
+ void(*)(void*)
+);
+
+
+/*
** CAPI3REF: Data Change Notification Callbacks
** METHOD: sqlite3
**
@@ -7492,6 +7052,11 @@ SQLITE_API void *sqlite3_update_hook(
** to the same database. Sharing is enabled if the argument is true
** and disabled if the argument is false.)^
**
+** This interface is omitted if SQLite is compiled with
+** [-DSQLITE_OMIT_SHARED_CACHE]. The [-DSQLITE_OMIT_SHARED_CACHE]
+** compile-time option is recommended because the
+** [use of shared cache mode is discouraged].
+**
** ^Cache sharing is enabled and disabled for an entire process.
** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]).
** In prior versions of SQLite,
@@ -7590,7 +7155,7 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*);
** ^The soft heap limit may not be greater than the hard heap limit.
** ^If the hard heap limit is enabled and if sqlite3_soft_heap_limit(N)
** is invoked with a value of N that is greater than the hard heap limit,
-** the the soft heap limit is set to the value of the hard heap limit.
+** the soft heap limit is set to the value of the hard heap limit.
** ^The soft heap limit is automatically enabled whenever the hard heap
** limit is enabled. ^When sqlite3_hard_heap_limit64(N) is invoked and
** the soft heap limit is outside the range of 1..N, then the soft heap
@@ -7852,15 +7417,6 @@ SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void));
SQLITE_API void sqlite3_reset_auto_extension(void);
/*
-** The interface to the virtual-table mechanism is currently considered
-** to be experimental. The interface might change in incompatible ways.
-** If this is a problem for you, do not use the interface at this time.
-**
-** When the virtual-table mechanism stabilizes, we will declare the
-** interface fixed, support it indefinitely, and remove this comment.
-*/
-
-/*
** Structures used by the virtual table interface
*/
typedef struct sqlite3_vtab sqlite3_vtab;
@@ -7978,10 +7534,10 @@ struct sqlite3_module {
** when the omit flag is true there is no guarantee that the constraint will
** not be checked again using byte code.)^
**
-** ^The idxNum and idxPtr values are recorded and passed into the
+** ^The idxNum and idxStr values are recorded and passed into the
** [xFilter] method.
-** ^[sqlite3_free()] is used to free idxPtr if and only if
-** needToFreeIdxPtr is true.
+** ^[sqlite3_free()] is used to free idxStr if and only if
+** needToFreeIdxStr is true.
**
** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in
** the correct order to satisfy the ORDER BY clause so that no separate
@@ -8070,24 +7626,56 @@ struct sqlite3_index_info {
**
** These macros define the allowed values for the
** [sqlite3_index_info].aConstraint[].op field. Each value represents
-** an operator that is part of a constraint term in the wHERE clause of
+** an operator that is part of a constraint term in the WHERE clause of
** a query that uses a [virtual table].
-*/
-#define SQLITE_INDEX_CONSTRAINT_EQ 2
-#define SQLITE_INDEX_CONSTRAINT_GT 4
-#define SQLITE_INDEX_CONSTRAINT_LE 8
-#define SQLITE_INDEX_CONSTRAINT_LT 16
-#define SQLITE_INDEX_CONSTRAINT_GE 32
-#define SQLITE_INDEX_CONSTRAINT_MATCH 64
-#define SQLITE_INDEX_CONSTRAINT_LIKE 65
-#define SQLITE_INDEX_CONSTRAINT_GLOB 66
-#define SQLITE_INDEX_CONSTRAINT_REGEXP 67
-#define SQLITE_INDEX_CONSTRAINT_NE 68
-#define SQLITE_INDEX_CONSTRAINT_ISNOT 69
-#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70
-#define SQLITE_INDEX_CONSTRAINT_ISNULL 71
-#define SQLITE_INDEX_CONSTRAINT_IS 72
-#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150
+**
+** ^The left-hand operand of the operator is given by the corresponding
+** aConstraint[].iColumn field. ^An iColumn of -1 indicates the left-hand
+** operand is the rowid.
+** The SQLITE_INDEX_CONSTRAINT_LIMIT and SQLITE_INDEX_CONSTRAINT_OFFSET
+** operators have no left-hand operand, and so for those operators the
+** corresponding aConstraint[].iColumn is meaningless and should not be
+** used.
+**
+** All operator values from SQLITE_INDEX_CONSTRAINT_FUNCTION through
+** value 255 are reserved to represent functions that are overloaded
+** by the [xFindFunction|xFindFunction method] of the virtual table
+** implementation.
+**
+** The right-hand operands for each constraint might be accessible using
+** the [sqlite3_vtab_rhs_value()] interface. Usually the right-hand
+** operand is only available if it appears as a single constant literal
+** in the input SQL. If the right-hand operand is another column or an
+** expression (even a constant expression) or a parameter, then the
+** sqlite3_vtab_rhs_value() probably will not be able to extract it.
+** ^The SQLITE_INDEX_CONSTRAINT_ISNULL and
+** SQLITE_INDEX_CONSTRAINT_ISNOTNULL operators have no right-hand operand
+** and hence calls to sqlite3_vtab_rhs_value() for those operators will
+** always return SQLITE_NOTFOUND.
+**
+** The collating sequence to be used for comparison can be found using
+** the [sqlite3_vtab_collation()] interface. For most real-world virtual
+** tables, the collating sequence of constraints does not matter (for example
+** because the constraints are numeric) and so the sqlite3_vtab_collation()
+** interface is not commonly needed.
+*/
+#define SQLITE_INDEX_CONSTRAINT_EQ 2
+#define SQLITE_INDEX_CONSTRAINT_GT 4
+#define SQLITE_INDEX_CONSTRAINT_LE 8
+#define SQLITE_INDEX_CONSTRAINT_LT 16
+#define SQLITE_INDEX_CONSTRAINT_GE 32
+#define SQLITE_INDEX_CONSTRAINT_MATCH 64
+#define SQLITE_INDEX_CONSTRAINT_LIKE 65
+#define SQLITE_INDEX_CONSTRAINT_GLOB 66
+#define SQLITE_INDEX_CONSTRAINT_REGEXP 67
+#define SQLITE_INDEX_CONSTRAINT_NE 68
+#define SQLITE_INDEX_CONSTRAINT_ISNOT 69
+#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70
+#define SQLITE_INDEX_CONSTRAINT_ISNULL 71
+#define SQLITE_INDEX_CONSTRAINT_IS 72
+#define SQLITE_INDEX_CONSTRAINT_LIMIT 73
+#define SQLITE_INDEX_CONSTRAINT_OFFSET 74
+#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150
/*
** CAPI3REF: Register A Virtual Table Implementation
@@ -8116,7 +7704,7 @@ struct sqlite3_index_info {
** destructor.
**
** ^If the third parameter (the pointer to the sqlite3_module object) is
-** NULL then no new module is create and any existing modules with the
+** NULL then no new module is created and any existing modules with the
** same name are dropped.
**
** See also: [sqlite3_drop_modules()]
@@ -8229,16 +7817,6 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL);
SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg);
/*
-** The interface to the virtual-table mechanism defined above (back up
-** to a comment remarkably similar to this one) is currently considered
-** to be experimental. The interface might change in incompatible ways.
-** If this is a problem for you, do not use the interface at this time.
-**
-** When the virtual-table mechanism stabilizes, we will declare the
-** interface fixed, support it indefinitely, and remove this comment.
-*/
-
-/*
** CAPI3REF: A Handle To An Open BLOB
** KEYWORDS: {BLOB handle} {BLOB handles}
**
@@ -8621,9 +8199,9 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
** is undefined if the mutex is not currently entered by the
** calling thread or is not currently allocated.
**
-** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or
-** sqlite3_mutex_leave() is a NULL pointer, then all three routines
-** behave as no-ops.
+** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(),
+** sqlite3_mutex_leave(), or sqlite3_mutex_free() is a NULL pointer,
+** then any of the four routines behaves as a no-op.
**
** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()].
*/
@@ -8892,7 +8470,8 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_SEEK_COUNT 30
#define SQLITE_TESTCTRL_TRACEFLAGS 31
#define SQLITE_TESTCTRL_TUNE 32
-#define SQLITE_TESTCTRL_LAST 32 /* Largest TESTCTRL */
+#define SQLITE_TESTCTRL_LOGEST 33
+#define SQLITE_TESTCTRL_LAST 33 /* Largest TESTCTRL */
/*
** CAPI3REF: SQL Keyword Checking
@@ -9415,6 +8994,16 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg);
** The counter is incremented on the first [sqlite3_step()] call of each
** cycle.
**
+** [[SQLITE_STMTSTATUS_FILTER_MISS]]
+** [[SQLITE_STMTSTATUS_FILTER HIT]]
+** <dt>SQLITE_STMTSTATUS_FILTER_HIT<br>
+** SQLITE_STMTSTATUS_FILTER_MISS</dt>
+** <dd>^SQLITE_STMTSTATUS_FILTER_HIT is the number of times that a join
+** step was bypassed because a Bloom filter returned not-found. The
+** corresponding SQLITE_STMTSTATUS_FILTER_MISS value is the number of
+** times that the Bloom filter returned a find, and thus the join step
+** had to be processed as normal.
+**
** [[SQLITE_STMTSTATUS_MEMUSED]] <dt>SQLITE_STMTSTATUS_MEMUSED</dt>
** <dd>^This is the approximate number of bytes of heap memory
** used to store the prepared statement. ^This value is not actually
@@ -9429,6 +9018,8 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg);
#define SQLITE_STMTSTATUS_VM_STEP 4
#define SQLITE_STMTSTATUS_REPREPARE 5
#define SQLITE_STMTSTATUS_RUN 6
+#define SQLITE_STMTSTATUS_FILTER_MISS 7
+#define SQLITE_STMTSTATUS_FILTER_HIT 8
#define SQLITE_STMTSTATUS_MEMUSED 99
/*
@@ -9840,7 +9431,7 @@ typedef struct sqlite3_backup sqlite3_backup;
** if the application incorrectly accesses the destination [database connection]
** and so no error code is reported, but the operations may malfunction
** nevertheless. Use of the destination database connection while a
-** backup is in progress might also also cause a mutex deadlock.
+** backup is in progress might also cause a mutex deadlock.
**
** If running in [shared cache mode], the application must
** guarantee that the shared cache used by the destination database
@@ -10092,8 +9683,9 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...);
**
** A single database handle may have at most a single write-ahead log callback
** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any
-** previously registered write-ahead log callback. ^Note that the
-** [sqlite3_wal_autocheckpoint()] interface and the
+** previously registered write-ahead log callback. ^The return value is
+** a copy of the third parameter from the previous call, if any, or 0.
+** ^Note that the [sqlite3_wal_autocheckpoint()] interface and the
** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will
** overwrite any prior [sqlite3_wal_hook()] settings.
*/
@@ -10267,7 +9859,7 @@ SQLITE_API int sqlite3_wal_checkpoint_v2(
*/
#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */
#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */
-#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for for readers */
+#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for readers */
#define SQLITE_CHECKPOINT_TRUNCATE 3 /* Like RESTART but also truncate WAL */
/*
@@ -10343,18 +9935,28 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
** [[SQLITE_VTAB_INNOCUOUS]]<dt>SQLITE_VTAB_INNOCUOUS</dt>
** <dd>Calls of the form
** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the
-** the [xConnect] or [xCreate] methods of a [virtual table] implmentation
+** the [xConnect] or [xCreate] methods of a [virtual table] implementation
** identify that virtual table as being safe to use from within triggers
** and views. Conceptually, the SQLITE_VTAB_INNOCUOUS tag means that the
** virtual table can do no serious harm even if it is controlled by a
** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS
** flag unless absolutely necessary.
** </dd>
+**
+** [[SQLITE_VTAB_USES_ALL_SCHEMAS]]<dt>SQLITE_VTAB_USES_ALL_SCHEMAS</dt>
+** <dd>Calls of the form
+** [sqlite3_vtab_config](db,SQLITE_VTAB_USES_ALL_SCHEMA) from within the
+** the [xConnect] or [xCreate] methods of a [virtual table] implementation
+** instruct the query planner to begin at least a read transaction on
+** all schemas ("main", "temp", and any ATTACH-ed databases) whenever the
+** virtual table is used.
+** </dd>
** </dl>
*/
#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1
#define SQLITE_VTAB_INNOCUOUS 2
#define SQLITE_VTAB_DIRECTONLY 3
+#define SQLITE_VTAB_USES_ALL_SCHEMAS 4
/*
** CAPI3REF: Determine The Virtual Table Conflict Policy
@@ -10396,18 +9998,274 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*);
/*
** CAPI3REF: Determine The Collation For a Virtual Table Constraint
+** METHOD: sqlite3_index_info
**
** This function may only be called from within a call to the [xBestIndex]
-** method of a [virtual table].
+** method of a [virtual table]. This function returns a pointer to a string
+** that is the name of the appropriate collation sequence to use for text
+** comparisons on the constraint identified by its arguments.
+**
+** The first argument must be the pointer to the [sqlite3_index_info] object
+** that is the first parameter to the xBestIndex() method. The second argument
+** must be an index into the aConstraint[] array belonging to the
+** sqlite3_index_info structure passed to xBestIndex.
+**
+** Important:
+** The first parameter must be the same pointer that is passed into the
+** xBestMethod() method. The first parameter may not be a pointer to a
+** different [sqlite3_index_info] object, even an exact copy.
+**
+** The return value is computed as follows:
**
-** The first argument must be the sqlite3_index_info object that is the
-** first parameter to the xBestIndex() method. The second argument must be
-** an index into the aConstraint[] array belonging to the sqlite3_index_info
-** structure passed to xBestIndex. This function returns a pointer to a buffer
-** containing the name of the collation sequence for the corresponding
-** constraint.
+** <ol>
+** <li><p> If the constraint comes from a WHERE clause expression that contains
+** a [COLLATE operator], then the name of the collation specified by
+** that COLLATE operator is returned.
+** <li><p> If there is no COLLATE operator, but the column that is the subject
+** of the constraint specifies an alternative collating sequence via
+** a [COLLATE clause] on the column definition within the CREATE TABLE
+** statement that was passed into [sqlite3_declare_vtab()], then the
+** name of that alternative collating sequence is returned.
+** <li><p> Otherwise, "BINARY" is returned.
+** </ol>
*/
-SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
+SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
+
+/*
+** CAPI3REF: Determine if a virtual table query is DISTINCT
+** METHOD: sqlite3_index_info
+**
+** This API may only be used from within an [xBestIndex|xBestIndex method]
+** of a [virtual table] implementation. The result of calling this
+** interface from outside of xBestIndex() is undefined and probably harmful.
+**
+** ^The sqlite3_vtab_distinct() interface returns an integer between 0 and
+** 3. The integer returned by sqlite3_vtab_distinct()
+** gives the virtual table additional information about how the query
+** planner wants the output to be ordered. As long as the virtual table
+** can meet the ordering requirements of the query planner, it may set
+** the "orderByConsumed" flag.
+**
+** <ol><li value="0"><p>
+** ^If the sqlite3_vtab_distinct() interface returns 0, that means
+** that the query planner needs the virtual table to return all rows in the
+** sort order defined by the "nOrderBy" and "aOrderBy" fields of the
+** [sqlite3_index_info] object. This is the default expectation. If the
+** virtual table outputs all rows in sorted order, then it is always safe for
+** the xBestIndex method to set the "orderByConsumed" flag, regardless of
+** the return value from sqlite3_vtab_distinct().
+** <li value="1"><p>
+** ^(If the sqlite3_vtab_distinct() interface returns 1, that means
+** that the query planner does not need the rows to be returned in sorted order
+** as long as all rows with the same values in all columns identified by the
+** "aOrderBy" field are adjacent.)^ This mode is used when the query planner
+** is doing a GROUP BY.
+** <li value="2"><p>
+** ^(If the sqlite3_vtab_distinct() interface returns 2, that means
+** that the query planner does not need the rows returned in any particular
+** order, as long as rows with the same values in all "aOrderBy" columns
+** are adjacent.)^ ^(Furthermore, only a single row for each particular
+** combination of values in the columns identified by the "aOrderBy" field
+** needs to be returned.)^ ^It is always ok for two or more rows with the same
+** values in all "aOrderBy" columns to be returned, as long as all such rows
+** are adjacent. ^The virtual table may, if it chooses, omit extra rows
+** that have the same value for all columns identified by "aOrderBy".
+** ^However omitting the extra rows is optional.
+** This mode is used for a DISTINCT query.
+** <li value="3"><p>
+** ^(If the sqlite3_vtab_distinct() interface returns 3, that means
+** that the query planner needs only distinct rows but it does need the
+** rows to be sorted.)^ ^The virtual table implementation is free to omit
+** rows that are identical in all aOrderBy columns, if it wants to, but
+** it is not required to omit any rows. This mode is used for queries
+** that have both DISTINCT and ORDER BY clauses.
+** </ol>
+**
+** ^For the purposes of comparing virtual table output values to see if the
+** values are same value for sorting purposes, two NULL values are considered
+** to be the same. In other words, the comparison operator is "IS"
+** (or "IS NOT DISTINCT FROM") and not "==".
+**
+** If a virtual table implementation is unable to meet the requirements
+** specified above, then it must not set the "orderByConsumed" flag in the
+** [sqlite3_index_info] object or an incorrect answer may result.
+**
+** ^A virtual table implementation is always free to return rows in any order
+** it wants, as long as the "orderByConsumed" flag is not set. ^When the
+** the "orderByConsumed" flag is unset, the query planner will add extra
+** [bytecode] to ensure that the final results returned by the SQL query are
+** ordered correctly. The use of the "orderByConsumed" flag and the
+** sqlite3_vtab_distinct() interface is merely an optimization. ^Careful
+** use of the sqlite3_vtab_distinct() interface and the "orderByConsumed"
+** flag might help queries against a virtual table to run faster. Being
+** overly aggressive and setting the "orderByConsumed" flag when it is not
+** valid to do so, on the other hand, might cause SQLite to return incorrect
+** results.
+*/
+SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*);
+
+/*
+** CAPI3REF: Identify and handle IN constraints in xBestIndex
+**
+** This interface may only be used from within an
+** [xBestIndex|xBestIndex() method] of a [virtual table] implementation.
+** The result of invoking this interface from any other context is
+** undefined and probably harmful.
+**
+** ^(A constraint on a virtual table of the form
+** "[IN operator|column IN (...)]" is
+** communicated to the xBestIndex method as a
+** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^ If xBestIndex wants to use
+** this constraint, it must set the corresponding
+** aConstraintUsage[].argvIndex to a postive integer. ^(Then, under
+** the usual mode of handling IN operators, SQLite generates [bytecode]
+** that invokes the [xFilter|xFilter() method] once for each value
+** on the right-hand side of the IN operator.)^ Thus the virtual table
+** only sees a single value from the right-hand side of the IN operator
+** at a time.
+**
+** In some cases, however, it would be advantageous for the virtual
+** table to see all values on the right-hand of the IN operator all at
+** once. The sqlite3_vtab_in() interfaces facilitates this in two ways:
+**
+** <ol>
+** <li><p>
+** ^A call to sqlite3_vtab_in(P,N,-1) will return true (non-zero)
+** if and only if the [sqlite3_index_info|P->aConstraint][N] constraint
+** is an [IN operator] that can be processed all at once. ^In other words,
+** sqlite3_vtab_in() with -1 in the third argument is a mechanism
+** by which the virtual table can ask SQLite if all-at-once processing
+** of the IN operator is even possible.
+**
+** <li><p>
+** ^A call to sqlite3_vtab_in(P,N,F) with F==1 or F==0 indicates
+** to SQLite that the virtual table does or does not want to process
+** the IN operator all-at-once, respectively. ^Thus when the third
+** parameter (F) is non-negative, this interface is the mechanism by
+** which the virtual table tells SQLite how it wants to process the
+** IN operator.
+** </ol>
+**
+** ^The sqlite3_vtab_in(P,N,F) interface can be invoked multiple times
+** within the same xBestIndex method call. ^For any given P,N pair,
+** the return value from sqlite3_vtab_in(P,N,F) will always be the same
+** within the same xBestIndex call. ^If the interface returns true
+** (non-zero), that means that the constraint is an IN operator
+** that can be processed all-at-once. ^If the constraint is not an IN
+** operator or cannot be processed all-at-once, then the interface returns
+** false.
+**
+** ^(All-at-once processing of the IN operator is selected if both of the
+** following conditions are met:
+**
+** <ol>
+** <li><p> The P->aConstraintUsage[N].argvIndex value is set to a positive
+** integer. This is how the virtual table tells SQLite that it wants to
+** use the N-th constraint.
+**
+** <li><p> The last call to sqlite3_vtab_in(P,N,F) for which F was
+** non-negative had F>=1.
+** </ol>)^
+**
+** ^If either or both of the conditions above are false, then SQLite uses
+** the traditional one-at-a-time processing strategy for the IN constraint.
+** ^If both conditions are true, then the argvIndex-th parameter to the
+** xFilter method will be an [sqlite3_value] that appears to be NULL,
+** but which can be passed to [sqlite3_vtab_in_first()] and
+** [sqlite3_vtab_in_next()] to find all values on the right-hand side
+** of the IN constraint.
+*/
+SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle);
+
+/*
+** CAPI3REF: Find all elements on the right-hand side of an IN constraint.
+**
+** These interfaces are only useful from within the
+** [xFilter|xFilter() method] of a [virtual table] implementation.
+** The result of invoking these interfaces from any other context
+** is undefined and probably harmful.
+**
+** The X parameter in a call to sqlite3_vtab_in_first(X,P) or
+** sqlite3_vtab_in_next(X,P) should be one of the parameters to the
+** xFilter method which invokes these routines, and specifically
+** a parameter that was previously selected for all-at-once IN constraint
+** processing use the [sqlite3_vtab_in()] interface in the
+** [xBestIndex|xBestIndex method]. ^(If the X parameter is not
+** an xFilter argument that was selected for all-at-once IN constraint
+** processing, then these routines return [SQLITE_ERROR].)^
+**
+** ^(Use these routines to access all values on the right-hand side
+** of the IN constraint using code like the following:
+**
+** <blockquote><pre>
+** &nbsp; for(rc=sqlite3_vtab_in_first(pList, &pVal);
+** &nbsp; rc==SQLITE_OK && pVal;
+** &nbsp; rc=sqlite3_vtab_in_next(pList, &pVal)
+** &nbsp; ){
+** &nbsp; // do something with pVal
+** &nbsp; }
+** &nbsp; if( rc!=SQLITE_OK ){
+** &nbsp; // an error has occurred
+** &nbsp; }
+** </pre></blockquote>)^
+**
+** ^On success, the sqlite3_vtab_in_first(X,P) and sqlite3_vtab_in_next(X,P)
+** routines return SQLITE_OK and set *P to point to the first or next value
+** on the RHS of the IN constraint. ^If there are no more values on the
+** right hand side of the IN constraint, then *P is set to NULL and these
+** routines return [SQLITE_DONE]. ^The return value might be
+** some other value, such as SQLITE_NOMEM, in the event of a malfunction.
+**
+** The *ppOut values returned by these routines are only valid until the
+** next call to either of these routines or until the end of the xFilter
+** method from which these routines were called. If the virtual table
+** implementation needs to retain the *ppOut values for longer, it must make
+** copies. The *ppOut values are [protected sqlite3_value|protected].
+*/
+SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut);
+SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
+
+/*
+** CAPI3REF: Constraint values in xBestIndex()
+** METHOD: sqlite3_index_info
+**
+** This API may only be used from within the [xBestIndex|xBestIndex method]
+** of a [virtual table] implementation. The result of calling this interface
+** from outside of an xBestIndex method are undefined and probably harmful.
+**
+** ^When the sqlite3_vtab_rhs_value(P,J,V) interface is invoked from within
+** the [xBestIndex] method of a [virtual table] implementation, with P being
+** a copy of the [sqlite3_index_info] object pointer passed into xBestIndex and
+** J being a 0-based index into P->aConstraint[], then this routine
+** attempts to set *V to the value of the right-hand operand of
+** that constraint if the right-hand operand is known. ^If the
+** right-hand operand is not known, then *V is set to a NULL pointer.
+** ^The sqlite3_vtab_rhs_value(P,J,V) interface returns SQLITE_OK if
+** and only if *V is set to a value. ^The sqlite3_vtab_rhs_value(P,J,V)
+** inteface returns SQLITE_NOTFOUND if the right-hand side of the J-th
+** constraint is not available. ^The sqlite3_vtab_rhs_value() interface
+** can return an result code other than SQLITE_OK or SQLITE_NOTFOUND if
+** something goes wrong.
+**
+** The sqlite3_vtab_rhs_value() interface is usually only successful if
+** the right-hand operand of a constraint is a literal value in the original
+** SQL statement. If the right-hand operand is an expression or a reference
+** to some other column or a [host parameter], then sqlite3_vtab_rhs_value()
+** will probably return [SQLITE_NOTFOUND].
+**
+** ^(Some constraints, such as [SQLITE_INDEX_CONSTRAINT_ISNULL] and
+** [SQLITE_INDEX_CONSTRAINT_ISNOTNULL], have no right-hand operand. For such
+** constraints, sqlite3_vtab_rhs_value() always returns SQLITE_NOTFOUND.)^
+**
+** ^The [sqlite3_value] object returned in *V is a protected sqlite3_value
+** and remains valid for the duration of the xBestIndex method call.
+** ^When xBestIndex returns, the sqlite3_value object returned by
+** sqlite3_vtab_rhs_value() is automatically deallocated.
+**
+** The "_rhs_" in the name of this routine is an abbreviation for
+** "Right-Hand Side".
+*/
+SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
/*
** CAPI3REF: Conflict resolution modes
@@ -10439,6 +10297,10 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_
** managed by the prepared statement S and will be automatically freed when
** S is finalized.
**
+** Not all values are available for all query elements. When a value is
+** not available, the output variable is set to -1 if the value is numeric,
+** or to NULL if it is a string (SQLITE_SCANSTAT_NAME).
+**
** <dl>
** [[SQLITE_SCANSTAT_NLOOP]] <dt>SQLITE_SCANSTAT_NLOOP</dt>
** <dd>^The [sqlite3_int64] variable pointed to by the V parameter will be
@@ -10466,12 +10328,24 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_
** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN]
** description for the X-th loop.
**
-** [[SQLITE_SCANSTAT_SELECTID]] <dt>SQLITE_SCANSTAT_SELECT</dt>
+** [[SQLITE_SCANSTAT_SELECTID]] <dt>SQLITE_SCANSTAT_SELECTID</dt>
** <dd>^The "int" variable pointed to by the V parameter will be set to the
-** "select-id" for the X-th loop. The select-id identifies which query or
-** subquery the loop is part of. The main query has a select-id of zero.
-** The select-id is the same value as is output in the first column
-** of an [EXPLAIN QUERY PLAN] query.
+** id for the X-th query plan element. The id value is unique within the
+** statement. The select-id is the same value as is output in the first
+** column of an [EXPLAIN QUERY PLAN] query.
+**
+** [[SQLITE_SCANSTAT_PARENTID]] <dt>SQLITE_SCANSTAT_PARENTID</dt>
+** <dd>The "int" variable pointed to by the V parameter will be set to the
+** the id of the parent of the current query element, if applicable, or
+** to zero if the query element has no parent. This is the same value as
+** returned in the second column of an [EXPLAIN QUERY PLAN] query.
+**
+** [[SQLITE_SCANSTAT_NCYCLE]] <dt>SQLITE_SCANSTAT_NCYCLE</dt>
+** <dd>The sqlite3_int64 output value is set to the number of cycles,
+** according to the processor time-stamp counter, that elapsed while the
+** query element was being processed. This value is not available for
+** all query elements - if it is unavailable the output variable is
+** set to -1.
** </dl>
*/
#define SQLITE_SCANSTAT_NLOOP 0
@@ -10480,12 +10354,14 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_
#define SQLITE_SCANSTAT_NAME 3
#define SQLITE_SCANSTAT_EXPLAIN 4
#define SQLITE_SCANSTAT_SELECTID 5
+#define SQLITE_SCANSTAT_PARENTID 6
+#define SQLITE_SCANSTAT_NCYCLE 7
/*
** CAPI3REF: Prepared Statement Scan Status
** METHOD: sqlite3_stmt
**
-** This interface returns information about the predicted and measured
+** These interfaces return information about the predicted and measured
** performance for pStmt. Advanced applications can use this
** interface to compare the predicted and the measured performance and
** issue warnings and/or rerun [ANALYZE] if discrepancies are found.
@@ -10496,19 +10372,25 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_
**
** The "iScanStatusOp" parameter determines which status information to return.
** The "iScanStatusOp" must be one of the [scanstatus options] or the behavior
-** of this interface is undefined.
-** ^The requested measurement is written into a variable pointed to by
-** the "pOut" parameter.
-** Parameter "idx" identifies the specific loop to retrieve statistics for.
-** Loops are numbered starting from zero. ^If idx is out of range - less than
-** zero or greater than or equal to the total number of loops used to implement
-** the statement - a non-zero value is returned and the variable that pOut
-** points to is unchanged.
-**
-** ^Statistics might not be available for all loops in all statements. ^In cases
-** where there exist loops with no available statistics, this function behaves
-** as if the loop did not exist - it returns non-zero and leave the variable
-** that pOut points to unchanged.
+** of this interface is undefined. ^The requested measurement is written into
+** a variable pointed to by the "pOut" parameter.
+**
+** The "flags" parameter must be passed a mask of flags. At present only
+** one flag is defined - SQLITE_SCANSTAT_COMPLEX. If SQLITE_SCANSTAT_COMPLEX
+** is specified, then status information is available for all elements
+** of a query plan that are reported by "EXPLAIN QUERY PLAN" output. If
+** SQLITE_SCANSTAT_COMPLEX is not specified, then only query plan elements
+** that correspond to query loops (the "SCAN..." and "SEARCH..." elements of
+** the EXPLAIN QUERY PLAN output) are available. Invoking API
+** sqlite3_stmt_scanstatus() is equivalent to calling
+** sqlite3_stmt_scanstatus_v2() with a zeroed flags parameter.
+**
+** Parameter "idx" identifies the specific query element to retrieve statistics
+** for. Query elements are numbered starting from zero. A value of -1 may be
+** to query for statistics regarding the entire query. ^If idx is out of range
+** - less than -1 or greater than or equal to the total number of query
+** elements used to implement the statement - a non-zero value is returned and
+** the variable that pOut points to is unchanged.
**
** See also: [sqlite3_stmt_scanstatus_reset()]
*/
@@ -10518,6 +10400,19 @@ SQLITE_API int sqlite3_stmt_scanstatus(
int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */
void *pOut /* Result written here */
);
+SQLITE_API int sqlite3_stmt_scanstatus_v2(
+ sqlite3_stmt *pStmt, /* Prepared statement for which info desired */
+ int idx, /* Index of loop to report on */
+ int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */
+ int flags, /* Mask of flags defined below */
+ void *pOut /* Result written here */
+);
+
+/*
+** CAPI3REF: Prepared Statement Scan Status
+** KEYWORDS: {scan status flags}
+*/
+#define SQLITE_SCANSTAT_COMPLEX 0x0001
/*
** CAPI3REF: Zero Scan-Status Counters
@@ -10608,6 +10503,10 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*);
** function is not defined for operations on WITHOUT ROWID tables, or for
** DELETE operations on rowid tables.
**
+** ^The sqlite3_preupdate_hook(D,C,P) function returns the P argument from
+** the previous call on the same [database connection] D, or NULL for
+** the first call on D.
+**
** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()],
** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces
** provide additional information about a preupdate event. These routines
@@ -10960,6 +10859,10 @@ SQLITE_API unsigned char *sqlite3_serialize(
** database is currently in a read transaction or is involved in a backup
** operation.
**
+** It is not possible to deserialized into the TEMP database. If the
+** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the
+** function returns SQLITE_ERROR.
+**
** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the
** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then
** [sqlite3_free()] is invoked on argument P prior to returning.
@@ -11009,6 +10912,19 @@ SQLITE_API int sqlite3_deserialize(
# undef double
#endif
+#if defined(__wasi__)
+# undef SQLITE_WASI
+# define SQLITE_WASI 1
+# undef SQLITE_OMIT_WAL
+# define SQLITE_OMIT_WAL 1/* because it requires shared memory APIs */
+# ifndef SQLITE_OMIT_LOAD_EXTENSION
+# define SQLITE_OMIT_LOAD_EXTENSION
+# endif
+# ifndef SQLITE_THREADSAFE
+# define SQLITE_THREADSAFE 0
+# endif
+#endif
+
#if 0
} /* End of the 'extern "C"' block */
#endif
@@ -11215,16 +11131,20 @@ SQLITE_API int sqlite3session_create(
SQLITE_API void sqlite3session_delete(sqlite3_session *pSession);
/*
-** CAPIREF: Conigure a Session Object
+** CAPI3REF: Configure a Session Object
** METHOD: sqlite3_session
**
** This method is used to configure a session object after it has been
-** created. At present the only valid value for the second parameter is
-** [SQLITE_SESSION_OBJCONFIG_SIZE].
+** created. At present the only valid values for the second parameter are
+** [SQLITE_SESSION_OBJCONFIG_SIZE] and [SQLITE_SESSION_OBJCONFIG_ROWID].
**
-** Arguments for sqlite3session_object_config()
+*/
+SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg);
+
+/*
+** CAPI3REF: Options for sqlite3session_object_config
**
-** The following values may passed as the the 4th parameter to
+** The following values may passed as the the 2nd parameter to
** sqlite3session_object_config().
**
** <dt>SQLITE_SESSION_OBJCONFIG_SIZE <dd>
@@ -11240,12 +11160,21 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession);
**
** It is an error (SQLITE_MISUSE) to attempt to modify this setting after
** the first table has been attached to the session object.
+**
+** <dt>SQLITE_SESSION_OBJCONFIG_ROWID <dd>
+** This option is used to set, clear or query the flag that enables
+** collection of data for tables with no explicit PRIMARY KEY.
+**
+** Normally, tables with no explicit PRIMARY KEY are simply ignored
+** by the sessions module. However, if this flag is set, it behaves
+** as if such tables have a column "_rowid_ INTEGER PRIMARY KEY" inserted
+** as their leftmost columns.
+**
+** It is an error (SQLITE_MISUSE) to attempt to modify this setting after
+** the first table has been attached to the session object.
*/
-SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg);
-
-/*
-*/
-#define SQLITE_SESSION_OBJCONFIG_SIZE 1
+#define SQLITE_SESSION_OBJCONFIG_SIZE 1
+#define SQLITE_SESSION_OBJCONFIG_ROWID 2
/*
** CAPI3REF: Enable Or Disable A Session Object
@@ -12378,9 +12307,23 @@ SQLITE_API int sqlite3changeset_apply_v2(
** Invert the changeset before applying it. This is equivalent to inverting
** a changeset using sqlite3changeset_invert() before applying it. It is
** an error to specify this flag with a patchset.
+**
+** <dt>SQLITE_CHANGESETAPPLY_IGNORENOOP <dd>
+** Do not invoke the conflict handler callback for any changes that
+** would not actually modify the database even if they were applied.
+** Specifically, this means that the conflict handler is not invoked
+** for:
+** <ul>
+** <li>a delete change if the row being deleted cannot be found,
+** <li>an update change if the modified fields are already set to
+** their new values in the conflicting row, or
+** <li>an insert change if all fields of the conflicting row match
+** the row being inserted.
+** </ul>
*/
#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
#define SQLITE_CHANGESETAPPLY_INVERT 0x0002
+#define SQLITE_CHANGESETAPPLY_IGNORENOOP 0x0004
/*
** CAPI3REF: Constants Passed To The Conflict Handler
@@ -13438,11 +13381,16 @@ struct fts5_api {
/************** Continuing where we left off in sqliteInt.h ******************/
/*
+** Reuse the STATIC_LRU for mutex access to sqlite3_temp_directory.
+*/
+#define SQLITE_MUTEX_STATIC_TEMPDIR SQLITE_MUTEX_STATIC_VFS1
+
+/*
** Include the configuration header output by 'configure' if we're using the
** autoconf-based build
*/
#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H)
-/* #include "config.h" */
+#include "sqlite_cfg.h"
#define SQLITECONFIG_H 1
#endif
@@ -13672,17 +13620,18 @@ struct fts5_api {
#endif
/*
-** WAL mode depends on atomic aligned 32-bit loads and stores in a few
-** places. The following macros try to make this explicit.
+** A few places in the code require atomic load/store of aligned
+** integer values.
*/
#ifndef __has_extension
# define __has_extension(x) 0 /* compatibility with non-clang compilers */
#endif
-#if GCC_VERSION>=4007000 || \
- (__has_extension(c_atomic) && __has_extension(c_atomic_store_n))
+#if GCC_VERSION>=4007000 || __has_extension(c_atomic)
+# define SQLITE_ATOMIC_INTRINSICS 1
# define AtomicLoad(PTR) __atomic_load_n((PTR),__ATOMIC_RELAXED)
# define AtomicStore(PTR,VAL) __atomic_store_n((PTR),(VAL),__ATOMIC_RELAXED)
#else
+# define SQLITE_ATOMIC_INTRINSICS 0
# define AtomicLoad(PTR) (*(PTR))
# define AtomicStore(PTR,VAL) (*(PTR) = (VAL))
#endif
@@ -13728,15 +13677,22 @@ struct fts5_api {
#endif
/*
-** A macro to hint to the compiler that a function should not be
+** Macros to hint to the compiler that a function should or should not be
** inlined.
*/
#if defined(__GNUC__)
# define SQLITE_NOINLINE __attribute__((noinline))
+# define SQLITE_INLINE __attribute__((always_inline)) inline
#elif defined(_MSC_VER) && _MSC_VER>=1310
# define SQLITE_NOINLINE __declspec(noinline)
+# define SQLITE_INLINE __forceinline
#else
# define SQLITE_NOINLINE
+# define SQLITE_INLINE
+#endif
+#if defined(SQLITE_COVERAGE_TEST) || defined(__STRICT_ANSI__)
+# undef SQLITE_INLINE
+# define SQLITE_INLINE
#endif
/*
@@ -13887,11 +13843,12 @@ struct fts5_api {
** is significant and used at least once. On switch statements
** where multiple cases go to the same block of code, testcase()
** can insure that all cases are evaluated.
-**
*/
-#ifdef SQLITE_COVERAGE_TEST
-SQLITE_PRIVATE void sqlite3Coverage(int);
-# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); }
+#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG)
+# ifndef SQLITE_AMALGAMATION
+ extern unsigned int sqlite3CoverageCounter;
+# endif
+# define testcase(X) if( X ){ sqlite3CoverageCounter += (unsigned)__LINE__; }
#else
# define testcase(X)
#endif
@@ -13922,6 +13879,14 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
#endif
/*
+** Disable ALWAYS() and NEVER() (make them pass-throughs) for coverage
+** and mutation testing
+*/
+#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
+# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
+#endif
+
+/*
** The ALWAYS and NEVER macros surround boolean expressions which
** are intended to always be true or false, respectively. Such
** expressions could be omitted from the code completely. But they
@@ -13936,7 +13901,7 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
** be true and false so that the unreachable code they specify will
** not be counted as untested code.
*/
-#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
+#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
# define ALWAYS(X) (1)
# define NEVER(X) (0)
#elif !defined(NDEBUG)
@@ -13948,26 +13913,6 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
#endif
/*
-** The harmless(X) macro indicates that expression X is usually false
-** but can be true without causing any problems, but we don't know of
-** any way to cause X to be true.
-**
-** In debugging and testing builds, this macro will abort if X is ever
-** true. In this way, developers are alerted to a possible test case
-** that causes X to be true. If a harmless macro ever fails, that is
-** an opportunity to change the macro into a testcase() and add a new
-** test case to the test suite.
-**
-** For normal production builds, harmless(X) is a no-op, since it does
-** not matter whether expression X is true or false.
-*/
-#ifdef SQLITE_DEBUG
-# define harmless(X) assert(!(X));
-#else
-# define harmless(X)
-#endif
-
-/*
** Some conditionals are optimizations only. In other words, if the
** conditionals are replaced with a constant 1 (true) or 0 (false) then
** the correct answer is still obtained, though perhaps not as quickly.
@@ -14031,6 +13976,13 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
#endif
/*
+** SQLITE_OMIT_VIRTUALTABLE implies SQLITE_OMIT_ALTERTABLE
+*/
+#if defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_ALTERTABLE)
+# define SQLITE_OMIT_ALTERTABLE
+#endif
+
+/*
** Return true (non-zero) if the input is an integer that is too large
** to fit in 32-bits. This macro is used inside of various testcase()
** macros to verify that we have tested SQLite for large-file support.
@@ -14142,7 +14094,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
/*
** Number of entries in a hash table
*/
-/* #define sqliteHashCount(H) ((H)->count) // NOT USED */
+#define sqliteHashCount(H) ((H)->count)
#endif /* SQLITE_HASH_H */
@@ -14174,8 +14126,8 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
#define TK_LP 22
#define TK_RP 23
#define TK_AS 24
-#define TK_WITHOUT 25
-#define TK_COMMA 26
+#define TK_COMMA 25
+#define TK_WITHOUT 26
#define TK_ABORT 27
#define TK_ACTION 28
#define TK_AFTER 29
@@ -14261,78 +14213,79 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
#define TK_SLASH 109
#define TK_REM 110
#define TK_CONCAT 111
-#define TK_COLLATE 112
-#define TK_BITNOT 113
-#define TK_ON 114
-#define TK_INDEXED 115
-#define TK_STRING 116
-#define TK_JOIN_KW 117
-#define TK_CONSTRAINT 118
-#define TK_DEFAULT 119
-#define TK_NULL 120
-#define TK_PRIMARY 121
-#define TK_UNIQUE 122
-#define TK_CHECK 123
-#define TK_REFERENCES 124
-#define TK_AUTOINCR 125
-#define TK_INSERT 126
-#define TK_DELETE 127
-#define TK_UPDATE 128
-#define TK_SET 129
-#define TK_DEFERRABLE 130
-#define TK_FOREIGN 131
-#define TK_DROP 132
-#define TK_UNION 133
-#define TK_ALL 134
-#define TK_EXCEPT 135
-#define TK_INTERSECT 136
-#define TK_SELECT 137
-#define TK_VALUES 138
-#define TK_DISTINCT 139
-#define TK_DOT 140
-#define TK_FROM 141
-#define TK_JOIN 142
-#define TK_USING 143
-#define TK_ORDER 144
-#define TK_GROUP 145
-#define TK_HAVING 146
-#define TK_LIMIT 147
-#define TK_WHERE 148
-#define TK_RETURNING 149
-#define TK_INTO 150
-#define TK_NOTHING 151
-#define TK_FLOAT 152
-#define TK_BLOB 153
-#define TK_INTEGER 154
-#define TK_VARIABLE 155
-#define TK_CASE 156
-#define TK_WHEN 157
-#define TK_THEN 158
-#define TK_ELSE 159
-#define TK_INDEX 160
-#define TK_ALTER 161
-#define TK_ADD 162
-#define TK_WINDOW 163
-#define TK_OVER 164
-#define TK_FILTER 165
-#define TK_COLUMN 166
-#define TK_AGG_FUNCTION 167
-#define TK_AGG_COLUMN 168
-#define TK_TRUEFALSE 169
-#define TK_ISNOT 170
-#define TK_FUNCTION 171
-#define TK_UMINUS 172
-#define TK_UPLUS 173
-#define TK_TRUTH 174
-#define TK_REGISTER 175
-#define TK_VECTOR 176
-#define TK_SELECT_COLUMN 177
-#define TK_IF_NULL_ROW 178
-#define TK_ASTERISK 179
-#define TK_SPAN 180
-#define TK_ERROR 181
-#define TK_SPACE 182
-#define TK_ILLEGAL 183
+#define TK_PTR 112
+#define TK_COLLATE 113
+#define TK_BITNOT 114
+#define TK_ON 115
+#define TK_INDEXED 116
+#define TK_STRING 117
+#define TK_JOIN_KW 118
+#define TK_CONSTRAINT 119
+#define TK_DEFAULT 120
+#define TK_NULL 121
+#define TK_PRIMARY 122
+#define TK_UNIQUE 123
+#define TK_CHECK 124
+#define TK_REFERENCES 125
+#define TK_AUTOINCR 126
+#define TK_INSERT 127
+#define TK_DELETE 128
+#define TK_UPDATE 129
+#define TK_SET 130
+#define TK_DEFERRABLE 131
+#define TK_FOREIGN 132
+#define TK_DROP 133
+#define TK_UNION 134
+#define TK_ALL 135
+#define TK_EXCEPT 136
+#define TK_INTERSECT 137
+#define TK_SELECT 138
+#define TK_VALUES 139
+#define TK_DISTINCT 140
+#define TK_DOT 141
+#define TK_FROM 142
+#define TK_JOIN 143
+#define TK_USING 144
+#define TK_ORDER 145
+#define TK_GROUP 146
+#define TK_HAVING 147
+#define TK_LIMIT 148
+#define TK_WHERE 149
+#define TK_RETURNING 150
+#define TK_INTO 151
+#define TK_NOTHING 152
+#define TK_FLOAT 153
+#define TK_BLOB 154
+#define TK_INTEGER 155
+#define TK_VARIABLE 156
+#define TK_CASE 157
+#define TK_WHEN 158
+#define TK_THEN 159
+#define TK_ELSE 160
+#define TK_INDEX 161
+#define TK_ALTER 162
+#define TK_ADD 163
+#define TK_WINDOW 164
+#define TK_OVER 165
+#define TK_FILTER 166
+#define TK_COLUMN 167
+#define TK_AGG_FUNCTION 168
+#define TK_AGG_COLUMN 169
+#define TK_TRUEFALSE 170
+#define TK_ISNOT 171
+#define TK_FUNCTION 172
+#define TK_UMINUS 173
+#define TK_UPLUS 174
+#define TK_TRUTH 175
+#define TK_REGISTER 176
+#define TK_VECTOR 177
+#define TK_SELECT_COLUMN 178
+#define TK_IF_NULL_ROW 179
+#define TK_ASTERISK 180
+#define TK_SPAN 181
+#define TK_ERROR 182
+#define TK_SPACE 183
+#define TK_ILLEGAL 184
/************** End of parse.h ***********************************************/
/************** Continuing where we left off in sqliteInt.h ******************/
@@ -14438,7 +14391,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
** number of pages. A negative number N translations means that a buffer
** of -1024*N bytes is allocated and used for as many pages as it will hold.
**
-** The default value of "20" was choosen to minimize the run-time of the
+** The default value of "20" was chosen to minimize the run-time of the
** speedtest1 test program with options: --shrink-memory --reprepare
*/
#ifndef SQLITE_DEFAULT_PCACHE_INITSZ
@@ -14557,15 +14510,9 @@ typedef INT8_TYPE i8; /* 1-byte signed integer */
/*
** The datatype used to store estimates of the number of rows in a
-** table or index. This is an unsigned integer type. For 99.9% of
-** the world, a 32-bit integer is sufficient. But a 64-bit integer
-** can be used at compile-time if desired.
+** table or index.
*/
-#ifdef SQLITE_64BIT_STATS
- typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */
-#else
- typedef u32 tRowcnt; /* 32-bit is the default */
-#endif
+typedef u64 tRowcnt;
/*
** Estimated quantities used for query planning are stored as 16-bit
@@ -14600,6 +14547,7 @@ typedef INT16_TYPE LogEst;
# define SQLITE_PTRSIZE __SIZEOF_POINTER__
# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \
defined(_M_ARM) || defined(__arm__) || defined(__x86) || \
+ (defined(__APPLE__) && defined(__POWERPC__)) || \
(defined(__TOS_AIX__) && !defined(__64BIT__))
# define SQLITE_PTRSIZE 4
# else
@@ -14681,8 +14629,19 @@ typedef INT16_TYPE LogEst;
/*
** Round up a number to the next larger multiple of 8. This is used
** to force 8-byte alignment on 64-bit architectures.
+**
+** ROUND8() always does the rounding, for any argument.
+**
+** ROUND8P() assumes that the argument is already an integer number of
+** pointers in size, and so it is a no-op on systems where the pointer
+** size is 8.
*/
#define ROUND8(x) (((x)+7)&~7)
+#if SQLITE_PTRSIZE==8
+# define ROUND8P(x) (x)
+#else
+# define ROUND8P(x) (((x)+7)&~7)
+#endif
/*
** Round down to the nearest multiple of 8
@@ -14699,9 +14658,9 @@ typedef INT16_TYPE LogEst;
** pointers. In that case, only verify 4-byte alignment.
*/
#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC
-# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0)
+# define EIGHT_BYTE_ALIGNMENT(X) ((((uptr)(X) - (uptr)0)&3)==0)
#else
-# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0)
+# define EIGHT_BYTE_ALIGNMENT(X) ((((uptr)(X) - (uptr)0)&7)==0)
#endif
/*
@@ -14745,24 +14704,48 @@ typedef INT16_TYPE LogEst;
#endif
/*
-** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not
-** the Select query generator tracing logic is turned on.
+** TREETRACE_ENABLED will be either 1 or 0 depending on whether or not
+** the Abstract Syntax Tree tracing logic is turned on.
*/
#if !defined(SQLITE_AMALGAMATION)
-SQLITE_PRIVATE u32 sqlite3SelectTrace;
+SQLITE_PRIVATE u32 sqlite3TreeTrace;
#endif
#if defined(SQLITE_DEBUG) \
- && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_SELECTTRACE))
-# define SELECTTRACE_ENABLED 1
-# define SELECTTRACE(K,P,S,X) \
- if(sqlite3SelectTrace&(K)) \
+ && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_SELECTTRACE) \
+ || defined(SQLITE_ENABLE_TREETRACE))
+# define TREETRACE_ENABLED 1
+# define TREETRACE(K,P,S,X) \
+ if(sqlite3TreeTrace&(K)) \
sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\
sqlite3DebugPrintf X
#else
-# define SELECTTRACE(K,P,S,X)
-# define SELECTTRACE_ENABLED 0
+# define TREETRACE(K,P,S,X)
+# define TREETRACE_ENABLED 0
#endif
+/* TREETRACE flag meanings:
+**
+** 0x00000001 Beginning and end of SELECT processing
+** 0x00000002 WHERE clause processing
+** 0x00000004 Query flattener
+** 0x00000008 Result-set wildcard expansion
+** 0x00000010 Query name resolution
+** 0x00000020 Aggregate analysis
+** 0x00000040 Window functions
+** 0x00000080 Generated column names
+** 0x00000100 Move HAVING terms into WHERE
+** 0x00000200 Count-of-view optimization
+** 0x00000400 Compound SELECT processing
+** 0x00000800 Drop superfluous ORDER BY
+** 0x00001000 LEFT JOIN simplifies to JOIN
+** 0x00002000 Constant propagation
+** 0x00004000 Push-down optimization
+** 0x00008000 After all FROM-clause analysis
+** 0x00010000 Beginning of DELETE/INSERT/UPDATE processing
+** 0x00020000 Transform DISTINCT into GROUP BY
+** 0x00040000 SELECT tree dump after all code has been generated
+*/
+
/*
** Macros for "wheretrace"
*/
@@ -14775,6 +14758,36 @@ SQLITE_PRIVATE u32 sqlite3WhereTrace;
# define WHERETRACE(K,X)
#endif
+/*
+** Bits for the sqlite3WhereTrace mask:
+**
+** (---any--) Top-level block structure
+** 0x-------F High-level debug messages
+** 0x----FFF- More detail
+** 0xFFFF---- Low-level debug messages
+**
+** 0x00000001 Code generation
+** 0x00000002 Solver
+** 0x00000004 Solver costs
+** 0x00000008 WhereLoop inserts
+**
+** 0x00000010 Display sqlite3_index_info xBestIndex calls
+** 0x00000020 Range an equality scan metrics
+** 0x00000040 IN operator decisions
+** 0x00000080 WhereLoop cost adjustements
+** 0x00000100
+** 0x00000200 Covering index decisions
+** 0x00000400 OR optimization
+** 0x00000800 Index scanner
+** 0x00001000 More details associated with code generation
+** 0x00002000
+** 0x00004000 Show all WHERE terms at key points
+** 0x00008000 Show the full SELECT statement at key places
+**
+** 0x00010000 Show more detail when printing WHERE terms
+** 0x00020000 Show WHERE terms returned from whereScanNext()
+*/
+
/*
** An instance of the following structure is used to store the busy-handler
@@ -14794,11 +14807,25 @@ struct BusyHandler {
/*
** Name of table that holds the database schema.
+**
+** The PREFERRED names are used whereever possible. But LEGACY is also
+** used for backwards compatibility.
+**
+** 1. Queries can use either the PREFERRED or the LEGACY names
+** 2. The sqlite3_set_authorizer() callback uses the LEGACY name
+** 3. The PRAGMA table_list statement uses the PREFERRED name
+**
+** The LEGACY names are stored in the internal symbol hash table
+** in support of (2). Names are translated using sqlite3PreferredTableName()
+** for (3). The sqlite3FindTable() function takes care of translating
+** names for (1).
+**
+** Note that "sqlite_temp_schema" can also be called "temp.sqlite_schema".
*/
-#define DFLT_SCHEMA_TABLE "sqlite_master"
-#define DFLT_TEMP_SCHEMA_TABLE "sqlite_temp_master"
-#define ALT_SCHEMA_TABLE "sqlite_schema"
-#define ALT_TEMP_SCHEMA_TABLE "sqlite_temp_schema"
+#define LEGACY_SCHEMA_TABLE "sqlite_master"
+#define LEGACY_TEMP_SCHEMA_TABLE "sqlite_temp_master"
+#define PREFERRED_SCHEMA_TABLE "sqlite_schema"
+#define PREFERRED_TEMP_SCHEMA_TABLE "sqlite_temp_schema"
/*
@@ -14810,7 +14837,7 @@ struct BusyHandler {
** The name of the schema table. The name is different for TEMP.
*/
#define SCHEMA_TABLE(x) \
- ((!OMIT_TEMPDB)&&(x==1)?DFLT_TEMP_SCHEMA_TABLE:DFLT_SCHEMA_TABLE)
+ ((!OMIT_TEMPDB)&&(x==1)?LEGACY_TEMP_SCHEMA_TABLE:LEGACY_SCHEMA_TABLE)
/*
** A convenience macro that returns the number of elements in
@@ -14831,7 +14858,7 @@ struct BusyHandler {
** pointer will work here as long as it is distinct from SQLITE_STATIC
** and SQLITE_TRANSIENT.
*/
-#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomFault)
+#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomClear)
/*
** When SQLITE_OMIT_WSD is defined, it means that the target platform does
@@ -14900,6 +14927,7 @@ typedef struct FuncDef FuncDef;
typedef struct FuncDefHash FuncDefHash;
typedef struct IdList IdList;
typedef struct Index Index;
+typedef struct IndexedExpr IndexedExpr;
typedef struct IndexSample IndexSample;
typedef struct KeyClass KeyClass;
typedef struct KeyInfo KeyInfo;
@@ -14907,6 +14935,7 @@ typedef struct Lookaside Lookaside;
typedef struct LookasideSlot LookasideSlot;
typedef struct Module Module;
typedef struct NameContext NameContext;
+typedef struct OnOrUsing OnOrUsing;
typedef struct Parse Parse;
typedef struct ParseCleanup ParseCleanup;
typedef struct PreUpdate PreUpdate;
@@ -14959,10 +14988,12 @@ typedef struct With With;
/*
** A bit in a Bitmask
*/
-#define MASKBIT(n) (((Bitmask)1)<<(n))
-#define MASKBIT64(n) (((u64)1)<<(n))
-#define MASKBIT32(n) (((unsigned int)1)<<(n))
-#define ALLBITS ((Bitmask)-1)
+#define MASKBIT(n) (((Bitmask)1)<<(n))
+#define MASKBIT64(n) (((u64)1)<<(n))
+#define MASKBIT32(n) (((unsigned int)1)<<(n))
+#define SMASKBIT32(n) ((n)<=31?((unsigned int)1)<<(n):0)
+#define ALLBITS ((Bitmask)-1)
+#define TOPBIT (((Bitmask)1)<<(BMS-1))
/* A VList object records a mapping between parameters/variables/wildcards
** in the SQL statement (such as $abc, @pqr, or :xyz) and the integer
@@ -14977,6 +15008,331 @@ typedef int VList;
** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque
** pointer types (i.e. FuncDef) defined above.
*/
+/************** Include os.h in the middle of sqliteInt.h ********************/
+/************** Begin file os.h **********************************************/
+/*
+** 2001 September 16
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This header file (together with is companion C source-code file
+** "os.c") attempt to abstract the underlying operating system so that
+** the SQLite library will work on both POSIX and windows systems.
+**
+** This header file is #include-ed by sqliteInt.h and thus ends up
+** being included by every source file.
+*/
+#ifndef _SQLITE_OS_H_
+#define _SQLITE_OS_H_
+
+/*
+** Attempt to automatically detect the operating system and setup the
+** necessary pre-processor macros for it.
+*/
+/************** Include os_setup.h in the middle of os.h *********************/
+/************** Begin file os_setup.h ****************************************/
+/*
+** 2013 November 25
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file contains pre-processor directives related to operating system
+** detection and/or setup.
+*/
+#ifndef SQLITE_OS_SETUP_H
+#define SQLITE_OS_SETUP_H
+
+/*
+** Figure out if we are dealing with Unix, Windows, or some other operating
+** system.
+**
+** After the following block of preprocess macros, all of
+**
+** SQLITE_OS_KV
+** SQLITE_OS_OTHER
+** SQLITE_OS_UNIX
+** SQLITE_OS_WIN
+**
+** will defined to either 1 or 0. One of them will be 1. The others will be 0.
+** If none of the macros are initially defined, then select either
+** SQLITE_OS_UNIX or SQLITE_OS_WIN depending on the target platform.
+**
+** If SQLITE_OS_OTHER=1 is specified at compile-time, then the application
+** must provide its own VFS implementation together with sqlite3_os_init()
+** and sqlite3_os_end() routines.
+*/
+#if !defined(SQLITE_OS_KV) && !defined(SQLITE_OS_OTHER) && \
+ !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_WIN)
+# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \
+ defined(__MINGW32__) || defined(__BORLANDC__)
+# define SQLITE_OS_WIN 1
+# define SQLITE_OS_UNIX 0
+# else
+# define SQLITE_OS_WIN 0
+# define SQLITE_OS_UNIX 1
+# endif
+#endif
+#if SQLITE_OS_OTHER+1>1
+# undef SQLITE_OS_KV
+# define SQLITE_OS_KV 0
+# undef SQLITE_OS_UNIX
+# define SQLITE_OS_UNIX 0
+# undef SQLITE_OS_WIN
+# define SQLITE_OS_WIN 0
+#endif
+#if SQLITE_OS_KV+1>1
+# undef SQLITE_OS_OTHER
+# define SQLITE_OS_OTHER 0
+# undef SQLITE_OS_UNIX
+# define SQLITE_OS_UNIX 0
+# undef SQLITE_OS_WIN
+# define SQLITE_OS_WIN 0
+# define SQLITE_OMIT_LOAD_EXTENSION 1
+# define SQLITE_OMIT_WAL 1
+# define SQLITE_OMIT_DEPRECATED 1
+# undef SQLITE_TEMP_STORE
+# define SQLITE_TEMP_STORE 3 /* Always use memory for temporary storage */
+# define SQLITE_DQS 0
+# define SQLITE_OMIT_SHARED_CACHE 1
+# define SQLITE_OMIT_AUTOINIT 1
+#endif
+#if SQLITE_OS_UNIX+1>1
+# undef SQLITE_OS_KV
+# define SQLITE_OS_KV 0
+# undef SQLITE_OS_OTHER
+# define SQLITE_OS_OTHER 0
+# undef SQLITE_OS_WIN
+# define SQLITE_OS_WIN 0
+#endif
+#if SQLITE_OS_WIN+1>1
+# undef SQLITE_OS_KV
+# define SQLITE_OS_KV 0
+# undef SQLITE_OS_OTHER
+# define SQLITE_OS_OTHER 0
+# undef SQLITE_OS_UNIX
+# define SQLITE_OS_UNIX 0
+#endif
+
+
+#endif /* SQLITE_OS_SETUP_H */
+
+/************** End of os_setup.h ********************************************/
+/************** Continuing where we left off in os.h *************************/
+
+/* If the SET_FULLSYNC macro is not defined above, then make it
+** a no-op
+*/
+#ifndef SET_FULLSYNC
+# define SET_FULLSYNC(x,y)
+#endif
+
+/* Maximum pathname length. Note: FILENAME_MAX defined by stdio.h
+*/
+#ifndef SQLITE_MAX_PATHLEN
+# define SQLITE_MAX_PATHLEN FILENAME_MAX
+#endif
+
+/* Maximum number of symlinks that will be resolved while trying to
+** expand a filename in xFullPathname() in the VFS.
+*/
+#ifndef SQLITE_MAX_SYMLINK
+# define SQLITE_MAX_SYMLINK 200
+#endif
+
+/*
+** The default size of a disk sector
+*/
+#ifndef SQLITE_DEFAULT_SECTOR_SIZE
+# define SQLITE_DEFAULT_SECTOR_SIZE 4096
+#endif
+
+/*
+** Temporary files are named starting with this prefix followed by 16 random
+** alphanumeric characters, and no file extension. They are stored in the
+** OS's standard temporary file directory, and are deleted prior to exit.
+** If sqlite is being embedded in another program, you may wish to change the
+** prefix to reflect your program's name, so that if your program exits
+** prematurely, old temporary files can be easily identified. This can be done
+** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line.
+**
+** 2006-10-31: The default prefix used to be "sqlite_". But then
+** Mcafee started using SQLite in their anti-virus product and it
+** started putting files with the "sqlite" name in the c:/temp folder.
+** This annoyed many windows users. Those users would then do a
+** Google search for "sqlite", find the telephone numbers of the
+** developers and call to wake them up at night and complain.
+** For this reason, the default name prefix is changed to be "sqlite"
+** spelled backwards. So the temp files are still identified, but
+** anybody smart enough to figure out the code is also likely smart
+** enough to know that calling the developer will not help get rid
+** of the file.
+*/
+#ifndef SQLITE_TEMP_FILE_PREFIX
+# define SQLITE_TEMP_FILE_PREFIX "etilqs_"
+#endif
+
+/*
+** The following values may be passed as the second argument to
+** sqlite3OsLock(). The various locks exhibit the following semantics:
+**
+** SHARED: Any number of processes may hold a SHARED lock simultaneously.
+** RESERVED: A single process may hold a RESERVED lock on a file at
+** any time. Other processes may hold and obtain new SHARED locks.
+** PENDING: A single process may hold a PENDING lock on a file at
+** any one time. Existing SHARED locks may persist, but no new
+** SHARED locks may be obtained by other processes.
+** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks.
+**
+** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a
+** process that requests an EXCLUSIVE lock may actually obtain a PENDING
+** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to
+** sqlite3OsLock().
+*/
+#define NO_LOCK 0
+#define SHARED_LOCK 1
+#define RESERVED_LOCK 2
+#define PENDING_LOCK 3
+#define EXCLUSIVE_LOCK 4
+
+/*
+** File Locking Notes: (Mostly about windows but also some info for Unix)
+**
+** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because
+** those functions are not available. So we use only LockFile() and
+** UnlockFile().
+**
+** LockFile() prevents not just writing but also reading by other processes.
+** A SHARED_LOCK is obtained by locking a single randomly-chosen
+** byte out of a specific range of bytes. The lock byte is obtained at
+** random so two separate readers can probably access the file at the
+** same time, unless they are unlucky and choose the same lock byte.
+** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range.
+** There can only be one writer. A RESERVED_LOCK is obtained by locking
+** a single byte of the file that is designated as the reserved lock byte.
+** A PENDING_LOCK is obtained by locking a designated byte different from
+** the RESERVED_LOCK byte.
+**
+** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available,
+** which means we can use reader/writer locks. When reader/writer locks
+** are used, the lock is placed on the same range of bytes that is used
+** for probabilistic locking in Win95/98/ME. Hence, the locking scheme
+** will support two or more Win95 readers or two or more WinNT readers.
+** But a single Win95 reader will lock out all WinNT readers and a single
+** WinNT reader will lock out all other Win95 readers.
+**
+** The following #defines specify the range of bytes used for locking.
+** SHARED_SIZE is the number of bytes available in the pool from which
+** a random byte is selected for a shared lock. The pool of bytes for
+** shared locks begins at SHARED_FIRST.
+**
+** The same locking strategy and
+** byte ranges are used for Unix. This leaves open the possibility of having
+** clients on win95, winNT, and unix all talking to the same shared file
+** and all locking correctly. To do so would require that samba (or whatever
+** tool is being used for file sharing) implements locks correctly between
+** windows and unix. I'm guessing that isn't likely to happen, but by
+** using the same locking range we are at least open to the possibility.
+**
+** Locking in windows is manditory. For this reason, we cannot store
+** actual data in the bytes used for locking. The pager never allocates
+** the pages involved in locking therefore. SHARED_SIZE is selected so
+** that all locks will fit on a single page even at the minimum page size.
+** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE
+** is set high so that we don't have to allocate an unused page except
+** for very large databases. But one should test the page skipping logic
+** by setting PENDING_BYTE low and running the entire regression suite.
+**
+** Changing the value of PENDING_BYTE results in a subtly incompatible
+** file format. Depending on how it is changed, you might not notice
+** the incompatibility right away, even running a full regression test.
+** The default location of PENDING_BYTE is the first byte past the
+** 1GB boundary.
+**
+*/
+#ifdef SQLITE_OMIT_WSD
+# define PENDING_BYTE (0x40000000)
+#else
+# define PENDING_BYTE sqlite3PendingByte
+#endif
+#define RESERVED_BYTE (PENDING_BYTE+1)
+#define SHARED_FIRST (PENDING_BYTE+2)
+#define SHARED_SIZE 510
+
+/*
+** Wrapper around OS specific sqlite3_os_init() function.
+*/
+SQLITE_PRIVATE int sqlite3OsInit(void);
+
+/*
+** Functions for accessing sqlite3_file methods
+*/
+SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file*);
+SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset);
+SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset);
+SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size);
+SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int);
+SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize);
+SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int);
+SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int);
+SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut);
+SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*);
+SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*);
+#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0
+SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id);
+SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
+#ifndef SQLITE_OMIT_WAL
+SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **);
+SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int);
+SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id);
+SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int);
+#endif /* SQLITE_OMIT_WAL */
+SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64, int, void **);
+SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *, i64, void *);
+
+
+/*
+** Functions for accessing sqlite3_vfs methods
+*/
+SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *);
+SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int);
+SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut);
+SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *);
+#ifndef SQLITE_OMIT_LOAD_EXTENSION
+SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *);
+SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *);
+SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
+SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *);
+#endif /* SQLITE_OMIT_LOAD_EXTENSION */
+SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *);
+SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int);
+SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs*);
+SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*);
+
+/*
+** Convenience functions for opening and closing files using
+** sqlite3_malloc() to obtain space for the file-handle structure.
+*/
+SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*);
+SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *);
+
+#endif /* _SQLITE_OS_H_ */
+
+/************** End of os.h **************************************************/
+/************** Continuing where we left off in sqliteInt.h ******************/
/************** Include pager.h in the middle of sqliteInt.h *****************/
/************** Begin file pager.h *******************************************/
/*
@@ -15024,14 +15380,15 @@ typedef struct Pager Pager;
typedef struct PgHdr DbPage;
/*
-** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is
+** Page number PAGER_SJ_PGNO is never used in an SQLite database (it is
** reserved for working around a windows/posix incompatibility). It is
** used in the journal to signify that the remainder of the journal file
** is devoted to storing a super-journal name - there are no more pages to
** roll back. See comments for function writeSuperJournal() in pager.c
** for details.
*/
-#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1))
+#define PAGER_SJ_PGNO_COMPUTED(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1))
+#define PAGER_SJ_PGNO(x) ((x)->lckPgno)
/*
** Allowed values for the flags parameter to sqlite3PagerOpen().
@@ -15351,7 +15708,7 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *);
#define BTREE_BLOBKEY 2 /* Table has keys only - no data */
SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*);
-SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*);
+SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, i64*);
SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor*);
SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree*, int, int);
@@ -15411,7 +15768,7 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p);
** reduce network bandwidth.
**
** Note that BTREE_HINT_FLAGS with BTREE_BULKLOAD is the only hint used by
-** standard SQLite. The other hints are provided for extentions that use
+** standard SQLite. The other hints are provided for extensions that use
** the SQLite parser and code generator but substitute their own storage
** engine.
*/
@@ -15475,13 +15832,17 @@ SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor*, int, ...);
#endif
SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*);
-SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
+SQLITE_PRIVATE int sqlite3BtreeTableMoveto(
BtCursor*,
- UnpackedRecord *pUnKey,
i64 intKey,
int bias,
int *pRes
);
+SQLITE_PRIVATE int sqlite3BtreeIndexMoveto(
+ BtCursor*,
+ UnpackedRecord *pUnKey,
+ int *pRes
+);
SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*);
SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor*, int*);
SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags);
@@ -15553,7 +15914,15 @@ SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt);
SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*);
SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*);
-SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(sqlite3*,Btree*,Pgno*aRoot,int nRoot,int,int*);
+SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck(
+ sqlite3 *db, /* Database connection that is running the check */
+ Btree *p, /* The btree to be checked */
+ Pgno *aRoot, /* An array of root pages numbers for individual trees */
+ int nRoot, /* Number of entries in aRoot[] */
+ int mxErr, /* Stop reporting errors after this many */
+ int *pnErr, /* OUT: Write number of errors seen to this variable */
+ char **pzOut /* OUT: Write the error message string here */
+);
SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*);
SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor*);
@@ -15592,6 +15961,8 @@ SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *);
SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor*, BtCursor*, i64);
+SQLITE_PRIVATE void sqlite3BtreeClearCache(Btree*);
+
/*
** If we are not using shared cache, then there is no need to
** use mutexes to access the BtShared structures. So make the
@@ -15704,19 +16075,18 @@ struct VdbeOp {
#ifdef SQLITE_ENABLE_CURSOR_HINTS
Expr *pExpr; /* Used when p4type is P4_EXPR */
#endif
- int (*xAdvance)(BtCursor *, int);
} p4;
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
char *zComment; /* Comment to improve readability */
#endif
-#ifdef VDBE_PROFILE
- u32 cnt; /* Number of times this instruction was executed */
- u64 cycles; /* Total time spent executing this instruction */
-#endif
#ifdef SQLITE_VDBE_COVERAGE
u32 iSrcLine; /* Source-code line that generated this opcode
** with flags in the upper 8 bits */
#endif
+#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
+ u64 nExec;
+ u64 nCycle;
+#endif
};
typedef struct VdbeOp VdbeOp;
@@ -15755,21 +16125,19 @@ typedef struct VdbeOpList VdbeOpList;
#define P4_COLLSEQ (-2) /* P4 is a pointer to a CollSeq structure */
#define P4_INT32 (-3) /* P4 is a 32-bit signed integer */
#define P4_SUBPROGRAM (-4) /* P4 is a pointer to a SubProgram structure */
-#define P4_ADVANCE (-5) /* P4 is a pointer to BtreeNext() or BtreePrev() */
-#define P4_TABLE (-6) /* P4 is a pointer to a Table structure */
+#define P4_TABLE (-5) /* P4 is a pointer to a Table structure */
/* Above do not own any resources. Must free those below */
-#define P4_FREE_IF_LE (-7)
-#define P4_DYNAMIC (-7) /* Pointer to memory from sqliteMalloc() */
-#define P4_FUNCDEF (-8) /* P4 is a pointer to a FuncDef structure */
-#define P4_KEYINFO (-9) /* P4 is a pointer to a KeyInfo structure */
-#define P4_EXPR (-10) /* P4 is a pointer to an Expr tree */
-#define P4_MEM (-11) /* P4 is a pointer to a Mem* structure */
-#define P4_VTAB (-12) /* P4 is a pointer to an sqlite3_vtab structure */
-#define P4_REAL (-13) /* P4 is a 64-bit floating point value */
-#define P4_INT64 (-14) /* P4 is a 64-bit signed integer */
-#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */
-#define P4_FUNCCTX (-16) /* P4 is a pointer to an sqlite3_context object */
-#define P4_DYNBLOB (-17) /* Pointer to memory from sqliteMalloc() */
+#define P4_FREE_IF_LE (-6)
+#define P4_DYNAMIC (-6) /* Pointer to memory from sqliteMalloc() */
+#define P4_FUNCDEF (-7) /* P4 is a pointer to a FuncDef structure */
+#define P4_KEYINFO (-8) /* P4 is a pointer to a KeyInfo structure */
+#define P4_EXPR (-9) /* P4 is a pointer to an Expr tree */
+#define P4_MEM (-10) /* P4 is a pointer to a Mem* structure */
+#define P4_VTAB (-11) /* P4 is a pointer to an sqlite3_vtab structure */
+#define P4_REAL (-12) /* P4 is a 64-bit floating point value */
+#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */
+#define P4_INTARRAY (-14) /* P4 is a vector of 32-bit integers */
+#define P4_FUNCCTX (-15) /* P4 is a pointer to an sqlite3_context object */
/* Error message codes for OP_Halt */
#define P5_ConstraintNotNull 1
@@ -15814,53 +16182,53 @@ typedef struct VdbeOpList VdbeOpList;
#define OP_Savepoint 0
#define OP_AutoCommit 1
#define OP_Transaction 2
-#define OP_SorterNext 3 /* jump */
-#define OP_Prev 4 /* jump */
-#define OP_Next 5 /* jump */
-#define OP_Checkpoint 6
-#define OP_JournalMode 7
-#define OP_Vacuum 8
-#define OP_VFilter 9 /* jump, synopsis: iplan=r[P3] zplan='P4' */
-#define OP_VUpdate 10 /* synopsis: data=r[P3@P2] */
-#define OP_Goto 11 /* jump */
-#define OP_Gosub 12 /* jump */
-#define OP_InitCoroutine 13 /* jump */
-#define OP_Yield 14 /* jump */
-#define OP_MustBeInt 15 /* jump */
-#define OP_Jump 16 /* jump */
-#define OP_Once 17 /* jump */
-#define OP_If 18 /* jump */
+#define OP_Checkpoint 3
+#define OP_JournalMode 4
+#define OP_Vacuum 5
+#define OP_VFilter 6 /* jump, synopsis: iplan=r[P3] zplan='P4' */
+#define OP_VUpdate 7 /* synopsis: data=r[P3@P2] */
+#define OP_Init 8 /* jump, synopsis: Start at P2 */
+#define OP_Goto 9 /* jump */
+#define OP_Gosub 10 /* jump */
+#define OP_InitCoroutine 11 /* jump */
+#define OP_Yield 12 /* jump */
+#define OP_MustBeInt 13 /* jump */
+#define OP_Jump 14 /* jump */
+#define OP_Once 15 /* jump */
+#define OP_If 16 /* jump */
+#define OP_IfNot 17 /* jump */
+#define OP_IsType 18 /* jump, synopsis: if typeof(P1.P3) in P5 goto P2 */
#define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */
-#define OP_IfNot 20 /* jump */
-#define OP_IfNullRow 21 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */
-#define OP_SeekLT 22 /* jump, synopsis: key=r[P3@P4] */
-#define OP_SeekLE 23 /* jump, synopsis: key=r[P3@P4] */
-#define OP_SeekGE 24 /* jump, synopsis: key=r[P3@P4] */
-#define OP_SeekGT 25 /* jump, synopsis: key=r[P3@P4] */
-#define OP_IfNotOpen 26 /* jump, synopsis: if( !csr[P1] ) goto P2 */
-#define OP_IfNoHope 27 /* jump, synopsis: key=r[P3@P4] */
-#define OP_NoConflict 28 /* jump, synopsis: key=r[P3@P4] */
-#define OP_NotFound 29 /* jump, synopsis: key=r[P3@P4] */
-#define OP_Found 30 /* jump, synopsis: key=r[P3@P4] */
-#define OP_SeekRowid 31 /* jump, synopsis: intkey=r[P3] */
-#define OP_NotExists 32 /* jump, synopsis: intkey=r[P3] */
-#define OP_Last 33 /* jump */
-#define OP_IfSmaller 34 /* jump */
-#define OP_SorterSort 35 /* jump */
-#define OP_Sort 36 /* jump */
-#define OP_Rewind 37 /* jump */
-#define OP_IdxLE 38 /* jump, synopsis: key=r[P3@P4] */
-#define OP_IdxGT 39 /* jump, synopsis: key=r[P3@P4] */
-#define OP_IdxLT 40 /* jump, synopsis: key=r[P3@P4] */
-#define OP_IdxGE 41 /* jump, synopsis: key=r[P3@P4] */
-#define OP_RowSetRead 42 /* jump, synopsis: r[P3]=rowset(P1) */
+#define OP_IfNullRow 20 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */
+#define OP_SeekLT 21 /* jump, synopsis: key=r[P3@P4] */
+#define OP_SeekLE 22 /* jump, synopsis: key=r[P3@P4] */
+#define OP_SeekGE 23 /* jump, synopsis: key=r[P3@P4] */
+#define OP_SeekGT 24 /* jump, synopsis: key=r[P3@P4] */
+#define OP_IfNotOpen 25 /* jump, synopsis: if( !csr[P1] ) goto P2 */
+#define OP_IfNoHope 26 /* jump, synopsis: key=r[P3@P4] */
+#define OP_NoConflict 27 /* jump, synopsis: key=r[P3@P4] */
+#define OP_NotFound 28 /* jump, synopsis: key=r[P3@P4] */
+#define OP_Found 29 /* jump, synopsis: key=r[P3@P4] */
+#define OP_SeekRowid 30 /* jump, synopsis: intkey=r[P3] */
+#define OP_NotExists 31 /* jump, synopsis: intkey=r[P3] */
+#define OP_Last 32 /* jump */
+#define OP_IfSmaller 33 /* jump */
+#define OP_SorterSort 34 /* jump */
+#define OP_Sort 35 /* jump */
+#define OP_Rewind 36 /* jump */
+#define OP_SorterNext 37 /* jump */
+#define OP_Prev 38 /* jump */
+#define OP_Next 39 /* jump */
+#define OP_IdxLE 40 /* jump, synopsis: key=r[P3@P4] */
+#define OP_IdxGT 41 /* jump, synopsis: key=r[P3@P4] */
+#define OP_IdxLT 42 /* jump, synopsis: key=r[P3@P4] */
#define OP_Or 43 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */
#define OP_And 44 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */
-#define OP_RowSetTest 45 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */
-#define OP_Program 46 /* jump */
-#define OP_FkIfZero 47 /* jump, synopsis: if fkctr[P1]==0 goto P2 */
-#define OP_IfPos 48 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */
-#define OP_IfNotZero 49 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */
+#define OP_IdxGE 45 /* jump, synopsis: key=r[P3@P4] */
+#define OP_RowSetRead 46 /* jump, synopsis: r[P3]=rowset(P1) */
+#define OP_RowSetTest 47 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */
+#define OP_Program 48 /* jump */
+#define OP_FkIfZero 49 /* jump, synopsis: if fkctr[P1]==0 goto P2 */
#define OP_IsNull 50 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */
#define OP_NotNull 51 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */
#define OP_Ne 52 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */
@@ -15870,49 +16238,49 @@ typedef struct VdbeOpList VdbeOpList;
#define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]<r[P1] */
#define OP_Ge 57 /* jump, same as TK_GE, synopsis: IF r[P3]>=r[P1] */
#define OP_ElseEq 58 /* jump, same as TK_ESCAPE */
-#define OP_DecrJumpZero 59 /* jump, synopsis: if (--r[P1])==0 goto P2 */
-#define OP_IncrVacuum 60 /* jump */
-#define OP_VNext 61 /* jump */
-#define OP_Init 62 /* jump, synopsis: Start at P2 */
-#define OP_PureFunc 63 /* synopsis: r[P3]=func(r[P2@NP]) */
-#define OP_Function 64 /* synopsis: r[P3]=func(r[P2@NP]) */
-#define OP_Return 65
-#define OP_EndCoroutine 66
-#define OP_HaltIfNull 67 /* synopsis: if r[P3]=null halt */
-#define OP_Halt 68
-#define OP_Integer 69 /* synopsis: r[P2]=P1 */
-#define OP_Int64 70 /* synopsis: r[P2]=P4 */
-#define OP_String 71 /* synopsis: r[P2]='P4' (len=P1) */
-#define OP_Null 72 /* synopsis: r[P2..P3]=NULL */
-#define OP_SoftNull 73 /* synopsis: r[P1]=NULL */
-#define OP_Blob 74 /* synopsis: r[P2]=P4 (len=P1) */
-#define OP_Variable 75 /* synopsis: r[P2]=parameter(P1,P4) */
-#define OP_Move 76 /* synopsis: r[P2@P3]=r[P1@P3] */
-#define OP_Copy 77 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */
-#define OP_SCopy 78 /* synopsis: r[P2]=r[P1] */
-#define OP_IntCopy 79 /* synopsis: r[P2]=r[P1] */
-#define OP_ChngCntRow 80 /* synopsis: output=r[P1] */
-#define OP_ResultRow 81 /* synopsis: output=r[P1@P2] */
-#define OP_CollSeq 82
-#define OP_AddImm 83 /* synopsis: r[P1]=r[P1]+P2 */
-#define OP_RealAffinity 84
-#define OP_Cast 85 /* synopsis: affinity(r[P1]) */
-#define OP_Permutation 86
-#define OP_Compare 87 /* synopsis: r[P1@P3] <-> r[P2@P3] */
-#define OP_IsTrue 88 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */
-#define OP_ZeroOrNull 89 /* synopsis: r[P2] = 0 OR NULL */
-#define OP_Offset 90 /* synopsis: r[P3] = sqlite_offset(P1) */
-#define OP_Column 91 /* synopsis: r[P3]=PX */
-#define OP_Affinity 92 /* synopsis: affinity(r[P1@P2]) */
-#define OP_MakeRecord 93 /* synopsis: r[P3]=mkrec(r[P1@P2]) */
-#define OP_Count 94 /* synopsis: r[P2]=count() */
-#define OP_ReadCookie 95
-#define OP_SetCookie 96
-#define OP_ReopenIdx 97 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenRead 98 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenWrite 99 /* synopsis: root=P2 iDb=P3 */
-#define OP_OpenDup 100
-#define OP_OpenAutoindex 101 /* synopsis: nColumn=P2 */
+#define OP_IfPos 59 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */
+#define OP_IfNotZero 60 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */
+#define OP_DecrJumpZero 61 /* jump, synopsis: if (--r[P1])==0 goto P2 */
+#define OP_IncrVacuum 62 /* jump */
+#define OP_VNext 63 /* jump */
+#define OP_Filter 64 /* jump, synopsis: if key(P3@P4) not in filter(P1) goto P2 */
+#define OP_PureFunc 65 /* synopsis: r[P3]=func(r[P2@NP]) */
+#define OP_Function 66 /* synopsis: r[P3]=func(r[P2@NP]) */
+#define OP_Return 67
+#define OP_EndCoroutine 68
+#define OP_HaltIfNull 69 /* synopsis: if r[P3]=null halt */
+#define OP_Halt 70
+#define OP_Integer 71 /* synopsis: r[P2]=P1 */
+#define OP_Int64 72 /* synopsis: r[P2]=P4 */
+#define OP_String 73 /* synopsis: r[P2]='P4' (len=P1) */
+#define OP_BeginSubrtn 74 /* synopsis: r[P2]=NULL */
+#define OP_Null 75 /* synopsis: r[P2..P3]=NULL */
+#define OP_SoftNull 76 /* synopsis: r[P1]=NULL */
+#define OP_Blob 77 /* synopsis: r[P2]=P4 (len=P1) */
+#define OP_Variable 78 /* synopsis: r[P2]=parameter(P1,P4) */
+#define OP_Move 79 /* synopsis: r[P2@P3]=r[P1@P3] */
+#define OP_Copy 80 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */
+#define OP_SCopy 81 /* synopsis: r[P2]=r[P1] */
+#define OP_IntCopy 82 /* synopsis: r[P2]=r[P1] */
+#define OP_FkCheck 83
+#define OP_ResultRow 84 /* synopsis: output=r[P1@P2] */
+#define OP_CollSeq 85
+#define OP_AddImm 86 /* synopsis: r[P1]=r[P1]+P2 */
+#define OP_RealAffinity 87
+#define OP_Cast 88 /* synopsis: affinity(r[P1]) */
+#define OP_Permutation 89
+#define OP_Compare 90 /* synopsis: r[P1@P3] <-> r[P2@P3] */
+#define OP_IsTrue 91 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */
+#define OP_ZeroOrNull 92 /* synopsis: r[P2] = 0 OR NULL */
+#define OP_Offset 93 /* synopsis: r[P3] = sqlite_offset(P1) */
+#define OP_Column 94 /* synopsis: r[P3]=PX cursor P1 column P2 */
+#define OP_TypeCheck 95 /* synopsis: typecheck(r[P1@P2]) */
+#define OP_Affinity 96 /* synopsis: affinity(r[P1@P2]) */
+#define OP_MakeRecord 97 /* synopsis: r[P3]=mkrec(r[P1@P2]) */
+#define OP_Count 98 /* synopsis: r[P2]=count() */
+#define OP_ReadCookie 99
+#define OP_SetCookie 100
+#define OP_ReopenIdx 101 /* synopsis: root=P2 iDb=P3 */
#define OP_BitAnd 102 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */
#define OP_BitOr 103 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */
#define OP_ShiftLeft 104 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<<r[P1] */
@@ -15923,74 +16291,81 @@ typedef struct VdbeOpList VdbeOpList;
#define OP_Divide 109 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */
#define OP_Remainder 110 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */
#define OP_Concat 111 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */
-#define OP_OpenEphemeral 112 /* synopsis: nColumn=P2 */
-#define OP_BitNot 113 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */
-#define OP_SorterOpen 114
-#define OP_SequenceTest 115 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */
-#define OP_String8 116 /* same as TK_STRING, synopsis: r[P2]='P4' */
-#define OP_OpenPseudo 117 /* synopsis: P3 columns in r[P2] */
-#define OP_Close 118
-#define OP_ColumnsUsed 119
-#define OP_SeekScan 120 /* synopsis: Scan-ahead up to P1 rows */
-#define OP_SeekHit 121 /* synopsis: set P2<=seekHit<=P3 */
-#define OP_Sequence 122 /* synopsis: r[P2]=cursor[P1].ctr++ */
-#define OP_NewRowid 123 /* synopsis: r[P2]=rowid */
-#define OP_Insert 124 /* synopsis: intkey=r[P3] data=r[P2] */
-#define OP_RowCell 125
-#define OP_Delete 126
-#define OP_ResetCount 127
-#define OP_SorterCompare 128 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */
-#define OP_SorterData 129 /* synopsis: r[P2]=data */
-#define OP_RowData 130 /* synopsis: r[P2]=data */
-#define OP_Rowid 131 /* synopsis: r[P2]=rowid */
-#define OP_NullRow 132
-#define OP_SeekEnd 133
-#define OP_IdxInsert 134 /* synopsis: key=r[P2] */
-#define OP_SorterInsert 135 /* synopsis: key=r[P2] */
-#define OP_IdxDelete 136 /* synopsis: key=r[P2@P3] */
-#define OP_DeferredSeek 137 /* synopsis: Move P3 to P1.rowid if needed */
-#define OP_IdxRowid 138 /* synopsis: r[P2]=rowid */
-#define OP_FinishSeek 139
-#define OP_Destroy 140
-#define OP_Clear 141
-#define OP_ResetSorter 142
-#define OP_CreateBtree 143 /* synopsis: r[P2]=root iDb=P1 flags=P3 */
-#define OP_SqlExec 144
-#define OP_ParseSchema 145
-#define OP_LoadAnalysis 146
-#define OP_DropTable 147
-#define OP_DropIndex 148
-#define OP_DropTrigger 149
-#define OP_IntegrityCk 150
-#define OP_RowSetAdd 151 /* synopsis: rowset(P1)=r[P2] */
-#define OP_Real 152 /* same as TK_FLOAT, synopsis: r[P2]=P4 */
-#define OP_Param 153
-#define OP_FkCounter 154 /* synopsis: fkctr[P1]+=P2 */
-#define OP_MemMax 155 /* synopsis: r[P1]=max(r[P1],r[P2]) */
-#define OP_OffsetLimit 156 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */
-#define OP_AggInverse 157 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */
-#define OP_AggStep 158 /* synopsis: accum=r[P3] step(r[P2@P5]) */
-#define OP_AggStep1 159 /* synopsis: accum=r[P3] step(r[P2@P5]) */
-#define OP_AggValue 160 /* synopsis: r[P3]=value N=P2 */
-#define OP_AggFinal 161 /* synopsis: accum=r[P1] N=P2 */
-#define OP_Expire 162
-#define OP_CursorLock 163
-#define OP_CursorUnlock 164
-#define OP_TableLock 165 /* synopsis: iDb=P1 root=P2 write=P3 */
-#define OP_VBegin 166
-#define OP_VCreate 167
-#define OP_VDestroy 168
-#define OP_VOpen 169
-#define OP_VColumn 170 /* synopsis: r[P3]=vcolumn(P2) */
-#define OP_VRename 171
-#define OP_Pagecount 172
-#define OP_MaxPgcnt 173
-#define OP_Trace 174
-#define OP_CursorHint 175
-#define OP_ReleaseReg 176 /* synopsis: release r[P1@P2] mask P3 */
-#define OP_Noop 177
-#define OP_Explain 178
-#define OP_Abortable 179
+#define OP_OpenRead 112 /* synopsis: root=P2 iDb=P3 */
+#define OP_OpenWrite 113 /* synopsis: root=P2 iDb=P3 */
+#define OP_BitNot 114 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */
+#define OP_OpenDup 115
+#define OP_OpenAutoindex 116 /* synopsis: nColumn=P2 */
+#define OP_String8 117 /* same as TK_STRING, synopsis: r[P2]='P4' */
+#define OP_OpenEphemeral 118 /* synopsis: nColumn=P2 */
+#define OP_SorterOpen 119
+#define OP_SequenceTest 120 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */
+#define OP_OpenPseudo 121 /* synopsis: P3 columns in r[P2] */
+#define OP_Close 122
+#define OP_ColumnsUsed 123
+#define OP_SeekScan 124 /* synopsis: Scan-ahead up to P1 rows */
+#define OP_SeekHit 125 /* synopsis: set P2<=seekHit<=P3 */
+#define OP_Sequence 126 /* synopsis: r[P2]=cursor[P1].ctr++ */
+#define OP_NewRowid 127 /* synopsis: r[P2]=rowid */
+#define OP_Insert 128 /* synopsis: intkey=r[P3] data=r[P2] */
+#define OP_RowCell 129
+#define OP_Delete 130
+#define OP_ResetCount 131
+#define OP_SorterCompare 132 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */
+#define OP_SorterData 133 /* synopsis: r[P2]=data */
+#define OP_RowData 134 /* synopsis: r[P2]=data */
+#define OP_Rowid 135 /* synopsis: r[P2]=PX rowid of P1 */
+#define OP_NullRow 136
+#define OP_SeekEnd 137
+#define OP_IdxInsert 138 /* synopsis: key=r[P2] */
+#define OP_SorterInsert 139 /* synopsis: key=r[P2] */
+#define OP_IdxDelete 140 /* synopsis: key=r[P2@P3] */
+#define OP_DeferredSeek 141 /* synopsis: Move P3 to P1.rowid if needed */
+#define OP_IdxRowid 142 /* synopsis: r[P2]=rowid */
+#define OP_FinishSeek 143
+#define OP_Destroy 144
+#define OP_Clear 145
+#define OP_ResetSorter 146
+#define OP_CreateBtree 147 /* synopsis: r[P2]=root iDb=P1 flags=P3 */
+#define OP_SqlExec 148
+#define OP_ParseSchema 149
+#define OP_LoadAnalysis 150
+#define OP_DropTable 151
+#define OP_DropIndex 152
+#define OP_Real 153 /* same as TK_FLOAT, synopsis: r[P2]=P4 */
+#define OP_DropTrigger 154
+#define OP_IntegrityCk 155
+#define OP_RowSetAdd 156 /* synopsis: rowset(P1)=r[P2] */
+#define OP_Param 157
+#define OP_FkCounter 158 /* synopsis: fkctr[P1]+=P2 */
+#define OP_MemMax 159 /* synopsis: r[P1]=max(r[P1],r[P2]) */
+#define OP_OffsetLimit 160 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */
+#define OP_AggInverse 161 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */
+#define OP_AggStep 162 /* synopsis: accum=r[P3] step(r[P2@P5]) */
+#define OP_AggStep1 163 /* synopsis: accum=r[P3] step(r[P2@P5]) */
+#define OP_AggValue 164 /* synopsis: r[P3]=value N=P2 */
+#define OP_AggFinal 165 /* synopsis: accum=r[P1] N=P2 */
+#define OP_Expire 166
+#define OP_CursorLock 167
+#define OP_CursorUnlock 168
+#define OP_TableLock 169 /* synopsis: iDb=P1 root=P2 write=P3 */
+#define OP_VBegin 170
+#define OP_VCreate 171
+#define OP_VDestroy 172
+#define OP_VOpen 173
+#define OP_VInitIn 174 /* synopsis: r[P2]=ValueList(P1,P3) */
+#define OP_VColumn 175 /* synopsis: r[P3]=vcolumn(P2) */
+#define OP_VRename 176
+#define OP_Pagecount 177
+#define OP_MaxPgcnt 178
+#define OP_ClrSubtype 179 /* synopsis: r[P1].subtype = 0 */
+#define OP_FilterAdd 180 /* synopsis: filter(P1) += key(P3@P4) */
+#define OP_Trace 181
+#define OP_CursorHint 182
+#define OP_ReleaseReg 183 /* synopsis: release r[P1@P2] mask P3 */
+#define OP_Noop 184
+#define OP_Explain 185
+#define OP_Abortable 186
/* Properties such as "out2" or "jump" that are specified in
** comments following the "case" for each opcode in the vdbe.c
@@ -16002,30 +16377,32 @@ typedef struct VdbeOpList VdbeOpList;
#define OPFLG_IN3 0x08 /* in3: P3 is an input */
#define OPFLG_OUT2 0x10 /* out2: P2 is an output */
#define OPFLG_OUT3 0x20 /* out3: P3 is an output */
+#define OPFLG_NCYCLE 0x40 /* ncycle:Cycles count against P1 */
#define OPFLG_INITIALIZER {\
-/* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x10,\
-/* 8 */ 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03,\
-/* 16 */ 0x01, 0x01, 0x03, 0x12, 0x03, 0x01, 0x09, 0x09,\
-/* 24 */ 0x09, 0x09, 0x01, 0x09, 0x09, 0x09, 0x09, 0x09,\
-/* 32 */ 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\
-/* 40 */ 0x01, 0x01, 0x23, 0x26, 0x26, 0x0b, 0x01, 0x01,\
-/* 48 */ 0x03, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\
-/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x01, 0x01, 0x01, 0x00,\
-/* 64 */ 0x00, 0x02, 0x02, 0x08, 0x00, 0x10, 0x10, 0x10,\
-/* 72 */ 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10,\
-/* 80 */ 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00,\
-/* 88 */ 0x12, 0x1e, 0x20, 0x00, 0x00, 0x00, 0x10, 0x10,\
-/* 96 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x26,\
+/* 0 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x41, 0x00,\
+/* 8 */ 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01,\
+/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x01, 0x49, 0x49, 0x49,\
+/* 24 */ 0x49, 0x01, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49,\
+/* 32 */ 0x41, 0x01, 0x01, 0x01, 0x41, 0x01, 0x41, 0x41,\
+/* 40 */ 0x41, 0x41, 0x41, 0x26, 0x26, 0x41, 0x23, 0x0b,\
+/* 48 */ 0x01, 0x01, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\
+/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x03, 0x01, 0x41,\
+/* 64 */ 0x01, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10,\
+/* 72 */ 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00,\
+/* 80 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02,\
+/* 88 */ 0x02, 0x00, 0x00, 0x12, 0x1e, 0x20, 0x40, 0x00,\
+/* 96 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x40, 0x26, 0x26,\
/* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\
-/* 112 */ 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,\
-/* 120 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,\
-/* 128 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x04,\
-/* 136 */ 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,\
-/* 144 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,\
-/* 152 */ 0x10, 0x10, 0x00, 0x04, 0x1a, 0x00, 0x00, 0x00,\
-/* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
-/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\
-/* 176 */ 0x00, 0x00, 0x00, 0x00,}
+/* 112 */ 0x40, 0x00, 0x12, 0x40, 0x40, 0x10, 0x40, 0x00,\
+/* 120 */ 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x10, 0x10,\
+/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,\
+/* 136 */ 0x00, 0x40, 0x04, 0x04, 0x00, 0x40, 0x50, 0x40,\
+/* 144 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\
+/* 152 */ 0x00, 0x10, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04,\
+/* 160 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
+/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x50, 0x40,\
+/* 176 */ 0x00, 0x10, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00,\
+/* 184 */ 0x00, 0x00, 0x00,}
/* The resolve3P2Values() routine is able to run faster if it knows
** the value of the largest JUMP opcode. The smaller the maximum
@@ -16033,7 +16410,7 @@ typedef struct VdbeOpList VdbeOpList;
** generated this include file strives to group all JUMP opcodes
** together near the beginning of the list.
*/
-#define SQLITE_MX_JUMP_OPCODE 62 /* Maximum JUMP opcode */
+#define SQLITE_MX_JUMP_OPCODE 64 /* Maximum JUMP opcode */
/************** End of opcodes.h *********************************************/
/************** Continuing where we left off in vdbe.h ***********************/
@@ -16071,19 +16448,27 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p);
#endif
#if defined(SQLITE_DEBUG)
SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int);
+SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn(Vdbe*,int,int,int);
#else
# define sqlite3VdbeVerifyAbortable(A,B)
+# define sqlite3VdbeNoJumpsOutsideSubrtn(A,B,C,D)
#endif
SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno);
#ifndef SQLITE_OMIT_EXPLAIN
-SQLITE_PRIVATE void sqlite3VdbeExplain(Parse*,u8,const char*,...);
+SQLITE_PRIVATE int sqlite3VdbeExplain(Parse*,u8,const char*,...);
SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse*);
SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse*);
# define ExplainQueryPlan(P) sqlite3VdbeExplain P
+# ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+# define ExplainQueryPlan2(V,P) (V = sqlite3VdbeExplain P)
+# else
+# define ExplainQueryPlan2(V,P) ExplainQueryPlan(P)
+# endif
# define ExplainQueryPlanPop(P) sqlite3VdbeExplainPop(P)
# define ExplainQueryPlanParent(P) sqlite3VdbeExplainParent(P)
#else
# define ExplainQueryPlan(P)
+# define ExplainQueryPlan2(V,P)
# define ExplainQueryPlanPop(P)
# define ExplainQueryPlanParent(P) 0
# define sqlite3ExplainBreakpoint(A,B) /*no-op*/
@@ -16099,6 +16484,7 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1);
SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2);
SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3);
SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u16 P5);
+SQLITE_PRIVATE void sqlite3VdbeTypeofColumn(Vdbe*, int);
SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr);
SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe*, int addr);
SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr);
@@ -16113,11 +16499,11 @@ SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type);
SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse*, Index*);
SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int);
SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int);
+SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetLastOp(Vdbe*);
SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse*);
SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*);
-SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*);
SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int);
@@ -16255,14 +16641,22 @@ SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe*,int);
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
SQLITE_PRIVATE void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const char*);
+SQLITE_PRIVATE void sqlite3VdbeScanStatusRange(Vdbe*, int, int, int);
+SQLITE_PRIVATE void sqlite3VdbeScanStatusCounters(Vdbe*, int, int, int);
#else
-# define sqlite3VdbeScanStatus(a,b,c,d,e)
+# define sqlite3VdbeScanStatus(a,b,c,d,e,f)
+# define sqlite3VdbeScanStatusRange(a,b,c,d)
+# define sqlite3VdbeScanStatusCounters(a,b,c,d)
#endif
#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, VdbeOp*);
#endif
+#if defined(SQLITE_ENABLE_CURSOR_HINTS) && defined(SQLITE_DEBUG)
+SQLITE_PRIVATE int sqlite3CursorRangeHintExprCheck(Walker *pWalker, Expr *pExpr);
+#endif
+
#endif /* SQLITE_VDBE_H */
/************** End of vdbe.h ************************************************/
@@ -16311,7 +16705,7 @@ struct PgHdr {
** private to pcache.c and should not be accessed by other modules.
** pCache is grouped with the public elements for efficiency.
*/
- i16 nRef; /* Number of users of this page */
+ i64 nRef; /* Number of users of this page */
PgHdr *pDirtyNext; /* Next element in list of dirty pages */
PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */
/* NB: pDirtyNext and pDirtyPrev are undefined if the
@@ -16392,12 +16786,12 @@ SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *);
SQLITE_PRIVATE void sqlite3PcacheClear(PCache*);
/* Return the total number of outstanding page references */
-SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*);
+SQLITE_PRIVATE i64 sqlite3PcacheRefCount(PCache*);
/* Increment the reference count of an existing page */
SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*);
-SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*);
+SQLITE_PRIVATE i64 sqlite3PcachePageRefcount(PgHdr*);
/* Return the total number of pages stored in the cache */
SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*);
@@ -16462,290 +16856,6 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache);
/************** End of pcache.h **********************************************/
/************** Continuing where we left off in sqliteInt.h ******************/
-/************** Include os.h in the middle of sqliteInt.h ********************/
-/************** Begin file os.h **********************************************/
-/*
-** 2001 September 16
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This header file (together with is companion C source-code file
-** "os.c") attempt to abstract the underlying operating system so that
-** the SQLite library will work on both POSIX and windows systems.
-**
-** This header file is #include-ed by sqliteInt.h and thus ends up
-** being included by every source file.
-*/
-#ifndef _SQLITE_OS_H_
-#define _SQLITE_OS_H_
-
-/*
-** Attempt to automatically detect the operating system and setup the
-** necessary pre-processor macros for it.
-*/
-/************** Include os_setup.h in the middle of os.h *********************/
-/************** Begin file os_setup.h ****************************************/
-/*
-** 2013 November 25
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This file contains pre-processor directives related to operating system
-** detection and/or setup.
-*/
-#ifndef SQLITE_OS_SETUP_H
-#define SQLITE_OS_SETUP_H
-
-/*
-** Figure out if we are dealing with Unix, Windows, or some other operating
-** system.
-**
-** After the following block of preprocess macros, all of SQLITE_OS_UNIX,
-** SQLITE_OS_WIN, and SQLITE_OS_OTHER will defined to either 1 or 0. One of
-** the three will be 1. The other two will be 0.
-*/
-#if defined(SQLITE_OS_OTHER)
-# if SQLITE_OS_OTHER==1
-# undef SQLITE_OS_UNIX
-# define SQLITE_OS_UNIX 0
-# undef SQLITE_OS_WIN
-# define SQLITE_OS_WIN 0
-# else
-# undef SQLITE_OS_OTHER
-# endif
-#endif
-#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER)
-# define SQLITE_OS_OTHER 0
-# ifndef SQLITE_OS_WIN
-# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \
- defined(__MINGW32__) || defined(__BORLANDC__)
-# define SQLITE_OS_WIN 1
-# define SQLITE_OS_UNIX 0
-# else
-# define SQLITE_OS_WIN 0
-# define SQLITE_OS_UNIX 1
-# endif
-# else
-# define SQLITE_OS_UNIX 0
-# endif
-#else
-# ifndef SQLITE_OS_WIN
-# define SQLITE_OS_WIN 0
-# endif
-#endif
-
-#endif /* SQLITE_OS_SETUP_H */
-
-/************** End of os_setup.h ********************************************/
-/************** Continuing where we left off in os.h *************************/
-
-/* If the SET_FULLSYNC macro is not defined above, then make it
-** a no-op
-*/
-#ifndef SET_FULLSYNC
-# define SET_FULLSYNC(x,y)
-#endif
-
-/* Maximum pathname length. Note: FILENAME_MAX defined by stdio.h
-*/
-#ifndef SQLITE_MAX_PATHLEN
-# define SQLITE_MAX_PATHLEN FILENAME_MAX
-#endif
-
-/*
-** The default size of a disk sector
-*/
-#ifndef SQLITE_DEFAULT_SECTOR_SIZE
-# define SQLITE_DEFAULT_SECTOR_SIZE 4096
-#endif
-
-/*
-** Temporary files are named starting with this prefix followed by 16 random
-** alphanumeric characters, and no file extension. They are stored in the
-** OS's standard temporary file directory, and are deleted prior to exit.
-** If sqlite is being embedded in another program, you may wish to change the
-** prefix to reflect your program's name, so that if your program exits
-** prematurely, old temporary files can be easily identified. This can be done
-** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line.
-**
-** 2006-10-31: The default prefix used to be "sqlite_". But then
-** Mcafee started using SQLite in their anti-virus product and it
-** started putting files with the "sqlite" name in the c:/temp folder.
-** This annoyed many windows users. Those users would then do a
-** Google search for "sqlite", find the telephone numbers of the
-** developers and call to wake them up at night and complain.
-** For this reason, the default name prefix is changed to be "sqlite"
-** spelled backwards. So the temp files are still identified, but
-** anybody smart enough to figure out the code is also likely smart
-** enough to know that calling the developer will not help get rid
-** of the file.
-*/
-#ifndef SQLITE_TEMP_FILE_PREFIX
-# define SQLITE_TEMP_FILE_PREFIX "etilqs_"
-#endif
-
-/*
-** The following values may be passed as the second argument to
-** sqlite3OsLock(). The various locks exhibit the following semantics:
-**
-** SHARED: Any number of processes may hold a SHARED lock simultaneously.
-** RESERVED: A single process may hold a RESERVED lock on a file at
-** any time. Other processes may hold and obtain new SHARED locks.
-** PENDING: A single process may hold a PENDING lock on a file at
-** any one time. Existing SHARED locks may persist, but no new
-** SHARED locks may be obtained by other processes.
-** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks.
-**
-** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a
-** process that requests an EXCLUSIVE lock may actually obtain a PENDING
-** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to
-** sqlite3OsLock().
-*/
-#define NO_LOCK 0
-#define SHARED_LOCK 1
-#define RESERVED_LOCK 2
-#define PENDING_LOCK 3
-#define EXCLUSIVE_LOCK 4
-
-/*
-** File Locking Notes: (Mostly about windows but also some info for Unix)
-**
-** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because
-** those functions are not available. So we use only LockFile() and
-** UnlockFile().
-**
-** LockFile() prevents not just writing but also reading by other processes.
-** A SHARED_LOCK is obtained by locking a single randomly-chosen
-** byte out of a specific range of bytes. The lock byte is obtained at
-** random so two separate readers can probably access the file at the
-** same time, unless they are unlucky and choose the same lock byte.
-** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range.
-** There can only be one writer. A RESERVED_LOCK is obtained by locking
-** a single byte of the file that is designated as the reserved lock byte.
-** A PENDING_LOCK is obtained by locking a designated byte different from
-** the RESERVED_LOCK byte.
-**
-** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available,
-** which means we can use reader/writer locks. When reader/writer locks
-** are used, the lock is placed on the same range of bytes that is used
-** for probabilistic locking in Win95/98/ME. Hence, the locking scheme
-** will support two or more Win95 readers or two or more WinNT readers.
-** But a single Win95 reader will lock out all WinNT readers and a single
-** WinNT reader will lock out all other Win95 readers.
-**
-** The following #defines specify the range of bytes used for locking.
-** SHARED_SIZE is the number of bytes available in the pool from which
-** a random byte is selected for a shared lock. The pool of bytes for
-** shared locks begins at SHARED_FIRST.
-**
-** The same locking strategy and
-** byte ranges are used for Unix. This leaves open the possibility of having
-** clients on win95, winNT, and unix all talking to the same shared file
-** and all locking correctly. To do so would require that samba (or whatever
-** tool is being used for file sharing) implements locks correctly between
-** windows and unix. I'm guessing that isn't likely to happen, but by
-** using the same locking range we are at least open to the possibility.
-**
-** Locking in windows is manditory. For this reason, we cannot store
-** actual data in the bytes used for locking. The pager never allocates
-** the pages involved in locking therefore. SHARED_SIZE is selected so
-** that all locks will fit on a single page even at the minimum page size.
-** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE
-** is set high so that we don't have to allocate an unused page except
-** for very large databases. But one should test the page skipping logic
-** by setting PENDING_BYTE low and running the entire regression suite.
-**
-** Changing the value of PENDING_BYTE results in a subtly incompatible
-** file format. Depending on how it is changed, you might not notice
-** the incompatibility right away, even running a full regression test.
-** The default location of PENDING_BYTE is the first byte past the
-** 1GB boundary.
-**
-*/
-#ifdef SQLITE_OMIT_WSD
-# define PENDING_BYTE (0x40000000)
-#else
-# define PENDING_BYTE sqlite3PendingByte
-#endif
-#define RESERVED_BYTE (PENDING_BYTE+1)
-#define SHARED_FIRST (PENDING_BYTE+2)
-#define SHARED_SIZE 510
-
-/*
-** Wrapper around OS specific sqlite3_os_init() function.
-*/
-SQLITE_PRIVATE int sqlite3OsInit(void);
-
-/*
-** Functions for accessing sqlite3_file methods
-*/
-SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file*);
-SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset);
-SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset);
-SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size);
-SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int);
-SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize);
-SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int);
-SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int);
-SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut);
-SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*);
-SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*);
-#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0
-SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id);
-SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
-#ifndef SQLITE_OMIT_WAL
-SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **);
-SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int);
-SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id);
-SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int);
-#endif /* SQLITE_OMIT_WAL */
-SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64, int, void **);
-SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *, i64, void *);
-
-
-/*
-** Functions for accessing sqlite3_vfs methods
-*/
-SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *);
-SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int);
-SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut);
-SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *);
-#ifndef SQLITE_OMIT_LOAD_EXTENSION
-SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *);
-SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *);
-SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
-SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *);
-#endif /* SQLITE_OMIT_LOAD_EXTENSION */
-SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *);
-SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int);
-SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs*);
-SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*);
-
-/*
-** Convenience functions for opening and closing files using
-** sqlite3_malloc() to obtain space for the file-handle structure.
-*/
-SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*);
-SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *);
-
-#endif /* _SQLITE_OS_H_ */
-
-/************** End of os.h **************************************************/
-/************** Continuing where we left off in sqliteInt.h ******************/
/************** Include mutex.h in the middle of sqliteInt.h *****************/
/************** Begin file mutex.h *******************************************/
/*
@@ -16991,6 +17101,7 @@ struct Lookaside {
#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */
void *pStart; /* First byte of available memory space */
void *pEnd; /* First byte past end of available space */
+ void *pTrueEnd; /* True value of pEnd, when db->pnBytesFreed!=0 */
};
struct LookasideSlot {
LookasideSlot *pNext; /* Next buffer in the list of free buffers */
@@ -17094,6 +17205,7 @@ struct sqlite3 {
u32 nSchemaLock; /* Do not reset the schema when non-zero */
unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */
int errCode; /* Most recent error code (SQLITE_*) */
+ int errByteOffset; /* Byte offset of error in SQL statement */
int errMask; /* & result codes with this before returning */
int iSysErrno; /* Errno value from last system error */
u32 dbOptFlags; /* Flags to enable/disable optimizations */
@@ -17110,10 +17222,10 @@ struct sqlite3 {
u8 mTrace; /* zero or more SQLITE_TRACE flags */
u8 noSharedCache; /* True if no shared-cache backends */
u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */
+ u8 eOpenState; /* Current condition of the connection */
int nextPagesize; /* Pagesize after VACUUM if >0 */
- u32 magic; /* Magic number for detect library misuse */
- int nChange; /* Value returned by sqlite3_changes() */
- int nTotalChange; /* Value returned by sqlite3_total_changes() */
+ i64 nChange; /* Value returned by sqlite3_changes() */
+ i64 nTotalChange; /* Value returned by sqlite3_total_changes() */
int aLimit[SQLITE_N_LIMIT]; /* Limits */
int nMaxSorterMmap; /* Maximum size of regions mapped by sorter */
struct sqlite3InitInfo { /* Information used during initialization */
@@ -17123,7 +17235,7 @@ struct sqlite3 {
unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */
unsigned imposterTable : 1; /* Building an imposter table */
unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */
- char **azInit; /* "type", "name", and "tbl_name" columns */
+ const char **azInit; /* "type", "name", and "tbl_name" columns */
} init;
int nVdbeActive; /* Number of VDBEs currently running */
int nVdbeRead; /* Number of active VDBEs that read or write */
@@ -17133,10 +17245,10 @@ struct sqlite3 {
int nExtension; /* Number of loaded extensions */
void **aExtension; /* Array of shared library handles */
union {
- void (*xLegacy)(void*,const char*); /* Legacy trace function */
- int (*xV2)(u32,void*,void*,void*); /* V2 Trace function */
+ void (*xLegacy)(void*,const char*); /* mTrace==SQLITE_TRACE_LEGACY */
+ int (*xV2)(u32,void*,void*,void*); /* All other mTrace values */
} trace;
- void *pTraceArg; /* Argument to the trace function */
+ void *pTraceArg; /* Argument to the trace function */
#ifndef SQLITE_OMIT_DEPRECATED
void (*xProfile)(void*,const char*,u64); /* Profiling function */
void *pProfileArg; /* Argument to profile function */
@@ -17147,6 +17259,9 @@ struct sqlite3 {
void (*xRollbackCallback)(void*); /* Invoked at every commit. */
void *pUpdateArg;
void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64);
+ void *pAutovacPagesArg; /* Client argument to autovac_pages */
+ void (*xAutovacDestr)(void*); /* Destructor for pAutovacPAgesArg */
+ unsigned int (*xAutovacPages)(void*,const char*,u32,u32,u32);
Parse *pParse; /* Current parse */
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
void *pPreUpdateArg; /* First argument to xPreUpdateCallback */
@@ -17251,7 +17366,7 @@ struct sqlite3 {
#define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */
/* result set is empty */
#define SQLITE_IgnoreChecks 0x00000200 /* Do not enforce check constraints */
-#define SQLITE_ReadUncommit 0x00000400 /* READ UNCOMMITTED in shared-cache */
+#define SQLITE_StmtScanStatus 0x00000400 /* Enable stmt_scanstats() counters */
#define SQLITE_NoCkptOnClose 0x00000800 /* No checkpoint on close()/DETACH */
#define SQLITE_ReverseOrder 0x00001000 /* Reverse unordered SELECTs */
#define SQLITE_RecTriggers 0x00002000 /* Enable recursive triggers */
@@ -17276,6 +17391,8 @@ struct sqlite3 {
#define SQLITE_CountRows HI(0x00001) /* Count rows changed by INSERT, */
/* DELETE, or UPDATE and return */
/* the count using a callback. */
+#define SQLITE_CorruptRdOnly HI(0x00002) /* Prohibit writes due to error */
+#define SQLITE_ReadUncommit HI(0x00004) /* READ UNCOMMITTED in shared-cache */
/* Flags used only if debugging */
#ifdef SQLITE_DEBUG
@@ -17322,6 +17439,17 @@ struct sqlite3 {
#define SQLITE_PropagateConst 0x00008000 /* The constant propagation opt */
#define SQLITE_MinMaxOpt 0x00010000 /* The min/max optimization */
#define SQLITE_SeekScan 0x00020000 /* The OP_SeekScan optimization */
+#define SQLITE_OmitOrderBy 0x00040000 /* Omit pointless ORDER BY */
+ /* TH3 expects this value ^^^^^^^^^^ to be 0x40000. Coordinate any change */
+#define SQLITE_BloomFilter 0x00080000 /* Use a Bloom filter on searches */
+#define SQLITE_BloomPulldown 0x00100000 /* Run Bloom filters early */
+#define SQLITE_BalancedMerge 0x00200000 /* Balance multi-way merges */
+#define SQLITE_ReleaseReg 0x00400000 /* Use OP_ReleaseReg for testing */
+#define SQLITE_FlttnUnionAll 0x00800000 /* Disable the UNION ALL flattener */
+ /* TH3 expects this value ^^^^^^^^^^ See flatten04.test */
+#define SQLITE_IndexedExpr 0x01000000 /* Pull exprs from index when able */
+#define SQLITE_Coroutines 0x02000000 /* Co-routines for subqueries */
+#define SQLITE_NullUnusedCols 0x04000000 /* NULL unused columns in subqueries */
#define SQLITE_AllOpts 0xffffffff /* All optimizations */
/*
@@ -17336,17 +17464,16 @@ struct sqlite3 {
*/
#define ConstFactorOk(P) ((P)->okConstFactor)
-/*
-** Possible values for the sqlite.magic field.
-** The numbers are obtained at random and have no special meaning, other
-** than being distinct from one another.
+/* Possible values for the sqlite3.eOpenState field.
+** The numbers are randomly selected such that a minimum of three bits must
+** change to convert any number to another or to zero
*/
-#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */
-#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */
-#define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */
-#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */
-#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */
-#define SQLITE_MAGIC_ZOMBIE 0x64cffc7f /* Close with last statement close */
+#define SQLITE_STATE_OPEN 0x76 /* Database is open */
+#define SQLITE_STATE_CLOSED 0xce /* Database is closed */
+#define SQLITE_STATE_SICK 0xba /* Error and awaiting close */
+#define SQLITE_STATE_BUSY 0x6d /* Database currently in use */
+#define SQLITE_STATE_ERROR 0xd5 /* An SQLITE_MISUSE error occurred */
+#define SQLITE_STATE_ZOMBIE 0xa7 /* Close with last statement close */
/*
** Each SQL function is defined by an instance of the following
@@ -17371,7 +17498,7 @@ struct FuncDef {
union {
FuncDef *pHash; /* Next with a different name but the same hash */
FuncDestructor *pDestructor; /* Reference counted destructor function */
- } u;
+ } u; /* pHash if SQLITE_FUNC_BUILTIN, pDestructor otherwise */
};
/*
@@ -17401,13 +17528,20 @@ struct FuncDestructor {
** are assert() statements in the code to verify this.
**
** Value constraints (enforced via assert()):
-** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg
-** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG
-** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG
-** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API
-** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API
-** SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS
+** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg
+** SQLITE_FUNC_ANYORDER == NC_OrderAgg == SF_OrderByReqd
+** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG
+** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG
+** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API
+** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API
+** SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS -- opposite meanings!!!
** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API
+**
+** Note that even though SQLITE_FUNC_UNSAFE and SQLITE_INNOCUOUS have the
+** same bit value, their meanings are inverted. SQLITE_FUNC_UNSAFE is
+** used internally and if set means tha the function has side effects.
+** SQLITE_INNOCUOUS is used by application code and means "not unsafe".
+** See multiple instances of tag-20230109-1.
*/
#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */
#define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */
@@ -17424,13 +17558,15 @@ struct FuncDestructor {
#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
** single query - might change over time */
#define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */
-#define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */
+/* 0x8000 -- available for reuse */
#define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */
#define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */
#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */
#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */
#define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */
#define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */
+#define SQLITE_FUNC_BUILTIN 0x00800000 /* This is a built-in function */
+#define SQLITE_FUNC_ANYORDER 0x08000000 /* count/min/max aggregate */
/* Identifier numbers for each in-line function */
#define INLINEFUNC_coalesce 0
@@ -17439,6 +17575,7 @@ struct FuncDestructor {
#define INLINEFUNC_expr_compare 3
#define INLINEFUNC_affinity 4
#define INLINEFUNC_iif 5
+#define INLINEFUNC_sqlite_offset 6
#define INLINEFUNC_unlikely 99 /* Default case */
/*
@@ -17493,7 +17630,7 @@ struct FuncDestructor {
** are interpreted in the same way as the first 4 parameters to
** FUNCTION().
**
-** WFUNCTION(zName, nArg, iArg, xStep, xFinal, xValue, xInverse)
+** WAGGREGATE(zName, nArg, iArg, xStep, xFinal, xValue, xInverse)
** Used to create an aggregate function definition implemented by
** the C functions xStep and xFinal. The first four parameters
** are interpreted in the same way as the first 4 parameters to
@@ -17508,44 +17645,55 @@ struct FuncDestructor {
** parameter.
*/
#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \
- {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
+ {nArg, SQLITE_FUNC_BUILTIN|\
+ SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
#define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \
- {nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
+ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
#define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \
- {nArg, SQLITE_UTF8|SQLITE_DIRECTONLY|SQLITE_FUNC_UNSAFE, \
+ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_DIRECTONLY|SQLITE_FUNC_UNSAFE, \
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
#define MFUNCTION(zName, nArg, xPtr, xFunc) \
- {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \
+ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \
xPtr, 0, xFunc, 0, 0, 0, #zName, {0} }
+#define JFUNCTION(zName, nArg, iArg, xFunc) \
+ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_DETERMINISTIC|\
+ SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
#define INLINE_FUNC(zName, nArg, iArg, mFlags) \
- {nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \
+ {nArg, SQLITE_FUNC_BUILTIN|\
+ SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \
SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} }
#define TEST_FUNC(zName, nArg, iArg, mFlags) \
- {nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \
+ {nArg, SQLITE_FUNC_BUILTIN|\
+ SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \
SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \
SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} }
#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \
- {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \
+ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \
0, 0, xFunc, 0, 0, 0, #zName, {0} }
#define PURE_DATE(zName, nArg, iArg, bNC, xFunc) \
- {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \
+ {nArg, SQLITE_FUNC_BUILTIN|\
+ SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \
(void*)&sqlite3Config, 0, xFunc, 0, 0, 0, #zName, {0} }
#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \
- {nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\
+ {nArg, SQLITE_FUNC_BUILTIN|\
+ SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \
- {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
+ {nArg, SQLITE_FUNC_BUILTIN|\
+ SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
pArg, 0, xFunc, 0, 0, 0, #zName, }
#define LIKEFUNC(zName, nArg, arg, flags) \
- {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \
+ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \
(void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} }
#define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \
- {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \
+ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \
SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,xInverse,#zName, {0}}
#define INTERNAL_FUNCTION(zName, nArg, xFunc) \
- {nArg, SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \
+ {nArg, SQLITE_FUNC_BUILTIN|\
+ SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \
0, 0, xFunc, 0, 0, 0, #zName, {0} }
@@ -17601,18 +17749,42 @@ struct Module {
** or equal to the table column index. It is
** equal if and only if there are no VIRTUAL
** columns to the left.
+**
+** Notes on zCnName:
+** The zCnName field stores the name of the column, the datatype of the
+** column, and the collating sequence for the column, in that order, all in
+** a single allocation. Each string is 0x00 terminated. The datatype
+** is only included if the COLFLAG_HASTYPE bit of colFlags is set and the
+** collating sequence name is only included if the COLFLAG_HASCOLL bit is
+** set.
*/
struct Column {
- char *zName; /* Name of this column, \000, then the type */
- Expr *pDflt; /* Default value or GENERATED ALWAYS AS value */
- char *zColl; /* Collating sequence. If NULL, use the default */
- u8 notNull; /* An OE_ code for handling a NOT NULL constraint */
- char affinity; /* One of the SQLITE_AFF_... values */
- u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */
- u8 hName; /* Column name hash for faster lookup */
- u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */
+ char *zCnName; /* Name of this column */
+ unsigned notNull :4; /* An OE_ code for handling a NOT NULL constraint */
+ unsigned eCType :4; /* One of the standard types */
+ char affinity; /* One of the SQLITE_AFF_... values */
+ u8 szEst; /* Est size of value in this column. sizeof(INT)==1 */
+ u8 hName; /* Column name hash for faster lookup */
+ u16 iDflt; /* 1-based index of DEFAULT. 0 means "none" */
+ u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */
};
+/* Allowed values for Column.eCType.
+**
+** Values must match entries in the global constant arrays
+** sqlite3StdTypeLen[] and sqlite3StdType[]. Each value is one more
+** than the offset into these arrays for the corresponding name.
+** Adjust the SQLITE_N_STDTYPE value if adding or removing entries.
+*/
+#define COLTYPE_CUSTOM 0 /* Type appended to zName */
+#define COLTYPE_ANY 1
+#define COLTYPE_BLOB 2
+#define COLTYPE_INT 3
+#define COLTYPE_INTEGER 4
+#define COLTYPE_REAL 5
+#define COLTYPE_TEXT 6
+#define SQLITE_N_STDTYPE 6 /* Number of standard types */
+
/* Allowed values for Column.colFlags.
**
** Constraints:
@@ -17629,6 +17801,8 @@ struct Column {
#define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */
#define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */
#define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */
+#define COLFLAG_HASCOLL 0x0200 /* Has collating sequence name in zCnName */
+#define COLFLAG_NOEXPAND 0x0400 /* Omit this column when expanding "*" */
#define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */
#define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */
@@ -17676,6 +17850,7 @@ struct CollSeq {
#define SQLITE_AFF_NUMERIC 0x43 /* 'C' */
#define SQLITE_AFF_INTEGER 0x44 /* 'D' */
#define SQLITE_AFF_REAL 0x45 /* 'E' */
+#define SQLITE_AFF_FLEXNUM 0x46 /* 'F' */
#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC)
@@ -17746,6 +17921,7 @@ struct VTable {
sqlite3_vtab *pVtab; /* Pointer to vtab instance */
int nRef; /* Number of pointers to this structure */
u8 bConstraint; /* True if constraints are supported */
+ u8 bAllSchemas; /* True if might use any attached schema */
u8 eVtabRisk; /* Riskiness of allowing hacker access */
int iSavepoint; /* Depth of the SAVEPOINT stack */
VTable *pNext; /* Next in linked list (see above) */
@@ -17758,15 +17934,13 @@ struct VTable {
#define SQLITE_VTABRISK_High 2
/*
-** The schema for each SQL table and view is represented in memory
-** by an instance of the following structure.
+** The schema for each SQL table, virtual table, and view is represented
+** in memory by an instance of the following structure.
*/
struct Table {
char *zName; /* Name of the table or view */
Column *aCol; /* Information about each column */
Index *pIndex; /* List of SQL indexes on this table. */
- Select *pSelect; /* NULL for tables. Points to definition if a view. */
- FKey *pFKey; /* Linked list of all foreign keys in this table */
char *zColAff; /* String defining the affinity of each column */
ExprList *pCheck; /* All CHECK constraints */
/* ... also used as column name list in a VIEW */
@@ -17782,15 +17956,24 @@ struct Table {
LogEst costMult; /* Cost multiplier for using this table */
#endif
u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */
-#ifndef SQLITE_OMIT_ALTERTABLE
- int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */
-#endif
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- int nModuleArg; /* Number of arguments to the module */
- char **azModuleArg; /* 0: module 1: schema 2: vtab name 3...: args */
- VTable *pVTable; /* List of VTable objects. */
-#endif
- Trigger *pTrigger; /* List of triggers stored in pSchema */
+ u8 eTabType; /* 0: normal, 1: virtual, 2: view */
+ union {
+ struct { /* Used by ordinary tables: */
+ int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */
+ FKey *pFKey; /* Linked list of all foreign keys in this table */
+ ExprList *pDfltList; /* DEFAULT clauses on various columns.
+ ** Or the AS clause for generated columns. */
+ } tab;
+ struct { /* Used by views: */
+ Select *pSelect; /* View definition */
+ } view;
+ struct { /* Used by virtual tables only: */
+ int nArg; /* Number of arguments to the module */
+ char **azArg; /* 0: module 1: schema 2: vtab name 3...: args */
+ VTable *p; /* List of VTable objects. */
+ } vtab;
+ } u;
+ Trigger *pTrigger; /* List of triggers on this object */
Schema *pSchema; /* Schema that contains this table */
};
@@ -17809,24 +17992,35 @@ struct Table {
** TF_HasStored == COLFLAG_STORED
** TF_HasHidden == COLFLAG_HIDDEN
*/
-#define TF_Readonly 0x0001 /* Read-only system table */
-#define TF_HasHidden 0x0002 /* Has one or more hidden columns */
-#define TF_HasPrimaryKey 0x0004 /* Table has a primary key */
-#define TF_Autoincrement 0x0008 /* Integer primary key is autoincrement */
-#define TF_HasStat1 0x0010 /* nRowLogEst set from sqlite_stat1 */
-#define TF_HasVirtual 0x0020 /* Has one or more VIRTUAL columns */
-#define TF_HasStored 0x0040 /* Has one or more STORED columns */
-#define TF_HasGenerated 0x0060 /* Combo: HasVirtual + HasStored */
-#define TF_WithoutRowid 0x0080 /* No rowid. PRIMARY KEY is the key */
-#define TF_StatsUsed 0x0100 /* Query planner decisions affected by
+#define TF_Readonly 0x00000001 /* Read-only system table */
+#define TF_HasHidden 0x00000002 /* Has one or more hidden columns */
+#define TF_HasPrimaryKey 0x00000004 /* Table has a primary key */
+#define TF_Autoincrement 0x00000008 /* Integer primary key is autoincrement */
+#define TF_HasStat1 0x00000010 /* nRowLogEst set from sqlite_stat1 */
+#define TF_HasVirtual 0x00000020 /* Has one or more VIRTUAL columns */
+#define TF_HasStored 0x00000040 /* Has one or more STORED columns */
+#define TF_HasGenerated 0x00000060 /* Combo: HasVirtual + HasStored */
+#define TF_WithoutRowid 0x00000080 /* No rowid. PRIMARY KEY is the key */
+#define TF_StatsUsed 0x00000100 /* Query planner decisions affected by
** Index.aiRowLogEst[] values */
-#define TF_NoVisibleRowid 0x0200 /* No user-visible "rowid" column */
-#define TF_OOOHidden 0x0400 /* Out-of-Order hidden columns */
-#define TF_HasNotNull 0x0800 /* Contains NOT NULL constraints */
-#define TF_Shadow 0x1000 /* True for a shadow table */
-#define TF_HasStat4 0x2000 /* STAT4 info available for this table */
-#define TF_Ephemeral 0x4000 /* An ephemeral table */
-#define TF_Eponymous 0x8000 /* An eponymous virtual table */
+#define TF_NoVisibleRowid 0x00000200 /* No user-visible "rowid" column */
+#define TF_OOOHidden 0x00000400 /* Out-of-Order hidden columns */
+#define TF_HasNotNull 0x00000800 /* Contains NOT NULL constraints */
+#define TF_Shadow 0x00001000 /* True for a shadow table */
+#define TF_HasStat4 0x00002000 /* STAT4 info available for this table */
+#define TF_Ephemeral 0x00004000 /* An ephemeral table */
+#define TF_Eponymous 0x00008000 /* An eponymous virtual table */
+#define TF_Strict 0x00010000 /* STRICT mode */
+
+/*
+** Allowed values for Table.eTabType
+*/
+#define TABTYP_NORM 0 /* Ordinary table */
+#define TABTYP_VTAB 1 /* Virtual table */
+#define TABTYP_VIEW 2 /* A view */
+
+#define IsView(X) ((X)->eTabType==TABTYP_VIEW)
+#define IsOrdinaryTable(X) ((X)->eTabType==TABTYP_NORM)
/*
** Test to see whether or not a table is a virtual table. This is
@@ -17834,9 +18028,9 @@ struct Table {
** table support is omitted from the build.
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
-# define IsVirtual(X) ((X)->nModuleArg)
+# define IsVirtual(X) ((X)->eTabType==TABTYP_VTAB)
# define ExprIsVtab(X) \
- ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->nModuleArg)
+ ((X)->op==TK_COLUMN && (X)->y.pTab->eTabType==TABTYP_VTAB)
#else
# define IsVirtual(X) 0
# define ExprIsVtab(X) 0
@@ -18017,6 +18211,11 @@ struct KeyInfo {
struct UnpackedRecord {
KeyInfo *pKeyInfo; /* Collation and sort-order information */
Mem *aMem; /* Values */
+ union {
+ char *z; /* Cache of aMem[0].z for vdbeRecordCompareString() */
+ i64 i; /* Cache of aMem[0].u.i for vdbeRecordCompareInt() */
+ } u;
+ int n; /* Cache of aMem[0].n used by vdbeRecordCompareString() */
u16 nField; /* Number of entries in apMem[] */
i8 default_rc; /* Comparison result if keys are equal */
u8 errCode; /* Error detected by xRecordCompare (CORRUPT or NOMEM) */
@@ -18048,10 +18247,22 @@ struct UnpackedRecord {
** The Index.onError field determines whether or not the indexed columns
** must be unique and what to do if they are not. When Index.onError=OE_None,
** it means this is not a unique index. Otherwise it is a unique index
-** and the value of Index.onError indicate the which conflict resolution
-** algorithm to employ whenever an attempt is made to insert a non-unique
+** and the value of Index.onError indicates which conflict resolution
+** algorithm to employ when an attempt is made to insert a non-unique
** element.
**
+** The colNotIdxed bitmask is used in combination with SrcItem.colUsed
+** for a fast test to see if an index can serve as a covering index.
+** colNotIdxed has a 1 bit for every column of the original table that
+** is *not* available in the index. Thus the expression
+** "colUsed & colNotIdxed" will be non-zero if the index is not a
+** covering index. The most significant bit of of colNotIdxed will always
+** be true (note-20221022-a). If a column beyond the 63rd column of the
+** table is used, the "colUsed & colNotIdxed" test will always be non-zero
+** and we have to assume either that the index is not covering, or use
+** an alternative (slower) algorithm to determine whether or not
+** the index is covering.
+**
** While parsing a CREATE TABLE or CREATE INDEX statement in order to
** generate VDBE code (as opposed to parsing one read from an sqlite_schema
** table as part of parsing an existing database schema), transient instances
@@ -18087,15 +18298,18 @@ struct Index {
unsigned bNoQuery:1; /* Do not use this index to optimize queries */
unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */
unsigned bHasVCol:1; /* Index references one or more VIRTUAL columns */
+ unsigned bHasExpr:1; /* Index contains an expression, either a literal
+ ** expression, or a reference to a VIRTUAL column */
#ifdef SQLITE_ENABLE_STAT4
int nSample; /* Number of elements in aSample[] */
+ int mxSample; /* Number of slots allocated to aSample[] */
int nSampleCol; /* Size of IndexSample.anEq[] and so on */
tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */
IndexSample *aSample; /* Samples of the left-most key */
tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this index */
tRowcnt nRowEst0; /* Non-logarithmic number of rows in the index */
#endif
- Bitmask colNotIdxed; /* 0 for unindexed columns in pTab */
+ Bitmask colNotIdxed; /* Unindexed columns in pTab */
};
/*
@@ -18170,16 +18384,15 @@ struct AggInfo {
** from source tables rather than from accumulators */
u8 useSortingIdx; /* In direct mode, reference the sorting index rather
** than the source table */
+ u16 nSortingColumn; /* Number of columns in the sorting index */
int sortingIdx; /* Cursor number of the sorting index */
int sortingIdxPTab; /* Cursor number of pseudo-table */
- int nSortingColumn; /* Number of columns in the sorting index */
- int mnReg, mxReg; /* Range of registers allocated for aCol and aFunc */
+ int iFirstReg; /* First register in range for aCol[] and aFunc[] */
ExprList *pGroupBy; /* The group by clause */
struct AggInfo_col { /* For each column used in source tables */
Table *pTab; /* Source table */
Expr *pCExpr; /* The original expression */
int iTable; /* Cursor number of the source table */
- int iMem; /* Memory location that acts as accumulator */
i16 iColumn; /* Column number within the source table */
i16 iSorterColumn; /* Column number in the sorting index */
} *aCol;
@@ -18190,15 +18403,28 @@ struct AggInfo {
struct AggInfo_func { /* For each aggregate function */
Expr *pFExpr; /* Expression encoding the function */
FuncDef *pFunc; /* The aggregate function implementation */
- int iMem; /* Memory location that acts as accumulator */
int iDistinct; /* Ephemeral table used to enforce DISTINCT */
int iDistAddr; /* Address of OP_OpenEphemeral */
} *aFunc;
int nFunc; /* Number of entries in aFunc[] */
u32 selId; /* Select to which this AggInfo belongs */
+#ifdef SQLITE_DEBUG
+ Select *pSelect; /* SELECT statement that this AggInfo supports */
+#endif
};
/*
+** Macros to compute aCol[] and aFunc[] register numbers.
+**
+** These macros should not be used prior to the call to
+** assignAggregateRegisters() that computes the value of pAggInfo->iFirstReg.
+** The assert()s that are part of this macro verify that constraint.
+*/
+#define AggInfoColumnReg(A,I) (assert((A)->iFirstReg),(A)->iFirstReg+(I))
+#define AggInfoFuncReg(A,I) \
+ (assert((A)->iFirstReg),(A)->iFirstReg+(A)->nColumn+(I))
+
+/*
** The datatype ynVar is a signed integer, either 16-bit or 32-bit.
** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater
** than 32767 we have to make it 32-bit. 16-bit is preferred because
@@ -18225,10 +18451,10 @@ typedef int ynVar;
** tree.
**
** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB,
-** or TK_STRING), then Expr.token contains the text of the SQL literal. If
-** the expression is a variable (TK_VARIABLE), then Expr.token contains the
+** or TK_STRING), then Expr.u.zToken contains the text of the SQL literal. If
+** the expression is a variable (TK_VARIABLE), then Expr.u.zToken contains the
** variable name. Finally, if the expression is an SQL function (TK_FUNCTION),
-** then Expr.token contains the name of the function.
+** then Expr.u.zToken contains the name of the function.
**
** Expr.pRight and Expr.pLeft are the left and right subexpressions of a
** binary operator. Either or both may be NULL.
@@ -18268,7 +18494,7 @@ typedef int ynVar;
** help reduce memory requirements, sometimes an Expr object will be
** truncated. And to reduce the number of memory allocations, sometimes
** two or more Expr objects will be stored in a single memory allocation,
-** together with Expr.zToken strings.
+** together with Expr.u.zToken strings.
**
** If the EP_Reduced and EP_TokenOnly flags are set when
** an Expr object is truncated. When EP_Reduced is set, then all
@@ -18324,7 +18550,10 @@ struct Expr {
** TK_VARIABLE: variable number (always >= 1).
** TK_SELECT_COLUMN: column of the result vector */
i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */
- int iRightJoinTable; /* If EP_FromJoin, the right table of the join */
+ union {
+ int iJoin; /* If EP_OuterON or EP_InnerON, the right table */
+ int iOfst; /* else: start of token from start of statement */
+ } w;
AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */
union {
Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL
@@ -18337,36 +18566,35 @@ struct Expr {
} y;
};
-/*
-** The following are the meanings of bits in the Expr.flags field.
+/* The following are the meanings of bits in the Expr.flags field.
** Value restrictions:
**
** EP_Agg == NC_HasAgg == SF_HasAgg
** EP_Win == NC_HasWin
*/
-#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */
-#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */
-#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */
-#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */
+#define EP_OuterON 0x000001 /* Originates in ON/USING clause of outer join */
+#define EP_InnerON 0x000002 /* Originates in ON/USING of an inner join */
+#define EP_Distinct 0x000004 /* Aggregate function with DISTINCT keyword */
+#define EP_HasFunc 0x000008 /* Contains one or more functions of any kind */
#define EP_Agg 0x000010 /* Contains one or more aggregate functions */
-#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */
-#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */
-#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */
-#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */
-#define EP_Commuted 0x000200 /* Comparison operator has been commuted */
-#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */
-#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */
-#define EP_Skip 0x001000 /* Operator does not contribute to affinity */
-#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */
-#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */
+#define EP_FixedCol 0x000020 /* TK_Column with a known fixed value */
+#define EP_VarSelect 0x000040 /* pSelect is correlated, not constant */
+#define EP_DblQuoted 0x000080 /* token.z was originally in "..." */
+#define EP_InfixFunc 0x000100 /* True for an infix function: LIKE, GLOB, etc */
+#define EP_Collate 0x000200 /* Tree contains a TK_COLLATE operator */
+#define EP_Commuted 0x000400 /* Comparison operator has been commuted */
+#define EP_IntValue 0x000800 /* Integer value contained in u.iValue */
+#define EP_xIsSelect 0x001000 /* x.pSelect is valid (otherwise x.pList is) */
+#define EP_Skip 0x002000 /* Operator does not contribute to affinity */
+#define EP_Reduced 0x004000 /* Expr struct EXPR_REDUCEDSIZE bytes only */
#define EP_Win 0x008000 /* Contains window functions */
-#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */
-#define EP_IfNullRow 0x020000 /* The TK_IF_NULL_ROW opcode */
-#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */
-#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */
-#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */
-#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */
- /* 0x400000 // Available */
+#define EP_TokenOnly 0x010000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */
+ /* 0x020000 // Available for reuse */
+#define EP_IfNullRow 0x040000 /* The TK_IF_NULL_ROW opcode */
+#define EP_Unlikely 0x080000 /* unlikely() or likelihood() function */
+#define EP_ConstFunc 0x100000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */
+#define EP_CanBeNull 0x200000 /* Can be null despite NOT NULL constraint */
+#define EP_Subquery 0x400000 /* Tree contains a TK_SELECT operator */
#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */
#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */
#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */
@@ -18377,23 +18605,31 @@ struct Expr {
#define EP_FromDDL 0x40000000 /* Originates from sqlite_schema */
/* 0x80000000 // Available */
-/*
-** The EP_Propagate mask is a set of properties that automatically propagate
+/* The EP_Propagate mask is a set of properties that automatically propagate
** upwards into parent nodes.
*/
#define EP_Propagate (EP_Collate|EP_Subquery|EP_HasFunc)
-/*
-** These macros can be used to test, set, or clear bits in the
+/* Macros can be used to test, set, or clear bits in the
** Expr.flags field.
*/
#define ExprHasProperty(E,P) (((E)->flags&(P))!=0)
#define ExprHasAllProperty(E,P) (((E)->flags&(P))==(P))
#define ExprSetProperty(E,P) (E)->flags|=(P)
#define ExprClearProperty(E,P) (E)->flags&=~(P)
-#define ExprAlwaysTrue(E) (((E)->flags&(EP_FromJoin|EP_IsTrue))==EP_IsTrue)
-#define ExprAlwaysFalse(E) (((E)->flags&(EP_FromJoin|EP_IsFalse))==EP_IsFalse)
+#define ExprAlwaysTrue(E) (((E)->flags&(EP_OuterON|EP_IsTrue))==EP_IsTrue)
+#define ExprAlwaysFalse(E) (((E)->flags&(EP_OuterON|EP_IsFalse))==EP_IsFalse)
+/* Macros used to ensure that the correct members of unions are accessed
+** in Expr.
+*/
+#define ExprUseUToken(E) (((E)->flags&EP_IntValue)==0)
+#define ExprUseUValue(E) (((E)->flags&EP_IntValue)!=0)
+#define ExprUseXList(E) (((E)->flags&EP_xIsSelect)==0)
+#define ExprUseXSelect(E) (((E)->flags&EP_xIsSelect)!=0)
+#define ExprUseYTab(E) (((E)->flags&(EP_WinFunc|EP_Subrtn))==0)
+#define ExprUseYWin(E) (((E)->flags&EP_WinFunc)!=0)
+#define ExprUseYSub(E) (((E)->flags&EP_Subrtn)!=0)
/* Flags for use with Expr.vvaFlags
*/
@@ -18469,18 +18705,25 @@ struct ExprList {
struct ExprList_item { /* For each expression in the list */
Expr *pExpr; /* The parse tree for this expression */
char *zEName; /* Token associated with this expression */
- u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */
- unsigned eEName :2; /* Meaning of zEName */
- unsigned done :1; /* A flag to indicate when processing is finished */
- unsigned reusable :1; /* Constant expression is reusable */
- unsigned bSorterRef :1; /* Defer evaluation until after sorting */
- unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */
+ struct {
+ u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */
+ unsigned eEName :2; /* Meaning of zEName */
+ unsigned done :1; /* Indicates when processing is finished */
+ unsigned reusable :1; /* Constant expression is reusable */
+ unsigned bSorterRef :1; /* Defer evaluation until after sorting */
+ unsigned bNulls :1; /* True if explicit "NULLS FIRST/LAST" */
+ unsigned bUsed :1; /* This column used in a SF_NestedFrom subquery */
+ unsigned bUsingTerm:1; /* Term from the USING clause of a NestedFrom */
+ unsigned bNoExpand: 1; /* Term is an auxiliary in NestedFrom and should
+ ** not be expanded by "*" in parent queries */
+ } fg;
union {
- struct {
+ struct { /* Used by any ExprList other than Parse.pConsExpr */
u16 iOrderByCol; /* For ORDER BY, column number in result set */
u16 iAlias; /* Index into Parse.aAlias[] for zName */
} x;
- int iConstExprReg; /* Register in which Expr value is cached */
+ int iConstExprReg; /* Register in which Expr value is cached. Used only
+ ** by Parse.pConstExpr */
} u;
} a[1]; /* One slot for each expression in the list */
};
@@ -18508,16 +18751,43 @@ struct ExprList {
** If "a" is the k-th column of table "t", then IdList.a[0].idx==k.
*/
struct IdList {
+ int nId; /* Number of identifiers on the list */
+ u8 eU4; /* Which element of a.u4 is valid */
struct IdList_item {
char *zName; /* Name of the identifier */
- int idx; /* Index in some Table.aCol[] of a column named zName */
- } *a;
- int nId; /* Number of identifiers on the list */
+ union {
+ int idx; /* Index in some Table.aCol[] of a column named zName */
+ Expr *pExpr; /* Expr to implement a USING variable -- NOT USED */
+ } u4;
+ } a[1];
};
/*
+** Allowed values for IdList.eType, which determines which value of the a.u4
+** is valid.
+*/
+#define EU4_NONE 0 /* Does not use IdList.a.u4 */
+#define EU4_IDX 1 /* Uses IdList.a.u4.idx */
+#define EU4_EXPR 2 /* Uses IdList.a.u4.pExpr -- NOT CURRENTLY USED */
+
+/*
** The SrcItem object represents a single term in the FROM clause of a query.
** The SrcList object is mostly an array of SrcItems.
+**
+** The jointype starts out showing the join type between the current table
+** and the next table on the list. The parser builds the list this way.
+** But sqlite3SrcListShiftJoinType() later shifts the jointypes so that each
+** jointype expresses the join between the table and the previous table.
+**
+** In the colUsed field, the high-order bit (bit 63) is set if the table
+** contains more than 63 columns and the 64-th or later column is used.
+**
+** Union member validity:
+**
+** u1.zIndexedBy fg.isIndexedBy && !fg.isTabFunc
+** u1.pFuncArg fg.isTabFunc && !fg.isIndexedBy
+** u2.pIBIndex fg.isIndexedBy && !fg.isCte
+** u2.pCteUse fg.isCte && !fg.isIndexedBy
*/
struct SrcItem {
Schema *pSchema; /* Schema to which this item is fixed */
@@ -18535,44 +18805,48 @@ struct SrcItem {
unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */
unsigned isTabFunc :1; /* True if table-valued-function syntax */
unsigned isCorrelated :1; /* True if sub-query is correlated */
+ unsigned isMaterialized:1; /* This is a materialized view */
unsigned viaCoroutine :1; /* Implemented as a co-routine */
unsigned isRecursive :1; /* True for recursive reference in WITH */
unsigned fromDDL :1; /* Comes from sqlite_schema */
unsigned isCte :1; /* This is a CTE */
unsigned notCte :1; /* This item may not match a CTE */
+ unsigned isUsing :1; /* u3.pUsing is valid */
+ unsigned isOn :1; /* u3.pOn was once valid and non-NULL */
+ unsigned isSynthUsing :1; /* u3.pUsing is synthensized from NATURAL */
+ unsigned isNestedFrom :1; /* pSelect is a SF_NestedFrom subquery */
} fg;
int iCursor; /* The VDBE cursor number used to access this table */
- Expr *pOn; /* The ON clause of a join */
- IdList *pUsing; /* The USING clause of a join */
- Bitmask colUsed; /* Bit N (1<<N) set if column N of pTab is used */
+ union {
+ Expr *pOn; /* fg.isUsing==0 => The ON clause of a join */
+ IdList *pUsing; /* fg.isUsing==1 => The USING clause of a join */
+ } u3;
+ Bitmask colUsed; /* Bit N set if column N used. Details above for N>62 */
union {
char *zIndexedBy; /* Identifier from "INDEXED BY <zIndex>" clause */
ExprList *pFuncArg; /* Arguments to table-valued-function */
} u1;
union {
Index *pIBIndex; /* Index structure corresponding to u1.zIndexedBy */
- CteUse *pCteUse; /* CTE Usage info info fg.isCte is true */
+ CteUse *pCteUse; /* CTE Usage info when fg.isCte is true */
} u2;
};
/*
-** The following structure describes the FROM clause of a SELECT statement.
-** Each table or subquery in the FROM clause is a separate element of
-** the SrcList.a[] array.
-**
-** With the addition of multiple database support, the following structure
-** can also be used to describe a particular table such as the table that
-** is modified by an INSERT, DELETE, or UPDATE statement. In standard SQL,
-** such a table must be a simple name: ID. But in SQLite, the table can
-** now be identified by a database name, a dot, then the table name: ID.ID.
-**
-** The jointype starts out showing the join type between the current table
-** and the next table on the list. The parser builds the list this way.
-** But sqlite3SrcListShiftJoinType() later shifts the jointypes so that each
-** jointype expresses the join between the table and the previous table.
+** The OnOrUsing object represents either an ON clause or a USING clause.
+** It can never be both at the same time, but it can be neither.
+*/
+struct OnOrUsing {
+ Expr *pOn; /* The ON clause of a join */
+ IdList *pUsing; /* The USING clause of a join */
+};
+
+/*
+** This object represents one or more tables that are the source of
+** content for an SQL statement. For example, a single SrcList object
+** is used to hold the FROM clause of a SELECT statement. SrcList also
+** represents the target tables for DELETE, INSERT, and UPDATE statements.
**
-** In the colUsed field, the high-order bit (bit 63) is set if the table
-** contains more than 63 columns and the 64-th or later column is used.
*/
struct SrcList {
int nSrc; /* Number of tables or subqueries in the FROM clause */
@@ -18583,14 +18857,15 @@ struct SrcList {
/*
** Permitted values of the SrcList.a.jointype field
*/
-#define JT_INNER 0x0001 /* Any kind of inner or cross join */
-#define JT_CROSS 0x0002 /* Explicit use of the CROSS keyword */
-#define JT_NATURAL 0x0004 /* True for a "natural" join */
-#define JT_LEFT 0x0008 /* Left outer join */
-#define JT_RIGHT 0x0010 /* Right outer join */
-#define JT_OUTER 0x0020 /* The "OUTER" keyword is present */
-#define JT_ERROR 0x0040 /* unknown or unsupported join type */
-
+#define JT_INNER 0x01 /* Any kind of inner or cross join */
+#define JT_CROSS 0x02 /* Explicit use of the CROSS keyword */
+#define JT_NATURAL 0x04 /* True for a "natural" join */
+#define JT_LEFT 0x08 /* Left outer join */
+#define JT_RIGHT 0x10 /* Right outer join */
+#define JT_OUTER 0x20 /* The "OUTER" keyword is present */
+#define JT_LTORJ 0x40 /* One of the LEFT operands of a RIGHT JOIN
+ ** Mnemonic: Left Table Of Right Join */
+#define JT_ERROR 0x80 /* unknown or unsupported join type */
/*
** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin()
@@ -18613,7 +18888,7 @@ struct SrcList {
#define WHERE_SORTBYGROUP 0x0200 /* Support sqlite3WhereIsSorted() */
#define WHERE_AGG_DISTINCT 0x0400 /* Query is "SELECT agg(DISTINCT ...)" */
#define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */
- /* 0x1000 not currently used */
+#define WHERE_RIGHT_JOIN 0x1000 /* Processing a RIGHT JOIN */
/* 0x2000 not currently used */
#define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */
/* 0x8000 not currently used */
@@ -18666,31 +18941,33 @@ struct NameContext {
** Allowed values for the NameContext, ncFlags field.
**
** Value constraints (all checked via assert()):
-** NC_HasAgg == SF_HasAgg == EP_Agg
-** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX
+** NC_HasAgg == SF_HasAgg == EP_Agg
+** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX
+** NC_OrderAgg == SF_OrderByReqd == SQLITE_FUNC_ANYORDER
** NC_HasWin == EP_Win
**
*/
-#define NC_AllowAgg 0x00001 /* Aggregate functions are allowed here */
-#define NC_PartIdx 0x00002 /* True if resolving a partial index WHERE */
-#define NC_IsCheck 0x00004 /* True if resolving a CHECK constraint */
-#define NC_GenCol 0x00008 /* True for a GENERATED ALWAYS AS clause */
-#define NC_HasAgg 0x00010 /* One or more aggregate functions seen */
-#define NC_IdxExpr 0x00020 /* True if resolving columns of CREATE INDEX */
-#define NC_SelfRef 0x0002e /* Combo: PartIdx, isCheck, GenCol, and IdxExpr */
-#define NC_VarSelect 0x00040 /* A correlated subquery has been seen */
-#define NC_UEList 0x00080 /* True if uNC.pEList is used */
-#define NC_UAggInfo 0x00100 /* True if uNC.pAggInfo is used */
-#define NC_UUpsert 0x00200 /* True if uNC.pUpsert is used */
-#define NC_UBaseReg 0x00400 /* True if uNC.iBaseReg is used */
-#define NC_MinMaxAgg 0x01000 /* min/max aggregates seen. See note above */
-#define NC_Complex 0x02000 /* True if a function or subquery seen */
-#define NC_AllowWin 0x04000 /* Window functions are allowed here */
-#define NC_HasWin 0x08000 /* One or more window functions seen */
-#define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */
-#define NC_InAggFunc 0x20000 /* True if analyzing arguments to an agg func */
-#define NC_FromDDL 0x40000 /* SQL text comes from sqlite_schema */
-#define NC_NoSelect 0x80000 /* Do not descend into sub-selects */
+#define NC_AllowAgg 0x000001 /* Aggregate functions are allowed here */
+#define NC_PartIdx 0x000002 /* True if resolving a partial index WHERE */
+#define NC_IsCheck 0x000004 /* True if resolving a CHECK constraint */
+#define NC_GenCol 0x000008 /* True for a GENERATED ALWAYS AS clause */
+#define NC_HasAgg 0x000010 /* One or more aggregate functions seen */
+#define NC_IdxExpr 0x000020 /* True if resolving columns of CREATE INDEX */
+#define NC_SelfRef 0x00002e /* Combo: PartIdx, isCheck, GenCol, and IdxExpr */
+#define NC_Subquery 0x000040 /* A subquery has been seen */
+#define NC_UEList 0x000080 /* True if uNC.pEList is used */
+#define NC_UAggInfo 0x000100 /* True if uNC.pAggInfo is used */
+#define NC_UUpsert 0x000200 /* True if uNC.pUpsert is used */
+#define NC_UBaseReg 0x000400 /* True if uNC.iBaseReg is used */
+#define NC_MinMaxAgg 0x001000 /* min/max aggregates seen. See note above */
+#define NC_Complex 0x002000 /* True if a function or subquery seen */
+#define NC_AllowWin 0x004000 /* Window functions are allowed here */
+#define NC_HasWin 0x008000 /* One or more window functions seen */
+#define NC_IsDDL 0x010000 /* Resolving names in a CREATE statement */
+#define NC_InAggFunc 0x020000 /* True if analyzing arguments to an agg func */
+#define NC_FromDDL 0x040000 /* SQL text comes from sqlite_schema */
+#define NC_NoSelect 0x080000 /* Do not descend into sub-selects */
+#define NC_OrderAgg 0x8000000 /* Has an aggregate other than count/min/max */
/*
** An instance of the following object describes a single ON CONFLICT
@@ -18773,9 +19050,10 @@ struct Select {
** "Select Flag".
**
** Value constraints (all checked via assert())
-** SF_HasAgg == NC_HasAgg
-** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX
-** SF_FixedLimit == WHERE_USE_LIMIT
+** SF_HasAgg == NC_HasAgg
+** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX
+** SF_OrderByReqd == NC_OrderAgg == SQLITE_FUNC_ANYORDER
+** SF_FixedLimit == WHERE_USE_LIMIT
*/
#define SF_Distinct 0x0000001 /* Output should be DISTINCT */
#define SF_All 0x0000002 /* Includes the ALL keyword */
@@ -18800,10 +19078,15 @@ struct Select {
#define SF_WinRewrite 0x0100000 /* Window function rewrite accomplished */
#define SF_View 0x0200000 /* SELECT statement is a view */
#define SF_NoopOrderBy 0x0400000 /* ORDER BY is ignored for this query */
-#define SF_UpdateFrom 0x0800000 /* Statement is an UPDATE...FROM */
+#define SF_UFSrcCheck 0x0800000 /* Check pSrc as required by UPDATE...FROM */
#define SF_PushDown 0x1000000 /* SELECT has be modified by push-down opt */
#define SF_MultiPart 0x2000000 /* Has multiple incompatible PARTITIONs */
#define SF_CopyCte 0x4000000 /* SELECT statement is a copy of a CTE */
+#define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be omitted */
+#define SF_UpdateFrom 0x10000000 /* Query originates with UPDATE FROM */
+
+/* True if S exists and has SF_NestedFrom */
+#define IsNestedFrom(S) ((S)!=0 && ((S)->selFlags&SF_NestedFrom)!=0)
/*
** The results of a SELECT can be distributed in several ways, as defined
@@ -18909,7 +19192,7 @@ struct SelectDest {
int iSDParm2; /* A second parameter for the eDest disposal method */
int iSdst; /* Base register where results are written */
int nSdst; /* Number of registers allocated */
- char *zAffSdst; /* Affinity used when eDest==SRT_Set */
+ char *zAffSdst; /* Affinity used for SRT_Set */
ExprList *pOrderBy; /* Key columns for SRT_Queue and SRT_DistQueue */
};
@@ -18968,11 +19251,34 @@ struct TriggerPrg {
#else
typedef unsigned int yDbMask;
# define DbMaskTest(M,I) (((M)&(((yDbMask)1)<<(I)))!=0)
-# define DbMaskZero(M) (M)=0
-# define DbMaskSet(M,I) (M)|=(((yDbMask)1)<<(I))
-# define DbMaskAllZero(M) (M)==0
-# define DbMaskNonZero(M) (M)!=0
+# define DbMaskZero(M) ((M)=0)
+# define DbMaskSet(M,I) ((M)|=(((yDbMask)1)<<(I)))
+# define DbMaskAllZero(M) ((M)==0)
+# define DbMaskNonZero(M) ((M)!=0)
+#endif
+
+/*
+** For each index X that has as one of its arguments either an expression
+** or the name of a virtual generated column, and if X is in scope such that
+** the value of the expression can simply be read from the index, then
+** there is an instance of this object on the Parse.pIdxExpr list.
+**
+** During code generation, while generating code to evaluate expressions,
+** this list is consulted and if a matching expression is found, the value
+** is read from the index rather than being recomputed.
+*/
+struct IndexedExpr {
+ Expr *pExpr; /* The expression contained in the index */
+ int iDataCur; /* The data cursor associated with the index */
+ int iIdxCur; /* The index cursor */
+ int iIdxCol; /* The index column that contains value of pExpr */
+ u8 bMaybeNullRow; /* True if we need an OP_IfNullRow check */
+ u8 aff; /* Affinity of the pExpr expression */
+ IndexedExpr *pIENext; /* Next in a list of all indexed expressions */
+#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
+ const char *zIdxName; /* Name of index, used only for bytecode comments */
#endif
+};
/*
** An instance of the ParseCleanup object specifies an operation that
@@ -19015,10 +19321,14 @@ struct Parse {
u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */
u8 okConstFactor; /* OK to factor out constants */
u8 disableLookaside; /* Number of times lookaside has been disabled */
- u8 disableVtab; /* Disable all virtual tables for this parse */
+ u8 prepFlags; /* SQLITE_PREPARE_* flags */
+ u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */
#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */
#endif
+#ifdef SQLITE_DEBUG
+ u8 ifNotExists; /* Might be true if IF NOT EXISTS. Assert()s only */
+#endif
int nRangeReg; /* Size of the temporary register block */
int iRangeReg; /* First register in temporary register block */
int nErr; /* Number of errors seen */
@@ -19031,6 +19341,7 @@ struct Parse {
int nLabelAlloc; /* Number of slots in aLabel */
int *aLabel; /* Space to hold the labels */
ExprList *pConstExpr;/* Constant expressions */
+ IndexedExpr *pIdxEpr;/* List of expressions used by active indexes */
Token constraintName;/* Name of the constraint currently being parsed */
yDbMask writeMask; /* Start a write transaction on these databases */
yDbMask cookieMask; /* Bitmask of schema verified databases */
@@ -19045,7 +19356,8 @@ struct Parse {
AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */
Parse *pToplevel; /* Parse structure for main program (or NULL) */
Table *pTriggerTab; /* Table triggers are being coded for */
- Parse *pParentParse; /* Parent parser if this parser is nested */
+ TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */
+ ParseCleanup *pCleanup; /* List of cleanup operations to run after parse */
union {
int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */
Returning *pReturning; /* The RETURNING clause */
@@ -19053,6 +19365,9 @@ struct Parse {
u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */
u32 oldmask; /* Mask of old.* columns referenced */
u32 newmask; /* Mask of new.* columns referenced */
+#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
+ u32 nProgressSteps; /* xProgress steps taken during sqlite3_prepare() */
+#endif
u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */
u8 bReturning; /* Coding a RETURNING trigger */
u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */
@@ -19066,6 +19381,7 @@ struct Parse {
**************************************************************************/
int aTempReg[8]; /* Holding area for temporary registers */
+ Parse *pOuterParse; /* Outer Parse object when nested */
Token sNameToken; /* Token with unqualified schema object name */
/************************************************************************
@@ -19100,14 +19416,14 @@ struct Parse {
Token sArg; /* Complete text of a module argument */
Table **apVtabLock; /* Pointer to virtual tables needing locking */
#endif
- TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */
With *pWith; /* Current WITH clause, or NULL */
- ParseCleanup *pCleanup; /* List of cleanup operations to run after parse */
#ifndef SQLITE_OMIT_ALTERTABLE
RenameToken *pRename; /* Tokens subject to renaming by ALTER TABLE */
#endif
};
+/* Allowed values for Parse.eParseMode
+*/
#define PARSE_MODE_NORMAL 0
#define PARSE_MODE_DECLARE_VTAB 1
#define PARSE_MODE_RENAME 2
@@ -19116,7 +19432,8 @@ struct Parse {
/*
** Sizes and pointers of various parts of the Parse object.
*/
-#define PARSE_HDR_SZ offsetof(Parse,aTempReg) /* Recursive part w/o aColCache*/
+#define PARSE_HDR(X) (((char*)(X))+offsetof(Parse,zErrMsg))
+#define PARSE_HDR_SZ (offsetof(Parse,aTempReg)-offsetof(Parse,zErrMsg)) /* Recursive part w/o aColCache*/
#define PARSE_RECURSE_SZ offsetof(Parse,sLastToken) /* Recursive part */
#define PARSE_TAIL_SZ (sizeof(Parse)-PARSE_RECURSE_SZ) /* Non-recursive part */
#define PARSE_TAIL(X) (((char*)(X))+PARSE_RECURSE_SZ) /* Pointer to tail */
@@ -19185,20 +19502,20 @@ struct AuthContext {
#define OPFLAG_PREFORMAT 0x80 /* OP_Insert uses preformatted cell */
/*
- * Each trigger present in the database schema is stored as an instance of
- * struct Trigger.
- *
- * Pointers to instances of struct Trigger are stored in two ways.
- * 1. In the "trigHash" hash table (part of the sqlite3* that represents the
- * database). This allows Trigger structures to be retrieved by name.
- * 2. All triggers associated with a single table form a linked list, using the
- * pNext member of struct Trigger. A pointer to the first element of the
- * linked list is stored as the "pTrigger" member of the associated
- * struct Table.
- *
- * The "step_list" member points to the first element of a linked list
- * containing the SQL statements specified as the trigger program.
- */
+** Each trigger present in the database schema is stored as an instance of
+** struct Trigger.
+**
+** Pointers to instances of struct Trigger are stored in two ways.
+** 1. In the "trigHash" hash table (part of the sqlite3* that represents the
+** database). This allows Trigger structures to be retrieved by name.
+** 2. All triggers associated with a single table form a linked list, using the
+** pNext member of struct Trigger. A pointer to the first element of the
+** linked list is stored as the "pTrigger" member of the associated
+** struct Table.
+**
+** The "step_list" member points to the first element of a linked list
+** containing the SQL statements specified as the trigger program.
+*/
struct Trigger {
char *zName; /* The name of the trigger */
char *table; /* The table or view to which the trigger applies */
@@ -19225,43 +19542,48 @@ struct Trigger {
#define TRIGGER_AFTER 2
/*
- * An instance of struct TriggerStep is used to store a single SQL statement
- * that is a part of a trigger-program.
- *
- * Instances of struct TriggerStep are stored in a singly linked list (linked
- * using the "pNext" member) referenced by the "step_list" member of the
- * associated struct Trigger instance. The first element of the linked list is
- * the first step of the trigger-program.
- *
- * The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or
- * "SELECT" statement. The meanings of the other members is determined by the
- * value of "op" as follows:
- *
- * (op == TK_INSERT)
- * orconf -> stores the ON CONFLICT algorithm
- * pSelect -> If this is an INSERT INTO ... SELECT ... statement, then
- * this stores a pointer to the SELECT statement. Otherwise NULL.
- * zTarget -> Dequoted name of the table to insert into.
- * pExprList -> If this is an INSERT INTO ... VALUES ... statement, then
- * this stores values to be inserted. Otherwise NULL.
- * pIdList -> If this is an INSERT INTO ... (<column-names>) VALUES ...
- * statement, then this stores the column-names to be
- * inserted into.
- *
- * (op == TK_DELETE)
- * zTarget -> Dequoted name of the table to delete from.
- * pWhere -> The WHERE clause of the DELETE statement if one is specified.
- * Otherwise NULL.
- *
- * (op == TK_UPDATE)
- * zTarget -> Dequoted name of the table to update.
- * pWhere -> The WHERE clause of the UPDATE statement if one is specified.
- * Otherwise NULL.
- * pExprList -> A list of the columns to update and the expressions to update
- * them to. See sqlite3Update() documentation of "pChanges"
- * argument.
- *
- */
+** An instance of struct TriggerStep is used to store a single SQL statement
+** that is a part of a trigger-program.
+**
+** Instances of struct TriggerStep are stored in a singly linked list (linked
+** using the "pNext" member) referenced by the "step_list" member of the
+** associated struct Trigger instance. The first element of the linked list is
+** the first step of the trigger-program.
+**
+** The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or
+** "SELECT" statement. The meanings of the other members is determined by the
+** value of "op" as follows:
+**
+** (op == TK_INSERT)
+** orconf -> stores the ON CONFLICT algorithm
+** pSelect -> The content to be inserted - either a SELECT statement or
+** a VALUES clause.
+** zTarget -> Dequoted name of the table to insert into.
+** pIdList -> If this is an INSERT INTO ... (<column-names>) VALUES ...
+** statement, then this stores the column-names to be
+** inserted into.
+** pUpsert -> The ON CONFLICT clauses for an Upsert
+**
+** (op == TK_DELETE)
+** zTarget -> Dequoted name of the table to delete from.
+** pWhere -> The WHERE clause of the DELETE statement if one is specified.
+** Otherwise NULL.
+**
+** (op == TK_UPDATE)
+** zTarget -> Dequoted name of the table to update.
+** pWhere -> The WHERE clause of the UPDATE statement if one is specified.
+** Otherwise NULL.
+** pExprList -> A list of the columns to update and the expressions to update
+** them to. See sqlite3Update() documentation of "pChanges"
+** argument.
+**
+** (op == TK_SELECT)
+** pSelect -> The SELECT statement
+**
+** (op == TK_RETURNING)
+** pExprList -> The list of expressions that follow the RETURNING keyword.
+**
+*/
struct TriggerStep {
u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT,
** or TK_RETURNING */
@@ -19329,8 +19651,10 @@ typedef struct {
/*
** Allowed values for mInitFlags
*/
+#define INITFLAG_AlterMask 0x0003 /* Types of ALTER */
#define INITFLAG_AlterRename 0x0001 /* Reparse after a RENAME */
#define INITFLAG_AlterDrop 0x0002 /* Reparse after a DROP COLUMN */
+#define INITFLAG_AlterAdd 0x0003 /* Reparse after an ADD COLUMN */
/* Tuning parameters are set using SQLITE_TESTCTRL_TUNE and are controlled
** on debug-builds of the CLI using ".testctrl tune ID VALUE". Tuning
@@ -19409,6 +19733,7 @@ struct Sqlite3Config {
int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */
#endif
int bLocaltimeFault; /* True to fail localtime() calls */
+ int (*xAltLocaltime)(const void*,void*); /* Alternative localtime() routine */
int iOnceResetThreshold; /* When to reset OP_Once counters */
u32 szSorterRef; /* Min size in bytes to use sorter-refs */
unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */
@@ -19451,19 +19776,20 @@ struct Walker {
int n; /* A counter */
int iCur; /* A cursor number */
SrcList *pSrcList; /* FROM clause */
- struct SrcCount *pSrcCount; /* Counting column references */
struct CCurHint *pCCurHint; /* Used by codeCursorHint() */
+ struct RefSrcList *pRefSrcList; /* sqlite3ReferencesSrcList() */
int *aiCol; /* array of column indexes */
struct IdxCover *pIdxCover; /* Check for index coverage */
- struct IdxExprTrans *pIdxTrans; /* Convert idxed expr to column */
ExprList *pGroupBy; /* GROUP BY clause */
Select *pSelect; /* HAVING to WHERE clause ctx */
struct WindowRewrite *pRewrite; /* Window rewrite context */
struct WhereConst *pConst; /* WHERE clause constants */
struct RenameCtx *pRename; /* RENAME COLUMN context */
struct Table *pTab; /* Table of generated column */
+ struct CoveringIndexCheck *pCovIdxCk; /* Check for covering index */
SrcItem *pSrcItem; /* A single FROM clause item */
- DbFixer *pFix;
+ DbFixer *pFix; /* See sqlite3FixSelect() */
+ Mem *aMem; /* See sqlite3BtreeCursorHint() */
} u;
};
@@ -19613,7 +19939,7 @@ struct Window {
Window **ppThis; /* Pointer to this object in Select.pWin list */
Window *pNextWin; /* Next window function belonging to this SELECT */
Expr *pFilter; /* The FILTER expression */
- FuncDef *pFunc; /* The function */
+ FuncDef *pWFunc; /* The function */
int iEphCsr; /* Partition buffer or Peer buffer */
int regAccum; /* Accumulator */
int regResult; /* Interim result */
@@ -19637,7 +19963,7 @@ SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p);
SQLITE_PRIVATE Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8);
SQLITE_PRIVATE void sqlite3WindowAttach(Parse*, Expr*, Window*);
SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin);
-SQLITE_PRIVATE int sqlite3WindowCompare(Parse*, Window*, Window*, int);
+SQLITE_PRIVATE int sqlite3WindowCompare(const Parse*, const Window*, const Window*, int);
SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse*, Select*);
SQLITE_PRIVATE void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int);
SQLITE_PRIVATE int sqlite3WindowRewrite(Parse*, Select*);
@@ -19733,6 +20059,8 @@ SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno);
# define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08)
# define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)])
# define sqlite3Isquote(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x80)
+# define sqlite3JsonId1(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x42)
+# define sqlite3JsonId2(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x46)
#else
# define sqlite3Toupper(x) toupper((unsigned char)(x))
# define sqlite3Isspace(x) isspace((unsigned char)(x))
@@ -19742,6 +20070,8 @@ SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno);
# define sqlite3Isxdigit(x) isxdigit((unsigned char)(x))
# define sqlite3Tolower(x) tolower((unsigned char)(x))
# define sqlite3Isquote(x) ((x)=='"'||(x)=='\''||(x)=='['||(x)=='`')
+# define sqlite3JsonId1(x) (sqlite3IsIdChar(x)&&(x)<'0')
+# define sqlite3JsonId2(x) sqlite3IsIdChar(x)
#endif
SQLITE_PRIVATE int sqlite3IsIdChar(u8);
@@ -19769,8 +20099,9 @@ SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64);
SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64);
SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*);
SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3*, void*);
-SQLITE_PRIVATE int sqlite3MallocSize(void*);
-SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, void*);
+SQLITE_PRIVATE void sqlite3DbNNFreeNN(sqlite3*, void*);
+SQLITE_PRIVATE int sqlite3MallocSize(const void*);
+SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, const void*);
SQLITE_PRIVATE void *sqlite3PageMalloc(int);
SQLITE_PRIVATE void sqlite3PageFree(void*);
SQLITE_PRIVATE void sqlite3MemSetDefault(void);
@@ -19789,12 +20120,14 @@ SQLITE_PRIVATE int sqlite3HeapNearlyFull(void);
*/
#ifdef SQLITE_USE_ALLOCA
# define sqlite3StackAllocRaw(D,N) alloca(N)
-# define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N)
+# define sqlite3StackAllocRawNN(D,N) alloca(N)
# define sqlite3StackFree(D,P)
+# define sqlite3StackFreeNN(D,P)
#else
# define sqlite3StackAllocRaw(D,N) sqlite3DbMallocRaw(D,N)
-# define sqlite3StackAllocZero(D,N) sqlite3DbMallocZero(D,N)
+# define sqlite3StackAllocRawNN(D,N) sqlite3DbMallocRawNN(D,N)
# define sqlite3StackFree(D,P) sqlite3DbFree(D,P)
+# define sqlite3StackFreeNN(D,P) sqlite3DbFreeNN(D,P)
#endif
/* Do not allow both MEMSYS5 and MEMSYS3 to be defined together. If they
@@ -19868,33 +20201,74 @@ SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*);
#endif
#if defined(SQLITE_DEBUG)
+SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView*, const char *zFormat, ...);
SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8);
SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*);
SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*);
+SQLITE_PRIVATE void sqlite3TreeViewBareIdList(TreeView*, const IdList*, const char*);
+SQLITE_PRIVATE void sqlite3TreeViewIdList(TreeView*, const IdList*, u8, const char*);
+SQLITE_PRIVATE void sqlite3TreeViewColumnList(TreeView*, const Column*, int, u8);
SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView*, const SrcList*);
SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8);
SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8);
+SQLITE_PRIVATE void sqlite3TreeViewUpsert(TreeView*, const Upsert*, u8);
+#if TREETRACE_ENABLED
+SQLITE_PRIVATE void sqlite3TreeViewDelete(const With*, const SrcList*, const Expr*,
+ const ExprList*,const Expr*, const Trigger*);
+SQLITE_PRIVATE void sqlite3TreeViewInsert(const With*, const SrcList*,
+ const IdList*, const Select*, const ExprList*,
+ int, const Upsert*, const Trigger*);
+SQLITE_PRIVATE void sqlite3TreeViewUpdate(const With*, const SrcList*, const ExprList*,
+ const Expr*, int, const ExprList*, const Expr*,
+ const Upsert*, const Trigger*);
+#endif
+#ifndef SQLITE_OMIT_TRIGGER
+SQLITE_PRIVATE void sqlite3TreeViewTriggerStep(TreeView*, const TriggerStep*, u8, u8);
+SQLITE_PRIVATE void sqlite3TreeViewTrigger(TreeView*, const Trigger*, u8, u8);
+#endif
#ifndef SQLITE_OMIT_WINDOWFUNC
SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView*, const Window*, u8);
SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView*, const Window*, u8);
#endif
+SQLITE_PRIVATE void sqlite3ShowExpr(const Expr*);
+SQLITE_PRIVATE void sqlite3ShowExprList(const ExprList*);
+SQLITE_PRIVATE void sqlite3ShowIdList(const IdList*);
+SQLITE_PRIVATE void sqlite3ShowSrcList(const SrcList*);
+SQLITE_PRIVATE void sqlite3ShowSelect(const Select*);
+SQLITE_PRIVATE void sqlite3ShowWith(const With*);
+SQLITE_PRIVATE void sqlite3ShowUpsert(const Upsert*);
+#ifndef SQLITE_OMIT_TRIGGER
+SQLITE_PRIVATE void sqlite3ShowTriggerStep(const TriggerStep*);
+SQLITE_PRIVATE void sqlite3ShowTriggerStepList(const TriggerStep*);
+SQLITE_PRIVATE void sqlite3ShowTrigger(const Trigger*);
+SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger*);
+#endif
+#ifndef SQLITE_OMIT_WINDOWFUNC
+SQLITE_PRIVATE void sqlite3ShowWindow(const Window*);
+SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window*);
+#endif
#endif
-
SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*);
+SQLITE_PRIVATE void sqlite3ProgressCheck(Parse*);
SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...);
SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3*,int);
SQLITE_PRIVATE void sqlite3Dequote(char*);
SQLITE_PRIVATE void sqlite3DequoteExpr(Expr*);
+SQLITE_PRIVATE void sqlite3DequoteToken(Token*);
SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*);
SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int);
-SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **);
+SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*);
SQLITE_PRIVATE void sqlite3FinishCoding(Parse*);
SQLITE_PRIVATE int sqlite3GetTempReg(Parse*);
SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int);
SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int);
SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int);
SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*);
+SQLITE_PRIVATE void sqlite3TouchRegister(Parse*,int);
+#if defined(SQLITE_ENABLE_STAT4) || defined(SQLITE_DEBUG)
+SQLITE_PRIVATE int sqlite3FirstAvailableRegister(Parse*,int);
+#endif
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse*,int,int);
#endif
@@ -19905,16 +20279,17 @@ SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*);
SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse*, Expr*, Select*);
SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*);
SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr*);
-SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*, int);
-SQLITE_PRIVATE void sqlite3ExprFunctionUsable(Parse*,Expr*,FuncDef*);
+SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, const Token*, int);
+SQLITE_PRIVATE void sqlite3ExprFunctionUsable(Parse*,const Expr*,const FuncDef*);
SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32);
SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*);
SQLITE_PRIVATE void sqlite3ExprDeferredDelete(Parse*, Expr*);
SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse*, Expr*);
SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*);
SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*);
+SQLITE_PRIVATE Select *sqlite3ExprListToValues(Parse*, int, ExprList*);
SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int,int);
-SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int);
+SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,const Token*,int);
SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*);
SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*);
SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*);
@@ -19930,10 +20305,14 @@ SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3*);
SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3*,int);
SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3*);
SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*);
+SQLITE_PRIVATE void sqlite3ColumnSetExpr(Parse*,Table*,Column*,Expr*);
+SQLITE_PRIVATE Expr *sqlite3ColumnExpr(Table*,Column*);
+SQLITE_PRIVATE void sqlite3ColumnSetColl(sqlite3*,Column*,const char*zColl);
+SQLITE_PRIVATE const char *sqlite3ColumnColl(Column*);
SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3*,Table*);
SQLITE_PRIVATE void sqlite3GenerateColumnNames(Parse *pParse, Select *pSelect);
SQLITE_PRIVATE int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**);
-SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char);
+SQLITE_PRIVATE void sqlite3SubqueryColumnTypes(Parse*,Table*,Select*,char);
SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*,char);
SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *, int);
SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table*);
@@ -19951,14 +20330,14 @@ SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*);
#else
# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */
#endif
-SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*,Token*);
+SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token,Token);
SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int);
SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int);
SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*, const char*, const char*);
SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*);
SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*);
SQLITE_PRIVATE void sqlite3AddGenerated(Parse*,Expr*,Token*);
-SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*);
+SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u32,Select*);
SQLITE_PRIVATE void sqlite3AddReturning(Parse*,ExprList*);
SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*,
sqlite3_vfs**,char**,char **);
@@ -20022,13 +20401,14 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int);
SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2);
SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*);
SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*,
- Token*, Select*, Expr*, IdList*);
+ Token*, Select*, OnOrUsing*);
SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *);
SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*);
SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, SrcItem *);
-SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList*);
+SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse*,SrcList*);
SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*);
SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*);
+SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3*, OnOrUsing*);
SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*);
SQLITE_PRIVATE Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**);
SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*,
@@ -20039,15 +20419,17 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList
Expr*,ExprList*,u32,Expr*);
SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*);
SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*);
-SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int);
+SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, Trigger*);
SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int);
#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,char*);
#endif
+SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe*,int,const char*);
SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*, ExprList*, Expr*);
SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*,Expr*,int,ExprList*,Expr*,
Upsert*);
-SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int);
+SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,
+ ExprList*,Select*,u16,int);
SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*);
SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*);
SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo*);
@@ -20068,7 +20450,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int
SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int);
SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int);
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
-SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(Parse*, Column*, int);
+SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(Parse*, Table*, Column*, int);
#endif
SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int);
SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int);
@@ -20087,23 +20469,24 @@ SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*);
#define LOCATE_VIEW 0x01
#define LOCATE_NOERR 0x02
SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*);
+SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char*);
SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,SrcItem *);
SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*);
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*);
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*);
SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*);
SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*);
-SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*);
-SQLITE_PRIVATE int sqlite3ExprCompare(Parse*,Expr*, Expr*, int);
-SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*, Expr*, int);
-SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*, int);
-SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int);
+SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, const Token*);
+SQLITE_PRIVATE int sqlite3ExprCompare(const Parse*,const Expr*,const Expr*, int);
+SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*,Expr*,int);
+SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList*,const ExprList*, int);
+SQLITE_PRIVATE int sqlite3ExprImpliesExpr(const Parse*,const Expr*,const Expr*, int);
SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr*,int);
SQLITE_PRIVATE void sqlite3AggInfoPersistWalkerInit(Walker*,Parse*);
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx);
-SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr*, SrcList*);
+SQLITE_PRIVATE int sqlite3ReferencesSrcList(Parse*, Expr*, SrcList*);
SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*);
#ifndef SQLITE_UNTESTABLE
SQLITE_PRIVATE void sqlite3PrngSaveState(void);
@@ -20125,10 +20508,11 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8);
SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*);
SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int);
+SQLITE_PRIVATE int sqlite3ExprIsSingleTableConstraint(Expr*,const SrcList*,int);
#ifdef SQLITE_ENABLE_CURSOR_HINTS
SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*);
#endif
-SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*);
+SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr*, int*);
SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*);
SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char);
SQLITE_PRIVATE int sqlite3IsRowid(const char*);
@@ -20153,17 +20537,22 @@ SQLITE_PRIVATE void sqlite3MayAbort(Parse*);
SQLITE_PRIVATE void sqlite3HaltConstraint(Parse*, int, int, char*, i8, u8);
SQLITE_PRIVATE void sqlite3UniqueConstraint(Parse*, int, Index*);
SQLITE_PRIVATE void sqlite3RowidConstraint(Parse*, int, Table*);
-SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3*,Expr*,int);
-SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int);
-SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int);
-SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,IdList*);
-SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,Select*,int);
+SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3*,const Expr*,int);
+SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,const ExprList*,int);
+SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,const SrcList*,int);
+SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,const IdList*);
+SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,const Select*,int);
SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch(int,const char*);
SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int);
SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8);
+SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum*,sqlite3_value*);
SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void);
SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void);
+SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void);
SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*);
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON)
+SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3*);
+#endif
SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*);
SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*);
SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int);
@@ -20217,7 +20606,8 @@ SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc(Parse*, TriggerStep*);
SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*);
SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol);
-SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int);
+SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem*,int);
+SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int,u32);
SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int);
SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int);
#ifndef SQLITE_OMIT_AUTHORIZATION
@@ -20241,7 +20631,8 @@ SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*);
SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*);
SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*);
SQLITE_PRIVATE int sqlite3RealSameAsInt(double,sqlite3_int64);
-SQLITE_PRIVATE void sqlite3Int64ToText(i64,char*);
+SQLITE_PRIVATE i64 sqlite3RealToI64(double);
+SQLITE_PRIVATE int sqlite3Int64ToText(i64,char*);
SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8);
SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*);
SQLITE_PRIVATE int sqlite3GetUInt32(const char*, u32*);
@@ -20253,14 +20644,8 @@ SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte);
SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**);
SQLITE_PRIVATE LogEst sqlite3LogEst(u64);
SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst);
-#ifndef SQLITE_OMIT_VIRTUALTABLE
SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double);
-#endif
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \
- defined(SQLITE_ENABLE_STAT4) || \
- defined(SQLITE_EXPLAIN_ESTIMATED_ROWS)
SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst);
-#endif
SQLITE_PRIVATE VList *sqlite3VListAdd(sqlite3*,VList*,const char*,int,int);
SQLITE_PRIVATE const char *sqlite3VListNumToName(VList*,int);
SQLITE_PRIVATE int sqlite3VListNameToNum(VList*,const char*,int);
@@ -20292,11 +20677,13 @@ SQLITE_PRIVATE int sqlite3VarintLen(u64 v);
SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3*, Index*);
+SQLITE_PRIVATE char *sqlite3TableAffinityStr(sqlite3*,const Table*);
SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe*, Table*, int);
SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr *pExpr, char aff2);
SQLITE_PRIVATE int sqlite3IndexAffinityOk(const Expr *pExpr, char idx_affinity);
-SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table*,int);
+SQLITE_PRIVATE char sqlite3TableColumnAffinity(const Table*,int);
SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr);
+SQLITE_PRIVATE int sqlite3ExprDataType(const Expr *pExpr);
SQLITE_PRIVATE int sqlite3Atoi64(const char*, i64*, int, u8);
SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char*, i64*);
SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3*, int, const char*,...);
@@ -20313,6 +20700,9 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int);
#ifndef SQLITE_OMIT_DESERIALIZE
SQLITE_PRIVATE int sqlite3MemdbInit(void);
+SQLITE_PRIVATE int sqlite3IsMemdb(const sqlite3_vfs*);
+#else
+# define sqlite3IsMemdb(X) 0
#endif
SQLITE_PRIVATE const char *sqlite3ErrStr(int);
@@ -20324,14 +20714,14 @@ SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8);
SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr);
SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, const Expr *pExpr);
SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse*,const Expr*,const Expr*);
-SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int);
-SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*);
+SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(const Parse *pParse, Expr*, const Token*, int);
+SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(const Parse*,Expr*,const char*);
SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*);
SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr*);
SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *);
SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3*);
SQLITE_PRIVATE int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*);
-SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, int);
+SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, i64);
SQLITE_PRIVATE int sqlite3AddInt64(i64*,i64);
SQLITE_PRIVATE int sqlite3SubInt64(i64*,i64);
SQLITE_PRIVATE int sqlite3MulInt64(i64*,i64);
@@ -20356,11 +20746,14 @@ SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *);
#ifndef SQLITE_OMIT_UTF16
SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8);
#endif
-SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **);
+SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, const Expr *, u8, u8, sqlite3_value **);
SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8);
#ifndef SQLITE_AMALGAMATION
SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[];
SQLITE_PRIVATE const char sqlite3StrBINARY[];
+SQLITE_PRIVATE const unsigned char sqlite3StdTypeLen[];
+SQLITE_PRIVATE const char sqlite3StdTypeAffinity[];
+SQLITE_PRIVATE const char *sqlite3StdType[];
SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[];
SQLITE_PRIVATE const unsigned char *sqlite3aLTb;
SQLITE_PRIVATE const unsigned char *sqlite3aEQb;
@@ -20404,9 +20797,9 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const
SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int);
SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *);
SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *);
-SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse*, SrcList*, Token*);
-SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse*, void*, Token*);
-SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse*, void *pTo, void *pFrom);
+SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse*, SrcList*, const Token*);
+SQLITE_PRIVATE const void *sqlite3RenameTokenMap(Parse*, const void*, const Token*);
+SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse*, const void *pTo, const void *pFrom);
SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse*, Expr*);
SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse*, ExprList*);
SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*);
@@ -20443,15 +20836,20 @@ SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *,
FuncDestructor *pDestructor
);
SQLITE_PRIVATE void sqlite3NoopDestructor(void*);
-SQLITE_PRIVATE void sqlite3OomFault(sqlite3*);
+SQLITE_PRIVATE void *sqlite3OomFault(sqlite3*);
SQLITE_PRIVATE void sqlite3OomClear(sqlite3*);
SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int);
SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *);
SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int);
+SQLITE_PRIVATE int sqlite3StrAccumEnlarge(StrAccum*, i64);
SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*);
+SQLITE_PRIVATE void sqlite3StrAccumSetError(StrAccum*, u8);
+SQLITE_PRIVATE void sqlite3ResultStrAccum(sqlite3_context*,StrAccum*);
SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int);
SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int);
+SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3*,const char*);
+SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3*,const Expr*);
SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *);
SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *);
@@ -20502,7 +20900,7 @@ SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*);
#endif
#ifdef SQLITE_OMIT_VIRTUALTABLE
-# define sqlite3VtabClear(Y)
+# define sqlite3VtabClear(D,T)
# define sqlite3VtabSync(X,Y) SQLITE_OK
# define sqlite3VtabRollback(X)
# define sqlite3VtabCommit(X)
@@ -20539,9 +20937,11 @@ SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db);
#ifndef SQLITE_OMIT_VIRTUALTABLE
SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName);
SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3*,Table*,const char*);
+SQLITE_PRIVATE void sqlite3MarkAllShadowTablesOf(sqlite3*, Table*);
#else
# define sqlite3ShadowTableName(A,B) 0
# define sqlite3IsShadowTableOf(A,B,C) 0
+# define sqlite3MarkAllShadowTablesOf(A,B)
#endif
SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*);
SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*);
@@ -20554,11 +20954,14 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **);
SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
+
SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
+SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(Parse*);
SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
-SQLITE_PRIVATE void sqlite3ParserReset(Parse*);
+SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse*,sqlite3*);
+SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse*);
SQLITE_PRIVATE void *sqlite3ParserAddCleanup(Parse*,void(*)(sqlite3*,void*),void*);
#ifdef SQLITE_ENABLE_NORMALIZE
SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*);
@@ -20584,7 +20987,7 @@ SQLITE_PRIVATE With *sqlite3WithPush(Parse*, With*, u8);
# define sqlite3CteDelete(D,C)
# define sqlite3CteWithAdd(P,W,C) ((void*)0)
# define sqlite3WithDelete(x,y)
-# define sqlite3WithPush(x,y,z)
+# define sqlite3WithPush(x,y,z) ((void*)0)
#endif
#ifndef SQLITE_OMIT_UPSERT
SQLITE_PRIVATE Upsert *sqlite3UpsertNew(sqlite3*,ExprList*,Expr*,ExprList*,Expr*,Upsert*);
@@ -20617,6 +21020,7 @@ SQLITE_PRIVATE void sqlite3FkActions(Parse*, Table*, ExprList*, int, int*, int
SQLITE_PRIVATE int sqlite3FkRequired(Parse*, Table*, int*, int);
SQLITE_PRIVATE u32 sqlite3FkOldmask(Parse*, Table*);
SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *);
+SQLITE_PRIVATE void sqlite3FkClearTriggerCache(sqlite3*,int);
#else
#define sqlite3FkActions(a,b,c,d,e,f)
#define sqlite3FkCheck(a,b,c,d,e,f)
@@ -20624,6 +21028,7 @@ SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *);
#define sqlite3FkOldmask(a,b) 0
#define sqlite3FkRequired(a,b,c,d) 0
#define sqlite3FkReferences(a) 0
+ #define sqlite3FkClearTriggerCache(a,b)
#endif
#ifndef SQLITE_OMIT_FOREIGN_KEY
SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *, Table*);
@@ -20681,7 +21086,7 @@ SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *);
SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p);
#if SQLITE_MAX_EXPR_DEPTH>0
-SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *);
+SQLITE_PRIVATE int sqlite3SelectExprHeight(const Select *);
SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse*, int);
#else
#define sqlite3SelectExprHeight(x) 0
@@ -20752,8 +21157,8 @@ SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...);
*/
#ifdef SQLITE_MEMDEBUG
SQLITE_PRIVATE void sqlite3MemdebugSetType(void*,u8);
-SQLITE_PRIVATE int sqlite3MemdebugHasType(void*,u8);
-SQLITE_PRIVATE int sqlite3MemdebugNoType(void*,u8);
+SQLITE_PRIVATE int sqlite3MemdebugHasType(const void*,u8);
+SQLITE_PRIVATE int sqlite3MemdebugNoType(const void*,u8);
#else
# define sqlite3MemdebugSetType(X,Y) /* no-op */
# define sqlite3MemdebugHasType(X,Y) 1
@@ -20778,19 +21183,927 @@ SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3*);
SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3*);
#endif
-SQLITE_PRIVATE int sqlite3ExprVectorSize(Expr *pExpr);
-SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr);
+SQLITE_PRIVATE int sqlite3ExprVectorSize(const Expr *pExpr);
+SQLITE_PRIVATE int sqlite3ExprIsVector(const Expr *pExpr);
SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr*, int);
-SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(Parse*,Expr*,int);
+SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(Parse*,Expr*,int,int);
SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse*, Expr*);
#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt);
#endif
+#if SQLITE_OS_UNIX && defined(SQLITE_OS_KV_OPTIONAL)
+SQLITE_PRIVATE int sqlite3KvvfsInit(void);
+#endif
+
+#if defined(VDBE_PROFILE) \
+ || defined(SQLITE_PERFORMANCE_TRACE) \
+ || defined(SQLITE_ENABLE_STMT_SCANSTATUS)
+SQLITE_PRIVATE sqlite3_uint64 sqlite3Hwtime(void);
+#endif
+
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+# define IS_STMT_SCANSTATUS(db) (db->flags & SQLITE_StmtScanStatus)
+#else
+# define IS_STMT_SCANSTATUS(db) 0
+#endif
+
#endif /* SQLITEINT_H */
/************** End of sqliteInt.h *******************************************/
+/************** Begin file os_common.h ***************************************/
+/*
+** 2004 May 22
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file contains macros and a little bit of code that is common to
+** all of the platform-specific files (os_*.c) and is #included into those
+** files.
+**
+** This file should be #included by the os_*.c files only. It is not a
+** general purpose header file.
+*/
+#ifndef _OS_COMMON_H_
+#define _OS_COMMON_H_
+
+/*
+** At least two bugs have slipped in because we changed the MEMORY_DEBUG
+** macro to SQLITE_DEBUG and some older makefiles have not yet made the
+** switch. The following code should catch this problem at compile-time.
+*/
+#ifdef MEMORY_DEBUG
+# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
+#endif
+
+/*
+** Macros for performance tracing. Normally turned off. Only works
+** on i486 hardware.
+*/
+#ifdef SQLITE_PERFORMANCE_TRACE
+
+static sqlite_uint64 g_start;
+static sqlite_uint64 g_elapsed;
+#define TIMER_START g_start=sqlite3Hwtime()
+#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
+#define TIMER_ELAPSED g_elapsed
+#else
+#define TIMER_START
+#define TIMER_END
+#define TIMER_ELAPSED ((sqlite_uint64)0)
+#endif
+
+/*
+** If we compile with the SQLITE_TEST macro set, then the following block
+** of code will give us the ability to simulate a disk I/O error. This
+** is used for testing the I/O recovery logic.
+*/
+#if defined(SQLITE_TEST)
+SQLITE_API extern int sqlite3_io_error_hit;
+SQLITE_API extern int sqlite3_io_error_hardhit;
+SQLITE_API extern int sqlite3_io_error_pending;
+SQLITE_API extern int sqlite3_io_error_persist;
+SQLITE_API extern int sqlite3_io_error_benign;
+SQLITE_API extern int sqlite3_diskfull_pending;
+SQLITE_API extern int sqlite3_diskfull;
+#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
+#define SimulateIOError(CODE) \
+ if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
+ || sqlite3_io_error_pending-- == 1 ) \
+ { local_ioerr(); CODE; }
+static void local_ioerr(){
+ IOTRACE(("IOERR\n"));
+ sqlite3_io_error_hit++;
+ if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
+}
+#define SimulateDiskfullError(CODE) \
+ if( sqlite3_diskfull_pending ){ \
+ if( sqlite3_diskfull_pending == 1 ){ \
+ local_ioerr(); \
+ sqlite3_diskfull = 1; \
+ sqlite3_io_error_hit = 1; \
+ CODE; \
+ }else{ \
+ sqlite3_diskfull_pending--; \
+ } \
+ }
+#else
+#define SimulateIOErrorBenign(X)
+#define SimulateIOError(A)
+#define SimulateDiskfullError(A)
+#endif /* defined(SQLITE_TEST) */
+
+/*
+** When testing, keep a count of the number of open files.
+*/
+#if defined(SQLITE_TEST)
+SQLITE_API extern int sqlite3_open_file_count;
+#define OpenCounter(X) sqlite3_open_file_count+=(X)
+#else
+#define OpenCounter(X)
+#endif /* defined(SQLITE_TEST) */
+
+#endif /* !defined(_OS_COMMON_H_) */
+
+/************** End of os_common.h *******************************************/
+/************** Begin file ctime.c *******************************************/
+/* DO NOT EDIT!
+** This file is automatically generated by the script in the canonical
+** SQLite source tree at tool/mkctimec.tcl.
+**
+** To modify this header, edit any of the various lists in that script
+** which specify categories of generated conditionals in this file.
+*/
+
+/*
+** 2010 February 23
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This file implements routines used to report what compile-time options
+** SQLite was built with.
+*/
+#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS /* IMP: R-16824-07538 */
+
+/*
+** Include the configuration header output by 'configure' if we're using the
+** autoconf-based build
+*/
+#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H)
+/* #include "sqlite_cfg.h" */
+#define SQLITECONFIG_H 1
+#endif
+
+/* These macros are provided to "stringify" the value of the define
+** for those options in which the value is meaningful. */
+#define CTIMEOPT_VAL_(opt) #opt
+#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
+
+/* Like CTIMEOPT_VAL, but especially for SQLITE_DEFAULT_LOOKASIDE. This
+** option requires a separate macro because legal values contain a single
+** comma. e.g. (-DSQLITE_DEFAULT_LOOKASIDE="100,100") */
+#define CTIMEOPT_VAL2_(opt1,opt2) #opt1 "," #opt2
+#define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt)
+/* #include "sqliteInt.h" */
+
+/*
+** An array of names of all compile-time options. This array should
+** be sorted A-Z.
+**
+** This array looks large, but in a typical installation actually uses
+** only a handful of compile-time options, so most times this array is usually
+** rather short and uses little memory space.
+*/
+static const char * const sqlite3azCompileOpt[] = {
+
+#ifdef SQLITE_32BIT_ROWID
+ "32BIT_ROWID",
+#endif
+#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC
+ "4_BYTE_ALIGNED_MALLOC",
+#endif
+#ifdef SQLITE_64BIT_STATS
+ "64BIT_STATS",
+#endif
+#ifdef SQLITE_ALLOW_COVERING_INDEX_SCAN
+# if SQLITE_ALLOW_COVERING_INDEX_SCAN != 1
+ "ALLOW_COVERING_INDEX_SCAN=" CTIMEOPT_VAL(SQLITE_ALLOW_COVERING_INDEX_SCAN),
+# endif
+#endif
+#ifdef SQLITE_ALLOW_URI_AUTHORITY
+ "ALLOW_URI_AUTHORITY",
+#endif
+#ifdef SQLITE_ATOMIC_INTRINSICS
+ "ATOMIC_INTRINSICS=" CTIMEOPT_VAL(SQLITE_ATOMIC_INTRINSICS),
+#endif
+#ifdef SQLITE_BITMASK_TYPE
+ "BITMASK_TYPE=" CTIMEOPT_VAL(SQLITE_BITMASK_TYPE),
+#endif
+#ifdef SQLITE_BUG_COMPATIBLE_20160819
+ "BUG_COMPATIBLE_20160819",
+#endif
+#ifdef SQLITE_CASE_SENSITIVE_LIKE
+ "CASE_SENSITIVE_LIKE",
+#endif
+#ifdef SQLITE_CHECK_PAGES
+ "CHECK_PAGES",
+#endif
+#if defined(__clang__) && defined(__clang_major__)
+ "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "."
+ CTIMEOPT_VAL(__clang_minor__) "."
+ CTIMEOPT_VAL(__clang_patchlevel__),
+#elif defined(_MSC_VER)
+ "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER),
+#elif defined(__GNUC__) && defined(__VERSION__)
+ "COMPILER=gcc-" __VERSION__,
+#endif
+#ifdef SQLITE_COVERAGE_TEST
+ "COVERAGE_TEST",
+#endif
+#ifdef SQLITE_DEBUG
+ "DEBUG",
+#endif
+#ifdef SQLITE_DEFAULT_AUTOMATIC_INDEX
+ "DEFAULT_AUTOMATIC_INDEX",
+#endif
+#ifdef SQLITE_DEFAULT_AUTOVACUUM
+ "DEFAULT_AUTOVACUUM",
+#endif
+#ifdef SQLITE_DEFAULT_CACHE_SIZE
+ "DEFAULT_CACHE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_CACHE_SIZE),
+#endif
+#ifdef SQLITE_DEFAULT_CKPTFULLFSYNC
+ "DEFAULT_CKPTFULLFSYNC",
+#endif
+#ifdef SQLITE_DEFAULT_FILE_FORMAT
+ "DEFAULT_FILE_FORMAT=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_FORMAT),
+#endif
+#ifdef SQLITE_DEFAULT_FILE_PERMISSIONS
+ "DEFAULT_FILE_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_PERMISSIONS),
+#endif
+#ifdef SQLITE_DEFAULT_FOREIGN_KEYS
+ "DEFAULT_FOREIGN_KEYS",
+#endif
+#ifdef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
+ "DEFAULT_JOURNAL_SIZE_LIMIT=" CTIMEOPT_VAL(SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT),
+#endif
+#ifdef SQLITE_DEFAULT_LOCKING_MODE
+ "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE),
+#endif
+#ifdef SQLITE_DEFAULT_LOOKASIDE
+ "DEFAULT_LOOKASIDE=" CTIMEOPT_VAL2(SQLITE_DEFAULT_LOOKASIDE),
+#endif
+#ifdef SQLITE_DEFAULT_MEMSTATUS
+# if SQLITE_DEFAULT_MEMSTATUS != 1
+ "DEFAULT_MEMSTATUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_MEMSTATUS),
+# endif
+#endif
+#ifdef SQLITE_DEFAULT_MMAP_SIZE
+ "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE),
+#endif
+#ifdef SQLITE_DEFAULT_PAGE_SIZE
+ "DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_PAGE_SIZE),
+#endif
+#ifdef SQLITE_DEFAULT_PCACHE_INITSZ
+ "DEFAULT_PCACHE_INITSZ=" CTIMEOPT_VAL(SQLITE_DEFAULT_PCACHE_INITSZ),
+#endif
+#ifdef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS
+ "DEFAULT_PROXYDIR_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_PROXYDIR_PERMISSIONS),
+#endif
+#ifdef SQLITE_DEFAULT_RECURSIVE_TRIGGERS
+ "DEFAULT_RECURSIVE_TRIGGERS",
+#endif
+#ifdef SQLITE_DEFAULT_ROWEST
+ "DEFAULT_ROWEST=" CTIMEOPT_VAL(SQLITE_DEFAULT_ROWEST),
+#endif
+#ifdef SQLITE_DEFAULT_SECTOR_SIZE
+ "DEFAULT_SECTOR_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_SECTOR_SIZE),
+#endif
+#ifdef SQLITE_DEFAULT_SYNCHRONOUS
+ "DEFAULT_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_SYNCHRONOUS),
+#endif
+#ifdef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT
+ "DEFAULT_WAL_AUTOCHECKPOINT=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_AUTOCHECKPOINT),
+#endif
+#ifdef SQLITE_DEFAULT_WAL_SYNCHRONOUS
+ "DEFAULT_WAL_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_SYNCHRONOUS),
+#endif
+#ifdef SQLITE_DEFAULT_WORKER_THREADS
+ "DEFAULT_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WORKER_THREADS),
+#endif
+#ifdef SQLITE_DIRECT_OVERFLOW_READ
+ "DIRECT_OVERFLOW_READ",
+#endif
+#ifdef SQLITE_DISABLE_DIRSYNC
+ "DISABLE_DIRSYNC",
+#endif
+#ifdef SQLITE_DISABLE_FTS3_UNICODE
+ "DISABLE_FTS3_UNICODE",
+#endif
+#ifdef SQLITE_DISABLE_FTS4_DEFERRED
+ "DISABLE_FTS4_DEFERRED",
+#endif
+#ifdef SQLITE_DISABLE_INTRINSIC
+ "DISABLE_INTRINSIC",
+#endif
+#ifdef SQLITE_DISABLE_LFS
+ "DISABLE_LFS",
+#endif
+#ifdef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS
+ "DISABLE_PAGECACHE_OVERFLOW_STATS",
+#endif
+#ifdef SQLITE_DISABLE_SKIPAHEAD_DISTINCT
+ "DISABLE_SKIPAHEAD_DISTINCT",
+#endif
+#ifdef SQLITE_DQS
+ "DQS=" CTIMEOPT_VAL(SQLITE_DQS),
+#endif
+#ifdef SQLITE_ENABLE_8_3_NAMES
+ "ENABLE_8_3_NAMES=" CTIMEOPT_VAL(SQLITE_ENABLE_8_3_NAMES),
+#endif
+#ifdef SQLITE_ENABLE_API_ARMOR
+ "ENABLE_API_ARMOR",
+#endif
+#ifdef SQLITE_ENABLE_ATOMIC_WRITE
+ "ENABLE_ATOMIC_WRITE",
+#endif
+#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
+ "ENABLE_BATCH_ATOMIC_WRITE",
+#endif
+#ifdef SQLITE_ENABLE_BYTECODE_VTAB
+ "ENABLE_BYTECODE_VTAB",
+#endif
+#ifdef SQLITE_ENABLE_CEROD
+ "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD),
+#endif
+#ifdef SQLITE_ENABLE_COLUMN_METADATA
+ "ENABLE_COLUMN_METADATA",
+#endif
+#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
+ "ENABLE_COLUMN_USED_MASK",
+#endif
+#ifdef SQLITE_ENABLE_COSTMULT
+ "ENABLE_COSTMULT",
+#endif
+#ifdef SQLITE_ENABLE_CURSOR_HINTS
+ "ENABLE_CURSOR_HINTS",
+#endif
+#ifdef SQLITE_ENABLE_DBPAGE_VTAB
+ "ENABLE_DBPAGE_VTAB",
+#endif
+#ifdef SQLITE_ENABLE_DBSTAT_VTAB
+ "ENABLE_DBSTAT_VTAB",
+#endif
+#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
+ "ENABLE_EXPENSIVE_ASSERT",
+#endif
+#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
+ "ENABLE_EXPLAIN_COMMENTS",
+#endif
+#ifdef SQLITE_ENABLE_FTS3
+ "ENABLE_FTS3",
+#endif
+#ifdef SQLITE_ENABLE_FTS3_PARENTHESIS
+ "ENABLE_FTS3_PARENTHESIS",
+#endif
+#ifdef SQLITE_ENABLE_FTS3_TOKENIZER
+ "ENABLE_FTS3_TOKENIZER",
+#endif
+#ifdef SQLITE_ENABLE_FTS4
+ "ENABLE_FTS4",
+#endif
+#ifdef SQLITE_ENABLE_FTS5
+ "ENABLE_FTS5",
+#endif
+#ifdef SQLITE_ENABLE_GEOPOLY
+ "ENABLE_GEOPOLY",
+#endif
+#ifdef SQLITE_ENABLE_HIDDEN_COLUMNS
+ "ENABLE_HIDDEN_COLUMNS",
+#endif
+#ifdef SQLITE_ENABLE_ICU
+ "ENABLE_ICU",
+#endif
+#ifdef SQLITE_ENABLE_IOTRACE
+ "ENABLE_IOTRACE",
+#endif
+#ifdef SQLITE_ENABLE_LOAD_EXTENSION
+ "ENABLE_LOAD_EXTENSION",
+#endif
+#ifdef SQLITE_ENABLE_LOCKING_STYLE
+ "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE),
+#endif
+#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
+ "ENABLE_MATH_FUNCTIONS",
+#endif
+#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
+ "ENABLE_MEMORY_MANAGEMENT",
+#endif
+#ifdef SQLITE_ENABLE_MEMSYS3
+ "ENABLE_MEMSYS3",
+#endif
+#ifdef SQLITE_ENABLE_MEMSYS5
+ "ENABLE_MEMSYS5",
+#endif
+#ifdef SQLITE_ENABLE_MULTIPLEX
+ "ENABLE_MULTIPLEX",
+#endif
+#ifdef SQLITE_ENABLE_NORMALIZE
+ "ENABLE_NORMALIZE",
+#endif
+#ifdef SQLITE_ENABLE_NULL_TRIM
+ "ENABLE_NULL_TRIM",
+#endif
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ "ENABLE_OFFSET_SQL_FUNC",
+#endif
+#ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK
+ "ENABLE_OVERSIZE_CELL_CHECK",
+#endif
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+ "ENABLE_PREUPDATE_HOOK",
+#endif
+#ifdef SQLITE_ENABLE_QPSG
+ "ENABLE_QPSG",
+#endif
+#ifdef SQLITE_ENABLE_RBU
+ "ENABLE_RBU",
+#endif
+#ifdef SQLITE_ENABLE_RTREE
+ "ENABLE_RTREE",
+#endif
+#ifdef SQLITE_ENABLE_SESSION
+ "ENABLE_SESSION",
+#endif
+#ifdef SQLITE_ENABLE_SNAPSHOT
+ "ENABLE_SNAPSHOT",
+#endif
+#ifdef SQLITE_ENABLE_SORTER_REFERENCES
+ "ENABLE_SORTER_REFERENCES",
+#endif
+#ifdef SQLITE_ENABLE_SQLLOG
+ "ENABLE_SQLLOG",
+#endif
+#ifdef SQLITE_ENABLE_STAT4
+ "ENABLE_STAT4",
+#endif
+#ifdef SQLITE_ENABLE_STMTVTAB
+ "ENABLE_STMTVTAB",
+#endif
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+ "ENABLE_STMT_SCANSTATUS",
+#endif
+#ifdef SQLITE_ENABLE_TREETRACE
+ "ENABLE_TREETRACE",
+#endif
+#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
+ "ENABLE_UNKNOWN_SQL_FUNCTION",
+#endif
+#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
+ "ENABLE_UNLOCK_NOTIFY",
+#endif
+#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
+ "ENABLE_UPDATE_DELETE_LIMIT",
+#endif
+#ifdef SQLITE_ENABLE_URI_00_ERROR
+ "ENABLE_URI_00_ERROR",
+#endif
+#ifdef SQLITE_ENABLE_VFSTRACE
+ "ENABLE_VFSTRACE",
+#endif
+#ifdef SQLITE_ENABLE_WHERETRACE
+ "ENABLE_WHERETRACE",
+#endif
+#ifdef SQLITE_ENABLE_ZIPVFS
+ "ENABLE_ZIPVFS",
+#endif
+#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS
+ "EXPLAIN_ESTIMATED_ROWS",
+#endif
+#ifdef SQLITE_EXTRA_IFNULLROW
+ "EXTRA_IFNULLROW",
+#endif
+#ifdef SQLITE_EXTRA_INIT
+ "EXTRA_INIT=" CTIMEOPT_VAL(SQLITE_EXTRA_INIT),
+#endif
+#ifdef SQLITE_EXTRA_SHUTDOWN
+ "EXTRA_SHUTDOWN=" CTIMEOPT_VAL(SQLITE_EXTRA_SHUTDOWN),
+#endif
+#ifdef SQLITE_FTS3_MAX_EXPR_DEPTH
+ "FTS3_MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_FTS3_MAX_EXPR_DEPTH),
+#endif
+#ifdef SQLITE_FTS5_ENABLE_TEST_MI
+ "FTS5_ENABLE_TEST_MI",
+#endif
+#ifdef SQLITE_FTS5_NO_WITHOUT_ROWID
+ "FTS5_NO_WITHOUT_ROWID",
+#endif
+#if HAVE_ISNAN || SQLITE_HAVE_ISNAN
+ "HAVE_ISNAN",
+#endif
+#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
+# if SQLITE_HOMEGROWN_RECURSIVE_MUTEX != 1
+ "HOMEGROWN_RECURSIVE_MUTEX=" CTIMEOPT_VAL(SQLITE_HOMEGROWN_RECURSIVE_MUTEX),
+# endif
+#endif
+#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS
+ "IGNORE_AFP_LOCK_ERRORS",
+#endif
+#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
+ "IGNORE_FLOCK_LOCK_ERRORS",
+#endif
+#ifdef SQLITE_INLINE_MEMCPY
+ "INLINE_MEMCPY",
+#endif
+#ifdef SQLITE_INT64_TYPE
+ "INT64_TYPE",
+#endif
+#ifdef SQLITE_INTEGRITY_CHECK_ERROR_MAX
+ "INTEGRITY_CHECK_ERROR_MAX=" CTIMEOPT_VAL(SQLITE_INTEGRITY_CHECK_ERROR_MAX),
+#endif
+#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS
+ "LIKE_DOESNT_MATCH_BLOBS",
+#endif
+#ifdef SQLITE_LOCK_TRACE
+ "LOCK_TRACE",
+#endif
+#ifdef SQLITE_LOG_CACHE_SPILL
+ "LOG_CACHE_SPILL",
+#endif
+#ifdef SQLITE_MALLOC_SOFT_LIMIT
+ "MALLOC_SOFT_LIMIT=" CTIMEOPT_VAL(SQLITE_MALLOC_SOFT_LIMIT),
+#endif
+#ifdef SQLITE_MAX_ATTACHED
+ "MAX_ATTACHED=" CTIMEOPT_VAL(SQLITE_MAX_ATTACHED),
+#endif
+#ifdef SQLITE_MAX_COLUMN
+ "MAX_COLUMN=" CTIMEOPT_VAL(SQLITE_MAX_COLUMN),
+#endif
+#ifdef SQLITE_MAX_COMPOUND_SELECT
+ "MAX_COMPOUND_SELECT=" CTIMEOPT_VAL(SQLITE_MAX_COMPOUND_SELECT),
+#endif
+#ifdef SQLITE_MAX_DEFAULT_PAGE_SIZE
+ "MAX_DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_DEFAULT_PAGE_SIZE),
+#endif
+#ifdef SQLITE_MAX_EXPR_DEPTH
+ "MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_EXPR_DEPTH),
+#endif
+#ifdef SQLITE_MAX_FUNCTION_ARG
+ "MAX_FUNCTION_ARG=" CTIMEOPT_VAL(SQLITE_MAX_FUNCTION_ARG),
+#endif
+#ifdef SQLITE_MAX_LENGTH
+ "MAX_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LENGTH),
+#endif
+#ifdef SQLITE_MAX_LIKE_PATTERN_LENGTH
+ "MAX_LIKE_PATTERN_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LIKE_PATTERN_LENGTH),
+#endif
+#ifdef SQLITE_MAX_MEMORY
+ "MAX_MEMORY=" CTIMEOPT_VAL(SQLITE_MAX_MEMORY),
+#endif
+#ifdef SQLITE_MAX_MMAP_SIZE
+ "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE),
+#endif
+#ifdef SQLITE_MAX_MMAP_SIZE_
+ "MAX_MMAP_SIZE_=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE_),
+#endif
+#ifdef SQLITE_MAX_PAGE_COUNT
+ "MAX_PAGE_COUNT=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_COUNT),
+#endif
+#ifdef SQLITE_MAX_PAGE_SIZE
+ "MAX_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_SIZE),
+#endif
+#ifdef SQLITE_MAX_SCHEMA_RETRY
+ "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY),
+#endif
+#ifdef SQLITE_MAX_SQL_LENGTH
+ "MAX_SQL_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_SQL_LENGTH),
+#endif
+#ifdef SQLITE_MAX_TRIGGER_DEPTH
+ "MAX_TRIGGER_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_TRIGGER_DEPTH),
+#endif
+#ifdef SQLITE_MAX_VARIABLE_NUMBER
+ "MAX_VARIABLE_NUMBER=" CTIMEOPT_VAL(SQLITE_MAX_VARIABLE_NUMBER),
+#endif
+#ifdef SQLITE_MAX_VDBE_OP
+ "MAX_VDBE_OP=" CTIMEOPT_VAL(SQLITE_MAX_VDBE_OP),
+#endif
+#ifdef SQLITE_MAX_WORKER_THREADS
+ "MAX_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_MAX_WORKER_THREADS),
+#endif
+#ifdef SQLITE_MEMDEBUG
+ "MEMDEBUG",
+#endif
+#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
+ "MIXED_ENDIAN_64BIT_FLOAT",
+#endif
+#ifdef SQLITE_MMAP_READWRITE
+ "MMAP_READWRITE",
+#endif
+#ifdef SQLITE_MUTEX_NOOP
+ "MUTEX_NOOP",
+#endif
+#ifdef SQLITE_MUTEX_OMIT
+ "MUTEX_OMIT",
+#endif
+#ifdef SQLITE_MUTEX_PTHREADS
+ "MUTEX_PTHREADS",
+#endif
+#ifdef SQLITE_MUTEX_W32
+ "MUTEX_W32",
+#endif
+#ifdef SQLITE_NEED_ERR_NAME
+ "NEED_ERR_NAME",
+#endif
+#ifdef SQLITE_NO_SYNC
+ "NO_SYNC",
+#endif
+#ifdef SQLITE_OMIT_ALTERTABLE
+ "OMIT_ALTERTABLE",
+#endif
+#ifdef SQLITE_OMIT_ANALYZE
+ "OMIT_ANALYZE",
+#endif
+#ifdef SQLITE_OMIT_ATTACH
+ "OMIT_ATTACH",
+#endif
+#ifdef SQLITE_OMIT_AUTHORIZATION
+ "OMIT_AUTHORIZATION",
+#endif
+#ifdef SQLITE_OMIT_AUTOINCREMENT
+ "OMIT_AUTOINCREMENT",
+#endif
+#ifdef SQLITE_OMIT_AUTOINIT
+ "OMIT_AUTOINIT",
+#endif
+#ifdef SQLITE_OMIT_AUTOMATIC_INDEX
+ "OMIT_AUTOMATIC_INDEX",
+#endif
+#ifdef SQLITE_OMIT_AUTORESET
+ "OMIT_AUTORESET",
+#endif
+#ifdef SQLITE_OMIT_AUTOVACUUM
+ "OMIT_AUTOVACUUM",
+#endif
+#ifdef SQLITE_OMIT_BETWEEN_OPTIMIZATION
+ "OMIT_BETWEEN_OPTIMIZATION",
+#endif
+#ifdef SQLITE_OMIT_BLOB_LITERAL
+ "OMIT_BLOB_LITERAL",
+#endif
+#ifdef SQLITE_OMIT_CAST
+ "OMIT_CAST",
+#endif
+#ifdef SQLITE_OMIT_CHECK
+ "OMIT_CHECK",
+#endif
+#ifdef SQLITE_OMIT_COMPLETE
+ "OMIT_COMPLETE",
+#endif
+#ifdef SQLITE_OMIT_COMPOUND_SELECT
+ "OMIT_COMPOUND_SELECT",
+#endif
+#ifdef SQLITE_OMIT_CONFLICT_CLAUSE
+ "OMIT_CONFLICT_CLAUSE",
+#endif
+#ifdef SQLITE_OMIT_CTE
+ "OMIT_CTE",
+#endif
+#if defined(SQLITE_OMIT_DATETIME_FUNCS) || defined(SQLITE_OMIT_FLOATING_POINT)
+ "OMIT_DATETIME_FUNCS",
+#endif
+#ifdef SQLITE_OMIT_DECLTYPE
+ "OMIT_DECLTYPE",
+#endif
+#ifdef SQLITE_OMIT_DEPRECATED
+ "OMIT_DEPRECATED",
+#endif
+#ifdef SQLITE_OMIT_DESERIALIZE
+ "OMIT_DESERIALIZE",
+#endif
+#ifdef SQLITE_OMIT_DISKIO
+ "OMIT_DISKIO",
+#endif
+#ifdef SQLITE_OMIT_EXPLAIN
+ "OMIT_EXPLAIN",
+#endif
+#ifdef SQLITE_OMIT_FLAG_PRAGMAS
+ "OMIT_FLAG_PRAGMAS",
+#endif
+#ifdef SQLITE_OMIT_FLOATING_POINT
+ "OMIT_FLOATING_POINT",
+#endif
+#ifdef SQLITE_OMIT_FOREIGN_KEY
+ "OMIT_FOREIGN_KEY",
+#endif
+#ifdef SQLITE_OMIT_GET_TABLE
+ "OMIT_GET_TABLE",
+#endif
+#ifdef SQLITE_OMIT_HEX_INTEGER
+ "OMIT_HEX_INTEGER",
+#endif
+#ifdef SQLITE_OMIT_INCRBLOB
+ "OMIT_INCRBLOB",
+#endif
+#ifdef SQLITE_OMIT_INTEGRITY_CHECK
+ "OMIT_INTEGRITY_CHECK",
+#endif
+#ifdef SQLITE_OMIT_INTROSPECTION_PRAGMAS
+ "OMIT_INTROSPECTION_PRAGMAS",
+#endif
+#ifdef SQLITE_OMIT_JSON
+ "OMIT_JSON",
+#endif
+#ifdef SQLITE_OMIT_LIKE_OPTIMIZATION
+ "OMIT_LIKE_OPTIMIZATION",
+#endif
+#ifdef SQLITE_OMIT_LOAD_EXTENSION
+ "OMIT_LOAD_EXTENSION",
+#endif
+#ifdef SQLITE_OMIT_LOCALTIME
+ "OMIT_LOCALTIME",
+#endif
+#ifdef SQLITE_OMIT_LOOKASIDE
+ "OMIT_LOOKASIDE",
+#endif
+#ifdef SQLITE_OMIT_MEMORYDB
+ "OMIT_MEMORYDB",
+#endif
+#ifdef SQLITE_OMIT_OR_OPTIMIZATION
+ "OMIT_OR_OPTIMIZATION",
+#endif
+#ifdef SQLITE_OMIT_PAGER_PRAGMAS
+ "OMIT_PAGER_PRAGMAS",
+#endif
+#ifdef SQLITE_OMIT_PARSER_TRACE
+ "OMIT_PARSER_TRACE",
+#endif
+#ifdef SQLITE_OMIT_POPEN
+ "OMIT_POPEN",
+#endif
+#ifdef SQLITE_OMIT_PRAGMA
+ "OMIT_PRAGMA",
+#endif
+#ifdef SQLITE_OMIT_PROGRESS_CALLBACK
+ "OMIT_PROGRESS_CALLBACK",
+#endif
+#ifdef SQLITE_OMIT_QUICKBALANCE
+ "OMIT_QUICKBALANCE",
+#endif
+#ifdef SQLITE_OMIT_REINDEX
+ "OMIT_REINDEX",
+#endif
+#ifdef SQLITE_OMIT_SCHEMA_PRAGMAS
+ "OMIT_SCHEMA_PRAGMAS",
+#endif
+#ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
+ "OMIT_SCHEMA_VERSION_PRAGMAS",
+#endif
+#ifdef SQLITE_OMIT_SHARED_CACHE
+ "OMIT_SHARED_CACHE",
+#endif
+#ifdef SQLITE_OMIT_SHUTDOWN_DIRECTORIES
+ "OMIT_SHUTDOWN_DIRECTORIES",
+#endif
+#ifdef SQLITE_OMIT_SUBQUERY
+ "OMIT_SUBQUERY",
+#endif
+#ifdef SQLITE_OMIT_TCL_VARIABLE
+ "OMIT_TCL_VARIABLE",
+#endif
+#ifdef SQLITE_OMIT_TEMPDB
+ "OMIT_TEMPDB",
+#endif
+#ifdef SQLITE_OMIT_TEST_CONTROL
+ "OMIT_TEST_CONTROL",
+#endif
+#ifdef SQLITE_OMIT_TRACE
+# if SQLITE_OMIT_TRACE != 1
+ "OMIT_TRACE=" CTIMEOPT_VAL(SQLITE_OMIT_TRACE),
+# endif
+#endif
+#ifdef SQLITE_OMIT_TRIGGER
+ "OMIT_TRIGGER",
+#endif
+#ifdef SQLITE_OMIT_TRUNCATE_OPTIMIZATION
+ "OMIT_TRUNCATE_OPTIMIZATION",
+#endif
+#ifdef SQLITE_OMIT_UTF16
+ "OMIT_UTF16",
+#endif
+#ifdef SQLITE_OMIT_VACUUM
+ "OMIT_VACUUM",
+#endif
+#ifdef SQLITE_OMIT_VIEW
+ "OMIT_VIEW",
+#endif
+#ifdef SQLITE_OMIT_VIRTUALTABLE
+ "OMIT_VIRTUALTABLE",
+#endif
+#ifdef SQLITE_OMIT_WAL
+ "OMIT_WAL",
+#endif
+#ifdef SQLITE_OMIT_WSD
+ "OMIT_WSD",
+#endif
+#ifdef SQLITE_OMIT_XFER_OPT
+ "OMIT_XFER_OPT",
+#endif
+#ifdef SQLITE_PERFORMANCE_TRACE
+ "PERFORMANCE_TRACE",
+#endif
+#ifdef SQLITE_POWERSAFE_OVERWRITE
+# if SQLITE_POWERSAFE_OVERWRITE != 1
+ "POWERSAFE_OVERWRITE=" CTIMEOPT_VAL(SQLITE_POWERSAFE_OVERWRITE),
+# endif
+#endif
+#ifdef SQLITE_PREFER_PROXY_LOCKING
+ "PREFER_PROXY_LOCKING",
+#endif
+#ifdef SQLITE_PROXY_DEBUG
+ "PROXY_DEBUG",
+#endif
+#ifdef SQLITE_REVERSE_UNORDERED_SELECTS
+ "REVERSE_UNORDERED_SELECTS",
+#endif
+#ifdef SQLITE_RTREE_INT_ONLY
+ "RTREE_INT_ONLY",
+#endif
+#ifdef SQLITE_SECURE_DELETE
+ "SECURE_DELETE",
+#endif
+#ifdef SQLITE_SMALL_STACK
+ "SMALL_STACK",
+#endif
+#ifdef SQLITE_SORTER_PMASZ
+ "SORTER_PMASZ=" CTIMEOPT_VAL(SQLITE_SORTER_PMASZ),
+#endif
+#ifdef SQLITE_SOUNDEX
+ "SOUNDEX",
+#endif
+#ifdef SQLITE_STAT4_SAMPLES
+ "STAT4_SAMPLES=" CTIMEOPT_VAL(SQLITE_STAT4_SAMPLES),
+#endif
+#ifdef SQLITE_STMTJRNL_SPILL
+ "STMTJRNL_SPILL=" CTIMEOPT_VAL(SQLITE_STMTJRNL_SPILL),
+#endif
+#ifdef SQLITE_SUBSTR_COMPATIBILITY
+ "SUBSTR_COMPATIBILITY",
+#endif
+#if (!defined(SQLITE_WIN32_MALLOC) \
+ && !defined(SQLITE_ZERO_MALLOC) \
+ && !defined(SQLITE_MEMDEBUG) \
+ ) || defined(SQLITE_SYSTEM_MALLOC)
+ "SYSTEM_MALLOC",
+#endif
+#ifdef SQLITE_TCL
+ "TCL",
+#endif
+#ifdef SQLITE_TEMP_STORE
+ "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE),
+#endif
+#ifdef SQLITE_TEST
+ "TEST",
+#endif
+#if defined(SQLITE_THREADSAFE)
+ "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE),
+#elif defined(THREADSAFE)
+ "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE),
+#else
+ "THREADSAFE=1",
+#endif
+#ifdef SQLITE_UNLINK_AFTER_CLOSE
+ "UNLINK_AFTER_CLOSE",
+#endif
+#ifdef SQLITE_UNTESTABLE
+ "UNTESTABLE",
+#endif
+#ifdef SQLITE_USER_AUTHENTICATION
+ "USER_AUTHENTICATION",
+#endif
+#ifdef SQLITE_USE_ALLOCA
+ "USE_ALLOCA",
+#endif
+#ifdef SQLITE_USE_FCNTL_TRACE
+ "USE_FCNTL_TRACE",
+#endif
+#ifdef SQLITE_USE_URI
+ "USE_URI",
+#endif
+#ifdef SQLITE_VDBE_COVERAGE
+ "VDBE_COVERAGE",
+#endif
+#ifdef SQLITE_WIN32_MALLOC
+ "WIN32_MALLOC",
+#endif
+#ifdef SQLITE_ZERO_MALLOC
+ "ZERO_MALLOC",
+#endif
+
+} ;
+
+SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){
+ *pnOpt = sizeof(sqlite3azCompileOpt) / sizeof(sqlite3azCompileOpt[0]);
+ return (const char**)sqlite3azCompileOpt;
+}
+
+#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
+
+/************** End of ctime.c ***********************************************/
/************** Begin file global.c ******************************************/
/*
** 2008 June 13
@@ -20891,7 +22204,7 @@ SQLITE_PRIVATE const unsigned char *sqlite3aGTb = &sqlite3UpperToLower[256+12-OP
** isalnum() 0x06
** isxdigit() 0x08
** toupper() 0x20
-** SQLite identifier character 0x40
+** SQLite identifier character 0x40 $, _, or non-ascii
** Quote character 0x80
**
** Bit 0x20 is set if the mapped character requires translation to upper
@@ -21080,9 +22393,13 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = {
0, /* xTestCallback */
#endif
0, /* bLocaltimeFault */
+ 0, /* xAltLocaltime */
0x7ffffffe, /* iOnceResetThreshold */
SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */
0, /* iPrngSeed */
+#ifdef SQLITE_DEBUG
+ {0,0,0,0,0,0}, /* aTune */
+#endif
};
/*
@@ -21092,6 +22409,18 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = {
*/
SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions;
+#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG)
+/*
+** Counter used for coverage testing. Does not come into play for
+** release builds.
+**
+** Access to this global variable is not mutex protected. This might
+** result in TSAN warnings. But as the variable does not exist in
+** release builds, that should not be a concern.
+*/
+SQLITE_PRIVATE unsigned int sqlite3CoverageCounter;
+#endif /* SQLITE_COVERAGE_TEST || SQLITE_DEBUG */
+
#ifdef VDBE_PROFILE
/*
** The following performance counter can be used in place of
@@ -21125,7 +22454,7 @@ SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000;
/*
** Tracing flags set by SQLITE_TESTCTRL_TRACEFLAGS.
*/
-SQLITE_PRIVATE u32 sqlite3SelectTrace = 0;
+SQLITE_PRIVATE u32 sqlite3TreeTrace = 0;
SQLITE_PRIVATE u32 sqlite3WhereTrace = 0;
/* #include "opcodes.h" */
@@ -21142,6 +22471,36 @@ SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER;
*/
SQLITE_PRIVATE const char sqlite3StrBINARY[] = "BINARY";
+/*
+** Standard typenames. These names must match the COLTYPE_* definitions.
+** Adjust the SQLITE_N_STDTYPE value if adding or removing entries.
+**
+** sqlite3StdType[] The actual names of the datatypes.
+**
+** sqlite3StdTypeLen[] The length (in bytes) of each entry
+** in sqlite3StdType[].
+**
+** sqlite3StdTypeAffinity[] The affinity associated with each entry
+** in sqlite3StdType[].
+*/
+SQLITE_PRIVATE const unsigned char sqlite3StdTypeLen[] = { 3, 4, 3, 7, 4, 4 };
+SQLITE_PRIVATE const char sqlite3StdTypeAffinity[] = {
+ SQLITE_AFF_NUMERIC,
+ SQLITE_AFF_BLOB,
+ SQLITE_AFF_INTEGER,
+ SQLITE_AFF_INTEGER,
+ SQLITE_AFF_REAL,
+ SQLITE_AFF_TEXT
+};
+SQLITE_PRIVATE const char *sqlite3StdType[] = {
+ "ANY",
+ "BLOB",
+ "INT",
+ "INTEGER",
+ "REAL",
+ "TEXT"
+};
+
/************** End of global.c **********************************************/
/************** Begin file status.c ******************************************/
/*
@@ -21239,7 +22598,7 @@ typedef struct AuxData AuxData;
typedef struct VdbeCursor VdbeCursor;
struct VdbeCursor {
u8 eCurType; /* One of the CURTYPE_* values above */
- i8 iDb; /* Index of cursor database in db->aDb[] (or -1) */
+ i8 iDb; /* Index of cursor database in db->aDb[] */
u8 nullRow; /* True if pointing to a row with no data */
u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */
u8 isTable; /* True for rowid tables. False for indexes */
@@ -21250,11 +22609,13 @@ struct VdbeCursor {
Bool isEphemeral:1; /* True for an ephemeral table */
Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */
Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */
- Bool hasBeenDuped:1; /* This cursor was source or target of OP_OpenDup */
+ Bool noReuse:1; /* OpenEphemeral may not reuse this cursor */
u16 seekHit; /* See the OP_SeekHit and OP_IfNoHope opcodes */
- Btree *pBtx; /* Separate file holding temporary table */
+ union { /* pBtx for isEphermeral. pAltMap otherwise */
+ Btree *pBtx; /* Separate file holding temporary table */
+ u32 *aAltMap; /* Mapping from table to index column numbers */
+ } ub;
i64 seqCount; /* Sequence counter */
- u32 *aAltMap; /* Mapping from table to index column numbers */
/* Cached OP_Column parse information is only valid if cacheStatus matches
** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of
@@ -21296,6 +22657,11 @@ struct VdbeCursor {
u32 aType[1]; /* Type values record decode. MUST BE LAST */
};
+/* Return true if P is a null-only cursor
+*/
+#define IsNullCursor(P) \
+ ((P)->eCurType==CURTYPE_PSEUDO && (P)->nullRow && (P)->seekResult==0)
+
/*
** A value for VdbeCursor.cacheStatus that means the cache is always invalid.
@@ -21328,7 +22694,6 @@ struct VdbeFrame {
Vdbe *v; /* VM this frame belongs to */
VdbeFrame *pParent; /* Parent of this frame, or NULL if parent is main */
Op *aOp; /* Program instructions for parent frame */
- i64 *anExec; /* Event counters from parent frame */
Mem *aMem; /* Array of memory cells for parent frame */
VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */
u8 *aOnce; /* Bitmask used by OP_Once */
@@ -21344,8 +22709,8 @@ struct VdbeFrame {
int nMem; /* Number of entries in aMem */
int nChildMem; /* Number of memory cells for child frame */
int nChildCsr; /* Number of cursors for child frame */
- int nChange; /* Statement changes (Vdbe.nChange) */
- int nDbChange; /* Value of db->nChange */
+ i64 nChange; /* Statement changes (Vdbe.nChange) */
+ i64 nDbChange; /* Value of db->nChange */
};
/* Magic number for sanity checking on VdbeFrame objects */
@@ -21370,16 +22735,16 @@ struct sqlite3_value {
const char *zPType; /* Pointer type when MEM_Term|MEM_Subtype|MEM_Null */
FuncDef *pDef; /* Used only when flags==MEM_Agg */
} u;
+ char *z; /* String or BLOB value */
+ int n; /* Number of characters in string value, excluding '\0' */
u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */
u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */
u8 eSubtype; /* Subtype for this value */
- int n; /* Number of characters in string value, excluding '\0' */
- char *z; /* String or BLOB value */
/* ShallowCopy only needs to copy the information above */
- char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */
+ sqlite3 *db; /* The associated database connection */
int szMalloc; /* Size of the zMalloc allocation */
u32 uTemp; /* Transient storage for serial_type in OP_MakeRecord */
- sqlite3 *db; /* The associated database connection */
+ char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */
void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */
#ifdef SQLITE_DEBUG
Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */
@@ -21391,11 +22756,43 @@ struct sqlite3_value {
** Size of struct Mem not including the Mem.zMalloc member or anything that
** follows.
*/
-#define MEMCELLSIZE offsetof(Mem,zMalloc)
+#define MEMCELLSIZE offsetof(Mem,db)
-/* One or more of the following flags are set to indicate the validOK
+/* One or more of the following flags are set to indicate the
** representations of the value stored in the Mem struct.
**
+** * MEM_Null An SQL NULL value
+**
+** * MEM_Null|MEM_Zero An SQL NULL with the virtual table
+** UPDATE no-change flag set
+**
+** * MEM_Null|MEM_Term| An SQL NULL, but also contains a
+** MEM_Subtype pointer accessible using
+** sqlite3_value_pointer().
+**
+** * MEM_Null|MEM_Cleared Special SQL NULL that compares non-equal
+** to other NULLs even using the IS operator.
+**
+** * MEM_Str A string, stored in Mem.z with
+** length Mem.n. Zero-terminated if
+** MEM_Term is set. This flag is
+** incompatible with MEM_Blob and
+** MEM_Null, but can appear with MEM_Int,
+** MEM_Real, and MEM_IntReal.
+**
+** * MEM_Blob A blob, stored in Mem.z length Mem.n.
+** Incompatible with MEM_Str, MEM_Null,
+** MEM_Int, MEM_Real, and MEM_IntReal.
+**
+** * MEM_Blob|MEM_Zero A blob in Mem.z of length Mem.n plus
+** MEM.u.i extra 0x00 bytes at the end.
+**
+** * MEM_Int Integer stored in Mem.u.i.
+**
+** * MEM_Real Real stored in Mem.u.r.
+**
+** * MEM_IntReal Real stored as an integer in Mem.u.i.
+**
** If the MEM_Null flag is set, then the value is an SQL NULL value.
** For a pointer type created using sqlite3_bind_pointer() or
** sqlite3_result_pointer() the MEM_Term and MEM_Subtype flags are also set.
@@ -21406,6 +22803,7 @@ struct sqlite3_value {
** set, then the string is nul terminated. The MEM_Int and MEM_Real
** flags may coexist with the MEM_Str flag.
*/
+#define MEM_Undefined 0x0000 /* Value is undefined */
#define MEM_Null 0x0001 /* Value is NULL (or a pointer) */
#define MEM_Str 0x0002 /* Value is a string */
#define MEM_Int 0x0004 /* Value is an integer */
@@ -21413,28 +22811,24 @@ struct sqlite3_value {
#define MEM_Blob 0x0010 /* Value is a BLOB */
#define MEM_IntReal 0x0020 /* MEM_Int that stringifies like MEM_Real */
#define MEM_AffMask 0x003f /* Mask of affinity bits */
+
+/* Extra bits that modify the meanings of the core datatypes above
+*/
#define MEM_FromBind 0x0040 /* Value originates from sqlite3_bind() */
-#define MEM_Undefined 0x0080 /* Value is undefined */
+ /* 0x0080 // Available */
#define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */
-#define MEM_TypeMask 0xc1bf /* Mask of type bits */
-
+#define MEM_Term 0x0200 /* String in Mem.z is zero terminated */
+#define MEM_Zero 0x0400 /* Mem.i contains count of 0s appended to blob */
+#define MEM_Subtype 0x0800 /* Mem.eSubtype is valid */
+#define MEM_TypeMask 0x0dbf /* Mask of type bits */
-/* Whenever Mem contains a valid string or blob representation, one of
-** the following flags must be set to determine the memory management
-** policy for Mem.z. The MEM_Term flag tells us whether or not the
-** string is \000 or \u0000 terminated
+/* Bits that determine the storage for Mem.z for a string or blob or
+** aggregate accumulator.
*/
-#define MEM_Term 0x0200 /* String in Mem.z is zero terminated */
-#define MEM_Dyn 0x0400 /* Need to call Mem.xDel() on Mem.z */
-#define MEM_Static 0x0800 /* Mem.z points to a static string */
-#define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */
-#define MEM_Agg 0x2000 /* Mem.z points to an agg function context */
-#define MEM_Zero 0x4000 /* Mem.i contains count of 0s appended to blob */
-#define MEM_Subtype 0x8000 /* Mem.eSubtype is valid */
-#ifdef SQLITE_OMIT_INCRBLOB
- #undef MEM_Zero
- #define MEM_Zero 0x0000
-#endif
+#define MEM_Dyn 0x1000 /* Need to call Mem.xDel() on Mem.z */
+#define MEM_Static 0x2000 /* Mem.z points to a static string */
+#define MEM_Ephem 0x4000 /* Mem.z points to an ephemeral string */
+#define MEM_Agg 0x8000 /* Mem.z points to an agg function context */
/* Return TRUE if Mem X contains dynamically allocated content - anything
** that needs to be deallocated to avoid a leak.
@@ -21456,11 +22850,15 @@ struct sqlite3_value {
&& (X)->n==0 && (X)->u.nZero==0)
/*
-** Return true if a memory cell is not marked as invalid. This macro
+** Return true if a memory cell has been initialized and is valid.
** is for use inside assert() statements only.
+**
+** A Memory cell is initialized if at least one of the
+** MEM_Null, MEM_Str, MEM_Int, MEM_Real, MEM_Blob, or MEM_IntReal bits
+** is set. It is "undefined" if all those bits are zero.
*/
#ifdef SQLITE_DEBUG
-#define memIsValid(M) ((M)->flags & MEM_Undefined)==0
+#define memIsValid(M) ((M)->flags & MEM_AffMask)!=0
#endif
/*
@@ -21498,6 +22896,7 @@ struct sqlite3_context {
Vdbe *pVdbe; /* The VM that owns this context */
int iOp; /* Instruction number of OP_Function */
int isError; /* Error code returned by the function. */
+ u8 enc; /* Encoding to use for results */
u8 skipFlag; /* Skip accumulator loading if true */
u8 argc; /* Number of arguments */
sqlite3_value *argv[1]; /* Argument set */
@@ -21510,10 +22909,19 @@ typedef unsigned bft; /* Bit Field Type */
/* The ScanStatus object holds a single value for the
** sqlite3_stmt_scanstatus() interface.
+**
+** aAddrRange[]:
+** This array is used by ScanStatus elements associated with EQP
+** notes that make an SQLITE_SCANSTAT_NCYCLE value available. It is
+** an array of up to 3 ranges of VM addresses for which the Vdbe.anCycle[]
+** values should be summed to calculate the NCYCLE value. Each pair of
+** integer addresses is a start and end address (both inclusive) for a range
+** instructions. A start value of 0 indicates an empty range.
*/
typedef struct ScanStatus ScanStatus;
struct ScanStatus {
int addrExplain; /* OP_Explain for loop */
+ int aAddrRange[6];
int addrLoop; /* Address of "loops" counter */
int addrVisit; /* Address of "rows visited" counter */
int iSelectID; /* The "Select-ID" for this loop */
@@ -21543,16 +22951,15 @@ struct DblquoteStr {
*/
struct Vdbe {
sqlite3 *db; /* The database connection that owns this statement */
- Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */
+ Vdbe **ppVPrev,*pVNext; /* Linked list of VDBEs with the same Vdbe.db */
Parse *pParse; /* Parsing context used to create this Vdbe */
ynVar nVar; /* Number of entries in aVar[] */
- u32 iVdbeMagic; /* Magic number defining state of the SQL statement */
int nMem; /* Number of memory locations currently allocated */
int nCursor; /* Number of slots in apCsr[] */
u32 cacheCtr; /* VdbeCursor row cache generation counter */
int pc; /* The program counter */
int rc; /* Value to return */
- int nChange; /* Number of db changes made since last reset */
+ i64 nChange; /* Number of db changes made since last reset */
int iStatement; /* Statement number (or 0 if has no opened stmt) */
i64 iCurrentTime; /* Value of julianday('now') for this statement */
i64 nFkConstraint; /* Number of imm. FK constraints this VM */
@@ -21570,7 +22977,7 @@ struct Vdbe {
int nOp; /* Number of instructions in the program */
int nOpAlloc; /* Slots allocated for aOp[] */
Mem *aColName; /* Column names to return */
- Mem *pResultSet; /* Pointer to an array of results */
+ Mem *pResultRow; /* Current output row */
char *zErrMsg; /* Error message written here */
VList *pVList; /* Name of variables */
#ifndef SQLITE_OMIT_TRACE
@@ -21584,17 +22991,16 @@ struct Vdbe {
u8 errorAction; /* Recovery action to do in case of an error */
u8 minWriteFileFormat; /* Minimum file format for writable database files */
u8 prepFlags; /* SQLITE_PREPARE_* flags */
- u8 doingRerun; /* True if rerunning after an auto-reprepare */
+ u8 eVdbeState; /* On of the VDBE_*_STATE values */
bft expired:2; /* 1: recompile VM immediately 2: when convenient */
bft explain:2; /* True if EXPLAIN present on SQL command */
bft changeCntOn:1; /* True to update the change-counter */
- bft runOnlyOnce:1; /* Automatically expire on reset */
bft usesStmtJournal:1; /* True if uses a statement journal */
bft readOnly:1; /* True for statements that do not write */
bft bIsReader:1; /* True for statements that read */
yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */
yDbMask lockMask; /* Subset of btreeMask that requires a lock */
- u32 aCounter[7]; /* Counters used by sqlite3_stmt_status() */
+ u32 aCounter[9]; /* Counters used by sqlite3_stmt_status() */
char *zSql; /* Text of the SQL statement that generated this */
#ifdef SQLITE_ENABLE_NORMALIZE
char *zNormSql; /* Normalization of the associated SQL statement */
@@ -21608,20 +23014,18 @@ struct Vdbe {
SubProgram *pProgram; /* Linked list of all sub-programs used by VM */
AuxData *pAuxData; /* Linked list of auxdata allocations */
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
- i64 *anExec; /* Number of times each op has been executed */
int nScan; /* Entries in aScan[] */
ScanStatus *aScan; /* Scan definitions for sqlite3_stmt_scanstatus() */
#endif
};
/*
-** The following are allowed values for Vdbe.magic
+** The following are allowed values for Vdbe.eVdbeState
*/
-#define VDBE_MAGIC_INIT 0x16bceaa5 /* Building a VDBE program */
-#define VDBE_MAGIC_RUN 0x2df20da3 /* VDBE is ready to execute */
-#define VDBE_MAGIC_HALT 0x319c2973 /* VDBE has completed execution */
-#define VDBE_MAGIC_RESET 0x48fa9f76 /* Reset and ready to run again */
-#define VDBE_MAGIC_DEAD 0x5606c3c8 /* The VDBE has been deallocated */
+#define VDBE_INIT_STATE 0 /* Prepared statement under construction */
+#define VDBE_READY_STATE 1 /* Ready to run but not yet started */
+#define VDBE_RUN_STATE 2 /* Run in progress */
+#define VDBE_HALT_STATE 3 /* Finished. Need reset() or finalize() */
/*
** Structure used to store the context required by the
@@ -21645,18 +23049,49 @@ struct PreUpdate {
};
/*
+** An instance of this object is used to pass an vector of values into
+** OP_VFilter, the xFilter method of a virtual table. The vector is the
+** set of values on the right-hand side of an IN constraint.
+**
+** The value as passed into xFilter is an sqlite3_value with a "pointer"
+** type, such as is generated by sqlite3_result_pointer() and read by
+** sqlite3_value_pointer. Such values have MEM_Term|MEM_Subtype|MEM_Null
+** and a subtype of 'p'. The sqlite3_vtab_in_first() and _next() interfaces
+** know how to use this object to step through all the values in the
+** right operand of the IN constraint.
+*/
+typedef struct ValueList ValueList;
+struct ValueList {
+ BtCursor *pCsr; /* An ephemeral table holding all values */
+ sqlite3_value *pOut; /* Register to hold each decoded output value */
+};
+
+/* Size of content associated with serial types that fit into a
+** single-byte varint.
+*/
+#ifndef SQLITE_AMALGAMATION
+SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[];
+#endif
+
+/*
** Function prototypes
*/
SQLITE_PRIVATE void sqlite3VdbeError(Vdbe*, const char *, ...);
SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*);
+SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe*,VdbeCursor*);
void sqliteVdbePopStack(Vdbe*,int);
+SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p);
SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor*);
-SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, u32*);
SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*);
SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32);
SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8);
-SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32);
-SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
+#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
+SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in);
+# define swapMixedEndianFloat(X) X = sqlite3FloatSwap(X)
+#else
+# define swapMixedEndianFloat(X)
+#endif
+SQLITE_PRIVATE void sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int);
int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);
@@ -21690,14 +23125,19 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem*, double);
SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(Mem*, void*, const char*, void(*)(void*));
SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem*,sqlite3*,u16);
SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*);
+#ifndef SQLITE_OMIT_INCRBLOB
SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int);
+#else
+SQLITE_PRIVATE int sqlite3VdbeMemSetZeroBlob(Mem*,int);
+#endif
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem*);
#endif
SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8);
-SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*);
+SQLITE_PRIVATE int sqlite3IntFloatCompare(i64,double);
+SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*);
SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*);
SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull);
@@ -21708,6 +23148,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem*,u8,u8);
SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset(BtCursor*,u32,Mem*);
SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p);
+SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem*p);
SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
#ifndef SQLITE_OMIT_WINDOWFUNC
SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*);
@@ -21739,6 +23180,8 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *, int *);
SQLITE_PRIVATE int sqlite3VdbeSorterWrite(const VdbeCursor *, Mem *);
SQLITE_PRIVATE int sqlite3VdbeSorterCompare(const VdbeCursor *, Mem *, int, int *);
+SQLITE_PRIVATE void sqlite3VdbeValueListFree(void*);
+
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe*, VdbeCursor*);
SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe*);
@@ -22067,6 +23510,8 @@ SQLITE_API int sqlite3_db_status(
sqlite3BtreeEnterAll(db);
db->pnBytesFreed = &nByte;
+ assert( db->lookaside.pEnd==db->lookaside.pTrueEnd );
+ db->lookaside.pEnd = db->lookaside.pStart;
for(i=0; i<db->nDb; i++){
Schema *pSchema = db->aDb[i].pSchema;
if( ALWAYS(pSchema!=0) ){
@@ -22092,6 +23537,7 @@ SQLITE_API int sqlite3_db_status(
}
}
db->pnBytesFreed = 0;
+ db->lookaside.pEnd = db->lookaside.pTrueEnd;
sqlite3BtreeLeaveAll(db);
*pHighwater = 0;
@@ -22109,10 +23555,12 @@ SQLITE_API int sqlite3_db_status(
int nByte = 0; /* Used to accumulate return value */
db->pnBytesFreed = &nByte;
- for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){
- sqlite3VdbeClearObject(db, pVdbe);
- sqlite3DbFree(db, pVdbe);
+ assert( db->lookaside.pEnd==db->lookaside.pTrueEnd );
+ db->lookaside.pEnd = db->lookaside.pStart;
+ for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pVNext){
+ sqlite3VdbeDelete(pVdbe);
}
+ db->lookaside.pEnd = db->lookaside.pTrueEnd;
db->pnBytesFreed = 0;
*pHighwater = 0; /* IMP: R-64479-57858 */
@@ -22249,6 +23697,7 @@ struct DateTime {
char validTZ; /* True (1) if tz is valid */
char tzSet; /* Timezone was set explicitly */
char isError; /* An overflow has occurred */
+ char useSubsec; /* Display subsecond precision */
};
@@ -22448,7 +23897,7 @@ static void computeJD(DateTime *p){
p->iJD = (sqlite3_int64)((X1 + X2 + D + B - 1524.5 ) * 86400000);
p->validJD = 1;
if( p->validHMS ){
- p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000);
+ p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000 + 0.5);
if( p->validTZ ){
p->iJD -= p->tz*60000;
p->validYMD = 0;
@@ -22563,6 +24012,11 @@ static int parseDateOrTime(
}else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){
setRawDateNumber(p, r);
return 0;
+ }else if( (sqlite3StrICmp(zDate,"subsec")==0
+ || sqlite3StrICmp(zDate,"subsecond")==0)
+ && sqlite3NotPureFunc(context) ){
+ p->useSubsec = 1;
+ return setDateTimeToCurrent(context, p);
}
return 1;
}
@@ -22675,8 +24129,10 @@ static void clearYMD_HMS_TZ(DateTime *p){
** is available. This routine returns 0 on success and
** non-zero on any kind of error.
**
-** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this
-** routine will always fail.
+** If the sqlite3GlobalConfig.bLocaltimeFault variable is non-zero then this
+** routine will always fail. If bLocaltimeFault is nonzero and
+** sqlite3GlobalConfig.xAltLocaltime is not NULL, then xAltLocaltime() is
+** invoked in place of the OS-defined localtime() function.
**
** EVIDENCE-OF: R-62172-00036 In this implementation, the standard C
** library function localtime_r() is used to assist in the calculation of
@@ -22692,14 +24148,30 @@ static int osLocaltime(time_t *t, struct tm *pTm){
sqlite3_mutex_enter(mutex);
pX = localtime(t);
#ifndef SQLITE_UNTESTABLE
- if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0;
+ if( sqlite3GlobalConfig.bLocaltimeFault ){
+ if( sqlite3GlobalConfig.xAltLocaltime!=0
+ && 0==sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm)
+ ){
+ pX = pTm;
+ }else{
+ pX = 0;
+ }
+ }
#endif
if( pX ) *pTm = *pX;
+#if SQLITE_THREADSAFE>0
sqlite3_mutex_leave(mutex);
+#endif
rc = pX==0;
#else
#ifndef SQLITE_UNTESTABLE
- if( sqlite3GlobalConfig.bLocaltimeFault ) return 1;
+ if( sqlite3GlobalConfig.bLocaltimeFault ){
+ if( sqlite3GlobalConfig.xAltLocaltime!=0 ){
+ return sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm);
+ }else{
+ return 1;
+ }
+ }
#endif
#if HAVE_LOCALTIME_R
rc = localtime_r(t, pTm)==0;
@@ -22714,67 +24186,56 @@ static int osLocaltime(time_t *t, struct tm *pTm){
#ifndef SQLITE_OMIT_LOCALTIME
/*
-** Compute the difference (in milliseconds) between localtime and UTC
-** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs,
-** return this value and set *pRc to SQLITE_OK.
-**
-** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value
-** is undefined in this case.
+** Assuming the input DateTime is UTC, move it to its localtime equivalent.
*/
-static sqlite3_int64 localtimeOffset(
- DateTime *p, /* Date at which to calculate offset */
- sqlite3_context *pCtx, /* Write error here if one occurs */
- int *pRc /* OUT: Error code. SQLITE_OK or ERROR */
+static int toLocaltime(
+ DateTime *p, /* Date at which to calculate offset */
+ sqlite3_context *pCtx /* Write error here if one occurs */
){
- DateTime x, y;
time_t t;
struct tm sLocal;
+ int iYearDiff;
/* Initialize the contents of sLocal to avoid a compiler warning. */
memset(&sLocal, 0, sizeof(sLocal));
- x = *p;
- computeYMD_HMS(&x);
- if( x.Y<1971 || x.Y>=2038 ){
+ computeJD(p);
+ if( p->iJD<2108667600*(i64)100000 /* 1970-01-01 */
+ || p->iJD>2130141456*(i64)100000 /* 2038-01-18 */
+ ){
/* EVIDENCE-OF: R-55269-29598 The localtime_r() C function normally only
** works for years between 1970 and 2037. For dates outside this range,
** SQLite attempts to map the year into an equivalent year within this
** range, do the calculation, then map the year back.
*/
- x.Y = 2000;
- x.M = 1;
- x.D = 1;
- x.h = 0;
- x.m = 0;
- x.s = 0.0;
- } else {
- int s = (int)(x.s + 0.5);
- x.s = s;
+ DateTime x = *p;
+ computeYMD_HMS(&x);
+ iYearDiff = (2000 + x.Y%4) - x.Y;
+ x.Y += iYearDiff;
+ x.validJD = 0;
+ computeJD(&x);
+ t = (time_t)(x.iJD/1000 - 21086676*(i64)10000);
+ }else{
+ iYearDiff = 0;
+ t = (time_t)(p->iJD/1000 - 21086676*(i64)10000);
}
- x.tz = 0;
- x.validJD = 0;
- computeJD(&x);
- t = (time_t)(x.iJD/1000 - 21086676*(i64)10000);
if( osLocaltime(&t, &sLocal) ){
sqlite3_result_error(pCtx, "local time unavailable", -1);
- *pRc = SQLITE_ERROR;
- return 0;
+ return SQLITE_ERROR;
}
- y.Y = sLocal.tm_year + 1900;
- y.M = sLocal.tm_mon + 1;
- y.D = sLocal.tm_mday;
- y.h = sLocal.tm_hour;
- y.m = sLocal.tm_min;
- y.s = sLocal.tm_sec;
- y.validYMD = 1;
- y.validHMS = 1;
- y.validJD = 0;
- y.rawS = 0;
- y.validTZ = 0;
- y.isError = 0;
- computeJD(&y);
- *pRc = SQLITE_OK;
- return y.iJD - x.iJD;
+ p->Y = sLocal.tm_year + 1900 - iYearDiff;
+ p->M = sLocal.tm_mon + 1;
+ p->D = sLocal.tm_mday;
+ p->h = sLocal.tm_hour;
+ p->m = sLocal.tm_min;
+ p->s = sLocal.tm_sec + (p->iJD%1000)*0.001;
+ p->validYMD = 1;
+ p->validHMS = 1;
+ p->validJD = 0;
+ p->rawS = 0;
+ p->validTZ = 0;
+ p->isError = 0;
+ return SQLITE_OK;
}
#endif /* SQLITE_OMIT_LOCALTIME */
@@ -22787,18 +24248,17 @@ static sqlite3_int64 localtimeOffset(
** of several units of time.
*/
static const struct {
- u8 eType; /* Transformation type code */
- u8 nName; /* Length of th name */
- char *zName; /* Name of the transformation */
- double rLimit; /* Maximum NNN value for this transform */
- double rXform; /* Constant used for this transform */
+ u8 nName; /* Length of the name */
+ char zName[7]; /* Name of the transformation */
+ float rLimit; /* Maximum NNN value for this transform */
+ float rXform; /* Constant used for this transform */
} aXformType[] = {
- { 0, 6, "second", 464269060800.0, 1000.0 },
- { 0, 6, "minute", 7737817680.0, 60000.0 },
- { 0, 4, "hour", 128963628.0, 3600000.0 },
- { 0, 3, "day", 5373485.0, 86400000.0 },
- { 1, 5, "month", 176546.0, 2592000000.0 },
- { 2, 4, "year", 14713.0, 31536000000.0 },
+ { 6, "second", 4.6427e+14, 1.0 },
+ { 6, "minute", 7.7379e+12, 60.0 },
+ { 4, "hour", 1.2897e+11, 3600.0 },
+ { 3, "day", 5373485.0, 86400.0 },
+ { 5, "month", 176546.0, 2592000.0 },
+ { 4, "year", 14713.0, 31536000.0 },
};
/*
@@ -22829,11 +24289,55 @@ static int parseModifier(
sqlite3_context *pCtx, /* Function context */
const char *z, /* The text of the modifier */
int n, /* Length of zMod in bytes */
- DateTime *p /* The date/time value to be modified */
+ DateTime *p, /* The date/time value to be modified */
+ int idx /* Parameter index of the modifier */
){
int rc = 1;
double r;
switch(sqlite3UpperToLower[(u8)z[0]] ){
+ case 'a': {
+ /*
+ ** auto
+ **
+ ** If rawS is available, then interpret as a julian day number, or
+ ** a unix timestamp, depending on its magnitude.
+ */
+ if( sqlite3_stricmp(z, "auto")==0 ){
+ if( idx>1 ) return 1; /* IMP: R-33611-57934 */
+ if( !p->rawS || p->validJD ){
+ rc = 0;
+ p->rawS = 0;
+ }else if( p->s>=-21086676*(i64)10000 /* -4713-11-24 12:00:00 */
+ && p->s<=(25340230*(i64)10000)+799 /* 9999-12-31 23:59:59 */
+ ){
+ r = p->s*1000.0 + 210866760000000.0;
+ clearYMD_HMS_TZ(p);
+ p->iJD = (sqlite3_int64)(r + 0.5);
+ p->validJD = 1;
+ p->rawS = 0;
+ rc = 0;
+ }
+ }
+ break;
+ }
+ case 'j': {
+ /*
+ ** julianday
+ **
+ ** Always interpret the prior number as a julian-day value. If this
+ ** is not the first modifier, or if the prior argument is not a numeric
+ ** value in the allowed range of julian day numbers understood by
+ ** SQLite (0..5373484.5) then the result will be NULL.
+ */
+ if( sqlite3_stricmp(z, "julianday")==0 ){
+ if( idx>1 ) return 1; /* IMP: R-31176-64601 */
+ if( p->validJD && p->rawS ){
+ rc = 0;
+ p->rawS = 0;
+ }
+ }
+ break;
+ }
#ifndef SQLITE_OMIT_LOCALTIME
case 'l': {
/* localtime
@@ -22842,9 +24346,7 @@ static int parseModifier(
** show local time.
*/
if( sqlite3_stricmp(z, "localtime")==0 && sqlite3NotPureFunc(pCtx) ){
- computeJD(p);
- p->iJD += localtimeOffset(p, pCtx, &rc);
- clearYMD_HMS_TZ(p);
+ rc = toLocaltime(p, pCtx);
}
break;
}
@@ -22857,6 +24359,7 @@ static int parseModifier(
** seconds since 1970. Convert to a real julian day number.
*/
if( sqlite3_stricmp(z, "unixepoch")==0 && p->rawS ){
+ if( idx>1 ) return 1; /* IMP: R-49255-55373 */
r = p->s*1000.0 + 210866760000000.0;
if( r>=0.0 && r<464269060800000.0 ){
clearYMD_HMS_TZ(p);
@@ -22869,18 +24372,31 @@ static int parseModifier(
#ifndef SQLITE_OMIT_LOCALTIME
else if( sqlite3_stricmp(z, "utc")==0 && sqlite3NotPureFunc(pCtx) ){
if( p->tzSet==0 ){
- sqlite3_int64 c1;
+ i64 iOrigJD; /* Original localtime */
+ i64 iGuess; /* Guess at the corresponding utc time */
+ int cnt = 0; /* Safety to prevent infinite loop */
+ i64 iErr; /* Guess is off by this much */
+
computeJD(p);
- c1 = localtimeOffset(p, pCtx, &rc);
- if( rc==SQLITE_OK ){
- p->iJD -= c1;
- clearYMD_HMS_TZ(p);
- p->iJD += c1 - localtimeOffset(p, pCtx, &rc);
- }
+ iGuess = iOrigJD = p->iJD;
+ iErr = 0;
+ do{
+ DateTime new;
+ memset(&new, 0, sizeof(new));
+ iGuess -= iErr;
+ new.iJD = iGuess;
+ new.validJD = 1;
+ rc = toLocaltime(&new, pCtx);
+ if( rc ) return rc;
+ computeJD(&new);
+ iErr = new.iJD - iOrigJD;
+ }while( iErr && cnt++<3 );
+ memset(p, 0, sizeof(*p));
+ p->iJD = iGuess;
+ p->validJD = 1;
p->tzSet = 1;
- }else{
- rc = SQLITE_OK;
}
+ rc = SQLITE_OK;
}
#endif
break;
@@ -22895,7 +24411,7 @@ static int parseModifier(
*/
if( sqlite3_strnicmp(z, "weekday ", 8)==0
&& sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8)>0
- && (n=(int)r)==r && n>=0 && r<7 ){
+ && r>=0.0 && r<7.0 && (n=(int)r)==r ){
sqlite3_int64 Z;
computeYMD_HMS(p);
p->validTZ = 0;
@@ -22915,8 +24431,22 @@ static int parseModifier(
**
** Move the date backwards to the beginning of the current day,
** or month or year.
+ **
+ ** subsecond
+ ** subsec
+ **
+ ** Show subsecond precision in the output of datetime() and
+ ** unixepoch() and strftime('%s').
*/
- if( sqlite3_strnicmp(z, "start of ", 9)!=0 ) break;
+ if( sqlite3_strnicmp(z, "start of ", 9)!=0 ){
+ if( sqlite3_stricmp(z, "subsec")==0
+ || sqlite3_stricmp(z, "subsecond")==0
+ ){
+ p->useSubsec = 1;
+ rc = 0;
+ }
+ break;
+ }
if( !p->validJD && !p->validYMD && !p->validHMS ) break;
z += 9;
computeYMD(p);
@@ -22996,9 +24526,10 @@ static int parseModifier(
&& sqlite3_strnicmp(aXformType[i].zName, z, n)==0
&& r>-aXformType[i].rLimit && r<aXformType[i].rLimit
){
- switch( aXformType[i].eType ){
- case 1: { /* Special processing to add months */
+ switch( i ){
+ case 4: { /* Special processing to add months */
int x;
+ assert( strcmp(aXformType[i].zName,"month")==0 );
computeYMD_HMS(p);
p->M += (int)r;
x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12;
@@ -23008,8 +24539,9 @@ static int parseModifier(
r -= (int)r;
break;
}
- case 2: { /* Special processing to add years */
+ case 5: { /* Special processing to add years */
int y = (int)r;
+ assert( strcmp(aXformType[i].zName,"year")==0 );
computeYMD_HMS(p);
p->Y += y;
p->validJD = 0;
@@ -23018,7 +24550,7 @@ static int parseModifier(
}
}
computeJD(p);
- p->iJD += (sqlite3_int64)(r*aXformType[i].rXform + rRounder);
+ p->iJD += (sqlite3_int64)(r*1000.0*aXformType[i].rXform + rRounder);
rc = 0;
break;
}
@@ -23068,7 +24600,7 @@ static int isDate(
for(i=1; i<argc; i++){
z = sqlite3_value_text(argv[i]);
n = sqlite3_value_bytes(argv[i]);
- if( z==0 || parseModifier(context, (char*)z, n, p) ) return 1;
+ if( z==0 || parseModifier(context, (char*)z, n, p, i) ) return 1;
}
computeJD(p);
if( p->isError || !validJulianDay(p->iJD) ) return 1;
@@ -23099,6 +24631,28 @@ static void juliandayFunc(
}
/*
+** unixepoch( TIMESTRING, MOD, MOD, ...)
+**
+** Return the number of seconds (including fractional seconds) since
+** the unix epoch of 1970-01-01 00:00:00 GMT.
+*/
+static void unixepochFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ DateTime x;
+ if( isDate(context, argc, argv, &x)==0 ){
+ computeJD(&x);
+ if( x.useSubsec ){
+ sqlite3_result_double(context, (x.iJD - 21086676*(i64)10000000)/1000.0);
+ }else{
+ sqlite3_result_int64(context, x.iJD/1000 - 21086676*(i64)10000);
+ }
+ }
+}
+
+/*
** datetime( TIMESTRING, MOD, MOD, ...)
**
** Return YYYY-MM-DD HH:MM:SS
@@ -23110,11 +24664,51 @@ static void datetimeFunc(
){
DateTime x;
if( isDate(context, argc, argv, &x)==0 ){
- char zBuf[100];
+ int Y, s, n;
+ char zBuf[32];
computeYMD_HMS(&x);
- sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d %02d:%02d:%02d",
- x.Y, x.M, x.D, x.h, x.m, (int)(x.s));
- sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
+ Y = x.Y;
+ if( Y<0 ) Y = -Y;
+ zBuf[1] = '0' + (Y/1000)%10;
+ zBuf[2] = '0' + (Y/100)%10;
+ zBuf[3] = '0' + (Y/10)%10;
+ zBuf[4] = '0' + (Y)%10;
+ zBuf[5] = '-';
+ zBuf[6] = '0' + (x.M/10)%10;
+ zBuf[7] = '0' + (x.M)%10;
+ zBuf[8] = '-';
+ zBuf[9] = '0' + (x.D/10)%10;
+ zBuf[10] = '0' + (x.D)%10;
+ zBuf[11] = ' ';
+ zBuf[12] = '0' + (x.h/10)%10;
+ zBuf[13] = '0' + (x.h)%10;
+ zBuf[14] = ':';
+ zBuf[15] = '0' + (x.m/10)%10;
+ zBuf[16] = '0' + (x.m)%10;
+ zBuf[17] = ':';
+ if( x.useSubsec ){
+ s = (int)1000.0*x.s;
+ zBuf[18] = '0' + (s/10000)%10;
+ zBuf[19] = '0' + (s/1000)%10;
+ zBuf[20] = '.';
+ zBuf[21] = '0' + (s/100)%10;
+ zBuf[22] = '0' + (s/10)%10;
+ zBuf[23] = '0' + (s)%10;
+ zBuf[24] = 0;
+ n = 24;
+ }else{
+ s = (int)x.s;
+ zBuf[18] = '0' + (s/10)%10;
+ zBuf[19] = '0' + (s)%10;
+ zBuf[20] = 0;
+ n = 20;
+ }
+ if( x.Y<0 ){
+ zBuf[0] = '-';
+ sqlite3_result_text(context, zBuf, n, SQLITE_TRANSIENT);
+ }else{
+ sqlite3_result_text(context, &zBuf[1], n-1, SQLITE_TRANSIENT);
+ }
}
}
@@ -23130,10 +24724,33 @@ static void timeFunc(
){
DateTime x;
if( isDate(context, argc, argv, &x)==0 ){
- char zBuf[100];
+ int s, n;
+ char zBuf[16];
computeHMS(&x);
- sqlite3_snprintf(sizeof(zBuf), zBuf, "%02d:%02d:%02d", x.h, x.m, (int)x.s);
- sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
+ zBuf[0] = '0' + (x.h/10)%10;
+ zBuf[1] = '0' + (x.h)%10;
+ zBuf[2] = ':';
+ zBuf[3] = '0' + (x.m/10)%10;
+ zBuf[4] = '0' + (x.m)%10;
+ zBuf[5] = ':';
+ if( x.useSubsec ){
+ s = (int)1000.0*x.s;
+ zBuf[6] = '0' + (s/10000)%10;
+ zBuf[7] = '0' + (s/1000)%10;
+ zBuf[8] = '.';
+ zBuf[9] = '0' + (s/100)%10;
+ zBuf[10] = '0' + (s/10)%10;
+ zBuf[11] = '0' + (s)%10;
+ zBuf[12] = 0;
+ n = 12;
+ }else{
+ s = (int)x.s;
+ zBuf[6] = '0' + (s/10)%10;
+ zBuf[7] = '0' + (s)%10;
+ zBuf[8] = 0;
+ n = 8;
+ }
+ sqlite3_result_text(context, zBuf, n, SQLITE_TRANSIENT);
}
}
@@ -23149,10 +24766,28 @@ static void dateFunc(
){
DateTime x;
if( isDate(context, argc, argv, &x)==0 ){
- char zBuf[100];
+ int Y;
+ char zBuf[16];
computeYMD(&x);
- sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D);
- sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
+ Y = x.Y;
+ if( Y<0 ) Y = -Y;
+ zBuf[1] = '0' + (Y/1000)%10;
+ zBuf[2] = '0' + (Y/100)%10;
+ zBuf[3] = '0' + (Y/10)%10;
+ zBuf[4] = '0' + (Y)%10;
+ zBuf[5] = '-';
+ zBuf[6] = '0' + (x.M/10)%10;
+ zBuf[7] = '0' + (x.M)%10;
+ zBuf[8] = '-';
+ zBuf[9] = '0' + (x.D/10)%10;
+ zBuf[10] = '0' + (x.D)%10;
+ zBuf[11] = 0;
+ if( x.Y<0 ){
+ zBuf[0] = '-';
+ sqlite3_result_text(context, zBuf, 11, SQLITE_TRANSIENT);
+ }else{
+ sqlite3_result_text(context, &zBuf[1], 10, SQLITE_TRANSIENT);
+ }
}
}
@@ -23181,131 +24816,105 @@ static void strftimeFunc(
sqlite3_value **argv
){
DateTime x;
- u64 n;
size_t i,j;
- char *z;
sqlite3 *db;
const char *zFmt;
- char zBuf[100];
+ sqlite3_str sRes;
+
+
if( argc==0 ) return;
zFmt = (const char*)sqlite3_value_text(argv[0]);
if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return;
db = sqlite3_context_db_handle(context);
- for(i=0, n=1; zFmt[i]; i++, n++){
- if( zFmt[i]=='%' ){
- switch( zFmt[i+1] ){
- case 'd':
- case 'H':
- case 'm':
- case 'M':
- case 'S':
- case 'W':
- n++;
- /* fall thru */
- case 'w':
- case '%':
- break;
- case 'f':
- n += 8;
- break;
- case 'j':
- n += 3;
- break;
- case 'Y':
- n += 8;
- break;
- case 's':
- case 'J':
- n += 50;
- break;
- default:
- return; /* ERROR. return a NULL */
- }
- i++;
- }
- }
- testcase( n==sizeof(zBuf)-1 );
- testcase( n==sizeof(zBuf) );
- testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
- testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH] );
- if( n<sizeof(zBuf) ){
- z = zBuf;
- }else if( n>(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ){
- sqlite3_result_error_toobig(context);
- return;
- }else{
- z = sqlite3DbMallocRawNN(db, (int)n);
- if( z==0 ){
- sqlite3_result_error_nomem(context);
- return;
- }
- }
+ sqlite3StrAccumInit(&sRes, 0, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]);
+
computeJD(&x);
computeYMD_HMS(&x);
for(i=j=0; zFmt[i]; i++){
- if( zFmt[i]!='%' ){
- z[j++] = zFmt[i];
- }else{
- i++;
- switch( zFmt[i] ){
- case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break;
- case 'f': {
- double s = x.s;
- if( s>59.999 ) s = 59.999;
- sqlite3_snprintf(7, &z[j],"%06.3f", s);
- j += sqlite3Strlen30(&z[j]);
- break;
- }
- case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break;
- case 'W': /* Fall thru */
- case 'j': {
- int nDay; /* Number of days since 1st day of year */
- DateTime y = x;
- y.validJD = 0;
- y.M = 1;
- y.D = 1;
- computeJD(&y);
- nDay = (int)((x.iJD-y.iJD+43200000)/86400000);
- if( zFmt[i]=='W' ){
- int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */
- wd = (int)(((x.iJD+43200000)/86400000)%7);
- sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7);
- j += 2;
- }else{
- sqlite3_snprintf(4, &z[j],"%03d",nDay+1);
- j += 3;
- }
- break;
- }
- case 'J': {
- sqlite3_snprintf(20, &z[j],"%.16g",x.iJD/86400000.0);
- j+=sqlite3Strlen30(&z[j]);
- break;
+ if( zFmt[i]!='%' ) continue;
+ if( j<i ) sqlite3_str_append(&sRes, zFmt+j, (int)(i-j));
+ i++;
+ j = i + 1;
+ switch( zFmt[i] ){
+ case 'd': {
+ sqlite3_str_appendf(&sRes, "%02d", x.D);
+ break;
+ }
+ case 'f': {
+ double s = x.s;
+ if( s>59.999 ) s = 59.999;
+ sqlite3_str_appendf(&sRes, "%06.3f", s);
+ break;
+ }
+ case 'H': {
+ sqlite3_str_appendf(&sRes, "%02d", x.h);
+ break;
+ }
+ case 'W': /* Fall thru */
+ case 'j': {
+ int nDay; /* Number of days since 1st day of year */
+ DateTime y = x;
+ y.validJD = 0;
+ y.M = 1;
+ y.D = 1;
+ computeJD(&y);
+ nDay = (int)((x.iJD-y.iJD+43200000)/86400000);
+ if( zFmt[i]=='W' ){
+ int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */
+ wd = (int)(((x.iJD+43200000)/86400000)%7);
+ sqlite3_str_appendf(&sRes,"%02d",(nDay+7-wd)/7);
+ }else{
+ sqlite3_str_appendf(&sRes,"%03d",nDay+1);
}
- case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break;
- case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break;
- case 's': {
+ break;
+ }
+ case 'J': {
+ sqlite3_str_appendf(&sRes,"%.16g",x.iJD/86400000.0);
+ break;
+ }
+ case 'm': {
+ sqlite3_str_appendf(&sRes,"%02d",x.M);
+ break;
+ }
+ case 'M': {
+ sqlite3_str_appendf(&sRes,"%02d",x.m);
+ break;
+ }
+ case 's': {
+ if( x.useSubsec ){
+ sqlite3_str_appendf(&sRes,"%.3f",
+ (x.iJD - 21086676*(i64)10000000)/1000.0);
+ }else{
i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000);
- sqlite3Int64ToText(iS, &z[j]);
- j += sqlite3Strlen30(&z[j]);
- break;
- }
- case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break;
- case 'w': {
- z[j++] = (char)(((x.iJD+129600000)/86400000) % 7) + '0';
- break;
- }
- case 'Y': {
- sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=sqlite3Strlen30(&z[j]);
- break;
+ sqlite3_str_appendf(&sRes,"%lld",iS);
}
- default: z[j++] = '%'; break;
+ break;
+ }
+ case 'S': {
+ sqlite3_str_appendf(&sRes,"%02d",(int)x.s);
+ break;
+ }
+ case 'w': {
+ sqlite3_str_appendchar(&sRes, 1,
+ (char)(((x.iJD+129600000)/86400000) % 7) + '0');
+ break;
+ }
+ case 'Y': {
+ sqlite3_str_appendf(&sRes,"%04d",x.Y);
+ break;
+ }
+ case '%': {
+ sqlite3_str_appendchar(&sRes, 1, '%');
+ break;
+ }
+ default: {
+ sqlite3_str_reset(&sRes);
+ return;
}
}
}
- z[j] = 0;
- sqlite3_result_text(context, z, -1,
- z==zBuf ? SQLITE_TRANSIENT : SQLITE_DYNAMIC);
+ if( j<i ) sqlite3_str_append(&sRes, zFmt+j, (int)(i-j));
+ sqlite3ResultStrAccum(context, &sRes);
}
/*
@@ -23405,6 +25014,7 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){
static FuncDef aDateTimeFuncs[] = {
#ifndef SQLITE_OMIT_DATETIME_FUNCS
PURE_DATE(julianday, -1, 0, 0, juliandayFunc ),
+ PURE_DATE(unixepoch, -1, 0, 0, unixepochFunc ),
PURE_DATE(date, -1, 0, 0, dateFunc ),
PURE_DATE(time, -1, 0, 0, timeFunc ),
PURE_DATE(datetime, -1, 0, 0, datetimeFunc ),
@@ -23531,9 +25141,11 @@ SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){
}
SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file *id, int lockType){
DO_OS_MALLOC_TEST(id);
+ assert( lockType>=SQLITE_LOCK_SHARED && lockType<=SQLITE_LOCK_EXCLUSIVE );
return id->pMethods->xLock(id, lockType);
}
SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file *id, int lockType){
+ assert( lockType==SQLITE_LOCK_NONE || lockType==SQLITE_LOCK_SHARED );
return id->pMethods->xUnlock(id, lockType);
}
SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){
@@ -23586,6 +25198,7 @@ SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){
return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE);
}
SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id){
+ if( NEVER(id->pMethods==0) ) return 0;
return id->pMethods->xDeviceCharacteristics(id);
}
#ifndef SQLITE_OMIT_WAL
@@ -23647,6 +25260,7 @@ SQLITE_PRIVATE int sqlite3OsOpen(
** down into the VFS layer. Some SQLITE_OPEN_ flags (for example,
** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before
** reaching the VFS. */
+ assert( zPath || (flags & SQLITE_OPEN_EXCLUSIVE) );
rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x1087f7f, pFlagsOut);
assert( rc==SQLITE_OK || pFile->pMethods==0 );
return rc;
@@ -23740,12 +25354,15 @@ SQLITE_PRIVATE int sqlite3OsOpenMalloc(
rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags);
if( rc!=SQLITE_OK ){
sqlite3_free(pFile);
+ *ppFile = 0;
}else{
*ppFile = pFile;
}
}else{
+ *ppFile = 0;
rc = SQLITE_NOMEM_BKPT;
}
+ assert( *ppFile!=0 || rc!=SQLITE_OK );
return rc;
}
SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *pFile){
@@ -24463,7 +26080,7 @@ static void adjustStats(int iSize, int increment){
** This routine checks the guards at either end of the allocation and
** if they are incorrect it asserts.
*/
-static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){
+static struct MemBlockHdr *sqlite3MemsysGetHeader(const void *pAllocation){
struct MemBlockHdr *p;
int *pInt;
u8 *pU8;
@@ -24710,7 +26327,7 @@ SQLITE_PRIVATE void sqlite3MemdebugSetType(void *p, u8 eType){
**
** assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
*/
-SQLITE_PRIVATE int sqlite3MemdebugHasType(void *p, u8 eType){
+SQLITE_PRIVATE int sqlite3MemdebugHasType(const void *p, u8 eType){
int rc = 1;
if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){
struct MemBlockHdr *pHdr;
@@ -24732,7 +26349,7 @@ SQLITE_PRIVATE int sqlite3MemdebugHasType(void *p, u8 eType){
**
** assert( sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
*/
-SQLITE_PRIVATE int sqlite3MemdebugNoType(void *p, u8 eType){
+SQLITE_PRIVATE int sqlite3MemdebugNoType(const void *p, u8 eType){
int rc = 1;
if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){
struct MemBlockHdr *pHdr;
@@ -25955,8 +27572,17 @@ static void *memsys5Realloc(void *pPrior, int nBytes){
*/
static int memsys5Roundup(int n){
int iFullSz;
- if( n > 0x40000000 ) return 0;
- for(iFullSz=mem5.szAtom; iFullSz<n; iFullSz *= 2);
+ if( n<=mem5.szAtom*2 ){
+ if( n<=mem5.szAtom ) return mem5.szAtom;
+ return mem5.szAtom*2;
+ }
+ if( n>0x10000000 ){
+ if( n>0x40000000 ) return 0;
+ if( n>0x20000000 ) return 0x40000000;
+ return 0x20000000;
+ }
+ for(iFullSz=mem5.szAtom*8; iFullSz<n; iFullSz *= 4);
+ if( (iFullSz/2)>=(i64)n ) return iFullSz/2;
return iFullSz;
}
@@ -27110,205 +28736,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
/*
** Include code that is common to all os_*.c files
*/
-/************** Include os_common.h in the middle of mutex_w32.c *************/
-/************** Begin file os_common.h ***************************************/
-/*
-** 2004 May 22
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This file contains macros and a little bit of code that is common to
-** all of the platform-specific files (os_*.c) and is #included into those
-** files.
-**
-** This file should be #included by the os_*.c files only. It is not a
-** general purpose header file.
-*/
-#ifndef _OS_COMMON_H_
-#define _OS_COMMON_H_
-
-/*
-** At least two bugs have slipped in because we changed the MEMORY_DEBUG
-** macro to SQLITE_DEBUG and some older makefiles have not yet made the
-** switch. The following code should catch this problem at compile-time.
-*/
-#ifdef MEMORY_DEBUG
-# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
-#endif
-
-/*
-** Macros for performance tracing. Normally turned off. Only works
-** on i486 hardware.
-*/
-#ifdef SQLITE_PERFORMANCE_TRACE
-
-/*
-** hwtime.h contains inline assembler code for implementing
-** high-performance timing routines.
-*/
-/************** Include hwtime.h in the middle of os_common.h ****************/
-/************** Begin file hwtime.h ******************************************/
-/*
-** 2008 May 27
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This file contains inline asm code for retrieving "high-performance"
-** counters for x86 and x86_64 class CPUs.
-*/
-#ifndef SQLITE_HWTIME_H
-#define SQLITE_HWTIME_H
-
-/*
-** The following routine only works on pentium-class (or newer) processors.
-** It uses the RDTSC opcode to read the cycle count value out of the
-** processor and returns that value. This can be used for high-res
-** profiling.
-*/
-#if !defined(__STRICT_ANSI__) && \
- (defined(__GNUC__) || defined(_MSC_VER)) && \
- (defined(i386) || defined(__i386__) || defined(_M_IX86))
-
- #if defined(__GNUC__)
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned int lo, hi;
- __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
- return (sqlite_uint64)hi << 32 | lo;
- }
-
- #elif defined(_MSC_VER)
-
- __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
- __asm {
- rdtsc
- ret ; return value at EDX:EAX
- }
- }
-
- #endif
-
-#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__))
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned long val;
- __asm__ __volatile__ ("rdtsc" : "=A" (val));
- return val;
- }
-
-#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__))
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned long long retval;
- unsigned long junk;
- __asm__ __volatile__ ("\n\
- 1: mftbu %1\n\
- mftb %L0\n\
- mftbu %0\n\
- cmpw %0,%1\n\
- bne 1b"
- : "=r" (retval), "=r" (junk));
- return retval;
- }
-
-#else
-
- /*
- ** asm() is needed for hardware timing support. Without asm(),
- ** disable the sqlite3Hwtime() routine.
- **
- ** sqlite3Hwtime() is only used for some obscure debugging
- ** and analysis configurations, not in any deliverable, so this
- ** should not be a great loss.
- */
-SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
-
-#endif
-
-#endif /* !defined(SQLITE_HWTIME_H) */
-
-/************** End of hwtime.h **********************************************/
-/************** Continuing where we left off in os_common.h ******************/
-
-static sqlite_uint64 g_start;
-static sqlite_uint64 g_elapsed;
-#define TIMER_START g_start=sqlite3Hwtime()
-#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
-#define TIMER_ELAPSED g_elapsed
-#else
-#define TIMER_START
-#define TIMER_END
-#define TIMER_ELAPSED ((sqlite_uint64)0)
-#endif
-
-/*
-** If we compile with the SQLITE_TEST macro set, then the following block
-** of code will give us the ability to simulate a disk I/O error. This
-** is used for testing the I/O recovery logic.
-*/
-#if defined(SQLITE_TEST)
-SQLITE_API extern int sqlite3_io_error_hit;
-SQLITE_API extern int sqlite3_io_error_hardhit;
-SQLITE_API extern int sqlite3_io_error_pending;
-SQLITE_API extern int sqlite3_io_error_persist;
-SQLITE_API extern int sqlite3_io_error_benign;
-SQLITE_API extern int sqlite3_diskfull_pending;
-SQLITE_API extern int sqlite3_diskfull;
-#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
-#define SimulateIOError(CODE) \
- if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
- || sqlite3_io_error_pending-- == 1 ) \
- { local_ioerr(); CODE; }
-static void local_ioerr(){
- IOTRACE(("IOERR\n"));
- sqlite3_io_error_hit++;
- if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
-}
-#define SimulateDiskfullError(CODE) \
- if( sqlite3_diskfull_pending ){ \
- if( sqlite3_diskfull_pending == 1 ){ \
- local_ioerr(); \
- sqlite3_diskfull = 1; \
- sqlite3_io_error_hit = 1; \
- CODE; \
- }else{ \
- sqlite3_diskfull_pending--; \
- } \
- }
-#else
-#define SimulateIOErrorBenign(X)
-#define SimulateIOError(A)
-#define SimulateDiskfullError(A)
-#endif /* defined(SQLITE_TEST) */
-
-/*
-** When testing, keep a count of the number of open files.
-*/
-#if defined(SQLITE_TEST)
-SQLITE_API extern int sqlite3_open_file_count;
-#define OpenCounter(X) sqlite3_open_file_count+=(X)
-#else
-#define OpenCounter(X)
-#endif /* defined(SQLITE_TEST) */
-
-#endif /* !defined(_OS_COMMON_H_) */
-
-/************** End of os_common.h *******************************************/
-/************** Continuing where we left off in mutex_w32.c ******************/
+/* #include "os_common.h" */
/*
** Include the header file for the Windows VFS.
@@ -28056,17 +29484,33 @@ static void mallocWithAlarm(int n, void **pp){
}
/*
+** Maximum size of any single memory allocation.
+**
+** This is not a limit on the total amount of memory used. This is
+** a limit on the size parameter to sqlite3_malloc() and sqlite3_realloc().
+**
+** The upper bound is slightly less than 2GiB: 0x7ffffeff == 2,147,483,391
+** This provides a 256-byte safety margin for defense against 32-bit
+** signed integer overflow bugs when computing memory allocation sizes.
+** Paranoid applications might want to reduce the maximum allocation size
+** further for an even larger safety margin. 0x3fffffff or 0x0fffffff
+** or even smaller would be reasonable upper bounds on the size of a memory
+** allocations for most applications.
+*/
+#ifndef SQLITE_MAX_ALLOCATION_SIZE
+# define SQLITE_MAX_ALLOCATION_SIZE 2147483391
+#endif
+#if SQLITE_MAX_ALLOCATION_SIZE>2147483391
+# error Maximum size for SQLITE_MAX_ALLOCATION_SIZE is 2147483391
+#endif
+
+/*
** Allocate memory. This routine is like sqlite3_malloc() except that it
** assumes the memory subsystem has already been initialized.
*/
SQLITE_PRIVATE void *sqlite3Malloc(u64 n){
void *p;
- if( n==0 || n>=0x7fffff00 ){
- /* A memory allocation of a number of bytes which is near the maximum
- ** signed integer value might cause an integer overflow inside of the
- ** xMalloc(). Hence we limit the maximum size to 0x7fffff00, giving
- ** 255 bytes of overhead. SQLite itself will never use anything near
- ** this amount. The only way to reach the limit is with sqlite3_malloc() */
+ if( n==0 || n>SQLITE_MAX_ALLOCATION_SIZE ){
p = 0;
}else if( sqlite3GlobalConfig.bMemstat ){
sqlite3_mutex_enter(mem0.mutex);
@@ -28101,8 +29545,8 @@ SQLITE_API void *sqlite3_malloc64(sqlite3_uint64 n){
** TRUE if p is a lookaside memory allocation from db
*/
#ifndef SQLITE_OMIT_LOOKASIDE
-static int isLookaside(sqlite3 *db, void *p){
- return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pEnd);
+static int isLookaside(sqlite3 *db, const void *p){
+ return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pTrueEnd);
}
#else
#define isLookaside(A,B) 0
@@ -28112,32 +29556,30 @@ static int isLookaside(sqlite3 *db, void *p){
** Return the size of a memory allocation previously obtained from
** sqlite3Malloc() or sqlite3_malloc().
*/
-SQLITE_PRIVATE int sqlite3MallocSize(void *p){
+SQLITE_PRIVATE int sqlite3MallocSize(const void *p){
assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
- return sqlite3GlobalConfig.m.xSize(p);
+ return sqlite3GlobalConfig.m.xSize((void*)p);
}
-static int lookasideMallocSize(sqlite3 *db, void *p){
+static int lookasideMallocSize(sqlite3 *db, const void *p){
#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE
return p<db->lookaside.pMiddle ? db->lookaside.szTrue : LOOKASIDE_SMALL;
#else
return db->lookaside.szTrue;
#endif
}
-SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
+SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, const void *p){
assert( p!=0 );
#ifdef SQLITE_DEBUG
- if( db==0 || !isLookaside(db,p) ){
- if( db==0 ){
- assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) );
- assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
- }else{
- assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
- assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
- }
+ if( db==0 ){
+ assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) );
+ assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
+ }else if( !isLookaside(db,p) ){
+ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
+ assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
}
#endif
if( db ){
- if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){
+ if( ((uptr)p)<(uptr)(db->lookaside.pTrueEnd) ){
#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE
if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){
assert( sqlite3_mutex_held(db->mutex) );
@@ -28150,7 +29592,7 @@ SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
}
}
}
- return sqlite3GlobalConfig.m.xSize(p);
+ return sqlite3GlobalConfig.m.xSize((void*)p);
}
SQLITE_API sqlite3_uint64 sqlite3_msize(void *p){
assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) );
@@ -28193,14 +29635,11 @@ SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){
assert( db==0 || sqlite3_mutex_held(db->mutex) );
assert( p!=0 );
if( db ){
- if( db->pnBytesFreed ){
- measureAllocationSize(db, p);
- return;
- }
if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){
#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE
if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){
LookasideSlot *pBuf = (LookasideSlot*)p;
+ assert( db->pnBytesFreed==0 );
#ifdef SQLITE_DEBUG
memset(p, 0xaa, LOOKASIDE_SMALL); /* Trash freed content */
#endif
@@ -28211,6 +29650,7 @@ SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){
#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */
if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){
LookasideSlot *pBuf = (LookasideSlot*)p;
+ assert( db->pnBytesFreed==0 );
#ifdef SQLITE_DEBUG
memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */
#endif
@@ -28219,6 +29659,10 @@ SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){
return;
}
}
+ if( db->pnBytesFreed ){
+ measureAllocationSize(db, p);
+ return;
+ }
}
assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
@@ -28226,6 +29670,43 @@ SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){
sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
sqlite3_free(p);
}
+SQLITE_PRIVATE void sqlite3DbNNFreeNN(sqlite3 *db, void *p){
+ assert( db!=0 );
+ assert( sqlite3_mutex_held(db->mutex) );
+ assert( p!=0 );
+ if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){
+#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE
+ if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){
+ LookasideSlot *pBuf = (LookasideSlot*)p;
+ assert( db->pnBytesFreed==0 );
+#ifdef SQLITE_DEBUG
+ memset(p, 0xaa, LOOKASIDE_SMALL); /* Trash freed content */
+#endif
+ pBuf->pNext = db->lookaside.pSmallFree;
+ db->lookaside.pSmallFree = pBuf;
+ return;
+ }
+#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */
+ if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){
+ LookasideSlot *pBuf = (LookasideSlot*)p;
+ assert( db->pnBytesFreed==0 );
+#ifdef SQLITE_DEBUG
+ memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */
+#endif
+ pBuf->pNext = db->lookaside.pFree;
+ db->lookaside.pFree = pBuf;
+ return;
+ }
+ }
+ if( db->pnBytesFreed ){
+ measureAllocationSize(db, p);
+ return;
+ }
+ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
+ assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) );
+ sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
+ sqlite3_free(p);
+}
SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){
assert( db==0 || sqlite3_mutex_held(db->mutex) );
if( p ) sqlite3DbFreeNN(db, p);
@@ -28525,9 +30006,14 @@ SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){
*/
SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){
int n;
+#ifdef SQLITE_DEBUG
+ /* Because of the way the parser works, the span is guaranteed to contain
+ ** at least one non-space character */
+ for(n=0; sqlite3Isspace(zStart[n]); n++){ assert( &zStart[n]<zEnd ); }
+#endif
while( sqlite3Isspace(zStart[0]) ) zStart++;
n = (int)(zEnd - zStart);
- while( ALWAYS(n>0) && sqlite3Isspace(zStart[n-1]) ) n--;
+ while( sqlite3Isspace(zStart[n-1]) ) n--;
return sqlite3DbStrNDup(db, zStart, n);
}
@@ -28535,8 +30021,9 @@ SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const cha
** Free any prior content in *pz and replace it with a copy of zNew.
*/
SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){
+ char *z = sqlite3DbStrDup(db, zNew);
sqlite3DbFree(db, *pz);
- *pz = sqlite3DbStrDup(db, zNew);
+ *pz = z;
}
/*
@@ -28544,8 +30031,15 @@ SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){
** has happened. This routine will set db->mallocFailed, and also
** temporarily disable the lookaside memory allocator and interrupt
** any running VDBEs.
+**
+** Always return a NULL pointer so that this routine can be invoked using
+**
+** return sqlite3OomFault(db);
+**
+** and thereby avoid unnecessary stack frame allocations for the overwhelmingly
+** common case where no OOM occurs.
*/
-SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){
+SQLITE_PRIVATE void *sqlite3OomFault(sqlite3 *db){
if( db->mallocFailed==0 && db->bBenignMalloc==0 ){
db->mallocFailed = 1;
if( db->nVdbeExec>0 ){
@@ -28553,9 +30047,16 @@ SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){
}
DisableLookaside;
if( db->pParse ){
+ Parse *pParse;
+ sqlite3ErrorMsg(db->pParse, "out of memory");
db->pParse->rc = SQLITE_NOMEM_BKPT;
+ for(pParse=db->pParse->pOuterParse; pParse; pParse = pParse->pOuterParse){
+ pParse->nErr++;
+ pParse->rc = SQLITE_NOMEM;
+ }
}
}
+ return 0;
}
/*
@@ -28757,10 +30258,24 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
}
#endif /* SQLITE_OMIT_FLOATING_POINT */
+#ifndef SQLITE_OMIT_FLOATING_POINT
+/*
+** "*val" is a u64. *msd is a divisor used to extract the
+** most significant digit of *val. Extract that most significant
+** digit and return it.
+*/
+static char et_getdigit_int(u64 *val, u64 *msd){
+ u64 x = (*val)/(*msd);
+ *val -= x*(*msd);
+ if( *msd>=10 ) *msd /= 10;
+ return '0' + (char)(x & 15);
+}
+#endif /* SQLITE_OMIT_FLOATING_POINT */
+
/*
** Set the StrAccum object to an error mode.
*/
-static void setStrAccumError(StrAccum *p, u8 eError){
+SQLITE_PRIVATE void sqlite3StrAccumSetError(StrAccum *p, u8 eError){
assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG );
p->accError = eError;
if( p->mxAlloc ) sqlite3_str_reset(p);
@@ -28796,12 +30311,12 @@ static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){
char *z;
if( pAccum->accError ) return 0;
if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){
- setStrAccumError(pAccum, SQLITE_TOOBIG);
+ sqlite3StrAccumSetError(pAccum, SQLITE_TOOBIG);
return 0;
}
z = sqlite3DbMallocRaw(pAccum->db, n);
if( z==0 ){
- setStrAccumError(pAccum, SQLITE_NOMEM);
+ sqlite3StrAccumSetError(pAccum, SQLITE_NOMEM);
}
return z;
}
@@ -28849,6 +30364,8 @@ SQLITE_API void sqlite3_str_vappendf(
char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
sqlite_uint64 longvalue; /* Value for integer types */
LONGDOUBLE_TYPE realvalue; /* Value for real types */
+ sqlite_uint64 msd; /* Divisor to get most-significant-digit
+ ** of longvalue */
const et_info *infop; /* Pointer to the appropriate info structure */
char *zOut; /* Rendering buffer */
int nOut; /* Size of the rendering buffer */
@@ -29155,52 +30672,78 @@ SQLITE_API void sqlite3_str_vappendf(
}else{
prefix = flag_prefix;
}
+ exp = 0;
if( xtype==etGENERIC && precision>0 ) precision--;
testcase( precision>0xfff );
- idx = precision & 0xfff;
- rounder = arRound[idx%10];
- while( idx>=10 ){ rounder *= 1.0e-10; idx -= 10; }
- if( xtype==etFLOAT ){
- double rx = (double)realvalue;
- sqlite3_uint64 u;
- int ex;
- memcpy(&u, &rx, sizeof(u));
- ex = -1023 + (int)((u>>52)&0x7ff);
- if( precision+(ex/3) < 15 ) rounder += realvalue*3e-16;
- realvalue += rounder;
- }
- /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
- exp = 0;
- if( sqlite3IsNaN((double)realvalue) ){
- bufpt = "NaN";
- length = 3;
- break;
- }
- if( realvalue>0.0 ){
- LONGDOUBLE_TYPE scale = 1.0;
- while( realvalue>=1e100*scale && exp<=350 ){ scale *= 1e100;exp+=100;}
- while( realvalue>=1e10*scale && exp<=350 ){ scale *= 1e10; exp+=10; }
- while( realvalue>=10.0*scale && exp<=350 ){ scale *= 10.0; exp++; }
- realvalue /= scale;
- while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; }
- while( realvalue<1.0 ){ realvalue *= 10.0; exp--; }
- if( exp>350 ){
- bufpt = buf;
- buf[0] = prefix;
- memcpy(buf+(prefix!=0),"Inf",4);
- length = 3+(prefix!=0);
+ if( realvalue<1.0e+16
+ && realvalue==(LONGDOUBLE_TYPE)(longvalue = (u64)realvalue)
+ ){
+ /* Number is a pure integer that can be represented as u64 */
+ for(msd=1; msd*10<=longvalue; msd *= 10, exp++){}
+ if( exp>precision && xtype!=etFLOAT ){
+ u64 rnd = msd/2;
+ int kk = precision;
+ while( kk-- > 0 ){ rnd /= 10; }
+ longvalue += rnd;
+ }
+ }else{
+ msd = 0;
+ longvalue = 0; /* To prevent a compiler warning */
+ idx = precision & 0xfff;
+ rounder = arRound[idx%10];
+ while( idx>=10 ){ rounder *= 1.0e-10; idx -= 10; }
+ if( xtype==etFLOAT ){
+ double rx = (double)realvalue;
+ sqlite3_uint64 u;
+ int ex;
+ memcpy(&u, &rx, sizeof(u));
+ ex = -1023 + (int)((u>>52)&0x7ff);
+ if( precision+(ex/3) < 15 ) rounder += realvalue*3e-16;
+ realvalue += rounder;
+ }
+ if( sqlite3IsNaN((double)realvalue) ){
+ if( flag_zeropad ){
+ bufpt = "null";
+ length = 4;
+ }else{
+ bufpt = "NaN";
+ length = 3;
+ }
break;
}
+
+ /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
+ if( ALWAYS(realvalue>0.0) ){
+ LONGDOUBLE_TYPE scale = 1.0;
+ while( realvalue>=1e100*scale && exp<=350){ scale*=1e100;exp+=100;}
+ while( realvalue>=1e10*scale && exp<=350 ){ scale*=1e10; exp+=10; }
+ while( realvalue>=10.0*scale && exp<=350 ){ scale *= 10.0; exp++; }
+ realvalue /= scale;
+ while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; }
+ while( realvalue<1.0 ){ realvalue *= 10.0; exp--; }
+ if( exp>350 ){
+ if( flag_zeropad ){
+ realvalue = 9.0;
+ exp = 999;
+ }else{
+ bufpt = buf;
+ buf[0] = prefix;
+ memcpy(buf+(prefix!=0),"Inf",4);
+ length = 3+(prefix!=0);
+ break;
+ }
+ }
+ if( xtype!=etFLOAT ){
+ realvalue += rounder;
+ if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; }
+ }
+ }
}
- bufpt = buf;
+
/*
** If the field type is etGENERIC, then convert to either etEXP
** or etFLOAT, as appropriate.
*/
- if( xtype!=etFLOAT ){
- realvalue += rounder;
- if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; }
- }
if( xtype==etGENERIC ){
flag_rtz = !flag_alternateform;
if( exp<-4 || exp>precision ){
@@ -29217,16 +30760,18 @@ SQLITE_API void sqlite3_str_vappendf(
}else{
e2 = exp;
}
+ nsd = 16 + flag_altform2*10;
+ bufpt = buf;
{
i64 szBufNeeded; /* Size of a temporary buffer needed */
szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15;
+ if( cThousand && e2>0 ) szBufNeeded += (e2+2)/3;
if( szBufNeeded > etBUFSIZE ){
bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded);
if( bufpt==0 ) return;
}
}
zOut = bufpt;
- nsd = 16 + flag_altform2*10;
flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2;
/* The sign in front of the number */
if( prefix ){
@@ -29235,9 +30780,15 @@ SQLITE_API void sqlite3_str_vappendf(
/* Digits prior to the decimal point */
if( e2<0 ){
*(bufpt++) = '0';
+ }else if( msd>0 ){
+ for(; e2>=0; e2--){
+ *(bufpt++) = et_getdigit_int(&longvalue,&msd);
+ if( cThousand && (e2%3)==0 && e2>1 ) *(bufpt++) = ',';
+ }
}else{
for(; e2>=0; e2--){
*(bufpt++) = et_getdigit(&realvalue,&nsd);
+ if( cThousand && (e2%3)==0 && e2>1 ) *(bufpt++) = ',';
}
}
/* The decimal point */
@@ -29251,8 +30802,14 @@ SQLITE_API void sqlite3_str_vappendf(
*(bufpt++) = '0';
}
/* Significant digits after the decimal point */
- while( (precision--)>0 ){
- *(bufpt++) = et_getdigit(&realvalue,&nsd);
+ if( msd>0 ){
+ while( (precision--)>0 ){
+ *(bufpt++) = et_getdigit_int(&longvalue,&msd);
+ }
+ }else{
+ while( (precision--)>0 ){
+ *(bufpt++) = et_getdigit(&realvalue,&nsd);
+ }
}
/* Remove trailing zeros and the "." if no digits follow the "." */
if( flag_rtz && flag_dp ){
@@ -29351,13 +30908,26 @@ SQLITE_API void sqlite3_str_vappendf(
}
}
if( precision>1 ){
+ i64 nPrior = 1;
width -= precision-1;
if( width>1 && !flag_leftjustify ){
sqlite3_str_appendchar(pAccum, width-1, ' ');
width = 0;
}
- while( precision-- > 1 ){
- sqlite3_str_append(pAccum, buf, length);
+ sqlite3_str_append(pAccum, buf, length);
+ precision--;
+ while( precision > 1 ){
+ i64 nCopyBytes;
+ if( nPrior > precision-1 ) nPrior = precision - 1;
+ nCopyBytes = length*nPrior;
+ if( nCopyBytes + pAccum->nChar >= pAccum->nAlloc ){
+ sqlite3StrAccumEnlarge(pAccum, nCopyBytes);
+ }
+ if( pAccum->accError ) break;
+ sqlite3_str_append(pAccum,
+ &pAccum->zText[pAccum->nChar-nCopyBytes], nCopyBytes);
+ precision -= nPrior;
+ nPrior *= 2;
}
}
bufpt = buf;
@@ -29418,8 +30988,8 @@ SQLITE_API void sqlite3_str_vappendf(
case etSQLESCAPE: /* %q: Escape ' characters */
case etSQLESCAPE2: /* %Q: Escape ' and enclose in '...' */
case etSQLESCAPE3: { /* %w: Escape " characters */
- int i, j, k, n, isnull;
- int needQuote;
+ i64 i, j, k, n;
+ int needQuote, isnull;
char ch;
char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */
char *escarg;
@@ -29464,12 +31034,22 @@ SQLITE_API void sqlite3_str_vappendf(
goto adjust_width_for_utf8;
}
case etTOKEN: {
- Token *pToken;
if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return;
- pToken = va_arg(ap, Token*);
- assert( bArgList==0 );
- if( pToken && pToken->n ){
- sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n);
+ if( flag_alternateform ){
+ /* %#T means an Expr pointer that uses Expr.u.zToken */
+ Expr *pExpr = va_arg(ap,Expr*);
+ if( ALWAYS(pExpr) && ALWAYS(!ExprHasProperty(pExpr,EP_IntValue)) ){
+ sqlite3_str_appendall(pAccum, (const char*)pExpr->u.zToken);
+ sqlite3RecordErrorOffsetOfExpr(pAccum->db, pExpr);
+ }
+ }else{
+ /* %T means a Token pointer */
+ Token *pToken = va_arg(ap, Token*);
+ assert( bArgList==0 );
+ if( pToken && pToken->n ){
+ sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n);
+ sqlite3RecordErrorByteOffset(pAccum->db, pToken->z);
+ }
}
length = width = 0;
break;
@@ -29489,8 +31069,14 @@ SQLITE_API void sqlite3_str_vappendf(
sqlite3_str_appendall(pAccum, pItem->zName);
}else if( pItem->zAlias ){
sqlite3_str_appendall(pAccum, pItem->zAlias);
- }else if( ALWAYS(pItem->pSelect) ){
- sqlite3_str_appendf(pAccum, "SUBQUERY %u", pItem->pSelect->selId);
+ }else{
+ Select *pSel = pItem->pSelect;
+ assert( pSel!=0 );
+ if( pSel->selFlags & SF_NestedFrom ){
+ sqlite3_str_appendf(pAccum, "(join-%u)", pSel->selId);
+ }else{
+ sqlite3_str_appendf(pAccum, "(subquery-%u)", pSel->selId);
+ }
}
length = width = 0;
break;
@@ -29524,6 +31110,44 @@ SQLITE_API void sqlite3_str_vappendf(
}/* End for loop over the format string */
} /* End of function */
+
+/*
+** The z string points to the first character of a token that is
+** associated with an error. If db does not already have an error
+** byte offset recorded, try to compute the error byte offset for
+** z and set the error byte offset in db.
+*/
+SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3 *db, const char *z){
+ const Parse *pParse;
+ const char *zText;
+ const char *zEnd;
+ assert( z!=0 );
+ if( NEVER(db==0) ) return;
+ if( db->errByteOffset!=(-2) ) return;
+ pParse = db->pParse;
+ if( NEVER(pParse==0) ) return;
+ zText =pParse->zTail;
+ if( NEVER(zText==0) ) return;
+ zEnd = &zText[strlen(zText)];
+ if( SQLITE_WITHIN(z,zText,zEnd) ){
+ db->errByteOffset = (int)(z-zText);
+ }
+}
+
+/*
+** If pExpr has a byte offset for the start of a token, record that as
+** as the error offset.
+*/
+SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExpr){
+ while( pExpr
+ && (ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) || pExpr->w.iOfst<=0)
+ ){
+ pExpr = pExpr->pLeft;
+ }
+ if( pExpr==0 ) return;
+ db->errByteOffset = pExpr->w.iOfst;
+}
+
/*
** Enlarge the memory allocation on a StrAccum object so that it is
** able to accept at least N more bytes of text.
@@ -29531,21 +31155,20 @@ SQLITE_API void sqlite3_str_vappendf(
** Return the number of bytes of text that StrAccum is able to accept
** after the attempted enlargement. The value returned might be zero.
*/
-static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
+SQLITE_PRIVATE int sqlite3StrAccumEnlarge(StrAccum *p, i64 N){
char *zNew;
- assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */
+ assert( p->nChar+N >= p->nAlloc ); /* Only called if really needed */
if( p->accError ){
testcase(p->accError==SQLITE_TOOBIG);
testcase(p->accError==SQLITE_NOMEM);
return 0;
}
if( p->mxAlloc==0 ){
- setStrAccumError(p, SQLITE_TOOBIG);
+ sqlite3StrAccumSetError(p, SQLITE_TOOBIG);
return p->nAlloc - p->nChar - 1;
}else{
char *zOld = isMalloced(p) ? p->zText : 0;
- i64 szNew = p->nChar;
- szNew += (sqlite3_int64)N + 1;
+ i64 szNew = p->nChar + N + 1;
if( szNew+p->nChar<=p->mxAlloc ){
/* Force exponential buffer size growth as long as it does not overflow,
** to avoid having to call this routine too often */
@@ -29553,7 +31176,7 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
}
if( szNew > p->mxAlloc ){
sqlite3_str_reset(p);
- setStrAccumError(p, SQLITE_TOOBIG);
+ sqlite3StrAccumSetError(p, SQLITE_TOOBIG);
return 0;
}else{
p->nAlloc = (int)szNew;
@@ -29571,11 +31194,12 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
p->printfFlags |= SQLITE_PRINTF_MALLOCED;
}else{
sqlite3_str_reset(p);
- setStrAccumError(p, SQLITE_NOMEM);
+ sqlite3StrAccumSetError(p, SQLITE_NOMEM);
return 0;
}
}
- return N;
+ assert( N>=0 && N<=0x7fffffff );
+ return (int)N;
}
/*
@@ -29644,7 +31268,7 @@ static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){
memcpy(zText, p->zText, p->nChar+1);
p->printfFlags |= SQLITE_PRINTF_MALLOCED;
}else{
- setStrAccumError(p, SQLITE_NOMEM);
+ sqlite3StrAccumSetError(p, SQLITE_NOMEM);
}
p->zText = zText;
return zText;
@@ -29660,6 +31284,22 @@ SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){
}
/*
+** Use the content of the StrAccum passed as the second argument
+** as the result of an SQL function.
+*/
+SQLITE_PRIVATE void sqlite3ResultStrAccum(sqlite3_context *pCtx, StrAccum *p){
+ if( p->accError ){
+ sqlite3_result_error_code(pCtx, p->accError);
+ sqlite3_str_reset(p);
+ }else if( isMalloced(p) ){
+ sqlite3_result_text(pCtx, p->zText, p->nChar, SQLITE_DYNAMIC);
+ }else{
+ sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC);
+ sqlite3_str_reset(p);
+ }
+}
+
+/*
** This singleton is an sqlite3_str object that is returned if
** sqlite3_malloc() fails to provide space for a real one. This
** sqlite3_str object accepts no new text and always returns
@@ -29850,12 +31490,22 @@ SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_li
return zBuf;
}
SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
- char *z;
+ StrAccum acc;
va_list ap;
+ if( n<=0 ) return zBuf;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( zBuf==0 || zFormat==0 ) {
+ (void)SQLITE_MISUSE_BKPT;
+ if( zBuf ) zBuf[0] = 0;
+ return zBuf;
+ }
+#endif
+ sqlite3StrAccumInit(&acc, 0, zBuf, n, 0);
va_start(ap,zFormat);
- z = sqlite3_vsnprintf(n, zBuf, zFormat, ap);
+ sqlite3_str_vappendf(&acc, zFormat, ap);
va_end(ap);
- return z;
+ zBuf[acc.nChar] = 0;
+ return zBuf;
}
/*
@@ -29961,40 +31611,44 @@ SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){
** Add a new subitem to the tree. The moreToFollow flag indicates that this
** is not the last item in the tree.
*/
-static TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){
+static void sqlite3TreeViewPush(TreeView **pp, u8 moreToFollow){
+ TreeView *p = *pp;
if( p==0 ){
- p = sqlite3_malloc64( sizeof(*p) );
- if( p==0 ) return 0;
+ *pp = p = sqlite3_malloc64( sizeof(*p) );
+ if( p==0 ) return;
memset(p, 0, sizeof(*p));
}else{
p->iLevel++;
}
assert( moreToFollow==0 || moreToFollow==1 );
- if( p->iLevel<sizeof(p->bLine) ) p->bLine[p->iLevel] = moreToFollow;
- return p;
+ if( p->iLevel<(int)sizeof(p->bLine) ) p->bLine[p->iLevel] = moreToFollow;
}
/*
** Finished with one layer of the tree
*/
-static void sqlite3TreeViewPop(TreeView *p){
+static void sqlite3TreeViewPop(TreeView **pp){
+ TreeView *p = *pp;
if( p==0 ) return;
p->iLevel--;
- if( p->iLevel<0 ) sqlite3_free(p);
+ if( p->iLevel<0 ){
+ sqlite3_free(p);
+ *pp = 0;
+ }
}
/*
** Generate a single line of output for the tree, with a prefix that contains
** all the appropriate tree lines
*/
-static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){
+SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){
va_list ap;
int i;
StrAccum acc;
- char zBuf[500];
+ char zBuf[1000];
sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
if( p ){
- for(i=0; i<p->iLevel && i<sizeof(p->bLine)-1; i++){
+ for(i=0; i<p->iLevel && i<(int)sizeof(p->bLine)-1; i++){
sqlite3_str_append(&acc, p->bLine[i] ? "| " : " ", 4);
}
sqlite3_str_append(&acc, p->bLine[i] ? "|-- " : "'-- ", 4);
@@ -30015,11 +31669,58 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){
** Shorthand for starting a new tree item that consists of a single label
*/
static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){
- p = sqlite3TreeViewPush(p, moreFollows);
+ sqlite3TreeViewPush(&p, moreFollows);
sqlite3TreeViewLine(p, "%s", zLabel);
}
/*
+** Show a list of Column objects in tree format.
+*/
+SQLITE_PRIVATE void sqlite3TreeViewColumnList(
+ TreeView *pView,
+ const Column *aCol,
+ int nCol,
+ u8 moreToFollow
+){
+ int i;
+ sqlite3TreeViewPush(&pView, moreToFollow);
+ sqlite3TreeViewLine(pView, "COLUMNS");
+ for(i=0; i<nCol; i++){
+ u16 flg = aCol[i].colFlags;
+ int colMoreToFollow = i<(nCol - 1);
+ sqlite3TreeViewPush(&pView, colMoreToFollow);
+ sqlite3TreeViewLine(pView, 0);
+ printf(" %s", aCol[i].zCnName);
+ switch( aCol[i].eCType ){
+ case COLTYPE_ANY: printf(" ANY"); break;
+ case COLTYPE_BLOB: printf(" BLOB"); break;
+ case COLTYPE_INT: printf(" INT"); break;
+ case COLTYPE_INTEGER: printf(" INTEGER"); break;
+ case COLTYPE_REAL: printf(" REAL"); break;
+ case COLTYPE_TEXT: printf(" TEXT"); break;
+ case COLTYPE_CUSTOM: {
+ if( flg & COLFLAG_HASTYPE ){
+ const char *z = aCol[i].zCnName;
+ z += strlen(z)+1;
+ printf(" X-%s", z);
+ break;
+ }
+ }
+ }
+ if( flg & COLFLAG_PRIMKEY ) printf(" PRIMARY KEY");
+ if( flg & COLFLAG_HIDDEN ) printf(" HIDDEN");
+#ifdef COLFLAG_NOEXPAND
+ if( flg & COLFLAG_NOEXPAND ) printf(" NO-EXPAND");
+#endif
+ if( flg ) printf(" flags=%04x", flg);
+ printf("\n");
+ fflush(stdout);
+ sqlite3TreeViewPop(&pView);
+ }
+ sqlite3TreeViewPop(&pView);
+}
+
+/*
** Generate a human-readable description of a WITH clause.
*/
SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){
@@ -30032,7 +31733,7 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m
sqlite3TreeViewLine(pView, "WITH (0x%p)", pWith);
}
if( pWith->nCte>0 ){
- pView = sqlite3TreeViewPush(pView, 1);
+ sqlite3TreeViewPush(&pView, moreToFollow);
for(i=0; i<pWith->nCte; i++){
StrAccum x;
char zLine[1000];
@@ -30048,6 +31749,10 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m
}
sqlite3_str_appendf(&x, ")");
}
+ if( pCte->eM10d!=M10d_Any ){
+ sqlite3_str_appendf(&x, " %sMATERIALIZED",
+ pCte->eM10d==M10d_No ? "NOT " : "");
+ }
if( pCte->pUse ){
sqlite3_str_appendf(&x, " (pUse=0x%p, nUse=%d)", pCte->pUse,
pCte->pUse->nUse);
@@ -30055,9 +31760,9 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m
sqlite3StrAccumFinish(&x);
sqlite3TreeViewItem(pView, zLine, i<pWith->nCte-1);
sqlite3TreeViewSelect(pView, pCte->pSelect, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
}
@@ -30066,10 +31771,12 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m
*/
SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){
int i;
+ if( pSrc==0 ) return;
for(i=0; i<pSrc->nSrc; i++){
const SrcItem *pItem = &pSrc->a[i];
StrAccum x;
- char zLine[100];
+ int n = 0;
+ char zLine[1000];
sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0);
x.printfFlags |= SQLITE_PRINTF_INTERNAL;
sqlite3_str_appendf(&x, "{%d:*} %!S", pItem->iCursor, pItem);
@@ -30077,8 +31784,17 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc)
sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p used=%llx",
pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab, pItem->colUsed);
}
- if( pItem->fg.jointype & JT_LEFT ){
+ if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==(JT_LEFT|JT_RIGHT) ){
+ sqlite3_str_appendf(&x, " FULL-OUTER-JOIN");
+ }else if( pItem->fg.jointype & JT_LEFT ){
sqlite3_str_appendf(&x, " LEFT-JOIN");
+ }else if( pItem->fg.jointype & JT_RIGHT ){
+ sqlite3_str_appendf(&x, " RIGHT-JOIN");
+ }else if( pItem->fg.jointype & JT_CROSS ){
+ sqlite3_str_appendf(&x, " CROSS-JOIN");
+ }
+ if( pItem->fg.jointype & JT_LTORJ ){
+ sqlite3_str_appendf(&x, " LTORJ");
}
if( pItem->fg.fromDDL ){
sqlite3_str_appendf(&x, " DDL");
@@ -30086,15 +31802,37 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc)
if( pItem->fg.isCte ){
sqlite3_str_appendf(&x, " CteUse=0x%p", pItem->u2.pCteUse);
}
+ if( pItem->fg.isOn || (pItem->fg.isUsing==0 && pItem->u3.pOn!=0) ){
+ sqlite3_str_appendf(&x, " ON");
+ }
+ if( pItem->fg.isTabFunc ) sqlite3_str_appendf(&x, " isTabFunc");
+ if( pItem->fg.isCorrelated ) sqlite3_str_appendf(&x, " isCorrelated");
+ if( pItem->fg.isMaterialized ) sqlite3_str_appendf(&x, " isMaterialized");
+ if( pItem->fg.viaCoroutine ) sqlite3_str_appendf(&x, " viaCoroutine");
+ if( pItem->fg.notCte ) sqlite3_str_appendf(&x, " notCte");
+ if( pItem->fg.isNestedFrom ) sqlite3_str_appendf(&x, " isNestedFrom");
+
sqlite3StrAccumFinish(&x);
sqlite3TreeViewItem(pView, zLine, i<pSrc->nSrc-1);
+ n = 0;
+ if( pItem->pSelect ) n++;
+ if( pItem->fg.isTabFunc ) n++;
+ if( pItem->fg.isUsing ) n++;
+ if( pItem->fg.isUsing ){
+ sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING");
+ }
if( pItem->pSelect ){
- sqlite3TreeViewSelect(pView, pItem->pSelect, 0);
+ if( pItem->pTab ){
+ Table *pTab = pItem->pTab;
+ sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, 1);
+ }
+ assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) );
+ sqlite3TreeViewSelect(pView, pItem->pSelect, (--n)>0);
}
if( pItem->fg.isTabFunc ){
sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:");
}
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
}
@@ -30108,11 +31846,11 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
sqlite3TreeViewLine(pView, "nil-SELECT");
return;
}
- pView = sqlite3TreeViewPush(pView, moreToFollow);
+ sqlite3TreeViewPush(&pView, moreToFollow);
if( p->pWith ){
sqlite3TreeViewWith(pView, p->pWith, 1);
cnt = 1;
- sqlite3TreeViewPush(pView, 1);
+ sqlite3TreeViewPush(&pView, 1);
}
do{
if( p->selFlags & SF_WhereBegin ){
@@ -30126,7 +31864,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
(int)p->nSelectRow
);
}
- if( cnt++ ) sqlite3TreeViewPop(pView);
+ if( cnt++ ) sqlite3TreeViewPop(&pView);
if( p->pPrior ){
n = 1000;
}else{
@@ -30149,24 +31887,24 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
#ifndef SQLITE_OMIT_WINDOWFUNC
if( p->pWin ){
Window *pX;
- pView = sqlite3TreeViewPush(pView, (n--)>0);
+ sqlite3TreeViewPush(&pView, (n--)>0);
sqlite3TreeViewLine(pView, "window-functions");
for(pX=p->pWin; pX; pX=pX->pNextWin){
sqlite3TreeViewWinFunc(pView, pX, pX->pNextWin!=0);
}
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
#endif
if( p->pSrc && p->pSrc->nSrc ){
- pView = sqlite3TreeViewPush(pView, (n--)>0);
+ sqlite3TreeViewPush(&pView, (n--)>0);
sqlite3TreeViewLine(pView, "FROM");
sqlite3TreeViewSrcList(pView, p->pSrc);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
if( p->pWhere ){
sqlite3TreeViewItem(pView, "WHERE", (n--)>0);
sqlite3TreeViewExpr(pView, p->pWhere, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
if( p->pGroupBy ){
sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY");
@@ -30174,7 +31912,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
if( p->pHaving ){
sqlite3TreeViewItem(pView, "HAVING", (n--)>0);
sqlite3TreeViewExpr(pView, p->pHaving, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
#ifndef SQLITE_OMIT_WINDOWFUNC
if( p->pWinDefn ){
@@ -30183,7 +31921,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
for(pX=p->pWinDefn; pX; pX=pX->pNextWin){
sqlite3TreeViewWindow(pView, pX, pX->pNextWin!=0);
}
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
#endif
if( p->pOrderBy ){
@@ -30195,9 +31933,9 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
if( p->pLimit->pRight ){
sqlite3TreeViewItem(pView, "OFFSET", (n--)>0);
sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
if( p->pPrior ){
const char *zOp = "UNION";
@@ -30210,7 +31948,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m
}
p = p->pPrior;
}while( p!=0 );
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
#ifndef SQLITE_OMIT_WINDOWFUNC
@@ -30226,24 +31964,24 @@ SQLITE_PRIVATE void sqlite3TreeViewBound(
switch( eBound ){
case TK_UNBOUNDED: {
sqlite3TreeViewItem(pView, "UNBOUNDED", moreToFollow);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
break;
}
case TK_CURRENT: {
sqlite3TreeViewItem(pView, "CURRENT", moreToFollow);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
break;
}
case TK_PRECEDING: {
sqlite3TreeViewItem(pView, "PRECEDING", moreToFollow);
sqlite3TreeViewExpr(pView, pExpr, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
break;
}
case TK_FOLLOWING: {
sqlite3TreeViewItem(pView, "FOLLOWING", moreToFollow);
sqlite3TreeViewExpr(pView, pExpr, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
break;
}
}
@@ -30256,12 +31994,13 @@ SQLITE_PRIVATE void sqlite3TreeViewBound(
*/
SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){
int nElement = 0;
+ if( pWin==0 ) return;
if( pWin->pFilter ){
sqlite3TreeViewItem(pView, "FILTER", 1);
sqlite3TreeViewExpr(pView, pWin->pFilter, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
- pView = sqlite3TreeViewPush(pView, more);
+ sqlite3TreeViewPush(&pView, more);
if( pWin->zName ){
sqlite3TreeViewLine(pView, "OVER %s (%p)", pWin->zName, pWin);
}else{
@@ -30272,9 +32011,9 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u
if( pWin->eFrmType ) nElement++;
if( pWin->eExclude ) nElement++;
if( pWin->zBase ){
- sqlite3TreeViewPush(pView, (--nElement)>0);
+ sqlite3TreeViewPush(&pView, (--nElement)>0);
sqlite3TreeViewLine(pView, "window: %s", pWin->zBase);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
if( pWin->pPartition ){
sqlite3TreeViewExprList(pView, pWin->pPartition, nElement>0,"PARTITION-BY");
@@ -30292,7 +32031,7 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u
sqlite3TreeViewItem(pView, zBuf, (--nElement)>0);
sqlite3TreeViewBound(pView, pWin->eStart, pWin->pStart, 1);
sqlite3TreeViewBound(pView, pWin->eEnd, pWin->pEnd, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
if( pWin->eExclude ){
char zBuf[30];
@@ -30307,11 +32046,11 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u
zExclude = zBuf;
break;
}
- sqlite3TreeViewPush(pView, 0);
+ sqlite3TreeViewPush(&pView, 0);
sqlite3TreeViewLine(pView, "EXCLUDE %s", zExclude);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
#endif /* SQLITE_OMIT_WINDOWFUNC */
@@ -30320,11 +32059,12 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u
** Generate a human-readable explanation for a Window Function object
*/
SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView *pView, const Window *pWin, u8 more){
- pView = sqlite3TreeViewPush(pView, more);
+ if( pWin==0 ) return;
+ sqlite3TreeViewPush(&pView, more);
sqlite3TreeViewLine(pView, "WINFUNC %s(%d)",
- pWin->pFunc->zName, pWin->pFunc->nArg);
+ pWin->pWFunc->zName, pWin->pWFunc->nArg);
sqlite3TreeViewWindow(pView, pWin, 0);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
#endif /* SQLITE_OMIT_WINDOWFUNC */
@@ -30335,19 +32075,22 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
const char *zBinOp = 0; /* Binary operator */
const char *zUniOp = 0; /* Unary operator */
char zFlgs[200];
- pView = sqlite3TreeViewPush(pView, moreToFollow);
+ sqlite3TreeViewPush(&pView, moreToFollow);
if( pExpr==0 ){
sqlite3TreeViewLine(pView, "nil");
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
return;
}
- if( pExpr->flags || pExpr->affExpr || pExpr->vvaFlags ){
+ if( pExpr->flags || pExpr->affExpr || pExpr->vvaFlags || pExpr->pAggInfo ){
StrAccum x;
sqlite3StrAccumInit(&x, 0, zFlgs, sizeof(zFlgs), 0);
sqlite3_str_appendf(&x, " fg.af=%x.%c",
pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n');
- if( ExprHasProperty(pExpr, EP_FromJoin) ){
- sqlite3_str_appendf(&x, " iRJT=%d", pExpr->iRightJoinTable);
+ if( ExprHasProperty(pExpr, EP_OuterON) ){
+ sqlite3_str_appendf(&x, " outer.iJoin=%d", pExpr->w.iJoin);
+ }
+ if( ExprHasProperty(pExpr, EP_InnerON) ){
+ sqlite3_str_appendf(&x, " inner.iJoin=%d", pExpr->w.iJoin);
}
if( ExprHasProperty(pExpr, EP_FromDDL) ){
sqlite3_str_appendf(&x, " DDL");
@@ -30355,6 +32098,9 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
if( ExprHasVVAProperty(pExpr, EP_Immutable) ){
sqlite3_str_appendf(&x, " IMMUTABLE");
}
+ if( pExpr->pAggInfo!=0 ){
+ sqlite3_str_appendf(&x, " agg-column[%d]", pExpr->iAgg);
+ }
sqlite3StrAccumFinish(&x);
}else{
zFlgs[0] = 0;
@@ -30377,6 +32123,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
sqlite3TreeViewLine(pView, "COLUMN(%d)%s%s",
pExpr->iColumn, zFlgs, zOp2);
}else{
+ assert( ExprUseYTab(pExpr) );
sqlite3TreeViewLine(pView, "{%d:%d} pTab=%p%s",
pExpr->iTable, pExpr->iColumn,
pExpr->y.pTab, zFlgs);
@@ -30396,11 +32143,13 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
}
#ifndef SQLITE_OMIT_FLOATING_POINT
case TK_FLOAT: {
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken);
break;
}
#endif
case TK_STRING: {
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken);
break;
}
@@ -30409,17 +32158,19 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
break;
}
case TK_TRUEFALSE: {
- sqlite3TreeViewLine(pView,
- sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE");
+ sqlite3TreeViewLine(pView,"%s%s",
+ sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE", zFlgs);
break;
}
#ifndef SQLITE_OMIT_BLOB_LITERAL
case TK_BLOB: {
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken);
break;
}
#endif
case TK_VARIABLE: {
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)",
pExpr->u.zToken, pExpr->iColumn);
break;
@@ -30429,12 +32180,14 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
break;
}
case TK_ID: {
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken);
break;
}
#ifndef SQLITE_OMIT_CAST
case TK_CAST: {
/* Expressions of the form: CAST(pLeft AS token) */
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken);
sqlite3TreeViewExpr(pView, pExpr->pLeft, 0);
break;
@@ -30484,6 +32237,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
}
case TK_SPAN: {
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken);
sqlite3TreeViewExpr(pView, pExpr->pLeft, 0);
break;
@@ -30495,6 +32249,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
** up in the treeview output as "SOFT-COLLATE". Explicit COLLATE
** operators that appear in the original SQL always have the
** EP_Collate bit set and appear in treeview output as just "COLLATE" */
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView, "%sCOLLATE %Q%s",
!ExprHasProperty(pExpr, EP_Collate) ? "SOFT-" : "",
pExpr->u.zToken, zFlgs);
@@ -30510,6 +32265,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
pFarg = 0;
pWin = 0;
}else{
+ assert( ExprUseXList(pExpr) );
pFarg = pExpr->x.pList;
#ifndef SQLITE_OMIT_WINDOWFUNC
pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0;
@@ -30517,6 +32273,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
pWin = 0;
#endif
}
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
if( pExpr->op==TK_AGG_FUNCTION ){
sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s agg=%d[%d]/%p",
pExpr->op2, pExpr->u.zToken, zFlgs,
@@ -30548,19 +32305,31 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
}
#ifndef SQLITE_OMIT_SUBQUERY
case TK_EXISTS: {
+ assert( ExprUseXSelect(pExpr) );
sqlite3TreeViewLine(pView, "EXISTS-expr flags=0x%x", pExpr->flags);
sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0);
break;
}
case TK_SELECT: {
+ assert( ExprUseXSelect(pExpr) );
sqlite3TreeViewLine(pView, "subquery-expr flags=0x%x", pExpr->flags);
sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0);
break;
}
case TK_IN: {
- sqlite3TreeViewLine(pView, "IN flags=0x%x", pExpr->flags);
+ sqlite3_str *pStr = sqlite3_str_new(0);
+ char *z;
+ sqlite3_str_appendf(pStr, "IN flags=0x%x", pExpr->flags);
+ if( pExpr->iTable ) sqlite3_str_appendf(pStr, " iTable=%d",pExpr->iTable);
+ if( ExprHasProperty(pExpr, EP_Subrtn) ){
+ sqlite3_str_appendf(pStr, " subrtn(%d,%d)",
+ pExpr->y.sub.regReturn, pExpr->y.sub.iAddr);
+ }
+ z = sqlite3_str_finish(pStr);
+ sqlite3TreeViewLine(pView, z);
+ sqlite3_free(z);
sqlite3TreeViewExpr(pView, pExpr->pLeft, 1);
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0);
}else{
sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0);
@@ -30581,9 +32350,12 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
** Z is stored in pExpr->pList->a[1].pExpr.
*/
case TK_BETWEEN: {
- Expr *pX = pExpr->pLeft;
- Expr *pY = pExpr->x.pList->a[0].pExpr;
- Expr *pZ = pExpr->x.pList->a[1].pExpr;
+ const Expr *pX, *pY, *pZ;
+ pX = pExpr->pLeft;
+ assert( ExprUseXList(pExpr) );
+ assert( pExpr->x.pList->nExpr==2 );
+ pY = pExpr->x.pList->a[0].pExpr;
+ pZ = pExpr->x.pList->a[1].pExpr;
sqlite3TreeViewLine(pView, "BETWEEN");
sqlite3TreeViewExpr(pView, pX, 1);
sqlite3TreeViewExpr(pView, pY, 1);
@@ -30605,6 +32377,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
case TK_CASE: {
sqlite3TreeViewLine(pView, "CASE");
sqlite3TreeViewExpr(pView, pExpr->pLeft, 1);
+ assert( ExprUseXList(pExpr) );
sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0);
break;
}
@@ -30617,6 +32390,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
case OE_Fail: zType = "fail"; break;
case OE_Ignore: zType = "ignore"; break;
}
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken);
break;
}
@@ -30629,12 +32403,16 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
}
case TK_VECTOR: {
char *z = sqlite3_mprintf("VECTOR%s",zFlgs);
+ assert( ExprUseXList(pExpr) );
sqlite3TreeViewBareExprList(pView, pExpr->x.pList, z);
sqlite3_free(z);
break;
}
case TK_SELECT_COLUMN: {
- sqlite3TreeViewLine(pView, "SELECT-COLUMN %d", pExpr->iColumn);
+ sqlite3TreeViewLine(pView, "SELECT-COLUMN %d of [0..%d]%s",
+ pExpr->iColumn, pExpr->iTable-1,
+ pExpr->pRight==pExpr->pLeft ? " (SELECT-owner)" : "");
+ assert( ExprUseXSelect(pExpr->pLeft) );
sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0);
break;
}
@@ -30651,6 +32429,15 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
sqlite3TreeViewExpr(pView, &tmp, 0);
break;
}
+ case TK_ROW: {
+ if( pExpr->iColumn<=0 ){
+ sqlite3TreeViewLine(pView, "First FROM table rowid");
+ }else{
+ sqlite3TreeViewLine(pView, "First FROM table column %d",
+ pExpr->iColumn-1);
+ }
+ break;
+ }
default: {
sqlite3TreeViewLine(pView, "op=%d", pExpr->op);
break;
@@ -30664,7 +32451,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m
sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs);
sqlite3TreeViewExpr(pView, pExpr->pLeft, 0);
}
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
@@ -30686,13 +32473,25 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList(
int j = pList->a[i].u.x.iOrderByCol;
char *zName = pList->a[i].zEName;
int moreToFollow = i<pList->nExpr - 1;
- if( pList->a[i].eEName!=ENAME_NAME ) zName = 0;
if( j || zName ){
- sqlite3TreeViewPush(pView, moreToFollow);
+ sqlite3TreeViewPush(&pView, moreToFollow);
moreToFollow = 0;
sqlite3TreeViewLine(pView, 0);
if( zName ){
- fprintf(stdout, "AS %s ", zName);
+ switch( pList->a[i].fg.eEName ){
+ default:
+ fprintf(stdout, "AS %s ", zName);
+ break;
+ case ENAME_TAB:
+ fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName);
+ if( pList->a[i].fg.bUsed ) fprintf(stdout, "(used) ");
+ if( pList->a[i].fg.bUsingTerm ) fprintf(stdout, "(USING-term) ");
+ if( pList->a[i].fg.bNoExpand ) fprintf(stdout, "(NoExpand) ");
+ break;
+ case ENAME_SPAN:
+ fprintf(stdout, "SPAN(\"%s\") ", zName);
+ break;
+ }
}
if( j ){
fprintf(stdout, "iOrderByCol=%d", j);
@@ -30702,7 +32501,7 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList(
}
sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow);
if( j || zName ){
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
}
}
}
@@ -30713,11 +32512,378 @@ SQLITE_PRIVATE void sqlite3TreeViewExprList(
u8 moreToFollow,
const char *zLabel
){
- pView = sqlite3TreeViewPush(pView, moreToFollow);
+ sqlite3TreeViewPush(&pView, moreToFollow);
sqlite3TreeViewBareExprList(pView, pList, zLabel);
- sqlite3TreeViewPop(pView);
+ sqlite3TreeViewPop(&pView);
+}
+
+/*
+** Generate a human-readable explanation of an id-list.
+*/
+SQLITE_PRIVATE void sqlite3TreeViewBareIdList(
+ TreeView *pView,
+ const IdList *pList,
+ const char *zLabel
+){
+ if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST";
+ if( pList==0 ){
+ sqlite3TreeViewLine(pView, "%s (empty)", zLabel);
+ }else{
+ int i;
+ sqlite3TreeViewLine(pView, "%s", zLabel);
+ for(i=0; i<pList->nId; i++){
+ char *zName = pList->a[i].zName;
+ int moreToFollow = i<pList->nId - 1;
+ if( zName==0 ) zName = "(null)";
+ sqlite3TreeViewPush(&pView, moreToFollow);
+ sqlite3TreeViewLine(pView, 0);
+ if( pList->eU4==EU4_NONE ){
+ fprintf(stdout, "%s\n", zName);
+ }else if( pList->eU4==EU4_IDX ){
+ fprintf(stdout, "%s (%d)\n", zName, pList->a[i].u4.idx);
+ }else{
+ assert( pList->eU4==EU4_EXPR );
+ if( pList->a[i].u4.pExpr==0 ){
+ fprintf(stdout, "%s (pExpr=NULL)\n", zName);
+ }else{
+ fprintf(stdout, "%s\n", zName);
+ sqlite3TreeViewPush(&pView, i<pList->nId-1);
+ sqlite3TreeViewExpr(pView, pList->a[i].u4.pExpr, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ }
+ sqlite3TreeViewPop(&pView);
+ }
+ }
+}
+SQLITE_PRIVATE void sqlite3TreeViewIdList(
+ TreeView *pView,
+ const IdList *pList,
+ u8 moreToFollow,
+ const char *zLabel
+){
+ sqlite3TreeViewPush(&pView, moreToFollow);
+ sqlite3TreeViewBareIdList(pView, pList, zLabel);
+ sqlite3TreeViewPop(&pView);
+}
+
+/*
+** Generate a human-readable explanation of a list of Upsert objects
+*/
+SQLITE_PRIVATE void sqlite3TreeViewUpsert(
+ TreeView *pView,
+ const Upsert *pUpsert,
+ u8 moreToFollow
+){
+ if( pUpsert==0 ) return;
+ sqlite3TreeViewPush(&pView, moreToFollow);
+ while( pUpsert ){
+ int n;
+ sqlite3TreeViewPush(&pView, pUpsert->pNextUpsert!=0 || moreToFollow);
+ sqlite3TreeViewLine(pView, "ON CONFLICT DO %s",
+ pUpsert->isDoUpdate ? "UPDATE" : "NOTHING");
+ n = (pUpsert->pUpsertSet!=0) + (pUpsert->pUpsertWhere!=0);
+ sqlite3TreeViewExprList(pView, pUpsert->pUpsertTarget, (n--)>0, "TARGET");
+ sqlite3TreeViewExprList(pView, pUpsert->pUpsertSet, (n--)>0, "SET");
+ if( pUpsert->pUpsertWhere ){
+ sqlite3TreeViewItem(pView, "WHERE", (n--)>0);
+ sqlite3TreeViewExpr(pView, pUpsert->pUpsertWhere, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ sqlite3TreeViewPop(&pView);
+ pUpsert = pUpsert->pNextUpsert;
+ }
+ sqlite3TreeViewPop(&pView);
+}
+
+#if TREETRACE_ENABLED
+/*
+** Generate a human-readable diagram of the data structure that go
+** into generating an DELETE statement.
+*/
+SQLITE_PRIVATE void sqlite3TreeViewDelete(
+ const With *pWith,
+ const SrcList *pTabList,
+ const Expr *pWhere,
+ const ExprList *pOrderBy,
+ const Expr *pLimit,
+ const Trigger *pTrigger
+){
+ int n = 0;
+ TreeView *pView = 0;
+ sqlite3TreeViewPush(&pView, 0);
+ sqlite3TreeViewLine(pView, "DELETE");
+ if( pWith ) n++;
+ if( pTabList ) n++;
+ if( pWhere ) n++;
+ if( pOrderBy ) n++;
+ if( pLimit ) n++;
+ if( pTrigger ) n++;
+ if( pWith ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewWith(pView, pWith, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pTabList ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "FROM");
+ sqlite3TreeViewSrcList(pView, pTabList);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pWhere ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "WHERE");
+ sqlite3TreeViewExpr(pView, pWhere, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pOrderBy ){
+ sqlite3TreeViewExprList(pView, pOrderBy, (--n)>0, "ORDER-BY");
+ }
+ if( pLimit ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "LIMIT");
+ sqlite3TreeViewExpr(pView, pLimit, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pTrigger ){
+ sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1);
+ }
+ sqlite3TreeViewPop(&pView);
+}
+#endif /* TREETRACE_ENABLED */
+
+#if TREETRACE_ENABLED
+/*
+** Generate a human-readable diagram of the data structure that go
+** into generating an INSERT statement.
+*/
+SQLITE_PRIVATE void sqlite3TreeViewInsert(
+ const With *pWith,
+ const SrcList *pTabList,
+ const IdList *pColumnList,
+ const Select *pSelect,
+ const ExprList *pExprList,
+ int onError,
+ const Upsert *pUpsert,
+ const Trigger *pTrigger
+){
+ TreeView *pView = 0;
+ int n = 0;
+ const char *zLabel = "INSERT";
+ switch( onError ){
+ case OE_Replace: zLabel = "REPLACE"; break;
+ case OE_Ignore: zLabel = "INSERT OR IGNORE"; break;
+ case OE_Rollback: zLabel = "INSERT OR ROLLBACK"; break;
+ case OE_Abort: zLabel = "INSERT OR ABORT"; break;
+ case OE_Fail: zLabel = "INSERT OR FAIL"; break;
+ }
+ sqlite3TreeViewPush(&pView, 0);
+ sqlite3TreeViewLine(pView, zLabel);
+ if( pWith ) n++;
+ if( pTabList ) n++;
+ if( pColumnList ) n++;
+ if( pSelect ) n++;
+ if( pExprList ) n++;
+ if( pUpsert ) n++;
+ if( pTrigger ) n++;
+ if( pWith ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewWith(pView, pWith, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pTabList ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "INTO");
+ sqlite3TreeViewSrcList(pView, pTabList);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pColumnList ){
+ sqlite3TreeViewIdList(pView, pColumnList, (--n)>0, "COLUMNS");
+ }
+ if( pSelect ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "DATA-SOURCE");
+ sqlite3TreeViewSelect(pView, pSelect, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pExprList ){
+ sqlite3TreeViewExprList(pView, pExprList, (--n)>0, "VALUES");
+ }
+ if( pUpsert ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "UPSERT");
+ sqlite3TreeViewUpsert(pView, pUpsert, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pTrigger ){
+ sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1);
+ }
+ sqlite3TreeViewPop(&pView);
+}
+#endif /* TREETRACE_ENABLED */
+
+#if TREETRACE_ENABLED
+/*
+** Generate a human-readable diagram of the data structure that go
+** into generating an UPDATE statement.
+*/
+SQLITE_PRIVATE void sqlite3TreeViewUpdate(
+ const With *pWith,
+ const SrcList *pTabList,
+ const ExprList *pChanges,
+ const Expr *pWhere,
+ int onError,
+ const ExprList *pOrderBy,
+ const Expr *pLimit,
+ const Upsert *pUpsert,
+ const Trigger *pTrigger
+){
+ int n = 0;
+ TreeView *pView = 0;
+ const char *zLabel = "UPDATE";
+ switch( onError ){
+ case OE_Replace: zLabel = "UPDATE OR REPLACE"; break;
+ case OE_Ignore: zLabel = "UPDATE OR IGNORE"; break;
+ case OE_Rollback: zLabel = "UPDATE OR ROLLBACK"; break;
+ case OE_Abort: zLabel = "UPDATE OR ABORT"; break;
+ case OE_Fail: zLabel = "UPDATE OR FAIL"; break;
+ }
+ sqlite3TreeViewPush(&pView, 0);
+ sqlite3TreeViewLine(pView, zLabel);
+ if( pWith ) n++;
+ if( pTabList ) n++;
+ if( pChanges ) n++;
+ if( pWhere ) n++;
+ if( pOrderBy ) n++;
+ if( pLimit ) n++;
+ if( pUpsert ) n++;
+ if( pTrigger ) n++;
+ if( pWith ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewWith(pView, pWith, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pTabList ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "FROM");
+ sqlite3TreeViewSrcList(pView, pTabList);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pChanges ){
+ sqlite3TreeViewExprList(pView, pChanges, (--n)>0, "SET");
+ }
+ if( pWhere ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "WHERE");
+ sqlite3TreeViewExpr(pView, pWhere, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pOrderBy ){
+ sqlite3TreeViewExprList(pView, pOrderBy, (--n)>0, "ORDER-BY");
+ }
+ if( pLimit ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "LIMIT");
+ sqlite3TreeViewExpr(pView, pLimit, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pUpsert ){
+ sqlite3TreeViewPush(&pView, (--n)>0);
+ sqlite3TreeViewLine(pView, "UPSERT");
+ sqlite3TreeViewUpsert(pView, pUpsert, 0);
+ sqlite3TreeViewPop(&pView);
+ }
+ if( pTrigger ){
+ sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1);
+ }
+ sqlite3TreeViewPop(&pView);
+}
+#endif /* TREETRACE_ENABLED */
+
+#ifndef SQLITE_OMIT_TRIGGER
+/*
+** Show a human-readable graph of a TriggerStep
+*/
+SQLITE_PRIVATE void sqlite3TreeViewTriggerStep(
+ TreeView *pView,
+ const TriggerStep *pStep,
+ u8 moreToFollow,
+ u8 showFullList
+){
+ int cnt = 0;
+ if( pStep==0 ) return;
+ sqlite3TreeViewPush(&pView,
+ moreToFollow || (showFullList && pStep->pNext!=0));
+ do{
+ if( cnt++ && pStep->pNext==0 ){
+ sqlite3TreeViewPop(&pView);
+ sqlite3TreeViewPush(&pView, 0);
+ }
+ sqlite3TreeViewLine(pView, "%s", pStep->zSpan ? pStep->zSpan : "RETURNING");
+ }while( showFullList && (pStep = pStep->pNext)!=0 );
+ sqlite3TreeViewPop(&pView);
}
+/*
+** Show a human-readable graph of a Trigger
+*/
+SQLITE_PRIVATE void sqlite3TreeViewTrigger(
+ TreeView *pView,
+ const Trigger *pTrigger,
+ u8 moreToFollow,
+ u8 showFullList
+){
+ int cnt = 0;
+ if( pTrigger==0 ) return;
+ sqlite3TreeViewPush(&pView,
+ moreToFollow || (showFullList && pTrigger->pNext!=0));
+ do{
+ if( cnt++ && pTrigger->pNext==0 ){
+ sqlite3TreeViewPop(&pView);
+ sqlite3TreeViewPush(&pView, 0);
+ }
+ sqlite3TreeViewLine(pView, "TRIGGER %s", pTrigger->zName);
+ sqlite3TreeViewPush(&pView, 0);
+ sqlite3TreeViewTriggerStep(pView, pTrigger->step_list, 0, 1);
+ sqlite3TreeViewPop(&pView);
+ }while( showFullList && (pTrigger = pTrigger->pNext)!=0 );
+ sqlite3TreeViewPop(&pView);
+}
+#endif /* SQLITE_OMIT_TRIGGER */
+
+
+/*
+** These simplified versions of the tree-view routines omit unnecessary
+** parameters. These variants are intended to be used from a symbolic
+** debugger, such as "gdb", during interactive debugging sessions.
+**
+** This routines are given external linkage so that they will always be
+** accessible to the debugging, and to avoid warnings about unused
+** functions. But these routines only exist in debugging builds, so they
+** do not contaminate the interface.
+*/
+SQLITE_PRIVATE void sqlite3ShowExpr(const Expr *p){ sqlite3TreeViewExpr(0,p,0); }
+SQLITE_PRIVATE void sqlite3ShowExprList(const ExprList *p){ sqlite3TreeViewExprList(0,p,0,0);}
+SQLITE_PRIVATE void sqlite3ShowIdList(const IdList *p){ sqlite3TreeViewIdList(0,p,0,0); }
+SQLITE_PRIVATE void sqlite3ShowSrcList(const SrcList *p){ sqlite3TreeViewSrcList(0,p); }
+SQLITE_PRIVATE void sqlite3ShowSelect(const Select *p){ sqlite3TreeViewSelect(0,p,0); }
+SQLITE_PRIVATE void sqlite3ShowWith(const With *p){ sqlite3TreeViewWith(0,p,0); }
+SQLITE_PRIVATE void sqlite3ShowUpsert(const Upsert *p){ sqlite3TreeViewUpsert(0,p,0); }
+#ifndef SQLITE_OMIT_TRIGGER
+SQLITE_PRIVATE void sqlite3ShowTriggerStep(const TriggerStep *p){
+ sqlite3TreeViewTriggerStep(0,p,0,0);
+}
+SQLITE_PRIVATE void sqlite3ShowTriggerStepList(const TriggerStep *p){
+ sqlite3TreeViewTriggerStep(0,p,0,1);
+}
+SQLITE_PRIVATE void sqlite3ShowTrigger(const Trigger *p){ sqlite3TreeViewTrigger(0,p,0,0); }
+SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger *p){ sqlite3TreeViewTrigger(0,p,0,1);}
+#endif
+#ifndef SQLITE_OMIT_WINDOWFUNC
+SQLITE_PRIVATE void sqlite3ShowWindow(const Window *p){ sqlite3TreeViewWindow(0,p,0); }
+SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window *p){ sqlite3TreeViewWinFunc(0,p,0); }
+#endif
+
#endif /* SQLITE_DEBUG */
/************** End of treeview.c ********************************************/
@@ -30746,16 +32912,41 @@ SQLITE_PRIVATE void sqlite3TreeViewExprList(
** This structure is the current state of the generator.
*/
static SQLITE_WSD struct sqlite3PrngType {
- unsigned char isInit; /* True if initialized */
- unsigned char i, j; /* State variables */
- unsigned char s[256]; /* State variables */
+ u32 s[16]; /* 64 bytes of chacha20 state */
+ u8 out[64]; /* Output bytes */
+ u8 n; /* Output bytes remaining */
} sqlite3Prng;
+
+/* The RFC-7539 ChaCha20 block function
+*/
+#define ROTL(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
+#define QR(a, b, c, d) ( \
+ a += b, d ^= a, d = ROTL(d,16), \
+ c += d, b ^= c, b = ROTL(b,12), \
+ a += b, d ^= a, d = ROTL(d, 8), \
+ c += d, b ^= c, b = ROTL(b, 7))
+static void chacha_block(u32 *out, const u32 *in){
+ int i;
+ u32 x[16];
+ memcpy(x, in, 64);
+ for(i=0; i<10; i++){
+ QR(x[0], x[4], x[ 8], x[12]);
+ QR(x[1], x[5], x[ 9], x[13]);
+ QR(x[2], x[6], x[10], x[14]);
+ QR(x[3], x[7], x[11], x[15]);
+ QR(x[0], x[5], x[10], x[15]);
+ QR(x[1], x[6], x[11], x[12]);
+ QR(x[2], x[7], x[ 8], x[13]);
+ QR(x[3], x[4], x[ 9], x[14]);
+ }
+ for(i=0; i<16; i++) out[i] = x[i]+in[i];
+}
+
/*
** Return N random bytes.
*/
SQLITE_API void sqlite3_randomness(int N, void *pBuf){
- unsigned char t;
unsigned char *zBuf = pBuf;
/* The "wsdPrng" macro will resolve to the pseudo-random number generator
@@ -30785,53 +32976,46 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){
sqlite3_mutex_enter(mutex);
if( N<=0 || pBuf==0 ){
- wsdPrng.isInit = 0;
+ wsdPrng.s[0] = 0;
sqlite3_mutex_leave(mutex);
return;
}
/* Initialize the state of the random number generator once,
- ** the first time this routine is called. The seed value does
- ** not need to contain a lot of randomness since we are not
- ** trying to do secure encryption or anything like that...
- **
- ** Nothing in this file or anywhere else in SQLite does any kind of
- ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random
- ** number generator) not as an encryption device.
+ ** the first time this routine is called.
*/
- if( !wsdPrng.isInit ){
+ if( wsdPrng.s[0]==0 ){
sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
- int i;
- char k[256];
- wsdPrng.j = 0;
- wsdPrng.i = 0;
+ static const u32 chacha20_init[] = {
+ 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574
+ };
+ memcpy(&wsdPrng.s[0], chacha20_init, 16);
if( NEVER(pVfs==0) ){
- memset(k, 0, sizeof(k));
+ memset(&wsdPrng.s[4], 0, 44);
}else{
- sqlite3OsRandomness(pVfs, 256, k);
- }
- for(i=0; i<256; i++){
- wsdPrng.s[i] = (u8)i;
+ sqlite3OsRandomness(pVfs, 44, (char*)&wsdPrng.s[4]);
}
- for(i=0; i<256; i++){
- wsdPrng.j += wsdPrng.s[i] + k[i];
- t = wsdPrng.s[wsdPrng.j];
- wsdPrng.s[wsdPrng.j] = wsdPrng.s[i];
- wsdPrng.s[i] = t;
- }
- wsdPrng.isInit = 1;
+ wsdPrng.s[15] = wsdPrng.s[12];
+ wsdPrng.s[12] = 0;
+ wsdPrng.n = 0;
}
assert( N>0 );
- do{
- wsdPrng.i++;
- t = wsdPrng.s[wsdPrng.i];
- wsdPrng.j += t;
- wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j];
- wsdPrng.s[wsdPrng.j] = t;
- t += wsdPrng.s[wsdPrng.i];
- *(zBuf++) = wsdPrng.s[t];
- }while( --N );
+ while( 1 /* exit by break */ ){
+ if( N<=wsdPrng.n ){
+ memcpy(zBuf, &wsdPrng.out[wsdPrng.n-N], N);
+ wsdPrng.n -= N;
+ break;
+ }
+ if( wsdPrng.n>0 ){
+ memcpy(zBuf, wsdPrng.out, wsdPrng.n);
+ N -= wsdPrng.n;
+ zBuf += wsdPrng.n;
+ }
+ wsdPrng.s[12]++;
+ chacha_block((u32*)wsdPrng.out, wsdPrng.s);
+ wsdPrng.n = 64;
+ }
sqlite3_mutex_leave(mutex);
}
@@ -31703,16 +33887,6 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(void){
#endif
/*
-** Routine needed to support the testcase() macro.
-*/
-#ifdef SQLITE_COVERAGE_TEST
-SQLITE_PRIVATE void sqlite3Coverage(int x){
- static unsigned dummy = 0;
- dummy += (unsigned)x;
-}
-#endif
-
-/*
** Calls to sqlite3FaultSim() are used to simulate a failure during testing,
** or to bypass normal error detection during testing in order to let
** execute proceed futher downstream.
@@ -31741,11 +33915,21 @@ SQLITE_PRIVATE int sqlite3FaultSim(int iTest){
#ifndef SQLITE_OMIT_FLOATING_POINT
/*
** Return true if the floating point value is Not a Number (NaN).
+**
+** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN.
+** Otherwise, we have our own implementation that works on most systems.
*/
SQLITE_PRIVATE int sqlite3IsNaN(double x){
+ int rc; /* The value return */
+#if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN
u64 y;
memcpy(&y,&x,sizeof(y));
- return IsNaN(y);
+ rc = IsNaN(y);
+#else
+ rc = isnan(x);
+#endif /* HAVE_ISNAN */
+ testcase( rc );
+ return rc;
}
#endif /* SQLITE_OMIT_FLOATING_POINT */
@@ -31770,8 +33954,14 @@ SQLITE_PRIVATE int sqlite3Strlen30(const char *z){
** the column name if and only if the COLFLAG_HASTYPE flag is set.
*/
SQLITE_PRIVATE char *sqlite3ColumnType(Column *pCol, char *zDflt){
- if( (pCol->colFlags & COLFLAG_HASTYPE)==0 ) return zDflt;
- return pCol->zName + strlen(pCol->zName) + 1;
+ if( pCol->colFlags & COLFLAG_HASTYPE ){
+ return pCol->zCnName + strlen(pCol->zCnName) + 1;
+ }else if( pCol->eCType ){
+ assert( pCol->eCType<=SQLITE_N_STDTYPE );
+ return (char*)sqlite3StdType[pCol->eCType-1];
+ }else{
+ return zDflt;
+ }
}
/*
@@ -31792,7 +33982,11 @@ static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3 *db, int err_code){
SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){
assert( db!=0 );
db->errCode = err_code;
- if( err_code || db->pErr ) sqlite3ErrorFinish(db, err_code);
+ if( err_code || db->pErr ){
+ sqlite3ErrorFinish(db, err_code);
+ }else{
+ db->errByteOffset = -1;
+ }
}
/*
@@ -31802,6 +33996,7 @@ SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){
SQLITE_PRIVATE void sqlite3ErrorClear(sqlite3 *db){
assert( db!=0 );
db->errCode = SQLITE_OK;
+ db->errByteOffset = -1;
if( db->pErr ) sqlite3ValueSetNull(db->pErr);
}
@@ -31822,17 +34017,8 @@ SQLITE_PRIVATE void sqlite3SystemError(sqlite3 *db, int rc){
** handle "db". The error code is set to "err_code".
**
** If it is not NULL, string zFormat specifies the format of the
-** error string in the style of the printf functions: The following
-** format characters are allowed:
-**
-** %s Insert a string
-** %z A string that should be freed after use
-** %d Insert an integer
-** %T Insert a token
-** %S Insert the first element of a SrcList
-**
-** zFormat and any string tokens that follow it are assumed to be
-** encoded in UTF-8.
+** error string. zFormat and any string tokens that follow it are
+** assumed to be encoded in UTF-8.
**
** To clear the most recent error for sqlite handle "db", sqlite3Error
** should be called with err_code set to SQLITE_OK and zFormat set
@@ -31855,14 +34041,27 @@ SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3 *db, int err_code, const char *z
}
/*
+** Check for interrupts and invoke progress callback.
+*/
+SQLITE_PRIVATE void sqlite3ProgressCheck(Parse *p){
+ sqlite3 *db = p->db;
+ if( AtomicLoad(&db->u1.isInterrupted) ){
+ p->nErr++;
+ p->rc = SQLITE_INTERRUPT;
+ }
+#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
+ if( db->xProgress && (++p->nProgressSteps)>=db->nProgressOps ){
+ if( db->xProgress(db->pProgressArg) ){
+ p->nErr++;
+ p->rc = SQLITE_INTERRUPT;
+ }
+ p->nProgressSteps = 0;
+ }
+#endif
+}
+
+/*
** Add an error message to pParse->zErrMsg and increment pParse->nErr.
-** The following formatting characters are allowed:
-**
-** %s Insert a string
-** %z A string that should be freed after use
-** %d Insert an integer
-** %T Insert a token
-** %S Insert the first element of a SrcList
**
** This function should be used to report any error that occurs while
** compiling an SQL statement (i.e. within sqlite3_prepare()). The
@@ -31875,11 +34074,19 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){
char *zMsg;
va_list ap;
sqlite3 *db = pParse->db;
+ assert( db!=0 );
+ assert( db->pParse==pParse || db->pParse->pToplevel==pParse );
+ db->errByteOffset = -2;
va_start(ap, zFormat);
zMsg = sqlite3VMPrintf(db, zFormat, ap);
va_end(ap);
+ if( db->errByteOffset<-1 ) db->errByteOffset = -1;
if( db->suppressErr ){
sqlite3DbFree(db, zMsg);
+ if( db->mallocFailed ){
+ pParse->nErr++;
+ pParse->rc = SQLITE_NOMEM;
+ }
}else{
pParse->nErr++;
sqlite3DbFree(db, pParse->zErrMsg);
@@ -31942,12 +34149,35 @@ SQLITE_PRIVATE void sqlite3Dequote(char *z){
z[j] = 0;
}
SQLITE_PRIVATE void sqlite3DequoteExpr(Expr *p){
+ assert( !ExprHasProperty(p, EP_IntValue) );
assert( sqlite3Isquote(p->u.zToken[0]) );
p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted;
sqlite3Dequote(p->u.zToken);
}
/*
+** If the input token p is quoted, try to adjust the token to remove
+** the quotes. This is not always possible:
+**
+** "abc" -> abc
+** "ab""cd" -> (not possible because of the interior "")
+**
+** Remove the quotes if possible. This is a optimization. The overall
+** system should still return the correct answer even if this routine
+** is always a no-op.
+*/
+SQLITE_PRIVATE void sqlite3DequoteToken(Token *p){
+ unsigned int i;
+ if( p->n<2 ) return;
+ if( !sqlite3Isquote(p->z[0]) ) return;
+ for(i=1; i<p->n-1; i++){
+ if( sqlite3Isquote(p->z[i]) ) return;
+ }
+ p->n -= 2;
+ p->z++;
+}
+
+/*
** Generate a Token object from a string
*/
SQLITE_PRIVATE void sqlite3TokenInit(Token *p, char *z){
@@ -32287,11 +34517,14 @@ do_atof_calc:
#endif
/*
-** Render an signed 64-bit integer as text. Store the result in zOut[].
+** Render an signed 64-bit integer as text. Store the result in zOut[] and
+** return the length of the string that was stored, in bytes. The value
+** returned does not include the zero terminator at the end of the output
+** string.
**
** The caller must ensure that zOut[] is at least 21 bytes in size.
*/
-SQLITE_PRIVATE void sqlite3Int64ToText(i64 v, char *zOut){
+SQLITE_PRIVATE int sqlite3Int64ToText(i64 v, char *zOut){
int i;
u64 x;
char zTemp[22];
@@ -32302,12 +34535,15 @@ SQLITE_PRIVATE void sqlite3Int64ToText(i64 v, char *zOut){
}
i = sizeof(zTemp)-2;
zTemp[sizeof(zTemp)-1] = 0;
- do{
- zTemp[i--] = (x%10) + '0';
+ while( 1 /*exit-by-break*/ ){
+ zTemp[i] = (x%10) + '0';
x = x/10;
- }while( x );
- if( v<0 ) zTemp[i--] = '-';
- memcpy(zOut, &zTemp[i+1], sizeof(zTemp)-1-i);
+ if( x==0 ) break;
+ i--;
+ };
+ if( v<0 ) zTemp[--i] = '-';
+ memcpy(zOut, &zTemp[i], sizeof(zTemp)-i);
+ return sizeof(zTemp)-1-i;
}
/*
@@ -32472,7 +34708,9 @@ SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char *z, i64 *pOut){
u = u*16 + sqlite3HexToInt(z[k]);
}
memcpy(pOut, &u, 8);
- return (z[k]==0 && k-i<=16) ? 0 : 2;
+ if( k-i>16 ) return 2;
+ if( z[k]!=0 ) return 1;
+ return 0;
}else
#endif /* SQLITE_OMIT_HEX_INTEGER */
{
@@ -32508,7 +34746,7 @@ SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){
u32 u = 0;
zNum += 2;
while( zNum[0]=='0' ) zNum++;
- for(i=0; sqlite3Isxdigit(zNum[i]) && i<8; i++){
+ for(i=0; i<8 && sqlite3Isxdigit(zNum[i]); i++){
u = u*16 + sqlite3HexToInt(zNum[i]);
}
if( (u&0x80000000)==0 && sqlite3Isxdigit(zNum[i])==0 ){
@@ -33052,13 +35290,13 @@ static void logBadConnection(const char *zType){
** used as an argument to sqlite3_errmsg() or sqlite3_close().
*/
SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3 *db){
- u32 magic;
+ u8 eOpenState;
if( db==0 ){
logBadConnection("NULL");
return 0;
}
- magic = db->magic;
- if( magic!=SQLITE_MAGIC_OPEN ){
+ eOpenState = db->eOpenState;
+ if( eOpenState!=SQLITE_STATE_OPEN ){
if( sqlite3SafetyCheckSickOrOk(db) ){
testcase( sqlite3GlobalConfig.xLog!=0 );
logBadConnection("unopened");
@@ -33069,11 +35307,11 @@ SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3 *db){
}
}
SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){
- u32 magic;
- magic = db->magic;
- if( magic!=SQLITE_MAGIC_SICK &&
- magic!=SQLITE_MAGIC_OPEN &&
- magic!=SQLITE_MAGIC_BUSY ){
+ u8 eOpenState;
+ eOpenState = db->eOpenState;
+ if( eOpenState!=SQLITE_STATE_SICK &&
+ eOpenState!=SQLITE_STATE_OPEN &&
+ eOpenState!=SQLITE_STATE_BUSY ){
testcase( sqlite3GlobalConfig.xLog!=0 );
logBadConnection("invalid");
return 0;
@@ -33238,7 +35476,6 @@ SQLITE_PRIVATE LogEst sqlite3LogEst(u64 x){
return a[x&7] + y - 10;
}
-#ifndef SQLITE_OMIT_VIRTUALTABLE
/*
** Convert a double into a LogEst
** In other words, compute an approximation for 10*log2(x).
@@ -33253,16 +35490,9 @@ SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double x){
e = (a>>52) - 1022;
return e*10;
}
-#endif /* SQLITE_OMIT_VIRTUALTABLE */
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \
- defined(SQLITE_ENABLE_STAT4) || \
- defined(SQLITE_EXPLAIN_ESTIMATED_ROWS)
/*
** Convert a LogEst into an integer.
-**
-** Note that this routine is only used when one or more of various
-** non-standard compile-time options is enabled.
*/
SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){
u64 n;
@@ -33270,17 +35500,9 @@ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){
x /= 10;
if( n>=5 ) n -= 2;
else if( n>=1 ) n -= 1;
-#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \
- defined(SQLITE_EXPLAIN_ESTIMATED_ROWS)
if( x>60 ) return (u64)LARGEST_INT64;
-#else
- /* If only SQLITE_ENABLE_STAT4 is on, then the largest input
- ** possible to this routine is 310, resulting in a maximum x of 31 */
- assert( x<=60 );
-#endif
return x>=3 ? (n+8)<<(x-3) : (n+8)>>(3-x);
}
-#endif /* defined SCANSTAT or STAT4 or ESTIMATED_ROWS */
/*
** Add a new name/number pair to a VList. This might require that the
@@ -33385,6 +35607,104 @@ SQLITE_PRIVATE int sqlite3VListNameToNum(VList *pIn, const char *zName, int nNam
return 0;
}
+/*
+** High-resolution hardware timer used for debugging and testing only.
+*/
+#if defined(VDBE_PROFILE) \
+ || defined(SQLITE_PERFORMANCE_TRACE) \
+ || defined(SQLITE_ENABLE_STMT_SCANSTATUS)
+/************** Include hwtime.h in the middle of util.c *********************/
+/************** Begin file hwtime.h ******************************************/
+/*
+** 2008 May 27
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file contains inline asm code for retrieving "high-performance"
+** counters for x86 and x86_64 class CPUs.
+*/
+#ifndef SQLITE_HWTIME_H
+#define SQLITE_HWTIME_H
+
+/*
+** The following routine only works on pentium-class (or newer) processors.
+** It uses the RDTSC opcode to read the cycle count value out of the
+** processor and returns that value. This can be used for high-res
+** profiling.
+*/
+#if !defined(__STRICT_ANSI__) && \
+ (defined(__GNUC__) || defined(_MSC_VER)) && \
+ (defined(i386) || defined(__i386__) || defined(_M_IX86))
+
+ #if defined(__GNUC__)
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned int lo, hi;
+ __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
+ return (sqlite_uint64)hi << 32 | lo;
+ }
+
+ #elif defined(_MSC_VER)
+
+ __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
+ __asm {
+ rdtsc
+ ret ; return value at EDX:EAX
+ }
+ }
+
+ #endif
+
+#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned int lo, hi;
+ __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
+ return (sqlite_uint64)hi << 32 | lo;
+ }
+
+#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long long retval;
+ unsigned long junk;
+ __asm__ __volatile__ ("\n\
+ 1: mftbu %1\n\
+ mftb %L0\n\
+ mftbu %0\n\
+ cmpw %0,%1\n\
+ bne 1b"
+ : "=r" (retval), "=r" (junk));
+ return retval;
+ }
+
+#else
+
+ /*
+ ** asm() is needed for hardware timing support. Without asm(),
+ ** disable the sqlite3Hwtime() routine.
+ **
+ ** sqlite3Hwtime() is only used for some obscure debugging
+ ** and analysis configurations, not in any deliverable, so this
+ ** should not be a great loss.
+ */
+SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
+
+#endif
+
+#endif /* !defined(SQLITE_HWTIME_H) */
+
+/************** End of hwtime.h **********************************************/
+/************** Continuing where we left off in util.c ***********************/
+#endif
+
/************** End of util.c ************************************************/
/************** Begin file hash.c ********************************************/
/*
@@ -33555,12 +35875,13 @@ static HashElem *findElementWithHash(
count = pH->count;
}
if( pHash ) *pHash = h;
- while( count-- ){
+ while( count ){
assert( elem!=0 );
if( sqlite3StrICmp(elem->pKey,pKey)==0 ){
return elem;
}
elem = elem->next;
+ count--;
}
return &nullElement;
}
@@ -33674,53 +35995,53 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
/* 0 */ "Savepoint" OpHelp(""),
/* 1 */ "AutoCommit" OpHelp(""),
/* 2 */ "Transaction" OpHelp(""),
- /* 3 */ "SorterNext" OpHelp(""),
- /* 4 */ "Prev" OpHelp(""),
- /* 5 */ "Next" OpHelp(""),
- /* 6 */ "Checkpoint" OpHelp(""),
- /* 7 */ "JournalMode" OpHelp(""),
- /* 8 */ "Vacuum" OpHelp(""),
- /* 9 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"),
- /* 10 */ "VUpdate" OpHelp("data=r[P3@P2]"),
- /* 11 */ "Goto" OpHelp(""),
- /* 12 */ "Gosub" OpHelp(""),
- /* 13 */ "InitCoroutine" OpHelp(""),
- /* 14 */ "Yield" OpHelp(""),
- /* 15 */ "MustBeInt" OpHelp(""),
- /* 16 */ "Jump" OpHelp(""),
- /* 17 */ "Once" OpHelp(""),
- /* 18 */ "If" OpHelp(""),
+ /* 3 */ "Checkpoint" OpHelp(""),
+ /* 4 */ "JournalMode" OpHelp(""),
+ /* 5 */ "Vacuum" OpHelp(""),
+ /* 6 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"),
+ /* 7 */ "VUpdate" OpHelp("data=r[P3@P2]"),
+ /* 8 */ "Init" OpHelp("Start at P2"),
+ /* 9 */ "Goto" OpHelp(""),
+ /* 10 */ "Gosub" OpHelp(""),
+ /* 11 */ "InitCoroutine" OpHelp(""),
+ /* 12 */ "Yield" OpHelp(""),
+ /* 13 */ "MustBeInt" OpHelp(""),
+ /* 14 */ "Jump" OpHelp(""),
+ /* 15 */ "Once" OpHelp(""),
+ /* 16 */ "If" OpHelp(""),
+ /* 17 */ "IfNot" OpHelp(""),
+ /* 18 */ "IsType" OpHelp("if typeof(P1.P3) in P5 goto P2"),
/* 19 */ "Not" OpHelp("r[P2]= !r[P1]"),
- /* 20 */ "IfNot" OpHelp(""),
- /* 21 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"),
- /* 22 */ "SeekLT" OpHelp("key=r[P3@P4]"),
- /* 23 */ "SeekLE" OpHelp("key=r[P3@P4]"),
- /* 24 */ "SeekGE" OpHelp("key=r[P3@P4]"),
- /* 25 */ "SeekGT" OpHelp("key=r[P3@P4]"),
- /* 26 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"),
- /* 27 */ "IfNoHope" OpHelp("key=r[P3@P4]"),
- /* 28 */ "NoConflict" OpHelp("key=r[P3@P4]"),
- /* 29 */ "NotFound" OpHelp("key=r[P3@P4]"),
- /* 30 */ "Found" OpHelp("key=r[P3@P4]"),
- /* 31 */ "SeekRowid" OpHelp("intkey=r[P3]"),
- /* 32 */ "NotExists" OpHelp("intkey=r[P3]"),
- /* 33 */ "Last" OpHelp(""),
- /* 34 */ "IfSmaller" OpHelp(""),
- /* 35 */ "SorterSort" OpHelp(""),
- /* 36 */ "Sort" OpHelp(""),
- /* 37 */ "Rewind" OpHelp(""),
- /* 38 */ "IdxLE" OpHelp("key=r[P3@P4]"),
- /* 39 */ "IdxGT" OpHelp("key=r[P3@P4]"),
- /* 40 */ "IdxLT" OpHelp("key=r[P3@P4]"),
- /* 41 */ "IdxGE" OpHelp("key=r[P3@P4]"),
- /* 42 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"),
+ /* 20 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"),
+ /* 21 */ "SeekLT" OpHelp("key=r[P3@P4]"),
+ /* 22 */ "SeekLE" OpHelp("key=r[P3@P4]"),
+ /* 23 */ "SeekGE" OpHelp("key=r[P3@P4]"),
+ /* 24 */ "SeekGT" OpHelp("key=r[P3@P4]"),
+ /* 25 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"),
+ /* 26 */ "IfNoHope" OpHelp("key=r[P3@P4]"),
+ /* 27 */ "NoConflict" OpHelp("key=r[P3@P4]"),
+ /* 28 */ "NotFound" OpHelp("key=r[P3@P4]"),
+ /* 29 */ "Found" OpHelp("key=r[P3@P4]"),
+ /* 30 */ "SeekRowid" OpHelp("intkey=r[P3]"),
+ /* 31 */ "NotExists" OpHelp("intkey=r[P3]"),
+ /* 32 */ "Last" OpHelp(""),
+ /* 33 */ "IfSmaller" OpHelp(""),
+ /* 34 */ "SorterSort" OpHelp(""),
+ /* 35 */ "Sort" OpHelp(""),
+ /* 36 */ "Rewind" OpHelp(""),
+ /* 37 */ "SorterNext" OpHelp(""),
+ /* 38 */ "Prev" OpHelp(""),
+ /* 39 */ "Next" OpHelp(""),
+ /* 40 */ "IdxLE" OpHelp("key=r[P3@P4]"),
+ /* 41 */ "IdxGT" OpHelp("key=r[P3@P4]"),
+ /* 42 */ "IdxLT" OpHelp("key=r[P3@P4]"),
/* 43 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"),
/* 44 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"),
- /* 45 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"),
- /* 46 */ "Program" OpHelp(""),
- /* 47 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"),
- /* 48 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"),
- /* 49 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"),
+ /* 45 */ "IdxGE" OpHelp("key=r[P3@P4]"),
+ /* 46 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"),
+ /* 47 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"),
+ /* 48 */ "Program" OpHelp(""),
+ /* 49 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"),
/* 50 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"),
/* 51 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"),
/* 52 */ "Ne" OpHelp("IF r[P3]!=r[P1]"),
@@ -33730,49 +36051,49 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
/* 56 */ "Lt" OpHelp("IF r[P3]<r[P1]"),
/* 57 */ "Ge" OpHelp("IF r[P3]>=r[P1]"),
/* 58 */ "ElseEq" OpHelp(""),
- /* 59 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"),
- /* 60 */ "IncrVacuum" OpHelp(""),
- /* 61 */ "VNext" OpHelp(""),
- /* 62 */ "Init" OpHelp("Start at P2"),
- /* 63 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"),
- /* 64 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"),
- /* 65 */ "Return" OpHelp(""),
- /* 66 */ "EndCoroutine" OpHelp(""),
- /* 67 */ "HaltIfNull" OpHelp("if r[P3]=null halt"),
- /* 68 */ "Halt" OpHelp(""),
- /* 69 */ "Integer" OpHelp("r[P2]=P1"),
- /* 70 */ "Int64" OpHelp("r[P2]=P4"),
- /* 71 */ "String" OpHelp("r[P2]='P4' (len=P1)"),
- /* 72 */ "Null" OpHelp("r[P2..P3]=NULL"),
- /* 73 */ "SoftNull" OpHelp("r[P1]=NULL"),
- /* 74 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"),
- /* 75 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"),
- /* 76 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"),
- /* 77 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"),
- /* 78 */ "SCopy" OpHelp("r[P2]=r[P1]"),
- /* 79 */ "IntCopy" OpHelp("r[P2]=r[P1]"),
- /* 80 */ "ChngCntRow" OpHelp("output=r[P1]"),
- /* 81 */ "ResultRow" OpHelp("output=r[P1@P2]"),
- /* 82 */ "CollSeq" OpHelp(""),
- /* 83 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"),
- /* 84 */ "RealAffinity" OpHelp(""),
- /* 85 */ "Cast" OpHelp("affinity(r[P1])"),
- /* 86 */ "Permutation" OpHelp(""),
- /* 87 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"),
- /* 88 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"),
- /* 89 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"),
- /* 90 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"),
- /* 91 */ "Column" OpHelp("r[P3]=PX"),
- /* 92 */ "Affinity" OpHelp("affinity(r[P1@P2])"),
- /* 93 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"),
- /* 94 */ "Count" OpHelp("r[P2]=count()"),
- /* 95 */ "ReadCookie" OpHelp(""),
- /* 96 */ "SetCookie" OpHelp(""),
- /* 97 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"),
- /* 98 */ "OpenRead" OpHelp("root=P2 iDb=P3"),
- /* 99 */ "OpenWrite" OpHelp("root=P2 iDb=P3"),
- /* 100 */ "OpenDup" OpHelp(""),
- /* 101 */ "OpenAutoindex" OpHelp("nColumn=P2"),
+ /* 59 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"),
+ /* 60 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"),
+ /* 61 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"),
+ /* 62 */ "IncrVacuum" OpHelp(""),
+ /* 63 */ "VNext" OpHelp(""),
+ /* 64 */ "Filter" OpHelp("if key(P3@P4) not in filter(P1) goto P2"),
+ /* 65 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"),
+ /* 66 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"),
+ /* 67 */ "Return" OpHelp(""),
+ /* 68 */ "EndCoroutine" OpHelp(""),
+ /* 69 */ "HaltIfNull" OpHelp("if r[P3]=null halt"),
+ /* 70 */ "Halt" OpHelp(""),
+ /* 71 */ "Integer" OpHelp("r[P2]=P1"),
+ /* 72 */ "Int64" OpHelp("r[P2]=P4"),
+ /* 73 */ "String" OpHelp("r[P2]='P4' (len=P1)"),
+ /* 74 */ "BeginSubrtn" OpHelp("r[P2]=NULL"),
+ /* 75 */ "Null" OpHelp("r[P2..P3]=NULL"),
+ /* 76 */ "SoftNull" OpHelp("r[P1]=NULL"),
+ /* 77 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"),
+ /* 78 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"),
+ /* 79 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"),
+ /* 80 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"),
+ /* 81 */ "SCopy" OpHelp("r[P2]=r[P1]"),
+ /* 82 */ "IntCopy" OpHelp("r[P2]=r[P1]"),
+ /* 83 */ "FkCheck" OpHelp(""),
+ /* 84 */ "ResultRow" OpHelp("output=r[P1@P2]"),
+ /* 85 */ "CollSeq" OpHelp(""),
+ /* 86 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"),
+ /* 87 */ "RealAffinity" OpHelp(""),
+ /* 88 */ "Cast" OpHelp("affinity(r[P1])"),
+ /* 89 */ "Permutation" OpHelp(""),
+ /* 90 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"),
+ /* 91 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"),
+ /* 92 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"),
+ /* 93 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"),
+ /* 94 */ "Column" OpHelp("r[P3]=PX cursor P1 column P2"),
+ /* 95 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"),
+ /* 96 */ "Affinity" OpHelp("affinity(r[P1@P2])"),
+ /* 97 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"),
+ /* 98 */ "Count" OpHelp("r[P2]=count()"),
+ /* 99 */ "ReadCookie" OpHelp(""),
+ /* 100 */ "SetCookie" OpHelp(""),
+ /* 101 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"),
/* 102 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"),
/* 103 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"),
/* 104 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<<r[P1]"),
@@ -33783,80 +36104,1069 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
/* 109 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"),
/* 110 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"),
/* 111 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"),
- /* 112 */ "OpenEphemeral" OpHelp("nColumn=P2"),
- /* 113 */ "BitNot" OpHelp("r[P2]= ~r[P1]"),
- /* 114 */ "SorterOpen" OpHelp(""),
- /* 115 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"),
- /* 116 */ "String8" OpHelp("r[P2]='P4'"),
- /* 117 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"),
- /* 118 */ "Close" OpHelp(""),
- /* 119 */ "ColumnsUsed" OpHelp(""),
- /* 120 */ "SeekScan" OpHelp("Scan-ahead up to P1 rows"),
- /* 121 */ "SeekHit" OpHelp("set P2<=seekHit<=P3"),
- /* 122 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"),
- /* 123 */ "NewRowid" OpHelp("r[P2]=rowid"),
- /* 124 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"),
- /* 125 */ "RowCell" OpHelp(""),
- /* 126 */ "Delete" OpHelp(""),
- /* 127 */ "ResetCount" OpHelp(""),
- /* 128 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"),
- /* 129 */ "SorterData" OpHelp("r[P2]=data"),
- /* 130 */ "RowData" OpHelp("r[P2]=data"),
- /* 131 */ "Rowid" OpHelp("r[P2]=rowid"),
- /* 132 */ "NullRow" OpHelp(""),
- /* 133 */ "SeekEnd" OpHelp(""),
- /* 134 */ "IdxInsert" OpHelp("key=r[P2]"),
- /* 135 */ "SorterInsert" OpHelp("key=r[P2]"),
- /* 136 */ "IdxDelete" OpHelp("key=r[P2@P3]"),
- /* 137 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"),
- /* 138 */ "IdxRowid" OpHelp("r[P2]=rowid"),
- /* 139 */ "FinishSeek" OpHelp(""),
- /* 140 */ "Destroy" OpHelp(""),
- /* 141 */ "Clear" OpHelp(""),
- /* 142 */ "ResetSorter" OpHelp(""),
- /* 143 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"),
- /* 144 */ "SqlExec" OpHelp(""),
- /* 145 */ "ParseSchema" OpHelp(""),
- /* 146 */ "LoadAnalysis" OpHelp(""),
- /* 147 */ "DropTable" OpHelp(""),
- /* 148 */ "DropIndex" OpHelp(""),
- /* 149 */ "DropTrigger" OpHelp(""),
- /* 150 */ "IntegrityCk" OpHelp(""),
- /* 151 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"),
- /* 152 */ "Real" OpHelp("r[P2]=P4"),
- /* 153 */ "Param" OpHelp(""),
- /* 154 */ "FkCounter" OpHelp("fkctr[P1]+=P2"),
- /* 155 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"),
- /* 156 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"),
- /* 157 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"),
- /* 158 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"),
- /* 159 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"),
- /* 160 */ "AggValue" OpHelp("r[P3]=value N=P2"),
- /* 161 */ "AggFinal" OpHelp("accum=r[P1] N=P2"),
- /* 162 */ "Expire" OpHelp(""),
- /* 163 */ "CursorLock" OpHelp(""),
- /* 164 */ "CursorUnlock" OpHelp(""),
- /* 165 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"),
- /* 166 */ "VBegin" OpHelp(""),
- /* 167 */ "VCreate" OpHelp(""),
- /* 168 */ "VDestroy" OpHelp(""),
- /* 169 */ "VOpen" OpHelp(""),
- /* 170 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"),
- /* 171 */ "VRename" OpHelp(""),
- /* 172 */ "Pagecount" OpHelp(""),
- /* 173 */ "MaxPgcnt" OpHelp(""),
- /* 174 */ "Trace" OpHelp(""),
- /* 175 */ "CursorHint" OpHelp(""),
- /* 176 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"),
- /* 177 */ "Noop" OpHelp(""),
- /* 178 */ "Explain" OpHelp(""),
- /* 179 */ "Abortable" OpHelp(""),
+ /* 112 */ "OpenRead" OpHelp("root=P2 iDb=P3"),
+ /* 113 */ "OpenWrite" OpHelp("root=P2 iDb=P3"),
+ /* 114 */ "BitNot" OpHelp("r[P2]= ~r[P1]"),
+ /* 115 */ "OpenDup" OpHelp(""),
+ /* 116 */ "OpenAutoindex" OpHelp("nColumn=P2"),
+ /* 117 */ "String8" OpHelp("r[P2]='P4'"),
+ /* 118 */ "OpenEphemeral" OpHelp("nColumn=P2"),
+ /* 119 */ "SorterOpen" OpHelp(""),
+ /* 120 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"),
+ /* 121 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"),
+ /* 122 */ "Close" OpHelp(""),
+ /* 123 */ "ColumnsUsed" OpHelp(""),
+ /* 124 */ "SeekScan" OpHelp("Scan-ahead up to P1 rows"),
+ /* 125 */ "SeekHit" OpHelp("set P2<=seekHit<=P3"),
+ /* 126 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"),
+ /* 127 */ "NewRowid" OpHelp("r[P2]=rowid"),
+ /* 128 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"),
+ /* 129 */ "RowCell" OpHelp(""),
+ /* 130 */ "Delete" OpHelp(""),
+ /* 131 */ "ResetCount" OpHelp(""),
+ /* 132 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"),
+ /* 133 */ "SorterData" OpHelp("r[P2]=data"),
+ /* 134 */ "RowData" OpHelp("r[P2]=data"),
+ /* 135 */ "Rowid" OpHelp("r[P2]=PX rowid of P1"),
+ /* 136 */ "NullRow" OpHelp(""),
+ /* 137 */ "SeekEnd" OpHelp(""),
+ /* 138 */ "IdxInsert" OpHelp("key=r[P2]"),
+ /* 139 */ "SorterInsert" OpHelp("key=r[P2]"),
+ /* 140 */ "IdxDelete" OpHelp("key=r[P2@P3]"),
+ /* 141 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"),
+ /* 142 */ "IdxRowid" OpHelp("r[P2]=rowid"),
+ /* 143 */ "FinishSeek" OpHelp(""),
+ /* 144 */ "Destroy" OpHelp(""),
+ /* 145 */ "Clear" OpHelp(""),
+ /* 146 */ "ResetSorter" OpHelp(""),
+ /* 147 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"),
+ /* 148 */ "SqlExec" OpHelp(""),
+ /* 149 */ "ParseSchema" OpHelp(""),
+ /* 150 */ "LoadAnalysis" OpHelp(""),
+ /* 151 */ "DropTable" OpHelp(""),
+ /* 152 */ "DropIndex" OpHelp(""),
+ /* 153 */ "Real" OpHelp("r[P2]=P4"),
+ /* 154 */ "DropTrigger" OpHelp(""),
+ /* 155 */ "IntegrityCk" OpHelp(""),
+ /* 156 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"),
+ /* 157 */ "Param" OpHelp(""),
+ /* 158 */ "FkCounter" OpHelp("fkctr[P1]+=P2"),
+ /* 159 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"),
+ /* 160 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"),
+ /* 161 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"),
+ /* 162 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"),
+ /* 163 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"),
+ /* 164 */ "AggValue" OpHelp("r[P3]=value N=P2"),
+ /* 165 */ "AggFinal" OpHelp("accum=r[P1] N=P2"),
+ /* 166 */ "Expire" OpHelp(""),
+ /* 167 */ "CursorLock" OpHelp(""),
+ /* 168 */ "CursorUnlock" OpHelp(""),
+ /* 169 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"),
+ /* 170 */ "VBegin" OpHelp(""),
+ /* 171 */ "VCreate" OpHelp(""),
+ /* 172 */ "VDestroy" OpHelp(""),
+ /* 173 */ "VOpen" OpHelp(""),
+ /* 174 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"),
+ /* 175 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"),
+ /* 176 */ "VRename" OpHelp(""),
+ /* 177 */ "Pagecount" OpHelp(""),
+ /* 178 */ "MaxPgcnt" OpHelp(""),
+ /* 179 */ "ClrSubtype" OpHelp("r[P1].subtype = 0"),
+ /* 180 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"),
+ /* 181 */ "Trace" OpHelp(""),
+ /* 182 */ "CursorHint" OpHelp(""),
+ /* 183 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"),
+ /* 184 */ "Noop" OpHelp(""),
+ /* 185 */ "Explain" OpHelp(""),
+ /* 186 */ "Abortable" OpHelp(""),
};
return azName[i];
}
#endif
/************** End of opcodes.c *********************************************/
+/************** Begin file os_kv.c *******************************************/
+/*
+** 2022-09-06
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file contains an experimental VFS layer that operates on a
+** Key/Value storage engine where both keys and values must be pure
+** text.
+*/
+/* #include <sqliteInt.h> */
+#if SQLITE_OS_KV || (SQLITE_OS_UNIX && defined(SQLITE_OS_KV_OPTIONAL))
+
+/*****************************************************************************
+** Debugging logic
+*/
+
+/* SQLITE_KV_TRACE() is used for tracing calls to kvstorage routines. */
+#if 0
+#define SQLITE_KV_TRACE(X) printf X
+#else
+#define SQLITE_KV_TRACE(X)
+#endif
+
+/* SQLITE_KV_LOG() is used for tracing calls to the VFS interface */
+#if 0
+#define SQLITE_KV_LOG(X) printf X
+#else
+#define SQLITE_KV_LOG(X)
+#endif
+
+
+/*
+** Forward declaration of objects used by this VFS implementation
+*/
+typedef struct KVVfsFile KVVfsFile;
+
+/* A single open file. There are only two files represented by this
+** VFS - the database and the rollback journal.
+*/
+struct KVVfsFile {
+ sqlite3_file base; /* IO methods */
+ const char *zClass; /* Storage class */
+ int isJournal; /* True if this is a journal file */
+ unsigned int nJrnl; /* Space allocated for aJrnl[] */
+ char *aJrnl; /* Journal content */
+ int szPage; /* Last known page size */
+ sqlite3_int64 szDb; /* Database file size. -1 means unknown */
+ char *aData; /* Buffer to hold page data */
+};
+#define SQLITE_KVOS_SZ 133073
+
+/*
+** Methods for KVVfsFile
+*/
+static int kvvfsClose(sqlite3_file*);
+static int kvvfsReadDb(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
+static int kvvfsReadJrnl(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
+static int kvvfsWriteDb(sqlite3_file*,const void*,int iAmt, sqlite3_int64);
+static int kvvfsWriteJrnl(sqlite3_file*,const void*,int iAmt, sqlite3_int64);
+static int kvvfsTruncateDb(sqlite3_file*, sqlite3_int64 size);
+static int kvvfsTruncateJrnl(sqlite3_file*, sqlite3_int64 size);
+static int kvvfsSyncDb(sqlite3_file*, int flags);
+static int kvvfsSyncJrnl(sqlite3_file*, int flags);
+static int kvvfsFileSizeDb(sqlite3_file*, sqlite3_int64 *pSize);
+static int kvvfsFileSizeJrnl(sqlite3_file*, sqlite3_int64 *pSize);
+static int kvvfsLock(sqlite3_file*, int);
+static int kvvfsUnlock(sqlite3_file*, int);
+static int kvvfsCheckReservedLock(sqlite3_file*, int *pResOut);
+static int kvvfsFileControlDb(sqlite3_file*, int op, void *pArg);
+static int kvvfsFileControlJrnl(sqlite3_file*, int op, void *pArg);
+static int kvvfsSectorSize(sqlite3_file*);
+static int kvvfsDeviceCharacteristics(sqlite3_file*);
+
+/*
+** Methods for sqlite3_vfs
+*/
+static int kvvfsOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
+static int kvvfsDelete(sqlite3_vfs*, const char *zName, int syncDir);
+static int kvvfsAccess(sqlite3_vfs*, const char *zName, int flags, int *);
+static int kvvfsFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
+static void *kvvfsDlOpen(sqlite3_vfs*, const char *zFilename);
+static int kvvfsRandomness(sqlite3_vfs*, int nByte, char *zOut);
+static int kvvfsSleep(sqlite3_vfs*, int microseconds);
+static int kvvfsCurrentTime(sqlite3_vfs*, double*);
+static int kvvfsCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
+
+static sqlite3_vfs sqlite3OsKvvfsObject = {
+ 1, /* iVersion */
+ sizeof(KVVfsFile), /* szOsFile */
+ 1024, /* mxPathname */
+ 0, /* pNext */
+ "kvvfs", /* zName */
+ 0, /* pAppData */
+ kvvfsOpen, /* xOpen */
+ kvvfsDelete, /* xDelete */
+ kvvfsAccess, /* xAccess */
+ kvvfsFullPathname, /* xFullPathname */
+ kvvfsDlOpen, /* xDlOpen */
+ 0, /* xDlError */
+ 0, /* xDlSym */
+ 0, /* xDlClose */
+ kvvfsRandomness, /* xRandomness */
+ kvvfsSleep, /* xSleep */
+ kvvfsCurrentTime, /* xCurrentTime */
+ 0, /* xGetLastError */
+ kvvfsCurrentTimeInt64 /* xCurrentTimeInt64 */
+};
+
+/* Methods for sqlite3_file objects referencing a database file
+*/
+static sqlite3_io_methods kvvfs_db_io_methods = {
+ 1, /* iVersion */
+ kvvfsClose, /* xClose */
+ kvvfsReadDb, /* xRead */
+ kvvfsWriteDb, /* xWrite */
+ kvvfsTruncateDb, /* xTruncate */
+ kvvfsSyncDb, /* xSync */
+ kvvfsFileSizeDb, /* xFileSize */
+ kvvfsLock, /* xLock */
+ kvvfsUnlock, /* xUnlock */
+ kvvfsCheckReservedLock, /* xCheckReservedLock */
+ kvvfsFileControlDb, /* xFileControl */
+ kvvfsSectorSize, /* xSectorSize */
+ kvvfsDeviceCharacteristics, /* xDeviceCharacteristics */
+ 0, /* xShmMap */
+ 0, /* xShmLock */
+ 0, /* xShmBarrier */
+ 0, /* xShmUnmap */
+ 0, /* xFetch */
+ 0 /* xUnfetch */
+};
+
+/* Methods for sqlite3_file objects referencing a rollback journal
+*/
+static sqlite3_io_methods kvvfs_jrnl_io_methods = {
+ 1, /* iVersion */
+ kvvfsClose, /* xClose */
+ kvvfsReadJrnl, /* xRead */
+ kvvfsWriteJrnl, /* xWrite */
+ kvvfsTruncateJrnl, /* xTruncate */
+ kvvfsSyncJrnl, /* xSync */
+ kvvfsFileSizeJrnl, /* xFileSize */
+ kvvfsLock, /* xLock */
+ kvvfsUnlock, /* xUnlock */
+ kvvfsCheckReservedLock, /* xCheckReservedLock */
+ kvvfsFileControlJrnl, /* xFileControl */
+ kvvfsSectorSize, /* xSectorSize */
+ kvvfsDeviceCharacteristics, /* xDeviceCharacteristics */
+ 0, /* xShmMap */
+ 0, /* xShmLock */
+ 0, /* xShmBarrier */
+ 0, /* xShmUnmap */
+ 0, /* xFetch */
+ 0 /* xUnfetch */
+};
+
+/****** Storage subsystem **************************************************/
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+/* Forward declarations for the low-level storage engine
+*/
+static int kvstorageWrite(const char*, const char *zKey, const char *zData);
+static int kvstorageDelete(const char*, const char *zKey);
+static int kvstorageRead(const char*, const char *zKey, char *zBuf, int nBuf);
+#define KVSTORAGE_KEY_SZ 32
+
+/* Expand the key name with an appropriate prefix and put the result
+** zKeyOut[]. The zKeyOut[] buffer is assumed to hold at least
+** KVSTORAGE_KEY_SZ bytes.
+*/
+static void kvstorageMakeKey(
+ const char *zClass,
+ const char *zKeyIn,
+ char *zKeyOut
+){
+ sqlite3_snprintf(KVSTORAGE_KEY_SZ, zKeyOut, "kvvfs-%s-%s", zClass, zKeyIn);
+}
+
+/* Write content into a key. zClass is the particular namespace of the
+** underlying key/value store to use - either "local" or "session".
+**
+** Both zKey and zData are zero-terminated pure text strings.
+**
+** Return the number of errors.
+*/
+static int kvstorageWrite(
+ const char *zClass,
+ const char *zKey,
+ const char *zData
+){
+ FILE *fd;
+ char zXKey[KVSTORAGE_KEY_SZ];
+ kvstorageMakeKey(zClass, zKey, zXKey);
+ fd = fopen(zXKey, "wb");
+ if( fd ){
+ SQLITE_KV_TRACE(("KVVFS-WRITE %-15s (%d) %.50s%s\n", zXKey,
+ (int)strlen(zData), zData,
+ strlen(zData)>50 ? "..." : ""));
+ fputs(zData, fd);
+ fclose(fd);
+ return 0;
+ }else{
+ return 1;
+ }
+}
+
+/* Delete a key (with its corresponding data) from the key/value
+** namespace given by zClass. If the key does not previously exist,
+** this routine is a no-op.
+*/
+static int kvstorageDelete(const char *zClass, const char *zKey){
+ char zXKey[KVSTORAGE_KEY_SZ];
+ kvstorageMakeKey(zClass, zKey, zXKey);
+ unlink(zXKey);
+ SQLITE_KV_TRACE(("KVVFS-DELETE %-15s\n", zXKey));
+ return 0;
+}
+
+/* Read the value associated with a zKey from the key/value namespace given
+** by zClass and put the text data associated with that key in the first
+** nBuf bytes of zBuf[]. The value might be truncated if zBuf is not large
+** enough to hold it all. The value put into zBuf must always be zero
+** terminated, even if it gets truncated because nBuf is not large enough.
+**
+** Return the total number of bytes in the data, without truncation, and
+** not counting the final zero terminator. Return -1 if the key does
+** not exist.
+**
+** If nBuf<=0 then this routine simply returns the size of the data without
+** actually reading it.
+*/
+static int kvstorageRead(
+ const char *zClass,
+ const char *zKey,
+ char *zBuf,
+ int nBuf
+){
+ FILE *fd;
+ struct stat buf;
+ char zXKey[KVSTORAGE_KEY_SZ];
+ kvstorageMakeKey(zClass, zKey, zXKey);
+ if( access(zXKey, R_OK)!=0
+ || stat(zXKey, &buf)!=0
+ || !S_ISREG(buf.st_mode)
+ ){
+ SQLITE_KV_TRACE(("KVVFS-READ %-15s (-1)\n", zXKey));
+ return -1;
+ }
+ if( nBuf<=0 ){
+ return (int)buf.st_size;
+ }else if( nBuf==1 ){
+ zBuf[0] = 0;
+ SQLITE_KV_TRACE(("KVVFS-READ %-15s (%d)\n", zXKey,
+ (int)buf.st_size));
+ return (int)buf.st_size;
+ }
+ if( nBuf > buf.st_size + 1 ){
+ nBuf = buf.st_size + 1;
+ }
+ fd = fopen(zXKey, "rb");
+ if( fd==0 ){
+ SQLITE_KV_TRACE(("KVVFS-READ %-15s (-1)\n", zXKey));
+ return -1;
+ }else{
+ sqlite3_int64 n = fread(zBuf, 1, nBuf-1, fd);
+ fclose(fd);
+ zBuf[n] = 0;
+ SQLITE_KV_TRACE(("KVVFS-READ %-15s (%lld) %.50s%s\n", zXKey,
+ n, zBuf, n>50 ? "..." : ""));
+ return (int)n;
+ }
+}
+
+/*
+** An internal level of indirection which enables us to replace the
+** kvvfs i/o methods with JavaScript implementations in WASM builds.
+** Maintenance reminder: if this struct changes in any way, the JSON
+** rendering of its structure must be updated in
+** sqlite3_wasm_enum_json(). There are no binary compatibility
+** concerns, so it does not need an iVersion member. This file is
+** necessarily always compiled together with sqlite3_wasm_enum_json(),
+** and JS code dynamically creates the mapping of members based on
+** that JSON description.
+*/
+typedef struct sqlite3_kvvfs_methods sqlite3_kvvfs_methods;
+struct sqlite3_kvvfs_methods {
+ int (*xRead)(const char *zClass, const char *zKey, char *zBuf, int nBuf);
+ int (*xWrite)(const char *zClass, const char *zKey, const char *zData);
+ int (*xDelete)(const char *zClass, const char *zKey);
+ const int nKeySize;
+};
+
+/*
+** This object holds the kvvfs I/O methods which may be swapped out
+** for JavaScript-side implementations in WASM builds. In such builds
+** it cannot be const, but in native builds it should be so that
+** the compiler can hopefully optimize this level of indirection out.
+** That said, kvvfs is intended primarily for use in WASM builds.
+**
+** Note that this is not explicitly flagged as static because the
+** amalgamation build will tag it with SQLITE_PRIVATE.
+*/
+#ifndef SQLITE_WASM
+const
+#endif
+SQLITE_PRIVATE sqlite3_kvvfs_methods sqlite3KvvfsMethods = {
+kvstorageRead,
+kvstorageWrite,
+kvstorageDelete,
+KVSTORAGE_KEY_SZ
+};
+
+/****** Utility subroutines ************************************************/
+
+/*
+** Encode binary into the text encoded used to persist on disk.
+** The output text is stored in aOut[], which must be at least
+** nData+1 bytes in length.
+**
+** Return the actual length of the encoded text, not counting the
+** zero terminator at the end.
+**
+** Encoding format
+** ---------------
+**
+** * Non-zero bytes are encoded as upper-case hexadecimal
+**
+** * A sequence of one or more zero-bytes that are not at the
+** beginning of the buffer are encoded as a little-endian
+** base-26 number using a..z. "a" means 0. "b" means 1,
+** "z" means 25. "ab" means 26. "ac" means 52. And so forth.
+**
+** * Because there is no overlap between the encoding characters
+** of hexadecimal and base-26 numbers, it is always clear where
+** one stops and the next begins.
+*/
+static int kvvfsEncode(const char *aData, int nData, char *aOut){
+ int i, j;
+ const unsigned char *a = (const unsigned char*)aData;
+ for(i=j=0; i<nData; i++){
+ unsigned char c = a[i];
+ if( c!=0 ){
+ aOut[j++] = "0123456789ABCDEF"[c>>4];
+ aOut[j++] = "0123456789ABCDEF"[c&0xf];
+ }else{
+ /* A sequence of 1 or more zeros is stored as a little-endian
+ ** base-26 number using a..z as the digits. So one zero is "b".
+ ** Two zeros is "c". 25 zeros is "z", 26 zeros is "ab", 27 is "bb",
+ ** and so forth.
+ */
+ int k;
+ for(k=1; i+k<nData && a[i+k]==0; k++){}
+ i += k-1;
+ while( k>0 ){
+ aOut[j++] = 'a'+(k%26);
+ k /= 26;
+ }
+ }
+ }
+ aOut[j] = 0;
+ return j;
+}
+
+static const signed char kvvfsHexValue[256] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+};
+
+/*
+** Decode the text encoding back to binary. The binary content is
+** written into pOut, which must be at least nOut bytes in length.
+**
+** The return value is the number of bytes actually written into aOut[].
+*/
+static int kvvfsDecode(const char *a, char *aOut, int nOut){
+ int i, j;
+ int c;
+ const unsigned char *aIn = (const unsigned char*)a;
+ i = 0;
+ j = 0;
+ while( 1 ){
+ c = kvvfsHexValue[aIn[i]];
+ if( c<0 ){
+ int n = 0;
+ int mult = 1;
+ c = aIn[i];
+ if( c==0 ) break;
+ while( c>='a' && c<='z' ){
+ n += (c - 'a')*mult;
+ mult *= 26;
+ c = aIn[++i];
+ }
+ if( j+n>nOut ) return -1;
+ memset(&aOut[j], 0, n);
+ j += n;
+ if( c==0 || mult==1 ) break; /* progress stalled if mult==1 */
+ }else{
+ aOut[j] = c<<4;
+ c = kvvfsHexValue[aIn[++i]];
+ if( c<0 ) break;
+ aOut[j++] += c;
+ i++;
+ }
+ }
+ return j;
+}
+
+/*
+** Decode a complete journal file. Allocate space in pFile->aJrnl
+** and store the decoding there. Or leave pFile->aJrnl set to NULL
+** if an error is encountered.
+**
+** The first few characters of the text encoding will be a little-endian
+** base-26 number (digits a..z) that is the total number of bytes
+** in the decoded journal file image. This base-26 number is followed
+** by a single space, then the encoding of the journal. The space
+** separator is required to act as a terminator for the base-26 number.
+*/
+static void kvvfsDecodeJournal(
+ KVVfsFile *pFile, /* Store decoding in pFile->aJrnl */
+ const char *zTxt, /* Text encoding. Zero-terminated */
+ int nTxt /* Bytes in zTxt, excluding zero terminator */
+){
+ unsigned int n = 0;
+ int c, i, mult;
+ i = 0;
+ mult = 1;
+ while( (c = zTxt[i++])>='a' && c<='z' ){
+ n += (zTxt[i] - 'a')*mult;
+ mult *= 26;
+ }
+ sqlite3_free(pFile->aJrnl);
+ pFile->aJrnl = sqlite3_malloc64( n );
+ if( pFile->aJrnl==0 ){
+ pFile->nJrnl = 0;
+ return;
+ }
+ pFile->nJrnl = n;
+ n = kvvfsDecode(zTxt+i, pFile->aJrnl, pFile->nJrnl);
+ if( n<pFile->nJrnl ){
+ sqlite3_free(pFile->aJrnl);
+ pFile->aJrnl = 0;
+ pFile->nJrnl = 0;
+ }
+}
+
+/*
+** Read or write the "sz" element, containing the database file size.
+*/
+static sqlite3_int64 kvvfsReadFileSize(KVVfsFile *pFile){
+ char zData[50];
+ zData[0] = 0;
+ sqlite3KvvfsMethods.xRead(pFile->zClass, "sz", zData, sizeof(zData)-1);
+ return strtoll(zData, 0, 0);
+}
+static int kvvfsWriteFileSize(KVVfsFile *pFile, sqlite3_int64 sz){
+ char zData[50];
+ sqlite3_snprintf(sizeof(zData), zData, "%lld", sz);
+ return sqlite3KvvfsMethods.xWrite(pFile->zClass, "sz", zData);
+}
+
+/****** sqlite3_io_methods methods ******************************************/
+
+/*
+** Close an kvvfs-file.
+*/
+static int kvvfsClose(sqlite3_file *pProtoFile){
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+
+ SQLITE_KV_LOG(("xClose %s %s\n", pFile->zClass,
+ pFile->isJournal ? "journal" : "db"));
+ sqlite3_free(pFile->aJrnl);
+ sqlite3_free(pFile->aData);
+ return SQLITE_OK;
+}
+
+/*
+** Read from the -journal file.
+*/
+static int kvvfsReadJrnl(
+ sqlite3_file *pProtoFile,
+ void *zBuf,
+ int iAmt,
+ sqlite_int64 iOfst
+){
+ KVVfsFile *pFile = (KVVfsFile*)pProtoFile;
+ assert( pFile->isJournal );
+ SQLITE_KV_LOG(("xRead('%s-journal',%d,%lld)\n", pFile->zClass, iAmt, iOfst));
+ if( pFile->aJrnl==0 ){
+ int szTxt = kvstorageRead(pFile->zClass, "jrnl", 0, 0);
+ char *aTxt;
+ if( szTxt<=4 ){
+ return SQLITE_IOERR;
+ }
+ aTxt = sqlite3_malloc64( szTxt+1 );
+ if( aTxt==0 ) return SQLITE_NOMEM;
+ kvstorageRead(pFile->zClass, "jrnl", aTxt, szTxt+1);
+ kvvfsDecodeJournal(pFile, aTxt, szTxt);
+ sqlite3_free(aTxt);
+ if( pFile->aJrnl==0 ) return SQLITE_IOERR;
+ }
+ if( iOfst+iAmt>pFile->nJrnl ){
+ return SQLITE_IOERR_SHORT_READ;
+ }
+ memcpy(zBuf, pFile->aJrnl+iOfst, iAmt);
+ return SQLITE_OK;
+}
+
+/*
+** Read from the database file.
+*/
+static int kvvfsReadDb(
+ sqlite3_file *pProtoFile,
+ void *zBuf,
+ int iAmt,
+ sqlite_int64 iOfst
+){
+ KVVfsFile *pFile = (KVVfsFile*)pProtoFile;
+ unsigned int pgno;
+ int got, n;
+ char zKey[30];
+ char *aData = pFile->aData;
+ assert( iOfst>=0 );
+ assert( iAmt>=0 );
+ SQLITE_KV_LOG(("xRead('%s-db',%d,%lld)\n", pFile->zClass, iAmt, iOfst));
+ if( iOfst+iAmt>=512 ){
+ if( (iOfst % iAmt)!=0 ){
+ return SQLITE_IOERR_READ;
+ }
+ if( (iAmt & (iAmt-1))!=0 || iAmt<512 || iAmt>65536 ){
+ return SQLITE_IOERR_READ;
+ }
+ pFile->szPage = iAmt;
+ pgno = 1 + iOfst/iAmt;
+ }else{
+ pgno = 1;
+ }
+ sqlite3_snprintf(sizeof(zKey), zKey, "%u", pgno);
+ got = sqlite3KvvfsMethods.xRead(pFile->zClass, zKey,
+ aData, SQLITE_KVOS_SZ-1);
+ if( got<0 ){
+ n = 0;
+ }else{
+ aData[got] = 0;
+ if( iOfst+iAmt<512 ){
+ int k = iOfst+iAmt;
+ aData[k*2] = 0;
+ n = kvvfsDecode(aData, &aData[2000], SQLITE_KVOS_SZ-2000);
+ if( n>=iOfst+iAmt ){
+ memcpy(zBuf, &aData[2000+iOfst], iAmt);
+ n = iAmt;
+ }else{
+ n = 0;
+ }
+ }else{
+ n = kvvfsDecode(aData, zBuf, iAmt);
+ }
+ }
+ if( n<iAmt ){
+ memset(zBuf+n, 0, iAmt-n);
+ return SQLITE_IOERR_SHORT_READ;
+ }
+ return SQLITE_OK;
+}
+
+
+/*
+** Write into the -journal file.
+*/
+static int kvvfsWriteJrnl(
+ sqlite3_file *pProtoFile,
+ const void *zBuf,
+ int iAmt,
+ sqlite_int64 iOfst
+){
+ KVVfsFile *pFile = (KVVfsFile*)pProtoFile;
+ sqlite3_int64 iEnd = iOfst+iAmt;
+ SQLITE_KV_LOG(("xWrite('%s-journal',%d,%lld)\n", pFile->zClass, iAmt, iOfst));
+ if( iEnd>=0x10000000 ) return SQLITE_FULL;
+ if( pFile->aJrnl==0 || pFile->nJrnl<iEnd ){
+ char *aNew = sqlite3_realloc(pFile->aJrnl, iEnd);
+ if( aNew==0 ){
+ return SQLITE_IOERR_NOMEM;
+ }
+ pFile->aJrnl = aNew;
+ if( pFile->nJrnl<iOfst ){
+ memset(pFile->aJrnl+pFile->nJrnl, 0, iOfst-pFile->nJrnl);
+ }
+ pFile->nJrnl = iEnd;
+ }
+ memcpy(pFile->aJrnl+iOfst, zBuf, iAmt);
+ return SQLITE_OK;
+}
+
+/*
+** Write into the database file.
+*/
+static int kvvfsWriteDb(
+ sqlite3_file *pProtoFile,
+ const void *zBuf,
+ int iAmt,
+ sqlite_int64 iOfst
+){
+ KVVfsFile *pFile = (KVVfsFile*)pProtoFile;
+ unsigned int pgno;
+ char zKey[30];
+ char *aData = pFile->aData;
+ SQLITE_KV_LOG(("xWrite('%s-db',%d,%lld)\n", pFile->zClass, iAmt, iOfst));
+ assert( iAmt>=512 && iAmt<=65536 );
+ assert( (iAmt & (iAmt-1))==0 );
+ assert( pFile->szPage<0 || pFile->szPage==iAmt );
+ pFile->szPage = iAmt;
+ pgno = 1 + iOfst/iAmt;
+ sqlite3_snprintf(sizeof(zKey), zKey, "%u", pgno);
+ kvvfsEncode(zBuf, iAmt, aData);
+ if( sqlite3KvvfsMethods.xWrite(pFile->zClass, zKey, aData) ){
+ return SQLITE_IOERR;
+ }
+ if( iOfst+iAmt > pFile->szDb ){
+ pFile->szDb = iOfst + iAmt;
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Truncate an kvvfs-file.
+*/
+static int kvvfsTruncateJrnl(sqlite3_file *pProtoFile, sqlite_int64 size){
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+ SQLITE_KV_LOG(("xTruncate('%s-journal',%lld)\n", pFile->zClass, size));
+ assert( size==0 );
+ sqlite3KvvfsMethods.xDelete(pFile->zClass, "jrnl");
+ sqlite3_free(pFile->aJrnl);
+ pFile->aJrnl = 0;
+ pFile->nJrnl = 0;
+ return SQLITE_OK;
+}
+static int kvvfsTruncateDb(sqlite3_file *pProtoFile, sqlite_int64 size){
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+ if( pFile->szDb>size
+ && pFile->szPage>0
+ && (size % pFile->szPage)==0
+ ){
+ char zKey[50];
+ unsigned int pgno, pgnoMax;
+ SQLITE_KV_LOG(("xTruncate('%s-db',%lld)\n", pFile->zClass, size));
+ pgno = 1 + size/pFile->szPage;
+ pgnoMax = 2 + pFile->szDb/pFile->szPage;
+ while( pgno<=pgnoMax ){
+ sqlite3_snprintf(sizeof(zKey), zKey, "%u", pgno);
+ sqlite3KvvfsMethods.xDelete(pFile->zClass, zKey);
+ pgno++;
+ }
+ pFile->szDb = size;
+ return kvvfsWriteFileSize(pFile, size) ? SQLITE_IOERR : SQLITE_OK;
+ }
+ return SQLITE_IOERR;
+}
+
+/*
+** Sync an kvvfs-file.
+*/
+static int kvvfsSyncJrnl(sqlite3_file *pProtoFile, int flags){
+ int i, n;
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+ char *zOut;
+ SQLITE_KV_LOG(("xSync('%s-journal')\n", pFile->zClass));
+ if( pFile->nJrnl<=0 ){
+ return kvvfsTruncateJrnl(pProtoFile, 0);
+ }
+ zOut = sqlite3_malloc64( pFile->nJrnl*2 + 50 );
+ if( zOut==0 ){
+ return SQLITE_IOERR_NOMEM;
+ }
+ n = pFile->nJrnl;
+ i = 0;
+ do{
+ zOut[i++] = 'a' + (n%26);
+ n /= 26;
+ }while( n>0 );
+ zOut[i++] = ' ';
+ kvvfsEncode(pFile->aJrnl, pFile->nJrnl, &zOut[i]);
+ i = sqlite3KvvfsMethods.xWrite(pFile->zClass, "jrnl", zOut);
+ sqlite3_free(zOut);
+ return i ? SQLITE_IOERR : SQLITE_OK;
+}
+static int kvvfsSyncDb(sqlite3_file *pProtoFile, int flags){
+ return SQLITE_OK;
+}
+
+/*
+** Return the current file-size of an kvvfs-file.
+*/
+static int kvvfsFileSizeJrnl(sqlite3_file *pProtoFile, sqlite_int64 *pSize){
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+ SQLITE_KV_LOG(("xFileSize('%s-journal')\n", pFile->zClass));
+ *pSize = pFile->nJrnl;
+ return SQLITE_OK;
+}
+static int kvvfsFileSizeDb(sqlite3_file *pProtoFile, sqlite_int64 *pSize){
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+ SQLITE_KV_LOG(("xFileSize('%s-db')\n", pFile->zClass));
+ if( pFile->szDb>=0 ){
+ *pSize = pFile->szDb;
+ }else{
+ *pSize = kvvfsReadFileSize(pFile);
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Lock an kvvfs-file.
+*/
+static int kvvfsLock(sqlite3_file *pProtoFile, int eLock){
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+ assert( !pFile->isJournal );
+ SQLITE_KV_LOG(("xLock(%s,%d)\n", pFile->zClass, eLock));
+
+ if( eLock!=SQLITE_LOCK_NONE ){
+ pFile->szDb = kvvfsReadFileSize(pFile);
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Unlock an kvvfs-file.
+*/
+static int kvvfsUnlock(sqlite3_file *pProtoFile, int eLock){
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+ assert( !pFile->isJournal );
+ SQLITE_KV_LOG(("xUnlock(%s,%d)\n", pFile->zClass, eLock));
+ if( eLock==SQLITE_LOCK_NONE ){
+ pFile->szDb = -1;
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Check if another file-handle holds a RESERVED lock on an kvvfs-file.
+*/
+static int kvvfsCheckReservedLock(sqlite3_file *pProtoFile, int *pResOut){
+ SQLITE_KV_LOG(("xCheckReservedLock\n"));
+ *pResOut = 0;
+ return SQLITE_OK;
+}
+
+/*
+** File control method. For custom operations on an kvvfs-file.
+*/
+static int kvvfsFileControlJrnl(sqlite3_file *pProtoFile, int op, void *pArg){
+ SQLITE_KV_LOG(("xFileControl(%d) on journal\n", op));
+ return SQLITE_NOTFOUND;
+}
+static int kvvfsFileControlDb(sqlite3_file *pProtoFile, int op, void *pArg){
+ SQLITE_KV_LOG(("xFileControl(%d) on database\n", op));
+ if( op==SQLITE_FCNTL_SYNC ){
+ KVVfsFile *pFile = (KVVfsFile *)pProtoFile;
+ int rc = SQLITE_OK;
+ SQLITE_KV_LOG(("xSync('%s-db')\n", pFile->zClass));
+ if( pFile->szDb>0 && 0!=kvvfsWriteFileSize(pFile, pFile->szDb) ){
+ rc = SQLITE_IOERR;
+ }
+ return rc;
+ }
+ return SQLITE_NOTFOUND;
+}
+
+/*
+** Return the sector-size in bytes for an kvvfs-file.
+*/
+static int kvvfsSectorSize(sqlite3_file *pFile){
+ return 512;
+}
+
+/*
+** Return the device characteristic flags supported by an kvvfs-file.
+*/
+static int kvvfsDeviceCharacteristics(sqlite3_file *pProtoFile){
+ return 0;
+}
+
+/****** sqlite3_vfs methods *************************************************/
+
+/*
+** Open an kvvfs file handle.
+*/
+static int kvvfsOpen(
+ sqlite3_vfs *pProtoVfs,
+ const char *zName,
+ sqlite3_file *pProtoFile,
+ int flags,
+ int *pOutFlags
+){
+ KVVfsFile *pFile = (KVVfsFile*)pProtoFile;
+ if( zName==0 ) zName = "";
+ SQLITE_KV_LOG(("xOpen(\"%s\")\n", zName));
+ if( strcmp(zName, "local")==0
+ || strcmp(zName, "session")==0
+ ){
+ pFile->isJournal = 0;
+ pFile->base.pMethods = &kvvfs_db_io_methods;
+ }else
+ if( strcmp(zName, "local-journal")==0
+ || strcmp(zName, "session-journal")==0
+ ){
+ pFile->isJournal = 1;
+ pFile->base.pMethods = &kvvfs_jrnl_io_methods;
+ }else{
+ return SQLITE_CANTOPEN;
+ }
+ if( zName[0]=='s' ){
+ pFile->zClass = "session";
+ }else{
+ pFile->zClass = "local";
+ }
+ pFile->aData = sqlite3_malloc64(SQLITE_KVOS_SZ);
+ if( pFile->aData==0 ){
+ return SQLITE_NOMEM;
+ }
+ pFile->aJrnl = 0;
+ pFile->nJrnl = 0;
+ pFile->szPage = -1;
+ pFile->szDb = -1;
+ return SQLITE_OK;
+}
+
+/*
+** Delete the file located at zPath. If the dirSync argument is true,
+** ensure the file-system modifications are synced to disk before
+** returning.
+*/
+static int kvvfsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
+ if( strcmp(zPath, "local-journal")==0 ){
+ sqlite3KvvfsMethods.xDelete("local", "jrnl");
+ }else
+ if( strcmp(zPath, "session-journal")==0 ){
+ sqlite3KvvfsMethods.xDelete("session", "jrnl");
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Test for access permissions. Return true if the requested permission
+** is available, or false otherwise.
+*/
+static int kvvfsAccess(
+ sqlite3_vfs *pProtoVfs,
+ const char *zPath,
+ int flags,
+ int *pResOut
+){
+ SQLITE_KV_LOG(("xAccess(\"%s\")\n", zPath));
+ if( strcmp(zPath, "local-journal")==0 ){
+ *pResOut = sqlite3KvvfsMethods.xRead("local", "jrnl", 0, 0)>0;
+ }else
+ if( strcmp(zPath, "session-journal")==0 ){
+ *pResOut = sqlite3KvvfsMethods.xRead("session", "jrnl", 0, 0)>0;
+ }else
+ if( strcmp(zPath, "local")==0 ){
+ *pResOut = sqlite3KvvfsMethods.xRead("local", "sz", 0, 0)>0;
+ }else
+ if( strcmp(zPath, "session")==0 ){
+ *pResOut = sqlite3KvvfsMethods.xRead("session", "sz", 0, 0)>0;
+ }else
+ {
+ *pResOut = 0;
+ }
+ SQLITE_KV_LOG(("xAccess returns %d\n",*pResOut));
+ return SQLITE_OK;
+}
+
+/*
+** Populate buffer zOut with the full canonical pathname corresponding
+** to the pathname in zPath. zOut is guaranteed to point to a buffer
+** of at least (INST_MAX_PATHNAME+1) bytes.
+*/
+static int kvvfsFullPathname(
+ sqlite3_vfs *pVfs,
+ const char *zPath,
+ int nOut,
+ char *zOut
+){
+ size_t nPath;
+#ifdef SQLITE_OS_KV_ALWAYS_LOCAL
+ zPath = "local";
+#endif
+ nPath = strlen(zPath);
+ SQLITE_KV_LOG(("xFullPathname(\"%s\")\n", zPath));
+ if( nOut<nPath+1 ) nPath = nOut - 1;
+ memcpy(zOut, zPath, nPath);
+ zOut[nPath] = 0;
+ return SQLITE_OK;
+}
+
+/*
+** Open the dynamic library located at zPath and return a handle.
+*/
+static void *kvvfsDlOpen(sqlite3_vfs *pVfs, const char *zPath){
+ return 0;
+}
+
+/*
+** Populate the buffer pointed to by zBufOut with nByte bytes of
+** random data.
+*/
+static int kvvfsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
+ memset(zBufOut, 0, nByte);
+ return nByte;
+}
+
+/*
+** Sleep for nMicro microseconds. Return the number of microseconds
+** actually slept.
+*/
+static int kvvfsSleep(sqlite3_vfs *pVfs, int nMicro){
+ return SQLITE_OK;
+}
+
+/*
+** Return the current time as a Julian Day number in *pTimeOut.
+*/
+static int kvvfsCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
+ sqlite3_int64 i = 0;
+ int rc;
+ rc = kvvfsCurrentTimeInt64(0, &i);
+ *pTimeOut = i/86400000.0;
+ return rc;
+}
+#include <sys/time.h>
+static int kvvfsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){
+ static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
+ struct timeval sNow;
+ (void)gettimeofday(&sNow, 0); /* Cannot fail given valid arguments */
+ *pTimeOut = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000;
+ return SQLITE_OK;
+}
+#endif /* SQLITE_OS_KV || SQLITE_OS_UNIX */
+
+#if SQLITE_OS_KV
+/*
+** This routine is called initialize the KV-vfs as the default VFS.
+*/
+SQLITE_API int sqlite3_os_init(void){
+ return sqlite3_vfs_register(&sqlite3OsKvvfsObject, 1);
+}
+SQLITE_API int sqlite3_os_end(void){
+ return SQLITE_OK;
+}
+#endif /* SQLITE_OS_KV */
+
+#if SQLITE_OS_UNIX && defined(SQLITE_OS_KV_OPTIONAL)
+SQLITE_PRIVATE int sqlite3KvvfsInit(void){
+ return sqlite3_vfs_register(&sqlite3OsKvvfsObject, 0);
+}
+#endif
+
+/************** End of os_kv.c ***********************************************/
/************** Begin file os_unix.c *****************************************/
/*
** 2004 May 22
@@ -33932,7 +37242,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
#endif
/* Use pread() and pwrite() if they are available */
-#if defined(__APPLE__)
+#if defined(__APPLE__) || defined(__linux__)
# define HAVE_PREAD 1
# define HAVE_PWRITE 1
#endif
@@ -33947,15 +37257,16 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
/*
** standard include files.
*/
-#include <sys/types.h>
-#include <sys/stat.h>
+#include <sys/types.h> /* amalgamator: keep */
+#include <sys/stat.h> /* amalgamator: keep */
#include <fcntl.h>
#include <sys/ioctl.h>
-#include <unistd.h>
+#include <unistd.h> /* amalgamator: keep */
/* #include <time.h> */
-#include <sys/time.h>
+#include <sys/time.h> /* amalgamator: keep */
#include <errno.h>
-#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0
+#if (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) \
+ && !defined(SQLITE_WASI)
# include <sys/mman.h>
#endif
@@ -34043,9 +37354,46 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
*/
#define SQLITE_MAX_SYMLINKS 100
+/*
+** Remove and stub certain info for WASI (WebAssembly System
+** Interface) builds.
+*/
+#ifdef SQLITE_WASI
+# undef HAVE_FCHMOD
+# undef HAVE_FCHOWN
+# undef HAVE_MREMAP
+# define HAVE_MREMAP 0
+# ifndef SQLITE_DEFAULT_UNIX_VFS
+# define SQLITE_DEFAULT_UNIX_VFS "unix-dotfile"
+ /* ^^^ should SQLITE_DEFAULT_UNIX_VFS be "unix-none"? */
+# endif
+# ifndef F_RDLCK
+# define F_RDLCK 0
+# define F_WRLCK 1
+# define F_UNLCK 2
+# if __LONG_MAX == 0x7fffffffL
+# define F_GETLK 12
+# define F_SETLK 13
+# define F_SETLKW 14
+# else
+# define F_GETLK 5
+# define F_SETLK 6
+# define F_SETLKW 7
+# endif
+# endif
+#else /* !SQLITE_WASI */
+# ifndef HAVE_FCHMOD
+# define HAVE_FCHMOD
+# endif
+#endif /* SQLITE_WASI */
+
+#ifdef SQLITE_WASI
+# define osGetpid(X) (pid_t)1
+#else
/* Always cast the getpid() return type for compatibility with
** kernel modules in VxWorks. */
-#define osGetpid(X) (pid_t)getpid()
+# define osGetpid(X) (pid_t)getpid()
+#endif
/*
** Only set the lastErrno if the error code is a real error and not
@@ -34157,205 +37505,7 @@ static pid_t randomnessPid = 0;
/*
** Include code that is common to all os_*.c files
*/
-/************** Include os_common.h in the middle of os_unix.c ***************/
-/************** Begin file os_common.h ***************************************/
-/*
-** 2004 May 22
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This file contains macros and a little bit of code that is common to
-** all of the platform-specific files (os_*.c) and is #included into those
-** files.
-**
-** This file should be #included by the os_*.c files only. It is not a
-** general purpose header file.
-*/
-#ifndef _OS_COMMON_H_
-#define _OS_COMMON_H_
-
-/*
-** At least two bugs have slipped in because we changed the MEMORY_DEBUG
-** macro to SQLITE_DEBUG and some older makefiles have not yet made the
-** switch. The following code should catch this problem at compile-time.
-*/
-#ifdef MEMORY_DEBUG
-# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
-#endif
-
-/*
-** Macros for performance tracing. Normally turned off. Only works
-** on i486 hardware.
-*/
-#ifdef SQLITE_PERFORMANCE_TRACE
-
-/*
-** hwtime.h contains inline assembler code for implementing
-** high-performance timing routines.
-*/
-/************** Include hwtime.h in the middle of os_common.h ****************/
-/************** Begin file hwtime.h ******************************************/
-/*
-** 2008 May 27
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This file contains inline asm code for retrieving "high-performance"
-** counters for x86 and x86_64 class CPUs.
-*/
-#ifndef SQLITE_HWTIME_H
-#define SQLITE_HWTIME_H
-
-/*
-** The following routine only works on pentium-class (or newer) processors.
-** It uses the RDTSC opcode to read the cycle count value out of the
-** processor and returns that value. This can be used for high-res
-** profiling.
-*/
-#if !defined(__STRICT_ANSI__) && \
- (defined(__GNUC__) || defined(_MSC_VER)) && \
- (defined(i386) || defined(__i386__) || defined(_M_IX86))
-
- #if defined(__GNUC__)
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned int lo, hi;
- __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
- return (sqlite_uint64)hi << 32 | lo;
- }
-
- #elif defined(_MSC_VER)
-
- __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
- __asm {
- rdtsc
- ret ; return value at EDX:EAX
- }
- }
-
- #endif
-
-#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__))
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned long val;
- __asm__ __volatile__ ("rdtsc" : "=A" (val));
- return val;
- }
-
-#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__))
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned long long retval;
- unsigned long junk;
- __asm__ __volatile__ ("\n\
- 1: mftbu %1\n\
- mftb %L0\n\
- mftbu %0\n\
- cmpw %0,%1\n\
- bne 1b"
- : "=r" (retval), "=r" (junk));
- return retval;
- }
-
-#else
-
- /*
- ** asm() is needed for hardware timing support. Without asm(),
- ** disable the sqlite3Hwtime() routine.
- **
- ** sqlite3Hwtime() is only used for some obscure debugging
- ** and analysis configurations, not in any deliverable, so this
- ** should not be a great loss.
- */
-SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
-
-#endif
-
-#endif /* !defined(SQLITE_HWTIME_H) */
-
-/************** End of hwtime.h **********************************************/
-/************** Continuing where we left off in os_common.h ******************/
-
-static sqlite_uint64 g_start;
-static sqlite_uint64 g_elapsed;
-#define TIMER_START g_start=sqlite3Hwtime()
-#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
-#define TIMER_ELAPSED g_elapsed
-#else
-#define TIMER_START
-#define TIMER_END
-#define TIMER_ELAPSED ((sqlite_uint64)0)
-#endif
-
-/*
-** If we compile with the SQLITE_TEST macro set, then the following block
-** of code will give us the ability to simulate a disk I/O error. This
-** is used for testing the I/O recovery logic.
-*/
-#if defined(SQLITE_TEST)
-SQLITE_API extern int sqlite3_io_error_hit;
-SQLITE_API extern int sqlite3_io_error_hardhit;
-SQLITE_API extern int sqlite3_io_error_pending;
-SQLITE_API extern int sqlite3_io_error_persist;
-SQLITE_API extern int sqlite3_io_error_benign;
-SQLITE_API extern int sqlite3_diskfull_pending;
-SQLITE_API extern int sqlite3_diskfull;
-#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
-#define SimulateIOError(CODE) \
- if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
- || sqlite3_io_error_pending-- == 1 ) \
- { local_ioerr(); CODE; }
-static void local_ioerr(){
- IOTRACE(("IOERR\n"));
- sqlite3_io_error_hit++;
- if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
-}
-#define SimulateDiskfullError(CODE) \
- if( sqlite3_diskfull_pending ){ \
- if( sqlite3_diskfull_pending == 1 ){ \
- local_ioerr(); \
- sqlite3_diskfull = 1; \
- sqlite3_io_error_hit = 1; \
- CODE; \
- }else{ \
- sqlite3_diskfull_pending--; \
- } \
- }
-#else
-#define SimulateIOErrorBenign(X)
-#define SimulateIOError(A)
-#define SimulateDiskfullError(A)
-#endif /* defined(SQLITE_TEST) */
-
-/*
-** When testing, keep a count of the number of open files.
-*/
-#if defined(SQLITE_TEST)
-SQLITE_API extern int sqlite3_open_file_count;
-#define OpenCounter(X) sqlite3_open_file_count+=(X)
-#else
-#define OpenCounter(X)
-#endif /* defined(SQLITE_TEST) */
-
-#endif /* !defined(_OS_COMMON_H_) */
-
-/************** End of os_common.h *******************************************/
-/************** Continuing where we left off in os_unix.c ********************/
+/* #include "os_common.h" */
/*
** Define various macros that are missing from some systems.
@@ -34515,7 +37665,11 @@ static struct unix_syscall {
#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\
aSyscall[13].pCurrent)
+#if defined(HAVE_FCHMOD)
{ "fchmod", (sqlite3_syscall_ptr)fchmod, 0 },
+#else
+ { "fchmod", (sqlite3_syscall_ptr)0, 0 },
+#endif
#define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent)
#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE
@@ -34551,14 +37705,16 @@ static struct unix_syscall {
#endif
#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent)
-#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0
+#if (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) \
+ && !defined(SQLITE_WASI)
{ "mmap", (sqlite3_syscall_ptr)mmap, 0 },
#else
{ "mmap", (sqlite3_syscall_ptr)0, 0 },
#endif
#define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[22].pCurrent)
-#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0
+#if (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) \
+ && !defined(SQLITE_WASI)
{ "munmap", (sqlite3_syscall_ptr)munmap, 0 },
#else
{ "munmap", (sqlite3_syscall_ptr)0, 0 },
@@ -34744,6 +37900,9 @@ static int robust_open(const char *z, int f, mode_t m){
break;
}
if( fd>=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break;
+ if( (f & (O_EXCL|O_CREAT))==(O_EXCL|O_CREAT) ){
+ (void)osUnlink(z);
+ }
osClose(fd);
sqlite3_log(SQLITE_WARNING,
"attempt to open \"%s\" as file descriptor %d", z, fd);
@@ -35706,7 +38865,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){
**
** UNLOCKED -> SHARED
** SHARED -> RESERVED
-** SHARED -> (PENDING) -> EXCLUSIVE
+** SHARED -> EXCLUSIVE
** RESERVED -> (PENDING) -> EXCLUSIVE
** PENDING -> EXCLUSIVE
**
@@ -35739,19 +38898,20 @@ static int unixLock(sqlite3_file *id, int eFileLock){
** A RESERVED lock is implemented by grabbing a write-lock on the
** 'reserved byte'.
**
- ** A process may only obtain a PENDING lock after it has obtained a
- ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock
- ** on the 'pending byte'. This ensures that no new SHARED locks can be
- ** obtained, but existing SHARED locks are allowed to persist. A process
- ** does not have to obtain a RESERVED lock on the way to a PENDING lock.
- ** This property is used by the algorithm for rolling back a journal file
- ** after a crash.
+ ** An EXCLUSIVE lock may only be requested after either a SHARED or
+ ** RESERVED lock is held. An EXCLUSIVE lock is implemented by obtaining
+ ** a write-lock on the entire 'shared byte range'. Since all other locks
+ ** require a read-lock on one of the bytes within this range, this ensures
+ ** that no other locks are held on the database.
**
- ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is
- ** implemented by obtaining a write-lock on the entire 'shared byte
- ** range'. Since all other locks require a read-lock on one of the bytes
- ** within this range, this ensures that no other locks are held on the
- ** database.
+ ** If a process that holds a RESERVED lock requests an EXCLUSIVE, then
+ ** a PENDING lock is obtained first. A PENDING lock is implemented by
+ ** obtaining a write-lock on the 'pending byte'. This ensures that no new
+ ** SHARED locks can be obtained, but existing SHARED locks are allowed to
+ ** persist. If the call to this function fails to obtain the EXCLUSIVE
+ ** lock in this case, it holds the PENDING lock intead. The client may
+ ** then re-attempt the EXCLUSIVE lock later on, after existing SHARED
+ ** locks have cleared.
*/
int rc = SQLITE_OK;
unixFile *pFile = (unixFile*)id;
@@ -35822,7 +38982,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){
lock.l_len = 1L;
lock.l_whence = SEEK_SET;
if( eFileLock==SHARED_LOCK
- || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLock<PENDING_LOCK)
+ || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLock==RESERVED_LOCK)
){
lock.l_type = (eFileLock==SHARED_LOCK?F_RDLCK:F_WRLCK);
lock.l_start = PENDING_BYTE;
@@ -35833,6 +38993,9 @@ static int unixLock(sqlite3_file *id, int eFileLock){
storeLastErrno(pFile, tErrno);
}
goto end_lock;
+ }else if( eFileLock==EXCLUSIVE_LOCK ){
+ pFile->eFileLock = PENDING_LOCK;
+ pInode->eFileLock = PENDING_LOCK;
}
}
@@ -35920,13 +39083,9 @@ static int unixLock(sqlite3_file *id, int eFileLock){
}
#endif
-
if( rc==SQLITE_OK ){
pFile->eFileLock = eFileLock;
pInode->eFileLock = eFileLock;
- }else if( eFileLock==EXCLUSIVE_LOCK ){
- pFile->eFileLock = PENDING_LOCK;
- pInode->eFileLock = PENDING_LOCK;
}
end_lock:
@@ -37333,12 +40492,6 @@ static int nfsUnlock(sqlite3_file *id, int eFileLock){
** Seek to the offset passed as the second argument, then read cnt
** bytes into pBuf. Return the number of bytes actually read.
**
-** NB: If you define USE_PREAD or USE_PREAD64, then it might also
-** be necessary to define _XOPEN_SOURCE to be 500. This varies from
-** one system to another. Since SQLite does not define USE_PREAD
-** in any form by default, we will not attempt to define _XOPEN_SOURCE.
-** See tickets #2741 and #2681.
-**
** To avoid stomping the errno value on a failed read the lastErrno value
** is set before returning.
*/
@@ -38009,7 +41162,9 @@ static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){
/* Forward declaration */
static int unixGetTempname(int nBuf, char *zBuf);
-static int unixFcntlExternalReader(unixFile*, int*);
+#ifndef SQLITE_OMIT_WAL
+ static int unixFcntlExternalReader(unixFile*, int*);
+#endif
/*
** Information and control of an open file handle.
@@ -38128,7 +41283,12 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){
#endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */
case SQLITE_FCNTL_EXTERNAL_READER: {
+#ifndef SQLITE_OMIT_WAL
return unixFcntlExternalReader((unixFile*)id, (int*)pArg);
+#else
+ *(int*)pArg = 0;
+ return SQLITE_OK;
+#endif
}
}
return SQLITE_NOTFOUND;
@@ -38961,11 +42121,17 @@ static int unixShmLock(
int flags /* What to do with the lock */
){
unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */
- unixShm *p = pDbFd->pShm; /* The shared memory being locked */
- unixShmNode *pShmNode = p->pShmNode; /* The underlying file iNode */
+ unixShm *p; /* The shared memory being locked */
+ unixShmNode *pShmNode; /* The underlying file iNode */
int rc = SQLITE_OK; /* Result code */
u16 mask; /* Mask of locks to take or release */
- int *aLock = pShmNode->aLock;
+ int *aLock;
+
+ p = pDbFd->pShm;
+ if( p==0 ) return SQLITE_IOERR_SHMLOCK;
+ pShmNode = p->pShmNode;
+ if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK;
+ aLock = pShmNode->aLock;
assert( pShmNode==pDbFd->pInode->pShmNode );
assert( pShmNode->pInode==pDbFd->pInode );
@@ -39850,24 +43016,34 @@ static int fillInUnixFile(
}
/*
+** Directories to consider for temp files.
+*/
+static const char *azTempDirs[] = {
+ 0,
+ 0,
+ "/var/tmp",
+ "/usr/tmp",
+ "/tmp",
+ "."
+};
+
+/*
+** Initialize first two members of azTempDirs[] array.
+*/
+static void unixTempFileInit(void){
+ azTempDirs[0] = getenv("SQLITE_TMPDIR");
+ azTempDirs[1] = getenv("TMPDIR");
+}
+
+/*
** Return the name of a directory in which to put temporary files.
** If no suitable temporary file directory can be found, return NULL.
*/
static const char *unixTempFileDir(void){
- static const char *azDirs[] = {
- 0,
- 0,
- "/var/tmp",
- "/usr/tmp",
- "/tmp",
- "."
- };
unsigned int i = 0;
struct stat buf;
const char *zDir = sqlite3_temp_directory;
- if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR");
- if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR");
while(1){
if( zDir!=0
&& osStat(zDir, &buf)==0
@@ -39876,8 +43052,8 @@ static const char *unixTempFileDir(void){
){
return zDir;
}
- if( i>=sizeof(azDirs)/sizeof(azDirs[0]) ) break;
- zDir = azDirs[i++];
+ if( i>=sizeof(azTempDirs)/sizeof(azTempDirs[0]) ) break;
+ zDir = azTempDirs[i++];
}
return 0;
}
@@ -39890,6 +43066,7 @@ static const char *unixTempFileDir(void){
static int unixGetTempname(int nBuf, char *zBuf){
const char *zDir;
int iLimit = 0;
+ int rc = SQLITE_OK;
/* It's odd to simulate an io-error here, but really this is just
** using the io-error infrastructure to test that SQLite handles this
@@ -39898,18 +43075,26 @@ static int unixGetTempname(int nBuf, char *zBuf){
zBuf[0] = 0;
SimulateIOError( return SQLITE_IOERR );
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
zDir = unixTempFileDir();
- if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH;
- do{
- u64 r;
- sqlite3_randomness(sizeof(r), &r);
- assert( nBuf>2 );
- zBuf[nBuf-2] = 0;
- sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c",
- zDir, r, 0);
- if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR;
- }while( osAccess(zBuf,0)==0 );
- return SQLITE_OK;
+ if( zDir==0 ){
+ rc = SQLITE_IOERR_GETTEMPPATH;
+ }else{
+ do{
+ u64 r;
+ sqlite3_randomness(sizeof(r), &r);
+ assert( nBuf>2 );
+ zBuf[nBuf-2] = 0;
+ sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c",
+ zDir, r, 0);
+ if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ){
+ rc = SQLITE_ERROR;
+ break;
+ }
+ }while( osAccess(zBuf,0)==0 );
+ }
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
+ return rc;
}
#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
@@ -40052,20 +43237,23 @@ static int findCreateFileMode(
**
** where NN is a decimal number. The NN naming schemes are
** used by the test_multiplex.c module.
+ **
+ ** In normal operation, the journal file name will always contain
+ ** a '-' character. However in 8+3 filename mode, or if a corrupt
+ ** rollback journal specifies a super-journal with a goofy name, then
+ ** the '-' might be missing or the '-' might be the first character in
+ ** the filename. In that case, just return SQLITE_OK with *pMode==0.
*/
nDb = sqlite3Strlen30(zPath) - 1;
- while( zPath[nDb]!='-' ){
- /* In normal operation, the journal file name will always contain
- ** a '-' character. However in 8+3 filename mode, or if a corrupt
- ** rollback journal specifies a super-journal with a goofy name, then
- ** the '-' might be missing. */
- if( nDb==0 || zPath[nDb]=='.' ) return SQLITE_OK;
+ while( nDb>0 && zPath[nDb]!='.' ){
+ if( zPath[nDb]=='-' ){
+ memcpy(zDb, zPath, nDb);
+ zDb[nDb] = '\0';
+ rc = getFileMode(zDb, pMode, pUid, pGid);
+ break;
+ }
nDb--;
}
- memcpy(zDb, zPath, nDb);
- zDb[nDb] = '\0';
-
- rc = getFileMode(zDb, pMode, pUid, pGid);
}else if( flags & SQLITE_OPEN_DELETEONCLOSE ){
*pMode = 0600;
}else if( flags & SQLITE_OPEN_URI ){
@@ -40183,6 +43371,11 @@ static int unixOpen(
}
memset(p, 0, sizeof(unixFile));
+#ifdef SQLITE_ASSERT_NO_FILES
+ /* Applications that never read or write a persistent disk files */
+ assert( zName==0 );
+#endif
+
if( eType==SQLITE_OPEN_MAIN_DB ){
UnixUnusedFd *pUnused;
pUnused = findReusableFd(zName, flags);
@@ -40450,86 +43643,97 @@ static int unixAccess(
}
/*
-** If the last component of the pathname in z[0]..z[j-1] is something
-** other than ".." then back it out and return true. If the last
-** component is empty or if it is ".." then return false.
+** A pathname under construction
*/
-static int unixBackupDir(const char *z, int *pJ){
- int j = *pJ;
- int i;
- if( j<=0 ) return 0;
- for(i=j-1; i>0 && z[i-1]!='/'; i--){}
- if( i==0 ) return 0;
- if( z[i]=='.' && i==j-2 && z[i+1]=='.' ) return 0;
- *pJ = i-1;
- return 1;
-}
+typedef struct DbPath DbPath;
+struct DbPath {
+ int rc; /* Non-zero following any error */
+ int nSymlink; /* Number of symlinks resolved */
+ char *zOut; /* Write the pathname here */
+ int nOut; /* Bytes of space available to zOut[] */
+ int nUsed; /* Bytes of zOut[] currently being used */
+};
+
+/* Forward reference */
+static void appendAllPathElements(DbPath*,const char*);
/*
-** Convert a relative pathname into a full pathname. Also
-** simplify the pathname as follows:
-**
-** Remove all instances of /./
-** Remove all isntances of /X/../ for any X
+** Append a single path element to the DbPath under construction
*/
-static int mkFullPathname(
- const char *zPath, /* Input path */
- char *zOut, /* Output buffer */
- int nOut /* Allocated size of buffer zOut */
+static void appendOnePathElement(
+ DbPath *pPath, /* Path under construction, to which to append zName */
+ const char *zName, /* Name to append to pPath. Not zero-terminated */
+ int nName /* Number of significant bytes in zName */
){
- int nPath = sqlite3Strlen30(zPath);
- int iOff = 0;
- int i, j;
- if( zPath[0]!='/' ){
- if( osGetcwd(zOut, nOut-2)==0 ){
- return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath);
+ assert( nName>0 );
+ assert( zName!=0 );
+ if( zName[0]=='.' ){
+ if( nName==1 ) return;
+ if( zName[1]=='.' && nName==2 ){
+ if( pPath->nUsed>1 ){
+ assert( pPath->zOut[0]=='/' );
+ while( pPath->zOut[--pPath->nUsed]!='/' ){}
+ }
+ return;
}
- iOff = sqlite3Strlen30(zOut);
- zOut[iOff++] = '/';
- }
- if( (iOff+nPath+1)>nOut ){
- /* SQLite assumes that xFullPathname() nul-terminates the output buffer
- ** even if it returns an error. */
- zOut[iOff] = '\0';
- return SQLITE_CANTOPEN_BKPT;
}
- sqlite3_snprintf(nOut-iOff, &zOut[iOff], "%s", zPath);
-
- /* Remove duplicate '/' characters. Except, two // at the beginning
- ** of a pathname is allowed since this is important on windows. */
- for(i=j=1; zOut[i]; i++){
- zOut[j++] = zOut[i];
- while( zOut[i]=='/' && zOut[i+1]=='/' ) i++;
+ if( pPath->nUsed + nName + 2 >= pPath->nOut ){
+ pPath->rc = SQLITE_ERROR;
+ return;
}
- zOut[j] = 0;
-
- assert( zOut[0]=='/' );
- for(i=j=0; zOut[i]; i++){
- if( zOut[i]=='/' ){
- /* Skip over internal "/." directory components */
- if( zOut[i+1]=='.' && zOut[i+2]=='/' ){
- i += 1;
- continue;
+ pPath->zOut[pPath->nUsed++] = '/';
+ memcpy(&pPath->zOut[pPath->nUsed], zName, nName);
+ pPath->nUsed += nName;
+#if defined(HAVE_READLINK) && defined(HAVE_LSTAT)
+ if( pPath->rc==SQLITE_OK ){
+ const char *zIn;
+ struct stat buf;
+ pPath->zOut[pPath->nUsed] = 0;
+ zIn = pPath->zOut;
+ if( osLstat(zIn, &buf)!=0 ){
+ if( errno!=ENOENT ){
+ pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn);
}
-
- /* If this is a "/.." directory component then back out the
- ** previous term of the directory if it is something other than "..".
- */
- if( zOut[i+1]=='.'
- && zOut[i+2]=='.'
- && zOut[i+3]=='/'
- && unixBackupDir(zOut, &j)
- ){
- i += 2;
- continue;
+ }else if( S_ISLNK(buf.st_mode) ){
+ ssize_t got;
+ char zLnk[SQLITE_MAX_PATHLEN+2];
+ if( pPath->nSymlink++ > SQLITE_MAX_SYMLINK ){
+ pPath->rc = SQLITE_CANTOPEN_BKPT;
+ return;
+ }
+ got = osReadlink(zIn, zLnk, sizeof(zLnk)-2);
+ if( got<=0 || got>=(ssize_t)sizeof(zLnk)-2 ){
+ pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn);
+ return;
}
+ zLnk[got] = 0;
+ if( zLnk[0]=='/' ){
+ pPath->nUsed = 0;
+ }else{
+ pPath->nUsed -= nName + 1;
+ }
+ appendAllPathElements(pPath, zLnk);
}
- if( ALWAYS(j>=0) ) zOut[j] = zOut[i];
- j++;
}
- if( NEVER(j==0) ) zOut[j++] = '/';
- zOut[j] = 0;
- return SQLITE_OK;
+#endif
+}
+
+/*
+** Append all path elements in zPath to the DbPath under construction.
+*/
+static void appendAllPathElements(
+ DbPath *pPath, /* Path under construction, to which to append zName */
+ const char *zPath /* Path to append to pPath. Is zero-terminated */
+){
+ int i = 0;
+ int j = 0;
+ do{
+ while( zPath[i] && zPath[i]!='/' ){ i++; }
+ if( i>j ){
+ appendOnePathElement(pPath, &zPath[j], i-j);
+ }
+ j = i+1;
+ }while( zPath[i++] );
}
/*
@@ -40547,86 +43751,27 @@ static int unixFullPathname(
int nOut, /* Size of output buffer in bytes */
char *zOut /* Output buffer */
){
-#if !defined(HAVE_READLINK) || !defined(HAVE_LSTAT)
- return mkFullPathname(zPath, zOut, nOut);
-#else
- int rc = SQLITE_OK;
- int nByte;
- int nLink = 0; /* Number of symbolic links followed so far */
- const char *zIn = zPath; /* Input path for each iteration of loop */
- char *zDel = 0;
-
- assert( pVfs->mxPathname==MAX_PATHNAME );
+ DbPath path;
UNUSED_PARAMETER(pVfs);
-
- /* It's odd to simulate an io-error here, but really this is just
- ** using the io-error infrastructure to test that SQLite handles this
- ** function failing. This function could fail if, for example, the
- ** current working directory has been unlinked.
- */
- SimulateIOError( return SQLITE_ERROR );
-
- do {
-
- /* Call stat() on path zIn. Set bLink to true if the path is a symbolic
- ** link, or false otherwise. */
- int bLink = 0;
- struct stat buf;
- if( osLstat(zIn, &buf)!=0 ){
- if( errno!=ENOENT ){
- rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn);
- }
- }else{
- bLink = S_ISLNK(buf.st_mode);
- }
-
- if( bLink ){
- nLink++;
- if( zDel==0 ){
- zDel = sqlite3_malloc(nOut);
- if( zDel==0 ) rc = SQLITE_NOMEM_BKPT;
- }else if( nLink>=SQLITE_MAX_SYMLINKS ){
- rc = SQLITE_CANTOPEN_BKPT;
- }
-
- if( rc==SQLITE_OK ){
- nByte = osReadlink(zIn, zDel, nOut-1);
- if( nByte<0 ){
- rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn);
- }else{
- if( zDel[0]!='/' ){
- int n;
- for(n = sqlite3Strlen30(zIn); n>0 && zIn[n-1]!='/'; n--);
- if( nByte+n+1>nOut ){
- rc = SQLITE_CANTOPEN_BKPT;
- }else{
- memmove(&zDel[n], zDel, nByte+1);
- memcpy(zDel, zIn, n);
- nByte += n;
- }
- }
- zDel[nByte] = '\0';
- }
- }
-
- zIn = zDel;
- }
-
- assert( rc!=SQLITE_OK || zIn!=zOut || zIn[0]=='/' );
- if( rc==SQLITE_OK && zIn!=zOut ){
- rc = mkFullPathname(zIn, zOut, nOut);
+ path.rc = 0;
+ path.nUsed = 0;
+ path.nSymlink = 0;
+ path.nOut = nOut;
+ path.zOut = zOut;
+ if( zPath[0]!='/' ){
+ char zPwd[SQLITE_MAX_PATHLEN+2];
+ if( osGetcwd(zPwd, sizeof(zPwd)-2)==0 ){
+ return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath);
}
- if( bLink==0 ) break;
- zIn = zOut;
- }while( rc==SQLITE_OK );
-
- sqlite3_free(zDel);
- if( rc==SQLITE_OK && nLink ) rc = SQLITE_OK_SYMLINK;
- return rc;
-#endif /* HAVE_READLINK && HAVE_LSTAT */
+ appendAllPathElements(&path, zPwd);
+ }
+ appendAllPathElements(&path, zPath);
+ zOut[path.nUsed] = 0;
+ if( path.rc || path.nUsed<2 ) return SQLITE_CANTOPEN_BKPT;
+ if( path.nSymlink ) return SQLITE_OK_SYMLINK;
+ return SQLITE_OK;
}
-
#ifndef SQLITE_OMIT_LOAD_EXTENSION
/*
** Interfaces for opening a shared library, finding entry points
@@ -40740,7 +43885,7 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){
** than the argument.
*/
static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){
-#if OS_VXWORKS
+#if OS_VXWORKS || _POSIX_C_SOURCE >= 199309L
struct timespec sp;
sp.tv_sec = microseconds / 1000000;
@@ -42122,8 +45267,16 @@ SQLITE_API int sqlite3_os_init(void){
/* Register all VFSes defined in the aVfs[] array */
for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){
+#ifdef SQLITE_DEFAULT_UNIX_VFS
+ sqlite3_vfs_register(&aVfs[i],
+ 0==strcmp(aVfs[i].zName,SQLITE_DEFAULT_UNIX_VFS));
+#else
sqlite3_vfs_register(&aVfs[i], i==0);
+#endif
}
+#ifdef SQLITE_OS_KV_OPTIONAL
+ sqlite3KvvfsInit();
+#endif
unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1);
#ifndef SQLITE_OMIT_WAL
@@ -42144,6 +45297,9 @@ SQLITE_API int sqlite3_os_init(void){
assert( UNIX_SHM_DMS==128 ); /* Byte offset of the deadman-switch */
#endif
+ /* Initialize temp file dir array. */
+ unixTempFileInit();
+
return SQLITE_OK;
}
@@ -42183,205 +45339,7 @@ SQLITE_API int sqlite3_os_end(void){
/*
** Include code that is common to all os_*.c files
*/
-/************** Include os_common.h in the middle of os_win.c ****************/
-/************** Begin file os_common.h ***************************************/
-/*
-** 2004 May 22
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This file contains macros and a little bit of code that is common to
-** all of the platform-specific files (os_*.c) and is #included into those
-** files.
-**
-** This file should be #included by the os_*.c files only. It is not a
-** general purpose header file.
-*/
-#ifndef _OS_COMMON_H_
-#define _OS_COMMON_H_
-
-/*
-** At least two bugs have slipped in because we changed the MEMORY_DEBUG
-** macro to SQLITE_DEBUG and some older makefiles have not yet made the
-** switch. The following code should catch this problem at compile-time.
-*/
-#ifdef MEMORY_DEBUG
-# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
-#endif
-
-/*
-** Macros for performance tracing. Normally turned off. Only works
-** on i486 hardware.
-*/
-#ifdef SQLITE_PERFORMANCE_TRACE
-
-/*
-** hwtime.h contains inline assembler code for implementing
-** high-performance timing routines.
-*/
-/************** Include hwtime.h in the middle of os_common.h ****************/
-/************** Begin file hwtime.h ******************************************/
-/*
-** 2008 May 27
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This file contains inline asm code for retrieving "high-performance"
-** counters for x86 and x86_64 class CPUs.
-*/
-#ifndef SQLITE_HWTIME_H
-#define SQLITE_HWTIME_H
-
-/*
-** The following routine only works on pentium-class (or newer) processors.
-** It uses the RDTSC opcode to read the cycle count value out of the
-** processor and returns that value. This can be used for high-res
-** profiling.
-*/
-#if !defined(__STRICT_ANSI__) && \
- (defined(__GNUC__) || defined(_MSC_VER)) && \
- (defined(i386) || defined(__i386__) || defined(_M_IX86))
-
- #if defined(__GNUC__)
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned int lo, hi;
- __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
- return (sqlite_uint64)hi << 32 | lo;
- }
-
- #elif defined(_MSC_VER)
-
- __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
- __asm {
- rdtsc
- ret ; return value at EDX:EAX
- }
- }
-
- #endif
-
-#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__))
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned long val;
- __asm__ __volatile__ ("rdtsc" : "=A" (val));
- return val;
- }
-
-#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__))
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned long long retval;
- unsigned long junk;
- __asm__ __volatile__ ("\n\
- 1: mftbu %1\n\
- mftb %L0\n\
- mftbu %0\n\
- cmpw %0,%1\n\
- bne 1b"
- : "=r" (retval), "=r" (junk));
- return retval;
- }
-
-#else
-
- /*
- ** asm() is needed for hardware timing support. Without asm(),
- ** disable the sqlite3Hwtime() routine.
- **
- ** sqlite3Hwtime() is only used for some obscure debugging
- ** and analysis configurations, not in any deliverable, so this
- ** should not be a great loss.
- */
-SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
-
-#endif
-
-#endif /* !defined(SQLITE_HWTIME_H) */
-
-/************** End of hwtime.h **********************************************/
-/************** Continuing where we left off in os_common.h ******************/
-
-static sqlite_uint64 g_start;
-static sqlite_uint64 g_elapsed;
-#define TIMER_START g_start=sqlite3Hwtime()
-#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
-#define TIMER_ELAPSED g_elapsed
-#else
-#define TIMER_START
-#define TIMER_END
-#define TIMER_ELAPSED ((sqlite_uint64)0)
-#endif
-
-/*
-** If we compile with the SQLITE_TEST macro set, then the following block
-** of code will give us the ability to simulate a disk I/O error. This
-** is used for testing the I/O recovery logic.
-*/
-#if defined(SQLITE_TEST)
-SQLITE_API extern int sqlite3_io_error_hit;
-SQLITE_API extern int sqlite3_io_error_hardhit;
-SQLITE_API extern int sqlite3_io_error_pending;
-SQLITE_API extern int sqlite3_io_error_persist;
-SQLITE_API extern int sqlite3_io_error_benign;
-SQLITE_API extern int sqlite3_diskfull_pending;
-SQLITE_API extern int sqlite3_diskfull;
-#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
-#define SimulateIOError(CODE) \
- if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
- || sqlite3_io_error_pending-- == 1 ) \
- { local_ioerr(); CODE; }
-static void local_ioerr(){
- IOTRACE(("IOERR\n"));
- sqlite3_io_error_hit++;
- if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
-}
-#define SimulateDiskfullError(CODE) \
- if( sqlite3_diskfull_pending ){ \
- if( sqlite3_diskfull_pending == 1 ){ \
- local_ioerr(); \
- sqlite3_diskfull = 1; \
- sqlite3_io_error_hit = 1; \
- CODE; \
- }else{ \
- sqlite3_diskfull_pending--; \
- } \
- }
-#else
-#define SimulateIOErrorBenign(X)
-#define SimulateIOError(A)
-#define SimulateDiskfullError(A)
-#endif /* defined(SQLITE_TEST) */
-
-/*
-** When testing, keep a count of the number of open files.
-*/
-#if defined(SQLITE_TEST)
-SQLITE_API extern int sqlite3_open_file_count;
-#define OpenCounter(X) sqlite3_open_file_count+=(X)
-#else
-#define OpenCounter(X)
-#endif /* defined(SQLITE_TEST) */
-
-#endif /* !defined(_OS_COMMON_H_) */
-
-/************** End of os_common.h *******************************************/
-/************** Continuing where we left off in os_win.c *********************/
+/* #include "os_common.h" */
/*
** Include the header file for the Windows VFS.
@@ -44281,10 +47239,12 @@ SQLITE_API int sqlite3_win32_set_directory8(
const char *zValue /* New value for directory being set or reset */
){
char **ppDirectory = 0;
+ int rc;
#ifndef SQLITE_OMIT_AUTOINIT
- int rc = sqlite3_initialize();
+ rc = sqlite3_initialize();
if( rc ) return rc;
#endif
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){
ppDirectory = &sqlite3_data_directory;
}else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){
@@ -44299,14 +47259,19 @@ SQLITE_API int sqlite3_win32_set_directory8(
if( zValue && zValue[0] ){
zCopy = sqlite3_mprintf("%s", zValue);
if ( zCopy==0 ){
- return SQLITE_NOMEM_BKPT;
+ rc = SQLITE_NOMEM_BKPT;
+ goto set_directory8_done;
}
}
sqlite3_free(*ppDirectory);
*ppDirectory = zCopy;
- return SQLITE_OK;
+ rc = SQLITE_OK;
+ }else{
+ rc = SQLITE_ERROR;
}
- return SQLITE_ERROR;
+set_directory8_done:
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
+ return rc;
}
/*
@@ -46433,10 +49398,14 @@ static int winShmLock(
winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */
winShm *p = pDbFd->pShm; /* The shared memory being locked */
winShm *pX; /* For looping over all siblings */
- winShmNode *pShmNode = p->pShmNode;
+ winShmNode *pShmNode;
int rc = SQLITE_OK; /* Result code */
u16 mask; /* Mask of locks to take or release */
+ if( p==0 ) return SQLITE_IOERR_SHMLOCK;
+ pShmNode = p->pShmNode;
+ if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK;
+
assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
assert( n>=1 );
assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
@@ -47077,6 +50046,19 @@ static int winMakeEndInDirSep(int nBuf, char *zBuf){
}
/*
+** If sqlite3_temp_directory is defined, take the mutex and return true.
+**
+** If sqlite3_temp_directory is NULL (undefined), omit the mutex and
+** return false.
+*/
+static int winTempDirDefined(void){
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
+ if( sqlite3_temp_directory!=0 ) return 1;
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
+ return 0;
+}
+
+/*
** Create a temporary file name and store the resulting pointer into pzBuf.
** The pointer returned in pzBuf must be freed via sqlite3_free().
*/
@@ -47112,20 +50094,23 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){
*/
nDir = nMax - (nPre + 15);
assert( nDir>0 );
- if( sqlite3_temp_directory ){
+ if( winTempDirDefined() ){
int nDirLen = sqlite3Strlen30(sqlite3_temp_directory);
if( nDirLen>0 ){
if( !winIsDirSep(sqlite3_temp_directory[nDirLen-1]) ){
nDirLen++;
}
if( nDirLen>nDir ){
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
sqlite3_free(zBuf);
OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n"));
return winLogError(SQLITE_ERROR, 0, "winGetTempname1", 0);
}
sqlite3_snprintf(nMax, zBuf, "%s", sqlite3_temp_directory);
}
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
}
+
#if defined(__CYGWIN__)
else{
static const char *azDirs[] = {
@@ -47533,7 +50518,7 @@ static int winOpen(
if( isReadWrite ){
int rc2, isRO = 0;
sqlite3BeginBenignMalloc();
- rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO);
sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
@@ -47550,7 +50535,7 @@ static int winOpen(
if( isReadWrite ){
int rc2, isRO = 0;
sqlite3BeginBenignMalloc();
- rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO);
sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
@@ -47570,7 +50555,7 @@ static int winOpen(
if( isReadWrite ){
int rc2, isRO = 0;
sqlite3BeginBenignMalloc();
- rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
+ rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO);
sqlite3EndBenignMalloc();
if( rc2==SQLITE_OK && isRO ) break;
}
@@ -47793,6 +50778,13 @@ static int winAccess(
OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n",
zFilename, flags, pResOut));
+ if( zFilename==0 ){
+ *pResOut = 0;
+ OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n",
+ zFilename, pResOut, *pResOut));
+ return SQLITE_OK;
+ }
+
zConverted = winConvertFromUtf8Filename(zFilename);
if( zConverted==0 ){
OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename));
@@ -47914,7 +50906,7 @@ static BOOL winIsVerbatimPathname(
** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname
** bytes in size.
*/
-static int winFullPathname(
+static int winFullPathnameNoMutex(
sqlite3_vfs *pVfs, /* Pointer to vfs object */
const char *zRelative, /* Possibly relative input path */
int nFull, /* Size of output buffer in bytes */
@@ -48093,6 +51085,20 @@ static int winFullPathname(
}
#endif
}
+static int winFullPathname(
+ sqlite3_vfs *pVfs, /* Pointer to vfs object */
+ const char *zRelative, /* Possibly relative input path */
+ int nFull, /* Size of output buffer in bytes */
+ char *zFull /* Output buffer */
+){
+ int rc;
+ MUTEX_LOGIC( sqlite3_mutex *pMutex; )
+ MUTEX_LOGIC( pMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR); )
+ sqlite3_mutex_enter(pMutex);
+ rc = winFullPathnameNoMutex(pVfs, zRelative, nFull, zFull);
+ sqlite3_mutex_leave(pMutex);
+ return rc;
+}
#ifndef SQLITE_OMIT_LOAD_EXTENSION
/*
@@ -48629,6 +51635,7 @@ static int memdbTruncate(sqlite3_file*, sqlite3_int64 size);
static int memdbSync(sqlite3_file*, int flags);
static int memdbFileSize(sqlite3_file*, sqlite3_int64 *pSize);
static int memdbLock(sqlite3_file*, int);
+static int memdbUnlock(sqlite3_file*, int);
/* static int memdbCheckReservedLock(sqlite3_file*, int *pResOut);// not used */
static int memdbFileControl(sqlite3_file*, int op, void *pArg);
/* static int memdbSectorSize(sqlite3_file*); // not used */
@@ -48687,7 +51694,7 @@ static const sqlite3_io_methods memdb_io_methods = {
memdbSync, /* xSync */
memdbFileSize, /* xFileSize */
memdbLock, /* xLock */
- memdbLock, /* xUnlock - same as xLock in this case */
+ memdbUnlock, /* xUnlock */
0, /* memdbCheckReservedLock, */ /* xCheckReservedLock */
memdbFileControl, /* xFileControl */
0, /* memdbSectorSize,*/ /* xSectorSize */
@@ -48792,7 +51799,7 @@ static int memdbRead(
*/
static int memdbEnlarge(MemStore *p, sqlite3_int64 newSz){
unsigned char *pNew;
- if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){
+ if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || NEVER(p->nMmap>0) ){
return SQLITE_FULL;
}
if( newSz>p->szMax ){
@@ -48851,8 +51858,9 @@ static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){
MemStore *p = ((MemFile*)pFile)->pStore;
int rc = SQLITE_OK;
memdbEnter(p);
- if( NEVER(size>p->sz) ){
- rc = SQLITE_FULL;
+ if( size>p->sz ){
+ /* This can only happen with a corrupt wal mode db */
+ rc = SQLITE_CORRUPT;
}else{
p->sz = size;
}
@@ -48887,39 +51895,81 @@ static int memdbLock(sqlite3_file *pFile, int eLock){
MemFile *pThis = (MemFile*)pFile;
MemStore *p = pThis->pStore;
int rc = SQLITE_OK;
- if( eLock==pThis->eLock ) return SQLITE_OK;
+ if( eLock<=pThis->eLock ) return SQLITE_OK;
memdbEnter(p);
- if( eLock>SQLITE_LOCK_SHARED ){
- if( p->mFlags & SQLITE_DESERIALIZE_READONLY ){
- rc = SQLITE_READONLY;
- }else if( pThis->eLock<=SQLITE_LOCK_SHARED ){
- if( p->nWrLock ){
- rc = SQLITE_BUSY;
- }else{
- p->nWrLock = 1;
+
+ assert( p->nWrLock==0 || p->nWrLock==1 );
+ assert( pThis->eLock<=SQLITE_LOCK_SHARED || p->nWrLock==1 );
+ assert( pThis->eLock==SQLITE_LOCK_NONE || p->nRdLock>=1 );
+
+ if( eLock>SQLITE_LOCK_SHARED && (p->mFlags & SQLITE_DESERIALIZE_READONLY) ){
+ rc = SQLITE_READONLY;
+ }else{
+ switch( eLock ){
+ case SQLITE_LOCK_SHARED: {
+ assert( pThis->eLock==SQLITE_LOCK_NONE );
+ if( p->nWrLock>0 ){
+ rc = SQLITE_BUSY;
+ }else{
+ p->nRdLock++;
+ }
+ break;
+ };
+
+ case SQLITE_LOCK_RESERVED:
+ case SQLITE_LOCK_PENDING: {
+ assert( pThis->eLock>=SQLITE_LOCK_SHARED );
+ if( ALWAYS(pThis->eLock==SQLITE_LOCK_SHARED) ){
+ if( p->nWrLock>0 ){
+ rc = SQLITE_BUSY;
+ }else{
+ p->nWrLock = 1;
+ }
+ }
+ break;
+ }
+
+ default: {
+ assert( eLock==SQLITE_LOCK_EXCLUSIVE );
+ assert( pThis->eLock>=SQLITE_LOCK_SHARED );
+ if( p->nRdLock>1 ){
+ rc = SQLITE_BUSY;
+ }else if( pThis->eLock==SQLITE_LOCK_SHARED ){
+ p->nWrLock = 1;
+ }
+ break;
}
}
- }else if( eLock==SQLITE_LOCK_SHARED ){
- if( pThis->eLock > SQLITE_LOCK_SHARED ){
- assert( p->nWrLock==1 );
- p->nWrLock = 0;
- }else if( p->nWrLock ){
- rc = SQLITE_BUSY;
- }else{
- p->nRdLock++;
+ }
+ if( rc==SQLITE_OK ) pThis->eLock = eLock;
+ memdbLeave(p);
+ return rc;
+}
+
+/*
+** Unlock an memdb-file.
+*/
+static int memdbUnlock(sqlite3_file *pFile, int eLock){
+ MemFile *pThis = (MemFile*)pFile;
+ MemStore *p = pThis->pStore;
+ if( eLock>=pThis->eLock ) return SQLITE_OK;
+ memdbEnter(p);
+
+ assert( eLock==SQLITE_LOCK_SHARED || eLock==SQLITE_LOCK_NONE );
+ if( eLock==SQLITE_LOCK_SHARED ){
+ if( ALWAYS(pThis->eLock>SQLITE_LOCK_SHARED) ){
+ p->nWrLock--;
}
}else{
- assert( eLock==SQLITE_LOCK_NONE );
if( pThis->eLock>SQLITE_LOCK_SHARED ){
- assert( p->nWrLock==1 );
- p->nWrLock = 0;
+ p->nWrLock--;
}
- assert( p->nRdLock>0 );
p->nRdLock--;
}
- if( rc==SQLITE_OK ) pThis->eLock = eLock;
+
+ pThis->eLock = eLock;
memdbLeave(p);
- return rc;
+ return SQLITE_OK;
}
#if 0
@@ -48991,7 +52041,7 @@ static int memdbFetch(
){
MemStore *p = ((MemFile*)pFile)->pStore;
memdbEnter(p);
- if( iOfst+iAmt>p->sz ){
+ if( iOfst+iAmt>p->sz || (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)!=0 ){
*pp = 0;
}else{
p->nMmap++;
@@ -49025,12 +52075,11 @@ static int memdbOpen(
MemFile *pFile = (MemFile*)pFd;
MemStore *p = 0;
int szName;
- if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
- return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFd, flags, pOutFlags);
- }
- memset(pFile, 0, sizeof(*p));
+ UNUSED_PARAMETER(pVfs);
+
+ memset(pFile, 0, sizeof(*pFile));
szName = sqlite3Strlen30(zName);
- if( szName>1 && zName[0]=='/' ){
+ if( szName>1 && (zName[0]=='/' || zName[0]=='\\') ){
int i;
#ifndef SQLITE_MUTEX_OMIT
sqlite3_mutex *pVfsMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1);
@@ -49087,8 +52136,9 @@ static int memdbOpen(
p->szMax = sqlite3GlobalConfig.mxMemdbSize;
}
pFile->pStore = p;
- assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */
- *pOutFlags = flags | SQLITE_OPEN_MEMORY;
+ if( pOutFlags!=0 ){
+ *pOutFlags = flags | SQLITE_OPEN_MEMORY;
+ }
pFd->pMethods = &memdb_io_methods;
memdbLeave(p);
return SQLITE_OK;
@@ -49329,7 +52379,8 @@ SQLITE_API int sqlite3_deserialize(
sqlite3_mutex_enter(db->mutex);
if( zSchema==0 ) zSchema = db->aDb[0].zDbSName;
iDb = sqlite3FindDbName(db, zSchema);
- if( iDb<0 ){
+ testcase( iDb==1 );
+ if( iDb<2 && iDb!=0 ){
rc = SQLITE_ERROR;
goto end_deserialize;
}
@@ -49376,6 +52427,13 @@ end_deserialize:
}
/*
+** Return true if the VFS is the memvfs.
+*/
+SQLITE_PRIVATE int sqlite3IsMemdb(const sqlite3_vfs *pVfs){
+ return pVfs==&memdb_vfs;
+}
+
+/*
** This routine is called when the extension is loaded.
** Register the new VFS.
*/
@@ -49752,7 +52810,7 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){
sqlite3BitvecClear(0, 1, pTmpSpace);
/* Run the program */
- pc = 0;
+ pc = i = 0;
while( (op = aOp[pc])!=0 ){
switch( op ){
case 1:
@@ -49854,7 +52912,7 @@ bitvec_end:
struct PCache {
PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */
PgHdr *pSynced; /* Last synced page in dirty page list */
- int nRefSum; /* Sum of ref counts over all pages */
+ i64 nRefSum; /* Sum of ref counts over all pages */
int szCache; /* Configured cache size */
int szSpill; /* Size before spilling occurs */
int szPage; /* Size of every page in this cache */
@@ -49879,12 +52937,24 @@ struct PCache {
int sqlite3PcacheTrace = 2; /* 0: off 1: simple 2: cache dumps */
int sqlite3PcacheMxDump = 9999; /* Max cache entries for pcacheDump() */
# define pcacheTrace(X) if(sqlite3PcacheTrace){sqlite3DebugPrintf X;}
- void pcacheDump(PCache *pCache){
- int N;
- int i, j;
- sqlite3_pcache_page *pLower;
+ static void pcachePageTrace(int i, sqlite3_pcache_page *pLower){
PgHdr *pPg;
unsigned char *a;
+ int j;
+ if( pLower==0 ){
+ printf("%3d: NULL\n", i);
+ }else{
+ pPg = (PgHdr*)pLower->pExtra;
+ printf("%3d: nRef %2lld flgs %02x data ", i, pPg->nRef, pPg->flags);
+ a = (unsigned char *)pLower->pBuf;
+ for(j=0; j<12; j++) printf("%02x", a[j]);
+ printf(" ptr %p\n", pPg);
+ }
+ }
+ static void pcacheDump(PCache *pCache){
+ int N;
+ int i;
+ sqlite3_pcache_page *pLower;
if( sqlite3PcacheTrace<2 ) return;
if( pCache->pCache==0 ) return;
@@ -49892,23 +52962,33 @@ struct PCache {
if( N>sqlite3PcacheMxDump ) N = sqlite3PcacheMxDump;
for(i=1; i<=N; i++){
pLower = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, i, 0);
- if( pLower==0 ) continue;
- pPg = (PgHdr*)pLower->pExtra;
- printf("%3d: nRef %2d flgs %02x data ", i, pPg->nRef, pPg->flags);
- a = (unsigned char *)pLower->pBuf;
- for(j=0; j<12; j++) printf("%02x", a[j]);
- printf("\n");
- if( pPg->pPage==0 ){
+ pcachePageTrace(i, pLower);
+ if( pLower && ((PgHdr*)pLower)->pPage==0 ){
sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, pLower, 0);
}
}
}
- #else
+#else
# define pcacheTrace(X)
+# define pcachePageTrace(PGNO, X)
# define pcacheDump(X)
#endif
/*
+** Return 1 if pPg is on the dirty list for pCache. Return 0 if not.
+** This routine runs inside of assert() statements only.
+*/
+#ifdef SQLITE_DEBUG
+static int pageOnDirtyList(PCache *pCache, PgHdr *pPg){
+ PgHdr *p;
+ for(p=pCache->pDirty; p; p=p->pDirtyNext){
+ if( p==pPg ) return 1;
+ }
+ return 0;
+}
+#endif
+
+/*
** Check invariants on a PgHdr entry. Return true if everything is OK.
** Return false if any invariant is violated.
**
@@ -49926,8 +53006,13 @@ SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){
assert( pCache!=0 ); /* Every page has an associated PCache */
if( pPg->flags & PGHDR_CLEAN ){
assert( (pPg->flags & PGHDR_DIRTY)==0 );/* Cannot be both CLEAN and DIRTY */
- assert( pCache->pDirty!=pPg ); /* CLEAN pages not on dirty list */
- assert( pCache->pDirtyTail!=pPg );
+ assert( !pageOnDirtyList(pCache, pPg) );/* CLEAN pages not on dirty list */
+ }else{
+ assert( (pPg->flags & PGHDR_DIRTY)!=0 );/* If not CLEAN must be DIRTY */
+ assert( pPg->pDirtyNext==0 || pPg->pDirtyNext->pDirtyPrev==pPg );
+ assert( pPg->pDirtyPrev==0 || pPg->pDirtyPrev->pDirtyNext==pPg );
+ assert( pPg->pDirtyPrev!=0 || pCache->pDirty==pPg );
+ assert( pageOnDirtyList(pCache, pPg) );
}
/* WRITEABLE pages must also be DIRTY */
if( pPg->flags & PGHDR_WRITEABLE ){
@@ -50056,11 +53141,14 @@ static int numberOfCachePages(PCache *p){
** suggested cache size is set to N. */
return p->szCache;
}else{
+ i64 n;
/* IMPLEMANTATION-OF: R-59858-46238 If the argument N is negative, then the
** number of cache pages is adjusted to be a number of pages that would
** use approximately abs(N*1024) bytes of memory based on the current
** page size. */
- return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra));
+ n = ((-1024*(i64)p->szCache)/(p->szPage+p->szExtra));
+ if( n>1000000000 ) n = 1000000000;
+ return (int)n;
}
}
@@ -50198,8 +53286,9 @@ SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch(
assert( createFlag==0 || pCache->eCreate==eCreate );
assert( createFlag==0 || eCreate==1+(!pCache->bPurgeable||!pCache->pDirty) );
pRes = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate);
- pcacheTrace(("%p.FETCH %d%s (result: %p)\n",pCache,pgno,
+ pcacheTrace(("%p.FETCH %d%s (result: %p) ",pCache,pgno,
createFlag?" create":"",pRes));
+ pcachePageTrace(pgno, pRes);
return pRes;
}
@@ -50327,6 +53416,7 @@ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){
pcacheUnpin(p);
}else{
pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT);
+ assert( sqlite3PcachePageSanity(p) );
}
}
}
@@ -50370,6 +53460,7 @@ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
pcacheTrace(("%p.DIRTY %d\n",p->pCache,p->pgno));
assert( (p->flags & (PGHDR_DIRTY|PGHDR_CLEAN))==PGHDR_DIRTY );
pcacheManageDirtyList(p, PCACHE_DIRTYLIST_ADD);
+ assert( sqlite3PcachePageSanity(p) );
}
assert( sqlite3PcachePageSanity(p) );
}
@@ -50432,14 +53523,24 @@ SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){
*/
SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){
PCache *pCache = p->pCache;
+ sqlite3_pcache_page *pOther;
assert( p->nRef>0 );
assert( newPgno>0 );
assert( sqlite3PcachePageSanity(p) );
pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno));
+ pOther = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, newPgno, 0);
+ if( pOther ){
+ PgHdr *pXPage = (PgHdr*)pOther->pExtra;
+ assert( pXPage->nRef==0 );
+ pXPage->nRef++;
+ pCache->nRefSum++;
+ sqlite3PcacheDrop(pXPage);
+ }
sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno);
p->pgno = newPgno;
if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){
pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT);
+ assert( sqlite3PcachePageSanity(p) );
}
}
@@ -50588,14 +53689,14 @@ SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache *pCache){
** This is not the total number of pages referenced, but the sum of the
** reference count for all pages.
*/
-SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache *pCache){
+SQLITE_PRIVATE i64 sqlite3PcacheRefCount(PCache *pCache){
return pCache->nRefSum;
}
/*
** Return the number of references to the page supplied as an argument.
*/
-SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr *p){
+SQLITE_PRIVATE i64 sqlite3PcachePageRefcount(PgHdr *p){
return p->nRef;
}
@@ -50737,12 +53838,13 @@ SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHd
** size can vary according to architecture, compile-time options, and
** SQLite library version number.
**
-** If SQLITE_PCACHE_SEPARATE_HEADER is defined, then the extension is obtained
-** using a separate memory allocation from the database page content. This
-** seeks to overcome the "clownshoe" problem (also called "internal
-** fragmentation" in academic literature) of allocating a few bytes more
-** than a power of two with the memory allocator rounding up to the next
-** power of two, and leaving the rounded-up space unused.
+** Historical note: It used to be that if the SQLITE_PCACHE_SEPARATE_HEADER
+** was defined, then the page content would be held in a separate memory
+** allocation from the PgHdr1. This was intended to avoid clownshoe memory
+** allocations. However, the btree layer needs a small (16-byte) overrun
+** area after the page content buffer. The header serves as that overrun
+** area. Therefore SQLITE_PCACHE_SEPARATE_HEADER was discontinued to avoid
+** any possibility of a memory error.
**
** This module tracks pointers to PgHdr1 objects. Only pcache.c communicates
** with this module. Information is passed back and forth as PgHdr1 pointers.
@@ -50787,30 +53889,40 @@ typedef struct PGroup PGroup;
/*
** Each cache entry is represented by an instance of the following
-** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of
-** PgHdr1.pCache->szPage bytes is allocated directly before this structure
-** in memory.
+** structure. A buffer of PgHdr1.pCache->szPage bytes is allocated
+** directly before this structure and is used to cache the page content.
+**
+** When reading a corrupt database file, it is possible that SQLite might
+** read a few bytes (no more than 16 bytes) past the end of the page buffer.
+** It will only read past the end of the page buffer, never write. This
+** object is positioned immediately after the page buffer to serve as an
+** overrun area, so that overreads are harmless.
**
-** Note: Variables isBulkLocal and isAnchor were once type "u8". That works,
+** Variables isBulkLocal and isAnchor were once type "u8". That works,
** but causes a 2-byte gap in the structure for most architectures (since
** pointers must be either 4 or 8-byte aligned). As this structure is located
** in memory directly after the associated page data, if the database is
** corrupt, code at the b-tree layer may overread the page buffer and
** read part of this structure before the corruption is detected. This
** can cause a valgrind error if the unitialized gap is accessed. Using u16
-** ensures there is no such gap, and therefore no bytes of unitialized memory
-** in the structure.
+** ensures there is no such gap, and therefore no bytes of uninitialized
+** memory in the structure.
+**
+** The pLruNext and pLruPrev pointers form a double-linked circular list
+** of all pages that are unpinned. The PGroup.lru element (which should be
+** the only element on the list with PgHdr1.isAnchor set to 1) forms the
+** beginning and the end of the list.
*/
struct PgHdr1 {
- sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */
- unsigned int iKey; /* Key value (page number) */
- u16 isBulkLocal; /* This page from bulk local storage */
- u16 isAnchor; /* This is the PGroup.lru element */
- PgHdr1 *pNext; /* Next in hash table chain */
- PCache1 *pCache; /* Cache that currently owns this page */
- PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */
- PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */
- /* NB: pLruPrev is only valid if pLruNext!=0 */
+ sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */
+ unsigned int iKey; /* Key value (page number) */
+ u16 isBulkLocal; /* This page from bulk local storage */
+ u16 isAnchor; /* This is the PGroup.lru element */
+ PgHdr1 *pNext; /* Next in hash table chain */
+ PCache1 *pCache; /* Cache that currently owns this page */
+ PgHdr1 *pLruNext; /* Next in circular LRU list of unpinned pages */
+ PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */
+ /* NB: pLruPrev is only valid if pLruNext!=0 */
};
/*
@@ -51136,25 +54248,13 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){
pcache1LeaveMutex(pCache->pGroup);
#endif
if( benignMalloc ){ sqlite3BeginBenignMalloc(); }
-#ifdef SQLITE_PCACHE_SEPARATE_HEADER
- pPg = pcache1Alloc(pCache->szPage);
- p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra);
- if( !pPg || !p ){
- pcache1Free(pPg);
- sqlite3_free(p);
- pPg = 0;
- }
-#else
pPg = pcache1Alloc(pCache->szAlloc);
-#endif
if( benignMalloc ){ sqlite3EndBenignMalloc(); }
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
pcache1EnterMutex(pCache->pGroup);
#endif
if( pPg==0 ) return 0;
-#ifndef SQLITE_PCACHE_SEPARATE_HEADER
p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage];
-#endif
p->page.pBuf = pPg;
p->page.pExtra = &p[1];
p->isBulkLocal = 0;
@@ -51178,9 +54278,6 @@ static void pcache1FreePage(PgHdr1 *p){
pCache->pFree = p;
}else{
pcache1Free(p->page.pBuf);
-#ifdef SQLITE_PCACHE_SEPARATE_HEADER
- sqlite3_free(p);
-#endif
}
(*pCache->pnPurgeable)--;
}
@@ -51515,12 +54612,18 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){
*/
static void pcache1Cachesize(sqlite3_pcache *p, int nMax){
PCache1 *pCache = (PCache1 *)p;
+ u32 n;
+ assert( nMax>=0 );
if( pCache->bPurgeable ){
PGroup *pGroup = pCache->pGroup;
pcache1EnterMutex(pGroup);
- pGroup->nMaxPage += (nMax - pCache->nMax);
+ n = (u32)nMax;
+ if( n > 0x7fff0000 - pGroup->nMaxPage + pCache->nMax ){
+ n = 0x7fff0000 - pGroup->nMaxPage + pCache->nMax;
+ }
+ pGroup->nMaxPage += (n - pCache->nMax);
pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage;
- pCache->nMax = nMax;
+ pCache->nMax = n;
pCache->n90pct = pCache->nMax*9/10;
pcache1EnforceMaxPage(pCache);
pcache1LeaveMutex(pGroup);
@@ -51536,7 +54639,7 @@ static void pcache1Shrink(sqlite3_pcache *p){
PCache1 *pCache = (PCache1*)p;
if( pCache->bPurgeable ){
PGroup *pGroup = pCache->pGroup;
- int savedMaxPage;
+ unsigned int savedMaxPage;
pcache1EnterMutex(pGroup);
savedMaxPage = pGroup->nMaxPage;
pGroup->nMaxPage = 0;
@@ -51815,23 +54918,26 @@ static void pcache1Rekey(
PCache1 *pCache = (PCache1 *)p;
PgHdr1 *pPage = (PgHdr1 *)pPg;
PgHdr1 **pp;
- unsigned int h;
+ unsigned int hOld, hNew;
assert( pPage->iKey==iOld );
assert( pPage->pCache==pCache );
+ assert( iOld!=iNew ); /* The page number really is changing */
pcache1EnterMutex(pCache->pGroup);
- h = iOld%pCache->nHash;
- pp = &pCache->apHash[h];
+ assert( pcache1FetchNoMutex(p, iOld, 0)==pPage ); /* pPg really is iOld */
+ hOld = iOld%pCache->nHash;
+ pp = &pCache->apHash[hOld];
while( (*pp)!=pPage ){
pp = &(*pp)->pNext;
}
*pp = pPage->pNext;
- h = iNew%pCache->nHash;
+ assert( pcache1FetchNoMutex(p, iNew, 0)==0 ); /* iNew not in cache */
+ hNew = iNew%pCache->nHash;
pPage->iKey = iNew;
- pPage->pNext = pCache->apHash[h];
- pCache->apHash[h] = pPage;
+ pPage->pNext = pCache->apHash[hNew];
+ pCache->apHash[hNew] = pPage;
if( iNew>pCache->iMaxKey ){
pCache->iMaxKey = iNew;
}
@@ -51938,9 +55044,6 @@ SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){
&& p->isAnchor==0
){
nFree += pcache1MemSize(p->page.pBuf);
-#ifdef SQLITE_PCACHE_SEPARATE_HEADER
- nFree += sqlite3MemSize(p);
-#endif
assert( PAGE_IS_UNPINNED(p) );
pcache1PinPage(p);
pcache1RemoveFromHash(p, 1);
@@ -53273,6 +56376,7 @@ struct Pager {
u8 noLock; /* Do not lock (except in WAL mode) */
u8 readOnly; /* True for a read-only database */
u8 memDb; /* True to inhibit all file I/O */
+ u8 memVfs; /* VFS-implemented memory database */
/**************************************************************************
** The following block contains those class members that change during
@@ -53322,8 +56426,9 @@ struct Pager {
i16 nReserve; /* Number of unused bytes at end of each page */
u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */
u32 sectorSize; /* Assumed sector size during rollback */
- int pageSize; /* Number of bytes in a page */
Pgno mxPgno; /* Maximum allowed size of the database */
+ Pgno lckPgno; /* Page number for the locking page */
+ i64 pageSize; /* Number of bytes in a page */
i64 journalSizeLimit; /* Size limit for persistent journal files */
char *zFilename; /* Name of the database file */
char *zJournal; /* Name of the journal file */
@@ -54309,7 +57414,7 @@ static int readJournalHdr(
** journal file descriptor is advanced to the next sector boundary before
** anything is written. The format is:
**
-** + 4 bytes: PAGER_MJ_PGNO.
+** + 4 bytes: PAGER_SJ_PGNO.
** + N bytes: super-journal filename in utf-8.
** + 4 bytes: N (length of super-journal name in bytes, no nul-terminator).
** + 4 bytes: super-journal name checksum.
@@ -54357,7 +57462,7 @@ static int writeSuperJournal(Pager *pPager, const char *zSuper){
/* Write the super-journal data to the end of the journal file. If
** an error occurs, return the error code to the caller.
*/
- if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_MJ_PGNO(pPager))))
+ if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_SJ_PGNO(pPager))))
|| (0 != (rc = sqlite3OsWrite(pPager->jfd, zSuper, nSuper, iHdrOff+4)))
|| (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper, nSuper)))
|| (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper+4, cksum)))
@@ -54867,7 +57972,7 @@ static u32 pager_cksum(Pager *pPager, const u8 *aData){
** corrupted, SQLITE_DONE is returned. Data is considered corrupted in
** two circumstances:
**
-** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or
+** * If the record page-number is illegal (0 or PAGER_SJ_PGNO), or
** * If the record is being rolled back from the main journal file
** and the checksum field does not match the record content.
**
@@ -54927,7 +58032,7 @@ static int pager_playback_one_page(
** it could cause invalid data to be written into the journal. We need to
** detect this invalid data (with high probability) and ignore it.
*/
- if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){
+ if( pgno==0 || pgno==PAGER_SJ_PGNO(pPager) ){
assert( !isSavepnt );
return SQLITE_DONE;
}
@@ -55246,6 +58351,8 @@ static int pager_truncate(Pager *pPager, Pgno nPage){
int rc = SQLITE_OK;
assert( pPager->eState!=PAGER_ERROR );
assert( pPager->eState!=PAGER_READER );
+ PAGERTRACE(("Truncate %d npage %u\n", PAGERID(pPager), nPage));
+
if( isOpen(pPager->fd)
&& (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
@@ -55264,6 +58371,7 @@ static int pager_truncate(Pager *pPager, Pgno nPage){
memset(pTmp, 0, szPage);
testcase( (newSize-szPage) == currentSize );
testcase( (newSize-szPage) > currentSize );
+ sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &newSize);
rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage);
}
if( rc==SQLITE_OK ){
@@ -55486,6 +58594,9 @@ static int pager_playback(Pager *pPager, int isHot){
goto end_playback;
}
pPager->dbSize = mxPg;
+ if( pPager->mxPgno<mxPg ){
+ pPager->mxPgno = mxPg;
+ }
}
/* Copy original pages out of the journal and back into the
@@ -55572,7 +58683,7 @@ end_playback:
** see if it is possible to delete the super-journal.
*/
assert( zSuper==&pPager->pTmpSpace[4] );
- memset(&zSuper[-4], 0, 4);
+ memset(pPager->pTmpSpace, 0, 4);
rc = pager_delsuper(pPager, zSuper);
testcase( rc!=SQLITE_OK );
}
@@ -55667,6 +58778,7 @@ static int readDbPage(PgHdr *pPg){
*/
static void pager_write_changecounter(PgHdr *pPg){
u32 change_counter;
+ if( NEVER(pPg==0) ) return;
/* Increment the value just read and write it back to byte 24. */
change_counter = sqlite3Get4byte((u8*)pPg->pPager->dbFileVers)+1;
@@ -56192,7 +59304,6 @@ SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){
** Numeric values associated with these states are OFF==1, NORMAL=2,
** and FULL=3.
*/
-#ifndef SQLITE_OMIT_PAGER_PRAGMAS
SQLITE_PRIVATE void sqlite3PagerSetFlags(
Pager *pPager, /* The pager to set safety level for */
unsigned pgFlags /* Various flags */
@@ -56227,7 +59338,6 @@ SQLITE_PRIVATE void sqlite3PagerSetFlags(
pPager->doNotSpill |= SPILLFLAG_OFF;
}
}
-#endif
/*
** The following global variable is incremented whenever the library
@@ -56381,6 +59491,7 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR
pPager->pTmpSpace = pNew;
pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize);
pPager->pageSize = pageSize;
+ pPager->lckPgno = (Pgno)(PENDING_BYTE/pageSize) + 1;
}else{
sqlite3PageFree(pNew);
}
@@ -56541,8 +59652,7 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){
** current database image, in pages, OR
**
** b) if the page content were written at this time, it would not
-** be necessary to write the current content out to the sub-journal
-** (as determined by function subjRequiresPage()).
+** be necessary to write the current content out to the sub-journal.
**
** If the condition asserted by this function were not true, and the
** dirty page were to be discarded from the cache via the pagerStress()
@@ -56557,8 +59667,16 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){
*/
#if defined(SQLITE_DEBUG)
static void assertTruncateConstraintCb(PgHdr *pPg){
+ Pager *pPager = pPg->pPager;
assert( pPg->flags&PGHDR_DIRTY );
- assert( !subjRequiresPage(pPg) || pPg->pgno<=pPg->pPager->dbSize );
+ if( pPg->pgno>pPager->dbSize ){ /* if (a) is false */
+ Pgno pgno = pPg->pgno;
+ int i;
+ for(i=0; i<pPg->pPager->nSavepoint; i++){
+ PagerSavepoint *p = &pPager->aSavepoint[i];
+ assert( p->nOrig<pgno || sqlite3BitvecTestNotNull(p->pInSavepoint,pgno) );
+ }
+ }
}
static void assertTruncateConstraint(Pager *pPager){
sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb);
@@ -56580,7 +59698,6 @@ static void assertTruncateConstraint(Pager *pPager){
*/
SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){
assert( pPager->dbSize>=nPage || CORRUPT_DB );
- testcase( pPager->dbSize<nPage );
assert( pPager->eState>=PAGER_WRITER_CACHEMOD );
pPager->dbSize = nPage;
@@ -57322,7 +60439,6 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */
const char *zUri = 0; /* URI args to copy */
int nUriByte = 1; /* Number of bytes of URI args at *zUri */
- int nUri = 0; /* Number of URI parameters */
/* Figure out how much space is required for each journal file-handle
** (there are two of them, the main journal and the sub-journal). */
@@ -57370,7 +60486,6 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
while( *z ){
z += strlen(z)+1;
z += strlen(z)+1;
- nUri++;
}
nUriByte = (int)(&z[1] - zUri);
assert( nUriByte>=1 );
@@ -57501,6 +60616,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
pPager->zWal = 0;
}
#endif
+ (void)pPtr; /* Suppress warning about unused pPtr value */
if( nPathname ) sqlite3DbFree(0, zPathname);
pPager->pVfs = pVfs;
@@ -57513,7 +60629,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout);
assert( !memDb );
#ifndef SQLITE_OMIT_DESERIALIZE
- memJM = (fout&SQLITE_OPEN_MEMORY)!=0;
+ pPager->memVfs = memJM = (fout&SQLITE_OPEN_MEMORY)!=0;
#endif
readOnly = (fout&SQLITE_OPEN_READONLY)!=0;
@@ -57625,18 +60741,7 @@ act_like_temp_file:
pPager->memDb = (u8)memDb;
pPager->readOnly = (u8)readOnly;
assert( useJournal || pPager->tempFile );
- pPager->noSync = pPager->tempFile;
- if( pPager->noSync ){
- assert( pPager->fullSync==0 );
- assert( pPager->extraSync==0 );
- assert( pPager->syncFlags==0 );
- assert( pPager->walSyncFlags==0 );
- }else{
- pPager->fullSync = 1;
- pPager->extraSync = 0;
- pPager->syncFlags = SQLITE_SYNC_NORMAL;
- pPager->walSyncFlags = SQLITE_SYNC_NORMAL | (SQLITE_SYNC_NORMAL<<2);
- }
+ sqlite3PagerSetFlags(pPager, (SQLITE_DEFAULT_SYNCHRONOUS+1)|PAGER_CACHESPILL);
/* pPager->pFirst = 0; */
/* pPager->pFirstSynced = 0; */
/* pPager->pLast = 0; */
@@ -57898,7 +61003,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
** may mean that the pager was in the error-state when this
** function was called and the journal file does not exist.
*/
- if( !isOpen(pPager->jfd) ){
+ if( !isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
sqlite3_vfs * const pVfs = pPager->pVfs;
int bExists; /* True if journal file exists */
rc = sqlite3OsAccess(
@@ -58143,7 +61248,7 @@ static int getPageNormal(
if( pPg->pPager && !noContent ){
/* In this case the pcache already contains an initialized copy of
** the page. Return without further ado. */
- assert( pgno!=PAGER_MJ_PGNO(pPager) );
+ assert( pgno!=PAGER_SJ_PGNO(pPager) );
pPager->aStat[PAGER_STAT_HIT]++;
return SQLITE_OK;
@@ -58154,7 +61259,7 @@ static int getPageNormal(
** (*) obsolete. Was: maximum page number is 2^31
** (2) Never try to fetch the locking page
*/
- if( pgno==PAGER_MJ_PGNO(pPager) ){
+ if( pgno==PAGER_SJ_PGNO(pPager) ){
rc = SQLITE_CORRUPT_BKPT;
goto pager_acquire_err;
}
@@ -58165,6 +61270,10 @@ static int getPageNormal(
if( !isOpen(pPager->fd) || pPager->dbSize<pgno || noContent ){
if( pgno>pPager->mxPgno ){
rc = SQLITE_FULL;
+ if( pgno<=pPager->dbSize ){
+ sqlite3PcacheRelease(pPg);
+ pPg = 0;
+ }
goto pager_acquire_err;
}
if( noContent ){
@@ -58300,6 +61409,7 @@ SQLITE_PRIVATE int sqlite3PagerGet(
DbPage **ppPage, /* Write a pointer to the page here */
int flags /* PAGER_GET_XXX flags */
){
+ /* printf("PAGE %u\n", pgno); fflush(stdout); */
return pPager->xGet(pPager, pgno, ppPage, flags);
}
@@ -58328,10 +61438,12 @@ SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){
/*
** Release a page reference.
**
-** The sqlite3PagerUnref() and sqlite3PagerUnrefNotNull() may only be
-** used if we know that the page being released is not the last page.
+** The sqlite3PagerUnref() and sqlite3PagerUnrefNotNull() may only be used
+** if we know that the page being released is not the last reference to page1.
** The btree layer always holds page1 open until the end, so these first
-** to routines can be used to release any page other than BtShared.pPage1.
+** two routines can be used to release any page other than BtShared.pPage1.
+** The assert() at tag-20230419-2 proves that this constraint is always
+** honored.
**
** Use sqlite3PagerUnrefPageOne() to release page1. This latter routine
** checks the total number of outstanding pages and if the number of
@@ -58347,7 +61459,7 @@ SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage *pPg){
sqlite3PcacheRelease(pPg);
}
/* Do not use this routine to release the last reference to page1 */
- assert( sqlite3PcacheRefCount(pPager->pPCache)>0 );
+ assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); /* tag-20230419-2 */
}
SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){
if( pPg ) sqlite3PagerUnrefNotNull(pPg);
@@ -58413,6 +61525,7 @@ static int pager_open_journal(Pager *pPager){
if( pPager->tempFile ){
flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL);
+ flags |= SQLITE_OPEN_EXCLUSIVE;
nSpill = sqlite3Config.nStmtSpill;
}else{
flags |= SQLITE_OPEN_MAIN_JOURNAL;
@@ -58448,6 +61561,7 @@ static int pager_open_journal(Pager *pPager){
if( rc!=SQLITE_OK ){
sqlite3BitvecDestroy(pPager->pInJournal);
pPager->pInJournal = 0;
+ pPager->journalOff = 0;
}else{
assert( pPager->eState==PAGER_WRITER_LOCKED );
pPager->eState = PAGER_WRITER_CACHEMOD;
@@ -58552,7 +61666,7 @@ static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){
/* We should never write to the journal file the page that
** contains the database locks. The following assert verifies
** that we do not. */
- assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) );
+ assert( pPg->pgno!=PAGER_SJ_PGNO(pPager) );
assert( pPager->journalHdr<=pPager->journalOff );
pData2 = pPg->pData;
@@ -58731,7 +61845,7 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){
Pgno pg = pg1+ii;
PgHdr *pPage;
if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){
- if( pg!=PAGER_MJ_PGNO(pPager) ){
+ if( pg!=PAGER_SJ_PGNO(pPager) ){
rc = sqlite3PagerGet(pPager, pg, &pPage, 0);
if( rc==SQLITE_OK ){
rc = pager_write(pPage);
@@ -58894,7 +62008,7 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){
# define DIRECT_MODE isDirectMode
#endif
- if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){
+ if( !pPager->changeCountDone && pPager->dbSize>0 ){
PgHdr *pPgHdr; /* Reference to page 1 */
assert( !pPager->tempFile && isOpen(pPager->fd) );
@@ -59209,7 +62323,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
** last page is never written out to disk, leaving the database file
** undersized. Fix this now if it is the case. */
if( pPager->dbSize>pPager->dbFileSize ){
- Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager));
+ Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_SJ_PGNO(pPager));
assert( pPager->eState==PAGER_WRITER_DBMOD );
rc = pager_truncate(pPager, nNew);
if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
@@ -59380,8 +62494,8 @@ SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){
** used by the pager and its associated cache.
*/
SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager *pPager){
- int perPageSize = pPager->pageSize + pPager->nExtra + sizeof(PgHdr)
- + 5*sizeof(void*);
+ int perPageSize = pPager->pageSize + pPager->nExtra
+ + (int)(sizeof(PgHdr) + 5*sizeof(void*));
return perPageSize*sqlite3PcachePagecount(pPager->pPCache)
+ sqlite3MallocSize(pPager)
+ pPager->pageSize;
@@ -59450,7 +62564,7 @@ SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, i
** Return true if this is an in-memory or temp-file backed pager.
*/
SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){
- return pPager->tempFile;
+ return pPager->tempFile || pPager->memVfs;
}
/*
@@ -59575,14 +62689,14 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){
}
pPager->nSavepoint = nNew;
- /* If this is a release of the outermost savepoint, truncate
- ** the sub-journal to zero bytes in size. */
+ /* Truncate the sub-journal so that it only includes the parts
+ ** that are still in use. */
if( op==SAVEPOINT_RELEASE ){
PagerSavepoint *pRel = &pPager->aSavepoint[nNew];
if( pRel->bTruncateOnRelease && isOpen(pPager->sjfd) ){
/* Only truncate if it is an in-memory sub-journal. */
if( sqlite3JournalIsInMemory(pPager->sjfd) ){
- i64 sz = (pPager->pageSize+4)*pRel->iSubRec;
+ i64 sz = (pPager->pageSize+4)*(i64)pRel->iSubRec;
rc = sqlite3OsTruncate(pPager->sjfd, sz);
assert( rc==SQLITE_OK );
}
@@ -59634,7 +62748,11 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){
*/
SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){
static const char zFake[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
- return (nullIfMemDb && pPager->memDb) ? &zFake[4] : pPager->zFilename;
+ if( nullIfMemDb && (pPager->memDb || sqlite3IsMemdb(pPager->pVfs)) ){
+ return &zFake[4];
+ }else{
+ return pPager->zFilename;
+ }
}
/*
@@ -59770,7 +62888,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i
pPgOld = sqlite3PagerLookup(pPager, pgno);
assert( !pPgOld || pPgOld->nRef==1 || CORRUPT_DB );
if( pPgOld ){
- if( pPgOld->nRef>1 ){
+ if( NEVER(pPgOld->nRef>1) ){
sqlite3PagerUnrefNotNull(pPgOld);
return SQLITE_CORRUPT_BKPT;
}
@@ -59905,12 +63023,12 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
u8 eOld = pPager->journalMode; /* Prior journalmode */
/* The eMode parameter is always valid */
- assert( eMode==PAGER_JOURNALMODE_DELETE
- || eMode==PAGER_JOURNALMODE_TRUNCATE
- || eMode==PAGER_JOURNALMODE_PERSIST
- || eMode==PAGER_JOURNALMODE_OFF
- || eMode==PAGER_JOURNALMODE_WAL
- || eMode==PAGER_JOURNALMODE_MEMORY );
+ assert( eMode==PAGER_JOURNALMODE_DELETE /* 0 */
+ || eMode==PAGER_JOURNALMODE_PERSIST /* 1 */
+ || eMode==PAGER_JOURNALMODE_OFF /* 2 */
+ || eMode==PAGER_JOURNALMODE_TRUNCATE /* 3 */
+ || eMode==PAGER_JOURNALMODE_MEMORY /* 4 */
+ || eMode==PAGER_JOURNALMODE_WAL /* 5 */ );
/* This routine is only called from the OP_JournalMode opcode, and
** the logic there will never allow a temporary file to be changed
@@ -59947,7 +63065,6 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
assert( isOpen(pPager->fd) || pPager->exclusiveMode );
if( !pPager->exclusiveMode && (eOld & 5)==1 && (eMode & 1)==0 ){
-
/* In this case we would like to delete the journal file. If it is
** not possible, then that is not a problem. Deleting the journal file
** here is an optimization only.
@@ -60059,6 +63176,18 @@ SQLITE_PRIVATE int sqlite3PagerCheckpoint(
int *pnCkpt /* OUT: Final number of checkpointed frames */
){
int rc = SQLITE_OK;
+ if( pPager->pWal==0 && pPager->journalMode==PAGER_JOURNALMODE_WAL ){
+ /* This only happens when a database file is zero bytes in size opened and
+ ** then "PRAGMA journal_mode=WAL" is run and then sqlite3_wal_checkpoint()
+ ** is invoked without any intervening transactions. We need to start
+ ** a transaction to initialize pWal. The PRAGMA table_list statement is
+ ** used for this since it starts transactions on every database file,
+ ** including all ATTACHed databases. This seems expensive for a single
+ ** sqlite3_wal_checkpoint() call, but it happens very rarely.
+ ** https://sqlite.org/forum/forumpost/fd0f19d229156939
+ */
+ sqlite3_exec(db, "PRAGMA table_list",0,0,0);
+ }
if( pPager->pWal ){
rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode,
(eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler),
@@ -60090,13 +63219,15 @@ SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){
*/
static int pagerExclusiveLock(Pager *pPager){
int rc; /* Return code */
+ u8 eOrigLock; /* Original lock */
- assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK );
+ assert( pPager->eLock>=SHARED_LOCK );
+ eOrigLock = pPager->eLock;
rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
if( rc!=SQLITE_OK ){
/* If the attempt to grab the exclusive lock failed, release the
** pending lock that may have been obtained instead. */
- pagerUnlockDb(pPager, SHARED_LOCK);
+ pagerUnlockDb(pPager, eOrigLock);
}
return rc;
@@ -60516,7 +63647,10 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){
** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and
** HASHTABLE_NPAGE are selected so that together the wal-index header and
** first index block are the same size as all other index blocks in the
-** wal-index.
+** wal-index. The values are:
+**
+** HASHTABLE_NPAGE 4096
+** HASHTABLE_NPAGE_ONE 4062
**
** Each index block contains two sections, a page-mapping that contains the
** database page number associated with each wal frame, and a hash-table
@@ -60752,6 +63886,70 @@ struct WalCkptInfo {
};
#define READMARK_NOT_USED 0xffffffff
+/*
+** This is a schematic view of the complete 136-byte header of the
+** wal-index file (also known as the -shm file):
+**
+** +-----------------------------+
+** 0: | iVersion | \
+** +-----------------------------+ |
+** 4: | (unused padding) | |
+** +-----------------------------+ |
+** 8: | iChange | |
+** +-------+-------+-------------+ |
+** 12: | bInit | bBig | szPage | |
+** +-------+-------+-------------+ |
+** 16: | mxFrame | | First copy of the
+** +-----------------------------+ | WalIndexHdr object
+** 20: | nPage | |
+** +-----------------------------+ |
+** 24: | aFrameCksum | |
+** | | |
+** +-----------------------------+ |
+** 32: | aSalt | |
+** | | |
+** +-----------------------------+ |
+** 40: | aCksum | |
+** | | /
+** +-----------------------------+
+** 48: | iVersion | \
+** +-----------------------------+ |
+** 52: | (unused padding) | |
+** +-----------------------------+ |
+** 56: | iChange | |
+** +-------+-------+-------------+ |
+** 60: | bInit | bBig | szPage | |
+** +-------+-------+-------------+ | Second copy of the
+** 64: | mxFrame | | WalIndexHdr
+** +-----------------------------+ |
+** 68: | nPage | |
+** +-----------------------------+ |
+** 72: | aFrameCksum | |
+** | | |
+** +-----------------------------+ |
+** 80: | aSalt | |
+** | | |
+** +-----------------------------+ |
+** 88: | aCksum | |
+** | | /
+** +-----------------------------+
+** 96: | nBackfill |
+** +-----------------------------+
+** 100: | 5 read marks |
+** | |
+** | |
+** | |
+** | |
+** +-------+-------+------+------+
+** 120: | Write | Ckpt | Rcvr | Rd0 | \
+** +-------+-------+------+------+ ) 8 lock bytes
+** | Read1 | Read2 | Rd3 | Rd4 | /
+** +-------+-------+------+------+
+** 128: | nBackfillAttempted |
+** +-----------------------------+
+** 132: | (unused padding) |
+** +-----------------------------+
+*/
/* A block of WALINDEX_LOCK_RESERVED bytes beginning at
** WALINDEX_LOCK_OFFSET is reserved for locks. Since some systems
@@ -60908,9 +64106,13 @@ struct WalIterator {
** so. It is safe to enlarge the wal-index if pWal->writeLock is true
** or pWal->exclusiveMode==WAL_HEAPMEMORY_MODE.
**
-** If this call is successful, *ppPage is set to point to the wal-index
-** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs,
-** then an SQLite error code is returned and *ppPage is set to 0.
+** Three possible result scenarios:
+**
+** (1) rc==SQLITE_OK and *ppPage==Requested-Wal-Index-Page
+** (2) rc>=SQLITE_ERROR and *ppPage==NULL
+** (3) rc==SQLITE_OK and *ppPage==NULL // only if iPage==0
+**
+** Scenario (3) can only occur when pWal->writeLock is false and iPage==0
*/
static SQLITE_NOINLINE int walIndexPageRealloc(
Wal *pWal, /* The WAL context */
@@ -60943,7 +64145,9 @@ static SQLITE_NOINLINE int walIndexPageRealloc(
rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ,
pWal->writeLock, (void volatile **)&pWal->apWiData[iPage]
);
- assert( pWal->apWiData[iPage]!=0 || rc!=SQLITE_OK || pWal->writeLock==0 );
+ assert( pWal->apWiData[iPage]!=0
+ || rc!=SQLITE_OK
+ || (pWal->writeLock==0 && iPage==0) );
testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK );
if( rc==SQLITE_OK ){
if( iPage>0 && sqlite3FaultSim(600) ) rc = SQLITE_NOMEM;
@@ -61028,19 +64232,40 @@ static void walChecksumBytes(
assert( nByte>=8 );
assert( (nByte&0x00000007)==0 );
assert( nByte<=65536 );
+ assert( nByte%4==0 );
- if( nativeCksum ){
+ if( !nativeCksum ){
do {
+ s1 += BYTESWAP32(aData[0]) + s2;
+ s2 += BYTESWAP32(aData[1]) + s1;
+ aData += 2;
+ }while( aData<aEnd );
+ }else if( nByte%64==0 ){
+ do {
+ s1 += *aData++ + s2;
+ s2 += *aData++ + s1;
+ s1 += *aData++ + s2;
+ s2 += *aData++ + s1;
+ s1 += *aData++ + s2;
+ s2 += *aData++ + s1;
+ s1 += *aData++ + s2;
+ s2 += *aData++ + s1;
+ s1 += *aData++ + s2;
+ s2 += *aData++ + s1;
+ s1 += *aData++ + s2;
+ s2 += *aData++ + s1;
+ s1 += *aData++ + s2;
+ s2 += *aData++ + s1;
s1 += *aData++ + s2;
s2 += *aData++ + s1;
}while( aData<aEnd );
}else{
do {
- s1 += BYTESWAP32(aData[0]) + s2;
- s2 += BYTESWAP32(aData[1]) + s1;
- aData += 2;
+ s1 += *aData++ + s2;
+ s2 += *aData++ + s1;
}while( aData<aEnd );
}
+ assert( aData==aEnd );
aOut[0] = s1;
aOut[1] = s2;
@@ -61282,8 +64507,8 @@ struct WalHashLoc {
** slot in the hash table is set to N, it refers to frame number
** (pLoc->iZero+N) in the log.
**
-** Finally, set pLoc->aPgno so that pLoc->aPgno[1] is the page number of the
-** first frame indexed by the hash table, frame (pLoc->iZero+1).
+** Finally, set pLoc->aPgno so that pLoc->aPgno[0] is the page number of the
+** first frame indexed by the hash table, frame (pLoc->iZero).
*/
static int walHashGet(
Wal *pWal, /* WAL handle */
@@ -61295,7 +64520,7 @@ static int walHashGet(
rc = walIndexPage(pWal, iHash, &pLoc->aPgno);
assert( rc==SQLITE_OK || iHash>0 );
- if( rc==SQLITE_OK ){
+ if( pLoc->aPgno ){
pLoc->aHash = (volatile ht_slot *)&pLoc->aPgno[HASHTABLE_NPAGE];
if( iHash==0 ){
pLoc->aPgno = &pLoc->aPgno[WALINDEX_HDR_SIZE/sizeof(u32)];
@@ -61303,7 +64528,8 @@ static int walHashGet(
}else{
pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE;
}
- pLoc->aPgno = &pLoc->aPgno[-1];
+ }else if( NEVER(rc==SQLITE_OK) ){
+ rc = SQLITE_ERROR;
}
return rc;
}
@@ -61385,8 +64611,9 @@ static void walCleanupHash(Wal *pWal){
/* Zero the entries in the aPgno array that correspond to frames with
** frame numbers greater than pWal->hdr.mxFrame.
*/
- nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit+1]);
- memset((void *)&sLoc.aPgno[iLimit+1], 0, nByte);
+ nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit]);
+ assert( nByte>=0 );
+ memset((void *)&sLoc.aPgno[iLimit], 0, nByte);
#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
/* Verify that the every entry in the mapping region is still reachable
@@ -61395,11 +64622,11 @@ static void walCleanupHash(Wal *pWal){
if( iLimit ){
int j; /* Loop counter */
int iKey; /* Hash key */
- for(j=1; j<=iLimit; j++){
+ for(j=0; j<iLimit; j++){
for(iKey=walHash(sLoc.aPgno[j]);sLoc.aHash[iKey];iKey=walNextHash(iKey)){
- if( sLoc.aHash[iKey]==j ) break;
+ if( sLoc.aHash[iKey]==j+1 ) break;
}
- assert( sLoc.aHash[iKey]==j );
+ assert( sLoc.aHash[iKey]==j+1 );
}
}
#endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
@@ -61431,9 +64658,9 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
** entire hash table and aPgno[] array before proceeding.
*/
if( idx==1 ){
- int nByte = (int)((u8 *)&sLoc.aHash[HASHTABLE_NSLOT]
- - (u8 *)&sLoc.aPgno[1]);
- memset((void*)&sLoc.aPgno[1], 0, nByte);
+ int nByte = (int)((u8*)&sLoc.aHash[HASHTABLE_NSLOT] - (u8*)sLoc.aPgno);
+ assert( nByte>=0 );
+ memset((void*)sLoc.aPgno, 0, nByte);
}
/* If the entry in aPgno[] is already set, then the previous writer
@@ -61442,9 +64669,9 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
** Remove the remnants of that writers uncommitted transaction from
** the hash-table before writing any new entries.
*/
- if( sLoc.aPgno[idx] ){
+ if( sLoc.aPgno[idx-1] ){
walCleanupHash(pWal);
- assert( !sLoc.aPgno[idx] );
+ assert( !sLoc.aPgno[idx-1] );
}
/* Write the aPgno[] array entry and the hash-table slot. */
@@ -61452,7 +64679,7 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
for(iKey=walHash(iPage); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){
if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT;
}
- sLoc.aPgno[idx] = iPage;
+ sLoc.aPgno[idx-1] = iPage;
AtomicStore(&sLoc.aHash[iKey], (ht_slot)idx);
#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
@@ -61473,19 +64700,18 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
*/
if( (idx&0x3ff)==0 ){
int i; /* Loop counter */
- for(i=1; i<=idx; i++){
+ for(i=0; i<idx; i++){
for(iKey=walHash(sLoc.aPgno[i]);
sLoc.aHash[iKey];
iKey=walNextHash(iKey)){
- if( sLoc.aHash[iKey]==i ) break;
+ if( sLoc.aHash[iKey]==i+1 ) break;
}
- assert( sLoc.aHash[iKey]==i );
+ assert( sLoc.aHash[iKey]==i+1 );
}
}
#endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
}
-
return rc;
}
@@ -61606,7 +64832,8 @@ static int walIndexRecover(Wal *pWal){
u32 iFirst = 1 + (iPg==0?0:HASHTABLE_NPAGE_ONE+(iPg-1)*HASHTABLE_NPAGE);
u32 nHdr, nHdr32;
rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare);
- if( rc ) break;
+ assert( aShare!=0 || rc!=SQLITE_OK );
+ if( aShare==0 ) break;
pWal->apWiData[iPg] = aPrivate;
for(iFrame=iFirst; iFrame<=iLast; iFrame++){
@@ -61765,14 +64992,43 @@ SQLITE_PRIVATE int sqlite3WalOpen(
assert( zWalName && zWalName[0] );
assert( pDbFd );
+ /* Verify the values of various constants. Any changes to the values
+ ** of these constants would result in an incompatible on-disk format
+ ** for the -shm file. Any change that causes one of these asserts to
+ ** fail is a backward compatibility problem, even if the change otherwise
+ ** works.
+ **
+ ** This table also serves as a helpful cross-reference when trying to
+ ** interpret hex dumps of the -shm file.
+ */
+ assert( 48 == sizeof(WalIndexHdr) );
+ assert( 40 == sizeof(WalCkptInfo) );
+ assert( 120 == WALINDEX_LOCK_OFFSET );
+ assert( 136 == WALINDEX_HDR_SIZE );
+ assert( 4096 == HASHTABLE_NPAGE );
+ assert( 4062 == HASHTABLE_NPAGE_ONE );
+ assert( 8192 == HASHTABLE_NSLOT );
+ assert( 383 == HASHTABLE_HASH_1 );
+ assert( 32768 == WALINDEX_PGSZ );
+ assert( 8 == SQLITE_SHM_NLOCK );
+ assert( 5 == WAL_NREADER );
+ assert( 24 == WAL_FRAME_HDRSIZE );
+ assert( 32 == WAL_HDRSIZE );
+ assert( 120 == WALINDEX_LOCK_OFFSET + WAL_WRITE_LOCK );
+ assert( 121 == WALINDEX_LOCK_OFFSET + WAL_CKPT_LOCK );
+ assert( 122 == WALINDEX_LOCK_OFFSET + WAL_RECOVER_LOCK );
+ assert( 123 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(0) );
+ assert( 124 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(1) );
+ assert( 125 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(2) );
+ assert( 126 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(3) );
+ assert( 127 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(4) );
+
/* In the amalgamation, the os_unix.c and os_win.c source files come before
** this source file. Verify that the #defines of the locking byte offsets
** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value.
** For that matter, if the lock offset ever changes from its initial design
** value of 120, we need to know that so there is an assert() to check it.
*/
- assert( 120==WALINDEX_LOCK_OFFSET );
- assert( 136==WALINDEX_HDR_SIZE );
#ifdef WIN_SHM_BASE
assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET );
#endif
@@ -62074,7 +65330,6 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){
int nEntry; /* Number of entries in this segment */
ht_slot *aIndex; /* Sorted index for this segment */
- sLoc.aPgno++;
if( (i+1)==nSegment ){
nEntry = (int)(iLast - sLoc.iZero);
}else{
@@ -62855,7 +66110,9 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){
}
/* Allocate a buffer to read frames into */
- szFrame = pWal->hdr.szPage + WAL_FRAME_HDRSIZE;
+ assert( (pWal->szPage & (pWal->szPage-1))==0 );
+ assert( pWal->szPage>=512 && pWal->szPage<=65536 );
+ szFrame = pWal->szPage + WAL_FRAME_HDRSIZE;
aFrame = (u8 *)sqlite3_malloc64(szFrame);
if( aFrame==0 ){
rc = SQLITE_NOMEM_BKPT;
@@ -62869,7 +66126,7 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){
** the caller. */
aSaveCksum[0] = pWal->hdr.aFrameCksum[0];
aSaveCksum[1] = pWal->hdr.aFrameCksum[1];
- for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->hdr.szPage);
+ for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->szPage);
iOffset+szFrame<=szWal;
iOffset+=szFrame
){
@@ -63213,7 +66470,8 @@ SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){
rc = walHashGet(pWal, walFramePage(i), &sLoc);
if( rc!=SQLITE_OK ) break;
- pgno = sLoc.aPgno[i-sLoc.iZero];
+ assert( i - sLoc.iZero - 1 >=0 );
+ pgno = sLoc.aPgno[i-sLoc.iZero-1];
iDbOff = (i64)(pgno-1) * szPage;
if( iDbOff+szPage<=szDb ){
@@ -63446,7 +66704,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame(
iKey = walHash(pgno);
while( (iH = AtomicLoad(&sLoc.aHash[iKey]))!=0 ){
u32 iFrame = iH + sLoc.iZero;
- if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH]==pgno ){
+ if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH-1]==pgno ){
assert( iFrame>iRead || CORRUPT_DB );
iRead = iFrame;
}
@@ -63938,7 +67196,9 @@ SQLITE_PRIVATE int sqlite3WalFrames(
if( rc ) return rc;
}
}
- assert( (int)pWal->szPage==szPage );
+ if( (int)pWal->szPage!=szPage ){
+ return SQLITE_CORRUPT_BKPT; /* TH3 test case: cov1/corrupt155.test */
+ }
/* Setup information needed to write frames into the WAL */
w.pWal = pWal;
@@ -64598,7 +67858,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){
** byte are used. The integer consists of all bytes that have bit 8 set and
** the first byte with bit 8 clear. The most significant byte of the integer
** appears first. A variable-length integer may not be more than 9 bytes long.
-** As a special case, all 8 bytes of the 9th byte are used as data. This
+** As a special case, all 8 bits of the 9th byte are used as data. This
** allows a 64-bit integer to be encoded in 9 bytes.
**
** 0x00 becomes 0x00000000
@@ -64698,7 +67958,6 @@ typedef struct CellInfo CellInfo;
*/
struct MemPage {
u8 isInit; /* True if previously initialized. MUST BE FIRST! */
- u8 bBusy; /* Prevent endless loops on corrupt database files */
u8 intKey; /* True if table b-trees. False for index b-trees */
u8 intKeyLeaf; /* True if the leaf of an intKey table */
Pgno pgno; /* Page number for this page */
@@ -64720,7 +67979,9 @@ struct MemPage {
u8 *apOvfl[4]; /* Pointers to the body of overflow cells */
BtShared *pBt; /* Pointer to BtShared that this page is part of */
u8 *aData; /* Pointer to disk image of the page data */
- u8 *aDataEnd; /* One byte past the end of usable data */
+ u8 *aDataEnd; /* One byte past the end of the entire page - not just
+ ** the usable space, the entire page. Used to prevent
+ ** corruption-induced buffer overflow. */
u8 *aCellIdx; /* The cell index area */
u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */
DbPage *pDbPage; /* Pager page handle */
@@ -64981,7 +68242,7 @@ struct BtCursor {
#define BTCF_WriteFlag 0x01 /* True if a write cursor */
#define BTCF_ValidNKey 0x02 /* True if info.nKey is valid */
#define BTCF_ValidOvfl 0x04 /* True if aOverflow is valid */
-#define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */
+#define BTCF_AtLast 0x08 /* Cursor is pointing to the last entry */
#define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */
#define BTCF_Multiple 0x20 /* Maybe another cursor on the same btree */
#define BTCF_Pinned 0x40 /* Cursor is busy and cannot be moved */
@@ -65025,7 +68286,7 @@ struct BtCursor {
/*
** The database page the PENDING_BYTE occupies. This page is never used.
*/
-# define PENDING_BYTE_PAGE(pBt) PAGER_MJ_PGNO(pBt)
+#define PENDING_BYTE_PAGE(pBt) ((Pgno)((PENDING_BYTE/((pBt)->pageSize))+1))
/*
** These macros define the location of the pointer-map entry for a
@@ -65099,15 +68360,15 @@ struct BtCursor {
** So, this macro is defined instead.
*/
#ifndef SQLITE_OMIT_AUTOVACUUM
-#define ISAUTOVACUUM (pBt->autoVacuum)
+#define ISAUTOVACUUM(pBt) (pBt->autoVacuum)
#else
-#define ISAUTOVACUUM 0
+#define ISAUTOVACUUM(pBt) 0
#endif
/*
-** This structure is passed around through all the sanity checking routines
-** in order to keep track of some global state information.
+** This structure is passed around through all the PRAGMA integrity_check
+** checking routines in order to keep track of some global state information.
**
** The aRef[] array is allocated so that there is 1 bit for each page in
** the database. As the integrity-check proceeds, for each page used in
@@ -65123,10 +68384,12 @@ struct IntegrityCk {
Pgno nPage; /* Number of pages in the database */
int mxErr; /* Stop accumulating errors when this reaches zero */
int nErr; /* Number of messages written to zErrMsg so far */
- int bOomFault; /* A memory allocation error has occurred */
+ int rc; /* SQLITE_OK, SQLITE_NOMEM, or SQLITE_INTERRUPT */
+ u32 nStep; /* Number of steps into the integrity_check process */
const char *zPfx; /* Error message prefix */
- Pgno v1; /* Value for first %u substitution in zPfx */
- int v2; /* Value for second %d substitution in zPfx */
+ Pgno v0; /* Value for first %u substitution in zPfx (root page) */
+ Pgno v1; /* Value for second %u substitution in zPfx (current pg) */
+ int v2; /* Value for third %d substitution in zPfx */
StrAccum errMsg; /* Accumulate the error message text here */
u32 *heap; /* Min-heap used for analyzing cell coverage */
sqlite3 *db; /* Database connection running the check */
@@ -65393,6 +68656,7 @@ SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){
SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){
Btree *p;
assert( db!=0 );
+ if( db->pVfs==0 && db->nDb==0 ) return 1;
if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema);
assert( iDb>=0 && iDb<db->nDb );
if( !sqlite3_mutex_held(db->mutex) ) return 0;
@@ -65588,8 +68852,8 @@ SQLITE_PRIVATE sqlite3_uint64 sqlite3BtreeSeekCount(Btree *pBt){
int corruptPageError(int lineno, MemPage *p){
char *zMsg;
sqlite3BeginBenignMalloc();
- zMsg = sqlite3_mprintf("database corruption page %d of %s",
- (int)p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0)
+ zMsg = sqlite3_mprintf("database corruption page %u of %s",
+ p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0)
);
sqlite3EndBenignMalloc();
if( zMsg ){
@@ -65666,7 +68930,7 @@ static int hasSharedCacheTableLock(
int bSeen = 0;
for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){
Index *pIdx = (Index *)sqliteHashData(p);
- if( pIdx->tnum==(int)iRoot ){
+ if( pIdx->tnum==iRoot ){
if( bSeen ){
/* Two or more indexes share the same root page. There must
** be imposter tables. So just return true. The assert is not
@@ -66259,7 +69523,7 @@ SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){
/*
** In this version of BtreeMoveto, pKey is a packed index record
** such as is generated by the OP_MakeRecord opcode. Unpack the
-** record and then call BtreeMovetoUnpacked() to do the work.
+** record and then call sqlite3BtreeIndexMoveto() to do the work.
*/
static int btreeMoveto(
BtCursor *pCur, /* Cursor open on the btree to be searched */
@@ -66279,15 +69543,13 @@ static int btreeMoveto(
sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey);
if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){
rc = SQLITE_CORRUPT_BKPT;
- goto moveto_done;
+ }else{
+ rc = sqlite3BtreeIndexMoveto(pCur, pIdxKey, pRes);
}
+ sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey);
}else{
pIdxKey = 0;
- }
- rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes);
-moveto_done:
- if( pIdxKey ){
- sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey);
+ rc = sqlite3BtreeTableMoveto(pCur, nKey, bias, pRes);
}
return rc;
}
@@ -66400,8 +69662,25 @@ SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow)
*/
SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor *pCur, int eHintType, ...){
/* Used only by system that substitute their own storage engine */
+#ifdef SQLITE_DEBUG
+ if( ALWAYS(eHintType==BTREE_HINT_RANGE) ){
+ va_list ap;
+ Expr *pExpr;
+ Walker w;
+ memset(&w, 0, sizeof(w));
+ w.xExprCallback = sqlite3CursorRangeHintExprCheck;
+ va_start(ap, eHintType);
+ pExpr = va_arg(ap, Expr*);
+ w.u.aMem = va_arg(ap, Mem*);
+ va_end(ap);
+ assert( pExpr!=0 );
+ assert( w.u.aMem!=0 );
+ sqlite3WalkExpr(&w, pExpr);
+ }
+#endif /* SQLITE_DEBUG */
}
-#endif
+#endif /* SQLITE_ENABLE_CURSOR_HINTS */
+
/*
** Provide flag hints to the cursor.
@@ -66486,7 +69765,7 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){
pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage);
if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){
- TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent));
+ TRACE(("PTRMAP_UPDATE: %u->(%u,%u)\n", key, eType, parent));
*pRC= rc = sqlite3PagerWrite(pDbPage);
if( rc==SQLITE_OK ){
pPtrmap[offset] = eType;
@@ -66679,19 +69958,37 @@ static void btreeParseCellPtr(
**
** pIter += getVarint(pIter, (u64*)&pInfo->nKey);
**
- ** The code is inlined to avoid a function call.
+ ** The code is inlined and the loop is unrolled for performance.
+ ** This routine is a high-runner.
*/
iKey = *pIter;
if( iKey>=0x80 ){
- u8 *pEnd = &pIter[7];
- iKey &= 0x7f;
- while(1){
- iKey = (iKey<<7) | (*++pIter & 0x7f);
- if( (*pIter)<0x80 ) break;
- if( pIter>=pEnd ){
- iKey = (iKey<<8) | *++pIter;
- break;
+ u8 x;
+ iKey = (iKey<<7) ^ (x = *++pIter);
+ if( x>=0x80 ){
+ iKey = (iKey<<7) ^ (x = *++pIter);
+ if( x>=0x80 ){
+ iKey = (iKey<<7) ^ 0x10204000 ^ (x = *++pIter);
+ if( x>=0x80 ){
+ iKey = (iKey<<7) ^ 0x4000 ^ (x = *++pIter);
+ if( x>=0x80 ){
+ iKey = (iKey<<7) ^ 0x4000 ^ (x = *++pIter);
+ if( x>=0x80 ){
+ iKey = (iKey<<7) ^ 0x4000 ^ (x = *++pIter);
+ if( x>=0x80 ){
+ iKey = (iKey<<7) ^ 0x4000 ^ (x = *++pIter);
+ if( x>=0x80 ){
+ iKey = (iKey<<8) ^ 0x8000 ^ (*++pIter);
+ }
+ }
+ }
+ }
+ }
+ }else{
+ iKey ^= 0x204000;
}
+ }else{
+ iKey ^= 0x4000;
}
}
pIter++;
@@ -66700,7 +69997,7 @@ static void btreeParseCellPtr(
pInfo->nPayload = nPayload;
pInfo->pPayload = pIter;
testcase( nPayload==pPage->maxLocal );
- testcase( nPayload==pPage->maxLocal+1 );
+ testcase( nPayload==(u32)pPage->maxLocal+1 );
if( nPayload<=pPage->maxLocal ){
/* This is the (easy) common case where the entire payload fits
** on the local page. No overflow is required.
@@ -66737,7 +70034,7 @@ static void btreeParseCellPtrIndex(
pInfo->nPayload = nPayload;
pInfo->pPayload = pIter;
testcase( nPayload==pPage->maxLocal );
- testcase( nPayload==pPage->maxLocal+1 );
+ testcase( nPayload==(u32)pPage->maxLocal+1 );
if( nPayload<=pPage->maxLocal ){
/* This is the (easy) common case where the entire payload fits
** on the local page. No overflow is required.
@@ -66767,10 +70064,12 @@ static void btreeParseCell(
** the space used by the cell pointer.
**
** cellSizePtrNoPayload() => table internal nodes
-** cellSizePtr() => all index nodes & table leaf nodes
+** cellSizePtrTableLeaf() => table leaf nodes
+** cellSizePtr() => index internal nodes
+** cellSizeIdxLeaf() => index leaf nodes
*/
static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
- u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */
+ u8 *pIter = pCell + 4; /* For looping over bytes of pCell */
u8 *pEnd; /* End mark for a varint */
u32 nSize; /* Size value to return */
@@ -66783,6 +70082,7 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
pPage->xParseCell(pPage, pCell, &debuginfo);
#endif
+ assert( pPage->childPtrSize==4 );
nSize = *pIter;
if( nSize>=0x80 ){
pEnd = &pIter[8];
@@ -66792,15 +70092,50 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
}while( *(pIter)>=0x80 && pIter<pEnd );
}
pIter++;
- if( pPage->intKey ){
- /* pIter now points at the 64-bit integer key value, a variable length
- ** integer. The following block moves pIter to point at the first byte
- ** past the end of the key value. */
- pEnd = &pIter[9];
- while( (*pIter++)&0x80 && pIter<pEnd );
+ testcase( nSize==pPage->maxLocal );
+ testcase( nSize==(u32)pPage->maxLocal+1 );
+ if( nSize<=pPage->maxLocal ){
+ nSize += (u32)(pIter - pCell);
+ assert( nSize>4 );
+ }else{
+ int minLocal = pPage->minLocal;
+ nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
+ testcase( nSize==pPage->maxLocal );
+ testcase( nSize==(u32)pPage->maxLocal+1 );
+ if( nSize>pPage->maxLocal ){
+ nSize = minLocal;
+ }
+ nSize += 4 + (u16)(pIter - pCell);
+ }
+ assert( nSize==debuginfo.nSize || CORRUPT_DB );
+ return (u16)nSize;
+}
+static u16 cellSizePtrIdxLeaf(MemPage *pPage, u8 *pCell){
+ u8 *pIter = pCell; /* For looping over bytes of pCell */
+ u8 *pEnd; /* End mark for a varint */
+ u32 nSize; /* Size value to return */
+
+#ifdef SQLITE_DEBUG
+ /* The value returned by this function should always be the same as
+ ** the (CellInfo.nSize) value found by doing a full parse of the
+ ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of
+ ** this function verifies that this invariant is not violated. */
+ CellInfo debuginfo;
+ pPage->xParseCell(pPage, pCell, &debuginfo);
+#endif
+
+ assert( pPage->childPtrSize==0 );
+ nSize = *pIter;
+ if( nSize>=0x80 ){
+ pEnd = &pIter[8];
+ nSize &= 0x7f;
+ do{
+ nSize = (nSize<<7) | (*++pIter & 0x7f);
+ }while( *(pIter)>=0x80 && pIter<pEnd );
}
+ pIter++;
testcase( nSize==pPage->maxLocal );
- testcase( nSize==pPage->maxLocal+1 );
+ testcase( nSize==(u32)pPage->maxLocal+1 );
if( nSize<=pPage->maxLocal ){
nSize += (u32)(pIter - pCell);
if( nSize<4 ) nSize = 4;
@@ -66808,7 +70143,7 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
int minLocal = pPage->minLocal;
nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
testcase( nSize==pPage->maxLocal );
- testcase( nSize==pPage->maxLocal+1 );
+ testcase( nSize==(u32)pPage->maxLocal+1 );
if( nSize>pPage->maxLocal ){
nSize = minLocal;
}
@@ -66838,6 +70173,58 @@ static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){
assert( debuginfo.nSize==(u16)(pIter - pCell) || CORRUPT_DB );
return (u16)(pIter - pCell);
}
+static u16 cellSizePtrTableLeaf(MemPage *pPage, u8 *pCell){
+ u8 *pIter = pCell; /* For looping over bytes of pCell */
+ u8 *pEnd; /* End mark for a varint */
+ u32 nSize; /* Size value to return */
+
+#ifdef SQLITE_DEBUG
+ /* The value returned by this function should always be the same as
+ ** the (CellInfo.nSize) value found by doing a full parse of the
+ ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of
+ ** this function verifies that this invariant is not violated. */
+ CellInfo debuginfo;
+ pPage->xParseCell(pPage, pCell, &debuginfo);
+#endif
+
+ nSize = *pIter;
+ if( nSize>=0x80 ){
+ pEnd = &pIter[8];
+ nSize &= 0x7f;
+ do{
+ nSize = (nSize<<7) | (*++pIter & 0x7f);
+ }while( *(pIter)>=0x80 && pIter<pEnd );
+ }
+ pIter++;
+ /* pIter now points at the 64-bit integer key value, a variable length
+ ** integer. The following block moves pIter to point at the first byte
+ ** past the end of the key value. */
+ if( (*pIter++)&0x80
+ && (*pIter++)&0x80
+ && (*pIter++)&0x80
+ && (*pIter++)&0x80
+ && (*pIter++)&0x80
+ && (*pIter++)&0x80
+ && (*pIter++)&0x80
+ && (*pIter++)&0x80 ){ pIter++; }
+ testcase( nSize==pPage->maxLocal );
+ testcase( nSize==(u32)pPage->maxLocal+1 );
+ if( nSize<=pPage->maxLocal ){
+ nSize += (u32)(pIter - pCell);
+ if( nSize<4 ) nSize = 4;
+ }else{
+ int minLocal = pPage->minLocal;
+ nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
+ testcase( nSize==pPage->maxLocal );
+ testcase( nSize==(u32)pPage->maxLocal+1 );
+ if( nSize>pPage->maxLocal ){
+ nSize = minLocal;
+ }
+ nSize += 4 + (u16)(pIter - pCell);
+ }
+ assert( nSize==debuginfo.nSize || CORRUPT_DB );
+ return (u16)nSize;
+}
#ifdef SQLITE_DEBUG
@@ -66851,7 +70238,7 @@ static u16 cellSize(MemPage *pPage, int iCell){
#ifndef SQLITE_OMIT_AUTOVACUUM
/*
** The cell pCell is currently part of page pSrc but will ultimately be part
-** of pPage. (pSrc and pPager are often the same.) If pCell contains a
+** of pPage. (pSrc and pPage are often the same.) If pCell contains a
** pointer to an overflow page, insert an entry into the pointer-map for
** the overflow page that will be valid after pCell has been moved to pPage.
*/
@@ -66907,8 +70294,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE );
assert( pPage->nOverflow==0 );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- temp = 0;
- src = data = pPage->aData;
+ data = pPage->aData;
hdr = pPage->hdrOffset;
cellOffset = pPage->cellOffset;
nCell = pPage->nCell;
@@ -66962,39 +70348,38 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
cbrk = usableSize;
iCellLast = usableSize - 4;
iCellStart = get2byte(&data[hdr+5]);
- for(i=0; i<nCell; i++){
- u8 *pAddr; /* The i-th cell pointer */
- pAddr = &data[cellOffset + i*2];
- pc = get2byte(pAddr);
- testcase( pc==iCellFirst );
- testcase( pc==iCellLast );
- /* These conditions have already been verified in btreeInitPage()
- ** if PRAGMA cell_size_check=ON.
- */
- if( pc<iCellStart || pc>iCellLast ){
- return SQLITE_CORRUPT_PAGE(pPage);
- }
- assert( pc>=iCellStart && pc<=iCellLast );
- size = pPage->xCellSize(pPage, &src[pc]);
- cbrk -= size;
- if( cbrk<iCellStart || pc+size>usableSize ){
- return SQLITE_CORRUPT_PAGE(pPage);
- }
- assert( cbrk+size<=usableSize && cbrk>=iCellStart );
- testcase( cbrk+size==usableSize );
- testcase( pc+size==usableSize );
- put2byte(pAddr, cbrk);
- if( temp==0 ){
- if( cbrk==pc ) continue;
- temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
- memcpy(&temp[iCellStart], &data[iCellStart], usableSize - iCellStart);
- src = temp;
+ if( nCell>0 ){
+ temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
+ memcpy(&temp[iCellStart], &data[iCellStart], usableSize - iCellStart);
+ src = temp;
+ for(i=0; i<nCell; i++){
+ u8 *pAddr; /* The i-th cell pointer */
+ pAddr = &data[cellOffset + i*2];
+ pc = get2byte(pAddr);
+ testcase( pc==iCellFirst );
+ testcase( pc==iCellLast );
+ /* These conditions have already been verified in btreeInitPage()
+ ** if PRAGMA cell_size_check=ON.
+ */
+ if( pc>iCellLast ){
+ return SQLITE_CORRUPT_PAGE(pPage);
+ }
+ assert( pc>=0 && pc<=iCellLast );
+ size = pPage->xCellSize(pPage, &src[pc]);
+ cbrk -= size;
+ if( cbrk<iCellStart || pc+size>usableSize ){
+ return SQLITE_CORRUPT_PAGE(pPage);
+ }
+ assert( cbrk+size<=usableSize && cbrk>=iCellStart );
+ testcase( cbrk+size==usableSize );
+ testcase( pc+size==usableSize );
+ put2byte(pAddr, cbrk);
+ memcpy(&data[cbrk], &src[pc], size);
}
- memcpy(&data[cbrk], &src[pc], size);
}
data[hdr+7] = 0;
- defragment_out:
+defragment_out:
assert( pPage->nFree>=0 );
if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){
return SQLITE_CORRUPT_PAGE(pPage);
@@ -67026,7 +70411,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
const int hdr = pPg->hdrOffset; /* Offset to page header */
u8 * const aData = pPg->aData; /* Page data */
int iAddr = hdr + 1; /* Address of ptr to pc */
- int pc = get2byte(&aData[iAddr]); /* Address of a free slot */
+ u8 *pTmp = &aData[iAddr]; /* Temporary ptr into aData[] */
+ int pc = get2byte(pTmp); /* Address of a free slot */
int x; /* Excess size of the slot */
int maxPC = pPg->pBt->usableSize - nByte; /* Max address for a usable slot */
int size; /* Size of the free slot */
@@ -67036,7 +70422,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
/* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each
** freeblock form a big-endian integer which is the size of the freeblock
** in bytes, including the 4-byte header. */
- size = get2byte(&aData[pc+2]);
+ pTmp = &aData[pc+2];
+ size = get2byte(pTmp);
if( (x = size - nByte)>=0 ){
testcase( x==4 );
testcase( x==3 );
@@ -67049,6 +70436,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
** fragmented bytes within the page. */
memcpy(&aData[iAddr], &aData[pc], 2);
aData[hdr+7] += (u8)x;
+ return &aData[pc];
}else if( x+pc > maxPC ){
/* This slot extends off the end of the usable part of the page */
*pRc = SQLITE_CORRUPT_PAGE(pPg);
@@ -67061,10 +70449,11 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
return &aData[pc + x];
}
iAddr = pc;
- pc = get2byte(&aData[pc]);
- if( pc<=iAddr+size ){
+ pTmp = &aData[pc];
+ pc = get2byte(pTmp);
+ if( pc<=iAddr ){
if( pc ){
- /* The next slot in the chain is not past the end of the current slot */
+ /* The next slot in the chain comes before the current slot */
*pRc = SQLITE_CORRUPT_PAGE(pPg);
}
return 0;
@@ -67090,11 +70479,12 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
** allocation is being made in order to insert a new cell, so we will
** also end up needing a new cell pointer.
*/
-static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
+static SQLITE_INLINE int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */
u8 * const data = pPage->aData; /* Local cache of pPage->aData */
int top; /* First byte of cell content area */
int rc = SQLITE_OK; /* Integer return code */
+ u8 *pTmp; /* Temp ptr into data[] */
int gap; /* First byte of gap between cell pointers and cell content */
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
@@ -67113,14 +70503,16 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
** then the cell content offset of an empty page wants to be 65536.
** However, that integer is too large to be stored in a 2-byte unsigned
** integer, so a value of 0 is used in its place. */
- top = get2byte(&data[hdr+5]);
- assert( top<=(int)pPage->pBt->usableSize ); /* by btreeComputeFreeSpace() */
+ pTmp = &data[hdr+5];
+ top = get2byte(pTmp);
if( gap>top ){
if( top==0 && pPage->pBt->usableSize==65536 ){
top = 65536;
}else{
return SQLITE_CORRUPT_PAGE(pPage);
}
+ }else if( top>(int)pPage->pBt->usableSize ){
+ return SQLITE_CORRUPT_PAGE(pPage);
}
/* If there is enough space between gap and top for one more cell pointer,
@@ -67136,7 +70528,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
int g2;
assert( pSpace+nByte<=data+pPage->pBt->usableSize );
*pIdx = g2 = (int)(pSpace-data);
- if( NEVER(g2<=gap) ){
+ if( g2<=gap ){
return SQLITE_CORRUPT_PAGE(pPage);
}else{
return SQLITE_OK;
@@ -67195,6 +70587,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
u16 x; /* Offset to cell content area */
u32 iEnd = iStart + iSize; /* First byte past the iStart buffer */
unsigned char *data = pPage->aData; /* Page content */
+ u8 *pTmp; /* Temporary ptr into data[] */
assert( pPage->pBt!=0 );
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
@@ -67202,7 +70595,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
assert( CORRUPT_DB || iEnd <= pPage->pBt->usableSize );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
assert( iSize>=4 ); /* Minimum cell size is 4 */
- assert( iStart<=pPage->pBt->usableSize-4 );
+ assert( CORRUPT_DB || iStart<=pPage->pBt->usableSize-4 );
/* The list of freeblocks must be in ascending order. Find the
** spot on the list where iStart should be inserted.
@@ -67213,7 +70606,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
iFreeBlk = 0; /* Shortcut for the case when the freelist is empty */
}else{
while( (iFreeBlk = get2byte(&data[iPtr]))<iStart ){
- if( iFreeBlk<iPtr+4 ){
+ if( iFreeBlk<=iPtr ){
if( iFreeBlk==0 ) break; /* TH3: corrupt082.100 */
return SQLITE_CORRUPT_PAGE(pPage);
}
@@ -67222,7 +70615,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
if( iFreeBlk>pPage->pBt->usableSize-4 ){ /* TH3: corrupt081.100 */
return SQLITE_CORRUPT_PAGE(pPage);
}
- assert( iFreeBlk>iPtr || iFreeBlk==0 );
+ assert( iFreeBlk>iPtr || iFreeBlk==0 || CORRUPT_DB );
/* At this point:
** iFreeBlk: First freeblock after iStart, or zero if none
@@ -67257,7 +70650,13 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage);
data[hdr+7] -= nFrag;
}
- x = get2byte(&data[hdr+5]);
+ pTmp = &data[hdr+5];
+ x = get2byte(pTmp);
+ if( pPage->pBt->btsFlags & BTS_FAST_SECURE ){
+ /* Overwrite deleted information with zeros when the secure_delete
+ ** option is enabled */
+ memset(&data[iStart], 0, iSize);
+ }
if( iStart<=x ){
/* The new freeblock is at the beginning of the cell content area,
** so just extend the cell content area rather than create another
@@ -67269,14 +70668,9 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
}else{
/* Insert the new freeblock into the freelist */
put2byte(&data[iPtr], iStart);
+ put2byte(&data[iStart], iFreeBlk);
+ put2byte(&data[iStart+2], iSize);
}
- if( pPage->pBt->btsFlags & BTS_FAST_SECURE ){
- /* Overwrite deleted information with zeros when the secure_delete
- ** option is enabled */
- memset(&data[iStart], 0, iSize);
- }
- put2byte(&data[iStart], iFreeBlk);
- put2byte(&data[iStart+2], iSize);
pPage->nFree += iOrigSize;
return SQLITE_OK;
}
@@ -67288,57 +70682,67 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){
** Only the following combinations are supported. Anything different
** indicates a corrupt database files:
**
-** PTF_ZERODATA
-** PTF_ZERODATA | PTF_LEAF
-** PTF_LEAFDATA | PTF_INTKEY
-** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF
+** PTF_ZERODATA (0x02, 2)
+** PTF_LEAFDATA | PTF_INTKEY (0x05, 5)
+** PTF_ZERODATA | PTF_LEAF (0x0a, 10)
+** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF (0x0d, 13)
*/
static int decodeFlags(MemPage *pPage, int flagByte){
BtShared *pBt; /* A copy of pPage->pBt */
assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 );
- flagByte &= ~PTF_LEAF;
- pPage->childPtrSize = 4-4*pPage->leaf;
- pPage->xCellSize = cellSizePtr;
pBt = pPage->pBt;
- if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
- /* EVIDENCE-OF: R-07291-35328 A value of 5 (0x05) means the page is an
- ** interior table b-tree page. */
- assert( (PTF_LEAFDATA|PTF_INTKEY)==5 );
- /* EVIDENCE-OF: R-26900-09176 A value of 13 (0x0d) means the page is a
- ** leaf table b-tree page. */
- assert( (PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF)==13 );
- pPage->intKey = 1;
- if( pPage->leaf ){
+ pPage->max1bytePayload = pBt->max1bytePayload;
+ if( flagByte>=(PTF_ZERODATA | PTF_LEAF) ){
+ pPage->childPtrSize = 0;
+ pPage->leaf = 1;
+ if( flagByte==(PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF) ){
pPage->intKeyLeaf = 1;
+ pPage->xCellSize = cellSizePtrTableLeaf;
pPage->xParseCell = btreeParseCellPtr;
+ pPage->intKey = 1;
+ pPage->maxLocal = pBt->maxLeaf;
+ pPage->minLocal = pBt->minLeaf;
+ }else if( flagByte==(PTF_ZERODATA | PTF_LEAF) ){
+ pPage->intKey = 0;
+ pPage->intKeyLeaf = 0;
+ pPage->xCellSize = cellSizePtrIdxLeaf;
+ pPage->xParseCell = btreeParseCellPtrIndex;
+ pPage->maxLocal = pBt->maxLocal;
+ pPage->minLocal = pBt->minLocal;
}else{
+ pPage->intKey = 0;
+ pPage->intKeyLeaf = 0;
+ pPage->xCellSize = cellSizePtrIdxLeaf;
+ pPage->xParseCell = btreeParseCellPtrIndex;
+ return SQLITE_CORRUPT_PAGE(pPage);
+ }
+ }else{
+ pPage->childPtrSize = 4;
+ pPage->leaf = 0;
+ if( flagByte==(PTF_ZERODATA) ){
+ pPage->intKey = 0;
+ pPage->intKeyLeaf = 0;
+ pPage->xCellSize = cellSizePtr;
+ pPage->xParseCell = btreeParseCellPtrIndex;
+ pPage->maxLocal = pBt->maxLocal;
+ pPage->minLocal = pBt->minLocal;
+ }else if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
pPage->intKeyLeaf = 0;
pPage->xCellSize = cellSizePtrNoPayload;
pPage->xParseCell = btreeParseCellPtrNoPayload;
+ pPage->intKey = 1;
+ pPage->maxLocal = pBt->maxLeaf;
+ pPage->minLocal = pBt->minLeaf;
+ }else{
+ pPage->intKey = 0;
+ pPage->intKeyLeaf = 0;
+ pPage->xCellSize = cellSizePtr;
+ pPage->xParseCell = btreeParseCellPtrIndex;
+ return SQLITE_CORRUPT_PAGE(pPage);
}
- pPage->maxLocal = pBt->maxLeaf;
- pPage->minLocal = pBt->minLeaf;
- }else if( flagByte==PTF_ZERODATA ){
- /* EVIDENCE-OF: R-43316-37308 A value of 2 (0x02) means the page is an
- ** interior index b-tree page. */
- assert( (PTF_ZERODATA)==2 );
- /* EVIDENCE-OF: R-59615-42828 A value of 10 (0x0a) means the page is a
- ** leaf index b-tree page. */
- assert( (PTF_ZERODATA|PTF_LEAF)==10 );
- pPage->intKey = 0;
- pPage->intKeyLeaf = 0;
- pPage->xParseCell = btreeParseCellPtrIndex;
- pPage->maxLocal = pBt->maxLocal;
- pPage->minLocal = pBt->minLocal;
- }else{
- /* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is
- ** an error. */
- return SQLITE_CORRUPT_PAGE(pPage);
}
- pPage->max1bytePayload = pBt->max1bytePayload;
return SQLITE_OK;
}
@@ -67493,7 +70897,7 @@ static int btreeInitPage(MemPage *pPage){
pPage->nOverflow = 0;
pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize;
pPage->aCellIdx = data + pPage->childPtrSize + 8;
- pPage->aDataEnd = pPage->aData + pBt->usableSize;
+ pPage->aDataEnd = pPage->aData + pBt->pageSize;
pPage->aDataOfst = pPage->aData + pPage->childPtrSize;
/* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the
** number of cells on the page. */
@@ -67528,7 +70932,7 @@ static void zeroPage(MemPage *pPage, int flags){
u8 hdr = pPage->hdrOffset;
u16 first;
- assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno );
+ assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno || CORRUPT_DB );
assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
assert( sqlite3PagerGetData(pPage->pDbPage) == data );
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
@@ -67544,7 +70948,7 @@ static void zeroPage(MemPage *pPage, int flags){
pPage->nFree = (u16)(pBt->usableSize - first);
decodeFlags(pPage, flags);
pPage->cellOffset = first;
- pPage->aDataEnd = &data[pBt->usableSize];
+ pPage->aDataEnd = &data[pBt->pageSize];
pPage->aCellIdx = &data[first];
pPage->aDataOfst = &data[pPage->childPtrSize];
pPage->nOverflow = 0;
@@ -67670,7 +71074,7 @@ static int getAndInitPage(
goto getAndInitPage_error2;
}
}
- assert( (*ppPage)->pgno==pgno );
+ assert( (*ppPage)->pgno==pgno || CORRUPT_DB );
assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) );
/* If obtaining a child page for a cursor, we must verify that the page is
@@ -67689,7 +71093,7 @@ getAndInitPage_error1:
pCur->pPage = pCur->apPage[pCur->iPage];
}
testcase( pgno==0 );
- assert( pgno!=0 || rc==SQLITE_CORRUPT );
+ assert( pgno!=0 || rc!=SQLITE_OK );
return rc;
}
@@ -68147,30 +71551,38 @@ static int removeFromSharingList(BtShared *pBt){
** MX_CELL_SIZE(pBt) bytes with a 4-byte prefix for a left-child
** pointer.
*/
-static void allocateTempSpace(BtShared *pBt){
- if( !pBt->pTmpSpace ){
- pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize );
-
- /* One of the uses of pBt->pTmpSpace is to format cells before
- ** inserting them into a leaf page (function fillInCell()). If
- ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes
- ** by the various routines that manipulate binary cells. Which
- ** can mean that fillInCell() only initializes the first 2 or 3
- ** bytes of pTmpSpace, but that the first 4 bytes are copied from
- ** it into a database page. This is not actually a problem, but it
- ** does cause a valgrind error when the 1 or 2 bytes of unitialized
- ** data is passed to system call write(). So to avoid this error,
- ** zero the first 4 bytes of temp space here.
- **
- ** Also: Provide four bytes of initialized space before the
- ** beginning of pTmpSpace as an area available to prepend the
- ** left-child pointer to the beginning of a cell.
- */
- if( pBt->pTmpSpace ){
- memset(pBt->pTmpSpace, 0, 8);
- pBt->pTmpSpace += 4;
- }
+static SQLITE_NOINLINE int allocateTempSpace(BtShared *pBt){
+ assert( pBt!=0 );
+ assert( pBt->pTmpSpace==0 );
+ /* This routine is called only by btreeCursor() when allocating the
+ ** first write cursor for the BtShared object */
+ assert( pBt->pCursor!=0 && (pBt->pCursor->curFlags & BTCF_WriteFlag)!=0 );
+ pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize );
+ if( pBt->pTmpSpace==0 ){
+ BtCursor *pCur = pBt->pCursor;
+ pBt->pCursor = pCur->pNext; /* Unlink the cursor */
+ memset(pCur, 0, sizeof(*pCur));
+ return SQLITE_NOMEM_BKPT;
}
+
+ /* One of the uses of pBt->pTmpSpace is to format cells before
+ ** inserting them into a leaf page (function fillInCell()). If
+ ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes
+ ** by the various routines that manipulate binary cells. Which
+ ** can mean that fillInCell() only initializes the first 2 or 3
+ ** bytes of pTmpSpace, but that the first 4 bytes are copied from
+ ** it into a database page. This is not actually a problem, but it
+ ** does cause a valgrind error when the 1 or 2 bytes of unitialized
+ ** data is passed to system call write(). So to avoid this error,
+ ** zero the first 4 bytes of temp space here.
+ **
+ ** Also: Provide four bytes of initialized space before the
+ ** beginning of pTmpSpace as an area available to prepend the
+ ** left-child pointer to the beginning of a cell.
+ */
+ memset(pBt->pTmpSpace, 0, 8);
+ pBt->pTmpSpace += 4;
+ return SQLITE_OK;
}
/*
@@ -68549,7 +71961,6 @@ static int lockBtree(BtShared *pBt){
MemPage *pPage1; /* Page 1 of the database file */
u32 nPage; /* Number of pages in the database */
u32 nPageFile = 0; /* Number of pages in the database file */
- u32 nPageHeader; /* Number of pages in the database according to hdr */
assert( sqlite3_mutex_held(pBt->mutex) );
assert( pBt->pPage1==0 );
@@ -68561,7 +71972,7 @@ static int lockBtree(BtShared *pBt){
/* Do some checking to help insure the file we opened really is
** a valid database file.
*/
- nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData);
+ nPage = get4byte(28+(u8*)pPage1->aData);
sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile);
if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){
nPage = nPageFile;
@@ -68596,7 +72007,7 @@ static int lockBtree(BtShared *pBt){
goto page1_init_failed;
}
- /* If the write version is set to 2, this database should be accessed
+ /* If the read version is set to 2, this database should be accessed
** in WAL mode. If the log is not already open, open it now. Then
** return SQLITE_OK and return without populating BtShared.pPage1.
** The caller detects this and calls this function again. This is
@@ -68668,9 +72079,13 @@ static int lockBtree(BtShared *pBt){
pageSize-usableSize);
return rc;
}
- if( sqlite3WritableSchema(pBt->db)==0 && nPage>nPageFile ){
- rc = SQLITE_CORRUPT_BKPT;
- goto page1_init_failed;
+ if( nPage>nPageFile ){
+ if( sqlite3WritableSchema(pBt->db)==0 ){
+ rc = SQLITE_CORRUPT_BKPT;
+ goto page1_init_failed;
+ }else{
+ nPage = nPageFile;
+ }
}
/* EVIDENCE-OF: R-28312-64704 However, the usable size is not allowed to
** be less than 480. In other words, if the page size is 512, then the
@@ -69114,6 +72529,9 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
}
}
}else{
+ if( pCell+4 > pPage->aData+pPage->pBt->usableSize ){
+ return SQLITE_CORRUPT_PAGE(pPage);
+ }
if( get4byte(pCell)==iFrom ){
put4byte(pCell, iTo);
break;
@@ -69162,7 +72580,7 @@ static int relocatePage(
if( iDbPage<3 ) return SQLITE_CORRUPT_BKPT;
/* Move page iDbPage from its current location to page number iFreePage */
- TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n",
+ TRACE(("AUTOVACUUM: Moving %u to free page %u (ptr page %u type %u)\n",
iDbPage, iFreePage, iPtrPage, eType));
rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit);
if( rc!=SQLITE_OK ){
@@ -69300,12 +72718,17 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){
}
do {
MemPage *pFreePg;
+ Pgno dbSize = btreePagecount(pBt);
rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iNear, eMode);
if( rc!=SQLITE_OK ){
releasePage(pLastPg);
return rc;
}
releasePage(pFreePg);
+ if( iFreePg>dbSize ){
+ releasePage(pLastPg);
+ return SQLITE_CORRUPT_BKPT;
+ }
}while( bCommit && iFreePg>nFin );
assert( iFreePg<iLastPg );
@@ -69394,16 +72817,18 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){
/*
** This routine is called prior to sqlite3PagerCommit when a transaction
** is committed for an auto-vacuum database.
-**
-** If SQLITE_OK is returned, then *pnTrunc is set to the number of pages
-** the database file should be truncated to during the commit process.
-** i.e. the database has been reorganized so that only the first *pnTrunc
-** pages are in use.
*/
-static int autoVacuumCommit(BtShared *pBt){
+static int autoVacuumCommit(Btree *p){
int rc = SQLITE_OK;
- Pager *pPager = pBt->pPager;
- VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager); )
+ Pager *pPager;
+ BtShared *pBt;
+ sqlite3 *db;
+ VVA_ONLY( int nRef );
+
+ assert( p!=0 );
+ pBt = p->pBt;
+ pPager = pBt->pPager;
+ VVA_ONLY( nRef = sqlite3PagerRefcount(pPager); )
assert( sqlite3_mutex_held(pBt->mutex) );
invalidateAllOverflowCache(pBt);
@@ -69411,6 +72836,7 @@ static int autoVacuumCommit(BtShared *pBt){
if( !pBt->incrVacuum ){
Pgno nFin; /* Number of pages in database after autovacuuming */
Pgno nFree; /* Number of pages on the freelist initially */
+ Pgno nVac; /* Number of pages to vacuum */
Pgno iFree; /* The next page to be freed */
Pgno nOrig; /* Database size before freeing */
@@ -69424,18 +72850,42 @@ static int autoVacuumCommit(BtShared *pBt){
}
nFree = get4byte(&pBt->pPage1->aData[36]);
- nFin = finalDbSize(pBt, nOrig, nFree);
+ db = p->db;
+ if( db->xAutovacPages ){
+ int iDb;
+ for(iDb=0; ALWAYS(iDb<db->nDb); iDb++){
+ if( db->aDb[iDb].pBt==p ) break;
+ }
+ nVac = db->xAutovacPages(
+ db->pAutovacPagesArg,
+ db->aDb[iDb].zDbSName,
+ nOrig,
+ nFree,
+ pBt->pageSize
+ );
+ if( nVac>nFree ){
+ nVac = nFree;
+ }
+ if( nVac==0 ){
+ return SQLITE_OK;
+ }
+ }else{
+ nVac = nFree;
+ }
+ nFin = finalDbSize(pBt, nOrig, nVac);
if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT;
if( nFin<nOrig ){
rc = saveAllCursors(pBt, 0, 0);
}
for(iFree=nOrig; iFree>nFin && rc==SQLITE_OK; iFree--){
- rc = incrVacuumStep(pBt, nFin, iFree, 1);
+ rc = incrVacuumStep(pBt, nFin, iFree, nVac==nFree);
}
if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){
rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
- put4byte(&pBt->pPage1->aData[32], 0);
- put4byte(&pBt->pPage1->aData[36], 0);
+ if( nVac==nFree ){
+ put4byte(&pBt->pPage1->aData[32], 0);
+ put4byte(&pBt->pPage1->aData[36], 0);
+ }
put4byte(&pBt->pPage1->aData[28], nFin);
pBt->bDoTruncate = 1;
pBt->nPage = nFin;
@@ -69486,7 +72936,7 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zSuperJrnl){
sqlite3BtreeEnter(p);
#ifndef SQLITE_OMIT_AUTOVACUUM
if( pBt->autoVacuum ){
- rc = autoVacuumCommit(pBt);
+ rc = autoVacuumCommit(p);
if( rc!=SQLITE_OK ){
sqlite3BtreeLeave(p);
return rc;
@@ -69673,7 +73123,7 @@ static void btreeSetNPage(BtShared *pBt, MemPage *pPage1){
int nPage = get4byte(&pPage1->aData[28]);
testcase( nPage==0 );
if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage);
- testcase( pBt->nPage!=nPage );
+ testcase( pBt->nPage!=(u32)nPage );
pBt->nPage = nPage;
}
@@ -69885,10 +73335,6 @@ static int btreeCursor(
assert( pBt->pPage1 && pBt->pPage1->aData );
assert( wrFlag==0 || (pBt->btsFlags & BTS_READ_ONLY)==0 );
- if( wrFlag ){
- allocateTempSpace(pBt);
- if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM_BKPT;
- }
if( iTable<=1 ){
if( iTable<1 ){
return SQLITE_CORRUPT_BKPT;
@@ -69905,19 +73351,25 @@ static int btreeCursor(
pCur->pKeyInfo = pKeyInfo;
pCur->pBtree = p;
pCur->pBt = pBt;
- pCur->curFlags = wrFlag ? BTCF_WriteFlag : 0;
- pCur->curPagerFlags = wrFlag ? 0 : PAGER_GET_READONLY;
+ pCur->curFlags = 0;
/* If there are two or more cursors on the same btree, then all such
** cursors *must* have the BTCF_Multiple flag set. */
for(pX=pBt->pCursor; pX; pX=pX->pNext){
if( pX->pgnoRoot==iTable ){
pX->curFlags |= BTCF_Multiple;
- pCur->curFlags |= BTCF_Multiple;
+ pCur->curFlags = BTCF_Multiple;
}
}
+ pCur->eState = CURSOR_INVALID;
pCur->pNext = pBt->pCursor;
pBt->pCursor = pCur;
- pCur->eState = CURSOR_INVALID;
+ if( wrFlag ){
+ pCur->curFlags |= BTCF_WriteFlag;
+ pCur->curPagerFlags = 0;
+ if( pBt->pTmpSpace==0 ) return allocateTempSpace(pBt);
+ }else{
+ pCur->curPagerFlags = PAGER_GET_READONLY;
+ }
return SQLITE_OK;
}
static int btreeCursorWithLock(
@@ -70291,7 +73743,9 @@ static int accessPayload(
assert( pPage );
assert( eOp==0 || eOp==1 );
assert( pCur->eState==CURSOR_VALID );
- assert( pCur->ix<pPage->nCell );
+ if( pCur->ix>=pPage->nCell ){
+ return SQLITE_CORRUPT_PAGE(pPage);
+ }
assert( cursorHoldsMutex(pCur) );
getCellInfo(pCur);
@@ -70478,7 +73932,6 @@ SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor *pCur, u32 offset, u32 amt, void
assert( cursorHoldsMutex(pCur) );
assert( pCur->eState==CURSOR_VALID );
assert( pCur->iPage>=0 && pCur->pPage );
- assert( pCur->ix<pCur->pPage->nCell );
return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0);
}
@@ -70540,7 +73993,7 @@ static const void *fetchPayload(
assert( pCur->eState==CURSOR_VALID );
assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
assert( cursorOwnsBtShared(pCur) );
- assert( pCur->ix<pCur->pPage->nCell );
+ assert( pCur->ix<pCur->pPage->nCell || CORRUPT_DB );
assert( pCur->info.nSize>0 );
assert( pCur->info.pPayload>pCur->pPage->aData || CORRUPT_DB );
assert( pCur->info.pPayload<pCur->pPage->aDataEnd ||CORRUPT_DB);
@@ -70585,8 +74038,6 @@ SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor *pCur, u32 *pAmt){
** vice-versa).
*/
static int moveToChild(BtCursor *pCur, u32 newPgno){
- BtShared *pBt = pCur->pBt;
-
assert( cursorOwnsBtShared(pCur) );
assert( pCur->eState==CURSOR_VALID );
assert( pCur->iPage<BTCURSOR_MAX_DEPTH );
@@ -70600,7 +74051,8 @@ static int moveToChild(BtCursor *pCur, u32 newPgno){
pCur->apPage[pCur->iPage] = pCur->pPage;
pCur->ix = 0;
pCur->iPage++;
- return getAndInitPage(pBt, newPgno, &pCur->pPage, pCur, pCur->curPagerFlags);
+ return getAndInitPage(pCur->pBt, newPgno, &pCur->pPage, pCur,
+ pCur->curPagerFlags);
}
#ifdef SQLITE_DEBUG
@@ -70691,7 +74143,7 @@ static int moveToRoot(BtCursor *pCur){
while( --pCur->iPage ){
releasePageNotNull(pCur->apPage[pCur->iPage]);
}
- pCur->pPage = pCur->apPage[0];
+ pRoot = pCur->pPage = pCur->apPage[0];
goto skip_init;
}
}else if( pCur->pgnoRoot==0 ){
@@ -70706,7 +74158,7 @@ static int moveToRoot(BtCursor *pCur){
}
sqlite3BtreeClearCursor(pCur);
}
- rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->pPage,
+ rc = getAndInitPage(pCur->pBt, pCur->pgnoRoot, &pCur->pPage,
0, pCur->curPagerFlags);
if( rc!=SQLITE_OK ){
pCur->eState = CURSOR_INVALID;
@@ -70716,7 +74168,7 @@ static int moveToRoot(BtCursor *pCur){
pCur->curIntKey = pCur->pPage->intKey;
}
pRoot = pCur->pPage;
- assert( pRoot->pgno==pCur->pgnoRoot );
+ assert( pRoot->pgno==pCur->pgnoRoot || CORRUPT_DB );
/* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
@@ -70738,7 +74190,6 @@ skip_init:
pCur->info.nSize = 0;
pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidNKey|BTCF_ValidOvfl);
- pRoot = pCur->pPage;
if( pRoot->nCell>0 ){
pCur->eState = CURSOR_VALID;
}else if( !pRoot->leaf ){
@@ -70831,9 +74282,25 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){
** on success. Set *pRes to 0 if the cursor actually points to something
** or set *pRes to 1 if the table is empty.
*/
+static SQLITE_NOINLINE int btreeLast(BtCursor *pCur, int *pRes){
+ int rc = moveToRoot(pCur);
+ if( rc==SQLITE_OK ){
+ assert( pCur->eState==CURSOR_VALID );
+ *pRes = 0;
+ rc = moveToRightmost(pCur);
+ if( rc==SQLITE_OK ){
+ pCur->curFlags |= BTCF_AtLast;
+ }else{
+ pCur->curFlags &= ~BTCF_AtLast;
+ }
+ }else if( rc==SQLITE_EMPTY ){
+ assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 );
+ *pRes = 1;
+ rc = SQLITE_OK;
+ }
+ return rc;
+}
SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){
- int rc;
-
assert( cursorOwnsBtShared(pCur) );
assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
@@ -70854,31 +74321,11 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){
*pRes = 0;
return SQLITE_OK;
}
-
- rc = moveToRoot(pCur);
- if( rc==SQLITE_OK ){
- assert( pCur->eState==CURSOR_VALID );
- *pRes = 0;
- rc = moveToRightmost(pCur);
- if( rc==SQLITE_OK ){
- pCur->curFlags |= BTCF_AtLast;
- }else{
- pCur->curFlags &= ~BTCF_AtLast;
- }
- }else if( rc==SQLITE_EMPTY ){
- assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 );
- *pRes = 1;
- rc = SQLITE_OK;
- }
- return rc;
+ return btreeLast(pCur, pRes);
}
-/* Move the cursor so that it points to an entry near the key
-** specified by pIdxKey or intKey. Return a success code.
-**
-** For INTKEY tables, the intKey parameter is used. pIdxKey
-** must be NULL. For index tables, pIdxKey is used and intKey
-** is ignored.
+/* Move the cursor so that it points to an entry in a table (a.k.a INTKEY)
+** table near the key intKey. Return a success code.
**
** If an exact match is not found, then the cursor is always
** left pointing at a leaf page which would hold the entry if it
@@ -70891,39 +74338,32 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){
** *pRes is as follows:
**
** *pRes<0 The cursor is left pointing at an entry that
-** is smaller than intKey/pIdxKey or if the table is empty
+** is smaller than intKey or if the table is empty
** and the cursor is therefore left point to nothing.
**
** *pRes==0 The cursor is left pointing at an entry that
-** exactly matches intKey/pIdxKey.
+** exactly matches intKey.
**
** *pRes>0 The cursor is left pointing at an entry that
-** is larger than intKey/pIdxKey.
-**
-** For index tables, the pIdxKey->eqSeen field is set to 1 if there
-** exists an entry in the table that exactly matches pIdxKey.
+** is larger than intKey.
*/
-SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
+SQLITE_PRIVATE int sqlite3BtreeTableMoveto(
BtCursor *pCur, /* The cursor to be moved */
- UnpackedRecord *pIdxKey, /* Unpacked index key */
i64 intKey, /* The table key */
int biasRight, /* If true, bias the search to the high end */
int *pRes /* Write search results here */
){
int rc;
- RecordCompare xRecordCompare;
assert( cursorOwnsBtShared(pCur) );
assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
assert( pRes );
- assert( (pIdxKey==0)==(pCur->pKeyInfo==0) );
- assert( pCur->eState!=CURSOR_VALID || (pIdxKey==0)==(pCur->curIntKey!=0) );
+ assert( pCur->pKeyInfo==0 );
+ assert( pCur->eState!=CURSOR_VALID || pCur->curIntKey!=0 );
/* If the cursor is already positioned at the point we are trying
** to move to, then just return without doing any work */
- if( pIdxKey==0
- && pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0
- ){
+ if( pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0 ){
if( pCur->info.nKey==intKey ){
*pRes = 0;
return SQLITE_OK;
@@ -70945,9 +74385,7 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
if( pCur->info.nKey==intKey ){
return SQLITE_OK;
}
- }else if( rc==SQLITE_DONE ){
- rc = SQLITE_OK;
- }else{
+ }else if( rc!=SQLITE_DONE ){
return rc;
}
}
@@ -70958,17 +74396,6 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
pCur->pBtree->nSeek++; /* Performance measurement during testing */
#endif
- if( pIdxKey ){
- xRecordCompare = sqlite3VdbeFindCompare(pIdxKey);
- pIdxKey->errCode = 0;
- assert( pIdxKey->default_rc==1
- || pIdxKey->default_rc==0
- || pIdxKey->default_rc==-1
- );
- }else{
- xRecordCompare = 0; /* All keys are integers */
- }
-
rc = moveToRoot(pCur);
if( rc ){
if( rc==SQLITE_EMPTY ){
@@ -70983,7 +74410,8 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
assert( pCur->eState==CURSOR_VALID );
assert( pCur->pPage->nCell > 0 );
assert( pCur->iPage==0 || pCur->apPage[0]->intKey==pCur->curIntKey );
- assert( pCur->curIntKey || pIdxKey );
+ assert( pCur->curIntKey );
+
for(;;){
int lwr, upr, idx, c;
Pgno chldPg;
@@ -70997,144 +74425,348 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
** be the right kind (index or table) of b-tree page. Otherwise
** a moveToChild() or moveToRoot() call would have detected corruption. */
assert( pPage->nCell>0 );
- assert( pPage->intKey==(pIdxKey==0) );
+ assert( pPage->intKey );
lwr = 0;
upr = pPage->nCell-1;
assert( biasRight==0 || biasRight==1 );
idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */
- pCur->ix = (u16)idx;
- if( xRecordCompare==0 ){
- for(;;){
- i64 nCellKey;
- pCell = findCellPastPtr(pPage, idx);
- if( pPage->intKeyLeaf ){
- while( 0x80 <= *(pCell++) ){
- if( pCell>=pPage->aDataEnd ){
- return SQLITE_CORRUPT_PAGE(pPage);
- }
+ for(;;){
+ i64 nCellKey;
+ pCell = findCellPastPtr(pPage, idx);
+ if( pPage->intKeyLeaf ){
+ while( 0x80 <= *(pCell++) ){
+ if( pCell>=pPage->aDataEnd ){
+ return SQLITE_CORRUPT_PAGE(pPage);
}
}
- getVarint(pCell, (u64*)&nCellKey);
- if( nCellKey<intKey ){
- lwr = idx+1;
- if( lwr>upr ){ c = -1; break; }
- }else if( nCellKey>intKey ){
- upr = idx-1;
- if( lwr>upr ){ c = +1; break; }
+ }
+ getVarint(pCell, (u64*)&nCellKey);
+ if( nCellKey<intKey ){
+ lwr = idx+1;
+ if( lwr>upr ){ c = -1; break; }
+ }else if( nCellKey>intKey ){
+ upr = idx-1;
+ if( lwr>upr ){ c = +1; break; }
+ }else{
+ assert( nCellKey==intKey );
+ pCur->ix = (u16)idx;
+ if( !pPage->leaf ){
+ lwr = idx;
+ goto moveto_table_next_layer;
}else{
- assert( nCellKey==intKey );
- pCur->ix = (u16)idx;
- if( !pPage->leaf ){
- lwr = idx;
- goto moveto_next_layer;
- }else{
- pCur->curFlags |= BTCF_ValidNKey;
- pCur->info.nKey = nCellKey;
- pCur->info.nSize = 0;
- *pRes = 0;
- return SQLITE_OK;
- }
+ pCur->curFlags |= BTCF_ValidNKey;
+ pCur->info.nKey = nCellKey;
+ pCur->info.nSize = 0;
+ *pRes = 0;
+ return SQLITE_OK;
}
- assert( lwr+upr>=0 );
- idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2; */
}
+ assert( lwr+upr>=0 );
+ idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2; */
+ }
+ assert( lwr==upr+1 || !pPage->leaf );
+ assert( pPage->isInit );
+ if( pPage->leaf ){
+ assert( pCur->ix<pCur->pPage->nCell );
+ pCur->ix = (u16)idx;
+ *pRes = c;
+ rc = SQLITE_OK;
+ goto moveto_table_finish;
+ }
+moveto_table_next_layer:
+ if( lwr>=pPage->nCell ){
+ chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]);
}else{
- for(;;){
- int nCell; /* Size of the pCell cell in bytes */
- pCell = findCellPastPtr(pPage, idx);
-
- /* The maximum supported page-size is 65536 bytes. This means that
- ** the maximum number of record bytes stored on an index B-Tree
- ** page is less than 16384 bytes and may be stored as a 2-byte
- ** varint. This information is used to attempt to avoid parsing
- ** the entire cell by checking for the cases where the record is
- ** stored entirely within the b-tree page by inspecting the first
- ** 2 bytes of the cell.
- */
- nCell = pCell[0];
- if( nCell<=pPage->max1bytePayload ){
- /* This branch runs if the record-size field of the cell is a
- ** single byte varint and the record fits entirely on the main
- ** b-tree page. */
- testcase( pCell+nCell+1==pPage->aDataEnd );
- c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey);
- }else if( !(pCell[1] & 0x80)
- && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal
- ){
- /* The record-size field is a 2 byte varint and the record
- ** fits entirely on the main b-tree page. */
- testcase( pCell+nCell+2==pPage->aDataEnd );
- c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey);
- }else{
- /* The record flows over onto one or more overflow pages. In
- ** this case the whole cell needs to be parsed, a buffer allocated
- ** and accessPayload() used to retrieve the record into the
- ** buffer before VdbeRecordCompare() can be called.
- **
- ** If the record is corrupt, the xRecordCompare routine may read
- ** up to two varints past the end of the buffer. An extra 18
- ** bytes of padding is allocated at the end of the buffer in
- ** case this happens. */
- void *pCellKey;
- u8 * const pCellBody = pCell - pPage->childPtrSize;
- const int nOverrun = 18; /* Size of the overrun padding */
- pPage->xParseCell(pPage, pCellBody, &pCur->info);
- nCell = (int)pCur->info.nKey;
- testcase( nCell<0 ); /* True if key size is 2^32 or more */
- testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */
- testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */
- testcase( nCell==2 ); /* Minimum legal index key size */
- if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){
- rc = SQLITE_CORRUPT_PAGE(pPage);
- goto moveto_finish;
- }
- pCellKey = sqlite3Malloc( nCell+nOverrun );
- if( pCellKey==0 ){
- rc = SQLITE_NOMEM_BKPT;
- goto moveto_finish;
- }
- pCur->ix = (u16)idx;
- rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0);
- memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */
- pCur->curFlags &= ~BTCF_ValidOvfl;
- if( rc ){
- sqlite3_free(pCellKey);
- goto moveto_finish;
- }
- c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey);
- sqlite3_free(pCellKey);
+ chldPg = get4byte(findCell(pPage, lwr));
+ }
+ pCur->ix = (u16)lwr;
+ rc = moveToChild(pCur, chldPg);
+ if( rc ) break;
+ }
+moveto_table_finish:
+ pCur->info.nSize = 0;
+ assert( (pCur->curFlags & BTCF_ValidOvfl)==0 );
+ return rc;
+}
+
+/*
+** Compare the "idx"-th cell on the page the cursor pCur is currently
+** pointing to to pIdxKey using xRecordCompare. Return negative or
+** zero if the cell is less than or equal pIdxKey. Return positive
+** if unknown.
+**
+** Return value negative: Cell at pCur[idx] less than pIdxKey
+**
+** Return value is zero: Cell at pCur[idx] equals pIdxKey
+**
+** Return value positive: Nothing is known about the relationship
+** of the cell at pCur[idx] and pIdxKey.
+**
+** This routine is part of an optimization. It is always safe to return
+** a positive value as that will cause the optimization to be skipped.
+*/
+static int indexCellCompare(
+ BtCursor *pCur,
+ int idx,
+ UnpackedRecord *pIdxKey,
+ RecordCompare xRecordCompare
+){
+ MemPage *pPage = pCur->pPage;
+ int c;
+ int nCell; /* Size of the pCell cell in bytes */
+ u8 *pCell = findCellPastPtr(pPage, idx);
+
+ nCell = pCell[0];
+ if( nCell<=pPage->max1bytePayload ){
+ /* This branch runs if the record-size field of the cell is a
+ ** single byte varint and the record fits entirely on the main
+ ** b-tree page. */
+ testcase( pCell+nCell+1==pPage->aDataEnd );
+ c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey);
+ }else if( !(pCell[1] & 0x80)
+ && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal
+ ){
+ /* The record-size field is a 2 byte varint and the record
+ ** fits entirely on the main b-tree page. */
+ testcase( pCell+nCell+2==pPage->aDataEnd );
+ c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey);
+ }else{
+ /* If the record extends into overflow pages, do not attempt
+ ** the optimization. */
+ c = 99;
+ }
+ return c;
+}
+
+/*
+** Return true (non-zero) if pCur is current pointing to the last
+** page of a table.
+*/
+static int cursorOnLastPage(BtCursor *pCur){
+ int i;
+ assert( pCur->eState==CURSOR_VALID );
+ for(i=0; i<pCur->iPage; i++){
+ MemPage *pPage = pCur->apPage[i];
+ if( pCur->aiIdx[i]<pPage->nCell ) return 0;
+ }
+ return 1;
+}
+
+/* Move the cursor so that it points to an entry in an index table
+** near the key pIdxKey. Return a success code.
+**
+** If an exact match is not found, then the cursor is always
+** left pointing at a leaf page which would hold the entry if it
+** were present. The cursor might point to an entry that comes
+** before or after the key.
+**
+** An integer is written into *pRes which is the result of
+** comparing the key with the entry to which the cursor is
+** pointing. The meaning of the integer written into
+** *pRes is as follows:
+**
+** *pRes<0 The cursor is left pointing at an entry that
+** is smaller than pIdxKey or if the table is empty
+** and the cursor is therefore left point to nothing.
+**
+** *pRes==0 The cursor is left pointing at an entry that
+** exactly matches pIdxKey.
+**
+** *pRes>0 The cursor is left pointing at an entry that
+** is larger than pIdxKey.
+**
+** The pIdxKey->eqSeen field is set to 1 if there
+** exists an entry in the table that exactly matches pIdxKey.
+*/
+SQLITE_PRIVATE int sqlite3BtreeIndexMoveto(
+ BtCursor *pCur, /* The cursor to be moved */
+ UnpackedRecord *pIdxKey, /* Unpacked index key */
+ int *pRes /* Write search results here */
+){
+ int rc;
+ RecordCompare xRecordCompare;
+
+ assert( cursorOwnsBtShared(pCur) );
+ assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
+ assert( pRes );
+ assert( pCur->pKeyInfo!=0 );
+
+#ifdef SQLITE_DEBUG
+ pCur->pBtree->nSeek++; /* Performance measurement during testing */
+#endif
+
+ xRecordCompare = sqlite3VdbeFindCompare(pIdxKey);
+ pIdxKey->errCode = 0;
+ assert( pIdxKey->default_rc==1
+ || pIdxKey->default_rc==0
+ || pIdxKey->default_rc==-1
+ );
+
+
+ /* Check to see if we can skip a lot of work. Two cases:
+ **
+ ** (1) If the cursor is already pointing to the very last cell
+ ** in the table and the pIdxKey search key is greater than or
+ ** equal to that last cell, then no movement is required.
+ **
+ ** (2) If the cursor is on the last page of the table and the first
+ ** cell on that last page is less than or equal to the pIdxKey
+ ** search key, then we can start the search on the current page
+ ** without needing to go back to root.
+ */
+ if( pCur->eState==CURSOR_VALID
+ && pCur->pPage->leaf
+ && cursorOnLastPage(pCur)
+ ){
+ int c;
+ if( pCur->ix==pCur->pPage->nCell-1
+ && (c = indexCellCompare(pCur, pCur->ix, pIdxKey, xRecordCompare))<=0
+ && pIdxKey->errCode==SQLITE_OK
+ ){
+ *pRes = c;
+ return SQLITE_OK; /* Cursor already pointing at the correct spot */
+ }
+ if( pCur->iPage>0
+ && indexCellCompare(pCur, 0, pIdxKey, xRecordCompare)<=0
+ && pIdxKey->errCode==SQLITE_OK
+ ){
+ pCur->curFlags &= ~BTCF_ValidOvfl;
+ if( !pCur->pPage->isInit ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ goto bypass_moveto_root; /* Start search on the current page */
+ }
+ pIdxKey->errCode = SQLITE_OK;
+ }
+
+ rc = moveToRoot(pCur);
+ if( rc ){
+ if( rc==SQLITE_EMPTY ){
+ assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 );
+ *pRes = -1;
+ return SQLITE_OK;
+ }
+ return rc;
+ }
+
+bypass_moveto_root:
+ assert( pCur->pPage );
+ assert( pCur->pPage->isInit );
+ assert( pCur->eState==CURSOR_VALID );
+ assert( pCur->pPage->nCell > 0 );
+ assert( pCur->curIntKey==0 );
+ assert( pIdxKey!=0 );
+ for(;;){
+ int lwr, upr, idx, c;
+ Pgno chldPg;
+ MemPage *pPage = pCur->pPage;
+ u8 *pCell; /* Pointer to current cell in pPage */
+
+ /* pPage->nCell must be greater than zero. If this is the root-page
+ ** the cursor would have been INVALID above and this for(;;) loop
+ ** not run. If this is not the root-page, then the moveToChild() routine
+ ** would have already detected db corruption. Similarly, pPage must
+ ** be the right kind (index or table) of b-tree page. Otherwise
+ ** a moveToChild() or moveToRoot() call would have detected corruption. */
+ assert( pPage->nCell>0 );
+ assert( pPage->intKey==0 );
+ lwr = 0;
+ upr = pPage->nCell-1;
+ idx = upr>>1; /* idx = (lwr+upr)/2; */
+ for(;;){
+ int nCell; /* Size of the pCell cell in bytes */
+ pCell = findCellPastPtr(pPage, idx);
+
+ /* The maximum supported page-size is 65536 bytes. This means that
+ ** the maximum number of record bytes stored on an index B-Tree
+ ** page is less than 16384 bytes and may be stored as a 2-byte
+ ** varint. This information is used to attempt to avoid parsing
+ ** the entire cell by checking for the cases where the record is
+ ** stored entirely within the b-tree page by inspecting the first
+ ** 2 bytes of the cell.
+ */
+ nCell = pCell[0];
+ if( nCell<=pPage->max1bytePayload ){
+ /* This branch runs if the record-size field of the cell is a
+ ** single byte varint and the record fits entirely on the main
+ ** b-tree page. */
+ testcase( pCell+nCell+1==pPage->aDataEnd );
+ c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey);
+ }else if( !(pCell[1] & 0x80)
+ && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal
+ ){
+ /* The record-size field is a 2 byte varint and the record
+ ** fits entirely on the main b-tree page. */
+ testcase( pCell+nCell+2==pPage->aDataEnd );
+ c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey);
+ }else{
+ /* The record flows over onto one or more overflow pages. In
+ ** this case the whole cell needs to be parsed, a buffer allocated
+ ** and accessPayload() used to retrieve the record into the
+ ** buffer before VdbeRecordCompare() can be called.
+ **
+ ** If the record is corrupt, the xRecordCompare routine may read
+ ** up to two varints past the end of the buffer. An extra 18
+ ** bytes of padding is allocated at the end of the buffer in
+ ** case this happens. */
+ void *pCellKey;
+ u8 * const pCellBody = pCell - pPage->childPtrSize;
+ const int nOverrun = 18; /* Size of the overrun padding */
+ pPage->xParseCell(pPage, pCellBody, &pCur->info);
+ nCell = (int)pCur->info.nKey;
+ testcase( nCell<0 ); /* True if key size is 2^32 or more */
+ testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */
+ testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */
+ testcase( nCell==2 ); /* Minimum legal index key size */
+ if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){
+ rc = SQLITE_CORRUPT_PAGE(pPage);
+ goto moveto_index_finish;
+ }
+ pCellKey = sqlite3Malloc( nCell+nOverrun );
+ if( pCellKey==0 ){
+ rc = SQLITE_NOMEM_BKPT;
+ goto moveto_index_finish;
}
- assert(
- (pIdxKey->errCode!=SQLITE_CORRUPT || c==0)
- && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed)
- );
- if( c<0 ){
- lwr = idx+1;
- }else if( c>0 ){
- upr = idx-1;
- }else{
- assert( c==0 );
- *pRes = 0;
- rc = SQLITE_OK;
- pCur->ix = (u16)idx;
- if( pIdxKey->errCode ) rc = SQLITE_CORRUPT_BKPT;
- goto moveto_finish;
+ pCur->ix = (u16)idx;
+ rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0);
+ memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */
+ pCur->curFlags &= ~BTCF_ValidOvfl;
+ if( rc ){
+ sqlite3_free(pCellKey);
+ goto moveto_index_finish;
}
- if( lwr>upr ) break;
- assert( lwr+upr>=0 );
- idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2 */
+ c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey);
+ sqlite3_free(pCellKey);
+ }
+ assert(
+ (pIdxKey->errCode!=SQLITE_CORRUPT || c==0)
+ && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed)
+ );
+ if( c<0 ){
+ lwr = idx+1;
+ }else if( c>0 ){
+ upr = idx-1;
+ }else{
+ assert( c==0 );
+ *pRes = 0;
+ rc = SQLITE_OK;
+ pCur->ix = (u16)idx;
+ if( pIdxKey->errCode ) rc = SQLITE_CORRUPT_BKPT;
+ goto moveto_index_finish;
}
+ if( lwr>upr ) break;
+ assert( lwr+upr>=0 );
+ idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2 */
}
assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) );
assert( pPage->isInit );
if( pPage->leaf ){
- assert( pCur->ix<pCur->pPage->nCell );
+ assert( pCur->ix<pCur->pPage->nCell || CORRUPT_DB );
pCur->ix = (u16)idx;
*pRes = c;
rc = SQLITE_OK;
- goto moveto_finish;
+ goto moveto_index_finish;
}
-moveto_next_layer:
if( lwr>=pPage->nCell ){
chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]);
}else{
@@ -71144,7 +74776,7 @@ moveto_next_layer:
rc = moveToChild(pCur, chldPg);
if( rc ) break;
}
-moveto_finish:
+moveto_index_finish:
pCur->info.nSize = 0;
assert( (pCur->curFlags & BTCF_ValidOvfl)==0 );
return rc;
@@ -71234,27 +74866,11 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){
pPage = pCur->pPage;
idx = ++pCur->ix;
- if( !pPage->isInit || sqlite3FaultSim(412) ){
- /* The only known way for this to happen is for there to be a
- ** recursive SQL function that does a DELETE operation as part of a
- ** SELECT which deletes content out from under an active cursor
- ** in a corrupt database file where the table being DELETE-ed from
- ** has pages in common with the table being queried. See TH3
- ** module cov1/btree78.test testcase 220 (2018-06-08) for an
- ** example. */
+ if( sqlite3FaultSim(412) ) pPage->isInit = 0;
+ if( !pPage->isInit ){
return SQLITE_CORRUPT_BKPT;
}
- /* If the database file is corrupt, it is possible for the value of idx
- ** to be invalid here. This can only occur if a second cursor modifies
- ** the page while cursor pCur is holding a reference to it. Which can
- ** only happen if the database is corrupt in such a way as to link the
- ** page into more than one b-tree structure.
- **
- ** Update 2019-12-23: appears to long longer be possible after the
- ** addition of anotherValidCursor() condition on balance_deeper(). */
- harmless( idx>pPage->nCell );
-
if( idx>=pPage->nCell ){
if( !pPage->leaf ){
rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8]));
@@ -71427,8 +75043,8 @@ static int allocateBtreePage(
assert( eMode==BTALLOC_ANY || (nearby>0 && IfNotOmitAV(pBt->autoVacuum)) );
pPage1 = pBt->pPage1;
mxPage = btreePagecount(pBt);
- /* EVIDENCE-OF: R-05119-02637 The 4-byte big-endian integer at offset 36
- ** stores stores the total number of pages on the freelist. */
+ /* EVIDENCE-OF: R-21003-45125 The 4-byte big-endian integer at offset 36
+ ** stores the total number of pages on the freelist. */
n = get4byte(&pPage1->aData[36]);
testcase( n==mxPage-1 );
if( n>=mxPage ){
@@ -71514,7 +75130,7 @@ static int allocateBtreePage(
memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4);
*ppPage = pTrunk;
pTrunk = 0;
- TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
+ TRACE(("ALLOCATE: %u trunk - %u free pages left\n", *pPgno, n-1));
}else if( k>(u32)(pBt->usableSize/4 - 2) ){
/* Value of k is out of range. Database corruption */
rc = SQLITE_CORRUPT_PGNO(iTrunk);
@@ -71580,7 +75196,7 @@ static int allocateBtreePage(
}
}
pTrunk = 0;
- TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
+ TRACE(("ALLOCATE: %u trunk - %u free pages left\n", *pPgno, n-1));
#endif
}else if( k>0 ){
/* Extract a leaf from the trunk */
@@ -71625,8 +75241,8 @@ static int allocateBtreePage(
){
int noContent;
*pPgno = iPage;
- TRACE(("ALLOCATE: %d was leaf %d of %d on trunk %d"
- ": %d more free pages\n",
+ TRACE(("ALLOCATE: %u was leaf %u of %u on trunk %u"
+ ": %u more free pages\n",
*pPgno, closest+1, k, pTrunk->pgno, n-1));
rc = sqlite3PagerWrite(pTrunk->pDbPage);
if( rc ) goto end_allocate_page;
@@ -71682,7 +75298,7 @@ static int allocateBtreePage(
** becomes a new pointer-map page, the second is used by the caller.
*/
MemPage *pPg = 0;
- TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage));
+ TRACE(("ALLOCATE: %u from end of file (pointer-map page)\n", pBt->nPage));
assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) );
rc = btreeGetUnusedPage(pBt, pBt->nPage, &pPg, bNoContent);
if( rc==SQLITE_OK ){
@@ -71705,7 +75321,7 @@ static int allocateBtreePage(
releasePage(*ppPage);
*ppPage = 0;
}
- TRACE(("ALLOCATE: %d from end of file\n", *pPgno));
+ TRACE(("ALLOCATE: %u from end of file\n", *pPgno));
}
assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) );
@@ -71773,7 +75389,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){
/* If the database supports auto-vacuum, write an entry in the pointer-map
** to indicate that the page is free.
*/
- if( ISAUTOVACUUM ){
+ if( ISAUTOVACUUM(pBt) ){
ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc);
if( rc ) goto freepage_out;
}
@@ -71833,7 +75449,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){
}
rc = btreeSetHasContent(pBt, iPage);
}
- TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno));
+ TRACE(("FREE-PAGE: %u leaf on trunk page %u\n",pPage->pgno,pTrunk->pgno));
goto freepage_out;
}
}
@@ -71854,7 +75470,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){
put4byte(pPage->aData, iTrunk);
put4byte(&pPage->aData[4], 0);
put4byte(&pPage1->aData[32], iPage);
- TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk));
+ TRACE(("FREE-PAGE: %u new trunk page replacing %u\n", pPage->pgno, iTrunk));
freepage_out:
if( pPage ){
@@ -72166,16 +75782,18 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){
int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */
if( *pRC ) return;
- assert( idx>=0 && idx<pPage->nCell );
+ assert( idx>=0 );
+ assert( idx<pPage->nCell );
assert( CORRUPT_DB || sz==cellSize(pPage, idx) );
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
assert( pPage->nFree>=0 );
data = pPage->aData;
ptr = &pPage->aCellIdx[2*idx];
+ assert( pPage->pBt->usableSize > (u32)(ptr-data) );
pc = get2byte(ptr);
hdr = pPage->hdrOffset;
- testcase( pc==get2byte(&data[hdr+5]) );
+ testcase( pc==(u32)get2byte(&data[hdr+5]) );
testcase( pc+sz==pPage->pBt->usableSize );
if( pc+sz > pPage->pBt->usableSize ){
*pRC = SQLITE_CORRUPT_BKPT;
@@ -72212,23 +75830,27 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){
** Allocating a new entry in pPage->aCell[] implies that
** pPage->nOverflow is incremented.
**
-** *pRC must be SQLITE_OK when this routine is called.
+** The insertCellFast() routine below works exactly the same as
+** insertCell() except that it lacks the pTemp and iChild parameters
+** which are assumed zero. Other than that, the two routines are the
+** same.
+**
+** Fixes or enhancements to this routine should be reflected in
+** insertCellFast()!
*/
-static void insertCell(
+static int insertCell(
MemPage *pPage, /* Page into which we are copying */
int i, /* New cell becomes the i-th cell of the page */
u8 *pCell, /* Content of the new cell */
int sz, /* Bytes of content in pCell */
u8 *pTemp, /* Temp storage space for pCell, if needed */
- Pgno iChild, /* If non-zero, replace first 4 bytes with this value */
- int *pRC /* Read and write return code from here */
+ Pgno iChild /* If non-zero, replace first 4 bytes with this value */
){
int idx = 0; /* Where to write new cell content in data[] */
int j; /* Loop counter */
u8 *data; /* The content of the whole page */
u8 *pIns; /* The point in pPage->aCellIdx[] where no cell inserted */
- assert( *pRC==SQLITE_OK );
assert( i>=0 && i<=pPage->nCell+pPage->nOverflow );
assert( MX_CELL(pPage->pBt)<=10921 );
assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB );
@@ -72237,14 +75859,103 @@ static void insertCell(
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB );
assert( pPage->nFree>=0 );
+ assert( iChild>0 );
if( pPage->nOverflow || sz+2>pPage->nFree ){
if( pTemp ){
memcpy(pTemp, pCell, sz);
pCell = pTemp;
}
- if( iChild ){
- put4byte(pCell, iChild);
+ put4byte(pCell, iChild);
+ j = pPage->nOverflow++;
+ /* Comparison against ArraySize-1 since we hold back one extra slot
+ ** as a contingency. In other words, never need more than 3 overflow
+ ** slots but 4 are allocated, just to be safe. */
+ assert( j < ArraySize(pPage->apOvfl)-1 );
+ pPage->apOvfl[j] = pCell;
+ pPage->aiOvfl[j] = (u16)i;
+
+ /* When multiple overflows occur, they are always sequential and in
+ ** sorted order. This invariants arise because multiple overflows can
+ ** only occur when inserting divider cells into the parent page during
+ ** balancing, and the dividers are adjacent and sorted.
+ */
+ assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */
+ assert( j==0 || i==pPage->aiOvfl[j-1]+1 ); /* Overflows are sequential */
+ }else{
+ int rc = sqlite3PagerWrite(pPage->pDbPage);
+ if( NEVER(rc!=SQLITE_OK) ){
+ return rc;
+ }
+ assert( sqlite3PagerIswriteable(pPage->pDbPage) );
+ data = pPage->aData;
+ assert( &data[pPage->cellOffset]==pPage->aCellIdx );
+ rc = allocateSpace(pPage, sz, &idx);
+ if( rc ){ return rc; }
+ /* The allocateSpace() routine guarantees the following properties
+ ** if it returns successfully */
+ assert( idx >= 0 );
+ assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB );
+ assert( idx+sz <= (int)pPage->pBt->usableSize );
+ pPage->nFree -= (u16)(2 + sz);
+ /* In a corrupt database where an entry in the cell index section of
+ ** a btree page has a value of 3 or less, the pCell value might point
+ ** as many as 4 bytes in front of the start of the aData buffer for
+ ** the source page. Make sure this does not cause problems by not
+ ** reading the first 4 bytes */
+ memcpy(&data[idx+4], pCell+4, sz-4);
+ put4byte(&data[idx], iChild);
+ pIns = pPage->aCellIdx + i*2;
+ memmove(pIns+2, pIns, 2*(pPage->nCell - i));
+ put2byte(pIns, idx);
+ pPage->nCell++;
+ /* increment the cell count */
+ if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++;
+ assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB );
+#ifndef SQLITE_OMIT_AUTOVACUUM
+ if( pPage->pBt->autoVacuum ){
+ int rc2 = SQLITE_OK;
+ /* The cell may contain a pointer to an overflow page. If so, write
+ ** the entry for the overflow page into the pointer map.
+ */
+ ptrmapPutOvflPtr(pPage, pPage, pCell, &rc2);
+ if( rc2 ) return rc2;
}
+#endif
+ }
+ return SQLITE_OK;
+}
+
+/*
+** This variant of insertCell() assumes that the pTemp and iChild
+** parameters are both zero. Use this variant in sqlite3BtreeInsert()
+** for performance improvement, and also so that this variant is only
+** called from that one place, and is thus inlined, and thus runs must
+** faster.
+**
+** Fixes or enhancements to this routine should be reflected into
+** the insertCell() routine.
+*/
+static int insertCellFast(
+ MemPage *pPage, /* Page into which we are copying */
+ int i, /* New cell becomes the i-th cell of the page */
+ u8 *pCell, /* Content of the new cell */
+ int sz /* Bytes of content in pCell */
+){
+ int idx = 0; /* Where to write new cell content in data[] */
+ int j; /* Loop counter */
+ u8 *data; /* The content of the whole page */
+ u8 *pIns; /* The point in pPage->aCellIdx[] where no cell inserted */
+
+ assert( i>=0 && i<=pPage->nCell+pPage->nOverflow );
+ assert( MX_CELL(pPage->pBt)<=10921 );
+ assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB );
+ assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) );
+ assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) );
+ assert( sqlite3_mutex_held(pPage->pBt->mutex) );
+ assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB );
+ assert( pPage->nFree>=0 );
+ assert( pPage->nOverflow==0 );
+ if( sz+2>pPage->nFree ){
j = pPage->nOverflow++;
/* Comparison against ArraySize-1 since we hold back one extra slot
** as a contingency. In other words, never need more than 3 overflow
@@ -72263,31 +75974,20 @@ static void insertCell(
}else{
int rc = sqlite3PagerWrite(pPage->pDbPage);
if( rc!=SQLITE_OK ){
- *pRC = rc;
- return;
+ return rc;
}
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
data = pPage->aData;
assert( &data[pPage->cellOffset]==pPage->aCellIdx );
rc = allocateSpace(pPage, sz, &idx);
- if( rc ){ *pRC = rc; return; }
+ if( rc ){ return rc; }
/* The allocateSpace() routine guarantees the following properties
** if it returns successfully */
assert( idx >= 0 );
assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB );
assert( idx+sz <= (int)pPage->pBt->usableSize );
pPage->nFree -= (u16)(2 + sz);
- if( iChild ){
- /* In a corrupt database where an entry in the cell index section of
- ** a btree page has a value of 3 or less, the pCell value might point
- ** as many as 4 bytes in front of the start of the aData buffer for
- ** the source page. Make sure this does not cause problems by not
- ** reading the first 4 bytes */
- memcpy(&data[idx+4], pCell+4, sz-4);
- put4byte(&data[idx], iChild);
- }else{
- memcpy(&data[idx], pCell, sz);
- }
+ memcpy(&data[idx], pCell, sz);
pIns = pPage->aCellIdx + i*2;
memmove(pIns+2, pIns, 2*(pPage->nCell - i));
put2byte(pIns, idx);
@@ -72297,13 +75997,16 @@ static void insertCell(
assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB );
#ifndef SQLITE_OMIT_AUTOVACUUM
if( pPage->pBt->autoVacuum ){
+ int rc2 = SQLITE_OK;
/* The cell may contain a pointer to an overflow page. If so, write
** the entry for the overflow page into the pointer map.
*/
- ptrmapPutOvflPtr(pPage, pPage, pCell, pRC);
+ ptrmapPutOvflPtr(pPage, pPage, pCell, &rc2);
+ if( rc2 ) return rc2;
}
#endif
}
+ return SQLITE_OK;
}
/*
@@ -72404,14 +76107,16 @@ struct CellArray {
** computed.
*/
static void populateCellCache(CellArray *p, int idx, int N){
+ MemPage *pRef = p->pRef;
+ u16 *szCell = p->szCell;
assert( idx>=0 && idx+N<=p->nCell );
while( N>0 ){
assert( p->apCell[idx]!=0 );
- if( p->szCell[idx]==0 ){
- p->szCell[idx] = p->pRef->xCellSize(p->pRef, p->apCell[idx]);
+ if( szCell[idx]==0 ){
+ szCell[idx] = pRef->xCellSize(pRef, p->apCell[idx]);
}else{
assert( CORRUPT_DB ||
- p->szCell[idx]==p->pRef->xCellSize(p->pRef, p->apCell[idx]) );
+ szCell[idx]==pRef->xCellSize(pRef, p->apCell[idx]) );
}
idx++;
N--;
@@ -72611,39 +76316,50 @@ static int pageFreeArray(
u8 * const pEnd = &aData[pPg->pBt->usableSize];
u8 * const pStart = &aData[pPg->hdrOffset + 8 + pPg->childPtrSize];
int nRet = 0;
- int i;
+ int i, j;
int iEnd = iFirst + nCell;
- u8 *pFree = 0;
- int szFree = 0;
+ int nFree = 0;
+ int aOfst[10];
+ int aAfter[10];
for(i=iFirst; i<iEnd; i++){
u8 *pCell = pCArray->apCell[i];
if( SQLITE_WITHIN(pCell, pStart, pEnd) ){
int sz;
+ int iAfter;
+ int iOfst;
/* No need to use cachedCellSize() here. The sizes of all cells that
** are to be freed have already been computing while deciding which
** cells need freeing */
sz = pCArray->szCell[i]; assert( sz>0 );
- if( pFree!=(pCell + sz) ){
- if( pFree ){
- assert( pFree>aData && (pFree - aData)<65536 );
- freeSpace(pPg, (u16)(pFree - aData), szFree);
- }
- pFree = pCell;
- szFree = sz;
- if( pFree+sz>pEnd ){
- return 0;
+ iOfst = (u16)(pCell - aData);
+ iAfter = iOfst+sz;
+ for(j=0; j<nFree; j++){
+ if( aOfst[j]==iAfter ){
+ aOfst[j] = iOfst;
+ break;
+ }else if( aAfter[j]==iOfst ){
+ aAfter[j] = iAfter;
+ break;
}
- }else{
- pFree = pCell;
- szFree += sz;
+ }
+ if( j>=nFree ){
+ if( nFree>=(int)(sizeof(aOfst)/sizeof(aOfst[0])) ){
+ for(j=0; j<nFree; j++){
+ freeSpace(pPg, aOfst[j], aAfter[j]-aOfst[j]);
+ }
+ nFree = 0;
+ }
+ aOfst[nFree] = iOfst;
+ aAfter[nFree] = iAfter;
+ if( &aData[iAfter]>pEnd ) return 0;
+ nFree++;
}
nRet++;
}
}
- if( pFree ){
- assert( pFree>aData && (pFree - aData)<65536 );
- freeSpace(pPg, (u16)(pFree - aData), szFree);
+ for(j=0; j<nFree; j++){
+ freeSpace(pPg, aOfst[j], aAfter[j]-aOfst[j]);
}
return nRet;
}
@@ -72696,8 +76412,9 @@ static int editPage(
nCell -= nTail;
}
- pData = &aData[get2byteNotZero(&aData[hdr+5])];
+ pData = &aData[get2byte(&aData[hdr+5])];
if( pData<pBegin ) goto editpage_fail;
+ if( NEVER(pData>pPg->aDataEnd) ) goto editpage_fail;
/* Add cells to the start of the page */
if( iNew<iOld ){
@@ -72841,7 +76558,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){
** be marked as dirty. Returning an error code will cause a
** rollback, undoing any changes made to the parent page.
*/
- if( ISAUTOVACUUM ){
+ if( ISAUTOVACUUM(pBt) ){
ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc);
if( szCell>pNew->minLocal ){
ptrmapPutOvflPtr(pNew, pNew, pCell, &rc);
@@ -72869,8 +76586,8 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){
/* Insert the new divider cell into pParent. */
if( rc==SQLITE_OK ){
- insertCell(pParent, pParent->nCell, pSpace, (int)(pOut-pSpace),
- 0, pPage->pgno, &rc);
+ rc = insertCell(pParent, pParent->nCell, pSpace, (int)(pOut-pSpace),
+ 0, pPage->pgno);
}
/* Set the right-child pointer of pParent to point to the new page. */
@@ -72979,7 +76696,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){
/* If this is an auto-vacuum database, update the pointer-map entries
** for any b-tree or overflow pages that pTo now contains the pointers to.
*/
- if( ISAUTOVACUUM ){
+ if( ISAUTOVACUUM(pBt) ){
*pRC = setChildPtrmaps(pTo);
}
}
@@ -73057,13 +76774,10 @@ static int balance_nonroot(
Pgno pgno; /* Temp var to store a page number in */
u8 abDone[NB+2]; /* True after i'th new page is populated */
Pgno aPgno[NB+2]; /* Page numbers of new pages before shuffling */
- Pgno aPgOrder[NB+2]; /* Copy of aPgno[] used for sorting pages */
- u16 aPgFlags[NB+2]; /* flags field of new pages before shuffling */
- CellArray b; /* Parsed information on cells being balanced */
+ CellArray b; /* Parsed information on cells being balanced */
memset(abDone, 0, sizeof(abDone));
- b.nCell = 0;
- b.apCell = 0;
+ memset(&b, 0, sizeof(b));
pBt = pParent->pBt;
assert( sqlite3_mutex_held(pBt->mutex) );
assert( sqlite3PagerIswriteable(pParent->pDbPage) );
@@ -73128,6 +76842,7 @@ static int balance_nonroot(
goto balance_cleanup;
}
}
+ nMaxCells += apOld[i]->nCell + ArraySize(pParent->apOvfl);
if( (i--)==0 ) break;
if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){
@@ -73169,7 +76884,6 @@ static int balance_nonroot(
/* Make nMaxCells a multiple of 4 in order to preserve 8-byte
** alignment */
- nMaxCells = nOld*(MX_CELL(pBt) + ArraySize(pParent->apOvfl));
nMaxCells = (nMaxCells + 3)&~3;
/*
@@ -73406,15 +77120,17 @@ static int balance_nonroot(
d = r + 1 - leafData;
(void)cachedCellSize(&b, d);
do{
+ int szR, szD;
assert( d<nMaxCells );
assert( r<nMaxCells );
- (void)cachedCellSize(&b, r);
+ szR = cachedCellSize(&b, r);
+ szD = b.szCell[d];
if( szRight!=0
- && (bBulk || szRight+b.szCell[d]+2 > szLeft-(b.szCell[r]+(i==k-1?0:2)))){
+ && (bBulk || szRight+szD+2 > szLeft-(szR+(i==k-1?0:2)))){
break;
}
- szRight += b.szCell[d] + 2;
- szLeft -= b.szCell[r] + 2;
+ szRight += szD + 2;
+ szLeft -= szR + 2;
cntNew[i-1] = r;
r--;
d--;
@@ -73435,7 +77151,7 @@ static int balance_nonroot(
** that page.
*/
assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) || CORRUPT_DB);
- TRACE(("BALANCE: old: %d(nc=%d) %d(nc=%d) %d(nc=%d)\n",
+ TRACE(("BALANCE: old: %u(nc=%u) %u(nc=%u) %u(nc=%u)\n",
apOld[0]->pgno, apOld[0]->nCell,
nOld>=2 ? apOld[1]->pgno : 0, nOld>=2 ? apOld[1]->nCell : 0,
nOld>=3 ? apOld[2]->pgno : 0, nOld>=3 ? apOld[2]->nCell : 0
@@ -73452,7 +77168,9 @@ static int balance_nonroot(
apOld[i] = 0;
rc = sqlite3PagerWrite(pNew->pDbPage);
nNew++;
- if( sqlite3PagerPageRefcount(pNew->pDbPage)!=1+(i==(iParentIdx-nxDiv)) ){
+ if( sqlite3PagerPageRefcount(pNew->pDbPage)!=1+(i==(iParentIdx-nxDiv))
+ && rc==SQLITE_OK
+ ){
rc = SQLITE_CORRUPT_BKPT;
}
if( rc ) goto balance_cleanup;
@@ -73466,7 +77184,7 @@ static int balance_nonroot(
cntOld[i] = b.nCell;
/* Set the pointer-map entry for the new sibling page. */
- if( ISAUTOVACUUM ){
+ if( ISAUTOVACUUM(pBt) ){
ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc);
if( rc!=SQLITE_OK ){
goto balance_cleanup;
@@ -73481,47 +77199,44 @@ static int balance_nonroot(
** of the table is closer to a linear scan through the file. That in turn
** helps the operating system to deliver pages from the disk more rapidly.
**
- ** An O(n^2) insertion sort algorithm is used, but since n is never more
- ** than (NB+2) (a small constant), that should not be a problem.
+ ** An O(N*N) sort algorithm is used, but since N is never more than NB+2
+ ** (5), that is not a performance concern.
**
** When NB==3, this one optimization makes the database about 25% faster
** for large insertions and deletions.
*/
for(i=0; i<nNew; i++){
- aPgOrder[i] = aPgno[i] = apNew[i]->pgno;
- aPgFlags[i] = apNew[i]->pDbPage->flags;
- for(j=0; j<i; j++){
- if( NEVER(aPgno[j]==aPgno[i]) ){
- /* This branch is taken if the set of sibling pages somehow contains
- ** duplicate entries. This can happen if the database is corrupt.
- ** It would be simpler to detect this as part of the loop below, but
- ** we do the detection here in order to avoid populating the pager
- ** cache with two separate objects associated with the same
- ** page number. */
- assert( CORRUPT_DB );
- rc = SQLITE_CORRUPT_BKPT;
- goto balance_cleanup;
- }
- }
+ aPgno[i] = apNew[i]->pgno;
+ assert( apNew[i]->pDbPage->flags & PGHDR_WRITEABLE );
+ assert( apNew[i]->pDbPage->flags & PGHDR_DIRTY );
}
- for(i=0; i<nNew; i++){
- int iBest = 0; /* aPgno[] index of page number to use */
- for(j=1; j<nNew; j++){
- if( aPgOrder[j]<aPgOrder[iBest] ) iBest = j;
- }
- pgno = aPgOrder[iBest];
- aPgOrder[iBest] = 0xffffffff;
- if( iBest!=i ){
- if( iBest>i ){
- sqlite3PagerRekey(apNew[iBest]->pDbPage, pBt->nPage+iBest+1, 0);
- }
- sqlite3PagerRekey(apNew[i]->pDbPage, pgno, aPgFlags[iBest]);
- apNew[i]->pgno = pgno;
+ for(i=0; i<nNew-1; i++){
+ int iB = i;
+ for(j=i+1; j<nNew; j++){
+ if( apNew[j]->pgno < apNew[iB]->pgno ) iB = j;
}
- }
- TRACE(("BALANCE: new: %d(%d nc=%d) %d(%d nc=%d) %d(%d nc=%d) "
- "%d(%d nc=%d) %d(%d nc=%d)\n",
+ /* If apNew[i] has a page number that is bigger than any of the
+ ** subsequence apNew[i] entries, then swap apNew[i] with the subsequent
+ ** entry that has the smallest page number (which we know to be
+ ** entry apNew[iB]).
+ */
+ if( iB!=i ){
+ Pgno pgnoA = apNew[i]->pgno;
+ Pgno pgnoB = apNew[iB]->pgno;
+ Pgno pgnoTemp = (PENDING_BYTE/pBt->pageSize)+1;
+ u16 fgA = apNew[i]->pDbPage->flags;
+ u16 fgB = apNew[iB]->pDbPage->flags;
+ sqlite3PagerRekey(apNew[i]->pDbPage, pgnoTemp, fgB);
+ sqlite3PagerRekey(apNew[iB]->pDbPage, pgnoA, fgA);
+ sqlite3PagerRekey(apNew[i]->pDbPage, pgnoB, fgB);
+ apNew[i]->pgno = pgnoB;
+ apNew[iB]->pgno = pgnoA;
+ }
+ }
+
+ TRACE(("BALANCE: new: %u(%u nc=%u) %u(%u nc=%u) %u(%u nc=%u) "
+ "%u(%u nc=%u) %u(%u nc=%u)\n",
apNew[0]->pgno, szNew[0], cntNew[0],
nNew>=2 ? apNew[1]->pgno : 0, nNew>=2 ? szNew[1] : 0,
nNew>=2 ? cntNew[1] - cntNew[0] - !leafData : 0,
@@ -73562,7 +77277,7 @@ static int balance_nonroot(
** updated. This happens below, after the sibling pages have been
** populated, not here.
*/
- if( ISAUTOVACUUM ){
+ if( ISAUTOVACUUM(pBt) ){
MemPage *pOld;
MemPage *pNew = pOld = apNew[0];
int cntOldNext = pNew->nCell + pNew->nOverflow;
@@ -73653,13 +77368,13 @@ static int balance_nonroot(
iOvflSpace += sz;
assert( sz<=pBt->maxLocal+23 );
assert( iOvflSpace <= (int)pBt->pageSize );
- for(k=0; b.ixNx[k]<=i && ALWAYS(k<NB*2); k++){}
+ for(k=0; b.ixNx[k]<=j && ALWAYS(k<NB*2); k++){}
pSrcEnd = b.apEnd[k];
if( SQLITE_WITHIN(pSrcEnd, pCell, pCell+sz) ){
rc = SQLITE_CORRUPT_BKPT;
goto balance_cleanup;
}
- insertCell(pParent, nxDiv+i, pCell, sz, pTemp, pNew->pgno, &rc);
+ rc = insertCell(pParent, nxDiv+i, pCell, sz, pTemp, pNew->pgno);
if( rc!=SQLITE_OK ) goto balance_cleanup;
assert( sqlite3PagerIswriteable(pParent->pDbPage) );
}
@@ -73755,7 +77470,7 @@ static int balance_nonroot(
);
copyNodeContent(apNew[0], pParent, &rc);
freePage(apNew[0], &rc);
- }else if( ISAUTOVACUUM && !leafCorrection ){
+ }else if( ISAUTOVACUUM(pBt) && !leafCorrection ){
/* Fix the pointer map entries associated with the right-child of each
** sibling page. All other pointer map entries have already been taken
** care of. */
@@ -73766,7 +77481,7 @@ static int balance_nonroot(
}
assert( pParent->isInit );
- TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n",
+ TRACE(("BALANCE: finished: old=%u new=%u cells=%u\n",
nOld, nNew, b.nCell));
/* Free any old pages that were not reused as new pages.
@@ -73776,7 +77491,7 @@ static int balance_nonroot(
}
#if 0
- if( ISAUTOVACUUM && rc==SQLITE_OK && apNew[0]->isInit ){
+ if( ISAUTOVACUUM(pBt) && rc==SQLITE_OK && apNew[0]->isInit ){
/* The ptrmapCheckPages() contains assert() statements that verify that
** all pointer map pages are set correctly. This is helpful while
** debugging. This is usually disabled because a corrupt database may
@@ -73838,7 +77553,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){
if( rc==SQLITE_OK ){
rc = allocateBtreePage(pBt,&pChild,&pgnoChild,pRoot->pgno,0);
copyNodeContent(pRoot, pChild, &rc);
- if( ISAUTOVACUUM ){
+ if( ISAUTOVACUUM(pBt) ){
ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc);
}
}
@@ -73851,7 +77566,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){
assert( sqlite3PagerIswriteable(pRoot->pDbPage) );
assert( pChild->nCell==pRoot->nCell || CORRUPT_DB );
- TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno));
+ TRACE(("BALANCE: copy root %u into %u\n", pRoot->pgno, pChild->pgno));
/* Copy the overflow cells from pRoot to pChild */
memcpy(pChild->aiOvfl, pRoot->aiOvfl,
@@ -73872,7 +77587,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){
** Return SQLITE_CORRUPT if any cursor other than pCur is currently valid
** on the same B-tree as pCur.
**
-** This can if a database is corrupt with two or more SQL tables
+** This can occur if a database is corrupt with two or more SQL tables
** pointing to the same b-tree. If an insert occurs on one SQL table
** and causes a BEFORE TRIGGER to do a secondary insert on the other SQL
** table linked to the same b-tree. If the secondary insert causes a
@@ -73904,7 +77619,6 @@ static int anotherValidCursor(BtCursor *pCur){
*/
static int balance(BtCursor *pCur){
int rc = SQLITE_OK;
- const int nMin = pCur->pBt->usableSize * 2 / 3;
u8 aBalanceQuickSpace[13];
u8 *pFree = 0;
@@ -73916,7 +77630,11 @@ static int balance(BtCursor *pCur){
MemPage *pPage = pCur->pPage;
if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break;
- if( pPage->nOverflow==0 && pPage->nFree<=nMin ){
+ if( pPage->nOverflow==0 && pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){
+ /* No rebalance required as long as:
+ ** (1) There are no overflow cells
+ ** (2) The amount of free space on the page is less than 2/3rds of
+ ** the total usable space on the page. */
break;
}else if( (iPage = pCur->iPage)==0 ){
if( pPage->nOverflow && (rc = anotherValidCursor(pCur))==SQLITE_OK ){
@@ -73939,6 +77657,11 @@ static int balance(BtCursor *pCur){
}else{
break;
}
+ }else if( sqlite3PagerPageRefcount(pPage->pDbPage)>1 ){
+ /* The page being written is not a root page, and there is currently
+ ** more than one reference to it. This only happens if the page is one
+ ** of its own ancestor pages. Corruption. */
+ rc = SQLITE_CORRUPT_BKPT;
}else{
MemPage * const pParent = pCur->apPage[iPage-1];
int const iIdx = pCur->aiIdx[iPage-1];
@@ -74069,9 +77792,13 @@ static int btreeOverwriteContent(
/*
** Overwrite the cell that cursor pCur is pointing to with fresh content
-** contained in pX.
+** contained in pX. In this variant, pCur is pointing to an overflow
+** cell.
*/
-static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
+static SQLITE_NOINLINE int btreeOverwriteOverflowCell(
+ BtCursor *pCur, /* Cursor pointing to cell to ovewrite */
+ const BtreePayload *pX /* Content to write into the cell */
+){
int iOffset; /* Next byte of pX->pData to write */
int nTotal = pX->nData + pX->nZero; /* Total bytes of to write */
int rc; /* Return code */
@@ -74080,16 +77807,12 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
Pgno ovflPgno; /* Next overflow page to write */
u32 ovflPageSize; /* Size to write on overflow page */
- if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd
- || pCur->info.pPayload < pPage->aData + pPage->cellOffset
- ){
- return SQLITE_CORRUPT_BKPT;
- }
+ assert( pCur->info.nLocal<nTotal ); /* pCur is an overflow cell */
+
/* Overwrite the local portion first */
rc = btreeOverwriteContent(pPage, pCur->info.pPayload, pX,
0, pCur->info.nLocal);
if( rc ) return rc;
- if( pCur->info.nLocal==nTotal ) return SQLITE_OK;
/* Now overwrite the overflow pages */
iOffset = pCur->info.nLocal;
@@ -74101,7 +77824,7 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
do{
rc = btreeGetPage(pBt, ovflPgno, &pPage, 0);
if( rc ) return rc;
- if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 ){
+ if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || pPage->isInit ){
rc = SQLITE_CORRUPT_BKPT;
}else{
if( iOffset+ovflPageSize<(u32)nTotal ){
@@ -74119,6 +77842,29 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
return SQLITE_OK;
}
+/*
+** Overwrite the cell that cursor pCur is pointing to with fresh content
+** contained in pX.
+*/
+static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
+ int nTotal = pX->nData + pX->nZero; /* Total bytes of to write */
+ MemPage *pPage = pCur->pPage; /* Page being written */
+
+ if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd
+ || pCur->info.pPayload < pPage->aData + pPage->cellOffset
+ ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ if( pCur->info.nLocal==nTotal ){
+ /* The entire cell is local */
+ return btreeOverwriteContent(pPage, pCur->info.pPayload, pX,
+ 0, pCur->info.nLocal);
+ }else{
+ /* The cell contains overflow content */
+ return btreeOverwriteOverflowCell(pCur, pX);
+ }
+}
+
/*
** Insert a new record into the BTree. The content of the new record
@@ -74136,7 +77882,7 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
** pX.pData,nData,nZero fields must be zero.
**
** If the seekResult parameter is non-zero, then a successful call to
-** MovetoUnpacked() to seek cursor pCur to (pKey,nKey) has already
+** sqlite3BtreeIndexMoveto() to seek cursor pCur to (pKey,nKey) has already
** been performed. In other words, if seekResult!=0 then the cursor
** is currently pointing to a cell that will be adjacent to the cell
** to be inserted. If seekResult<0 then pCur points to a cell that is
@@ -74154,7 +77900,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
BtCursor *pCur, /* Insert data into the table of this cursor */
const BtreePayload *pX, /* Content of the row to be inserted */
int flags, /* True if this is likely an append */
- int seekResult /* Result of prior MovetoUnpacked() call */
+ int seekResult /* Result of prior IndexMoveto() call */
){
int rc;
int loc = seekResult; /* -1: before desired location +1: after */
@@ -74162,31 +77908,12 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
int idx;
MemPage *pPage;
Btree *p = pCur->pBtree;
- BtShared *pBt = p->pBt;
unsigned char *oldCell;
unsigned char *newCell = 0;
assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND|BTREE_PREFORMAT))==flags );
assert( (flags & BTREE_PREFORMAT)==0 || seekResult || pCur->pKeyInfo==0 );
- if( pCur->eState==CURSOR_FAULT ){
- assert( pCur->skipNext!=SQLITE_OK );
- return pCur->skipNext;
- }
-
- assert( cursorOwnsBtShared(pCur) );
- assert( (pCur->curFlags & BTCF_WriteFlag)!=0
- && pBt->inTransaction==TRANS_WRITE
- && (pBt->btsFlags & BTS_READ_ONLY)==0 );
- assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
-
- /* Assert that the caller has been consistent. If this cursor was opened
- ** expecting an index b-tree, then the caller should be inserting blob
- ** keys with no associated data. If the cursor was opened expecting an
- ** intkey table, the caller should be inserting integer keys with a
- ** blob of associated data. */
- assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) );
-
/* Save the positions of any other cursors open on this table.
**
** In some cases, the call to btreeMoveto() below is a no-op. For
@@ -74199,7 +77926,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
** not to clear the cursor here.
*/
if( pCur->curFlags & BTCF_Multiple ){
- rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur);
+ rc = saveAllCursors(p->pBt, pCur->pgnoRoot, pCur);
if( rc ) return rc;
if( loc && pCur->iPage<0 ){
/* This can only happen if the schema is corrupt such that there is more
@@ -74211,6 +77938,29 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
}
}
+ /* Ensure that the cursor is not in the CURSOR_FAULT state and that it
+ ** points to a valid cell.
+ */
+ if( pCur->eState>=CURSOR_REQUIRESEEK ){
+ testcase( pCur->eState==CURSOR_REQUIRESEEK );
+ testcase( pCur->eState==CURSOR_FAULT );
+ rc = moveToRoot(pCur);
+ if( rc && rc!=SQLITE_EMPTY ) return rc;
+ }
+
+ assert( cursorOwnsBtShared(pCur) );
+ assert( (pCur->curFlags & BTCF_WriteFlag)!=0
+ && p->pBt->inTransaction==TRANS_WRITE
+ && (p->pBt->btsFlags & BTS_READ_ONLY)==0 );
+ assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
+
+ /* Assert that the caller has been consistent. If this cursor was opened
+ ** expecting an index b-tree, then the caller should be inserting blob
+ ** keys with no associated data. If the cursor was opened expecting an
+ ** intkey table, the caller should be inserting integer keys with a
+ ** blob of associated data. */
+ assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) );
+
if( pCur->pKeyInfo==0 ){
assert( pX->pKey==0 );
/* If this is an insert into a table b-tree, invalidate any incrblob
@@ -74250,7 +78000,8 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
** to an adjacent cell. Move the cursor so that it is pointing either
** to the cell to be overwritten or an adjacent cell.
*/
- rc = sqlite3BtreeMovetoUnpacked(pCur, 0, pX->nKey, flags!=0, &loc);
+ rc = sqlite3BtreeTableMoveto(pCur, pX->nKey,
+ (flags & BTREE_APPEND)!=0, &loc);
if( rc ) return rc;
}
}else{
@@ -74273,13 +78024,11 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
r.aMem = pX->aMem;
r.nField = pX->nMem;
r.default_rc = 0;
- r.errCode = 0;
- r.r1 = 0;
- r.r2 = 0;
r.eqSeen = 0;
- rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, flags!=0, &loc);
+ rc = sqlite3BtreeIndexMoveto(pCur, &r, &loc);
}else{
- rc = btreeMoveto(pCur, pX->pKey, pX->nKey, flags!=0, &loc);
+ rc = btreeMoveto(pCur, pX->pKey, pX->nKey,
+ (flags & BTREE_APPEND)!=0, &loc);
}
if( rc ) return rc;
}
@@ -74300,14 +78049,14 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
}
}
assert( pCur->eState==CURSOR_VALID
- || (pCur->eState==CURSOR_INVALID && loc)
- || CORRUPT_DB );
+ || (pCur->eState==CURSOR_INVALID && loc) || CORRUPT_DB );
pPage = pCur->pPage;
assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) );
assert( pPage->leaf || !pPage->intKey );
if( pPage->nFree<0 ){
if( NEVER(pCur->eState>CURSOR_INVALID) ){
+ /* ^^^^^--- due to the moveToRoot() call above */
rc = SQLITE_CORRUPT_BKPT;
}else{
rc = btreeComputeFreeSpace(pPage);
@@ -74315,34 +78064,40 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
if( rc ) return rc;
}
- TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n",
+ TRACE(("INSERT: table=%u nkey=%lld ndata=%u page=%u %s\n",
pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno,
loc==0 ? "overwrite" : "new entry"));
- assert( pPage->isInit );
- newCell = pBt->pTmpSpace;
+ assert( pPage->isInit || CORRUPT_DB );
+ newCell = p->pBt->pTmpSpace;
assert( newCell!=0 );
+ assert( BTREE_PREFORMAT==OPFLAG_PREFORMAT );
if( flags & BTREE_PREFORMAT ){
rc = SQLITE_OK;
- szNew = pBt->nPreformatSize;
+ szNew = p->pBt->nPreformatSize;
if( szNew<4 ) szNew = 4;
- if( ISAUTOVACUUM && szNew>pPage->maxLocal ){
+ if( ISAUTOVACUUM(p->pBt) && szNew>pPage->maxLocal ){
CellInfo info;
pPage->xParseCell(pPage, newCell, &info);
if( info.nPayload!=info.nLocal ){
Pgno ovfl = get4byte(&newCell[szNew-4]);
- ptrmapPut(pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, &rc);
+ ptrmapPut(p->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, &rc);
+ if( NEVER(rc) ) goto end_insert;
}
}
}else{
rc = fillInCell(pPage, newCell, pX, &szNew);
+ if( rc ) goto end_insert;
}
- if( rc ) goto end_insert;
assert( szNew==pPage->xCellSize(pPage, newCell) );
- assert( szNew <= MX_CELL_SIZE(pBt) );
+ assert( szNew <= MX_CELL_SIZE(p->pBt) );
idx = pCur->ix;
+ pCur->info.nSize = 0;
if( loc==0 ){
CellInfo info;
- assert( idx<pPage->nCell );
+ assert( idx>=0 );
+ if( idx>=pPage->nCell ){
+ return SQLITE_CORRUPT_BKPT;
+ }
rc = sqlite3PagerWrite(pPage->pDbPage);
if( rc ){
goto end_insert;
@@ -74355,7 +78110,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
testcase( pCur->curFlags & BTCF_ValidOvfl );
invalidateOverflowCache(pCur);
if( info.nSize==szNew && info.nLocal==info.nPayload
- && (!ISAUTOVACUUM || szNew<pPage->minLocal)
+ && (!ISAUTOVACUUM(p->pBt) || szNew<pPage->minLocal)
){
/* Overwrite the old cell with the new if they are the same size.
** We could also try to do this if the old cell is smaller, then add
@@ -74385,7 +78140,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
}else{
assert( pPage->leaf );
}
- insertCell(pPage, idx, newCell, szNew, 0, 0, &rc);
+ rc = insertCellFast(pPage, idx, newCell, szNew);
assert( pPage->nOverflow==0 || rc==SQLITE_OK );
assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 );
@@ -74409,7 +78164,6 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
** larger than the largest existing key, it is possible to insert the
** row without seeking the cursor. This can be a big performance boost.
*/
- pCur->info.nSize = 0;
if( pPage->nOverflow ){
assert( rc==SQLITE_OK );
pCur->curFlags &= ~(BTCF_ValidNKey);
@@ -74458,7 +78212,6 @@ end_insert:
** SQLITE_OK is returned if successful, or an SQLite error code otherwise.
*/
SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 iKey){
- int rc = SQLITE_OK;
BtShared *pBt = pDest->pBt;
u8 *aOut = pBt->pTmpSpace; /* Pointer to next output buffer */
const u8 *aIn; /* Pointer to next input buffer */
@@ -74466,7 +78219,11 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64
u32 nRem; /* Bytes of data still to copy */
getCellInfo(pSrc);
- aOut += putVarint32(aOut, pSrc->info.nPayload);
+ if( pSrc->info.nPayload<0x80 ){
+ *(aOut++) = pSrc->info.nPayload;
+ }else{
+ aOut += sqlite3PutVarint(aOut, pSrc->info.nPayload);
+ }
if( pDest->pKeyInfo==0 ) aOut += putVarint(aOut, iKey);
nIn = pSrc->info.nLocal;
aIn = pSrc->info.pPayload;
@@ -74477,7 +78234,9 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64
if( nIn==nRem && nIn<pDest->pPage->maxLocal ){
memcpy(aOut, aIn, nIn);
pBt->nPreformatSize = nIn + (aOut - pBt->pTmpSpace);
+ return SQLITE_OK;
}else{
+ int rc = SQLITE_OK;
Pager *pSrcPager = pSrc->pBt->pPager;
u8 *pPgnoOut = 0;
Pgno ovflIn = 0;
@@ -74524,12 +78283,12 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64
}
}while( rc==SQLITE_OK && nOut>0 );
- if( rc==SQLITE_OK && nRem>0 ){
+ if( rc==SQLITE_OK && nRem>0 && ALWAYS(pPgnoOut) ){
Pgno pgnoNew;
MemPage *pNew = 0;
rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0);
put4byte(pPgnoOut, pgnoNew);
- if( ISAUTOVACUUM && pPageOut ){
+ if( ISAUTOVACUUM(pBt) && pPageOut ){
ptrmapPut(pBt, pgnoNew, PTRMAP_OVERFLOW2, pPageOut->pgno, &rc);
}
releasePage(pPageOut);
@@ -74545,9 +78304,8 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64
releasePage(pPageOut);
sqlite3PagerUnref(pPageIn);
+ return rc;
}
-
- return rc;
}
/*
@@ -74570,14 +78328,13 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64
SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
Btree *p = pCur->pBtree;
BtShared *pBt = p->pBt;
- int rc; /* Return code */
- MemPage *pPage; /* Page to delete cell from */
- unsigned char *pCell; /* Pointer to cell to delete */
- int iCellIdx; /* Index of cell to delete */
- int iCellDepth; /* Depth of node containing pCell */
- CellInfo info; /* Size of the cell being deleted */
- int bSkipnext = 0; /* Leaf cursor in SKIPNEXT state */
- u8 bPreserve = flags & BTREE_SAVEPOSITION; /* Keep cursor valid */
+ int rc; /* Return code */
+ MemPage *pPage; /* Page to delete cell from */
+ unsigned char *pCell; /* Pointer to cell to delete */
+ int iCellIdx; /* Index of cell to delete */
+ int iCellDepth; /* Depth of node containing pCell */
+ CellInfo info; /* Size of the cell being deleted */
+ u8 bPreserve; /* Keep cursor valid. 2 for CURSOR_SKIPNEXT */
assert( cursorOwnsBtShared(pCur) );
assert( pBt->inTransaction==TRANS_WRITE );
@@ -74586,31 +78343,52 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
assert( !hasReadConflicts(p, pCur->pgnoRoot) );
assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 );
- if( pCur->eState==CURSOR_REQUIRESEEK ){
- rc = btreeRestoreCursorPosition(pCur);
- assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID );
- if( rc || pCur->eState!=CURSOR_VALID ) return rc;
+ if( pCur->eState!=CURSOR_VALID ){
+ if( pCur->eState>=CURSOR_REQUIRESEEK ){
+ rc = btreeRestoreCursorPosition(pCur);
+ assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID );
+ if( rc || pCur->eState!=CURSOR_VALID ) return rc;
+ }else{
+ return SQLITE_CORRUPT_BKPT;
+ }
}
- assert( CORRUPT_DB || pCur->eState==CURSOR_VALID );
+ assert( pCur->eState==CURSOR_VALID );
iCellDepth = pCur->iPage;
iCellIdx = pCur->ix;
pPage = pCur->pPage;
+ if( pPage->nCell<=iCellIdx ){
+ return SQLITE_CORRUPT_BKPT;
+ }
pCell = findCell(pPage, iCellIdx);
- if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ) return SQLITE_CORRUPT;
+ if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ if( pCell<&pPage->aCellIdx[pPage->nCell] ){
+ return SQLITE_CORRUPT_BKPT;
+ }
- /* If the bPreserve flag is set to true, then the cursor position must
+ /* If the BTREE_SAVEPOSITION bit is on, then the cursor position must
** be preserved following this delete operation. If the current delete
** will cause a b-tree rebalance, then this is done by saving the cursor
** key and leaving the cursor in CURSOR_REQUIRESEEK state before
** returning.
**
- ** Or, if the current delete will not cause a rebalance, then the cursor
+ ** If the current delete will not cause a rebalance, then the cursor
** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately
- ** before or after the deleted entry. In this case set bSkipnext to true. */
+ ** before or after the deleted entry.
+ **
+ ** The bPreserve value records which path is required:
+ **
+ ** bPreserve==0 Not necessary to save the cursor position
+ ** bPreserve==1 Use CURSOR_REQUIRESEEK to save the cursor position
+ ** bPreserve==2 Cursor won't move. Set CURSOR_SKIPNEXT.
+ */
+ bPreserve = (flags & BTREE_SAVEPOSITION)!=0;
if( bPreserve ){
if( !pPage->leaf
- || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3)
+ || (pPage->nFree+pPage->xCellSize(pPage,pCell)+2) >
+ (int)(pBt->usableSize*2/3)
|| pPage->nCell==1 /* See dbfuzz001.test for a test case */
){
/* A b-tree rebalance will be required after deleting this entry.
@@ -74618,7 +78396,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
rc = saveCursorKey(pCur);
if( rc ) return rc;
}else{
- bSkipnext = 1;
+ bPreserve = 2;
}
}
@@ -74685,7 +78463,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
assert( pTmp!=0 );
rc = sqlite3PagerWrite(pLeaf->pDbPage);
if( rc==SQLITE_OK ){
- insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc);
+ rc = insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n);
}
dropCell(pLeaf, pLeaf->nCell-1, nCell, &rc);
if( rc ) return rc;
@@ -74706,7 +78484,15 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
** been corrected, so be it. Otherwise, after balancing the leaf node,
** walk the cursor up the tree to the internal node and balance it as
** well. */
- rc = balance(pCur);
+ assert( pCur->pPage->nOverflow==0 );
+ assert( pCur->pPage->nFree>=0 );
+ if( pCur->pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){
+ /* Optimization: If the free space is less than 2/3rds of the page,
+ ** then balance() will always be a no-op. No need to invoke it. */
+ rc = SQLITE_OK;
+ }else{
+ rc = balance(pCur);
+ }
if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){
releasePageNotNull(pCur->pPage);
pCur->iPage--;
@@ -74718,8 +78504,8 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
}
if( rc==SQLITE_OK ){
- if( bSkipnext ){
- assert( bPreserve && (pCur->iPage==iCellDepth || CORRUPT_DB) );
+ if( bPreserve>1 ){
+ assert( (pCur->iPage==iCellDepth || CORRUPT_DB) );
assert( pPage==pCur->pPage || CORRUPT_DB );
assert( (pPage->nCell>0 || CORRUPT_DB) && iCellIdx<=pPage->nCell );
pCur->eState = CURSOR_SKIPNEXT;
@@ -74913,7 +78699,7 @@ static int clearDatabasePage(
BtShared *pBt, /* The BTree that contains the table */
Pgno pgno, /* Page number to clear */
int freePageFlag, /* Deallocate page if true */
- int *pnChange /* Add number of Cells freed to this counter */
+ i64 *pnChange /* Add number of Cells freed to this counter */
){
MemPage *pPage;
int rc;
@@ -74928,11 +78714,12 @@ static int clearDatabasePage(
}
rc = getAndInitPage(pBt, pgno, &pPage, 0, 0);
if( rc ) return rc;
- if( pPage->bBusy ){
+ if( (pBt->openFlags & BTREE_SINGLE)==0
+ && sqlite3PagerPageRefcount(pPage->pDbPage) != (1 + (pgno==1))
+ ){
rc = SQLITE_CORRUPT_BKPT;
goto cleardatabasepage_out;
}
- pPage->bBusy = 1;
hdr = pPage->hdrOffset;
for(i=0; i<pPage->nCell; i++){
pCell = findCell(pPage, i);
@@ -74946,6 +78733,7 @@ static int clearDatabasePage(
if( !pPage->leaf ){
rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange);
if( rc ) goto cleardatabasepage_out;
+ if( pPage->intKey ) pnChange = 0;
}
if( pnChange ){
testcase( !pPage->intKey );
@@ -74958,7 +78746,6 @@ static int clearDatabasePage(
}
cleardatabasepage_out:
- pPage->bBusy = 0;
releasePage(pPage);
return rc;
}
@@ -74975,7 +78762,7 @@ cleardatabasepage_out:
** If pnChange is not NULL, then the integer value pointed to by pnChange
** is incremented by the number of entries in the table.
*/
-SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){
+SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, i64 *pnChange){
int rc;
BtShared *pBt = p->pBt;
sqlite3BtreeEnter(p);
@@ -75037,10 +78824,10 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){
return SQLITE_CORRUPT_BKPT;
}
- rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0);
- if( rc ) return rc;
rc = sqlite3BtreeClearTable(p, iTable, 0);
- if( rc ){
+ if( rc ) return rc;
+ rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0);
+ if( NEVER(rc) ){
releasePage(pPage);
return rc;
}
@@ -75276,6 +79063,41 @@ SQLITE_PRIVATE Pager *sqlite3BtreePager(Btree *p){
#ifndef SQLITE_OMIT_INTEGRITY_CHECK
/*
+** Record an OOM error during integrity_check
+*/
+static void checkOom(IntegrityCk *pCheck){
+ pCheck->rc = SQLITE_NOMEM;
+ pCheck->mxErr = 0; /* Causes integrity_check processing to stop */
+ if( pCheck->nErr==0 ) pCheck->nErr++;
+}
+
+/*
+** Invoke the progress handler, if appropriate. Also check for an
+** interrupt.
+*/
+static void checkProgress(IntegrityCk *pCheck){
+ sqlite3 *db = pCheck->db;
+ if( AtomicLoad(&db->u1.isInterrupted) ){
+ pCheck->rc = SQLITE_INTERRUPT;
+ pCheck->nErr++;
+ pCheck->mxErr = 0;
+ }
+#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
+ if( db->xProgress ){
+ assert( db->nProgressOps>0 );
+ pCheck->nStep++;
+ if( (pCheck->nStep % db->nProgressOps)==0
+ && db->xProgress(db->pProgressArg)
+ ){
+ pCheck->rc = SQLITE_INTERRUPT;
+ pCheck->nErr++;
+ pCheck->mxErr = 0;
+ }
+ }
+#endif
+}
+
+/*
** Append a message to the error message string.
*/
static void checkAppendMsg(
@@ -75284,6 +79106,7 @@ static void checkAppendMsg(
...
){
va_list ap;
+ checkProgress(pCheck);
if( !pCheck->mxErr ) return;
pCheck->mxErr--;
pCheck->nErr++;
@@ -75292,12 +79115,13 @@ static void checkAppendMsg(
sqlite3_str_append(&pCheck->errMsg, "\n", 1);
}
if( pCheck->zPfx ){
- sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2);
+ sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx,
+ pCheck->v0, pCheck->v1, pCheck->v2);
}
sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap);
va_end(ap);
if( pCheck->errMsg.accError==SQLITE_NOMEM ){
- pCheck->bOomFault = 1;
+ checkOom(pCheck);
}
}
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
@@ -75332,14 +79156,13 @@ static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
*/
static int checkRef(IntegrityCk *pCheck, Pgno iPage){
if( iPage>pCheck->nPage || iPage==0 ){
- checkAppendMsg(pCheck, "invalid page number %d", iPage);
+ checkAppendMsg(pCheck, "invalid page number %u", iPage);
return 1;
}
if( getPageReferenced(pCheck, iPage) ){
- checkAppendMsg(pCheck, "2nd reference to page %d", iPage);
+ checkAppendMsg(pCheck, "2nd reference to page %u", iPage);
return 1;
}
- if( AtomicLoad(&pCheck->db->u1.isInterrupted) ) return 1;
setPageReferenced(pCheck, iPage);
return 0;
}
@@ -75362,14 +79185,14 @@ static void checkPtrmap(
rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent);
if( rc!=SQLITE_OK ){
- if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) pCheck->bOomFault = 1;
- checkAppendMsg(pCheck, "Failed to read ptrmap key=%d", iChild);
+ if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) checkOom(pCheck);
+ checkAppendMsg(pCheck, "Failed to read ptrmap key=%u", iChild);
return;
}
if( ePtrmapType!=eType || iPtrmapParent!=iParent ){
checkAppendMsg(pCheck,
- "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)",
+ "Bad ptr map entry key=%u expected=(%u,%u) got=(%u,%u)",
iChild, eType, iParent, ePtrmapType, iPtrmapParent);
}
}
@@ -75394,7 +79217,7 @@ static void checkList(
if( checkRef(pCheck, iPage) ) break;
N--;
if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){
- checkAppendMsg(pCheck, "failed to get page %d", iPage);
+ checkAppendMsg(pCheck, "failed to get page %u", iPage);
break;
}
pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage);
@@ -75407,7 +79230,7 @@ static void checkList(
#endif
if( n>pCheck->pBt->usableSize/4-2 ){
checkAppendMsg(pCheck,
- "freelist leaf count too big on page %d", iPage);
+ "freelist leaf count too big on page %u", iPage);
N--;
}else{
for(i=0; i<(int)n; i++){
@@ -75439,7 +79262,7 @@ static void checkList(
}
if( N && nErrAtStart==pCheck->nErr ){
checkAppendMsg(pCheck,
- "%s is %d but should be %d",
+ "%s is %u but should be %u",
isFreeList ? "size" : "overflow list length",
expected-N, expected);
}
@@ -75469,7 +79292,9 @@ static void checkList(
** lower 16 bits are the index of the last byte of that range.
*/
static void btreeHeapInsert(u32 *aHeap, u32 x){
- u32 j, i = ++aHeap[0];
+ u32 j, i;
+ assert( aHeap!=0 );
+ i = ++aHeap[0];
aHeap[i] = x;
while( (j = i/2)>0 && aHeap[j]>aHeap[i] ){
x = aHeap[j];
@@ -75546,12 +79371,14 @@ static int checkTreePage(
/* Check that the page exists
*/
+ checkProgress(pCheck);
+ if( pCheck->mxErr==0 ) goto end_of_check;
pBt = pCheck->pBt;
usableSize = pBt->usableSize;
if( iPage==0 ) return 0;
if( checkRef(pCheck, iPage) ) return 0;
- pCheck->zPfx = "Page %u: ";
- pCheck->v1 = iPage;
+ pCheck->zPfx = "Tree %u page %u: ";
+ pCheck->v0 = pCheck->v1 = iPage;
if( (rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0 ){
checkAppendMsg(pCheck,
"unable to get the page. error code=%d", rc);
@@ -75577,7 +79404,7 @@ static int checkTreePage(
hdr = pPage->hdrOffset;
/* Set up for cell analysis */
- pCheck->zPfx = "On tree page %u cell %d: ";
+ pCheck->zPfx = "Tree %u page %u cell %u: ";
contentOffset = get2byteNotZero(&data[hdr+5]);
assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */
@@ -75597,7 +79424,7 @@ static int checkTreePage(
pgno = get4byte(&data[hdr+8]);
#ifndef SQLITE_OMIT_AUTOVACUUM
if( pBt->autoVacuum ){
- pCheck->zPfx = "On page %u at right child: ";
+ pCheck->zPfx = "Tree %u page %u right child: ";
checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage);
}
#endif
@@ -75621,7 +79448,7 @@ static int checkTreePage(
pc = get2byteAligned(pCellIdx);
pCellIdx -= 2;
if( pc<contentOffset || pc>usableSize-4 ){
- checkAppendMsg(pCheck, "Offset %d out of range %d..%d",
+ checkAppendMsg(pCheck, "Offset %u out of range %u..%u",
pc, contentOffset, usableSize-4);
doCoverageCheck = 0;
continue;
@@ -75753,7 +79580,7 @@ static int checkTreePage(
*/
if( heap[0]==0 && nFrag!=data[hdr+7] ){
checkAppendMsg(pCheck,
- "Fragmentation of %d bytes reported as %d on page %u",
+ "Fragmentation of %u bytes reported as %u on page %u",
nFrag, data[hdr+7], iPage);
}
}
@@ -75791,13 +79618,14 @@ end_of_check:
** the unverified btrees. Except, if aRoot[1] is 1, then the freelist
** checks are still performed.
*/
-SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
+SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck(
sqlite3 *db, /* Database connection that is running the check */
Btree *p, /* The btree to be checked */
Pgno *aRoot, /* An array of root pages numbers for individual trees */
int nRoot, /* Number of entries in aRoot[] */
int mxErr, /* Stop reporting errors after this many */
- int *pnErr /* Write number of errors seen to this variable */
+ int *pnErr, /* OUT: Write number of errors seen to this variable */
+ char **pzOut /* OUT: Write the error message string here */
){
Pgno i;
IntegrityCk sCheck;
@@ -75820,18 +79648,12 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE );
VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) );
assert( nRef>=0 );
+ memset(&sCheck, 0, sizeof(sCheck));
sCheck.db = db;
sCheck.pBt = pBt;
sCheck.pPager = pBt->pPager;
sCheck.nPage = btreePagecount(sCheck.pBt);
sCheck.mxErr = mxErr;
- sCheck.nErr = 0;
- sCheck.bOomFault = 0;
- sCheck.zPfx = 0;
- sCheck.v1 = 0;
- sCheck.v2 = 0;
- sCheck.aPgRef = 0;
- sCheck.heap = 0;
sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH);
sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL;
if( sCheck.nPage==0 ){
@@ -75840,12 +79662,12 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1);
if( !sCheck.aPgRef ){
- sCheck.bOomFault = 1;
+ checkOom(&sCheck);
goto integrity_ck_cleanup;
}
sCheck.heap = (u32*)sqlite3PageMalloc( pBt->pageSize );
if( sCheck.heap==0 ){
- sCheck.bOomFault = 1;
+ checkOom(&sCheck);
goto integrity_ck_cleanup;
}
@@ -75855,7 +79677,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
/* Check the integrity of the freelist
*/
if( bCkFreelist ){
- sCheck.zPfx = "Main freelist: ";
+ sCheck.zPfx = "Freelist: ";
checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]),
get4byte(&pBt->pPage1->aData[36]));
sCheck.zPfx = 0;
@@ -75872,7 +79694,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
mxInHdr = get4byte(&pBt->pPage1->aData[52]);
if( mx!=mxInHdr ){
checkAppendMsg(&sCheck,
- "max rootpage (%d) disagrees with header (%d)",
+ "max rootpage (%u) disagrees with header (%u)",
mx, mxInHdr
);
}
@@ -75903,7 +79725,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){
#ifdef SQLITE_OMIT_AUTOVACUUM
if( getPageReferenced(&sCheck, i)==0 ){
- checkAppendMsg(&sCheck, "Page %d is never used", i);
+ checkAppendMsg(&sCheck, "Page %u: never used", i);
}
#else
/* If the database supports auto-vacuum, make sure no tables contain
@@ -75911,11 +79733,11 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
*/
if( getPageReferenced(&sCheck, i)==0 &&
(PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){
- checkAppendMsg(&sCheck, "Page %d is never used", i);
+ checkAppendMsg(&sCheck, "Page %u: never used", i);
}
if( getPageReferenced(&sCheck, i)!=0 &&
(PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){
- checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i);
+ checkAppendMsg(&sCheck, "Page %u: pointer map referenced", i);
}
#endif
}
@@ -75926,16 +79748,17 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
integrity_ck_cleanup:
sqlite3PageFree(sCheck.heap);
sqlite3_free(sCheck.aPgRef);
- if( sCheck.bOomFault ){
+ *pnErr = sCheck.nErr;
+ if( sCheck.nErr==0 ){
sqlite3_str_reset(&sCheck.errMsg);
- sCheck.nErr++;
+ *pzOut = 0;
+ }else{
+ *pzOut = sqlite3StrAccumFinish(&sCheck.errMsg);
}
- *pnErr = sCheck.nErr;
- if( sCheck.nErr==0 ) sqlite3_str_reset(&sCheck.errMsg);
/* Make sure this analysis did not leave any unref() pages. */
assert( nRef==sqlite3PagerRefcount(pBt->pPager) );
sqlite3BtreeLeave(p);
- return sqlite3StrAccumFinish(&sCheck.errMsg);
+ return sCheck.rc;
}
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
@@ -76200,6 +80023,17 @@ SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *p){
*/
SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); }
+/*
+** If no transaction is active and the database is not a temp-db, clear
+** the in-memory pager cache.
+*/
+SQLITE_PRIVATE void sqlite3BtreeClearCache(Btree *p){
+ BtShared *pBt = p->pBt;
+ if( pBt->inTransaction==TRANS_NONE ){
+ sqlite3PagerClearCache(pBt->pPager);
+ }
+}
+
#if !defined(SQLITE_OMIT_SHARED_CACHE)
/*
** Return true if the Btree passed as the only argument is sharable.
@@ -76308,14 +80142,13 @@ static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){
if( i==1 ){
Parse sParse;
int rc = 0;
- memset(&sParse, 0, sizeof(sParse));
- sParse.db = pDb;
+ sqlite3ParseObjectInit(&sParse,pDb);
if( sqlite3OpenTempDatabase(&sParse) ){
sqlite3ErrorWithMsg(pErrorDb, sParse.rc, "%s", sParse.zErrMsg);
rc = SQLITE_ERROR;
}
sqlite3DbFree(pErrorDb, sParse.zErrMsg);
- sqlite3ParserReset(&sParse);
+ sqlite3ParseObjectReset(&sParse);
if( rc ){
return 0;
}
@@ -76466,13 +80299,7 @@ static int backupOnePage(
assert( !isFatalError(p->rc) );
assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) );
assert( zSrcData );
-
- /* Catch the case where the destination is an in-memory database and the
- ** page sizes of the source and destination differ.
- */
- if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){
- rc = SQLITE_READONLY;
- }
+ assert( nSrcPgsz==nDestPgsz || sqlite3PagerIsMemdb(pDestPager)==0 );
/* This loop runs once for each destination page spanned by the source
** page. For each iteration, variable iOff is set to the byte offset
@@ -76605,7 +80432,10 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){
pgszSrc = sqlite3BtreeGetPageSize(p->pSrc);
pgszDest = sqlite3BtreeGetPageSize(p->pDest);
destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest));
- if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){
+ if( SQLITE_OK==rc
+ && (destMode==PAGER_JOURNALMODE_WAL || sqlite3PagerIsMemdb(pDestPager))
+ && pgszSrc!=pgszDest
+ ){
rc = SQLITE_READONLY;
}
@@ -77111,9 +80941,9 @@ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){
i64 x;
assert( (p->flags&MEM_Int)*2==sizeof(x) );
memcpy(&x, (char*)&p->u, (p->flags&MEM_Int)*2);
- sqlite3Int64ToText(x, zBuf);
+ p->n = sqlite3Int64ToText(x, zBuf);
#else
- sqlite3Int64ToText(p->u.i, zBuf);
+ p->n = sqlite3Int64ToText(p->u.i, zBuf);
#endif
}else{
sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0);
@@ -77121,6 +80951,7 @@ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){
(p->flags & MEM_IntReal)!=0 ? (double)p->u.i : p->u.r);
assert( acc.zText==zBuf && acc.mxAlloc<=0 );
zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */
+ p->n = acc.nChar;
}
}
@@ -77148,10 +80979,12 @@ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){
** This routine is for use inside of assert() statements only.
*/
SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem *p){
+ Mem tmp;
char zBuf[100];
char *z;
int i, j, incr;
if( (p->flags & MEM_Str)==0 ) return 1;
+ if( p->db && p->db->mallocFailed ) return 1;
if( p->flags & MEM_Term ){
/* Insure that the string is properly zero-terminated. Pay particular
** attention to the case where p->n is odd */
@@ -77164,7 +80997,8 @@ SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem *p){
assert( p->enc==SQLITE_UTF8 || p->z[((p->n+1)&~1)+1]==0 );
}
if( (p->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ) return 1;
- vdbeMemRenderNum(sizeof(zBuf), zBuf, p);
+ memcpy(&tmp, p, sizeof(tmp));
+ vdbeMemRenderNum(sizeof(zBuf), zBuf, &tmp);
z = p->z;
i = j = 0;
incr = 1;
@@ -77197,10 +81031,15 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
#ifndef SQLITE_OMIT_UTF16
int rc;
#endif
+ assert( pMem!=0 );
assert( !sqlite3VdbeMemIsRowSet(pMem) );
assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
|| desiredEnc==SQLITE_UTF16BE );
- if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){
+ if( !(pMem->flags&MEM_Str) ){
+ pMem->enc = desiredEnc;
+ return SQLITE_OK;
+ }
+ if( pMem->enc==desiredEnc ){
return SQLITE_OK;
}
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
@@ -77329,6 +81168,7 @@ static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){
** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails.
*/
SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){
+ assert( pMem!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( !sqlite3VdbeMemIsRowSet(pMem) );
if( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ){
@@ -77353,6 +81193,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){
#ifndef SQLITE_OMIT_INCRBLOB
SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){
int nByte;
+ assert( pMem!=0 );
assert( pMem->flags & MEM_Zero );
assert( (pMem->flags&MEM_Blob)!=0 || MemNullNochng(pMem) );
testcase( sqlite3_value_nochange(pMem) );
@@ -77368,6 +81209,8 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){
if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){
return SQLITE_NOMEM_BKPT;
}
+ assert( pMem->z!=0 );
+ assert( sqlite3DbMallocSize(pMem->db,pMem->z) >= nByte );
memset(&pMem->z[pMem->n], 0, pMem->u.nZero);
pMem->n += pMem->u.nZero;
@@ -77380,6 +81223,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){
** Make sure the given Mem is \u0000 terminated.
*/
SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){
+ assert( pMem!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
testcase( (pMem->flags & (MEM_Term|MEM_Str))==(MEM_Term|MEM_Str) );
testcase( (pMem->flags & (MEM_Term|MEM_Str))==0 );
@@ -77407,6 +81251,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){
SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){
const int nByte = 32;
+ assert( pMem!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( !(pMem->flags&MEM_Zero) );
assert( !(pMem->flags&(MEM_Str|MEM_Blob)) );
@@ -77422,7 +81267,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){
vdbeMemRenderNum(nByte, pMem->z, pMem);
assert( pMem->z!=0 );
- pMem->n = sqlite3Strlen30NN(pMem->z);
+ assert( pMem->n==(int)sqlite3Strlen30NN(pMem->z) );
pMem->enc = SQLITE_UTF8;
pMem->flags |= MEM_Str|MEM_Term;
if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal);
@@ -77442,9 +81287,11 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
sqlite3_context ctx;
Mem t;
assert( pFunc!=0 );
+ assert( pMem!=0 );
+ assert( pMem->db!=0 );
assert( pFunc->xFinalize!=0 );
assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
- assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ assert( sqlite3_mutex_held(pMem->db->mutex) );
memset(&ctx, 0, sizeof(ctx));
memset(&t, 0, sizeof(t));
t.flags = MEM_Null;
@@ -77452,6 +81299,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
ctx.pOut = &t;
ctx.pMem = pMem;
ctx.pFunc = pFunc;
+ ctx.enc = ENC(t.db);
pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */
assert( (pMem->flags & MEM_Dyn)==0 );
if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc);
@@ -77473,12 +81321,14 @@ SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc
assert( pFunc!=0 );
assert( pFunc->xValue!=0 );
assert( (pAccum->flags & MEM_Null)!=0 || pFunc==pAccum->u.pDef );
- assert( pAccum->db==0 || sqlite3_mutex_held(pAccum->db->mutex) );
+ assert( pAccum->db!=0 );
+ assert( sqlite3_mutex_held(pAccum->db->mutex) );
memset(&ctx, 0, sizeof(ctx));
sqlite3VdbeMemSetNull(pOut);
ctx.pOut = pOut;
ctx.pMem = pAccum;
ctx.pFunc = pFunc;
+ ctx.enc = ENC(pAccum->db);
pFunc->xValue(&ctx);
return ctx.isError;
}
@@ -77544,6 +81394,14 @@ SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){
}
}
+/* Like sqlite3VdbeMemRelease() but faster for cases where we
+** know in advance that the Mem is not MEM_Dyn or MEM_Agg.
+*/
+SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem *p){
+ assert( !VdbeMemDynamic(p) );
+ if( p->szMalloc ) vdbeMemClear(p);
+}
+
/*
** Convert a 64-bit IEEE double into a 64-bit signed integer.
** If the double is out of range of a 64-bit signed integer then
@@ -77585,13 +81443,14 @@ static SQLITE_NOINLINE i64 doubleToInt64(double r){
**
** If pMem represents a string value, its encoding might be changed.
*/
-static SQLITE_NOINLINE i64 memIntValue(Mem *pMem){
+static SQLITE_NOINLINE i64 memIntValue(const Mem *pMem){
i64 value = 0;
sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc);
return value;
}
-SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){
+SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem *pMem){
int flags;
+ assert( pMem!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( EIGHT_BYTE_ALIGNMENT(pMem) );
flags = pMem->flags;
@@ -77620,6 +81479,7 @@ static SQLITE_NOINLINE double memRealValue(Mem *pMem){
return val;
}
SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){
+ assert( pMem!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( EIGHT_BYTE_ALIGNMENT(pMem) );
if( pMem->flags & MEM_Real ){
@@ -77647,31 +81507,35 @@ SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){
}
/*
-** The MEM structure is already a MEM_Real. Try to also make it a
-** MEM_Int if we can.
+** The MEM structure is already a MEM_Real or MEM_IntReal. Try to
+** make it a MEM_Int if we can.
*/
SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){
- i64 ix;
- assert( pMem->flags & MEM_Real );
+ assert( pMem!=0 );
+ assert( pMem->flags & (MEM_Real|MEM_IntReal) );
assert( !sqlite3VdbeMemIsRowSet(pMem) );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( EIGHT_BYTE_ALIGNMENT(pMem) );
- ix = doubleToInt64(pMem->u.r);
-
- /* Only mark the value as an integer if
- **
- ** (1) the round-trip conversion real->int->real is a no-op, and
- ** (2) The integer is neither the largest nor the smallest
- ** possible integer (ticket #3922)
- **
- ** The second and third terms in the following conditional enforces
- ** the second condition under the assumption that addition overflow causes
- ** values to wrap around.
- */
- if( pMem->u.r==ix && ix>SMALLEST_INT64 && ix<LARGEST_INT64 ){
- pMem->u.i = ix;
+ if( pMem->flags & MEM_IntReal ){
MemSetTypeFlag(pMem, MEM_Int);
+ }else{
+ i64 ix = doubleToInt64(pMem->u.r);
+
+ /* Only mark the value as an integer if
+ **
+ ** (1) the round-trip conversion real->int->real is a no-op, and
+ ** (2) The integer is neither the largest nor the smallest
+ ** possible integer (ticket #3922)
+ **
+ ** The second and third terms in the following conditional enforces
+ ** the second condition under the assumption that addition overflow causes
+ ** values to wrap around.
+ */
+ if( pMem->u.r==ix && ix>SMALLEST_INT64 && ix<LARGEST_INT64 ){
+ pMem->u.i = ix;
+ MemSetTypeFlag(pMem, MEM_Int);
+ }
}
}
@@ -77679,6 +81543,7 @@ SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){
** Convert pMem to type integer. Invalidate any prior representations.
*/
SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){
+ assert( pMem!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( !sqlite3VdbeMemIsRowSet(pMem) );
assert( EIGHT_BYTE_ALIGNMENT(pMem) );
@@ -77693,6 +81558,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){
** Invalidate any prior representations.
*/
SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){
+ assert( pMem!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( EIGHT_BYTE_ALIGNMENT(pMem) );
@@ -77717,6 +81583,16 @@ SQLITE_PRIVATE int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){
&& i >= -2251799813685248LL && i < 2251799813685248LL);
}
+/* Convert a floating point value to its closest integer. Do so in
+** a way that avoids 'outside the range of representable values' warnings
+** from UBSAN.
+*/
+SQLITE_PRIVATE i64 sqlite3RealToI64(double r){
+ if( r<=(double)SMALLEST_INT64 ) return SMALLEST_INT64;
+ if( r>=(double)LARGEST_INT64) return LARGEST_INT64;
+ return (i64)r;
+}
+
/*
** Convert pMem so that it has type MEM_Real or MEM_Int.
** Invalidate any prior representations.
@@ -77726,6 +81602,7 @@ SQLITE_PRIVATE int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){
** as much of the string as we can and ignore the rest.
*/
SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){
+ assert( pMem!=0 );
testcase( pMem->flags & MEM_Int );
testcase( pMem->flags & MEM_Real );
testcase( pMem->flags & MEM_IntReal );
@@ -77737,7 +81614,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc);
if( ((rc==0 || rc==1) && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1)
- || sqlite3RealSameAsInt(pMem->u.r, (ix = (i64)pMem->u.r))
+ || sqlite3RealSameAsInt(pMem->u.r, (ix = sqlite3RealToI64(pMem->u.r)))
){
pMem->u.i = ix;
MemSetTypeFlag(pMem, MEM_Int);
@@ -77789,6 +81666,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){
sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding);
assert( pMem->flags & MEM_Str || pMem->db->mallocFailed );
pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal|MEM_Blob|MEM_Zero);
+ if( encoding!=SQLITE_UTF8 ) pMem->n &= ~1;
return sqlite3VdbeChangeEncoding(pMem, encoding);
}
}
@@ -77835,6 +81713,7 @@ SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){
** Delete any previous value and set the value to be a BLOB of length
** n containing all zeros.
*/
+#ifndef SQLITE_OMIT_INCRBLOB
SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
sqlite3VdbeMemRelease(pMem);
pMem->flags = MEM_Blob|MEM_Zero;
@@ -77844,6 +81723,21 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
pMem->enc = SQLITE_UTF8;
pMem->z = 0;
}
+#else
+SQLITE_PRIVATE int sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
+ int nByte = n>0?n:1;
+ if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){
+ return SQLITE_NOMEM_BKPT;
+ }
+ assert( pMem->z!=0 );
+ assert( sqlite3DbMallocSize(pMem->db, pMem->z)>=nByte );
+ memset(pMem->z, 0, nByte);
+ pMem->n = n>0?n:0;
+ pMem->flags = MEM_Blob;
+ pMem->enc = SQLITE_UTF8;
+ return SQLITE_OK;
+}
+#endif
/*
** The pMem is known to contain content that needs to be destroyed prior
@@ -77883,6 +81777,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(
void (*xDestructor)(void*)
){
assert( pMem->flags==MEM_Null );
+ vdbeMemClear(pMem);
pMem->u.zPType = zPType ? zPType : "";
pMem->z = pPtr;
pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term;
@@ -78065,6 +81960,13 @@ SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){
** stored without allocating memory, then it is. If a memory allocation
** is required to store the string, then value of pMem is unchanged. In
** either case, SQLITE_TOOBIG is returned.
+**
+** The "enc" parameter is the text encoding for the string, or zero
+** to store a blob.
+**
+** If n is negative, then the string consists of all bytes up to but
+** excluding the first zero character. The n parameter must be
+** non-negative for blobs.
*/
SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
Mem *pMem, /* Memory cell to set to string value */
@@ -78075,10 +81977,12 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
){
i64 nByte = n; /* New value for pMem->n */
int iLimit; /* Maximum allowed string or blob size */
- u16 flags = 0; /* New value for pMem->flags */
+ u16 flags; /* New value for pMem->flags */
+ assert( pMem!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
assert( !sqlite3VdbeMemIsRowSet(pMem) );
+ assert( enc!=0 || n>=0 );
/* If z is a NULL pointer, set pMem to contain an SQL NULL. */
if( !z ){
@@ -78091,7 +81995,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
}else{
iLimit = SQLITE_MAX_LENGTH;
}
- flags = (enc==0?MEM_Blob:MEM_Str);
if( nByte<0 ){
assert( enc!=0 );
if( enc==SQLITE_UTF8 ){
@@ -78099,7 +82002,23 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
}else{
for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){}
}
- flags |= MEM_Term;
+ flags= MEM_Str|MEM_Term;
+ }else if( enc==0 ){
+ flags = MEM_Blob;
+ enc = SQLITE_UTF8;
+ }else{
+ flags = MEM_Str;
+ }
+ if( nByte>iLimit ){
+ if( xDel && xDel!=SQLITE_TRANSIENT ){
+ if( xDel==SQLITE_DYNAMIC ){
+ sqlite3DbFree(pMem->db, (void*)z);
+ }else{
+ xDel((void*)z);
+ }
+ }
+ sqlite3VdbeMemSetNull(pMem);
+ return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG);
}
/* The following block sets the new values of Mem.z and Mem.xDel. It
@@ -78111,9 +82030,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
if( flags&MEM_Term ){
nAlloc += (enc==SQLITE_UTF8?1:2);
}
- if( nByte>iLimit ){
- return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG);
- }
testcase( nAlloc==0 );
testcase( nAlloc==31 );
testcase( nAlloc==32 );
@@ -78135,16 +82051,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
pMem->n = (int)(nByte & 0x7fffffff);
pMem->flags = flags;
- if( enc ){
- pMem->enc = enc;
-#ifdef SQLITE_ENABLE_SESSION
- }else if( pMem->db==0 ){
- pMem->enc = SQLITE_UTF8;
-#endif
- }else{
- assert( pMem->db!=0 );
- pMem->enc = ENC(pMem->db);
- }
+ pMem->enc = enc;
#ifndef SQLITE_OMIT_UTF16
if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){
@@ -78152,9 +82059,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
}
#endif
- if( nByte>iLimit ){
- return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG);
- }
return SQLITE_OK;
}
@@ -78385,7 +82289,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){
#ifdef SQLITE_ENABLE_STAT4
static int valueFromFunction(
sqlite3 *db, /* The database connection */
- Expr *p, /* The expression to evaluate */
+ const Expr *p, /* The expression to evaluate */
u8 enc, /* Encoding to use */
u8 aff, /* Affinity to use */
sqlite3_value **ppVal, /* Write the new value here */
@@ -78402,9 +82306,14 @@ static int valueFromFunction(
assert( pCtx!=0 );
assert( (p->flags & EP_TokenOnly)==0 );
+ assert( ExprUseXList(p) );
pList = p->x.pList;
if( pList ) nVal = pList->nExpr;
+ assert( !ExprHasProperty(p, EP_IntValue) );
pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0);
+#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
+ if( pFunc==0 ) return SQLITE_OK;
+#endif
assert( pFunc );
if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0
|| (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL)
@@ -78430,10 +82339,10 @@ static int valueFromFunction(
goto value_from_function_out;
}
- assert( pCtx->pParse->rc==SQLITE_OK );
memset(&ctx, 0, sizeof(ctx));
ctx.pOut = pVal;
ctx.pFunc = pFunc;
+ ctx.enc = ENC(db);
pFunc->xSFunc(&ctx, nVal, apVal);
if( ctx.isError ){
rc = ctx.isError;
@@ -78442,16 +82351,16 @@ static int valueFromFunction(
sqlite3ValueApplyAffinity(pVal, aff, SQLITE_UTF8);
assert( rc==SQLITE_OK );
rc = sqlite3VdbeChangeEncoding(pVal, enc);
- if( rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal) ){
+ if( NEVER(rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal)) ){
rc = SQLITE_TOOBIG;
pCtx->pParse->nErr++;
}
}
- pCtx->pParse->rc = rc;
value_from_function_out:
if( rc!=SQLITE_OK ){
pVal = 0;
+ pCtx->pParse->rc = rc;
}
if( apVal ){
for(i=0; i<nVal; i++){
@@ -78479,7 +82388,7 @@ static int valueFromFunction(
*/
static int valueFromExpr(
sqlite3 *db, /* The database connection */
- Expr *pExpr, /* The expression to evaluate */
+ const Expr *pExpr, /* The expression to evaluate */
u8 enc, /* Encoding to use */
u8 affinity, /* Affinity to use */
sqlite3_value **ppVal, /* Write the new value here */
@@ -78494,11 +82403,7 @@ static int valueFromExpr(
assert( pExpr!=0 );
while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft;
-#if defined(SQLITE_ENABLE_STAT4)
if( op==TK_REGISTER ) op = pExpr->op2;
-#else
- if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
-#endif
/* Compressed expressions only appear when parsing the DEFAULT clause
** on a table column definition, and hence only when pCtx==0. This
@@ -78507,12 +82412,21 @@ static int valueFromExpr(
assert( (pExpr->flags & EP_TokenOnly)==0 || pCtx==0 );
if( op==TK_CAST ){
- u8 aff = sqlite3AffinityType(pExpr->u.zToken,0);
+ u8 aff;
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ aff = sqlite3AffinityType(pExpr->u.zToken,0);
rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx);
testcase( rc!=SQLITE_OK );
if( *ppVal ){
- sqlite3VdbeMemCast(*ppVal, aff, SQLITE_UTF8);
- sqlite3ValueApplyAffinity(*ppVal, affinity, SQLITE_UTF8);
+#ifdef SQLITE_ENABLE_STAT4
+ rc = ExpandBlob(*ppVal);
+#else
+ /* zero-blobs only come from functions, not literal values. And
+ ** functions are only processed under STAT4 */
+ assert( (ppVal[0][0].flags & MEM_Zero)==0 );
+#endif
+ sqlite3VdbeMemCast(*ppVal, aff, enc);
+ sqlite3ValueApplyAffinity(*ppVal, affinity, enc);
}
return rc;
}
@@ -78580,6 +82494,7 @@ static int valueFromExpr(
#ifndef SQLITE_OMIT_BLOB_LITERAL
else if( op==TK_BLOB ){
int nVal;
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );
assert( pExpr->u.zToken[1]=='\'' );
pVal = valueNew(db, pCtx);
@@ -78597,6 +82512,7 @@ static int valueFromExpr(
}
#endif
else if( op==TK_TRUEFALSE ){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
pVal = valueNew(db, pCtx);
if( pVal ){
pVal->flags = MEM_Int;
@@ -78609,7 +82525,7 @@ static int valueFromExpr(
no_mem:
#ifdef SQLITE_ENABLE_STAT4
- if( pCtx==0 || pCtx->pParse->nErr==0 )
+ if( pCtx==0 || NEVER(pCtx->pParse->nErr==0) )
#endif
sqlite3OomFault(db);
sqlite3DbFree(db, zVal);
@@ -78634,7 +82550,7 @@ no_mem:
*/
SQLITE_PRIVATE int sqlite3ValueFromExpr(
sqlite3 *db, /* The database connection */
- Expr *pExpr, /* The expression to evaluate */
+ const Expr *pExpr, /* The expression to evaluate */
u8 enc, /* Encoding to use */
u8 affinity, /* Affinity to use */
sqlite3_value **ppVal /* Write the new value here */
@@ -78894,6 +82810,9 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){
if( (p->flags & MEM_Str)!=0 && pVal->enc==enc ){
return p->n;
}
+ if( (p->flags & MEM_Str)!=0 && enc!=SQLITE_UTF8 && pVal->enc!=SQLITE_UTF8 ){
+ return p->n;
+ }
if( (p->flags & MEM_Blob)!=0 ){
if( p->flags & MEM_Zero ){
return p->n + p->u.nZero;
@@ -78939,12 +82858,12 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){
memset(&p->aOp, 0, sizeof(Vdbe)-offsetof(Vdbe,aOp));
p->db = db;
if( db->pVdbe ){
- db->pVdbe->pPrev = p;
+ db->pVdbe->ppVPrev = &p->pVNext;
}
- p->pNext = db->pVdbe;
- p->pPrev = 0;
+ p->pVNext = db->pVdbe;
+ p->ppVPrev = &db->pVdbe;
db->pVdbe = p;
- p->iVdbeMagic = VDBE_MAGIC_INIT;
+ assert( p->eVdbeState==VDBE_INIT_STATE );
p->pParse = pParse;
pParse->pVdbe = p;
assert( pParse->aLabel==0 );
@@ -79024,21 +82943,28 @@ SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString(
#endif
/*
-** Swap all content between two VDBE structures.
+** Swap byte-code between two VDBE structures.
+**
+** This happens after pB was previously run and returned
+** SQLITE_SCHEMA. The statement was then reprepared in pA.
+** This routine transfers the new bytecode in pA over to pB
+** so that pB can be run again. The old pB byte code is
+** moved back to pA so that it will be cleaned up when pA is
+** finalized.
*/
SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){
- Vdbe tmp, *pTmp;
+ Vdbe tmp, *pTmp, **ppTmp;
char *zTmp;
assert( pA->db==pB->db );
tmp = *pA;
*pA = *pB;
*pB = tmp;
- pTmp = pA->pNext;
- pA->pNext = pB->pNext;
- pB->pNext = pTmp;
- pTmp = pA->pPrev;
- pA->pPrev = pB->pPrev;
- pB->pPrev = pTmp;
+ pTmp = pA->pVNext;
+ pA->pVNext = pB->pVNext;
+ pB->pVNext = pTmp;
+ ppTmp = pA->ppVPrev;
+ pA->ppVPrev = pB->ppVPrev;
+ pB->ppVPrev = ppTmp;
zTmp = pA->zSql;
pA->zSql = pB->zSql;
pB->zSql = zTmp;
@@ -79089,7 +83015,7 @@ static int growOpArray(Vdbe *v, int nOp){
return SQLITE_NOMEM;
}
- assert( nOp<=(1024/sizeof(Op)) );
+ assert( nOp<=(int)(1024/sizeof(Op)) );
assert( nNew>=(v->nOpAlloc+nOp) );
pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op));
if( pNew ){
@@ -79114,6 +83040,8 @@ static int growOpArray(Vdbe *v, int nOp){
*/
static void test_addop_breakpoint(int pc, Op *pOp){
static int n = 0;
+ (void)pc;
+ (void)pOp;
n++;
}
#endif
@@ -79145,13 +83073,15 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){
VdbeOp *pOp;
i = p->nOp;
- assert( p->iVdbeMagic==VDBE_MAGIC_INIT );
+ assert( p->eVdbeState==VDBE_INIT_STATE );
assert( op>=0 && op<0xff );
if( p->nOpAlloc<=i ){
return growOp3(p, op, p1, p2, p3);
}
+ assert( p->aOp!=0 );
p->nOp++;
pOp = &p->aOp[i];
+ assert( pOp!=0 );
pOp->opcode = (u8)op;
pOp->p5 = 0;
pOp->p1 = p1;
@@ -79162,16 +83092,16 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
pOp->zComment = 0;
#endif
+#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
+ pOp->nExec = 0;
+ pOp->nCycle = 0;
+#endif
#ifdef SQLITE_DEBUG
if( p->db->flags & SQLITE_VdbeAddopTrace ){
sqlite3VdbePrintOp(0, i, &p->aOp[i]);
test_addop_breakpoint(i, &p->aOp[i]);
}
#endif
-#ifdef VDBE_PROFILE
- pOp->cycles = 0;
- pOp->cnt = 0;
-#endif
#ifdef SQLITE_VDBE_COVERAGE
pOp->iSrcLine = 0;
#endif
@@ -79288,6 +83218,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall(
addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function,
p1, p2, p3, (char*)pCtx, P4_FUNCCTX);
sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef);
+ sqlite3MayAbort(pParse);
return addr;
}
@@ -79338,11 +83269,12 @@ SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){
** If the bPush flag is true, then make this opcode the parent for
** subsequent Explains until sqlite3VdbeExplainPop() is called.
*/
-SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){
-#ifndef SQLITE_DEBUG
+SQLITE_PRIVATE int sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){
+ int addr = 0;
+#if !defined(SQLITE_DEBUG)
/* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined.
** But omit them (for performance) during production builds */
- if( pParse->explain==2 )
+ if( pParse->explain==2 || IS_STMT_SCANSTATUS(pParse->db) )
#endif
{
char *zMsg;
@@ -79354,13 +83286,15 @@ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt
va_end(ap);
v = pParse->pVdbe;
iThis = v->nOp;
- sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0,
+ addr = sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0,
zMsg, P4_DYNAMIC);
- sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z);
+ sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetLastOp(v)->p4.z);
if( bPush){
pParse->addrExplain = iThis;
}
+ sqlite3VdbeScanStatus(v, iThis, 0, 0, 0, 0);
}
+ return addr;
}
/*
@@ -79468,6 +83402,9 @@ static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){
int i;
for(i=p->nLabelAlloc; i<nNewSize; i++) p->aLabel[i] = -1;
#endif
+ if( nNewSize>=100 && (nNewSize/100)>(p->nLabelAlloc/100) ){
+ sqlite3ProgressCheck(p);
+ }
p->nLabelAlloc = nNewSize;
p->aLabel[j] = v->nOp;
}
@@ -79475,7 +83412,7 @@ static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){
SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){
Parse *p = v->pParse;
int j = ADDR(x);
- assert( v->iVdbeMagic==VDBE_MAGIC_INIT );
+ assert( v->eVdbeState==VDBE_INIT_STATE );
assert( j<-p->nLabel );
assert( j>=0 );
#ifdef SQLITE_DEBUG
@@ -79495,14 +83432,20 @@ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){
** Mark the VDBE as one that can only be run one time.
*/
SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){
- p->runOnlyOnce = 1;
+ sqlite3VdbeAddOp2(p, OP_Expire, 1, 1);
}
/*
-** Mark the VDBE as one that can only be run multiple times.
+** Mark the VDBE as one that can be run multiple times.
*/
SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){
- p->runOnlyOnce = 0;
+ int i;
+ for(i=1; ALWAYS(i<p->nOp); i++){
+ if( ALWAYS(p->aOp[i].opcode==OP_Expire) ){
+ p->aOp[1].opcode = OP_Noop;
+ break;
+ }
+ }
}
#ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */
@@ -79606,6 +83549,8 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
int hasInitCoroutine = 0;
Op *pOp;
VdbeOpIter sIter;
+
+ if( v==0 ) return 0;
memset(&sIter, 0, sizeof(sIter));
sIter.v = v;
@@ -79615,6 +83560,7 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
|| opcode==OP_VDestroy
|| opcode==OP_VCreate
|| opcode==OP_ParseSchema
+ || opcode==OP_Function || opcode==OP_PureFunc
|| ((opcode==OP_Halt || opcode==OP_HaltIfNull)
&& ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort))
){
@@ -79689,7 +83635,7 @@ SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){
** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately
** indicate what the prepared statement actually does.
**
-** (4) Initialize the p4.xAdvance pointer on opcodes that use it.
+** (4) (discontinued)
**
** (5) Reclaim the memory allocated for storing labels.
**
@@ -79702,11 +83648,13 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
Op *pOp;
Parse *pParse = p->pParse;
int *aLabel = pParse->aLabel;
+
+ assert( pParse->db->mallocFailed==0 ); /* tag-20230419-1 */
p->readOnly = 1;
p->bIsReader = 0;
pOp = &p->aOp[p->nOp-1];
- while(1){
-
+ assert( p->aOp[0].opcode==OP_Init );
+ while( 1 /* Loop termates when it reaches the OP_Init opcode */ ){
/* Only JUMP opcodes and the short list of special opcodes in the switch
** below need to be considered. The mkopcodeh.tcl generator script groups
** all these opcodes together near the front of the opcode list. Skip
@@ -79735,24 +83683,9 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
p->bIsReader = 1;
break;
}
- case OP_Next:
- case OP_SorterNext: {
- pOp->p4.xAdvance = sqlite3BtreeNext;
- pOp->p4type = P4_ADVANCE;
- /* The code generator never codes any of these opcodes as a jump
- ** to a label. They are always coded as a jump backwards to a
- ** known address */
+ case OP_Init: {
assert( pOp->p2>=0 );
- break;
- }
- case OP_Prev: {
- pOp->p4.xAdvance = sqlite3BtreePrevious;
- pOp->p4type = P4_ADVANCE;
- /* The code generator never codes any of these opcodes as a jump
- ** to a label. They are always coded as a jump backwards to a
- ** known address */
- assert( pOp->p2>=0 );
- break;
+ goto resolve_p2_values_loop_exit;
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
case OP_VUpdate: {
@@ -79776,6 +83709,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
** have non-negative values for P2. */
assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 );
assert( ADDR(pOp->p2)<-pParse->nLabel );
+ assert( aLabel!=0 ); /* True because of tag-20230419-1 */
pOp->p2 = aLabel[ADDR(pOp->p2)];
}
break;
@@ -79786,21 +83720,108 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
** have non-negative values for P2. */
assert( (sqlite3OpcodeProperty[pOp->opcode]&OPFLG_JUMP)==0 || pOp->p2>=0);
}
- if( pOp==p->aOp ) break;
+ assert( pOp>p->aOp );
pOp--;
}
- sqlite3DbFree(p->db, pParse->aLabel);
- pParse->aLabel = 0;
+resolve_p2_values_loop_exit:
+ if( aLabel ){
+ sqlite3DbNNFreeNN(p->db, pParse->aLabel);
+ pParse->aLabel = 0;
+ }
pParse->nLabel = 0;
*pMaxFuncArgs = nMaxArgs;
assert( p->bIsReader!=0 || DbMaskAllZero(p->btreeMask) );
}
+#ifdef SQLITE_DEBUG
+/*
+** Check to see if a subroutine contains a jump to a location outside of
+** the subroutine. If a jump outside the subroutine is detected, add code
+** that will cause the program to halt with an error message.
+**
+** The subroutine consists of opcodes between iFirst and iLast. Jumps to
+** locations within the subroutine are acceptable. iRetReg is a register
+** that contains the return address. Jumps to outside the range of iFirst
+** through iLast are also acceptable as long as the jump destination is
+** an OP_Return to iReturnAddr.
+**
+** A jump to an unresolved label means that the jump destination will be
+** beyond the current address. That is normally a jump to an early
+** termination and is consider acceptable.
+**
+** This routine only runs during debug builds. The purpose is (of course)
+** to detect invalid escapes out of a subroutine. The OP_Halt opcode
+** is generated rather than an assert() or other error, so that ".eqp full"
+** will still work to show the original bytecode, to aid in debugging.
+*/
+SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn(
+ Vdbe *v, /* The byte-code program under construction */
+ int iFirst, /* First opcode of the subroutine */
+ int iLast, /* Last opcode of the subroutine */
+ int iRetReg /* Subroutine return address register */
+){
+ VdbeOp *pOp;
+ Parse *pParse;
+ int i;
+ sqlite3_str *pErr = 0;
+ assert( v!=0 );
+ pParse = v->pParse;
+ assert( pParse!=0 );
+ if( pParse->nErr ) return;
+ assert( iLast>=iFirst );
+ assert( iLast<v->nOp );
+ pOp = &v->aOp[iFirst];
+ for(i=iFirst; i<=iLast; i++, pOp++){
+ if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ){
+ int iDest = pOp->p2; /* Jump destination */
+ if( iDest==0 ) continue;
+ if( pOp->opcode==OP_Gosub ) continue;
+ if( iDest<0 ){
+ int j = ADDR(iDest);
+ assert( j>=0 );
+ if( j>=-pParse->nLabel || pParse->aLabel[j]<0 ){
+ continue;
+ }
+ iDest = pParse->aLabel[j];
+ }
+ if( iDest<iFirst || iDest>iLast ){
+ int j = iDest;
+ for(; j<v->nOp; j++){
+ VdbeOp *pX = &v->aOp[j];
+ if( pX->opcode==OP_Return ){
+ if( pX->p1==iRetReg ) break;
+ continue;
+ }
+ if( pX->opcode==OP_Noop ) continue;
+ if( pX->opcode==OP_Explain ) continue;
+ if( pErr==0 ){
+ pErr = sqlite3_str_new(0);
+ }else{
+ sqlite3_str_appendchar(pErr, 1, '\n');
+ }
+ sqlite3_str_appendf(pErr,
+ "Opcode at %d jumps to %d which is outside the "
+ "subroutine at %d..%d",
+ i, iDest, iFirst, iLast);
+ break;
+ }
+ }
+ }
+ }
+ if( pErr ){
+ char *zErr = sqlite3_str_finish(pErr);
+ sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_INTERNAL, OE_Abort, 0, zErr, 0);
+ sqlite3_free(zErr);
+ sqlite3MayAbort(pParse);
+ }
+}
+#endif /* SQLITE_DEBUG */
+
/*
** Return the address of the next instruction to be inserted.
*/
SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){
- assert( p->iVdbeMagic==VDBE_MAGIC_INIT );
+ assert( p->eVdbeState==VDBE_INIT_STATE );
return p->nOp;
}
@@ -79885,7 +83906,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(
int i;
VdbeOp *pOut, *pFirst;
assert( nOp>0 );
- assert( p->iVdbeMagic==VDBE_MAGIC_INIT );
+ assert( p->eVdbeState==VDBE_INIT_STATE );
if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){
return 0;
}
@@ -79932,20 +83953,83 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus(
LogEst nEst, /* Estimated number of output rows */
const char *zName /* Name of table or index being scanned */
){
- sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus);
- ScanStatus *aNew;
- aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte);
- if( aNew ){
- ScanStatus *pNew = &aNew[p->nScan++];
- pNew->addrExplain = addrExplain;
- pNew->addrLoop = addrLoop;
- pNew->addrVisit = addrVisit;
- pNew->nEst = nEst;
- pNew->zName = sqlite3DbStrDup(p->db, zName);
- p->aScan = aNew;
+ if( IS_STMT_SCANSTATUS(p->db) ){
+ sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus);
+ ScanStatus *aNew;
+ aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte);
+ if( aNew ){
+ ScanStatus *pNew = &aNew[p->nScan++];
+ memset(pNew, 0, sizeof(ScanStatus));
+ pNew->addrExplain = addrExplain;
+ pNew->addrLoop = addrLoop;
+ pNew->addrVisit = addrVisit;
+ pNew->nEst = nEst;
+ pNew->zName = sqlite3DbStrDup(p->db, zName);
+ p->aScan = aNew;
+ }
}
}
-#endif
+
+/*
+** Add the range of instructions from addrStart to addrEnd (inclusive) to
+** the set of those corresponding to the sqlite3_stmt_scanstatus() counters
+** associated with the OP_Explain instruction at addrExplain. The
+** sum of the sqlite3Hwtime() values for each of these instructions
+** will be returned for SQLITE_SCANSTAT_NCYCLE requests.
+*/
+SQLITE_PRIVATE void sqlite3VdbeScanStatusRange(
+ Vdbe *p,
+ int addrExplain,
+ int addrStart,
+ int addrEnd
+){
+ if( IS_STMT_SCANSTATUS(p->db) ){
+ ScanStatus *pScan = 0;
+ int ii;
+ for(ii=p->nScan-1; ii>=0; ii--){
+ pScan = &p->aScan[ii];
+ if( pScan->addrExplain==addrExplain ) break;
+ pScan = 0;
+ }
+ if( pScan ){
+ if( addrEnd<0 ) addrEnd = sqlite3VdbeCurrentAddr(p)-1;
+ for(ii=0; ii<ArraySize(pScan->aAddrRange); ii+=2){
+ if( pScan->aAddrRange[ii]==0 ){
+ pScan->aAddrRange[ii] = addrStart;
+ pScan->aAddrRange[ii+1] = addrEnd;
+ break;
+ }
+ }
+ }
+ }
+}
+
+/*
+** Set the addresses for the SQLITE_SCANSTAT_NLOOP and SQLITE_SCANSTAT_NROW
+** counters for the query element associated with the OP_Explain at
+** addrExplain.
+*/
+SQLITE_PRIVATE void sqlite3VdbeScanStatusCounters(
+ Vdbe *p,
+ int addrExplain,
+ int addrLoop,
+ int addrVisit
+){
+ if( IS_STMT_SCANSTATUS(p->db) ){
+ ScanStatus *pScan = 0;
+ int ii;
+ for(ii=p->nScan-1; ii>=0; ii--){
+ pScan = &p->aScan[ii];
+ if( pScan->addrExplain==addrExplain ) break;
+ pScan = 0;
+ }
+ if( pScan ){
+ pScan->addrLoop = addrLoop;
+ pScan->addrVisit = addrVisit;
+ }
+ }
+}
+#endif /* defined(SQLITE_ENABLE_STMT_SCANSTATUS) */
/*
@@ -79953,15 +84037,19 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus(
** for a specific instruction.
*/
SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, int addr, u8 iNewOpcode){
+ assert( addr>=0 );
sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode;
}
SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){
+ assert( addr>=0 );
sqlite3VdbeGetOp(p,addr)->p1 = val;
}
SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){
+ assert( addr>=0 || p->db->mallocFailed );
sqlite3VdbeGetOp(p,addr)->p2 = val;
}
SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){
+ assert( addr>=0 );
sqlite3VdbeGetOp(p,addr)->p3 = val;
}
SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){
@@ -79970,6 +84058,18 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){
}
/*
+** If the previous opcode is an OP_Column that delivers results
+** into register iDest, then add the OPFLAG_TYPEOFARG flag to that
+** opcode.
+*/
+SQLITE_PRIVATE void sqlite3VdbeTypeofColumn(Vdbe *p, int iDest){
+ VdbeOp *pOp = sqlite3VdbeGetLastOp(p);
+ if( pOp->p3==iDest && pOp->opcode==OP_Column ){
+ pOp->p5 |= OPFLAG_TYPEOFARG;
+ }
+}
+
+/*
** Change the P2 operand of instruction addr so that it points to
** the address of the next instruction to be coded.
*/
@@ -79997,7 +84097,7 @@ SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe *p, int addr){
|| p->aOp[addr].opcode==OP_FkIfZero );
assert( p->aOp[addr].p4type==0 );
#ifdef SQLITE_VDBE_COVERAGE
- sqlite3VdbeGetOp(p,-1)->iSrcLine = 0; /* Erase VdbeCoverage() macros */
+ sqlite3VdbeGetLastOp(p)->iSrcLine = 0; /* Erase VdbeCoverage() macros */
#endif
p->nOp--;
}else{
@@ -80011,8 +84111,9 @@ SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe *p, int addr){
** the FuncDef is not ephermal, then do nothing.
*/
static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){
+ assert( db!=0 );
if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){
- sqlite3DbFreeNN(db, pDef);
+ sqlite3DbNNFreeNN(db, pDef);
}
}
@@ -80021,11 +84122,12 @@ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){
*/
static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){
if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc);
- sqlite3DbFreeNN(db, p);
+ sqlite3DbNNFreeNN(db, p);
}
static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){
+ assert( db!=0 );
freeEphemeralFunction(db, p->pFunc);
- sqlite3DbFreeNN(db, p);
+ sqlite3DbNNFreeNN(db, p);
}
static void freeP4(sqlite3 *db, int p4type, void *p4){
assert( db );
@@ -80037,9 +84139,8 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
case P4_REAL:
case P4_INT64:
case P4_DYNAMIC:
- case P4_DYNBLOB:
case P4_INTARRAY: {
- sqlite3DbFree(db, p4);
+ if( p4 ) sqlite3DbNNFreeNN(db, p4);
break;
}
case P4_KEYINFO: {
@@ -80077,15 +84178,19 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
** nOp entries.
*/
static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){
+ assert( nOp>=0 );
+ assert( db!=0 );
if( aOp ){
- Op *pOp;
- for(pOp=&aOp[nOp-1]; pOp>=aOp; pOp--){
+ Op *pOp = &aOp[nOp-1];
+ while(1){ /* Exit via break */
if( pOp->p4type <= P4_FREE_IF_LE ) freeP4(db, pOp->p4type, pOp->p4.p);
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
sqlite3DbFree(db, pOp->zComment);
#endif
+ if( pOp==aOp ) break;
+ pOp--;
}
- sqlite3DbFreeNN(db, aOp);
+ sqlite3DbNNFreeNN(db, aOp);
}
}
@@ -80145,7 +84250,7 @@ SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters(
u32 mask, /* Mask of registers to NOT release */
int bUndefine /* If true, mark registers as undefined */
){
- if( N==0 ) return;
+ if( N==0 || OptimizationDisabled(pParse->db, SQLITE_ReleaseReg) ) return;
assert( pParse->pVdbe );
assert( iFirst>=1 );
assert( iFirst+N-1<=pParse->nMem );
@@ -80209,7 +84314,7 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int
sqlite3 *db;
assert( p!=0 );
db = p->db;
- assert( p->iVdbeMagic==VDBE_MAGIC_INIT );
+ assert( p->eVdbeState==VDBE_INIT_STATE );
assert( p->aOp!=0 || db->mallocFailed );
if( db->mallocFailed ){
if( n!=P4_VTAB ) freeP4(db, n, (void*)*(char**)&zP4);
@@ -80254,7 +84359,7 @@ SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe *p, void *pP4, int n){
if( p->db->mallocFailed ){
freeP4(p->db, n, pP4);
}else{
- assert( pP4!=0 );
+ assert( pP4!=0 || n==P4_DYNAMIC );
assert( p->nOp>0 );
pOp = &p->aOp[p->nOp-1];
assert( pOp->p4type==P4_NOTUSED );
@@ -80285,8 +84390,7 @@ SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){
*/
static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){
assert( p->nOp>0 || p->aOp==0 );
- assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed
- || p->pParse->nErr>0 );
+ assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->pParse->nErr>0 );
if( p->nOp ){
assert( p->aOp );
sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment);
@@ -80317,13 +84421,13 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){
** Set the value if the iSrcLine field for the previously coded instruction.
*/
SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe *v, int iLine){
- sqlite3VdbeGetOp(v,-1)->iSrcLine = iLine;
+ sqlite3VdbeGetLastOp(v)->iSrcLine = iLine;
}
#endif /* SQLITE_VDBE_COVERAGE */
/*
-** Return the opcode for a given address. If the address is -1, then
-** return the most recently inserted opcode.
+** Return the opcode for a given address. The address must be non-negative.
+** See sqlite3VdbeGetLastOp() to get the most recently added opcode.
**
** If a memory allocation error has occurred prior to the calling of this
** routine, then a pointer to a dummy VdbeOp will be returned. That opcode
@@ -80338,10 +84442,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){
/* C89 specifies that the constant "dummy" will be initialized to all
** zeros, which is correct. MSVC generates a warning, nevertheless. */
static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */
- assert( p->iVdbeMagic==VDBE_MAGIC_INIT );
- if( addr<0 ){
- addr = p->nOp - 1;
- }
+ assert( p->eVdbeState==VDBE_INIT_STATE );
assert( (addr>=0 && addr<p->nOp) || p->db->mallocFailed );
if( p->db->mallocFailed ){
return (VdbeOp*)&dummy;
@@ -80350,6 +84451,12 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){
}
}
+/* Return the most recently added opcode
+*/
+SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetLastOp(Vdbe *p){
+ return sqlite3VdbeGetOp(p, p->nOp - 1);
+}
+
#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS)
/*
** Return an integer value for one of the parameters to the opcode pOp
@@ -80394,7 +84501,7 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayComment(
if( zOpName[nOpName+1] ){
int seenCom = 0;
char c;
- zSynopsis = zOpName += nOpName + 1;
+ zSynopsis = zOpName + nOpName + 1;
if( strncmp(zSynopsis,"IF ",3)==0 ){
sqlite3_snprintf(sizeof(zAlt), zAlt, "if %s goto P2", zSynopsis+3);
zSynopsis = zAlt;
@@ -80405,8 +84512,11 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayComment(
if( c=='4' ){
sqlite3_str_appendall(&x, zP4);
}else if( c=='X' ){
- sqlite3_str_appendall(&x, pOp->zComment);
- seenCom = 1;
+ if( pOp->zComment && pOp->zComment[0] ){
+ sqlite3_str_appendall(&x, pOp->zComment);
+ seenCom = 1;
+ break;
+ }
}else{
int v1 = translateP(c, pOp);
int v2;
@@ -80467,6 +84577,7 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){
const char *zOp = 0;
switch( pExpr->op ){
case TK_STRING:
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3_str_appendf(p, "%Q", pExpr->u.zToken);
break;
case TK_INTEGER:
@@ -80569,7 +84680,7 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){
case P4_COLLSEQ: {
static const char *const encnames[] = {"?", "8", "16LE", "16BE"};
CollSeq *pColl = pOp->p4.pColl;
- assert( pColl->enc>=0 && pColl->enc<4 );
+ assert( pColl->enc<4 );
sqlite3_str_appendf(&x, "%.18s-%s", pColl->zName,
encnames[pColl->enc]);
break;
@@ -80634,10 +84745,6 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){
zP4 = "program";
break;
}
- case P4_DYNBLOB:
- case P4_ADVANCE: {
- break;
- }
case P4_TABLE: {
zP4 = pOp->p4.pTab->zName;
break;
@@ -80769,21 +84876,40 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){
/*
** Initialize an array of N Mem element.
+**
+** This is a high-runner, so only those fields that really do need to
+** be initialized are set. The Mem structure is organized so that
+** the fields that get initialized are nearby and hopefully on the same
+** cache line.
+**
+** Mem.flags = flags
+** Mem.db = db
+** Mem.szMalloc = 0
+**
+** All other fields of Mem can safely remain uninitialized for now. They
+** will be initialized before use.
*/
static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){
- while( (N--)>0 ){
- p->db = db;
- p->flags = flags;
- p->szMalloc = 0;
+ if( N>0 ){
+ do{
+ p->flags = flags;
+ p->db = db;
+ p->szMalloc = 0;
#ifdef SQLITE_DEBUG
- p->pScopyFrom = 0;
+ p->pScopyFrom = 0;
#endif
- p++;
+ p++;
+ }while( (--N)>0 );
}
}
/*
-** Release an array of N Mem elements
+** Release auxiliary memory held in an array of N Mem elements.
+**
+** After this routine returns, all Mem elements in the array will still
+** be valid. Those Mem elements that were not holding auxiliary resources
+** will be unchanged. Mem elements which had something freed will be
+** set to MEM_Undefined.
*/
static void releaseMemArray(Mem *p, int N){
if( p && N ){
@@ -80813,15 +84939,20 @@ static void releaseMemArray(Mem *p, int N){
*/
testcase( p->flags & MEM_Agg );
testcase( p->flags & MEM_Dyn );
- testcase( p->xDel==sqlite3VdbeFrameMemDel );
if( p->flags&(MEM_Agg|MEM_Dyn) ){
+ testcase( (p->flags & MEM_Dyn)!=0 && p->xDel==sqlite3VdbeFrameMemDel );
sqlite3VdbeMemRelease(p);
+ p->flags = MEM_Undefined;
}else if( p->szMalloc ){
- sqlite3DbFreeNN(db, p->zMalloc);
+ sqlite3DbNNFreeNN(db, p->zMalloc);
p->szMalloc = 0;
+ p->flags = MEM_Undefined;
}
-
- p->flags = MEM_Undefined;
+#ifdef SQLITE_DEBUG
+ else{
+ p->flags = MEM_Undefined;
+ }
+#endif
}while( (++p)<pEnd );
}
}
@@ -80980,7 +85111,7 @@ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){
VdbeCursor **apCsr = (VdbeCursor **)&aMem[p->nChildMem];
assert( sqlite3VdbeFrameIsValid(p) );
for(i=0; i<p->nChildCsr; i++){
- sqlite3VdbeFreeCursor(p->v, apCsr[i]);
+ if( apCsr[i] ) sqlite3VdbeFreeCursorNN(p->v, apCsr[i]);
}
releaseMemArray(aMem, p->nChildMem);
sqlite3VdbeDeleteAuxData(p->v->db, &p->pAuxData, -1, 0);
@@ -81019,7 +85150,7 @@ SQLITE_PRIVATE int sqlite3VdbeList(
Op *pOp; /* Current opcode */
assert( p->explain );
- assert( p->iVdbeMagic==VDBE_MAGIC_RUN );
+ assert( p->eVdbeState==VDBE_RUN_STATE );
assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM );
/* Even though this opcode does not use dynamic strings for
@@ -81027,7 +85158,6 @@ SQLITE_PRIVATE int sqlite3VdbeList(
** sqlite3_column_text16(), causing a translation to UTF-16 encoding.
*/
releaseMemArray(pMem, 8);
- p->pResultSet = 0;
if( p->rc==SQLITE_NOMEM ){
/* This happens if a malloc() inside a call to sqlite3_column_text() or
@@ -81084,7 +85214,7 @@ SQLITE_PRIVATE int sqlite3VdbeList(
sqlite3VdbeMemSetStr(pMem+5, zP4, -1, SQLITE_UTF8, sqlite3_free);
p->nResColumn = 8;
}
- p->pResultSet = pMem;
+ p->pResultRow = pMem;
if( db->mallocFailed ){
p->rc = SQLITE_NOMEM;
rc = SQLITE_ERROR;
@@ -81174,11 +85304,11 @@ struct ReusableSpace {
static void *allocSpace(
struct ReusableSpace *p, /* Bulk memory available for allocation */
void *pBuf, /* Pointer to a prior allocation */
- sqlite3_int64 nByte /* Bytes of memory needed */
+ sqlite3_int64 nByte /* Bytes of memory needed. */
){
assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) );
if( pBuf==0 ){
- nByte = ROUND8(nByte);
+ nByte = ROUND8P(nByte);
if( nByte <= p->nFree ){
p->nFree -= nByte;
pBuf = &p->pSpace[p->nFree];
@@ -81195,18 +85325,19 @@ static void *allocSpace(
** running it.
*/
SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){
-#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
+#if defined(SQLITE_DEBUG)
int i;
#endif
assert( p!=0 );
- assert( p->iVdbeMagic==VDBE_MAGIC_INIT || p->iVdbeMagic==VDBE_MAGIC_RESET );
+ assert( p->eVdbeState==VDBE_INIT_STATE
+ || p->eVdbeState==VDBE_READY_STATE
+ || p->eVdbeState==VDBE_HALT_STATE );
/* There should be at least one opcode.
*/
assert( p->nOp>0 );
- /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. */
- p->iVdbeMagic = VDBE_MAGIC_RUN;
+ p->eVdbeState = VDBE_READY_STATE;
#ifdef SQLITE_DEBUG
for(i=0; i<p->nMem; i++){
@@ -81223,8 +85354,8 @@ SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){
p->nFkConstraint = 0;
#ifdef VDBE_PROFILE
for(i=0; i<p->nOp; i++){
- p->aOp[i].cnt = 0;
- p->aOp[i].cycles = 0;
+ p->aOp[i].nExec = 0;
+ p->aOp[i].nCycle = 0;
}
#endif
}
@@ -81262,7 +85393,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
assert( p!=0 );
assert( p->nOp>0 );
assert( pParse!=0 );
- assert( p->iVdbeMagic==VDBE_MAGIC_INIT );
+ assert( p->eVdbeState==VDBE_INIT_STATE );
assert( pParse==p->pParse );
p->pVList = pParse->pVList;
pParse->pVList = 0;
@@ -81285,7 +85416,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
** opcode array. This extra memory will be reallocated for other elements
** of the prepared statement.
*/
- n = ROUND8(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */
+ n = ROUND8P(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */
x.pSpace = &((u8*)p->aOp)[n]; /* Unused opcode memory */
assert( EIGHT_BYTE_ALIGNMENT(x.pSpace) );
x.nFree = ROUNDDOWN8(pParse->szOpAlloc - n); /* Bytes of unused memory */
@@ -81333,9 +85464,6 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
p->aVar = allocSpace(&x, 0, nVar*sizeof(Mem));
p->apArg = allocSpace(&x, 0, nArg*sizeof(Mem*));
p->apCsr = allocSpace(&x, 0, nCursor*sizeof(VdbeCursor*));
-#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
- p->anExec = allocSpace(&x, 0, p->nOp*sizeof(i64));
-#endif
if( x.nNeeded ){
x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded);
x.nFree = x.nNeeded;
@@ -81344,9 +85472,6 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem));
p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*));
p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*));
-#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
- p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64));
-#endif
}
}
@@ -81361,9 +85486,6 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
p->nMem = nMem;
initMemArray(p->aMem, nMem, db, MEM_Undefined);
memset(p->apCsr, 0, nCursor*sizeof(VdbeCursor*));
-#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
- memset(p->anExec, 0, p->nOp*sizeof(i64));
-#endif
}
sqlite3VdbeRewind(p);
}
@@ -81373,11 +85495,9 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
** happens to hold.
*/
SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){
- if( pCx==0 ){
- return;
- }
- assert( pCx->pBtx==0 || pCx->eCurType==CURTYPE_BTREE );
- assert( pCx->pBtx==0 || pCx->isEphemeral );
+ if( pCx ) sqlite3VdbeFreeCursorNN(p,pCx);
+}
+SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe *p, VdbeCursor *pCx){
switch( pCx->eCurType ){
case CURTYPE_SORTER: {
sqlite3VdbeSorterClose(p->db, pCx);
@@ -81405,14 +85525,12 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){
** Close all cursors in the current frame.
*/
static void closeCursorsInFrame(Vdbe *p){
- if( p->apCsr ){
- int i;
- for(i=0; i<p->nCursor; i++){
- VdbeCursor *pC = p->apCsr[i];
- if( pC ){
- sqlite3VdbeFreeCursor(p, pC);
- p->apCsr[i] = 0;
- }
+ int i;
+ for(i=0; i<p->nCursor; i++){
+ VdbeCursor *pC = p->apCsr[i];
+ if( pC ){
+ sqlite3VdbeFreeCursorNN(p, pC);
+ p->apCsr[i] = 0;
}
}
}
@@ -81425,9 +85543,6 @@ static void closeCursorsInFrame(Vdbe *p){
SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){
Vdbe *v = pFrame->v;
closeCursorsInFrame(v);
-#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
- v->anExec = pFrame->anExec;
-#endif
v->aOp = pFrame->aOp;
v->nOp = pFrame->nOp;
v->aMem = pFrame->aMem;
@@ -81461,9 +85576,7 @@ static void closeAllCursors(Vdbe *p){
}
assert( p->nFrame==0 );
closeCursorsInFrame(p);
- if( p->aMem ){
- releaseMemArray(p->aMem, p->nMem);
- }
+ releaseMemArray(p->aMem, p->nMem);
while( p->pDelFrame ){
VdbeFrame *pDel = p->pDelFrame;
p->pDelFrame = pDel->pParent;
@@ -81810,7 +85923,7 @@ static void checkActiveVdbeCnt(sqlite3 *db){
if( p->readOnly==0 ) nWrite++;
if( p->bIsReader ) nRead++;
}
- p = p->pNext;
+ p = p->pVNext;
}
assert( cnt==db->nVdbeActive );
assert( nWrite==db->nVdbeWrite );
@@ -81903,7 +86016,8 @@ SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){
p->rc = SQLITE_CONSTRAINT_FOREIGNKEY;
p->errorAction = OE_Abort;
sqlite3VdbeError(p, "FOREIGN KEY constraint failed");
- return SQLITE_ERROR;
+ if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ) return SQLITE_ERROR;
+ return SQLITE_CONSTRAINT_FOREIGNKEY;
}
return SQLITE_OK;
}
@@ -81914,9 +86028,9 @@ SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){
** has made changes and is in autocommit mode, then commit those
** changes. If a rollback is needed, then do the rollback.
**
-** This routine is the only way to move the state of a VM from
-** SQLITE_MAGIC_RUN to SQLITE_MAGIC_HALT. It is harmless to
-** call this on a VM that is in the SQLITE_MAGIC_HALT state.
+** This routine is the only way to move the sqlite3eOpenState of a VM from
+** SQLITE_STATE_RUN to SQLITE_STATE_HALT. It is harmless to
+** call this on a VM that is in the SQLITE_STATE_HALT state.
**
** Return an error code. If the commit could not complete because of
** lock contention, return SQLITE_BUSY. If SQLITE_BUSY is returned, it
@@ -81942,9 +86056,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
** one, or the complete transaction if there is no statement transaction.
*/
- if( p->iVdbeMagic!=VDBE_MAGIC_RUN ){
- return SQLITE_OK;
- }
+ assert( p->eVdbeState==VDBE_RUN_STATE );
if( db->mallocFailed ){
p->rc = SQLITE_NOMEM_BKPT;
}
@@ -81953,7 +86065,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
/* No commit or rollback needed if the program never started or if the
** SQL statement does not read or write a database file. */
- if( p->pc>=0 && p->bIsReader ){
+ if( p->bIsReader ){
int mrc; /* Primary error code from p->rc */
int eStatementOp = 0;
int isSpecialError; /* Set to true if a 'special' error */
@@ -81962,9 +86074,15 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
sqlite3VdbeEnter(p);
/* Check for one of the special errors */
- mrc = p->rc & 0xff;
- isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR
- || mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL;
+ if( p->rc ){
+ mrc = p->rc & 0xff;
+ isSpecialError = mrc==SQLITE_NOMEM
+ || mrc==SQLITE_IOERR
+ || mrc==SQLITE_INTERRUPT
+ || mrc==SQLITE_FULL;
+ }else{
+ mrc = isSpecialError = 0;
+ }
if( isSpecialError ){
/* If the query was read-only and the error code is SQLITE_INTERRUPT,
** no rollback is necessary. Otherwise, at least a savepoint
@@ -82016,6 +86134,9 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
return SQLITE_ERROR;
}
rc = SQLITE_CONSTRAINT_FOREIGNKEY;
+ }else if( db->flags & SQLITE_CorruptRdOnly ){
+ rc = SQLITE_CORRUPT;
+ db->flags &= ~SQLITE_CorruptRdOnly;
}else{
/* The auto-commit flag is true, the vdbe program was successful
** or hit an 'OR FAIL' constraint and there are no deferred foreign
@@ -82036,6 +86157,8 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
db->flags &= ~(u64)SQLITE_DeferFKs;
sqlite3CommitInternalChanges(db);
}
+ }else if( p->rc==SQLITE_SCHEMA && db->nVdbeActive>1 ){
+ p->nChange = 0;
}else{
sqlite3RollbackAll(db, SQLITE_OK);
p->nChange = 0;
@@ -82092,15 +86215,13 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
}
/* We have successfully halted and closed the VM. Record this fact. */
- if( p->pc>=0 ){
- db->nVdbeActive--;
- if( !p->readOnly ) db->nVdbeWrite--;
- if( p->bIsReader ) db->nVdbeRead--;
- assert( db->nVdbeActive>=db->nVdbeRead );
- assert( db->nVdbeRead>=db->nVdbeWrite );
- assert( db->nVdbeWrite>=0 );
- }
- p->iVdbeMagic = VDBE_MAGIC_HALT;
+ db->nVdbeActive--;
+ if( !p->readOnly ) db->nVdbeWrite--;
+ if( p->bIsReader ) db->nVdbeRead--;
+ assert( db->nVdbeActive>=db->nVdbeRead );
+ assert( db->nVdbeRead>=db->nVdbeWrite );
+ assert( db->nVdbeWrite>=0 );
+ p->eVdbeState = VDBE_HALT_STATE;
checkActiveVdbeCnt(db);
if( db->mallocFailed ){
p->rc = SQLITE_NOMEM_BKPT;
@@ -82149,6 +86270,7 @@ SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){
sqlite3ValueSetNull(db->pErr);
}
db->errCode = rc;
+ db->errByteOffset = -1;
return rc;
}
@@ -82181,8 +86303,8 @@ static void vdbeInvokeSqllog(Vdbe *v){
** again.
**
** To look at it another way, this routine resets the state of the
-** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to
-** VDBE_MAGIC_INIT.
+** virtual machine from VDBE_RUN_STATE or VDBE_HALT_STATE back to
+** VDBE_READY_STATE.
*/
SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
@@ -82196,7 +86318,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
** error, then it might not have been halted properly. So halt
** it now.
*/
- sqlite3VdbeHalt(p);
+ if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p);
/* If the VDBE has been run even partially, then transfer the error code
** and error message from the VDBE into the main database structure. But
@@ -82210,13 +86332,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
}else{
db->errCode = p->rc;
}
- if( p->runOnlyOnce ) p->expired = 1;
- }else if( p->rc && p->expired ){
- /* The expired flag was set on the VDBE before the first call
- ** to sqlite3_step(). For consistency (since sqlite3_step() was
- ** called), set the database error in this case as well.
- */
- sqlite3ErrorWithMsg(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg);
}
/* Reset register contents and reclaim error message memory.
@@ -82233,7 +86348,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = 0;
}
- p->pResultSet = 0;
+ p->pResultRow = 0;
#ifdef SQLITE_DEBUG
p->nWrite = 0;
#endif
@@ -82261,10 +86376,12 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
}
for(i=0; i<p->nOp; i++){
char zHdr[100];
+ i64 cnt = p->aOp[i].nExec;
+ i64 cycles = p->aOp[i].nCycle;
sqlite3_snprintf(sizeof(zHdr), zHdr, "%6u %12llu %8llu ",
- p->aOp[i].cnt,
- p->aOp[i].cycles,
- p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0
+ cnt,
+ cycles,
+ cnt>0 ? cycles/cnt : 0
);
fprintf(out, "%s", zHdr);
sqlite3VdbePrintOp(out, i, &p->aOp[i]);
@@ -82273,7 +86390,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
}
}
#endif
- p->iVdbeMagic = VDBE_MAGIC_RESET;
return p->rc & db->errMask;
}
@@ -82283,7 +86399,10 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
*/
SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){
int rc = SQLITE_OK;
- if( p->iVdbeMagic==VDBE_MAGIC_RUN || p->iVdbeMagic==VDBE_MAGIC_HALT ){
+ assert( VDBE_RUN_STATE>VDBE_READY_STATE );
+ assert( VDBE_HALT_STATE>VDBE_READY_STATE );
+ assert( VDBE_INIT_STATE<VDBE_READY_STATE );
+ if( p->eVdbeState>=VDBE_READY_STATE ){
rc = sqlite3VdbeReset(p);
assert( (rc & p->db->errMask)==rc );
}
@@ -82335,29 +86454,32 @@ SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp,
** VdbeDelete() also unlinks the Vdbe from the list of VMs associated with
** the database connection and frees the object itself.
*/
-SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
+static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
SubProgram *pSub, *pNext;
+ assert( db!=0 );
assert( p->db==0 || p->db==db );
- releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
+ if( p->aColName ){
+ releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
+ sqlite3DbNNFreeNN(db, p->aColName);
+ }
for(pSub=p->pProgram; pSub; pSub=pNext){
pNext = pSub->pNext;
vdbeFreeOpArray(db, pSub->aOp, pSub->nOp);
sqlite3DbFree(db, pSub);
}
- if( p->iVdbeMagic!=VDBE_MAGIC_INIT ){
+ if( p->eVdbeState!=VDBE_INIT_STATE ){
releaseMemArray(p->aVar, p->nVar);
- sqlite3DbFree(db, p->pVList);
- sqlite3DbFree(db, p->pFree);
+ if( p->pVList ) sqlite3DbNNFreeNN(db, p->pVList);
+ if( p->pFree ) sqlite3DbNNFreeNN(db, p->pFree);
}
vdbeFreeOpArray(db, p->aOp, p->nOp);
- sqlite3DbFree(db, p->aColName);
- sqlite3DbFree(db, p->zSql);
+ if( p->zSql ) sqlite3DbNNFreeNN(db, p->zSql);
#ifdef SQLITE_ENABLE_NORMALIZE
sqlite3DbFree(db, p->zNormSql);
{
- DblquoteStr *pThis, *pNext;
- for(pThis=p->pDblStr; pThis; pThis=pNext){
- pNext = pThis->pNextStr;
+ DblquoteStr *pThis, *pNxt;
+ for(pThis=p->pDblStr; pThis; pThis=pNxt){
+ pNxt = pThis->pNextStr;
sqlite3DbFree(db, pThis);
}
}
@@ -82381,20 +86503,17 @@ SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){
assert( p!=0 );
db = p->db;
+ assert( db!=0 );
assert( sqlite3_mutex_held(db->mutex) );
sqlite3VdbeClearObject(db, p);
- if( p->pPrev ){
- p->pPrev->pNext = p->pNext;
- }else{
- assert( db->pVdbe==p );
- db->pVdbe = p->pNext;
- }
- if( p->pNext ){
- p->pNext->pPrev = p->pPrev;
+ if( db->pnBytesFreed==0 ){
+ assert( p->ppVPrev!=0 );
+ *p->ppVPrev = p->pVNext;
+ if( p->pVNext ){
+ p->pVNext->ppVPrev = p->ppVPrev;
+ }
}
- p->iVdbeMagic = VDBE_MAGIC_DEAD;
- p->db = 0;
- sqlite3DbFreeNN(db, p);
+ sqlite3DbNNFreeNN(db, p);
}
/*
@@ -82410,7 +86529,7 @@ SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){
assert( p->deferredMoveto );
assert( p->isTable );
assert( p->eCurType==CURTYPE_BTREE );
- rc = sqlite3BtreeMovetoUnpacked(p->uc.pCursor, 0, p->movetoTarget, 0, &res);
+ rc = sqlite3BtreeTableMoveto(p->uc.pCursor, p->movetoTarget, 0, &res);
if( rc ) return rc;
if( res!=0 ) return SQLITE_CORRUPT_BKPT;
#ifdef SQLITE_TEST
@@ -82428,7 +86547,7 @@ SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){
** is supposed to be pointing. If the row was deleted out from under the
** cursor, set the cursor to point to a NULL row.
*/
-static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){
+SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p){
int isDifferentRow, rc;
assert( p->eCurType==CURTYPE_BTREE );
assert( p->uc.pCursor!=0 );
@@ -82444,41 +86563,9 @@ static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){
** if need be. Return any I/O error from the restore operation.
*/
SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor *p){
- assert( p->eCurType==CURTYPE_BTREE );
+ assert( p->eCurType==CURTYPE_BTREE || IsNullCursor(p) );
if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){
- return handleMovedCursor(p);
- }
- return SQLITE_OK;
-}
-
-/*
-** Make sure the cursor p is ready to read or write the row to which it
-** was last positioned. Return an error code if an OOM fault or I/O error
-** prevents us from positioning the cursor to its correct position.
-**
-** If a MoveTo operation is pending on the given cursor, then do that
-** MoveTo now. If no move is pending, check to see if the row has been
-** deleted out from under the cursor and if it has, mark the row as
-** a NULL row.
-**
-** If the cursor is already pointing to the correct row and that row has
-** not been deleted out from under the cursor, then this routine is a no-op.
-*/
-SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, u32 *piCol){
- VdbeCursor *p = *pp;
- assert( p->eCurType==CURTYPE_BTREE || p->eCurType==CURTYPE_PSEUDO );
- if( p->deferredMoveto ){
- u32 iMap;
- assert( !p->isEphemeral );
- if( p->aAltMap && (iMap = p->aAltMap[1+*piCol])>0 && !p->nullRow ){
- *pp = p->pAltCursor;
- *piCol = iMap - 1;
- return SQLITE_OK;
- }
- return sqlite3VdbeFinishMoveto(p);
- }
- if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){
- return handleMovedCursor(p);
+ return sqlite3VdbeHandleMovedCursor(p);
}
return SQLITE_OK;
}
@@ -82489,7 +86576,7 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, u32 *piCol){
** sqlite3VdbeSerialType()
** sqlite3VdbeSerialTypeLen()
** sqlite3VdbeSerialLen()
-** sqlite3VdbeSerialPut()
+** sqlite3VdbeSerialPut() <--- in-lined into OP_MakeRecord as of 2022-04-02
** sqlite3VdbeSerialGet()
**
** encapsulate the code that serializes values for storage in SQLite
@@ -82601,7 +86688,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){
/*
** The sizes for serial types less than 128
*/
-static const u8 sqlite3SmallTypeSizes[] = {
+SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[128] = {
/* 0 1 2 3 4 5 6 7 8 9 */
/* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0,
/* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
@@ -82670,7 +86757,7 @@ SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){
** so we trust him.
*/
#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
-static u64 floatSwap(u64 in){
+SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in){
union {
u64 r;
u32 i[2];
@@ -82683,59 +86770,8 @@ static u64 floatSwap(u64 in){
u.i[1] = t;
return u.r;
}
-# define swapMixedEndianFloat(X) X = floatSwap(X)
-#else
-# define swapMixedEndianFloat(X)
-#endif
-
-/*
-** Write the serialized data blob for the value stored in pMem into
-** buf. It is assumed that the caller has allocated sufficient space.
-** Return the number of bytes written.
-**
-** nBuf is the amount of space left in buf[]. The caller is responsible
-** for allocating enough space to buf[] to hold the entire field, exclusive
-** of the pMem->u.nZero bytes for a MEM_Zero value.
-**
-** Return the number of bytes actually written into buf[]. The number
-** of bytes in the zero-filled tail is included in the return value only
-** if those bytes were zeroed in buf[].
-*/
-SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){
- u32 len;
-
- /* Integer and Real */
- if( serial_type<=7 && serial_type>0 ){
- u64 v;
- u32 i;
- if( serial_type==7 ){
- assert( sizeof(v)==sizeof(pMem->u.r) );
- memcpy(&v, &pMem->u.r, sizeof(v));
- swapMixedEndianFloat(v);
- }else{
- v = pMem->u.i;
- }
- len = i = sqlite3SmallTypeSizes[serial_type];
- assert( i>0 );
- do{
- buf[--i] = (u8)(v&0xFF);
- v >>= 8;
- }while( i );
- return len;
- }
+#endif /* SQLITE_MIXED_ENDIAN_64BIT_FLOAT */
- /* String or blob */
- if( serial_type>=12 ){
- assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0)
- == (int)sqlite3VdbeSerialTypeLen(serial_type) );
- len = pMem->n;
- if( len>0 ) memcpy(buf, pMem->z, len);
- return len;
- }
-
- /* NULL or constants 0 or 1 */
- return 0;
-}
/* Input "x" is a sequence of unsigned characters that represent a
** big-endian integer. Return the equivalent native integer
@@ -82748,14 +86784,14 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){
/*
** Deserialize the data blob pointed to by buf as serial type serial_type
-** and store the result in pMem. Return the number of bytes read.
+** and store the result in pMem.
**
** This function is implemented as two separate routines for performance.
** The few cases that require local variables are broken out into a separate
** routine so that in most cases the overhead of moving the stack pointer
** is avoided.
*/
-static u32 serialGet(
+static void serialGet(
const unsigned char *buf, /* Buffer to deserialize from */
u32 serial_type, /* Serial type to deserialize */
Mem *pMem /* Memory cell to write value into */
@@ -82789,9 +86825,8 @@ static u32 serialGet(
memcpy(&pMem->u.r, &x, sizeof(x));
pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real;
}
- return 8;
}
-SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
+SQLITE_PRIVATE void sqlite3VdbeSerialGet(
const unsigned char *buf, /* Buffer to deserialize from */
u32 serial_type, /* Serial type to deserialize */
Mem *pMem /* Memory cell to write value into */
@@ -82802,13 +86837,13 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
pMem->flags = MEM_Null|MEM_Zero;
pMem->n = 0;
pMem->u.nZero = 0;
- break;
+ return;
}
case 11: /* Reserved for future use */
case 0: { /* Null */
/* EVIDENCE-OF: R-24078-09375 Value is a NULL. */
pMem->flags = MEM_Null;
- break;
+ return;
}
case 1: {
/* EVIDENCE-OF: R-44885-25196 Value is an 8-bit twos-complement
@@ -82816,7 +86851,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
pMem->u.i = ONE_BYTE_INT(buf);
pMem->flags = MEM_Int;
testcase( pMem->u.i<0 );
- return 1;
+ return;
}
case 2: { /* 2-byte signed integer */
/* EVIDENCE-OF: R-49794-35026 Value is a big-endian 16-bit
@@ -82824,7 +86859,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
pMem->u.i = TWO_BYTE_INT(buf);
pMem->flags = MEM_Int;
testcase( pMem->u.i<0 );
- return 2;
+ return;
}
case 3: { /* 3-byte signed integer */
/* EVIDENCE-OF: R-37839-54301 Value is a big-endian 24-bit
@@ -82832,7 +86867,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
pMem->u.i = THREE_BYTE_INT(buf);
pMem->flags = MEM_Int;
testcase( pMem->u.i<0 );
- return 3;
+ return;
}
case 4: { /* 4-byte signed integer */
/* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit
@@ -82844,7 +86879,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
#endif
pMem->flags = MEM_Int;
testcase( pMem->u.i<0 );
- return 4;
+ return;
}
case 5: { /* 6-byte signed integer */
/* EVIDENCE-OF: R-50385-09674 Value is a big-endian 48-bit
@@ -82852,13 +86887,14 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
pMem->u.i = FOUR_BYTE_UINT(buf+2) + (((i64)1)<<32)*TWO_BYTE_INT(buf);
pMem->flags = MEM_Int;
testcase( pMem->u.i<0 );
- return 6;
+ return;
}
case 6: /* 8-byte signed integer */
case 7: { /* IEEE floating point */
/* These use local variables, so do them in a separate routine
** to avoid having to move the frame pointer in the common case */
- return serialGet(buf,serial_type,pMem);
+ serialGet(buf,serial_type,pMem);
+ return;
}
case 8: /* Integer 0 */
case 9: { /* Integer 1 */
@@ -82866,7 +86902,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
/* EVIDENCE-OF: R-18143-12121 Value is the integer 1. */
pMem->u.i = serial_type-8;
pMem->flags = MEM_Int;
- return 0;
+ return;
}
default: {
/* EVIDENCE-OF: R-14606-31564 Value is a BLOB that is (N-12)/2 bytes in
@@ -82877,10 +86913,10 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
pMem->z = (char *)buf;
pMem->n = (serial_type-12)/2;
pMem->flags = aFlag[serial_type&1];
- return pMem->n;
+ return;
}
}
- return 0;
+ return;
}
/*
** This routine is used to allocate sufficient space for an UnpackedRecord
@@ -82901,10 +86937,10 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(
){
UnpackedRecord *p; /* Unpacked record to return */
int nByte; /* Number of bytes required for *p */
- nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1);
+ nByte = ROUND8P(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1);
p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte);
if( !p ) return 0;
- p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))];
+ p->aMem = (Mem*)&((char*)p)[ROUND8P(sizeof(UnpackedRecord))];
assert( pKeyInfo->aSortFlags!=0 );
p->pKeyInfo = pKeyInfo;
p->nField = pKeyInfo->nKeyField + 1;
@@ -82943,7 +86979,8 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(
/* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */
pMem->szMalloc = 0;
pMem->z = 0;
- d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem);
+ sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem);
+ d += sqlite3VdbeSerialTypeLen(serial_type);
pMem++;
if( (++u)>=p->nField ) break;
}
@@ -83027,7 +87064,8 @@ static int vdbeRecordCompareDebug(
/* Extract the values to be compared.
*/
- d1 += sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1);
+ sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1);
+ d1 += sqlite3VdbeSerialTypeLen(serial_type1);
/* Do the comparison
*/
@@ -83138,8 +87176,8 @@ static int vdbeCompareMemString(
}else{
rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2);
}
- sqlite3VdbeMemRelease(&c1);
- sqlite3VdbeMemRelease(&c2);
+ sqlite3VdbeMemReleaseMalloc(&c1);
+ sqlite3VdbeMemReleaseMalloc(&c2);
return rc;
}
}
@@ -83194,7 +87232,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem
** number. Return negative, zero, or positive if the first (i64) is less than,
** equal to, or greater than the second (double).
*/
-static int sqlite3IntFloatCompare(i64 i, double r){
+SQLITE_PRIVATE int sqlite3IntFloatCompare(i64 i, double r){
if( sizeof(LONGDOUBLE_TYPE)>8 ){
LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i;
testcase( x<r );
@@ -83400,14 +87438,22 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
** two elements in the keys are equal. Fix the various stack variables so
** that this routine begins comparing at the second field. */
if( bSkip ){
- u32 s1;
- idx1 = 1 + getVarint32(&aKey1[1], s1);
+ u32 s1 = aKey1[1];
+ if( s1<0x80 ){
+ idx1 = 2;
+ }else{
+ idx1 = 1 + sqlite3GetVarint32(&aKey1[1], &s1);
+ }
szHdr1 = aKey1[0];
d1 = szHdr1 + sqlite3VdbeSerialTypeLen(s1);
i = 1;
pRhs++;
}else{
- idx1 = getVarint32(aKey1, szHdr1);
+ if( (szHdr1 = aKey1[0])<0x80 ){
+ idx1 = 1;
+ }else{
+ idx1 = sqlite3GetVarint32(aKey1, &szHdr1);
+ }
d1 = szHdr1;
i = 0;
}
@@ -83422,7 +87468,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
assert( pPKey2->pKeyInfo->aSortFlags!=0 );
assert( pPKey2->pKeyInfo->nKeyField>0 );
assert( idx1<=szHdr1 || CORRUPT_DB );
- do{
+ while( 1 /*exit-by-break*/ ){
u32 serial_type;
/* RHS is an integer */
@@ -83432,7 +87478,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
serial_type = aKey1[idx1];
testcase( serial_type==12 );
if( serial_type>=10 ){
- rc = +1;
+ rc = serial_type==10 ? -1 : +1;
}else if( serial_type==0 ){
rc = -1;
}else if( serial_type==7 ){
@@ -83457,7 +87503,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
** numbers). Types 10 and 11 are currently "reserved for future
** use", so it doesn't really matter what the results of comparing
** them to numberic values are. */
- rc = +1;
+ rc = serial_type==10 ? -1 : +1;
}else if( serial_type==0 ){
rc = -1;
}else{
@@ -83538,7 +87584,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
/* RHS is null */
else{
serial_type = aKey1[idx1];
- rc = (serial_type!=0);
+ rc = (serial_type!=0 && serial_type!=10);
}
if( rc!=0 ){
@@ -83560,8 +87606,13 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(
if( i==pPKey2->nField ) break;
pRhs++;
d1 += sqlite3VdbeSerialTypeLen(serial_type);
+ if( d1>(unsigned)nKey1 ) break;
idx1 += sqlite3VarintLen(serial_type);
- }while( idx1<(unsigned)szHdr1 && d1<=(unsigned)nKey1 );
+ if( idx1>=(unsigned)szHdr1 ){
+ pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT;
+ return 0; /* Corrupt index */
+ }
+ }
/* No memory allocation is ever used on mem1. Prove this using
** the following assert(). If the assert() fails, it indicates a
@@ -83663,7 +87714,8 @@ static int vdbeRecordCompareInt(
return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2);
}
- v = pPKey2->aMem[0].u.i;
+ assert( pPKey2->u.i == pPKey2->aMem[0].u.i );
+ v = pPKey2->u.i;
if( v>lhs ){
res = pPKey2->r1;
}else if( v<lhs ){
@@ -83698,12 +87750,18 @@ static int vdbeRecordCompareString(
int res;
assert( pPKey2->aMem[0].flags & MEM_Str );
+ assert( pPKey2->aMem[0].n == pPKey2->n );
+ assert( pPKey2->aMem[0].z == pPKey2->u.z );
vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo);
- serial_type = (u8)(aKey1[1]);
- if( serial_type >= 0x80 ){
- sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type);
- }
+ serial_type = (signed char)(aKey1[1]);
+
+vrcs_restart:
if( serial_type<12 ){
+ if( serial_type<0 ){
+ sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type);
+ if( serial_type>=12 ) goto vrcs_restart;
+ assert( CORRUPT_DB );
+ }
res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */
}else if( !(serial_type & 0x01) ){
res = pPKey2->r2; /* (pKey1/nKey1) is a blob */
@@ -83717,15 +87775,15 @@ static int vdbeRecordCompareString(
pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT;
return 0; /* Corruption */
}
- nCmp = MIN( pPKey2->aMem[0].n, nStr );
- res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp);
+ nCmp = MIN( pPKey2->n, nStr );
+ res = memcmp(&aKey1[szHdr], pPKey2->u.z, nCmp);
if( res>0 ){
res = pPKey2->r2;
}else if( res<0 ){
res = pPKey2->r1;
}else{
- res = nStr - pPKey2->aMem[0].n;
+ res = nStr - pPKey2->n;
if( res==0 ){
if( pPKey2->nField>1 ){
res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1);
@@ -83780,6 +87838,7 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){
p->r2 = 1;
}
if( (flags & MEM_Int) ){
+ p->u.i = p->aMem[0].u.i;
return vdbeRecordCompareInt;
}
testcase( flags & MEM_Real );
@@ -83789,6 +87848,8 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){
&& p->pKeyInfo->aColl[0]==0
){
assert( flags & MEM_Str );
+ p->u.z = p->aMem[0].z;
+ p->n = p->aMem[0].n;
return vdbeRecordCompareString;
}
}
@@ -83831,7 +87892,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){
/* The index entry must begin with a header size */
getVarint32NR((u8*)m.z, szHdr);
testcase( szHdr==3 );
- testcase( szHdr==m.n );
+ testcase( szHdr==(u32)m.n );
testcase( szHdr>0x7fffffff );
assert( m.n>=0 );
if( unlikely(szHdr<3 || szHdr>(unsigned)m.n) ){
@@ -83861,14 +87922,14 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){
/* Fetch the integer off the end of the index record */
sqlite3VdbeSerialGet((u8*)&m.z[m.n-lenRowid], typeRowid, &v);
*rowid = v.u.i;
- sqlite3VdbeMemRelease(&m);
+ sqlite3VdbeMemReleaseMalloc(&m);
return SQLITE_OK;
/* Jump here if database corruption is detected after m has been
** allocated. Free the m object and return SQLITE_CORRUPT. */
idx_rowid_corruption:
testcase( m.szMalloc!=0 );
- sqlite3VdbeMemRelease(&m);
+ sqlite3VdbeMemReleaseMalloc(&m);
return SQLITE_CORRUPT_BKPT;
}
@@ -83910,7 +87971,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(
return rc;
}
*res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0);
- sqlite3VdbeMemRelease(&m);
+ sqlite3VdbeMemReleaseMalloc(&m);
return SQLITE_OK;
}
@@ -83918,7 +87979,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(
** This routine sets the value to be returned by subsequent calls to
** sqlite3_changes() on the database handle 'db'.
*/
-SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *db, int nChange){
+SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *db, i64 nChange){
assert( sqlite3_mutex_held(db->mutex) );
db->nChange = nChange;
db->nTotalChange += nChange;
@@ -83952,7 +88013,7 @@ SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe *v){
*/
SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3 *db, int iCode){
Vdbe *p;
- for(p = db->pVdbe; p; p=p->pNext){
+ for(p = db->pVdbe; p; p=p->pVNext){
p->expired = iCode+1;
}
}
@@ -84045,6 +88106,20 @@ SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){
return 1;
}
+#if defined(SQLITE_ENABLE_CURSOR_HINTS) && defined(SQLITE_DEBUG)
+/*
+** This Walker callback is used to help verify that calls to
+** sqlite3BtreeCursorHint() with opcode BTREE_HINT_RANGE have
+** byte-code register values correctly initialized.
+*/
+SQLITE_PRIVATE int sqlite3CursorRangeHintExprCheck(Walker *pWalker, Expr *pExpr){
+ if( pExpr->op==TK_REGISTER ){
+ assert( (pWalker->u.aMem[pExpr->iTable].flags & MEM_Undefined)==0 );
+ }
+ return WRC_Continue;
+}
+#endif /* SQLITE_ENABLE_CURSOR_HINTS && SQLITE_DEBUG */
+
#ifndef SQLITE_OMIT_VIRTUALTABLE
/*
** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
@@ -84073,13 +88148,14 @@ SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){
** the vdbeUnpackRecord() function found in vdbeapi.c.
*/
static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){
+ assert( db!=0 );
if( p ){
int i;
for(i=0; i<nField; i++){
Mem *pMem = &p->aMem[i];
- if( pMem->zMalloc ) sqlite3VdbeMemRelease(pMem);
+ if( pMem->zMalloc ) sqlite3VdbeMemReleaseMalloc(pMem);
}
- sqlite3DbFreeNN(db, p);
+ sqlite3DbNNFreeNN(db, p);
}
}
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
@@ -84106,6 +88182,16 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(
PreUpdate preupdate;
const char *zTbl = pTab->zName;
static const u8 fakeSortOrder = 0;
+#ifdef SQLITE_DEBUG
+ int nRealCol;
+ if( pTab->tabFlags & TF_WithoutRowid ){
+ nRealCol = sqlite3PrimaryKeyIndex(pTab)->nColumn;
+ }else if( pTab->tabFlags & TF_HasVirtual ){
+ nRealCol = pTab->nNVCol;
+ }else{
+ nRealCol = pTab->nCol;
+ }
+#endif
assert( db->pPreUpdate==0 );
memset(&preupdate, 0, sizeof(PreUpdate));
@@ -84120,8 +88206,10 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(
}
}
- assert( pCsr->nField==pTab->nCol
- || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1)
+ assert( pCsr!=0 );
+ assert( pCsr->eCurType==CURTYPE_BTREE );
+ assert( pCsr->nField==nRealCol
+ || (pCsr->nField==nRealCol+1 && op==SQLITE_DELETE && iReg==-1)
);
preupdate.v = v;
@@ -84148,7 +88236,7 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(
for(i=0; i<pCsr->nField; i++){
sqlite3VdbeMemRelease(&preupdate.aNew[i]);
}
- sqlite3DbFreeNN(db, preupdate.aNew);
+ sqlite3DbNNFreeNN(db, preupdate.aNew);
}
}
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
@@ -84172,6 +88260,7 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(
*/
/* #include "sqliteInt.h" */
/* #include "vdbeInt.h" */
+/* #include "opcodes.h" */
#ifndef SQLITE_OMIT_DEPRECATED
/*
@@ -84265,7 +88354,9 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt){
if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT;
sqlite3_mutex_enter(db->mutex);
checkProfileCallback(db, v);
- rc = sqlite3VdbeFinalize(v);
+ assert( v->eVdbeState>=VDBE_READY_STATE );
+ rc = sqlite3VdbeReset(v);
+ sqlite3VdbeDelete(v);
rc = sqlite3ApiExit(db, rc);
sqlite3LeaveMutexAndCloseZombie(db);
}
@@ -84425,7 +88516,7 @@ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){
SQLITE_NULL, /* 0x1f (not possible) */
SQLITE_FLOAT, /* 0x20 INTREAL */
SQLITE_NULL, /* 0x21 (not possible) */
- SQLITE_TEXT, /* 0x22 INTREAL + TEXT */
+ SQLITE_FLOAT, /* 0x22 INTREAL + TEXT */
SQLITE_NULL, /* 0x23 (not possible) */
SQLITE_FLOAT, /* 0x24 (not possible) */
SQLITE_NULL, /* 0x25 (not possible) */
@@ -84473,6 +88564,9 @@ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){
#endif
return aType[pVal->flags&MEM_AffMask];
}
+SQLITE_API int sqlite3_value_encoding(sqlite3_value *pVal){
+ return pVal->enc;
+}
/* Return true if a parameter to xUpdate represents an unchanged column */
SQLITE_API int sqlite3_value_nochange(sqlite3_value *pVal){
@@ -84502,6 +88596,9 @@ SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){
sqlite3ValueFree(pNew);
pNew = 0;
}
+ }else if( pNew->flags & MEM_Null ){
+ /* Do not duplicate pointer values */
+ pNew->flags &= ~(MEM_Term|MEM_Subtype);
}
return pNew;
}
@@ -84519,8 +88616,8 @@ SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){
** the function result.
**
** The setStrOrError() function calls sqlite3VdbeMemSetStr() to store the
-** result as a string or blob but if the string or blob is too large, it
-** then sets the error code to SQLITE_TOOBIG
+** result as a string or blob. Appropriate errors are set if the string/blob
+** is too big or if an OOM occurs.
**
** The invokeValueDestructor(P,X) routine invokes destructor function X()
** on value P is not going to be used and need to be destroyed.
@@ -84532,7 +88629,21 @@ static void setResultStrOrError(
u8 enc, /* Encoding of z. 0 for BLOBs */
void (*xDel)(void*) /* Destructor function */
){
- if( sqlite3VdbeMemSetStr(pCtx->pOut, z, n, enc, xDel)==SQLITE_TOOBIG ){
+ Mem *pOut = pCtx->pOut;
+ int rc = sqlite3VdbeMemSetStr(pOut, z, n, enc, xDel);
+ if( rc ){
+ if( rc==SQLITE_TOOBIG ){
+ sqlite3_result_error_toobig(pCtx);
+ }else{
+ /* The only errors possible from sqlite3VdbeMemSetStr are
+ ** SQLITE_TOOBIG and SQLITE_NOMEM */
+ assert( rc==SQLITE_NOMEM );
+ sqlite3_result_error_nomem(pCtx);
+ }
+ return;
+ }
+ sqlite3VdbeChangeEncoding(pOut, pCtx->enc);
+ if( sqlite3VdbeMemTooBig(pOut) ){
sqlite3_result_error_toobig(pCtx);
}
}
@@ -84640,7 +88751,10 @@ SQLITE_API void sqlite3_result_text64(
){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
assert( xDel!=SQLITE_DYNAMIC );
- if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE;
+ if( enc!=SQLITE_UTF8 ){
+ if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE;
+ n &= ~(u64)1;
+ }
if( n>0x7fffffff ){
(void)invokeValueDestructor(z, xDel, pCtx);
}else{
@@ -84655,7 +88769,7 @@ SQLITE_API void sqlite3_result_text16(
void (*xDel)(void *)
){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
- setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel);
+ setResultStrOrError(pCtx, z, n & ~(u64)1, SQLITE_UTF16NATIVE, xDel);
}
SQLITE_API void sqlite3_result_text16be(
sqlite3_context *pCtx,
@@ -84664,7 +88778,7 @@ SQLITE_API void sqlite3_result_text16be(
void (*xDel)(void *)
){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
- setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel);
+ setResultStrOrError(pCtx, z, n & ~(u64)1, SQLITE_UTF16BE, xDel);
}
SQLITE_API void sqlite3_result_text16le(
sqlite3_context *pCtx,
@@ -84673,25 +88787,34 @@ SQLITE_API void sqlite3_result_text16le(
void (*xDel)(void *)
){
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
- setResultStrOrError(pCtx, z, n, SQLITE_UTF16LE, xDel);
+ setResultStrOrError(pCtx, z, n & ~(u64)1, SQLITE_UTF16LE, xDel);
}
#endif /* SQLITE_OMIT_UTF16 */
SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){
+ Mem *pOut = pCtx->pOut;
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
- sqlite3VdbeMemCopy(pCtx->pOut, pValue);
+ sqlite3VdbeMemCopy(pOut, pValue);
+ sqlite3VdbeChangeEncoding(pOut, pCtx->enc);
+ if( sqlite3VdbeMemTooBig(pOut) ){
+ sqlite3_result_error_toobig(pCtx);
+ }
}
SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){
- assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
- sqlite3VdbeMemSetZeroBlob(pCtx->pOut, n);
+ sqlite3_result_zeroblob64(pCtx, n>0 ? n : 0);
}
SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){
Mem *pOut = pCtx->pOut;
assert( sqlite3_mutex_held(pOut->db->mutex) );
if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ sqlite3_result_error_toobig(pCtx);
return SQLITE_TOOBIG;
}
+#ifndef SQLITE_OMIT_INCRBLOB
sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n);
return SQLITE_OK;
+#else
+ return sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n);
+#endif
}
SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
pCtx->isError = errCode ? errCode : -1;
@@ -84699,8 +88822,8 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode;
#endif
if( pCtx->pOut->flags & MEM_Null ){
- sqlite3VdbeMemSetStr(pCtx->pOut, sqlite3ErrStr(errCode), -1,
- SQLITE_UTF8, SQLITE_STATIC);
+ setResultStrOrError(pCtx, sqlite3ErrStr(errCode), -1, SQLITE_UTF8,
+ SQLITE_STATIC);
}
}
@@ -84774,80 +88897,83 @@ static int sqlite3Step(Vdbe *p){
int rc;
assert(p);
- if( p->iVdbeMagic!=VDBE_MAGIC_RUN ){
- /* We used to require that sqlite3_reset() be called before retrying
- ** sqlite3_step() after any error or after SQLITE_DONE. But beginning
- ** with version 3.7.0, we changed this so that sqlite3_reset() would
- ** be called automatically instead of throwing the SQLITE_MISUSE error.
- ** This "automatic-reset" change is not technically an incompatibility,
- ** since any application that receives an SQLITE_MISUSE is broken by
- ** definition.
- **
- ** Nevertheless, some published applications that were originally written
- ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE
- ** returns, and those were broken by the automatic-reset change. As a
- ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the
- ** legacy behavior of returning SQLITE_MISUSE for cases where the
- ** previous sqlite3_step() returned something other than a SQLITE_LOCKED
- ** or SQLITE_BUSY error.
- */
-#ifdef SQLITE_OMIT_AUTORESET
- if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){
- sqlite3_reset((sqlite3_stmt*)p);
- }else{
- return SQLITE_MISUSE_BKPT;
- }
-#else
- sqlite3_reset((sqlite3_stmt*)p);
-#endif
- }
-
- /* Check that malloc() has not failed. If it has, return early. */
db = p->db;
- if( db->mallocFailed ){
- p->rc = SQLITE_NOMEM;
- return SQLITE_NOMEM_BKPT;
- }
+ if( p->eVdbeState!=VDBE_RUN_STATE ){
+ restart_step:
+ if( p->eVdbeState==VDBE_READY_STATE ){
+ if( p->expired ){
+ p->rc = SQLITE_SCHEMA;
+ rc = SQLITE_ERROR;
+ if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){
+ /* If this statement was prepared using saved SQL and an
+ ** error has occurred, then return the error code in p->rc to the
+ ** caller. Set the error code in the database handle to the same
+ ** value.
+ */
+ rc = sqlite3VdbeTransferError(p);
+ }
+ goto end_of_step;
+ }
- if( p->pc<0 && p->expired ){
- p->rc = SQLITE_SCHEMA;
- rc = SQLITE_ERROR;
- if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){
- /* If this statement was prepared using saved SQL and an
- ** error has occurred, then return the error code in p->rc to the
- ** caller. Set the error code in the database handle to the same value.
+ /* If there are no other statements currently running, then
+ ** reset the interrupt flag. This prevents a call to sqlite3_interrupt
+ ** from interrupting a statement that has not yet started.
*/
- rc = sqlite3VdbeTransferError(p);
- }
- goto end_of_step;
- }
- if( p->pc<0 ){
- /* If there are no other statements currently running, then
- ** reset the interrupt flag. This prevents a call to sqlite3_interrupt
- ** from interrupting a statement that has not yet started.
- */
- if( db->nVdbeActive==0 ){
- AtomicStore(&db->u1.isInterrupted, 0);
- }
+ if( db->nVdbeActive==0 ){
+ AtomicStore(&db->u1.isInterrupted, 0);
+ }
- assert( db->nVdbeWrite>0 || db->autoCommit==0
- || (db->nDeferredCons==0 && db->nDeferredImmCons==0)
- );
+ assert( db->nVdbeWrite>0 || db->autoCommit==0
+ || (db->nDeferredCons==0 && db->nDeferredImmCons==0)
+ );
#ifndef SQLITE_OMIT_TRACE
- if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0
- && !db->init.busy && p->zSql ){
- sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime);
- }else{
- assert( p->startTime==0 );
- }
+ if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0
+ && !db->init.busy && p->zSql ){
+ sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime);
+ }else{
+ assert( p->startTime==0 );
+ }
#endif
- db->nVdbeActive++;
- if( p->readOnly==0 ) db->nVdbeWrite++;
- if( p->bIsReader ) db->nVdbeRead++;
- p->pc = 0;
+ db->nVdbeActive++;
+ if( p->readOnly==0 ) db->nVdbeWrite++;
+ if( p->bIsReader ) db->nVdbeRead++;
+ p->pc = 0;
+ p->eVdbeState = VDBE_RUN_STATE;
+ }else
+
+ if( ALWAYS(p->eVdbeState==VDBE_HALT_STATE) ){
+ /* We used to require that sqlite3_reset() be called before retrying
+ ** sqlite3_step() after any error or after SQLITE_DONE. But beginning
+ ** with version 3.7.0, we changed this so that sqlite3_reset() would
+ ** be called automatically instead of throwing the SQLITE_MISUSE error.
+ ** This "automatic-reset" change is not technically an incompatibility,
+ ** since any application that receives an SQLITE_MISUSE is broken by
+ ** definition.
+ **
+ ** Nevertheless, some published applications that were originally written
+ ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE
+ ** returns, and those were broken by the automatic-reset change. As a
+ ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the
+ ** legacy behavior of returning SQLITE_MISUSE for cases where the
+ ** previous sqlite3_step() returned something other than a SQLITE_LOCKED
+ ** or SQLITE_BUSY error.
+ */
+#ifdef SQLITE_OMIT_AUTORESET
+ if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){
+ sqlite3_reset((sqlite3_stmt*)p);
+ }else{
+ return SQLITE_MISUSE_BKPT;
+ }
+#else
+ sqlite3_reset((sqlite3_stmt*)p);
+#endif
+ assert( p->eVdbeState==VDBE_READY_STATE );
+ goto restart_step;
+ }
}
+
#ifdef SQLITE_DEBUG
p->rcApp = SQLITE_OK;
#endif
@@ -84862,12 +88988,17 @@ static int sqlite3Step(Vdbe *p){
db->nVdbeExec--;
}
- if( rc!=SQLITE_ROW ){
+ if( rc==SQLITE_ROW ){
+ assert( p->rc==SQLITE_OK );
+ assert( db->mallocFailed==0 );
+ db->errCode = SQLITE_ROW;
+ return SQLITE_ROW;
+ }else{
#ifndef SQLITE_OMIT_TRACE
/* If the statement completed successfully, invoke the profile callback */
checkProfileCallback(db, p);
#endif
-
+ p->pResultRow = 0;
if( rc==SQLITE_DONE && db->autoCommit ){
assert( p->rc==SQLITE_OK );
p->rc = doWalCallbacks(db);
@@ -84914,7 +89045,6 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
}
db = v->db;
sqlite3_mutex_enter(db->mutex);
- v->doingRerun = 0;
while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
&& cnt++ < SQLITE_MAX_SCHEMA_RETRY ){
int savedPc = v->pc;
@@ -84940,7 +89070,13 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
break;
}
sqlite3_reset(pStmt);
- if( savedPc>=0 ) v->doingRerun = 1;
+ if( savedPc>=0 ){
+ /* Setting minWriteFileFormat to 254 is a signal to the OP_Init and
+ ** OP_Trace opcodes to *not* perform SQLITE_TRACE_STMT because it has
+ ** already been done once on a prior invocation that failed due to
+ ** SQLITE_SCHEMA. tag-20220401a */
+ v->minWriteFileFormat = 254;
+ }
assert( v->expired==0 );
}
sqlite3_mutex_leave(db->mutex);
@@ -84992,6 +89128,88 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){
}
/*
+** The destructor function for a ValueList object. This needs to be
+** a separate function, unknowable to the application, to ensure that
+** calls to sqlite3_vtab_in_first()/sqlite3_vtab_in_next() that are not
+** preceeded by activation of IN processing via sqlite3_vtab_int() do not
+** try to access a fake ValueList object inserted by a hostile extension.
+*/
+SQLITE_PRIVATE void sqlite3VdbeValueListFree(void *pToDelete){
+ sqlite3_free(pToDelete);
+}
+
+/*
+** Implementation of sqlite3_vtab_in_first() (if bNext==0) and
+** sqlite3_vtab_in_next() (if bNext!=0).
+*/
+static int valueFromValueList(
+ sqlite3_value *pVal, /* Pointer to the ValueList object */
+ sqlite3_value **ppOut, /* Store the next value from the list here */
+ int bNext /* 1 for _next(). 0 for _first() */
+){
+ int rc;
+ ValueList *pRhs;
+
+ *ppOut = 0;
+ if( pVal==0 ) return SQLITE_MISUSE;
+ if( (pVal->flags & MEM_Dyn)==0 || pVal->xDel!=sqlite3VdbeValueListFree ){
+ return SQLITE_ERROR;
+ }else{
+ assert( (pVal->flags&(MEM_TypeMask|MEM_Term|MEM_Subtype)) ==
+ (MEM_Null|MEM_Term|MEM_Subtype) );
+ assert( pVal->eSubtype=='p' );
+ assert( pVal->u.zPType!=0 && strcmp(pVal->u.zPType,"ValueList")==0 );
+ pRhs = (ValueList*)pVal->z;
+ }
+ if( bNext ){
+ rc = sqlite3BtreeNext(pRhs->pCsr, 0);
+ }else{
+ int dummy = 0;
+ rc = sqlite3BtreeFirst(pRhs->pCsr, &dummy);
+ assert( rc==SQLITE_OK || sqlite3BtreeEof(pRhs->pCsr) );
+ if( sqlite3BtreeEof(pRhs->pCsr) ) rc = SQLITE_DONE;
+ }
+ if( rc==SQLITE_OK ){
+ u32 sz; /* Size of current row in bytes */
+ Mem sMem; /* Raw content of current row */
+ memset(&sMem, 0, sizeof(sMem));
+ sz = sqlite3BtreePayloadSize(pRhs->pCsr);
+ rc = sqlite3VdbeMemFromBtreeZeroOffset(pRhs->pCsr,(int)sz,&sMem);
+ if( rc==SQLITE_OK ){
+ u8 *zBuf = (u8*)sMem.z;
+ u32 iSerial;
+ sqlite3_value *pOut = pRhs->pOut;
+ int iOff = 1 + getVarint32(&zBuf[1], iSerial);
+ sqlite3VdbeSerialGet(&zBuf[iOff], iSerial, pOut);
+ pOut->enc = ENC(pOut->db);
+ if( (pOut->flags & MEM_Ephem)!=0 && sqlite3VdbeMemMakeWriteable(pOut) ){
+ rc = SQLITE_NOMEM;
+ }else{
+ *ppOut = pOut;
+ }
+ }
+ sqlite3VdbeMemRelease(&sMem);
+ }
+ return rc;
+}
+
+/*
+** Set the iterator value pVal to point to the first value in the set.
+** Set (*ppOut) to point to this value before returning.
+*/
+SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut){
+ return valueFromValueList(pVal, ppOut, 0);
+}
+
+/*
+** Set the iterator value pVal to point to the next value in the set.
+** Set (*ppOut) to point to this value before returning.
+*/
+SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut){
+ return valueFromValueList(pVal, ppOut, 1);
+}
+
+/*
** Return the current time for a statement. If the current time
** is requested more than once within the same run of a single prepared
** statement, the exact same time is returned for each invocation regardless
@@ -85162,7 +89380,7 @@ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt){
*/
SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt){
Vdbe *pVm = (Vdbe *)pStmt;
- if( pVm==0 || pVm->pResultSet==0 ) return 0;
+ if( pVm==0 || pVm->pResultRow==0 ) return 0;
return pVm->nResColumn;
}
@@ -85185,15 +89403,15 @@ static const Mem *columnNullValue(void){
#endif
= {
/* .u = */ {0},
+ /* .z = */ (char*)0,
+ /* .n = */ (int)0,
/* .flags = */ (u16)MEM_Null,
/* .enc = */ (u8)0,
/* .eSubtype = */ (u8)0,
- /* .n = */ (int)0,
- /* .z = */ (char*)0,
- /* .zMalloc = */ (char*)0,
+ /* .db = */ (sqlite3*)0,
/* .szMalloc = */ (int)0,
/* .uTemp = */ (u32)0,
- /* .db = */ (sqlite3*)0,
+ /* .zMalloc = */ (char*)0,
/* .xDel = */ (void(*)(void*))0,
#ifdef SQLITE_DEBUG
/* .pScopyFrom = */ (Mem*)0,
@@ -85217,8 +89435,8 @@ static Mem *columnMem(sqlite3_stmt *pStmt, int i){
if( pVm==0 ) return (Mem*)columnNullValue();
assert( pVm->db );
sqlite3_mutex_enter(pVm->db->mutex);
- if( pVm->pResultSet!=0 && i<pVm->nResColumn && i>=0 ){
- pOut = &pVm->pResultSet[i];
+ if( pVm->pResultRow!=0 && i<pVm->nResColumn && i>=0 ){
+ pOut = &pVm->pResultRow[i];
}else{
sqlite3Error(pVm->db, SQLITE_RANGE);
pOut = (Mem*)columnNullValue();
@@ -85364,9 +89582,9 @@ static const void *columnName(
assert( db!=0 );
n = sqlite3_column_count(pStmt);
if( N<n && N>=0 ){
+ u8 prior_mallocFailed = db->mallocFailed;
N += useType*n;
sqlite3_mutex_enter(db->mutex);
- assert( db->mallocFailed==0 );
#ifndef SQLITE_OMIT_UTF16
if( useUtf16 ){
ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]);
@@ -85378,7 +89596,8 @@ static const void *columnName(
/* A malloc may have failed inside of the _text() call. If this
** is the case, clear the mallocFailed flag and return NULL.
*/
- if( db->mallocFailed ){
+ assert( db->mallocFailed==0 || db->mallocFailed==1 );
+ if( db->mallocFailed > prior_mallocFailed ){
sqlite3OomClear(db);
ret = 0;
}
@@ -85484,25 +89703,24 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){
** The error code stored in database p->db is overwritten with the return
** value in any case.
*/
-static int vdbeUnbind(Vdbe *p, int i){
+static int vdbeUnbind(Vdbe *p, unsigned int i){
Mem *pVar;
if( vdbeSafetyNotNull(p) ){
return SQLITE_MISUSE_BKPT;
}
sqlite3_mutex_enter(p->db->mutex);
- if( p->iVdbeMagic!=VDBE_MAGIC_RUN || p->pc>=0 ){
+ if( p->eVdbeState!=VDBE_READY_STATE ){
sqlite3Error(p->db, SQLITE_MISUSE);
sqlite3_mutex_leave(p->db->mutex);
sqlite3_log(SQLITE_MISUSE,
"bind on a busy prepared statement: [%s]", p->zSql);
return SQLITE_MISUSE_BKPT;
}
- if( i<1 || i>p->nVar ){
+ if( i>=(unsigned int)p->nVar ){
sqlite3Error(p->db, SQLITE_RANGE);
sqlite3_mutex_leave(p->db->mutex);
return SQLITE_RANGE;
}
- i--;
pVar = &p->aVar[i];
sqlite3VdbeMemRelease(pVar);
pVar->flags = MEM_Null;
@@ -85539,7 +89757,7 @@ static int bindText(
Mem *pVar;
int rc;
- rc = vdbeUnbind(p, i);
+ rc = vdbeUnbind(p, (u32)(i-1));
if( rc==SQLITE_OK ){
if( zData!=0 ){
pVar = &p->aVar[i-1];
@@ -85588,7 +89806,7 @@ SQLITE_API int sqlite3_bind_blob64(
SQLITE_API int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){
int rc;
Vdbe *p = (Vdbe *)pStmt;
- rc = vdbeUnbind(p, i);
+ rc = vdbeUnbind(p, (u32)(i-1));
if( rc==SQLITE_OK ){
sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue);
sqlite3_mutex_leave(p->db->mutex);
@@ -85601,7 +89819,7 @@ SQLITE_API int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){
int rc;
Vdbe *p = (Vdbe *)pStmt;
- rc = vdbeUnbind(p, i);
+ rc = vdbeUnbind(p, (u32)(i-1));
if( rc==SQLITE_OK ){
sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue);
sqlite3_mutex_leave(p->db->mutex);
@@ -85611,7 +89829,7 @@ SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValu
SQLITE_API int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){
int rc;
Vdbe *p = (Vdbe*)pStmt;
- rc = vdbeUnbind(p, i);
+ rc = vdbeUnbind(p, (u32)(i-1));
if( rc==SQLITE_OK ){
sqlite3_mutex_leave(p->db->mutex);
}
@@ -85626,7 +89844,7 @@ SQLITE_API int sqlite3_bind_pointer(
){
int rc;
Vdbe *p = (Vdbe*)pStmt;
- rc = vdbeUnbind(p, i);
+ rc = vdbeUnbind(p, (u32)(i-1));
if( rc==SQLITE_OK ){
sqlite3VdbeMemSetPointer(&p->aVar[i-1], pPtr, zPTtype, xDestructor);
sqlite3_mutex_leave(p->db->mutex);
@@ -85653,7 +89871,10 @@ SQLITE_API int sqlite3_bind_text64(
unsigned char enc
){
assert( xDel!=SQLITE_DYNAMIC );
- if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE;
+ if( enc!=SQLITE_UTF8 ){
+ if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE;
+ nData &= ~(u16)1;
+ }
return bindText(pStmt, i, zData, nData, xDel, enc);
}
#ifndef SQLITE_OMIT_UTF16
@@ -85661,10 +89882,10 @@ SQLITE_API int sqlite3_bind_text16(
sqlite3_stmt *pStmt,
int i,
const void *zData,
- int nData,
+ int n,
void (*xDel)(void*)
){
- return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE);
+ return bindText(pStmt, i, zData, n & ~(u64)1, xDel, SQLITE_UTF16NATIVE);
}
#endif /* SQLITE_OMIT_UTF16 */
SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){
@@ -85675,7 +89896,10 @@ SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_valu
break;
}
case SQLITE_FLOAT: {
- rc = sqlite3_bind_double(pStmt, i, pValue->u.r);
+ assert( pValue->flags & (MEM_Real|MEM_IntReal) );
+ rc = sqlite3_bind_double(pStmt, i,
+ (pValue->flags & MEM_Real) ? pValue->u.r : (double)pValue->u.i
+ );
break;
}
case SQLITE_BLOB: {
@@ -85701,9 +89925,13 @@ SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_valu
SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){
int rc;
Vdbe *p = (Vdbe *)pStmt;
- rc = vdbeUnbind(p, i);
+ rc = vdbeUnbind(p, (u32)(i-1));
if( rc==SQLITE_OK ){
+#ifndef SQLITE_OMIT_INCRBLOB
sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
+#else
+ rc = sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
+#endif
sqlite3_mutex_leave(p->db->mutex);
}
return rc;
@@ -85836,7 +90064,7 @@ SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){
*/
SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){
Vdbe *v = (Vdbe*)pStmt;
- return v!=0 && v->iVdbeMagic==VDBE_MAGIC_RUN && v->pc>=0;
+ return v!=0 && v->eVdbeState==VDBE_RUN_STATE;
}
/*
@@ -85857,7 +90085,7 @@ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){
if( pStmt==0 ){
pNext = (sqlite3_stmt*)pDb->pVdbe;
}else{
- pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext;
+ pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pVNext;
}
sqlite3_mutex_leave(pDb->mutex);
return pNext;
@@ -85882,9 +90110,11 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){
sqlite3_mutex_enter(db->mutex);
v = 0;
db->pnBytesFreed = (int*)&v;
- sqlite3VdbeClearObject(db, pVdbe);
- sqlite3DbFree(db, pVdbe);
+ assert( db->lookaside.pEnd==db->lookaside.pTrueEnd );
+ db->lookaside.pEnd = db->lookaside.pStart;
+ sqlite3VdbeDelete(pVdbe);
db->pnBytesFreed = 0;
+ db->lookaside.pEnd = db->lookaside.pTrueEnd;
sqlite3_mutex_leave(db->mutex);
}else{
v = pVdbe->aCounter[op];
@@ -85991,6 +90221,7 @@ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppVa
u32 nRec;
u8 *aRec;
+ assert( p->pCsr->eCurType==CURTYPE_BTREE );
nRec = sqlite3BtreePayloadSize(p->pCsr->uc.pCursor);
aRec = sqlite3DbMallocRaw(db, nRec);
if( !aRec ) goto preupdate_old_out;
@@ -86145,23 +90376,69 @@ SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppVa
/*
** Return status data for a single loop within query pStmt.
*/
-SQLITE_API int sqlite3_stmt_scanstatus(
+SQLITE_API int sqlite3_stmt_scanstatus_v2(
sqlite3_stmt *pStmt, /* Prepared statement being queried */
- int idx, /* Index of loop to report on */
+ int iScan, /* Index of loop to report on */
int iScanStatusOp, /* Which metric to return */
+ int flags,
void *pOut /* OUT: Write the answer here */
){
Vdbe *p = (Vdbe*)pStmt;
- ScanStatus *pScan;
- if( idx<0 || idx>=p->nScan ) return 1;
- pScan = &p->aScan[idx];
+ VdbeOp *aOp = p->aOp;
+ int nOp = p->nOp;
+ ScanStatus *pScan = 0;
+ int idx;
+
+ if( p->pFrame ){
+ VdbeFrame *pFrame;
+ for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
+ aOp = pFrame->aOp;
+ nOp = pFrame->nOp;
+ }
+
+ if( iScan<0 ){
+ int ii;
+ if( iScanStatusOp==SQLITE_SCANSTAT_NCYCLE ){
+ i64 res = 0;
+ for(ii=0; ii<nOp; ii++){
+ res += aOp[ii].nCycle;
+ }
+ *(i64*)pOut = res;
+ return 0;
+ }
+ return 1;
+ }
+ if( flags & SQLITE_SCANSTAT_COMPLEX ){
+ idx = iScan;
+ pScan = &p->aScan[idx];
+ }else{
+ /* If the COMPLEX flag is clear, then this function must ignore any
+ ** ScanStatus structures with ScanStatus.addrLoop set to 0. */
+ for(idx=0; idx<p->nScan; idx++){
+ pScan = &p->aScan[idx];
+ if( pScan->zName ){
+ iScan--;
+ if( iScan<0 ) break;
+ }
+ }
+ }
+ if( idx>=p->nScan ) return 1;
+
switch( iScanStatusOp ){
case SQLITE_SCANSTAT_NLOOP: {
- *(sqlite3_int64*)pOut = p->anExec[pScan->addrLoop];
+ if( pScan->addrLoop>0 ){
+ *(sqlite3_int64*)pOut = aOp[pScan->addrLoop].nExec;
+ }else{
+ *(sqlite3_int64*)pOut = -1;
+ }
break;
}
case SQLITE_SCANSTAT_NVISIT: {
- *(sqlite3_int64*)pOut = p->anExec[pScan->addrVisit];
+ if( pScan->addrVisit>0 ){
+ *(sqlite3_int64*)pOut = aOp[pScan->addrVisit].nExec;
+ }else{
+ *(sqlite3_int64*)pOut = -1;
+ }
break;
}
case SQLITE_SCANSTAT_EST: {
@@ -86180,7 +90457,7 @@ SQLITE_API int sqlite3_stmt_scanstatus(
}
case SQLITE_SCANSTAT_EXPLAIN: {
if( pScan->addrExplain ){
- *(const char**)pOut = p->aOp[ pScan->addrExplain ].p4.z;
+ *(const char**)pOut = aOp[ pScan->addrExplain ].p4.z;
}else{
*(const char**)pOut = 0;
}
@@ -86188,12 +90465,51 @@ SQLITE_API int sqlite3_stmt_scanstatus(
}
case SQLITE_SCANSTAT_SELECTID: {
if( pScan->addrExplain ){
- *(int*)pOut = p->aOp[ pScan->addrExplain ].p1;
+ *(int*)pOut = aOp[ pScan->addrExplain ].p1;
}else{
*(int*)pOut = -1;
}
break;
}
+ case SQLITE_SCANSTAT_PARENTID: {
+ if( pScan->addrExplain ){
+ *(int*)pOut = aOp[ pScan->addrExplain ].p2;
+ }else{
+ *(int*)pOut = -1;
+ }
+ break;
+ }
+ case SQLITE_SCANSTAT_NCYCLE: {
+ i64 res = 0;
+ if( pScan->aAddrRange[0]==0 ){
+ res = -1;
+ }else{
+ int ii;
+ for(ii=0; ii<ArraySize(pScan->aAddrRange); ii+=2){
+ int iIns = pScan->aAddrRange[ii];
+ int iEnd = pScan->aAddrRange[ii+1];
+ if( iIns==0 ) break;
+ if( iIns>0 ){
+ while( iIns<=iEnd ){
+ res += aOp[iIns].nCycle;
+ iIns++;
+ }
+ }else{
+ int iOp;
+ for(iOp=0; iOp<nOp; iOp++){
+ Op *pOp = &aOp[iOp];
+ if( pOp->p1!=iEnd ) continue;
+ if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_NCYCLE)==0 ){
+ continue;
+ }
+ res += aOp[iOp].nCycle;
+ }
+ }
+ }
+ }
+ *(i64*)pOut = res;
+ break;
+ }
default: {
return 1;
}
@@ -86202,11 +90518,28 @@ SQLITE_API int sqlite3_stmt_scanstatus(
}
/*
+** Return status data for a single loop within query pStmt.
+*/
+SQLITE_API int sqlite3_stmt_scanstatus(
+ sqlite3_stmt *pStmt, /* Prepared statement being queried */
+ int iScan, /* Index of loop to report on */
+ int iScanStatusOp, /* Which metric to return */
+ void *pOut /* OUT: Write the answer here */
+){
+ return sqlite3_stmt_scanstatus_v2(pStmt, iScan, iScanStatusOp, 0, pOut);
+}
+
+/*
** Zero all counters associated with the sqlite3_stmt_scanstatus() data.
*/
SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){
Vdbe *p = (Vdbe*)pStmt;
- memset(p->anExec, 0, p->nOp * sizeof(i64));
+ int ii;
+ for(ii=0; ii<p->nOp; ii++){
+ Op *pOp = &p->aOp[ii];
+ pOp->nExec = 0;
+ pOp->nCycle = 0;
+ }
}
#endif /* SQLITE_ENABLE_STMT_SCANSTATUS */
@@ -86298,11 +90631,9 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
#ifndef SQLITE_OMIT_UTF16
Mem utf8; /* Used to convert UTF16 into UTF8 for display */
#endif
- char zBase[100]; /* Initial working space */
db = p->db;
- sqlite3StrAccumInit(&out, 0, zBase, sizeof(zBase),
- db->aLimit[SQLITE_LIMIT_LENGTH]);
+ sqlite3StrAccumInit(&out, 0, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]);
if( db->nVdbeExec>1 ){
while( *zRawSql ){
const char *zStart = zRawSql;
@@ -86544,6 +90875,9 @@ SQLITE_API int sqlite3_found_count = 0;
*/
static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){
static int n = 0;
+ (void)pc;
+ (void)pOp;
+ (void)v;
n++;
}
#endif
@@ -86652,7 +90986,6 @@ static VdbeCursor *allocateCursor(
Vdbe *p, /* The virtual machine */
int iCur, /* Index of the new VdbeCursor */
int nField, /* Number of fields in the table or index */
- int iDb, /* Database the cursor belongs to, or -1 */
u8 eCurType /* Type of the new cursor */
){
/* Find the memory cell that will be used to store the blob of memory
@@ -86678,12 +91011,12 @@ static VdbeCursor *allocateCursor(
int nByte;
VdbeCursor *pCx = 0;
nByte =
- ROUND8(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField +
+ ROUND8P(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField +
(eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0);
assert( iCur>=0 && iCur<p->nCursor );
if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/
- sqlite3VdbeFreeCursor(p, p->apCsr[iCur]);
+ sqlite3VdbeFreeCursorNN(p, p->apCsr[iCur]);
p->apCsr[iCur] = 0;
}
@@ -86709,12 +91042,11 @@ static VdbeCursor *allocateCursor(
p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->zMalloc;
memset(pCx, 0, offsetof(VdbeCursor,pAltCursor));
pCx->eCurType = eCurType;
- pCx->iDb = iDb;
pCx->nField = nField;
pCx->aOffset = &pCx->aType[nField];
if( eCurType==CURTYPE_BTREE ){
pCx->uc.pCursor = (BtCursor*)
- &pMem->z[ROUND8(sizeof(VdbeCursor))+2*sizeof(u32)*nField];
+ &pMem->z[ROUND8P(sizeof(VdbeCursor))+2*sizeof(u32)*nField];
sqlite3BtreeCursorZero(pCx->uc.pCursor);
}
return pCx;
@@ -86727,7 +91059,8 @@ static VdbeCursor *allocateCursor(
** return false.
*/
static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){
- i64 iValue = (double)rValue;
+ i64 iValue;
+ iValue = sqlite3RealToI64(rValue);
if( sqlite3RealSameAsInt(rValue,iValue) ){
*piValue = iValue;
return 1;
@@ -86783,6 +91116,10 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){
** always preferred, even if the affinity is REAL, because
** an integer representation is more space efficient on disk.
**
+** SQLITE_AFF_FLEXNUM:
+** If the value is text, then try to convert it into a number of
+** some kind (integer or real) but do not make any other changes.
+**
** SQLITE_AFF_TEXT:
** Convert pRec to a text representation.
**
@@ -86797,11 +91134,11 @@ static void applyAffinity(
){
if( affinity>=SQLITE_AFF_NUMERIC ){
assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL
- || affinity==SQLITE_AFF_NUMERIC );
+ || affinity==SQLITE_AFF_NUMERIC || affinity==SQLITE_AFF_FLEXNUM );
if( (pRec->flags & MEM_Int)==0 ){ /*OPTIMIZATION-IF-FALSE*/
- if( (pRec->flags & MEM_Real)==0 ){
+ if( (pRec->flags & (MEM_Real|MEM_IntReal))==0 ){
if( pRec->flags & MEM_Str ) applyNumericAffinity(pRec,1);
- }else{
+ }else if( affinity<=SQLITE_AFF_REAL ){
sqlite3VdbeIntegerAffinity(pRec);
}
}
@@ -86889,17 +91226,18 @@ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){
** But it does set pMem->u.r and pMem->u.i appropriately.
*/
static u16 numericType(Mem *pMem){
- if( pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal) ){
+ assert( (pMem->flags & MEM_Null)==0
+ || pMem->db==0 || pMem->db->mallocFailed );
+ if( pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null) ){
testcase( pMem->flags & MEM_Int );
testcase( pMem->flags & MEM_Real );
testcase( pMem->flags & MEM_IntReal );
- return pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal);
- }
- if( pMem->flags & (MEM_Str|MEM_Blob) ){
- testcase( pMem->flags & MEM_Str );
- testcase( pMem->flags & MEM_Blob );
- return computeNumericType(pMem);
+ return pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null);
}
+ assert( pMem->flags & (MEM_Str|MEM_Blob) );
+ testcase( pMem->flags & MEM_Str );
+ testcase( pMem->flags & MEM_Blob );
+ return computeNumericType(pMem);
return 0;
}
@@ -87028,106 +91366,6 @@ SQLITE_PRIVATE void sqlite3VdbeRegisterDump(Vdbe *v){
# define REGISTER_TRACE(R,M)
#endif
-
-#ifdef VDBE_PROFILE
-
-/*
-** hwtime.h contains inline assembler code for implementing
-** high-performance timing routines.
-*/
-/************** Include hwtime.h in the middle of vdbe.c *********************/
-/************** Begin file hwtime.h ******************************************/
-/*
-** 2008 May 27
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-******************************************************************************
-**
-** This file contains inline asm code for retrieving "high-performance"
-** counters for x86 and x86_64 class CPUs.
-*/
-#ifndef SQLITE_HWTIME_H
-#define SQLITE_HWTIME_H
-
-/*
-** The following routine only works on pentium-class (or newer) processors.
-** It uses the RDTSC opcode to read the cycle count value out of the
-** processor and returns that value. This can be used for high-res
-** profiling.
-*/
-#if !defined(__STRICT_ANSI__) && \
- (defined(__GNUC__) || defined(_MSC_VER)) && \
- (defined(i386) || defined(__i386__) || defined(_M_IX86))
-
- #if defined(__GNUC__)
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned int lo, hi;
- __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
- return (sqlite_uint64)hi << 32 | lo;
- }
-
- #elif defined(_MSC_VER)
-
- __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
- __asm {
- rdtsc
- ret ; return value at EDX:EAX
- }
- }
-
- #endif
-
-#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__))
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned long val;
- __asm__ __volatile__ ("rdtsc" : "=A" (val));
- return val;
- }
-
-#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__))
-
- __inline__ sqlite_uint64 sqlite3Hwtime(void){
- unsigned long long retval;
- unsigned long junk;
- __asm__ __volatile__ ("\n\
- 1: mftbu %1\n\
- mftb %L0\n\
- mftbu %0\n\
- cmpw %0,%1\n\
- bne 1b"
- : "=r" (retval), "=r" (junk));
- return retval;
- }
-
-#else
-
- /*
- ** asm() is needed for hardware timing support. Without asm(),
- ** disable the sqlite3Hwtime() routine.
- **
- ** sqlite3Hwtime() is only used for some obscure debugging
- ** and analysis configurations, not in any deliverable, so this
- ** should not be a great loss.
- */
-SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
-
-#endif
-
-#endif /* !defined(SQLITE_HWTIME_H) */
-
-/************** End of hwtime.h **********************************************/
-/************** Continuing where we left off in vdbe.c ***********************/
-
-#endif
-
#ifndef NDEBUG
/*
** This function is only called from within an assert() expression. It
@@ -87171,6 +91409,44 @@ static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){
}
}
+/*
+** Compute a bloom filter hash using pOp->p4.i registers from aMem[] beginning
+** with pOp->p3. Return the hash.
+*/
+static u64 filterHash(const Mem *aMem, const Op *pOp){
+ int i, mx;
+ u64 h = 0;
+
+ assert( pOp->p4type==P4_INT32 );
+ for(i=pOp->p3, mx=i+pOp->p4.i; i<mx; i++){
+ const Mem *p = &aMem[i];
+ if( p->flags & (MEM_Int|MEM_IntReal) ){
+ h += p->u.i;
+ }else if( p->flags & MEM_Real ){
+ h += sqlite3VdbeIntValue(p);
+ }else if( p->flags & (MEM_Str|MEM_Blob) ){
+ /* All strings have the same hash and all blobs have the same hash,
+ ** though, at least, those hashes are different from each other and
+ ** from NULL. */
+ h += 4093 + (p->flags & (MEM_Str|MEM_Blob));
+ }
+ }
+ return h;
+}
+
+/*
+** Return the symbolic name for the data type of a pMem
+*/
+static const char *vdbeMemTypeName(Mem *pMem){
+ static const char *azTypes[] = {
+ /* SQLITE_INTEGER */ "INT",
+ /* SQLITE_FLOAT */ "REAL",
+ /* SQLITE_TEXT */ "TEXT",
+ /* SQLITE_BLOB */ "BLOB",
+ /* SQLITE_NULL */ "NULL"
+ };
+ return azTypes[sqlite3_value_type(pMem)-1];
+}
/*
** Execute as much of a VDBE program as we can.
@@ -87181,11 +91457,10 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
){
Op *aOp = p->aOp; /* Copy of p->aOp */
Op *pOp = aOp; /* Current operation */
-#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
- Op *pOrigOp; /* Value of pOp at the top of the loop */
-#endif
#ifdef SQLITE_DEBUG
+ Op *pOrigOp; /* Value of pOp at the top of the loop */
int nExtraDelete = 0; /* Verifies FORDELETE and AUXDELETE flags */
+ u8 iCompareIsInit = 0; /* iCompare is initialized */
#endif
int rc = SQLITE_OK; /* Value to return */
sqlite3 *db = p->db; /* The database */
@@ -87201,13 +91476,16 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
Mem *pIn2 = 0; /* 2nd input operand */
Mem *pIn3 = 0; /* 3rd input operand */
Mem *pOut = 0; /* Output operand */
-#ifdef VDBE_PROFILE
- u64 start; /* CPU clock count at start of opcode */
+#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE)
+ u64 *pnCycle = 0;
+ int bStmtScanStatus = IS_STMT_SCANSTATUS(db)!=0;
#endif
/*** INSERT STACK UNION HERE ***/
- assert( p->iVdbeMagic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */
- sqlite3VdbeEnter(p);
+ assert( p->eVdbeState==VDBE_RUN_STATE ); /* sqlite3_step() verifies this */
+ if( DbMaskNonZero(p->lockMask) ){
+ sqlite3VdbeEnter(p);
+ }
#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
if( db->xProgress ){
u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP];
@@ -87228,7 +91506,6 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
assert( p->bIsReader || p->readOnly!=0 );
p->iCurrentTime = 0;
assert( p->explain==0 );
- p->pResultSet = 0;
db->busyHandler.nBusy = 0;
if( AtomicLoad(&db->u1.isInterrupted) ) goto abort_due_to_interrupt;
sqlite3VdbeIOTraceSql(p);
@@ -87265,12 +91542,18 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
assert( rc==SQLITE_OK );
assert( pOp>=aOp && pOp<&aOp[p->nOp]);
-#ifdef VDBE_PROFILE
- start = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
-#endif
nVmStep++;
-#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
- if( p->anExec ) p->anExec[(int)(pOp-aOp)]++;
+
+#if defined(VDBE_PROFILE)
+ pOp->nExec++;
+ pnCycle = &pOp->nCycle;
+ if( sqlite3NProfileCnt==0 ) *pnCycle -= sqlite3Hwtime();
+#elif defined(SQLITE_ENABLE_STMT_SCANSTATUS)
+ if( bStmtScanStatus ){
+ pOp->nExec++;
+ pnCycle = &pOp->nCycle;
+ *pnCycle -= sqlite3Hwtime();
+ }
#endif
/* Only allow tracing if SQLITE_DEBUG is defined.
@@ -87332,7 +91615,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
}
}
#endif
-#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
+#ifdef SQLITE_DEBUG
pOrigOp = pOp;
#endif
@@ -87449,24 +91732,39 @@ case OP_Gosub: { /* jump */
pIn1->flags = MEM_Int;
pIn1->u.i = (int)(pOp-aOp);
REGISTER_TRACE(pOp->p1, pIn1);
-
- /* Most jump operations do a goto to this spot in order to update
- ** the pOp pointer. */
-jump_to_p2:
- pOp = &aOp[pOp->p2 - 1];
- break;
+ goto jump_to_p2_and_check_for_interrupt;
}
-/* Opcode: Return P1 * * * *
+/* Opcode: Return P1 P2 P3 * *
+**
+** Jump to the address stored in register P1. If P1 is a return address
+** register, then this accomplishes a return from a subroutine.
+**
+** If P3 is 1, then the jump is only taken if register P1 holds an integer
+** values, otherwise execution falls through to the next opcode, and the
+** OP_Return becomes a no-op. If P3 is 0, then register P1 must hold an
+** integer or else an assert() is raised. P3 should be set to 1 when
+** this opcode is used in combination with OP_BeginSubrtn, and set to 0
+** otherwise.
+**
+** The value in register P1 is unchanged by this opcode.
**
-** Jump to the next instruction after the address in register P1. After
-** the jump, register P1 becomes undefined.
+** P2 is not used by the byte-code engine. However, if P2 is positive
+** and also less than the current address, then the "EXPLAIN" output
+** formatter in the CLI will indent all opcodes from the P2 opcode up
+** to be not including the current Return. P2 should be the first opcode
+** in the subroutine from which this opcode is returning. Thus the P2
+** value is a byte-code indentation hint. See tag-20220407a in
+** wherecode.c and shell.c.
*/
case OP_Return: { /* in1 */
pIn1 = &aMem[pOp->p1];
- assert( pIn1->flags==MEM_Int );
- pOp = &aOp[pIn1->u.i];
- pIn1->flags = MEM_Undefined;
+ if( pIn1->flags & MEM_Int ){
+ if( pOp->p3 ){ VdbeBranchTaken(1, 2); }
+ pOp = &aOp[pIn1->u.i];
+ }else if( ALWAYS(pOp->p3) ){
+ VdbeBranchTaken(0, 2);
+ }
break;
}
@@ -87489,7 +91787,14 @@ case OP_InitCoroutine: { /* jump */
assert( !VdbeMemDynamic(pOut) );
pOut->u.i = pOp->p3 - 1;
pOut->flags = MEM_Int;
- if( pOp->p2 ) goto jump_to_p2;
+ if( pOp->p2==0 ) break;
+
+ /* Most jump operations do a goto to this spot in order to update
+ ** the pOp pointer. */
+jump_to_p2:
+ assert( pOp->p2>0 ); /* There are never any jumps to instruction 0 */
+ assert( pOp->p2<p->nOp ); /* Jumps must be in range */
+ pOp = &aOp[pOp->p2 - 1];
break;
}
@@ -87591,11 +91896,16 @@ case OP_Halt: {
VdbeFrame *pFrame;
int pcx;
- pcx = (int)(pOp - aOp);
#ifdef SQLITE_DEBUG
if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); }
#endif
- if( pOp->p1==SQLITE_OK && p->pFrame ){
+
+ /* A deliberately coded "OP_Halt SQLITE_INTERNAL * * * *" opcode indicates
+ ** something is wrong with the code generator. Raise an assertion in order
+ ** to bring this to the attention of fuzzers and other testing tools. */
+ assert( pOp->p1!=SQLITE_INTERNAL );
+
+ if( p->pFrame && pOp->p1==SQLITE_OK ){
/* Halt the sub-program. Return control to the parent frame. */
pFrame = p->pFrame;
p->pFrame = pFrame->pParent;
@@ -87617,7 +91927,6 @@ case OP_Halt: {
}
p->rc = pOp->p1;
p->errorAction = (u8)pOp->p2;
- p->pc = pcx;
assert( pOp->p5<=4 );
if( p->rc ){
if( pOp->p5 ){
@@ -87634,6 +91943,7 @@ case OP_Halt: {
}else{
sqlite3VdbeError(p, "%s", pOp->p4.z);
}
+ pcx = (int)(pOp - aOp);
sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pcx, p->zSql, p->zErrMsg);
}
rc = sqlite3VdbeHalt(p);
@@ -87759,6 +92069,28 @@ case OP_String: { /* out2 */
break;
}
+/* Opcode: BeginSubrtn * P2 * * *
+** Synopsis: r[P2]=NULL
+**
+** Mark the beginning of a subroutine that can be entered in-line
+** or that can be called using OP_Gosub. The subroutine should
+** be terminated by an OP_Return instruction that has a P1 operand that
+** is the same as the P2 operand to this opcode and that has P3 set to 1.
+** If the subroutine is entered in-line, then the OP_Return will simply
+** fall through. But if the subroutine is entered using OP_Gosub, then
+** the OP_Return will jump back to the first instruction after the OP_Gosub.
+**
+** This routine works by loading a NULL into the P2 register. When the
+** return address register contains a NULL, the OP_Return instruction is
+** a no-op that simply falls through to the next instruction (assuming that
+** the OP_Return opcode has a P3 value of 1). Thus if the subroutine is
+** entered in-line, then the OP_Return will cause in-line execution to
+** continue. But if the subroutine is entered via OP_Gosub, then the
+** OP_Return will cause a return to the address following the OP_Gosub.
+**
+** This opcode is identical to OP_Null. It has a different name
+** only to make the byte code easier to read and verify.
+*/
/* Opcode: Null P1 P2 P3 * *
** Synopsis: r[P2..P3]=NULL
**
@@ -87771,6 +92103,7 @@ case OP_String: { /* out2 */
** NULL values will not compare equal even if SQLITE_NULLEQ is set on
** OP_Ne or OP_Eq.
*/
+case OP_BeginSubrtn:
case OP_Null: { /* out2 */
int cnt;
u16 nullFlag;
@@ -87812,12 +92145,18 @@ case OP_SoftNull: {
** Synopsis: r[P2]=P4 (len=P1)
**
** P4 points to a blob of data P1 bytes long. Store this
-** blob in register P2.
+** blob in register P2. If P4 is a NULL pointer, then construct
+** a zero-filled blob that is P1 bytes long in P2.
*/
case OP_Blob: { /* out2 */
assert( pOp->p1 <= SQLITE_MAX_LENGTH );
pOut = out2Prerelease(p, pOp);
- sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0);
+ if( pOp->p4.z==0 ){
+ sqlite3VdbeMemSetZeroBlob(pOut, pOp->p1);
+ if( sqlite3VdbeMemExpandBlob(pOut) ) goto no_mem;
+ }else{
+ sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0);
+ }
pOut->enc = encoding;
UPDATE_MAX_BLOBSIZE(pOut);
break;
@@ -87895,11 +92234,16 @@ case OP_Move: {
break;
}
-/* Opcode: Copy P1 P2 P3 * *
+/* Opcode: Copy P1 P2 P3 * P5
** Synopsis: r[P2@P3+1]=r[P1@P3+1]
**
** Make a copy of registers P1..P1+P3 into registers P2..P2+P3.
**
+** If the 0x0002 bit of P5 is set then also clear the MEM_Subtype flag in the
+** destination. The 0x0001 bit of P5 indicates that this Copy opcode cannot
+** be merged. The 0x0001 bit is used by the query planner and does not
+** come into play during query execution.
+**
** This instruction makes a deep copy of the value. A duplicate
** is made of any string or blob constant. See also OP_SCopy.
*/
@@ -87914,6 +92258,9 @@ case OP_Copy: {
memAboutToChange(p, pOut);
sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
Deephemeralize(pOut);
+ if( (pOut->flags & MEM_Subtype)!=0 && (pOp->p5 & 0x0002)!=0 ){
+ pOut->flags &= ~MEM_Subtype;
+ }
#ifdef SQLITE_DEBUG
pOut->pScopyFrom = 0;
#endif
@@ -87966,24 +92313,22 @@ case OP_IntCopy: { /* out2 */
break;
}
-/* Opcode: ChngCntRow P1 P2 * * *
-** Synopsis: output=r[P1]
+/* Opcode: FkCheck * * * * *
**
-** Output value in register P1 as the chance count for a DML statement,
-** due to the "PRAGMA count_changes=ON" setting. Or, if there was a
-** foreign key error in the statement, trigger the error now.
+** Halt with an SQLITE_CONSTRAINT error if there are any unresolved
+** foreign key constraint violations. If there are no foreign key
+** constraint violations, this is a no-op.
**
-** This opcode is a variant of OP_ResultRow that checks the foreign key
-** immediate constraint count and throws an error if the count is
-** non-zero. The P2 opcode must be 1.
+** FK constraint violations are also checked when the prepared statement
+** exits. This opcode is used to raise foreign key constraint errors prior
+** to returning results such as a row change count or the result of a
+** RETURNING clause.
*/
-case OP_ChngCntRow: {
- assert( pOp->p2==1 );
+case OP_FkCheck: {
if( (rc = sqlite3VdbeCheckFk(p,0))!=SQLITE_OK ){
goto abort_due_to_error;
}
- /* Fall through to the next case, OP_ResultRow */
- /* no break */ deliberate_fall_through
+ break;
}
/* Opcode: ResultRow P1 P2 * * *
@@ -87996,45 +92341,32 @@ case OP_ChngCntRow: {
** the result row.
*/
case OP_ResultRow: {
- Mem *pMem;
- int i;
assert( p->nResColumn==pOp->p2 );
assert( pOp->p1>0 || CORRUPT_DB );
assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 );
- /* Invalidate all ephemeral cursor row caches */
p->cacheCtr = (p->cacheCtr + 2)|1;
-
- /* Make sure the results of the current row are \000 terminated
- ** and have an assigned type. The results are de-ephemeralized as
- ** a side effect.
- */
- pMem = p->pResultSet = &aMem[pOp->p1];
- for(i=0; i<pOp->p2; i++){
- assert( memIsValid(&pMem[i]) );
- Deephemeralize(&pMem[i]);
- assert( (pMem[i].flags & MEM_Ephem)==0
- || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 );
- sqlite3VdbeMemNulTerminate(&pMem[i]);
- REGISTER_TRACE(pOp->p1+i, &pMem[i]);
+ p->pResultRow = &aMem[pOp->p1];
#ifdef SQLITE_DEBUG
- /* The registers in the result will not be used again when the
- ** prepared statement restarts. This is because sqlite3_column()
- ** APIs might have caused type conversions of made other changes to
- ** the register values. Therefore, we can go ahead and break any
- ** OP_SCopy dependencies. */
- pMem[i].pScopyFrom = 0;
-#endif
+ {
+ Mem *pMem = p->pResultRow;
+ int i;
+ for(i=0; i<pOp->p2; i++){
+ assert( memIsValid(&pMem[i]) );
+ REGISTER_TRACE(pOp->p1+i, &pMem[i]);
+ /* The registers in the result will not be used again when the
+ ** prepared statement restarts. This is because sqlite3_column()
+ ** APIs might have caused type conversions of made other changes to
+ ** the register values. Therefore, we can go ahead and break any
+ ** OP_SCopy dependencies. */
+ pMem[i].pScopyFrom = 0;
+ }
}
+#endif
if( db->mallocFailed ) goto no_mem;
-
if( db->mTrace & SQLITE_TRACE_ROW ){
db->trace.xV2(SQLITE_TRACE_ROW, db->pTraceArg, p, 0);
}
-
-
- /* Return SQLITE_ROW
- */
p->pc = (int)(pOp - aOp) + 1;
rc = SQLITE_ROW;
goto vdbe_return;
@@ -88089,7 +92421,7 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
goto too_big;
}
- if( sqlite3VdbeMemGrow(pOut, (int)nByte+3, pOut==pIn2) ){
+ if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){
goto no_mem;
}
MemSetTypeFlag(pOut, MEM_Str);
@@ -88101,9 +92433,9 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n);
assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) );
pIn1->flags = flags1;
+ if( encoding>SQLITE_UTF8 ) nByte &= ~1;
pOut->z[nByte]=0;
pOut->z[nByte+1] = 0;
- pOut->z[nByte+2] = 0;
pOut->flags |= MEM_Term;
pOut->n = (int)nByte;
pOut->enc = encoding;
@@ -88154,7 +92486,6 @@ case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */
case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */
case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */
case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */
- u16 flags; /* Combined MEM_* flags from both inputs */
u16 type1; /* Numeric type of left operand */
u16 type2; /* Numeric type of right operand */
i64 iA; /* Integer value of left operand */
@@ -88163,12 +92494,12 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */
double rB; /* Real value of right operand */
pIn1 = &aMem[pOp->p1];
- type1 = numericType(pIn1);
+ type1 = pIn1->flags;
pIn2 = &aMem[pOp->p2];
- type2 = numericType(pIn2);
+ type2 = pIn2->flags;
pOut = &aMem[pOp->p3];
- flags = pIn1->flags | pIn2->flags;
if( (type1 & type2 & MEM_Int)!=0 ){
+int_math:
iA = pIn1->u.i;
iB = pIn2->u.i;
switch( pOp->opcode ){
@@ -88190,9 +92521,12 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */
}
pOut->u.i = iB;
MemSetTypeFlag(pOut, MEM_Int);
- }else if( (flags & MEM_Null)!=0 ){
+ }else if( ((type1 | type2) & MEM_Null)!=0 ){
goto arithmetic_result_is_null;
}else{
+ type1 = numericType(pIn1);
+ type2 = numericType(pIn2);
+ if( (type1 & type2 & MEM_Int)!=0 ) goto int_math;
fp_math:
rA = sqlite3VdbeRealValue(pIn1);
rB = sqlite3VdbeRealValue(pIn2);
@@ -88545,26 +92879,28 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
flags1 = pIn1->flags;
flags3 = pIn3->flags;
if( (flags1 & flags3 & MEM_Int)!=0 ){
- assert( (pOp->p5 & SQLITE_AFF_MASK)!=SQLITE_AFF_TEXT || CORRUPT_DB );
/* Common case of comparison of two integers */
if( pIn3->u.i > pIn1->u.i ){
- iCompare = +1;
if( sqlite3aGTb[pOp->opcode] ){
VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3);
goto jump_to_p2;
}
+ iCompare = +1;
+ VVA_ONLY( iCompareIsInit = 1; )
}else if( pIn3->u.i < pIn1->u.i ){
- iCompare = -1;
if( sqlite3aLTb[pOp->opcode] ){
VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3);
goto jump_to_p2;
}
+ iCompare = -1;
+ VVA_ONLY( iCompareIsInit = 1; )
}else{
- iCompare = 0;
if( sqlite3aEQb[pOp->opcode] ){
VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3);
goto jump_to_p2;
}
+ iCompare = 0;
+ VVA_ONLY( iCompareIsInit = 1; )
}
VdbeBranchTaken(0, (pOp->p5 & SQLITE_NULLEQ)?2:3);
break;
@@ -88591,11 +92927,12 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
** then the result is always NULL.
** The jump is taken if the SQLITE_JUMPIFNULL bit is set.
*/
- iCompare = 1; /* Operands are not equal */
VdbeBranchTaken(2,3);
if( pOp->p5 & SQLITE_JUMPIFNULL ){
goto jump_to_p2;
}
+ iCompare = 1; /* Operands are not equal */
+ VVA_ONLY( iCompareIsInit = 1; )
break;
}
}else{
@@ -88606,14 +92943,14 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
if( (flags1 | flags3)&MEM_Str ){
if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){
applyNumericAffinity(pIn1,0);
- testcase( flags3==pIn3->flags );
+ assert( flags3==pIn3->flags || CORRUPT_DB );
flags3 = pIn3->flags;
}
if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){
applyNumericAffinity(pIn3,0);
}
}
- }else if( affinity==SQLITE_AFF_TEXT ){
+ }else if( affinity==SQLITE_AFF_TEXT && ((flags1 | flags3) & MEM_Str)!=0 ){
if( (flags1 & MEM_Str)==0 && (flags1&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){
testcase( pIn1->flags & MEM_Int );
testcase( pIn1->flags & MEM_Real );
@@ -88652,6 +92989,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
res2 = sqlite3aGTb[pOp->opcode];
}
iCompare = res;
+ VVA_ONLY( iCompareIsInit = 1; )
/* Undo any changes made by applyAffinity() to the input registers. */
assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) );
@@ -88690,6 +93028,7 @@ case OP_ElseEq: { /* same as TK_ESCAPE, jump */
break;
}
#endif /* SQLITE_DEBUG */
+ assert( iCompareIsInit );
VdbeBranchTaken(iCompare==0, 2);
if( iCompare==0 ) goto jump_to_p2;
break;
@@ -88701,9 +93040,8 @@ case OP_ElseEq: { /* same as TK_ESCAPE, jump */
** Set the permutation used by the OP_Compare operator in the next
** instruction. The permutation is stored in the P4 operand.
**
-** The permutation is only valid until the next OP_Compare that has
-** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should
-** occur immediately prior to the OP_Compare.
+** The permutation is only valid for the next opcode which must be
+** an OP_Compare that has the OPFLAG_PERMUTE bit set in P5.
**
** The first integer in the P4 integer array is the length of the array
** and does not become part of the permutation.
@@ -88735,6 +93073,8 @@ case OP_Permutation: {
** The comparison is a sort comparison, so NULLs compare equal,
** NULLs are less than numbers, numbers are less than strings,
** and strings are less than blobs.
+**
+** This opcode must be immediately followed by an OP_Jump opcode.
*/
case OP_Compare: {
int n;
@@ -88783,6 +93123,7 @@ case OP_Compare: {
pColl = pKeyInfo->aColl[i];
bRev = (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC);
iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl);
+ VVA_ONLY( iCompareIsInit = 1; )
if( iCompare ){
if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL)
&& ((aMem[p1+idx].flags & MEM_Null) || (aMem[p2+idx].flags & MEM_Null))
@@ -88793,16 +93134,21 @@ case OP_Compare: {
break;
}
}
+ assert( pOp[1].opcode==OP_Jump );
break;
}
/* Opcode: Jump P1 P2 P3 * *
**
** Jump to the instruction at address P1, P2, or P3 depending on whether
-** in the most recent OP_Compare instruction the P1 vector was less than
+** in the most recent OP_Compare instruction the P1 vector was less than,
** equal to, or greater than the P2 vector, respectively.
+**
+** This opcode must immediately follow an OP_Compare opcode.
*/
case OP_Jump: { /* jump */
+ assert( pOp>aOp && pOp[-1].opcode==OP_Compare );
+ assert( iCompareIsInit );
if( iCompare<0 ){
VdbeBranchTaken(0,4); pOp = &aOp[pOp->p1 - 1];
}else if( iCompare==0 ){
@@ -89002,6 +93348,99 @@ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */
break;
}
+/* Opcode: IsType P1 P2 P3 P4 P5
+** Synopsis: if typeof(P1.P3) in P5 goto P2
+**
+** Jump to P2 if the type of a column in a btree is one of the types specified
+** by the P5 bitmask.
+**
+** P1 is normally a cursor on a btree for which the row decode cache is
+** valid through at least column P3. In other words, there should have been
+** a prior OP_Column for column P3 or greater. If the cursor is not valid,
+** then this opcode might give spurious results.
+** The the btree row has fewer than P3 columns, then use P4 as the
+** datatype.
+**
+** If P1 is -1, then P3 is a register number and the datatype is taken
+** from the value in that register.
+**
+** P5 is a bitmask of data types. SQLITE_INTEGER is the least significant
+** (0x01) bit. SQLITE_FLOAT is the 0x02 bit. SQLITE_TEXT is 0x04.
+** SQLITE_BLOB is 0x08. SQLITE_NULL is 0x10.
+**
+** WARNING: This opcode does not reliably distinguish between NULL and REAL
+** when P1>=0. If the database contains a NaN value, this opcode will think
+** that the datatype is REAL when it should be NULL. When P1<0 and the value
+** is already stored in register P3, then this opcode does reliably
+** distinguish between NULL and REAL. The problem only arises then P1>=0.
+**
+** Take the jump to address P2 if and only if the datatype of the
+** value determined by P1 and P3 corresponds to one of the bits in the
+** P5 bitmask.
+**
+*/
+case OP_IsType: { /* jump */
+ VdbeCursor *pC;
+ u16 typeMask;
+ u32 serialType;
+
+ assert( pOp->p1>=(-1) && pOp->p1<p->nCursor );
+ assert( pOp->p1>=0 || (pOp->p3>=0 && pOp->p3<=(p->nMem+1 - p->nCursor)) );
+ if( pOp->p1>=0 ){
+ pC = p->apCsr[pOp->p1];
+ assert( pC!=0 );
+ assert( pOp->p3>=0 );
+ if( pOp->p3<pC->nHdrParsed ){
+ serialType = pC->aType[pOp->p3];
+ if( serialType>=12 ){
+ if( serialType&1 ){
+ typeMask = 0x04; /* SQLITE_TEXT */
+ }else{
+ typeMask = 0x08; /* SQLITE_BLOB */
+ }
+ }else{
+ static const unsigned char aMask[] = {
+ 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2,
+ 0x01, 0x01, 0x10, 0x10
+ };
+ testcase( serialType==0 );
+ testcase( serialType==1 );
+ testcase( serialType==2 );
+ testcase( serialType==3 );
+ testcase( serialType==4 );
+ testcase( serialType==5 );
+ testcase( serialType==6 );
+ testcase( serialType==7 );
+ testcase( serialType==8 );
+ testcase( serialType==9 );
+ testcase( serialType==10 );
+ testcase( serialType==11 );
+ typeMask = aMask[serialType];
+ }
+ }else{
+ typeMask = 1 << (pOp->p4.i - 1);
+ testcase( typeMask==0x01 );
+ testcase( typeMask==0x02 );
+ testcase( typeMask==0x04 );
+ testcase( typeMask==0x08 );
+ testcase( typeMask==0x10 );
+ }
+ }else{
+ assert( memIsValid(&aMem[pOp->p3]) );
+ typeMask = 1 << (sqlite3_value_type((sqlite3_value*)&aMem[pOp->p3])-1);
+ testcase( typeMask==0x01 );
+ testcase( typeMask==0x02 );
+ testcase( typeMask==0x04 );
+ testcase( typeMask==0x08 );
+ testcase( typeMask==0x10 );
+ }
+ VdbeBranchTaken( (typeMask & pOp->p5)!=0, 2);
+ if( typeMask & pOp->p5 ){
+ goto jump_to_p2;
+ }
+ break;
+}
+
/* Opcode: ZeroOrNull P1 P2 P3 * *
** Synopsis: r[P2] = 0 OR NULL
**
@@ -89041,11 +93480,14 @@ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */
** If it is, then set register P3 to NULL and jump immediately to P2.
** If P1 is not on a NULL row, then fall through without making any
** changes.
+**
+** If P1 is not an open cursor, then this opcode is a no-op.
*/
case OP_IfNullRow: { /* jump */
+ VdbeCursor *pC;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
- assert( p->apCsr[pOp->p1]!=0 );
- if( p->apCsr[pOp->p1]->nullRow ){
+ pC = p->apCsr[pOp->p1];
+ if( pC && pC->nullRow ){
sqlite3VdbeMemSetNull(aMem + pOp->p3);
goto jump_to_p2;
}
@@ -89073,22 +93515,30 @@ case OP_Offset: { /* out3 */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
pOut = &p->aMem[pOp->p3];
- if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){
+ if( pC==0 || pC->eCurType!=CURTYPE_BTREE ){
sqlite3VdbeMemSetNull(pOut);
}else{
- sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
+ if( pC->deferredMoveto ){
+ rc = sqlite3VdbeFinishMoveto(pC);
+ if( rc ) goto abort_due_to_error;
+ }
+ if( sqlite3BtreeEof(pC->uc.pCursor) ){
+ sqlite3VdbeMemSetNull(pOut);
+ }else{
+ sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
+ }
}
break;
}
#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
/* Opcode: Column P1 P2 P3 P4 P5
-** Synopsis: r[P3]=PX
+** Synopsis: r[P3]=PX cursor P1 column P2
**
** Interpret the data that cursor P1 points to as a structure built using
** the MakeRecord instruction. (See the MakeRecord opcode for additional
** information about the format of the data.) Extract the P2-th column
-** from this record. If there are less that (P2+1)
+** from this record. If there are less than (P2+1)
** values in the record, extract a NULL.
**
** The value extracted is stored in register P3.
@@ -89097,15 +93547,17 @@ case OP_Offset: { /* out3 */
** if the P4 argument is a P4_MEM use the value of the P4 argument as
** the result.
**
-** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 then
-** the result is guaranteed to only be used as the argument of a length()
-** or typeof() function, respectively. The loading of large blobs can be
-** skipped for length() and all content loading can be skipped for typeof().
+** If the OPFLAG_LENGTHARG bit is set in P5 then the result is guaranteed
+** to only be used by the length() function or the equivalent. The content
+** of large blobs is not loaded, thus saving CPU cycles. If the
+** OPFLAG_TYPEOFARG bit is set then the result will only be used by the
+** typeof() function or the IS NULL or IS NOT NULL operators or the
+** equivalent. In this case, all content loading can be omitted.
*/
-case OP_Column: {
+case OP_Column: { /* ncycle */
u32 p2; /* column number to retrieve */
VdbeCursor *pC; /* The VDBE cursor */
- BtCursor *pCrsr; /* The BTree cursor */
+ BtCursor *pCrsr; /* The B-Tree cursor corresponding to pC */
u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */
int len; /* The length of the serialized data for the column */
int i; /* Loop counter */
@@ -89119,43 +93571,53 @@ case OP_Column: {
Mem *pReg; /* PseudoTable input register */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) );
pC = p->apCsr[pOp->p1];
- assert( pC!=0 );
p2 = (u32)pOp->p2;
- /* If the cursor cache is stale (meaning it is not currently point at
- ** the correct row) then bring it up-to-date by doing the necessary
- ** B-Tree seek. */
- rc = sqlite3VdbeCursorMoveto(&pC, &p2);
- if( rc ) goto abort_due_to_error;
-
- assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) );
- pDest = &aMem[pOp->p3];
- memAboutToChange(p, pDest);
+op_column_restart:
assert( pC!=0 );
- assert( p2<(u32)pC->nField );
+ assert( p2<(u32)pC->nField
+ || (pC->eCurType==CURTYPE_PSEUDO && pC->seekResult==0) );
aOffset = pC->aOffset;
+ assert( aOffset==pC->aType+pC->nField );
assert( pC->eCurType!=CURTYPE_VTAB );
assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow );
assert( pC->eCurType!=CURTYPE_SORTER );
if( pC->cacheStatus!=p->cacheCtr ){ /*OPTIMIZATION-IF-FALSE*/
if( pC->nullRow ){
- if( pC->eCurType==CURTYPE_PSEUDO ){
+ if( pC->eCurType==CURTYPE_PSEUDO && pC->seekResult>0 ){
/* For the special case of as pseudo-cursor, the seekResult field
** identifies the register that holds the record */
- assert( pC->seekResult>0 );
pReg = &aMem[pC->seekResult];
assert( pReg->flags & MEM_Blob );
assert( memIsValid(pReg) );
pC->payloadSize = pC->szRow = pReg->n;
pC->aRow = (u8*)pReg->z;
}else{
+ pDest = &aMem[pOp->p3];
+ memAboutToChange(p, pDest);
sqlite3VdbeMemSetNull(pDest);
goto op_column_out;
}
}else{
pCrsr = pC->uc.pCursor;
+ if( pC->deferredMoveto ){
+ u32 iMap;
+ assert( !pC->isEphemeral );
+ if( pC->ub.aAltMap && (iMap = pC->ub.aAltMap[1+p2])>0 ){
+ pC = pC->pAltCursor;
+ p2 = iMap - 1;
+ goto op_column_restart;
+ }
+ rc = sqlite3VdbeFinishMoveto(pC);
+ if( rc ) goto abort_due_to_error;
+ }else if( sqlite3BtreeCursorHasMoved(pCrsr) ){
+ rc = sqlite3VdbeHandleMovedCursor(pC);
+ if( rc ) goto abort_due_to_error;
+ goto op_column_restart;
+ }
assert( pC->eCurType==CURTYPE_BTREE );
assert( pCrsr );
assert( sqlite3BtreeCursorIsValid(pCrsr) );
@@ -89163,15 +93625,15 @@ case OP_Column: {
pC->aRow = sqlite3BtreePayloadFetch(pCrsr, &pC->szRow);
assert( pC->szRow<=pC->payloadSize );
assert( pC->szRow<=65536 ); /* Maximum page size is 64KiB */
- if( pC->payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
- goto too_big;
- }
}
pC->cacheStatus = p->cacheCtr;
- pC->iHdrOffset = getVarint32(pC->aRow, aOffset[0]);
+ if( (aOffset[0] = pC->aRow[0])<0x80 ){
+ pC->iHdrOffset = 1;
+ }else{
+ pC->iHdrOffset = sqlite3GetVarint32(pC->aRow, aOffset);
+ }
pC->nHdrParsed = 0;
-
if( pC->szRow<aOffset[0] ){ /*OPTIMIZATION-IF-FALSE*/
/* pC->aRow does not have to hold the entire row, but it does at least
** need to cover the header of the record. If pC->aRow does not contain
@@ -89211,6 +93673,10 @@ case OP_Column: {
testcase( aOffset[0]==0 );
goto op_column_read_header;
}
+ }else if( sqlite3BtreeCursorHasMoved(pC->uc.pCursor) ){
+ rc = sqlite3VdbeHandleMovedCursor(pC);
+ if( rc ) goto abort_due_to_error;
+ goto op_column_restart;
}
/* Make sure at least the first p2+1 entries of the header have been
@@ -89279,6 +93745,8 @@ case OP_Column: {
** columns. So the result will be either the default value or a NULL.
*/
if( pC->nHdrParsed<=p2 ){
+ pDest = &aMem[pOp->p3];
+ memAboutToChange(p, pDest);
if( pOp->p4type==P4_MEM ){
sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static);
}else{
@@ -89296,6 +93764,8 @@ case OP_Column: {
*/
assert( p2<pC->nHdrParsed );
assert( rc==SQLITE_OK );
+ pDest = &aMem[pOp->p3];
+ memAboutToChange(p, pDest);
assert( sqlite3VdbeCheckMemInvariants(pDest) );
if( VdbeMemDynamic(pDest) ){
sqlite3VdbeMemSetNull(pDest);
@@ -89316,6 +93786,7 @@ case OP_Column: {
pDest->n = len = (t-12)/2;
pDest->enc = encoding;
if( pDest->szMalloc < len+2 ){
+ if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big;
pDest->flags = MEM_Null;
if( sqlite3VdbeMemGrow(pDest, len+2, 0) ) goto no_mem;
}else{
@@ -89348,6 +93819,7 @@ case OP_Column: {
*/
sqlite3VdbeSerialGet((u8*)sqlite3CtypeMap, t, pDest);
}else{
+ if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big;
rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, aOffset[p2], len, pDest);
if( rc!=SQLITE_OK ) goto abort_due_to_error;
sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest);
@@ -89370,6 +93842,110 @@ op_column_corrupt:
}
}
+/* Opcode: TypeCheck P1 P2 P3 P4 *
+** Synopsis: typecheck(r[P1@P2])
+**
+** Apply affinities to the range of P2 registers beginning with P1.
+** Take the affinities from the Table object in P4. If any value
+** cannot be coerced into the correct type, then raise an error.
+**
+** This opcode is similar to OP_Affinity except that this opcode
+** forces the register type to the Table column type. This is used
+** to implement "strict affinity".
+**
+** GENERATED ALWAYS AS ... STATIC columns are only checked if P3
+** is zero. When P3 is non-zero, no type checking occurs for
+** static generated columns. Virtual columns are computed at query time
+** and so they are never checked.
+**
+** Preconditions:
+**
+** <ul>
+** <li> P2 should be the number of non-virtual columns in the
+** table of P4.
+** <li> Table P4 should be a STRICT table.
+** </ul>
+**
+** If any precondition is false, an assertion fault occurs.
+*/
+case OP_TypeCheck: {
+ Table *pTab;
+ Column *aCol;
+ int i;
+
+ assert( pOp->p4type==P4_TABLE );
+ pTab = pOp->p4.pTab;
+ assert( pTab->tabFlags & TF_Strict );
+ assert( pTab->nNVCol==pOp->p2 );
+ aCol = pTab->aCol;
+ pIn1 = &aMem[pOp->p1];
+ for(i=0; i<pTab->nCol; i++){
+ if( aCol[i].colFlags & COLFLAG_GENERATED ){
+ if( aCol[i].colFlags & COLFLAG_VIRTUAL ) continue;
+ if( pOp->p3 ){ pIn1++; continue; }
+ }
+ assert( pIn1 < &aMem[pOp->p1+pOp->p2] );
+ applyAffinity(pIn1, aCol[i].affinity, encoding);
+ if( (pIn1->flags & MEM_Null)==0 ){
+ switch( aCol[i].eCType ){
+ case COLTYPE_BLOB: {
+ if( (pIn1->flags & MEM_Blob)==0 ) goto vdbe_type_error;
+ break;
+ }
+ case COLTYPE_INTEGER:
+ case COLTYPE_INT: {
+ if( (pIn1->flags & MEM_Int)==0 ) goto vdbe_type_error;
+ break;
+ }
+ case COLTYPE_TEXT: {
+ if( (pIn1->flags & MEM_Str)==0 ) goto vdbe_type_error;
+ break;
+ }
+ case COLTYPE_REAL: {
+ testcase( (pIn1->flags & (MEM_Real|MEM_IntReal))==MEM_Real );
+ assert( (pIn1->flags & MEM_IntReal)==0 );
+ if( pIn1->flags & MEM_Int ){
+ /* When applying REAL affinity, if the result is still an MEM_Int
+ ** that will fit in 6 bytes, then change the type to MEM_IntReal
+ ** so that we keep the high-resolution integer value but know that
+ ** the type really wants to be REAL. */
+ testcase( pIn1->u.i==140737488355328LL );
+ testcase( pIn1->u.i==140737488355327LL );
+ testcase( pIn1->u.i==-140737488355328LL );
+ testcase( pIn1->u.i==-140737488355329LL );
+ if( pIn1->u.i<=140737488355327LL && pIn1->u.i>=-140737488355328LL){
+ pIn1->flags |= MEM_IntReal;
+ pIn1->flags &= ~MEM_Int;
+ }else{
+ pIn1->u.r = (double)pIn1->u.i;
+ pIn1->flags |= MEM_Real;
+ pIn1->flags &= ~MEM_Int;
+ }
+ }else if( (pIn1->flags & (MEM_Real|MEM_IntReal))==0 ){
+ goto vdbe_type_error;
+ }
+ break;
+ }
+ default: {
+ /* COLTYPE_ANY. Accept anything. */
+ break;
+ }
+ }
+ }
+ REGISTER_TRACE((int)(pIn1-aMem), pIn1);
+ pIn1++;
+ }
+ assert( pIn1 == &aMem[pOp->p1+pOp->p2] );
+ break;
+
+vdbe_type_error:
+ sqlite3VdbeError(p, "cannot store %s value in %s column %s.%s",
+ vdbeMemTypeName(pIn1), sqlite3StdType[aCol[i].eCType-1],
+ pTab->zName, aCol[i].zCnName);
+ rc = SQLITE_CONSTRAINT_DATATYPE;
+ goto abort_due_to_error;
+}
+
/* Opcode: Affinity P1 P2 * P4 *
** Synopsis: affinity(r[P1@P2])
**
@@ -89406,7 +93982,7 @@ case OP_Affinity: {
}else{
pIn1->u.r = (double)pIn1->u.i;
pIn1->flags |= MEM_Real;
- pIn1->flags &= ~MEM_Int;
+ pIn1->flags &= ~(MEM_Int|MEM_Str);
}
}
REGISTER_TRACE((int)(pIn1-aMem), pIn1);
@@ -89456,7 +94032,6 @@ case OP_MakeRecord: {
Mem *pLast; /* Last field of the record */
int nField; /* Number of fields in the record */
char *zAffinity; /* The affinity string for the record */
- int file_format; /* File format to use for encoding */
u32 len; /* Length of a field */
u8 *zHdr; /* Where to write next byte of the header */
u8 *zPayload; /* Where to write next byte of the payload */
@@ -89485,7 +94060,6 @@ case OP_MakeRecord: {
pData0 = &aMem[nField];
nField = pOp->p2;
pLast = &pData0[nField-1];
- file_format = p->minWriteFileFormat;
/* Identify the output register */
assert( pOp->p3<pOp->p1 || pOp->p3>=pOp->p1+pOp->p2 );
@@ -89584,10 +94158,10 @@ case OP_MakeRecord: {
testcase( uu==127 ); testcase( uu==128 );
testcase( uu==32767 ); testcase( uu==32768 );
testcase( uu==8388607 ); testcase( uu==8388608 );
- testcase( uu==2147483647 ); testcase( uu==2147483648 );
+ testcase( uu==2147483647 ); testcase( uu==2147483648LL );
testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL );
if( uu<=127 ){
- if( (i&1)==i && file_format>=4 ){
+ if( (i&1)==i && p->minWriteFileFormat>=4 ){
pRec->uTemp = 8+(u32)uu;
}else{
nData++;
@@ -89692,18 +94266,60 @@ case OP_MakeRecord: {
zPayload = zHdr + nHdr;
/* Write the record */
- zHdr += putVarint32(zHdr, nHdr);
+ if( nHdr<0x80 ){
+ *(zHdr++) = nHdr;
+ }else{
+ zHdr += sqlite3PutVarint(zHdr,nHdr);
+ }
assert( pData0<=pLast );
pRec = pData0;
- do{
+ while( 1 /*exit-by-break*/ ){
serial_type = pRec->uTemp;
/* EVIDENCE-OF: R-06529-47362 Following the size varint are one or more
- ** additional varints, one per column. */
- zHdr += putVarint32(zHdr, serial_type); /* serial type */
- /* EVIDENCE-OF: R-64536-51728 The values for each column in the record
+ ** additional varints, one per column.
+ ** EVIDENCE-OF: R-64536-51728 The values for each column in the record
** immediately follow the header. */
- zPayload += sqlite3VdbeSerialPut(zPayload, pRec, serial_type); /* content */
- }while( (++pRec)<=pLast );
+ if( serial_type<=7 ){
+ *(zHdr++) = serial_type;
+ if( serial_type==0 ){
+ /* NULL value. No change in zPayload */
+ }else{
+ u64 v;
+ u32 i;
+ if( serial_type==7 ){
+ assert( sizeof(v)==sizeof(pRec->u.r) );
+ memcpy(&v, &pRec->u.r, sizeof(v));
+ swapMixedEndianFloat(v);
+ }else{
+ v = pRec->u.i;
+ }
+ len = i = sqlite3SmallTypeSizes[serial_type];
+ assert( i>0 );
+ while( 1 /*exit-by-break*/ ){
+ zPayload[--i] = (u8)(v&0xFF);
+ if( i==0 ) break;
+ v >>= 8;
+ }
+ zPayload += len;
+ }
+ }else if( serial_type<0x80 ){
+ *(zHdr++) = serial_type;
+ if( serial_type>=14 && pRec->n>0 ){
+ assert( pRec->z!=0 );
+ memcpy(zPayload, pRec->z, pRec->n);
+ zPayload += pRec->n;
+ }
+ }else{
+ zHdr += sqlite3PutVarint(zHdr, serial_type);
+ if( pRec->n ){
+ assert( pRec->z!=0 );
+ memcpy(zPayload, pRec->z, pRec->n);
+ zPayload += pRec->n;
+ }
+ }
+ if( pRec==pLast ) break;
+ pRec++;
+ }
assert( nHdr==(int)(zHdr - (u8*)pOut->z) );
assert( nByte==(int)(zPayload - (u8*)pOut->z) );
@@ -89712,7 +94328,7 @@ case OP_MakeRecord: {
break;
}
-/* Opcode: Count P1 P2 p3 * *
+/* Opcode: Count P1 P2 P3 * *
** Synopsis: r[P2]=count()
**
** Store the number of entries (an integer value) in the table or index
@@ -89922,7 +94538,10 @@ case OP_Savepoint: {
}
}
if( rc ) goto abort_due_to_error;
-
+ if( p->eVdbeState==VDBE_HALT_STATE ){
+ rc = SQLITE_DONE;
+ goto vdbe_return;
+ }
break;
}
@@ -90026,6 +94645,7 @@ case OP_AutoCommit: {
*/
case OP_Transaction: {
Btree *pBt;
+ Db *pDb;
int iMeta = 0;
assert( p->bIsReader );
@@ -90033,11 +94653,20 @@ case OP_Transaction: {
assert( pOp->p2>=0 && pOp->p2<=2 );
assert( pOp->p1>=0 && pOp->p1<db->nDb );
assert( DbMaskTest(p->btreeMask, pOp->p1) );
- if( pOp->p2 && (db->flags & SQLITE_QueryOnly)!=0 ){
- rc = SQLITE_READONLY;
+ assert( rc==SQLITE_OK );
+ if( pOp->p2 && (db->flags & (SQLITE_QueryOnly|SQLITE_CorruptRdOnly))!=0 ){
+ if( db->flags & SQLITE_QueryOnly ){
+ /* Writes prohibited by the "PRAGMA query_only=TRUE" statement */
+ rc = SQLITE_READONLY;
+ }else{
+ /* Writes prohibited due to a prior SQLITE_CORRUPT in the current
+ ** transaction */
+ rc = SQLITE_CORRUPT;
+ }
goto abort_due_to_error;
}
- pBt = db->aDb[pOp->p1].pBt;
+ pDb = &db->aDb[pOp->p1];
+ pBt = pDb->pBt;
if( pBt ){
rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta);
@@ -90076,9 +94705,9 @@ case OP_Transaction: {
}
}
assert( pOp->p5==0 || pOp->p4type==P4_INT32 );
- if( pOp->p5
- && (iMeta!=pOp->p3
- || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i)
+ if( rc==SQLITE_OK
+ && pOp->p5
+ && (iMeta!=pOp->p3 || pDb->pSchema->iGeneration!=pOp->p4.i)
){
/*
** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema
@@ -90105,6 +94734,11 @@ case OP_Transaction: {
}
p->expired = 1;
rc = SQLITE_SCHEMA;
+
+ /* Set changeCntOn to 0 to prevent the value returned by sqlite3_changes()
+ ** from being modified in sqlite3VdbeHalt(). If this statement is
+ ** reprepared, changeCntOn will be set again. */
+ p->changeCntOn = 0;
}
if( rc ) goto abort_due_to_error;
break;
@@ -90171,8 +94805,9 @@ case OP_SetCookie: {
rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3);
if( pOp->p2==BTREE_SCHEMA_VERSION ){
/* When the schema cookie changes, record the new cookie internally */
- pDb->pSchema->schema_cookie = pOp->p3 - pOp->p5;
+ *(u32*)&pDb->pSchema->schema_cookie = *(u32*)&pOp->p3 - pOp->p5;
db->mDbFlags |= DBFLAG_SchemaChange;
+ sqlite3FkClearTriggerCache(db, pOp->p1);
}else if( pOp->p2==BTREE_FILE_FORMAT ){
/* Record changes in the file format */
pDb->pSchema->file_format = pOp->p3;
@@ -90271,7 +94906,7 @@ case OP_SetCookie: {
**
** See also: OP_OpenRead, OP_ReopenIdx
*/
-case OP_ReopenIdx: {
+case OP_ReopenIdx: { /* ncycle */
int nField;
KeyInfo *pKeyInfo;
u32 p2;
@@ -90286,11 +94921,13 @@ case OP_ReopenIdx: {
pCur = p->apCsr[pOp->p1];
if( pCur && pCur->pgnoRoot==(u32)pOp->p2 ){
assert( pCur->iDb==pOp->p3 ); /* Guaranteed by the code generator */
+ assert( pCur->eCurType==CURTYPE_BTREE );
+ sqlite3BtreeClearCursor(pCur->uc.pCursor);
goto open_cursor_set_hints;
}
/* If the cursor is not currently open or is open on a different
** index, then fall through into OP_OpenRead to force a reopen */
-case OP_OpenRead:
+case OP_OpenRead: /* ncycle */
case OP_OpenWrite:
assert( pOp->opcode==OP_OpenWrite || pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ );
@@ -90348,8 +94985,9 @@ case OP_OpenWrite:
assert( pOp->p1>=0 );
assert( nField>=0 );
testcase( nField==0 ); /* Table with INTEGER PRIMARY KEY and nothing else */
- pCur = allocateCursor(p, pOp->p1, nField, iDb, CURTYPE_BTREE);
+ pCur = allocateCursor(p, pOp->p1, nField, CURTYPE_BTREE);
if( pCur==0 ) goto no_mem;
+ pCur->iDb = iDb;
pCur->nullRow = 1;
pCur->isOrdered = 1;
pCur->pgnoRoot = p2;
@@ -90383,7 +95021,7 @@ open_cursor_set_hints:
**
** Duplicate ephemeral cursors are used for self-joins of materialized views.
*/
-case OP_OpenDup: {
+case OP_OpenDup: { /* ncycle */
VdbeCursor *pOrig; /* The original cursor to be duplicated */
VdbeCursor *pCx; /* The new cursor */
@@ -90391,7 +95029,7 @@ case OP_OpenDup: {
assert( pOrig );
assert( pOrig->isEphemeral ); /* Only ephemeral cursors can be duplicated */
- pCx = allocateCursor(p, pOp->p1, pOrig->nField, -1, CURTYPE_BTREE);
+ pCx = allocateCursor(p, pOp->p1, pOrig->nField, CURTYPE_BTREE);
if( pCx==0 ) goto no_mem;
pCx->nullRow = 1;
pCx->isEphemeral = 1;
@@ -90399,10 +95037,10 @@ case OP_OpenDup: {
pCx->isTable = pOrig->isTable;
pCx->pgnoRoot = pOrig->pgnoRoot;
pCx->isOrdered = pOrig->isOrdered;
- pCx->pBtx = pOrig->pBtx;
- pCx->hasBeenDuped = 1;
- pOrig->hasBeenDuped = 1;
- rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR,
+ pCx->ub.pBtx = pOrig->ub.pBtx;
+ pCx->noReuse = 1;
+ pOrig->noReuse = 1;
+ rc = sqlite3BtreeCursor(pCx->ub.pBtx, pCx->pgnoRoot, BTREE_WRCSR,
pCx->pKeyInfo, pCx->uc.pCursor);
/* The sqlite3BtreeCursor() routine can only fail for the first cursor
** opened for a database. Since there is already an open cursor when this
@@ -90445,8 +95083,8 @@ case OP_OpenDup: {
** by this opcode will be used for automatically created transient
** indices in joins.
*/
-case OP_OpenAutoindex:
-case OP_OpenEphemeral: {
+case OP_OpenAutoindex: /* ncycle */
+case OP_OpenEphemeral: { /* ncycle */
VdbeCursor *pCx;
KeyInfo *pKeyInfo;
@@ -90468,23 +95106,23 @@ case OP_OpenEphemeral: {
aMem[pOp->p3].z = "";
}
pCx = p->apCsr[pOp->p1];
- if( pCx && !pCx->hasBeenDuped ){
+ if( pCx && !pCx->noReuse && ALWAYS(pOp->p2<=pCx->nField) ){
/* If the ephermeral table is already open and has no duplicates from
** OP_OpenDup, then erase all existing content so that the table is
** empty again, rather than creating a new table. */
assert( pCx->isEphemeral );
pCx->seqCount = 0;
pCx->cacheStatus = CACHE_STALE;
- rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0);
+ rc = sqlite3BtreeClearTable(pCx->ub.pBtx, pCx->pgnoRoot, 0);
}else{
- pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE);
+ pCx = allocateCursor(p, pOp->p1, pOp->p2, CURTYPE_BTREE);
if( pCx==0 ) goto no_mem;
pCx->isEphemeral = 1;
- rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx,
+ rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->ub.pBtx,
BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5,
vfsFlags);
if( rc==SQLITE_OK ){
- rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0);
+ rc = sqlite3BtreeBeginTrans(pCx->ub.pBtx, 1, 0);
if( rc==SQLITE_OK ){
/* If a transient index is required, create it by calling
** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before
@@ -90493,26 +95131,26 @@ case OP_OpenEphemeral: {
*/
if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){
assert( pOp->p4type==P4_KEYINFO );
- rc = sqlite3BtreeCreateTable(pCx->pBtx, &pCx->pgnoRoot,
+ rc = sqlite3BtreeCreateTable(pCx->ub.pBtx, &pCx->pgnoRoot,
BTREE_BLOBKEY | pOp->p5);
if( rc==SQLITE_OK ){
assert( pCx->pgnoRoot==SCHEMA_ROOT+1 );
assert( pKeyInfo->db==db );
assert( pKeyInfo->enc==ENC(db) );
- rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR,
+ rc = sqlite3BtreeCursor(pCx->ub.pBtx, pCx->pgnoRoot, BTREE_WRCSR,
pKeyInfo, pCx->uc.pCursor);
}
pCx->isTable = 0;
}else{
pCx->pgnoRoot = SCHEMA_ROOT;
- rc = sqlite3BtreeCursor(pCx->pBtx, SCHEMA_ROOT, BTREE_WRCSR,
+ rc = sqlite3BtreeCursor(pCx->ub.pBtx, SCHEMA_ROOT, BTREE_WRCSR,
0, pCx->uc.pCursor);
pCx->isTable = 1;
}
}
pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED);
if( rc ){
- sqlite3BtreeClose(pCx->pBtx);
+ sqlite3BtreeClose(pCx->ub.pBtx);
}
}
}
@@ -90536,7 +95174,7 @@ case OP_SorterOpen: {
assert( pOp->p1>=0 );
assert( pOp->p2>=0 );
- pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_SORTER);
+ pCx = allocateCursor(p, pOp->p1, pOp->p2, CURTYPE_SORTER);
if( pCx==0 ) goto no_mem;
pCx->pKeyInfo = pOp->p4.pKeyInfo;
assert( pCx->pKeyInfo->db==db );
@@ -90585,7 +95223,7 @@ case OP_OpenPseudo: {
assert( pOp->p1>=0 );
assert( pOp->p3>=0 );
- pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, CURTYPE_PSEUDO);
+ pCx = allocateCursor(p, pOp->p1, pOp->p3, CURTYPE_PSEUDO);
if( pCx==0 ) goto no_mem;
pCx->nullRow = 1;
pCx->seekResult = pOp->p2;
@@ -90604,7 +95242,7 @@ case OP_OpenPseudo: {
** Close a cursor previously opened as P1. If P1 is not
** currently open, this instruction is a no-op.
*/
-case OP_Close: {
+case OP_Close: { /* ncycle */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]);
p->apCsr[pOp->p1] = 0;
@@ -90721,10 +95359,10 @@ case OP_ColumnsUsed: {
**
** See also: Found, NotFound, SeekGt, SeekGe, SeekLt
*/
-case OP_SeekLT: /* jump, in3, group */
-case OP_SeekLE: /* jump, in3, group */
-case OP_SeekGE: /* jump, in3, group */
-case OP_SeekGT: { /* jump, in3, group */
+case OP_SeekLT: /* jump, in3, group, ncycle */
+case OP_SeekLE: /* jump, in3, group, ncycle */
+case OP_SeekGE: /* jump, in3, group, ncycle */
+case OP_SeekGT: { /* jump, in3, group, ncycle */
int res; /* Comparison result */
int oc; /* Opcode */
VdbeCursor *pC; /* The cursor to seek */
@@ -90773,6 +95411,7 @@ case OP_SeekGT: { /* jump, in3, group */
/* If the P3 value could not be converted into an integer without
** loss of information, then special processing is required... */
if( (newType & (MEM_Int|MEM_IntReal))==0 ){
+ int c;
if( (newType & MEM_Real)==0 ){
if( (newType & MEM_Null) || oc>=OP_SeekGE ){
VdbeBranchTaken(1,2);
@@ -90782,7 +95421,8 @@ case OP_SeekGT: { /* jump, in3, group */
if( rc!=SQLITE_OK ) goto abort_due_to_error;
goto seek_not_found;
}
- }else
+ }
+ c = sqlite3IntFloatCompare(iKey, pIn3->u.r);
/* If the approximation iKey is larger than the actual real search
** term, substitute >= for > and < for <=. e.g. if the search term
@@ -90791,7 +95431,7 @@ case OP_SeekGT: { /* jump, in3, group */
** (x > 4.9) -> (x >= 5)
** (x <= 4.9) -> (x < 5)
*/
- if( pIn3->u.r<(double)iKey ){
+ if( c>0 ){
assert( OP_SeekGE==(OP_SeekGT-1) );
assert( OP_SeekLT==(OP_SeekLE-1) );
assert( (OP_SeekLE & 0x0001)==(OP_SeekGT & 0x0001) );
@@ -90800,14 +95440,14 @@ case OP_SeekGT: { /* jump, in3, group */
/* If the approximation iKey is smaller than the actual real search
** term, substitute <= for < and > for >=. */
- else if( pIn3->u.r>(double)iKey ){
+ else if( c<0 ){
assert( OP_SeekLE==(OP_SeekLT+1) );
assert( OP_SeekGT==(OP_SeekGE+1) );
assert( (OP_SeekLT & 0x0001)==(OP_SeekGE & 0x0001) );
if( (oc & 0x0001)==(OP_SeekLT & 0x0001) ) oc++;
}
}
- rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)iKey, 0, &res);
+ rc = sqlite3BtreeTableMoveto(pC->uc.pCursor, (u64)iKey, 0, &res);
pC->movetoTarget = iKey; /* Used by OP_Delete */
if( rc!=SQLITE_OK ){
goto abort_due_to_error;
@@ -90851,10 +95491,16 @@ case OP_SeekGT: { /* jump, in3, group */
r.aMem = &aMem[pOp->p3];
#ifdef SQLITE_DEBUG
- { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
+ {
+ int i;
+ for(i=0; i<r.nField; i++){
+ assert( memIsValid(&r.aMem[i]) );
+ if( i>0 ) REGISTER_TRACE(pOp->p3+i, &r.aMem[i]);
+ }
+ }
#endif
r.eqSeen = 0;
- rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, &r, 0, 0, &res);
+ rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, &r, &res);
if( rc!=SQLITE_OK ){
goto abort_due_to_error;
}
@@ -90914,7 +95560,7 @@ seek_not_found:
}
-/* Opcode: SeekScan P1 P2 * * *
+/* Opcode: SeekScan P1 P2 * * P5
** Synopsis: Scan-ahead up to P1 rows
**
** This opcode is a prefix opcode to OP_SeekGE. In other words, this
@@ -90924,8 +95570,8 @@ seek_not_found:
** This opcode uses the P1 through P4 operands of the subsequent
** OP_SeekGE. In the text that follows, the operands of the subsequent
** OP_SeekGE opcode are denoted as SeekOP.P1 through SeekOP.P4. Only
-** the P1 and P2 operands of this opcode are also used, and are called
-** This.P1 and This.P2.
+** the P1, P2 and P5 operands of this opcode are also used, and are called
+** This.P1, This.P2 and This.P5.
**
** This opcode helps to optimize IN operators on a multi-column index
** where the IN operator is on the later terms of the index by avoiding
@@ -90935,32 +95581,54 @@ seek_not_found:
**
** The SeekGE.P3 and SeekGE.P4 operands identify an unpacked key which
** is the desired entry that we want the cursor SeekGE.P1 to be pointing
-** to. Call this SeekGE.P4/P5 row the "target".
+** to. Call this SeekGE.P3/P4 row the "target".
**
** If the SeekGE.P1 cursor is not currently pointing to a valid row,
** then this opcode is a no-op and control passes through into the OP_SeekGE.
**
** If the SeekGE.P1 cursor is pointing to a valid row, then that row
** might be the target row, or it might be near and slightly before the
-** target row. This opcode attempts to position the cursor on the target
-** row by, perhaps by invoking sqlite3BtreeStep() on the cursor
-** between 0 and This.P1 times.
-**
-** There are three possible outcomes from this opcode:<ol>
-**
-** <li> If after This.P1 steps, the cursor is still pointing to a place that
-** is earlier in the btree than the target row, then fall through
-** into the subsquence OP_SeekGE opcode.
-**
-** <li> If the cursor is successfully moved to the target row by 0 or more
-** sqlite3BtreeNext() calls, then jump to This.P2, which will land just
-** past the OP_IdxGT or OP_IdxGE opcode that follows the OP_SeekGE.
-**
-** <li> If the cursor ends up past the target row (indicating the the target
-** row does not exist in the btree) then jump to SeekOP.P2.
+** target row, or it might be after the target row. If the cursor is
+** currently before the target row, then this opcode attempts to position
+** the cursor on or after the target row by invoking sqlite3BtreeStep()
+** on the cursor between 1 and This.P1 times.
+**
+** The This.P5 parameter is a flag that indicates what to do if the
+** cursor ends up pointing at a valid row that is past the target
+** row. If This.P5 is false (0) then a jump is made to SeekGE.P2. If
+** This.P5 is true (non-zero) then a jump is made to This.P2. The P5==0
+** case occurs when there are no inequality constraints to the right of
+** the IN constraing. The jump to SeekGE.P2 ends the loop. The P5!=0 case
+** occurs when there are inequality constraints to the right of the IN
+** operator. In that case, the This.P2 will point either directly to or
+** to setup code prior to the OP_IdxGT or OP_IdxGE opcode that checks for
+** loop terminate.
+**
+** Possible outcomes from this opcode:<ol>
+**
+** <li> If the cursor is initally not pointed to any valid row, then
+** fall through into the subsequent OP_SeekGE opcode.
+**
+** <li> If the cursor is left pointing to a row that is before the target
+** row, even after making as many as This.P1 calls to
+** sqlite3BtreeNext(), then also fall through into OP_SeekGE.
+**
+** <li> If the cursor is left pointing at the target row, either because it
+** was at the target row to begin with or because one or more
+** sqlite3BtreeNext() calls moved the cursor to the target row,
+** then jump to This.P2..,
+**
+** <li> If the cursor started out before the target row and a call to
+** to sqlite3BtreeNext() moved the cursor off the end of the index
+** (indicating that the target row definitely does not exist in the
+** btree) then jump to SeekGE.P2, ending the loop.
+**
+** <li> If the cursor ends up on a valid row that is past the target row
+** (indicating that the target row does not exist in the btree) then
+** jump to SeekOP.P2 if This.P5==0 or to This.P2 if This.P5>0.
** </ol>
*/
-case OP_SeekScan: {
+case OP_SeekScan: { /* ncycle */
VdbeCursor *pC;
int res;
int nStep;
@@ -90968,14 +95636,25 @@ case OP_SeekScan: {
assert( pOp[1].opcode==OP_SeekGE );
- /* pOp->p2 points to the first instruction past the OP_IdxGT that
- ** follows the OP_SeekGE. */
+ /* If pOp->p5 is clear, then pOp->p2 points to the first instruction past the
+ ** OP_IdxGT that follows the OP_SeekGE. Otherwise, it points to the first
+ ** opcode past the OP_SeekGE itself. */
assert( pOp->p2>=(int)(pOp-aOp)+2 );
- assert( aOp[pOp->p2-1].opcode==OP_IdxGT || aOp[pOp->p2-1].opcode==OP_IdxGE );
- testcase( aOp[pOp->p2-1].opcode==OP_IdxGE );
- assert( pOp[1].p1==aOp[pOp->p2-1].p1 );
- assert( pOp[1].p2==aOp[pOp->p2-1].p2 );
- assert( pOp[1].p3==aOp[pOp->p2-1].p3 );
+#ifdef SQLITE_DEBUG
+ if( pOp->p5==0 ){
+ /* There are no inequality constraints following the IN constraint. */
+ assert( pOp[1].p1==aOp[pOp->p2-1].p1 );
+ assert( pOp[1].p2==aOp[pOp->p2-1].p2 );
+ assert( pOp[1].p3==aOp[pOp->p2-1].p3 );
+ assert( aOp[pOp->p2-1].opcode==OP_IdxGT
+ || aOp[pOp->p2-1].opcode==OP_IdxGE );
+ testcase( aOp[pOp->p2-1].opcode==OP_IdxGE );
+ }else{
+ /* There are inequality constraints. */
+ assert( pOp->p2==(int)(pOp-aOp)+2 );
+ assert( aOp[pOp->p2-1].opcode==OP_SeekGE );
+ }
+#endif
assert( pOp->p1>0 );
pC = p->apCsr[pOp[1].p1];
@@ -91009,8 +95688,9 @@ case OP_SeekScan: {
while(1){
rc = sqlite3VdbeIdxKeyCompare(db, pC, &r, &res);
if( rc ) goto abort_due_to_error;
- if( res>0 ){
+ if( res>0 && pOp->p5==0 ){
seekscan_search_fail:
+ /* Jump to SeekGE.P2, ending the loop */
#ifdef SQLITE_DEBUG
if( db->flags&SQLITE_VdbeTrace ){
printf("... %d steps and then skip\n", pOp->p1 - nStep);
@@ -91020,7 +95700,8 @@ case OP_SeekScan: {
pOp++;
goto jump_to_p2;
}
- if( res==0 ){
+ if( res>=0 ){
+ /* Jump to This.P2, bypassing the OP_SeekGE opcode */
#ifdef SQLITE_DEBUG
if( db->flags&SQLITE_VdbeTrace ){
printf("... %d steps and then success\n", pOp->p1 - nStep);
@@ -91040,6 +95721,7 @@ case OP_SeekScan: {
break;
}
nStep--;
+ pC->cacheStatus = CACHE_STALE;
rc = sqlite3BtreeNext(pC->uc.pCursor, 0);
if( rc ){
if( rc==SQLITE_DONE ){
@@ -91069,7 +95751,7 @@ case OP_SeekScan: {
**
** P1 must be a valid b-tree cursor.
*/
-case OP_SeekHit: {
+case OP_SeekHit: { /* ncycle */
VdbeCursor *pC;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
@@ -91096,12 +95778,16 @@ case OP_SeekHit: {
/* Opcode: IfNotOpen P1 P2 * * *
** Synopsis: if( !csr[P1] ) goto P2
**
-** If cursor P1 is not open, jump to instruction P2. Otherwise, fall through.
+** If cursor P1 is not open or if P1 is set to a NULL row using the
+** OP_NullRow opcode, then jump to instruction P2. Otherwise, fall through.
*/
case OP_IfNotOpen: { /* jump */
+ VdbeCursor *pCur;
+
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
- VdbeBranchTaken(p->apCsr[pOp->p1]==0, 2);
- if( !p->apCsr[pOp->p1] ){
+ pCur = p->apCsr[pOp->p1];
+ VdbeBranchTaken(pCur==0 || pCur->nullRow, 2);
+ if( pCur==0 || pCur->nullRow ){
goto jump_to_p2_and_check_for_interrupt;
}
break;
@@ -91197,7 +95883,7 @@ case OP_IfNotOpen: { /* jump */
**
** See also: NotFound, Found, NotExists
*/
-case OP_IfNoHope: { /* jump, in3 */
+case OP_IfNoHope: { /* jump, in3, ncycle */
VdbeCursor *pC;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
@@ -91211,15 +95897,12 @@ case OP_IfNoHope: { /* jump, in3 */
/* Fall through into OP_NotFound */
/* no break */ deliberate_fall_through
}
-case OP_NoConflict: /* jump, in3 */
-case OP_NotFound: /* jump, in3 */
-case OP_Found: { /* jump, in3 */
+case OP_NoConflict: /* jump, in3, ncycle */
+case OP_NotFound: /* jump, in3, ncycle */
+case OP_Found: { /* jump, in3, ncycle */
int alreadyExists;
- int takeJump;
int ii;
VdbeCursor *pC;
- int res;
- UnpackedRecord *pFree;
UnpackedRecord *pIdxKey;
UnpackedRecord r;
@@ -91234,14 +95917,15 @@ case OP_Found: { /* jump, in3 */
#ifdef SQLITE_DEBUG
pC->seekOp = pOp->opcode;
#endif
- pIn3 = &aMem[pOp->p3];
+ r.aMem = &aMem[pOp->p3];
assert( pC->eCurType==CURTYPE_BTREE );
assert( pC->uc.pCursor!=0 );
assert( pC->isTable==0 );
- if( pOp->p4.i>0 ){
+ r.nField = (u16)pOp->p4.i;
+ if( r.nField>0 ){
+ /* Key values in an array of registers */
r.pKeyInfo = pC->pKeyInfo;
- r.nField = (u16)pOp->p4.i;
- r.aMem = pIn3;
+ r.default_rc = 0;
#ifdef SQLITE_DEBUG
for(ii=0; ii<r.nField; ii++){
assert( memIsValid(&r.aMem[ii]) );
@@ -91249,37 +95933,25 @@ case OP_Found: { /* jump, in3 */
if( ii ) REGISTER_TRACE(pOp->p3+ii, &r.aMem[ii]);
}
#endif
- pIdxKey = &r;
- pFree = 0;
+ rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, &r, &pC->seekResult);
}else{
- assert( pIn3->flags & MEM_Blob );
- rc = ExpandBlob(pIn3);
+ /* Composite key generated by OP_MakeRecord */
+ assert( r.aMem->flags & MEM_Blob );
+ assert( pOp->opcode!=OP_NoConflict );
+ rc = ExpandBlob(r.aMem);
assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
if( rc ) goto no_mem;
- pFree = pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo);
+ pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo);
if( pIdxKey==0 ) goto no_mem;
- sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey);
- }
- pIdxKey->default_rc = 0;
- takeJump = 0;
- if( pOp->opcode==OP_NoConflict ){
- /* For the OP_NoConflict opcode, take the jump if any of the
- ** input fields are NULL, since any key with a NULL will not
- ** conflict */
- for(ii=0; ii<pIdxKey->nField; ii++){
- if( pIdxKey->aMem[ii].flags & MEM_Null ){
- takeJump = 1;
- break;
- }
- }
+ sqlite3VdbeRecordUnpack(pC->pKeyInfo, r.aMem->n, r.aMem->z, pIdxKey);
+ pIdxKey->default_rc = 0;
+ rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, pIdxKey, &pC->seekResult);
+ sqlite3DbFreeNN(db, pIdxKey);
}
- rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, pIdxKey, 0, 0, &res);
- if( pFree ) sqlite3DbFreeNN(db, pFree);
if( rc!=SQLITE_OK ){
goto abort_due_to_error;
}
- pC->seekResult = res;
- alreadyExists = (res==0);
+ alreadyExists = (pC->seekResult==0);
pC->nullRow = 1-alreadyExists;
pC->deferredMoveto = 0;
pC->cacheStatus = CACHE_STALE;
@@ -91287,9 +95959,25 @@ case OP_Found: { /* jump, in3 */
VdbeBranchTaken(alreadyExists!=0,2);
if( alreadyExists ) goto jump_to_p2;
}else{
- VdbeBranchTaken(takeJump||alreadyExists==0,2);
- if( takeJump || !alreadyExists ) goto jump_to_p2;
- if( pOp->opcode==OP_IfNoHope ) pC->seekHit = pOp->p4.i;
+ if( !alreadyExists ){
+ VdbeBranchTaken(1,2);
+ goto jump_to_p2;
+ }
+ if( pOp->opcode==OP_NoConflict ){
+ /* For the OP_NoConflict opcode, take the jump if any of the
+ ** input fields are NULL, since any key with a NULL will not
+ ** conflict */
+ for(ii=0; ii<r.nField; ii++){
+ if( r.aMem[ii].flags & MEM_Null ){
+ VdbeBranchTaken(1,2);
+ goto jump_to_p2;
+ }
+ }
+ }
+ VdbeBranchTaken(0,2);
+ if( pOp->opcode==OP_IfNoHope ){
+ pC->seekHit = pOp->p4.i;
+ }
}
break;
}
@@ -91341,7 +96029,7 @@ case OP_Found: { /* jump, in3 */
**
** See also: Found, NotFound, NoConflict, SeekRowid
*/
-case OP_SeekRowid: { /* jump, in3 */
+case OP_SeekRowid: { /* jump, in3, ncycle */
VdbeCursor *pC;
BtCursor *pCrsr;
int res;
@@ -91366,7 +96054,7 @@ case OP_SeekRowid: { /* jump, in3 */
}
/* Fall through into OP_NotExists */
/* no break */ deliberate_fall_through
-case OP_NotExists: /* jump, in3 */
+case OP_NotExists: /* jump, in3, ncycle */
pIn3 = &aMem[pOp->p3];
assert( (pIn3->flags & MEM_Int)!=0 || pOp->opcode==OP_SeekRowid );
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
@@ -91382,7 +96070,7 @@ notExistsWithKey:
pCrsr = pC->uc.pCursor;
assert( pCrsr!=0 );
res = 0;
- rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res);
+ rc = sqlite3BtreeTableMoveto(pCrsr, iKey, 0, &res);
assert( rc==SQLITE_OK || res==0 );
pC->movetoTarget = iKey; /* Used by OP_Delete */
pC->nullRow = 0;
@@ -91539,7 +96227,7 @@ case OP_NewRowid: { /* out2 */
do{
sqlite3_randomness(sizeof(v), &v);
v &= (MAX_ROWID>>1); v++; /* Ensure that v is greater than zero */
- }while( ((rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)v,
+ }while( ((rc = sqlite3BtreeTableMoveto(pC->uc.pCursor, (u64)v,
0, &res))==SQLITE_OK)
&& (res==0)
&& (++cnt<100));
@@ -91629,7 +96317,7 @@ case OP_Insert: {
assert( (pOp->p5 & OPFLAG_ISNOOP) || HasRowid(pTab) );
}else{
pTab = 0;
- zDb = 0; /* Not needed. Silence a compiler warning. */
+ zDb = 0;
}
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
@@ -91646,8 +96334,11 @@ case OP_Insert: {
if( pOp->p5 & OPFLAG_ISNOOP ) break;
#endif
- if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
- if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = x.nKey;
+ assert( (pOp->p5 & OPFLAG_LASTROWID)==0 || (pOp->p5 & OPFLAG_NCHANGE)!=0 );
+ if( pOp->p5 & OPFLAG_NCHANGE ){
+ p->nChange++;
+ if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = x.nKey;
+ }
assert( (pData->flags & (MEM_Blob|MEM_Str))!=0 || pData->n==0 );
x.pData = pData->z;
x.nData = pData->n;
@@ -91658,6 +96349,7 @@ case OP_Insert: {
x.nZero = 0;
}
x.pKey = 0;
+ assert( BTREE_PREFORMAT==OPFLAG_PREFORMAT );
rc = sqlite3BtreeInsert(pC->uc.pCursor, &x,
(pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION|OPFLAG_PREFORMAT)),
seekResult
@@ -91782,13 +96474,14 @@ case OP_Delete: {
pC->movetoTarget = sqlite3BtreeIntegerKey(pC->uc.pCursor);
}
}else{
- zDb = 0; /* Not needed. Silence a compiler warning. */
- pTab = 0; /* Not needed. Silence a compiler warning. */
+ zDb = 0;
+ pTab = 0;
}
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
/* Invoke the pre-update-hook if required. */
- if( db->xPreUpdateCallback && pOp->p4.pTab ){
+ assert( db->xPreUpdateCallback==0 || pTab==pOp->p4.pTab );
+ if( db->xPreUpdateCallback && pTab ){
assert( !(opflags & OPFLAG_ISUPDATE)
|| HasRowid(pTab)==0
|| (aMem[pOp->p3].flags & MEM_Int)
@@ -91829,7 +96522,7 @@ case OP_Delete: {
/* Invoke the update-hook if required. */
if( opflags & OPFLAG_NCHANGE ){
p->nChange++;
- if( db->xUpdateCallback && HasRowid(pTab) ){
+ if( db->xUpdateCallback && ALWAYS(pTab!=0) && HasRowid(pTab) ){
db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, pTab->zName,
pC->movetoTarget);
assert( pC->iDb>=0 );
@@ -91979,7 +96672,7 @@ case OP_RowData: {
}
/* Opcode: Rowid P1 P2 * * *
-** Synopsis: r[P2]=rowid
+** Synopsis: r[P2]=PX rowid of P1
**
** Store in register P2 an integer which is the key of the table entry that
** P1 is currently point to.
@@ -91988,7 +96681,7 @@ case OP_RowData: {
** be a separate OP_VRowid opcode for use with virtual tables, but this
** one opcode now works for both table types.
*/
-case OP_Rowid: { /* out2 */
+case OP_Rowid: { /* out2, ncycle */
VdbeCursor *pC;
i64 v;
sqlite3_vtab *pVtab;
@@ -92034,13 +96727,25 @@ case OP_Rowid: { /* out2 */
** Move the cursor P1 to a null row. Any OP_Column operations
** that occur while the cursor is on the null row will always
** write a NULL.
+**
+** If cursor P1 is not previously opened, open it now to a special
+** pseudo-cursor that always returns NULL for every column.
*/
case OP_NullRow: {
VdbeCursor *pC;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
- assert( pC!=0 );
+ if( pC==0 ){
+ /* If the cursor is not already open, create a special kind of
+ ** pseudo-cursor that always gives null rows. */
+ pC = allocateCursor(p, pOp->p1, 1, CURTYPE_PSEUDO);
+ if( pC==0 ) goto no_mem;
+ pC->seekResult = 0;
+ pC->isTable = 1;
+ pC->noReuse = 1;
+ pC->uc.pCursor = sqlite3BtreeFakeValidCursor();
+ }
pC->nullRow = 1;
pC->cacheStatus = CACHE_STALE;
if( pC->eCurType==CURTYPE_BTREE ){
@@ -92075,8 +96780,8 @@ case OP_NullRow: {
** from the end toward the beginning. In other words, the cursor is
** configured to use Prev, not Next.
*/
-case OP_SeekEnd:
-case OP_Last: { /* jump */
+case OP_SeekEnd: /* ncycle */
+case OP_Last: { /* jump, ncycle */
VdbeCursor *pC;
BtCursor *pCrsr;
int res;
@@ -92177,17 +96882,22 @@ case OP_Sort: { /* jump */
** If the table or index is not empty, fall through to the following
** instruction.
**
+** If P2 is zero, that is an assertion that the P1 table is never
+** empty and hence the jump will never be taken.
+**
** This opcode leaves the cursor configured to move in forward order,
** from the beginning toward the end. In other words, the cursor is
** configured to use Next, not Prev.
*/
-case OP_Rewind: { /* jump */
+case OP_Rewind: { /* jump, ncycle */
VdbeCursor *pC;
BtCursor *pCrsr;
int res;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
assert( pOp->p5==0 );
+ assert( pOp->p2>=0 && pOp->p2<p->nOp );
+
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
assert( isSorter(pC)==(pOp->opcode==OP_SorterSort) );
@@ -92207,13 +96917,14 @@ case OP_Rewind: { /* jump */
}
if( rc ) goto abort_due_to_error;
pC->nullRow = (u8)res;
- assert( pOp->p2>0 && pOp->p2<p->nOp );
- VdbeBranchTaken(res!=0,2);
- if( res ) goto jump_to_p2;
+ if( pOp->p2>0 ){
+ VdbeBranchTaken(res!=0,2);
+ if( res ) goto jump_to_p2;
+ }
break;
}
-/* Opcode: Next P1 P2 P3 P4 P5
+/* Opcode: Next P1 P2 P3 * P5
**
** Advance cursor P1 so that it points to the next key/data pair in its
** table or index. If there are no more key/value pairs then fall through
@@ -92232,15 +96943,12 @@ case OP_Rewind: { /* jump */
** omitted if that index had been unique. P3 is usually 0. P3 is
** always either 0 or 1.
**
-** P4 is always of type P4_ADVANCE. The function pointer points to
-** sqlite3BtreeNext().
-**
** If P5 is positive and the jump is taken, then event counter
** number P5-1 in the prepared statement is incremented.
**
** See also: Prev
*/
-/* Opcode: Prev P1 P2 P3 P4 P5
+/* Opcode: Prev P1 P2 P3 * P5
**
** Back up cursor P1 so that it points to the previous key/data pair in its
** table or index. If there is no previous key/value pairs then fall through
@@ -92260,9 +96968,6 @@ case OP_Rewind: { /* jump */
** omitted if that index had been unique. P3 is usually 0. P3 is
** always either 0 or 1.
**
-** P4 is always of type P4_ADVANCE. The function pointer points to
-** sqlite3BtreePrevious().
-**
** If P5 is positive and the jump is taken, then event counter
** number P5-1 in the prepared statement is incremented.
*/
@@ -92280,30 +96985,37 @@ case OP_SorterNext: { /* jump */
assert( isSorter(pC) );
rc = sqlite3VdbeSorterNext(db, pC);
goto next_tail;
-case OP_Prev: /* jump */
-case OP_Next: /* jump */
+
+case OP_Prev: /* jump, ncycle */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
- assert( pOp->p5<ArraySize(p->aCounter) );
+ assert( pOp->p5==0
+ || pOp->p5==SQLITE_STMTSTATUS_FULLSCAN_STEP
+ || pOp->p5==SQLITE_STMTSTATUS_AUTOINDEX);
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
assert( pC->deferredMoveto==0 );
assert( pC->eCurType==CURTYPE_BTREE );
- assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext );
- assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious );
+ assert( pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE
+ || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope
+ || pC->seekOp==OP_NullRow);
+ rc = sqlite3BtreePrevious(pC->uc.pCursor, pOp->p3);
+ goto next_tail;
- /* The Next opcode is only used after SeekGT, SeekGE, Rewind, and Found.
- ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */
- assert( pOp->opcode!=OP_Next
- || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE
+case OP_Next: /* jump, ncycle */
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ assert( pOp->p5==0
+ || pOp->p5==SQLITE_STMTSTATUS_FULLSCAN_STEP
+ || pOp->p5==SQLITE_STMTSTATUS_AUTOINDEX);
+ pC = p->apCsr[pOp->p1];
+ assert( pC!=0 );
+ assert( pC->deferredMoveto==0 );
+ assert( pC->eCurType==CURTYPE_BTREE );
+ assert( pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE
|| pC->seekOp==OP_Rewind || pC->seekOp==OP_Found
|| pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid
|| pC->seekOp==OP_IfNoHope);
- assert( pOp->opcode!=OP_Prev
- || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE
- || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope
- || pC->seekOp==OP_NullRow);
+ rc = sqlite3BtreeNext(pC->uc.pCursor, pOp->p3);
- rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3);
next_tail:
pC->cacheStatus = CACHE_STALE;
VdbeBranchTaken(rc==SQLITE_OK,2);
@@ -92416,7 +97128,8 @@ case OP_SorterInsert: { /* in2 */
** an UPDATE or DELETE statement and the index entry to be updated
** or deleted is not found. For some uses of IdxDelete
** (example: the EXCEPT operator) it does not matter that no matching
-** entry is found. For those cases, P5 is zero.
+** entry is found. For those cases, P5 is zero. Also, do not raise
+** this (self-correcting and non-critical) error if in writable_schema mode.
*/
case OP_IdxDelete: {
VdbeCursor *pC;
@@ -92437,12 +97150,12 @@ case OP_IdxDelete: {
r.nField = (u16)pOp->p3;
r.default_rc = 0;
r.aMem = &aMem[pOp->p2];
- rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res);
+ rc = sqlite3BtreeIndexMoveto(pCrsr, &r, &res);
if( rc ) goto abort_due_to_error;
if( res==0 ){
rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE);
if( rc ) goto abort_due_to_error;
- }else if( pOp->p5 ){
+ }else if( pOp->p5 && !sqlite3WritableSchema(db) ){
rc = sqlite3ReportError(SQLITE_CORRUPT_INDEX, __LINE__, "index corruption");
goto abort_due_to_error;
}
@@ -92480,8 +97193,8 @@ case OP_IdxDelete: {
**
** See also: Rowid, MakeRecord.
*/
-case OP_DeferredSeek:
-case OP_IdxRowid: { /* out2 */
+case OP_DeferredSeek: /* ncycle */
+case OP_IdxRowid: { /* out2, ncycle */
VdbeCursor *pC; /* The P1 index cursor */
VdbeCursor *pTabCur; /* The P2 table cursor (OP_DeferredSeek only) */
i64 rowid; /* Rowid that P1 current points to */
@@ -92489,9 +97202,9 @@ case OP_IdxRowid: { /* out2 */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
assert( pC!=0 );
- assert( pC->eCurType==CURTYPE_BTREE );
+ assert( pC->eCurType==CURTYPE_BTREE || IsNullCursor(pC) );
assert( pC->uc.pCursor!=0 );
- assert( pC->isTable==0 );
+ assert( pC->isTable==0 || IsNullCursor(pC) );
assert( pC->deferredMoveto==0 );
assert( !pC->nullRow || pOp->opcode==OP_IdxRowid );
@@ -92499,10 +97212,10 @@ case OP_IdxRowid: { /* out2 */
** of sqlite3VdbeCursorRestore() and sqlite3VdbeIdxRowid(). */
rc = sqlite3VdbeCursorRestore(pC);
- /* sqlite3VbeCursorRestore() can only fail if the record has been deleted
- ** out from under the cursor. That will never happens for an IdxRowid
- ** or Seek opcode */
- if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
+ /* sqlite3VdbeCursorRestore() may fail if the cursor has been disturbed
+ ** since it was last positioned and an error (e.g. OOM or an IO error)
+ ** occurs while trying to reposition it. */
+ if( rc!=SQLITE_OK ) goto abort_due_to_error;
if( !pC->nullRow ){
rowid = 0; /* Not needed. Only used to silence a warning. */
@@ -92520,10 +97233,11 @@ case OP_IdxRowid: { /* out2 */
pTabCur->nullRow = 0;
pTabCur->movetoTarget = rowid;
pTabCur->deferredMoveto = 1;
+ pTabCur->cacheStatus = CACHE_STALE;
assert( pOp->p4type==P4_INTARRAY || pOp->p4.ai==0 );
- pTabCur->aAltMap = pOp->p4.ai;
- assert( !pC->isEphemeral );
assert( !pTabCur->isEphemeral );
+ pTabCur->ub.aAltMap = pOp->p4.ai;
+ assert( !pC->isEphemeral );
pTabCur->pAltCursor = pC;
}else{
pOut = out2Prerelease(p, pOp);
@@ -92542,8 +97256,8 @@ case OP_IdxRowid: { /* out2 */
** seek operation now, without further delay. If the cursor seek has
** already occurred, this instruction is a no-op.
*/
-case OP_FinishSeek: {
- VdbeCursor *pC; /* The P1 index cursor */
+case OP_FinishSeek: { /* ncycle */
+ VdbeCursor *pC; /* The P1 index cursor */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
@@ -92598,10 +97312,10 @@ case OP_FinishSeek: {
** If the P1 index entry is less than or equal to the key value then jump
** to P2. Otherwise fall through to the next instruction.
*/
-case OP_IdxLE: /* jump */
-case OP_IdxGT: /* jump */
-case OP_IdxLT: /* jump */
-case OP_IdxGE: { /* jump */
+case OP_IdxLE: /* jump, ncycle */
+case OP_IdxGT: /* jump, ncycle */
+case OP_IdxLT: /* jump, ncycle */
+case OP_IdxGE: { /* jump, ncycle */
VdbeCursor *pC;
int res;
UnpackedRecord r;
@@ -92654,7 +97368,7 @@ case OP_IdxGE: { /* jump */
rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m);
if( rc ) goto abort_due_to_error;
res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, &r, 0);
- sqlite3VdbeMemRelease(&m);
+ sqlite3VdbeMemReleaseMalloc(&m);
}
/* End of inlined sqlite3VdbeIdxKeyCompare() */
@@ -92750,7 +97464,7 @@ case OP_Destroy: { /* out2 */
** See also: Destroy
*/
case OP_Clear: {
- int nChange;
+ i64 nChange;
sqlite3VdbeIncrWriteCounter(p, 0);
nChange = 0;
@@ -92876,7 +97590,7 @@ case OP_ParseSchema: {
}else
#endif
{
- zSchema = DFLT_SCHEMA_TABLE;
+ zSchema = LEGACY_SCHEMA_TABLE;
initData.db = db;
initData.iDb = iDb;
initData.pzErrMsg = &p->zErrMsg;
@@ -93012,13 +97726,14 @@ case OP_IntegrityCk: {
pIn1 = &aMem[pOp->p1];
assert( pOp->p5<db->nDb );
assert( DbMaskTest(p->btreeMask, pOp->p5) );
- z = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot,
- (int)pnErr->u.i+1, &nErr);
+ rc = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot,
+ (int)pnErr->u.i+1, &nErr, &z);
sqlite3VdbeMemSetNull(pIn1);
if( nErr==0 ){
assert( z==0 );
- }else if( z==0 ){
- goto no_mem;
+ }else if( rc ){
+ sqlite3_free(z);
+ goto abort_due_to_error;
}else{
pnErr->u.i -= nErr-1;
sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free);
@@ -93222,9 +97937,6 @@ case OP_Program: { /* jump */
pFrame->aOp = p->aOp;
pFrame->nOp = p->nOp;
pFrame->token = pProgram->token;
-#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
- pFrame->anExec = p->anExec;
-#endif
#ifdef SQLITE_DEBUG
pFrame->iFrameMagic = SQLITE_FRAME_MAGIC;
#endif
@@ -93261,9 +97973,6 @@ case OP_Program: { /* jump */
memset(pFrame->aOnce, 0, (pProgram->nOp + 7)/8);
p->aOp = aOp = pProgram->aOp;
p->nOp = pProgram->nOp;
-#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
- p->anExec = 0;
-#endif
#ifdef SQLITE_DEBUG
/* Verify that second and subsequent executions of the same trigger do not
** try to reuse register values from the first use. */
@@ -93403,7 +98112,7 @@ case OP_IfPos: { /* jump, in1 */
** Synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)
**
** This opcode performs a commonly used computation associated with
-** LIMIT and OFFSET process. r[P1] holds the limit counter. r[P3]
+** LIMIT and OFFSET processing. r[P1] holds the limit counter. r[P3]
** holds the offset counter. The opcode computes the combined value
** of the LIMIT and OFFSET and stores that value in r[P2]. The r[P2]
** value computed is the total number of rows that will need to be
@@ -93535,6 +98244,7 @@ case OP_AggStep: {
pCtx->pVdbe = p;
pCtx->skipFlag = 0;
pCtx->isError = 0;
+ pCtx->enc = encoding;
pCtx->argc = n;
pOp->p4type = P4_FUNCCTX;
pOp->p4.pCtx = pCtx;
@@ -93664,9 +98374,7 @@ case OP_AggFinal: {
}
sqlite3VdbeChangeEncoding(pMem, encoding);
UPDATE_MAX_BLOBSIZE(pMem);
- if( sqlite3VdbeMemTooBig(pMem) ){
- goto too_big;
- }
+ REGISTER_TRACE((int)(pMem-aMem), pMem);
break;
}
@@ -94022,7 +98730,7 @@ case OP_VDestroy: {
** P1 is a cursor number. This opcode opens a cursor to the virtual
** table and stores that cursor in P1.
*/
-case OP_VOpen: {
+case OP_VOpen: { /* ncycle */
VdbeCursor *pCur;
sqlite3_vtab_cursor *pVCur;
sqlite3_vtab *pVtab;
@@ -94045,7 +98753,7 @@ case OP_VOpen: {
pVCur->pVtab = pVtab;
/* Initialize vdbe cursor object */
- pCur = allocateCursor(p, pOp->p1, 0, -1, CURTYPE_VTAB);
+ pCur = allocateCursor(p, pOp->p1, 0, CURTYPE_VTAB);
if( pCur ){
pCur->uc.pVCur = pVCur;
pVtab->nRef++;
@@ -94059,6 +98767,34 @@ case OP_VOpen: {
#endif /* SQLITE_OMIT_VIRTUALTABLE */
#ifndef SQLITE_OMIT_VIRTUALTABLE
+/* Opcode: VInitIn P1 P2 P3 * *
+** Synopsis: r[P2]=ValueList(P1,P3)
+**
+** Set register P2 to be a pointer to a ValueList object for cursor P1
+** with cache register P3 and output register P3+1. This ValueList object
+** can be used as the first argument to sqlite3_vtab_in_first() and
+** sqlite3_vtab_in_next() to extract all of the values stored in the P1
+** cursor. Register P3 is used to hold the values returned by
+** sqlite3_vtab_in_first() and sqlite3_vtab_in_next().
+*/
+case OP_VInitIn: { /* out2, ncycle */
+ VdbeCursor *pC; /* The cursor containing the RHS values */
+ ValueList *pRhs; /* New ValueList object to put in reg[P2] */
+
+ pC = p->apCsr[pOp->p1];
+ pRhs = sqlite3_malloc64( sizeof(*pRhs) );
+ if( pRhs==0 ) goto no_mem;
+ pRhs->pCsr = pC->uc.pCursor;
+ pRhs->pOut = &aMem[pOp->p3];
+ pOut = out2Prerelease(p, pOp);
+ pOut->flags = MEM_Null;
+ sqlite3VdbeMemSetPointer(pOut, pRhs, "ValueList", sqlite3VdbeValueListFree);
+ break;
+}
+#endif /* SQLITE_OMIT_VIRTUALTABLE */
+
+
+#ifndef SQLITE_OMIT_VIRTUALTABLE
/* Opcode: VFilter P1 P2 P3 P4 *
** Synopsis: iplan=r[P3] zplan='P4'
**
@@ -94078,7 +98814,7 @@ case OP_VOpen: {
**
** A jump is made to P2 if the result set after filtering would be empty.
*/
-case OP_VFilter: { /* jump */
+case OP_VFilter: { /* jump, ncycle */
int nArg;
int iQuery;
const sqlite3_module *pModule;
@@ -94096,6 +98832,7 @@ case OP_VFilter: { /* jump */
pCur = p->apCsr[pOp->p1];
assert( memIsValid(pQuery) );
REGISTER_TRACE(pOp->p3, pQuery);
+ assert( pCur!=0 );
assert( pCur->eCurType==CURTYPE_VTAB );
pVCur = pCur->uc.pVCur;
pVtab = pVCur->pVtab;
@@ -94107,7 +98844,6 @@ case OP_VFilter: { /* jump */
iQuery = (int)pQuery->u.i;
/* Invoke the xFilter method */
- res = 0;
apArg = p->apArg;
for(i = 0; i<nArg; i++){
apArg[i] = &pArgc[i+1];
@@ -94138,14 +98874,14 @@ case OP_VFilter: { /* jump */
** bits (OPFLAG_LENGTHARG or OPFLAG_TYPEOFARG) but those bits are
** unused by OP_VColumn.
*/
-case OP_VColumn: {
+case OP_VColumn: { /* ncycle */
sqlite3_vtab *pVtab;
const sqlite3_module *pModule;
Mem *pDest;
sqlite3_context sContext;
VdbeCursor *pCur = p->apCsr[pOp->p1];
- assert( pCur->eCurType==CURTYPE_VTAB );
+ assert( pCur!=0 );
assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) );
pDest = &aMem[pOp->p3];
memAboutToChange(p, pDest);
@@ -94153,11 +98889,13 @@ case OP_VColumn: {
sqlite3VdbeMemSetNull(pDest);
break;
}
+ assert( pCur->eCurType==CURTYPE_VTAB );
pVtab = pCur->uc.pVCur->pVtab;
pModule = pVtab->pModule;
assert( pModule->xColumn );
memset(&sContext, 0, sizeof(sContext));
sContext.pOut = pDest;
+ sContext.enc = encoding;
assert( pOp->p5==OPFLAG_NOCHNG || pOp->p5==0 );
if( pOp->p5 & OPFLAG_NOCHNG ){
sqlite3VdbeMemSetNull(pDest);
@@ -94176,9 +98914,6 @@ case OP_VColumn: {
REGISTER_TRACE(pOp->p3, pDest);
UPDATE_MAX_BLOBSIZE(pDest);
- if( sqlite3VdbeMemTooBig(pDest) ){
- goto too_big;
- }
if( rc ) goto abort_due_to_error;
break;
}
@@ -94191,14 +98926,14 @@ case OP_VColumn: {
** jump to instruction P2. Or, if the virtual table has reached
** the end of its result set, then fall through to the next instruction.
*/
-case OP_VNext: { /* jump */
+case OP_VNext: { /* jump, ncycle */
sqlite3_vtab *pVtab;
const sqlite3_module *pModule;
int res;
VdbeCursor *pCur;
- res = 0;
pCur = p->apCsr[pOp->p1];
+ assert( pCur!=0 );
assert( pCur->eCurType==CURTYPE_VTAB );
if( pCur->nullRow ){
break;
@@ -94294,7 +99029,7 @@ case OP_VUpdate: {
const sqlite3_module *pModule;
int nArg;
int i;
- sqlite_int64 rowid;
+ sqlite_int64 rowid = 0;
Mem **apArg;
Mem *pX;
@@ -94445,6 +99180,7 @@ case OP_Function: { /* group */
if( pCtx->pOut != pOut ){
pCtx->pVdbe = p;
pCtx->pOut = pOut;
+ pCtx->enc = encoding;
for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i];
}
assert( pCtx->pVdbe==p );
@@ -94471,17 +99207,98 @@ case OP_Function: { /* group */
if( rc ) goto abort_due_to_error;
}
- /* Copy the result of the function into register P3 */
- if( pOut->flags & (MEM_Str|MEM_Blob) ){
- sqlite3VdbeChangeEncoding(pOut, encoding);
- if( sqlite3VdbeMemTooBig(pOut) ) goto too_big;
- }
+ assert( (pOut->flags&MEM_Str)==0
+ || pOut->enc==encoding
+ || db->mallocFailed );
+ assert( !sqlite3VdbeMemTooBig(pOut) );
REGISTER_TRACE(pOp->p3, pOut);
UPDATE_MAX_BLOBSIZE(pOut);
break;
}
+/* Opcode: ClrSubtype P1 * * * *
+** Synopsis: r[P1].subtype = 0
+**
+** Clear the subtype from register P1.
+*/
+case OP_ClrSubtype: { /* in1 */
+ pIn1 = &aMem[pOp->p1];
+ pIn1->flags &= ~MEM_Subtype;
+ break;
+}
+
+/* Opcode: FilterAdd P1 * P3 P4 *
+** Synopsis: filter(P1) += key(P3@P4)
+**
+** Compute a hash on the P4 registers starting with r[P3] and
+** add that hash to the bloom filter contained in r[P1].
+*/
+case OP_FilterAdd: {
+ u64 h;
+
+ assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) );
+ pIn1 = &aMem[pOp->p1];
+ assert( pIn1->flags & MEM_Blob );
+ assert( pIn1->n>0 );
+ h = filterHash(aMem, pOp);
+#ifdef SQLITE_DEBUG
+ if( db->flags&SQLITE_VdbeTrace ){
+ int ii;
+ for(ii=pOp->p3; ii<pOp->p3+pOp->p4.i; ii++){
+ registerTrace(ii, &aMem[ii]);
+ }
+ printf("hash: %llu modulo %d -> %u\n", h, pIn1->n, (int)(h%pIn1->n));
+ }
+#endif
+ h %= pIn1->n;
+ pIn1->z[h/8] |= 1<<(h&7);
+ break;
+}
+
+/* Opcode: Filter P1 P2 P3 P4 *
+** Synopsis: if key(P3@P4) not in filter(P1) goto P2
+**
+** Compute a hash on the key contained in the P4 registers starting
+** with r[P3]. Check to see if that hash is found in the
+** bloom filter hosted by register P1. If it is not present then
+** maybe jump to P2. Otherwise fall through.
+**
+** False negatives are harmless. It is always safe to fall through,
+** even if the value is in the bloom filter. A false negative causes
+** more CPU cycles to be used, but it should still yield the correct
+** answer. However, an incorrect answer may well arise from a
+** false positive - if the jump is taken when it should fall through.
+*/
+case OP_Filter: { /* jump */
+ u64 h;
+
+ assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) );
+ pIn1 = &aMem[pOp->p1];
+ assert( (pIn1->flags & MEM_Blob)!=0 );
+ assert( pIn1->n >= 1 );
+ h = filterHash(aMem, pOp);
+#ifdef SQLITE_DEBUG
+ if( db->flags&SQLITE_VdbeTrace ){
+ int ii;
+ for(ii=pOp->p3; ii<pOp->p3+pOp->p4.i; ii++){
+ registerTrace(ii, &aMem[ii]);
+ }
+ printf("hash: %llu modulo %d -> %u\n", h, pIn1->n, (int)(h%pIn1->n));
+ }
+#endif
+ h %= pIn1->n;
+ if( (pIn1->z[h/8] & (1<<(h&7)))==0 ){
+ VdbeBranchTaken(1, 2);
+ p->aCounter[SQLITE_STMTSTATUS_FILTER_HIT]++;
+ goto jump_to_p2;
+ }else{
+ p->aCounter[SQLITE_STMTSTATUS_FILTER_MISS]++;
+ VdbeBranchTaken(0, 2);
+ }
+ break;
+}
+
/* Opcode: Trace P1 P2 * P4 *
**
** Write P4 on the statement trace output if statement tracing is
@@ -94530,7 +99347,7 @@ case OP_Init: { /* jump */
#ifndef SQLITE_OMIT_TRACE
if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0
- && !p->doingRerun
+ && p->minWriteFileFormat!=254 /* tag-20220401a */
&& (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0
){
#ifndef SQLITE_OMIT_DEPRECATED
@@ -94692,11 +99509,13 @@ default: { /* This is really OP_Noop, OP_Explain */
*****************************************************************************/
}
-#ifdef VDBE_PROFILE
- {
- u64 endTime = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
- if( endTime>start ) pOrigOp->cycles += endTime - start;
- pOrigOp->cnt++;
+#if defined(VDBE_PROFILE)
+ *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
+ pnCycle = 0;
+#elif defined(SQLITE_ENABLE_STMT_SCANSTATUS)
+ if( pnCycle ){
+ *pnCycle += sqlite3Hwtime();
+ pnCycle = 0;
}
#endif
@@ -94739,6 +99558,18 @@ abort_due_to_error:
rc = SQLITE_CORRUPT_BKPT;
}
assert( rc );
+#ifdef SQLITE_DEBUG
+ if( db->flags & SQLITE_VdbeTrace ){
+ const char *zTrace = p->zSql;
+ if( zTrace==0 ){
+ if( aOp[0].opcode==OP_Trace ){
+ zTrace = aOp[0].p4.z;
+ }
+ if( zTrace==0 ) zTrace = "???";
+ }
+ printf("ABORT-due-to-error (rc=%d): %s\n", rc, zTrace);
+ }
+#endif
if( p->zErrMsg==0 && rc!=SQLITE_IOERR_NOMEM ){
sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc));
}
@@ -94747,8 +99578,11 @@ abort_due_to_error:
testcase( sqlite3GlobalConfig.xLog!=0 );
sqlite3_log(rc, "statement aborts at %d: [%s] %s",
(int)(pOp - aOp), p->zSql, p->zErrMsg);
- sqlite3VdbeHalt(p);
+ if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p);
if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db);
+ if( rc==SQLITE_CORRUPT && db->autoCommit==0 ){
+ db->flags |= SQLITE_CorruptRdOnly;
+ }
rc = SQLITE_ERROR;
if( resetSchemaOnFault>0 ){
sqlite3ResetOneSchema(db, resetSchemaOnFault-1);
@@ -94758,6 +99592,18 @@ abort_due_to_error:
** release the mutexes on btrees that were acquired at the
** top. */
vdbe_return:
+#if defined(VDBE_PROFILE)
+ if( pnCycle ){
+ *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
+ pnCycle = 0;
+ }
+#elif defined(SQLITE_ENABLE_STMT_SCANSTATUS)
+ if( pnCycle ){
+ *pnCycle += sqlite3Hwtime();
+ pnCycle = 0;
+ }
+#endif
+
#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
while( nVmStep>=nProgressLimit && db->xProgress!=0 ){
nProgressLimit += db->nProgressOps;
@@ -94769,7 +99615,9 @@ vdbe_return:
}
#endif
p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep;
- sqlite3VdbeLeave(p);
+ if( DbMaskNonZero(p->lockMask) ){
+ sqlite3VdbeLeave(p);
+ }
assert( rc!=SQLITE_OK || nExtraDelete==0
|| sqlite3_strlike("DELETE%",p->zSql,0)!=0
);
@@ -94880,7 +99728,10 @@ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){
}
if( rc==SQLITE_ROW ){
VdbeCursor *pC = v->apCsr[0];
- u32 type = pC->nHdrParsed>p->iCol ? pC->aType[p->iCol] : 0;
+ u32 type;
+ assert( pC!=0 );
+ assert( pC->eCurType==CURTYPE_BTREE );
+ type = pC->nHdrParsed>p->iCol ? pC->aType[p->iCol] : 0;
testcase( pC->nHdrParsed==p->iCol );
testcase( pC->nHdrParsed==p->iCol+1 );
if( type<12 ){
@@ -94954,10 +99805,9 @@ SQLITE_API int sqlite3_blob_open(
sqlite3_mutex_enter(db->mutex);
pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob));
- do {
- memset(&sParse, 0, sizeof(Parse));
+ while(1){
+ sqlite3ParseObjectInit(&sParse,db);
if( !pBlob ) goto blob_open_out;
- sParse.db = db;
sqlite3DbFree(db, zErr);
zErr = 0;
@@ -94972,7 +99822,7 @@ SQLITE_API int sqlite3_blob_open(
sqlite3ErrorMsg(&sParse, "cannot open table without rowid: %s", zTable);
}
#ifndef SQLITE_OMIT_VIEW
- if( pTab && pTab->pSelect ){
+ if( pTab && IsView(pTab) ){
pTab = 0;
sqlite3ErrorMsg(&sParse, "cannot open view: %s", zTable);
}
@@ -94992,7 +99842,7 @@ SQLITE_API int sqlite3_blob_open(
/* Now search pTab for the exact column. */
for(iCol=0; iCol<pTab->nCol; iCol++) {
- if( sqlite3StrICmp(pTab->aCol[iCol].zName, zColumn)==0 ){
+ if( sqlite3StrICmp(pTab->aCol[iCol].zCnName, zColumn)==0 ){
break;
}
}
@@ -95017,7 +99867,8 @@ SQLITE_API int sqlite3_blob_open(
** key columns must be indexed. The check below will pick up this
** case. */
FKey *pFKey;
- for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ assert( IsOrdinaryTable(pTab) );
+ for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){
int j;
for(j=0; j<pFKey->nCol; j++){
if( pFKey->aCol[j].iFrom==iCol ){
@@ -95133,7 +99984,9 @@ SQLITE_API int sqlite3_blob_open(
goto blob_open_out;
}
rc = blobSeekToRow(pBlob, iRow, &zErr);
- } while( (++nAttempt)<SQLITE_MAX_SCHEMA_RETRY && rc==SQLITE_SCHEMA );
+ if( (++nAttempt)>=SQLITE_MAX_SCHEMA_RETRY || rc!=SQLITE_SCHEMA ) break;
+ sqlite3ParseObjectReset(&sParse);
+ }
blob_open_out:
if( rc==SQLITE_OK && db->mallocFailed==0 ){
@@ -95142,9 +99995,9 @@ blob_open_out:
if( pBlob && pBlob->pStmt ) sqlite3VdbeFinalize((Vdbe *)pBlob->pStmt);
sqlite3DbFree(db, pBlob);
}
- sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr);
+ sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : (char*)0), zErr);
sqlite3DbFree(db, zErr);
- sqlite3ParserReset(&sParse);
+ sqlite3ParseObjectReset(&sParse);
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
return rc;
@@ -95224,6 +100077,8 @@ static int blobReadWrite(
*/
sqlite3_int64 iKey;
iKey = sqlite3BtreeIntegerKey(p->pCsr);
+ assert( v->apCsr[0]!=0 );
+ assert( v->apCsr[0]->eCurType==CURTYPE_BTREE );
sqlite3VdbePreUpdateHook(
v, v->apCsr[0], SQLITE_DELETE, p->zDb, p->pTab, iKey, -1, p->iCol
);
@@ -95299,7 +100154,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){
((Vdbe*)p->pStmt)->rc = SQLITE_OK;
rc = blobSeekToRow(p, iRow, &zErr);
if( rc!=SQLITE_OK ){
- sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr);
+ sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : (char*)0), zErr);
sqlite3DbFree(db, zErr);
}
assert( rc!=SQLITE_SCHEMA );
@@ -96277,7 +101132,8 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit(
}
#endif
- assert( pCsr->pKeyInfo && pCsr->pBtx==0 );
+ assert( pCsr->pKeyInfo );
+ assert( !pCsr->isEphemeral );
assert( pCsr->eCurType==CURTYPE_SORTER );
szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*);
sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask);
@@ -96606,7 +101462,7 @@ static void vdbeSorterExtendFile(sqlite3 *db, sqlite3_file *pFd, i64 nByte){
sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_CHUNK_SIZE, &chunksize);
sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_SIZE_HINT, &nByte);
sqlite3OsFetch(pFd, 0, (int)nByte, &p);
- sqlite3OsUnfetch(pFd, 0, p);
+ if( p ) sqlite3OsUnfetch(pFd, 0, p);
}
}
#else
@@ -97324,6 +102180,7 @@ static int vdbeIncrMergerNew(
vdbeMergeEngineFree(pMerger);
rc = SQLITE_NOMEM_BKPT;
}
+ assert( *ppOut!=0 || rc!=SQLITE_OK );
return rc;
}
@@ -98167,6 +103024,9 @@ static int bytecodevtabConnect(
");"
};
+ (void)argc;
+ (void)argv;
+ (void)pzErr;
rc = sqlite3_declare_vtab(db, azSchema[isTabUsed]);
if( rc==SQLITE_OK ){
pNew = sqlite3_malloc( sizeof(*pNew) );
@@ -98402,6 +103262,7 @@ static int bytecodevtabFilter(
bytecodevtab_cursor *pCur = (bytecodevtab_cursor *)pVtabCursor;
bytecodevtab *pVTab = (bytecodevtab *)pVtabCursor->pVtab;
int rc = SQLITE_OK;
+ (void)idxStr;
bytecodevtabCursorClear(pCur);
pCur->iRowid = 0;
@@ -98689,6 +103550,9 @@ static int memjrnlCreateFile(MemJournal *p){
}
+/* Forward reference */
+static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size);
+
/*
** Write data to the file.
*/
@@ -98719,22 +103583,20 @@ static int memjrnlWrite(
** the in-memory journal is being used by a connection using the
** atomic-write optimization. In this case the first 28 bytes of the
** journal file may be written as part of committing the transaction. */
- assert( iOfst==p->endpoint.iOffset || iOfst==0 );
-#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \
- || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
+ assert( iOfst<=p->endpoint.iOffset );
+ if( iOfst>0 && iOfst!=p->endpoint.iOffset ){
+ memjrnlTruncate(pJfd, iOfst);
+ }
if( iOfst==0 && p->pFirst ){
assert( p->nChunkSize>iAmt );
memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt);
- }else
-#else
- assert( iOfst>0 || p->pFirst==0 );
-#endif
- {
+ }else{
while( nWrite>0 ){
FileChunk *pChunk = p->endpoint.pChunk;
int iChunkOffset = (int)(p->endpoint.iOffset%p->nChunkSize);
int iSpace = MIN(nWrite, p->nChunkSize - iChunkOffset);
+ assert( pChunk!=0 || iChunkOffset==0 );
if( iChunkOffset==0 ){
/* New chunk is required to extend the file. */
FileChunk *pNew = sqlite3_malloc(fileChunkSize(p->nChunkSize));
@@ -98749,10 +103611,11 @@ static int memjrnlWrite(
assert( !p->pFirst );
p->pFirst = pNew;
}
- p->endpoint.pChunk = pNew;
+ pChunk = p->endpoint.pChunk = pNew;
}
- memcpy((u8*)p->endpoint.pChunk->zChunk + iChunkOffset, zWrite, iSpace);
+ assert( pChunk!=0 );
+ memcpy((u8*)pChunk->zChunk + iChunkOffset, zWrite, iSpace);
zWrite += iSpace;
nWrite -= iSpace;
p->endpoint.iOffset += iSpace;
@@ -98776,7 +103639,7 @@ static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){
p->pFirst = 0;
}else{
i64 iOff = p->nChunkSize;
- for(pIter=p->pFirst; ALWAYS(pIter) && iOff<=size; pIter=pIter->pNext){
+ for(pIter=p->pFirst; ALWAYS(pIter) && iOff<size; pIter=pIter->pNext){
iOff += p->nChunkSize;
}
if( ALWAYS(pIter) ){
@@ -98868,6 +103731,8 @@ SQLITE_PRIVATE int sqlite3JournalOpen(
){
MemJournal *p = (MemJournal*)pJfd;
+ assert( zName || nSpill<0 || (flags & SQLITE_OPEN_EXCLUSIVE) );
+
/* Zero the file-handle object. If nSpill was passed zero, initialize
** it using the sqlite3OsOpen() function of the underlying VFS. In this
** case none of the code in this module is executed as a result of calls
@@ -99025,7 +103890,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){
assert( !ExprHasProperty(pExpr, EP_WinFunc) );
pExpr = pExpr->pRight;
continue;
- }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ }else if( ExprUseXSelect(pExpr) ){
assert( !ExprHasProperty(pExpr, EP_WinFunc) );
if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort;
}else{
@@ -99295,52 +104160,24 @@ static void resolveAlias(
sqlite3ExprDelete(db, pDup);
pDup = 0;
}else{
+ Expr temp;
incrAggFunctionDepth(pDup, nSubquery);
if( pExpr->op==TK_COLLATE ){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
}
-
- /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This
- ** prevents ExprDelete() from deleting the Expr structure itself,
- ** allowing it to be repopulated by the memcpy() on the following line.
- ** The pExpr->u.zToken might point into memory that will be freed by the
- ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to
- ** make a copy of the token before doing the sqlite3DbFree().
- */
- ExprSetProperty(pExpr, EP_Static);
- sqlite3ExprDelete(db, pExpr);
- memcpy(pExpr, pDup, sizeof(*pExpr));
- if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){
- assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 );
- pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
- pExpr->flags |= EP_MemToken;
- }
+ memcpy(&temp, pDup, sizeof(Expr));
+ memcpy(pDup, pExpr, sizeof(Expr));
+ memcpy(pExpr, &temp, sizeof(Expr));
if( ExprHasProperty(pExpr, EP_WinFunc) ){
if( ALWAYS(pExpr->y.pWin!=0) ){
pExpr->y.pWin->pOwner = pExpr;
}
}
- sqlite3DbFree(db, pDup);
+ sqlite3ExprDeferredDelete(pParse, pDup);
}
}
-
-/*
-** Return TRUE if the name zCol occurs anywhere in the USING clause.
-**
-** Return FALSE if the USING clause is NULL or if it does not contain
-** zCol.
-*/
-static int nameInUsingClause(IdList *pUsing, const char *zCol){
- if( pUsing ){
- int k;
- for(k=0; k<pUsing->nId; k++){
- if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ) return 1;
- }
- }
- return 0;
-}
-
/*
** Subqueries stores the original database, table and column names for their
** result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN".
@@ -99356,7 +104193,7 @@ SQLITE_PRIVATE int sqlite3MatchEName(
){
int n;
const char *zSpan;
- if( pItem->eEName!=ENAME_TAB ) return 0;
+ if( pItem->fg.eEName!=ENAME_TAB ) return 0;
zSpan = pItem->zEName;
for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){}
if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){
@@ -99400,6 +104237,7 @@ SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){
Table *pExTab;
n = pExpr->iColumn;
+ assert( ExprUseYTab(pExpr) );
pExTab = pExpr->y.pTab;
assert( pExTab!=0 );
if( (pExTab->tabFlags & TF_HasGenerated)!=0
@@ -99417,6 +104255,55 @@ SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){
}
/*
+** Create a new expression term for the column specified by pMatch and
+** iColumn. Append this new expression term to the FULL JOIN Match set
+** in *ppList. Create a new *ppList if this is the first term in the
+** set.
+*/
+static void extendFJMatch(
+ Parse *pParse, /* Parsing context */
+ ExprList **ppList, /* ExprList to extend */
+ SrcItem *pMatch, /* Source table containing the column */
+ i16 iColumn /* The column number */
+){
+ Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLUMN, 0, 0);
+ if( pNew ){
+ pNew->iTable = pMatch->iCursor;
+ pNew->iColumn = iColumn;
+ pNew->y.pTab = pMatch->pTab;
+ assert( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 );
+ ExprSetProperty(pNew, EP_CanBeNull);
+ *ppList = sqlite3ExprListAppend(pParse, *ppList, pNew);
+ }
+}
+
+/*
+** Return TRUE (non-zero) if zTab is a valid name for the schema table pTab.
+*/
+static SQLITE_NOINLINE int isValidSchemaTableName(
+ const char *zTab, /* Name as it appears in the SQL */
+ Table *pTab, /* The schema table we are trying to match */
+ Schema *pSchema /* non-NULL if a database qualifier is present */
+){
+ const char *zLegacy;
+ assert( pTab!=0 );
+ assert( pTab->tnum==1 );
+ if( sqlite3StrNICmp(zTab, "sqlite_", 7)!=0 ) return 0;
+ zLegacy = pTab->zName;
+ if( strcmp(zLegacy+7, &LEGACY_TEMP_SCHEMA_TABLE[7])==0 ){
+ if( sqlite3StrICmp(zTab+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){
+ return 1;
+ }
+ if( pSchema==0 ) return 0;
+ if( sqlite3StrICmp(zTab+7, &LEGACY_SCHEMA_TABLE[7])==0 ) return 1;
+ if( sqlite3StrICmp(zTab+7, &PREFERRED_SCHEMA_TABLE[7])==0 ) return 1;
+ }else{
+ if( sqlite3StrICmp(zTab+7, &PREFERRED_SCHEMA_TABLE[7])==0 ) return 1;
+ }
+ return 0;
+}
+
+/*
** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up
** that name in the set of source tables in pSrcList and make the pExpr
** expression node refer back to that source column. The following changes
@@ -99461,11 +104348,13 @@ static int lookupName(
NameContext *pTopNC = pNC; /* First namecontext in the list */
Schema *pSchema = 0; /* Schema of the expression */
int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */
- Table *pTab = 0; /* Table hold the row */
+ Table *pTab = 0; /* Table holding the row */
Column *pCol; /* A column of pTab */
+ ExprList *pFJMatch = 0; /* Matches for FULL JOIN .. USING */
assert( pNC ); /* the name context cannot be NULL. */
assert( zCol ); /* The Z in X.Y.Z cannot be NULL */
+ assert( zDb==0 || zTab!=0 );
assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) );
/* Initialize the node to no-match */
@@ -99513,62 +104402,126 @@ static int lookupName(
u8 hCol;
pTab = pItem->pTab;
assert( pTab!=0 && pTab->zName!=0 );
- assert( pTab->nCol>0 );
- if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){
+ assert( pTab->nCol>0 || pParse->nErr );
+ assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) );
+ if( pItem->fg.isNestedFrom ){
+ /* In this case, pItem is a subquery that has been formed from a
+ ** parenthesized subset of the FROM clause terms. Example:
+ ** .... FROM t1 LEFT JOIN (t2 RIGHT JOIN t3 USING(x)) USING(y) ...
+ ** \_________________________/
+ ** This pItem -------------^
+ */
int hit = 0;
+ assert( pItem->pSelect!=0 );
pEList = pItem->pSelect->pEList;
+ assert( pEList!=0 );
+ assert( pEList->nExpr==pTab->nCol );
for(j=0; j<pEList->nExpr; j++){
- if( sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){
- cnt++;
- cntTab = 2;
- pMatch = pItem;
- pExpr->iColumn = j;
- hit = 1;
+ if( !sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){
+ continue;
}
+ if( cnt>0 ){
+ if( pItem->fg.isUsing==0
+ || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0
+ ){
+ /* Two or more tables have the same column name which is
+ ** not joined by USING. This is an error. Signal as much
+ ** by clearing pFJMatch and letting cnt go above 1. */
+ sqlite3ExprListDelete(db, pFJMatch);
+ pFJMatch = 0;
+ }else
+ if( (pItem->fg.jointype & JT_RIGHT)==0 ){
+ /* An INNER or LEFT JOIN. Use the left-most table */
+ continue;
+ }else
+ if( (pItem->fg.jointype & JT_LEFT)==0 ){
+ /* A RIGHT JOIN. Use the right-most table */
+ cnt = 0;
+ sqlite3ExprListDelete(db, pFJMatch);
+ pFJMatch = 0;
+ }else{
+ /* For a FULL JOIN, we must construct a coalesce() func */
+ extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn);
+ }
+ }
+ cnt++;
+ cntTab = 2;
+ pMatch = pItem;
+ pExpr->iColumn = j;
+ pEList->a[j].fg.bUsed = 1;
+ hit = 1;
+ if( pEList->a[j].fg.bUsingTerm ) break;
}
if( hit || zTab==0 ) continue;
}
- if( zDb && pTab->pSchema!=pSchema ){
- continue;
- }
+ assert( zDb==0 || zTab!=0 );
if( zTab ){
- const char *zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName;
- assert( zTabName!=0 );
- if( sqlite3StrICmp(zTabName, zTab)!=0 ){
- continue;
+ if( zDb ){
+ if( pTab->pSchema!=pSchema ) continue;
+ if( pSchema==0 && strcmp(zDb,"*")!=0 ) continue;
+ }
+ if( pItem->zAlias!=0 ){
+ if( sqlite3StrICmp(zTab, pItem->zAlias)!=0 ){
+ continue;
+ }
+ }else if( sqlite3StrICmp(zTab, pTab->zName)!=0 ){
+ if( pTab->tnum!=1 ) continue;
+ if( !isValidSchemaTableName(zTab, pTab, pSchema) ) continue;
}
+ assert( ExprUseYTab(pExpr) );
if( IN_RENAME_OBJECT && pItem->zAlias ){
sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab);
}
}
- if( 0==(cntTab++) ){
- pMatch = pItem;
- }
hCol = sqlite3StrIHash(zCol);
for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){
- if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){
- /* If there has been exactly one prior match and this match
- ** is for the right-hand table of a NATURAL JOIN or is in a
- ** USING clause, then skip this match.
- */
- if( cnt==1 ){
- if( pItem->fg.jointype & JT_NATURAL ) continue;
- if( nameInUsingClause(pItem->pUsing, zCol) ) continue;
+ if( pCol->hName==hCol
+ && sqlite3StrICmp(pCol->zCnName, zCol)==0
+ ){
+ if( cnt>0 ){
+ if( pItem->fg.isUsing==0
+ || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0
+ ){
+ /* Two or more tables have the same column name which is
+ ** not joined by USING. This is an error. Signal as much
+ ** by clearing pFJMatch and letting cnt go above 1. */
+ sqlite3ExprListDelete(db, pFJMatch);
+ pFJMatch = 0;
+ }else
+ if( (pItem->fg.jointype & JT_RIGHT)==0 ){
+ /* An INNER or LEFT JOIN. Use the left-most table */
+ continue;
+ }else
+ if( (pItem->fg.jointype & JT_LEFT)==0 ){
+ /* A RIGHT JOIN. Use the right-most table */
+ cnt = 0;
+ sqlite3ExprListDelete(db, pFJMatch);
+ pFJMatch = 0;
+ }else{
+ /* For a FULL JOIN, we must construct a coalesce() func */
+ extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn);
+ }
}
cnt++;
pMatch = pItem;
/* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j;
+ if( pItem->fg.isNestedFrom ){
+ sqlite3SrcItemColumnUsed(pItem, j);
+ }
break;
}
}
+ if( 0==cnt && VisibleRowid(pTab) ){
+ cntTab++;
+ pMatch = pItem;
+ }
}
if( pMatch ){
pExpr->iTable = pMatch->iCursor;
+ assert( ExprUseYTab(pExpr) );
pExpr->y.pTab = pMatch->pTab;
- /* RIGHT JOIN not (yet) supported */
- assert( (pMatch->fg.jointype & JT_RIGHT)==0 );
- if( (pMatch->fg.jointype & JT_LEFT)!=0 ){
+ if( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ){
ExprSetProperty(pExpr, EP_CanBeNull);
}
pSchema = pExpr->y.pTab->pSchema;
@@ -99589,7 +104542,8 @@ static int lookupName(
assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT );
if( pParse->bReturning ){
if( (pNC->ncFlags & NC_UBaseReg)!=0
- && (zTab==0 || sqlite3StrICmp(zTab,pParse->pTriggerTab->zName)==0)
+ && ALWAYS(zTab==0
+ || sqlite3StrICmp(zTab,pParse->pTriggerTab->zName)==0)
){
pExpr->iTable = op!=TK_DELETE;
pTab = pParse->pTriggerTab;
@@ -99619,7 +104573,9 @@ static int lookupName(
pSchema = pTab->pSchema;
cntTab++;
for(iCol=0, pCol=pTab->aCol; iCol<pTab->nCol; iCol++, pCol++){
- if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){
+ if( pCol->hName==hCol
+ && sqlite3StrICmp(pCol->zCnName, zCol)==0
+ ){
if( iCol==pTab->iPKey ){
iCol = -1;
}
@@ -99636,6 +104592,7 @@ static int lookupName(
#ifndef SQLITE_OMIT_UPSERT
if( pExpr->iTable==EXCLUDED_TABLE_NUMBER ){
testcase( iCol==(-1) );
+ assert( ExprUseYTab(pExpr) );
if( IN_RENAME_OBJECT ){
pExpr->iColumn = iCol;
pExpr->y.pTab = pTab;
@@ -99648,9 +104605,12 @@ static int lookupName(
}else
#endif /* SQLITE_OMIT_UPSERT */
{
+ assert( ExprUseYTab(pExpr) );
pExpr->y.pTab = pTab;
if( pParse->bReturning ){
eNewExprOp = TK_REGISTER;
+ pExpr->op2 = TK_COLUMN;
+ pExpr->iColumn = iCol;
pExpr->iTable = pNC->uNC.iBaseReg + (pTab->nCol+1)*pExpr->iTable +
sqlite3TableColumnToStorage(pTab, iCol) + 1;
}else{
@@ -99684,7 +104644,7 @@ static int lookupName(
&& pMatch
&& (pNC->ncFlags & (NC_IdxExpr|NC_GenCol))==0
&& sqlite3IsRowid(zCol)
- && VisibleRowid(pMatch->pTab)
+ && ALWAYS(VisibleRowid(pMatch->pTab))
){
cnt = 1;
pExpr->iColumn = -1;
@@ -99717,13 +104677,13 @@ static int lookupName(
assert( pEList!=0 );
for(j=0; j<pEList->nExpr; j++){
char *zAs = pEList->a[j].zEName;
- if( pEList->a[j].eEName==ENAME_NAME
+ if( pEList->a[j].fg.eEName==ENAME_NAME
&& sqlite3_stricmp(zAs, zCol)==0
){
Expr *pOrig;
assert( pExpr->pLeft==0 && pExpr->pRight==0 );
- assert( pExpr->x.pList==0 );
- assert( pExpr->x.pSelect==0 );
+ assert( ExprUseXList(pExpr)==0 || pExpr->x.pList==0 );
+ assert( ExprUseXSelect(pExpr)==0 || pExpr->x.pSelect==0 );
pOrig = pEList->a[j].pExpr;
if( (pNC->ncFlags&NC_AllowAgg)==0 && ExprHasProperty(pOrig, EP_Agg) ){
sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs);
@@ -99795,7 +104755,7 @@ static int lookupName(
sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol);
#endif
pExpr->op = TK_STRING;
- pExpr->y.pTab = 0;
+ memset(&pExpr->y, 0, sizeof(pExpr->y));
return WRC_Prune;
}
if( sqlite3ExprIdToTrueFalse(pExpr) ){
@@ -99804,11 +104764,37 @@ static int lookupName(
}
/*
- ** cnt==0 means there was not match. cnt>1 means there were two or
- ** more matches. Either way, we have an error.
+ ** cnt==0 means there was not match.
+ ** cnt>1 means there were two or more matches.
+ **
+ ** cnt==0 is always an error. cnt>1 is often an error, but might
+ ** be multiple matches for a NATURAL LEFT JOIN or a LEFT JOIN USING.
*/
+ assert( pFJMatch==0 || cnt>0 );
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) );
if( cnt!=1 ){
const char *zErr;
+ if( pFJMatch ){
+ if( pFJMatch->nExpr==cnt-1 ){
+ if( ExprHasProperty(pExpr,EP_Leaf) ){
+ ExprClearProperty(pExpr,EP_Leaf);
+ }else{
+ sqlite3ExprDelete(db, pExpr->pLeft);
+ pExpr->pLeft = 0;
+ sqlite3ExprDelete(db, pExpr->pRight);
+ pExpr->pRight = 0;
+ }
+ extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn);
+ pExpr->op = TK_FUNCTION;
+ pExpr->u.zToken = "coalesce";
+ pExpr->x.pList = pFJMatch;
+ cnt = 1;
+ goto lookupname_end;
+ }else{
+ sqlite3ExprListDelete(db, pFJMatch);
+ pFJMatch = 0;
+ }
+ }
zErr = cnt==0 ? "no such column" : "ambiguous column name";
if( zDb ){
sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol);
@@ -99817,9 +104803,20 @@ static int lookupName(
}else{
sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol);
}
+ sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr);
pParse->checkSchema = 1;
pTopNC->nNcErr++;
}
+ assert( pFJMatch==0 );
+
+ /* Remove all substructure from pExpr */
+ if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){
+ sqlite3ExprDelete(db, pExpr->pLeft);
+ pExpr->pLeft = 0;
+ sqlite3ExprDelete(db, pExpr->pRight);
+ pExpr->pRight = 0;
+ ExprSetProperty(pExpr, EP_Leaf);
+ }
/* If a column from a table in pSrcList is referenced, then record
** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes
@@ -99839,16 +104836,7 @@ static int lookupName(
pMatch->colUsed |= sqlite3ExprColUsed(pExpr);
}
- /* Clean up and return
- */
- if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){
- sqlite3ExprDelete(db, pExpr->pLeft);
- pExpr->pLeft = 0;
- sqlite3ExprDelete(db, pExpr->pRight);
- pExpr->pRight = 0;
- }
pExpr->op = eNewExprOp;
- ExprSetProperty(pExpr, EP_Leaf);
lookupname_end:
if( cnt==1 ){
assert( pNC!=0 );
@@ -99881,7 +104869,9 @@ SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSr
Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0);
if( p ){
SrcItem *pItem = &pSrc->a[iSrc];
- Table *pTab = p->y.pTab = pItem->pTab;
+ Table *pTab;
+ assert( ExprUseYTab(p) );
+ pTab = p->y.pTab = pItem->pTab;
p->iTable = pItem->iCursor;
if( p->y.pTab->iPKey==iCol ){
p->iColumn = -1;
@@ -99923,7 +104913,8 @@ static void notValidImpl(
Parse *pParse, /* Leave error message here */
NameContext *pNC, /* The name context */
const char *zMsg, /* Type of error */
- Expr *pExpr /* Invalidate this expression on error */
+ Expr *pExpr, /* Invalidate this expression on error */
+ Expr *pError /* Associate error with this expression */
){
const char *zIn = "partial index WHERE clauses";
if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions";
@@ -99935,10 +104926,11 @@ static void notValidImpl(
#endif
sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn);
if( pExpr ) pExpr->op = TK_NULL;
+ sqlite3RecordErrorOffsetOfExpr(pParse->db, pError);
}
-#define sqlite3ResolveNotValid(P,N,M,X,E) \
+#define sqlite3ResolveNotValid(P,N,M,X,E,R) \
assert( ((X)&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol))==0 ); \
- if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E);
+ if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E,R);
/*
** Expression p should encode a floating point value between 1.0 and 0.0.
@@ -99948,6 +104940,7 @@ static void notValidImpl(
static int exprProbability(Expr *p){
double r = -1.0;
if( p->op!=TK_FLOAT ) return -1;
+ assert( !ExprHasProperty(p, EP_IntValue) );
sqlite3AtoF(p->u.zToken, &r, sqlite3Strlen30(p->u.zToken), SQLITE_UTF8);
assert( r>=0.0 );
if( r>1.0 ) return -1;
@@ -99996,6 +104989,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
assert( pSrcList && pSrcList->nSrc>=1 );
pItem = pSrcList->a;
pExpr->op = TK_COLUMN;
+ assert( ExprUseYTab(pExpr) );
pExpr->y.pTab = pItem->pTab;
pExpr->iTable = pItem->iCursor;
pExpr->iColumn--;
@@ -100027,14 +105021,12 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
}
sqlite3WalkExpr(pWalker, pExpr->pLeft);
if( 0==sqlite3ExprCanBeNull(pExpr->pLeft) && !IN_RENAME_OBJECT ){
- if( pExpr->op==TK_NOTNULL ){
- pExpr->u.zToken = "true";
- ExprSetProperty(pExpr, EP_IsTrue);
- }else{
- pExpr->u.zToken = "false";
- ExprSetProperty(pExpr, EP_IsFalse);
- }
- pExpr->op = TK_TRUEFALSE;
+ testcase( ExprHasProperty(pExpr, EP_OuterON) );
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ pExpr->u.iValue = (pExpr->op==TK_NOTNULL);
+ pExpr->flags |= EP_IntValue;
+ pExpr->op = TK_INTEGER;
+
for(i=0, p=pNC; p && i<ArraySize(anRef); p=p->pNext, i++){
p->nRef = anRef[i];
}
@@ -100062,24 +105054,28 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
if( pExpr->op==TK_ID ){
zDb = 0;
zTable = 0;
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
zColumn = pExpr->u.zToken;
}else{
Expr *pLeft = pExpr->pLeft;
testcase( pNC->ncFlags & NC_IdxExpr );
testcase( pNC->ncFlags & NC_GenCol );
sqlite3ResolveNotValid(pParse, pNC, "the \".\" operator",
- NC_IdxExpr|NC_GenCol, 0);
+ NC_IdxExpr|NC_GenCol, 0, pExpr);
pRight = pExpr->pRight;
if( pRight->op==TK_ID ){
zDb = 0;
}else{
assert( pRight->op==TK_DOT );
+ assert( !ExprHasProperty(pRight, EP_IntValue) );
zDb = pLeft->u.zToken;
pLeft = pRight->pLeft;
pRight = pRight->pRight;
}
+ assert( ExprUseUToken(pLeft) && ExprUseUToken(pRight) );
zTable = pLeft->u.zToken;
zColumn = pRight->u.zToken;
+ assert( ExprUseYTab(pExpr) );
if( IN_RENAME_OBJECT ){
sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight);
sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft);
@@ -100096,7 +105092,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
int no_such_func = 0; /* True if no such function exists */
int wrong_num_args = 0; /* True if wrong number of arguments */
int is_agg = 0; /* True if is an aggregate function */
- int nId; /* Number of characters in function name */
const char *zId; /* The function name. */
FuncDef *pDef; /* Information about the function */
u8 enc = ENC(pParse->db); /* The database encoding */
@@ -100104,9 +105099,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
#ifndef SQLITE_OMIT_WINDOWFUNC
Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0);
#endif
- assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) );
zId = pExpr->u.zToken;
- nId = sqlite3Strlen30(zId);
pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0);
if( pDef==0 ){
pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0);
@@ -100123,8 +105117,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
pExpr->iTable = exprProbability(pList->a[1].pExpr);
if( pExpr->iTable<0 ){
sqlite3ErrorMsg(pParse,
- "second argument to likelihood() must be a "
- "constant between 0.0 and 1.0");
+ "second argument to %#T() must be a "
+ "constant between 0.0 and 1.0", pExpr);
pNC->nNcErr++;
}
}else{
@@ -100145,8 +105139,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
int auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0,pDef->zName,0);
if( auth!=SQLITE_OK ){
if( auth==SQLITE_DENY ){
- sqlite3ErrorMsg(pParse, "not authorized to use function: %s",
- pDef->zName);
+ sqlite3ErrorMsg(pParse, "not authorized to use function: %#T",
+ pExpr);
pNC->nNcErr++;
}
pExpr->op = TK_NULL;
@@ -100169,7 +105163,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
** in a CHECK constraint. SQLServer, MySQL, and PostgreSQL all
** all this. */
sqlite3ResolveNotValid(pParse, pNC, "non-deterministic functions",
- NC_IdxExpr|NC_PartIdx|NC_GenCol, 0);
+ NC_IdxExpr|NC_PartIdx|NC_GenCol, 0, pExpr);
}else{
assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */
pExpr->op2 = pNC->ncFlags & NC_SelfRef;
@@ -100182,7 +105176,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
/* Internal-use-only functions are disallowed unless the
** SQL is being compiled using sqlite3NestedParse() or
** the SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test-control has be
- ** used to activate internal functionsn for testing purposes */
+ ** used to activate internal functions for testing purposes */
no_such_func = 1;
pDef = 0;
}else
@@ -100201,7 +105195,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
);
if( pDef && pDef->xValue==0 && pWin ){
sqlite3ErrorMsg(pParse,
- "%.*s() may not be used as a window function", nId, zId
+ "%#T() may not be used as a window function", pExpr
);
pNC->nNcErr++;
}else if(
@@ -100215,13 +105209,13 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
}else{
zType = "aggregate";
}
- sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId);
+ sqlite3ErrorMsg(pParse, "misuse of %s function %#T()",zType,pExpr);
pNC->nNcErr++;
is_agg = 0;
}
#else
if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){
- sqlite3ErrorMsg(pParse,"misuse of aggregate function %.*s()",nId,zId);
+ sqlite3ErrorMsg(pParse,"misuse of aggregate function %#T()",pExpr);
pNC->nNcErr++;
is_agg = 0;
}
@@ -100231,18 +105225,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
&& pParse->explain==0
#endif
){
- sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId);
+ sqlite3ErrorMsg(pParse, "no such function: %#T", pExpr);
pNC->nNcErr++;
}else if( wrong_num_args ){
- sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()",
- nId, zId);
+ sqlite3ErrorMsg(pParse,"wrong number of arguments to function %#T()",
+ pExpr);
pNC->nNcErr++;
}
#ifndef SQLITE_OMIT_WINDOWFUNC
else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){
sqlite3ErrorMsg(pParse,
- "FILTER may not be used with non-aggregate %.*s()",
- nId, zId
+ "FILTER may not be used with non-aggregate %#T()",
+ pExpr
);
pNC->nNcErr++;
}
@@ -100268,7 +105262,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
#ifndef SQLITE_OMIT_WINDOWFUNC
if( pWin ){
Select *pSel = pNC->pWinSelect;
- assert( pWin==pExpr->y.pWin );
+ assert( pWin==0 || (ExprUseYWin(pExpr) && pWin==pExpr->y.pWin) );
if( IN_RENAME_OBJECT==0 ){
sqlite3WindowUpdate(pParse, pSel ? pSel->pWinDefn : 0, pWin, pDef);
if( pParse->db->mallocFailed ) break;
@@ -100281,7 +105275,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
}else
#endif /* SQLITE_OMIT_WINDOWFUNC */
{
- NameContext *pNC2 = pNC;
+ NameContext *pNC2; /* For looping up thru outer contexts */
pExpr->op = TK_AGG_FUNCTION;
pExpr->op2 = 0;
#ifndef SQLITE_OMIT_WINDOWFUNC
@@ -100289,16 +105283,22 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter);
}
#endif
- while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){
+ pNC2 = pNC;
+ while( pNC2
+ && sqlite3ReferencesSrcList(pParse, pExpr, pNC2->pSrcList)==0
+ ){
pExpr->op2++;
pNC2 = pNC2->pNext;
}
assert( pDef!=0 || IN_RENAME_OBJECT );
if( pNC2 && pDef ){
assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg );
+ assert( SQLITE_FUNC_ANYORDER==NC_OrderAgg );
testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 );
- pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX);
-
+ testcase( (pDef->funcFlags & SQLITE_FUNC_ANYORDER)!=0 );
+ pNC2->ncFlags |= NC_HasAgg
+ | ((pDef->funcFlags^SQLITE_FUNC_ANYORDER)
+ & (SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER));
}
}
pNC->ncFlags |= savedAllowFlags;
@@ -100314,20 +105314,22 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
#endif
case TK_IN: {
testcase( pExpr->op==TK_IN );
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
int nRef = pNC->nRef;
testcase( pNC->ncFlags & NC_IsCheck );
testcase( pNC->ncFlags & NC_PartIdx );
testcase( pNC->ncFlags & NC_IdxExpr );
testcase( pNC->ncFlags & NC_GenCol );
- sqlite3ResolveNotValid(pParse, pNC, "subqueries",
- NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr);
- sqlite3WalkSelect(pWalker, pExpr->x.pSelect);
+ if( pNC->ncFlags & NC_SelfRef ){
+ notValidImpl(pParse, pNC, "subqueries", pExpr, pExpr);
+ }else{
+ sqlite3WalkSelect(pWalker, pExpr->x.pSelect);
+ }
assert( pNC->nRef>=nRef );
if( nRef!=pNC->nRef ){
ExprSetProperty(pExpr, EP_VarSelect);
- pNC->ncFlags |= NC_VarSelect;
}
+ pNC->ncFlags |= NC_Subquery;
}
break;
}
@@ -100337,7 +105339,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
testcase( pNC->ncFlags & NC_IdxExpr );
testcase( pNC->ncFlags & NC_GenCol );
sqlite3ResolveNotValid(pParse, pNC, "parameters",
- NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr);
+ NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr, pExpr);
break;
}
case TK_IS:
@@ -100369,6 +105371,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
assert( pExpr->pLeft!=0 );
nLeft = sqlite3ExprVectorSize(pExpr->pLeft);
if( pExpr->op==TK_BETWEEN ){
+ assert( ExprUseXList(pExpr) );
nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[0].pExpr);
if( nRight==nLeft ){
nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[1].pExpr);
@@ -100388,11 +105391,13 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
testcase( pExpr->op==TK_ISNOT );
testcase( pExpr->op==TK_BETWEEN );
sqlite3ErrorMsg(pParse, "row value misused");
+ sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr);
}
break;
}
}
- return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue;
+ assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 );
+ return pParse->nErr ? WRC_Abort : WRC_Continue;
}
/*
@@ -100417,9 +105422,11 @@ static int resolveAsName(
UNUSED_PARAMETER(pParse);
if( pE->op==TK_ID ){
- char *zCol = pE->u.zToken;
+ const char *zCol;
+ assert( !ExprHasProperty(pE, EP_IntValue) );
+ zCol = pE->u.zToken;
for(i=0; i<pEList->nExpr; i++){
- if( pEList->a[i].eEName==ENAME_NAME
+ if( pEList->a[i].fg.eEName==ENAME_NAME
&& sqlite3_stricmp(pEList->a[i].zEName, zCol)==0
){
return i+1;
@@ -100498,11 +105505,13 @@ static void resolveOutOfRangeError(
Parse *pParse, /* The error context into which to write the error */
const char *zType, /* "ORDER" or "GROUP" */
int i, /* The index (1-based) of the term out of range */
- int mx /* Largest permissible value of i */
+ int mx, /* Largest permissible value of i */
+ Expr *pError /* Associate the error with the expression */
){
sqlite3ErrorMsg(pParse,
"%r %s BY term out of range - should be "
"between 1 and %d", i, zType, mx);
+ sqlite3RecordErrorOffsetOfExpr(pParse->db, pError);
}
/*
@@ -100538,7 +105547,7 @@ static int resolveCompoundOrderBy(
return 1;
}
for(i=0; i<pOrderBy->nExpr; i++){
- pOrderBy->a[i].done = 0;
+ pOrderBy->a[i].fg.done = 0;
}
pSelect->pNext = 0;
while( pSelect->pPrior ){
@@ -100553,12 +105562,12 @@ static int resolveCompoundOrderBy(
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
int iCol = -1;
Expr *pE, *pDup;
- if( pItem->done ) continue;
+ if( pItem->fg.done ) continue;
pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr);
if( NEVER(pE==0) ) continue;
if( sqlite3ExprIsInteger(pE, &iCol) ){
if( iCol<=0 || iCol>pEList->nExpr ){
- resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr);
+ resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr, pE);
return 1;
}
}else{
@@ -100606,7 +105615,7 @@ static int resolveCompoundOrderBy(
sqlite3ExprDelete(db, pE);
pItem->u.x.iOrderByCol = (u16)iCol;
}
- pItem->done = 1;
+ pItem->fg.done = 1;
}else{
moreToDo = 1;
}
@@ -100614,7 +105623,7 @@ static int resolveCompoundOrderBy(
pSelect = pSelect->pNext;
}
for(i=0; i<pOrderBy->nExpr; i++){
- if( pOrderBy->a[i].done==0 ){
+ if( pOrderBy->a[i].fg.done==0 ){
sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any "
"column in the result set", i+1);
return 1;
@@ -100654,7 +105663,7 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
if( pItem->u.x.iOrderByCol ){
if( pItem->u.x.iOrderByCol>pEList->nExpr ){
- resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr);
+ resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr, 0);
return 1;
}
resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr,0);
@@ -100746,7 +105755,7 @@ static int resolveOrderGroupBy(
** number so that sqlite3ResolveOrderGroupBy() will convert the
** order-by term to a copy of the result-set expression */
if( iCol<1 || iCol>0xffff ){
- resolveOutOfRangeError(pParse, zType, i+1, nResult);
+ resolveOutOfRangeError(pParse, zType, i+1, nResult, pE2);
return 1;
}
pItem->u.x.iOrderByCol = (u16)iCol;
@@ -100804,7 +105813,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
*/
if( (p->selFlags & SF_Expanded)==0 ){
sqlite3SelectPrep(pParse, p, pOuterNC);
- return (pParse->nErr || db->mallocFailed) ? WRC_Abort : WRC_Prune;
+ return pParse->nErr ? WRC_Abort : WRC_Prune;
}
isCompound = p->pPrior!=0;
@@ -100841,7 +105850,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
p->pOrderBy = 0;
}
- /* Recursively resolve names in all subqueries
+ /* Recursively resolve names in all subqueries in the FROM clause
*/
for(i=0; i<p->pSrc->nSrc; i++){
SrcItem *pItem = &p->pSrc->a[i];
@@ -100852,7 +105861,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
if( pItem->zName ) pParse->zAuthContext = pItem->zName;
sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC);
pParse->zAuthContext = zSavedContext;
- if( pParse->nErr || db->mallocFailed ) return WRC_Abort;
+ if( pParse->nErr ) return WRC_Abort;
+ assert( db->mallocFailed==0 );
/* If the number of references to the outer context changed when
** expressions in the sub-select were resolved, the sub-select
@@ -100885,7 +105895,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
pGroupBy = p->pGroupBy;
if( pGroupBy || (sNC.ncFlags & NC_HasAgg)!=0 ){
assert( NC_MinMaxAgg==SF_MinMaxAgg );
- p->selFlags |= SF_Aggregate | (sNC.ncFlags&NC_MinMaxAgg);
+ assert( NC_OrderAgg==SF_OrderByReqd );
+ p->selFlags |= SF_Aggregate | (sNC.ncFlags&(NC_MinMaxAgg|NC_OrderAgg));
}else{
sNC.ncFlags &= ~NC_AllowAgg;
}
@@ -100902,8 +105913,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
sNC.uNC.pEList = p->pEList;
sNC.ncFlags |= NC_UEList;
if( p->pHaving ){
- if( !pGroupBy ){
- sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING");
+ if( (p->selFlags & SF_Aggregate)==0 ){
+ sqlite3ErrorMsg(pParse, "HAVING clause on a non-aggregate query");
return WRC_Abort;
}
if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort;
@@ -101068,8 +106079,8 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames(
Walker w;
if( pExpr==0 ) return SQLITE_OK;
- savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin);
- pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin);
+ savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
+ pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
w.pParse = pNC->pParse;
w.xExprCallback = resolveExprStep;
w.xSelectCallback = (pNC->ncFlags & NC_NoSelect) ? 0 : resolveSelectStep;
@@ -101112,8 +106123,8 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames(
w.xSelectCallback = resolveSelectStep;
w.xSelectCallback2 = 0;
w.u.pNC = pNC;
- savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin);
- pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin);
+ savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
+ pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
for(i=0; i<pList->nExpr; i++){
Expr *pExpr = pList->a[i].pExpr;
if( pExpr==0 ) continue;
@@ -101131,10 +106142,11 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames(
assert( EP_Win==NC_HasWin );
testcase( pNC->ncFlags & NC_HasAgg );
testcase( pNC->ncFlags & NC_HasWin );
- if( pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin) ){
+ if( pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg) ){
ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) );
- savedHasAgg |= pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin);
- pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin);
+ savedHasAgg |= pNC->ncFlags &
+ (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
+ pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
}
if( w.pParse->nErr>0 ) return WRC_Abort;
}
@@ -101248,9 +106260,9 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piToFree);
/*
** Return the affinity character for a single column of a table.
*/
-SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table *pTab, int iCol){
- assert( iCol<pTab->nCol );
- return iCol>=0 ? pTab->aCol[iCol].affinity : SQLITE_AFF_INTEGER;
+SQLITE_PRIVATE char sqlite3TableColumnAffinity(const Table *pTab, int iCol){
+ if( iCol<0 || NEVER(iCol>=pTab->nCol) ) return SQLITE_AFF_INTEGER;
+ return pTab->aCol[iCol].affinity;
}
/*
@@ -101271,44 +106283,122 @@ SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table *pTab, int iCol){
*/
SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){
int op;
- while( ExprHasProperty(pExpr, EP_Skip|EP_IfNullRow) ){
- assert( pExpr->op==TK_COLLATE
- || pExpr->op==TK_IF_NULL_ROW
- || (pExpr->op==TK_REGISTER && pExpr->op2==TK_IF_NULL_ROW) );
- pExpr = pExpr->pLeft;
- assert( pExpr!=0 );
- }
op = pExpr->op;
- if( op==TK_REGISTER ) op = pExpr->op2;
- if( (op==TK_COLUMN || op==TK_AGG_COLUMN) && pExpr->y.pTab ){
- return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn);
- }
- if( op==TK_SELECT ){
- assert( pExpr->flags&EP_xIsSelect );
- assert( pExpr->x.pSelect!=0 );
- assert( pExpr->x.pSelect->pEList!=0 );
- assert( pExpr->x.pSelect->pEList->a[0].pExpr!=0 );
- return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr);
- }
+ while( 1 /* exit-by-break */ ){
+ if( op==TK_COLUMN || (op==TK_AGG_COLUMN && pExpr->y.pTab!=0) ){
+ assert( ExprUseYTab(pExpr) );
+ assert( pExpr->y.pTab!=0 );
+ return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn);
+ }
+ if( op==TK_SELECT ){
+ assert( ExprUseXSelect(pExpr) );
+ assert( pExpr->x.pSelect!=0 );
+ assert( pExpr->x.pSelect->pEList!=0 );
+ assert( pExpr->x.pSelect->pEList->a[0].pExpr!=0 );
+ return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr);
+ }
#ifndef SQLITE_OMIT_CAST
- if( op==TK_CAST ){
- assert( !ExprHasProperty(pExpr, EP_IntValue) );
- return sqlite3AffinityType(pExpr->u.zToken, 0);
- }
+ if( op==TK_CAST ){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ return sqlite3AffinityType(pExpr->u.zToken, 0);
+ }
#endif
- if( op==TK_SELECT_COLUMN ){
- assert( pExpr->pLeft->flags&EP_xIsSelect );
- return sqlite3ExprAffinity(
- pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr
- );
- }
- if( op==TK_VECTOR ){
- return sqlite3ExprAffinity(pExpr->x.pList->a[0].pExpr);
+ if( op==TK_SELECT_COLUMN ){
+ assert( pExpr->pLeft!=0 && ExprUseXSelect(pExpr->pLeft) );
+ assert( pExpr->iColumn < pExpr->iTable );
+ assert( pExpr->iTable==pExpr->pLeft->x.pSelect->pEList->nExpr );
+ return sqlite3ExprAffinity(
+ pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr
+ );
+ }
+ if( op==TK_VECTOR ){
+ assert( ExprUseXList(pExpr) );
+ return sqlite3ExprAffinity(pExpr->x.pList->a[0].pExpr);
+ }
+ if( ExprHasProperty(pExpr, EP_Skip|EP_IfNullRow) ){
+ assert( pExpr->op==TK_COLLATE
+ || pExpr->op==TK_IF_NULL_ROW
+ || (pExpr->op==TK_REGISTER && pExpr->op2==TK_IF_NULL_ROW) );
+ pExpr = pExpr->pLeft;
+ op = pExpr->op;
+ continue;
+ }
+ if( op!=TK_REGISTER || (op = pExpr->op2)==TK_REGISTER ) break;
}
return pExpr->affExpr;
}
/*
+** Make a guess at all the possible datatypes of the result that could
+** be returned by an expression. Return a bitmask indicating the answer:
+**
+** 0x01 Numeric
+** 0x02 Text
+** 0x04 Blob
+**
+** If the expression must return NULL, then 0x00 is returned.
+*/
+SQLITE_PRIVATE int sqlite3ExprDataType(const Expr *pExpr){
+ while( pExpr ){
+ switch( pExpr->op ){
+ case TK_COLLATE:
+ case TK_IF_NULL_ROW:
+ case TK_UPLUS: {
+ pExpr = pExpr->pLeft;
+ break;
+ }
+ case TK_NULL: {
+ pExpr = 0;
+ break;
+ }
+ case TK_STRING: {
+ return 0x02;
+ }
+ case TK_BLOB: {
+ return 0x04;
+ }
+ case TK_CONCAT: {
+ return 0x06;
+ }
+ case TK_VARIABLE:
+ case TK_AGG_FUNCTION:
+ case TK_FUNCTION: {
+ return 0x07;
+ }
+ case TK_COLUMN:
+ case TK_AGG_COLUMN:
+ case TK_SELECT:
+ case TK_CAST:
+ case TK_SELECT_COLUMN:
+ case TK_VECTOR: {
+ int aff = sqlite3ExprAffinity(pExpr);
+ if( aff>=SQLITE_AFF_NUMERIC ) return 0x05;
+ if( aff==SQLITE_AFF_TEXT ) return 0x06;
+ return 0x07;
+ }
+ case TK_CASE: {
+ int res = 0;
+ int ii;
+ ExprList *pList = pExpr->x.pList;
+ assert( ExprUseXList(pExpr) && pList!=0 );
+ assert( pList->nExpr > 0);
+ for(ii=1; ii<pList->nExpr; ii+=2){
+ res |= sqlite3ExprDataType(pList->a[ii].pExpr);
+ }
+ if( pList->nExpr % 2 ){
+ res |= sqlite3ExprDataType(pList->a[pList->nExpr-1].pExpr);
+ }
+ return res;
+ }
+ default: {
+ return 0x01;
+ }
+ } /* End of switch(op) */
+ } /* End of while(pExpr) */
+ return 0x00;
+}
+
+/*
** Set the collating sequence for expression pExpr to be the collating
** sequence named by pToken. Return a pointer to a new Expr node that
** implements the COLLATE operator.
@@ -101317,7 +106407,7 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){
** and the pExpr parameter is returned unchanged.
*/
SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(
- Parse *pParse, /* Parsing context */
+ const Parse *pParse, /* Parsing context */
Expr *pExpr, /* Add the "COLLATE" clause to this expression */
const Token *pCollName, /* Name of collating sequence */
int dequote /* True to dequote pCollName */
@@ -101332,7 +106422,11 @@ SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(
}
return pExpr;
}
-SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){
+SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(
+ const Parse *pParse, /* Parsing context */
+ Expr *pExpr, /* Add the "COLLATE" clause to this expression */
+ const char *zC /* The collating sequence name */
+){
Token s;
assert( zC!=0 );
sqlite3TokenInit(&s, (char*)zC);
@@ -101358,7 +106452,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){
SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){
while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){
if( ExprHasProperty(pExpr, EP_Unlikely) ){
- assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
+ assert( ExprUseXList(pExpr) );
assert( pExpr->x.pList->nExpr>0 );
assert( pExpr->op==TK_FUNCTION );
pExpr = pExpr->x.pList->a[0].pExpr;
@@ -101391,14 +106485,14 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){
while( p ){
int op = p->op;
if( op==TK_REGISTER ) op = p->op2;
- if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER)
- && p->y.pTab!=0
+ if( (op==TK_AGG_COLUMN && p->y.pTab!=0)
+ || op==TK_COLUMN || op==TK_TRIGGER
){
- /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally
- ** a TK_COLUMN but was previously evaluated and cached in a register */
- int j = p->iColumn;
- if( j>=0 ){
- const char *zColl = p->y.pTab->aCol[j].zColl;
+ int j;
+ assert( ExprUseYTab(p) );
+ assert( p->y.pTab!=0 );
+ if( (j = p->iColumn)>=0 ){
+ const char *zColl = sqlite3ColumnColl(&p->y.pTab->aCol[j]);
pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
}
break;
@@ -101408,10 +106502,12 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){
continue;
}
if( op==TK_VECTOR ){
+ assert( ExprUseXList(p) );
p = p->x.pList->a[0].pExpr;
continue;
}
if( op==TK_COLLATE ){
+ assert( !ExprHasProperty(p, EP_IntValue) );
pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken);
break;
}
@@ -101421,13 +106517,10 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){
}else{
Expr *pNext = p->pRight;
/* The Expr.x union is never used at the same time as Expr.pRight */
- assert( p->x.pList==0 || p->pRight==0 );
- if( p->x.pList!=0
- && !db->mallocFailed
- && ALWAYS(!ExprHasProperty(p, EP_xIsSelect))
- ){
+ assert( !ExprUseXList(p) || p->x.pList==0 || p->pRight==0 );
+ if( ExprUseXList(p) && p->x.pList!=0 && !db->mallocFailed ){
int i;
- for(i=0; ALWAYS(i<p->x.pList->nExpr); i++){
+ for(i=0; i<p->x.pList->nExpr; i++){
if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){
pNext = p->x.pList->a[i].pExpr;
break;
@@ -101508,7 +106601,7 @@ static char comparisonAffinity(const Expr *pExpr){
aff = sqlite3ExprAffinity(pExpr->pLeft);
if( pExpr->pRight ){
aff = sqlite3CompareAffinity(pExpr->pRight, aff);
- }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ }else if( ExprUseXSelect(pExpr) ){
aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff);
}else if( aff==0 ){
aff = SQLITE_AFF_BLOB;
@@ -101634,7 +106727,7 @@ static int codeCompare(
** But a TK_SELECT might be either a vector or a scalar. It is only
** considered a vector if it has two or more result columns.
*/
-SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr){
+SQLITE_PRIVATE int sqlite3ExprIsVector(const Expr *pExpr){
return sqlite3ExprVectorSize(pExpr)>1;
}
@@ -101644,12 +106737,14 @@ SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr){
** is a sub-select, return the number of columns in the sub-select. For
** any other type of expression, return 1.
*/
-SQLITE_PRIVATE int sqlite3ExprVectorSize(Expr *pExpr){
+SQLITE_PRIVATE int sqlite3ExprVectorSize(const Expr *pExpr){
u8 op = pExpr->op;
if( op==TK_REGISTER ) op = pExpr->op2;
if( op==TK_VECTOR ){
+ assert( ExprUseXList(pExpr) );
return pExpr->x.pList->nExpr;
}else if( op==TK_SELECT ){
+ assert( ExprUseXSelect(pExpr) );
return pExpr->x.pSelect->pEList->nExpr;
}else{
return 1;
@@ -101676,8 +106771,10 @@ SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){
if( sqlite3ExprIsVector(pVector) ){
assert( pVector->op2==0 || pVector->op==TK_REGISTER );
if( pVector->op==TK_SELECT || pVector->op2==TK_SELECT ){
+ assert( ExprUseXSelect(pVector) );
return pVector->x.pSelect->pEList->a[i].pExpr;
}else{
+ assert( ExprUseXList(pVector) );
return pVector->x.pList->a[i].pExpr;
}
}
@@ -101708,11 +106805,12 @@ SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){
SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(
Parse *pParse, /* Parsing context */
Expr *pVector, /* The vector. List of expressions or a sub-SELECT */
- int iField /* Which column of the vector to return */
+ int iField, /* Which column of the vector to return */
+ int nField /* Total number of columns in the vector */
){
Expr *pRet;
if( pVector->op==TK_SELECT ){
- assert( pVector->flags & EP_xIsSelect );
+ assert( ExprUseXSelect(pVector) );
/* The TK_SELECT_COLUMN Expr node:
**
** pLeft: pVector containing TK_SELECT. Not deleted.
@@ -101731,14 +106829,23 @@ SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(
*/
pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0);
if( pRet ){
+ pRet->iTable = nField;
pRet->iColumn = iField;
pRet->pLeft = pVector;
}
- assert( pRet==0 || pRet->iTable==0 );
}else{
- if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr;
+ if( pVector->op==TK_VECTOR ){
+ Expr **ppVector;
+ assert( ExprUseXList(pVector) );
+ ppVector = &pVector->x.pList->a[iField].pExpr;
+ pVector = *ppVector;
+ if( IN_RENAME_OBJECT ){
+ /* This must be a vector UPDATE inside a trigger */
+ *ppVector = 0;
+ return pVector;
+ }
+ }
pRet = sqlite3ExprDup(pParse->db, pVector, 0);
- sqlite3RenameTokenRemap(pParse, pRet, pVector);
}
return pRet;
}
@@ -101794,10 +106901,12 @@ static int exprVectorRegister(
return pVector->iTable+iField;
}
if( op==TK_SELECT ){
+ assert( ExprUseXSelect(pVector) );
*ppExpr = pVector->x.pSelect->pEList->a[iField].pExpr;
return regSelect+iField;
}
if( op==TK_VECTOR ){
+ assert( ExprUseXList(pVector) );
*ppExpr = pVector->x.pList->a[iField].pExpr;
return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree);
}
@@ -101931,14 +107040,14 @@ SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){
** to by pnHeight, the second parameter, then set *pnHeight to that
** value.
*/
-static void heightOfExpr(Expr *p, int *pnHeight){
+static void heightOfExpr(const Expr *p, int *pnHeight){
if( p ){
if( p->nHeight>*pnHeight ){
*pnHeight = p->nHeight;
}
}
}
-static void heightOfExprList(ExprList *p, int *pnHeight){
+static void heightOfExprList(const ExprList *p, int *pnHeight){
if( p ){
int i;
for(i=0; i<p->nExpr; i++){
@@ -101946,8 +107055,8 @@ static void heightOfExprList(ExprList *p, int *pnHeight){
}
}
}
-static void heightOfSelect(Select *pSelect, int *pnHeight){
- Select *p;
+static void heightOfSelect(const Select *pSelect, int *pnHeight){
+ const Select *p;
for(p=pSelect; p; p=p->pPrior){
heightOfExpr(p->pWhere, pnHeight);
heightOfExpr(p->pHaving, pnHeight);
@@ -101969,10 +107078,11 @@ static void heightOfSelect(Select *pSelect, int *pnHeight){
** if appropriate.
*/
static void exprSetHeight(Expr *p){
- int nHeight = 0;
- heightOfExpr(p->pLeft, &nHeight);
- heightOfExpr(p->pRight, &nHeight);
- if( ExprHasProperty(p, EP_xIsSelect) ){
+ int nHeight = p->pLeft ? p->pLeft->nHeight : 0;
+ if( NEVER(p->pRight) && p->pRight->nHeight>nHeight ){
+ nHeight = p->pRight->nHeight;
+ }
+ if( ExprUseXSelect(p) ){
heightOfSelect(p->x.pSelect, &nHeight);
}else if( p->x.pList ){
heightOfExprList(p->x.pList, &nHeight);
@@ -101999,7 +107109,7 @@ SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){
** Return the maximum height of any expression tree referenced
** by the select statement passed as an argument.
*/
-SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){
+SQLITE_PRIVATE int sqlite3SelectExprHeight(const Select *p){
int nHeight = 0;
heightOfSelect(p, &nHeight);
return nHeight;
@@ -102011,7 +107121,7 @@ SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){
*/
SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){
if( pParse->nErr ) return;
- if( p && p->x.pList && !ExprHasProperty(p, EP_xIsSelect) ){
+ if( p && ExprUseXList(p) && p->x.pList ){
p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList);
}
}
@@ -102114,15 +107224,26 @@ SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(
sqlite3ExprDelete(db, pLeft);
sqlite3ExprDelete(db, pRight);
}else{
+ assert( ExprUseXList(pRoot) );
+ assert( pRoot->x.pSelect==0 );
if( pRight ){
pRoot->pRight = pRight;
pRoot->flags |= EP_Propagate & pRight->flags;
+#if SQLITE_MAX_EXPR_DEPTH>0
+ pRoot->nHeight = pRight->nHeight+1;
+ }else{
+ pRoot->nHeight = 1;
+#endif
}
if( pLeft ){
pRoot->pLeft = pLeft;
pRoot->flags |= EP_Propagate & pLeft->flags;
+#if SQLITE_MAX_EXPR_DEPTH>0
+ if( pLeft->nHeight>=pRoot->nHeight ){
+ pRoot->nHeight = pLeft->nHeight+1;
+ }
+#endif
}
- exprSetHeight(pRoot);
}
}
@@ -102169,14 +107290,71 @@ SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pS
}
}
+/*
+** Expression list pEList is a list of vector values. This function
+** converts the contents of pEList to a VALUES(...) Select statement
+** returning 1 row for each element of the list. For example, the
+** expression list:
+**
+** ( (1,2), (3,4) (5,6) )
+**
+** is translated to the equivalent of:
+**
+** VALUES(1,2), (3,4), (5,6)
+**
+** Each of the vector values in pEList must contain exactly nElem terms.
+** If a list element that is not a vector or does not contain nElem terms,
+** an error message is left in pParse.
+**
+** This is used as part of processing IN(...) expressions with a list
+** of vectors on the RHS. e.g. "... IN ((1,2), (3,4), (5,6))".
+*/
+SQLITE_PRIVATE Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprList *pEList){
+ int ii;
+ Select *pRet = 0;
+ assert( nElem>1 );
+ for(ii=0; ii<pEList->nExpr; ii++){
+ Select *pSel;
+ Expr *pExpr = pEList->a[ii].pExpr;
+ int nExprElem;
+ if( pExpr->op==TK_VECTOR ){
+ assert( ExprUseXList(pExpr) );
+ nExprElem = pExpr->x.pList->nExpr;
+ }else{
+ nExprElem = 1;
+ }
+ if( nExprElem!=nElem ){
+ sqlite3ErrorMsg(pParse, "IN(...) element has %d term%s - expected %d",
+ nExprElem, nExprElem>1?"s":"", nElem
+ );
+ break;
+ }
+ assert( ExprUseXList(pExpr) );
+ pSel = sqlite3SelectNew(pParse, pExpr->x.pList, 0, 0, 0, 0, 0, SF_Values,0);
+ pExpr->x.pList = 0;
+ if( pSel ){
+ if( pRet ){
+ pSel->op = TK_ALL;
+ pSel->pPrior = pRet;
+ }
+ pRet = pSel;
+ }
+ }
+
+ if( pRet && pRet->pPrior ){
+ pRet->selFlags |= SF_MultiValue;
+ }
+ sqlite3ExprListDelete(pParse->db, pEList);
+ return pRet;
+}
/*
** Join two expressions using an AND operator. If either expression is
** NULL, then just return the other expression.
**
-** If one side or the other of the AND is known to be false, then instead
-** of returning an AND expression, just return a constant expression with
-** a value of false.
+** If one side or the other of the AND is known to be false, and neither side
+** is part of an ON clause, then instead of returning an AND expression,
+** just return a constant expression with a value of false.
*/
SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){
sqlite3 *db = pParse->db;
@@ -102184,14 +107362,17 @@ SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){
return pRight;
}else if( pRight==0 ){
return pLeft;
- }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight))
- && !IN_RENAME_OBJECT
- ){
- sqlite3ExprDeferredDelete(pParse, pLeft);
- sqlite3ExprDeferredDelete(pParse, pRight);
- return sqlite3Expr(db, TK_INTEGER, "0");
}else{
- return sqlite3PExpr(pParse, TK_AND, pLeft, pRight);
+ u32 f = pLeft->flags | pRight->flags;
+ if( (f&(EP_OuterON|EP_InnerON|EP_IsFalse))==EP_IsFalse
+ && !IN_RENAME_OBJECT
+ ){
+ sqlite3ExprDeferredDelete(pParse, pLeft);
+ sqlite3ExprDeferredDelete(pParse, pRight);
+ return sqlite3Expr(db, TK_INTEGER, "0");
+ }else{
+ return sqlite3PExpr(pParse, TK_AND, pLeft, pRight);
+ }
}
}
@@ -102202,7 +107383,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){
SQLITE_PRIVATE Expr *sqlite3ExprFunction(
Parse *pParse, /* Parsing context */
ExprList *pList, /* Argument list */
- Token *pToken, /* Name of the function */
+ const Token *pToken, /* Name of the function */
int eDistinct /* SF_Distinct or SF_ALL or 0 */
){
Expr *pNew;
@@ -102213,12 +107394,17 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction(
sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */
return 0;
}
- if( pList && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
+ assert( !ExprHasProperty(pNew, EP_InnerON|EP_OuterON) );
+ pNew->w.iOfst = (int)(pToken->z - pParse->zTail);
+ if( pList
+ && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG]
+ && !pParse->nested
+ ){
sqlite3ErrorMsg(pParse, "too many arguments on function %T", pToken);
}
pNew->x.pList = pList;
ExprSetProperty(pNew, EP_HasFunc);
- assert( !ExprHasProperty(pNew, EP_xIsSelect) );
+ assert( ExprUseXList(pNew) );
sqlite3ExprSetHeightAndFlags(pParse, pNew);
if( eDistinct==SF_Distinct ) ExprSetProperty(pNew, EP_Distinct);
return pNew;
@@ -102237,8 +107423,8 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction(
*/
SQLITE_PRIVATE void sqlite3ExprFunctionUsable(
Parse *pParse, /* Parsing and code generating context */
- Expr *pExpr, /* The function invocation */
- FuncDef *pDef /* The function being invoked */
+ const Expr *pExpr, /* The function invocation */
+ const FuncDef *pDef /* The function being invoked */
){
assert( !IN_RENAME_OBJECT );
assert( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 );
@@ -102253,7 +107439,7 @@ SQLITE_PRIVATE void sqlite3ExprFunctionUsable(
** SQLITE_DBCONFIG_TRUSTED_SCHEMA is off (meaning
** that the schema is possibly tainted).
*/
- sqlite3ErrorMsg(pParse, "unsafe use of %s()", pDef->zName);
+ sqlite3ErrorMsg(pParse, "unsafe use of %#T()", pExpr);
}
}
}
@@ -102309,6 +107495,7 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n
if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d",
db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]);
+ sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr);
return;
}
x = (ynVar)i;
@@ -102336,6 +107523,7 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n
pExpr->iColumn = x;
if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
sqlite3ErrorMsg(pParse, "too many SQL variables");
+ sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr);
}
}
@@ -102344,27 +107532,27 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n
*/
static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
assert( p!=0 );
- /* Sanity check: Assert that the IntValue is non-negative if it exists */
- assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 );
-
- assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed );
- assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced)
- || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) );
+ assert( db!=0 );
+ assert( !ExprUseUValue(p) || p->u.iValue>=0 );
+ assert( !ExprUseYWin(p) || !ExprUseYSub(p) );
+ assert( !ExprUseYWin(p) || p->y.pWin!=0 || db->mallocFailed );
+ assert( p->op!=TK_FUNCTION || !ExprUseYSub(p) );
#ifdef SQLITE_DEBUG
if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){
assert( p->pLeft==0 );
assert( p->pRight==0 );
- assert( p->x.pSelect==0 );
+ assert( !ExprUseXSelect(p) || p->x.pSelect==0 );
+ assert( !ExprUseXList(p) || p->x.pList==0 );
}
#endif
if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){
/* The Expr.x union is never used at the same time as Expr.pRight */
- assert( p->x.pList==0 || p->pRight==0 );
+ assert( (ExprUseXList(p) && p->x.pList==0) || p->pRight==0 );
if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft);
if( p->pRight ){
assert( !ExprHasProperty(p, EP_WinFunc) );
sqlite3ExprDeleteNN(db, p->pRight);
- }else if( ExprHasProperty(p, EP_xIsSelect) ){
+ }else if( ExprUseXSelect(p) ){
assert( !ExprHasProperty(p, EP_WinFunc) );
sqlite3SelectDelete(db, p->x.pSelect);
}else{
@@ -102376,15 +107564,26 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
#endif
}
}
- if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken);
if( !ExprHasProperty(p, EP_Static) ){
- sqlite3DbFreeNN(db, p);
+ sqlite3DbNNFreeNN(db, p);
}
}
SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){
if( p ) sqlite3ExprDeleteNN(db, p);
}
+/*
+** Clear both elements of an OnOrUsing object
+*/
+SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3 *db, OnOrUsing *p){
+ if( p==0 ){
+ /* Nothing to clear */
+ }else if( p->pOn ){
+ sqlite3ExprDeleteNN(db, p->pOn);
+ }else if( p->pUsing ){
+ sqlite3IdListDelete(db, p->pUsing);
+ }
+}
/*
** Arrange to cause pExpr to be deleted when the pParse is deleted.
@@ -102397,8 +107596,9 @@ SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){
** pExpr to the pParse->pConstExpr list with a register number of 0.
*/
SQLITE_PRIVATE void sqlite3ExprDeferredDelete(Parse *pParse, Expr *pExpr){
- pParse->pConstExpr =
- sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr);
+ sqlite3ParserAddCleanup(pParse,
+ (void(*)(sqlite3*,void*))sqlite3ExprDelete,
+ pExpr);
}
/* Invoke sqlite3RenameExprUnmap() and sqlite3ExprDelete() on the
@@ -102418,7 +107618,7 @@ SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse *pParse, Expr *p){
** passed as the first argument. This is always one of EXPR_FULLSIZE,
** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE.
*/
-static int exprStructSize(Expr *p){
+static int exprStructSize(const Expr *p){
if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE;
if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE;
return EXPR_FULLSIZE;
@@ -102458,7 +107658,7 @@ static int exprStructSize(Expr *p){
** of dupedExprStructSize() contain multiple assert() statements that attempt
** to enforce this constraint.
*/
-static int dupedExprStructSize(Expr *p, int flags){
+static int dupedExprStructSize(const Expr *p, int flags){
int nSize;
assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
assert( EXPR_FULLSIZE<=0xfff );
@@ -102471,8 +107671,7 @@ static int dupedExprStructSize(Expr *p, int flags){
nSize = EXPR_FULLSIZE;
}else{
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
- assert( !ExprHasProperty(p, EP_FromJoin) );
- assert( !ExprHasProperty(p, EP_MemToken) );
+ assert( !ExprHasProperty(p, EP_OuterON) );
assert( !ExprHasVVAProperty(p, EP_NoReduce) );
if( p->pLeft || p->x.pList ){
nSize = EXPR_REDUCEDSIZE | EP_Reduced;
@@ -102489,7 +107688,7 @@ static int dupedExprStructSize(Expr *p, int flags){
** of the Expr structure and a copy of the Expr.u.zToken string (if that
** string is defined.)
*/
-static int dupedExprNodeSize(Expr *p, int flags){
+static int dupedExprNodeSize(const Expr *p, int flags){
int nByte = dupedExprStructSize(p, flags) & 0xfff;
if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
nByte += sqlite3Strlen30NN(p->u.zToken)+1;
@@ -102510,7 +107709,7 @@ static int dupedExprNodeSize(Expr *p, int flags){
** and Expr.pRight variables (but not for any structures pointed to or
** descended from the Expr.x.pList or Expr.x.pSelect variables).
*/
-static int dupedExprSize(Expr *p, int flags){
+static int dupedExprSize(const Expr *p, int flags){
int nByte = 0;
if( p ){
nByte = dupedExprNodeSize(p, flags);
@@ -102529,7 +107728,7 @@ static int dupedExprSize(Expr *p, int flags){
** if any. Before returning, *pzBuffer is set to the first byte past the
** portion of the buffer copied into by this function.
*/
-static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
+static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){
Expr *pNew; /* Value to return */
u8 *zAlloc; /* Memory space from which to build Expr object */
u32 staticFlag; /* EP_Static if space not obtained from malloc */
@@ -102576,7 +107775,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
}
/* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */
- pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken);
+ pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static);
pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly);
pNew->flags |= staticFlag;
ExprClearVVAProperties(pNew);
@@ -102592,7 +107791,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_Leaf)) ){
/* Fill in the pNew->x.pSelect or pNew->x.pList member. */
- if( ExprHasProperty(p, EP_xIsSelect) ){
+ if( ExprUseXSelect(p) ){
pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags);
}else{
pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, dupFlags);
@@ -102621,7 +107820,6 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){
if( pNew->op==TK_SELECT_COLUMN ){
pNew->pLeft = p->pLeft;
- assert( p->iColumn==0 || p->pRight==0 );
assert( p->pRight==0 || p->pRight==p->pLeft
|| ExprHasProperty(p->pLeft, EP_Subquery) );
}else{
@@ -102652,6 +107850,7 @@ SQLITE_PRIVATE With *sqlite3WithDup(sqlite3 *db, With *p){
pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0);
pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0);
pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName);
+ pRet->a[i].eM10d = p->a[i].eM10d;
}
}
}
@@ -102711,15 +107910,17 @@ static void gatherSelectWindows(Select *p){
** truncated version of the usual Expr structure that will be stored as
** part of the in-memory representation of the database schema.
*/
-SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){
+SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, const Expr *p, int flags){
assert( flags==0 || flags==EXPRDUP_REDUCE );
return p ? exprDup(db, p, flags, 0) : 0;
}
-SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){
+SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int flags){
ExprList *pNew;
- struct ExprList_item *pItem, *pOldItem;
+ struct ExprList_item *pItem;
+ const struct ExprList_item *pOldItem;
int i;
- Expr *pPriorSelectCol = 0;
+ Expr *pPriorSelectColOld = 0;
+ Expr *pPriorSelectColNew = 0;
assert( db!=0 );
if( p==0 ) return 0;
pNew = sqlite3DbMallocRawNN(db, sqlite3DbMallocSize(db, p));
@@ -102736,25 +107937,22 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags)
&& pOldExpr->op==TK_SELECT_COLUMN
&& (pNewExpr = pItem->pExpr)!=0
){
- assert( pNewExpr->iColumn==0 || i>0 );
- if( pNewExpr->iColumn==0 ){
- assert( pOldExpr->pLeft==pOldExpr->pRight
- || ExprHasProperty(pOldExpr->pLeft, EP_Subquery) );
- pPriorSelectCol = pNewExpr->pLeft = pNewExpr->pRight;
+ if( pNewExpr->pRight ){
+ pPriorSelectColOld = pOldExpr->pRight;
+ pPriorSelectColNew = pNewExpr->pRight;
+ pNewExpr->pLeft = pNewExpr->pRight;
}else{
- assert( i>0 );
- assert( pItem[-1].pExpr!=0 );
- assert( pNewExpr->iColumn==pItem[-1].pExpr->iColumn+1 );
- assert( pPriorSelectCol==pItem[-1].pExpr->pLeft );
- pNewExpr->pLeft = pPriorSelectCol;
+ if( pOldExpr->pLeft!=pPriorSelectColOld ){
+ pPriorSelectColOld = pOldExpr->pLeft;
+ pPriorSelectColNew = sqlite3ExprDup(db, pPriorSelectColOld, flags);
+ pNewExpr->pRight = pPriorSelectColNew;
+ }
+ pNewExpr->pLeft = pPriorSelectColNew;
}
}
pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName);
- pItem->sortFlags = pOldItem->sortFlags;
- pItem->eEName = pOldItem->eEName;
- pItem->done = 0;
- pItem->bNulls = pOldItem->bNulls;
- pItem->bSorterRef = pOldItem->bSorterRef;
+ pItem->fg = pOldItem->fg;
+ pItem->fg.done = 0;
pItem->u = pOldItem->u;
}
return pNew;
@@ -102768,7 +107966,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags)
*/
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \
|| !defined(SQLITE_OMIT_SUBQUERY)
-SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){
+SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int flags){
SrcList *pNew;
int i;
int nByte;
@@ -102780,7 +107978,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){
pNew->nSrc = pNew->nAlloc = p->nSrc;
for(i=0; i<p->nSrc; i++){
SrcItem *pNewItem = &pNew->a[i];
- SrcItem *pOldItem = &p->a[i];
+ const SrcItem *pOldItem = &p->a[i];
Table *pTab;
pNewItem->pSchema = pOldItem->pSchema;
pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase);
@@ -102806,41 +108004,39 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){
pTab->nTabRef++;
}
pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags);
- pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags);
- pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing);
+ if( pOldItem->fg.isUsing ){
+ assert( pNewItem->fg.isUsing );
+ pNewItem->u3.pUsing = sqlite3IdListDup(db, pOldItem->u3.pUsing);
+ }else{
+ pNewItem->u3.pOn = sqlite3ExprDup(db, pOldItem->u3.pOn, flags);
+ }
pNewItem->colUsed = pOldItem->colUsed;
}
return pNew;
}
-SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){
+SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, const IdList *p){
IdList *pNew;
int i;
assert( db!=0 );
if( p==0 ) return 0;
- pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) );
+ assert( p->eU4!=EU4_EXPR );
+ pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew)+(p->nId-1)*sizeof(p->a[0]) );
if( pNew==0 ) return 0;
pNew->nId = p->nId;
- pNew->a = sqlite3DbMallocRawNN(db, p->nId*sizeof(p->a[0]) );
- if( pNew->a==0 ){
- sqlite3DbFreeNN(db, pNew);
- return 0;
- }
- /* Note that because the size of the allocation for p->a[] is not
- ** necessarily a power of two, sqlite3IdListAppend() may not be called
- ** on the duplicate created by this function. */
+ pNew->eU4 = p->eU4;
for(i=0; i<p->nId; i++){
struct IdList_item *pNewItem = &pNew->a[i];
- struct IdList_item *pOldItem = &p->a[i];
+ const struct IdList_item *pOldItem = &p->a[i];
pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
- pNewItem->idx = pOldItem->idx;
+ pNewItem->u4 = pOldItem->u4;
}
return pNew;
}
-SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){
+SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *pDup, int flags){
Select *pRet = 0;
Select *pNext = 0;
Select **pp = &pRet;
- Select *p;
+ const Select *p;
assert( db!=0 );
for(p=pDup; p; p=p->pPrior){
@@ -102885,7 +108081,7 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){
return pRet;
}
#else
-SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){
+SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *p, int flags){
assert( p==0 );
return 0;
}
@@ -103005,11 +108201,9 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(
}
for(i=0; i<pColumns->nId; i++){
- Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i);
+ Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i, pColumns->nId);
assert( pSubExpr!=0 || db->mallocFailed );
- assert( pSubExpr==0 || pSubExpr->iTable==0 );
if( pSubExpr==0 ) continue;
- pSubExpr->iTable = pColumns->nId;
pList = sqlite3ExprListAppend(pParse, pList, pSubExpr);
if( pList ){
assert( pList->nExpr==iFirst+i+1 );
@@ -103058,16 +108252,16 @@ SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int
);
pItem = &p->a[p->nExpr-1];
- assert( pItem->bNulls==0 );
+ assert( pItem->fg.bNulls==0 );
if( iSortOrder==SQLITE_SO_UNDEFINED ){
iSortOrder = SQLITE_SO_ASC;
}
- pItem->sortFlags = (u8)iSortOrder;
+ pItem->fg.sortFlags = (u8)iSortOrder;
if( eNulls!=SQLITE_SO_UNDEFINED ){
- pItem->bNulls = 1;
+ pItem->fg.bNulls = 1;
if( iSortOrder!=eNulls ){
- pItem->sortFlags |= KEYINFO_ORDER_BIGNULL;
+ pItem->fg.sortFlags |= KEYINFO_ORDER_BIGNULL;
}
}
}
@@ -103083,7 +108277,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int
SQLITE_PRIVATE void sqlite3ExprListSetName(
Parse *pParse, /* Parsing context */
ExprList *pList, /* List to which to add the span. */
- Token *pName, /* Name to be added */
+ const Token *pName, /* Name to be added */
int dequote /* True to cause the name to be dequoted */
){
assert( pList!=0 || pParse->db->mallocFailed!=0 );
@@ -103093,7 +108287,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetName(
assert( pList->nExpr>0 );
pItem = &pList->a[pList->nExpr-1];
assert( pItem->zEName==0 );
- assert( pItem->eEName==ENAME_NAME );
+ assert( pItem->fg.eEName==ENAME_NAME );
pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
if( dequote ){
/* If dequote==0, then pName->z does not point to part of a DDL
@@ -103101,7 +108295,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetName(
** to the token-map. */
sqlite3Dequote(pItem->zEName);
if( IN_RENAME_OBJECT ){
- sqlite3RenameTokenMap(pParse, (void*)pItem->zEName, pName);
+ sqlite3RenameTokenMap(pParse, (const void*)pItem->zEName, pName);
}
}
}
@@ -103128,7 +108322,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetSpan(
assert( pList->nExpr>0 );
if( pItem->zEName==0 ){
pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd);
- pItem->eEName = ENAME_SPAN;
+ pItem->fg.eEName = ENAME_SPAN;
}
}
}
@@ -103157,12 +108351,13 @@ static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){
int i = pList->nExpr;
struct ExprList_item *pItem = pList->a;
assert( pList->nExpr>0 );
+ assert( db!=0 );
do{
sqlite3ExprDelete(db, pItem->pExpr);
- sqlite3DbFree(db, pItem->zEName);
+ if( pItem->zEName ) sqlite3DbNNFreeNN(db, pItem->zEName);
pItem++;
}while( --i>0 );
- sqlite3DbFreeNN(db, pList);
+ sqlite3DbNNFreeNN(db, pList);
}
SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){
if( pList ) exprListDeleteNN(db, pList);
@@ -103220,7 +108415,7 @@ SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char *zIn){
SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){
u32 v;
assert( pExpr->op==TK_ID || pExpr->op==TK_STRING );
- if( !ExprHasProperty(pExpr, EP_Quoted)
+ if( !ExprHasProperty(pExpr, EP_Quoted|EP_IntValue)
&& (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0
){
pExpr->op = TK_TRUEFALSE;
@@ -103237,6 +108432,7 @@ SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){
SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){
pExpr = sqlite3ExprSkipCollate((Expr*)pExpr);
assert( pExpr->op==TK_TRUEFALSE );
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0
|| sqlite3StrICmp(pExpr->u.zToken,"false")==0 );
return pExpr->u.zToken[4]==0;
@@ -103299,9 +108495,9 @@ SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){
static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
/* If pWalker->eCode is 2 then any term of the expression that comes from
- ** the ON or USING clauses of a left join disqualifies the expression
+ ** the ON or USING clauses of an outer join disqualifies the expression
** from being considered constant. */
- if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_FromJoin) ){
+ if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_OuterON) ){
pWalker->eCode = 0;
return WRC_Abort;
}
@@ -103420,6 +108616,78 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){
return exprIsConst(p, 3, iCur);
}
+/*
+** Check pExpr to see if it is an constraint on the single data source
+** pSrc = &pSrcList->a[iSrc]. In other words, check to see if pExpr
+** constrains pSrc but does not depend on any other tables or data
+** sources anywhere else in the query. Return true (non-zero) if pExpr
+** is a constraint on pSrc only.
+**
+** This is an optimization. False negatives will perhaps cause slower
+** queries, but false positives will yield incorrect answers. So when in
+** doubt, return 0.
+**
+** To be an single-source constraint, the following must be true:
+**
+** (1) pExpr cannot refer to any table other than pSrc->iCursor.
+**
+** (2) pExpr cannot use subqueries or non-deterministic functions.
+**
+** (3) pSrc cannot be part of the left operand for a RIGHT JOIN.
+** (Is there some way to relax this constraint?)
+**
+** (4) If pSrc is the right operand of a LEFT JOIN, then...
+** (4a) pExpr must come from an ON clause..
+** (4b) and specifically the ON clause associated with the LEFT JOIN.
+**
+** (5) If pSrc is not the right operand of a LEFT JOIN or the left
+** operand of a RIGHT JOIN, then pExpr must be from the WHERE
+** clause, not an ON clause.
+**
+** (6) Either:
+**
+** (6a) pExpr does not originate in an ON or USING clause, or
+**
+** (6b) The ON or USING clause from which pExpr is derived is
+** not to the left of a RIGHT JOIN (or FULL JOIN).
+**
+** Without this restriction, accepting pExpr as a single-table
+** constraint might move the the ON/USING filter expression
+** from the left side of a RIGHT JOIN over to the right side,
+** which leads to incorrect answers. See also restriction (9)
+** on push-down.
+*/
+SQLITE_PRIVATE int sqlite3ExprIsSingleTableConstraint(
+ Expr *pExpr, /* The constraint */
+ const SrcList *pSrcList, /* Complete FROM clause */
+ int iSrc /* Which element of pSrcList to use */
+){
+ const SrcItem *pSrc = &pSrcList->a[iSrc];
+ if( pSrc->fg.jointype & JT_LTORJ ){
+ return 0; /* rule (3) */
+ }
+ if( pSrc->fg.jointype & JT_LEFT ){
+ if( !ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (4a) */
+ if( pExpr->w.iJoin!=pSrc->iCursor ) return 0; /* rule (4b) */
+ }else{
+ if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (5) */
+ }
+ if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) /* (6a) */
+ && (pSrcList->a[0].fg.jointype & JT_LTORJ)!=0 /* Fast pre-test of (6b) */
+ ){
+ int jj;
+ for(jj=0; jj<iSrc; jj++){
+ if( pExpr->w.iJoin==pSrcList->a[jj].iCursor ){
+ if( (pSrcList->a[jj].fg.jointype & JT_LTORJ)!=0 ){
+ return 0; /* restriction (6) */
+ }
+ break;
+ }
+ }
+ }
+ return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */
+}
+
/*
** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy().
@@ -103441,7 +108709,7 @@ static int exprNodeIsConstantOrGroupBy(Walker *pWalker, Expr *pExpr){
}
/* Check if pExpr is a sub-select. If so, consider it variable. */
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
pWalker->eCode = 0;
return WRC_Abort;
}
@@ -103529,7 +108797,7 @@ SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){
** in *pValue. If the expression is not an integer or if it is too big
** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.
*/
-SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){
+SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr *p, int *pValue){
int rc = 0;
if( NEVER(p==0) ) return 0; /* Used to only happen following on OOM */
@@ -103548,9 +108816,9 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){
break;
}
case TK_UMINUS: {
- int v;
+ int v = 0;
if( sqlite3ExprIsInteger(p->pLeft, &v) ){
- assert( v!=(-2147483647-1) );
+ assert( ((unsigned int)v)!=0x80000000 );
*pValue = -v;
rc = 1;
}
@@ -103591,10 +108859,11 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){
case TK_BLOB:
return 0;
case TK_COLUMN:
+ assert( ExprUseYTab(p) );
return ExprHasProperty(p, EP_CanBeNull) ||
p->y.pTab==0 || /* Reference to column of index on expression */
(p->iColumn>=0
- && ALWAYS(p->y.pTab->aCol!=0) /* Defense against OOM problems */
+ && p->y.pTab->aCol!=0 /* Possible due to prior error */
&& p->y.pTab->aCol[p->iColumn].notNull==0);
default:
return 1;
@@ -103658,17 +108927,17 @@ SQLITE_PRIVATE int sqlite3IsRowid(const char *z){
** pX is the RHS of an IN operator. If pX is a SELECT statement
** that can be simplified to a direct table access, then return
** a pointer to the SELECT statement. If pX is not a SELECT statement,
-** or if the SELECT statement needs to be manifested into a transient
+** or if the SELECT statement needs to be materialized into a transient
** table, then return NULL.
*/
#ifndef SQLITE_OMIT_SUBQUERY
-static Select *isCandidateForInOpt(Expr *pX){
+static Select *isCandidateForInOpt(const Expr *pX){
Select *p;
SrcList *pSrc;
ExprList *pEList;
Table *pTab;
int i;
- if( !ExprHasProperty(pX, EP_xIsSelect) ) return 0; /* Not a subquery */
+ if( !ExprUseXSelect(pX) ) return 0; /* Not a subquery */
if( ExprHasProperty(pX, EP_VarSelect) ) return 0; /* Correlated subq */
p = pX->x.pSelect;
if( p->pPrior ) return 0; /* Not a compound SELECT */
@@ -103686,7 +108955,7 @@ static Select *isCandidateForInOpt(Expr *pX){
if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */
pTab = pSrc->a[0].pTab;
assert( pTab!=0 );
- assert( pTab->pSelect==0 ); /* FROM clause is not a view */
+ assert( !IsView(pTab) ); /* FROM clause is not a view */
if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */
pEList = p->pEList;
assert( pEList!=0 );
@@ -103746,7 +109015,7 @@ static int sqlite3InRhsIsConstant(Expr *pIn){
** all members of the RHS set, skipping duplicates.
**
** A cursor is opened on the b-tree object that is the RHS of the IN operator
-** and pX->iTable is set to the index of that cursor.
+** and the *piTab parameter is set to the index of that cursor.
**
** The returned value of this function indicates the b-tree type, as follows:
**
@@ -103766,7 +109035,10 @@ static int sqlite3InRhsIsConstant(Expr *pIn){
** If the RHS of the IN operator is a list or a more complex subquery, then
** an ephemeral table might need to be generated from the RHS and then
** pX->iTable made to point to the ephemeral table instead of an
-** existing table.
+** existing table. In this case, the creation and initialization of the
+** ephmeral table might be put inside of a subroutine, the EP_Subrtn flag
+** will be set on pX and the pX->y.sub fields will be set to show where
+** the subroutine is coded.
**
** The inFlags parameter must contain, at a minimum, one of the bits
** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains
@@ -103827,19 +109099,20 @@ SQLITE_PRIVATE int sqlite3FindInIndex(
){
Select *p; /* SELECT to the right of IN operator */
int eType = 0; /* Type of RHS table. IN_INDEX_* */
- int iTab = pParse->nTab++; /* Cursor of the RHS table */
+ int iTab; /* Cursor of the RHS table */
int mustBeUnique; /* True if RHS must be unique */
Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */
assert( pX->op==TK_IN );
mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0;
+ iTab = pParse->nTab++;
/* If the RHS of this IN(...) operator is a SELECT, and if it matters
** whether or not the SELECT result contains NULL values, check whether
** or not NULL is actually possible (it may not be, for example, due
** to NOT NULL constraints in the schema). If no NULL values are possible,
** set prRhsHasNull to 0 before continuing. */
- if( prRhsHasNull && (pX->flags & EP_xIsSelect) ){
+ if( prRhsHasNull && ExprUseXSelect(pX) ){
int i;
ExprList *pEList = pX->x.pSelect->pEList;
for(i=0; i<pEList->nExpr; i++){
@@ -103940,7 +109213,6 @@ SQLITE_PRIVATE int sqlite3FindInIndex(
CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs);
int j;
- assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr );
for(j=0; j<nExpr; j++){
if( pIdx->aiColumn[j]!=pRhs->iColumn ) continue;
assert( pIdx->azColl[j] );
@@ -103995,9 +109267,11 @@ SQLITE_PRIVATE int sqlite3FindInIndex(
*/
if( eType==0
&& (inFlags & IN_INDEX_NOOP_OK)
- && !ExprHasProperty(pX, EP_xIsSelect)
+ && ExprUseXList(pX)
&& (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2)
){
+ pParse->nTab--; /* Back out the allocation of the unused cursor */
+ iTab = -1; /* Cursor is not allocated */
eType = IN_INDEX_NOOP;
}
@@ -104040,10 +109314,10 @@ SQLITE_PRIVATE int sqlite3FindInIndex(
** It is the responsibility of the caller to ensure that the returned
** string is eventually freed using sqlite3DbFree().
*/
-static char *exprINAffinity(Parse *pParse, Expr *pExpr){
+static char *exprINAffinity(Parse *pParse, const Expr *pExpr){
Expr *pLeft = pExpr->pLeft;
int nVal = sqlite3ExprVectorSize(pLeft);
- Select *pSelect = (pExpr->flags & EP_xIsSelect) ? pExpr->x.pSelect : 0;
+ Select *pSelect = ExprUseXSelect(pExpr) ? pExpr->x.pSelect : 0;
char *zRet;
assert( pExpr->op==TK_IN );
@@ -104093,7 +109367,7 @@ SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpec
*/
SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){
#ifndef SQLITE_OMIT_SUBQUERY
- if( pExpr->flags & EP_xIsSelect ){
+ if( ExprUseXSelect(pExpr) ){
sqlite3SubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, 1);
}else
#endif
@@ -104157,24 +109431,26 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN(
*/
if( ExprHasProperty(pExpr, EP_Subrtn) ){
addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d",
pExpr->x.pSelect->selId));
}
+ assert( ExprUseYSub(pExpr) );
sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn,
pExpr->y.sub.iAddr);
+ assert( iTab!=pExpr->iTable );
sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable);
sqlite3VdbeJumpHere(v, addrOnce);
return;
}
/* Begin coding the subroutine */
+ assert( !ExprUseYWin(pExpr) );
ExprSetProperty(pExpr, EP_Subrtn);
assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) );
pExpr->y.sub.regReturn = ++pParse->nMem;
pExpr->y.sub.iAddr =
- sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1;
- VdbeComment((v, "return address"));
+ sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1;
addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
}
@@ -104189,7 +109465,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN(
pExpr->iTable = iTab;
addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal);
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId));
}else{
VdbeComment((v, "RHS of IN operator"));
@@ -104197,7 +109473,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN(
#endif
pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1);
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
/* Case 1: expr IN (SELECT ...)
**
** Generate code to write the results of the select into the temporary
@@ -104276,6 +109552,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN(
** expression we need to rerun this code each time.
*/
if( addrOnce && !sqlite3ExprIsConstant(pE2) ){
+ sqlite3VdbeChangeToNoop(v, addrOnce-1);
sqlite3VdbeChangeToNoop(v, addrOnce);
ExprClearProperty(pExpr, EP_Subrtn);
addrOnce = 0;
@@ -104293,10 +109570,15 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN(
sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO);
}
if( addrOnce ){
+ sqlite3VdbeAddOp1(v, OP_NullRow, iTab);
sqlite3VdbeJumpHere(v, addrOnce);
/* Subroutine return */
- sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn);
- sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1);
+ assert( ExprUseYSub(pExpr) );
+ assert( sqlite3VdbeGetOp(v,pExpr->y.sub.iAddr-1)->opcode==OP_BeginSubrtn
+ || pParse->nErr );
+ sqlite3VdbeAddOp3(v, OP_Return, pExpr->y.sub.regReturn,
+ pExpr->y.sub.iAddr, 1);
+ VdbeCoverage(v);
sqlite3ClearTempRegCache(pParse);
}
}
@@ -104324,6 +109606,9 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
SelectDest dest; /* How to deal with SELECT result */
int nReg; /* Registers to allocate */
Expr *pLimit; /* New limit expression */
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+ int addrExplain; /* Address of OP_Explain instruction */
+#endif
Vdbe *v = pParse->pVdbe;
assert( v!=0 );
@@ -104331,25 +109616,26 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
testcase( pExpr->op==TK_EXISTS );
testcase( pExpr->op==TK_SELECT );
assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT );
- assert( ExprHasProperty(pExpr, EP_xIsSelect) );
+ assert( ExprUseXSelect(pExpr) );
pSel = pExpr->x.pSelect;
/* If this routine has already been coded, then invoke it as a
** subroutine. */
if( ExprHasProperty(pExpr, EP_Subrtn) ){
ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId));
+ assert( ExprUseYSub(pExpr) );
sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn,
pExpr->y.sub.iAddr);
return pExpr->iTable;
}
/* Begin coding the subroutine */
+ assert( !ExprUseYWin(pExpr) );
+ assert( !ExprHasProperty(pExpr, EP_Reduced|EP_TokenOnly) );
ExprSetProperty(pExpr, EP_Subrtn);
pExpr->y.sub.regReturn = ++pParse->nMem;
pExpr->y.sub.iAddr =
- sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1;
- VdbeComment((v, "return address"));
-
+ sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1;
/* The evaluation of the EXISTS/SELECT must be repeated every time it
** is encountered if any of the following is true:
@@ -104375,8 +109661,9 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
** In both cases, the query is augmented with "LIMIT 1". Any
** preexisting limit is discarded in place of the new LIMIT 1.
*/
- ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d",
+ ExplainQueryPlan2(addrExplain, (pParse, 1, "%sSCALAR SUBQUERY %d",
addrOnce?"":"CORRELATED ", pSel->selId));
+ sqlite3VdbeScanStatusCounters(v, addrExplain, addrExplain, -1);
nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1;
sqlite3SelectDestInit(&dest, 0, pParse->nMem+1);
pParse->nMem += nReg;
@@ -104401,7 +109688,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
pLimit = sqlite3PExpr(pParse, TK_NE,
sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit);
}
- sqlite3ExprDelete(db, pSel->pLimit->pLeft);
+ sqlite3ExprDeferredDelete(pParse, pSel->pLimit->pLeft);
pSel->pLimit->pLeft = pLimit;
}else{
/* If there is no pre-existing limit add a limit of 1 */
@@ -104410,10 +109697,8 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
}
pSel->iLimit = 0;
if( sqlite3Select(pParse, pSel, &dest) ){
- if( pParse->nErr ){
- pExpr->op2 = pExpr->op;
- pExpr->op = TK_ERROR;
- }
+ pExpr->op2 = pExpr->op;
+ pExpr->op = TK_ERROR;
return 0;
}
pExpr->iTable = rReg = dest.iSDParm;
@@ -104421,10 +109706,15 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
if( addrOnce ){
sqlite3VdbeJumpHere(v, addrOnce);
}
+ sqlite3VdbeScanStatusRange(v, addrExplain, addrExplain, -1);
/* Subroutine return */
- sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn);
- sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1);
+ assert( ExprUseYSub(pExpr) );
+ assert( sqlite3VdbeGetOp(v,pExpr->y.sub.iAddr-1)->opcode==OP_BeginSubrtn
+ || pParse->nErr );
+ sqlite3VdbeAddOp3(v, OP_Return, pExpr->y.sub.regReturn,
+ pExpr->y.sub.iAddr, 1);
+ VdbeCoverage(v);
sqlite3ClearTempRegCache(pParse);
return rReg;
}
@@ -104439,7 +109729,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
*/
SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){
int nVector = sqlite3ExprVectorSize(pIn->pLeft);
- if( (pIn->flags & EP_xIsSelect)!=0 && !pParse->db->mallocFailed ){
+ if( ExprUseXSelect(pIn) && !pParse->db->mallocFailed ){
if( nVector!=pIn->x.pSelect->pEList->nExpr ){
sqlite3SubselectError(pParse, pIn->x.pSelect->pEList->nExpr, nVector);
return 1;
@@ -104573,13 +109863,15 @@ static void sqlite3ExprCodeIN(
** This is step (1) in the in-operator.md optimized algorithm.
*/
if( eType==IN_INDEX_NOOP ){
- ExprList *pList = pExpr->x.pList;
- CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
+ ExprList *pList;
+ CollSeq *pColl;
int labelOk = sqlite3VdbeMakeLabel(pParse);
int r2, regToFree;
int regCkNull = 0;
int ii;
- assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
+ assert( ExprUseXList(pExpr) );
+ pList = pExpr->x.pList;
+ pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
if( destIfNull!=destIfFalse ){
regCkNull = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull);
@@ -104627,10 +109919,9 @@ static void sqlite3ExprCodeIN(
}else{
destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse);
}
- if( pParse->nErr ) goto sqlite3ExprCodeIN_finished;
for(i=0; i<nVector; i++){
Expr *p = sqlite3VectorFieldSubexpr(pExpr->pLeft, i);
- if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error;
+ if( pParse->nErr ) goto sqlite3ExprCodeIN_oom_error;
if( sqlite3ExprCanBeNull(p) ){
sqlite3VdbeAddOp2(v, OP_IsNull, rLhs+i, destStep2);
VdbeCoverage(v);
@@ -104768,11 +110059,12 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){
c = sqlite3DecOrHexToI64(z, &value);
if( (c==3 && !negFlag) || (c==2) || (negFlag && value==SMALLEST_INT64)){
#ifdef SQLITE_OMIT_FLOATING_POINT
- sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z);
+ sqlite3ErrorMsg(pParse, "oversized integer: %s%#T", negFlag?"-":"",pExpr);
#else
#ifndef SQLITE_OMIT_HEX_INTEGER
if( sqlite3_strnicmp(z,"0x",2)==0 ){
- sqlite3ErrorMsg(pParse, "hex literal too big: %s%s", negFlag?"-":"",z);
+ sqlite3ErrorMsg(pParse, "hex literal too big: %s%#T",
+ negFlag?"-":"",pExpr);
}else
#endif
{
@@ -104816,12 +110108,14 @@ SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn(
** and store the result in register regOut
*/
SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(
- Parse *pParse,
- Column *pCol,
- int regOut
+ Parse *pParse, /* Parsing context */
+ Table *pTab, /* Table containing the generated column */
+ Column *pCol, /* The generated column */
+ int regOut /* Put the result in this register */
){
int iAddr;
Vdbe *v = pParse->pVdbe;
+ int nErr = pParse->nErr;
assert( v!=0 );
assert( pParse->iSelfTab!=0 );
if( pParse->iSelfTab>0 ){
@@ -104829,11 +110123,12 @@ SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(
}else{
iAddr = 0;
}
- sqlite3ExprCodeCopy(pParse, pCol->pDflt, regOut);
+ sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(pTab,pCol), regOut);
if( pCol->affinity>=SQLITE_AFF_TEXT ){
sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1);
}
if( iAddr ) sqlite3VdbeJumpHere(v, iAddr);
+ if( pParse->nErr>nErr ) pParse->db->errByteOffset = -1;
}
#endif /* SQLITE_OMIT_GENERATED_COLUMNS */
@@ -104849,12 +110144,11 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(
){
Column *pCol;
assert( v!=0 );
- if( pTab==0 ){
- sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut);
- return;
- }
+ assert( pTab!=0 );
+ assert( iCol!=XN_EXPR );
if( iCol<0 || iCol==pTab->iPKey ){
sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut);
+ VdbeComment((v, "%s.rowid", pTab->zName));
}else{
int op;
int x;
@@ -104865,12 +110159,13 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(
}else if( (pCol = &pTab->aCol[iCol])->colFlags & COLFLAG_VIRTUAL ){
Parse *pParse = sqlite3VdbeParser(v);
if( pCol->colFlags & COLFLAG_BUSY ){
- sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pCol->zName);
+ sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"",
+ pCol->zCnName);
}else{
int savedSelfTab = pParse->iSelfTab;
pCol->colFlags |= COLFLAG_BUSY;
pParse->iSelfTab = iTabCur+1;
- sqlite3ExprCodeGeneratedColumn(pParse, pCol, regOut);
+ sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, regOut);
pParse->iSelfTab = savedSelfTab;
pCol->colFlags &= ~COLFLAG_BUSY;
}
@@ -104908,7 +110203,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(
assert( pParse->pVdbe!=0 );
sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg);
if( p5 ){
- VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1);
+ VdbeOp *pOp = sqlite3VdbeGetLastOp(pParse->pVdbe);
if( pOp->opcode==OP_Column ) pOp->p5 = p5;
}
return iReg;
@@ -104963,6 +110258,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){
int i;
iResult = pParse->nMem+1;
pParse->nMem += nResult;
+ assert( ExprUseXList(p) );
for(i=0; i<nResult; i++){
sqlite3ExprCodeFactorable(pParse, p->x.pList->a[i].pExpr, i+iResult);
}
@@ -104976,7 +110272,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){
** so that a subsequent copy will not be merged into this one.
*/
static void setDoNotMergeFlagOnCopy(Vdbe *v){
- if( sqlite3VdbeGetOp(v, -1)->opcode==OP_Copy ){
+ if( sqlite3VdbeGetLastOp(v)->opcode==OP_Copy ){
sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergable */
}
}
@@ -105023,7 +110319,17 @@ static int exprCodeInlineFunction(
caseExpr.x.pList = pFarg;
return sqlite3ExprCodeTarget(pParse, &caseExpr, target);
}
-
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ case INLINEFUNC_sqlite_offset: {
+ Expr *pArg = pFarg->a[0].pExpr;
+ if( pArg->op==TK_COLUMN && pArg->iTable>=0 ){
+ sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target);
+ }else{
+ sqlite3VdbeAddOp2(v, OP_Null, 0, target);
+ }
+ break;
+ }
+#endif
default: {
/* The UNLIKELY() function is a no-op. The result is the value
** of the first argument.
@@ -105037,6 +110343,7 @@ static int exprCodeInlineFunction(
** Test-only SQL functions that are only usable if enabled
** via SQLITE_TESTCTRL_INTERNAL_FUNCTIONS
*/
+#if !defined(SQLITE_UNTESTABLE)
case INLINEFUNC_expr_compare: {
/* Compare two expressions using sqlite3ExprCompare() */
assert( nFarg==2 );
@@ -105070,25 +110377,85 @@ static int exprCodeInlineFunction(
break;
}
-#ifdef SQLITE_DEBUG
case INLINEFUNC_affinity: {
/* The AFFINITY() function evaluates to a string that describes
** the type affinity of the argument. This is used for testing of
** the SQLite type logic.
*/
- const char *azAff[] = { "blob", "text", "numeric", "integer", "real" };
+ const char *azAff[] = { "blob", "text", "numeric", "integer",
+ "real", "flexnum" };
char aff;
assert( nFarg==1 );
aff = sqlite3ExprAffinity(pFarg->a[0].pExpr);
+ assert( aff<=SQLITE_AFF_NONE
+ || (aff>=SQLITE_AFF_BLOB && aff<=SQLITE_AFF_FLEXNUM) );
sqlite3VdbeLoadString(v, target,
(aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]);
break;
}
-#endif
+#endif /* !defined(SQLITE_UNTESTABLE) */
}
return target;
}
+/*
+** Check to see if pExpr is one of the indexed expressions on pParse->pIdxEpr.
+** If it is, then resolve the expression by reading from the index and
+** return the register into which the value has been read. If pExpr is
+** not an indexed expression, then return negative.
+*/
+static SQLITE_NOINLINE int sqlite3IndexedExprLookup(
+ Parse *pParse, /* The parsing context */
+ Expr *pExpr, /* The expression to potentially bypass */
+ int target /* Where to store the result of the expression */
+){
+ IndexedExpr *p;
+ Vdbe *v;
+ for(p=pParse->pIdxEpr; p; p=p->pIENext){
+ u8 exprAff;
+ int iDataCur = p->iDataCur;
+ if( iDataCur<0 ) continue;
+ if( pParse->iSelfTab ){
+ if( p->iDataCur!=pParse->iSelfTab-1 ) continue;
+ iDataCur = -1;
+ }
+ if( sqlite3ExprCompare(0, pExpr, p->pExpr, iDataCur)!=0 ) continue;
+ assert( p->aff>=SQLITE_AFF_BLOB && p->aff<=SQLITE_AFF_NUMERIC );
+ exprAff = sqlite3ExprAffinity(pExpr);
+ if( (exprAff<=SQLITE_AFF_BLOB && p->aff!=SQLITE_AFF_BLOB)
+ || (exprAff==SQLITE_AFF_TEXT && p->aff!=SQLITE_AFF_TEXT)
+ || (exprAff>=SQLITE_AFF_NUMERIC && p->aff!=SQLITE_AFF_NUMERIC)
+ ){
+ /* Affinity mismatch on a generated column */
+ continue;
+ }
+
+ v = pParse->pVdbe;
+ assert( v!=0 );
+ if( p->bMaybeNullRow ){
+ /* If the index is on a NULL row due to an outer join, then we
+ ** cannot extract the value from the index. The value must be
+ ** computed using the original expression. */
+ int addr = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp3(v, OP_IfNullRow, p->iIdxCur, addr+3, target);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp3(v, OP_Column, p->iIdxCur, p->iIdxCol, target);
+ VdbeComment((v, "%s expr-column %d", p->zIdxName, p->iIdxCol));
+ sqlite3VdbeGoto(v, 0);
+ p = pParse->pIdxEpr;
+ pParse->pIdxEpr = 0;
+ sqlite3ExprCode(pParse, pExpr, target);
+ pParse->pIdxEpr = p;
+ sqlite3VdbeJumpHere(v, addr+2);
+ }else{
+ sqlite3VdbeAddOp3(v, OP_Column, p->iIdxCur, p->iIdxCol, target);
+ VdbeComment((v, "%s expr-column %d", p->zIdxName, p->iIdxCol));
+ }
+ return target;
+ }
+ return -1; /* Not found */
+}
+
/*
** Generate code into the current Vdbe to evaluate the given
@@ -105117,6 +110484,11 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
expr_code_doover:
if( pExpr==0 ){
op = TK_NULL;
+ }else if( pParse->pIdxEpr!=0
+ && !ExprHasProperty(pExpr, EP_Leaf)
+ && (r1 = sqlite3IndexedExprLookup(pParse, pExpr, target))>=0
+ ){
+ return r1;
}else{
assert( !ExprHasVVAProperty(pExpr,EP_Immutable) );
op = pExpr->op;
@@ -105126,24 +110498,43 @@ expr_code_doover:
AggInfo *pAggInfo = pExpr->pAggInfo;
struct AggInfo_col *pCol;
assert( pAggInfo!=0 );
- assert( pExpr->iAgg>=0 && pExpr->iAgg<pAggInfo->nColumn );
+ assert( pExpr->iAgg>=0 );
+ if( pExpr->iAgg>=pAggInfo->nColumn ){
+ /* Happens when the left table of a RIGHT JOIN is null and
+ ** is using an expression index */
+ sqlite3VdbeAddOp2(v, OP_Null, 0, target);
+#ifdef SQLITE_VDBE_COVERAGE
+ /* Verify that the OP_Null above is exercised by tests
+ ** tag-20230325-2 */
+ sqlite3VdbeAddOp2(v, OP_NotNull, target, 1);
+ VdbeCoverageNeverTaken(v);
+#endif
+ break;
+ }
pCol = &pAggInfo->aCol[pExpr->iAgg];
if( !pAggInfo->directMode ){
- assert( pCol->iMem>0 );
- return pCol->iMem;
+ return AggInfoColumnReg(pAggInfo, pExpr->iAgg);
}else if( pAggInfo->useSortingIdx ){
Table *pTab = pCol->pTab;
sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab,
pCol->iSorterColumn, target);
- if( pCol->iColumn<0 ){
+ if( pTab==0 ){
+ /* No comment added */
+ }else if( pCol->iColumn<0 ){
VdbeComment((v,"%s.rowid",pTab->zName));
}else{
- VdbeComment((v,"%s.%s",pTab->zName,pTab->aCol[pCol->iColumn].zName));
+ VdbeComment((v,"%s.%s",
+ pTab->zName, pTab->aCol[pCol->iColumn].zCnName));
if( pTab->aCol[pCol->iColumn].affinity==SQLITE_AFF_REAL ){
sqlite3VdbeAddOp1(v, OP_RealAffinity, target);
}
}
return target;
+ }else if( pExpr->y.pTab==0 ){
+ /* This case happens when the argument to an aggregate function
+ ** is rewritten by aggregateConvertIndexedExprRefToColumn() */
+ sqlite3VdbeAddOp3(v, OP_Column, pExpr->iTable, pExpr->iColumn, target);
+ return target;
}
/* Otherwise, fall thru into the TK_COLUMN case */
/* no break */ deliberate_fall_through
@@ -105160,13 +110551,11 @@ expr_code_doover:
*/
int aff;
iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target);
- if( pExpr->y.pTab ){
- aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn);
- }else{
- aff = pExpr->affExpr;
- }
+ assert( ExprUseYTab(pExpr) );
+ assert( pExpr->y.pTab!=0 );
+ aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn);
if( aff>SQLITE_AFF_BLOB ){
- static const char zAff[] = "B\000C\000D\000E";
+ static const char zAff[] = "B\000C\000D\000E\000F";
assert( SQLITE_AFF_BLOB=='A' );
assert( SQLITE_AFF_TEXT=='B' );
sqlite3VdbeAddOp4(v, OP_Affinity, iReg, 1, 0,
@@ -105183,9 +110572,11 @@ expr_code_doover:
** immediately prior to the first column.
*/
Column *pCol;
- Table *pTab = pExpr->y.pTab;
+ Table *pTab;
int iSrc;
int iCol = pExpr->iColumn;
+ assert( ExprUseYTab(pExpr) );
+ pTab = pExpr->y.pTab;
assert( pTab!=0 );
assert( iCol>=XN_ROWID );
assert( iCol<pTab->nCol );
@@ -105199,12 +110590,12 @@ expr_code_doover:
if( pCol->colFlags & COLFLAG_GENERATED ){
if( pCol->colFlags & COLFLAG_BUSY ){
sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"",
- pCol->zName);
+ pCol->zCnName);
return 0;
}
pCol->colFlags |= COLFLAG_BUSY;
if( pCol->colFlags & COLFLAG_NOTAVAIL ){
- sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc);
+ sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, iSrc);
}
pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL);
return iSrc;
@@ -105223,12 +110614,11 @@ expr_code_doover:
iTab = pParse->iSelfTab - 1;
}
}
+ assert( ExprUseYTab(pExpr) );
+ assert( pExpr->y.pTab!=0 );
iReg = sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab,
pExpr->iColumn, iTab, target,
pExpr->op2);
- if( pExpr->y.pTab==0 && pExpr->affExpr==SQLITE_AFF_REAL ){
- sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
- }
return iReg;
}
case TK_INTEGER: {
@@ -105295,11 +110685,9 @@ expr_code_doover:
#ifndef SQLITE_OMIT_CAST
case TK_CAST: {
/* Expressions of the form: CAST(pLeft AS token) */
- inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
- if( inReg!=target ){
- sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target);
- inReg = target;
- }
+ sqlite3ExprCode(pParse, pExpr->pLeft, target);
+ assert( inReg==target );
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
sqlite3VdbeAddOp2(v, OP_Cast, target,
sqlite3AffinityType(pExpr->u.zToken, 0));
return inReg;
@@ -105439,9 +110827,9 @@ expr_code_doover:
|| NEVER(pExpr->iAgg>=pInfo->nFunc)
){
assert( !ExprHasProperty(pExpr, EP_IntValue) );
- sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken);
+ sqlite3ErrorMsg(pParse, "misuse of aggregate: %#T()", pExpr);
}else{
- return pInfo->aFunc[pExpr->iAgg].iMem;
+ return AggInfoFuncReg(pInfo, pExpr->iAgg);
}
break;
}
@@ -105467,8 +110855,8 @@ expr_code_doover:
** multiple times if we know they always give the same result */
return sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1);
}
- assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
assert( !ExprHasProperty(pExpr, EP_TokenOnly) );
+ assert( ExprUseXList(pExpr) );
pFarg = pExpr->x.pList;
nFarg = pFarg ? pFarg->nExpr : 0;
assert( !ExprHasProperty(pExpr, EP_IntValue) );
@@ -105480,7 +110868,7 @@ expr_code_doover:
}
#endif
if( pDef==0 || pDef->xFinalize!=0 ){
- sqlite3ErrorMsg(pParse, "unknown function: %s()", zId);
+ sqlite3ErrorMsg(pParse, "unknown function: %#T()", pExpr);
break;
}
if( pDef->funcFlags & SQLITE_FUNC_INLINE ){
@@ -105556,20 +110944,8 @@ expr_code_doover:
if( !pColl ) pColl = db->pDfltColl;
sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ);
}
-#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
- if( pDef->funcFlags & SQLITE_FUNC_OFFSET ){
- Expr *pArg = pFarg->a[0].pExpr;
- if( pArg->op==TK_COLUMN ){
- sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target);
- }else{
- sqlite3VdbeAddOp2(v, OP_Null, 0, target);
- }
- }else
-#endif
- {
- sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg,
- pDef, pExpr->op2);
- }
+ sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg,
+ pDef, pExpr->op2);
if( nFarg ){
if( constMask==0 ){
sqlite3ReleaseTempRange(pParse, r1, nFarg);
@@ -105587,7 +110963,10 @@ expr_code_doover:
testcase( op==TK_SELECT );
if( pParse->db->mallocFailed ){
return 0;
- }else if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){
+ }else if( op==TK_SELECT
+ && ALWAYS( ExprUseXSelect(pExpr) )
+ && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1
+ ){
sqlite3SubselectError(pParse, nCol, 1);
}else{
return sqlite3CodeSubselect(pParse, pExpr);
@@ -105596,18 +110975,18 @@ expr_code_doover:
}
case TK_SELECT_COLUMN: {
int n;
- if( pExpr->pLeft->iTable==0 ){
- pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft);
+ Expr *pLeft = pExpr->pLeft;
+ if( pLeft->iTable==0 || pParse->withinRJSubrtn > pLeft->op2 ){
+ pLeft->iTable = sqlite3CodeSubselect(pParse, pLeft);
+ pLeft->op2 = pParse->withinRJSubrtn;
}
- assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT
- || pExpr->pLeft->op==TK_ERROR );
- if( pExpr->iTable!=0
- && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft))
- ){
+ assert( pLeft->op==TK_SELECT || pLeft->op==TK_ERROR );
+ n = sqlite3ExprVectorSize(pLeft);
+ if( pExpr->iTable!=n ){
sqlite3ErrorMsg(pParse, "%d columns assigned %d values",
pExpr->iTable, n);
}
- return pExpr->pLeft->iTable + pExpr->iColumn;
+ return pLeft->iTable + pExpr->iColumn;
}
case TK_IN: {
int destIfFalse = sqlite3VdbeMakeLabel(pParse);
@@ -105638,8 +111017,23 @@ expr_code_doover:
exprCodeBetween(pParse, pExpr, target, 0, 0);
return target;
}
+ case TK_COLLATE: {
+ if( !ExprHasProperty(pExpr, EP_Collate) ){
+ /* A TK_COLLATE Expr node without the EP_Collate tag is a so-called
+ ** "SOFT-COLLATE" that is added to constraints that are pushed down
+ ** from outer queries into sub-queries by the push-down optimization.
+ ** Clear subtypes as subtypes may not cross a subquery boundary.
+ */
+ assert( pExpr->pLeft );
+ sqlite3ExprCode(pParse, pExpr->pLeft, target);
+ sqlite3VdbeAddOp1(v, OP_ClrSubtype, target);
+ return target;
+ }else{
+ pExpr = pExpr->pLeft;
+ goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. */
+ }
+ }
case TK_SPAN:
- case TK_COLLATE:
case TK_UPLUS: {
pExpr = pExpr->pLeft;
goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */
@@ -105671,9 +111065,14 @@ expr_code_doover:
** p1==1 -> old.a p1==4 -> new.a
** p1==2 -> old.b p1==5 -> new.b
*/
- Table *pTab = pExpr->y.pTab;
- int iCol = pExpr->iColumn;
- int p1 = pExpr->iTable * (pTab->nCol+1) + 1
+ Table *pTab;
+ int iCol;
+ int p1;
+
+ assert( ExprUseYTab(pExpr) );
+ pTab = pExpr->y.pTab;
+ iCol = pExpr->iColumn;
+ p1 = pExpr->iTable * (pTab->nCol+1) + 1
+ sqlite3TableColumnToStorage(pTab, iCol);
assert( pExpr->iTable==0 || pExpr->iTable==1 );
@@ -105684,7 +111083,7 @@ expr_code_doover:
sqlite3VdbeAddOp2(v, OP_Param, p1, target);
VdbeComment((v, "r[%d]=%s.%s", target,
(pExpr->iTable ? "new" : "old"),
- (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[iCol].zName)
+ (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[iCol].zCnName)
));
#ifndef SQLITE_OMIT_FLOATING_POINT
@@ -105714,16 +111113,34 @@ expr_code_doover:
case TK_IF_NULL_ROW: {
int addrINR;
u8 okConstFactor = pParse->okConstFactor;
- addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable);
- /* Temporarily disable factoring of constant expressions, since
- ** even though expressions may appear to be constant, they are not
- ** really constant because they originate from the right-hand side
- ** of a LEFT JOIN. */
- pParse->okConstFactor = 0;
- inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
+ AggInfo *pAggInfo = pExpr->pAggInfo;
+ if( pAggInfo ){
+ assert( pExpr->iAgg>=0 && pExpr->iAgg<pAggInfo->nColumn );
+ if( !pAggInfo->directMode ){
+ inReg = AggInfoColumnReg(pAggInfo, pExpr->iAgg);
+ break;
+ }
+ if( pExpr->pAggInfo->useSortingIdx ){
+ sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab,
+ pAggInfo->aCol[pExpr->iAgg].iSorterColumn,
+ target);
+ inReg = target;
+ break;
+ }
+ }
+ addrINR = sqlite3VdbeAddOp3(v, OP_IfNullRow, pExpr->iTable, 0, target);
+ /* The OP_IfNullRow opcode above can overwrite the result register with
+ ** NULL. So we have to ensure that the result register is not a value
+ ** that is suppose to be a constant. Two defenses are needed:
+ ** (1) Temporarily disable factoring of constant expressions
+ ** (2) Make sure the computed value really is stored in register
+ ** "target" and not someplace else.
+ */
+ pParse->okConstFactor = 0; /* note (1) above */
+ sqlite3ExprCode(pParse, pExpr->pLeft, target);
+ assert( target==inReg );
pParse->okConstFactor = okConstFactor;
sqlite3VdbeJumpHere(v, addrINR);
- sqlite3VdbeChangeP3(v, addrINR, inReg);
break;
}
@@ -105761,7 +111178,7 @@ expr_code_doover:
Expr *pDel = 0;
sqlite3 *db = pParse->db;
- assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList );
+ assert( ExprUseXList(pExpr) && pExpr->x.pList!=0 );
assert(pExpr->x.pList->nExpr > 0);
pEList = pExpr->x.pList;
aListelem = pEList->a;
@@ -105875,7 +111292,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce(
struct ExprList_item *pItem;
int i;
for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){
- if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){
+ if( pItem->fg.reusable
+ && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0
+ ){
return pItem->u.iConstExprReg;
}
}
@@ -105898,7 +111317,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce(
p = sqlite3ExprListAppend(pParse, p, pExpr);
if( p ){
struct ExprList_item *pItem = &p->a[p->nExpr-1];
- pItem->reusable = regDest<0;
+ pItem->fg.reusable = regDest<0;
if( regDest<0 ) regDest = ++pParse->nMem;
pItem->u.iConstExprReg = regDest;
}
@@ -105958,7 +111377,9 @@ SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){
inReg = sqlite3ExprCodeTarget(pParse, pExpr, target);
if( inReg!=target ){
u8 op;
- if( ExprHasProperty(pExpr,EP_Subquery) ){
+ if( ALWAYS(pExpr)
+ && (ExprHasProperty(pExpr,EP_Subquery) || pExpr->op==TK_REGISTER)
+ ){
op = OP_Copy;
}else{
op = OP_SCopy;
@@ -106032,7 +111453,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList(
for(pItem=pList->a, i=0; i<n; i++, pItem++){
Expr *pExpr = pItem->pExpr;
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
- if( pItem->bSorterRef ){
+ if( pItem->fg.bSorterRef ){
i--;
n--;
}else
@@ -106053,7 +111474,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList(
if( inReg!=target+i ){
VdbeOp *pOp;
if( copyOp==OP_Copy
- && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy
+ && (pOp=sqlite3VdbeGetLastOp(v))->opcode==OP_Copy
&& pOp->p1+pOp->p3+1==inReg
&& pOp->p2+pOp->p3+1==target+i
&& pOp->p5==0 /* The do-not-merge flag must be clear */
@@ -106106,7 +111527,7 @@ static void exprCodeBetween(
memset(&compRight, 0, sizeof(Expr));
memset(&exprAnd, 0, sizeof(Expr));
- assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
+ assert( ExprUseXList(pExpr) );
pDel = sqlite3ExprDup(db, pExpr->pLeft, 0);
if( db->mallocFailed==0 ){
exprAnd.op = TK_AND;
@@ -106126,8 +111547,8 @@ static void exprCodeBetween(
** so that the sqlite3ExprCodeTarget() routine will not attempt to move
** it into the Parse.pConstExpr list. We should use a new bit for this,
** for clarity, but we are out of bits in the Expr.flags field so we
- ** have to reuse the EP_FromJoin bit. Bummer. */
- pDel->flags |= EP_FromJoin;
+ ** have to reuse the EP_OuterON bit. Bummer. */
+ pDel->flags |= EP_OuterON;
sqlite3ExprCodeTarget(pParse, &exprAnd, dest);
}
sqlite3ReleaseTempReg(pParse, regFree1);
@@ -106252,6 +111673,7 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int
assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL );
assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL );
r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
+ sqlite3VdbeTypeofColumn(v, r1);
sqlite3VdbeAddOp2(v, op, r1, dest);
VdbeCoverageIf(v, op==TK_ISNULL);
VdbeCoverageIf(v, op==TK_NOTNULL);
@@ -106426,6 +111848,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int
case TK_ISNULL:
case TK_NOTNULL: {
r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
+ sqlite3VdbeTypeofColumn(v, r1);
sqlite3VdbeAddOp2(v, op, r1, dest);
testcase( op==TK_ISNULL ); VdbeCoverageIf(v, op==TK_ISNULL);
testcase( op==TK_NOTNULL ); VdbeCoverageIf(v, op==TK_NOTNULL);
@@ -106496,7 +111919,11 @@ SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,i
** Otherwise, if the values are not the same or if pExpr is not a simple
** SQL value, zero is returned.
*/
-static int exprCompareVariable(Parse *pParse, Expr *pVar, Expr *pExpr){
+static int exprCompareVariable(
+ const Parse *pParse,
+ const Expr *pVar,
+ const Expr *pExpr
+){
int res = 0;
int iVar;
sqlite3_value *pL, *pR = 0;
@@ -106548,7 +111975,12 @@ static int exprCompareVariable(Parse *pParse, Expr *pVar, Expr *pExpr){
** Argument pParse should normally be NULL. If it is not NULL and pA or
** pB causes a return value of 2.
*/
-SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){
+SQLITE_PRIVATE int sqlite3ExprCompare(
+ const Parse *pParse,
+ const Expr *pA,
+ const Expr *pB,
+ int iTab
+){
u32 combinedFlags;
if( pA==0 || pB==0 ){
return pB==pA ? 0 : 2;
@@ -106570,9 +112002,17 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa
if( pB->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA,pB->pLeft,iTab)<2 ){
return 1;
}
- return 2;
+ if( pA->op==TK_AGG_COLUMN && pB->op==TK_COLUMN
+ && pB->iTable<0 && pA->iTable==iTab
+ ){
+ /* fall through */
+ }else{
+ return 2;
+ }
}
- if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){
+ assert( !ExprHasProperty(pA, EP_IntValue) );
+ assert( !ExprHasProperty(pB, EP_IntValue) );
+ if( pA->u.zToken ){
if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){
if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
#ifndef SQLITE_OMIT_WINDOWFUNC
@@ -106590,7 +112030,12 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa
return 0;
}else if( pA->op==TK_COLLATE ){
if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
- }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
+ }else
+ if( pB->u.zToken!=0
+ && pA->op!=TK_COLUMN
+ && pA->op!=TK_AGG_COLUMN
+ && strcmp(pA->u.zToken,pB->u.zToken)!=0
+ ){
return 2;
}
}
@@ -106632,7 +112077,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTa
** Two NULL pointers are considered to be the same. But a NULL pointer
** always differs from a non-NULL pointer.
*/
-SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){
+SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB, int iTab){
int i;
if( pA==0 && pB==0 ) return 0;
if( pA==0 || pB==0 ) return 1;
@@ -106641,7 +112086,7 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){
int res;
Expr *pExprA = pA->a[i].pExpr;
Expr *pExprB = pB->a[i].pExpr;
- if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1;
+ if( pA->a[i].fg.sortFlags!=pB->a[i].fg.sortFlags ) return 1;
if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res;
}
return 0;
@@ -106651,7 +112096,7 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){
** Like sqlite3ExprCompare() except COLLATE operators at the top-level
** are ignored.
*/
-SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){
+SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA,Expr *pB, int iTab){
return sqlite3ExprCompare(0,
sqlite3ExprSkipCollateAndLikely(pA),
sqlite3ExprSkipCollateAndLikely(pB),
@@ -106665,9 +112110,9 @@ SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){
** non-NULL if pNN is not NULL
*/
static int exprImpliesNotNull(
- Parse *pParse, /* Parsing context */
- Expr *p, /* The expression to be checked */
- Expr *pNN, /* The expression that is NOT NULL */
+ const Parse *pParse,/* Parsing context */
+ const Expr *p, /* The expression to be checked */
+ const Expr *pNN, /* The expression that is NOT NULL */
int iTab, /* Table being evaluated */
int seenNot /* Return true only if p can be any non-NULL value */
){
@@ -106679,12 +112124,13 @@ static int exprImpliesNotNull(
switch( p->op ){
case TK_IN: {
if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0;
- assert( ExprHasProperty(p,EP_xIsSelect)
- || (p->x.pList!=0 && p->x.pList->nExpr>0) );
+ assert( ExprUseXSelect(p) || (p->x.pList!=0 && p->x.pList->nExpr>0) );
return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1);
}
case TK_BETWEEN: {
- ExprList *pList = p->x.pList;
+ ExprList *pList;
+ assert( ExprUseXList(p) );
+ pList = p->x.pList;
assert( pList!=0 );
assert( pList->nExpr==2 );
if( seenNot ) return 0;
@@ -106760,7 +112206,12 @@ static int exprImpliesNotNull(
** improvement. Returning false might cause a performance reduction, but
** it will always give the correct answer and is hence always safe.
*/
-SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, int iTab){
+SQLITE_PRIVATE int sqlite3ExprImpliesExpr(
+ const Parse *pParse,
+ const Expr *pE1,
+ const Expr *pE2,
+ int iTab
+){
if( sqlite3ExprCompare(pParse, pE1, pE2, iTab)==0 ){
return 1;
}
@@ -106790,7 +112241,7 @@ SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, i
static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){
testcase( pExpr->op==TK_AGG_COLUMN );
testcase( pExpr->op==TK_AGG_FUNCTION );
- if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune;
+ if( ExprHasProperty(pExpr, EP_OuterON) ) return WRC_Prune;
switch( pExpr->op ){
case TK_ISNOT:
case TK_ISNULL:
@@ -106856,10 +112307,14 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){
testcase( pExpr->op==TK_GE );
/* The y.pTab=0 assignment in wherecode.c always happens after the
** impliesNotNullRow() test */
- if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0)
- && IsVirtual(pLeft->y.pTab))
- || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0)
- && IsVirtual(pRight->y.pTab))
+ assert( pLeft->op!=TK_COLUMN || ExprUseYTab(pLeft) );
+ assert( pRight->op!=TK_COLUMN || ExprUseYTab(pRight) );
+ if( (pLeft->op==TK_COLUMN
+ && ALWAYS(pLeft->y.pTab!=0)
+ && IsVirtual(pLeft->y.pTab))
+ || (pRight->op==TK_COLUMN
+ && ALWAYS(pRight->y.pTab!=0)
+ && IsVirtual(pRight->y.pTab))
){
return WRC_Prune;
}
@@ -106883,8 +112338,8 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){
** False positives are not allowed, however. A false positive may result
** in an incorrect answer.
**
-** Terms of p that are marked with EP_FromJoin (and hence that come from
-** the ON or USING clauses of LEFT JOINS) are excluded from the analysis.
+** Terms of p that are marked with EP_OuterON (and hence that come from
+** the ON or USING clauses of OUTER JOINS) are excluded from the analysis.
**
** This routine is used to check if a LEFT JOIN can be converted into
** an ordinary JOIN. The p argument is the WHERE clause. If the WHERE
@@ -106968,88 +112423,126 @@ SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(
}
-/*
-** An instance of the following structure is used by the tree walker
-** to count references to table columns in the arguments of an
-** aggregate function, in order to implement the
-** sqlite3FunctionThisSrc() routine.
-*/
-struct SrcCount {
- SrcList *pSrc; /* One particular FROM clause in a nested query */
- int iSrcInner; /* Smallest cursor number in this context */
- int nThis; /* Number of references to columns in pSrcList */
- int nOther; /* Number of references to columns in other FROM clauses */
+/* Structure used to pass information throught the Walker in order to
+** implement sqlite3ReferencesSrcList().
+*/
+struct RefSrcList {
+ sqlite3 *db; /* Database connection used for sqlite3DbRealloc() */
+ SrcList *pRef; /* Looking for references to these tables */
+ i64 nExclude; /* Number of tables to exclude from the search */
+ int *aiExclude; /* Cursor IDs for tables to exclude from the search */
};
/*
-** xSelect callback for sqlite3FunctionUsesThisSrc(). If this is the first
-** SELECT with a FROM clause encountered during this iteration, set
-** SrcCount.iSrcInner to the cursor number of the leftmost object in
-** the FROM cause.
+** Walker SELECT callbacks for sqlite3ReferencesSrcList().
+**
+** When entering a new subquery on the pExpr argument, add all FROM clause
+** entries for that subquery to the exclude list.
+**
+** When leaving the subquery, remove those entries from the exclude list.
*/
-static int selectSrcCount(Walker *pWalker, Select *pSel){
- struct SrcCount *p = pWalker->u.pSrcCount;
- if( p->iSrcInner==0x7FFFFFFF && ALWAYS(pSel->pSrc) && pSel->pSrc->nSrc ){
- pWalker->u.pSrcCount->iSrcInner = pSel->pSrc->a[0].iCursor;
+static int selectRefEnter(Walker *pWalker, Select *pSelect){
+ struct RefSrcList *p = pWalker->u.pRefSrcList;
+ SrcList *pSrc = pSelect->pSrc;
+ i64 i, j;
+ int *piNew;
+ if( pSrc->nSrc==0 ) return WRC_Continue;
+ j = p->nExclude;
+ p->nExclude += pSrc->nSrc;
+ piNew = sqlite3DbRealloc(p->db, p->aiExclude, p->nExclude*sizeof(int));
+ if( piNew==0 ){
+ p->nExclude = 0;
+ return WRC_Abort;
+ }else{
+ p->aiExclude = piNew;
+ }
+ for(i=0; i<pSrc->nSrc; i++, j++){
+ p->aiExclude[j] = pSrc->a[i].iCursor;
}
return WRC_Continue;
}
+static void selectRefLeave(Walker *pWalker, Select *pSelect){
+ struct RefSrcList *p = pWalker->u.pRefSrcList;
+ SrcList *pSrc = pSelect->pSrc;
+ if( p->nExclude ){
+ assert( p->nExclude>=pSrc->nSrc );
+ p->nExclude -= pSrc->nSrc;
+ }
+}
-/*
-** Count the number of references to columns.
+/* This is the Walker EXPR callback for sqlite3ReferencesSrcList().
+**
+** Set the 0x01 bit of pWalker->eCode if there is a reference to any
+** of the tables shown in RefSrcList.pRef.
+**
+** Set the 0x02 bit of pWalker->eCode if there is a reference to a
+** table is in neither RefSrcList.pRef nor RefSrcList.aiExclude.
*/
-static int exprSrcCount(Walker *pWalker, Expr *pExpr){
- /* There was once a NEVER() on the second term on the grounds that
- ** sqlite3FunctionUsesThisSrc() was always called before
- ** sqlite3ExprAnalyzeAggregates() and so the TK_COLUMNs have not yet
- ** been converted into TK_AGG_COLUMN. But this is no longer true due
- ** to window functions - sqlite3WindowRewrite() may now indirectly call
- ** FunctionUsesThisSrc() when creating a new sub-select. */
- if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){
+static int exprRefToSrcList(Walker *pWalker, Expr *pExpr){
+ if( pExpr->op==TK_COLUMN
+ || pExpr->op==TK_AGG_COLUMN
+ ){
int i;
- struct SrcCount *p = pWalker->u.pSrcCount;
- SrcList *pSrc = p->pSrc;
+ struct RefSrcList *p = pWalker->u.pRefSrcList;
+ SrcList *pSrc = p->pRef;
int nSrc = pSrc ? pSrc->nSrc : 0;
for(i=0; i<nSrc; i++){
- if( pExpr->iTable==pSrc->a[i].iCursor ) break;
+ if( pExpr->iTable==pSrc->a[i].iCursor ){
+ pWalker->eCode |= 1;
+ return WRC_Continue;
+ }
}
- if( i<nSrc ){
- p->nThis++;
- }else if( pExpr->iTable<p->iSrcInner ){
- /* In a well-formed parse tree (no name resolution errors),
- ** TK_COLUMN nodes with smaller Expr.iTable values are in an
- ** outer context. Those are the only ones to count as "other" */
- p->nOther++;
+ for(i=0; i<p->nExclude && p->aiExclude[i]!=pExpr->iTable; i++){}
+ if( i>=p->nExclude ){
+ pWalker->eCode |= 2;
}
}
return WRC_Continue;
}
/*
-** Determine if any of the arguments to the pExpr Function reference
-** pSrcList. Return true if they do. Also return true if the function
-** has no arguments or has only constant arguments. Return false if pExpr
-** references columns but not columns of tables found in pSrcList.
+** Check to see if pExpr references any tables in pSrcList.
+** Possible return values:
+**
+** 1 pExpr does references a table in pSrcList.
+**
+** 0 pExpr references some table that is not defined in either
+** pSrcList or in subqueries of pExpr itself.
+**
+** -1 pExpr only references no tables at all, or it only
+** references tables defined in subqueries of pExpr itself.
+**
+** As currently used, pExpr is always an aggregate function call. That
+** fact is exploited for efficiency.
*/
-SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){
+SQLITE_PRIVATE int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList *pSrcList){
Walker w;
- struct SrcCount cnt;
- assert( pExpr->op==TK_AGG_FUNCTION );
+ struct RefSrcList x;
+ assert( pParse->db!=0 );
memset(&w, 0, sizeof(w));
- w.xExprCallback = exprSrcCount;
- w.xSelectCallback = selectSrcCount;
- w.u.pSrcCount = &cnt;
- cnt.pSrc = pSrcList;
- cnt.iSrcInner = (pSrcList&&pSrcList->nSrc)?pSrcList->a[0].iCursor:0x7FFFFFFF;
- cnt.nThis = 0;
- cnt.nOther = 0;
+ memset(&x, 0, sizeof(x));
+ w.xExprCallback = exprRefToSrcList;
+ w.xSelectCallback = selectRefEnter;
+ w.xSelectCallback2 = selectRefLeave;
+ w.u.pRefSrcList = &x;
+ x.db = pParse->db;
+ x.pRef = pSrcList;
+ assert( pExpr->op==TK_AGG_FUNCTION );
+ assert( ExprUseXList(pExpr) );
sqlite3WalkExprList(&w, pExpr->x.pList);
#ifndef SQLITE_OMIT_WINDOWFUNC
if( ExprHasProperty(pExpr, EP_WinFunc) ){
sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter);
}
#endif
- return cnt.nThis>0 || cnt.nOther==0;
+ if( x.aiExclude ) sqlite3DbNNFreeNN(pParse->db, x.aiExclude);
+ if( w.eCode & 0x01 ){
+ return 1;
+ }else if( w.eCode ){
+ return 0;
+ }else{
+ return -1;
+ }
}
/*
@@ -107060,10 +112553,8 @@ SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){
** it does, make a copy. This is done because the pExpr argument is
** subject to change.
**
-** The copy is stored on pParse->pConstExpr with a register number of 0.
-** This will cause the expression to be deleted automatically when the
-** Parse object is destroyed, but the zero register number means that it
-** will not generate any code in the preamble.
+** The copy is scheduled for deletion using the sqlite3ExprDeferredDelete()
+** which builds on the sqlite3ParserAddCleanup() mechanism.
*/
static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){
if( ALWAYS(!ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced))
@@ -107073,10 +112564,11 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){
int iAgg = pExpr->iAgg;
Parse *pParse = pWalker->pParse;
sqlite3 *db = pParse->db;
- assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION );
- if( pExpr->op==TK_AGG_COLUMN ){
- assert( iAgg>=0 && iAgg<pAggInfo->nColumn );
- if( pAggInfo->aCol[iAgg].pCExpr==pExpr ){
+ assert( iAgg>=0 );
+ if( pExpr->op!=TK_AGG_FUNCTION ){
+ if( iAgg<pAggInfo->nColumn
+ && pAggInfo->aCol[iAgg].pCExpr==pExpr
+ ){
pExpr = sqlite3ExprDup(db, pExpr, 0);
if( pExpr ){
pAggInfo->aCol[iAgg].pCExpr = pExpr;
@@ -107084,8 +112576,10 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){
}
}
}else{
- assert( iAgg>=0 && iAgg<pAggInfo->nFunc );
- if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){
+ assert( pExpr->op==TK_AGG_FUNCTION );
+ if( ALWAYS(iAgg<pAggInfo->nFunc)
+ && pAggInfo->aFunc[iAgg].pFExpr==pExpr
+ ){
pExpr = sqlite3ExprDup(db, pExpr, 0);
if( pExpr ){
pAggInfo->aFunc[iAgg].pFExpr = pExpr;
@@ -107141,6 +112635,73 @@ static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){
}
/*
+** Search the AggInfo object for an aCol[] entry that has iTable and iColumn.
+** Return the index in aCol[] of the entry that describes that column.
+**
+** If no prior entry is found, create a new one and return -1. The
+** new column will have an idex of pAggInfo->nColumn-1.
+*/
+static void findOrCreateAggInfoColumn(
+ Parse *pParse, /* Parsing context */
+ AggInfo *pAggInfo, /* The AggInfo object to search and/or modify */
+ Expr *pExpr /* Expr describing the column to find or insert */
+){
+ struct AggInfo_col *pCol;
+ int k;
+
+ assert( pAggInfo->iFirstReg==0 );
+ pCol = pAggInfo->aCol;
+ for(k=0; k<pAggInfo->nColumn; k++, pCol++){
+ if( pCol->iTable==pExpr->iTable
+ && pCol->iColumn==pExpr->iColumn
+ && pExpr->op!=TK_IF_NULL_ROW
+ ){
+ goto fix_up_expr;
+ }
+ }
+ k = addAggInfoColumn(pParse->db, pAggInfo);
+ if( k<0 ){
+ /* OOM on resize */
+ assert( pParse->db->mallocFailed );
+ return;
+ }
+ pCol = &pAggInfo->aCol[k];
+ assert( ExprUseYTab(pExpr) );
+ pCol->pTab = pExpr->y.pTab;
+ pCol->iTable = pExpr->iTable;
+ pCol->iColumn = pExpr->iColumn;
+ pCol->iSorterColumn = -1;
+ pCol->pCExpr = pExpr;
+ if( pAggInfo->pGroupBy && pExpr->op!=TK_IF_NULL_ROW ){
+ int j, n;
+ ExprList *pGB = pAggInfo->pGroupBy;
+ struct ExprList_item *pTerm = pGB->a;
+ n = pGB->nExpr;
+ for(j=0; j<n; j++, pTerm++){
+ Expr *pE = pTerm->pExpr;
+ if( pE->op==TK_COLUMN
+ && pE->iTable==pExpr->iTable
+ && pE->iColumn==pExpr->iColumn
+ ){
+ pCol->iSorterColumn = j;
+ break;
+ }
+ }
+ }
+ if( pCol->iSorterColumn<0 ){
+ pCol->iSorterColumn = pAggInfo->nSortingColumn++;
+ }
+fix_up_expr:
+ ExprSetVVAProperty(pExpr, EP_NoReduce);
+ assert( pExpr->pAggInfo==0 || pExpr->pAggInfo==pAggInfo );
+ pExpr->pAggInfo = pAggInfo;
+ if( pExpr->op==TK_COLUMN ){
+ pExpr->op = TK_AGG_COLUMN;
+ }
+ pExpr->iAgg = (i16)k;
+}
+
+/*
** This is the xExprCallback for a tree walker. It is used to
** implement sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates
** for additional information.
@@ -107153,75 +112714,64 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
AggInfo *pAggInfo = pNC->uNC.pAggInfo;
assert( pNC->ncFlags & NC_UAggInfo );
+ assert( pAggInfo->iFirstReg==0 );
switch( pExpr->op ){
+ default: {
+ IndexedExpr *pIEpr;
+ Expr tmp;
+ assert( pParse->iSelfTab==0 );
+ if( (pNC->ncFlags & NC_InAggFunc)==0 ) break;
+ if( pParse->pIdxEpr==0 ) break;
+ for(pIEpr=pParse->pIdxEpr; pIEpr; pIEpr=pIEpr->pIENext){
+ int iDataCur = pIEpr->iDataCur;
+ if( iDataCur<0 ) continue;
+ if( sqlite3ExprCompare(0, pExpr, pIEpr->pExpr, iDataCur)==0 ) break;
+ }
+ if( pIEpr==0 ) break;
+ if( NEVER(!ExprUseYTab(pExpr)) ) break;
+ for(i=0; i<pSrcList->nSrc; i++){
+ if( pSrcList->a[0].iCursor==pIEpr->iDataCur ) break;
+ }
+ if( i>=pSrcList->nSrc ) break;
+ if( NEVER(pExpr->pAggInfo!=0) ) break; /* Resolved by outer context */
+ if( pParse->nErr ){ return WRC_Abort; }
+
+ /* If we reach this point, it means that expression pExpr can be
+ ** translated into a reference to an index column as described by
+ ** pIEpr.
+ */
+ memset(&tmp, 0, sizeof(tmp));
+ tmp.op = TK_AGG_COLUMN;
+ tmp.iTable = pIEpr->iIdxCur;
+ tmp.iColumn = pIEpr->iIdxCol;
+ findOrCreateAggInfoColumn(pParse, pAggInfo, &tmp);
+ if( pParse->nErr ){ return WRC_Abort; }
+ assert( pAggInfo->aCol!=0 );
+ assert( tmp.iAgg<pAggInfo->nColumn );
+ pAggInfo->aCol[tmp.iAgg].pCExpr = pExpr;
+ pExpr->pAggInfo = pAggInfo;
+ pExpr->iAgg = tmp.iAgg;
+ return WRC_Prune;
+ }
+ case TK_IF_NULL_ROW:
case TK_AGG_COLUMN:
case TK_COLUMN: {
testcase( pExpr->op==TK_AGG_COLUMN );
testcase( pExpr->op==TK_COLUMN );
+ testcase( pExpr->op==TK_IF_NULL_ROW );
/* Check to see if the column is in one of the tables in the FROM
** clause of the aggregate query */
if( ALWAYS(pSrcList!=0) ){
SrcItem *pItem = pSrcList->a;
for(i=0; i<pSrcList->nSrc; i++, pItem++){
- struct AggInfo_col *pCol;
assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) );
if( pExpr->iTable==pItem->iCursor ){
- /* If we reach this point, it means that pExpr refers to a table
- ** that is in the FROM clause of the aggregate query.
- **
- ** Make an entry for the column in pAggInfo->aCol[] if there
- ** is not an entry there already.
- */
- int k;
- pCol = pAggInfo->aCol;
- for(k=0; k<pAggInfo->nColumn; k++, pCol++){
- if( pCol->iTable==pExpr->iTable &&
- pCol->iColumn==pExpr->iColumn ){
- break;
- }
- }
- if( (k>=pAggInfo->nColumn)
- && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0
- ){
- pCol = &pAggInfo->aCol[k];
- pCol->pTab = pExpr->y.pTab;
- pCol->iTable = pExpr->iTable;
- pCol->iColumn = pExpr->iColumn;
- pCol->iMem = ++pParse->nMem;
- pCol->iSorterColumn = -1;
- pCol->pCExpr = pExpr;
- if( pAggInfo->pGroupBy ){
- int j, n;
- ExprList *pGB = pAggInfo->pGroupBy;
- struct ExprList_item *pTerm = pGB->a;
- n = pGB->nExpr;
- for(j=0; j<n; j++, pTerm++){
- Expr *pE = pTerm->pExpr;
- if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable &&
- pE->iColumn==pExpr->iColumn ){
- pCol->iSorterColumn = j;
- break;
- }
- }
- }
- if( pCol->iSorterColumn<0 ){
- pCol->iSorterColumn = pAggInfo->nSortingColumn++;
- }
- }
- /* There is now an entry for pExpr in pAggInfo->aCol[] (either
- ** because it was there before or because we just created it).
- ** Convert the pExpr to be a TK_AGG_COLUMN referring to that
- ** pAggInfo->aCol[] entry.
- */
- ExprSetVVAProperty(pExpr, EP_NoReduce);
- pExpr->pAggInfo = pAggInfo;
- pExpr->op = TK_AGG_COLUMN;
- pExpr->iAgg = (i16)k;
+ findOrCreateAggInfoColumn(pParse, pAggInfo, pExpr);
break;
} /* endif pExpr->iTable==pItem->iCursor */
} /* end loop over pSrcList */
}
- return WRC_Prune;
+ return WRC_Continue;
}
case TK_AGG_FUNCTION: {
if( (pNC->ncFlags & NC_InAggFunc)==0
@@ -107246,8 +112796,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
pItem = &pAggInfo->aFunc[i];
pItem->pFExpr = pExpr;
- pItem->iMem = ++pParse->nMem;
- assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ assert( ExprUseUToken(pExpr) );
pItem->pFunc = sqlite3FindFunction(pParse->db,
pExpr->u.zToken,
pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0);
@@ -107376,6 +112925,37 @@ SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){
}
/*
+** Make sure sufficient registers have been allocated so that
+** iReg is a valid register number.
+*/
+SQLITE_PRIVATE void sqlite3TouchRegister(Parse *pParse, int iReg){
+ if( pParse->nMem<iReg ) pParse->nMem = iReg;
+}
+
+#if defined(SQLITE_ENABLE_STAT4) || defined(SQLITE_DEBUG)
+/*
+** Return the latest reusable register in the set of all registers.
+** The value returned is no less than iMin. If any register iMin or
+** greater is in permanent use, then return one more than that last
+** permanent register.
+*/
+SQLITE_PRIVATE int sqlite3FirstAvailableRegister(Parse *pParse, int iMin){
+ const ExprList *pList = pParse->pConstExpr;
+ if( pList ){
+ int i;
+ for(i=0; i<pList->nExpr; i++){
+ if( pList->a[i].u.iConstExprReg>=iMin ){
+ iMin = pList->a[i].u.iConstExprReg + 1;
+ }
+ }
+ }
+ pParse->nTempReg = 0;
+ pParse->nRangeReg = 0;
+ return iMin;
+}
+#endif /* SQLITE_ENABLE_STAT4 || SQLITE_DEBUG */
+
+/*
** Validate that no temporary register falls within the range of
** iFirst..iLast, inclusive. This routine is only call from within assert()
** statements.
@@ -107394,6 +112974,14 @@ SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){
return 0;
}
}
+ if( pParse->pConstExpr ){
+ ExprList *pList = pParse->pConstExpr;
+ for(i=0; i<pList->nExpr; i++){
+ int iReg = pList->a[i].u.iConstExprReg;
+ if( iReg==0 ) continue;
+ if( iReg>=iFirst && iReg<=iLast ) return 0;
+ }
+ }
return 1;
}
#endif /* SQLITE_DEBUG */
@@ -107462,7 +113050,7 @@ static void renameTestSchema(
pParse->colNamesSet = 1;
sqlite3NestedParse(pParse,
"SELECT 1 "
- "FROM \"%w\"." DFLT_SCHEMA_TABLE " "
+ "FROM \"%w\"." LEGACY_SCHEMA_TABLE " "
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
" AND sql NOT LIKE 'create virtual%%'"
" AND sqlite_rename_test(%Q, sql, type, name, %d, %Q, %d)=NULL ",
@@ -107473,7 +113061,7 @@ static void renameTestSchema(
if( bTemp==0 ){
sqlite3NestedParse(pParse,
"SELECT 1 "
- "FROM temp." DFLT_SCHEMA_TABLE " "
+ "FROM temp." LEGACY_SCHEMA_TABLE " "
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
" AND sql NOT LIKE 'create virtual%%'"
" AND sqlite_rename_test(%Q, sql, type, name, 1, %Q, %d)=NULL ",
@@ -107491,14 +113079,14 @@ static void renameTestSchema(
*/
static void renameFixQuotes(Parse *pParse, const char *zDb, int bTemp){
sqlite3NestedParse(pParse,
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE
" SET sql = sqlite_rename_quotefix(%Q, sql)"
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
" AND sql NOT LIKE 'create virtual%%'" , zDb, zDb
);
if( bTemp==0 ){
sqlite3NestedParse(pParse,
- "UPDATE temp." DFLT_SCHEMA_TABLE
+ "UPDATE temp." LEGACY_SCHEMA_TABLE
" SET sql = sqlite_rename_quotefix('temp', sql)"
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
" AND sql NOT LIKE 'create virtual%%'"
@@ -107537,9 +113125,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
const char *zTabName; /* Original name of the table */
Vdbe *v;
VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */
- u32 savedDbFlags; /* Saved value of db->mDbFlags */
- savedDbFlags = db->mDbFlags;
if( NEVER(db->mallocFailed) ) goto exit_rename_table;
assert( pSrc->nSrc==1 );
assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
@@ -107548,7 +113134,6 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
if( !pTab ) goto exit_rename_table;
iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
zDb = db->aDb[iDb].zDbSName;
- db->mDbFlags |= DBFLAG_PreferBuiltin;
/* Get a NULL terminated version of the new table name. */
zName = sqlite3NameFromToken(db, pName);
@@ -107577,7 +113162,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
}
#ifndef SQLITE_OMIT_VIEW
- if( pTab->pSelect ){
+ if( IsView(pTab) ){
sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName);
goto exit_rename_table;
}
@@ -107619,7 +113204,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
/* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in
** the schema to use the new table name. */
sqlite3NestedParse(pParse,
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET "
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET "
"sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) "
"WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)"
"AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
@@ -107629,7 +113214,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
/* Update the tbl_name and name columns of the sqlite_schema table
** as required. */
sqlite3NestedParse(pParse,
- "UPDATE %Q." DFLT_SCHEMA_TABLE " SET "
+ "UPDATE %Q." LEGACY_SCHEMA_TABLE " SET "
"tbl_name = %Q, "
"name = CASE "
"WHEN type='table' THEN %Q "
@@ -107689,7 +113274,6 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
exit_rename_table:
sqlite3SrcListDelete(db, pSrc);
sqlite3DbFree(db, zName);
- db->mDbFlags = savedDbFlags;
}
/*
@@ -107730,7 +113314,9 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
int r1; /* Temporary registers */
db = pParse->db;
- if( pParse->nErr || db->mallocFailed ) return;
+ assert( db->pParse==pParse );
+ if( pParse->nErr ) return;
+ assert( db->mallocFailed==0 );
pNew = pParse->pNewTable;
assert( pNew );
@@ -107739,7 +113325,7 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
zDb = db->aDb[iDb].zDbSName;
zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */
pCol = &pNew->aCol[pNew->nCol-1];
- pDflt = pCol->pDflt;
+ pDflt = sqlite3ColumnExpr(pNew, pCol);
pTab = sqlite3FindTable(db, zTab, zDb);
assert( pTab );
@@ -107773,7 +113359,8 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
if( pDflt && pDflt->pLeft->op==TK_NULL ){
pDflt = 0;
}
- if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){
+ assert( IsOrdinaryTable(pNew) );
+ if( (db->flags&SQLITE_ForeignKeys) && pNew->u.tab.pFKey && pDflt ){
sqlite3ErrorIfNotEmpty(pParse, zDb, zTab,
"Cannot add a REFERENCES column with non-NULL default value");
}
@@ -107810,31 +113397,30 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n);
if( zCol ){
char *zEnd = &zCol[pColDef->n-1];
- u32 savedDbFlags = db->mDbFlags;
while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){
*zEnd-- = '\0';
}
- db->mDbFlags |= DBFLAG_PreferBuiltin;
/* substr() operations on characters, but addColOffset is in bytes. So we
** have to use printf() to translate between these units: */
+ assert( IsOrdinaryTable(pTab) );
+ assert( IsOrdinaryTable(pNew) );
sqlite3NestedParse(pParse,
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET "
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET "
"sql = printf('%%.%ds, ',sql) || %Q"
" || substr(sql,1+length(printf('%%.%ds',sql))) "
"WHERE type = 'table' AND name = %Q",
- zDb, pNew->addColOffset, zCol, pNew->addColOffset,
+ zDb, pNew->u.tab.addColOffset, zCol, pNew->u.tab.addColOffset,
zTab
);
sqlite3DbFree(db, zCol);
- db->mDbFlags = savedDbFlags;
}
- /* Make sure the schema version is at least 3. But do not upgrade
- ** from less than 3 to 4, as that will corrupt any preexisting DESC
- ** index.
- */
v = sqlite3GetVdbe(pParse);
if( v ){
+ /* Make sure the schema version is at least 3. But do not upgrade
+ ** from less than 3 to 4, as that will corrupt any preexisting DESC
+ ** index.
+ */
r1 = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT);
sqlite3VdbeUsesBtree(v, iDb);
@@ -107843,10 +113429,25 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
VdbeCoverage(v);
sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3);
sqlite3ReleaseTempReg(pParse, r1);
- }
- /* Reload the table definition */
- renameReloadSchema(pParse, iDb, INITFLAG_AlterRename);
+ /* Reload the table definition */
+ renameReloadSchema(pParse, iDb, INITFLAG_AlterAdd);
+
+ /* Verify that constraints are still satisfied */
+ if( pNew->pCheck!=0
+ || (pCol->notNull && (pCol->colFlags & COLFLAG_GENERATED)!=0)
+ ){
+ sqlite3NestedParse(pParse,
+ "SELECT CASE WHEN quick_check GLOB 'CHECK*'"
+ " THEN raise(ABORT,'CHECK constraint failed')"
+ " ELSE raise(ABORT,'NOT NULL constraint failed')"
+ " END"
+ " FROM pragma_quick_check(%Q,%Q)"
+ " WHERE quick_check GLOB 'CHECK*' OR quick_check GLOB 'NULL*'",
+ zTab, zDb
+ );
+ }
+ }
}
/*
@@ -107887,7 +113488,7 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
#endif
/* Make sure this is not an attempt to ALTER a view. */
- if( pTab->pSelect ){
+ if( IsView(pTab) ){
sqlite3ErrorMsg(pParse, "Cannot add a column to a view");
goto exit_begin_add_column;
}
@@ -107896,7 +113497,8 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
}
sqlite3MayAbort(pParse);
- assert( pTab->addColOffset>0 );
+ assert( IsOrdinaryTable(pTab) );
+ assert( pTab->u.tab.addColOffset>0 );
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
/* Put a copy of the Table struct in Parse.pNewTable for the
@@ -107923,13 +113525,13 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol);
for(i=0; i<pNew->nCol; i++){
Column *pCol = &pNew->aCol[i];
- pCol->zName = sqlite3DbStrDup(db, pCol->zName);
- pCol->hName = sqlite3StrIHash(pCol->zName);
- pCol->zColl = 0;
- pCol->pDflt = 0;
+ pCol->zCnName = sqlite3DbStrDup(db, pCol->zCnName);
+ pCol->hName = sqlite3StrIHash(pCol->zCnName);
}
+ assert( IsOrdinaryTable(pNew) );
+ pNew->u.tab.pDfltList = sqlite3ExprListDup(db, pTab->u.tab.pDfltList, 0);
pNew->pSchema = db->aDb[iDb].pSchema;
- pNew->addColOffset = pTab->addColOffset;
+ pNew->u.tab.addColOffset = pTab->u.tab.addColOffset;
pNew->nTabRef = 1;
exit_begin_add_column:
@@ -107949,7 +113551,7 @@ exit_begin_add_column:
static int isRealTable(Parse *pParse, Table *pTab, int bDrop){
const char *zType = 0;
#ifndef SQLITE_OMIT_VIEW
- if( pTab->pSelect ){
+ if( IsView(pTab) ){
zType = "view";
}
#endif
@@ -108016,10 +113618,10 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn(
zOld = sqlite3NameFromToken(db, pOld);
if( !zOld ) goto exit_rename_column;
for(iCol=0; iCol<pTab->nCol; iCol++){
- if( 0==sqlite3StrICmp(pTab->aCol[iCol].zName, zOld) ) break;
+ if( 0==sqlite3StrICmp(pTab->aCol[iCol].zCnName, zOld) ) break;
}
if( iCol==pTab->nCol ){
- sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zOld);
+ sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pOld);
goto exit_rename_column;
}
@@ -108037,18 +113639,17 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn(
assert( pNew->n>0 );
bQuote = sqlite3Isquote(pNew->z[0]);
sqlite3NestedParse(pParse,
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET "
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET "
"sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) "
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' "
- " AND (type != 'index' OR tbl_name = %Q)"
- " AND sql NOT LIKE 'create virtual%%'",
+ " AND (type != 'index' OR tbl_name = %Q)",
zDb,
zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1,
pTab->zName
);
sqlite3NestedParse(pParse,
- "UPDATE temp." DFLT_SCHEMA_TABLE " SET "
+ "UPDATE temp." LEGACY_SCHEMA_TABLE " SET "
"sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) "
"WHERE type IN ('trigger', 'view')",
zDb, pTab->zName, iCol, zNew, bQuote
@@ -108083,7 +113684,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn(
** the parse tree.
*/
struct RenameToken {
- void *p; /* Parse tree element created by token t */
+ const void *p; /* Parse tree element created by token t */
Token t; /* The token that created parse tree element p */
RenameToken *pNext; /* Next is a list of all RenameToken objects */
};
@@ -108125,16 +113726,19 @@ struct RenameCtx {
** Technically, as x no longer points into a valid object or to the byte
** following a valid object, it may not be used in comparison operations.
*/
-static void renameTokenCheckAll(Parse *pParse, void *pPtr){
- if( pParse->nErr==0 && pParse->db->mallocFailed==0 ){
- RenameToken *p;
- u8 i = 0;
+static void renameTokenCheckAll(Parse *pParse, const void *pPtr){
+ assert( pParse==pParse->db->pParse );
+ assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 );
+ if( pParse->nErr==0 ){
+ const RenameToken *p;
+ u32 i = 1;
for(p=pParse->pRename; p; p=p->pNext){
if( p->p ){
assert( p->p!=pPtr );
- i += *(u8*)(p->p);
+ i += *(u8*)(p->p) | 1;
}
}
+ assert( i>0 );
}
}
#else
@@ -108153,7 +113757,11 @@ static void renameTokenCheckAll(Parse *pParse, void *pPtr){
** with tail recursion in tokenExpr() routine, for a small performance
** improvement.
*/
-SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){
+SQLITE_PRIVATE const void *sqlite3RenameTokenMap(
+ Parse *pParse,
+ const void *pPtr,
+ const Token *pToken
+){
RenameToken *pNew;
assert( pPtr || pParse->db->mallocFailed );
renameTokenCheckAll(pParse, pPtr);
@@ -108175,7 +113783,7 @@ SQLITE_PRIVATE void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pTo
** with parse tree element pFrom. This function remaps the associated token
** to parse tree element pTo.
*/
-SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse *pParse, void *pTo, void *pFrom){
+SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse *pParse, const void *pTo, const void *pFrom){
RenameToken *p;
renameTokenCheckAll(pParse, pTo);
for(p=pParse->pRename; p; p=p->pNext){
@@ -108191,7 +113799,10 @@ SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse *pParse, void *pTo, void *pFro
*/
static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){
Parse *pParse = pWalker->pParse;
- sqlite3RenameTokenRemap(pParse, 0, (void*)pExpr);
+ sqlite3RenameTokenRemap(pParse, 0, (const void*)pExpr);
+ if( ExprUseYTab(pExpr) ){
+ sqlite3RenameTokenRemap(pParse, 0, (const void*)&pExpr->y.pTab);
+ }
return WRC_Continue;
}
@@ -108221,6 +113832,7 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
if( pCopy ) sqlite3SelectPrep(sNC.pParse, p, &sNC);
+ if( sNC.pParse->db->mallocFailed ) return;
sqlite3WalkSelect(pWalker, p);
sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols);
}
@@ -108235,13 +113847,12 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){
*/
static void unmapColumnIdlistNames(
Parse *pParse,
- IdList *pIdList
+ const IdList *pIdList
){
- if( pIdList ){
- int ii;
- for(ii=0; ii<pIdList->nId; ii++){
- sqlite3RenameTokenRemap(pParse, 0, (void*)pIdList->a[ii].zName);
- }
+ int ii;
+ assert( pIdList!=0 );
+ for(ii=0; ii<pIdList->nId; ii++){
+ sqlite3RenameTokenRemap(pParse, 0, (const void*)pIdList->a[ii].zName);
}
}
@@ -108252,15 +113863,15 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){
Parse *pParse = pWalker->pParse;
int i;
if( pParse->nErr ) return WRC_Abort;
+ testcase( p->selFlags & SF_View );
+ testcase( p->selFlags & SF_CopyCte );
if( p->selFlags & (SF_View|SF_CopyCte) ){
- testcase( p->selFlags & SF_View );
- testcase( p->selFlags & SF_CopyCte );
return WRC_Prune;
}
if( ALWAYS(p->pEList) ){
ExprList *pList = p->pEList;
for(i=0; i<pList->nExpr; i++){
- if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){
+ if( pList->a[i].zEName && pList->a[i].fg.eEName==ENAME_NAME ){
sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName);
}
}
@@ -108269,8 +113880,11 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){
SrcList *pSrc = p->pSrc;
for(i=0; i<pSrc->nSrc; i++){
sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName);
- if( sqlite3WalkExpr(pWalker, pSrc->a[i].pOn) ) return WRC_Abort;
- unmapColumnIdlistNames(pParse, pSrc->a[i].pUsing);
+ if( pSrc->a[i].fg.isUsing==0 ){
+ sqlite3WalkExpr(pWalker, pSrc->a[i].u3.pOn);
+ }else{
+ unmapColumnIdlistNames(pParse, pSrc->a[i].u3.pUsing);
+ }
}
}
@@ -108306,7 +113920,7 @@ SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){
sWalker.xExprCallback = renameUnmapExprCb;
sqlite3WalkExprList(&sWalker, pEList);
for(i=0; i<pEList->nExpr; i++){
- if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){
+ if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) ){
sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName);
}
}
@@ -108337,7 +113951,7 @@ static void renameTokenFree(sqlite3 *db, RenameToken *pToken){
static RenameToken *renameTokenFind(
Parse *pParse,
struct RenameCtx *pCtx,
- void *pPtr
+ const void *pPtr
){
RenameToken **pp;
if( NEVER(pPtr==0) ){
@@ -108391,6 +114005,7 @@ static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){
renameTokenFind(pWalker->pParse, p, (void*)pExpr);
}else if( pExpr->op==TK_COLUMN
&& pExpr->iColumn==p->iCol
+ && ALWAYS(ExprUseYTab(pExpr))
&& p->pTab==pExpr->y.pTab
){
renameTokenFind(pWalker->pParse, p, (void*)pExpr);
@@ -108439,12 +114054,12 @@ static void renameColumnParseError(
const char *zN = (const char*)sqlite3_value_text(pObject);
char *zErr;
- zErr = sqlite3_mprintf("error in %s %s%s%s: %s",
+ zErr = sqlite3MPrintf(pParse->db, "error in %s %s%s%s: %s",
zT, zN, (zWhen[0] ? " " : ""), zWhen,
pParse->zErrMsg
);
sqlite3_result_error(pCtx, zErr, -1);
- sqlite3_free(zErr);
+ sqlite3DbFree(pParse->db, zErr);
}
/*
@@ -108456,18 +114071,18 @@ static void renameColumnParseError(
static void renameColumnElistNames(
Parse *pParse,
RenameCtx *pCtx,
- ExprList *pEList,
+ const ExprList *pEList,
const char *zOld
){
if( pEList ){
int i;
for(i=0; i<pEList->nExpr; i++){
- char *zName = pEList->a[i].zEName;
- if( ALWAYS(pEList->a[i].eEName==ENAME_NAME)
+ const char *zName = pEList->a[i].zEName;
+ if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME)
&& ALWAYS(zName!=0)
&& 0==sqlite3_stricmp(zName, zOld)
){
- renameTokenFind(pParse, pCtx, (void*)zName);
+ renameTokenFind(pParse, pCtx, (const void*)zName);
}
}
}
@@ -108481,15 +114096,15 @@ static void renameColumnElistNames(
static void renameColumnIdlistNames(
Parse *pParse,
RenameCtx *pCtx,
- IdList *pIdList,
+ const IdList *pIdList,
const char *zOld
){
if( pIdList ){
int i;
for(i=0; i<pIdList->nId; i++){
- char *zName = pIdList->a[i].zName;
+ const char *zName = pIdList->a[i].zName;
if( 0==sqlite3_stricmp(zName, zOld) ){
- renameTokenFind(pParse, pCtx, (void*)zName);
+ renameTokenFind(pParse, pCtx, (const void*)zName);
}
}
}
@@ -108508,24 +114123,22 @@ static int renameParseSql(
int bTemp /* True if SQL is from temp schema */
){
int rc;
- char *zErr = 0;
+ sqlite3ParseObjectInit(p, db);
+ if( zSql==0 ){
+ return SQLITE_NOMEM;
+ }
+ if( sqlite3StrNICmp(zSql,"CREATE ",7)!=0 ){
+ return SQLITE_CORRUPT_BKPT;
+ }
db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb);
-
- /* Parse the SQL statement passed as the first argument. If no error
- ** occurs and the parse does not result in a new table, index or
- ** trigger object, the database must be corrupt. */
- memset(p, 0, sizeof(Parse));
p->eParseMode = PARSE_MODE_RENAME;
p->db = db;
p->nQueryLoop = 1;
- rc = zSql ? sqlite3RunParser(p, zSql, &zErr) : SQLITE_NOMEM;
- assert( p->zErrMsg==0 );
- assert( rc!=SQLITE_OK || zErr==0 );
- p->zErrMsg = zErr;
+ rc = sqlite3RunParser(p, zSql);
if( db->mallocFailed ) rc = SQLITE_NOMEM;
if( rc==SQLITE_OK
- && p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0
+ && NEVER(p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0)
){
rc = SQLITE_CORRUPT_BKPT;
}
@@ -108657,6 +114270,19 @@ static int renameEditSql(
}
/*
+** Set all pEList->a[].fg.eEName fields in the expression-list to val.
+*/
+static void renameSetENames(ExprList *pEList, int val){
+ if( pEList ){
+ int i;
+ for(i=0; i<pEList->nExpr; i++){
+ assert( val==ENAME_NAME || pEList->a[i].fg.eEName==ENAME_NAME );
+ pEList->a[i].fg.eEName = val;
+ }
+ }
+}
+
+/*
** Resolve all symbols in the trigger at pParse->pNewTrigger, assuming
** it was read from the schema of database zDb. Return SQLITE_OK if
** successful. Otherwise, return an SQLite error code and leave an error
@@ -108695,26 +114321,45 @@ static int renameResolveTrigger(Parse *pParse){
if( rc==SQLITE_OK && pStep->zTarget ){
SrcList *pSrc = sqlite3TriggerStepSrc(pParse, pStep);
if( pSrc ){
- int i;
- for(i=0; i<pSrc->nSrc && rc==SQLITE_OK; i++){
- SrcItem *p = &pSrc->a[i];
- p->iCursor = pParse->nTab++;
- if( p->pSelect ){
- sqlite3SelectPrep(pParse, p->pSelect, 0);
- sqlite3ExpandSubquery(pParse, p);
- assert( i>0 );
- assert( pStep->pFrom->a[i-1].pSelect );
- sqlite3SelectPrep(pParse, pStep->pFrom->a[i-1].pSelect, 0);
- }else{
- p->pTab = sqlite3LocateTableItem(pParse, 0, p);
- if( p->pTab==0 ){
- rc = SQLITE_ERROR;
- }else{
- p->pTab->nTabRef++;
- rc = sqlite3ViewGetColumnNames(pParse, p->pTab);
+ Select *pSel = sqlite3SelectNew(
+ pParse, pStep->pExprList, pSrc, 0, 0, 0, 0, 0, 0
+ );
+ if( pSel==0 ){
+ pStep->pExprList = 0;
+ pSrc = 0;
+ rc = SQLITE_NOMEM;
+ }else{
+ /* pStep->pExprList contains an expression-list used for an UPDATE
+ ** statement. So the a[].zEName values are the RHS of the
+ ** "<col> = <expr>" clauses of the UPDATE statement. So, before
+ ** running SelectPrep(), change all the eEName values in
+ ** pStep->pExprList to ENAME_SPAN (from their current value of
+ ** ENAME_NAME). This is to prevent any ids in ON() clauses that are
+ ** part of pSrc from being incorrectly resolved against the
+ ** a[].zEName values as if they were column aliases. */
+ renameSetENames(pStep->pExprList, ENAME_SPAN);
+ sqlite3SelectPrep(pParse, pSel, 0);
+ renameSetENames(pStep->pExprList, ENAME_NAME);
+ rc = pParse->nErr ? SQLITE_ERROR : SQLITE_OK;
+ assert( pStep->pExprList==0 || pStep->pExprList==pSel->pEList );
+ assert( pSrc==pSel->pSrc );
+ if( pStep->pExprList ) pSel->pEList = 0;
+ pSel->pSrc = 0;
+ sqlite3SelectDelete(db, pSel);
+ }
+ if( pStep->pFrom ){
+ int i;
+ for(i=0; i<pStep->pFrom->nSrc && rc==SQLITE_OK; i++){
+ SrcItem *p = &pStep->pFrom->a[i];
+ if( p->pSelect ){
+ sqlite3SelectPrep(pParse, p->pSelect, 0);
}
}
}
+
+ if( db->mallocFailed ){
+ rc = SQLITE_NOMEM;
+ }
sNC.pSrcList = pSrc;
if( rc==SQLITE_OK && pStep->pWhere ){
rc = sqlite3ResolveExprNames(&sNC, pStep->pWhere);
@@ -108800,13 +114445,13 @@ static void renameParseCleanup(Parse *pParse){
sqlite3DeleteTrigger(db, pParse->pNewTrigger);
sqlite3DbFree(db, pParse->zErrMsg);
renameTokenFree(db, pParse->pRename);
- sqlite3ParserReset(pParse);
+ sqlite3ParseObjectReset(pParse);
}
/*
** SQL function:
**
-** sqlite_rename_column(zSql, iCol, bQuote, zNew, zTable, zOld)
+** sqlite_rename_column(SQL,TYPE,OBJ,DB,TABLE,COL,NEWNAME,QUOTE,TEMP)
**
** 0. zSql: SQL statement to rewrite
** 1. type: Type of object ("table", "view" etc.)
@@ -108824,7 +114469,8 @@ static void renameParseCleanup(Parse *pParse){
**
** This function is used internally by the ALTER TABLE RENAME COLUMN command.
** It is only accessible to SQL created using sqlite3NestedParse(). It is
-** not reachable from ordinary SQL passed into sqlite3_prepare().
+** not reachable from ordinary SQL passed into sqlite3_prepare() unless the
+** SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test setting is enabled.
*/
static void renameColumnFunc(
sqlite3_context *context,
@@ -108862,7 +114508,7 @@ static void renameColumnFunc(
sqlite3BtreeLeaveAll(db);
return;
}
- zOld = pTab->aCol[iCol].zName;
+ zOld = pTab->aCol[iCol].zCnName;
memset(&sCtx, 0, sizeof(sCtx));
sCtx.iCol = ((iCol==pTab->iPKey) ? -1 : iCol);
@@ -108881,8 +114527,8 @@ static void renameColumnFunc(
sCtx.pTab = pTab;
if( rc!=SQLITE_OK ) goto renameColumnFunc_done;
if( sParse.pNewTable ){
- Select *pSelect = sParse.pNewTable->pSelect;
- if( pSelect ){
+ if( IsView(sParse.pNewTable) ){
+ Select *pSelect = sParse.pNewTable->u.view.pSelect;
pSelect->selFlags &= ~SF_View;
sParse.rc = SQLITE_OK;
sqlite3SelectPrep(&sParse, pSelect, 0);
@@ -108891,16 +114537,15 @@ static void renameColumnFunc(
sqlite3WalkSelect(&sWalker, pSelect);
}
if( rc!=SQLITE_OK ) goto renameColumnFunc_done;
- }else{
+ }else if( IsOrdinaryTable(sParse.pNewTable) ){
/* A regular table */
int bFKOnly = sqlite3_stricmp(zTable, sParse.pNewTable->zName);
FKey *pFKey;
- assert( sParse.pNewTable->pSelect==0 );
sCtx.pTab = sParse.pNewTable;
if( bFKOnly==0 ){
if( iCol<sParse.pNewTable->nCol ){
renameTokenFind(
- &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zName
+ &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zCnName
);
}
if( sCtx.iCol<0 ){
@@ -108915,12 +114560,15 @@ static void renameColumnFunc(
}
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
for(i=0; i<sParse.pNewTable->nCol; i++){
- sqlite3WalkExpr(&sWalker, sParse.pNewTable->aCol[i].pDflt);
+ Expr *pExpr = sqlite3ColumnExpr(sParse.pNewTable,
+ &sParse.pNewTable->aCol[i]);
+ sqlite3WalkExpr(&sWalker, pExpr);
}
#endif
}
- for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ assert( IsOrdinaryTable(sParse.pNewTable) );
+ for(pFKey=sParse.pNewTable->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){
for(i=0; i<pFKey->nCol; i++){
if( bFKOnly==0 && pFKey->aCol[i].iFrom==iCol ){
renameTokenFind(&sParse, &sCtx, (void*)&pFKey->aCol[i]);
@@ -108971,7 +114619,9 @@ static void renameColumnFunc(
renameColumnFunc_done:
if( rc!=SQLITE_OK ){
- if( sParse.zErrMsg ){
+ if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){
+ sqlite3_result_value(context, argv[0]);
+ }else if( sParse.zErrMsg ){
renameColumnParseError(context, "", argv[1], argv[2], &sParse);
}else{
sqlite3_result_error_code(context, rc);
@@ -108991,7 +114641,10 @@ renameColumnFunc_done:
*/
static int renameTableExprCb(Walker *pWalker, Expr *pExpr){
RenameCtx *p = pWalker->u.pRename;
- if( pExpr->op==TK_COLUMN && p->pTab==pExpr->y.pTab ){
+ if( pExpr->op==TK_COLUMN
+ && ALWAYS(ExprUseYTab(pExpr))
+ && p->pTab==pExpr->y.pTab
+ ){
renameTokenFind(pWalker->pParse, p, (void*)&pExpr->y.pTab);
}
return WRC_Continue;
@@ -109086,28 +114739,31 @@ static void renameTableFunc(
if( sParse.pNewTable ){
Table *pTab = sParse.pNewTable;
- if( pTab->pSelect ){
+ if( IsView(pTab) ){
if( isLegacy==0 ){
- Select *pSelect = pTab->pSelect;
+ Select *pSelect = pTab->u.view.pSelect;
NameContext sNC;
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = &sParse;
assert( pSelect->selFlags & SF_View );
pSelect->selFlags &= ~SF_View;
- sqlite3SelectPrep(&sParse, pTab->pSelect, &sNC);
+ sqlite3SelectPrep(&sParse, pTab->u.view.pSelect, &sNC);
if( sParse.nErr ){
rc = sParse.rc;
}else{
- sqlite3WalkSelect(&sWalker, pTab->pSelect);
+ sqlite3WalkSelect(&sWalker, pTab->u.view.pSelect);
}
}
}else{
/* Modify any FK definitions to point to the new table. */
#ifndef SQLITE_OMIT_FOREIGN_KEY
- if( isLegacy==0 || (db->flags & SQLITE_ForeignKeys) ){
+ if( (isLegacy==0 || (db->flags & SQLITE_ForeignKeys))
+ && !IsVirtual(pTab)
+ ){
FKey *pFKey;
- for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ assert( IsOrdinaryTable(pTab) );
+ for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){
if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){
renameTokenFind(&sParse, &sCtx, (void*)pFKey->zTo);
}
@@ -109153,6 +114809,15 @@ static void renameTableFunc(
if( pStep->zTarget && 0==sqlite3_stricmp(pStep->zTarget, zOld) ){
renameTokenFind(&sParse, &sCtx, pStep->zTarget);
}
+ if( pStep->pFrom ){
+ int i;
+ for(i=0; i<pStep->pFrom->nSrc; i++){
+ SrcItem *pItem = &pStep->pFrom->a[i];
+ if( 0==sqlite3_stricmp(pItem->zName, zOld) ){
+ renameTokenFind(&sParse, &sCtx, pItem->zName);
+ }
+ }
+ }
}
}
}
@@ -109164,7 +114829,9 @@ static void renameTableFunc(
rc = renameEditSql(context, &sCtx, zInput, zNew, bQuote);
}
if( rc!=SQLITE_OK ){
- if( sParse.zErrMsg ){
+ if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){
+ sqlite3_result_value(context, argv[3]);
+ }else if( sParse.zErrMsg ){
renameColumnParseError(context, "", argv[1], argv[2], &sParse);
}else{
sqlite3_result_error_code(context, rc);
@@ -109184,15 +114851,15 @@ static void renameTableFunc(
static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){
if( pExpr->op==TK_STRING && (pExpr->flags & EP_DblQuoted) ){
- renameTokenFind(pWalker->pParse, pWalker->u.pRename, (void*)pExpr);
+ renameTokenFind(pWalker->pParse, pWalker->u.pRename, (const void*)pExpr);
}
return WRC_Continue;
}
-/*
-** The implementation of an SQL scalar function that rewrites DDL statements
-** so that any string literals that use double-quotes are modified so that
-** they use single quotes.
+/* SQL function: sqlite_rename_quotefix(DB,SQL)
+**
+** Rewrite the DDL statement "SQL" so that any string literals that use
+** double-quotes use single quotes instead.
**
** Two arguments must be passed:
**
@@ -109211,6 +114878,10 @@ static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){
** returns the string:
**
** CREATE VIEW v1 AS SELECT "a", 'string' FROM t1
+**
+** If there is a error in the input SQL, then raise an error, except
+** if PRAGMA writable_schema=ON, then just return the input string
+** unmodified following an error.
*/
static void renameQuotefixFunc(
sqlite3_context *context,
@@ -109247,8 +114918,8 @@ static void renameQuotefixFunc(
sWalker.u.pRename = &sCtx;
if( sParse.pNewTable ){
- Select *pSelect = sParse.pNewTable->pSelect;
- if( pSelect ){
+ if( IsView(sParse.pNewTable) ){
+ Select *pSelect = sParse.pNewTable->u.view.pSelect;
pSelect->selFlags &= ~SF_View;
sParse.rc = SQLITE_OK;
sqlite3SelectPrep(&sParse, pSelect, 0);
@@ -109261,7 +114932,9 @@ static void renameQuotefixFunc(
sqlite3WalkExprList(&sWalker, sParse.pNewTable->pCheck);
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
for(i=0; i<sParse.pNewTable->nCol; i++){
- sqlite3WalkExpr(&sWalker, sParse.pNewTable->aCol[i].pDflt);
+ sqlite3WalkExpr(&sWalker,
+ sqlite3ColumnExpr(sParse.pNewTable,
+ &sParse.pNewTable->aCol[i]));
}
#endif /* SQLITE_OMIT_GENERATED_COLUMNS */
}
@@ -109283,7 +114956,11 @@ static void renameQuotefixFunc(
renameTokenFree(db, sCtx.pList);
}
if( rc!=SQLITE_OK ){
- sqlite3_result_error_code(context, rc);
+ if( sqlite3WritableSchema(db) && rc==SQLITE_ERROR ){
+ sqlite3_result_value(context, argv[1]);
+ }else{
+ sqlite3_result_error_code(context, rc);
+ }
}
renameParseCleanup(&sParse);
}
@@ -109295,7 +114972,8 @@ static void renameQuotefixFunc(
sqlite3BtreeLeaveAll(db);
}
-/*
+/* Function: sqlite_rename_test(DB,SQL,TYPE,NAME,ISTEMP,WHEN,DQS)
+**
** An SQL user function that checks that there are no parse or symbol
** resolution problems in a CREATE TRIGGER|TABLE|VIEW|INDEX statement.
** After an ALTER TABLE .. RENAME operation is performed and the schema
@@ -109310,11 +114988,13 @@ static void renameQuotefixFunc(
** 5: "when" part of error message.
** 6: True to disable the DQS quirk when parsing SQL.
**
-** Unless it finds an error, this function normally returns NULL. However, it
-** returns integer value 1 if:
+** The return value is computed as follows:
**
-** * the SQL argument creates a trigger, and
-** * the table that the trigger is attached to is in database zDb.
+** A. If an error is seen and not in PRAGMA writable_schema=ON mode,
+** then raise the error.
+** B. Else if a trigger is created and the the table that the trigger is
+** attached to is in database zDb, then return 1.
+** C. Otherwise return NULL.
*/
static void renameTableTest(
sqlite3_context *context,
@@ -109344,11 +115024,11 @@ static void renameTableTest(
rc = renameParseSql(&sParse, zDb, db, zInput, bTemp);
db->flags |= (flags & (SQLITE_DqsDML|SQLITE_DqsDDL));
if( rc==SQLITE_OK ){
- if( isLegacy==0 && sParse.pNewTable && sParse.pNewTable->pSelect ){
+ if( isLegacy==0 && sParse.pNewTable && IsView(sParse.pNewTable) ){
NameContext sNC;
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = &sParse;
- sqlite3SelectPrep(&sParse, sParse.pNewTable->pSelect, &sNC);
+ sqlite3SelectPrep(&sParse, sParse.pNewTable->u.view.pSelect, &sNC);
if( sParse.nErr ) rc = sParse.rc;
}
@@ -109359,12 +115039,16 @@ static void renameTableTest(
if( rc==SQLITE_OK ){
int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema);
int i2 = sqlite3FindDbName(db, zDb);
- if( i1==i2 ) sqlite3_result_int(context, 1);
+ if( i1==i2 ){
+ /* Handle output case B */
+ sqlite3_result_int(context, 1);
+ }
}
}
}
- if( rc!=SQLITE_OK && zWhen ){
+ if( rc!=SQLITE_OK && zWhen && !sqlite3WritableSchema(db) ){
+ /* Output case A */
renameColumnParseError(context, zWhen, argv[2], argv[3],&sParse);
}
renameParseCleanup(&sParse);
@@ -109419,13 +115103,14 @@ static void dropColumnFunc(
goto drop_column_done;
}
- pCol = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol].zName);
+ pCol = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol].zCnName);
if( iCol<pTab->nCol-1 ){
RenameToken *pEnd;
- pEnd = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol+1].zName);
+ pEnd = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol+1].zCnName);
zEnd = (const char*)pEnd->t.z;
}else{
- zEnd = (const char*)&zSql[pTab->addColOffset];
+ assert( IsOrdinaryTable(pTab) );
+ zEnd = (const char*)&zSql[pTab->u.tab.addColOffset];
while( ALWAYS(pCol->t.z[0]!=0) && pCol->t.z[0]!=',' ) pCol->t.z--;
}
@@ -109451,7 +115136,7 @@ drop_column_done:
** statement. Argument pSrc contains the possibly qualified name of the
** table being edited, and token pName the name of the column to drop.
*/
-SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, Token *pName){
+SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const Token *pName){
sqlite3 *db = pParse->db; /* Database handle */
Table *pTab; /* Table to modify */
int iDb; /* Index of db containing pTab in aDb[] */
@@ -109479,7 +115164,7 @@ SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, Token *
}
iCol = sqlite3ColumnIndex(pTab, zCol);
if( iCol<0 ){
- sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zCol);
+ sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pName);
goto exit_drop_column;
}
@@ -109503,10 +115188,16 @@ SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, Token *
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
assert( iDb>=0 );
zDb = db->aDb[iDb].zDbSName;
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ /* Invoke the authorization callback. */
+ if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, zCol) ){
+ goto exit_drop_column;
+ }
+#endif
renameTestSchema(pParse, zDb, iDb==1, "", 0);
renameFixQuotes(pParse, zDb, iDb==1);
sqlite3NestedParse(pParse,
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET "
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET "
"sql = sqlite_drop_column(%d, sql, %d) "
"WHERE (type=='table' AND tbl_name=%Q COLLATE nocase)"
, zDb, iDb, iCol, pTab->zName
@@ -109561,6 +115252,12 @@ SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, Token *
nField++;
}
}
+ if( nField==0 ){
+ /* dbsqlfuzz 5f09e7bcc78b4954d06bf9f2400d7715f48d1fef */
+ pParse->nMem++;
+ sqlite3VdbeAddOp2(v, OP_Null, 0, reg+1);
+ nField = 1;
+ }
sqlite3VdbeAddOp3(v, OP_MakeRecord, reg+1, nField, regRec);
if( pPk ){
sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iCur, regRec, reg+1, pPk->nKeyCol);
@@ -110030,7 +115727,6 @@ static void statInit(
+ sizeof(tRowcnt)*3*nColUp*(nCol+mxSample);
}
#endif
- db = sqlite3_context_db_handle(context);
p = sqlite3DbMallocZero(db, n);
if( p==0 ){
sqlite3_result_error_nomem(context);
@@ -110445,32 +116141,29 @@ static void statGet(
** * "WHERE a=? AND b=?" matches 2 rows.
**
** If D is the count of distinct values and K is the total number of
- ** rows, then each estimate is computed as:
+ ** rows, then each estimate is usually computed as:
**
** I = (K+D-1)/D
+ **
+ ** In other words, I is K/D rounded up to the next whole integer.
+ ** However, if I is between 1.0 and 1.1 (in other words if I is
+ ** close to 1.0 but just a little larger) then do not round up but
+ ** instead keep the I value at 1.0.
*/
- char *z;
- int i;
-
- char *zRet = sqlite3MallocZero( (p->nKeyCol+1)*25 );
- if( zRet==0 ){
- sqlite3_result_error_nomem(context);
- return;
- }
+ sqlite3_str sStat; /* Text of the constructed "stat" line */
+ int i; /* Loop counter */
- sqlite3_snprintf(24, zRet, "%llu",
+ sqlite3StrAccumInit(&sStat, 0, 0, 0, (p->nKeyCol+1)*100);
+ sqlite3_str_appendf(&sStat, "%llu",
p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow);
- z = zRet + sqlite3Strlen30(zRet);
for(i=0; i<p->nKeyCol; i++){
u64 nDistinct = p->current.anDLt[i] + 1;
u64 iVal = (p->nRow + nDistinct - 1) / nDistinct;
- sqlite3_snprintf(24, z, " %llu", iVal);
- z += sqlite3Strlen30(z);
+ if( iVal==2 && p->nRow*10 <= nDistinct*11 ) iVal = 1;
+ sqlite3_str_appendf(&sStat, " %llu", iVal);
assert( p->current.anEq[i] );
}
- assert( z[0]=='\0' && z>zRet );
-
- sqlite3_result_text(context, zRet, -1, sqlite3_free);
+ sqlite3ResultStrAccum(context, &sStat);
}
#ifdef SQLITE_ENABLE_STAT4
else if( eCall==STAT_GET_ROWID ){
@@ -110489,6 +116182,8 @@ static void statGet(
}
}else{
tRowcnt *aCnt = 0;
+ sqlite3_str sStat;
+ int i;
assert( p->iGet<p->nSample );
switch( eCall ){
@@ -110500,23 +116195,12 @@ static void statGet(
break;
}
}
-
- {
- char *zRet = sqlite3MallocZero(p->nCol * 25);
- if( zRet==0 ){
- sqlite3_result_error_nomem(context);
- }else{
- int i;
- char *z = zRet;
- for(i=0; i<p->nCol; i++){
- sqlite3_snprintf(24, z, "%llu ", (u64)aCnt[i]);
- z += sqlite3Strlen30(z);
- }
- assert( z[0]=='\0' && z>zRet );
- z[-1] = '\0';
- sqlite3_result_text(context, zRet, -1, sqlite3_free);
- }
+ sqlite3StrAccumInit(&sStat, 0, 0, 0, p->nCol*100);
+ for(i=0; i<p->nCol; i++){
+ sqlite3_str_appendf(&sStat, "%llu ", (u64)aCnt[i]);
}
+ if( sStat.nChar ) sStat.nChar--;
+ sqlite3ResultStrAccum(context, &sStat);
}
#endif /* SQLITE_ENABLE_STAT4 */
#ifndef SQLITE_DEBUG
@@ -110563,9 +116247,10 @@ static void analyzeVdbeCommentIndexWithColumnName(
if( NEVER(i==XN_ROWID) ){
VdbeComment((v,"%s.rowid",pIdx->zName));
}else if( i==XN_EXPR ){
+ assert( pIdx->bHasExpr );
VdbeComment((v,"%s.expr(%d)",pIdx->zName, k));
}else{
- VdbeComment((v,"%s.%s", pIdx->zName, pIdx->pTable->aCol[i].zName));
+ VdbeComment((v,"%s.%s", pIdx->zName, pIdx->pTable->aCol[i].zCnName));
}
}
#else
@@ -110603,16 +116288,20 @@ static void analyzeOneTable(
int regIdxname = iMem++; /* Register containing index name */
int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */
int regPrev = iMem; /* MUST BE LAST (see below) */
+#ifdef SQLITE_ENABLE_STAT4
+ int doOnce = 1; /* Flag for a one-time computation */
+#endif
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
Table *pStat1 = 0;
#endif
- pParse->nMem = MAX(pParse->nMem, iMem);
+ sqlite3TouchRegister(pParse, iMem);
+ assert( sqlite3NoTempsInRange(pParse, regNewRowid, iMem) );
v = sqlite3GetVdbe(pParse);
if( v==0 || NEVER(pTab==0) ){
return;
}
- if( pTab->tnum==0 ){
+ if( !IsOrdinaryTable(pTab) ){
/* Do not gather statistics on views or virtual tables */
return;
}
@@ -110639,7 +116328,7 @@ static void analyzeOneTable(
memcpy(pStat1->zName, "sqlite_stat1", 13);
pStat1->nCol = 3;
pStat1->iPKey = -1;
- sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNBLOB);
+ sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNAMIC);
}
#endif
@@ -110713,7 +116402,7 @@ static void analyzeOneTable(
** the regPrev array and a trailing rowid (the rowid slot is required
** when building a record to insert into the sample column of
** the sqlite_stat4 table. */
- pParse->nMem = MAX(pParse->nMem, regPrev+nColTest);
+ sqlite3TouchRegister(pParse, regPrev+nColTest);
/* Open a read-only cursor on the index being analyzed. */
assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) );
@@ -110885,7 +116574,35 @@ static void analyzeOneTable(
int addrIsNull;
u8 seekOp = HasRowid(pTab) ? OP_NotExists : OP_NotFound;
- pParse->nMem = MAX(pParse->nMem, regCol+nCol);
+ if( doOnce ){
+ int mxCol = nCol;
+ Index *pX;
+
+ /* Compute the maximum number of columns in any index */
+ for(pX=pTab->pIndex; pX; pX=pX->pNext){
+ int nColX; /* Number of columns in pX */
+ if( !HasRowid(pTab) && IsPrimaryKeyIndex(pX) ){
+ nColX = pX->nKeyCol;
+ }else{
+ nColX = pX->nColumn;
+ }
+ if( nColX>mxCol ) mxCol = nColX;
+ }
+
+ /* Allocate space to compute results for the largest index */
+ sqlite3TouchRegister(pParse, regCol+mxCol);
+ doOnce = 0;
+#ifdef SQLITE_DEBUG
+ /* Verify that the call to sqlite3ClearTempRegCache() below
+ ** really is needed.
+ ** https://sqlite.org/forum/forumpost/83cb4a95a0 (2023-03-25)
+ */
+ testcase( !sqlite3NoTempsInRange(pParse, regEq, regCol+mxCol) );
+#endif
+ sqlite3ClearTempRegCache(pParse); /* tag-20230325-1 */
+ assert( sqlite3NoTempsInRange(pParse, regEq, regCol+mxCol) );
+ }
+ assert( sqlite3NoTempsInRange(pParse, regEq, regCol+nCol) );
addrNext = sqlite3VdbeCurrentAddr(v);
callStatGet(pParse, regStat, STAT_GET_ROWID, regSampleRowid);
@@ -110966,6 +116683,11 @@ static void analyzeDatabase(Parse *pParse, int iDb){
for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){
Table *pTab = (Table*)sqliteHashData(k);
analyzeOneTable(pParse, pTab, 0, iStatCur, iMem, iTab);
+#ifdef SQLITE_ENABLE_STAT4
+ iMem = sqlite3FirstAvailableRegister(pParse, iMem);
+#else
+ assert( iMem==sqlite3FirstAvailableRegister(pParse,iMem) );
+#endif
}
loadAnalysis(pParse, iDb);
}
@@ -111206,6 +116928,8 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
** and its contents.
*/
SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){
+ assert( db!=0 );
+ assert( pIdx!=0 );
#ifdef SQLITE_ENABLE_STAT4
if( pIdx->aSample ){
int j;
@@ -111215,7 +116939,7 @@ SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){
}
sqlite3DbFree(db, pIdx->aSample);
}
- if( db && db->pnBytesFreed==0 ){
+ if( db->pnBytesFreed==0 ){
pIdx->nSample = 0;
pIdx->aSample = 0;
}
@@ -111351,6 +117075,10 @@ static int loadStatTbl(
pIdx = findIndexOrPrimaryKey(db, zIndex, zDb);
assert( pIdx==0 || pIdx->nSample==0 );
if( pIdx==0 ) continue;
+ if( pIdx->aSample!=0 ){
+ /* The same index appears in sqlite_stat4 under multiple names */
+ continue;
+ }
assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 );
if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){
nIdxCol = pIdx->nKeyCol;
@@ -111358,6 +117086,7 @@ static int loadStatTbl(
nIdxCol = pIdx->nColumn;
}
pIdx->nSampleCol = nIdxCol;
+ pIdx->mxSample = nSample;
nByte = sizeof(IndexSample) * nSample;
nByte += sizeof(tRowcnt) * nIdxCol * 3 * nSample;
nByte += nIdxCol * sizeof(tRowcnt); /* Space for Index.aAvgEq[] */
@@ -111397,6 +117126,11 @@ static int loadStatTbl(
if( zIndex==0 ) continue;
pIdx = findIndexOrPrimaryKey(db, zIndex, zDb);
if( pIdx==0 ) continue;
+ if( pIdx->nSample>=pIdx->mxSample ){
+ /* Too many slots used because the same index appears in
+ ** sqlite_stat4 using multiple names */
+ continue;
+ }
/* This next condition is true if data has already been loaded from
** the sqlite_stat4 table. */
nCol = pIdx->nSampleCol;
@@ -111437,11 +117171,15 @@ static int loadStatTbl(
*/
static int loadStat4(sqlite3 *db, const char *zDb){
int rc = SQLITE_OK; /* Result codes from subroutines */
+ const Table *pStat4;
assert( db->lookaside.bDisable );
- if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){
+ if( OptimizationEnabled(db, SQLITE_Stat4)
+ && (pStat4 = sqlite3FindTable(db, "sqlite_stat4", zDb))!=0
+ && IsOrdinaryTable(pStat4)
+ ){
rc = loadStatTbl(db,
- "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx",
+ "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx COLLATE nocase",
"SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4",
zDb
);
@@ -111476,6 +117214,7 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
char *zSql;
int rc = SQLITE_OK;
Schema *pSchema = db->aDb[iDb].pSchema;
+ const Table *pStat1;
assert( iDb>=0 && iDb<db->nDb );
assert( db->aDb[iDb].pBt!=0 );
@@ -111498,7 +117237,9 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
/* Load new statistics out of the sqlite_stat1 table */
sInfo.db = db;
sInfo.zDatabase = db->aDb[iDb].zDbSName;
- if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)!=0 ){
+ if( (pStat1 = sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase))
+ && IsOrdinaryTable(pStat1)
+ ){
zSql = sqlite3MPrintf(db,
"SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase);
if( zSql==0 ){
@@ -111628,7 +117369,7 @@ static void attachFunc(
char *zErr = 0;
unsigned int flags;
Db *aNew; /* New array of Db pointers */
- Db *pNew; /* Db object for the newly attached database */
+ Db *pNew = 0; /* Db object for the newly attached database */
char *zErrDyn = 0;
sqlite3_vfs *pVfs;
@@ -111648,13 +117389,26 @@ static void attachFunc(
/* This is not a real ATTACH. Instead, this routine is being called
** from sqlite3_deserialize() to close database db->init.iDb and
** reopen it as a MemDB */
+ Btree *pNewBt = 0;
pVfs = sqlite3_vfs_find("memdb");
if( pVfs==0 ) return;
- pNew = &db->aDb[db->init.iDb];
- if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt);
- pNew->pBt = 0;
- pNew->pSchema = 0;
- rc = sqlite3BtreeOpen(pVfs, "x\0", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB);
+ rc = sqlite3BtreeOpen(pVfs, "x\0", db, &pNewBt, 0, SQLITE_OPEN_MAIN_DB);
+ if( rc==SQLITE_OK ){
+ Schema *pNewSchema = sqlite3SchemaGet(db, pNewBt);
+ if( pNewSchema ){
+ /* Both the Btree and the new Schema were allocated successfully.
+ ** Close the old db and update the aDb[] slot with the new memdb
+ ** values. */
+ pNew = &db->aDb[db->init.iDb];
+ if( ALWAYS(pNew->pBt) ) sqlite3BtreeClose(pNew->pBt);
+ pNew->pBt = pNewBt;
+ pNew->pSchema = pNewSchema;
+ }else{
+ sqlite3BtreeClose(pNewBt);
+ rc = SQLITE_NOMEM;
+ }
+ }
+ if( rc ) goto attach_error;
}else{
/* This is a real ATTACH
**
@@ -111767,7 +117521,7 @@ static void attachFunc(
}
#endif
if( rc ){
- if( !REOPEN_AS_MEMDB(db) ){
+ if( ALWAYS(!REOPEN_AS_MEMDB(db)) ){
int iDb = db->nDb - 1;
assert( iDb>=2 );
if( db->aDb[iDb].pBt ){
@@ -111884,22 +117638,25 @@ static void codeAttach(
sqlite3* db = pParse->db;
int regArgs;
+ if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto attach_end;
+
if( pParse->nErr ) goto attach_end;
memset(&sName, 0, sizeof(NameContext));
sName.pParse = pParse;
if(
- SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) ||
- SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) ||
- SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey))
+ SQLITE_OK!=resolveAttachExpr(&sName, pFilename) ||
+ SQLITE_OK!=resolveAttachExpr(&sName, pDbname) ||
+ SQLITE_OK!=resolveAttachExpr(&sName, pKey)
){
goto attach_end;
}
#ifndef SQLITE_OMIT_AUTHORIZATION
- if( pAuthArg ){
+ if( ALWAYS(pAuthArg) ){
char *zAuthArg;
if( pAuthArg->op==TK_STRING ){
+ assert( !ExprHasProperty(pAuthArg, EP_IntValue) );
zAuthArg = pAuthArg->u.zToken;
}else{
zAuthArg = 0;
@@ -112022,7 +117779,11 @@ static int fixSelectCb(Walker *p, Select *pSelect){
pItem->fg.fromDDL = 1;
}
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)
- if( sqlite3WalkExpr(&pFix->w, pList->a[i].pOn) ) return WRC_Abort;
+ if( pList->a[i].fg.isUsing==0
+ && sqlite3WalkExpr(&pFix->w, pList->a[i].u3.pOn)
+ ){
+ return WRC_Abort;
+ }
#endif
}
if( pSelect->pWith ){
@@ -112318,10 +118079,10 @@ SQLITE_PRIVATE void sqlite3AuthRead(
if( iCol>=0 ){
assert( iCol<pTab->nCol );
- zCol = pTab->aCol[iCol].zName;
+ zCol = pTab->aCol[iCol].zCnName;
}else if( pTab->iPKey>=0 ){
assert( pTab->iPKey<pTab->nCol );
- zCol = pTab->aCol[pTab->iPKey].zName;
+ zCol = pTab->aCol[pTab->iPKey].zCnName;
}else{
zCol = "ROWID";
}
@@ -112554,14 +118315,17 @@ SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask m){
SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
sqlite3 *db;
Vdbe *v;
+ int iDb, i;
assert( pParse->pToplevel==0 );
db = pParse->db;
+ assert( db->pParse==pParse );
if( pParse->nested ) return;
- if( db->mallocFailed || pParse->nErr ){
- if( pParse->rc==SQLITE_OK ) pParse->rc = SQLITE_ERROR;
+ if( pParse->nErr ){
+ if( db->mallocFailed ) pParse->rc = SQLITE_NOMEM;
return;
}
+ assert( db->mallocFailed==0 );
/* Begin by generating some termination code at the end of the
** vdbe program
@@ -112581,20 +118345,22 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
if( pParse->bReturning ){
Returning *pReturning = pParse->u1.pReturning;
int addrRewind;
- int i;
int reg;
- addrRewind =
- sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur);
- VdbeCoverage(v);
- reg = pReturning->iRetReg;
- for(i=0; i<pReturning->nRetCol; i++){
- sqlite3VdbeAddOp3(v, OP_Column, pReturning->iRetCur, i, reg+i);
+ if( pReturning->nRetCol ){
+ sqlite3VdbeAddOp0(v, OP_FkCheck);
+ addrRewind =
+ sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur);
+ VdbeCoverage(v);
+ reg = pReturning->iRetReg;
+ for(i=0; i<pReturning->nRetCol; i++){
+ sqlite3VdbeAddOp3(v, OP_Column, pReturning->iRetCur, i, reg+i);
+ }
+ sqlite3VdbeAddOp2(v, OP_ResultRow, reg, i);
+ sqlite3VdbeAddOp2(v, OP_Next, pReturning->iRetCur, addrRewind+1);
+ VdbeCoverage(v);
+ sqlite3VdbeJumpHere(v, addrRewind);
}
- sqlite3VdbeAddOp2(v, OP_ResultRow, reg, i);
- sqlite3VdbeAddOp2(v, OP_Next, pReturning->iRetCur, addrRewind+1);
- VdbeCoverage(v);
- sqlite3VdbeJumpHere(v, addrRewind);
}
sqlite3VdbeAddOp0(v, OP_Halt);
@@ -112615,77 +118381,76 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
** transaction on each used database and to verify the schema cookie
** on each used database.
*/
- if( db->mallocFailed==0
- && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr)
- ){
- int iDb, i;
- assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init );
- sqlite3VdbeJumpHere(v, 0);
- for(iDb=0; iDb<db->nDb; iDb++){
- Schema *pSchema;
- if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue;
- sqlite3VdbeUsesBtree(v, iDb);
- pSchema = db->aDb[iDb].pSchema;
- sqlite3VdbeAddOp4Int(v,
- OP_Transaction, /* Opcode */
- iDb, /* P1 */
- DbMaskTest(pParse->writeMask,iDb), /* P2 */
- pSchema->schema_cookie, /* P3 */
- pSchema->iGeneration /* P4 */
- );
- if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1);
- VdbeComment((v,
- "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite));
- }
+ assert( pParse->nErr>0 || sqlite3VdbeGetOp(v, 0)->opcode==OP_Init );
+ sqlite3VdbeJumpHere(v, 0);
+ assert( db->nDb>0 );
+ iDb = 0;
+ do{
+ Schema *pSchema;
+ if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue;
+ sqlite3VdbeUsesBtree(v, iDb);
+ pSchema = db->aDb[iDb].pSchema;
+ sqlite3VdbeAddOp4Int(v,
+ OP_Transaction, /* Opcode */
+ iDb, /* P1 */
+ DbMaskTest(pParse->writeMask,iDb), /* P2 */
+ pSchema->schema_cookie, /* P3 */
+ pSchema->iGeneration /* P4 */
+ );
+ if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1);
+ VdbeComment((v,
+ "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite));
+ }while( ++iDb<db->nDb );
#ifndef SQLITE_OMIT_VIRTUALTABLE
- for(i=0; i<pParse->nVtabLock; i++){
- char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]);
- sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB);
- }
- pParse->nVtabLock = 0;
+ for(i=0; i<pParse->nVtabLock; i++){
+ char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]);
+ sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB);
+ }
+ pParse->nVtabLock = 0;
#endif
- /* Once all the cookies have been verified and transactions opened,
- ** obtain the required table-locks. This is a no-op unless the
- ** shared-cache feature is enabled.
- */
- codeTableLocks(pParse);
+ /* Once all the cookies have been verified and transactions opened,
+ ** obtain the required table-locks. This is a no-op unless the
+ ** shared-cache feature is enabled.
+ */
+ codeTableLocks(pParse);
- /* Initialize any AUTOINCREMENT data structures required.
- */
- sqlite3AutoincrementBegin(pParse);
+ /* Initialize any AUTOINCREMENT data structures required.
+ */
+ sqlite3AutoincrementBegin(pParse);
- /* Code constant expressions that where factored out of inner loops.
- **
- ** The pConstExpr list might also contain expressions that we simply
- ** want to keep around until the Parse object is deleted. Such
- ** expressions have iConstExprReg==0. Do not generate code for
- ** those expressions, of course.
- */
- if( pParse->pConstExpr ){
- ExprList *pEL = pParse->pConstExpr;
- pParse->okConstFactor = 0;
- for(i=0; i<pEL->nExpr; i++){
- int iReg = pEL->a[i].u.iConstExprReg;
- if( iReg>0 ){
- sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg);
- }
- }
+ /* Code constant expressions that where factored out of inner loops.
+ **
+ ** The pConstExpr list might also contain expressions that we simply
+ ** want to keep around until the Parse object is deleted. Such
+ ** expressions have iConstExprReg==0. Do not generate code for
+ ** those expressions, of course.
+ */
+ if( pParse->pConstExpr ){
+ ExprList *pEL = pParse->pConstExpr;
+ pParse->okConstFactor = 0;
+ for(i=0; i<pEL->nExpr; i++){
+ int iReg = pEL->a[i].u.iConstExprReg;
+ sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg);
}
+ }
- if( pParse->bReturning ){
- Returning *pRet = pParse->u1.pReturning;
+ if( pParse->bReturning ){
+ Returning *pRet = pParse->u1.pReturning;
+ if( pRet->nRetCol ){
sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol);
}
-
- /* Finally, jump back to the beginning of the executable code. */
- sqlite3VdbeGoto(v, 1);
}
+
+ /* Finally, jump back to the beginning of the executable code. */
+ sqlite3VdbeGoto(v, 1);
}
/* Get the VDBE program ready for execution
*/
- if( v && pParse->nErr==0 && !db->mallocFailed ){
+ assert( v!=0 || pParse->nErr );
+ assert( db->mallocFailed==0 || pParse->nErr );
+ if( pParse->nErr==0 ){
/* A minimum of one cursor is required if autoincrement is used
* See ticket [a696379c1f08866] */
assert( pParse->pAinc==0 || pParse->nTab>0 );
@@ -112699,23 +118464,25 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
/*
** Run the parser and code generator recursively in order to generate
** code for the SQL statement given onto the end of the pParse context
-** currently under construction. When the parser is run recursively
-** this way, the final OP_Halt is not appended and other initialization
-** and finalization steps are omitted because those are handling by the
-** outermost parser.
+** currently under construction. Notes:
+**
+** * The final OP_Halt is not appended and other initialization
+** and finalization steps are omitted because those are handling by the
+** outermost parser.
**
-** Not everything is nestable. This facility is designed to permit
-** INSERT, UPDATE, and DELETE operations against the schema table. Use
-** care if you decide to try to use this routine for some other purposes.
+** * Built-in SQL functions always take precedence over application-defined
+** SQL functions. In other words, it is not possible to override a
+** built-in function.
*/
SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
va_list ap;
char *zSql;
- char *zErrMsg = 0;
sqlite3 *db = pParse->db;
+ u32 savedDbFlags = db->mDbFlags;
char saveBuf[PARSE_TAIL_SZ];
if( pParse->nErr ) return;
+ if( pParse->eParseMode ) return;
assert( pParse->nested<10 ); /* Nesting should only be of limited depth */
va_start(ap, zFormat);
zSql = sqlite3VMPrintf(db, zFormat, ap);
@@ -112731,8 +118498,9 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
pParse->nested++;
memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ);
memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ);
- sqlite3RunParser(pParse, zSql, &zErrMsg);
- sqlite3DbFree(db, zErrMsg);
+ db->mDbFlags |= DBFLAG_PreferBuiltin;
+ sqlite3RunParser(pParse, zSql);
+ db->mDbFlags = savedDbFlags;
sqlite3DbFree(db, zSql);
memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ);
pParse->nested--;
@@ -112789,17 +118557,17 @@ SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const cha
p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName);
if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){
if( i==1 ){
- if( sqlite3StrICmp(zName+7, &ALT_TEMP_SCHEMA_TABLE[7])==0
- || sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0
- || sqlite3StrICmp(zName+7, &DFLT_SCHEMA_TABLE[7])==0
+ if( sqlite3StrICmp(zName+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0
+ || sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0
+ || sqlite3StrICmp(zName+7, &LEGACY_SCHEMA_TABLE[7])==0
){
p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash,
- DFLT_TEMP_SCHEMA_TABLE);
+ LEGACY_TEMP_SCHEMA_TABLE);
}
}else{
- if( sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 ){
+ if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){
p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash,
- DFLT_SCHEMA_TABLE);
+ LEGACY_SCHEMA_TABLE);
}
}
}
@@ -112817,11 +118585,11 @@ SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const cha
if( p ) break;
}
if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){
- if( sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 ){
- p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, DFLT_SCHEMA_TABLE);
- }else if( sqlite3StrICmp(zName+7, &ALT_TEMP_SCHEMA_TABLE[7])==0 ){
+ if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){
+ p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, LEGACY_SCHEMA_TABLE);
+ }else if( sqlite3StrICmp(zName+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){
p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash,
- DFLT_TEMP_SCHEMA_TABLE);
+ LEGACY_TEMP_SCHEMA_TABLE);
}
}
}
@@ -112861,19 +118629,20 @@ SQLITE_PRIVATE Table *sqlite3LocateTable(
/* If zName is the not the name of a table in the schema created using
** CREATE, then check to see if it is the name of an virtual table that
** can be an eponymous virtual table. */
- if( pParse->disableVtab==0 && db->init.busy==0 ){
+ if( (pParse->prepFlags & SQLITE_PREPARE_NO_VTAB)==0 && db->init.busy==0 ){
Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName);
if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){
pMod = sqlite3PragmaVtabRegister(db, zName);
}
if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){
+ testcase( pMod->pEpoTab==0 );
return pMod->pEpoTab;
}
}
#endif
if( flags & LOCATE_NOERR ) return 0;
pParse->checkSchema = 1;
- }else if( IsVirtual(p) && pParse->disableVtab ){
+ }else if( IsVirtual(p) && (pParse->prepFlags & SQLITE_PREPARE_NO_VTAB)!=0 ){
p = 0;
}
@@ -112917,6 +118686,22 @@ SQLITE_PRIVATE Table *sqlite3LocateTableItem(
}
/*
+** Return the preferred table name for system tables. Translate legacy
+** names into the new preferred names, as appropriate.
+*/
+SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char *zName){
+ if( sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){
+ if( sqlite3StrICmp(zName+7, &LEGACY_SCHEMA_TABLE[7])==0 ){
+ return PREFERRED_SCHEMA_TABLE;
+ }
+ if( sqlite3StrICmp(zName+7, &LEGACY_TEMP_SCHEMA_TABLE[7])==0 ){
+ return PREFERRED_TEMP_SCHEMA_TABLE;
+ }
+ }
+ return zName;
+}
+
+/*
** Locate the in-memory structure that describes
** a particular index given the name of that index
** and the name of the database that contains the index.
@@ -113081,6 +118866,84 @@ SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){
}
/*
+** Set the expression associated with a column. This is usually
+** the DEFAULT value, but might also be the expression that computes
+** the value for a generated column.
+*/
+SQLITE_PRIVATE void sqlite3ColumnSetExpr(
+ Parse *pParse, /* Parsing context */
+ Table *pTab, /* The table containing the column */
+ Column *pCol, /* The column to receive the new DEFAULT expression */
+ Expr *pExpr /* The new default expression */
+){
+ ExprList *pList;
+ assert( IsOrdinaryTable(pTab) );
+ pList = pTab->u.tab.pDfltList;
+ if( pCol->iDflt==0
+ || NEVER(pList==0)
+ || NEVER(pList->nExpr<pCol->iDflt)
+ ){
+ pCol->iDflt = pList==0 ? 1 : pList->nExpr+1;
+ pTab->u.tab.pDfltList = sqlite3ExprListAppend(pParse, pList, pExpr);
+ }else{
+ sqlite3ExprDelete(pParse->db, pList->a[pCol->iDflt-1].pExpr);
+ pList->a[pCol->iDflt-1].pExpr = pExpr;
+ }
+}
+
+/*
+** Return the expression associated with a column. The expression might be
+** the DEFAULT clause or the AS clause of a generated column.
+** Return NULL if the column has no associated expression.
+*/
+SQLITE_PRIVATE Expr *sqlite3ColumnExpr(Table *pTab, Column *pCol){
+ if( pCol->iDflt==0 ) return 0;
+ if( NEVER(!IsOrdinaryTable(pTab)) ) return 0;
+ if( NEVER(pTab->u.tab.pDfltList==0) ) return 0;
+ if( NEVER(pTab->u.tab.pDfltList->nExpr<pCol->iDflt) ) return 0;
+ return pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr;
+}
+
+/*
+** Set the collating sequence name for a column.
+*/
+SQLITE_PRIVATE void sqlite3ColumnSetColl(
+ sqlite3 *db,
+ Column *pCol,
+ const char *zColl
+){
+ i64 nColl;
+ i64 n;
+ char *zNew;
+ assert( zColl!=0 );
+ n = sqlite3Strlen30(pCol->zCnName) + 1;
+ if( pCol->colFlags & COLFLAG_HASTYPE ){
+ n += sqlite3Strlen30(pCol->zCnName+n) + 1;
+ }
+ nColl = sqlite3Strlen30(zColl) + 1;
+ zNew = sqlite3DbRealloc(db, pCol->zCnName, nColl+n);
+ if( zNew ){
+ pCol->zCnName = zNew;
+ memcpy(pCol->zCnName + n, zColl, nColl);
+ pCol->colFlags |= COLFLAG_HASCOLL;
+ }
+}
+
+/*
+** Return the collating squence name for a column
+*/
+SQLITE_PRIVATE const char *sqlite3ColumnColl(Column *pCol){
+ const char *z;
+ if( (pCol->colFlags & COLFLAG_HASCOLL)==0 ) return 0;
+ z = pCol->zCnName;
+ while( *z ){ z++; }
+ if( pCol->colFlags & COLFLAG_HASTYPE ){
+ do{ z++; }while( *z );
+ }
+ return z+1;
+}
+
+/*
** Delete memory allocated for the column names of a table or view (the
** Table.aCol[] array).
*/
@@ -113088,14 +118951,23 @@ SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){
int i;
Column *pCol;
assert( pTable!=0 );
+ assert( db!=0 );
if( (pCol = pTable->aCol)!=0 ){
for(i=0; i<pTable->nCol; i++, pCol++){
- assert( pCol->zName==0 || pCol->hName==sqlite3StrIHash(pCol->zName) );
- sqlite3DbFree(db, pCol->zName);
- sqlite3ExprDelete(db, pCol->pDflt);
- sqlite3DbFree(db, pCol->zColl);
+ assert( pCol->zCnName==0 || pCol->hName==sqlite3StrIHash(pCol->zCnName) );
+ sqlite3DbFree(db, pCol->zCnName);
+ }
+ sqlite3DbNNFreeNN(db, pTable->aCol);
+ if( IsOrdinaryTable(pTable) ){
+ sqlite3ExprListDelete(db, pTable->u.tab.pDfltList);
+ }
+ if( db->pnBytesFreed==0 ){
+ pTable->aCol = 0;
+ pTable->nCol = 0;
+ if( IsOrdinaryTable(pTable) ){
+ pTable->u.tab.pDfltList = 0;
+ }
}
- sqlite3DbFree(db, pTable->aCol);
}
}
@@ -113126,7 +118998,8 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
** a Table object that was going to be marked ephemeral. So do not check
** that no lookaside memory is used in this case either. */
int nLookaside = 0;
- if( db && !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){
+ assert( db!=0 );
+ if( !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){
nLookaside = sqlite3LookasideUsed(db, 0);
}
#endif
@@ -113136,7 +119009,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
pNext = pIndex->pNext;
assert( pIndex->pSchema==pTable->pSchema
|| (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) );
- if( (db==0 || db->pnBytesFreed==0) && !IsVirtual(pTable) ){
+ if( db->pnBytesFreed==0 && !IsVirtual(pTable) ){
char *zName = pIndex->zName;
TESTONLY ( Index *pOld = ) sqlite3HashInsert(
&pIndex->pSchema->idxHash, zName, 0
@@ -113147,19 +119020,25 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
sqlite3FreeIndex(db, pIndex);
}
- /* Delete any foreign keys attached to this table. */
- sqlite3FkDelete(db, pTable);
+ if( IsOrdinaryTable(pTable) ){
+ sqlite3FkDelete(db, pTable);
+ }
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ else if( IsVirtual(pTable) ){
+ sqlite3VtabClear(db, pTable);
+ }
+#endif
+ else{
+ assert( IsView(pTable) );
+ sqlite3SelectDelete(db, pTable->u.view.pSelect);
+ }
/* Delete the Table structure itself.
*/
sqlite3DeleteColumnNames(db, pTable);
sqlite3DbFree(db, pTable->zName);
sqlite3DbFree(db, pTable->zColAff);
- sqlite3SelectDelete(db, pTable->pSelect);
sqlite3ExprListDelete(db, pTable->pCheck);
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- sqlite3VtabClear(db, pTable);
-#endif
sqlite3DbFree(db, pTable);
/* Verify that no lookaside memory was used by schema tables */
@@ -113167,8 +119046,9 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
}
SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
/* Do not delete the table until the reference count reaches zero. */
+ assert( db!=0 );
if( !pTable ) return;
- if( ((!db || db->pnBytesFreed==0) && (--pTable->nTabRef)>0) ) return;
+ if( db->pnBytesFreed==0 && (--pTable->nTabRef)>0 ) return;
deleteTable(db, pTable);
}
@@ -113205,10 +119085,10 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char
** are not \000 terminated and are not persistent. The returned string
** is \000 terminated and is persistent.
*/
-SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, Token *pName){
+SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, const Token *pName){
char *zName;
if( pName ){
- zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n);
+ zName = sqlite3DbStrNDup(db, (const char*)pName->z, pName->n);
sqlite3Dequote(zName);
}else{
zName = 0;
@@ -113222,7 +119102,7 @@ SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, Token *pName){
*/
SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *p, int iDb){
Vdbe *v = sqlite3GetVdbe(p);
- sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, DFLT_SCHEMA_TABLE);
+ sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, LEGACY_SCHEMA_TABLE);
sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5);
if( p->nTab==0 ){
p->nTab = 1;
@@ -113583,7 +119463,8 @@ SQLITE_PRIVATE void sqlite3StartTable(
pTable = sqlite3FindTable(db, zName, zDb);
if( pTable ){
if( !noErr ){
- sqlite3ErrorMsg(pParse, "table %T already exists", pName);
+ sqlite3ErrorMsg(pParse, "%s %T already exists",
+ (IsView(pTable)? "view" : "table"), pName);
}else{
assert( !db->init.busy || CORRUPT_DB );
sqlite3CodeVerifySchema(pParse, iDb);
@@ -113685,6 +119566,7 @@ SQLITE_PRIVATE void sqlite3StartTable(
/* If an error occurs, we jump here */
begin_table_error:
+ pParse->checkSchema = 1;
sqlite3DbFree(db, zName);
return;
}
@@ -113694,7 +119576,7 @@ begin_table_error:
*/
#if SQLITE_ENABLE_HIDDEN_COLUMNS
SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){
- if( sqlite3_strnicmp(pCol->zName, "__hidden__", 10)==0 ){
+ if( sqlite3_strnicmp(pCol->zCnName, "__hidden__", 10)==0 ){
pCol->colFlags |= COLFLAG_HIDDEN;
if( pTab ) pTab->tabFlags |= TF_HasHidden;
}else if( pTab && pCol!=pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN) ){
@@ -113744,7 +119626,7 @@ SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){
if( pParse->pNewTrigger ){
sqlite3ErrorMsg(pParse, "cannot use RETURNING in a trigger");
}else{
- assert( pParse->bReturning==0 );
+ assert( pParse->bReturning==0 || pParse->ifNotExists );
}
pParse->bReturning = 1;
pRet = sqlite3DbMallocZero(db, sizeof(*pRet));
@@ -113770,7 +119652,8 @@ SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){
pRet->retTStep.pTrig = &pRet->retTrig;
pRet->retTStep.pExprList = pList;
pHash = &(db->aDb[1].pSchema->trigHash);
- assert( sqlite3HashFind(pHash, RETURNING_TRIGGER_NAME)==0 || pParse->nErr );
+ assert( sqlite3HashFind(pHash, RETURNING_TRIGGER_NAME)==0
+ || pParse->nErr || pParse->ifNotExists );
if( sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, &pRet->retTrig)
==&pRet->retTrig ){
sqlite3OomFault(db);
@@ -113785,7 +119668,7 @@ SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){
** first to get things going. Then this routine is called for each
** column.
*/
-SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){
+SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){
Table *p;
int i;
char *z;
@@ -113793,55 +119676,96 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){
Column *pCol;
sqlite3 *db = pParse->db;
u8 hName;
+ Column *aNew;
+ u8 eType = COLTYPE_CUSTOM;
+ u8 szEst = 1;
+ char affinity = SQLITE_AFF_BLOB;
if( (p = pParse->pNewTable)==0 ) return;
if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){
sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName);
return;
}
- z = sqlite3DbMallocRaw(db, pName->n + pType->n + 2);
+ if( !IN_RENAME_OBJECT ) sqlite3DequoteToken(&sName);
+
+ /* Because keywords GENERATE ALWAYS can be converted into indentifiers
+ ** by the parser, we can sometimes end up with a typename that ends
+ ** with "generated always". Check for this case and omit the surplus
+ ** text. */
+ if( sType.n>=16
+ && sqlite3_strnicmp(sType.z+(sType.n-6),"always",6)==0
+ ){
+ sType.n -= 6;
+ while( ALWAYS(sType.n>0) && sqlite3Isspace(sType.z[sType.n-1]) ) sType.n--;
+ if( sType.n>=9
+ && sqlite3_strnicmp(sType.z+(sType.n-9),"generated",9)==0
+ ){
+ sType.n -= 9;
+ while( sType.n>0 && sqlite3Isspace(sType.z[sType.n-1]) ) sType.n--;
+ }
+ }
+
+ /* Check for standard typenames. For standard typenames we will
+ ** set the Column.eType field rather than storing the typename after
+ ** the column name, in order to save space. */
+ if( sType.n>=3 ){
+ sqlite3DequoteToken(&sType);
+ for(i=0; i<SQLITE_N_STDTYPE; i++){
+ if( sType.n==sqlite3StdTypeLen[i]
+ && sqlite3_strnicmp(sType.z, sqlite3StdType[i], sType.n)==0
+ ){
+ sType.n = 0;
+ eType = i+1;
+ affinity = sqlite3StdTypeAffinity[i];
+ if( affinity<=SQLITE_AFF_TEXT ) szEst = 5;
+ break;
+ }
+ }
+ }
+
+ z = sqlite3DbMallocRaw(db, (i64)sName.n + 1 + (i64)sType.n + (sType.n>0) );
if( z==0 ) return;
- if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, pName);
- memcpy(z, pName->z, pName->n);
- z[pName->n] = 0;
+ if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, &sName);
+ memcpy(z, sName.z, sName.n);
+ z[sName.n] = 0;
sqlite3Dequote(z);
hName = sqlite3StrIHash(z);
for(i=0; i<p->nCol; i++){
- if( p->aCol[i].hName==hName && sqlite3StrICmp(z, p->aCol[i].zName)==0 ){
+ if( p->aCol[i].hName==hName && sqlite3StrICmp(z, p->aCol[i].zCnName)==0 ){
sqlite3ErrorMsg(pParse, "duplicate column name: %s", z);
sqlite3DbFree(db, z);
return;
}
}
- if( (p->nCol & 0x7)==0 ){
- Column *aNew;
- aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0]));
- if( aNew==0 ){
- sqlite3DbFree(db, z);
- return;
- }
- p->aCol = aNew;
+ aNew = sqlite3DbRealloc(db,p->aCol,((i64)p->nCol+1)*sizeof(p->aCol[0]));
+ if( aNew==0 ){
+ sqlite3DbFree(db, z);
+ return;
}
+ p->aCol = aNew;
pCol = &p->aCol[p->nCol];
memset(pCol, 0, sizeof(p->aCol[0]));
- pCol->zName = z;
+ pCol->zCnName = z;
pCol->hName = hName;
sqlite3ColumnPropertiesFromName(p, pCol);
- if( pType->n==0 ){
+ if( sType.n==0 ){
/* If there is no type specified, columns have the default affinity
** 'BLOB' with a default size of 4 bytes. */
- pCol->affinity = SQLITE_AFF_BLOB;
- pCol->szEst = 1;
+ pCol->affinity = affinity;
+ pCol->eCType = eType;
+ pCol->szEst = szEst;
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
- if( 4>=sqlite3GlobalConfig.szSorterRef ){
- pCol->colFlags |= COLFLAG_SORTERREF;
+ if( affinity==SQLITE_AFF_BLOB ){
+ if( 4>=sqlite3GlobalConfig.szSorterRef ){
+ pCol->colFlags |= COLFLAG_SORTERREF;
+ }
}
#endif
}else{
zType = z + sqlite3Strlen30(z) + 1;
- memcpy(zType, pType->z, pType->n);
- zType[pType->n] = 0;
+ memcpy(zType, sType.z, sType.n);
+ zType[sType.n] = 0;
sqlite3Dequote(zType);
pCol->affinity = sqlite3AffinityType(zType, pCol);
pCol->colFlags |= COLFLAG_HASTYPE;
@@ -113996,7 +119920,7 @@ SQLITE_PRIVATE void sqlite3AddDefaultValue(
pCol = &(p->aCol[p->nCol-1]);
if( !sqlite3ExprIsConstantOrFunction(pExpr, isInit) ){
sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant",
- pCol->zName);
+ pCol->zCnName);
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
}else if( pCol->colFlags & COLFLAG_GENERATED ){
testcase( pCol->colFlags & COLFLAG_VIRTUAL );
@@ -114007,15 +119931,15 @@ SQLITE_PRIVATE void sqlite3AddDefaultValue(
/* A copy of pExpr is used instead of the original, as pExpr contains
** tokens that point to volatile memory.
*/
- Expr x;
- sqlite3ExprDelete(db, pCol->pDflt);
+ Expr x, *pDfltExpr;
memset(&x, 0, sizeof(x));
x.op = TK_SPAN;
x.u.zToken = sqlite3DbSpanDup(db, zStart, zEnd);
x.pLeft = pExpr;
x.flags = EP_Skip;
- pCol->pDflt = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE);
+ pDfltExpr = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE);
sqlite3DbFree(db, x.u.zToken);
+ sqlite3ColumnSetExpr(pParse, p, pCol, pDfltExpr);
}
}
if( IN_RENAME_OBJECT ){
@@ -114111,9 +120035,11 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey(
assert( pCExpr!=0 );
sqlite3StringToId(pCExpr);
if( pCExpr->op==TK_ID ){
- const char *zCName = pCExpr->u.zToken;
+ const char *zCName;
+ assert( !ExprHasProperty(pCExpr, EP_IntValue) );
+ zCName = pCExpr->u.zToken;
for(iCol=0; iCol<pTab->nCol; iCol++){
- if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zName)==0 ){
+ if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zCnName)==0 ){
pCol = &pTab->aCol[iCol];
makeColumnPartOfPrimaryKey(pParse, pCol);
break;
@@ -114124,7 +120050,7 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey(
}
if( nTerm==1
&& pCol
- && sqlite3StrICmp(sqlite3ColumnType(pCol,""), "INTEGER")==0
+ && pCol->eCType==COLTYPE_INTEGER
&& sortOrder!=SQLITE_SO_DESC
){
if( IN_RENAME_OBJECT && pList ){
@@ -114135,7 +120061,7 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey(
pTab->keyConf = (u8)onError;
assert( autoInc==0 || autoInc==1 );
pTab->tabFlags |= autoInc*TF_Autoincrement;
- if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags;
+ if( pList ) pParse->iPkSortOrder = pList->a[0].fg.sortFlags;
(void)sqlite3HasExplicitNulls(pParse, pList);
}else if( autoInc ){
#ifndef SQLITE_OMIT_AUTOINCREMENT
@@ -114204,8 +120130,7 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){
if( sqlite3LocateCollSeq(pParse, zColl) ){
Index *pIdx;
- sqlite3DbFree(db, p->aCol[i].zColl);
- p->aCol[i].zColl = zColl;
+ sqlite3ColumnSetColl(db, &p->aCol[i], zColl);
/* If the column is declared as "<name> PRIMARY KEY COLLATE <type>",
** then an index may have been created on this column before the
@@ -114214,12 +120139,11 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){
for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){
assert( pIdx->nKeyCol==1 );
if( pIdx->aiColumn[0]==i ){
- pIdx->azColl[0] = p->aCol[i].zColl;
+ pIdx->azColl[0] = sqlite3ColumnColl(&p->aCol[i]);
}
}
- }else{
- sqlite3DbFree(db, zColl);
}
+ sqlite3DbFree(db, zColl);
}
/* Change the most recently parsed column to be a GENERATED ALWAYS AS
@@ -114239,7 +120163,7 @@ SQLITE_PRIVATE void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType
sqlite3ErrorMsg(pParse, "virtual tables cannot use computed columns");
goto generated_done;
}
- if( pCol->pDflt ) goto generated_error;
+ if( pCol->iDflt>0 ) goto generated_error;
if( pType ){
if( pType->n==7 && sqlite3StrNICmp("virtual",pType->z,7)==0 ){
/* no-op */
@@ -114257,13 +120181,21 @@ SQLITE_PRIVATE void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType
if( pCol->colFlags & COLFLAG_PRIMKEY ){
makeColumnPartOfPrimaryKey(pParse, pCol); /* For the error message */
}
- pCol->pDflt = pExpr;
+ if( ALWAYS(pExpr) && pExpr->op==TK_ID ){
+ /* The value of a generated column needs to be a real expression, not
+ ** just a reference to another column, in order for covering index
+ ** optimizations to work correctly. So if the value is not an expression,
+ ** turn it into one by adding a unary "+" operator. */
+ pExpr = sqlite3PExpr(pParse, TK_UPLUS, pExpr, 0);
+ }
+ if( pExpr && pExpr->op!=TK_RAISE ) pExpr->affExpr = pCol->affinity;
+ sqlite3ColumnSetExpr(pParse, pTab, pCol, pExpr);
pExpr = 0;
goto generated_done;
generated_error:
sqlite3ErrorMsg(pParse, "error in generated column \"%s\"",
- pCol->zName);
+ pCol->zCnName);
generated_done:
sqlite3ExprDelete(pParse->db, pExpr);
#else
@@ -114365,7 +120297,7 @@ static char *createTableStmt(sqlite3 *db, Table *p){
Column *pCol;
n = 0;
for(pCol = p->aCol, i=0; i<p->nCol; i++, pCol++){
- n += identLength(pCol->zName) + 5;
+ n += identLength(pCol->zCnName) + 5;
}
n += identLength(p->zName);
if( n<50 ){
@@ -114393,7 +120325,8 @@ static char *createTableStmt(sqlite3 *db, Table *p){
/* SQLITE_AFF_TEXT */ " TEXT",
/* SQLITE_AFF_NUMERIC */ " NUM",
/* SQLITE_AFF_INTEGER */ " INT",
- /* SQLITE_AFF_REAL */ " REAL"
+ /* SQLITE_AFF_REAL */ " REAL",
+ /* SQLITE_AFF_FLEXNUM */ " NUM",
};
int len;
const char *zType;
@@ -114401,7 +120334,7 @@ static char *createTableStmt(sqlite3 *db, Table *p){
sqlite3_snprintf(n-k, &zStmt[k], zSep);
k += sqlite3Strlen30(&zStmt[k]);
zSep = zSep2;
- identPut(zStmt, &k, pCol->zName);
+ identPut(zStmt, &k, pCol->zCnName);
assert( pCol->affinity-SQLITE_AFF_BLOB >= 0 );
assert( pCol->affinity-SQLITE_AFF_BLOB < ArraySize(azType) );
testcase( pCol->affinity==SQLITE_AFF_BLOB );
@@ -114409,10 +120342,12 @@ static char *createTableStmt(sqlite3 *db, Table *p){
testcase( pCol->affinity==SQLITE_AFF_NUMERIC );
testcase( pCol->affinity==SQLITE_AFF_INTEGER );
testcase( pCol->affinity==SQLITE_AFF_REAL );
+ testcase( pCol->affinity==SQLITE_AFF_FLEXNUM );
zType = azType[pCol->affinity - SQLITE_AFF_BLOB];
len = sqlite3Strlen30(zType);
assert( pCol->affinity==SQLITE_AFF_BLOB
+ || pCol->affinity==SQLITE_AFF_FLEXNUM
|| pCol->affinity==sqlite3AffinityType(zType, 0) );
memcpy(&zStmt[k], zType, len);
k += len;
@@ -114485,7 +120420,6 @@ static void estimateIndexWidth(Index *pIdx){
*/
static int hasColumn(const i16 *aiCol, int nCol, int x){
while( nCol-- > 0 ){
- assert( aiCol[0]>=0 );
if( x==*(aiCol++) ){
return 1;
}
@@ -114530,7 +120464,8 @@ static int isDupColumn(Index *pIdx, int nKey, Index *pPk, int iCol){
/* Recompute the colNotIdxed field of the Index.
**
** colNotIdxed is a bitmask that has a 0 bit representing each indexed
-** columns that are within the first 63 columns of the table. The
+** columns that are within the first 63 columns of the table and a 1 for
+** all other bits (all columns that are not in the index). The
** high-order bit of colNotIdxed is always 1. All unindexed columns
** of the table have a 1.
**
@@ -114558,7 +120493,7 @@ static void recomputeColumnsNotIndexed(Index *pIdx){
}
}
pIdx->colNotIdxed = ~m;
- assert( (pIdx->colNotIdxed>>63)==1 );
+ assert( (pIdx->colNotIdxed>>63)==1 ); /* See note-20221022-a */
}
/*
@@ -114598,7 +120533,9 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
*/
if( !db->init.imposterTable ){
for(i=0; i<pTab->nCol; i++){
- if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 ){
+ if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0
+ && (pTab->aCol[i].notNull==OE_None)
+ ){
pTab->aCol[i].notNull = OE_Abort;
}
}
@@ -114620,7 +120557,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
if( pTab->iPKey>=0 ){
ExprList *pList;
Token ipkToken;
- sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zName);
+ sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zCnName);
pList = sqlite3ExprListAppend(pParse, 0,
sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0));
if( pList==0 ){
@@ -114630,15 +120567,16 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
if( IN_RENAME_OBJECT ){
sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey);
}
- pList->a[0].sortFlags = pParse->iPkSortOrder;
+ pList->a[0].fg.sortFlags = pParse->iPkSortOrder;
assert( pParse->pNewTable==pTab );
pTab->iPKey = -1;
sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0,
SQLITE_IDXTYPE_PRIMARYKEY);
- if( db->mallocFailed || pParse->nErr ){
+ if( pParse->nErr ){
pTab->tabFlags &= ~TF_WithoutRowid;
return;
}
+ assert( db->mallocFailed==0 );
pPk = sqlite3PrimaryKeyIndex(pTab);
assert( pPk->nKeyCol==1 );
}else{
@@ -114750,7 +120688,7 @@ SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *
nName = sqlite3Strlen30(pTab->zName);
if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0;
if( zName[nName]!='_' ) return 0;
- pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]);
+ pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->u.vtab.azArg[0]);
if( pMod==0 ) return 0;
if( pMod->pModule->iVersion<3 ) return 0;
if( pMod->pModule->xShadowName==0 ) return 0;
@@ -114760,6 +120698,41 @@ SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *
#ifndef SQLITE_OMIT_VIRTUALTABLE
/*
+** Table pTab is a virtual table. If it the virtual table implementation
+** exists and has an xShadowName method, then loop over all other ordinary
+** tables within the same schema looking for shadow tables of pTab, and mark
+** any shadow tables seen using the TF_Shadow flag.
+*/
+SQLITE_PRIVATE void sqlite3MarkAllShadowTablesOf(sqlite3 *db, Table *pTab){
+ int nName; /* Length of pTab->zName */
+ Module *pMod; /* Module for the virtual table */
+ HashElem *k; /* For looping through the symbol table */
+
+ assert( IsVirtual(pTab) );
+ pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->u.vtab.azArg[0]);
+ if( pMod==0 ) return;
+ if( NEVER(pMod->pModule==0) ) return;
+ if( pMod->pModule->iVersion<3 ) return;
+ if( pMod->pModule->xShadowName==0 ) return;
+ assert( pTab->zName!=0 );
+ nName = sqlite3Strlen30(pTab->zName);
+ for(k=sqliteHashFirst(&pTab->pSchema->tblHash); k; k=sqliteHashNext(k)){
+ Table *pOther = sqliteHashData(k);
+ assert( pOther->zName!=0 );
+ if( !IsOrdinaryTable(pOther) ) continue;
+ if( pOther->tabFlags & TF_Shadow ) continue;
+ if( sqlite3StrNICmp(pOther->zName, pTab->zName, nName)==0
+ && pOther->zName[nName]=='_'
+ && pMod->pModule->xShadowName(pOther->zName+nName+1)
+ ){
+ pOther->tabFlags |= TF_Shadow;
+ }
+ }
+}
+#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
+
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+/*
** Return true if zName is a shadow table name in the current database
** connection.
**
@@ -114789,6 +120762,7 @@ SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){
** not pass them into code generator routines by mistake.
*/
static int markImmutableExprStep(Walker *pWalker, Expr *pExpr){
+ (void)pWalker;
ExprSetVVAProperty(pExpr, EP_Immutable);
return WRC_Continue;
}
@@ -114831,7 +120805,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
Parse *pParse, /* Parse context */
Token *pCons, /* The ',' token after the last column defn. */
Token *pEnd, /* The ')' before options in the CREATE TABLE */
- u8 tabOpts, /* Extra table options. Usually 0. */
+ u32 tabOpts, /* Extra table options. Usually 0. */
Select *pSelect /* Select from a "CREATE ... AS SELECT" */
){
Table *p; /* The new table */
@@ -114859,7 +120833,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
** table itself. So mark it read-only.
*/
if( db->init.busy ){
- if( pSelect ){
+ if( pSelect || (!IsOrdinaryTable(p) && db->init.newTnum) ){
sqlite3ErrorMsg(pParse, "");
return;
}
@@ -114867,6 +120841,44 @@ SQLITE_PRIVATE void sqlite3EndTable(
if( p->tnum==1 ) p->tabFlags |= TF_Readonly;
}
+ /* Special processing for tables that include the STRICT keyword:
+ **
+ ** * Do not allow custom column datatypes. Every column must have
+ ** a datatype that is one of INT, INTEGER, REAL, TEXT, or BLOB.
+ **
+ ** * If a PRIMARY KEY is defined, other than the INTEGER PRIMARY KEY,
+ ** then all columns of the PRIMARY KEY must have a NOT NULL
+ ** constraint.
+ */
+ if( tabOpts & TF_Strict ){
+ int ii;
+ p->tabFlags |= TF_Strict;
+ for(ii=0; ii<p->nCol; ii++){
+ Column *pCol = &p->aCol[ii];
+ if( pCol->eCType==COLTYPE_CUSTOM ){
+ if( pCol->colFlags & COLFLAG_HASTYPE ){
+ sqlite3ErrorMsg(pParse,
+ "unknown datatype for %s.%s: \"%s\"",
+ p->zName, pCol->zCnName, sqlite3ColumnType(pCol, "")
+ );
+ }else{
+ sqlite3ErrorMsg(pParse, "missing datatype for %s.%s",
+ p->zName, pCol->zCnName);
+ }
+ return;
+ }else if( pCol->eCType==COLTYPE_ANY ){
+ pCol->affinity = SQLITE_AFF_BLOB;
+ }
+ if( (pCol->colFlags & COLFLAG_PRIMKEY)!=0
+ && p->iPKey!=ii
+ && pCol->notNull == OE_None
+ ){
+ pCol->notNull = OE_Abort;
+ p->tabFlags |= TF_HasNotNull;
+ }
+ }
+ }
+
assert( (p->tabFlags & TF_HasPrimaryKey)==0
|| p->iPKey>=0 || sqlite3PrimaryKeyIndex(p)!=0 );
assert( (p->tabFlags & TF_HasPrimaryKey)!=0
@@ -114911,7 +120923,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
for(ii=0; ii<p->nCol; ii++){
u32 colFlags = p->aCol[ii].colFlags;
if( (colFlags & COLFLAG_GENERATED)!=0 ){
- Expr *pX = p->aCol[ii].pDflt;
+ Expr *pX = sqlite3ColumnExpr(p, &p->aCol[ii]);
testcase( colFlags & COLFLAG_VIRTUAL );
testcase( colFlags & COLFLAG_STORED );
if( sqlite3ResolveSelfReference(pParse, p, NC_GenCol, pX, 0) ){
@@ -114921,8 +120933,8 @@ SQLITE_PRIVATE void sqlite3EndTable(
** tree that have been allocated from lookaside memory, which is
** illegal in a schema and will lead to errors or heap corruption
** when the database connection closes. */
- sqlite3ExprDelete(db, pX);
- p->aCol[ii].pDflt = sqlite3ExprAlloc(db, TK_NULL, 0, 0);
+ sqlite3ColumnSetExpr(pParse, p, &p->aCol[ii],
+ sqlite3ExprAlloc(db, TK_NULL, 0, 0));
}
}else{
nNG++;
@@ -114962,7 +120974,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
/*
** Initialize zType for the new view or table.
*/
- if( p->pSelect==0 ){
+ if( IsOrdinaryTable(p) ){
/* A regular table */
zType = "table";
zType2 = "TABLE";
@@ -114996,6 +121008,11 @@ SQLITE_PRIVATE void sqlite3EndTable(
int addrInsLoop; /* Top of the loop for inserting rows */
Table *pSelTab; /* A table that describes the SELECT results */
+ if( IN_SPECIAL_PARSE ){
+ pParse->rc = SQLITE_ERROR;
+ pParse->nErr++;
+ return;
+ }
regYield = ++pParse->nMem;
regRec = ++pParse->nMem;
regRowid = ++pParse->nMem;
@@ -115048,7 +121065,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
** the information we've collected.
*/
sqlite3NestedParse(pParse,
- "UPDATE %Q." DFLT_SCHEMA_TABLE
+ "UPDATE %Q." LEGACY_SCHEMA_TABLE
" SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q"
" WHERE rowid=#%d",
db->aDb[iDb].zDbSName,
@@ -115112,12 +121129,12 @@ SQLITE_PRIVATE void sqlite3EndTable(
}
#ifndef SQLITE_OMIT_ALTERTABLE
- if( !pSelect && !p->pSelect ){
+ if( !pSelect && IsOrdinaryTable(p) ){
assert( pCons && pEnd );
if( pCons->z==0 ){
pCons = pEnd;
}
- p->addColOffset = 13 + (int)(pCons->z - pParse->sNameToken.z);
+ p->u.tab.addColOffset = 13 + (int)(pCons->z - pParse->sNameToken.z);
}
#endif
}
@@ -115174,12 +121191,13 @@ SQLITE_PRIVATE void sqlite3CreateView(
*/
pSelect->selFlags |= SF_View;
if( IN_RENAME_OBJECT ){
- p->pSelect = pSelect;
+ p->u.view.pSelect = pSelect;
pSelect = 0;
}else{
- p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
+ p->u.view.pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
}
p->pCheck = sqlite3ExprListDup(db, pCNames, EXPRDUP_REDUCE);
+ p->eTabType = TABTYP_VIEW;
if( db->mallocFailed ) goto create_view_fail;
/* Locate the end of the CREATE VIEW statement. Make sEnd point to
@@ -115217,11 +121235,10 @@ create_view_fail:
** the columns of the view in the pTable structure. Return the number
** of errors. If an error is seen leave an error message in pParse->zErrMsg.
*/
-SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
+static SQLITE_NOINLINE int viewGetColumnNames(Parse *pParse, Table *pTable){
Table *pSelTab; /* A fake table from which we get the result set */
Select *pSel; /* Copy of the SELECT that implements the view */
int nErr = 0; /* Number of errors encountered */
- int n; /* Temporarily holds the number of cursors assigned */
sqlite3 *db = pParse->db; /* Database connection for malloc errors */
#ifndef SQLITE_OMIT_VIRTUALTABLE
int rc;
@@ -115233,20 +121250,20 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
assert( pTable );
#ifndef SQLITE_OMIT_VIRTUALTABLE
- db->nSchemaLock++;
- rc = sqlite3VtabCallConnect(pParse, pTable);
- db->nSchemaLock--;
- if( rc ){
- return 1;
+ if( IsVirtual(pTable) ){
+ db->nSchemaLock++;
+ rc = sqlite3VtabCallConnect(pParse, pTable);
+ db->nSchemaLock--;
+ return rc;
}
- if( IsVirtual(pTable) ) return 0;
#endif
#ifndef SQLITE_OMIT_VIEW
/* A positive nCol means the columns names for this view are
- ** already known.
+ ** already known. This routine is not called unless either the
+ ** table is virtual or nCol is zero.
*/
- if( pTable->nCol>0 ) return 0;
+ assert( pTable->nCol<=0 );
/* A negative nCol is a special marker meaning that we are currently
** trying to compute the column names. If we enter this routine with
@@ -115276,12 +121293,13 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
** to be permanent. So the computation is done on a copy of the SELECT
** statement that defines the view.
*/
- assert( pTable->pSelect );
- pSel = sqlite3SelectDup(db, pTable->pSelect, 0);
+ assert( IsView(pTable) );
+ pSel = sqlite3SelectDup(db, pTable->u.view.pSelect, 0);
if( pSel ){
u8 eParseMode = pParse->eParseMode;
+ int nTab = pParse->nTab;
+ int nSelect = pParse->nSelect;
pParse->eParseMode = PARSE_MODE_NORMAL;
- n = pParse->nTab;
sqlite3SrcListAssignCursors(pParse, pSel->pSrc);
pTable->nCol = -1;
DisableLookaside;
@@ -115293,7 +121311,8 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
#else
pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE);
#endif
- pParse->nTab = n;
+ pParse->nTab = nTab;
+ pParse->nSelect = nSelect;
if( pSelTab==0 ){
pTable->nCol = 0;
nErr++;
@@ -115306,12 +121325,11 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
*/
sqlite3ColumnsFromExprList(pParse, pTable->pCheck,
&pTable->nCol, &pTable->aCol);
- if( db->mallocFailed==0
- && pParse->nErr==0
+ if( pParse->nErr==0
&& pTable->nCol==pSel->pEList->nExpr
){
- sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel,
- SQLITE_AFF_NONE);
+ assert( db->mallocFailed==0 );
+ sqlite3SubqueryColumnTypes(pParse, pTable, pSel, SQLITE_AFF_NONE);
}
}else{
/* CREATE VIEW name AS... without an argument list. Construct
@@ -115336,12 +121354,15 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
pTable->pSchema->schemaFlags |= DB_UnresetViews;
if( db->mallocFailed ){
sqlite3DeleteColumnNames(db, pTable);
- pTable->aCol = 0;
- pTable->nCol = 0;
}
#endif /* SQLITE_OMIT_VIEW */
return nErr;
}
+SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
+ assert( pTable!=0 );
+ if( !IsVirtual(pTable) && pTable->nCol>0 ) return 0;
+ return viewGetColumnNames(pParse, pTable);
+}
#endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */
#ifndef SQLITE_OMIT_VIEW
@@ -115354,10 +121375,8 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){
if( !DbHasProperty(db, idx, DB_UnresetViews) ) return;
for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){
Table *pTab = sqliteHashData(i);
- if( pTab->pSelect ){
+ if( IsView(pTab) ){
sqlite3DeleteColumnNames(db, pTab);
- pTab->aCol = 0;
- pTab->nCol = 0;
}
}
DbClearProperty(db, idx, DB_UnresetViews);
@@ -115431,7 +121450,7 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){
** token for additional information.
*/
sqlite3NestedParse(pParse,
- "UPDATE %Q." DFLT_SCHEMA_TABLE
+ "UPDATE %Q." LEGACY_SCHEMA_TABLE
" SET rootpage=%d WHERE #%d AND rootpage=#%d",
pParse->db->aDb[iDb].zDbSName, iTable, r1, r1);
#endif
@@ -115566,7 +121585,7 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in
** database.
*/
sqlite3NestedParse(pParse,
- "DELETE FROM %Q." DFLT_SCHEMA_TABLE
+ "DELETE FROM %Q." LEGACY_SCHEMA_TABLE
" WHERE tbl_name=%Q and type!='trigger'",
pDb->zDbSName, pTab->zName);
if( !isView && !IsVirtual(pTab) ){
@@ -115594,6 +121613,7 @@ SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db){
if( (db->flags & SQLITE_Defensive)!=0
&& db->pVtabCtx==0
&& db->nVdbeExec==0
+ && !sqlite3VtabInSync(db)
){
return 1;
}
@@ -115613,6 +121633,9 @@ static int tableMayNotBeDropped(sqlite3 *db, Table *pTab){
if( (pTab->tabFlags & TF_Shadow)!=0 && sqlite3ReadOnlyShadowTables(db) ){
return 1;
}
+ if( pTab->tabFlags & TF_Eponymous ){
+ return 1;
+ }
return 0;
}
@@ -115697,11 +121720,11 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView,
/* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used
** on a table.
*/
- if( isView && pTab->pSelect==0 ){
+ if( isView && !IsView(pTab) ){
sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName);
goto exit_drop_table;
}
- if( !isView && pTab->pSelect ){
+ if( !isView && IsView(pTab) ){
sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName);
goto exit_drop_table;
}
@@ -115752,7 +121775,7 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
FKey *pFKey = 0;
FKey *pNextTo;
Table *p = pParse->pNewTable;
- int nByte;
+ i64 nByte;
int i;
int nCol;
char *z;
@@ -115765,7 +121788,7 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
if( pToCol && pToCol->nExpr!=1 ){
sqlite3ErrorMsg(pParse, "foreign key on %s"
" should reference only one column of table %T",
- p->aCol[iCol].zName, pTo);
+ p->aCol[iCol].zCnName, pTo);
goto fk_end;
}
nCol = 1;
@@ -115788,7 +121811,8 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
goto fk_end;
}
pFKey->pFrom = p;
- pFKey->pNextFrom = p->pFKey;
+ assert( IsOrdinaryTable(p) );
+ pFKey->pNextFrom = p->u.tab.pFKey;
z = (char*)&pFKey->aCol[nCol];
pFKey->zTo = z;
if( IN_RENAME_OBJECT ){
@@ -115805,7 +121829,7 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
for(i=0; i<nCol; i++){
int j;
for(j=0; j<p->nCol; j++){
- if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zEName)==0 ){
+ if( sqlite3StrICmp(p->aCol[j].zCnName, pFromCol->a[i].zEName)==0 ){
pFKey->aCol[i].iFrom = j;
break;
}
@@ -115853,7 +121877,8 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
/* Link the foreign key to the table as the last step.
*/
- p->pFKey = pFKey;
+ assert( IsOrdinaryTable(p) );
+ p->u.tab.pFKey = pFKey;
pFKey = 0;
fk_end:
@@ -115874,7 +121899,9 @@ SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
#ifndef SQLITE_OMIT_FOREIGN_KEY
Table *pTab;
FKey *pFKey;
- if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return;
+ if( (pTab = pParse->pNewTable)==0 ) return;
+ if( NEVER(!IsOrdinaryTable(pTab)) ) return;
+ if( (pFKey = pTab->u.tab.pFKey)==0 ) return;
assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */
pFKey->isDeferred = (u8)isDeferred;
#endif
@@ -115924,7 +121951,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
tnum = pIndex->tnum;
}
pKey = sqlite3KeyInfoOfIndex(pParse, pIndex);
- assert( pKey!=0 || db->mallocFailed || pParse->nErr );
+ assert( pKey!=0 || pParse->nErr );
/* Open the sorter cursor if we are to use one. */
iSorter = pParse->nTab++;
@@ -116034,8 +122061,8 @@ SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){
if( pList ){
int i;
for(i=0; i<pList->nExpr; i++){
- if( pList->a[i].bNulls ){
- u8 sf = pList->a[i].sortFlags;
+ if( pList->a[i].fg.bNulls ){
+ u8 sf = pList->a[i].fg.sortFlags;
sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s",
(sf==0 || sf==3) ? "FIRST" : "LAST"
);
@@ -116088,9 +122115,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
char *zExtra = 0; /* Extra space after the Index object */
Index *pPk = 0; /* PRIMARY KEY index for WITHOUT ROWID tables */
- if( db->mallocFailed || pParse->nErr>0 ){
+ assert( db->pParse==pParse );
+ if( pParse->nErr ){
goto exit_create_index;
}
+ assert( db->mallocFailed==0 );
if( IN_DECLARE_VTAB && idxType!=SQLITE_IDXTYPE_PRIMARYKEY ){
goto exit_create_index;
}
@@ -116154,7 +122183,6 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
pDb = &db->aDb[iDb];
assert( pTab!=0 );
- assert( pParse->nErr==0 );
if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0
&& db->init.busy==0
&& pTblName!=0
@@ -116166,7 +122194,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
goto exit_create_index;
}
#ifndef SQLITE_OMIT_VIEW
- if( pTab->pSelect ){
+ if( IsView(pTab) ){
sqlite3ErrorMsg(pParse, "views may not be indexed");
goto exit_create_index;
}
@@ -116200,7 +122228,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
}
if( !IN_RENAME_OBJECT ){
if( !db->init.busy ){
- if( sqlite3FindTable(db, zName, 0)!=0 ){
+ if( sqlite3FindTable(db, zName, pDb->zDbSName)!=0 ){
sqlite3ErrorMsg(pParse, "there is already a table named %s", zName);
goto exit_create_index;
}
@@ -116257,7 +122285,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
Token prevCol;
Column *pCol = &pTab->aCol[pTab->nCol-1];
pCol->colFlags |= COLFLAG_UNIQUE;
- sqlite3TokenInit(&prevCol, pCol->zName);
+ sqlite3TokenInit(&prevCol, pCol->zCnName);
pList = sqlite3ExprListAppend(pParse, 0,
sqlite3ExprAlloc(db, TK_ID, &prevCol, 0));
if( pList==0 ) goto exit_create_index;
@@ -116275,6 +122303,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
Expr *pExpr = pList->a[i].pExpr;
assert( pExpr!=0 );
if( pExpr->op==TK_COLLATE ){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken));
}
}
@@ -116352,6 +122381,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
j = XN_EXPR;
pIndex->aiColumn[i] = XN_EXPR;
pIndex->uniqNotNull = 0;
+ pIndex->bHasExpr = 1;
}else{
j = pCExpr->iColumn;
assert( j<=0x7fff );
@@ -116363,6 +122393,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
}
if( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ){
pIndex->bHasVCol = 1;
+ pIndex->bHasExpr = 1;
}
}
pIndex->aiColumn[i] = (i16)j;
@@ -116370,6 +122401,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
zColl = 0;
if( pListItem->pExpr->op==TK_COLLATE ){
int nColl;
+ assert( !ExprHasProperty(pListItem->pExpr, EP_IntValue) );
zColl = pListItem->pExpr->u.zToken;
nColl = sqlite3Strlen30(zColl) + 1;
assert( nExtra>=nColl );
@@ -116378,14 +122410,14 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
zExtra += nColl;
nExtra -= nColl;
}else if( j>=0 ){
- zColl = pTab->aCol[j].zColl;
+ zColl = sqlite3ColumnColl(&pTab->aCol[j]);
}
if( !zColl ) zColl = sqlite3StrBINARY;
if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){
goto exit_create_index;
}
pIndex->azColl[i] = zColl;
- requestedSortOrder = pListItem->sortFlags & sortOrderMask;
+ requestedSortOrder = pListItem->fg.sortFlags & sortOrderMask;
pIndex->aSortOrder[i] = (u8)requestedSortOrder;
}
@@ -116576,13 +122608,13 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
/* Add an entry in sqlite_schema for this index
*/
sqlite3NestedParse(pParse,
- "INSERT INTO %Q." DFLT_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);",
- db->aDb[iDb].zDbSName,
- pIndex->zName,
- pTab->zName,
- iMem,
- zStmt
- );
+ "INSERT INTO %Q." LEGACY_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);",
+ db->aDb[iDb].zDbSName,
+ pIndex->zName,
+ pTab->zName,
+ iMem,
+ zStmt
+ );
sqlite3DbFree(db, zStmt);
/* Fill the index with data and reparse the schema. Code an OP_Expire
@@ -116618,7 +122650,7 @@ exit_create_index:
** The list was already ordered when this routine was entered, so at this
** point at most a single index (the newly added index) will be out of
** order. So we have to reorder at most one index. */
- Index **ppFrom = &pTab->pIndex;
+ Index **ppFrom;
Index *pThis;
for(ppFrom=&pTab->pIndex; (pThis = *ppFrom)!=0; ppFrom=&pThis->pNext){
Index *pNext;
@@ -116716,10 +122748,10 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists
sqlite3 *db = pParse->db;
int iDb;
- assert( pParse->nErr==0 ); /* Never called with prior errors */
if( db->mallocFailed ){
goto exit_drop_index;
}
+ assert( pParse->nErr==0 ); /* Never called with prior non-OOM errors */
assert( pName->nSrc==1 );
if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
goto exit_drop_index;
@@ -116762,7 +122794,7 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists
if( v ){
sqlite3BeginWriteOperation(pParse, 1, iDb);
sqlite3NestedParse(pParse,
- "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='index'",
+ "DELETE FROM %Q." LEGACY_SCHEMA_TABLE " WHERE name=%Q AND type='index'",
db->aDb[iDb].zDbSName, pIndex->zName
);
sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName);
@@ -116828,18 +122860,17 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token *
if( pList==0 ){
pList = sqlite3DbMallocZero(db, sizeof(IdList) );
if( pList==0 ) return 0;
+ }else{
+ IdList *pNew;
+ pNew = sqlite3DbRealloc(db, pList,
+ sizeof(IdList) + pList->nId*sizeof(pList->a));
+ if( pNew==0 ){
+ sqlite3IdListDelete(db, pList);
+ return 0;
+ }
+ pList = pNew;
}
- pList->a = sqlite3ArrayAllocate(
- db,
- pList->a,
- sizeof(pList->a[0]),
- &pList->nId,
- &i
- );
- if( i<0 ){
- sqlite3IdListDelete(db, pList);
- return 0;
- }
+ i = pList->nId++;
pList->a[i].zName = sqlite3NameFromToken(db, pToken);
if( IN_RENAME_OBJECT && pList->a[i].zName ){
sqlite3RenameTokenMap(pParse, (void*)pList->a[i].zName, pToken);
@@ -116852,12 +122883,13 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token *
*/
SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){
int i;
+ assert( db!=0 );
if( pList==0 ) return;
+ assert( pList->eU4!=EU4_EXPR ); /* EU4_EXPR mode is not currently used */
for(i=0; i<pList->nId; i++){
sqlite3DbFree(db, pList->a[i].zName);
}
- sqlite3DbFree(db, pList->a);
- sqlite3DbFreeNN(db, pList);
+ sqlite3DbNNFreeNN(db, pList);
}
/*
@@ -116866,7 +122898,7 @@ SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){
*/
SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){
int i;
- if( pList==0 ) return -1;
+ assert( pList!=0 );
for(i=0; i<pList->nId; i++){
if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i;
}
@@ -117060,19 +123092,23 @@ SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
int i;
SrcItem *pItem;
+ assert( db!=0 );
if( pList==0 ) return;
for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){
- if( pItem->zDatabase ) sqlite3DbFreeNN(db, pItem->zDatabase);
- sqlite3DbFree(db, pItem->zName);
- if( pItem->zAlias ) sqlite3DbFreeNN(db, pItem->zAlias);
+ if( pItem->zDatabase ) sqlite3DbNNFreeNN(db, pItem->zDatabase);
+ if( pItem->zName ) sqlite3DbNNFreeNN(db, pItem->zName);
+ if( pItem->zAlias ) sqlite3DbNNFreeNN(db, pItem->zAlias);
if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy);
if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg);
sqlite3DeleteTable(db, pItem->pTab);
if( pItem->pSelect ) sqlite3SelectDelete(db, pItem->pSelect);
- if( pItem->pOn ) sqlite3ExprDelete(db, pItem->pOn);
- if( pItem->pUsing ) sqlite3IdListDelete(db, pItem->pUsing);
+ if( pItem->fg.isUsing ){
+ sqlite3IdListDelete(db, pItem->u3.pUsing);
+ }else if( pItem->u3.pOn ){
+ sqlite3ExprDelete(db, pItem->u3.pOn);
+ }
}
- sqlite3DbFreeNN(db, pList);
+ sqlite3DbNNFreeNN(db, pList);
}
/*
@@ -117098,14 +123134,13 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(
Token *pDatabase, /* Name of the database containing pTable */
Token *pAlias, /* The right-hand side of the AS subexpression */
Select *pSubquery, /* A subquery used in place of a table name */
- Expr *pOn, /* The ON clause of a join */
- IdList *pUsing /* The USING clause of a join */
+ OnOrUsing *pOnUsing /* Either the ON clause or the USING clause */
){
SrcItem *pItem;
sqlite3 *db = pParse->db;
- if( !p && (pOn || pUsing) ){
+ if( !p && pOnUsing!=0 && (pOnUsing->pOn || pOnUsing->pUsing) ){
sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s",
- (pOn ? "ON" : "USING")
+ (pOnUsing->pOn ? "ON" : "USING")
);
goto append_from_error;
}
@@ -117125,15 +123160,27 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(
if( pAlias->n ){
pItem->zAlias = sqlite3NameFromToken(db, pAlias);
}
- pItem->pSelect = pSubquery;
- pItem->pOn = pOn;
- pItem->pUsing = pUsing;
+ if( pSubquery ){
+ pItem->pSelect = pSubquery;
+ if( pSubquery->selFlags & SF_NestedFrom ){
+ pItem->fg.isNestedFrom = 1;
+ }
+ }
+ assert( pOnUsing==0 || pOnUsing->pOn==0 || pOnUsing->pUsing==0 );
+ assert( pItem->fg.isUsing==0 );
+ if( pOnUsing==0 ){
+ pItem->u3.pOn = 0;
+ }else if( pOnUsing->pUsing ){
+ pItem->fg.isUsing = 1;
+ pItem->u3.pUsing = pOnUsing->pUsing;
+ }else{
+ pItem->u3.pOn = pOnUsing->pOn;
+ }
return p;
- append_from_error:
+append_from_error:
assert( p==0 );
- sqlite3ExprDelete(db, pOn);
- sqlite3IdListDelete(db, pUsing);
+ sqlite3ClearOnOrUsing(db, pOnUsing);
sqlite3SelectDelete(db, pSubquery);
return 0;
}
@@ -117158,6 +123205,7 @@ SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pI
}else{
pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy);
pItem->fg.isIndexedBy = 1;
+ assert( pItem->fg.isCte==0 ); /* No collision on union u2 */
}
}
}
@@ -117177,6 +123225,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, Src
p1 = pNew;
memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(SrcItem));
sqlite3DbFree(pParse->db, p2);
+ p1->a[0].fg.jointype |= (JT_LTORJ & p1->a[1].fg.jointype);
}
}
return p1;
@@ -117213,14 +123262,34 @@ SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList *
** The operator is "natural cross join". The A and B operands are stored
** in p->a[0] and p->a[1], respectively. The parser initially stores the
** operator with A. This routine shifts that operator over to B.
+**
+** Additional changes:
+**
+** * All tables to the left of the right-most RIGHT JOIN are tagged with
+** JT_LTORJ (mnemonic: Left Table Of Right Join) so that the
+** code generator can easily tell that the table is part of
+** the left operand of at least one RIGHT JOIN.
*/
-SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList *p){
- if( p ){
- int i;
- for(i=p->nSrc-1; i>0; i--){
- p->a[i].fg.jointype = p->a[i-1].fg.jointype;
- }
+SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse *pParse, SrcList *p){
+ (void)pParse;
+ if( p && p->nSrc>1 ){
+ int i = p->nSrc-1;
+ u8 allFlags = 0;
+ do{
+ allFlags |= p->a[i].fg.jointype = p->a[i-1].fg.jointype;
+ }while( (--i)>0 );
p->a[0].fg.jointype = 0;
+
+ /* All terms to the left of a RIGHT JOIN should be tagged with the
+ ** JT_LTORJ flags */
+ if( allFlags & JT_RIGHT ){
+ for(i=p->nSrc-1; ALWAYS(i>0) && (p->a[i].fg.jointype&JT_RIGHT)==0; i--){}
+ i--;
+ assert( i>=0 );
+ do{
+ p->a[i].fg.jointype |= JT_LTORJ;
+ }while( (--i)>=0 );
+ }
}
}
@@ -117470,7 +123539,7 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint(
for(j=0; j<pIdx->nKeyCol; j++){
char *zCol;
assert( pIdx->aiColumn[j]>=0 );
- zCol = pTab->aCol[pIdx->aiColumn[j]].zName;
+ zCol = pTab->aCol[pIdx->aiColumn[j]].zCnName;
if( j ) sqlite3_str_append(&errMsg, ", ", 2);
sqlite3_str_appendall(&errMsg, pTab->zName);
sqlite3_str_append(&errMsg, ".", 1);
@@ -117497,7 +123566,7 @@ SQLITE_PRIVATE void sqlite3RowidConstraint(
int rc;
if( pTab->iPKey>=0 ){
zMsg = sqlite3MPrintf(pParse->db, "%s.%s", pTab->zName,
- pTab->aCol[pTab->iPKey].zName);
+ pTab->aCol[pTab->iPKey].zCnName);
rc = SQLITE_CONSTRAINT_PRIMARYKEY;
}else{
zMsg = sqlite3MPrintf(pParse->db, "%s.rowid", pTab->zName);
@@ -117986,6 +124055,7 @@ SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8 enc){
** strings is BINARY.
*/
db->pDfltColl = sqlite3FindCollSeq(db, enc, sqlite3StrBINARY, 0);
+ sqlite3ExpirePreparedStatements(db, 1);
}
/*
@@ -118138,6 +124208,7 @@ SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch(
){
FuncDef *p;
for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){
+ assert( p->funcFlags & SQLITE_FUNC_BUILTIN );
if( sqlite3StrICmp(p->zName, zFunc)==0 ){
return p;
}
@@ -118158,7 +124229,7 @@ SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(
const char *zName = aDef[i].zName;
int nName = sqlite3Strlen30(zName);
int h = SQLITE_FUNC_HASH(zName[0], nName);
- assert( zName[0]>='a' && zName[0]<='z' );
+ assert( aDef[i].funcFlags & SQLITE_FUNC_BUILTIN );
pOther = sqlite3FunctionSearch(h, zName);
if( pOther ){
assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] );
@@ -118290,19 +124361,21 @@ SQLITE_PRIVATE void sqlite3SchemaClear(void *p){
Hash temp2;
HashElem *pElem;
Schema *pSchema = (Schema *)p;
+ sqlite3 xdb;
+ memset(&xdb, 0, sizeof(xdb));
temp1 = pSchema->tblHash;
temp2 = pSchema->trigHash;
sqlite3HashInit(&pSchema->trigHash);
sqlite3HashClear(&pSchema->idxHash);
for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
- sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem));
+ sqlite3DeleteTrigger(&xdb, (Trigger*)sqliteHashData(pElem));
}
sqlite3HashClear(&temp2);
sqlite3HashInit(&pSchema->tblHash);
for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
Table *pTab = sqliteHashData(pElem);
- sqlite3DeleteTable(0, pTab);
+ sqlite3DeleteTable(&xdb, pTab);
}
sqlite3HashClear(&temp1);
sqlite3HashClear(&pSchema->fkeyHash);
@@ -118384,6 +124457,16 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
return pTab;
}
+/* Generate byte-code that will report the number of rows modified
+** by a DELETE, INSERT, or UPDATE statement.
+*/
+SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe *v, int regCounter, const char *zColName){
+ sqlite3VdbeAddOp0(v, OP_FkCheck);
+ sqlite3VdbeAddOp2(v, OP_ResultRow, regCounter, 1);
+ sqlite3VdbeSetNumCols(v, 1);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zColName, SQLITE_STATIC);
+}
+
/* Return true if table pTab is read-only.
**
** A table is read-only if any of the following are true:
@@ -118391,18 +124474,42 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
** 1) It is a virtual table and no implementation of the xUpdate method
** has been provided
**
-** 2) It is a system table (i.e. sqlite_schema), this call is not
+** 2) A trigger is currently being coded and the table is a virtual table
+** that is SQLITE_VTAB_DIRECTONLY or if PRAGMA trusted_schema=OFF and
+** the table is not SQLITE_VTAB_INNOCUOUS.
+**
+** 3) It is a system table (i.e. sqlite_schema), this call is not
** part of a nested parse and writable_schema pragma has not
** been specified
**
-** 3) The table is a shadow table, the database connection is in
+** 4) The table is a shadow table, the database connection is in
** defensive mode, and the current sqlite3_prepare()
** is for a top-level SQL statement.
*/
+static int vtabIsReadOnly(Parse *pParse, Table *pTab){
+ if( sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 ){
+ return 1;
+ }
+
+ /* Within triggers:
+ ** * Do not allow DELETE, INSERT, or UPDATE of SQLITE_VTAB_DIRECTONLY
+ ** virtual tables
+ ** * Only allow DELETE, INSERT, or UPDATE of non-SQLITE_VTAB_INNOCUOUS
+ ** virtual tables if PRAGMA trusted_schema=ON.
+ */
+ if( pParse->pToplevel!=0
+ && pTab->u.vtab.p->eVtabRisk >
+ ((pParse->db->flags & SQLITE_TrustedSchema)!=0)
+ ){
+ sqlite3ErrorMsg(pParse, "unsafe use of virtual table \"%s\"",
+ pTab->zName);
+ }
+ return 0;
+}
static int tabIsReadOnly(Parse *pParse, Table *pTab){
sqlite3 *db;
if( IsVirtual(pTab) ){
- return sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0;
+ return vtabIsReadOnly(pParse, pTab);
}
if( (pTab->tabFlags & (TF_Readonly|TF_Shadow))==0 ) return 0;
db = pParse->db;
@@ -118414,17 +124521,21 @@ static int tabIsReadOnly(Parse *pParse, Table *pTab){
}
/*
-** Check to make sure the given table is writable. If it is not
-** writable, generate an error message and return 1. If it is
-** writable return 0;
+** Check to make sure the given table is writable.
+**
+** If pTab is not writable -> generate an error message and return 1.
+** If pTab is writable but other errors have occurred -> return 1.
+** If pTab is writable and no prior errors -> return 0;
*/
-SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){
+SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, Trigger *pTrigger){
if( tabIsReadOnly(pParse, pTab) ){
sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName);
return 1;
}
#ifndef SQLITE_OMIT_VIEW
- if( !viewOk && pTab->pSelect ){
+ if( IsView(pTab)
+ && (pTrigger==0 || (pTrigger->bReturning && pTrigger->pNext==0))
+ ){
sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName);
return 1;
}
@@ -118458,8 +124569,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView(
assert( pFrom->nSrc==1 );
pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName);
pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName);
- assert( pFrom->a[0].pOn==0 );
- assert( pFrom->a[0].pUsing==0 );
+ assert( pFrom->a[0].fg.isUsing==0 );
+ assert( pFrom->a[0].u3.pOn==0 );
}
pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy,
SF_IncludeHidden, pLimit);
@@ -118528,13 +124639,13 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere(
}else{
Index *pPk = sqlite3PrimaryKeyIndex(pTab);
if( pPk->nKeyCol==1 ){
- const char *zName = pTab->aCol[pPk->aiColumn[0]].zName;
+ const char *zName = pTab->aCol[pPk->aiColumn[0]].zCnName;
pLhs = sqlite3Expr(db, TK_ID, zName);
pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, zName));
}else{
int i;
for(i=0; i<pPk->nKeyCol; i++){
- Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName);
+ Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zCnName);
pEList = sqlite3ExprListAppend(pParse, pEList, p);
}
pLhs = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
@@ -118550,6 +124661,7 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere(
pSelectSrc = sqlite3SrcListDup(db, pSrc, 0);
pSrc->a[0].pTab = pTab;
if( pSrc->a[0].fg.isIndexedBy ){
+ assert( pSrc->a[0].fg.isCte==0 );
pSrc->a[0].u2.pIBIndex = 0;
pSrc->a[0].fg.isIndexedBy = 0;
sqlite3DbFree(db, pSrc->a[0].u1.zIndexedBy);
@@ -118622,12 +124734,13 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
memset(&sContext, 0, sizeof(sContext));
db = pParse->db;
- if( pParse->nErr || db->mallocFailed ){
+ assert( db->pParse==pParse );
+ if( pParse->nErr ){
goto delete_from_cleanup;
}
+ assert( db->mallocFailed==0 );
assert( pTabList->nSrc==1 );
-
/* Locate the table which we want to delete. This table has to be
** put in an SrcList structure because some of the subroutines we
** will be calling are designed to work with multiple tables and expect
@@ -118641,7 +124754,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
*/
#ifndef SQLITE_OMIT_TRIGGER
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
- isView = pTab->pSelect!=0;
+ isView = IsView(pTab);
#else
# define pTrigger 0
# define isView 0
@@ -118652,6 +124765,14 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
# define isView 0
#endif
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x10000 ){
+ sqlite3TreeViewLine(0, "In sqlite3Delete() at %s:%d", __FILE__, __LINE__);
+ sqlite3TreeViewDelete(pParse->pWith, pTabList, pWhere,
+ pOrderBy, pLimit, pTrigger);
+ }
+#endif
+
#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
if( !isView ){
pWhere = sqlite3LimitWhere(
@@ -118668,7 +124789,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
goto delete_from_cleanup;
}
- if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){
+ if( sqlite3IsReadOnly(pParse, pTab, pTrigger) ){
goto delete_from_cleanup;
}
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
@@ -118767,16 +124888,17 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
}
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
assert( pIdx->pSchema==pTab->pSchema );
- sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb);
if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){
- sqlite3VdbeChangeP3(v, -1, memCnt ? memCnt : -1);
+ sqlite3VdbeAddOp3(v, OP_Clear, pIdx->tnum, iDb, memCnt ? memCnt : -1);
+ }else{
+ sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb);
}
}
}else
#endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */
{
u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK;
- if( sNC.ncFlags & NC_VarSelect ) bComplex = 1;
+ if( sNC.ncFlags & NC_Subquery ) bComplex = 1;
wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW);
if( HasRowid(pTab) ){
/* For a rowid table, initialize the RowSet to an empty set */
@@ -118805,7 +124927,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
** ONEPASS_SINGLE: One-pass approach - at most one row deleted.
** ONEPASS_MULTI: One-pass approach - any number of rows may be deleted.
*/
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, wcf, iTabCur+1);
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0,0,wcf,iTabCur+1);
if( pWInfo==0 ) goto delete_from_cleanup;
eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI );
@@ -118891,7 +125013,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
if( eOnePass!=ONEPASS_OFF ){
assert( nKey==nPk ); /* OP_Found will use an unpacked key */
if( !IsVirtual(pTab) && aToOpen[iDataCur-iTabCur] ){
- assert( pPk!=0 || pTab->pSelect!=0 );
+ assert( pPk!=0 || IsView(pTab) );
sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey);
VdbeCoverage(v);
}
@@ -118958,9 +125080,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
** invoke the callback function.
*/
if( memCnt ){
- sqlite3VdbeAddOp2(v, OP_ChngCntRow, memCnt, 1);
- sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC);
+ sqlite3CodeChangeCount(v, memCnt, "rows deleted");
}
delete_from_cleanup:
@@ -118971,7 +125091,7 @@ delete_from_cleanup:
sqlite3ExprListDelete(db, pOrderBy);
sqlite3ExprDelete(db, pLimit);
#endif
- sqlite3DbFree(db, aToOpen);
+ if( aToOpen ) sqlite3DbNNFreeNN(db, aToOpen);
return;
}
/* Make sure "isView" and other macros defined above are undefined. Otherwise
@@ -119125,7 +125245,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete(
** the update-hook is not invoked for rows removed by REPLACE, but the
** pre-update-hook is.
*/
- if( pTab->pSelect==0 ){
+ if( !IsView(pTab) ){
u8 p5 = 0;
sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek);
sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0));
@@ -119411,6 +125531,18 @@ static void typeofFunc(
sqlite3_result_text(context, azType[i], -1, SQLITE_STATIC);
}
+/* subtype(X)
+**
+** Return the subtype of X
+*/
+static void subtypeFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ UNUSED_PARAMETER(argc);
+ sqlite3_result_int(context, sqlite3_value_subtype(argv[0]));
+}
/*
** Implementation of the length() function
@@ -119572,7 +125704,7 @@ endInstrOOM:
}
/*
-** Implementation of the printf() function.
+** Implementation of the printf() (a.k.a. format()) SQL function.
*/
static void printfFunc(
sqlite3_context *context,
@@ -119885,9 +126017,9 @@ static void last_insert_rowid(
/*
** Implementation of the changes() SQL function.
**
-** IMP: R-62073-11209 The changes() SQL function is a wrapper
-** around the sqlite3_changes() C/C++ function and hence follows the same
-** rules for counting changes.
+** IMP: R-32760-32347 The changes() SQL function is a wrapper
+** around the sqlite3_changes64() C/C++ function and hence follows the
+** same rules for counting changes.
*/
static void changes(
sqlite3_context *context,
@@ -119896,12 +126028,12 @@ static void changes(
){
sqlite3 *db = sqlite3_context_db_handle(context);
UNUSED_PARAMETER2(NotUsed, NotUsed2);
- sqlite3_result_int(context, sqlite3_changes(db));
+ sqlite3_result_int64(context, sqlite3_changes64(db));
}
/*
** Implementation of the total_changes() SQL function. The return value is
-** the same as the sqlite3_total_changes() API function.
+** the same as the sqlite3_total_changes64() API function.
*/
static void total_changes(
sqlite3_context *context,
@@ -119910,9 +126042,9 @@ static void total_changes(
){
sqlite3 *db = sqlite3_context_db_handle(context);
UNUSED_PARAMETER2(NotUsed, NotUsed2);
- /* IMP: R-52756-41993 This function is a wrapper around the
- ** sqlite3_total_changes() C/C++ interface. */
- sqlite3_result_int(context, sqlite3_total_changes(db));
+ /* IMP: R-11217-42568 This function is a wrapper around the
+ ** sqlite3_total_changes64() C/C++ interface. */
+ sqlite3_result_int64(context, sqlite3_total_changes64(db));
}
/*
@@ -120042,7 +126174,7 @@ static int patternCompare(
** c but in the other case and search the input string for either
** c or cx.
*/
- if( c<=0x80 ){
+ if( c<0x80 ){
char zStop[3];
int bMatch;
if( noCase ){
@@ -120125,7 +126257,13 @@ static int patternCompare(
** non-zero if there is no match.
*/
SQLITE_API int sqlite3_strglob(const char *zGlobPattern, const char *zString){
- return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '[');
+ if( zString==0 ){
+ return zGlobPattern!=0;
+ }else if( zGlobPattern==0 ){
+ return 1;
+ }else {
+ return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '[');
+ }
}
/*
@@ -120133,7 +126271,13 @@ SQLITE_API int sqlite3_strglob(const char *zGlobPattern, const char *zString){
** a miss - like strcmp().
*/
SQLITE_API int sqlite3_strlike(const char *zPattern, const char *zStr, unsigned int esc){
- return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc);
+ if( zStr==0 ){
+ return zPattern!=0;
+ }else if( zPattern==0 ){
+ return 1;
+ }else{
+ return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc);
+ }
}
/*
@@ -120341,39 +126485,42 @@ static const char hexdigits[] = {
};
/*
-** Implementation of the QUOTE() function. This function takes a single
-** argument. If the argument is numeric, the return value is the same as
-** the argument. If the argument is NULL, the return value is the string
-** "NULL". Otherwise, the argument is enclosed in single quotes with
-** single-quote escapes.
+** Append to pStr text that is the SQL literal representation of the
+** value contained in pValue.
*/
-static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
- assert( argc==1 );
- UNUSED_PARAMETER(argc);
- switch( sqlite3_value_type(argv[0]) ){
+SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum *pStr, sqlite3_value *pValue){
+ /* As currently implemented, the string must be initially empty.
+ ** we might relax this requirement in the future, but that will
+ ** require enhancements to the implementation. */
+ assert( pStr!=0 && pStr->nChar==0 );
+
+ switch( sqlite3_value_type(pValue) ){
case SQLITE_FLOAT: {
double r1, r2;
- char zBuf[50];
- r1 = sqlite3_value_double(argv[0]);
- sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1);
- sqlite3AtoF(zBuf, &r2, 20, SQLITE_UTF8);
- if( r1!=r2 ){
- sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.20e", r1);
+ const char *zVal;
+ r1 = sqlite3_value_double(pValue);
+ sqlite3_str_appendf(pStr, "%!.15g", r1);
+ zVal = sqlite3_str_value(pStr);
+ if( zVal ){
+ sqlite3AtoF(zVal, &r2, pStr->nChar, SQLITE_UTF8);
+ if( r1!=r2 ){
+ sqlite3_str_reset(pStr);
+ sqlite3_str_appendf(pStr, "%!.20e", r1);
+ }
}
- sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
break;
}
case SQLITE_INTEGER: {
- sqlite3_result_value(context, argv[0]);
+ sqlite3_str_appendf(pStr, "%lld", sqlite3_value_int64(pValue));
break;
}
case SQLITE_BLOB: {
- char *zText = 0;
- char const *zBlob = sqlite3_value_blob(argv[0]);
- int nBlob = sqlite3_value_bytes(argv[0]);
- assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
- zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
- if( zText ){
+ char const *zBlob = sqlite3_value_blob(pValue);
+ i64 nBlob = sqlite3_value_bytes(pValue);
+ assert( zBlob==sqlite3_value_blob(pValue) ); /* No encoding change */
+ sqlite3StrAccumEnlarge(pStr, nBlob*2 + 4);
+ if( pStr->accError==0 ){
+ char *zText = pStr->zText;
int i;
for(i=0; i<nBlob; i++){
zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
@@ -120383,43 +126530,49 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
zText[(nBlob*2)+3] = '\0';
zText[0] = 'X';
zText[1] = '\'';
- sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
- sqlite3_free(zText);
+ pStr->nChar = nBlob*2 + 3;
}
break;
}
case SQLITE_TEXT: {
- int i,j;
- u64 n;
- const unsigned char *zArg = sqlite3_value_text(argv[0]);
- char *z;
-
- if( zArg==0 ) return;
- for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
- z = contextMalloc(context, ((i64)i)+((i64)n)+3);
- if( z ){
- z[0] = '\'';
- for(i=0, j=1; zArg[i]; i++){
- z[j++] = zArg[i];
- if( zArg[i]=='\'' ){
- z[j++] = '\'';
- }
- }
- z[j++] = '\'';
- z[j] = 0;
- sqlite3_result_text(context, z, j, sqlite3_free);
- }
+ const unsigned char *zArg = sqlite3_value_text(pValue);
+ sqlite3_str_appendf(pStr, "%Q", zArg);
break;
}
default: {
- assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
- sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
+ assert( sqlite3_value_type(pValue)==SQLITE_NULL );
+ sqlite3_str_append(pStr, "NULL", 4);
break;
}
}
}
/*
+** Implementation of the QUOTE() function.
+**
+** The quote(X) function returns the text of an SQL literal which is the
+** value of its argument suitable for inclusion into an SQL statement.
+** Strings are surrounded by single-quotes with escapes on interior quotes
+** as needed. BLOBs are encoded as hexadecimal literals. Strings with
+** embedded NUL characters cannot be represented as string literals in SQL
+** and hence the returned string literal is truncated prior to the first NUL.
+*/
+static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
+ sqlite3_str str;
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ assert( argc==1 );
+ UNUSED_PARAMETER(argc);
+ sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]);
+ sqlite3QuoteValue(&str,argv[0]);
+ sqlite3_result_text(context, sqlite3StrAccumFinish(&str), str.nChar,
+ SQLITE_DYNAMIC);
+ if( str.accError!=SQLITE_OK ){
+ sqlite3_result_null(context);
+ sqlite3_result_error_code(context, str.accError);
+ }
+}
+
+/*
** The unicode() function. Return the integer unicode code-point value
** for the first character of the input string.
*/
@@ -120505,6 +126658,96 @@ static void hexFunc(
}
/*
+** Buffer zStr contains nStr bytes of utf-8 encoded text. Return 1 if zStr
+** contains character ch, or 0 if it does not.
+*/
+static int strContainsChar(const u8 *zStr, int nStr, u32 ch){
+ const u8 *zEnd = &zStr[nStr];
+ const u8 *z = zStr;
+ while( z<zEnd ){
+ u32 tst = Utf8Read(z);
+ if( tst==ch ) return 1;
+ }
+ return 0;
+}
+
+/*
+** The unhex() function. This function may be invoked with either one or
+** two arguments. In both cases the first argument is interpreted as text
+** a text value containing a set of pairs of hexadecimal digits which are
+** decoded and returned as a blob.
+**
+** If there is only a single argument, then it must consist only of an
+** even number of hexadeximal digits. Otherwise, return NULL.
+**
+** Or, if there is a second argument, then any character that appears in
+** the second argument is also allowed to appear between pairs of hexadecimal
+** digits in the first argument. If any other character appears in the
+** first argument, or if one of the allowed characters appears between
+** two hexadecimal digits that make up a single byte, NULL is returned.
+**
+** The following expressions are all true:
+**
+** unhex('ABCD') IS x'ABCD'
+** unhex('AB CD') IS NULL
+** unhex('AB CD', ' ') IS x'ABCD'
+** unhex('A BCD', ' ') IS NULL
+*/
+static void unhexFunc(
+ sqlite3_context *pCtx,
+ int argc,
+ sqlite3_value **argv
+){
+ const u8 *zPass = (const u8*)"";
+ int nPass = 0;
+ const u8 *zHex = sqlite3_value_text(argv[0]);
+ int nHex = sqlite3_value_bytes(argv[0]);
+#ifdef SQLITE_DEBUG
+ const u8 *zEnd = zHex ? &zHex[nHex] : 0;
+#endif
+ u8 *pBlob = 0;
+ u8 *p = 0;
+
+ assert( argc==1 || argc==2 );
+ if( argc==2 ){
+ zPass = sqlite3_value_text(argv[1]);
+ nPass = sqlite3_value_bytes(argv[1]);
+ }
+ if( !zHex || !zPass ) return;
+
+ p = pBlob = contextMalloc(pCtx, (nHex/2)+1);
+ if( pBlob ){
+ u8 c; /* Most significant digit of next byte */
+ u8 d; /* Least significant digit of next byte */
+
+ while( (c = *zHex)!=0x00 ){
+ while( !sqlite3Isxdigit(c) ){
+ u32 ch = Utf8Read(zHex);
+ assert( zHex<=zEnd );
+ if( !strContainsChar(zPass, nPass, ch) ) goto unhex_null;
+ c = *zHex;
+ if( c==0x00 ) goto unhex_done;
+ }
+ zHex++;
+ assert( *zEnd==0x00 );
+ assert( zHex<=zEnd );
+ d = *(zHex++);
+ if( !sqlite3Isxdigit(d) ) goto unhex_null;
+ *(p++) = (sqlite3HexToInt(c)<<4) | sqlite3HexToInt(d);
+ }
+ }
+
+ unhex_done:
+ sqlite3_result_blob(pCtx, pBlob, (p - pBlob), sqlite3_free);
+ return;
+
+ unhex_null:
+ sqlite3_free(pBlob);
+ return;
+}
+
+
+/*
** The zeroblob(N) function returns a zero-filled blob of size N bytes.
*/
static void zeroblobFunc(
@@ -120709,7 +126952,7 @@ static void trimFunc(
/*
** The "unknown" function is automatically substituted in place of
** any unrecognized function name when doing an EXPLAIN or EXPLAIN QUERY PLAN
-** when the SQLITE_ENABLE_UNKNOWN_FUNCTION compile-time option is used.
+** when the SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION compile-time option is used.
** When the "sqlite3" command-line shell is built using this functionality,
** that allows an EXPLAIN or EXPLAIN QUERY PLAN for complex queries
** involving application-defined functions to be examined in a generic
@@ -120721,6 +126964,9 @@ static void unknownFunc(
sqlite3_value **argv
){
/* no-op */
+ (void)context;
+ (void)argc;
+ (void)argv;
}
#endif /*SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION*/
@@ -121029,97 +127275,167 @@ static void minMaxFinalize(sqlite3_context *context){
/*
** group_concat(EXPR, ?SEPARATOR?)
+**
+** The SEPARATOR goes before the EXPR string. This is tragic. The
+** groupConcatInverse() implementation would have been easier if the
+** SEPARATOR were appended after EXPR. And the order is undocumented,
+** so we could change it, in theory. But the old behavior has been
+** around for so long that we dare not, for fear of breaking something.
*/
+typedef struct {
+ StrAccum str; /* The accumulated concatenation */
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ int nAccum; /* Number of strings presently concatenated */
+ int nFirstSepLength; /* Used to detect separator length change */
+ /* If pnSepLengths!=0, refs an array of inter-string separator lengths,
+ ** stored as actually incorporated into presently accumulated result.
+ ** (Hence, its slots in use number nAccum-1 between method calls.)
+ ** If pnSepLengths==0, nFirstSepLength is the length used throughout.
+ */
+ int *pnSepLengths;
+#endif
+} GroupConcatCtx;
+
static void groupConcatStep(
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
const char *zVal;
- StrAccum *pAccum;
+ GroupConcatCtx *pGCC;
const char *zSep;
int nVal, nSep;
assert( argc==1 || argc==2 );
if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
- pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
-
- if( pAccum ){
+ pGCC = (GroupConcatCtx*)sqlite3_aggregate_context(context, sizeof(*pGCC));
+ if( pGCC ){
sqlite3 *db = sqlite3_context_db_handle(context);
- int firstTerm = pAccum->mxAlloc==0;
- pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
- if( !firstTerm ){
- if( argc==2 ){
- zSep = (char*)sqlite3_value_text(argv[1]);
- nSep = sqlite3_value_bytes(argv[1]);
- }else{
- zSep = ",";
- nSep = 1;
+ int firstTerm = pGCC->str.mxAlloc==0;
+ pGCC->str.mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
+ if( argc==1 ){
+ if( !firstTerm ){
+ sqlite3_str_appendchar(&pGCC->str, 1, ',');
}
- if( zSep ) sqlite3_str_append(pAccum, zSep, nSep);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ else{
+ pGCC->nFirstSepLength = 1;
+ }
+#endif
+ }else if( !firstTerm ){
+ zSep = (char*)sqlite3_value_text(argv[1]);
+ nSep = sqlite3_value_bytes(argv[1]);
+ if( zSep ){
+ sqlite3_str_append(&pGCC->str, zSep, nSep);
+ }
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ else{
+ nSep = 0;
+ }
+ if( nSep != pGCC->nFirstSepLength || pGCC->pnSepLengths != 0 ){
+ int *pnsl = pGCC->pnSepLengths;
+ if( pnsl == 0 ){
+ /* First separator length variation seen, start tracking them. */
+ pnsl = (int*)sqlite3_malloc64((pGCC->nAccum+1) * sizeof(int));
+ if( pnsl!=0 ){
+ int i = 0, nA = pGCC->nAccum-1;
+ while( i<nA ) pnsl[i++] = pGCC->nFirstSepLength;
+ }
+ }else{
+ pnsl = (int*)sqlite3_realloc64(pnsl, pGCC->nAccum * sizeof(int));
+ }
+ if( pnsl!=0 ){
+ if( ALWAYS(pGCC->nAccum>0) ){
+ pnsl[pGCC->nAccum-1] = nSep;
+ }
+ pGCC->pnSepLengths = pnsl;
+ }else{
+ sqlite3StrAccumSetError(&pGCC->str, SQLITE_NOMEM);
+ }
+ }
+#endif
}
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ else{
+ pGCC->nFirstSepLength = sqlite3_value_bytes(argv[1]);
+ }
+ pGCC->nAccum += 1;
+#endif
zVal = (char*)sqlite3_value_text(argv[0]);
nVal = sqlite3_value_bytes(argv[0]);
- if( zVal ) sqlite3_str_append(pAccum, zVal, nVal);
+ if( zVal ) sqlite3_str_append(&pGCC->str, zVal, nVal);
}
}
+
#ifndef SQLITE_OMIT_WINDOWFUNC
static void groupConcatInverse(
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
- int n;
- StrAccum *pAccum;
+ GroupConcatCtx *pGCC;
assert( argc==1 || argc==2 );
+ (void)argc; /* Suppress unused parameter warning */
if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
- pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
- /* pAccum is always non-NULL since groupConcatStep() will have always
+ pGCC = (GroupConcatCtx*)sqlite3_aggregate_context(context, sizeof(*pGCC));
+ /* pGCC is always non-NULL since groupConcatStep() will have always
** run frist to initialize it */
- if( ALWAYS(pAccum) ){
- n = sqlite3_value_bytes(argv[0]);
- if( argc==2 ){
- n += sqlite3_value_bytes(argv[1]);
+ if( ALWAYS(pGCC) ){
+ int nVS;
+ /* Must call sqlite3_value_text() to convert the argument into text prior
+ ** to invoking sqlite3_value_bytes(), in case the text encoding is UTF16 */
+ (void)sqlite3_value_text(argv[0]);
+ nVS = sqlite3_value_bytes(argv[0]);
+ pGCC->nAccum -= 1;
+ if( pGCC->pnSepLengths!=0 ){
+ assert(pGCC->nAccum >= 0);
+ if( pGCC->nAccum>0 ){
+ nVS += *pGCC->pnSepLengths;
+ memmove(pGCC->pnSepLengths, pGCC->pnSepLengths+1,
+ (pGCC->nAccum-1)*sizeof(int));
+ }
}else{
- n++;
+ /* If removing single accumulated string, harmlessly over-do. */
+ nVS += pGCC->nFirstSepLength;
}
- if( n>=(int)pAccum->nChar ){
- pAccum->nChar = 0;
+ if( nVS>=(int)pGCC->str.nChar ){
+ pGCC->str.nChar = 0;
}else{
- pAccum->nChar -= n;
- memmove(pAccum->zText, &pAccum->zText[n], pAccum->nChar);
+ pGCC->str.nChar -= nVS;
+ memmove(pGCC->str.zText, &pGCC->str.zText[nVS], pGCC->str.nChar);
+ }
+ if( pGCC->str.nChar==0 ){
+ pGCC->str.mxAlloc = 0;
+ sqlite3_free(pGCC->pnSepLengths);
+ pGCC->pnSepLengths = 0;
}
- if( pAccum->nChar==0 ) pAccum->mxAlloc = 0;
}
}
#else
# define groupConcatInverse 0
#endif /* SQLITE_OMIT_WINDOWFUNC */
static void groupConcatFinalize(sqlite3_context *context){
- StrAccum *pAccum;
- pAccum = sqlite3_aggregate_context(context, 0);
- if( pAccum ){
- if( pAccum->accError==SQLITE_TOOBIG ){
- sqlite3_result_error_toobig(context);
- }else if( pAccum->accError==SQLITE_NOMEM ){
- sqlite3_result_error_nomem(context);
- }else{
- sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
- sqlite3_free);
- }
+ GroupConcatCtx *pGCC
+ = (GroupConcatCtx*)sqlite3_aggregate_context(context, 0);
+ if( pGCC ){
+ sqlite3ResultStrAccum(context, &pGCC->str);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ sqlite3_free(pGCC->pnSepLengths);
+#endif
}
}
#ifndef SQLITE_OMIT_WINDOWFUNC
static void groupConcatValue(sqlite3_context *context){
- sqlite3_str *pAccum;
- pAccum = (sqlite3_str*)sqlite3_aggregate_context(context, 0);
- if( pAccum ){
+ GroupConcatCtx *pGCC
+ = (GroupConcatCtx*)sqlite3_aggregate_context(context, 0);
+ if( pGCC ){
+ StrAccum *pAccum = &pGCC->str;
if( pAccum->accError==SQLITE_TOOBIG ){
sqlite3_result_error_toobig(context);
}else if( pAccum->accError==SQLITE_NOMEM ){
sqlite3_result_error_nomem(context);
}else{
const char *zText = sqlite3_str_value(pAccum);
- sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
+ sqlite3_result_text(context, zText, pAccum->nChar, SQLITE_TRANSIENT);
}
}
}
@@ -121183,11 +127499,12 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas
int nExpr;
assert( pExpr!=0 );
assert( pExpr->op==TK_FUNCTION );
+ assert( ExprUseXList(pExpr) );
if( !pExpr->x.pList ){
return 0;
}
- assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
nExpr = pExpr->x.pList->nExpr;
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0);
#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
if( pDef==0 ) return 0;
@@ -121211,6 +127528,7 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas
Expr *pEscape = pExpr->x.pList->a[2].pExpr;
char *zEscape;
if( pEscape->op!=TK_STRING ) return 0;
+ assert( !ExprHasProperty(pEscape, EP_IntValue) );
zEscape = pEscape->u.zToken;
if( zEscape[0]==0 || zEscape[1]!=0 ) return 0;
if( zEscape[0]==aWc[0] ) return 0;
@@ -121278,6 +127596,18 @@ static double xCeil(double x){ return ceil(x); }
static double xFloor(double x){ return floor(x); }
/*
+** Some systems do not have log2() and log10() in their standard math
+** libraries.
+*/
+#if defined(HAVE_LOG10) && HAVE_LOG10==0
+# define log10(X) (0.4342944819032517867*log(X))
+#endif
+#if defined(HAVE_LOG2) && HAVE_LOG2==0
+# define log2(X) (1.442695040888963456*log(X))
+#endif
+
+
+/*
** Implementation of SQL functions:
**
** ln(X) - natural logarithm
@@ -121315,17 +127645,15 @@ static void logFunc(
}
ans = log(x)/b;
}else{
- ans = log(x);
switch( SQLITE_PTR_TO_INT(sqlite3_user_data(context)) ){
case 1:
- /* Convert from natural logarithm to log base 10 */
- ans *= 1.0/M_LN10;
+ ans = log10(x);
break;
case 2:
- /* Convert from natural logarithm to log base 2 */
- ans *= 1.0/M_LN2;
+ ans = log2(x);
break;
default:
+ ans = log(x);
break;
}
}
@@ -121394,6 +127722,7 @@ static void piFunc(
sqlite3_value **argv
){
assert( argc==0 );
+ (void)argv;
sqlite3_result_double(context, M_PI);
}
@@ -121437,12 +127766,12 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
*/
static FuncDef aBuiltinFunc[] = {
/***** Functions only available with SQLITE_TESTCTRL_INTERNAL_FUNCTIONS *****/
+#if !defined(SQLITE_UNTESTABLE)
TEST_FUNC(implies_nonnull_row, 2, INLINEFUNC_implies_nonnull_row, 0),
TEST_FUNC(expr_compare, 2, INLINEFUNC_expr_compare, 0),
TEST_FUNC(expr_implies_expr, 2, INLINEFUNC_expr_implies_expr, 0),
-#ifdef SQLITE_DEBUG
- TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0),
-#endif
+ TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0),
+#endif /* !defined(SQLITE_UNTESTABLE) */
/***** Regular functions *****/
#ifdef SQLITE_SOUNDEX
FUNCTION(soundex, 1, 0, 0, soundexFunc ),
@@ -121462,8 +127791,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
- FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET|
- SQLITE_FUNC_TYPEOF),
+ INLINE_FUNC(sqlite_offset, 1, INLINEFUNC_sqlite_offset, 0 ),
#endif
FUNCTION(ltrim, 1, 1, 0, trimFunc ),
FUNCTION(ltrim, 2, 1, 0, trimFunc ),
@@ -121474,15 +127802,17 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
FUNCTION(min, -1, 0, 1, minmaxFunc ),
FUNCTION(min, 0, 0, 1, 0 ),
WAGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize, minMaxValue, 0,
- SQLITE_FUNC_MINMAX ),
+ SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ),
FUNCTION(max, -1, 1, 1, minmaxFunc ),
FUNCTION(max, 0, 1, 1, 0 ),
WAGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize, minMaxValue, 0,
- SQLITE_FUNC_MINMAX ),
+ SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ),
FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF),
+ FUNCTION2(subtype, 1, 0, 0, subtypeFunc, SQLITE_FUNC_TYPEOF),
FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH),
FUNCTION(instr, 2, 0, 0, instrFunc ),
FUNCTION(printf, -1, 0, 0, printfFunc ),
+ FUNCTION(format, -1, 0, 0, printfFunc ),
FUNCTION(unicode, 1, 0, 0, unicodeFunc ),
FUNCTION(char, -1, 0, 0, charFunc ),
FUNCTION(abs, 1, 0, 0, absFunc ),
@@ -121493,6 +127823,8 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
FUNCTION(upper, 1, 0, 0, upperFunc ),
FUNCTION(lower, 1, 0, 0, lowerFunc ),
FUNCTION(hex, 1, 0, 0, hexFunc ),
+ FUNCTION(unhex, 1, 0, 0, unhexFunc ),
+ FUNCTION(unhex, 2, 0, 0, unhexFunc ),
INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, 0 ),
VFUNCTION(random, 0, 0, 0, randomFunc ),
VFUNCTION(randomblob, 1, 0, 0, randomBlob ),
@@ -121514,9 +127846,10 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
WAGGREGATE(total, 1,0,0, sumStep,totalFinalize,totalFinalize,sumInverse, 0),
WAGGREGATE(avg, 1,0,0, sumStep, avgFinalize, avgFinalize, sumInverse, 0),
WAGGREGATE(count, 0,0,0, countStep,
- countFinalize, countFinalize, countInverse, SQLITE_FUNC_COUNT ),
+ countFinalize, countFinalize, countInverse,
+ SQLITE_FUNC_COUNT|SQLITE_FUNC_ANYORDER ),
WAGGREGATE(count, 1,0,0, countStep,
- countFinalize, countFinalize, countInverse, 0 ),
+ countFinalize, countFinalize, countInverse, SQLITE_FUNC_ANYORDER ),
WAGGREGATE(group_concat, 1, 0, 0, groupConcatStep,
groupConcatFinalize, groupConcatValue, groupConcatInverse, 0),
WAGGREGATE(group_concat, 2, 0, 0, groupConcatStep,
@@ -121580,6 +127913,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
#endif
sqlite3WindowFunctions();
sqlite3RegisterDateTimeFunctions();
+ sqlite3RegisterJsonFunctions();
sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc));
#if 0 /* Enable to print out how the built-in functions are hashed */
@@ -121591,6 +127925,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
for(p=sqlite3BuiltinFunctions.a[i]; p; p=p->u.pHash){
int n = sqlite3Strlen30(p->zName);
int h = p->zName[0] + n;
+ assert( p->funcFlags & SQLITE_FUNC_BUILTIN );
printf(" %s(%d)", p->zName, h);
}
printf("\n");
@@ -121818,7 +128153,9 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex(
*/
if( pParent->iPKey>=0 ){
if( !zKey ) return 0;
- if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zName, zKey) ) return 0;
+ if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zCnName, zKey) ){
+ return 0;
+ }
}
}else if( paiCol ){
assert( nCol>1 );
@@ -121860,11 +128197,11 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex(
/* If the index uses a collation sequence that is different from
** the default collation sequence for the column, this index is
** unusable. Bail out early in this case. */
- zDfltColl = pParent->aCol[iCol].zColl;
+ zDfltColl = sqlite3ColumnColl(&pParent->aCol[iCol]);
if( !zDfltColl ) zDfltColl = sqlite3StrBINARY;
if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break;
- zIdxCol = pParent->aCol[iCol].zName;
+ zIdxCol = pParent->aCol[iCol].zCnName;
for(j=0; j<nCol; j++){
if( sqlite3StrICmp(pFKey->aCol[j].zCol, zIdxCol)==0 ){
if( aiCol ) aiCol[i] = pFKey->aCol[j].iFrom;
@@ -121991,7 +128328,6 @@ static void fkLookupParent(
}else{
int nCol = pFKey->nCol;
int regTemp = sqlite3GetTempRange(pParse, nCol);
- int regRec = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb);
sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
@@ -122031,11 +128367,10 @@ static void fkLookupParent(
sqlite3VdbeGoto(v, iOk);
}
- sqlite3VdbeAddOp4(v, OP_MakeRecord, regTemp, nCol, regRec,
+ sqlite3VdbeAddOp4(v, OP_Affinity, regTemp, nCol, 0,
sqlite3IndexAffinityStr(pParse->db,pIdx), nCol);
- sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); VdbeCoverage(v);
-
- sqlite3ReleaseTempReg(pParse, regRec);
+ sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regTemp, nCol);
+ VdbeCoverage(v);
sqlite3ReleaseTempRange(pParse, regTemp, nCol);
}
}
@@ -122088,7 +128423,7 @@ static Expr *exprTableRegister(
pCol = &pTab->aCol[iCol];
pExpr->iTable = regBase + sqlite3TableColumnToStorage(pTab,iCol) + 1;
pExpr->affExpr = pCol->affinity;
- zColl = pCol->zColl;
+ zColl = sqlite3ColumnColl(pCol);
if( zColl==0 ) zColl = db->pDfltColl->zName;
pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl);
}else{
@@ -122111,6 +128446,7 @@ static Expr *exprTableColumn(
){
Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0);
if( pExpr ){
+ assert( ExprUseYTab(pExpr) );
pExpr->y.pTab = pTab;
pExpr->iTable = iCursor;
pExpr->iColumn = iCol;
@@ -122136,14 +128472,10 @@ static Expr *exprTableColumn(
** Operation | FK type | Action taken
** --------------------------------------------------------------------------
** DELETE immediate Increment the "immediate constraint counter".
-** Or, if the ON (UPDATE|DELETE) action is RESTRICT,
-** throw a "FOREIGN KEY constraint failed" exception.
**
** INSERT immediate Decrement the "immediate constraint counter".
**
** DELETE deferred Increment the "deferred constraint counter".
-** Or, if the ON (UPDATE|DELETE) action is RESTRICT,
-** throw a "FOREIGN KEY constraint failed" exception.
**
** INSERT deferred Decrement the "deferred constraint counter".
**
@@ -122197,7 +128529,7 @@ static void fkScanChildren(
pLeft = exprTableRegister(pParse, pTab, regData, iCol);
iCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom;
assert( iCol>=0 );
- zCol = pFKey->pFrom->aCol[iCol].zName;
+ zCol = pFKey->pFrom->aCol[iCol].zCnName;
pRight = sqlite3Expr(db, TK_ID, zCol);
pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight);
pWhere = sqlite3ExprAnd(pParse, pWhere, pEq);
@@ -122232,7 +128564,7 @@ static void fkScanChildren(
i16 iCol = pIdx->aiColumn[i];
assert( iCol>=0 );
pLeft = exprTableRegister(pParse, pTab, regData, iCol);
- pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zName);
+ pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zCnName);
pEq = sqlite3PExpr(pParse, TK_IS, pLeft, pRight);
pAll = sqlite3ExprAnd(pParse, pAll, pEq);
}
@@ -122251,7 +128583,7 @@ static void fkScanChildren(
** clause. For each row found, increment either the deferred or immediate
** foreign key constraint counter. */
if( pParse->nErr==0 ){
- pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0);
+ pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0, 0);
sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr);
if( pWInfo ){
sqlite3WhereEnd(pWInfo);
@@ -122303,6 +128635,25 @@ static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){
}
/*
+** Clear the apTrigger[] cache of CASCADE triggers for all foreign keys
+** in a particular database. This needs to happen when the schema
+** changes.
+*/
+SQLITE_PRIVATE void sqlite3FkClearTriggerCache(sqlite3 *db, int iDb){
+ HashElem *k;
+ Hash *pHash = &db->aDb[iDb].pSchema->tblHash;
+ for(k=sqliteHashFirst(pHash); k; k=sqliteHashNext(k)){
+ Table *pTab = sqliteHashData(k);
+ FKey *pFKey;
+ if( !IsOrdinaryTable(pTab) ) continue;
+ for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ fkTriggerDelete(db, pFKey->apTrigger[0]); pFKey->apTrigger[0] = 0;
+ fkTriggerDelete(db, pFKey->apTrigger[1]); pFKey->apTrigger[1] = 0;
+ }
+ }
+}
+
+/*
** This function is called to generate code that runs when table pTab is
** being dropped from the database. The SrcList passed as the second argument
** to this function contains a single entry guaranteed to resolve to
@@ -122321,12 +128672,12 @@ static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){
*/
SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){
sqlite3 *db = pParse->db;
- if( (db->flags&SQLITE_ForeignKeys) && !IsVirtual(pTab) ){
+ if( (db->flags&SQLITE_ForeignKeys) && IsOrdinaryTable(pTab) ){
int iSkip = 0;
Vdbe *v = sqlite3GetVdbe(pParse);
assert( v ); /* VDBE has already been allocated */
- assert( pTab->pSelect==0 ); /* Not a view */
+ assert( IsOrdinaryTable(pTab) );
if( sqlite3FkReferences(pTab)==0 ){
/* Search for a deferred foreign key constraint for which this table
** is the child table. If one cannot be found, return without
@@ -122334,7 +128685,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa
** the entire DELETE if there are no outstanding deferred constraints
** when this statement is run. */
FKey *p;
- for(p=pTab->pFKey; p; p=p->pNextFrom){
+ for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){
if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break;
}
if( !p ) return;
@@ -122423,7 +128774,7 @@ static int fkParentIsModified(
if( aChange[iKey]>=0 || (iKey==pTab->iPKey && bChngRowid) ){
Column *pCol = &pTab->aCol[iKey];
if( zKey ){
- if( 0==sqlite3StrICmp(pCol->zName, zKey) ) return 1;
+ if( 0==sqlite3StrICmp(pCol->zCnName, zKey) ) return 1;
}else if( pCol->colFlags & COLFLAG_PRIMKEY ){
return 1;
}
@@ -122490,13 +128841,14 @@ SQLITE_PRIVATE void sqlite3FkCheck(
/* If foreign-keys are disabled, this function is a no-op. */
if( (db->flags&SQLITE_ForeignKeys)==0 ) return;
+ if( !IsOrdinaryTable(pTab) ) return;
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
zDb = db->aDb[iDb].zDbSName;
/* Loop through all the foreign key constraints for which pTab is the
** child table (the table that the foreign key definition is part of). */
- for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){
Table *pTo; /* Parent table of foreign key pFKey */
Index *pIdx = 0; /* Index on key columns in pTo */
int *aiFree = 0;
@@ -122563,7 +128915,7 @@ SQLITE_PRIVATE void sqlite3FkCheck(
** values read from the parent table are NULL. */
if( db->xAuth ){
int rcauth;
- char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zName;
+ char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zCnName;
rcauth = sqlite3AuthReadCol(pParse, pTo->zName, zCol, iDb);
bIgnore = (rcauth==SQLITE_IGNORE);
}
@@ -122678,10 +129030,10 @@ SQLITE_PRIVATE u32 sqlite3FkOldmask(
Table *pTab /* Table being modified */
){
u32 mask = 0;
- if( pParse->db->flags&SQLITE_ForeignKeys ){
+ if( pParse->db->flags&SQLITE_ForeignKeys && IsOrdinaryTable(pTab) ){
FKey *p;
int i;
- for(p=pTab->pFKey; p; p=p->pNextFrom){
+ for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){
for(i=0; i<p->nCol; i++) mask |= COLUMN_MASK(p->aCol[i].iFrom);
}
for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
@@ -122731,19 +129083,19 @@ SQLITE_PRIVATE int sqlite3FkRequired(
){
int eRet = 1; /* Value to return if bHaveFK is true */
int bHaveFK = 0; /* If FK processing is required */
- if( pParse->db->flags&SQLITE_ForeignKeys ){
+ if( pParse->db->flags&SQLITE_ForeignKeys && IsOrdinaryTable(pTab) ){
if( !aChange ){
/* A DELETE operation. Foreign key processing is required if the
** table in question is either the child or parent table for any
** foreign key constraint. */
- bHaveFK = (sqlite3FkReferences(pTab) || pTab->pFKey);
+ bHaveFK = (sqlite3FkReferences(pTab) || pTab->u.tab.pFKey);
}else{
/* This is an UPDATE. Foreign key processing is only required if the
** operation modifies one or more child or parent key columns. */
FKey *p;
/* Check if any child key columns are being modified. */
- for(p=pTab->pFKey; p; p=p->pNextFrom){
+ for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){
if( fkChildIsModified(pTab, p, aChange, chngRowid) ){
if( 0==sqlite3_stricmp(pTab->zName, p->zTo) ) eRet = 2;
bHaveFK = 1;
@@ -122771,9 +129123,9 @@ SQLITE_PRIVATE int sqlite3FkRequired(
**
** It returns a pointer to a Trigger structure containing a trigger
** equivalent to the ON UPDATE or ON DELETE action specified by pFKey.
-** If the action is "NO ACTION" or "RESTRICT", then a NULL pointer is
-** returned (these actions require no special handling by the triggers
-** sub-system, code for them is created by fkScanChildren()).
+** If the action is "NO ACTION" then a NULL pointer is returned (these actions
+** require no special handling by the triggers sub-system, code for them is
+** created by fkScanChildren()).
**
** For example, if pFKey is the foreign key and pTab is table "p" in
** the following schema:
@@ -122836,8 +129188,8 @@ static Trigger *fkActionTrigger(
assert( pIdx!=0 || (pTab->iPKey>=0 && pTab->iPKey<pTab->nCol) );
assert( pIdx==0 || pIdx->aiColumn[i]>=0 );
sqlite3TokenInit(&tToCol,
- pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zName);
- sqlite3TokenInit(&tFromCol, pFKey->pFrom->aCol[iFromCol].zName);
+ pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zCnName);
+ sqlite3TokenInit(&tFromCol, pFKey->pFrom->aCol[iFromCol].zCnName);
/* Create the expression "OLD.zToCol = zFromCol". It is important
** that the "OLD.zToCol" term is on the LHS of the = operator, so
@@ -122882,7 +129234,7 @@ static Trigger *fkActionTrigger(
testcase( pCol->colFlags & COLFLAG_STORED );
pDflt = 0;
}else{
- pDflt = pCol->pDflt;
+ pDflt = sqlite3ColumnExpr(pFKey->pFrom, pCol);
}
if( pDflt ){
pNew = sqlite3ExprDup(db, pDflt, 0);
@@ -122902,18 +129254,23 @@ static Trigger *fkActionTrigger(
nFrom = sqlite3Strlen30(zFrom);
if( action==OE_Restrict ){
- Token tFrom;
+ int iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+ SrcList *pSrc;
Expr *pRaise;
- tFrom.z = zFrom;
- tFrom.n = nFrom;
pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed");
if( pRaise ){
pRaise->affExpr = OE_Abort;
}
+ pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0);
+ if( pSrc ){
+ assert( pSrc->nSrc==1 );
+ pSrc->a[0].zName = sqlite3DbStrDup(db, zFrom);
+ pSrc->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName);
+ }
pSelect = sqlite3SelectNew(pParse,
sqlite3ExprListAppend(pParse, 0, pRaise),
- sqlite3SrcListAppend(pParse, 0, &tFrom, 0),
+ pSrc,
pWhere,
0, 0, 0, 0, 0
);
@@ -123019,12 +129376,13 @@ SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){
FKey *pFKey; /* Iterator variable */
FKey *pNext; /* Copy of pFKey->pNextFrom */
- assert( db==0 || IsVirtual(pTab)
- || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) );
- for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){
+ assert( IsOrdinaryTable(pTab) );
+ assert( db!=0 );
+ for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pNext){
+ assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) );
/* Remove the FK from the fkeyHash hash table. */
- if( !db || db->pnBytesFreed==0 ){
+ if( db->pnBytesFreed==0 ){
if( pFKey->pPrevTo ){
pFKey->pPrevTo->pNextTo = pFKey->pNextTo;
}else{
@@ -123101,7 +129459,7 @@ SQLITE_PRIVATE void sqlite3OpenTable(
}else{
Index *pPk = sqlite3PrimaryKeyIndex(pTab);
assert( pPk!=0 );
- assert( pPk->tnum==pTab->tnum );
+ assert( pPk->tnum==pTab->tnum || CORRUPT_DB );
sqlite3VdbeAddOp3(v, opcode, iCur, pPk->tnum, iDb);
sqlite3VdbeSetP4KeyInfo(pParse, pPk);
VdbeComment((v, "%s", pTab->zName));
@@ -123128,85 +129486,139 @@ SQLITE_PRIVATE void sqlite3OpenTable(
** is managed along with the rest of the Index structure. It will be
** released when sqlite3DeleteIndex() is called.
*/
-SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){
+static SQLITE_NOINLINE const char *computeIndexAffStr(sqlite3 *db, Index *pIdx){
+ /* The first time a column affinity string for a particular index is
+ ** required, it is allocated and populated here. It is then stored as
+ ** a member of the Index structure for subsequent use.
+ **
+ ** The column affinity string will eventually be deleted by
+ ** sqliteDeleteIndex() when the Index structure itself is cleaned
+ ** up.
+ */
+ int n;
+ Table *pTab = pIdx->pTable;
+ pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1);
if( !pIdx->zColAff ){
- /* The first time a column affinity string for a particular index is
- ** required, it is allocated and populated here. It is then stored as
- ** a member of the Index structure for subsequent use.
- **
- ** The column affinity string will eventually be deleted by
- ** sqliteDeleteIndex() when the Index structure itself is cleaned
- ** up.
- */
- int n;
- Table *pTab = pIdx->pTable;
- pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1);
- if( !pIdx->zColAff ){
- sqlite3OomFault(db);
- return 0;
+ sqlite3OomFault(db);
+ return 0;
+ }
+ for(n=0; n<pIdx->nColumn; n++){
+ i16 x = pIdx->aiColumn[n];
+ char aff;
+ if( x>=0 ){
+ aff = pTab->aCol[x].affinity;
+ }else if( x==XN_ROWID ){
+ aff = SQLITE_AFF_INTEGER;
+ }else{
+ assert( x==XN_EXPR );
+ assert( pIdx->bHasExpr );
+ assert( pIdx->aColExpr!=0 );
+ aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr);
}
- for(n=0; n<pIdx->nColumn; n++){
- i16 x = pIdx->aiColumn[n];
- char aff;
- if( x>=0 ){
- aff = pTab->aCol[x].affinity;
- }else if( x==XN_ROWID ){
- aff = SQLITE_AFF_INTEGER;
- }else{
- assert( x==XN_EXPR );
- assert( pIdx->aColExpr!=0 );
- aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr);
+ if( aff<SQLITE_AFF_BLOB ) aff = SQLITE_AFF_BLOB;
+ if( aff>SQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC;
+ pIdx->zColAff[n] = aff;
+ }
+ pIdx->zColAff[n] = 0;
+ return pIdx->zColAff;
+}
+SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){
+ if( !pIdx->zColAff ) return computeIndexAffStr(db, pIdx);
+ return pIdx->zColAff;
+}
+
+
+/*
+** Compute an affinity string for a table. Space is obtained
+** from sqlite3DbMalloc(). The caller is responsible for freeing
+** the space when done.
+*/
+SQLITE_PRIVATE char *sqlite3TableAffinityStr(sqlite3 *db, const Table *pTab){
+ char *zColAff;
+ zColAff = (char *)sqlite3DbMallocRaw(db, pTab->nCol+1);
+ if( zColAff ){
+ int i, j;
+ for(i=j=0; i<pTab->nCol; i++){
+ if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){
+ zColAff[j++] = pTab->aCol[i].affinity;
}
- if( aff<SQLITE_AFF_BLOB ) aff = SQLITE_AFF_BLOB;
- if( aff>SQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC;
- pIdx->zColAff[n] = aff;
}
- pIdx->zColAff[n] = 0;
+ do{
+ zColAff[j--] = 0;
+ }while( j>=0 && zColAff[j]<=SQLITE_AFF_BLOB );
}
-
- return pIdx->zColAff;
+ return zColAff;
}
/*
+** Make changes to the evolving bytecode to do affinity transformations
+** of values that are about to be gathered into a row for table pTab.
+**
+** For ordinary (legacy, non-strict) tables:
+** -----------------------------------------
+**
** Compute the affinity string for table pTab, if it has not already been
** computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities.
**
-** If the affinity exists (if it is no entirely SQLITE_AFF_BLOB values) and
-** if iReg>0 then code an OP_Affinity opcode that will set the affinities
-** for register iReg and following. Or if affinities exists and iReg==0,
+** If the affinity string is empty (because it was all SQLITE_AFF_BLOB entries
+** which were then optimized out) then this routine becomes a no-op.
+**
+** Otherwise if iReg>0 then code an OP_Affinity opcode that will set the
+** affinities for register iReg and following. Or if iReg==0,
** then just set the P4 operand of the previous opcode (which should be
** an OP_MakeRecord) to the affinity string.
**
** A column affinity string has one character per column:
**
-** Character Column affinity
-** ------------------------------
-** 'A' BLOB
-** 'B' TEXT
-** 'C' NUMERIC
-** 'D' INTEGER
-** 'E' REAL
+** Character Column affinity
+** --------- ---------------
+** 'A' BLOB
+** 'B' TEXT
+** 'C' NUMERIC
+** 'D' INTEGER
+** 'E' REAL
+**
+** For STRICT tables:
+** ------------------
+**
+** Generate an appropropriate OP_TypeCheck opcode that will verify the
+** datatypes against the column definitions in pTab. If iReg==0, that
+** means an OP_MakeRecord opcode has already been generated and should be
+** the last opcode generated. The new OP_TypeCheck needs to be inserted
+** before the OP_MakeRecord. The new OP_TypeCheck should use the same
+** register set as the OP_MakeRecord. If iReg>0 then register iReg is
+** the first of a series of registers that will form the new record.
+** Apply the type checking to that array of registers.
*/
SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){
- int i, j;
- char *zColAff = pTab->zColAff;
+ int i;
+ char *zColAff;
+ if( pTab->tabFlags & TF_Strict ){
+ if( iReg==0 ){
+ /* Move the previous opcode (which should be OP_MakeRecord) forward
+ ** by one slot and insert a new OP_TypeCheck where the current
+ ** OP_MakeRecord is found */
+ VdbeOp *pPrev;
+ sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
+ pPrev = sqlite3VdbeGetLastOp(v);
+ assert( pPrev!=0 );
+ assert( pPrev->opcode==OP_MakeRecord || sqlite3VdbeDb(v)->mallocFailed );
+ pPrev->opcode = OP_TypeCheck;
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, pPrev->p1, pPrev->p2, pPrev->p3);
+ }else{
+ /* Insert an isolated OP_Typecheck */
+ sqlite3VdbeAddOp2(v, OP_TypeCheck, iReg, pTab->nNVCol);
+ sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
+ }
+ return;
+ }
+ zColAff = pTab->zColAff;
if( zColAff==0 ){
- sqlite3 *db = sqlite3VdbeDb(v);
- zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1);
+ zColAff = sqlite3TableAffinityStr(0, pTab);
if( !zColAff ){
- sqlite3OomFault(db);
+ sqlite3OomFault(sqlite3VdbeDb(v));
return;
}
-
- for(i=j=0; i<pTab->nCol; i++){
- assert( pTab->aCol[i].affinity!=0 );
- if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){
- zColAff[j++] = pTab->aCol[i].affinity;
- }
- }
- do{
- zColAff[j--] = 0;
- }while( j>=0 && zColAff[j]<=SQLITE_AFF_BLOB );
pTab->zColAff = zColAff;
}
assert( zColAff!=0 );
@@ -123215,6 +129627,8 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){
if( iReg ){
sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i);
}else{
+ assert( sqlite3VdbeGetLastOp(v)->opcode==OP_MakeRecord
+ || sqlite3VdbeDb(v)->mallocFailed );
sqlite3VdbeChangeP4(v, -1, zColAff, i);
}
}
@@ -123298,24 +129712,30 @@ SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns(
** that appropriate affinity has been applied to the regular columns
*/
sqlite3TableAffinity(pParse->pVdbe, pTab, iRegStore);
- if( (pTab->tabFlags & TF_HasStored)!=0
- && (pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1))->opcode==OP_Affinity
- ){
- /* Change the OP_Affinity argument to '@' (NONE) for all stored
- ** columns. '@' is the no-op affinity and those columns have not
- ** yet been computed. */
- int ii, jj;
- char *zP4 = pOp->p4.z;
- assert( zP4!=0 );
- assert( pOp->p4type==P4_DYNAMIC );
- for(ii=jj=0; zP4[jj]; ii++){
- if( pTab->aCol[ii].colFlags & COLFLAG_VIRTUAL ){
- continue;
- }
- if( pTab->aCol[ii].colFlags & COLFLAG_STORED ){
- zP4[jj] = SQLITE_AFF_NONE;
+ if( (pTab->tabFlags & TF_HasStored)!=0 ){
+ pOp = sqlite3VdbeGetLastOp(pParse->pVdbe);
+ if( pOp->opcode==OP_Affinity ){
+ /* Change the OP_Affinity argument to '@' (NONE) for all stored
+ ** columns. '@' is the no-op affinity and those columns have not
+ ** yet been computed. */
+ int ii, jj;
+ char *zP4 = pOp->p4.z;
+ assert( zP4!=0 );
+ assert( pOp->p4type==P4_DYNAMIC );
+ for(ii=jj=0; zP4[jj]; ii++){
+ if( pTab->aCol[ii].colFlags & COLFLAG_VIRTUAL ){
+ continue;
+ }
+ if( pTab->aCol[ii].colFlags & COLFLAG_STORED ){
+ zP4[jj] = SQLITE_AFF_NONE;
+ }
+ jj++;
}
- jj++;
+ }else if( pOp->opcode==OP_TypeCheck ){
+ /* If an OP_TypeCheck was generated because the table is STRICT,
+ ** then set the P3 operand to indicate that generated columns should
+ ** not be checked */
+ pOp->p3 = 1;
}
}
@@ -123351,7 +129771,7 @@ SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns(
int x;
pCol->colFlags |= COLFLAG_BUSY;
w.eCode = 0;
- sqlite3WalkExpr(&w, pCol->pDflt);
+ sqlite3WalkExpr(&w, sqlite3ColumnExpr(pTab, pCol));
pCol->colFlags &= ~COLFLAG_BUSY;
if( w.eCode & COLFLAG_NOTAVAIL ){
pRedo = pCol;
@@ -123360,13 +129780,13 @@ SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns(
eProgress = 1;
assert( pCol->colFlags & COLFLAG_GENERATED );
x = sqlite3TableColumnToStorage(pTab, i) + iRegStore;
- sqlite3ExprCodeGeneratedColumn(pParse, pCol, x);
+ sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, x);
pCol->colFlags &= ~COLFLAG_NOTAVAIL;
}
}
}while( pRedo && eProgress );
if( pRedo ){
- sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pRedo->zName);
+ sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pRedo->zCnName);
}
pParse->iSelfTab = 0;
}
@@ -123725,9 +130145,11 @@ SQLITE_PRIVATE void sqlite3Insert(
#endif
db = pParse->db;
- if( pParse->nErr || db->mallocFailed ){
+ assert( db->pParse==pParse );
+ if( pParse->nErr ){
goto insert_cleanup;
}
+ assert( db->mallocFailed==0 );
dest.iSDParm = 0; /* Suppress a harmless compiler warning */
/* If the Select object is really just a simple VALUES() list with a
@@ -123761,7 +130183,7 @@ SQLITE_PRIVATE void sqlite3Insert(
*/
#ifndef SQLITE_OMIT_TRIGGER
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask);
- isView = pTab->pSelect!=0;
+ isView = IsView(pTab);
#else
# define pTrigger 0
# define tmask 0
@@ -123773,6 +130195,14 @@ SQLITE_PRIVATE void sqlite3Insert(
#endif
assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) );
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x10000 ){
+ sqlite3TreeViewLine(0, "In sqlite3Insert() at %s:%d", __FILE__, __LINE__);
+ sqlite3TreeViewInsert(pParse->pWith, pTabList, pColumn, pSelect, pList,
+ onError, pUpsert, pTrigger);
+ }
+#endif
+
/* If pTab is really a view, make sure it has been initialized.
** ViewGetColumnNames() is a no-op if pTab is not a view.
*/
@@ -123782,7 +130212,7 @@ SQLITE_PRIVATE void sqlite3Insert(
/* Cannot insert into a read-only table.
*/
- if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
+ if( sqlite3IsReadOnly(pParse, pTab, pTrigger) ){
goto insert_cleanup;
}
@@ -123803,7 +130233,11 @@ SQLITE_PRIVATE void sqlite3Insert(
**
** This is the 2nd template.
*/
- if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){
+ if( pColumn==0
+ && pSelect!=0
+ && pTrigger==0
+ && xferOptimization(pParse, pTab, pSelect, onError, iDb)
+ ){
assert( !pTrigger );
assert( pList==0 );
goto insert_end;
@@ -123847,13 +130281,15 @@ SQLITE_PRIVATE void sqlite3Insert(
*/
bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0;
if( pColumn ){
+ assert( pColumn->eU4!=EU4_EXPR );
+ pColumn->eU4 = EU4_IDX;
for(i=0; i<pColumn->nId; i++){
- pColumn->a[i].idx = -1;
+ pColumn->a[i].u4.idx = -1;
}
for(i=0; i<pColumn->nId; i++){
for(j=0; j<pTab->nCol; j++){
- if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){
- pColumn->a[i].idx = j;
+ if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zCnName)==0 ){
+ pColumn->a[i].u4.idx = j;
if( i!=j ) bIdListInOrder = 0;
if( j==pTab->iPKey ){
ipkColumn = i; assert( !withoutRowid );
@@ -123862,7 +130298,7 @@ SQLITE_PRIVATE void sqlite3Insert(
if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){
sqlite3ErrorMsg(pParse,
"cannot INSERT into generated column \"%s\"",
- pTab->aCol[j].zName);
+ pTab->aCol[j].zCnName);
goto insert_cleanup;
}
#endif
@@ -123903,7 +130339,9 @@ SQLITE_PRIVATE void sqlite3Insert(
dest.nSdst = pTab->nCol;
rc = sqlite3Select(pParse, pSelect, &dest);
regFromSelect = dest.iSdst;
- if( rc || db->mallocFailed || pParse->nErr ) goto insert_cleanup;
+ assert( db->pParse==pParse );
+ if( rc || pParse->nErr ) goto insert_cleanup;
+ assert( db->mallocFailed==0 );
sqlite3VdbeEndCoroutine(v, regYield);
sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */
assert( pSelect->pEList );
@@ -124047,7 +130485,7 @@ SQLITE_PRIVATE void sqlite3Insert(
pTab->zName);
goto insert_cleanup;
}
- if( pTab->pSelect ){
+ if( IsView(pTab) ){
sqlite3ErrorMsg(pParse, "cannot UPSERT a view");
goto insert_cleanup;
}
@@ -124146,22 +130584,29 @@ SQLITE_PRIVATE void sqlite3Insert(
}else if( pColumn==0 ){
/* Hidden columns that are not explicitly named in the INSERT
** get there default value */
- sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore);
+ sqlite3ExprCodeFactorable(pParse,
+ sqlite3ColumnExpr(pTab, &pTab->aCol[i]),
+ iRegStore);
continue;
}
}
if( pColumn ){
- for(j=0; j<pColumn->nId && pColumn->a[j].idx!=i; j++){}
+ assert( pColumn->eU4==EU4_IDX );
+ for(j=0; j<pColumn->nId && pColumn->a[j].u4.idx!=i; j++){}
if( j>=pColumn->nId ){
/* A column not named in the insert column list gets its
** default value */
- sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore);
+ sqlite3ExprCodeFactorable(pParse,
+ sqlite3ColumnExpr(pTab, &pTab->aCol[i]),
+ iRegStore);
continue;
}
k = j;
}else if( nColumn==0 ){
/* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */
- sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore);
+ sqlite3ExprCodeFactorable(pParse,
+ sqlite3ColumnExpr(pTab, &pTab->aCol[i]),
+ iRegStore);
continue;
}else{
k = i - nHidden;
@@ -124174,7 +130619,12 @@ SQLITE_PRIVATE void sqlite3Insert(
sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore);
}
}else{
- sqlite3ExprCode(pParse, pList->a[k].pExpr, iRegStore);
+ Expr *pX = pList->a[k].pExpr;
+ int y = sqlite3ExprCodeTarget(pParse, pX, iRegStore);
+ if( y!=iRegStore ){
+ sqlite3VdbeAddOp2(v,
+ ExprHasProperty(pX, EP_Subquery) ? OP_Copy : OP_SCopy, y, iRegStore);
+ }
}
}
@@ -124209,7 +130659,7 @@ SQLITE_PRIVATE void sqlite3Insert(
}
/* Copy the new data already generated. */
- assert( pTab->nNVCol>0 );
+ assert( pTab->nNVCol>0 || pParse->nErr>0 );
sqlite3VdbeAddOp3(v, OP_Copy, regRowid+1, regCols+1, pTab->nNVCol-1);
#ifndef SQLITE_OMIT_GENERATED_COLUMNS
@@ -124311,7 +130761,9 @@ SQLITE_PRIVATE void sqlite3Insert(
sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert
);
- sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0);
+ if( db->flags & SQLITE_ForeignKeys ){
+ sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0);
+ }
/* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE
** constraints or (b) there are no triggers and this table is not a
@@ -124386,9 +130838,7 @@ insert_end:
** invoke the callback function.
*/
if( regRowCount ){
- sqlite3VdbeAddOp2(v, OP_ChngCntRow, regRowCount, 1);
- sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC);
+ sqlite3CodeChangeCount(v, regRowCount, "rows inserted");
}
insert_cleanup:
@@ -124397,7 +130847,7 @@ insert_cleanup:
sqlite3UpsertDelete(db, pUpsert);
sqlite3SelectDelete(db, pSelect);
sqlite3IdListDelete(db, pColumn);
- sqlite3DbFree(db, aRegIdx);
+ if( aRegIdx ) sqlite3DbNNFreeNN(db, aRegIdx);
}
/* Make sure "isView" and other macros defined above are undefined. Otherwise
@@ -124676,7 +131126,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
db = pParse->db;
v = pParse->pVdbe;
assert( v!=0 );
- assert( pTab->pSelect==0 ); /* This table is not a VIEW */
+ assert( !IsView(pTab) ); /* This table is not a VIEW */
nCol = pTab->nCol;
/* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for
@@ -124727,7 +131177,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
}
if( onError==OE_Replace ){
if( b2ndPass /* REPLACE becomes ABORT on the 2nd pass */
- || pCol->pDflt==0 /* REPLACE is ABORT if no DEFAULT value */
+ || pCol->iDflt==0 /* REPLACE is ABORT if no DEFAULT value */
){
testcase( pCol->colFlags & COLFLAG_VIRTUAL );
testcase( pCol->colFlags & COLFLAG_STORED );
@@ -124749,7 +131199,8 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
VdbeCoverage(v);
assert( (pCol->colFlags & COLFLAG_GENERATED)==0 );
nSeenReplace++;
- sqlite3ExprCodeCopy(pParse, pCol->pDflt, iReg);
+ sqlite3ExprCodeCopy(pParse,
+ sqlite3ColumnExpr(pTab, pCol), iReg);
sqlite3VdbeJumpHere(v, addr1);
break;
}
@@ -124759,7 +131210,8 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
case OE_Rollback:
case OE_Fail: {
char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName,
- pCol->zName);
+ pCol->zCnName);
+ testcase( zMsg==0 && db->mallocFailed==0 );
sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL,
onError, iReg);
sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC);
@@ -125012,6 +131464,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
if( onError==OE_Replace /* IPK rule is REPLACE */
&& onError!=overrideError /* Rules for other constraints are different */
&& pTab->pIndex /* There exist other constraints */
+ && !upsertIpkDelay /* IPK check already deferred by UPSERT */
){
ipkTop = sqlite3VdbeAddOp0(v, OP_Goto)+1;
VdbeComment((v, "defer IPK REPLACE until last"));
@@ -125177,7 +131630,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
testcase( sqlite3TableColumnToStorage(pTab, iField)!=iField );
x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1;
sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i);
- VdbeComment((v, "%s", pTab->aCol[iField].zName));
+ VdbeComment((v, "%s", pTab->aCol[iField].zCnName));
}
}
sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]);
@@ -125229,6 +131682,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row
** must be explicitly deleted in order to ensure any pre-update hook
** is invoked. */
+ assert( IsOrdinaryTable(pTab) );
#ifndef SQLITE_ENABLE_PREUPDATE_HOOK
if( (ix==0 && pIdx->pNext==0) /* Condition 3 */
&& pPk==pIdx /* Condition 2 */
@@ -125236,7 +131690,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
&& ( 0==(db->flags&SQLITE_RecTriggers) || /* Condition 4 */
0==sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0))
&& ( 0==(db->flags&SQLITE_ForeignKeys) || /* Condition 5 */
- (0==pTab->pFKey && 0==sqlite3FkReferences(pTab)))
+ (0==pTab->u.tab.pFKey && 0==sqlite3FkReferences(pTab)))
){
sqlite3VdbeResolveLabel(v, addrUniqueOk);
continue;
@@ -125271,13 +131725,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
x = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]);
sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i);
VdbeComment((v, "%s.%s", pTab->zName,
- pTab->aCol[pPk->aiColumn[i]].zName));
+ pTab->aCol[pPk->aiColumn[i]].zCnName));
}
}
if( isUpdate ){
/* If currently processing the PRIMARY KEY of a WITHOUT ROWID
** table, only conflict if the new PRIMARY KEY values are actually
- ** different from the old.
+ ** different from the old. See TH3 withoutrowid04.test.
**
** For a UNIQUE index, only conflict if the PRIMARY KEY values
** of the matched index row are different from the original PRIMARY
@@ -125335,7 +131789,8 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
assert( onError==OE_Replace );
nConflictCk = sqlite3VdbeCurrentAddr(v) - addrConflictCk;
- assert( nConflictCk>0 );
+ assert( nConflictCk>0 || db->mallocFailed );
+ testcase( nConflictCk<=0 );
testcase( nConflictCk>1 );
if( regTrigCnt ){
sqlite3MultiWrite(pParse);
@@ -125418,6 +131873,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
if( ipkTop ){
sqlite3VdbeGoto(v, ipkTop);
VdbeComment((v, "Do IPK REPLACE"));
+ assert( ipkBottom>0 );
sqlite3VdbeJumpHere(v, ipkBottom);
}
@@ -125470,7 +131926,7 @@ SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe *v, Table *pTab){
if( pTab->pSchema->file_format<2 ) return;
for(i=pTab->nCol-1; i>0; i--){
- if( pTab->aCol[i].pDflt!=0 ) break;
+ if( pTab->aCol[i].iDflt!=0 ) break;
if( pTab->aCol[i].colFlags & COLFLAG_PRIMKEY ) break;
}
sqlite3VdbeChangeP5(v, i+1);
@@ -125535,7 +131991,7 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion(
v = pParse->pVdbe;
assert( v!=0 );
- assert( pTab->pSelect==0 ); /* This table is not a VIEW */
+ assert( !IsView(pTab) ); /* This table is not a VIEW */
for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
/* All REPLACE indexes are at the end of the list */
assert( pIdx->onError!=OE_Replace
@@ -125548,7 +132004,6 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion(
}
pik_flags = (useSeekResult ? OPFLAG_USESEEKRESULT : 0);
if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){
- assert( pParse->nested==0 );
pik_flags |= OPFLAG_NCHANGE;
pik_flags |= (update_flags & OPFLAG_SAVEPOSITION);
if( update_flags==0 ){
@@ -125621,8 +132076,9 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices(
assert( op==OP_OpenWrite || p5==0 );
if( IsVirtual(pTab) ){
/* This routine is a no-op for virtual tables. Leave the output
- ** variables *piDataCur and *piIdxCur uninitialized so that valgrind
- ** can detect if they are used by mistake in the caller. */
+ ** variables *piDataCur and *piIdxCur set to illegal cursor numbers
+ ** for improved error detection. */
+ *piDataCur = *piIdxCur = -999;
return 0;
}
iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
@@ -125763,18 +132219,13 @@ static int xferOptimization(
int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */
int regData, regRowid; /* Registers holding data and rowid */
- if( pSelect==0 ){
- return 0; /* Must be of the form INSERT INTO ... SELECT ... */
- }
+ assert( pSelect!=0 );
if( pParse->pWith || pSelect->pWith ){
/* Do not attempt to process this query if there are an WITH clauses
** attached to it. Proceeding may generate a false "no such table: xxx"
** error if pSelect reads from a CTE named "xxx". */
return 0;
}
- if( sqlite3TriggerList(pParse, pDest) ){
- return 0; /* tab1 must not have triggers */
- }
#ifndef SQLITE_OMIT_VIRTUALTABLE
if( IsVirtual(pDest) ){
return 0; /* tab1 must not be a virtual table */
@@ -125837,13 +132288,8 @@ static int xferOptimization(
if( HasRowid(pDest)!=HasRowid(pSrc) ){
return 0; /* source and destination must both be WITHOUT ROWID or not */
}
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( IsVirtual(pSrc) ){
- return 0; /* tab2 must not be a virtual table */
- }
-#endif
- if( pSrc->pSelect ){
- return 0; /* tab2 may not be a view */
+ if( !IsOrdinaryTable(pSrc) ){
+ return 0; /* tab2 may not be a view or virtual table */
}
if( pDest->nCol!=pSrc->nCol ){
return 0; /* Number of columns must be the same in tab1 and tab2 */
@@ -125851,6 +132297,9 @@ static int xferOptimization(
if( pDest->iPKey!=pSrc->iPKey ){
return 0; /* Both tables must have the same INTEGER PRIMARY KEY */
}
+ if( (pDest->tabFlags & TF_Strict)!=0 && (pSrc->tabFlags & TF_Strict)==0 ){
+ return 0; /* Cannot feed from a non-strict into a strict table */
+ }
for(i=0; i<pDest->nCol; i++){
Column *pDestCol = &pDest->aCol[i];
Column *pSrcCol = &pSrc->aCol[i];
@@ -125887,7 +132336,9 @@ static int xferOptimization(
** This requirement could be relaxed for VIRTUAL columns, I suppose.
*/
if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){
- if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){
+ if( sqlite3ExprCompare(0,
+ sqlite3ColumnExpr(pSrc, pSrcCol),
+ sqlite3ColumnExpr(pDest, pDestCol), -1)!=0 ){
testcase( pDestCol->colFlags & COLFLAG_VIRTUAL );
testcase( pDestCol->colFlags & COLFLAG_STORED );
return 0; /* Different generator expressions */
@@ -125897,7 +132348,8 @@ static int xferOptimization(
if( pDestCol->affinity!=pSrcCol->affinity ){
return 0; /* Affinity must be the same on all columns */
}
- if( sqlite3_stricmp(pDestCol->zColl, pSrcCol->zColl)!=0 ){
+ if( sqlite3_stricmp(sqlite3ColumnColl(pDestCol),
+ sqlite3ColumnColl(pSrcCol))!=0 ){
return 0; /* Collating sequence must be the same on all columns */
}
if( pDestCol->notNull && !pSrcCol->notNull ){
@@ -125905,11 +132357,15 @@ static int xferOptimization(
}
/* Default values for second and subsequent columns need to match. */
if( (pDestCol->colFlags & COLFLAG_GENERATED)==0 && i>0 ){
- assert( pDestCol->pDflt==0 || pDestCol->pDflt->op==TK_SPAN );
- assert( pSrcCol->pDflt==0 || pSrcCol->pDflt->op==TK_SPAN );
- if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0)
- || (pDestCol->pDflt && strcmp(pDestCol->pDflt->u.zToken,
- pSrcCol->pDflt->u.zToken)!=0)
+ Expr *pDestExpr = sqlite3ColumnExpr(pDest, pDestCol);
+ Expr *pSrcExpr = sqlite3ColumnExpr(pSrc, pSrcCol);
+ assert( pDestExpr==0 || pDestExpr->op==TK_SPAN );
+ assert( pDestExpr==0 || !ExprHasProperty(pDestExpr, EP_IntValue) );
+ assert( pSrcExpr==0 || pSrcExpr->op==TK_SPAN );
+ assert( pSrcExpr==0 || !ExprHasProperty(pSrcExpr, EP_IntValue) );
+ if( (pDestExpr==0)!=(pSrcExpr==0)
+ || (pDestExpr!=0 && strcmp(pDestExpr->u.zToken,
+ pSrcExpr->u.zToken)!=0)
){
return 0; /* Default values must be the same for all columns */
}
@@ -125946,7 +132402,8 @@ static int xferOptimization(
** the extra complication to make this rule less restrictive is probably
** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e]
*/
- if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->pFKey!=0 ){
+ assert( IsOrdinaryTable(pDest) );
+ if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->u.tab.pFKey!=0 ){
return 0;
}
#endif
@@ -126618,12 +133075,36 @@ struct sqlite3_api_routines {
const char *(*filename_journal)(const char*);
const char *(*filename_wal)(const char*);
/* Version 3.32.0 and later */
- char *(*create_filename)(const char*,const char*,const char*,
+ const char *(*create_filename)(const char*,const char*,const char*,
int,const char**);
- void (*free_filename)(char*);
+ void (*free_filename)(const char*);
sqlite3_file *(*database_file_object)(const char*);
/* Version 3.34.0 and later */
int (*txn_state)(sqlite3*,const char*);
+ /* Version 3.36.1 and later */
+ sqlite3_int64 (*changes64)(sqlite3*);
+ sqlite3_int64 (*total_changes64)(sqlite3*);
+ /* Version 3.37.0 and later */
+ int (*autovacuum_pages)(sqlite3*,
+ unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int),
+ void*, void(*)(void*));
+ /* Version 3.38.0 and later */
+ int (*error_offset)(sqlite3*);
+ int (*vtab_rhs_value)(sqlite3_index_info*,int,sqlite3_value**);
+ int (*vtab_distinct)(sqlite3_index_info*);
+ int (*vtab_in)(sqlite3_index_info*,int,int);
+ int (*vtab_in_first)(sqlite3_value*,sqlite3_value**);
+ int (*vtab_in_next)(sqlite3_value*,sqlite3_value**);
+ /* Version 3.39.0 and later */
+ int (*deserialize)(sqlite3*,const char*,unsigned char*,
+ sqlite3_int64,sqlite3_int64,unsigned);
+ unsigned char *(*serialize)(sqlite3*,const char *,sqlite3_int64*,
+ unsigned int);
+ const char *(*db_name)(sqlite3*,int);
+ /* Version 3.40.0 and later */
+ int (*value_encoding)(sqlite3_value*);
+ /* Version 3.41.0 and later */
+ int (*is_interrupted)(sqlite3*);
};
/*
@@ -126930,6 +133411,28 @@ typedef int (*sqlite3_loadext_entry)(
#define sqlite3_database_file_object sqlite3_api->database_file_object
/* Version 3.34.0 and later */
#define sqlite3_txn_state sqlite3_api->txn_state
+/* Version 3.36.1 and later */
+#define sqlite3_changes64 sqlite3_api->changes64
+#define sqlite3_total_changes64 sqlite3_api->total_changes64
+/* Version 3.37.0 and later */
+#define sqlite3_autovacuum_pages sqlite3_api->autovacuum_pages
+/* Version 3.38.0 and later */
+#define sqlite3_error_offset sqlite3_api->error_offset
+#define sqlite3_vtab_rhs_value sqlite3_api->vtab_rhs_value
+#define sqlite3_vtab_distinct sqlite3_api->vtab_distinct
+#define sqlite3_vtab_in sqlite3_api->vtab_in
+#define sqlite3_vtab_in_first sqlite3_api->vtab_in_first
+#define sqlite3_vtab_in_next sqlite3_api->vtab_in_next
+/* Version 3.39.0 and later */
+#ifndef SQLITE_OMIT_DESERIALIZE
+#define sqlite3_deserialize sqlite3_api->deserialize
+#define sqlite3_serialize sqlite3_api->serialize
+#endif
+#define sqlite3_db_name sqlite3_api->db_name
+/* Version 3.40.0 and later */
+#define sqlite3_value_encoding sqlite3_api->value_encoding
+/* Version 3.41.0 and later */
+#define sqlite3_is_interrupted sqlite3_api->is_interrupted
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
@@ -127414,6 +133917,39 @@ static const sqlite3_api_routines sqlite3Apis = {
sqlite3_database_file_object,
/* Version 3.34.0 and later */
sqlite3_txn_state,
+ /* Version 3.36.1 and later */
+ sqlite3_changes64,
+ sqlite3_total_changes64,
+ /* Version 3.37.0 and later */
+ sqlite3_autovacuum_pages,
+ /* Version 3.38.0 and later */
+ sqlite3_error_offset,
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ sqlite3_vtab_rhs_value,
+ sqlite3_vtab_distinct,
+ sqlite3_vtab_in,
+ sqlite3_vtab_in_first,
+ sqlite3_vtab_in_next,
+#else
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif
+ /* Version 3.39.0 and later */
+#ifndef SQLITE_OMIT_DESERIALIZE
+ sqlite3_deserialize,
+ sqlite3_serialize,
+#else
+ 0,
+ 0,
+#endif
+ sqlite3_db_name,
+ /* Version 3.40.0 and later */
+ sqlite3_value_encoding,
+ /* Version 3.41.0 and later */
+ sqlite3_is_interrupted
};
/* True if x is the directory separator character
@@ -127486,7 +134022,11 @@ static int sqlite3LoadExtension(
/* tag-20210611-1. Some dlopen() implementations will segfault if given
** an oversize filename. Most filesystems have a pathname limit of 4K,
** so limit the extension filename length to about twice that.
- ** https://sqlite.org/forum/forumpost/08a0d6d9bf */
+ ** https://sqlite.org/forum/forumpost/08a0d6d9bf
+ **
+ ** Later (2023-03-25): Save an extra 6 bytes for the filename suffix.
+ ** See https://sqlite.org/forum/forumpost/24083b579d.
+ */
if( nMsg>SQLITE_MAX_PATHLEN ) goto extension_not_found;
handle = sqlite3OsDlOpen(pVfs, zFile);
@@ -127494,7 +134034,9 @@ static int sqlite3LoadExtension(
for(ii=0; ii<ArraySize(azEndings) && handle==0; ii++){
char *zAltFile = sqlite3_mprintf("%s.%s", zFile, azEndings[ii]);
if( zAltFile==0 ) return SQLITE_NOMEM_BKPT;
- handle = sqlite3OsDlOpen(pVfs, zAltFile);
+ if( nMsg+strlen(azEndings[ii])+1<=SQLITE_MAX_PATHLEN ){
+ handle = sqlite3OsDlOpen(pVfs, zAltFile);
+ }
sqlite3_free(zAltFile);
}
#endif
@@ -127876,13 +134418,14 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){
#define PragTyp_SOFT_HEAP_LIMIT 35
#define PragTyp_SYNCHRONOUS 36
#define PragTyp_TABLE_INFO 37
-#define PragTyp_TEMP_STORE 38
-#define PragTyp_TEMP_STORE_DIRECTORY 39
-#define PragTyp_THREADS 40
-#define PragTyp_WAL_AUTOCHECKPOINT 41
-#define PragTyp_WAL_CHECKPOINT 42
-#define PragTyp_LOCK_STATUS 43
-#define PragTyp_STATS 44
+#define PragTyp_TABLE_LIST 38
+#define PragTyp_TEMP_STORE 39
+#define PragTyp_TEMP_STORE_DIRECTORY 40
+#define PragTyp_THREADS 41
+#define PragTyp_WAL_AUTOCHECKPOINT 42
+#define PragTyp_WAL_CHECKPOINT 43
+#define PragTyp_LOCK_STATUS 44
+#define PragTyp_STATS 45
/* Property flags associated with various pragma. */
#define PragFlg_NeedSchema 0x01 /* Force schema load before running */
@@ -127915,45 +134458,51 @@ static const char *const pragCName[] = {
/* 13 */ "pk",
/* 14 */ "hidden",
/* table_info reuses 8 */
- /* 15 */ "seqno", /* Used by: index_xinfo */
- /* 16 */ "cid",
- /* 17 */ "name",
- /* 18 */ "desc",
- /* 19 */ "coll",
- /* 20 */ "key",
- /* 21 */ "name", /* Used by: function_list */
- /* 22 */ "builtin",
- /* 23 */ "type",
- /* 24 */ "enc",
- /* 25 */ "narg",
- /* 26 */ "flags",
- /* 27 */ "tbl", /* Used by: stats */
- /* 28 */ "idx",
- /* 29 */ "wdth",
- /* 30 */ "hght",
- /* 31 */ "flgs",
- /* 32 */ "seq", /* Used by: index_list */
- /* 33 */ "name",
- /* 34 */ "unique",
- /* 35 */ "origin",
- /* 36 */ "partial",
- /* 37 */ "table", /* Used by: foreign_key_check */
- /* 38 */ "rowid",
- /* 39 */ "parent",
- /* 40 */ "fkid",
- /* index_info reuses 15 */
- /* 41 */ "seq", /* Used by: database_list */
- /* 42 */ "name",
- /* 43 */ "file",
- /* 44 */ "busy", /* Used by: wal_checkpoint */
- /* 45 */ "log",
- /* 46 */ "checkpointed",
- /* collation_list reuses 32 */
- /* 47 */ "database", /* Used by: lock_status */
- /* 48 */ "status",
- /* 49 */ "cache_size", /* Used by: default_cache_size */
+ /* 15 */ "schema", /* Used by: table_list */
+ /* 16 */ "name",
+ /* 17 */ "type",
+ /* 18 */ "ncol",
+ /* 19 */ "wr",
+ /* 20 */ "strict",
+ /* 21 */ "seqno", /* Used by: index_xinfo */
+ /* 22 */ "cid",
+ /* 23 */ "name",
+ /* 24 */ "desc",
+ /* 25 */ "coll",
+ /* 26 */ "key",
+ /* 27 */ "name", /* Used by: function_list */
+ /* 28 */ "builtin",
+ /* 29 */ "type",
+ /* 30 */ "enc",
+ /* 31 */ "narg",
+ /* 32 */ "flags",
+ /* 33 */ "tbl", /* Used by: stats */
+ /* 34 */ "idx",
+ /* 35 */ "wdth",
+ /* 36 */ "hght",
+ /* 37 */ "flgs",
+ /* 38 */ "seq", /* Used by: index_list */
+ /* 39 */ "name",
+ /* 40 */ "unique",
+ /* 41 */ "origin",
+ /* 42 */ "partial",
+ /* 43 */ "table", /* Used by: foreign_key_check */
+ /* 44 */ "rowid",
+ /* 45 */ "parent",
+ /* 46 */ "fkid",
+ /* index_info reuses 21 */
+ /* 47 */ "seq", /* Used by: database_list */
+ /* 48 */ "name",
+ /* 49 */ "file",
+ /* 50 */ "busy", /* Used by: wal_checkpoint */
+ /* 51 */ "log",
+ /* 52 */ "checkpointed",
+ /* collation_list reuses 38 */
+ /* 53 */ "database", /* Used by: lock_status */
+ /* 54 */ "status",
+ /* 55 */ "cache_size", /* Used by: default_cache_size */
/* module_list pragma_list reuses 9 */
- /* 50 */ "timeout", /* Used by: busy_timeout */
+ /* 56 */ "timeout", /* Used by: busy_timeout */
};
/* Definitions of all built-in pragmas */
@@ -128004,7 +134553,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "busy_timeout",
/* ePragTyp: */ PragTyp_BUSY_TIMEOUT,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 50, 1,
+ /* ColNames: */ 56, 1,
/* iArg: */ 0 },
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
{/* zName: */ "cache_size",
@@ -128043,7 +134592,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "collation_list",
/* ePragTyp: */ PragTyp_COLLATION_LIST,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 32, 2,
+ /* ColNames: */ 38, 2,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS)
@@ -128077,15 +134626,15 @@ static const PragmaName aPragmaName[] = {
#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
{/* zName: */ "database_list",
/* ePragTyp: */ PragTyp_DATABASE_LIST,
- /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0,
- /* ColNames: */ 41, 3,
+ /* ePragFlg: */ PragFlg_Result0,
+ /* ColNames: */ 47, 3,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
{/* zName: */ "default_cache_size",
/* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1,
- /* ColNames: */ 49, 1,
+ /* ColNames: */ 55, 1,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
@@ -128115,7 +134664,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "foreign_key_check",
/* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt,
- /* ColNames: */ 37, 4,
+ /* ColNames: */ 43, 4,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FOREIGN_KEY)
@@ -128158,7 +134707,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "function_list",
/* ePragTyp: */ PragTyp_FUNCTION_LIST,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 21, 6,
+ /* ColNames: */ 27, 6,
/* iArg: */ 0 },
#endif
#endif
@@ -128187,23 +134736,23 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "index_info",
/* ePragTyp: */ PragTyp_INDEX_INFO,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
- /* ColNames: */ 15, 3,
+ /* ColNames: */ 21, 3,
/* iArg: */ 0 },
{/* zName: */ "index_list",
/* ePragTyp: */ PragTyp_INDEX_LIST,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
- /* ColNames: */ 32, 5,
+ /* ColNames: */ 38, 5,
/* iArg: */ 0 },
{/* zName: */ "index_xinfo",
/* ePragTyp: */ PragTyp_INDEX_INFO,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
- /* ColNames: */ 15, 6,
+ /* ColNames: */ 21, 6,
/* iArg: */ 1 },
#endif
#if !defined(SQLITE_OMIT_INTEGRITY_CHECK)
{/* zName: */ "integrity_check",
/* ePragTyp: */ PragTyp_INTEGRITY_CHECK,
- /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1,
+ /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt,
/* ColNames: */ 0, 0,
/* iArg: */ 0 },
#endif
@@ -128237,7 +134786,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "lock_status",
/* ePragTyp: */ PragTyp_LOCK_STATUS,
/* ePragFlg: */ PragFlg_Result0,
- /* ColNames: */ 47, 2,
+ /* ColNames: */ 53, 2,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
@@ -128311,7 +134860,7 @@ static const PragmaName aPragmaName[] = {
#if !defined(SQLITE_OMIT_INTEGRITY_CHECK)
{/* zName: */ "quick_check",
/* ePragTyp: */ PragTyp_INTEGRITY_CHECK,
- /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1,
+ /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt,
/* ColNames: */ 0, 0,
/* iArg: */ 0 },
#endif
@@ -128376,7 +134925,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "stats",
/* ePragTyp: */ PragTyp_STATS,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq,
- /* ColNames: */ 27, 5,
+ /* ColNames: */ 33, 5,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
@@ -128392,6 +134941,11 @@ static const PragmaName aPragmaName[] = {
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
/* ColNames: */ 8, 6,
/* iArg: */ 0 },
+ {/* zName: */ "table_list",
+ /* ePragTyp: */ PragTyp_TABLE_LIST,
+ /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1,
+ /* ColNames: */ 15, 6,
+ /* iArg: */ 0 },
{/* zName: */ "table_xinfo",
/* ePragTyp: */ PragTyp_TABLE_INFO,
/* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt,
@@ -128467,7 +135021,7 @@ static const PragmaName aPragmaName[] = {
{/* zName: */ "wal_checkpoint",
/* ePragTyp: */ PragTyp_WAL_CHECKPOINT,
/* ePragFlg: */ PragFlg_NeedSchema,
- /* ColNames: */ 44, 3,
+ /* ColNames: */ 50, 3,
/* iArg: */ 0 },
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
@@ -128478,7 +135032,7 @@ static const PragmaName aPragmaName[] = {
/* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError },
#endif
};
-/* Number of pragmas: 67 on by default, 77 total. */
+/* Number of pragmas: 68 on by default, 78 total. */
/************** End of pragma.h **********************************************/
/************** Continuing where we left off in pragma.c *********************/
@@ -128760,15 +135314,16 @@ static void pragmaFunclistLine(
int isBuiltin, /* True if this is a built-in function */
int showInternFuncs /* True if showing internal functions */
){
+ u32 mask =
+ SQLITE_DETERMINISTIC |
+ SQLITE_DIRECTONLY |
+ SQLITE_SUBTYPE |
+ SQLITE_INNOCUOUS |
+ SQLITE_FUNC_INTERNAL
+ ;
+ if( showInternFuncs ) mask = 0xffffffff;
for(; p; p=p->pNext){
const char *zType;
- static const u32 mask =
- SQLITE_DETERMINISTIC |
- SQLITE_DIRECTONLY |
- SQLITE_SUBTYPE |
- SQLITE_INNOCUOUS |
- SQLITE_FUNC_INTERNAL
- ;
static const char *azEnc[] = { 0, "utf8", "utf16le", "utf16be" };
assert( SQLITE_FUNC_ENCMASK==0x3 );
@@ -128920,7 +135475,11 @@ SQLITE_PRIVATE void sqlite3Pragma(
/* Locate the pragma in the lookup table */
pPragma = pragmaLocate(zLeft);
- if( pPragma==0 ) goto pragma_out;
+ if( pPragma==0 ){
+ /* IMP: R-43042-22504 No error messages are generated if an
+ ** unknown pragma is issued. */
+ goto pragma_out;
+ }
/* Make sure the database schema is loaded if the pragma requires that */
if( (pPragma->mPragFlg & PragFlg_NeedSchema)!=0 ){
@@ -129256,7 +135815,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
*/
#ifndef SQLITE_OMIT_AUTOVACUUM
case PragTyp_INCREMENTAL_VACUUM: {
- int iLimit, addr;
+ int iLimit = 0, addr;
if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){
iLimit = 0x7fffffff;
}
@@ -129413,6 +135972,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
**
*/
case PragTyp_TEMP_STORE_DIRECTORY: {
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
if( !zRight ){
returnSingleText(v, sqlite3_temp_directory);
}else{
@@ -129422,6 +135982,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res);
if( rc!=SQLITE_OK || res==0 ){
sqlite3ErrorMsg(pParse, "not a writable directory");
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
goto pragma_out;
}
}
@@ -129439,6 +136000,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
}
#endif /* SQLITE_OMIT_WSD */
}
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
break;
}
@@ -129457,6 +136019,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
**
*/
case PragTyp_DATA_STORE_DIRECTORY: {
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
if( !zRight ){
returnSingleText(v, sqlite3_data_directory);
}else{
@@ -129466,6 +136029,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res);
if( rc!=SQLITE_OK || res==0 ){
sqlite3ErrorMsg(pParse, "not a writable directory");
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
goto pragma_out;
}
}
@@ -129477,6 +136041,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
}
#endif /* SQLITE_OMIT_WSD */
}
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
break;
}
#endif
@@ -129570,6 +136135,14 @@ SQLITE_PRIVATE void sqlite3Pragma(
}else{
db->flags &= ~mask;
if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0;
+ if( (mask & SQLITE_WriteSchema)!=0
+ && sqlite3_stricmp(zRight, "reset")==0
+ ){
+ /* IMP: R-60817-01178 If the argument is "RESET" then schema
+ ** writing is disabled (as with "PRAGMA writable_schema=OFF") and,
+ ** in addition, the schema is reloaded. */
+ sqlite3ResetAllSchemasOfConnection(db);
+ }
}
/* Many of the flag-pragmas modify the code generated by the SQL
@@ -129610,6 +136183,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
sqlite3ViewGetColumnNames(pParse, pTab);
for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){
int isHidden = 0;
+ const Expr *pColExpr;
if( pCol->colFlags & COLFLAG_NOINSERT ){
if( pPragma->iArg==0 ){
nHidden++;
@@ -129630,13 +136204,16 @@ SQLITE_PRIVATE void sqlite3Pragma(
}else{
for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){}
}
- assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN || isHidden>=2 );
+ pColExpr = sqlite3ColumnExpr(pTab,pCol);
+ assert( pColExpr==0 || pColExpr->op==TK_SPAN || isHidden>=2 );
+ assert( pColExpr==0 || !ExprHasProperty(pColExpr, EP_IntValue)
+ || isHidden>=2 );
sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi",
i-nHidden,
- pCol->zName,
+ pCol->zCnName,
sqlite3ColumnType(pCol,""),
pCol->notNull ? 1 : 0,
- pCol->pDflt && isHidden<2 ? pCol->pDflt->u.zToken : 0,
+ (isHidden>=2 || pColExpr==0) ? 0 : pColExpr->u.zToken,
k,
isHidden);
}
@@ -129644,6 +136221,85 @@ SQLITE_PRIVATE void sqlite3Pragma(
}
break;
+ /*
+ ** PRAGMA table_list
+ **
+ ** Return a single row for each table, virtual table, or view in the
+ ** entire schema.
+ **
+ ** schema: Name of attached database hold this table
+ ** name: Name of the table itself
+ ** type: "table", "view", "virtual", "shadow"
+ ** ncol: Number of columns
+ ** wr: True for a WITHOUT ROWID table
+ ** strict: True for a STRICT table
+ */
+ case PragTyp_TABLE_LIST: {
+ int ii;
+ pParse->nMem = 6;
+ sqlite3CodeVerifyNamedSchema(pParse, zDb);
+ for(ii=0; ii<db->nDb; ii++){
+ HashElem *k;
+ Hash *pHash;
+ int initNCol;
+ if( zDb && sqlite3_stricmp(zDb, db->aDb[ii].zDbSName)!=0 ) continue;
+
+ /* Ensure that the Table.nCol field is initialized for all views
+ ** and virtual tables. Each time we initialize a Table.nCol value
+ ** for a table, that can potentially disrupt the hash table, so restart
+ ** the initialization scan.
+ */
+ pHash = &db->aDb[ii].pSchema->tblHash;
+ initNCol = sqliteHashCount(pHash);
+ while( initNCol-- ){
+ for(k=sqliteHashFirst(pHash); 1; k=sqliteHashNext(k) ){
+ Table *pTab;
+ if( k==0 ){ initNCol = 0; break; }
+ pTab = sqliteHashData(k);
+ if( pTab->nCol==0 ){
+ char *zSql = sqlite3MPrintf(db, "SELECT*FROM\"%w\"", pTab->zName);
+ if( zSql ){
+ sqlite3_stmt *pDummy = 0;
+ (void)sqlite3_prepare(db, zSql, -1, &pDummy, 0);
+ (void)sqlite3_finalize(pDummy);
+ sqlite3DbFree(db, zSql);
+ }
+ if( db->mallocFailed ){
+ sqlite3ErrorMsg(db->pParse, "out of memory");
+ db->pParse->rc = SQLITE_NOMEM_BKPT;
+ }
+ pHash = &db->aDb[ii].pSchema->tblHash;
+ break;
+ }
+ }
+ }
+
+ for(k=sqliteHashFirst(pHash); k; k=sqliteHashNext(k) ){
+ Table *pTab = sqliteHashData(k);
+ const char *zType;
+ if( zRight && sqlite3_stricmp(zRight, pTab->zName)!=0 ) continue;
+ if( IsView(pTab) ){
+ zType = "view";
+ }else if( IsVirtual(pTab) ){
+ zType = "virtual";
+ }else if( pTab->tabFlags & TF_Shadow ){
+ zType = "shadow";
+ }else{
+ zType = "table";
+ }
+ sqlite3VdbeMultiLoad(v, 1, "sssiii",
+ db->aDb[ii].zDbSName,
+ sqlite3PreferredTableName(pTab->zName),
+ zType,
+ pTab->nCol,
+ (pTab->tabFlags & TF_WithoutRowid)!=0,
+ (pTab->tabFlags & TF_Strict)!=0
+ );
+ }
+ }
+ }
+ break;
+
#ifdef SQLITE_DEBUG
case PragTyp_STATS: {
Index *pIdx;
@@ -129653,7 +136309,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){
Table *pTab = sqliteHashData(i);
sqlite3VdbeMultiLoad(v, 1, "ssiii",
- pTab->zName,
+ sqlite3PreferredTableName(pTab->zName),
0,
pTab->szTabRow,
pTab->nRowLogEst,
@@ -129703,7 +136359,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
for(i=0; i<mx; i++){
i16 cnum = pIdx->aiColumn[i];
sqlite3VdbeMultiLoad(v, 1, "iisX", i, cnum,
- cnum<0 ? 0 : pTab->aCol[cnum].zName);
+ cnum<0 ? 0 : pTab->aCol[cnum].zCnName);
if( pPragma->iArg ){
sqlite3VdbeMultiLoad(v, 4, "isiX",
pIdx->aSortOrder[i],
@@ -129772,11 +136428,13 @@ SQLITE_PRIVATE void sqlite3Pragma(
pParse->nMem = 6;
for(i=0; i<SQLITE_FUNC_HASH_SZ; i++){
for(p=sqlite3BuiltinFunctions.a[i]; p; p=p->u.pHash ){
+ assert( p->funcFlags & SQLITE_FUNC_BUILTIN );
pragmaFunclistLine(v, p, 1, showInternFunc);
}
}
for(j=sqliteHashFirst(&db->aFunc); j; j=sqliteHashNext(j)){
p = (FuncDef*)sqliteHashData(j);
+ assert( (p->funcFlags & SQLITE_FUNC_BUILTIN)==0 );
pragmaFunclistLine(v, p, 0, showInternFunc);
}
}
@@ -129810,8 +136468,8 @@ SQLITE_PRIVATE void sqlite3Pragma(
FKey *pFK;
Table *pTab;
pTab = sqlite3FindTable(db, zRight, zDb);
- if( pTab ){
- pFK = pTab->pFKey;
+ if( pTab && IsOrdinaryTable(pTab) ){
+ pFK = pTab->u.tab.pFKey;
if( pFK ){
int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
int i = 0;
@@ -129824,7 +136482,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
i,
j,
pFK->zTo,
- pTab->aCol[pFK->aCol[j].iFrom].zName,
+ pTab->aCol[pFK->aCol[j].iFrom].zCnName,
pFK->aCol[j].zCol,
actionName(pFK->aAction[1]), /* ON UPDATE */
actionName(pFK->aAction[0]), /* ON DELETE */
@@ -129851,7 +136509,6 @@ SQLITE_PRIVATE void sqlite3Pragma(
HashElem *k; /* Loop counter: Next table in schema */
int x; /* result variable */
int regResult; /* 3 registers to hold a result row */
- int regKey; /* Register to hold key for checking the FK */
int regRow; /* Registers to hold a row from pTab */
int addrTop; /* Top of a loop checking foreign keys */
int addrOk; /* Jump here if the key is OK */
@@ -129859,7 +136516,6 @@ SQLITE_PRIVATE void sqlite3Pragma(
regResult = pParse->nMem+1;
pParse->nMem += 4;
- regKey = ++pParse->nMem;
regRow = ++pParse->nMem;
k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash);
while( k ){
@@ -129870,15 +136526,16 @@ SQLITE_PRIVATE void sqlite3Pragma(
pTab = (Table*)sqliteHashData(k);
k = sqliteHashNext(k);
}
- if( pTab==0 || pTab->pFKey==0 ) continue;
+ if( pTab==0 || !IsOrdinaryTable(pTab) || pTab->u.tab.pFKey==0 ) continue;
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
zDb = db->aDb[iDb].zDbSName;
sqlite3CodeVerifySchema(pParse, iDb);
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
- if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow;
+ sqlite3TouchRegister(pParse, pTab->nCol+regRow);
sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead);
sqlite3VdbeLoadString(v, regResult, pTab->zName);
- for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
+ assert( IsOrdinaryTable(pTab) );
+ for(i=1, pFK=pTab->u.tab.pFKey; pFK; i++, pFK=pFK->pNextFrom){
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
if( pParent==0 ) continue;
pIdx = 0;
@@ -129900,7 +136557,8 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( pFK ) break;
if( pParse->nTab<i ) pParse->nTab = i;
addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v);
- for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
+ assert( IsOrdinaryTable(pTab) );
+ for(i=1, pFK=pTab->u.tab.pFKey; pFK; i++, pFK=pFK->pNextFrom){
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
pIdx = 0;
aiCols = 0;
@@ -129914,6 +136572,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
** regRow..regRow+n. If any of the child key values are NULL, this
** row cannot cause an FK violation. Jump directly to addrOk in
** this case. */
+ sqlite3TouchRegister(pParse, regRow + pFK->nCol);
for(j=0; j<pFK->nCol; j++){
int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom;
sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j);
@@ -129923,9 +136582,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
/* Generate code to query the parent index for a matching parent
** key. If a match is found, jump to addrOk. */
if( pIdx ){
- sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey,
+ sqlite3VdbeAddOp4(v, OP_Affinity, regRow, pFK->nCol, 0,
sqlite3IndexAffinityStr(db,pIdx), pFK->nCol);
- sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0);
+ sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regRow, pFK->nCol);
VdbeCoverage(v);
}else if( pParent ){
int jmp = sqlite3VdbeCurrentAddr(v)+2;
@@ -130042,6 +136701,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( iDb>=0 && i!=iDb ) continue;
sqlite3CodeVerifySchema(pParse, i);
+ pParse->okConstFactor = 0; /* tag-20230327-1 */
/* Do an integrity check of the B-Tree
**
@@ -130077,7 +136737,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
aRoot[0] = cnt;
/* Make sure sufficient number of registers have been allocated */
- pParse->nMem = MAX( pParse->nMem, 8+mxIdx );
+ sqlite3TouchRegister(pParse, 8+mxIdx);
sqlite3ClearTempRegCache(pParse);
/* Do the b-tree integrity checks */
@@ -130096,14 +136756,24 @@ SQLITE_PRIVATE void sqlite3Pragma(
for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){
Table *pTab = sqliteHashData(x);
Index *pIdx, *pPk;
- Index *pPrior = 0;
+ Index *pPrior = 0; /* Previous index */
int loopTop;
int iDataCur, iIdxCur;
int r1 = -1;
+ int bStrict; /* True for a STRICT table */
+ int r2; /* Previous key for WITHOUT ROWID tables */
+ int mxCol; /* Maximum non-virtual column number */
- if( pTab->tnum<1 ) continue; /* Skip VIEWs or VIRTUAL TABLEs */
+ if( !IsOrdinaryTable(pTab) ) continue;
if( pObjTab && pObjTab!=pTab ) continue;
- pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
+ if( isQuick || HasRowid(pTab) ){
+ pPk = 0;
+ r2 = 0;
+ }else{
+ pPk = sqlite3PrimaryKeyIndex(pTab);
+ r2 = sqlite3GetTempRange(pParse, pPk->nKeyCol);
+ sqlite3VdbeAddOp3(v, OP_Null, 1, r2, r2+pPk->nKeyCol-1);
+ }
sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0,
1, 0, &iDataCur, &iIdxCur);
/* reg[7] counts the number of entries in the table.
@@ -130117,27 +136787,180 @@ SQLITE_PRIVATE void sqlite3Pragma(
assert( sqlite3NoTempsInRange(pParse,1,7+j) );
sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v);
loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1);
+
+ /* Fetch the right-most column from the table. This will cause
+ ** the entire record header to be parsed and sanity checked. It
+ ** will also prepopulate the cursor column cache that is used
+ ** by the OP_IsType code, so it is a required step.
+ */
+ assert( !IsVirtual(pTab) );
+ if( HasRowid(pTab) ){
+ mxCol = -1;
+ for(j=0; j<pTab->nCol; j++){
+ if( (pTab->aCol[j].colFlags & COLFLAG_VIRTUAL)==0 ) mxCol++;
+ }
+ if( mxCol==pTab->iPKey ) mxCol--;
+ }else{
+ /* COLFLAG_VIRTUAL columns are not included in the WITHOUT ROWID
+ ** PK index column-count, so there is no need to account for them
+ ** in this case. */
+ mxCol = sqlite3PrimaryKeyIndex(pTab)->nColumn-1;
+ }
+ if( mxCol>=0 ){
+ sqlite3VdbeAddOp3(v, OP_Column, iDataCur, mxCol, 3);
+ sqlite3VdbeTypeofColumn(v, 3);
+ }
+
if( !isQuick ){
- /* Sanity check on record header decoding */
- sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nNVCol-1,3);
- sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG);
+ if( pPk ){
+ /* Verify WITHOUT ROWID keys are in ascending order */
+ int a1;
+ char *zErr;
+ a1 = sqlite3VdbeAddOp4Int(v, OP_IdxGT, iDataCur, 0,r2,pPk->nKeyCol);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp1(v, OP_IsNull, r2); VdbeCoverage(v);
+ zErr = sqlite3MPrintf(db,
+ "row not in PRIMARY KEY order for %s",
+ pTab->zName);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
+ integrityCheckResultRow(v);
+ sqlite3VdbeJumpHere(v, a1);
+ sqlite3VdbeJumpHere(v, a1+1);
+ for(j=0; j<pPk->nKeyCol; j++){
+ sqlite3ExprCodeLoadIndexColumn(pParse, pPk, iDataCur, j, r2+j);
+ }
+ }
}
- /* Verify that all NOT NULL columns really are NOT NULL */
+ /* Verify datatypes for all columns:
+ **
+ ** (1) NOT NULL columns may not contain a NULL
+ ** (2) Datatype must be exact for non-ANY columns in STRICT tables
+ ** (3) Datatype for TEXT columns in non-STRICT tables must be
+ ** NULL, TEXT, or BLOB.
+ ** (4) Datatype for numeric columns in non-STRICT tables must not
+ ** be a TEXT value that can be losslessly converted to numeric.
+ */
+ bStrict = (pTab->tabFlags & TF_Strict)!=0;
for(j=0; j<pTab->nCol; j++){
char *zErr;
- int jmp2;
+ Column *pCol = pTab->aCol + j; /* The column to be checked */
+ int labelError; /* Jump here to report an error */
+ int labelOk; /* Jump here if all looks ok */
+ int p1, p3, p4; /* Operands to the OP_IsType opcode */
+ int doTypeCheck; /* Check datatypes (besides NOT NULL) */
+
if( j==pTab->iPKey ) continue;
- if( pTab->aCol[j].notNull==0 ) continue;
- sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3);
- if( sqlite3VdbeGetOp(v,-1)->opcode==OP_Column ){
- sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG);
+ if( bStrict ){
+ doTypeCheck = pCol->eCType>COLTYPE_ANY;
+ }else{
+ doTypeCheck = pCol->affinity>SQLITE_AFF_BLOB;
+ }
+ if( pCol->notNull==0 && !doTypeCheck ) continue;
+
+ /* Compute the operands that will be needed for OP_IsType */
+ p4 = SQLITE_NULL;
+ if( pCol->colFlags & COLFLAG_VIRTUAL ){
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3);
+ p1 = -1;
+ p3 = 3;
+ }else{
+ if( pCol->iDflt ){
+ sqlite3_value *pDfltValue = 0;
+ sqlite3ValueFromExpr(db, sqlite3ColumnExpr(pTab,pCol), ENC(db),
+ pCol->affinity, &pDfltValue);
+ if( pDfltValue ){
+ p4 = sqlite3_value_type(pDfltValue);
+ sqlite3ValueFree(pDfltValue);
+ }
+ }
+ p1 = iDataCur;
+ if( !HasRowid(pTab) ){
+ testcase( j!=sqlite3TableColumnToStorage(pTab, j) );
+ p3 = sqlite3TableColumnToIndex(sqlite3PrimaryKeyIndex(pTab), j);
+ }else{
+ p3 = sqlite3TableColumnToStorage(pTab,j);
+ testcase( p3!=j);
+ }
}
- jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v);
- zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName,
- pTab->aCol[j].zName);
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
+
+ labelError = sqlite3VdbeMakeLabel(pParse);
+ labelOk = sqlite3VdbeMakeLabel(pParse);
+ if( pCol->notNull ){
+ /* (1) NOT NULL columns may not contain a NULL */
+ int jmp3;
+ int jmp2 = sqlite3VdbeAddOp4Int(v, OP_IsType, p1, labelOk, p3, p4);
+ VdbeCoverage(v);
+ if( p1<0 ){
+ sqlite3VdbeChangeP5(v, 0x0f); /* INT, REAL, TEXT, or BLOB */
+ jmp3 = jmp2;
+ }else{
+ sqlite3VdbeChangeP5(v, 0x0d); /* INT, TEXT, or BLOB */
+ /* OP_IsType does not detect NaN values in the database file
+ ** which should be treated as a NULL. So if the header type
+ ** is REAL, we have to load the actual data using OP_Column
+ ** to reliably determine if the value is a NULL. */
+ sqlite3VdbeAddOp3(v, OP_Column, p1, p3, 3);
+ jmp3 = sqlite3VdbeAddOp2(v, OP_NotNull, 3, labelOk);
+ VdbeCoverage(v);
+ }
+ zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName,
+ pCol->zCnName);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
+ if( doTypeCheck ){
+ sqlite3VdbeGoto(v, labelError);
+ sqlite3VdbeJumpHere(v, jmp2);
+ sqlite3VdbeJumpHere(v, jmp3);
+ }else{
+ /* VDBE byte code will fall thru */
+ }
+ }
+ if( bStrict && doTypeCheck ){
+ /* (2) Datatype must be exact for non-ANY columns in STRICT tables*/
+ static unsigned char aStdTypeMask[] = {
+ 0x1f, /* ANY */
+ 0x18, /* BLOB */
+ 0x11, /* INT */
+ 0x11, /* INTEGER */
+ 0x13, /* REAL */
+ 0x14 /* TEXT */
+ };
+ sqlite3VdbeAddOp4Int(v, OP_IsType, p1, labelOk, p3, p4);
+ assert( pCol->eCType>=1 && pCol->eCType<=sizeof(aStdTypeMask) );
+ sqlite3VdbeChangeP5(v, aStdTypeMask[pCol->eCType-1]);
+ VdbeCoverage(v);
+ zErr = sqlite3MPrintf(db, "non-%s value in %s.%s",
+ sqlite3StdType[pCol->eCType-1],
+ pTab->zName, pTab->aCol[j].zCnName);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
+ }else if( !bStrict && pCol->affinity==SQLITE_AFF_TEXT ){
+ /* (3) Datatype for TEXT columns in non-STRICT tables must be
+ ** NULL, TEXT, or BLOB. */
+ sqlite3VdbeAddOp4Int(v, OP_IsType, p1, labelOk, p3, p4);
+ sqlite3VdbeChangeP5(v, 0x1c); /* NULL, TEXT, or BLOB */
+ VdbeCoverage(v);
+ zErr = sqlite3MPrintf(db, "NUMERIC value in %s.%s",
+ pTab->zName, pTab->aCol[j].zCnName);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
+ }else if( !bStrict && pCol->affinity>=SQLITE_AFF_NUMERIC ){
+ /* (4) Datatype for numeric columns in non-STRICT tables must not
+ ** be a TEXT value that can be converted to numeric. */
+ sqlite3VdbeAddOp4Int(v, OP_IsType, p1, labelOk, p3, p4);
+ sqlite3VdbeChangeP5(v, 0x1b); /* NULL, INT, FLOAT, or BLOB */
+ VdbeCoverage(v);
+ if( p1>=0 ){
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3);
+ }
+ sqlite3VdbeAddOp4(v, OP_Affinity, 3, 1, 0, "C", P4_STATIC);
+ sqlite3VdbeAddOp4Int(v, OP_IsType, -1, labelOk, 3, p4);
+ sqlite3VdbeChangeP5(v, 0x1c); /* NULL, TEXT, or BLOB */
+ VdbeCoverage(v);
+ zErr = sqlite3MPrintf(db, "TEXT value in %s.%s",
+ pTab->zName, pTab->aCol[j].zCnName);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC);
+ }
+ sqlite3VdbeResolveLabel(v, labelError);
integrityCheckResultRow(v);
- sqlite3VdbeJumpHere(v, jmp2);
+ sqlite3VdbeResolveLabel(v, labelOk);
}
/* Verify CHECK constraints */
if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){
@@ -130166,7 +136989,8 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( !isQuick ){ /* Omit the remaining tests for quick_check */
/* Validate index entries for the current row */
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
- int jmp2, jmp3, jmp4, jmp5;
+ int jmp2, jmp3, jmp4, jmp5, label6;
+ int kk;
int ckUniq = sqlite3VdbeMakeLabel(pParse);
if( pPk==pIdx ) continue;
r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3,
@@ -130184,13 +137008,49 @@ SQLITE_PRIVATE void sqlite3Pragma(
sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3);
jmp4 = integrityCheckResultRow(v);
sqlite3VdbeJumpHere(v, jmp2);
+
+ /* The OP_IdxRowid opcode is an optimized version of OP_Column
+ ** that extracts the rowid off the end of the index record.
+ ** But it only works correctly if index record does not have
+ ** any extra bytes at the end. Verify that this is the case. */
+ if( HasRowid(pTab) ){
+ int jmp7;
+ sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur+j, 3);
+ jmp7 = sqlite3VdbeAddOp3(v, OP_Eq, 3, 0, r1+pIdx->nColumn-1);
+ VdbeCoverageNeverNull(v);
+ sqlite3VdbeLoadString(v, 3,
+ "rowid not at end-of-record for row ");
+ sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3);
+ sqlite3VdbeLoadString(v, 4, " of index ");
+ sqlite3VdbeGoto(v, jmp5-1);
+ sqlite3VdbeJumpHere(v, jmp7);
+ }
+
+ /* Any indexed columns with non-BINARY collations must still hold
+ ** the exact same text value as the table. */
+ label6 = 0;
+ for(kk=0; kk<pIdx->nKeyCol; kk++){
+ if( pIdx->azColl[kk]==sqlite3StrBINARY ) continue;
+ if( label6==0 ) label6 = sqlite3VdbeMakeLabel(pParse);
+ sqlite3VdbeAddOp3(v, OP_Column, iIdxCur+j, kk, 3);
+ sqlite3VdbeAddOp3(v, OP_Ne, 3, label6, r1+kk); VdbeCoverage(v);
+ }
+ if( label6 ){
+ int jmp6 = sqlite3VdbeAddOp0(v, OP_Goto);
+ sqlite3VdbeResolveLabel(v, label6);
+ sqlite3VdbeLoadString(v, 3, "row ");
+ sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3);
+ sqlite3VdbeLoadString(v, 4, " values differ from index ");
+ sqlite3VdbeGoto(v, jmp5-1);
+ sqlite3VdbeJumpHere(v, jmp6);
+ }
+
/* For UNIQUE indexes, verify that only one entry exists with the
** current key. The entry is unique if (1) any column is NULL
** or (2) the next entry has a different key */
if( IsUniqueIndex(pIdx) ){
int uniqOk = sqlite3VdbeMakeLabel(pParse);
int jmp6;
- int kk;
for(kk=0; kk<pIdx->nKeyCol; kk++){
int iCol = pIdx->aiColumn[kk];
assert( iCol!=XN_ROWID && iCol<pTab->nCol );
@@ -130225,6 +137085,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
integrityCheckResultRow(v);
sqlite3VdbeJumpHere(v, addr);
}
+ if( pPk ){
+ sqlite3ReleaseTempRange(pParse, r2, pPk->nKeyCol);
+ }
}
}
}
@@ -130375,6 +137238,11 @@ SQLITE_PRIVATE void sqlite3Pragma(
aOp[1].p2 = iCookie;
aOp[1].p3 = sqlite3Atoi(zRight);
aOp[1].p5 = 1;
+ if( iCookie==BTREE_SCHEMA_VERSION && (db->flags & SQLITE_Defensive)!=0 ){
+ /* Do not allow the use of PRAGMA schema_version=VALUE in defensive
+ ** mode. Change the OP_SetCookie opcode into a no-op. */
+ aOp[1].opcode = OP_Noop;
+ }
}else{
/* Read the specified cookie value */
static const VdbeOpList readCookie[] = {
@@ -130671,12 +137539,12 @@ SQLITE_PRIVATE void sqlite3Pragma(
case PragTyp_ANALYSIS_LIMIT: {
sqlite3_int64 N;
if( zRight
- && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK
+ && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK /* IMP: R-40975-20399 */
&& N>=0
){
db->nAnalysisLimit = (int)(N&0x7fffffff);
}
- returnSingleInt(v, db->nAnalysisLimit);
+ returnSingleInt(v, db->nAnalysisLimit); /* IMP: R-57594-65522 */
break;
}
@@ -131078,10 +137946,15 @@ static void corruptSchema(
pData->rc = SQLITE_NOMEM_BKPT;
}else if( pData->pzErrMsg[0]!=0 ){
/* A error message has already been generated. Do not overwrite it */
- }else if( pData->mInitFlags & (INITFLAG_AlterRename|INITFLAG_AlterDrop) ){
+ }else if( pData->mInitFlags & (INITFLAG_AlterMask) ){
+ static const char *azAlterType[] = {
+ "rename",
+ "drop column",
+ "add column"
+ };
*pData->pzErrMsg = sqlite3MPrintf(db,
"error in %s %s after %s: %s", azObj[0], azObj[1],
- (pData->mInitFlags & INITFLAG_AlterRename) ? "rename" : "drop column",
+ azAlterType[(pData->mInitFlags&INITFLAG_AlterMask)-1],
zExtra
);
pData->rc = SQLITE_ERROR;
@@ -131183,7 +138056,7 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char
}
}
db->init.orphanTrigger = 0;
- db->init.azInit = argv;
+ db->init.azInit = (const char**)argv;
pStmt = 0;
TESTONLY(rcp = ) sqlite3Prepare(db, argv[4], -1, 0, 0, &pStmt, 0);
rc = db->errCode;
@@ -131202,6 +138075,7 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char
}
}
}
+ db->init.azInit = sqlite3StdType; /* Any array of string ptrs will do */
sqlite3_finalize(pStmt);
}else if( argv[1]==0 || (argv[4]!=0 && argv[4][0]!=0) ){
corruptSchema(pData, argv, 0);
@@ -131349,7 +138223,14 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl
#else
encoding = SQLITE_UTF8;
#endif
- sqlite3SetTextEncoding(db, encoding);
+ if( db->nVdbeActive>0 && encoding!=ENC(db)
+ && (db->mDbFlags & DBFLAG_Vacuum)==0
+ ){
+ rc = SQLITE_LOCKED;
+ goto initone_error_out;
+ }else{
+ sqlite3SetTextEncoding(db, encoding);
+ }
}else{
/* If opening an attached database, the encoding much match ENC(db) */
if( (meta[BTREE_TEXT_ENCODING-1] & 3)!=ENC(db) ){
@@ -131432,7 +138313,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl
sqlite3ResetAllSchemasOfConnection(db);
pDb = &db->aDb[iDb];
}else
- if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){
+ if( rc==SQLITE_OK || ((db->flags&SQLITE_NoSchemaError) && rc!=SQLITE_NOMEM)){
/* Hack: If the SQLITE_NoSchemaError flag is set, then consider
** the schema loaded, even if errors (other than OOM) occurred. In
** this situation the current sqlite3_prepare() operation will fail,
@@ -131563,8 +138444,8 @@ static void schemaIsValid(Parse *pParse){
sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie);
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){
+ if( DbHasProperty(db, iDb, DB_SchemaLoaded) ) pParse->rc = SQLITE_SCHEMA;
sqlite3ResetOneSchema(db, iDb);
- pParse->rc = SQLITE_SCHEMA;
}
/* Close the transaction, if one was opened. */
@@ -131611,23 +138492,30 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){
/*
** Free all memory allocations in the pParse object
*/
-SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){
+SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse *pParse){
sqlite3 *db = pParse->db;
+ assert( db!=0 );
+ assert( db->pParse==pParse );
+ assert( pParse->nested==0 );
+#ifndef SQLITE_OMIT_SHARED_CACHE
+ if( pParse->aTableLock ) sqlite3DbNNFreeNN(db, pParse->aTableLock);
+#endif
while( pParse->pCleanup ){
ParseCleanup *pCleanup = pParse->pCleanup;
pParse->pCleanup = pCleanup->pNext;
pCleanup->xCleanup(db, pCleanup->pPtr);
- sqlite3DbFreeNN(db, pCleanup);
+ sqlite3DbNNFreeNN(db, pCleanup);
}
- sqlite3DbFree(db, pParse->aLabel);
+ if( pParse->aLabel ) sqlite3DbNNFreeNN(db, pParse->aLabel);
if( pParse->pConstExpr ){
sqlite3ExprListDelete(db, pParse->pConstExpr);
}
- if( db ){
- assert( db->lookaside.bDisable >= pParse->disableLookaside );
- db->lookaside.bDisable -= pParse->disableLookaside;
- db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue;
- }
+ assert( db->lookaside.bDisable >= pParse->disableLookaside );
+ db->lookaside.bDisable -= pParse->disableLookaside;
+ db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue;
+ assert( pParse->db->pParse==pParse );
+ db->pParse = pParse->pOuterParse;
+ pParse->db = 0;
pParse->disableLookaside = 0;
}
@@ -131640,7 +138528,7 @@ SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){
** cost for this mechansim (an extra malloc), so it should not be used
** for common cleanups that happen on most calls. But for less
** common cleanups, we save a single NULL-pointer comparison in
-** sqlite3ParserReset(), which reduces the total CPU cycle count.
+** sqlite3ParseObjectReset(), which reduces the total CPU cycle count.
**
** If a memory allocation error occurs, then the cleanup happens immediately.
** When either SQLITE_DEBUG or SQLITE_COVERAGE_TEST are defined, the
@@ -131681,6 +138569,33 @@ SQLITE_PRIVATE void *sqlite3ParserAddCleanup(
}
/*
+** Turn bulk memory into a valid Parse object and link that Parse object
+** into database connection db.
+**
+** Call sqlite3ParseObjectReset() to undo this operation.
+**
+** Caution: Do not confuse this routine with sqlite3ParseObjectInit() which
+** is generated by Lemon.
+*/
+SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse *pParse, sqlite3 *db){
+ memset(PARSE_HDR(pParse), 0, PARSE_HDR_SZ);
+ memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ);
+ assert( db->pParse!=pParse );
+ pParse->pOuterParse = db->pParse;
+ db->pParse = pParse;
+ pParse->db = db;
+ if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory");
+}
+
+/*
+** Maximum number of times that we will try again to prepare a statement
+** that returns SQLITE_ERROR_RETRY.
+*/
+#ifndef SQLITE_MAX_PREPARE_RETRY
+# define SQLITE_MAX_PREPARE_RETRY 25
+#endif
+
+/*
** Compile the UTF-8 encoded SQL statement zSql into a statement handle.
*/
static int sqlite3Prepare(
@@ -131692,16 +138607,23 @@ static int sqlite3Prepare(
sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
const char **pzTail /* OUT: End of parsed string */
){
- char *zErrMsg = 0; /* Error message */
int rc = SQLITE_OK; /* Result code */
int i; /* Loop counter */
Parse sParse; /* Parsing context */
- memset(&sParse, 0, PARSE_HDR_SZ);
+ /* sqlite3ParseObjectInit(&sParse, db); // inlined for performance */
+ memset(PARSE_HDR(&sParse), 0, PARSE_HDR_SZ);
memset(PARSE_TAIL(&sParse), 0, PARSE_TAIL_SZ);
+ sParse.pOuterParse = db->pParse;
+ db->pParse = &sParse;
+ sParse.db = db;
sParse.pReprepare = pReprepare;
assert( ppStmt && *ppStmt==0 );
- /* assert( !db->mallocFailed ); // not true with SQLITE_USE_ALLOCA */
+ if( db->mallocFailed ){
+ sqlite3ErrorMsg(&sParse, "out of memory");
+ db->errCode = rc = SQLITE_NOMEM;
+ goto end_prepare;
+ }
assert( sqlite3_mutex_held(db->mutex) );
/* For a long-term use prepared statement avoid the use of
@@ -131711,7 +138633,7 @@ static int sqlite3Prepare(
sParse.disableLookaside++;
DisableLookaside;
}
- sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0;
+ sParse.prepFlags = prepFlags & 0xff;
/* Check to verify that it is possible to get a read lock on all
** database schemas. The inability to get a read lock indicates that
@@ -131752,9 +138674,10 @@ static int sqlite3Prepare(
}
}
- sqlite3VtabUnlockList(db);
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ if( db->pDisconnect ) sqlite3VtabUnlockList(db);
+#endif
- sParse.db = db;
if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){
char *zSqlCopy;
int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
@@ -131767,14 +138690,14 @@ static int sqlite3Prepare(
}
zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes);
if( zSqlCopy ){
- sqlite3RunParser(&sParse, zSqlCopy, &zErrMsg);
+ sqlite3RunParser(&sParse, zSqlCopy);
sParse.zTail = &zSql[sParse.zTail-zSqlCopy];
sqlite3DbFree(db, zSqlCopy);
}else{
sParse.zTail = &zSql[nBytes];
}
}else{
- sqlite3RunParser(&sParse, zSql, &zErrMsg);
+ sqlite3RunParser(&sParse, zSql);
}
assert( 0==sParse.nQueryLoop );
@@ -131790,7 +138713,7 @@ static int sqlite3Prepare(
sParse.checkSchema = 0;
}
if( sParse.rc!=SQLITE_OK && sParse.rc!=SQLITE_DONE ){
- if( sParse.checkSchema ){
+ if( sParse.checkSchema && db->init.busy==0 ){
schemaIsValid(&sParse);
}
if( sParse.pVdbe ){
@@ -131798,14 +138721,14 @@ static int sqlite3Prepare(
}
assert( 0==(*ppStmt) );
rc = sParse.rc;
- if( zErrMsg ){
- sqlite3ErrorWithMsg(db, rc, "%s", zErrMsg);
- sqlite3DbFree(db, zErrMsg);
+ if( sParse.zErrMsg ){
+ sqlite3ErrorWithMsg(db, rc, "%s", sParse.zErrMsg);
+ sqlite3DbFree(db, sParse.zErrMsg);
}else{
sqlite3Error(db, rc);
}
}else{
- assert( zErrMsg==0 );
+ assert( sParse.zErrMsg==0 );
*ppStmt = (sqlite3_stmt*)sParse.pVdbe;
rc = SQLITE_OK;
sqlite3ErrorClear(db);
@@ -131821,7 +138744,7 @@ static int sqlite3Prepare(
end_prepare:
- sqlite3ParserReset(&sParse);
+ sqlite3ParseObjectReset(&sParse);
return rc;
}
static int sqlite3LockAndPrepare(
@@ -131851,7 +138774,8 @@ static int sqlite3LockAndPrepare(
** reset is considered a permanent error. */
rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
assert( rc==SQLITE_OK || *ppStmt==0 );
- }while( rc==SQLITE_ERROR_RETRY
+ if( rc==SQLITE_OK || db->mallocFailed ) break;
+ }while( (rc==SQLITE_ERROR_RETRY && (cnt++)<SQLITE_MAX_PREPARE_RETRY)
|| (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) );
sqlite3BtreeLeaveAll(db);
rc = sqlite3ApiExit(db, rc);
@@ -132092,7 +139016,7 @@ SQLITE_API int sqlite3_prepare16_v3(
*/
typedef struct DistinctCtx DistinctCtx;
struct DistinctCtx {
- u8 isTnct; /* True if the DISTINCT keyword is present */
+ u8 isTnct; /* 0: Not distinct. 1: DISTICT 2: DISTINCT and ORDER BY */
u8 eTnctType; /* One of the WHERE_DISTINCT_* operators */
int tabTnct; /* Ephemeral table used for DISTINCT processing */
int addrTnct; /* Address of OP_OpenEphemeral opcode for tabTnct */
@@ -132136,6 +139060,10 @@ struct SortCtx {
} aDefer[4];
#endif
struct RowLoadInfo *pDeferredRowLoad; /* Deferred row loading info or NULL */
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+ int addrPush; /* First instruction to push data into sorter */
+ int addrPushEnd; /* Last instruction that pushes data into sorter */
+#endif
};
#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */
@@ -132147,6 +139075,7 @@ struct SortCtx {
** If bFree==0, Leave the first Select object unfreed
*/
static void clearSelect(sqlite3 *db, Select *p, int bFree){
+ assert( db!=0 );
while( p ){
Select *pPrior = p->pPrior;
sqlite3ExprListDelete(db, p->pEList);
@@ -132166,7 +139095,7 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){
sqlite3WindowUnlinkFromSelect(p->pWin);
}
#endif
- if( bFree ) sqlite3DbFreeNN(db, p);
+ if( bFree ) sqlite3DbNNFreeNN(db, p);
p = pPrior;
bFree = 1;
}
@@ -132275,6 +139204,52 @@ static Select *findRightmost(Select *p){
**
** If an illegal or unsupported join type is seen, then still return
** a join type, but put an error in the pParse structure.
+**
+** These are the valid join types:
+**
+**
+** pA pB pC Return Value
+** ------- ----- ----- ------------
+** CROSS - - JT_CROSS
+** INNER - - JT_INNER
+** LEFT - - JT_LEFT|JT_OUTER
+** LEFT OUTER - JT_LEFT|JT_OUTER
+** RIGHT - - JT_RIGHT|JT_OUTER
+** RIGHT OUTER - JT_RIGHT|JT_OUTER
+** FULL - - JT_LEFT|JT_RIGHT|JT_OUTER
+** FULL OUTER - JT_LEFT|JT_RIGHT|JT_OUTER
+** NATURAL INNER - JT_NATURAL|JT_INNER
+** NATURAL LEFT - JT_NATURAL|JT_LEFT|JT_OUTER
+** NATURAL LEFT OUTER JT_NATURAL|JT_LEFT|JT_OUTER
+** NATURAL RIGHT - JT_NATURAL|JT_RIGHT|JT_OUTER
+** NATURAL RIGHT OUTER JT_NATURAL|JT_RIGHT|JT_OUTER
+** NATURAL FULL - JT_NATURAL|JT_LEFT|JT_RIGHT
+** NATURAL FULL OUTER JT_NATRUAL|JT_LEFT|JT_RIGHT
+**
+** To preserve historical compatibly, SQLite also accepts a variety
+** of other non-standard and in many cases non-sensical join types.
+** This routine makes as much sense at it can from the nonsense join
+** type and returns a result. Examples of accepted nonsense join types
+** include but are not limited to:
+**
+** INNER CROSS JOIN -> same as JOIN
+** NATURAL CROSS JOIN -> same as NATURAL JOIN
+** OUTER LEFT JOIN -> same as LEFT JOIN
+** LEFT NATURAL JOIN -> same as NATURAL LEFT JOIN
+** LEFT RIGHT JOIN -> same as FULL JOIN
+** RIGHT OUTER FULL JOIN -> same as FULL JOIN
+** CROSS CROSS CROSS JOIN -> same as JOIN
+**
+** The only restrictions on the join type name are:
+**
+** * "INNER" cannot appear together with "OUTER", "LEFT", "RIGHT",
+** or "FULL".
+**
+** * "CROSS" cannot appear together with "OUTER", "LEFT", "RIGHT,
+** or "FULL".
+**
+** * If "OUTER" is present then there must also be one of
+** "LEFT", "RIGHT", or "FULL"
*/
SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){
int jointype = 0;
@@ -132287,13 +139262,13 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p
u8 nChar; /* Length of the keyword in characters */
u8 code; /* Join type mask */
} aKeyword[] = {
- /* natural */ { 0, 7, JT_NATURAL },
- /* left */ { 6, 4, JT_LEFT|JT_OUTER },
- /* outer */ { 10, 5, JT_OUTER },
- /* right */ { 14, 5, JT_RIGHT|JT_OUTER },
- /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER },
- /* inner */ { 23, 5, JT_INNER },
- /* cross */ { 28, 5, JT_INNER|JT_CROSS },
+ /* (0) natural */ { 0, 7, JT_NATURAL },
+ /* (1) left */ { 6, 4, JT_LEFT|JT_OUTER },
+ /* (2) outer */ { 10, 5, JT_OUTER },
+ /* (3) right */ { 14, 5, JT_RIGHT|JT_OUTER },
+ /* (4) full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER },
+ /* (5) inner */ { 23, 5, JT_INNER },
+ /* (6) cross */ { 28, 5, JT_INNER|JT_CROSS },
};
int i, j;
apAll[0] = pA;
@@ -132316,18 +139291,15 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p
}
if(
(jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) ||
- (jointype & JT_ERROR)!=0
+ (jointype & JT_ERROR)!=0 ||
+ (jointype & (JT_OUTER|JT_LEFT|JT_RIGHT))==JT_OUTER
){
- const char *zSp = " ";
- assert( pB!=0 );
- if( pC==0 ){ zSp++; }
- sqlite3ErrorMsg(pParse, "unknown or unsupported join type: "
- "%T %T%s%T", pA, pB, zSp, pC);
- jointype = JT_INNER;
- }else if( (jointype & JT_OUTER)!=0
- && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){
- sqlite3ErrorMsg(pParse,
- "RIGHT and FULL OUTER JOINs are not currently supported");
+ const char *zSp1 = " ";
+ const char *zSp2 = " ";
+ if( pB==0 ){ zSp1++; }
+ if( pC==0 ){ zSp2++; }
+ sqlite3ErrorMsg(pParse, "unknown join type: "
+ "%T%s%T%s%T", pA, zSp1, pB, zSp2, pC);
jointype = JT_INNER;
}
return jointype;
@@ -132342,14 +139314,31 @@ SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){
u8 h = sqlite3StrIHash(zCol);
Column *pCol;
for(pCol=pTab->aCol, i=0; i<pTab->nCol; pCol++, i++){
- if( pCol->hName==h && sqlite3StrICmp(pCol->zName, zCol)==0 ) return i;
+ if( pCol->hName==h && sqlite3StrICmp(pCol->zCnName, zCol)==0 ) return i;
}
return -1;
}
/*
-** Search the first N tables in pSrc, from left to right, looking for a
-** table that has a column named zCol.
+** Mark a subquery result column as having been used.
+*/
+SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem *pItem, int iCol){
+ assert( pItem!=0 );
+ assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) );
+ if( pItem->fg.isNestedFrom ){
+ ExprList *pResults;
+ assert( pItem->pSelect!=0 );
+ pResults = pItem->pSelect->pEList;
+ assert( pResults!=0 );
+ assert( iCol>=0 && iCol<pResults->nExpr );
+ pResults->a[iCol].fg.bUsed = 1;
+ }
+}
+
+/*
+** Search the tables iStart..iEnd (inclusive) in pSrc, looking for a
+** table that has a column named zCol. The search is left-to-right.
+** The first match found is returned.
**
** When found, set *piTab and *piCol to the table index and column index
** of the matching column and return TRUE.
@@ -132358,22 +139347,27 @@ SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){
*/
static int tableAndColumnIndex(
SrcList *pSrc, /* Array of tables to search */
- int N, /* Number of tables in pSrc->a[] to search */
+ int iStart, /* First member of pSrc->a[] to check */
+ int iEnd, /* Last member of pSrc->a[] to check */
const char *zCol, /* Name of the column we are looking for */
int *piTab, /* Write index of pSrc->a[] here */
int *piCol, /* Write index of pSrc->a[*piTab].pTab->aCol[] here */
- int bIgnoreHidden /* True to ignore hidden columns */
+ int bIgnoreHidden /* Ignore hidden columns */
){
int i; /* For looping over tables in pSrc */
int iCol; /* Index of column matching zCol */
+ assert( iEnd<pSrc->nSrc );
+ assert( iStart>=0 );
assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */
- for(i=0; i<N; i++){
+
+ for(i=iStart; i<=iEnd; i++){
iCol = sqlite3ColumnIndex(pSrc->a[i].pTab, zCol);
if( iCol>=0
&& (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0)
){
if( piTab ){
+ sqlite3SrcItemColumnUsed(&pSrc->a[i], iCol);
*piTab = i;
*piCol = iCol;
}
@@ -132384,63 +139378,19 @@ static int tableAndColumnIndex(
}
/*
-** This function is used to add terms implied by JOIN syntax to the
-** WHERE clause expression of a SELECT statement. The new term, which
-** is ANDed with the existing WHERE clause, is of the form:
-**
-** (tab1.col1 = tab2.col2)
-**
-** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the
-** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is
-** column iColRight of tab2.
-*/
-static void addWhereTerm(
- Parse *pParse, /* Parsing context */
- SrcList *pSrc, /* List of tables in FROM clause */
- int iLeft, /* Index of first table to join in pSrc */
- int iColLeft, /* Index of column in first table */
- int iRight, /* Index of second table in pSrc */
- int iColRight, /* Index of column in second table */
- int isOuterJoin, /* True if this is an OUTER join */
- Expr **ppWhere /* IN/OUT: The WHERE clause to add to */
-){
- sqlite3 *db = pParse->db;
- Expr *pE1;
- Expr *pE2;
- Expr *pEq;
-
- assert( iLeft<iRight );
- assert( pSrc->nSrc>iRight );
- assert( pSrc->a[iLeft].pTab );
- assert( pSrc->a[iRight].pTab );
-
- pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft);
- pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight);
-
- pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2);
- if( pEq && isOuterJoin ){
- ExprSetProperty(pEq, EP_FromJoin);
- assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) );
- ExprSetVVAProperty(pEq, EP_NoReduce);
- pEq->iRightJoinTable = pE2->iTable;
- }
- *ppWhere = sqlite3ExprAnd(pParse, *ppWhere, pEq);
-}
-
-/*
-** Set the EP_FromJoin property on all terms of the given expression.
-** And set the Expr.iRightJoinTable to iTable for every term in the
+** Set the EP_OuterON property on all terms of the given expression.
+** And set the Expr.w.iJoin to iTable for every term in the
** expression.
**
-** The EP_FromJoin property is used on terms of an expression to tell
-** the LEFT OUTER JOIN processing logic that this term is part of the
+** The EP_OuterON property is used on terms of an expression to tell
+** the OUTER JOIN processing logic that this term is part of the
** join restriction specified in the ON or USING clause and not a part
** of the more general WHERE clause. These terms are moved over to the
** WHERE clause during join processing but we need to remember that they
** originated in the ON or USING clause.
**
-** The Expr.iRightJoinTable tells the WHERE clause processing that the
-** expression depends on table iRightJoinTable even if that table is not
+** The Expr.w.iJoin tells the WHERE clause processing that the
+** expression depends on table w.iJoin even if that table is not
** explicitly mentioned in the expression. That information is needed
** for cases like this:
**
@@ -132453,64 +139403,86 @@ static void addWhereTerm(
** after the t1 loop and rows with t1.x!=5 will never appear in
** the output, which is incorrect.
*/
-SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable){
+SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){
+ assert( joinFlag==EP_OuterON || joinFlag==EP_InnerON );
while( p ){
- ExprSetProperty(p, EP_FromJoin);
+ ExprSetProperty(p, joinFlag);
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
ExprSetVVAProperty(p, EP_NoReduce);
- p->iRightJoinTable = iTable;
- if( p->op==TK_FUNCTION && p->x.pList ){
- int i;
- for(i=0; i<p->x.pList->nExpr; i++){
- sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable);
+ p->w.iJoin = iTable;
+ if( p->op==TK_FUNCTION ){
+ assert( ExprUseXList(p) );
+ if( p->x.pList ){
+ int i;
+ for(i=0; i<p->x.pList->nExpr; i++){
+ sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable, joinFlag);
+ }
}
}
- sqlite3SetJoinExpr(p->pLeft, iTable);
+ sqlite3SetJoinExpr(p->pLeft, iTable, joinFlag);
p = p->pRight;
}
}
-/* Undo the work of sqlite3SetJoinExpr(). In the expression p, convert every
-** term that is marked with EP_FromJoin and iRightJoinTable==iTable into
-** an ordinary term that omits the EP_FromJoin mark.
+/* Undo the work of sqlite3SetJoinExpr(). This is used when a LEFT JOIN
+** is simplified into an ordinary JOIN, and when an ON expression is
+** "pushed down" into the WHERE clause of a subquery.
+**
+** Convert every term that is marked with EP_OuterON and w.iJoin==iTable into
+** an ordinary term that omits the EP_OuterON mark. Or if iTable<0, then
+** just clear every EP_OuterON and EP_InnerON mark from the expression tree.
**
-** This happens when a LEFT JOIN is simplified into an ordinary JOIN.
+** If nullable is true, that means that Expr p might evaluate to NULL even
+** if it is a reference to a NOT NULL column. This can happen, for example,
+** if the table that p references is on the left side of a RIGHT JOIN.
+** If nullable is true, then take care to not remove the EP_CanBeNull bit.
+** See forum thread https://sqlite.org/forum/forumpost/b40696f50145d21c
*/
-static void unsetJoinExpr(Expr *p, int iTable){
+static void unsetJoinExpr(Expr *p, int iTable, int nullable){
while( p ){
- if( ExprHasProperty(p, EP_FromJoin)
- && (iTable<0 || p->iRightJoinTable==iTable) ){
- ExprClearProperty(p, EP_FromJoin);
+ if( iTable<0 || (ExprHasProperty(p, EP_OuterON) && p->w.iJoin==iTable) ){
+ ExprClearProperty(p, EP_OuterON|EP_InnerON);
+ if( iTable>=0 ) ExprSetProperty(p, EP_InnerON);
}
- if( p->op==TK_COLUMN && p->iTable==iTable ){
+ if( p->op==TK_COLUMN && p->iTable==iTable && !nullable ){
ExprClearProperty(p, EP_CanBeNull);
}
- if( p->op==TK_FUNCTION && p->x.pList ){
- int i;
- for(i=0; i<p->x.pList->nExpr; i++){
- unsetJoinExpr(p->x.pList->a[i].pExpr, iTable);
+ if( p->op==TK_FUNCTION ){
+ assert( ExprUseXList(p) );
+ if( p->x.pList ){
+ int i;
+ for(i=0; i<p->x.pList->nExpr; i++){
+ unsetJoinExpr(p->x.pList->a[i].pExpr, iTable, nullable);
+ }
}
}
- unsetJoinExpr(p->pLeft, iTable);
+ unsetJoinExpr(p->pLeft, iTable, nullable);
p = p->pRight;
}
}
/*
** This routine processes the join information for a SELECT statement.
-** ON and USING clauses are converted into extra terms of the WHERE clause.
-** NATURAL joins also create extra WHERE clause terms.
+**
+** * A NATURAL join is converted into a USING join. After that, we
+** do not need to be concerned with NATURAL joins and we only have
+** think about USING joins.
+**
+** * ON and USING clauses result in extra terms being added to the
+** WHERE clause to enforce the specified constraints. The extra
+** WHERE clause terms will be tagged with EP_OuterON or
+** EP_InnerON so that we know that they originated in ON/USING.
**
** The terms of a FROM clause are contained in the Select.pSrc structure.
** The left most table is the first entry in Select.pSrc. The right-most
** table is the last entry. The join operator is held in the entry to
-** the left. Thus entry 0 contains the join operator for the join between
+** the right. Thus entry 1 contains the join operator for the join between
** entries 0 and 1. Any ON or USING clauses associated with the join are
-** also attached to the left entry.
+** also attached to the right entry.
**
** This routine returns the number of errors encountered.
*/
-static int sqliteProcessJoin(Parse *pParse, Select *p){
+static int sqlite3ProcessJoin(Parse *pParse, Select *p){
SrcList *pSrc; /* All tables in the FROM clause */
int i, j; /* Loop counters */
SrcItem *pLeft; /* Left table being joined */
@@ -132521,49 +139493,41 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){
pRight = &pLeft[1];
for(i=0; i<pSrc->nSrc-1; i++, pRight++, pLeft++){
Table *pRightTab = pRight->pTab;
- int isOuter;
+ u32 joinType;
if( NEVER(pLeft->pTab==0 || pRightTab==0) ) continue;
- isOuter = (pRight->fg.jointype & JT_OUTER)!=0;
+ joinType = (pRight->fg.jointype & JT_OUTER)!=0 ? EP_OuterON : EP_InnerON;
- /* When the NATURAL keyword is present, add WHERE clause terms for
- ** every column that the two tables have in common.
+ /* If this is a NATURAL join, synthesize an approprate USING clause
+ ** to specify which columns should be joined.
*/
if( pRight->fg.jointype & JT_NATURAL ){
- if( pRight->pOn || pRight->pUsing ){
+ IdList *pUsing = 0;
+ if( pRight->fg.isUsing || pRight->u3.pOn ){
sqlite3ErrorMsg(pParse, "a NATURAL join may not have "
"an ON or USING clause", 0);
return 1;
}
for(j=0; j<pRightTab->nCol; j++){
char *zName; /* Name of column in the right table */
- int iLeft; /* Matching left table */
- int iLeftCol; /* Matching column in the left table */
if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue;
- zName = pRightTab->aCol[j].zName;
- if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 1) ){
- addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j,
- isOuter, &p->pWhere);
+ zName = pRightTab->aCol[j].zCnName;
+ if( tableAndColumnIndex(pSrc, 0, i, zName, 0, 0, 1) ){
+ pUsing = sqlite3IdListAppend(pParse, pUsing, 0);
+ if( pUsing ){
+ assert( pUsing->nId>0 );
+ assert( pUsing->a[pUsing->nId-1].zName==0 );
+ pUsing->a[pUsing->nId-1].zName = sqlite3DbStrDup(pParse->db, zName);
+ }
}
}
- }
-
- /* Disallow both ON and USING clauses in the same join
- */
- if( pRight->pOn && pRight->pUsing ){
- sqlite3ErrorMsg(pParse, "cannot have both ON and USING "
- "clauses in the same join");
- return 1;
- }
-
- /* Add the ON clause to the end of the WHERE clause, connected by
- ** an AND operator.
- */
- if( pRight->pOn ){
- if( isOuter ) sqlite3SetJoinExpr(pRight->pOn, pRight->iCursor);
- p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->pOn);
- pRight->pOn = 0;
+ if( pUsing ){
+ pRight->fg.isUsing = 1;
+ pRight->fg.isSynthUsing = 1;
+ pRight->u3.pUsing = pUsing;
+ }
+ if( pParse->nErr ) return 1;
}
/* Create extra terms on the WHERE clause for each column named
@@ -132573,27 +139537,88 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){
** Report an error if any column mentioned in the USING clause is
** not contained in both tables to be joined.
*/
- if( pRight->pUsing ){
- IdList *pList = pRight->pUsing;
+ if( pRight->fg.isUsing ){
+ IdList *pList = pRight->u3.pUsing;
+ sqlite3 *db = pParse->db;
+ assert( pList!=0 );
for(j=0; j<pList->nId; j++){
char *zName; /* Name of the term in the USING clause */
int iLeft; /* Table on the left with matching column name */
int iLeftCol; /* Column number of matching column on the left */
int iRightCol; /* Column number of matching column on the right */
+ Expr *pE1; /* Reference to the column on the LEFT of the join */
+ Expr *pE2; /* Reference to the column on the RIGHT of the join */
+ Expr *pEq; /* Equality constraint. pE1 == pE2 */
zName = pList->a[j].zName;
iRightCol = sqlite3ColumnIndex(pRightTab, zName);
if( iRightCol<0
- || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 0)
+ || tableAndColumnIndex(pSrc, 0, i, zName, &iLeft, &iLeftCol,
+ pRight->fg.isSynthUsing)==0
){
sqlite3ErrorMsg(pParse, "cannot join using column %s - column "
"not present in both tables", zName);
return 1;
}
- addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, iRightCol,
- isOuter, &p->pWhere);
+ pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iLeftCol);
+ sqlite3SrcItemColumnUsed(&pSrc->a[iLeft], iLeftCol);
+ if( (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){
+ /* This branch runs if the query contains one or more RIGHT or FULL
+ ** JOINs. If only a single table on the left side of this join
+ ** contains the zName column, then this branch is a no-op.
+ ** But if there are two or more tables on the left side
+ ** of the join, construct a coalesce() function that gathers all
+ ** such tables. Raise an error if more than one of those references
+ ** to zName is not also within a prior USING clause.
+ **
+ ** We really ought to raise an error if there are two or more
+ ** non-USING references to zName on the left of an INNER or LEFT
+ ** JOIN. But older versions of SQLite do not do that, so we avoid
+ ** adding a new error so as to not break legacy applications.
+ */
+ ExprList *pFuncArgs = 0; /* Arguments to the coalesce() */
+ static const Token tkCoalesce = { "coalesce", 8 };
+ while( tableAndColumnIndex(pSrc, iLeft+1, i, zName, &iLeft, &iLeftCol,
+ pRight->fg.isSynthUsing)!=0 ){
+ if( pSrc->a[iLeft].fg.isUsing==0
+ || sqlite3IdListIndex(pSrc->a[iLeft].u3.pUsing, zName)<0
+ ){
+ sqlite3ErrorMsg(pParse, "ambiguous reference to %s in USING()",
+ zName);
+ break;
+ }
+ pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1);
+ pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iLeftCol);
+ sqlite3SrcItemColumnUsed(&pSrc->a[iLeft], iLeftCol);
+ }
+ if( pFuncArgs ){
+ pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1);
+ pE1 = sqlite3ExprFunction(pParse, pFuncArgs, &tkCoalesce, 0);
+ }
+ }
+ pE2 = sqlite3CreateColumnExpr(db, pSrc, i+1, iRightCol);
+ sqlite3SrcItemColumnUsed(pRight, iRightCol);
+ pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2);
+ assert( pE2!=0 || pEq==0 );
+ if( pEq ){
+ ExprSetProperty(pEq, joinType);
+ assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) );
+ ExprSetVVAProperty(pEq, EP_NoReduce);
+ pEq->w.iJoin = pE2->iTable;
+ }
+ p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pEq);
}
}
+
+ /* Add the ON clause to the end of the WHERE clause, connected by
+ ** an AND operator.
+ */
+ else if( pRight->u3.pOn ){
+ sqlite3SetJoinExpr(pRight->u3.pOn, pRight->iCursor, joinType);
+ p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->u3.pOn);
+ pRight->u3.pOn = 0;
+ pRight->fg.isOn = 1;
+ }
}
return 0;
}
@@ -132687,7 +139712,7 @@ static void pushOntoSorter(
** (2) All output columns are included in the sort record. In that
** case regData==regOrigData.
** (3) Some output columns are omitted from the sort record due to
- ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the
+ ** the SQLITE_ENABLE_SORTER_REFERENCES optimization, or due to the
** SQLITE_ECEL_OMITREF optimization, or due to the
** SortCtx.pDeferredRowLoad optimiation. In any of these cases
** regOrigData is 0 to prevent this routine from trying to copy
@@ -132695,6 +139720,10 @@ static void pushOntoSorter(
*/
assert( nData==1 || regData==regOrigData || regOrigData==0 );
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+ pSort->addrPush = sqlite3VdbeCurrentAddr(v);
+#endif
+
if( nPrefixReg ){
assert( nPrefixReg==nExpr+bSeq );
regBase = regData - nPrefixReg;
@@ -132795,6 +139824,9 @@ static void pushOntoSorter(
sqlite3VdbeChangeP2(v, iSkip,
pSort->labelOBLopt ? pSort->labelOBLopt : sqlite3VdbeCurrentAddr(v));
}
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+ pSort->addrPushEnd = sqlite3VdbeCurrentAddr(v)-1;
+#endif
}
/*
@@ -132944,7 +139976,9 @@ static void fixDistinctOpenEph(
int iVal, /* Value returned by codeDistinct() */
int iOpenEphAddr /* Address of OP_OpenEphemeral instruction for iTab */
){
- if( eTnctType==WHERE_DISTINCT_UNIQUE || eTnctType==WHERE_DISTINCT_ORDERED ){
+ if( pParse->nErr==0
+ && (eTnctType==WHERE_DISTINCT_UNIQUE || eTnctType==WHERE_DISTINCT_ORDERED)
+ ){
Vdbe *v = pParse->pVdbe;
sqlite3VdbeChangeToNoop(v, iOpenEphAddr);
if( sqlite3VdbeGetOp(v, iOpenEphAddr+1)->opcode==OP_Explain ){
@@ -132980,7 +140014,7 @@ static void fixDistinctOpenEph(
** retrieved directly from table t1. If the values are very large, this
** can be more efficient than storing them directly in the sorter records.
**
-** The ExprList_item.bSorterRef flag is set for each expression in pEList
+** The ExprList_item.fg.bSorterRef flag is set for each expression in pEList
** for which the sorter-reference optimization should be enabled.
** Additionally, the pSort->aDefer[] array is populated with entries
** for all cursors required to evaluate all selected expressions. Finally.
@@ -133001,9 +140035,13 @@ static void selectExprDefer(
struct ExprList_item *pItem = &pEList->a[i];
if( pItem->u.x.iOrderByCol==0 ){
Expr *pExpr = pItem->pExpr;
- Table *pTab = pExpr->y.pTab;
- if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab)
- && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)
+ Table *pTab;
+ if( pExpr->op==TK_COLUMN
+ && pExpr->iColumn>=0
+ && ALWAYS( ExprUseYTab(pExpr) )
+ && (pTab = pExpr->y.pTab)!=0
+ && IsOrdinaryTable(pTab)
+ && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)!=0
){
int j;
for(j=0; j<nDefer; j++){
@@ -133024,6 +140062,7 @@ static void selectExprDefer(
Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0);
if( pNew ){
pNew->iTable = pExpr->iTable;
+ assert( ExprUseYTab(pNew) );
pNew->y.pTab = pExpr->y.pTab;
pNew->iColumn = pPk ? pPk->aiColumn[k] : -1;
pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew);
@@ -133035,7 +140074,7 @@ static void selectExprDefer(
nDefer++;
}
}
- pItem->bSorterRef = 1;
+ pItem->fg.bSorterRef = 1;
}
}
}
@@ -133166,7 +140205,7 @@ static void selectInnerLoop(
for(i=0; i<pEList->nExpr; i++){
if( pEList->a[i].u.x.iOrderByCol>0
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
- || pEList->a[i].bSorterRef
+ || pEList->a[i].fg.bSorterRef
#endif
){
nResultCol--;
@@ -133459,7 +140498,7 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){
p->nRef = 1;
memset(&p[1], 0, nExtra);
}else{
- sqlite3OomFault(db);
+ return (KeyInfo*)sqlite3OomFault(db);
}
return p;
}
@@ -133469,9 +140508,10 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){
*/
SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo *p){
if( p ){
+ assert( p->db!=0 );
assert( p->nRef>0 );
p->nRef--;
- if( p->nRef==0 ) sqlite3DbFreeNN(p->db, p);
+ if( p->nRef==0 ) sqlite3DbNNFreeNN(p->db, p);
}
}
@@ -133528,7 +140568,7 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList(
assert( sqlite3KeyInfoIsWriteable(pInfo) );
for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){
pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr);
- pInfo->aSortFlags[i-iStart] = pItem->sortFlags;
+ pInfo->aSortFlags[i-iStart] = pItem->fg.sortFlags;
}
}
return pInfo;
@@ -133610,6 +140650,16 @@ static void generateSortTail(
int bSeq; /* True if sorter record includes seq. no. */
int nRefKey = 0;
struct ExprList_item *aOutEx = p->pEList->a;
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+ int addrExplain; /* Address of OP_Explain instruction */
+#endif
+
+ ExplainQueryPlan2(addrExplain, (pParse, 0,
+ "USE TEMP B-TREE FOR %sORDER BY", pSort->nOBSat>0?"RIGHT PART OF ":"")
+ );
+ sqlite3VdbeScanStatusRange(v, addrExplain,pSort->addrPush,pSort->addrPushEnd);
+ sqlite3VdbeScanStatusCounters(v, addrExplain, addrExplain, pSort->addrPush);
+
assert( addrBreak<0 );
if( pSort->labelBkOut ){
@@ -133630,6 +140680,9 @@ static void generateSortTail(
iTab = pSort->iECursor;
if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){
+ if( eDest==SRT_Mem && p->iOffset ){
+ sqlite3VdbeAddOp2(v, OP_Null, 0, pDest->iSdst);
+ }
regRowid = 0;
regRow = pDest->iSdst;
}else{
@@ -133653,7 +140706,7 @@ static void generateSortTail(
if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak);
VdbeCoverage(v);
- codeOffset(v, p->iOffset, addrContinue);
+ assert( p->iLimit==0 && p->iOffset==0 );
sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab);
bSeq = 0;
}else{
@@ -133661,10 +140714,13 @@ static void generateSortTail(
codeOffset(v, p->iOffset, addrContinue);
iSortTab = iTab;
bSeq = 1;
+ if( p->iOffset>0 ){
+ sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1);
+ }
}
for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
- if( aOutEx[i].bSorterRef ) continue;
+ if( aOutEx[i].fg.bSorterRef ) continue;
#endif
if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++;
}
@@ -133701,7 +140757,7 @@ static void generateSortTail(
#endif
for(i=nColumn-1; i>=0; i--){
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
- if( aOutEx[i].bSorterRef ){
+ if( aOutEx[i].fg.bSorterRef ){
sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i);
}else
#endif
@@ -133716,6 +140772,7 @@ static void generateSortTail(
VdbeComment((v, "%s", aOutEx[i].zEName));
}
}
+ sqlite3VdbeScanStatusRange(v, addrExplain, addrExplain, -1);
switch( eDest ){
case SRT_Table:
case SRT_EphemTab: {
@@ -133777,6 +140834,7 @@ static void generateSortTail(
}else{
sqlite3VdbeAddOp2(v, OP_Next, iTab, addr); VdbeCoverage(v);
}
+ sqlite3VdbeScanStatusRange(v, addrExplain, sqlite3VdbeCurrentAddr(v)-1, -1);
if( pSort->regReturn ) sqlite3VdbeAddOp1(v, OP_Return, pSort->regReturn);
sqlite3VdbeResolveLabel(v, addrBreak);
}
@@ -133785,9 +140843,6 @@ static void generateSortTail(
** Return a pointer to a string containing the 'declaration type' of the
** expression pExpr. The string may be treated as static by the caller.
**
-** Also try to estimate the size of the returned value and return that
-** result in *pEstWidth.
-**
** The declaration type is the exact datatype definition extracted from the
** original CREATE TABLE statement if the expression is a column. The
** declaration type for a ROWID field is INTEGER. Exactly when an expression
@@ -133872,7 +140927,7 @@ static const char *columnTypeImpl(
break;
}
- assert( pTab && pExpr->y.pTab==pTab );
+ assert( pTab && ExprUseYTab(pExpr) && pExpr->y.pTab==pTab );
if( pS ){
/* The "table" is actually a sub-select or a view in the FROM clause
** of the SELECT statement. Return the declaration type and origin
@@ -133906,7 +140961,7 @@ static const char *columnTypeImpl(
zType = "INTEGER";
zOrigCol = "rowid";
}else{
- zOrigCol = pTab->aCol[iCol].zName;
+ zOrigCol = pTab->aCol[iCol].zCnName;
zType = sqlite3ColumnType(&pTab->aCol[iCol],0);
}
zOrigTab = pTab->zName;
@@ -133932,9 +140987,11 @@ static const char *columnTypeImpl(
** statement.
*/
NameContext sNC;
- Select *pS = pExpr->x.pSelect;
- Expr *p = pS->pEList->a[0].pExpr;
- assert( ExprHasProperty(pExpr, EP_xIsSelect) );
+ Select *pS;
+ Expr *p;
+ assert( ExprUseXSelect(pExpr) );
+ pS = pExpr->x.pSelect;
+ p = pS->pEList->a[0].pExpr;
sNC.pSrcList = pS->pSrc;
sNC.pNext = pNC;
sNC.pParse = pNC->pParse;
@@ -134049,7 +141106,7 @@ SQLITE_PRIVATE void sqlite3GenerateColumnNames(
if( pParse->colNamesSet ) return;
/* Column names are determined by the left-most term of a compound select */
while( pSelect->pPrior ) pSelect = pSelect->pPrior;
- SELECTTRACE(1,pParse,pSelect,("generating column names\n"));
+ TREETRACE(0x80,pParse,pSelect,("generating column names\n"));
pTabList = pSelect->pSrc;
pEList = pSelect->pEList;
assert( v!=0 );
@@ -134063,8 +141120,9 @@ SQLITE_PRIVATE void sqlite3GenerateColumnNames(
assert( p!=0 );
assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */
- assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */
- if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){
+ assert( p->op!=TK_COLUMN
+ || (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */
+ if( pEList->a[i].zEName && pEList->a[i].fg.eEName==ENAME_NAME ){
/* An AS clause always takes first priority */
char *zName = pEList->a[i].zEName;
sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT);
@@ -134078,7 +141136,7 @@ SQLITE_PRIVATE void sqlite3GenerateColumnNames(
if( iCol<0 ){
zCol = "rowid";
}else{
- zCol = pTab->aCol[iCol].zName;
+ zCol = pTab->aCol[iCol].zCnName;
}
if( fullName ){
char *zName = 0;
@@ -134148,28 +141206,34 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList(
*pnCol = nCol;
*paCol = aCol;
- for(i=0, pCol=aCol; i<nCol && !db->mallocFailed; i++, pCol++){
+ for(i=0, pCol=aCol; i<nCol && !pParse->nErr; i++, pCol++){
+ struct ExprList_item *pX = &pEList->a[i];
+ struct ExprList_item *pCollide;
/* Get an appropriate name for the column
*/
- if( (zName = pEList->a[i].zEName)!=0 && pEList->a[i].eEName==ENAME_NAME ){
+ if( (zName = pX->zEName)!=0 && pX->fg.eEName==ENAME_NAME ){
/* If the column contains an "AS <name>" phrase, use <name> as the name */
}else{
- Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr);
+ Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr);
while( ALWAYS(pColExpr!=0) && pColExpr->op==TK_DOT ){
pColExpr = pColExpr->pRight;
assert( pColExpr!=0 );
}
- if( pColExpr->op==TK_COLUMN && (pTab = pColExpr->y.pTab)!=0 ){
+ if( pColExpr->op==TK_COLUMN
+ && ALWAYS( ExprUseYTab(pColExpr) )
+ && ALWAYS( pColExpr->y.pTab!=0 )
+ ){
/* For columns use the column name name */
int iCol = pColExpr->iColumn;
+ pTab = pColExpr->y.pTab;
if( iCol<0 ) iCol = pTab->iPKey;
- zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid";
+ zName = iCol>=0 ? pTab->aCol[iCol].zCnName : "rowid";
}else if( pColExpr->op==TK_ID ){
assert( !ExprHasProperty(pColExpr, EP_IntValue) );
zName = pColExpr->u.zToken;
}else{
/* Use the original text of the column expression as its name */
- zName = pEList->a[i].zEName;
+ assert( zName==pX->zEName ); /* pointer comparison intended */
}
}
if( zName && !sqlite3IsTrueOrFalse(zName) ){
@@ -134182,88 +141246,134 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList(
** append an integer to the name so that it becomes unique.
*/
cnt = 0;
- while( zName && sqlite3HashFind(&ht, zName)!=0 ){
+ while( zName && (pCollide = sqlite3HashFind(&ht, zName))!=0 ){
+ if( pCollide->fg.bUsingTerm ){
+ pCol->colFlags |= COLFLAG_NOEXPAND;
+ }
nName = sqlite3Strlen30(zName);
if( nName>0 ){
for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){}
if( zName[j]==':' ) nName = j;
}
zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt);
- if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt);
+ sqlite3ProgressCheck(pParse);
+ if( cnt>3 ){
+ sqlite3_randomness(sizeof(cnt), &cnt);
+ }
}
- pCol->zName = zName;
+ pCol->zCnName = zName;
pCol->hName = sqlite3StrIHash(zName);
+ if( pX->fg.bNoExpand ){
+ pCol->colFlags |= COLFLAG_NOEXPAND;
+ }
sqlite3ColumnPropertiesFromName(0, pCol);
- if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){
+ if( zName && sqlite3HashInsert(&ht, zName, pX)==pX ){
sqlite3OomFault(db);
}
}
sqlite3HashClear(&ht);
- if( db->mallocFailed ){
+ if( pParse->nErr ){
for(j=0; j<i; j++){
- sqlite3DbFree(db, aCol[j].zName);
+ sqlite3DbFree(db, aCol[j].zCnName);
}
sqlite3DbFree(db, aCol);
*paCol = 0;
*pnCol = 0;
- return SQLITE_NOMEM_BKPT;
+ return pParse->rc;
}
return SQLITE_OK;
}
/*
-** Add type and collation information to a column list based on
-** a SELECT statement.
-**
-** The column list presumably came from selectColumnNamesFromExprList().
-** The column list has only names, not types or collations. This
-** routine goes through and adds the types and collations.
+** pTab is a transient Table object that represents a subquery of some
+** kind (maybe a parenthesized subquery in the FROM clause of a larger
+** query, or a VIEW, or a CTE). This routine computes type information
+** for that Table object based on the Select object that implements the
+** subquery. For the purposes of this routine, "type infomation" means:
**
-** This routine requires that all identifiers in the SELECT
-** statement be resolved.
+** * The datatype name, as it might appear in a CREATE TABLE statement
+** * Which collating sequence to use for the column
+** * The affinity of the column
*/
-SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(
- Parse *pParse, /* Parsing contexts */
- Table *pTab, /* Add column type information to this table */
- Select *pSelect, /* SELECT used to determine types and collations */
- char aff /* Default affinity for columns */
+SQLITE_PRIVATE void sqlite3SubqueryColumnTypes(
+ Parse *pParse, /* Parsing contexts */
+ Table *pTab, /* Add column type information to this table */
+ Select *pSelect, /* SELECT used to determine types and collations */
+ char aff /* Default affinity. */
){
sqlite3 *db = pParse->db;
- NameContext sNC;
Column *pCol;
CollSeq *pColl;
- int i;
+ int i,j;
Expr *p;
struct ExprList_item *a;
+ NameContext sNC;
assert( pSelect!=0 );
assert( (pSelect->selFlags & SF_Resolved)!=0 );
- assert( pTab->nCol==pSelect->pEList->nExpr || db->mallocFailed );
- if( db->mallocFailed ) return;
+ assert( pTab->nCol==pSelect->pEList->nExpr || pParse->nErr>0 );
+ assert( aff==SQLITE_AFF_NONE || aff==SQLITE_AFF_BLOB );
+ if( db->mallocFailed || IN_RENAME_OBJECT ) return;
+ while( pSelect->pPrior ) pSelect = pSelect->pPrior;
+ a = pSelect->pEList->a;
memset(&sNC, 0, sizeof(sNC));
sNC.pSrcList = pSelect->pSrc;
- a = pSelect->pEList->a;
for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){
const char *zType;
- int n, m;
+ i64 n;
pTab->tabFlags |= (pCol->colFlags & COLFLAG_NOINSERT);
p = a[i].pExpr;
- zType = columnType(&sNC, p, 0, 0, 0);
/* pCol->szEst = ... // Column size est for SELECT tables never used */
pCol->affinity = sqlite3ExprAffinity(p);
+ if( pCol->affinity<=SQLITE_AFF_NONE ){
+ pCol->affinity = aff;
+ }
+ if( pCol->affinity>=SQLITE_AFF_TEXT && pSelect->pNext ){
+ int m = 0;
+ Select *pS2;
+ for(m=0, pS2=pSelect->pNext; pS2; pS2=pS2->pNext){
+ m |= sqlite3ExprDataType(pS2->pEList->a[i].pExpr);
+ }
+ if( pCol->affinity==SQLITE_AFF_TEXT && (m&0x01)!=0 ){
+ pCol->affinity = SQLITE_AFF_BLOB;
+ }else
+ if( pCol->affinity>=SQLITE_AFF_NUMERIC && (m&0x02)!=0 ){
+ pCol->affinity = SQLITE_AFF_BLOB;
+ }
+ if( pCol->affinity>=SQLITE_AFF_NUMERIC && p->op==TK_CAST ){
+ pCol->affinity = SQLITE_AFF_FLEXNUM;
+ }
+ }
+ zType = columnType(&sNC, p, 0, 0, 0);
+ if( zType==0 || pCol->affinity!=sqlite3AffinityType(zType, 0) ){
+ if( pCol->affinity==SQLITE_AFF_NUMERIC
+ || pCol->affinity==SQLITE_AFF_FLEXNUM
+ ){
+ zType = "NUM";
+ }else{
+ zType = 0;
+ for(j=1; j<SQLITE_N_STDTYPE; j++){
+ if( sqlite3StdTypeAffinity[j]==pCol->affinity ){
+ zType = sqlite3StdType[j];
+ break;
+ }
+ }
+ }
+ }
if( zType ){
- m = sqlite3Strlen30(zType);
- n = sqlite3Strlen30(pCol->zName);
- pCol->zName = sqlite3DbReallocOrFree(db, pCol->zName, n+m+2);
- if( pCol->zName ){
- memcpy(&pCol->zName[n+1], zType, m+1);
+ i64 m = sqlite3Strlen30(zType);
+ n = sqlite3Strlen30(pCol->zCnName);
+ pCol->zCnName = sqlite3DbReallocOrFree(db, pCol->zCnName, n+m+2);
+ pCol->colFlags &= ~(COLFLAG_HASTYPE|COLFLAG_HASCOLL);
+ if( pCol->zCnName ){
+ memcpy(&pCol->zCnName[n+1], zType, m+1);
pCol->colFlags |= COLFLAG_HASTYPE;
}
}
- if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff;
pColl = sqlite3ExprCollSeq(pParse, p);
- if( pColl && pCol->zColl==0 ){
- pCol->zColl = sqlite3DbStrDup(db, pColl->zName);
+ if( pColl ){
+ assert( pTab->pIndex==0 );
+ sqlite3ColumnSetColl(db, pCol, pColl->zName);
}
}
pTab->szTabRow = 1; /* Any non-zero value works */
@@ -134293,7 +141403,7 @@ SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect, c
pTab->zName = 0;
pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) );
sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol);
- sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect, aff);
+ sqlite3SubqueryColumnTypes(pParse, pTab, pSelect, aff);
pTab->iPKey = -1;
if( db->mallocFailed ){
sqlite3DeleteTable(db, pTab);
@@ -134427,7 +141537,7 @@ static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){
*/
static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){
ExprList *pOrderBy = p->pOrderBy;
- int nOrderBy = p->pOrderBy->nExpr;
+ int nOrderBy = ALWAYS(pOrderBy!=0) ? pOrderBy->nExpr : 0;
sqlite3 *db = pParse->db;
KeyInfo *pRet = sqlite3KeyInfoAlloc(db, nOrderBy+nExtra, 1);
if( pRet ){
@@ -134447,7 +141557,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){
}
assert( sqlite3KeyInfoIsWriteable(pRet) );
pRet->aColl[i] = pColl;
- pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags;
+ pRet->aSortFlags[i] = pOrderBy->a[i].fg.sortFlags;
}
}
@@ -134499,7 +141609,7 @@ static void generateWithRecursiveQuery(
SrcList *pSrc = p->pSrc; /* The FROM clause of the recursive query */
int nCol = p->pEList->nExpr; /* Number of columns in the recursive table */
Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */
- Select *pSetup = p->pPrior; /* The setup query */
+ Select *pSetup; /* The setup query */
Select *pFirstRec; /* Left-most recursive term */
int addrTop; /* Top of the loop */
int addrCont, addrBreak; /* CONTINUE and BREAK addresses */
@@ -134583,7 +141693,6 @@ static void generateWithRecursiveQuery(
** iDistinct table. pFirstRec is left pointing to the left-most
** recursive term of the CTE.
*/
- pFirstRec = p;
for(pFirstRec=p; ALWAYS(pFirstRec!=0); pFirstRec=pFirstRec->pPrior){
if( pFirstRec->selFlags & SF_Aggregate ){
sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported");
@@ -134666,7 +141775,7 @@ static int multiSelectOrderBy(
** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES
** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))").
** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case.
-** Since the limit is exactly 1, we only need to evalutes the left-most VALUES.
+** Since the limit is exactly 1, we only need to evaluate the left-most VALUES.
*/
static int multiSelectValues(
Parse *pParse, /* Parsing context */
@@ -134819,7 +141928,7 @@ static int multiSelect(
pPrior->iLimit = p->iLimit;
pPrior->iOffset = p->iOffset;
pPrior->pLimit = p->pLimit;
- SELECTTRACE(1, pParse, p, ("multiSelect UNION ALL left...\n"));
+ TREETRACE(0x200, pParse, p, ("multiSelect UNION ALL left...\n"));
rc = sqlite3Select(pParse, pPrior, &dest);
pPrior->pLimit = 0;
if( rc ){
@@ -134837,7 +141946,7 @@ static int multiSelect(
}
}
ExplainQueryPlan((pParse, 1, "UNION ALL"));
- SELECTTRACE(1, pParse, p, ("multiSelect UNION ALL right...\n"));
+ TREETRACE(0x200, pParse, p, ("multiSelect UNION ALL right...\n"));
rc = sqlite3Select(pParse, p, &dest);
testcase( rc!=SQLITE_OK );
pDelete = p->pPrior;
@@ -134890,7 +141999,7 @@ static int multiSelect(
*/
assert( !pPrior->pOrderBy );
sqlite3SelectDestInit(&uniondest, priorOp, unionTab);
- SELECTTRACE(1, pParse, p, ("multiSelect EXCEPT/UNION left...\n"));
+ TREETRACE(0x200, pParse, p, ("multiSelect EXCEPT/UNION left...\n"));
rc = sqlite3Select(pParse, pPrior, &uniondest);
if( rc ){
goto multi_select_end;
@@ -134910,7 +142019,7 @@ static int multiSelect(
uniondest.eDest = op;
ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE",
sqlite3SelectOpName(p->op)));
- SELECTTRACE(1, pParse, p, ("multiSelect EXCEPT/UNION right...\n"));
+ TREETRACE(0x200, pParse, p, ("multiSelect EXCEPT/UNION right...\n"));
rc = sqlite3Select(pParse, p, &uniondest);
testcase( rc!=SQLITE_OK );
assert( p->pOrderBy==0 );
@@ -134971,7 +142080,7 @@ static int multiSelect(
/* Code the SELECTs to our left into temporary table "tab1".
*/
sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1);
- SELECTTRACE(1, pParse, p, ("multiSelect INTERSECT left...\n"));
+ TREETRACE(0x400, pParse, p, ("multiSelect INTERSECT left...\n"));
rc = sqlite3Select(pParse, pPrior, &intersectdest);
if( rc ){
goto multi_select_end;
@@ -134988,7 +142097,7 @@ static int multiSelect(
intersectdest.iSDParm = tab2;
ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE",
sqlite3SelectOpName(p->op)));
- SELECTTRACE(1, pParse, p, ("multiSelect INTERSECT right...\n"));
+ TREETRACE(0x400, pParse, p, ("multiSelect INTERSECT right...\n"));
rc = sqlite3Select(pParse, p, &intersectdest);
testcase( rc!=SQLITE_OK );
pDelete = p->pPrior;
@@ -135049,6 +142158,7 @@ static int multiSelect(
int nCol; /* Number of columns in result set */
assert( p->pNext==0 );
+ assert( p->pEList!=0 );
nCol = p->pEList->nExpr;
pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1);
if( !pKeyInfo ){
@@ -135083,7 +142193,11 @@ static int multiSelect(
multi_select_end:
pDest->iSdst = dest.iSdst;
pDest->nSdst = dest.nSdst;
- sqlite3SelectDelete(db, pDelete);
+ if( pDelete ){
+ sqlite3ParserAddCleanup(pParse,
+ (void(*)(sqlite3*,void*))sqlite3SelectDelete,
+ pDelete);
+ }
return rc;
}
#endif /* SQLITE_OMIT_COMPOUND_SELECT */
@@ -135337,6 +142451,8 @@ static int multiSelectOrderBy(
){
int i, j; /* Loop counters */
Select *pPrior; /* Another SELECT immediately to our left */
+ Select *pSplit; /* Left-most SELECT in the right-hand group */
+ int nSelect; /* Number of SELECT statements in the compound */
Vdbe *v; /* Generate code to this VDBE */
SelectDest destA; /* Destination for coroutine A */
SelectDest destB; /* Destination for coroutine B */
@@ -135382,8 +142498,7 @@ static int multiSelectOrderBy(
/* Patch up the ORDER BY clause
*/
op = p->op;
- pPrior = p->pPrior;
- assert( pPrior->pOrderBy==0 );
+ assert( p->pPrior->pOrderBy==0 );
pOrderBy = p->pOrderBy;
assert( pOrderBy );
nOrderBy = pOrderBy->nExpr;
@@ -135396,6 +142511,7 @@ static int multiSelectOrderBy(
for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){
struct ExprList_item *pItem;
for(j=0, pItem=pOrderBy->a; j<nOrderBy; j++, pItem++){
+ assert( pItem!=0 );
assert( pItem->u.x.iOrderByCol>0 );
if( pItem->u.x.iOrderByCol==i ) break;
}
@@ -135422,6 +142538,7 @@ static int multiSelectOrderBy(
struct ExprList_item *pItem;
aPermute[0] = nOrderBy;
for(i=1, pItem=pOrderBy->a; i<=nOrderBy; i++, pItem++){
+ assert( pItem!=0 );
assert( pItem->u.x.iOrderByCol>0 );
assert( pItem->u.x.iOrderByCol<=p->pEList->nExpr );
aPermute[i] = pItem->u.x.iOrderByCol - 1;
@@ -135431,11 +142548,6 @@ static int multiSelectOrderBy(
pKeyMerge = 0;
}
- /* Reattach the ORDER BY clause to the query.
- */
- p->pOrderBy = pOrderBy;
- pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0);
-
/* Allocate a range of temporary registers and the KeyInfo needed
** for the logic that removes duplicate result rows when the
** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL).
@@ -135460,12 +142572,30 @@ static int multiSelectOrderBy(
/* Separate the left and the right query from one another
*/
- p->pPrior = 0;
+ nSelect = 1;
+ if( (op==TK_ALL || op==TK_UNION)
+ && OptimizationEnabled(db, SQLITE_BalancedMerge)
+ ){
+ for(pSplit=p; pSplit->pPrior!=0 && pSplit->op==op; pSplit=pSplit->pPrior){
+ nSelect++;
+ assert( pSplit->pPrior->pNext==pSplit );
+ }
+ }
+ if( nSelect<=3 ){
+ pSplit = p;
+ }else{
+ pSplit = p;
+ for(i=2; i<nSelect; i+=2){ pSplit = pSplit->pPrior; }
+ }
+ pPrior = pSplit->pPrior;
+ assert( pPrior!=0 );
+ pSplit->pPrior = 0;
pPrior->pNext = 0;
+ assert( p->pOrderBy == pOrderBy );
+ assert( pOrderBy!=0 || db->mallocFailed );
+ pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0);
sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER");
- if( pPrior->pPrior==0 ){
- sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER");
- }
+ sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER");
/* Compute the limit registers */
computeLimitRegisters(pParse, p, labelEnd);
@@ -135614,14 +142744,14 @@ static int multiSelectOrderBy(
*/
sqlite3VdbeResolveLabel(v, labelEnd);
- /* Reassembly the compound query so that it will be freed correctly
- ** by the calling function */
- if( p->pPrior ){
- sqlite3SelectDelete(db, p->pPrior);
+ /* Make arrangements to free the 2nd and subsequent arms of the compound
+ ** after the parse has finished */
+ if( pSplit->pPrior ){
+ sqlite3ParserAddCleanup(pParse,
+ (void(*)(sqlite3*,void*))sqlite3SelectDelete, pSplit->pPrior);
}
- p->pPrior = pPrior;
- pPrior->pNext = p;
-
+ pSplit->pPrior = pPrior;
+ pPrior->pNext = pSplit;
sqlite3ExprListDelete(db, pPrior->pOrderBy);
pPrior->pOrderBy = 0;
@@ -135639,13 +142769,42 @@ static int multiSelectOrderBy(
**
** All references to columns in table iTable are to be replaced by corresponding
** expressions in pEList.
+**
+** ## About "isOuterJoin":
+**
+** The isOuterJoin column indicates that the replacement will occur into a
+** position in the parent that NULL-able due to an OUTER JOIN. Either the
+** target slot in the parent is the right operand of a LEFT JOIN, or one of
+** the left operands of a RIGHT JOIN. In either case, we need to potentially
+** bypass the substituted expression with OP_IfNullRow.
+**
+** Suppose the original expression is an integer constant. Even though the table
+** has the nullRow flag set, because the expression is an integer constant,
+** it will not be NULLed out. So instead, we insert an OP_IfNullRow opcode
+** that checks to see if the nullRow flag is set on the table. If the nullRow
+** flag is set, then the value in the register is set to NULL and the original
+** expression is bypassed. If the nullRow flag is not set, then the original
+** expression runs to populate the register.
+**
+** Example where this is needed:
+**
+** CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT);
+** CREATE TABLE t2(x INT UNIQUE);
+**
+** SELECT a,b,m,x FROM t1 LEFT JOIN (SELECT 59 AS m,x FROM t2) ON b=x;
+**
+** When the subquery on the right side of the LEFT JOIN is flattened, we
+** have to add OP_IfNullRow in front of the OP_Integer that implements the
+** "m" value of the subquery so that a NULL will be loaded instead of 59
+** when processing a non-matched row of the left.
*/
typedef struct SubstContext {
Parse *pParse; /* The parsing context */
int iTable; /* Replace references to this table */
int iNewTable; /* New table number */
- int isLeftJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */
+ int isOuterJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */
ExprList *pEList; /* Replacement expressions */
+ ExprList *pCList; /* Collation sequences for replacement expr */
} SubstContext;
/* Forward Declarations */
@@ -135670,10 +142829,11 @@ static Expr *substExpr(
Expr *pExpr /* Expr in which substitution occurs */
){
if( pExpr==0 ) return 0;
- if( ExprHasProperty(pExpr, EP_FromJoin)
- && pExpr->iRightJoinTable==pSubst->iTable
+ if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON)
+ && pExpr->w.iJoin==pSubst->iTable
){
- pExpr->iRightJoinTable = pSubst->iNewTable;
+ testcase( ExprHasProperty(pExpr, EP_InnerON) );
+ pExpr->w.iJoin = pSubst->iNewTable;
}
if( pExpr->op==TK_COLUMN
&& pExpr->iTable==pSubst->iTable
@@ -135686,19 +142846,23 @@ static Expr *substExpr(
#endif
{
Expr *pNew;
- Expr *pCopy = pSubst->pEList->a[pExpr->iColumn].pExpr;
+ int iColumn = pExpr->iColumn;
+ Expr *pCopy = pSubst->pEList->a[iColumn].pExpr;
Expr ifNullRow;
- assert( pSubst->pEList!=0 && pExpr->iColumn<pSubst->pEList->nExpr );
+ assert( pSubst->pEList!=0 && iColumn<pSubst->pEList->nExpr );
assert( pExpr->pRight==0 );
if( sqlite3ExprIsVector(pCopy) ){
sqlite3VectorErrorMsg(pSubst->pParse, pCopy);
}else{
sqlite3 *db = pSubst->pParse->db;
- if( pSubst->isLeftJoin && pCopy->op!=TK_COLUMN ){
+ if( pSubst->isOuterJoin
+ && (pCopy->op!=TK_COLUMN || pCopy->iTable!=pSubst->iNewTable)
+ ){
memset(&ifNullRow, 0, sizeof(ifNullRow));
ifNullRow.op = TK_IF_NULL_ROW;
ifNullRow.pLeft = pCopy;
ifNullRow.iTable = pSubst->iNewTable;
+ ifNullRow.iColumn = -99;
ifNullRow.flags = EP_IfNullRow;
pCopy = &ifNullRow;
}
@@ -135708,22 +142872,33 @@ static Expr *substExpr(
sqlite3ExprDelete(db, pNew);
return pExpr;
}
- if( pSubst->isLeftJoin ){
+ if( pSubst->isOuterJoin ){
ExprSetProperty(pNew, EP_CanBeNull);
}
- if( ExprHasProperty(pExpr,EP_FromJoin) ){
- sqlite3SetJoinExpr(pNew, pExpr->iRightJoinTable);
+ if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){
+ sqlite3SetJoinExpr(pNew, pExpr->w.iJoin,
+ pExpr->flags & (EP_OuterON|EP_InnerON));
}
sqlite3ExprDelete(db, pExpr);
pExpr = pNew;
+ if( pExpr->op==TK_TRUEFALSE ){
+ pExpr->u.iValue = sqlite3ExprTruthValue(pExpr);
+ pExpr->op = TK_INTEGER;
+ ExprSetProperty(pExpr, EP_IntValue);
+ }
/* Ensure that the expression now has an implicit collation sequence,
** just as it did when it was a column of a view or sub-query. */
- if( pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE ){
- CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pExpr);
- pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr,
- (pColl ? pColl->zName : "BINARY")
+ {
+ CollSeq *pNat = sqlite3ExprCollSeq(pSubst->pParse, pExpr);
+ CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse,
+ pSubst->pCList->a[iColumn].pExpr
);
+ if( pNat!=pColl || (pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE) ){
+ pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr,
+ (pColl ? pColl->zName : "BINARY")
+ );
+ }
}
ExprClearProperty(pExpr, EP_Collate);
}
@@ -135734,7 +142909,7 @@ static Expr *substExpr(
}
pExpr->pLeft = substExpr(pSubst, pExpr->pLeft);
pExpr->pRight = substExpr(pSubst, pExpr->pRight);
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
substSelect(pSubst, pExpr->x.pSelect, 1);
}else{
substExprList(pSubst, pExpr->x.pList);
@@ -135825,10 +143000,10 @@ static void recomputeColumnsUsed(
** new cursor number assigned, set an entry in the aCsrMap[] array
** to map the old cursor number to the new:
**
-** aCsrMap[iOld] = iNew;
+** aCsrMap[iOld+1] = iNew;
**
** The array is guaranteed by the caller to be large enough for all
-** existing cursor numbers in pSrc.
+** existing cursor numbers in pSrc. aCsrMap[0] is the array size.
**
** If pSrc contains any sub-selects, call this routine recursively
** on the FROM clause of each such sub-select, with iExcept set to -1.
@@ -135844,10 +143019,11 @@ static void srclistRenumberCursors(
for(i=0, pItem=pSrc->a; i<pSrc->nSrc; i++, pItem++){
if( i!=iExcept ){
Select *p;
- if( !pItem->fg.isRecursive || aCsrMap[pItem->iCursor]==0 ){
- aCsrMap[pItem->iCursor] = pParse->nTab++;
+ assert( pItem->iCursor < aCsrMap[0] );
+ if( !pItem->fg.isRecursive || aCsrMap[pItem->iCursor+1]==0 ){
+ aCsrMap[pItem->iCursor+1] = pParse->nTab++;
}
- pItem->iCursor = aCsrMap[pItem->iCursor];
+ pItem->iCursor = aCsrMap[pItem->iCursor+1];
for(p=pItem->pSelect; p; p=p->pPrior){
srclistRenumberCursors(pParse, aCsrMap, p->pSrc, -1);
}
@@ -135856,17 +143032,27 @@ static void srclistRenumberCursors(
}
/*
+** *piCursor is a cursor number. Change it if it needs to be mapped.
+*/
+static void renumberCursorDoMapping(Walker *pWalker, int *piCursor){
+ int *aCsrMap = pWalker->u.aiCol;
+ int iCsr = *piCursor;
+ if( iCsr < aCsrMap[0] && aCsrMap[iCsr+1]>0 ){
+ *piCursor = aCsrMap[iCsr+1];
+ }
+}
+
+/*
** Expression walker callback used by renumberCursors() to update
** Expr objects to match newly assigned cursor numbers.
*/
static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){
- int *aCsrMap = pWalker->u.aiCol;
int op = pExpr->op;
- if( (op==TK_COLUMN || op==TK_IF_NULL_ROW) && aCsrMap[pExpr->iTable] ){
- pExpr->iTable = aCsrMap[pExpr->iTable];
+ if( op==TK_COLUMN || op==TK_IF_NULL_ROW ){
+ renumberCursorDoMapping(pWalker, &pExpr->iTable);
}
- if( ExprHasProperty(pExpr, EP_FromJoin) && aCsrMap[pExpr->iRightJoinTable] ){
- pExpr->iRightJoinTable = aCsrMap[pExpr->iRightJoinTable];
+ if( ExprHasProperty(pExpr, EP_OuterON) ){
+ renumberCursorDoMapping(pWalker, &pExpr->w.iJoin);
}
return WRC_Continue;
}
@@ -135905,6 +143091,46 @@ static void renumberCursors(
}
#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
+/*
+** If pSel is not part of a compound SELECT, return a pointer to its
+** expression list. Otherwise, return a pointer to the expression list
+** of the leftmost SELECT in the compound.
+*/
+static ExprList *findLeftmostExprlist(Select *pSel){
+ while( pSel->pPrior ){
+ pSel = pSel->pPrior;
+ }
+ return pSel->pEList;
+}
+
+/*
+** Return true if any of the result-set columns in the compound query
+** have incompatible affinities on one or more arms of the compound.
+*/
+static int compoundHasDifferentAffinities(Select *p){
+ int ii;
+ ExprList *pList;
+ assert( p!=0 );
+ assert( p->pEList!=0 );
+ assert( p->pPrior!=0 );
+ pList = p->pEList;
+ for(ii=0; ii<pList->nExpr; ii++){
+ char aff;
+ Select *pSub1;
+ assert( pList->a[ii].pExpr!=0 );
+ aff = sqlite3ExprAffinity(pList->a[ii].pExpr);
+ for(pSub1=p->pPrior; pSub1; pSub1=pSub1->pPrior){
+ assert( pSub1->pEList!=0 );
+ assert( pSub1->pEList->nExpr>ii );
+ assert( pSub1->pEList->a[ii].pExpr!=0 );
+ if( sqlite3ExprAffinity(pSub1->pEList->a[ii].pExpr)!=aff ){
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
/*
** This routine attempts to flatten subqueries as a performance optimization.
@@ -135949,8 +143175,10 @@ static void renumberCursors(
** (3a) the subquery may not be a join and
** (3b) the FROM clause of the subquery may not contain a virtual
** table and
-** (3c) the outer query may not be an aggregate.
+** (**) Was: "The outer query may not have a GROUP BY." This case
+** is now managed correctly
** (3d) the outer query may not be DISTINCT.
+** See also (26) for restrictions on RIGHT JOIN.
**
** (4) The subquery can not be DISTINCT.
**
@@ -136002,6 +143230,11 @@ static void renumberCursors(
** (17d2) DISTINCT
** (17e) the subquery may not contain window functions, and
** (17f) the subquery must not be the RHS of a LEFT JOIN.
+** (17g) either the subquery is the first element of the outer
+** query or there are no RIGHT or FULL JOINs in any arm
+** of the subquery. (This is a duplicate of condition (27b).)
+** (17h) The corresponding result set expressions in all arms of the
+** compound must have the same affinity.
**
** The parent and sub-query may contain WHERE clauses. Subject to
** rules (11), (13) and (14), they may also contain ORDER BY,
@@ -136049,6 +143282,17 @@ static void renumberCursors(
** function in the select list or ORDER BY clause, flattening
** is not attempted.
**
+** (26) The subquery may not be the right operand of a RIGHT JOIN.
+** See also (3) for restrictions on LEFT JOIN.
+**
+** (27) The subquery may not contain a FULL or RIGHT JOIN unless it
+** is the first element of the parent query. Two subcases:
+** (27a) the subquery is not a compound query.
+** (27b) the subquery is a compound query and the RIGHT JOIN occurs
+** in any arm of the compound query. (See also (17g).)
+**
+** (28) The subquery is not a MATERIALIZED CTE.
+**
**
** In this routine, the "p" parameter is a pointer to the outer query.
** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query
@@ -136074,7 +143318,7 @@ static int flattenSubquery(
SrcList *pSubSrc; /* The FROM clause of the subquery */
int iParent; /* VDBE cursor number of the pSub result set temp table */
int iNewParent = -1;/* Replacement table for iParent */
- int isLeftJoin = 0; /* True if pSub is the right side of a LEFT JOIN */
+ int isOuterJoin = 0; /* True if pSub is the right side of a LEFT JOIN */
int i; /* Loop counter */
Expr *pWhere; /* The WHERE clause */
SrcItem *pSubitem; /* The subquery */
@@ -136140,32 +143384,26 @@ static int flattenSubquery(
**
** which is not at all the same thing.
**
- ** If the subquery is the right operand of a LEFT JOIN, then the outer
- ** query cannot be an aggregate. (3c) This is an artifact of the way
- ** aggregates are processed - there is no mechanism to determine if
- ** the LEFT JOIN table should be all-NULL.
- **
** See also tickets #306, #350, and #3300.
*/
- if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){
- isLeftJoin = 1;
- if( pSubSrc->nSrc>1 /* (3a) */
- || isAgg /* (3b) */
- || IsVirtual(pSubSrc->a[0].pTab) /* (3c) */
- || (p->selFlags & SF_Distinct)!=0 /* (3d) */
+ if( (pSubitem->fg.jointype & (JT_OUTER|JT_LTORJ))!=0 ){
+ if( pSubSrc->nSrc>1 /* (3a) */
+ || IsVirtual(pSubSrc->a[0].pTab) /* (3b) */
+ || (p->selFlags & SF_Distinct)!=0 /* (3d) */
+ || (pSubitem->fg.jointype & JT_RIGHT)!=0 /* (26) */
){
return 0;
}
+ isOuterJoin = 1;
}
-#ifdef SQLITE_EXTRA_IFNULLROW
- else if( iFrom>0 && !isAgg ){
- /* Setting isLeftJoin to -1 causes OP_IfNullRow opcodes to be generated for
- ** every reference to any result column from subquery in a join, even
- ** though they are not necessary. This will stress-test the OP_IfNullRow
- ** opcode. */
- isLeftJoin = -1;
+
+ assert( pSubSrc->nSrc>0 ); /* True by restriction (7) */
+ if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){
+ return 0; /* Restriction (27a) */
+ }
+ if( pSubitem->fg.isCte && pSubitem->u2.pCteUse->eM10d==M10d_Yes ){
+ return 0; /* (28) */
}
-#endif
/* Restriction (17): If the sub-query is a compound SELECT, then it must
** use only the UNION ALL operator. And none of the simple select queries
@@ -136173,10 +143411,11 @@ static int flattenSubquery(
** queries.
*/
if( pSub->pPrior ){
+ int ii;
if( pSub->pOrderBy ){
return 0; /* Restriction (20) */
}
- if( isAgg || (p->selFlags & SF_Distinct)!=0 || isLeftJoin>0 ){
+ if( isAgg || (p->selFlags & SF_Distinct)!=0 || isOuterJoin>0 ){
return 0; /* (17d1), (17d2), or (17f) */
}
for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){
@@ -136194,12 +143433,17 @@ static int flattenSubquery(
){
return 0;
}
+ if( iFrom>0 && (pSub1->pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){
+ /* Without this restriction, the JT_LTORJ flag would end up being
+ ** omitted on left-hand tables of the right join that is being
+ ** flattened. */
+ return 0; /* Restrictions (17g), (27b) */
+ }
testcase( pSub1->pSrc->nSrc>1 );
}
/* Restriction (18). */
if( p->pOrderBy ){
- int ii;
for(ii=0; ii<p->pOrderBy->nExpr; ii++){
if( p->pOrderBy->a[ii].u.x.iOrderByCol==0 ) return 0;
}
@@ -136208,14 +143452,19 @@ static int flattenSubquery(
/* Restriction (23) */
if( (p->selFlags & SF_Recursive) ) return 0;
+ /* Restriction (17h) */
+ if( compoundHasDifferentAffinities(pSub) ) return 0;
+
if( pSrc->nSrc>1 ){
if( pParse->nSelect>500 ) return 0;
- aCsrMap = sqlite3DbMallocZero(db, pParse->nTab*sizeof(int));
+ if( OptimizationDisabled(db, SQLITE_FlttnUnionAll) ) return 0;
+ aCsrMap = sqlite3DbMallocZero(db, ((i64)pParse->nTab+1)*sizeof(int));
+ if( aCsrMap ) aCsrMap[0] = pParse->nTab;
}
}
/***** If we reach this point, flattening is permitted. *****/
- SELECTTRACE(1,pParse,p,("flatten %u.%p from term %d\n",
+ TREETRACE(0x4,pParse,p,("flatten %u.%p from term %d\n",
pSub->selId, pSub, iFrom));
/* Authorize the subquery */
@@ -136233,7 +143482,7 @@ static int flattenSubquery(
pSubitem->zName = 0;
pSubitem->zAlias = 0;
pSubitem->pSelect = 0;
- assert( pSubitem->pOn==0 );
+ assert( pSubitem->fg.isUsing!=0 || pSubitem->u3.pOn==0 );
/* If the sub-query is a compound SELECT statement, then (by restrictions
** 17 and 18 above) it must be a UNION ALL and the parent query must
@@ -136294,7 +143543,7 @@ static int flattenSubquery(
if( pPrior ) pPrior->pNext = pNew;
pNew->pNext = p;
p->pPrior = pNew;
- SELECTTRACE(2,pParse,p,("compound-subquery flattener"
+ TREETRACE(0x4,pParse,p,("compound-subquery flattener"
" creates %u as peer\n",pNew->selId));
}
assert( pSubitem->pSelect==0 );
@@ -136343,6 +143592,7 @@ static int flattenSubquery(
for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){
int nSubSrc;
u8 jointype = 0;
+ u8 ltorj = pSrc->a[iFrom].fg.jointype & JT_LTORJ;
assert( pSub!=0 );
pSubSrc = pSub->pSrc; /* FROM clause of subquery */
nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */
@@ -136377,13 +143627,16 @@ static int flattenSubquery(
** outer query.
*/
for(i=0; i<nSubSrc; i++){
- sqlite3IdListDelete(db, pSrc->a[i+iFrom].pUsing);
- assert( pSrc->a[i+iFrom].fg.isTabFunc==0 );
- pSrc->a[i+iFrom] = pSubSrc->a[i];
+ SrcItem *pItem = &pSrc->a[i+iFrom];
+ if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing);
+ assert( pItem->fg.isTabFunc==0 );
+ *pItem = pSubSrc->a[i];
+ pItem->fg.jointype |= ltorj;
iNewParent = pSubSrc->a[i].iCursor;
memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i]));
}
- pSrc->a[iFrom].fg.jointype = jointype;
+ pSrc->a[iFrom].fg.jointype &= JT_LTORJ;
+ pSrc->a[iFrom].fg.jointype |= jointype | ltorj;
/* Now begin substituting subquery result set expressions for
** references to the iParent in the outer query.
@@ -136418,8 +143671,8 @@ static int flattenSubquery(
}
pWhere = pSub->pWhere;
pSub->pWhere = 0;
- if( isLeftJoin>0 ){
- sqlite3SetJoinExpr(pWhere, iNewParent);
+ if( isOuterJoin>0 ){
+ sqlite3SetJoinExpr(pWhere, iNewParent, EP_OuterON);
}
if( pWhere ){
if( pParent->pWhere ){
@@ -136433,8 +143686,9 @@ static int flattenSubquery(
x.pParse = pParse;
x.iTable = iParent;
x.iNewTable = iNewParent;
- x.isLeftJoin = isLeftJoin;
+ x.isOuterJoin = isOuterJoin;
x.pEList = pSub->pEList;
+ x.pCList = findLeftmostExprlist(pSub);
substSelect(&x, pParent, 0);
}
@@ -136454,7 +143708,7 @@ static int flattenSubquery(
pSub->pLimit = 0;
}
- /* Recompute the SrcList_item.colUsed masks for the flattened
+ /* Recompute the SrcItem.colUsed masks for the flattened
** tables. */
for(i=0; i<nSubSrc; i++){
recomputeColumnsUsed(pParent, &pSrc->a[i+iFrom]);
@@ -136468,9 +143722,9 @@ static int flattenSubquery(
sqlite3WalkSelect(&w,pSub1);
sqlite3SelectDelete(db, pSub1);
-#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x100 ){
- SELECTTRACE(0x100,pParse,p,("After flattening:\n"));
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x4 ){
+ TREETRACE(0x4,pParse,p,("After flattening:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
@@ -136490,6 +143744,8 @@ struct WhereConst {
int nConst; /* Number for COLUMN=CONSTANT terms */
int nChng; /* Number of times a constant is propagated */
int bHasAffBlob; /* At least one column in apExpr[] as affinity BLOB */
+ u32 mExcludeOn; /* Which ON expressions to exclude from considertion.
+ ** Either EP_OuterON or EP_InnerON|EP_OuterON */
Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */
};
@@ -136552,7 +143808,11 @@ static void constInsert(
static void findConstInWhere(WhereConst *pConst, Expr *pExpr){
Expr *pRight, *pLeft;
if( NEVER(pExpr==0) ) return;
- if( ExprHasProperty(pExpr, EP_FromJoin) ) return;
+ if( ExprHasProperty(pExpr, pConst->mExcludeOn) ){
+ testcase( ExprHasProperty(pExpr, EP_OuterON) );
+ testcase( ExprHasProperty(pExpr, EP_InnerON) );
+ return;
+ }
if( pExpr->op==TK_AND ){
findConstInWhere(pConst, pExpr->pRight);
findConstInWhere(pConst, pExpr->pLeft);
@@ -136588,9 +143848,10 @@ static int propagateConstantExprRewriteOne(
int i;
if( pConst->pOomFault[0] ) return WRC_Prune;
if( pExpr->op!=TK_COLUMN ) return WRC_Continue;
- if( ExprHasProperty(pExpr, EP_FixedCol|EP_FromJoin) ){
+ if( ExprHasProperty(pExpr, EP_FixedCol|pConst->mExcludeOn) ){
testcase( ExprHasProperty(pExpr, EP_FixedCol) );
- testcase( ExprHasProperty(pExpr, EP_FromJoin) );
+ testcase( ExprHasProperty(pExpr, EP_OuterON) );
+ testcase( ExprHasProperty(pExpr, EP_InnerON) );
return WRC_Continue;
}
for(i=0; i<pConst->nConst; i++){
@@ -136714,6 +143975,17 @@ static int propagateConstants(
x.nChng = 0;
x.apExpr = 0;
x.bHasAffBlob = 0;
+ if( ALWAYS(p->pSrc!=0)
+ && p->pSrc->nSrc>0
+ && (p->pSrc->a[0].fg.jointype & JT_LTORJ)!=0
+ ){
+ /* Do not propagate constants on any ON clause if there is a
+ ** RIGHT JOIN anywhere in the query */
+ x.mExcludeOn = EP_InnerON | EP_OuterON;
+ }else{
+ /* Do not propagate constants through the ON clause of a LEFT JOIN */
+ x.mExcludeOn = EP_OuterON;
+ }
findConstInWhere(&x, p->pWhere);
if( x.nConst ){
memset(&w, 0, sizeof(w));
@@ -136826,6 +144098,29 @@ static int pushDownWindowCheck(Parse *pParse, Select *pSubq, Expr *pExpr){
** be materialized. (This restriction is implemented in the calling
** routine.)
**
+** (8) If the subquery is a compound that uses UNION, INTERSECT,
+** or EXCEPT, then all of the result set columns for all arms of
+** the compound must use the BINARY collating sequence.
+**
+** (9) All three of the following are true:
+**
+** (9a) The WHERE clause expression originates in the ON or USING clause
+** of a join (either an INNER or an OUTER join), and
+**
+** (9b) The subquery is to the right of the ON/USING clause
+**
+** (9c) There is a RIGHT JOIN (or FULL JOIN) in between the ON/USING
+** clause and the subquery.
+**
+** Without this restriction, the push-down optimization might move
+** the ON/USING filter expression from the left side of a RIGHT JOIN
+** over to the right side, which leads to incorrect answers. See
+** also restriction (6) in sqlite3ExprIsSingleTableConstraint().
+**
+** (10) The inner query is not the right-hand table of a RIGHT JOIN.
+**
+** (11) The subquery is not a VALUES clause
+**
** Return 0 if no changes are made and non-zero if one or more WHERE clause
** terms are duplicated into the subquery.
*/
@@ -136833,24 +144128,56 @@ static int pushDownWhereTerms(
Parse *pParse, /* Parse context (for malloc() and error reporting) */
Select *pSubq, /* The subquery whose WHERE clause is to be augmented */
Expr *pWhere, /* The WHERE clause of the outer query */
- int iCursor, /* Cursor number of the subquery */
- int isLeftJoin /* True if pSubq is the right term of a LEFT JOIN */
+ SrcList *pSrcList, /* The complete from clause of the outer query */
+ int iSrc /* Which FROM clause term to try to push into */
){
Expr *pNew;
+ SrcItem *pSrc; /* The subquery FROM term into which WHERE is pushed */
int nChng = 0;
+ pSrc = &pSrcList->a[iSrc];
if( pWhere==0 ) return 0;
- if( pSubq->selFlags & (SF_Recursive|SF_MultiPart) ) return 0;
+ if( pSubq->selFlags & (SF_Recursive|SF_MultiPart) ){
+ return 0; /* restrictions (2) and (11) */
+ }
+ if( pSrc->fg.jointype & (JT_LTORJ|JT_RIGHT) ){
+ return 0; /* restrictions (10) */
+ }
-#ifndef SQLITE_OMIT_WINDOWFUNC
if( pSubq->pPrior ){
Select *pSel;
+ int notUnionAll = 0;
for(pSel=pSubq; pSel; pSel=pSel->pPrior){
+ u8 op = pSel->op;
+ assert( op==TK_ALL || op==TK_SELECT
+ || op==TK_UNION || op==TK_INTERSECT || op==TK_EXCEPT );
+ if( op!=TK_ALL && op!=TK_SELECT ){
+ notUnionAll = 1;
+ }
+#ifndef SQLITE_OMIT_WINDOWFUNC
if( pSel->pWin ) return 0; /* restriction (6b) */
+#endif
+ }
+ if( notUnionAll ){
+ /* If any of the compound arms are connected using UNION, INTERSECT,
+ ** or EXCEPT, then we must ensure that none of the columns use a
+ ** non-BINARY collating sequence. */
+ for(pSel=pSubq; pSel; pSel=pSel->pPrior){
+ int ii;
+ const ExprList *pList = pSel->pEList;
+ assert( pList!=0 );
+ for(ii=0; ii<pList->nExpr; ii++){
+ CollSeq *pColl = sqlite3ExprCollSeq(pParse, pList->a[ii].pExpr);
+ if( !sqlite3IsBinary(pColl) ){
+ return 0; /* Restriction (8) */
+ }
+ }
+ }
}
}else{
+#ifndef SQLITE_OMIT_WINDOWFUNC
if( pSubq->pWin && pSubq->pWin->pPartition==0 ) return 0;
- }
#endif
+ }
#ifdef SQLITE_DEBUG
/* Only the first term of a compound can have a WITH clause. But make
@@ -136869,31 +144196,54 @@ static int pushDownWhereTerms(
return 0; /* restriction (3) */
}
while( pWhere->op==TK_AND ){
- nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight,
- iCursor, isLeftJoin);
+ nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, pSrcList, iSrc);
pWhere = pWhere->pLeft;
}
+
+#if 0 /* These checks now done by sqlite3ExprIsSingleTableConstraint() */
+ if( ExprHasProperty(pWhere, EP_OuterON|EP_InnerON) /* (9a) */
+ && (pSrcList->a[0].fg.jointype & JT_LTORJ)!=0 /* Fast pre-test of (9c) */
+ ){
+ int jj;
+ for(jj=0; jj<iSrc; jj++){
+ if( pWhere->w.iJoin==pSrcList->a[jj].iCursor ){
+ /* If we reach this point, both (9a) and (9b) are satisfied.
+ ** The following loop checks (9c):
+ */
+ for(jj++; jj<iSrc; jj++){
+ if( (pSrcList->a[jj].fg.jointype & JT_RIGHT)!=0 ){
+ return 0; /* restriction (9) */
+ }
+ }
+ }
+ }
+ }
if( isLeftJoin
- && (ExprHasProperty(pWhere,EP_FromJoin)==0
- || pWhere->iRightJoinTable!=iCursor)
+ && (ExprHasProperty(pWhere,EP_OuterON)==0
+ || pWhere->w.iJoin!=iCursor)
){
return 0; /* restriction (4) */
}
- if( ExprHasProperty(pWhere,EP_FromJoin) && pWhere->iRightJoinTable!=iCursor ){
+ if( ExprHasProperty(pWhere,EP_OuterON)
+ && pWhere->w.iJoin!=iCursor
+ ){
return 0; /* restriction (5) */
}
- if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){
+#endif
+
+ if( sqlite3ExprIsSingleTableConstraint(pWhere, pSrcList, iSrc) ){
nChng++;
pSubq->selFlags |= SF_PushDown;
while( pSubq ){
SubstContext x;
pNew = sqlite3ExprDup(pParse->db, pWhere, 0);
- unsetJoinExpr(pNew, -1);
+ unsetJoinExpr(pNew, -1, 1);
x.pParse = pParse;
- x.iTable = iCursor;
- x.iNewTable = iCursor;
- x.isLeftJoin = 0;
+ x.iTable = pSrc->iCursor;
+ x.iNewTable = pSrc->iCursor;
+ x.isOuterJoin = 0;
x.pEList = pSubq->pEList;
+ x.pCList = findLeftmostExprlist(pSubq);
pNew = substExpr(&x, pNew);
#ifndef SQLITE_OMIT_WINDOWFUNC
if( pSubq->pWin && 0==pushDownWindowCheck(pParse, pSubq, pNew) ){
@@ -136916,6 +144266,78 @@ static int pushDownWhereTerms(
#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
/*
+** Check to see if a subquery contains result-set columns that are
+** never used. If it does, change the value of those result-set columns
+** to NULL so that they do not cause unnecessary work to compute.
+**
+** Return the number of column that were changed to NULL.
+*/
+static int disableUnusedSubqueryResultColumns(SrcItem *pItem){
+ int nCol;
+ Select *pSub; /* The subquery to be simplified */
+ Select *pX; /* For looping over compound elements of pSub */
+ Table *pTab; /* The table that describes the subquery */
+ int j; /* Column number */
+ int nChng = 0; /* Number of columns converted to NULL */
+ Bitmask colUsed; /* Columns that may not be NULLed out */
+
+ assert( pItem!=0 );
+ if( pItem->fg.isCorrelated || pItem->fg.isCte ){
+ return 0;
+ }
+ assert( pItem->pTab!=0 );
+ pTab = pItem->pTab;
+ assert( pItem->pSelect!=0 );
+ pSub = pItem->pSelect;
+ assert( pSub->pEList->nExpr==pTab->nCol );
+ if( (pSub->selFlags & (SF_Distinct|SF_Aggregate))!=0 ){
+ testcase( pSub->selFlags & SF_Distinct );
+ testcase( pSub->selFlags & SF_Aggregate );
+ return 0;
+ }
+ for(pX=pSub; pX; pX=pX->pPrior){
+ if( pX->pPrior && pX->op!=TK_ALL ){
+ /* This optimization does not work for compound subqueries that
+ ** use UNION, INTERSECT, or EXCEPT. Only UNION ALL is allowed. */
+ return 0;
+ }
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ if( pX->pWin ){
+ /* This optimization does not work for subqueries that use window
+ ** functions. */
+ return 0;
+ }
+#endif
+ }
+ colUsed = pItem->colUsed;
+ if( pSub->pOrderBy ){
+ ExprList *pList = pSub->pOrderBy;
+ for(j=0; j<pList->nExpr; j++){
+ u16 iCol = pList->a[j].u.x.iOrderByCol;
+ if( iCol>0 ){
+ iCol--;
+ colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol);
+ }
+ }
+ }
+ nCol = pTab->nCol;
+ for(j=0; j<nCol; j++){
+ Bitmask m = j<BMS-1 ? MASKBIT(j) : TOPBIT;
+ if( (m & colUsed)!=0 ) continue;
+ for(pX=pSub; pX; pX=pX->pPrior) {
+ Expr *pY = pX->pEList->a[j].pExpr;
+ if( pY->op==TK_NULL ) continue;
+ pY->op = TK_NULL;
+ ExprClearProperty(pY, EP_Skip|EP_Unlikely);
+ pX->selFlags |= SF_PushDown;
+ nChng++;
+ }
+ }
+ return nChng;
+}
+
+
+/*
** The pFunc is the only aggregate function in the query. Check to see
** if the query is a candidate for the min/max optimization.
**
@@ -136933,7 +144355,7 @@ static int pushDownWhereTerms(
*/
static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
int eRet = WHERE_ORDERBY_NORMAL; /* Return value */
- ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */
+ ExprList *pEList; /* Arguments to agg function */
const char *zFunc; /* Name of aggregate function pFunc */
ExprList *pOrderBy;
u8 sortFlags = 0;
@@ -136941,6 +144363,8 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
assert( *ppMinMax==0 );
assert( pFunc->op==TK_AGG_FUNCTION );
assert( !IsWindowFunc(pFunc) );
+ assert( ExprUseXList(pFunc) );
+ pEList = pFunc->x.pList;
if( pEList==0
|| pEList->nExpr!=1
|| ExprHasProperty(pFunc, EP_WinFunc)
@@ -136948,6 +144372,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
){
return eRet;
}
+ assert( !ExprHasProperty(pFunc, EP_IntValue) );
zFunc = pFunc->u.zToken;
if( sqlite3StrICmp(zFunc, "min")==0 ){
eRet = WHERE_ORDERBY_MIN;
@@ -136962,7 +144387,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
}
*ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0);
assert( pOrderBy!=0 || db->mallocFailed );
- if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags;
+ if( pOrderBy ) pOrderBy->a[0].fg.sortFlags = sortFlags;
return eRet;
}
@@ -136975,7 +144400,13 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
**
** where table is a database table, not a sub-select or view. If the query
** does match this pattern, then a pointer to the Table object representing
-** <tbl> is returned. Otherwise, 0 is returned.
+** <tbl> is returned. Otherwise, NULL is returned.
+**
+** This routine checks to see if it is safe to use the count optimization.
+** A correct answer is still obtained (though perhaps more slowly) if
+** this routine returns NULL when it could have returned a table pointer.
+** But returning the pointer when NULL should have been returned can
+** result in incorrect answers and/or crashes. So, when in doubt, return NULL.
*/
static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){
Table *pTab;
@@ -136983,19 +144414,27 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){
assert( !p->pGroupBy );
- if( p->pWhere || p->pEList->nExpr!=1
- || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect
+ if( p->pWhere
+ || p->pEList->nExpr!=1
+ || p->pSrc->nSrc!=1
+ || p->pSrc->a[0].pSelect
+ || pAggInfo->nFunc!=1
+ || p->pHaving
){
return 0;
}
pTab = p->pSrc->a[0].pTab;
+ assert( pTab!=0 );
+ assert( !IsView(pTab) );
+ if( !IsOrdinaryTable(pTab) ) return 0;
pExpr = p->pEList->a[0].pExpr;
- assert( pTab && !pTab->pSelect && pExpr );
-
- if( IsVirtual(pTab) ) return 0;
+ assert( pExpr!=0 );
if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
- if( NEVER(pAggInfo->nFunc==0) ) return 0;
+ if( pExpr->pAggInfo!=pAggInfo ) return 0;
if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0;
+ assert( pAggInfo->aFunc[0].pFExpr==pExpr );
+ testcase( ExprHasProperty(pExpr, EP_Distinct) );
+ testcase( ExprHasProperty(pExpr, EP_WinFunc) );
if( ExprHasProperty(pExpr, EP_Distinct|EP_WinFunc) ) return 0;
return pTab;
@@ -137024,6 +144463,7 @@ SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, SrcItem *pFrom){
pParse->checkSchema = 1;
return SQLITE_ERROR;
}
+ assert( pFrom->fg.isCte==0 );
pFrom->u2.pIBIndex = pIdx;
return SQLITE_OK;
}
@@ -137084,7 +144524,7 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){
pNew = sqlite3DbMallocZero(db, sizeof(*pNew) );
if( pNew==0 ) return WRC_Abort;
memset(&dummy, 0, sizeof(dummy));
- pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0,0);
+ pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0);
if( pNewSrc==0 ) return WRC_Abort;
*pNew = *p;
p->pSrc = pNewSrc;
@@ -137281,12 +144721,13 @@ static int resolveFromTermToCte(
if( db->mallocFailed ) return 2;
pFrom->pSelect->selFlags |= SF_CopyCte;
assert( pFrom->pSelect );
+ if( pFrom->fg.isIndexedBy ){
+ sqlite3ErrorMsg(pParse, "no such index: \"%s\"", pFrom->u1.zIndexedBy);
+ return 2;
+ }
pFrom->fg.isCte = 1;
pFrom->u2.pCteUse = pCteUse;
pCteUse->nUse++;
- if( pCteUse->nUse>=2 && pCteUse->eM10d==M10d_Any ){
- pCteUse->eM10d = M10d_Yes;
- }
/* Check if this is a recursive CTE. */
pRecTerm = pSel = pFrom->pSelect;
@@ -137396,9 +144837,9 @@ SQLITE_PRIVATE void sqlite3SelectPopWith(Walker *pWalker, Select *p){
#endif
/*
-** The SrcList_item structure passed as the second argument represents a
+** The SrcItem structure passed as the second argument represents a
** sub-query in the FROM clause of a SELECT statement. This function
-** allocates and populates the SrcList_item.pTab object. If successful,
+** allocates and populates the SrcItem.pTab object. If successful,
** SQLITE_OK is returned. Otherwise, if an OOM error is encountered,
** SQLITE_NOMEM.
*/
@@ -137413,7 +144854,7 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){
if( pFrom->zAlias ){
pTab->zName = sqlite3DbStrDup(pParse->db, pFrom->zAlias);
}else{
- pTab->zName = sqlite3MPrintf(pParse->db, "subquery_%u", pSel->selId);
+ pTab->zName = sqlite3MPrintf(pParse->db, "%!S", pFrom);
}
while( pSel->pPrior ){ pSel = pSel->pPrior; }
sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol);
@@ -137425,11 +144866,35 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){
#else
pTab->tabFlags |= TF_Ephemeral; /* Legacy compatibility mode */
#endif
+ return pParse->nErr ? SQLITE_ERROR : SQLITE_OK;
+}
- return pParse->nErr ? SQLITE_ERROR : SQLITE_OK;
+/*
+** Check the N SrcItem objects to the right of pBase. (N might be zero!)
+** If any of those SrcItem objects have a USING clause containing zName
+** then return true.
+**
+** If N is zero, or none of the N SrcItem objects to the right of pBase
+** contains a USING clause, or if none of the USING clauses contain zName,
+** then return false.
+*/
+static int inAnyUsingClause(
+ const char *zName, /* Name we are looking for */
+ SrcItem *pBase, /* The base SrcItem. Looking at pBase[1] and following */
+ int N /* How many SrcItems to check */
+){
+ while( N>0 ){
+ N--;
+ pBase++;
+ if( pBase->fg.isUsing==0 ) continue;
+ if( NEVER(pBase->u3.pUsing==0) ) continue;
+ if( sqlite3IdListIndex(pBase->u3.pUsing, zName)>=0 ) return 1;
+ }
+ return 0;
}
+
/*
** This routine is a Walker callback for "expanding" a SELECT statement.
** "Expanding" means to do the following:
@@ -137535,30 +145000,31 @@ static int selectExpander(Walker *pWalker, Select *p){
return WRC_Abort;
}
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
- if( IsVirtual(pTab) || pTab->pSelect ){
+ if( !IsOrdinaryTable(pTab) ){
i16 nCol;
u8 eCodeOrig = pWalker->eCode;
if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort;
assert( pFrom->pSelect==0 );
- if( pTab->pSelect
- && (db->flags & SQLITE_EnableView)==0
- && pTab->pSchema!=db->aDb[1].pSchema
- ){
- sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited",
- pTab->zName);
+ if( IsView(pTab) ){
+ if( (db->flags & SQLITE_EnableView)==0
+ && pTab->pSchema!=db->aDb[1].pSchema
+ ){
+ sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited",
+ pTab->zName);
+ }
+ pFrom->pSelect = sqlite3SelectDup(db, pTab->u.view.pSelect, 0);
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
- assert( SQLITE_VTABRISK_Normal==1 && SQLITE_VTABRISK_High==2 );
- if( IsVirtual(pTab)
+ else if( ALWAYS(IsVirtual(pTab))
&& pFrom->fg.fromDDL
- && ALWAYS(pTab->pVTable!=0)
- && pTab->pVTable->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0)
+ && ALWAYS(pTab->u.vtab.p!=0)
+ && pTab->u.vtab.p->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0)
){
sqlite3ErrorMsg(pParse, "unsafe use of virtual table \"%s\"",
pTab->zName);
}
+ assert( SQLITE_VTABRISK_Normal==1 && SQLITE_VTABRISK_High==2 );
#endif
- pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0);
nCol = pTab->nCol;
pTab->nCol = -1;
pWalker->eCode = 1; /* Turn on Select.selId renumbering */
@@ -137577,7 +145043,8 @@ static int selectExpander(Walker *pWalker, Select *p){
/* Process NATURAL keywords, and ON and USING clauses of joins.
*/
- if( pParse->nErr || db->mallocFailed || sqliteProcessJoin(pParse, p) ){
+ assert( db->mallocFailed==0 || pParse->nErr!=0 );
+ if( pParse->nErr || sqlite3ProcessJoin(pParse, p) ){
return WRC_Abort;
}
@@ -137625,7 +145092,7 @@ static int selectExpander(Walker *pWalker, Select *p){
pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr);
if( pNew ){
pNew->a[pNew->nExpr-1].zEName = a[k].zEName;
- pNew->a[pNew->nExpr-1].eEName = a[k].eEName;
+ pNew->a[pNew->nExpr-1].fg.eEName = a[k].fg.eEName;
a[k].zEName = 0;
}
a[k].pExpr = 0;
@@ -137640,32 +145107,60 @@ static int selectExpander(Walker *pWalker, Select *p){
zTName = pE->pLeft->u.zToken;
}
for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
- Table *pTab = pFrom->pTab;
- Select *pSub = pFrom->pSelect;
- char *zTabName = pFrom->zAlias;
- const char *zSchemaName = 0;
- int iDb;
- if( zTabName==0 ){
+ Table *pTab = pFrom->pTab; /* Table for this data source */
+ ExprList *pNestedFrom; /* Result-set of a nested FROM clause */
+ char *zTabName; /* AS name for this data source */
+ const char *zSchemaName = 0; /* Schema name for this data source */
+ int iDb; /* Schema index for this data src */
+ IdList *pUsing; /* USING clause for pFrom[1] */
+
+ if( (zTabName = pFrom->zAlias)==0 ){
zTabName = pTab->zName;
}
if( db->mallocFailed ) break;
- if( pSub==0 || (pSub->selFlags & SF_NestedFrom)==0 ){
- pSub = 0;
+ assert( (int)pFrom->fg.isNestedFrom == IsNestedFrom(pFrom->pSelect) );
+ if( pFrom->fg.isNestedFrom ){
+ assert( pFrom->pSelect!=0 );
+ pNestedFrom = pFrom->pSelect->pEList;
+ assert( pNestedFrom!=0 );
+ assert( pNestedFrom->nExpr==pTab->nCol );
+ }else{
if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){
continue;
}
+ pNestedFrom = 0;
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*";
}
+ if( i+1<pTabList->nSrc
+ && pFrom[1].fg.isUsing
+ && (selFlags & SF_NestedFrom)!=0
+ ){
+ int ii;
+ pUsing = pFrom[1].u3.pUsing;
+ for(ii=0; ii<pUsing->nId; ii++){
+ const char *zUName = pUsing->a[ii].zName;
+ pRight = sqlite3Expr(db, TK_ID, zUName);
+ pNew = sqlite3ExprListAppend(pParse, pNew, pRight);
+ if( pNew ){
+ struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];
+ assert( pX->zEName==0 );
+ pX->zEName = sqlite3MPrintf(db,"..%s", zUName);
+ pX->fg.eEName = ENAME_TAB;
+ pX->fg.bUsingTerm = 1;
+ }
+ }
+ }else{
+ pUsing = 0;
+ }
for(j=0; j<pTab->nCol; j++){
- char *zName = pTab->aCol[j].zName;
- char *zColname; /* The computed column name */
- char *zToFree; /* Malloced string that needs to be freed */
- Token sColname; /* Computed column name as a token */
+ char *zName = pTab->aCol[j].zCnName;
+ struct ExprList_item *pX; /* Newly added ExprList term */
assert( zName );
- if( zTName && pSub
- && sqlite3MatchEName(&pSub->pEList->a[j], 0, zTName, 0)==0
+ if( zTName
+ && pNestedFrom
+ && sqlite3MatchEName(&pNestedFrom->a[j], 0, zTName, 0)==0
){
continue;
}
@@ -137679,57 +145174,75 @@ static int selectExpander(Walker *pWalker, Select *p){
){
continue;
}
+ if( (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0
+ && zTName==0
+ && (selFlags & (SF_NestedFrom))==0
+ ){
+ continue;
+ }
tableSeen = 1;
- if( i>0 && zTName==0 ){
- if( (pFrom->fg.jointype & JT_NATURAL)!=0
- && tableAndColumnIndex(pTabList, i, zName, 0, 0, 1)
+ if( i>0 && zTName==0 && (selFlags & SF_NestedFrom)==0 ){
+ if( pFrom->fg.isUsing
+ && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0
){
- /* In a NATURAL join, omit the join columns from the
- ** table to the right of the join */
- continue;
- }
- if( sqlite3IdListIndex(pFrom->pUsing, zName)>=0 ){
/* In a join with a USING clause, omit columns in the
** using clause from the table on the right. */
continue;
}
}
pRight = sqlite3Expr(db, TK_ID, zName);
- zColname = zName;
- zToFree = 0;
- if( longNames || pTabList->nSrc>1 ){
+ if( (pTabList->nSrc>1
+ && ( (pFrom->fg.jointype & JT_LTORJ)==0
+ || (selFlags & SF_NestedFrom)!=0
+ || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1)
+ )
+ )
+ || IN_RENAME_OBJECT
+ ){
Expr *pLeft;
pLeft = sqlite3Expr(db, TK_ID, zTabName);
pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
+ if( IN_RENAME_OBJECT && pE->pLeft ){
+ sqlite3RenameTokenRemap(pParse, pLeft, pE->pLeft);
+ }
if( zSchemaName ){
pLeft = sqlite3Expr(db, TK_ID, zSchemaName);
pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr);
}
- if( longNames ){
- zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName);
- zToFree = zColname;
- }
}else{
pExpr = pRight;
}
pNew = sqlite3ExprListAppend(pParse, pNew, pExpr);
- sqlite3TokenInit(&sColname, zColname);
- sqlite3ExprListSetName(pParse, pNew, &sColname, 0);
- if( pNew && (p->selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){
- struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];
- sqlite3DbFree(db, pX->zEName);
- if( pSub ){
- pX->zEName = sqlite3DbStrDup(db, pSub->pEList->a[j].zEName);
+ if( pNew==0 ){
+ break; /* OOM */
+ }
+ pX = &pNew->a[pNew->nExpr-1];
+ assert( pX->zEName==0 );
+ if( (selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){
+ if( pNestedFrom ){
+ pX->zEName = sqlite3DbStrDup(db, pNestedFrom->a[j].zEName);
testcase( pX->zEName==0 );
}else{
pX->zEName = sqlite3MPrintf(db, "%s.%s.%s",
- zSchemaName, zTabName, zColname);
+ zSchemaName, zTabName, zName);
testcase( pX->zEName==0 );
}
- pX->eEName = ENAME_TAB;
+ pX->fg.eEName = ENAME_TAB;
+ if( (pFrom->fg.isUsing
+ && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0)
+ || (pUsing && sqlite3IdListIndex(pUsing, zName)>=0)
+ || (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0
+ ){
+ pX->fg.bNoExpand = 1;
+ }
+ }else if( longNames ){
+ pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName);
+ pX->fg.eEName = ENAME_NAME;
+ }else{
+ pX->zEName = sqlite3DbStrDup(db, zName);
+ pX->fg.eEName = ENAME_NAME;
}
- sqlite3DbFree(db, zToFree);
}
}
if( !tableSeen ){
@@ -137753,6 +145266,12 @@ static int selectExpander(Walker *pWalker, Select *p){
p->selFlags |= SF_ComplexResult;
}
}
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x8 ){
+ TREETRACE(0x8,pParse,p,("After result-set wildcard expansion:\n"));
+ sqlite3TreeViewSelect(0, p, 0);
+ }
+#endif
return WRC_Continue;
}
@@ -137800,14 +145319,14 @@ static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){
** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo()
** interface.
**
-** For each FROM-clause subquery, add Column.zType and Column.zColl
-** information to the Table structure that represents the result set
-** of that subquery.
+** For each FROM-clause subquery, add Column.zType, Column.zColl, and
+** Column.affinity information to the Table structure that represents
+** the result set of that subquery.
**
** The Table structure that represents the result set was constructed
-** by selectExpander() but the type and collation information was omitted
-** at that point because identifiers had not yet been resolved. This
-** routine is called after identifier resolution.
+** by selectExpander() but the type and collation and affinity information
+** was omitted at that point because identifiers had not yet been resolved.
+** This routine is called after identifier resolution.
*/
static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){
Parse *pParse;
@@ -137827,9 +145346,7 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){
/* A sub-query in the FROM clause of a SELECT */
Select *pSel = pFrom->pSelect;
if( pSel ){
- while( pSel->pPrior ) pSel = pSel->pPrior;
- sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel,
- SQLITE_AFF_NONE);
+ sqlite3SubqueryColumnTypes(pParse, pTab, pSel, SQLITE_AFF_NONE);
}
}
}
@@ -137874,15 +145391,188 @@ SQLITE_PRIVATE void sqlite3SelectPrep(
NameContext *pOuterNC /* Name context for container */
){
assert( p!=0 || pParse->db->mallocFailed );
+ assert( pParse->db->pParse==pParse );
if( pParse->db->mallocFailed ) return;
if( p->selFlags & SF_HasTypeInfo ) return;
sqlite3SelectExpand(pParse, p);
- if( pParse->nErr || pParse->db->mallocFailed ) return;
+ if( pParse->nErr ) return;
sqlite3ResolveSelectNames(pParse, p, pOuterNC);
- if( pParse->nErr || pParse->db->mallocFailed ) return;
+ if( pParse->nErr ) return;
sqlite3SelectAddTypeInfo(pParse, p);
}
+#if TREETRACE_ENABLED
+/*
+** Display all information about an AggInfo object
+*/
+static void printAggInfo(AggInfo *pAggInfo){
+ int ii;
+ for(ii=0; ii<pAggInfo->nColumn; ii++){
+ struct AggInfo_col *pCol = &pAggInfo->aCol[ii];
+ sqlite3DebugPrintf(
+ "agg-column[%d] pTab=%s iTable=%d iColumn=%d iMem=%d"
+ " iSorterColumn=%d %s\n",
+ ii, pCol->pTab ? pCol->pTab->zName : "NULL",
+ pCol->iTable, pCol->iColumn, pAggInfo->iFirstReg+ii,
+ pCol->iSorterColumn,
+ ii>=pAggInfo->nAccumulator ? "" : " Accumulator");
+ sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pCExpr, 0);
+ }
+ for(ii=0; ii<pAggInfo->nFunc; ii++){
+ sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n",
+ ii, pAggInfo->iFirstReg+pAggInfo->nColumn+ii);
+ sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pFExpr, 0);
+ }
+}
+#endif /* TREETRACE_ENABLED */
+
+/*
+** Analyze the arguments to aggregate functions. Create new pAggInfo->aCol[]
+** entries for columns that are arguments to aggregate functions but which
+** are not otherwise used.
+**
+** The aCol[] entries in AggInfo prior to nAccumulator are columns that
+** are referenced outside of aggregate functions. These might be columns
+** that are part of the GROUP by clause, for example. Other database engines
+** would throw an error if there is a column reference that is not in the
+** GROUP BY clause and that is not part of an aggregate function argument.
+** But SQLite allows this.
+**
+** The aCol[] entries beginning with the aCol[nAccumulator] and following
+** are column references that are used exclusively as arguments to
+** aggregate functions. This routine is responsible for computing
+** (or recomputing) those aCol[] entries.
+*/
+static void analyzeAggFuncArgs(
+ AggInfo *pAggInfo,
+ NameContext *pNC
+){
+ int i;
+ assert( pAggInfo!=0 );
+ assert( pAggInfo->iFirstReg==0 );
+ pNC->ncFlags |= NC_InAggFunc;
+ for(i=0; i<pAggInfo->nFunc; i++){
+ Expr *pExpr = pAggInfo->aFunc[i].pFExpr;
+ assert( ExprUseXList(pExpr) );
+ sqlite3ExprAnalyzeAggList(pNC, pExpr->x.pList);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ assert( !IsWindowFunc(pExpr) );
+ if( ExprHasProperty(pExpr, EP_WinFunc) ){
+ sqlite3ExprAnalyzeAggregates(pNC, pExpr->y.pWin->pFilter);
+ }
+#endif
+ }
+ pNC->ncFlags &= ~NC_InAggFunc;
+}
+
+/*
+** An index on expressions is being used in the inner loop of an
+** aggregate query with a GROUP BY clause. This routine attempts
+** to adjust the AggInfo object to take advantage of index and to
+** perhaps use the index as a covering index.
+**
+*/
+static void optimizeAggregateUseOfIndexedExpr(
+ Parse *pParse, /* Parsing context */
+ Select *pSelect, /* The SELECT statement being processed */
+ AggInfo *pAggInfo, /* The aggregate info */
+ NameContext *pNC /* Name context used to resolve agg-func args */
+){
+ assert( pAggInfo->iFirstReg==0 );
+ assert( pSelect!=0 );
+ assert( pSelect->pGroupBy!=0 );
+ pAggInfo->nColumn = pAggInfo->nAccumulator;
+ if( ALWAYS(pAggInfo->nSortingColumn>0) ){
+ int mx = pSelect->pGroupBy->nExpr - 1;
+ int j, k;
+ for(j=0; j<pAggInfo->nColumn; j++){
+ k = pAggInfo->aCol[j].iSorterColumn;
+ if( k>mx ) mx = k;
+ }
+ pAggInfo->nSortingColumn = mx+1;
+ }
+ analyzeAggFuncArgs(pAggInfo, pNC);
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x20 ){
+ IndexedExpr *pIEpr;
+ TREETRACE(0x20, pParse, pSelect,
+ ("AggInfo (possibly) adjusted for Indexed Exprs\n"));
+ sqlite3TreeViewSelect(0, pSelect, 0);
+ for(pIEpr=pParse->pIdxEpr; pIEpr; pIEpr=pIEpr->pIENext){
+ printf("data-cursor=%d index={%d,%d}\n",
+ pIEpr->iDataCur, pIEpr->iIdxCur, pIEpr->iIdxCol);
+ sqlite3TreeViewExpr(0, pIEpr->pExpr, 0);
+ }
+ printAggInfo(pAggInfo);
+ }
+#else
+ UNUSED_PARAMETER(pSelect);
+ UNUSED_PARAMETER(pParse);
+#endif
+}
+
+/*
+** Walker callback for aggregateConvertIndexedExprRefToColumn().
+*/
+static int aggregateIdxEprRefToColCallback(Walker *pWalker, Expr *pExpr){
+ AggInfo *pAggInfo;
+ struct AggInfo_col *pCol;
+ UNUSED_PARAMETER(pWalker);
+ if( pExpr->pAggInfo==0 ) return WRC_Continue;
+ if( pExpr->op==TK_AGG_COLUMN ) return WRC_Continue;
+ if( pExpr->op==TK_AGG_FUNCTION ) return WRC_Continue;
+ if( pExpr->op==TK_IF_NULL_ROW ) return WRC_Continue;
+ pAggInfo = pExpr->pAggInfo;
+ if( NEVER(pExpr->iAgg>=pAggInfo->nColumn) ) return WRC_Continue;
+ assert( pExpr->iAgg>=0 );
+ pCol = &pAggInfo->aCol[pExpr->iAgg];
+ pExpr->op = TK_AGG_COLUMN;
+ pExpr->iTable = pCol->iTable;
+ pExpr->iColumn = pCol->iColumn;
+ ExprClearProperty(pExpr, EP_Skip|EP_Collate);
+ return WRC_Prune;
+}
+
+/*
+** Convert every pAggInfo->aFunc[].pExpr such that any node within
+** those expressions that has pAppInfo set is changed into a TK_AGG_COLUMN
+** opcode.
+*/
+static void aggregateConvertIndexedExprRefToColumn(AggInfo *pAggInfo){
+ int i;
+ Walker w;
+ memset(&w, 0, sizeof(w));
+ w.xExprCallback = aggregateIdxEprRefToColCallback;
+ for(i=0; i<pAggInfo->nFunc; i++){
+ sqlite3WalkExpr(&w, pAggInfo->aFunc[i].pFExpr);
+ }
+}
+
+
+/*
+** Allocate a block of registers so that there is one register for each
+** pAggInfo->aCol[] and pAggInfo->aFunc[] entry in pAggInfo. The first
+** register in this block is stored in pAggInfo->iFirstReg.
+**
+** This routine may only be called once for each AggInfo object. Prior
+** to calling this routine:
+**
+** * The aCol[] and aFunc[] arrays may be modified
+** * The AggInfoColumnReg() and AggInfoFuncReg() macros may not be used
+**
+** After clling this routine:
+**
+** * The aCol[] and aFunc[] arrays are fixed
+** * The AggInfoColumnReg() and AggInfoFuncReg() macros may be used
+**
+*/
+static void assignAggregateRegisters(Parse *pParse, AggInfo *pAggInfo){
+ assert( pAggInfo!=0 );
+ assert( pAggInfo->iFirstReg==0 );
+ pAggInfo->iFirstReg = pParse->nMem + 1;
+ pParse->nMem += pAggInfo->nColumn + pAggInfo->nFunc;
+}
+
/*
** Reset the aggregate accumulator.
**
@@ -137896,26 +145586,17 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){
int i;
struct AggInfo_func *pFunc;
int nReg = pAggInfo->nFunc + pAggInfo->nColumn;
+ assert( pAggInfo->iFirstReg>0 );
+ assert( pParse->db->pParse==pParse );
+ assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 );
if( nReg==0 ) return;
- if( pParse->nErr || pParse->db->mallocFailed ) return;
-#ifdef SQLITE_DEBUG
- /* Verify that all AggInfo registers are within the range specified by
- ** AggInfo.mnReg..AggInfo.mxReg */
- assert( nReg==pAggInfo->mxReg-pAggInfo->mnReg+1 );
- for(i=0; i<pAggInfo->nColumn; i++){
- assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg
- && pAggInfo->aCol[i].iMem<=pAggInfo->mxReg );
- }
- for(i=0; i<pAggInfo->nFunc; i++){
- assert( pAggInfo->aFunc[i].iMem>=pAggInfo->mnReg
- && pAggInfo->aFunc[i].iMem<=pAggInfo->mxReg );
- }
-#endif
- sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg);
+ if( pParse->nErr ) return;
+ sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->iFirstReg,
+ pAggInfo->iFirstReg+nReg-1);
for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){
if( pFunc->iDistinct>=0 ){
Expr *pE = pFunc->pFExpr;
- assert( !ExprHasProperty(pE, EP_xIsSelect) );
+ assert( ExprUseXList(pE) );
if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){
sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one "
"argument");
@@ -137940,17 +145621,19 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
int i;
struct AggInfo_func *pF;
for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
- ExprList *pList = pF->pFExpr->x.pList;
- assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) );
- sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0);
+ ExprList *pList;
+ assert( ExprUseXList(pF->pFExpr) );
+ pList = pF->pFExpr->x.pList;
+ sqlite3VdbeAddOp2(v, OP_AggFinal, AggInfoFuncReg(pAggInfo,i),
+ pList ? pList->nExpr : 0);
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
}
}
/*
-** Update the accumulator memory cells for an aggregate based on
-** the current cursor position.
+** Generate code that will update the accumulator memory cells for an
+** aggregate based on the current cursor position.
**
** If regAcc is non-zero and there are no min() or max() aggregates
** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator
@@ -137970,14 +145653,17 @@ static void updateAccumulator(
struct AggInfo_func *pF;
struct AggInfo_col *pC;
+ assert( pAggInfo->iFirstReg>0 );
+ if( pParse->nErr ) return;
pAggInfo->directMode = 1;
for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
int nArg;
int addrNext = 0;
int regAgg;
- ExprList *pList = pF->pFExpr->x.pList;
- assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) );
+ ExprList *pList;
+ assert( ExprUseXList(pF->pFExpr) );
assert( !IsWindowFunc(pF->pFExpr) );
+ pList = pF->pFExpr->x.pList;
if( ExprHasProperty(pF->pFExpr, EP_WinFunc) ){
Expr *pFilter = pF->pFExpr->y.pWin->pFilter;
if( pAggInfo->nAccumulator
@@ -138029,7 +145715,7 @@ static void updateAccumulator(
if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem;
sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ);
}
- sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, pF->iMem);
+ sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i));
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
sqlite3VdbeChangeP5(v, (u8)nArg);
sqlite3ReleaseTempRange(pParse, regAgg, nArg);
@@ -138044,7 +145730,7 @@ static void updateAccumulator(
addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v);
}
for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){
- sqlite3ExprCode(pParse, pC->pCExpr, pC->iMem);
+ sqlite3ExprCode(pParse, pC->pCExpr, AggInfoColumnReg(pAggInfo,i));
}
pAggInfo->directMode = 0;
@@ -138090,8 +145776,16 @@ static void explainSimpleCount(
static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){
if( pExpr->op!=TK_AND ){
Select *pS = pWalker->u.pSelect;
+ /* This routine is called before the HAVING clause of the current
+ ** SELECT is analyzed for aggregates. So if pExpr->pAggInfo is set
+ ** here, it indicates that the expression is a correlated reference to a
+ ** column from an outer aggregate query, or an aggregate function that
+ ** belongs to an outer query. Do not move the expression to the WHERE
+ ** clause in this obscure case, as doing so may corrupt the outer Select
+ ** statements AggInfo structure. */
if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy)
&& ExprAlwaysFalse(pExpr)==0
+ && pExpr->pAggInfo==0
){
sqlite3 *db = pWalker->pParse->db;
Expr *pNew = sqlite3Expr(db, TK_INTEGER, "1");
@@ -138130,28 +145824,33 @@ static void havingToWhere(Parse *pParse, Select *p){
sWalker.xExprCallback = havingToWhereExprCb;
sWalker.u.pSelect = p;
sqlite3WalkExpr(&sWalker, p->pHaving);
-#if SELECTTRACE_ENABLED
- if( sWalker.eCode && (sqlite3SelectTrace & 0x100)!=0 ){
- SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n"));
+#if TREETRACE_ENABLED
+ if( sWalker.eCode && (sqlite3TreeTrace & 0x100)!=0 ){
+ TREETRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
}
/*
-** Check to see if the pThis entry of pTabList is a self-join of a prior view.
-** If it is, then return the SrcList_item for the prior view. If it is not,
-** then return 0.
+** Check to see if the pThis entry of pTabList is a self-join of another view.
+** Search FROM-clause entries in the range of iFirst..iEnd, including iFirst
+** but stopping before iEnd.
+**
+** If pThis is a self-join, then return the SrcItem for the first other
+** instance of that view found. If pThis is not a self-join then return 0.
*/
static SrcItem *isSelfJoinView(
SrcList *pTabList, /* Search for self-joins in this FROM clause */
- SrcItem *pThis /* Search for prior reference to this subquery */
+ SrcItem *pThis, /* Search for prior reference to this subquery */
+ int iFirst, int iEnd /* Range of FROM-clause entries to search. */
){
SrcItem *pItem;
assert( pThis->pSelect!=0 );
if( pThis->pSelect->selFlags & SF_PushDown ) return 0;
- for(pItem = pTabList->a; pItem<pThis; pItem++){
+ while( iFirst<iEnd ){
Select *pS1;
+ pItem = &pTabList->a[iFirst++];
if( pItem->pSelect==0 ) continue;
if( pItem->fg.viaCoroutine ) continue;
if( pItem->zName==0 ) continue;
@@ -138184,7 +145883,6 @@ static void agginfoFree(sqlite3 *db, AggInfo *p){
sqlite3DbFreeNN(db, p);
}
-#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION
/*
** Attempt to transform a query of the form
**
@@ -138212,21 +145910,28 @@ static int countOfViewOptimization(Parse *pParse, Select *p){
if( (p->selFlags & SF_Aggregate)==0 ) return 0; /* This is an aggregate */
if( p->pEList->nExpr!=1 ) return 0; /* Single result column */
if( p->pWhere ) return 0;
+ if( p->pHaving ) return 0;
if( p->pGroupBy ) return 0;
+ if( p->pOrderBy ) return 0;
pExpr = p->pEList->a[0].pExpr;
if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */
+ assert( ExprUseUToken(pExpr) );
if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */
+ assert( ExprUseXList(pExpr) );
if( pExpr->x.pList!=0 ) return 0; /* Must be count(*) */
if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */
+ if( ExprHasProperty(pExpr, EP_WinFunc) ) return 0;/* Not a window function */
pSub = p->pSrc->a[0].pSelect;
if( pSub==0 ) return 0; /* The FROM is a subquery */
- if( pSub->pPrior==0 ) return 0; /* Must be a compound ry */
+ if( pSub->pPrior==0 ) return 0; /* Must be a compound */
+ if( pSub->selFlags & SF_CopyCte ) return 0; /* Not a CTE */
do{
if( pSub->op!=TK_ALL && pSub->pPrior ) return 0; /* Must be UNION ALL */
if( pSub->pWhere ) return 0; /* No WHERE clause */
if( pSub->pLimit ) return 0; /* No LIMIT clause */
if( pSub->selFlags & SF_Aggregate ) return 0; /* Not an aggregate */
- pSub = pSub->pPrior; /* Repeat over compound */
+ assert( pSub->pHaving==0 ); /* Due to the previous */
+ pSub = pSub->pPrior; /* Repeat over compound */
}while( pSub );
/* If we reach this point then it is OK to perform the transformation */
@@ -138261,15 +145966,99 @@ static int countOfViewOptimization(Parse *pParse, Select *p){
p->pEList->a[0].pExpr = pExpr;
p->selFlags &= ~SF_Aggregate;
-#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x400 ){
- SELECTTRACE(0x400,pParse,p,("After count-of-view optimization:\n"));
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x200 ){
+ TREETRACE(0x200,pParse,p,("After count-of-view optimization:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
return 1;
}
-#endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */
+
+/*
+** If any term of pSrc, or any SF_NestedFrom sub-query, is not the same
+** as pSrcItem but has the same alias as p0, then return true.
+** Otherwise return false.
+*/
+static int sameSrcAlias(SrcItem *p0, SrcList *pSrc){
+ int i;
+ for(i=0; i<pSrc->nSrc; i++){
+ SrcItem *p1 = &pSrc->a[i];
+ if( p1==p0 ) continue;
+ if( p0->pTab==p1->pTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){
+ return 1;
+ }
+ if( p1->pSelect
+ && (p1->pSelect->selFlags & SF_NestedFrom)!=0
+ && sameSrcAlias(p0, p1->pSelect->pSrc)
+ ){
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/*
+** Return TRUE (non-zero) if the i-th entry in the pTabList SrcList can
+** be implemented as a co-routine. The i-th entry is guaranteed to be
+** a subquery.
+**
+** The subquery is implemented as a co-routine if all of the following are
+** true:
+**
+** (1) The subquery will likely be implemented in the outer loop of
+** the query. This will be the case if any one of the following
+** conditions hold:
+** (a) The subquery is the only term in the FROM clause
+** (b) The subquery is the left-most term and a CROSS JOIN or similar
+** requires it to be the outer loop
+** (c) All of the following are true:
+** (i) The subquery is the left-most subquery in the FROM clause
+** (ii) There is nothing that would prevent the subquery from
+** being used as the outer loop if the sqlite3WhereBegin()
+** routine nominates it to that position.
+** (iii) The query is not a UPDATE ... FROM
+** (2) The subquery is not a CTE that should be materialized because
+** (a) the AS MATERIALIZED keyword is used, or
+** (b) the CTE is used multiple times and does not have the
+** NOT MATERIALIZED keyword
+** (3) The subquery is not part of a left operand for a RIGHT JOIN
+** (4) The SQLITE_Coroutine optimization disable flag is not set
+** (5) The subquery is not self-joined
+*/
+static int fromClauseTermCanBeCoroutine(
+ Parse *pParse, /* Parsing context */
+ SrcList *pTabList, /* FROM clause */
+ int i, /* Which term of the FROM clause holds the subquery */
+ int selFlags /* Flags on the SELECT statement */
+){
+ SrcItem *pItem = &pTabList->a[i];
+ if( pItem->fg.isCte ){
+ const CteUse *pCteUse = pItem->u2.pCteUse;
+ if( pCteUse->eM10d==M10d_Yes ) return 0; /* (2a) */
+ if( pCteUse->nUse>=2 && pCteUse->eM10d!=M10d_No ) return 0; /* (2b) */
+ }
+ if( pTabList->a[0].fg.jointype & JT_LTORJ ) return 0; /* (3) */
+ if( OptimizationDisabled(pParse->db, SQLITE_Coroutines) ) return 0; /* (4) */
+ if( isSelfJoinView(pTabList, pItem, i+1, pTabList->nSrc)!=0 ){
+ return 0; /* (5) */
+ }
+ if( i==0 ){
+ if( pTabList->nSrc==1 ) return 1; /* (1a) */
+ if( pTabList->a[1].fg.jointype & JT_CROSS ) return 1; /* (1b) */
+ if( selFlags & SF_UpdateFrom ) return 0; /* (1c-iii) */
+ return 1;
+ }
+ if( selFlags & SF_UpdateFrom ) return 0; /* (1c-iii) */
+ while( 1 /*exit-by-break*/ ){
+ if( pItem->fg.jointype & (JT_OUTER|JT_CROSS) ) return 0; /* (1c-ii) */
+ if( i==0 ) break;
+ i--;
+ pItem--;
+ if( pItem->pSelect!=0 ) return 0; /* (1c-i) */
+ }
+ return 1;
+}
/*
** Generate code for the SELECT statement given in the p argument.
@@ -138308,15 +146097,21 @@ SQLITE_PRIVATE int sqlite3Select(
u8 minMaxFlag; /* Flag for min/max queries */
db = pParse->db;
+ assert( pParse==db->pParse );
v = sqlite3GetVdbe(pParse);
- if( p==0 || db->mallocFailed || pParse->nErr ){
+ if( p==0 || pParse->nErr ){
return 1;
}
+ assert( db->mallocFailed==0 );
if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1;
-#if SELECTTRACE_ENABLED
- SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain));
- if( sqlite3SelectTrace & 0x100 ){
- sqlite3TreeViewSelect(0, p, 0);
+#if TREETRACE_ENABLED
+ TREETRACE(0x1,pParse,p, ("begin processing:\n", pParse->addrExplain));
+ if( sqlite3TreeTrace & 0x10000 ){
+ if( (sqlite3TreeTrace & 0x10001)==0x10000 ){
+ sqlite3TreeViewLine(0, "In sqlite3Select() at %s:%d",
+ __FILE__, __LINE__);
+ }
+ sqlite3ShowSelect(p);
}
#endif
@@ -138330,9 +146125,9 @@ SQLITE_PRIVATE int sqlite3Select(
pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_DistFifo );
/* All of these destinations are also able to ignore the ORDER BY clause */
if( p->pOrderBy ){
-#if SELECTTRACE_ENABLED
- SELECTTRACE(1,pParse,p, ("dropping superfluous ORDER BY:\n"));
- if( sqlite3SelectTrace & 0x100 ){
+#if TREETRACE_ENABLED
+ TREETRACE(0x800,pParse,p, ("dropping superfluous ORDER BY:\n"));
+ if( sqlite3TreeTrace & 0x800 ){
sqlite3TreeViewExprList(0, p->pOrderBy, 0, "ORDERBY");
}
#endif
@@ -138346,33 +146141,42 @@ SQLITE_PRIVATE int sqlite3Select(
p->selFlags |= SF_NoopOrderBy;
}
sqlite3SelectPrep(pParse, p, 0);
- if( pParse->nErr || db->mallocFailed ){
+ if( pParse->nErr ){
goto select_end;
}
+ assert( db->mallocFailed==0 );
assert( p->pEList!=0 );
-#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x104 ){
- SELECTTRACE(0x104,pParse,p, ("after name resolution:\n"));
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x10 ){
+ TREETRACE(0x10,pParse,p, ("after name resolution:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
- /* If the SF_UpdateFrom flag is set, then this function is being called
+ /* If the SF_UFSrcCheck flag is set, then this function is being called
** as part of populating the temp table for an UPDATE...FROM statement.
** In this case, it is an error if the target object (pSrc->a[0]) name
- ** or alias is duplicated within FROM clause (pSrc->a[1..n]). */
- if( p->selFlags & SF_UpdateFrom ){
+ ** or alias is duplicated within FROM clause (pSrc->a[1..n]).
+ **
+ ** Postgres disallows this case too. The reason is that some other
+ ** systems handle this case differently, and not all the same way,
+ ** which is just confusing. To avoid this, we follow PG's lead and
+ ** disallow it altogether. */
+ if( p->selFlags & SF_UFSrcCheck ){
SrcItem *p0 = &p->pSrc->a[0];
- for(i=1; i<p->pSrc->nSrc; i++){
- SrcItem *p1 = &p->pSrc->a[i];
- if( p0->pTab==p1->pTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){
- sqlite3ErrorMsg(pParse,
- "target object/alias may not appear in FROM clause: %s",
- p0->zAlias ? p0->zAlias : p0->pTab->zName
- );
- goto select_end;
- }
+ if( sameSrcAlias(p0, p->pSrc) ){
+ sqlite3ErrorMsg(pParse,
+ "target object/alias may not appear in FROM clause: %s",
+ p0->zAlias ? p0->zAlias : p0->pTab->zName
+ );
+ goto select_end;
}
+
+ /* Clear the SF_UFSrcCheck flag. The check has already been performed,
+ ** and leaving this flag set can cause errors if a compound sub-query
+ ** in p->pSrc is flattened into this query and this function called
+ ** again as part of compound SELECT processing. */
+ p->selFlags &= ~SF_UFSrcCheck;
}
if( pDest->eDest==SRT_Output ){
@@ -138381,12 +146185,12 @@ SQLITE_PRIVATE int sqlite3Select(
#ifndef SQLITE_OMIT_WINDOWFUNC
if( sqlite3WindowRewrite(pParse, p) ){
- assert( db->mallocFailed || pParse->nErr>0 );
+ assert( pParse->nErr );
goto select_end;
}
-#if SELECTTRACE_ENABLED
- if( p->pWin && (sqlite3SelectTrace & 0x108)!=0 ){
- SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n"));
+#if TREETRACE_ENABLED
+ if( p->pWin && (sqlite3TreeTrace & 0x40)!=0 ){
+ TREETRACE(0x40,pParse,p, ("after window rewrite:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
@@ -138413,17 +146217,19 @@ SQLITE_PRIVATE int sqlite3Select(
/* Convert LEFT JOIN into JOIN if there are terms of the right table
** of the LEFT JOIN used in the WHERE clause.
*/
- if( (pItem->fg.jointype & JT_LEFT)!=0
+ if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==JT_LEFT
&& sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor)
&& OptimizationEnabled(db, SQLITE_SimplifyJoin)
){
- SELECTTRACE(0x100,pParse,p,
+ TREETRACE(0x1000,pParse,p,
("LEFT-JOIN simplifies to JOIN on term %d\n",i));
pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER);
- unsetJoinExpr(p->pWhere, pItem->iCursor);
+ assert( pItem->iCursor>=0 );
+ unsetJoinExpr(p->pWhere, pItem->iCursor,
+ pTabList->a[0].fg.jointype & JT_LTORJ);
}
- /* No futher action if this term of the FROM clause is no a subquery */
+ /* No futher action if this term of the FROM clause is not a subquery */
if( pSub==0 ) continue;
/* Catch mismatch in the declared columns of a view and the number of
@@ -138444,6 +146250,41 @@ SQLITE_PRIVATE int sqlite3Select(
if( (pSub->selFlags & SF_Aggregate)!=0 ) continue;
assert( pSub->pGroupBy==0 );
+ /* If a FROM-clause subquery has an ORDER BY clause that is not
+ ** really doing anything, then delete it now so that it does not
+ ** interfere with query flattening. See the discussion at
+ ** https://sqlite.org/forum/forumpost/2d76f2bcf65d256a
+ **
+ ** Beware of these cases where the ORDER BY clause may not be safely
+ ** omitted:
+ **
+ ** (1) There is also a LIMIT clause
+ ** (2) The subquery was added to help with window-function
+ ** processing
+ ** (3) The subquery is in the FROM clause of an UPDATE
+ ** (4) The outer query uses an aggregate function other than
+ ** the built-in count(), min(), or max().
+ ** (5) The ORDER BY isn't going to accomplish anything because
+ ** one of:
+ ** (a) The outer query has a different ORDER BY clause
+ ** (b) The subquery is part of a join
+ ** See forum post 062d576715d277c8
+ */
+ if( pSub->pOrderBy!=0
+ && (p->pOrderBy!=0 || pTabList->nSrc>1) /* Condition (5) */
+ && pSub->pLimit==0 /* Condition (1) */
+ && (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */
+ && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) and (4) */
+ && OptimizationEnabled(db, SQLITE_OmitOrderBy)
+ ){
+ TREETRACE(0x800,pParse,p,
+ ("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1));
+ sqlite3ParserAddCleanup(pParse,
+ (void(*)(sqlite3*,void*))sqlite3ExprListDelete,
+ pSub->pOrderBy);
+ pSub->pOrderBy = 0;
+ }
+
/* If the outer query contains a "complex" result set (that is,
** if the result set of the outer query uses functions or subqueries)
** and if the subquery contains an ORDER BY clause and if
@@ -138466,7 +146307,7 @@ SQLITE_PRIVATE int sqlite3Select(
&& i==0
&& (p->selFlags & SF_ComplexResult)!=0
&& (pTabList->nSrc==1
- || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0)
+ || (pTabList->a[1].fg.jointype&(JT_OUTER|JT_CROSS))!=0)
){
continue;
}
@@ -138490,9 +146331,9 @@ SQLITE_PRIVATE int sqlite3Select(
*/
if( p->pPrior ){
rc = multiSelect(pParse, p, pDest);
-#if SELECTTRACE_ENABLED
- SELECTTRACE(0x1,pParse,p,("end compound-select processing\n"));
- if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){
+#if TREETRACE_ENABLED
+ TREETRACE(0x400,pParse,p,("end compound-select processing\n"));
+ if( (sqlite3TreeTrace & 0x400)!=0 && ExplainQueryPlanParent(pParse)==0 ){
sqlite3TreeViewSelect(0, p, 0);
}
#endif
@@ -138511,25 +146352,22 @@ SQLITE_PRIVATE int sqlite3Select(
&& OptimizationEnabled(db, SQLITE_PropagateConst)
&& propagateConstants(pParse, p)
){
-#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x100 ){
- SELECTTRACE(0x100,pParse,p,("After constant propagation:\n"));
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x2000 ){
+ TREETRACE(0x2000,pParse,p,("After constant propagation:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
}else{
- SELECTTRACE(0x100,pParse,p,("Constant propagation not helpful\n"));
+ TREETRACE(0x2000,pParse,p,("Constant propagation not helpful\n"));
}
-#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION
if( OptimizationEnabled(db, SQLITE_QueryFlattener|SQLITE_CountOfView)
&& countOfViewOptimization(pParse, p)
){
if( db->mallocFailed ) goto select_end;
- pEList = p->pEList;
pTabList = p->pSrc;
}
-#endif
/* For each term in the FROM clause, do two things:
** (1) Authorized unreferenced tables
@@ -138586,40 +146424,44 @@ SQLITE_PRIVATE int sqlite3Select(
** inside the subquery. This can help the subquery to run more efficiently.
*/
if( OptimizationEnabled(db, SQLITE_PushDown)
- && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes)
- && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor,
- (pItem->fg.jointype & JT_OUTER)!=0)
+ && (pItem->fg.isCte==0
+ || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2))
+ && pushDownWhereTerms(pParse, pSub, p->pWhere, pTabList, i)
){
-#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x100 ){
- SELECTTRACE(0x100,pParse,p,
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x4000 ){
+ TREETRACE(0x4000,pParse,p,
("After WHERE-clause push-down into subquery %d:\n", pSub->selId));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
assert( pItem->pSelect && (pItem->pSelect->selFlags & SF_PushDown)!=0 );
}else{
- SELECTTRACE(0x100,pParse,p,("Push-down not possible\n"));
+ TREETRACE(0x4000,pParse,p,("Push-down not possible\n"));
+ }
+
+ /* Convert unused result columns of the subquery into simple NULL
+ ** expressions, to avoid unneeded searching and computation.
+ */
+ if( OptimizationEnabled(db, SQLITE_NullUnusedCols)
+ && disableUnusedSubqueryResultColumns(pItem)
+ ){
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x4000 ){
+ TREETRACE(0x4000,pParse,p,
+ ("Change unused result columns to NULL for subquery %d:\n",
+ pSub->selId));
+ sqlite3TreeViewSelect(0, p, 0);
+ }
+#endif
}
zSavedAuthContext = pParse->zAuthContext;
pParse->zAuthContext = pItem->zName;
/* Generate code to implement the subquery
- **
- ** The subquery is implemented as a co-routine if:
- ** (1) the subquery is guaranteed to be the outer loop (so that
- ** it does not need to be computed more than once), and
- ** (2) the subquery is not a CTE that should be materialized
- **
- ** TODO: Are there other reasons beside (1) and (2) to use a co-routine
- ** implementation?
*/
- if( i==0
- && (pTabList->nSrc==1
- || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) /* (1) */
- && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (2) */
- ){
+ if( fromClauseTermCanBeCoroutine(pParse, pTabList, i, p->selFlags) ){
/* Implement a co-routine that will return a single row of the result
** set on each invocation.
*/
@@ -138647,9 +146489,10 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3VdbeAddOp2(v, OP_Gosub, pCteUse->regRtn, pCteUse->addrM9e);
if( pItem->iCursor!=pCteUse->iCur ){
sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pCteUse->iCur);
+ VdbeComment((v, "%!S", pItem));
}
pSub->nSelectRow = pCteUse->nRowEst;
- }else if( (pPrior = isSelfJoinView(pTabList, pItem))!=0 ){
+ }else if( (pPrior = isSelfJoinView(pTabList, pItem, 0, i))!=0 ){
/* This view has already been materialized by a prior entry in
** this same FROM clause. Reuse it. */
if( pPrior->addrFillSub ){
@@ -138663,11 +146506,14 @@ SQLITE_PRIVATE int sqlite3Select(
** the same view can reuse the materialization. */
int topAddr;
int onceAddr = 0;
- int retAddr;
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+ int addrExplain;
+#endif
pItem->regReturn = ++pParse->nMem;
- topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn);
+ topAddr = sqlite3VdbeAddOp0(v, OP_Goto);
pItem->addrFillSub = topAddr+1;
+ pItem->fg.isMaterialized = 1;
if( pItem->fg.isCorrelated==0 ){
/* If the subquery is not correlated and if we are not inside of
** a trigger, then we only need to compute the value of the subquery
@@ -138678,13 +146524,15 @@ SQLITE_PRIVATE int sqlite3Select(
VdbeNoopComment((v, "materialize %!S", pItem));
}
sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor);
- ExplainQueryPlan((pParse, 1, "MATERIALIZE %!S", pItem));
+
+ ExplainQueryPlan2(addrExplain, (pParse, 1, "MATERIALIZE %!S", pItem));
sqlite3Select(pParse, pSub, &dest);
pItem->pTab->nRowLogEst = pSub->nSelectRow;
if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr);
- retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn);
+ sqlite3VdbeAddOp2(v, OP_Return, pItem->regReturn, topAddr+1);
VdbeComment((v, "end %!S", pItem));
- sqlite3VdbeChangeP1(v, topAddr, retAddr);
+ sqlite3VdbeScanStatusRange(v, addrExplain, addrExplain, -1);
+ sqlite3VdbeJumpHere(v, topAddr);
sqlite3ClearTempRegCache(pParse);
if( pItem->fg.isCte && pItem->fg.isCorrelated==0 ){
CteUse *pCteUse = pItem->u2.pCteUse;
@@ -138708,9 +146556,9 @@ SQLITE_PRIVATE int sqlite3Select(
pHaving = p->pHaving;
sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0;
-#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x400 ){
- SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n"));
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x8000 ){
+ TREETRACE(0x8000,pParse,p,("After all FROM-clause analysis:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
@@ -138743,10 +146591,11 @@ SQLITE_PRIVATE int sqlite3Select(
** the sDistinct.isTnct is still set. Hence, isTnct represents the
** original setting of the SF_Distinct flag, not the current setting */
assert( sDistinct.isTnct );
+ sDistinct.isTnct = 2;
-#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x400 ){
- SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n"));
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x20000 ){
+ TREETRACE(0x20000,pParse,p,("Transform DISTINCT into GROUP BY:\n"));
sqlite3TreeViewSelect(0, p, 0);
}
#endif
@@ -138778,6 +146627,18 @@ SQLITE_PRIVATE int sqlite3Select(
*/
if( pDest->eDest==SRT_EphemTab ){
sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr);
+ if( p->selFlags & SF_NestedFrom ){
+ /* Delete or NULL-out result columns that will never be used */
+ int ii;
+ for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].fg.bUsed==0; ii--){
+ sqlite3ExprDelete(db, pEList->a[ii].pExpr);
+ sqlite3DbFree(db, pEList->a[ii].zEName);
+ pEList->nExpr--;
+ }
+ for(ii=0; ii<pEList->nExpr; ii++){
+ if( pEList->a[ii].fg.bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL;
+ }
+ }
}
/* Set the limiter.
@@ -138786,7 +146647,7 @@ SQLITE_PRIVATE int sqlite3Select(
if( (p->selFlags & SF_FixedLimit)==0 ){
p->nSelectRow = 320; /* 4 billion rows */
}
- computeLimitRegisters(pParse, p, iEnd);
+ if( p->pLimit ) computeLimitRegisters(pParse, p, iEnd);
if( p->iLimit==0 && sSort.addrSortIndex>=0 ){
sqlite3VdbeChangeOpcode(v, sSort.addrSortIndex, OP_SorterOpen);
sSort.sortFlags |= SORTFLAG_UseSorter;
@@ -138820,9 +146681,9 @@ SQLITE_PRIVATE int sqlite3Select(
/* Begin the database scan. */
- SELECTTRACE(1,pParse,p,("WhereBegin\n"));
+ TREETRACE(0x2,pParse,p,("WhereBegin\n"));
pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy,
- p->pEList, wctrlFlags, p->nSelectRow);
+ p->pEList, p, wctrlFlags, p->nSelectRow);
if( pWInfo==0 ) goto select_end;
if( sqlite3WhereOutputRowCount(pWInfo) < p->nSelectRow ){
p->nSelectRow = sqlite3WhereOutputRowCount(pWInfo);
@@ -138837,7 +146698,7 @@ SQLITE_PRIVATE int sqlite3Select(
sSort.pOrderBy = 0;
}
}
- SELECTTRACE(1,pParse,p,("WhereBegin returns\n"));
+ TREETRACE(0x2,pParse,p,("WhereBegin returns\n"));
/* If sorting index that was created by a prior OP_OpenEphemeral
** instruction ended up not being needed, then change the OP_OpenEphemeral
@@ -138876,7 +146737,7 @@ SQLITE_PRIVATE int sqlite3Select(
/* End the database scan loop.
*/
- SELECTTRACE(1,pParse,p,("WhereEnd\n"));
+ TREETRACE(0x2,pParse,p,("WhereEnd\n"));
sqlite3WhereEnd(pWInfo);
}
}else{
@@ -138927,8 +146788,9 @@ SQLITE_PRIVATE int sqlite3Select(
** ORDER BY to maximize the chances of rows being delivered in an
** order that makes the ORDER BY redundant. */
for(ii=0; ii<pGroupBy->nExpr; ii++){
- u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC;
- pGroupBy->a[ii].sortFlags = sortFlags;
+ u8 sortFlags;
+ sortFlags = sSort.pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_DESC;
+ pGroupBy->a[ii].fg.sortFlags = sortFlags;
}
if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){
orderByGrp = 1;
@@ -138956,12 +146818,14 @@ SQLITE_PRIVATE int sqlite3Select(
goto select_end;
}
pAggInfo->selId = p->selId;
+#ifdef SQLITE_DEBUG
+ pAggInfo->pSelect = p;
+#endif
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
sNC.pSrcList = pTabList;
sNC.uNC.pAggInfo = pAggInfo;
VVA_ONLY( sNC.ncFlags = NC_UAggInfo; )
- pAggInfo->mnReg = pParse->nMem+1;
pAggInfo->nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0;
pAggInfo->pGroupBy = pGroupBy;
sqlite3ExprAnalyzeAggList(&sNC, pEList);
@@ -138982,40 +146846,17 @@ SQLITE_PRIVATE int sqlite3Select(
}else{
minMaxFlag = WHERE_ORDERBY_NORMAL;
}
- for(i=0; i<pAggInfo->nFunc; i++){
- Expr *pExpr = pAggInfo->aFunc[i].pFExpr;
- assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
- sNC.ncFlags |= NC_InAggFunc;
- sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList);
-#ifndef SQLITE_OMIT_WINDOWFUNC
- assert( !IsWindowFunc(pExpr) );
- if( ExprHasProperty(pExpr, EP_WinFunc) ){
- sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pWin->pFilter);
- }
-#endif
- sNC.ncFlags &= ~NC_InAggFunc;
- }
- pAggInfo->mxReg = pParse->nMem;
+ analyzeAggFuncArgs(pAggInfo, &sNC);
if( db->mallocFailed ) goto select_end;
-#if SELECTTRACE_ENABLED
- if( sqlite3SelectTrace & 0x400 ){
- int ii;
- SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo));
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x20 ){
+ TREETRACE(0x20,pParse,p,("After aggregate analysis %p:\n", pAggInfo));
sqlite3TreeViewSelect(0, p, 0);
if( minMaxFlag ){
sqlite3DebugPrintf("MIN/MAX Optimization (0x%02x) adds:\n", minMaxFlag);
sqlite3TreeViewExprList(0, pMinMaxOrderBy, 0, "ORDERBY");
}
- for(ii=0; ii<pAggInfo->nColumn; ii++){
- sqlite3DebugPrintf("agg-column[%d] iMem=%d\n",
- ii, pAggInfo->aCol[ii].iMem);
- sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pCExpr, 0);
- }
- for(ii=0; ii<pAggInfo->nFunc; ii++){
- sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n",
- ii, pAggInfo->aFunc[ii].iMem);
- sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pFExpr, 0);
- }
+ printAggInfo(pAggInfo);
}
#endif
@@ -139039,7 +146880,9 @@ SQLITE_PRIVATE int sqlite3Select(
if( pAggInfo->nFunc==1
&& pAggInfo->aFunc[0].iDistinct>=0
- && pAggInfo->aFunc[0].pFExpr->x.pList
+ && ALWAYS(pAggInfo->aFunc[0].pFExpr!=0)
+ && ALWAYS(ExprUseXList(pAggInfo->aFunc[0].pFExpr))
+ && pAggInfo->aFunc[0].pFExpr->x.pList!=0
){
Expr *pExpr = pAggInfo->aFunc[0].pFExpr->x.pList->a[0].pExpr;
pExpr = sqlite3ExprDup(db, pExpr, 0);
@@ -139082,16 +146925,21 @@ SQLITE_PRIVATE int sqlite3Select(
** in the right order to begin with.
*/
sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);
- SELECTTRACE(1,pParse,p,("WhereBegin\n"));
+ TREETRACE(0x2,pParse,p,("WhereBegin\n"));
pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, pDistinct,
- WHERE_GROUPBY | (orderByGrp ? WHERE_SORTBYGROUP : 0) | distFlag, 0
+ p, (sDistinct.isTnct==2 ? WHERE_DISTINCTBY : WHERE_GROUPBY)
+ | (orderByGrp ? WHERE_SORTBYGROUP : 0) | distFlag, 0
);
if( pWInfo==0 ){
sqlite3ExprListDelete(db, pDistinct);
goto select_end;
}
+ if( pParse->pIdxEpr ){
+ optimizeAggregateUseOfIndexedExpr(pParse, p, pAggInfo, &sNC);
+ }
+ assignAggregateRegisters(pParse, pAggInfo);
eDist = sqlite3WhereIsDistinct(pWInfo);
- SELECTTRACE(1,pParse,p,("WhereBegin returns\n"));
+ TREETRACE(0x2,pParse,p,("WhereBegin returns\n"));
if( sqlite3WhereIsOrdered(pWInfo)==pGroupBy->nExpr ){
/* The optimizer is able to deliver rows in group by order so
** we do not have to sort. The OP_OpenEphemeral table will be
@@ -139126,21 +146974,21 @@ SQLITE_PRIVATE int sqlite3Select(
regBase = sqlite3GetTempRange(pParse, nCol);
sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0);
j = nGroupBy;
+ pAggInfo->directMode = 1;
for(i=0; i<pAggInfo->nColumn; i++){
struct AggInfo_col *pCol = &pAggInfo->aCol[i];
if( pCol->iSorterColumn>=j ){
- int r1 = j + regBase;
- sqlite3ExprCodeGetColumnOfTable(v,
- pCol->pTab, pCol->iTable, pCol->iColumn, r1);
+ sqlite3ExprCode(pParse, pCol->pCExpr, j + regBase);
j++;
}
}
+ pAggInfo->directMode = 0;
regRecord = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord);
sqlite3VdbeAddOp2(v, OP_SorterInsert, pAggInfo->sortingIdx, regRecord);
sqlite3ReleaseTempReg(pParse, regRecord);
sqlite3ReleaseTempRange(pParse, regBase, nCol);
- SELECTTRACE(1,pParse,p,("WhereEnd\n"));
+ TREETRACE(0x2,pParse,p,("WhereEnd\n"));
sqlite3WhereEnd(pWInfo);
pAggInfo->sortingIdxPTab = sortPTab = pParse->nTab++;
sortOut = sqlite3GetTempReg(pParse);
@@ -139150,6 +146998,23 @@ SQLITE_PRIVATE int sqlite3Select(
pAggInfo->useSortingIdx = 1;
}
+ /* If there are entries in pAgggInfo->aFunc[] that contain subexpressions
+ ** that are indexed (and that were previously identified and tagged
+ ** in optimizeAggregateUseOfIndexedExpr()) then those subexpressions
+ ** must now be converted into a TK_AGG_COLUMN node so that the value
+ ** is correctly pulled from the index rather than being recomputed. */
+ if( pParse->pIdxEpr ){
+ aggregateConvertIndexedExprRefToColumn(pAggInfo);
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x20 ){
+ TREETRACE(0x20, pParse, p,
+ ("AggInfo function expressions converted to reference index\n"));
+ sqlite3TreeViewSelect(0, p, 0);
+ printAggInfo(pAggInfo);
+ }
+#endif
+ }
+
/* If the index or temporary table used by the GROUP BY sort
** will naturally deliver rows in the order required by the ORDER BY
** clause, cancel the ephemeral table open coded earlier.
@@ -139218,7 +147083,7 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx,addrTopOfLoop);
VdbeCoverage(v);
}else{
- SELECTTRACE(1,pParse,p,("WhereEnd\n"));
+ TREETRACE(0x2,pParse,p,("WhereEnd\n"));
sqlite3WhereEnd(pWInfo);
sqlite3VdbeChangeToNoop(v, addrSortingIdx);
}
@@ -139266,7 +147131,7 @@ SQLITE_PRIVATE int sqlite3Select(
VdbeComment((v, "indicate accumulator empty"));
sqlite3VdbeAddOp1(v, OP_Return, regReset);
- if( eDist!=WHERE_DISTINCT_NOOP ){
+ if( distFlag!=0 && eDist!=WHERE_DISTINCT_NOOP ){
struct AggInfo_func *pF = &pAggInfo->aFunc[0];
fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr);
}
@@ -139328,7 +147193,8 @@ SQLITE_PRIVATE int sqlite3Select(
if( pKeyInfo ){
sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO);
}
- sqlite3VdbeAddOp2(v, OP_Count, iCsr, pAggInfo->aFunc[0].iMem);
+ assignAggregateRegisters(pParse, pAggInfo);
+ sqlite3VdbeAddOp2(v, OP_Count, iCsr, AggInfoFuncReg(pAggInfo,0));
sqlite3VdbeAddOp1(v, OP_Close, iCsr);
explainSimpleCount(pParse, pTab, pBest);
}else{
@@ -139360,9 +147226,11 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc);
}
}else if( pAggInfo->nFunc==1 && pAggInfo->aFunc[0].iDistinct>=0 ){
+ assert( ExprUseXList(pAggInfo->aFunc[0].pFExpr) );
pDistinct = pAggInfo->aFunc[0].pFExpr->x.pList;
distFlag = pDistinct ? (WHERE_WANT_DISTINCT|WHERE_AGG_DISTINCT) : 0;
}
+ assignAggregateRegisters(pParse, pAggInfo);
/* This case runs if the aggregate has no GROUP BY clause. The
** processing is much simpler since there is only a single row
@@ -139379,25 +147247,27 @@ SQLITE_PRIVATE int sqlite3Select(
assert( minMaxFlag==WHERE_ORDERBY_NORMAL || pMinMaxOrderBy!=0 );
assert( pMinMaxOrderBy==0 || pMinMaxOrderBy->nExpr==1 );
- SELECTTRACE(1,pParse,p,("WhereBegin\n"));
+ TREETRACE(0x2,pParse,p,("WhereBegin\n"));
pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMaxOrderBy,
- pDistinct, minMaxFlag|distFlag, 0);
+ pDistinct, p, minMaxFlag|distFlag, 0);
if( pWInfo==0 ){
goto select_end;
}
- SELECTTRACE(1,pParse,p,("WhereBegin returns\n"));
+ TREETRACE(0x2,pParse,p,("WhereBegin returns\n"));
eDist = sqlite3WhereIsDistinct(pWInfo);
updateAccumulator(pParse, regAcc, pAggInfo, eDist);
if( eDist!=WHERE_DISTINCT_NOOP ){
- struct AggInfo_func *pF = &pAggInfo->aFunc[0];
- fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr);
+ struct AggInfo_func *pF = pAggInfo->aFunc;
+ if( pF ){
+ fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr);
+ }
}
if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc);
if( minMaxFlag ){
sqlite3WhereMinMaxOptEarlyOut(v, pWInfo);
}
- SELECTTRACE(1,pParse,p,("WhereEnd\n"));
+ TREETRACE(0x2,pParse,p,("WhereEnd\n"));
sqlite3WhereEnd(pWInfo);
finalizeAggFunctions(pParse, pAggInfo);
}
@@ -139419,8 +147289,6 @@ SQLITE_PRIVATE int sqlite3Select(
** and send them to the callback one by one.
*/
if( sSort.pOrderBy ){
- explainTempTable(pParse,
- sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY");
assert( p->pEList==pEList );
generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest);
}
@@ -139438,13 +147306,13 @@ SQLITE_PRIVATE int sqlite3Select(
*/
select_end:
assert( db->mallocFailed==0 || db->mallocFailed==1 );
- pParse->nErr += db->mallocFailed;
+ assert( db->mallocFailed==0 || pParse->nErr!=0 );
sqlite3ExprListDelete(db, pMinMaxOrderBy);
#ifdef SQLITE_DEBUG
if( pAggInfo && !db->mallocFailed ){
for(i=0; i<pAggInfo->nColumn; i++){
Expr *pExpr = pAggInfo->aCol[i].pCExpr;
- assert( pExpr!=0 );
+ if( pExpr==0 ) continue;
assert( pExpr->pAggInfo==pAggInfo );
assert( pExpr->iAgg==i );
}
@@ -139457,9 +147325,9 @@ select_end:
}
#endif
-#if SELECTTRACE_ENABLED
- SELECTTRACE(0x1,pParse,p,("end processing\n"));
- if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){
+#if TREETRACE_ENABLED
+ TREETRACE(0x1,pParse,p,("end processing\n"));
+ if( (sqlite3TreeTrace & 0x40000)!=0 && ExplainQueryPlanParent(pParse)==0 ){
sqlite3TreeViewSelect(0, p, 0);
}
#endif
@@ -139724,9 +147592,7 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
Trigger *pList; /* List of triggers to return */
HashElem *p; /* Loop variable for TEMP triggers */
- if( pParse->disableTriggers ){
- return 0;
- }
+ assert( pParse->disableTriggers==0 );
pTmpSchema = pParse->db->aDb[1].pSchema;
p = sqliteHashFirst(&pTmpSchema->trigHash);
pList = pTab->pTrigger;
@@ -139735,15 +147601,14 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
if( pTrig->pTabSchema==pTab->pSchema
&& pTrig->table
&& 0==sqlite3StrICmp(pTrig->table, pTab->zName)
- && pTrig->pTabSchema!=pTmpSchema
+ && (pTrig->pTabSchema!=pTmpSchema || pTrig->bReturning)
){
pTrig->pNext = pList;
pList = pTrig;
- }else if( pTrig->op==TK_RETURNING
+ }else if( pTrig->op==TK_RETURNING ){
#ifndef SQLITE_OMIT_VIRTUALTABLE
- && pParse->db->pVtabCtx==0
+ assert( pParse->db->pVtabCtx==0 );
#endif
- ){
assert( pParse->bReturning );
assert( &(pParse->u1.pReturning->retTrig) == pTrig );
pTrig->table = pTab->zName;
@@ -139877,6 +147742,7 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
}else{
assert( !db->init.busy );
sqlite3CodeVerifySchema(pParse, iDb);
+ VVA_ONLY( pParse->ifNotExists = 1; )
}
goto trigger_cleanup;
}
@@ -139891,12 +147757,12 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
/* INSTEAD of triggers are only for views and views only support INSTEAD
** of triggers.
*/
- if( pTab->pSelect && tr_tm!=TK_INSTEAD ){
+ if( IsView(pTab) && tr_tm!=TK_INSTEAD ){
sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S",
(tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName->a);
goto trigger_orphan_error;
}
- if( !pTab->pSelect && tr_tm==TK_INSTEAD ){
+ if( !IsView(pTab) && tr_tm==TK_INSTEAD ){
sqlite3ErrorMsg(pParse, "cannot create INSTEAD OF"
" trigger on table: %S", pTableName->a);
goto trigger_orphan_error;
@@ -140026,6 +147892,23 @@ SQLITE_PRIVATE void sqlite3FinishTrigger(
Vdbe *v;
char *z;
+ /* If this is a new CREATE TABLE statement, and if shadow tables
+ ** are read-only, and the trigger makes a change to a shadow table,
+ ** then raise an error - do not allow the trigger to be created. */
+ if( sqlite3ReadOnlyShadowTables(db) ){
+ TriggerStep *pStep;
+ for(pStep=pTrig->step_list; pStep; pStep=pStep->pNext){
+ if( pStep->zTarget!=0
+ && sqlite3ShadowTableName(db, pStep->zTarget)
+ ){
+ sqlite3ErrorMsg(pParse,
+ "trigger \"%s\" may not write to shadow table \"%s\"",
+ pTrig->zName, pStep->zTarget);
+ goto triggerfinish_cleanup;
+ }
+ }
+ }
+
/* Make an entry in the sqlite_schema table */
v = sqlite3GetVdbe(pParse);
if( v==0 ) goto triggerfinish_cleanup;
@@ -140033,7 +147916,7 @@ SQLITE_PRIVATE void sqlite3FinishTrigger(
z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n);
testcase( z==0 );
sqlite3NestedParse(pParse,
- "INSERT INTO %Q." DFLT_SCHEMA_TABLE
+ "INSERT INTO %Q." LEGACY_SCHEMA_TABLE
" VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')",
db->aDb[iDb].zDbSName, zName,
pTrig->table, z);
@@ -140118,6 +148001,7 @@ static TriggerStep *triggerStepAllocate(
sqlite3 *db = pParse->db;
TriggerStep *pTriggerStep;
+ if( pParse->nErr ) return 0;
pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1);
if( pTriggerStep ){
char *z = (char*)&pTriggerStep[1];
@@ -140188,7 +148072,7 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(
SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(
Parse *pParse, /* Parser */
Token *pTableName, /* Name of the table to be updated */
- SrcList *pFrom,
+ SrcList *pFrom, /* FROM clause for an UPDATE-FROM, or NULL */
ExprList *pEList, /* The SET clause: list of column and new values */
Expr *pWhere, /* The WHERE clause */
u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
@@ -140347,7 +148231,7 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){
*/
if( (v = sqlite3GetVdbe(pParse))!=0 ){
sqlite3NestedParse(pParse,
- "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'",
+ "DELETE FROM %Q." LEGACY_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'",
db->aDb[iDb].zDbSName, pTrigger->zName
);
sqlite3ChangeCookie(pParse, iDb);
@@ -140402,12 +148286,21 @@ static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){
}
/*
+** Return true if any TEMP triggers exist
+*/
+static int tempTriggersExist(sqlite3 *db){
+ if( NEVER(db->aDb[1].pSchema==0) ) return 0;
+ if( sqliteHashFirst(&db->aDb[1].pSchema->trigHash)==0 ) return 0;
+ return 1;
+}
+
+/*
** Return a list of all triggers on table pTab if there exists at least
** one trigger that must be fired when an operation of type 'op' is
** performed on the table, and, if that operation is an UPDATE, if at
** least one of the columns in pChanges is being modified.
*/
-SQLITE_PRIVATE Trigger *sqlite3TriggersExist(
+static SQLITE_NOINLINE Trigger *triggersReallyExist(
Parse *pParse, /* Parse context */
Table *pTab, /* The table the contains the triggers */
int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */
@@ -140470,6 +148363,22 @@ exit_triggers_exist:
}
return (mask ? pList : 0);
}
+SQLITE_PRIVATE Trigger *sqlite3TriggersExist(
+ Parse *pParse, /* Parse context */
+ Table *pTab, /* The table the contains the triggers */
+ int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */
+ ExprList *pChanges, /* Columns that change in an UPDATE statement */
+ int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
+){
+ assert( pTab!=0 );
+ if( (pTab->pTrigger==0 && !tempTriggersExist(pParse->db))
+ || pParse->disableTriggers
+ ){
+ if( pMask ) *pMask = 0;
+ return 0;
+ }
+ return triggersReallyExist(pParse,pTab,op,pChanges,pMask);
+}
/*
** Convert the pStep->zTarget string into a SrcList and return a pointer
@@ -140499,6 +148408,14 @@ SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc(
}
if( pStep->pFrom ){
SrcList *pDup = sqlite3SrcListDup(db, pStep->pFrom, 0);
+ if( pDup && pDup->nSrc>1 && !IN_RENAME_OBJECT ){
+ Select *pSubquery;
+ Token as;
+ pSubquery = sqlite3SelectNew(pParse,0,pDup,0,0,0,0,SF_NestedFrom,0);
+ as.n = 0;
+ as.z = 0;
+ pDup = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0);
+ }
pSrc = sqlite3SrcListAppendList(pParse, pSrc, pDup);
}
}else{
@@ -140549,12 +148466,12 @@ static ExprList *sqlite3ExpandReturning(
for(jj=0; jj<pTab->nCol; jj++){
Expr *pNewExpr;
if( IsHiddenColumn(pTab->aCol+jj) ) continue;
- pNewExpr = sqlite3Expr(db, TK_ID, pTab->aCol[jj].zName);
+ pNewExpr = sqlite3Expr(db, TK_ID, pTab->aCol[jj].zCnName);
pNew = sqlite3ExprListAppend(pParse, pNew, pNewExpr);
if( !db->mallocFailed ){
struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1];
- pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zName);
- pItem->eEName = ENAME_NAME;
+ pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName);
+ pItem->fg.eEName = ENAME_NAME;
}
}
}else{
@@ -140563,7 +148480,7 @@ static ExprList *sqlite3ExpandReturning(
if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){
struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1];
pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName);
- pItem->eEName = pList->a[i].eEName;
+ pItem->fg.eEName = pList->a[i].fg.eEName;
}
}
}
@@ -140590,6 +148507,7 @@ static void codeReturningTrigger(
assert( v!=0 );
assert( pParse->bReturning );
+ assert( db->pParse==pParse );
pReturning = pParse->u1.pReturning;
assert( pTrigger == &(pReturning->retTrig) );
memset(&sSelect, 0, sizeof(sSelect));
@@ -140598,13 +148516,15 @@ static void codeReturningTrigger(
sSelect.pSrc = &sFrom;
sFrom.nSrc = 1;
sFrom.a[0].pTab = pTab;
+ sFrom.a[0].iCursor = -1;
sqlite3SelectPrep(pParse, &sSelect, 0);
- if( db->mallocFailed==0 && pParse->nErr==0 ){
+ if( pParse->nErr==0 ){
+ assert( db->mallocFailed==0 );
sqlite3GenerateColumnNames(pParse, &sSelect);
}
sqlite3ExprListDelete(db, sSelect.pEList);
pNew = sqlite3ExpandReturning(pParse, pReturning->pReturnEL, pTab);
- if( pNew ){
+ if( pParse->nErr==0 ){
NameContext sNC;
memset(&sNC, 0, sizeof(sNC));
if( pReturning->nRetCol==0 ){
@@ -140616,7 +148536,9 @@ static void codeReturningTrigger(
sNC.ncFlags = NC_UBaseReg;
pParse->eTriggerOp = pTrigger->op;
pParse->pTriggerTab = pTab;
- if( sqlite3ResolveExprListNames(&sNC, pNew)==SQLITE_OK ){
+ if( sqlite3ResolveExprListNames(&sNC, pNew)==SQLITE_OK
+ && ALWAYS(!db->mallocFailed)
+ ){
int i;
int nCol = pNew->nExpr;
int reg = pParse->nMem+1;
@@ -140624,16 +148546,20 @@ static void codeReturningTrigger(
pReturning->iRetReg = reg;
for(i=0; i<nCol; i++){
Expr *pCol = pNew->a[i].pExpr;
+ assert( pCol!=0 ); /* Due to !db->mallocFailed ~9 lines above */
sqlite3ExprCodeFactorable(pParse, pCol, reg+i);
+ if( sqlite3ExprAffinity(pCol)==SQLITE_AFF_REAL ){
+ sqlite3VdbeAddOp1(v, OP_RealAffinity, reg+i);
+ }
}
sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, i, reg+i);
sqlite3VdbeAddOp2(v, OP_NewRowid, pReturning->iRetCur, reg+i+1);
sqlite3VdbeAddOp3(v, OP_Insert, pReturning->iRetCur, reg+i, reg+i+1);
}
- sqlite3ExprListDelete(db, pNew);
- pParse->eTriggerOp = 0;
- pParse->pTriggerTab = 0;
}
+ sqlite3ExprListDelete(db, pNew);
+ pParse->eTriggerOp = 0;
+ pParse->pTriggerTab = 0;
}
@@ -140775,8 +148701,8 @@ static TriggerPrg *codeRowTrigger(
Vdbe *v; /* Temporary VM */
NameContext sNC; /* Name context for sub-vdbe */
SubProgram *pProgram = 0; /* Sub-vdbe for trigger program */
- Parse *pSubParse; /* Parse context for sub-vdbe */
int iEndTrigger = 0; /* Label to jump to if WHEN is false */
+ Parse sSubParse; /* Parse context for sub-vdbe */
assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
assert( pTop->pVdbe );
@@ -140798,19 +148724,17 @@ static TriggerPrg *codeRowTrigger(
/* Allocate and populate a new Parse context to use for coding the
** trigger sub-program. */
- pSubParse = sqlite3StackAllocZero(db, sizeof(Parse));
- if( !pSubParse ) return 0;
+ sqlite3ParseObjectInit(&sSubParse, db);
memset(&sNC, 0, sizeof(sNC));
- sNC.pParse = pSubParse;
- pSubParse->db = db;
- pSubParse->pTriggerTab = pTab;
- pSubParse->pToplevel = pTop;
- pSubParse->zAuthContext = pTrigger->zName;
- pSubParse->eTriggerOp = pTrigger->op;
- pSubParse->nQueryLoop = pParse->nQueryLoop;
- pSubParse->disableVtab = pParse->disableVtab;
-
- v = sqlite3GetVdbe(pSubParse);
+ sNC.pParse = &sSubParse;
+ sSubParse.pTriggerTab = pTab;
+ sSubParse.pToplevel = pTop;
+ sSubParse.zAuthContext = pTrigger->zName;
+ sSubParse.eTriggerOp = pTrigger->op;
+ sSubParse.nQueryLoop = pParse->nQueryLoop;
+ sSubParse.prepFlags = pParse->prepFlags;
+
+ v = sqlite3GetVdbe(&sSubParse);
if( v ){
VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)",
pTrigger->zName, onErrorText(orconf),
@@ -140836,14 +148760,14 @@ static TriggerPrg *codeRowTrigger(
if( db->mallocFailed==0
&& SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen)
){
- iEndTrigger = sqlite3VdbeMakeLabel(pSubParse);
- sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);
+ iEndTrigger = sqlite3VdbeMakeLabel(&sSubParse);
+ sqlite3ExprIfFalse(&sSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);
}
sqlite3ExprDelete(db, pWhen);
}
/* Code the trigger program into the sub-vdbe. */
- codeTriggerProgram(pSubParse, pTrigger->step_list, orconf);
+ codeTriggerProgram(&sSubParse, pTrigger->step_list, orconf);
/* Insert an OP_Halt at the end of the sub-program. */
if( iEndTrigger ){
@@ -140851,23 +148775,24 @@ static TriggerPrg *codeRowTrigger(
}
sqlite3VdbeAddOp0(v, OP_Halt);
VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf)));
+ transferParseError(pParse, &sSubParse);
- transferParseError(pParse, pSubParse);
- if( db->mallocFailed==0 && pParse->nErr==0 ){
+ if( pParse->nErr==0 ){
+ assert( db->mallocFailed==0 );
pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg);
}
- pProgram->nMem = pSubParse->nMem;
- pProgram->nCsr = pSubParse->nTab;
+ pProgram->nMem = sSubParse.nMem;
+ pProgram->nCsr = sSubParse.nTab;
pProgram->token = (void *)pTrigger;
- pPrg->aColmask[0] = pSubParse->oldmask;
- pPrg->aColmask[1] = pSubParse->newmask;
+ pPrg->aColmask[0] = sSubParse.oldmask;
+ pPrg->aColmask[1] = sSubParse.newmask;
sqlite3VdbeDelete(v);
+ }else{
+ transferParseError(pParse, &sSubParse);
}
- assert( !pSubParse->pTriggerPrg && !pSubParse->nMaxArg );
- sqlite3ParserReset(pSubParse);
- sqlite3StackFree(db, pSubParse);
-
+ assert( !sSubParse.pTriggerPrg && !sSubParse.nMaxArg );
+ sqlite3ParseObjectReset(&sSubParse);
return pPrg;
}
@@ -140900,6 +148825,7 @@ static TriggerPrg *getRowTrigger(
/* If an existing TriggerPrg could not be located, create a new one. */
if( !pPrg ){
pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf);
+ pParse->db->errByteOffset = -1;
}
return pPrg;
@@ -140922,7 +148848,7 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(
Vdbe *v = sqlite3GetVdbe(pParse); /* Main VM */
TriggerPrg *pPrg;
pPrg = getRowTrigger(pParse, p, pTab, orconf);
- assert( pPrg || pParse->nErr || pParse->db->mallocFailed );
+ assert( pPrg || pParse->nErr );
/* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program
** is a pointer to the sub-vdbe containing the trigger program. */
@@ -141067,6 +148993,9 @@ SQLITE_PRIVATE u32 sqlite3TriggerColmask(
Trigger *p;
assert( isNew==1 || isNew==0 );
+ if( IsView(pTab) ){
+ return 0xffffffff;
+ }
for(p=pTrigger; p; p=p->pNext){
if( p->op==op
&& (tr_tm&p->tr_tm)
@@ -141152,21 +149081,25 @@ static void updateVirtualTable(
** it has been converted into REAL.
*/
SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
+ Column *pCol;
assert( pTab!=0 );
- if( !pTab->pSelect ){
+ assert( pTab->nCol>i );
+ pCol = &pTab->aCol[i];
+ if( pCol->iDflt ){
sqlite3_value *pValue = 0;
u8 enc = ENC(sqlite3VdbeDb(v));
- Column *pCol = &pTab->aCol[i];
- VdbeComment((v, "%s.%s", pTab->zName, pCol->zName));
+ assert( !IsView(pTab) );
+ VdbeComment((v, "%s.%s", pTab->zName, pCol->zCnName));
assert( i<pTab->nCol );
- sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc,
+ sqlite3ValueFromExpr(sqlite3VdbeDb(v),
+ sqlite3ColumnExpr(pTab,pCol), enc,
pCol->affinity, &pValue);
if( pValue ){
sqlite3VdbeAppendP4(v, pValue, P4_MEM);
}
}
#ifndef SQLITE_OMIT_FLOATING_POINT
- if( pTab->aCol[i].affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){
+ if( pCol->affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){
sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
}
#endif
@@ -141329,7 +149262,7 @@ static void updateFromSelect(
pList = sqlite3ExprListAppend(pParse, pList, pNew);
}
eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom;
- }else if( pTab->pSelect ){
+ }else if( IsView(pTab) ){
for(i=0; i<pTab->nCol; i++){
pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i));
}
@@ -141352,8 +149285,10 @@ static void updateFromSelect(
}
}
pSelect = sqlite3SelectNew(pParse, pList,
- pSrc, pWhere2, pGrp, 0, pOrderBy2, SF_UpdateFrom|SF_IncludeHidden, pLimit2
+ pSrc, pWhere2, pGrp, 0, pOrderBy2,
+ SF_UFSrcCheck|SF_IncludeHidden|SF_UpdateFrom, pLimit2
);
+ if( pSelect ) pSelect->selFlags |= SF_OrderByReqd;
sqlite3SelectDestInit(&dest, eDest, iEph);
dest.iSDParm2 = (pPk ? pPk->nKeyCol : -1);
sqlite3Select(pParse, pSelect, &dest);
@@ -141438,9 +149373,11 @@ SQLITE_PRIVATE void sqlite3Update(
memset(&sContext, 0, sizeof(sContext));
db = pParse->db;
- if( pParse->nErr || db->mallocFailed ){
+ assert( db->pParse==pParse );
+ if( pParse->nErr ){
goto update_cleanup;
}
+ assert( db->mallocFailed==0 );
/* Locate the table which we want to update.
*/
@@ -141453,7 +149390,7 @@ SQLITE_PRIVATE void sqlite3Update(
*/
#ifndef SQLITE_OMIT_TRIGGER
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask);
- isView = pTab->pSelect!=0;
+ isView = IsView(pTab);
assert( pTrigger || tmask==0 );
#else
# define pTrigger 0
@@ -141465,6 +149402,14 @@ SQLITE_PRIVATE void sqlite3Update(
# define isView 0
#endif
+#if TREETRACE_ENABLED
+ if( sqlite3TreeTrace & 0x10000 ){
+ sqlite3TreeViewLine(0, "In sqlite3Update() at %s:%d", __FILE__, __LINE__);
+ sqlite3TreeViewUpdate(pParse->pWith, pTabList, pChanges, pWhere,
+ onError, pOrderBy, pLimit, pUpsert, pTrigger);
+ }
+#endif
+
/* If there was a FROM clause, set nChangeFrom to the number of expressions
** in the change-list. Otherwise, set it to 0. There cannot be a FROM
** clause if this function is being called to generate code for part of
@@ -141485,7 +149430,7 @@ SQLITE_PRIVATE void sqlite3Update(
if( sqlite3ViewGetColumnNames(pParse, pTab) ){
goto update_cleanup;
}
- if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
+ if( sqlite3IsReadOnly(pParse, pTab, pTrigger) ){
goto update_cleanup;
}
@@ -141542,13 +149487,16 @@ SQLITE_PRIVATE void sqlite3Update(
*/
chngRowid = chngPk = 0;
for(i=0; i<pChanges->nExpr; i++){
+ u8 hCol = sqlite3StrIHash(pChanges->a[i].zEName);
/* If this is an UPDATE with a FROM clause, do not resolve expressions
** here. The call to sqlite3Select() below will do that. */
if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){
goto update_cleanup;
}
for(j=0; j<pTab->nCol; j++){
- if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zEName)==0 ){
+ if( pTab->aCol[j].hName==hCol
+ && sqlite3StrICmp(pTab->aCol[j].zCnName, pChanges->a[i].zEName)==0
+ ){
if( j==pTab->iPKey ){
chngRowid = 1;
pRowidExpr = pChanges->a[i].pExpr;
@@ -141562,7 +149510,7 @@ SQLITE_PRIVATE void sqlite3Update(
testcase( pTab->aCol[j].colFlags & COLFLAG_STORED );
sqlite3ErrorMsg(pParse,
"cannot UPDATE generated column \"%s\"",
- pTab->aCol[j].zName);
+ pTab->aCol[j].zCnName);
goto update_cleanup;
}
#endif
@@ -141586,7 +149534,7 @@ SQLITE_PRIVATE void sqlite3Update(
{
int rc;
rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName,
- j<0 ? "ROWID" : pTab->aCol[j].zName,
+ j<0 ? "ROWID" : pTab->aCol[j].zCnName,
db->aDb[iDb].zDbSName);
if( rc==SQLITE_DENY ){
goto update_cleanup;
@@ -141618,8 +149566,10 @@ SQLITE_PRIVATE void sqlite3Update(
for(i=0; i<pTab->nCol; i++){
if( aXRef[i]>=0 ) continue;
if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ) continue;
- if( sqlite3ExprReferencesUpdatedColumn(pTab->aCol[i].pDflt,
- aXRef, chngRowid) ){
+ if( sqlite3ExprReferencesUpdatedColumn(
+ sqlite3ColumnExpr(pTab, &pTab->aCol[i]),
+ aXRef, chngRowid)
+ ){
aXRef[i] = 99999;
bProgress = 1;
}
@@ -141799,15 +149749,25 @@ SQLITE_PRIVATE void sqlite3Update(
/* Begin the database scan.
**
** Do not consider a single-pass strategy for a multi-row update if
- ** there are any triggers or foreign keys to process, or rows may
- ** be deleted as a result of REPLACE conflict handling. Any of these
- ** things might disturb a cursor being used to scan through the table
- ** or index, causing a single-pass approach to malfunction. */
+ ** there is anything that might disrupt the cursor being used to do
+ ** the UPDATE:
+ ** (1) This is a nested UPDATE
+ ** (2) There are triggers
+ ** (3) There are FOREIGN KEY constraints
+ ** (4) There are REPLACE conflict handlers
+ ** (5) There are subqueries in the WHERE clause
+ */
flags = WHERE_ONEPASS_DESIRED;
- if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){
+ if( !pParse->nested
+ && !pTrigger
+ && !hasFK
+ && !chngKey
+ && !bReplace
+ && (sNC.ncFlags & NC_Subquery)==0
+ ){
flags |= WHERE_ONEPASS_MULTIROW;
}
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags,iIdxCur);
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0,0,0,flags,iIdxCur);
if( pWInfo==0 ) goto update_cleanup;
/* A one-pass strategy that might update more than one row may not
@@ -142104,7 +150064,7 @@ SQLITE_PRIVATE void sqlite3Update(
}else{
sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid);
}
- VdbeCoverageNeverTaken(v);
+ VdbeCoverage(v);
}
/* Do FK constraint checks. */
@@ -142207,9 +150167,7 @@ SQLITE_PRIVATE void sqlite3Update(
** that information.
*/
if( regRowCount ){
- sqlite3VdbeAddOp2(v, OP_ChngCntRow, regRowCount, 1);
- sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC);
+ sqlite3CodeChangeCount(v, regRowCount, "rows updated");
}
update_cleanup:
@@ -142331,7 +150289,9 @@ static void updateVirtualTable(
regRowid = ++pParse->nMem;
/* Start scanning the virtual table */
- pWInfo = sqlite3WhereBegin(pParse, pSrc,pWhere,0,0,WHERE_ONEPASS_DESIRED,0);
+ pWInfo = sqlite3WhereBegin(
+ pParse, pSrc, pWhere, 0, 0, 0, WHERE_ONEPASS_DESIRED, 0
+ );
if( pWInfo==0 ) return;
/* Populate the argument registers. */
@@ -142590,6 +150550,7 @@ SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(
if( pIdx->aiColumn[ii]==XN_EXPR ){
assert( pIdx->aColExpr!=0 );
assert( pIdx->aColExpr->nExpr>ii );
+ assert( pIdx->bHasExpr );
pExpr = pIdx->aColExpr->a[ii].pExpr;
if( pExpr->op!=TK_COLLATE ){
sCol[0].pLeft = pExpr;
@@ -142711,7 +150672,7 @@ SQLITE_PRIVATE void sqlite3UpsertDoUpdate(
k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]);
sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i);
VdbeComment((v, "%s.%s", pIdx->zName,
- pTab->aCol[pPk->aiColumn[i]].zName));
+ pTab->aCol[pPk->aiColumn[i]].zCnName));
}
sqlite3VdbeVerifyAbortable(v, OE_Abort);
i = sqlite3VdbeAddOp4Int(v, OP_Found, iDataCur, 0, iPk, nPk);
@@ -142893,8 +150854,8 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum(
Btree *pTemp; /* The temporary database we vacuum into */
u32 saved_mDbFlags; /* Saved value of db->mDbFlags */
u64 saved_flags; /* Saved value of db->flags */
- int saved_nChange; /* Saved value of db->nChange */
- int saved_nTotalChange; /* Saved value of db->nTotalChange */
+ i64 saved_nChange; /* Saved value of db->nChange */
+ i64 saved_nTotalChange; /* Saved value of db->nTotalChange */
u32 saved_openFlags; /* Saved value of db->openFlags */
u8 saved_mTrace; /* Saved trace settings */
Db *pDb = 0; /* Database to detach at end of vacuum */
@@ -142903,6 +150864,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum(
int nDb; /* Number of attached databases */
const char *zDbMain; /* Schema name of database to vacuum */
const char *zOut; /* Name of output file */
+ u32 pgflags = PAGER_SYNCHRONOUS_OFF; /* sync flags for output db */
if( !db->autoCommit ){
sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction");
@@ -142974,12 +150936,17 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum(
goto end_of_vacuum;
}
db->mDbFlags |= DBFLAG_VacuumInto;
+
+ /* For a VACUUM INTO, the pager-flags are set to the same values as
+ ** they are for the database being vacuumed, except that PAGER_CACHESPILL
+ ** is always set. */
+ pgflags = db->aDb[iDb].safety_level | (db->flags & PAGER_FLAGS_MASK);
}
nRes = sqlite3BtreeGetRequestedReserve(pMain);
sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size);
sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0));
- sqlite3BtreeSetPagerFlags(pTemp, PAGER_SYNCHRONOUS_OFF|PAGER_CACHESPILL);
+ sqlite3BtreeSetPagerFlags(pTemp, pgflags|PAGER_CACHESPILL);
/* Begin a transaction and take an exclusive lock on the main database
** file. This is done before the sqlite3BtreeGetPageSize(pMain) call below,
@@ -142992,7 +150959,9 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum(
/* Do not attempt to change the page size for a WAL database */
if( sqlite3PagerGetJournalMode(sqlite3BtreePager(pMain))
- ==PAGER_JOURNALMODE_WAL ){
+ ==PAGER_JOURNALMODE_WAL
+ && pOut==0
+ ){
db->nextPagesize = 0;
}
@@ -143108,6 +151077,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum(
assert( rc==SQLITE_OK );
if( pOut==0 ){
+ nRes = sqlite3BtreeGetRequestedReserve(pTemp);
rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes,1);
}
@@ -143341,7 +151311,7 @@ SQLITE_PRIVATE void sqlite3VtabLock(VTable *pVTab){
SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){
VTable *pVtab;
assert( IsVirtual(pTab) );
- for(pVtab=pTab->pVTable; pVtab && pVtab->db!=db; pVtab=pVtab->pNext);
+ for(pVtab=pTab->u.vtab.p; pVtab && pVtab->db!=db; pVtab=pVtab->pNext);
return pVtab;
}
@@ -143354,36 +151324,40 @@ SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){
assert( db );
assert( pVTab->nRef>0 );
- assert( db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_ZOMBIE );
+ assert( db->eOpenState==SQLITE_STATE_OPEN
+ || db->eOpenState==SQLITE_STATE_ZOMBIE );
pVTab->nRef--;
if( pVTab->nRef==0 ){
sqlite3_vtab *p = pVTab->pVtab;
- sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod);
if( p ){
p->pModule->xDisconnect(p);
}
+ sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod);
sqlite3DbFree(db, pVTab);
}
}
/*
** Table p is a virtual table. This function moves all elements in the
-** p->pVTable list to the sqlite3.pDisconnect lists of their associated
+** p->u.vtab.p list to the sqlite3.pDisconnect lists of their associated
** database connections to be disconnected at the next opportunity.
** Except, if argument db is not NULL, then the entry associated with
-** connection db is left in the p->pVTable list.
+** connection db is left in the p->u.vtab.p list.
*/
static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){
VTable *pRet = 0;
- VTable *pVTable = p->pVTable;
- p->pVTable = 0;
+ VTable *pVTable;
+
+ assert( IsVirtual(p) );
+ pVTable = p->u.vtab.p;
+ p->u.vtab.p = 0;
/* Assert that the mutex (if any) associated with the BtShared database
** that contains table p is held by the caller. See header comments
** above function sqlite3VtabUnlockList() for an explanation of why
** this makes it safe to access the sqlite3.pDisconnect list of any
- ** database connection that may have an entry in the p->pVTable list.
+ ** database connection that may have an entry in the p->u.vtab.p list.
*/
assert( db==0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema) );
@@ -143393,7 +151367,7 @@ static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){
assert( db2 );
if( db2==db ){
pRet = pVTable;
- p->pVTable = pRet;
+ p->u.vtab.p = pRet;
pRet->pNext = 0;
}else{
pVTable->pNext = db2->pDisconnect;
@@ -143421,7 +151395,7 @@ SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){
assert( sqlite3BtreeHoldsAllMutexes(db) );
assert( sqlite3_mutex_held(db->mutex) );
- for(ppVTab=&p->pVTable; *ppVTab; ppVTab=&(*ppVTab)->pNext){
+ for(ppVTab=&p->u.vtab.p; *ppVTab; ppVTab=&(*ppVTab)->pNext){
if( (*ppVTab)->db==db ){
VTable *pVTab = *ppVTab;
*ppVTab = pVTab->pNext;
@@ -143484,37 +151458,42 @@ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){
** database connection.
*/
SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){
- if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p);
- if( p->azModuleArg ){
+ assert( IsVirtual(p) );
+ assert( db!=0 );
+ if( db->pnBytesFreed==0 ) vtabDisconnectAll(0, p);
+ if( p->u.vtab.azArg ){
int i;
- for(i=0; i<p->nModuleArg; i++){
- if( i!=1 ) sqlite3DbFree(db, p->azModuleArg[i]);
+ for(i=0; i<p->u.vtab.nArg; i++){
+ if( i!=1 ) sqlite3DbFree(db, p->u.vtab.azArg[i]);
}
- sqlite3DbFree(db, p->azModuleArg);
+ sqlite3DbFree(db, p->u.vtab.azArg);
}
}
/*
-** Add a new module argument to pTable->azModuleArg[].
+** Add a new module argument to pTable->u.vtab.azArg[].
** The string is not copied - the pointer is stored. The
** string will be freed automatically when the table is
** deleted.
*/
static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){
- sqlite3_int64 nBytes = sizeof(char *)*(2+pTable->nModuleArg);
+ sqlite3_int64 nBytes;
char **azModuleArg;
sqlite3 *db = pParse->db;
- if( pTable->nModuleArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){
+
+ assert( IsVirtual(pTable) );
+ nBytes = sizeof(char *)*(2+pTable->u.vtab.nArg);
+ if( pTable->u.vtab.nArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){
sqlite3ErrorMsg(pParse, "too many columns on %s", pTable->zName);
}
- azModuleArg = sqlite3DbRealloc(db, pTable->azModuleArg, nBytes);
+ azModuleArg = sqlite3DbRealloc(db, pTable->u.vtab.azArg, nBytes);
if( azModuleArg==0 ){
sqlite3DbFree(db, zArg);
}else{
- int i = pTable->nModuleArg++;
+ int i = pTable->u.vtab.nArg++;
azModuleArg[i] = zArg;
azModuleArg[i+1] = 0;
- pTable->azModuleArg = azModuleArg;
+ pTable->u.vtab.azArg = azModuleArg;
}
}
@@ -143537,10 +151516,11 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse(
pTable = pParse->pNewTable;
if( pTable==0 ) return;
assert( 0==pTable->pIndex );
+ pTable->eTabType = TABTYP_VTAB;
db = pParse->db;
- assert( pTable->nModuleArg==0 );
+ assert( pTable->u.vtab.nArg==0 );
addModuleArgument(pParse, pTable, sqlite3NameFromToken(db, pModuleName));
addModuleArgument(pParse, pTable, 0);
addModuleArgument(pParse, pTable, sqlite3DbStrDup(db, pTable->zName));
@@ -143557,11 +151537,11 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse(
** sqlite_schema table, has already been made by sqlite3StartTable().
** The second call, to obtain permission to create the table, is made now.
*/
- if( pTable->azModuleArg ){
+ if( pTable->u.vtab.azArg ){
int iDb = sqlite3SchemaToIndex(db, pTable->pSchema);
assert( iDb>=0 ); /* The database the table is being created in */
sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName,
- pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName);
+ pTable->u.vtab.azArg[0], pParse->db->aDb[iDb].zDbSName);
}
#endif
}
@@ -143589,9 +151569,10 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
sqlite3 *db = pParse->db; /* The database connection */
if( pTab==0 ) return;
+ assert( IsVirtual(pTab) );
addArgumentToVtab(pParse);
pParse->sArg.z = 0;
- if( pTab->nModuleArg<1 ) return;
+ if( pTab->u.vtab.nArg<1 ) return;
/* If the CREATE VIRTUAL TABLE statement is being entered for the
** first time (in other words if the virtual table is actually being
@@ -143624,7 +151605,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
*/
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
sqlite3NestedParse(pParse,
- "UPDATE %Q." DFLT_SCHEMA_TABLE " "
+ "UPDATE %Q." LEGACY_SCHEMA_TABLE " "
"SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q "
"WHERE rowid=#%d",
db->aDb[iDb].zDbSName,
@@ -143644,18 +151625,14 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
iReg = ++pParse->nMem;
sqlite3VdbeLoadString(v, iReg, pTab->zName);
sqlite3VdbeAddOp2(v, OP_VCreate, iDb, iReg);
- }
-
- /* If we are rereading the sqlite_schema table create the in-memory
- ** record of the table. The xConnect() method is not called until
- ** the first time the virtual table is used in an SQL statement. This
- ** allows a schema that contains virtual tables to be loaded before
- ** the required virtual table implementations are registered. */
- else {
+ }else{
+ /* If we are rereading the sqlite_schema table create the in-memory
+ ** record of the table. */
Table *pOld;
Schema *pSchema = pTab->pSchema;
const char *zName = pTab->zName;
- assert( sqlite3SchemaMutexHeld(db, 0, pSchema) );
+ assert( zName!=0 );
+ sqlite3MarkAllShadowTablesOf(db, pTab);
pOld = sqlite3HashInsert(&pSchema->tblHash, zName, pTab);
if( pOld ){
sqlite3OomFault(db);
@@ -143706,13 +151683,16 @@ static int vtabCallConstructor(
VtabCtx sCtx;
VTable *pVTable;
int rc;
- const char *const*azArg = (const char *const*)pTab->azModuleArg;
- int nArg = pTab->nModuleArg;
+ const char *const*azArg;
+ int nArg = pTab->u.vtab.nArg;
char *zErr = 0;
char *zModuleName;
int iDb;
VtabCtx *pCtx;
+ assert( IsVirtual(pTab) );
+ azArg = (const char *const*)pTab->u.vtab.azArg;
+
/* Check that the virtual-table is not already being initialized */
for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){
if( pCtx->pTab==pTab ){
@@ -143739,7 +151719,7 @@ static int vtabCallConstructor(
pVTable->eVtabRisk = SQLITE_VTABRISK_Normal;
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
- pTab->azModuleArg[1] = db->aDb[iDb].zDbSName;
+ pTab->u.vtab.azArg[1] = db->aDb[iDb].zDbSName;
/* Invoke the virtual table constructor */
assert( &db->pVtabCtx );
@@ -143749,7 +151729,9 @@ static int vtabCallConstructor(
sCtx.pPrior = db->pVtabCtx;
sCtx.bDeclared = 0;
db->pVtabCtx = &sCtx;
+ pTab->nTabRef++;
rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr);
+ sqlite3DeleteTable(db, pTab);
db->pVtabCtx = sCtx.pPrior;
if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);
assert( sCtx.pTab==pTab );
@@ -143778,12 +151760,12 @@ static int vtabCallConstructor(
int iCol;
u16 oooHidden = 0;
/* If everything went according to plan, link the new VTable structure
- ** into the linked list headed by pTab->pVTable. Then loop through the
+ ** into the linked list headed by pTab->u.vtab.p. Then loop through the
** columns of the table to see if any of them contain the token "hidden".
** If so, set the Column COLFLAG_HIDDEN flag and remove the token from
** the type string. */
- pVTable->pNext = pTab->pVTable;
- pTab->pVTable = pVTable;
+ pVTable->pNext = pTab->u.vtab.p;
+ pTab->u.vtab.p = pVTable;
for(iCol=0; iCol<pTab->nCol; iCol++){
char *zType = sqlite3ColumnType(&pTab->aCol[iCol], "");
@@ -143836,16 +151818,17 @@ SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){
int rc;
assert( pTab );
- if( !IsVirtual(pTab) || sqlite3GetVTable(db, pTab) ){
+ assert( IsVirtual(pTab) );
+ if( sqlite3GetVTable(db, pTab) ){
return SQLITE_OK;
}
/* Locate the required virtual table module */
- zMod = pTab->azModuleArg[0];
+ zMod = pTab->u.vtab.azArg[0];
pMod = (Module*)sqlite3HashFind(&db->aModule, zMod);
if( !pMod ){
- const char *zModule = pTab->azModuleArg[0];
+ const char *zModule = pTab->u.vtab.azArg[0];
sqlite3ErrorMsg(pParse, "no such module: %s", zModule);
rc = SQLITE_ERROR;
}else{
@@ -143908,10 +151891,10 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab,
const char *zMod;
pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName);
- assert( pTab && IsVirtual(pTab) && !pTab->pVTable );
+ assert( pTab && IsVirtual(pTab) && !pTab->u.vtab.p );
/* Locate the required virtual table module */
- zMod = pTab->azModuleArg[0];
+ zMod = pTab->u.vtab.azArg[0];
pMod = (Module*)sqlite3HashFind(&db->aModule, zMod);
/* If the module has been registered and includes a Create method,
@@ -143946,8 +151929,8 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
VtabCtx *pCtx;
int rc = SQLITE_OK;
Table *pTab;
- char *zErr = 0;
Parse sParse;
+ int initBusy;
#ifdef SQLITE_ENABLE_API_ARMOR
if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){
@@ -143964,20 +151947,27 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
pTab = pCtx->pTab;
assert( IsVirtual(pTab) );
- memset(&sParse, 0, sizeof(sParse));
+ sqlite3ParseObjectInit(&sParse, db);
sParse.eParseMode = PARSE_MODE_DECLARE_VTAB;
- sParse.db = db;
+ sParse.disableTriggers = 1;
+ /* We should never be able to reach this point while loading the
+ ** schema. Nevertheless, defend against that (turn off db->init.busy)
+ ** in case a bug arises. */
+ assert( db->init.busy==0 );
+ initBusy = db->init.busy;
+ db->init.busy = 0;
sParse.nQueryLoop = 1;
- if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr)
- && sParse.pNewTable
- && !db->mallocFailed
- && !sParse.pNewTable->pSelect
- && !IsVirtual(sParse.pNewTable)
+ if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable)
+ && ALWAYS(sParse.pNewTable!=0)
+ && ALWAYS(!db->mallocFailed)
+ && IsOrdinaryTable(sParse.pNewTable)
){
+ assert( sParse.zErrMsg==0 );
if( !pTab->aCol ){
Table *pNew = sParse.pNewTable;
Index *pIdx;
pTab->aCol = pNew->aCol;
+ sqlite3ExprListDelete(db, pNew->u.tab.pDfltList);
pTab->nNVCol = pTab->nCol = pNew->nCol;
pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid);
pNew->nCol = 0;
@@ -144002,8 +151992,9 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
}
pCtx->bDeclared = 1;
}else{
- sqlite3ErrorWithMsg(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr);
- sqlite3DbFree(db, zErr);
+ sqlite3ErrorWithMsg(db, SQLITE_ERROR,
+ (sParse.zErrMsg ? "%s" : 0), sParse.zErrMsg);
+ sqlite3DbFree(db, sParse.zErrMsg);
rc = SQLITE_ERROR;
}
sParse.eParseMode = PARSE_MODE_NORMAL;
@@ -144012,7 +152003,8 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
sqlite3VdbeFinalize(sParse.pVdbe);
}
sqlite3DeleteTable(db, sParse.pNewTable);
- sqlite3ParserReset(&sParse);
+ sqlite3ParseObjectReset(&sParse);
+ db->init.busy = initBusy;
assert( (rc&0xff)==rc );
rc = sqlite3ApiExit(db, rc);
@@ -144032,10 +152024,13 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab
Table *pTab;
pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName);
- if( pTab!=0 && ALWAYS(pTab->pVTable!=0) ){
+ if( ALWAYS(pTab!=0)
+ && ALWAYS(IsVirtual(pTab))
+ && ALWAYS(pTab->u.vtab.p!=0)
+ ){
VTable *p;
int (*xDestroy)(sqlite3_vtab *);
- for(p=pTab->pVTable; p; p=p->pNext){
+ for(p=pTab->u.vtab.p; p; p=p->pNext){
assert( p->pVtab );
if( p->pVtab->nRef>0 ){
return SQLITE_LOCKED;
@@ -144049,9 +152044,9 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab
rc = xDestroy(p->pVtab);
/* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */
if( rc==SQLITE_OK ){
- assert( pTab->pVTable==p && p->pNext==0 );
+ assert( pTab->u.vtab.p==p && p->pNext==0 );
p->pVtab = 0;
- pTab->pVTable = 0;
+ pTab->u.vtab.p = 0;
sqlite3VtabUnlock(p);
}
sqlite3DeleteTable(db, pTab);
@@ -144226,7 +152221,10 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){
break;
}
if( xMethod && pVTab->iSavepoint>iSavepoint ){
+ u64 savedFlags = (db->flags & SQLITE_Defensive);
+ db->flags &= ~(u64)SQLITE_Defensive;
rc = xMethod(pVTab->pVtab, iSavepoint);
+ db->flags |= savedFlags;
}
sqlite3VtabUnlock(pVTab);
}
@@ -144265,8 +152263,9 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
/* Check to see the left operand is a column in a virtual table */
if( NEVER(pExpr==0) ) return pDef;
if( pExpr->op!=TK_COLUMN ) return pDef;
+ assert( ExprUseYTab(pExpr) );
pTab = pExpr->y.pTab;
- if( pTab==0 ) return pDef;
+ if( NEVER(pTab==0) ) return pDef;
if( !IsVirtual(pTab) ) return pDef;
pVtab = sqlite3GetVTable(db, pTab)->pVtab;
assert( pVtab!=0 );
@@ -144339,8 +152338,9 @@ SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){
/*
** Check to see if virtual table module pMod can be have an eponymous
** virtual table instance. If it can, create one if one does not already
-** exist. Return non-zero if the eponymous virtual table instance exists
-** when this routine returns, and return zero if it does not exist.
+** exist. Return non-zero if either the eponymous virtual table instance
+** exists when this routine returns or if an attempt to create it failed
+** and an error message was left in pParse.
**
** An eponymous virtual table instance is one that is named after its
** module, and more importantly, does not require a CREATE VIRTUAL TABLE
@@ -144367,8 +152367,9 @@ SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){
}
pMod->pEpoTab = pTab;
pTab->nTabRef = 1;
+ pTab->eTabType = TABTYP_VTAB;
pTab->pSchema = db->aDb[0].pSchema;
- assert( pTab->nModuleArg==0 );
+ assert( pTab->u.vtab.nArg==0 );
pTab->iPKey = -1;
pTab->tabFlags |= TF_Eponymous;
addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName));
@@ -144379,7 +152380,6 @@ SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){
sqlite3ErrorMsg(pParse, "%s", zErr);
sqlite3DbFree(db, zErr);
sqlite3VtabEponymousTableClear(db, pMod);
- return 0;
}
return 1;
}
@@ -144453,6 +152453,10 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){
p->pVTable->eVtabRisk = SQLITE_VTABRISK_High;
break;
}
+ case SQLITE_VTAB_USES_ALL_SCHEMAS: {
+ p->pVTable->bAllSchemas = 1;
+ break;
+ }
default: {
rc = SQLITE_MISUSE_BKPT;
break;
@@ -144526,6 +152530,28 @@ typedef struct WhereLoopBuilder WhereLoopBuilder;
typedef struct WhereScan WhereScan;
typedef struct WhereOrCost WhereOrCost;
typedef struct WhereOrSet WhereOrSet;
+typedef struct WhereMemBlock WhereMemBlock;
+typedef struct WhereRightJoin WhereRightJoin;
+
+/*
+** This object is a header on a block of allocated memory that will be
+** automatically freed when its WInfo oject is destructed.
+*/
+struct WhereMemBlock {
+ WhereMemBlock *pNext; /* Next block in the chain */
+ u64 sz; /* Bytes of space */
+};
+
+/*
+** Extra information attached to a WhereLevel that is a RIGHT JOIN.
+*/
+struct WhereRightJoin {
+ int iMatch; /* Cursor used to determine prior matched rows */
+ int regBloom; /* Bloom filter for iRJMatch */
+ int regReturn; /* Return register for the interior subroutine */
+ int addrSubrtn; /* Starting address for the interior subroutine */
+ int endSubrtn; /* The last opcode in the interior subroutine */
+};
/*
** This object contains information needed to implement a single nested
@@ -144558,6 +152584,8 @@ struct WhereLevel {
u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */
int addrLikeRep; /* LIKE range processing address */
#endif
+ int regFilter; /* Bloom filter */
+ WhereRightJoin *pRJ; /* Extra information for RIGHT JOIN */
u8 iFrom; /* Which entry in the FROM clause */
u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */
int p1, p2; /* Operands of the opcode used to end the loop */
@@ -144572,7 +152600,7 @@ struct WhereLevel {
u8 eEndLoopOp; /* IN Loop terminator. OP_Next or OP_Prev */
} *aInLoop; /* Information about each nested IN operator */
} in; /* Used when pWLoop->wsFlags&WHERE_IN_ABLE */
- Index *pCovidx; /* Possible covering index for WHERE_MULTI_OR */
+ Index *pCoveringIdx; /* Possible covering index for WHERE_MULTI_OR */
} u;
struct WhereLoop *pWLoop; /* The selected WhereLoop object */
Bitmask notReady; /* FROM entries not usable at this level */
@@ -144616,10 +152644,12 @@ struct WhereLoop {
} btree;
struct { /* Information for virtual tables */
int idxNum; /* Index number */
- u8 needFree; /* True if sqlite3_free(idxStr) is needed */
+ u32 needFree : 1; /* True if sqlite3_free(idxStr) is needed */
+ u32 bOmitOffset : 1; /* True to let virtual table handle offset */
i8 isOrdered; /* True if satisfies ORDER BY */
u16 omitMask; /* Terms that may be omitted */
char *idxStr; /* Index identifier string */
+ u32 mHandleIn; /* Terms to handle as IN(...) instead of == */
} vtab;
} u;
u32 wsFlags; /* WHERE_* flags describing the plan */
@@ -144763,7 +152793,7 @@ struct WhereTerm {
#define TERM_COPIED 0x0008 /* Has a child */
#define TERM_ORINFO 0x0010 /* Need to free the WhereTerm.u.pOrInfo object */
#define TERM_ANDINFO 0x0020 /* Need to free the WhereTerm.u.pAndInfo obj */
-#define TERM_OR_OK 0x0040 /* Used during OR-clause processing */
+#define TERM_OK 0x0040 /* Used during OR-clause processing */
#define TERM_VNULL 0x0080 /* Manufactured x>NULL or x<=NULL term */
#define TERM_LIKEOPT 0x0100 /* Virtual terms from the LIKE optimization */
#define TERM_LIKECOND 0x0200 /* Conditionally this LIKE operator term */
@@ -144776,6 +152806,7 @@ struct WhereTerm {
#else
# define TERM_HIGHTRUTH 0 /* Only used with STAT4 */
#endif
+#define TERM_SLICE 0x8000 /* One slice of a row-value/vector comparison */
/*
** An instance of the WhereScan object is used as an iterator for locating
@@ -144786,11 +152817,11 @@ struct WhereScan {
WhereClause *pWC; /* WhereClause currently being scanned */
const char *zCollName; /* Required collating sequence, if not NULL */
Expr *pIdxExpr; /* Search for this index expression */
+ int k; /* Resume scanning at this->pWC->a[this->k] */
+ u32 opMask; /* Acceptable operators */
char idxaff; /* Must match this affinity, if zCollName!=NULL */
+ unsigned char iEquiv; /* Current slot in aiCur[] and aiColumn[] */
unsigned char nEquiv; /* Number of entries in aiCur[] and aiColumn[] */
- unsigned char iEquiv; /* Next unused slot in aiCur[] and aiColumn[] */
- u32 opMask; /* Acceptable operators */
- int k; /* Resume scanning at this->pWC->a[this->k] */
int aiCur[11]; /* Cursors in the equivalence class */
i16 aiColumn[11]; /* Corresponding column number in the eq-class */
};
@@ -144814,6 +152845,7 @@ struct WhereClause {
u8 hasOr; /* True if any a[].eOperator is WO_OR */
int nTerm; /* Number of terms */
int nSlot; /* Number of entries in a[] */
+ int nBase; /* Number of terms through the last non-Virtual */
WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */
#if defined(SQLITE_SMALL_STACK)
WhereTerm aStatic[1]; /* Initial static space for a[] */
@@ -144844,7 +152876,7 @@ struct WhereAndInfo {
** between VDBE cursor numbers and bits of the bitmasks in WhereTerm.
**
** The VDBE cursor numbers are small integers contained in
-** SrcList_item.iCursor and Expr.iTable fields. For any given WHERE
+** SrcItem.iCursor and Expr.iTable fields. For any given WHERE
** clause, the cursor numbers might not begin with 0 and they might
** contain gaps in the numbering sequence. But we want to make maximum
** use of the bits in our bitmasks. This structure provides a mapping
@@ -144872,18 +152904,12 @@ struct WhereMaskSet {
};
/*
-** Initialize a WhereMaskSet object
-*/
-#define initMaskSet(P) (P)->n=0
-
-/*
** This object is a convenience wrapper holding all information needed
** to construct WhereLoop objects for a particular query.
*/
struct WhereLoopBuilder {
WhereInfo *pWInfo; /* Information about this WHERE */
WhereClause *pWC; /* WHERE clause terms */
- ExprList *pOrderBy; /* ORDER BY clause */
WhereLoop *pNew; /* Template WhereLoop */
WhereOrSet *pOrSet; /* Record best loops here, if not NULL */
#ifdef SQLITE_ENABLE_STAT4
@@ -144922,20 +152948,6 @@ struct WhereLoopBuilder {
#endif
/*
-** Each instance of this object records a change to a single node
-** in an expression tree to cause that node to point to a column
-** of an index rather than an expression or a virtual column. All
-** such transformations need to be undone at the end of WHERE clause
-** processing.
-*/
-typedef struct WhereExprMod WhereExprMod;
-struct WhereExprMod {
- WhereExprMod *pNext; /* Next translation on a list of them all */
- Expr *pExpr; /* The Expr node that was transformed */
- Expr orig; /* Original value of the Expr node */
-};
-
-/*
** The WHERE clause processing routine has two halves. The
** first part does the start of the WHERE loop and the second
** half does the tail of the WHERE loop. An instance of
@@ -144950,7 +152962,10 @@ struct WhereInfo {
SrcList *pTabList; /* List of tables in the join */
ExprList *pOrderBy; /* The ORDER BY clause or NULL */
ExprList *pResultSet; /* Result set of the query */
+#if WHERETRACE_ENABLED
Expr *pWhere; /* The complete WHERE clause */
+#endif
+ Select *pSelect; /* The entire SELECT statement containing WHERE */
int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */
int iContinue; /* Jump here to continue with next record */
int iBreak; /* Jump here to break out of the loop */
@@ -144969,7 +152984,7 @@ struct WhereInfo {
int iTop; /* The very beginning of the WHERE loop */
int iEndWhere; /* End of the WHERE clause itself */
WhereLoop *pLoops; /* List of all WhereLoop objects */
- WhereExprMod *pExprMods; /* Expression modifications */
+ WhereMemBlock *pMemToFree;/* Memory to free when this object destroyed */
Bitmask revMask; /* Mask of ORDER BY terms that need reversing */
WhereClause sWC; /* Decomposition of the WHERE clause */
WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */
@@ -144995,6 +153010,8 @@ SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm(
u32 op, /* Mask of WO_xx values describing operator */
Index *pIdx /* Must be compatible with this index, if not NULL */
);
+SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte);
+SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByte);
/* wherecode.c: */
#ifndef SQLITE_OMIT_EXPLAIN
@@ -145004,8 +153021,14 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */
u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */
);
+SQLITE_PRIVATE int sqlite3WhereExplainBloomFilter(
+ const Parse *pParse, /* Parse context */
+ const WhereInfo *pWInfo, /* WHERE clause */
+ const WhereLevel *pLevel /* Bloom filter on this level */
+);
#else
# define sqlite3WhereExplainOneScan(u,v,w,x) 0
+# define sqlite3WhereExplainBloomFilter(u,v,w) 0
#endif /* SQLITE_OMIT_EXPLAIN */
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
SQLITE_PRIVATE void sqlite3WhereAddScanStatus(
@@ -145025,11 +153048,17 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
WhereLevel *pLevel, /* The current level pointer */
Bitmask notReady /* Which tables are currently available */
);
+SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop(
+ WhereInfo *pWInfo,
+ int iLevel,
+ WhereLevel *pLevel
+);
/* whereexpr.c: */
SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*);
SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause*);
SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause*,Expr*,u8);
+SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause*, Select*);
SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet*, Expr*);
SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet*, Expr*);
SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet*, ExprList*);
@@ -145066,8 +153095,9 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*);
#define WO_AND 0x0400 /* Two or more AND-connected terms */
#define WO_EQUIV 0x0800 /* Of the form A==B, both columns */
#define WO_NOOP 0x1000 /* This term does not restrict search space */
+#define WO_ROWVAL 0x2000 /* A row-value term */
-#define WO_ALL 0x1fff /* Mask of all possible WO_* values */
+#define WO_ALL 0x3fff /* Mask of all possible WO_* values */
#define WO_SINGLE 0x01ff /* Mask of all non-compound WO_* values */
/*
@@ -145098,6 +153128,11 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*);
#define WHERE_BIGNULL_SORT 0x00080000 /* Column nEq of index is BIGNULL */
#define WHERE_IN_SEEKSCAN 0x00100000 /* Seek-scan optimization for IN */
#define WHERE_TRANSCONS 0x00200000 /* Uses a transitive constraint */
+#define WHERE_BLOOMFILTER 0x00400000 /* Consider using a Bloom-filter */
+#define WHERE_SELFCULL 0x00800000 /* nOut reduced by extra WHERE terms */
+#define WHERE_OMIT_OFFSET 0x01000000 /* Set offset counter to zero */
+#define WHERE_VIEWSCAN 0x02000000 /* A full-scan of a VIEW or subquery */
+#define WHERE_EXPRIDX 0x04000000 /* Uses an index-on-expressions */
#endif /* !defined(SQLITE_WHEREINT_H) */
@@ -145113,7 +153148,7 @@ static const char *explainIndexColumnName(Index *pIdx, int i){
i = pIdx->aiColumn[i];
if( i==XN_EXPR ) return "<expr>";
if( i==XN_ROWID ) return "rowid";
- return pIdx->pTable->aCol[i].zName;
+ return pIdx->pTable->aCol[i].zCnName;
}
/*
@@ -145195,9 +153230,9 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){
/*
** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN
-** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was
-** defined at compile-time. If it is not a no-op, a single OP_Explain opcode
-** is added to the output to describe the table scan strategy in pLevel.
+** command, or if stmt_scanstatus_v2() stats are enabled, or if SQLITE_DEBUG
+** was defined at compile-time. If it is not a no-op, a single OP_Explain
+** opcode is added to the output to describe the table scan strategy in pLevel.
**
** If an OP_Explain opcode is added to the VM, its address is returned.
** Otherwise, if no OP_Explain is coded, zero is returned.
@@ -145209,8 +153244,8 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */
){
int ret = 0;
-#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS)
- if( sqlite3ParseToplevel(pParse)->explain==2 )
+#if !defined(SQLITE_DEBUG)
+ if( sqlite3ParseToplevel(pParse)->explain==2 || IS_STMT_SCANSTATUS(pParse->db) )
#endif
{
SrcItem *pItem = &pTabList->a[pLevel->iFrom];
@@ -145260,19 +153295,27 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
explainIndexRange(&str, pLoop);
}
}else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){
- const char *zRangeOp;
+ char cRangeOp;
+#if 0 /* Better output, but breaks many tests */
+ const Table *pTab = pItem->pTab;
+ const char *zRowid = pTab->iPKey>=0 ? pTab->aCol[pTab->iPKey].zCnName:
+ "rowid";
+#else
+ const char *zRowid = "rowid";
+#endif
+ sqlite3_str_appendf(&str, " USING INTEGER PRIMARY KEY (%s", zRowid);
if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){
- zRangeOp = "=";
+ cRangeOp = '=';
}else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){
- zRangeOp = ">? AND rowid<";
+ sqlite3_str_appendf(&str, ">? AND %s", zRowid);
+ cRangeOp = '<';
}else if( flags&WHERE_BTM_LIMIT ){
- zRangeOp = ">";
+ cRangeOp = '>';
}else{
assert( flags&WHERE_TOP_LIMIT);
- zRangeOp = "<";
+ cRangeOp = '<';
}
- sqlite3_str_appendf(&str,
- " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp);
+ sqlite3_str_appendf(&str, "%c?)", cRangeOp);
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
else if( (flags & WHERE_VIRTUALTABLE)!=0 ){
@@ -145280,6 +153323,9 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr);
}
#endif
+ if( pItem->fg.jointype & JT_LEFT ){
+ sqlite3_str_appendf(&str, " LEFT-JOIN");
+ }
#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS
if( pLoop->nOut>=10 ){
sqlite3_str_appendf(&str, " (~%llu rows)",
@@ -145295,6 +153341,58 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan(
}
return ret;
}
+
+/*
+** Add a single OP_Explain opcode that describes a Bloom filter.
+**
+** Or if not processing EXPLAIN QUERY PLAN and not in a SQLITE_DEBUG and/or
+** SQLITE_ENABLE_STMT_SCANSTATUS build, then OP_Explain opcodes are not
+** required and this routine is a no-op.
+**
+** If an OP_Explain opcode is added to the VM, its address is returned.
+** Otherwise, if no OP_Explain is coded, zero is returned.
+*/
+SQLITE_PRIVATE int sqlite3WhereExplainBloomFilter(
+ const Parse *pParse, /* Parse context */
+ const WhereInfo *pWInfo, /* WHERE clause */
+ const WhereLevel *pLevel /* Bloom filter on this level */
+){
+ int ret = 0;
+ SrcItem *pItem = &pWInfo->pTabList->a[pLevel->iFrom];
+ Vdbe *v = pParse->pVdbe; /* VM being constructed */
+ sqlite3 *db = pParse->db; /* Database handle */
+ char *zMsg; /* Text to add to EQP output */
+ int i; /* Loop counter */
+ WhereLoop *pLoop; /* The where loop */
+ StrAccum str; /* EQP output string */
+ char zBuf[100]; /* Initial space for EQP output string */
+
+ sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH);
+ str.printfFlags = SQLITE_PRINTF_INTERNAL;
+ sqlite3_str_appendf(&str, "BLOOM FILTER ON %S (", pItem);
+ pLoop = pLevel->pWLoop;
+ if( pLoop->wsFlags & WHERE_IPK ){
+ const Table *pTab = pItem->pTab;
+ if( pTab->iPKey>=0 ){
+ sqlite3_str_appendf(&str, "%s=?", pTab->aCol[pTab->iPKey].zCnName);
+ }else{
+ sqlite3_str_appendf(&str, "rowid=?");
+ }
+ }else{
+ for(i=pLoop->nSkip; i<pLoop->u.btree.nEq; i++){
+ const char *z = explainIndexColumnName(pLoop->u.btree.pIndex, i);
+ if( i>pLoop->nSkip ) sqlite3_str_append(&str, " AND ", 5);
+ sqlite3_str_appendf(&str, "%s=?", z);
+ }
+ }
+ sqlite3_str_append(&str, ")", 1);
+ zMsg = sqlite3StrAccumFinish(&str);
+ ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v),
+ pParse->addrExplain, 0, zMsg,P4_DYNAMIC);
+
+ sqlite3VdbeScanStatus(v, sqlite3VdbeCurrentAddr(v)-1, 0, 0, 0, 0);
+ return ret;
+}
#endif /* SQLITE_OMIT_EXPLAIN */
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
@@ -145313,16 +153411,31 @@ SQLITE_PRIVATE void sqlite3WhereAddScanStatus(
WhereLevel *pLvl, /* Level to add scanstatus() entry for */
int addrExplain /* Address of OP_Explain (or 0) */
){
- const char *zObj = 0;
- WhereLoop *pLoop = pLvl->pWLoop;
- if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){
- zObj = pLoop->u.btree.pIndex->zName;
- }else{
- zObj = pSrclist->a[pLvl->iFrom].zName;
+ if( IS_STMT_SCANSTATUS( sqlite3VdbeDb(v) ) ){
+ const char *zObj = 0;
+ WhereLoop *pLoop = pLvl->pWLoop;
+ int wsFlags = pLoop->wsFlags;
+ int viaCoroutine = 0;
+
+ if( (wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){
+ zObj = pLoop->u.btree.pIndex->zName;
+ }else{
+ zObj = pSrclist->a[pLvl->iFrom].zName;
+ viaCoroutine = pSrclist->a[pLvl->iFrom].fg.viaCoroutine;
+ }
+ sqlite3VdbeScanStatus(
+ v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj
+ );
+
+ if( viaCoroutine==0 ){
+ if( (wsFlags & (WHERE_MULTI_OR|WHERE_AUTO_INDEX))==0 ){
+ sqlite3VdbeScanStatusRange(v, addrExplain, -1, pLvl->iTabCur);
+ }
+ if( wsFlags & WHERE_INDEXED ){
+ sqlite3VdbeScanStatusRange(v, addrExplain, -1, pLvl->iIdxCur);
+ }
+ }
}
- sqlite3VdbeScanStatus(
- v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj
- );
}
#endif
@@ -145373,7 +153486,7 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
int nLoop = 0;
assert( pTerm!=0 );
while( (pTerm->wtFlags & TERM_CODED)==0
- && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
+ && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_OuterON))
&& (pLevel->notReady & pTerm->prereqAll)==0
){
if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){
@@ -145382,7 +153495,7 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
pTerm->wtFlags |= TERM_CODED;
}
#ifdef WHERETRACE_ENABLED
- if( sqlite3WhereTrace & 0x20000 ){
+ if( (sqlite3WhereTrace & 0x4001)==0x4001 ){
sqlite3DebugPrintf("DISABLE-");
sqlite3WhereTermPrint(pTerm, (int)(pTerm - (pTerm->pWC->a)));
}
@@ -145497,61 +153610,75 @@ static Expr *removeUnindexableInClauseTerms(
Expr *pX /* The IN expression to be reduced */
){
sqlite3 *db = pParse->db;
+ Select *pSelect; /* Pointer to the SELECT on the RHS */
Expr *pNew;
pNew = sqlite3ExprDup(db, pX, 0);
if( db->mallocFailed==0 ){
- ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */
- ExprList *pOrigLhs = pNew->pLeft->x.pList; /* Original unmodified LHS */
- ExprList *pRhs = 0; /* New RHS after modifications */
- ExprList *pLhs = 0; /* New LHS after mods */
- int i; /* Loop counter */
- Select *pSelect; /* Pointer to the SELECT on the RHS */
-
- for(i=iEq; i<pLoop->nLTerm; i++){
- if( pLoop->aLTerm[i]->pExpr==pX ){
- int iField = pLoop->aLTerm[i]->u.x.iField - 1;
- if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */
- pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr);
- pOrigRhs->a[iField].pExpr = 0;
- assert( pOrigLhs->a[iField].pExpr!=0 );
- pLhs = sqlite3ExprListAppend(pParse, pLhs, pOrigLhs->a[iField].pExpr);
- pOrigLhs->a[iField].pExpr = 0;
- }
- }
- sqlite3ExprListDelete(db, pOrigRhs);
- sqlite3ExprListDelete(db, pOrigLhs);
- pNew->pLeft->x.pList = pLhs;
- pNew->x.pSelect->pEList = pRhs;
- if( pLhs && pLhs->nExpr==1 ){
- /* Take care here not to generate a TK_VECTOR containing only a
- ** single value. Since the parser never creates such a vector, some
- ** of the subroutines do not handle this case. */
- Expr *p = pLhs->a[0].pExpr;
- pLhs->a[0].pExpr = 0;
- sqlite3ExprDelete(db, pNew->pLeft);
- pNew->pLeft = p;
- }
- pSelect = pNew->x.pSelect;
- if( pSelect->pOrderBy ){
- /* If the SELECT statement has an ORDER BY clause, zero the
- ** iOrderByCol variables. These are set to non-zero when an
- ** ORDER BY term exactly matches one of the terms of the
- ** result-set. Since the result-set of the SELECT statement may
- ** have been modified or reordered, these variables are no longer
- ** set correctly. Since setting them is just an optimization,
- ** it's easiest just to zero them here. */
- ExprList *pOrderBy = pSelect->pOrderBy;
- for(i=0; i<pOrderBy->nExpr; i++){
- pOrderBy->a[i].u.x.iOrderByCol = 0;
+ for(pSelect=pNew->x.pSelect; pSelect; pSelect=pSelect->pPrior){
+ ExprList *pOrigRhs; /* Original unmodified RHS */
+ ExprList *pOrigLhs = 0; /* Original unmodified LHS */
+ ExprList *pRhs = 0; /* New RHS after modifications */
+ ExprList *pLhs = 0; /* New LHS after mods */
+ int i; /* Loop counter */
+
+ assert( ExprUseXSelect(pNew) );
+ pOrigRhs = pSelect->pEList;
+ assert( pNew->pLeft!=0 );
+ assert( ExprUseXList(pNew->pLeft) );
+ if( pSelect==pNew->x.pSelect ){
+ pOrigLhs = pNew->pLeft->x.pList;
+ }
+ for(i=iEq; i<pLoop->nLTerm; i++){
+ if( pLoop->aLTerm[i]->pExpr==pX ){
+ int iField;
+ assert( (pLoop->aLTerm[i]->eOperator & (WO_OR|WO_AND))==0 );
+ iField = pLoop->aLTerm[i]->u.x.iField - 1;
+ if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */
+ pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr);
+ pOrigRhs->a[iField].pExpr = 0;
+ if( pOrigLhs ){
+ assert( pOrigLhs->a[iField].pExpr!=0 );
+ pLhs = sqlite3ExprListAppend(pParse,pLhs,pOrigLhs->a[iField].pExpr);
+ pOrigLhs->a[iField].pExpr = 0;
+ }
+ }
+ }
+ sqlite3ExprListDelete(db, pOrigRhs);
+ if( pOrigLhs ){
+ sqlite3ExprListDelete(db, pOrigLhs);
+ pNew->pLeft->x.pList = pLhs;
+ }
+ pSelect->pEList = pRhs;
+ if( pLhs && pLhs->nExpr==1 ){
+ /* Take care here not to generate a TK_VECTOR containing only a
+ ** single value. Since the parser never creates such a vector, some
+ ** of the subroutines do not handle this case. */
+ Expr *p = pLhs->a[0].pExpr;
+ pLhs->a[0].pExpr = 0;
+ sqlite3ExprDelete(db, pNew->pLeft);
+ pNew->pLeft = p;
+ }
+ if( pSelect->pOrderBy ){
+ /* If the SELECT statement has an ORDER BY clause, zero the
+ ** iOrderByCol variables. These are set to non-zero when an
+ ** ORDER BY term exactly matches one of the terms of the
+ ** result-set. Since the result-set of the SELECT statement may
+ ** have been modified or reordered, these variables are no longer
+ ** set correctly. Since setting them is just an optimization,
+ ** it's easiest just to zero them here. */
+ ExprList *pOrderBy = pSelect->pOrderBy;
+ for(i=0; i<pOrderBy->nExpr; i++){
+ pOrderBy->a[i].u.x.iOrderByCol = 0;
+ }
}
- }
#if 0
- printf("For indexing, change the IN expr:\n");
- sqlite3TreeViewExpr(0, pX, 0);
- printf("Into:\n");
- sqlite3TreeViewExpr(0, pNew, 0);
+ printf("For indexing, change the IN expr:\n");
+ sqlite3TreeViewExpr(0, pX, 0);
+ printf("Into:\n");
+ sqlite3TreeViewExpr(0, pNew, 0);
#endif
+ }
}
return pNew;
}
@@ -145624,19 +153751,25 @@ static int codeEqualityTerm(
}
iTab = 0;
- if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){
+ if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){
eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab);
}else{
- sqlite3 *db = pParse->db;
- pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX);
-
- if( !db->mallocFailed ){
- aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq);
+ Expr *pExpr = pTerm->pExpr;
+ if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){
+ sqlite3 *db = pParse->db;
+ pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX);
+ if( !db->mallocFailed ){
+ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq);
+ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab);
+ pExpr->iTable = iTab;
+ }
+ sqlite3ExprDelete(db, pX);
+ }else{
+ int n = sqlite3ExprVectorSize(pX->pLeft);
+ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*MAX(nEq,n));
eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab);
- pTerm->pExpr->iTable = iTab;
}
- sqlite3ExprDelete(db, pX);
- pX = pTerm->pExpr;
+ pX = pExpr;
}
if( eType==IN_INDEX_INDEX_DESC ){
@@ -145646,8 +153779,8 @@ static int codeEqualityTerm(
sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0);
VdbeCoverageIf(v, bRev);
VdbeCoverageIf(v, !bRev);
- assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 );
+ assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 );
pLoop->wsFlags |= WHERE_IN_ABLE;
if( pLevel->u.in.nIn==0 ){
pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse);
@@ -145659,8 +153792,9 @@ static int codeEqualityTerm(
i = pLevel->u.in.nIn;
pLevel->u.in.nIn += nEq;
pLevel->u.in.aInLoop =
- sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop,
- sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn);
+ sqlite3WhereRealloc(pTerm->pWC->pWInfo,
+ pLevel->u.in.aInLoop,
+ sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn);
pIn = pLevel->u.in.aInLoop;
if( pIn ){
int iMap = 0; /* Index in aiMap[] */
@@ -145811,6 +153945,7 @@ static int codeAllEqualityTerms(
VdbeCoverageIf(v, bRev!=0);
VdbeComment((v, "begin skip-scan on %s", pIdx->zName));
j = sqlite3VdbeAddOp0(v, OP_Goto);
+ assert( pLevel->addrSkip==0 );
pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT),
iIdxCur, 0, regBase, nSkip);
VdbeCoverageIf(v, bRev==0);
@@ -145843,6 +153978,9 @@ static int codeAllEqualityTerms(
sqlite3VdbeAddOp2(v, OP_Copy, r1, regBase+j);
}
}
+ }
+ for(j=nSkip; j<nEq; j++){
+ pTerm = pLoop->aLTerm[j];
if( pTerm->eOperator & WO_IN ){
if( pTerm->pExpr->flags & EP_xIsSelect ){
/* No affinity ever needs to be (or should be) applied to a value
@@ -145857,7 +153995,8 @@ static int codeAllEqualityTerms(
sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk);
VdbeCoverage(v);
}
- if( pParse->db->mallocFailed==0 && pParse->nErr==0 ){
+ if( pParse->nErr==0 ){
+ assert( pParse->db->mallocFailed==0 );
if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){
zAff[j] = SQLITE_AFF_BLOB;
}
@@ -145897,7 +154036,7 @@ static void whereLikeOptimizationStringFixup(
if( pTerm->wtFlags & TERM_LIKEOPT ){
VdbeOp *pOp;
assert( pLevel->iLikeRepCntr>0 );
- pOp = sqlite3VdbeGetOp(v, -1);
+ pOp = sqlite3VdbeGetLastOp(v);
assert( pOp!=0 );
assert( pOp->opcode==OP_String8
|| pTerm->pWC->pWInfo->pParse->db->mallocFailed );
@@ -145991,11 +154130,12 @@ static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){
*/
static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){
int rc = WRC_Continue;
+ int reg;
struct CCurHint *pHint = pWalker->u.pCCurHint;
if( pExpr->op==TK_COLUMN ){
if( pExpr->iTable!=pHint->iTabCur ){
- int reg = ++pWalker->pParse->nMem; /* Register for column value */
- sqlite3ExprCode(pWalker->pParse, pExpr, reg);
+ reg = ++pWalker->pParse->nMem; /* Register for column value */
+ reg = sqlite3ExprCodeTarget(pWalker->pParse, pExpr, reg);
pExpr->op = TK_REGISTER;
pExpr->iTable = reg;
}else if( pHint->pIdx!=0 ){
@@ -146003,15 +154143,15 @@ static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){
pExpr->iColumn = sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn);
assert( pExpr->iColumn>=0 );
}
- }else if( pExpr->op==TK_AGG_FUNCTION ){
- /* An aggregate function in the WHERE clause of a query means this must
- ** be a correlated sub-query, and expression pExpr is an aggregate from
- ** the parent context. Do not walk the function arguments in this case.
- **
- ** todo: It should be possible to replace this node with a TK_REGISTER
- ** expression, as the result of the expression must be stored in a
- ** register at this point. The same holds for TK_AGG_COLUMN nodes. */
+ }else if( pExpr->pAggInfo ){
rc = WRC_Prune;
+ reg = ++pWalker->pParse->nMem; /* Register for column value */
+ reg = sqlite3ExprCodeTarget(pWalker->pParse, pExpr, reg);
+ pExpr->op = TK_REGISTER;
+ pExpr->iTable = reg;
+ }else if( pExpr->op==TK_TRUEFALSE ){
+ /* Do not walk disabled expressions. tag-20230504-1 */
+ return WRC_Prune;
}
return rc;
}
@@ -146047,7 +154187,7 @@ static void codeCursorHint(
sWalker.pParse = pParse;
sWalker.u.pCCurHint = &sHint;
pWC = &pWInfo->sWC;
- for(i=0; i<pWC->nTerm; i++){
+ for(i=0; i<pWC->nBase; i++){
pTerm = &pWC->a[i];
if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
if( pTerm->prereqAll & pLevel->notReady ) continue;
@@ -146076,8 +154216,8 @@ static void codeCursorHint(
*/
if( pTabItem->fg.jointype & JT_LEFT ){
Expr *pExpr = pTerm->pExpr;
- if( !ExprHasProperty(pExpr, EP_FromJoin)
- || pExpr->iRightJoinTable!=pTabItem->iCursor
+ if( !ExprHasProperty(pExpr, EP_OuterON)
+ || pExpr->w.iJoin!=pTabItem->iCursor
){
sWalker.eCode = 0;
sWalker.xExprCallback = codeCursorHintIsOrFunction;
@@ -146085,7 +154225,7 @@ static void codeCursorHint(
if( sWalker.eCode ) continue;
}
}else{
- if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) continue;
+ if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) continue;
}
/* All terms in pWLoop->aLTerm[] except pEndRange are used to initialize
@@ -146113,7 +154253,7 @@ static void codeCursorHint(
}
if( pExpr!=0 ){
sWalker.xExprCallback = codeCursorHintFixExpr;
- sqlite3WalkExpr(&sWalker, pExpr);
+ if( pParse->nErr==0 ) sqlite3WalkExpr(&sWalker, pExpr);
sqlite3VdbeAddOp4(v, OP_CursorHint,
(sHint.pIdx ? sHint.iIdxCur : sHint.iTabCur), 0, 0,
(const char*)pExpr, P4_EXPR);
@@ -146133,13 +154273,21 @@ static void codeCursorHint(
**
** OP_DeferredSeek $iCur $iRowid
**
+** Which causes a seek on $iCur to the row with rowid $iRowid.
+**
** However, if the scan currently being coded is a branch of an OR-loop and
-** the statement currently being coded is a SELECT, then P3 of OP_DeferredSeek
-** is set to iIdxCur and P4 is set to point to an array of integers
-** containing one entry for each column of the table cursor iCur is open
-** on. For each table column, if the column is the i'th column of the
-** index, then the corresponding array entry is set to (i+1). If the column
-** does not appear in the index at all, the array entry is set to 0.
+** the statement currently being coded is a SELECT, then additional information
+** is added that might allow OP_Column to omit the seek and instead do its
+** lookup on the index, thus avoiding an expensive seek operation. To
+** enable this optimization, the P3 of OP_DeferredSeek is set to iIdxCur
+** and P4 is set to an array of integers containing one entry for each column
+** in the table. For each table column, if the column is the i'th
+** column of the index, then the corresponding array entry is set to (i+1).
+** If the column does not appear in the index at all, the array entry is set
+** to 0. The OP_Column opcode can check this array to see if the column it
+** wants is in the index and if it is, it will substitute the index cursor
+** and column number and continue with those new values, rather than seeking
+** the table cursor.
*/
static void codeDeferredSeek(
WhereInfo *pWInfo, /* Where clause context */
@@ -146155,7 +154303,7 @@ static void codeDeferredSeek(
pWInfo->bDeferredSeek = 1;
sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur);
- if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)
+ if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))
&& DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask)
){
int i;
@@ -146189,7 +154337,7 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){
assert( nReg>0 );
if( p && sqlite3ExprIsVector(p) ){
#ifndef SQLITE_OMIT_SUBQUERY
- if( (p->flags & EP_xIsSelect) ){
+ if( ExprUseXSelect(p) ){
Vdbe *v = pParse->pVdbe;
int iSelect;
assert( p->op==TK_SELECT );
@@ -146199,7 +154347,9 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){
#endif
{
int i;
- ExprList *pList = p->x.pList;
+ const ExprList *pList;
+ assert( ExprUseXList(p) );
+ pList = p->x.pList;
assert( nReg<=pList->nExpr );
for(i=0; i<nReg; i++){
sqlite3ExprCode(pParse, pList->a[i].pExpr, iReg+i);
@@ -146211,142 +154361,6 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){
}
}
-/* An instance of the IdxExprTrans object carries information about a
-** mapping from an expression on table columns into a column in an index
-** down through the Walker.
-*/
-typedef struct IdxExprTrans {
- Expr *pIdxExpr; /* The index expression */
- int iTabCur; /* The cursor of the corresponding table */
- int iIdxCur; /* The cursor for the index */
- int iIdxCol; /* The column for the index */
- int iTabCol; /* The column for the table */
- WhereInfo *pWInfo; /* Complete WHERE clause information */
- sqlite3 *db; /* Database connection (for malloc()) */
-} IdxExprTrans;
-
-/*
-** Preserve pExpr on the WhereETrans list of the WhereInfo.
-*/
-static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){
- WhereExprMod *pNew;
- pNew = sqlite3DbMallocRaw(pTrans->db, sizeof(*pNew));
- if( pNew==0 ) return;
- pNew->pNext = pTrans->pWInfo->pExprMods;
- pTrans->pWInfo->pExprMods = pNew;
- pNew->pExpr = pExpr;
- memcpy(&pNew->orig, pExpr, sizeof(*pExpr));
-}
-
-/* The walker node callback used to transform matching expressions into
-** a reference to an index column for an index on an expression.
-**
-** If pExpr matches, then transform it into a reference to the index column
-** that contains the value of pExpr.
-*/
-static int whereIndexExprTransNode(Walker *p, Expr *pExpr){
- IdxExprTrans *pX = p->u.pIdxTrans;
- if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){
- preserveExpr(pX, pExpr);
- pExpr->affExpr = sqlite3ExprAffinity(pExpr);
- pExpr->op = TK_COLUMN;
- pExpr->iTable = pX->iIdxCur;
- pExpr->iColumn = pX->iIdxCol;
- pExpr->y.pTab = 0;
- testcase( ExprHasProperty(pExpr, EP_Skip) );
- testcase( ExprHasProperty(pExpr, EP_Unlikely) );
- ExprClearProperty(pExpr, EP_Skip|EP_Unlikely);
- return WRC_Prune;
- }else{
- return WRC_Continue;
- }
-}
-
-#ifndef SQLITE_OMIT_GENERATED_COLUMNS
-/* A walker node callback that translates a column reference to a table
-** into a corresponding column reference of an index.
-*/
-static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){
- if( pExpr->op==TK_COLUMN ){
- IdxExprTrans *pX = p->u.pIdxTrans;
- if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){
- assert( pExpr->y.pTab!=0 );
- preserveExpr(pX, pExpr);
- pExpr->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab,pExpr->iColumn);
- pExpr->iTable = pX->iIdxCur;
- pExpr->iColumn = pX->iIdxCol;
- pExpr->y.pTab = 0;
- }
- }
- return WRC_Continue;
-}
-#endif /* SQLITE_OMIT_GENERATED_COLUMNS */
-
-/*
-** For an indexes on expression X, locate every instance of expression X
-** in pExpr and change that subexpression into a reference to the appropriate
-** column of the index.
-**
-** 2019-10-24: Updated to also translate references to a VIRTUAL column in
-** the table into references to the corresponding (stored) column of the
-** index.
-*/
-static void whereIndexExprTrans(
- Index *pIdx, /* The Index */
- int iTabCur, /* Cursor of the table that is being indexed */
- int iIdxCur, /* Cursor of the index itself */
- WhereInfo *pWInfo /* Transform expressions in this WHERE clause */
-){
- int iIdxCol; /* Column number of the index */
- ExprList *aColExpr; /* Expressions that are indexed */
- Table *pTab;
- Walker w;
- IdxExprTrans x;
- aColExpr = pIdx->aColExpr;
- if( aColExpr==0 && !pIdx->bHasVCol ){
- /* The index does not reference any expressions or virtual columns
- ** so no translations are needed. */
- return;
- }
- pTab = pIdx->pTable;
- memset(&w, 0, sizeof(w));
- w.u.pIdxTrans = &x;
- x.iTabCur = iTabCur;
- x.iIdxCur = iIdxCur;
- x.pWInfo = pWInfo;
- x.db = pWInfo->pParse->db;
- for(iIdxCol=0; iIdxCol<pIdx->nColumn; iIdxCol++){
- i16 iRef = pIdx->aiColumn[iIdxCol];
- if( iRef==XN_EXPR ){
- assert( aColExpr->a[iIdxCol].pExpr!=0 );
- x.pIdxExpr = aColExpr->a[iIdxCol].pExpr;
- if( sqlite3ExprIsConstant(x.pIdxExpr) ) continue;
- w.xExprCallback = whereIndexExprTransNode;
-#ifndef SQLITE_OMIT_GENERATED_COLUMNS
- }else if( iRef>=0
- && (pTab->aCol[iRef].colFlags & COLFLAG_VIRTUAL)!=0
- && (pTab->aCol[iRef].zColl==0
- || sqlite3StrICmp(pTab->aCol[iRef].zColl, sqlite3StrBINARY)==0)
- ){
- /* Check to see if there are direct references to generated columns
- ** that are contained in the index. Pulling the generated column
- ** out of the index is an optimization only - the main table is always
- ** available if the index cannot be used. To avoid unnecessary
- ** complication, omit this optimization if the collating sequence for
- ** the column is non-standard */
- x.iTabCol = iRef;
- w.xExprCallback = whereIndexExprTransColumn;
-#endif /* SQLITE_OMIT_GENERATED_COLUMNS */
- }else{
- continue;
- }
- x.iIdxCol = iIdxCol;
- sqlite3WalkExpr(&w, pWInfo->pWhere);
- sqlite3WalkExprList(&w, pWInfo->pOrderBy);
- sqlite3WalkExprList(&w, pWInfo->pResultSet);
- }
-}
-
/*
** The pTruth expression is always true because it is the WHERE clause
** a partial index that is driving a query loop. Look through all of the
@@ -146376,6 +154390,70 @@ static void whereApplyPartialIndexConstraints(
}
/*
+** This routine is called right after An OP_Filter has been generated and
+** before the corresponding index search has been performed. This routine
+** checks to see if there are additional Bloom filters in inner loops that
+** can be checked prior to doing the index lookup. If there are available
+** inner-loop Bloom filters, then evaluate those filters now, before the
+** index lookup. The idea is that a Bloom filter check is way faster than
+** an index lookup, and the Bloom filter might return false, meaning that
+** the index lookup can be skipped.
+**
+** We know that an inner loop uses a Bloom filter because it has the
+** WhereLevel.regFilter set. If an inner-loop Bloom filter is checked,
+** then clear the WhereLevel.regFilter value to prevent the Bloom filter
+** from being checked a second time when the inner loop is evaluated.
+*/
+static SQLITE_NOINLINE void filterPullDown(
+ Parse *pParse, /* Parsing context */
+ WhereInfo *pWInfo, /* Complete information about the WHERE clause */
+ int iLevel, /* Which level of pWInfo->a[] should be coded */
+ int addrNxt, /* Jump here to bypass inner loops */
+ Bitmask notReady /* Loops that are not ready */
+){
+ while( ++iLevel < pWInfo->nLevel ){
+ WhereLevel *pLevel = &pWInfo->a[iLevel];
+ WhereLoop *pLoop = pLevel->pWLoop;
+ if( pLevel->regFilter==0 ) continue;
+ if( pLevel->pWLoop->nSkip ) continue;
+ /* ,--- Because sqlite3ConstructBloomFilter() has will not have set
+ ** vvvvv--' pLevel->regFilter if this were true. */
+ if( NEVER(pLoop->prereq & notReady) ) continue;
+ assert( pLevel->addrBrk==0 );
+ pLevel->addrBrk = addrNxt;
+ if( pLoop->wsFlags & WHERE_IPK ){
+ WhereTerm *pTerm = pLoop->aLTerm[0];
+ int regRowid;
+ assert( pTerm!=0 );
+ assert( pTerm->pExpr!=0 );
+ testcase( pTerm->wtFlags & TERM_VIRTUAL );
+ regRowid = sqlite3GetTempReg(pParse);
+ regRowid = codeEqualityTerm(pParse, pTerm, pLevel, 0, 0, regRowid);
+ sqlite3VdbeAddOp2(pParse->pVdbe, OP_MustBeInt, regRowid, addrNxt);
+ VdbeCoverage(pParse->pVdbe);
+ sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter,
+ addrNxt, regRowid, 1);
+ VdbeCoverage(pParse->pVdbe);
+ }else{
+ u16 nEq = pLoop->u.btree.nEq;
+ int r1;
+ char *zStartAff;
+
+ assert( pLoop->wsFlags & WHERE_INDEXED );
+ assert( (pLoop->wsFlags & WHERE_COLUMN_IN)==0 );
+ r1 = codeAllEqualityTerms(pParse,pLevel,0,0,&zStartAff);
+ codeApplyAffinity(pParse, r1, nEq, zStartAff);
+ sqlite3DbFree(pParse->db, zStartAff);
+ sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter,
+ addrNxt, r1, nEq);
+ VdbeCoverage(pParse->pVdbe);
+ }
+ pLevel->regFilter = 0;
+ pLevel->addrBrk = 0;
+ }
+}
+
+/*
** Generate code for the start of the iLevel-th loop in the WHERE clause
** implementation described by pWInfo.
*/
@@ -146412,13 +154490,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur);
bRev = (pWInfo->revMask>>iLevel)&1;
VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName));
-#if WHERETRACE_ENABLED /* 0x20800 */
- if( sqlite3WhereTrace & 0x800 ){
+#if WHERETRACE_ENABLED /* 0x4001 */
+ if( sqlite3WhereTrace & 0x1 ){
sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx iFrom=%d\n",
iLevel, pWInfo->nLevel, (u64)notReady, pLevel->iFrom);
- sqlite3WhereLoopPrint(pLoop, pWC);
+ if( sqlite3WhereTrace & 0x1000 ){
+ sqlite3WhereLoopPrint(pLoop, pWC);
+ }
}
- if( sqlite3WhereTrace & 0x20000 ){
+ if( (sqlite3WhereTrace & 0x4001)==0x4001 ){
if( iLevel==0 ){
sqlite3DebugPrintf("WHERE clause being coded:\n");
sqlite3TreeViewExpr(0, pWInfo->pWhere, 0);
@@ -146445,7 +154525,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** initialize a memory cell that records if this table matches any
** row of the left table of the join.
*/
- assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)
+ assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))
|| pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0
);
if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){
@@ -146456,7 +154536,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
/* Compute a safe address to jump to if we discover that the table for
** this loop is empty and can never contribute content. */
- for(j=iLevel; j>0 && pWInfo->a[j].iLeftJoin==0; j--){}
+ for(j=iLevel; j>0; j--){
+ if( pWInfo->a[j].iLeftJoin ) break;
+ if( pWInfo->a[j].pRJ ) break;
+ }
addrHalt = pWInfo->a[j].addrBrk;
/* Special case of a FROM clause subquery implemented as a co-routine */
@@ -146477,7 +154560,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
int iReg; /* P3 Value for OP_VFilter */
int addrNotFound;
int nConstraint = pLoop->nLTerm;
- int iIn; /* Counter for IN constraints */
iReg = sqlite3GetTempRange(pParse, nConstraint+2);
addrNotFound = pLevel->addrBrk;
@@ -146486,11 +154568,27 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
pTerm = pLoop->aLTerm[j];
if( NEVER(pTerm==0) ) continue;
if( pTerm->eOperator & WO_IN ){
- codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget);
- addrNotFound = pLevel->addrNxt;
+ if( SMASKBIT32(j) & pLoop->u.vtab.mHandleIn ){
+ int iTab = pParse->nTab++;
+ int iCache = ++pParse->nMem;
+ sqlite3CodeRhsOfIN(pParse, pTerm->pExpr, iTab);
+ sqlite3VdbeAddOp3(v, OP_VInitIn, iTab, iTarget, iCache);
+ }else{
+ codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget);
+ addrNotFound = pLevel->addrNxt;
+ }
}else{
Expr *pRight = pTerm->pExpr->pRight;
codeExprOrVector(pParse, pRight, iTarget, 1);
+ if( pTerm->eMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET
+ && pLoop->u.vtab.bOmitOffset
+ ){
+ assert( pTerm->eOperator==WO_AUX );
+ assert( pWInfo->pSelect!=0 );
+ assert( pWInfo->pSelect->iOffset>0 );
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, pWInfo->pSelect->iOffset);
+ VdbeComment((v,"Zero OFFSET counter"));
+ }
}
}
sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg);
@@ -146506,40 +154604,55 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
pLevel->p1 = iCur;
pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
pLevel->p2 = sqlite3VdbeCurrentAddr(v);
- iIn = pLevel->u.in.nIn;
- for(j=nConstraint-1; j>=0; j--){
+ assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 );
+
+ for(j=0; j<nConstraint; j++){
pTerm = pLoop->aLTerm[j];
- if( (pTerm->eOperator & WO_IN)!=0 ) iIn--;
if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){
disableTerm(pLevel, pTerm);
- }else if( (pTerm->eOperator & WO_IN)!=0
- && sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1
+ continue;
+ }
+ if( (pTerm->eOperator & WO_IN)!=0
+ && (SMASKBIT32(j) & pLoop->u.vtab.mHandleIn)==0
+ && !db->mallocFailed
){
Expr *pCompare; /* The comparison operator */
Expr *pRight; /* RHS of the comparison */
VdbeOp *pOp; /* Opcode to access the value of the IN constraint */
+ int iIn; /* IN loop corresponding to the j-th constraint */
/* Reload the constraint value into reg[iReg+j+2]. The same value
** was loaded into the same register prior to the OP_VFilter, but
** the xFilter implementation might have changed the datatype or
- ** encoding of the value in the register, so it *must* be reloaded. */
- assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed );
- if( !db->mallocFailed ){
- assert( iIn>=0 && iIn<pLevel->u.in.nIn );
+ ** encoding of the value in the register, so it *must* be reloaded.
+ */
+ for(iIn=0; ALWAYS(iIn<pLevel->u.in.nIn); iIn++){
pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop);
- assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid );
- assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 );
- assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 );
- testcase( pOp->opcode==OP_Rowid );
- sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3);
+ if( (pOp->opcode==OP_Column && pOp->p3==iReg+j+2)
+ || (pOp->opcode==OP_Rowid && pOp->p2==iReg+j+2)
+ ){
+ testcase( pOp->opcode==OP_Rowid );
+ sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3);
+ break;
+ }
}
/* Generate code that will continue to the next row if
- ** the IN constraint is not satisfied */
+ ** the IN constraint is not satisfied
+ */
pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0);
- assert( pCompare!=0 || db->mallocFailed );
- if( pCompare ){
- pCompare->pLeft = pTerm->pExpr->pLeft;
+ if( !db->mallocFailed ){
+ int iFld = pTerm->u.x.iField;
+ Expr *pLeft = pTerm->pExpr->pLeft;
+ assert( pLeft!=0 );
+ if( iFld>0 ){
+ assert( pLeft->op==TK_VECTOR );
+ assert( ExprUseXList(pLeft) );
+ assert( iFld<=pLeft->x.pList->nExpr );
+ pCompare->pLeft = pLeft->x.pList->a[iFld-1].pExpr;
+ }else{
+ pCompare->pLeft = pLeft;
+ }
pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0);
if( pRight ){
pRight->iTable = iReg+j+2;
@@ -146548,11 +154661,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
);
}
pCompare->pLeft = 0;
- sqlite3ExprDelete(db, pCompare);
}
+ sqlite3ExprDelete(db, pCompare);
}
}
- assert( iIn==0 || db->mallocFailed );
+
/* These registers need to be preserved in case there is an IN operator
** loop. So we could deallocate the registers here (and potentially
** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems
@@ -146580,12 +154693,17 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg);
if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg);
addrNxt = pLevel->addrNxt;
+ if( pLevel->regFilter ){
+ sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt,
+ iRowidReg, 1);
+ VdbeCoverage(v);
+ filterPullDown(pParse, pWInfo, iLevel, addrNxt, notReady);
+ }
sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg);
VdbeCoverage(v);
pLevel->op = OP_Noop;
- if( (pTerm->prereqAll & pLevel->notReady)==0 ){
- pTerm->wtFlags |= TERM_CODED;
- }
}else if( (pLoop->wsFlags & WHERE_IPK)!=0
&& (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0
){
@@ -146908,6 +155026,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
sqlite3VdbeAddOp2(v, OP_Integer, 1, regBignull);
VdbeComment((v, "NULL-scan pass ctr"));
}
+ if( pLevel->regFilter ){
+ sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt,
+ regBase, nEq);
+ VdbeCoverage(v);
+ filterPullDown(pParse, pWInfo, iLevel, addrNxt, notReady);
+ }
op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev];
assert( op!=0 );
@@ -146923,6 +155047,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** guess. */
addrSeekScan = sqlite3VdbeAddOp1(v, OP_SeekScan,
(pIdx->aiRowLogEst[0]+9)/10);
+ if( pRangeStart || pRangeEnd ){
+ sqlite3VdbeChangeP5(v, 1);
+ sqlite3VdbeChangeP2(v, addrSeekScan, sqlite3VdbeCurrentAddr(v)+1);
+ addrSeekScan = 0;
+ }
VdbeCoverage(v);
}
sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint);
@@ -146956,8 +155085,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** range (if any).
*/
nConstraint = nEq;
+ assert( pLevel->p2==0 );
if( pRangeEnd ){
Expr *pRight = pRangeEnd->pExpr->pRight;
+ assert( addrSeekScan==0 );
codeExprOrVector(pParse, pRight, regBase+nEq, nTop);
whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd);
if( (pRangeEnd->wtFlags & TERM_VNULL)==0
@@ -146987,8 +155118,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
nConstraint++;
}
- sqlite3DbFree(db, zStartAff);
- sqlite3DbFree(db, zEndAff);
+ if( zStartAff ) sqlite3DbNNFreeNN(db, zStartAff);
+ if( zEndAff ) sqlite3DbNNFreeNN(db, zEndAff);
/* Top of the loop body */
pLevel->p2 = sqlite3VdbeCurrentAddr(v);
@@ -147033,7 +155164,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
/* Seek the table cursor, if required */
omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0
- && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0;
+ && (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0;
if( omitTable ){
/* pIdx is a covering index. No need to access the main table. */
}else if( HasRowid(pIdx->pTable) ){
@@ -147050,27 +155181,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
if( pLevel->iLeftJoin==0 ){
- /* If pIdx is an index on one or more expressions, then look through
- ** all the expressions in pWInfo and try to transform matching expressions
- ** into reference to index columns. Also attempt to translate references
- ** to virtual columns in the table into references to (stored) columns
- ** of the index.
- **
- ** Do not do this for the RHS of a LEFT JOIN. This is because the
- ** expression may be evaluated after OP_NullRow has been executed on
- ** the cursor. In this case it is important to do the full evaluation,
- ** as the result of the expression may not be NULL, even if all table
- ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a
- **
- ** Also, do not do this when processing one index an a multi-index
- ** OR clause, since the transformation will become invalid once we
- ** move forward to the next index.
- ** https://sqlite.org/src/info/4e8e4857d32d401f
- */
- if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){
- whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo);
- }
-
/* If a partial index is driving the loop, try to eliminate WHERE clause
** terms from the query that must be true due to the WHERE clause of
** the partial index.
@@ -147086,7 +155196,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
/* The following assert() is not a requirement, merely an observation:
** The OR-optimization doesn't work for the right hand table of
** a LEFT JOIN: */
- assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 );
+ assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 );
}
/* Record the instruction used to terminate the loop. */
@@ -147183,7 +155293,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
int nNotReady; /* The number of notReady tables */
SrcItem *origSrc; /* Original list of tables */
nNotReady = pWInfo->nLevel - iLevel - 1;
- pOrTab = sqlite3StackAllocRaw(db,
+ pOrTab = sqlite3DbMallocRawNN(db,
sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0]));
if( pOrTab==0 ) return notReady;
pOrTab->nAlloc = (u8)(nNotReady + 1);
@@ -147224,7 +155334,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn);
/* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y
- ** Then for every term xN, evaluate as the subexpression: xN AND z
+ ** Then for every term xN, evaluate as the subexpression: xN AND y
** That way, terms in y that are factored into the disjunction will
** be picked up by the recursive calls to sqlite3WhereBegin() below.
**
@@ -147236,6 +155346,20 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** This optimization also only applies if the (x1 OR x2 OR ...) term
** is not contained in the ON clause of a LEFT JOIN.
** See ticket http://www.sqlite.org/src/info/f2369304e4
+ **
+ ** 2022-02-04: Do not push down slices of a row-value comparison.
+ ** In other words, "w" or "y" may not be a slice of a vector. Otherwise,
+ ** the initialization of the right-hand operand of the vector comparison
+ ** might not occur, or might occur only in an OR branch that is not
+ ** taken. dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1.
+ **
+ ** 2022-03-03: Do not push down expressions that involve subqueries.
+ ** The subquery might get coded as a subroutine. Any table-references
+ ** in the subquery might be resolved to index-references for the index on
+ ** the OR branch in which the subroutine is coded. But if the subroutine
+ ** is invoked from a different OR branch that uses a different index, such
+ ** index-references will not work. tag-20220303a
+ ** https://sqlite.org/forum/forumpost/36937b197273d403
*/
if( pWC->nTerm>1 ){
int iTerm;
@@ -147244,9 +155368,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
if( &pWC->a[iTerm] == pTerm ) continue;
testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL );
testcase( pWC->a[iTerm].wtFlags & TERM_CODED );
- if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED))!=0 ) continue;
+ testcase( pWC->a[iTerm].wtFlags & TERM_SLICE );
+ if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED|TERM_SLICE))!=0 ){
+ continue;
+ }
if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue;
- testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO );
+ if( ExprHasProperty(pExpr, EP_Subquery) ) continue; /* tag-20220303a */
pExpr = sqlite3ExprDup(db, pExpr, 0);
pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr);
}
@@ -147273,7 +155400,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
Expr *pDelete; /* Local copy of OR clause term */
int jmp1 = 0; /* Address of jump operation */
testcase( (pTabItem[0].fg.jointype & JT_LEFT)!=0
- && !ExprHasProperty(pOrExpr, EP_FromJoin)
+ && !ExprHasProperty(pOrExpr, EP_OuterON)
); /* See TH3 vtab25.400 and ticket 614b25314c766238 */
pDelete = pOrExpr = sqlite3ExprDup(db, pOrExpr, 0);
if( db->mallocFailed ){
@@ -147286,10 +155413,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
/* Loop through table entries that match term pOrTerm. */
ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1));
- WHERETRACE(0xffff, ("Subplan for OR-clause:\n"));
- pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0,
+ WHERETRACE(0xffffffff, ("Subplan for OR-clause:\n"));
+ pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, 0,
WHERE_OR_SUBCLAUSE, iCovCur);
- assert( pSubWInfo || pParse->nErr || db->mallocFailed );
+ assert( pSubWInfo || pParse->nErr );
if( pSubWInfo ){
WhereLoop *pSubLoop;
int addrExplain = sqlite3WhereExplainOneScan(
@@ -147398,7 +155525,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
}
ExplainQueryPlanPop(pParse);
- pLevel->u.pCovidx = pCov;
+ assert( pLevel->pWLoop==pLoop );
+ assert( (pLoop->wsFlags & WHERE_MULTI_OR)!=0 );
+ assert( (pLoop->wsFlags & WHERE_IN_ABLE)==0 );
+ pLevel->u.pCoveringIdx = pCov;
if( pCov ) pLevel->iIdxCur = iCovCur;
if( pAndExpr ){
pAndExpr->pLeft = 0;
@@ -147408,7 +155538,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
sqlite3VdbeGoto(v, pLevel->addrBrk);
sqlite3VdbeResolveLabel(v, iLoopBody);
- if( pWInfo->nLevel>1 ){ sqlite3StackFree(db, pOrTab); }
+ /* Set the P2 operand of the OP_Return opcode that will end the current
+ ** loop to point to this spot, which is the top of the next containing
+ ** loop. The byte-code formatter will use that P2 value as a hint to
+ ** indent everything in between the this point and the final OP_Return.
+ ** See tag-20220407a in vdbe.c and shell.c */
+ assert( pLevel->op==OP_Return );
+ pLevel->p2 = sqlite3VdbeCurrentAddr(v);
+
+ if( pWInfo->nLevel>1 ){ sqlite3DbFreeNN(db, pOrTab); }
if( !untestedTerms ) disableTerm(pLevel, pTerm);
}else
#endif /* SQLITE_OMIT_OR_OPTIMIZATION */
@@ -147470,10 +155608,22 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
pE = pTerm->pExpr;
assert( pE!=0 );
- if( (pTabItem->fg.jointype&JT_LEFT) && !ExprHasProperty(pE,EP_FromJoin) ){
- continue;
+ if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ){
+ if( !ExprHasProperty(pE,EP_OuterON|EP_InnerON) ){
+ /* Defer processing WHERE clause constraints until after outer
+ ** join processing. tag-20220513a */
+ continue;
+ }else if( (pTabItem->fg.jointype & JT_LEFT)==JT_LEFT
+ && !ExprHasProperty(pE,EP_OuterON) ){
+ continue;
+ }else{
+ Bitmask m = sqlite3WhereGetMask(&pWInfo->sMaskSet, pE->w.iJoin);
+ if( m & pLevel->notReady ){
+ /* An ON clause that is not ripe */
+ continue;
+ }
+ }
}
-
if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){
iNext = 2;
continue;
@@ -147500,12 +155650,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
}
#endif
}
-#ifdef WHERETRACE_ENABLED /* 0xffff */
+#ifdef WHERETRACE_ENABLED /* 0xffffffff */
if( sqlite3WhereTrace ){
VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d",
pWC->nTerm-j, pTerm, iLoop));
}
- if( sqlite3WhereTrace & 0x800 ){
+ if( sqlite3WhereTrace & 0x4000 ){
sqlite3DebugPrintf("Coding auxiliary constraint:\n");
sqlite3WhereTermPrint(pTerm, pWC->nTerm-j);
}
@@ -147525,29 +155675,30 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** then we cannot use the "t1.a=t2.b" constraint, but we can code
** the implied "t1.a=123" constraint.
*/
- for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){
+ for(pTerm=pWC->a, j=pWC->nBase; j>0; j--, pTerm++){
Expr *pE, sEAlt;
WhereTerm *pAlt;
if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue;
if( (pTerm->eOperator & WO_EQUIV)==0 ) continue;
if( pTerm->leftCursor!=iCur ) continue;
- if( pTabItem->fg.jointype & JT_LEFT ) continue;
+ if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ) continue;
pE = pTerm->pExpr;
-#ifdef WHERETRACE_ENABLED /* 0x800 */
- if( sqlite3WhereTrace & 0x800 ){
+#ifdef WHERETRACE_ENABLED /* 0x4001 */
+ if( (sqlite3WhereTrace & 0x4001)==0x4001 ){
sqlite3DebugPrintf("Coding transitive constraint:\n");
sqlite3WhereTermPrint(pTerm, pWC->nTerm-j);
}
#endif
- assert( !ExprHasProperty(pE, EP_FromJoin) );
+ assert( !ExprHasProperty(pE, EP_OuterON) );
assert( (pTerm->prereqRight & pLevel->notReady)!=0 );
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.x.leftColumn, notReady,
WO_EQ|WO_IN|WO_IS, 0);
if( pAlt==0 ) continue;
if( pAlt->wtFlags & (TERM_CODED) ) continue;
if( (pAlt->eOperator & WO_IN)
- && (pAlt->pExpr->flags & EP_xIsSelect)
+ && ExprUseXSelect(pAlt->pExpr)
&& (pAlt->pExpr->x.pSelect->pEList->nExpr>1)
){
continue;
@@ -147562,6 +155713,47 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
pAlt->wtFlags |= TERM_CODED;
}
+ /* For a RIGHT OUTER JOIN, record the fact that the current row has
+ ** been matched at least once.
+ */
+ if( pLevel->pRJ ){
+ Table *pTab;
+ int nPk;
+ int r;
+ int jmp1 = 0;
+ WhereRightJoin *pRJ = pLevel->pRJ;
+
+ /* pTab is the right-hand table of the RIGHT JOIN. Generate code that
+ ** will record that the current row of that table has been matched at
+ ** least once. This is accomplished by storing the PK for the row in
+ ** both the iMatch index and the regBloom Bloom filter.
+ */
+ pTab = pWInfo->pTabList->a[pLevel->iFrom].pTab;
+ if( HasRowid(pTab) ){
+ r = sqlite3GetTempRange(pParse, 2);
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, pLevel->iTabCur, -1, r+1);
+ nPk = 1;
+ }else{
+ int iPk;
+ Index *pPk = sqlite3PrimaryKeyIndex(pTab);
+ nPk = pPk->nKeyCol;
+ r = sqlite3GetTempRange(pParse, nPk+1);
+ for(iPk=0; iPk<nPk; iPk++){
+ int iCol = pPk->aiColumn[iPk];
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+1+iPk);
+ }
+ }
+ jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, 0, r+1, nPk);
+ VdbeCoverage(v);
+ VdbeComment((v, "match against %s", pTab->zName));
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, r+1, nPk, r);
+ sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pRJ->iMatch, r, r+1, nPk);
+ sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pRJ->regBloom, 0, r+1, nPk);
+ sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
+ sqlite3VdbeJumpHere(v, jmp1);
+ sqlite3ReleaseTempRange(pParse, r, nPk+1);
+ }
+
/* For a LEFT OUTER JOIN, generate code that will record the fact that
** at least one row of the right table has matched the left table.
*/
@@ -147569,7 +155761,31 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
pLevel->addrFirst = sqlite3VdbeCurrentAddr(v);
sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin);
VdbeComment((v, "record LEFT JOIN hit"));
- for(pTerm=pWC->a, j=0; j<pWC->nTerm; j++, pTerm++){
+ if( pLevel->pRJ==0 ){
+ goto code_outer_join_constraints; /* WHERE clause constraints */
+ }
+ }
+
+ if( pLevel->pRJ ){
+ /* Create a subroutine used to process all interior loops and code
+ ** of the RIGHT JOIN. During normal operation, the subroutine will
+ ** be in-line with the rest of the code. But at the end, a separate
+ ** loop will run that invokes this subroutine for unmatched rows
+ ** of pTab, with all tables to left begin set to NULL.
+ */
+ WhereRightJoin *pRJ = pLevel->pRJ;
+ sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pRJ->regReturn);
+ pRJ->addrSubrtn = sqlite3VdbeCurrentAddr(v);
+ assert( pParse->withinRJSubrtn < 255 );
+ pParse->withinRJSubrtn++;
+
+ /* WHERE clause constraints must be deferred until after outer join
+ ** row elimination has completed, since WHERE clause constraints apply
+ ** to the results of the OUTER JOIN. The following loop generates the
+ ** appropriate WHERE clause constraint checks. tag-20220513a.
+ */
+ code_outer_join_constraints:
+ for(pTerm=pWC->a, j=0; j<pWC->nBase; j++, pTerm++){
testcase( pTerm->wtFlags & TERM_VIRTUAL );
testcase( pTerm->wtFlags & TERM_CODED );
if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
@@ -147577,19 +155793,20 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
assert( pWInfo->untestedTerms );
continue;
}
+ if( pTabItem->fg.jointype & JT_LTORJ ) continue;
assert( pTerm->pExpr );
sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL);
pTerm->wtFlags |= TERM_CODED;
}
}
-#if WHERETRACE_ENABLED /* 0x20800 */
- if( sqlite3WhereTrace & 0x20000 ){
+#if WHERETRACE_ENABLED /* 0x4001 */
+ if( sqlite3WhereTrace & 0x4000 ){
sqlite3DebugPrintf("All WHERE-clause terms after coding level %d:\n",
iLevel);
sqlite3WhereClausePrint(pWC);
}
- if( sqlite3WhereTrace & 0x800 ){
+ if( sqlite3WhereTrace & 0x1 ){
sqlite3DebugPrintf("End Coding level %d: notReady=%llx\n",
iLevel, (u64)pLevel->notReady);
}
@@ -147597,6 +155814,96 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
return pLevel->notReady;
}
+/*
+** Generate the code for the loop that finds all non-matched terms
+** for a RIGHT JOIN.
+*/
+SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop(
+ WhereInfo *pWInfo,
+ int iLevel,
+ WhereLevel *pLevel
+){
+ Parse *pParse = pWInfo->pParse;
+ Vdbe *v = pParse->pVdbe;
+ WhereRightJoin *pRJ = pLevel->pRJ;
+ Expr *pSubWhere = 0;
+ WhereClause *pWC = &pWInfo->sWC;
+ WhereInfo *pSubWInfo;
+ WhereLoop *pLoop = pLevel->pWLoop;
+ SrcItem *pTabItem = &pWInfo->pTabList->a[pLevel->iFrom];
+ SrcList sFrom;
+ Bitmask mAll = 0;
+ int k;
+
+ ExplainQueryPlan((pParse, 1, "RIGHT-JOIN %s", pTabItem->pTab->zName));
+ sqlite3VdbeNoJumpsOutsideSubrtn(v, pRJ->addrSubrtn, pRJ->endSubrtn,
+ pRJ->regReturn);
+ for(k=0; k<iLevel; k++){
+ int iIdxCur;
+ mAll |= pWInfo->a[k].pWLoop->maskSelf;
+ sqlite3VdbeAddOp1(v, OP_NullRow, pWInfo->a[k].iTabCur);
+ iIdxCur = pWInfo->a[k].iIdxCur;
+ if( iIdxCur ){
+ sqlite3VdbeAddOp1(v, OP_NullRow, iIdxCur);
+ }
+ }
+ if( (pTabItem->fg.jointype & JT_LTORJ)==0 ){
+ mAll |= pLoop->maskSelf;
+ for(k=0; k<pWC->nTerm; k++){
+ WhereTerm *pTerm = &pWC->a[k];
+ if( (pTerm->wtFlags & (TERM_VIRTUAL|TERM_SLICE))!=0
+ && pTerm->eOperator!=WO_ROWVAL
+ ){
+ break;
+ }
+ if( pTerm->prereqAll & ~mAll ) continue;
+ if( ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) ) continue;
+ pSubWhere = sqlite3ExprAnd(pParse, pSubWhere,
+ sqlite3ExprDup(pParse->db, pTerm->pExpr, 0));
+ }
+ }
+ sFrom.nSrc = 1;
+ sFrom.nAlloc = 1;
+ memcpy(&sFrom.a[0], pTabItem, sizeof(SrcItem));
+ sFrom.a[0].fg.jointype = 0;
+ assert( pParse->withinRJSubrtn < 100 );
+ pParse->withinRJSubrtn++;
+ pSubWInfo = sqlite3WhereBegin(pParse, &sFrom, pSubWhere, 0, 0, 0,
+ WHERE_RIGHT_JOIN, 0);
+ if( pSubWInfo ){
+ int iCur = pLevel->iTabCur;
+ int r = ++pParse->nMem;
+ int nPk;
+ int jmp;
+ int addrCont = sqlite3WhereContinueLabel(pSubWInfo);
+ Table *pTab = pTabItem->pTab;
+ if( HasRowid(pTab) ){
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, r);
+ nPk = 1;
+ }else{
+ int iPk;
+ Index *pPk = sqlite3PrimaryKeyIndex(pTab);
+ nPk = pPk->nKeyCol;
+ pParse->nMem += nPk - 1;
+ for(iPk=0; iPk<nPk; iPk++){
+ int iCol = pPk->aiColumn[iPk];
+ sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk);
+ }
+ }
+ jmp = sqlite3VdbeAddOp4Int(v, OP_Filter, pRJ->regBloom, 0, r, nPk);
+ VdbeCoverage(v);
+ sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, addrCont, r, nPk);
+ VdbeCoverage(v);
+ sqlite3VdbeJumpHere(v, jmp);
+ sqlite3VdbeAddOp2(v, OP_Gosub, pRJ->regReturn, pRJ->addrSubrtn);
+ sqlite3WhereEnd(pSubWInfo);
+ }
+ sqlite3ExprDelete(pParse->db, pSubWhere);
+ ExplainQueryPlanPop(pParse);
+ assert( pParse->withinRJSubrtn>0 );
+ pParse->withinRJSubrtn--;
+}
+
/************** End of wherecode.c *******************************************/
/************** Begin file whereexpr.c ***************************************/
/*
@@ -147665,7 +155972,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){
if( pWC->nTerm>=pWC->nSlot ){
WhereTerm *pOld = pWC->a;
sqlite3 *db = pWC->pWInfo->pParse->db;
- pWC->a = sqlite3DbMallocRawNN(db, sizeof(pWC->a[0])*pWC->nSlot*2 );
+ pWC->a = sqlite3WhereMalloc(pWC->pWInfo, sizeof(pWC->a[0])*pWC->nSlot*2 );
if( pWC->a==0 ){
if( wtFlags & TERM_DYNAMIC ){
sqlite3ExprDelete(db, p);
@@ -147674,12 +155981,10 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){
return 0;
}
memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm);
- if( pOld!=pWC->aStatic ){
- sqlite3DbFree(db, pOld);
- }
- pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]);
+ pWC->nSlot = pWC->nSlot*2;
}
pTerm = &pWC->a[idx = pWC->nTerm++];
+ if( (wtFlags & TERM_VIRTUAL)==0 ) pWC->nBase = pWC->nTerm;
if( p && ExprHasProperty(p, EP_Unlikely) ){
pTerm->truthProb = sqlite3LogEst(p->iTable) - 270;
}else{
@@ -147796,6 +156101,7 @@ static int isLikeOrGlob(
#ifdef SQLITE_EBCDIC
if( *pnoCase ) return 0;
#endif
+ assert( ExprUseXList(pExpr) );
pList = pExpr->x.pList;
pLeft = pList->a[1].pExpr;
@@ -147811,7 +156117,8 @@ static int isLikeOrGlob(
sqlite3VdbeSetVarmask(pParse->pVdbe, iCol);
assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER );
}else if( op==TK_STRING ){
- z = (u8*)pRight->u.zToken;
+ assert( !ExprHasProperty(pRight, EP_IntValue) );
+ z = (u8*)pRight->u.zToken;
}
if( z ){
@@ -147840,7 +156147,9 @@ static int isLikeOrGlob(
pPrefix = sqlite3Expr(db, TK_STRING, (char*)z);
if( pPrefix ){
int iFrom, iTo;
- char *zNew = pPrefix->u.zToken;
+ char *zNew;
+ assert( !ExprHasProperty(pPrefix, EP_IntValue) );
+ zNew = pPrefix->u.zToken;
zNew[cnt] = 0;
for(iFrom=iTo=0; iFrom<cnt; iFrom++){
if( zNew[iFrom]==wc[3] ) iFrom++;
@@ -147864,7 +156173,9 @@ static int isLikeOrGlob(
*/
if( pLeft->op!=TK_COLUMN
|| sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT
- || IsVirtual(pLeft->y.pTab) /* Value might be numeric */
+ || (ALWAYS( ExprUseYTab(pLeft) )
+ && ALWAYS(pLeft->y.pTab)
+ && IsVirtual(pLeft->y.pTab)) /* Might be numeric */
){
int isNum;
double rDummy;
@@ -147892,6 +156203,7 @@ static int isLikeOrGlob(
if( op==TK_VARIABLE ){
Vdbe *v = pParse->pVdbe;
sqlite3VdbeSetVarmask(v, pRight->iColumn);
+ assert( !ExprHasProperty(pRight, EP_IntValue) );
if( *pisComplete && pRight->u.zToken[1] ){
/* If the rhs of the LIKE expression is a variable, and the current
** value of the variable means there is no need to invoke the LIKE
@@ -147965,6 +156277,7 @@ static int isAuxiliaryVtabOperator(
Expr *pCol; /* Column reference */
int i;
+ assert( ExprUseXList(pExpr) );
pList = pExpr->x.pList;
if( pList==0 || pList->nExpr!=2 ){
return 0;
@@ -147978,9 +156291,10 @@ static int isAuxiliaryVtabOperator(
** MATCH(expression,vtab_column)
*/
pCol = pList->a[1].pExpr;
- testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 );
+ assert( pCol->op!=TK_COLUMN || (ExprUseYTab(pCol) && pCol->y.pTab!=0) );
if( ExprIsVtab(pCol) ){
for(i=0; i<ArraySize(aOp); i++){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){
*peOp2 = aOp[i].eOp2;
*ppRight = pList->a[0].pExpr;
@@ -148001,7 +156315,8 @@ static int isAuxiliaryVtabOperator(
** with function names in an arbitrary case.
*/
pCol = pList->a[0].pExpr;
- testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 );
+ assert( pCol->op!=TK_COLUMN || ExprUseYTab(pCol) );
+ assert( pCol->op!=TK_COLUMN || (ExprUseYTab(pCol) && pCol->y.pTab!=0) );
if( ExprIsVtab(pCol) ){
sqlite3_vtab *pVtab;
sqlite3_module *pMod;
@@ -148010,6 +156325,7 @@ static int isAuxiliaryVtabOperator(
pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab;
assert( pVtab!=0 );
assert( pVtab->pModule!=0 );
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
pMod = (sqlite3_module *)pVtab->pModule;
if( pMod->xFindFunction!=0 ){
i = pMod->xFindFunction(pVtab,2, pExpr->u.zToken, &xNotUsed, &pNotUsed);
@@ -148025,11 +156341,12 @@ static int isAuxiliaryVtabOperator(
int res = 0;
Expr *pLeft = pExpr->pLeft;
Expr *pRight = pExpr->pRight;
- testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 );
+ assert( pLeft->op!=TK_COLUMN || (ExprUseYTab(pLeft) && pLeft->y.pTab!=0) );
if( ExprIsVtab(pLeft) ){
res++;
}
- testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 );
+ assert( pRight==0 || pRight->op!=TK_COLUMN
+ || (ExprUseYTab(pRight) && pRight->y.pTab!=0) );
if( pRight && ExprIsVtab(pRight) ){
res++;
SWAP(Expr*, pLeft, pRight);
@@ -148050,9 +156367,9 @@ static int isAuxiliaryVtabOperator(
** a join, then transfer the appropriate markings over to derived.
*/
static void transferJoinMarkings(Expr *pDerived, Expr *pBase){
- if( pDerived ){
- pDerived->flags |= pBase->flags & EP_FromJoin;
- pDerived->iRightJoinTable = pBase->iRightJoinTable;
+ if( pDerived && ExprHasProperty(pBase, EP_OuterON|EP_InnerON) ){
+ pDerived->flags |= pBase->flags & (EP_OuterON|EP_InnerON);
+ pDerived->w.iJoin = pBase->w.iJoin;
}
}
@@ -148281,6 +156598,7 @@ static void exprAnalyzeOrTerm(
pOrTerm->u.pAndInfo = pAndInfo;
pOrTerm->wtFlags |= TERM_ANDINFO;
pOrTerm->eOperator = WO_AND;
+ pOrTerm->leftCursor = -1;
pAndWC = &pAndInfo->wc;
memset(pAndWC->aStatic, 0, sizeof(pAndWC->aStatic));
sqlite3WhereClauseInit(pAndWC, pWC->pWInfo);
@@ -148323,11 +156641,10 @@ static void exprAnalyzeOrTerm(
** empty.
*/
pOrInfo->indexable = indexable;
+ pTerm->eOperator = WO_OR;
+ pTerm->leftCursor = -1;
if( indexable ){
- pTerm->eOperator = WO_OR;
pWC->hasOr = 1;
- }else{
- pTerm->eOperator = WO_OR;
}
/* For a two-way OR, attempt to implementation case 2.
@@ -148382,7 +156699,7 @@ static void exprAnalyzeOrTerm(
pOrTerm = pOrWc->a;
for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){
assert( pOrTerm->eOperator & WO_EQ );
- pOrTerm->wtFlags &= ~TERM_OR_OK;
+ pOrTerm->wtFlags &= ~TERM_OK;
if( pOrTerm->leftCursor==iCursor ){
/* This is the 2-bit case and we are on the second iteration and
** current term is from the first iteration. So skip this term. */
@@ -148400,6 +156717,7 @@ static void exprAnalyzeOrTerm(
assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) );
continue;
}
+ assert( (pOrTerm->eOperator & (WO_OR|WO_AND))==0 );
iColumn = pOrTerm->u.x.leftColumn;
iCursor = pOrTerm->leftCursor;
pLeft = pOrTerm->pExpr->pLeft;
@@ -148420,8 +156738,9 @@ static void exprAnalyzeOrTerm(
okToChngToIN = 1;
for(; i>=0 && okToChngToIN; i--, pOrTerm++){
assert( pOrTerm->eOperator & WO_EQ );
+ assert( (pOrTerm->eOperator & (WO_OR|WO_AND))==0 );
if( pOrTerm->leftCursor!=iCursor ){
- pOrTerm->wtFlags &= ~TERM_OR_OK;
+ pOrTerm->wtFlags &= ~TERM_OK;
}else if( pOrTerm->u.x.leftColumn!=iColumn || (iColumn==XN_EXPR
&& sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1)
)){
@@ -148437,7 +156756,7 @@ static void exprAnalyzeOrTerm(
if( affRight!=0 && affRight!=affLeft ){
okToChngToIN = 0;
}else{
- pOrTerm->wtFlags |= TERM_OR_OK;
+ pOrTerm->wtFlags |= TERM_OK;
}
}
}
@@ -148454,8 +156773,9 @@ static void exprAnalyzeOrTerm(
Expr *pNew; /* The complete IN operator */
for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){
- if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue;
+ if( (pOrTerm->wtFlags & TERM_OK)==0 ) continue;
assert( pOrTerm->eOperator & WO_EQ );
+ assert( (pOrTerm->eOperator & (WO_OR|WO_AND))==0 );
assert( pOrTerm->leftCursor==iCursor );
assert( pOrTerm->u.x.leftColumn==iColumn );
pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0);
@@ -148468,7 +156788,7 @@ static void exprAnalyzeOrTerm(
if( pNew ){
int idxNew;
transferJoinMarkings(pNew, pExpr);
- assert( !ExprHasProperty(pNew, EP_xIsSelect) );
+ assert( ExprUseXList(pNew) );
pNew->x.pList = pList;
idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);
testcase( idxNew==0 );
@@ -148503,7 +156823,7 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr){
CollSeq *pColl;
if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0;
if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0;
- if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0;
+ if( ExprHasProperty(pExpr, EP_OuterON) ) return 0;
aff1 = sqlite3ExprAffinity(pExpr->pLeft);
aff2 = sqlite3ExprAffinity(pExpr->pRight);
if( aff1!=aff2
@@ -148534,7 +156854,9 @@ static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){
int i;
for(i=0; i<pSrc->nSrc; i++){
mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect);
- mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn);
+ if( pSrc->a[i].fg.isUsing==0 ){
+ mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].u3.pOn);
+ }
if( pSrc->a[i].fg.isTabFunc ){
mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg);
}
@@ -148560,35 +156882,40 @@ static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){
*/
static SQLITE_NOINLINE int exprMightBeIndexed2(
SrcList *pFrom, /* The FROM clause */
- Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */
int *aiCurCol, /* Write the referenced table cursor and column here */
- Expr *pExpr /* An operand of a comparison operator */
+ Expr *pExpr, /* An operand of a comparison operator */
+ int j /* Start looking with the j-th pFrom entry */
){
Index *pIdx;
int i;
int iCur;
- for(i=0; mPrereq>1; i++, mPrereq>>=1){}
- iCur = pFrom->a[i].iCursor;
- for(pIdx=pFrom->a[i].pTab->pIndex; pIdx; pIdx=pIdx->pNext){
- if( pIdx->aColExpr==0 ) continue;
- for(i=0; i<pIdx->nKeyCol; i++){
- if( pIdx->aiColumn[i]!=XN_EXPR ) continue;
- if( sqlite3ExprCompareSkip(pExpr, pIdx->aColExpr->a[i].pExpr, iCur)==0 ){
- aiCurCol[0] = iCur;
- aiCurCol[1] = XN_EXPR;
- return 1;
+ do{
+ iCur = pFrom->a[j].iCursor;
+ for(pIdx=pFrom->a[j].pTab->pIndex; pIdx; pIdx=pIdx->pNext){
+ if( pIdx->aColExpr==0 ) continue;
+ for(i=0; i<pIdx->nKeyCol; i++){
+ if( pIdx->aiColumn[i]!=XN_EXPR ) continue;
+ assert( pIdx->bHasExpr );
+ if( sqlite3ExprCompareSkip(pExpr,pIdx->aColExpr->a[i].pExpr,iCur)==0
+ && pExpr->op!=TK_STRING
+ ){
+ aiCurCol[0] = iCur;
+ aiCurCol[1] = XN_EXPR;
+ return 1;
+ }
}
}
- }
+ }while( ++j < pFrom->nSrc );
return 0;
}
static int exprMightBeIndexed(
SrcList *pFrom, /* The FROM clause */
- Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */
int *aiCurCol, /* Write the referenced table cursor & column here */
Expr *pExpr, /* An operand of a comparison operator */
int op /* The specific comparison operator */
){
+ int i;
+
/* If this expression is a vector to the left or right of a
** inequality constraint (>, <, >= or <=), perform the processing
** on the first element of the vector. */
@@ -148596,8 +156923,8 @@ static int exprMightBeIndexed(
assert( TK_IS<TK_GE && TK_ISNULL<TK_GE && TK_IN<TK_GE );
assert( op<=TK_GE );
if( pExpr->op==TK_VECTOR && (op>=TK_GT && ALWAYS(op<=TK_GE)) ){
+ assert( ExprUseXList(pExpr) );
pExpr = pExpr->x.pList->a[0].pExpr;
-
}
if( pExpr->op==TK_COLUMN ){
@@ -148605,9 +156932,16 @@ static int exprMightBeIndexed(
aiCurCol[1] = pExpr->iColumn;
return 1;
}
- if( mPrereq==0 ) return 0; /* No table references */
- if( (mPrereq&(mPrereq-1))!=0 ) return 0; /* Refs more than one table */
- return exprMightBeIndexed2(pFrom,mPrereq,aiCurCol,pExpr);
+
+ for(i=0; i<pFrom->nSrc; i++){
+ Index *pIdx;
+ for(pIdx=pFrom->a[i].pTab->pIndex; pIdx; pIdx=pIdx->pNext){
+ if( pIdx->aColExpr ){
+ return exprMightBeIndexed2(pFrom,aiCurCol,pExpr,i);
+ }
+ }
+ }
+ return 0;
}
@@ -148653,36 +156987,67 @@ static void exprAnalyze(
if( db->mallocFailed ){
return;
}
+ assert( pWC->nTerm > idxTerm );
pTerm = &pWC->a[idxTerm];
pMaskSet = &pWInfo->sMaskSet;
pExpr = pTerm->pExpr;
+ assert( pExpr!=0 ); /* Because malloc() has not failed */
assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE );
+ pMaskSet->bVarSelect = 0;
prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft);
op = pExpr->op;
if( op==TK_IN ){
assert( pExpr->pRight==0 );
if( sqlite3ExprCheckIN(pParse, pExpr) ) return;
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
pTerm->prereqRight = exprSelectUsage(pMaskSet, pExpr->x.pSelect);
}else{
pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList);
}
- }else if( op==TK_ISNULL ){
- pTerm->prereqRight = 0;
+ prereqAll = prereqLeft | pTerm->prereqRight;
}else{
pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight);
+ if( pExpr->pLeft==0
+ || ExprHasProperty(pExpr, EP_xIsSelect|EP_IfNullRow)
+ || pExpr->x.pList!=0
+ ){
+ prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr);
+ }else{
+ prereqAll = prereqLeft | pTerm->prereqRight;
+ }
}
- pMaskSet->bVarSelect = 0;
- prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr);
if( pMaskSet->bVarSelect ) pTerm->wtFlags |= TERM_VARSELECT;
- if( ExprHasProperty(pExpr, EP_FromJoin) ){
- Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable);
- prereqAll |= x;
- extraRight = x-1; /* ON clause terms may not be used with an index
- ** on left table of a LEFT JOIN. Ticket #3015 */
- if( (prereqAll>>1)>=x ){
- sqlite3ErrorMsg(pParse, "ON clause references tables to its right");
- return;
+
+#ifdef SQLITE_DEBUG
+ if( prereqAll!=sqlite3WhereExprUsageNN(pMaskSet, pExpr) ){
+ printf("\n*** Incorrect prereqAll computed for:\n");
+ sqlite3TreeViewExpr(0,pExpr,0);
+ assert( 0 );
+ }
+#endif
+
+ if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) ){
+ Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iJoin);
+ if( ExprHasProperty(pExpr, EP_OuterON) ){
+ prereqAll |= x;
+ extraRight = x-1; /* ON clause terms may not be used with an index
+ ** on left table of a LEFT JOIN. Ticket #3015 */
+ if( (prereqAll>>1)>=x ){
+ sqlite3ErrorMsg(pParse, "ON clause references tables to its right");
+ return;
+ }
+ }else if( (prereqAll>>1)>=x ){
+ /* The ON clause of an INNER JOIN references a table to its right.
+ ** Most other SQL database engines raise an error. But SQLite versions
+ ** 3.0 through 3.38 just put the ON clause constraint into the WHERE
+ ** clause and carried on. Beginning with 3.39, raise an error only
+ ** if there is a RIGHT or FULL JOIN in the query. This makes SQLite
+ ** more like other systems, and also preserves legacy. */
+ if( ALWAYS(pSrc->nSrc>0) && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){
+ sqlite3ErrorMsg(pParse, "ON clause references tables to its right");
+ return;
+ }
+ ExprClearProperty(pExpr, EP_InnerON);
}
}
pTerm->prereqAll = prereqAll;
@@ -148698,17 +157063,19 @@ static void exprAnalyze(
if( pTerm->u.x.iField>0 ){
assert( op==TK_IN );
assert( pLeft->op==TK_VECTOR );
+ assert( ExprUseXList(pLeft) );
pLeft = pLeft->x.pList->a[pTerm->u.x.iField-1].pExpr;
}
- if( exprMightBeIndexed(pSrc, prereqLeft, aiCurCol, pLeft, op) ){
+ if( exprMightBeIndexed(pSrc, aiCurCol, pLeft, op) ){
pTerm->leftCursor = aiCurCol[0];
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
pTerm->u.x.leftColumn = aiCurCol[1];
pTerm->eOperator = operatorMask(op) & opMask;
}
if( op==TK_IS ) pTerm->wtFlags |= TERM_IS;
if( pRight
- && exprMightBeIndexed(pSrc, pTerm->prereqRight, aiCurCol, pRight, op)
+ && exprMightBeIndexed(pSrc, aiCurCol, pRight, op)
&& !ExprHasProperty(pRight, EP_FixedCol)
){
WhereTerm *pNew;
@@ -148740,13 +157107,19 @@ static void exprAnalyze(
}
pNew->wtFlags |= exprCommute(pParse, pDup);
pNew->leftCursor = aiCurCol[0];
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
pNew->u.x.leftColumn = aiCurCol[1];
testcase( (prereqLeft | extraRight) != prereqLeft );
pNew->prereqRight = prereqLeft | extraRight;
pNew->prereqAll = prereqAll;
pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask;
- }else if( op==TK_ISNULL && 0==sqlite3ExprCanBeNull(pLeft) ){
- pExpr->op = TK_TRUEFALSE;
+ }else
+ if( op==TK_ISNULL
+ && !ExprHasProperty(pExpr,EP_OuterON)
+ && 0==sqlite3ExprCanBeNull(pLeft)
+ ){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ pExpr->op = TK_TRUEFALSE; /* See tag-20230504-1 */
pExpr->u.zToken = "false";
ExprSetProperty(pExpr, EP_IsFalse);
pTerm->prereqAll = 0;
@@ -148771,9 +157144,11 @@ static void exprAnalyze(
** BETWEEN term is skipped.
*/
else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){
- ExprList *pList = pExpr->x.pList;
+ ExprList *pList;
int i;
static const u8 ops[] = {TK_GE, TK_LE};
+ assert( ExprUseXList(pExpr) );
+ pList = pExpr->x.pList;
assert( pList!=0 );
assert( pList->nExpr==2 );
for(i=0; i<2; i++){
@@ -148811,7 +157186,7 @@ static void exprAnalyze(
else if( pExpr->op==TK_NOTNULL ){
if( pExpr->pLeft->op==TK_COLUMN
&& pExpr->pLeft->iColumn>=0
- && !ExprHasProperty(pExpr, EP_FromJoin)
+ && !ExprHasProperty(pExpr, EP_OuterON)
){
Expr *pNewExpr;
Expr *pLeft = pExpr->pLeft;
@@ -148866,8 +157241,12 @@ static void exprAnalyze(
const char *zCollSeqName; /* Name of collating sequence */
const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC;
+ assert( ExprUseXList(pExpr) );
pLeft = pExpr->x.pList->a[1].pExpr;
pStr2 = sqlite3ExprDup(db, pStr1, 0);
+ assert( pStr1==0 || !ExprHasProperty(pStr1, EP_IntValue) );
+ assert( pStr2==0 || !ExprHasProperty(pStr2, EP_IntValue) );
+
/* Convert the lower bound to upper-case and the upper bound to
** lower-case (upper-case is less than lower-case in ASCII) so that
@@ -148907,7 +157286,6 @@ static void exprAnalyze(
transferJoinMarkings(pNewExpr1, pExpr);
idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags);
testcase( idxNew1==0 );
- exprAnalyze(pSrc, pWC, idxNew1);
pNewExpr2 = sqlite3ExprDup(db, pLeft, 0);
pNewExpr2 = sqlite3PExpr(pParse, TK_LT,
sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName),
@@ -148915,6 +157293,7 @@ static void exprAnalyze(
transferJoinMarkings(pNewExpr2, pExpr);
idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags);
testcase( idxNew2==0 );
+ exprAnalyze(pSrc, pWC, idxNew1);
exprAnalyze(pSrc, pWC, idxNew2);
pTerm = &pWC->a[idxTerm];
if( isComplete ){
@@ -148930,7 +157309,10 @@ static void exprAnalyze(
** no longer used.
**
** This is only required if at least one side of the comparison operation
- ** is not a sub-select. */
+ ** is not a sub-select.
+ **
+ ** tag-20220128a
+ */
if( (pExpr->op==TK_EQ || pExpr->op==TK_IS)
&& (nLeft = sqlite3ExprVectorSize(pExpr->pLeft))>1
&& sqlite3ExprVectorSize(pExpr->pRight)==nLeft
@@ -148942,17 +157324,17 @@ static void exprAnalyze(
for(i=0; i<nLeft; i++){
int idxNew;
Expr *pNew;
- Expr *pLeft = sqlite3ExprForVectorField(pParse, pExpr->pLeft, i);
- Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i);
+ Expr *pLeft = sqlite3ExprForVectorField(pParse, pExpr->pLeft, i, nLeft);
+ Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i, nLeft);
pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight);
transferJoinMarkings(pNew, pExpr);
- idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC);
+ idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC|TERM_SLICE);
exprAnalyze(pSrc, pWC, idxNew);
}
pTerm = &pWC->a[idxTerm];
pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */
- pTerm->eOperator = 0;
+ pTerm->eOperator = WO_ROWVAL;
}
/* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create
@@ -148967,7 +157349,8 @@ static void exprAnalyze(
else if( pExpr->op==TK_IN
&& pTerm->u.x.iField==0
&& pExpr->pLeft->op==TK_VECTOR
- && pExpr->x.pSelect->pPrior==0
+ && ALWAYS( ExprUseXSelect(pExpr) )
+ && (pExpr->x.pSelect->pPrior==0 || (pExpr->x.pSelect->selFlags & SF_Values))
#ifndef SQLITE_OMIT_WINDOWFUNC
&& pExpr->x.pSelect->pWin==0
#endif
@@ -148976,7 +157359,7 @@ static void exprAnalyze(
int i;
for(i=0; i<sqlite3ExprVectorSize(pExpr->pLeft); i++){
int idxNew;
- idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL);
+ idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL|TERM_SLICE);
pWC->a[idxNew].u.x.iField = i+1;
exprAnalyze(pSrc, pWC, idxNew);
markTermAsChild(pWC, idxNew, idxTerm);
@@ -149007,9 +157390,9 @@ static void exprAnalyze(
Expr *pNewExpr;
pNewExpr = sqlite3PExpr(pParse, TK_MATCH,
0, sqlite3ExprDup(db, pRight, 0));
- if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){
- ExprSetProperty(pNewExpr, EP_FromJoin);
- pNewExpr->iRightJoinTable = pExpr->iRightJoinTable;
+ if( ExprHasProperty(pExpr, EP_OuterON) && pNewExpr ){
+ ExprSetProperty(pNewExpr, EP_OuterON);
+ pNewExpr->w.iJoin = pExpr->w.iJoin;
}
idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
testcase( idxNew==0 );
@@ -149073,6 +157456,120 @@ SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){
}
/*
+** Add either a LIMIT (if eMatchOp==SQLITE_INDEX_CONSTRAINT_LIMIT) or
+** OFFSET (if eMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET) term to the
+** where-clause passed as the first argument. The value for the term
+** is found in register iReg.
+**
+** In the common case where the value is a simple integer
+** (example: "LIMIT 5 OFFSET 10") then the expression codes as a
+** TK_INTEGER so that it will be available to sqlite3_vtab_rhs_value().
+** If not, then it codes as a TK_REGISTER expression.
+*/
+static void whereAddLimitExpr(
+ WhereClause *pWC, /* Add the constraint to this WHERE clause */
+ int iReg, /* Register that will hold value of the limit/offset */
+ Expr *pExpr, /* Expression that defines the limit/offset */
+ int iCsr, /* Cursor to which the constraint applies */
+ int eMatchOp /* SQLITE_INDEX_CONSTRAINT_LIMIT or _OFFSET */
+){
+ Parse *pParse = pWC->pWInfo->pParse;
+ sqlite3 *db = pParse->db;
+ Expr *pNew;
+ int iVal = 0;
+
+ if( sqlite3ExprIsInteger(pExpr, &iVal) && iVal>=0 ){
+ Expr *pVal = sqlite3Expr(db, TK_INTEGER, 0);
+ if( pVal==0 ) return;
+ ExprSetProperty(pVal, EP_IntValue);
+ pVal->u.iValue = iVal;
+ pNew = sqlite3PExpr(pParse, TK_MATCH, 0, pVal);
+ }else{
+ Expr *pVal = sqlite3Expr(db, TK_REGISTER, 0);
+ if( pVal==0 ) return;
+ pVal->iTable = iReg;
+ pNew = sqlite3PExpr(pParse, TK_MATCH, 0, pVal);
+ }
+ if( pNew ){
+ WhereTerm *pTerm;
+ int idx;
+ idx = whereClauseInsert(pWC, pNew, TERM_DYNAMIC|TERM_VIRTUAL);
+ pTerm = &pWC->a[idx];
+ pTerm->leftCursor = iCsr;
+ pTerm->eOperator = WO_AUX;
+ pTerm->eMatchOp = eMatchOp;
+ }
+}
+
+/*
+** Possibly add terms corresponding to the LIMIT and OFFSET clauses of the
+** SELECT statement passed as the second argument. These terms are only
+** added if:
+**
+** 1. The SELECT statement has a LIMIT clause, and
+** 2. The SELECT statement is not an aggregate or DISTINCT query, and
+** 3. The SELECT statement has exactly one object in its from clause, and
+** that object is a virtual table, and
+** 4. There are no terms in the WHERE clause that will not be passed
+** to the virtual table xBestIndex method.
+** 5. The ORDER BY clause, if any, will be made available to the xBestIndex
+** method.
+**
+** LIMIT and OFFSET terms are ignored by most of the planner code. They
+** exist only so that they may be passed to the xBestIndex method of the
+** single virtual table in the FROM clause of the SELECT.
+*/
+SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3WhereAddLimit(WhereClause *pWC, Select *p){
+ assert( p!=0 && p->pLimit!=0 ); /* 1 -- checked by caller */
+ if( p->pGroupBy==0
+ && (p->selFlags & (SF_Distinct|SF_Aggregate))==0 /* 2 */
+ && (p->pSrc->nSrc==1 && IsVirtual(p->pSrc->a[0].pTab)) /* 3 */
+ ){
+ ExprList *pOrderBy = p->pOrderBy;
+ int iCsr = p->pSrc->a[0].iCursor;
+ int ii;
+
+ /* Check condition (4). Return early if it is not met. */
+ for(ii=0; ii<pWC->nTerm; ii++){
+ if( pWC->a[ii].wtFlags & TERM_CODED ){
+ /* This term is a vector operation that has been decomposed into
+ ** other, subsequent terms. It can be ignored. See tag-20220128a */
+ assert( pWC->a[ii].wtFlags & TERM_VIRTUAL );
+ assert( pWC->a[ii].eOperator==WO_ROWVAL );
+ continue;
+ }
+ if( pWC->a[ii].nChild ){
+ /* If this term has child terms, then they are also part of the
+ ** pWC->a[] array. So this term can be ignored, as a LIMIT clause
+ ** will only be added if each of the child terms passes the
+ ** (leftCursor==iCsr) test below. */
+ continue;
+ }
+ if( pWC->a[ii].leftCursor!=iCsr ) return;
+ }
+
+ /* Check condition (5). Return early if it is not met. */
+ if( pOrderBy ){
+ for(ii=0; ii<pOrderBy->nExpr; ii++){
+ Expr *pExpr = pOrderBy->a[ii].pExpr;
+ if( pExpr->op!=TK_COLUMN ) return;
+ if( pExpr->iTable!=iCsr ) return;
+ if( pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) return;
+ }
+ }
+
+ /* All conditions are met. Add the terms to the where-clause object. */
+ assert( p->pLimit->op==TK_LIMIT );
+ whereAddLimitExpr(pWC, p->iLimit, p->pLimit->pLeft,
+ iCsr, SQLITE_INDEX_CONSTRAINT_LIMIT);
+ if( p->iOffset>0 ){
+ whereAddLimitExpr(pWC, p->iOffset, p->pLimit->pRight,
+ iCsr, SQLITE_INDEX_CONSTRAINT_OFFSET);
+ }
+ }
+}
+
+/*
** Initialize a preallocated WhereClause structure.
*/
SQLITE_PRIVATE void sqlite3WhereClauseInit(
@@ -149083,6 +157580,7 @@ SQLITE_PRIVATE void sqlite3WhereClauseInit(
pWC->hasOr = 0;
pWC->pOuter = 0;
pWC->nTerm = 0;
+ pWC->nBase = 0;
pWC->nSlot = ArraySize(pWC->aStatic);
pWC->a = pWC->aStatic;
}
@@ -149093,22 +157591,36 @@ SQLITE_PRIVATE void sqlite3WhereClauseInit(
** sqlite3WhereClauseInit().
*/
SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){
- int i;
- WhereTerm *a;
sqlite3 *db = pWC->pWInfo->pParse->db;
- for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){
- if( a->wtFlags & TERM_DYNAMIC ){
- sqlite3ExprDelete(db, a->pExpr);
+ assert( pWC->nTerm>=pWC->nBase );
+ if( pWC->nTerm>0 ){
+ WhereTerm *a = pWC->a;
+ WhereTerm *aLast = &pWC->a[pWC->nTerm-1];
+#ifdef SQLITE_DEBUG
+ int i;
+ /* Verify that every term past pWC->nBase is virtual */
+ for(i=pWC->nBase; i<pWC->nTerm; i++){
+ assert( (pWC->a[i].wtFlags & TERM_VIRTUAL)!=0 );
}
- if( a->wtFlags & TERM_ORINFO ){
- whereOrInfoDelete(db, a->u.pOrInfo);
- }else if( a->wtFlags & TERM_ANDINFO ){
- whereAndInfoDelete(db, a->u.pAndInfo);
+#endif
+ while(1){
+ assert( a->eMatchOp==0 || a->eOperator==WO_AUX );
+ if( a->wtFlags & TERM_DYNAMIC ){
+ sqlite3ExprDelete(db, a->pExpr);
+ }
+ if( a->wtFlags & (TERM_ORINFO|TERM_ANDINFO) ){
+ if( a->wtFlags & TERM_ORINFO ){
+ assert( (a->wtFlags & TERM_ANDINFO)==0 );
+ whereOrInfoDelete(db, a->u.pOrInfo);
+ }else{
+ assert( (a->wtFlags & TERM_ANDINFO)!=0 );
+ whereAndInfoDelete(db, a->u.pAndInfo);
+ }
+ }
+ if( a==aLast ) break;
+ a++;
}
}
- if( pWC->a!=pWC->aStatic ){
- sqlite3DbFree(db, pWC->a);
- }
}
@@ -149116,28 +157628,52 @@ SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){
** These routines walk (recursively) an expression tree and generate
** a bitmask indicating which tables are used in that expression
** tree.
+**
+** sqlite3WhereExprUsage(MaskSet, Expr) ->
+**
+** Return a Bitmask of all tables referenced by Expr. Expr can be
+** be NULL, in which case 0 is returned.
+**
+** sqlite3WhereExprUsageNN(MaskSet, Expr) ->
+**
+** Same as sqlite3WhereExprUsage() except that Expr must not be
+** NULL. The "NN" suffix on the name stands for "Not Null".
+**
+** sqlite3WhereExprListUsage(MaskSet, ExprList) ->
+**
+** Return a Bitmask of all tables referenced by every expression
+** in the expression list ExprList. ExprList can be NULL, in which
+** case 0 is returned.
+**
+** sqlite3WhereExprUsageFull(MaskSet, ExprList) ->
+**
+** Internal use only. Called only by sqlite3WhereExprUsageNN() for
+** complex expressions that require pushing register values onto
+** the stack. Many calls to sqlite3WhereExprUsageNN() do not need
+** the more complex analysis done by this routine. Hence, the
+** computations done by this routine are broken out into a separate
+** "no-inline" function to avoid the stack push overhead in the
+** common case where it is not needed.
*/
-SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){
+static SQLITE_NOINLINE Bitmask sqlite3WhereExprUsageFull(
+ WhereMaskSet *pMaskSet,
+ Expr *p
+){
Bitmask mask;
- if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){
- return sqlite3WhereGetMask(pMaskSet, p->iTable);
- }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){
- assert( p->op!=TK_IF_NULL_ROW );
- return 0;
- }
mask = (p->op==TK_IF_NULL_ROW) ? sqlite3WhereGetMask(pMaskSet, p->iTable) : 0;
if( p->pLeft ) mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pLeft);
if( p->pRight ){
mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pRight);
assert( p->x.pList==0 );
- }else if( ExprHasProperty(p, EP_xIsSelect) ){
+ }else if( ExprUseXSelect(p) ){
if( ExprHasProperty(p, EP_VarSelect) ) pMaskSet->bVarSelect = 1;
mask |= exprSelectUsage(pMaskSet, p->x.pSelect);
}else if( p->x.pList ){
mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList);
}
#ifndef SQLITE_OMIT_WINDOWFUNC
- if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && p->y.pWin ){
+ if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && ExprUseYWin(p) ){
+ assert( p->y.pWin!=0 );
mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pPartition);
mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pOrderBy);
mask |= sqlite3WhereExprUsage(pMaskSet, p->y.pWin->pFilter);
@@ -149145,6 +157681,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){
#endif
return mask;
}
+SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){
+ if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){
+ return sqlite3WhereGetMask(pMaskSet, p->iTable);
+ }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){
+ assert( p->op!=TK_IF_NULL_ROW );
+ return 0;
+ }
+ return sqlite3WhereExprUsageFull(pMaskSet, p);
+}
SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){
return p ? sqlite3WhereExprUsageNN(pMaskSet,p) : 0;
}
@@ -149202,6 +157747,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(
if( pArgs==0 ) return;
for(j=k=0; j<pArgs->nExpr; j++){
Expr *pRhs;
+ u32 joinType;
while( k<pTab->nCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;}
if( k>=pTab->nCol ){
sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d",
@@ -149212,13 +157758,21 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(
if( pColRef==0 ) return;
pColRef->iTable = pItem->iCursor;
pColRef->iColumn = k++;
+ assert( ExprUseYTab(pColRef) );
pColRef->y.pTab = pTab;
+ pItem->colUsed |= sqlite3ExprColUsed(pColRef);
pRhs = sqlite3PExpr(pParse, TK_UPLUS,
sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0);
pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs);
- if( pItem->fg.jointype & JT_LEFT ){
- sqlite3SetJoinExpr(pTerm, pItem->iCursor);
+ if( pItem->fg.jointype & (JT_LEFT|JT_RIGHT) ){
+ testcase( pItem->fg.jointype & JT_LEFT ); /* testtag-20230227a */
+ testcase( pItem->fg.jointype & JT_RIGHT ); /* testtag-20230227b */
+ joinType = EP_OuterON;
+ }else{
+ testcase( pItem->fg.jointype & JT_LTORJ ); /* testtag-20230227c */
+ joinType = EP_InnerON;
}
+ sqlite3SetJoinExpr(pTerm, pItem->iCursor, joinType);
whereClauseInsert(pWC, pTerm, TERM_DYNAMIC);
}
}
@@ -149257,8 +157811,14 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(
*/
typedef struct HiddenIndexInfo HiddenIndexInfo;
struct HiddenIndexInfo {
- WhereClause *pWC; /* The Where clause being analyzed */
- Parse *pParse; /* The parsing context */
+ WhereClause *pWC; /* The Where clause being analyzed */
+ Parse *pParse; /* The parsing context */
+ int eDistinct; /* Value to return from sqlite3_vtab_distinct() */
+ u32 mIn; /* Mask of terms that are <col> IN (...) */
+ u32 mHandleIn; /* Terms that vtab will handle as <col> IN (...) */
+ sqlite3_value *aRhs[1]; /* RHS values for constraints. MUST BE LAST
+ ** because extra space is allocated to hold up
+ ** to nTerm such values */
};
/* Forward declaration of methods */
@@ -149288,7 +157848,7 @@ SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo *pWInfo){
** block sorting is required.
*/
SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){
- return pWInfo->nOBSat;
+ return pWInfo->nOBSat<0 ? 0 : pWInfo->nOBSat;
}
/*
@@ -149323,7 +157883,7 @@ SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo *pWInfo){
}
pInner = &pWInfo->a[pWInfo->nLevel-1];
assert( pInner->addrNxt!=0 );
- return pInner->addrNxt;
+ return pInner->pRJ ? pWInfo->iContinue : pInner->addrNxt;
}
/*
@@ -149461,7 +158021,12 @@ whereOrInsert_done:
SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){
int i;
assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 );
- for(i=0; i<pMaskSet->n; i++){
+ assert( pMaskSet->n>0 || pMaskSet->ix[0]<0 );
+ assert( iCursor>=-1 );
+ if( pMaskSet->ix[0]==iCursor ){
+ return 1;
+ }
+ for(i=1; i<pMaskSet->n; i++){
if( pMaskSet->ix[i]==iCursor ){
return MASKBIT(i);
}
@@ -149469,6 +158034,30 @@ SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){
return 0;
}
+/* Allocate memory that is automatically freed when pWInfo is freed.
+*/
+SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte){
+ WhereMemBlock *pBlock;
+ pBlock = sqlite3DbMallocRawNN(pWInfo->pParse->db, nByte+sizeof(*pBlock));
+ if( pBlock ){
+ pBlock->pNext = pWInfo->pMemToFree;
+ pBlock->sz = nByte;
+ pWInfo->pMemToFree = pBlock;
+ pBlock++;
+ }
+ return (void*)pBlock;
+}
+SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByte){
+ void *pNew = sqlite3WhereMalloc(pWInfo, nByte);
+ if( pNew && pOld ){
+ WhereMemBlock *pOldBlk = (WhereMemBlock*)pOld;
+ pOldBlk--;
+ assert( pOldBlk->sz<nByte );
+ memcpy(pNew, pOld, pOldBlk->sz);
+ }
+ return pNew;
+}
+
/*
** Create a new mask for cursor iCursor.
**
@@ -149513,14 +158102,16 @@ static WhereTerm *whereScanNext(WhereScan *pScan){
iColumn = pScan->aiColumn[pScan->iEquiv-1];
iCur = pScan->aiCur[pScan->iEquiv-1];
assert( pWC!=0 );
+ assert( iCur>=0 );
do{
for(pTerm=pWC->a+k; k<pWC->nTerm; k++, pTerm++){
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 || pTerm->leftCursor<0 );
if( pTerm->leftCursor==iCur
&& pTerm->u.x.leftColumn==iColumn
&& (iColumn!=XN_EXPR
|| sqlite3ExprCompareSkip(pTerm->pExpr->pLeft,
pScan->pIdxExpr,iCur)==0)
- && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin))
+ && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_OuterON))
){
if( (pTerm->eOperator & WO_EQUIV)!=0
&& pScan->nEquiv<ArraySize(pScan->aiCur)
@@ -149556,7 +158147,8 @@ static WhereTerm *whereScanNext(WhereScan *pScan){
}
}
if( (pTerm->eOperator & (WO_EQ|WO_IS))!=0
- && (pX = pTerm->pExpr->pRight)->op==TK_COLUMN
+ && (pX = pTerm->pExpr->pRight, ALWAYS(pX!=0))
+ && pX->op==TK_COLUMN
&& pX->iTable==pScan->aiCur[0]
&& pX->iColumn==pScan->aiColumn[0]
){
@@ -149643,16 +158235,16 @@ static WhereTerm *whereScanInit(
if( pIdx ){
int j = iColumn;
iColumn = pIdx->aiColumn[j];
- if( iColumn==XN_EXPR ){
- pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr;
- pScan->zCollName = pIdx->azColl[j];
- pScan->aiColumn[0] = XN_EXPR;
- return whereScanInitIndexExpr(pScan);
- }else if( iColumn==pIdx->pTable->iPKey ){
+ if( iColumn==pIdx->pTable->iPKey ){
iColumn = XN_ROWID;
}else if( iColumn>=0 ){
pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity;
pScan->zCollName = pIdx->azColl[j];
+ }else if( iColumn==XN_EXPR ){
+ pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr;
+ pScan->zCollName = pIdx->azColl[j];
+ pScan->aiColumn[0] = XN_EXPR;
+ return whereScanInitIndexExpr(pScan);
}
}else if( iColumn==XN_EXPR ){
return 0;
@@ -149871,6 +158463,7 @@ static void translateColumnToCopy(
pOp->p1 = pOp->p2 + iRegister;
pOp->p2 = pOp->p3;
pOp->p3 = 0;
+ pOp->p5 = 2; /* Cause the MEM_Subtype flag to be cleared */
}else if( pOp->opcode==OP_Rowid ){
pOp->opcode = OP_Sequence;
pOp->p1 = iAutoidxCur;
@@ -149893,14 +158486,16 @@ static void translateColumnToCopy(
#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED)
static void whereTraceIndexInfoInputs(sqlite3_index_info *p){
int i;
- if( !sqlite3WhereTrace ) return;
+ if( (sqlite3WhereTrace & 0x10)==0 ) return;
for(i=0; i<p->nConstraint; i++){
- sqlite3DebugPrintf(" constraint[%d]: col=%d termid=%d op=%d usabled=%d\n",
+ sqlite3DebugPrintf(
+ " constraint[%d]: col=%d termid=%d op=%d usabled=%d collseq=%s\n",
i,
p->aConstraint[i].iColumn,
p->aConstraint[i].iTermOffset,
p->aConstraint[i].op,
- p->aConstraint[i].usable);
+ p->aConstraint[i].usable,
+ sqlite3_vtab_collation(p,i));
}
for(i=0; i<p->nOrderBy; i++){
sqlite3DebugPrintf(" orderby[%d]: col=%d desc=%d\n",
@@ -149911,7 +158506,7 @@ static void whereTraceIndexInfoInputs(sqlite3_index_info *p){
}
static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){
int i;
- if( !sqlite3WhereTrace ) return;
+ if( (sqlite3WhereTrace & 0x10)==0 ) return;
for(i=0; i<p->nConstraint; i++){
sqlite3DebugPrintf(" usage[%d]: argvIdx=%d omit=%d\n",
i,
@@ -149929,6 +158524,43 @@ static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){
#define whereTraceIndexInfoOutputs(A)
#endif
+/*
+** We know that pSrc is an operand of an outer join. Return true if
+** pTerm is a constraint that is compatible with that join.
+**
+** pTerm must be EP_OuterON if pSrc is the right operand of an
+** outer join. pTerm can be either EP_OuterON or EP_InnerON if pSrc
+** is the left operand of a RIGHT join.
+**
+** See https://sqlite.org/forum/forumpost/206d99a16dd9212f
+** for an example of a WHERE clause constraints that may not be used on
+** the right table of a RIGHT JOIN because the constraint implies a
+** not-NULL condition on the left table of the RIGHT JOIN.
+*/
+static int constraintCompatibleWithOuterJoin(
+ const WhereTerm *pTerm, /* WHERE clause term to check */
+ const SrcItem *pSrc /* Table we are trying to access */
+){
+ assert( (pSrc->fg.jointype&(JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ); /* By caller */
+ testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT );
+ testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ );
+ testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) )
+ testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) );
+ if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON)
+ || pTerm->pExpr->w.iJoin != pSrc->iCursor
+ ){
+ return 0;
+ }
+ if( (pSrc->fg.jointype & (JT_LEFT|JT_RIGHT))!=0
+ && ExprHasProperty(pTerm->pExpr, EP_InnerON)
+ ){
+ return 0;
+ }
+ return 1;
+}
+
+
+
#ifndef SQLITE_OMIT_AUTOMATIC_INDEX
/*
** Return TRUE if the WHERE clause term pTerm is of a form where it
@@ -149936,23 +158568,21 @@ static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){
** index existed.
*/
static int termCanDriveIndex(
- WhereTerm *pTerm, /* WHERE clause term to check */
- SrcItem *pSrc, /* Table we are trying to access */
- Bitmask notReady /* Tables in outer loops of the join */
+ const WhereTerm *pTerm, /* WHERE clause term to check */
+ const SrcItem *pSrc, /* Table we are trying to access */
+ const Bitmask notReady /* Tables in outer loops of the join */
){
char aff;
if( pTerm->leftCursor!=pSrc->iCursor ) return 0;
if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0;
- if( (pSrc->fg.jointype & JT_LEFT)
- && !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
- && (pTerm->eOperator & WO_IS)
+ assert( (pSrc->fg.jointype & JT_RIGHT)==0 );
+ if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0
+ && !constraintCompatibleWithOuterJoin(pTerm,pSrc)
){
- /* Cannot use an IS term from the WHERE clause as an index driver for
- ** the RHS of a LEFT JOIN. Such a term can only be used if it is from
- ** the ON clause. */
- return 0;
+ return 0; /* See https://sqlite.org/forum/forumpost/51e6959f61 */
}
if( (pTerm->prereqRight & notReady)!=0 ) return 0;
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
if( pTerm->u.x.leftColumn<0 ) return 0;
aff = pSrc->pTab->aCol[pTerm->u.x.leftColumn].affinity;
if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0;
@@ -149963,16 +158593,66 @@ static int termCanDriveIndex(
#ifndef SQLITE_OMIT_AUTOMATIC_INDEX
+
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+/*
+** Argument pIdx represents an automatic index that the current statement
+** will create and populate. Add an OP_Explain with text of the form:
+**
+** CREATE AUTOMATIC INDEX ON <table>(<cols>) [WHERE <expr>]
+**
+** This is only required if sqlite3_stmt_scanstatus() is enabled, to
+** associate an SQLITE_SCANSTAT_NCYCLE and SQLITE_SCANSTAT_NLOOP
+** values with. In order to avoid breaking legacy code and test cases,
+** the OP_Explain is not added if this is an EXPLAIN QUERY PLAN command.
+*/
+static void explainAutomaticIndex(
+ Parse *pParse,
+ Index *pIdx, /* Automatic index to explain */
+ int bPartial, /* True if pIdx is a partial index */
+ int *pAddrExplain /* OUT: Address of OP_Explain */
+){
+ if( IS_STMT_SCANSTATUS(pParse->db) && pParse->explain!=2 ){
+ Table *pTab = pIdx->pTable;
+ const char *zSep = "";
+ char *zText = 0;
+ int ii = 0;
+ sqlite3_str *pStr = sqlite3_str_new(pParse->db);
+ sqlite3_str_appendf(pStr,"CREATE AUTOMATIC INDEX ON %s(", pTab->zName);
+ assert( pIdx->nColumn>1 );
+ assert( pIdx->aiColumn[pIdx->nColumn-1]==XN_ROWID );
+ for(ii=0; ii<(pIdx->nColumn-1); ii++){
+ const char *zName = 0;
+ int iCol = pIdx->aiColumn[ii];
+
+ zName = pTab->aCol[iCol].zCnName;
+ sqlite3_str_appendf(pStr, "%s%s", zSep, zName);
+ zSep = ", ";
+ }
+ zText = sqlite3_str_finish(pStr);
+ if( zText==0 ){
+ sqlite3OomFault(pParse->db);
+ }else{
+ *pAddrExplain = sqlite3VdbeExplain(
+ pParse, 0, "%s)%s", zText, (bPartial ? " WHERE <expr>" : "")
+ );
+ sqlite3_free(zText);
+ }
+ }
+}
+#else
+# define explainAutomaticIndex(a,b,c,d)
+#endif
+
/*
** Generate code to construct the Index object for an automatic index
** and to set up the WhereLevel object pLevel so that the code generator
** makes use of the automatic index.
*/
-static void constructAutomaticIndex(
+static SQLITE_NOINLINE void constructAutomaticIndex(
Parse *pParse, /* The parsing context */
WhereClause *pWC, /* The WHERE clause */
- SrcItem *pSrc, /* The FROM clause term to get the next index */
- Bitmask notReady, /* Mask of cursors that are not available */
+ const Bitmask notReady, /* Mask of cursors that are not available */
WhereLevel *pLevel /* Write new index here */
){
int nKeyCol; /* Number of columns in the constructed index */
@@ -149992,12 +158672,17 @@ static void constructAutomaticIndex(
char *zNotUsed; /* Extra space on the end of pIdx */
Bitmask idxCols; /* Bitmap of columns used for indexing */
Bitmask extraCols; /* Bitmap of additional columns */
- u8 sentWarning = 0; /* True if a warnning has been issued */
+ u8 sentWarning = 0; /* True if a warning has been issued */
+ u8 useBloomFilter = 0; /* True to also add a Bloom filter */
Expr *pPartial = 0; /* Partial Index Expression */
int iContinue = 0; /* Jump here to skip excluded rows */
- SrcItem *pTabItem; /* FROM clause term being indexed */
+ SrcList *pTabList; /* The complete FROM clause */
+ SrcItem *pSrc; /* The FROM clause term to get the next index */
int addrCounter = 0; /* Address where integer counter is initialized */
int regBase; /* Array of registers where record is assembled */
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
+ int addrExp = 0; /* Address of OP_Explain */
+#endif
/* Generate code to skip over the creation and initialization of the
** transient index on 2nd and subsequent iterations of the loop. */
@@ -150008,31 +158693,35 @@ static void constructAutomaticIndex(
/* Count the number of columns that will be added to the index
** and used to match WHERE clause constraints */
nKeyCol = 0;
+ pTabList = pWC->pWInfo->pTabList;
+ pSrc = &pTabList->a[pLevel->iFrom];
pTable = pSrc->pTab;
pWCEnd = &pWC->a[pWC->nTerm];
pLoop = pLevel->pWLoop;
idxCols = 0;
for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
Expr *pExpr = pTerm->pExpr;
- assert( !ExprHasProperty(pExpr, EP_FromJoin) /* prereq always non-zero */
- || pExpr->iRightJoinTable!=pSrc->iCursor /* for the right-hand */
- || pLoop->prereq!=0 ); /* table of a LEFT JOIN */
- if( pLoop->prereq==0
- && (pTerm->wtFlags & TERM_VIRTUAL)==0
- && !ExprHasProperty(pExpr, EP_FromJoin)
- && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) ){
+ /* Make the automatic index a partial index if there are terms in the
+ ** WHERE clause (or the ON clause of a LEFT join) that constrain which
+ ** rows of the target table (pSrc) that can be used. */
+ if( (pTerm->wtFlags & TERM_VIRTUAL)==0
+ && sqlite3ExprIsSingleTableConstraint(pExpr, pTabList, pLevel->iFrom)
+ ){
pPartial = sqlite3ExprAnd(pParse, pPartial,
sqlite3ExprDup(pParse->db, pExpr, 0));
}
if( termCanDriveIndex(pTerm, pSrc, notReady) ){
- int iCol = pTerm->u.x.leftColumn;
- Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
+ int iCol;
+ Bitmask cMask;
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
+ iCol = pTerm->u.x.leftColumn;
+ cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
testcase( iCol==BMS );
testcase( iCol==BMS-1 );
if( !sentWarning ){
sqlite3_log(SQLITE_WARNING_AUTOINDEX,
"automatic index on %s(%s)", pTable->zName,
- pTable->aCol[iCol].zName);
+ pTable->aCol[iCol].zCnName);
sentWarning = 1;
}
if( (idxCols & cMask)==0 ){
@@ -150057,7 +158746,11 @@ static void constructAutomaticIndex(
** original table changes and the index and table cannot both be used
** if they go out of sync.
*/
- extraCols = pSrc->colUsed & (~idxCols | MASKBIT(BMS-1));
+ if( IsView(pTable) ){
+ extraCols = ALLBITS;
+ }else{
+ extraCols = pSrc->colUsed & (~idxCols | MASKBIT(BMS-1));
+ }
mxBitCol = MIN(BMS-1,pTable->nCol);
testcase( pTable->nCol==BMS-1 );
testcase( pTable->nCol==BMS-2 );
@@ -150078,8 +158771,11 @@ static void constructAutomaticIndex(
idxCols = 0;
for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
if( termCanDriveIndex(pTerm, pSrc, notReady) ){
- int iCol = pTerm->u.x.leftColumn;
- Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
+ int iCol;
+ Bitmask cMask;
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
+ iCol = pTerm->u.x.leftColumn;
+ cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
testcase( iCol==BMS-1 );
testcase( iCol==BMS );
if( (idxCols & cMask)==0 ){
@@ -150090,6 +158786,16 @@ static void constructAutomaticIndex(
assert( pColl!=0 || pParse->nErr>0 ); /* TH3 collate01.800 */
pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY;
n++;
+ if( ALWAYS(pX->pLeft!=0)
+ && sqlite3ExprAffinity(pX->pLeft)!=SQLITE_AFF_TEXT
+ ){
+ /* TUNING: only use a Bloom filter on an automatic index
+ ** if one or more key columns has the ability to hold numeric
+ ** values, since strings all have the same hash in the Bloom
+ ** filter implementation and hence a Bloom filter on a text column
+ ** is not usually helpful. */
+ useBloomFilter = 1;
+ }
}
}
}
@@ -150116,21 +158822,27 @@ static void constructAutomaticIndex(
pIdx->azColl[n] = sqlite3StrBINARY;
/* Create the automatic index */
+ explainAutomaticIndex(pParse, pIdx, pPartial!=0, &addrExp);
assert( pLevel->iIdxCur>=0 );
pLevel->iIdxCur = pParse->nTab++;
sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol+1);
sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
VdbeComment((v, "for %s", pTable->zName));
+ if( OptimizationEnabled(pParse->db, SQLITE_BloomFilter) && useBloomFilter ){
+ sqlite3WhereExplainBloomFilter(pParse, pWC->pWInfo, pLevel);
+ pLevel->regFilter = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Blob, 10000, pLevel->regFilter);
+ }
/* Fill the automatic index with content */
- pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom];
- if( pTabItem->fg.viaCoroutine ){
- int regYield = pTabItem->regReturn;
+ assert( pSrc == &pWC->pWInfo->pTabList->a[pLevel->iFrom] );
+ if( pSrc->fg.viaCoroutine ){
+ int regYield = pSrc->regReturn;
addrCounter = sqlite3VdbeAddOp2(v, OP_Integer, 0, 0);
- sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub);
+ sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pSrc->addrFillSub);
addrTop = sqlite3VdbeAddOp1(v, OP_Yield, regYield);
VdbeCoverage(v);
- VdbeComment((v, "next row of %s", pTabItem->pTab->zName));
+ VdbeComment((v, "next row of %s", pSrc->pTab->zName));
}else{
addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v);
}
@@ -150143,17 +158855,22 @@ static void constructAutomaticIndex(
regBase = sqlite3GenerateIndexKey(
pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0
);
+ if( pLevel->regFilter ){
+ sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0,
+ regBase, pLoop->u.btree.nEq);
+ }
+ sqlite3VdbeScanStatusCounters(v, addrExp, addrExp, sqlite3VdbeCurrentAddr(v));
sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord);
sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
if( pPartial ) sqlite3VdbeResolveLabel(v, iContinue);
- if( pTabItem->fg.viaCoroutine ){
+ if( pSrc->fg.viaCoroutine ){
sqlite3VdbeChangeP2(v, addrCounter, regBase+n);
testcase( pParse->db->mallocFailed );
assert( pLevel->iIdxCur>0 );
translateColumnToCopy(pParse, addrTop, pLevel->iTabCur,
- pTabItem->regResult, pLevel->iIdxCur);
+ pSrc->regResult, pLevel->iIdxCur);
sqlite3VdbeGoto(v, addrTop);
- pTabItem->fg.viaCoroutine = 0;
+ pSrc->fg.viaCoroutine = 0;
}else{
sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v);
sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX);
@@ -150163,28 +158880,164 @@ static void constructAutomaticIndex(
/* Jump here when skipping the initialization */
sqlite3VdbeJumpHere(v, addrInit);
+ sqlite3VdbeScanStatusRange(v, addrExp, addrExp, -1);
end_auto_index_create:
sqlite3ExprDelete(pParse->db, pPartial);
}
#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */
+/*
+** Generate bytecode that will initialize a Bloom filter that is appropriate
+** for pLevel.
+**
+** If there are inner loops within pLevel that have the WHERE_BLOOMFILTER
+** flag set, initialize a Bloomfilter for them as well. Except don't do
+** this recursive initialization if the SQLITE_BloomPulldown optimization has
+** been turned off.
+**
+** When the Bloom filter is initialized, the WHERE_BLOOMFILTER flag is cleared
+** from the loop, but the regFilter value is set to a register that implements
+** the Bloom filter. When regFilter is positive, the
+** sqlite3WhereCodeOneLoopStart() will generate code to test the Bloom filter
+** and skip the subsequence B-Tree seek if the Bloom filter indicates that
+** no matching rows exist.
+**
+** This routine may only be called if it has previously been determined that
+** the loop would benefit from a Bloom filter, and the WHERE_BLOOMFILTER bit
+** is set.
+*/
+static SQLITE_NOINLINE void sqlite3ConstructBloomFilter(
+ WhereInfo *pWInfo, /* The WHERE clause */
+ int iLevel, /* Index in pWInfo->a[] that is pLevel */
+ WhereLevel *pLevel, /* Make a Bloom filter for this FROM term */
+ Bitmask notReady /* Loops that are not ready */
+){
+ int addrOnce; /* Address of opening OP_Once */
+ int addrTop; /* Address of OP_Rewind */
+ int addrCont; /* Jump here to skip a row */
+ const WhereTerm *pTerm; /* For looping over WHERE clause terms */
+ const WhereTerm *pWCEnd; /* Last WHERE clause term */
+ Parse *pParse = pWInfo->pParse; /* Parsing context */
+ Vdbe *v = pParse->pVdbe; /* VDBE under construction */
+ WhereLoop *pLoop = pLevel->pWLoop; /* The loop being coded */
+ int iCur; /* Cursor for table getting the filter */
+ IndexedExpr *saved_pIdxEpr; /* saved copy of Parse.pIdxEpr */
+
+ saved_pIdxEpr = pParse->pIdxEpr;
+ pParse->pIdxEpr = 0;
+
+ assert( pLoop!=0 );
+ assert( v!=0 );
+ assert( pLoop->wsFlags & WHERE_BLOOMFILTER );
+
+ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
+ do{
+ const SrcList *pTabList;
+ const SrcItem *pItem;
+ const Table *pTab;
+ u64 sz;
+ int iSrc;
+ sqlite3WhereExplainBloomFilter(pParse, pWInfo, pLevel);
+ addrCont = sqlite3VdbeMakeLabel(pParse);
+ iCur = pLevel->iTabCur;
+ pLevel->regFilter = ++pParse->nMem;
+
+ /* The Bloom filter is a Blob held in a register. Initialize it
+ ** to zero-filled blob of at least 80K bits, but maybe more if the
+ ** estimated size of the table is larger. We could actually
+ ** measure the size of the table at run-time using OP_Count with
+ ** P3==1 and use that value to initialize the blob. But that makes
+ ** testing complicated. By basing the blob size on the value in the
+ ** sqlite_stat1 table, testing is much easier.
+ */
+ pTabList = pWInfo->pTabList;
+ iSrc = pLevel->iFrom;
+ pItem = &pTabList->a[iSrc];
+ assert( pItem!=0 );
+ pTab = pItem->pTab;
+ assert( pTab!=0 );
+ sz = sqlite3LogEstToInt(pTab->nRowLogEst);
+ if( sz<10000 ){
+ sz = 10000;
+ }else if( sz>10000000 ){
+ sz = 10000000;
+ }
+ sqlite3VdbeAddOp2(v, OP_Blob, (int)sz, pLevel->regFilter);
+
+ addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v);
+ pWCEnd = &pWInfo->sWC.a[pWInfo->sWC.nTerm];
+ for(pTerm=pWInfo->sWC.a; pTerm<pWCEnd; pTerm++){
+ Expr *pExpr = pTerm->pExpr;
+ if( (pTerm->wtFlags & TERM_VIRTUAL)==0
+ && sqlite3ExprIsSingleTableConstraint(pExpr, pTabList, iSrc)
+ ){
+ sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL);
+ }
+ }
+ if( pLoop->wsFlags & WHERE_IPK ){
+ int r1 = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp2(v, OP_Rowid, iCur, r1);
+ sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, r1, 1);
+ sqlite3ReleaseTempReg(pParse, r1);
+ }else{
+ Index *pIdx = pLoop->u.btree.pIndex;
+ int n = pLoop->u.btree.nEq;
+ int r1 = sqlite3GetTempRange(pParse, n);
+ int jj;
+ for(jj=0; jj<n; jj++){
+ assert( pIdx->pTable==pItem->pTab );
+ sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iCur, jj, r1+jj);
+ }
+ sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, r1, n);
+ sqlite3ReleaseTempRange(pParse, r1, n);
+ }
+ sqlite3VdbeResolveLabel(v, addrCont);
+ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1);
+ VdbeCoverage(v);
+ sqlite3VdbeJumpHere(v, addrTop);
+ pLoop->wsFlags &= ~WHERE_BLOOMFILTER;
+ if( OptimizationDisabled(pParse->db, SQLITE_BloomPulldown) ) break;
+ while( ++iLevel < pWInfo->nLevel ){
+ const SrcItem *pTabItem;
+ pLevel = &pWInfo->a[iLevel];
+ pTabItem = &pWInfo->pTabList->a[pLevel->iFrom];
+ if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ) ) continue;
+ pLoop = pLevel->pWLoop;
+ if( NEVER(pLoop==0) ) continue;
+ if( pLoop->prereq & notReady ) continue;
+ if( (pLoop->wsFlags & (WHERE_BLOOMFILTER|WHERE_COLUMN_IN))
+ ==WHERE_BLOOMFILTER
+ ){
+ /* This is a candidate for bloom-filter pull-down (early evaluation).
+ ** The test that WHERE_COLUMN_IN is omitted is important, as we are
+ ** not able to do early evaluation of bloom filters that make use of
+ ** the IN operator */
+ break;
+ }
+ }
+ }while( iLevel < pWInfo->nLevel );
+ sqlite3VdbeJumpHere(v, addrOnce);
+ pParse->pIdxEpr = saved_pIdxEpr;
+}
+
+
#ifndef SQLITE_OMIT_VIRTUALTABLE
/*
** Allocate and populate an sqlite3_index_info structure. It is the
** responsibility of the caller to eventually release the structure
-** by passing the pointer returned by this function to sqlite3_free().
+** by passing the pointer returned by this function to freeIndexInfo().
*/
static sqlite3_index_info *allocateIndexInfo(
- Parse *pParse, /* The parsing context */
+ WhereInfo *pWInfo, /* The WHERE clause */
WhereClause *pWC, /* The WHERE clause being analyzed */
Bitmask mUnusable, /* Ignore terms with these prereqs */
SrcItem *pSrc, /* The FROM clause term that is the vtab */
- ExprList *pOrderBy, /* The ORDER BY clause */
u16 *pmNoOmit /* Mask of terms not to omit */
){
int i, j;
int nTerm;
+ Parse *pParse = pWInfo->pParse;
struct sqlite3_index_constraint *pIdxCons;
struct sqlite3_index_orderby *pIdxOrderBy;
struct sqlite3_index_constraint_usage *pUsage;
@@ -150193,10 +159046,21 @@ static sqlite3_index_info *allocateIndexInfo(
int nOrderBy;
sqlite3_index_info *pIdxInfo;
u16 mNoOmit = 0;
+ const Table *pTab;
+ int eDistinct = 0;
+ ExprList *pOrderBy = pWInfo->pOrderBy;
- /* Count the number of possible WHERE clause constraints referring
- ** to this virtual table */
+ assert( pSrc!=0 );
+ pTab = pSrc->pTab;
+ assert( pTab!=0 );
+ assert( IsVirtual(pTab) );
+
+ /* Find all WHERE clause constraints referring to this virtual table.
+ ** Mark each term with the TERM_OK flag. Set nTerm to the number of
+ ** terms found.
+ */
for(i=nTerm=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
+ pTerm->wtFlags &= ~TERM_OK;
if( pTerm->leftCursor != pSrc->iCursor ) continue;
if( pTerm->prereqRight & mUnusable ) continue;
assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) );
@@ -150206,8 +159070,17 @@ static sqlite3_index_info *allocateIndexInfo(
testcase( pTerm->eOperator & WO_ALL );
if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue;
if( pTerm->wtFlags & TERM_VNULL ) continue;
- assert( pTerm->u.x.leftColumn>=(-1) );
+
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
+ assert( pTerm->u.x.leftColumn>=XN_ROWID );
+ assert( pTerm->u.x.leftColumn<pTab->nCol );
+ if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0
+ && !constraintCompatibleWithOuterJoin(pTerm,pSrc)
+ ){
+ continue;
+ }
nTerm++;
+ pTerm->wtFlags |= TERM_OK;
}
/* If the ORDER BY clause contains only columns in the current
@@ -150219,11 +159092,49 @@ static sqlite3_index_info *allocateIndexInfo(
int n = pOrderBy->nExpr;
for(i=0; i<n; i++){
Expr *pExpr = pOrderBy->a[i].pExpr;
- if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break;
- if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break;
+ Expr *pE2;
+
+ /* Skip over constant terms in the ORDER BY clause */
+ if( sqlite3ExprIsConstant(pExpr) ){
+ continue;
+ }
+
+ /* Virtual tables are unable to deal with NULLS FIRST */
+ if( pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) break;
+
+ /* First case - a direct column references without a COLLATE operator */
+ if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){
+ assert( pExpr->iColumn>=XN_ROWID && pExpr->iColumn<pTab->nCol );
+ continue;
+ }
+
+ /* 2nd case - a column reference with a COLLATE operator. Only match
+ ** of the COLLATE operator matches the collation of the column. */
+ if( pExpr->op==TK_COLLATE
+ && (pE2 = pExpr->pLeft)->op==TK_COLUMN
+ && pE2->iTable==pSrc->iCursor
+ ){
+ const char *zColl; /* The collating sequence name */
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ assert( pExpr->u.zToken!=0 );
+ assert( pE2->iColumn>=XN_ROWID && pE2->iColumn<pTab->nCol );
+ pExpr->iColumn = pE2->iColumn;
+ if( pE2->iColumn<0 ) continue; /* Collseq does not matter for rowid */
+ zColl = sqlite3ColumnColl(&pTab->aCol[pE2->iColumn]);
+ if( zColl==0 ) zColl = sqlite3StrBINARY;
+ if( sqlite3_stricmp(pExpr->u.zToken, zColl)==0 ) continue;
+ }
+
+ /* No matches cause a break out of the loop */
+ break;
}
- if( i==n){
+ if( i==n ){
nOrderBy = n;
+ if( (pWInfo->wctrlFlags & WHERE_DISTINCTBY) ){
+ eDistinct = 2 + ((pWInfo->wctrlFlags & WHERE_SORTBYGROUP)!=0);
+ }else if( pWInfo->wctrlFlags & WHERE_GROUPBY ){
+ eDistinct = 1;
+ }
}
}
@@ -150231,46 +159142,35 @@ static sqlite3_index_info *allocateIndexInfo(
*/
pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo)
+ (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm
- + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) );
+ + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden)
+ + sizeof(sqlite3_value*)*nTerm );
if( pIdxInfo==0 ){
sqlite3ErrorMsg(pParse, "out of memory");
return 0;
}
pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1];
- pIdxCons = (struct sqlite3_index_constraint*)&pHidden[1];
+ pIdxCons = (struct sqlite3_index_constraint*)&pHidden->aRhs[nTerm];
pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm];
pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy];
- pIdxInfo->nOrderBy = nOrderBy;
pIdxInfo->aConstraint = pIdxCons;
pIdxInfo->aOrderBy = pIdxOrderBy;
pIdxInfo->aConstraintUsage = pUsage;
pHidden->pWC = pWC;
pHidden->pParse = pParse;
+ pHidden->eDistinct = eDistinct;
+ pHidden->mIn = 0;
for(i=j=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
u16 op;
- if( pTerm->leftCursor != pSrc->iCursor ) continue;
- if( pTerm->prereqRight & mUnusable ) continue;
- assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) );
- testcase( pTerm->eOperator & WO_IN );
- testcase( pTerm->eOperator & WO_IS );
- testcase( pTerm->eOperator & WO_ISNULL );
- testcase( pTerm->eOperator & WO_ALL );
- if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue;
- if( pTerm->wtFlags & TERM_VNULL ) continue;
-
- /* tag-20191211-002: WHERE-clause constraints are not useful to the
- ** right-hand table of a LEFT JOIN. See tag-20191211-001 for the
- ** equivalent restriction for ordinary tables. */
- if( (pSrc->fg.jointype & JT_LEFT)!=0
- && !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
- ){
- continue;
- }
- assert( pTerm->u.x.leftColumn>=(-1) );
+ if( (pTerm->wtFlags & TERM_OK)==0 ) continue;
pIdxCons[j].iColumn = pTerm->u.x.leftColumn;
pIdxCons[j].iTermOffset = i;
op = pTerm->eOperator & WO_ALL;
- if( op==WO_IN ) op = WO_EQ;
+ if( op==WO_IN ){
+ if( (pTerm->wtFlags & TERM_SLICE)==0 ){
+ pHidden->mIn |= SMASKBIT32(j);
+ }
+ op = WO_EQ;
+ }
if( op==WO_AUX ){
pIdxCons[j].op = pTerm->eMatchOp;
}else if( op & (WO_ISNULL|WO_IS) ){
@@ -150303,18 +159203,43 @@ static sqlite3_index_info *allocateIndexInfo(
j++;
}
+ assert( j==nTerm );
pIdxInfo->nConstraint = j;
- for(i=0; i<nOrderBy; i++){
+ for(i=j=0; i<nOrderBy; i++){
Expr *pExpr = pOrderBy->a[i].pExpr;
- pIdxOrderBy[i].iColumn = pExpr->iColumn;
- pIdxOrderBy[i].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC;
+ if( sqlite3ExprIsConstant(pExpr) ) continue;
+ assert( pExpr->op==TK_COLUMN
+ || (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN
+ && pExpr->iColumn==pExpr->pLeft->iColumn) );
+ pIdxOrderBy[j].iColumn = pExpr->iColumn;
+ pIdxOrderBy[j].desc = pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC;
+ j++;
}
+ pIdxInfo->nOrderBy = j;
*pmNoOmit = mNoOmit;
return pIdxInfo;
}
/*
+** Free an sqlite3_index_info structure allocated by allocateIndexInfo()
+** and possibly modified by xBestIndex methods.
+*/
+static void freeIndexInfo(sqlite3 *db, sqlite3_index_info *pIdxInfo){
+ HiddenIndexInfo *pHidden;
+ int i;
+ assert( pIdxInfo!=0 );
+ pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
+ assert( pHidden->pParse!=0 );
+ assert( pHidden->pParse->db==db );
+ for(i=0; i<pIdxInfo->nConstraint; i++){
+ sqlite3ValueFree(pHidden->aRhs[i]); /* IMP: R-14553-25174 */
+ pHidden->aRhs[i] = 0;
+ }
+ sqlite3DbFree(db, pIdxInfo);
+}
+
+/*
** The table object reference passed as the second argument to this function
** must represent a virtual table. This function invokes the xBestIndex()
** method of the virtual table with the sqlite3_index_info object that
@@ -150335,7 +159260,9 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){
int rc;
whereTraceIndexInfoInputs(p);
+ pParse->db->nSchemaLock++;
rc = pVtab->pModule->xBestIndex(pVtab, p);
+ pParse->db->nSchemaLock--;
whereTraceIndexInfoOutputs(p);
if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){
@@ -150347,6 +159274,9 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){
sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg);
}
}
+ if( pTab->u.vtab.p->bAllSchemas ){
+ sqlite3VtabUsesAllSchemas(pParse);
+ }
sqlite3_free(pVtab->zErrMsg);
pVtab->zErrMsg = 0;
return rc;
@@ -150389,7 +159319,8 @@ static int whereKeyStats(
#endif
assert( pRec!=0 );
assert( pIdx->nSample>0 );
- assert( pRec->nField>0 && pRec->nField<=pIdx->nSampleCol );
+ assert( pRec->nField>0 );
+
/* Do a binary search to find the first sample greater than or equal
** to pRec. If pRec contains a single field, the set of samples to search
@@ -150435,7 +159366,12 @@ static int whereKeyStats(
** it is extended to two fields. The duplicates that this creates do not
** cause any problems.
*/
- nField = pRec->nField;
+ if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){
+ nField = pIdx->nKeyCol;
+ }else{
+ nField = pIdx->nColumn;
+ }
+ nField = MIN(pRec->nField, nField);
iCol = 0;
iSample = pIdx->nSample * nField;
do{
@@ -150501,12 +159437,12 @@ static int whereKeyStats(
if( iCol>0 ){
pRec->nField = iCol;
assert( sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)<=0
- || pParse->db->mallocFailed );
+ || pParse->db->mallocFailed || CORRUPT_DB );
}
if( i>0 ){
pRec->nField = nField;
assert( sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0
- || pParse->db->mallocFailed );
+ || pParse->db->mallocFailed || CORRUPT_DB );
}
}
}
@@ -150523,7 +159459,7 @@ static int whereKeyStats(
** is larger than all samples in the array. */
tRowcnt iUpper, iGap;
if( i>=pIdx->nSample ){
- iUpper = sqlite3LogEstToInt(pIdx->aiRowLogEst[0]);
+ iUpper = pIdx->nRowEst0;
}else{
iUpper = aSample[i].anLt[iCol];
}
@@ -150679,7 +159615,7 @@ static int whereRangeSkipScanEst(
int nAdjust = (sqlite3LogEst(p->nSample) - sqlite3LogEst(nDiff));
pLoop->nOut -= nAdjust;
*pbDone = 1;
- WHERETRACE(0x10, ("range skip-scan regions: %u..%u adjust=%d est=%d\n",
+ WHERETRACE(0x20, ("range skip-scan regions: %u..%u adjust=%d est=%d\n",
nLower, nUpper, nAdjust*-1, pLoop->nOut));
}
@@ -150857,7 +159793,7 @@ static int whereRangeScanEst(
if( nNew<nOut ){
nOut = nNew;
}
- WHERETRACE(0x10, ("STAT4 range scan: %u..%u est=%d\n",
+ WHERETRACE(0x20, ("STAT4 range scan: %u..%u est=%d\n",
(u32)iLower, (u32)iUpper, nOut));
}
}else{
@@ -150871,7 +159807,7 @@ static int whereRangeScanEst(
UNUSED_PARAMETER(pBuilder);
assert( pLower || pUpper );
#endif
- assert( pUpper==0 || (pUpper->wtFlags & TERM_VNULL)==0 );
+ assert( pUpper==0 || (pUpper->wtFlags & TERM_VNULL)==0 || pParse->nErr>0 );
nNew = whereRangeAdjust(pLower, nOut);
nNew = whereRangeAdjust(pUpper, nNew);
@@ -150890,7 +159826,7 @@ static int whereRangeScanEst(
if( nNew<nOut ) nOut = nNew;
#if defined(WHERETRACE_ENABLED)
if( pLoop->nOut>nOut ){
- WHERETRACE(0x10,("Range scan lowers nOut from %d to %d\n",
+ WHERETRACE(0x20,("Range scan lowers nOut from %d to %d\n",
pLoop->nOut, nOut));
}
#endif
@@ -150955,7 +159891,7 @@ static int whereEqualScanEst(
pBuilder->nRecValid = nEq;
whereKeyStats(pParse, p, pRec, 0, a);
- WHERETRACE(0x10,("equality scan regions %s(%d): %d\n",
+ WHERETRACE(0x20,("equality scan regions %s(%d): %d\n",
p->zName, nEq-1, (int)a[1]));
*pnRow = a[1];
@@ -151003,9 +159939,9 @@ static int whereInScanEst(
}
if( rc==SQLITE_OK ){
- if( nRowEst > nRow0 ) nRowEst = nRow0;
+ if( nRowEst > (tRowcnt)nRow0 ) nRowEst = nRow0;
*pnRow = nRowEst;
- WHERETRACE(0x10,("IN row estimate: est=%d\n", nRowEst));
+ WHERETRACE(0x20,("IN row estimate: est=%d\n", nRowEst));
}
assert( pBuilder->nRecValid==nRecValid );
return rc;
@@ -151026,9 +159962,10 @@ SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){
memcpy(zType, "....", 5);
if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V';
if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E';
- if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L';
+ if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) zType[2] = 'L';
if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C';
if( pTerm->eOperator & WO_SINGLE ){
+ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 );
sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}",
pTerm->leftCursor, pTerm->u.x.leftColumn);
}else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){
@@ -151046,7 +159983,7 @@ SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){
sqlite3DebugPrintf(" prob=%-3d prereq=%llx,%llx",
pTerm->truthProb, (u64)pTerm->prereqAll, (u64)pTerm->prereqRight);
}
- if( pTerm->u.x.iField ){
+ if( (pTerm->eOperator & (WO_OR|WO_AND))==0 && pTerm->u.x.iField ){
sqlite3DebugPrintf(" iField=%d", pTerm->u.x.iField);
}
if( pTerm->iParent>=0 ){
@@ -151108,12 +160045,12 @@ SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){
sqlite3_free(z);
}
if( p->wsFlags & WHERE_SKIPSCAN ){
- sqlite3DebugPrintf(" f %05x %d-%d", p->wsFlags, p->nLTerm,p->nSkip);
+ sqlite3DebugPrintf(" f %06x %d-%d", p->wsFlags, p->nLTerm,p->nSkip);
}else{
- sqlite3DebugPrintf(" f %05x N %d", p->wsFlags, p->nLTerm);
+ sqlite3DebugPrintf(" f %06x N %d", p->wsFlags, p->nLTerm);
}
sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut);
- if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){
+ if( p->nLTerm && (sqlite3WhereTrace & 0x4000)!=0 ){
int i;
for(i=0; i<p->nLTerm; i++){
sqlite3WhereTermPrint(p->aLTerm[i], i);
@@ -151151,12 +160088,18 @@ static void whereLoopClearUnion(sqlite3 *db, WhereLoop *p){
}
/*
-** Deallocate internal memory used by a WhereLoop object
+** Deallocate internal memory used by a WhereLoop object. Leave the
+** object in an initialized state, as if it had been newly allocated.
*/
static void whereLoopClear(sqlite3 *db, WhereLoop *p){
- if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFreeNN(db, p->aLTerm);
+ if( p->aLTerm!=p->aLTermSpace ){
+ sqlite3DbFreeNN(db, p->aLTerm);
+ p->aLTerm = p->aLTermSpace;
+ p->nLSlot = ArraySize(p->aLTermSpace);
+ }
whereLoopClearUnion(db, p);
- whereLoopInit(p);
+ p->nLTerm = 0;
+ p->wsFlags = 0;
}
/*
@@ -151180,7 +160123,9 @@ static int whereLoopResize(sqlite3 *db, WhereLoop *p, int n){
*/
static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){
whereLoopClearUnion(db, pTo);
- if( whereLoopResize(db, pTo, pFrom->nLTerm) ){
+ if( pFrom->nLTerm > pTo->nLSlot
+ && whereLoopResize(db, pTo, pFrom->nLTerm)
+ ){
memset(pTo, 0, WHERE_LOOP_XFER_SZ);
return SQLITE_NOMEM_BKPT;
}
@@ -151198,47 +160143,36 @@ static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){
** Delete a WhereLoop object
*/
static void whereLoopDelete(sqlite3 *db, WhereLoop *p){
+ assert( db!=0 );
whereLoopClear(db, p);
- sqlite3DbFreeNN(db, p);
+ sqlite3DbNNFreeNN(db, p);
}
/*
** Free a WhereInfo structure
*/
static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){
- int i;
assert( pWInfo!=0 );
- for(i=0; i<pWInfo->nLevel; i++){
- WhereLevel *pLevel = &pWInfo->a[i];
- if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE) ){
- sqlite3DbFree(db, pLevel->u.in.aInLoop);
- }
- }
+ assert( db!=0 );
sqlite3WhereClauseClear(&pWInfo->sWC);
while( pWInfo->pLoops ){
WhereLoop *p = pWInfo->pLoops;
pWInfo->pLoops = p->pNextLoop;
whereLoopDelete(db, p);
}
- assert( pWInfo->pExprMods==0 );
- sqlite3DbFreeNN(db, pWInfo);
-}
-
-/* Undo all Expr node modifications
-*/
-static void whereUndoExprMods(WhereInfo *pWInfo){
- while( pWInfo->pExprMods ){
- WhereExprMod *p = pWInfo->pExprMods;
- pWInfo->pExprMods = p->pNext;
- memcpy(p->pExpr, &p->orig, sizeof(p->orig));
- sqlite3DbFree(pWInfo->pParse->db, p);
+ while( pWInfo->pMemToFree ){
+ WhereMemBlock *pNext = pWInfo->pMemToFree->pNext;
+ sqlite3DbNNFreeNN(db, pWInfo->pMemToFree);
+ pWInfo->pMemToFree = pNext;
}
+ sqlite3DbNNFreeNN(db, pWInfo);
}
/*
** Return TRUE if all of the following are true:
**
-** (1) X has the same or lower cost that Y
+** (1) X has the same or lower cost, or returns the same or fewer rows,
+** than Y.
** (2) X uses fewer WHERE clause terms than Y
** (3) Every WHERE clause term used by X is also used by Y
** (4) X skips at least as many columns as Y
@@ -151261,11 +160195,8 @@ static int whereLoopCheaperProperSubset(
if( pX->nLTerm-pX->nSkip >= pY->nLTerm-pY->nSkip ){
return 0; /* X is not a subset of Y */
}
+ if( pX->rRun>pY->rRun && pX->nOut>pY->nOut ) return 0;
if( pY->nSkip > pX->nSkip ) return 0;
- if( pX->rRun >= pY->rRun ){
- if( pX->rRun > pY->rRun ) return 0; /* X costs more than Y */
- if( pX->nOut > pY->nOut ) return 0; /* X costs more than Y */
- }
for(i=pX->nLTerm-1; i>=0; i--){
if( pX->aLTerm[i]==0 ) continue;
for(j=pY->nLTerm-1; j>=0; j--){
@@ -151281,8 +160212,8 @@ static int whereLoopCheaperProperSubset(
}
/*
-** Try to adjust the cost of WhereLoop pTemplate upwards or downwards so
-** that:
+** Try to adjust the cost and number of output rows of WhereLoop pTemplate
+** upwards or downwards so that:
**
** (1) pTemplate costs less than any other WhereLoops that are a proper
** subset of pTemplate
@@ -151303,16 +160234,20 @@ static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){
/* Adjust pTemplate cost downward so that it is cheaper than its
** subset p. */
WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n",
- pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut-1));
- pTemplate->rRun = p->rRun;
- pTemplate->nOut = p->nOut - 1;
+ pTemplate->rRun, pTemplate->nOut,
+ MIN(p->rRun, pTemplate->rRun),
+ MIN(p->nOut - 1, pTemplate->nOut)));
+ pTemplate->rRun = MIN(p->rRun, pTemplate->rRun);
+ pTemplate->nOut = MIN(p->nOut - 1, pTemplate->nOut);
}else if( whereLoopCheaperProperSubset(pTemplate, p) ){
/* Adjust pTemplate cost upward so that it is costlier than p since
** pTemplate is a proper subset of p */
WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n",
- pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut+1));
- pTemplate->rRun = p->rRun;
- pTemplate->nOut = p->nOut + 1;
+ pTemplate->rRun, pTemplate->nOut,
+ MAX(p->rRun, pTemplate->rRun),
+ MAX(p->nOut + 1, pTemplate->nOut)));
+ pTemplate->rRun = MAX(p->rRun, pTemplate->rRun);
+ pTemplate->nOut = MAX(p->nOut + 1, pTemplate->nOut);
}
}
}
@@ -151567,11 +160502,11 @@ static void whereLoopOutputAdjust(
LogEst iReduce = 0; /* pLoop->nOut should not exceed nRow-iReduce */
assert( (pLoop->wsFlags & WHERE_AUTO_INDEX)==0 );
- for(i=pWC->nTerm, pTerm=pWC->a; i>0; i--, pTerm++){
+ for(i=pWC->nBase, pTerm=pWC->a; i>0; i--, pTerm++){
assert( pTerm!=0 );
- if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) break;
- if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue;
if( (pTerm->prereqAll & notAllowed)!=0 ) continue;
+ if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue;
+ if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) continue;
for(j=pLoop->nLTerm-1; j>=0; j--){
pX = pLoop->aLTerm[j];
if( pX==0 ) continue;
@@ -151579,6 +160514,24 @@ static void whereLoopOutputAdjust(
if( pX->iParent>=0 && (&pWC->a[pX->iParent])==pTerm ) break;
}
if( j<0 ){
+ sqlite3ProgressCheck(pWC->pWInfo->pParse);
+ if( pLoop->maskSelf==pTerm->prereqAll ){
+ /* If there are extra terms in the WHERE clause not used by an index
+ ** that depend only on the table being scanned, and that will tend to
+ ** cause many rows to be omitted, then mark that table as
+ ** "self-culling".
+ **
+ ** 2022-03-24: Self-culling only applies if either the extra terms
+ ** are straight comparison operators that are non-true with NULL
+ ** operand, or if the loop is not an OUTER JOIN.
+ */
+ if( (pTerm->eOperator & 0x3f)!=0
+ || (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype
+ & (JT_LEFT|JT_LTORJ))==0
+ ){
+ pLoop->wsFlags |= WHERE_SELFCULL;
+ }
+ }
if( pTerm->truthProb<=0 ){
/* If a truth probability is specified using the likelihood() hints,
** then use the probability provided by the application. */
@@ -151606,7 +160559,9 @@ static void whereLoopOutputAdjust(
}
}
}
- if( pLoop->nOut > nRow-iReduce ) pLoop->nOut = nRow - iReduce;
+ if( pLoop->nOut > nRow-iReduce ){
+ pLoop->nOut = nRow - iReduce;
+ }
}
/*
@@ -151643,9 +160598,12 @@ static int whereRangeVectorLen(
char aff; /* Comparison affinity */
char idxaff = 0; /* Indexed columns affinity */
CollSeq *pColl; /* Comparison collation sequence */
- Expr *pLhs = pTerm->pExpr->pLeft->x.pList->a[i].pExpr;
- Expr *pRhs = pTerm->pExpr->pRight;
- if( pRhs->flags & EP_xIsSelect ){
+ Expr *pLhs, *pRhs;
+
+ assert( ExprUseXList(pTerm->pExpr->pLeft) );
+ pLhs = pTerm->pExpr->pLeft->x.pList->a[i].pExpr;
+ pRhs = pTerm->pExpr->pRight;
+ if( ExprUseXSelect(pRhs) ){
pRhs = pRhs->x.pSelect->pEList->a[i].pExpr;
}else{
pRhs = pRhs->x.pList->a[i].pExpr;
@@ -151724,7 +160682,10 @@ static int whereLoopAddBtreeIndex(
WhereTerm *pTop = 0, *pBtm = 0; /* Top and bottom range constraints */
pNew = pBuilder->pNew;
- if( db->mallocFailed ) return SQLITE_NOMEM_BKPT;
+ assert( db->mallocFailed==0 || pParse->nErr>0 );
+ if( pParse->nErr ){
+ return pParse->rc;
+ }
WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d, nSkip=%d, rRun=%d\n",
pProbe->pTable->zName,pProbe->zName,
pNew->u.btree.nEq, pNew->nSkip, pNew->rRun));
@@ -151775,15 +160736,11 @@ static int whereLoopAddBtreeIndex(
** to mix with a lower range bound from some other source */
if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue;
- /* tag-20191211-001: Do not allow constraints from the WHERE clause to
- ** be used by the right table of a LEFT JOIN. Only constraints in the
- ** ON clause are allowed. See tag-20191211-002 for the vtab equivalent. */
- if( (pSrc->fg.jointype & JT_LEFT)!=0
- && !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
+ if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0
+ && !constraintCompatibleWithOuterJoin(pTerm,pSrc)
){
continue;
}
-
if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){
pBuilder->bldFlags1 |= SQLITE_BLDF1_UNIQUE;
}else{
@@ -151794,7 +160751,11 @@ static int whereLoopAddBtreeIndex(
pNew->u.btree.nBtm = saved_nBtm;
pNew->u.btree.nTop = saved_nTop;
pNew->nLTerm = saved_nLTerm;
- if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */
+ if( pNew->nLTerm>=pNew->nLSlot
+ && whereLoopResize(db, pNew, pNew->nLTerm+1)
+ ){
+ break; /* OOM while trying to enlarge the pNew->aLTerm array */
+ }
pNew->aLTerm[pNew->nLTerm++] = pTerm;
pNew->prereq = (saved_prereq | pTerm->prereqRight) & ~pNew->maskSelf;
@@ -151806,7 +160767,7 @@ static int whereLoopAddBtreeIndex(
if( eOp & WO_IN ){
Expr *pExpr = pTerm->pExpr;
- if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( ExprUseXSelect(pExpr) ){
/* "x IN (SELECT ...)": TUNING: the SELECT returns 25 rows */
int i;
nIn = 46; assert( 46==sqlite3LogEst(25) );
@@ -151887,38 +160848,39 @@ static int whereLoopAddBtreeIndex(
if( scan.iEquiv>1 ) pNew->wsFlags |= WHERE_TRANSCONS;
}else if( eOp & WO_ISNULL ){
pNew->wsFlags |= WHERE_COLUMN_NULL;
- }else if( eOp & (WO_GT|WO_GE) ){
- testcase( eOp & WO_GT );
- testcase( eOp & WO_GE );
- pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_BTM_LIMIT;
- pNew->u.btree.nBtm = whereRangeVectorLen(
- pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm
- );
- pBtm = pTerm;
- pTop = 0;
- if( pTerm->wtFlags & TERM_LIKEOPT ){
- /* Range constraints that come from the LIKE optimization are
- ** always used in pairs. */
- pTop = &pTerm[1];
- assert( (pTop-(pTerm->pWC->a))<pTerm->pWC->nTerm );
- assert( pTop->wtFlags & TERM_LIKEOPT );
- assert( pTop->eOperator==WO_LT );
- if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */
- pNew->aLTerm[pNew->nLTerm++] = pTop;
- pNew->wsFlags |= WHERE_TOP_LIMIT;
- pNew->u.btree.nTop = 1;
- }
- }else{
- assert( eOp & (WO_LT|WO_LE) );
- testcase( eOp & WO_LT );
- testcase( eOp & WO_LE );
- pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_TOP_LIMIT;
- pNew->u.btree.nTop = whereRangeVectorLen(
+ }else{
+ int nVecLen = whereRangeVectorLen(
pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm
);
- pTop = pTerm;
- pBtm = (pNew->wsFlags & WHERE_BTM_LIMIT)!=0 ?
- pNew->aLTerm[pNew->nLTerm-2] : 0;
+ if( eOp & (WO_GT|WO_GE) ){
+ testcase( eOp & WO_GT );
+ testcase( eOp & WO_GE );
+ pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_BTM_LIMIT;
+ pNew->u.btree.nBtm = nVecLen;
+ pBtm = pTerm;
+ pTop = 0;
+ if( pTerm->wtFlags & TERM_LIKEOPT ){
+ /* Range constraints that come from the LIKE optimization are
+ ** always used in pairs. */
+ pTop = &pTerm[1];
+ assert( (pTop-(pTerm->pWC->a))<pTerm->pWC->nTerm );
+ assert( pTop->wtFlags & TERM_LIKEOPT );
+ assert( pTop->eOperator==WO_LT );
+ if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */
+ pNew->aLTerm[pNew->nLTerm++] = pTop;
+ pNew->wsFlags |= WHERE_TOP_LIMIT;
+ pNew->u.btree.nTop = 1;
+ }
+ }else{
+ assert( eOp & (WO_LT|WO_LE) );
+ testcase( eOp & WO_LT );
+ testcase( eOp & WO_LE );
+ pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_TOP_LIMIT;
+ pNew->u.btree.nTop = nVecLen;
+ pTop = pTerm;
+ pBtm = (pNew->wsFlags & WHERE_BTM_LIMIT)!=0 ?
+ pNew->aLTerm[pNew->nLTerm-2] : 0;
+ }
}
/* At this point pNew->nOut is set to the number of rows expected to
@@ -151947,7 +160909,7 @@ static int whereLoopAddBtreeIndex(
if( nInMul==0
&& pProbe->nSample
&& ALWAYS(pNew->u.btree.nEq<=pProbe->nSampleCol)
- && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect))
+ && ((eOp & WO_IN)==0 || ExprUseXList(pTerm->pExpr))
&& OptimizationEnabled(db, SQLITE_Stat4)
){
Expr *pExpr = pTerm->pExpr;
@@ -151970,7 +160932,7 @@ static int whereLoopAddBtreeIndex(
&& pNew->nOut+10 > pProbe->aiRowLogEst[0]
){
#if WHERETRACE_ENABLED /* 0x01 */
- if( sqlite3WhereTrace & 0x01 ){
+ if( sqlite3WhereTrace & 0x20 ){
sqlite3DebugPrintf(
"STAT4 determines term has low selectivity:\n");
sqlite3WhereTermPrint(pTerm, 999);
@@ -152007,9 +160969,17 @@ static int whereLoopAddBtreeIndex(
** seek only. Then, if this is a non-covering index, add the cost of
** visiting the rows in the main table. */
assert( pSrc->pTab->szTabRow>0 );
- rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow;
+ if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){
+ /* The pProbe->szIdxRow is low for an IPK table since the interior
+ ** pages are small. Thuse szIdxRow gives a good estimate of seek cost.
+ ** But the leaf pages are full-size, so pProbe->szIdxRow would badly
+ ** under-estimate the scanning cost. */
+ rCostIdx = pNew->nOut + 16;
+ }else{
+ rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow;
+ }
pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx);
- if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){
+ if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK|WHERE_EXPRIDX))==0 ){
pNew->rRun = sqlite3LogEstAdd(pNew->rRun, pNew->nOut + 16);
}
ApplyCostMultiplier(pNew->rRun, pProbe->pTable->costMult);
@@ -152031,6 +161001,9 @@ static int whereLoopAddBtreeIndex(
&& (pNew->u.btree.nEq<pProbe->nKeyCol ||
pProbe->idxType!=SQLITE_IDXTYPE_PRIMARYKEY)
){
+ if( pNew->u.btree.nEq>3 ){
+ sqlite3ProgressCheck(pParse);
+ }
whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul+nIn);
}
pNew->nOut = saved_nOut;
@@ -152133,23 +161106,26 @@ static int indexMightHelpWithOrderBy(
*/
static int whereUsablePartialIndex(
int iTab, /* The table for which we want an index */
- int isLeft, /* True if iTab is the right table of a LEFT JOIN */
+ u8 jointype, /* The JT_* flags on the join */
WhereClause *pWC, /* The WHERE clause of the query */
Expr *pWhere /* The WHERE clause from the partial index */
){
int i;
WhereTerm *pTerm;
- Parse *pParse = pWC->pWInfo->pParse;
+ Parse *pParse;
+
+ if( jointype & JT_LTORJ ) return 0;
+ pParse = pWC->pWInfo->pParse;
while( pWhere->op==TK_AND ){
- if( !whereUsablePartialIndex(iTab,isLeft,pWC,pWhere->pLeft) ) return 0;
+ if( !whereUsablePartialIndex(iTab,jointype,pWC,pWhere->pLeft) ) return 0;
pWhere = pWhere->pRight;
}
if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0;
for(i=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
Expr *pExpr;
pExpr = pTerm->pExpr;
- if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab)
- && (isLeft==0 || ExprHasProperty(pExpr, EP_FromJoin))
+ if( (!ExprHasProperty(pExpr, EP_OuterON) || pExpr->w.iJoin==iTab)
+ && ((jointype & JT_OUTER)==0 || ExprHasProperty(pExpr, EP_OuterON))
&& sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab)
&& (pTerm->wtFlags & TERM_VNULL)==0
){
@@ -152160,6 +161136,149 @@ static int whereUsablePartialIndex(
}
/*
+** pIdx is an index containing expressions. Check it see if any of the
+** expressions in the index match the pExpr expression.
+*/
+static int exprIsCoveredByIndex(
+ const Expr *pExpr,
+ const Index *pIdx,
+ int iTabCur
+){
+ int i;
+ for(i=0; i<pIdx->nColumn; i++){
+ if( pIdx->aiColumn[i]==XN_EXPR
+ && sqlite3ExprCompare(0, pExpr, pIdx->aColExpr->a[i].pExpr, iTabCur)==0
+ ){
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/*
+** Structure passed to the whereIsCoveringIndex Walker callback.
+*/
+typedef struct CoveringIndexCheck CoveringIndexCheck;
+struct CoveringIndexCheck {
+ Index *pIdx; /* The index */
+ int iTabCur; /* Cursor number for the corresponding table */
+ u8 bExpr; /* Uses an indexed expression */
+ u8 bUnidx; /* Uses an unindexed column not within an indexed expr */
+};
+
+/*
+** Information passed in is pWalk->u.pCovIdxCk. Call it pCk.
+**
+** If the Expr node references the table with cursor pCk->iTabCur, then
+** make sure that column is covered by the index pCk->pIdx. We know that
+** all columns less than 63 (really BMS-1) are covered, so we don't need
+** to check them. But we do need to check any column at 63 or greater.
+**
+** If the index does not cover the column, then set pWalk->eCode to
+** non-zero and return WRC_Abort to stop the search.
+**
+** If this node does not disprove that the index can be a covering index,
+** then just return WRC_Continue, to continue the search.
+**
+** If pCk->pIdx contains indexed expressions and one of those expressions
+** matches pExpr, then prune the search.
+*/
+static int whereIsCoveringIndexWalkCallback(Walker *pWalk, Expr *pExpr){
+ int i; /* Loop counter */
+ const Index *pIdx; /* The index of interest */
+ const i16 *aiColumn; /* Columns contained in the index */
+ u16 nColumn; /* Number of columns in the index */
+ CoveringIndexCheck *pCk; /* Info about this search */
+
+ pCk = pWalk->u.pCovIdxCk;
+ pIdx = pCk->pIdx;
+ if( (pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN) ){
+ /* if( pExpr->iColumn<(BMS-1) && pIdx->bHasExpr==0 ) return WRC_Continue;*/
+ if( pExpr->iTable!=pCk->iTabCur ) return WRC_Continue;
+ pIdx = pWalk->u.pCovIdxCk->pIdx;
+ aiColumn = pIdx->aiColumn;
+ nColumn = pIdx->nColumn;
+ for(i=0; i<nColumn; i++){
+ if( aiColumn[i]==pExpr->iColumn ) return WRC_Continue;
+ }
+ pCk->bUnidx = 1;
+ return WRC_Abort;
+ }else if( pIdx->bHasExpr
+ && exprIsCoveredByIndex(pExpr, pIdx, pWalk->u.pCovIdxCk->iTabCur) ){
+ pCk->bExpr = 1;
+ return WRC_Prune;
+ }
+ return WRC_Continue;
+}
+
+
+/*
+** pIdx is an index that covers all of the low-number columns used by
+** pWInfo->pSelect (columns from 0 through 62) or an index that has
+** expressions terms. Hence, we cannot determine whether or not it is
+** a covering index by using the colUsed bitmasks. We have to do a search
+** to see if the index is covering. This routine does that search.
+**
+** The return value is one of these:
+**
+** 0 The index is definitely not a covering index
+**
+** WHERE_IDX_ONLY The index is definitely a covering index
+**
+** WHERE_EXPRIDX The index is likely a covering index, but it is
+** difficult to determine precisely because of the
+** expressions that are indexed. Score it as a
+** covering index, but still keep the main table open
+** just in case we need it.
+**
+** This routine is an optimization. It is always safe to return zero.
+** But returning one of the other two values when zero should have been
+** returned can lead to incorrect bytecode and assertion faults.
+*/
+static SQLITE_NOINLINE u32 whereIsCoveringIndex(
+ WhereInfo *pWInfo, /* The WHERE clause context */
+ Index *pIdx, /* Index that is being tested */
+ int iTabCur /* Cursor for the table being indexed */
+){
+ int i, rc;
+ struct CoveringIndexCheck ck;
+ Walker w;
+ if( pWInfo->pSelect==0 ){
+ /* We don't have access to the full query, so we cannot check to see
+ ** if pIdx is covering. Assume it is not. */
+ return 0;
+ }
+ if( pIdx->bHasExpr==0 ){
+ for(i=0; i<pIdx->nColumn; i++){
+ if( pIdx->aiColumn[i]>=BMS-1 ) break;
+ }
+ if( i>=pIdx->nColumn ){
+ /* pIdx does not index any columns greater than 62, but we know from
+ ** colMask that columns greater than 62 are used, so this is not a
+ ** covering index */
+ return 0;
+ }
+ }
+ ck.pIdx = pIdx;
+ ck.iTabCur = iTabCur;
+ ck.bExpr = 0;
+ ck.bUnidx = 0;
+ memset(&w, 0, sizeof(w));
+ w.xExprCallback = whereIsCoveringIndexWalkCallback;
+ w.xSelectCallback = sqlite3SelectWalkNoop;
+ w.u.pCovIdxCk = &ck;
+ sqlite3WalkSelect(&w, pWInfo->pSelect);
+ if( ck.bUnidx ){
+ rc = 0;
+ }else if( ck.bExpr ){
+ rc = WHERE_EXPRIDX;
+ }else{
+ rc = WHERE_IDX_ONLY;
+ }
+ return rc;
+}
+
+/*
** Add all WhereLoop objects for a single table of the join where the table
** is identified by pBuilder->pNew->iTab. That table is guaranteed to be
** a b-tree table, not a virtual table.
@@ -152211,7 +161330,6 @@ static int whereLoopAddBtree(
int iSortIdx = 1; /* Index number */
int b; /* A boolean value */
LogEst rSize; /* number of rows in the table */
- LogEst rLogSize; /* Logarithm of the number of rows in the table */
WhereClause *pWC; /* The parsed WHERE clause */
Table *pTab; /* Table being queried */
@@ -152224,6 +161342,7 @@ static int whereLoopAddBtree(
assert( !IsVirtual(pSrc->pTab) );
if( pSrc->fg.isIndexedBy ){
+ assert( pSrc->fg.isCte==0 );
/* An INDEXED BY clause specifies a particular index to use */
pProbe = pSrc->u2.pIBIndex;
}else if( !HasRowid(pTab) ){
@@ -152241,7 +161360,7 @@ static int whereLoopAddBtree(
sPk.aiRowLogEst = aiRowEstPk;
sPk.onError = OE_Replace;
sPk.pTable = pTab;
- sPk.szIdxRow = pTab->szTabRow;
+ sPk.szIdxRow = 3; /* TUNING: Interior rows of IPK table are very small */
sPk.idxType = SQLITE_IDXTYPE_IPK;
aiRowEstPk[0] = pTab->nRowLogEst;
aiRowEstPk[1] = 0;
@@ -152254,22 +161373,24 @@ static int whereLoopAddBtree(
pProbe = &sPk;
}
rSize = pTab->nRowLogEst;
- rLogSize = estLog(rSize);
#ifndef SQLITE_OMIT_AUTOMATIC_INDEX
/* Automatic indexes */
if( !pBuilder->pOrSet /* Not part of an OR optimization */
- && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0
+ && (pWInfo->wctrlFlags & (WHERE_RIGHT_JOIN|WHERE_OR_SUBCLAUSE))==0
&& (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0
&& !pSrc->fg.isIndexedBy /* Has no INDEXED BY clause */
&& !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */
&& HasRowid(pTab) /* Not WITHOUT ROWID table. (FIXME: Why not?) */
&& !pSrc->fg.isCorrelated /* Not a correlated subquery */
&& !pSrc->fg.isRecursive /* Not a recursive common table expression. */
+ && (pSrc->fg.jointype & JT_RIGHT)==0 /* Not the right tab of a RIGHT JOIN */
){
/* Generate auto-index WhereLoops */
+ LogEst rLogSize; /* Logarithm of the number of rows in the table */
WhereTerm *pTerm;
WhereTerm *pWCEnd = pWC->a + pWC->nTerm;
+ rLogSize = estLog(rSize);
for(pTerm=pWC->a; rc==SQLITE_OK && pTerm<pWCEnd; pTerm++){
if( pTerm->prereqRight & pNew->maskSelf ) continue;
if( termCanDriveIndex(pTerm, pSrc, 0) ){
@@ -152287,10 +161408,11 @@ static int whereLoopAddBtree(
** those objects, since there is no opportunity to add schema
** indexes on subqueries and views. */
pNew->rSetup = rLogSize + rSize;
- if( pTab->pSelect==0 && (pTab->tabFlags & TF_Ephemeral)==0 ){
+ if( !IsView(pTab) && (pTab->tabFlags & TF_Ephemeral)==0 ){
pNew->rSetup += 28;
}else{
- pNew->rSetup -= 10;
+ pNew->rSetup -= 25; /* Greatly reduced setup cost for auto indexes
+ ** on ephemeral materializations of views */
}
ApplyCostMultiplier(pNew->rSetup, pTab->costMult);
if( pNew->rSetup<0 ) pNew->rSetup = 0;
@@ -152313,9 +161435,8 @@ static int whereLoopAddBtree(
for(; rc==SQLITE_OK && pProbe;
pProbe=(pSrc->fg.isIndexedBy ? 0 : pProbe->pNext), iSortIdx++
){
- int isLeft = (pSrc->fg.jointype & JT_OUTER)!=0;
if( pProbe->pPartIdxWhere!=0
- && !whereUsablePartialIndex(pSrc->iCursor, isLeft, pWC,
+ && !whereUsablePartialIndex(pSrc->iCursor, pSrc->fg.jointype, pWC,
pProbe->pPartIdxWhere)
){
testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */
@@ -152360,6 +161481,9 @@ static int whereLoopAddBtree(
#else
pNew->rRun = rSize + 16;
#endif
+ if( IsView(pTab) || (pTab->tabFlags & TF_Ephemeral)!=0 ){
+ pNew->wsFlags |= WHERE_VIEWSCAN;
+ }
ApplyCostMultiplier(pNew->rRun, pTab->costMult);
whereLoopOutputAdjust(pWC, pNew, rSize);
rc = whereLoopInsert(pBuilder, pNew);
@@ -152368,11 +161492,38 @@ static int whereLoopAddBtree(
}else{
Bitmask m;
if( pProbe->isCovering ){
- pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED;
m = 0;
+ pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED;
}else{
m = pSrc->colUsed & pProbe->colNotIdxed;
- pNew->wsFlags = (m==0) ? (WHERE_IDX_ONLY|WHERE_INDEXED) : WHERE_INDEXED;
+ pNew->wsFlags = WHERE_INDEXED;
+ if( m==TOPBIT || (pProbe->bHasExpr && !pProbe->bHasVCol && m!=0) ){
+ u32 isCov = whereIsCoveringIndex(pWInfo, pProbe, pSrc->iCursor);
+ if( isCov==0 ){
+ WHERETRACE(0x200,
+ ("-> %s is not a covering index"
+ " according to whereIsCoveringIndex()\n", pProbe->zName));
+ assert( m!=0 );
+ }else{
+ m = 0;
+ pNew->wsFlags |= isCov;
+ if( isCov & WHERE_IDX_ONLY ){
+ WHERETRACE(0x200,
+ ("-> %s is a covering expression index"
+ " according to whereIsCoveringIndex()\n", pProbe->zName));
+ }else{
+ assert( isCov==WHERE_EXPRIDX );
+ WHERETRACE(0x200,
+ ("-> %s might be a covering expression index"
+ " according to whereIsCoveringIndex()\n", pProbe->zName));
+ }
+ }
+ }else if( m==0 ){
+ WHERETRACE(0x200,
+ ("-> %s a covering index according to bitmasks\n",
+ pProbe->zName, m==0 ? "is" : "is not"));
+ pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED;
+ }
}
/* Full scan via index */
@@ -152423,7 +161574,14 @@ static int whereLoopAddBtree(
}
ApplyCostMultiplier(pNew->rRun, pTab->costMult);
whereLoopOutputAdjust(pWC, pNew, rSize);
- rc = whereLoopInsert(pBuilder, pNew);
+ if( (pSrc->fg.jointype & JT_RIGHT)!=0 && pProbe->aColExpr ){
+ /* Do not do an SCAN of a index-on-expression in a RIGHT JOIN
+ ** because the cursor used to access the index might not be
+ ** positioned to the correct row during the right-join no-match
+ ** loop. */
+ }else{
+ rc = whereLoopInsert(pBuilder, pNew);
+ }
pNew->nOut = rSize;
if( rc ) break;
}
@@ -152450,6 +161608,15 @@ static int whereLoopAddBtree(
#ifndef SQLITE_OMIT_VIRTUALTABLE
/*
+** Return true if pTerm is a virtual table LIMIT or OFFSET term.
+*/
+static int isLimitTerm(WhereTerm *pTerm){
+ assert( pTerm->eOperator==WO_AUX || pTerm->eMatchOp==0 );
+ return pTerm->eMatchOp>=SQLITE_INDEX_CONSTRAINT_LIMIT
+ && pTerm->eMatchOp<=SQLITE_INDEX_CONSTRAINT_OFFSET;
+}
+
+/*
** Argument pIdxInfo is already populated with all constraints that may
** be used by the virtual table identified by pBuilder->pNew->iTab. This
** function marks a subset of those constraints usable, invokes the
@@ -152476,9 +161643,11 @@ static int whereLoopAddVirtualOne(
u16 mExclude, /* Exclude terms using these operators */
sqlite3_index_info *pIdxInfo, /* Populated object for xBestIndex */
u16 mNoOmit, /* Do not omit these constraints */
- int *pbIn /* OUT: True if plan uses an IN(...) op */
+ int *pbIn, /* OUT: True if plan uses an IN(...) op */
+ int *pbRetryLimit /* OUT: Retry without LIMIT/OFFSET */
){
WhereClause *pWC = pBuilder->pWC;
+ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
struct sqlite3_index_constraint *pIdxCons;
struct sqlite3_index_constraint_usage *pUsage = pIdxInfo->aConstraintUsage;
int i;
@@ -152501,6 +161670,7 @@ static int whereLoopAddVirtualOne(
pIdxCons->usable = 0;
if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight
&& (pTerm->eOperator & mExclude)==0
+ && (pbRetryLimit || !isLimitTerm(pTerm))
){
pIdxCons->usable = 1;
}
@@ -152516,6 +161686,7 @@ static int whereLoopAddVirtualOne(
pIdxInfo->estimatedRows = 25;
pIdxInfo->idxFlags = 0;
pIdxInfo->colUsed = (sqlite3_int64)pSrc->colUsed;
+ pHidden->mHandleIn = 0;
/* Invoke the virtual table xBestIndex() method */
rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo);
@@ -152525,7 +161696,7 @@ static int whereLoopAddVirtualOne(
** that the particular combination of parameters provided is unusable.
** Make no entries in the loop table.
*/
- WHERETRACE(0xffff, (" ^^^^--- non-viable plan rejected!\n"));
+ WHERETRACE(0xffffffff, (" ^^^^--- non-viable plan rejected!\n"));
return SQLITE_OK;
}
return rc;
@@ -152533,8 +161704,8 @@ static int whereLoopAddVirtualOne(
mxTerm = -1;
assert( pNew->nLSlot>=nConstraint );
- for(i=0; i<nConstraint; i++) pNew->aLTerm[i] = 0;
- pNew->u.vtab.omitMask = 0;
+ memset(pNew->aLTerm, 0, sizeof(pNew->aLTerm[0])*nConstraint );
+ memset(&pNew->u.vtab, 0, sizeof(pNew->u.vtab));
pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint;
for(i=0; i<nConstraint; i++, pIdxCons++){
int iTerm;
@@ -152568,8 +161739,13 @@ static int whereLoopAddVirtualOne(
}else{
testcase( i!=iTerm );
}
+ if( pTerm->eMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET ){
+ pNew->u.vtab.bOmitOffset = 1;
+ }
}
- if( (pTerm->eOperator & WO_IN)!=0 ){
+ if( SMASKBIT32(i) & pHidden->mHandleIn ){
+ pNew->u.vtab.mHandleIn |= MASKBIT32(iTerm);
+ }else if( (pTerm->eOperator & WO_IN)!=0 ){
/* A virtual table that is constrained by an IN clause may not
** consume the ORDER BY clause because (1) the order of IN terms
** is not necessarily related to the order of output terms and
@@ -152579,6 +161755,22 @@ static int whereLoopAddVirtualOne(
pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE;
*pbIn = 1; assert( (mExclude & WO_IN)==0 );
}
+
+ assert( pbRetryLimit || !isLimitTerm(pTerm) );
+ if( isLimitTerm(pTerm) && *pbIn ){
+ /* If there is an IN(...) term handled as an == (separate call to
+ ** xFilter for each value on the RHS of the IN) and a LIMIT or
+ ** OFFSET term handled as well, the plan is unusable. Set output
+ ** variable *pbRetryLimit to true to tell the caller to retry with
+ ** LIMIT and OFFSET disabled. */
+ if( pIdxInfo->needToFreeIdxStr ){
+ sqlite3_free(pIdxInfo->idxStr);
+ pIdxInfo->idxStr = 0;
+ pIdxInfo->needToFreeIdxStr = 0;
+ }
+ *pbRetryLimit = 1;
+ return SQLITE_OK;
+ }
}
}
@@ -152615,7 +161807,7 @@ static int whereLoopAddVirtualOne(
sqlite3_free(pNew->u.vtab.idxStr);
pNew->u.vtab.needFree = 0;
}
- WHERETRACE(0xffff, (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n",
+ WHERETRACE(0xffffffff, (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n",
*pbIn, (sqlite3_uint64)mPrereq,
(sqlite3_uint64)(pNew->prereq & ~mPrereq)));
@@ -152623,11 +161815,19 @@ static int whereLoopAddVirtualOne(
}
/*
-** If this function is invoked from within an xBestIndex() callback, it
-** returns a pointer to a buffer containing the name of the collation
-** sequence associated with element iCons of the sqlite3_index_info.aConstraint
-** array. Or, if iCons is out of range or there is no active xBestIndex
-** call, return NULL.
+** Return the collating sequence for a constraint passed into xBestIndex.
+**
+** pIdxInfo must be an sqlite3_index_info structure passed into xBestIndex.
+** This routine depends on there being a HiddenIndexInfo structure immediately
+** following the sqlite3_index_info structure.
+**
+** Return a pointer to the collation name:
+**
+** 1. If there is an explicit COLLATE operator on the constaint, return it.
+**
+** 2. Else, if the column has an alternative collation, return that.
+**
+** 3. Otherwise, return "BINARY".
*/
SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int iCons){
HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
@@ -152645,6 +161845,92 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int
}
/*
+** Return true if constraint iCons is really an IN(...) constraint, or
+** false otherwise. If iCons is an IN(...) constraint, set (if bHandle!=0)
+** or clear (if bHandle==0) the flag to handle it using an iterator.
+*/
+SQLITE_API int sqlite3_vtab_in(sqlite3_index_info *pIdxInfo, int iCons, int bHandle){
+ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
+ u32 m = SMASKBIT32(iCons);
+ if( m & pHidden->mIn ){
+ if( bHandle==0 ){
+ pHidden->mHandleIn &= ~m;
+ }else if( bHandle>0 ){
+ pHidden->mHandleIn |= m;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+/*
+** This interface is callable from within the xBestIndex callback only.
+**
+** If possible, set (*ppVal) to point to an object containing the value
+** on the right-hand-side of constraint iCons.
+*/
+SQLITE_API int sqlite3_vtab_rhs_value(
+ sqlite3_index_info *pIdxInfo, /* Copy of first argument to xBestIndex */
+ int iCons, /* Constraint for which RHS is wanted */
+ sqlite3_value **ppVal /* Write value extracted here */
+){
+ HiddenIndexInfo *pH = (HiddenIndexInfo*)&pIdxInfo[1];
+ sqlite3_value *pVal = 0;
+ int rc = SQLITE_OK;
+ if( iCons<0 || iCons>=pIdxInfo->nConstraint ){
+ rc = SQLITE_MISUSE; /* EV: R-30545-25046 */
+ }else{
+ if( pH->aRhs[iCons]==0 ){
+ WhereTerm *pTerm = &pH->pWC->a[pIdxInfo->aConstraint[iCons].iTermOffset];
+ rc = sqlite3ValueFromExpr(
+ pH->pParse->db, pTerm->pExpr->pRight, ENC(pH->pParse->db),
+ SQLITE_AFF_BLOB, &pH->aRhs[iCons]
+ );
+ testcase( rc!=SQLITE_OK );
+ }
+ pVal = pH->aRhs[iCons];
+ }
+ *ppVal = pVal;
+
+ if( rc==SQLITE_OK && pVal==0 ){ /* IMP: R-19933-32160 */
+ rc = SQLITE_NOTFOUND; /* IMP: R-36424-56542 */
+ }
+
+ return rc;
+}
+
+/*
+** Return true if ORDER BY clause may be handled as DISTINCT.
+*/
+SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){
+ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
+ assert( pHidden->eDistinct>=0 && pHidden->eDistinct<=3 );
+ return pHidden->eDistinct;
+}
+
+/*
+** Cause the prepared statement that is associated with a call to
+** xBestIndex to potentially use all schemas. If the statement being
+** prepared is read-only, then just start read transactions on all
+** schemas. But if this is a write operation, start writes on all
+** schemas.
+**
+** This is used by the (built-in) sqlite_dbpage virtual table.
+*/
+SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(Parse *pParse){
+ int nDb = pParse->db->nDb;
+ int i;
+ for(i=0; i<nDb; i++){
+ sqlite3CodeVerifySchema(pParse, i);
+ }
+ if( DbMaskNonZero(pParse->writeMask) ){
+ for(i=0; i<nDb; i++){
+ sqlite3BeginWriteOperation(pParse, 0, i);
+ }
+ }
+}
+
+/*
** Add all WhereLoop objects for a table of the join identified by
** pBuilder->pNew->iTab. That table is guaranteed to be a virtual table.
**
@@ -152685,6 +161971,7 @@ static int whereLoopAddVirtual(
WhereLoop *pNew;
Bitmask mBest; /* Tables used by best possible plan */
u16 mNoOmit;
+ int bRetry = 0; /* True to retry with LIMIT/OFFSET disabled */
assert( (mPrereq & mUnusable)==0 );
pWInfo = pBuilder->pWInfo;
@@ -152693,8 +161980,7 @@ static int whereLoopAddVirtual(
pNew = pBuilder->pNew;
pSrc = &pWInfo->pTabList->a[pNew->iTab];
assert( IsVirtual(pSrc->pTab) );
- p = allocateIndexInfo(pParse, pWC, mUnusable, pSrc, pBuilder->pOrderBy,
- &mNoOmit);
+ p = allocateIndexInfo(pWInfo, pWC, mUnusable, pSrc, &mNoOmit);
if( p==0 ) return SQLITE_NOMEM_BKPT;
pNew->rSetup = 0;
pNew->wsFlags = WHERE_VIRTUALTABLE;
@@ -152702,14 +161988,22 @@ static int whereLoopAddVirtual(
pNew->u.vtab.needFree = 0;
nConstraint = p->nConstraint;
if( whereLoopResize(pParse->db, pNew, nConstraint) ){
- sqlite3DbFree(pParse->db, p);
+ freeIndexInfo(pParse->db, p);
return SQLITE_NOMEM_BKPT;
}
/* First call xBestIndex() with all constraints usable. */
WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName));
- WHERETRACE(0x40, (" VirtualOne: all usable\n"));
- rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn);
+ WHERETRACE(0x800, (" VirtualOne: all usable\n"));
+ rc = whereLoopAddVirtualOne(
+ pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, &bRetry
+ );
+ if( bRetry ){
+ assert( rc==SQLITE_OK );
+ rc = whereLoopAddVirtualOne(
+ pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, 0
+ );
+ }
/* If the call to xBestIndex() with all terms enabled produced a plan
** that does not require any source tables (IOW: a plan with mBest==0)
@@ -152725,9 +162019,9 @@ static int whereLoopAddVirtual(
/* If the plan produced by the earlier call uses an IN(...) term, call
** xBestIndex again, this time with IN(...) terms disabled. */
if( bIn ){
- WHERETRACE(0x40, (" VirtualOne: all usable w/o IN\n"));
+ WHERETRACE(0x800, (" VirtualOne: all usable w/o IN\n"));
rc = whereLoopAddVirtualOne(
- pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn);
+ pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn, 0);
assert( bIn==0 );
mBestNoIn = pNew->prereq & ~mPrereq;
if( mBestNoIn==0 ){
@@ -152751,10 +162045,10 @@ static int whereLoopAddVirtual(
mPrev = mNext;
if( mNext==ALLBITS ) break;
if( mNext==mBest || mNext==mBestNoIn ) continue;
- WHERETRACE(0x40, (" VirtualOne: mPrev=%04llx mNext=%04llx\n",
+ WHERETRACE(0x800, (" VirtualOne: mPrev=%04llx mNext=%04llx\n",
(sqlite3_uint64)mPrev, (sqlite3_uint64)mNext));
rc = whereLoopAddVirtualOne(
- pBuilder, mPrereq, mNext|mPrereq, 0, p, mNoOmit, &bIn);
+ pBuilder, mPrereq, mNext|mPrereq, 0, p, mNoOmit, &bIn, 0);
if( pNew->prereq==mPrereq ){
seenZero = 1;
if( bIn==0 ) seenZeroNoIN = 1;
@@ -152765,9 +162059,9 @@ static int whereLoopAddVirtual(
** that requires no source tables at all (i.e. one guaranteed to be
** usable), make a call here with all source tables disabled */
if( rc==SQLITE_OK && seenZero==0 ){
- WHERETRACE(0x40, (" VirtualOne: all disabled\n"));
+ WHERETRACE(0x800, (" VirtualOne: all disabled\n"));
rc = whereLoopAddVirtualOne(
- pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn);
+ pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn, 0);
if( bIn==0 ) seenZeroNoIN = 1;
}
@@ -152775,14 +162069,14 @@ static int whereLoopAddVirtual(
** that requires no source tables at all and does not use an IN(...)
** operator, make a final call to obtain one here. */
if( rc==SQLITE_OK && seenZeroNoIN==0 ){
- WHERETRACE(0x40, (" VirtualOne: all disabled and w/o IN\n"));
+ WHERETRACE(0x800, (" VirtualOne: all disabled and w/o IN\n"));
rc = whereLoopAddVirtualOne(
- pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn);
+ pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn, 0);
}
}
if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr);
- sqlite3DbFreeNN(pParse->db, p);
+ freeIndexInfo(pParse->db, p);
WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc));
return rc;
}
@@ -152815,6 +162109,9 @@ static int whereLoopAddOr(
pItem = pWInfo->pTabList->a + pNew->iTab;
iCur = pItem->iCursor;
+ /* The multi-index OR optimization does not work for RIGHT and FULL JOIN */
+ if( pItem->fg.jointype & JT_RIGHT ) return SQLITE_OK;
+
for(pTerm=pWC->a; pTerm<pWCEnd && rc==SQLITE_OK; pTerm++){
if( (pTerm->eOperator & WO_OR)!=0
&& (pTerm->u.pOrInfo->indexable & pNew->maskSelf)!=0
@@ -152826,10 +162123,9 @@ static int whereLoopAddOr(
int i, j;
sSubBuild = *pBuilder;
- sSubBuild.pOrderBy = 0;
sSubBuild.pOrSet = &sCur;
- WHERETRACE(0x200, ("Begin processing OR-clause %p\n", pTerm));
+ WHERETRACE(0x400, ("Begin processing OR-clause %p\n", pTerm));
for(pOrTerm=pOrWC->a; pOrTerm<pOrWCEnd; pOrTerm++){
if( (pOrTerm->eOperator & WO_AND)!=0 ){
sSubBuild.pWC = &pOrTerm->u.pAndInfo->wc;
@@ -152838,6 +162134,7 @@ static int whereLoopAddOr(
tempWC.pOuter = pWC;
tempWC.op = TK_AND;
tempWC.nTerm = 1;
+ tempWC.nBase = 1;
tempWC.a = pOrTerm;
sSubBuild.pWC = &tempWC;
}else{
@@ -152845,9 +162142,9 @@ static int whereLoopAddOr(
}
sCur.n = 0;
#ifdef WHERETRACE_ENABLED
- WHERETRACE(0x200, ("OR-term %d of %p has %d subterms:\n",
+ WHERETRACE(0x400, ("OR-term %d of %p has %d subterms:\n",
(int)(pOrTerm-pOrWC->a), pTerm, sSubBuild.pWC->nTerm));
- if( sqlite3WhereTrace & 0x400 ){
+ if( sqlite3WhereTrace & 0x20000 ){
sqlite3WhereClausePrint(sSubBuild.pWC);
}
#endif
@@ -152862,8 +162159,6 @@ static int whereLoopAddOr(
if( rc==SQLITE_OK ){
rc = whereLoopAddOr(&sSubBuild, mPrereq, mUnusable);
}
- assert( rc==SQLITE_OK || rc==SQLITE_DONE || sCur.n==0
- || rc==SQLITE_NOMEM );
testcase( rc==SQLITE_NOMEM && sCur.n>0 );
testcase( rc==SQLITE_DONE );
if( sCur.n==0 ){
@@ -152909,7 +162204,7 @@ static int whereLoopAddOr(
pNew->prereq = sSum.a[i].prereq;
rc = whereLoopInsert(pBuilder, pNew);
}
- WHERETRACE(0x200, ("End processing OR-clause %p\n", pTerm));
+ WHERETRACE(0x400, ("End processing OR-clause %p\n", pTerm));
}
}
return rc;
@@ -152928,29 +162223,50 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){
SrcItem *pEnd = &pTabList->a[pWInfo->nLevel];
sqlite3 *db = pWInfo->pParse->db;
int rc = SQLITE_OK;
+ int bFirstPastRJ = 0;
+ int hasRightJoin = 0;
WhereLoop *pNew;
+
/* Loop over the tables in the join, from left to right */
pNew = pBuilder->pNew;
- whereLoopInit(pNew);
+
+ /* Verify that pNew has already been initialized */
+ assert( pNew->nLTerm==0 );
+ assert( pNew->wsFlags==0 );
+ assert( pNew->nLSlot>=ArraySize(pNew->aLTermSpace) );
+ assert( pNew->aLTerm!=0 );
+
pBuilder->iPlanLimit = SQLITE_QUERY_PLANNER_LIMIT;
for(iTab=0, pItem=pTabList->a; pItem<pEnd; iTab++, pItem++){
Bitmask mUnusable = 0;
pNew->iTab = iTab;
pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR;
pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor);
- if( (pItem->fg.jointype & (JT_LEFT|JT_CROSS))!=0 ){
- /* This condition is true when pItem is the FROM clause term on the
- ** right-hand-side of a LEFT or CROSS JOIN. */
- mPrereq = mPrior;
- }else{
+ if( bFirstPastRJ
+ || (pItem->fg.jointype & (JT_OUTER|JT_CROSS|JT_LTORJ))!=0
+ ){
+ /* Add prerequisites to prevent reordering of FROM clause terms
+ ** across CROSS joins and outer joins. The bFirstPastRJ boolean
+ ** prevents the right operand of a RIGHT JOIN from being swapped with
+ ** other elements even further to the right.
+ **
+ ** The JT_LTORJ case and the hasRightJoin flag work together to
+ ** prevent FROM-clause terms from moving from the right side of
+ ** a LEFT JOIN over to the left side of that join if the LEFT JOIN
+ ** is itself on the left side of a RIGHT JOIN.
+ */
+ if( pItem->fg.jointype & JT_LTORJ ) hasRightJoin = 1;
+ mPrereq |= mPrior;
+ bFirstPastRJ = (pItem->fg.jointype & JT_RIGHT)!=0;
+ }else if( !hasRightJoin ){
mPrereq = 0;
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
if( IsVirtual(pItem->pTab) ){
SrcItem *p;
for(p=&pItem[1]; p<pEnd; p++){
- if( mUnusable || (p->fg.jointype & (JT_LEFT|JT_CROSS)) ){
+ if( mUnusable || (p->fg.jointype & (JT_OUTER|JT_CROSS)) ){
mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor);
}
}
@@ -153075,7 +162391,9 @@ static i8 wherePathSatisfiesOrderBy(
pLoop = pLast;
}
if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){
- if( pLoop->u.vtab.isOrdered && (wctrlFlags & WHERE_DISTINCTBY)==0 ){
+ if( pLoop->u.vtab.isOrdered
+ && ((wctrlFlags&(WHERE_DISTINCTBY|WHERE_SORTBYGROUP))!=WHERE_DISTINCTBY)
+ ){
obSat = obDone;
}
break;
@@ -153234,8 +162552,8 @@ static i8 wherePathSatisfiesOrderBy(
if( pOBExpr->iTable!=iCur ) continue;
if( pOBExpr->iColumn!=iColumn ) continue;
}else{
- Expr *pIdxExpr = pIndex->aColExpr->a[j].pExpr;
- if( sqlite3ExprCompareSkip(pOBExpr, pIdxExpr, iCur) ){
+ Expr *pIxExpr = pIndex->aColExpr->a[j].pExpr;
+ if( sqlite3ExprCompareSkip(pOBExpr, pIxExpr, iCur) ){
continue;
}
}
@@ -153253,16 +162571,18 @@ static i8 wherePathSatisfiesOrderBy(
/* Make sure the sort order is compatible in an ORDER BY clause.
** Sort order is irrelevant for a GROUP BY clause. */
if( revSet ){
- if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){
+ if( (rev ^ revIdx)
+ != (pOrderBy->a[i].fg.sortFlags&KEYINFO_ORDER_DESC)
+ ){
isMatch = 0;
}
}else{
- rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC);
+ rev = revIdx ^ (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC);
if( rev ) *pRevMask |= MASKBIT(iLoop);
revSet = 1;
}
}
- if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){
+ if( isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL) ){
if( j==pLoop->u.btree.nEq ){
pLoop->wsFlags |= WHERE_BIGNULL_SORT;
}else{
@@ -153309,7 +162629,7 @@ static i8 wherePathSatisfiesOrderBy(
if( obSat==obDone ) return (i8)nOrderBy;
if( !isOrderDistinct ){
for(i=nOrderBy-1; i>0; i--){
- Bitmask m = MASKBIT(i) - 1;
+ Bitmask m = ALWAYS(i<BMS) ? MASKBIT(i) - 1 : 0;
if( (obSat&m)==m ) return i;
}
return 0;
@@ -153342,7 +162662,7 @@ static i8 wherePathSatisfiesOrderBy(
** SELECT * FROM t1 GROUP BY y,x ORDER BY y,x; -- IsSorted()==0
*/
SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo *pWInfo){
- assert( pWInfo->wctrlFlags & WHERE_GROUPBY );
+ assert( pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY) );
assert( pWInfo->wctrlFlags & WHERE_SORTBYGROUP );
return pWInfo->sorted;
}
@@ -153365,37 +162685,56 @@ static const char *wherePathName(WherePath *pPath, int nLoop, WhereLoop *pLast){
** order.
*/
static LogEst whereSortingCost(
- WhereInfo *pWInfo,
- LogEst nRow,
- int nOrderBy,
- int nSorted
+ WhereInfo *pWInfo, /* Query planning context */
+ LogEst nRow, /* Estimated number of rows to sort */
+ int nOrderBy, /* Number of ORDER BY clause terms */
+ int nSorted /* Number of initial ORDER BY terms naturally in order */
){
- /* TUNING: Estimated cost of a full external sort, where N is
+ /* Estimated cost of a full external sort, where N is
** the number of rows to sort is:
**
- ** cost = (3.0 * N * log(N)).
+ ** cost = (K * N * log(N)).
**
** Or, if the order-by clause has X terms but only the last Y
** terms are out of order, then block-sorting will reduce the
** sorting cost to:
**
- ** cost = (3.0 * N * log(N)) * (Y/X)
+ ** cost = (K * N * log(N)) * (Y/X)
+ **
+ ** The constant K is at least 2.0 but will be larger if there are a
+ ** large number of columns to be sorted, as the sorting time is
+ ** proportional to the amount of content to be sorted. The algorithm
+ ** does not currently distinguish between fat columns (BLOBs and TEXTs)
+ ** and skinny columns (INTs). It just uses the number of columns as
+ ** an approximation for the row width.
**
- ** The (Y/X) term is implemented using stack variable rScale
- ** below.
+ ** And extra factor of 2.0 or 3.0 is added to the sorting cost if the sort
+ ** is built using OP_IdxInsert and OP_Sort rather than with OP_SorterInsert.
*/
- LogEst rScale, rSortCost;
- assert( nOrderBy>0 && 66==sqlite3LogEst(100) );
- rScale = sqlite3LogEst((nOrderBy-nSorted)*100/nOrderBy) - 66;
- rSortCost = nRow + rScale + 16;
+ LogEst rSortCost, nCol;
+ assert( pWInfo->pSelect!=0 );
+ assert( pWInfo->pSelect->pEList!=0 );
+ /* TUNING: sorting cost proportional to the number of output columns: */
+ nCol = sqlite3LogEst((pWInfo->pSelect->pEList->nExpr+59)/30);
+ rSortCost = nRow + nCol;
+ if( nSorted>0 ){
+ /* Scale the result by (Y/X) */
+ rSortCost += sqlite3LogEst((nOrderBy-nSorted)*100/nOrderBy) - 66;
+ }
/* Multiple by log(M) where M is the number of output rows.
** Use the LIMIT for M if it is smaller. Or if this sort is for
** a DISTINCT operator, M will be the number of distinct output
** rows, so fudge it downwards a bit.
*/
- if( (pWInfo->wctrlFlags & WHERE_USE_LIMIT)!=0 && pWInfo->iLimit<nRow ){
- nRow = pWInfo->iLimit;
+ if( (pWInfo->wctrlFlags & WHERE_USE_LIMIT)!=0 ){
+ rSortCost += 10; /* TUNING: Extra 2.0x if using LIMIT */
+ if( nSorted!=0 ){
+ rSortCost += 6; /* TUNING: Extra 1.5x if also using partial sort */
+ }
+ if( pWInfo->iLimit<nRow ){
+ nRow = pWInfo->iLimit;
+ }
}else if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT) ){
/* TUNING: In the sort for a DISTINCT operator, assume that the DISTINCT
** reduces the number of output rows by a factor of 2 */
@@ -153421,7 +162760,6 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
int mxChoice; /* Maximum number of simultaneous paths tracked */
int nLoop; /* Number of terms in the join */
Parse *pParse; /* Parsing context */
- sqlite3 *db; /* The database connection */
int iLoop; /* Loop counter over the terms of the join */
int ii, jj; /* Loop counters */
int mxI = 0; /* Index of next entry to replace */
@@ -153440,7 +162778,6 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
int nSpace; /* Bytes of space allocated at pSpace */
pParse = pWInfo->pParse;
- db = pParse->db;
nLoop = pWInfo->nLevel;
/* TUNING: For simple queries, only the best path is tracked.
** For 2-way joins, the 5 best paths are followed.
@@ -153463,7 +162800,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
/* Allocate and initialize space for aTo, aFrom and aSortCost[] */
nSpace = (sizeof(WherePath)+sizeof(WhereLoop*)*nLoop)*mxChoice*2;
nSpace += sizeof(LogEst) * nOrderBy;
- pSpace = sqlite3DbMallocRawNN(db, nSpace);
+ pSpace = sqlite3StackAllocRawNN(pParse->db, nSpace);
if( pSpace==0 ) return SQLITE_NOMEM_BKPT;
aTo = (WherePath*)pSpace;
aFrom = aTo+mxChoice;
@@ -153513,9 +162850,9 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
LogEst nOut; /* Rows visited by (pFrom+pWLoop) */
LogEst rCost; /* Cost of path (pFrom+pWLoop) */
LogEst rUnsorted; /* Unsorted cost of (pFrom+pWLoop) */
- i8 isOrdered = pFrom->isOrdered; /* isOrdered for (pFrom+pWLoop) */
+ i8 isOrdered; /* isOrdered for (pFrom+pWLoop) */
Bitmask maskNew; /* Mask of src visited by (..) */
- Bitmask revMask = 0; /* Mask of rev-order loops for (..) */
+ Bitmask revMask; /* Mask of rev-order loops for (..) */
if( (pWLoop->prereq & ~pFrom->maskLoop)!=0 ) continue;
if( (pWLoop->maskSelf & pFrom->maskLoop)!=0 ) continue;
@@ -153534,7 +162871,9 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
rUnsorted = sqlite3LogEstAdd(rUnsorted, pFrom->rUnsorted);
nOut = pFrom->nRow + pWLoop->nOut;
maskNew = pFrom->maskLoop | pWLoop->maskSelf;
+ isOrdered = pFrom->isOrdered;
if( isOrdered<0 ){
+ revMask = 0;
isOrdered = wherePathSatisfiesOrderBy(pWInfo,
pWInfo->pOrderBy, pFrom, pWInfo->wctrlFlags,
iLoop, pWLoop, &revMask);
@@ -153547,11 +162886,11 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
pWInfo, nRowEst, nOrderBy, isOrdered
);
}
- /* TUNING: Add a small extra penalty (5) to sorting as an
+ /* TUNING: Add a small extra penalty (3) to sorting as an
** extra encouragment to the query planner to select a plan
** where the rows emerge in the correct order without any sorting
** required. */
- rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]) + 5;
+ rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]) + 3;
WHERETRACE(0x002,
("---- sort cost=%-3d (%d/%d) increases cost %3d to %-3d\n",
@@ -153562,6 +162901,13 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
rUnsorted -= 2; /* TUNING: Slight bias in favor of no-sort plans */
}
+ /* TUNING: A full-scan of a VIEW or subquery in the outer loop
+ ** is not so bad. */
+ if( iLoop==0 && (pWLoop->wsFlags & WHERE_VIEWSCAN)!=0 ){
+ rCost += -10;
+ nOut += -30;
+ }
+
/* Check to see if pWLoop should be added to the set of
** mxChoice best-so-far paths.
**
@@ -153712,7 +163058,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
if( nFrom==0 ){
sqlite3ErrorMsg(pParse, "no query solution");
- sqlite3DbFreeNN(db, pSpace);
+ sqlite3StackFreeNN(pParse->db, pSpace);
return SQLITE_ERROR;
}
@@ -153743,12 +163089,16 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
}
pWInfo->bOrderedInnerLoop = 0;
if( pWInfo->pOrderBy ){
+ pWInfo->nOBSat = pFrom->isOrdered;
if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){
if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){
pWInfo->eDistinct = WHERE_DISTINCT_ORDERED;
}
+ if( pWInfo->pSelect->pOrderBy
+ && pWInfo->nOBSat > pWInfo->pSelect->pOrderBy->nExpr ){
+ pWInfo->nOBSat = pWInfo->pSelect->pOrderBy->nExpr;
+ }
}else{
- pWInfo->nOBSat = pFrom->isOrdered;
pWInfo->revMask = pFrom->revLoop;
if( pWInfo->nOBSat<=0 ){
pWInfo->nOBSat = 0;
@@ -153794,7 +163144,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
pWInfo->nRowOut = pFrom->nRow;
/* Free temporary memory and return success */
- sqlite3DbFreeNN(db, pSpace);
+ sqlite3StackFreeNN(pParse->db, pSpace);
return SQLITE_OK;
}
@@ -153819,6 +163169,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){
int j;
Table *pTab;
Index *pIdx;
+ WhereScan scan;
pWInfo = pBuilder->pWInfo;
if( pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE ) return 0;
@@ -153826,13 +163177,18 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){
pItem = pWInfo->pTabList->a;
pTab = pItem->pTab;
if( IsVirtual(pTab) ) return 0;
- if( pItem->fg.isIndexedBy ) return 0;
+ if( pItem->fg.isIndexedBy || pItem->fg.notIndexed ){
+ testcase( pItem->fg.isIndexedBy );
+ testcase( pItem->fg.notIndexed );
+ return 0;
+ }
iCur = pItem->iCursor;
pWC = &pWInfo->sWC;
pLoop = pBuilder->pNew;
pLoop->wsFlags = 0;
pLoop->nSkip = 0;
- pTerm = sqlite3WhereFindTerm(pWC, iCur, -1, 0, WO_EQ|WO_IS, 0);
+ pTerm = whereScanInit(&scan, pWC, iCur, -1, WO_EQ|WO_IS, 0);
+ while( pTerm && pTerm->prereqRight ) pTerm = whereScanNext(&scan);
if( pTerm ){
testcase( pTerm->eOperator & WO_IS );
pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_IPK|WHERE_ONEROW;
@@ -153851,7 +163207,8 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){
) continue;
opMask = pIdx->uniqNotNull ? (WO_EQ|WO_IS) : WO_EQ;
for(j=0; j<pIdx->nKeyCol; j++){
- pTerm = sqlite3WhereFindTerm(pWC, iCur, j, 0, opMask, pIdx);
+ pTerm = whereScanInit(&scan, pWC, iCur, j, opMask, pIdx);
+ while( pTerm && pTerm->prereqRight ) pTerm = whereScanNext(&scan);
if( pTerm==0 ) break;
testcase( pTerm->eOperator & WO_IS );
pLoop->aLTerm[j] = pTerm;
@@ -153880,9 +163237,15 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){
if( pWInfo->wctrlFlags & WHERE_WANT_DISTINCT ){
pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE;
}
+ if( scan.iEquiv>1 ) pLoop->wsFlags |= WHERE_TRANSCONS;
#ifdef SQLITE_DEBUG
pLoop->cId = '0';
#endif
+#ifdef WHERETRACE_ENABLED
+ if( sqlite3WhereTrace & 0x02 ){
+ sqlite3DebugPrintf("whereShortCut() used to compute solution\n");
+ }
+#endif
return 1;
}
return 0;
@@ -153936,6 +163299,244 @@ static void showAllWhereLoops(WhereInfo *pWInfo, WhereClause *pWC){
# define WHERETRACE_ALL_LOOPS(W,C)
#endif
+/* Attempt to omit tables from a join that do not affect the result.
+** For a table to not affect the result, the following must be true:
+**
+** 1) The query must not be an aggregate.
+** 2) The table must be the RHS of a LEFT JOIN.
+** 3) Either the query must be DISTINCT, or else the ON or USING clause
+** must contain a constraint that limits the scan of the table to
+** at most a single row.
+** 4) The table must not be referenced by any part of the query apart
+** from its own USING or ON clause.
+** 5) The table must not have an inner-join ON or USING clause if there is
+** a RIGHT JOIN anywhere in the query. Otherwise the ON/USING clause
+** might move from the right side to the left side of the RIGHT JOIN.
+** Note: Due to (2), this condition can only arise if the table is
+** the right-most table of a subquery that was flattened into the
+** main query and that subquery was the right-hand operand of an
+** inner join that held an ON or USING clause.
+**
+** For example, given:
+**
+** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1);
+** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2);
+** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3);
+**
+** then table t2 can be omitted from the following:
+**
+** SELECT v1, v3 FROM t1
+** LEFT JOIN t2 ON (t1.ipk=t2.ipk)
+** LEFT JOIN t3 ON (t1.ipk=t3.ipk)
+**
+** or from:
+**
+** SELECT DISTINCT v1, v3 FROM t1
+** LEFT JOIN t2
+** LEFT JOIN t3 ON (t1.ipk=t3.ipk)
+*/
+static SQLITE_NOINLINE Bitmask whereOmitNoopJoin(
+ WhereInfo *pWInfo,
+ Bitmask notReady
+){
+ int i;
+ Bitmask tabUsed;
+ int hasRightJoin;
+
+ /* Preconditions checked by the caller */
+ assert( pWInfo->nLevel>=2 );
+ assert( OptimizationEnabled(pWInfo->pParse->db, SQLITE_OmitNoopJoin) );
+
+ /* These two preconditions checked by the caller combine to guarantee
+ ** condition (1) of the header comment */
+ assert( pWInfo->pResultSet!=0 );
+ assert( 0==(pWInfo->wctrlFlags & WHERE_AGG_DISTINCT) );
+
+ tabUsed = sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pResultSet);
+ if( pWInfo->pOrderBy ){
+ tabUsed |= sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pOrderBy);
+ }
+ hasRightJoin = (pWInfo->pTabList->a[0].fg.jointype & JT_LTORJ)!=0;
+ for(i=pWInfo->nLevel-1; i>=1; i--){
+ WhereTerm *pTerm, *pEnd;
+ SrcItem *pItem;
+ WhereLoop *pLoop;
+ pLoop = pWInfo->a[i].pWLoop;
+ pItem = &pWInfo->pTabList->a[pLoop->iTab];
+ if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ) continue;
+ if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)==0
+ && (pLoop->wsFlags & WHERE_ONEROW)==0
+ ){
+ continue;
+ }
+ if( (tabUsed & pLoop->maskSelf)!=0 ) continue;
+ pEnd = pWInfo->sWC.a + pWInfo->sWC.nTerm;
+ for(pTerm=pWInfo->sWC.a; pTerm<pEnd; pTerm++){
+ if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
+ if( !ExprHasProperty(pTerm->pExpr, EP_OuterON)
+ || pTerm->pExpr->w.iJoin!=pItem->iCursor
+ ){
+ break;
+ }
+ }
+ if( hasRightJoin
+ && ExprHasProperty(pTerm->pExpr, EP_InnerON)
+ && pTerm->pExpr->w.iJoin==pItem->iCursor
+ ){
+ break; /* restriction (5) */
+ }
+ }
+ if( pTerm<pEnd ) continue;
+ WHERETRACE(0xffffffff, ("-> drop loop %c not used\n", pLoop->cId));
+ notReady &= ~pLoop->maskSelf;
+ for(pTerm=pWInfo->sWC.a; pTerm<pEnd; pTerm++){
+ if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
+ pTerm->wtFlags |= TERM_CODED;
+ }
+ }
+ if( i!=pWInfo->nLevel-1 ){
+ int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel);
+ memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte);
+ }
+ pWInfo->nLevel--;
+ assert( pWInfo->nLevel>0 );
+ }
+ return notReady;
+}
+
+/*
+** Check to see if there are any SEARCH loops that might benefit from
+** using a Bloom filter. Consider a Bloom filter if:
+**
+** (1) The SEARCH happens more than N times where N is the number
+** of rows in the table that is being considered for the Bloom
+** filter.
+** (2) Some searches are expected to find zero rows. (This is determined
+** by the WHERE_SELFCULL flag on the term.)
+** (3) Bloom-filter processing is not disabled. (Checked by the
+** caller.)
+** (4) The size of the table being searched is known by ANALYZE.
+**
+** This block of code merely checks to see if a Bloom filter would be
+** appropriate, and if so sets the WHERE_BLOOMFILTER flag on the
+** WhereLoop. The implementation of the Bloom filter comes further
+** down where the code for each WhereLoop is generated.
+*/
+static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful(
+ const WhereInfo *pWInfo
+){
+ int i;
+ LogEst nSearch = 0;
+
+ assert( pWInfo->nLevel>=2 );
+ assert( OptimizationEnabled(pWInfo->pParse->db, SQLITE_BloomFilter) );
+ for(i=0; i<pWInfo->nLevel; i++){
+ WhereLoop *pLoop = pWInfo->a[i].pWLoop;
+ const unsigned int reqFlags = (WHERE_SELFCULL|WHERE_COLUMN_EQ);
+ SrcItem *pItem = &pWInfo->pTabList->a[pLoop->iTab];
+ Table *pTab = pItem->pTab;
+ if( (pTab->tabFlags & TF_HasStat1)==0 ) break;
+ pTab->tabFlags |= TF_StatsUsed;
+ if( i>=1
+ && (pLoop->wsFlags & reqFlags)==reqFlags
+ /* vvvvvv--- Always the case if WHERE_COLUMN_EQ is defined */
+ && ALWAYS((pLoop->wsFlags & (WHERE_IPK|WHERE_INDEXED))!=0)
+ ){
+ if( nSearch > pTab->nRowLogEst ){
+ testcase( pItem->fg.jointype & JT_LEFT );
+ pLoop->wsFlags |= WHERE_BLOOMFILTER;
+ pLoop->wsFlags &= ~WHERE_IDX_ONLY;
+ WHERETRACE(0xffffffff, (
+ "-> use Bloom-filter on loop %c because there are ~%.1e "
+ "lookups into %s which has only ~%.1e rows\n",
+ pLoop->cId, (double)sqlite3LogEstToInt(nSearch), pTab->zName,
+ (double)sqlite3LogEstToInt(pTab->nRowLogEst)));
+ }
+ }
+ nSearch += pLoop->nOut;
+ }
+}
+
+/*
+** This is an sqlite3ParserAddCleanup() callback that is invoked to
+** free the Parse->pIdxEpr list when the Parse object is destroyed.
+*/
+static void whereIndexedExprCleanup(sqlite3 *db, void *pObject){
+ Parse *pParse = (Parse*)pObject;
+ while( pParse->pIdxEpr!=0 ){
+ IndexedExpr *p = pParse->pIdxEpr;
+ pParse->pIdxEpr = p->pIENext;
+ sqlite3ExprDelete(db, p->pExpr);
+ sqlite3DbFreeNN(db, p);
+ }
+}
+
+/*
+** The index pIdx is used by a query and contains one or more expressions.
+** In other words pIdx is an index on an expression. iIdxCur is the cursor
+** number for the index and iDataCur is the cursor number for the corresponding
+** table.
+**
+** This routine adds IndexedExpr entries to the Parse->pIdxEpr field for
+** each of the expressions in the index so that the expression code generator
+** will know to replace occurrences of the indexed expression with
+** references to the corresponding column of the index.
+*/
+static SQLITE_NOINLINE void whereAddIndexedExpr(
+ Parse *pParse, /* Add IndexedExpr entries to pParse->pIdxEpr */
+ Index *pIdx, /* The index-on-expression that contains the expressions */
+ int iIdxCur, /* Cursor number for pIdx */
+ SrcItem *pTabItem /* The FROM clause entry for the table */
+){
+ int i;
+ IndexedExpr *p;
+ Table *pTab;
+ assert( pIdx->bHasExpr );
+ pTab = pIdx->pTable;
+ for(i=0; i<pIdx->nColumn; i++){
+ Expr *pExpr;
+ int j = pIdx->aiColumn[i];
+ int bMaybeNullRow;
+ if( j==XN_EXPR ){
+ pExpr = pIdx->aColExpr->a[i].pExpr;
+ testcase( pTabItem->fg.jointype & JT_LEFT );
+ testcase( pTabItem->fg.jointype & JT_RIGHT );
+ testcase( pTabItem->fg.jointype & JT_LTORJ );
+ bMaybeNullRow = (pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0;
+ }else if( j>=0 && (pTab->aCol[j].colFlags & COLFLAG_VIRTUAL)!=0 ){
+ pExpr = sqlite3ColumnExpr(pTab, &pTab->aCol[j]);
+ bMaybeNullRow = 0;
+ }else{
+ continue;
+ }
+ if( sqlite3ExprIsConstant(pExpr) ) continue;
+ p = sqlite3DbMallocRaw(pParse->db, sizeof(IndexedExpr));
+ if( p==0 ) break;
+ p->pIENext = pParse->pIdxEpr;
+#ifdef WHERETRACE_ENABLED
+ if( sqlite3WhereTrace & 0x200 ){
+ sqlite3DebugPrintf("New pParse->pIdxEpr term {%d,%d}\n", iIdxCur, i);
+ if( sqlite3WhereTrace & 0x5000 ) sqlite3ShowExpr(pExpr);
+ }
+#endif
+ p->pExpr = sqlite3ExprDup(pParse->db, pExpr, 0);
+ p->iDataCur = pTabItem->iCursor;
+ p->iIdxCur = iIdxCur;
+ p->iIdxCol = i;
+ p->bMaybeNullRow = bMaybeNullRow;
+ if( sqlite3IndexAffinityStr(pParse->db, pIdx) ){
+ p->aff = pIdx->zColAff[i];
+ }
+#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
+ p->zIdxName = pIdx->zName;
+#endif
+ pParse->pIdxEpr = p;
+ if( p->pIENext==0 ){
+ sqlite3ParserAddCleanup(pParse, whereIndexedExprCleanup, pParse);
+ }
+ }
+}
+
/*
** Generate the beginning of the loop used for WHERE clause processing.
** The return value is a pointer to an opaque structure that contains
@@ -154030,6 +163631,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
Expr *pWhere, /* The WHERE clause */
ExprList *pOrderBy, /* An ORDER BY (or GROUP BY) clause, or NULL */
ExprList *pResultSet, /* Query result set. Req'd for DISTINCT */
+ Select *pSelect, /* The entire SELECT statement */
u16 wctrlFlags, /* The WHERE_* flags defined in sqliteInt.h */
int iAuxArg /* If WHERE_OR_SUBCLAUSE is set, index cursor number
** If WHERE_USE_LIMIT, then the limit amount */
@@ -154064,13 +163666,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* An ORDER/GROUP BY clause of more than 63 terms cannot be optimized */
testcase( pOrderBy && pOrderBy->nExpr==BMS-1 );
if( pOrderBy && pOrderBy->nExpr>=BMS ) pOrderBy = 0;
- sWLB.pOrderBy = pOrderBy;
-
- /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via
- ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */
- if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){
- wctrlFlags &= ~WHERE_WANT_DISTINCT;
- }
/* The number of tables in the FROM clause is limited by the number of
** bits in a Bitmask
@@ -154095,7 +163690,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** field (type Bitmask) it must be aligned on an 8-byte boundary on
** some architectures. Hence the ROUND8() below.
*/
- nByteWInfo = ROUND8(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel));
+ nByteWInfo = ROUND8P(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel));
pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop));
if( db->mallocFailed ){
sqlite3DbFree(db, pWInfo);
@@ -154105,7 +163700,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
pWInfo->pParse = pParse;
pWInfo->pTabList = pTabList;
pWInfo->pOrderBy = pOrderBy;
+#if WHERETRACE_ENABLED
pWInfo->pWhere = pWhere;
+#endif
pWInfo->pResultSet = pResultSet;
pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1;
pWInfo->nLevel = nTabList;
@@ -154113,11 +163710,16 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
pWInfo->wctrlFlags = wctrlFlags;
pWInfo->iLimit = iAuxArg;
pWInfo->savedNQueryLoop = pParse->nQueryLoop;
+ pWInfo->pSelect = pSelect;
memset(&pWInfo->nOBSat, 0,
offsetof(WhereInfo,sWC) - offsetof(WhereInfo,nOBSat));
memset(&pWInfo->a[0], 0, sizeof(WhereLoop)+nTabList*sizeof(WhereLevel));
assert( pWInfo->eOnePass==ONEPASS_OFF ); /* ONEPASS defaults to OFF */
pMaskSet = &pWInfo->sMaskSet;
+ pMaskSet->n = 0;
+ pMaskSet->ix[0] = -99; /* Initialize ix[0] to a value that can never be
+ ** a valid cursor number, to avoid an initial
+ ** test for pMaskSet->n==0 in sqlite3WhereGetMask() */
sWLB.pWInfo = pWInfo;
sWLB.pWC = &pWInfo->sWC;
sWLB.pNew = (WhereLoop*)(((char*)pWInfo)+nByteWInfo);
@@ -154130,7 +163732,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* Split the WHERE clause into separate subexpressions where each
** subexpression is separated by an AND operator.
*/
- initMaskSet(pMaskSet);
sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo);
sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND);
@@ -154138,7 +163739,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
*/
if( nTabList==0 ){
if( pOrderBy ) pWInfo->nOBSat = pOrderBy->nExpr;
- if( wctrlFlags & WHERE_WANT_DISTINCT ){
+ if( (wctrlFlags & WHERE_WANT_DISTINCT)!=0
+ && OptimizationEnabled(db, SQLITE_DistinctOpt)
+ ){
pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE;
}
ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW"));
@@ -154176,30 +163779,61 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* Analyze all of the subexpressions. */
sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC);
- if( db->mallocFailed ) goto whereBeginError;
+ if( pSelect && pSelect->pLimit ){
+ sqlite3WhereAddLimit(&pWInfo->sWC, pSelect);
+ }
+ if( pParse->nErr ) goto whereBeginError;
- /* Special case: WHERE terms that do not refer to any tables in the join
- ** (constant expressions). Evaluate each such term, and jump over all the
- ** generated code if the result is not true.
+ /* The False-WHERE-Term-Bypass optimization:
**
- ** Do not do this if the expression contains non-deterministic functions
- ** that are not within a sub-select. This is not strictly required, but
- ** preserves SQLite's legacy behaviour in the following two cases:
+ ** If there are WHERE terms that are false, then no rows will be output,
+ ** so skip over all of the code generated here.
**
- ** FROM ... WHERE random()>0; -- eval random() once per row
- ** FROM ... WHERE (SELECT random())>0; -- eval random() once overall
- */
- for(ii=0; ii<sWLB.pWC->nTerm; ii++){
- WhereTerm *pT = &sWLB.pWC->a[ii];
+ ** Conditions:
+ **
+ ** (1) The WHERE term must not refer to any tables in the join.
+ ** (2) The term must not come from an ON clause on the
+ ** right-hand side of a LEFT or FULL JOIN.
+ ** (3) The term must not come from an ON clause, or there must be
+ ** no RIGHT or FULL OUTER joins in pTabList.
+ ** (4) If the expression contains non-deterministic functions
+ ** that are not within a sub-select. This is not required
+ ** for correctness but rather to preserves SQLite's legacy
+ ** behaviour in the following two cases:
+ **
+ ** WHERE random()>0; -- eval random() once per row
+ ** WHERE (SELECT random())>0; -- eval random() just once overall
+ **
+ ** Note that the Where term need not be a constant in order for this
+ ** optimization to apply, though it does need to be constant relative to
+ ** the current subquery (condition 1). The term might include variables
+ ** from outer queries so that the value of the term changes from one
+ ** invocation of the current subquery to the next.
+ */
+ for(ii=0; ii<sWLB.pWC->nBase; ii++){
+ WhereTerm *pT = &sWLB.pWC->a[ii]; /* A term of the WHERE clause */
+ Expr *pX; /* The expression of pT */
if( pT->wtFlags & TERM_VIRTUAL ) continue;
- if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){
- sqlite3ExprIfFalse(pParse, pT->pExpr, pWInfo->iBreak, SQLITE_JUMPIFNULL);
+ pX = pT->pExpr;
+ assert( pX!=0 );
+ assert( pT->prereqAll!=0 || !ExprHasProperty(pX, EP_OuterON) );
+ if( pT->prereqAll==0 /* Conditions (1) and (2) */
+ && (nTabList==0 || exprIsDeterministic(pX)) /* Condition (4) */
+ && !(ExprHasProperty(pX, EP_InnerON) /* Condition (3) */
+ && (pTabList->a[0].fg.jointype & JT_LTORJ)!=0 )
+ ){
+ sqlite3ExprIfFalse(pParse, pX, pWInfo->iBreak, SQLITE_JUMPIFNULL);
pT->wtFlags |= TERM_CODED;
}
}
if( wctrlFlags & WHERE_WANT_DISTINCT ){
- if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){
+ if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){
+ /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via
+ ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */
+ wctrlFlags &= ~WHERE_WANT_DISTINCT;
+ pWInfo->wctrlFlags &= ~WHERE_WANT_DISTINCT;
+ }else if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){
/* The DISTINCT marking is pointless. Ignore it. */
pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE;
}else if( pOrderBy==0 ){
@@ -154211,13 +163845,13 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* Construct the WhereLoop objects */
#if defined(WHERETRACE_ENABLED)
- if( sqlite3WhereTrace & 0xffff ){
+ if( sqlite3WhereTrace & 0xffffffff ){
sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags);
if( wctrlFlags & WHERE_USE_LIMIT ){
sqlite3DebugPrintf(", limit: %d", iAuxArg);
}
sqlite3DebugPrintf(")\n");
- if( sqlite3WhereTrace & 0x100 ){
+ if( sqlite3WhereTrace & 0x8000 ){
Select sSelect;
memset(&sSelect, 0, sizeof(sSelect));
sSelect.selFlags = SF_WhereBegin;
@@ -154227,10 +163861,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
sSelect.pEList = pResultSet;
sqlite3TreeViewSelect(0, &sSelect, 0);
}
- }
- if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */
- sqlite3DebugPrintf("---- WHERE clause at start of analysis:\n");
- sqlite3WhereClausePrint(sWLB.pWC);
+ if( sqlite3WhereTrace & 0x4000 ){ /* Display all WHERE clause terms */
+ sqlite3DebugPrintf("---- WHERE clause at start of analysis:\n");
+ sqlite3WhereClausePrint(sWLB.pWC);
+ }
}
#endif
@@ -154246,7 +163880,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** loops will be built using the revised truthProb values. */
if( sWLB.bldFlags2 & SQLITE_BLDF2_2NDPASS ){
WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC);
- WHERETRACE(0xffff,
+ WHERETRACE(0xffffffff,
("**** Redo all loop computations due to"
" TERM_HIGHTRUTH changes ****\n"));
while( pWInfo->pLoops ){
@@ -154270,9 +163904,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){
pWInfo->revMask = ALLBITS;
}
- if( pParse->nErr || db->mallocFailed ){
+ if( pParse->nErr ){
goto whereBeginError;
}
+ assert( db->mallocFailed==0 );
#ifdef WHERETRACE_ENABLED
if( sqlite3WhereTrace ){
sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut);
@@ -154300,34 +163935,15 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
}
#endif
- /* Attempt to omit tables from the join that do not affect the result.
- ** For a table to not affect the result, the following must be true:
- **
- ** 1) The query must not be an aggregate.
- ** 2) The table must be the RHS of a LEFT JOIN.
- ** 3) Either the query must be DISTINCT, or else the ON or USING clause
- ** must contain a constraint that limits the scan of the table to
- ** at most a single row.
- ** 4) The table must not be referenced by any part of the query apart
- ** from its own USING or ON clause.
- **
- ** For example, given:
- **
- ** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1);
- ** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2);
- ** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3);
- **
- ** then table t2 can be omitted from the following:
- **
- ** SELECT v1, v3 FROM t1
- ** LEFT JOIN t2 ON (t1.ipk=t2.ipk)
- ** LEFT JOIN t3 ON (t1.ipk=t3.ipk)
+ /* Attempt to omit tables from a join that do not affect the result.
+ ** See the comment on whereOmitNoopJoin() for further information.
**
- ** or from:
- **
- ** SELECT DISTINCT v1, v3 FROM t1
- ** LEFT JOIN t2
- ** LEFT JOIN t3 ON (t1.ipk=t3.ipk)
+ ** This query optimization is factored out into a separate "no-inline"
+ ** procedure to keep the sqlite3WhereBegin() procedure from becoming
+ ** too large. If sqlite3WhereBegin() becomes too large, that prevents
+ ** some C-compiler optimizers from in-lining the
+ ** sqlite3WhereCodeOneLoopStart() procedure, and it is important to
+ ** in-line sqlite3WhereCodeOneLoopStart() for performance reasons.
*/
notReady = ~(Bitmask)0;
if( pWInfo->nLevel>=2
@@ -154335,55 +163951,26 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
&& 0==(wctrlFlags & WHERE_AGG_DISTINCT) /* condition (1) above */
&& OptimizationEnabled(db, SQLITE_OmitNoopJoin)
){
- int i;
- Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pResultSet);
- if( sWLB.pOrderBy ){
- tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy);
- }
- for(i=pWInfo->nLevel-1; i>=1; i--){
- WhereTerm *pTerm, *pEnd;
- SrcItem *pItem;
- pLoop = pWInfo->a[i].pWLoop;
- pItem = &pWInfo->pTabList->a[pLoop->iTab];
- if( (pItem->fg.jointype & JT_LEFT)==0 ) continue;
- if( (wctrlFlags & WHERE_WANT_DISTINCT)==0
- && (pLoop->wsFlags & WHERE_ONEROW)==0
- ){
- continue;
- }
- if( (tabUsed & pLoop->maskSelf)!=0 ) continue;
- pEnd = sWLB.pWC->a + sWLB.pWC->nTerm;
- for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){
- if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
- if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
- || pTerm->pExpr->iRightJoinTable!=pItem->iCursor
- ){
- break;
- }
- }
- }
- if( pTerm<pEnd ) continue;
- WHERETRACE(0xffff, ("-> drop loop %c not used\n", pLoop->cId));
- notReady &= ~pLoop->maskSelf;
- for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){
- if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
- pTerm->wtFlags |= TERM_CODED;
- }
- }
- if( i!=pWInfo->nLevel-1 ){
- int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel);
- memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte);
- }
- pWInfo->nLevel--;
- nTabList--;
- }
+ notReady = whereOmitNoopJoin(pWInfo, notReady);
+ nTabList = pWInfo->nLevel;
+ assert( nTabList>0 );
+ }
+
+ /* Check to see if there are any SEARCH loops that might benefit from
+ ** using a Bloom filter.
+ */
+ if( pWInfo->nLevel>=2
+ && OptimizationEnabled(db, SQLITE_BloomFilter)
+ ){
+ whereCheckIfBloomFilterIsUseful(pWInfo);
}
+
#if defined(WHERETRACE_ENABLED)
- if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */
+ if( sqlite3WhereTrace & 0x4000 ){ /* Display all terms of the WHERE clause */
sqlite3DebugPrintf("---- WHERE clause at end of analysis:\n");
sqlite3WhereClausePrint(sWLB.pWC);
}
- WHERETRACE(0xffff,("*** Optimizer Finished ***\n"));
+ WHERETRACE(0xffffffff,("*** Optimizer Finished ***\n"));
#endif
pWInfo->pParse->nQueryLoop += pWInfo->nRowOut;
@@ -154438,7 +164025,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
pTab = pTabItem->pTab;
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
pLoop = pLevel->pWLoop;
- if( (pTab->tabFlags & TF_Ephemeral)!=0 || pTab->pSelect ){
+ if( (pTab->tabFlags & TF_Ephemeral)!=0 || IsView(pTab) ){
/* Do nothing */
}else
#ifndef SQLITE_OMIT_VIRTUALTABLE
@@ -154450,8 +164037,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* noop */
}else
#endif
- if( (pLoop->wsFlags & WHERE_IDX_ONLY)==0
- && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){
+ if( ((pLoop->wsFlags & WHERE_IDX_ONLY)==0
+ && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0)
+ || (pTabItem->fg.jointype & (JT_LTORJ|JT_RIGHT))!=0
+ ){
int op = OP_OpenRead;
if( pWInfo->eOnePass!=ONEPASS_OFF ){
op = OP_OpenWrite;
@@ -154464,6 +164053,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
if( pWInfo->eOnePass==ONEPASS_OFF
&& pTab->nCol<BMS
&& (pTab->tabFlags & (TF_HasGenerated|TF_WithoutRowid))==0
+ && (pLoop->wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))==0
){
/* If we know that only a prefix of the record will be used,
** it is advantageous to reduce the "column count" field in
@@ -154475,7 +164065,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
assert( n<=pTab->nCol );
}
#ifdef SQLITE_ENABLE_CURSOR_HINTS
- if( pLoop->u.btree.pIndex!=0 ){
+ if( pLoop->u.btree.pIndex!=0 && (pTab->tabFlags & TF_WithoutRowid)==0 ){
sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete);
}else
#endif
@@ -154517,8 +164107,12 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
op = OP_ReopenIdx;
}else{
iIndexCur = pParse->nTab++;
+ if( pIx->bHasExpr && OptimizationEnabled(db, SQLITE_IndexedExpr) ){
+ whereAddIndexedExpr(pParse, pIx, iIndexCur, pTabItem);
+ }
}
pLevel->iIdxCur = iIndexCur;
+ assert( pIx!=0 );
assert( pIx->pSchema==pTab->pSchema );
assert( iIndexCur>=0 );
if( op ){
@@ -154552,6 +164146,37 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
}
}
if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb);
+ if( (pTabItem->fg.jointype & JT_RIGHT)!=0
+ && (pLevel->pRJ = sqlite3WhereMalloc(pWInfo, sizeof(WhereRightJoin)))!=0
+ ){
+ WhereRightJoin *pRJ = pLevel->pRJ;
+ pRJ->iMatch = pParse->nTab++;
+ pRJ->regBloom = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Blob, 65536, pRJ->regBloom);
+ pRJ->regReturn = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Null, 0, pRJ->regReturn);
+ assert( pTab==pTabItem->pTab );
+ if( HasRowid(pTab) ){
+ KeyInfo *pInfo;
+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, 1);
+ pInfo = sqlite3KeyInfoAlloc(pParse->db, 1, 0);
+ if( pInfo ){
+ pInfo->aColl[0] = 0;
+ pInfo->aSortFlags[0] = 0;
+ sqlite3VdbeAppendP4(v, pInfo, P4_KEYINFO);
+ }
+ }else{
+ Index *pPk = sqlite3PrimaryKeyIndex(pTab);
+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, pPk->nKeyCol);
+ sqlite3VdbeSetP4KeyInfo(pParse, pPk);
+ }
+ pLoop->wsFlags &= ~WHERE_IDX_ONLY;
+ /* The nature of RIGHT JOIN processing is such that it messes up
+ ** the output order. So omit any ORDER BY/GROUP BY elimination
+ ** optimizations. We need to do an actual sort for RIGHT JOIN. */
+ pWInfo->nOBSat = 0;
+ pWInfo->eDistinct = WHERE_DISTINCT_UNORDERED;
+ }
}
pWInfo->iTop = sqlite3VdbeCurrentAddr(v);
if( db->mallocFailed ) goto whereBeginError;
@@ -154563,15 +164188,31 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
for(ii=0; ii<nTabList; ii++){
int addrExplain;
int wsFlags;
+ SrcItem *pSrc;
+ if( pParse->nErr ) goto whereBeginError;
pLevel = &pWInfo->a[ii];
wsFlags = pLevel->pWLoop->wsFlags;
+ pSrc = &pTabList->a[pLevel->iFrom];
+ if( pSrc->fg.isMaterialized ){
+ if( pSrc->fg.isCorrelated ){
+ sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub);
+ }else{
+ int iOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
+ sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub);
+ sqlite3VdbeJumpHere(v, iOnce);
+ }
+ }
+ assert( pTabList == pWInfo->pTabList );
+ if( (wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))!=0 ){
+ if( (wsFlags & WHERE_AUTO_INDEX)!=0 ){
#ifndef SQLITE_OMIT_AUTOMATIC_INDEX
- if( (pLevel->pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 ){
- constructAutomaticIndex(pParse, &pWInfo->sWC,
- &pTabList->a[pLevel->iFrom], notReady, pLevel);
+ constructAutomaticIndex(pParse, &pWInfo->sWC, notReady, pLevel);
+#endif
+ }else{
+ sqlite3ConstructBloomFilter(pWInfo, ii, pLevel, notReady);
+ }
if( db->mallocFailed ) goto whereBeginError;
}
-#endif
addrExplain = sqlite3WhereExplainOneScan(
pParse, pTabList, pLevel, wctrlFlags
);
@@ -154591,8 +164232,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* Jump here if malloc fails */
whereBeginError:
if( pWInfo ){
- testcase( pWInfo->pExprMods!=0 );
- whereUndoExprMods(pWInfo);
pParse->nQueryLoop = pWInfo->savedNQueryLoop;
whereInfoFree(db, pWInfo);
}
@@ -154619,6 +164258,26 @@ whereBeginError:
}
#endif
+#ifdef SQLITE_DEBUG
+/*
+** Return true if cursor iCur is opened by instruction k of the
+** bytecode. Used inside of assert() only.
+*/
+static int cursorIsOpen(Vdbe *v, int iCur, int k){
+ while( k>=0 ){
+ VdbeOp *pOp = sqlite3VdbeGetOp(v,k--);
+ if( pOp->p1!=iCur ) continue;
+ if( pOp->opcode==OP_Close ) return 0;
+ if( pOp->opcode==OP_OpenRead ) return 1;
+ if( pOp->opcode==OP_OpenWrite ) return 1;
+ if( pOp->opcode==OP_OpenDup ) return 1;
+ if( pOp->opcode==OP_OpenAutoindex ) return 1;
+ if( pOp->opcode==OP_OpenEphemeral ) return 1;
+ }
+ return 0;
+}
+#endif /* SQLITE_DEBUG */
+
/*
** Generate the end of the WHERE loop. See comments on
** sqlite3WhereBegin() for additional information.
@@ -154632,6 +164291,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
SrcList *pTabList = pWInfo->pTabList;
sqlite3 *db = pParse->db;
int iEnd = sqlite3VdbeCurrentAddr(v);
+ int nRJ = 0;
/* Generate loop termination code.
*/
@@ -154639,6 +164299,17 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
for(i=pWInfo->nLevel-1; i>=0; i--){
int addr;
pLevel = &pWInfo->a[i];
+ if( pLevel->pRJ ){
+ /* Terminate the subroutine that forms the interior of the loop of
+ ** the RIGHT JOIN table */
+ WhereRightJoin *pRJ = pLevel->pRJ;
+ sqlite3VdbeResolveLabel(v, pLevel->addrCont);
+ pLevel->addrCont = 0;
+ pRJ->endSubrtn = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp3(v, OP_Return, pRJ->regReturn, pRJ->addrSubrtn, 1);
+ VdbeCoverage(v);
+ nRJ++;
+ }
pLoop = pLevel->pWLoop;
if( pLevel->op!=OP_Noop ){
#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT
@@ -154666,7 +164337,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
}
#endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */
/* The common case: Advance to the next row */
- sqlite3VdbeResolveLabel(v, pLevel->addrCont);
+ if( pLevel->addrCont ) sqlite3VdbeResolveLabel(v, pLevel->addrCont);
sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3);
sqlite3VdbeChangeP5(v, pLevel->p5);
VdbeCoverage(v);
@@ -154681,10 +164352,10 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT
if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek);
#endif
- }else{
+ }else if( pLevel->addrCont ){
sqlite3VdbeResolveLabel(v, pLevel->addrCont);
}
- if( pLoop->wsFlags & WHERE_IN_ABLE && pLevel->u.in.nIn>0 ){
+ if( (pLoop->wsFlags & WHERE_IN_ABLE)!=0 && pLevel->u.in.nIn>0 ){
struct InLoop *pIn;
int j;
sqlite3VdbeResolveLabel(v, pLevel->addrNxt);
@@ -154731,6 +164402,10 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
}
}
sqlite3VdbeResolveLabel(v, pLevel->addrBrk);
+ if( pLevel->pRJ ){
+ sqlite3VdbeAddOp3(v, OP_Return, pLevel->pRJ->regReturn, 0, 1);
+ VdbeCoverage(v);
+ }
if( pLevel->addrSkip ){
sqlite3VdbeGoto(v, pLevel->addrSkip);
VdbeComment((v, "next skip-scan on %s", pLoop->u.btree.pIndex->zName));
@@ -154753,8 +164428,14 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iTabCur);
}
if( (ws & WHERE_INDEXED)
- || ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx)
+ || ((ws & WHERE_MULTI_OR) && pLevel->u.pCoveringIdx)
){
+ if( ws & WHERE_MULTI_OR ){
+ Index *pIx = pLevel->u.pCoveringIdx;
+ int iDb = sqlite3SchemaToIndex(db, pIx->pSchema);
+ sqlite3VdbeAddOp3(v, OP_ReopenIdx, pLevel->iIdxCur, pIx->tnum, iDb);
+ sqlite3VdbeSetP4KeyInfo(pParse, pIx);
+ }
sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur);
}
if( pLevel->op==OP_Return ){
@@ -154768,11 +164449,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
pWInfo->pTabList->a[pLevel->iFrom].pTab->zName));
}
- /* The "break" point is here, just past the end of the outer loop.
- ** Set it.
- */
- sqlite3VdbeResolveLabel(v, pWInfo->iBreak);
-
assert( pWInfo->nLevel<=pTabList->nSrc );
for(i=0, pLevel=pWInfo->a; i<pWInfo->nLevel; i++, pLevel++){
int k, last;
@@ -154783,6 +164459,15 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
assert( pTab!=0 );
pLoop = pLevel->pWLoop;
+ /* Do RIGHT JOIN processing. Generate code that will output the
+ ** unmatched rows of the right operand of the RIGHT JOIN with
+ ** all of the columns of the left operand set to NULL.
+ */
+ if( pLevel->pRJ ){
+ sqlite3WhereRightJoinLoop(pWInfo, i, pLevel);
+ continue;
+ }
+
/* For a co-routine, change all OP_Column references to the table of
** the co-routine into OP_Copy of result contained in a register.
** OP_Rowid becomes OP_Null.
@@ -154794,29 +164479,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
continue;
}
-#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE
- /* Close all of the cursors that were opened by sqlite3WhereBegin.
- ** Except, do not close cursors that will be reused by the OR optimization
- ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors
- ** created for the ONEPASS optimization.
- */
- if( (pTab->tabFlags & TF_Ephemeral)==0
- && pTab->pSelect==0
- && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0
- ){
- int ws = pLoop->wsFlags;
- if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){
- sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor);
- }
- if( (ws & WHERE_INDEXED)!=0
- && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0
- && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1]
- ){
- sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur);
- }
- }
-#endif
-
/* If this scan uses an index, make VDBE code substitutions to read data
** from the index instead of from the table where possible. In some cases
** this optimization prevents the table from ever being read, which can
@@ -154831,7 +164493,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
if( pLoop->wsFlags & (WHERE_INDEXED|WHERE_IDX_ONLY) ){
pIdx = pLoop->u.btree.pIndex;
}else if( pLoop->wsFlags & WHERE_MULTI_OR ){
- pIdx = pLevel->u.pCovidx;
+ pIdx = pLevel->u.pCoveringIdx;
}
if( pIdx
&& !db->mallocFailed
@@ -154841,10 +164503,28 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
}else{
last = pWInfo->iEndWhere;
}
+ if( pIdx->bHasExpr ){
+ IndexedExpr *p = pParse->pIdxEpr;
+ while( p ){
+ if( p->iIdxCur==pLevel->iIdxCur ){
+#ifdef WHERETRACE_ENABLED
+ if( sqlite3WhereTrace & 0x200 ){
+ sqlite3DebugPrintf("Disable pParse->pIdxEpr term {%d,%d}\n",
+ p->iIdxCur, p->iIdxCol);
+ if( sqlite3WhereTrace & 0x5000 ) sqlite3ShowExpr(p->pExpr);
+ }
+#endif
+ p->iDataCur = -1;
+ p->iIdxCur = -1;
+ }
+ p = p->pIENext;
+ }
+ }
k = pLevel->addrBody + 1;
#ifdef SQLITE_DEBUG
if( db->flags & SQLITE_VdbeAddopTrace ){
- printf("TRANSLATE opcodes in range %d..%d\n", k, last-1);
+ printf("TRANSLATE cursor %d->%d in opcode range %d..%d\n",
+ pLevel->iTabCur, pLevel->iIdxCur, k, last-1);
}
/* Proof that the "+1" on the k value above is safe */
pOp = sqlite3VdbeGetOp(v, k - 1);
@@ -154865,6 +164545,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
){
int x = pOp->p2;
assert( pIdx->pTable==pTab );
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ if( pOp->opcode==OP_Offset ){
+ /* Do not need to translate the column number */
+ }else
+#endif
if( !HasRowid(pTab) ){
Index *pPk = sqlite3PrimaryKeyIndex(pTab);
x = pPk->aiColumn[x];
@@ -154878,9 +164563,22 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
pOp->p2 = x;
pOp->p1 = pLevel->iIdxCur;
OpcodeRewriteTrace(db, k, pOp);
+ }else{
+ /* Unable to translate the table reference into an index
+ ** reference. Verify that this is harmless - that the
+ ** table being referenced really is open.
+ */
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0
+ || cursorIsOpen(v,pOp->p1,k)
+ || pOp->opcode==OP_Offset
+ );
+#else
+ assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0
+ || cursorIsOpen(v,pOp->p1,k)
+ );
+#endif
}
- assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0
- || pWInfo->eOnePass );
}else if( pOp->opcode==OP_Rowid ){
pOp->p1 = pLevel->iIdxCur;
pOp->opcode = OP_IdxRowid;
@@ -154899,11 +164597,16 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
}
}
+ /* The "break" point is here, just past the end of the outer loop.
+ ** Set it.
+ */
+ sqlite3VdbeResolveLabel(v, pWInfo->iBreak);
+
/* Final cleanup
*/
- if( pWInfo->pExprMods ) whereUndoExprMods(pWInfo);
pParse->nQueryLoop = pWInfo->savedNQueryLoop;
whereInfoFree(db, pWInfo);
+ pParse->withinRJSubrtn -= nRJ;
return;
}
@@ -155492,7 +165195,7 @@ static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ }
/* Window functions that use all window interfaces: xStep, xFinal,
** xValue, and xInverse */
#define WINDOWFUNCALL(name,nArg,extra) { \
- nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
+ nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
name ## StepFunc, name ## FinalizeFunc, name ## ValueFunc, \
name ## InvFunc, name ## Name, {0} \
}
@@ -155500,7 +165203,7 @@ static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ }
/* Window functions that are implemented using bytecode and thus have
** no-op routines for their methods */
#define WINDOWFUNCNOOP(name,nArg,extra) { \
- nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
+ nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
noopStepFunc, noopValueFunc, noopValueFunc, \
noopStepFunc, name ## Name, {0} \
}
@@ -155509,7 +165212,7 @@ static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ }
** same routine for xFinalize and xValue and which never call
** xInverse. */
#define WINDOWFUNCX(name,nArg,extra) { \
- nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
+ nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \
name ## StepFunc, name ## ValueFunc, name ## ValueFunc, \
noopStepFunc, name ## Name, {0} \
}
@@ -155635,7 +165338,7 @@ SQLITE_PRIVATE void sqlite3WindowUpdate(
}
}
}
- pWin->pFunc = pFunc;
+ pWin->pWFunc = pFunc;
}
/*
@@ -155696,6 +165399,7 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){
}
/* no break */ deliberate_fall_through
+ case TK_IF_NULL_ROW:
case TK_AGG_FUNCTION:
case TK_COLUMN: {
int iCol = -1;
@@ -155811,7 +165515,6 @@ static ExprList *exprListAppendList(
for(i=0; i<pAppend->nExpr; i++){
sqlite3 *db = pParse->db;
Expr *pDup = sqlite3ExprDup(db, pAppend->a[i].pExpr, 0);
- assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) );
if( db->mallocFailed ){
sqlite3ExprDelete(db, pDup);
break;
@@ -155819,9 +165522,7 @@ static ExprList *exprListAppendList(
if( bIntToNull ){
int iDummy;
Expr *pSub;
- for(pSub=pDup; ExprHasProperty(pSub, EP_Skip); pSub=pSub->pLeft){
- assert( pSub );
- }
+ pSub = sqlite3ExprSkipCollateAndLikely(pDup);
if( sqlite3ExprIsInteger(pSub, &iDummy) ){
pSub->op = TK_NULL;
pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse);
@@ -155829,7 +165530,7 @@ static ExprList *exprListAppendList(
}
}
pList = sqlite3ExprListAppend(pParse, pList, pDup);
- if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags;
+ if( pList ) pList->a[nInit+i].fg.sortFlags = pAppend->a[i].fg.sortFlags;
}
}
return pList;
@@ -155854,7 +165555,8 @@ static int sqlite3WindowExtraAggFuncDepth(Walker *pWalker, Expr *pExpr){
static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){
if( pExpr->op==TK_AGG_FUNCTION && pExpr->pAggInfo==0 ){
- sqlite3ErrorMsg(pWalker->pParse,
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ sqlite3ErrorMsg(pWalker->pParse,
"misuse of aggregate: %s()", pExpr->u.zToken);
}
return WRC_Continue;
@@ -155869,7 +165571,11 @@ static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){
*/
SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
int rc = SQLITE_OK;
- if( p->pWin && p->pPrior==0 && ALWAYS((p->selFlags & SF_WinRewrite)==0) ){
+ if( p->pWin
+ && p->pPrior==0
+ && ALWAYS((p->selFlags & SF_WinRewrite)==0)
+ && ALWAYS(!IN_RENAME_OBJECT)
+ ){
Vdbe *v = sqlite3GetVdbe(pParse);
sqlite3 *db = pParse->db;
Select *pSub = 0; /* The subquery */
@@ -155942,8 +165648,11 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
** window function - one for the accumulator, another for interim
** results. */
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
- ExprList *pArgs = pWin->pOwner->x.pList;
- if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){
+ ExprList *pArgs;
+ assert( ExprUseXList(pWin->pOwner) );
+ assert( pWin->pWFunc!=0 );
+ pArgs = pWin->pOwner->x.pList;
+ if( pWin->pWFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){
selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist);
pWin->iArgCol = (pSublist ? pSublist->nExpr : 0);
pWin->bExprArgs = 1;
@@ -155975,15 +165684,19 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
pSub = sqlite3SelectNew(
pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0
);
- SELECTTRACE(1,pParse,pSub,
+ TREETRACE(0x40,pParse,pSub,
("New window-function subquery in FROM clause of (%u/%p)\n",
p->selId, p));
p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0);
+ assert( pSub!=0 || p->pSrc==0 ); /* Due to db->mallocFailed test inside
+ ** of sqlite3DbMallocRawNN() called from
+ ** sqlite3SrcListAppend() */
if( p->pSrc ){
Table *pTab2;
p->pSrc->a[0].pSelect = pSub;
+ p->pSrc->a[0].fg.isCorrelated = 1;
sqlite3SrcListAssignCursors(pParse, p->pSrc);
- pSub->selFlags |= SF_Expanded;
+ pSub->selFlags |= SF_Expanded|SF_OrderByReqd;
pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE);
pSub->selFlags |= (selFlags & SF_Aggregate);
if( pTab2==0 ){
@@ -156006,15 +165719,14 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
sqlite3SelectDelete(db, pSub);
}
if( db->mallocFailed ) rc = SQLITE_NOMEM;
- sqlite3DbFree(db, pTab);
- }
- if( rc ){
- if( pParse->nErr==0 ){
- assert( pParse->db->mallocFailed );
- sqlite3ErrorToParser(pParse->db, SQLITE_NOMEM);
- }
+ /* Defer deleting the temporary table pTab because if an error occurred,
+ ** there could still be references to that table embedded in the
+ ** result-set or ORDER BY clause of the SELECT statement p. */
+ sqlite3ParserAddCleanup(pParse, sqlite3DbFree, pTab);
}
+
+ assert( rc==SQLITE_OK || pParse->nErr!=0 );
return rc;
}
@@ -156255,7 +165967,12 @@ SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin){
** different, or 2 if it cannot be determined if the objects are identical
** or not. Identical window objects can be processed in a single scan.
*/
-SQLITE_PRIVATE int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){
+SQLITE_PRIVATE int sqlite3WindowCompare(
+ const Parse *pParse,
+ const Window *p1,
+ const Window *p2,
+ int bFilter
+){
int res;
if( NEVER(p1==0) || NEVER(p2==0) ) return 1;
if( p1->eFrmType!=p2->eFrmType ) return 1;
@@ -156318,7 +166035,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){
}
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
- FuncDef *p = pWin->pFunc;
+ FuncDef *p = pWin->pWFunc;
if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){
/* The inline versions of min() and max() require a single ephemeral
** table and 3 registers. The registers are used as follows:
@@ -156327,12 +166044,15 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){
** regApp+1: integer value used to ensure keys are unique
** regApp+2: output of MakeRecord
*/
- ExprList *pList = pWin->pOwner->x.pList;
- KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0);
+ ExprList *pList;
+ KeyInfo *pKeyInfo;
+ assert( ExprUseXList(pWin->pOwner) );
+ pList = pWin->pOwner->x.pList;
+ pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0);
pWin->csrApp = pParse->nTab++;
pWin->regApp = pParse->nMem+1;
pParse->nMem += 3;
- if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){
+ if( pKeyInfo && pWin->pWFunc->zName[1]=='i' ){
assert( pKeyInfo->aSortFlags[0]==0 );
pKeyInfo->aSortFlags[0] = KEYINFO_ORDER_DESC;
}
@@ -156416,7 +166136,9 @@ static void windowCheckValue(Parse *pParse, int reg, int eCond){
** with the object passed as the only argument to this function.
*/
static int windowArgCount(Window *pWin){
- ExprList *pList = pWin->pOwner->x.pList;
+ const ExprList *pList;
+ assert( ExprUseXList(pWin->pOwner) );
+ pList = pWin->pOwner->x.pList;
return (pList ? pList->nExpr : 0);
}
@@ -156553,7 +166275,7 @@ static void windowAggStep(
Vdbe *v = sqlite3GetVdbe(pParse);
Window *pWin;
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
- FuncDef *pFunc = pWin->pFunc;
+ FuncDef *pFunc = pWin->pWFunc;
int regArg;
int nArg = pWin->bExprArgs ? 0 : windowArgCount(pWin);
int i;
@@ -156601,6 +166323,7 @@ static void windowAggStep(
int addrIf = 0;
if( pWin->pFilter ){
int regTmp;
+ assert( ExprUseXList(pWin->pOwner) );
assert( pWin->bExprArgs || !nArg ||nArg==pWin->pOwner->x.pList->nExpr );
assert( pWin->bExprArgs || nArg ||pWin->pOwner->x.pList==0 );
regTmp = sqlite3GetTempReg(pParse);
@@ -156614,13 +166337,14 @@ static void windowAggStep(
int iOp = sqlite3VdbeCurrentAddr(v);
int iEnd;
+ assert( ExprUseXList(pWin->pOwner) );
nArg = pWin->pOwner->x.pList->nExpr;
regArg = sqlite3GetTempRange(pParse, nArg);
sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0);
for(iEnd=sqlite3VdbeCurrentAddr(v); iOp<iEnd; iOp++){
VdbeOp *pOp = sqlite3VdbeGetOp(v, iOp);
- if( pOp->opcode==OP_Column && pOp->p1==pWin->iEphCsr ){
+ if( pOp->opcode==OP_Column && pOp->p1==pMWin->iEphCsr ){
pOp->p1 = csr;
}
}
@@ -156628,6 +166352,7 @@ static void windowAggStep(
if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){
CollSeq *pColl;
assert( nArg>0 );
+ assert( ExprUseXList(pWin->pOwner) );
pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr);
sqlite3VdbeAddOp4(v, OP_CollSeq, 0,0,0, (const char*)pColl, P4_COLLSEQ);
}
@@ -156664,7 +166389,7 @@ static void windowAggFinal(WindowCodeArg *p, int bFin){
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
if( pMWin->regStartRowid==0
- && (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX)
+ && (pWin->pWFunc->funcFlags & SQLITE_FUNC_MINMAX)
&& (pWin->eStart!=TK_UNBOUNDED)
){
sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult);
@@ -156678,12 +166403,12 @@ static void windowAggFinal(WindowCodeArg *p, int bFin){
int nArg = windowArgCount(pWin);
if( bFin ){
sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, nArg);
- sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF);
+ sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF);
sqlite3VdbeAddOp2(v, OP_Copy, pWin->regAccum, pWin->regResult);
sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum);
}else{
sqlite3VdbeAddOp3(v, OP_AggValue,pWin->regAccum,nArg,pWin->regResult);
- sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF);
+ sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF);
}
}
}
@@ -156812,7 +166537,8 @@ static void windowReturnOneRow(WindowCodeArg *p){
Window *pWin;
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
- FuncDef *pFunc = pWin->pFunc;
+ FuncDef *pFunc = pWin->pWFunc;
+ assert( ExprUseXList(pWin->pOwner) );
if( pFunc->zName==nth_valueName
|| pFunc->zName==first_valueName
){
@@ -156883,7 +166609,7 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){
int nArg = 0;
Window *pWin;
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
- FuncDef *pFunc = pWin->pFunc;
+ FuncDef *pFunc = pWin->pWFunc;
assert( pWin->regAccum );
sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum);
nArg = MAX(nArg, windowArgCount(pWin));
@@ -156913,7 +166639,7 @@ static int windowCacheFrame(Window *pMWin){
Window *pWin;
if( pMWin->regStartRowid ) return 1;
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
- FuncDef *pFunc = pWin->pFunc;
+ FuncDef *pFunc = pWin->pWFunc;
if( (pFunc->zName==nth_valueName)
|| (pFunc->zName==first_valueName)
|| (pFunc->zName==leadName)
@@ -157006,7 +166732,7 @@ static void windowCodeRangeTest(
assert( op==OP_Ge || op==OP_Gt || op==OP_Le );
assert( pOrderBy && pOrderBy->nExpr==1 );
- if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){
+ if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_DESC ){
switch( op ){
case OP_Ge: op = OP_Le; break;
case OP_Gt: op = OP_Lt; break;
@@ -157039,7 +166765,7 @@ static void windowCodeRangeTest(
** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is
** not taken, control jumps over the comparison operator coded below this
** block. */
- if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){
+ if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_BIGNULL ){
/* This block runs if reg1 contains a NULL. */
int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v);
switch( op ){
@@ -157060,10 +166786,9 @@ static void windowCodeRangeTest(
/* This block runs if reg1 is not NULL, but reg2 is. */
sqlite3VdbeJumpHere(v, addr);
- sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v);
- if( op==OP_Gt || op==OP_Ge ){
- sqlite3VdbeChangeP2(v, -1, addrDone);
- }
+ sqlite3VdbeAddOp2(v, OP_IsNull, reg2,
+ (op==OP_Gt || op==OP_Ge) ? addrDone : lbl);
+ VdbeCoverage(v);
}
/* Register reg1 currently contains csr1.peerVal (the peer-value from csr1).
@@ -157271,7 +166996,7 @@ SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){
pNew->zName = sqlite3DbStrDup(db, p->zName);
pNew->zBase = sqlite3DbStrDup(db, p->zBase);
pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0);
- pNew->pFunc = p->pFunc;
+ pNew->pWFunc = p->pWFunc;
pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0);
pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0);
pNew->eFrmType = p->eFrmType;
@@ -157835,8 +167560,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep(
VdbeCoverageNeverNullIf(v, op==OP_Ge); /* NeverNull because bound <expr> */
VdbeCoverageNeverNullIf(v, op==OP_Le); /* values previously checked */
windowAggFinal(&s, 0);
- sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1);
- VdbeCoverageNeverTaken(v);
+ sqlite3VdbeAddOp1(v, OP_Rewind, s.current.csr);
windowReturnOneRow(&s);
sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr);
sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd);
@@ -157848,13 +167572,10 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep(
}
if( pMWin->eStart!=TK_UNBOUNDED ){
- sqlite3VdbeAddOp2(v, OP_Rewind, s.start.csr, 1);
- VdbeCoverageNeverTaken(v);
+ sqlite3VdbeAddOp1(v, OP_Rewind, s.start.csr);
}
- sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1);
- VdbeCoverageNeverTaken(v);
- sqlite3VdbeAddOp2(v, OP_Rewind, s.end.csr, 1);
- VdbeCoverageNeverTaken(v);
+ sqlite3VdbeAddOp1(v, OP_Rewind, s.current.csr);
+ sqlite3VdbeAddOp1(v, OP_Rewind, s.end.csr);
if( regPeer && pOrderBy ){
sqlite3VdbeAddOp3(v, OP_Copy, regNewPeer, regPeer, pOrderBy->nExpr-1);
sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.start.reg, pOrderBy->nExpr-1);
@@ -158148,10 +167869,7 @@ static void updateDeleteLimitError(
}
- /* Construct a new Expr object from a single identifier. Use the
- ** new Expr to populate pOut. Set the span of pOut to be the identifier
- ** that created the expression.
- */
+ /* Construct a new Expr object from a single token */
static Expr *tokenExpr(Parse *pParse, int op, Token t){
Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
if( p ){
@@ -158160,17 +167878,18 @@ static void updateDeleteLimitError(
p->affExpr = 0;
p->flags = EP_Leaf;
ExprClearVVAProperties(p);
- p->iAgg = -1;
+ /* p->iAgg = -1; // Not required */
p->pLeft = p->pRight = 0;
- p->x.pList = 0;
p->pAggInfo = 0;
- p->y.pTab = 0;
+ memset(&p->x, 0, sizeof(p->x));
+ memset(&p->y, 0, sizeof(p->y));
p->op2 = 0;
p->iTable = 0;
p->iColumn = 0;
p->u.zToken = (char*)&p[1];
memcpy(p->u.zToken, t.z, t.n);
p->u.zToken[t.n] = 0;
+ p->w.iOfst = (int)(t.z - pParse->zTail);
if( sqlite3Isquote(p->u.zToken[0]) ){
sqlite3DequoteExpr(p);
}
@@ -158250,8 +167969,8 @@ static void updateDeleteLimitError(
#define TK_LP 22
#define TK_RP 23
#define TK_AS 24
-#define TK_WITHOUT 25
-#define TK_COMMA 26
+#define TK_COMMA 25
+#define TK_WITHOUT 26
#define TK_ABORT 27
#define TK_ACTION 28
#define TK_AFTER 29
@@ -158337,78 +168056,79 @@ static void updateDeleteLimitError(
#define TK_SLASH 109
#define TK_REM 110
#define TK_CONCAT 111
-#define TK_COLLATE 112
-#define TK_BITNOT 113
-#define TK_ON 114
-#define TK_INDEXED 115
-#define TK_STRING 116
-#define TK_JOIN_KW 117
-#define TK_CONSTRAINT 118
-#define TK_DEFAULT 119
-#define TK_NULL 120
-#define TK_PRIMARY 121
-#define TK_UNIQUE 122
-#define TK_CHECK 123
-#define TK_REFERENCES 124
-#define TK_AUTOINCR 125
-#define TK_INSERT 126
-#define TK_DELETE 127
-#define TK_UPDATE 128
-#define TK_SET 129
-#define TK_DEFERRABLE 130
-#define TK_FOREIGN 131
-#define TK_DROP 132
-#define TK_UNION 133
-#define TK_ALL 134
-#define TK_EXCEPT 135
-#define TK_INTERSECT 136
-#define TK_SELECT 137
-#define TK_VALUES 138
-#define TK_DISTINCT 139
-#define TK_DOT 140
-#define TK_FROM 141
-#define TK_JOIN 142
-#define TK_USING 143
-#define TK_ORDER 144
-#define TK_GROUP 145
-#define TK_HAVING 146
-#define TK_LIMIT 147
-#define TK_WHERE 148
-#define TK_RETURNING 149
-#define TK_INTO 150
-#define TK_NOTHING 151
-#define TK_FLOAT 152
-#define TK_BLOB 153
-#define TK_INTEGER 154
-#define TK_VARIABLE 155
-#define TK_CASE 156
-#define TK_WHEN 157
-#define TK_THEN 158
-#define TK_ELSE 159
-#define TK_INDEX 160
-#define TK_ALTER 161
-#define TK_ADD 162
-#define TK_WINDOW 163
-#define TK_OVER 164
-#define TK_FILTER 165
-#define TK_COLUMN 166
-#define TK_AGG_FUNCTION 167
-#define TK_AGG_COLUMN 168
-#define TK_TRUEFALSE 169
-#define TK_ISNOT 170
-#define TK_FUNCTION 171
-#define TK_UMINUS 172
-#define TK_UPLUS 173
-#define TK_TRUTH 174
-#define TK_REGISTER 175
-#define TK_VECTOR 176
-#define TK_SELECT_COLUMN 177
-#define TK_IF_NULL_ROW 178
-#define TK_ASTERISK 179
-#define TK_SPAN 180
-#define TK_ERROR 181
-#define TK_SPACE 182
-#define TK_ILLEGAL 183
+#define TK_PTR 112
+#define TK_COLLATE 113
+#define TK_BITNOT 114
+#define TK_ON 115
+#define TK_INDEXED 116
+#define TK_STRING 117
+#define TK_JOIN_KW 118
+#define TK_CONSTRAINT 119
+#define TK_DEFAULT 120
+#define TK_NULL 121
+#define TK_PRIMARY 122
+#define TK_UNIQUE 123
+#define TK_CHECK 124
+#define TK_REFERENCES 125
+#define TK_AUTOINCR 126
+#define TK_INSERT 127
+#define TK_DELETE 128
+#define TK_UPDATE 129
+#define TK_SET 130
+#define TK_DEFERRABLE 131
+#define TK_FOREIGN 132
+#define TK_DROP 133
+#define TK_UNION 134
+#define TK_ALL 135
+#define TK_EXCEPT 136
+#define TK_INTERSECT 137
+#define TK_SELECT 138
+#define TK_VALUES 139
+#define TK_DISTINCT 140
+#define TK_DOT 141
+#define TK_FROM 142
+#define TK_JOIN 143
+#define TK_USING 144
+#define TK_ORDER 145
+#define TK_GROUP 146
+#define TK_HAVING 147
+#define TK_LIMIT 148
+#define TK_WHERE 149
+#define TK_RETURNING 150
+#define TK_INTO 151
+#define TK_NOTHING 152
+#define TK_FLOAT 153
+#define TK_BLOB 154
+#define TK_INTEGER 155
+#define TK_VARIABLE 156
+#define TK_CASE 157
+#define TK_WHEN 158
+#define TK_THEN 159
+#define TK_ELSE 160
+#define TK_INDEX 161
+#define TK_ALTER 162
+#define TK_ADD 163
+#define TK_WINDOW 164
+#define TK_OVER 165
+#define TK_FILTER 166
+#define TK_COLUMN 167
+#define TK_AGG_FUNCTION 168
+#define TK_AGG_COLUMN 169
+#define TK_TRUEFALSE 170
+#define TK_ISNOT 171
+#define TK_FUNCTION 172
+#define TK_UMINUS 173
+#define TK_UPLUS 174
+#define TK_TRUTH 175
+#define TK_REGISTER 176
+#define TK_VECTOR 177
+#define TK_SELECT_COLUMN 178
+#define TK_IF_NULL_ROW 179
+#define TK_ASTERISK 180
+#define TK_SPAN 181
+#define TK_ERROR 182
+#define TK_SPACE 183
+#define TK_ILLEGAL 184
#endif
/**************** End token definitions ***************************************/
@@ -158468,29 +168188,31 @@ static void updateDeleteLimitError(
#endif
/************* Begin control #defines *****************************************/
#define YYCODETYPE unsigned short int
-#define YYNOCODE 317
+#define YYNOCODE 319
#define YYACTIONTYPE unsigned short int
#define YYWILDCARD 101
#define sqlite3ParserTOKENTYPE Token
typedef union {
int yyinit;
sqlite3ParserTOKENTYPE yy0;
- Window* yy49;
- ExprList* yy70;
- Select* yy81;
- With* yy103;
- struct FrameBound yy117;
- struct {int value; int mask;} yy139;
- SrcList* yy153;
- TriggerStep* yy157;
- Upsert* yy190;
- struct TrigEvent yy262;
- Cte* yy329;
- int yy376;
- Expr* yy404;
- IdList* yy436;
- const char* yy504;
- u8 yy552;
+ TriggerStep* yy33;
+ Window* yy41;
+ Select* yy47;
+ SrcList* yy131;
+ struct TrigEvent yy180;
+ struct {int value; int mask;} yy231;
+ IdList* yy254;
+ u32 yy285;
+ ExprList* yy322;
+ Cte* yy385;
+ int yy394;
+ Upsert* yy444;
+ u8 yy516;
+ With* yy521;
+ const char* yy522;
+ Expr* yy528;
+ OnOrUsing yy561;
+ struct FrameBound yy595;
} YYMINORTYPE;
#ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100
@@ -158506,18 +168228,18 @@ typedef union {
#define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse;
#define sqlite3ParserCTX_STORE yypParser->pParse=pParse;
#define YYFALLBACK 1
-#define YYNSTATE 570
-#define YYNRULE 398
-#define YYNRULE_WITH_ACTION 337
-#define YYNTOKEN 184
-#define YY_MAX_SHIFT 569
-#define YY_MIN_SHIFTREDUCE 825
-#define YY_MAX_SHIFTREDUCE 1222
-#define YY_ERROR_ACTION 1223
-#define YY_ACCEPT_ACTION 1224
-#define YY_NO_ACTION 1225
-#define YY_MIN_REDUCE 1226
-#define YY_MAX_REDUCE 1623
+#define YYNSTATE 575
+#define YYNRULE 403
+#define YYNRULE_WITH_ACTION 340
+#define YYNTOKEN 185
+#define YY_MAX_SHIFT 574
+#define YY_MIN_SHIFTREDUCE 833
+#define YY_MAX_SHIFTREDUCE 1235
+#define YY_ERROR_ACTION 1236
+#define YY_ACCEPT_ACTION 1237
+#define YY_NO_ACTION 1238
+#define YY_MIN_REDUCE 1239
+#define YY_MAX_REDUCE 1641
/************* End control #defines *******************************************/
#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
@@ -158584,601 +168306,618 @@ typedef union {
** yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (2023)
+#define YY_ACTTAB_COUNT (2096)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 563, 1295, 563, 1274, 168, 1257, 115, 112, 218, 373,
- /* 10 */ 563, 1295, 374, 563, 488, 563, 115, 112, 218, 406,
- /* 20 */ 1300, 1300, 41, 41, 41, 41, 514, 1504, 520, 1298,
- /* 30 */ 1298, 959, 41, 41, 1260, 71, 71, 51, 51, 960,
- /* 40 */ 557, 557, 557, 122, 123, 113, 1200, 1200, 1035, 1038,
- /* 50 */ 1028, 1028, 120, 120, 121, 121, 121, 121, 414, 406,
- /* 60 */ 273, 273, 273, 273, 115, 112, 218, 115, 112, 218,
- /* 70 */ 197, 268, 545, 560, 515, 560, 211, 563, 385, 248,
- /* 80 */ 215, 521, 399, 122, 123, 113, 1200, 1200, 1035, 1038,
- /* 90 */ 1028, 1028, 120, 120, 121, 121, 121, 121, 540, 13,
- /* 100 */ 13, 1259, 119, 119, 119, 119, 118, 118, 117, 117,
- /* 110 */ 117, 116, 441, 1176, 419, 197, 446, 320, 512, 1539,
- /* 120 */ 1545, 372, 1547, 6, 371, 1176, 1148, 394, 1148, 406,
- /* 130 */ 1545, 534, 115, 112, 218, 1415, 99, 30, 121, 121,
- /* 140 */ 121, 121, 119, 119, 119, 119, 118, 118, 117, 117,
- /* 150 */ 117, 116, 441, 122, 123, 113, 1200, 1200, 1035, 1038,
- /* 160 */ 1028, 1028, 120, 120, 121, 121, 121, 121, 31, 1176,
- /* 170 */ 1177, 1178, 241, 357, 1558, 501, 498, 497, 317, 124,
- /* 180 */ 319, 1176, 1177, 1178, 1176, 496, 119, 119, 119, 119,
- /* 190 */ 118, 118, 117, 117, 117, 116, 441, 139, 96, 406,
- /* 200 */ 121, 121, 121, 121, 114, 117, 117, 117, 116, 441,
- /* 210 */ 541, 1532, 119, 119, 119, 119, 118, 118, 117, 117,
- /* 220 */ 117, 116, 441, 122, 123, 113, 1200, 1200, 1035, 1038,
- /* 230 */ 1028, 1028, 120, 120, 121, 121, 121, 121, 406, 441,
- /* 240 */ 1176, 1177, 1178, 81, 439, 439, 439, 80, 119, 119,
- /* 250 */ 119, 119, 118, 118, 117, 117, 117, 116, 441, 488,
- /* 260 */ 1176, 318, 122, 123, 113, 1200, 1200, 1035, 1038, 1028,
- /* 270 */ 1028, 120, 120, 121, 121, 121, 121, 493, 1025, 1025,
- /* 280 */ 1036, 1039, 119, 119, 119, 119, 118, 118, 117, 117,
- /* 290 */ 117, 116, 441, 1584, 995, 1224, 1, 1, 569, 2,
- /* 300 */ 1228, 1267, 137, 1503, 245, 305, 473, 140, 406, 860,
- /* 310 */ 561, 1176, 914, 914, 1308, 359, 1176, 1177, 1178, 462,
- /* 320 */ 330, 119, 119, 119, 119, 118, 118, 117, 117, 117,
- /* 330 */ 116, 441, 122, 123, 113, 1200, 1200, 1035, 1038, 1028,
- /* 340 */ 1028, 120, 120, 121, 121, 121, 121, 328, 273, 273,
- /* 350 */ 1015, 83, 1029, 425, 1564, 569, 2, 1228, 304, 554,
- /* 360 */ 925, 560, 305, 944, 140, 860, 1006, 1176, 1177, 1178,
- /* 370 */ 1005, 1308, 411, 213, 511, 229, 119, 119, 119, 119,
- /* 380 */ 118, 118, 117, 117, 117, 116, 441, 519, 347, 116,
- /* 390 */ 441, 119, 119, 119, 119, 118, 118, 117, 117, 117,
- /* 400 */ 116, 441, 1005, 1005, 1007, 273, 273, 445, 563, 16,
- /* 410 */ 16, 1590, 563, 1540, 563, 406, 1176, 6, 560, 344,
- /* 420 */ 182, 118, 118, 117, 117, 117, 116, 441, 416, 142,
- /* 430 */ 71, 71, 229, 563, 71, 71, 55, 55, 203, 122,
- /* 440 */ 123, 113, 1200, 1200, 1035, 1038, 1028, 1028, 120, 120,
- /* 450 */ 121, 121, 121, 121, 217, 13, 13, 1176, 406, 568,
- /* 460 */ 1400, 1228, 502, 137, 445, 168, 305, 545, 140, 1180,
- /* 470 */ 424, 545, 1176, 1177, 1178, 1308, 544, 438, 437, 944,
- /* 480 */ 513, 452, 122, 123, 113, 1200, 1200, 1035, 1038, 1028,
- /* 490 */ 1028, 120, 120, 121, 121, 121, 121, 315, 119, 119,
- /* 500 */ 119, 119, 118, 118, 117, 117, 117, 116, 441, 273,
- /* 510 */ 273, 1143, 416, 1176, 1177, 1178, 543, 563, 1143, 304,
- /* 520 */ 554, 1561, 560, 1207, 1143, 1207, 1180, 1143, 406, 530,
- /* 530 */ 421, 1143, 864, 183, 1143, 143, 229, 562, 32, 71,
- /* 540 */ 71, 119, 119, 119, 119, 118, 118, 117, 117, 117,
- /* 550 */ 116, 441, 122, 123, 113, 1200, 1200, 1035, 1038, 1028,
- /* 560 */ 1028, 120, 120, 121, 121, 121, 121, 406, 445, 241,
- /* 570 */ 1176, 857, 501, 498, 497, 1176, 526, 189, 245, 538,
- /* 580 */ 1539, 282, 496, 370, 6, 563, 529, 477, 5, 279,
- /* 590 */ 1015, 122, 123, 113, 1200, 1200, 1035, 1038, 1028, 1028,
- /* 600 */ 120, 120, 121, 121, 121, 121, 1006, 13, 13, 1414,
- /* 610 */ 1005, 119, 119, 119, 119, 118, 118, 117, 117, 117,
- /* 620 */ 116, 441, 426, 273, 273, 1176, 1176, 1177, 1178, 1619,
- /* 630 */ 392, 1176, 1177, 1178, 1176, 342, 560, 406, 525, 361,
- /* 640 */ 430, 1161, 1005, 1005, 1007, 348, 411, 357, 1558, 488,
- /* 650 */ 119, 119, 119, 119, 118, 118, 117, 117, 117, 116,
- /* 660 */ 441, 122, 123, 113, 1200, 1200, 1035, 1038, 1028, 1028,
- /* 670 */ 120, 120, 121, 121, 121, 121, 406, 830, 831, 832,
- /* 680 */ 1016, 1176, 1177, 1178, 396, 285, 148, 1312, 304, 554,
- /* 690 */ 1176, 1177, 1178, 1467, 216, 3, 337, 137, 340, 560,
- /* 700 */ 122, 123, 113, 1200, 1200, 1035, 1038, 1028, 1028, 120,
- /* 710 */ 120, 121, 121, 121, 121, 563, 504, 946, 273, 273,
- /* 720 */ 119, 119, 119, 119, 118, 118, 117, 117, 117, 116,
- /* 730 */ 441, 560, 1176, 427, 563, 451, 98, 13, 13, 259,
- /* 740 */ 276, 356, 507, 351, 506, 246, 406, 361, 469, 1530,
- /* 750 */ 1000, 347, 293, 304, 554, 1589, 71, 71, 889, 119,
- /* 760 */ 119, 119, 119, 118, 118, 117, 117, 117, 116, 441,
- /* 770 */ 122, 123, 113, 1200, 1200, 1035, 1038, 1028, 1028, 120,
- /* 780 */ 120, 121, 121, 121, 121, 406, 1143, 1078, 1176, 1177,
- /* 790 */ 1178, 416, 1080, 300, 150, 995, 1080, 361, 361, 1143,
- /* 800 */ 361, 378, 1143, 477, 563, 244, 243, 242, 1278, 122,
- /* 810 */ 123, 113, 1200, 1200, 1035, 1038, 1028, 1028, 120, 120,
- /* 820 */ 121, 121, 121, 121, 563, 880, 13, 13, 483, 119,
- /* 830 */ 119, 119, 119, 118, 118, 117, 117, 117, 116, 441,
- /* 840 */ 1176, 191, 540, 563, 147, 149, 13, 13, 328, 457,
- /* 850 */ 316, 1083, 1083, 485, 1537, 406, 505, 1530, 6, 1514,
- /* 860 */ 284, 192, 1277, 145, 881, 71, 71, 488, 119, 119,
- /* 870 */ 119, 119, 118, 118, 117, 117, 117, 116, 441, 122,
- /* 880 */ 123, 113, 1200, 1200, 1035, 1038, 1028, 1028, 120, 120,
- /* 890 */ 121, 121, 121, 121, 563, 471, 1176, 1177, 1178, 406,
- /* 900 */ 852, 327, 301, 462, 330, 1516, 270, 1530, 1530, 944,
- /* 910 */ 1531, 1307, 313, 9, 842, 251, 71, 71, 477, 428,
- /* 920 */ 146, 488, 38, 945, 101, 113, 1200, 1200, 1035, 1038,
- /* 930 */ 1028, 1028, 120, 120, 121, 121, 121, 121, 119, 119,
- /* 940 */ 119, 119, 118, 118, 117, 117, 117, 116, 441, 563,
- /* 950 */ 1197, 1099, 563, 436, 563, 1533, 563, 852, 1122, 1617,
- /* 960 */ 454, 290, 1617, 546, 251, 1303, 1100, 267, 267, 281,
- /* 970 */ 404, 70, 70, 460, 71, 71, 71, 71, 13, 13,
- /* 980 */ 560, 1101, 119, 119, 119, 119, 118, 118, 117, 117,
- /* 990 */ 117, 116, 441, 542, 104, 273, 273, 273, 273, 1197,
- /* 1000 */ 217, 1468, 900, 471, 450, 563, 1473, 1197, 560, 447,
- /* 1010 */ 560, 545, 901, 440, 406, 1058, 292, 274, 274, 198,
- /* 1020 */ 547, 450, 449, 1473, 1475, 944, 455, 56, 56, 410,
- /* 1030 */ 560, 1122, 1618, 379, 406, 1618, 404, 1120, 122, 123,
- /* 1040 */ 113, 1200, 1200, 1035, 1038, 1028, 1028, 120, 120, 121,
- /* 1050 */ 121, 121, 121, 1460, 406, 12, 1197, 1512, 122, 123,
- /* 1060 */ 113, 1200, 1200, 1035, 1038, 1028, 1028, 120, 120, 121,
- /* 1070 */ 121, 121, 121, 308, 471, 126, 359, 286, 122, 111,
- /* 1080 */ 113, 1200, 1200, 1035, 1038, 1028, 1028, 120, 120, 121,
- /* 1090 */ 121, 121, 121, 309, 450, 471, 1473, 119, 119, 119,
- /* 1100 */ 119, 118, 118, 117, 117, 117, 116, 441, 1176, 563,
- /* 1110 */ 1120, 482, 563, 312, 433, 479, 197, 119, 119, 119,
- /* 1120 */ 119, 118, 118, 117, 117, 117, 116, 441, 405, 12,
- /* 1130 */ 536, 15, 15, 478, 43, 43, 509, 119, 119, 119,
- /* 1140 */ 119, 118, 118, 117, 117, 117, 116, 441, 289, 535,
- /* 1150 */ 294, 563, 294, 391, 1220, 438, 437, 406, 1154, 403,
- /* 1160 */ 402, 1400, 920, 1204, 1176, 1177, 1178, 919, 1206, 291,
- /* 1170 */ 1306, 1249, 412, 57, 57, 488, 1205, 563, 556, 412,
- /* 1180 */ 1176, 1344, 123, 113, 1200, 1200, 1035, 1038, 1028, 1028,
- /* 1190 */ 120, 120, 121, 121, 121, 121, 1400, 1143, 563, 44,
- /* 1200 */ 44, 1207, 194, 1207, 273, 273, 1400, 461, 537, 1154,
- /* 1210 */ 1143, 108, 555, 1143, 4, 391, 1121, 560, 1538, 335,
- /* 1220 */ 58, 58, 6, 1246, 1099, 380, 1400, 376, 558, 1536,
- /* 1230 */ 563, 422, 1221, 6, 304, 554, 1176, 1177, 1178, 1100,
- /* 1240 */ 119, 119, 119, 119, 118, 118, 117, 117, 117, 116,
- /* 1250 */ 441, 442, 59, 59, 1101, 516, 1535, 273, 273, 563,
- /* 1260 */ 6, 563, 110, 552, 563, 528, 423, 413, 169, 548,
- /* 1270 */ 560, 108, 555, 137, 4, 551, 484, 272, 215, 222,
- /* 1280 */ 211, 60, 60, 61, 61, 98, 62, 62, 558, 273,
- /* 1290 */ 273, 563, 1015, 467, 1221, 563, 434, 563, 106, 106,
- /* 1300 */ 8, 920, 560, 273, 273, 107, 919, 442, 565, 564,
- /* 1310 */ 563, 442, 1005, 45, 45, 464, 560, 46, 46, 47,
- /* 1320 */ 47, 84, 202, 552, 1215, 404, 468, 563, 205, 304,
- /* 1330 */ 554, 563, 49, 49, 563, 522, 404, 532, 563, 867,
- /* 1340 */ 563, 105, 531, 103, 1005, 1005, 1007, 1008, 27, 50,
- /* 1350 */ 50, 563, 1015, 63, 63, 475, 64, 64, 106, 106,
- /* 1360 */ 65, 65, 14, 14, 17, 107, 563, 442, 565, 564,
- /* 1370 */ 563, 303, 1005, 66, 66, 563, 226, 563, 959, 563,
- /* 1380 */ 543, 404, 1196, 1343, 871, 278, 960, 456, 128, 128,
- /* 1390 */ 563, 1065, 67, 67, 563, 206, 867, 52, 52, 68,
- /* 1400 */ 68, 69, 69, 417, 1005, 1005, 1007, 1008, 27, 1563,
- /* 1410 */ 1165, 444, 53, 53, 277, 1519, 156, 156, 307, 389,
- /* 1420 */ 389, 388, 262, 386, 1165, 444, 839, 321, 277, 108,
- /* 1430 */ 555, 523, 4, 389, 389, 388, 262, 386, 563, 223,
- /* 1440 */ 839, 311, 326, 1492, 1117, 98, 558, 393, 1065, 310,
- /* 1450 */ 563, 476, 563, 223, 563, 311, 879, 878, 1009, 277,
- /* 1460 */ 157, 157, 463, 310, 389, 389, 388, 262, 386, 442,
- /* 1470 */ 518, 839, 76, 76, 54, 54, 72, 72, 355, 225,
- /* 1480 */ 563, 552, 275, 563, 223, 325, 311, 161, 354, 465,
- /* 1490 */ 135, 563, 228, 225, 310, 532, 563, 206, 886, 887,
- /* 1500 */ 533, 161, 129, 129, 135, 73, 73, 224, 962, 963,
- /* 1510 */ 1015, 563, 287, 130, 130, 1009, 106, 106, 131, 131,
- /* 1520 */ 563, 224, 563, 107, 225, 442, 565, 564, 997, 1276,
- /* 1530 */ 1005, 250, 161, 127, 127, 135, 108, 555, 1077, 4,
- /* 1540 */ 1077, 407, 155, 155, 154, 154, 304, 554, 1126, 563,
- /* 1550 */ 1331, 563, 224, 558, 470, 407, 563, 250, 563, 1491,
- /* 1560 */ 304, 554, 1005, 1005, 1007, 1008, 27, 563, 480, 332,
- /* 1570 */ 448, 136, 136, 134, 134, 1340, 442, 336, 132, 132,
- /* 1580 */ 133, 133, 563, 1076, 448, 1076, 407, 563, 552, 75,
- /* 1590 */ 75, 304, 554, 339, 341, 343, 108, 555, 563, 4,
- /* 1600 */ 1577, 299, 532, 563, 77, 77, 1291, 531, 472, 74,
- /* 1610 */ 74, 250, 1275, 558, 350, 448, 331, 1015, 360, 98,
- /* 1620 */ 42, 42, 1352, 106, 106, 48, 48, 1399, 494, 1327,
- /* 1630 */ 107, 247, 442, 565, 564, 345, 442, 1005, 98, 1061,
- /* 1640 */ 953, 917, 247, 250, 110, 1552, 550, 850, 552, 918,
- /* 1650 */ 144, 1338, 110, 549, 1405, 1256, 1248, 1237, 1236, 1238,
- /* 1660 */ 1571, 1324, 208, 390, 489, 265, 363, 200, 365, 1005,
- /* 1670 */ 1005, 1007, 1008, 27, 11, 280, 221, 1015, 323, 474,
- /* 1680 */ 1274, 367, 212, 106, 106, 924, 1386, 324, 288, 1381,
- /* 1690 */ 107, 453, 442, 565, 564, 283, 329, 1005, 1391, 499,
- /* 1700 */ 353, 1374, 1464, 108, 555, 1463, 4, 1574, 1390, 397,
- /* 1710 */ 1215, 171, 254, 369, 383, 207, 195, 196, 1511, 553,
- /* 1720 */ 558, 1509, 415, 1212, 100, 555, 83, 4, 204, 1005,
- /* 1730 */ 1005, 1007, 1008, 27, 180, 166, 173, 219, 79, 82,
- /* 1740 */ 458, 558, 175, 442, 35, 1387, 176, 459, 177, 178,
- /* 1750 */ 492, 231, 96, 1469, 395, 552, 1393, 1392, 36, 466,
- /* 1760 */ 1395, 184, 398, 481, 442, 1458, 235, 89, 1480, 487,
- /* 1770 */ 266, 334, 237, 188, 490, 400, 552, 338, 238, 508,
- /* 1780 */ 1239, 239, 1294, 1293, 1015, 1292, 1285, 429, 91, 871,
- /* 1790 */ 106, 106, 1588, 213, 401, 1587, 431, 107, 1264, 442,
- /* 1800 */ 565, 564, 1263, 352, 1005, 1015, 1262, 1586, 1557, 517,
- /* 1810 */ 432, 106, 106, 1284, 297, 298, 358, 524, 107, 1335,
- /* 1820 */ 442, 565, 564, 95, 1336, 1005, 252, 253, 435, 125,
- /* 1830 */ 543, 1543, 10, 1444, 377, 1542, 1005, 1005, 1007, 1008,
- /* 1840 */ 27, 97, 527, 375, 362, 102, 260, 364, 381, 1317,
- /* 1850 */ 382, 1334, 366, 1245, 1333, 1316, 368, 1005, 1005, 1007,
- /* 1860 */ 1008, 27, 1359, 1358, 34, 199, 1171, 566, 261, 263,
- /* 1870 */ 264, 567, 1234, 158, 1229, 141, 295, 159, 1496, 302,
- /* 1880 */ 1497, 1495, 1494, 160, 826, 209, 443, 201, 306, 210,
- /* 1890 */ 78, 220, 1075, 138, 1073, 314, 162, 172, 1196, 227,
- /* 1900 */ 174, 903, 322, 230, 1089, 179, 163, 164, 418, 408,
- /* 1910 */ 409, 170, 181, 85, 86, 420, 87, 165, 1092, 88,
- /* 1920 */ 233, 232, 1088, 151, 18, 234, 1081, 250, 333, 1209,
- /* 1930 */ 185, 486, 236, 186, 37, 841, 491, 354, 240, 346,
- /* 1940 */ 495, 187, 90, 869, 19, 20, 500, 503, 349, 92,
- /* 1950 */ 167, 152, 296, 882, 93, 510, 94, 1159, 153, 1041,
- /* 1960 */ 1128, 39, 214, 269, 1127, 271, 249, 952, 190, 947,
- /* 1970 */ 110, 1149, 21, 7, 1153, 22, 1145, 23, 1147, 24,
- /* 1980 */ 1133, 25, 1152, 33, 539, 193, 26, 1056, 98, 1042,
- /* 1990 */ 1040, 1044, 1098, 1045, 1097, 256, 255, 28, 40, 257,
- /* 2000 */ 1010, 851, 109, 29, 913, 559, 384, 387, 258, 1167,
- /* 2010 */ 1166, 1225, 1225, 1225, 1579, 1225, 1225, 1225, 1225, 1225,
- /* 2020 */ 1225, 1225, 1578,
+ /* 0 */ 568, 208, 568, 118, 115, 229, 568, 118, 115, 229,
+ /* 10 */ 568, 1310, 377, 1289, 408, 562, 562, 562, 568, 409,
+ /* 20 */ 378, 1310, 1272, 41, 41, 41, 41, 208, 1520, 71,
+ /* 30 */ 71, 969, 419, 41, 41, 491, 303, 279, 303, 970,
+ /* 40 */ 397, 71, 71, 125, 126, 80, 1212, 1212, 1047, 1050,
+ /* 50 */ 1037, 1037, 123, 123, 124, 124, 124, 124, 476, 409,
+ /* 60 */ 1237, 1, 1, 574, 2, 1241, 550, 118, 115, 229,
+ /* 70 */ 317, 480, 146, 480, 524, 118, 115, 229, 529, 1323,
+ /* 80 */ 417, 523, 142, 125, 126, 80, 1212, 1212, 1047, 1050,
+ /* 90 */ 1037, 1037, 123, 123, 124, 124, 124, 124, 118, 115,
+ /* 100 */ 229, 327, 122, 122, 122, 122, 121, 121, 120, 120,
+ /* 110 */ 120, 119, 116, 444, 284, 284, 284, 284, 442, 442,
+ /* 120 */ 442, 1561, 376, 1563, 1188, 375, 1159, 565, 1159, 565,
+ /* 130 */ 409, 1561, 537, 259, 226, 444, 101, 145, 449, 316,
+ /* 140 */ 559, 240, 122, 122, 122, 122, 121, 121, 120, 120,
+ /* 150 */ 120, 119, 116, 444, 125, 126, 80, 1212, 1212, 1047,
+ /* 160 */ 1050, 1037, 1037, 123, 123, 124, 124, 124, 124, 142,
+ /* 170 */ 294, 1188, 339, 448, 120, 120, 120, 119, 116, 444,
+ /* 180 */ 127, 1188, 1189, 1188, 148, 441, 440, 568, 119, 116,
+ /* 190 */ 444, 124, 124, 124, 124, 117, 122, 122, 122, 122,
+ /* 200 */ 121, 121, 120, 120, 120, 119, 116, 444, 454, 113,
+ /* 210 */ 13, 13, 546, 122, 122, 122, 122, 121, 121, 120,
+ /* 220 */ 120, 120, 119, 116, 444, 422, 316, 559, 1188, 1189,
+ /* 230 */ 1188, 149, 1220, 409, 1220, 124, 124, 124, 124, 122,
+ /* 240 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116,
+ /* 250 */ 444, 465, 342, 1034, 1034, 1048, 1051, 125, 126, 80,
+ /* 260 */ 1212, 1212, 1047, 1050, 1037, 1037, 123, 123, 124, 124,
+ /* 270 */ 124, 124, 1275, 522, 222, 1188, 568, 409, 224, 514,
+ /* 280 */ 175, 82, 83, 122, 122, 122, 122, 121, 121, 120,
+ /* 290 */ 120, 120, 119, 116, 444, 1005, 16, 16, 1188, 133,
+ /* 300 */ 133, 125, 126, 80, 1212, 1212, 1047, 1050, 1037, 1037,
+ /* 310 */ 123, 123, 124, 124, 124, 124, 122, 122, 122, 122,
+ /* 320 */ 121, 121, 120, 120, 120, 119, 116, 444, 1038, 546,
+ /* 330 */ 1188, 373, 1188, 1189, 1188, 252, 1429, 399, 504, 501,
+ /* 340 */ 500, 111, 560, 566, 4, 924, 924, 433, 499, 340,
+ /* 350 */ 460, 328, 360, 394, 1233, 1188, 1189, 1188, 563, 568,
+ /* 360 */ 122, 122, 122, 122, 121, 121, 120, 120, 120, 119,
+ /* 370 */ 116, 444, 284, 284, 369, 1574, 1600, 441, 440, 154,
+ /* 380 */ 409, 445, 71, 71, 1282, 565, 1217, 1188, 1189, 1188,
+ /* 390 */ 85, 1219, 271, 557, 543, 515, 1555, 568, 98, 1218,
+ /* 400 */ 6, 1274, 472, 142, 125, 126, 80, 1212, 1212, 1047,
+ /* 410 */ 1050, 1037, 1037, 123, 123, 124, 124, 124, 124, 550,
+ /* 420 */ 13, 13, 1024, 507, 1220, 1188, 1220, 549, 109, 109,
+ /* 430 */ 222, 568, 1234, 175, 568, 427, 110, 197, 445, 569,
+ /* 440 */ 445, 430, 1546, 1014, 325, 551, 1188, 270, 287, 368,
+ /* 450 */ 510, 363, 509, 257, 71, 71, 543, 71, 71, 359,
+ /* 460 */ 316, 559, 1606, 122, 122, 122, 122, 121, 121, 120,
+ /* 470 */ 120, 120, 119, 116, 444, 1014, 1014, 1016, 1017, 27,
+ /* 480 */ 284, 284, 1188, 1189, 1188, 1154, 568, 1605, 409, 899,
+ /* 490 */ 190, 550, 356, 565, 550, 935, 533, 517, 1154, 516,
+ /* 500 */ 413, 1154, 552, 1188, 1189, 1188, 568, 544, 1548, 51,
+ /* 510 */ 51, 214, 125, 126, 80, 1212, 1212, 1047, 1050, 1037,
+ /* 520 */ 1037, 123, 123, 124, 124, 124, 124, 1188, 474, 135,
+ /* 530 */ 135, 409, 284, 284, 1484, 505, 121, 121, 120, 120,
+ /* 540 */ 120, 119, 116, 444, 1005, 565, 518, 217, 541, 1555,
+ /* 550 */ 316, 559, 142, 6, 532, 125, 126, 80, 1212, 1212,
+ /* 560 */ 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124, 124,
+ /* 570 */ 1549, 122, 122, 122, 122, 121, 121, 120, 120, 120,
+ /* 580 */ 119, 116, 444, 485, 1188, 1189, 1188, 482, 281, 1263,
+ /* 590 */ 955, 252, 1188, 373, 504, 501, 500, 1188, 340, 570,
+ /* 600 */ 1188, 570, 409, 292, 499, 955, 874, 191, 480, 316,
+ /* 610 */ 559, 384, 290, 380, 122, 122, 122, 122, 121, 121,
+ /* 620 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1212,
+ /* 630 */ 1212, 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124,
+ /* 640 */ 124, 409, 394, 1132, 1188, 867, 100, 284, 284, 1188,
+ /* 650 */ 1189, 1188, 373, 1089, 1188, 1189, 1188, 1188, 1189, 1188,
+ /* 660 */ 565, 455, 32, 373, 233, 125, 126, 80, 1212, 1212,
+ /* 670 */ 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124, 124,
+ /* 680 */ 1428, 957, 568, 228, 956, 122, 122, 122, 122, 121,
+ /* 690 */ 121, 120, 120, 120, 119, 116, 444, 1154, 228, 1188,
+ /* 700 */ 157, 1188, 1189, 1188, 1547, 13, 13, 301, 955, 1228,
+ /* 710 */ 1154, 153, 409, 1154, 373, 1577, 1172, 5, 369, 1574,
+ /* 720 */ 429, 1234, 3, 955, 122, 122, 122, 122, 121, 121,
+ /* 730 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1212,
+ /* 740 */ 1212, 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124,
+ /* 750 */ 124, 409, 208, 567, 1188, 1025, 1188, 1189, 1188, 1188,
+ /* 760 */ 388, 850, 155, 1546, 286, 402, 1094, 1094, 488, 568,
+ /* 770 */ 465, 342, 1315, 1315, 1546, 125, 126, 80, 1212, 1212,
+ /* 780 */ 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124, 124,
+ /* 790 */ 129, 568, 13, 13, 374, 122, 122, 122, 122, 121,
+ /* 800 */ 121, 120, 120, 120, 119, 116, 444, 302, 568, 453,
+ /* 810 */ 528, 1188, 1189, 1188, 13, 13, 1188, 1189, 1188, 1293,
+ /* 820 */ 463, 1263, 409, 1313, 1313, 1546, 1010, 453, 452, 200,
+ /* 830 */ 299, 71, 71, 1261, 122, 122, 122, 122, 121, 121,
+ /* 840 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1212,
+ /* 850 */ 1212, 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124,
+ /* 860 */ 124, 409, 227, 1069, 1154, 284, 284, 419, 312, 278,
+ /* 870 */ 278, 285, 285, 1415, 406, 405, 382, 1154, 565, 568,
+ /* 880 */ 1154, 1191, 565, 1594, 565, 125, 126, 80, 1212, 1212,
+ /* 890 */ 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124, 124,
+ /* 900 */ 453, 1476, 13, 13, 1530, 122, 122, 122, 122, 121,
+ /* 910 */ 121, 120, 120, 120, 119, 116, 444, 201, 568, 354,
+ /* 920 */ 1580, 574, 2, 1241, 838, 839, 840, 1556, 317, 1207,
+ /* 930 */ 146, 6, 409, 255, 254, 253, 206, 1323, 9, 1191,
+ /* 940 */ 262, 71, 71, 424, 122, 122, 122, 122, 121, 121,
+ /* 950 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1212,
+ /* 960 */ 1212, 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124,
+ /* 970 */ 124, 568, 284, 284, 568, 1208, 409, 573, 313, 1241,
+ /* 980 */ 349, 1292, 352, 419, 317, 565, 146, 491, 525, 1637,
+ /* 990 */ 395, 371, 491, 1323, 70, 70, 1291, 71, 71, 240,
+ /* 1000 */ 1321, 104, 80, 1212, 1212, 1047, 1050, 1037, 1037, 123,
+ /* 1010 */ 123, 124, 124, 124, 124, 122, 122, 122, 122, 121,
+ /* 1020 */ 121, 120, 120, 120, 119, 116, 444, 1110, 284, 284,
+ /* 1030 */ 428, 448, 1519, 1208, 439, 284, 284, 1483, 1348, 311,
+ /* 1040 */ 474, 565, 1111, 969, 491, 491, 217, 1259, 565, 1532,
+ /* 1050 */ 568, 970, 207, 568, 1024, 240, 383, 1112, 519, 122,
+ /* 1060 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116,
+ /* 1070 */ 444, 1015, 107, 71, 71, 1014, 13, 13, 910, 568,
+ /* 1080 */ 1489, 568, 284, 284, 97, 526, 491, 448, 911, 1322,
+ /* 1090 */ 1318, 545, 409, 284, 284, 565, 151, 209, 1489, 1491,
+ /* 1100 */ 262, 450, 55, 55, 56, 56, 565, 1014, 1014, 1016,
+ /* 1110 */ 443, 332, 409, 527, 12, 295, 125, 126, 80, 1212,
+ /* 1120 */ 1212, 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124,
+ /* 1130 */ 124, 347, 409, 862, 1528, 1208, 125, 126, 80, 1212,
+ /* 1140 */ 1212, 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124,
+ /* 1150 */ 124, 1133, 1635, 474, 1635, 371, 125, 114, 80, 1212,
+ /* 1160 */ 1212, 1047, 1050, 1037, 1037, 123, 123, 124, 124, 124,
+ /* 1170 */ 124, 1489, 329, 474, 331, 122, 122, 122, 122, 121,
+ /* 1180 */ 121, 120, 120, 120, 119, 116, 444, 203, 1415, 568,
+ /* 1190 */ 1290, 862, 464, 1208, 436, 122, 122, 122, 122, 121,
+ /* 1200 */ 121, 120, 120, 120, 119, 116, 444, 553, 1133, 1636,
+ /* 1210 */ 539, 1636, 15, 15, 890, 122, 122, 122, 122, 121,
+ /* 1220 */ 121, 120, 120, 120, 119, 116, 444, 568, 298, 538,
+ /* 1230 */ 1131, 1415, 1553, 1554, 1327, 409, 6, 6, 1165, 1264,
+ /* 1240 */ 415, 320, 284, 284, 1415, 508, 565, 525, 300, 457,
+ /* 1250 */ 43, 43, 568, 891, 12, 565, 330, 478, 425, 407,
+ /* 1260 */ 126, 80, 1212, 1212, 1047, 1050, 1037, 1037, 123, 123,
+ /* 1270 */ 124, 124, 124, 124, 568, 57, 57, 288, 1188, 1415,
+ /* 1280 */ 496, 458, 392, 392, 391, 273, 389, 1131, 1552, 847,
+ /* 1290 */ 1165, 407, 6, 568, 321, 1154, 470, 44, 44, 1551,
+ /* 1300 */ 1110, 426, 234, 6, 323, 256, 540, 256, 1154, 431,
+ /* 1310 */ 568, 1154, 322, 17, 487, 1111, 58, 58, 122, 122,
+ /* 1320 */ 122, 122, 121, 121, 120, 120, 120, 119, 116, 444,
+ /* 1330 */ 1112, 216, 481, 59, 59, 1188, 1189, 1188, 111, 560,
+ /* 1340 */ 324, 4, 236, 456, 526, 568, 237, 456, 568, 437,
+ /* 1350 */ 168, 556, 420, 141, 479, 563, 568, 293, 568, 1091,
+ /* 1360 */ 568, 293, 568, 1091, 531, 568, 870, 8, 60, 60,
+ /* 1370 */ 235, 61, 61, 568, 414, 568, 414, 568, 445, 62,
+ /* 1380 */ 62, 45, 45, 46, 46, 47, 47, 199, 49, 49,
+ /* 1390 */ 557, 568, 359, 568, 100, 486, 50, 50, 63, 63,
+ /* 1400 */ 64, 64, 561, 415, 535, 410, 568, 1024, 568, 534,
+ /* 1410 */ 316, 559, 316, 559, 65, 65, 14, 14, 568, 1024,
+ /* 1420 */ 568, 512, 930, 870, 1015, 109, 109, 929, 1014, 66,
+ /* 1430 */ 66, 131, 131, 110, 451, 445, 569, 445, 416, 177,
+ /* 1440 */ 1014, 132, 132, 67, 67, 568, 467, 568, 930, 471,
+ /* 1450 */ 1360, 283, 226, 929, 315, 1359, 407, 568, 459, 407,
+ /* 1460 */ 1014, 1014, 1016, 239, 407, 86, 213, 1346, 52, 52,
+ /* 1470 */ 68, 68, 1014, 1014, 1016, 1017, 27, 1579, 1176, 447,
+ /* 1480 */ 69, 69, 288, 97, 108, 1535, 106, 392, 392, 391,
+ /* 1490 */ 273, 389, 568, 877, 847, 881, 568, 111, 560, 466,
+ /* 1500 */ 4, 568, 152, 30, 38, 568, 1128, 234, 396, 323,
+ /* 1510 */ 111, 560, 527, 4, 563, 53, 53, 322, 568, 163,
+ /* 1520 */ 163, 568, 337, 468, 164, 164, 333, 563, 76, 76,
+ /* 1530 */ 568, 289, 1508, 568, 31, 1507, 568, 445, 338, 483,
+ /* 1540 */ 100, 54, 54, 344, 72, 72, 296, 236, 1076, 557,
+ /* 1550 */ 445, 877, 1356, 134, 134, 168, 73, 73, 141, 161,
+ /* 1560 */ 161, 1568, 557, 535, 568, 319, 568, 348, 536, 1007,
+ /* 1570 */ 473, 261, 261, 889, 888, 235, 535, 568, 1024, 568,
+ /* 1580 */ 475, 534, 261, 367, 109, 109, 521, 136, 136, 130,
+ /* 1590 */ 130, 1024, 110, 366, 445, 569, 445, 109, 109, 1014,
+ /* 1600 */ 162, 162, 156, 156, 568, 110, 1076, 445, 569, 445,
+ /* 1610 */ 410, 351, 1014, 568, 353, 316, 559, 568, 343, 568,
+ /* 1620 */ 100, 497, 357, 258, 100, 896, 897, 140, 140, 355,
+ /* 1630 */ 1306, 1014, 1014, 1016, 1017, 27, 139, 139, 362, 451,
+ /* 1640 */ 137, 137, 138, 138, 1014, 1014, 1016, 1017, 27, 1176,
+ /* 1650 */ 447, 568, 372, 288, 111, 560, 1018, 4, 392, 392,
+ /* 1660 */ 391, 273, 389, 568, 1137, 847, 568, 1072, 568, 258,
+ /* 1670 */ 492, 563, 568, 211, 75, 75, 555, 960, 234, 261,
+ /* 1680 */ 323, 111, 560, 927, 4, 113, 77, 77, 322, 74,
+ /* 1690 */ 74, 42, 42, 1369, 445, 48, 48, 1414, 563, 972,
+ /* 1700 */ 973, 1088, 1087, 1088, 1087, 860, 557, 150, 928, 1342,
+ /* 1710 */ 113, 1354, 554, 1419, 1018, 1271, 1262, 1250, 236, 1249,
+ /* 1720 */ 1251, 445, 1587, 1339, 308, 276, 168, 309, 11, 141,
+ /* 1730 */ 393, 310, 232, 557, 1401, 1024, 335, 291, 1396, 219,
+ /* 1740 */ 336, 109, 109, 934, 297, 1406, 235, 341, 477, 110,
+ /* 1750 */ 502, 445, 569, 445, 1389, 1405, 1014, 400, 1289, 365,
+ /* 1760 */ 223, 1480, 1024, 1479, 1351, 1352, 1350, 1349, 109, 109,
+ /* 1770 */ 204, 1590, 1228, 558, 265, 218, 110, 205, 445, 569,
+ /* 1780 */ 445, 410, 387, 1014, 1527, 179, 316, 559, 1014, 1014,
+ /* 1790 */ 1016, 1017, 27, 230, 1525, 1225, 79, 560, 85, 4,
+ /* 1800 */ 418, 215, 548, 81, 84, 188, 1402, 173, 181, 461,
+ /* 1810 */ 451, 35, 462, 563, 183, 1014, 1014, 1016, 1017, 27,
+ /* 1820 */ 184, 1485, 185, 186, 495, 242, 98, 398, 1408, 36,
+ /* 1830 */ 1407, 484, 91, 469, 401, 1410, 445, 192, 1474, 246,
+ /* 1840 */ 1496, 490, 346, 277, 248, 196, 493, 511, 557, 350,
+ /* 1850 */ 1252, 249, 250, 403, 1309, 1308, 111, 560, 432, 4,
+ /* 1860 */ 1307, 1300, 93, 1604, 881, 1603, 224, 404, 434, 520,
+ /* 1870 */ 263, 435, 1573, 563, 1279, 1278, 364, 1024, 306, 1277,
+ /* 1880 */ 264, 1602, 1559, 109, 109, 370, 1299, 307, 1558, 438,
+ /* 1890 */ 128, 110, 1374, 445, 569, 445, 445, 546, 1014, 10,
+ /* 1900 */ 1461, 105, 381, 1373, 34, 571, 99, 1332, 557, 314,
+ /* 1910 */ 1182, 530, 272, 274, 379, 210, 1331, 547, 385, 386,
+ /* 1920 */ 275, 572, 1247, 1242, 411, 412, 1512, 165, 178, 1513,
+ /* 1930 */ 1014, 1014, 1016, 1017, 27, 1511, 1510, 1024, 78, 147,
+ /* 1940 */ 166, 220, 221, 109, 109, 834, 304, 167, 446, 212,
+ /* 1950 */ 318, 110, 231, 445, 569, 445, 144, 1086, 1014, 1084,
+ /* 1960 */ 326, 180, 169, 1207, 182, 334, 238, 913, 241, 1100,
+ /* 1970 */ 187, 170, 171, 421, 87, 88, 423, 189, 89, 90,
+ /* 1980 */ 172, 1103, 243, 1099, 244, 158, 18, 245, 345, 247,
+ /* 1990 */ 1014, 1014, 1016, 1017, 27, 261, 1092, 193, 1222, 489,
+ /* 2000 */ 194, 37, 366, 849, 494, 251, 195, 506, 92, 19,
+ /* 2010 */ 498, 358, 20, 503, 879, 361, 94, 892, 305, 159,
+ /* 2020 */ 513, 39, 95, 1170, 160, 1053, 964, 1139, 96, 174,
+ /* 2030 */ 1138, 225, 280, 282, 198, 958, 113, 1160, 1156, 260,
+ /* 2040 */ 21, 22, 23, 1158, 1164, 1163, 1144, 24, 33, 25,
+ /* 2050 */ 202, 542, 26, 100, 1067, 102, 1054, 103, 7, 1052,
+ /* 2060 */ 1056, 1109, 1057, 1108, 266, 267, 28, 40, 390, 1019,
+ /* 2070 */ 861, 112, 29, 564, 1178, 1177, 268, 176, 143, 923,
+ /* 2080 */ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ /* 2090 */ 1238, 1238, 1238, 1238, 269, 1595,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 192, 221, 192, 223, 192, 214, 272, 273, 274, 217,
- /* 10 */ 192, 231, 217, 192, 192, 192, 272, 273, 274, 19,
- /* 20 */ 233, 234, 214, 215, 214, 215, 203, 293, 203, 233,
- /* 30 */ 234, 31, 214, 215, 214, 214, 215, 214, 215, 39,
- /* 40 */ 208, 209, 210, 43, 44, 45, 46, 47, 48, 49,
- /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 236, 19,
- /* 60 */ 237, 238, 237, 238, 272, 273, 274, 272, 273, 274,
- /* 70 */ 192, 211, 251, 250, 251, 250, 26, 192, 200, 254,
- /* 80 */ 255, 260, 204, 43, 44, 45, 46, 47, 48, 49,
- /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 192, 214,
- /* 100 */ 215, 214, 102, 103, 104, 105, 106, 107, 108, 109,
- /* 110 */ 110, 111, 112, 59, 229, 192, 294, 16, 306, 307,
- /* 120 */ 312, 313, 312, 311, 314, 59, 86, 204, 88, 19,
- /* 130 */ 312, 313, 272, 273, 274, 271, 26, 22, 54, 55,
- /* 140 */ 56, 57, 102, 103, 104, 105, 106, 107, 108, 109,
- /* 150 */ 110, 111, 112, 43, 44, 45, 46, 47, 48, 49,
- /* 160 */ 50, 51, 52, 53, 54, 55, 56, 57, 53, 115,
- /* 170 */ 116, 117, 118, 309, 310, 121, 122, 123, 77, 69,
- /* 180 */ 79, 115, 116, 117, 59, 131, 102, 103, 104, 105,
- /* 190 */ 106, 107, 108, 109, 110, 111, 112, 72, 148, 19,
- /* 200 */ 54, 55, 56, 57, 58, 108, 109, 110, 111, 112,
- /* 210 */ 304, 305, 102, 103, 104, 105, 106, 107, 108, 109,
- /* 220 */ 110, 111, 112, 43, 44, 45, 46, 47, 48, 49,
- /* 230 */ 50, 51, 52, 53, 54, 55, 56, 57, 19, 112,
- /* 240 */ 115, 116, 117, 24, 208, 209, 210, 67, 102, 103,
- /* 250 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 192,
- /* 260 */ 59, 160, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 270 */ 51, 52, 53, 54, 55, 56, 57, 19, 46, 47,
- /* 280 */ 48, 49, 102, 103, 104, 105, 106, 107, 108, 109,
- /* 290 */ 110, 111, 112, 213, 73, 184, 185, 186, 187, 188,
- /* 300 */ 189, 221, 81, 236, 46, 194, 192, 196, 19, 59,
- /* 310 */ 133, 59, 135, 136, 203, 192, 115, 116, 117, 127,
- /* 320 */ 128, 102, 103, 104, 105, 106, 107, 108, 109, 110,
- /* 330 */ 111, 112, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 340 */ 51, 52, 53, 54, 55, 56, 57, 126, 237, 238,
- /* 350 */ 100, 150, 120, 230, 186, 187, 188, 189, 137, 138,
- /* 360 */ 108, 250, 194, 26, 196, 115, 116, 115, 116, 117,
- /* 370 */ 120, 203, 114, 164, 165, 264, 102, 103, 104, 105,
- /* 380 */ 106, 107, 108, 109, 110, 111, 112, 192, 130, 111,
- /* 390 */ 112, 102, 103, 104, 105, 106, 107, 108, 109, 110,
- /* 400 */ 111, 112, 152, 153, 154, 237, 238, 296, 192, 214,
- /* 410 */ 215, 228, 192, 307, 192, 19, 59, 311, 250, 23,
- /* 420 */ 22, 106, 107, 108, 109, 110, 111, 112, 192, 72,
- /* 430 */ 214, 215, 264, 192, 214, 215, 214, 215, 149, 43,
- /* 440 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 450 */ 54, 55, 56, 57, 117, 214, 215, 59, 19, 187,
- /* 460 */ 192, 189, 23, 81, 296, 192, 194, 251, 196, 59,
- /* 470 */ 229, 251, 115, 116, 117, 203, 260, 106, 107, 142,
- /* 480 */ 260, 267, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 490 */ 51, 52, 53, 54, 55, 56, 57, 261, 102, 103,
- /* 500 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 237,
- /* 510 */ 238, 76, 192, 115, 116, 117, 144, 192, 76, 137,
- /* 520 */ 138, 192, 250, 152, 89, 154, 116, 92, 19, 87,
- /* 530 */ 262, 89, 23, 22, 92, 163, 264, 192, 22, 214,
- /* 540 */ 215, 102, 103, 104, 105, 106, 107, 108, 109, 110,
- /* 550 */ 111, 112, 43, 44, 45, 46, 47, 48, 49, 50,
- /* 560 */ 51, 52, 53, 54, 55, 56, 57, 19, 296, 118,
- /* 570 */ 59, 23, 121, 122, 123, 59, 251, 26, 46, 306,
- /* 580 */ 307, 261, 131, 192, 311, 192, 144, 192, 22, 203,
- /* 590 */ 100, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 600 */ 52, 53, 54, 55, 56, 57, 116, 214, 215, 271,
- /* 610 */ 120, 102, 103, 104, 105, 106, 107, 108, 109, 110,
- /* 620 */ 111, 112, 229, 237, 238, 59, 115, 116, 117, 299,
- /* 630 */ 300, 115, 116, 117, 59, 16, 250, 19, 192, 192,
- /* 640 */ 19, 23, 152, 153, 154, 24, 114, 309, 310, 192,
- /* 650 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
- /* 660 */ 112, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 670 */ 52, 53, 54, 55, 56, 57, 19, 7, 8, 9,
- /* 680 */ 23, 115, 116, 117, 203, 290, 239, 238, 137, 138,
- /* 690 */ 115, 116, 117, 236, 192, 22, 77, 81, 79, 250,
- /* 700 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- /* 710 */ 53, 54, 55, 56, 57, 192, 95, 142, 237, 238,
- /* 720 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
- /* 730 */ 112, 250, 59, 112, 192, 119, 26, 214, 215, 118,
- /* 740 */ 119, 120, 121, 122, 123, 124, 19, 192, 267, 302,
- /* 750 */ 23, 130, 229, 137, 138, 23, 214, 215, 26, 102,
- /* 760 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
- /* 770 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- /* 780 */ 53, 54, 55, 56, 57, 19, 76, 11, 115, 116,
- /* 790 */ 117, 192, 29, 251, 239, 73, 33, 192, 192, 89,
- /* 800 */ 192, 192, 92, 192, 192, 126, 127, 128, 224, 43,
- /* 810 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 820 */ 54, 55, 56, 57, 192, 35, 214, 215, 65, 102,
- /* 830 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
- /* 840 */ 59, 229, 192, 192, 239, 239, 214, 215, 126, 127,
- /* 850 */ 128, 126, 127, 128, 307, 19, 66, 302, 311, 192,
- /* 860 */ 261, 229, 224, 22, 74, 214, 215, 192, 102, 103,
- /* 870 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 43,
- /* 880 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- /* 890 */ 54, 55, 56, 57, 192, 192, 115, 116, 117, 19,
- /* 900 */ 59, 290, 251, 127, 128, 192, 23, 302, 302, 26,
- /* 910 */ 302, 236, 192, 22, 21, 24, 214, 215, 192, 129,
- /* 920 */ 22, 192, 24, 142, 158, 45, 46, 47, 48, 49,
- /* 930 */ 50, 51, 52, 53, 54, 55, 56, 57, 102, 103,
- /* 940 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 192,
- /* 950 */ 59, 12, 192, 251, 192, 305, 192, 116, 22, 23,
- /* 960 */ 242, 203, 26, 203, 24, 236, 27, 237, 238, 266,
- /* 970 */ 252, 214, 215, 80, 214, 215, 214, 215, 214, 215,
- /* 980 */ 250, 42, 102, 103, 104, 105, 106, 107, 108, 109,
- /* 990 */ 110, 111, 112, 229, 158, 237, 238, 237, 238, 59,
- /* 1000 */ 117, 281, 63, 192, 192, 192, 192, 116, 250, 192,
- /* 1010 */ 250, 251, 73, 251, 19, 122, 290, 237, 238, 24,
- /* 1020 */ 260, 209, 210, 209, 210, 142, 242, 214, 215, 197,
- /* 1030 */ 250, 22, 23, 276, 19, 26, 252, 101, 43, 44,
- /* 1040 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- /* 1050 */ 55, 56, 57, 160, 19, 211, 116, 192, 43, 44,
- /* 1060 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- /* 1070 */ 55, 56, 57, 192, 192, 22, 192, 266, 43, 44,
- /* 1080 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- /* 1090 */ 55, 56, 57, 192, 282, 192, 282, 102, 103, 104,
- /* 1100 */ 105, 106, 107, 108, 109, 110, 111, 112, 59, 192,
- /* 1110 */ 101, 279, 192, 192, 230, 283, 192, 102, 103, 104,
- /* 1120 */ 105, 106, 107, 108, 109, 110, 111, 112, 204, 211,
- /* 1130 */ 66, 214, 215, 289, 214, 215, 108, 102, 103, 104,
- /* 1140 */ 105, 106, 107, 108, 109, 110, 111, 112, 266, 85,
- /* 1150 */ 226, 192, 228, 22, 23, 106, 107, 19, 94, 106,
- /* 1160 */ 107, 192, 134, 114, 115, 116, 117, 139, 119, 266,
- /* 1170 */ 203, 206, 207, 214, 215, 192, 127, 192, 206, 207,
- /* 1180 */ 59, 192, 44, 45, 46, 47, 48, 49, 50, 51,
- /* 1190 */ 52, 53, 54, 55, 56, 57, 192, 76, 192, 214,
- /* 1200 */ 215, 152, 284, 154, 237, 238, 192, 289, 87, 145,
- /* 1210 */ 89, 19, 20, 92, 22, 22, 23, 250, 307, 236,
- /* 1220 */ 214, 215, 311, 203, 12, 247, 192, 249, 36, 307,
- /* 1230 */ 192, 262, 101, 311, 137, 138, 115, 116, 117, 27,
- /* 1240 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
- /* 1250 */ 112, 59, 214, 215, 42, 203, 307, 237, 238, 192,
- /* 1260 */ 311, 192, 26, 71, 192, 144, 262, 297, 298, 203,
- /* 1270 */ 250, 19, 20, 81, 22, 63, 262, 254, 255, 15,
- /* 1280 */ 26, 214, 215, 214, 215, 26, 214, 215, 36, 237,
- /* 1290 */ 238, 192, 100, 114, 101, 192, 262, 192, 106, 107,
- /* 1300 */ 48, 134, 250, 237, 238, 113, 139, 115, 116, 117,
- /* 1310 */ 192, 59, 120, 214, 215, 242, 250, 214, 215, 214,
- /* 1320 */ 215, 148, 149, 71, 60, 252, 242, 192, 149, 137,
- /* 1330 */ 138, 192, 214, 215, 192, 19, 252, 85, 192, 59,
- /* 1340 */ 192, 157, 90, 159, 152, 153, 154, 155, 156, 214,
- /* 1350 */ 215, 192, 100, 214, 215, 19, 214, 215, 106, 107,
- /* 1360 */ 214, 215, 214, 215, 22, 113, 192, 115, 116, 117,
- /* 1370 */ 192, 242, 120, 214, 215, 192, 24, 192, 31, 192,
- /* 1380 */ 144, 252, 26, 192, 125, 99, 39, 192, 214, 215,
- /* 1390 */ 192, 59, 214, 215, 192, 141, 116, 214, 215, 214,
- /* 1400 */ 215, 214, 215, 61, 152, 153, 154, 155, 156, 0,
- /* 1410 */ 1, 2, 214, 215, 5, 192, 214, 215, 132, 10,
- /* 1420 */ 11, 12, 13, 14, 1, 2, 17, 192, 5, 19,
- /* 1430 */ 20, 115, 22, 10, 11, 12, 13, 14, 192, 30,
- /* 1440 */ 17, 32, 23, 192, 23, 26, 36, 26, 116, 40,
- /* 1450 */ 192, 115, 192, 30, 192, 32, 119, 120, 59, 5,
- /* 1460 */ 214, 215, 128, 40, 10, 11, 12, 13, 14, 59,
- /* 1470 */ 19, 17, 214, 215, 214, 215, 214, 215, 120, 70,
- /* 1480 */ 192, 71, 22, 192, 30, 151, 32, 78, 130, 128,
- /* 1490 */ 81, 192, 140, 70, 40, 85, 192, 141, 7, 8,
- /* 1500 */ 90, 78, 214, 215, 81, 214, 215, 98, 83, 84,
- /* 1510 */ 100, 192, 151, 214, 215, 116, 106, 107, 214, 215,
- /* 1520 */ 192, 98, 192, 113, 70, 115, 116, 117, 23, 224,
- /* 1530 */ 120, 26, 78, 214, 215, 81, 19, 20, 152, 22,
- /* 1540 */ 154, 132, 214, 215, 214, 215, 137, 138, 97, 192,
- /* 1550 */ 256, 192, 98, 36, 23, 132, 192, 26, 192, 192,
- /* 1560 */ 137, 138, 152, 153, 154, 155, 156, 192, 192, 192,
- /* 1570 */ 161, 214, 215, 214, 215, 192, 59, 192, 214, 215,
- /* 1580 */ 214, 215, 192, 152, 161, 154, 132, 192, 71, 214,
- /* 1590 */ 215, 137, 138, 192, 192, 192, 19, 20, 192, 22,
- /* 1600 */ 140, 253, 85, 192, 214, 215, 192, 90, 23, 214,
- /* 1610 */ 215, 26, 192, 36, 192, 161, 23, 100, 192, 26,
- /* 1620 */ 214, 215, 192, 106, 107, 214, 215, 192, 23, 192,
- /* 1630 */ 113, 26, 115, 116, 117, 23, 59, 120, 26, 23,
- /* 1640 */ 23, 23, 26, 26, 26, 316, 234, 23, 71, 23,
- /* 1650 */ 26, 192, 26, 192, 192, 192, 192, 192, 192, 192,
- /* 1660 */ 192, 253, 212, 190, 286, 285, 253, 240, 253, 152,
- /* 1670 */ 153, 154, 155, 156, 241, 243, 295, 100, 291, 291,
- /* 1680 */ 223, 253, 227, 106, 107, 108, 269, 244, 244, 265,
- /* 1690 */ 113, 257, 115, 116, 117, 257, 243, 120, 269, 218,
- /* 1700 */ 217, 265, 217, 19, 20, 217, 22, 195, 269, 269,
- /* 1710 */ 60, 295, 140, 257, 243, 241, 247, 247, 199, 278,
- /* 1720 */ 36, 199, 199, 38, 19, 20, 150, 22, 149, 152,
- /* 1730 */ 153, 154, 155, 156, 22, 43, 232, 295, 292, 292,
- /* 1740 */ 18, 36, 235, 59, 268, 270, 235, 199, 235, 235,
- /* 1750 */ 18, 198, 148, 281, 244, 71, 270, 270, 268, 244,
- /* 1760 */ 232, 232, 244, 199, 59, 244, 198, 157, 288, 62,
- /* 1770 */ 199, 287, 198, 22, 219, 219, 71, 199, 198, 114,
- /* 1780 */ 199, 198, 216, 216, 100, 216, 225, 64, 22, 125,
- /* 1790 */ 106, 107, 222, 164, 219, 222, 24, 113, 216, 115,
- /* 1800 */ 116, 117, 218, 216, 120, 100, 216, 216, 310, 303,
- /* 1810 */ 112, 106, 107, 225, 280, 280, 219, 143, 113, 259,
- /* 1820 */ 115, 116, 117, 114, 259, 120, 199, 91, 82, 147,
- /* 1830 */ 144, 315, 22, 275, 199, 315, 152, 153, 154, 155,
- /* 1840 */ 156, 146, 145, 247, 258, 157, 25, 258, 245, 248,
- /* 1850 */ 244, 259, 258, 202, 259, 248, 258, 152, 153, 154,
- /* 1860 */ 155, 156, 263, 263, 26, 246, 13, 201, 193, 193,
- /* 1870 */ 6, 191, 191, 205, 191, 220, 220, 205, 211, 277,
- /* 1880 */ 211, 211, 211, 205, 4, 212, 3, 22, 162, 212,
- /* 1890 */ 211, 15, 23, 16, 23, 138, 129, 150, 26, 24,
- /* 1900 */ 141, 20, 16, 143, 1, 141, 129, 129, 61, 301,
- /* 1910 */ 301, 298, 150, 53, 53, 37, 53, 129, 115, 53,
- /* 1920 */ 140, 34, 1, 5, 22, 114, 68, 26, 160, 75,
- /* 1930 */ 68, 41, 140, 114, 24, 20, 19, 130, 124, 23,
- /* 1940 */ 67, 22, 22, 59, 22, 22, 67, 96, 24, 22,
- /* 1950 */ 37, 23, 67, 28, 148, 22, 26, 23, 23, 23,
- /* 1960 */ 23, 22, 140, 23, 97, 23, 34, 115, 22, 142,
- /* 1970 */ 26, 75, 34, 44, 75, 34, 88, 34, 86, 34,
- /* 1980 */ 23, 34, 93, 22, 24, 26, 34, 23, 26, 23,
- /* 1990 */ 23, 23, 23, 11, 23, 22, 26, 22, 22, 140,
- /* 2000 */ 23, 23, 22, 22, 134, 26, 23, 15, 140, 1,
- /* 2010 */ 1, 317, 317, 317, 140, 317, 317, 317, 317, 317,
- /* 2020 */ 317, 317, 140, 317, 317, 317, 317, 317, 317, 317,
- /* 2030 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2040 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2050 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2060 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2070 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2080 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2090 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2100 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2110 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2120 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2130 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2140 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2150 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2160 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2170 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2180 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2190 */ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- /* 2200 */ 317, 317, 317, 317, 317, 317, 317,
+ /* 0 */ 193, 193, 193, 274, 275, 276, 193, 274, 275, 276,
+ /* 10 */ 193, 223, 219, 225, 206, 210, 211, 212, 193, 19,
+ /* 20 */ 219, 233, 216, 216, 217, 216, 217, 193, 295, 216,
+ /* 30 */ 217, 31, 193, 216, 217, 193, 228, 213, 230, 39,
+ /* 40 */ 206, 216, 217, 43, 44, 45, 46, 47, 48, 49,
+ /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 193, 19,
+ /* 60 */ 185, 186, 187, 188, 189, 190, 253, 274, 275, 276,
+ /* 70 */ 195, 193, 197, 193, 261, 274, 275, 276, 253, 204,
+ /* 80 */ 238, 204, 81, 43, 44, 45, 46, 47, 48, 49,
+ /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 274, 275,
+ /* 100 */ 276, 262, 102, 103, 104, 105, 106, 107, 108, 109,
+ /* 110 */ 110, 111, 112, 113, 239, 240, 239, 240, 210, 211,
+ /* 120 */ 212, 314, 315, 314, 59, 316, 86, 252, 88, 252,
+ /* 130 */ 19, 314, 315, 256, 257, 113, 25, 72, 296, 138,
+ /* 140 */ 139, 266, 102, 103, 104, 105, 106, 107, 108, 109,
+ /* 150 */ 110, 111, 112, 113, 43, 44, 45, 46, 47, 48,
+ /* 160 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 81,
+ /* 170 */ 292, 59, 292, 298, 108, 109, 110, 111, 112, 113,
+ /* 180 */ 69, 116, 117, 118, 72, 106, 107, 193, 111, 112,
+ /* 190 */ 113, 54, 55, 56, 57, 58, 102, 103, 104, 105,
+ /* 200 */ 106, 107, 108, 109, 110, 111, 112, 113, 120, 25,
+ /* 210 */ 216, 217, 145, 102, 103, 104, 105, 106, 107, 108,
+ /* 220 */ 109, 110, 111, 112, 113, 231, 138, 139, 116, 117,
+ /* 230 */ 118, 164, 153, 19, 155, 54, 55, 56, 57, 102,
+ /* 240 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
+ /* 250 */ 113, 128, 129, 46, 47, 48, 49, 43, 44, 45,
+ /* 260 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
+ /* 270 */ 56, 57, 216, 193, 25, 59, 193, 19, 165, 166,
+ /* 280 */ 193, 67, 24, 102, 103, 104, 105, 106, 107, 108,
+ /* 290 */ 109, 110, 111, 112, 113, 73, 216, 217, 59, 216,
+ /* 300 */ 217, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ /* 310 */ 52, 53, 54, 55, 56, 57, 102, 103, 104, 105,
+ /* 320 */ 106, 107, 108, 109, 110, 111, 112, 113, 121, 145,
+ /* 330 */ 59, 193, 116, 117, 118, 119, 273, 204, 122, 123,
+ /* 340 */ 124, 19, 20, 134, 22, 136, 137, 19, 132, 127,
+ /* 350 */ 128, 129, 24, 22, 23, 116, 117, 118, 36, 193,
+ /* 360 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+ /* 370 */ 112, 113, 239, 240, 311, 312, 215, 106, 107, 241,
+ /* 380 */ 19, 59, 216, 217, 223, 252, 115, 116, 117, 118,
+ /* 390 */ 151, 120, 26, 71, 193, 308, 309, 193, 149, 128,
+ /* 400 */ 313, 216, 269, 81, 43, 44, 45, 46, 47, 48,
+ /* 410 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 253,
+ /* 420 */ 216, 217, 100, 95, 153, 59, 155, 261, 106, 107,
+ /* 430 */ 25, 193, 101, 193, 193, 231, 114, 25, 116, 117,
+ /* 440 */ 118, 113, 304, 121, 193, 204, 59, 119, 120, 121,
+ /* 450 */ 122, 123, 124, 125, 216, 217, 193, 216, 217, 131,
+ /* 460 */ 138, 139, 230, 102, 103, 104, 105, 106, 107, 108,
+ /* 470 */ 109, 110, 111, 112, 113, 153, 154, 155, 156, 157,
+ /* 480 */ 239, 240, 116, 117, 118, 76, 193, 23, 19, 25,
+ /* 490 */ 22, 253, 23, 252, 253, 108, 87, 204, 89, 261,
+ /* 500 */ 198, 92, 261, 116, 117, 118, 193, 306, 307, 216,
+ /* 510 */ 217, 150, 43, 44, 45, 46, 47, 48, 49, 50,
+ /* 520 */ 51, 52, 53, 54, 55, 56, 57, 59, 193, 216,
+ /* 530 */ 217, 19, 239, 240, 283, 23, 106, 107, 108, 109,
+ /* 540 */ 110, 111, 112, 113, 73, 252, 253, 142, 308, 309,
+ /* 550 */ 138, 139, 81, 313, 145, 43, 44, 45, 46, 47,
+ /* 560 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ /* 570 */ 307, 102, 103, 104, 105, 106, 107, 108, 109, 110,
+ /* 580 */ 111, 112, 113, 281, 116, 117, 118, 285, 23, 193,
+ /* 590 */ 25, 119, 59, 193, 122, 123, 124, 59, 127, 203,
+ /* 600 */ 59, 205, 19, 268, 132, 25, 23, 22, 193, 138,
+ /* 610 */ 139, 249, 204, 251, 102, 103, 104, 105, 106, 107,
+ /* 620 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46,
+ /* 630 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 640 */ 57, 19, 22, 23, 59, 23, 25, 239, 240, 116,
+ /* 650 */ 117, 118, 193, 11, 116, 117, 118, 116, 117, 118,
+ /* 660 */ 252, 269, 22, 193, 15, 43, 44, 45, 46, 47,
+ /* 670 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ /* 680 */ 273, 143, 193, 118, 143, 102, 103, 104, 105, 106,
+ /* 690 */ 107, 108, 109, 110, 111, 112, 113, 76, 118, 59,
+ /* 700 */ 241, 116, 117, 118, 304, 216, 217, 292, 143, 60,
+ /* 710 */ 89, 241, 19, 92, 193, 193, 23, 22, 311, 312,
+ /* 720 */ 231, 101, 22, 143, 102, 103, 104, 105, 106, 107,
+ /* 730 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46,
+ /* 740 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 750 */ 57, 19, 193, 193, 59, 23, 116, 117, 118, 59,
+ /* 760 */ 201, 21, 241, 304, 22, 206, 127, 128, 129, 193,
+ /* 770 */ 128, 129, 235, 236, 304, 43, 44, 45, 46, 47,
+ /* 780 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ /* 790 */ 22, 193, 216, 217, 193, 102, 103, 104, 105, 106,
+ /* 800 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 193,
+ /* 810 */ 193, 116, 117, 118, 216, 217, 116, 117, 118, 226,
+ /* 820 */ 80, 193, 19, 235, 236, 304, 23, 211, 212, 231,
+ /* 830 */ 204, 216, 217, 205, 102, 103, 104, 105, 106, 107,
+ /* 840 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46,
+ /* 850 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 860 */ 57, 19, 193, 123, 76, 239, 240, 193, 253, 239,
+ /* 870 */ 240, 239, 240, 193, 106, 107, 193, 89, 252, 193,
+ /* 880 */ 92, 59, 252, 141, 252, 43, 44, 45, 46, 47,
+ /* 890 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ /* 900 */ 284, 161, 216, 217, 193, 102, 103, 104, 105, 106,
+ /* 910 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 16,
+ /* 920 */ 187, 188, 189, 190, 7, 8, 9, 309, 195, 25,
+ /* 930 */ 197, 313, 19, 127, 128, 129, 262, 204, 22, 117,
+ /* 940 */ 24, 216, 217, 263, 102, 103, 104, 105, 106, 107,
+ /* 950 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46,
+ /* 960 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 970 */ 57, 193, 239, 240, 193, 59, 19, 188, 253, 190,
+ /* 980 */ 77, 226, 79, 193, 195, 252, 197, 193, 19, 301,
+ /* 990 */ 302, 193, 193, 204, 216, 217, 226, 216, 217, 266,
+ /* 1000 */ 204, 159, 45, 46, 47, 48, 49, 50, 51, 52,
+ /* 1010 */ 53, 54, 55, 56, 57, 102, 103, 104, 105, 106,
+ /* 1020 */ 107, 108, 109, 110, 111, 112, 113, 12, 239, 240,
+ /* 1030 */ 232, 298, 238, 117, 253, 239, 240, 238, 259, 260,
+ /* 1040 */ 193, 252, 27, 31, 193, 193, 142, 204, 252, 193,
+ /* 1050 */ 193, 39, 262, 193, 100, 266, 278, 42, 204, 102,
+ /* 1060 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
+ /* 1070 */ 113, 117, 159, 216, 217, 121, 216, 217, 63, 193,
+ /* 1080 */ 193, 193, 239, 240, 115, 116, 193, 298, 73, 238,
+ /* 1090 */ 238, 231, 19, 239, 240, 252, 22, 24, 211, 212,
+ /* 1100 */ 24, 193, 216, 217, 216, 217, 252, 153, 154, 155,
+ /* 1110 */ 253, 16, 19, 144, 213, 268, 43, 44, 45, 46,
+ /* 1120 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 1130 */ 57, 238, 19, 59, 193, 59, 43, 44, 45, 46,
+ /* 1140 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 1150 */ 57, 22, 23, 193, 25, 193, 43, 44, 45, 46,
+ /* 1160 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ /* 1170 */ 57, 284, 77, 193, 79, 102, 103, 104, 105, 106,
+ /* 1180 */ 107, 108, 109, 110, 111, 112, 113, 286, 193, 193,
+ /* 1190 */ 193, 117, 291, 117, 232, 102, 103, 104, 105, 106,
+ /* 1200 */ 107, 108, 109, 110, 111, 112, 113, 204, 22, 23,
+ /* 1210 */ 66, 25, 216, 217, 35, 102, 103, 104, 105, 106,
+ /* 1220 */ 107, 108, 109, 110, 111, 112, 113, 193, 268, 85,
+ /* 1230 */ 101, 193, 309, 309, 240, 19, 313, 313, 94, 208,
+ /* 1240 */ 209, 193, 239, 240, 193, 66, 252, 19, 268, 244,
+ /* 1250 */ 216, 217, 193, 74, 213, 252, 161, 19, 263, 254,
+ /* 1260 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ /* 1270 */ 54, 55, 56, 57, 193, 216, 217, 5, 59, 193,
+ /* 1280 */ 19, 244, 10, 11, 12, 13, 14, 101, 309, 17,
+ /* 1290 */ 146, 254, 313, 193, 193, 76, 115, 216, 217, 309,
+ /* 1300 */ 12, 263, 30, 313, 32, 46, 87, 46, 89, 130,
+ /* 1310 */ 193, 92, 40, 22, 263, 27, 216, 217, 102, 103,
+ /* 1320 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
+ /* 1330 */ 42, 150, 291, 216, 217, 116, 117, 118, 19, 20,
+ /* 1340 */ 193, 22, 70, 260, 116, 193, 24, 264, 193, 263,
+ /* 1350 */ 78, 63, 61, 81, 116, 36, 193, 260, 193, 29,
+ /* 1360 */ 193, 264, 193, 33, 145, 193, 59, 48, 216, 217,
+ /* 1370 */ 98, 216, 217, 193, 115, 193, 115, 193, 59, 216,
+ /* 1380 */ 217, 216, 217, 216, 217, 216, 217, 255, 216, 217,
+ /* 1390 */ 71, 193, 131, 193, 25, 65, 216, 217, 216, 217,
+ /* 1400 */ 216, 217, 208, 209, 85, 133, 193, 100, 193, 90,
+ /* 1410 */ 138, 139, 138, 139, 216, 217, 216, 217, 193, 100,
+ /* 1420 */ 193, 108, 135, 116, 117, 106, 107, 140, 121, 216,
+ /* 1430 */ 217, 216, 217, 114, 162, 116, 117, 118, 299, 300,
+ /* 1440 */ 121, 216, 217, 216, 217, 193, 244, 193, 135, 244,
+ /* 1450 */ 193, 256, 257, 140, 244, 193, 254, 193, 193, 254,
+ /* 1460 */ 153, 154, 155, 141, 254, 149, 150, 258, 216, 217,
+ /* 1470 */ 216, 217, 153, 154, 155, 156, 157, 0, 1, 2,
+ /* 1480 */ 216, 217, 5, 115, 158, 193, 160, 10, 11, 12,
+ /* 1490 */ 13, 14, 193, 59, 17, 126, 193, 19, 20, 129,
+ /* 1500 */ 22, 193, 22, 22, 24, 193, 23, 30, 25, 32,
+ /* 1510 */ 19, 20, 144, 22, 36, 216, 217, 40, 193, 216,
+ /* 1520 */ 217, 193, 152, 129, 216, 217, 193, 36, 216, 217,
+ /* 1530 */ 193, 99, 193, 193, 53, 193, 193, 59, 23, 193,
+ /* 1540 */ 25, 216, 217, 193, 216, 217, 152, 70, 59, 71,
+ /* 1550 */ 59, 117, 193, 216, 217, 78, 216, 217, 81, 216,
+ /* 1560 */ 217, 318, 71, 85, 193, 133, 193, 193, 90, 23,
+ /* 1570 */ 23, 25, 25, 120, 121, 98, 85, 193, 100, 193,
+ /* 1580 */ 23, 90, 25, 121, 106, 107, 19, 216, 217, 216,
+ /* 1590 */ 217, 100, 114, 131, 116, 117, 118, 106, 107, 121,
+ /* 1600 */ 216, 217, 216, 217, 193, 114, 117, 116, 117, 118,
+ /* 1610 */ 133, 193, 121, 193, 193, 138, 139, 193, 23, 193,
+ /* 1620 */ 25, 23, 23, 25, 25, 7, 8, 216, 217, 193,
+ /* 1630 */ 193, 153, 154, 155, 156, 157, 216, 217, 193, 162,
+ /* 1640 */ 216, 217, 216, 217, 153, 154, 155, 156, 157, 1,
+ /* 1650 */ 2, 193, 193, 5, 19, 20, 59, 22, 10, 11,
+ /* 1660 */ 12, 13, 14, 193, 97, 17, 193, 23, 193, 25,
+ /* 1670 */ 288, 36, 193, 242, 216, 217, 236, 23, 30, 25,
+ /* 1680 */ 32, 19, 20, 23, 22, 25, 216, 217, 40, 216,
+ /* 1690 */ 217, 216, 217, 193, 59, 216, 217, 193, 36, 83,
+ /* 1700 */ 84, 153, 153, 155, 155, 23, 71, 25, 23, 193,
+ /* 1710 */ 25, 193, 193, 193, 117, 193, 193, 193, 70, 193,
+ /* 1720 */ 193, 59, 193, 255, 255, 287, 78, 255, 243, 81,
+ /* 1730 */ 191, 255, 297, 71, 271, 100, 293, 245, 267, 214,
+ /* 1740 */ 246, 106, 107, 108, 246, 271, 98, 245, 293, 114,
+ /* 1750 */ 220, 116, 117, 118, 267, 271, 121, 271, 225, 219,
+ /* 1760 */ 229, 219, 100, 219, 259, 259, 259, 259, 106, 107,
+ /* 1770 */ 249, 196, 60, 280, 141, 243, 114, 249, 116, 117,
+ /* 1780 */ 118, 133, 245, 121, 200, 297, 138, 139, 153, 154,
+ /* 1790 */ 155, 156, 157, 297, 200, 38, 19, 20, 151, 22,
+ /* 1800 */ 200, 150, 140, 294, 294, 22, 272, 43, 234, 18,
+ /* 1810 */ 162, 270, 200, 36, 237, 153, 154, 155, 156, 157,
+ /* 1820 */ 237, 283, 237, 237, 18, 199, 149, 246, 272, 270,
+ /* 1830 */ 272, 200, 158, 246, 246, 234, 59, 234, 246, 199,
+ /* 1840 */ 290, 62, 289, 200, 199, 22, 221, 115, 71, 200,
+ /* 1850 */ 200, 199, 199, 221, 218, 218, 19, 20, 64, 22,
+ /* 1860 */ 218, 227, 22, 224, 126, 224, 165, 221, 24, 305,
+ /* 1870 */ 200, 113, 312, 36, 218, 220, 218, 100, 282, 218,
+ /* 1880 */ 91, 218, 317, 106, 107, 221, 227, 282, 317, 82,
+ /* 1890 */ 148, 114, 265, 116, 117, 118, 59, 145, 121, 22,
+ /* 1900 */ 277, 158, 200, 265, 25, 202, 147, 250, 71, 279,
+ /* 1910 */ 13, 146, 194, 194, 249, 248, 250, 140, 247, 246,
+ /* 1920 */ 6, 192, 192, 192, 303, 303, 213, 207, 300, 213,
+ /* 1930 */ 153, 154, 155, 156, 157, 213, 213, 100, 213, 222,
+ /* 1940 */ 207, 214, 214, 106, 107, 4, 222, 207, 3, 22,
+ /* 1950 */ 163, 114, 15, 116, 117, 118, 16, 23, 121, 23,
+ /* 1960 */ 139, 151, 130, 25, 142, 16, 24, 20, 144, 1,
+ /* 1970 */ 142, 130, 130, 61, 53, 53, 37, 151, 53, 53,
+ /* 1980 */ 130, 116, 34, 1, 141, 5, 22, 115, 161, 141,
+ /* 1990 */ 153, 154, 155, 156, 157, 25, 68, 68, 75, 41,
+ /* 2000 */ 115, 24, 131, 20, 19, 125, 22, 96, 22, 22,
+ /* 2010 */ 67, 23, 22, 67, 59, 24, 22, 28, 67, 23,
+ /* 2020 */ 22, 22, 149, 23, 23, 23, 116, 23, 25, 37,
+ /* 2030 */ 97, 141, 23, 23, 22, 143, 25, 75, 88, 34,
+ /* 2040 */ 34, 34, 34, 86, 75, 93, 23, 34, 22, 34,
+ /* 2050 */ 25, 24, 34, 25, 23, 142, 23, 142, 44, 23,
+ /* 2060 */ 23, 23, 11, 23, 25, 22, 22, 22, 15, 23,
+ /* 2070 */ 23, 22, 22, 25, 1, 1, 141, 25, 23, 135,
+ /* 2080 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2090 */ 319, 319, 319, 319, 141, 141, 319, 319, 319, 319,
+ /* 2100 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2110 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2120 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2130 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2140 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2150 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2160 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2170 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2180 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2190 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2200 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2210 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2220 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2230 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2240 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2250 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2260 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2270 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ /* 2280 */ 319,
};
-#define YY_SHIFT_COUNT (569)
+#define YY_SHIFT_COUNT (574)
#define YY_SHIFT_MIN (0)
-#define YY_SHIFT_MAX (2009)
+#define YY_SHIFT_MAX (2074)
static const unsigned short int yy_shift_ofst[] = {
- /* 0 */ 1423, 1409, 1454, 1192, 1192, 382, 1252, 1410, 1517, 1684,
- /* 10 */ 1684, 1684, 221, 0, 0, 180, 1015, 1684, 1684, 1684,
- /* 20 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
- /* 30 */ 1049, 1049, 1121, 1121, 54, 616, 382, 382, 382, 382,
- /* 40 */ 382, 40, 110, 219, 289, 396, 439, 509, 548, 618,
- /* 50 */ 657, 727, 766, 836, 995, 1015, 1015, 1015, 1015, 1015,
- /* 60 */ 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
- /* 70 */ 1015, 1015, 1015, 1035, 1015, 1138, 880, 880, 1577, 1684,
- /* 80 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
- /* 90 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
- /* 100 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
- /* 110 */ 1684, 1684, 1684, 1705, 1684, 1684, 1684, 1684, 1684, 1684,
- /* 120 */ 1684, 1684, 1684, 1684, 1684, 1684, 1684, 146, 84, 84,
- /* 130 */ 84, 84, 84, 274, 315, 125, 97, 357, 66, 66,
- /* 140 */ 893, 258, 66, 66, 371, 371, 66, 551, 551, 551,
- /* 150 */ 551, 192, 209, 209, 278, 127, 2023, 2023, 621, 621,
- /* 160 */ 621, 201, 398, 398, 398, 398, 939, 939, 442, 936,
- /* 170 */ 1009, 66, 66, 66, 66, 66, 66, 66, 66, 66,
- /* 180 */ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
- /* 190 */ 66, 710, 710, 66, 776, 435, 435, 410, 410, 372,
- /* 200 */ 1097, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 250, 490,
- /* 210 */ 490, 511, 451, 516, 252, 566, 575, 781, 673, 66,
- /* 220 */ 66, 66, 66, 66, 66, 66, 66, 66, 66, 722,
- /* 230 */ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
- /* 240 */ 66, 66, 790, 790, 790, 66, 66, 66, 883, 66,
- /* 250 */ 66, 66, 891, 1064, 66, 66, 1212, 66, 66, 66,
- /* 260 */ 66, 66, 66, 66, 66, 725, 763, 177, 940, 940,
- /* 270 */ 940, 940, 337, 177, 177, 1028, 1053, 670, 1264, 1179,
- /* 280 */ 1173, 1254, 1316, 1173, 1316, 1336, 50, 1179, 1179, 50,
- /* 290 */ 1179, 1254, 1336, 1259, 732, 532, 1347, 1347, 1347, 1316,
- /* 300 */ 1236, 1236, 1184, 1356, 1167, 898, 1650, 1650, 1572, 1572,
- /* 310 */ 1685, 1685, 1572, 1576, 1579, 1712, 1692, 1722, 1722, 1722,
- /* 320 */ 1722, 1572, 1732, 1604, 1579, 1579, 1604, 1712, 1692, 1604,
- /* 330 */ 1692, 1604, 1572, 1732, 1610, 1707, 1572, 1732, 1751, 1572,
- /* 340 */ 1732, 1572, 1732, 1751, 1665, 1665, 1665, 1723, 1766, 1766,
- /* 350 */ 1751, 1665, 1664, 1665, 1723, 1665, 1665, 1629, 1772, 1698,
- /* 360 */ 1698, 1751, 1674, 1709, 1674, 1709, 1674, 1709, 1674, 1709,
- /* 370 */ 1572, 1736, 1736, 1746, 1746, 1682, 1686, 1810, 1572, 1688,
- /* 380 */ 1682, 1695, 1697, 1604, 1821, 1838, 1853, 1853, 1864, 1864,
- /* 390 */ 1864, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
- /* 400 */ 2023, 2023, 2023, 2023, 2023, 2023, 232, 101, 1131, 1193,
- /* 410 */ 619, 679, 841, 1421, 1286, 115, 1352, 1334, 1361, 1419,
- /* 420 */ 1342, 1505, 1531, 1585, 1593, 1605, 1612, 1280, 1337, 1491,
- /* 430 */ 1358, 1451, 1332, 1616, 1617, 1425, 1618, 1386, 1431, 1624,
- /* 440 */ 1626, 1399, 1460, 1880, 1883, 1865, 1726, 1876, 1877, 1869,
- /* 450 */ 1871, 1757, 1747, 1767, 1872, 1872, 1875, 1759, 1881, 1760,
- /* 460 */ 1886, 1903, 1764, 1777, 1872, 1778, 1847, 1878, 1872, 1762,
- /* 470 */ 1860, 1861, 1863, 1866, 1788, 1803, 1887, 1780, 1921, 1918,
- /* 480 */ 1902, 1811, 1768, 1858, 1901, 1862, 1854, 1890, 1792, 1819,
- /* 490 */ 1910, 1915, 1917, 1807, 1814, 1919, 1873, 1920, 1922, 1916,
- /* 500 */ 1923, 1879, 1884, 1924, 1851, 1925, 1927, 1885, 1913, 1928,
- /* 510 */ 1806, 1933, 1934, 1935, 1936, 1930, 1937, 1939, 1867, 1822,
- /* 520 */ 1940, 1942, 1852, 1932, 1946, 1827, 1944, 1938, 1941, 1943,
- /* 530 */ 1945, 1888, 1896, 1892, 1929, 1899, 1889, 1947, 1957, 1961,
- /* 540 */ 1960, 1959, 1962, 1952, 1964, 1944, 1966, 1967, 1968, 1969,
- /* 550 */ 1970, 1971, 1973, 1982, 1975, 1976, 1977, 1978, 1980, 1981,
- /* 560 */ 1979, 1870, 1859, 1868, 1874, 1882, 1983, 1992, 2008, 2009,
+ /* 0 */ 1648, 1477, 1272, 322, 322, 1, 1319, 1478, 1491, 1837,
+ /* 10 */ 1837, 1837, 471, 0, 0, 214, 1093, 1837, 1837, 1837,
+ /* 20 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
+ /* 30 */ 271, 271, 1219, 1219, 216, 88, 1, 1, 1, 1,
+ /* 40 */ 1, 40, 111, 258, 361, 469, 512, 583, 622, 693,
+ /* 50 */ 732, 803, 842, 913, 1073, 1093, 1093, 1093, 1093, 1093,
+ /* 60 */ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ /* 70 */ 1093, 1093, 1093, 1113, 1093, 1216, 957, 957, 1635, 1662,
+ /* 80 */ 1777, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
+ /* 90 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
+ /* 100 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
+ /* 110 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
+ /* 120 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
+ /* 130 */ 137, 181, 181, 181, 181, 181, 181, 181, 94, 430,
+ /* 140 */ 66, 65, 112, 366, 533, 533, 740, 1261, 533, 533,
+ /* 150 */ 79, 79, 533, 412, 412, 412, 77, 412, 123, 113,
+ /* 160 */ 113, 22, 22, 2096, 2096, 328, 328, 328, 239, 468,
+ /* 170 */ 468, 468, 468, 1015, 1015, 409, 366, 1129, 1186, 533,
+ /* 180 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533,
+ /* 190 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 969,
+ /* 200 */ 621, 621, 533, 642, 788, 788, 1228, 1228, 822, 822,
+ /* 210 */ 67, 1274, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 1307,
+ /* 220 */ 954, 954, 585, 472, 640, 387, 695, 538, 541, 700,
+ /* 230 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533,
+ /* 240 */ 222, 533, 533, 533, 533, 533, 533, 533, 533, 533,
+ /* 250 */ 533, 533, 533, 1179, 1179, 1179, 533, 533, 533, 565,
+ /* 260 */ 533, 533, 533, 916, 1144, 533, 533, 1288, 533, 533,
+ /* 270 */ 533, 533, 533, 533, 533, 533, 639, 1330, 209, 1076,
+ /* 280 */ 1076, 1076, 1076, 580, 209, 209, 1313, 768, 917, 649,
+ /* 290 */ 1181, 1316, 405, 1316, 1238, 249, 1181, 1181, 249, 1181,
+ /* 300 */ 405, 1238, 1369, 464, 1259, 1012, 1012, 1012, 1368, 1368,
+ /* 310 */ 1368, 1368, 184, 184, 1326, 904, 1287, 1480, 1712, 1712,
+ /* 320 */ 1633, 1633, 1757, 1757, 1633, 1647, 1651, 1783, 1764, 1791,
+ /* 330 */ 1791, 1791, 1791, 1633, 1806, 1677, 1651, 1651, 1677, 1783,
+ /* 340 */ 1764, 1677, 1764, 1677, 1633, 1806, 1674, 1779, 1633, 1806,
+ /* 350 */ 1823, 1633, 1806, 1633, 1806, 1823, 1732, 1732, 1732, 1794,
+ /* 360 */ 1840, 1840, 1823, 1732, 1738, 1732, 1794, 1732, 1732, 1701,
+ /* 370 */ 1844, 1758, 1758, 1823, 1633, 1789, 1789, 1807, 1807, 1742,
+ /* 380 */ 1752, 1877, 1633, 1743, 1742, 1759, 1765, 1677, 1879, 1897,
+ /* 390 */ 1897, 1914, 1914, 1914, 2096, 2096, 2096, 2096, 2096, 2096,
+ /* 400 */ 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 207,
+ /* 410 */ 1095, 331, 620, 903, 806, 1074, 1483, 1432, 1481, 1322,
+ /* 420 */ 1370, 1394, 1515, 1291, 1546, 1547, 1557, 1595, 1598, 1599,
+ /* 430 */ 1434, 1453, 1618, 1462, 1567, 1489, 1644, 1654, 1616, 1660,
+ /* 440 */ 1548, 1549, 1682, 1685, 1597, 742, 1941, 1945, 1927, 1787,
+ /* 450 */ 1937, 1940, 1934, 1936, 1821, 1810, 1832, 1938, 1938, 1942,
+ /* 460 */ 1822, 1947, 1824, 1949, 1968, 1828, 1841, 1938, 1842, 1912,
+ /* 470 */ 1939, 1938, 1826, 1921, 1922, 1925, 1926, 1850, 1865, 1948,
+ /* 480 */ 1843, 1982, 1980, 1964, 1872, 1827, 1928, 1970, 1929, 1923,
+ /* 490 */ 1958, 1848, 1885, 1977, 1983, 1985, 1871, 1880, 1984, 1943,
+ /* 500 */ 1986, 1987, 1988, 1990, 1946, 1955, 1991, 1911, 1989, 1994,
+ /* 510 */ 1951, 1992, 1996, 1873, 1998, 2000, 2001, 2002, 2003, 2004,
+ /* 520 */ 1999, 1933, 1890, 2009, 2010, 1910, 2005, 2012, 1892, 2011,
+ /* 530 */ 2006, 2007, 2008, 2013, 1950, 1962, 1957, 2014, 1969, 1952,
+ /* 540 */ 2015, 2023, 2026, 2027, 2025, 2028, 2018, 1913, 1915, 2031,
+ /* 550 */ 2011, 2033, 2036, 2037, 2038, 2039, 2040, 2043, 2051, 2044,
+ /* 560 */ 2045, 2046, 2047, 2049, 2050, 2048, 1944, 1935, 1953, 1954,
+ /* 570 */ 2052, 2055, 2053, 2073, 2074,
};
-#define YY_REDUCE_COUNT (405)
-#define YY_REDUCE_MIN (-266)
-#define YY_REDUCE_MAX (1683)
+#define YY_REDUCE_COUNT (408)
+#define YY_REDUCE_MIN (-271)
+#define YY_REDUCE_MAX (1740)
static const short yy_reduce_ofst[] = {
- /* 0 */ 111, 168, 272, 760, -177, -175, -192, -190, -182, -179,
- /* 10 */ 216, 220, 481, -208, -205, -266, -140, -115, 241, 393,
- /* 20 */ 523, 325, 612, 632, 542, 651, 764, 757, 702, 762,
- /* 30 */ 812, 814, -188, 273, 924, 386, 758, 967, 1020, 1052,
- /* 40 */ 1066, -256, -256, -256, -256, -256, -256, -256, -256, -256,
- /* 50 */ -256, -256, -256, -256, -256, -256, -256, -256, -256, -256,
- /* 60 */ -256, -256, -256, -256, -256, -256, -256, -256, -256, -256,
- /* 70 */ -256, -256, -256, -256, -256, -256, -256, -256, 195, 222,
- /* 80 */ 813, 917, 920, 959, 985, 1006, 1038, 1067, 1069, 1072,
- /* 90 */ 1099, 1103, 1105, 1118, 1135, 1139, 1142, 1146, 1148, 1159,
- /* 100 */ 1174, 1178, 1183, 1185, 1187, 1198, 1202, 1246, 1258, 1260,
- /* 110 */ 1262, 1288, 1291, 1299, 1304, 1319, 1328, 1330, 1357, 1359,
- /* 120 */ 1364, 1366, 1375, 1390, 1395, 1406, 1411, -256, -256, -256,
- /* 130 */ -256, -256, -256, -256, -256, 447, -256, 555, -178, 605,
- /* 140 */ 832, -220, 606, -94, -168, 36, -122, 730, 780, 730,
- /* 150 */ 780, 918, -136, 338, -256, -256, -256, -256, 80, 80,
- /* 160 */ 80, 720, 703, 811, 882, 903, -213, -204, 106, 330,
- /* 170 */ 330, -77, 236, 320, 599, 67, 457, 675, 729, 395,
- /* 180 */ 268, 611, 969, 1004, 726, 1014, 983, 123, 884, 608,
- /* 190 */ 1034, 547, 911, 650, 844, 922, 949, 965, 972, 978,
- /* 200 */ 449, 970, 718, 784, 1073, 1084, 1023, 1129, -209, -180,
- /* 210 */ -113, 114, 183, 329, 345, 391, 446, 502, 609, 667,
- /* 220 */ 713, 817, 865, 881, 901, 921, 989, 1191, 1195, 214,
- /* 230 */ 1223, 1235, 1251, 1367, 1376, 1377, 1383, 1385, 1401, 1402,
- /* 240 */ 1403, 1414, 584, 638, 1305, 1420, 1422, 1426, 1294, 1430,
- /* 250 */ 1435, 1437, 1348, 1329, 1459, 1461, 1412, 1462, 345, 1463,
- /* 260 */ 1464, 1465, 1466, 1467, 1468, 1378, 1380, 1427, 1408, 1413,
- /* 270 */ 1415, 1428, 1294, 1427, 1427, 1433, 1450, 1473, 1381, 1417,
- /* 280 */ 1424, 1432, 1434, 1436, 1438, 1387, 1443, 1429, 1439, 1444,
- /* 290 */ 1440, 1453, 1388, 1481, 1455, 1457, 1483, 1485, 1488, 1456,
- /* 300 */ 1469, 1470, 1441, 1471, 1474, 1512, 1416, 1442, 1519, 1522,
- /* 310 */ 1446, 1447, 1523, 1472, 1475, 1476, 1504, 1507, 1511, 1513,
- /* 320 */ 1514, 1548, 1553, 1510, 1486, 1487, 1515, 1490, 1528, 1518,
- /* 330 */ 1529, 1521, 1564, 1568, 1480, 1484, 1571, 1574, 1555, 1578,
- /* 340 */ 1580, 1581, 1583, 1556, 1566, 1567, 1569, 1561, 1570, 1573,
- /* 350 */ 1575, 1582, 1584, 1587, 1588, 1590, 1591, 1498, 1506, 1534,
- /* 360 */ 1535, 1597, 1560, 1586, 1565, 1589, 1592, 1594, 1595, 1598,
- /* 370 */ 1627, 1516, 1520, 1599, 1600, 1601, 1596, 1558, 1635, 1602,
- /* 380 */ 1607, 1619, 1603, 1606, 1651, 1666, 1675, 1676, 1680, 1681,
- /* 390 */ 1683, 1608, 1609, 1613, 1668, 1667, 1669, 1670, 1671, 1672,
- /* 400 */ 1655, 1656, 1673, 1677, 1679, 1678,
+ /* 0 */ -125, 733, 789, 241, 293, -123, -193, -191, -183, -187,
+ /* 10 */ 166, 238, 133, -207, -199, -267, -176, -6, 204, 489,
+ /* 20 */ 576, -175, 598, 686, 615, 725, 860, 778, 781, 857,
+ /* 30 */ 616, 887, 87, 240, -192, 408, 626, 796, 843, 854,
+ /* 40 */ 1003, -271, -271, -271, -271, -271, -271, -271, -271, -271,
+ /* 50 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271,
+ /* 60 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271,
+ /* 70 */ -271, -271, -271, -271, -271, -271, -271, -271, 80, 83,
+ /* 80 */ 313, 886, 888, 996, 1034, 1059, 1081, 1100, 1117, 1152,
+ /* 90 */ 1155, 1163, 1165, 1167, 1169, 1172, 1180, 1182, 1184, 1198,
+ /* 100 */ 1200, 1213, 1215, 1225, 1227, 1252, 1254, 1264, 1299, 1303,
+ /* 110 */ 1308, 1312, 1325, 1328, 1337, 1340, 1343, 1371, 1373, 1384,
+ /* 120 */ 1386, 1411, 1420, 1424, 1426, 1458, 1470, 1473, 1475, 1479,
+ /* 130 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271,
+ /* 140 */ -271, 138, 459, 396, -158, 470, 302, -212, 521, 201,
+ /* 150 */ -195, -92, 559, 630, 632, 630, -271, 632, 901, 63,
+ /* 160 */ 407, -271, -271, -271, -271, 161, 161, 161, 251, 335,
+ /* 170 */ 847, 960, 980, 537, 588, 618, 628, 688, 688, -166,
+ /* 180 */ -161, 674, 790, 794, 799, 851, 852, -122, 680, -120,
+ /* 190 */ 995, 1038, 415, 1051, 893, 798, 962, 400, 1086, 779,
+ /* 200 */ 923, 924, 263, 1041, 979, 990, 1083, 1097, 1031, 1194,
+ /* 210 */ 362, 994, 1139, 1005, 1037, 1202, 1205, 1195, 1210, -194,
+ /* 220 */ 56, 185, -135, 232, 522, 560, 601, 617, 669, 683,
+ /* 230 */ 711, 856, 908, 941, 1048, 1101, 1147, 1257, 1262, 1265,
+ /* 240 */ 392, 1292, 1333, 1339, 1342, 1346, 1350, 1359, 1374, 1418,
+ /* 250 */ 1421, 1436, 1437, 593, 755, 770, 997, 1445, 1459, 1209,
+ /* 260 */ 1500, 1504, 1516, 1132, 1243, 1518, 1519, 1440, 1520, 560,
+ /* 270 */ 1522, 1523, 1524, 1526, 1527, 1529, 1382, 1438, 1431, 1468,
+ /* 280 */ 1469, 1472, 1476, 1209, 1431, 1431, 1485, 1525, 1539, 1435,
+ /* 290 */ 1463, 1471, 1492, 1487, 1443, 1494, 1474, 1484, 1498, 1486,
+ /* 300 */ 1502, 1455, 1530, 1531, 1533, 1540, 1542, 1544, 1505, 1506,
+ /* 310 */ 1507, 1508, 1521, 1528, 1493, 1537, 1532, 1575, 1488, 1496,
+ /* 320 */ 1584, 1594, 1509, 1510, 1600, 1538, 1534, 1541, 1574, 1577,
+ /* 330 */ 1583, 1585, 1586, 1612, 1626, 1581, 1556, 1558, 1587, 1559,
+ /* 340 */ 1601, 1588, 1603, 1592, 1631, 1640, 1550, 1553, 1643, 1645,
+ /* 350 */ 1625, 1649, 1652, 1650, 1653, 1632, 1636, 1637, 1642, 1634,
+ /* 360 */ 1639, 1641, 1646, 1656, 1655, 1658, 1659, 1661, 1663, 1560,
+ /* 370 */ 1564, 1596, 1605, 1664, 1670, 1565, 1571, 1627, 1638, 1657,
+ /* 380 */ 1665, 1623, 1702, 1630, 1666, 1667, 1671, 1673, 1703, 1718,
+ /* 390 */ 1719, 1729, 1730, 1731, 1621, 1622, 1628, 1720, 1713, 1716,
+ /* 400 */ 1722, 1723, 1733, 1717, 1724, 1727, 1728, 1725, 1740,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 1623, 1623, 1623, 1453, 1223, 1332, 1223, 1223, 1223, 1453,
- /* 10 */ 1453, 1453, 1223, 1362, 1362, 1506, 1254, 1223, 1223, 1223,
- /* 20 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1452, 1223, 1223,
- /* 30 */ 1223, 1223, 1541, 1541, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 40 */ 1223, 1223, 1371, 1223, 1378, 1223, 1223, 1223, 1223, 1223,
- /* 50 */ 1454, 1455, 1223, 1223, 1223, 1505, 1507, 1470, 1385, 1384,
- /* 60 */ 1383, 1382, 1488, 1349, 1376, 1369, 1373, 1448, 1449, 1447,
- /* 70 */ 1451, 1455, 1454, 1223, 1372, 1419, 1433, 1418, 1223, 1223,
- /* 80 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 90 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 100 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 110 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 120 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1427, 1432, 1438,
- /* 130 */ 1431, 1428, 1421, 1420, 1422, 1223, 1423, 1223, 1223, 1223,
- /* 140 */ 1244, 1296, 1223, 1223, 1223, 1223, 1223, 1525, 1524, 1223,
- /* 150 */ 1223, 1254, 1413, 1412, 1424, 1425, 1435, 1434, 1513, 1576,
- /* 160 */ 1575, 1471, 1223, 1223, 1223, 1223, 1223, 1223, 1541, 1223,
- /* 170 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 180 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 190 */ 1223, 1541, 1541, 1223, 1254, 1541, 1541, 1250, 1250, 1356,
- /* 200 */ 1223, 1520, 1323, 1323, 1323, 1323, 1332, 1323, 1223, 1223,
- /* 210 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 220 */ 1223, 1223, 1223, 1510, 1508, 1223, 1223, 1223, 1223, 1223,
- /* 230 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 240 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 250 */ 1223, 1223, 1328, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 260 */ 1223, 1223, 1223, 1223, 1570, 1223, 1483, 1310, 1328, 1328,
- /* 270 */ 1328, 1328, 1330, 1311, 1309, 1322, 1255, 1230, 1615, 1388,
- /* 280 */ 1377, 1329, 1351, 1377, 1351, 1612, 1375, 1388, 1388, 1375,
- /* 290 */ 1388, 1329, 1612, 1271, 1592, 1266, 1362, 1362, 1362, 1351,
- /* 300 */ 1356, 1356, 1450, 1329, 1322, 1223, 1615, 1615, 1337, 1337,
- /* 310 */ 1614, 1614, 1337, 1471, 1599, 1397, 1299, 1305, 1305, 1305,
- /* 320 */ 1305, 1337, 1241, 1375, 1599, 1599, 1375, 1397, 1299, 1375,
- /* 330 */ 1299, 1375, 1337, 1241, 1487, 1609, 1337, 1241, 1461, 1337,
- /* 340 */ 1241, 1337, 1241, 1461, 1297, 1297, 1297, 1286, 1223, 1223,
- /* 350 */ 1461, 1297, 1271, 1297, 1286, 1297, 1297, 1559, 1223, 1465,
- /* 360 */ 1465, 1461, 1355, 1350, 1355, 1350, 1355, 1350, 1355, 1350,
- /* 370 */ 1337, 1551, 1551, 1365, 1365, 1370, 1356, 1456, 1337, 1223,
- /* 380 */ 1370, 1368, 1366, 1375, 1247, 1289, 1573, 1573, 1569, 1569,
- /* 390 */ 1569, 1620, 1620, 1520, 1585, 1254, 1254, 1254, 1254, 1585,
- /* 400 */ 1273, 1273, 1255, 1255, 1254, 1585, 1223, 1223, 1223, 1223,
- /* 410 */ 1223, 1223, 1580, 1223, 1515, 1472, 1341, 1223, 1223, 1223,
- /* 420 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 430 */ 1223, 1526, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 440 */ 1223, 1223, 1402, 1223, 1226, 1517, 1223, 1223, 1223, 1223,
- /* 450 */ 1223, 1223, 1223, 1223, 1379, 1380, 1342, 1223, 1223, 1223,
- /* 460 */ 1223, 1223, 1223, 1223, 1394, 1223, 1223, 1223, 1389, 1223,
- /* 470 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1611, 1223, 1223,
- /* 480 */ 1223, 1223, 1223, 1223, 1486, 1485, 1223, 1223, 1339, 1223,
- /* 490 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 500 */ 1223, 1223, 1269, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 510 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 520 */ 1223, 1223, 1223, 1223, 1223, 1223, 1367, 1223, 1223, 1223,
- /* 530 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 540 */ 1223, 1556, 1357, 1223, 1223, 1602, 1223, 1223, 1223, 1223,
- /* 550 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
- /* 560 */ 1596, 1313, 1404, 1223, 1403, 1407, 1223, 1235, 1223, 1223,
+ /* 0 */ 1641, 1641, 1641, 1469, 1236, 1347, 1236, 1236, 1236, 1469,
+ /* 10 */ 1469, 1469, 1236, 1377, 1377, 1522, 1269, 1236, 1236, 1236,
+ /* 20 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1468, 1236, 1236,
+ /* 30 */ 1236, 1236, 1557, 1557, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 40 */ 1236, 1236, 1386, 1236, 1393, 1236, 1236, 1236, 1236, 1236,
+ /* 50 */ 1470, 1471, 1236, 1236, 1236, 1521, 1523, 1486, 1400, 1399,
+ /* 60 */ 1398, 1397, 1504, 1365, 1391, 1384, 1388, 1465, 1466, 1464,
+ /* 70 */ 1619, 1471, 1470, 1236, 1387, 1433, 1449, 1432, 1236, 1236,
+ /* 80 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 90 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 100 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 110 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 120 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 130 */ 1441, 1448, 1447, 1446, 1455, 1445, 1442, 1435, 1434, 1436,
+ /* 140 */ 1437, 1236, 1236, 1260, 1236, 1236, 1257, 1311, 1236, 1236,
+ /* 150 */ 1236, 1236, 1236, 1541, 1540, 1236, 1438, 1236, 1269, 1427,
+ /* 160 */ 1426, 1452, 1439, 1451, 1450, 1529, 1593, 1592, 1487, 1236,
+ /* 170 */ 1236, 1236, 1236, 1236, 1236, 1557, 1236, 1236, 1236, 1236,
+ /* 180 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 190 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1367,
+ /* 200 */ 1557, 1557, 1236, 1269, 1557, 1557, 1368, 1368, 1265, 1265,
+ /* 210 */ 1371, 1236, 1536, 1338, 1338, 1338, 1338, 1347, 1338, 1236,
+ /* 220 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 230 */ 1236, 1236, 1236, 1236, 1526, 1524, 1236, 1236, 1236, 1236,
+ /* 240 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 250 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 260 */ 1236, 1236, 1236, 1343, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 270 */ 1236, 1236, 1236, 1236, 1236, 1586, 1236, 1499, 1325, 1343,
+ /* 280 */ 1343, 1343, 1343, 1345, 1326, 1324, 1337, 1270, 1243, 1633,
+ /* 290 */ 1403, 1392, 1344, 1392, 1630, 1390, 1403, 1403, 1390, 1403,
+ /* 300 */ 1344, 1630, 1286, 1608, 1281, 1377, 1377, 1377, 1367, 1367,
+ /* 310 */ 1367, 1367, 1371, 1371, 1467, 1344, 1337, 1236, 1633, 1633,
+ /* 320 */ 1353, 1353, 1632, 1632, 1353, 1487, 1616, 1412, 1314, 1320,
+ /* 330 */ 1320, 1320, 1320, 1353, 1254, 1390, 1616, 1616, 1390, 1412,
+ /* 340 */ 1314, 1390, 1314, 1390, 1353, 1254, 1503, 1627, 1353, 1254,
+ /* 350 */ 1477, 1353, 1254, 1353, 1254, 1477, 1312, 1312, 1312, 1301,
+ /* 360 */ 1236, 1236, 1477, 1312, 1286, 1312, 1301, 1312, 1312, 1575,
+ /* 370 */ 1236, 1481, 1481, 1477, 1353, 1567, 1567, 1380, 1380, 1385,
+ /* 380 */ 1371, 1472, 1353, 1236, 1385, 1383, 1381, 1390, 1304, 1589,
+ /* 390 */ 1589, 1585, 1585, 1585, 1638, 1638, 1536, 1601, 1269, 1269,
+ /* 400 */ 1269, 1269, 1601, 1288, 1288, 1270, 1270, 1269, 1601, 1236,
+ /* 410 */ 1236, 1236, 1236, 1236, 1236, 1596, 1236, 1531, 1488, 1357,
+ /* 420 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 430 */ 1236, 1236, 1236, 1236, 1542, 1236, 1236, 1236, 1236, 1236,
+ /* 440 */ 1236, 1236, 1236, 1236, 1236, 1417, 1236, 1239, 1533, 1236,
+ /* 450 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1394, 1395, 1358,
+ /* 460 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1409, 1236, 1236,
+ /* 470 */ 1236, 1404, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 480 */ 1629, 1236, 1236, 1236, 1236, 1236, 1236, 1502, 1501, 1236,
+ /* 490 */ 1236, 1355, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 500 */ 1236, 1236, 1236, 1236, 1236, 1284, 1236, 1236, 1236, 1236,
+ /* 510 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 520 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1382,
+ /* 530 */ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 540 */ 1236, 1236, 1236, 1236, 1572, 1372, 1236, 1236, 1236, 1236,
+ /* 550 */ 1620, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ /* 560 */ 1236, 1236, 1236, 1236, 1236, 1612, 1328, 1418, 1236, 1421,
+ /* 570 */ 1258, 1236, 1248, 1236, 1236,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -159223,8 +168962,8 @@ static const YYCODETYPE yyFallback[] = {
0, /* LP => nothing */
0, /* RP => nothing */
0, /* AS => nothing */
- 59, /* WITHOUT => ID */
0, /* COMMA => nothing */
+ 59, /* WITHOUT => ID */
59, /* ABORT => ID */
59, /* ACTION => ID */
59, /* AFTER => ID */
@@ -159310,6 +169049,7 @@ static const YYCODETYPE yyFallback[] = {
0, /* SLASH => nothing */
0, /* REM => nothing */
0, /* CONCAT => nothing */
+ 0, /* PTR => nothing */
0, /* COLLATE => nothing */
0, /* BITNOT => nothing */
0, /* ON => nothing */
@@ -159433,9 +169173,9 @@ struct yyParser {
};
typedef struct yyParser yyParser;
+/* #include <assert.h> */
#ifndef NDEBUG
/* #include <stdio.h> */
-/* #include <assert.h> */
static FILE *yyTraceFILE = 0;
static char *yyTracePrompt = 0;
#endif /* NDEBUG */
@@ -159495,8 +169235,8 @@ static const char *const yyTokenName[] = {
/* 22 */ "LP",
/* 23 */ "RP",
/* 24 */ "AS",
- /* 25 */ "WITHOUT",
- /* 26 */ "COMMA",
+ /* 25 */ "COMMA",
+ /* 26 */ "WITHOUT",
/* 27 */ "ABORT",
/* 28 */ "ACTION",
/* 29 */ "AFTER",
@@ -159582,211 +169322,213 @@ static const char *const yyTokenName[] = {
/* 109 */ "SLASH",
/* 110 */ "REM",
/* 111 */ "CONCAT",
- /* 112 */ "COLLATE",
- /* 113 */ "BITNOT",
- /* 114 */ "ON",
- /* 115 */ "INDEXED",
- /* 116 */ "STRING",
- /* 117 */ "JOIN_KW",
- /* 118 */ "CONSTRAINT",
- /* 119 */ "DEFAULT",
- /* 120 */ "NULL",
- /* 121 */ "PRIMARY",
- /* 122 */ "UNIQUE",
- /* 123 */ "CHECK",
- /* 124 */ "REFERENCES",
- /* 125 */ "AUTOINCR",
- /* 126 */ "INSERT",
- /* 127 */ "DELETE",
- /* 128 */ "UPDATE",
- /* 129 */ "SET",
- /* 130 */ "DEFERRABLE",
- /* 131 */ "FOREIGN",
- /* 132 */ "DROP",
- /* 133 */ "UNION",
- /* 134 */ "ALL",
- /* 135 */ "EXCEPT",
- /* 136 */ "INTERSECT",
- /* 137 */ "SELECT",
- /* 138 */ "VALUES",
- /* 139 */ "DISTINCT",
- /* 140 */ "DOT",
- /* 141 */ "FROM",
- /* 142 */ "JOIN",
- /* 143 */ "USING",
- /* 144 */ "ORDER",
- /* 145 */ "GROUP",
- /* 146 */ "HAVING",
- /* 147 */ "LIMIT",
- /* 148 */ "WHERE",
- /* 149 */ "RETURNING",
- /* 150 */ "INTO",
- /* 151 */ "NOTHING",
- /* 152 */ "FLOAT",
- /* 153 */ "BLOB",
- /* 154 */ "INTEGER",
- /* 155 */ "VARIABLE",
- /* 156 */ "CASE",
- /* 157 */ "WHEN",
- /* 158 */ "THEN",
- /* 159 */ "ELSE",
- /* 160 */ "INDEX",
- /* 161 */ "ALTER",
- /* 162 */ "ADD",
- /* 163 */ "WINDOW",
- /* 164 */ "OVER",
- /* 165 */ "FILTER",
- /* 166 */ "COLUMN",
- /* 167 */ "AGG_FUNCTION",
- /* 168 */ "AGG_COLUMN",
- /* 169 */ "TRUEFALSE",
- /* 170 */ "ISNOT",
- /* 171 */ "FUNCTION",
- /* 172 */ "UMINUS",
- /* 173 */ "UPLUS",
- /* 174 */ "TRUTH",
- /* 175 */ "REGISTER",
- /* 176 */ "VECTOR",
- /* 177 */ "SELECT_COLUMN",
- /* 178 */ "IF_NULL_ROW",
- /* 179 */ "ASTERISK",
- /* 180 */ "SPAN",
- /* 181 */ "ERROR",
- /* 182 */ "SPACE",
- /* 183 */ "ILLEGAL",
- /* 184 */ "input",
- /* 185 */ "cmdlist",
- /* 186 */ "ecmd",
- /* 187 */ "cmdx",
- /* 188 */ "explain",
- /* 189 */ "cmd",
- /* 190 */ "transtype",
- /* 191 */ "trans_opt",
- /* 192 */ "nm",
- /* 193 */ "savepoint_opt",
- /* 194 */ "create_table",
- /* 195 */ "create_table_args",
- /* 196 */ "createkw",
- /* 197 */ "temp",
- /* 198 */ "ifnotexists",
- /* 199 */ "dbnm",
- /* 200 */ "columnlist",
- /* 201 */ "conslist_opt",
- /* 202 */ "table_options",
- /* 203 */ "select",
- /* 204 */ "columnname",
- /* 205 */ "carglist",
- /* 206 */ "typetoken",
- /* 207 */ "typename",
- /* 208 */ "signed",
- /* 209 */ "plus_num",
- /* 210 */ "minus_num",
- /* 211 */ "scanpt",
- /* 212 */ "scantok",
- /* 213 */ "ccons",
- /* 214 */ "term",
- /* 215 */ "expr",
- /* 216 */ "onconf",
- /* 217 */ "sortorder",
- /* 218 */ "autoinc",
- /* 219 */ "eidlist_opt",
- /* 220 */ "refargs",
- /* 221 */ "defer_subclause",
- /* 222 */ "generated",
- /* 223 */ "refarg",
- /* 224 */ "refact",
- /* 225 */ "init_deferred_pred_opt",
- /* 226 */ "conslist",
- /* 227 */ "tconscomma",
- /* 228 */ "tcons",
- /* 229 */ "sortlist",
- /* 230 */ "eidlist",
- /* 231 */ "defer_subclause_opt",
- /* 232 */ "orconf",
- /* 233 */ "resolvetype",
- /* 234 */ "raisetype",
- /* 235 */ "ifexists",
- /* 236 */ "fullname",
- /* 237 */ "selectnowith",
- /* 238 */ "oneselect",
- /* 239 */ "wqlist",
- /* 240 */ "multiselect_op",
- /* 241 */ "distinct",
- /* 242 */ "selcollist",
- /* 243 */ "from",
- /* 244 */ "where_opt",
- /* 245 */ "groupby_opt",
- /* 246 */ "having_opt",
- /* 247 */ "orderby_opt",
- /* 248 */ "limit_opt",
- /* 249 */ "window_clause",
- /* 250 */ "values",
- /* 251 */ "nexprlist",
- /* 252 */ "sclp",
- /* 253 */ "as",
- /* 254 */ "seltablist",
- /* 255 */ "stl_prefix",
- /* 256 */ "joinop",
- /* 257 */ "indexed_opt",
- /* 258 */ "on_opt",
- /* 259 */ "using_opt",
- /* 260 */ "exprlist",
- /* 261 */ "xfullname",
- /* 262 */ "idlist",
- /* 263 */ "nulls",
- /* 264 */ "with",
- /* 265 */ "where_opt_ret",
- /* 266 */ "setlist",
- /* 267 */ "insert_cmd",
- /* 268 */ "idlist_opt",
- /* 269 */ "upsert",
- /* 270 */ "returning",
- /* 271 */ "filter_over",
- /* 272 */ "likeop",
- /* 273 */ "between_op",
- /* 274 */ "in_op",
- /* 275 */ "paren_exprlist",
- /* 276 */ "case_operand",
- /* 277 */ "case_exprlist",
- /* 278 */ "case_else",
- /* 279 */ "uniqueflag",
- /* 280 */ "collate",
- /* 281 */ "vinto",
- /* 282 */ "nmnum",
- /* 283 */ "trigger_decl",
- /* 284 */ "trigger_cmd_list",
- /* 285 */ "trigger_time",
- /* 286 */ "trigger_event",
- /* 287 */ "foreach_clause",
- /* 288 */ "when_clause",
- /* 289 */ "trigger_cmd",
- /* 290 */ "trnm",
- /* 291 */ "tridxby",
- /* 292 */ "database_kw_opt",
- /* 293 */ "key_opt",
- /* 294 */ "add_column_fullname",
- /* 295 */ "kwcolumn_opt",
- /* 296 */ "create_vtab",
- /* 297 */ "vtabarglist",
- /* 298 */ "vtabarg",
- /* 299 */ "vtabargtoken",
- /* 300 */ "lp",
- /* 301 */ "anylist",
- /* 302 */ "wqitem",
- /* 303 */ "wqas",
- /* 304 */ "windowdefn_list",
- /* 305 */ "windowdefn",
- /* 306 */ "window",
- /* 307 */ "frame_opt",
- /* 308 */ "part_opt",
- /* 309 */ "filter_clause",
- /* 310 */ "over_clause",
- /* 311 */ "range_or_rows",
- /* 312 */ "frame_bound",
- /* 313 */ "frame_bound_s",
- /* 314 */ "frame_bound_e",
- /* 315 */ "frame_exclude_opt",
- /* 316 */ "frame_exclude",
+ /* 112 */ "PTR",
+ /* 113 */ "COLLATE",
+ /* 114 */ "BITNOT",
+ /* 115 */ "ON",
+ /* 116 */ "INDEXED",
+ /* 117 */ "STRING",
+ /* 118 */ "JOIN_KW",
+ /* 119 */ "CONSTRAINT",
+ /* 120 */ "DEFAULT",
+ /* 121 */ "NULL",
+ /* 122 */ "PRIMARY",
+ /* 123 */ "UNIQUE",
+ /* 124 */ "CHECK",
+ /* 125 */ "REFERENCES",
+ /* 126 */ "AUTOINCR",
+ /* 127 */ "INSERT",
+ /* 128 */ "DELETE",
+ /* 129 */ "UPDATE",
+ /* 130 */ "SET",
+ /* 131 */ "DEFERRABLE",
+ /* 132 */ "FOREIGN",
+ /* 133 */ "DROP",
+ /* 134 */ "UNION",
+ /* 135 */ "ALL",
+ /* 136 */ "EXCEPT",
+ /* 137 */ "INTERSECT",
+ /* 138 */ "SELECT",
+ /* 139 */ "VALUES",
+ /* 140 */ "DISTINCT",
+ /* 141 */ "DOT",
+ /* 142 */ "FROM",
+ /* 143 */ "JOIN",
+ /* 144 */ "USING",
+ /* 145 */ "ORDER",
+ /* 146 */ "GROUP",
+ /* 147 */ "HAVING",
+ /* 148 */ "LIMIT",
+ /* 149 */ "WHERE",
+ /* 150 */ "RETURNING",
+ /* 151 */ "INTO",
+ /* 152 */ "NOTHING",
+ /* 153 */ "FLOAT",
+ /* 154 */ "BLOB",
+ /* 155 */ "INTEGER",
+ /* 156 */ "VARIABLE",
+ /* 157 */ "CASE",
+ /* 158 */ "WHEN",
+ /* 159 */ "THEN",
+ /* 160 */ "ELSE",
+ /* 161 */ "INDEX",
+ /* 162 */ "ALTER",
+ /* 163 */ "ADD",
+ /* 164 */ "WINDOW",
+ /* 165 */ "OVER",
+ /* 166 */ "FILTER",
+ /* 167 */ "COLUMN",
+ /* 168 */ "AGG_FUNCTION",
+ /* 169 */ "AGG_COLUMN",
+ /* 170 */ "TRUEFALSE",
+ /* 171 */ "ISNOT",
+ /* 172 */ "FUNCTION",
+ /* 173 */ "UMINUS",
+ /* 174 */ "UPLUS",
+ /* 175 */ "TRUTH",
+ /* 176 */ "REGISTER",
+ /* 177 */ "VECTOR",
+ /* 178 */ "SELECT_COLUMN",
+ /* 179 */ "IF_NULL_ROW",
+ /* 180 */ "ASTERISK",
+ /* 181 */ "SPAN",
+ /* 182 */ "ERROR",
+ /* 183 */ "SPACE",
+ /* 184 */ "ILLEGAL",
+ /* 185 */ "input",
+ /* 186 */ "cmdlist",
+ /* 187 */ "ecmd",
+ /* 188 */ "cmdx",
+ /* 189 */ "explain",
+ /* 190 */ "cmd",
+ /* 191 */ "transtype",
+ /* 192 */ "trans_opt",
+ /* 193 */ "nm",
+ /* 194 */ "savepoint_opt",
+ /* 195 */ "create_table",
+ /* 196 */ "create_table_args",
+ /* 197 */ "createkw",
+ /* 198 */ "temp",
+ /* 199 */ "ifnotexists",
+ /* 200 */ "dbnm",
+ /* 201 */ "columnlist",
+ /* 202 */ "conslist_opt",
+ /* 203 */ "table_option_set",
+ /* 204 */ "select",
+ /* 205 */ "table_option",
+ /* 206 */ "columnname",
+ /* 207 */ "carglist",
+ /* 208 */ "typetoken",
+ /* 209 */ "typename",
+ /* 210 */ "signed",
+ /* 211 */ "plus_num",
+ /* 212 */ "minus_num",
+ /* 213 */ "scanpt",
+ /* 214 */ "scantok",
+ /* 215 */ "ccons",
+ /* 216 */ "term",
+ /* 217 */ "expr",
+ /* 218 */ "onconf",
+ /* 219 */ "sortorder",
+ /* 220 */ "autoinc",
+ /* 221 */ "eidlist_opt",
+ /* 222 */ "refargs",
+ /* 223 */ "defer_subclause",
+ /* 224 */ "generated",
+ /* 225 */ "refarg",
+ /* 226 */ "refact",
+ /* 227 */ "init_deferred_pred_opt",
+ /* 228 */ "conslist",
+ /* 229 */ "tconscomma",
+ /* 230 */ "tcons",
+ /* 231 */ "sortlist",
+ /* 232 */ "eidlist",
+ /* 233 */ "defer_subclause_opt",
+ /* 234 */ "orconf",
+ /* 235 */ "resolvetype",
+ /* 236 */ "raisetype",
+ /* 237 */ "ifexists",
+ /* 238 */ "fullname",
+ /* 239 */ "selectnowith",
+ /* 240 */ "oneselect",
+ /* 241 */ "wqlist",
+ /* 242 */ "multiselect_op",
+ /* 243 */ "distinct",
+ /* 244 */ "selcollist",
+ /* 245 */ "from",
+ /* 246 */ "where_opt",
+ /* 247 */ "groupby_opt",
+ /* 248 */ "having_opt",
+ /* 249 */ "orderby_opt",
+ /* 250 */ "limit_opt",
+ /* 251 */ "window_clause",
+ /* 252 */ "values",
+ /* 253 */ "nexprlist",
+ /* 254 */ "sclp",
+ /* 255 */ "as",
+ /* 256 */ "seltablist",
+ /* 257 */ "stl_prefix",
+ /* 258 */ "joinop",
+ /* 259 */ "on_using",
+ /* 260 */ "indexed_by",
+ /* 261 */ "exprlist",
+ /* 262 */ "xfullname",
+ /* 263 */ "idlist",
+ /* 264 */ "indexed_opt",
+ /* 265 */ "nulls",
+ /* 266 */ "with",
+ /* 267 */ "where_opt_ret",
+ /* 268 */ "setlist",
+ /* 269 */ "insert_cmd",
+ /* 270 */ "idlist_opt",
+ /* 271 */ "upsert",
+ /* 272 */ "returning",
+ /* 273 */ "filter_over",
+ /* 274 */ "likeop",
+ /* 275 */ "between_op",
+ /* 276 */ "in_op",
+ /* 277 */ "paren_exprlist",
+ /* 278 */ "case_operand",
+ /* 279 */ "case_exprlist",
+ /* 280 */ "case_else",
+ /* 281 */ "uniqueflag",
+ /* 282 */ "collate",
+ /* 283 */ "vinto",
+ /* 284 */ "nmnum",
+ /* 285 */ "trigger_decl",
+ /* 286 */ "trigger_cmd_list",
+ /* 287 */ "trigger_time",
+ /* 288 */ "trigger_event",
+ /* 289 */ "foreach_clause",
+ /* 290 */ "when_clause",
+ /* 291 */ "trigger_cmd",
+ /* 292 */ "trnm",
+ /* 293 */ "tridxby",
+ /* 294 */ "database_kw_opt",
+ /* 295 */ "key_opt",
+ /* 296 */ "add_column_fullname",
+ /* 297 */ "kwcolumn_opt",
+ /* 298 */ "create_vtab",
+ /* 299 */ "vtabarglist",
+ /* 300 */ "vtabarg",
+ /* 301 */ "vtabargtoken",
+ /* 302 */ "lp",
+ /* 303 */ "anylist",
+ /* 304 */ "wqitem",
+ /* 305 */ "wqas",
+ /* 306 */ "windowdefn_list",
+ /* 307 */ "windowdefn",
+ /* 308 */ "window",
+ /* 309 */ "frame_opt",
+ /* 310 */ "part_opt",
+ /* 311 */ "filter_clause",
+ /* 312 */ "over_clause",
+ /* 313 */ "range_or_rows",
+ /* 314 */ "frame_bound",
+ /* 315 */ "frame_bound_s",
+ /* 316 */ "frame_bound_e",
+ /* 317 */ "frame_exclude_opt",
+ /* 318 */ "frame_exclude",
};
#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
@@ -159813,385 +169555,390 @@ static const char *const yyRuleName[] = {
/* 16 */ "ifnotexists ::= IF NOT EXISTS",
/* 17 */ "temp ::= TEMP",
/* 18 */ "temp ::=",
- /* 19 */ "create_table_args ::= LP columnlist conslist_opt RP table_options",
+ /* 19 */ "create_table_args ::= LP columnlist conslist_opt RP table_option_set",
/* 20 */ "create_table_args ::= AS select",
- /* 21 */ "table_options ::=",
- /* 22 */ "table_options ::= WITHOUT nm",
- /* 23 */ "columnname ::= nm typetoken",
- /* 24 */ "typetoken ::=",
- /* 25 */ "typetoken ::= typename LP signed RP",
- /* 26 */ "typetoken ::= typename LP signed COMMA signed RP",
- /* 27 */ "typename ::= typename ID|STRING",
- /* 28 */ "scanpt ::=",
- /* 29 */ "scantok ::=",
- /* 30 */ "ccons ::= CONSTRAINT nm",
- /* 31 */ "ccons ::= DEFAULT scantok term",
- /* 32 */ "ccons ::= DEFAULT LP expr RP",
- /* 33 */ "ccons ::= DEFAULT PLUS scantok term",
- /* 34 */ "ccons ::= DEFAULT MINUS scantok term",
- /* 35 */ "ccons ::= DEFAULT scantok ID|INDEXED",
- /* 36 */ "ccons ::= NOT NULL onconf",
- /* 37 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
- /* 38 */ "ccons ::= UNIQUE onconf",
- /* 39 */ "ccons ::= CHECK LP expr RP",
- /* 40 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
- /* 41 */ "ccons ::= defer_subclause",
- /* 42 */ "ccons ::= COLLATE ID|STRING",
- /* 43 */ "generated ::= LP expr RP",
- /* 44 */ "generated ::= LP expr RP ID",
- /* 45 */ "autoinc ::=",
- /* 46 */ "autoinc ::= AUTOINCR",
- /* 47 */ "refargs ::=",
- /* 48 */ "refargs ::= refargs refarg",
- /* 49 */ "refarg ::= MATCH nm",
- /* 50 */ "refarg ::= ON INSERT refact",
- /* 51 */ "refarg ::= ON DELETE refact",
- /* 52 */ "refarg ::= ON UPDATE refact",
- /* 53 */ "refact ::= SET NULL",
- /* 54 */ "refact ::= SET DEFAULT",
- /* 55 */ "refact ::= CASCADE",
- /* 56 */ "refact ::= RESTRICT",
- /* 57 */ "refact ::= NO ACTION",
- /* 58 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
- /* 59 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
- /* 60 */ "init_deferred_pred_opt ::=",
- /* 61 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
- /* 62 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
- /* 63 */ "conslist_opt ::=",
- /* 64 */ "tconscomma ::= COMMA",
- /* 65 */ "tcons ::= CONSTRAINT nm",
- /* 66 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
- /* 67 */ "tcons ::= UNIQUE LP sortlist RP onconf",
- /* 68 */ "tcons ::= CHECK LP expr RP onconf",
- /* 69 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
- /* 70 */ "defer_subclause_opt ::=",
- /* 71 */ "onconf ::=",
- /* 72 */ "onconf ::= ON CONFLICT resolvetype",
- /* 73 */ "orconf ::=",
- /* 74 */ "orconf ::= OR resolvetype",
- /* 75 */ "resolvetype ::= IGNORE",
- /* 76 */ "resolvetype ::= REPLACE",
- /* 77 */ "cmd ::= DROP TABLE ifexists fullname",
- /* 78 */ "ifexists ::= IF EXISTS",
- /* 79 */ "ifexists ::=",
- /* 80 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
- /* 81 */ "cmd ::= DROP VIEW ifexists fullname",
- /* 82 */ "cmd ::= select",
- /* 83 */ "select ::= WITH wqlist selectnowith",
- /* 84 */ "select ::= WITH RECURSIVE wqlist selectnowith",
- /* 85 */ "select ::= selectnowith",
- /* 86 */ "selectnowith ::= selectnowith multiselect_op oneselect",
- /* 87 */ "multiselect_op ::= UNION",
- /* 88 */ "multiselect_op ::= UNION ALL",
- /* 89 */ "multiselect_op ::= EXCEPT|INTERSECT",
- /* 90 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
- /* 91 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt",
- /* 92 */ "values ::= VALUES LP nexprlist RP",
- /* 93 */ "values ::= values COMMA LP nexprlist RP",
- /* 94 */ "distinct ::= DISTINCT",
- /* 95 */ "distinct ::= ALL",
- /* 96 */ "distinct ::=",
- /* 97 */ "sclp ::=",
- /* 98 */ "selcollist ::= sclp scanpt expr scanpt as",
- /* 99 */ "selcollist ::= sclp scanpt STAR",
- /* 100 */ "selcollist ::= sclp scanpt nm DOT STAR",
- /* 101 */ "as ::= AS nm",
- /* 102 */ "as ::=",
- /* 103 */ "from ::=",
- /* 104 */ "from ::= FROM seltablist",
- /* 105 */ "stl_prefix ::= seltablist joinop",
- /* 106 */ "stl_prefix ::=",
- /* 107 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
- /* 108 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt",
- /* 109 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
- /* 110 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
- /* 111 */ "dbnm ::=",
- /* 112 */ "dbnm ::= DOT nm",
- /* 113 */ "fullname ::= nm",
- /* 114 */ "fullname ::= nm DOT nm",
- /* 115 */ "xfullname ::= nm",
- /* 116 */ "xfullname ::= nm DOT nm",
- /* 117 */ "xfullname ::= nm DOT nm AS nm",
- /* 118 */ "xfullname ::= nm AS nm",
- /* 119 */ "joinop ::= COMMA|JOIN",
- /* 120 */ "joinop ::= JOIN_KW JOIN",
- /* 121 */ "joinop ::= JOIN_KW nm JOIN",
- /* 122 */ "joinop ::= JOIN_KW nm nm JOIN",
- /* 123 */ "on_opt ::= ON expr",
- /* 124 */ "on_opt ::=",
- /* 125 */ "indexed_opt ::=",
- /* 126 */ "indexed_opt ::= INDEXED BY nm",
- /* 127 */ "indexed_opt ::= NOT INDEXED",
- /* 128 */ "using_opt ::= USING LP idlist RP",
- /* 129 */ "using_opt ::=",
- /* 130 */ "orderby_opt ::=",
- /* 131 */ "orderby_opt ::= ORDER BY sortlist",
- /* 132 */ "sortlist ::= sortlist COMMA expr sortorder nulls",
- /* 133 */ "sortlist ::= expr sortorder nulls",
- /* 134 */ "sortorder ::= ASC",
- /* 135 */ "sortorder ::= DESC",
- /* 136 */ "sortorder ::=",
- /* 137 */ "nulls ::= NULLS FIRST",
- /* 138 */ "nulls ::= NULLS LAST",
- /* 139 */ "nulls ::=",
- /* 140 */ "groupby_opt ::=",
- /* 141 */ "groupby_opt ::= GROUP BY nexprlist",
- /* 142 */ "having_opt ::=",
- /* 143 */ "having_opt ::= HAVING expr",
- /* 144 */ "limit_opt ::=",
- /* 145 */ "limit_opt ::= LIMIT expr",
- /* 146 */ "limit_opt ::= LIMIT expr OFFSET expr",
- /* 147 */ "limit_opt ::= LIMIT expr COMMA expr",
- /* 148 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret",
- /* 149 */ "where_opt ::=",
- /* 150 */ "where_opt ::= WHERE expr",
- /* 151 */ "where_opt_ret ::=",
- /* 152 */ "where_opt_ret ::= WHERE expr",
- /* 153 */ "where_opt_ret ::= RETURNING selcollist",
- /* 154 */ "where_opt_ret ::= WHERE expr RETURNING selcollist",
- /* 155 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret",
- /* 156 */ "setlist ::= setlist COMMA nm EQ expr",
- /* 157 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
- /* 158 */ "setlist ::= nm EQ expr",
- /* 159 */ "setlist ::= LP idlist RP EQ expr",
- /* 160 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert",
- /* 161 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning",
- /* 162 */ "upsert ::=",
- /* 163 */ "upsert ::= RETURNING selcollist",
- /* 164 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert",
- /* 165 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert",
- /* 166 */ "upsert ::= ON CONFLICT DO NOTHING returning",
- /* 167 */ "upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning",
- /* 168 */ "returning ::= RETURNING selcollist",
- /* 169 */ "insert_cmd ::= INSERT orconf",
- /* 170 */ "insert_cmd ::= REPLACE",
- /* 171 */ "idlist_opt ::=",
- /* 172 */ "idlist_opt ::= LP idlist RP",
- /* 173 */ "idlist ::= idlist COMMA nm",
- /* 174 */ "idlist ::= nm",
- /* 175 */ "expr ::= LP expr RP",
- /* 176 */ "expr ::= ID|INDEXED",
- /* 177 */ "expr ::= JOIN_KW",
- /* 178 */ "expr ::= nm DOT nm",
- /* 179 */ "expr ::= nm DOT nm DOT nm",
- /* 180 */ "term ::= NULL|FLOAT|BLOB",
- /* 181 */ "term ::= STRING",
- /* 182 */ "term ::= INTEGER",
- /* 183 */ "expr ::= VARIABLE",
- /* 184 */ "expr ::= expr COLLATE ID|STRING",
- /* 185 */ "expr ::= CAST LP expr AS typetoken RP",
- /* 186 */ "expr ::= ID|INDEXED LP distinct exprlist RP",
- /* 187 */ "expr ::= ID|INDEXED LP STAR RP",
- /* 188 */ "expr ::= ID|INDEXED LP distinct exprlist RP filter_over",
- /* 189 */ "expr ::= ID|INDEXED LP STAR RP filter_over",
- /* 190 */ "term ::= CTIME_KW",
- /* 191 */ "expr ::= LP nexprlist COMMA expr RP",
- /* 192 */ "expr ::= expr AND expr",
- /* 193 */ "expr ::= expr OR expr",
- /* 194 */ "expr ::= expr LT|GT|GE|LE expr",
- /* 195 */ "expr ::= expr EQ|NE expr",
- /* 196 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
- /* 197 */ "expr ::= expr PLUS|MINUS expr",
- /* 198 */ "expr ::= expr STAR|SLASH|REM expr",
- /* 199 */ "expr ::= expr CONCAT expr",
- /* 200 */ "likeop ::= NOT LIKE_KW|MATCH",
- /* 201 */ "expr ::= expr likeop expr",
- /* 202 */ "expr ::= expr likeop expr ESCAPE expr",
- /* 203 */ "expr ::= expr ISNULL|NOTNULL",
- /* 204 */ "expr ::= expr NOT NULL",
- /* 205 */ "expr ::= expr IS expr",
- /* 206 */ "expr ::= expr IS NOT expr",
- /* 207 */ "expr ::= NOT expr",
- /* 208 */ "expr ::= BITNOT expr",
- /* 209 */ "expr ::= PLUS|MINUS expr",
- /* 210 */ "between_op ::= BETWEEN",
- /* 211 */ "between_op ::= NOT BETWEEN",
- /* 212 */ "expr ::= expr between_op expr AND expr",
- /* 213 */ "in_op ::= IN",
- /* 214 */ "in_op ::= NOT IN",
- /* 215 */ "expr ::= expr in_op LP exprlist RP",
- /* 216 */ "expr ::= LP select RP",
- /* 217 */ "expr ::= expr in_op LP select RP",
- /* 218 */ "expr ::= expr in_op nm dbnm paren_exprlist",
- /* 219 */ "expr ::= EXISTS LP select RP",
- /* 220 */ "expr ::= CASE case_operand case_exprlist case_else END",
- /* 221 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
- /* 222 */ "case_exprlist ::= WHEN expr THEN expr",
- /* 223 */ "case_else ::= ELSE expr",
- /* 224 */ "case_else ::=",
- /* 225 */ "case_operand ::= expr",
- /* 226 */ "case_operand ::=",
- /* 227 */ "exprlist ::=",
- /* 228 */ "nexprlist ::= nexprlist COMMA expr",
- /* 229 */ "nexprlist ::= expr",
- /* 230 */ "paren_exprlist ::=",
- /* 231 */ "paren_exprlist ::= LP exprlist RP",
- /* 232 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
- /* 233 */ "uniqueflag ::= UNIQUE",
- /* 234 */ "uniqueflag ::=",
- /* 235 */ "eidlist_opt ::=",
- /* 236 */ "eidlist_opt ::= LP eidlist RP",
- /* 237 */ "eidlist ::= eidlist COMMA nm collate sortorder",
- /* 238 */ "eidlist ::= nm collate sortorder",
- /* 239 */ "collate ::=",
- /* 240 */ "collate ::= COLLATE ID|STRING",
- /* 241 */ "cmd ::= DROP INDEX ifexists fullname",
- /* 242 */ "cmd ::= VACUUM vinto",
- /* 243 */ "cmd ::= VACUUM nm vinto",
- /* 244 */ "vinto ::= INTO expr",
- /* 245 */ "vinto ::=",
- /* 246 */ "cmd ::= PRAGMA nm dbnm",
- /* 247 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
- /* 248 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
- /* 249 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
- /* 250 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
- /* 251 */ "plus_num ::= PLUS INTEGER|FLOAT",
- /* 252 */ "minus_num ::= MINUS INTEGER|FLOAT",
- /* 253 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
- /* 254 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
- /* 255 */ "trigger_time ::= BEFORE|AFTER",
- /* 256 */ "trigger_time ::= INSTEAD OF",
- /* 257 */ "trigger_time ::=",
- /* 258 */ "trigger_event ::= DELETE|INSERT",
- /* 259 */ "trigger_event ::= UPDATE",
- /* 260 */ "trigger_event ::= UPDATE OF idlist",
- /* 261 */ "when_clause ::=",
- /* 262 */ "when_clause ::= WHEN expr",
- /* 263 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
- /* 264 */ "trigger_cmd_list ::= trigger_cmd SEMI",
- /* 265 */ "trnm ::= nm DOT nm",
- /* 266 */ "tridxby ::= INDEXED BY nm",
- /* 267 */ "tridxby ::= NOT INDEXED",
- /* 268 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt",
- /* 269 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt",
- /* 270 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt",
- /* 271 */ "trigger_cmd ::= scanpt select scanpt",
- /* 272 */ "expr ::= RAISE LP IGNORE RP",
- /* 273 */ "expr ::= RAISE LP raisetype COMMA nm RP",
- /* 274 */ "raisetype ::= ROLLBACK",
- /* 275 */ "raisetype ::= ABORT",
- /* 276 */ "raisetype ::= FAIL",
- /* 277 */ "cmd ::= DROP TRIGGER ifexists fullname",
- /* 278 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
- /* 279 */ "cmd ::= DETACH database_kw_opt expr",
- /* 280 */ "key_opt ::=",
- /* 281 */ "key_opt ::= KEY expr",
- /* 282 */ "cmd ::= REINDEX",
- /* 283 */ "cmd ::= REINDEX nm dbnm",
- /* 284 */ "cmd ::= ANALYZE",
- /* 285 */ "cmd ::= ANALYZE nm dbnm",
- /* 286 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
- /* 287 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
- /* 288 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm",
- /* 289 */ "add_column_fullname ::= fullname",
- /* 290 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm",
- /* 291 */ "cmd ::= create_vtab",
- /* 292 */ "cmd ::= create_vtab LP vtabarglist RP",
- /* 293 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
- /* 294 */ "vtabarg ::=",
- /* 295 */ "vtabargtoken ::= ANY",
- /* 296 */ "vtabargtoken ::= lp anylist RP",
- /* 297 */ "lp ::= LP",
- /* 298 */ "with ::= WITH wqlist",
- /* 299 */ "with ::= WITH RECURSIVE wqlist",
- /* 300 */ "wqas ::= AS",
- /* 301 */ "wqas ::= AS MATERIALIZED",
- /* 302 */ "wqas ::= AS NOT MATERIALIZED",
- /* 303 */ "wqitem ::= nm eidlist_opt wqas LP select RP",
- /* 304 */ "wqlist ::= wqitem",
- /* 305 */ "wqlist ::= wqlist COMMA wqitem",
- /* 306 */ "windowdefn_list ::= windowdefn",
- /* 307 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn",
- /* 308 */ "windowdefn ::= nm AS LP window RP",
- /* 309 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt",
- /* 310 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt",
- /* 311 */ "window ::= ORDER BY sortlist frame_opt",
- /* 312 */ "window ::= nm ORDER BY sortlist frame_opt",
- /* 313 */ "window ::= frame_opt",
- /* 314 */ "window ::= nm frame_opt",
- /* 315 */ "frame_opt ::=",
- /* 316 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt",
- /* 317 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt",
- /* 318 */ "range_or_rows ::= RANGE|ROWS|GROUPS",
- /* 319 */ "frame_bound_s ::= frame_bound",
- /* 320 */ "frame_bound_s ::= UNBOUNDED PRECEDING",
- /* 321 */ "frame_bound_e ::= frame_bound",
- /* 322 */ "frame_bound_e ::= UNBOUNDED FOLLOWING",
- /* 323 */ "frame_bound ::= expr PRECEDING|FOLLOWING",
- /* 324 */ "frame_bound ::= CURRENT ROW",
- /* 325 */ "frame_exclude_opt ::=",
- /* 326 */ "frame_exclude_opt ::= EXCLUDE frame_exclude",
- /* 327 */ "frame_exclude ::= NO OTHERS",
- /* 328 */ "frame_exclude ::= CURRENT ROW",
- /* 329 */ "frame_exclude ::= GROUP|TIES",
- /* 330 */ "window_clause ::= WINDOW windowdefn_list",
- /* 331 */ "filter_over ::= filter_clause over_clause",
- /* 332 */ "filter_over ::= over_clause",
- /* 333 */ "filter_over ::= filter_clause",
- /* 334 */ "over_clause ::= OVER LP window RP",
- /* 335 */ "over_clause ::= OVER nm",
- /* 336 */ "filter_clause ::= FILTER LP WHERE expr RP",
- /* 337 */ "input ::= cmdlist",
- /* 338 */ "cmdlist ::= cmdlist ecmd",
- /* 339 */ "cmdlist ::= ecmd",
- /* 340 */ "ecmd ::= SEMI",
- /* 341 */ "ecmd ::= cmdx SEMI",
- /* 342 */ "ecmd ::= explain cmdx SEMI",
- /* 343 */ "trans_opt ::=",
- /* 344 */ "trans_opt ::= TRANSACTION",
- /* 345 */ "trans_opt ::= TRANSACTION nm",
- /* 346 */ "savepoint_opt ::= SAVEPOINT",
- /* 347 */ "savepoint_opt ::=",
- /* 348 */ "cmd ::= create_table create_table_args",
- /* 349 */ "columnlist ::= columnlist COMMA columnname carglist",
- /* 350 */ "columnlist ::= columnname carglist",
- /* 351 */ "nm ::= ID|INDEXED",
- /* 352 */ "nm ::= STRING",
- /* 353 */ "nm ::= JOIN_KW",
- /* 354 */ "typetoken ::= typename",
- /* 355 */ "typename ::= ID|STRING",
- /* 356 */ "signed ::= plus_num",
- /* 357 */ "signed ::= minus_num",
- /* 358 */ "carglist ::= carglist ccons",
- /* 359 */ "carglist ::=",
- /* 360 */ "ccons ::= NULL onconf",
- /* 361 */ "ccons ::= GENERATED ALWAYS AS generated",
- /* 362 */ "ccons ::= AS generated",
- /* 363 */ "conslist_opt ::= COMMA conslist",
- /* 364 */ "conslist ::= conslist tconscomma tcons",
- /* 365 */ "conslist ::= tcons",
- /* 366 */ "tconscomma ::=",
- /* 367 */ "defer_subclause_opt ::= defer_subclause",
- /* 368 */ "resolvetype ::= raisetype",
- /* 369 */ "selectnowith ::= oneselect",
- /* 370 */ "oneselect ::= values",
- /* 371 */ "sclp ::= selcollist COMMA",
- /* 372 */ "as ::= ID|STRING",
- /* 373 */ "returning ::=",
- /* 374 */ "expr ::= term",
- /* 375 */ "likeop ::= LIKE_KW|MATCH",
- /* 376 */ "exprlist ::= nexprlist",
- /* 377 */ "nmnum ::= plus_num",
- /* 378 */ "nmnum ::= nm",
- /* 379 */ "nmnum ::= ON",
- /* 380 */ "nmnum ::= DELETE",
- /* 381 */ "nmnum ::= DEFAULT",
- /* 382 */ "plus_num ::= INTEGER|FLOAT",
- /* 383 */ "foreach_clause ::=",
- /* 384 */ "foreach_clause ::= FOR EACH ROW",
- /* 385 */ "trnm ::= nm",
- /* 386 */ "tridxby ::=",
- /* 387 */ "database_kw_opt ::= DATABASE",
- /* 388 */ "database_kw_opt ::=",
- /* 389 */ "kwcolumn_opt ::=",
- /* 390 */ "kwcolumn_opt ::= COLUMNKW",
- /* 391 */ "vtabarglist ::= vtabarg",
- /* 392 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
- /* 393 */ "vtabarg ::= vtabarg vtabargtoken",
- /* 394 */ "anylist ::=",
- /* 395 */ "anylist ::= anylist LP anylist RP",
- /* 396 */ "anylist ::= anylist ANY",
- /* 397 */ "with ::=",
+ /* 21 */ "table_option_set ::=",
+ /* 22 */ "table_option_set ::= table_option_set COMMA table_option",
+ /* 23 */ "table_option ::= WITHOUT nm",
+ /* 24 */ "table_option ::= nm",
+ /* 25 */ "columnname ::= nm typetoken",
+ /* 26 */ "typetoken ::=",
+ /* 27 */ "typetoken ::= typename LP signed RP",
+ /* 28 */ "typetoken ::= typename LP signed COMMA signed RP",
+ /* 29 */ "typename ::= typename ID|STRING",
+ /* 30 */ "scanpt ::=",
+ /* 31 */ "scantok ::=",
+ /* 32 */ "ccons ::= CONSTRAINT nm",
+ /* 33 */ "ccons ::= DEFAULT scantok term",
+ /* 34 */ "ccons ::= DEFAULT LP expr RP",
+ /* 35 */ "ccons ::= DEFAULT PLUS scantok term",
+ /* 36 */ "ccons ::= DEFAULT MINUS scantok term",
+ /* 37 */ "ccons ::= DEFAULT scantok ID|INDEXED",
+ /* 38 */ "ccons ::= NOT NULL onconf",
+ /* 39 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
+ /* 40 */ "ccons ::= UNIQUE onconf",
+ /* 41 */ "ccons ::= CHECK LP expr RP",
+ /* 42 */ "ccons ::= REFERENCES nm eidlist_opt refargs",
+ /* 43 */ "ccons ::= defer_subclause",
+ /* 44 */ "ccons ::= COLLATE ID|STRING",
+ /* 45 */ "generated ::= LP expr RP",
+ /* 46 */ "generated ::= LP expr RP ID",
+ /* 47 */ "autoinc ::=",
+ /* 48 */ "autoinc ::= AUTOINCR",
+ /* 49 */ "refargs ::=",
+ /* 50 */ "refargs ::= refargs refarg",
+ /* 51 */ "refarg ::= MATCH nm",
+ /* 52 */ "refarg ::= ON INSERT refact",
+ /* 53 */ "refarg ::= ON DELETE refact",
+ /* 54 */ "refarg ::= ON UPDATE refact",
+ /* 55 */ "refact ::= SET NULL",
+ /* 56 */ "refact ::= SET DEFAULT",
+ /* 57 */ "refact ::= CASCADE",
+ /* 58 */ "refact ::= RESTRICT",
+ /* 59 */ "refact ::= NO ACTION",
+ /* 60 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
+ /* 61 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
+ /* 62 */ "init_deferred_pred_opt ::=",
+ /* 63 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
+ /* 64 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
+ /* 65 */ "conslist_opt ::=",
+ /* 66 */ "tconscomma ::= COMMA",
+ /* 67 */ "tcons ::= CONSTRAINT nm",
+ /* 68 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf",
+ /* 69 */ "tcons ::= UNIQUE LP sortlist RP onconf",
+ /* 70 */ "tcons ::= CHECK LP expr RP onconf",
+ /* 71 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt",
+ /* 72 */ "defer_subclause_opt ::=",
+ /* 73 */ "onconf ::=",
+ /* 74 */ "onconf ::= ON CONFLICT resolvetype",
+ /* 75 */ "orconf ::=",
+ /* 76 */ "orconf ::= OR resolvetype",
+ /* 77 */ "resolvetype ::= IGNORE",
+ /* 78 */ "resolvetype ::= REPLACE",
+ /* 79 */ "cmd ::= DROP TABLE ifexists fullname",
+ /* 80 */ "ifexists ::= IF EXISTS",
+ /* 81 */ "ifexists ::=",
+ /* 82 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select",
+ /* 83 */ "cmd ::= DROP VIEW ifexists fullname",
+ /* 84 */ "cmd ::= select",
+ /* 85 */ "select ::= WITH wqlist selectnowith",
+ /* 86 */ "select ::= WITH RECURSIVE wqlist selectnowith",
+ /* 87 */ "select ::= selectnowith",
+ /* 88 */ "selectnowith ::= selectnowith multiselect_op oneselect",
+ /* 89 */ "multiselect_op ::= UNION",
+ /* 90 */ "multiselect_op ::= UNION ALL",
+ /* 91 */ "multiselect_op ::= EXCEPT|INTERSECT",
+ /* 92 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
+ /* 93 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt",
+ /* 94 */ "values ::= VALUES LP nexprlist RP",
+ /* 95 */ "values ::= values COMMA LP nexprlist RP",
+ /* 96 */ "distinct ::= DISTINCT",
+ /* 97 */ "distinct ::= ALL",
+ /* 98 */ "distinct ::=",
+ /* 99 */ "sclp ::=",
+ /* 100 */ "selcollist ::= sclp scanpt expr scanpt as",
+ /* 101 */ "selcollist ::= sclp scanpt STAR",
+ /* 102 */ "selcollist ::= sclp scanpt nm DOT STAR",
+ /* 103 */ "as ::= AS nm",
+ /* 104 */ "as ::=",
+ /* 105 */ "from ::=",
+ /* 106 */ "from ::= FROM seltablist",
+ /* 107 */ "stl_prefix ::= seltablist joinop",
+ /* 108 */ "stl_prefix ::=",
+ /* 109 */ "seltablist ::= stl_prefix nm dbnm as on_using",
+ /* 110 */ "seltablist ::= stl_prefix nm dbnm as indexed_by on_using",
+ /* 111 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using",
+ /* 112 */ "seltablist ::= stl_prefix LP select RP as on_using",
+ /* 113 */ "seltablist ::= stl_prefix LP seltablist RP as on_using",
+ /* 114 */ "dbnm ::=",
+ /* 115 */ "dbnm ::= DOT nm",
+ /* 116 */ "fullname ::= nm",
+ /* 117 */ "fullname ::= nm DOT nm",
+ /* 118 */ "xfullname ::= nm",
+ /* 119 */ "xfullname ::= nm DOT nm",
+ /* 120 */ "xfullname ::= nm DOT nm AS nm",
+ /* 121 */ "xfullname ::= nm AS nm",
+ /* 122 */ "joinop ::= COMMA|JOIN",
+ /* 123 */ "joinop ::= JOIN_KW JOIN",
+ /* 124 */ "joinop ::= JOIN_KW nm JOIN",
+ /* 125 */ "joinop ::= JOIN_KW nm nm JOIN",
+ /* 126 */ "on_using ::= ON expr",
+ /* 127 */ "on_using ::= USING LP idlist RP",
+ /* 128 */ "on_using ::=",
+ /* 129 */ "indexed_opt ::=",
+ /* 130 */ "indexed_by ::= INDEXED BY nm",
+ /* 131 */ "indexed_by ::= NOT INDEXED",
+ /* 132 */ "orderby_opt ::=",
+ /* 133 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 134 */ "sortlist ::= sortlist COMMA expr sortorder nulls",
+ /* 135 */ "sortlist ::= expr sortorder nulls",
+ /* 136 */ "sortorder ::= ASC",
+ /* 137 */ "sortorder ::= DESC",
+ /* 138 */ "sortorder ::=",
+ /* 139 */ "nulls ::= NULLS FIRST",
+ /* 140 */ "nulls ::= NULLS LAST",
+ /* 141 */ "nulls ::=",
+ /* 142 */ "groupby_opt ::=",
+ /* 143 */ "groupby_opt ::= GROUP BY nexprlist",
+ /* 144 */ "having_opt ::=",
+ /* 145 */ "having_opt ::= HAVING expr",
+ /* 146 */ "limit_opt ::=",
+ /* 147 */ "limit_opt ::= LIMIT expr",
+ /* 148 */ "limit_opt ::= LIMIT expr OFFSET expr",
+ /* 149 */ "limit_opt ::= LIMIT expr COMMA expr",
+ /* 150 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret",
+ /* 151 */ "where_opt ::=",
+ /* 152 */ "where_opt ::= WHERE expr",
+ /* 153 */ "where_opt_ret ::=",
+ /* 154 */ "where_opt_ret ::= WHERE expr",
+ /* 155 */ "where_opt_ret ::= RETURNING selcollist",
+ /* 156 */ "where_opt_ret ::= WHERE expr RETURNING selcollist",
+ /* 157 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret",
+ /* 158 */ "setlist ::= setlist COMMA nm EQ expr",
+ /* 159 */ "setlist ::= setlist COMMA LP idlist RP EQ expr",
+ /* 160 */ "setlist ::= nm EQ expr",
+ /* 161 */ "setlist ::= LP idlist RP EQ expr",
+ /* 162 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert",
+ /* 163 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning",
+ /* 164 */ "upsert ::=",
+ /* 165 */ "upsert ::= RETURNING selcollist",
+ /* 166 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert",
+ /* 167 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert",
+ /* 168 */ "upsert ::= ON CONFLICT DO NOTHING returning",
+ /* 169 */ "upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning",
+ /* 170 */ "returning ::= RETURNING selcollist",
+ /* 171 */ "insert_cmd ::= INSERT orconf",
+ /* 172 */ "insert_cmd ::= REPLACE",
+ /* 173 */ "idlist_opt ::=",
+ /* 174 */ "idlist_opt ::= LP idlist RP",
+ /* 175 */ "idlist ::= idlist COMMA nm",
+ /* 176 */ "idlist ::= nm",
+ /* 177 */ "expr ::= LP expr RP",
+ /* 178 */ "expr ::= ID|INDEXED|JOIN_KW",
+ /* 179 */ "expr ::= nm DOT nm",
+ /* 180 */ "expr ::= nm DOT nm DOT nm",
+ /* 181 */ "term ::= NULL|FLOAT|BLOB",
+ /* 182 */ "term ::= STRING",
+ /* 183 */ "term ::= INTEGER",
+ /* 184 */ "expr ::= VARIABLE",
+ /* 185 */ "expr ::= expr COLLATE ID|STRING",
+ /* 186 */ "expr ::= CAST LP expr AS typetoken RP",
+ /* 187 */ "expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP",
+ /* 188 */ "expr ::= ID|INDEXED|JOIN_KW LP STAR RP",
+ /* 189 */ "expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over",
+ /* 190 */ "expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over",
+ /* 191 */ "term ::= CTIME_KW",
+ /* 192 */ "expr ::= LP nexprlist COMMA expr RP",
+ /* 193 */ "expr ::= expr AND expr",
+ /* 194 */ "expr ::= expr OR expr",
+ /* 195 */ "expr ::= expr LT|GT|GE|LE expr",
+ /* 196 */ "expr ::= expr EQ|NE expr",
+ /* 197 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
+ /* 198 */ "expr ::= expr PLUS|MINUS expr",
+ /* 199 */ "expr ::= expr STAR|SLASH|REM expr",
+ /* 200 */ "expr ::= expr CONCAT expr",
+ /* 201 */ "likeop ::= NOT LIKE_KW|MATCH",
+ /* 202 */ "expr ::= expr likeop expr",
+ /* 203 */ "expr ::= expr likeop expr ESCAPE expr",
+ /* 204 */ "expr ::= expr ISNULL|NOTNULL",
+ /* 205 */ "expr ::= expr NOT NULL",
+ /* 206 */ "expr ::= expr IS expr",
+ /* 207 */ "expr ::= expr IS NOT expr",
+ /* 208 */ "expr ::= expr IS NOT DISTINCT FROM expr",
+ /* 209 */ "expr ::= expr IS DISTINCT FROM expr",
+ /* 210 */ "expr ::= NOT expr",
+ /* 211 */ "expr ::= BITNOT expr",
+ /* 212 */ "expr ::= PLUS|MINUS expr",
+ /* 213 */ "expr ::= expr PTR expr",
+ /* 214 */ "between_op ::= BETWEEN",
+ /* 215 */ "between_op ::= NOT BETWEEN",
+ /* 216 */ "expr ::= expr between_op expr AND expr",
+ /* 217 */ "in_op ::= IN",
+ /* 218 */ "in_op ::= NOT IN",
+ /* 219 */ "expr ::= expr in_op LP exprlist RP",
+ /* 220 */ "expr ::= LP select RP",
+ /* 221 */ "expr ::= expr in_op LP select RP",
+ /* 222 */ "expr ::= expr in_op nm dbnm paren_exprlist",
+ /* 223 */ "expr ::= EXISTS LP select RP",
+ /* 224 */ "expr ::= CASE case_operand case_exprlist case_else END",
+ /* 225 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
+ /* 226 */ "case_exprlist ::= WHEN expr THEN expr",
+ /* 227 */ "case_else ::= ELSE expr",
+ /* 228 */ "case_else ::=",
+ /* 229 */ "case_operand ::=",
+ /* 230 */ "exprlist ::=",
+ /* 231 */ "nexprlist ::= nexprlist COMMA expr",
+ /* 232 */ "nexprlist ::= expr",
+ /* 233 */ "paren_exprlist ::=",
+ /* 234 */ "paren_exprlist ::= LP exprlist RP",
+ /* 235 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt",
+ /* 236 */ "uniqueflag ::= UNIQUE",
+ /* 237 */ "uniqueflag ::=",
+ /* 238 */ "eidlist_opt ::=",
+ /* 239 */ "eidlist_opt ::= LP eidlist RP",
+ /* 240 */ "eidlist ::= eidlist COMMA nm collate sortorder",
+ /* 241 */ "eidlist ::= nm collate sortorder",
+ /* 242 */ "collate ::=",
+ /* 243 */ "collate ::= COLLATE ID|STRING",
+ /* 244 */ "cmd ::= DROP INDEX ifexists fullname",
+ /* 245 */ "cmd ::= VACUUM vinto",
+ /* 246 */ "cmd ::= VACUUM nm vinto",
+ /* 247 */ "vinto ::= INTO expr",
+ /* 248 */ "vinto ::=",
+ /* 249 */ "cmd ::= PRAGMA nm dbnm",
+ /* 250 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
+ /* 251 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
+ /* 252 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
+ /* 253 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
+ /* 254 */ "plus_num ::= PLUS INTEGER|FLOAT",
+ /* 255 */ "minus_num ::= MINUS INTEGER|FLOAT",
+ /* 256 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
+ /* 257 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
+ /* 258 */ "trigger_time ::= BEFORE|AFTER",
+ /* 259 */ "trigger_time ::= INSTEAD OF",
+ /* 260 */ "trigger_time ::=",
+ /* 261 */ "trigger_event ::= DELETE|INSERT",
+ /* 262 */ "trigger_event ::= UPDATE",
+ /* 263 */ "trigger_event ::= UPDATE OF idlist",
+ /* 264 */ "when_clause ::=",
+ /* 265 */ "when_clause ::= WHEN expr",
+ /* 266 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
+ /* 267 */ "trigger_cmd_list ::= trigger_cmd SEMI",
+ /* 268 */ "trnm ::= nm DOT nm",
+ /* 269 */ "tridxby ::= INDEXED BY nm",
+ /* 270 */ "tridxby ::= NOT INDEXED",
+ /* 271 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt",
+ /* 272 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt",
+ /* 273 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt",
+ /* 274 */ "trigger_cmd ::= scanpt select scanpt",
+ /* 275 */ "expr ::= RAISE LP IGNORE RP",
+ /* 276 */ "expr ::= RAISE LP raisetype COMMA nm RP",
+ /* 277 */ "raisetype ::= ROLLBACK",
+ /* 278 */ "raisetype ::= ABORT",
+ /* 279 */ "raisetype ::= FAIL",
+ /* 280 */ "cmd ::= DROP TRIGGER ifexists fullname",
+ /* 281 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
+ /* 282 */ "cmd ::= DETACH database_kw_opt expr",
+ /* 283 */ "key_opt ::=",
+ /* 284 */ "key_opt ::= KEY expr",
+ /* 285 */ "cmd ::= REINDEX",
+ /* 286 */ "cmd ::= REINDEX nm dbnm",
+ /* 287 */ "cmd ::= ANALYZE",
+ /* 288 */ "cmd ::= ANALYZE nm dbnm",
+ /* 289 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
+ /* 290 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist",
+ /* 291 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm",
+ /* 292 */ "add_column_fullname ::= fullname",
+ /* 293 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm",
+ /* 294 */ "cmd ::= create_vtab",
+ /* 295 */ "cmd ::= create_vtab LP vtabarglist RP",
+ /* 296 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
+ /* 297 */ "vtabarg ::=",
+ /* 298 */ "vtabargtoken ::= ANY",
+ /* 299 */ "vtabargtoken ::= lp anylist RP",
+ /* 300 */ "lp ::= LP",
+ /* 301 */ "with ::= WITH wqlist",
+ /* 302 */ "with ::= WITH RECURSIVE wqlist",
+ /* 303 */ "wqas ::= AS",
+ /* 304 */ "wqas ::= AS MATERIALIZED",
+ /* 305 */ "wqas ::= AS NOT MATERIALIZED",
+ /* 306 */ "wqitem ::= nm eidlist_opt wqas LP select RP",
+ /* 307 */ "wqlist ::= wqitem",
+ /* 308 */ "wqlist ::= wqlist COMMA wqitem",
+ /* 309 */ "windowdefn_list ::= windowdefn",
+ /* 310 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn",
+ /* 311 */ "windowdefn ::= nm AS LP window RP",
+ /* 312 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt",
+ /* 313 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt",
+ /* 314 */ "window ::= ORDER BY sortlist frame_opt",
+ /* 315 */ "window ::= nm ORDER BY sortlist frame_opt",
+ /* 316 */ "window ::= frame_opt",
+ /* 317 */ "window ::= nm frame_opt",
+ /* 318 */ "frame_opt ::=",
+ /* 319 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt",
+ /* 320 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt",
+ /* 321 */ "range_or_rows ::= RANGE|ROWS|GROUPS",
+ /* 322 */ "frame_bound_s ::= frame_bound",
+ /* 323 */ "frame_bound_s ::= UNBOUNDED PRECEDING",
+ /* 324 */ "frame_bound_e ::= frame_bound",
+ /* 325 */ "frame_bound_e ::= UNBOUNDED FOLLOWING",
+ /* 326 */ "frame_bound ::= expr PRECEDING|FOLLOWING",
+ /* 327 */ "frame_bound ::= CURRENT ROW",
+ /* 328 */ "frame_exclude_opt ::=",
+ /* 329 */ "frame_exclude_opt ::= EXCLUDE frame_exclude",
+ /* 330 */ "frame_exclude ::= NO OTHERS",
+ /* 331 */ "frame_exclude ::= CURRENT ROW",
+ /* 332 */ "frame_exclude ::= GROUP|TIES",
+ /* 333 */ "window_clause ::= WINDOW windowdefn_list",
+ /* 334 */ "filter_over ::= filter_clause over_clause",
+ /* 335 */ "filter_over ::= over_clause",
+ /* 336 */ "filter_over ::= filter_clause",
+ /* 337 */ "over_clause ::= OVER LP window RP",
+ /* 338 */ "over_clause ::= OVER nm",
+ /* 339 */ "filter_clause ::= FILTER LP WHERE expr RP",
+ /* 340 */ "input ::= cmdlist",
+ /* 341 */ "cmdlist ::= cmdlist ecmd",
+ /* 342 */ "cmdlist ::= ecmd",
+ /* 343 */ "ecmd ::= SEMI",
+ /* 344 */ "ecmd ::= cmdx SEMI",
+ /* 345 */ "ecmd ::= explain cmdx SEMI",
+ /* 346 */ "trans_opt ::=",
+ /* 347 */ "trans_opt ::= TRANSACTION",
+ /* 348 */ "trans_opt ::= TRANSACTION nm",
+ /* 349 */ "savepoint_opt ::= SAVEPOINT",
+ /* 350 */ "savepoint_opt ::=",
+ /* 351 */ "cmd ::= create_table create_table_args",
+ /* 352 */ "table_option_set ::= table_option",
+ /* 353 */ "columnlist ::= columnlist COMMA columnname carglist",
+ /* 354 */ "columnlist ::= columnname carglist",
+ /* 355 */ "nm ::= ID|INDEXED|JOIN_KW",
+ /* 356 */ "nm ::= STRING",
+ /* 357 */ "typetoken ::= typename",
+ /* 358 */ "typename ::= ID|STRING",
+ /* 359 */ "signed ::= plus_num",
+ /* 360 */ "signed ::= minus_num",
+ /* 361 */ "carglist ::= carglist ccons",
+ /* 362 */ "carglist ::=",
+ /* 363 */ "ccons ::= NULL onconf",
+ /* 364 */ "ccons ::= GENERATED ALWAYS AS generated",
+ /* 365 */ "ccons ::= AS generated",
+ /* 366 */ "conslist_opt ::= COMMA conslist",
+ /* 367 */ "conslist ::= conslist tconscomma tcons",
+ /* 368 */ "conslist ::= tcons",
+ /* 369 */ "tconscomma ::=",
+ /* 370 */ "defer_subclause_opt ::= defer_subclause",
+ /* 371 */ "resolvetype ::= raisetype",
+ /* 372 */ "selectnowith ::= oneselect",
+ /* 373 */ "oneselect ::= values",
+ /* 374 */ "sclp ::= selcollist COMMA",
+ /* 375 */ "as ::= ID|STRING",
+ /* 376 */ "indexed_opt ::= indexed_by",
+ /* 377 */ "returning ::=",
+ /* 378 */ "expr ::= term",
+ /* 379 */ "likeop ::= LIKE_KW|MATCH",
+ /* 380 */ "case_operand ::= expr",
+ /* 381 */ "exprlist ::= nexprlist",
+ /* 382 */ "nmnum ::= plus_num",
+ /* 383 */ "nmnum ::= nm",
+ /* 384 */ "nmnum ::= ON",
+ /* 385 */ "nmnum ::= DELETE",
+ /* 386 */ "nmnum ::= DEFAULT",
+ /* 387 */ "plus_num ::= INTEGER|FLOAT",
+ /* 388 */ "foreach_clause ::=",
+ /* 389 */ "foreach_clause ::= FOR EACH ROW",
+ /* 390 */ "trnm ::= nm",
+ /* 391 */ "tridxby ::=",
+ /* 392 */ "database_kw_opt ::= DATABASE",
+ /* 393 */ "database_kw_opt ::=",
+ /* 394 */ "kwcolumn_opt ::=",
+ /* 395 */ "kwcolumn_opt ::= COLUMNKW",
+ /* 396 */ "vtabarglist ::= vtabarg",
+ /* 397 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
+ /* 398 */ "vtabarg ::= vtabarg vtabargtoken",
+ /* 399 */ "anylist ::=",
+ /* 400 */ "anylist ::= anylist LP anylist RP",
+ /* 401 */ "anylist ::= anylist ANY",
+ /* 402 */ "with ::=",
};
#endif /* NDEBUG */
@@ -160317,99 +170064,97 @@ static void yy_destructor(
** inside the C code.
*/
/********* Begin destructor definitions ***************************************/
- case 203: /* select */
- case 237: /* selectnowith */
- case 238: /* oneselect */
- case 250: /* values */
+ case 204: /* select */
+ case 239: /* selectnowith */
+ case 240: /* oneselect */
+ case 252: /* values */
{
-sqlite3SelectDelete(pParse->db, (yypminor->yy81));
-}
- break;
- case 214: /* term */
- case 215: /* expr */
- case 244: /* where_opt */
- case 246: /* having_opt */
- case 258: /* on_opt */
- case 265: /* where_opt_ret */
- case 276: /* case_operand */
- case 278: /* case_else */
- case 281: /* vinto */
- case 288: /* when_clause */
- case 293: /* key_opt */
- case 309: /* filter_clause */
+sqlite3SelectDelete(pParse->db, (yypminor->yy47));
+}
+ break;
+ case 216: /* term */
+ case 217: /* expr */
+ case 246: /* where_opt */
+ case 248: /* having_opt */
+ case 267: /* where_opt_ret */
+ case 278: /* case_operand */
+ case 280: /* case_else */
+ case 283: /* vinto */
+ case 290: /* when_clause */
+ case 295: /* key_opt */
+ case 311: /* filter_clause */
{
-sqlite3ExprDelete(pParse->db, (yypminor->yy404));
-}
- break;
- case 219: /* eidlist_opt */
- case 229: /* sortlist */
- case 230: /* eidlist */
- case 242: /* selcollist */
- case 245: /* groupby_opt */
- case 247: /* orderby_opt */
- case 251: /* nexprlist */
- case 252: /* sclp */
- case 260: /* exprlist */
- case 266: /* setlist */
- case 275: /* paren_exprlist */
- case 277: /* case_exprlist */
- case 308: /* part_opt */
+sqlite3ExprDelete(pParse->db, (yypminor->yy528));
+}
+ break;
+ case 221: /* eidlist_opt */
+ case 231: /* sortlist */
+ case 232: /* eidlist */
+ case 244: /* selcollist */
+ case 247: /* groupby_opt */
+ case 249: /* orderby_opt */
+ case 253: /* nexprlist */
+ case 254: /* sclp */
+ case 261: /* exprlist */
+ case 268: /* setlist */
+ case 277: /* paren_exprlist */
+ case 279: /* case_exprlist */
+ case 310: /* part_opt */
{
-sqlite3ExprListDelete(pParse->db, (yypminor->yy70));
+sqlite3ExprListDelete(pParse->db, (yypminor->yy322));
}
break;
- case 236: /* fullname */
- case 243: /* from */
- case 254: /* seltablist */
- case 255: /* stl_prefix */
- case 261: /* xfullname */
+ case 238: /* fullname */
+ case 245: /* from */
+ case 256: /* seltablist */
+ case 257: /* stl_prefix */
+ case 262: /* xfullname */
{
-sqlite3SrcListDelete(pParse->db, (yypminor->yy153));
+sqlite3SrcListDelete(pParse->db, (yypminor->yy131));
}
break;
- case 239: /* wqlist */
+ case 241: /* wqlist */
{
-sqlite3WithDelete(pParse->db, (yypminor->yy103));
+sqlite3WithDelete(pParse->db, (yypminor->yy521));
}
break;
- case 249: /* window_clause */
- case 304: /* windowdefn_list */
+ case 251: /* window_clause */
+ case 306: /* windowdefn_list */
{
-sqlite3WindowListDelete(pParse->db, (yypminor->yy49));
+sqlite3WindowListDelete(pParse->db, (yypminor->yy41));
}
break;
- case 259: /* using_opt */
- case 262: /* idlist */
- case 268: /* idlist_opt */
+ case 263: /* idlist */
+ case 270: /* idlist_opt */
{
-sqlite3IdListDelete(pParse->db, (yypminor->yy436));
+sqlite3IdListDelete(pParse->db, (yypminor->yy254));
}
break;
- case 271: /* filter_over */
- case 305: /* windowdefn */
- case 306: /* window */
- case 307: /* frame_opt */
- case 310: /* over_clause */
+ case 273: /* filter_over */
+ case 307: /* windowdefn */
+ case 308: /* window */
+ case 309: /* frame_opt */
+ case 312: /* over_clause */
{
-sqlite3WindowDelete(pParse->db, (yypminor->yy49));
+sqlite3WindowDelete(pParse->db, (yypminor->yy41));
}
break;
- case 284: /* trigger_cmd_list */
- case 289: /* trigger_cmd */
+ case 286: /* trigger_cmd_list */
+ case 291: /* trigger_cmd */
{
-sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy157));
+sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy33));
}
break;
- case 286: /* trigger_event */
+ case 288: /* trigger_event */
{
-sqlite3IdListDelete(pParse->db, (yypminor->yy262).b);
+sqlite3IdListDelete(pParse->db, (yypminor->yy180).b);
}
break;
- case 312: /* frame_bound */
- case 313: /* frame_bound_s */
- case 314: /* frame_bound_e */
+ case 314: /* frame_bound */
+ case 315: /* frame_bound_s */
+ case 316: /* frame_bound_e */
{
-sqlite3ExprDelete(pParse->db, (yypminor->yy117).pExpr);
+sqlite3ExprDelete(pParse->db, (yypminor->yy595).pExpr);
}
break;
/********* End destructor definitions *****************************************/
@@ -160700,404 +170445,409 @@ static void yy_shift(
/* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side
** of that rule */
static const YYCODETYPE yyRuleInfoLhs[] = {
- 188, /* (0) explain ::= EXPLAIN */
- 188, /* (1) explain ::= EXPLAIN QUERY PLAN */
- 187, /* (2) cmdx ::= cmd */
- 189, /* (3) cmd ::= BEGIN transtype trans_opt */
- 190, /* (4) transtype ::= */
- 190, /* (5) transtype ::= DEFERRED */
- 190, /* (6) transtype ::= IMMEDIATE */
- 190, /* (7) transtype ::= EXCLUSIVE */
- 189, /* (8) cmd ::= COMMIT|END trans_opt */
- 189, /* (9) cmd ::= ROLLBACK trans_opt */
- 189, /* (10) cmd ::= SAVEPOINT nm */
- 189, /* (11) cmd ::= RELEASE savepoint_opt nm */
- 189, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
- 194, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */
- 196, /* (14) createkw ::= CREATE */
- 198, /* (15) ifnotexists ::= */
- 198, /* (16) ifnotexists ::= IF NOT EXISTS */
- 197, /* (17) temp ::= TEMP */
- 197, /* (18) temp ::= */
- 195, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */
- 195, /* (20) create_table_args ::= AS select */
- 202, /* (21) table_options ::= */
- 202, /* (22) table_options ::= WITHOUT nm */
- 204, /* (23) columnname ::= nm typetoken */
- 206, /* (24) typetoken ::= */
- 206, /* (25) typetoken ::= typename LP signed RP */
- 206, /* (26) typetoken ::= typename LP signed COMMA signed RP */
- 207, /* (27) typename ::= typename ID|STRING */
- 211, /* (28) scanpt ::= */
- 212, /* (29) scantok ::= */
- 213, /* (30) ccons ::= CONSTRAINT nm */
- 213, /* (31) ccons ::= DEFAULT scantok term */
- 213, /* (32) ccons ::= DEFAULT LP expr RP */
- 213, /* (33) ccons ::= DEFAULT PLUS scantok term */
- 213, /* (34) ccons ::= DEFAULT MINUS scantok term */
- 213, /* (35) ccons ::= DEFAULT scantok ID|INDEXED */
- 213, /* (36) ccons ::= NOT NULL onconf */
- 213, /* (37) ccons ::= PRIMARY KEY sortorder onconf autoinc */
- 213, /* (38) ccons ::= UNIQUE onconf */
- 213, /* (39) ccons ::= CHECK LP expr RP */
- 213, /* (40) ccons ::= REFERENCES nm eidlist_opt refargs */
- 213, /* (41) ccons ::= defer_subclause */
- 213, /* (42) ccons ::= COLLATE ID|STRING */
- 222, /* (43) generated ::= LP expr RP */
- 222, /* (44) generated ::= LP expr RP ID */
- 218, /* (45) autoinc ::= */
- 218, /* (46) autoinc ::= AUTOINCR */
- 220, /* (47) refargs ::= */
- 220, /* (48) refargs ::= refargs refarg */
- 223, /* (49) refarg ::= MATCH nm */
- 223, /* (50) refarg ::= ON INSERT refact */
- 223, /* (51) refarg ::= ON DELETE refact */
- 223, /* (52) refarg ::= ON UPDATE refact */
- 224, /* (53) refact ::= SET NULL */
- 224, /* (54) refact ::= SET DEFAULT */
- 224, /* (55) refact ::= CASCADE */
- 224, /* (56) refact ::= RESTRICT */
- 224, /* (57) refact ::= NO ACTION */
- 221, /* (58) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
- 221, /* (59) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
- 225, /* (60) init_deferred_pred_opt ::= */
- 225, /* (61) init_deferred_pred_opt ::= INITIALLY DEFERRED */
- 225, /* (62) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
- 201, /* (63) conslist_opt ::= */
- 227, /* (64) tconscomma ::= COMMA */
- 228, /* (65) tcons ::= CONSTRAINT nm */
- 228, /* (66) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
- 228, /* (67) tcons ::= UNIQUE LP sortlist RP onconf */
- 228, /* (68) tcons ::= CHECK LP expr RP onconf */
- 228, /* (69) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
- 231, /* (70) defer_subclause_opt ::= */
- 216, /* (71) onconf ::= */
- 216, /* (72) onconf ::= ON CONFLICT resolvetype */
- 232, /* (73) orconf ::= */
- 232, /* (74) orconf ::= OR resolvetype */
- 233, /* (75) resolvetype ::= IGNORE */
- 233, /* (76) resolvetype ::= REPLACE */
- 189, /* (77) cmd ::= DROP TABLE ifexists fullname */
- 235, /* (78) ifexists ::= IF EXISTS */
- 235, /* (79) ifexists ::= */
- 189, /* (80) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
- 189, /* (81) cmd ::= DROP VIEW ifexists fullname */
- 189, /* (82) cmd ::= select */
- 203, /* (83) select ::= WITH wqlist selectnowith */
- 203, /* (84) select ::= WITH RECURSIVE wqlist selectnowith */
- 203, /* (85) select ::= selectnowith */
- 237, /* (86) selectnowith ::= selectnowith multiselect_op oneselect */
- 240, /* (87) multiselect_op ::= UNION */
- 240, /* (88) multiselect_op ::= UNION ALL */
- 240, /* (89) multiselect_op ::= EXCEPT|INTERSECT */
- 238, /* (90) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
- 238, /* (91) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */
- 250, /* (92) values ::= VALUES LP nexprlist RP */
- 250, /* (93) values ::= values COMMA LP nexprlist RP */
- 241, /* (94) distinct ::= DISTINCT */
- 241, /* (95) distinct ::= ALL */
- 241, /* (96) distinct ::= */
- 252, /* (97) sclp ::= */
- 242, /* (98) selcollist ::= sclp scanpt expr scanpt as */
- 242, /* (99) selcollist ::= sclp scanpt STAR */
- 242, /* (100) selcollist ::= sclp scanpt nm DOT STAR */
- 253, /* (101) as ::= AS nm */
- 253, /* (102) as ::= */
- 243, /* (103) from ::= */
- 243, /* (104) from ::= FROM seltablist */
- 255, /* (105) stl_prefix ::= seltablist joinop */
- 255, /* (106) stl_prefix ::= */
- 254, /* (107) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
- 254, /* (108) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
- 254, /* (109) seltablist ::= stl_prefix LP select RP as on_opt using_opt */
- 254, /* (110) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
- 199, /* (111) dbnm ::= */
- 199, /* (112) dbnm ::= DOT nm */
- 236, /* (113) fullname ::= nm */
- 236, /* (114) fullname ::= nm DOT nm */
- 261, /* (115) xfullname ::= nm */
- 261, /* (116) xfullname ::= nm DOT nm */
- 261, /* (117) xfullname ::= nm DOT nm AS nm */
- 261, /* (118) xfullname ::= nm AS nm */
- 256, /* (119) joinop ::= COMMA|JOIN */
- 256, /* (120) joinop ::= JOIN_KW JOIN */
- 256, /* (121) joinop ::= JOIN_KW nm JOIN */
- 256, /* (122) joinop ::= JOIN_KW nm nm JOIN */
- 258, /* (123) on_opt ::= ON expr */
- 258, /* (124) on_opt ::= */
- 257, /* (125) indexed_opt ::= */
- 257, /* (126) indexed_opt ::= INDEXED BY nm */
- 257, /* (127) indexed_opt ::= NOT INDEXED */
- 259, /* (128) using_opt ::= USING LP idlist RP */
- 259, /* (129) using_opt ::= */
- 247, /* (130) orderby_opt ::= */
- 247, /* (131) orderby_opt ::= ORDER BY sortlist */
- 229, /* (132) sortlist ::= sortlist COMMA expr sortorder nulls */
- 229, /* (133) sortlist ::= expr sortorder nulls */
- 217, /* (134) sortorder ::= ASC */
- 217, /* (135) sortorder ::= DESC */
- 217, /* (136) sortorder ::= */
- 263, /* (137) nulls ::= NULLS FIRST */
- 263, /* (138) nulls ::= NULLS LAST */
- 263, /* (139) nulls ::= */
- 245, /* (140) groupby_opt ::= */
- 245, /* (141) groupby_opt ::= GROUP BY nexprlist */
- 246, /* (142) having_opt ::= */
- 246, /* (143) having_opt ::= HAVING expr */
- 248, /* (144) limit_opt ::= */
- 248, /* (145) limit_opt ::= LIMIT expr */
- 248, /* (146) limit_opt ::= LIMIT expr OFFSET expr */
- 248, /* (147) limit_opt ::= LIMIT expr COMMA expr */
- 189, /* (148) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */
- 244, /* (149) where_opt ::= */
- 244, /* (150) where_opt ::= WHERE expr */
- 265, /* (151) where_opt_ret ::= */
- 265, /* (152) where_opt_ret ::= WHERE expr */
- 265, /* (153) where_opt_ret ::= RETURNING selcollist */
- 265, /* (154) where_opt_ret ::= WHERE expr RETURNING selcollist */
- 189, /* (155) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */
- 266, /* (156) setlist ::= setlist COMMA nm EQ expr */
- 266, /* (157) setlist ::= setlist COMMA LP idlist RP EQ expr */
- 266, /* (158) setlist ::= nm EQ expr */
- 266, /* (159) setlist ::= LP idlist RP EQ expr */
- 189, /* (160) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
- 189, /* (161) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */
- 269, /* (162) upsert ::= */
- 269, /* (163) upsert ::= RETURNING selcollist */
- 269, /* (164) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */
- 269, /* (165) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */
- 269, /* (166) upsert ::= ON CONFLICT DO NOTHING returning */
- 269, /* (167) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */
- 270, /* (168) returning ::= RETURNING selcollist */
- 267, /* (169) insert_cmd ::= INSERT orconf */
- 267, /* (170) insert_cmd ::= REPLACE */
- 268, /* (171) idlist_opt ::= */
- 268, /* (172) idlist_opt ::= LP idlist RP */
- 262, /* (173) idlist ::= idlist COMMA nm */
- 262, /* (174) idlist ::= nm */
- 215, /* (175) expr ::= LP expr RP */
- 215, /* (176) expr ::= ID|INDEXED */
- 215, /* (177) expr ::= JOIN_KW */
- 215, /* (178) expr ::= nm DOT nm */
- 215, /* (179) expr ::= nm DOT nm DOT nm */
- 214, /* (180) term ::= NULL|FLOAT|BLOB */
- 214, /* (181) term ::= STRING */
- 214, /* (182) term ::= INTEGER */
- 215, /* (183) expr ::= VARIABLE */
- 215, /* (184) expr ::= expr COLLATE ID|STRING */
- 215, /* (185) expr ::= CAST LP expr AS typetoken RP */
- 215, /* (186) expr ::= ID|INDEXED LP distinct exprlist RP */
- 215, /* (187) expr ::= ID|INDEXED LP STAR RP */
- 215, /* (188) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */
- 215, /* (189) expr ::= ID|INDEXED LP STAR RP filter_over */
- 214, /* (190) term ::= CTIME_KW */
- 215, /* (191) expr ::= LP nexprlist COMMA expr RP */
- 215, /* (192) expr ::= expr AND expr */
- 215, /* (193) expr ::= expr OR expr */
- 215, /* (194) expr ::= expr LT|GT|GE|LE expr */
- 215, /* (195) expr ::= expr EQ|NE expr */
- 215, /* (196) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
- 215, /* (197) expr ::= expr PLUS|MINUS expr */
- 215, /* (198) expr ::= expr STAR|SLASH|REM expr */
- 215, /* (199) expr ::= expr CONCAT expr */
- 272, /* (200) likeop ::= NOT LIKE_KW|MATCH */
- 215, /* (201) expr ::= expr likeop expr */
- 215, /* (202) expr ::= expr likeop expr ESCAPE expr */
- 215, /* (203) expr ::= expr ISNULL|NOTNULL */
- 215, /* (204) expr ::= expr NOT NULL */
- 215, /* (205) expr ::= expr IS expr */
- 215, /* (206) expr ::= expr IS NOT expr */
- 215, /* (207) expr ::= NOT expr */
- 215, /* (208) expr ::= BITNOT expr */
- 215, /* (209) expr ::= PLUS|MINUS expr */
- 273, /* (210) between_op ::= BETWEEN */
- 273, /* (211) between_op ::= NOT BETWEEN */
- 215, /* (212) expr ::= expr between_op expr AND expr */
- 274, /* (213) in_op ::= IN */
- 274, /* (214) in_op ::= NOT IN */
- 215, /* (215) expr ::= expr in_op LP exprlist RP */
- 215, /* (216) expr ::= LP select RP */
- 215, /* (217) expr ::= expr in_op LP select RP */
- 215, /* (218) expr ::= expr in_op nm dbnm paren_exprlist */
- 215, /* (219) expr ::= EXISTS LP select RP */
- 215, /* (220) expr ::= CASE case_operand case_exprlist case_else END */
- 277, /* (221) case_exprlist ::= case_exprlist WHEN expr THEN expr */
- 277, /* (222) case_exprlist ::= WHEN expr THEN expr */
- 278, /* (223) case_else ::= ELSE expr */
- 278, /* (224) case_else ::= */
- 276, /* (225) case_operand ::= expr */
- 276, /* (226) case_operand ::= */
- 260, /* (227) exprlist ::= */
- 251, /* (228) nexprlist ::= nexprlist COMMA expr */
- 251, /* (229) nexprlist ::= expr */
- 275, /* (230) paren_exprlist ::= */
- 275, /* (231) paren_exprlist ::= LP exprlist RP */
- 189, /* (232) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
- 279, /* (233) uniqueflag ::= UNIQUE */
- 279, /* (234) uniqueflag ::= */
- 219, /* (235) eidlist_opt ::= */
- 219, /* (236) eidlist_opt ::= LP eidlist RP */
- 230, /* (237) eidlist ::= eidlist COMMA nm collate sortorder */
- 230, /* (238) eidlist ::= nm collate sortorder */
- 280, /* (239) collate ::= */
- 280, /* (240) collate ::= COLLATE ID|STRING */
- 189, /* (241) cmd ::= DROP INDEX ifexists fullname */
- 189, /* (242) cmd ::= VACUUM vinto */
- 189, /* (243) cmd ::= VACUUM nm vinto */
- 281, /* (244) vinto ::= INTO expr */
- 281, /* (245) vinto ::= */
- 189, /* (246) cmd ::= PRAGMA nm dbnm */
- 189, /* (247) cmd ::= PRAGMA nm dbnm EQ nmnum */
- 189, /* (248) cmd ::= PRAGMA nm dbnm LP nmnum RP */
- 189, /* (249) cmd ::= PRAGMA nm dbnm EQ minus_num */
- 189, /* (250) cmd ::= PRAGMA nm dbnm LP minus_num RP */
- 209, /* (251) plus_num ::= PLUS INTEGER|FLOAT */
- 210, /* (252) minus_num ::= MINUS INTEGER|FLOAT */
- 189, /* (253) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
- 283, /* (254) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
- 285, /* (255) trigger_time ::= BEFORE|AFTER */
- 285, /* (256) trigger_time ::= INSTEAD OF */
- 285, /* (257) trigger_time ::= */
- 286, /* (258) trigger_event ::= DELETE|INSERT */
- 286, /* (259) trigger_event ::= UPDATE */
- 286, /* (260) trigger_event ::= UPDATE OF idlist */
- 288, /* (261) when_clause ::= */
- 288, /* (262) when_clause ::= WHEN expr */
- 284, /* (263) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
- 284, /* (264) trigger_cmd_list ::= trigger_cmd SEMI */
- 290, /* (265) trnm ::= nm DOT nm */
- 291, /* (266) tridxby ::= INDEXED BY nm */
- 291, /* (267) tridxby ::= NOT INDEXED */
- 289, /* (268) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */
- 289, /* (269) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */
- 289, /* (270) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
- 289, /* (271) trigger_cmd ::= scanpt select scanpt */
- 215, /* (272) expr ::= RAISE LP IGNORE RP */
- 215, /* (273) expr ::= RAISE LP raisetype COMMA nm RP */
- 234, /* (274) raisetype ::= ROLLBACK */
- 234, /* (275) raisetype ::= ABORT */
- 234, /* (276) raisetype ::= FAIL */
- 189, /* (277) cmd ::= DROP TRIGGER ifexists fullname */
- 189, /* (278) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
- 189, /* (279) cmd ::= DETACH database_kw_opt expr */
- 293, /* (280) key_opt ::= */
- 293, /* (281) key_opt ::= KEY expr */
- 189, /* (282) cmd ::= REINDEX */
- 189, /* (283) cmd ::= REINDEX nm dbnm */
- 189, /* (284) cmd ::= ANALYZE */
- 189, /* (285) cmd ::= ANALYZE nm dbnm */
- 189, /* (286) cmd ::= ALTER TABLE fullname RENAME TO nm */
- 189, /* (287) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
- 189, /* (288) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */
- 294, /* (289) add_column_fullname ::= fullname */
- 189, /* (290) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */
- 189, /* (291) cmd ::= create_vtab */
- 189, /* (292) cmd ::= create_vtab LP vtabarglist RP */
- 296, /* (293) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
- 298, /* (294) vtabarg ::= */
- 299, /* (295) vtabargtoken ::= ANY */
- 299, /* (296) vtabargtoken ::= lp anylist RP */
- 300, /* (297) lp ::= LP */
- 264, /* (298) with ::= WITH wqlist */
- 264, /* (299) with ::= WITH RECURSIVE wqlist */
- 303, /* (300) wqas ::= AS */
- 303, /* (301) wqas ::= AS MATERIALIZED */
- 303, /* (302) wqas ::= AS NOT MATERIALIZED */
- 302, /* (303) wqitem ::= nm eidlist_opt wqas LP select RP */
- 239, /* (304) wqlist ::= wqitem */
- 239, /* (305) wqlist ::= wqlist COMMA wqitem */
- 304, /* (306) windowdefn_list ::= windowdefn */
- 304, /* (307) windowdefn_list ::= windowdefn_list COMMA windowdefn */
- 305, /* (308) windowdefn ::= nm AS LP window RP */
- 306, /* (309) window ::= PARTITION BY nexprlist orderby_opt frame_opt */
- 306, /* (310) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */
- 306, /* (311) window ::= ORDER BY sortlist frame_opt */
- 306, /* (312) window ::= nm ORDER BY sortlist frame_opt */
- 306, /* (313) window ::= frame_opt */
- 306, /* (314) window ::= nm frame_opt */
- 307, /* (315) frame_opt ::= */
- 307, /* (316) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */
- 307, /* (317) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */
- 311, /* (318) range_or_rows ::= RANGE|ROWS|GROUPS */
- 313, /* (319) frame_bound_s ::= frame_bound */
- 313, /* (320) frame_bound_s ::= UNBOUNDED PRECEDING */
- 314, /* (321) frame_bound_e ::= frame_bound */
- 314, /* (322) frame_bound_e ::= UNBOUNDED FOLLOWING */
- 312, /* (323) frame_bound ::= expr PRECEDING|FOLLOWING */
- 312, /* (324) frame_bound ::= CURRENT ROW */
- 315, /* (325) frame_exclude_opt ::= */
- 315, /* (326) frame_exclude_opt ::= EXCLUDE frame_exclude */
- 316, /* (327) frame_exclude ::= NO OTHERS */
- 316, /* (328) frame_exclude ::= CURRENT ROW */
- 316, /* (329) frame_exclude ::= GROUP|TIES */
- 249, /* (330) window_clause ::= WINDOW windowdefn_list */
- 271, /* (331) filter_over ::= filter_clause over_clause */
- 271, /* (332) filter_over ::= over_clause */
- 271, /* (333) filter_over ::= filter_clause */
- 310, /* (334) over_clause ::= OVER LP window RP */
- 310, /* (335) over_clause ::= OVER nm */
- 309, /* (336) filter_clause ::= FILTER LP WHERE expr RP */
- 184, /* (337) input ::= cmdlist */
- 185, /* (338) cmdlist ::= cmdlist ecmd */
- 185, /* (339) cmdlist ::= ecmd */
- 186, /* (340) ecmd ::= SEMI */
- 186, /* (341) ecmd ::= cmdx SEMI */
- 186, /* (342) ecmd ::= explain cmdx SEMI */
- 191, /* (343) trans_opt ::= */
- 191, /* (344) trans_opt ::= TRANSACTION */
- 191, /* (345) trans_opt ::= TRANSACTION nm */
- 193, /* (346) savepoint_opt ::= SAVEPOINT */
- 193, /* (347) savepoint_opt ::= */
- 189, /* (348) cmd ::= create_table create_table_args */
- 200, /* (349) columnlist ::= columnlist COMMA columnname carglist */
- 200, /* (350) columnlist ::= columnname carglist */
- 192, /* (351) nm ::= ID|INDEXED */
- 192, /* (352) nm ::= STRING */
- 192, /* (353) nm ::= JOIN_KW */
- 206, /* (354) typetoken ::= typename */
- 207, /* (355) typename ::= ID|STRING */
- 208, /* (356) signed ::= plus_num */
- 208, /* (357) signed ::= minus_num */
- 205, /* (358) carglist ::= carglist ccons */
- 205, /* (359) carglist ::= */
- 213, /* (360) ccons ::= NULL onconf */
- 213, /* (361) ccons ::= GENERATED ALWAYS AS generated */
- 213, /* (362) ccons ::= AS generated */
- 201, /* (363) conslist_opt ::= COMMA conslist */
- 226, /* (364) conslist ::= conslist tconscomma tcons */
- 226, /* (365) conslist ::= tcons */
- 227, /* (366) tconscomma ::= */
- 231, /* (367) defer_subclause_opt ::= defer_subclause */
- 233, /* (368) resolvetype ::= raisetype */
- 237, /* (369) selectnowith ::= oneselect */
- 238, /* (370) oneselect ::= values */
- 252, /* (371) sclp ::= selcollist COMMA */
- 253, /* (372) as ::= ID|STRING */
- 270, /* (373) returning ::= */
- 215, /* (374) expr ::= term */
- 272, /* (375) likeop ::= LIKE_KW|MATCH */
- 260, /* (376) exprlist ::= nexprlist */
- 282, /* (377) nmnum ::= plus_num */
- 282, /* (378) nmnum ::= nm */
- 282, /* (379) nmnum ::= ON */
- 282, /* (380) nmnum ::= DELETE */
- 282, /* (381) nmnum ::= DEFAULT */
- 209, /* (382) plus_num ::= INTEGER|FLOAT */
- 287, /* (383) foreach_clause ::= */
- 287, /* (384) foreach_clause ::= FOR EACH ROW */
- 290, /* (385) trnm ::= nm */
- 291, /* (386) tridxby ::= */
- 292, /* (387) database_kw_opt ::= DATABASE */
- 292, /* (388) database_kw_opt ::= */
- 295, /* (389) kwcolumn_opt ::= */
- 295, /* (390) kwcolumn_opt ::= COLUMNKW */
- 297, /* (391) vtabarglist ::= vtabarg */
- 297, /* (392) vtabarglist ::= vtabarglist COMMA vtabarg */
- 298, /* (393) vtabarg ::= vtabarg vtabargtoken */
- 301, /* (394) anylist ::= */
- 301, /* (395) anylist ::= anylist LP anylist RP */
- 301, /* (396) anylist ::= anylist ANY */
- 264, /* (397) with ::= */
+ 189, /* (0) explain ::= EXPLAIN */
+ 189, /* (1) explain ::= EXPLAIN QUERY PLAN */
+ 188, /* (2) cmdx ::= cmd */
+ 190, /* (3) cmd ::= BEGIN transtype trans_opt */
+ 191, /* (4) transtype ::= */
+ 191, /* (5) transtype ::= DEFERRED */
+ 191, /* (6) transtype ::= IMMEDIATE */
+ 191, /* (7) transtype ::= EXCLUSIVE */
+ 190, /* (8) cmd ::= COMMIT|END trans_opt */
+ 190, /* (9) cmd ::= ROLLBACK trans_opt */
+ 190, /* (10) cmd ::= SAVEPOINT nm */
+ 190, /* (11) cmd ::= RELEASE savepoint_opt nm */
+ 190, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
+ 195, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */
+ 197, /* (14) createkw ::= CREATE */
+ 199, /* (15) ifnotexists ::= */
+ 199, /* (16) ifnotexists ::= IF NOT EXISTS */
+ 198, /* (17) temp ::= TEMP */
+ 198, /* (18) temp ::= */
+ 196, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_option_set */
+ 196, /* (20) create_table_args ::= AS select */
+ 203, /* (21) table_option_set ::= */
+ 203, /* (22) table_option_set ::= table_option_set COMMA table_option */
+ 205, /* (23) table_option ::= WITHOUT nm */
+ 205, /* (24) table_option ::= nm */
+ 206, /* (25) columnname ::= nm typetoken */
+ 208, /* (26) typetoken ::= */
+ 208, /* (27) typetoken ::= typename LP signed RP */
+ 208, /* (28) typetoken ::= typename LP signed COMMA signed RP */
+ 209, /* (29) typename ::= typename ID|STRING */
+ 213, /* (30) scanpt ::= */
+ 214, /* (31) scantok ::= */
+ 215, /* (32) ccons ::= CONSTRAINT nm */
+ 215, /* (33) ccons ::= DEFAULT scantok term */
+ 215, /* (34) ccons ::= DEFAULT LP expr RP */
+ 215, /* (35) ccons ::= DEFAULT PLUS scantok term */
+ 215, /* (36) ccons ::= DEFAULT MINUS scantok term */
+ 215, /* (37) ccons ::= DEFAULT scantok ID|INDEXED */
+ 215, /* (38) ccons ::= NOT NULL onconf */
+ 215, /* (39) ccons ::= PRIMARY KEY sortorder onconf autoinc */
+ 215, /* (40) ccons ::= UNIQUE onconf */
+ 215, /* (41) ccons ::= CHECK LP expr RP */
+ 215, /* (42) ccons ::= REFERENCES nm eidlist_opt refargs */
+ 215, /* (43) ccons ::= defer_subclause */
+ 215, /* (44) ccons ::= COLLATE ID|STRING */
+ 224, /* (45) generated ::= LP expr RP */
+ 224, /* (46) generated ::= LP expr RP ID */
+ 220, /* (47) autoinc ::= */
+ 220, /* (48) autoinc ::= AUTOINCR */
+ 222, /* (49) refargs ::= */
+ 222, /* (50) refargs ::= refargs refarg */
+ 225, /* (51) refarg ::= MATCH nm */
+ 225, /* (52) refarg ::= ON INSERT refact */
+ 225, /* (53) refarg ::= ON DELETE refact */
+ 225, /* (54) refarg ::= ON UPDATE refact */
+ 226, /* (55) refact ::= SET NULL */
+ 226, /* (56) refact ::= SET DEFAULT */
+ 226, /* (57) refact ::= CASCADE */
+ 226, /* (58) refact ::= RESTRICT */
+ 226, /* (59) refact ::= NO ACTION */
+ 223, /* (60) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
+ 223, /* (61) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
+ 227, /* (62) init_deferred_pred_opt ::= */
+ 227, /* (63) init_deferred_pred_opt ::= INITIALLY DEFERRED */
+ 227, /* (64) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
+ 202, /* (65) conslist_opt ::= */
+ 229, /* (66) tconscomma ::= COMMA */
+ 230, /* (67) tcons ::= CONSTRAINT nm */
+ 230, /* (68) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
+ 230, /* (69) tcons ::= UNIQUE LP sortlist RP onconf */
+ 230, /* (70) tcons ::= CHECK LP expr RP onconf */
+ 230, /* (71) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
+ 233, /* (72) defer_subclause_opt ::= */
+ 218, /* (73) onconf ::= */
+ 218, /* (74) onconf ::= ON CONFLICT resolvetype */
+ 234, /* (75) orconf ::= */
+ 234, /* (76) orconf ::= OR resolvetype */
+ 235, /* (77) resolvetype ::= IGNORE */
+ 235, /* (78) resolvetype ::= REPLACE */
+ 190, /* (79) cmd ::= DROP TABLE ifexists fullname */
+ 237, /* (80) ifexists ::= IF EXISTS */
+ 237, /* (81) ifexists ::= */
+ 190, /* (82) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
+ 190, /* (83) cmd ::= DROP VIEW ifexists fullname */
+ 190, /* (84) cmd ::= select */
+ 204, /* (85) select ::= WITH wqlist selectnowith */
+ 204, /* (86) select ::= WITH RECURSIVE wqlist selectnowith */
+ 204, /* (87) select ::= selectnowith */
+ 239, /* (88) selectnowith ::= selectnowith multiselect_op oneselect */
+ 242, /* (89) multiselect_op ::= UNION */
+ 242, /* (90) multiselect_op ::= UNION ALL */
+ 242, /* (91) multiselect_op ::= EXCEPT|INTERSECT */
+ 240, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+ 240, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */
+ 252, /* (94) values ::= VALUES LP nexprlist RP */
+ 252, /* (95) values ::= values COMMA LP nexprlist RP */
+ 243, /* (96) distinct ::= DISTINCT */
+ 243, /* (97) distinct ::= ALL */
+ 243, /* (98) distinct ::= */
+ 254, /* (99) sclp ::= */
+ 244, /* (100) selcollist ::= sclp scanpt expr scanpt as */
+ 244, /* (101) selcollist ::= sclp scanpt STAR */
+ 244, /* (102) selcollist ::= sclp scanpt nm DOT STAR */
+ 255, /* (103) as ::= AS nm */
+ 255, /* (104) as ::= */
+ 245, /* (105) from ::= */
+ 245, /* (106) from ::= FROM seltablist */
+ 257, /* (107) stl_prefix ::= seltablist joinop */
+ 257, /* (108) stl_prefix ::= */
+ 256, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */
+ 256, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */
+ 256, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */
+ 256, /* (112) seltablist ::= stl_prefix LP select RP as on_using */
+ 256, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */
+ 200, /* (114) dbnm ::= */
+ 200, /* (115) dbnm ::= DOT nm */
+ 238, /* (116) fullname ::= nm */
+ 238, /* (117) fullname ::= nm DOT nm */
+ 262, /* (118) xfullname ::= nm */
+ 262, /* (119) xfullname ::= nm DOT nm */
+ 262, /* (120) xfullname ::= nm DOT nm AS nm */
+ 262, /* (121) xfullname ::= nm AS nm */
+ 258, /* (122) joinop ::= COMMA|JOIN */
+ 258, /* (123) joinop ::= JOIN_KW JOIN */
+ 258, /* (124) joinop ::= JOIN_KW nm JOIN */
+ 258, /* (125) joinop ::= JOIN_KW nm nm JOIN */
+ 259, /* (126) on_using ::= ON expr */
+ 259, /* (127) on_using ::= USING LP idlist RP */
+ 259, /* (128) on_using ::= */
+ 264, /* (129) indexed_opt ::= */
+ 260, /* (130) indexed_by ::= INDEXED BY nm */
+ 260, /* (131) indexed_by ::= NOT INDEXED */
+ 249, /* (132) orderby_opt ::= */
+ 249, /* (133) orderby_opt ::= ORDER BY sortlist */
+ 231, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */
+ 231, /* (135) sortlist ::= expr sortorder nulls */
+ 219, /* (136) sortorder ::= ASC */
+ 219, /* (137) sortorder ::= DESC */
+ 219, /* (138) sortorder ::= */
+ 265, /* (139) nulls ::= NULLS FIRST */
+ 265, /* (140) nulls ::= NULLS LAST */
+ 265, /* (141) nulls ::= */
+ 247, /* (142) groupby_opt ::= */
+ 247, /* (143) groupby_opt ::= GROUP BY nexprlist */
+ 248, /* (144) having_opt ::= */
+ 248, /* (145) having_opt ::= HAVING expr */
+ 250, /* (146) limit_opt ::= */
+ 250, /* (147) limit_opt ::= LIMIT expr */
+ 250, /* (148) limit_opt ::= LIMIT expr OFFSET expr */
+ 250, /* (149) limit_opt ::= LIMIT expr COMMA expr */
+ 190, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */
+ 246, /* (151) where_opt ::= */
+ 246, /* (152) where_opt ::= WHERE expr */
+ 267, /* (153) where_opt_ret ::= */
+ 267, /* (154) where_opt_ret ::= WHERE expr */
+ 267, /* (155) where_opt_ret ::= RETURNING selcollist */
+ 267, /* (156) where_opt_ret ::= WHERE expr RETURNING selcollist */
+ 190, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */
+ 268, /* (158) setlist ::= setlist COMMA nm EQ expr */
+ 268, /* (159) setlist ::= setlist COMMA LP idlist RP EQ expr */
+ 268, /* (160) setlist ::= nm EQ expr */
+ 268, /* (161) setlist ::= LP idlist RP EQ expr */
+ 190, /* (162) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
+ 190, /* (163) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */
+ 271, /* (164) upsert ::= */
+ 271, /* (165) upsert ::= RETURNING selcollist */
+ 271, /* (166) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */
+ 271, /* (167) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */
+ 271, /* (168) upsert ::= ON CONFLICT DO NOTHING returning */
+ 271, /* (169) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */
+ 272, /* (170) returning ::= RETURNING selcollist */
+ 269, /* (171) insert_cmd ::= INSERT orconf */
+ 269, /* (172) insert_cmd ::= REPLACE */
+ 270, /* (173) idlist_opt ::= */
+ 270, /* (174) idlist_opt ::= LP idlist RP */
+ 263, /* (175) idlist ::= idlist COMMA nm */
+ 263, /* (176) idlist ::= nm */
+ 217, /* (177) expr ::= LP expr RP */
+ 217, /* (178) expr ::= ID|INDEXED|JOIN_KW */
+ 217, /* (179) expr ::= nm DOT nm */
+ 217, /* (180) expr ::= nm DOT nm DOT nm */
+ 216, /* (181) term ::= NULL|FLOAT|BLOB */
+ 216, /* (182) term ::= STRING */
+ 216, /* (183) term ::= INTEGER */
+ 217, /* (184) expr ::= VARIABLE */
+ 217, /* (185) expr ::= expr COLLATE ID|STRING */
+ 217, /* (186) expr ::= CAST LP expr AS typetoken RP */
+ 217, /* (187) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP */
+ 217, /* (188) expr ::= ID|INDEXED|JOIN_KW LP STAR RP */
+ 217, /* (189) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over */
+ 217, /* (190) expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over */
+ 216, /* (191) term ::= CTIME_KW */
+ 217, /* (192) expr ::= LP nexprlist COMMA expr RP */
+ 217, /* (193) expr ::= expr AND expr */
+ 217, /* (194) expr ::= expr OR expr */
+ 217, /* (195) expr ::= expr LT|GT|GE|LE expr */
+ 217, /* (196) expr ::= expr EQ|NE expr */
+ 217, /* (197) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
+ 217, /* (198) expr ::= expr PLUS|MINUS expr */
+ 217, /* (199) expr ::= expr STAR|SLASH|REM expr */
+ 217, /* (200) expr ::= expr CONCAT expr */
+ 274, /* (201) likeop ::= NOT LIKE_KW|MATCH */
+ 217, /* (202) expr ::= expr likeop expr */
+ 217, /* (203) expr ::= expr likeop expr ESCAPE expr */
+ 217, /* (204) expr ::= expr ISNULL|NOTNULL */
+ 217, /* (205) expr ::= expr NOT NULL */
+ 217, /* (206) expr ::= expr IS expr */
+ 217, /* (207) expr ::= expr IS NOT expr */
+ 217, /* (208) expr ::= expr IS NOT DISTINCT FROM expr */
+ 217, /* (209) expr ::= expr IS DISTINCT FROM expr */
+ 217, /* (210) expr ::= NOT expr */
+ 217, /* (211) expr ::= BITNOT expr */
+ 217, /* (212) expr ::= PLUS|MINUS expr */
+ 217, /* (213) expr ::= expr PTR expr */
+ 275, /* (214) between_op ::= BETWEEN */
+ 275, /* (215) between_op ::= NOT BETWEEN */
+ 217, /* (216) expr ::= expr between_op expr AND expr */
+ 276, /* (217) in_op ::= IN */
+ 276, /* (218) in_op ::= NOT IN */
+ 217, /* (219) expr ::= expr in_op LP exprlist RP */
+ 217, /* (220) expr ::= LP select RP */
+ 217, /* (221) expr ::= expr in_op LP select RP */
+ 217, /* (222) expr ::= expr in_op nm dbnm paren_exprlist */
+ 217, /* (223) expr ::= EXISTS LP select RP */
+ 217, /* (224) expr ::= CASE case_operand case_exprlist case_else END */
+ 279, /* (225) case_exprlist ::= case_exprlist WHEN expr THEN expr */
+ 279, /* (226) case_exprlist ::= WHEN expr THEN expr */
+ 280, /* (227) case_else ::= ELSE expr */
+ 280, /* (228) case_else ::= */
+ 278, /* (229) case_operand ::= */
+ 261, /* (230) exprlist ::= */
+ 253, /* (231) nexprlist ::= nexprlist COMMA expr */
+ 253, /* (232) nexprlist ::= expr */
+ 277, /* (233) paren_exprlist ::= */
+ 277, /* (234) paren_exprlist ::= LP exprlist RP */
+ 190, /* (235) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+ 281, /* (236) uniqueflag ::= UNIQUE */
+ 281, /* (237) uniqueflag ::= */
+ 221, /* (238) eidlist_opt ::= */
+ 221, /* (239) eidlist_opt ::= LP eidlist RP */
+ 232, /* (240) eidlist ::= eidlist COMMA nm collate sortorder */
+ 232, /* (241) eidlist ::= nm collate sortorder */
+ 282, /* (242) collate ::= */
+ 282, /* (243) collate ::= COLLATE ID|STRING */
+ 190, /* (244) cmd ::= DROP INDEX ifexists fullname */
+ 190, /* (245) cmd ::= VACUUM vinto */
+ 190, /* (246) cmd ::= VACUUM nm vinto */
+ 283, /* (247) vinto ::= INTO expr */
+ 283, /* (248) vinto ::= */
+ 190, /* (249) cmd ::= PRAGMA nm dbnm */
+ 190, /* (250) cmd ::= PRAGMA nm dbnm EQ nmnum */
+ 190, /* (251) cmd ::= PRAGMA nm dbnm LP nmnum RP */
+ 190, /* (252) cmd ::= PRAGMA nm dbnm EQ minus_num */
+ 190, /* (253) cmd ::= PRAGMA nm dbnm LP minus_num RP */
+ 211, /* (254) plus_num ::= PLUS INTEGER|FLOAT */
+ 212, /* (255) minus_num ::= MINUS INTEGER|FLOAT */
+ 190, /* (256) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+ 285, /* (257) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+ 287, /* (258) trigger_time ::= BEFORE|AFTER */
+ 287, /* (259) trigger_time ::= INSTEAD OF */
+ 287, /* (260) trigger_time ::= */
+ 288, /* (261) trigger_event ::= DELETE|INSERT */
+ 288, /* (262) trigger_event ::= UPDATE */
+ 288, /* (263) trigger_event ::= UPDATE OF idlist */
+ 290, /* (264) when_clause ::= */
+ 290, /* (265) when_clause ::= WHEN expr */
+ 286, /* (266) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+ 286, /* (267) trigger_cmd_list ::= trigger_cmd SEMI */
+ 292, /* (268) trnm ::= nm DOT nm */
+ 293, /* (269) tridxby ::= INDEXED BY nm */
+ 293, /* (270) tridxby ::= NOT INDEXED */
+ 291, /* (271) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */
+ 291, /* (272) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */
+ 291, /* (273) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
+ 291, /* (274) trigger_cmd ::= scanpt select scanpt */
+ 217, /* (275) expr ::= RAISE LP IGNORE RP */
+ 217, /* (276) expr ::= RAISE LP raisetype COMMA nm RP */
+ 236, /* (277) raisetype ::= ROLLBACK */
+ 236, /* (278) raisetype ::= ABORT */
+ 236, /* (279) raisetype ::= FAIL */
+ 190, /* (280) cmd ::= DROP TRIGGER ifexists fullname */
+ 190, /* (281) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+ 190, /* (282) cmd ::= DETACH database_kw_opt expr */
+ 295, /* (283) key_opt ::= */
+ 295, /* (284) key_opt ::= KEY expr */
+ 190, /* (285) cmd ::= REINDEX */
+ 190, /* (286) cmd ::= REINDEX nm dbnm */
+ 190, /* (287) cmd ::= ANALYZE */
+ 190, /* (288) cmd ::= ANALYZE nm dbnm */
+ 190, /* (289) cmd ::= ALTER TABLE fullname RENAME TO nm */
+ 190, /* (290) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+ 190, /* (291) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */
+ 296, /* (292) add_column_fullname ::= fullname */
+ 190, /* (293) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */
+ 190, /* (294) cmd ::= create_vtab */
+ 190, /* (295) cmd ::= create_vtab LP vtabarglist RP */
+ 298, /* (296) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+ 300, /* (297) vtabarg ::= */
+ 301, /* (298) vtabargtoken ::= ANY */
+ 301, /* (299) vtabargtoken ::= lp anylist RP */
+ 302, /* (300) lp ::= LP */
+ 266, /* (301) with ::= WITH wqlist */
+ 266, /* (302) with ::= WITH RECURSIVE wqlist */
+ 305, /* (303) wqas ::= AS */
+ 305, /* (304) wqas ::= AS MATERIALIZED */
+ 305, /* (305) wqas ::= AS NOT MATERIALIZED */
+ 304, /* (306) wqitem ::= nm eidlist_opt wqas LP select RP */
+ 241, /* (307) wqlist ::= wqitem */
+ 241, /* (308) wqlist ::= wqlist COMMA wqitem */
+ 306, /* (309) windowdefn_list ::= windowdefn */
+ 306, /* (310) windowdefn_list ::= windowdefn_list COMMA windowdefn */
+ 307, /* (311) windowdefn ::= nm AS LP window RP */
+ 308, /* (312) window ::= PARTITION BY nexprlist orderby_opt frame_opt */
+ 308, /* (313) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */
+ 308, /* (314) window ::= ORDER BY sortlist frame_opt */
+ 308, /* (315) window ::= nm ORDER BY sortlist frame_opt */
+ 308, /* (316) window ::= frame_opt */
+ 308, /* (317) window ::= nm frame_opt */
+ 309, /* (318) frame_opt ::= */
+ 309, /* (319) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */
+ 309, /* (320) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */
+ 313, /* (321) range_or_rows ::= RANGE|ROWS|GROUPS */
+ 315, /* (322) frame_bound_s ::= frame_bound */
+ 315, /* (323) frame_bound_s ::= UNBOUNDED PRECEDING */
+ 316, /* (324) frame_bound_e ::= frame_bound */
+ 316, /* (325) frame_bound_e ::= UNBOUNDED FOLLOWING */
+ 314, /* (326) frame_bound ::= expr PRECEDING|FOLLOWING */
+ 314, /* (327) frame_bound ::= CURRENT ROW */
+ 317, /* (328) frame_exclude_opt ::= */
+ 317, /* (329) frame_exclude_opt ::= EXCLUDE frame_exclude */
+ 318, /* (330) frame_exclude ::= NO OTHERS */
+ 318, /* (331) frame_exclude ::= CURRENT ROW */
+ 318, /* (332) frame_exclude ::= GROUP|TIES */
+ 251, /* (333) window_clause ::= WINDOW windowdefn_list */
+ 273, /* (334) filter_over ::= filter_clause over_clause */
+ 273, /* (335) filter_over ::= over_clause */
+ 273, /* (336) filter_over ::= filter_clause */
+ 312, /* (337) over_clause ::= OVER LP window RP */
+ 312, /* (338) over_clause ::= OVER nm */
+ 311, /* (339) filter_clause ::= FILTER LP WHERE expr RP */
+ 185, /* (340) input ::= cmdlist */
+ 186, /* (341) cmdlist ::= cmdlist ecmd */
+ 186, /* (342) cmdlist ::= ecmd */
+ 187, /* (343) ecmd ::= SEMI */
+ 187, /* (344) ecmd ::= cmdx SEMI */
+ 187, /* (345) ecmd ::= explain cmdx SEMI */
+ 192, /* (346) trans_opt ::= */
+ 192, /* (347) trans_opt ::= TRANSACTION */
+ 192, /* (348) trans_opt ::= TRANSACTION nm */
+ 194, /* (349) savepoint_opt ::= SAVEPOINT */
+ 194, /* (350) savepoint_opt ::= */
+ 190, /* (351) cmd ::= create_table create_table_args */
+ 203, /* (352) table_option_set ::= table_option */
+ 201, /* (353) columnlist ::= columnlist COMMA columnname carglist */
+ 201, /* (354) columnlist ::= columnname carglist */
+ 193, /* (355) nm ::= ID|INDEXED|JOIN_KW */
+ 193, /* (356) nm ::= STRING */
+ 208, /* (357) typetoken ::= typename */
+ 209, /* (358) typename ::= ID|STRING */
+ 210, /* (359) signed ::= plus_num */
+ 210, /* (360) signed ::= minus_num */
+ 207, /* (361) carglist ::= carglist ccons */
+ 207, /* (362) carglist ::= */
+ 215, /* (363) ccons ::= NULL onconf */
+ 215, /* (364) ccons ::= GENERATED ALWAYS AS generated */
+ 215, /* (365) ccons ::= AS generated */
+ 202, /* (366) conslist_opt ::= COMMA conslist */
+ 228, /* (367) conslist ::= conslist tconscomma tcons */
+ 228, /* (368) conslist ::= tcons */
+ 229, /* (369) tconscomma ::= */
+ 233, /* (370) defer_subclause_opt ::= defer_subclause */
+ 235, /* (371) resolvetype ::= raisetype */
+ 239, /* (372) selectnowith ::= oneselect */
+ 240, /* (373) oneselect ::= values */
+ 254, /* (374) sclp ::= selcollist COMMA */
+ 255, /* (375) as ::= ID|STRING */
+ 264, /* (376) indexed_opt ::= indexed_by */
+ 272, /* (377) returning ::= */
+ 217, /* (378) expr ::= term */
+ 274, /* (379) likeop ::= LIKE_KW|MATCH */
+ 278, /* (380) case_operand ::= expr */
+ 261, /* (381) exprlist ::= nexprlist */
+ 284, /* (382) nmnum ::= plus_num */
+ 284, /* (383) nmnum ::= nm */
+ 284, /* (384) nmnum ::= ON */
+ 284, /* (385) nmnum ::= DELETE */
+ 284, /* (386) nmnum ::= DEFAULT */
+ 211, /* (387) plus_num ::= INTEGER|FLOAT */
+ 289, /* (388) foreach_clause ::= */
+ 289, /* (389) foreach_clause ::= FOR EACH ROW */
+ 292, /* (390) trnm ::= nm */
+ 293, /* (391) tridxby ::= */
+ 294, /* (392) database_kw_opt ::= DATABASE */
+ 294, /* (393) database_kw_opt ::= */
+ 297, /* (394) kwcolumn_opt ::= */
+ 297, /* (395) kwcolumn_opt ::= COLUMNKW */
+ 299, /* (396) vtabarglist ::= vtabarg */
+ 299, /* (397) vtabarglist ::= vtabarglist COMMA vtabarg */
+ 300, /* (398) vtabarg ::= vtabarg vtabargtoken */
+ 303, /* (399) anylist ::= */
+ 303, /* (400) anylist ::= anylist LP anylist RP */
+ 303, /* (401) anylist ::= anylist ANY */
+ 266, /* (402) with ::= */
};
/* For rule J, yyRuleInfoNRhs[J] contains the negative of the number
@@ -161122,385 +170872,390 @@ static const signed char yyRuleInfoNRhs[] = {
-3, /* (16) ifnotexists ::= IF NOT EXISTS */
-1, /* (17) temp ::= TEMP */
0, /* (18) temp ::= */
- -5, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */
+ -5, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_option_set */
-2, /* (20) create_table_args ::= AS select */
- 0, /* (21) table_options ::= */
- -2, /* (22) table_options ::= WITHOUT nm */
- -2, /* (23) columnname ::= nm typetoken */
- 0, /* (24) typetoken ::= */
- -4, /* (25) typetoken ::= typename LP signed RP */
- -6, /* (26) typetoken ::= typename LP signed COMMA signed RP */
- -2, /* (27) typename ::= typename ID|STRING */
- 0, /* (28) scanpt ::= */
- 0, /* (29) scantok ::= */
- -2, /* (30) ccons ::= CONSTRAINT nm */
- -3, /* (31) ccons ::= DEFAULT scantok term */
- -4, /* (32) ccons ::= DEFAULT LP expr RP */
- -4, /* (33) ccons ::= DEFAULT PLUS scantok term */
- -4, /* (34) ccons ::= DEFAULT MINUS scantok term */
- -3, /* (35) ccons ::= DEFAULT scantok ID|INDEXED */
- -3, /* (36) ccons ::= NOT NULL onconf */
- -5, /* (37) ccons ::= PRIMARY KEY sortorder onconf autoinc */
- -2, /* (38) ccons ::= UNIQUE onconf */
- -4, /* (39) ccons ::= CHECK LP expr RP */
- -4, /* (40) ccons ::= REFERENCES nm eidlist_opt refargs */
- -1, /* (41) ccons ::= defer_subclause */
- -2, /* (42) ccons ::= COLLATE ID|STRING */
- -3, /* (43) generated ::= LP expr RP */
- -4, /* (44) generated ::= LP expr RP ID */
- 0, /* (45) autoinc ::= */
- -1, /* (46) autoinc ::= AUTOINCR */
- 0, /* (47) refargs ::= */
- -2, /* (48) refargs ::= refargs refarg */
- -2, /* (49) refarg ::= MATCH nm */
- -3, /* (50) refarg ::= ON INSERT refact */
- -3, /* (51) refarg ::= ON DELETE refact */
- -3, /* (52) refarg ::= ON UPDATE refact */
- -2, /* (53) refact ::= SET NULL */
- -2, /* (54) refact ::= SET DEFAULT */
- -1, /* (55) refact ::= CASCADE */
- -1, /* (56) refact ::= RESTRICT */
- -2, /* (57) refact ::= NO ACTION */
- -3, /* (58) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
- -2, /* (59) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
- 0, /* (60) init_deferred_pred_opt ::= */
- -2, /* (61) init_deferred_pred_opt ::= INITIALLY DEFERRED */
- -2, /* (62) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
- 0, /* (63) conslist_opt ::= */
- -1, /* (64) tconscomma ::= COMMA */
- -2, /* (65) tcons ::= CONSTRAINT nm */
- -7, /* (66) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
- -5, /* (67) tcons ::= UNIQUE LP sortlist RP onconf */
- -5, /* (68) tcons ::= CHECK LP expr RP onconf */
- -10, /* (69) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
- 0, /* (70) defer_subclause_opt ::= */
- 0, /* (71) onconf ::= */
- -3, /* (72) onconf ::= ON CONFLICT resolvetype */
- 0, /* (73) orconf ::= */
- -2, /* (74) orconf ::= OR resolvetype */
- -1, /* (75) resolvetype ::= IGNORE */
- -1, /* (76) resolvetype ::= REPLACE */
- -4, /* (77) cmd ::= DROP TABLE ifexists fullname */
- -2, /* (78) ifexists ::= IF EXISTS */
- 0, /* (79) ifexists ::= */
- -9, /* (80) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
- -4, /* (81) cmd ::= DROP VIEW ifexists fullname */
- -1, /* (82) cmd ::= select */
- -3, /* (83) select ::= WITH wqlist selectnowith */
- -4, /* (84) select ::= WITH RECURSIVE wqlist selectnowith */
- -1, /* (85) select ::= selectnowith */
- -3, /* (86) selectnowith ::= selectnowith multiselect_op oneselect */
- -1, /* (87) multiselect_op ::= UNION */
- -2, /* (88) multiselect_op ::= UNION ALL */
- -1, /* (89) multiselect_op ::= EXCEPT|INTERSECT */
- -9, /* (90) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
- -10, /* (91) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */
- -4, /* (92) values ::= VALUES LP nexprlist RP */
- -5, /* (93) values ::= values COMMA LP nexprlist RP */
- -1, /* (94) distinct ::= DISTINCT */
- -1, /* (95) distinct ::= ALL */
- 0, /* (96) distinct ::= */
- 0, /* (97) sclp ::= */
- -5, /* (98) selcollist ::= sclp scanpt expr scanpt as */
- -3, /* (99) selcollist ::= sclp scanpt STAR */
- -5, /* (100) selcollist ::= sclp scanpt nm DOT STAR */
- -2, /* (101) as ::= AS nm */
- 0, /* (102) as ::= */
- 0, /* (103) from ::= */
- -2, /* (104) from ::= FROM seltablist */
- -2, /* (105) stl_prefix ::= seltablist joinop */
- 0, /* (106) stl_prefix ::= */
- -7, /* (107) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
- -9, /* (108) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
- -7, /* (109) seltablist ::= stl_prefix LP select RP as on_opt using_opt */
- -7, /* (110) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
- 0, /* (111) dbnm ::= */
- -2, /* (112) dbnm ::= DOT nm */
- -1, /* (113) fullname ::= nm */
- -3, /* (114) fullname ::= nm DOT nm */
- -1, /* (115) xfullname ::= nm */
- -3, /* (116) xfullname ::= nm DOT nm */
- -5, /* (117) xfullname ::= nm DOT nm AS nm */
- -3, /* (118) xfullname ::= nm AS nm */
- -1, /* (119) joinop ::= COMMA|JOIN */
- -2, /* (120) joinop ::= JOIN_KW JOIN */
- -3, /* (121) joinop ::= JOIN_KW nm JOIN */
- -4, /* (122) joinop ::= JOIN_KW nm nm JOIN */
- -2, /* (123) on_opt ::= ON expr */
- 0, /* (124) on_opt ::= */
- 0, /* (125) indexed_opt ::= */
- -3, /* (126) indexed_opt ::= INDEXED BY nm */
- -2, /* (127) indexed_opt ::= NOT INDEXED */
- -4, /* (128) using_opt ::= USING LP idlist RP */
- 0, /* (129) using_opt ::= */
- 0, /* (130) orderby_opt ::= */
- -3, /* (131) orderby_opt ::= ORDER BY sortlist */
- -5, /* (132) sortlist ::= sortlist COMMA expr sortorder nulls */
- -3, /* (133) sortlist ::= expr sortorder nulls */
- -1, /* (134) sortorder ::= ASC */
- -1, /* (135) sortorder ::= DESC */
- 0, /* (136) sortorder ::= */
- -2, /* (137) nulls ::= NULLS FIRST */
- -2, /* (138) nulls ::= NULLS LAST */
- 0, /* (139) nulls ::= */
- 0, /* (140) groupby_opt ::= */
- -3, /* (141) groupby_opt ::= GROUP BY nexprlist */
- 0, /* (142) having_opt ::= */
- -2, /* (143) having_opt ::= HAVING expr */
- 0, /* (144) limit_opt ::= */
- -2, /* (145) limit_opt ::= LIMIT expr */
- -4, /* (146) limit_opt ::= LIMIT expr OFFSET expr */
- -4, /* (147) limit_opt ::= LIMIT expr COMMA expr */
- -6, /* (148) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */
- 0, /* (149) where_opt ::= */
- -2, /* (150) where_opt ::= WHERE expr */
- 0, /* (151) where_opt_ret ::= */
- -2, /* (152) where_opt_ret ::= WHERE expr */
- -2, /* (153) where_opt_ret ::= RETURNING selcollist */
- -4, /* (154) where_opt_ret ::= WHERE expr RETURNING selcollist */
- -9, /* (155) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */
- -5, /* (156) setlist ::= setlist COMMA nm EQ expr */
- -7, /* (157) setlist ::= setlist COMMA LP idlist RP EQ expr */
- -3, /* (158) setlist ::= nm EQ expr */
- -5, /* (159) setlist ::= LP idlist RP EQ expr */
- -7, /* (160) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
- -8, /* (161) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */
- 0, /* (162) upsert ::= */
- -2, /* (163) upsert ::= RETURNING selcollist */
- -12, /* (164) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */
- -9, /* (165) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */
- -5, /* (166) upsert ::= ON CONFLICT DO NOTHING returning */
- -8, /* (167) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */
- -2, /* (168) returning ::= RETURNING selcollist */
- -2, /* (169) insert_cmd ::= INSERT orconf */
- -1, /* (170) insert_cmd ::= REPLACE */
- 0, /* (171) idlist_opt ::= */
- -3, /* (172) idlist_opt ::= LP idlist RP */
- -3, /* (173) idlist ::= idlist COMMA nm */
- -1, /* (174) idlist ::= nm */
- -3, /* (175) expr ::= LP expr RP */
- -1, /* (176) expr ::= ID|INDEXED */
- -1, /* (177) expr ::= JOIN_KW */
- -3, /* (178) expr ::= nm DOT nm */
- -5, /* (179) expr ::= nm DOT nm DOT nm */
- -1, /* (180) term ::= NULL|FLOAT|BLOB */
- -1, /* (181) term ::= STRING */
- -1, /* (182) term ::= INTEGER */
- -1, /* (183) expr ::= VARIABLE */
- -3, /* (184) expr ::= expr COLLATE ID|STRING */
- -6, /* (185) expr ::= CAST LP expr AS typetoken RP */
- -5, /* (186) expr ::= ID|INDEXED LP distinct exprlist RP */
- -4, /* (187) expr ::= ID|INDEXED LP STAR RP */
- -6, /* (188) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */
- -5, /* (189) expr ::= ID|INDEXED LP STAR RP filter_over */
- -1, /* (190) term ::= CTIME_KW */
- -5, /* (191) expr ::= LP nexprlist COMMA expr RP */
- -3, /* (192) expr ::= expr AND expr */
- -3, /* (193) expr ::= expr OR expr */
- -3, /* (194) expr ::= expr LT|GT|GE|LE expr */
- -3, /* (195) expr ::= expr EQ|NE expr */
- -3, /* (196) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
- -3, /* (197) expr ::= expr PLUS|MINUS expr */
- -3, /* (198) expr ::= expr STAR|SLASH|REM expr */
- -3, /* (199) expr ::= expr CONCAT expr */
- -2, /* (200) likeop ::= NOT LIKE_KW|MATCH */
- -3, /* (201) expr ::= expr likeop expr */
- -5, /* (202) expr ::= expr likeop expr ESCAPE expr */
- -2, /* (203) expr ::= expr ISNULL|NOTNULL */
- -3, /* (204) expr ::= expr NOT NULL */
- -3, /* (205) expr ::= expr IS expr */
- -4, /* (206) expr ::= expr IS NOT expr */
- -2, /* (207) expr ::= NOT expr */
- -2, /* (208) expr ::= BITNOT expr */
- -2, /* (209) expr ::= PLUS|MINUS expr */
- -1, /* (210) between_op ::= BETWEEN */
- -2, /* (211) between_op ::= NOT BETWEEN */
- -5, /* (212) expr ::= expr between_op expr AND expr */
- -1, /* (213) in_op ::= IN */
- -2, /* (214) in_op ::= NOT IN */
- -5, /* (215) expr ::= expr in_op LP exprlist RP */
- -3, /* (216) expr ::= LP select RP */
- -5, /* (217) expr ::= expr in_op LP select RP */
- -5, /* (218) expr ::= expr in_op nm dbnm paren_exprlist */
- -4, /* (219) expr ::= EXISTS LP select RP */
- -5, /* (220) expr ::= CASE case_operand case_exprlist case_else END */
- -5, /* (221) case_exprlist ::= case_exprlist WHEN expr THEN expr */
- -4, /* (222) case_exprlist ::= WHEN expr THEN expr */
- -2, /* (223) case_else ::= ELSE expr */
- 0, /* (224) case_else ::= */
- -1, /* (225) case_operand ::= expr */
- 0, /* (226) case_operand ::= */
- 0, /* (227) exprlist ::= */
- -3, /* (228) nexprlist ::= nexprlist COMMA expr */
- -1, /* (229) nexprlist ::= expr */
- 0, /* (230) paren_exprlist ::= */
- -3, /* (231) paren_exprlist ::= LP exprlist RP */
- -12, /* (232) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
- -1, /* (233) uniqueflag ::= UNIQUE */
- 0, /* (234) uniqueflag ::= */
- 0, /* (235) eidlist_opt ::= */
- -3, /* (236) eidlist_opt ::= LP eidlist RP */
- -5, /* (237) eidlist ::= eidlist COMMA nm collate sortorder */
- -3, /* (238) eidlist ::= nm collate sortorder */
- 0, /* (239) collate ::= */
- -2, /* (240) collate ::= COLLATE ID|STRING */
- -4, /* (241) cmd ::= DROP INDEX ifexists fullname */
- -2, /* (242) cmd ::= VACUUM vinto */
- -3, /* (243) cmd ::= VACUUM nm vinto */
- -2, /* (244) vinto ::= INTO expr */
- 0, /* (245) vinto ::= */
- -3, /* (246) cmd ::= PRAGMA nm dbnm */
- -5, /* (247) cmd ::= PRAGMA nm dbnm EQ nmnum */
- -6, /* (248) cmd ::= PRAGMA nm dbnm LP nmnum RP */
- -5, /* (249) cmd ::= PRAGMA nm dbnm EQ minus_num */
- -6, /* (250) cmd ::= PRAGMA nm dbnm LP minus_num RP */
- -2, /* (251) plus_num ::= PLUS INTEGER|FLOAT */
- -2, /* (252) minus_num ::= MINUS INTEGER|FLOAT */
- -5, /* (253) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
- -11, /* (254) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
- -1, /* (255) trigger_time ::= BEFORE|AFTER */
- -2, /* (256) trigger_time ::= INSTEAD OF */
- 0, /* (257) trigger_time ::= */
- -1, /* (258) trigger_event ::= DELETE|INSERT */
- -1, /* (259) trigger_event ::= UPDATE */
- -3, /* (260) trigger_event ::= UPDATE OF idlist */
- 0, /* (261) when_clause ::= */
- -2, /* (262) when_clause ::= WHEN expr */
- -3, /* (263) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
- -2, /* (264) trigger_cmd_list ::= trigger_cmd SEMI */
- -3, /* (265) trnm ::= nm DOT nm */
- -3, /* (266) tridxby ::= INDEXED BY nm */
- -2, /* (267) tridxby ::= NOT INDEXED */
- -9, /* (268) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */
- -8, /* (269) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */
- -6, /* (270) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
- -3, /* (271) trigger_cmd ::= scanpt select scanpt */
- -4, /* (272) expr ::= RAISE LP IGNORE RP */
- -6, /* (273) expr ::= RAISE LP raisetype COMMA nm RP */
- -1, /* (274) raisetype ::= ROLLBACK */
- -1, /* (275) raisetype ::= ABORT */
- -1, /* (276) raisetype ::= FAIL */
- -4, /* (277) cmd ::= DROP TRIGGER ifexists fullname */
- -6, /* (278) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
- -3, /* (279) cmd ::= DETACH database_kw_opt expr */
- 0, /* (280) key_opt ::= */
- -2, /* (281) key_opt ::= KEY expr */
- -1, /* (282) cmd ::= REINDEX */
- -3, /* (283) cmd ::= REINDEX nm dbnm */
- -1, /* (284) cmd ::= ANALYZE */
- -3, /* (285) cmd ::= ANALYZE nm dbnm */
- -6, /* (286) cmd ::= ALTER TABLE fullname RENAME TO nm */
- -7, /* (287) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
- -6, /* (288) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */
- -1, /* (289) add_column_fullname ::= fullname */
- -8, /* (290) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */
- -1, /* (291) cmd ::= create_vtab */
- -4, /* (292) cmd ::= create_vtab LP vtabarglist RP */
- -8, /* (293) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
- 0, /* (294) vtabarg ::= */
- -1, /* (295) vtabargtoken ::= ANY */
- -3, /* (296) vtabargtoken ::= lp anylist RP */
- -1, /* (297) lp ::= LP */
- -2, /* (298) with ::= WITH wqlist */
- -3, /* (299) with ::= WITH RECURSIVE wqlist */
- -1, /* (300) wqas ::= AS */
- -2, /* (301) wqas ::= AS MATERIALIZED */
- -3, /* (302) wqas ::= AS NOT MATERIALIZED */
- -6, /* (303) wqitem ::= nm eidlist_opt wqas LP select RP */
- -1, /* (304) wqlist ::= wqitem */
- -3, /* (305) wqlist ::= wqlist COMMA wqitem */
- -1, /* (306) windowdefn_list ::= windowdefn */
- -3, /* (307) windowdefn_list ::= windowdefn_list COMMA windowdefn */
- -5, /* (308) windowdefn ::= nm AS LP window RP */
- -5, /* (309) window ::= PARTITION BY nexprlist orderby_opt frame_opt */
- -6, /* (310) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */
- -4, /* (311) window ::= ORDER BY sortlist frame_opt */
- -5, /* (312) window ::= nm ORDER BY sortlist frame_opt */
- -1, /* (313) window ::= frame_opt */
- -2, /* (314) window ::= nm frame_opt */
- 0, /* (315) frame_opt ::= */
- -3, /* (316) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */
- -6, /* (317) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */
- -1, /* (318) range_or_rows ::= RANGE|ROWS|GROUPS */
- -1, /* (319) frame_bound_s ::= frame_bound */
- -2, /* (320) frame_bound_s ::= UNBOUNDED PRECEDING */
- -1, /* (321) frame_bound_e ::= frame_bound */
- -2, /* (322) frame_bound_e ::= UNBOUNDED FOLLOWING */
- -2, /* (323) frame_bound ::= expr PRECEDING|FOLLOWING */
- -2, /* (324) frame_bound ::= CURRENT ROW */
- 0, /* (325) frame_exclude_opt ::= */
- -2, /* (326) frame_exclude_opt ::= EXCLUDE frame_exclude */
- -2, /* (327) frame_exclude ::= NO OTHERS */
- -2, /* (328) frame_exclude ::= CURRENT ROW */
- -1, /* (329) frame_exclude ::= GROUP|TIES */
- -2, /* (330) window_clause ::= WINDOW windowdefn_list */
- -2, /* (331) filter_over ::= filter_clause over_clause */
- -1, /* (332) filter_over ::= over_clause */
- -1, /* (333) filter_over ::= filter_clause */
- -4, /* (334) over_clause ::= OVER LP window RP */
- -2, /* (335) over_clause ::= OVER nm */
- -5, /* (336) filter_clause ::= FILTER LP WHERE expr RP */
- -1, /* (337) input ::= cmdlist */
- -2, /* (338) cmdlist ::= cmdlist ecmd */
- -1, /* (339) cmdlist ::= ecmd */
- -1, /* (340) ecmd ::= SEMI */
- -2, /* (341) ecmd ::= cmdx SEMI */
- -3, /* (342) ecmd ::= explain cmdx SEMI */
- 0, /* (343) trans_opt ::= */
- -1, /* (344) trans_opt ::= TRANSACTION */
- -2, /* (345) trans_opt ::= TRANSACTION nm */
- -1, /* (346) savepoint_opt ::= SAVEPOINT */
- 0, /* (347) savepoint_opt ::= */
- -2, /* (348) cmd ::= create_table create_table_args */
- -4, /* (349) columnlist ::= columnlist COMMA columnname carglist */
- -2, /* (350) columnlist ::= columnname carglist */
- -1, /* (351) nm ::= ID|INDEXED */
- -1, /* (352) nm ::= STRING */
- -1, /* (353) nm ::= JOIN_KW */
- -1, /* (354) typetoken ::= typename */
- -1, /* (355) typename ::= ID|STRING */
- -1, /* (356) signed ::= plus_num */
- -1, /* (357) signed ::= minus_num */
- -2, /* (358) carglist ::= carglist ccons */
- 0, /* (359) carglist ::= */
- -2, /* (360) ccons ::= NULL onconf */
- -4, /* (361) ccons ::= GENERATED ALWAYS AS generated */
- -2, /* (362) ccons ::= AS generated */
- -2, /* (363) conslist_opt ::= COMMA conslist */
- -3, /* (364) conslist ::= conslist tconscomma tcons */
- -1, /* (365) conslist ::= tcons */
- 0, /* (366) tconscomma ::= */
- -1, /* (367) defer_subclause_opt ::= defer_subclause */
- -1, /* (368) resolvetype ::= raisetype */
- -1, /* (369) selectnowith ::= oneselect */
- -1, /* (370) oneselect ::= values */
- -2, /* (371) sclp ::= selcollist COMMA */
- -1, /* (372) as ::= ID|STRING */
- 0, /* (373) returning ::= */
- -1, /* (374) expr ::= term */
- -1, /* (375) likeop ::= LIKE_KW|MATCH */
- -1, /* (376) exprlist ::= nexprlist */
- -1, /* (377) nmnum ::= plus_num */
- -1, /* (378) nmnum ::= nm */
- -1, /* (379) nmnum ::= ON */
- -1, /* (380) nmnum ::= DELETE */
- -1, /* (381) nmnum ::= DEFAULT */
- -1, /* (382) plus_num ::= INTEGER|FLOAT */
- 0, /* (383) foreach_clause ::= */
- -3, /* (384) foreach_clause ::= FOR EACH ROW */
- -1, /* (385) trnm ::= nm */
- 0, /* (386) tridxby ::= */
- -1, /* (387) database_kw_opt ::= DATABASE */
- 0, /* (388) database_kw_opt ::= */
- 0, /* (389) kwcolumn_opt ::= */
- -1, /* (390) kwcolumn_opt ::= COLUMNKW */
- -1, /* (391) vtabarglist ::= vtabarg */
- -3, /* (392) vtabarglist ::= vtabarglist COMMA vtabarg */
- -2, /* (393) vtabarg ::= vtabarg vtabargtoken */
- 0, /* (394) anylist ::= */
- -4, /* (395) anylist ::= anylist LP anylist RP */
- -2, /* (396) anylist ::= anylist ANY */
- 0, /* (397) with ::= */
+ 0, /* (21) table_option_set ::= */
+ -3, /* (22) table_option_set ::= table_option_set COMMA table_option */
+ -2, /* (23) table_option ::= WITHOUT nm */
+ -1, /* (24) table_option ::= nm */
+ -2, /* (25) columnname ::= nm typetoken */
+ 0, /* (26) typetoken ::= */
+ -4, /* (27) typetoken ::= typename LP signed RP */
+ -6, /* (28) typetoken ::= typename LP signed COMMA signed RP */
+ -2, /* (29) typename ::= typename ID|STRING */
+ 0, /* (30) scanpt ::= */
+ 0, /* (31) scantok ::= */
+ -2, /* (32) ccons ::= CONSTRAINT nm */
+ -3, /* (33) ccons ::= DEFAULT scantok term */
+ -4, /* (34) ccons ::= DEFAULT LP expr RP */
+ -4, /* (35) ccons ::= DEFAULT PLUS scantok term */
+ -4, /* (36) ccons ::= DEFAULT MINUS scantok term */
+ -3, /* (37) ccons ::= DEFAULT scantok ID|INDEXED */
+ -3, /* (38) ccons ::= NOT NULL onconf */
+ -5, /* (39) ccons ::= PRIMARY KEY sortorder onconf autoinc */
+ -2, /* (40) ccons ::= UNIQUE onconf */
+ -4, /* (41) ccons ::= CHECK LP expr RP */
+ -4, /* (42) ccons ::= REFERENCES nm eidlist_opt refargs */
+ -1, /* (43) ccons ::= defer_subclause */
+ -2, /* (44) ccons ::= COLLATE ID|STRING */
+ -3, /* (45) generated ::= LP expr RP */
+ -4, /* (46) generated ::= LP expr RP ID */
+ 0, /* (47) autoinc ::= */
+ -1, /* (48) autoinc ::= AUTOINCR */
+ 0, /* (49) refargs ::= */
+ -2, /* (50) refargs ::= refargs refarg */
+ -2, /* (51) refarg ::= MATCH nm */
+ -3, /* (52) refarg ::= ON INSERT refact */
+ -3, /* (53) refarg ::= ON DELETE refact */
+ -3, /* (54) refarg ::= ON UPDATE refact */
+ -2, /* (55) refact ::= SET NULL */
+ -2, /* (56) refact ::= SET DEFAULT */
+ -1, /* (57) refact ::= CASCADE */
+ -1, /* (58) refact ::= RESTRICT */
+ -2, /* (59) refact ::= NO ACTION */
+ -3, /* (60) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
+ -2, /* (61) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
+ 0, /* (62) init_deferred_pred_opt ::= */
+ -2, /* (63) init_deferred_pred_opt ::= INITIALLY DEFERRED */
+ -2, /* (64) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
+ 0, /* (65) conslist_opt ::= */
+ -1, /* (66) tconscomma ::= COMMA */
+ -2, /* (67) tcons ::= CONSTRAINT nm */
+ -7, /* (68) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
+ -5, /* (69) tcons ::= UNIQUE LP sortlist RP onconf */
+ -5, /* (70) tcons ::= CHECK LP expr RP onconf */
+ -10, /* (71) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
+ 0, /* (72) defer_subclause_opt ::= */
+ 0, /* (73) onconf ::= */
+ -3, /* (74) onconf ::= ON CONFLICT resolvetype */
+ 0, /* (75) orconf ::= */
+ -2, /* (76) orconf ::= OR resolvetype */
+ -1, /* (77) resolvetype ::= IGNORE */
+ -1, /* (78) resolvetype ::= REPLACE */
+ -4, /* (79) cmd ::= DROP TABLE ifexists fullname */
+ -2, /* (80) ifexists ::= IF EXISTS */
+ 0, /* (81) ifexists ::= */
+ -9, /* (82) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
+ -4, /* (83) cmd ::= DROP VIEW ifexists fullname */
+ -1, /* (84) cmd ::= select */
+ -3, /* (85) select ::= WITH wqlist selectnowith */
+ -4, /* (86) select ::= WITH RECURSIVE wqlist selectnowith */
+ -1, /* (87) select ::= selectnowith */
+ -3, /* (88) selectnowith ::= selectnowith multiselect_op oneselect */
+ -1, /* (89) multiselect_op ::= UNION */
+ -2, /* (90) multiselect_op ::= UNION ALL */
+ -1, /* (91) multiselect_op ::= EXCEPT|INTERSECT */
+ -9, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+ -10, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */
+ -4, /* (94) values ::= VALUES LP nexprlist RP */
+ -5, /* (95) values ::= values COMMA LP nexprlist RP */
+ -1, /* (96) distinct ::= DISTINCT */
+ -1, /* (97) distinct ::= ALL */
+ 0, /* (98) distinct ::= */
+ 0, /* (99) sclp ::= */
+ -5, /* (100) selcollist ::= sclp scanpt expr scanpt as */
+ -3, /* (101) selcollist ::= sclp scanpt STAR */
+ -5, /* (102) selcollist ::= sclp scanpt nm DOT STAR */
+ -2, /* (103) as ::= AS nm */
+ 0, /* (104) as ::= */
+ 0, /* (105) from ::= */
+ -2, /* (106) from ::= FROM seltablist */
+ -2, /* (107) stl_prefix ::= seltablist joinop */
+ 0, /* (108) stl_prefix ::= */
+ -5, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */
+ -6, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */
+ -8, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */
+ -6, /* (112) seltablist ::= stl_prefix LP select RP as on_using */
+ -6, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */
+ 0, /* (114) dbnm ::= */
+ -2, /* (115) dbnm ::= DOT nm */
+ -1, /* (116) fullname ::= nm */
+ -3, /* (117) fullname ::= nm DOT nm */
+ -1, /* (118) xfullname ::= nm */
+ -3, /* (119) xfullname ::= nm DOT nm */
+ -5, /* (120) xfullname ::= nm DOT nm AS nm */
+ -3, /* (121) xfullname ::= nm AS nm */
+ -1, /* (122) joinop ::= COMMA|JOIN */
+ -2, /* (123) joinop ::= JOIN_KW JOIN */
+ -3, /* (124) joinop ::= JOIN_KW nm JOIN */
+ -4, /* (125) joinop ::= JOIN_KW nm nm JOIN */
+ -2, /* (126) on_using ::= ON expr */
+ -4, /* (127) on_using ::= USING LP idlist RP */
+ 0, /* (128) on_using ::= */
+ 0, /* (129) indexed_opt ::= */
+ -3, /* (130) indexed_by ::= INDEXED BY nm */
+ -2, /* (131) indexed_by ::= NOT INDEXED */
+ 0, /* (132) orderby_opt ::= */
+ -3, /* (133) orderby_opt ::= ORDER BY sortlist */
+ -5, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */
+ -3, /* (135) sortlist ::= expr sortorder nulls */
+ -1, /* (136) sortorder ::= ASC */
+ -1, /* (137) sortorder ::= DESC */
+ 0, /* (138) sortorder ::= */
+ -2, /* (139) nulls ::= NULLS FIRST */
+ -2, /* (140) nulls ::= NULLS LAST */
+ 0, /* (141) nulls ::= */
+ 0, /* (142) groupby_opt ::= */
+ -3, /* (143) groupby_opt ::= GROUP BY nexprlist */
+ 0, /* (144) having_opt ::= */
+ -2, /* (145) having_opt ::= HAVING expr */
+ 0, /* (146) limit_opt ::= */
+ -2, /* (147) limit_opt ::= LIMIT expr */
+ -4, /* (148) limit_opt ::= LIMIT expr OFFSET expr */
+ -4, /* (149) limit_opt ::= LIMIT expr COMMA expr */
+ -6, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */
+ 0, /* (151) where_opt ::= */
+ -2, /* (152) where_opt ::= WHERE expr */
+ 0, /* (153) where_opt_ret ::= */
+ -2, /* (154) where_opt_ret ::= WHERE expr */
+ -2, /* (155) where_opt_ret ::= RETURNING selcollist */
+ -4, /* (156) where_opt_ret ::= WHERE expr RETURNING selcollist */
+ -9, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */
+ -5, /* (158) setlist ::= setlist COMMA nm EQ expr */
+ -7, /* (159) setlist ::= setlist COMMA LP idlist RP EQ expr */
+ -3, /* (160) setlist ::= nm EQ expr */
+ -5, /* (161) setlist ::= LP idlist RP EQ expr */
+ -7, /* (162) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
+ -8, /* (163) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */
+ 0, /* (164) upsert ::= */
+ -2, /* (165) upsert ::= RETURNING selcollist */
+ -12, /* (166) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */
+ -9, /* (167) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */
+ -5, /* (168) upsert ::= ON CONFLICT DO NOTHING returning */
+ -8, /* (169) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */
+ -2, /* (170) returning ::= RETURNING selcollist */
+ -2, /* (171) insert_cmd ::= INSERT orconf */
+ -1, /* (172) insert_cmd ::= REPLACE */
+ 0, /* (173) idlist_opt ::= */
+ -3, /* (174) idlist_opt ::= LP idlist RP */
+ -3, /* (175) idlist ::= idlist COMMA nm */
+ -1, /* (176) idlist ::= nm */
+ -3, /* (177) expr ::= LP expr RP */
+ -1, /* (178) expr ::= ID|INDEXED|JOIN_KW */
+ -3, /* (179) expr ::= nm DOT nm */
+ -5, /* (180) expr ::= nm DOT nm DOT nm */
+ -1, /* (181) term ::= NULL|FLOAT|BLOB */
+ -1, /* (182) term ::= STRING */
+ -1, /* (183) term ::= INTEGER */
+ -1, /* (184) expr ::= VARIABLE */
+ -3, /* (185) expr ::= expr COLLATE ID|STRING */
+ -6, /* (186) expr ::= CAST LP expr AS typetoken RP */
+ -5, /* (187) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP */
+ -4, /* (188) expr ::= ID|INDEXED|JOIN_KW LP STAR RP */
+ -6, /* (189) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over */
+ -5, /* (190) expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over */
+ -1, /* (191) term ::= CTIME_KW */
+ -5, /* (192) expr ::= LP nexprlist COMMA expr RP */
+ -3, /* (193) expr ::= expr AND expr */
+ -3, /* (194) expr ::= expr OR expr */
+ -3, /* (195) expr ::= expr LT|GT|GE|LE expr */
+ -3, /* (196) expr ::= expr EQ|NE expr */
+ -3, /* (197) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
+ -3, /* (198) expr ::= expr PLUS|MINUS expr */
+ -3, /* (199) expr ::= expr STAR|SLASH|REM expr */
+ -3, /* (200) expr ::= expr CONCAT expr */
+ -2, /* (201) likeop ::= NOT LIKE_KW|MATCH */
+ -3, /* (202) expr ::= expr likeop expr */
+ -5, /* (203) expr ::= expr likeop expr ESCAPE expr */
+ -2, /* (204) expr ::= expr ISNULL|NOTNULL */
+ -3, /* (205) expr ::= expr NOT NULL */
+ -3, /* (206) expr ::= expr IS expr */
+ -4, /* (207) expr ::= expr IS NOT expr */
+ -6, /* (208) expr ::= expr IS NOT DISTINCT FROM expr */
+ -5, /* (209) expr ::= expr IS DISTINCT FROM expr */
+ -2, /* (210) expr ::= NOT expr */
+ -2, /* (211) expr ::= BITNOT expr */
+ -2, /* (212) expr ::= PLUS|MINUS expr */
+ -3, /* (213) expr ::= expr PTR expr */
+ -1, /* (214) between_op ::= BETWEEN */
+ -2, /* (215) between_op ::= NOT BETWEEN */
+ -5, /* (216) expr ::= expr between_op expr AND expr */
+ -1, /* (217) in_op ::= IN */
+ -2, /* (218) in_op ::= NOT IN */
+ -5, /* (219) expr ::= expr in_op LP exprlist RP */
+ -3, /* (220) expr ::= LP select RP */
+ -5, /* (221) expr ::= expr in_op LP select RP */
+ -5, /* (222) expr ::= expr in_op nm dbnm paren_exprlist */
+ -4, /* (223) expr ::= EXISTS LP select RP */
+ -5, /* (224) expr ::= CASE case_operand case_exprlist case_else END */
+ -5, /* (225) case_exprlist ::= case_exprlist WHEN expr THEN expr */
+ -4, /* (226) case_exprlist ::= WHEN expr THEN expr */
+ -2, /* (227) case_else ::= ELSE expr */
+ 0, /* (228) case_else ::= */
+ 0, /* (229) case_operand ::= */
+ 0, /* (230) exprlist ::= */
+ -3, /* (231) nexprlist ::= nexprlist COMMA expr */
+ -1, /* (232) nexprlist ::= expr */
+ 0, /* (233) paren_exprlist ::= */
+ -3, /* (234) paren_exprlist ::= LP exprlist RP */
+ -12, /* (235) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+ -1, /* (236) uniqueflag ::= UNIQUE */
+ 0, /* (237) uniqueflag ::= */
+ 0, /* (238) eidlist_opt ::= */
+ -3, /* (239) eidlist_opt ::= LP eidlist RP */
+ -5, /* (240) eidlist ::= eidlist COMMA nm collate sortorder */
+ -3, /* (241) eidlist ::= nm collate sortorder */
+ 0, /* (242) collate ::= */
+ -2, /* (243) collate ::= COLLATE ID|STRING */
+ -4, /* (244) cmd ::= DROP INDEX ifexists fullname */
+ -2, /* (245) cmd ::= VACUUM vinto */
+ -3, /* (246) cmd ::= VACUUM nm vinto */
+ -2, /* (247) vinto ::= INTO expr */
+ 0, /* (248) vinto ::= */
+ -3, /* (249) cmd ::= PRAGMA nm dbnm */
+ -5, /* (250) cmd ::= PRAGMA nm dbnm EQ nmnum */
+ -6, /* (251) cmd ::= PRAGMA nm dbnm LP nmnum RP */
+ -5, /* (252) cmd ::= PRAGMA nm dbnm EQ minus_num */
+ -6, /* (253) cmd ::= PRAGMA nm dbnm LP minus_num RP */
+ -2, /* (254) plus_num ::= PLUS INTEGER|FLOAT */
+ -2, /* (255) minus_num ::= MINUS INTEGER|FLOAT */
+ -5, /* (256) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+ -11, /* (257) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+ -1, /* (258) trigger_time ::= BEFORE|AFTER */
+ -2, /* (259) trigger_time ::= INSTEAD OF */
+ 0, /* (260) trigger_time ::= */
+ -1, /* (261) trigger_event ::= DELETE|INSERT */
+ -1, /* (262) trigger_event ::= UPDATE */
+ -3, /* (263) trigger_event ::= UPDATE OF idlist */
+ 0, /* (264) when_clause ::= */
+ -2, /* (265) when_clause ::= WHEN expr */
+ -3, /* (266) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+ -2, /* (267) trigger_cmd_list ::= trigger_cmd SEMI */
+ -3, /* (268) trnm ::= nm DOT nm */
+ -3, /* (269) tridxby ::= INDEXED BY nm */
+ -2, /* (270) tridxby ::= NOT INDEXED */
+ -9, /* (271) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */
+ -8, /* (272) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */
+ -6, /* (273) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
+ -3, /* (274) trigger_cmd ::= scanpt select scanpt */
+ -4, /* (275) expr ::= RAISE LP IGNORE RP */
+ -6, /* (276) expr ::= RAISE LP raisetype COMMA nm RP */
+ -1, /* (277) raisetype ::= ROLLBACK */
+ -1, /* (278) raisetype ::= ABORT */
+ -1, /* (279) raisetype ::= FAIL */
+ -4, /* (280) cmd ::= DROP TRIGGER ifexists fullname */
+ -6, /* (281) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+ -3, /* (282) cmd ::= DETACH database_kw_opt expr */
+ 0, /* (283) key_opt ::= */
+ -2, /* (284) key_opt ::= KEY expr */
+ -1, /* (285) cmd ::= REINDEX */
+ -3, /* (286) cmd ::= REINDEX nm dbnm */
+ -1, /* (287) cmd ::= ANALYZE */
+ -3, /* (288) cmd ::= ANALYZE nm dbnm */
+ -6, /* (289) cmd ::= ALTER TABLE fullname RENAME TO nm */
+ -7, /* (290) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+ -6, /* (291) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */
+ -1, /* (292) add_column_fullname ::= fullname */
+ -8, /* (293) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */
+ -1, /* (294) cmd ::= create_vtab */
+ -4, /* (295) cmd ::= create_vtab LP vtabarglist RP */
+ -8, /* (296) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+ 0, /* (297) vtabarg ::= */
+ -1, /* (298) vtabargtoken ::= ANY */
+ -3, /* (299) vtabargtoken ::= lp anylist RP */
+ -1, /* (300) lp ::= LP */
+ -2, /* (301) with ::= WITH wqlist */
+ -3, /* (302) with ::= WITH RECURSIVE wqlist */
+ -1, /* (303) wqas ::= AS */
+ -2, /* (304) wqas ::= AS MATERIALIZED */
+ -3, /* (305) wqas ::= AS NOT MATERIALIZED */
+ -6, /* (306) wqitem ::= nm eidlist_opt wqas LP select RP */
+ -1, /* (307) wqlist ::= wqitem */
+ -3, /* (308) wqlist ::= wqlist COMMA wqitem */
+ -1, /* (309) windowdefn_list ::= windowdefn */
+ -3, /* (310) windowdefn_list ::= windowdefn_list COMMA windowdefn */
+ -5, /* (311) windowdefn ::= nm AS LP window RP */
+ -5, /* (312) window ::= PARTITION BY nexprlist orderby_opt frame_opt */
+ -6, /* (313) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */
+ -4, /* (314) window ::= ORDER BY sortlist frame_opt */
+ -5, /* (315) window ::= nm ORDER BY sortlist frame_opt */
+ -1, /* (316) window ::= frame_opt */
+ -2, /* (317) window ::= nm frame_opt */
+ 0, /* (318) frame_opt ::= */
+ -3, /* (319) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */
+ -6, /* (320) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */
+ -1, /* (321) range_or_rows ::= RANGE|ROWS|GROUPS */
+ -1, /* (322) frame_bound_s ::= frame_bound */
+ -2, /* (323) frame_bound_s ::= UNBOUNDED PRECEDING */
+ -1, /* (324) frame_bound_e ::= frame_bound */
+ -2, /* (325) frame_bound_e ::= UNBOUNDED FOLLOWING */
+ -2, /* (326) frame_bound ::= expr PRECEDING|FOLLOWING */
+ -2, /* (327) frame_bound ::= CURRENT ROW */
+ 0, /* (328) frame_exclude_opt ::= */
+ -2, /* (329) frame_exclude_opt ::= EXCLUDE frame_exclude */
+ -2, /* (330) frame_exclude ::= NO OTHERS */
+ -2, /* (331) frame_exclude ::= CURRENT ROW */
+ -1, /* (332) frame_exclude ::= GROUP|TIES */
+ -2, /* (333) window_clause ::= WINDOW windowdefn_list */
+ -2, /* (334) filter_over ::= filter_clause over_clause */
+ -1, /* (335) filter_over ::= over_clause */
+ -1, /* (336) filter_over ::= filter_clause */
+ -4, /* (337) over_clause ::= OVER LP window RP */
+ -2, /* (338) over_clause ::= OVER nm */
+ -5, /* (339) filter_clause ::= FILTER LP WHERE expr RP */
+ -1, /* (340) input ::= cmdlist */
+ -2, /* (341) cmdlist ::= cmdlist ecmd */
+ -1, /* (342) cmdlist ::= ecmd */
+ -1, /* (343) ecmd ::= SEMI */
+ -2, /* (344) ecmd ::= cmdx SEMI */
+ -3, /* (345) ecmd ::= explain cmdx SEMI */
+ 0, /* (346) trans_opt ::= */
+ -1, /* (347) trans_opt ::= TRANSACTION */
+ -2, /* (348) trans_opt ::= TRANSACTION nm */
+ -1, /* (349) savepoint_opt ::= SAVEPOINT */
+ 0, /* (350) savepoint_opt ::= */
+ -2, /* (351) cmd ::= create_table create_table_args */
+ -1, /* (352) table_option_set ::= table_option */
+ -4, /* (353) columnlist ::= columnlist COMMA columnname carglist */
+ -2, /* (354) columnlist ::= columnname carglist */
+ -1, /* (355) nm ::= ID|INDEXED|JOIN_KW */
+ -1, /* (356) nm ::= STRING */
+ -1, /* (357) typetoken ::= typename */
+ -1, /* (358) typename ::= ID|STRING */
+ -1, /* (359) signed ::= plus_num */
+ -1, /* (360) signed ::= minus_num */
+ -2, /* (361) carglist ::= carglist ccons */
+ 0, /* (362) carglist ::= */
+ -2, /* (363) ccons ::= NULL onconf */
+ -4, /* (364) ccons ::= GENERATED ALWAYS AS generated */
+ -2, /* (365) ccons ::= AS generated */
+ -2, /* (366) conslist_opt ::= COMMA conslist */
+ -3, /* (367) conslist ::= conslist tconscomma tcons */
+ -1, /* (368) conslist ::= tcons */
+ 0, /* (369) tconscomma ::= */
+ -1, /* (370) defer_subclause_opt ::= defer_subclause */
+ -1, /* (371) resolvetype ::= raisetype */
+ -1, /* (372) selectnowith ::= oneselect */
+ -1, /* (373) oneselect ::= values */
+ -2, /* (374) sclp ::= selcollist COMMA */
+ -1, /* (375) as ::= ID|STRING */
+ -1, /* (376) indexed_opt ::= indexed_by */
+ 0, /* (377) returning ::= */
+ -1, /* (378) expr ::= term */
+ -1, /* (379) likeop ::= LIKE_KW|MATCH */
+ -1, /* (380) case_operand ::= expr */
+ -1, /* (381) exprlist ::= nexprlist */
+ -1, /* (382) nmnum ::= plus_num */
+ -1, /* (383) nmnum ::= nm */
+ -1, /* (384) nmnum ::= ON */
+ -1, /* (385) nmnum ::= DELETE */
+ -1, /* (386) nmnum ::= DEFAULT */
+ -1, /* (387) plus_num ::= INTEGER|FLOAT */
+ 0, /* (388) foreach_clause ::= */
+ -3, /* (389) foreach_clause ::= FOR EACH ROW */
+ -1, /* (390) trnm ::= nm */
+ 0, /* (391) tridxby ::= */
+ -1, /* (392) database_kw_opt ::= DATABASE */
+ 0, /* (393) database_kw_opt ::= */
+ 0, /* (394) kwcolumn_opt ::= */
+ -1, /* (395) kwcolumn_opt ::= COLUMNKW */
+ -1, /* (396) vtabarglist ::= vtabarg */
+ -3, /* (397) vtabarglist ::= vtabarglist COMMA vtabarg */
+ -2, /* (398) vtabarg ::= vtabarg vtabargtoken */
+ 0, /* (399) anylist ::= */
+ -4, /* (400) anylist ::= anylist LP anylist RP */
+ -2, /* (401) anylist ::= anylist ANY */
+ 0, /* (402) with ::= */
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -161552,16 +171307,16 @@ static YYACTIONTYPE yy_reduce(
{ sqlite3FinishCoding(pParse); }
break;
case 3: /* cmd ::= BEGIN transtype trans_opt */
-{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy376);}
+{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy394);}
break;
case 4: /* transtype ::= */
-{yymsp[1].minor.yy376 = TK_DEFERRED;}
+{yymsp[1].minor.yy394 = TK_DEFERRED;}
break;
case 5: /* transtype ::= DEFERRED */
case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6);
case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7);
- case 318: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==318);
-{yymsp[0].minor.yy376 = yymsp[0].major; /*A-overwrites-X*/}
+ case 321: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==321);
+{yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/}
break;
case 8: /* cmd ::= COMMIT|END trans_opt */
case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9);
@@ -161584,7 +171339,7 @@ static YYACTIONTYPE yy_reduce(
break;
case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */
{
- sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy376,0,0,yymsp[-2].minor.yy376);
+ sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy394,0,0,yymsp[-2].minor.yy394);
}
break;
case 14: /* createkw ::= CREATE */
@@ -161592,95 +171347,112 @@ static YYACTIONTYPE yy_reduce(
break;
case 15: /* ifnotexists ::= */
case 18: /* temp ::= */ yytestcase(yyruleno==18);
- case 21: /* table_options ::= */ yytestcase(yyruleno==21);
- case 45: /* autoinc ::= */ yytestcase(yyruleno==45);
- case 60: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==60);
- case 70: /* defer_subclause_opt ::= */ yytestcase(yyruleno==70);
- case 79: /* ifexists ::= */ yytestcase(yyruleno==79);
- case 96: /* distinct ::= */ yytestcase(yyruleno==96);
- case 239: /* collate ::= */ yytestcase(yyruleno==239);
-{yymsp[1].minor.yy376 = 0;}
+ case 47: /* autoinc ::= */ yytestcase(yyruleno==47);
+ case 62: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==62);
+ case 72: /* defer_subclause_opt ::= */ yytestcase(yyruleno==72);
+ case 81: /* ifexists ::= */ yytestcase(yyruleno==81);
+ case 98: /* distinct ::= */ yytestcase(yyruleno==98);
+ case 242: /* collate ::= */ yytestcase(yyruleno==242);
+{yymsp[1].minor.yy394 = 0;}
break;
case 16: /* ifnotexists ::= IF NOT EXISTS */
-{yymsp[-2].minor.yy376 = 1;}
+{yymsp[-2].minor.yy394 = 1;}
break;
case 17: /* temp ::= TEMP */
-{yymsp[0].minor.yy376 = pParse->db->init.busy==0;}
+{yymsp[0].minor.yy394 = pParse->db->init.busy==0;}
break;
- case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_options */
+ case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_option_set */
{
- sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy376,0);
+ sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy285,0);
}
break;
case 20: /* create_table_args ::= AS select */
{
- sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy81);
- sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy81);
+ sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy47);
+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy47);
}
break;
- case 22: /* table_options ::= WITHOUT nm */
+ case 21: /* table_option_set ::= */
+{yymsp[1].minor.yy285 = 0;}
+ break;
+ case 22: /* table_option_set ::= table_option_set COMMA table_option */
+{yylhsminor.yy285 = yymsp[-2].minor.yy285|yymsp[0].minor.yy285;}
+ yymsp[-2].minor.yy285 = yylhsminor.yy285;
+ break;
+ case 23: /* table_option ::= WITHOUT nm */
{
if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){
- yymsp[-1].minor.yy376 = TF_WithoutRowid | TF_NoVisibleRowid;
+ yymsp[-1].minor.yy285 = TF_WithoutRowid | TF_NoVisibleRowid;
}else{
- yymsp[-1].minor.yy376 = 0;
+ yymsp[-1].minor.yy285 = 0;
sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z);
}
}
break;
- case 23: /* columnname ::= nm typetoken */
-{sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
+ case 24: /* table_option ::= nm */
+{
+ if( yymsp[0].minor.yy0.n==6 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"strict",6)==0 ){
+ yylhsminor.yy285 = TF_Strict;
+ }else{
+ yylhsminor.yy285 = 0;
+ sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z);
+ }
+}
+ yymsp[0].minor.yy285 = yylhsminor.yy285;
+ break;
+ case 25: /* columnname ::= nm typetoken */
+{sqlite3AddColumn(pParse,yymsp[-1].minor.yy0,yymsp[0].minor.yy0);}
break;
- case 24: /* typetoken ::= */
- case 63: /* conslist_opt ::= */ yytestcase(yyruleno==63);
- case 102: /* as ::= */ yytestcase(yyruleno==102);
+ case 26: /* typetoken ::= */
+ case 65: /* conslist_opt ::= */ yytestcase(yyruleno==65);
+ case 104: /* as ::= */ yytestcase(yyruleno==104);
{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;}
break;
- case 25: /* typetoken ::= typename LP signed RP */
+ case 27: /* typetoken ::= typename LP signed RP */
{
yymsp[-3].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z);
}
break;
- case 26: /* typetoken ::= typename LP signed COMMA signed RP */
+ case 28: /* typetoken ::= typename LP signed COMMA signed RP */
{
yymsp[-5].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z);
}
break;
- case 27: /* typename ::= typename ID|STRING */
+ case 29: /* typename ::= typename ID|STRING */
{yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);}
break;
- case 28: /* scanpt ::= */
+ case 30: /* scanpt ::= */
{
assert( yyLookahead!=YYNOCODE );
- yymsp[1].minor.yy504 = yyLookaheadToken.z;
+ yymsp[1].minor.yy522 = yyLookaheadToken.z;
}
break;
- case 29: /* scantok ::= */
+ case 31: /* scantok ::= */
{
assert( yyLookahead!=YYNOCODE );
yymsp[1].minor.yy0 = yyLookaheadToken;
}
break;
- case 30: /* ccons ::= CONSTRAINT nm */
- case 65: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==65);
+ case 32: /* ccons ::= CONSTRAINT nm */
+ case 67: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==67);
{pParse->constraintName = yymsp[0].minor.yy0;}
break;
- case 31: /* ccons ::= DEFAULT scantok term */
-{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy404,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);}
+ case 33: /* ccons ::= DEFAULT scantok term */
+{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy528,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);}
break;
- case 32: /* ccons ::= DEFAULT LP expr RP */
-{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy404,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);}
+ case 34: /* ccons ::= DEFAULT LP expr RP */
+{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy528,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);}
break;
- case 33: /* ccons ::= DEFAULT PLUS scantok term */
-{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy404,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);}
+ case 35: /* ccons ::= DEFAULT PLUS scantok term */
+{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy528,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);}
break;
- case 34: /* ccons ::= DEFAULT MINUS scantok term */
+ case 36: /* ccons ::= DEFAULT MINUS scantok term */
{
- Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy404, 0);
+ Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy528, 0);
sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);
}
break;
- case 35: /* ccons ::= DEFAULT scantok ID|INDEXED */
+ case 37: /* ccons ::= DEFAULT scantok ID|INDEXED */
{
Expr *p = tokenExpr(pParse, TK_STRING, yymsp[0].minor.yy0);
if( p ){
@@ -161690,308 +171462,316 @@ static YYACTIONTYPE yy_reduce(
sqlite3AddDefaultValue(pParse,p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.z+yymsp[0].minor.yy0.n);
}
break;
- case 36: /* ccons ::= NOT NULL onconf */
-{sqlite3AddNotNull(pParse, yymsp[0].minor.yy376);}
+ case 38: /* ccons ::= NOT NULL onconf */
+{sqlite3AddNotNull(pParse, yymsp[0].minor.yy394);}
break;
- case 37: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
-{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy376,yymsp[0].minor.yy376,yymsp[-2].minor.yy376);}
+ case 39: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
+{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy394,yymsp[0].minor.yy394,yymsp[-2].minor.yy394);}
break;
- case 38: /* ccons ::= UNIQUE onconf */
-{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy376,0,0,0,0,
+ case 40: /* ccons ::= UNIQUE onconf */
+{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy394,0,0,0,0,
SQLITE_IDXTYPE_UNIQUE);}
break;
- case 39: /* ccons ::= CHECK LP expr RP */
-{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy404,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy0.z);}
+ case 41: /* ccons ::= CHECK LP expr RP */
+{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy528,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy0.z);}
break;
- case 40: /* ccons ::= REFERENCES nm eidlist_opt refargs */
-{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy70,yymsp[0].minor.yy376);}
+ case 42: /* ccons ::= REFERENCES nm eidlist_opt refargs */
+{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy322,yymsp[0].minor.yy394);}
break;
- case 41: /* ccons ::= defer_subclause */
-{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy376);}
+ case 43: /* ccons ::= defer_subclause */
+{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy394);}
break;
- case 42: /* ccons ::= COLLATE ID|STRING */
+ case 44: /* ccons ::= COLLATE ID|STRING */
{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);}
break;
- case 43: /* generated ::= LP expr RP */
-{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy404,0);}
+ case 45: /* generated ::= LP expr RP */
+{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy528,0);}
break;
- case 44: /* generated ::= LP expr RP ID */
-{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy404,&yymsp[0].minor.yy0);}
+ case 46: /* generated ::= LP expr RP ID */
+{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy528,&yymsp[0].minor.yy0);}
break;
- case 46: /* autoinc ::= AUTOINCR */
-{yymsp[0].minor.yy376 = 1;}
+ case 48: /* autoinc ::= AUTOINCR */
+{yymsp[0].minor.yy394 = 1;}
break;
- case 47: /* refargs ::= */
-{ yymsp[1].minor.yy376 = OE_None*0x0101; /* EV: R-19803-45884 */}
+ case 49: /* refargs ::= */
+{ yymsp[1].minor.yy394 = OE_None*0x0101; /* EV: R-19803-45884 */}
break;
- case 48: /* refargs ::= refargs refarg */
-{ yymsp[-1].minor.yy376 = (yymsp[-1].minor.yy376 & ~yymsp[0].minor.yy139.mask) | yymsp[0].minor.yy139.value; }
+ case 50: /* refargs ::= refargs refarg */
+{ yymsp[-1].minor.yy394 = (yymsp[-1].minor.yy394 & ~yymsp[0].minor.yy231.mask) | yymsp[0].minor.yy231.value; }
break;
- case 49: /* refarg ::= MATCH nm */
-{ yymsp[-1].minor.yy139.value = 0; yymsp[-1].minor.yy139.mask = 0x000000; }
+ case 51: /* refarg ::= MATCH nm */
+{ yymsp[-1].minor.yy231.value = 0; yymsp[-1].minor.yy231.mask = 0x000000; }
break;
- case 50: /* refarg ::= ON INSERT refact */
-{ yymsp[-2].minor.yy139.value = 0; yymsp[-2].minor.yy139.mask = 0x000000; }
+ case 52: /* refarg ::= ON INSERT refact */
+{ yymsp[-2].minor.yy231.value = 0; yymsp[-2].minor.yy231.mask = 0x000000; }
break;
- case 51: /* refarg ::= ON DELETE refact */
-{ yymsp[-2].minor.yy139.value = yymsp[0].minor.yy376; yymsp[-2].minor.yy139.mask = 0x0000ff; }
+ case 53: /* refarg ::= ON DELETE refact */
+{ yymsp[-2].minor.yy231.value = yymsp[0].minor.yy394; yymsp[-2].minor.yy231.mask = 0x0000ff; }
break;
- case 52: /* refarg ::= ON UPDATE refact */
-{ yymsp[-2].minor.yy139.value = yymsp[0].minor.yy376<<8; yymsp[-2].minor.yy139.mask = 0x00ff00; }
+ case 54: /* refarg ::= ON UPDATE refact */
+{ yymsp[-2].minor.yy231.value = yymsp[0].minor.yy394<<8; yymsp[-2].minor.yy231.mask = 0x00ff00; }
break;
- case 53: /* refact ::= SET NULL */
-{ yymsp[-1].minor.yy376 = OE_SetNull; /* EV: R-33326-45252 */}
+ case 55: /* refact ::= SET NULL */
+{ yymsp[-1].minor.yy394 = OE_SetNull; /* EV: R-33326-45252 */}
break;
- case 54: /* refact ::= SET DEFAULT */
-{ yymsp[-1].minor.yy376 = OE_SetDflt; /* EV: R-33326-45252 */}
+ case 56: /* refact ::= SET DEFAULT */
+{ yymsp[-1].minor.yy394 = OE_SetDflt; /* EV: R-33326-45252 */}
break;
- case 55: /* refact ::= CASCADE */
-{ yymsp[0].minor.yy376 = OE_Cascade; /* EV: R-33326-45252 */}
+ case 57: /* refact ::= CASCADE */
+{ yymsp[0].minor.yy394 = OE_Cascade; /* EV: R-33326-45252 */}
break;
- case 56: /* refact ::= RESTRICT */
-{ yymsp[0].minor.yy376 = OE_Restrict; /* EV: R-33326-45252 */}
+ case 58: /* refact ::= RESTRICT */
+{ yymsp[0].minor.yy394 = OE_Restrict; /* EV: R-33326-45252 */}
break;
- case 57: /* refact ::= NO ACTION */
-{ yymsp[-1].minor.yy376 = OE_None; /* EV: R-33326-45252 */}
+ case 59: /* refact ::= NO ACTION */
+{ yymsp[-1].minor.yy394 = OE_None; /* EV: R-33326-45252 */}
break;
- case 58: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
-{yymsp[-2].minor.yy376 = 0;}
+ case 60: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
+{yymsp[-2].minor.yy394 = 0;}
break;
- case 59: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
- case 74: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==74);
- case 169: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==169);
-{yymsp[-1].minor.yy376 = yymsp[0].minor.yy376;}
+ case 61: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
+ case 76: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==76);
+ case 171: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==171);
+{yymsp[-1].minor.yy394 = yymsp[0].minor.yy394;}
break;
- case 61: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
- case 78: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==78);
- case 211: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==211);
- case 214: /* in_op ::= NOT IN */ yytestcase(yyruleno==214);
- case 240: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==240);
-{yymsp[-1].minor.yy376 = 1;}
+ case 63: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
+ case 80: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==80);
+ case 215: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==215);
+ case 218: /* in_op ::= NOT IN */ yytestcase(yyruleno==218);
+ case 243: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==243);
+{yymsp[-1].minor.yy394 = 1;}
break;
- case 62: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
-{yymsp[-1].minor.yy376 = 0;}
+ case 64: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
+{yymsp[-1].minor.yy394 = 0;}
break;
- case 64: /* tconscomma ::= COMMA */
+ case 66: /* tconscomma ::= COMMA */
{pParse->constraintName.n = 0;}
break;
- case 66: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
-{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy70,yymsp[0].minor.yy376,yymsp[-2].minor.yy376,0);}
+ case 68: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */
+{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy322,yymsp[0].minor.yy394,yymsp[-2].minor.yy394,0);}
break;
- case 67: /* tcons ::= UNIQUE LP sortlist RP onconf */
-{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy70,yymsp[0].minor.yy376,0,0,0,0,
+ case 69: /* tcons ::= UNIQUE LP sortlist RP onconf */
+{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy322,yymsp[0].minor.yy394,0,0,0,0,
SQLITE_IDXTYPE_UNIQUE);}
break;
- case 68: /* tcons ::= CHECK LP expr RP onconf */
-{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy404,yymsp[-3].minor.yy0.z,yymsp[-1].minor.yy0.z);}
+ case 70: /* tcons ::= CHECK LP expr RP onconf */
+{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy528,yymsp[-3].minor.yy0.z,yymsp[-1].minor.yy0.z);}
break;
- case 69: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
+ case 71: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */
{
- sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy70, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy70, yymsp[-1].minor.yy376);
- sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy376);
+ sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy322, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[-1].minor.yy394);
+ sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy394);
}
break;
- case 71: /* onconf ::= */
- case 73: /* orconf ::= */ yytestcase(yyruleno==73);
-{yymsp[1].minor.yy376 = OE_Default;}
+ case 73: /* onconf ::= */
+ case 75: /* orconf ::= */ yytestcase(yyruleno==75);
+{yymsp[1].minor.yy394 = OE_Default;}
break;
- case 72: /* onconf ::= ON CONFLICT resolvetype */
-{yymsp[-2].minor.yy376 = yymsp[0].minor.yy376;}
+ case 74: /* onconf ::= ON CONFLICT resolvetype */
+{yymsp[-2].minor.yy394 = yymsp[0].minor.yy394;}
break;
- case 75: /* resolvetype ::= IGNORE */
-{yymsp[0].minor.yy376 = OE_Ignore;}
+ case 77: /* resolvetype ::= IGNORE */
+{yymsp[0].minor.yy394 = OE_Ignore;}
break;
- case 76: /* resolvetype ::= REPLACE */
- case 170: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==170);
-{yymsp[0].minor.yy376 = OE_Replace;}
+ case 78: /* resolvetype ::= REPLACE */
+ case 172: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==172);
+{yymsp[0].minor.yy394 = OE_Replace;}
break;
- case 77: /* cmd ::= DROP TABLE ifexists fullname */
+ case 79: /* cmd ::= DROP TABLE ifexists fullname */
{
- sqlite3DropTable(pParse, yymsp[0].minor.yy153, 0, yymsp[-1].minor.yy376);
+ sqlite3DropTable(pParse, yymsp[0].minor.yy131, 0, yymsp[-1].minor.yy394);
}
break;
- case 80: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
+ case 82: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */
{
- sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy70, yymsp[0].minor.yy81, yymsp[-7].minor.yy376, yymsp[-5].minor.yy376);
+ sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[0].minor.yy47, yymsp[-7].minor.yy394, yymsp[-5].minor.yy394);
}
break;
- case 81: /* cmd ::= DROP VIEW ifexists fullname */
+ case 83: /* cmd ::= DROP VIEW ifexists fullname */
{
- sqlite3DropTable(pParse, yymsp[0].minor.yy153, 1, yymsp[-1].minor.yy376);
+ sqlite3DropTable(pParse, yymsp[0].minor.yy131, 1, yymsp[-1].minor.yy394);
}
break;
- case 82: /* cmd ::= select */
+ case 84: /* cmd ::= select */
{
SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0, 0};
- sqlite3Select(pParse, yymsp[0].minor.yy81, &dest);
- sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy81);
+ sqlite3Select(pParse, yymsp[0].minor.yy47, &dest);
+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy47);
}
break;
- case 83: /* select ::= WITH wqlist selectnowith */
-{yymsp[-2].minor.yy81 = attachWithToSelect(pParse,yymsp[0].minor.yy81,yymsp[-1].minor.yy103);}
+ case 85: /* select ::= WITH wqlist selectnowith */
+{yymsp[-2].minor.yy47 = attachWithToSelect(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy521);}
break;
- case 84: /* select ::= WITH RECURSIVE wqlist selectnowith */
-{yymsp[-3].minor.yy81 = attachWithToSelect(pParse,yymsp[0].minor.yy81,yymsp[-1].minor.yy103);}
+ case 86: /* select ::= WITH RECURSIVE wqlist selectnowith */
+{yymsp[-3].minor.yy47 = attachWithToSelect(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy521);}
break;
- case 85: /* select ::= selectnowith */
+ case 87: /* select ::= selectnowith */
{
- Select *p = yymsp[0].minor.yy81;
+ Select *p = yymsp[0].minor.yy47;
if( p ){
parserDoubleLinkSelect(pParse, p);
}
- yymsp[0].minor.yy81 = p; /*A-overwrites-X*/
+ yymsp[0].minor.yy47 = p; /*A-overwrites-X*/
}
break;
- case 86: /* selectnowith ::= selectnowith multiselect_op oneselect */
+ case 88: /* selectnowith ::= selectnowith multiselect_op oneselect */
{
- Select *pRhs = yymsp[0].minor.yy81;
- Select *pLhs = yymsp[-2].minor.yy81;
+ Select *pRhs = yymsp[0].minor.yy47;
+ Select *pLhs = yymsp[-2].minor.yy47;
if( pRhs && pRhs->pPrior ){
SrcList *pFrom;
Token x;
x.n = 0;
parserDoubleLinkSelect(pParse, pRhs);
- pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
+ pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0);
pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
}
if( pRhs ){
- pRhs->op = (u8)yymsp[-1].minor.yy376;
+ pRhs->op = (u8)yymsp[-1].minor.yy394;
pRhs->pPrior = pLhs;
if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
pRhs->selFlags &= ~SF_MultiValue;
- if( yymsp[-1].minor.yy376!=TK_ALL ) pParse->hasCompound = 1;
+ if( yymsp[-1].minor.yy394!=TK_ALL ) pParse->hasCompound = 1;
}else{
sqlite3SelectDelete(pParse->db, pLhs);
}
- yymsp[-2].minor.yy81 = pRhs;
+ yymsp[-2].minor.yy47 = pRhs;
}
break;
- case 87: /* multiselect_op ::= UNION */
- case 89: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==89);
-{yymsp[0].minor.yy376 = yymsp[0].major; /*A-overwrites-OP*/}
+ case 89: /* multiselect_op ::= UNION */
+ case 91: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==91);
+{yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-OP*/}
break;
- case 88: /* multiselect_op ::= UNION ALL */
-{yymsp[-1].minor.yy376 = TK_ALL;}
+ case 90: /* multiselect_op ::= UNION ALL */
+{yymsp[-1].minor.yy394 = TK_ALL;}
break;
- case 90: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+ case 92: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
{
- yymsp[-8].minor.yy81 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy70,yymsp[-5].minor.yy153,yymsp[-4].minor.yy404,yymsp[-3].minor.yy70,yymsp[-2].minor.yy404,yymsp[-1].minor.yy70,yymsp[-7].minor.yy376,yymsp[0].minor.yy404);
+ yymsp[-8].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy322,yymsp[-5].minor.yy131,yymsp[-4].minor.yy528,yymsp[-3].minor.yy322,yymsp[-2].minor.yy528,yymsp[-1].minor.yy322,yymsp[-7].minor.yy394,yymsp[0].minor.yy528);
}
break;
- case 91: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */
+ case 93: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */
{
- yymsp[-9].minor.yy81 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy70,yymsp[-6].minor.yy153,yymsp[-5].minor.yy404,yymsp[-4].minor.yy70,yymsp[-3].minor.yy404,yymsp[-1].minor.yy70,yymsp[-8].minor.yy376,yymsp[0].minor.yy404);
- if( yymsp[-9].minor.yy81 ){
- yymsp[-9].minor.yy81->pWinDefn = yymsp[-2].minor.yy49;
+ yymsp[-9].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy322,yymsp[-6].minor.yy131,yymsp[-5].minor.yy528,yymsp[-4].minor.yy322,yymsp[-3].minor.yy528,yymsp[-1].minor.yy322,yymsp[-8].minor.yy394,yymsp[0].minor.yy528);
+ if( yymsp[-9].minor.yy47 ){
+ yymsp[-9].minor.yy47->pWinDefn = yymsp[-2].minor.yy41;
}else{
- sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy49);
+ sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy41);
}
}
break;
- case 92: /* values ::= VALUES LP nexprlist RP */
+ case 94: /* values ::= VALUES LP nexprlist RP */
{
- yymsp[-3].minor.yy81 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy70,0,0,0,0,0,SF_Values,0);
+ yymsp[-3].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values,0);
}
break;
- case 93: /* values ::= values COMMA LP nexprlist RP */
+ case 95: /* values ::= values COMMA LP nexprlist RP */
{
- Select *pRight, *pLeft = yymsp[-4].minor.yy81;
- pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy70,0,0,0,0,0,SF_Values|SF_MultiValue,0);
+ Select *pRight, *pLeft = yymsp[-4].minor.yy47;
+ pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values|SF_MultiValue,0);
if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
if( pRight ){
pRight->op = TK_ALL;
pRight->pPrior = pLeft;
- yymsp[-4].minor.yy81 = pRight;
+ yymsp[-4].minor.yy47 = pRight;
}else{
- yymsp[-4].minor.yy81 = pLeft;
+ yymsp[-4].minor.yy47 = pLeft;
}
}
break;
- case 94: /* distinct ::= DISTINCT */
-{yymsp[0].minor.yy376 = SF_Distinct;}
+ case 96: /* distinct ::= DISTINCT */
+{yymsp[0].minor.yy394 = SF_Distinct;}
break;
- case 95: /* distinct ::= ALL */
-{yymsp[0].minor.yy376 = SF_All;}
+ case 97: /* distinct ::= ALL */
+{yymsp[0].minor.yy394 = SF_All;}
break;
- case 97: /* sclp ::= */
- case 130: /* orderby_opt ::= */ yytestcase(yyruleno==130);
- case 140: /* groupby_opt ::= */ yytestcase(yyruleno==140);
- case 227: /* exprlist ::= */ yytestcase(yyruleno==227);
- case 230: /* paren_exprlist ::= */ yytestcase(yyruleno==230);
- case 235: /* eidlist_opt ::= */ yytestcase(yyruleno==235);
-{yymsp[1].minor.yy70 = 0;}
+ case 99: /* sclp ::= */
+ case 132: /* orderby_opt ::= */ yytestcase(yyruleno==132);
+ case 142: /* groupby_opt ::= */ yytestcase(yyruleno==142);
+ case 230: /* exprlist ::= */ yytestcase(yyruleno==230);
+ case 233: /* paren_exprlist ::= */ yytestcase(yyruleno==233);
+ case 238: /* eidlist_opt ::= */ yytestcase(yyruleno==238);
+{yymsp[1].minor.yy322 = 0;}
break;
- case 98: /* selcollist ::= sclp scanpt expr scanpt as */
+ case 100: /* selcollist ::= sclp scanpt expr scanpt as */
{
- yymsp[-4].minor.yy70 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy70, yymsp[-2].minor.yy404);
- if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy70, &yymsp[0].minor.yy0, 1);
- sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy70,yymsp[-3].minor.yy504,yymsp[-1].minor.yy504);
+ yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[-2].minor.yy528);
+ if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[0].minor.yy0, 1);
+ sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy322,yymsp[-3].minor.yy522,yymsp[-1].minor.yy522);
}
break;
- case 99: /* selcollist ::= sclp scanpt STAR */
+ case 101: /* selcollist ::= sclp scanpt STAR */
{
Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
- yymsp[-2].minor.yy70 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy70, p);
+ yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy322, p);
}
break;
- case 100: /* selcollist ::= sclp scanpt nm DOT STAR */
+ case 102: /* selcollist ::= sclp scanpt nm DOT STAR */
{
Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
- Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
+ Expr *pLeft = tokenExpr(pParse, TK_ID, yymsp[-2].minor.yy0);
Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
- yymsp[-4].minor.yy70 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy70, pDot);
+ yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, pDot);
}
break;
- case 101: /* as ::= AS nm */
- case 112: /* dbnm ::= DOT nm */ yytestcase(yyruleno==112);
- case 251: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==251);
- case 252: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==252);
+ case 103: /* as ::= AS nm */
+ case 115: /* dbnm ::= DOT nm */ yytestcase(yyruleno==115);
+ case 254: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==254);
+ case 255: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==255);
{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;}
break;
- case 103: /* from ::= */
- case 106: /* stl_prefix ::= */ yytestcase(yyruleno==106);
-{yymsp[1].minor.yy153 = 0;}
+ case 105: /* from ::= */
+ case 108: /* stl_prefix ::= */ yytestcase(yyruleno==108);
+{yymsp[1].minor.yy131 = 0;}
break;
- case 104: /* from ::= FROM seltablist */
+ case 106: /* from ::= FROM seltablist */
{
- yymsp[-1].minor.yy153 = yymsp[0].minor.yy153;
- sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy153);
+ yymsp[-1].minor.yy131 = yymsp[0].minor.yy131;
+ sqlite3SrcListShiftJoinType(pParse,yymsp[-1].minor.yy131);
}
break;
- case 105: /* stl_prefix ::= seltablist joinop */
+ case 107: /* stl_prefix ::= seltablist joinop */
{
- if( ALWAYS(yymsp[-1].minor.yy153 && yymsp[-1].minor.yy153->nSrc>0) ) yymsp[-1].minor.yy153->a[yymsp[-1].minor.yy153->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy376;
+ if( ALWAYS(yymsp[-1].minor.yy131 && yymsp[-1].minor.yy131->nSrc>0) ) yymsp[-1].minor.yy131->a[yymsp[-1].minor.yy131->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy394;
}
break;
- case 107: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
+ case 109: /* seltablist ::= stl_prefix nm dbnm as on_using */
{
- yymsp[-6].minor.yy153 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy153,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy404,yymsp[0].minor.yy436);
- sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy153, &yymsp[-2].minor.yy0);
+ yymsp[-4].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-4].minor.yy131,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561);
}
break;
- case 108: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */
+ case 110: /* seltablist ::= stl_prefix nm dbnm as indexed_by on_using */
{
- yymsp[-8].minor.yy153 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy153,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy404,yymsp[0].minor.yy436);
- sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy153, yymsp[-4].minor.yy70);
+ yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,0,&yymsp[0].minor.yy561);
+ sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-1].minor.yy0);
}
break;
- case 109: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
+ case 111: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */
{
- yymsp[-6].minor.yy153 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy153,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy81,yymsp[-1].minor.yy404,yymsp[0].minor.yy436);
+ yymsp[-7].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-7].minor.yy131,&yymsp[-6].minor.yy0,&yymsp[-5].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561);
+ sqlite3SrcListFuncArgs(pParse, yymsp[-7].minor.yy131, yymsp[-3].minor.yy322);
+}
+ break;
+ case 112: /* seltablist ::= stl_prefix LP select RP as on_using */
+{
+ yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,yymsp[-3].minor.yy47,&yymsp[0].minor.yy561);
}
break;
- case 110: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
+ case 113: /* seltablist ::= stl_prefix LP seltablist RP as on_using */
{
- if( yymsp[-6].minor.yy153==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy404==0 && yymsp[0].minor.yy436==0 ){
- yymsp[-6].minor.yy153 = yymsp[-4].minor.yy153;
- }else if( yymsp[-4].minor.yy153->nSrc==1 ){
- yymsp[-6].minor.yy153 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy153,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy404,yymsp[0].minor.yy436);
- if( yymsp[-6].minor.yy153 ){
- SrcItem *pNew = &yymsp[-6].minor.yy153->a[yymsp[-6].minor.yy153->nSrc-1];
- SrcItem *pOld = yymsp[-4].minor.yy153->a;
+ if( yymsp[-5].minor.yy131==0 && yymsp[-1].minor.yy0.n==0 && yymsp[0].minor.yy561.pOn==0 && yymsp[0].minor.yy561.pUsing==0 ){
+ yymsp[-5].minor.yy131 = yymsp[-3].minor.yy131;
+ }else if( ALWAYS(yymsp[-3].minor.yy131!=0) && yymsp[-3].minor.yy131->nSrc==1 ){
+ yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561);
+ if( yymsp[-5].minor.yy131 ){
+ SrcItem *pNew = &yymsp[-5].minor.yy131->a[yymsp[-5].minor.yy131->nSrc-1];
+ SrcItem *pOld = yymsp[-3].minor.yy131->a;
pNew->zName = pOld->zName;
pNew->zDatabase = pOld->zDatabase;
pNew->pSelect = pOld->pSelect;
+ if( pNew->pSelect && (pNew->pSelect->selFlags & SF_NestedFrom)!=0 ){
+ pNew->fg.isNestedFrom = 1;
+ }
if( pOld->fg.isTabFunc ){
pNew->u1.pFuncArg = pOld->u1.pFuncArg;
pOld->u1.pFuncArg = 0;
@@ -162001,267 +171781,276 @@ static YYACTIONTYPE yy_reduce(
pOld->zName = pOld->zDatabase = 0;
pOld->pSelect = 0;
}
- sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy153);
+ sqlite3SrcListDelete(pParse->db, yymsp[-3].minor.yy131);
}else{
Select *pSubquery;
- sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy153);
- pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy153,0,0,0,0,SF_NestedFrom,0);
- yymsp[-6].minor.yy153 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy153,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy404,yymsp[0].minor.yy436);
+ sqlite3SrcListShiftJoinType(pParse,yymsp[-3].minor.yy131);
+ pSubquery = sqlite3SelectNew(pParse,0,yymsp[-3].minor.yy131,0,0,0,0,SF_NestedFrom,0);
+ yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,pSubquery,&yymsp[0].minor.yy561);
}
}
break;
- case 111: /* dbnm ::= */
- case 125: /* indexed_opt ::= */ yytestcase(yyruleno==125);
+ case 114: /* dbnm ::= */
+ case 129: /* indexed_opt ::= */ yytestcase(yyruleno==129);
{yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;}
break;
- case 113: /* fullname ::= nm */
+ case 116: /* fullname ::= nm */
{
- yylhsminor.yy153 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0);
- if( IN_RENAME_OBJECT && yylhsminor.yy153 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy153->a[0].zName, &yymsp[0].minor.yy0);
+ yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0);
+ if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0);
}
- yymsp[0].minor.yy153 = yylhsminor.yy153;
+ yymsp[0].minor.yy131 = yylhsminor.yy131;
break;
- case 114: /* fullname ::= nm DOT nm */
+ case 117: /* fullname ::= nm DOT nm */
{
- yylhsminor.yy153 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);
- if( IN_RENAME_OBJECT && yylhsminor.yy153 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy153->a[0].zName, &yymsp[0].minor.yy0);
+ yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);
+ if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0);
}
- yymsp[-2].minor.yy153 = yylhsminor.yy153;
+ yymsp[-2].minor.yy131 = yylhsminor.yy131;
break;
- case 115: /* xfullname ::= nm */
-{yymsp[0].minor.yy153 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/}
+ case 118: /* xfullname ::= nm */
+{yymsp[0].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/}
break;
- case 116: /* xfullname ::= nm DOT nm */
-{yymsp[-2].minor.yy153 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ case 119: /* xfullname ::= nm DOT nm */
+{yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/}
break;
- case 117: /* xfullname ::= nm DOT nm AS nm */
+ case 120: /* xfullname ::= nm DOT nm AS nm */
{
- yymsp[-4].minor.yy153 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/
- if( yymsp[-4].minor.yy153 ) yymsp[-4].minor.yy153->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0);
+ yymsp[-4].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/
+ if( yymsp[-4].minor.yy131 ) yymsp[-4].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0);
}
break;
- case 118: /* xfullname ::= nm AS nm */
+ case 121: /* xfullname ::= nm AS nm */
{
- yymsp[-2].minor.yy153 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/
- if( yymsp[-2].minor.yy153 ) yymsp[-2].minor.yy153->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0);
+ yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/
+ if( yymsp[-2].minor.yy131 ) yymsp[-2].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0);
}
break;
- case 119: /* joinop ::= COMMA|JOIN */
-{ yymsp[0].minor.yy376 = JT_INNER; }
+ case 122: /* joinop ::= COMMA|JOIN */
+{ yymsp[0].minor.yy394 = JT_INNER; }
break;
- case 120: /* joinop ::= JOIN_KW JOIN */
-{yymsp[-1].minor.yy376 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/}
+ case 123: /* joinop ::= JOIN_KW JOIN */
+{yymsp[-1].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/}
break;
- case 121: /* joinop ::= JOIN_KW nm JOIN */
-{yymsp[-2].minor.yy376 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/}
+ case 124: /* joinop ::= JOIN_KW nm JOIN */
+{yymsp[-2].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/}
break;
- case 122: /* joinop ::= JOIN_KW nm nm JOIN */
-{yymsp[-3].minor.yy376 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/}
+ case 125: /* joinop ::= JOIN_KW nm nm JOIN */
+{yymsp[-3].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/}
break;
- case 123: /* on_opt ::= ON expr */
- case 143: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==143);
- case 150: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==150);
- case 152: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==152);
- case 223: /* case_else ::= ELSE expr */ yytestcase(yyruleno==223);
- case 244: /* vinto ::= INTO expr */ yytestcase(yyruleno==244);
-{yymsp[-1].minor.yy404 = yymsp[0].minor.yy404;}
+ case 126: /* on_using ::= ON expr */
+{yymsp[-1].minor.yy561.pOn = yymsp[0].minor.yy528; yymsp[-1].minor.yy561.pUsing = 0;}
break;
- case 124: /* on_opt ::= */
- case 142: /* having_opt ::= */ yytestcase(yyruleno==142);
- case 144: /* limit_opt ::= */ yytestcase(yyruleno==144);
- case 149: /* where_opt ::= */ yytestcase(yyruleno==149);
- case 151: /* where_opt_ret ::= */ yytestcase(yyruleno==151);
- case 224: /* case_else ::= */ yytestcase(yyruleno==224);
- case 226: /* case_operand ::= */ yytestcase(yyruleno==226);
- case 245: /* vinto ::= */ yytestcase(yyruleno==245);
-{yymsp[1].minor.yy404 = 0;}
+ case 127: /* on_using ::= USING LP idlist RP */
+{yymsp[-3].minor.yy561.pOn = 0; yymsp[-3].minor.yy561.pUsing = yymsp[-1].minor.yy254;}
break;
- case 126: /* indexed_opt ::= INDEXED BY nm */
+ case 128: /* on_using ::= */
+{yymsp[1].minor.yy561.pOn = 0; yymsp[1].minor.yy561.pUsing = 0;}
+ break;
+ case 130: /* indexed_by ::= INDEXED BY nm */
{yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;}
break;
- case 127: /* indexed_opt ::= NOT INDEXED */
+ case 131: /* indexed_by ::= NOT INDEXED */
{yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;}
break;
- case 128: /* using_opt ::= USING LP idlist RP */
-{yymsp[-3].minor.yy436 = yymsp[-1].minor.yy436;}
- break;
- case 129: /* using_opt ::= */
- case 171: /* idlist_opt ::= */ yytestcase(yyruleno==171);
-{yymsp[1].minor.yy436 = 0;}
+ case 133: /* orderby_opt ::= ORDER BY sortlist */
+ case 143: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==143);
+{yymsp[-2].minor.yy322 = yymsp[0].minor.yy322;}
break;
- case 131: /* orderby_opt ::= ORDER BY sortlist */
- case 141: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==141);
-{yymsp[-2].minor.yy70 = yymsp[0].minor.yy70;}
- break;
- case 132: /* sortlist ::= sortlist COMMA expr sortorder nulls */
+ case 134: /* sortlist ::= sortlist COMMA expr sortorder nulls */
{
- yymsp[-4].minor.yy70 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy70,yymsp[-2].minor.yy404);
- sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy70,yymsp[-1].minor.yy376,yymsp[0].minor.yy376);
+ yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322,yymsp[-2].minor.yy528);
+ sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy322,yymsp[-1].minor.yy394,yymsp[0].minor.yy394);
}
break;
- case 133: /* sortlist ::= expr sortorder nulls */
+ case 135: /* sortlist ::= expr sortorder nulls */
{
- yymsp[-2].minor.yy70 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy404); /*A-overwrites-Y*/
- sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy70,yymsp[-1].minor.yy376,yymsp[0].minor.yy376);
+ yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy528); /*A-overwrites-Y*/
+ sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy322,yymsp[-1].minor.yy394,yymsp[0].minor.yy394);
}
break;
- case 134: /* sortorder ::= ASC */
-{yymsp[0].minor.yy376 = SQLITE_SO_ASC;}
+ case 136: /* sortorder ::= ASC */
+{yymsp[0].minor.yy394 = SQLITE_SO_ASC;}
+ break;
+ case 137: /* sortorder ::= DESC */
+{yymsp[0].minor.yy394 = SQLITE_SO_DESC;}
+ break;
+ case 138: /* sortorder ::= */
+ case 141: /* nulls ::= */ yytestcase(yyruleno==141);
+{yymsp[1].minor.yy394 = SQLITE_SO_UNDEFINED;}
break;
- case 135: /* sortorder ::= DESC */
-{yymsp[0].minor.yy376 = SQLITE_SO_DESC;}
+ case 139: /* nulls ::= NULLS FIRST */
+{yymsp[-1].minor.yy394 = SQLITE_SO_ASC;}
break;
- case 136: /* sortorder ::= */
- case 139: /* nulls ::= */ yytestcase(yyruleno==139);
-{yymsp[1].minor.yy376 = SQLITE_SO_UNDEFINED;}
+ case 140: /* nulls ::= NULLS LAST */
+{yymsp[-1].minor.yy394 = SQLITE_SO_DESC;}
break;
- case 137: /* nulls ::= NULLS FIRST */
-{yymsp[-1].minor.yy376 = SQLITE_SO_ASC;}
+ case 144: /* having_opt ::= */
+ case 146: /* limit_opt ::= */ yytestcase(yyruleno==146);
+ case 151: /* where_opt ::= */ yytestcase(yyruleno==151);
+ case 153: /* where_opt_ret ::= */ yytestcase(yyruleno==153);
+ case 228: /* case_else ::= */ yytestcase(yyruleno==228);
+ case 229: /* case_operand ::= */ yytestcase(yyruleno==229);
+ case 248: /* vinto ::= */ yytestcase(yyruleno==248);
+{yymsp[1].minor.yy528 = 0;}
break;
- case 138: /* nulls ::= NULLS LAST */
-{yymsp[-1].minor.yy376 = SQLITE_SO_DESC;}
+ case 145: /* having_opt ::= HAVING expr */
+ case 152: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==152);
+ case 154: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==154);
+ case 227: /* case_else ::= ELSE expr */ yytestcase(yyruleno==227);
+ case 247: /* vinto ::= INTO expr */ yytestcase(yyruleno==247);
+{yymsp[-1].minor.yy528 = yymsp[0].minor.yy528;}
break;
- case 145: /* limit_opt ::= LIMIT expr */
-{yymsp[-1].minor.yy404 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy404,0);}
+ case 147: /* limit_opt ::= LIMIT expr */
+{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,0);}
break;
- case 146: /* limit_opt ::= LIMIT expr OFFSET expr */
-{yymsp[-3].minor.yy404 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy404,yymsp[0].minor.yy404);}
+ case 148: /* limit_opt ::= LIMIT expr OFFSET expr */
+{yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);}
break;
- case 147: /* limit_opt ::= LIMIT expr COMMA expr */
-{yymsp[-3].minor.yy404 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy404,yymsp[-2].minor.yy404);}
+ case 149: /* limit_opt ::= LIMIT expr COMMA expr */
+{yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,yymsp[-2].minor.yy528);}
break;
- case 148: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */
+ case 150: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */
{
- sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy153, &yymsp[-1].minor.yy0);
- sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy153,yymsp[0].minor.yy404,0,0);
+ sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy131, &yymsp[-1].minor.yy0);
+ sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy131,yymsp[0].minor.yy528,0,0);
}
break;
- case 153: /* where_opt_ret ::= RETURNING selcollist */
-{sqlite3AddReturning(pParse,yymsp[0].minor.yy70); yymsp[-1].minor.yy404 = 0;}
+ case 155: /* where_opt_ret ::= RETURNING selcollist */
+{sqlite3AddReturning(pParse,yymsp[0].minor.yy322); yymsp[-1].minor.yy528 = 0;}
break;
- case 154: /* where_opt_ret ::= WHERE expr RETURNING selcollist */
-{sqlite3AddReturning(pParse,yymsp[0].minor.yy70); yymsp[-3].minor.yy404 = yymsp[-2].minor.yy404;}
+ case 156: /* where_opt_ret ::= WHERE expr RETURNING selcollist */
+{sqlite3AddReturning(pParse,yymsp[0].minor.yy322); yymsp[-3].minor.yy528 = yymsp[-2].minor.yy528;}
break;
- case 155: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */
+ case 157: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */
{
- sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy153, &yymsp[-4].minor.yy0);
- sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy70,"set list");
- yymsp[-5].minor.yy153 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy153, yymsp[-1].minor.yy153);
- sqlite3Update(pParse,yymsp[-5].minor.yy153,yymsp[-2].minor.yy70,yymsp[0].minor.yy404,yymsp[-6].minor.yy376,0,0,0);
+ sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-4].minor.yy0);
+ sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy322,"set list");
+ if( yymsp[-1].minor.yy131 ){
+ SrcList *pFromClause = yymsp[-1].minor.yy131;
+ if( pFromClause->nSrc>1 ){
+ Select *pSubquery;
+ Token as;
+ pSubquery = sqlite3SelectNew(pParse,0,pFromClause,0,0,0,0,SF_NestedFrom,0);
+ as.n = 0;
+ as.z = 0;
+ pFromClause = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0);
+ }
+ yymsp[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, pFromClause);
+ }
+ sqlite3Update(pParse,yymsp[-5].minor.yy131,yymsp[-2].minor.yy322,yymsp[0].minor.yy528,yymsp[-6].minor.yy394,0,0,0);
}
break;
- case 156: /* setlist ::= setlist COMMA nm EQ expr */
+ case 158: /* setlist ::= setlist COMMA nm EQ expr */
{
- yymsp[-4].minor.yy70 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy70, yymsp[0].minor.yy404);
- sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy70, &yymsp[-2].minor.yy0, 1);
+ yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[0].minor.yy528);
+ sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, 1);
}
break;
- case 157: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
+ case 159: /* setlist ::= setlist COMMA LP idlist RP EQ expr */
{
- yymsp[-6].minor.yy70 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy70, yymsp[-3].minor.yy436, yymsp[0].minor.yy404);
+ yymsp[-6].minor.yy322 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy322, yymsp[-3].minor.yy254, yymsp[0].minor.yy528);
}
break;
- case 158: /* setlist ::= nm EQ expr */
+ case 160: /* setlist ::= nm EQ expr */
{
- yylhsminor.yy70 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy404);
- sqlite3ExprListSetName(pParse, yylhsminor.yy70, &yymsp[-2].minor.yy0, 1);
+ yylhsminor.yy322 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy528);
+ sqlite3ExprListSetName(pParse, yylhsminor.yy322, &yymsp[-2].minor.yy0, 1);
}
- yymsp[-2].minor.yy70 = yylhsminor.yy70;
+ yymsp[-2].minor.yy322 = yylhsminor.yy322;
break;
- case 159: /* setlist ::= LP idlist RP EQ expr */
+ case 161: /* setlist ::= LP idlist RP EQ expr */
{
- yymsp[-4].minor.yy70 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy436, yymsp[0].minor.yy404);
+ yymsp[-4].minor.yy322 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy254, yymsp[0].minor.yy528);
}
break;
- case 160: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
+ case 162: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */
{
- sqlite3Insert(pParse, yymsp[-3].minor.yy153, yymsp[-1].minor.yy81, yymsp[-2].minor.yy436, yymsp[-5].minor.yy376, yymsp[0].minor.yy190);
+ sqlite3Insert(pParse, yymsp[-3].minor.yy131, yymsp[-1].minor.yy47, yymsp[-2].minor.yy254, yymsp[-5].minor.yy394, yymsp[0].minor.yy444);
}
break;
- case 161: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */
+ case 163: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */
{
- sqlite3Insert(pParse, yymsp[-4].minor.yy153, 0, yymsp[-3].minor.yy436, yymsp[-6].minor.yy376, 0);
+ sqlite3Insert(pParse, yymsp[-4].minor.yy131, 0, yymsp[-3].minor.yy254, yymsp[-6].minor.yy394, 0);
}
break;
- case 162: /* upsert ::= */
-{ yymsp[1].minor.yy190 = 0; }
+ case 164: /* upsert ::= */
+{ yymsp[1].minor.yy444 = 0; }
+ break;
+ case 165: /* upsert ::= RETURNING selcollist */
+{ yymsp[-1].minor.yy444 = 0; sqlite3AddReturning(pParse,yymsp[0].minor.yy322); }
break;
- case 163: /* upsert ::= RETURNING selcollist */
-{ yymsp[-1].minor.yy190 = 0; sqlite3AddReturning(pParse,yymsp[0].minor.yy70); }
+ case 166: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */
+{ yymsp[-11].minor.yy444 = sqlite3UpsertNew(pParse->db,yymsp[-8].minor.yy322,yymsp[-6].minor.yy528,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528,yymsp[0].minor.yy444);}
break;
- case 164: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */
-{ yymsp[-11].minor.yy190 = sqlite3UpsertNew(pParse->db,yymsp[-8].minor.yy70,yymsp[-6].minor.yy404,yymsp[-2].minor.yy70,yymsp[-1].minor.yy404,yymsp[0].minor.yy190);}
+ case 167: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */
+{ yymsp[-8].minor.yy444 = sqlite3UpsertNew(pParse->db,yymsp[-5].minor.yy322,yymsp[-3].minor.yy528,0,0,yymsp[0].minor.yy444); }
break;
- case 165: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */
-{ yymsp[-8].minor.yy190 = sqlite3UpsertNew(pParse->db,yymsp[-5].minor.yy70,yymsp[-3].minor.yy404,0,0,yymsp[0].minor.yy190); }
+ case 168: /* upsert ::= ON CONFLICT DO NOTHING returning */
+{ yymsp[-4].minor.yy444 = sqlite3UpsertNew(pParse->db,0,0,0,0,0); }
break;
- case 166: /* upsert ::= ON CONFLICT DO NOTHING returning */
-{ yymsp[-4].minor.yy190 = sqlite3UpsertNew(pParse->db,0,0,0,0,0); }
+ case 169: /* upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */
+{ yymsp[-7].minor.yy444 = sqlite3UpsertNew(pParse->db,0,0,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528,0);}
break;
- case 167: /* upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */
-{ yymsp[-7].minor.yy190 = sqlite3UpsertNew(pParse->db,0,0,yymsp[-2].minor.yy70,yymsp[-1].minor.yy404,0);}
+ case 170: /* returning ::= RETURNING selcollist */
+{sqlite3AddReturning(pParse,yymsp[0].minor.yy322);}
break;
- case 168: /* returning ::= RETURNING selcollist */
-{sqlite3AddReturning(pParse,yymsp[0].minor.yy70);}
+ case 173: /* idlist_opt ::= */
+{yymsp[1].minor.yy254 = 0;}
break;
- case 172: /* idlist_opt ::= LP idlist RP */
-{yymsp[-2].minor.yy436 = yymsp[-1].minor.yy436;}
+ case 174: /* idlist_opt ::= LP idlist RP */
+{yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;}
break;
- case 173: /* idlist ::= idlist COMMA nm */
-{yymsp[-2].minor.yy436 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy436,&yymsp[0].minor.yy0);}
+ case 175: /* idlist ::= idlist COMMA nm */
+{yymsp[-2].minor.yy254 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
break;
- case 174: /* idlist ::= nm */
-{yymsp[0].minor.yy436 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
+ case 176: /* idlist ::= nm */
+{yymsp[0].minor.yy254 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/}
break;
- case 175: /* expr ::= LP expr RP */
-{yymsp[-2].minor.yy404 = yymsp[-1].minor.yy404;}
+ case 177: /* expr ::= LP expr RP */
+{yymsp[-2].minor.yy528 = yymsp[-1].minor.yy528;}
break;
- case 176: /* expr ::= ID|INDEXED */
- case 177: /* expr ::= JOIN_KW */ yytestcase(yyruleno==177);
-{yymsp[0].minor.yy404=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ case 178: /* expr ::= ID|INDEXED|JOIN_KW */
+{yymsp[0].minor.yy528=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/}
break;
- case 178: /* expr ::= nm DOT nm */
+ case 179: /* expr ::= nm DOT nm */
{
- Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
- Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
- if( IN_RENAME_OBJECT ){
- sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[0].minor.yy0);
- sqlite3RenameTokenMap(pParse, (void*)temp1, &yymsp[-2].minor.yy0);
- }
- yylhsminor.yy404 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
+ Expr *temp1 = tokenExpr(pParse,TK_ID,yymsp[-2].minor.yy0);
+ Expr *temp2 = tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0);
+ yylhsminor.yy528 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
}
- yymsp[-2].minor.yy404 = yylhsminor.yy404;
+ yymsp[-2].minor.yy528 = yylhsminor.yy528;
break;
- case 179: /* expr ::= nm DOT nm DOT nm */
+ case 180: /* expr ::= nm DOT nm DOT nm */
{
- Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1);
- Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1);
- Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1);
+ Expr *temp1 = tokenExpr(pParse,TK_ID,yymsp[-4].minor.yy0);
+ Expr *temp2 = tokenExpr(pParse,TK_ID,yymsp[-2].minor.yy0);
+ Expr *temp3 = tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0);
Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
if( IN_RENAME_OBJECT ){
- sqlite3RenameTokenMap(pParse, (void*)temp3, &yymsp[0].minor.yy0);
- sqlite3RenameTokenMap(pParse, (void*)temp2, &yymsp[-2].minor.yy0);
+ sqlite3RenameTokenRemap(pParse, 0, temp1);
}
- yylhsminor.yy404 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
+ yylhsminor.yy528 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
}
- yymsp[-4].minor.yy404 = yylhsminor.yy404;
+ yymsp[-4].minor.yy528 = yylhsminor.yy528;
break;
- case 180: /* term ::= NULL|FLOAT|BLOB */
- case 181: /* term ::= STRING */ yytestcase(yyruleno==181);
-{yymsp[0].minor.yy404=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/}
+ case 181: /* term ::= NULL|FLOAT|BLOB */
+ case 182: /* term ::= STRING */ yytestcase(yyruleno==182);
+{yymsp[0].minor.yy528=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/}
break;
- case 182: /* term ::= INTEGER */
+ case 183: /* term ::= INTEGER */
{
- yylhsminor.yy404 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
+ yylhsminor.yy528 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1);
+ if( yylhsminor.yy528 ) yylhsminor.yy528->w.iOfst = (int)(yymsp[0].minor.yy0.z - pParse->zTail);
}
- yymsp[0].minor.yy404 = yylhsminor.yy404;
+ yymsp[0].minor.yy528 = yylhsminor.yy528;
break;
- case 183: /* expr ::= VARIABLE */
+ case 184: /* expr ::= VARIABLE */
{
if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){
u32 n = yymsp[0].minor.yy0.n;
- yymsp[0].minor.yy404 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0);
- sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy404, n);
+ yymsp[0].minor.yy528 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0);
+ sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy528, n);
}else{
/* When doing a nested parse, one can include terms in an expression
** that look like this: #1 #2 ... These terms refer to registers
@@ -162270,159 +172059,179 @@ static YYACTIONTYPE yy_reduce(
assert( t.n>=2 );
if( pParse->nested==0 ){
sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
- yymsp[0].minor.yy404 = 0;
+ yymsp[0].minor.yy528 = 0;
}else{
- yymsp[0].minor.yy404 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
- if( yymsp[0].minor.yy404 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy404->iTable);
+ yymsp[0].minor.yy528 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
+ if( yymsp[0].minor.yy528 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy528->iTable);
}
}
}
break;
- case 184: /* expr ::= expr COLLATE ID|STRING */
+ case 185: /* expr ::= expr COLLATE ID|STRING */
{
- yymsp[-2].minor.yy404 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy404, &yymsp[0].minor.yy0, 1);
+ yymsp[-2].minor.yy528 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy528, &yymsp[0].minor.yy0, 1);
}
break;
- case 185: /* expr ::= CAST LP expr AS typetoken RP */
+ case 186: /* expr ::= CAST LP expr AS typetoken RP */
{
- yymsp[-5].minor.yy404 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1);
- sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy404, yymsp[-3].minor.yy404, 0);
+ yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1);
+ sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy528, yymsp[-3].minor.yy528, 0);
}
break;
- case 186: /* expr ::= ID|INDEXED LP distinct exprlist RP */
+ case 187: /* expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP */
{
- yylhsminor.yy404 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy70, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy376);
+ yylhsminor.yy528 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy394);
}
- yymsp[-4].minor.yy404 = yylhsminor.yy404;
+ yymsp[-4].minor.yy528 = yylhsminor.yy528;
break;
- case 187: /* expr ::= ID|INDEXED LP STAR RP */
+ case 188: /* expr ::= ID|INDEXED|JOIN_KW LP STAR RP */
{
- yylhsminor.yy404 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0);
+ yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0);
}
- yymsp[-3].minor.yy404 = yylhsminor.yy404;
+ yymsp[-3].minor.yy528 = yylhsminor.yy528;
break;
- case 188: /* expr ::= ID|INDEXED LP distinct exprlist RP filter_over */
+ case 189: /* expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over */
{
- yylhsminor.yy404 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy70, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy376);
- sqlite3WindowAttach(pParse, yylhsminor.yy404, yymsp[0].minor.yy49);
+ yylhsminor.yy528 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy322, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy394);
+ sqlite3WindowAttach(pParse, yylhsminor.yy528, yymsp[0].minor.yy41);
}
- yymsp[-5].minor.yy404 = yylhsminor.yy404;
+ yymsp[-5].minor.yy528 = yylhsminor.yy528;
break;
- case 189: /* expr ::= ID|INDEXED LP STAR RP filter_over */
+ case 190: /* expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over */
{
- yylhsminor.yy404 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0);
- sqlite3WindowAttach(pParse, yylhsminor.yy404, yymsp[0].minor.yy49);
+ yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0);
+ sqlite3WindowAttach(pParse, yylhsminor.yy528, yymsp[0].minor.yy41);
}
- yymsp[-4].minor.yy404 = yylhsminor.yy404;
+ yymsp[-4].minor.yy528 = yylhsminor.yy528;
break;
- case 190: /* term ::= CTIME_KW */
+ case 191: /* term ::= CTIME_KW */
{
- yylhsminor.yy404 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0);
+ yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0);
}
- yymsp[0].minor.yy404 = yylhsminor.yy404;
+ yymsp[0].minor.yy528 = yylhsminor.yy528;
break;
- case 191: /* expr ::= LP nexprlist COMMA expr RP */
+ case 192: /* expr ::= LP nexprlist COMMA expr RP */
{
- ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy70, yymsp[-1].minor.yy404);
- yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
- if( yymsp[-4].minor.yy404 ){
- yymsp[-4].minor.yy404->x.pList = pList;
+ ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528);
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
+ if( yymsp[-4].minor.yy528 ){
+ yymsp[-4].minor.yy528->x.pList = pList;
if( ALWAYS(pList->nExpr) ){
- yymsp[-4].minor.yy404->flags |= pList->a[0].pExpr->flags & EP_Propagate;
+ yymsp[-4].minor.yy528->flags |= pList->a[0].pExpr->flags & EP_Propagate;
}
}else{
sqlite3ExprListDelete(pParse->db, pList);
}
}
break;
- case 192: /* expr ::= expr AND expr */
-{yymsp[-2].minor.yy404=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy404,yymsp[0].minor.yy404);}
+ case 193: /* expr ::= expr AND expr */
+{yymsp[-2].minor.yy528=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);}
break;
- case 193: /* expr ::= expr OR expr */
- case 194: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==194);
- case 195: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==195);
- case 196: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==196);
- case 197: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==197);
- case 198: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==198);
- case 199: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==199);
-{yymsp[-2].minor.yy404=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy404,yymsp[0].minor.yy404);}
+ case 194: /* expr ::= expr OR expr */
+ case 195: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==195);
+ case 196: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==196);
+ case 197: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==197);
+ case 198: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==198);
+ case 199: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==199);
+ case 200: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==200);
+{yymsp[-2].minor.yy528=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);}
break;
- case 200: /* likeop ::= NOT LIKE_KW|MATCH */
+ case 201: /* likeop ::= NOT LIKE_KW|MATCH */
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/}
break;
- case 201: /* expr ::= expr likeop expr */
+ case 202: /* expr ::= expr likeop expr */
{
ExprList *pList;
int bNot = yymsp[-1].minor.yy0.n & 0x80000000;
yymsp[-1].minor.yy0.n &= 0x7fffffff;
- pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy404);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy404);
- yymsp[-2].minor.yy404 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0);
- if( bNot ) yymsp[-2].minor.yy404 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy404, 0);
- if( yymsp[-2].minor.yy404 ) yymsp[-2].minor.yy404->flags |= EP_InfixFunc;
+ pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy528);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy528);
+ yymsp[-2].minor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0);
+ if( bNot ) yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy528, 0);
+ if( yymsp[-2].minor.yy528 ) yymsp[-2].minor.yy528->flags |= EP_InfixFunc;
}
break;
- case 202: /* expr ::= expr likeop expr ESCAPE expr */
+ case 203: /* expr ::= expr likeop expr ESCAPE expr */
{
ExprList *pList;
int bNot = yymsp[-3].minor.yy0.n & 0x80000000;
yymsp[-3].minor.yy0.n &= 0x7fffffff;
- pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy404);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy404);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy404);
- yymsp[-4].minor.yy404 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0);
- if( bNot ) yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy404, 0);
- if( yymsp[-4].minor.yy404 ) yymsp[-4].minor.yy404->flags |= EP_InfixFunc;
+ pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy528);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528);
+ yymsp[-4].minor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0);
+ if( bNot ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0);
+ if( yymsp[-4].minor.yy528 ) yymsp[-4].minor.yy528->flags |= EP_InfixFunc;
}
break;
- case 203: /* expr ::= expr ISNULL|NOTNULL */
-{yymsp[-1].minor.yy404 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy404,0);}
+ case 204: /* expr ::= expr ISNULL|NOTNULL */
+{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy528,0);}
break;
- case 204: /* expr ::= expr NOT NULL */
-{yymsp[-2].minor.yy404 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy404,0);}
+ case 205: /* expr ::= expr NOT NULL */
+{yymsp[-2].minor.yy528 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy528,0);}
break;
- case 205: /* expr ::= expr IS expr */
+ case 206: /* expr ::= expr IS expr */
{
- yymsp[-2].minor.yy404 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy404,yymsp[0].minor.yy404);
- binaryToUnaryIfNull(pParse, yymsp[0].minor.yy404, yymsp[-2].minor.yy404, TK_ISNULL);
+ yymsp[-2].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);
+ binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-2].minor.yy528, TK_ISNULL);
}
break;
- case 206: /* expr ::= expr IS NOT expr */
+ case 207: /* expr ::= expr IS NOT expr */
{
- yymsp[-3].minor.yy404 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy404,yymsp[0].minor.yy404);
- binaryToUnaryIfNull(pParse, yymsp[0].minor.yy404, yymsp[-3].minor.yy404, TK_NOTNULL);
+ yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy528,yymsp[0].minor.yy528);
+ binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-3].minor.yy528, TK_NOTNULL);
}
break;
- case 207: /* expr ::= NOT expr */
- case 208: /* expr ::= BITNOT expr */ yytestcase(yyruleno==208);
-{yymsp[-1].minor.yy404 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy404, 0);/*A-overwrites-B*/}
+ case 208: /* expr ::= expr IS NOT DISTINCT FROM expr */
+{
+ yymsp[-5].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-5].minor.yy528,yymsp[0].minor.yy528);
+ binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-5].minor.yy528, TK_ISNULL);
+}
+ break;
+ case 209: /* expr ::= expr IS DISTINCT FROM expr */
+{
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-4].minor.yy528,yymsp[0].minor.yy528);
+ binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-4].minor.yy528, TK_NOTNULL);
+}
+ break;
+ case 210: /* expr ::= NOT expr */
+ case 211: /* expr ::= BITNOT expr */ yytestcase(yyruleno==211);
+{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy528, 0);/*A-overwrites-B*/}
break;
- case 209: /* expr ::= PLUS|MINUS expr */
+ case 212: /* expr ::= PLUS|MINUS expr */
{
- yymsp[-1].minor.yy404 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy404, 0);
+ yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy528, 0);
/*A-overwrites-B*/
}
break;
- case 210: /* between_op ::= BETWEEN */
- case 213: /* in_op ::= IN */ yytestcase(yyruleno==213);
-{yymsp[0].minor.yy376 = 0;}
+ case 213: /* expr ::= expr PTR expr */
+{
+ ExprList *pList = sqlite3ExprListAppend(pParse, 0, yymsp[-2].minor.yy528);
+ pList = sqlite3ExprListAppend(pParse, pList, yymsp[0].minor.yy528);
+ yylhsminor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0);
+}
+ yymsp[-2].minor.yy528 = yylhsminor.yy528;
break;
- case 212: /* expr ::= expr between_op expr AND expr */
+ case 214: /* between_op ::= BETWEEN */
+ case 217: /* in_op ::= IN */ yytestcase(yyruleno==217);
+{yymsp[0].minor.yy394 = 0;}
+ break;
+ case 216: /* expr ::= expr between_op expr AND expr */
{
- ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy404);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy404);
- yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy404, 0);
- if( yymsp[-4].minor.yy404 ){
- yymsp[-4].minor.yy404->x.pList = pList;
+ ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528);
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy528, 0);
+ if( yymsp[-4].minor.yy528 ){
+ yymsp[-4].minor.yy528->x.pList = pList;
}else{
sqlite3ExprListDelete(pParse->db, pList);
}
- if( yymsp[-3].minor.yy376 ) yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy404, 0);
+ if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0);
}
break;
- case 215: /* expr ::= expr in_op LP exprlist RP */
+ case 219: /* expr ::= expr in_op LP exprlist RP */
{
- if( yymsp[-1].minor.yy70==0 ){
+ if( yymsp[-1].minor.yy322==0 ){
/* Expressions of the form
**
** expr1 IN ()
@@ -162431,197 +172240,208 @@ static YYACTIONTYPE yy_reduce(
** simplify to constants 0 (false) and 1 (true), respectively,
** regardless of the value of expr1.
*/
- sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy404);
- yymsp[-4].minor.yy404 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy376 ? "1" : "0");
- }else if( yymsp[-1].minor.yy70->nExpr==1 && sqlite3ExprIsConstant(yymsp[-1].minor.yy70->a[0].pExpr) ){
- Expr *pRHS = yymsp[-1].minor.yy70->a[0].pExpr;
- yymsp[-1].minor.yy70->a[0].pExpr = 0;
- sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy70);
- pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0);
- yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy404, pRHS);
- if( yymsp[-3].minor.yy376 ) yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy404, 0);
- }else{
- yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy404, 0);
- if( yymsp[-4].minor.yy404 ){
- yymsp[-4].minor.yy404->x.pList = yymsp[-1].minor.yy70;
- sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy404);
+ sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy528);
+ yymsp[-4].minor.yy528 = sqlite3Expr(pParse->db, TK_STRING, yymsp[-3].minor.yy394 ? "true" : "false");
+ if( yymsp[-4].minor.yy528 ) sqlite3ExprIdToTrueFalse(yymsp[-4].minor.yy528);
+ }else{
+ Expr *pRHS = yymsp[-1].minor.yy322->a[0].pExpr;
+ if( yymsp[-1].minor.yy322->nExpr==1 && sqlite3ExprIsConstant(pRHS) && yymsp[-4].minor.yy528->op!=TK_VECTOR ){
+ yymsp[-1].minor.yy322->a[0].pExpr = 0;
+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322);
+ pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0);
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy528, pRHS);
+ }else if( yymsp[-1].minor.yy322->nExpr==1 && pRHS->op==TK_SELECT ){
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0);
+ sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pRHS->x.pSelect);
+ pRHS->x.pSelect = 0;
+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322);
}else{
- sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy70);
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0);
+ if( yymsp[-4].minor.yy528==0 ){
+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322);
+ }else if( yymsp[-4].minor.yy528->pLeft->op==TK_VECTOR ){
+ int nExpr = yymsp[-4].minor.yy528->pLeft->x.pList->nExpr;
+ Select *pSelectRHS = sqlite3ExprListToValues(pParse, nExpr, yymsp[-1].minor.yy322);
+ if( pSelectRHS ){
+ parserDoubleLinkSelect(pParse, pSelectRHS);
+ sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pSelectRHS);
+ }
+ }else{
+ yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy322;
+ sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528);
+ }
}
- if( yymsp[-3].minor.yy376 ) yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy404, 0);
+ if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0);
}
}
break;
- case 216: /* expr ::= LP select RP */
+ case 220: /* expr ::= LP select RP */
{
- yymsp[-2].minor.yy404 = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy404, yymsp[-1].minor.yy81);
+ yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
+ sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy528, yymsp[-1].minor.yy47);
}
break;
- case 217: /* expr ::= expr in_op LP select RP */
+ case 221: /* expr ::= expr in_op LP select RP */
{
- yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy404, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy404, yymsp[-1].minor.yy81);
- if( yymsp[-3].minor.yy376 ) yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy404, 0);
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0);
+ sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, yymsp[-1].minor.yy47);
+ if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0);
}
break;
- case 218: /* expr ::= expr in_op nm dbnm paren_exprlist */
+ case 222: /* expr ::= expr in_op nm dbnm paren_exprlist */
{
SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);
Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
- if( yymsp[0].minor.yy70 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy70);
- yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy404, 0);
- sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy404, pSelect);
- if( yymsp[-3].minor.yy376 ) yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy404, 0);
+ if( yymsp[0].minor.yy322 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy322);
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0);
+ sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pSelect);
+ if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0);
}
break;
- case 219: /* expr ::= EXISTS LP select RP */
+ case 223: /* expr ::= EXISTS LP select RP */
{
Expr *p;
- p = yymsp[-3].minor.yy404 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
- sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy81);
+ p = yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
+ sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy47);
}
break;
- case 220: /* expr ::= CASE case_operand case_exprlist case_else END */
+ case 224: /* expr ::= CASE case_operand case_exprlist case_else END */
{
- yymsp[-4].minor.yy404 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy404, 0);
- if( yymsp[-4].minor.yy404 ){
- yymsp[-4].minor.yy404->x.pList = yymsp[-1].minor.yy404 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy70,yymsp[-1].minor.yy404) : yymsp[-2].minor.yy70;
- sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy404);
+ yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy528, 0);
+ if( yymsp[-4].minor.yy528 ){
+ yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy528 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528) : yymsp[-2].minor.yy322;
+ sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528);
}else{
- sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy70);
- sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy404);
+ sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy322);
+ sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy528);
}
}
break;
- case 221: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
+ case 225: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
{
- yymsp[-4].minor.yy70 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy70, yymsp[-2].minor.yy404);
- yymsp[-4].minor.yy70 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy70, yymsp[0].minor.yy404);
+ yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[-2].minor.yy528);
+ yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[0].minor.yy528);
}
break;
- case 222: /* case_exprlist ::= WHEN expr THEN expr */
+ case 226: /* case_exprlist ::= WHEN expr THEN expr */
{
- yymsp[-3].minor.yy70 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy404);
- yymsp[-3].minor.yy70 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy70, yymsp[0].minor.yy404);
+ yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528);
+ yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322, yymsp[0].minor.yy528);
}
break;
- case 225: /* case_operand ::= expr */
-{yymsp[0].minor.yy404 = yymsp[0].minor.yy404; /*A-overwrites-X*/}
- break;
- case 228: /* nexprlist ::= nexprlist COMMA expr */
-{yymsp[-2].minor.yy70 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy70,yymsp[0].minor.yy404);}
+ case 231: /* nexprlist ::= nexprlist COMMA expr */
+{yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[0].minor.yy528);}
break;
- case 229: /* nexprlist ::= expr */
-{yymsp[0].minor.yy70 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy404); /*A-overwrites-Y*/}
+ case 232: /* nexprlist ::= expr */
+{yymsp[0].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy528); /*A-overwrites-Y*/}
break;
- case 231: /* paren_exprlist ::= LP exprlist RP */
- case 236: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==236);
-{yymsp[-2].minor.yy70 = yymsp[-1].minor.yy70;}
+ case 234: /* paren_exprlist ::= LP exprlist RP */
+ case 239: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==239);
+{yymsp[-2].minor.yy322 = yymsp[-1].minor.yy322;}
break;
- case 232: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
+ case 235: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */
{
sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0,
- sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy70, yymsp[-10].minor.yy376,
- &yymsp[-11].minor.yy0, yymsp[0].minor.yy404, SQLITE_SO_ASC, yymsp[-8].minor.yy376, SQLITE_IDXTYPE_APPDEF);
+ sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy322, yymsp[-10].minor.yy394,
+ &yymsp[-11].minor.yy0, yymsp[0].minor.yy528, SQLITE_SO_ASC, yymsp[-8].minor.yy394, SQLITE_IDXTYPE_APPDEF);
if( IN_RENAME_OBJECT && pParse->pNewIndex ){
sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0);
}
}
break;
- case 233: /* uniqueflag ::= UNIQUE */
- case 275: /* raisetype ::= ABORT */ yytestcase(yyruleno==275);
-{yymsp[0].minor.yy376 = OE_Abort;}
+ case 236: /* uniqueflag ::= UNIQUE */
+ case 278: /* raisetype ::= ABORT */ yytestcase(yyruleno==278);
+{yymsp[0].minor.yy394 = OE_Abort;}
break;
- case 234: /* uniqueflag ::= */
-{yymsp[1].minor.yy376 = OE_None;}
+ case 237: /* uniqueflag ::= */
+{yymsp[1].minor.yy394 = OE_None;}
break;
- case 237: /* eidlist ::= eidlist COMMA nm collate sortorder */
+ case 240: /* eidlist ::= eidlist COMMA nm collate sortorder */
{
- yymsp[-4].minor.yy70 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy70, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy376, yymsp[0].minor.yy376);
+ yymsp[-4].minor.yy322 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394);
}
break;
- case 238: /* eidlist ::= nm collate sortorder */
+ case 241: /* eidlist ::= nm collate sortorder */
{
- yymsp[-2].minor.yy70 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy376, yymsp[0].minor.yy376); /*A-overwrites-Y*/
+ yymsp[-2].minor.yy322 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); /*A-overwrites-Y*/
}
break;
- case 241: /* cmd ::= DROP INDEX ifexists fullname */
-{sqlite3DropIndex(pParse, yymsp[0].minor.yy153, yymsp[-1].minor.yy376);}
+ case 244: /* cmd ::= DROP INDEX ifexists fullname */
+{sqlite3DropIndex(pParse, yymsp[0].minor.yy131, yymsp[-1].minor.yy394);}
break;
- case 242: /* cmd ::= VACUUM vinto */
-{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy404);}
+ case 245: /* cmd ::= VACUUM vinto */
+{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy528);}
break;
- case 243: /* cmd ::= VACUUM nm vinto */
-{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy404);}
+ case 246: /* cmd ::= VACUUM nm vinto */
+{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy528);}
break;
- case 246: /* cmd ::= PRAGMA nm dbnm */
+ case 249: /* cmd ::= PRAGMA nm dbnm */
{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);}
break;
- case 247: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
+ case 250: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);}
break;
- case 248: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
+ case 251: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);}
break;
- case 249: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
+ case 252: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);}
break;
- case 250: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
+ case 253: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);}
break;
- case 253: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
+ case 256: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
{
Token all;
all.z = yymsp[-3].minor.yy0.z;
all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n;
- sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy157, &all);
+ sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy33, &all);
}
break;
- case 254: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+ case 257: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
{
- sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy376, yymsp[-4].minor.yy262.a, yymsp[-4].minor.yy262.b, yymsp[-2].minor.yy153, yymsp[0].minor.yy404, yymsp[-10].minor.yy376, yymsp[-8].minor.yy376);
+ sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy394, yymsp[-4].minor.yy180.a, yymsp[-4].minor.yy180.b, yymsp[-2].minor.yy131, yymsp[0].minor.yy528, yymsp[-10].minor.yy394, yymsp[-8].minor.yy394);
yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/
}
break;
- case 255: /* trigger_time ::= BEFORE|AFTER */
-{ yymsp[0].minor.yy376 = yymsp[0].major; /*A-overwrites-X*/ }
+ case 258: /* trigger_time ::= BEFORE|AFTER */
+{ yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/ }
break;
- case 256: /* trigger_time ::= INSTEAD OF */
-{ yymsp[-1].minor.yy376 = TK_INSTEAD;}
+ case 259: /* trigger_time ::= INSTEAD OF */
+{ yymsp[-1].minor.yy394 = TK_INSTEAD;}
break;
- case 257: /* trigger_time ::= */
-{ yymsp[1].minor.yy376 = TK_BEFORE; }
+ case 260: /* trigger_time ::= */
+{ yymsp[1].minor.yy394 = TK_BEFORE; }
break;
- case 258: /* trigger_event ::= DELETE|INSERT */
- case 259: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==259);
-{yymsp[0].minor.yy262.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy262.b = 0;}
+ case 261: /* trigger_event ::= DELETE|INSERT */
+ case 262: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==262);
+{yymsp[0].minor.yy180.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy180.b = 0;}
break;
- case 260: /* trigger_event ::= UPDATE OF idlist */
-{yymsp[-2].minor.yy262.a = TK_UPDATE; yymsp[-2].minor.yy262.b = yymsp[0].minor.yy436;}
+ case 263: /* trigger_event ::= UPDATE OF idlist */
+{yymsp[-2].minor.yy180.a = TK_UPDATE; yymsp[-2].minor.yy180.b = yymsp[0].minor.yy254;}
break;
- case 261: /* when_clause ::= */
- case 280: /* key_opt ::= */ yytestcase(yyruleno==280);
-{ yymsp[1].minor.yy404 = 0; }
+ case 264: /* when_clause ::= */
+ case 283: /* key_opt ::= */ yytestcase(yyruleno==283);
+{ yymsp[1].minor.yy528 = 0; }
break;
- case 262: /* when_clause ::= WHEN expr */
- case 281: /* key_opt ::= KEY expr */ yytestcase(yyruleno==281);
-{ yymsp[-1].minor.yy404 = yymsp[0].minor.yy404; }
+ case 265: /* when_clause ::= WHEN expr */
+ case 284: /* key_opt ::= KEY expr */ yytestcase(yyruleno==284);
+{ yymsp[-1].minor.yy528 = yymsp[0].minor.yy528; }
break;
- case 263: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+ case 266: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
{
- assert( yymsp[-2].minor.yy157!=0 );
- yymsp[-2].minor.yy157->pLast->pNext = yymsp[-1].minor.yy157;
- yymsp[-2].minor.yy157->pLast = yymsp[-1].minor.yy157;
+ assert( yymsp[-2].minor.yy33!=0 );
+ yymsp[-2].minor.yy33->pLast->pNext = yymsp[-1].minor.yy33;
+ yymsp[-2].minor.yy33->pLast = yymsp[-1].minor.yy33;
}
break;
- case 264: /* trigger_cmd_list ::= trigger_cmd SEMI */
+ case 267: /* trigger_cmd_list ::= trigger_cmd SEMI */
{
- assert( yymsp[-1].minor.yy157!=0 );
- yymsp[-1].minor.yy157->pLast = yymsp[-1].minor.yy157;
+ assert( yymsp[-1].minor.yy33!=0 );
+ yymsp[-1].minor.yy33->pLast = yymsp[-1].minor.yy33;
}
break;
- case 265: /* trnm ::= nm DOT nm */
+ case 268: /* trnm ::= nm DOT nm */
{
yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;
sqlite3ErrorMsg(pParse,
@@ -162629,368 +172449,370 @@ static YYACTIONTYPE yy_reduce(
"statements within triggers");
}
break;
- case 266: /* tridxby ::= INDEXED BY nm */
+ case 269: /* tridxby ::= INDEXED BY nm */
{
sqlite3ErrorMsg(pParse,
"the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
"within triggers");
}
break;
- case 267: /* tridxby ::= NOT INDEXED */
+ case 270: /* tridxby ::= NOT INDEXED */
{
sqlite3ErrorMsg(pParse,
"the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
"within triggers");
}
break;
- case 268: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */
-{yylhsminor.yy157 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy153, yymsp[-3].minor.yy70, yymsp[-1].minor.yy404, yymsp[-7].minor.yy376, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy504);}
- yymsp[-8].minor.yy157 = yylhsminor.yy157;
+ case 271: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */
+{yylhsminor.yy33 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy131, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528, yymsp[-7].minor.yy394, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy522);}
+ yymsp[-8].minor.yy33 = yylhsminor.yy33;
break;
- case 269: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */
+ case 272: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */
{
- yylhsminor.yy157 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy436,yymsp[-2].minor.yy81,yymsp[-6].minor.yy376,yymsp[-1].minor.yy190,yymsp[-7].minor.yy504,yymsp[0].minor.yy504);/*yylhsminor.yy157-overwrites-yymsp[-6].minor.yy376*/
+ yylhsminor.yy33 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy254,yymsp[-2].minor.yy47,yymsp[-6].minor.yy394,yymsp[-1].minor.yy444,yymsp[-7].minor.yy522,yymsp[0].minor.yy522);/*yylhsminor.yy33-overwrites-yymsp[-6].minor.yy394*/
}
- yymsp[-7].minor.yy157 = yylhsminor.yy157;
+ yymsp[-7].minor.yy33 = yylhsminor.yy33;
break;
- case 270: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
-{yylhsminor.yy157 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy404, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy504);}
- yymsp[-5].minor.yy157 = yylhsminor.yy157;
+ case 273: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */
+{yylhsminor.yy33 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy528, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy522);}
+ yymsp[-5].minor.yy33 = yylhsminor.yy33;
break;
- case 271: /* trigger_cmd ::= scanpt select scanpt */
-{yylhsminor.yy157 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy81, yymsp[-2].minor.yy504, yymsp[0].minor.yy504); /*yylhsminor.yy157-overwrites-yymsp[-1].minor.yy81*/}
- yymsp[-2].minor.yy157 = yylhsminor.yy157;
+ case 274: /* trigger_cmd ::= scanpt select scanpt */
+{yylhsminor.yy33 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy47, yymsp[-2].minor.yy522, yymsp[0].minor.yy522); /*yylhsminor.yy33-overwrites-yymsp[-1].minor.yy47*/}
+ yymsp[-2].minor.yy33 = yylhsminor.yy33;
break;
- case 272: /* expr ::= RAISE LP IGNORE RP */
+ case 275: /* expr ::= RAISE LP IGNORE RP */
{
- yymsp[-3].minor.yy404 = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
- if( yymsp[-3].minor.yy404 ){
- yymsp[-3].minor.yy404->affExpr = OE_Ignore;
+ yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
+ if( yymsp[-3].minor.yy528 ){
+ yymsp[-3].minor.yy528->affExpr = OE_Ignore;
}
}
break;
- case 273: /* expr ::= RAISE LP raisetype COMMA nm RP */
+ case 276: /* expr ::= RAISE LP raisetype COMMA nm RP */
{
- yymsp[-5].minor.yy404 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1);
- if( yymsp[-5].minor.yy404 ) {
- yymsp[-5].minor.yy404->affExpr = (char)yymsp[-3].minor.yy376;
+ yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1);
+ if( yymsp[-5].minor.yy528 ) {
+ yymsp[-5].minor.yy528->affExpr = (char)yymsp[-3].minor.yy394;
}
}
break;
- case 274: /* raisetype ::= ROLLBACK */
-{yymsp[0].minor.yy376 = OE_Rollback;}
+ case 277: /* raisetype ::= ROLLBACK */
+{yymsp[0].minor.yy394 = OE_Rollback;}
break;
- case 276: /* raisetype ::= FAIL */
-{yymsp[0].minor.yy376 = OE_Fail;}
+ case 279: /* raisetype ::= FAIL */
+{yymsp[0].minor.yy394 = OE_Fail;}
break;
- case 277: /* cmd ::= DROP TRIGGER ifexists fullname */
+ case 280: /* cmd ::= DROP TRIGGER ifexists fullname */
{
- sqlite3DropTrigger(pParse,yymsp[0].minor.yy153,yymsp[-1].minor.yy376);
+ sqlite3DropTrigger(pParse,yymsp[0].minor.yy131,yymsp[-1].minor.yy394);
}
break;
- case 278: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+ case 281: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
{
- sqlite3Attach(pParse, yymsp[-3].minor.yy404, yymsp[-1].minor.yy404, yymsp[0].minor.yy404);
+ sqlite3Attach(pParse, yymsp[-3].minor.yy528, yymsp[-1].minor.yy528, yymsp[0].minor.yy528);
}
break;
- case 279: /* cmd ::= DETACH database_kw_opt expr */
+ case 282: /* cmd ::= DETACH database_kw_opt expr */
{
- sqlite3Detach(pParse, yymsp[0].minor.yy404);
+ sqlite3Detach(pParse, yymsp[0].minor.yy528);
}
break;
- case 282: /* cmd ::= REINDEX */
+ case 285: /* cmd ::= REINDEX */
{sqlite3Reindex(pParse, 0, 0);}
break;
- case 283: /* cmd ::= REINDEX nm dbnm */
+ case 286: /* cmd ::= REINDEX nm dbnm */
{sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
break;
- case 284: /* cmd ::= ANALYZE */
+ case 287: /* cmd ::= ANALYZE */
{sqlite3Analyze(pParse, 0, 0);}
break;
- case 285: /* cmd ::= ANALYZE nm dbnm */
+ case 288: /* cmd ::= ANALYZE nm dbnm */
{sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
break;
- case 286: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
+ case 289: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
{
- sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy153,&yymsp[0].minor.yy0);
+ sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy131,&yymsp[0].minor.yy0);
}
break;
- case 287: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
+ case 290: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */
{
yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n;
sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0);
}
break;
- case 288: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */
+ case 291: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */
{
- sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy153, &yymsp[0].minor.yy0);
+ sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy131, &yymsp[0].minor.yy0);
}
break;
- case 289: /* add_column_fullname ::= fullname */
+ case 292: /* add_column_fullname ::= fullname */
{
disableLookaside(pParse);
- sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy153);
+ sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy131);
}
break;
- case 290: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */
+ case 293: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */
{
- sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy153, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);
+ sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy131, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);
}
break;
- case 291: /* cmd ::= create_vtab */
+ case 294: /* cmd ::= create_vtab */
{sqlite3VtabFinishParse(pParse,0);}
break;
- case 292: /* cmd ::= create_vtab LP vtabarglist RP */
+ case 295: /* cmd ::= create_vtab LP vtabarglist RP */
{sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);}
break;
- case 293: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
+ case 296: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
{
- sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy376);
+ sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy394);
}
break;
- case 294: /* vtabarg ::= */
+ case 297: /* vtabarg ::= */
{sqlite3VtabArgInit(pParse);}
break;
- case 295: /* vtabargtoken ::= ANY */
- case 296: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==296);
- case 297: /* lp ::= LP */ yytestcase(yyruleno==297);
+ case 298: /* vtabargtoken ::= ANY */
+ case 299: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==299);
+ case 300: /* lp ::= LP */ yytestcase(yyruleno==300);
{sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);}
break;
- case 298: /* with ::= WITH wqlist */
- case 299: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==299);
-{ sqlite3WithPush(pParse, yymsp[0].minor.yy103, 1); }
+ case 301: /* with ::= WITH wqlist */
+ case 302: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==302);
+{ sqlite3WithPush(pParse, yymsp[0].minor.yy521, 1); }
break;
- case 300: /* wqas ::= AS */
-{yymsp[0].minor.yy552 = M10d_Any;}
+ case 303: /* wqas ::= AS */
+{yymsp[0].minor.yy516 = M10d_Any;}
break;
- case 301: /* wqas ::= AS MATERIALIZED */
-{yymsp[-1].minor.yy552 = M10d_Yes;}
+ case 304: /* wqas ::= AS MATERIALIZED */
+{yymsp[-1].minor.yy516 = M10d_Yes;}
break;
- case 302: /* wqas ::= AS NOT MATERIALIZED */
-{yymsp[-2].minor.yy552 = M10d_No;}
+ case 305: /* wqas ::= AS NOT MATERIALIZED */
+{yymsp[-2].minor.yy516 = M10d_No;}
break;
- case 303: /* wqitem ::= nm eidlist_opt wqas LP select RP */
+ case 306: /* wqitem ::= nm eidlist_opt wqas LP select RP */
{
- yymsp[-5].minor.yy329 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy70, yymsp[-1].minor.yy81, yymsp[-3].minor.yy552); /*A-overwrites-X*/
+ yymsp[-5].minor.yy385 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy322, yymsp[-1].minor.yy47, yymsp[-3].minor.yy516); /*A-overwrites-X*/
}
break;
- case 304: /* wqlist ::= wqitem */
+ case 307: /* wqlist ::= wqitem */
{
- yymsp[0].minor.yy103 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy329); /*A-overwrites-X*/
+ yymsp[0].minor.yy521 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy385); /*A-overwrites-X*/
}
break;
- case 305: /* wqlist ::= wqlist COMMA wqitem */
+ case 308: /* wqlist ::= wqlist COMMA wqitem */
{
- yymsp[-2].minor.yy103 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy103, yymsp[0].minor.yy329);
+ yymsp[-2].minor.yy521 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy521, yymsp[0].minor.yy385);
}
break;
- case 306: /* windowdefn_list ::= windowdefn */
-{ yylhsminor.yy49 = yymsp[0].minor.yy49; }
- yymsp[0].minor.yy49 = yylhsminor.yy49;
+ case 309: /* windowdefn_list ::= windowdefn */
+{ yylhsminor.yy41 = yymsp[0].minor.yy41; }
+ yymsp[0].minor.yy41 = yylhsminor.yy41;
break;
- case 307: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */
+ case 310: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */
{
- assert( yymsp[0].minor.yy49!=0 );
- sqlite3WindowChain(pParse, yymsp[0].minor.yy49, yymsp[-2].minor.yy49);
- yymsp[0].minor.yy49->pNextWin = yymsp[-2].minor.yy49;
- yylhsminor.yy49 = yymsp[0].minor.yy49;
+ assert( yymsp[0].minor.yy41!=0 );
+ sqlite3WindowChain(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy41);
+ yymsp[0].minor.yy41->pNextWin = yymsp[-2].minor.yy41;
+ yylhsminor.yy41 = yymsp[0].minor.yy41;
}
- yymsp[-2].minor.yy49 = yylhsminor.yy49;
+ yymsp[-2].minor.yy41 = yylhsminor.yy41;
break;
- case 308: /* windowdefn ::= nm AS LP window RP */
+ case 311: /* windowdefn ::= nm AS LP window RP */
{
- if( ALWAYS(yymsp[-1].minor.yy49) ){
- yymsp[-1].minor.yy49->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n);
+ if( ALWAYS(yymsp[-1].minor.yy41) ){
+ yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n);
}
- yylhsminor.yy49 = yymsp[-1].minor.yy49;
+ yylhsminor.yy41 = yymsp[-1].minor.yy41;
}
- yymsp[-4].minor.yy49 = yylhsminor.yy49;
+ yymsp[-4].minor.yy41 = yylhsminor.yy41;
break;
- case 309: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */
+ case 312: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */
{
- yymsp[-4].minor.yy49 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy49, yymsp[-2].minor.yy70, yymsp[-1].minor.yy70, 0);
+ yymsp[-4].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, 0);
}
break;
- case 310: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */
+ case 313: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */
{
- yylhsminor.yy49 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy49, yymsp[-2].minor.yy70, yymsp[-1].minor.yy70, &yymsp[-5].minor.yy0);
+ yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, &yymsp[-5].minor.yy0);
}
- yymsp[-5].minor.yy49 = yylhsminor.yy49;
+ yymsp[-5].minor.yy41 = yylhsminor.yy41;
break;
- case 311: /* window ::= ORDER BY sortlist frame_opt */
+ case 314: /* window ::= ORDER BY sortlist frame_opt */
{
- yymsp[-3].minor.yy49 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy49, 0, yymsp[-1].minor.yy70, 0);
+ yymsp[-3].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, 0);
}
break;
- case 312: /* window ::= nm ORDER BY sortlist frame_opt */
+ case 315: /* window ::= nm ORDER BY sortlist frame_opt */
{
- yylhsminor.yy49 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy49, 0, yymsp[-1].minor.yy70, &yymsp[-4].minor.yy0);
+ yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0);
}
- yymsp[-4].minor.yy49 = yylhsminor.yy49;
+ yymsp[-4].minor.yy41 = yylhsminor.yy41;
break;
- case 313: /* window ::= frame_opt */
- case 332: /* filter_over ::= over_clause */ yytestcase(yyruleno==332);
+ case 316: /* window ::= frame_opt */
+ case 335: /* filter_over ::= over_clause */ yytestcase(yyruleno==335);
{
- yylhsminor.yy49 = yymsp[0].minor.yy49;
+ yylhsminor.yy41 = yymsp[0].minor.yy41;
}
- yymsp[0].minor.yy49 = yylhsminor.yy49;
+ yymsp[0].minor.yy41 = yylhsminor.yy41;
break;
- case 314: /* window ::= nm frame_opt */
+ case 317: /* window ::= nm frame_opt */
{
- yylhsminor.yy49 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy49, 0, 0, &yymsp[-1].minor.yy0);
+ yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, 0, &yymsp[-1].minor.yy0);
}
- yymsp[-1].minor.yy49 = yylhsminor.yy49;
+ yymsp[-1].minor.yy41 = yylhsminor.yy41;
break;
- case 315: /* frame_opt ::= */
+ case 318: /* frame_opt ::= */
{
- yymsp[1].minor.yy49 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0);
+ yymsp[1].minor.yy41 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0);
}
break;
- case 316: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */
+ case 319: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */
{
- yylhsminor.yy49 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy376, yymsp[-1].minor.yy117.eType, yymsp[-1].minor.yy117.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy552);
+ yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy394, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy516);
}
- yymsp[-2].minor.yy49 = yylhsminor.yy49;
+ yymsp[-2].minor.yy41 = yylhsminor.yy41;
break;
- case 317: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */
+ case 320: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */
{
- yylhsminor.yy49 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy376, yymsp[-3].minor.yy117.eType, yymsp[-3].minor.yy117.pExpr, yymsp[-1].minor.yy117.eType, yymsp[-1].minor.yy117.pExpr, yymsp[0].minor.yy552);
+ yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy394, yymsp[-3].minor.yy595.eType, yymsp[-3].minor.yy595.pExpr, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, yymsp[0].minor.yy516);
}
- yymsp[-5].minor.yy49 = yylhsminor.yy49;
+ yymsp[-5].minor.yy41 = yylhsminor.yy41;
break;
- case 319: /* frame_bound_s ::= frame_bound */
- case 321: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==321);
-{yylhsminor.yy117 = yymsp[0].minor.yy117;}
- yymsp[0].minor.yy117 = yylhsminor.yy117;
+ case 322: /* frame_bound_s ::= frame_bound */
+ case 324: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==324);
+{yylhsminor.yy595 = yymsp[0].minor.yy595;}
+ yymsp[0].minor.yy595 = yylhsminor.yy595;
break;
- case 320: /* frame_bound_s ::= UNBOUNDED PRECEDING */
- case 322: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==322);
- case 324: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==324);
-{yylhsminor.yy117.eType = yymsp[-1].major; yylhsminor.yy117.pExpr = 0;}
- yymsp[-1].minor.yy117 = yylhsminor.yy117;
+ case 323: /* frame_bound_s ::= UNBOUNDED PRECEDING */
+ case 325: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==325);
+ case 327: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==327);
+{yylhsminor.yy595.eType = yymsp[-1].major; yylhsminor.yy595.pExpr = 0;}
+ yymsp[-1].minor.yy595 = yylhsminor.yy595;
break;
- case 323: /* frame_bound ::= expr PRECEDING|FOLLOWING */
-{yylhsminor.yy117.eType = yymsp[0].major; yylhsminor.yy117.pExpr = yymsp[-1].minor.yy404;}
- yymsp[-1].minor.yy117 = yylhsminor.yy117;
+ case 326: /* frame_bound ::= expr PRECEDING|FOLLOWING */
+{yylhsminor.yy595.eType = yymsp[0].major; yylhsminor.yy595.pExpr = yymsp[-1].minor.yy528;}
+ yymsp[-1].minor.yy595 = yylhsminor.yy595;
break;
- case 325: /* frame_exclude_opt ::= */
-{yymsp[1].minor.yy552 = 0;}
+ case 328: /* frame_exclude_opt ::= */
+{yymsp[1].minor.yy516 = 0;}
break;
- case 326: /* frame_exclude_opt ::= EXCLUDE frame_exclude */
-{yymsp[-1].minor.yy552 = yymsp[0].minor.yy552;}
+ case 329: /* frame_exclude_opt ::= EXCLUDE frame_exclude */
+{yymsp[-1].minor.yy516 = yymsp[0].minor.yy516;}
break;
- case 327: /* frame_exclude ::= NO OTHERS */
- case 328: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==328);
-{yymsp[-1].minor.yy552 = yymsp[-1].major; /*A-overwrites-X*/}
+ case 330: /* frame_exclude ::= NO OTHERS */
+ case 331: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==331);
+{yymsp[-1].minor.yy516 = yymsp[-1].major; /*A-overwrites-X*/}
break;
- case 329: /* frame_exclude ::= GROUP|TIES */
-{yymsp[0].minor.yy552 = yymsp[0].major; /*A-overwrites-X*/}
+ case 332: /* frame_exclude ::= GROUP|TIES */
+{yymsp[0].minor.yy516 = yymsp[0].major; /*A-overwrites-X*/}
break;
- case 330: /* window_clause ::= WINDOW windowdefn_list */
-{ yymsp[-1].minor.yy49 = yymsp[0].minor.yy49; }
+ case 333: /* window_clause ::= WINDOW windowdefn_list */
+{ yymsp[-1].minor.yy41 = yymsp[0].minor.yy41; }
break;
- case 331: /* filter_over ::= filter_clause over_clause */
+ case 334: /* filter_over ::= filter_clause over_clause */
{
- if( yymsp[0].minor.yy49 ){
- yymsp[0].minor.yy49->pFilter = yymsp[-1].minor.yy404;
+ if( yymsp[0].minor.yy41 ){
+ yymsp[0].minor.yy41->pFilter = yymsp[-1].minor.yy528;
}else{
- sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy404);
+ sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy528);
}
- yylhsminor.yy49 = yymsp[0].minor.yy49;
+ yylhsminor.yy41 = yymsp[0].minor.yy41;
}
- yymsp[-1].minor.yy49 = yylhsminor.yy49;
+ yymsp[-1].minor.yy41 = yylhsminor.yy41;
break;
- case 333: /* filter_over ::= filter_clause */
+ case 336: /* filter_over ::= filter_clause */
{
- yylhsminor.yy49 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
- if( yylhsminor.yy49 ){
- yylhsminor.yy49->eFrmType = TK_FILTER;
- yylhsminor.yy49->pFilter = yymsp[0].minor.yy404;
+ yylhsminor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
+ if( yylhsminor.yy41 ){
+ yylhsminor.yy41->eFrmType = TK_FILTER;
+ yylhsminor.yy41->pFilter = yymsp[0].minor.yy528;
}else{
- sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy404);
+ sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy528);
}
}
- yymsp[0].minor.yy49 = yylhsminor.yy49;
+ yymsp[0].minor.yy41 = yylhsminor.yy41;
break;
- case 334: /* over_clause ::= OVER LP window RP */
+ case 337: /* over_clause ::= OVER LP window RP */
{
- yymsp[-3].minor.yy49 = yymsp[-1].minor.yy49;
- assert( yymsp[-3].minor.yy49!=0 );
+ yymsp[-3].minor.yy41 = yymsp[-1].minor.yy41;
+ assert( yymsp[-3].minor.yy41!=0 );
}
break;
- case 335: /* over_clause ::= OVER nm */
+ case 338: /* over_clause ::= OVER nm */
{
- yymsp[-1].minor.yy49 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
- if( yymsp[-1].minor.yy49 ){
- yymsp[-1].minor.yy49->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n);
+ yymsp[-1].minor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
+ if( yymsp[-1].minor.yy41 ){
+ yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n);
}
}
break;
- case 336: /* filter_clause ::= FILTER LP WHERE expr RP */
-{ yymsp[-4].minor.yy404 = yymsp[-1].minor.yy404; }
+ case 339: /* filter_clause ::= FILTER LP WHERE expr RP */
+{ yymsp[-4].minor.yy528 = yymsp[-1].minor.yy528; }
break;
default:
- /* (337) input ::= cmdlist */ yytestcase(yyruleno==337);
- /* (338) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==338);
- /* (339) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=339);
- /* (340) ecmd ::= SEMI */ yytestcase(yyruleno==340);
- /* (341) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==341);
- /* (342) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=342);
- /* (343) trans_opt ::= */ yytestcase(yyruleno==343);
- /* (344) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==344);
- /* (345) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==345);
- /* (346) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==346);
- /* (347) savepoint_opt ::= */ yytestcase(yyruleno==347);
- /* (348) cmd ::= create_table create_table_args */ yytestcase(yyruleno==348);
- /* (349) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==349);
- /* (350) columnlist ::= columnname carglist */ yytestcase(yyruleno==350);
- /* (351) nm ::= ID|INDEXED */ yytestcase(yyruleno==351);
- /* (352) nm ::= STRING */ yytestcase(yyruleno==352);
- /* (353) nm ::= JOIN_KW */ yytestcase(yyruleno==353);
- /* (354) typetoken ::= typename */ yytestcase(yyruleno==354);
- /* (355) typename ::= ID|STRING */ yytestcase(yyruleno==355);
- /* (356) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=356);
- /* (357) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=357);
- /* (358) carglist ::= carglist ccons */ yytestcase(yyruleno==358);
- /* (359) carglist ::= */ yytestcase(yyruleno==359);
- /* (360) ccons ::= NULL onconf */ yytestcase(yyruleno==360);
- /* (361) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==361);
- /* (362) ccons ::= AS generated */ yytestcase(yyruleno==362);
- /* (363) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==363);
- /* (364) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==364);
- /* (365) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=365);
- /* (366) tconscomma ::= */ yytestcase(yyruleno==366);
- /* (367) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=367);
- /* (368) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=368);
- /* (369) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=369);
- /* (370) oneselect ::= values */ yytestcase(yyruleno==370);
- /* (371) sclp ::= selcollist COMMA */ yytestcase(yyruleno==371);
- /* (372) as ::= ID|STRING */ yytestcase(yyruleno==372);
- /* (373) returning ::= */ yytestcase(yyruleno==373);
- /* (374) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=374);
- /* (375) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==375);
- /* (376) exprlist ::= nexprlist */ yytestcase(yyruleno==376);
- /* (377) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=377);
- /* (378) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=378);
- /* (379) nmnum ::= ON */ yytestcase(yyruleno==379);
- /* (380) nmnum ::= DELETE */ yytestcase(yyruleno==380);
- /* (381) nmnum ::= DEFAULT */ yytestcase(yyruleno==381);
- /* (382) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==382);
- /* (383) foreach_clause ::= */ yytestcase(yyruleno==383);
- /* (384) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==384);
- /* (385) trnm ::= nm */ yytestcase(yyruleno==385);
- /* (386) tridxby ::= */ yytestcase(yyruleno==386);
- /* (387) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==387);
- /* (388) database_kw_opt ::= */ yytestcase(yyruleno==388);
- /* (389) kwcolumn_opt ::= */ yytestcase(yyruleno==389);
- /* (390) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==390);
- /* (391) vtabarglist ::= vtabarg */ yytestcase(yyruleno==391);
- /* (392) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==392);
- /* (393) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==393);
- /* (394) anylist ::= */ yytestcase(yyruleno==394);
- /* (395) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==395);
- /* (396) anylist ::= anylist ANY */ yytestcase(yyruleno==396);
- /* (397) with ::= */ yytestcase(yyruleno==397);
+ /* (340) input ::= cmdlist */ yytestcase(yyruleno==340);
+ /* (341) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==341);
+ /* (342) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=342);
+ /* (343) ecmd ::= SEMI */ yytestcase(yyruleno==343);
+ /* (344) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==344);
+ /* (345) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=345);
+ /* (346) trans_opt ::= */ yytestcase(yyruleno==346);
+ /* (347) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==347);
+ /* (348) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==348);
+ /* (349) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==349);
+ /* (350) savepoint_opt ::= */ yytestcase(yyruleno==350);
+ /* (351) cmd ::= create_table create_table_args */ yytestcase(yyruleno==351);
+ /* (352) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=352);
+ /* (353) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==353);
+ /* (354) columnlist ::= columnname carglist */ yytestcase(yyruleno==354);
+ /* (355) nm ::= ID|INDEXED|JOIN_KW */ yytestcase(yyruleno==355);
+ /* (356) nm ::= STRING */ yytestcase(yyruleno==356);
+ /* (357) typetoken ::= typename */ yytestcase(yyruleno==357);
+ /* (358) typename ::= ID|STRING */ yytestcase(yyruleno==358);
+ /* (359) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=359);
+ /* (360) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=360);
+ /* (361) carglist ::= carglist ccons */ yytestcase(yyruleno==361);
+ /* (362) carglist ::= */ yytestcase(yyruleno==362);
+ /* (363) ccons ::= NULL onconf */ yytestcase(yyruleno==363);
+ /* (364) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==364);
+ /* (365) ccons ::= AS generated */ yytestcase(yyruleno==365);
+ /* (366) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==366);
+ /* (367) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==367);
+ /* (368) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=368);
+ /* (369) tconscomma ::= */ yytestcase(yyruleno==369);
+ /* (370) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=370);
+ /* (371) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=371);
+ /* (372) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=372);
+ /* (373) oneselect ::= values */ yytestcase(yyruleno==373);
+ /* (374) sclp ::= selcollist COMMA */ yytestcase(yyruleno==374);
+ /* (375) as ::= ID|STRING */ yytestcase(yyruleno==375);
+ /* (376) indexed_opt ::= indexed_by (OPTIMIZED OUT) */ assert(yyruleno!=376);
+ /* (377) returning ::= */ yytestcase(yyruleno==377);
+ /* (378) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=378);
+ /* (379) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==379);
+ /* (380) case_operand ::= expr */ yytestcase(yyruleno==380);
+ /* (381) exprlist ::= nexprlist */ yytestcase(yyruleno==381);
+ /* (382) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=382);
+ /* (383) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=383);
+ /* (384) nmnum ::= ON */ yytestcase(yyruleno==384);
+ /* (385) nmnum ::= DELETE */ yytestcase(yyruleno==385);
+ /* (386) nmnum ::= DEFAULT */ yytestcase(yyruleno==386);
+ /* (387) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==387);
+ /* (388) foreach_clause ::= */ yytestcase(yyruleno==388);
+ /* (389) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==389);
+ /* (390) trnm ::= nm */ yytestcase(yyruleno==390);
+ /* (391) tridxby ::= */ yytestcase(yyruleno==391);
+ /* (392) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==392);
+ /* (393) database_kw_opt ::= */ yytestcase(yyruleno==393);
+ /* (394) kwcolumn_opt ::= */ yytestcase(yyruleno==394);
+ /* (395) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==395);
+ /* (396) vtabarglist ::= vtabarg */ yytestcase(yyruleno==396);
+ /* (397) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==397);
+ /* (398) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==398);
+ /* (399) anylist ::= */ yytestcase(yyruleno==399);
+ /* (400) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==400);
+ /* (401) anylist ::= anylist ANY */ yytestcase(yyruleno==401);
+ /* (402) with ::= */ yytestcase(yyruleno==402);
break;
/********** End reduce actions ************************************************/
};
@@ -163148,8 +172970,8 @@ SQLITE_PRIVATE void sqlite3Parser(
yyact = yy_find_shift_action((YYCODETYPE)yymajor,yyact);
if( yyact >= YY_MIN_REDUCE ){
unsigned int yyruleno = yyact - YY_MIN_REDUCE; /* Reduce by this rule */
- assert( yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) );
#ifndef NDEBUG
+ assert( yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) );
if( yyTraceFILE ){
int yysize = yyRuleInfoNRhs[yyruleno];
if( yysize ){
@@ -163247,14 +173069,13 @@ SQLITE_PRIVATE void sqlite3Parser(
yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion);
yymajor = YYNOCODE;
}else{
- while( yypParser->yytos >= yypParser->yystack
- && (yyact = yy_find_reduce_action(
- yypParser->yytos->stateno,
- YYERRORSYMBOL)) > YY_MAX_SHIFTREDUCE
- ){
+ while( yypParser->yytos > yypParser->yystack ){
+ yyact = yy_find_reduce_action(yypParser->yytos->stateno,
+ YYERRORSYMBOL);
+ if( yyact<=YY_MAX_SHIFTREDUCE ) break;
yy_pop_parser_stack(yypParser);
}
- if( yypParser->yytos < yypParser->yystack || yymajor==0 ){
+ if( yypParser->yytos <= yypParser->yystack || yymajor==0 ){
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
yy_parse_failed(yypParser);
#ifndef YYNOERRORRECOVERY
@@ -163567,7 +173388,7 @@ static const unsigned char aKWHash[127] = {
/* aKWNext[] forms the hash collision chain. If aKWHash[i]==0
** then the i-th keyword has no more hash collisions. Otherwise,
** the next keyword with the same hash is aKWHash[i]-1. */
-static const unsigned char aKWNext[147] = {
+static const unsigned char aKWNext[148] = {0,
0, 0, 0, 0, 4, 0, 43, 0, 0, 106, 114, 0, 0,
0, 2, 0, 0, 143, 0, 0, 0, 13, 0, 0, 0, 0,
141, 0, 0, 119, 52, 0, 0, 137, 12, 0, 0, 62, 0,
@@ -163582,7 +173403,7 @@ static const unsigned char aKWNext[147] = {
102, 0, 0, 87,
};
/* aKWLen[i] is the length (in bytes) of the i-th keyword */
-static const unsigned char aKWLen[147] = {
+static const unsigned char aKWLen[148] = {0,
7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6,
7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 7,
6, 9, 4, 2, 6, 5, 9, 9, 4, 7, 3, 2, 4,
@@ -163598,7 +173419,7 @@ static const unsigned char aKWLen[147] = {
};
/* aKWOffset[i] is the index into zKWText[] of the start of
** the text for the i-th keyword. */
-static const unsigned short int aKWOffset[147] = {
+static const unsigned short int aKWOffset[148] = {0,
0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33,
36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81,
86, 90, 90, 94, 99, 101, 105, 111, 119, 123, 123, 123, 126,
@@ -163613,7 +173434,7 @@ static const unsigned short int aKWOffset[147] = {
648, 650, 655, 659,
};
/* aKWCode[i] is the parser symbol code for the i-th keyword */
-static const unsigned char aKWCode[147] = {
+static const unsigned char aKWCode[148] = {0,
TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE,
TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN,
TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD,
@@ -163782,7 +173603,7 @@ static int keywordCode(const char *z, int n, int *pType){
const char *zKW;
if( n>=2 ){
i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n*1) % 127;
- for(i=((int)aKWHash[i])-1; i>=0; i=((int)aKWNext[i])-1){
+ for(i=(int)aKWHash[i]; i>0; i=aKWNext[i]){
if( aKWLen[i]!=n ) continue;
zKW = &zKWText[aKWOffset[i]];
#ifdef SQLITE_ASCII
@@ -163798,153 +173619,153 @@ static int keywordCode(const char *z, int n, int *pType){
while( j<n && toupper(z[j])==zKW[j] ){ j++; }
#endif
if( j<n ) continue;
- testcase( i==0 ); /* REINDEX */
- testcase( i==1 ); /* INDEXED */
- testcase( i==2 ); /* INDEX */
- testcase( i==3 ); /* DESC */
- testcase( i==4 ); /* ESCAPE */
- testcase( i==5 ); /* EACH */
- testcase( i==6 ); /* CHECK */
- testcase( i==7 ); /* KEY */
- testcase( i==8 ); /* BEFORE */
- testcase( i==9 ); /* FOREIGN */
- testcase( i==10 ); /* FOR */
- testcase( i==11 ); /* IGNORE */
- testcase( i==12 ); /* REGEXP */
- testcase( i==13 ); /* EXPLAIN */
- testcase( i==14 ); /* INSTEAD */
- testcase( i==15 ); /* ADD */
- testcase( i==16 ); /* DATABASE */
- testcase( i==17 ); /* AS */
- testcase( i==18 ); /* SELECT */
- testcase( i==19 ); /* TABLE */
- testcase( i==20 ); /* LEFT */
- testcase( i==21 ); /* THEN */
- testcase( i==22 ); /* END */
- testcase( i==23 ); /* DEFERRABLE */
- testcase( i==24 ); /* ELSE */
- testcase( i==25 ); /* EXCLUDE */
- testcase( i==26 ); /* DELETE */
- testcase( i==27 ); /* TEMPORARY */
- testcase( i==28 ); /* TEMP */
- testcase( i==29 ); /* OR */
- testcase( i==30 ); /* ISNULL */
- testcase( i==31 ); /* NULLS */
- testcase( i==32 ); /* SAVEPOINT */
- testcase( i==33 ); /* INTERSECT */
- testcase( i==34 ); /* TIES */
- testcase( i==35 ); /* NOTNULL */
- testcase( i==36 ); /* NOT */
- testcase( i==37 ); /* NO */
- testcase( i==38 ); /* NULL */
- testcase( i==39 ); /* LIKE */
- testcase( i==40 ); /* EXCEPT */
- testcase( i==41 ); /* TRANSACTION */
- testcase( i==42 ); /* ACTION */
- testcase( i==43 ); /* ON */
- testcase( i==44 ); /* NATURAL */
- testcase( i==45 ); /* ALTER */
- testcase( i==46 ); /* RAISE */
- testcase( i==47 ); /* EXCLUSIVE */
- testcase( i==48 ); /* EXISTS */
- testcase( i==49 ); /* CONSTRAINT */
- testcase( i==50 ); /* INTO */
- testcase( i==51 ); /* OFFSET */
- testcase( i==52 ); /* OF */
- testcase( i==53 ); /* SET */
- testcase( i==54 ); /* TRIGGER */
- testcase( i==55 ); /* RANGE */
- testcase( i==56 ); /* GENERATED */
- testcase( i==57 ); /* DETACH */
- testcase( i==58 ); /* HAVING */
- testcase( i==59 ); /* GLOB */
- testcase( i==60 ); /* BEGIN */
- testcase( i==61 ); /* INNER */
- testcase( i==62 ); /* REFERENCES */
- testcase( i==63 ); /* UNIQUE */
- testcase( i==64 ); /* QUERY */
- testcase( i==65 ); /* WITHOUT */
- testcase( i==66 ); /* WITH */
- testcase( i==67 ); /* OUTER */
- testcase( i==68 ); /* RELEASE */
- testcase( i==69 ); /* ATTACH */
- testcase( i==70 ); /* BETWEEN */
- testcase( i==71 ); /* NOTHING */
- testcase( i==72 ); /* GROUPS */
- testcase( i==73 ); /* GROUP */
- testcase( i==74 ); /* CASCADE */
- testcase( i==75 ); /* ASC */
- testcase( i==76 ); /* DEFAULT */
- testcase( i==77 ); /* CASE */
- testcase( i==78 ); /* COLLATE */
- testcase( i==79 ); /* CREATE */
- testcase( i==80 ); /* CURRENT_DATE */
- testcase( i==81 ); /* IMMEDIATE */
- testcase( i==82 ); /* JOIN */
- testcase( i==83 ); /* INSERT */
- testcase( i==84 ); /* MATCH */
- testcase( i==85 ); /* PLAN */
- testcase( i==86 ); /* ANALYZE */
- testcase( i==87 ); /* PRAGMA */
- testcase( i==88 ); /* MATERIALIZED */
- testcase( i==89 ); /* DEFERRED */
- testcase( i==90 ); /* DISTINCT */
- testcase( i==91 ); /* IS */
- testcase( i==92 ); /* UPDATE */
- testcase( i==93 ); /* VALUES */
- testcase( i==94 ); /* VIRTUAL */
- testcase( i==95 ); /* ALWAYS */
- testcase( i==96 ); /* WHEN */
- testcase( i==97 ); /* WHERE */
- testcase( i==98 ); /* RECURSIVE */
- testcase( i==99 ); /* ABORT */
- testcase( i==100 ); /* AFTER */
- testcase( i==101 ); /* RENAME */
- testcase( i==102 ); /* AND */
- testcase( i==103 ); /* DROP */
- testcase( i==104 ); /* PARTITION */
- testcase( i==105 ); /* AUTOINCREMENT */
- testcase( i==106 ); /* TO */
- testcase( i==107 ); /* IN */
- testcase( i==108 ); /* CAST */
- testcase( i==109 ); /* COLUMN */
- testcase( i==110 ); /* COMMIT */
- testcase( i==111 ); /* CONFLICT */
- testcase( i==112 ); /* CROSS */
- testcase( i==113 ); /* CURRENT_TIMESTAMP */
- testcase( i==114 ); /* CURRENT_TIME */
- testcase( i==115 ); /* CURRENT */
- testcase( i==116 ); /* PRECEDING */
- testcase( i==117 ); /* FAIL */
- testcase( i==118 ); /* LAST */
- testcase( i==119 ); /* FILTER */
- testcase( i==120 ); /* REPLACE */
- testcase( i==121 ); /* FIRST */
- testcase( i==122 ); /* FOLLOWING */
- testcase( i==123 ); /* FROM */
- testcase( i==124 ); /* FULL */
- testcase( i==125 ); /* LIMIT */
- testcase( i==126 ); /* IF */
- testcase( i==127 ); /* ORDER */
- testcase( i==128 ); /* RESTRICT */
- testcase( i==129 ); /* OTHERS */
- testcase( i==130 ); /* OVER */
- testcase( i==131 ); /* RETURNING */
- testcase( i==132 ); /* RIGHT */
- testcase( i==133 ); /* ROLLBACK */
- testcase( i==134 ); /* ROWS */
- testcase( i==135 ); /* ROW */
- testcase( i==136 ); /* UNBOUNDED */
- testcase( i==137 ); /* UNION */
- testcase( i==138 ); /* USING */
- testcase( i==139 ); /* VACUUM */
- testcase( i==140 ); /* VIEW */
- testcase( i==141 ); /* WINDOW */
- testcase( i==142 ); /* DO */
- testcase( i==143 ); /* BY */
- testcase( i==144 ); /* INITIALLY */
- testcase( i==145 ); /* ALL */
- testcase( i==146 ); /* PRIMARY */
+ testcase( i==1 ); /* REINDEX */
+ testcase( i==2 ); /* INDEXED */
+ testcase( i==3 ); /* INDEX */
+ testcase( i==4 ); /* DESC */
+ testcase( i==5 ); /* ESCAPE */
+ testcase( i==6 ); /* EACH */
+ testcase( i==7 ); /* CHECK */
+ testcase( i==8 ); /* KEY */
+ testcase( i==9 ); /* BEFORE */
+ testcase( i==10 ); /* FOREIGN */
+ testcase( i==11 ); /* FOR */
+ testcase( i==12 ); /* IGNORE */
+ testcase( i==13 ); /* REGEXP */
+ testcase( i==14 ); /* EXPLAIN */
+ testcase( i==15 ); /* INSTEAD */
+ testcase( i==16 ); /* ADD */
+ testcase( i==17 ); /* DATABASE */
+ testcase( i==18 ); /* AS */
+ testcase( i==19 ); /* SELECT */
+ testcase( i==20 ); /* TABLE */
+ testcase( i==21 ); /* LEFT */
+ testcase( i==22 ); /* THEN */
+ testcase( i==23 ); /* END */
+ testcase( i==24 ); /* DEFERRABLE */
+ testcase( i==25 ); /* ELSE */
+ testcase( i==26 ); /* EXCLUDE */
+ testcase( i==27 ); /* DELETE */
+ testcase( i==28 ); /* TEMPORARY */
+ testcase( i==29 ); /* TEMP */
+ testcase( i==30 ); /* OR */
+ testcase( i==31 ); /* ISNULL */
+ testcase( i==32 ); /* NULLS */
+ testcase( i==33 ); /* SAVEPOINT */
+ testcase( i==34 ); /* INTERSECT */
+ testcase( i==35 ); /* TIES */
+ testcase( i==36 ); /* NOTNULL */
+ testcase( i==37 ); /* NOT */
+ testcase( i==38 ); /* NO */
+ testcase( i==39 ); /* NULL */
+ testcase( i==40 ); /* LIKE */
+ testcase( i==41 ); /* EXCEPT */
+ testcase( i==42 ); /* TRANSACTION */
+ testcase( i==43 ); /* ACTION */
+ testcase( i==44 ); /* ON */
+ testcase( i==45 ); /* NATURAL */
+ testcase( i==46 ); /* ALTER */
+ testcase( i==47 ); /* RAISE */
+ testcase( i==48 ); /* EXCLUSIVE */
+ testcase( i==49 ); /* EXISTS */
+ testcase( i==50 ); /* CONSTRAINT */
+ testcase( i==51 ); /* INTO */
+ testcase( i==52 ); /* OFFSET */
+ testcase( i==53 ); /* OF */
+ testcase( i==54 ); /* SET */
+ testcase( i==55 ); /* TRIGGER */
+ testcase( i==56 ); /* RANGE */
+ testcase( i==57 ); /* GENERATED */
+ testcase( i==58 ); /* DETACH */
+ testcase( i==59 ); /* HAVING */
+ testcase( i==60 ); /* GLOB */
+ testcase( i==61 ); /* BEGIN */
+ testcase( i==62 ); /* INNER */
+ testcase( i==63 ); /* REFERENCES */
+ testcase( i==64 ); /* UNIQUE */
+ testcase( i==65 ); /* QUERY */
+ testcase( i==66 ); /* WITHOUT */
+ testcase( i==67 ); /* WITH */
+ testcase( i==68 ); /* OUTER */
+ testcase( i==69 ); /* RELEASE */
+ testcase( i==70 ); /* ATTACH */
+ testcase( i==71 ); /* BETWEEN */
+ testcase( i==72 ); /* NOTHING */
+ testcase( i==73 ); /* GROUPS */
+ testcase( i==74 ); /* GROUP */
+ testcase( i==75 ); /* CASCADE */
+ testcase( i==76 ); /* ASC */
+ testcase( i==77 ); /* DEFAULT */
+ testcase( i==78 ); /* CASE */
+ testcase( i==79 ); /* COLLATE */
+ testcase( i==80 ); /* CREATE */
+ testcase( i==81 ); /* CURRENT_DATE */
+ testcase( i==82 ); /* IMMEDIATE */
+ testcase( i==83 ); /* JOIN */
+ testcase( i==84 ); /* INSERT */
+ testcase( i==85 ); /* MATCH */
+ testcase( i==86 ); /* PLAN */
+ testcase( i==87 ); /* ANALYZE */
+ testcase( i==88 ); /* PRAGMA */
+ testcase( i==89 ); /* MATERIALIZED */
+ testcase( i==90 ); /* DEFERRED */
+ testcase( i==91 ); /* DISTINCT */
+ testcase( i==92 ); /* IS */
+ testcase( i==93 ); /* UPDATE */
+ testcase( i==94 ); /* VALUES */
+ testcase( i==95 ); /* VIRTUAL */
+ testcase( i==96 ); /* ALWAYS */
+ testcase( i==97 ); /* WHEN */
+ testcase( i==98 ); /* WHERE */
+ testcase( i==99 ); /* RECURSIVE */
+ testcase( i==100 ); /* ABORT */
+ testcase( i==101 ); /* AFTER */
+ testcase( i==102 ); /* RENAME */
+ testcase( i==103 ); /* AND */
+ testcase( i==104 ); /* DROP */
+ testcase( i==105 ); /* PARTITION */
+ testcase( i==106 ); /* AUTOINCREMENT */
+ testcase( i==107 ); /* TO */
+ testcase( i==108 ); /* IN */
+ testcase( i==109 ); /* CAST */
+ testcase( i==110 ); /* COLUMN */
+ testcase( i==111 ); /* COMMIT */
+ testcase( i==112 ); /* CONFLICT */
+ testcase( i==113 ); /* CROSS */
+ testcase( i==114 ); /* CURRENT_TIMESTAMP */
+ testcase( i==115 ); /* CURRENT_TIME */
+ testcase( i==116 ); /* CURRENT */
+ testcase( i==117 ); /* PRECEDING */
+ testcase( i==118 ); /* FAIL */
+ testcase( i==119 ); /* LAST */
+ testcase( i==120 ); /* FILTER */
+ testcase( i==121 ); /* REPLACE */
+ testcase( i==122 ); /* FIRST */
+ testcase( i==123 ); /* FOLLOWING */
+ testcase( i==124 ); /* FROM */
+ testcase( i==125 ); /* FULL */
+ testcase( i==126 ); /* LIMIT */
+ testcase( i==127 ); /* IF */
+ testcase( i==128 ); /* ORDER */
+ testcase( i==129 ); /* RESTRICT */
+ testcase( i==130 ); /* OTHERS */
+ testcase( i==131 ); /* OVER */
+ testcase( i==132 ); /* RETURNING */
+ testcase( i==133 ); /* RIGHT */
+ testcase( i==134 ); /* ROLLBACK */
+ testcase( i==135 ); /* ROWS */
+ testcase( i==136 ); /* ROW */
+ testcase( i==137 ); /* UNBOUNDED */
+ testcase( i==138 ); /* UNION */
+ testcase( i==139 ); /* USING */
+ testcase( i==140 ); /* VACUUM */
+ testcase( i==141 ); /* VIEW */
+ testcase( i==142 ); /* WINDOW */
+ testcase( i==143 ); /* DO */
+ testcase( i==144 ); /* BY */
+ testcase( i==145 ); /* INITIALLY */
+ testcase( i==146 ); /* ALL */
+ testcase( i==147 ); /* PRIMARY */
*pType = aKWCode[i];
break;
}
@@ -163959,6 +173780,7 @@ SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){
#define SQLITE_N_KEYWORD 147
SQLITE_API int sqlite3_keyword_name(int i,const char **pzName,int *pnName){
if( i<0 || i>=SQLITE_N_KEYWORD ) return SQLITE_ERROR;
+ i++;
*pzName = zKWText + aKWOffset[i];
*pnName = aKWLen[i];
return SQLITE_OK;
@@ -164114,6 +173936,9 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
for(i=2; (c=z[i])!=0 && c!='\n'; i++){}
*tokenType = TK_SPACE; /* IMP: R-22934-25134 */
return i;
+ }else if( z[1]=='>' ){
+ *tokenType = TK_PTR;
+ return 2 + (z[2]=='>');
}
*tokenType = TK_MINUS;
return 1;
@@ -164383,13 +174208,9 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
}
/*
-** Run the parser on the given SQL string. The parser structure is
-** passed in. An SQLITE_ status code is returned. If an error occurs
-** then an and attempt is made to write an error message into
-** memory obtained from sqlite3_malloc() and to make *pzErrMsg point to that
-** error message.
+** Run the parser on the given SQL string.
*/
-SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
+SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){
int nErr = 0; /* Number of errors encountered */
void *pEngine; /* The LEMON-generated LALR(1) parser */
int n = 0; /* Length of the next token token */
@@ -164397,6 +174218,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
int lastTokenParsed = -1; /* type of the previous token */
sqlite3 *db = pParse->db; /* The database connection */
int mxSqlLen; /* Max length of an SQL string */
+ Parse *pParentParse = 0; /* Outer parse context, if any */
#ifdef sqlite3Parser_ENGINEALWAYSONSTACK
yyParser sEngine; /* Space to hold the Lemon-generated Parser object */
#endif
@@ -164409,7 +174231,6 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
}
pParse->rc = SQLITE_OK;
pParse->zTail = zSql;
- assert( pzErrMsg!=0 );
#ifdef SQLITE_DEBUG
if( db->flags & SQLITE_ParserTrace ){
printf("parser: [[[%s]]]\n", zSql);
@@ -164432,13 +174253,14 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
assert( pParse->pNewTrigger==0 );
assert( pParse->nVar==0 );
assert( pParse->pVList==0 );
- pParse->pParentParse = db->pParse;
+ pParentParse = db->pParse;
db->pParse = pParse;
while( 1 ){
n = sqlite3GetToken((u8*)zSql, &tokenType);
mxSqlLen -= n;
if( mxSqlLen<0 ){
pParse->rc = SQLITE_TOOBIG;
+ pParse->nErr++;
break;
}
#ifndef SQLITE_OMIT_WINDOWFUNC
@@ -164452,6 +174274,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
#endif /* SQLITE_OMIT_WINDOWFUNC */
if( AtomicLoad(&db->u1.isInterrupted) ){
pParse->rc = SQLITE_INTERRUPT;
+ pParse->nErr++;
break;
}
if( tokenType==TK_SPACE ){
@@ -164481,7 +174304,10 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed);
#endif /* SQLITE_OMIT_WINDOWFUNC */
}else{
- sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql);
+ Token x;
+ x.z = zSql;
+ x.n = n;
+ sqlite3ErrorMsg(pParse, "unrecognized token: \"%T\"", &x);
break;
}
}
@@ -164509,46 +174335,30 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
if( db->mallocFailed ){
pParse->rc = SQLITE_NOMEM_BKPT;
}
- if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){
- pParse->zErrMsg = sqlite3MPrintf(db, "%s", sqlite3ErrStr(pParse->rc));
- }
- assert( pzErrMsg!=0 );
- if( pParse->zErrMsg ){
- *pzErrMsg = pParse->zErrMsg;
- sqlite3_log(pParse->rc, "%s in \"%s\"",
- *pzErrMsg, pParse->zTail);
- pParse->zErrMsg = 0;
+ if( pParse->zErrMsg || (pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE) ){
+ if( pParse->zErrMsg==0 ){
+ pParse->zErrMsg = sqlite3MPrintf(db, "%s", sqlite3ErrStr(pParse->rc));
+ }
+ sqlite3_log(pParse->rc, "%s in \"%s\"", pParse->zErrMsg, pParse->zTail);
nErr++;
}
pParse->zTail = zSql;
- if( pParse->pVdbe && pParse->nErr>0 && pParse->nested==0 ){
- sqlite3VdbeDelete(pParse->pVdbe);
- pParse->pVdbe = 0;
- }
-#ifndef SQLITE_OMIT_SHARED_CACHE
- if( pParse->nested==0 ){
- sqlite3DbFree(db, pParse->aTableLock);
- pParse->aTableLock = 0;
- pParse->nTableLock = 0;
- }
-#endif
#ifndef SQLITE_OMIT_VIRTUALTABLE
sqlite3_free(pParse->apVtabLock);
#endif
- if( !IN_SPECIAL_PARSE ){
+ if( pParse->pNewTable && !IN_SPECIAL_PARSE ){
/* If the pParse->declareVtab flag is set, do not delete any table
** structure built up in pParse->pNewTable. The calling code (see vtab.c)
** will take responsibility for freeing the Table structure.
*/
sqlite3DeleteTable(db, pParse->pNewTable);
}
- if( !IN_RENAME_OBJECT ){
+ if( pParse->pNewTrigger && !IN_RENAME_OBJECT ){
sqlite3DeleteTrigger(db, pParse->pNewTrigger);
}
- sqlite3DbFree(db, pParse->pVList);
- db->pParse = pParse->pParentParse;
- pParse->pParentParse = 0;
+ if( pParse->pVList ) sqlite3DbNNFreeNN(db, pParse->pVList);
+ db->pParse = pParentParse;
assert( nErr==0 || pParse->rc!=SQLITE_OK );
return nErr;
}
@@ -165129,9 +174939,6 @@ SQLITE_PRIVATE int sqlite3Fts2Init(sqlite3*);
#ifdef SQLITE_ENABLE_FTS5
SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*);
#endif
-#ifdef SQLITE_ENABLE_JSON1
-SQLITE_PRIVATE int sqlite3Json1Init(sqlite3*);
-#endif
#ifdef SQLITE_ENABLE_STMTVTAB
SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*);
#endif
@@ -165166,8 +174973,8 @@ static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = {
sqlite3DbstatRegister,
#endif
sqlite3TestExtInit,
-#ifdef SQLITE_ENABLE_JSON1
- sqlite3Json1Init,
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON)
+ sqlite3JsonTableFunctions,
#endif
#ifdef SQLITE_ENABLE_STMTVTAB
sqlite3StmtVtabInit,
@@ -165512,9 +175319,21 @@ SQLITE_API int sqlite3_config(int op, ...){
va_list ap;
int rc = SQLITE_OK;
- /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while
- ** the SQLite library is in use. */
- if( sqlite3GlobalConfig.isInit ) return SQLITE_MISUSE_BKPT;
+ /* sqlite3_config() normally returns SQLITE_MISUSE if it is invoked while
+ ** the SQLite library is in use. Except, a few selected opcodes
+ ** are allowed.
+ */
+ if( sqlite3GlobalConfig.isInit ){
+ static const u64 mAnytimeConfigOption = 0
+ | MASKBIT64( SQLITE_CONFIG_LOG )
+ | MASKBIT64( SQLITE_CONFIG_PCACHE_HDRSZ )
+ ;
+ if( op<0 || op>63 || (MASKBIT64(op) & mAnytimeConfigOption)==0 ){
+ return SQLITE_MISUSE_BKPT;
+ }
+ testcase( op==SQLITE_CONFIG_LOG );
+ testcase( op==SQLITE_CONFIG_PCACHE_HDRSZ );
+ }
va_start(ap, op);
switch( op ){
@@ -165583,6 +175402,7 @@ SQLITE_API int sqlite3_config(int op, ...){
break;
}
case SQLITE_CONFIG_MEMSTATUS: {
+ assert( !sqlite3GlobalConfig.isInit ); /* Cannot change at runtime */
/* EVIDENCE-OF: R-61275-35157 The SQLITE_CONFIG_MEMSTATUS option takes
** single argument of type int, interpreted as a boolean, which enables
** or disables the collection of memory allocation statistics. */
@@ -165706,8 +175526,10 @@ SQLITE_API int sqlite3_config(int op, ...){
** sqlite3GlobalConfig.xLog = va_arg(ap, void(*)(void*,int,const char*));
*/
typedef void(*LOGFUNC_t)(void*,int,const char*);
- sqlite3GlobalConfig.xLog = va_arg(ap, LOGFUNC_t);
- sqlite3GlobalConfig.pLogArg = va_arg(ap, void*);
+ LOGFUNC_t xLog = va_arg(ap, LOGFUNC_t);
+ void *pLogArg = va_arg(ap, void*);
+ AtomicStore(&sqlite3GlobalConfig.xLog, xLog);
+ AtomicStore(&sqlite3GlobalConfig.pLogArg, pLogArg);
break;
}
@@ -165721,7 +175543,8 @@ SQLITE_API int sqlite3_config(int op, ...){
** argument of type int. If non-zero, then URI handling is globally
** enabled. If the parameter is zero, then URI handling is globally
** disabled. */
- sqlite3GlobalConfig.bOpenUri = va_arg(ap, int);
+ int bOpenUri = va_arg(ap, int);
+ AtomicStore(&sqlite3GlobalConfig.bOpenUri, bOpenUri);
break;
}
@@ -165906,18 +175729,19 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){
db->lookaside.bMalloced = pBuf==0 ?1:0;
db->lookaside.nSlot = nBig+nSm;
}else{
- db->lookaside.pStart = db;
+ db->lookaside.pStart = 0;
#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE
db->lookaside.pSmallInit = 0;
db->lookaside.pSmallFree = 0;
- db->lookaside.pMiddle = db;
+ db->lookaside.pMiddle = 0;
#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */
- db->lookaside.pEnd = db;
+ db->lookaside.pEnd = 0;
db->lookaside.bDisable = 1;
db->lookaside.sz = 0;
db->lookaside.bMalloced = 0;
db->lookaside.nSlot = 0;
}
+ db->lookaside.pTrueEnd = db->lookaside.pEnd;
assert( sqlite3LookasideUsed(db,0)==0 );
#endif /* SQLITE_OMIT_LOOKASIDE */
return SQLITE_OK;
@@ -165996,6 +175820,7 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3 *db){
SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
va_list ap;
int rc;
+ sqlite3_mutex_enter(db->mutex);
va_start(ap, op);
switch( op ){
case SQLITE_DBCONFIG_MAINDBNAME: {
@@ -166034,6 +175859,8 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
{ SQLITE_DBCONFIG_DQS_DML, SQLITE_DqsDML },
{ SQLITE_DBCONFIG_LEGACY_FILE_FORMAT, SQLITE_LegacyFileFmt },
{ SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_TrustedSchema },
+ { SQLITE_DBCONFIG_STMT_SCANSTATUS, SQLITE_StmtScanStatus },
+ { SQLITE_DBCONFIG_REVERSE_SCANORDER, SQLITE_ReverseOrder },
};
unsigned int i;
rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
@@ -166061,6 +175888,7 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
}
}
va_end(ap);
+ sqlite3_mutex_leave(db->mutex);
return rc;
}
@@ -166165,7 +175993,7 @@ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3 *db, sqlite3_int64 iRowid)
/*
** Return the number of changes in the most recent call to sqlite3_exec().
*/
-SQLITE_API int sqlite3_changes(sqlite3 *db){
+SQLITE_API sqlite3_int64 sqlite3_changes64(sqlite3 *db){
#ifdef SQLITE_ENABLE_API_ARMOR
if( !sqlite3SafetyCheckOk(db) ){
(void)SQLITE_MISUSE_BKPT;
@@ -166174,11 +176002,14 @@ SQLITE_API int sqlite3_changes(sqlite3 *db){
#endif
return db->nChange;
}
+SQLITE_API int sqlite3_changes(sqlite3 *db){
+ return (int)sqlite3_changes64(db);
+}
/*
** Return the number of changes since the database handle was opened.
*/
-SQLITE_API int sqlite3_total_changes(sqlite3 *db){
+SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3 *db){
#ifdef SQLITE_ENABLE_API_ARMOR
if( !sqlite3SafetyCheckOk(db) ){
(void)SQLITE_MISUSE_BKPT;
@@ -166187,6 +176018,9 @@ SQLITE_API int sqlite3_total_changes(sqlite3 *db){
#endif
return db->nTotalChange;
}
+SQLITE_API int sqlite3_total_changes(sqlite3 *db){
+ return (int)sqlite3_total_changes64(db);
+}
/*
** Close all open savepoints. This function only manipulates fields of the
@@ -166211,7 +176045,9 @@ SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *db){
** with SQLITE_ANY as the encoding.
*/
static void functionDestroy(sqlite3 *db, FuncDef *p){
- FuncDestructor *pDestructor = p->u.pDestructor;
+ FuncDestructor *pDestructor;
+ assert( (p->funcFlags & SQLITE_FUNC_BUILTIN)==0 );
+ pDestructor = p->u.pDestructor;
if( pDestructor ){
pDestructor->nRef--;
if( pDestructor->nRef==0 ){
@@ -166315,7 +176151,7 @@ static int sqlite3Close(sqlite3 *db, int forceZombie){
/* Convert the connection into a zombie and then close it.
*/
- db->magic = SQLITE_MAGIC_ZOMBIE;
+ db->eOpenState = SQLITE_STATE_ZOMBIE;
sqlite3LeaveMutexAndCloseZombie(db);
return SQLITE_OK;
}
@@ -166379,7 +176215,7 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
** or if the connection has not yet been closed by sqlite3_close_v2(),
** then just leave the mutex and return.
*/
- if( db->magic!=SQLITE_MAGIC_ZOMBIE || connectionIsBusy(db) ){
+ if( db->eOpenState!=SQLITE_STATE_ZOMBIE || connectionIsBusy(db) ){
sqlite3_mutex_leave(db->mutex);
return;
}
@@ -166465,7 +176301,7 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
sqlite3_free(db->auth.zAuthPW);
#endif
- db->magic = SQLITE_MAGIC_ERROR;
+ db->eOpenState = SQLITE_STATE_ERROR;
/* The temp-database schema is allocated differently from the other schema
** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()).
@@ -166474,8 +176310,11 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
** structure?
*/
sqlite3DbFree(db, db->aDb[1].pSchema);
+ if( db->xAutovacDestr ){
+ db->xAutovacDestr(db->pAutovacPagesArg);
+ }
sqlite3_mutex_leave(db->mutex);
- db->magic = SQLITE_MAGIC_CLOSED;
+ db->eOpenState = SQLITE_STATE_CLOSED;
sqlite3_mutex_free(db->mutex);
assert( sqlite3LookasideUsed(db,0)==0 );
if( db->lookaside.bMalloced ){
@@ -166528,7 +176367,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){
/* Any deferred constraint violations have now been resolved. */
db->nDeferredCons = 0;
db->nDeferredImmCons = 0;
- db->flags &= ~(u64)SQLITE_DeferFKs;
+ db->flags &= ~(u64)(SQLITE_DeferFKs|SQLITE_CorruptRdOnly);
/* If one has been configured, invoke the rollback-hook callback */
if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){
@@ -166634,6 +176473,7 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){
case SQLITE_NOTICE_RECOVER_WAL: zName = "SQLITE_NOTICE_RECOVER_WAL";break;
case SQLITE_NOTICE_RECOVER_ROLLBACK:
zName = "SQLITE_NOTICE_RECOVER_ROLLBACK"; break;
+ case SQLITE_NOTICE_RBU: zName = "SQLITE_NOTICE_RBU"; break;
case SQLITE_WARNING: zName = "SQLITE_WARNING"; break;
case SQLITE_WARNING_AUTOINDEX: zName = "SQLITE_WARNING_AUTOINDEX"; break;
case SQLITE_DONE: zName = "SQLITE_DONE"; break;
@@ -166863,7 +176703,9 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){
*/
SQLITE_API void sqlite3_interrupt(sqlite3 *db){
#ifdef SQLITE_ENABLE_API_ARMOR
- if( !sqlite3SafetyCheckOk(db) && (db==0 || db->magic!=SQLITE_MAGIC_ZOMBIE) ){
+ if( !sqlite3SafetyCheckOk(db)
+ && (db==0 || db->eOpenState!=SQLITE_STATE_ZOMBIE)
+ ){
(void)SQLITE_MISUSE_BKPT;
return;
}
@@ -166871,6 +176713,21 @@ SQLITE_API void sqlite3_interrupt(sqlite3 *db){
AtomicStore(&db->u1.isInterrupted, 1);
}
+/*
+** Return true or false depending on whether or not an interrupt is
+** pending on connection db.
+*/
+SQLITE_API int sqlite3_is_interrupted(sqlite3 *db){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db)
+ && (db==0 || db->eOpenState!=SQLITE_STATE_ZOMBIE)
+ ){
+ (void)SQLITE_MISUSE_BKPT;
+ return 0;
+ }
+#endif
+ return AtomicLoad(&db->u1.isInterrupted)!=0;
+}
/*
** This function is exactly the same as sqlite3_create_function(), except
@@ -166892,7 +176749,6 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
FuncDestructor *pDestructor
){
FuncDef *p;
- int nName;
int extraFlags;
assert( sqlite3_mutex_held(db->mutex) );
@@ -166902,7 +176758,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
|| ((xFinal==0)!=(xStep==0)) /* Both or neither of xFinal and xStep */
|| ((xValue==0)!=(xInverse==0)) /* Both or neither of xValue, xInverse */
|| (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG)
- || (255<(nName = sqlite3Strlen30( zFunctionName)))
+ || (255<sqlite3Strlen30(zFunctionName))
){
return SQLITE_MISUSE_BKPT;
}
@@ -166916,7 +176772,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
/* The SQLITE_INNOCUOUS flag is the same bit as SQLITE_FUNC_UNSAFE. But
** the meaning is inverted. So flip the bit. */
assert( SQLITE_FUNC_UNSAFE==SQLITE_INNOCUOUS );
- extraFlags ^= SQLITE_FUNC_UNSAFE;
+ extraFlags ^= SQLITE_FUNC_UNSAFE; /* tag-20230109-1 */
#ifndef SQLITE_OMIT_UTF16
@@ -166927,22 +176783,33 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
** If SQLITE_ANY is specified, add three versions of the function
** to the hash table.
*/
- if( enc==SQLITE_UTF16 ){
- enc = SQLITE_UTF16NATIVE;
- }else if( enc==SQLITE_ANY ){
- int rc;
- rc = sqlite3CreateFunc(db, zFunctionName, nArg,
- (SQLITE_UTF8|extraFlags)^SQLITE_FUNC_UNSAFE,
- pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor);
- if( rc==SQLITE_OK ){
+ switch( enc ){
+ case SQLITE_UTF16:
+ enc = SQLITE_UTF16NATIVE;
+ break;
+ case SQLITE_ANY: {
+ int rc;
rc = sqlite3CreateFunc(db, zFunctionName, nArg,
- (SQLITE_UTF16LE|extraFlags)^SQLITE_FUNC_UNSAFE,
+ (SQLITE_UTF8|extraFlags)^SQLITE_FUNC_UNSAFE, /* tag-20230109-1 */
pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3CreateFunc(db, zFunctionName, nArg,
+ (SQLITE_UTF16LE|extraFlags)^SQLITE_FUNC_UNSAFE, /* tag-20230109-1*/
+ pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor);
+ }
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ enc = SQLITE_UTF16BE;
+ break;
}
- if( rc!=SQLITE_OK ){
- return rc;
- }
- enc = SQLITE_UTF16BE;
+ case SQLITE_UTF8:
+ case SQLITE_UTF16LE:
+ case SQLITE_UTF16BE:
+ break;
+ default:
+ enc = SQLITE_UTF8;
+ break;
}
#else
enc = SQLITE_UTF8;
@@ -167039,7 +176906,7 @@ static int createFunctionApi(
xSFunc, xStep, xFinal, xValue, xInverse, pArg
);
if( pArg && pArg->nRef==0 ){
- assert( rc!=SQLITE_OK );
+ assert( rc!=SQLITE_OK || (xStep==0 && xFinal==0) );
xDestroy(p);
sqlite3_free(pArg);
}
@@ -167176,7 +177043,7 @@ SQLITE_API int sqlite3_overload_function(
rc = sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)!=0;
sqlite3_mutex_leave(db->mutex);
if( rc ) return SQLITE_OK;
- zCopy = sqlite3_mprintf(zName);
+ zCopy = sqlite3_mprintf("%s", zName);
if( zCopy==0 ) return SQLITE_NOMEM;
return sqlite3_create_function_v2(db, zName, nArg, SQLITE_UTF8,
zCopy, sqlite3InvalidFunction, 0, 0, sqlite3_free);
@@ -167365,6 +177232,34 @@ SQLITE_API void *sqlite3_preupdate_hook(
}
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
+/*
+** Register a function to be invoked prior to each autovacuum that
+** determines the number of pages to vacuum.
+*/
+SQLITE_API int sqlite3_autovacuum_pages(
+ sqlite3 *db, /* Attach the hook to this database */
+ unsigned int (*xCallback)(void*,const char*,u32,u32,u32),
+ void *pArg, /* Argument to the function */
+ void (*xDestructor)(void*) /* Destructor for pArg */
+){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ){
+ if( xDestructor ) xDestructor(pArg);
+ return SQLITE_MISUSE_BKPT;
+ }
+#endif
+ sqlite3_mutex_enter(db->mutex);
+ if( db->xAutovacDestr ){
+ db->xAutovacDestr(db->pAutovacPagesArg);
+ }
+ db->xAutovacPages = xCallback;
+ db->pAutovacPagesArg = pArg;
+ db->xAutovacDestr = xDestructor;
+ sqlite3_mutex_leave(db->mutex);
+ return SQLITE_OK;
+}
+
+
#ifndef SQLITE_OMIT_WAL
/*
** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint().
@@ -167627,6 +177522,19 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){
return z;
}
+/*
+** Return the byte offset of the most recent error
+*/
+SQLITE_API int sqlite3_error_offset(sqlite3 *db){
+ int iOffset = -1;
+ if( db && sqlite3SafetyCheckSickOrOk(db) && db->errCode ){
+ sqlite3_mutex_enter(db->mutex);
+ iOffset = db->errByteOffset;
+ sqlite3_mutex_leave(db->mutex);
+ }
+ return iOffset;
+}
+
#ifndef SQLITE_OMIT_UTF16
/*
** Return UTF-16 encoded English language explanation of the most recent
@@ -167887,6 +177795,8 @@ SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){
if( newLimit>=0 ){ /* IMP: R-52476-28732 */
if( newLimit>aHardLimit[limitId] ){
newLimit = aHardLimit[limitId]; /* IMP: R-51463-25634 */
+ }else if( newLimit<1 && limitId==SQLITE_LIMIT_LENGTH ){
+ newLimit = 1;
}
db->aLimit[limitId] = newLimit;
}
@@ -167936,9 +177846,9 @@ SQLITE_PRIVATE int sqlite3ParseUri(
assert( *pzErrMsg==0 );
- if( ((flags & SQLITE_OPEN_URI) /* IMP: R-48725-32206 */
- || sqlite3GlobalConfig.bOpenUri) /* IMP: R-51689-46548 */
- && nUri>=5 && memcmp(zUri, "file:", 5)==0 /* IMP: R-57884-37496 */
+ if( ((flags & SQLITE_OPEN_URI) /* IMP: R-48725-32206 */
+ || AtomicLoad(&sqlite3GlobalConfig.bOpenUri)) /* IMP: R-51689-46548 */
+ && nUri>=5 && memcmp(zUri, "file:", 5)==0 /* IMP: R-57884-37496 */
){
char *zOpt;
int eState; /* Parser state when parsing URI */
@@ -168158,7 +178068,7 @@ SQLITE_PRIVATE int sqlite3ParseUri(
*/
static const char *uriParameter(const char *zFilename, const char *zParam){
zFilename += sqlite3Strlen30(zFilename) + 1;
- while( zFilename[0] ){
+ while( ALWAYS(zFilename!=0) && zFilename[0] ){
int x = strcmp(zFilename, zParam);
zFilename += sqlite3Strlen30(zFilename) + 1;
if( x==0 ) return zFilename;
@@ -168218,8 +178128,8 @@ static int openDatabase(
** dealt with in the previous code block. Besides these, the only
** valid input flags for sqlite3_open_v2() are SQLITE_OPEN_READONLY,
** SQLITE_OPEN_READWRITE, SQLITE_OPEN_CREATE, SQLITE_OPEN_SHAREDCACHE,
- ** SQLITE_OPEN_PRIVATECACHE, and some reserved bits. Silently mask
- ** off all other flags.
+ ** SQLITE_OPEN_PRIVATECACHE, SQLITE_OPEN_EXRESCODE, and some reserved
+ ** bits. Silently mask off all other flags.
*/
flags &= ~( SQLITE_OPEN_DELETEONCLOSE |
SQLITE_OPEN_EXCLUSIVE |
@@ -168254,9 +178164,9 @@ static int openDatabase(
}
}
sqlite3_mutex_enter(db->mutex);
- db->errMask = 0xff;
+ db->errMask = (flags & SQLITE_OPEN_EXRESCODE)!=0 ? 0xffffffff : 0xff;
db->nDb = 2;
- db->magic = SQLITE_MAGIC_BUSY;
+ db->eOpenState = SQLITE_STATE_BUSY;
db->aDb = db->aDbStatic;
db->lookaside.bDisable = 1;
db->lookaside.sz = 0;
@@ -168268,7 +178178,15 @@ static int openDatabase(
db->nextAutovac = -1;
db->szMmap = sqlite3GlobalConfig.szMmap;
db->nextPagesize = 0;
+ db->init.azInit = sqlite3StdType; /* Any array of string ptrs will do */
+#ifdef SQLITE_ENABLE_SORTER_MMAP
+ /* Beginning with version 3.37.0, using the VFS xFetch() API to memory-map
+ ** the temporary files used to do external sorts (see code in vdbesort.c)
+ ** is disabled. It can still be used either by defining
+ ** SQLITE_ENABLE_SORTER_MMAP at compile time or by using the
+ ** SQLITE_TESTCTRL_SORTER_MMAP test-control at runtime. */
db->nMaxSorterMmap = 0x7FFFFFFF;
+#endif
db->flags |= SQLITE_ShortColNames
| SQLITE_EnableTrigger
| SQLITE_EnableView
@@ -168337,6 +178255,9 @@ static int openDatabase(
#if defined(SQLITE_DEFAULT_LEGACY_ALTER_TABLE)
| SQLITE_LegacyAlter
#endif
+#if defined(SQLITE_ENABLE_STMT_SCANSTATUS)
+ | SQLITE_StmtScanStatus
+#endif
;
sqlite3HashInit(&db->aCollSeq);
#ifndef SQLITE_OMIT_VIRTUALTABLE
@@ -168359,6 +178280,19 @@ static int openDatabase(
goto opendb_out;
}
+#if SQLITE_OS_UNIX && defined(SQLITE_OS_KV_OPTIONAL)
+ /* Process magic filenames ":localStorage:" and ":sessionStorage:" */
+ if( zFilename && zFilename[0]==':' ){
+ if( strcmp(zFilename, ":localStorage:")==0 ){
+ zFilename = "file:local?vfs=kvvfs";
+ flags |= SQLITE_OPEN_URI;
+ }else if( strcmp(zFilename, ":sessionStorage:")==0 ){
+ zFilename = "file:session?vfs=kvvfs";
+ flags |= SQLITE_OPEN_URI;
+ }
+ }
+#endif /* SQLITE_OS_UNIX && defined(SQLITE_OS_KV_OPTIONAL) */
+
/* Parse the filename/URI argument
**
** Only allow sensible combinations of bits in the flags argument.
@@ -168389,6 +178323,12 @@ static int openDatabase(
sqlite3_free(zErrMsg);
goto opendb_out;
}
+ assert( db->pVfs!=0 );
+#if SQLITE_OS_KV || defined(SQLITE_OS_KV_OPTIONAL)
+ if( sqlite3_stricmp(db->pVfs->zName, "kvvfs")==0 ){
+ db->temp_store = 2;
+ }
+#endif
/* Open the backend database driver */
rc = sqlite3BtreeOpen(db->pVfs, zOpen, db, &db->aDb[0].pBt, 0,
@@ -168416,7 +178356,7 @@ static int openDatabase(
db->aDb[1].zDbSName = "temp";
db->aDb[1].safety_level = PAGER_SYNCHRONOUS_OFF;
- db->magic = SQLITE_MAGIC_OPEN;
+ db->eOpenState = SQLITE_STATE_OPEN;
if( db->mallocFailed ){
goto opendb_out;
}
@@ -168478,12 +178418,12 @@ opendb_out:
sqlite3_mutex_leave(db->mutex);
}
rc = sqlite3_errcode(db);
- assert( db!=0 || rc==SQLITE_NOMEM );
- if( rc==SQLITE_NOMEM ){
+ assert( db!=0 || (rc&0xff)==SQLITE_NOMEM );
+ if( (rc&0xff)==SQLITE_NOMEM ){
sqlite3_close(db);
db = 0;
}else if( rc!=SQLITE_OK ){
- db->magic = SQLITE_MAGIC_SICK;
+ db->eOpenState = SQLITE_STATE_SICK;
}
*ppDb = db;
#ifdef SQLITE_ENABLE_SQLLOG
@@ -168494,7 +178434,7 @@ opendb_out:
}
#endif
sqlite3_free_filename(zOpen);
- return rc & 0xff;
+ return rc;
}
@@ -168794,7 +178734,7 @@ SQLITE_API int sqlite3_table_column_metadata(
/* Locate the table in question */
pTab = sqlite3FindTable(db, zTableName, zDbName);
- if( !pTab || pTab->pSelect ){
+ if( !pTab || IsView(pTab) ){
pTab = 0;
goto error_out;
}
@@ -168805,7 +178745,7 @@ SQLITE_API int sqlite3_table_column_metadata(
}else{
for(iCol=0; iCol<pTab->nCol; iCol++){
pCol = &pTab->aCol[iCol];
- if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){
+ if( 0==sqlite3StrICmp(pCol->zCnName, zColumnName) ){
break;
}
}
@@ -168832,7 +178772,7 @@ SQLITE_API int sqlite3_table_column_metadata(
*/
if( pCol ){
zDataType = sqlite3ColumnType(pCol,0);
- zCollSeq = pCol->zColl;
+ zCollSeq = sqlite3ColumnColl(pCol);
notnull = pCol->notNull!=0;
primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0;
autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0;
@@ -168882,7 +178822,7 @@ SQLITE_API int sqlite3_sleep(int ms){
/* This function works in milliseconds, but the underlying OsSleep()
** API uses microseconds. Hence the 1000's.
*/
- rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000);
+ rc = (sqlite3OsSleep(pVfs, ms<0 ? 0 : 1000*ms)/1000);
return rc;
}
@@ -168938,6 +178878,9 @@ SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, vo
sqlite3BtreeSetPageSize(pBtree, 0, iNew, 0);
}
rc = SQLITE_OK;
+ }else if( op==SQLITE_FCNTL_RESET_CACHE ){
+ sqlite3BtreeClearCache(pBtree);
+ rc = SQLITE_OK;
}else{
int nSave = db->busyHandler.nBusy;
rc = sqlite3OsFileControl(fd, op, pArg);
@@ -169039,12 +178982,16 @@ SQLITE_API int sqlite3_test_control(int op, ...){
** sqlite3_test_control().
*/
case SQLITE_TESTCTRL_FAULT_INSTALL: {
- /* MSVC is picky about pulling func ptrs from va lists.
- ** http://support.microsoft.com/kb/47961
+ /* A bug in MSVC prevents it from understanding pointers to functions
+ ** types in the second argument to va_arg(). Work around the problem
+ ** using a typedef.
+ ** http://support.microsoft.com/kb/47961 <-- dead hyperlink
+ ** Search at http://web.archive.org/ to find the 2015-03-16 archive
+ ** of the link above to see the original text.
** sqlite3GlobalConfig.xTestCallback = va_arg(ap, int(*)(int));
*/
- typedef int(*TESTCALLBACKFUNC_t)(int);
- sqlite3GlobalConfig.xTestCallback = va_arg(ap, TESTCALLBACKFUNC_t);
+ typedef int(*sqlite3FaultFuncType)(int);
+ sqlite3GlobalConfig.xTestCallback = va_arg(ap, sqlite3FaultFuncType);
rc = sqlite3FaultSim(0);
break;
}
@@ -169103,6 +179050,28 @@ SQLITE_API int sqlite3_test_control(int op, ...){
volatile int x = 0;
assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=0 );
rc = x;
+#if defined(SQLITE_DEBUG)
+ /* Invoke these debugging routines so that the compiler does not
+ ** issue "defined but not used" warnings. */
+ if( x==9999 ){
+ sqlite3ShowExpr(0);
+ sqlite3ShowExpr(0);
+ sqlite3ShowExprList(0);
+ sqlite3ShowIdList(0);
+ sqlite3ShowSrcList(0);
+ sqlite3ShowWith(0);
+ sqlite3ShowUpsert(0);
+ sqlite3ShowTriggerStep(0);
+ sqlite3ShowTriggerStepList(0);
+ sqlite3ShowTrigger(0);
+ sqlite3ShowTriggerList(0);
+#ifndef SQLITE_OMIT_WINDOWFUNC
+ sqlite3ShowWindow(0);
+ sqlite3ShowWinFunc(0);
+#endif
+ sqlite3ShowSelect(0);
+ }
+#endif
break;
}
@@ -169171,13 +179140,27 @@ SQLITE_API int sqlite3_test_control(int op, ...){
break;
}
- /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff);
+ /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, onoff, xAlt);
+ **
+ ** If parameter onoff is 1, subsequent calls to localtime() fail.
+ ** If 2, then invoke xAlt() instead of localtime(). If 0, normal
+ ** processing.
**
- ** If parameter onoff is non-zero, subsequent calls to localtime()
- ** and its variants fail. If onoff is zero, undo this setting.
+ ** xAlt arguments are void pointers, but they really want to be:
+ **
+ ** int xAlt(const time_t*, struct tm*);
+ **
+ ** xAlt should write results in to struct tm object of its 2nd argument
+ ** and return zero on success, or return non-zero on failure.
*/
case SQLITE_TESTCTRL_LOCALTIME_FAULT: {
sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int);
+ if( sqlite3GlobalConfig.bLocaltimeFault==2 ){
+ typedef int(*sqlite3LocaltimeType)(const void*,void*);
+ sqlite3GlobalConfig.xAltLocaltime = va_arg(ap, sqlite3LocaltimeType);
+ }else{
+ sqlite3GlobalConfig.xAltLocaltime = 0;
+ }
break;
}
@@ -169282,12 +179265,16 @@ SQLITE_API int sqlite3_test_control(int op, ...){
*/
case SQLITE_TESTCTRL_IMPOSTER: {
sqlite3 *db = va_arg(ap, sqlite3*);
+ int iDb;
sqlite3_mutex_enter(db->mutex);
- db->init.iDb = sqlite3FindDbName(db, va_arg(ap,const char*));
- db->init.busy = db->init.imposterTable = va_arg(ap,int);
- db->init.newTnum = va_arg(ap,int);
- if( db->init.busy==0 && db->init.newTnum>0 ){
- sqlite3ResetAllSchemasOfConnection(db);
+ iDb = sqlite3FindDbName(db, va_arg(ap,const char*));
+ if( iDb>=0 ){
+ db->init.iDb = iDb;
+ db->init.busy = db->init.imposterTable = va_arg(ap,int);
+ db->init.newTnum = va_arg(ap,int);
+ if( db->init.busy==0 && db->init.newTnum>0 ){
+ sqlite3ResetAllSchemasOfConnection(db);
+ }
}
sqlite3_mutex_leave(db->mutex);
break;
@@ -169346,8 +179333,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){
**
** "ptr" is a pointer to a u32.
**
- ** op==0 Store the current sqlite3SelectTrace in *ptr
- ** op==1 Set sqlite3SelectTrace to the value *ptr
+ ** op==0 Store the current sqlite3TreeTrace in *ptr
+ ** op==1 Set sqlite3TreeTrace to the value *ptr
** op==3 Store the current sqlite3WhereTrace in *ptr
** op==3 Set sqlite3WhereTrace to the value *ptr
*/
@@ -169355,14 +179342,36 @@ SQLITE_API int sqlite3_test_control(int op, ...){
int opTrace = va_arg(ap, int);
u32 *ptr = va_arg(ap, u32*);
switch( opTrace ){
- case 0: *ptr = sqlite3SelectTrace; break;
- case 1: sqlite3SelectTrace = *ptr; break;
- case 2: *ptr = sqlite3WhereTrace; break;
- case 3: sqlite3WhereTrace = *ptr; break;
+ case 0: *ptr = sqlite3TreeTrace; break;
+ case 1: sqlite3TreeTrace = *ptr; break;
+ case 2: *ptr = sqlite3WhereTrace; break;
+ case 3: sqlite3WhereTrace = *ptr; break;
}
break;
}
+ /* sqlite3_test_control(SQLITE_TESTCTRL_LOGEST,
+ ** double fIn, // Input value
+ ** int *pLogEst, // sqlite3LogEstFromDouble(fIn)
+ ** u64 *pInt, // sqlite3LogEstToInt(*pLogEst)
+ ** int *pLogEst2 // sqlite3LogEst(*pInt)
+ ** );
+ **
+ ** Test access for the LogEst conversion routines.
+ */
+ case SQLITE_TESTCTRL_LOGEST: {
+ double rIn = va_arg(ap, double);
+ LogEst rLogEst = sqlite3LogEstFromDouble(rIn);
+ int *pI1 = va_arg(ap,int*);
+ u64 *pU64 = va_arg(ap,u64*);
+ int *pI2 = va_arg(ap,int*);
+ *pI1 = rLogEst;
+ *pU64 = sqlite3LogEstToInt(rLogEst);
+ *pI2 = sqlite3LogEst(*pU64);
+ break;
+ }
+
+
#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_WSD)
/* sqlite3_test_control(SQLITE_TESTCTRL_TUNE, id, *piValue)
**
@@ -169432,7 +179441,7 @@ static char *appendText(char *p, const char *z){
** Memory layout must be compatible with that generated by the pager
** and expected by sqlite3_uri_parameter() and databaseName().
*/
-SQLITE_API char *sqlite3_create_filename(
+SQLITE_API const char *sqlite3_create_filename(
const char *zDatabase,
const char *zJournal,
const char *zWal,
@@ -169468,10 +179477,10 @@ SQLITE_API char *sqlite3_create_filename(
** error to call this routine with any parameter other than a pointer
** previously obtained from sqlite3_create_filename() or a NULL pointer.
*/
-SQLITE_API void sqlite3_free_filename(char *p){
+SQLITE_API void sqlite3_free_filename(const char *p){
if( p==0 ) return;
- p = (char*)databaseName(p);
- sqlite3_free(p - 4);
+ p = databaseName(p);
+ sqlite3_free((char*)p - 4);
}
@@ -169499,7 +179508,7 @@ SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N){
if( zFilename==0 || N<0 ) return 0;
zFilename = databaseName(zFilename);
zFilename += sqlite3Strlen30(zFilename) + 1;
- while( zFilename[0] && (N--)>0 ){
+ while( ALWAYS(zFilename) && zFilename[0] && (N--)>0 ){
zFilename += sqlite3Strlen30(zFilename) + 1;
zFilename += sqlite3Strlen30(zFilename) + 1;
}
@@ -169542,12 +179551,14 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64(
** corruption.
*/
SQLITE_API const char *sqlite3_filename_database(const char *zFilename){
+ if( zFilename==0 ) return 0;
return databaseName(zFilename);
}
SQLITE_API const char *sqlite3_filename_journal(const char *zFilename){
+ if( zFilename==0 ) return 0;
zFilename = databaseName(zFilename);
zFilename += sqlite3Strlen30(zFilename) + 1;
- while( zFilename[0] ){
+ while( ALWAYS(zFilename) && zFilename[0] ){
zFilename += sqlite3Strlen30(zFilename) + 1;
zFilename += sqlite3Strlen30(zFilename) + 1;
}
@@ -169558,7 +179569,7 @@ SQLITE_API const char *sqlite3_filename_wal(const char *zFilename){
return 0;
#else
zFilename = sqlite3_filename_journal(zFilename);
- zFilename += sqlite3Strlen30(zFilename) + 1;
+ if( zFilename ) zFilename += sqlite3Strlen30(zFilename) + 1;
return zFilename;
#endif
}
@@ -169572,6 +179583,24 @@ SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){
}
/*
+** Return the name of the N-th database schema. Return NULL if N is out
+** of range.
+*/
+SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ){
+ (void)SQLITE_MISUSE_BKPT;
+ return 0;
+ }
+#endif
+ if( N<0 || N>=db->nDb ){
+ return 0;
+ }else{
+ return db->aDb[N].zDbSName;
+ }
+}
+
+/*
** Return the filename of the database associated with a database
** connection.
*/
@@ -169702,8 +179731,8 @@ SQLITE_API int sqlite3_snapshot_open(
*/
SQLITE_API int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb){
int rc = SQLITE_ERROR;
- int iDb;
#ifndef SQLITE_OMIT_WAL
+ int iDb;
#ifdef SQLITE_ENABLE_API_ARMOR
if( !sqlite3SafetyCheckOk(db) ){
@@ -170851,17 +180880,18 @@ SQLITE_API extern int sqlite3_fts3_may_be_corrupt;
** Macros indicating that conditional expressions are always true or
** false.
*/
-#ifdef SQLITE_COVERAGE_TEST
-# define ALWAYS(x) (1)
-# define NEVER(X) (0)
-#elif defined(SQLITE_DEBUG)
-# define ALWAYS(x) sqlite3Fts3Always((x)!=0)
-# define NEVER(x) sqlite3Fts3Never((x)!=0)
-SQLITE_PRIVATE int sqlite3Fts3Always(int b);
-SQLITE_PRIVATE int sqlite3Fts3Never(int b);
+#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
+# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
+#endif
+#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
+# define ALWAYS(X) (1)
+# define NEVER(X) (0)
+#elif !defined(NDEBUG)
+# define ALWAYS(X) ((X)?1:(assert(0),0))
+# define NEVER(X) ((X)?(assert(0),1):0)
#else
-# define ALWAYS(x) (x)
-# define NEVER(x) (x)
+# define ALWAYS(X) (X)
+# define NEVER(X) (X)
#endif
/*
@@ -171257,7 +181287,7 @@ struct Fts3MultiSegReader {
int nAdvance; /* How many seg-readers to advance */
Fts3SegFilter *pFilter; /* Pointer to filter object */
char *aBuffer; /* Buffer to merge doclists in */
- int nBuffer; /* Allocated size of aBuffer[] in bytes */
+ i64 nBuffer; /* Allocated size of aBuffer[] in bytes */
int iColFilter; /* If >=0, filter for this column */
int bRestart;
@@ -171320,6 +181350,7 @@ SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *);
SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash*);
SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db);
#endif
+SQLITE_PRIVATE void *sqlite3Fts3MallocZero(i64 nByte);
SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer(sqlite3_tokenizer *, int, const char *, int,
sqlite3_tokenizer_cursor **
@@ -171339,7 +181370,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *)
SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr);
/* fts3_tokenize_vtab.c */
-SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *);
+SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *, void(*xDestroy)(void*));
/* fts3_unicode2.c (functions generated by parsing unicode text files) */
#ifndef SQLITE_DISABLE_FTS3_UNICODE
@@ -171348,6 +181379,8 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int);
SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int);
#endif
+SQLITE_PRIVATE int sqlite3Fts3ExprIterate(Fts3Expr*, int (*x)(Fts3Expr*,int,void*), void*);
+
#endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */
#endif /* _FTSINT_H */
@@ -171372,18 +181405,17 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int);
SQLITE_EXTENSION_INIT1
#endif
+typedef struct Fts3HashWrapper Fts3HashWrapper;
+struct Fts3HashWrapper {
+ Fts3Hash hash; /* Hash table */
+ int nRef; /* Number of pointers to this object */
+};
+
static int fts3EvalNext(Fts3Cursor *pCsr);
static int fts3EvalStart(Fts3Cursor *pCsr);
static int fts3TermSegReaderCursor(
Fts3Cursor *, const char *, int, int, Fts3MultiSegReader **);
-#ifndef SQLITE_AMALGAMATION
-# if defined(SQLITE_DEBUG)
-SQLITE_PRIVATE int sqlite3Fts3Always(int b) { assert( b ); return b; }
-SQLITE_PRIVATE int sqlite3Fts3Never(int b) { assert( !b ); return b; }
-# endif
-#endif
-
/*
** This variable is set to false when running tests for which the on disk
** structures should not be corrupt. Otherwise, true. If it is false, extra
@@ -172243,7 +182275,7 @@ static int fts3InitVtab(
sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */
char **pzErr /* Write any error message here */
){
- Fts3Hash *pHash = (Fts3Hash *)pAux;
+ Fts3Hash *pHash = &((Fts3HashWrapper*)pAux)->hash;
Fts3Table *p = 0; /* Pointer to allocated vtab */
int rc = SQLITE_OK; /* Return code */
int i; /* Iterator variable */
@@ -173953,7 +183985,7 @@ static int fts3TermSelectMerge(
**
** Similar padding is added in the fts3DoclistOrMerge() function.
*/
- pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1);
+ pTS->aaOutput[0] = sqlite3_malloc64((i64)nDoclist + FTS3_VARINT_MAX + 1);
pTS->anOutput[0] = nDoclist;
if( pTS->aaOutput[0] ){
memcpy(pTS->aaOutput[0], aDoclist, nDoclist);
@@ -175078,9 +185110,12 @@ static const sqlite3_module fts3Module = {
** allocated for the tokenizer hash table.
*/
static void hashDestroy(void *p){
- Fts3Hash *pHash = (Fts3Hash *)p;
- sqlite3Fts3HashClear(pHash);
- sqlite3_free(pHash);
+ Fts3HashWrapper *pHash = (Fts3HashWrapper *)p;
+ pHash->nRef--;
+ if( pHash->nRef<=0 ){
+ sqlite3Fts3HashClear(&pHash->hash);
+ sqlite3_free(pHash);
+ }
}
/*
@@ -175110,7 +185145,7 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const
*/
SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
int rc = SQLITE_OK;
- Fts3Hash *pHash = 0;
+ Fts3HashWrapper *pHash = 0;
const sqlite3_tokenizer_module *pSimple = 0;
const sqlite3_tokenizer_module *pPorter = 0;
#ifndef SQLITE_DISABLE_FTS3_UNICODE
@@ -175138,23 +185173,24 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
sqlite3Fts3PorterTokenizerModule(&pPorter);
/* Allocate and initialize the hash-table used to store tokenizers. */
- pHash = sqlite3_malloc(sizeof(Fts3Hash));
+ pHash = sqlite3_malloc(sizeof(Fts3HashWrapper));
if( !pHash ){
rc = SQLITE_NOMEM;
}else{
- sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1);
+ sqlite3Fts3HashInit(&pHash->hash, FTS3_HASH_STRING, 1);
+ pHash->nRef = 0;
}
/* Load the built-in tokenizers into the hash table */
if( rc==SQLITE_OK ){
- if( sqlite3Fts3HashInsert(pHash, "simple", 7, (void *)pSimple)
- || sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter)
+ if( sqlite3Fts3HashInsert(&pHash->hash, "simple", 7, (void *)pSimple)
+ || sqlite3Fts3HashInsert(&pHash->hash, "porter", 7, (void *)pPorter)
#ifndef SQLITE_DISABLE_FTS3_UNICODE
- || sqlite3Fts3HashInsert(pHash, "unicode61", 10, (void *)pUnicode)
+ || sqlite3Fts3HashInsert(&pHash->hash, "unicode61", 10, (void *)pUnicode)
#endif
#ifdef SQLITE_ENABLE_ICU
- || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu))
+ || (pIcu && sqlite3Fts3HashInsert(&pHash->hash, "icu", 4, (void *)pIcu))
#endif
){
rc = SQLITE_NOMEM;
@@ -175163,7 +185199,7 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
#ifdef SQLITE_TEST
if( rc==SQLITE_OK ){
- rc = sqlite3Fts3ExprInitTestInterface(db, pHash);
+ rc = sqlite3Fts3ExprInitTestInterface(db, &pHash->hash);
}
#endif
@@ -175172,23 +185208,26 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
** module with sqlite.
*/
if( SQLITE_OK==rc
- && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer"))
+ && SQLITE_OK==(rc=sqlite3Fts3InitHashTable(db,&pHash->hash,"fts3_tokenizer"))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", 1))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 1))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 2))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1))
){
+ pHash->nRef++;
rc = sqlite3_create_module_v2(
db, "fts3", &fts3Module, (void *)pHash, hashDestroy
);
if( rc==SQLITE_OK ){
+ pHash->nRef++;
rc = sqlite3_create_module_v2(
- db, "fts4", &fts3Module, (void *)pHash, 0
+ db, "fts4", &fts3Module, (void *)pHash, hashDestroy
);
}
if( rc==SQLITE_OK ){
- rc = sqlite3Fts3InitTok(db, (void *)pHash);
+ pHash->nRef++;
+ rc = sqlite3Fts3InitTok(db, (void *)pHash, hashDestroy);
}
return rc;
}
@@ -175197,7 +185236,7 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
/* An error has occurred. Delete the hash table and return the error code. */
assert( rc!=SQLITE_OK );
if( pHash ){
- sqlite3Fts3HashClear(pHash);
+ sqlite3Fts3HashClear(&pHash->hash);
sqlite3_free(pHash);
}
return rc;
@@ -175366,8 +185405,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
char *aPoslist = 0; /* Position list for deferred tokens */
int nPoslist = 0; /* Number of bytes in aPoslist */
int iPrev = -1; /* Token number of previous deferred token */
-
- assert( pPhrase->doclist.bFreeList==0 );
+ char *aFree = (pPhrase->doclist.bFreeList ? pPhrase->doclist.pList : 0);
for(iToken=0; iToken<pPhrase->nToken; iToken++){
Fts3PhraseToken *pToken = &pPhrase->aToken[iToken];
@@ -175381,6 +185419,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
if( pList==0 ){
sqlite3_free(aPoslist);
+ sqlite3_free(aFree);
pPhrase->doclist.pList = 0;
pPhrase->doclist.nList = 0;
return SQLITE_OK;
@@ -175401,6 +185440,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
nPoslist = (int)(aOut - aPoslist);
if( nPoslist==0 ){
sqlite3_free(aPoslist);
+ sqlite3_free(aFree);
pPhrase->doclist.pList = 0;
pPhrase->doclist.nList = 0;
return SQLITE_OK;
@@ -175433,13 +185473,14 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
nDistance = iPrev - nMaxUndeferred;
}
- aOut = (char *)sqlite3_malloc(nPoslist+8);
+ aOut = (char *)sqlite3Fts3MallocZero(nPoslist+FTS3_BUFFER_PADDING);
if( !aOut ){
sqlite3_free(aPoslist);
return SQLITE_NOMEM;
}
pPhrase->doclist.pList = aOut;
+ assert( p1 && p2 );
if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){
pPhrase->doclist.bFreeList = 1;
pPhrase->doclist.nList = (int)(aOut - pPhrase->doclist.pList);
@@ -175452,6 +185493,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
}
}
+ if( pPhrase->doclist.pList!=aFree ) sqlite3_free(aFree);
return SQLITE_OK;
}
#endif /* SQLITE_DISABLE_FTS4_DEFERRED */
@@ -175544,7 +185586,7 @@ SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(
assert( nDoclist>0 );
assert( *pbEof==0 );
- assert( p || *piDocid==0 );
+ assert_fts3_nc( p || *piDocid==0 );
assert( !p || (p>aDoclist && p<&aDoclist[nDoclist]) );
if( p==0 ){
@@ -175800,7 +185842,7 @@ static int fts3EvalIncrPhraseNext(
if( bEof==0 ){
int nList = 0;
int nByte = a[p->nToken-1].nList;
- char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING);
+ char *aDoclist = sqlite3_malloc64((i64)nByte+FTS3_BUFFER_PADDING);
if( !aDoclist ) return SQLITE_NOMEM;
memcpy(aDoclist, a[p->nToken-1].pList, nByte+1);
memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING);
@@ -176342,9 +186384,8 @@ static void fts3EvalNextRow(
Fts3Expr *pExpr, /* Expr. to advance to next matching row */
int *pRc /* IN/OUT: Error code */
){
- if( *pRc==SQLITE_OK ){
+ if( *pRc==SQLITE_OK && pExpr->bEof==0 ){
int bDescDoclist = pCsr->bDesc; /* Used by DOCID_CMP() macro */
- assert( pExpr->bEof==0 );
pExpr->bStart = 1;
switch( pExpr->eType ){
@@ -176408,8 +186449,8 @@ static void fts3EvalNextRow(
Fts3Expr *pRight = pExpr->pRight;
sqlite3_int64 iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid);
- assert( pLeft->bStart || pLeft->iDocid==pRight->iDocid );
- assert( pRight->bStart || pLeft->iDocid==pRight->iDocid );
+ assert_fts3_nc( pLeft->bStart || pLeft->iDocid==pRight->iDocid );
+ assert_fts3_nc( pRight->bStart || pLeft->iDocid==pRight->iDocid );
if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){
fts3EvalNextRow(pCsr, pLeft, pRc);
@@ -176626,11 +186667,10 @@ static int fts3EvalTestExpr(
default: {
#ifndef SQLITE_DISABLE_FTS4_DEFERRED
- if( pCsr->pDeferred
- && (pExpr->iDocid==pCsr->iPrevId || pExpr->bDeferred)
- ){
+ if( pCsr->pDeferred && (pExpr->bDeferred || (
+ pExpr->iDocid==pCsr->iPrevId && pExpr->pPhrase->doclist.pList
+ ))){
Fts3Phrase *pPhrase = pExpr->pPhrase;
- assert( pExpr->bDeferred || pPhrase->doclist.bFreeList==0 );
if( pExpr->bDeferred ){
fts3EvalInvalidatePoslist(pPhrase);
}
@@ -176822,6 +186862,22 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){
}
/*
+** This is an sqlite3Fts3ExprIterate() callback. If the Fts3Expr.aMI[] array
+** has not yet been allocated, allocate and zero it. Otherwise, just zero
+** it.
+*/
+static int fts3AllocateMSI(Fts3Expr *pExpr, int iPhrase, void *pCtx){
+ Fts3Table *pTab = (Fts3Table*)pCtx;
+ UNUSED_PARAMETER(iPhrase);
+ if( pExpr->aMI==0 ){
+ pExpr->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32));
+ if( pExpr->aMI==0 ) return SQLITE_NOMEM;
+ }
+ memset(pExpr->aMI, 0, pTab->nColumn * 3 * sizeof(u32));
+ return SQLITE_OK;
+}
+
+/*
** Expression pExpr must be of type FTSQUERY_PHRASE.
**
** If it is not already allocated and populated, this function allocates and
@@ -176842,7 +186898,6 @@ static int fts3EvalGatherStats(
if( pExpr->aMI==0 ){
Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
Fts3Expr *pRoot; /* Root of NEAR expression */
- Fts3Expr *p; /* Iterator used for several purposes */
sqlite3_int64 iPrevId = pCsr->iPrevId;
sqlite3_int64 iDocid;
@@ -176850,7 +186905,9 @@ static int fts3EvalGatherStats(
/* Find the root of the NEAR expression */
pRoot = pExpr;
- while( pRoot->pParent && pRoot->pParent->eType==FTSQUERY_NEAR ){
+ while( pRoot->pParent
+ && (pRoot->pParent->eType==FTSQUERY_NEAR || pRoot->bDeferred)
+ ){
pRoot = pRoot->pParent;
}
iDocid = pRoot->iDocid;
@@ -176858,14 +186915,8 @@ static int fts3EvalGatherStats(
assert( pRoot->bStart );
/* Allocate space for the aMSI[] array of each FTSQUERY_PHRASE node */
- for(p=pRoot; p; p=p->pLeft){
- Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight);
- assert( pE->aMI==0 );
- pE->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32));
- if( !pE->aMI ) return SQLITE_NOMEM;
- memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32));
- }
-
+ rc = sqlite3Fts3ExprIterate(pRoot, fts3AllocateMSI, (void*)pTab);
+ if( rc!=SQLITE_OK ) return rc;
fts3EvalRestart(pCsr, pRoot, &rc);
while( pCsr->isEof==0 && rc==SQLITE_OK ){
@@ -177021,6 +187072,7 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(
u8 bTreeEof = 0;
Fts3Expr *p; /* Used to iterate from pExpr to root */
Fts3Expr *pNear; /* Most senior NEAR ancestor (or pExpr) */
+ Fts3Expr *pRun; /* Closest non-deferred ancestor of pNear */
int bMatch;
/* Check if this phrase descends from an OR expression node. If not,
@@ -177035,22 +187087,30 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(
if( p->bEof ) bTreeEof = 1;
}
if( bOr==0 ) return SQLITE_OK;
+ pRun = pNear;
+ while( pRun->bDeferred ){
+ assert( pRun->pParent );
+ pRun = pRun->pParent;
+ }
/* This is the descendent of an OR node. In this case we cannot use
** an incremental phrase. Load the entire doclist for the phrase
** into memory in this case. */
if( pPhrase->bIncr ){
- int bEofSave = pNear->bEof;
- fts3EvalRestart(pCsr, pNear, &rc);
- while( rc==SQLITE_OK && !pNear->bEof ){
- fts3EvalNextRow(pCsr, pNear, &rc);
- if( bEofSave==0 && pNear->iDocid==iDocid ) break;
+ int bEofSave = pRun->bEof;
+ fts3EvalRestart(pCsr, pRun, &rc);
+ while( rc==SQLITE_OK && !pRun->bEof ){
+ fts3EvalNextRow(pCsr, pRun, &rc);
+ if( bEofSave==0 && pRun->iDocid==iDocid ) break;
}
assert( rc!=SQLITE_OK || pPhrase->bIncr==0 );
+ if( rc==SQLITE_OK && pRun->bEof!=bEofSave ){
+ rc = FTS_CORRUPT_VTAB;
+ }
}
if( bTreeEof ){
- while( rc==SQLITE_OK && !pNear->bEof ){
- fts3EvalNextRow(pCsr, pNear, &rc);
+ while( rc==SQLITE_OK && !pRun->bEof ){
+ fts3EvalNextRow(pCsr, pRun, &rc);
}
}
if( rc!=SQLITE_OK ) return rc;
@@ -177469,6 +187529,7 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){
if( fts3auxGrowStatArray(pCsr, 2) ) return SQLITE_NOMEM;
memset(pCsr->aStat, 0, sizeof(struct Fts3auxColstats) * pCsr->nStat);
iCol = 0;
+ rc = SQLITE_OK;
while( i<nDoclist ){
sqlite3_int64 v = 0;
@@ -177512,6 +187573,10 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){
/* State 3. The integer just read is a column number. */
default: assert( eState==3 );
iCol = (int)v;
+ if( iCol<1 ){
+ rc = SQLITE_CORRUPT_VTAB;
+ break;
+ }
if( fts3auxGrowStatArray(pCsr, iCol+2) ) return SQLITE_NOMEM;
pCsr->aStat[iCol+1].nDoc++;
eState = 2;
@@ -177520,7 +187585,6 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){
}
pCsr->iCol = 0;
- rc = SQLITE_OK;
}else{
pCsr->isEof = 1;
}
@@ -177849,7 +187913,7 @@ static int fts3isspace(char c){
** zero the memory before returning a pointer to it. If unsuccessful,
** return NULL.
*/
-static void *fts3MallocZero(sqlite3_int64 nByte){
+SQLITE_PRIVATE void *sqlite3Fts3MallocZero(sqlite3_int64 nByte){
void *pRet = sqlite3_malloc64(nByte);
if( pRet ) memset(pRet, 0, nByte);
return pRet;
@@ -177930,7 +187994,7 @@ static int getNextToken(
rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition);
if( rc==SQLITE_OK ){
nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken;
- pRet = (Fts3Expr *)fts3MallocZero(nByte);
+ pRet = (Fts3Expr *)sqlite3Fts3MallocZero(nByte);
if( !pRet ){
rc = SQLITE_NOMEM;
}else{
@@ -178185,7 +188249,7 @@ static int getNextNode(
if( fts3isspace(cNext)
|| cNext=='"' || cNext=='(' || cNext==')' || cNext==0
){
- pRet = (Fts3Expr *)fts3MallocZero(sizeof(Fts3Expr));
+ pRet = (Fts3Expr *)sqlite3Fts3MallocZero(sizeof(Fts3Expr));
if( !pRet ){
return SQLITE_NOMEM;
}
@@ -178364,7 +188428,7 @@ static int fts3ExprParse(
&& p->eType==FTSQUERY_PHRASE && pParse->isNot
){
/* Create an implicit NOT operator. */
- Fts3Expr *pNot = fts3MallocZero(sizeof(Fts3Expr));
+ Fts3Expr *pNot = sqlite3Fts3MallocZero(sizeof(Fts3Expr));
if( !pNot ){
sqlite3Fts3ExprFree(p);
rc = SQLITE_NOMEM;
@@ -178398,7 +188462,7 @@ static int fts3ExprParse(
/* Insert an implicit AND operator. */
Fts3Expr *pAnd;
assert( pRet && pPrev );
- pAnd = fts3MallocZero(sizeof(Fts3Expr));
+ pAnd = sqlite3Fts3MallocZero(sizeof(Fts3Expr));
if( !pAnd ){
sqlite3Fts3ExprFree(p);
rc = SQLITE_NOMEM;
@@ -180030,7 +190094,7 @@ static int porterNext(
if( n>c->nAllocated ){
char *pNew;
c->nAllocated = n+20;
- pNew = sqlite3_realloc(c->zToken, c->nAllocated);
+ pNew = sqlite3_realloc64(c->zToken, c->nAllocated);
if( !pNew ) return SQLITE_NOMEM;
c->zToken = pNew;
}
@@ -180782,7 +190846,7 @@ static int simpleNext(
if( n>c->nTokenAllocated ){
char *pNew;
c->nTokenAllocated = n+20;
- pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated);
+ pNew = sqlite3_realloc64(c->pToken, c->nTokenAllocated);
if( !pNew ) return SQLITE_NOMEM;
c->pToken = pNew;
}
@@ -181254,7 +191318,7 @@ static int fts3tokRowidMethod(
** Register the fts3tok module with database connection db. Return SQLITE_OK
** if successful or an error code if sqlite3_create_module() fails.
*/
-SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){
+SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash, void(*xDestroy)(void*)){
static const sqlite3_module fts3tok_module = {
0, /* iVersion */
fts3tokConnectMethod, /* xCreate */
@@ -181283,7 +191347,9 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){
};
int rc; /* Return code */
- rc = sqlite3_create_module(db, "fts3tokenize", &fts3tok_module, (void*)pHash);
+ rc = sqlite3_create_module_v2(
+ db, "fts3tokenize", &fts3tok_module, (void*)pHash, xDestroy
+ );
return rc;
}
@@ -181942,7 +192008,7 @@ static int fts3PendingListAppendVarint(
/* Allocate or grow the PendingList as required. */
if( !p ){
- p = sqlite3_malloc(sizeof(*p) + 100);
+ p = sqlite3_malloc64(sizeof(*p) + 100);
if( !p ){
return SQLITE_NOMEM;
}
@@ -181951,14 +192017,14 @@ static int fts3PendingListAppendVarint(
p->nData = 0;
}
else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){
- int nNew = p->nSpace * 2;
- p = sqlite3_realloc(p, sizeof(*p) + nNew);
+ i64 nNew = p->nSpace * 2;
+ p = sqlite3_realloc64(p, sizeof(*p) + nNew);
if( !p ){
sqlite3_free(*pp);
*pp = 0;
return SQLITE_NOMEM;
}
- p->nSpace = nNew;
+ p->nSpace = (int)nNew;
p->aData = (char *)&p[1];
}
@@ -182515,7 +192581,7 @@ SQLITE_PRIVATE int sqlite3Fts3ReadBlock(
int nByte = sqlite3_blob_bytes(p->pSegments);
*pnBlob = nByte;
if( paBlob ){
- char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING);
+ char *aByte = sqlite3_malloc64((i64)nByte + FTS3_NODE_PADDING);
if( !aByte ){
rc = SQLITE_NOMEM;
}else{
@@ -182628,9 +192694,19 @@ static int fts3SegReaderNext(
char *aCopy;
PendingList *pList = (PendingList *)fts3HashData(pElem);
int nCopy = pList->nData+1;
- pReader->zTerm = (char *)fts3HashKey(pElem);
- pReader->nTerm = fts3HashKeysize(pElem);
- aCopy = (char*)sqlite3_malloc(nCopy);
+
+ int nTerm = fts3HashKeysize(pElem);
+ if( (nTerm+1)>pReader->nTermAlloc ){
+ sqlite3_free(pReader->zTerm);
+ pReader->zTerm = (char*)sqlite3_malloc64(((i64)nTerm+1)*2);
+ if( !pReader->zTerm ) return SQLITE_NOMEM;
+ pReader->nTermAlloc = (nTerm+1)*2;
+ }
+ memcpy(pReader->zTerm, fts3HashKey(pElem), nTerm);
+ pReader->zTerm[nTerm] = '\0';
+ pReader->nTerm = nTerm;
+
+ aCopy = (char*)sqlite3_malloc64(nCopy);
if( !aCopy ) return SQLITE_NOMEM;
memcpy(aCopy, pList->aData, nCopy);
pReader->nNode = pReader->nDoclist = nCopy;
@@ -182882,9 +192958,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(
*/
SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){
if( pReader ){
- if( !fts3SegReaderIsPending(pReader) ){
- sqlite3_free(pReader->zTerm);
- }
+ sqlite3_free(pReader->zTerm);
if( !fts3SegReaderIsRootOnly(pReader) ){
sqlite3_free(pReader->aNode);
}
@@ -182919,7 +192993,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew(
nExtra = nRoot + FTS3_NODE_PADDING;
}
- pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra);
+ pReader = (Fts3SegReader *)sqlite3_malloc64(sizeof(Fts3SegReader) + nExtra);
if( !pReader ){
return SQLITE_NOMEM;
}
@@ -183011,7 +193085,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending(
if( nElem==nAlloc ){
Fts3HashElem **aElem2;
nAlloc += 16;
- aElem2 = (Fts3HashElem **)sqlite3_realloc(
+ aElem2 = (Fts3HashElem **)sqlite3_realloc64(
aElem, nAlloc*sizeof(Fts3HashElem *)
);
if( !aElem2 ){
@@ -183345,7 +193419,7 @@ static int fts3NodeAddTerm(
** this is not expected to be a serious problem.
*/
assert( pTree->aData==(char *)&pTree[1] );
- pTree->aData = (char *)sqlite3_malloc(nReq);
+ pTree->aData = (char *)sqlite3_malloc64(nReq);
if( !pTree->aData ){
return SQLITE_NOMEM;
}
@@ -183363,7 +193437,7 @@ static int fts3NodeAddTerm(
if( isCopyTerm ){
if( pTree->nMalloc<nTerm ){
- char *zNew = sqlite3_realloc(pTree->zMalloc, nTerm*2);
+ char *zNew = sqlite3_realloc64(pTree->zMalloc, (i64)nTerm*2);
if( !zNew ){
return SQLITE_NOMEM;
}
@@ -183389,7 +193463,7 @@ static int fts3NodeAddTerm(
** now. Instead, the term is inserted into the parent of pTree. If pTree
** has no parent, one is created here.
*/
- pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize);
+ pNew = (SegmentNode *)sqlite3_malloc64(sizeof(SegmentNode) + p->nNodeSize);
if( !pNew ){
return SQLITE_NOMEM;
}
@@ -183527,7 +193601,7 @@ static int fts3SegWriterAdd(
){
int nPrefix; /* Size of term prefix in bytes */
int nSuffix; /* Size of term suffix in bytes */
- int nReq; /* Number of bytes required on leaf page */
+ i64 nReq; /* Number of bytes required on leaf page */
int nData;
SegmentWriter *pWriter = *ppWriter;
@@ -183536,13 +193610,13 @@ static int fts3SegWriterAdd(
sqlite3_stmt *pStmt;
/* Allocate the SegmentWriter structure */
- pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter));
+ pWriter = (SegmentWriter *)sqlite3_malloc64(sizeof(SegmentWriter));
if( !pWriter ) return SQLITE_NOMEM;
memset(pWriter, 0, sizeof(SegmentWriter));
*ppWriter = pWriter;
/* Allocate a buffer in which to accumulate data */
- pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize);
+ pWriter->aData = (char *)sqlite3_malloc64(p->nNodeSize);
if( !pWriter->aData ) return SQLITE_NOMEM;
pWriter->nSize = p->nNodeSize;
@@ -183617,7 +193691,7 @@ static int fts3SegWriterAdd(
** the buffer to make it large enough.
*/
if( nReq>pWriter->nSize ){
- char *aNew = sqlite3_realloc(pWriter->aData, nReq);
+ char *aNew = sqlite3_realloc64(pWriter->aData, nReq);
if( !aNew ) return SQLITE_NOMEM;
pWriter->aData = aNew;
pWriter->nSize = nReq;
@@ -183642,7 +193716,7 @@ static int fts3SegWriterAdd(
*/
if( isCopyTerm ){
if( nTerm>pWriter->nMalloc ){
- char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2);
+ char *zNew = sqlite3_realloc64(pWriter->zMalloc, (i64)nTerm*2);
if( !zNew ){
return SQLITE_NOMEM;
}
@@ -183950,18 +194024,20 @@ static void fts3ColumnFilter(
static int fts3MsrBufferData(
Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */
char *pList,
- int nList
+ i64 nList
){
- if( nList>pMsr->nBuffer ){
+ if( (nList+FTS3_NODE_PADDING)>pMsr->nBuffer ){
char *pNew;
- pMsr->nBuffer = nList*2;
- pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer);
+ int nNew = nList*2 + FTS3_NODE_PADDING;
+ pNew = (char *)sqlite3_realloc64(pMsr->aBuffer, nNew);
if( !pNew ) return SQLITE_NOMEM;
pMsr->aBuffer = pNew;
+ pMsr->nBuffer = nNew;
}
assert( nList>0 );
memcpy(pMsr->aBuffer, pList, nList);
+ memset(&pMsr->aBuffer[nList], 0, FTS3_NODE_PADDING);
return SQLITE_OK;
}
@@ -184011,7 +194087,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext(
fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp);
if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){
- rc = fts3MsrBufferData(pMsr, pList, nList+1);
+ rc = fts3MsrBufferData(pMsr, pList, (i64)nList+1);
if( rc!=SQLITE_OK ) return rc;
assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 );
pList = pMsr->aBuffer;
@@ -184148,11 +194224,11 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){
return SQLITE_OK;
}
-static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, int nReq){
+static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, i64 nReq){
if( nReq>pCsr->nBuffer ){
char *aNew;
pCsr->nBuffer = nReq*2;
- aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer);
+ aNew = sqlite3_realloc64(pCsr->aBuffer, pCsr->nBuffer);
if( !aNew ){
return SQLITE_NOMEM;
}
@@ -184243,7 +194319,8 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(
){
pCsr->nDoclist = apSegment[0]->nDoclist;
if( fts3SegReaderIsPending(apSegment[0]) ){
- rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist);
+ rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist,
+ (i64)pCsr->nDoclist);
pCsr->aDoclist = pCsr->aBuffer;
}else{
pCsr->aDoclist = apSegment[0]->aDoclist;
@@ -184296,7 +194373,8 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(
nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0);
- rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist+FTS3_NODE_PADDING);
+ rc = fts3GrowSegReaderBuffer(pCsr,
+ (i64)nByte+nDoclist+FTS3_NODE_PADDING);
if( rc ) return rc;
if( isFirst ){
@@ -184322,7 +194400,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(
fts3SegReaderSort(apSegment, nMerge, j, xCmp);
}
if( nDoclist>0 ){
- rc = fts3GrowSegReaderBuffer(pCsr, nDoclist+FTS3_NODE_PADDING);
+ rc = fts3GrowSegReaderBuffer(pCsr, (i64)nDoclist+FTS3_NODE_PADDING);
if( rc ) return rc;
memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING);
pCsr->aDoclist = pCsr->aBuffer;
@@ -185035,7 +195113,7 @@ struct NodeReader {
static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){
if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){
int nAlloc = nMin;
- char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc);
+ char *a = (char *)sqlite3_realloc64(pBlob->a, nAlloc);
if( a ){
pBlob->nAlloc = nAlloc;
pBlob->a = a;
@@ -185076,7 +195154,7 @@ static int nodeReaderNext(NodeReader *p){
return FTS_CORRUPT_VTAB;
}
blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc);
- if( rc==SQLITE_OK ){
+ if( rc==SQLITE_OK && ALWAYS(p->term.a!=0) ){
memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix);
p->term.n = nPrefix+nSuffix;
p->iOff += nSuffix;
@@ -185184,6 +195262,8 @@ static int fts3IncrmergePush(
pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nPrefix);
}
pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nSuffix);
+ assert( nPrefix+nSuffix<=nTerm );
+ assert( nPrefix>=0 );
memcpy(&pBlk->a[pBlk->n], &zTerm[nPrefix], nSuffix);
pBlk->n += nSuffix;
@@ -185306,6 +195386,7 @@ static int fts3IncrmergeAppend(
pLeaf = &pWriter->aNodeWriter[0];
nPrefix = fts3PrefixCompress(pLeaf->key.a, pLeaf->key.n, zTerm, nTerm);
nSuffix = nTerm - nPrefix;
+ if(nSuffix<=0 ) return FTS_CORRUPT_VTAB;
nSpace = sqlite3Fts3VarintLen(nPrefix);
nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix;
@@ -185470,7 +195551,11 @@ static int fts3TermCmp(
int nCmp = MIN(nLhs, nRhs);
int res;
- res = (nCmp ? memcmp(zLhs, zRhs, nCmp) : 0);
+ if( nCmp && ALWAYS(zLhs) && ALWAYS(zRhs) ){
+ res = memcmp(zLhs, zRhs, nCmp);
+ }else{
+ res = 0;
+ }
if( res==0 ) res = nLhs - nRhs;
return res;
@@ -185825,7 +195910,7 @@ static int fts3RepackSegdirLevel(
if( nIdx>=nAlloc ){
int *aNew;
nAlloc += 16;
- aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int));
+ aNew = sqlite3_realloc64(aIdx, nAlloc*sizeof(int));
if( !aNew ){
rc = SQLITE_NOMEM;
break;
@@ -186114,7 +196199,7 @@ static int fts3IncrmergeHintLoad(Fts3Table *p, Blob *pHint){
if( aHint ){
blobGrowBuffer(pHint, nHint, &rc);
if( rc==SQLITE_OK ){
- memcpy(pHint->a, aHint, nHint);
+ if( ALWAYS(pHint->a!=0) ) memcpy(pHint->a, aHint, nHint);
pHint->n = nHint;
}
}
@@ -186199,7 +196284,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){
/* Allocate space for the cursor, filter and writer objects */
const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter);
- pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc);
+ pWriter = (IncrmergeWriter *)sqlite3_malloc64(nAlloc);
if( !pWriter ) return SQLITE_NOMEM;
pFilter = (Fts3SegFilter *)&pWriter[1];
pCsr = (Fts3MultiSegReader *)&pFilter[1];
@@ -186835,7 +196920,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList(
return SQLITE_OK;
}
- pRet = (char *)sqlite3_malloc(p->pList->nData);
+ pRet = (char *)sqlite3_malloc64(p->pList->nData);
if( !pRet ) return SQLITE_NOMEM;
nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy);
@@ -186855,7 +196940,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferToken(
int iCol /* Column that token must appear in (or -1) */
){
Fts3DeferredToken *pDeferred;
- pDeferred = sqlite3_malloc(sizeof(*pDeferred));
+ pDeferred = sqlite3_malloc64(sizeof(*pDeferred));
if( !pDeferred ){
return SQLITE_NOMEM;
}
@@ -187134,7 +197219,7 @@ typedef sqlite3_int64 i64;
/*
-** Used as an fts3ExprIterate() context when loading phrase doclists to
+** Used as an sqlite3Fts3ExprIterate() context when loading phrase doclists to
** Fts3Expr.aDoclist[]/nDoclist.
*/
typedef struct LoadDoclistCtx LoadDoclistCtx;
@@ -187178,7 +197263,7 @@ struct SnippetFragment {
};
/*
-** This type is used as an fts3ExprIterate() context object while
+** This type is used as an sqlite3Fts3ExprIterate() context object while
** accumulating the data returned by the matchinfo() function.
*/
typedef struct MatchInfo MatchInfo;
@@ -187231,9 +197316,8 @@ static MatchinfoBuffer *fts3MIBufferNew(size_t nElem, const char *zMatchinfo){
+ sizeof(MatchinfoBuffer);
sqlite3_int64 nStr = strlen(zMatchinfo);
- pRet = sqlite3_malloc64(nByte + nStr+1);
+ pRet = sqlite3Fts3MallocZero(nByte + nStr+1);
if( pRet ){
- memset(pRet, 0, nByte);
pRet->aMatchinfo[0] = (u8*)(&pRet->aMatchinfo[1]) - (u8*)pRet;
pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0]
+ sizeof(u32)*((int)nElem+1);
@@ -187338,7 +197422,7 @@ static void fts3GetDeltaPosition(char **pp, i64 *piPos){
}
/*
-** Helper function for fts3ExprIterate() (see below).
+** Helper function for sqlite3Fts3ExprIterate() (see below).
*/
static int fts3ExprIterate2(
Fts3Expr *pExpr, /* Expression to iterate phrases of */
@@ -187372,7 +197456,7 @@ static int fts3ExprIterate2(
** Otherwise, SQLITE_OK is returned after a callback has been made for
** all eligible phrase nodes.
*/
-static int fts3ExprIterate(
+SQLITE_PRIVATE int sqlite3Fts3ExprIterate(
Fts3Expr *pExpr, /* Expression to iterate phrases of */
int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */
void *pCtx /* Second argument to pass to callback */
@@ -187381,10 +197465,9 @@ static int fts3ExprIterate(
return fts3ExprIterate2(pExpr, &iPhrase, x, pCtx);
}
-
/*
-** This is an fts3ExprIterate() callback used while loading the doclists
-** for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also
+** This is an sqlite3Fts3ExprIterate() callback used while loading the
+** doclists for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also
** fts3ExprLoadDoclists().
*/
static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, int iPhrase, void *ctx){
@@ -187416,9 +197499,9 @@ static int fts3ExprLoadDoclists(
int *pnToken /* OUT: Number of tokens in query */
){
int rc; /* Return Code */
- LoadDoclistCtx sCtx = {0,0,0}; /* Context for fts3ExprIterate() */
+ LoadDoclistCtx sCtx = {0,0,0}; /* Context for sqlite3Fts3ExprIterate() */
sCtx.pCsr = pCsr;
- rc = fts3ExprIterate(pCsr->pExpr, fts3ExprLoadDoclistsCb, (void *)&sCtx);
+ rc = sqlite3Fts3ExprIterate(pCsr->pExpr,fts3ExprLoadDoclistsCb,(void*)&sCtx);
if( pnPhrase ) *pnPhrase = sCtx.nPhrase;
if( pnToken ) *pnToken = sCtx.nToken;
return rc;
@@ -187431,7 +197514,7 @@ static int fts3ExprPhraseCountCb(Fts3Expr *pExpr, int iPhrase, void *ctx){
}
static int fts3ExprPhraseCount(Fts3Expr *pExpr){
int nPhrase = 0;
- (void)fts3ExprIterate(pExpr, fts3ExprPhraseCountCb, (void *)&nPhrase);
+ (void)sqlite3Fts3ExprIterate(pExpr, fts3ExprPhraseCountCb, (void *)&nPhrase);
return nPhrase;
}
@@ -187559,8 +197642,9 @@ static void fts3SnippetDetails(
}
/*
-** This function is an fts3ExprIterate() callback used by fts3BestSnippet().
-** Each invocation populates an element of the SnippetIter.aPhrase[] array.
+** This function is an sqlite3Fts3ExprIterate() callback used by
+** fts3BestSnippet(). Each invocation populates an element of the
+** SnippetIter.aPhrase[] array.
*/
static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){
SnippetIter *p = (SnippetIter *)ctx;
@@ -187637,11 +197721,10 @@ static int fts3BestSnippet(
** the required space using malloc().
*/
nByte = sizeof(SnippetPhrase) * nList;
- sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc64(nByte);
+ sIter.aPhrase = (SnippetPhrase *)sqlite3Fts3MallocZero(nByte);
if( !sIter.aPhrase ){
return SQLITE_NOMEM;
}
- memset(sIter.aPhrase, 0, nByte);
/* Initialize the contents of the SnippetIter object. Then iterate through
** the set of phrases in the expression to populate the aPhrase[] array.
@@ -187651,7 +197734,9 @@ static int fts3BestSnippet(
sIter.nSnippet = nSnippet;
sIter.nPhrase = nList;
sIter.iCurrent = -1;
- rc = fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void*)&sIter);
+ rc = sqlite3Fts3ExprIterate(
+ pCsr->pExpr, fts3SnippetFindPositions, (void*)&sIter
+ );
if( rc==SQLITE_OK ){
/* Set the *pmSeen output variable. */
@@ -188012,10 +198097,10 @@ static int fts3ExprLHitGather(
}
/*
-** fts3ExprIterate() callback used to collect the "global" matchinfo stats
-** for a single query.
+** sqlite3Fts3ExprIterate() callback used to collect the "global" matchinfo
+** stats for a single query.
**
-** fts3ExprIterate() callback to load the 'global' elements of a
+** sqlite3Fts3ExprIterate() callback to load the 'global' elements of a
** FTS3_MATCHINFO_HITS matchinfo array. The global stats are those elements
** of the matchinfo array that are constant for all rows returned by the
** current query.
@@ -188050,7 +198135,7 @@ static int fts3ExprGlobalHitsCb(
}
/*
-** fts3ExprIterate() callback used to collect the "local" part of the
+** sqlite3Fts3ExprIterate() callback used to collect the "local" part of the
** FTS3_MATCHINFO_HITS array. The local stats are those elements of the
** array that are different for each row returned by the query.
*/
@@ -188205,10 +198290,12 @@ static int fts3MatchinfoLcsCb(
** position list for the next column.
*/
static int fts3LcsIteratorAdvance(LcsIterator *pIter){
- char *pRead = pIter->pRead;
+ char *pRead;
sqlite3_int64 iRead;
int rc = 0;
+ if( NEVER(pIter==0) ) return 1;
+ pRead = pIter->pRead;
pRead += sqlite3Fts3GetVarint(pRead, &iRead);
if( iRead==0 || iRead==1 ){
pRead = 0;
@@ -188242,10 +198329,9 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){
/* Allocate and populate the array of LcsIterator objects. The array
** contains one element for each matchable phrase in the query.
**/
- aIter = sqlite3_malloc64(sizeof(LcsIterator) * pCsr->nPhrase);
+ aIter = sqlite3Fts3MallocZero(sizeof(LcsIterator) * pCsr->nPhrase);
if( !aIter ) return SQLITE_NOMEM;
- memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase);
- (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter);
+ (void)sqlite3Fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter);
for(i=0; i<pInfo->nPhrase; i++){
LcsIterator *pIter = &aIter[i];
@@ -188422,11 +198508,11 @@ static int fts3MatchinfoValues(
rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &pInfo->nDoc,0,0);
if( rc!=SQLITE_OK ) break;
}
- rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo);
+ rc = sqlite3Fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo);
sqlite3Fts3EvalTestDeferred(pCsr, &rc);
if( rc!=SQLITE_OK ) break;
}
- (void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo);
+ (void)sqlite3Fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo);
break;
}
}
@@ -188649,7 +198735,7 @@ struct TermOffsetCtx {
};
/*
-** This function is an fts3ExprIterate() callback used by sqlite3Fts3Offsets().
+** This function is an sqlite3Fts3ExprIterate() callback used by sqlite3Fts3Offsets().
*/
static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){
TermOffsetCtx *p = (TermOffsetCtx *)ctx;
@@ -188705,7 +198791,7 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets(
if( rc!=SQLITE_OK ) goto offsets_out;
/* Allocate the array of TermOffset iterators. */
- sCtx.aTerm = (TermOffset *)sqlite3_malloc64(sizeof(TermOffset)*nToken);
+ sCtx.aTerm = (TermOffset *)sqlite3Fts3MallocZero(sizeof(TermOffset)*nToken);
if( 0==sCtx.aTerm ){
rc = SQLITE_NOMEM;
goto offsets_out;
@@ -188726,13 +198812,15 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets(
const char *zDoc;
int nDoc;
- /* Initialize the contents of sCtx.aTerm[] for column iCol. There is
- ** no way that this operation can fail, so the return code from
- ** fts3ExprIterate() can be discarded.
+ /* Initialize the contents of sCtx.aTerm[] for column iCol. This
+ ** operation may fail if the database contains corrupt records.
*/
sCtx.iCol = iCol;
sCtx.iTerm = 0;
- (void)fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void*)&sCtx);
+ rc = sqlite3Fts3ExprIterate(
+ pCsr->pExpr, fts3ExprTermOffsetInit, (void*)&sCtx
+ );
+ if( rc!=SQLITE_OK ) goto offsets_out;
/* Retreive the text stored in column iCol. If an SQL NULL is stored
** in column iCol, jump immediately to the next iteration of the loop.
@@ -189631,7 +199719,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){
#endif /* !defined(SQLITE_DISABLE_FTS3_UNICODE) */
/************** End of fts3_unicode2.c ***************************************/
-/************** Begin file json1.c *******************************************/
+/************** Begin file json.c ********************************************/
/*
** 2015-08-12
**
@@ -189644,10 +199732,10 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){
**
******************************************************************************
**
-** This SQLite extension implements JSON functions. The interface is
-** modeled after MySQL JSON functions:
+** This SQLite JSON functions.
**
-** https://dev.mysql.com/doc/refman/5.7/en/json.html
+** This file began as an extension in ext/misc/json1.c in 2015. That
+** extension proved so useful that it has now been moved into the core.
**
** For the time being, all JSON is stored as pure text. (We might add
** a JSONB type in the future which stores a binary encoding of JSON in
@@ -189655,48 +199743,8 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){
** This implementation parses JSON text at 250 MB/s, so it is hard to see
** how JSONB might improve on that.)
*/
-#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1)
-#if !defined(SQLITEINT_H)
-/* #include "sqlite3ext.h" */
-#endif
-SQLITE_EXTENSION_INIT1
-/* #include <assert.h> */
-/* #include <string.h> */
-/* #include <stdlib.h> */
-/* #include <stdarg.h> */
-
-/* Mark a function parameter as unused, to suppress nuisance compiler
-** warnings. */
-#ifndef UNUSED_PARAM
-# define UNUSED_PARAM(X) (void)(X)
-#endif
-
-#ifndef LARGEST_INT64
-# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32))
-# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64)
-#endif
-
-#ifndef deliberate_fall_through
-# define deliberate_fall_through
-#endif
-
-/*
-** Versions of isspace(), isalnum() and isdigit() to which it is safe
-** to pass signed char values.
-*/
-#ifdef sqlite3Isdigit
- /* Use the SQLite core versions if this routine is part of the
- ** SQLite amalgamation */
-# define safe_isdigit(x) sqlite3Isdigit(x)
-# define safe_isalnum(x) sqlite3Isalnum(x)
-# define safe_isxdigit(x) sqlite3Isxdigit(x)
-#else
- /* Use the standard library for separate compilation */
-#include <ctype.h> /* amalgamator: keep */
-# define safe_isdigit(x) isdigit((unsigned char)(x))
-# define safe_isalnum(x) isalnum((unsigned char)(x))
-# define safe_isxdigit(x) isxdigit((unsigned char)(x))
-#endif
+#ifndef SQLITE_OMIT_JSON
+/* #include "sqliteInt.h" */
/*
** Growing our own isspace() routine this way is twice as fast as
@@ -189721,15 +199769,12 @@ static const char jsonIsSpace[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
-#define safe_isspace(x) (jsonIsSpace[(unsigned char)x])
+#define fast_isspace(x) (jsonIsSpace[(unsigned char)x])
-#ifndef SQLITE_AMALGAMATION
- /* Unsigned integer types. These are already defined in the sqliteInt.h,
- ** but the definitions need to be repeated for separate compilation. */
- typedef sqlite3_uint64 u64;
- typedef unsigned int u32;
- typedef unsigned short int u16;
- typedef unsigned char u8;
+#if !defined(SQLITE_DEBUG) && !defined(SQLITE_COVERAGE_TEST)
+# define VVA(X)
+#else
+# define VVA(X) X
#endif
/* Objects */
@@ -189781,6 +199826,7 @@ static const char * const jsonType[] = {
#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */
#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */
#define JNODE_LABEL 0x40 /* Is a label of an object */
+#define JNODE_JSON5 0x80 /* Node contains JSON5 enhancements */
/* A single node of parsed JSON
@@ -189788,13 +199834,14 @@ static const char * const jsonType[] = {
struct JsonNode {
u8 eType; /* One of the JSON_ type values */
u8 jnFlags; /* JNODE flags */
+ u8 eU; /* Which union element to use */
u32 n; /* Bytes of content, or number of sub-nodes */
union {
- const char *zJContent; /* Content for INT, REAL, and STRING */
- u32 iAppend; /* More terms for ARRAY and OBJECT */
- u32 iKey; /* Key for ARRAY objects in json_tree() */
- u32 iReplace; /* Replacement content for JNODE_REPLACE */
- JsonNode *pPatch; /* Node chain of patch for JNODE_PATCH */
+ const char *zJContent; /* 1: Content for INT, REAL, and STRING */
+ u32 iAppend; /* 2: More terms for ARRAY and OBJECT */
+ u32 iKey; /* 3: Key for ARRAY objects in json_tree() */
+ u32 iReplace; /* 4: Replacement content for JNODE_REPLACE */
+ JsonNode *pPatch; /* 5: Node chain of patch for JNODE_PATCH */
} u;
};
@@ -189806,10 +199853,12 @@ struct JsonParse {
JsonNode *aNode; /* Array of nodes containing the parse */
const char *zJson; /* Original JSON string */
u32 *aUp; /* Index of parent of each node */
- u8 oom; /* Set to true if out of memory */
- u8 nErr; /* Number of errors seen */
u16 iDepth; /* Nesting depth */
+ u8 nErr; /* Number of errors seen */
+ u8 oom; /* Set to true if out of memory */
+ u8 hasNonstd; /* True if input uses non-standard features like JSON5 */
int nJson; /* Length of the zJson string in bytes */
+ u32 iErr; /* Error location in zJson[] */
u32 iHold; /* Replace cache line with the lowest iHold value */
};
@@ -189817,10 +199866,10 @@ struct JsonParse {
** Maximum nesting depth of JSON for this implementation.
**
** This limit is needed to avoid a stack overflow in the recursive
-** descent parser. A depth of 2000 is far deeper than any sane JSON
-** should go.
+** descent parser. A depth of 1000 is far deeper than any sane JSON
+** should go. Historical note: This limit was 2000 prior to version 3.42.0
*/
-#define JSON_MAX_DEPTH 2000
+#define JSON_MAX_DEPTH 1000
/**************************************************************************
** Utility routines for dealing with JsonString objects
@@ -189971,6 +200020,129 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){
}
/*
+** The zIn[0..N] string is a JSON5 string literal. Append to p a translation
+** of the string literal that standard JSON and that omits all JSON5
+** features.
+*/
+static void jsonAppendNormalizedString(JsonString *p, const char *zIn, u32 N){
+ u32 i;
+ jsonAppendChar(p, '"');
+ zIn++;
+ N -= 2;
+ while( N>0 ){
+ for(i=0; i<N && zIn[i]!='\\'; i++){}
+ if( i>0 ){
+ jsonAppendRaw(p, zIn, i);
+ zIn += i;
+ N -= i;
+ if( N==0 ) break;
+ }
+ assert( zIn[0]=='\\' );
+ switch( (u8)zIn[1] ){
+ case '\'':
+ jsonAppendChar(p, '\'');
+ break;
+ case 'v':
+ jsonAppendRaw(p, "\\u0009", 6);
+ break;
+ case 'x':
+ jsonAppendRaw(p, "\\u00", 4);
+ jsonAppendRaw(p, &zIn[2], 2);
+ zIn += 2;
+ N -= 2;
+ break;
+ case '0':
+ jsonAppendRaw(p, "\\u0000", 6);
+ break;
+ case '\r':
+ if( zIn[2]=='\n' ){
+ zIn++;
+ N--;
+ }
+ break;
+ case '\n':
+ break;
+ case 0xe2:
+ assert( N>=4 );
+ assert( 0x80==(u8)zIn[2] );
+ assert( 0xa8==(u8)zIn[3] || 0xa9==(u8)zIn[3] );
+ zIn += 2;
+ N -= 2;
+ break;
+ default:
+ jsonAppendRaw(p, zIn, 2);
+ break;
+ }
+ zIn += 2;
+ N -= 2;
+ }
+ jsonAppendChar(p, '"');
+}
+
+/*
+** The zIn[0..N] string is a JSON5 integer literal. Append to p a translation
+** of the string literal that standard JSON and that omits all JSON5
+** features.
+*/
+static void jsonAppendNormalizedInt(JsonString *p, const char *zIn, u32 N){
+ if( zIn[0]=='+' ){
+ zIn++;
+ N--;
+ }else if( zIn[0]=='-' ){
+ jsonAppendChar(p, '-');
+ zIn++;
+ N--;
+ }
+ if( zIn[0]=='0' && (zIn[1]=='x' || zIn[1]=='X') ){
+ sqlite3_int64 i = 0;
+ int rc = sqlite3DecOrHexToI64(zIn, &i);
+ if( rc<=1 ){
+ jsonPrintf(100,p,"%lld",i);
+ }else{
+ assert( rc==2 );
+ jsonAppendRaw(p, "9.0e999", 7);
+ }
+ return;
+ }
+ jsonAppendRaw(p, zIn, N);
+}
+
+/*
+** The zIn[0..N] string is a JSON5 real literal. Append to p a translation
+** of the string literal that standard JSON and that omits all JSON5
+** features.
+*/
+static void jsonAppendNormalizedReal(JsonString *p, const char *zIn, u32 N){
+ u32 i;
+ if( zIn[0]=='+' ){
+ zIn++;
+ N--;
+ }else if( zIn[0]=='-' ){
+ jsonAppendChar(p, '-');
+ zIn++;
+ N--;
+ }
+ if( zIn[0]=='.' ){
+ jsonAppendChar(p, '0');
+ }
+ for(i=0; i<N; i++){
+ if( zIn[i]=='.' && (i+1==N || !sqlite3Isdigit(zIn[i+1])) ){
+ i++;
+ jsonAppendRaw(p, zIn, i);
+ zIn += i;
+ N -= i;
+ jsonAppendChar(p, '0');
+ break;
+ }
+ }
+ if( N>0 ){
+ jsonAppendRaw(p, zIn, N);
+ }
+}
+
+
+
+/*
** Append a function parameter value to the JSON string under
** construction.
*/
@@ -189983,8 +200155,11 @@ static void jsonAppendValue(
jsonAppendRaw(p, "null", 4);
break;
}
- case SQLITE_INTEGER:
case SQLITE_FLOAT: {
+ jsonPrintf(100, p, "%!0.15g", sqlite3_value_double(pValue));
+ break;
+ }
+ case SQLITE_INTEGER: {
const char *z = (const char*)sqlite3_value_text(pValue);
u32 n = (u32)sqlite3_value_bytes(pValue);
jsonAppendRaw(p, z, n);
@@ -190072,11 +200247,14 @@ static void jsonRenderNode(
JsonString *pOut, /* Write JSON here */
sqlite3_value **aReplace /* Replacement values */
){
+ assert( pNode!=0 );
if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){
- if( pNode->jnFlags & JNODE_REPLACE ){
+ if( (pNode->jnFlags & JNODE_REPLACE)!=0 && ALWAYS(aReplace!=0) ){
+ assert( pNode->eU==4 );
jsonAppendValue(pOut, aReplace[pNode->u.iReplace]);
return;
}
+ assert( pNode->eU==5 );
pNode = pNode->u.pPatch;
}
switch( pNode->eType ){
@@ -190094,15 +200272,38 @@ static void jsonRenderNode(
break;
}
case JSON_STRING: {
+ assert( pNode->eU==1 );
if( pNode->jnFlags & JNODE_RAW ){
- jsonAppendString(pOut, pNode->u.zJContent, pNode->n);
- break;
+ if( pNode->jnFlags & JNODE_LABEL ){
+ jsonAppendChar(pOut, '"');
+ jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
+ jsonAppendChar(pOut, '"');
+ }else{
+ jsonAppendString(pOut, pNode->u.zJContent, pNode->n);
+ }
+ }else if( pNode->jnFlags & JNODE_JSON5 ){
+ jsonAppendNormalizedString(pOut, pNode->u.zJContent, pNode->n);
+ }else{
+ jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
}
- /* no break */ deliberate_fall_through
+ break;
+ }
+ case JSON_REAL: {
+ assert( pNode->eU==1 );
+ if( pNode->jnFlags & JNODE_JSON5 ){
+ jsonAppendNormalizedReal(pOut, pNode->u.zJContent, pNode->n);
+ }else{
+ jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
+ }
+ break;
}
- case JSON_REAL:
case JSON_INT: {
- jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
+ assert( pNode->eU==1 );
+ if( pNode->jnFlags & JNODE_JSON5 ){
+ jsonAppendNormalizedInt(pOut, pNode->u.zJContent, pNode->n);
+ }else{
+ jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
+ }
break;
}
case JSON_ARRAY: {
@@ -190117,6 +200318,7 @@ static void jsonRenderNode(
j += jsonNodeSize(&pNode[j]);
}
if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
+ assert( pNode->eU==2 );
pNode = &pNode[pNode->u.iAppend];
j = 1;
}
@@ -190137,6 +200339,7 @@ static void jsonRenderNode(
j += 1 + jsonNodeSize(&pNode[j+1]);
}
if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
+ assert( pNode->eU==2 );
pNode = &pNode[pNode->u.iAppend];
j = 1;
}
@@ -190181,10 +200384,10 @@ static u8 jsonHexToInt(int h){
*/
static u32 jsonHexToInt4(const char *z){
u32 v;
- assert( safe_isxdigit(z[0]) );
- assert( safe_isxdigit(z[1]) );
- assert( safe_isxdigit(z[2]) );
- assert( safe_isxdigit(z[3]) );
+ assert( sqlite3Isxdigit(z[0]) );
+ assert( sqlite3Isxdigit(z[1]) );
+ assert( sqlite3Isxdigit(z[2]) );
+ assert( sqlite3Isxdigit(z[3]) );
v = (jsonHexToInt(z[0])<<12)
+ (jsonHexToInt(z[1])<<8)
+ (jsonHexToInt(z[2])<<4)
@@ -190216,73 +200419,63 @@ static void jsonReturn(
}
case JSON_INT: {
sqlite3_int64 i = 0;
- const char *z = pNode->u.zJContent;
- if( z[0]=='-' ){ z++; }
- while( z[0]>='0' && z[0]<='9' ){
- unsigned v = *(z++) - '0';
- if( i>=LARGEST_INT64/10 ){
- if( i>LARGEST_INT64/10 ) goto int_as_real;
- if( z[0]>='0' && z[0]<='9' ) goto int_as_real;
- if( v==9 ) goto int_as_real;
- if( v==8 ){
- if( pNode->u.zJContent[0]=='-' ){
- sqlite3_result_int64(pCtx, SMALLEST_INT64);
- goto int_done;
- }else{
- goto int_as_real;
- }
- }
- }
- i = i*10 + v;
+ int rc;
+ int bNeg = 0;
+ const char *z;
+
+
+ assert( pNode->eU==1 );
+ z = pNode->u.zJContent;
+ if( z[0]=='-' ){ z++; bNeg = 1; }
+ else if( z[0]=='+' ){ z++; }
+ rc = sqlite3DecOrHexToI64(z, &i);
+ if( rc<=1 ){
+ sqlite3_result_int64(pCtx, bNeg ? -i : i);
+ }else if( rc==3 && bNeg ){
+ sqlite3_result_int64(pCtx, SMALLEST_INT64);
+ }else{
+ goto to_double;
}
- if( pNode->u.zJContent[0]=='-' ){ i = -i; }
- sqlite3_result_int64(pCtx, i);
- int_done:
break;
- int_as_real: i=0; /* no break */ deliberate_fall_through
}
case JSON_REAL: {
double r;
-#ifdef SQLITE_AMALGAMATION
- const char *z = pNode->u.zJContent;
+ const char *z;
+ assert( pNode->eU==1 );
+ to_double:
+ z = pNode->u.zJContent;
sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8);
-#else
- r = strtod(pNode->u.zJContent, 0);
-#endif
sqlite3_result_double(pCtx, r);
break;
}
case JSON_STRING: {
-#if 0 /* Never happens because JNODE_RAW is only set by json_set(),
- ** json_insert() and json_replace() and those routines do not
- ** call jsonReturn() */
if( pNode->jnFlags & JNODE_RAW ){
+ assert( pNode->eU==1 );
sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n,
SQLITE_TRANSIENT);
- }else
-#endif
- assert( (pNode->jnFlags & JNODE_RAW)==0 );
- if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){
+ }else if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){
/* JSON formatted without any backslash-escapes */
+ assert( pNode->eU==1 );
sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2,
SQLITE_TRANSIENT);
}else{
/* Translate JSON formatted string into raw text */
u32 i;
u32 n = pNode->n;
- const char *z = pNode->u.zJContent;
+ const char *z;
char *zOut;
u32 j;
- zOut = sqlite3_malloc( n+1 );
+ u32 nOut = n;
+ assert( pNode->eU==1 );
+ z = pNode->u.zJContent;
+ zOut = sqlite3_malloc( nOut+1 );
if( zOut==0 ){
sqlite3_result_error_nomem(pCtx);
break;
}
for(i=1, j=0; i<n-1; i++){
char c = z[i];
- if( c!='\\' ){
- zOut[j++] = c;
- }else{
+ if( c=='\\' ){
c = z[++i];
if( c=='u' ){
u32 v = jsonHexToInt4(z+i+1);
@@ -190314,22 +200507,40 @@ static void jsonReturn(
zOut[j++] = 0x80 | (v&0x3f);
}
}
+ continue;
+ }else if( c=='b' ){
+ c = '\b';
+ }else if( c=='f' ){
+ c = '\f';
+ }else if( c=='n' ){
+ c = '\n';
+ }else if( c=='r' ){
+ c = '\r';
+ }else if( c=='t' ){
+ c = '\t';
+ }else if( c=='v' ){
+ c = '\v';
+ }else if( c=='\'' || c=='"' || c=='/' || c=='\\' ){
+ /* pass through unchanged */
+ }else if( c=='0' ){
+ c = 0;
+ }else if( c=='x' ){
+ c = (jsonHexToInt(z[i+1])<<4) | jsonHexToInt(z[i+2]);
+ i += 2;
+ }else if( c=='\r' && z[i+1]=='\n' ){
+ i++;
+ continue;
+ }else if( 0xe2==(u8)c ){
+ assert( 0x80==(u8)z[i+1] );
+ assert( 0xa8==(u8)z[i+2] || 0xa9==(u8)z[i+2] );
+ i += 2;
+ continue;
}else{
- if( c=='b' ){
- c = '\b';
- }else if( c=='f' ){
- c = '\f';
- }else if( c=='n' ){
- c = '\n';
- }else if( c=='r' ){
- c = '\r';
- }else if( c=='t' ){
- c = '\t';
- }
- zOut[j++] = c;
+ continue;
}
- }
- }
+ } /* end if( c=='\\' ) */
+ zOut[j++] = c;
+ } /* end for() */
zOut[j] = 0;
sqlite3_result_text(pCtx, zOut, j, sqlite3_free);
}
@@ -190393,33 +200604,190 @@ static int jsonParseAddNode(
const char *zContent /* Content */
){
JsonNode *p;
- if( pParse->nNode>=pParse->nAlloc ){
+ if( pParse->aNode==0 || pParse->nNode>=pParse->nAlloc ){
return jsonParseAddNodeExpand(pParse, eType, n, zContent);
}
p = &pParse->aNode[pParse->nNode];
- p->eType = (u8)eType;
- p->jnFlags = 0;
+ p->eType = (u8)(eType & 0xff);
+ p->jnFlags = (u8)(eType >> 8);
+ VVA( p->eU = zContent ? 1 : 0 );
p->n = n;
p->u.zJContent = zContent;
return pParse->nNode++;
}
/*
+** Return true if z[] begins with 2 (or more) hexadecimal digits
+*/
+static int jsonIs2Hex(const char *z){
+ return sqlite3Isxdigit(z[0]) && sqlite3Isxdigit(z[1]);
+}
+
+/*
** Return true if z[] begins with 4 (or more) hexadecimal digits
*/
static int jsonIs4Hex(const char *z){
- int i;
- for(i=0; i<4; i++) if( !safe_isxdigit(z[i]) ) return 0;
- return 1;
+ return jsonIs2Hex(z) && jsonIs2Hex(&z[2]);
+}
+
+/*
+** Return the number of bytes of JSON5 whitespace at the beginning of
+** the input string z[].
+**
+** JSON5 whitespace consists of any of the following characters:
+**
+** Unicode UTF-8 Name
+** U+0009 09 horizontal tab
+** U+000a 0a line feed
+** U+000b 0b vertical tab
+** U+000c 0c form feed
+** U+000d 0d carriage return
+** U+0020 20 space
+** U+00a0 c2 a0 non-breaking space
+** U+1680 e1 9a 80 ogham space mark
+** U+2000 e2 80 80 en quad
+** U+2001 e2 80 81 em quad
+** U+2002 e2 80 82 en space
+** U+2003 e2 80 83 em space
+** U+2004 e2 80 84 three-per-em space
+** U+2005 e2 80 85 four-per-em space
+** U+2006 e2 80 86 six-per-em space
+** U+2007 e2 80 87 figure space
+** U+2008 e2 80 88 punctuation space
+** U+2009 e2 80 89 thin space
+** U+200a e2 80 8a hair space
+** U+2028 e2 80 a8 line separator
+** U+2029 e2 80 a9 paragraph separator
+** U+202f e2 80 af narrow no-break space (NNBSP)
+** U+205f e2 81 9f medium mathematical space (MMSP)
+** U+3000 e3 80 80 ideographical space
+** U+FEFF ef bb bf byte order mark
+**
+** In addition, comments between '/', '*' and '*', '/' and
+** from '/', '/' to end-of-line are also considered to be whitespace.
+*/
+static int json5Whitespace(const char *zIn){
+ int n = 0;
+ const u8 *z = (u8*)zIn;
+ while( 1 /*exit by "goto whitespace_done"*/ ){
+ switch( z[n] ){
+ case 0x09:
+ case 0x0a:
+ case 0x0b:
+ case 0x0c:
+ case 0x0d:
+ case 0x20: {
+ n++;
+ break;
+ }
+ case '/': {
+ if( z[n+1]=='*' && z[n+2]!=0 ){
+ int j;
+ for(j=n+3; z[j]!='/' || z[j-1]!='*'; j++){
+ if( z[j]==0 ) goto whitespace_done;
+ }
+ n = j+1;
+ break;
+ }else if( z[n+1]=='/' ){
+ int j;
+ char c;
+ for(j=n+2; (c = z[j])!=0; j++){
+ if( c=='\n' || c=='\r' ) break;
+ if( 0xe2==(u8)c && 0x80==(u8)z[j+1]
+ && (0xa8==(u8)z[j+2] || 0xa9==(u8)z[j+2])
+ ){
+ j += 2;
+ break;
+ }
+ }
+ n = j;
+ if( z[n] ) n++;
+ break;
+ }
+ goto whitespace_done;
+ }
+ case 0xc2: {
+ if( z[n+1]==0xa0 ){
+ n += 2;
+ break;
+ }
+ goto whitespace_done;
+ }
+ case 0xe1: {
+ if( z[n+1]==0x9a && z[n+2]==0x80 ){
+ n += 3;
+ break;
+ }
+ goto whitespace_done;
+ }
+ case 0xe2: {
+ if( z[n+1]==0x80 ){
+ u8 c = z[n+2];
+ if( c<0x80 ) goto whitespace_done;
+ if( c<=0x8a || c==0xa8 || c==0xa9 || c==0xaf ){
+ n += 3;
+ break;
+ }
+ }else if( z[n+1]==0x81 && z[n+2]==0x9f ){
+ n += 3;
+ break;
+ }
+ goto whitespace_done;
+ }
+ case 0xe3: {
+ if( z[n+1]==0x80 && z[n+2]==0x80 ){
+ n += 3;
+ break;
+ }
+ goto whitespace_done;
+ }
+ case 0xef: {
+ if( z[n+1]==0xbb && z[n+2]==0xbf ){
+ n += 3;
+ break;
+ }
+ goto whitespace_done;
+ }
+ default: {
+ goto whitespace_done;
+ }
+ }
+ }
+ whitespace_done:
+ return n;
}
/*
+** Extra floating-point literals to allow in JSON.
+*/
+static const struct NanInfName {
+ char c1;
+ char c2;
+ char n;
+ char eType;
+ char nRepl;
+ char *zMatch;
+ char *zRepl;
+} aNanInfName[] = {
+ { 'i', 'I', 3, JSON_REAL, 7, "inf", "9.0e999" },
+ { 'i', 'I', 8, JSON_REAL, 7, "infinity", "9.0e999" },
+ { 'n', 'N', 3, JSON_NULL, 4, "NaN", "null" },
+ { 'q', 'Q', 4, JSON_NULL, 4, "QNaN", "null" },
+ { 's', 'S', 4, JSON_NULL, 4, "SNaN", "null" },
+};
+
+/*
** Parse a single JSON value which begins at pParse->zJson[i]. Return the
** index of the first character past the end of the value parsed.
**
-** Return negative for a syntax error. Special cases: return -2 if the
-** first non-whitespace character is '}' and return -3 if the first
-** non-whitespace character is ']'.
+** Special return values:
+**
+** 0 End if input
+** -1 Syntax error
+** -2 '}' seen
+** -3 ']' seen
+** -4 ',' seen
+** -5 ':' seen
*/
static int jsonParseValue(JsonParse *pParse, u32 i){
char c;
@@ -190428,150 +200796,430 @@ static int jsonParseValue(JsonParse *pParse, u32 i){
int x;
JsonNode *pNode;
const char *z = pParse->zJson;
- while( safe_isspace(z[i]) ){ i++; }
- if( (c = z[i])=='{' ){
+json_parse_restart:
+ switch( (u8)z[i] ){
+ case '{': {
/* Parse object */
iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
if( iThis<0 ) return -1;
+ if( ++pParse->iDepth > JSON_MAX_DEPTH ){
+ pParse->iErr = i;
+ return -1;
+ }
for(j=i+1;;j++){
- while( safe_isspace(z[j]) ){ j++; }
- if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
+ u32 nNode = pParse->nNode;
x = jsonParseValue(pParse, j);
- if( x<0 ){
- pParse->iDepth--;
- if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1;
- return -1;
+ if( x<=0 ){
+ if( x==(-2) ){
+ j = pParse->iErr;
+ if( pParse->nNode!=(u32)iThis+1 ) pParse->hasNonstd = 1;
+ break;
+ }
+ j += json5Whitespace(&z[j]);
+ if( sqlite3JsonId1(z[j])
+ || (z[j]=='\\' && z[j+1]=='u' && jsonIs4Hex(&z[j+2]))
+ ){
+ int k = j+1;
+ while( (sqlite3JsonId2(z[k]) && json5Whitespace(&z[k])==0)
+ || (z[k]=='\\' && z[k+1]=='u' && jsonIs4Hex(&z[k+2]))
+ ){
+ k++;
+ }
+ jsonParseAddNode(pParse, JSON_STRING | (JNODE_RAW<<8), k-j, &z[j]);
+ pParse->hasNonstd = 1;
+ x = k;
+ }else{
+ if( x!=-1 ) pParse->iErr = j;
+ return -1;
+ }
}
if( pParse->oom ) return -1;
- pNode = &pParse->aNode[pParse->nNode-1];
- if( pNode->eType!=JSON_STRING ) return -1;
+ pNode = &pParse->aNode[nNode];
+ if( pNode->eType!=JSON_STRING ){
+ pParse->iErr = j;
+ return -1;
+ }
pNode->jnFlags |= JNODE_LABEL;
j = x;
- while( safe_isspace(z[j]) ){ j++; }
- if( z[j]!=':' ) return -1;
- j++;
+ if( z[j]==':' ){
+ j++;
+ }else{
+ if( fast_isspace(z[j]) ){
+ do{ j++; }while( fast_isspace(z[j]) );
+ if( z[j]==':' ){
+ j++;
+ goto parse_object_value;
+ }
+ }
+ x = jsonParseValue(pParse, j);
+ if( x!=(-5) ){
+ if( x!=(-1) ) pParse->iErr = j;
+ return -1;
+ }
+ j = pParse->iErr+1;
+ }
+ parse_object_value:
x = jsonParseValue(pParse, j);
- pParse->iDepth--;
- if( x<0 ) return -1;
+ if( x<=0 ){
+ if( x!=(-1) ) pParse->iErr = j;
+ return -1;
+ }
j = x;
- while( safe_isspace(z[j]) ){ j++; }
- c = z[j];
- if( c==',' ) continue;
- if( c!='}' ) return -1;
- break;
+ if( z[j]==',' ){
+ continue;
+ }else if( z[j]=='}' ){
+ break;
+ }else{
+ if( fast_isspace(z[j]) ){
+ do{ j++; }while( fast_isspace(z[j]) );
+ if( z[j]==',' ){
+ continue;
+ }else if( z[j]=='}' ){
+ break;
+ }
+ }
+ x = jsonParseValue(pParse, j);
+ if( x==(-4) ){
+ j = pParse->iErr;
+ continue;
+ }
+ if( x==(-2) ){
+ j = pParse->iErr;
+ break;
+ }
+ }
+ pParse->iErr = j;
+ return -1;
}
pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
+ pParse->iDepth--;
return j+1;
- }else if( c=='[' ){
+ }
+ case '[': {
/* Parse array */
iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
if( iThis<0 ) return -1;
+ if( ++pParse->iDepth > JSON_MAX_DEPTH ){
+ pParse->iErr = i;
+ return -1;
+ }
+ memset(&pParse->aNode[iThis].u, 0, sizeof(pParse->aNode[iThis].u));
for(j=i+1;;j++){
- while( safe_isspace(z[j]) ){ j++; }
- if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
x = jsonParseValue(pParse, j);
- pParse->iDepth--;
- if( x<0 ){
- if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1;
+ if( x<=0 ){
+ if( x==(-3) ){
+ j = pParse->iErr;
+ if( pParse->nNode!=(u32)iThis+1 ) pParse->hasNonstd = 1;
+ break;
+ }
+ if( x!=(-1) ) pParse->iErr = j;
return -1;
}
j = x;
- while( safe_isspace(z[j]) ){ j++; }
- c = z[j];
- if( c==',' ) continue;
- if( c!=']' ) return -1;
- break;
+ if( z[j]==',' ){
+ continue;
+ }else if( z[j]==']' ){
+ break;
+ }else{
+ if( fast_isspace(z[j]) ){
+ do{ j++; }while( fast_isspace(z[j]) );
+ if( z[j]==',' ){
+ continue;
+ }else if( z[j]==']' ){
+ break;
+ }
+ }
+ x = jsonParseValue(pParse, j);
+ if( x==(-4) ){
+ j = pParse->iErr;
+ continue;
+ }
+ if( x==(-3) ){
+ j = pParse->iErr;
+ break;
+ }
+ }
+ pParse->iErr = j;
+ return -1;
}
pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
+ pParse->iDepth--;
return j+1;
- }else if( c=='"' ){
+ }
+ case '\'': {
+ u8 jnFlags;
+ char cDelim;
+ pParse->hasNonstd = 1;
+ jnFlags = JNODE_JSON5;
+ goto parse_string;
+ case '"':
/* Parse string */
- u8 jnFlags = 0;
+ jnFlags = 0;
+ parse_string:
+ cDelim = z[i];
j = i+1;
for(;;){
c = z[j];
if( (c & ~0x1f)==0 ){
/* Control characters are not allowed in strings */
+ pParse->iErr = j;
return -1;
}
if( c=='\\' ){
c = z[++j];
if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f'
|| c=='n' || c=='r' || c=='t'
- || (c=='u' && jsonIs4Hex(z+j+1)) ){
- jnFlags = JNODE_ESCAPE;
+ || (c=='u' && jsonIs4Hex(&z[j+1])) ){
+ jnFlags |= JNODE_ESCAPE;
+ }else if( c=='\'' || c=='0' || c=='v' || c=='\n'
+ || (0xe2==(u8)c && 0x80==(u8)z[j+1]
+ && (0xa8==(u8)z[j+2] || 0xa9==(u8)z[j+2]))
+ || (c=='x' && jsonIs2Hex(&z[j+1])) ){
+ jnFlags |= (JNODE_ESCAPE|JNODE_JSON5);
+ pParse->hasNonstd = 1;
+ }else if( c=='\r' ){
+ if( z[j+1]=='\n' ) j++;
+ jnFlags |= (JNODE_ESCAPE|JNODE_JSON5);
+ pParse->hasNonstd = 1;
}else{
+ pParse->iErr = j;
return -1;
}
- }else if( c=='"' ){
+ }else if( c==cDelim ){
break;
}
j++;
}
- jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]);
- if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags;
+ jsonParseAddNode(pParse, JSON_STRING | (jnFlags<<8), j+1-i, &z[i]);
return j+1;
- }else if( c=='n'
- && strncmp(z+i,"null",4)==0
- && !safe_isalnum(z[i+4]) ){
- jsonParseAddNode(pParse, JSON_NULL, 0, 0);
- return i+4;
- }else if( c=='t'
- && strncmp(z+i,"true",4)==0
- && !safe_isalnum(z[i+4]) ){
- jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
- return i+4;
- }else if( c=='f'
- && strncmp(z+i,"false",5)==0
- && !safe_isalnum(z[i+5]) ){
- jsonParseAddNode(pParse, JSON_FALSE, 0, 0);
- return i+5;
- }else if( c=='-' || (c>='0' && c<='9') ){
+ }
+ case 't': {
+ if( strncmp(z+i,"true",4)==0 && !sqlite3Isalnum(z[i+4]) ){
+ jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
+ return i+4;
+ }
+ pParse->iErr = i;
+ return -1;
+ }
+ case 'f': {
+ if( strncmp(z+i,"false",5)==0 && !sqlite3Isalnum(z[i+5]) ){
+ jsonParseAddNode(pParse, JSON_FALSE, 0, 0);
+ return i+5;
+ }
+ pParse->iErr = i;
+ return -1;
+ }
+ case '+': {
+ u8 seenDP, seenE, jnFlags;
+ pParse->hasNonstd = 1;
+ jnFlags = JNODE_JSON5;
+ goto parse_number;
+ case '.':
+ if( sqlite3Isdigit(z[i+1]) ){
+ pParse->hasNonstd = 1;
+ jnFlags = JNODE_JSON5;
+ seenE = 0;
+ seenDP = JSON_REAL;
+ goto parse_number_2;
+ }
+ pParse->iErr = i;
+ return -1;
+ case '-':
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
/* Parse number */
- u8 seenDP = 0;
- u8 seenE = 0;
+ jnFlags = 0;
+ parse_number:
+ seenDP = JSON_INT;
+ seenE = 0;
assert( '-' < '0' );
+ assert( '+' < '0' );
+ assert( '.' < '0' );
+ c = z[i];
+
if( c<='0' ){
- j = c=='-' ? i+1 : i;
- if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1;
+ if( c=='0' ){
+ if( (z[i+1]=='x' || z[i+1]=='X') && sqlite3Isxdigit(z[i+2]) ){
+ assert( seenDP==JSON_INT );
+ pParse->hasNonstd = 1;
+ jnFlags |= JNODE_JSON5;
+ for(j=i+3; sqlite3Isxdigit(z[j]); j++){}
+ goto parse_number_finish;
+ }else if( sqlite3Isdigit(z[i+1]) ){
+ pParse->iErr = i+1;
+ return -1;
+ }
+ }else{
+ if( !sqlite3Isdigit(z[i+1]) ){
+ /* JSON5 allows for "+Infinity" and "-Infinity" using exactly
+ ** that case. SQLite also allows these in any case and it allows
+ ** "+inf" and "-inf". */
+ if( (z[i+1]=='I' || z[i+1]=='i')
+ && sqlite3StrNICmp(&z[i+1], "inf",3)==0
+ ){
+ pParse->hasNonstd = 1;
+ if( z[i]=='-' ){
+ jsonParseAddNode(pParse, JSON_REAL, 8, "-9.0e999");
+ }else{
+ jsonParseAddNode(pParse, JSON_REAL, 7, "9.0e999");
+ }
+ return i + (sqlite3StrNICmp(&z[i+4],"inity",5)==0 ? 9 : 4);
+ }
+ if( z[i+1]=='.' ){
+ pParse->hasNonstd = 1;
+ jnFlags |= JNODE_JSON5;
+ goto parse_number_2;
+ }
+ pParse->iErr = i;
+ return -1;
+ }
+ if( z[i+1]=='0' ){
+ if( sqlite3Isdigit(z[i+2]) ){
+ pParse->iErr = i+1;
+ return -1;
+ }else if( (z[i+2]=='x' || z[i+2]=='X') && sqlite3Isxdigit(z[i+3]) ){
+ pParse->hasNonstd = 1;
+ jnFlags |= JNODE_JSON5;
+ for(j=i+4; sqlite3Isxdigit(z[j]); j++){}
+ goto parse_number_finish;
+ }
+ }
+ }
}
- j = i+1;
- for(;; j++){
+ parse_number_2:
+ for(j=i+1;; j++){
c = z[j];
- if( c>='0' && c<='9' ) continue;
+ if( sqlite3Isdigit(c) ) continue;
if( c=='.' ){
- if( z[j-1]=='-' ) return -1;
- if( seenDP ) return -1;
- seenDP = 1;
+ if( seenDP==JSON_REAL ){
+ pParse->iErr = j;
+ return -1;
+ }
+ seenDP = JSON_REAL;
continue;
}
if( c=='e' || c=='E' ){
- if( z[j-1]<'0' ) return -1;
- if( seenE ) return -1;
- seenDP = seenE = 1;
+ if( z[j-1]<'0' ){
+ if( ALWAYS(z[j-1]=='.') && ALWAYS(j-2>=i) && sqlite3Isdigit(z[j-2]) ){
+ pParse->hasNonstd = 1;
+ jnFlags |= JNODE_JSON5;
+ }else{
+ pParse->iErr = j;
+ return -1;
+ }
+ }
+ if( seenE ){
+ pParse->iErr = j;
+ return -1;
+ }
+ seenDP = JSON_REAL;
+ seenE = 1;
c = z[j+1];
if( c=='+' || c=='-' ){
j++;
c = z[j+1];
}
- if( c<'0' || c>'9' ) return -1;
+ if( c<'0' || c>'9' ){
+ pParse->iErr = j;
+ return -1;
+ }
continue;
}
break;
}
- if( z[j-1]<'0' ) return -1;
- jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT,
- j - i, &z[i]);
+ if( z[j-1]<'0' ){
+ if( ALWAYS(z[j-1]=='.') && ALWAYS(j-2>=i) && sqlite3Isdigit(z[j-2]) ){
+ pParse->hasNonstd = 1;
+ jnFlags |= JNODE_JSON5;
+ }else{
+ pParse->iErr = j;
+ return -1;
+ }
+ }
+ parse_number_finish:
+ jsonParseAddNode(pParse, seenDP | (jnFlags<<8), j - i, &z[i]);
return j;
- }else if( c=='}' ){
+ }
+ case '}': {
+ pParse->iErr = i;
return -2; /* End of {...} */
- }else if( c==']' ){
+ }
+ case ']': {
+ pParse->iErr = i;
return -3; /* End of [...] */
- }else if( c==0 ){
+ }
+ case ',': {
+ pParse->iErr = i;
+ return -4; /* List separator */
+ }
+ case ':': {
+ pParse->iErr = i;
+ return -5; /* Object label/value separator */
+ }
+ case 0: {
return 0; /* End of file */
- }else{
+ }
+ case 0x09:
+ case 0x0a:
+ case 0x0d:
+ case 0x20: {
+ do{
+ i++;
+ }while( fast_isspace(z[i]) );
+ goto json_parse_restart;
+ }
+ case 0x0b:
+ case 0x0c:
+ case '/':
+ case 0xc2:
+ case 0xe1:
+ case 0xe2:
+ case 0xe3:
+ case 0xef: {
+ j = json5Whitespace(&z[i]);
+ if( j>0 ){
+ i += j;
+ pParse->hasNonstd = 1;
+ goto json_parse_restart;
+ }
+ pParse->iErr = i;
+ return -1;
+ }
+ case 'n': {
+ if( strncmp(z+i,"null",4)==0 && !sqlite3Isalnum(z[i+4]) ){
+ jsonParseAddNode(pParse, JSON_NULL, 0, 0);
+ return i+4;
+ }
+ /* fall-through into the default case that checks for NaN */
+ }
+ default: {
+ u32 k;
+ int nn;
+ c = z[i];
+ for(k=0; k<sizeof(aNanInfName)/sizeof(aNanInfName[0]); k++){
+ if( c!=aNanInfName[k].c1 && c!=aNanInfName[k].c2 ) continue;
+ nn = aNanInfName[k].n;
+ if( sqlite3StrNICmp(&z[i], aNanInfName[k].zMatch, nn)!=0 ){
+ continue;
+ }
+ if( sqlite3Isalnum(z[i+nn]) ) continue;
+ jsonParseAddNode(pParse, aNanInfName[k].eType,
+ aNanInfName[k].nRepl, aNanInfName[k].zRepl);
+ pParse->hasNonstd = 1;
+ return i + nn;
+ }
+ pParse->iErr = i;
return -1; /* Syntax error */
}
+ } /* End switch(z[i]) */
}
/*
@@ -190594,8 +201242,15 @@ static int jsonParse(
if( pParse->oom ) i = -1;
if( i>0 ){
assert( pParse->iDepth==0 );
- while( safe_isspace(zJson[i]) ) i++;
- if( zJson[i] ) i = -1;
+ while( fast_isspace(zJson[i]) ) i++;
+ if( zJson[i] ){
+ i += json5Whitespace(&zJson[i]);
+ if( zJson[i] ){
+ jsonParseReset(pParse);
+ return 1;
+ }
+ pParse->hasNonstd = 1;
+ }
}
if( i<=0 ){
if( pCtx!=0 ){
@@ -190666,6 +201321,15 @@ static int jsonParseFindParents(JsonParse *pParse){
** is no longer valid, parse the JSON again and return the new parse,
** and also register the new parse so that it will be available for
** future sqlite3_get_auxdata() calls.
+**
+** If an error occurs and pErrCtx!=0 then report the error on pErrCtx
+** and return NULL.
+**
+** If an error occurs and pErrCtx==0 then return the Parse object with
+** JsonParse.nErr non-zero. If the caller invokes this routine with
+** pErrCtx==0 and it gets back a JsonParse with nErr!=0, then the caller
+** is responsible for invoking jsonParseFree() on the returned value.
+** But the caller may invoke jsonParseFree() *only* if pParse->nErr!=0.
*/
static JsonParse *jsonParseCached(
sqlite3_context *pCtx,
@@ -190715,6 +201379,10 @@ static JsonParse *jsonParseCached(
p->zJson = (char*)&p[1];
memcpy((char*)p->zJson, zJson, nJson+1);
if( jsonParse(p, pErrCtx, p->zJson) ){
+ if( pErrCtx==0 ){
+ p->nErr = 1;
+ return p;
+ }
sqlite3_free(p);
return 0;
}
@@ -190729,7 +201397,8 @@ static JsonParse *jsonParseCached(
** Compare the OBJECT label at pNode against zKey,nKey. Return true on
** a match.
*/
-static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){
+static int jsonLabelCompare(const JsonNode *pNode, const char *zKey, u32 nKey){
+ assert( pNode->eU==1 );
if( pNode->jnFlags & JNODE_RAW ){
if( pNode->n!=nKey ) return 0;
return strncmp(pNode->u.zJContent, zKey, nKey)==0;
@@ -190738,6 +201407,15 @@ static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){
return strncmp(pNode->u.zJContent+1, zKey, nKey)==0;
}
}
+static int jsonSameLabel(const JsonNode *p1, const JsonNode *p2){
+ if( p1->jnFlags & JNODE_RAW ){
+ return jsonLabelCompare(p2, p1->u.zJContent, p1->n);
+ }else if( p2->jnFlags & JNODE_RAW ){
+ return jsonLabelCompare(p1, p2->u.zJContent, p2->n);
+ }else{
+ return p1->n==p2->n && strncmp(p1->u.zJContent,p2->u.zJContent,p1->n)==0;
+ }
+}
/* forward declaration */
static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**);
@@ -190776,14 +201454,15 @@ static JsonNode *jsonLookupStep(
*pzErr = zPath;
return 0;
}
+ testcase( nKey==0 );
}else{
zKey = zPath;
for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
nKey = i;
- }
- if( nKey==0 ){
- *pzErr = zPath;
- return 0;
+ if( nKey==0 ){
+ *pzErr = zPath;
+ return 0;
+ }
}
j = 1;
for(;;){
@@ -190795,6 +201474,7 @@ static JsonNode *jsonLookupStep(
j += jsonNodeSize(&pRoot[j]);
}
if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
+ assert( pRoot->eU==2 );
iRoot += pRoot->u.iAppend;
pRoot = &pParse->aNode[iRoot];
j = 1;
@@ -190809,8 +201489,10 @@ static JsonNode *jsonLookupStep(
if( pParse->oom ) return 0;
if( pNode ){
pRoot = &pParse->aNode[iRoot];
+ assert( pRoot->eU==0 );
pRoot->u.iAppend = iStart - iRoot;
pRoot->jnFlags |= JNODE_APPEND;
+ VVA( pRoot->eU = 2 );
pParse->aNode[iLabel].jnFlags |= JNODE_RAW;
}
return pNode;
@@ -190818,7 +201500,7 @@ static JsonNode *jsonLookupStep(
}else if( zPath[0]=='[' ){
i = 0;
j = 1;
- while( safe_isdigit(zPath[j]) ){
+ while( sqlite3Isdigit(zPath[j]) ){
i = i*10 + zPath[j] - '0';
j++;
}
@@ -190833,18 +201515,19 @@ static JsonNode *jsonLookupStep(
j += jsonNodeSize(&pBase[j]);
}
if( (pBase->jnFlags & JNODE_APPEND)==0 ) break;
+ assert( pBase->eU==2 );
iBase += pBase->u.iAppend;
pBase = &pParse->aNode[iBase];
j = 1;
}
j = 2;
- if( zPath[2]=='-' && safe_isdigit(zPath[3]) ){
+ if( zPath[2]=='-' && sqlite3Isdigit(zPath[3]) ){
unsigned int x = 0;
j = 3;
do{
x = x*10 + zPath[j] - '0';
j++;
- }while( safe_isdigit(zPath[j]) );
+ }while( sqlite3Isdigit(zPath[j]) );
if( x>i ) return 0;
i -= x;
}
@@ -190866,6 +201549,7 @@ static JsonNode *jsonLookupStep(
j += jsonNodeSize(&pRoot[j]);
}
if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
+ assert( pRoot->eU==2 );
iRoot += pRoot->u.iAppend;
pRoot = &pParse->aNode[iRoot];
j = 1;
@@ -190881,8 +201565,10 @@ static JsonNode *jsonLookupStep(
if( pParse->oom ) return 0;
if( pNode ){
pRoot = &pParse->aNode[iRoot];
+ assert( pRoot->eU==0 );
pRoot->u.iAppend = iStart - iRoot;
pRoot->jnFlags |= JNODE_APPEND;
+ VVA( pRoot->eU = 2 );
}
return pNode;
}
@@ -191036,9 +201722,13 @@ static void jsonParseFunc(
}
jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d",
i, zType, x.aNode[i].n, x.aUp[i]);
+ assert( x.aNode[i].eU==0 || x.aNode[i].eU==1 );
if( x.aNode[i].u.zJContent!=0 ){
+ assert( x.aNode[i].eU==1 );
jsonAppendRaw(&s, " ", 1);
jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n);
+ }else{
+ assert( x.aNode[i].eU==0 );
}
jsonAppendRaw(&s, "\n", 1);
}
@@ -191056,7 +201746,7 @@ static void jsonTest1Func(
int argc,
sqlite3_value **argv
){
- UNUSED_PARAM(argc);
+ UNUSED_PARAMETER(argc);
sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE);
}
#endif /* SQLITE_DEBUG */
@@ -191077,7 +201767,7 @@ static void jsonQuoteFunc(
sqlite3_value **argv
){
JsonString jx;
- UNUSED_PARAM(argc);
+ UNUSED_PARAMETER(argc);
jsonInit(&jx, ctx);
jsonAppendValue(&jx, argv[0]);
@@ -191149,12 +201839,33 @@ static void jsonArrayLengthFunc(
}
/*
+** Bit values for the flags passed into jsonExtractFunc() or
+** jsonSetFunc() via the user-data value.
+*/
+#define JSON_JSON 0x01 /* Result is always JSON */
+#define JSON_SQL 0x02 /* Result is always SQL */
+#define JSON_ABPATH 0x03 /* Allow abbreviated JSON path specs */
+#define JSON_ISSET 0x04 /* json_set(), not json_insert() */
+
+/*
** json_extract(JSON, PATH, ...)
+** "->"(JSON,PATH)
+** "->>"(JSON,PATH)
+**
+** Return the element described by PATH. Return NULL if that PATH element
+** is not found.
+**
+** If JSON_JSON is set or if more that one PATH argument is supplied then
+** always return a JSON representation of the result. If JSON_SQL is set,
+** then always return an SQL representation of the result. If neither flag
+** is present and argc==2, then return JSON for objects and arrays and SQL
+** for all other values.
**
-** Return the element described by PATH. Return NULL if there is no
-** PATH element. If there are multiple PATHs, then return a JSON array
-** with the result from each path. Throw an error if the JSON or any PATH
-** is malformed.
+** When multiple PATH arguments are supplied, the result is a JSON array
+** containing the result of each PATH.
+**
+** Abbreviated JSON path expressions are allows if JSON_ABPATH, for
+** compatibility with PG.
*/
static void jsonExtractFunc(
sqlite3_context *ctx,
@@ -191164,35 +201875,77 @@ static void jsonExtractFunc(
JsonParse *p; /* The parse */
JsonNode *pNode;
const char *zPath;
+ int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx));
JsonString jx;
- int i;
if( argc<2 ) return;
p = jsonParseCached(ctx, argv, ctx);
if( p==0 ) return;
- jsonInit(&jx, ctx);
- jsonAppendChar(&jx, '[');
- for(i=1; i<argc; i++){
- zPath = (const char*)sqlite3_value_text(argv[i]);
- pNode = jsonLookup(p, zPath, 0, ctx);
- if( p->nErr ) break;
- if( argc>2 ){
+ if( argc==2 ){
+ /* With a single PATH argument */
+ zPath = (const char*)sqlite3_value_text(argv[1]);
+ if( zPath==0 ) return;
+ if( flags & JSON_ABPATH ){
+ if( zPath[0]!='$' || (zPath[1]!='.' && zPath[1]!='[' && zPath[1]!=0) ){
+ /* The -> and ->> operators accept abbreviated PATH arguments. This
+ ** is mostly for compatibility with PostgreSQL, but also for
+ ** convenience.
+ **
+ ** NUMBER ==> $[NUMBER] // PG compatible
+ ** LABEL ==> $.LABEL // PG compatible
+ ** [NUMBER] ==> $[NUMBER] // Not PG. Purely for convenience
+ */
+ jsonInit(&jx, ctx);
+ if( sqlite3Isdigit(zPath[0]) ){
+ jsonAppendRaw(&jx, "$[", 2);
+ jsonAppendRaw(&jx, zPath, (int)strlen(zPath));
+ jsonAppendRaw(&jx, "]", 2);
+ }else{
+ jsonAppendRaw(&jx, "$.", 1 + (zPath[0]!='['));
+ jsonAppendRaw(&jx, zPath, (int)strlen(zPath));
+ jsonAppendChar(&jx, 0);
+ }
+ pNode = jx.bErr ? 0 : jsonLookup(p, jx.zBuf, 0, ctx);
+ jsonReset(&jx);
+ }else{
+ pNode = jsonLookup(p, zPath, 0, ctx);
+ }
+ if( pNode ){
+ if( flags & JSON_JSON ){
+ jsonReturnJson(pNode, ctx, 0);
+ }else{
+ jsonReturn(pNode, ctx, 0);
+ sqlite3_result_subtype(ctx, 0);
+ }
+ }
+ }else{
+ pNode = jsonLookup(p, zPath, 0, ctx);
+ if( p->nErr==0 && pNode ) jsonReturn(pNode, ctx, 0);
+ }
+ }else{
+ /* Two or more PATH arguments results in a JSON array with each
+ ** element of the array being the value selected by one of the PATHs */
+ int i;
+ jsonInit(&jx, ctx);
+ jsonAppendChar(&jx, '[');
+ for(i=1; i<argc; i++){
+ zPath = (const char*)sqlite3_value_text(argv[i]);
+ pNode = jsonLookup(p, zPath, 0, ctx);
+ if( p->nErr ) break;
jsonAppendSeparator(&jx);
if( pNode ){
jsonRenderNode(pNode, &jx, 0);
}else{
jsonAppendRaw(&jx, "null", 4);
}
- }else if( pNode ){
- jsonReturn(pNode, ctx, 0);
}
+ if( i==argc ){
+ jsonAppendChar(&jx, ']');
+ jsonResult(&jx);
+ sqlite3_result_subtype(ctx, JSON_SUBTYPE);
+ }
+ jsonReset(&jx);
}
- if( argc>2 && i==argc ){
- jsonAppendChar(&jx, ']');
- jsonResult(&jx);
- sqlite3_result_subtype(ctx, JSON_SUBTYPE);
- }
- jsonReset(&jx);
}
/* This is the RFC 7396 MergePatch algorithm.
@@ -191208,7 +201961,7 @@ static JsonNode *jsonMergePatch(
if( pPatch->eType!=JSON_OBJECT ){
return pPatch;
}
- assert( iTarget>=0 && iTarget<pParse->nNode );
+ assert( iTarget<pParse->nNode );
pTarget = &pParse->aNode[iTarget];
assert( (pPatch->jnFlags & JNODE_APPEND)==0 );
if( pTarget->eType!=JSON_OBJECT ){
@@ -191221,14 +201974,13 @@ static JsonNode *jsonMergePatch(
const char *zKey;
assert( pPatch[i].eType==JSON_STRING );
assert( pPatch[i].jnFlags & JNODE_LABEL );
+ assert( pPatch[i].eU==1 );
nKey = pPatch[i].n;
zKey = pPatch[i].u.zJContent;
- assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
for(j=1; j<pTarget->n; j += jsonNodeSize(&pTarget[j+1])+1 ){
assert( pTarget[j].eType==JSON_STRING );
assert( pTarget[j].jnFlags & JNODE_LABEL );
- assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
- if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){
+ if( jsonSameLabel(&pPatch[i], &pTarget[j]) ){
if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break;
if( pPatch[i+1].eType==JSON_NULL ){
pTarget[j+1].jnFlags |= JNODE_REMOVE;
@@ -191237,6 +201989,12 @@ static JsonNode *jsonMergePatch(
if( pNew==0 ) return 0;
pTarget = &pParse->aNode[iTarget];
if( pNew!=&pTarget[j+1] ){
+ assert( pTarget[j+1].eU==0
+ || pTarget[j+1].eU==1
+ || pTarget[j+1].eU==2 );
+ testcase( pTarget[j+1].eU==1 );
+ testcase( pTarget[j+1].eU==2 );
+ VVA( pTarget[j+1].eU = 5 );
pTarget[j+1].u.pPatch = pNew;
pTarget[j+1].jnFlags |= JNODE_PATCH;
}
@@ -191252,9 +202010,14 @@ static JsonNode *jsonMergePatch(
if( pParse->oom ) return 0;
jsonRemoveAllNulls(pPatch);
pTarget = &pParse->aNode[iTarget];
+ assert( pParse->aNode[iRoot].eU==0 || pParse->aNode[iRoot].eU==2 );
+ testcase( pParse->aNode[iRoot].eU==2 );
pParse->aNode[iRoot].jnFlags |= JNODE_APPEND;
+ VVA( pParse->aNode[iRoot].eU = 2 );
pParse->aNode[iRoot].u.iAppend = iStart - iRoot;
iRoot = iStart;
+ assert( pParse->aNode[iPatch].eU==0 );
+ VVA( pParse->aNode[iPatch].eU = 5 );
pParse->aNode[iPatch].jnFlags |= JNODE_PATCH;
pParse->aNode[iPatch].u.pPatch = &pPatch[i+1];
}
@@ -191276,7 +202039,7 @@ static void jsonPatchFunc(
JsonParse y; /* The patch */
JsonNode *pResult; /* The result of the merge */
- UNUSED_PARAM(argc);
+ UNUSED_PARAMETER(argc);
if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){
jsonParseReset(&x);
@@ -191396,11 +202159,15 @@ static void jsonReplaceFunc(
pNode = jsonLookup(&x, zPath, 0, ctx);
if( x.nErr ) goto replace_err;
if( pNode ){
+ assert( pNode->eU==0 || pNode->eU==1 || pNode->eU==4 );
+ testcase( pNode->eU!=0 && pNode->eU!=1 );
pNode->jnFlags |= (u8)JNODE_REPLACE;
+ VVA( pNode->eU = 4 );
pNode->u.iReplace = i + 1;
}
}
if( x.aNode[0].jnFlags & JNODE_REPLACE ){
+ assert( x.aNode[0].eU==4 );
sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
}else{
jsonReturnJson(x.aNode, ctx, argv);
@@ -191409,6 +202176,7 @@ replace_err:
jsonParseReset(&x);
}
+
/*
** json_set(JSON, PATH, VALUE, ...)
**
@@ -191431,7 +202199,7 @@ static void jsonSetFunc(
const char *zPath;
u32 i;
int bApnd;
- int bIsSet = *(int*)sqlite3_user_data(ctx);
+ int bIsSet = sqlite3_user_data(ctx)!=0;
if( argc<1 ) return;
if( (argc&1)==0 ) {
@@ -191450,11 +202218,15 @@ static void jsonSetFunc(
}else if( x.nErr ){
goto jsonSetDone;
}else if( pNode && (bApnd || bIsSet) ){
+ testcase( pNode->eU!=0 && pNode->eU!=1 );
+ assert( pNode->eU!=3 && pNode->eU!=5 );
+ VVA( pNode->eU = 4 );
pNode->jnFlags |= (u8)JNODE_REPLACE;
pNode->u.iReplace = i + 1;
}
}
if( x.aNode[0].jnFlags & JNODE_REPLACE ){
+ assert( x.aNode[0].eU==4 );
sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
}else{
jsonReturnJson(x.aNode, ctx, argv);
@@ -191467,8 +202239,8 @@ jsonSetDone:
** json_type(JSON)
** json_type(JSON, PATH)
**
-** Return the top-level "type" of a JSON string. Throw an error if
-** either the JSON or PATH inputs are not well-formed.
+** Return the top-level "type" of a JSON string. json_type() raises an
+** error if either the JSON or PATH inputs are not well-formed.
*/
static void jsonTypeFunc(
sqlite3_context *ctx,
@@ -191495,8 +202267,8 @@ static void jsonTypeFunc(
/*
** json_valid(JSON)
**
-** Return 1 if JSON is a well-formed JSON string according to RFC-7159.
-** Return 0 otherwise.
+** Return 1 if JSON is a well-formed canonical JSON string according
+** to RFC-7159. Return 0 otherwise.
*/
static void jsonValidFunc(
sqlite3_context *ctx,
@@ -191504,9 +202276,70 @@ static void jsonValidFunc(
sqlite3_value **argv
){
JsonParse *p; /* The parse */
- UNUSED_PARAM(argc);
+ UNUSED_PARAMETER(argc);
+ if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
p = jsonParseCached(ctx, argv, 0);
- sqlite3_result_int(ctx, p!=0);
+ if( p==0 || p->oom ){
+ sqlite3_result_error_nomem(ctx);
+ sqlite3_free(p);
+ }else{
+ sqlite3_result_int(ctx, p->nErr==0 && p->hasNonstd==0);
+ if( p->nErr ) jsonParseFree(p);
+ }
+}
+
+/*
+** json_error_position(JSON)
+**
+** If the argument is not an interpretable JSON string, then return the 1-based
+** character position at which the parser first recognized that the input
+** was in error. The left-most character is 1. If the string is valid
+** JSON, then return 0.
+**
+** Note that json_valid() is only true for strictly conforming canonical JSON.
+** But this routine returns zero if the input contains extension. Thus:
+**
+** (1) If the input X is strictly conforming canonical JSON:
+**
+** json_valid(X) returns true
+** json_error_position(X) returns 0
+**
+** (2) If the input X is JSON but it includes extension (such as JSON5) that
+** are not part of RFC-8259:
+**
+** json_valid(X) returns false
+** json_error_position(X) return 0
+**
+** (3) If the input X cannot be interpreted as JSON even taking extensions
+** into account:
+**
+** json_valid(X) return false
+** json_error_position(X) returns 1 or more
+*/
+static void jsonErrorFunc(
+ sqlite3_context *ctx,
+ int argc,
+ sqlite3_value **argv
+){
+ JsonParse *p; /* The parse */
+ UNUSED_PARAMETER(argc);
+ if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
+ p = jsonParseCached(ctx, argv, 0);
+ if( p==0 || p->oom ){
+ sqlite3_result_error_nomem(ctx);
+ sqlite3_free(p);
+ }else if( p->nErr==0 ){
+ sqlite3_result_int(ctx, 0);
+ }else{
+ int n = 1;
+ u32 i;
+ const char *z = p->zJson;
+ for(i=0; i<p->iErr && ALWAYS(z[i]); i++){
+ if( (z[i]&0xc0)!=0x80 ) n++;
+ }
+ sqlite3_result_int(ctx, n);
+ jsonParseFree(p);
+ }
}
@@ -191524,7 +202357,7 @@ static void jsonArrayStep(
sqlite3_value **argv
){
JsonString *pStr;
- UNUSED_PARAM(argc);
+ UNUSED_PARAMETER(argc);
pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
if( pStr ){
if( pStr->zBuf==0 ){
@@ -191584,8 +202417,8 @@ static void jsonGroupInverse(
char *z;
char c;
JsonString *pStr;
- UNUSED_PARAM(argc);
- UNUSED_PARAM(argv);
+ UNUSED_PARAMETER(argc);
+ UNUSED_PARAMETER(argv);
pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
#ifdef NEVER
/* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will
@@ -191629,7 +202462,7 @@ static void jsonObjectStep(
JsonString *pStr;
const char *z;
u32 n;
- UNUSED_PARAM(argc);
+ UNUSED_PARAMETER(argc);
pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
if( pStr ){
if( pStr->zBuf==0 ){
@@ -191720,10 +202553,10 @@ static int jsonEachConnect(
#define JEACH_JSON 8
#define JEACH_ROOT 9
- UNUSED_PARAM(pzErr);
- UNUSED_PARAM(argv);
- UNUSED_PARAM(argc);
- UNUSED_PARAM(pAux);
+ UNUSED_PARAMETER(pzErr);
+ UNUSED_PARAMETER(argv);
+ UNUSED_PARAMETER(argc);
+ UNUSED_PARAMETER(pAux);
rc = sqlite3_declare_vtab(db,
"CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,"
"json HIDDEN,root HIDDEN)");
@@ -191746,7 +202579,7 @@ static int jsonEachDisconnect(sqlite3_vtab *pVtab){
static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
JsonEachCursor *pCur;
- UNUSED_PARAM(p);
+ UNUSED_PARAMETER(p);
pCur = sqlite3_malloc( sizeof(*pCur) );
if( pCur==0 ) return SQLITE_NOMEM;
memset(pCur, 0, sizeof(*pCur));
@@ -191805,6 +202638,9 @@ static int jsonEachNext(sqlite3_vtab_cursor *cur){
JsonNode *pUp = &p->sParse.aNode[iUp];
p->eType = pUp->eType;
if( pUp->eType==JSON_ARRAY ){
+ assert( pUp->eU==0 || pUp->eU==3 );
+ testcase( pUp->eU==3 );
+ VVA( pUp->eU = 3 );
if( iUp==p->i-1 ){
pUp->u.iKey = 0;
}else{
@@ -191833,6 +202669,35 @@ static int jsonEachNext(sqlite3_vtab_cursor *cur){
return SQLITE_OK;
}
+/* Append an object label to the JSON Path being constructed
+** in pStr.
+*/
+static void jsonAppendObjectPathElement(
+ JsonString *pStr,
+ JsonNode *pNode
+){
+ int jj, nn;
+ const char *z;
+ assert( pNode->eType==JSON_STRING );
+ assert( pNode->jnFlags & JNODE_LABEL );
+ assert( pNode->eU==1 );
+ z = pNode->u.zJContent;
+ nn = pNode->n;
+ if( (pNode->jnFlags & JNODE_RAW)==0 ){
+ assert( nn>=2 );
+ assert( z[0]=='"' || z[0]=='\'' );
+ assert( z[nn-1]=='"' || z[0]=='\'' );
+ if( nn>2 && sqlite3Isalpha(z[1]) ){
+ for(jj=2; jj<nn-1 && sqlite3Isalnum(z[jj]); jj++){}
+ if( jj==nn-1 ){
+ z++;
+ nn -= 2;
+ }
+ }
+ }
+ jsonPrintf(nn+2, pStr, ".%.*s", nn, z);
+}
+
/* Append the name of the path for element i to pStr
*/
static void jsonEachComputePath(
@@ -191851,13 +202716,13 @@ static void jsonEachComputePath(
pNode = &p->sParse.aNode[i];
pUp = &p->sParse.aNode[iUp];
if( pUp->eType==JSON_ARRAY ){
+ assert( pUp->eU==3 || (pUp->eU==0 && pUp->u.iKey==0) );
+ testcase( pUp->eU==0 );
jsonPrintf(30, pStr, "[%d]", pUp->u.iKey);
}else{
assert( pUp->eType==JSON_OBJECT );
if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
- assert( pNode->eType==JSON_STRING );
- assert( pNode->jnFlags & JNODE_LABEL );
- jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
+ jsonAppendObjectPathElement(pStr, pNode);
}
}
@@ -191878,6 +202743,7 @@ static int jsonEachColumn(
u32 iKey;
if( p->bRecursive ){
if( p->iRowid==0 ) break;
+ assert( p->sParse.aNode[p->sParse.aUp[p->i]].eU==3 );
iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey;
}else{
iKey = p->iRowid;
@@ -191927,7 +202793,7 @@ static int jsonEachColumn(
if( p->eType==JSON_ARRAY ){
jsonPrintf(30, &x, "[%d]", p->iRowid);
}else if( p->eType==JSON_OBJECT ){
- jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
+ jsonAppendObjectPathElement(&x, pThis);
}
}
jsonResult(&x);
@@ -191985,7 +202851,7 @@ static int jsonEachBestIndex(
/* This implementation assumes that JSON and ROOT are the last two
** columns in the table */
assert( JEACH_ROOT == JEACH_JSON+1 );
- UNUSED_PARAM(tab);
+ UNUSED_PARAMETER(tab);
aIdx[0] = aIdx[1] = -1;
pConstraint = pIdxInfo->aConstraint;
for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
@@ -191994,6 +202860,7 @@ static int jsonEachBestIndex(
if( pConstraint->iColumn < JEACH_JSON ) continue;
iCol = pConstraint->iColumn - JEACH_JSON;
assert( iCol==0 || iCol==1 );
+ testcase( iCol==0 );
iMask = 1 << iCol;
if( pConstraint->usable==0 ){
unusableMask |= iMask;
@@ -192002,6 +202869,13 @@ static int jsonEachBestIndex(
idxMask |= iMask;
}
}
+ if( pIdxInfo->nOrderBy>0
+ && pIdxInfo->aOrderBy[0].iColumn<0
+ && pIdxInfo->aOrderBy[0].desc==0
+ ){
+ pIdxInfo->orderByConsumed = 1;
+ }
+
if( (unusableMask & ~idxMask)!=0 ){
/* If there are any unusable constraints on JSON or ROOT, then reject
** this entire plan */
@@ -192040,8 +202914,8 @@ static int jsonEachFilter(
const char *zRoot = 0;
sqlite3_int64 n;
- UNUSED_PARAM(idxStr);
- UNUSED_PARAM(argc);
+ UNUSED_PARAMETER(idxStr);
+ UNUSED_PARAMETER(argc);
jsonEachCursorReset(p);
if( idxNum==0 ) return SQLITE_OK;
z = (const char*)sqlite3_value_text(argv[0]);
@@ -192091,6 +202965,8 @@ static int jsonEachFilter(
p->iBegin = p->i = (int)(pNode - p->sParse.aNode);
p->eType = pNode->eType;
if( p->eType>=JSON_ARRAY ){
+ assert( pNode->eU==0 );
+ VVA( pNode->eU = 3 );
pNode->u.iKey = 0;
p->iEnd = p->i + pNode->n + 1;
if( p->bRecursive ){
@@ -192164,108 +203040,69 @@ static sqlite3_module jsonTreeModule = {
0 /* xShadowName */
};
#endif /* SQLITE_OMIT_VIRTUALTABLE */
-
-/****************************************************************************
-** The following routines are the only publically visible identifiers in this
-** file. Call the following routines in order to register the various SQL
-** functions and the virtual table implemented by this file.
-****************************************************************************/
-
-SQLITE_PRIVATE int sqlite3Json1Init(sqlite3 *db){
- int rc = SQLITE_OK;
- unsigned int i;
- static const struct {
- const char *zName;
- int nArg;
- int flag;
- void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
- } aFunc[] = {
- { "json", 1, 0, jsonRemoveFunc },
- { "json_array", -1, 0, jsonArrayFunc },
- { "json_array_length", 1, 0, jsonArrayLengthFunc },
- { "json_array_length", 2, 0, jsonArrayLengthFunc },
- { "json_extract", -1, 0, jsonExtractFunc },
- { "json_insert", -1, 0, jsonSetFunc },
- { "json_object", -1, 0, jsonObjectFunc },
- { "json_patch", 2, 0, jsonPatchFunc },
- { "json_quote", 1, 0, jsonQuoteFunc },
- { "json_remove", -1, 0, jsonRemoveFunc },
- { "json_replace", -1, 0, jsonReplaceFunc },
- { "json_set", -1, 1, jsonSetFunc },
- { "json_type", 1, 0, jsonTypeFunc },
- { "json_type", 2, 0, jsonTypeFunc },
- { "json_valid", 1, 0, jsonValidFunc },
-
+#endif /* !defined(SQLITE_OMIT_JSON) */
+
+/*
+** Register JSON functions.
+*/
+SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void){
+#ifndef SQLITE_OMIT_JSON
+ static FuncDef aJsonFunc[] = {
+ JFUNCTION(json, 1, 0, jsonRemoveFunc),
+ JFUNCTION(json_array, -1, 0, jsonArrayFunc),
+ JFUNCTION(json_array_length, 1, 0, jsonArrayLengthFunc),
+ JFUNCTION(json_array_length, 2, 0, jsonArrayLengthFunc),
+ JFUNCTION(json_error_position,1, 0, jsonErrorFunc),
+ JFUNCTION(json_extract, -1, 0, jsonExtractFunc),
+ JFUNCTION(->, 2, JSON_JSON, jsonExtractFunc),
+ JFUNCTION(->>, 2, JSON_SQL, jsonExtractFunc),
+ JFUNCTION(json_insert, -1, 0, jsonSetFunc),
+ JFUNCTION(json_object, -1, 0, jsonObjectFunc),
+ JFUNCTION(json_patch, 2, 0, jsonPatchFunc),
+ JFUNCTION(json_quote, 1, 0, jsonQuoteFunc),
+ JFUNCTION(json_remove, -1, 0, jsonRemoveFunc),
+ JFUNCTION(json_replace, -1, 0, jsonReplaceFunc),
+ JFUNCTION(json_set, -1, JSON_ISSET, jsonSetFunc),
+ JFUNCTION(json_type, 1, 0, jsonTypeFunc),
+ JFUNCTION(json_type, 2, 0, jsonTypeFunc),
+ JFUNCTION(json_valid, 1, 0, jsonValidFunc),
#if SQLITE_DEBUG
- /* DEBUG and TESTING functions */
- { "json_parse", 1, 0, jsonParseFunc },
- { "json_test1", 1, 0, jsonTest1Func },
-#endif
- };
- static const struct {
- const char *zName;
- int nArg;
- void (*xStep)(sqlite3_context*,int,sqlite3_value**);
- void (*xFinal)(sqlite3_context*);
- void (*xValue)(sqlite3_context*);
- } aAgg[] = {
- { "json_group_array", 1,
- jsonArrayStep, jsonArrayFinal, jsonArrayValue },
- { "json_group_object", 2,
- jsonObjectStep, jsonObjectFinal, jsonObjectValue },
+ JFUNCTION(json_parse, 1, 0, jsonParseFunc),
+ JFUNCTION(json_test1, 1, 0, jsonTest1Func),
+#endif
+ WAGGREGATE(json_group_array, 1, 0, 0,
+ jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse,
+ SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC),
+ WAGGREGATE(json_group_object, 2, 0, 0,
+ jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse,
+ SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC)
};
-#ifndef SQLITE_OMIT_VIRTUALTABLE
+ sqlite3InsertBuiltinFuncs(aJsonFunc, ArraySize(aJsonFunc));
+#endif
+}
+
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON)
+/*
+** Register the JSON table-valued functions
+*/
+SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3 *db){
+ int rc = SQLITE_OK;
static const struct {
- const char *zName;
- sqlite3_module *pModule;
+ const char *zName;
+ sqlite3_module *pModule;
} aMod[] = {
{ "json_each", &jsonEachModule },
{ "json_tree", &jsonTreeModule },
};
-#endif
- static const int enc =
- SQLITE_UTF8 |
- SQLITE_DETERMINISTIC |
- SQLITE_INNOCUOUS;
- for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
- rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg, enc,
- (void*)&aFunc[i].flag,
- aFunc[i].xFunc, 0, 0);
- }
-#ifndef SQLITE_OMIT_WINDOWFUNC
- for(i=0; i<sizeof(aAgg)/sizeof(aAgg[0]) && rc==SQLITE_OK; i++){
- rc = sqlite3_create_window_function(db, aAgg[i].zName, aAgg[i].nArg,
- SQLITE_SUBTYPE | enc, 0,
- aAgg[i].xStep, aAgg[i].xFinal,
- aAgg[i].xValue, jsonGroupInverse, 0);
- }
-#endif
-#ifndef SQLITE_OMIT_VIRTUALTABLE
+ unsigned int i;
for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){
rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0);
}
-#endif
return rc;
}
+#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) */
-
-#ifndef SQLITE_CORE
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-SQLITE_API int sqlite3_json_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
- return sqlite3Json1Init(db);
-}
-#endif
-#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) */
-
-/************** End of json1.c ***********************************************/
+/************** End of json.c ************************************************/
/************** Begin file rtree.c *******************************************/
/*
** 2001 September 15
@@ -192333,7 +203170,11 @@ SQLITE_API int sqlite3_json_init(
#endif
SQLITE_PRIVATE int sqlite3GetToken(const unsigned char*,int*); /* In the SQLite core */
-#ifndef SQLITE_AMALGAMATION
+/*
+** If building separately, we will need some setup that is normally
+** found in sqliteInt.h
+*/
+#if !defined(SQLITE_AMALGAMATION)
#include "sqlite3rtree.h"
typedef sqlite3_int64 i64;
typedef sqlite3_uint64 u64;
@@ -192346,7 +203187,20 @@ typedef unsigned int u32;
#if defined(NDEBUG) && defined(SQLITE_DEBUG)
# undef NDEBUG
#endif
+#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
+# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
+#endif
+#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
+# define ALWAYS(X) (1)
+# define NEVER(X) (0)
+#elif !defined(NDEBUG)
+# define ALWAYS(X) ((X)?1:(assert(0),0))
+# define NEVER(X) ((X)?(assert(0),1):0)
+#else
+# define ALWAYS(X) (X)
+# define NEVER(X) (X)
#endif
+#endif /* !defined(SQLITE_AMALGAMATION) */
/* #include <string.h> */
/* #include <stdio.h> */
@@ -192404,7 +203258,9 @@ struct Rtree {
u8 nBytesPerCell; /* Bytes consumed per cell */
u8 inWrTrans; /* True if inside write transaction */
u8 nAux; /* # of auxiliary columns in %_rowid */
+#ifdef SQLITE_ENABLE_GEOPOLY
u8 nAuxNotNull; /* Number of initial not-null aux columns */
+#endif
#ifdef SQLITE_DEBUG
u8 bCorrupt; /* Shadow table corruption detected */
#endif
@@ -192686,7 +203542,12 @@ struct RtreeMatchArg {
** it is not, make it a no-op.
*/
#ifndef SQLITE_AMALGAMATION
-# define testcase(X)
+# if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG)
+ unsigned int sqlite3RtreeTestcase = 0;
+# define testcase(X) if( X ){ sqlite3RtreeTestcase += __LINE__; }
+# else
+# define testcase(X)
+# endif
#endif
/*
@@ -192716,16 +203577,17 @@ struct RtreeMatchArg {
** at run-time.
*/
#ifndef SQLITE_BYTEORDER
-#if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
- defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
- defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
- defined(__arm__)
-# define SQLITE_BYTEORDER 1234
-#elif defined(sparc) || defined(__ppc__)
-# define SQLITE_BYTEORDER 4321
-#else
-# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */
-#endif
+# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
+ defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
+ defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
+ defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
+# define SQLITE_BYTEORDER 1234
+# elif defined(sparc) || defined(__ppc__) || \
+ defined(__ARMEB__) || defined(__AARCH64EB__)
+# define SQLITE_BYTEORDER 4321
+# else
+# define SQLITE_BYTEORDER 0
+# endif
#endif
@@ -192746,7 +203608,7 @@ static int readInt16(u8 *p){
return (p[0]<<8) + p[1];
}
static void readCoord(u8 *p, RtreeCoord *pCoord){
- assert( ((((char*)p) - (char*)0)&3)==0 ); /* p is always 4-byte aligned */
+ assert( (((sqlite3_uint64)p)&3)==0 ); /* p is always 4-byte aligned */
#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
pCoord->u = _byteswap_ulong(*(u32*)p);
#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000
@@ -192800,7 +203662,7 @@ static void writeInt16(u8 *p, int i){
}
static int writeCoord(u8 *p, RtreeCoord *pCoord){
u32 i;
- assert( ((((char*)p) - (char*)0)&3)==0 ); /* p is always 4-byte aligned */
+ assert( (((sqlite3_uint64)p)&3)==0 ); /* p is always 4-byte aligned */
assert( sizeof(RtreeCoord)==4 );
assert( sizeof(u32)==4 );
#if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000
@@ -192936,18 +203798,6 @@ static void nodeBlobReset(Rtree *pRtree){
}
/*
-** Check to see if pNode is the same as pParent or any of the parents
-** of pParent.
-*/
-static int nodeInParentChain(const RtreeNode *pNode, const RtreeNode *pParent){
- do{
- if( pNode==pParent ) return 1;
- pParent = pParent->pParent;
- }while( pParent );
- return 0;
-}
-
-/*
** Obtain a reference to an r-tree node.
*/
static int nodeAcquire(
@@ -192963,14 +203813,7 @@ static int nodeAcquire(
** increase its reference count and return it.
*/
if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){
- if( pParent && !pNode->pParent ){
- if( nodeInParentChain(pNode, pParent) ){
- RTREE_IS_CORRUPT(pRtree);
- return SQLITE_CORRUPT_VTAB;
- }
- pParent->nRef++;
- pNode->pParent = pParent;
- }else if( pParent && pNode->pParent && pParent!=pNode->pParent ){
+ if( pParent && pParent!=pNode->pParent ){
RTREE_IS_CORRUPT(pRtree);
return SQLITE_CORRUPT_VTAB;
}
@@ -193028,7 +203871,7 @@ static int nodeAcquire(
** are the leaves, and so on. If the depth as specified on the root node
** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
*/
- if( pNode && rc==SQLITE_OK && iNode==1 ){
+ if( rc==SQLITE_OK && pNode && iNode==1 ){
pRtree->iDepth = readInt16(pNode->zData);
if( pRtree->iDepth>RTREE_MAX_DEPTH ){
rc = SQLITE_CORRUPT_VTAB;
@@ -193547,24 +204390,33 @@ static void rtreeNonleafConstraint(
assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE
|| p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE
|| p->op==RTREE_FALSE );
- assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */
+ assert( (((sqlite3_uint64)pCellData)&3)==0 ); /* 4-byte aligned */
switch( p->op ){
case RTREE_TRUE: return; /* Always satisfied */
case RTREE_FALSE: break; /* Never satisfied */
+ case RTREE_EQ:
+ RTREE_DECODE_COORD(eInt, pCellData, val);
+ /* val now holds the lower bound of the coordinate pair */
+ if( p->u.rValue>=val ){
+ pCellData += 4;
+ RTREE_DECODE_COORD(eInt, pCellData, val);
+ /* val now holds the upper bound of the coordinate pair */
+ if( p->u.rValue<=val ) return;
+ }
+ break;
case RTREE_LE:
case RTREE_LT:
- case RTREE_EQ:
RTREE_DECODE_COORD(eInt, pCellData, val);
/* val now holds the lower bound of the coordinate pair */
if( p->u.rValue>=val ) return;
- if( p->op!=RTREE_EQ ) break; /* RTREE_LE and RTREE_LT end here */
- /* Fall through for the RTREE_EQ case */
+ break;
- default: /* RTREE_GT or RTREE_GE, or fallthrough of RTREE_EQ */
+ default:
pCellData += 4;
RTREE_DECODE_COORD(eInt, pCellData, val);
/* val now holds the upper bound of the coordinate pair */
if( p->u.rValue<=val ) return;
+ break;
}
*peWithin = NOT_WITHIN;
}
@@ -193591,7 +204443,7 @@ static void rtreeLeafConstraint(
|| p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE
|| p->op==RTREE_FALSE );
pCellData += 8 + p->iCoord*4;
- assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */
+ assert( (((sqlite3_uint64)pCellData)&3)==0 ); /* 4-byte aligned */
RTREE_DECODE_COORD(eInt, pCellData, xN);
switch( p->op ){
case RTREE_TRUE: return; /* Always satisfied */
@@ -193634,11 +204486,12 @@ static int nodeRowidIndex(
*/
static int nodeParentIndex(Rtree *pRtree, RtreeNode *pNode, int *piIndex){
RtreeNode *pParent = pNode->pParent;
- if( pParent ){
+ if( ALWAYS(pParent) ){
return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex);
+ }else{
+ *piIndex = -1;
+ return SQLITE_OK;
}
- *piIndex = -1;
- return SQLITE_OK;
}
/*
@@ -193761,7 +204614,8 @@ static RtreeSearchPoint *rtreeSearchPointNew(
pNew = rtreeEnqueue(pCur, rScore, iLevel);
if( pNew==0 ) return 0;
ii = (int)(pNew - pCur->aPoint) + 1;
- if( ii<RTREE_CACHE_SZ ){
+ assert( ii==1 );
+ if( ALWAYS(ii<RTREE_CACHE_SZ) ){
assert( pCur->aNode[ii]==0 );
pCur->aNode[ii] = pCur->aNode[0];
}else{
@@ -193822,7 +204676,7 @@ static void rtreeSearchPointPop(RtreeCursor *p){
if( p->bPoint ){
p->anQueue[p->sPoint.iLevel]--;
p->bPoint = 0;
- }else if( p->nPoint ){
+ }else if( ALWAYS(p->nPoint) ){
p->anQueue[p->aPoint[0].iLevel]--;
n = --p->nPoint;
p->aPoint[0] = p->aPoint[n];
@@ -193963,7 +204817,7 @@ static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){
RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr);
int rc = SQLITE_OK;
RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc);
- if( rc==SQLITE_OK && p ){
+ if( rc==SQLITE_OK && ALWAYS(p) ){
*pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell);
}
return rc;
@@ -193981,7 +204835,7 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc);
if( rc ) return rc;
- if( p==0 ) return SQLITE_OK;
+ if( NEVER(p==0) ) return SQLITE_OK;
if( i==0 ){
sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell));
}else if( i<=pRtree->nDim2 ){
@@ -194180,8 +205034,11 @@ static int rtreeFilter(
}
if( rc==SQLITE_OK ){
RtreeSearchPoint *pNew;
+ assert( pCsr->bPoint==0 ); /* Due to the resetCursor() call above */
pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1));
- if( pNew==0 ) return SQLITE_NOMEM;
+ if( NEVER(pNew==0) ){ /* Because pCsr->bPoint was FALSE */
+ return SQLITE_NOMEM;
+ }
pNew->id = 1;
pNew->iCell = 0;
pNew->eWithin = PARTLY_WITHIN;
@@ -194258,7 +205115,7 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
if( bMatch==0 && p->usable
- && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ
+ && p->iColumn<=0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ
){
/* We have an equality constraint on the rowid. Use strategy 1. */
int jj;
@@ -194464,7 +205321,7 @@ static int ChooseLeaf(
int nCell = NCELL(pNode);
RtreeCell cell;
- RtreeNode *pChild;
+ RtreeNode *pChild = 0;
RtreeCell *aCell = 0;
@@ -194511,12 +205368,19 @@ static int AdjustTree(
){
RtreeNode *p = pNode;
int cnt = 0;
+ int rc;
while( p->pParent ){
RtreeNode *pParent = p->pParent;
RtreeCell cell;
int iCell;
- if( (++cnt)>1000 || nodeParentIndex(pRtree, p, &iCell) ){
+ cnt++;
+ if( NEVER(cnt>100) ){
+ RTREE_IS_CORRUPT(pRtree);
+ return SQLITE_CORRUPT_VTAB;
+ }
+ rc = nodeParentIndex(pRtree, p, &iCell);
+ if( NEVER(rc!=SQLITE_OK) ){
RTREE_IS_CORRUPT(pRtree);
return SQLITE_CORRUPT_VTAB;
}
@@ -194805,12 +205669,17 @@ static int updateMapping(
xSetMapping = ((iHeight==0)?rowidWrite:parentWrite);
if( iHeight>0 ){
RtreeNode *pChild = nodeHashLookup(pRtree, iRowid);
+ RtreeNode *p;
+ for(p=pNode; p; p=p->pParent){
+ if( p==pChild ) return SQLITE_CORRUPT_VTAB;
+ }
if( pChild ){
nodeRelease(pRtree, pChild->pParent);
nodeReference(pNode);
pChild->pParent = pNode;
}
}
+ if( NEVER(pNode==0) ) return SQLITE_ERROR;
return xSetMapping(pRtree, iRowid, pNode->iNode);
}
@@ -194900,11 +205769,12 @@ static int SplitNode(
RtreeNode *pParent = pLeft->pParent;
int iCell;
rc = nodeParentIndex(pRtree, pLeft, &iCell);
- if( rc==SQLITE_OK ){
+ if( ALWAYS(rc==SQLITE_OK) ){
nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell);
rc = AdjustTree(pRtree, pParent, &leftbbox);
+ assert( rc==SQLITE_OK );
}
- if( rc!=SQLITE_OK ){
+ if( NEVER(rc!=SQLITE_OK) ){
goto splitnode_out;
}
}
@@ -194979,7 +205849,7 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){
*/
iNode = sqlite3_column_int64(pRtree->pReadParent, 0);
for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent);
- if( !pTest ){
+ if( pTest==0 ){
rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent);
}
}
@@ -195010,6 +205880,7 @@ static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){
pParent = pNode->pParent;
pNode->pParent = 0;
rc = deleteCell(pRtree, pParent, iCell, iHeight+1);
+ testcase( rc!=SQLITE_OK );
}
rc2 = nodeRelease(pRtree, pParent);
if( rc==SQLITE_OK ){
@@ -195232,7 +206103,7 @@ static int rtreeInsertCell(
}
}else{
rc = AdjustTree(pRtree, pNode, pCell);
- if( rc==SQLITE_OK ){
+ if( ALWAYS(rc==SQLITE_OK) ){
if( iHeight==0 ){
rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode);
}else{
@@ -195338,7 +206209,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){
int rc2;
RtreeNode *pChild = 0;
i64 iChild = nodeGetRowid(pRtree, pRoot, 0);
- rc = nodeAcquire(pRtree, iChild, pRoot, &pChild);
+ rc = nodeAcquire(pRtree, iChild, pRoot, &pChild); /* tag-20210916a */
if( rc==SQLITE_OK ){
rc = removeNode(pRtree, pChild, pRtree->iDepth-1);
}
@@ -195471,7 +206342,7 @@ static int rtreeUpdate(
rtreeReference(pRtree);
assert(nData>=1);
- cell.iRowid = 0; /* Used only to suppress a compiler warning */
+ memset(&cell, 0, sizeof(cell));
/* Constraint handling. A write operation on an r-tree table may return
** SQLITE_CONSTRAINT for two reasons:
@@ -195673,7 +206544,7 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){
char *zSql;
sqlite3_stmt *p;
int rc;
- i64 nRow = 0;
+ i64 nRow = RTREE_MIN_ROWEST;
rc = sqlite3_table_column_metadata(
db, pRtree->zDb, "sqlite_stat1",0,0,0,0,0,0
@@ -195690,20 +206561,10 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){
if( rc==SQLITE_OK ){
if( sqlite3_step(p)==SQLITE_ROW ) nRow = sqlite3_column_int64(p, 0);
rc = sqlite3_finalize(p);
- }else if( rc!=SQLITE_NOMEM ){
- rc = SQLITE_OK;
- }
-
- if( rc==SQLITE_OK ){
- if( nRow==0 ){
- pRtree->nRowEst = RTREE_DEFAULT_ROWEST;
- }else{
- pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST);
- }
}
sqlite3_free(zSql);
}
-
+ pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST);
return rc;
}
@@ -195853,9 +206714,12 @@ static int rtreeSqlInit(
sqlite3_str_appendf(p, "UPDATE \"%w\".\"%w_rowid\"SET ", zDb, zPrefix);
for(ii=0; ii<pRtree->nAux; ii++){
if( ii ) sqlite3_str_append(p, ",", 1);
+#ifdef SQLITE_ENABLE_GEOPOLY
if( ii<pRtree->nAuxNotNull ){
sqlite3_str_appendf(p,"a%d=coalesce(?%d,a%d)",ii,ii+2,ii);
- }else{
+ }else
+#endif
+ {
sqlite3_str_appendf(p,"a%d=?%d",ii,ii+2);
}
}
@@ -196120,6 +206984,7 @@ static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
tree.nDim2 = tree.nDim*2;
tree.nBytesPerCell = 8 + 8 * tree.nDim;
node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
+ if( node.zData==0 ) return;
nData = sqlite3_value_bytes(apArg[1]);
if( nData<4 ) return;
if( nData<NCELL(&node)*tree.nBytesPerCell ) return;
@@ -196534,8 +207399,10 @@ static int rtreeCheckTable(
if( pStmt ){
nAux = sqlite3_column_count(pStmt) - 2;
sqlite3_finalize(pStmt);
+ }else
+ if( check.rc!=SQLITE_NOMEM ){
+ check.rc = SQLITE_OK;
}
- check.rc = SQLITE_OK;
}
/* Find number of dimensions in the rtree table. */
@@ -196670,11 +207537,7 @@ static void rtreecheck(
# define GEODEBUG(X)
#endif
-#ifndef JSON_NULL /* The following stuff repeats things found in json1 */
-/*
-** Versions of isspace(), isalnum() and isdigit() to which it is safe
-** to pass signed char values.
-*/
+/* Character class routines */
#ifdef sqlite3Isdigit
/* Use the SQLite core versions if this routine is part of the
** SQLite amalgamation */
@@ -196689,6 +207552,7 @@ static void rtreecheck(
# define safe_isxdigit(x) isxdigit((unsigned char)(x))
#endif
+#ifndef JSON_NULL /* The following stuff repeats things found in json1 */
/*
** Growing our own isspace() routine this way is twice as fast as
** the library isspace() function.
@@ -196711,7 +207575,7 @@ static const char geopolyIsSpace[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
-#define safe_isspace(x) (geopolyIsSpace[(unsigned char)x])
+#define fast_isspace(x) (geopolyIsSpace[(unsigned char)x])
#endif /* JSON NULL - back to original code */
/* Compiler and version */
@@ -196800,7 +207664,7 @@ static void geopolySwab32(unsigned char *a){
/* Skip whitespace. Return the next non-whitespace character. */
static char geopolySkipSpace(GeoParse *p){
- while( safe_isspace(p->z[0]) ) p->z++;
+ while( fast_isspace(p->z[0]) ) p->z++;
return p->z[0];
}
@@ -196949,13 +207813,14 @@ static GeoPoly *geopolyFuncParam(
){
GeoPoly *p = 0;
int nByte;
+ testcase( pCtx==0 );
if( sqlite3_value_type(pVal)==SQLITE_BLOB
- && (nByte = sqlite3_value_bytes(pVal))>=(4+6*sizeof(GeoCoord))
+ && (nByte = sqlite3_value_bytes(pVal))>=(int)(4+6*sizeof(GeoCoord))
){
const unsigned char *a = sqlite3_value_blob(pVal);
int nVertex;
if( a==0 ){
- sqlite3_result_error_nomem(pCtx);
+ if( pCtx ) sqlite3_result_error_nomem(pCtx);
return 0;
}
nVertex = (a[1]<<16) + (a[2]<<8) + a[3];
@@ -197008,6 +207873,7 @@ static void geopolyBlobFunc(
sqlite3_value **argv
){
GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ (void)argc;
if( p ){
sqlite3_result_blob(context, p->hdr,
4+8*p->nVertex, SQLITE_TRANSIENT);
@@ -197027,6 +207893,7 @@ static void geopolyJsonFunc(
sqlite3_value **argv
){
GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ (void)argc;
if( p ){
sqlite3 *db = sqlite3_context_db_handle(context);
sqlite3_str *x = sqlite3_str_new(db);
@@ -197108,6 +207975,7 @@ static void geopolyXformFunc(
double F = sqlite3_value_double(argv[6]);
GeoCoord x1, y1, x0, y0;
int ii;
+ (void)argc;
if( p ){
for(ii=0; ii<p->nVertex; ii++){
x0 = GeoX(p,ii);
@@ -197158,6 +208026,7 @@ static void geopolyAreaFunc(
sqlite3_value **argv
){
GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ (void)argc;
if( p ){
sqlite3_result_double(context, geopolyArea(p));
sqlite3_free(p);
@@ -197183,6 +208052,7 @@ static void geopolyCcwFunc(
sqlite3_value **argv
){
GeoPoly *p = geopolyFuncParam(context, argv[0], 0);
+ (void)argc;
if( p ){
if( geopolyArea(p)<0.0 ){
int ii, jj;
@@ -197237,6 +208107,7 @@ static void geopolyRegularFunc(
int n = sqlite3_value_int(argv[3]);
int i;
GeoPoly *p;
+ (void)argc;
if( n<3 || r<=0.0 ) return;
if( n>1000 ) n = 1000;
@@ -197346,6 +208217,7 @@ static void geopolyBBoxFunc(
sqlite3_value **argv
){
GeoPoly *p = geopolyBBox(context, argv[0], 0, 0);
+ (void)argc;
if( p ){
sqlite3_result_blob(context, p->hdr,
4+8*p->nVertex, SQLITE_TRANSIENT);
@@ -197373,6 +208245,7 @@ static void geopolyBBoxStep(
){
RtreeCoord a[4];
int rc = SQLITE_OK;
+ (void)argc;
(void)geopolyBBox(context, argv[0], a, &rc);
if( rc==SQLITE_OK ){
GeoBBox *pBBox;
@@ -197461,6 +208334,8 @@ static void geopolyContainsPointFunc(
int v = 0;
int cnt = 0;
int ii;
+ (void)argc;
+
if( p1==0 ) return;
for(ii=0; ii<p1->nVertex-1; ii++){
v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii),
@@ -197500,6 +208375,7 @@ static void geopolyWithinFunc(
){
GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0);
GeoPoly *p2 = geopolyFuncParam(context, argv[1], 0);
+ (void)argc;
if( p1 && p2 ){
int x = geopolyOverlap(p1, p2);
if( x<0 ){
@@ -197782,11 +208658,11 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){
}else{
/* Remove a segment */
if( pActive==pThisEvent->pSeg ){
- pActive = pActive->pNext;
+ pActive = ALWAYS(pActive) ? pActive->pNext : 0;
}else{
for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){
if( pSeg->pNext==pThisEvent->pSeg ){
- pSeg->pNext = pSeg->pNext->pNext;
+ pSeg->pNext = ALWAYS(pSeg->pNext) ? pSeg->pNext->pNext : 0;
break;
}
}
@@ -197830,6 +208706,7 @@ static void geopolyOverlapFunc(
){
GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0);
GeoPoly *p2 = geopolyFuncParam(context, argv[1], 0);
+ (void)argc;
if( p1 && p2 ){
int x = geopolyOverlap(p1, p2);
if( x<0 ){
@@ -197850,8 +208727,12 @@ static void geopolyDebugFunc(
int argc,
sqlite3_value **argv
){
+ (void)context;
+ (void)argc;
#ifdef GEOPOLY_ENABLE_DEBUG
geo_debug = sqlite3_value_int(argv[0]);
+#else
+ (void)argv;
#endif
}
@@ -197879,6 +208760,7 @@ static int geopolyInit(
sqlite3_str *pSql;
char *zSql;
int ii;
+ (void)pAux;
sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
@@ -197995,6 +208877,7 @@ static int geopolyFilter(
RtreeNode *pRoot = 0;
int rc = SQLITE_OK;
int iCell = 0;
+ (void)idxStr;
rtreeReference(pRtree);
@@ -198030,6 +208913,7 @@ static int geopolyFilter(
RtreeCoord bbox[4];
RtreeConstraint *p;
assert( argc==1 );
+ assert( argv[0]!=0 );
geopolyBBox(0, argv[0], bbox, &rc);
if( rc ){
goto geopoly_filter_end;
@@ -198120,6 +209004,7 @@ static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
int iRowidTerm = -1;
int iFuncTerm = -1;
int idxNum = 0;
+ (void)tab;
for(ii=0; ii<pIdxInfo->nConstraint; ii++){
struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
@@ -198257,6 +209142,7 @@ static int geopolyUpdate(
|| !sqlite3_value_nochange(aData[2]) /* UPDATE _shape */
|| oldRowid!=newRowid) /* Rowid change */
){
+ assert( aData[2]!=0 );
geopolyBBox(0, aData[2], cell.aCoord, &rc);
if( rc ){
if( rc==SQLITE_ERROR ){
@@ -198339,7 +209225,7 @@ static int geopolyUpdate(
sqlite3_free(p);
nChange = 1;
}
- for(jj=1; jj<pRtree->nAux; jj++){
+ for(jj=1; jj<nData-2; jj++){
nChange++;
sqlite3_bind_value(pUp, jj+2, aData[jj+2]);
}
@@ -198365,6 +209251,8 @@ static int geopolyFindFunction(
void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
void **ppArg
){
+ (void)pVtab;
+ (void)nArg;
if( sqlite3_stricmp(zName, "geopoly_overlap")==0 ){
*pxFunc = geopolyOverlapFunc;
*ppArg = 0;
@@ -198434,7 +209322,7 @@ static int sqlite3_geopoly_init(sqlite3 *db){
} aAgg[] = {
{ geopolyBBoxStep, geopolyBBoxFinal, "geopoly_group_bbox" },
};
- int i;
+ unsigned int i;
for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
int enc;
if( aFunc[i].bPure ){
@@ -198610,7 +209498,10 @@ SQLITE_API int sqlite3_rtree_query_callback(
/* Allocate and populate the context object. */
pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback));
- if( !pGeomCtx ) return SQLITE_NOMEM;
+ if( !pGeomCtx ){
+ if( xDestructor ) xDestructor(pContext);
+ return SQLITE_NOMEM;
+ }
pGeomCtx->xGeom = 0;
pGeomCtx->xQueryFunc = xQueryFunc;
pGeomCtx->xDestructor = xDestructor;
@@ -198939,8 +209830,9 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){
if( U_SUCCESS(status) ){
sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete);
- }else{
- assert(!pExpr);
+ pExpr = sqlite3_get_auxdata(p, 0);
+ }
+ if( !pExpr ){
icuFunctionError(p, "uregex_open", status);
return;
}
@@ -199651,7 +210543,7 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(
** The order of the columns in the data_% table does not matter.
**
** Instead of a regular table, the RBU database may also contain virtual
-** tables or view named using the data_<target> naming scheme.
+** tables or views named using the data_<target> naming scheme.
**
** Instead of the plain data_<target> naming scheme, RBU database tables
** may also be named data<integer>_<target>, where <integer> is any sequence
@@ -199664,7 +210556,7 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(
**
** If the target database table is a virtual table or a table that has no
** PRIMARY KEY declaration, the data_% table must also contain a column
-** named "rbu_rowid". This column is mapped to the tables implicit primary
+** named "rbu_rowid". This column is mapped to the table's implicit primary
** key column - "rowid". Virtual tables for which the "rowid" column does
** not function like a primary key value cannot be updated using RBU. For
** example, if the target db contains either of the following:
@@ -200098,6 +210990,34 @@ SQLITE_API void sqlite3rbu_bp_progress(sqlite3rbu *pRbu, int *pnOne, int*pnTwo);
SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu);
/*
+** As part of applying an RBU update or performing an RBU vacuum operation,
+** the system must at one point move the *-oal file to the equivalent *-wal
+** path. Normally, it does this by invoking POSIX function rename(2) directly.
+** Except on WINCE platforms, where it uses win32 API MoveFileW(). This
+** function may be used to register a callback that the RBU module will invoke
+** instead of one of these APIs.
+**
+** If a callback is registered with an RBU handle, it invokes it instead
+** of rename(2) when it needs to move a file within the file-system. The
+** first argument passed to the xRename() callback is a copy of the second
+** argument (pArg) passed to this function. The second is the full path
+** to the file to move and the third the full path to which it should be
+** moved. The callback function should return SQLITE_OK to indicate
+** success. If an error occurs, it should return an SQLite error code.
+** In this case the RBU operation will be abandoned and the error returned
+** to the RBU user.
+**
+** Passing a NULL pointer in place of the xRename argument to this function
+** restores the default behaviour.
+*/
+SQLITE_API void sqlite3rbu_rename_handler(
+ sqlite3rbu *pRbu,
+ void *pArg,
+ int (*xRename)(void *pArg, const char *zOld, const char *zNew)
+);
+
+
+/*
** Create an RBU VFS named zName that accesses the underlying file-system
** via existing VFS zParent. Or, if the zParent parameter is passed NULL,
** then the new RBU VFS uses the default system VFS to access the file-system.
@@ -200182,6 +211102,13 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName);
#endif
/*
+** Name of the URI option that causes RBU to take an exclusive lock as
+** part of the incremental checkpoint operation.
+*/
+#define RBU_EXCLUSIVE_CHECKPOINT "rbu_exclusive_checkpoint"
+
+
+/*
** The rbu_state table is used to save the state of a partially applied
** update so that it can be resumed later. The table consists of integer
** keys mapped to values as follows:
@@ -200457,6 +211384,8 @@ struct sqlite3rbu {
int nPagePerSector; /* Pages per sector for pTargetFd */
i64 iOalSz;
i64 nPhaseOneStep;
+ void *pRenameArg;
+ int (*xRename)(void*, const char*, const char*);
/* The following state variables are used as part of the incremental
** checkpoint stage (eStage==RBU_STAGE_CKPT). See comments surrounding
@@ -201265,7 +212194,9 @@ static void rbuTableType(
assert( p->rc==SQLITE_OK );
p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[0], &p->zErrmsg,
sqlite3_mprintf(
- "SELECT (sql LIKE 'create virtual%%'), rootpage"
+ "SELECT "
+ " (sql COLLATE nocase BETWEEN 'CREATE VIRTUAL' AND 'CREATE VIRTUAM'),"
+ " rootpage"
" FROM sqlite_schema"
" WHERE name=%Q", zTab
));
@@ -201625,7 +212556,7 @@ static char *rbuVacuumTableStart(
** the caller has to use an OFFSET clause to extract only the required
** rows from the sourct table, just as it does for an RBU update operation.
*/
-char *rbuVacuumIndexStart(
+static char *rbuVacuumIndexStart(
sqlite3rbu *p, /* RBU handle */
RbuObjIter *pIter /* RBU iterator object */
){
@@ -202798,7 +213729,7 @@ static RbuState *rbuLoadState(sqlite3rbu *p){
break;
case RBU_STATE_OALSZ:
- pRet->iOalSz = (u32)sqlite3_column_int64(pStmt, 1);
+ pRet->iOalSz = sqlite3_column_int64(pStmt, 1);
break;
case RBU_STATE_PHASEONESTEP:
@@ -202825,19 +213756,25 @@ static RbuState *rbuLoadState(sqlite3rbu *p){
/*
** Open the database handle and attach the RBU database as "rbu". If an
** error occurs, leave an error code and message in the RBU handle.
+**
+** If argument dbMain is not NULL, then it is a database handle already
+** open on the target database. Use this handle instead of opening a new
+** one.
*/
-static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){
+static void rbuOpenDatabase(sqlite3rbu *p, sqlite3 *dbMain, int *pbRetry){
assert( p->rc || (p->dbMain==0 && p->dbRbu==0) );
assert( p->rc || rbuIsVacuum(p) || p->zTarget!=0 );
+ assert( dbMain==0 || rbuIsVacuum(p)==0 );
/* Open the RBU database */
p->dbRbu = rbuOpenDbhandle(p, p->zRbu, 1);
+ p->dbMain = dbMain;
if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){
sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p);
if( p->zState==0 ){
const char *zFile = sqlite3_db_filename(p->dbRbu, "main");
- p->zState = rbuMPrintf(p, "file://%s-vacuum?modeof=%s", zFile, zFile);
+ p->zState = rbuMPrintf(p, "file:///%s-vacuum?modeof=%s", zFile, zFile);
}
}
@@ -203085,11 +214022,11 @@ static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){
** no-ops. These locks will not be released until the connection
** is closed.
**
- ** * Attempting to xSync() the database file causes an SQLITE_INTERNAL
+ ** * Attempting to xSync() the database file causes an SQLITE_NOTICE
** error.
**
** As a result, unless an error (i.e. OOM or SQLITE_BUSY) occurs, the
- ** checkpoint below fails with SQLITE_INTERNAL, and leaves the aFrame[]
+ ** checkpoint below fails with SQLITE_NOTICE, and leaves the aFrame[]
** array populated with a set of (frame -> page) mappings. Because the
** WRITER, CHECKPOINT and READ0 locks are still held, it is safe to copy
** data from the wal file into the database file according to the
@@ -203099,7 +214036,7 @@ static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){
int rc2;
p->eStage = RBU_STAGE_CAPTURE;
rc2 = sqlite3_exec(p->dbMain, "PRAGMA main.wal_checkpoint=restart", 0, 0,0);
- if( rc2!=SQLITE_INTERNAL ) p->rc = rc2;
+ if( rc2!=SQLITE_NOTICE ) p->rc = rc2;
}
if( p->rc==SQLITE_OK && p->nFrame>0 ){
@@ -203145,7 +214082,7 @@ static int rbuCaptureWalRead(sqlite3rbu *pRbu, i64 iOff, int iAmt){
if( pRbu->mLock!=mReq ){
pRbu->rc = SQLITE_BUSY;
- return SQLITE_INTERNAL;
+ return SQLITE_NOTICE_RBU;
}
pRbu->pgsz = iAmt;
@@ -203195,17 +214132,49 @@ static void rbuCheckpointFrame(sqlite3rbu *p, RbuFrame *pFrame){
p->rc = pDb->pMethods->xWrite(pDb, p->aBuf, p->pgsz, iOff);
}
+/*
+** This value is copied from the definition of ZIPVFS_CTRL_FILE_POINTER
+** in zipvfs.h.
+*/
+#define RBU_ZIPVFS_CTRL_FILE_POINTER 230439
/*
-** Take an EXCLUSIVE lock on the database file.
+** Take an EXCLUSIVE lock on the database file. Return SQLITE_OK if
+** successful, or an SQLite error code otherwise.
*/
-static void rbuLockDatabase(sqlite3rbu *p){
- sqlite3_file *pReal = p->pTargetFd->pReal;
- assert( p->rc==SQLITE_OK );
- p->rc = pReal->pMethods->xLock(pReal, SQLITE_LOCK_SHARED);
- if( p->rc==SQLITE_OK ){
- p->rc = pReal->pMethods->xLock(pReal, SQLITE_LOCK_EXCLUSIVE);
+static int rbuLockDatabase(sqlite3 *db){
+ int rc = SQLITE_OK;
+ sqlite3_file *fd = 0;
+
+ sqlite3_file_control(db, "main", RBU_ZIPVFS_CTRL_FILE_POINTER, &fd);
+ if( fd ){
+ sqlite3_file_control(db, "main", SQLITE_FCNTL_FILE_POINTER, &fd);
+ rc = fd->pMethods->xLock(fd, SQLITE_LOCK_SHARED);
+ if( rc==SQLITE_OK ){
+ rc = fd->pMethods->xUnlock(fd, SQLITE_LOCK_NONE);
+ }
+ sqlite3_file_control(db, "main", RBU_ZIPVFS_CTRL_FILE_POINTER, &fd);
+ }else{
+ sqlite3_file_control(db, "main", SQLITE_FCNTL_FILE_POINTER, &fd);
}
+
+ if( rc==SQLITE_OK && fd->pMethods ){
+ rc = fd->pMethods->xLock(fd, SQLITE_LOCK_SHARED);
+ if( rc==SQLITE_OK ){
+ rc = fd->pMethods->xLock(fd, SQLITE_LOCK_EXCLUSIVE);
+ }
+ }
+ return rc;
+}
+
+/*
+** Return true if the database handle passed as the only argument
+** was opened with the rbu_exclusive_checkpoint=1 URI parameter
+** specified. Or false otherwise.
+*/
+static int rbuExclusiveCheckpoint(sqlite3 *db){
+ const char *zUri = sqlite3_db_filename(db, 0);
+ return sqlite3_uri_boolean(zUri, RBU_EXCLUSIVE_CHECKPOINT, 0);
}
#if defined(_WIN32_WCE)
@@ -203263,49 +214232,38 @@ static void rbuMoveOalFile(sqlite3rbu *p){
** In order to ensure that there are no database readers, an EXCLUSIVE
** lock is obtained here before the *-oal is moved to *-wal.
*/
- rbuLockDatabase(p);
- if( p->rc==SQLITE_OK ){
- rbuFileSuffix3(zBase, zWal);
- rbuFileSuffix3(zBase, zOal);
+ sqlite3 *dbMain = 0;
+ rbuFileSuffix3(zBase, zWal);
+ rbuFileSuffix3(zBase, zOal);
- /* Re-open the databases. */
- rbuObjIterFinalize(&p->objiter);
- sqlite3_close(p->dbRbu);
- sqlite3_close(p->dbMain);
- p->dbMain = 0;
- p->dbRbu = 0;
+ /* Re-open the databases. */
+ rbuObjIterFinalize(&p->objiter);
+ sqlite3_close(p->dbRbu);
+ sqlite3_close(p->dbMain);
+ p->dbMain = 0;
+ p->dbRbu = 0;
-#if defined(_WIN32_WCE)
- {
- LPWSTR zWideOal;
- LPWSTR zWideWal;
-
- zWideOal = rbuWinUtf8ToUnicode(zOal);
- if( zWideOal ){
- zWideWal = rbuWinUtf8ToUnicode(zWal);
- if( zWideWal ){
- if( MoveFileW(zWideOal, zWideWal) ){
- p->rc = SQLITE_OK;
- }else{
- p->rc = SQLITE_IOERR;
- }
- sqlite3_free(zWideWal);
- }else{
- p->rc = SQLITE_IOERR_NOMEM;
- }
- sqlite3_free(zWideOal);
- }else{
- p->rc = SQLITE_IOERR_NOMEM;
- }
- }
-#else
- p->rc = rename(zOal, zWal) ? SQLITE_IOERR : SQLITE_OK;
-#endif
+ dbMain = rbuOpenDbhandle(p, p->zTarget, 1);
+ if( dbMain ){
+ assert( p->rc==SQLITE_OK );
+ p->rc = rbuLockDatabase(dbMain);
+ }
- if( p->rc==SQLITE_OK ){
- rbuOpenDatabase(p, 0);
- rbuSetupCheckpoint(p, 0);
- }
+ if( p->rc==SQLITE_OK ){
+ p->rc = p->xRename(p->pRenameArg, zOal, zWal);
+ }
+
+ if( p->rc!=SQLITE_OK
+ || rbuIsVacuum(p)
+ || rbuExclusiveCheckpoint(dbMain)==0
+ ){
+ sqlite3_close(dbMain);
+ dbMain = 0;
+ }
+
+ if( p->rc==SQLITE_OK ){
+ rbuOpenDatabase(p, dbMain, 0);
+ rbuSetupCheckpoint(p, 0);
}
}
@@ -203879,7 +214837,8 @@ static void rbuSetupOal(sqlite3rbu *p, RbuState *pState){
static void rbuDeleteOalFile(sqlite3rbu *p){
char *zOal = rbuMPrintf(p, "%s-oal", p->zTarget);
if( zOal ){
- sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
+ sqlite3_vfs *pVfs = 0;
+ sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_VFS_POINTER, &pVfs);
assert( pVfs && p->rc==SQLITE_OK && p->zErrmsg==0 );
pVfs->xDelete(pVfs, zOal, 0);
sqlite3_free(zOal);
@@ -204031,6 +214990,7 @@ static sqlite3rbu *openRbuHandle(
/* Create the custom VFS. */
memset(p, 0, sizeof(sqlite3rbu));
+ sqlite3rbu_rename_handler(p, 0, 0);
rbuCreateVfs(p);
/* Open the target, RBU and state databases */
@@ -204056,9 +215016,9 @@ static sqlite3rbu *openRbuHandle(
** If this is the case, it will have been checkpointed and deleted
** when the handle was closed and a second attempt to open the
** database may succeed. */
- rbuOpenDatabase(p, &bRetry);
+ rbuOpenDatabase(p, 0, &bRetry);
if( bRetry ){
- rbuOpenDatabase(p, 0);
+ rbuOpenDatabase(p, 0, 0);
}
}
@@ -204153,6 +215113,14 @@ static sqlite3rbu *openRbuHandle(
}else if( p->eStage==RBU_STAGE_MOVE ){
/* no-op */
}else if( p->eStage==RBU_STAGE_CKPT ){
+ if( !rbuIsVacuum(p) && rbuExclusiveCheckpoint(p->dbMain) ){
+ /* If the rbu_exclusive_checkpoint=1 URI parameter was specified
+ ** and an incremental checkpoint is being resumed, attempt an
+ ** exclusive lock on the db file. If this fails, so be it. */
+ p->eStage = RBU_STAGE_DONE;
+ rbuLockDatabase(p->dbMain);
+ p->eStage = RBU_STAGE_CKPT;
+ }
rbuSetupCheckpoint(p, pState);
}else if( p->eStage==RBU_STAGE_DONE ){
p->rc = SQLITE_DONE;
@@ -204190,7 +215158,6 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open(
const char *zState
){
if( zTarget==0 || zRbu==0 ){ return rbuMisuseError(); }
- /* TODO: Check that zTarget and zRbu are non-NULL */
return openRbuHandle(zTarget, zRbu, zState);
}
@@ -204415,6 +215382,54 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){
return rc;
}
+/*
+** Default xRename callback for RBU.
+*/
+static int xDefaultRename(void *pArg, const char *zOld, const char *zNew){
+ int rc = SQLITE_OK;
+#if defined(_WIN32_WCE)
+ {
+ LPWSTR zWideOld;
+ LPWSTR zWideNew;
+
+ zWideOld = rbuWinUtf8ToUnicode(zOld);
+ if( zWideOld ){
+ zWideNew = rbuWinUtf8ToUnicode(zNew);
+ if( zWideNew ){
+ if( MoveFileW(zWideOld, zWideNew) ){
+ rc = SQLITE_OK;
+ }else{
+ rc = SQLITE_IOERR;
+ }
+ sqlite3_free(zWideNew);
+ }else{
+ rc = SQLITE_IOERR_NOMEM;
+ }
+ sqlite3_free(zWideOld);
+ }else{
+ rc = SQLITE_IOERR_NOMEM;
+ }
+ }
+#else
+ rc = rename(zOld, zNew) ? SQLITE_IOERR : SQLITE_OK;
+#endif
+ return rc;
+}
+
+SQLITE_API void sqlite3rbu_rename_handler(
+ sqlite3rbu *pRbu,
+ void *pArg,
+ int (*xRename)(void *pArg, const char *zOld, const char *zNew)
+){
+ if( xRename ){
+ pRbu->xRename = xRename;
+ pRbu->pRenameArg = pArg;
+ }else{
+ pRbu->xRename = xDefaultRename;
+ pRbu->pRenameArg = 0;
+ }
+}
+
/**************************************************************************
** Beginning of RBU VFS shim methods. The VFS shim modifies the behaviour
** of a standard VFS in the following ways:
@@ -204471,7 +215486,7 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){
** database file are recorded. xShmLock() calls to unlock the same
** locks are no-ops (so that once obtained, these locks are never
** relinquished). Finally, calls to xSync() on the target database
-** file fail with SQLITE_INTERNAL errors.
+** file fail with SQLITE_NOTICE errors.
*/
static void rbuUnlockShm(rbu_file *p){
@@ -204580,9 +215595,12 @@ static int rbuVfsClose(sqlite3_file *pFile){
sqlite3_free(p->zDel);
if( p->openFlags & SQLITE_OPEN_MAIN_DB ){
+ const sqlite3_io_methods *pMeth = p->pReal->pMethods;
rbuMainlistRemove(p);
rbuUnlockShm(p);
- p->pReal->pMethods->xShmUnmap(p->pReal, 0);
+ if( pMeth->iVersion>1 && pMeth->xShmUnmap ){
+ pMeth->xShmUnmap(p->pReal, 0);
+ }
}
else if( (p->openFlags & SQLITE_OPEN_DELETEONCLOSE) && p->pRbu ){
rbuUpdateTempSize(p, 0);
@@ -204750,7 +215768,7 @@ static int rbuVfsSync(sqlite3_file *pFile, int flags){
rbu_file *p = (rbu_file *)pFile;
if( p->pRbu && p->pRbu->eStage==RBU_STAGE_CAPTURE ){
if( p->openFlags & SQLITE_OPEN_MAIN_DB ){
- return SQLITE_INTERNAL;
+ return SQLITE_NOTICE_RBU;
}
return SQLITE_OK;
}
@@ -205041,6 +216059,25 @@ static int rbuVfsOpen(
rbuVfsShmUnmap, /* xShmUnmap */
0, 0 /* xFetch, xUnfetch */
};
+ static sqlite3_io_methods rbuvfs_io_methods1 = {
+ 1, /* iVersion */
+ rbuVfsClose, /* xClose */
+ rbuVfsRead, /* xRead */
+ rbuVfsWrite, /* xWrite */
+ rbuVfsTruncate, /* xTruncate */
+ rbuVfsSync, /* xSync */
+ rbuVfsFileSize, /* xFileSize */
+ rbuVfsLock, /* xLock */
+ rbuVfsUnlock, /* xUnlock */
+ rbuVfsCheckReservedLock, /* xCheckReservedLock */
+ rbuVfsFileControl, /* xFileControl */
+ rbuVfsSectorSize, /* xSectorSize */
+ rbuVfsDeviceCharacteristics, /* xDeviceCharacteristics */
+ 0, 0, 0, 0, 0, 0
+ };
+
+
+
rbu_vfs *pRbuVfs = (rbu_vfs*)pVfs;
sqlite3_vfs *pRealVfs = pRbuVfs->pRealVfs;
rbu_file *pFd = (rbu_file *)pFile;
@@ -205095,10 +216132,15 @@ static int rbuVfsOpen(
rc = pRealVfs->xOpen(pRealVfs, zOpen, pFd->pReal, oflags, pOutFlags);
}
if( pFd->pReal->pMethods ){
+ const sqlite3_io_methods *pMeth = pFd->pReal->pMethods;
/* The xOpen() operation has succeeded. Set the sqlite3_file.pMethods
** pointer and, if the file is a main database file, link it into the
** mutex protected linked list of all such files. */
- pFile->pMethods = &rbuvfs_io_methods;
+ if( pMeth->iVersion<2 || pMeth->xShmLock==0 ){
+ pFile->pMethods = &rbuvfs_io_methods1;
+ }else{
+ pFile->pMethods = &rbuvfs_io_methods;
+ }
if( flags & SQLITE_OPEN_MAIN_DB ){
rbuMainlistAdd(pFd);
}
@@ -205394,6 +216436,15 @@ SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu *pRbu){
&& !defined(SQLITE_OMIT_VIRTUALTABLE)
/*
+** The pager and btree modules arrange objects in memory so that there are
+** always approximately 200 bytes of addressable memory following each page
+** buffer. This way small buffer overreads caused by corrupt database pages
+** do not cause undefined behaviour. This module pads each page buffer
+** by the following number of bytes for the same purpose.
+*/
+#define DBSTAT_PAGE_PADDING_BYTES 256
+
+/*
** Page paths:
**
** The value of the 'path' column describes the path taken from the
@@ -205460,9 +216511,8 @@ struct StatCell {
/* Size information for a single btree page */
struct StatPage {
u32 iPgno; /* Page number */
- DbPage *pPg; /* Page content */
+ u8 *aPg; /* Page buffer from sqlite3_malloc() */
int iCell; /* Current cell */
-
char *zPath; /* Path to this page */
/* Variables populated by statDecodePage(): */
@@ -205523,6 +216573,7 @@ static int statConnect(
StatTable *pTab = 0;
int rc = SQLITE_OK;
int iDb;
+ (void)pAux;
if( argc>=4 ){
Token nm;
@@ -205576,6 +216627,7 @@ static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
int iSchema = -1;
int iName = -1;
int iAgg = -1;
+ (void)tab;
/* Look for a valid schema=? constraint. If found, change the idxNum to
** 1 and request the value of that constraint be sent to xFilter. And
@@ -205674,18 +216726,25 @@ static void statClearCells(StatPage *p){
}
static void statClearPage(StatPage *p){
+ u8 *aPg = p->aPg;
statClearCells(p);
- sqlite3PagerUnref(p->pPg);
sqlite3_free(p->zPath);
memset(p, 0, sizeof(StatPage));
+ p->aPg = aPg;
}
static void statResetCsr(StatCursor *pCsr){
int i;
- sqlite3_reset(pCsr->pStmt);
+ /* In some circumstances, specifically if an OOM has occurred, the call
+ ** to sqlite3_reset() may cause the pager to be reset (emptied). It is
+ ** important that statClearPage() is called to free any page refs before
+ ** this happens. dbsqlfuzz 9ed3e4e3816219d3509d711636c38542bf3f40b1. */
for(i=0; i<ArraySize(pCsr->aPage); i++){
statClearPage(&pCsr->aPage[i]);
+ sqlite3_free(pCsr->aPage[i].aPg);
+ pCsr->aPage[i].aPg = 0;
}
+ sqlite3_reset(pCsr->pStmt);
pCsr->iPage = 0;
sqlite3_free(pCsr->zPath);
pCsr->zPath = 0;
@@ -205750,7 +216809,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){
int isLeaf;
int szPage;
- u8 *aData = sqlite3PagerGetData(p->pPg);
+ u8 *aData = p->aPg;
u8 *aHdr = &aData[p->iPgno==1 ? 100 : 0];
p->flags = aHdr[0];
@@ -205821,7 +216880,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){
if( nPayload>(u32)nLocal ){
int j;
int nOvfl = ((nPayload - nLocal) + nUsable-4 - 1) / (nUsable - 4);
- if( iOff+nLocal>nUsable || nPayload>0x7fffffff ){
+ if( iOff+nLocal+4>nUsable || nPayload>0x7fffffff ){
goto statPageIsCorrupt;
}
pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4);
@@ -205881,6 +216940,38 @@ static void statSizeAndOffset(StatCursor *pCsr){
}
/*
+** Load a copy of the page data for page iPg into the buffer belonging
+** to page object pPg. Allocate the buffer if necessary. Return SQLITE_OK
+** if successful, or an SQLite error code otherwise.
+*/
+static int statGetPage(
+ Btree *pBt, /* Load page from this b-tree */
+ u32 iPg, /* Page number to load */
+ StatPage *pPg /* Load page into this object */
+){
+ int pgsz = sqlite3BtreeGetPageSize(pBt);
+ DbPage *pDbPage = 0;
+ int rc;
+
+ if( pPg->aPg==0 ){
+ pPg->aPg = (u8*)sqlite3_malloc(pgsz + DBSTAT_PAGE_PADDING_BYTES);
+ if( pPg->aPg==0 ){
+ return SQLITE_NOMEM_BKPT;
+ }
+ memset(&pPg->aPg[pgsz], 0, DBSTAT_PAGE_PADDING_BYTES);
+ }
+
+ rc = sqlite3PagerGet(sqlite3BtreePager(pBt), iPg, &pDbPage, 0);
+ if( rc==SQLITE_OK ){
+ const u8 *a = sqlite3PagerGetData(pDbPage);
+ memcpy(pPg->aPg, a, pgsz);
+ sqlite3PagerUnref(pDbPage);
+ }
+
+ return rc;
+}
+
+/*
** Move a DBSTAT cursor to the next entry. Normally, the next
** entry will be the next page, but in aggregated mode (pCsr->isAgg!=0),
** the next entry is the next btree.
@@ -205898,7 +216989,7 @@ static int statNext(sqlite3_vtab_cursor *pCursor){
pCsr->zPath = 0;
statNextRestart:
- if( pCsr->aPage[0].pPg==0 ){
+ if( pCsr->iPage<0 ){
/* Start measuring space on the next btree */
statResetCounts(pCsr);
rc = sqlite3_step(pCsr->pStmt);
@@ -205910,7 +217001,7 @@ statNextRestart:
pCsr->isEof = 1;
return sqlite3_reset(pCsr->pStmt);
}
- rc = sqlite3PagerGet(pPager, iRoot, &pCsr->aPage[0].pPg, 0);
+ rc = statGetPage(pBt, iRoot, &pCsr->aPage[0]);
pCsr->aPage[0].iPgno = iRoot;
pCsr->aPage[0].iCell = 0;
if( !pCsr->isAgg ){
@@ -205961,9 +217052,8 @@ statNextRestart:
if( !p->iRightChildPg || p->iCell>p->nCell ){
statClearPage(p);
- if( pCsr->iPage>0 ){
- pCsr->iPage--;
- }else if( pCsr->isAgg ){
+ pCsr->iPage--;
+ if( pCsr->isAgg && pCsr->iPage<0 ){
/* label-statNext-done: When computing aggregate space usage over
** an entire btree, this is the exit point from this function */
return SQLITE_OK;
@@ -205982,7 +217072,7 @@ statNextRestart:
}else{
p[1].iPgno = p->aCell[p->iCell].iChildPg;
}
- rc = sqlite3PagerGet(pPager, p[1].iPgno, &p[1].pPg, 0);
+ rc = statGetPage(pBt, p[1].iPgno, &p[1]);
pCsr->nPage++;
p[1].iCell = 0;
if( !pCsr->isAgg ){
@@ -206063,6 +217153,8 @@ static int statFilter(
int iArg = 0; /* Count of argv[] parameters used so far */
int rc = SQLITE_OK; /* Result of this operation */
const char *zName = 0; /* Only provide analysis of this table */
+ (void)argc;
+ (void)idxStr;
statResetCsr(pCsr);
sqlite3_finalize(pCsr->pStmt);
@@ -206112,6 +217204,7 @@ static int statFilter(
}
if( rc==SQLITE_OK ){
+ pCsr->iPage = -1;
rc = statNext(pCursor);
}
return rc;
@@ -206145,16 +217238,16 @@ static int statColumn(
}
break;
case 4: /* ncell */
- sqlite3_result_int(ctx, pCsr->nCell);
+ sqlite3_result_int64(ctx, pCsr->nCell);
break;
case 5: /* payload */
- sqlite3_result_int(ctx, pCsr->nPayload);
+ sqlite3_result_int64(ctx, pCsr->nPayload);
break;
case 6: /* unused */
- sqlite3_result_int(ctx, pCsr->nUnused);
+ sqlite3_result_int64(ctx, pCsr->nUnused);
break;
case 7: /* mx_payload */
- sqlite3_result_int(ctx, pCsr->nMxPayload);
+ sqlite3_result_int64(ctx, pCsr->nMxPayload);
break;
case 8: /* pgoffset */
if( !pCsr->isAgg ){
@@ -206162,7 +217255,7 @@ static int statColumn(
}
break;
case 9: /* pgsize */
- sqlite3_result_int(ctx, pCsr->szPage);
+ sqlite3_result_int64(ctx, pCsr->szPage);
break;
case 10: { /* schema */
sqlite3 *db = sqlite3_context_db_handle(ctx);
@@ -206296,8 +217389,13 @@ static int dbpageConnect(
){
DbpageTable *pTab = 0;
int rc = SQLITE_OK;
+ (void)pAux;
+ (void)argc;
+ (void)argv;
+ (void)pzErr;
sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
+ sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS);
rc = sqlite3_declare_vtab(db,
"CREATE TABLE x(pgno INTEGER PRIMARY KEY, data BLOB, schema HIDDEN)");
if( rc==SQLITE_OK ){
@@ -206334,6 +217432,7 @@ static int dbpageDisconnect(sqlite3_vtab *pVtab){
static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
int i;
int iPlan = 0;
+ (void)tab;
/* If there is a schema= constraint, it must be honored. Report a
** ridiculously large estimated cost if the schema= constraint is
@@ -206448,6 +217547,8 @@ static int dbpageFilter(
sqlite3 *db = pTab->db;
Btree *pBt;
+ (void)idxStr;
+
/* Default setting is no rows of result */
pCsr->pgno = 1;
pCsr->mxPgno = 0;
@@ -206462,7 +217563,7 @@ static int dbpageFilter(
pCsr->iDb = 0;
}
pBt = db->aDb[pCsr->iDb].pBt;
- if( pBt==0 ) return SQLITE_OK;
+ if( NEVER(pBt==0) ) return SQLITE_OK;
pCsr->pPager = sqlite3BtreePager(pBt);
pCsr->szPage = sqlite3BtreeGetPageSize(pBt);
pCsr->mxPgno = sqlite3BtreeLastPage(pBt);
@@ -206497,12 +217598,18 @@ static int dbpageColumn(
}
case 1: { /* data */
DbPage *pDbPage = 0;
- rc = sqlite3PagerGet(pCsr->pPager, pCsr->pgno, (DbPage**)&pDbPage, 0);
- if( rc==SQLITE_OK ){
- sqlite3_result_blob(ctx, sqlite3PagerGetData(pDbPage), pCsr->szPage,
- SQLITE_TRANSIENT);
+ if( pCsr->pgno==((PENDING_BYTE/pCsr->szPage)+1) ){
+ /* The pending byte page. Assume it is zeroed out. Attempting to
+ ** request this page from the page is an SQLITE_CORRUPT error. */
+ sqlite3_result_zeroblob(ctx, pCsr->szPage);
+ }else{
+ rc = sqlite3PagerGet(pCsr->pPager, pCsr->pgno, (DbPage**)&pDbPage, 0);
+ if( rc==SQLITE_OK ){
+ sqlite3_result_blob(ctx, sqlite3PagerGetData(pDbPage), pCsr->szPage,
+ SQLITE_TRANSIENT);
+ }
+ sqlite3PagerUnref(pDbPage);
}
- sqlite3PagerUnref(pDbPage);
break;
}
default: { /* schema */
@@ -206511,7 +217618,7 @@ static int dbpageColumn(
break;
}
}
- return SQLITE_OK;
+ return rc;
}
static int dbpageRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
@@ -206537,6 +217644,7 @@ static int dbpageUpdate(
Pager *pPager;
int szPage;
+ (void)pRowid;
if( pTab->db->flags & SQLITE_Defensive ){
zErr = "read-only";
goto update_fail;
@@ -206546,18 +217654,20 @@ static int dbpageUpdate(
goto update_fail;
}
pgno = sqlite3_value_int(argv[0]);
- if( (Pgno)sqlite3_value_int(argv[1])!=pgno ){
+ if( sqlite3_value_type(argv[0])==SQLITE_NULL
+ || (Pgno)sqlite3_value_int(argv[1])!=pgno
+ ){
zErr = "cannot insert";
goto update_fail;
}
zSchema = (const char*)sqlite3_value_text(argv[4]);
- iDb = zSchema ? sqlite3FindDbName(pTab->db, zSchema) : -1;
- if( iDb<0 ){
+ iDb = ALWAYS(zSchema) ? sqlite3FindDbName(pTab->db, zSchema) : -1;
+ if( NEVER(iDb<0) ){
zErr = "no such schema";
goto update_fail;
}
pBt = pTab->db->aDb[iDb].pBt;
- if( pgno<1 || pBt==0 || pgno>(int)sqlite3BtreeLastPage(pBt) ){
+ if( NEVER(pgno<1) || NEVER(pBt==0) || NEVER(pgno>sqlite3BtreeLastPage(pBt)) ){
zErr = "bad page number";
goto update_fail;
}
@@ -206571,11 +217681,12 @@ static int dbpageUpdate(
pPager = sqlite3BtreePager(pBt);
rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pDbPage, 0);
if( rc==SQLITE_OK ){
- rc = sqlite3PagerWrite(pDbPage);
- if( rc==SQLITE_OK ){
- memcpy(sqlite3PagerGetData(pDbPage),
- sqlite3_value_blob(argv[3]),
- szPage);
+ const void *pData = sqlite3_value_blob(argv[3]);
+ assert( pData!=0 || pTab->db->mallocFailed );
+ if( pData
+ && (rc = sqlite3PagerWrite(pDbPage))==SQLITE_OK
+ ){
+ memcpy(sqlite3PagerGetData(pDbPage), pData, szPage);
}
}
sqlite3PagerUnref(pDbPage);
@@ -206597,7 +217708,7 @@ static int dbpageBegin(sqlite3_vtab *pVtab){
int i;
for(i=0; i<db->nDb; i++){
Btree *pBt = db->aDb[i].pBt;
- if( pBt ) sqlite3BtreeBeginTrans(pBt, 1, 0);
+ if( pBt ) (void)sqlite3BtreeBeginTrans(pBt, 1, 0);
}
return SQLITE_OK;
}
@@ -206668,6 +217779,8 @@ typedef struct SessionInput SessionInput;
# endif
#endif
+#define SESSIONS_ROWID "_rowid_"
+
static int sessions_strm_chunk_size = SESSIONS_STRM_CHUNK_SIZE;
typedef struct SessionHook SessionHook;
@@ -206689,6 +217802,7 @@ struct sqlite3_session {
int bEnable; /* True if currently recording */
int bIndirect; /* True if all changes are indirect */
int bAutoAttach; /* True to auto-attach tables */
+ int bImplicitPK; /* True to handle tables with implicit PK */
int rc; /* Non-zero if an error has occurred */
void *pFilterCtx; /* First argument to pass to xTableFilter */
int (*xTableFilter)(void *pCtx, const char *zTab);
@@ -206765,6 +217879,7 @@ struct SessionTable {
char *zName; /* Local name of table */
int nCol; /* Number of columns in table zName */
int bStat1; /* True if this is sqlite_stat1 */
+ int bRowid; /* True if this table uses rowid for PK */
const char **azCol; /* Column names */
u8 *abPK; /* Array of primary key flags */
int nEntry; /* Total number of entries in hash table */
@@ -207063,7 +218178,7 @@ static int sessionSerializeValue(
if( aBuf ){
sessionVarintPut(&aBuf[1], n);
- if( n ) memcpy(&aBuf[nVarint + 1], z, n);
+ if( n>0 ) memcpy(&aBuf[nVarint + 1], z, n);
}
nByte = 1 + nVarint + n;
@@ -207157,6 +218272,7 @@ static unsigned int sessionHashAppendType(unsigned int h, int eType){
*/
static int sessionPreupdateHash(
sqlite3_session *pSession, /* Session object that owns pTab */
+ i64 iRowid,
SessionTable *pTab, /* Session table handle */
int bNew, /* True to hash the new.* PK */
int *piHash, /* OUT: Hash value */
@@ -207165,48 +218281,53 @@ static int sessionPreupdateHash(
unsigned int h = 0; /* Hash value to return */
int i; /* Used to iterate through columns */
- assert( *pbNullPK==0 );
- assert( pTab->nCol==pSession->hook.xCount(pSession->hook.pCtx) );
- for(i=0; i<pTab->nCol; i++){
- if( pTab->abPK[i] ){
- int rc;
- int eType;
- sqlite3_value *pVal;
-
- if( bNew ){
- rc = pSession->hook.xNew(pSession->hook.pCtx, i, &pVal);
- }else{
- rc = pSession->hook.xOld(pSession->hook.pCtx, i, &pVal);
- }
- if( rc!=SQLITE_OK ) return rc;
+ if( pTab->bRowid ){
+ assert( pTab->nCol-1==pSession->hook.xCount(pSession->hook.pCtx) );
+ h = sessionHashAppendI64(h, iRowid);
+ }else{
+ assert( *pbNullPK==0 );
+ assert( pTab->nCol==pSession->hook.xCount(pSession->hook.pCtx) );
+ for(i=0; i<pTab->nCol; i++){
+ if( pTab->abPK[i] ){
+ int rc;
+ int eType;
+ sqlite3_value *pVal;
- eType = sqlite3_value_type(pVal);
- h = sessionHashAppendType(h, eType);
- if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
- i64 iVal;
- if( eType==SQLITE_INTEGER ){
- iVal = sqlite3_value_int64(pVal);
+ if( bNew ){
+ rc = pSession->hook.xNew(pSession->hook.pCtx, i, &pVal);
}else{
- double rVal = sqlite3_value_double(pVal);
- assert( sizeof(iVal)==8 && sizeof(rVal)==8 );
- memcpy(&iVal, &rVal, 8);
+ rc = pSession->hook.xOld(pSession->hook.pCtx, i, &pVal);
}
- h = sessionHashAppendI64(h, iVal);
- }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){
- const u8 *z;
- int n;
- if( eType==SQLITE_TEXT ){
- z = (const u8 *)sqlite3_value_text(pVal);
+ if( rc!=SQLITE_OK ) return rc;
+
+ eType = sqlite3_value_type(pVal);
+ h = sessionHashAppendType(h, eType);
+ if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
+ i64 iVal;
+ if( eType==SQLITE_INTEGER ){
+ iVal = sqlite3_value_int64(pVal);
+ }else{
+ double rVal = sqlite3_value_double(pVal);
+ assert( sizeof(iVal)==8 && sizeof(rVal)==8 );
+ memcpy(&iVal, &rVal, 8);
+ }
+ h = sessionHashAppendI64(h, iVal);
+ }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){
+ const u8 *z;
+ int n;
+ if( eType==SQLITE_TEXT ){
+ z = (const u8 *)sqlite3_value_text(pVal);
+ }else{
+ z = (const u8 *)sqlite3_value_blob(pVal);
+ }
+ n = sqlite3_value_bytes(pVal);
+ if( !z && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM;
+ h = sessionHashAppendBlob(h, n, z);
}else{
- z = (const u8 *)sqlite3_value_blob(pVal);
+ assert( eType==SQLITE_NULL );
+ assert( pTab->bStat1==0 || i!=1 );
+ *pbNullPK = 1;
}
- n = sqlite3_value_bytes(pVal);
- if( !z && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM;
- h = sessionHashAppendBlob(h, n, z);
- }else{
- assert( eType==SQLITE_NULL );
- assert( pTab->bStat1==0 || i!=1 );
- *pbNullPK = 1;
}
}
}
@@ -207489,6 +218610,7 @@ static int sessionMergeUpdate(
*/
static int sessionPreupdateEqual(
sqlite3_session *pSession, /* Session object that owns SessionTable */
+ i64 iRowid, /* Rowid value if pTab->bRowid */
SessionTable *pTab, /* Table associated with change */
SessionChange *pChange, /* Change to compare to */
int op /* Current pre-update operation */
@@ -207496,6 +218618,11 @@ static int sessionPreupdateEqual(
int iCol; /* Used to iterate through columns */
u8 *a = pChange->aRecord; /* Cursor used to scan change record */
+ if( pTab->bRowid ){
+ if( a[0]!=SQLITE_INTEGER ) return 0;
+ return sessionGetI64(&a[1])==iRowid;
+ }
+
assert( op==SQLITE_INSERT || op==SQLITE_UPDATE || op==SQLITE_DELETE );
for(iCol=0; iCol<pTab->nCol; iCol++){
if( !pTab->abPK[iCol] ){
@@ -207640,7 +218767,8 @@ static int sessionTableInfo(
int *pnCol, /* OUT: number of columns */
const char **pzTab, /* OUT: Copy of zThis */
const char ***pazCol, /* OUT: Array of column names for table */
- u8 **pabPK /* OUT: Array of booleans - true for PK col */
+ u8 **pabPK, /* OUT: Array of booleans - true for PK col */
+ int *pbRowid /* OUT: True if only PK is a rowid */
){
char *zPragma;
sqlite3_stmt *pStmt;
@@ -207652,6 +218780,7 @@ static int sessionTableInfo(
u8 *pAlloc = 0;
char **azCol = 0;
u8 *abPK = 0;
+ int bRowid = 0; /* Set to true to use rowid as PK */
assert( pazCol && pabPK );
@@ -207668,22 +218797,43 @@ static int sessionTableInfo(
}else if( rc==SQLITE_ERROR ){
zPragma = sqlite3_mprintf("");
}else{
+ *pazCol = 0;
+ *pabPK = 0;
+ *pnCol = 0;
+ if( pzTab ) *pzTab = 0;
return rc;
}
}else{
zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis);
}
- if( !zPragma ) return SQLITE_NOMEM;
+ if( !zPragma ){
+ *pazCol = 0;
+ *pabPK = 0;
+ *pnCol = 0;
+ if( pzTab ) *pzTab = 0;
+ return SQLITE_NOMEM;
+ }
rc = sqlite3_prepare_v2(db, zPragma, -1, &pStmt, 0);
sqlite3_free(zPragma);
- if( rc!=SQLITE_OK ) return rc;
+ if( rc!=SQLITE_OK ){
+ *pazCol = 0;
+ *pabPK = 0;
+ *pnCol = 0;
+ if( pzTab ) *pzTab = 0;
+ return rc;
+ }
nByte = nThis + 1;
+ bRowid = (pbRowid!=0);
while( SQLITE_ROW==sqlite3_step(pStmt) ){
nByte += sqlite3_column_bytes(pStmt, 1);
nDbCol++;
+ if( sqlite3_column_int(pStmt, 5) ) bRowid = 0;
}
+ if( nDbCol==0 ) bRowid = 0;
+ nDbCol += bRowid;
+ nByte += strlen(SESSIONS_ROWID);
rc = sqlite3_reset(pStmt);
if( rc==SQLITE_OK ){
@@ -207705,6 +218855,14 @@ static int sessionTableInfo(
}
i = 0;
+ if( bRowid ){
+ size_t nName = strlen(SESSIONS_ROWID);
+ memcpy(pAlloc, SESSIONS_ROWID, nName+1);
+ azCol[i] = (char*)pAlloc;
+ pAlloc += nName+1;
+ abPK[i] = 1;
+ i++;
+ }
while( SQLITE_ROW==sqlite3_step(pStmt) ){
int nName = sqlite3_column_bytes(pStmt, 1);
const unsigned char *zName = sqlite3_column_text(pStmt, 1);
@@ -207716,7 +218874,6 @@ static int sessionTableInfo(
i++;
}
rc = sqlite3_reset(pStmt);
-
}
/* If successful, populate the output variables. Otherwise, zero them and
@@ -207733,6 +218890,7 @@ static int sessionTableInfo(
if( pzTab ) *pzTab = 0;
sessionFree(pSession, azCol);
}
+ if( pbRowid ) *pbRowid = bRowid;
sqlite3_finalize(pStmt);
return rc;
}
@@ -207754,7 +218912,8 @@ static int sessionInitTable(sqlite3_session *pSession, SessionTable *pTab){
u8 *abPK;
assert( pTab->azCol==0 || pTab->abPK==0 );
pSession->rc = sessionTableInfo(pSession, pSession->db, pSession->zDb,
- pTab->zName, &pTab->nCol, 0, &pTab->azCol, &abPK
+ pTab->zName, &pTab->nCol, 0, &pTab->azCol, &abPK,
+ (pSession->bImplicitPK ? &pTab->bRowid : 0)
);
if( pSession->rc==SQLITE_OK ){
int i;
@@ -207826,6 +218985,7 @@ static int sessionUpdateMaxSize(
){
i64 nNew = 2;
if( pC->op==SQLITE_INSERT ){
+ if( pTab->bRowid ) nNew += 9;
if( op!=SQLITE_DELETE ){
int ii;
for(ii=0; ii<pTab->nCol; ii++){
@@ -207842,12 +219002,16 @@ static int sessionUpdateMaxSize(
}else{
int ii;
u8 *pCsr = pC->aRecord;
- for(ii=0; ii<pTab->nCol; ii++){
+ if( pTab->bRowid ){
+ nNew += 9 + 1;
+ pCsr += 9;
+ }
+ for(ii=pTab->bRowid; ii<pTab->nCol; ii++){
int bChanged = 1;
int nOld = 0;
int eType;
sqlite3_value *p = 0;
- pSession->hook.xNew(pSession->hook.pCtx, ii, &p);
+ pSession->hook.xNew(pSession->hook.pCtx, ii-pTab->bRowid, &p);
if( p==0 ){
return SQLITE_NOMEM;
}
@@ -207926,6 +219090,7 @@ static int sessionUpdateMaxSize(
*/
static void sessionPreupdateOneChange(
int op, /* One of SQLITE_UPDATE, INSERT, DELETE */
+ i64 iRowid,
sqlite3_session *pSession, /* Session object pTab is attached to */
SessionTable *pTab /* Table that change applies to */
){
@@ -207941,7 +219106,7 @@ static void sessionPreupdateOneChange(
/* Check the number of columns in this xPreUpdate call matches the
** number of columns in the table. */
- if( pTab->nCol!=pSession->hook.xCount(pSession->hook.pCtx) ){
+ if( (pTab->nCol-pTab->bRowid)!=pSession->hook.xCount(pSession->hook.pCtx) ){
pSession->rc = SQLITE_SCHEMA;
return;
}
@@ -207974,14 +219139,16 @@ static void sessionPreupdateOneChange(
/* Calculate the hash-key for this change. If the primary key of the row
** includes a NULL value, exit early. Such changes are ignored by the
** session module. */
- rc = sessionPreupdateHash(pSession, pTab, op==SQLITE_INSERT, &iHash, &bNull);
+ rc = sessionPreupdateHash(
+ pSession, iRowid, pTab, op==SQLITE_INSERT, &iHash, &bNull
+ );
if( rc!=SQLITE_OK ) goto error_out;
if( bNull==0 ){
/* Search the hash table for an existing record for this row. */
SessionChange *pC;
for(pC=pTab->apChange[iHash]; pC; pC=pC->pNext){
- if( sessionPreupdateEqual(pSession, pTab, pC, op) ) break;
+ if( sessionPreupdateEqual(pSession, iRowid, pTab, pC, op) ) break;
}
if( pC==0 ){
@@ -207996,7 +219163,7 @@ static void sessionPreupdateOneChange(
/* Figure out how large an allocation is required */
nByte = sizeof(SessionChange);
- for(i=0; i<pTab->nCol; i++){
+ for(i=0; i<(pTab->nCol-pTab->bRowid); i++){
sqlite3_value *p = 0;
if( op!=SQLITE_INSERT ){
TESTONLY(int trc = ) pSession->hook.xOld(pSession->hook.pCtx, i, &p);
@@ -208011,6 +219178,9 @@ static void sessionPreupdateOneChange(
rc = sessionSerializeValue(0, p, &nByte);
if( rc!=SQLITE_OK ) goto error_out;
}
+ if( pTab->bRowid ){
+ nByte += 9; /* Size of rowid field - an integer */
+ }
/* Allocate the change object */
pC = (SessionChange *)sessionMalloc64(pSession, nByte);
@@ -208027,7 +219197,12 @@ static void sessionPreupdateOneChange(
** required values and encodings have already been cached in memory.
** It is not possible for an OOM to occur in this block. */
nByte = 0;
- for(i=0; i<pTab->nCol; i++){
+ if( pTab->bRowid ){
+ pC->aRecord[0] = SQLITE_INTEGER;
+ sessionPutI64(&pC->aRecord[1], iRowid);
+ nByte = 9;
+ }
+ for(i=0; i<(pTab->nCol-pTab->bRowid); i++){
sqlite3_value *p = 0;
if( op!=SQLITE_INSERT ){
pSession->hook.xOld(pSession->hook.pCtx, i, &p);
@@ -208095,7 +219270,11 @@ static int sessionFindTable(
){
rc = sqlite3session_attach(pSession, zName);
if( rc==SQLITE_OK ){
- for(pRet=pSession->pTable; pRet->pNext; pRet=pRet->pNext);
+ pRet = pSession->pTable;
+ while( ALWAYS(pRet) && pRet->pNext ){
+ pRet = pRet->pNext;
+ }
+ assert( pRet!=0 );
assert( 0==sqlite3_strnicmp(pRet->zName, zName, nName+1) );
}
}
@@ -208122,6 +219301,8 @@ static void xPreUpdate(
int nDb = sqlite3Strlen30(zDb);
assert( sqlite3_mutex_held(db->mutex) );
+ (void)iKey1;
+ (void)iKey2;
for(pSession=(sqlite3_session *)pCtx; pSession; pSession=pSession->pNext){
SessionTable *pTab;
@@ -208136,9 +219317,10 @@ static void xPreUpdate(
pSession->rc = sessionFindTable(pSession, zName, &pTab);
if( pTab ){
assert( pSession->rc==SQLITE_OK );
- sessionPreupdateOneChange(op, pSession, pTab);
+ assert( op==SQLITE_UPDATE || iKey1==iKey2 );
+ sessionPreupdateOneChange(op, iKey1, pSession, pTab);
if( op==SQLITE_UPDATE ){
- sessionPreupdateOneChange(SQLITE_INSERT, pSession, pTab);
+ sessionPreupdateOneChange(SQLITE_INSERT, iKey2, pSession, pTab);
}
}
}
@@ -208177,6 +219359,7 @@ static void sessionPreupdateHooks(
typedef struct SessionDiffCtx SessionDiffCtx;
struct SessionDiffCtx {
sqlite3_stmt *pStmt;
+ int bRowid;
int nOldOff;
};
@@ -208185,19 +219368,20 @@ struct SessionDiffCtx {
*/
static int sessionDiffOld(void *pCtx, int iVal, sqlite3_value **ppVal){
SessionDiffCtx *p = (SessionDiffCtx*)pCtx;
- *ppVal = sqlite3_column_value(p->pStmt, iVal+p->nOldOff);
+ *ppVal = sqlite3_column_value(p->pStmt, iVal+p->nOldOff+p->bRowid);
return SQLITE_OK;
}
static int sessionDiffNew(void *pCtx, int iVal, sqlite3_value **ppVal){
SessionDiffCtx *p = (SessionDiffCtx*)pCtx;
- *ppVal = sqlite3_column_value(p->pStmt, iVal);
+ *ppVal = sqlite3_column_value(p->pStmt, iVal+p->bRowid);
return SQLITE_OK;
}
static int sessionDiffCount(void *pCtx){
SessionDiffCtx *p = (SessionDiffCtx*)pCtx;
- return p->nOldOff ? p->nOldOff : sqlite3_column_count(p->pStmt);
+ return (p->nOldOff ? p->nOldOff : sqlite3_column_count(p->pStmt)) - p->bRowid;
}
static int sessionDiffDepth(void *pCtx){
+ (void)pCtx;
return 0;
}
@@ -208271,17 +219455,18 @@ static char *sessionExprCompareOther(
}
static char *sessionSelectFindNew(
- int nCol,
const char *zDb1, /* Pick rows in this db only */
const char *zDb2, /* But not in this one */
+ int bRowid,
const char *zTbl, /* Table name */
const char *zExpr
){
+ const char *zSel = (bRowid ? SESSIONS_ROWID ", *" : "*");
char *zRet = sqlite3_mprintf(
- "SELECT * FROM \"%w\".\"%w\" WHERE NOT EXISTS ("
+ "SELECT %s FROM \"%w\".\"%w\" WHERE NOT EXISTS ("
" SELECT 1 FROM \"%w\".\"%w\" WHERE %s"
")",
- zDb1, zTbl, zDb2, zTbl, zExpr
+ zSel, zDb1, zTbl, zDb2, zTbl, zExpr
);
return zRet;
}
@@ -208295,7 +219480,9 @@ static int sessionDiffFindNew(
char *zExpr
){
int rc = SQLITE_OK;
- char *zStmt = sessionSelectFindNew(pTab->nCol, zDb1, zDb2, pTab->zName,zExpr);
+ char *zStmt = sessionSelectFindNew(
+ zDb1, zDb2, pTab->bRowid, pTab->zName, zExpr
+ );
if( zStmt==0 ){
rc = SQLITE_NOMEM;
@@ -208306,8 +219493,10 @@ static int sessionDiffFindNew(
SessionDiffCtx *pDiffCtx = (SessionDiffCtx*)pSession->hook.pCtx;
pDiffCtx->pStmt = pStmt;
pDiffCtx->nOldOff = 0;
+ pDiffCtx->bRowid = pTab->bRowid;
while( SQLITE_ROW==sqlite3_step(pStmt) ){
- sessionPreupdateOneChange(op, pSession, pTab);
+ i64 iRowid = (pTab->bRowid ? sqlite3_column_int64(pStmt, 0) : 0);
+ sessionPreupdateOneChange(op, iRowid, pSession, pTab);
}
rc = sqlite3_finalize(pStmt);
}
@@ -208317,6 +219506,27 @@ static int sessionDiffFindNew(
return rc;
}
+/*
+** Return a comma-separated list of the fully-qualified (with both database
+** and table name) column names from table pTab. e.g.
+**
+** "main"."t1"."a", "main"."t1"."b", "main"."t1"."c"
+*/
+static char *sessionAllCols(
+ const char *zDb,
+ SessionTable *pTab
+){
+ int ii;
+ char *zRet = 0;
+ for(ii=0; ii<pTab->nCol; ii++){
+ zRet = sqlite3_mprintf("%z%s\"%w\".\"%w\".\"%w\"",
+ zRet, (zRet ? ", " : ""), zDb, pTab->zName, pTab->azCol[ii]
+ );
+ if( !zRet ) break;
+ }
+ return zRet;
+}
+
static int sessionDiffFindModified(
sqlite3_session *pSession,
SessionTable *pTab,
@@ -208331,11 +219541,13 @@ static int sessionDiffFindModified(
if( zExpr2==0 ){
rc = SQLITE_NOMEM;
}else{
+ char *z1 = sessionAllCols(pSession->zDb, pTab);
+ char *z2 = sessionAllCols(zFrom, pTab);
char *zStmt = sqlite3_mprintf(
- "SELECT * FROM \"%w\".\"%w\", \"%w\".\"%w\" WHERE %s AND (%z)",
- pSession->zDb, pTab->zName, zFrom, pTab->zName, zExpr, zExpr2
+ "SELECT %s,%s FROM \"%w\".\"%w\", \"%w\".\"%w\" WHERE %s AND (%z)",
+ z1, z2, pSession->zDb, pTab->zName, zFrom, pTab->zName, zExpr, zExpr2
);
- if( zStmt==0 ){
+ if( zStmt==0 || z1==0 || z2==0 ){
rc = SQLITE_NOMEM;
}else{
sqlite3_stmt *pStmt;
@@ -208346,12 +219558,15 @@ static int sessionDiffFindModified(
pDiffCtx->pStmt = pStmt;
pDiffCtx->nOldOff = pTab->nCol;
while( SQLITE_ROW==sqlite3_step(pStmt) ){
- sessionPreupdateOneChange(SQLITE_UPDATE, pSession, pTab);
+ i64 iRowid = (pTab->bRowid ? sqlite3_column_int64(pStmt, 0) : 0);
+ sessionPreupdateOneChange(SQLITE_UPDATE, iRowid, pSession, pTab);
}
rc = sqlite3_finalize(pStmt);
}
- sqlite3_free(zStmt);
}
+ sqlite3_free(zStmt);
+ sqlite3_free(z1);
+ sqlite3_free(z2);
}
return rc;
@@ -208390,9 +219605,12 @@ SQLITE_API int sqlite3session_diff(
int bHasPk = 0;
int bMismatch = 0;
int nCol; /* Columns in zFrom.zTbl */
+ int bRowid = 0;
u8 *abPK;
const char **azCol = 0;
- rc = sessionTableInfo(0, db, zFrom, zTbl, &nCol, 0, &azCol, &abPK);
+ rc = sessionTableInfo(0, db, zFrom, zTbl, &nCol, 0, &azCol, &abPK,
+ pSession->bImplicitPK ? &bRowid : 0
+ );
if( rc==SQLITE_OK ){
if( pTo->nCol!=nCol ){
bMismatch = 1;
@@ -208734,9 +219952,10 @@ static void sessionAppendStr(
int *pRc
){
int nStr = sqlite3Strlen30(zStr);
- if( 0==sessionBufferGrow(p, nStr, pRc) ){
+ if( 0==sessionBufferGrow(p, nStr+1, pRc) ){
memcpy(&p->aBuf[p->nBuf], zStr, nStr);
p->nBuf += nStr;
+ p->aBuf[p->nBuf] = 0x00;
}
}
@@ -208758,6 +219977,27 @@ static void sessionAppendInteger(
sessionAppendStr(p, aBuf, pRc);
}
+static void sessionAppendPrintf(
+ SessionBuffer *p, /* Buffer to append to */
+ int *pRc,
+ const char *zFmt,
+ ...
+){
+ if( *pRc==SQLITE_OK ){
+ char *zApp = 0;
+ va_list ap;
+ va_start(ap, zFmt);
+ zApp = sqlite3_vmprintf(zFmt, ap);
+ if( zApp==0 ){
+ *pRc = SQLITE_NOMEM;
+ }else{
+ sessionAppendStr(p, zApp, pRc);
+ }
+ va_end(ap);
+ sqlite3_free(zApp);
+ }
+}
+
/*
** This function is a no-op if *pRc is other than SQLITE_OK when it is
** called. Otherwise, append the string zStr enclosed in quotes (") and
@@ -208772,7 +220012,7 @@ static void sessionAppendIdent(
const char *zStr, /* String to quote, escape and append */
int *pRc /* IN/OUT: Error code */
){
- int nStr = sqlite3Strlen30(zStr)*2 + 2 + 1;
+ int nStr = sqlite3Strlen30(zStr)*2 + 2 + 2;
if( 0==sessionBufferGrow(p, nStr, pRc) ){
char *zOut = (char *)&p->aBuf[p->nBuf];
const char *zIn = zStr;
@@ -208783,6 +220023,7 @@ static void sessionAppendIdent(
}
*zOut++ = '"';
p->nBuf = (int)((u8 *)zOut - p->aBuf);
+ p->aBuf[p->nBuf] = 0x00;
}
}
@@ -208868,6 +220109,7 @@ static int sessionAppendUpdate(
int i; /* Used to iterate through columns */
u8 *pCsr = p->aRecord; /* Used to iterate through old.* values */
+ assert( abPK!=0 );
sessionAppendByte(pBuf, SQLITE_UPDATE, &rc);
sessionAppendByte(pBuf, p->bIndirect, &rc);
for(i=0; i<sqlite3_column_count(pStmt); i++){
@@ -208917,7 +220159,7 @@ static int sessionAppendUpdate(
/* If at least one field has been modified, this is not a no-op. */
if( bChanged ) bNoop = 0;
- /* Add a field to the old.* record. This is omitted if this modules is
+ /* Add a field to the old.* record. This is omitted if this module is
** currently generating a patchset. */
if( bPatchset==0 ){
if( bChanged || abPK[i] ){
@@ -209006,12 +220248,20 @@ static int sessionAppendDelete(
** Formulate and prepare a SELECT statement to retrieve a row from table
** zTab in database zDb based on its primary key. i.e.
**
-** SELECT * FROM zDb.zTab WHERE pk1 = ? AND pk2 = ? AND ...
+** SELECT *, <noop-test> FROM zDb.zTab WHERE (pk1, pk2,...) IS (?1, ?2,...)
+**
+** where <noop-test> is:
+**
+** 1 AND (?A OR ?1 IS <column>) AND ...
+**
+** for each non-pk <column>.
*/
static int sessionSelectStmt(
sqlite3 *db, /* Database handle */
+ int bIgnoreNoop,
const char *zDb, /* Database name */
const char *zTab, /* Table name */
+ int bRowid,
int nCol, /* Number of columns in table */
const char **azCol, /* Names of table columns */
u8 *abPK, /* PRIMARY KEY array */
@@ -209019,8 +220269,50 @@ static int sessionSelectStmt(
){
int rc = SQLITE_OK;
char *zSql = 0;
+ const char *zSep = "";
+ const char *zCols = bRowid ? SESSIONS_ROWID ", *" : "*";
int nSql = -1;
+ int i;
+
+ SessionBuffer nooptest = {0, 0, 0};
+ SessionBuffer pkfield = {0, 0, 0};
+ SessionBuffer pkvar = {0, 0, 0};
+
+ sessionAppendStr(&nooptest, ", 1", &rc);
+
+ if( 0==sqlite3_stricmp("sqlite_stat1", zTab) ){
+ sessionAppendStr(&nooptest, " AND (?6 OR ?3 IS stat)", &rc);
+ sessionAppendStr(&pkfield, "tbl, idx", &rc);
+ sessionAppendStr(&pkvar,
+ "?1, (CASE WHEN ?2=X'' THEN NULL ELSE ?2 END)", &rc
+ );
+ zCols = "tbl, ?2, stat";
+ }else{
+ for(i=0; i<nCol; i++){
+ if( abPK[i] ){
+ sessionAppendStr(&pkfield, zSep, &rc);
+ sessionAppendStr(&pkvar, zSep, &rc);
+ zSep = ", ";
+ sessionAppendIdent(&pkfield, azCol[i], &rc);
+ sessionAppendPrintf(&pkvar, &rc, "?%d", i+1);
+ }else{
+ sessionAppendPrintf(&nooptest, &rc,
+ " AND (?%d OR ?%d IS %w.%w)", i+1+nCol, i+1, zTab, azCol[i]
+ );
+ }
+ }
+ }
+
+ if( rc==SQLITE_OK ){
+ zSql = sqlite3_mprintf(
+ "SELECT %s%s FROM %Q.%Q WHERE (%s) IS (%s)",
+ zCols, (bIgnoreNoop ? (char*)nooptest.aBuf : ""),
+ zDb, zTab, (char*)pkfield.aBuf, (char*)pkvar.aBuf
+ );
+ if( zSql==0 ) rc = SQLITE_NOMEM;
+ }
+#if 0
if( 0==sqlite3_stricmp("sqlite_stat1", zTab) ){
zSql = sqlite3_mprintf(
"SELECT tbl, ?2, stat FROM %Q.sqlite_stat1 WHERE tbl IS ?1 AND "
@@ -209028,7 +220320,6 @@ static int sessionSelectStmt(
);
if( zSql==0 ) rc = SQLITE_NOMEM;
}else{
- int i;
const char *zSep = "";
SessionBuffer buf = {0, 0, 0};
@@ -209049,11 +220340,15 @@ static int sessionSelectStmt(
zSql = (char*)buf.aBuf;
nSql = buf.nBuf;
}
+#endif
if( rc==SQLITE_OK ){
rc = sqlite3_prepare_v2(db, zSql, nSql, ppStmt, 0);
}
sqlite3_free(zSql);
+ sqlite3_free(nooptest.aBuf);
+ sqlite3_free(pkfield.aBuf);
+ sqlite3_free(pkvar.aBuf);
return rc;
}
@@ -209172,12 +220467,14 @@ static int sessionGenerateChangeset(
SessionBuffer buf = {0,0,0}; /* Buffer in which to accumlate changeset */
int rc; /* Return code */
- assert( xOutput==0 || (pnChangeset==0 && ppChangeset==0 ) );
+ assert( xOutput==0 || (pnChangeset==0 && ppChangeset==0) );
+ assert( xOutput!=0 || (pnChangeset!=0 && ppChangeset!=0) );
/* Zero the output variables in case an error occurs. If this session
** object is already in the error state (sqlite3_session.rc != SQLITE_OK),
** this call will be a no-op. */
if( xOutput==0 ){
+ assert( pnChangeset!=0 && ppChangeset!=0 );
*pnChangeset = 0;
*ppChangeset = 0;
}
@@ -209191,17 +220488,25 @@ static int sessionGenerateChangeset(
for(pTab=pSession->pTable; rc==SQLITE_OK && pTab; pTab=pTab->pNext){
if( pTab->nEntry ){
const char *zName = pTab->zName;
- int nCol; /* Number of columns in table */
- u8 *abPK; /* Primary key array */
+ int nCol = 0; /* Number of columns in table */
+ u8 *abPK = 0; /* Primary key array */
const char **azCol = 0; /* Table columns */
int i; /* Used to iterate through hash buckets */
sqlite3_stmt *pSel = 0; /* SELECT statement to query table pTab */
int nRewind = buf.nBuf; /* Initial size of write buffer */
int nNoop; /* Size of buffer after writing tbl header */
+ int bRowid = 0;
/* Check the table schema is still Ok. */
- rc = sessionTableInfo(0, db, pSession->zDb, zName, &nCol, 0,&azCol,&abPK);
- if( !rc && (pTab->nCol!=nCol || memcmp(abPK, pTab->abPK, nCol)) ){
+ rc = sessionTableInfo(
+ 0, db, pSession->zDb, zName, &nCol, 0, &azCol, &abPK,
+ (pSession->bImplicitPK ? &bRowid : 0)
+ );
+ if( rc==SQLITE_OK && (
+ pTab->nCol!=nCol
+ || pTab->bRowid!=bRowid
+ || memcmp(abPK, pTab->abPK, nCol)
+ )){
rc = SQLITE_SCHEMA;
}
@@ -209211,7 +220516,8 @@ static int sessionGenerateChangeset(
/* Build and compile a statement to execute: */
if( rc==SQLITE_OK ){
rc = sessionSelectStmt(
- db, pSession->zDb, zName, nCol, azCol, abPK, &pSel);
+ db, 0, pSession->zDb, zName, bRowid, nCol, azCol, abPK, &pSel
+ );
}
nNoop = buf.nBuf;
@@ -209230,6 +220536,7 @@ static int sessionGenerateChangeset(
sessionAppendCol(&buf, pSel, iCol, &rc);
}
}else{
+ assert( abPK!=0 ); /* Because sessionSelectStmt() returned ok */
rc = sessionAppendUpdate(&buf, bPatchset, pSel, p, abPK);
}
}else if( p->op!=SQLITE_INSERT ){
@@ -209290,7 +220597,10 @@ SQLITE_API int sqlite3session_changeset(
int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */
void **ppChangeset /* OUT: Buffer containing changeset */
){
- int rc = sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset,ppChangeset);
+ int rc;
+
+ if( pnChangeset==0 || ppChangeset==0 ) return SQLITE_MISUSE;
+ rc = sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset, ppChangeset);
assert( rc || pnChangeset==0
|| pSession->bEnableSize==0 || *pnChangeset<=pSession->nMaxChangesetSize
);
@@ -209305,6 +220615,7 @@ SQLITE_API int sqlite3session_changeset_strm(
int (*xOutput)(void *pOut, const void *pData, int nData),
void *pOut
){
+ if( xOutput==0 ) return SQLITE_MISUSE;
return sessionGenerateChangeset(pSession, 0, xOutput, pOut, 0, 0);
}
@@ -209316,6 +220627,7 @@ SQLITE_API int sqlite3session_patchset_strm(
int (*xOutput)(void *pOut, const void *pData, int nData),
void *pOut
){
+ if( xOutput==0 ) return SQLITE_MISUSE;
return sessionGenerateChangeset(pSession, 1, xOutput, pOut, 0, 0);
}
@@ -209331,6 +220643,7 @@ SQLITE_API int sqlite3session_patchset(
int *pnPatchset, /* OUT: Size of buffer at *ppChangeset */
void **ppPatchset /* OUT: Buffer containing changeset */
){
+ if( pnPatchset==0 || ppPatchset==0 ) return SQLITE_MISUSE;
return sessionGenerateChangeset(pSession, 1, 0, 0, pnPatchset, ppPatchset);
}
@@ -209405,6 +220718,19 @@ SQLITE_API int sqlite3session_object_config(sqlite3_session *pSession, int op, v
break;
}
+ case SQLITE_SESSION_OBJCONFIG_ROWID: {
+ int iArg = *(int*)pArg;
+ if( iArg>=0 ){
+ if( pSession->pTable ){
+ rc = SQLITE_MISUSE;
+ }else{
+ pSession->bImplicitPK = (iArg!=0);
+ }
+ }
+ *(int*)pArg = pSession->bImplicitPK;
+ break;
+ }
+
default:
rc = SQLITE_MISUSE;
}
@@ -209940,6 +221266,22 @@ static int sessionChangesetNextOne(
if( p->op==SQLITE_INSERT ) p->op = SQLITE_DELETE;
else if( p->op==SQLITE_DELETE ) p->op = SQLITE_INSERT;
}
+
+ /* If this is an UPDATE that is part of a changeset, then check that
+ ** there are no fields in the old.* record that are not (a) PK fields,
+ ** or (b) also present in the new.* record.
+ **
+ ** Such records are technically corrupt, but the rebaser was at one
+ ** point generating them. Under most circumstances this is benign, but
+ ** can cause spurious SQLITE_RANGE errors when applying the changeset. */
+ if( p->bPatchset==0 && p->op==SQLITE_UPDATE){
+ for(i=0; i<p->nCol; i++){
+ if( p->abPK[i]==0 && p->apValue[i+p->nCol]==0 ){
+ sqlite3ValueFree(p->apValue[i]);
+ p->apValue[i] = 0;
+ }
+ }
+ }
}
return SQLITE_ROW;
@@ -210294,11 +221636,11 @@ static int sessionChangesetInvert(
}
assert( rc==SQLITE_OK );
- if( pnInverted ){
+ if( pnInverted && ALWAYS(ppInverted) ){
*pnInverted = sOut.nBuf;
*ppInverted = sOut.aBuf;
sOut.aBuf = 0;
- }else if( sOut.nBuf>0 ){
+ }else if( sOut.nBuf>0 && ALWAYS(xOutput!=0) ){
rc = xOutput(pOut, sOut.aBuf, sOut.nBuf);
}
@@ -210377,6 +221719,8 @@ struct SessionApplyCtx {
SessionBuffer rebase; /* Rebase information (if any) here */
u8 bRebaseStarted; /* If table header is already in rebase */
u8 bRebase; /* True to collect rebase information */
+ u8 bIgnoreNoop; /* True to ignore no-op conflicts */
+ int bRowid;
};
/* Number of prepared UPDATE statements to cache. */
@@ -210627,8 +221971,10 @@ static int sessionSelectRow(
const char *zTab, /* Table name */
SessionApplyCtx *p /* Session changeset-apply context */
){
- return sessionSelectStmt(
- db, "main", zTab, p->nCol, p->azCol, p->abPK, &p->pSelect);
+ /* TODO */
+ return sessionSelectStmt(db, p->bIgnoreNoop,
+ "main", zTab, p->bRowid, p->nCol, p->azCol, p->abPK, &p->pSelect
+ );
}
/*
@@ -210754,7 +222100,7 @@ static int sessionBindRow(
for(i=0; rc==SQLITE_OK && i<nCol; i++){
if( !abPK || abPK[i] ){
- sqlite3_value *pVal;
+ sqlite3_value *pVal = 0;
(void)xValue(pIter, i, &pVal);
if( pVal==0 ){
/* The value in the changeset was "undefined". This indicates a
@@ -210786,22 +222132,34 @@ static int sessionBindRow(
** UPDATE, bind values from the old.* record.
*/
static int sessionSeekToRow(
- sqlite3 *db, /* Database handle */
sqlite3_changeset_iter *pIter, /* Changeset iterator */
- u8 *abPK, /* Primary key flags array */
- sqlite3_stmt *pSelect /* SELECT statement from sessionSelectRow() */
+ SessionApplyCtx *p
){
+ sqlite3_stmt *pSelect = p->pSelect;
int rc; /* Return code */
int nCol; /* Number of columns in table */
int op; /* Changset operation (SQLITE_UPDATE etc.) */
const char *zDummy; /* Unused */
+ sqlite3_clear_bindings(pSelect);
sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0);
rc = sessionBindRow(pIter,
op==SQLITE_INSERT ? sqlite3changeset_new : sqlite3changeset_old,
- nCol, abPK, pSelect
+ nCol, p->abPK, pSelect
);
+ if( op!=SQLITE_DELETE && p->bIgnoreNoop ){
+ int ii;
+ for(ii=0; rc==SQLITE_OK && ii<nCol; ii++){
+ if( p->abPK[ii]==0 ){
+ sqlite3_value *pVal = 0;
+ sqlite3changeset_new(pIter, ii, &pVal);
+ sqlite3_bind_int(pSelect, ii+1+nCol, (pVal==0));
+ if( pVal ) rc = sessionBindValue(pSelect, ii+1, pVal);
+ }
+ }
+ }
+
if( rc==SQLITE_OK ){
rc = sqlite3_step(pSelect);
if( rc!=SQLITE_ROW ) rc = sqlite3_reset(pSelect);
@@ -210916,16 +222274,22 @@ static int sessionConflictHandler(
/* Bind the new.* PRIMARY KEY values to the SELECT statement. */
if( pbReplace ){
- rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect);
+ rc = sessionSeekToRow(pIter, p);
}else{
rc = SQLITE_OK;
}
if( rc==SQLITE_ROW ){
/* There exists another row with the new.* primary key. */
- pIter->pConflict = p->pSelect;
- res = xConflict(pCtx, eType, pIter);
- pIter->pConflict = 0;
+ if( p->bIgnoreNoop
+ && sqlite3_column_int(p->pSelect, sqlite3_column_count(p->pSelect)-1)
+ ){
+ res = SQLITE_CHANGESET_OMIT;
+ }else{
+ pIter->pConflict = p->pSelect;
+ res = xConflict(pCtx, eType, pIter);
+ pIter->pConflict = 0;
+ }
rc = sqlite3_reset(p->pSelect);
}else if( rc==SQLITE_OK ){
if( p->bDeferConstraints && eType==SQLITE_CHANGESET_CONFLICT ){
@@ -211033,7 +222397,7 @@ static int sessionApplyOneOp(
sqlite3_step(p->pDelete);
rc = sqlite3_reset(p->pDelete);
- if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 ){
+ if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 && p->bIgnoreNoop==0 ){
rc = sessionConflictHandler(
SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry
);
@@ -211090,7 +222454,7 @@ static int sessionApplyOneOp(
/* Check if there is a conflicting row. For sqlite_stat1, this needs
** to be done using a SELECT, as there is no PRIMARY KEY in the
** database schema to throw an exception if a duplicate is inserted. */
- rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect);
+ rc = sessionSeekToRow(pIter, p);
if( rc==SQLITE_ROW ){
rc = SQLITE_CONSTRAINT;
sqlite3_reset(p->pSelect);
@@ -211267,6 +222631,7 @@ static int sessionChangesetApply(
memset(&sApply, 0, sizeof(sApply));
sApply.bRebase = (ppRebase && pnRebase);
sApply.bInvertConstraints = !!(flags & SQLITE_CHANGESETAPPLY_INVERT);
+ sApply.bIgnoreNoop = !!(flags & SQLITE_CHANGESETAPPLY_IGNORENOOP);
sqlite3_mutex_enter(sqlite3_db_mutex(db));
if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){
rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0);
@@ -211304,6 +222669,7 @@ static int sessionChangesetApply(
sApply.bStat1 = 0;
sApply.bDeferConstraints = 1;
sApply.bRebaseStarted = 0;
+ sApply.bRowid = 0;
memset(&sApply.constraints, 0, sizeof(SessionBuffer));
/* If an xFilter() callback was specified, invoke it now. If the
@@ -211323,8 +222689,8 @@ static int sessionChangesetApply(
int i;
sqlite3changeset_pk(pIter, &abPK, 0);
- rc = sessionTableInfo(0,
- db, "main", zNew, &sApply.nCol, &zTab, &sApply.azCol, &sApply.abPK
+ rc = sessionTableInfo(0, db, "main", zNew,
+ &sApply.nCol, &zTab, &sApply.azCol, &sApply.abPK, &sApply.bRowid
);
if( rc!=SQLITE_OK ) break;
for(i=0; i<sApply.nCol; i++){
@@ -211897,9 +223263,9 @@ static int sessionChangegroupOutput(
if( rc==SQLITE_OK ){
if( xOutput ){
if( buf.nBuf>0 ) rc = xOutput(pOut, buf.aBuf, buf.nBuf);
- }else{
+ }else if( ppOut ){
*ppOut = buf.aBuf;
- *pnOut = buf.nBuf;
+ if( pnOut ) *pnOut = buf.nBuf;
buf.aBuf = 0;
}
}
@@ -212136,7 +223502,7 @@ static void sessionAppendPartialUpdate(
if( !pIter->abPK[i] && a1[0] ) bData = 1;
memcpy(pOut, a1, n1);
pOut += n1;
- }else if( a2[0]!=0xFF ){
+ }else if( a2[0]!=0xFF && a1[0] ){
bData = 1;
memcpy(pOut, a2, n2);
pOut += n2;
@@ -212299,7 +223665,7 @@ static int sessionRebase(
if( sOut.nBuf>0 ){
rc = xOutput(pOut, sOut.aBuf, sOut.nBuf);
}
- }else{
+ }else if( ppOut ){
*ppOut = (void*)sOut.aBuf;
*pnOut = sOut.nBuf;
sOut.aBuf = 0;
@@ -213042,8 +224408,20 @@ typedef sqlite3_uint64 u64;
#endif
#define testcase(x)
-#define ALWAYS(x) 1
-#define NEVER(x) 0
+
+#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
+# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
+#endif
+#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
+# define ALWAYS(X) (1)
+# define NEVER(X) (0)
+#elif !defined(NDEBUG)
+# define ALWAYS(X) ((X)?1:(assert(0),0))
+# define NEVER(X) ((X)?(assert(0),1):0)
+#else
+# define ALWAYS(X) (X)
+# define NEVER(X) (X)
+#endif
#define MIN(x,y) (((x) < (y)) ? (x) : (y))
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
@@ -213103,7 +224481,7 @@ SQLITE_API extern int sqlite3_fts5_may_be_corrupt;
** A version of memcmp() that does not cause asan errors if one of the pointer
** parameters is NULL and the number of bytes to compare is zero.
*/
-#define fts5Memcmp(s1, s2, n) ((n)==0 ? 0 : memcmp((s1), (s2), (n)))
+#define fts5Memcmp(s1, s2, n) ((n)<=0 ? 0 : memcmp((s1), (s2), (n)))
/* Mark a function parameter as unused, to suppress nuisance compiler
** warnings. */
@@ -213194,6 +224572,7 @@ struct Fts5Config {
int ePattern; /* FTS_PATTERN_XXX constant */
/* Values loaded from the %_config table */
+ int iVersion; /* fts5 file format 'version' */
int iCookie; /* Incremented when %_config is modified */
int pgsz; /* Approximate page size used in %_data */
int nAutomerge; /* 'automerge' setting */
@@ -213202,6 +224581,7 @@ struct Fts5Config {
int nHashSize; /* Bytes of memory for in-memory hash */
char *zRank; /* Name of rank function */
char *zRankArgs; /* Arguments to rank function */
+ int bSecureDelete; /* 'secure-delete' */
/* If non-NULL, points to sqlite3_vtab.base.zErrmsg. Often NULL. */
char **pzErrmsg;
@@ -213211,8 +224591,11 @@ struct Fts5Config {
#endif
};
-/* Current expected value of %_config table 'version' field */
-#define FTS5_CURRENT_VERSION 4
+/* Current expected value of %_config table 'version' field. And
+** the expected version if the 'secure-delete' option has ever been
+** set on the table. */
+#define FTS5_CURRENT_VERSION 4
+#define FTS5_CURRENT_VERSION_SECUREDELETE 5
#define FTS5_CONTENT_NORMAL 0
#define FTS5_CONTENT_NONE 1
@@ -213281,7 +224664,7 @@ static void sqlite3Fts5BufferAppendPrintf(int *, Fts5Buffer*, char *zFmt, ...);
static char *sqlite3Fts5Mprintf(int *pRc, const char *zFmt, ...);
#define fts5BufferZero(x) sqlite3Fts5BufferZero(x)
-#define fts5BufferAppendVarint(a,b,c) sqlite3Fts5BufferAppendVarint(a,b,c)
+#define fts5BufferAppendVarint(a,b,c) sqlite3Fts5BufferAppendVarint(a,b,(i64)c)
#define fts5BufferFree(a) sqlite3Fts5BufferFree(a)
#define fts5BufferAppendBlob(a,b,c,d) sqlite3Fts5BufferAppendBlob(a,b,c,d)
#define fts5BufferSet(a,b,c,d) sqlite3Fts5BufferSet(a,b,c,d)
@@ -213378,6 +224761,7 @@ struct Fts5IndexIter {
** above. */
#define FTS5INDEX_QUERY_SKIPEMPTY 0x0010
#define FTS5INDEX_QUERY_NOOUTPUT 0x0020
+#define FTS5INDEX_QUERY_SKIPHASH 0x0040
/*
** Create/destroy an Fts5Index object.
@@ -213442,6 +224826,9 @@ static void sqlite3Fts5IndexCloseReader(Fts5Index*);
*/
static const char *sqlite3Fts5IterTerm(Fts5IndexIter*, int*);
static int sqlite3Fts5IterNextScan(Fts5IndexIter*);
+static void *sqlite3Fts5StructureRef(Fts5Index*);
+static void sqlite3Fts5StructureRelease(void*);
+static int sqlite3Fts5StructureTest(Fts5Index*, void*);
/*
@@ -213529,7 +224916,7 @@ static int sqlite3Fts5GetVarintLen(u32 iVal);
static u8 sqlite3Fts5GetVarint(const unsigned char*, u64*);
static int sqlite3Fts5PutVarint(unsigned char *p, u64 v);
-#define fts5GetVarint32(a,b) sqlite3Fts5GetVarint32(a,(u32*)&b)
+#define fts5GetVarint32(a,b) sqlite3Fts5GetVarint32(a,(u32*)&(b))
#define fts5GetVarint sqlite3Fts5GetVarint
#define fts5FastGetVarint32(a, iOff, nVal) { \
@@ -214219,9 +225606,9 @@ struct fts5yyParser {
};
typedef struct fts5yyParser fts5yyParser;
+/* #include <assert.h> */
#ifndef NDEBUG
/* #include <stdio.h> */
-/* #include <assert.h> */
static FILE *fts5yyTraceFILE = 0;
static char *fts5yyTracePrompt = 0;
#endif /* NDEBUG */
@@ -215158,8 +226545,8 @@ static void sqlite3Fts5Parser(
fts5yyact = fts5yy_find_shift_action((fts5YYCODETYPE)fts5yymajor,fts5yyact);
if( fts5yyact >= fts5YY_MIN_REDUCE ){
unsigned int fts5yyruleno = fts5yyact - fts5YY_MIN_REDUCE; /* Reduce by this rule */
- assert( fts5yyruleno<(int)(sizeof(fts5yyRuleName)/sizeof(fts5yyRuleName[0])) );
#ifndef NDEBUG
+ assert( fts5yyruleno<(int)(sizeof(fts5yyRuleName)/sizeof(fts5yyRuleName[0])) );
if( fts5yyTraceFILE ){
int fts5yysize = fts5yyRuleInfoNRhs[fts5yyruleno];
if( fts5yysize ){
@@ -215257,14 +226644,13 @@ static void sqlite3Fts5Parser(
fts5yy_destructor(fts5yypParser, (fts5YYCODETYPE)fts5yymajor, &fts5yyminorunion);
fts5yymajor = fts5YYNOCODE;
}else{
- while( fts5yypParser->fts5yytos >= fts5yypParser->fts5yystack
- && (fts5yyact = fts5yy_find_reduce_action(
- fts5yypParser->fts5yytos->stateno,
- fts5YYERRORSYMBOL)) > fts5YY_MAX_SHIFTREDUCE
- ){
+ while( fts5yypParser->fts5yytos > fts5yypParser->fts5yystack ){
+ fts5yyact = fts5yy_find_reduce_action(fts5yypParser->fts5yytos->stateno,
+ fts5YYERRORSYMBOL);
+ if( fts5yyact<=fts5YY_MAX_SHIFTREDUCE ) break;
fts5yy_pop_parser_stack(fts5yypParser);
}
- if( fts5yypParser->fts5yytos < fts5yypParser->fts5yystack || fts5yymajor==0 ){
+ if( fts5yypParser->fts5yytos <= fts5yypParser->fts5yystack || fts5yymajor==0 ){
fts5yy_destructor(fts5yypParser,(fts5YYCODETYPE)fts5yymajor,&fts5yyminorunion);
fts5yy_parse_failed(fts5yypParser);
#ifndef fts5YYNOERRORRECOVERY
@@ -215509,7 +226895,7 @@ static int fts5HighlightCb(
if( tflags & FTS5_TOKEN_COLOCATED ) return SQLITE_OK;
iPos = p->iPos++;
- if( p->iRangeEnd>0 ){
+ if( p->iRangeEnd>=0 ){
if( iPos<p->iRangeStart || iPos>p->iRangeEnd ) return SQLITE_OK;
if( p->iRangeStart && iPos==p->iRangeStart ) p->iOff = iStartOff;
}
@@ -215521,7 +226907,7 @@ static int fts5HighlightCb(
}
if( iPos==p->iter.iEnd ){
- if( p->iRangeEnd && p->iter.iStart<p->iRangeStart ){
+ if( p->iRangeEnd>=0 && p->iter.iStart<p->iRangeStart ){
fts5HighlightAppend(&rc, p, p->zOpen, -1);
}
fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff);
@@ -215532,7 +226918,7 @@ static int fts5HighlightCb(
}
}
- if( p->iRangeEnd>0 && iPos==p->iRangeEnd ){
+ if( p->iRangeEnd>=0 && iPos==p->iRangeEnd ){
fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff);
p->iOff = iEndOff;
if( iPos>=p->iter.iStart && iPos<p->iter.iEnd ){
@@ -215567,6 +226953,7 @@ static void fts5HighlightFunction(
memset(&ctx, 0, sizeof(HighlightContext));
ctx.zOpen = (const char*)sqlite3_value_text(apVal[1]);
ctx.zClose = (const char*)sqlite3_value_text(apVal[2]);
+ ctx.iRangeEnd = -1;
rc = pApi->xColumnText(pFts, iCol, &ctx.zIn, &ctx.nIn);
if( ctx.zIn ){
@@ -215752,6 +227139,7 @@ static void fts5SnippetFunction(
iCol = sqlite3_value_int(apVal[0]);
ctx.zOpen = fts5ValueToText(apVal[1]);
ctx.zClose = fts5ValueToText(apVal[2]);
+ ctx.iRangeEnd = -1;
zEllips = fts5ValueToText(apVal[3]);
nToken = sqlite3_value_int(apVal[4]);
@@ -216127,7 +227515,6 @@ static void sqlite3Fts5BufferAppendBlob(
u32 nData,
const u8 *pData
){
- assert_nc( *pRc || nData>=0 );
if( nData ){
if( fts5BufferGrow(pRc, pBuf, nData) ) return;
memcpy(&pBuf->p[pBuf->n], pData, nData);
@@ -216237,9 +227624,8 @@ static int sqlite3Fts5PoslistNext64(
return 1;
}else{
i64 iOff = *piOff;
- int iVal;
+ u32 iVal;
fts5FastGetVarint32(a, i, iVal);
- assert( iVal>=0 );
if( iVal<=1 ){
if( iVal==0 ){
*pi = i;
@@ -216247,6 +227633,7 @@ static int sqlite3Fts5PoslistNext64(
}
fts5FastGetVarint32(a, i, iVal);
iOff = ((i64)iVal) << 32;
+ assert( iOff>=0 );
fts5FastGetVarint32(a, i, iVal);
if( iVal<2 ){
/* This is a corrupt record. So stop parsing it here. */
@@ -216258,7 +227645,7 @@ static int sqlite3Fts5PoslistNext64(
*piOff = (iOff & (i64)0x7FFFFFFF<<32)+((iOff + (iVal-2)) & 0x7FFFFFFF);
}
*pi = i;
- assert( *piOff>=iOff );
+ assert_nc( *piOff>=iOff );
return 0;
}
}
@@ -217021,6 +228408,7 @@ static int sqlite3Fts5ConfigParse(
rc = SQLITE_ERROR;
}
+ assert( (pRet->abUnindexed && pRet->azCol) || rc!=SQLITE_OK );
for(i=3; rc==SQLITE_OK && i<nArg; i++){
const char *zOrig = azArg[i];
const char *z;
@@ -217033,6 +228421,7 @@ static int sqlite3Fts5ConfigParse(
z = fts5ConfigSkipWhitespace(z);
if( z && *z=='=' ){
bOption = 1;
+ assert( zOne!=0 );
z++;
if( bMustBeCol ) z = 0;
}
@@ -217049,7 +228438,11 @@ static int sqlite3Fts5ConfigParse(
rc = SQLITE_ERROR;
}else{
if( bOption ){
- rc = fts5ConfigParseSpecial(pGlobal, pRet, zOne, zTwo?zTwo:"", pzErr);
+ rc = fts5ConfigParseSpecial(pGlobal, pRet,
+ ALWAYS(zOne)?zOne:"",
+ zTwo?zTwo:"",
+ pzErr
+ );
}else{
rc = fts5ConfigParseColumn(pRet, zOne, zTwo, pzErr);
zOne = 0;
@@ -217369,6 +228762,18 @@ static int sqlite3Fts5ConfigSetValue(
rc = SQLITE_OK;
*pbBadkey = 1;
}
+ }
+
+ else if( 0==sqlite3_stricmp(zKey, "secure-delete") ){
+ int bVal = -1;
+ if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){
+ bVal = sqlite3_value_int(pVal);
+ }
+ if( bVal<0 ){
+ *pbBadkey = 1;
+ }else{
+ pConfig->bSecureDelete = (bVal ? 1 : 0);
+ }
}else{
*pbBadkey = 1;
}
@@ -217413,15 +228818,20 @@ static int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){
rc = sqlite3_finalize(p);
}
- if( rc==SQLITE_OK && iVersion!=FTS5_CURRENT_VERSION ){
+ if( rc==SQLITE_OK
+ && iVersion!=FTS5_CURRENT_VERSION
+ && iVersion!=FTS5_CURRENT_VERSION_SECUREDELETE
+ ){
rc = SQLITE_ERROR;
if( pConfig->pzErrmsg ){
assert( 0==*pConfig->pzErrmsg );
- *pConfig->pzErrmsg = sqlite3_mprintf(
- "invalid fts5 file format (found %d, expected %d) - run 'rebuild'",
- iVersion, FTS5_CURRENT_VERSION
+ *pConfig->pzErrmsg = sqlite3_mprintf("invalid fts5 file format "
+ "(found %d, expected %d or %d) - run 'rebuild'",
+ iVersion, FTS5_CURRENT_VERSION, FTS5_CURRENT_VERSION_SECUREDELETE
);
}
+ }else{
+ pConfig->iVersion = iVersion;
}
if( rc==SQLITE_OK ){
@@ -217449,6 +228859,10 @@ static int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){
/* #include "fts5Int.h" */
/* #include "fts5parse.h" */
+#ifndef SQLITE_FTS5_MAX_EXPR_DEPTH
+# define SQLITE_FTS5_MAX_EXPR_DEPTH 256
+#endif
+
/*
** All token types in the generated fts5parse.h file are greater than 0.
*/
@@ -217489,11 +228903,17 @@ struct Fts5Expr {
** FTS5_NOT (nChild, apChild valid)
** FTS5_STRING (pNear valid)
** FTS5_TERM (pNear valid)
+**
+** iHeight:
+** Distance from this node to furthest leaf. This is always 0 for nodes
+** of type FTS5_STRING and FTS5_TERM. For all other nodes it is one
+** greater than the largest child value.
*/
struct Fts5ExprNode {
int eType; /* Node type */
int bEof; /* True at EOF */
int bNomatch; /* True if entry is not a match */
+ int iHeight; /* Distance to tree leaf nodes */
/* Next method for this node. */
int (*xNext)(Fts5Expr*, Fts5ExprNode*, int, i64);
@@ -217563,10 +228983,36 @@ struct Fts5Parse {
int bPhraseToAnd; /* Convert "a+b" to "a AND b" */
};
+/*
+** Check that the Fts5ExprNode.iHeight variables are set correctly in
+** the expression tree passed as the only argument.
+*/
+#ifndef NDEBUG
+static void assert_expr_depth_ok(int rc, Fts5ExprNode *p){
+ if( rc==SQLITE_OK ){
+ if( p->eType==FTS5_TERM || p->eType==FTS5_STRING || p->eType==0 ){
+ assert( p->iHeight==0 );
+ }else{
+ int ii;
+ int iMaxChild = 0;
+ for(ii=0; ii<p->nChild; ii++){
+ Fts5ExprNode *pChild = p->apChild[ii];
+ iMaxChild = MAX(iMaxChild, pChild->iHeight);
+ assert_expr_depth_ok(SQLITE_OK, pChild);
+ }
+ assert( p->iHeight==iMaxChild+1 );
+ }
+ }
+}
+#else
+# define assert_expr_depth_ok(rc, p)
+#endif
+
static void sqlite3Fts5ParseError(Fts5Parse *pParse, const char *zFmt, ...){
va_list ap;
va_start(ap, zFmt);
if( pParse->rc==SQLITE_OK ){
+ assert( pParse->zErr==0 );
pParse->zErr = sqlite3_vmprintf(zFmt, ap);
pParse->rc = SQLITE_ERROR;
}
@@ -217676,6 +229122,8 @@ static int sqlite3Fts5ExprNew(
}while( sParse.rc==SQLITE_OK && t!=FTS5_EOF );
sqlite3Fts5ParserFree(pEngine, fts5ParseFree);
+ assert_expr_depth_ok(sParse.rc, sParse.pExpr);
+
/* If the LHS of the MATCH expression was a user column, apply the
** implicit column-filter. */
if( iCol<pConfig->nCol && sParse.pExpr && sParse.rc==SQLITE_OK ){
@@ -217721,6 +229169,19 @@ static int sqlite3Fts5ExprNew(
}
/*
+** Assuming that buffer z is at least nByte bytes in size and contains a
+** valid utf-8 string, return the number of characters in the string.
+*/
+static int fts5ExprCountChar(const char *z, int nByte){
+ int nRet = 0;
+ int ii;
+ for(ii=0; ii<nByte; ii++){
+ if( (z[ii] & 0xC0)!=0x80 ) nRet++;
+ }
+ return nRet;
+}
+
+/*
** This function is only called when using the special 'trigram' tokenizer.
** Argument zText contains the text of a LIKE or GLOB pattern matched
** against column iCol. This function creates and compiles an FTS5 MATCH
@@ -217757,7 +229218,8 @@ static int sqlite3Fts5ExprPattern(
if( i==nText
|| zText[i]==aSpec[0] || zText[i]==aSpec[1] || zText[i]==aSpec[2]
){
- if( i-iFirst>=3 ){
+
+ if( fts5ExprCountChar(&zText[iFirst], i-iFirst)>=3 ){
int jj;
zExpr[iOut++] = '"';
for(jj=iFirst; jj<i; jj++){
@@ -217824,7 +229286,7 @@ static int sqlite3Fts5ExprAnd(Fts5Expr **pp1, Fts5Expr *p2){
Fts5Parse sParse;
memset(&sParse, 0, sizeof(sParse));
- if( *pp1 ){
+ if( *pp1 && p2 ){
Fts5Expr *p1 = *pp1;
int nPhrase = p1->nPhrase + p2->nPhrase;
@@ -217849,7 +229311,7 @@ static int sqlite3Fts5ExprAnd(Fts5Expr **pp1, Fts5Expr *p2){
}
sqlite3_free(p2->apExprPhrase);
sqlite3_free(p2);
- }else{
+ }else if( p2 ){
*pp1 = p2;
}
@@ -217865,6 +229327,7 @@ static i64 fts5ExprSynonymRowid(Fts5ExprTerm *pTerm, int bDesc, int *pbEof){
int bRetValid = 0;
Fts5ExprTerm *p;
+ assert( pTerm );
assert( pTerm->pSynonym );
assert( bDesc==0 || bDesc==1 );
for(p=pTerm; p; p=p->pSynonym){
@@ -219057,6 +230520,9 @@ static Fts5ExprNearset *sqlite3Fts5ParseNearset(
}else{
if( pRet->nPhrase>0 ){
Fts5ExprPhrase *pLast = pRet->apPhrase[pRet->nPhrase-1];
+ assert( pParse!=0 );
+ assert( pParse->apPhrase!=0 );
+ assert( pParse->nPhrase>=2 );
assert( pLast==pParse->apPhrase[pParse->nPhrase-2] );
if( pPhrase->nTerm==0 ){
fts5ExprPhraseFree(pPhrase);
@@ -219305,7 +230771,7 @@ static int sqlite3Fts5ExprClonePhrase(
sCtx.pPhrase = sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprPhrase));
}
- if( rc==SQLITE_OK ){
+ if( rc==SQLITE_OK && ALWAYS(sCtx.pPhrase) ){
/* All the allocations succeeded. Put the expression object together. */
pNew->pIndex = pExpr->pIndex;
pNew->pConfig = pExpr->pConfig;
@@ -219576,9 +231042,8 @@ static void sqlite3Fts5ParseSetColset(
){
Fts5Colset *pFree = pColset;
if( pParse->pConfig->eDetail==FTS5_DETAIL_NONE ){
- pParse->rc = SQLITE_ERROR;
- pParse->zErr = sqlite3_mprintf(
- "fts5: column queries are not supported (detail=none)"
+ sqlite3Fts5ParseError(pParse,
+ "fts5: column queries are not supported (detail=none)"
);
}else{
fts5ParseSetColset(pParse, pExpr, pColset, &pFree);
@@ -219620,6 +231085,7 @@ static void fts5ExprAssignXNext(Fts5ExprNode *pNode){
}
static void fts5ExprAddChildren(Fts5ExprNode *p, Fts5ExprNode *pSub){
+ int ii = p->nChild;
if( p->eType!=FTS5_NOT && pSub->eType==p->eType ){
int nByte = sizeof(Fts5ExprNode*) * pSub->nChild;
memcpy(&p->apChild[p->nChild], pSub->apChild, nByte);
@@ -219628,6 +231094,9 @@ static void fts5ExprAddChildren(Fts5ExprNode *p, Fts5ExprNode *pSub){
}else{
p->apChild[p->nChild++] = pSub;
}
+ for( ; ii<p->nChild; ii++){
+ p->iHeight = MAX(p->iHeight, p->apChild[ii]->iHeight + 1);
+ }
}
/*
@@ -219658,6 +231127,7 @@ static Fts5ExprNode *fts5ParsePhraseToAnd(
if( pRet ){
pRet->eType = FTS5_AND;
pRet->nChild = nTerm;
+ pRet->iHeight = 1;
fts5ExprAssignXNext(pRet);
pParse->nPhrase--;
for(ii=0; ii<nTerm; ii++){
@@ -219752,13 +231222,10 @@ static Fts5ExprNode *sqlite3Fts5ParseNode(
|| pPhrase->nTerm>1
|| (pPhrase->nTerm>0 && pPhrase->aTerm[0].bFirst)
){
- assert( pParse->rc==SQLITE_OK );
- pParse->rc = SQLITE_ERROR;
- assert( pParse->zErr==0 );
- pParse->zErr = sqlite3_mprintf(
+ sqlite3Fts5ParseError(pParse,
"fts5: %s queries are not supported (detail!=full)",
pNear->nPhrase==1 ? "phrase": "NEAR"
- );
+ );
sqlite3_free(pRet);
pRet = 0;
}
@@ -219766,6 +231233,14 @@ static Fts5ExprNode *sqlite3Fts5ParseNode(
}else{
fts5ExprAddChildren(pRet, pLeft);
fts5ExprAddChildren(pRet, pRight);
+ if( pRet->iHeight>SQLITE_FTS5_MAX_EXPR_DEPTH ){
+ sqlite3Fts5ParseError(pParse,
+ "fts5 expression tree is too large (maximum depth %d)",
+ SQLITE_FTS5_MAX_EXPR_DEPTH
+ );
+ sqlite3_free(pRet);
+ pRet = 0;
+ }
}
}
}
@@ -220290,6 +231765,15 @@ struct Fts5PoslistPopulator {
int bMiss;
};
+/*
+** Clear the position lists associated with all phrases in the expression
+** passed as the first argument. Argument bLive is true if the expression
+** might be pointing to a real entry, otherwise it has just been reset.
+**
+** At present this function is only used for detail=col and detail=none
+** fts5 tables. This implies that all phrases must be at most 1 token
+** in size, as phrase matches are not supported without detail=full.
+*/
static Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int bLive){
Fts5PoslistPopulator *pRet;
pRet = sqlite3_malloc64(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase);
@@ -220299,7 +231783,7 @@ static Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int b
for(i=0; i<pExpr->nPhrase; i++){
Fts5Buffer *pBuf = &pExpr->apExprPhrase[i]->poslist;
Fts5ExprNode *pNode = pExpr->apExprPhrase[i]->pNode;
- assert( pExpr->apExprPhrase[i]->nTerm==1 );
+ assert( pExpr->apExprPhrase[i]->nTerm<=1 );
if( bLive &&
(pBuf->n==0 || pNode->iRowid!=pExpr->pRoot->iRowid || pNode->bEof)
){
@@ -220850,7 +232334,7 @@ static int sqlite3Fts5HashWrite(
p->bContent = 1;
}else{
/* Append a new column value, if necessary */
- assert( iCol>=p->iCol );
+ assert_nc( iCol>=p->iCol );
if( iCol!=p->iCol ){
if( pHash->eDetail==FTS5_DETAIL_FULL ){
pPtr[p->nData++] = 0x01;
@@ -221109,6 +232593,8 @@ static void sqlite3Fts5HashScanEntry(
# error "FTS5_MAX_PREFIX_INDEXES is too large"
#endif
+#define FTS5_MAX_LEVEL 64
+
/*
** Details:
**
@@ -221351,10 +232837,12 @@ struct Fts5Index {
sqlite3_stmt *pWriter; /* "INSERT ... %_data VALUES(?,?)" */
sqlite3_stmt *pDeleter; /* "DELETE FROM %_data ... id>=? AND id<=?" */
sqlite3_stmt *pIdxWriter; /* "INSERT ... %_idx VALUES(?,?,?,?)" */
- sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=? */
+ sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=?" */
sqlite3_stmt *pIdxSelect;
int nRead; /* Total number of blocks read */
+ sqlite3_stmt *pDeleteFromIdx;
+
sqlite3_stmt *pDataVersion;
i64 iStructVersion; /* data_version when pStruct read */
Fts5Structure *pStruct; /* Current db structure (or NULL) */
@@ -221447,9 +232935,6 @@ struct Fts5CResult {
** iLeafOffset:
** Byte offset within the current leaf that is the first byte of the
** position list data (one byte passed the position-list size field).
-** rowid field of the current entry. Usually this is the size field of the
-** position list data. The exception is if the rowid for the current entry
-** is the last thing on the leaf page.
**
** pLeaf:
** Buffer containing current leaf page data. Set to NULL at EOF.
@@ -221655,8 +233140,11 @@ static int fts5BufferCompareBlob(
** res = *pLeft - *pRight
*/
static int fts5BufferCompare(Fts5Buffer *pLeft, Fts5Buffer *pRight){
- int nCmp = MIN(pLeft->n, pRight->n);
- int res = fts5Memcmp(pLeft->p, pRight->p, nCmp);
+ int nCmp, res;
+ nCmp = MIN(pLeft->n, pRight->n);
+ assert( nCmp<=0 || pLeft->p!=0 );
+ assert( nCmp<=0 || pRight->p!=0 );
+ res = fts5Memcmp(pLeft->p, pRight->p, nCmp);
return (res==0 ? (pLeft->n - pRight->n) : res);
}
@@ -221752,6 +233240,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){
return pRet;
}
+
/*
** Release a reference to data record returned by an earlier call to
** fts5DataRead().
@@ -221876,6 +233365,58 @@ static void fts5StructureRef(Fts5Structure *pStruct){
pStruct->nRef++;
}
+static void *sqlite3Fts5StructureRef(Fts5Index *p){
+ fts5StructureRef(p->pStruct);
+ return (void*)p->pStruct;
+}
+static void sqlite3Fts5StructureRelease(void *p){
+ if( p ){
+ fts5StructureRelease((Fts5Structure*)p);
+ }
+}
+static int sqlite3Fts5StructureTest(Fts5Index *p, void *pStruct){
+ if( p->pStruct!=(Fts5Structure*)pStruct ){
+ return SQLITE_ABORT;
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Ensure that structure object (*pp) is writable.
+**
+** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. If
+** an error occurs, (*pRc) is set to an SQLite error code before returning.
+*/
+static void fts5StructureMakeWritable(int *pRc, Fts5Structure **pp){
+ Fts5Structure *p = *pp;
+ if( *pRc==SQLITE_OK && p->nRef>1 ){
+ i64 nByte = sizeof(Fts5Structure)+(p->nLevel-1)*sizeof(Fts5StructureLevel);
+ Fts5Structure *pNew;
+ pNew = (Fts5Structure*)sqlite3Fts5MallocZero(pRc, nByte);
+ if( pNew ){
+ int i;
+ memcpy(pNew, p, nByte);
+ for(i=0; i<p->nLevel; i++) pNew->aLevel[i].aSeg = 0;
+ for(i=0; i<p->nLevel; i++){
+ Fts5StructureLevel *pLvl = &pNew->aLevel[i];
+ nByte = sizeof(Fts5StructureSegment) * pNew->aLevel[i].nSeg;
+ pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(pRc, nByte);
+ if( pLvl->aSeg==0 ){
+ for(i=0; i<p->nLevel; i++){
+ sqlite3_free(pNew->aLevel[i].aSeg);
+ }
+ sqlite3_free(pNew);
+ return;
+ }
+ memcpy(pLvl->aSeg, p->aLevel[i].aSeg, nByte);
+ }
+ p->nRef--;
+ pNew->nRef = 1;
+ }
+ *pp = pNew;
+ }
+}
+
/*
** Deserialize and return the structure record currently stored in serialized
** form within buffer pData/nData.
@@ -221952,6 +233493,7 @@ static int fts5StructureDecode(
rc = FTS5_CORRUPT;
break;
}
+ assert( pSeg!=0 );
i += fts5GetVarint32(&pData[i], pSeg->iSegid);
i += fts5GetVarint32(&pData[i], pSeg->pgnoFirst);
i += fts5GetVarint32(&pData[i], pSeg->pgnoLast);
@@ -221977,9 +233519,12 @@ static int fts5StructureDecode(
}
/*
-**
+** Add a level to the Fts5Structure.aLevel[] array of structure object
+** (*ppStruct).
*/
static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){
+ fts5StructureMakeWritable(pRc, ppStruct);
+ assert( (ppStruct!=0 && (*ppStruct)!=0) || (*pRc)!=SQLITE_OK );
if( *pRc==SQLITE_OK ){
Fts5Structure *pStruct = *ppStruct;
int nLevel = pStruct->nLevel;
@@ -222438,42 +233983,25 @@ static int fts5DlidxLvlPrev(Fts5DlidxLvl *pLvl){
pLvl->bEof = 1;
}else{
u8 *a = pLvl->pData->p;
- i64 iVal;
- int iLimit;
- int ii;
- int nZero = 0;
-
- /* Currently iOff points to the first byte of a varint. This block
- ** decrements iOff until it points to the first byte of the previous
- ** varint. Taking care not to read any memory locations that occur
- ** before the buffer in memory. */
- iLimit = (iOff>9 ? iOff-9 : 0);
- for(iOff--; iOff>iLimit; iOff--){
- if( (a[iOff-1] & 0x80)==0 ) break;
- }
-
- fts5GetVarint(&a[iOff], (u64*)&iVal);
- pLvl->iRowid -= iVal;
- pLvl->iLeafPgno--;
-
- /* Skip backwards past any 0x00 varints. */
- for(ii=iOff-1; ii>=pLvl->iFirstOff && a[ii]==0x00; ii--){
- nZero++;
- }
- if( ii>=pLvl->iFirstOff && (a[ii] & 0x80) ){
- /* The byte immediately before the last 0x00 byte has the 0x80 bit
- ** set. So the last 0x00 is only a varint 0 if there are 8 more 0x80
- ** bytes before a[ii]. */
- int bZero = 0; /* True if last 0x00 counts */
- if( (ii-8)>=pLvl->iFirstOff ){
- int j;
- for(j=1; j<=8 && (a[ii-j] & 0x80); j++);
- bZero = (j>8);
+
+ pLvl->iOff = 0;
+ fts5DlidxLvlNext(pLvl);
+ while( 1 ){
+ int nZero = 0;
+ int ii = pLvl->iOff;
+ u64 delta = 0;
+
+ while( a[ii]==0 ){
+ nZero++;
+ ii++;
}
- if( bZero==0 ) nZero--;
+ ii += sqlite3Fts5GetVarint(&a[ii], &delta);
+
+ if( ii>=iOff ) break;
+ pLvl->iLeafPgno += nZero+1;
+ pLvl->iRowid += delta;
+ pLvl->iOff = ii;
}
- pLvl->iLeafPgno -= nZero;
- pLvl->iOff = iOff - nZero;
}
return pLvl->bEof;
@@ -222669,7 +234197,7 @@ static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){
i64 iOff = pIter->iLeafOffset;
ASSERT_SZLEAF_OK(pIter->pLeaf);
- if( iOff>=pIter->pLeaf->szLeaf ){
+ while( iOff>=pIter->pLeaf->szLeaf ){
fts5SegIterNextPage(p, pIter);
if( pIter->pLeaf==0 ){
if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT;
@@ -222768,11 +234296,14 @@ static void fts5SegIterInit(
fts5SegIterSetNext(p, pIter);
pIter->pSeg = pSeg;
pIter->iLeafPgno = pSeg->pgnoFirst-1;
- fts5SegIterNextPage(p, pIter);
+ do {
+ fts5SegIterNextPage(p, pIter);
+ }while( p->rc==SQLITE_OK && pIter->pLeaf && pIter->pLeaf->nn==4 );
}
- if( p->rc==SQLITE_OK ){
+ if( p->rc==SQLITE_OK && pIter->pLeaf ){
pIter->iLeafOffset = 4;
+ assert( pIter->pLeaf!=0 );
assert_nc( pIter->pLeaf->nn>4 );
assert_nc( fts5LeafFirstTermOff(pIter->pLeaf)==4 );
pIter->iPgidxOff = pIter->pLeaf->szLeaf+1;
@@ -222875,8 +234406,12 @@ static void fts5SegIterReverseNewPage(Fts5Index *p, Fts5SegIter *pIter){
int iRowidOff;
iRowidOff = fts5LeafFirstRowidOff(pNew);
if( iRowidOff ){
- pIter->pLeaf = pNew;
- pIter->iLeafOffset = iRowidOff;
+ if( iRowidOff>=pNew->szLeaf ){
+ p->rc = FTS5_CORRUPT;
+ }else{
+ pIter->pLeaf = pNew;
+ pIter->iLeafOffset = iRowidOff;
+ }
}
}
@@ -222960,7 +234495,7 @@ static void fts5SegIterNext_None(
iOff = pIter->iLeafOffset;
/* Next entry is on the next page */
- if( pIter->pSeg && iOff>=pIter->pLeaf->szLeaf ){
+ while( pIter->pSeg && iOff>=pIter->pLeaf->szLeaf ){
fts5SegIterNextPage(p, pIter);
if( p->rc || pIter->pLeaf==0 ) return;
pIter->iRowid = 0;
@@ -223153,10 +234688,10 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){
Fts5Data *pLast = 0;
int pgnoLast = 0;
- if( pDlidx ){
+ if( pDlidx && p->pConfig->iVersion==FTS5_CURRENT_VERSION ){
int iSegid = pIter->pSeg->iSegid;
pgnoLast = fts5DlidxIterPgno(pDlidx);
- pLast = fts5DataRead(p, FTS5_SEGMENT_ROWID(iSegid, pgnoLast));
+ pLast = fts5LeafRead(p, FTS5_SEGMENT_ROWID(iSegid, pgnoLast));
}else{
Fts5Data *pLeaf = pIter->pLeaf; /* Current leaf data */
@@ -223183,7 +234718,7 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){
** forward to find the page containing the last rowid. */
for(pgno=pIter->iLeafPgno+1; !p->rc && pgno<=pSeg->pgnoLast; pgno++){
i64 iAbs = FTS5_SEGMENT_ROWID(pSeg->iSegid, pgno);
- Fts5Data *pNew = fts5DataRead(p, iAbs);
+ Fts5Data *pNew = fts5LeafRead(p, iAbs);
if( pNew ){
int iRowid, bTermless;
iRowid = fts5LeafFirstRowidOff(pNew);
@@ -223214,6 +234749,10 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){
pIter->pLeaf = pLast;
pIter->iLeafPgno = pgnoLast;
iOff = fts5LeafFirstRowidOff(pLast);
+ if( iOff>pLast->szLeaf ){
+ p->rc = FTS5_CORRUPT;
+ return;
+ }
iOff += fts5GetVarint(&pLast->p[iOff], (u64*)&pIter->iRowid);
pIter->iLeafOffset = iOff;
@@ -223222,7 +234761,6 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){
}else{
pIter->iEndofDoclist = fts5LeafFirstTermOff(pLast);
}
-
}
fts5SegIterReverseInitPage(p, pIter);
@@ -223274,21 +234812,20 @@ static void fts5LeafSeek(
Fts5SegIter *pIter, /* Iterator to seek */
const u8 *pTerm, int nTerm /* Term to search for */
){
- int iOff;
+ u32 iOff;
const u8 *a = pIter->pLeaf->p;
- int szLeaf = pIter->pLeaf->szLeaf;
- int n = pIter->pLeaf->nn;
+ u32 n = (u32)pIter->pLeaf->nn;
u32 nMatch = 0;
u32 nKeep = 0;
u32 nNew = 0;
u32 iTermOff;
- int iPgidx; /* Current offset in pgidx */
+ u32 iPgidx; /* Current offset in pgidx */
int bEndOfPage = 0;
assert( p->rc==SQLITE_OK );
- iPgidx = szLeaf;
+ iPgidx = (u32)pIter->pLeaf->szLeaf;
iPgidx += fts5GetVarint32(&a[iPgidx], iTermOff);
iOff = iTermOff;
if( iOff>n ){
@@ -223354,15 +234891,15 @@ static void fts5LeafSeek(
if( pIter->pLeaf==0 ) return;
a = pIter->pLeaf->p;
if( fts5LeafIsTermless(pIter->pLeaf)==0 ){
- iPgidx = pIter->pLeaf->szLeaf;
+ iPgidx = (u32)pIter->pLeaf->szLeaf;
iPgidx += fts5GetVarint32(&pIter->pLeaf->p[iPgidx], iOff);
- if( iOff<4 || iOff>=pIter->pLeaf->szLeaf ){
+ if( iOff<4 || (i64)iOff>=pIter->pLeaf->szLeaf ){
p->rc = FTS5_CORRUPT;
return;
}else{
nKeep = 0;
iTermOff = iOff;
- n = pIter->pLeaf->nn;
+ n = (u32)pIter->pLeaf->nn;
iOff += fts5GetVarint32(&a[iOff], nNew);
break;
}
@@ -223712,7 +235249,8 @@ static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){
/*
** Move the seg-iter so that it points to the first rowid on page iLeafPgno.
-** It is an error if leaf iLeafPgno does not exist or contains no rowids.
+** It is an error if leaf iLeafPgno does not exist. Unless the db is
+** a 'secure-delete' db, if it contains no rowids then this is also an error.
*/
static void fts5SegIterGotoPage(
Fts5Index *p, /* FTS5 backend object */
@@ -223727,21 +235265,23 @@ static void fts5SegIterGotoPage(
fts5DataRelease(pIter->pNextLeaf);
pIter->pNextLeaf = 0;
pIter->iLeafPgno = iLeafPgno-1;
- fts5SegIterNextPage(p, pIter);
- assert( p->rc!=SQLITE_OK || pIter->iLeafPgno==iLeafPgno );
- if( p->rc==SQLITE_OK ){
+ while( p->rc==SQLITE_OK ){
int iOff;
- u8 *a = pIter->pLeaf->p;
- int n = pIter->pLeaf->szLeaf;
-
+ fts5SegIterNextPage(p, pIter);
+ if( pIter->pLeaf==0 ) break;
iOff = fts5LeafFirstRowidOff(pIter->pLeaf);
- if( iOff<4 || iOff>=n ){
- p->rc = FTS5_CORRUPT;
- }else{
- iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid);
- pIter->iLeafOffset = iOff;
- fts5SegIterLoadNPos(p, pIter);
+ if( iOff>0 ){
+ u8 *a = pIter->pLeaf->p;
+ int n = pIter->pLeaf->szLeaf;
+ if( iOff<4 || iOff>=n ){
+ p->rc = FTS5_CORRUPT;
+ }else{
+ iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid);
+ pIter->iLeafOffset = iOff;
+ fts5SegIterLoadNPos(p, pIter);
+ }
+ break;
}
}
}
@@ -224162,7 +235702,11 @@ static void fts5SegiterPoslist(
Fts5Colset *pColset,
Fts5Buffer *pBuf
){
+ assert( pBuf!=0 );
+ assert( pSeg!=0 );
if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+FTS5_DATA_ZERO_PADDING) ){
+ assert( pBuf->p!=0 );
+ assert( pBuf->nSpace >= pBuf->n+pSeg->nPos+FTS5_DATA_ZERO_PADDING );
memset(&pBuf->p[pBuf->n+pSeg->nPos], 0, FTS5_DATA_ZERO_PADDING);
if( pColset==0 ){
fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback);
@@ -224386,6 +235930,7 @@ static void fts5IterSetOutputs_Full(Fts5Iter *pIter, Fts5SegIter *pSeg){
}
static void fts5IterSetOutputCb(int *pRc, Fts5Iter *pIter){
+ assert( pIter!=0 || (*pRc)!=SQLITE_OK );
if( *pRc==SQLITE_OK ){
Fts5Config *pConfig = pIter->pIndex->pConfig;
if( pConfig->eDetail==FTS5_DETAIL_NONE ){
@@ -224451,13 +235996,16 @@ static void fts5MultiIterNew(
if( iLevel<0 ){
assert( pStruct->nSegment==fts5StructureCountSegments(pStruct) );
nSeg = pStruct->nSegment;
- nSeg += (p->pHash ? 1 : 0);
+ nSeg += (p->pHash && 0==(flags & FTS5INDEX_QUERY_SKIPHASH));
}else{
nSeg = MIN(pStruct->aLevel[iLevel].nSeg, nSegment);
}
}
*ppOut = pNew = fts5MultiIterAlloc(p, nSeg);
- if( pNew==0 ) return;
+ if( pNew==0 ){
+ assert( p->rc!=SQLITE_OK );
+ goto fts5MultiIterNew_post_check;
+ }
pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC));
pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY));
pNew->pColset = pColset;
@@ -224469,7 +236017,7 @@ static void fts5MultiIterNew(
if( p->rc==SQLITE_OK ){
if( iLevel<0 ){
Fts5StructureLevel *pEnd = &pStruct->aLevel[pStruct->nLevel];
- if( p->pHash ){
+ if( p->pHash && 0==(flags & FTS5INDEX_QUERY_SKIPHASH) ){
/* Add a segment iterator for the current contents of the hash table. */
Fts5SegIter *pIter = &pNew->aSeg[iIter++];
fts5SegIterHashInit(p, pTerm, nTerm, flags, pIter);
@@ -224521,6 +236069,10 @@ static void fts5MultiIterNew(
fts5MultiIterFree(pNew);
*ppOut = 0;
}
+
+fts5MultiIterNew_post_check:
+ assert( (*ppOut)!=0 || p->rc!=SQLITE_OK );
+ return;
}
/*
@@ -224568,7 +236120,8 @@ static void fts5MultiIterNew2(
** False otherwise.
*/
static int fts5MultiIterEof(Fts5Index *p, Fts5Iter *pIter){
- assert( p->rc
+ assert( pIter!=0 || p->rc!=SQLITE_OK );
+ assert( p->rc!=SQLITE_OK
|| (pIter->aSeg[ pIter->aFirst[1].iFirst ].pLeaf==0)==pIter->base.bEof
);
return (p->rc || pIter->base.bEof);
@@ -225064,7 +236617,9 @@ static void fts5WriteAppendRowid(
fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid);
}else{
assert_nc( p->rc || iRowid>pWriter->iPrevRowid );
- fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid - pWriter->iPrevRowid);
+ fts5BufferAppendVarint(&p->rc, &pPage->buf,
+ (u64)iRowid - (u64)pWriter->iPrevRowid
+ );
}
pWriter->iPrevRowid = iRowid;
pWriter->bFirstRowidInDoclist = 0;
@@ -225217,7 +236772,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){
fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr);
fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n);
fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p);
- fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff,&pData->p[iOff]);
+ fts5BufferAppendBlob(&p->rc, &buf,pData->szLeaf-iOff,&pData->p[iOff]);
if( p->rc==SQLITE_OK ){
/* Set the szLeaf field */
fts5PutU16(&buf.p[2], (u16)buf.n);
@@ -225372,6 +236927,7 @@ static void fts5IndexMergeLevel(
** and last leaf page number at the same time. */
fts5WriteFinish(p, &writer, &pSeg->pgnoLast);
+ assert( pIter!=0 || p->rc!=SQLITE_OK );
if( fts5MultiIterEof(p, pIter) ){
int i;
@@ -225472,7 +237028,7 @@ static void fts5IndexAutomerge(
Fts5Structure **ppStruct, /* IN/OUT: Current structure of index */
int nLeaf /* Number of output leaves just written */
){
- if( p->rc==SQLITE_OK && p->pConfig->nAutomerge>0 ){
+ if( p->rc==SQLITE_OK && p->pConfig->nAutomerge>0 && ALWAYS((*ppStruct)!=0) ){
Fts5Structure *pStruct = *ppStruct;
u64 nWrite; /* Initial value of write-counter */
int nWork; /* Number of work-quanta to perform */
@@ -225494,16 +237050,16 @@ static void fts5IndexCrisismerge(
){
const int nCrisis = p->pConfig->nCrisisMerge;
Fts5Structure *pStruct = *ppStruct;
- int iLvl = 0;
-
- assert( p->rc!=SQLITE_OK || pStruct->nLevel>0 );
- while( p->rc==SQLITE_OK && pStruct->aLevel[iLvl].nSeg>=nCrisis ){
- fts5IndexMergeLevel(p, &pStruct, iLvl, 0);
- assert( p->rc!=SQLITE_OK || pStruct->nLevel>(iLvl+1) );
- fts5StructurePromote(p, iLvl+1, pStruct);
- iLvl++;
+ if( pStruct && pStruct->nLevel>0 ){
+ int iLvl = 0;
+ while( p->rc==SQLITE_OK && pStruct->aLevel[iLvl].nSeg>=nCrisis ){
+ fts5IndexMergeLevel(p, &pStruct, iLvl, 0);
+ assert( p->rc!=SQLITE_OK || pStruct->nLevel>(iLvl+1) );
+ fts5StructurePromote(p, iLvl+1, pStruct);
+ iLvl++;
+ }
+ *ppStruct = pStruct;
}
- *ppStruct = pStruct;
}
static int fts5IndexReturn(Fts5Index *p){
@@ -225538,6 +237094,413 @@ static int fts5PoslistPrefix(const u8 *aBuf, int nMax){
}
/*
+** Execute the SQL statement:
+**
+** DELETE FROM %_idx WHERE (segid, (pgno/2)) = ($iSegid, $iPgno);
+**
+** This is used when a secure-delete operation removes the last term
+** from a segment leaf page. In that case the %_idx entry is removed
+** too. This is done to ensure that if all instances of a token are
+** removed from an fts5 database in secure-delete mode, no trace of
+** the token itself remains in the database.
+*/
+static void fts5SecureDeleteIdxEntry(
+ Fts5Index *p, /* FTS5 backend object */
+ int iSegid, /* Id of segment to delete entry for */
+ int iPgno /* Page number within segment */
+){
+ if( iPgno!=1 ){
+ assert( p->pConfig->iVersion==FTS5_CURRENT_VERSION_SECUREDELETE );
+ if( p->pDeleteFromIdx==0 ){
+ fts5IndexPrepareStmt(p, &p->pDeleteFromIdx, sqlite3_mprintf(
+ "DELETE FROM '%q'.'%q_idx' WHERE (segid, (pgno/2)) = (?1, ?2)",
+ p->pConfig->zDb, p->pConfig->zName
+ ));
+ }
+ if( p->rc==SQLITE_OK ){
+ sqlite3_bind_int(p->pDeleteFromIdx, 1, iSegid);
+ sqlite3_bind_int(p->pDeleteFromIdx, 2, iPgno);
+ sqlite3_step(p->pDeleteFromIdx);
+ p->rc = sqlite3_reset(p->pDeleteFromIdx);
+ }
+ }
+}
+
+/*
+** This is called when a secure-delete operation removes a position-list
+** that overflows onto segment page iPgno of segment pSeg. This function
+** rewrites node iPgno, and possibly one or more of its right-hand peers,
+** to remove this portion of the position list.
+**
+** Output variable (*pbLastInDoclist) is set to true if the position-list
+** removed is followed by a new term or the end-of-segment, or false if
+** it is followed by another rowid/position list.
+*/
+static void fts5SecureDeleteOverflow(
+ Fts5Index *p,
+ Fts5StructureSegment *pSeg,
+ int iPgno,
+ int *pbLastInDoclist
+){
+ const int bDetailNone = (p->pConfig->eDetail==FTS5_DETAIL_NONE);
+ int pgno;
+ Fts5Data *pLeaf = 0;
+ assert( iPgno!=1 );
+
+ *pbLastInDoclist = 1;
+ for(pgno=iPgno; p->rc==SQLITE_OK && pgno<=pSeg->pgnoLast; pgno++){
+ i64 iRowid = FTS5_SEGMENT_ROWID(pSeg->iSegid, pgno);
+ int iNext = 0;
+ u8 *aPg = 0;
+
+ pLeaf = fts5DataRead(p, iRowid);
+ if( pLeaf==0 ) break;
+ aPg = pLeaf->p;
+
+ iNext = fts5GetU16(&aPg[0]);
+ if( iNext!=0 ){
+ *pbLastInDoclist = 0;
+ }
+ if( iNext==0 && pLeaf->szLeaf!=pLeaf->nn ){
+ fts5GetVarint32(&aPg[pLeaf->szLeaf], iNext);
+ }
+
+ if( iNext==0 ){
+ /* The page contains no terms or rowids. Replace it with an empty
+ ** page and move on to the right-hand peer. */
+ const u8 aEmpty[] = {0x00, 0x00, 0x00, 0x04};
+ assert_nc( bDetailNone==0 || pLeaf->nn==4 );
+ if( bDetailNone==0 ) fts5DataWrite(p, iRowid, aEmpty, sizeof(aEmpty));
+ fts5DataRelease(pLeaf);
+ pLeaf = 0;
+ }else if( bDetailNone ){
+ break;
+ }else if( iNext>=pLeaf->szLeaf || iNext<4 ){
+ p->rc = FTS5_CORRUPT;
+ break;
+ }else{
+ int nShift = iNext - 4;
+ int nPg;
+
+ int nIdx = 0;
+ u8 *aIdx = 0;
+
+ /* Unless the current page footer is 0 bytes in size (in which case
+ ** the new page footer will be as well), allocate and populate a
+ ** buffer containing the new page footer. Set stack variables aIdx
+ ** and nIdx accordingly. */
+ if( pLeaf->nn>pLeaf->szLeaf ){
+ int iFirst = 0;
+ int i1 = pLeaf->szLeaf;
+ int i2 = 0;
+
+ aIdx = sqlite3Fts5MallocZero(&p->rc, (pLeaf->nn-pLeaf->szLeaf)+2);
+ if( aIdx==0 ) break;
+ i1 += fts5GetVarint32(&aPg[i1], iFirst);
+ i2 = sqlite3Fts5PutVarint(aIdx, iFirst-nShift);
+ if( i1<pLeaf->nn ){
+ memcpy(&aIdx[i2], &aPg[i1], pLeaf->nn-i1);
+ i2 += (pLeaf->nn-i1);
+ }
+ nIdx = i2;
+ }
+
+ /* Modify the contents of buffer aPg[]. Set nPg to the new size
+ ** in bytes. The new page is always smaller than the old. */
+ nPg = pLeaf->szLeaf - nShift;
+ memmove(&aPg[4], &aPg[4+nShift], nPg-4);
+ fts5PutU16(&aPg[2], nPg);
+ if( fts5GetU16(&aPg[0]) ) fts5PutU16(&aPg[0], 4);
+ if( nIdx>0 ){
+ memcpy(&aPg[nPg], aIdx, nIdx);
+ nPg += nIdx;
+ }
+ sqlite3_free(aIdx);
+
+ /* Write the new page to disk and exit the loop */
+ assert( nPg>4 || fts5GetU16(aPg)==0 );
+ fts5DataWrite(p, iRowid, aPg, nPg);
+ break;
+ }
+ }
+ fts5DataRelease(pLeaf);
+}
+
+/*
+** Completely remove the entry that pSeg currently points to from
+** the database.
+*/
+static void fts5DoSecureDelete(
+ Fts5Index *p,
+ Fts5SegIter *pSeg
+){
+ const int bDetailNone = (p->pConfig->eDetail==FTS5_DETAIL_NONE);
+ int iSegid = pSeg->pSeg->iSegid;
+ u8 *aPg = pSeg->pLeaf->p;
+ int nPg = pSeg->pLeaf->nn;
+ int iPgIdx = pSeg->pLeaf->szLeaf;
+
+ u64 iDelta = 0;
+ u64 iNextDelta = 0;
+ int iNextOff = 0;
+ int iOff = 0;
+ int nIdx = 0;
+ u8 *aIdx = 0;
+ int bLastInDoclist = 0;
+ int iIdx = 0;
+ int iStart = 0;
+ int iKeyOff = 0;
+ int iPrevKeyOff = 0;
+ int iDelKeyOff = 0; /* Offset of deleted key, if any */
+
+ nIdx = nPg-iPgIdx;
+ aIdx = sqlite3Fts5MallocZero(&p->rc, nIdx+16);
+ if( p->rc ) return;
+ memcpy(aIdx, &aPg[iPgIdx], nIdx);
+
+ /* At this point segment iterator pSeg points to the entry
+ ** this function should remove from the b-tree segment.
+ **
+ ** In detail=full or detail=column mode, pSeg->iLeafOffset is the
+ ** offset of the first byte in the position-list for the entry to
+ ** remove. Immediately before this comes two varints that will also
+ ** need to be removed:
+ **
+ ** + the rowid or delta rowid value for the entry, and
+ ** + the size of the position list in bytes.
+ **
+ ** Or, in detail=none mode, there is a single varint prior to
+ ** pSeg->iLeafOffset - the rowid or delta rowid value.
+ **
+ ** This block sets the following variables:
+ **
+ ** iStart:
+ ** iDelta:
+ */
+ {
+ int iSOP;
+ if( pSeg->iLeafPgno==pSeg->iTermLeafPgno ){
+ iStart = pSeg->iTermLeafOffset;
+ }else{
+ iStart = fts5GetU16(&aPg[0]);
+ }
+
+ iSOP = iStart + fts5GetVarint(&aPg[iStart], &iDelta);
+ assert_nc( iSOP<=pSeg->iLeafOffset );
+
+ if( bDetailNone ){
+ while( iSOP<pSeg->iLeafOffset ){
+ if( aPg[iSOP]==0x00 ) iSOP++;
+ if( aPg[iSOP]==0x00 ) iSOP++;
+ iStart = iSOP;
+ iSOP = iStart + fts5GetVarint(&aPg[iStart], &iDelta);
+ }
+
+ iNextOff = iSOP;
+ if( iNextOff<pSeg->iEndofDoclist && aPg[iNextOff]==0x00 ) iNextOff++;
+ if( iNextOff<pSeg->iEndofDoclist && aPg[iNextOff]==0x00 ) iNextOff++;
+
+ }else{
+ int nPos = 0;
+ iSOP += fts5GetVarint32(&aPg[iSOP], nPos);
+ while( iSOP<pSeg->iLeafOffset ){
+ iStart = iSOP + (nPos/2);
+ iSOP = iStart + fts5GetVarint(&aPg[iStart], &iDelta);
+ iSOP += fts5GetVarint32(&aPg[iSOP], nPos);
+ }
+ assert_nc( iSOP==pSeg->iLeafOffset );
+ iNextOff = pSeg->iLeafOffset + pSeg->nPos;
+ }
+ }
+
+ iOff = iStart;
+ if( iNextOff>=iPgIdx ){
+ int pgno = pSeg->iLeafPgno+1;
+ fts5SecureDeleteOverflow(p, pSeg->pSeg, pgno, &bLastInDoclist);
+ iNextOff = iPgIdx;
+ }else{
+ /* Set bLastInDoclist to true if the entry being removed is the last
+ ** in its doclist. */
+ for(iIdx=0, iKeyOff=0; iIdx<nIdx; /* no-op */){
+ u32 iVal = 0;
+ iIdx += fts5GetVarint32(&aIdx[iIdx], iVal);
+ iKeyOff += iVal;
+ if( iKeyOff==iNextOff ){
+ bLastInDoclist = 1;
+ }
+ }
+ }
+
+ if( fts5GetU16(&aPg[0])==iStart && (bLastInDoclist||iNextOff==iPgIdx) ){
+ fts5PutU16(&aPg[0], 0);
+ }
+
+ if( bLastInDoclist==0 ){
+ if( iNextOff!=iPgIdx ){
+ iNextOff += fts5GetVarint(&aPg[iNextOff], &iNextDelta);
+ iOff += sqlite3Fts5PutVarint(&aPg[iOff], iDelta + iNextDelta);
+ }
+ }else if(
+ iStart==pSeg->iTermLeafOffset && pSeg->iLeafPgno==pSeg->iTermLeafPgno
+ ){
+ /* The entry being removed was the only position list in its
+ ** doclist. Therefore the term needs to be removed as well. */
+ int iKey = 0;
+ for(iIdx=0, iKeyOff=0; iIdx<nIdx; iKey++){
+ u32 iVal = 0;
+ iIdx += fts5GetVarint32(&aIdx[iIdx], iVal);
+ if( (iKeyOff+iVal)>(u32)iStart ) break;
+ iKeyOff += iVal;
+ }
+
+ iDelKeyOff = iOff = iKeyOff;
+ if( iNextOff!=iPgIdx ){
+ int nPrefix = 0;
+ int nSuffix = 0;
+ int nPrefix2 = 0;
+ int nSuffix2 = 0;
+
+ iDelKeyOff = iNextOff;
+ iNextOff += fts5GetVarint32(&aPg[iNextOff], nPrefix2);
+ iNextOff += fts5GetVarint32(&aPg[iNextOff], nSuffix2);
+
+ if( iKey!=1 ){
+ iKeyOff += fts5GetVarint32(&aPg[iKeyOff], nPrefix);
+ }
+ iKeyOff += fts5GetVarint32(&aPg[iKeyOff], nSuffix);
+
+ nPrefix = MIN(nPrefix, nPrefix2);
+ nSuffix = (nPrefix2 + nSuffix2) - nPrefix;
+
+ if( (iKeyOff+nSuffix)>iPgIdx || (iNextOff+nSuffix2)>iPgIdx ){
+ p->rc = FTS5_CORRUPT;
+ }else{
+ if( iKey!=1 ){
+ iOff += sqlite3Fts5PutVarint(&aPg[iOff], nPrefix);
+ }
+ iOff += sqlite3Fts5PutVarint(&aPg[iOff], nSuffix);
+ if( nPrefix2>nPrefix ){
+ memcpy(&aPg[iOff], &pSeg->term.p[nPrefix], nPrefix2-nPrefix);
+ iOff += (nPrefix2-nPrefix);
+ }
+ memmove(&aPg[iOff], &aPg[iNextOff], nSuffix2);
+ iOff += nSuffix2;
+ iNextOff += nSuffix2;
+ }
+ }
+ }else if( iStart==4 ){
+ int iPgno;
+
+ assert_nc( pSeg->iLeafPgno>pSeg->iTermLeafPgno );
+ /* The entry being removed may be the only position list in
+ ** its doclist. */
+ for(iPgno=pSeg->iLeafPgno-1; iPgno>pSeg->iTermLeafPgno; iPgno-- ){
+ Fts5Data *pPg = fts5DataRead(p, FTS5_SEGMENT_ROWID(iSegid, iPgno));
+ int bEmpty = (pPg && pPg->nn==4);
+ fts5DataRelease(pPg);
+ if( bEmpty==0 ) break;
+ }
+
+ if( iPgno==pSeg->iTermLeafPgno ){
+ i64 iId = FTS5_SEGMENT_ROWID(iSegid, pSeg->iTermLeafPgno);
+ Fts5Data *pTerm = fts5DataRead(p, iId);
+ if( pTerm && pTerm->szLeaf==pSeg->iTermLeafOffset ){
+ u8 *aTermIdx = &pTerm->p[pTerm->szLeaf];
+ int nTermIdx = pTerm->nn - pTerm->szLeaf;
+ int iTermIdx = 0;
+ int iTermOff = 0;
+
+ while( 1 ){
+ u32 iVal = 0;
+ int nByte = fts5GetVarint32(&aTermIdx[iTermIdx], iVal);
+ iTermOff += iVal;
+ if( (iTermIdx+nByte)>=nTermIdx ) break;
+ iTermIdx += nByte;
+ }
+ nTermIdx = iTermIdx;
+
+ memmove(&pTerm->p[iTermOff], &pTerm->p[pTerm->szLeaf], nTermIdx);
+ fts5PutU16(&pTerm->p[2], iTermOff);
+
+ fts5DataWrite(p, iId, pTerm->p, iTermOff+nTermIdx);
+ if( nTermIdx==0 ){
+ fts5SecureDeleteIdxEntry(p, iSegid, pSeg->iTermLeafPgno);
+ }
+ }
+ fts5DataRelease(pTerm);
+ }
+ }
+
+ if( p->rc==SQLITE_OK ){
+ const int nMove = nPg - iNextOff;
+ int nShift = 0;
+
+ memmove(&aPg[iOff], &aPg[iNextOff], nMove);
+ iPgIdx -= (iNextOff - iOff);
+ nPg = iPgIdx;
+ fts5PutU16(&aPg[2], iPgIdx);
+
+ nShift = iNextOff - iOff;
+ for(iIdx=0, iKeyOff=0, iPrevKeyOff=0; iIdx<nIdx; /* no-op */){
+ u32 iVal = 0;
+ iIdx += fts5GetVarint32(&aIdx[iIdx], iVal);
+ iKeyOff += iVal;
+ if( iKeyOff!=iDelKeyOff ){
+ if( iKeyOff>iOff ){
+ iKeyOff -= nShift;
+ nShift = 0;
+ }
+ nPg += sqlite3Fts5PutVarint(&aPg[nPg], iKeyOff - iPrevKeyOff);
+ iPrevKeyOff = iKeyOff;
+ }
+ }
+
+ if( iPgIdx==nPg && nIdx>0 && pSeg->iLeafPgno!=1 ){
+ fts5SecureDeleteIdxEntry(p, iSegid, pSeg->iLeafPgno);
+ }
+
+ assert_nc( nPg>4 || fts5GetU16(aPg)==0 );
+ fts5DataWrite(p, FTS5_SEGMENT_ROWID(iSegid,pSeg->iLeafPgno), aPg,nPg);
+ }
+ sqlite3_free(aIdx);
+}
+
+/*
+** This is called as part of flushing a delete to disk in 'secure-delete'
+** mode. It edits the segments within the database described by argument
+** pStruct to remove the entries for term zTerm, rowid iRowid.
+*/
+static void fts5FlushSecureDelete(
+ Fts5Index *p,
+ Fts5Structure *pStruct,
+ const char *zTerm,
+ i64 iRowid
+){
+ const int f = FTS5INDEX_QUERY_SKIPHASH;
+ int nTerm = (int)strlen(zTerm);
+ Fts5Iter *pIter = 0; /* Used to find term instance */
+
+ fts5MultiIterNew(p, pStruct, f, 0, (const u8*)zTerm, nTerm, -1, 0, &pIter);
+ if( fts5MultiIterEof(p, pIter)==0 ){
+ i64 iThis = fts5MultiIterRowid(pIter);
+ if( iThis<iRowid ){
+ fts5MultiIterNextFrom(p, pIter, iRowid);
+ }
+
+ if( p->rc==SQLITE_OK
+ && fts5MultiIterEof(p, pIter)==0
+ && iRowid==fts5MultiIterRowid(pIter)
+ ){
+ Fts5SegIter *pSeg = &pIter->aSeg[pIter->aFirst[1].iFirst];
+ fts5DoSecureDelete(p, pSeg);
+ }
+ }
+
+ fts5MultiIterFree(pIter);
+}
+
+
+/*
** Flush the contents of in-memory hash table iHash to a new level-0
** segment on disk. Also update the corresponding structure record.
**
@@ -225559,6 +237522,7 @@ static void fts5FlushOneHash(Fts5Index *p){
if( iSegid ){
const int pgsz = p->pConfig->pgsz;
int eDetail = p->pConfig->eDetail;
+ int bSecureDelete = p->pConfig->bSecureDelete;
Fts5StructureSegment *pSeg; /* New segment within pStruct */
Fts5Buffer *pBuf; /* Buffer in which to assemble leaf page */
Fts5Buffer *pPgidx; /* Buffer in which to assemble pgidx */
@@ -225581,40 +237545,77 @@ static void fts5FlushOneHash(Fts5Index *p){
}
while( p->rc==SQLITE_OK && 0==sqlite3Fts5HashScanEof(pHash) ){
const char *zTerm; /* Buffer containing term */
+ int nTerm; /* Size of zTerm in bytes */
const u8 *pDoclist; /* Pointer to doclist for this term */
int nDoclist; /* Size of doclist in bytes */
- /* Write the term for this entry to disk. */
+ /* Get the term and doclist for this entry. */
sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist);
- fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm);
- if( p->rc!=SQLITE_OK ) break;
+ nTerm = (int)strlen(zTerm);
+ if( bSecureDelete==0 ){
+ fts5WriteAppendTerm(p, &writer, nTerm, (const u8*)zTerm);
+ if( p->rc!=SQLITE_OK ) break;
+ assert( writer.bFirstRowidInPage==0 );
+ }
- assert( writer.bFirstRowidInPage==0 );
- if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){
+ if( !bSecureDelete && pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){
/* The entire doclist will fit on the current leaf. */
fts5BufferSafeAppendBlob(pBuf, pDoclist, nDoclist);
}else{
+ int bTermWritten = !bSecureDelete;
i64 iRowid = 0;
- u64 iDelta = 0;
+ i64 iPrev = 0;
int iOff = 0;
/* The entire doclist will not fit on this leaf. The following
** loop iterates through the poslists that make up the current
** doclist. */
while( p->rc==SQLITE_OK && iOff<nDoclist ){
+ u64 iDelta = 0;
iOff += fts5GetVarint(&pDoclist[iOff], &iDelta);
iRowid += iDelta;
+ /* If in secure delete mode, and if this entry in the poslist is
+ ** in fact a delete, then edit the existing segments directly
+ ** using fts5FlushSecureDelete(). */
+ if( bSecureDelete ){
+ if( eDetail==FTS5_DETAIL_NONE ){
+ if( iOff<nDoclist && pDoclist[iOff]==0x00 ){
+ fts5FlushSecureDelete(p, pStruct, zTerm, iRowid);
+ iOff++;
+ if( iOff<nDoclist && pDoclist[iOff]==0x00 ){
+ iOff++;
+ nDoclist = 0;
+ }else{
+ continue;
+ }
+ }
+ }else if( (pDoclist[iOff] & 0x01) ){
+ fts5FlushSecureDelete(p, pStruct, zTerm, iRowid);
+ if( p->rc!=SQLITE_OK || pDoclist[iOff]==0x01 ){
+ iOff++;
+ continue;
+ }
+ }
+ }
+
+ if( p->rc==SQLITE_OK && bTermWritten==0 ){
+ fts5WriteAppendTerm(p, &writer, nTerm, (const u8*)zTerm);
+ bTermWritten = 1;
+ assert( p->rc!=SQLITE_OK || writer.bFirstRowidInPage==0 );
+ }
+
if( writer.bFirstRowidInPage ){
fts5PutU16(&pBuf->p[0], (u16)pBuf->n); /* first rowid on page */
pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid);
writer.bFirstRowidInPage = 0;
fts5WriteDlidxAppend(p, &writer, iRowid);
- if( p->rc!=SQLITE_OK ) break;
}else{
- pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iDelta);
+ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid-iPrev);
}
+ if( p->rc!=SQLITE_OK ) break;
assert( pBuf->n<=pBuf->nSpace );
+ iPrev = iRowid;
if( eDetail==FTS5_DETAIL_NONE ){
if( iOff<nDoclist && pDoclist[iOff]==0 ){
@@ -225673,20 +237674,23 @@ static void fts5FlushOneHash(Fts5Index *p){
sqlite3Fts5HashClear(pHash);
fts5WriteFinish(p, &writer, &pgnoLast);
- /* Update the Fts5Structure. It is written back to the database by the
- ** fts5StructureRelease() call below. */
- if( pStruct->nLevel==0 ){
- fts5StructureAddLevel(&p->rc, &pStruct);
- }
- fts5StructureExtendLevel(&p->rc, pStruct, 0, 1, 0);
- if( p->rc==SQLITE_OK ){
- pSeg = &pStruct->aLevel[0].aSeg[ pStruct->aLevel[0].nSeg++ ];
- pSeg->iSegid = iSegid;
- pSeg->pgnoFirst = 1;
- pSeg->pgnoLast = pgnoLast;
- pStruct->nSegment++;
+ assert( p->rc!=SQLITE_OK || bSecureDelete || pgnoLast>0 );
+ if( pgnoLast>0 ){
+ /* Update the Fts5Structure. It is written back to the database by the
+ ** fts5StructureRelease() call below. */
+ if( pStruct->nLevel==0 ){
+ fts5StructureAddLevel(&p->rc, &pStruct);
+ }
+ fts5StructureExtendLevel(&p->rc, pStruct, 0, 1, 0);
+ if( p->rc==SQLITE_OK ){
+ pSeg = &pStruct->aLevel[0].aSeg[ pStruct->aLevel[0].nSeg++ ];
+ pSeg->iSegid = iSegid;
+ pSeg->pgnoFirst = 1;
+ pSeg->pgnoLast = pgnoLast;
+ pStruct->nSegment++;
+ }
+ fts5StructurePromote(p, 0, pStruct);
}
- fts5StructurePromote(p, 0, pStruct);
}
fts5IndexAutomerge(p, &pStruct, pgnoLast);
@@ -225742,10 +237746,10 @@ static Fts5Structure *fts5IndexOptimizeStruct(
if( pNew ){
Fts5StructureLevel *pLvl;
nByte = nSeg * sizeof(Fts5StructureSegment);
- pNew->nLevel = pStruct->nLevel+1;
+ pNew->nLevel = MIN(pStruct->nLevel+1, FTS5_MAX_LEVEL);
pNew->nRef = 1;
pNew->nWriteCounter = pStruct->nWriteCounter;
- pLvl = &pNew->aLevel[pStruct->nLevel];
+ pLvl = &pNew->aLevel[pNew->nLevel-1];
pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&p->rc, nByte);
if( pLvl->aSeg ){
int iLvl, iSeg;
@@ -225827,7 +237831,7 @@ static int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge){
static void fts5AppendRowid(
Fts5Index *p,
- i64 iDelta,
+ u64 iDelta,
Fts5Iter *pUnused,
Fts5Buffer *pBuf
){
@@ -225837,7 +237841,7 @@ static void fts5AppendRowid(
static void fts5AppendPoslist(
Fts5Index *p,
- i64 iDelta,
+ u64 iDelta,
Fts5Iter *pMulti,
Fts5Buffer *pBuf
){
@@ -225912,10 +237916,10 @@ static void fts5MergeAppendDocid(
}
#endif
-#define fts5MergeAppendDocid(pBuf, iLastRowid, iRowid) { \
- assert( (pBuf)->n!=0 || (iLastRowid)==0 ); \
- fts5BufferSafeAppendVarint((pBuf), (iRowid) - (iLastRowid)); \
- (iLastRowid) = (iRowid); \
+#define fts5MergeAppendDocid(pBuf, iLastRowid, iRowid) { \
+ assert( (pBuf)->n!=0 || (iLastRowid)==0 ); \
+ fts5BufferSafeAppendVarint((pBuf), (u64)(iRowid) - (u64)(iLastRowid)); \
+ (iLastRowid) = (iRowid); \
}
/*
@@ -226047,7 +238051,7 @@ static void fts5MergePrefixLists(
/* Initialize a doclist-iterator for each input buffer. Arrange them in
** a linked-list starting at pHead in ascending order of rowid. Avoid
** linking any iterators already at EOF into the linked list at all. */
- assert( nBuf+1<=sizeof(aMerger)/sizeof(aMerger[0]) );
+ assert( nBuf+1<=(int)(sizeof(aMerger)/sizeof(aMerger[0])) );
memset(aMerger, 0, sizeof(PrefixMerger)*(nBuf+1));
pHead = &aMerger[nBuf];
fts5DoclistIterInit(p1, &pHead->iter);
@@ -226186,7 +238190,7 @@ static void fts5SetupPrefixIter(
int nMerge = 1;
void (*xMerge)(Fts5Index*, Fts5Buffer*, int, Fts5Buffer*);
- void (*xAppend)(Fts5Index*, i64, Fts5Iter*, Fts5Buffer*);
+ void (*xAppend)(Fts5Index*, u64, Fts5Iter*, Fts5Buffer*);
if( p->pConfig->eDetail==FTS5_DETAIL_NONE ){
xMerge = fts5MergeRowidLists;
xAppend = fts5AppendRowid;
@@ -226225,7 +238229,7 @@ static void fts5SetupPrefixIter(
Fts5SegIter *pSeg = &p1->aSeg[ p1->aFirst[1].iFirst ];
p1->xSetOutputs(p1, pSeg);
if( p1->base.nData ){
- xAppend(p, p1->base.iRowid-iLastRowid, p1, &doclist);
+ xAppend(p, (u64)p1->base.iRowid-(u64)iLastRowid, p1, &doclist);
iLastRowid = p1->base.iRowid;
}
}
@@ -226273,7 +238277,7 @@ static void fts5SetupPrefixIter(
iLastRowid = 0;
}
- xAppend(p, p1->base.iRowid-iLastRowid, p1, &doclist);
+ xAppend(p, (u64)p1->base.iRowid-(u64)iLastRowid, p1, &doclist);
iLastRowid = p1->base.iRowid;
}
@@ -226427,6 +238431,7 @@ static int sqlite3Fts5IndexClose(Fts5Index *p){
sqlite3_finalize(p->pIdxDeleter);
sqlite3_finalize(p->pIdxSelect);
sqlite3_finalize(p->pDataVersion);
+ sqlite3_finalize(p->pDeleteFromIdx);
sqlite3Fts5HashFree(p->pHash);
sqlite3_free(p->zDataTbl);
sqlite3_free(p);
@@ -226541,7 +238546,7 @@ static int sqlite3Fts5IndexQuery(
if( sqlite3Fts5BufferSize(&p->rc, &buf, nToken+1)==0 ){
int iIdx = 0; /* Index to search */
int iPrefixIdx = 0; /* +1 prefix index */
- if( nToken ) memcpy(&buf.p[1], pToken, nToken);
+ if( nToken>0 ) memcpy(&buf.p[1], pToken, nToken);
/* Figure out which index to search and set iIdx accordingly. If this
** is a prefix query for which there is no prefix index, set iIdx to
@@ -226582,11 +238587,15 @@ static int sqlite3Fts5IndexQuery(
/* Scan multiple terms in the main index */
int bDesc = (flags & FTS5INDEX_QUERY_DESC)!=0;
fts5SetupPrefixIter(p, bDesc, iPrefixIdx, buf.p, nToken+1, pColset,&pRet);
- assert( p->rc!=SQLITE_OK || pRet->pColset==0 );
- fts5IterSetOutputCb(&p->rc, pRet);
- if( p->rc==SQLITE_OK ){
- Fts5SegIter *pSeg = &pRet->aSeg[pRet->aFirst[1].iFirst];
- if( pSeg->pLeaf ) pRet->xSetOutputs(pRet, pSeg);
+ if( pRet==0 ){
+ assert( p->rc!=SQLITE_OK );
+ }else{
+ assert( pRet->pColset==0 );
+ fts5IterSetOutputCb(&p->rc, pRet);
+ if( p->rc==SQLITE_OK ){
+ Fts5SegIter *pSeg = &pRet->aSeg[pRet->aFirst[1].iFirst];
+ if( pSeg->pLeaf ) pRet->xSetOutputs(pRet, pSeg);
+ }
}
}
@@ -226834,7 +238843,7 @@ static int fts5QueryCksum(
Fts5IndexIter *pIter = 0;
int rc = sqlite3Fts5IndexQuery(p, z, n, flags, 0, &pIter);
- while( rc==SQLITE_OK && 0==sqlite3Fts5IterEof(pIter) ){
+ while( rc==SQLITE_OK && ALWAYS(pIter!=0) && 0==sqlite3Fts5IterEof(pIter) ){
i64 rowid = pIter->iRowid;
if( eDetail==FTS5_DETAIL_NONE ){
@@ -227053,6 +239062,7 @@ static void fts5IndexIntegrityCheckSegment(
Fts5StructureSegment *pSeg /* Segment to check internal consistency */
){
Fts5Config *pConfig = p->pConfig;
+ int bSecureDelete = (pConfig->iVersion==FTS5_CURRENT_VERSION_SECUREDELETE);
sqlite3_stmt *pStmt = 0;
int rc2;
int iIdxPrevLeaf = pSeg->pgnoFirst-1;
@@ -227088,7 +239098,19 @@ static void fts5IndexIntegrityCheckSegment(
** is also a rowid pointer within the leaf page header, it points to a
** location before the term. */
if( pLeaf->nn<=pLeaf->szLeaf ){
- p->rc = FTS5_CORRUPT;
+
+ if( nIdxTerm==0
+ && pConfig->iVersion==FTS5_CURRENT_VERSION_SECUREDELETE
+ && pLeaf->nn==pLeaf->szLeaf
+ && pLeaf->nn==4
+ ){
+ /* special case - the very first page in a segment keeps its %_idx
+ ** entry even if all the terms are removed from it by secure-delete
+ ** operations. */
+ }else{
+ p->rc = FTS5_CORRUPT;
+ }
+
}else{
int iOff; /* Offset of first term on leaf */
int iRowidOff; /* Offset of first rowid on leaf */
@@ -227152,9 +239174,12 @@ static void fts5IndexIntegrityCheckSegment(
ASSERT_SZLEAF_OK(pLeaf);
if( iRowidOff>=pLeaf->szLeaf ){
p->rc = FTS5_CORRUPT;
- }else{
+ }else if( bSecureDelete==0 || iRowidOff>0 ){
+ i64 iDlRowid = fts5DlidxIterRowid(pDlidx);
fts5GetVarint(&pLeaf->p[iRowidOff], (u64*)&iRowid);
- if( iRowid!=fts5DlidxIterRowid(pDlidx) ) p->rc = FTS5_CORRUPT;
+ if( iRowid<iDlRowid || (bSecureDelete==0 && iRowid!=iDlRowid) ){
+ p->rc = FTS5_CORRUPT;
+ }
}
fts5DataRelease(pLeaf);
}
@@ -227199,6 +239224,7 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum
Fts5Buffer poslist = {0,0,0}; /* Buffer used to hold a poslist */
Fts5Iter *pIter; /* Used to iterate through entire index */
Fts5Structure *pStruct; /* Index structure */
+ int iLvl, iSeg;
#ifdef SQLITE_DEBUG
/* Used by extra internal tests only run if NDEBUG is not defined */
@@ -227209,15 +239235,16 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum
/* Load the FTS index structure */
pStruct = fts5StructureRead(p);
+ if( pStruct==0 ){
+ assert( p->rc!=SQLITE_OK );
+ return fts5IndexReturn(p);
+ }
/* Check that the internal nodes of each segment match the leaves */
- if( pStruct ){
- int iLvl, iSeg;
- for(iLvl=0; iLvl<pStruct->nLevel; iLvl++){
- for(iSeg=0; iSeg<pStruct->aLevel[iLvl].nSeg; iSeg++){
- Fts5StructureSegment *pSeg = &pStruct->aLevel[iLvl].aSeg[iSeg];
- fts5IndexIntegrityCheckSegment(p, pSeg);
- }
+ for(iLvl=0; iLvl<pStruct->nLevel; iLvl++){
+ for(iSeg=0; iSeg<pStruct->aLevel[iLvl].nSeg; iSeg++){
+ Fts5StructureSegment *pSeg = &pStruct->aLevel[iLvl].aSeg[iSeg];
+ fts5IndexIntegrityCheckSegment(p, pSeg);
}
}
@@ -227246,6 +239273,7 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum
/* If this is a new term, query for it. Update cksum3 with the results. */
fts5TestTerm(p, &term, z, n, cksum2, &cksum3);
+ if( p->rc ) break;
if( eDetail==FTS5_DETAIL_NONE ){
if( 0==fts5MultiIterIsEmpty(p, pIter) ){
@@ -228050,7 +240078,7 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){
break;
case FTS5_SYNC:
- assert( p->ts.eState==1 );
+ assert( p->ts.eState==1 || p->ts.eState==2 );
p->ts.eState = 2;
break;
@@ -228065,21 +240093,21 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){
break;
case FTS5_SAVEPOINT:
- assert( p->ts.eState==1 );
+ assert( p->ts.eState>=1 );
assert( iSavepoint>=0 );
assert( iSavepoint>=p->ts.iSavepoint );
p->ts.iSavepoint = iSavepoint;
break;
case FTS5_RELEASE:
- assert( p->ts.eState==1 );
+ assert( p->ts.eState>=1 );
assert( iSavepoint>=0 );
assert( iSavepoint<=p->ts.iSavepoint );
p->ts.iSavepoint = iSavepoint-1;
break;
case FTS5_ROLLBACKTO:
- assert( p->ts.eState==1 );
+ assert( p->ts.eState>=1 );
assert( iSavepoint>=-1 );
/* The following assert() can fail if another vtab strikes an error
** within an xSavepoint() call then SQLite calls xRollbackTo() - without
@@ -228594,7 +240622,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){
rc = sqlite3_step(pSorter->pStmt);
if( rc==SQLITE_DONE ){
rc = SQLITE_OK;
- CsrFlagSet(pCsr, FTS5CSR_EOF);
+ CsrFlagSet(pCsr, FTS5CSR_EOF|FTS5CSR_REQUIRE_CONTENT);
}else if( rc==SQLITE_ROW ){
const u8 *a;
const u8 *aBlob;
@@ -229164,7 +241192,8 @@ static int fts5FilterMethod(
pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->p.base.zErrMsg
);
if( rc==SQLITE_OK ){
- if( pCsr->ePlan==FTS5_PLAN_ROWID ){
+ if( pRowidEq!=0 ){
+ assert( pCsr->ePlan==FTS5_PLAN_ROWID );
sqlite3_bind_value(pCsr->pStmt, 1, pRowidEq);
}else{
sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iFirstRowid);
@@ -229412,9 +241441,11 @@ static int fts5UpdateMethod(
Fts5Config *pConfig = pTab->p.pConfig;
int eType0; /* value_type() of apVal[0] */
int rc = SQLITE_OK; /* Return code */
+ int bUpdateOrDelete = 0;
+
/* A transaction must be open when this is called. */
- assert( pTab->ts.eState==1 );
+ assert( pTab->ts.eState==1 || pTab->ts.eState==2 );
assert( pVtab->zErrMsg==0 );
assert( nArg==1 || nArg==(2+pConfig->nCol+2) );
@@ -229422,6 +241453,11 @@ static int fts5UpdateMethod(
|| sqlite3_value_type(apVal[0])==SQLITE_NULL
);
assert( pTab->p.pConfig->pzErrmsg==0 );
+ if( pConfig->pgsz==0 ){
+ rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex);
+ if( rc!=SQLITE_OK ) return rc;
+ }
+
pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg;
/* Put any active cursors into REQUIRE_SEEK state. */
@@ -229474,6 +241510,7 @@ static int fts5UpdateMethod(
else if( nArg==1 ){
i64 iDel = sqlite3_value_int64(apVal[0]); /* Rowid to delete */
rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0);
+ bUpdateOrDelete = 1;
}
/* INSERT or UPDATE */
@@ -229489,6 +241526,7 @@ static int fts5UpdateMethod(
if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){
i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */
rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0);
+ bUpdateOrDelete = 1;
}
fts5StorageInsert(&rc, pTab, apVal, pRowid);
}
@@ -229517,10 +241555,24 @@ static int fts5UpdateMethod(
rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0);
fts5StorageInsert(&rc, pTab, apVal, pRowid);
}
+ bUpdateOrDelete = 1;
}
}
}
+ if( rc==SQLITE_OK
+ && bUpdateOrDelete
+ && pConfig->bSecureDelete
+ && pConfig->iVersion==FTS5_CURRENT_VERSION
+ ){
+ rc = sqlite3Fts5StorageConfigValue(
+ pTab->pStorage, "version", 0, FTS5_CURRENT_VERSION_SECUREDELETE
+ );
+ if( rc==SQLITE_OK ){
+ pConfig->iVersion = FTS5_CURRENT_VERSION_SECUREDELETE;
+ }
+ }
+
pTab->p.pConfig->pzErrmsg = 0;
return rc;
}
@@ -230380,6 +242432,7 @@ static int fts5RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){
UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */
fts5CheckTransactionState(pTab, FTS5_ROLLBACKTO, iSavepoint);
fts5TripCursors(pTab);
+ pTab->p.pConfig->pgsz = 0;
return sqlite3Fts5StorageRollback(pTab->pStorage);
}
@@ -230582,7 +242635,7 @@ static void fts5SourceIdFunc(
){
assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused);
- sqlite3_result_text(pCtx, "fts5: 2021-06-18 18:36:39 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5", -1, SQLITE_TRANSIENT);
+ sqlite3_result_text(pCtx, "fts5: 2023-05-16 12:36:15 831d0fb2836b71c9bc51067c49fee4b8f18047814f2ff22d817d25195cf350b0", -1, SQLITE_TRANSIENT);
}
/*
@@ -230655,7 +242708,9 @@ static int fts5Init(sqlite3 *db){
}
if( rc==SQLITE_OK ){
rc = sqlite3_create_function(
- db, "fts5_source_id", 0, SQLITE_UTF8, p, fts5SourceIdFunc, 0, 0
+ db, "fts5_source_id", 0,
+ SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS,
+ p, fts5SourceIdFunc, 0, 0
);
}
}
@@ -231133,12 +243188,16 @@ static int fts5StorageDeleteFromIndex(
if( pConfig->abUnindexed[iCol-1]==0 ){
const char *zText;
int nText;
+ assert( pSeek==0 || apVal==0 );
+ assert( pSeek!=0 || apVal!=0 );
if( pSeek ){
zText = (const char*)sqlite3_column_text(pSeek, iCol);
nText = sqlite3_column_bytes(pSeek, iCol);
- }else{
+ }else if( ALWAYS(apVal) ){
zText = (const char*)sqlite3_value_text(apVal[iCol-1]);
nText = sqlite3_value_bytes(apVal[iCol-1]);
+ }else{
+ continue;
}
ctx.szCol = 0;
rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT,
@@ -231774,8 +243833,9 @@ static int sqlite3Fts5StorageDocsize(Fts5Storage *p, i64 iRowid, int *aCol){
assert( p->pConfig->bColumnsize );
rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP_DOCSIZE, &pLookup, 0);
- if( rc==SQLITE_OK ){
+ if( pLookup ){
int bCorrupt = 1;
+ assert( rc==SQLITE_OK );
sqlite3_bind_int64(pLookup, 1, iRowid);
if( SQLITE_ROW==sqlite3_step(pLookup) ){
const u8 *aBlob = sqlite3_column_blob(pLookup, 0);
@@ -231788,6 +243848,8 @@ static int sqlite3Fts5StorageDocsize(Fts5Storage *p, i64 iRowid, int *aCol){
if( bCorrupt && rc==SQLITE_OK ){
rc = FTS5_CORRUPT;
}
+ }else{
+ assert( rc!=SQLITE_OK );
}
return rc;
@@ -234478,6 +246540,7 @@ struct Fts5VocabCursor {
int bEof; /* True if this cursor is at EOF */
Fts5IndexIter *pIter; /* Term/rowid iterator object */
+ void *pStruct; /* From sqlite3Fts5StructureRef() */
int nLeTerm; /* Size of zLeTerm in bytes */
char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */
@@ -234791,7 +246854,7 @@ static int fts5VocabOpenMethod(
}
if( rc==SQLITE_OK ){
- int nByte = pFts5->pConfig->nCol * sizeof(i64)*2 + sizeof(Fts5VocabCursor);
+ i64 nByte = pFts5->pConfig->nCol * sizeof(i64)*2 + sizeof(Fts5VocabCursor);
pCsr = (Fts5VocabCursor*)sqlite3Fts5MallocZero(&rc, nByte);
}
@@ -234811,6 +246874,8 @@ static int fts5VocabOpenMethod(
static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){
pCsr->rowid = 0;
sqlite3Fts5IterClose(pCsr->pIter);
+ sqlite3Fts5StructureRelease(pCsr->pStruct);
+ pCsr->pStruct = 0;
pCsr->pIter = 0;
sqlite3_free(pCsr->zLeTerm);
pCsr->nLeTerm = -1;
@@ -234888,9 +246953,11 @@ static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){
static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){
Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor;
Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab;
- int rc = SQLITE_OK;
int nCol = pCsr->pFts5->pConfig->nCol;
+ int rc;
+ rc = sqlite3Fts5StructureTest(pCsr->pFts5->pIndex, pCsr->pStruct);
+ if( rc!=SQLITE_OK ) return rc;
pCsr->rowid++;
if( pTab->eType==FTS5_VOCAB_INSTANCE ){
@@ -235064,6 +247131,9 @@ static int fts5VocabFilterMethod(
if( rc==SQLITE_OK ){
Fts5Index *pIndex = pCsr->pFts5->pIndex;
rc = sqlite3Fts5IndexQuery(pIndex, zTerm, nTerm, f, 0, &pCsr->pIter);
+ if( rc==SQLITE_OK ){
+ pCsr->pStruct = sqlite3Fts5StructureRef(pIndex);
+ }
}
if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){
rc = fts5VocabInstanceNewTerm(pCsr);
@@ -235238,6 +247308,16 @@ SQLITE_EXTENSION_INIT1
#ifndef SQLITE_OMIT_VIRTUALTABLE
+
+#define STMT_NUM_INTEGER_COLUMN 10
+typedef struct StmtRow StmtRow;
+struct StmtRow {
+ sqlite3_int64 iRowid; /* Rowid value */
+ char *zSql; /* column "sql" */
+ int aCol[STMT_NUM_INTEGER_COLUMN+1]; /* all other column values */
+ StmtRow *pNext; /* Next row to return */
+};
+
/* stmt_vtab is a subclass of sqlite3_vtab which will
** serve as the underlying representation of a stmt virtual table
*/
@@ -235255,8 +247335,7 @@ typedef struct stmt_cursor stmt_cursor;
struct stmt_cursor {
sqlite3_vtab_cursor base; /* Base class - must be first */
sqlite3 *db; /* Database connection for this cursor */
- sqlite3_stmt *pStmt; /* Statement cursor is currently pointing at */
- sqlite3_int64 iRowid; /* The rowid */
+ StmtRow *pRow; /* Current row */
};
/*
@@ -235296,11 +247375,15 @@ static int stmtConnect(
#define STMT_COLUMN_MEM 10 /* SQLITE_STMTSTATUS_MEMUSED */
+ (void)pAux;
+ (void)argc;
+ (void)argv;
+ (void)pzErr;
rc = sqlite3_declare_vtab(db,
"CREATE TABLE x(sql,ncol,ro,busy,nscan,nsort,naidx,nstep,"
"reprep,run,mem)");
if( rc==SQLITE_OK ){
- pNew = sqlite3_malloc( sizeof(*pNew) );
+ pNew = sqlite3_malloc64( sizeof(*pNew) );
*ppVtab = (sqlite3_vtab*)pNew;
if( pNew==0 ) return SQLITE_NOMEM;
memset(pNew, 0, sizeof(*pNew));
@@ -235322,7 +247405,7 @@ static int stmtDisconnect(sqlite3_vtab *pVtab){
*/
static int stmtOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
stmt_cursor *pCur;
- pCur = sqlite3_malloc( sizeof(*pCur) );
+ pCur = sqlite3_malloc64( sizeof(*pCur) );
if( pCur==0 ) return SQLITE_NOMEM;
memset(pCur, 0, sizeof(*pCur));
pCur->db = ((stmt_vtab*)p)->db;
@@ -235330,10 +247413,21 @@ static int stmtOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
return SQLITE_OK;
}
+static void stmtCsrReset(stmt_cursor *pCur){
+ StmtRow *pRow = 0;
+ StmtRow *pNext = 0;
+ for(pRow=pCur->pRow; pRow; pRow=pNext){
+ pNext = pRow->pNext;
+ sqlite3_free(pRow);
+ }
+ pCur->pRow = 0;
+}
+
/*
** Destructor for a stmt_cursor.
*/
static int stmtClose(sqlite3_vtab_cursor *cur){
+ stmtCsrReset((stmt_cursor*)cur);
sqlite3_free(cur);
return SQLITE_OK;
}
@@ -235344,8 +247438,9 @@ static int stmtClose(sqlite3_vtab_cursor *cur){
*/
static int stmtNext(sqlite3_vtab_cursor *cur){
stmt_cursor *pCur = (stmt_cursor*)cur;
- pCur->iRowid++;
- pCur->pStmt = sqlite3_next_stmt(pCur->db, pCur->pStmt);
+ StmtRow *pNext = pCur->pRow->pNext;
+ sqlite3_free(pCur->pRow);
+ pCur->pRow = pNext;
return SQLITE_OK;
}
@@ -235359,39 +247454,11 @@ static int stmtColumn(
int i /* Which column to return */
){
stmt_cursor *pCur = (stmt_cursor*)cur;
- switch( i ){
- case STMT_COLUMN_SQL: {
- sqlite3_result_text(ctx, sqlite3_sql(pCur->pStmt), -1, SQLITE_TRANSIENT);
- break;
- }
- case STMT_COLUMN_NCOL: {
- sqlite3_result_int(ctx, sqlite3_column_count(pCur->pStmt));
- break;
- }
- case STMT_COLUMN_RO: {
- sqlite3_result_int(ctx, sqlite3_stmt_readonly(pCur->pStmt));
- break;
- }
- case STMT_COLUMN_BUSY: {
- sqlite3_result_int(ctx, sqlite3_stmt_busy(pCur->pStmt));
- break;
- }
- default: {
- assert( i==STMT_COLUMN_MEM );
- i = SQLITE_STMTSTATUS_MEMUSED +
- STMT_COLUMN_NSCAN - SQLITE_STMTSTATUS_FULLSCAN_STEP;
- /* Fall thru */
- }
- case STMT_COLUMN_NSCAN:
- case STMT_COLUMN_NSORT:
- case STMT_COLUMN_NAIDX:
- case STMT_COLUMN_NSTEP:
- case STMT_COLUMN_REPREP:
- case STMT_COLUMN_RUN: {
- sqlite3_result_int(ctx, sqlite3_stmt_status(pCur->pStmt,
- i-STMT_COLUMN_NSCAN+SQLITE_STMTSTATUS_FULLSCAN_STEP, 0));
- break;
- }
+ StmtRow *pRow = pCur->pRow;
+ if( i==STMT_COLUMN_SQL ){
+ sqlite3_result_text(ctx, pRow->zSql, -1, SQLITE_TRANSIENT);
+ }else{
+ sqlite3_result_int(ctx, pRow->aCol[i]);
}
return SQLITE_OK;
}
@@ -235402,7 +247469,7 @@ static int stmtColumn(
*/
static int stmtRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
stmt_cursor *pCur = (stmt_cursor*)cur;
- *pRowid = pCur->iRowid;
+ *pRowid = pCur->pRow->iRowid;
return SQLITE_OK;
}
@@ -235412,7 +247479,7 @@ static int stmtRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
*/
static int stmtEof(sqlite3_vtab_cursor *cur){
stmt_cursor *pCur = (stmt_cursor*)cur;
- return pCur->pStmt==0;
+ return pCur->pRow==0;
}
/*
@@ -235427,9 +247494,57 @@ static int stmtFilter(
int argc, sqlite3_value **argv
){
stmt_cursor *pCur = (stmt_cursor *)pVtabCursor;
- pCur->pStmt = 0;
- pCur->iRowid = 0;
- return stmtNext(pVtabCursor);
+ sqlite3_stmt *p = 0;
+ sqlite3_int64 iRowid = 1;
+ StmtRow **ppRow = 0;
+
+ (void)idxNum;
+ (void)idxStr;
+ (void)argc;
+ (void)argv;
+ stmtCsrReset(pCur);
+ ppRow = &pCur->pRow;
+ for(p=sqlite3_next_stmt(pCur->db, 0); p; p=sqlite3_next_stmt(pCur->db, p)){
+ const char *zSql = sqlite3_sql(p);
+ sqlite3_int64 nSql = zSql ? strlen(zSql)+1 : 0;
+ StmtRow *pNew = (StmtRow*)sqlite3_malloc64(sizeof(StmtRow) + nSql);
+
+ if( pNew==0 ) return SQLITE_NOMEM;
+ memset(pNew, 0, sizeof(StmtRow));
+ if( zSql ){
+ pNew->zSql = (char*)&pNew[1];
+ memcpy(pNew->zSql, zSql, nSql);
+ }
+ pNew->aCol[STMT_COLUMN_NCOL] = sqlite3_column_count(p);
+ pNew->aCol[STMT_COLUMN_RO] = sqlite3_stmt_readonly(p);
+ pNew->aCol[STMT_COLUMN_BUSY] = sqlite3_stmt_busy(p);
+ pNew->aCol[STMT_COLUMN_NSCAN] = sqlite3_stmt_status(
+ p, SQLITE_STMTSTATUS_FULLSCAN_STEP, 0
+ );
+ pNew->aCol[STMT_COLUMN_NSORT] = sqlite3_stmt_status(
+ p, SQLITE_STMTSTATUS_SORT, 0
+ );
+ pNew->aCol[STMT_COLUMN_NAIDX] = sqlite3_stmt_status(
+ p, SQLITE_STMTSTATUS_AUTOINDEX, 0
+ );
+ pNew->aCol[STMT_COLUMN_NSTEP] = sqlite3_stmt_status(
+ p, SQLITE_STMTSTATUS_VM_STEP, 0
+ );
+ pNew->aCol[STMT_COLUMN_REPREP] = sqlite3_stmt_status(
+ p, SQLITE_STMTSTATUS_REPREPARE, 0
+ );
+ pNew->aCol[STMT_COLUMN_RUN] = sqlite3_stmt_status(
+ p, SQLITE_STMTSTATUS_RUN, 0
+ );
+ pNew->aCol[STMT_COLUMN_MEM] = sqlite3_stmt_status(
+ p, SQLITE_STMTSTATUS_MEMUSED, 0
+ );
+ pNew->iRowid = iRowid++;
+ *ppRow = pNew;
+ ppRow = &pNew->pNext;
+ }
+
+ return SQLITE_OK;
}
/*
@@ -235442,6 +247557,7 @@ static int stmtBestIndex(
sqlite3_vtab *tab,
sqlite3_index_info *pIdxInfo
){
+ (void)tab;
pIdxInfo->estimatedCost = (double)500;
pIdxInfo->estimatedRows = 500;
return SQLITE_OK;
@@ -235508,10 +247624,6 @@ SQLITE_API int sqlite3_stmt_init(
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
/************** End of stmt.c ************************************************/
-#if __LINE__!=235511
-#undef SQLITE_SOURCE_ID
-#define SQLITE_SOURCE_ID "2021-06-18 18:36:39 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafaalt2"
-#endif
/* Return the source-id for this library */
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
/************************** End of sqlite3.c ******************************/
diff --git a/db/sqlite3/src/sqlite3.h b/db/sqlite3/src/sqlite3.h
index 3274bbe071..48effe2021 100644
--- a/db/sqlite3/src/sqlite3.h
+++ b/db/sqlite3/src/sqlite3.h
@@ -43,7 +43,30 @@ extern "C" {
/*
-** Provide the ability to override linkage features of the interface.
+** Facilitate override of interface linkage and calling conventions.
+** Be aware that these macros may not be used within this particular
+** translation of the amalgamation and its associated header file.
+**
+** The SQLITE_EXTERN and SQLITE_API macros are used to instruct the
+** compiler that the target identifier should have external linkage.
+**
+** The SQLITE_CDECL macro is used to set the calling convention for
+** public functions that accept a variable number of arguments.
+**
+** The SQLITE_APICALL macro is used to set the calling convention for
+** public functions that accept a fixed number of arguments.
+**
+** The SQLITE_STDCALL macro is no longer used and is now deprecated.
+**
+** The SQLITE_CALLBACK macro is used to set the calling convention for
+** function pointers.
+**
+** The SQLITE_SYSAPI macro is used to set the calling convention for
+** functions provided by the operating system.
+**
+** Currently, the SQLITE_CDECL, SQLITE_APICALL, SQLITE_CALLBACK, and
+** SQLITE_SYSAPI macros are used only when building for environments
+** that require non-default calling conventions.
*/
#ifndef SQLITE_EXTERN
# define SQLITE_EXTERN extern
@@ -123,9 +146,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-#define SQLITE_VERSION "3.36.0"
-#define SQLITE_VERSION_NUMBER 3036000
-#define SQLITE_SOURCE_ID "2021-06-18 18:36:39 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5"
+#define SQLITE_VERSION "3.42.0"
+#define SQLITE_VERSION_NUMBER 3042000
+#define SQLITE_SOURCE_ID "2023-05-16 12:36:15 831d0fb2836b71c9bc51067c49fee4b8f18047814f2ff22d817d25195cf350b0"
/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -537,12 +560,14 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8))
#define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8))
#define SQLITE_CONSTRAINT_PINNED (SQLITE_CONSTRAINT |(11<<8))
+#define SQLITE_CONSTRAINT_DATATYPE (SQLITE_CONSTRAINT |(12<<8))
#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8))
#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8))
+#define SQLITE_NOTICE_RBU (SQLITE_NOTICE | (3<<8))
#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8))
#define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8))
#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8))
-#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8))
+#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8)) /* internal use only */
/*
** CAPI3REF: Flags For File Open Operations
@@ -550,6 +575,19 @@ SQLITE_API int sqlite3_exec(
** These bit values are intended for use in the
** 3rd parameter to the [sqlite3_open_v2()] interface and
** in the 4th parameter to the [sqlite3_vfs.xOpen] method.
+**
+** Only those flags marked as "Ok for sqlite3_open_v2()" may be
+** used as the third argument to the [sqlite3_open_v2()] interface.
+** The other flags have historically been ignored by sqlite3_open_v2(),
+** though future versions of SQLite might change so that an error is
+** raised if any of the disallowed bits are passed into sqlite3_open_v2().
+** Applications should not depend on the historical behavior.
+**
+** Note in particular that passing the SQLITE_OPEN_EXCLUSIVE flag into
+** [sqlite3_open_v2()] does *not* cause the underlying database file
+** to be opened using O_EXCL. Passing SQLITE_OPEN_EXCLUSIVE into
+** [sqlite3_open_v2()] has historically be a no-op and might become an
+** error in future versions of SQLite.
*/
#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */
@@ -572,6 +610,7 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */
#define SQLITE_OPEN_NOFOLLOW 0x01000000 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_EXRESCODE 0x02000000 /* Extended result codes */
/* Reserved: 0x00F00000 */
/* Legacy compatibility: */
@@ -632,13 +671,17 @@ SQLITE_API int sqlite3_exec(
**
** SQLite uses one of these integer values as the second
** argument to calls it makes to the xLock() and xUnlock() methods
-** of an [sqlite3_io_methods] object.
+** of an [sqlite3_io_methods] object. These values are ordered from
+** lest restrictive to most restrictive.
+**
+** The argument to xLock() is always SHARED or higher. The argument to
+** xUnlock is either SHARED or NONE.
*/
-#define SQLITE_LOCK_NONE 0
-#define SQLITE_LOCK_SHARED 1
-#define SQLITE_LOCK_RESERVED 2
-#define SQLITE_LOCK_PENDING 3
-#define SQLITE_LOCK_EXCLUSIVE 4
+#define SQLITE_LOCK_NONE 0 /* xUnlock() only */
+#define SQLITE_LOCK_SHARED 1 /* xLock() or xUnlock() */
+#define SQLITE_LOCK_RESERVED 2 /* xLock() only */
+#define SQLITE_LOCK_PENDING 3 /* xLock() only */
+#define SQLITE_LOCK_EXCLUSIVE 4 /* xLock() only */
/*
** CAPI3REF: Synchronization Type Flags
@@ -716,7 +759,14 @@ struct sqlite3_file {
** <li> [SQLITE_LOCK_PENDING], or
** <li> [SQLITE_LOCK_EXCLUSIVE].
** </ul>
-** xLock() increases the lock. xUnlock() decreases the lock.
+** xLock() upgrades the database file lock. In other words, xLock() moves the
+** database file lock in the direction NONE toward EXCLUSIVE. The argument to
+** xLock() is always on of SHARED, RESERVED, PENDING, or EXCLUSIVE, never
+** SQLITE_LOCK_NONE. If the database file lock is already at or above the
+** requested lock, then the call to xLock() is a no-op.
+** xUnlock() downgrades the database file lock to either SHARED or NONE.
+* If the lock is already at or below the requested lock state, then the call
+** to xUnlock() is a no-op.
** The xCheckReservedLock() method checks whether any database connection,
** either in this process or in some other process, is holding a RESERVED,
** PENDING, or EXCLUSIVE lock on the file. It returns true
@@ -821,9 +871,8 @@ struct sqlite3_io_methods {
** opcode causes the xFileControl method to write the current state of
** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED],
** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE])
-** into an integer that the pArg argument points to. This capability
-** is used during testing and is only available when the SQLITE_TEST
-** compile-time option is used.
+** into an integer that the pArg argument points to.
+** This capability is only available if SQLite is compiled with [SQLITE_DEBUG].
**
** <li>[[SQLITE_FCNTL_SIZE_HINT]]
** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS
@@ -1127,7 +1176,6 @@ struct sqlite3_io_methods {
** in wal mode after the client has finished copying pages from the wal
** file to the database file, but before the *-shm file is updated to
** record the fact that the pages have been checkpointed.
-** </ul>
**
** <li>[[SQLITE_FCNTL_EXTERNAL_READER]]
** The EXPERIMENTAL [SQLITE_FCNTL_EXTERNAL_READER] opcode is used to detect
@@ -1140,10 +1188,16 @@ struct sqlite3_io_methods {
** the database is not a wal-mode db, or if there is no such connection in any
** other process. This opcode cannot be used to detect transactions opened
** by clients within the current process, only within other processes.
-** </ul>
**
** <li>[[SQLITE_FCNTL_CKSM_FILE]]
-** Used by the cksmvfs VFS module only.
+** The [SQLITE_FCNTL_CKSM_FILE] opcode is for use interally by the
+** [checksum VFS shim] only.
+**
+** <li>[[SQLITE_FCNTL_RESET_CACHE]]
+** If there is currently no transaction open on the database, and the
+** database is not a temp db, then the [SQLITE_FCNTL_RESET_CACHE] file-control
+** purges the contents of the in-memory page cache. If there is an open
+** transaction, or if the db is a temp-db, this opcode is a no-op, not an error.
** </ul>
*/
#define SQLITE_FCNTL_LOCKSTATE 1
@@ -1186,6 +1240,7 @@ struct sqlite3_io_methods {
#define SQLITE_FCNTL_CKPT_START 39
#define SQLITE_FCNTL_EXTERNAL_READER 40
#define SQLITE_FCNTL_CKSM_FILE 41
+#define SQLITE_FCNTL_RESET_CACHE 42
/* deprecated names */
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
@@ -1216,6 +1271,26 @@ typedef struct sqlite3_mutex sqlite3_mutex;
typedef struct sqlite3_api_routines sqlite3_api_routines;
/*
+** CAPI3REF: File Name
+**
+** Type [sqlite3_filename] is used by SQLite to pass filenames to the
+** xOpen method of a [VFS]. It may be cast to (const char*) and treated
+** as a normal, nul-terminated, UTF-8 buffer containing the filename, but
+** may also be passed to special APIs such as:
+**
+** <ul>
+** <li> sqlite3_filename_database()
+** <li> sqlite3_filename_journal()
+** <li> sqlite3_filename_wal()
+** <li> sqlite3_uri_parameter()
+** <li> sqlite3_uri_boolean()
+** <li> sqlite3_uri_int64()
+** <li> sqlite3_uri_key()
+** </ul>
+*/
+typedef const char *sqlite3_filename;
+
+/*
** CAPI3REF: OS Interface Object
**
** An instance of the sqlite3_vfs object defines the interface between
@@ -1393,7 +1468,7 @@ struct sqlite3_vfs {
sqlite3_vfs *pNext; /* Next registered VFS */
const char *zName; /* Name of this virtual file system */
void *pAppData; /* Pointer to application-specific data */
- int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*,
+ int (*xOpen)(sqlite3_vfs*, sqlite3_filename zName, sqlite3_file*,
int flags, int *pOutFlags);
int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir);
int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut);
@@ -1580,20 +1655,23 @@ SQLITE_API int sqlite3_os_end(void);
** must ensure that no other SQLite interfaces are invoked by other
** threads while sqlite3_config() is running.</b>
**
-** The sqlite3_config() interface
-** may only be invoked prior to library initialization using
-** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()].
-** ^If sqlite3_config() is called after [sqlite3_initialize()] and before
-** [sqlite3_shutdown()] then it will return SQLITE_MISUSE.
-** Note, however, that ^sqlite3_config() can be called as part of the
-** implementation of an application-defined [sqlite3_os_init()].
-**
** The first argument to sqlite3_config() is an integer
** [configuration option] that determines
** what property of SQLite is to be configured. Subsequent arguments
** vary depending on the [configuration option]
** in the first argument.
**
+** For most configuration options, the sqlite3_config() interface
+** may only be invoked prior to library initialization using
+** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()].
+** The exceptional configuration options that may be invoked at any time
+** are called "anytime configuration options".
+** ^If sqlite3_config() is called after [sqlite3_initialize()] and before
+** [sqlite3_shutdown()] with a first argument that is not an anytime
+** configuration option, then the sqlite3_config() call will return SQLITE_MISUSE.
+** Note, however, that ^sqlite3_config() can be called as part of the
+** implementation of an application-defined [sqlite3_os_init()].
+**
** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK].
** ^If the option is unknown or SQLite is unable to set the option
** then this routine returns a non-zero [error code].
@@ -1701,6 +1779,23 @@ struct sqlite3_mem_methods {
** These constants are the available integer configuration options that
** can be passed as the first argument to the [sqlite3_config()] interface.
**
+** Most of the configuration options for sqlite3_config()
+** will only work if invoked prior to [sqlite3_initialize()] or after
+** [sqlite3_shutdown()]. The few exceptions to this rule are called
+** "anytime configuration options".
+** ^Calling [sqlite3_config()] with a first argument that is not an
+** anytime configuration option in between calls to [sqlite3_initialize()] and
+** [sqlite3_shutdown()] is a no-op that returns SQLITE_MISUSE.
+**
+** The set of anytime configuration options can change (by insertions
+** and/or deletions) from one release of SQLite to the next.
+** As of SQLite version 3.42.0, the complete set of anytime configuration
+** options is:
+** <ul>
+** <li> SQLITE_CONFIG_LOG
+** <li> SQLITE_CONFIG_PCACHE_HDRSZ
+** </ul>
+**
** New configuration options may be added in future releases of SQLite.
** Existing configuration options might be discontinued. Applications
** should check the return code from [sqlite3_config()] to make sure that
@@ -2047,28 +2142,28 @@ struct sqlite3_mem_methods {
** compile-time option is not set, then the default maximum is 1073741824.
** </dl>
*/
-#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
-#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */
-#define SQLITE_CONFIG_SERIALIZED 3 /* nil */
-#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */
-#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */
-#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */
-#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */
-#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */
-#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */
-#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */
-#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */
-/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */
-#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */
-#define SQLITE_CONFIG_PCACHE 14 /* no-op */
-#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */
-#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */
-#define SQLITE_CONFIG_URI 17 /* int */
-#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */
-#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */
+#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
+#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */
+#define SQLITE_CONFIG_SERIALIZED 3 /* nil */
+#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */
+#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */
+#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */
+#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */
+#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */
+#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */
+#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */
+#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */
+/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */
+#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */
+#define SQLITE_CONFIG_PCACHE 14 /* no-op */
+#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */
+#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */
+#define SQLITE_CONFIG_URI 17 /* int */
+#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */
+#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */
#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */
-#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */
-#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */
+#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */
+#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */
#define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */
#define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
@@ -2109,7 +2204,7 @@ struct sqlite3_mem_methods {
** configuration for a database connection can only be changed when that
** connection is not currently using lookaside memory, or in other words
** when the "current value" returned by
-** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero.
+** [sqlite3_db_status](D,[SQLITE_DBSTATUS_LOOKASIDE_USED],...) is zero.
** Any attempt to change the lookaside memory configuration when lookaside
** memory is in use leaves the configuration unchanged and returns
** [SQLITE_BUSY].)^</dd>
@@ -2259,8 +2354,12 @@ struct sqlite3_mem_methods {
** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
** </ol>
** Because resetting a database is destructive and irreversible, the
-** process requires the use of this obscure API and multiple steps to help
-** ensure that it does not happen by accident.
+** process requires the use of this obscure API and multiple steps to
+** help ensure that it does not happen by accident. Because this
+** feature must be capable of resetting corrupt databases, and
+** shutting down virtual tables may require access to that corrupt
+** storage, the library must abandon any installed virtual tables
+** without calling their xDestroy() methods.
**
** [[SQLITE_DBCONFIG_DEFENSIVE]] <dt>SQLITE_DBCONFIG_DEFENSIVE</dt>
** <dd>The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the
@@ -2271,6 +2370,7 @@ struct sqlite3_mem_methods {
** <ul>
** <li> The [PRAGMA writable_schema=ON] statement.
** <li> The [PRAGMA journal_mode=OFF] statement.
+** <li> The [PRAGMA schema_version=N] statement.
** <li> Writes to the [sqlite_dbpage] virtual table.
** <li> Direct writes to [shadow tables].
** </ul>
@@ -2298,7 +2398,7 @@ struct sqlite3_mem_methods {
** </dd>
**
** [[SQLITE_DBCONFIG_DQS_DML]]
-** <dt>SQLITE_DBCONFIG_DQS_DML</td>
+** <dt>SQLITE_DBCONFIG_DQS_DML</dt>
** <dd>The SQLITE_DBCONFIG_DQS_DML option activates or deactivates
** the legacy [double-quoted string literal] misfeature for DML statements
** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The
@@ -2307,7 +2407,7 @@ struct sqlite3_mem_methods {
** </dd>
**
** [[SQLITE_DBCONFIG_DQS_DDL]]
-** <dt>SQLITE_DBCONFIG_DQS_DDL</td>
+** <dt>SQLITE_DBCONFIG_DQS_DDL</dt>
** <dd>The SQLITE_DBCONFIG_DQS option activates or deactivates
** the legacy [double-quoted string literal] misfeature for DDL statements,
** such as CREATE TABLE and CREATE INDEX. The
@@ -2316,7 +2416,7 @@ struct sqlite3_mem_methods {
** </dd>
**
** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]]
-** <dt>SQLITE_DBCONFIG_TRUSTED_SCHEMA</td>
+** <dt>SQLITE_DBCONFIG_TRUSTED_SCHEMA</dt>
** <dd>The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to
** assume that database schemas are untainted by malicious content.
** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite
@@ -2336,7 +2436,7 @@ struct sqlite3_mem_methods {
** </dd>
**
** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]]
-** <dt>SQLITE_DBCONFIG_LEGACY_FILE_FORMAT</td>
+** <dt>SQLITE_DBCONFIG_LEGACY_FILE_FORMAT</dt>
** <dd>The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates
** the legacy file format flag. When activated, this flag causes all newly
** created database file to have a schema format version number (the 4-byte
@@ -2345,7 +2445,7 @@ struct sqlite3_mem_methods {
** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting,
** newly created databases are generally not understandable by SQLite versions
** prior to 3.3.0 ([dateof:3.3.0]). As these words are written, there
-** is now scarcely any need to generated database files that are compatible
+** is now scarcely any need to generate database files that are compatible
** all the way back to version 3.0.0, and so this setting is of little
** practical use, but is provided so that SQLite can continue to claim the
** ability to generate new database files that are compatible with version
@@ -2356,6 +2456,38 @@ struct sqlite3_mem_methods {
** not considered a bug since SQLite versions 3.3.0 and earlier do not support
** either generated columns or decending indexes.
** </dd>
+**
+** [[SQLITE_DBCONFIG_STMT_SCANSTATUS]]
+** <dt>SQLITE_DBCONFIG_STMT_SCANSTATUS</dt>
+** <dd>The SQLITE_DBCONFIG_STMT_SCANSTATUS option is only useful in
+** SQLITE_ENABLE_STMT_SCANSTATUS builds. In this case, it sets or clears
+** a flag that enables collection of the sqlite3_stmt_scanstatus_v2()
+** statistics. For statistics to be collected, the flag must be set on
+** the database handle both when the SQL statement is prepared and when it
+** is stepped. The flag is set (collection of statistics is enabled)
+** by default. This option takes two arguments: an integer and a pointer to
+** an integer.. The first argument is 1, 0, or -1 to enable, disable, or
+** leave unchanged the statement scanstatus option. If the second argument
+** is not NULL, then the value of the statement scanstatus setting after
+** processing the first argument is written into the integer that the second
+** argument points to.
+** </dd>
+**
+** [[SQLITE_DBCONFIG_REVERSE_SCANORDER]]
+** <dt>SQLITE_DBCONFIG_REVERSE_SCANORDER</dt>
+** <dd>The SQLITE_DBCONFIG_REVERSE_SCANORDER option changes the default order
+** in which tables and indexes are scanned so that the scans start at the end
+** and work toward the beginning rather than starting at the beginning and
+** working toward the end. Setting SQLITE_DBCONFIG_REVERSE_SCANORDER is the
+** same as setting [PRAGMA reverse_unordered_selects]. This option takes
+** two arguments which are an integer and a pointer to an integer. The first
+** argument is 1, 0, or -1 to enable, disable, or leave unchanged the
+** reverse scan order flag, respectively. If the second argument is not NULL,
+** then 0 or 1 is written into the integer that the second argument points to
+** depending on if the reverse scan order flag is set after processing the
+** first argument.
+** </dd>
+**
** </dl>
*/
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
@@ -2376,7 +2508,9 @@ struct sqlite3_mem_methods {
#define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */
#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016 /* int int* */
#define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */
-#define SQLITE_DBCONFIG_MAX 1017 /* Largest DBCONFIG */
+#define SQLITE_DBCONFIG_STMT_SCANSTATUS 1018 /* int int* */
+#define SQLITE_DBCONFIG_REVERSE_SCANORDER 1019 /* int int* */
+#define SQLITE_DBCONFIG_MAX 1019 /* Largest DBCONFIG */
/*
** CAPI3REF: Enable Or Disable Extended Result Codes
@@ -2464,11 +2598,14 @@ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64);
** CAPI3REF: Count The Number Of Rows Modified
** METHOD: sqlite3
**
-** ^This function returns the number of rows modified, inserted or
+** ^These functions return the number of rows modified, inserted or
** deleted by the most recently completed INSERT, UPDATE or DELETE
** statement on the database connection specified by the only parameter.
-** ^Executing any other type of SQL statement does not modify the value
-** returned by this function.
+** The two functions are identical except for the type of the return value
+** and that if the number of rows modified by the most recent INSERT, UPDATE
+** or DELETE is greater than the maximum value supported by type "int", then
+** the return value of sqlite3_changes() is undefined. ^Executing any other
+** type of SQL statement does not modify the value returned by these functions.
**
** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are
** considered - auxiliary changes caused by [CREATE TRIGGER | triggers],
@@ -2517,16 +2654,21 @@ SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64);
** </ul>
*/
SQLITE_API int sqlite3_changes(sqlite3*);
+SQLITE_API sqlite3_int64 sqlite3_changes64(sqlite3*);
/*
** CAPI3REF: Total Number Of Rows Modified
** METHOD: sqlite3
**
-** ^This function returns the total number of rows inserted, modified or
+** ^These functions return the total number of rows inserted, modified or
** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed
** since the database connection was opened, including those executed as
-** part of trigger programs. ^Executing any other type of SQL statement
-** does not affect the value returned by sqlite3_total_changes().
+** part of trigger programs. The two functions are identical except for the
+** type of the return value and that if the number of rows modified by the
+** connection exceeds the maximum value supported by type "int", then
+** the return value of sqlite3_total_changes() is undefined. ^Executing
+** any other type of SQL statement does not affect the value returned by
+** sqlite3_total_changes().
**
** ^Changes made as part of [foreign key actions] are included in the
** count, but those made as part of REPLACE constraint resolution are
@@ -2554,6 +2696,7 @@ SQLITE_API int sqlite3_changes(sqlite3*);
** </ul>
*/
SQLITE_API int sqlite3_total_changes(sqlite3*);
+SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3*);
/*
** CAPI3REF: Interrupt A Long-Running Query
@@ -2589,8 +2732,12 @@ SQLITE_API int sqlite3_total_changes(sqlite3*);
** ^A call to sqlite3_interrupt(D) that occurs when there are no running
** SQL statements is a no-op and has no effect on SQL statements
** that are started after the sqlite3_interrupt() call returns.
+**
+** ^The [sqlite3_is_interrupted(D)] interface can be used to determine whether
+** or not an interrupt is currently in effect for [database connection] D.
*/
SQLITE_API void sqlite3_interrupt(sqlite3*);
+SQLITE_API int sqlite3_is_interrupted(sqlite3*);
/*
** CAPI3REF: Determine If An SQL Statement Is Complete
@@ -3208,8 +3355,8 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*,
** <dd>^An SQLITE_TRACE_PROFILE callback provides approximately the same
** information as is provided by the [sqlite3_profile()] callback.
** ^The P argument is a pointer to the [prepared statement] and the
-** X argument points to a 64-bit integer which is the estimated of
-** the number of nanosecond that the prepared statement took to run.
+** X argument points to a 64-bit integer which is approximately
+** the number of nanoseconds that the prepared statement took to run.
** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes.
**
** [[SQLITE_TRACE_ROW]] <dt>SQLITE_TRACE_ROW</dt>
@@ -3272,7 +3419,7 @@ SQLITE_API int sqlite3_trace_v2(
**
** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback
** function X to be invoked periodically during long running calls to
-** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for
+** [sqlite3_step()] and [sqlite3_prepare()] and similar for
** database connection D. An example use for this
** interface is to keep a GUI updated during a large query.
**
@@ -3297,6 +3444,13 @@ SQLITE_API int sqlite3_trace_v2(
** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
** database connections for the meaning of "modify" in this paragraph.
**
+** The progress handler callback would originally only be invoked from the
+** bytecode engine. It still might be invoked during [sqlite3_prepare()]
+** and similar because those routines might force a reparse of the schema
+** which involves running the bytecode engine. However, beginning with
+** SQLite version 3.41.0, the progress handler callback might also be
+** invoked directly from [sqlite3_prepare()] while analyzing and generating
+** code for complex queries.
*/
SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
@@ -3333,13 +3487,18 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
**
** <dl>
** ^(<dt>[SQLITE_OPEN_READONLY]</dt>
-** <dd>The database is opened in read-only mode. If the database does not
-** already exist, an error is returned.</dd>)^
+** <dd>The database is opened in read-only mode. If the database does
+** not already exist, an error is returned.</dd>)^
**
** ^(<dt>[SQLITE_OPEN_READWRITE]</dt>
-** <dd>The database is opened for reading and writing if possible, or reading
-** only if the file is write protected by the operating system. In either
-** case the database must already exist, otherwise an error is returned.</dd>)^
+** <dd>The database is opened for reading and writing if possible, or
+** reading only if the file is write protected by the operating
+** system. In either case the database must already exist, otherwise
+** an error is returned. For historical reasons, if opening in
+** read-write mode fails due to OS-level permissions, an attempt is
+** made to open it in read-only mode. [sqlite3_db_readonly()] can be
+** used to determine whether the database is actually
+** read-write.</dd>)^
**
** ^(<dt>[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]</dt>
** <dd>The database is opened for reading and writing, and is created if
@@ -3377,20 +3536,39 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
** <dd>The database is opened [shared cache] enabled, overriding
** the default shared cache setting provided by
** [sqlite3_enable_shared_cache()].)^
+** The [use of shared cache mode is discouraged] and hence shared cache
+** capabilities may be omitted from many builds of SQLite. In such cases,
+** this option is a no-op.
**
** ^(<dt>[SQLITE_OPEN_PRIVATECACHE]</dt>
** <dd>The database is opened [shared cache] disabled, overriding
** the default shared cache setting provided by
** [sqlite3_enable_shared_cache()].)^
**
+** [[OPEN_EXRESCODE]] ^(<dt>[SQLITE_OPEN_EXRESCODE]</dt>
+** <dd>The database connection comes up in "extended result code mode".
+** In other words, the database behaves has if
+** [sqlite3_extended_result_codes(db,1)] where called on the database
+** connection as soon as the connection is created. In addition to setting
+** the extended result code mode, this flag also causes [sqlite3_open_v2()]
+** to return an extended result code.</dd>
+**
** [[OPEN_NOFOLLOW]] ^(<dt>[SQLITE_OPEN_NOFOLLOW]</dt>
-** <dd>The database filename is not allowed to be a symbolic link</dd>
+** <dd>The database filename is not allowed to contain a symbolic link</dd>
** </dl>)^
**
** If the 3rd parameter to sqlite3_open_v2() is not one of the
** required combinations shown above optionally combined with other
** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits]
-** then the behavior is undefined.
+** then the behavior is undefined. Historic versions of SQLite
+** have silently ignored surplus bits in the flags parameter to
+** sqlite3_open_v2(), however that behavior might not be carried through
+** into future versions of SQLite and so applications should not rely
+** upon it. Note in particular that the SQLITE_OPEN_EXCLUSIVE flag is a no-op
+** for sqlite3_open_v2(). The SQLITE_OPEN_EXCLUSIVE does *not* cause
+** the open to fail if the database already exists. The SQLITE_OPEN_EXCLUSIVE
+** flag is intended for use by the [sqlite3_vfs|VFS interface] only, and not
+** by sqlite3_open_v2().
**
** ^The fourth parameter to sqlite3_open_v2() is the name of the
** [sqlite3_vfs] object that defines the operating system interface that
@@ -3635,10 +3813,10 @@ SQLITE_API int sqlite3_open_v2(
**
** See the [URI filename] documentation for additional information.
*/
-SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam);
-SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault);
-SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64);
-SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N);
+SQLITE_API const char *sqlite3_uri_parameter(sqlite3_filename z, const char *zParam);
+SQLITE_API int sqlite3_uri_boolean(sqlite3_filename z, const char *zParam, int bDefault);
+SQLITE_API sqlite3_int64 sqlite3_uri_int64(sqlite3_filename, const char*, sqlite3_int64);
+SQLITE_API const char *sqlite3_uri_key(sqlite3_filename z, int N);
/*
** CAPI3REF: Translate filenames
@@ -3667,9 +3845,9 @@ SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N);
** return value from [sqlite3_db_filename()], then the result is
** undefined and is likely a memory access violation.
*/
-SQLITE_API const char *sqlite3_filename_database(const char*);
-SQLITE_API const char *sqlite3_filename_journal(const char*);
-SQLITE_API const char *sqlite3_filename_wal(const char*);
+SQLITE_API const char *sqlite3_filename_database(sqlite3_filename);
+SQLITE_API const char *sqlite3_filename_journal(sqlite3_filename);
+SQLITE_API const char *sqlite3_filename_wal(sqlite3_filename);
/*
** CAPI3REF: Database File Corresponding To A Journal
@@ -3735,14 +3913,14 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*);
** then the corresponding [sqlite3_module.xClose() method should also be
** invoked prior to calling sqlite3_free_filename(Y).
*/
-SQLITE_API char *sqlite3_create_filename(
+SQLITE_API sqlite3_filename sqlite3_create_filename(
const char *zDatabase,
const char *zJournal,
const char *zWal,
int nParam,
const char **azParam
);
-SQLITE_API void sqlite3_free_filename(char*);
+SQLITE_API void sqlite3_free_filename(sqlite3_filename);
/*
** CAPI3REF: Error Codes And Messages
@@ -3761,13 +3939,14 @@ SQLITE_API void sqlite3_free_filename(char*);
** sqlite3_extended_errcode() might change with each API call.
** Except, there are some interfaces that are guaranteed to never
** change the value of the error code. The error-code preserving
-** interfaces are:
+** interfaces include the following:
**
** <ul>
** <li> sqlite3_errcode()
** <li> sqlite3_extended_errcode()
** <li> sqlite3_errmsg()
** <li> sqlite3_errmsg16()
+** <li> sqlite3_error_offset()
** </ul>
**
** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
@@ -3782,6 +3961,13 @@ SQLITE_API void sqlite3_free_filename(char*);
** ^(Memory to hold the error message string is managed internally
** and must not be freed by the application)^.
**
+** ^If the most recent error references a specific token in the input
+** SQL, the sqlite3_error_offset() interface returns the byte offset
+** of the start of that token. ^The byte offset returned by
+** sqlite3_error_offset() assumes that the input SQL is UTF8.
+** ^If the most recent error does not reference a specific token in the input
+** SQL, then the sqlite3_error_offset() function returns -1.
+**
** When the serialized [threading mode] is in use, it might be the
** case that a second error occurs on a separate thread in between
** the time of the first error and the call to these interfaces.
@@ -3801,6 +3987,7 @@ SQLITE_API int sqlite3_extended_errcode(sqlite3 *db);
SQLITE_API const char *sqlite3_errmsg(sqlite3*);
SQLITE_API const void *sqlite3_errmsg16(sqlite3*);
SQLITE_API const char *sqlite3_errstr(int);
+SQLITE_API int sqlite3_error_offset(sqlite3 *db);
/*
** CAPI3REF: Prepared Statement Object
@@ -4158,12 +4345,17 @@ SQLITE_API int sqlite3_prepare16_v3(
** are managed by SQLite and are automatically freed when the prepared
** statement is finalized.
** ^The string returned by sqlite3_expanded_sql(P), on the other hand,
-** is obtained from [sqlite3_malloc()] and must be free by the application
+** is obtained from [sqlite3_malloc()] and must be freed by the application
** by passing it to [sqlite3_free()].
+**
+** ^The sqlite3_normalized_sql() interface is only available if
+** the [SQLITE_ENABLE_NORMALIZE] compile-time option is defined.
*/
SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt);
SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt);
+#ifdef SQLITE_ENABLE_NORMALIZE
SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt);
+#endif
/*
** CAPI3REF: Determine If An SQL Statement Writes The Database
@@ -4207,6 +4399,10 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt);
** be false. ^Similarly, a CREATE TABLE IF NOT EXISTS statement is a
** read-only no-op if the table already exists, but
** sqlite3_stmt_readonly() still returns false for such a statement.
+**
+** ^If prepared statement X is an [EXPLAIN] or [EXPLAIN QUERY PLAN]
+** statement, then sqlite3_stmt_readonly(X) returns the same value as
+** if the EXPLAIN or EXPLAIN QUERY PLAN prefix were omitted.
*/
SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);
@@ -4275,6 +4471,8 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*);
**
** ^The sqlite3_value objects that are passed as parameters into the
** implementation of [application-defined SQL functions] are protected.
+** ^The sqlite3_value objects returned by [sqlite3_vtab_rhs_value()]
+** are protected.
** ^The sqlite3_value object returned by
** [sqlite3_column_value()] is unprotected.
** Unprotected sqlite3_value objects may only be used as arguments
@@ -4896,6 +5094,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** even empty strings, are always zero-terminated. ^The return
** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
**
+** ^Strings returned by sqlite3_column_text16() always have the endianness
+** which is native to the platform, regardless of the text encoding set
+** for the database.
+**
** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
** [unprotected sqlite3_value] object. In a multithreaded environment,
** an unprotected sqlite3_value object may only be used safely with
@@ -4909,7 +5111,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** [application-defined SQL functions] or [virtual tables], not within
** top-level application code.
**
-** The these routines may attempt to convert the datatype of the result.
+** These routines may attempt to convert the datatype of the result.
** ^For example, if the internal representation is FLOAT and a text result
** is requested, [sqlite3_snprintf()] is used internally to perform the
** conversion automatically. ^(The following table details the conversions
@@ -4934,7 +5136,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** <tr><td> TEXT <td> BLOB <td> No change
** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER
** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL
-** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed
+** <tr><td> BLOB <td> TEXT <td> [CAST] to TEXT, ensure zero terminator
** </table>
** </blockquote>)^
**
@@ -5277,10 +5479,21 @@ SQLITE_API int sqlite3_create_window_function(
** from top-level SQL, and cannot be used in VIEWs or TRIGGERs nor in
** schema structures such as [CHECK constraints], [DEFAULT clauses],
** [expression indexes], [partial indexes], or [generated columns].
-** The SQLITE_DIRECTONLY flags is a security feature which is recommended
-** for all [application-defined SQL functions], and especially for functions
-** that have side-effects or that could potentially leak sensitive
-** information.
+** <p>
+** The SQLITE_DIRECTONLY flag is recommended for any
+** [application-defined SQL function]
+** that has side-effects or that could potentially leak sensitive information.
+** This will prevent attacks in which an application is tricked
+** into using a database file that has had its schema surreptiously
+** modified to invoke the application-defined function in ways that are
+** harmful.
+** <p>
+** Some people say it is good practice to set SQLITE_DIRECTONLY on all
+** [application-defined SQL functions], regardless of whether or not they
+** are security sensitive, as doing so prevents those functions from being used
+** inside of the database schema, and thus ensures that the database
+** can be inspected and modified using generic tools (such as the [CLI])
+** that do not have access to the application-defined functions.
** </dd>
**
** [[SQLITE_INNOCUOUS]] <dt>SQLITE_INNOCUOUS</dt><dd>
@@ -5487,6 +5700,28 @@ SQLITE_API int sqlite3_value_nochange(sqlite3_value*);
SQLITE_API int sqlite3_value_frombind(sqlite3_value*);
/*
+** CAPI3REF: Report the internal text encoding state of an sqlite3_value object
+** METHOD: sqlite3_value
+**
+** ^(The sqlite3_value_encoding(X) interface returns one of [SQLITE_UTF8],
+** [SQLITE_UTF16BE], or [SQLITE_UTF16LE] according to the current text encoding
+** of the value X, assuming that X has type TEXT.)^ If sqlite3_value_type(X)
+** returns something other than SQLITE_TEXT, then the return value from
+** sqlite3_value_encoding(X) is meaningless. ^Calls to
+** [sqlite3_value_text(X)], [sqlite3_value_text16(X)], [sqlite3_value_text16be(X)],
+** [sqlite3_value_text16le(X)], [sqlite3_value_bytes(X)], or
+** [sqlite3_value_bytes16(X)] might change the encoding of the value X and
+** thus change the return from subsequent calls to sqlite3_value_encoding(X).
+**
+** This routine is intended for used by applications that test and validate
+** the SQLite implementation. This routine is inquiring about the opaque
+** internal state of an [sqlite3_value] object. Ordinary applications should
+** not need to know what the internal state of an sqlite3_value object is and
+** hence should not need to use this interface.
+*/
+SQLITE_API int sqlite3_value_encoding(sqlite3_value*);
+
+/*
** CAPI3REF: Finding The Subtype Of SQL Values
** METHOD: sqlite3_value
**
@@ -5506,7 +5741,8 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*);
** object D and returns a pointer to that copy. ^The [sqlite3_value] returned
** is a [protected sqlite3_value] object even if the input is not.
** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a
-** memory allocation fails.
+** memory allocation fails. ^If V is a [pointer value], then the result
+** of sqlite3_value_dup(V) is a NULL value.
**
** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object
** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer
@@ -5537,7 +5773,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*);
**
** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer
** when first called if N is less than or equal to zero or if a memory
-** allocate error occurs.
+** allocation error occurs.
**
** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
** determined by the N parameter on first successful call. Changing the
@@ -5742,9 +5978,10 @@ typedef void (*sqlite3_destructor_type)(void*);
** of [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE].
** ^SQLite takes the text result from the application from
** the 2nd parameter of the sqlite3_result_text* interfaces.
-** ^If the 3rd parameter to the sqlite3_result_text* interfaces
-** is negative, then SQLite takes result text from the 2nd parameter
-** through the first zero character.
+** ^If the 3rd parameter to any of the sqlite3_result_text* interfaces
+** other than sqlite3_result_text64() is negative, then SQLite computes
+** the string length itself by searching the 2nd parameter for the first
+** zero character.
** ^If the 3rd parameter to the sqlite3_result_text* interfaces
** is non-negative, then as many bytes (not characters) of the text
** pointed to by the 2nd parameter are taken as the application-defined
@@ -6018,6 +6255,13 @@ SQLITE_API void sqlite3_activate_cerod(
** of the default VFS is not implemented correctly, or not implemented at
** all, then the behavior of sqlite3_sleep() may deviate from the description
** in the previous paragraphs.
+**
+** If a negative argument is passed to sqlite3_sleep() the results vary by
+** VFS and operating system. Some system treat a negative argument as an
+** instruction to sleep forever. Others understand it to mean do not sleep
+** at all. ^In SQLite version 3.42.0 and later, a negative
+** argument passed into sqlite3_sleep() is changed to zero before it is relayed
+** down into the xSleep method of the VFS.
*/
SQLITE_API int sqlite3_sleep(int);
@@ -6189,6 +6433,28 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*);
SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
/*
+** CAPI3REF: Return The Schema Name For A Database Connection
+** METHOD: sqlite3
+**
+** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name
+** for the N-th database on database connection D, or a NULL pointer of N is
+** out of range. An N value of 0 means the main database file. An N of 1 is
+** the "temp" schema. Larger values of N correspond to various ATTACH-ed
+** databases.
+**
+** Space to hold the string that is returned by sqlite3_db_name() is managed
+** by SQLite itself. The string might be deallocated by any operation that
+** changes the schema, including [ATTACH] or [DETACH] or calls to
+** [sqlite3_serialize()] or [sqlite3_deserialize()], even operations that
+** occur on a different thread. Applications that need to
+** remember the string long-term should make their own copy. Applications that
+** are accessing the same database connection simultaneously on multiple
+** threads should mutex-protect calls to this API and should make their own
+** private copy of the result prior to releasing the mutex.
+*/
+SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N);
+
+/*
** CAPI3REF: Return The Filename For A Database Connection
** METHOD: sqlite3
**
@@ -6218,7 +6484,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
** <li> [sqlite3_filename_wal()]
** </ul>
*/
-SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName);
+SQLITE_API sqlite3_filename sqlite3_db_filename(sqlite3 *db, const char *zDbName);
/*
** CAPI3REF: Determine if a database is read-only
@@ -6348,6 +6614,72 @@ SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
/*
+** CAPI3REF: Autovacuum Compaction Amount Callback
+** METHOD: sqlite3
+**
+** ^The sqlite3_autovacuum_pages(D,C,P,X) interface registers a callback
+** function C that is invoked prior to each autovacuum of the database
+** file. ^The callback is passed a copy of the generic data pointer (P),
+** the schema-name of the attached database that is being autovacuumed,
+** the size of the database file in pages, the number of free pages,
+** and the number of bytes per page, respectively. The callback should
+** return the number of free pages that should be removed by the
+** autovacuum. ^If the callback returns zero, then no autovacuum happens.
+** ^If the value returned is greater than or equal to the number of
+** free pages, then a complete autovacuum happens.
+**
+** <p>^If there are multiple ATTACH-ed database files that are being
+** modified as part of a transaction commit, then the autovacuum pages
+** callback is invoked separately for each file.
+**
+** <p><b>The callback is not reentrant.</b> The callback function should
+** not attempt to invoke any other SQLite interface. If it does, bad
+** things may happen, including segmentation faults and corrupt database
+** files. The callback function should be a simple function that
+** does some arithmetic on its input parameters and returns a result.
+**
+** ^The X parameter to sqlite3_autovacuum_pages(D,C,P,X) is an optional
+** destructor for the P parameter. ^If X is not NULL, then X(P) is
+** invoked whenever the database connection closes or when the callback
+** is overwritten by another invocation of sqlite3_autovacuum_pages().
+**
+** <p>^There is only one autovacuum pages callback per database connection.
+** ^Each call to the sqlite3_autovacuum_pages() interface overrides all
+** previous invocations for that database connection. ^If the callback
+** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer,
+** then the autovacuum steps callback is cancelled. The return value
+** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might
+** be some other error code if something goes wrong. The current
+** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other
+** return codes might be added in future releases.
+**
+** <p>If no autovacuum pages callback is specified (the usual case) or
+** a NULL pointer is provided for the callback,
+** then the default behavior is to vacuum all free pages. So, in other
+** words, the default behavior is the same as if the callback function
+** were something like this:
+**
+** <blockquote><pre>
+** &nbsp; unsigned int demonstration_autovac_pages_callback(
+** &nbsp; void *pClientData,
+** &nbsp; const char *zSchema,
+** &nbsp; unsigned int nDbPage,
+** &nbsp; unsigned int nFreePage,
+** &nbsp; unsigned int nBytePerPage
+** &nbsp; ){
+** &nbsp; return nFreePage;
+** &nbsp; }
+** </pre></blockquote>
+*/
+SQLITE_API int sqlite3_autovacuum_pages(
+ sqlite3 *db,
+ unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int),
+ void*,
+ void(*)(void*)
+);
+
+
+/*
** CAPI3REF: Data Change Notification Callbacks
** METHOD: sqlite3
**
@@ -6410,6 +6742,11 @@ SQLITE_API void *sqlite3_update_hook(
** to the same database. Sharing is enabled if the argument is true
** and disabled if the argument is false.)^
**
+** This interface is omitted if SQLite is compiled with
+** [-DSQLITE_OMIT_SHARED_CACHE]. The [-DSQLITE_OMIT_SHARED_CACHE]
+** compile-time option is recommended because the
+** [use of shared cache mode is discouraged].
+**
** ^Cache sharing is enabled and disabled for an entire process.
** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]).
** In prior versions of SQLite,
@@ -6508,7 +6845,7 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*);
** ^The soft heap limit may not be greater than the hard heap limit.
** ^If the hard heap limit is enabled and if sqlite3_soft_heap_limit(N)
** is invoked with a value of N that is greater than the hard heap limit,
-** the the soft heap limit is set to the value of the hard heap limit.
+** the soft heap limit is set to the value of the hard heap limit.
** ^The soft heap limit is automatically enabled whenever the hard heap
** limit is enabled. ^When sqlite3_hard_heap_limit64(N) is invoked and
** the soft heap limit is outside the range of 1..N, then the soft heap
@@ -6770,15 +7107,6 @@ SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void));
SQLITE_API void sqlite3_reset_auto_extension(void);
/*
-** The interface to the virtual-table mechanism is currently considered
-** to be experimental. The interface might change in incompatible ways.
-** If this is a problem for you, do not use the interface at this time.
-**
-** When the virtual-table mechanism stabilizes, we will declare the
-** interface fixed, support it indefinitely, and remove this comment.
-*/
-
-/*
** Structures used by the virtual table interface
*/
typedef struct sqlite3_vtab sqlite3_vtab;
@@ -6896,10 +7224,10 @@ struct sqlite3_module {
** when the omit flag is true there is no guarantee that the constraint will
** not be checked again using byte code.)^
**
-** ^The idxNum and idxPtr values are recorded and passed into the
+** ^The idxNum and idxStr values are recorded and passed into the
** [xFilter] method.
-** ^[sqlite3_free()] is used to free idxPtr if and only if
-** needToFreeIdxPtr is true.
+** ^[sqlite3_free()] is used to free idxStr if and only if
+** needToFreeIdxStr is true.
**
** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in
** the correct order to satisfy the ORDER BY clause so that no separate
@@ -6988,24 +7316,56 @@ struct sqlite3_index_info {
**
** These macros define the allowed values for the
** [sqlite3_index_info].aConstraint[].op field. Each value represents
-** an operator that is part of a constraint term in the wHERE clause of
+** an operator that is part of a constraint term in the WHERE clause of
** a query that uses a [virtual table].
-*/
-#define SQLITE_INDEX_CONSTRAINT_EQ 2
-#define SQLITE_INDEX_CONSTRAINT_GT 4
-#define SQLITE_INDEX_CONSTRAINT_LE 8
-#define SQLITE_INDEX_CONSTRAINT_LT 16
-#define SQLITE_INDEX_CONSTRAINT_GE 32
-#define SQLITE_INDEX_CONSTRAINT_MATCH 64
-#define SQLITE_INDEX_CONSTRAINT_LIKE 65
-#define SQLITE_INDEX_CONSTRAINT_GLOB 66
-#define SQLITE_INDEX_CONSTRAINT_REGEXP 67
-#define SQLITE_INDEX_CONSTRAINT_NE 68
-#define SQLITE_INDEX_CONSTRAINT_ISNOT 69
-#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70
-#define SQLITE_INDEX_CONSTRAINT_ISNULL 71
-#define SQLITE_INDEX_CONSTRAINT_IS 72
-#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150
+**
+** ^The left-hand operand of the operator is given by the corresponding
+** aConstraint[].iColumn field. ^An iColumn of -1 indicates the left-hand
+** operand is the rowid.
+** The SQLITE_INDEX_CONSTRAINT_LIMIT and SQLITE_INDEX_CONSTRAINT_OFFSET
+** operators have no left-hand operand, and so for those operators the
+** corresponding aConstraint[].iColumn is meaningless and should not be
+** used.
+**
+** All operator values from SQLITE_INDEX_CONSTRAINT_FUNCTION through
+** value 255 are reserved to represent functions that are overloaded
+** by the [xFindFunction|xFindFunction method] of the virtual table
+** implementation.
+**
+** The right-hand operands for each constraint might be accessible using
+** the [sqlite3_vtab_rhs_value()] interface. Usually the right-hand
+** operand is only available if it appears as a single constant literal
+** in the input SQL. If the right-hand operand is another column or an
+** expression (even a constant expression) or a parameter, then the
+** sqlite3_vtab_rhs_value() probably will not be able to extract it.
+** ^The SQLITE_INDEX_CONSTRAINT_ISNULL and
+** SQLITE_INDEX_CONSTRAINT_ISNOTNULL operators have no right-hand operand
+** and hence calls to sqlite3_vtab_rhs_value() for those operators will
+** always return SQLITE_NOTFOUND.
+**
+** The collating sequence to be used for comparison can be found using
+** the [sqlite3_vtab_collation()] interface. For most real-world virtual
+** tables, the collating sequence of constraints does not matter (for example
+** because the constraints are numeric) and so the sqlite3_vtab_collation()
+** interface is not commonly needed.
+*/
+#define SQLITE_INDEX_CONSTRAINT_EQ 2
+#define SQLITE_INDEX_CONSTRAINT_GT 4
+#define SQLITE_INDEX_CONSTRAINT_LE 8
+#define SQLITE_INDEX_CONSTRAINT_LT 16
+#define SQLITE_INDEX_CONSTRAINT_GE 32
+#define SQLITE_INDEX_CONSTRAINT_MATCH 64
+#define SQLITE_INDEX_CONSTRAINT_LIKE 65
+#define SQLITE_INDEX_CONSTRAINT_GLOB 66
+#define SQLITE_INDEX_CONSTRAINT_REGEXP 67
+#define SQLITE_INDEX_CONSTRAINT_NE 68
+#define SQLITE_INDEX_CONSTRAINT_ISNOT 69
+#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70
+#define SQLITE_INDEX_CONSTRAINT_ISNULL 71
+#define SQLITE_INDEX_CONSTRAINT_IS 72
+#define SQLITE_INDEX_CONSTRAINT_LIMIT 73
+#define SQLITE_INDEX_CONSTRAINT_OFFSET 74
+#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150
/*
** CAPI3REF: Register A Virtual Table Implementation
@@ -7034,7 +7394,7 @@ struct sqlite3_index_info {
** destructor.
**
** ^If the third parameter (the pointer to the sqlite3_module object) is
-** NULL then no new module is create and any existing modules with the
+** NULL then no new module is created and any existing modules with the
** same name are dropped.
**
** See also: [sqlite3_drop_modules()]
@@ -7147,16 +7507,6 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL);
SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg);
/*
-** The interface to the virtual-table mechanism defined above (back up
-** to a comment remarkably similar to this one) is currently considered
-** to be experimental. The interface might change in incompatible ways.
-** If this is a problem for you, do not use the interface at this time.
-**
-** When the virtual-table mechanism stabilizes, we will declare the
-** interface fixed, support it indefinitely, and remove this comment.
-*/
-
-/*
** CAPI3REF: A Handle To An Open BLOB
** KEYWORDS: {BLOB handle} {BLOB handles}
**
@@ -7539,9 +7889,9 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
** is undefined if the mutex is not currently entered by the
** calling thread or is not currently allocated.
**
-** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or
-** sqlite3_mutex_leave() is a NULL pointer, then all three routines
-** behave as no-ops.
+** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(),
+** sqlite3_mutex_leave(), or sqlite3_mutex_free() is a NULL pointer,
+** then any of the four routines behaves as a no-op.
**
** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()].
*/
@@ -7810,7 +8160,8 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_SEEK_COUNT 30
#define SQLITE_TESTCTRL_TRACEFLAGS 31
#define SQLITE_TESTCTRL_TUNE 32
-#define SQLITE_TESTCTRL_LAST 32 /* Largest TESTCTRL */
+#define SQLITE_TESTCTRL_LOGEST 33
+#define SQLITE_TESTCTRL_LAST 33 /* Largest TESTCTRL */
/*
** CAPI3REF: SQL Keyword Checking
@@ -8333,6 +8684,16 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg);
** The counter is incremented on the first [sqlite3_step()] call of each
** cycle.
**
+** [[SQLITE_STMTSTATUS_FILTER_MISS]]
+** [[SQLITE_STMTSTATUS_FILTER HIT]]
+** <dt>SQLITE_STMTSTATUS_FILTER_HIT<br>
+** SQLITE_STMTSTATUS_FILTER_MISS</dt>
+** <dd>^SQLITE_STMTSTATUS_FILTER_HIT is the number of times that a join
+** step was bypassed because a Bloom filter returned not-found. The
+** corresponding SQLITE_STMTSTATUS_FILTER_MISS value is the number of
+** times that the Bloom filter returned a find, and thus the join step
+** had to be processed as normal.
+**
** [[SQLITE_STMTSTATUS_MEMUSED]] <dt>SQLITE_STMTSTATUS_MEMUSED</dt>
** <dd>^This is the approximate number of bytes of heap memory
** used to store the prepared statement. ^This value is not actually
@@ -8347,6 +8708,8 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg);
#define SQLITE_STMTSTATUS_VM_STEP 4
#define SQLITE_STMTSTATUS_REPREPARE 5
#define SQLITE_STMTSTATUS_RUN 6
+#define SQLITE_STMTSTATUS_FILTER_MISS 7
+#define SQLITE_STMTSTATUS_FILTER_HIT 8
#define SQLITE_STMTSTATUS_MEMUSED 99
/*
@@ -8758,7 +9121,7 @@ typedef struct sqlite3_backup sqlite3_backup;
** if the application incorrectly accesses the destination [database connection]
** and so no error code is reported, but the operations may malfunction
** nevertheless. Use of the destination database connection while a
-** backup is in progress might also also cause a mutex deadlock.
+** backup is in progress might also cause a mutex deadlock.
**
** If running in [shared cache mode], the application must
** guarantee that the shared cache used by the destination database
@@ -9010,8 +9373,9 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...);
**
** A single database handle may have at most a single write-ahead log callback
** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any
-** previously registered write-ahead log callback. ^Note that the
-** [sqlite3_wal_autocheckpoint()] interface and the
+** previously registered write-ahead log callback. ^The return value is
+** a copy of the third parameter from the previous call, if any, or 0.
+** ^Note that the [sqlite3_wal_autocheckpoint()] interface and the
** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will
** overwrite any prior [sqlite3_wal_hook()] settings.
*/
@@ -9185,7 +9549,7 @@ SQLITE_API int sqlite3_wal_checkpoint_v2(
*/
#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */
#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */
-#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for for readers */
+#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for readers */
#define SQLITE_CHECKPOINT_TRUNCATE 3 /* Like RESTART but also truncate WAL */
/*
@@ -9261,18 +9625,28 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
** [[SQLITE_VTAB_INNOCUOUS]]<dt>SQLITE_VTAB_INNOCUOUS</dt>
** <dd>Calls of the form
** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the
-** the [xConnect] or [xCreate] methods of a [virtual table] implmentation
+** the [xConnect] or [xCreate] methods of a [virtual table] implementation
** identify that virtual table as being safe to use from within triggers
** and views. Conceptually, the SQLITE_VTAB_INNOCUOUS tag means that the
** virtual table can do no serious harm even if it is controlled by a
** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS
** flag unless absolutely necessary.
** </dd>
+**
+** [[SQLITE_VTAB_USES_ALL_SCHEMAS]]<dt>SQLITE_VTAB_USES_ALL_SCHEMAS</dt>
+** <dd>Calls of the form
+** [sqlite3_vtab_config](db,SQLITE_VTAB_USES_ALL_SCHEMA) from within the
+** the [xConnect] or [xCreate] methods of a [virtual table] implementation
+** instruct the query planner to begin at least a read transaction on
+** all schemas ("main", "temp", and any ATTACH-ed databases) whenever the
+** virtual table is used.
+** </dd>
** </dl>
*/
#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1
#define SQLITE_VTAB_INNOCUOUS 2
#define SQLITE_VTAB_DIRECTONLY 3
+#define SQLITE_VTAB_USES_ALL_SCHEMAS 4
/*
** CAPI3REF: Determine The Virtual Table Conflict Policy
@@ -9314,18 +9688,274 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*);
/*
** CAPI3REF: Determine The Collation For a Virtual Table Constraint
+** METHOD: sqlite3_index_info
**
** This function may only be called from within a call to the [xBestIndex]
-** method of a [virtual table].
+** method of a [virtual table]. This function returns a pointer to a string
+** that is the name of the appropriate collation sequence to use for text
+** comparisons on the constraint identified by its arguments.
+**
+** The first argument must be the pointer to the [sqlite3_index_info] object
+** that is the first parameter to the xBestIndex() method. The second argument
+** must be an index into the aConstraint[] array belonging to the
+** sqlite3_index_info structure passed to xBestIndex.
+**
+** Important:
+** The first parameter must be the same pointer that is passed into the
+** xBestMethod() method. The first parameter may not be a pointer to a
+** different [sqlite3_index_info] object, even an exact copy.
+**
+** The return value is computed as follows:
**
-** The first argument must be the sqlite3_index_info object that is the
-** first parameter to the xBestIndex() method. The second argument must be
-** an index into the aConstraint[] array belonging to the sqlite3_index_info
-** structure passed to xBestIndex. This function returns a pointer to a buffer
-** containing the name of the collation sequence for the corresponding
-** constraint.
+** <ol>
+** <li><p> If the constraint comes from a WHERE clause expression that contains
+** a [COLLATE operator], then the name of the collation specified by
+** that COLLATE operator is returned.
+** <li><p> If there is no COLLATE operator, but the column that is the subject
+** of the constraint specifies an alternative collating sequence via
+** a [COLLATE clause] on the column definition within the CREATE TABLE
+** statement that was passed into [sqlite3_declare_vtab()], then the
+** name of that alternative collating sequence is returned.
+** <li><p> Otherwise, "BINARY" is returned.
+** </ol>
*/
-SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
+SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info*,int);
+
+/*
+** CAPI3REF: Determine if a virtual table query is DISTINCT
+** METHOD: sqlite3_index_info
+**
+** This API may only be used from within an [xBestIndex|xBestIndex method]
+** of a [virtual table] implementation. The result of calling this
+** interface from outside of xBestIndex() is undefined and probably harmful.
+**
+** ^The sqlite3_vtab_distinct() interface returns an integer between 0 and
+** 3. The integer returned by sqlite3_vtab_distinct()
+** gives the virtual table additional information about how the query
+** planner wants the output to be ordered. As long as the virtual table
+** can meet the ordering requirements of the query planner, it may set
+** the "orderByConsumed" flag.
+**
+** <ol><li value="0"><p>
+** ^If the sqlite3_vtab_distinct() interface returns 0, that means
+** that the query planner needs the virtual table to return all rows in the
+** sort order defined by the "nOrderBy" and "aOrderBy" fields of the
+** [sqlite3_index_info] object. This is the default expectation. If the
+** virtual table outputs all rows in sorted order, then it is always safe for
+** the xBestIndex method to set the "orderByConsumed" flag, regardless of
+** the return value from sqlite3_vtab_distinct().
+** <li value="1"><p>
+** ^(If the sqlite3_vtab_distinct() interface returns 1, that means
+** that the query planner does not need the rows to be returned in sorted order
+** as long as all rows with the same values in all columns identified by the
+** "aOrderBy" field are adjacent.)^ This mode is used when the query planner
+** is doing a GROUP BY.
+** <li value="2"><p>
+** ^(If the sqlite3_vtab_distinct() interface returns 2, that means
+** that the query planner does not need the rows returned in any particular
+** order, as long as rows with the same values in all "aOrderBy" columns
+** are adjacent.)^ ^(Furthermore, only a single row for each particular
+** combination of values in the columns identified by the "aOrderBy" field
+** needs to be returned.)^ ^It is always ok for two or more rows with the same
+** values in all "aOrderBy" columns to be returned, as long as all such rows
+** are adjacent. ^The virtual table may, if it chooses, omit extra rows
+** that have the same value for all columns identified by "aOrderBy".
+** ^However omitting the extra rows is optional.
+** This mode is used for a DISTINCT query.
+** <li value="3"><p>
+** ^(If the sqlite3_vtab_distinct() interface returns 3, that means
+** that the query planner needs only distinct rows but it does need the
+** rows to be sorted.)^ ^The virtual table implementation is free to omit
+** rows that are identical in all aOrderBy columns, if it wants to, but
+** it is not required to omit any rows. This mode is used for queries
+** that have both DISTINCT and ORDER BY clauses.
+** </ol>
+**
+** ^For the purposes of comparing virtual table output values to see if the
+** values are same value for sorting purposes, two NULL values are considered
+** to be the same. In other words, the comparison operator is "IS"
+** (or "IS NOT DISTINCT FROM") and not "==".
+**
+** If a virtual table implementation is unable to meet the requirements
+** specified above, then it must not set the "orderByConsumed" flag in the
+** [sqlite3_index_info] object or an incorrect answer may result.
+**
+** ^A virtual table implementation is always free to return rows in any order
+** it wants, as long as the "orderByConsumed" flag is not set. ^When the
+** the "orderByConsumed" flag is unset, the query planner will add extra
+** [bytecode] to ensure that the final results returned by the SQL query are
+** ordered correctly. The use of the "orderByConsumed" flag and the
+** sqlite3_vtab_distinct() interface is merely an optimization. ^Careful
+** use of the sqlite3_vtab_distinct() interface and the "orderByConsumed"
+** flag might help queries against a virtual table to run faster. Being
+** overly aggressive and setting the "orderByConsumed" flag when it is not
+** valid to do so, on the other hand, might cause SQLite to return incorrect
+** results.
+*/
+SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*);
+
+/*
+** CAPI3REF: Identify and handle IN constraints in xBestIndex
+**
+** This interface may only be used from within an
+** [xBestIndex|xBestIndex() method] of a [virtual table] implementation.
+** The result of invoking this interface from any other context is
+** undefined and probably harmful.
+**
+** ^(A constraint on a virtual table of the form
+** "[IN operator|column IN (...)]" is
+** communicated to the xBestIndex method as a
+** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^ If xBestIndex wants to use
+** this constraint, it must set the corresponding
+** aConstraintUsage[].argvIndex to a postive integer. ^(Then, under
+** the usual mode of handling IN operators, SQLite generates [bytecode]
+** that invokes the [xFilter|xFilter() method] once for each value
+** on the right-hand side of the IN operator.)^ Thus the virtual table
+** only sees a single value from the right-hand side of the IN operator
+** at a time.
+**
+** In some cases, however, it would be advantageous for the virtual
+** table to see all values on the right-hand of the IN operator all at
+** once. The sqlite3_vtab_in() interfaces facilitates this in two ways:
+**
+** <ol>
+** <li><p>
+** ^A call to sqlite3_vtab_in(P,N,-1) will return true (non-zero)
+** if and only if the [sqlite3_index_info|P->aConstraint][N] constraint
+** is an [IN operator] that can be processed all at once. ^In other words,
+** sqlite3_vtab_in() with -1 in the third argument is a mechanism
+** by which the virtual table can ask SQLite if all-at-once processing
+** of the IN operator is even possible.
+**
+** <li><p>
+** ^A call to sqlite3_vtab_in(P,N,F) with F==1 or F==0 indicates
+** to SQLite that the virtual table does or does not want to process
+** the IN operator all-at-once, respectively. ^Thus when the third
+** parameter (F) is non-negative, this interface is the mechanism by
+** which the virtual table tells SQLite how it wants to process the
+** IN operator.
+** </ol>
+**
+** ^The sqlite3_vtab_in(P,N,F) interface can be invoked multiple times
+** within the same xBestIndex method call. ^For any given P,N pair,
+** the return value from sqlite3_vtab_in(P,N,F) will always be the same
+** within the same xBestIndex call. ^If the interface returns true
+** (non-zero), that means that the constraint is an IN operator
+** that can be processed all-at-once. ^If the constraint is not an IN
+** operator or cannot be processed all-at-once, then the interface returns
+** false.
+**
+** ^(All-at-once processing of the IN operator is selected if both of the
+** following conditions are met:
+**
+** <ol>
+** <li><p> The P->aConstraintUsage[N].argvIndex value is set to a positive
+** integer. This is how the virtual table tells SQLite that it wants to
+** use the N-th constraint.
+**
+** <li><p> The last call to sqlite3_vtab_in(P,N,F) for which F was
+** non-negative had F>=1.
+** </ol>)^
+**
+** ^If either or both of the conditions above are false, then SQLite uses
+** the traditional one-at-a-time processing strategy for the IN constraint.
+** ^If both conditions are true, then the argvIndex-th parameter to the
+** xFilter method will be an [sqlite3_value] that appears to be NULL,
+** but which can be passed to [sqlite3_vtab_in_first()] and
+** [sqlite3_vtab_in_next()] to find all values on the right-hand side
+** of the IN constraint.
+*/
+SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle);
+
+/*
+** CAPI3REF: Find all elements on the right-hand side of an IN constraint.
+**
+** These interfaces are only useful from within the
+** [xFilter|xFilter() method] of a [virtual table] implementation.
+** The result of invoking these interfaces from any other context
+** is undefined and probably harmful.
+**
+** The X parameter in a call to sqlite3_vtab_in_first(X,P) or
+** sqlite3_vtab_in_next(X,P) should be one of the parameters to the
+** xFilter method which invokes these routines, and specifically
+** a parameter that was previously selected for all-at-once IN constraint
+** processing use the [sqlite3_vtab_in()] interface in the
+** [xBestIndex|xBestIndex method]. ^(If the X parameter is not
+** an xFilter argument that was selected for all-at-once IN constraint
+** processing, then these routines return [SQLITE_ERROR].)^
+**
+** ^(Use these routines to access all values on the right-hand side
+** of the IN constraint using code like the following:
+**
+** <blockquote><pre>
+** &nbsp; for(rc=sqlite3_vtab_in_first(pList, &pVal);
+** &nbsp; rc==SQLITE_OK && pVal;
+** &nbsp; rc=sqlite3_vtab_in_next(pList, &pVal)
+** &nbsp; ){
+** &nbsp; // do something with pVal
+** &nbsp; }
+** &nbsp; if( rc!=SQLITE_OK ){
+** &nbsp; // an error has occurred
+** &nbsp; }
+** </pre></blockquote>)^
+**
+** ^On success, the sqlite3_vtab_in_first(X,P) and sqlite3_vtab_in_next(X,P)
+** routines return SQLITE_OK and set *P to point to the first or next value
+** on the RHS of the IN constraint. ^If there are no more values on the
+** right hand side of the IN constraint, then *P is set to NULL and these
+** routines return [SQLITE_DONE]. ^The return value might be
+** some other value, such as SQLITE_NOMEM, in the event of a malfunction.
+**
+** The *ppOut values returned by these routines are only valid until the
+** next call to either of these routines or until the end of the xFilter
+** method from which these routines were called. If the virtual table
+** implementation needs to retain the *ppOut values for longer, it must make
+** copies. The *ppOut values are [protected sqlite3_value|protected].
+*/
+SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut);
+SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
+
+/*
+** CAPI3REF: Constraint values in xBestIndex()
+** METHOD: sqlite3_index_info
+**
+** This API may only be used from within the [xBestIndex|xBestIndex method]
+** of a [virtual table] implementation. The result of calling this interface
+** from outside of an xBestIndex method are undefined and probably harmful.
+**
+** ^When the sqlite3_vtab_rhs_value(P,J,V) interface is invoked from within
+** the [xBestIndex] method of a [virtual table] implementation, with P being
+** a copy of the [sqlite3_index_info] object pointer passed into xBestIndex and
+** J being a 0-based index into P->aConstraint[], then this routine
+** attempts to set *V to the value of the right-hand operand of
+** that constraint if the right-hand operand is known. ^If the
+** right-hand operand is not known, then *V is set to a NULL pointer.
+** ^The sqlite3_vtab_rhs_value(P,J,V) interface returns SQLITE_OK if
+** and only if *V is set to a value. ^The sqlite3_vtab_rhs_value(P,J,V)
+** inteface returns SQLITE_NOTFOUND if the right-hand side of the J-th
+** constraint is not available. ^The sqlite3_vtab_rhs_value() interface
+** can return an result code other than SQLITE_OK or SQLITE_NOTFOUND if
+** something goes wrong.
+**
+** The sqlite3_vtab_rhs_value() interface is usually only successful if
+** the right-hand operand of a constraint is a literal value in the original
+** SQL statement. If the right-hand operand is an expression or a reference
+** to some other column or a [host parameter], then sqlite3_vtab_rhs_value()
+** will probably return [SQLITE_NOTFOUND].
+**
+** ^(Some constraints, such as [SQLITE_INDEX_CONSTRAINT_ISNULL] and
+** [SQLITE_INDEX_CONSTRAINT_ISNOTNULL], have no right-hand operand. For such
+** constraints, sqlite3_vtab_rhs_value() always returns SQLITE_NOTFOUND.)^
+**
+** ^The [sqlite3_value] object returned in *V is a protected sqlite3_value
+** and remains valid for the duration of the xBestIndex method call.
+** ^When xBestIndex returns, the sqlite3_value object returned by
+** sqlite3_vtab_rhs_value() is automatically deallocated.
+**
+** The "_rhs_" in the name of this routine is an abbreviation for
+** "Right-Hand Side".
+*/
+SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
/*
** CAPI3REF: Conflict resolution modes
@@ -9357,6 +9987,10 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_
** managed by the prepared statement S and will be automatically freed when
** S is finalized.
**
+** Not all values are available for all query elements. When a value is
+** not available, the output variable is set to -1 if the value is numeric,
+** or to NULL if it is a string (SQLITE_SCANSTAT_NAME).
+**
** <dl>
** [[SQLITE_SCANSTAT_NLOOP]] <dt>SQLITE_SCANSTAT_NLOOP</dt>
** <dd>^The [sqlite3_int64] variable pointed to by the V parameter will be
@@ -9384,12 +10018,24 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_
** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN]
** description for the X-th loop.
**
-** [[SQLITE_SCANSTAT_SELECTID]] <dt>SQLITE_SCANSTAT_SELECT</dt>
+** [[SQLITE_SCANSTAT_SELECTID]] <dt>SQLITE_SCANSTAT_SELECTID</dt>
** <dd>^The "int" variable pointed to by the V parameter will be set to the
-** "select-id" for the X-th loop. The select-id identifies which query or
-** subquery the loop is part of. The main query has a select-id of zero.
-** The select-id is the same value as is output in the first column
-** of an [EXPLAIN QUERY PLAN] query.
+** id for the X-th query plan element. The id value is unique within the
+** statement. The select-id is the same value as is output in the first
+** column of an [EXPLAIN QUERY PLAN] query.
+**
+** [[SQLITE_SCANSTAT_PARENTID]] <dt>SQLITE_SCANSTAT_PARENTID</dt>
+** <dd>The "int" variable pointed to by the V parameter will be set to the
+** the id of the parent of the current query element, if applicable, or
+** to zero if the query element has no parent. This is the same value as
+** returned in the second column of an [EXPLAIN QUERY PLAN] query.
+**
+** [[SQLITE_SCANSTAT_NCYCLE]] <dt>SQLITE_SCANSTAT_NCYCLE</dt>
+** <dd>The sqlite3_int64 output value is set to the number of cycles,
+** according to the processor time-stamp counter, that elapsed while the
+** query element was being processed. This value is not available for
+** all query elements - if it is unavailable the output variable is
+** set to -1.
** </dl>
*/
#define SQLITE_SCANSTAT_NLOOP 0
@@ -9398,12 +10044,14 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_
#define SQLITE_SCANSTAT_NAME 3
#define SQLITE_SCANSTAT_EXPLAIN 4
#define SQLITE_SCANSTAT_SELECTID 5
+#define SQLITE_SCANSTAT_PARENTID 6
+#define SQLITE_SCANSTAT_NCYCLE 7
/*
** CAPI3REF: Prepared Statement Scan Status
** METHOD: sqlite3_stmt
**
-** This interface returns information about the predicted and measured
+** These interfaces return information about the predicted and measured
** performance for pStmt. Advanced applications can use this
** interface to compare the predicted and the measured performance and
** issue warnings and/or rerun [ANALYZE] if discrepancies are found.
@@ -9414,19 +10062,25 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_
**
** The "iScanStatusOp" parameter determines which status information to return.
** The "iScanStatusOp" must be one of the [scanstatus options] or the behavior
-** of this interface is undefined.
-** ^The requested measurement is written into a variable pointed to by
-** the "pOut" parameter.
-** Parameter "idx" identifies the specific loop to retrieve statistics for.
-** Loops are numbered starting from zero. ^If idx is out of range - less than
-** zero or greater than or equal to the total number of loops used to implement
-** the statement - a non-zero value is returned and the variable that pOut
-** points to is unchanged.
-**
-** ^Statistics might not be available for all loops in all statements. ^In cases
-** where there exist loops with no available statistics, this function behaves
-** as if the loop did not exist - it returns non-zero and leave the variable
-** that pOut points to unchanged.
+** of this interface is undefined. ^The requested measurement is written into
+** a variable pointed to by the "pOut" parameter.
+**
+** The "flags" parameter must be passed a mask of flags. At present only
+** one flag is defined - SQLITE_SCANSTAT_COMPLEX. If SQLITE_SCANSTAT_COMPLEX
+** is specified, then status information is available for all elements
+** of a query plan that are reported by "EXPLAIN QUERY PLAN" output. If
+** SQLITE_SCANSTAT_COMPLEX is not specified, then only query plan elements
+** that correspond to query loops (the "SCAN..." and "SEARCH..." elements of
+** the EXPLAIN QUERY PLAN output) are available. Invoking API
+** sqlite3_stmt_scanstatus() is equivalent to calling
+** sqlite3_stmt_scanstatus_v2() with a zeroed flags parameter.
+**
+** Parameter "idx" identifies the specific query element to retrieve statistics
+** for. Query elements are numbered starting from zero. A value of -1 may be
+** to query for statistics regarding the entire query. ^If idx is out of range
+** - less than -1 or greater than or equal to the total number of query
+** elements used to implement the statement - a non-zero value is returned and
+** the variable that pOut points to is unchanged.
**
** See also: [sqlite3_stmt_scanstatus_reset()]
*/
@@ -9436,6 +10090,19 @@ SQLITE_API int sqlite3_stmt_scanstatus(
int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */
void *pOut /* Result written here */
);
+SQLITE_API int sqlite3_stmt_scanstatus_v2(
+ sqlite3_stmt *pStmt, /* Prepared statement for which info desired */
+ int idx, /* Index of loop to report on */
+ int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */
+ int flags, /* Mask of flags defined below */
+ void *pOut /* Result written here */
+);
+
+/*
+** CAPI3REF: Prepared Statement Scan Status
+** KEYWORDS: {scan status flags}
+*/
+#define SQLITE_SCANSTAT_COMPLEX 0x0001
/*
** CAPI3REF: Zero Scan-Status Counters
@@ -9526,6 +10193,10 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*);
** function is not defined for operations on WITHOUT ROWID tables, or for
** DELETE operations on rowid tables.
**
+** ^The sqlite3_preupdate_hook(D,C,P) function returns the P argument from
+** the previous call on the same [database connection] D, or NULL for
+** the first call on D.
+**
** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()],
** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces
** provide additional information about a preupdate event. These routines
@@ -9878,6 +10549,10 @@ SQLITE_API unsigned char *sqlite3_serialize(
** database is currently in a read transaction or is involved in a backup
** operation.
**
+** It is not possible to deserialized into the TEMP database. If the
+** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the
+** function returns SQLITE_ERROR.
+**
** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the
** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then
** [sqlite3_free()] is invoked on argument P prior to returning.
@@ -9927,6 +10602,19 @@ SQLITE_API int sqlite3_deserialize(
# undef double
#endif
+#if defined(__wasi__)
+# undef SQLITE_WASI
+# define SQLITE_WASI 1
+# undef SQLITE_OMIT_WAL
+# define SQLITE_OMIT_WAL 1/* because it requires shared memory APIs */
+# ifndef SQLITE_OMIT_LOAD_EXTENSION
+# define SQLITE_OMIT_LOAD_EXTENSION
+# endif
+# ifndef SQLITE_THREADSAFE
+# define SQLITE_THREADSAFE 0
+# endif
+#endif
+
#ifdef __cplusplus
} /* End of the 'extern "C"' block */
#endif
@@ -10133,16 +10821,20 @@ SQLITE_API int sqlite3session_create(
SQLITE_API void sqlite3session_delete(sqlite3_session *pSession);
/*
-** CAPIREF: Conigure a Session Object
+** CAPI3REF: Configure a Session Object
** METHOD: sqlite3_session
**
** This method is used to configure a session object after it has been
-** created. At present the only valid value for the second parameter is
-** [SQLITE_SESSION_OBJCONFIG_SIZE].
+** created. At present the only valid values for the second parameter are
+** [SQLITE_SESSION_OBJCONFIG_SIZE] and [SQLITE_SESSION_OBJCONFIG_ROWID].
**
-** Arguments for sqlite3session_object_config()
+*/
+SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg);
+
+/*
+** CAPI3REF: Options for sqlite3session_object_config
**
-** The following values may passed as the the 4th parameter to
+** The following values may passed as the the 2nd parameter to
** sqlite3session_object_config().
**
** <dt>SQLITE_SESSION_OBJCONFIG_SIZE <dd>
@@ -10158,12 +10850,21 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession);
**
** It is an error (SQLITE_MISUSE) to attempt to modify this setting after
** the first table has been attached to the session object.
+**
+** <dt>SQLITE_SESSION_OBJCONFIG_ROWID <dd>
+** This option is used to set, clear or query the flag that enables
+** collection of data for tables with no explicit PRIMARY KEY.
+**
+** Normally, tables with no explicit PRIMARY KEY are simply ignored
+** by the sessions module. However, if this flag is set, it behaves
+** as if such tables have a column "_rowid_ INTEGER PRIMARY KEY" inserted
+** as their leftmost columns.
+**
+** It is an error (SQLITE_MISUSE) to attempt to modify this setting after
+** the first table has been attached to the session object.
*/
-SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg);
-
-/*
-*/
-#define SQLITE_SESSION_OBJCONFIG_SIZE 1
+#define SQLITE_SESSION_OBJCONFIG_SIZE 1
+#define SQLITE_SESSION_OBJCONFIG_ROWID 2
/*
** CAPI3REF: Enable Or Disable A Session Object
@@ -11296,9 +11997,23 @@ SQLITE_API int sqlite3changeset_apply_v2(
** Invert the changeset before applying it. This is equivalent to inverting
** a changeset using sqlite3changeset_invert() before applying it. It is
** an error to specify this flag with a patchset.
+**
+** <dt>SQLITE_CHANGESETAPPLY_IGNORENOOP <dd>
+** Do not invoke the conflict handler callback for any changes that
+** would not actually modify the database even if they were applied.
+** Specifically, this means that the conflict handler is not invoked
+** for:
+** <ul>
+** <li>a delete change if the row being deleted cannot be found,
+** <li>an update change if the modified fields are already set to
+** their new values in the conflicting row, or
+** <li>an insert change if all fields of the conflicting row match
+** the row being inserted.
+** </ul>
*/
#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
#define SQLITE_CHANGESETAPPLY_INVERT 0x0002
+#define SQLITE_CHANGESETAPPLY_IGNORENOOP 0x0004
/*
** CAPI3REF: Constants Passed To The Conflict Handler
diff --git a/devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js b/devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js
index f29de54a44..a4fafa2c1b 100644
--- a/devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js
+++ b/devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js
@@ -39,14 +39,14 @@ add_task(function* () {
// Calculate offsets to click in the middle of the first box quad.
let rect = prop.editor.valueSpan.getBoundingClientRect();
- let firstQuad = prop.editor.valueSpan.getBoxQuads()[0];
+ let firstQuadBounds = prop.editor.valueSpan.getBoxQuads()[0].getBounds();
// For a multiline value, the first quad left edge is not aligned with the
// bounding rect left edge. The offsets expected by focusEditableField are
// relative to the bouding rectangle, so we need to translate the x-offset.
- let x = firstQuad.bounds.left - rect.left + firstQuad.bounds.width / 2;
+ let x = firstQuadBounds.left - rect.left + firstQuadBounds.width / 2;
// The first quad top edge is aligned with the bounding top edge, no
// translation needed here.
- let y = firstQuad.bounds.height / 2;
+ let y = firstQuadBounds.height / 2;
info("Focusing the css property editable value");
let editor = yield focusEditableField(view, prop.editor.valueSpan, x, y);
diff --git a/devtools/client/shared/autocomplete-popup.js b/devtools/client/shared/autocomplete-popup.js
index b22de4d992..e848f6c1fd 100644
--- a/devtools/client/shared/autocomplete-popup.js
+++ b/devtools/client/shared/autocomplete-popup.js
@@ -283,7 +283,7 @@ AutocompletePopup.prototype = {
return;
}
- let {top, height} = quads[0].bounds;
+ let {top, height} = quads[0].getBounds();
let containerHeight = this._tooltip.panel.getBoundingClientRect().height;
if (top < 0) {
// Element is above container.
diff --git a/devtools/client/shared/test/browser_html_tooltip_arrow-01.js b/devtools/client/shared/test/browser_html_tooltip_arrow-01.js
index a20c67529a..4c3b332d26 100644
--- a/devtools/client/shared/test/browser_html_tooltip_arrow-01.js
+++ b/devtools/client/shared/test/browser_html_tooltip_arrow-01.js
@@ -85,9 +85,9 @@ function* runTests(doc) {
ok(arrow, "Tooltip has an arrow");
// Get the geometry of the anchor, the tooltip panel & arrow.
- let arrowBounds = arrow.getBoxQuads({relativeTo: doc})[0].bounds;
- let panelBounds = tooltip.panel.getBoxQuads({relativeTo: doc})[0].bounds;
- let anchorBounds = el.getBoxQuads({relativeTo: doc})[0].bounds;
+ let arrowBounds = arrow.getBoxQuads({relativeTo: doc})[0].getBounds();
+ let panelBounds = tooltip.panel.getBoxQuads({relativeTo: doc})[0].getBounds();
+ let anchorBounds = el.getBoxQuads({relativeTo: doc})[0].getBounds();
let intersects = arrowBounds.left <= anchorBounds.right &&
arrowBounds.right >= anchorBounds.left;
diff --git a/devtools/client/shared/test/browser_html_tooltip_arrow-02.js b/devtools/client/shared/test/browser_html_tooltip_arrow-02.js
index 098f1ac7bf..5bf13e911e 100644
--- a/devtools/client/shared/test/browser_html_tooltip_arrow-02.js
+++ b/devtools/client/shared/test/browser_html_tooltip_arrow-02.js
@@ -78,9 +78,9 @@ function* runTests(doc) {
ok(arrow, "Tooltip has an arrow");
// Get the geometry of the anchor, the tooltip panel & arrow.
- let arrowBounds = arrow.getBoxQuads({relativeTo: doc})[0].bounds;
- let panelBounds = tooltip.panel.getBoxQuads({relativeTo: doc})[0].bounds;
- let anchorBounds = el.getBoxQuads({relativeTo: doc})[0].bounds;
+ let arrowBounds = arrow.getBoxQuads({relativeTo: doc})[0].getBounds();
+ let panelBounds = tooltip.panel.getBoxQuads({relativeTo: doc})[0].getBounds();
+ let anchorBounds = el.getBoxQuads({relativeTo: doc})[0].getBounds();
let intersects = arrowBounds.left <= anchorBounds.right &&
arrowBounds.right >= anchorBounds.left;
diff --git a/devtools/client/shared/test/browser_inplace-editor_autocomplete_offset.js b/devtools/client/shared/test/browser_inplace-editor_autocomplete_offset.js
index 2734125bd1..e5ce45b280 100644
--- a/devtools/client/shared/test/browser_inplace-editor_autocomplete_offset.js
+++ b/devtools/client/shared/test/browser_inplace-editor_autocomplete_offset.js
@@ -114,5 +114,5 @@ let runAutocompletionTest = Task.async(function* (editor) {
*/
function getPopupOffset({popup, input}) {
let popupQuads = popup._panel.getBoxQuads({relativeTo: input});
- return popupQuads[0].bounds.left;
+ return popupQuads[0].getBounds().left;
}
diff --git a/devtools/client/shared/widgets/tooltip/HTMLTooltip.js b/devtools/client/shared/widgets/tooltip/HTMLTooltip.js
index 9eb7910303..6cc12a53a4 100644
--- a/devtools/client/shared/widgets/tooltip/HTMLTooltip.js
+++ b/devtools/client/shared/widgets/tooltip/HTMLTooltip.js
@@ -176,9 +176,9 @@ const getRelativeRect = function (node, relativeTo) {
// Width and Height can be taken from the rect.
let {width, height} = node.getBoundingClientRect();
- let quads = node.getBoxQuads({relativeTo});
- let top = quads[0].bounds.top;
- let left = quads[0].bounds.left;
+ let quadBounds = node.getBoxQuads({relativeTo})[0].getBounds();
+ let top = quadBounds.top;
+ let left = quadBounds.left;
// Compute right and bottom coordinates using the rest of the data.
let right = left + width;
diff --git a/devtools/server/actors/inspector.js b/devtools/server/actors/inspector.js
index 883809b6cf..ba9393de58 100644
--- a/devtools/server/actors/inspector.js
+++ b/devtools/server/actors/inspector.js
@@ -3071,7 +3071,10 @@ function nodeHasSize(node) {
}
let quads = node.getBoxQuads();
- return quads.length && quads.some(quad => quad.bounds.width && quad.bounds.height);
+ return quads.some(quad => {
+ let bounds = quad.getBounds();
+ return bounds.width && bounds.height;
+ });
}
/**
diff --git a/devtools/shared/layout/utils.js b/devtools/shared/layout/utils.js
index 1e6ab5075a..bbe6df4c85 100644
--- a/devtools/shared/layout/utils.js
+++ b/devtools/shared/layout/utils.js
@@ -175,6 +175,11 @@ exports.getFrameOffsets = getFrameOffsets;
/**
* Get box quads adjusted for iframes and zoom level.
*
+ * Warning: this function returns things that look like DOMQuad objects but
+ * aren't (they resemble an old version of the spec). Unlike the return value
+ * of node.getBoxQuads, they have a .bounds property and not a .getBounds()
+ * method.
+ *
* @param {DOMWindow} boundaryWindow
* The window where to stop to iterate. If `null` is given, the top
* window is used.
@@ -206,6 +211,7 @@ function getAdjustedQuads(boundaryWindow, node, region) {
let adjustedQuads = [];
for (let quad of quads) {
+ let bounds = quad.getBounds();
adjustedQuads.push({
p1: {
w: quad.p1.w * scale,
@@ -232,14 +238,14 @@ function getAdjustedQuads(boundaryWindow, node, region) {
z: quad.p4.z * scale
},
bounds: {
- bottom: quad.bounds.bottom * scale + yOffset,
- height: quad.bounds.height * scale,
- left: quad.bounds.left * scale + xOffset,
- right: quad.bounds.right * scale + xOffset,
- top: quad.bounds.top * scale + yOffset,
- width: quad.bounds.width * scale,
- x: quad.bounds.x * scale + xOffset,
- y: quad.bounds.y * scale + yOffset
+ bottom: bounds.bottom * scale + yOffset,
+ height: bounds.height * scale,
+ left: bounds.left * scale + xOffset,
+ right: bounds.right * scale + xOffset,
+ top: bounds.top * scale + yOffset,
+ width: bounds.width * scale,
+ x: bounds.x * scale + xOffset,
+ y: bounds.y * scale + yOffset
}
});
}
diff --git a/dom/base/DOMMatrix.cpp b/dom/base/DOMMatrix.cpp
index 72c8d9b76b..f0358125f8 100644
--- a/dom/base/DOMMatrix.cpp
+++ b/dom/base/DOMMatrix.cpp
@@ -17,9 +17,15 @@
#include <math.h>
+#include "js/Equality.h" // JS::SameValueZero
+
namespace mozilla {
namespace dom {
+template <typename T>
+static void
+SetDataInMatrix(DOMMatrixReadOnly* aMatrix, const T* aData, int aLength, ErrorResult& aRv);
+
static const double radPerDegree = 2.0 * M_PI / 360.0;
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(DOMMatrixReadOnly, mParent)
@@ -27,6 +33,210 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(DOMMatrixReadOnly, mParent)
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(DOMMatrixReadOnly, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(DOMMatrixReadOnly, Release)
+JSObject*
+DOMMatrixReadOnly::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return DOMMatrixReadOnlyBinding::Wrap(aCx, this, aGivenProto);
+}
+
+// https://drafts.fxtf.org/geometry/#matrix-validate-and-fixup-2d
+static bool
+ValidateAndFixupMatrix2DInit(DOMMatrix2DInit& aMatrixInit, ErrorResult& aRv)
+{
+#define ValidateAliases(field, alias, fieldName, aliasName) \
+ if ((field).WasPassed() && (alias).WasPassed() && \
+ !JS::SameValueZero((field).Value(), (alias).Value())) { \
+ aRv.ThrowTypeError<MSG_MATRIX_INIT_CONFLICTING_VALUE>((fieldName), \
+ (aliasName)); \
+ return false; \
+ }
+#define SetFromAliasOrDefault(field, alias, defaultValue) \
+ if (!(field).WasPassed()) { \
+ if ((alias).WasPassed()) { \
+ (field).Construct((alias).Value()); \
+ } else { \
+ (field).Construct(defaultValue); \
+ } \
+ }
+#define ValidateAndSet(field, alias, fieldName, aliasName, defaultValue) \
+ ValidateAliases((field), (alias), NS_LITERAL_STRING(fieldName), \
+ NS_LITERAL_STRING(aliasName)); \
+ SetFromAliasOrDefault((field), (alias), (defaultValue));
+
+ ValidateAndSet(aMatrixInit.mM11, aMatrixInit.mA, "m11", "a", 1);
+ ValidateAndSet(aMatrixInit.mM12, aMatrixInit.mB, "m12", "b", 0);
+ ValidateAndSet(aMatrixInit.mM21, aMatrixInit.mC, "m21", "c", 0);
+ ValidateAndSet(aMatrixInit.mM22, aMatrixInit.mD, "m22", "d", 1);
+ ValidateAndSet(aMatrixInit.mM41, aMatrixInit.mE, "m41", "e", 0);
+ ValidateAndSet(aMatrixInit.mM42, aMatrixInit.mF, "m42", "f", 0);
+
+ return true;
+
+#undef ValidateAliases
+#undef SetFromAliasOrDefault
+#undef ValidateAndSet
+}
+
+// https://drafts.fxtf.org/geometry/#matrix-validate-and-fixup
+static bool
+ValidateAndFixupMatrixInit(DOMMatrixInit& aMatrixInit, ErrorResult& aRv)
+{
+#define Check3DField(field, fieldName, defaultValue) \
+ if ((field) != (defaultValue)) { \
+ if (!aMatrixInit.mIs2D.WasPassed()) { \
+ aMatrixInit.mIs2D.Construct(false); \
+ return true; \
+ } \
+ if (aMatrixInit.mIs2D.Value()) { \
+ aRv.ThrowTypeError<MSG_MATRIX_INIT_EXCEEDS_2D>( \
+ NS_LITERAL_STRING(fieldName)); \
+ return false; \
+ } \
+ }
+
+ if (!ValidateAndFixupMatrix2DInit(aMatrixInit, aRv)) {
+ return false;
+ }
+
+ Check3DField(aMatrixInit.mM13, "m13", 0);
+ Check3DField(aMatrixInit.mM14, "m14", 0);
+ Check3DField(aMatrixInit.mM23, "m23", 0);
+ Check3DField(aMatrixInit.mM24, "m24", 0);
+ Check3DField(aMatrixInit.mM31, "m31", 0);
+ Check3DField(aMatrixInit.mM32, "m32", 0);
+ Check3DField(aMatrixInit.mM34, "m34", 0);
+ Check3DField(aMatrixInit.mM43, "m43", 0);
+ Check3DField(aMatrixInit.mM33, "m33", 1);
+ Check3DField(aMatrixInit.mM44, "m44", 1);
+
+ if (!aMatrixInit.mIs2D.WasPassed()) {
+ aMatrixInit.mIs2D.Construct(true);
+ }
+ return true;
+
+#undef Check3DField
+}
+
+void
+DOMMatrixReadOnly::SetDataFromMatrixInit(DOMMatrixInit& aMatrixInit)
+{
+ const bool is2D = aMatrixInit.mIs2D.Value();
+ MOZ_ASSERT(is2D == Is2D());
+ if (is2D) {
+ mMatrix2D->_11 = aMatrixInit.mM11.Value();
+ mMatrix2D->_12 = aMatrixInit.mM12.Value();
+ mMatrix2D->_21 = aMatrixInit.mM21.Value();
+ mMatrix2D->_22 = aMatrixInit.mM22.Value();
+ mMatrix2D->_31 = aMatrixInit.mM41.Value();
+ mMatrix2D->_32 = aMatrixInit.mM42.Value();
+ } else {
+ mMatrix3D->_11 = aMatrixInit.mM11.Value();
+ mMatrix3D->_12 = aMatrixInit.mM12.Value();
+ mMatrix3D->_13 = aMatrixInit.mM13;
+ mMatrix3D->_14 = aMatrixInit.mM14;
+ mMatrix3D->_21 = aMatrixInit.mM21.Value();
+ mMatrix3D->_22 = aMatrixInit.mM22.Value();
+ mMatrix3D->_23 = aMatrixInit.mM23;
+ mMatrix3D->_24 = aMatrixInit.mM24;
+ mMatrix3D->_31 = aMatrixInit.mM31;
+ mMatrix3D->_32 = aMatrixInit.mM32;
+ mMatrix3D->_33 = aMatrixInit.mM33;
+ mMatrix3D->_34 = aMatrixInit.mM34;
+ mMatrix3D->_41 = aMatrixInit.mM41.Value();
+ mMatrix3D->_42 = aMatrixInit.mM42.Value();
+ mMatrix3D->_43 = aMatrixInit.mM43;
+ mMatrix3D->_44 = aMatrixInit.mM44;
+ }
+}
+
+already_AddRefed<DOMMatrixReadOnly>
+DOMMatrixReadOnly::FromMatrix(const GlobalObject& aGlobal, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv)
+{
+ DOMMatrixInit matrixInit(aMatrixInit);
+ if (!ValidateAndFixupMatrixInit(matrixInit, aRv)) {
+ return nullptr;
+ };
+
+ RefPtr<DOMMatrixReadOnly> rval =
+ new DOMMatrixReadOnly(aGlobal.GetAsSupports(), matrixInit.mIs2D.Value());
+ rval->SetDataFromMatrixInit(matrixInit);
+ return rval.forget();
+}
+
+
+already_AddRefed<DOMMatrixReadOnly>
+DOMMatrixReadOnly::FromFloat32Array(const GlobalObject& aGlobal, const Float32Array& aArray32, ErrorResult& aRv)
+{
+ aArray32.ComputeLengthAndData();
+
+ const int length = aArray32.Length();
+ const bool is2D = length == 6;
+ RefPtr<DOMMatrixReadOnly> obj =
+ new DOMMatrixReadOnly(aGlobal.GetAsSupports(), is2D);
+ SetDataInMatrix(obj, aArray32.Data(), length, aRv);
+
+ return obj.forget();
+}
+
+already_AddRefed<DOMMatrixReadOnly>
+DOMMatrixReadOnly::FromFloat64Array(const GlobalObject& aGlobal, const Float64Array& aArray64, ErrorResult& aRv)
+{
+ aArray64.ComputeLengthAndData();
+
+ const int length = aArray64.Length();
+ const bool is2D = length == 6;
+ RefPtr<DOMMatrixReadOnly> obj =
+ new DOMMatrixReadOnly(aGlobal.GetAsSupports(), is2D);
+ SetDataInMatrix(obj, aArray64.Data(), length, aRv);
+
+ return obj.forget();
+}
+
+already_AddRefed<DOMMatrixReadOnly>
+DOMMatrixReadOnly::Constructor(
+ const GlobalObject& aGlobal,
+ const Optional<StringOrUnrestrictedDoubleSequence>& aArg,
+ ErrorResult& aRv)
+{
+ RefPtr<DOMMatrixReadOnly> rval = new DOMMatrixReadOnly(aGlobal.GetAsSupports());
+ if (!aArg.WasPassed()) {
+ return rval.forget();
+ }
+
+ const auto& arg = aArg.Value();
+ if (arg.IsString()) {
+ nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!win) {
+ aRv.ThrowTypeError<MSG_ILLEGAL_CONSTRUCTOR>();
+ return nullptr;
+ }
+ rval->SetMatrixValue(arg.GetAsString(), aRv);
+ } else {
+ const auto& sequence = arg.GetAsUnrestrictedDoubleSequence();
+ SetDataInMatrix(rval, sequence.Elements(), sequence.Length(), aRv);
+ }
+
+ return rval.forget();
+}
+
+already_AddRefed<DOMMatrixReadOnly>
+DOMMatrixReadOnly::ReadStructuredClone(nsISupports* aParent, JSStructuredCloneReader* aReader)
+{
+ uint8_t is2D;
+
+ if (!JS_ReadBytes(aReader, &is2D, 1)) {
+ return nullptr;
+ }
+
+ RefPtr<DOMMatrixReadOnly> rval = new DOMMatrixReadOnly(aParent, is2D);
+
+ if (!ReadStructuredCloneElements(aReader, rval)) {
+ return nullptr;
+ };
+
+ return rval.forget();
+}
+
already_AddRefed<DOMMatrix>
DOMMatrixReadOnly::Translate(double aTx,
double aTy,
@@ -127,10 +337,10 @@ DOMMatrixReadOnly::SkewY(double aSy) const
}
already_AddRefed<DOMMatrix>
-DOMMatrixReadOnly::Multiply(const DOMMatrix& other) const
+DOMMatrixReadOnly::Multiply(const DOMMatrixInit& other, ErrorResult& aRv) const
{
RefPtr<DOMMatrix> retval = new DOMMatrix(mParent, *this);
- retval->MultiplySelf(other);
+ retval->MultiplySelf(other, aRv);
return retval.forget();
}
@@ -307,6 +517,117 @@ DOMMatrixReadOnly::Stringify(nsAString& aResult)
aResult = matrixStr;
}
+// https://drafts.fxtf.org/geometry/#structured-serialization
+bool
+DOMMatrixReadOnly::WriteStructuredClone(JSStructuredCloneWriter* aWriter) const
+{
+#define WriteFloatPair(f1, f2) \
+ JS_WriteUint32Pair(aWriter, BitwiseCast<uint32_t>(f1), \
+ BitwiseCast<uint32_t>(f2))
+
+ const uint8_t is2D = Is2D();
+
+ if (!JS_WriteBytes(aWriter, &is2D, 1)) {
+ return false;
+ }
+
+ if (is2D == 1) {
+ return WriteFloatPair(mMatrix2D->_11, mMatrix2D->_12) &&
+ WriteFloatPair(mMatrix2D->_21, mMatrix2D->_22) &&
+ WriteFloatPair(mMatrix2D->_31, mMatrix2D->_32);
+ }
+
+ return WriteFloatPair(mMatrix3D->_11, mMatrix3D->_12) &&
+ WriteFloatPair(mMatrix3D->_13, mMatrix3D->_14) &&
+ WriteFloatPair(mMatrix3D->_21, mMatrix3D->_22) &&
+ WriteFloatPair(mMatrix3D->_23, mMatrix3D->_24) &&
+ WriteFloatPair(mMatrix3D->_31, mMatrix3D->_32) &&
+ WriteFloatPair(mMatrix3D->_33, mMatrix3D->_34) &&
+ WriteFloatPair(mMatrix3D->_41, mMatrix3D->_42) &&
+ WriteFloatPair(mMatrix3D->_43, mMatrix3D->_44);
+#undef WriteFloatPair
+}
+
+bool
+DOMMatrixReadOnly::ReadStructuredCloneElements(JSStructuredCloneReader* aReader, DOMMatrixReadOnly* matrix)
+{
+ uint32_t high;
+ uint32_t low;
+
+#define ReadFloatPair(f1, f2) \
+ if (!JS_ReadUint32Pair(aReader, &high, &low)) { \
+ return false; \
+ } \
+ (*(f1) = BitwiseCast<float>(high)); \
+ (*(f2) = BitwiseCast<float>(low));
+
+ if (matrix->Is2D() == 1) {
+ ReadFloatPair(&(matrix->mMatrix2D->_11), &(matrix->mMatrix2D->_12));
+ ReadFloatPair(&(matrix->mMatrix2D->_21), &(matrix->mMatrix2D->_22));
+ ReadFloatPair(&(matrix->mMatrix2D->_31), &(matrix->mMatrix2D->_32));
+ } else {
+ ReadFloatPair(&(matrix->mMatrix3D->_11), &(matrix->mMatrix3D->_12));
+ ReadFloatPair(&(matrix->mMatrix3D->_13), &(matrix->mMatrix3D->_14));
+ ReadFloatPair(&(matrix->mMatrix3D->_21), &(matrix->mMatrix3D->_22));
+ ReadFloatPair(&(matrix->mMatrix3D->_23), &(matrix->mMatrix3D->_24));
+ ReadFloatPair(&(matrix->mMatrix3D->_31), &(matrix->mMatrix3D->_32));
+ ReadFloatPair(&(matrix->mMatrix3D->_33), &(matrix->mMatrix3D->_34));
+ ReadFloatPair(&(matrix->mMatrix3D->_41), &(matrix->mMatrix3D->_42));
+ ReadFloatPair(&(matrix->mMatrix3D->_43), &(matrix->mMatrix3D->_44));
+ }
+
+ return true;
+
+#undef ReadFloatPair
+}
+
+already_AddRefed<DOMMatrix>
+DOMMatrix::FromMatrix(nsISupports* aParent, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv)
+{
+ DOMMatrixInit matrixInit(aMatrixInit);
+ if (!ValidateAndFixupMatrixInit(matrixInit, aRv)) {
+ return nullptr;
+ };
+
+ RefPtr<DOMMatrix> matrix = new DOMMatrix(aParent, matrixInit.mIs2D.Value());
+ matrix->SetDataFromMatrixInit(matrixInit);
+ return matrix.forget();
+}
+
+already_AddRefed<DOMMatrix>
+DOMMatrix::FromMatrix(const GlobalObject& aGlobal, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv)
+{
+ RefPtr<DOMMatrix> matrix =
+ FromMatrix(aGlobal.GetAsSupports(), aMatrixInit, aRv);
+ return matrix.forget();
+}
+
+already_AddRefed<DOMMatrix>
+DOMMatrix::FromFloat32Array(const GlobalObject& aGlobal, const Float32Array& aArray32, ErrorResult& aRv)
+{
+ aArray32.ComputeLengthAndData();
+
+ const int length = aArray32.Length();
+ const bool is2D = length == 6;
+ RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports(), is2D);
+ SetDataInMatrix(obj, aArray32.Data(), length, aRv);
+
+ return obj.forget();
+}
+
+already_AddRefed<DOMMatrix>
+DOMMatrix::FromFloat64Array(const GlobalObject& aGlobal, const Float64Array& aArray64, ErrorResult& aRv)
+{
+ aArray64.ComputeLengthAndData();
+
+ const int length = aArray64.Length();
+ const bool is2D = length == 6;
+ RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports(), is2D);
+ SetDataInMatrix(obj, aArray64.Data(), length, aRv);
+
+ return obj.forget();
+}
+
already_AddRefed<DOMMatrix>
DOMMatrix::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv)
{
@@ -317,6 +638,11 @@ DOMMatrix::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv)
already_AddRefed<DOMMatrix>
DOMMatrix::Constructor(const GlobalObject& aGlobal, const nsAString& aTransformList, ErrorResult& aRv)
{
+ nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!win) {
+ aRv.ThrowTypeError<MSG_ILLEGAL_CONSTRUCTOR>();
+ return nullptr;
+ }
RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports());
obj = obj->SetMatrixValue(aTransformList, aRv);
@@ -330,7 +656,9 @@ DOMMatrix::Constructor(const GlobalObject& aGlobal, const DOMMatrixReadOnly& aOt
return obj.forget();
}
-template <typename T> void SetDataInMatrix(DOMMatrix* aMatrix, const T* aData, int aLength, ErrorResult& aRv)
+template <typename T>
+static void
+SetDataInMatrix(DOMMatrixReadOnly* aMatrix, const T* aData, int aLength, ErrorResult& aRv)
{
if (aLength == 16) {
aMatrix->SetM11(aData[0]);
@@ -357,28 +685,22 @@ template <typename T> void SetDataInMatrix(DOMMatrix* aMatrix, const T* aData, i
aMatrix->SetE(aData[4]);
aMatrix->SetF(aData[5]);
} else {
- aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ nsAutoString lengthStr;
+ lengthStr.AppendInt(aLength);
+ aRv.ThrowTypeError<MSG_MATRIX_INIT_LENGTH_WRONG>(lengthStr);
}
}
already_AddRefed<DOMMatrix>
DOMMatrix::Constructor(const GlobalObject& aGlobal, const Float32Array& aArray32, ErrorResult& aRv)
{
- RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports());
- aArray32.ComputeLengthAndData();
- SetDataInMatrix(obj, aArray32.Data(), aArray32.Length(), aRv);
-
- return obj.forget();
+ return FromFloat32Array(aGlobal, aArray32, aRv);
}
already_AddRefed<DOMMatrix>
DOMMatrix::Constructor(const GlobalObject& aGlobal, const Float64Array& aArray64, ErrorResult& aRv)
{
- RefPtr<DOMMatrix> obj = new DOMMatrix(aGlobal.GetAsSupports());
- aArray64.ComputeLengthAndData();
- SetDataInMatrix(obj, aArray64.Data(), aArray64.Length(), aRv);
-
- return obj.forget();
+ return FromFloat64Array(aGlobal, aArray64, aRv);
}
already_AddRefed<DOMMatrix>
@@ -390,7 +712,26 @@ DOMMatrix::Constructor(const GlobalObject& aGlobal, const Sequence<double>& aNum
return obj.forget();
}
-void DOMMatrix::Ensure3DMatrix()
+already_AddRefed<DOMMatrix>
+DOMMatrix::ReadStructuredClone(nsISupports* aParent, JSStructuredCloneReader* aReader)
+{
+ uint8_t is2D;
+
+ if (!JS_ReadBytes(aReader, &is2D, 1)) {
+ return nullptr;
+ }
+
+ RefPtr<DOMMatrix> rval = new DOMMatrix(aParent, is2D);
+
+ if (!ReadStructuredCloneElements(aReader, rval)) {
+ return nullptr;
+ };
+
+ return rval.forget();
+}
+
+void
+DOMMatrixReadOnly::Ensure3DMatrix()
{
if (!mMatrix3D) {
mMatrix3D = new gfx::Matrix4x4(gfx::Matrix4x4::From2D(*mMatrix2D));
@@ -399,42 +740,44 @@ void DOMMatrix::Ensure3DMatrix()
}
DOMMatrix*
-DOMMatrix::MultiplySelf(const DOMMatrix& aOther)
+DOMMatrix::MultiplySelf(const DOMMatrixInit& aOtherInit, ErrorResult& aRv)
{
- if (aOther.Identity()) {
+ RefPtr<DOMMatrix> other = FromMatrix(mParent, aOtherInit, aRv);
+ if (other->Identity()) {
return this;
}
- if (aOther.Is2D()) {
+ if (other->Is2D()) {
if (mMatrix3D) {
- *mMatrix3D = gfx::Matrix4x4::From2D(*aOther.mMatrix2D) * *mMatrix3D;
+ *mMatrix3D = gfx::Matrix4x4::From2D(*other->mMatrix2D) * *mMatrix3D;
} else {
- *mMatrix2D = *aOther.mMatrix2D * *mMatrix2D;
+ *mMatrix2D = *other->mMatrix2D * *mMatrix2D;
}
} else {
Ensure3DMatrix();
- *mMatrix3D = *aOther.mMatrix3D * *mMatrix3D;
+ *mMatrix3D = *other->mMatrix3D * *mMatrix3D;
}
return this;
}
DOMMatrix*
-DOMMatrix::PreMultiplySelf(const DOMMatrix& aOther)
+DOMMatrix::PreMultiplySelf(const DOMMatrixInit& aOtherInit, ErrorResult& aRv)
{
- if (aOther.Identity()) {
+ RefPtr<DOMMatrix> other = FromMatrix(mParent, aOtherInit, aRv);
+ if (other->Identity()) {
return this;
}
- if (aOther.Is2D()) {
+ if (other->Is2D()) {
if (mMatrix3D) {
- *mMatrix3D = *mMatrix3D * gfx::Matrix4x4::From2D(*aOther.mMatrix2D);
+ *mMatrix3D = *mMatrix3D * gfx::Matrix4x4::From2D(*other->mMatrix2D);
} else {
- *mMatrix2D = *mMatrix2D * *aOther.mMatrix2D;
+ *mMatrix2D = *mMatrix2D * *other->mMatrix2D;
}
} else {
Ensure3DMatrix();
- *mMatrix3D = *mMatrix3D * *aOther.mMatrix3D;
+ *mMatrix3D = *mMatrix3D * *other->mMatrix3D;
}
return this;
@@ -617,8 +960,8 @@ DOMMatrix::InvertSelf()
return this;
}
-DOMMatrix*
-DOMMatrix::SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv)
+DOMMatrixReadOnly*
+DOMMatrixReadOnly::SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv)
{
SVGTransformListParser parser(aTransformList);
if (!parser.Parse()) {
@@ -644,6 +987,13 @@ DOMMatrix::SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv)
return this;
}
+DOMMatrix*
+DOMMatrix::SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv)
+{
+ DOMMatrixReadOnly::SetMatrixValue(aTransformList, aRv);
+ return this;
+}
+
JSObject*
DOMMatrix::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
diff --git a/dom/base/DOMMatrix.h b/dom/base/DOMMatrix.h
index a9c52fa8c3..99e7714add 100644
--- a/dom/base/DOMMatrix.h
+++ b/dom/base/DOMMatrix.h
@@ -6,6 +6,7 @@
#ifndef MOZILLA_DOM_DOMMATRIX_H_
#define MOZILLA_DOM_DOMMATRIX_H_
+#include "js/StructuredClone.h"
#include "nsWrapperCache.h"
#include "nsISupports.h"
#include "nsCycleCollectionParticipant.h"
@@ -22,7 +23,9 @@ namespace dom {
class GlobalObject;
class DOMMatrix;
class DOMPoint;
+class StringOrUnrestrictedDoubleSequence;
struct DOMPointInit;
+struct DOMMatrixInit;
class DOMMatrixReadOnly : public nsWrapperCache
{
@@ -42,9 +45,36 @@ public:
}
}
+ DOMMatrixReadOnly(nsISupports* aParent, const gfx::Matrix4x4& aMatrix)
+ : mParent(aParent)
+ {
+ mMatrix3D = new gfx::Matrix4x4(aMatrix);
+ }
+
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(DOMMatrixReadOnly)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(DOMMatrixReadOnly)
+ nsISupports* GetParentObject() const { return mParent; }
+ virtual JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto) override;
+
+ static already_AddRefed<DOMMatrixReadOnly>
+ FromMatrix(const GlobalObject& aGlobal, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv);
+
+ static already_AddRefed<DOMMatrixReadOnly>
+ FromFloat32Array(const GlobalObject& aGlobal, const Float32Array& aArray32, ErrorResult& aRv);
+
+ static already_AddRefed<DOMMatrixReadOnly>
+ FromFloat64Array(const GlobalObject& aGlobal, const Float64Array& aArray64, ErrorResult& aRv);
+
+ static already_AddRefed<DOMMatrixReadOnly>
+ Constructor(const GlobalObject& aGlobal, const Optional<StringOrUnrestrictedDoubleSequence>& aArg, ErrorResult& aRv);
+
+ static already_AddRefed<DOMMatrixReadOnly>
+ ReadStructuredClone(nsISupports* aParent, JSStructuredCloneReader* aReader);
+
+ static bool
+ ReadStructuredCloneElements(JSStructuredCloneReader* aReader, DOMMatrixReadOnly* matrix);
+
#define GetMatrixMember(entry2D, entry3D, default) \
{ \
if (mMatrix3D) { \
@@ -88,6 +118,51 @@ public:
#undef GetMatrixMember
#undef Get3DMatrixMember
+ // Defined here so we can construct DOMMatrixReadOnly objects.
+#define Set2DMatrixMember(entry2D, entry3D) \
+{ \
+ if (mMatrix3D) { \
+ mMatrix3D->entry3D = v; \
+ } else { \
+ mMatrix2D->entry2D = v; \
+ } \
+}
+
+#define Set3DMatrixMember(entry3D, default) \
+{ \
+ if (mMatrix3D || (v != default)) { \
+ Ensure3DMatrix(); \
+ mMatrix3D->entry3D = v; \
+ } \
+}
+
+ void SetA(double v) Set2DMatrixMember(_11, _11)
+ void SetB(double v) Set2DMatrixMember(_12, _12)
+ void SetC(double v) Set2DMatrixMember(_21, _21)
+ void SetD(double v) Set2DMatrixMember(_22, _22)
+ void SetE(double v) Set2DMatrixMember(_31, _41)
+ void SetF(double v) Set2DMatrixMember(_32, _42)
+
+ void SetM11(double v) Set2DMatrixMember(_11, _11)
+ void SetM12(double v) Set2DMatrixMember(_12, _12)
+ void SetM13(double v) Set3DMatrixMember(_13, 0)
+ void SetM14(double v) Set3DMatrixMember(_14, 0)
+ void SetM21(double v) Set2DMatrixMember(_21, _21)
+ void SetM22(double v) Set2DMatrixMember(_22, _22)
+ void SetM23(double v) Set3DMatrixMember(_23, 0)
+ void SetM24(double v) Set3DMatrixMember(_24, 0)
+ void SetM31(double v) Set3DMatrixMember(_31, 0)
+ void SetM32(double v) Set3DMatrixMember(_32, 0)
+ void SetM33(double v) Set3DMatrixMember(_33, 1.0)
+ void SetM34(double v) Set3DMatrixMember(_34, 0)
+ void SetM41(double v) Set2DMatrixMember(_31, _41)
+ void SetM42(double v) Set2DMatrixMember(_32, _42)
+ void SetM43(double v) Set3DMatrixMember(_43, 0)
+ void SetM44(double v) Set3DMatrixMember(_44, 1.0)
+
+#undef Set2DMatrixMember
+#undef Set3DMatrixMember
+
already_AddRefed<DOMMatrix> Translate(double aTx,
double aTy,
double aTz = 0) const;
@@ -115,7 +190,8 @@ public:
double aAngle) const;
already_AddRefed<DOMMatrix> SkewX(double aSx) const;
already_AddRefed<DOMMatrix> SkewY(double aSy) const;
- already_AddRefed<DOMMatrix> Multiply(const DOMMatrix& aOther) const;
+ already_AddRefed<DOMMatrix> Multiply(const DOMMatrixInit& aOther,
+ ErrorResult& aRv) const;
already_AddRefed<DOMMatrix> FlipX() const;
already_AddRefed<DOMMatrix> FlipY() const;
already_AddRefed<DOMMatrix> Inverse() const;
@@ -130,6 +206,8 @@ public:
JS::MutableHandle<JSObject*> aResult,
ErrorResult& aRv) const;
void Stringify(nsAString& aResult);
+ bool WriteStructuredClone(JSStructuredCloneWriter* aWriter) const;
+
protected:
nsCOMPtr<nsISupports> mParent;
nsAutoPtr<gfx::Matrix> mMatrix2D;
@@ -137,6 +215,24 @@ protected:
virtual ~DOMMatrixReadOnly() {}
+ /**
+ * Sets data from a fully validated and fixed-up matrix init,
+ * where all of its members are properly defined.
+ * The init dictionary's dimension must match the matrix one.
+ */
+ void SetDataFromMatrixInit(DOMMatrixInit& aMatrixInit);
+
+ DOMMatrixReadOnly* SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv);
+ void Ensure3DMatrix();
+
+ DOMMatrixReadOnly(nsISupports* aParent, bool is2D) : mParent(aParent) {
+ if (is2D) {
+ mMatrix2D = new gfx::Matrix();
+ } else {
+ mMatrix3D = new gfx::Matrix4x4();
+ }
+ }
+
private:
DOMMatrixReadOnly() = delete;
DOMMatrixReadOnly(const DOMMatrixReadOnly&) = delete;
@@ -154,6 +250,21 @@ public:
: DOMMatrixReadOnly(aParent, other)
{}
+ DOMMatrix(nsISupports* aParent, const gfx::Matrix4x4& aMatrix)
+ : DOMMatrixReadOnly(aParent, aMatrix)
+ {}
+
+ static already_AddRefed<DOMMatrix>
+ FromMatrix(nsISupports* aParent, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv);
+ static already_AddRefed<DOMMatrix>
+ FromMatrix(const GlobalObject& aGlobal, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv);
+
+ static already_AddRefed<DOMMatrix>
+ FromFloat32Array(const GlobalObject& aGlobal, const Float32Array& aArray32, ErrorResult& aRv);
+
+ static already_AddRefed<DOMMatrix>
+ FromFloat64Array(const GlobalObject& aGlobal, const Float64Array& aArray64, ErrorResult& aRv);
+
static already_AddRefed<DOMMatrix>
Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
static already_AddRefed<DOMMatrix>
@@ -167,55 +278,13 @@ public:
static already_AddRefed<DOMMatrix>
Constructor(const GlobalObject& aGlobal, const Sequence<double>& aNumberSequence, ErrorResult& aRv);
- nsISupports* GetParentObject() const { return mParent; }
- virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
-
-#define Set2DMatrixMember(entry2D, entry3D) \
-{ \
- if (mMatrix3D) { \
- mMatrix3D->entry3D = v; \
- } else { \
- mMatrix2D->entry2D = v; \
- } \
-}
-
-#define Set3DMatrixMember(entry3D, default) \
-{ \
- if (mMatrix3D || (v != default)) { \
- Ensure3DMatrix(); \
- mMatrix3D->entry3D = v; \
- } \
-}
-
- void SetA(double v) Set2DMatrixMember(_11, _11)
- void SetB(double v) Set2DMatrixMember(_12, _12)
- void SetC(double v) Set2DMatrixMember(_21, _21)
- void SetD(double v) Set2DMatrixMember(_22, _22)
- void SetE(double v) Set2DMatrixMember(_31, _41)
- void SetF(double v) Set2DMatrixMember(_32, _42)
-
- void SetM11(double v) Set2DMatrixMember(_11, _11)
- void SetM12(double v) Set2DMatrixMember(_12, _12)
- void SetM13(double v) Set3DMatrixMember(_13, 0)
- void SetM14(double v) Set3DMatrixMember(_14, 0)
- void SetM21(double v) Set2DMatrixMember(_21, _21)
- void SetM22(double v) Set2DMatrixMember(_22, _22)
- void SetM23(double v) Set3DMatrixMember(_23, 0)
- void SetM24(double v) Set3DMatrixMember(_24, 0)
- void SetM31(double v) Set3DMatrixMember(_31, 0)
- void SetM32(double v) Set3DMatrixMember(_32, 0)
- void SetM33(double v) Set3DMatrixMember(_33, 1.0)
- void SetM34(double v) Set3DMatrixMember(_34, 0)
- void SetM41(double v) Set2DMatrixMember(_31, _41)
- void SetM42(double v) Set2DMatrixMember(_32, _42)
- void SetM43(double v) Set3DMatrixMember(_43, 0)
- void SetM44(double v) Set3DMatrixMember(_44, 1.0)
+ static already_AddRefed<DOMMatrix>
+ ReadStructuredClone(nsISupports* aParent, JSStructuredCloneReader* aReader);
-#undef Set2DMatrixMember
-#undef Set3DMatrixMember
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
- DOMMatrix* MultiplySelf(const DOMMatrix& aOther);
- DOMMatrix* PreMultiplySelf(const DOMMatrix& aOther);
+ DOMMatrix* MultiplySelf(const DOMMatrixInit& aOther, ErrorResult& aRv);
+ DOMMatrix* PreMultiplySelf(const DOMMatrixInit& aOther, ErrorResult& aRv);
DOMMatrix* TranslateSelf(double aTx,
double aTy,
double aTz = 0);
@@ -245,10 +314,12 @@ public:
DOMMatrix* SkewYSelf(double aSy);
DOMMatrix* InvertSelf();
DOMMatrix* SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv);
-protected:
- void Ensure3DMatrix();
virtual ~DOMMatrix() {}
+
+ private:
+ DOMMatrix(nsISupports* aParent, bool is2D)
+ : DOMMatrixReadOnly(aParent, is2D) {}
};
} // namespace dom
diff --git a/dom/base/DOMPoint.cpp b/dom/base/DOMPoint.cpp
index 97eec9e766..7174a0cb1b 100644
--- a/dom/base/DOMPoint.cpp
+++ b/dom/base/DOMPoint.cpp
@@ -16,9 +16,68 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(DOMPointReadOnly, mParent)
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(DOMPointReadOnly, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(DOMPointReadOnly, Release)
+already_AddRefed<DOMPointReadOnly>
+DOMPointReadOnly::FromPoint(const GlobalObject& aGlobal, const DOMPointInit& aParams)
+{
+ RefPtr<DOMPointReadOnly> obj =
+ new DOMPointReadOnly(aGlobal.GetAsSupports(), aParams.mX, aParams.mY,
+ aParams.mZ, aParams.mW);
+ return obj.forget();
+}
+
+already_AddRefed<DOMPointReadOnly>
+DOMPointReadOnly::Constructor(const GlobalObject& aGlobal, double aX, double aY,
+ double aZ, double aW, ErrorResult& aRV)
+{
+ RefPtr<DOMPointReadOnly> obj =
+ new DOMPointReadOnly(aGlobal.GetAsSupports(), aX, aY, aZ, aW);
+ return obj.forget();
+}
+
+JSObject*
+DOMPointReadOnly::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return DOMPointReadOnlyBinding::Wrap(aCx, this, aGivenProto);
+}
+
+// https://drafts.fxtf.org/geometry/#structured-serialization
+bool
+DOMPointReadOnly::WriteStructuredClone(JSStructuredCloneWriter* aWriter) const
+{
+#define WriteDouble(d) \
+ JS_WriteUint32Pair(aWriter, (BitwiseCast<uint64_t>(d) >> 32) & 0xffffffff, \
+ BitwiseCast<uint64_t>(d) & 0xffffffff)
+
+ return WriteDouble(mX) && WriteDouble(mY) && WriteDouble(mZ) &&
+ WriteDouble(mW);
+
+#undef WriteDouble
+}
+
+bool
+DOMPointReadOnly::ReadStructuredClone(JSStructuredCloneReader* aReader)
+{
+ uint32_t high;
+ uint32_t low;
+
+#define ReadDouble(d) \
+ if (!JS_ReadUint32Pair(aReader, &high, &low)) { \
+ return false; \
+ } \
+ (*(d) = BitwiseCast<double>(static_cast<uint64_t>(high) << 32 | low))
+
+ ReadDouble(&mX);
+ ReadDouble(&mY);
+ ReadDouble(&mZ);
+ ReadDouble(&mW);
+
+ return true;
+
+#undef ReadDouble
+}
+
already_AddRefed<DOMPoint>
-DOMPoint::Constructor(const GlobalObject& aGlobal, const DOMPointInit& aParams,
- ErrorResult& aRV)
+DOMPoint::FromPoint(const GlobalObject& aGlobal, const DOMPointInit& aParams)
{
RefPtr<DOMPoint> obj =
new DOMPoint(aGlobal.GetAsSupports(), aParams.mX, aParams.mY,
diff --git a/dom/base/DOMPoint.h b/dom/base/DOMPoint.h
index 1a85982cc7..f460ea725c 100644
--- a/dom/base/DOMPoint.h
+++ b/dom/base/DOMPoint.h
@@ -6,6 +6,7 @@
#ifndef MOZILLA_DOMPOINT_H_
#define MOZILLA_DOMPOINT_H_
+#include "js/StructuredClone.h"
#include "nsWrapperCache.h"
#include "nsISupports.h"
#include "nsCycleCollectionParticipant.h"
@@ -23,8 +24,8 @@ struct DOMPointInit;
class DOMPointReadOnly : public nsWrapperCache
{
public:
- DOMPointReadOnly(nsISupports* aParent, double aX, double aY,
- double aZ, double aW)
+ explicit DOMPointReadOnly(nsISupports* aParent, double aX = 0.0,
+ double aY = 0.0, double aZ = 0.0, double aW = 1.0)
: mParent(aParent)
, mX(aX)
, mY(aY)
@@ -33,6 +34,12 @@ public:
{
}
+ static already_AddRefed<DOMPointReadOnly>
+ FromPoint(const GlobalObject& aGlobal, const DOMPointInit& aParams);
+ static already_AddRefed<DOMPointReadOnly>
+ Constructor(const GlobalObject& aGlobal, double aX, double aY,
+ double aZ, double aW, ErrorResult& aRV);
+
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(DOMPointReadOnly)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(DOMPointReadOnly)
@@ -41,6 +48,13 @@ public:
double Z() const { return mZ; }
double W() const { return mW; }
+ nsISupports* GetParentObject() const { return mParent; }
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ bool WriteStructuredClone(JSStructuredCloneWriter* aWriter) const;
+
+ bool ReadStructuredClone(JSStructuredCloneReader* aReader);
+
protected:
virtual ~DOMPointReadOnly() {}
@@ -57,13 +71,11 @@ public:
{}
static already_AddRefed<DOMPoint>
- Constructor(const GlobalObject& aGlobal, const DOMPointInit& aParams,
- ErrorResult& aRV);
+ FromPoint(const GlobalObject& aGlobal, const DOMPointInit& aParams);
static already_AddRefed<DOMPoint>
Constructor(const GlobalObject& aGlobal, double aX, double aY,
double aZ, double aW, ErrorResult& aRV);
- nsISupports* GetParentObject() const { return mParent; }
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
void SetX(double aX) { mX = aX; }
diff --git a/dom/base/DOMQuad.cpp b/dom/base/DOMQuad.cpp
index 9da70c043d..258bfc1bfd 100644
--- a/dom/base/DOMQuad.cpp
+++ b/dom/base/DOMQuad.cpp
@@ -44,6 +44,32 @@ DOMQuad::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
}
already_AddRefed<DOMQuad>
+DOMQuad::FromRect(const GlobalObject& aGlobal, const DOMRectInit& aInit)
+{
+ nsISupports* parent = aGlobal.GetAsSupports();
+ RefPtr<DOMQuad> obj = new DOMQuad(parent);
+ obj->mPoints[0] = new DOMPoint(parent, aInit.mX, aInit.mY, 0, 1);
+ obj->mPoints[1] =
+ new DOMPoint(parent, aInit.mX + aInit.mWidth, aInit.mY, 0, 1);
+ obj->mPoints[2] = new DOMPoint(parent, aInit.mX + aInit.mWidth,
+ aInit.mY + aInit.mHeight, 0, 1);
+ obj->mPoints[3] =
+ new DOMPoint(parent, aInit.mX, aInit.mY + aInit.mHeight, 0, 1);
+ return obj.forget();
+}
+
+already_AddRefed<DOMQuad>
+DOMQuad::FromQuad(const GlobalObject& aGlobal, const DOMQuadInit& aInit)
+{
+ RefPtr<DOMQuad> obj = new DOMQuad(aGlobal.GetAsSupports());
+ obj->mPoints[0] = DOMPoint::FromPoint(aGlobal, aInit.mP1);
+ obj->mPoints[1] = DOMPoint::FromPoint(aGlobal, aInit.mP2);
+ obj->mPoints[2] = DOMPoint::FromPoint(aGlobal, aInit.mP3);
+ obj->mPoints[3] = DOMPoint::FromPoint(aGlobal, aInit.mP4);
+ return obj.forget();
+}
+
+already_AddRefed<DOMQuad>
DOMQuad::Constructor(const GlobalObject& aGlobal,
const DOMPointInit& aP1,
const DOMPointInit& aP2,
@@ -52,10 +78,10 @@ DOMQuad::Constructor(const GlobalObject& aGlobal,
ErrorResult& aRV)
{
RefPtr<DOMQuad> obj = new DOMQuad(aGlobal.GetAsSupports());
- obj->mPoints[0] = DOMPoint::Constructor(aGlobal, aP1, aRV);
- obj->mPoints[1] = DOMPoint::Constructor(aGlobal, aP2, aRV);
- obj->mPoints[2] = DOMPoint::Constructor(aGlobal, aP3, aRV);
- obj->mPoints[3] = DOMPoint::Constructor(aGlobal, aP4, aRV);
+ obj->mPoints[0] = DOMPoint::FromPoint(aGlobal, aP1);
+ obj->mPoints[1] = DOMPoint::FromPoint(aGlobal, aP2);
+ obj->mPoints[2] = DOMPoint::FromPoint(aGlobal, aP3);
+ obj->mPoints[3] = DOMPoint::FromPoint(aGlobal, aP4);
return obj.forget();
}
@@ -73,87 +99,86 @@ DOMQuad::Constructor(const GlobalObject& aGlobal, const DOMRectReadOnly& aRect,
return obj.forget();
}
-class DOMQuad::QuadBounds final : public DOMRectReadOnly
+void
+DOMQuad::GetHorizontalMinMax(double* aX1, double* aX2) const
{
-public:
- explicit QuadBounds(DOMQuad* aQuad)
- : DOMRectReadOnly(aQuad->GetParentObject())
- , mQuad(aQuad)
- {}
-
- NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(QuadBounds, DOMRectReadOnly)
- NS_DECL_ISUPPORTS_INHERITED
-
- virtual double X() const override
- {
- double x1, x2;
- GetHorizontalMinMax(&x1, &x2);
- return x1;
- }
- virtual double Y() const override
- {
- double y1, y2;
- GetVerticalMinMax(&y1, &y2);
- return y1;
- }
- virtual double Width() const override
- {
- double x1, x2;
- GetHorizontalMinMax(&x1, &x2);
- return x2 - x1;
- }
- virtual double Height() const override
- {
- double y1, y2;
- GetVerticalMinMax(&y1, &y2);
- return y2 - y1;
+ double x1, x2;
+ x1 = x2 = Point(0)->X();
+ for (uint32_t i = 1; i < 4; ++i) {
+ double x = Point(i)->X();
+ x1 = std::min(x1, x);
+ x2 = std::max(x2, x);
}
+ *aX1 = x1;
+ *aX2 = x2;
+}
- void GetHorizontalMinMax(double* aX1, double* aX2) const
- {
- double x1, x2;
- x1 = x2 = mQuad->Point(0)->X();
- for (uint32_t i = 1; i < 4; ++i) {
- double x = mQuad->Point(i)->X();
- x1 = std::min(x1, x);
- x2 = std::max(x2, x);
- }
- *aX1 = x1;
- *aX2 = x2;
+void
+DOMQuad::GetVerticalMinMax(double* aY1, double* aY2) const
+{
+ double y1, y2;
+ y1 = y2 = Point(0)->Y();
+ for (uint32_t i = 1; i < 4; ++i) {
+ double y = Point(i)->Y();
+ y1 = std::min(y1, y);
+ y2 = std::max(y2, y);
}
+ *aY1 = y1;
+ *aY2 = y2;
+}
- void GetVerticalMinMax(double* aY1, double* aY2) const
- {
- double y1, y2;
- y1 = y2 = mQuad->Point(0)->Y();
- for (uint32_t i = 1; i < 4; ++i) {
- double y = mQuad->Point(i)->Y();
- y1 = std::min(y1, y);
- y2 = std::max(y2, y);
- }
- *aY1 = y1;
- *aY2 = y2;
+DOMRectReadOnly*
+DOMQuad::Bounds()
+{
+ if (!mBounds) {
+ mBounds = GetBounds();
}
+ return mBounds;
+}
-protected:
- virtual ~QuadBounds() {}
+already_AddRefed<DOMRectReadOnly>
+DOMQuad::GetBounds() const
+{
+ double x1, x2;
+ double y1, y2;
- RefPtr<DOMQuad> mQuad;
-};
+ GetHorizontalMinMax(&x1, &x2);
+ GetVerticalMinMax(&y1, &y2);
-NS_IMPL_CYCLE_COLLECTION_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly, mQuad)
+ RefPtr<DOMRectReadOnly> rval = new DOMRectReadOnly(GetParentObject(),
+ x1, y1, x2 - x1, y2 - y1);
+ return rval.forget();
+}
-NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMQuad::QuadBounds)
-NS_INTERFACE_MAP_END_INHERITING(DOMRectReadOnly)
+void
+DOMQuad::ToJSON(DOMQuadJSON& aInit)
+{
+ aInit.mP1.Construct(RefPtr<DOMPoint>(P1()).forget());
+ aInit.mP2.Construct(RefPtr<DOMPoint>(P2()).forget());
+ aInit.mP3.Construct(RefPtr<DOMPoint>(P3()).forget());
+ aInit.mP4.Construct(RefPtr<DOMPoint>(P4()).forget());
+}
-NS_IMPL_ADDREF_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly)
-NS_IMPL_RELEASE_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly)
+// https://drafts.fxtf.org/geometry/#structured-serialization
+bool
+DOMQuad::WriteStructuredClone(JSStructuredCloneWriter* aWriter) const
+{
+ for (const auto& point : mPoints) {
+ if (!point->WriteStructuredClone(aWriter)) {
+ return false;
+ }
+ }
+ return true;
+}
-DOMRectReadOnly*
-DOMQuad::Bounds() const
+bool
+DOMQuad::ReadStructuredClone(JSStructuredCloneReader* aReader)
{
- if (!mBounds) {
- mBounds = new QuadBounds(const_cast<DOMQuad*>(this));
+ for (auto& point : mPoints) {
+ point = new DOMPoint(mParent);
+ if (!point->ReadStructuredClone(aReader)) {
+ return false;
+ }
}
- return mBounds;
+ return true;
}
diff --git a/dom/base/DOMQuad.h b/dom/base/DOMQuad.h
index 89d258a106..e32aea26f8 100644
--- a/dom/base/DOMQuad.h
+++ b/dom/base/DOMQuad.h
@@ -6,6 +6,7 @@
#ifndef MOZILLA_DOMQUAD_H_
#define MOZILLA_DOMQUAD_H_
+#include "js/StructuredClone.h"
#include "nsWrapperCache.h"
#include "nsISupports.h"
#include "nsCycleCollectionParticipant.h"
@@ -20,7 +21,10 @@ namespace dom {
class DOMRectReadOnly;
class DOMPoint;
+struct DOMQuadJSON;
struct DOMPointInit;
+struct DOMQuadInit;
+struct DOMRectInit;
class DOMQuad final : public nsWrapperCache
{
@@ -37,6 +41,12 @@ public:
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
static already_AddRefed<DOMQuad>
+ FromRect(const GlobalObject& aGlobal, const DOMRectInit& aInit);
+
+ static already_AddRefed<DOMQuad>
+ FromQuad(const GlobalObject& aGlobal, const DOMQuadInit& aInit);
+
+ static already_AddRefed<DOMQuad>
Constructor(const GlobalObject& aGlobal,
const DOMPointInit& aP1,
const DOMPointInit& aP2,
@@ -47,20 +57,28 @@ public:
Constructor(const GlobalObject& aGlobal, const DOMRectReadOnly& aRect,
ErrorResult& aRV);
- DOMRectReadOnly* Bounds() const;
+ DOMRectReadOnly* Bounds();
+ already_AddRefed<DOMRectReadOnly> GetBounds() const;
DOMPoint* P1() const { return mPoints[0]; }
DOMPoint* P2() const { return mPoints[1]; }
DOMPoint* P3() const { return mPoints[2]; }
DOMPoint* P4() const { return mPoints[3]; }
- DOMPoint* Point(uint32_t aIndex) { return mPoints[aIndex]; }
+ DOMPoint* Point(uint32_t aIndex) const { return mPoints[aIndex]; }
+
+ void ToJSON(DOMQuadJSON& aInit);
+
+ bool WriteStructuredClone(JSStructuredCloneWriter* aWriter) const;
+
+ bool ReadStructuredClone(JSStructuredCloneReader* aReader);
protected:
- class QuadBounds;
+ void GetHorizontalMinMax(double* aX1, double* aX2) const;
+ void GetVerticalMinMax(double* aY1, double* aY2) const;
nsCOMPtr<nsISupports> mParent;
RefPtr<DOMPoint> mPoints[4];
- mutable RefPtr<QuadBounds> mBounds; // allocated lazily
+ RefPtr<DOMRectReadOnly> mBounds;
};
} // namespace dom
diff --git a/dom/base/DOMRect.cpp b/dom/base/DOMRect.cpp
index 3728ea7a7c..8dd634b547 100644
--- a/dom/base/DOMRect.cpp
+++ b/dom/base/DOMRect.cpp
@@ -27,6 +27,59 @@ DOMRectReadOnly::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
return DOMRectReadOnlyBinding::Wrap(aCx, this, aGivenProto);
}
+already_AddRefed<DOMRectReadOnly>
+DOMRectReadOnly::FromRect(const GlobalObject& aGlobal, const DOMRectInit& aInit)
+{
+ RefPtr<DOMRectReadOnly> obj = new DOMRectReadOnly(
+ aGlobal.GetAsSupports(), aInit.mX, aInit.mY, aInit.mWidth, aInit.mHeight);
+ return obj.forget();
+}
+
+already_AddRefed<DOMRectReadOnly>
+DOMRectReadOnly::Constructor(const GlobalObject& aGlobal, double aX, double aY,
+ double aWidth, double aHeight, ErrorResult& aRv)
+{
+ RefPtr<DOMRectReadOnly> obj =
+ new DOMRectReadOnly(aGlobal.GetAsSupports(), aX, aY, aWidth, aHeight);
+ return obj.forget();
+}
+
+// https://drafts.fxtf.org/geometry/#structured-serialization
+bool
+DOMRectReadOnly::WriteStructuredClone(JSStructuredCloneWriter* aWriter) const
+{
+#define WriteDouble(d) \
+ JS_WriteUint32Pair(aWriter, (BitwiseCast<uint64_t>(d) >> 32) & 0xffffffff, \
+ BitwiseCast<uint64_t>(d) & 0xffffffff)
+
+ return WriteDouble(mX) && WriteDouble(mY) && WriteDouble(mWidth) &&
+ WriteDouble(mHeight);
+
+#undef WriteDouble
+}
+
+bool
+DOMRectReadOnly::ReadStructuredClone(JSStructuredCloneReader* aReader)
+{
+ uint32_t high;
+ uint32_t low;
+
+#define ReadDouble(d) \
+ if (!JS_ReadUint32Pair(aReader, &high, &low)) { \
+ return false; \
+ } \
+ (*(d) = BitwiseCast<double>(static_cast<uint64_t>(high) << 32 | low))
+
+ ReadDouble(&mX);
+ ReadDouble(&mY);
+ ReadDouble(&mWidth);
+ ReadDouble(&mHeight);
+
+ return true;
+
+#undef ReadDouble
+}
+
// -----------------------------------------------------------------------------
NS_IMPL_ISUPPORTS_INHERITED(DOMRect, DOMRectReadOnly, nsIDOMClientRect)
@@ -54,16 +107,16 @@ DOMRect::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
}
already_AddRefed<DOMRect>
-DOMRect::Constructor(const GlobalObject& aGlobal, ErrorResult& aRV)
+DOMRect::FromRect(const GlobalObject& aGlobal, const DOMRectInit& aInit)
{
- RefPtr<DOMRect> obj =
- new DOMRect(aGlobal.GetAsSupports(), 0.0, 0.0, 0.0, 0.0);
+ RefPtr<DOMRect> obj = new DOMRect(aGlobal.GetAsSupports(), aInit.mX, aInit.mY,
+ aInit.mWidth, aInit.mHeight);
return obj.forget();
}
already_AddRefed<DOMRect>
DOMRect::Constructor(const GlobalObject& aGlobal, double aX, double aY,
- double aWidth, double aHeight, ErrorResult& aRV)
+ double aWidth, double aHeight, ErrorResult& aRv)
{
RefPtr<DOMRect> obj =
new DOMRect(aGlobal.GetAsSupports(), aX, aY, aWidth, aHeight);
diff --git a/dom/base/DOMRect.h b/dom/base/DOMRect.h
index da3162be0c..541ff02539 100644
--- a/dom/base/DOMRect.h
+++ b/dom/base/DOMRect.h
@@ -6,6 +6,7 @@
#ifndef MOZILLA_DOMRECT_H_
#define MOZILLA_DOMRECT_H_
+#include "js/StructuredClone.h"
#include "nsIDOMClientRect.h"
#include "nsIDOMClientRectList.h"
#include "nsTArray.h"
@@ -22,6 +23,8 @@ struct nsRect;
namespace mozilla {
namespace dom {
+struct DOMRectInit;
+
class DOMRectReadOnly : public nsISupports
, public nsWrapperCache
{
@@ -32,8 +35,13 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMRectReadOnly)
- explicit DOMRectReadOnly(nsISupports* aParent)
+ explicit DOMRectReadOnly(nsISupports* aParent, double aX = 0, double aY = 0,
+ double aWidth = 0, double aHeight = 0)
: mParent(aParent)
+ , mX(aX)
+ , mY(aY)
+ , mWidth(aWidth)
+ , mHeight(aHeight)
{
}
@@ -44,10 +52,29 @@ public:
}
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
- virtual double X() const = 0;
- virtual double Y() const = 0;
- virtual double Width() const = 0;
- virtual double Height() const = 0;
+ static already_AddRefed<DOMRectReadOnly>
+ FromRect(const GlobalObject& aGlobal, const DOMRectInit& aInit);
+
+ static already_AddRefed<DOMRectReadOnly>
+ Constructor(const GlobalObject& aGlobal, double aX, double aY,
+ double aWidth, double aHeight, ErrorResult& aRv);
+
+ double X() const
+ {
+ return mX;
+ }
+ double Y() const
+ {
+ return mY;
+ }
+ double Width() const
+ {
+ return mWidth;
+ }
+ double Height() const
+ {
+ return mHeight;
+ }
double Left() const
{
@@ -70,8 +97,13 @@ public:
return std::max(y, y + h);
}
+ bool WriteStructuredClone(JSStructuredCloneWriter* aWriter) const;
+
+ bool ReadStructuredClone(JSStructuredCloneReader* aReader);
+
protected:
nsCOMPtr<nsISupports> mParent;
+ double mX, mY, mWidth, mHeight;
};
class DOMRect final : public DOMRectReadOnly
@@ -80,22 +112,19 @@ class DOMRect final : public DOMRectReadOnly
public:
explicit DOMRect(nsISupports* aParent, double aX = 0, double aY = 0,
double aWidth = 0, double aHeight = 0)
- : DOMRectReadOnly(aParent)
- , mX(aX)
- , mY(aY)
- , mWidth(aWidth)
- , mHeight(aHeight)
+ : DOMRectReadOnly(aParent, aX, aY, aWidth, aHeight)
{
}
-
+
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIDOMCLIENTRECT
static already_AddRefed<DOMRect>
- Constructor(const GlobalObject& aGlobal, ErrorResult& aRV);
+ FromRect(const GlobalObject& aGlobal, const DOMRectInit& aInit);
+
static already_AddRefed<DOMRect>
Constructor(const GlobalObject& aGlobal, double aX, double aY,
- double aWidth, double aHeight, ErrorResult& aRV);
+ double aWidth, double aHeight, ErrorResult& aRv);
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
@@ -104,23 +133,6 @@ public:
}
void SetLayoutRect(const nsRect& aLayoutRect);
- virtual double X() const override
- {
- return mX;
- }
- virtual double Y() const override
- {
- return mY;
- }
- virtual double Width() const override
- {
- return mWidth;
- }
- virtual double Height() const override
- {
- return mHeight;
- }
-
void SetX(double aX)
{
mX = aX;
@@ -138,11 +150,8 @@ public:
mHeight = aHeight;
}
-protected:
- double mX, mY, mWidth, mHeight;
-
private:
- ~DOMRect() {};
+ ~DOMRect() {}
};
class DOMRectList final : public nsIDOMClientRectList,
diff --git a/dom/base/StructuredCloneHolder.cpp b/dom/base/StructuredCloneHolder.cpp
index 5ad8ebb688..71eab63138 100644
--- a/dom/base/StructuredCloneHolder.cpp
+++ b/dom/base/StructuredCloneHolder.cpp
@@ -11,6 +11,14 @@
#include "mozilla/dom/CryptoKey.h"
#include "mozilla/dom/Directory.h"
#include "mozilla/dom/DirectoryBinding.h"
+#include "mozilla/dom/DOMMatrix.h"
+#include "mozilla/dom/DOMMatrixBinding.h"
+#include "mozilla/dom/DOMPoint.h"
+#include "mozilla/dom/DOMPointBinding.h"
+#include "mozilla/dom/DOMQuad.h"
+#include "mozilla/dom/DOMQuadBinding.h"
+#include "mozilla/dom/DOMRect.h"
+#include "mozilla/dom/DOMRectBinding.h"
#include "mozilla/dom/File.h"
#include "mozilla/dom/FileList.h"
#include "mozilla/dom/FileListBinding.h"
@@ -355,7 +363,11 @@ StructuredCloneHolder::ReadFullySerializableObjects(JSContext* aCx,
return ReadStructuredCloneImageData(aCx, aReader);
}
- if (aTag == SCTAG_DOM_WEBCRYPTO_KEY || aTag == SCTAG_DOM_URLSEARCHPARAMS) {
+ if (aTag == SCTAG_DOM_WEBCRYPTO_KEY || aTag == SCTAG_DOM_URLSEARCHPARAMS ||
+ aTag == SCTAG_DOM_DOMPOINT || aTag == SCTAG_DOM_DOMPOINT_READONLY ||
+ aTag == SCTAG_DOM_DOMRECT || aTag == SCTAG_DOM_DOMRECT_READONLY ||
+ aTag == SCTAG_DOM_DOMQUAD || aTag == SCTAG_DOM_DOMMATRIX ||
+ aTag == SCTAG_DOM_DOMMATRIX_READONLY) {
nsIGlobalObject *global = xpc::NativeGlobal(JS::CurrentGlobalOrNull(aCx));
if (!global) {
return nullptr;
@@ -378,6 +390,57 @@ StructuredCloneHolder::ReadFullySerializableObjects(JSContext* aCx,
} else {
result = usp->WrapObject(aCx, nullptr);
}
+ } else if (aTag == SCTAG_DOM_DOMPOINT) {
+ RefPtr<DOMPoint> domPoint = new DOMPoint(global);
+ if (!domPoint->ReadStructuredClone(aReader)) {
+ result = nullptr;
+ } else {
+ result = domPoint->WrapObject(aCx, nullptr);
+ }
+ } else if (aTag == SCTAG_DOM_DOMPOINT_READONLY) {
+ RefPtr<DOMPointReadOnly> domPoint = new DOMPointReadOnly(global);
+ if (!domPoint->ReadStructuredClone(aReader)) {
+ result = nullptr;
+ } else {
+ result = domPoint->WrapObject(aCx, nullptr);
+ }
+ } else if (aTag == SCTAG_DOM_DOMRECT) {
+ RefPtr<DOMRect> domRect = new DOMRect(global);
+ if (!domRect->ReadStructuredClone(aReader)) {
+ result = nullptr;
+ } else {
+ result = domRect->WrapObject(aCx, nullptr);
+ }
+ } else if (aTag == SCTAG_DOM_DOMRECT_READONLY) {
+ RefPtr<DOMRectReadOnly> domRect = new DOMRectReadOnly(global);
+ if (!domRect->ReadStructuredClone(aReader)) {
+ result = nullptr;
+ } else {
+ result = domRect->WrapObject(aCx, nullptr);
+ }
+ } else if (aTag == SCTAG_DOM_DOMQUAD) {
+ RefPtr<DOMQuad> domQuad = new DOMQuad(global);
+ if (!domQuad->ReadStructuredClone(aReader)) {
+ result = nullptr;
+ } else {
+ result = domQuad->WrapObject(aCx, nullptr);
+ }
+ } else if (aTag == SCTAG_DOM_DOMMATRIX) {
+ RefPtr<DOMMatrix> domMatrix =
+ DOMMatrix::ReadStructuredClone(global, aReader);
+ if (!domMatrix) {
+ result = nullptr;
+ } else {
+ result = domMatrix->WrapObject(aCx, nullptr);
+ }
+ } else if (aTag == SCTAG_DOM_DOMMATRIX_READONLY) {
+ RefPtr<DOMMatrixReadOnly> domMatrix =
+ DOMMatrixReadOnly::ReadStructuredClone(global, aReader);
+ if (!domMatrix) {
+ result = nullptr;
+ } else {
+ result = domMatrix->WrapObject(aCx, nullptr);
+ }
}
}
return result;
@@ -483,6 +546,75 @@ StructuredCloneHolder::WriteFullySerializableObjects(JSContext* aCx,
}
#endif
+ // Handle DOMPoint cloning
+ // Should be done before DOMPointeReadOnly check
+ // because every DOMPoint is also a DOMPointReadOnly
+ {
+ DOMPoint* domPoint = nullptr;
+ if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMPoint, &obj, domPoint))) {
+ return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMPOINT, 0) &&
+ domPoint->WriteStructuredClone(aWriter);
+ }
+ }
+
+ // Handle DOMPointReadOnly cloning
+ {
+ DOMPointReadOnly* domPoint = nullptr;
+ if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMPointReadOnly, &obj, domPoint))) {
+ return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMPOINT_READONLY, 0) &&
+ domPoint->WriteStructuredClone(aWriter);
+ }
+ }
+
+ // Handle DOMRect cloning
+ // Should be done before DOMRecteReadOnly check
+ // because every DOMRect is also a DOMRectReadOnly
+ {
+ DOMRect* domRect = nullptr;
+ if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMRect, &obj, domRect))) {
+ return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMRECT, 0) &&
+ domRect->WriteStructuredClone(aWriter);
+ }
+ }
+
+ // Handle DOMRectReadOnly cloning
+ {
+ DOMRectReadOnly* domRect = nullptr;
+ if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMRectReadOnly, &obj, domRect))) {
+ return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMRECT_READONLY, 0) &&
+ domRect->WriteStructuredClone(aWriter);
+ }
+ }
+
+ // Handle DOMQuad cloning
+ {
+ DOMQuad* domQuad = nullptr;
+ if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMQuad, &obj, domQuad))) {
+ return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMQUAD, 0) &&
+ domQuad->WriteStructuredClone(aWriter);
+ }
+ }
+
+ // Handle DOMMatrix cloning
+ // Should be done before DOMMatrixeReadOnly check
+ // because every DOMMatrix is also a DOMMatrixReadOnly
+ {
+ DOMMatrix* domMatrix = nullptr;
+ if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMMatrix, &obj, domMatrix))) {
+ return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMMATRIX, 0) &&
+ domMatrix->WriteStructuredClone(aWriter);
+ }
+ }
+
+ // Handle DOMMatrixReadOnly cloning
+ {
+ DOMMatrixReadOnly* domMatrix = nullptr;
+ if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMMatrixReadOnly, &obj, domMatrix))) {
+ return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMMATRIX_READONLY, 0) &&
+ domMatrix->WriteStructuredClone(aWriter);
+ }
+ }
+
if (NS_IsMainThread() && xpc::IsReflector(obj)) {
nsCOMPtr<nsISupports> base = xpc::UnwrapReflectorToISupports(obj);
nsCOMPtr<nsIPrincipal> principal = do_QueryInterface(base);
diff --git a/dom/base/StructuredCloneTags.h b/dom/base/StructuredCloneTags.h
index 8766d8e4ad..09b91f7afb 100644
--- a/dom/base/StructuredCloneTags.h
+++ b/dom/base/StructuredCloneTags.h
@@ -30,6 +30,15 @@ enum StructuredCloneTags {
// New IDB tags go here!
+ // Tags for Geometry interfaces.
+ SCTAG_DOM_DOMPOINT,
+ SCTAG_DOM_DOMPOINT_READONLY,
+ SCTAG_DOM_DOMQUAD,
+ SCTAG_DOM_DOMRECT,
+ SCTAG_DOM_DOMRECT_READONLY,
+ SCTAG_DOM_DOMMATRIX,
+ SCTAG_DOM_DOMMATRIX_READONLY,
+
// These tags are used for both main thread and workers.
SCTAG_DOM_IMAGEDATA,
SCTAG_DOM_MAP_MESSAGEPORT,
diff --git a/dom/base/WebKitCSSMatrix.cpp b/dom/base/WebKitCSSMatrix.cpp
index fe26b74554..15ca6ba776 100644
--- a/dom/base/WebKitCSSMatrix.cpp
+++ b/dom/base/WebKitCSSMatrix.cpp
@@ -20,8 +20,7 @@ static const double sRadPerDegree = 2.0 * M_PI / 360.0;
bool
WebKitCSSMatrix::FeatureEnabled(JSContext* aCx, JSObject* aObj)
{
- return Preferences::GetBool("layout.css.DOMMatrix.enabled", false) &&
- Preferences::GetBool("layout.css.prefixes.webkit", false);
+ return Preferences::GetBool("layout.css.prefixes.webkit", false);
}
already_AddRefed<WebKitCSSMatrix>
@@ -115,10 +114,10 @@ WebKitCSSMatrix::SetMatrixValue(const nsAString& aTransformList,
}
already_AddRefed<WebKitCSSMatrix>
-WebKitCSSMatrix::Multiply(const WebKitCSSMatrix& other) const
+WebKitCSSMatrix::Multiply(const DOMMatrixInit& aOtherInit, ErrorResult& aRv) const
{
RefPtr<WebKitCSSMatrix> retval = new WebKitCSSMatrix(mParent, *this);
- retval->MultiplySelf(other);
+ retval->MultiplySelf(aOtherInit, aRv);
return retval.forget();
}
diff --git a/dom/base/WebKitCSSMatrix.h b/dom/base/WebKitCSSMatrix.h
index e50c617260..590548b767 100644
--- a/dom/base/WebKitCSSMatrix.h
+++ b/dom/base/WebKitCSSMatrix.h
@@ -40,7 +40,8 @@ public:
WebKitCSSMatrix* SetMatrixValue(const nsAString& aTransformList,
ErrorResult& aRv);
- already_AddRefed<WebKitCSSMatrix> Multiply(const WebKitCSSMatrix& aOther) const;
+ already_AddRefed<WebKitCSSMatrix> Multiply(const DOMMatrixInit& aOtherInit,
+ ErrorResult& aRv) const;
already_AddRefed<WebKitCSSMatrix> Inverse(ErrorResult& aRv) const;
already_AddRefed<WebKitCSSMatrix> Translate(double aTx,
double aTy,
diff --git a/dom/base/nsDeprecatedOperationList.h b/dom/base/nsDeprecatedOperationList.h
index 0bae2d6211..bb9d8fd3b1 100644
--- a/dom/base/nsDeprecatedOperationList.h
+++ b/dom/base/nsDeprecatedOperationList.h
@@ -47,3 +47,4 @@ DEPRECATED_OPERATION(PrefixedFullscreenAPI)
DEPRECATED_OPERATION(LenientSetter)
DEPRECATED_OPERATION(FileLastModifiedDate)
DEPRECATED_OPERATION(ImageBitmapRenderingContext_TransferImageBitmap)
+DEPRECATED_OPERATION(DOMQuadBoundsAttr)
diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf
index 8b13babdbb..a12a294766 100644
--- a/dom/bindings/Bindings.conf
+++ b/dom/bindings/Bindings.conf
@@ -236,12 +236,10 @@ DOMInterfaces = {
'DOMMatrixReadOnly': {
'headerFile': 'mozilla/dom/DOMMatrix.h',
- 'concrete': False,
},
'DOMPointReadOnly': {
'headerFile': 'mozilla/dom/DOMPoint.h',
- 'concrete': False,
},
'DOMRectList': {
diff --git a/dom/bindings/Errors.msg b/dom/bindings/Errors.msg
index c894c6c7b4..d22ef2c27f 100644
--- a/dom/bindings/Errors.msg
+++ b/dom/bindings/Errors.msg
@@ -100,6 +100,9 @@ MSG_DEF(MSG_TIME_VALUE_OUT_OF_RANGE, 1, JSEXN_TYPEERR, "{0} is outside the suppo
MSG_DEF(MSG_ONLY_IF_CACHED_WITHOUT_SAME_ORIGIN, 1, JSEXN_TYPEERR, "Request mode '{0}' was used, but request cache mode 'only-if-cached' can only be used with request mode 'same-origin'.")
MSG_DEF(MSG_THRESHOLD_RANGE_ERROR, 0, JSEXN_RANGEERR, "Threshold values must all be in the range [0, 1].")
MSG_DEF(MSG_CACHE_OPEN_FAILED, 0, JSEXN_TYPEERR, "CacheStorage.open() failed to access the storage system.")
+MSG_DEF(MSG_MATRIX_INIT_CONFLICTING_VALUE, 2, JSEXN_TYPEERR, "Matrix init unexpectedly got different values for '{0}' and '{1}'.")
+MSG_DEF(MSG_MATRIX_INIT_EXCEEDS_2D, 1, JSEXN_TYPEERR, "Matrix init has an unexpected 3D element '{0}' which cannot coexist with 'is2D: true'.")
+MSG_DEF(MSG_MATRIX_INIT_LENGTH_WRONG, 1, JSEXN_TYPEERR, "Matrix init sequence must have a length of 6 or 16 (actual value: {0})")
MSG_DEF(MSG_NO_NEGATIVE_ATTR, 1, JSEXN_TYPEERR, "Given attribute {0} cannot be negative.")
MSG_DEF(MSG_PMO_NO_SEPARATE_ENDMARK, 0, JSEXN_TYPEERR, "Cannot provide separate endMark argument if PerformanceMeasureOptions argument is given.")
MSG_DEF(MSG_PMO_MISSING_STARTENDMARK, 0, JSEXN_TYPEERR, "PerformanceMeasureOptions must have start and/or end member.")
diff --git a/dom/filesystem/GetDirectoryListingTask.cpp b/dom/filesystem/GetDirectoryListingTask.cpp
index 1d4f77b3b8..8fdfb4a5bb 100644
--- a/dom/filesystem/GetDirectoryListingTask.cpp
+++ b/dom/filesystem/GetDirectoryListingTask.cpp
@@ -340,9 +340,14 @@ GetDirectoryListingTaskParent::IOWork()
nsCOMPtr<nsIFile> currFile = do_QueryInterface(supp);
MOZ_ASSERT(currFile);
- bool isSpecial, isFile;
- if (NS_WARN_IF(NS_FAILED(currFile->IsSpecial(&isSpecial))) ||
- isSpecial) {
+ bool isLink, isSpecial, isFile;
+ if (NS_WARN_IF(NS_FAILED(currFile->IsSymlink(&isLink)) ||
+ NS_FAILED(currFile->IsSpecial(&isSpecial))) ||
+ // Although we allow explicit individual selection of symlinks via the
+ // file picker, we do not process symlinks in directory traversal. Our
+ // specific policy decision is documented at
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1813299#c20
+ isLink || isSpecial) {
continue;
}
if (NS_WARN_IF(NS_FAILED(currFile->IsFile(&isFile)) ||
diff --git a/dom/filesystem/GetFilesHelper.cpp b/dom/filesystem/GetFilesHelper.cpp
index 563ef60b4a..fb3cf7a24d 100644
--- a/dom/filesystem/GetFilesHelper.cpp
+++ b/dom/filesystem/GetFilesHelper.cpp
@@ -333,13 +333,8 @@ GetFilesHelperBase::ExploreDirectory(const nsAString& aDOMPath, nsIFile* aFile)
return NS_OK;
}
- nsresult rv = AddExploredDirectory(aFile);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return rv;
- }
-
nsCOMPtr<nsISimpleEnumerator> entries;
- rv = aFile->GetDirectoryEntries(getter_AddRefs(entries));
+ nsresult rv = aFile->GetDirectoryEntries(getter_AddRefs(entries));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
@@ -361,7 +356,12 @@ GetFilesHelperBase::ExploreDirectory(const nsAString& aDOMPath, nsIFile* aFile)
bool isLink, isSpecial, isFile, isDir;
if (NS_WARN_IF(NS_FAILED(currFile->IsSymlink(&isLink)) ||
NS_FAILED(currFile->IsSpecial(&isSpecial))) ||
- isSpecial) {
+ isSpecial ||
+ // Although we allow explicit individual selection of symlinks via the
+ // file picker, we do not process symlinks in directory traversal. Our
+ // specific policy decision is documented at
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1813299#c20
+ isLink) {
continue;
}
@@ -371,11 +371,6 @@ GetFilesHelperBase::ExploreDirectory(const nsAString& aDOMPath, nsIFile* aFile)
continue;
}
- // We don't want to explore loops of links.
- if (isDir && isLink && !ShouldFollowSymLink(currFile)) {
- continue;
- }
-
// The new domPath
nsAutoString domPath;
domPath.Assign(aDOMPath);
@@ -415,69 +410,6 @@ GetFilesHelperBase::ExploreDirectory(const nsAString& aDOMPath, nsIFile* aFile)
return NS_OK;
}
-nsresult
-GetFilesHelperBase::AddExploredDirectory(nsIFile* aDir)
-{
- nsresult rv;
-
-#ifdef DEBUG
- bool isDir;
- rv = aDir->IsDirectory(&isDir);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return rv;
- }
-
- MOZ_ASSERT(isDir, "Why are we here?");
-#endif
-
- bool isLink;
- rv = aDir->IsSymlink(&isLink);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return rv;
- }
-
- nsAutoCString path;
-
- if (!isLink) {
- nsAutoString path16;
- rv = aDir->GetPath(path16);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return rv;
- }
-
- path = NS_ConvertUTF16toUTF8(path16);
- } else {
- rv = aDir->GetNativeTarget(path);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return rv;
- }
- }
-
- mExploredDirectories.PutEntry(path);
- return NS_OK;
-}
-
-bool
-GetFilesHelperBase::ShouldFollowSymLink(nsIFile* aDir)
-{
-#ifdef DEBUG
- bool isLink, isDir;
- if (NS_WARN_IF(NS_FAILED(aDir->IsSymlink(&isLink)) ||
- NS_FAILED(aDir->IsDirectory(&isDir)))) {
- return false;
- }
-
- MOZ_ASSERT(isLink && isDir, "Why are we here?");
-#endif
-
- nsAutoCString targetPath;
- if (NS_WARN_IF(NS_FAILED(aDir->GetNativeTarget(targetPath)))) {
- return false;
- }
-
- return !mExploredDirectories.Contains(targetPath);
-}
-
void
GetFilesHelper::ResolveOrRejectPromise(Promise* aPromise)
{
diff --git a/dom/filesystem/GetFilesHelper.h b/dom/filesystem/GetFilesHelper.h
index 4afd41d7e0..b6c58ef396 100644
--- a/dom/filesystem/GetFilesHelper.h
+++ b/dom/filesystem/GetFilesHelper.h
@@ -9,10 +9,8 @@
#include "mozilla/Mutex.h"
#include "mozilla/RefPtr.h"
#include "mozilla/dom/File.h"
-#include "nsClassHashtable.h"
#include "nsCycleCollectionTraversalCallback.h"
#include "nsTArray.h"
-#include "nsTHashtable.h"
#include "nsThreadUtils.h"
class nsIGlobalObject;
@@ -57,17 +55,10 @@ protected:
nsresult
ExploreDirectory(const nsAString& aDOMPath, nsIFile* aFile);
- nsresult
- AddExploredDirectory(nsIFile* aDirectory);
-
- bool
- ShouldFollowSymLink(nsIFile* aDirectory);
-
bool mRecursiveFlag;
// We populate this array in the I/O thread with the BlobImpl.
FallibleTArray<RefPtr<BlobImpl>> mTargetBlobImplArray;
- nsTHashtable<nsCStringHashKey> mExploredDirectories;
};
// Retrieving the list of files can be very time/IO consuming. We use this
diff --git a/dom/filesystem/tests/filesystem_commons.js b/dom/filesystem/tests/filesystem_commons.js
index 4f7234121e..c8bd9ac9fc 100644
--- a/dom/filesystem/tests/filesystem_commons.js
+++ b/dom/filesystem/tests/filesystem_commons.js
@@ -38,6 +38,10 @@ function test_getFilesAndDirectories(aDirectory, aRecursive, aNext) {
if (data[i] instanceof File) {
is(data[i].webkitRelativePath, createRelativePath(dir, data[i]), "File.webkitRelativePath should be called: parentdir.path + '/' + file.name: " + data[i].webkitRelativePath);
}
+ ok(
+ !data[i].webkitRelativePath.endsWith("symlink.txt"),
+ "We should never see a path ending with symlink.txt, our symlink sentinel."
+ );
}
}
);
diff --git a/dom/filesystem/tests/script_fileList.js b/dom/filesystem/tests/script_fileList.js
index 89fd04cabe..dedc61a448 100644
--- a/dom/filesystem/tests/script_fileList.js
+++ b/dom/filesystem/tests/script_fileList.js
@@ -36,6 +36,15 @@ function createTreeFile(depth, parent) {
if (depth == 0) {
nextFile.append('file.txt');
nextFile.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0o600);
+
+#ifdef XP_UNIX
+ // It's not possible to create symlinks on windows by default or on our
+ // Android platforms, so we can't create the symlink file there. Our
+ // callers that care are aware of this.
+ var linkFile = parent.clone();
+ linkFile.append("symlink.txt");
+ createSymLink(nextFile.path, linkFile.path);
+#endif
} else {
nextFile.append('subdir' + depth);
nextFile.createUnique(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0o700);
@@ -84,6 +93,15 @@ function createTestFile() {
file2.append('bar.txt');
file2.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0o600);
+#ifdef XP_UNIX
+ // It's not possible to create symlinks on windows by default or on our
+ // Android platforms, so we can't create the symlink file there. Our
+ // callers that care are aware of this.
+ var linkFile = dir.clone();
+ linkFile.append("symlink.txt");
+ createSymLink(file1.path, linkFile.path);
+#endif
+
return tmpFile;
}
@@ -127,3 +145,14 @@ addMessageListener("file.open", function (e) {
file: File.createFromNsIFile(testFile)
});
});
+
+addMessageListener("symlink.open", function (e) {
+ let testDir = createTestFile();
+ let testFile = testDir.clone();
+ testFile.append("subdir");
+ testFile.append("symlink.txt");
+
+ File.createFromNsIFile(testFile).then(function (file) {
+ sendAsyncMessage("symlink.opened", { dir: testDir.path, file });
+ });
+});
diff --git a/dom/filesystem/tests/test_webkitdirectory.html b/dom/filesystem/tests/test_webkitdirectory.html
index 591619e45b..46c728718f 100644
--- a/dom/filesystem/tests/test_webkitdirectory.html
+++ b/dom/filesystem/tests/test_webkitdirectory.html
@@ -9,11 +9,26 @@
<body>
<input id="inputFileWebkitDirectory" type="file" webkitdirectory></input>
<input id="inputFileWebkitDirectoryAndDirectory" type="file" webkitdirectory allowdirs></input>
+<input id="inputFileWebkitFile" type="file"></input>
<input id="inputFileDirectory" type="file" allowdirs></input>
<input id="inputFileDirectoryChange" type="file" webkitdirectory></input>
<script type="application/javascript;version=1.7">
+// Populate the given input type=file `aInputFile`'s `files` attribute by:
+// - loading `script_fileList.js` in the parent process
+// - telling it to generate the "test" template directory pattern which will
+// create "foo.txt", "subdir/bar.txt", and if symlinks are available on the
+// platform, "symlink.txt" which will be a symlink to "foo.txt". (Note that
+// we explicitly expect the symlink to be filtered out if generated, and
+// during the enhancement of the test we verified the file was created on
+// linux by running the test before fixing the GetFilesHelper logic to filter
+// the symlink out and verifying the subsequent `test_fileList` check failed.)
+// - Triggering the mock file picker with the base directory of the "test"
+// template directory.
+//
+// It's expected that `test_fileList` will be used after this step completes in
+// order to validate the results.
function populateInputFile(aInputFile) {
var url = SimpleTest.getTestFileURL("script_fileList.js");
var script = SpecialPowers.loadChromeScript(url);
@@ -52,6 +67,8 @@ function checkFile(file, fileList, dirName) {
ok(false, "File not found.");
}
+// Validate the contents of the given input type=file `aInputFile`'s' `files`
+// property against the expected list of files `aWhat`.
function test_fileList(aInputFile, aWhat) {
var input = document.getElementById(aInputFile);
var fileList = input.files;
@@ -70,6 +87,65 @@ function test_fileList(aInputFile, aWhat) {
next();
}
+// Verify that we can explicitly select a symlink and it will not be filtered
+// out. This is really a verification that GetFileHelper's file-handling logic
+// https://searchfox.org/mozilla-central/rev/065102493dfc49234120c37fc6a334a5b1d86d9e/dom/filesystem/GetFilesHelper.cpp#81-86
+// does not proactively take an action to filter out a selected symlink.
+//
+// This is a glass box test that is not entirely realistic for our actual system
+// file pickers but does reflect what will happen in the drag-and-drop case
+// for `HTMLInputElement::MozSetDndFilesAndDirectories` and this helps ensure
+// that future implementation changes will behave as expected. Specifically,
+// the presence of webkitdirectory will result in the file picker using
+// `modeGetFolder` which will only allow selection of a directory and forbid
+// file selection.
+//
+// This test explicitly does not validate HTMLInputElement's non-webkitdirectory
+// file selection mechanism because it does not involve GetFileHelper.
+async function test_individualSymlink(aInputFile) {
+ const input = document.getElementById(aInputFile);
+
+ // -- Create the symlink and get a `File` instance pointing at it.
+ const url = SimpleTest.getTestFileURL("script_fileList.js");
+ const script = SpecialPowers.loadChromeScript(url);
+
+ let opened = new Promise(resolve => script.addMessageListener("symlink.opened", resolve));
+ script.sendAsyncMessage("symlink.open", {});
+ let { dir, file: symlinkFile } = await opened;
+ info(`symlink.open provided dir: ${dir}`)
+
+ // -- Have the picker pick it
+ var MockFilePicker = SpecialPowers.MockFilePicker;
+ MockFilePicker.init(window, "A Mock File Picker", SpecialPowers.Ci.nsIFilePicker.modeOpen);
+
+ MockFilePicker.displayDirectory = dir;
+ let pickerShown = new Promise(resolve => {
+ MockFilePicker.showCallback = function() {
+ // This is where we are diverging from a realistic scenario in order to get
+ // the expected coverage.
+ MockFilePicker.setFiles([symlinkFile]);
+ resolve();
+ }
+ });
+ MockFilePicker.returnValue = MockFilePicker.returnOK;
+
+ let changeEvent = waitForEvent(input, "change");
+
+ input.click();
+
+ await pickerShown;
+ await changeEvent;
+
+ MockFilePicker.cleanup();
+ script.destroy();
+
+ // -- Verify that we see the symlink.
+ let fileList = input.files;
+ is(fileList.length, 1, "There should be 1 file.");
+ is(fileList[0].name, "symlink.txt", "The file should be the symlink.");
+ next();
+}
+
function test_webkitdirectory_attribute() {
var a = document.createElement("input");
a.setAttribute("type", "file");
@@ -169,6 +245,16 @@ var tests = [
function() { test_fileList('inputFileWebkitDirectory', testDirData) },
function() { test_fileList('inputFileWebkitDirectoryAndDirectory', testDirData) },
function() { test_fileList('inputFileDirectory', null); },
+
+ function() {
+#ifdef XP_WIN // Symlinks are not available on Windows and so will not be created.
+ info("Skipping individual symlink check on Windows and Android.");
+ next();
+ return;
+#endif
+ test_individualSymlink("inputFileWebkitFile").catch(err => ok(false, `Problem in symlink case: ${err}`));
+ },
+
test_webkitdirectory_attribute,
diff --git a/dom/locales/en-US/chrome/dom/dom.properties b/dom/locales/en-US/chrome/dom/dom.properties
index 60104a63ad..27b4eebf12 100644
--- a/dom/locales/en-US/chrome/dom/dom.properties
+++ b/dom/locales/en-US/chrome/dom/dom.properties
@@ -320,3 +320,4 @@ LargeAllocationNonE10S=A Large-Allocation header was ignored due to the document
PushStateFloodingPrevented=Call to pushState or replaceState ignored due to excessive calls within a short timeframe.
# LOCALIZATION NOTE: Do not translate "Reload"
ReloadFloodingPrevented=Call to Reload ignored due to excessive calls within a short timeframe.
+DOMQuadBoundsAttrWarning=DOMQuad.bounds is deprecated in favor of DOMQuad.getBounds()
diff --git a/dom/webidl/DOMMatrix.webidl b/dom/webidl/DOMMatrix.webidl
index 6b236ae666..f5c9f99406 100644
--- a/dom/webidl/DOMMatrix.webidl
+++ b/dom/webidl/DOMMatrix.webidl
@@ -4,14 +4,19 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* The origin of this IDL file is
- * http://dev.w3.org/fxtf/geometry/
+ * https://drafts.fxtf.org/geometry/
*
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
* liability, trademark and document use rules apply.
*/
-[Pref="layout.css.DOMMatrix.enabled"]
+[Constructor(optional (DOMString or sequence<unrestricted double>) init),
+ Exposed=(Window,Worker)]
interface DOMMatrixReadOnly {
+ [NewObject, Throws] static DOMMatrixReadOnly fromMatrix(optional DOMMatrixInit other);
+ [NewObject, Throws] static DOMMatrixReadOnly fromFloat32Array(Float32Array array32);
+ [NewObject, Throws] static DOMMatrixReadOnly fromFloat64Array(Float64Array array64);
+
// These attributes are simple aliases for certain elements of the 4x4 matrix
readonly attribute unrestricted double a;
readonly attribute unrestricted double b;
@@ -65,7 +70,7 @@ interface DOMMatrixReadOnly {
unrestricted double angle);
DOMMatrix skewX(unrestricted double sx);
DOMMatrix skewY(unrestricted double sy);
- DOMMatrix multiply(DOMMatrix other);
+ [NewObject, Throws] DOMMatrix multiply(optional DOMMatrixInit other);
DOMMatrix flipX();
DOMMatrix flipY();
DOMMatrix inverse();
@@ -76,17 +81,21 @@ interface DOMMatrixReadOnly {
DOMPoint transformPoint(optional DOMPointInit point);
[Throws] Float32Array toFloat32Array();
[Throws] Float64Array toFloat64Array();
- stringifier;
+ [Exposed=Window] stringifier;
};
-[Pref="layout.css.DOMMatrix.enabled",
- Constructor,
+[Constructor,
Constructor(DOMString transformList),
Constructor(DOMMatrixReadOnly other),
Constructor(Float32Array array32),
Constructor(Float64Array array64),
- Constructor(sequence<unrestricted double> numberSequence)]
+ Constructor(sequence<unrestricted double> numberSequence),
+ Exposed=(Window,Worker)]
interface DOMMatrix : DOMMatrixReadOnly {
+ [NewObject, Throws] static DOMMatrix fromMatrix(optional DOMMatrixInit other);
+ [NewObject, Throws] static DOMMatrix fromFloat32Array(Float32Array array32);
+ [NewObject, Throws] static DOMMatrix fromFloat64Array(Float64Array array64);
+
// These attributes are simple aliases for certain elements of the 4x4 matrix
inherit attribute unrestricted double a;
inherit attribute unrestricted double b;
@@ -113,8 +122,8 @@ interface DOMMatrix : DOMMatrixReadOnly {
inherit attribute unrestricted double m44;
// Mutable transform methods
- DOMMatrix multiplySelf(DOMMatrix other);
- DOMMatrix preMultiplySelf(DOMMatrix other);
+ [Throws] DOMMatrix multiplySelf(optional DOMMatrixInit other);
+ [Throws] DOMMatrix preMultiplySelf(optional DOMMatrixInit other);
DOMMatrix translateSelf(unrestricted double tx,
unrestricted double ty,
optional unrestricted double tz = 0);
@@ -143,6 +152,34 @@ interface DOMMatrix : DOMMatrixReadOnly {
DOMMatrix skewXSelf(unrestricted double sx);
DOMMatrix skewYSelf(unrestricted double sy);
DOMMatrix invertSelf();
- [Throws] DOMMatrix setMatrixValue(DOMString transformList);
+ [Exposed=Window, Throws] DOMMatrix setMatrixValue(DOMString transformList);
};
+dictionary DOMMatrix2DInit {
+ unrestricted double a;
+ unrestricted double b;
+ unrestricted double c;
+ unrestricted double d;
+ unrestricted double e;
+ unrestricted double f;
+ unrestricted double m11;
+ unrestricted double m12;
+ unrestricted double m21;
+ unrestricted double m22;
+ unrestricted double m41;
+ unrestricted double m42;
+};
+
+dictionary DOMMatrixInit : DOMMatrix2DInit {
+ unrestricted double m13 = 0;
+ unrestricted double m14 = 0;
+ unrestricted double m23 = 0;
+ unrestricted double m24 = 0;
+ unrestricted double m31 = 0;
+ unrestricted double m32 = 0;
+ unrestricted double m33 = 1;
+ unrestricted double m34 = 0;
+ unrestricted double m43 = 0;
+ unrestricted double m44 = 1;
+ boolean is2D;
+};
diff --git a/dom/webidl/DOMPoint.webidl b/dom/webidl/DOMPoint.webidl
index d092d900f5..313a51bc53 100644
--- a/dom/webidl/DOMPoint.webidl
+++ b/dom/webidl/DOMPoint.webidl
@@ -4,25 +4,30 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* The origin of this IDL file is
- * http://dev.w3.org/fxtf/geometry/
+ * https://drafts.fxtf.org/geometry/
*
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
* liability, trademark and document use rules apply.
*/
-[Pref="layout.css.DOMPoint.enabled"]
+[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
+ optional unrestricted double z = 0, optional unrestricted double w = 1),
+ Exposed=(Window,Worker)]
interface DOMPointReadOnly {
+ [NewObject] static DOMPointReadOnly fromPoint(optional DOMPointInit other);
+
readonly attribute unrestricted double x;
readonly attribute unrestricted double y;
readonly attribute unrestricted double z;
readonly attribute unrestricted double w;
};
-[Pref="layout.css.DOMPoint.enabled",
- Constructor(optional DOMPointInit point),
- Constructor(unrestricted double x, unrestricted double y,
- optional unrestricted double z = 0, optional unrestricted double w = 1)]
+[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
+ optional unrestricted double z = 0, optional unrestricted double w = 1),
+ Exposed=(Window,Worker)]
interface DOMPoint : DOMPointReadOnly {
+ [NewObject] static DOMPoint fromPoint(optional DOMPointInit other);
+
inherit attribute unrestricted double x;
inherit attribute unrestricted double y;
inherit attribute unrestricted double z;
@@ -34,4 +39,4 @@ dictionary DOMPointInit {
unrestricted double y = 0;
unrestricted double z = 0;
unrestricted double w = 1;
-}; \ No newline at end of file
+};
diff --git a/dom/webidl/DOMQuad.webidl b/dom/webidl/DOMQuad.webidl
index b933987d59..05b611a5e3 100644
--- a/dom/webidl/DOMQuad.webidl
+++ b/dom/webidl/DOMQuad.webidl
@@ -4,20 +4,41 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* The origin of this IDL file is
- * http://dev.w3.org/fxtf/geometry/
+ * https://drafts.fxtf.org/geometry/
*
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
* liability, trademark and document use rules apply.
*/
-[Pref="layout.css.DOMQuad.enabled",
- Constructor(optional DOMPointInit p1, optional DOMPointInit p2,
+[Constructor(optional DOMPointInit p1, optional DOMPointInit p2,
optional DOMPointInit p3, optional DOMPointInit p4),
- Constructor(DOMRectReadOnly rect)]
+ Constructor(DOMRectReadOnly rect),
+ Exposed=(Window,Worker)]
interface DOMQuad {
+ [NewObject] static DOMQuad fromRect(optional DOMRectInit other);
+ [NewObject] static DOMQuad fromQuad(optional DOMQuadInit other);
+
[SameObject] readonly attribute DOMPoint p1;
[SameObject] readonly attribute DOMPoint p2;
[SameObject] readonly attribute DOMPoint p3;
[SameObject] readonly attribute DOMPoint p4;
- [SameObject] readonly attribute DOMRectReadOnly bounds;
-}; \ No newline at end of file
+ [NewObject] DOMRectReadOnly getBounds();
+
+ [SameObject, Deprecated=DOMQuadBoundsAttr] readonly attribute DOMRectReadOnly bounds;
+
+ DOMQuadJSON toJSON();
+};
+
+dictionary DOMQuadJSON {
+ DOMPoint p1;
+ DOMPoint p2;
+ DOMPoint p3;
+ DOMPoint p4;
+};
+
+dictionary DOMQuadInit {
+ DOMPointInit p1 = null;
+ DOMPointInit p2 = null;
+ DOMPointInit p3 = null;
+ DOMPointInit p4 = null;
+};
diff --git a/dom/webidl/DOMRect.webidl b/dom/webidl/DOMRect.webidl
index 24a07900c5..baf7ce2456 100644
--- a/dom/webidl/DOMRect.webidl
+++ b/dom/webidl/DOMRect.webidl
@@ -4,23 +4,30 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* The origin of this IDL file is
- * http://dev.w3.org/fxtf/geometry/
+ * https://drafts.fxtf.org/geometry/
*
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
* liability, trademark and document use rules apply.
*/
-[Constructor,
- Constructor(unrestricted double x, unrestricted double y,
- unrestricted double width, unrestricted double height)]
+[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
+ optional unrestricted double width = 0, optional unrestricted double height = 0),
+ Exposed=(Window,Worker)]
interface DOMRect : DOMRectReadOnly {
+ [NewObject] static DOMRect fromRect(optional DOMRectInit other);
+
inherit attribute unrestricted double x;
inherit attribute unrestricted double y;
inherit attribute unrestricted double width;
inherit attribute unrestricted double height;
};
+[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
+ optional unrestricted double width = 0, optional unrestricted double height = 0),
+ Exposed=(Window,Worker)]
interface DOMRectReadOnly {
+ [NewObject] static DOMRectReadOnly fromRect(optional DOMRectInit other);
+
readonly attribute unrestricted double x;
readonly attribute unrestricted double y;
readonly attribute unrestricted double width;
diff --git a/dom/webidl/WebKitCSSMatrix.webidl b/dom/webidl/WebKitCSSMatrix.webidl
index 8115711a33..e939d37acf 100644
--- a/dom/webidl/WebKitCSSMatrix.webidl
+++ b/dom/webidl/WebKitCSSMatrix.webidl
@@ -18,7 +18,8 @@ interface WebKitCSSMatrix : DOMMatrix {
WebKitCSSMatrix setMatrixValue(DOMString transformList);
// Immutable transform methods
- WebKitCSSMatrix multiply(WebKitCSSMatrix other);
+ [Throws]
+ WebKitCSSMatrix multiply(optional DOMMatrixInit other);
[Throws]
WebKitCSSMatrix inverse();
WebKitCSSMatrix translate(optional unrestricted double tx = 0,
diff --git a/js/public/Class.h b/js/public/Class.h
index d7e2ab40db..f1d7739718 100644
--- a/js/public/Class.h
+++ b/js/public/Class.h
@@ -913,7 +913,7 @@ struct JSClass {
// application.
#define JSCLASS_GLOBAL_APPLICATION_SLOTS 5
#define JSCLASS_GLOBAL_SLOT_COUNT \
- (JSCLASS_GLOBAL_APPLICATION_SLOTS + JSProto_LIMIT * 2 + 47)
+ (JSCLASS_GLOBAL_APPLICATION_SLOTS + JSProto_LIMIT * 2 + 50)
#define JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(n) \
(JSCLASS_IS_GLOBAL | JSCLASS_HAS_RESERVED_SLOTS(JSCLASS_GLOBAL_SLOT_COUNT + (n)))
#define JSCLASS_GLOBAL_FLAGS \
diff --git a/js/public/Equality.h b/js/public/Equality.h
new file mode 100644
index 0000000000..6d2db50fa9
--- /dev/null
+++ b/js/public/Equality.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* Equality operations. */
+
+#ifndef js_Equality_h
+#define js_Equality_h
+
+#include "mozilla/FloatingPoint.h"
+
+#include "jstypes.h" // JS_PUBLIC_API
+
+#include "js/RootingAPI.h" // JS::Handle
+#include "js/Value.h" // JS::Value
+
+struct JSContext;
+
+namespace JS {
+
+/**
+ * Store |v1 === v2| to |*equal| -- strict equality, which performs no
+ * conversions on |v1| or |v2| before comparing.
+ *
+ * This operation can fail only if an internal error occurs (e.g. OOM while
+ * linearizing a string value).
+ */
+extern JS_PUBLIC_API(bool)
+StrictlyEqual(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* equal);
+
+/**
+ * Store |v1 == v2| to |*equal| -- loose equality, which may perform
+ * user-modifiable conversions on |v1| or |v2|.
+ *
+ * This operation can fail if a user-modifiable conversion fails *or* if an
+ * internal error occurs. (e.g. OOM while linearizing a string value).
+ */
+extern JS_PUBLIC_API(bool)
+LooselyEqual(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* equal);
+
+/**
+ * Stores |SameValue(v1, v2)| to |*equal| -- using the SameValue operation
+ * defined in ECMAScript, initially exposed to script as |Object.is|. SameValue
+ * behaves identically to strict equality, except that it equates two NaN values
+ * and does not equate differently-signed zeroes. It performs no conversions on
+ * |v1| or |v2| before comparing.
+ *
+ * This operation can fail only if an internal error occurs (e.g. OOM while
+ * linearizing a string value).
+ */
+extern JS_PUBLIC_API(bool)
+SameValue(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* same);
+
+/**
+ * Implements |SameValueZero(v1, v2)| for Number values |v1| and |v2|.
+ * SameValueZero equates NaNs, equal nonzero values, and zeroes without respect
+ * to their signs.
+ */
+static inline bool
+SameValueZero(double v1, double v2)
+{
+ return mozilla::EqualOrBothNaN(v1, v2);
+}
+
+} // namespace JS
+
+#endif /* js_Equality_h */
diff --git a/js/public/GCVector.h b/js/public/GCVector.h
index 4acf0d1fc5..a92969b576 100644
--- a/js/public/GCVector.h
+++ b/js/public/GCVector.h
@@ -130,6 +130,17 @@ class GCVector
}
};
+// AllocPolicy is optional. It has a default value declared in TypeDecls.h
+template <typename T, typename AllocPolicy>
+class MOZ_STACK_CLASS StackGCVector : public GCVector<T, 8, AllocPolicy> {
+ public:
+ using Base = GCVector<T, 8, AllocPolicy>;
+
+ private:
+ // Inherit constructor from GCVector.
+ using Base::Base;
+};
+
} // namespace JS
namespace js {
@@ -191,7 +202,7 @@ class MutableWrappedPtrOperations<JS::GCVector<T, Capacity, AllocPolicy>, Wrappe
void clearAndFree() { vec().clearAndFree(); }
template<typename U> bool append(U&& aU) { return vec().append(mozilla::Forward<U>(aU)); }
template<typename... Args> bool emplaceBack(Args&&... aArgs) {
- return vec().emplaceBack(mozilla::Forward<Args...>(aArgs...));
+ return vec().emplaceBack(mozilla::Forward<Args>(aArgs)...);
}
template<typename U, size_t O, class BP>
bool appendAll(const mozilla::Vector<U, O, BP>& aU) { return vec().appendAll(aU); }
@@ -223,6 +234,29 @@ class MutableWrappedPtrOperations<JS::GCVector<T, Capacity, AllocPolicy>, Wrappe
void erase(T* aBegin, T* aEnd) { vec().erase(aBegin, aEnd); }
};
+template <typename Wrapper, typename T, typename AllocPolicy>
+class WrappedPtrOperations<JS::StackGCVector<T, AllocPolicy>, Wrapper> :
+ public WrappedPtrOperations<typename JS::StackGCVector<T, AllocPolicy>::Base,
+ Wrapper> {};
+
+template <typename Wrapper, typename T, typename AllocPolicy>
+class MutableWrappedPtrOperations<JS::StackGCVector<T, AllocPolicy>, Wrapper> :
+ public MutableWrappedPtrOperations<typename JS::StackGCVector<T, AllocPolicy>::Base,
+ Wrapper> {};
+
} // namespace js
+namespace JS {
+
+// An automatically rooted GCVector for stack use.
+template <typename T>
+class RootedVector : public Rooted<StackGCVector<T>> {
+ using Vec = StackGCVector<T>;
+ using Base = Rooted<Vec>;
+
+ public:
+ explicit RootedVector(JSContext* cx) : Base(cx, Vec(cx)) {}
+};
+
+} // namespace JS
#endif // js_GCVector_h
diff --git a/js/public/Proxy.h b/js/public/Proxy.h
index e493f522c6..981adc853c 100644
--- a/js/public/Proxy.h
+++ b/js/public/Proxy.h
@@ -588,6 +588,15 @@ class JS_FRIEND_API(AutoEnterPolicy)
inline void recordLeave() {}
#endif
+ private:
+ // This operator needs to be deleted explicitly, otherwise Visual C++ will
+ // create it automatically when it is part of the export JS API. In that
+ // case, compile would fail because HandleId is not allowed to be assigned
+ // and consequently instantiation of assign operator of mozilla::Maybe
+ // would fail. See bug 1325351 comment 16. Copy constructor is removed at
+ // the same time for consistency.
+ AutoEnterPolicy(const AutoEnterPolicy&) = delete;
+ AutoEnterPolicy& operator=(const AutoEnterPolicy&) = delete;
};
#ifdef JS_DEBUG
diff --git a/js/public/Result.h b/js/public/Result.h
new file mode 100644
index 0000000000..631fa366d5
--- /dev/null
+++ b/js/public/Result.h
@@ -0,0 +1,223 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * `Result` is used as the return type of many SpiderMonkey functions that
+ * can either succeed or fail. See "/mfbt/Result.h".
+ *
+ *
+ * ## Which return type to use
+ *
+ * `Result` is for return values. Obviously, if you're writing a function that
+ * can't fail, don't use Result. Otherwise:
+ *
+ * JS::Result<> - function can fail, doesn't return anything on success
+ * (defaults to `JS::Result<JS::Ok, JS::Error&>`)
+ * JS::Result<JS::OOM&> - like JS::Result<>, but fails only on OOM
+ *
+ * JS::Result<Data> - function can fail, returns Data on success
+ * JS::Result<Data, JS::OOM&> - returns Data, fails only on OOM
+ *
+ * mozilla::GenericErrorResult<JS::Error&> - always fails
+ *
+ * That last type is like a Result with no success type. It's used for
+ * functions like `js::ReportNotFunction` that always return an error
+ * result. `GenericErrorResult<E>` implicitly converts to `Result<V, E>`,
+ * regardless of V.
+ *
+ *
+ * ## Checking Results when your return type is Result
+ *
+ * When you call a function that returns a `Result`, use the `MOZ_TRY` macro to
+ * check for errors:
+ *
+ * MOZ_TRY(DefenestrateObject(cx, obj));
+ *
+ * If `DefenestrateObject` returns a success result, `MOZ_TRY` is done, and
+ * control flows to the next statement. If `DefenestrateObject` returns an
+ * error result, `MOZ_TRY` will immediately return it, propagating the error to
+ * your caller. It's kind of like exceptions, but more explicit -- you can see
+ * in the code exactly where errors can happen.
+ *
+ * You can do a tail call instead of using `MOZ_TRY`:
+ *
+ * return DefenestrateObject(cx, obj);
+ *
+ * Indicate success with `return Ok();`.
+ *
+ * If the function returns a value on success, use `MOZ_TRY_VAR` to get it:
+ *
+ * RootedValue thrug(cx);
+ * MOZ_TRY_VAR(thrug, GetObjectThrug(cx, obj));
+ *
+ * This behaves the same as `MOZ_TRY` on error. On success, the success
+ * value of `GetObjectThrug(cx, obj)` is assigned to the variable `thrug`.
+ *
+ *
+ * ## Checking Results when your return type is not Result
+ *
+ * This header defines alternatives to MOZ_TRY and MOZ_TRY_VAR for when you
+ * need to call a `Result` function from a function that uses false or nullptr
+ * to indicate errors:
+ *
+ * JS_TRY_OR_RETURN_FALSE(cx, DefenestrateObject(cx, obj));
+ * JS_TRY_VAR_OR_RETURN_FALSE(cx, v, GetObjectThrug(cx, obj));
+ *
+ * JS_TRY_OR_RETURN_NULL(cx, DefenestrateObject(cx, obj));
+ * JS_TRY_VAR_OR_RETURN_NULL(cx, v, GetObjectThrug(cx, obj));
+ *
+ * When TRY is not what you want, because you need to do some cleanup or
+ * recovery on error, use this idiom:
+ *
+ * if (!cx->resultToBool(expr_that_is_a_Result)) {
+ * ... your recovery code here ...
+ * }
+ *
+ * In place of a tail call, you can use one of these methods:
+ *
+ * return cx->resultToBool(expr); // false on error
+ * return cx->resultToPtr(expr); // null on error
+ *
+ * Once we are using `Result` everywhere, including in public APIs, all of
+ * these will go away.
+ *
+ *
+ * ## GC safety
+ *
+ * When a function returns a `JS::Result<JSObject*>`, it is the program's
+ * responsibility to check for errors and root the object before continuing:
+ *
+ * RootedObject wrapper(cx);
+ * MOZ_TRY_VAR(wrapper, Enwrapify(cx, thing));
+ *
+ * This is ideal. On error, there is no object to root; on success, the
+ * assignment to wrapper roots it. GC safety is ensured.
+ *
+ * `Result` has methods .isOk(), .isErr(), .unwrap(), and .unwrapErr(), but if
+ * you're actually using them, it's possible to create a GC hazard. The static
+ * analysis will catch it if so, but that's hardly convenient. So try to stick
+ * to the idioms shown above.
+ *
+ *
+ * ## Future directions
+ *
+ * At present, JS::Error and JS::OOM are empty structs. The plan is to make them
+ * GC things that contain the actual error information (including the exception
+ * value and a saved stack).
+ *
+ * The long-term plan is to remove JS_IsExceptionPending and
+ * JS_GetPendingException in favor of JS::Error. Exception state will no longer
+ * exist.
+ */
+
+#ifndef js_Result_h
+#define js_Result_h
+
+#include "mozilla/Result.h"
+
+struct JSContext;
+
+/**
+ * Evaluate the boolean expression expr. If it's true, do nothing.
+ * If it's false, return an error result.
+ */
+#define JS_TRY_BOOL_TO_RESULT(cx, expr) \
+ do { \
+ bool ok_ = (expr); \
+ if (!ok_) \
+ return (cx)->boolToResult(ok_); \
+ } while (0)
+
+/**
+ * JS_TRY_OR_RETURN_FALSE(cx, expr) runs expr to compute a Result value.
+ * On success, nothing happens; on error, it returns false immediately.
+ *
+ * Implementation note: this involves cx because this may eventually
+ * do the work of setting a pending exception or reporting OOM.
+ */
+#define JS_TRY_OR_RETURN_FALSE(cx, expr) \
+ do { \
+ auto tmpResult_ = (expr); \
+ if (tmpResult_.isErr()) \
+ return (cx)->resultToBool(tmpResult_); \
+ } while (0)
+
+/**
+ * Like JS_TRY_OR_RETURN_FALSE, but returning nullptr on error,
+ * rather than false.
+ */
+#define JS_TRY_OR_RETURN_NULL(cx, expr) \
+ do { \
+ auto tmpResult_ = (expr); \
+ if (tmpResult_.isErr()) { \
+ JS_ALWAYS_FALSE((cx)->resultToBool(tmpResult_)); \
+ return nullptr; \
+ } \
+ } while (0)
+
+#define JS_TRY_VAR_OR_RETURN_FALSE(cx, target, expr) \
+ do { \
+ auto tmpResult_ = (expr); \
+ if (tmpResult_.isErr()) \
+ return (cx)->resultToBool(tmpResult_); \
+ (target) = tmpResult_.unwrap(); \
+ } while (0)
+
+#define JS_TRY_VAR_OR_RETURN_NULL(cx, target, expr) \
+ do { \
+ auto tmpResult_ = (expr); \
+ if (tmpResult_.isErr()) { \
+ JS_ALWAYS_FALSE((cx)->resultToBool(tmpResult_)); \
+ return nullptr; \
+ } \
+ (target) = tmpResult_.unwrap(); \
+ } while (0)
+
+namespace JS {
+
+using mozilla::Ok;
+
+/**
+ * Type representing a JS error or exception. At the moment this only "represents"
+ * an error in a rather abstract way.
+ */
+struct Error
+{
+ // Ensure sizeof(Error) > 1 so that Result<V, Error&> can use pointer
+ // tagging.
+ int dummy;
+};
+
+struct OOM : public Error
+{
+};
+
+/**
+ * `Result` is intended to be the return type of JSAPI calls and internal
+ * functions that can run JS code or allocate memory from the JS GC heap. Such
+ * functions can:
+ *
+ * - succeed, possibly returning a value;
+ *
+ * - fail with a JS exception (out-of-memory falls in this category); or
+ *
+ * - fail because JS execution was terminated, which occurs when e.g. a
+ * user kills a script from the "slow script" UI. This is also how we
+ * unwind the stack when the debugger forces the current function to
+ * return. JS `catch` blocks can't catch this kind of failure,
+ * and JS `finally` blocks don't execute.
+ */
+template <typename V = Ok, typename E = Error&>
+using Result = mozilla::Result<V, E>;
+
+static_assert(sizeof(Result<>) == sizeof(uintptr_t),
+ "Result<> should be pointer-sized");
+
+static_assert(sizeof(Result<int*, Error&>) == sizeof(uintptr_t),
+ "Result<V*, Error&> should be pointer-sized");
+
+} // namespace JS
+
+#endif // js_Result_h
diff --git a/js/public/TypeDecls.h b/js/public/TypeDecls.h
index 40d6f1f8a4..2b36ed95b9 100644
--- a/js/public/TypeDecls.h
+++ b/js/public/TypeDecls.h
@@ -30,6 +30,10 @@ class JSAddonId;
struct jsid;
+namespace js {
+class TempAllocPolicy;
+}; // namespace js
+
namespace JS {
typedef unsigned char Latin1Char;
@@ -40,6 +44,8 @@ template <typename T> class Handle;
template <typename T> class MutableHandle;
template <typename T> class Rooted;
template <typename T> class PersistentRooted;
+template <typename T> class RootedVector;
+template <typename T, typename AllocPolicy = js::TempAllocPolicy> class StackGCVector;
typedef Handle<JSFunction*> HandleFunction;
typedef Handle<jsid> HandleId;
@@ -48,6 +54,7 @@ typedef Handle<JSScript*> HandleScript;
typedef Handle<JSString*> HandleString;
typedef Handle<JS::Symbol*> HandleSymbol;
typedef Handle<Value> HandleValue;
+typedef Handle<StackGCVector<Value>> HandleValueVector;
typedef MutableHandle<JSFunction*> MutableHandleFunction;
typedef MutableHandle<jsid> MutableHandleId;
@@ -56,6 +63,7 @@ typedef MutableHandle<JSScript*> MutableHandleScript;
typedef MutableHandle<JSString*> MutableHandleString;
typedef MutableHandle<JS::Symbol*> MutableHandleSymbol;
typedef MutableHandle<Value> MutableHandleValue;
+typedef MutableHandle<StackGCVector<Value>> MutableHandleValueVector;
typedef Rooted<JSObject*> RootedObject;
typedef Rooted<JSFunction*> RootedFunction;
@@ -65,6 +73,8 @@ typedef Rooted<JS::Symbol*> RootedSymbol;
typedef Rooted<jsid> RootedId;
typedef Rooted<JS::Value> RootedValue;
+typedef RootedVector<JS::Value> RootedValueVector;
+
typedef PersistentRooted<JSFunction*> PersistentRootedFunction;
typedef PersistentRooted<jsid> PersistentRootedId;
typedef PersistentRooted<JSObject*> PersistentRootedObject;
@@ -73,6 +83,11 @@ typedef PersistentRooted<JSString*> PersistentRootedString;
typedef PersistentRooted<JS::Symbol*> PersistentRootedSymbol;
typedef PersistentRooted<Value> PersistentRootedValue;
+
+template <typename T>
+using HandleVector = Handle<StackGCVector<T>>;
+template <typename T>
+using MutableHandleVector = MutableHandle<StackGCVector<T>>;
} // namespace JS
#endif /* js_TypeDecls_h */
diff --git a/js/src/NamespaceImports.h b/js/src/NamespaceImports.h
index 2b7a1f0e8b..a1d8bca1c3 100644
--- a/js/src/NamespaceImports.h
+++ b/js/src/NamespaceImports.h
@@ -82,10 +82,18 @@ using JS::UTF8CharsZ;
using JS::UniqueChars;
using JS::UniqueTwoByteChars;
+using JS::Result;
+using JS::Ok;
+using JS::OOM;
+
using JS::AutoValueVector;
using JS::AutoIdVector;
using JS::AutoObjectVector;
+using JS::RootedValueVector;
+using JS::HandleValueVector;
+using JS::MutableHandleValueVector;
+
using JS::ValueVector;
using JS::IdVector;
using JS::ScriptVector;
diff --git a/js/src/builtin/Array.js b/js/src/builtin/Array.js
index 1e7776e228..54446d2578 100644
--- a/js/src/builtin/Array.js
+++ b/js/src/builtin/Array.js
@@ -195,17 +195,42 @@ function ArrayStaticSome(list, callbackfn/*, thisArg*/) {
return callFunction(ArraySome, list, callbackfn, T);
}
-/* ES6 draft 2016-1-15 22.1.3.25 Array.prototype.sort (comparefn) */
+// ES2018 draft rev 3bbc87cd1b9d3bf64c3e68ca2fe9c5a3f2c304c0
+// 22.1.3.25 Array.prototype.sort ( comparefn )
function ArraySort(comparefn) {
/* Step 1. */
- var O = ToObject(this);
+ if (comparefn !== undefined) {
+ if (!IsCallable(comparefn)) {
+ ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, comparefn));
+ }
+ }
/* Step 2. */
+ var O = ToObject(this);
+
+ /* Step 3. */
var len = ToLength(O.length);
if (len <= 1)
return this;
+ if (comparefn === undefined) {
+ // {Goanna} This implementation slightly breaks the standard. The default
+ // comparator function depends on the type of items in the Array
+ // (Strings, Numbers, etc.) and can be literal, lexicograpic, numeric,
+ // lexicograpic-number...
+ // Mozilla implements this correctly only in the native implementation.
+ // Note that this must be stable regardless of casting, so we can only
+ // use one of > or <, as the other may involve weird equality.
+ comparefn = function(x, y) {
+ /* Step 4.a. */
+ if (x == y)
+ return 0;
+ if (x > y)
+ return 1;
+ return -1;
+ }
+ }
/* 22.1.3.25.1 Runtime Semantics: SortCompare( x, y ) */
var wrappedCompareFn = comparefn;
comparefn = function(x, y) {
@@ -1210,6 +1235,72 @@ function ArrayAt(index) {
return O[k];
}
+// https://github.com/tc39/proposal-array-find-from-last
+// Array.prototype.findLast ( predicate, thisArg )
+function ArrayFindLast(predicate/*, thisArg*/) {
+ /* Steps 1. */
+ var O = ToObject(this);
+
+ /* Steps 2. */
+ var len = ToLength(O.length);
+
+ /* Step 3. */
+ if (arguments.length === 0) {
+ ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.findLast");
+ }
+ if (!IsCallable(predicate)) {
+ ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, predicate));
+ }
+
+ var T = arguments.length > 1 ? arguments[1] : undefined;
+
+ /* Step 4-5. */
+ for (var k = len - 1; k >= 0; k--) {
+ /* Steps 5.a-b. */
+ var kValue = O[k];
+ /* Steps 5.c-d. */
+ if (callContentFunction(predicate, T, kValue, k, O)) {
+ return kValue;
+ }
+ }
+
+ /* Step 6. */
+ return undefined;
+}
+
+// https://github.com/tc39/proposal-array-find-from-last
+// Array.prototype.findLastIndex ( predicate, thisArg )
+function ArrayFindLastIndex(predicate/*, thisArg*/) {
+ /* Steps 1. */
+ var O = ToObject(this);
+
+ /* Steps 2. */
+ var len = ToLength(O.length);
+
+ /* Step 3. */
+ if (arguments.length === 0) {
+ ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.findLastIndex");
+ }
+ if (!IsCallable(predicate)) {
+ ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, predicate));
+ }
+
+ var T = arguments.length > 1 ? arguments[1] : undefined;
+
+ /* Step 4-5. */
+ for (var k = len - 1; k >= 0; k--) {
+ /* Steps 5.a-b. */
+ var kValue = O[k];
+ /* Steps 5.c-d. */
+ if (callContentFunction(predicate, T, kValue, k, O)) {
+ return k;
+ }
+ }
+
+ /* Step 6. */
+ return -1;
+}
+
function ArrayStaticConcat(arr, arg1) {
if (arguments.length < 1)
ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.concat');
diff --git a/js/src/builtin/Date.js b/js/src/builtin/Date.js
index 6983d26859..534deb0f6f 100644
--- a/js/src/builtin/Date.js
+++ b/js/src/builtin/Date.js
@@ -104,7 +104,7 @@ function Date_toLocaleString() {
}
// Step 7.
- return intl_FormatDateTime(dateTimeFormat, x, false);
+ return intl_FormatDateTime(dateTimeFormat, x, /* formatToParts = */ false);
}
@@ -137,7 +137,7 @@ function Date_toLocaleDateString() {
}
// Step 7.
- return intl_FormatDateTime(dateTimeFormat, x, false);
+ return intl_FormatDateTime(dateTimeFormat, x, /* formatToParts = */ false);
}
@@ -170,5 +170,5 @@ function Date_toLocaleTimeString() {
}
// Step 7.
- return intl_FormatDateTime(dateTimeFormat, x, false);
+ return intl_FormatDateTime(dateTimeFormat, x, /* formatToParts = */ false);
}
diff --git a/js/src/builtin/MapObject.cpp b/js/src/builtin/MapObject.cpp
index 9d17acbf8a..893e0448a4 100644
--- a/js/src/builtin/MapObject.cpp
+++ b/js/src/builtin/MapObject.cpp
@@ -12,6 +12,7 @@
#include "ds/OrderedHashTable.h"
#include "gc/Marking.h"
#include "js/Utility.h"
+#include "vm/EqualityOperations.h" // js::SameValue
#include "vm/GlobalObject.h"
#include "vm/Interpreter.h"
#include "vm/SelfHosting.h"
diff --git a/js/src/builtin/Object.cpp b/js/src/builtin/Object.cpp
index d661a222e5..5221afb617 100644
--- a/js/src/builtin/Object.cpp
+++ b/js/src/builtin/Object.cpp
@@ -15,6 +15,7 @@
#include "jit/InlinableNatives.h"
#include "js/UniquePtr.h"
#include "vm/AsyncFunction.h"
+#include "vm/EqualityOperations.h" // js::SameValue
#include "vm/StringBuffer.h"
#include "jsobjinlines.h"
@@ -1239,6 +1240,7 @@ static const JSFunctionSpec object_static_methods[] = {
JS_FN("seal", obj_seal, 1, 0),
JS_FN("isSealed", obj_isSealed, 1, 0),
JS_SELF_HOSTED_FN("fromEntries", "ObjectFromEntries", 1, 0),
+ JS_SELF_HOSTED_FN("hasOwn", "ObjectHasOwn", 2, 0),
JS_FS_END
};
diff --git a/js/src/builtin/Object.js b/js/src/builtin/Object.js
index c4739037e3..59d4807317 100644
--- a/js/src/builtin/Object.js
+++ b/js/src/builtin/Object.js
@@ -220,3 +220,12 @@ function ObjectFromEntries(iter) {
return obj;
}
+
+// Proposal https://github.com/tc39/proposal-accessible-object-hasownproperty
+// Object.hasOwn (Object, Property)
+function ObjectHasOwn(O, P) {
+ // Step 1.
+ var obj = ToObject(O);
+ // Step 2-3.
+ return callFunction(std_Object_hasOwnProperty, obj, P);
+}
diff --git a/js/src/builtin/RegExp.cpp b/js/src/builtin/RegExp.cpp
index 46a2862909..f3d34762f6 100644
--- a/js/src/builtin/RegExp.cpp
+++ b/js/src/builtin/RegExp.cpp
@@ -974,8 +974,7 @@ IsTrailSurrogateWithLeadSurrogate(JSContext* cx, HandleLinearString input, int32
*/
static RegExpRunStatus
ExecuteRegExp(JSContext* cx, HandleObject regexp, HandleString string,
- int32_t lastIndex,
- MatchPairs* matches, size_t* endIndex, RegExpStaticsUpdate staticsUpdate)
+ int32_t lastIndex, MatchPairs* matches, size_t* endIndex)
{
/*
* WARNING: Despite the presence of spec step comment numbers, this
@@ -990,14 +989,9 @@ ExecuteRegExp(JSContext* cx, HandleObject regexp, HandleString string,
if (!RegExpObject::getShared(cx, reobj, &re))
return RegExpRunStatus_Error;
- RegExpStatics* res;
- if (staticsUpdate == UpdateRegExpStatics) {
- res = GlobalObject::getRegExpStatics(cx, cx->global());
- if (!res)
- return RegExpRunStatus_Error;
- } else {
- res = nullptr;
- }
+ RegExpStatics* res = GlobalObject::getRegExpStatics(cx, cx->global());
+ if (!res)
+ return RegExpRunStatus_Error;
RootedLinearString input(cx, string->ensureLinear(cx));
if (!input)
@@ -1051,15 +1045,14 @@ ExecuteRegExp(JSContext* cx, HandleObject regexp, HandleString string,
* steps 3, 9-25, except 12.a.i, 12.c.i.1, 15.
*/
static bool
-RegExpMatcherImpl(JSContext* cx, HandleObject regexp, HandleString string,
- int32_t lastIndex, RegExpStaticsUpdate staticsUpdate, MutableHandleValue rval)
+RegExpMatcherImpl(JSContext* cx, HandleObject regexp, HandleString string, int32_t lastIndex,
+ MutableHandleValue rval)
{
/* Execute regular expression and gather matches. */
ScopedMatchPairs matches(&cx->tempLifoAlloc());
/* Steps 3, 9-14, except 12.a.i, 12.c.i.1. */
- RegExpRunStatus status = ExecuteRegExp(cx, regexp, string, lastIndex,
- &matches, nullptr, staticsUpdate);
+ RegExpRunStatus status = ExecuteRegExp(cx, regexp, string, lastIndex, &matches, nullptr);
if (status == RegExpRunStatus_Error)
return false;
@@ -1099,8 +1092,7 @@ js::RegExpMatcher(JSContext* cx, unsigned argc, Value* vp)
return false;
/* Steps 3, 9-25, except 12.a.i, 12.c.i.1, 15. */
- return RegExpMatcherImpl(cx, regexp, string, lastIndex,
- UpdateRegExpStatics, args.rval());
+ return RegExpMatcherImpl(cx, regexp, string, lastIndex, args.rval());
}
/*
@@ -1123,8 +1115,7 @@ js::RegExpMatcherRaw(JSContext* cx, HandleObject regexp, HandleString input,
return false;
return CreateRegExpMatchResult(cx, *shared, input, *maybeMatches, output);
}
- return RegExpMatcherImpl(cx, regexp, input, lastIndex,
- UpdateRegExpStatics, output);
+ return RegExpMatcherImpl(cx, regexp, input, lastIndex, output);
}
/*
@@ -1135,14 +1126,13 @@ js::RegExpMatcherRaw(JSContext* cx, HandleObject regexp, HandleString input,
*/
static bool
RegExpSearcherImpl(JSContext* cx, HandleObject regexp, HandleString string,
- int32_t lastIndex, RegExpStaticsUpdate staticsUpdate, int32_t* result)
+ int32_t lastIndex, int32_t* result)
{
/* Execute regular expression and gather matches. */
ScopedMatchPairs matches(&cx->tempLifoAlloc());
/* Steps 3, 9-14, except 12.a.i, 12.c.i.1. */
- RegExpRunStatus status = ExecuteRegExp(cx, regexp, string, lastIndex,
- &matches, nullptr, staticsUpdate);
+ RegExpRunStatus status = ExecuteRegExp(cx, regexp, string, lastIndex, &matches, nullptr);
if (status == RegExpRunStatus_Error)
return false;
@@ -1180,7 +1170,7 @@ js::RegExpSearcher(JSContext* cx, unsigned argc, Value* vp)
/* Steps 3, 9-25, except 12.a.i, 12.c.i.1, 15. */
int32_t result = 0;
- if (!RegExpSearcherImpl(cx, regexp, string, lastIndex, UpdateRegExpStatics, &result))
+ if (!RegExpSearcherImpl(cx, regexp, string, lastIndex, &result))
return false;
args.rval().setInt32(result);
@@ -1203,23 +1193,7 @@ js::RegExpSearcherRaw(JSContext* cx, HandleObject regexp, HandleString input,
*result = CreateRegExpSearchResult(cx, *maybeMatches);
return true;
}
- return RegExpSearcherImpl(cx, regexp, input, lastIndex,
- UpdateRegExpStatics, result);
-}
-
-bool
-js::regexp_exec_no_statics(JSContext* cx, unsigned argc, Value* vp)
-{
- CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 2);
- MOZ_ASSERT(IsRegExpObject(args[0]));
- MOZ_ASSERT(args[1].isString());
-
- RootedObject regexp(cx, &args[0].toObject());
- RootedString string(cx, args[1].toString());
-
- return RegExpMatcherImpl(cx, regexp, string, 0,
- DontUpdateRegExpStatics, args.rval());
+ return RegExpSearcherImpl(cx, regexp, input, lastIndex, result);
}
/*
@@ -1245,8 +1219,7 @@ js::RegExpTester(JSContext* cx, unsigned argc, Value* vp)
/* Steps 3, 9-14, except 12.a.i, 12.c.i.1. */
size_t endIndex = 0;
- RegExpRunStatus status = ExecuteRegExp(cx, regexp, string, lastIndex,
- nullptr, &endIndex, UpdateRegExpStatics);
+ RegExpRunStatus status = ExecuteRegExp(cx, regexp, string, lastIndex, nullptr, &endIndex);
if (status == RegExpRunStatus_Error)
return false;
@@ -1271,8 +1244,7 @@ js::RegExpTesterRaw(JSContext* cx, HandleObject regexp, HandleString input,
MOZ_ASSERT(lastIndex >= 0);
size_t endIndexTmp = 0;
- RegExpRunStatus status = ExecuteRegExp(cx, regexp, input, lastIndex,
- nullptr, &endIndexTmp, UpdateRegExpStatics);
+ RegExpRunStatus status = ExecuteRegExp(cx, regexp, input, lastIndex, nullptr, &endIndexTmp);
if (status == RegExpRunStatus_Success) {
MOZ_ASSERT(endIndexTmp <= INT32_MAX);
@@ -1287,24 +1259,6 @@ js::RegExpTesterRaw(JSContext* cx, HandleObject regexp, HandleString input,
return false;
}
-bool
-js::regexp_test_no_statics(JSContext* cx, unsigned argc, Value* vp)
-{
- CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 2);
- MOZ_ASSERT(IsRegExpObject(args[0]));
- MOZ_ASSERT(args[1].isString());
-
- RootedObject regexp(cx, &args[0].toObject());
- RootedString string(cx, args[1].toString());
-
- size_t ignored = 0;
- RegExpRunStatus status = ExecuteRegExp(cx, regexp, string, 0,
- nullptr, &ignored, DontUpdateRegExpStatics);
- args.rval().setBoolean(status == RegExpRunStatus_Success);
- return status != RegExpRunStatus_Error;
-}
-
static void
GetParen(JSLinearString* matched, const JS::Value& capture, JSSubString* out)
{
diff --git a/js/src/builtin/RegExp.h b/js/src/builtin/RegExp.h
index f66c9b1b81..c0a7d59f77 100644
--- a/js/src/builtin/RegExp.h
+++ b/js/src/builtin/RegExp.h
@@ -18,10 +18,6 @@ namespace js {
JSObject*
InitRegExpClass(JSContext* cx, HandleObject obj);
-// Whether RegExp statics should be updated with the input and results of a
-// regular expression execution.
-enum RegExpStaticsUpdate { UpdateRegExpStatics, DontUpdateRegExpStatics };
-
/*
* Legacy behavior of ExecuteRegExp(), which is baked into the JSAPI.
*
@@ -72,22 +68,6 @@ intrinsic_GetStringDataProperty(JSContext* cx, unsigned argc, Value* vp);
*/
/*
- * Behaves like regexp.exec(string), but doesn't set RegExp statics.
- *
- * Usage: match = regexp_exec_no_statics(regexp, string)
- */
-extern MOZ_MUST_USE bool
-regexp_exec_no_statics(JSContext* cx, unsigned argc, Value* vp);
-
-/*
- * Behaves like regexp.test(string), but doesn't set RegExp statics.
- *
- * Usage: does_match = regexp_test_no_statics(regexp, string)
- */
-extern MOZ_MUST_USE bool
-regexp_test_no_statics(JSContext* cx, unsigned argc, Value* vp);
-
-/*
* Behaves like RegExp(pattern, flags).
* |pattern| should be a RegExp object, |flags| should be a raw integer value.
* Must be called without |new|.
diff --git a/js/src/builtin/String.js b/js/src/builtin/String.js
index b0928fe88c..e1c32482ae 100644
--- a/js/src/builtin/String.js
+++ b/js/src/builtin/String.js
@@ -731,6 +731,88 @@ function String_localeCompare(that) {
return intl_CompareStrings(collator, S, That);
}
+/**
+ * 13.1.2 String.prototype.toLocaleLowerCase ( [ locales ] )
+ *
+ * ES2017 Intl draft rev 94045d234762ad107a3d09bb6f7381a65f1a2f9b
+ */
+function String_toLocaleLowerCase() {
+ // Step 1.
+ RequireObjectCoercible(this);
+
+ // Step 2.
+ var string = ToString(this);
+
+ // Handle the common cases (no locales argument or a single string
+ // argument) first.
+ var locales = arguments.length > 0 ? arguments[0] : undefined;
+ var requestedLocale;
+ if (locales === undefined) {
+ // Steps 3, 6.
+ requestedLocale = undefined;
+ } else if (typeof locales === "string") {
+ // Steps 3, 5.
+ requestedLocale = intl_ValidateAndCanonicalizeLanguageTag(locales, false);
+ } else {
+ // Step 3.
+ var requestedLocales = CanonicalizeLocaleList(locales);
+
+ // Steps 4-6.
+ requestedLocale = requestedLocales.length > 0 ? requestedLocales[0] : undefined;
+ }
+
+ // Trivial case: When the input is empty, directly return the empty string.
+ if (string.length === 0)
+ return "";
+
+ if (requestedLocale === undefined)
+ requestedLocale = DefaultLocale();
+
+ // Steps 7-16.
+ return intl_toLocaleLowerCase(string, requestedLocale);
+}
+
+/**
+ * 13.1.3 String.prototype.toLocaleUpperCase ( [ locales ] )
+ *
+ * ES2017 Intl draft rev 94045d234762ad107a3d09bb6f7381a65f1a2f9b
+ */
+function String_toLocaleUpperCase() {
+ // Step 1.
+ RequireObjectCoercible(this);
+
+ // Step 2.
+ var string = ToString(this);
+
+ // Handle the common cases (no locales argument or a single string
+ // argument) first.
+ var locales = arguments.length > 0 ? arguments[0] : undefined;
+ var requestedLocale;
+ if (locales === undefined) {
+ // Steps 3, 6.
+ requestedLocale = undefined;
+ } else if (typeof locales === "string") {
+ // Steps 3, 5.
+ requestedLocale = intl_ValidateAndCanonicalizeLanguageTag(locales, false);
+ } else {
+ // Step 3.
+ var requestedLocales = CanonicalizeLocaleList(locales);
+
+ // Steps 4-6.
+ requestedLocale = requestedLocales.length > 0 ? requestedLocales[0] : undefined;
+ }
+
+ // Trivial case: When the input is empty, directly return the empty string.
+ if (string.length === 0)
+ return "";
+
+ if (requestedLocale === undefined)
+ requestedLocale = DefaultLocale();
+
+ // Steps 7-16.
+ return intl_toLocaleUpperCase(string, requestedLocale);
+}
+
/* ES6 Draft May 22, 2014 21.1.2.4 */
function String_static_raw(callSite, ...substitutions) {
// Step 1 (implicit).
@@ -1014,13 +1096,15 @@ _SetCanonicalName(String_static_trimEnd, "trimEnd");
function String_static_toLocaleLowerCase(string) {
if (arguments.length < 1)
ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.toLocaleLowerCase');
- return callFunction(std_String_toLocaleLowerCase, string);
+ var locales = arguments.length > 1 ? arguments[1] : undefined;
+ return callFunction(String_toLocaleLowerCase, string, locales);
}
function String_static_toLocaleUpperCase(string) {
if (arguments.length < 1)
ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.toLocaleUpperCase');
- return callFunction(std_String_toLocaleUpperCase, string);
+ var locales = arguments.length > 1 ? arguments[1] : undefined;
+ return callFunction(String_toLocaleUpperCase, string, locales);
}
function String_static_normalize(string) {
diff --git a/js/src/builtin/SymbolObject.cpp b/js/src/builtin/SymbolObject.cpp
index effcf4f954..0f1e8164d5 100644
--- a/js/src/builtin/SymbolObject.cpp
+++ b/js/src/builtin/SymbolObject.cpp
@@ -50,7 +50,7 @@ const JSFunctionSpec SymbolObject::staticMethods[] = {
};
JSObject*
-SymbolObject::initClass(JSContext* cx, HandleObject obj)
+SymbolObject::initClass(JSContext* cx, HandleObject obj, bool defineMembers)
{
Handle<GlobalObject*> global = obj.as<GlobalObject>();
@@ -66,25 +66,33 @@ SymbolObject::initClass(JSContext* cx, HandleObject obj)
if (!ctor)
return nullptr;
- // Define the well-known symbol properties, such as Symbol.iterator.
- ImmutablePropertyNamePtr* names = cx->names().wellKnownSymbolNames();
- RootedValue value(cx);
- unsigned attrs = JSPROP_READONLY | JSPROP_PERMANENT;
- WellKnownSymbols* wks = cx->runtime()->wellKnownSymbols;
- for (size_t i = 0; i < JS::WellKnownSymbolLimit; i++) {
- value.setSymbol(wks->get(i));
- if (!NativeDefineProperty(cx, ctor, names[i], value, nullptr, nullptr, attrs))
- return nullptr;
+ if (defineMembers) {
+ // Define the well-known symbol properties, such as Symbol.iterator.
+ ImmutablePropertyNamePtr* names = cx->names().wellKnownSymbolNames();
+ RootedValue value(cx);
+ unsigned attrs = JSPROP_READONLY | JSPROP_PERMANENT;
+ WellKnownSymbols* wks = cx->runtime()->wellKnownSymbols;
+ for (size_t i = 0; i < JS::WellKnownSymbolLimit; i++) {
+ value.setSymbol(wks->get(i));
+ if (!NativeDefineProperty(cx, ctor, names[i], value, nullptr, nullptr, attrs))
+ return nullptr;
+ }
}
- if (!LinkConstructorAndPrototype(cx, ctor, proto) ||
- !DefinePropertiesAndFunctions(cx, proto, properties, methods) ||
- !DefineToStringTag(cx, proto, cx->names().Symbol) ||
- !DefinePropertiesAndFunctions(cx, ctor, nullptr, staticMethods) ||
- !GlobalObject::initBuiltinConstructor(cx, global, JSProto_Symbol, ctor, proto))
- {
+ if (!LinkConstructorAndPrototype(cx, ctor, proto))
return nullptr;
+
+ if (defineMembers) {
+ if (!DefinePropertiesAndFunctions(cx, proto, properties, methods) ||
+ !DefineToStringTag(cx, proto, cx->names().Symbol) ||
+ !DefinePropertiesAndFunctions(cx, ctor, nullptr, staticMethods))
+ {
+ return nullptr;
+ }
}
+
+ if (!GlobalObject::initBuiltinConstructor(cx, global, JSProto_Symbol, ctor, proto))
+ return nullptr;
return proto;
}
@@ -258,5 +266,11 @@ SymbolObject::descriptionGetter(JSContext* cx, unsigned argc, Value* vp)
JSObject*
js::InitSymbolClass(JSContext* cx, HandleObject obj)
{
- return SymbolObject::initClass(cx, obj);
+ return SymbolObject::initClass(cx, obj, true);
+}
+
+JSObject*
+js::InitBareSymbolCtor(JSContext* cx, HandleObject obj)
+{
+ return SymbolObject::initClass(cx, obj, false);
}
diff --git a/js/src/builtin/SymbolObject.h b/js/src/builtin/SymbolObject.h
index 01099100b1..54d187fb59 100644
--- a/js/src/builtin/SymbolObject.h
+++ b/js/src/builtin/SymbolObject.h
@@ -21,7 +21,7 @@ class SymbolObject : public NativeObject
static const Class class_;
- static JSObject* initClass(JSContext* cx, js::HandleObject obj);
+ static JSObject* initClass(JSContext* cx, js::HandleObject obj, bool defineMembers);
/*
* Creates a new Symbol object boxing the given primitive Symbol. The
@@ -63,6 +63,9 @@ class SymbolObject : public NativeObject
extern JSObject*
InitSymbolClass(JSContext* cx, HandleObject obj);
+extern JSObject*
+InitBareSymbolCtor(JSContext* cx, HandleObject obj);
+
} /* namespace js */
#endif /* builtin_SymbolObject_h */
diff --git a/js/src/builtin/TypedArray.js b/js/src/builtin/TypedArray.js
index 5b7a1dfc22..22023aa7ca 100644
--- a/js/src/builtin/TypedArray.js
+++ b/js/src/builtin/TypedArray.js
@@ -1347,6 +1347,91 @@ function TypedArrayAt(index) {
return obj[k];
}
+// https://github.com/tc39/proposal-array-find-from-last
+// %TypedArray%.prototype.findLast ( predicate, thisArg )
+function TypedArrayFindLast(predicate/*, thisArg*/) {
+ // Step 1.
+ var O = this;
+
+ // Step 2.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Step 3.
+ var len;
+ if (isTypedArray) {
+ len = TypedArrayLength(O);
+ } else {
+ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+ }
+
+ // Step 4.
+ if (arguments.length === 0) {
+ ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "%TypedArray%.prototype.findLast");
+ }
+ if (!IsCallable(predicate)) {
+ ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, predicate));
+ }
+
+ var thisArg = arguments.length > 1 ? arguments[1] : void 0;
+
+ // Steps 5-6.
+ for (var k = len - 1; k >= 0; k--) {
+ // Steps 6.a-b.
+ var kValue = O[k];
+
+ // Steps 6.c-d.
+ if (callContentFunction(predicate, thisArg, kValue, k, O)) {
+ return kValue;
+ }
+ }
+
+ // Step 7.
+ return undefined;
+}
+
+// https://github.com/tc39/proposal-array-find-from-last
+// %TypedArray%.prototype.findLastIndex ( predicate, thisArg )
+function TypedArrayFindLastIndex(predicate/*, thisArg*/) {
+ // Step 1.
+ var O = this;
+
+ // Step 2.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Step 3.
+ var len;
+ if (isTypedArray) {
+ len = TypedArrayLength(O);
+ } else {
+ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+ }
+
+ // Step 4.
+ if (arguments.length === 0) {
+ ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "%TypedArray%.prototype.findLastIndex");
+ }
+ if (!IsCallable(predicate)) {
+ ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, predicate));
+ }
+
+ var thisArg = arguments.length > 1 ? arguments[1] : void 0;
+
+ // Steps 5-6.
+ for (var k = len - 1; k >= 0; k--) {
+ // Steps 6.a-f.
+ if (callContentFunction(predicate, thisArg, O[k], k, O)) {
+ return k;
+ }
+ }
+
+ // Step 7.
+ return -1;
+}
+
// ES6 draft rev30 (2014/12/24) 22.2.3.30 %TypedArray%.prototype.values()
function TypedArrayValues() {
// Step 1.
diff --git a/js/src/builtin/Utilities.js b/js/src/builtin/Utilities.js
index 259fef7ee0..51c5a574fd 100644
--- a/js/src/builtin/Utilities.js
+++ b/js/src/builtin/Utilities.js
@@ -50,6 +50,8 @@
// Do not create an alias to a self-hosted builtin, otherwise it will be cloned
// twice.
//
+// Symbol is a bare constructor without properties or methods.
+var std_Symbol = Symbol;
// WeakMap is a bare constructor without properties or methods.
var std_WeakMap = WeakMap;
// StopIteration is a bare constructor without properties or methods.
@@ -78,12 +80,6 @@ MakeConstructible(Record, {});
/********** Abstract operations defined in ECMAScript Language Specification **********/
-/* Spec: ECMAScript Language Specification, 5.1 edition, 8.12.6 and 11.8.7 */
-function HasProperty(o, p) {
- return p in o;
-}
-
-
/* Spec: ECMAScript Language Specification, 5.1 edition, 9.2 and 11.4.9 */
function ToBoolean(v) {
return !!v;
diff --git a/js/src/builtin/intl/Collator.cpp b/js/src/builtin/intl/Collator.cpp
index 0d2ac1df02..450c654620 100644
--- a/js/src/builtin/intl/Collator.cpp
+++ b/js/src/builtin/intl/Collator.cpp
@@ -8,12 +8,14 @@
#include "builtin/intl/Collator.h"
#include "mozilla/Assertions.h"
+#include "mozilla/Span.h"
#include "jsapi.h"
#include "jscntxt.h"
#include "builtin/intl/CommonFunctions.h"
#include "builtin/intl/ICUHeader.h"
+#include "builtin/intl/LanguageTag.h"
#include "builtin/intl/ScopedICUObject.h"
#include "builtin/intl/SharedIntlData.h"
#include "js/TypeDecls.h"
@@ -24,7 +26,6 @@
#include "jsobjinlines.h"
using namespace js;
-using js::intl::GetAvailableLocales;
using js::intl::IcuLocale;
using js::intl::ReportInternalError;
using js::intl::SharedIntlData;
@@ -79,64 +80,36 @@ static const JSFunctionSpec collator_methods[] = {
* ES2017 Intl draft rev 94045d234762ad107a3d09bb6f7381a65f1a2f9b
*/
static bool
-Collator(JSContext* cx, const CallArgs& args, bool construct)
+Collator(JSContext* cx, const CallArgs& args)
{
- RootedObject obj(cx);
-
- // We're following ECMA-402 1st Edition when Collator is called because of
- // backward compatibility issues.
- // See https://github.com/tc39/ecma402/issues/57
- if (!construct) {
- // ES Intl 1st ed., 10.1.2.1 step 3
- JSObject* intl = GlobalObject::getOrCreateIntlObject(cx, cx->global());
- if (!intl)
- return false;
- RootedValue self(cx, args.thisv());
- if (!self.isUndefined() && (!self.isObject() || self.toObject() != *intl)) {
- // ES Intl 1st ed., 10.1.2.1 step 4
- obj = ToObject(cx, self);
- if (!obj)
- return false;
-
- // ES Intl 1st ed., 10.1.2.1 step 5
- bool extensible;
- if (!IsExtensible(cx, obj, &extensible))
- return false;
- if (!extensible)
- return Throw(cx, obj, JSMSG_OBJECT_NOT_EXTENSIBLE);
- } else {
- // ES Intl 1st ed., 10.1.2.1 step 3.a
- construct = true;
- }
- }
- if (construct) {
- // Steps 2-5 (Inlined 9.1.14, OrdinaryCreateFromConstructor).
- RootedObject proto(cx);
- if (args.isConstructing() && !GetPrototypeFromCallableConstructor(cx, args, &proto))
- return false;
+ // Step 1 (Handled by OrdinaryCreateFromConstructor fallback code).
- if (!proto) {
- proto = GlobalObject::getOrCreateCollatorPrototype(cx, cx->global());
- if (!proto)
- return false;
- }
+ // Steps 2-5 (Inlined 9.1.14, OrdinaryCreateFromConstructor).
+ RootedObject proto(cx);
+ if (args.isConstructing() && !GetPrototypeFromCallableConstructor(cx, args, &proto))
+ return false;
- obj = NewObjectWithGivenProto<CollatorObject>(cx, proto);
- if (!obj)
+ if (!proto) {
+ proto = GlobalObject::getOrCreateCollatorPrototype(cx, cx->global());
+ if (!proto)
return false;
-
- obj->as<NativeObject>().setReservedSlot(CollatorObject::INTERNALS_SLOT, NullValue());
- obj->as<NativeObject>().setReservedSlot(CollatorObject::UCOLLATOR_SLOT, PrivateValue(nullptr));
}
- RootedValue locales(cx, args.length() > 0 ? args[0] : UndefinedValue());
- RootedValue options(cx, args.length() > 1 ? args[1] : UndefinedValue());
+ Rooted<CollatorObject*> collator(cx, NewObjectWithGivenProto<CollatorObject>(cx, proto));
+ if (!collator)
+ return false;
+
+ collator->setReservedSlot(CollatorObject::INTERNALS_SLOT, NullValue());
+ collator->setReservedSlot(CollatorObject::UCOLLATOR_SLOT, PrivateValue(nullptr));
+
+ RootedValue locales(cx, args.get(0));
+ RootedValue options(cx, args.get(1));
// Step 6.
- if (!intl::InitializeObject(cx, obj, cx->names().InitializeCollator, locales, options))
+ if (!intl::InitializeObject(cx, collator, cx->names().InitializeCollator, locales, options))
return false;
- args.rval().setObject(*obj);
+ args.rval().setObject(*collator);
return true;
}
@@ -144,7 +117,7 @@ static bool
Collator(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
- return Collator(cx, args, args.isConstructing());
+ return Collator(cx, args);
}
bool
@@ -153,9 +126,8 @@ js::intl_Collator(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 2);
MOZ_ASSERT(!args.isConstructing());
- // intl_Collator is an intrinsic for self-hosted JavaScript, so it cannot
- // be used with "new", but it still has to be treated as a constructor.
- return Collator(cx, args, true);
+
+ return Collator(cx, args);
}
void
@@ -163,15 +135,9 @@ js::CollatorObject::finalize(FreeOp* fop, JSObject* obj)
{
MOZ_ASSERT(fop->onMainThread());
- // This is-undefined check shouldn't be necessary, but for internal
- // brokenness in object allocation code. For the moment, hack around it by
- // explicitly guarding against the possibility of the reserved slot not
- // containing a private. See bug 949220.
- const Value& slot = obj->as<NativeObject>().getReservedSlot(CollatorObject::UCOLLATOR_SLOT);
- if (!slot.isUndefined()) {
- if (UCollator* coll = static_cast<UCollator*>(slot.toPrivate()))
- ucol_close(coll);
- }
+ const Value& slot = obj->as<CollatorObject>().getReservedSlot(CollatorObject::UCOLLATOR_SLOT);
+ if (UCollator* coll = static_cast<UCollator*>(slot.toPrivate()))
+ ucol_close(coll);
}
JSObject*
@@ -182,10 +148,9 @@ js::CreateCollatorPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObjec
if (!ctor)
return nullptr;
- RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global, &CollatorObject::class_));
+ RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
if (!proto)
return nullptr;
- proto->setReservedSlot(CollatorObject::UCOLLATOR_SLOT, PrivateValue(nullptr));
if (!LinkConstructorAndPrototype(cx, ctor, proto))
return nullptr;
@@ -213,14 +178,6 @@ js::CreateCollatorPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObjec
return nullptr;
}
- RootedValue options(cx);
- if (!intl::CreateDefaultOptions(cx, &options))
- return nullptr;
-
- // 10.2.1 and 10.3
- if (!intl::InitializeObject(cx, proto, cx->names().InitializeCollator, UndefinedHandleValue, options))
- return nullptr;
-
// 8.1
RootedValue ctorValue(cx, ObjectValue(*ctor));
if (!DefineProperty(cx, Intl, cx->names().Collator, ctorValue, nullptr, nullptr, 0))
@@ -230,19 +187,6 @@ js::CreateCollatorPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObjec
}
bool
-js::intl_Collator_availableLocales(JSContext* cx, unsigned argc, Value* vp)
-{
- CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 0);
-
- RootedValue result(cx);
- if (!GetAvailableLocales(cx, ucol_countAvailable, ucol_getAvailable, &result))
- return false;
- args.rval().set(result);
- return true;
-}
-
-bool
js::intl_availableCollations(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
@@ -271,6 +215,14 @@ js::intl_availableCollations(JSContext* cx, unsigned argc, Value* vp)
return false;
uint32_t index = 0;
+
+ // The first element of the collations array must be |null| per
+ // ES2017 Intl, 10.2.3 Internal Slots.
+ if (!DefineElement(cx, collations, index++, NullHandleValue))
+ return false;
+
+ RootedValue element(cx);
+
for (uint32_t i = 0; i < count; i++) {
const char* collation = uenum_next(values, nullptr, &status);
if (U_FAILURE(status)) {
@@ -285,21 +237,11 @@ js::intl_availableCollations(JSContext* cx, unsigned argc, Value* vp)
if (StringsAreEqual(collation, "standard") || StringsAreEqual(collation, "search"))
continue;
- // ICU returns old-style keyword values; map them to BCP 47 equivalents
- // (see http://bugs.icu-project.org/trac/ticket/9620).
- if (StringsAreEqual(collation, "dictionary"))
- collation = "dict";
- else if (StringsAreEqual(collation, "gb2312han"))
- collation = "gb2312";
- else if (StringsAreEqual(collation, "phonebook"))
- collation = "phonebk";
- else if (StringsAreEqual(collation, "traditional"))
- collation = "trad";
-
- RootedString jscollation(cx, JS_NewStringCopyZ(cx, collation));
+ // ICU returns old-style keyword values; map them to BCP 47 equivalents.
+ JSString* jscollation = JS_NewStringCopyZ(cx, uloc_toUnicodeLocaleType("co", collation));
if (!jscollation)
return false;
- RootedValue element(cx, StringValue(jscollation));
+ element = StringValue(jscollation);
if (!DefineElement(cx, collations, index++, element))
return false;
}
@@ -313,7 +255,7 @@ js::intl_availableCollations(JSContext* cx, unsigned argc, Value* vp)
* of the given Collator.
*/
static UCollator*
-NewUCollator(JSContext* cx, HandleObject collator)
+NewUCollator(JSContext* cx, Handle<CollatorObject*> collator)
{
RootedValue value(cx);
@@ -343,32 +285,33 @@ NewUCollator(JSContext* cx, HandleObject collator)
return nullptr;
if (StringsAreEqual(usage, "search")) {
// ICU expects search as a Unicode locale extension on locale.
- // Unicode locale extensions must occur before private use extensions.
- const char* oldLocale = locale.ptr();
- const char* p;
- size_t index;
- size_t localeLen = strlen(oldLocale);
- if ((p = strstr(oldLocale, "-x-")))
- index = p - oldLocale;
- else
- index = localeLen;
-
- const char* insert;
- if ((p = strstr(oldLocale, "-u-")) && static_cast<size_t>(p - oldLocale) < index) {
- index = p - oldLocale + 2;
- insert = "-co-search";
- } else {
- insert = "-u-co-search";
+ intl::LanguageTag tag(cx);
+ if (!intl::LanguageTagParser::parse(
+ cx, mozilla::MakeCStringSpan(locale.ptr()), tag)) {
+ return nullptr;
+ }
+
+ JS::RootedVector<intl::UnicodeExtensionKeyword> keywords(cx);
+
+ if (!keywords.emplaceBack("co", cx->names().search)) {
+ return nullptr;
}
- size_t insertLen = strlen(insert);
- char* newLocale = cx->pod_malloc<char>(localeLen + insertLen + 1);
- if (!newLocale)
+
+ // |ApplyUnicodeExtensionToTag| applies the new keywords to the front of
+ // the Unicode extension subtag. We're then relying on ICU to follow RFC
+ // 6067, which states that any trailing keywords using the same key
+ // should be ignored.
+ if (!intl::ApplyUnicodeExtensionToTag(cx, tag, keywords)) {
return nullptr;
- memcpy(newLocale, oldLocale, index);
- memcpy(newLocale + index, insert, insertLen);
- memcpy(newLocale + index + insertLen, oldLocale + index, localeLen - index + 1); // '\0'
+ }
+
locale.clear();
- locale.initBytes(newLocale);
+ locale.encodeLatin1(cx, tag.toString(cx));
+ if (!locale) {
+ return nullptr;
+ }
+ } else {
+ MOZ_ASSERT(StringsAreEqual(usage, "sort"));
}
// We don't need to look at the collation property - it can only be set
@@ -417,8 +360,10 @@ NewUCollator(JSContext* cx, HandleObject collator)
uCaseFirst = UCOL_UPPER_FIRST;
else if (StringsAreEqual(caseFirst, "lower"))
uCaseFirst = UCOL_LOWER_FIRST;
- else
+ else {
MOZ_ASSERT(StringsAreEqual(caseFirst, "false"));
+ uCaseFirst = UCOL_OFF;
+ }
}
UErrorCode status = U_ZERO_ERROR;
@@ -490,40 +435,38 @@ js::intl_CompareStrings(JSContext* cx, unsigned argc, Value* vp)
MOZ_ASSERT(args[2].isString());
Rooted<CollatorObject*> collator(cx, &args[0].toObject().as<CollatorObject>());
-
- // Obtain a UCollator object, cached if possible.
+
+ // Obtain a cached UCollator object.
// XXX Does this handle Collator instances from other globals correctly?
- bool isCollatorInstance = collator->getClass() == &CollatorObject::class_;
- UCollator* coll;
- if (isCollatorInstance) {
- void* priv = collator->getReservedSlot(CollatorObject::UCOLLATOR_SLOT).toPrivate();
- coll = static_cast<UCollator*>(priv);
- if (!coll) {
- coll = NewUCollator(cx, collator);
- if (!coll)
- return false;
- collator->setReservedSlot(CollatorObject::UCOLLATOR_SLOT, PrivateValue(coll));
- }
- } else {
- // There's no good place to cache the ICU collator for an object
- // that has been initialized as a Collator but is not a Collator
- // instance. One possibility might be to add a Collator instance as an
- // internal property to each such object.
+ void* priv = collator->getReservedSlot(CollatorObject::UCOLLATOR_SLOT).toPrivate();
+ UCollator* coll = static_cast<UCollator*>(priv);
+ if (!coll) {
coll = NewUCollator(cx, collator);
if (!coll)
return false;
+ collator->setReservedSlot(CollatorObject::UCOLLATOR_SLOT, PrivateValue(coll));
}
// Use the UCollator to actually compare the strings.
RootedString str1(cx, args[1].toString());
RootedString str2(cx, args[2].toString());
- RootedValue result(cx);
- bool success = intl_CompareStrings(cx, coll, str1, str2, &result);
+ return intl_CompareStrings(cx, coll, str1, str2, args.rval());
+}
- if (!isCollatorInstance)
- ucol_close(coll);
- if (!success)
+bool
+js::intl_isUpperCaseFirst(JSContext* cx, unsigned argc, Value* vp)
+{
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 1);
+ MOZ_ASSERT(args[0].isString());
+
+ SharedIntlData& sharedIntlData = cx->sharedIntlData;
+
+ RootedString locale(cx, args[0].toString());
+ bool isUpperFirst;
+ if (!sharedIntlData.isUpperCaseFirst(cx, locale, &isUpperFirst))
return false;
- args.rval().set(result);
+
+ args.rval().setBoolean(isUpperFirst);
return true;
}
diff --git a/js/src/builtin/intl/Collator.h b/js/src/builtin/intl/Collator.h
index 4c6889b35b..757740bd3d 100644
--- a/js/src/builtin/intl/Collator.h
+++ b/js/src/builtin/intl/Collator.h
@@ -53,17 +53,6 @@ extern MOZ_MUST_USE bool
intl_Collator(JSContext* cx, unsigned argc, Value* vp);
/**
- * Returns an object indicating the supported locales for collation
- * by having a true-valued property for each such locale with the
- * canonicalized language tag as the property name. The object has no
- * prototype.
- *
- * Usage: availableLocales = intl_Collator_availableLocales()
- */
-extern MOZ_MUST_USE bool
-intl_Collator_availableLocales(JSContext* cx, unsigned argc, Value* vp);
-
-/**
* Returns an array with the collation type identifiers per Unicode
* Technical Standard 35, Unicode Locale Data Markup Language, for the
* collations supported for the given locale. "standard" and "search" are
@@ -87,6 +76,15 @@ intl_availableCollations(JSContext* cx, unsigned argc, Value* vp);
extern MOZ_MUST_USE bool
intl_CompareStrings(JSContext* cx, unsigned argc, Value* vp);
+/**
+ * Returns true if the given locale sorts upper-case before lower-case
+ * characters.
+ *
+ * Usage: result = intl_isUpperCaseFirst(locale)
+ */
+extern MOZ_MUST_USE bool
+intl_isUpperCaseFirst(JSContext* cx, unsigned argc, Value* vp);
+
} // namespace js
diff --git a/js/src/builtin/intl/Collator.js b/js/src/builtin/intl/Collator.js
index 48040e1abd..b0f260eaa1 100644
--- a/js/src/builtin/intl/Collator.js
+++ b/js/src/builtin/intl/Collator.js
@@ -6,18 +6,6 @@
/**
- * Mapping from Unicode extension keys for collation to options properties,
- * their types and permissible values.
- *
- * Spec: ECMAScript Internationalization API Specification, 10.1.1.
- */
-var collatorKeyMappings = {
- kn: {property: "numeric", type: "boolean"},
- kf: {property: "caseFirst", type: "string", values: ["upper", "lower", "false"]}
-};
-
-
-/**
* Compute an internal properties object from |lazyCollatorData|.
*/
function resolveCollatorInternals(lazyCollatorData)
@@ -26,80 +14,64 @@ function resolveCollatorInternals(lazyCollatorData)
var internalProps = std_Object_create(null);
- // Step 7.
- internalProps.usage = lazyCollatorData.usage;
-
- // Step 8.
var Collator = collatorInternalProperties;
- // Step 9.
+ // Step 5.
+ internalProps.usage = lazyCollatorData.usage;
+
+ // Steps 6-7.
var collatorIsSorting = lazyCollatorData.usage === "sort";
var localeData = collatorIsSorting
? Collator.sortLocaleData
: Collator.searchLocaleData;
// Compute effective locale.
- // Step 14.
+ // Step 16.
var relevantExtensionKeys = Collator.relevantExtensionKeys;
- // Step 15.
- var r = ResolveLocale(callFunction(Collator.availableLocales, Collator),
+ // Step 17.
+ var r = ResolveLocale("Collator",
lazyCollatorData.requestedLocales,
lazyCollatorData.opt,
relevantExtensionKeys,
localeData);
- // Step 16.
+ // Step 18.
internalProps.locale = r.locale;
- // Steps 17-19.
- var key, property, value, mapping;
- var i = 0, len = relevantExtensionKeys.length;
- while (i < len) {
- // Step 19.a.
- key = relevantExtensionKeys[i];
- if (key === "co") {
- // Step 19.b.
- property = "collation";
- value = r.co === null ? "default" : r.co;
- } else {
- // Step 19.c.
- mapping = collatorKeyMappings[key];
- property = mapping.property;
- value = r[key];
- if (mapping.type === "boolean")
- value = value === "true";
- }
+ // Step 19.
+ var collation = r.co;
- // Step 19.d.
- internalProps[property] = value;
+ // Step 20.
+ if (collation === null)
+ collation = "default";
- // Step 19.e.
- i++;
- }
+ // Step 21.
+ internalProps.collation = collation;
+
+ // Step 22.
+ internalProps.numeric = r.kn === "true";
+
+ // Step 23.
+ internalProps.caseFirst = r.kf;
// Compute remaining collation options.
- // Steps 21-22.
+ // Step 25.
var s = lazyCollatorData.rawSensitivity;
if (s === undefined) {
- if (collatorIsSorting) {
- // Step 21.a.
- s = "variant";
- } else {
- // Step 21.b.
- var dataLocale = r.dataLocale;
- var dataLocaleData = localeData(dataLocale);
- s = dataLocaleData.sensitivity;
- }
+ // In theory the default sensitivity for the "search" collator is
+ // locale dependent; in reality the CLDR/ICU default strength is
+ // always tertiary. Therefore use "variant" as the default value for
+ // both collation modes.
+ s = "variant";
}
+
+ // Step 26.
internalProps.sensitivity = s;
- // Step 24.
+ // Step 28.
internalProps.ignorePunctuation = lazyCollatorData.ignorePunctuation;
- // Step 25.
- internalProps.boundFormat = undefined;
-
// The caller is responsible for associating |internalProps| with the right
// object using |setInternalProperties|.
return internalProps;
@@ -107,11 +79,13 @@ function resolveCollatorInternals(lazyCollatorData)
/**
- * Returns an object containing the Collator internal properties of |obj|, or
- * throws a TypeError if |obj| isn't Collator-initialized.
+ * Returns an object containing the Collator internal properties of |obj|.
*/
-function getCollatorInternals(obj, methodName) {
- var internals = getIntlObjectInternals(obj, "Collator", methodName);
+function getCollatorInternals(obj) {
+ assert(IsObject(obj), "getCollatorInternals called with non-object");
+ assert(IsCollator(obj), "getCollatorInternals called with non-Collator");
+
+ var internals = getIntlObjectInternals(obj);
assert(internals.type === "Collator", "bad type escaped getIntlObjectInternals");
// If internal properties have already been computed, use them.
@@ -138,14 +112,8 @@ function getCollatorInternals(obj, methodName) {
* Spec: ECMAScript Internationalization API Specification, 10.1.1.
*/
function InitializeCollator(collator, locales, options) {
- assert(IsObject(collator), "InitializeCollator");
-
- // Step 1.
- if (isInitializedIntlObject(collator))
- ThrowTypeError(JSMSG_INTL_OBJECT_REINITED);
-
- // Step 2.
- var internals = initializeIntlObject(collator);
+ assert(IsObject(collator), "InitializeCollator called with non-object");
+ assert(IsCollator(collator), "InitializeCollator called with non-Collator");
// Lazy Collator data has the following structure:
//
@@ -167,11 +135,11 @@ function InitializeCollator(collator, locales, options) {
// subset of them.
var lazyCollatorData = std_Object_create(null);
- // Step 3.
+ // Step 1.
var requestedLocales = CanonicalizeLocaleList(locales);
lazyCollatorData.requestedLocales = requestedLocales;
- // Steps 4-5.
+ // Steps 2-3.
//
// If we ever need more speed here at startup, we should try to detect the
// case where |options === undefined| and Object.prototype hasn't been
@@ -184,42 +152,43 @@ function InitializeCollator(collator, locales, options) {
options = ToObject(options);
// Compute options that impact interpretation of locale.
- // Step 6.
+ // Step 4.
var u = GetOption(options, "usage", "string", ["sort", "search"], "sort");
lazyCollatorData.usage = u;
- // Step 10.
+ // Step 8.
var opt = new Record();
lazyCollatorData.opt = opt;
- // Steps 11-12.
+ // Steps 9-10.
var matcher = GetOption(options, "localeMatcher", "string", ["lookup", "best fit"], "best fit");
opt.localeMatcher = matcher;
- // Step 13, unrolled.
+ // Steps 11-13.
var numericValue = GetOption(options, "numeric", "boolean", undefined, undefined);
if (numericValue !== undefined)
numericValue = numericValue ? 'true' : 'false';
opt.kn = numericValue;
+ // Steps 14-15.
var caseFirstValue = GetOption(options, "caseFirst", "string", ["upper", "lower", "false"], undefined);
opt.kf = caseFirstValue;
// Compute remaining collation options.
- // Step 20.
+ // Step 24.
var s = GetOption(options, "sensitivity", "string",
["base", "accent", "case", "variant"], undefined);
lazyCollatorData.rawSensitivity = s;
- // Step 23.
+ // Step 27.
var ip = GetOption(options, "ignorePunctuation", "boolean", undefined, false);
lazyCollatorData.ignorePunctuation = ip;
- // Step 26.
+ // Step 29.
//
// We've done everything that must be done now: mark the lazy data as fully
// computed and install it.
- setLazyData(internals, "Collator", lazyCollatorData);
+ initializeIntlObject(collator, "Collator", lazyCollatorData);
}
@@ -233,9 +202,13 @@ function InitializeCollator(collator, locales, options) {
function Intl_Collator_supportedLocalesOf(locales /*, options*/) {
var options = arguments.length > 1 ? arguments[1] : undefined;
- var availableLocales = callFunction(collatorInternalProperties.availableLocales,
- collatorInternalProperties);
+ // Step 1.
+ var availableLocales = "Collator";
+
+ // Step 2.
var requestedLocales = CanonicalizeLocaleList(locales);
+
+ // Step 3.
return SupportedLocales(availableLocales, requestedLocales, options);
}
@@ -248,46 +221,106 @@ function Intl_Collator_supportedLocalesOf(locales /*, options*/) {
var collatorInternalProperties = {
sortLocaleData: collatorSortLocaleData,
searchLocaleData: collatorSearchLocaleData,
- _availableLocales: null,
- availableLocales: function()
- {
- var locales = this._availableLocales;
- if (locales)
- return locales;
-
- locales = intl_Collator_availableLocales();
- addSpecialMissingLanguageTags(locales);
- return (this._availableLocales = locales);
- },
- relevantExtensionKeys: ["co", "kn"]
+ relevantExtensionKeys: ["co", "kn", "kf"]
};
-function collatorSortLocaleData(locale) {
- var collations = intl_availableCollations(locale);
- callFunction(std_Array_unshift, collations, null);
+/**
+ * Returns the actual locale used when a collator for |locale| is constructed.
+ */
+function collatorActualLocale(locale) {
+ assert(typeof locale === "string", "locale should be string");
+
+ // If |locale| is the default locale (e.g. da-DK), but only supported
+ // through a fallback (da), we need to get the actual locale before we
+ // can call intl_isUpperCaseFirst. Also see intl_BestAvailableLocale.
+ return BestAvailableLocaleIgnoringDefault("Collator", locale);
+}
+
+
+/**
+ * Returns the default caseFirst values for the given locale. The first
+ * element in the returned array denotes the default value per ES2017 Intl,
+ * 9.1 Internal slots of Service Constructors.
+ */
+function collatorSortCaseFirst(locale) {
+ var actualLocale = collatorActualLocale(locale);
+ if (intl_isUpperCaseFirst(actualLocale))
+ return ["upper", "false", "lower"];
+
+ // Default caseFirst values for all other languages.
+ return ["false", "lower", "upper"];
+}
+
+
+/**
+ * Returns the default caseFirst value for the given locale.
+ */
+function collatorSortCaseFirstDefault(locale) {
+ var actualLocale = collatorActualLocale(locale);
+ if (intl_isUpperCaseFirst(actualLocale))
+ return "upper";
+
+ // Default caseFirst value for all other languages.
+ return "false";
+}
+
+function collatorSortLocaleData() {
+ /* eslint-disable object-shorthand */
return {
- co: collations,
- kn: ["false", "true"]
+ co: intl_availableCollations,
+ kn: function() {
+ return ["false", "true"];
+ },
+ kf: collatorSortCaseFirst,
+ default: {
+ co: function() {
+ // The first element of the collations array must be |null|
+ // per ES2017 Intl, 10.2.3 Internal Slots.
+ return null;
+ },
+ kn: function() {
+ return "false";
+ },
+ kf: collatorSortCaseFirstDefault,
+ }
};
+ /* eslint-enable object-shorthand */
}
-function collatorSearchLocaleData(locale) {
+function collatorSearchLocaleData() {
+ /* eslint-disable object-shorthand */
return {
- co: [null],
- kn: ["false", "true"],
- // In theory the default sensitivity is locale dependent;
- // in reality the CLDR/ICU default strength is always tertiary.
- sensitivity: "variant"
+ co: function() {
+ return [null];
+ },
+ kn: function() {
+ return ["false", "true"];
+ },
+ kf: function() {
+ return ["false", "lower", "upper"];
+ },
+ default: {
+ co: function() {
+ return null;
+ },
+ kn: function() {
+ return "false";
+ },
+ kf: function() {
+ return "false";
+ },
+ }
};
+ /* eslint-enable object-shorthand */
}
/**
- * Function to be bound and returned by Intl.Collator.prototype.format.
+ * Function to be bound and returned by Intl.Collator.prototype.compare.
*
- * Spec: ECMAScript Internationalization API Specification, 12.3.2.
+ * Spec: ECMAScript Internationalization API Specification, 10.3.3.1.
*/
function collatorCompareToBind(x, y) {
// Steps 1.a.i-ii implemented by ECMAScript declaration binding instantiation,
@@ -307,49 +340,60 @@ function collatorCompareToBind(x, y) {
* than 0 if x > y according to the sort order for the locale and collation
* options of this Collator object.
*
- * Spec: ECMAScript Internationalization API Specification, 10.3.2.
+ * Spec: ECMAScript Internationalization API Specification, 10.3.3.
*/
function Intl_Collator_compare_get() {
- // Check "this Collator object" per introduction of section 10.3.
- var internals = getCollatorInternals(this, "compare");
-
// Step 1.
+ var collator = this;
+
+ // Steps 2-3.
+ if (!IsObject(collator) || !IsCollator(collator))
+ ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, "Collator", "compare", "Collator");
+
+ var internals = getCollatorInternals(collator);
+
+ // Step 4.
if (internals.boundCompare === undefined) {
- // Step 1.a.
- var F = collatorCompareToBind;
+ // Steps 4.a-b.
+ var F = callFunction(FunctionBind, collatorCompareToBind, collator);
- // Step 1.b-d.
- var bc = callFunction(FunctionBind, F, this);
- internals.boundCompare = bc;
+ // Step 4.c.
+ internals.boundCompare = F;
}
- // Step 2.
+ // Step 5.
return internals.boundCompare;
}
+_SetCanonicalName(Intl_Collator_compare_get, "get compare");
/**
* Returns the resolved options for a Collator object.
*
- * Spec: ECMAScript Internationalization API Specification, 10.3.3 and 10.4.
+ * Spec: ECMAScript Internationalization API Specification, 10.3.4.
*/
function Intl_Collator_resolvedOptions() {
- // Check "this Collator object" per introduction of section 10.3.
- var internals = getCollatorInternals(this, "resolvedOptions");
+ // Step 1.
+ var collator = this;
+
+ // Steps 2-3.
+ if (!IsObject(collator) || !IsCollator(collator))
+ ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, "Collator", "resolvedOptions", "Collator");
+ var internals = getCollatorInternals(collator);
+
+ // Steps 4-5.
var result = {
locale: internals.locale,
usage: internals.usage,
sensitivity: internals.sensitivity,
- ignorePunctuation: internals.ignorePunctuation
+ ignorePunctuation: internals.ignorePunctuation,
+ collation: internals.collation,
+ numeric: internals.numeric,
+ caseFirst: internals.caseFirst,
};
- var relevantExtensionKeys = collatorInternalProperties.relevantExtensionKeys;
- for (var i = 0; i < relevantExtensionKeys.length; i++) {
- var key = relevantExtensionKeys[i];
- var property = (key === "co") ? "collation" : collatorKeyMappings[key].property;
- _DefineDataProperty(result, property, internals[property]);
- }
+ // Step 6.
return result;
}
diff --git a/js/src/builtin/intl/CommonFunctions.cpp b/js/src/builtin/intl/CommonFunctions.cpp
index 1de598bd9a..1013d12e0e 100644
--- a/js/src/builtin/intl/CommonFunctions.cpp
+++ b/js/src/builtin/intl/CommonFunctions.cpp
@@ -20,25 +20,9 @@
#include "jsobjinlines.h"
bool
-js::intl::CreateDefaultOptions(JSContext* cx, MutableHandleValue defaultOptions)
-{
- RootedObject options(cx, NewObjectWithGivenProto<PlainObject>(cx, nullptr));
- if (!options)
- return false;
- defaultOptions.setObject(*options);
- return true;
-}
-
-bool
js::intl::InitializeObject(JSContext* cx, HandleObject obj, Handle<PropertyName*> initializer,
HandleValue locales, HandleValue options)
{
- RootedValue initializerValue(cx);
- if (!GlobalObject::getIntrinsicValue(cx, cx->global(), initializer, &initializerValue))
- return false;
- MOZ_ASSERT(initializerValue.isObject());
- MOZ_ASSERT(initializerValue.toObject().is<JSFunction>());
-
FixedInvokeArgs<3> args(cx);
args[0].setObject(*obj);
@@ -47,7 +31,33 @@ js::intl::InitializeObject(JSContext* cx, HandleObject obj, Handle<PropertyName*
RootedValue thisv(cx, NullValue());
RootedValue ignored(cx);
- return js::Call(cx, initializerValue, thisv, args, &ignored);
+ if (!js::CallSelfHostedFunction(cx, initializer, thisv, args, &ignored))
+ return false;
+
+ MOZ_ASSERT(ignored.isUndefined(),
+ "Unexpected return value from non-legacy Intl object initializer");
+ return true;
+}
+
+bool
+js::intl::LegacyIntlInitialize(JSContext* cx, HandleObject obj, Handle<PropertyName*> initializer,
+ HandleValue thisValue, HandleValue locales, HandleValue options,
+ DateTimeFormatOptions dtfOptions, MutableHandleValue result)
+{
+ FixedInvokeArgs<5> args(cx);
+
+ args[0].setObject(*obj);
+ args[1].set(thisValue);
+ args[2].set(locales);
+ args[3].set(options);
+ args[4].setBoolean(dtfOptions == DateTimeFormatOptions::EnableMozExtensions);
+
+ RootedValue thisv(cx, NullValue());
+ if (!js::CallSelfHostedFunction(cx, initializer, thisv, args, result))
+ return false;
+
+ MOZ_ASSERT(result.isObject(), "Legacy Intl object initializer must return an object");
+ return true;
}
/**
@@ -56,21 +66,12 @@ js::intl::InitializeObject(JSContext* cx, HandleObject obj, Handle<PropertyName*
JSObject*
js::intl::GetInternalsObject(JSContext* cx, HandleObject obj)
{
- RootedValue getInternalsValue(cx);
- if (!GlobalObject::getIntrinsicValue(cx, cx->global(), cx->names().getInternals,
- &getInternalsValue))
- {
- return nullptr;
- }
- MOZ_ASSERT(getInternalsValue.isObject());
- MOZ_ASSERT(getInternalsValue.toObject().is<JSFunction>());
-
FixedInvokeArgs<1> args(cx);
args[0].setObject(*obj);
RootedValue v(cx, NullValue());
- if (!js::Call(cx, getInternalsValue, v, args, &v))
+ if (!js::CallSelfHostedFunction(cx, cx->names().getInternals, v, args, &v))
return nullptr;
return &v.toObject();
@@ -82,34 +83,10 @@ js::intl::ReportInternalError(JSContext* cx)
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
}
-bool
-js::intl::GetAvailableLocales(JSContext* cx, CountAvailable countAvailable,
- GetAvailable getAvailable, MutableHandleValue result)
-{
- RootedObject locales(cx, NewObjectWithGivenProto<PlainObject>(cx, nullptr));
- if (!locales)
- return false;
+const js::intl::OldStyleLanguageTagMapping
+ js::intl::oldStyleLanguageTagMappings[] = {
+ {"pa-PK", "pa-Arab-PK"}, {"zh-CN", "zh-Hans-CN"},
+ {"zh-HK", "zh-Hant-HK"}, {"zh-SG", "zh-Hans-SG"},
+ {"zh-TW", "zh-Hant-TW"},
+};
- uint32_t count = countAvailable();
- RootedValue t(cx, BooleanValue(true));
- for (uint32_t i = 0; i < count; i++) {
- const char* locale = getAvailable(i);
- auto lang = DuplicateString(cx, locale);
- if (!lang)
- return false;
- char* p;
- while ((p = strchr(lang.get(), '_')))
- *p = '-';
- RootedAtom a(cx, Atomize(cx, lang.get(), strlen(lang.get())));
- if (!a)
- return false;
- if (!DefineProperty(cx, locales, a->asPropertyName(), t, nullptr, nullptr,
- JSPROP_ENUMERATE))
- {
- return false;
- }
- }
-
- result.setObject(*locales);
- return true;
-}
diff --git a/js/src/builtin/intl/CommonFunctions.h b/js/src/builtin/intl/CommonFunctions.h
index 47705ab7c7..c6856c9b6d 100644
--- a/js/src/builtin/intl/CommonFunctions.h
+++ b/js/src/builtin/intl/CommonFunctions.h
@@ -27,12 +27,6 @@ namespace js {
namespace intl {
/**
- * Setup the |options| argument of |IntlInitialize|
- */
-extern bool
-CreateDefaultOptions(JSContext* cx, MutableHandleValue defaultOptions);
-
-/**
* Initialize a new Intl.* object using the named self-hosted function.
*/
extern bool
@@ -40,6 +34,22 @@ InitializeObject(JSContext* cx, HandleObject obj, Handle<PropertyName*> initiali
HandleValue locales, HandleValue options);
/**
+ * Initialize an existing object as an Intl.* object using the named
+ * self-hosted function. This is only for a few old Intl.* constructors, for
+ * legacy reasons -- new ones should use the function above instead.
+ */
+
+enum class DateTimeFormatOptions
+{
+ Standard,
+ EnableMozExtensions,
+};
+
+extern bool
+LegacyIntlInitialize(JSContext* cx, HandleObject obj, Handle<PropertyName*> initializer,
+ HandleValue thisValue, HandleValue locales, HandleValue options,
+ DateTimeFormatOptions dtfOptions, MutableHandleValue result);
+/**
* Returns the object holding the internal properties for obj.
*/
extern JSObject*
@@ -61,6 +71,32 @@ StringsAreEqual(JSAutoByteString& s1, const char* s2)
return !strcmp(s1.ptr(), s2);
}
+/**
+ * The last-ditch locale is used if none of the available locales satisfies a
+ * request. "en-GB" is used based on the assumptions that English is the most
+ * common second language, that both en-GB and en-US are normally available in
+ * an implementation, and that en-GB is more representative of the English used
+ * in other locales.
+ */
+static inline const char* LastDitchLocale() { return "en-GB"; }
+
+/**
+ * Certain old, commonly-used language tags that lack a script, are expected to
+ * nonetheless imply one. This object maps these old-style tags to modern
+ * equivalents.
+ */
+struct OldStyleLanguageTagMapping {
+ const char* const oldStyle;
+ const char* const modernStyle;
+
+ // Provide a constructor to catch missing initializers in the mappings array.
+ constexpr OldStyleLanguageTagMapping(const char* oldStyle,
+ const char* modernStyle)
+ : oldStyle(oldStyle), modernStyle(modernStyle) {}
+};
+
+extern const OldStyleLanguageTagMapping oldStyleLanguageTagMappings[5];
+
static inline const char*
IcuLocale(const char* locale)
{
@@ -79,9 +115,9 @@ static_assert(mozilla::IsSame<UChar, char16_t>::value,
// buffer's entire inline capacity before growing it and heap-allocating.
static const size_t INITIAL_CHAR_BUFFER_SIZE = 32;
-template <typename ICUStringFunction, size_t InlineCapacity>
+template <typename ICUStringFunction, typename CharT, size_t InlineCapacity>
static int32_t
-CallICU(JSContext* cx, Vector<char16_t, InlineCapacity>& chars, const ICUStringFunction& strFn)
+CallICU(JSContext* cx, Vector<CharT, InlineCapacity>& chars, const ICUStringFunction& strFn)
{
MOZ_ASSERT(chars.length() == 0);
MOZ_ALWAYS_TRUE(chars.resize(InlineCapacity));
@@ -119,25 +155,6 @@ CallICU(JSContext* cx, const ICUStringFunction& strFn)
return NewStringCopyN<CanGC>(cx, chars.begin(), size_t(size));
}
-// CountAvailable and GetAvailable describe the signatures used for ICU API
-// to determine available locales for various functionality.
-using CountAvailable = int32_t (*)();
-using GetAvailable = const char* (*)(int32_t localeIndex);
-
-/**
- * Return an object whose own property names are the locales indicated as
- * available by |countAvailable| that provides an overall count, and by
- * |getAvailable| that when called passing a number less than that count,
- * returns the corresponding locale as a borrowed string. For example:
- *
- * RootedValue v(cx);
- * if (!GetAvailableLocales(cx, unum_countAvailable, unum_getAvailable, &v))
- * return false;
- */
-extern bool
-GetAvailableLocales(JSContext* cx, CountAvailable countAvailable, GetAvailable getAvailable,
- JS::MutableHandle<JS::Value> result);
-
} // namespace intl
} // namespace js
diff --git a/js/src/builtin/intl/CommonFunctions.js b/js/src/builtin/intl/CommonFunctions.js
index 48337e666a..effabf020f 100644
--- a/js/src/builtin/intl/CommonFunctions.js
+++ b/js/src/builtin/intl/CommonFunctions.js
@@ -5,487 +5,139 @@
/* Portions Copyright Norbert Lindenberg 2011-2012. */
+
/**
- * Holder object for encapsulating regexp instances.
- *
- * Regular expression instances should be created after the initialization of
- * self-hosted global.
+ * Shorthand for hasOwnProperty.
*/
-var internalIntlRegExps = std_Object_create(null);
-internalIntlRegExps.unicodeLocaleExtensionSequenceRE = null;
-internalIntlRegExps.languageTagRE = null;
-internalIntlRegExps.duplicateVariantRE = null;
-internalIntlRegExps.duplicateSingletonRE = null;
-internalIntlRegExps.isWellFormedCurrencyCodeRE = null;
-internalIntlRegExps.currencyDigitsRE = null;
+function hasOwn(propName, object) {
+ return callFunction(std_Object_hasOwnProperty, object, propName);
+}
+
+#ifdef DEBUG
+#define assertIsValidAndCanonicalLanguageTag(locale, desc) \
+ do { \
+ let canonical = intl_TryValidateAndCanonicalizeLanguageTag(locale); \
+ assert(canonical !== null, \
+ `${desc} is a structurally valid language tag`); \
+ assert(canonical === locale, \
+ `${desc} is a canonicalized language tag`); \
+ } while (false)
+#else
+#define assertIsValidAndCanonicalLanguageTag(locale, desc) ; // Elided assertion.
+#endif
/**
- * Regular expression matching a "Unicode locale extension sequence", which the
+ * Returns the start index of a "Unicode locale extension sequence", which the
* specification defines as: "any substring of a language tag that starts with
* a separator '-' and the singleton 'u' and includes the maximum sequence of
* following non-singleton subtags and their preceding '-' separators."
*
* Alternatively, this may be defined as: the components of a language tag that
- * match the extension production in RFC 5646, where the singleton component is
- * "u".
+ * match the `unicode_locale_extensions` production in UTS 35.
*
* Spec: ECMAScript Internationalization API Specification, 6.2.1.
*/
-function getUnicodeLocaleExtensionSequenceRE() {
- return internalIntlRegExps.unicodeLocaleExtensionSequenceRE ||
- (internalIntlRegExps.unicodeLocaleExtensionSequenceRE =
- RegExpCreate("-u(?:-[a-z0-9]{2,8})+"));
-}
-
-
-/**
- * Removes Unicode locale extension sequences from the given language tag.
- */
-function removeUnicodeExtensions(locale) {
- // A wholly-privateuse locale has no extension sequences.
- if (callFunction(std_String_startsWith, locale, "x-"))
- return locale;
+function startOfUnicodeExtensions(locale) {
+ assert(typeof locale === "string", "locale is a string");
- // Otherwise, split on "-x-" marking the start of any privateuse component.
- // Replace Unicode locale extension sequences in the left half, and return
- // the concatenation.
- var pos = callFunction(std_String_indexOf, locale, "-x-");
- if (pos < 0)
- pos = locale.length;
-
- var left = callFunction(String_substring, locale, 0, pos);
- var right = callFunction(String_substring, locale, pos);
-
- var extensions;
- var unicodeLocaleExtensionSequenceRE = getUnicodeLocaleExtensionSequenceRE();
- while ((extensions = regexp_exec_no_statics(unicodeLocaleExtensionSequenceRE, left)) !== null) {
- left = StringReplaceString(left, extensions[0], "");
- unicodeLocaleExtensionSequenceRE.lastIndex = 0;
- }
+ // Search for "-u-" marking the start of a Unicode extension sequence.
+ var start = callFunction(std_String_indexOf, locale, "-u-");
+ if (start < 0)
+ return -1;
- var combined = left + right;
- assert(IsStructurallyValidLanguageTag(combined), "recombination produced an invalid language tag");
- assert(function() {
- var uindex = callFunction(std_String_indexOf, combined, "-u-");
- if (uindex < 0)
- return true;
- var xindex = callFunction(std_String_indexOf, combined, "-x-");
- return xindex > 0 && xindex < uindex;
- }(), "recombination failed to remove all Unicode locale extension sequences");
+ // And search for "-x-" marking the start of any privateuse component to
+ // handle the case when "-u-" was only found within a privateuse subtag.
+ var privateExt = callFunction(std_String_indexOf, locale, "-x-");
+ if (privateExt >= 0 && privateExt < start)
+ return -1;
- return combined;
+ return start;
}
-
/**
- * Regular expression defining BCP 47 language tags.
- *
- * Spec: RFC 5646 section 2.1.
+ * Returns the end index of a Unicode locale extension sequence.
*/
-function getLanguageTagRE() {
- if (internalIntlRegExps.languageTagRE)
- return internalIntlRegExps.languageTagRE;
-
- // RFC 5234 section B.1
- // ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
- var ALPHA = "[a-zA-Z]";
- // DIGIT = %x30-39
- // ; 0-9
- var DIGIT = "[0-9]";
-
- // RFC 5646 section 2.1
- // alphanum = (ALPHA / DIGIT) ; letters and numbers
- var alphanum = "(?:" + ALPHA + "|" + DIGIT + ")";
- // regular = "art-lojban" ; these tags match the 'langtag'
- // / "cel-gaulish" ; production, but their subtags
- // / "no-bok" ; are not extended language
- // / "no-nyn" ; or variant subtags: their meaning
- // / "zh-guoyu" ; is defined by their registration
- // / "zh-hakka" ; and all of these are deprecated
- // / "zh-min" ; in favor of a more modern
- // / "zh-min-nan" ; subtag or sequence of subtags
- // / "zh-xiang"
- var regular = "(?:art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)";
- // irregular = "en-GB-oed" ; irregular tags do not match
- // / "i-ami" ; the 'langtag' production and
- // / "i-bnn" ; would not otherwise be
- // / "i-default" ; considered 'well-formed'
- // / "i-enochian" ; These tags are all valid,
- // / "i-hak" ; but most are deprecated
- // / "i-klingon" ; in favor of more modern
- // / "i-lux" ; subtags or subtag
- // / "i-mingo" ; combination
- // / "i-navajo"
- // / "i-pwn"
- // / "i-tao"
- // / "i-tay"
- // / "i-tsu"
- // / "sgn-BE-FR"
- // / "sgn-BE-NL"
- // / "sgn-CH-DE"
- var irregular = "(?:en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)";
- // grandfathered = irregular ; non-redundant tags registered
- // / regular ; during the RFC 3066 era
- var grandfathered = "(?:" + irregular + "|" + regular + ")";
- // privateuse = "x" 1*("-" (1*8alphanum))
- var privateuse = "(?:x(?:-[a-z0-9]{1,8})+)";
- // singleton = DIGIT ; 0 - 9
- // / %x41-57 ; A - W
- // / %x59-5A ; Y - Z
- // / %x61-77 ; a - w
- // / %x79-7A ; y - z
- var singleton = "(?:" + DIGIT + "|[A-WY-Za-wy-z])";
- // extension = singleton 1*("-" (2*8alphanum))
- var extension = "(?:" + singleton + "(?:-" + alphanum + "{2,8})+)";
- // variant = 5*8alphanum ; registered variants
- // / (DIGIT 3alphanum)
- var variant = "(?:" + alphanum + "{5,8}|(?:" + DIGIT + alphanum + "{3}))";
- // region = 2ALPHA ; ISO 3166-1 code
- // / 3DIGIT ; UN M.49 code
- var region = "(?:" + ALPHA + "{2}|" + DIGIT + "{3})";
- // script = 4ALPHA ; ISO 15924 code
- var script = "(?:" + ALPHA + "{4})";
- // extlang = 3ALPHA ; selected ISO 639 codes
- // *2("-" 3ALPHA) ; permanently reserved
- var extlang = "(?:" + ALPHA + "{3}(?:-" + ALPHA + "{3}){0,2})";
- // language = 2*3ALPHA ; shortest ISO 639 code
- // ["-" extlang] ; sometimes followed by
- // ; extended language subtags
- // / 4ALPHA ; or reserved for future use
- // / 5*8ALPHA ; or registered language subtag
- var language = "(?:" + ALPHA + "{2,3}(?:-" + extlang + ")?|" + ALPHA + "{4}|" + ALPHA + "{5,8})";
- // langtag = language
- // ["-" script]
- // ["-" region]
- // *("-" variant)
- // *("-" extension)
- // ["-" privateuse]
- var langtag = language + "(?:-" + script + ")?(?:-" + region + ")?(?:-" +
- variant + ")*(?:-" + extension + ")*(?:-" + privateuse + ")?";
- // Language-Tag = langtag ; normal language tags
- // / privateuse ; private use tag
- // / grandfathered ; grandfathered tags
- var languageTag = "^(?:" + langtag + "|" + privateuse + "|" + grandfathered + ")$";
-
- // Language tags are case insensitive (RFC 5646 section 2.1.1).
- return (internalIntlRegExps.languageTagRE = RegExpCreate(languageTag, "i"));
-}
+function endOfUnicodeExtensions(locale, start) {
+ assert(typeof locale === "string", "locale is a string");
+ assert(0 <= start && start < locale.length, "start is an index into locale");
+ assert(Substring(locale, start, 3) === "-u-", "start points to Unicode extension sequence");
+ #define HYPHEN 0x2D
+ assert(std_String_fromCharCode(HYPHEN) === "-",
+ "code unit constant should match the expected character");
-function getDuplicateVariantRE() {
- if (internalIntlRegExps.duplicateVariantRE)
- return internalIntlRegExps.duplicateVariantRE;
-
- // RFC 5234 section B.1
- // ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
- var ALPHA = "[a-zA-Z]";
- // DIGIT = %x30-39
- // ; 0-9
- var DIGIT = "[0-9]";
-
- // RFC 5646 section 2.1
- // alphanum = (ALPHA / DIGIT) ; letters and numbers
- var alphanum = "(?:" + ALPHA + "|" + DIGIT + ")";
- // variant = 5*8alphanum ; registered variants
- // / (DIGIT 3alphanum)
- var variant = "(?:" + alphanum + "{5,8}|(?:" + DIGIT + alphanum + "{3}))";
-
- // Match a langtag that contains a duplicate variant.
- var duplicateVariant =
- // Match everything in a langtag prior to any variants, and maybe some
- // of the variants as well (which makes this pattern inefficient but
- // not wrong, for our purposes);
- "(?:" + alphanum + "{2,8}-)+" +
- // a variant, parenthesised so that we can refer back to it later;
- "(" + variant + ")-" +
- // zero or more subtags at least two characters long (thus stopping
- // before extension and privateuse components);
- "(?:" + alphanum + "{2,8}-)*" +
- // and the same variant again
- "\\1" +
- // ...but not followed by any characters that would turn it into a
- // different subtag.
- "(?!" + alphanum + ")";
-
- // Language tags are case insensitive (RFC 5646 section 2.1.1). Using
- // character classes covering both upper- and lower-case characters nearly
- // addresses this -- but for the possibility of variant repetition with
- // differing case, e.g. "en-variant-Variant". Use a case-insensitive
- // regular expression to address this. (Note that there's no worry about
- // case transformation accepting invalid characters here: users have
- // already verified the string is alphanumeric Latin plus "-".)
- return (internalIntlRegExps.duplicateVariantRE = RegExpCreate(duplicateVariant, "i"));
-}
+ // Search for the start of the next singleton or privateuse subtag.
+ //
+ // Begin searching after the smallest possible Unicode locale extension
+ // sequence, namely |"-u-" 2alphanum|. End searching once the remaining
+ // characters can't fit the smallest possible singleton or privateuse
+ // subtag, namely |"-x-" alphanum|. Note the reduced end-limit means
+ // indexing inside the loop is always in-range.
+ for (var i = start + 5, end = locale.length - 4; i <= end; i++) {
+ if (callFunction(std_String_charCodeAt, locale, i) !== HYPHEN)
+ continue;
+ if (callFunction(std_String_charCodeAt, locale, i + 2) === HYPHEN)
+ return i;
+
+ // Skip over (i + 1) and (i + 2) because we've just verified they
+ // aren't "-", so the next possible delimiter can only be at (i + 3).
+ i += 2;
+ }
+ #undef HYPHEN
-function getDuplicateSingletonRE() {
- if (internalIntlRegExps.duplicateSingletonRE)
- return internalIntlRegExps.duplicateSingletonRE;
-
- // RFC 5234 section B.1
- // ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
- var ALPHA = "[a-zA-Z]";
- // DIGIT = %x30-39
- // ; 0-9
- var DIGIT = "[0-9]";
-
- // RFC 5646 section 2.1
- // alphanum = (ALPHA / DIGIT) ; letters and numbers
- var alphanum = "(?:" + ALPHA + "|" + DIGIT + ")";
- // singleton = DIGIT ; 0 - 9
- // / %x41-57 ; A - W
- // / %x59-5A ; Y - Z
- // / %x61-77 ; a - w
- // / %x79-7A ; y - z
- var singleton = "(?:" + DIGIT + "|[A-WY-Za-wy-z])";
-
- // Match a langtag that contains a duplicate singleton.
- var duplicateSingleton =
- // Match a singleton subtag, parenthesised so that we can refer back to
- // it later;
- "-(" + singleton + ")-" +
- // then zero or more subtags;
- "(?:" + alphanum + "+-)*" +
- // and the same singleton again
- "\\1" +
- // ...but not followed by any characters that would turn it into a
- // different subtag.
- "(?!" + alphanum + ")";
-
- // Language tags are case insensitive (RFC 5646 section 2.1.1). Using
- // character classes covering both upper- and lower-case characters nearly
- // addresses this -- but for the possibility of singleton repetition with
- // differing case, e.g. "en-u-foo-U-foo". Use a case-insensitive regular
- // expression to address this. (Note that there's no worry about case
- // transformation accepting invalid characters here: users have already
- // verified the string is alphanumeric Latin plus "-".)
- return (internalIntlRegExps.duplicateSingletonRE = RegExpCreate(duplicateSingleton, "i"));
+ // If no singleton or privateuse subtag was found, the Unicode extension
+ // sequence extends until the end of the string.
+ return locale.length;
}
/**
- * Verifies that the given string is a well-formed BCP 47 language tag
- * with no duplicate variant or singleton subtags.
- *
- * Spec: ECMAScript Internationalization API Specification, 6.2.2.
+ * Removes Unicode locale extension sequences from the given language tag.
*/
-function IsStructurallyValidLanguageTag(locale) {
- assert(typeof locale === "string", "IsStructurallyValidLanguageTag");
- var languageTagRE = getLanguageTagRE();
- if (!regexp_test_no_statics(languageTagRE, locale))
- return false;
-
- // Before checking for duplicate variant or singleton subtags with
- // regular expressions, we have to get private use subtag sequences
- // out of the picture.
- if (callFunction(std_String_startsWith, locale, "x-"))
- return true;
- var pos = callFunction(std_String_indexOf, locale, "-x-");
- if (pos !== -1)
- locale = callFunction(String_substring, locale, 0, pos);
-
- // Check for duplicate variant or singleton subtags.
- var duplicateVariantRE = getDuplicateVariantRE();
- var duplicateSingletonRE = getDuplicateSingletonRE();
- return !regexp_test_no_statics(duplicateVariantRE, locale) &&
- !regexp_test_no_statics(duplicateSingletonRE, locale);
-}
+function removeUnicodeExtensions(locale) {
+ var start = startOfUnicodeExtensions(locale);
+ if (start < 0)
+ return locale;
-/**
- * Joins the array elements in the given range with the supplied separator.
- */
-function ArrayJoinRange(array, separator, from, to = array.length) {
- assert(typeof separator === "string", "|separator| is a string value");
- assert(typeof from === "number", "|from| is a number value");
- assert(typeof to === "number", "|to| is a number value");
- assert(0 <= from && from <= to && to <= array.length, "|from| and |to| form a valid range");
+ var end = endOfUnicodeExtensions(locale, start);
- if (from === to)
- return "";
+ var left = Substring(locale, 0, start);
+ var right = Substring(locale, end, locale.length - end);
+ var combined = left + right;
- var result = array[from];
- for (var i = from + 1; i < to; i++) {
- result += separator + array[i];
- }
- return result;
+ assertIsValidAndCanonicalLanguageTag(combined, "the recombined locale");
+ assert(startOfUnicodeExtensions(combined) < 0,
+ "recombination failed to remove all Unicode locale extension sequences");
+
+ return combined;
}
/**
- * Canonicalizes the given structurally valid BCP 47 language tag, including
- * regularized case of subtags. For example, the language tag
- * Zh-NAN-haNS-bu-variant2-Variant1-u-ca-chinese-t-Zh-laTN-x-PRIVATE, where
- *
- * Zh ; 2*3ALPHA
- * -NAN ; ["-" extlang]
- * -haNS ; ["-" script]
- * -bu ; ["-" region]
- * -variant2 ; *("-" variant)
- * -Variant1
- * -u-ca-chinese ; *("-" extension)
- * -t-Zh-laTN
- * -x-PRIVATE ; ["-" privateuse]
- *
- * becomes nan-Hans-mm-variant2-variant1-t-zh-latn-u-ca-chinese-x-private
- *
- * Spec: ECMAScript Internationalization API Specification, 6.2.3.
- * Spec: RFC 5646, section 4.5.
+ * Returns Unicode locale extension sequences from the given language tag.
*/
-function CanonicalizeLanguageTag(locale) {
- assert(IsStructurallyValidLanguageTag(locale), "CanonicalizeLanguageTag");
-
- // The input
- // "Zh-NAN-haNS-bu-variant2-Variant1-u-ca-chinese-t-Zh-laTN-x-PRIVATE"
- // will be used throughout this method to illustrate how it works.
-
- // Language tags are compared and processed case-insensitively, so
- // technically it's not necessary to adjust case. But for easier processing,
- // and because the canonical form for most subtags is lower case, we start
- // with lower case for all.
- // "Zh-NAN-haNS-bu-variant2-Variant1-u-ca-chinese-t-Zh-laTN-x-PRIVATE" ->
- // "zh-nan-hans-bu-variant2-variant1-u-ca-chinese-t-zh-latn-x-private"
- locale = callFunction(std_String_toLowerCase, locale);
-
- // Handle mappings for complete tags.
- if (callFunction(std_Object_hasOwnProperty, langTagMappings, locale))
- return langTagMappings[locale];
-
- var subtags = StringSplitString(ToString(locale), "-");
- var i = 0;
-
- // Handle the standard part: All subtags before the first singleton or "x".
- // "zh-nan-hans-bu-variant2-variant1"
- while (i < subtags.length) {
- var subtag = subtags[i];
-
- // If we reach the start of an extension sequence or private use part,
- // we're done with this loop. We have to check for i > 0 because for
- // irregular language tags, such as i-klingon, the single-character
- // subtag "i" is not the start of an extension sequence.
- // In the example, we break at "u".
- if (subtag.length === 1 && (i > 0 || subtag === "x"))
- break;
-
- if (i !== 0) {
- if (subtag.length === 4) {
- // 4-character subtags that are not in initial position are
- // script codes; their first character needs to be capitalized.
- // "hans" -> "Hans"
- subtag = callFunction(std_String_toUpperCase, subtag[0]) +
- callFunction(String_substring, subtag, 1);
- } else if (subtag.length === 2) {
- // 2-character subtags that are not in initial position are
- // region codes; they need to be upper case. "bu" -> "BU"
- subtag = callFunction(std_String_toUpperCase, subtag);
- }
- }
- if (callFunction(std_Object_hasOwnProperty, langSubtagMappings, subtag)) {
- // Replace deprecated subtags with their preferred values.
- // "BU" -> "MM"
- // This has to come after we capitalize region codes because
- // otherwise some language and region codes could be confused.
- // For example, "in" is an obsolete language code for Indonesian,
- // but "IN" is the country code for India.
- // Note that the script generating langSubtagMappings makes sure
- // that no regular subtag mapping will replace an extlang code.
- subtag = langSubtagMappings[subtag];
- } else if (callFunction(std_Object_hasOwnProperty, extlangMappings, subtag)) {
- // Replace deprecated extlang subtags with their preferred values,
- // and remove the preceding subtag if it's a redundant prefix.
- // "zh-nan" -> "nan"
- // Note that the script generating extlangMappings makes sure that
- // no extlang mapping will replace a normal language code.
- subtag = extlangMappings[subtag].preferred;
- if (i === 1 && extlangMappings[subtag].prefix === subtags[0]) {
- callFunction(std_Array_shift, subtags);
- i--;
- }
- }
- subtags[i] = subtag;
- i++;
- }
- var normal = ArrayJoinRange(subtags, "-", 0, i);
-
- // Extension sequences are sorted by their singleton characters.
- // "u-ca-chinese-t-zh-latn" -> "t-zh-latn-u-ca-chinese"
- var extensions = new List();
- while (i < subtags.length && subtags[i] !== "x") {
- var extensionStart = i;
- i++;
- while (i < subtags.length && subtags[i].length > 1)
- i++;
- var extension = ArrayJoinRange(subtags, "-", extensionStart, i);
- callFunction(std_Array_push, extensions, extension);
- }
- callFunction(std_Array_sort, extensions);
-
- // Private use sequences are left as is. "x-private"
- var privateUse = "";
- if (i < subtags.length)
- privateUse = ArrayJoinRange(subtags, "-", i);
-
- // Put everything back together.
- var canonical = normal;
- if (extensions.length > 0)
- canonical += "-" + callFunction(std_Array_join, extensions, "-");
- if (privateUse.length > 0) {
- // Be careful of a Language-Tag that is entirely privateuse.
- if (canonical.length > 0)
- canonical += "-" + privateUse;
- else
- canonical = privateUse;
- }
-
- return canonical;
-}
-
-function localeContainsNoUnicodeExtensions(locale) {
- // No "-u-", no possible Unicode extension.
- if (callFunction(std_String_indexOf, locale, "-u-") === -1)
- return true;
+function getUnicodeExtensions(locale) {
+ var start = startOfUnicodeExtensions(locale);
+ assert(start >= 0, "start of Unicode extension sequence not found");
+ var end = endOfUnicodeExtensions(locale, start);
- // "-u-" within privateuse also isn't one.
- if (callFunction(std_String_indexOf, locale, "-u-") > callFunction(std_String_indexOf, locale, "-x-"))
- return true;
-
- // An entirely-privateuse tag doesn't contain extensions.
- if (callFunction(std_String_startsWith, locale, "x-"))
- return true;
-
- // Otherwise, we have a Unicode extension sequence.
- return false;
+ return Substring(locale, start, end - start);
}
+/**
+ * Returns true if the input contains only ASCII alphabetical characters.
+ */
+function IsASCIIAlphaString(s) {
+ assert(typeof s === "string", "IsASCIIAlphaString");
-// The last-ditch locale is used if none of the available locales satisfies a
-// request. "en-GB" is used based on the assumptions that English is the most
-// common second language, that both en-GB and en-US are normally available in
-// an implementation, and that en-GB is more representative of the English used
-// in other locales.
-function lastDitchLocale() {
- // Per bug 1177929, strings don't clone out of self-hosted code as atoms,
- // breaking IonBuilder::constant. Put this in a function for now.
- return "en-GB";
+ for (var i = 0; i < s.length; i++) {
+ var c = callFunction(std_String_charCodeAt, s, i);
+ if (!((0x41 <= c && c <= 0x5A) || (0x61 <= c && c <= 0x7A)))
+ return false
+ }
+ return true;
}
-
-// Certain old, commonly-used language tags that lack a script, are expected to
-// nonetheless imply one. This object maps these old-style tags to modern
-// equivalents.
-var oldStyleLanguageTagMappings = {
- "pa-PK": "pa-Arab-PK",
- "zh-CN": "zh-Hans-CN",
- "zh-HK": "zh-Hant-HK",
- "zh-SG": "zh-Hans-SG",
- "zh-TW": "zh-Hant-TW",
-};
-
-
-var localeCandidateCache = {
- runtimeDefaultLocale: undefined,
- candidateDefaultLocale: undefined,
-};
-
-
var localeCache = {
runtimeDefaultLocale: undefined,
defaultLocale: undefined,
@@ -493,47 +145,6 @@ var localeCache = {
/**
- * Compute the candidate default locale: the locale *requested* to be used as
- * the default locale. We'll use it if and only if ICU provides support (maybe
- * fallback support, e.g. supporting "de-ZA" through "de" support implied by a
- * "de-DE" locale).
- */
-function DefaultLocaleIgnoringAvailableLocales() {
- const runtimeDefaultLocale = RuntimeDefaultLocale();
- if (runtimeDefaultLocale === localeCandidateCache.runtimeDefaultLocale)
- return localeCandidateCache.candidateDefaultLocale;
-
- // If we didn't get a cache hit, compute the candidate default locale and
- // cache it. Fall back on the last-ditch locale when necessary.
- var candidate;
- if (!IsStructurallyValidLanguageTag(runtimeDefaultLocale)) {
- candidate = lastDitchLocale();
- } else {
- candidate = CanonicalizeLanguageTag(runtimeDefaultLocale);
-
- // The default locale must be in [[availableLocales]], and that list
- // must not contain any locales with Unicode extension sequences, so
- // remove any present in the candidate.
- candidate = removeUnicodeExtensions(candidate);
-
- if (callFunction(std_Object_hasOwnProperty, oldStyleLanguageTagMappings, candidate))
- candidate = oldStyleLanguageTagMappings[candidate];
- }
-
- // Cache the candidate locale until the runtime default locale changes.
- localeCandidateCache.candidateDefaultLocale = candidate;
- localeCandidateCache.runtimeDefaultLocale = runtimeDefaultLocale;
-
- assert(IsStructurallyValidLanguageTag(candidate),
- "the candidate must be structurally valid");
- assert(localeContainsNoUnicodeExtensions(candidate),
- "the candidate must not contain a Unicode extension sequence");
-
- return candidate;
-}
-
-
-/**
* Returns the BCP 47 language tag for the host environment's current locale.
*
* Spec: ECMAScript Internationalization API Specification, 6.2.4.
@@ -544,32 +155,13 @@ function DefaultLocale() {
return localeCache.defaultLocale;
// If we didn't have a cache hit, compute the candidate default locale.
- // Then use it as the actual default locale if ICU supports that locale
- // (perhaps via fallback). Otherwise use the last-ditch locale.
- var candidate = DefaultLocaleIgnoringAvailableLocales();
- var locale;
- if (BestAvailableLocaleIgnoringDefault(callFunction(collatorInternalProperties.availableLocales,
- collatorInternalProperties),
- candidate) &&
- BestAvailableLocaleIgnoringDefault(callFunction(numberFormatInternalProperties.availableLocales,
- numberFormatInternalProperties),
- candidate) &&
- BestAvailableLocaleIgnoringDefault(callFunction(dateTimeFormatInternalProperties.availableLocales,
- dateTimeFormatInternalProperties),
- candidate))
- {
- locale = candidate;
- } else {
- locale = lastDitchLocale();
- }
+ var locale = intl_supportedLocaleOrFallback(runtimeDefaultLocale);
- assert(IsStructurallyValidLanguageTag(locale),
- "the computed default locale must be structurally valid");
- assert(locale === CanonicalizeLanguageTag(locale),
- "the computed default locale must be canonical");
- assert(localeContainsNoUnicodeExtensions(locale),
+ assertIsValidAndCanonicalLanguageTag(locale, "the computed default locale");
+ assert(startOfUnicodeExtensions(locale) < 0,
"the computed default locale must not contain a Unicode extension sequence");
+ // Cache the computed locale until the runtime default locale changes.
localeCache.defaultLocale = locale;
localeCache.runtimeDefaultLocale = runtimeDefaultLocale;
@@ -578,105 +170,62 @@ function DefaultLocale() {
/**
- * Add old-style language tags without script code for locales that in current
- * usage would include a script subtag. Also add an entry for the last-ditch
- * locale, in case ICU doesn't directly support it (but does support it through
- * fallback, e.g. supporting "en-GB" indirectly using "en" support).
- */
-function addSpecialMissingLanguageTags(availableLocales) {
- // Certain old-style language tags lack a script code, but in current usage
- // they *would* include a script code. Map these over to modern forms.
- var oldStyleLocales = std_Object_getOwnPropertyNames(oldStyleLanguageTagMappings);
- for (var i = 0; i < oldStyleLocales.length; i++) {
- var oldStyleLocale = oldStyleLocales[i];
- if (availableLocales[oldStyleLanguageTagMappings[oldStyleLocale]])
- availableLocales[oldStyleLocale] = true;
- }
-
- // Also forcibly provide the last-ditch locale.
- var lastDitch = lastDitchLocale();
- assert(lastDitch === "en-GB" && availableLocales["en"],
- "shouldn't be a need to add every locale implied by the last-" +
- "ditch locale, merely just the last-ditch locale");
- availableLocales[lastDitch] = true;
-}
-
-
-/**
* Canonicalizes a locale list.
*
* Spec: ECMAScript Internationalization API Specification, 9.2.1.
*/
function CanonicalizeLocaleList(locales) {
+ // Step 1.
if (locales === undefined)
- return new List();
- var seen = new List();
- if (typeof locales === "string")
- locales = [locales];
+ return [];
+
+ // Step 3 (and the remaining steps).
+ var tag = intl_ValidateAndCanonicalizeLanguageTag(locales, false);
+ if (tag !== null) {
+ assert(typeof tag === "string",
+ "intl_ValidateAndCanonicalizeLanguageTag returns a string value");
+ return [tag];
+ }
+
+ // Step 2.
+ var seen = [];
+
+ // Step 4.
var O = ToObject(locales);
+
+ // Step 5.
var len = ToLength(O.length);
+
+ // Step 6.
var k = 0;
+
+ // Step 7.
while (k < len) {
- // Don't call ToString(k) - SpiderMonkey is faster with integers.
- var kPresent = HasProperty(O, k);
- if (kPresent) {
+ // Steps 7.a-c.
+ if (k in O) {
+ // Step 7.c.i.
var kValue = O[k];
+
+ // Step 7.c.ii.
if (!(typeof kValue === "string" || IsObject(kValue)))
ThrowTypeError(JSMSG_INVALID_LOCALES_ELEMENT);
- var tag = ToString(kValue);
- if (!IsStructurallyValidLanguageTag(tag))
- ThrowRangeError(JSMSG_INVALID_LANGUAGE_TAG, tag);
- tag = CanonicalizeLanguageTag(tag);
- if (callFunction(ArrayIndexOf, seen, tag) === -1)
- callFunction(std_Array_push, seen, tag);
- }
- k++;
- }
- return seen;
-}
+ // Steps 7.c.iii-iv.
+ var tag = intl_ValidateAndCanonicalizeLanguageTag(kValue, true);
+ assert(typeof tag === "string",
+ "ValidateAndCanonicalizeLanguageTag returns a string value");
-function BestAvailableLocaleHelper(availableLocales, locale, considerDefaultLocale) {
- assert(IsStructurallyValidLanguageTag(locale), "invalid BestAvailableLocale locale structure");
- assert(locale === CanonicalizeLanguageTag(locale), "non-canonical BestAvailableLocale locale");
- assert(localeContainsNoUnicodeExtensions(locale), "locale must contain no Unicode extensions");
-
- // In the spec, [[availableLocales]] is formally a list of all available
- // locales. But in our implementation, it's an *incomplete* list, not
- // necessarily including the default locale (and all locales implied by it,
- // e.g. "de" implied by "de-CH"), if that locale isn't in every
- // [[availableLocales]] list (because that locale is supported through
- // fallback, e.g. "de-CH" supported through "de").
- //
- // If we're considering the default locale, augment the spec loop with
- // additional checks to also test whether the current prefix is a prefix of
- // the default locale.
-
- var defaultLocale;
- if (considerDefaultLocale)
- defaultLocale = DefaultLocale();
-
- var candidate = locale;
- while (true) {
- if (availableLocales[candidate])
- return candidate;
-
- if (considerDefaultLocale && candidate.length <= defaultLocale.length) {
- if (candidate === defaultLocale)
- return candidate;
- if (callFunction(std_String_startsWith, defaultLocale, candidate + "-"))
- return candidate;
+ // Step 7.c.v.
+ if (callFunction(ArrayIndexOf, seen, tag) === -1)
+ _DefineDataProperty(seen, seen.length, tag);
}
- var pos = callFunction(std_String_lastIndexOf, candidate, "-");
- if (pos === -1)
- return undefined;
-
- if (pos >= 2 && candidate[pos - 2] === "-")
- pos -= 2;
-
- candidate = callFunction(String_substring, candidate, 0, pos);
+ // Step 7.d.
+ k++;
}
+
+ // Step 8.
+ return seen;
}
@@ -689,20 +238,17 @@ function BestAvailableLocaleHelper(availableLocales, locale, considerDefaultLoca
* Spec: RFC 4647, section 3.4.
*/
function BestAvailableLocale(availableLocales, locale) {
- return BestAvailableLocaleHelper(availableLocales, locale, true);
+ return intl_BestAvailableLocale(availableLocales, locale, DefaultLocale());
}
-
/**
* Identical to BestAvailableLocale, but does not consider the default locale
* during computation.
*/
function BestAvailableLocaleIgnoringDefault(availableLocales, locale) {
- return BestAvailableLocaleHelper(availableLocales, locale, false);
+ return intl_BestAvailableLocale(availableLocales, locale, null);
}
-var noRelevantExtensionKeys = [];
-
/**
* Compares a BCP 47 language priority list against the set of locales in
* availableLocales and determines the best available language to meet the
@@ -716,31 +262,37 @@ var noRelevantExtensionKeys = [];
* Spec: RFC 4647, section 3.4.
*/
function LookupMatcher(availableLocales, requestedLocales) {
- var i = 0;
- var len = requestedLocales.length;
- var availableLocale;
- var locale, noExtensionsLocale;
- while (i < len && availableLocale === undefined) {
- locale = requestedLocales[i];
- noExtensionsLocale = removeUnicodeExtensions(locale);
- availableLocale = BestAvailableLocale(availableLocales, noExtensionsLocale);
- i++;
- }
-
+ // Step 1.
var result = new Record();
- if (availableLocale !== undefined) {
- result.locale = availableLocale;
- if (locale !== noExtensionsLocale) {
- var unicodeLocaleExtensionSequenceRE = getUnicodeLocaleExtensionSequenceRE();
- var extensionMatch = regexp_exec_no_statics(unicodeLocaleExtensionSequenceRE, locale);
- var extension = extensionMatch[0];
- var extensionIndex = extensionMatch.index;
- result.extension = extension;
- result.extensionIndex = extensionIndex;
+
+ // Step 2.
+ for (var i = 0; i < requestedLocales.length; i++) {
+ var locale = requestedLocales[i];
+
+ // Step 2.a.
+ var noExtensionsLocale = removeUnicodeExtensions(locale);
+
+ // Step 2.b.
+ var availableLocale = BestAvailableLocale(availableLocales, noExtensionsLocale);
+
+ // Step 2.c.
+ if (availableLocale !== undefined) {
+ // Step 2.c.i.
+ result.locale = availableLocale;
+
+ // Step 2.c.ii.
+ if (locale !== noExtensionsLocale)
+ result.extension = getUnicodeExtensions(locale);
+
+ // Step 2.c.iii.
+ return result;
}
- } else {
- result.locale = DefaultLocale();
}
+
+ // Steps 3-4.
+ result.locale = DefaultLocale();
+
+ // Step 5.
return result;
}
@@ -759,6 +311,77 @@ function BestFitMatcher(availableLocales, requestedLocales) {
return LookupMatcher(availableLocales, requestedLocales);
}
+/**
+ * Returns the Unicode extension value subtags for the requested key subtag.
+ *
+ * Spec: ECMAScript Internationalization API Specification, 9.2.5.
+ */
+function UnicodeExtensionValue(extension, key) {
+ assert(typeof extension === "string", "extension is a string value");
+ assert(callFunction(std_String_startsWith, extension, "-u-") &&
+ getUnicodeExtensions("und" + extension) === extension,
+ "extension is a Unicode extension subtag");
+ assert(typeof key === "string", "key is a string value");
+
+ // Step 1.
+ assert(key.length === 2, "key is a Unicode extension key subtag");
+
+ // Step 2.
+ var size = extension.length;
+
+ // Step 3.
+ var searchValue = "-" + key + "-";
+
+ // Step 4.
+ var pos = callFunction(std_String_indexOf, extension, searchValue);
+
+ // Step 5.
+ if (pos !== -1) {
+ // Step 5.a.
+ var start = pos + 4;
+
+ // Step 5.b.
+ var end = start;
+
+ // Step 5.c.
+ var k = start;
+
+ // Steps 5.d-e.
+ while (true) {
+ // Step 5.e.i.
+ var e = callFunction(std_String_indexOf, extension, "-", k);
+
+ // Step 5.e.ii.
+ var len = e === -1 ? size - k : e - k;
+
+ // Step 5.e.iii.
+ if (len === 2)
+ break;
+
+ // Step 5.e.iv.
+ if (e === -1) {
+ end = size;
+ break;
+ }
+
+ // Step 5.e.v.
+ end = e;
+ k = e + 1;
+ }
+
+ // Step 5.f.
+ return callFunction(String_substring, extension, start, end);
+ }
+
+ // Step 6.
+ searchValue = "-" + key;
+
+ // Steps 7-8.
+ if (callFunction(std_String_endsWith, extension, searchValue))
+ return "";
+
+ // Step 9 (implicit).
+}
/**
* Compares a BCP 47 language priority list against availableLocales and
@@ -767,11 +390,9 @@ function BestFitMatcher(availableLocales, requestedLocales) {
* caller's relevant extensions and locale data as well as client-provided
* options into consideration.
*
- * Spec: ECMAScript Internationalization API Specification, 9.2.5.
+ * Spec: ECMAScript Internationalization API Specification, 9.2.6.
*/
function ResolveLocale(availableLocales, requestedLocales, options, relevantExtensionKeys, localeData) {
- /*jshint laxbreak: true */
-
// Steps 1-3.
var matcher = options.localeMatcher;
var r = (matcher === "lookup")
@@ -780,121 +401,130 @@ function ResolveLocale(availableLocales, requestedLocales, options, relevantExte
// Step 4.
var foundLocale = r.locale;
-
- // Step 5.a.
var extension = r.extension;
- var extensionIndex, extensionSubtags, extensionSubtagsLength;
// Step 5.
- if (extension !== undefined) {
- // Step 5.b.
- extensionIndex = r.extensionIndex;
-
- // Steps 5.d-e.
- extensionSubtags = StringSplitString(ToString(extension), "-");
- extensionSubtagsLength = extensionSubtags.length;
- }
-
- // Steps 6-7.
var result = new Record();
+
+ // Step 6.
result.dataLocale = foundLocale;
- // Step 8.
+ // Step 7.
var supportedExtension = "-u";
- // Steps 9-11.
- var i = 0;
- var len = relevantExtensionKeys.length;
- while (i < len) {
- // Steps 11.a-c.
- var key = relevantExtensionKeys[i];
+ // In this implementation, localeData is a function, not an object.
+ var localeDataProvider = localeData();
- // In this implementation, localeData is a function, not an object.
- var foundLocaleData = localeData(foundLocale);
- var keyLocaleData = foundLocaleData[key];
+ // Step 8.
+ for (var i = 0; i < relevantExtensionKeys.length; i++) {
+ var key = relevantExtensionKeys[i];
- // Locale data provides default value.
- // Step 11.d.
- var value = keyLocaleData[0];
+ // Steps 8.a-h (The locale data is only computed when needed).
+ var keyLocaleData = undefined;
+ var value = undefined;
// Locale tag may override.
- // Step 11.e.
+ // Step 8.g.
var supportedExtensionAddition = "";
- // Step 11.f is implemented by Utilities.js.
-
- var valuePos;
-
- // Step 11.g.
- if (extensionSubtags !== undefined) {
- // Step 11.g.i.
- var keyPos = callFunction(ArrayIndexOf, extensionSubtags, key);
-
- // Step 11.g.ii.
- if (keyPos !== -1) {
- // Step 11.g.ii.1.
- if (keyPos + 1 < extensionSubtagsLength &&
- extensionSubtags[keyPos + 1].length > 2)
- {
- // Step 11.g.ii.1.a.
- var requestedValue = extensionSubtags[keyPos + 1];
+ // Step 8.h.
+ if (extension !== undefined) {
+ // Step 8.h.i.
+ var requestedValue = UnicodeExtensionValue(extension, key);
- // Step 11.g.ii.1.b.
- valuePos = callFunction(ArrayIndexOf, keyLocaleData, requestedValue);
+ // Step 8.h.ii.
+ if (requestedValue !== undefined) {
+ // Steps 8.a-d.
+ keyLocaleData = callFunction(localeDataProvider[key], null, foundLocale);
- // Step 11.g.ii.1.c.
- if (valuePos !== -1) {
+ // Step 8.h.ii.1.
+ if (requestedValue !== "") {
+ // Step 8.h.ii.1.a.
+ if (callFunction(ArrayIndexOf, keyLocaleData, requestedValue) !== -1) {
value = requestedValue;
supportedExtensionAddition = "-" + key + "-" + value;
}
} else {
- // Step 11.g.ii.2.
+ // Step 8.h.ii.2.
// According to the LDML spec, if there's no type value,
// and true is an allowed value, it's used.
- // Step 11.g.ii.2.a.
- valuePos = callFunction(ArrayIndexOf, keyLocaleData, "true");
-
- // Step 11.g.ii.2.b.
- if (valuePos !== -1)
+ if (callFunction(ArrayIndexOf, keyLocaleData, "true") !== -1) {
value = "true";
+ supportedExtensionAddition = "-" + key;
+ }
}
}
}
// Options override all.
- // Step 11.h.i.
+ // Step 8.i.i.
var optionsValue = options[key];
- // Step 11.h, 11.h.ii.
- if (optionsValue !== undefined &&
- callFunction(ArrayIndexOf, keyLocaleData, optionsValue) !== -1)
- {
- // Step 11.h.ii.1.
- if (optionsValue !== value) {
+ // Step 8.i.ii.
+ assert(typeof optionsValue === "string" ||
+ optionsValue === undefined ||
+ optionsValue === null,
+ "unexpected type for options value");
+
+ // Steps 8.i, 8.i.iii.1.
+ if (optionsValue !== undefined && optionsValue !== value) {
+ // Steps 8.a-d.
+ if (keyLocaleData === undefined)
+ keyLocaleData = callFunction(localeDataProvider[key], null, foundLocale);
+
+ // Step 8.i.iii.
+ if (callFunction(ArrayIndexOf, keyLocaleData, optionsValue) !== -1) {
value = optionsValue;
supportedExtensionAddition = "";
}
}
- // Steps 11.i-k.
+ // Locale data provides default value.
+ if (value === undefined) {
+ // Steps 8.a-f.
+ value = keyLocaleData === undefined
+ ? callFunction(localeDataProvider.default[key], null, foundLocale)
+ : keyLocaleData[0];
+ }
+
+ // Step 8.j.
+ assert(typeof value === "string" || value === null, "unexpected locale data value");
result[key] = value;
+
+ // Step 8.k.
supportedExtension += supportedExtensionAddition;
- i++;
}
- // Step 12.
+ // Step 9.
if (supportedExtension.length > 2) {
- var preExtension = callFunction(String_substring, foundLocale, 0, extensionIndex);
- var postExtension = callFunction(String_substring, foundLocale, extensionIndex);
- foundLocale = preExtension + supportedExtension + postExtension;
+ assert(!callFunction(std_String_startsWith, foundLocale, "x-"),
+ "unexpected privateuse-only locale returned from ICU");
+
+ // Step 9.a.
+ var privateIndex = callFunction(std_String_indexOf, foundLocale, "-x-");
+
+ // Steps 9.b-c.
+ if (privateIndex === -1) {
+ foundLocale += supportedExtension;
+ } else {
+ var preExtension = callFunction(String_substring, foundLocale, 0, privateIndex);
+ var postExtension = callFunction(String_substring, foundLocale, privateIndex);
+ foundLocale = preExtension + supportedExtension + postExtension;
+ }
+
+ // Step 9.d-e (Step 9.e is not required in this implementation, because we don't
+ // canonicalize Unicode extension subtags).
+ assertIsValidAndCanonicalLanguageTag(foundLocale, "same locale with extension");
}
- // Steps 13-14.
+ // Step 10.
result.locale = foundLocale;
+
+ // Step 11.
return result;
}
@@ -904,31 +534,29 @@ function ResolveLocale(availableLocales, requestedLocales, options, relevantExte
* matching (possibly fallback) locale. Locales appear in the same order in the
* returned list as in the input list.
*
- * Spec: ECMAScript Internationalization API Specification, 9.2.6.
+ * Spec: ECMAScript Internationalization API Specification, 9.2.7.
*/
function LookupSupportedLocales(availableLocales, requestedLocales) {
- // Steps 1-2.
- var len = requestedLocales.length;
- var subset = new List();
+ // Step 1.
+ var subset = [];
- // Steps 3-4.
- var k = 0;
- while (k < len) {
- // Steps 4.a-b.
- var locale = requestedLocales[k];
+ // Step 2.
+ for (var i = 0; i < requestedLocales.length; i++) {
+ var locale = requestedLocales[i];
+
+ // Step 2.a.
var noExtensionsLocale = removeUnicodeExtensions(locale);
- // Step 4.c-d.
+ // Step 2.b.
var availableLocale = BestAvailableLocale(availableLocales, noExtensionsLocale);
- if (availableLocale !== undefined)
- callFunction(std_Array_push, subset, locale);
- // Step 4.e.
- k++;
+ // Step 2.c.
+ if (availableLocale !== undefined)
+ _DefineDataProperty(subset, subset.length, locale);
}
- // Steps 5-6.
- return callFunction(std_Array_slice, subset, 0);
+ // Step 3.
+ return subset;
}
@@ -937,7 +565,7 @@ function LookupSupportedLocales(availableLocales, requestedLocales) {
* matching (possibly fallback) locale. Locales appear in the same order in the
* returned list as in the input list.
*
- * Spec: ECMAScript Internationalization API Specification, 9.2.7.
+ * Spec: ECMAScript Internationalization API Specification, 9.2.8.
*/
function BestFitSupportedLocales(availableLocales, requestedLocales) {
// don't have anything better
@@ -950,19 +578,17 @@ function BestFitSupportedLocales(availableLocales, requestedLocales) {
* matching (possibly fallback) locale. Locales appear in the same order in the
* returned list as in the input list.
*
- * Spec: ECMAScript Internationalization API Specification, 9.2.8.
+ * Spec: ECMAScript Internationalization API Specification, 9.2.9.
*/
function SupportedLocales(availableLocales, requestedLocales, options) {
- /*jshint laxbreak: true */
-
// Step 1.
var matcher;
if (options !== undefined) {
- // Steps 1.a-b.
+ // Step 1.a.
options = ToObject(options);
- matcher = options.localeMatcher;
- // Step 1.c.
+ // Step 1.b
+ matcher = options.localeMatcher;
if (matcher !== undefined) {
matcher = ToString(matcher);
if (matcher !== "lookup" && matcher !== "best fit")
@@ -970,12 +596,12 @@ function SupportedLocales(availableLocales, requestedLocales, options) {
}
}
- // Steps 2-3.
+ // Steps 2-5.
var subset = (matcher === undefined || matcher === "best fit")
? BestFitSupportedLocales(availableLocales, requestedLocales)
: LookupSupportedLocales(availableLocales, requestedLocales);
- // Step 4.
+ // Steps 6-7.
for (var i = 0; i < subset.length; i++) {
_DefineDataProperty(subset, i, subset[i],
ATTR_ENUMERABLE | ATTR_NONCONFIGURABLE | ATTR_NONWRITABLE);
@@ -983,7 +609,7 @@ function SupportedLocales(availableLocales, requestedLocales, options) {
_DefineDataProperty(subset, "length", subset.length,
ATTR_NONENUMERABLE | ATTR_NONCONFIGURABLE | ATTR_NONWRITABLE);
- // Step 5.
+ // Step 8.
return subset;
}
@@ -993,7 +619,7 @@ function SupportedLocales(availableLocales, requestedLocales, options) {
* the required type, checks whether it is one of a list of allowed values,
* and fills in a fallback value if necessary.
*
- * Spec: ECMAScript Internationalization API Specification, 9.2.9.
+ * Spec: ECMAScript Internationalization API Specification, 9.2.10.
*/
function GetOption(options, property, type, values, fallback) {
// Step 1.
@@ -1049,26 +675,38 @@ function GetNumberOption(options, property, minimum, maximum, fallback) {
}
+// Symbols in the self-hosting compartment can't be cloned, use a separate
+// object to hold the actual symbol value.
+// TODO: Can we add support to clone symbols?
+var intlFallbackSymbolHolder = { value: undefined };
+
/**
- * Weak map used to track the initialize-as-Intl status (and, if an object has
- * been so initialized, the Intl-specific internal properties) of all objects.
- * Presence of an object as a key within this map indicates that the object has
- * its [[initializedIntlObject]] internal property set to true. The associated
- * value is an object whose structure is documented in |initializeIntlObject|
- * below.
+ * The [[FallbackSymbol]] symbol of the %Intl% intrinsic object.
*
- * Ideally we'd be using private symbols for internal properties, but
- * SpiderMonkey doesn't have those yet.
+ * This symbol is used to implement the legacy constructor semantics for
+ * Intl.DateTimeFormat and Intl.NumberFormat.
*/
-var internalsMap = new WeakMap();
+function intlFallbackSymbol() {
+ var fallbackSymbol = intlFallbackSymbolHolder.value;
+ if (!fallbackSymbol)
+ intlFallbackSymbolHolder.value = fallbackSymbol = std_Symbol();
+ return fallbackSymbol;
+}
/**
- * Set the [[initializedIntlObject]] internal property of |obj| to true.
+ * Initializes the INTL_INTERNALS_OBJECT_SLOT of the given object.
*/
-function initializeIntlObject(obj) {
+function initializeIntlObject(obj, type, lazyData) {
assert(IsObject(obj), "Non-object passed to initializeIntlObject");
+ assert((type === "Collator" && IsCollator(obj)) ||
+ (type === "DateTimeFormat" && IsDateTimeFormat(obj)) ||
+ (type === "NumberFormat" && IsNumberFormat(obj)) ||
+ (type === "PluralRules" && IsPluralRules(obj)) ||
+ (type === "RelativeTimeFormat" && IsRelativeTimeFormat(obj)),
+ "type must match the object's class");
+ assert(IsObject(lazyData), "non-object lazy data");
// Intl-initialized objects are weird. They have [[initializedIntlObject]]
// set on them, but they don't *necessarily* have any other properties.
@@ -1076,51 +714,26 @@ function initializeIntlObject(obj) {
// The meaning of an internals object for an object |obj| is as follows.
//
- // If the .type is "partial", |obj| has [[initializedIntlObject]] set but
- // nothing else. No other property of |internals| can be used. (This
- // occurs when InitializeCollator or similar marks an object as
- // [[initializedIntlObject]] but fails before marking it as the appropriate
- // more-specific type ["Collator", "DateTimeFormat", "NumberFormat"].)
+ // The .type property indicates the type of Intl object that |obj| is:
+ // "Collator", "DateTimeFormat", "NumberFormat", or "PluralRules" (likely
+ // with more coming in future Intl specs).
//
- // Otherwise, the .type indicates the type of Intl object that |obj| is:
- // "Collator", "DateTimeFormat", or "NumberFormat" (likely with more coming
- // in future Intl specs). In these cases |obj| *conceptually* also has
- // [[initializedCollator]] or similar set, and all the other properties
- // implied by that.
- //
- // If |internals| doesn't have a "partial" .type, two additional properties
- // have meaning. The .lazyData property stores information needed to
- // compute -- without observable side effects -- the actual internal Intl
- // properties of |obj|. If it is non-null, then the actual internal
- // properties haven't been computed, and .lazyData must be processed by
+ // The .lazyData property stores information needed to compute -- without
+ // observable side effects -- the actual internal Intl properties of
+ // |obj|. If it is non-null, then the actual internal properties haven't
+ // been computed, and .lazyData must be processed by
// |setInternalProperties| before internal Intl property values are
// available. If it is null, then the .internalProps property contains an
// object whose properties are the internal Intl properties of |obj|.
- internals.type = "partial";
- internals.lazyData = null;
+ var internals = std_Object_create(null);
+ internals.type = type;
+ internals.lazyData = lazyData;
internals.internalProps = null;
- callFunction(std_WeakMap_set, internalsMap, obj, internals);
- return internals;
-}
-
-
-/**
- * Mark |internals| as having the given type and lazy data.
- */
-function setLazyData(internals, type, lazyData)
-{
- assert(internals.type === "partial", "can't set lazy data for anything but a newborn");
- assert(type === "Collator" || type === "DateTimeFormat" ||
- type === "NumberFormat" || type === "PluralRules" ||
- type === "RelativeTimeFormat",
- "bad type");
- assert(IsObject(lazyData), "non-object lazy data");
-
- // Set in reverse order so that the .type change is a barrier.
- internals.lazyData = lazyData;
- internals.type = type;
+ assert(UnsafeGetReservedSlot(obj, INTL_INTERNALS_OBJECT_SLOT) === null,
+ "Internal slot already initialized?");
+ UnsafeSetReservedSlot(obj, INTL_INTERNALS_OBJECT_SLOT, internals);
}
@@ -1128,9 +741,7 @@ function setLazyData(internals, type, lazyData)
* Set the internal properties object for an |internals| object previously
* associated with lazy data.
*/
-function setInternalProperties(internals, internalProps)
-{
- assert(internals.type !== "partial", "newborn internals can't have computed internals");
+function setInternalProperties(internals, internalProps) {
assert(IsObject(internals.lazyData), "lazy data must exist already");
assert(IsObject(internalProps), "internalProps argument should be an object");
@@ -1144,10 +755,8 @@ function setInternalProperties(internals, internalProps)
* Get the existing internal properties out of a non-newborn |internals|, or
* null if none have been computed.
*/
-function maybeInternalProperties(internals)
-{
+function maybeInternalProperties(internals) {
assert(IsObject(internals), "non-object passed to maybeInternalProperties");
- assert(internals.type !== "partial", "maybeInternalProperties must only be used on completely-initialized internals objects");
var lazyData = internals.lazyData;
if (lazyData)
return null;
@@ -1157,48 +766,33 @@ function maybeInternalProperties(internals)
/**
- * Return whether |obj| has an[[initializedIntlObject]] property set to true.
- */
-function isInitializedIntlObject(obj) {
-#ifdef DEBUG
- var internals = callFunction(std_WeakMap_get, internalsMap, obj);
- if (IsObject(internals)) {
- assert(callFunction(std_Object_hasOwnProperty, internals, "type"), "missing type");
- var type = internals.type;
- assert(type === "partial" || type === "Collator" ||
- type === "DateTimeFormat" || type === "NumberFormat" ||
- type === "PluralRules" || type === "RelativeTimeFormat",
- "unexpected type");
- assert(callFunction(std_Object_hasOwnProperty, internals, "lazyData"), "missing lazyData");
- assert(callFunction(std_Object_hasOwnProperty, internals, "internalProps"), "missing internalProps");
- } else {
- assert(internals === undefined, "bad mapping for |obj|");
- }
-#endif
- return callFunction(std_WeakMap_has, internalsMap, obj);
-}
-
-
-/**
- * Check that |obj| meets the requirements for "this Collator object", "this
- * NumberFormat object", or "this DateTimeFormat object" as used in the method
- * with the given name. Throw a TypeError if |obj| doesn't meet these
- * requirements. But if it does, return |obj|'s internals object (*not* the
- * object holding its internal properties!), associated with it by
- * |internalsMap|, with structure specified above.
+ * Return |obj|'s internals object (*not* the object holding its internal
+ * properties!), with structure specified above.
*
* Spec: ECMAScript Internationalization API Specification, 10.3.
* Spec: ECMAScript Internationalization API Specification, 11.3.
* Spec: ECMAScript Internationalization API Specification, 12.3.
*/
-function getIntlObjectInternals(obj, className, methodName) {
- assert(typeof className === "string", "bad className for getIntlObjectInternals");
-
- var internals = callFunction(std_WeakMap_get, internalsMap, obj);
- assert(internals === undefined || isInitializedIntlObject(obj), "bad mapping in internalsMap");
-
- if (internals === undefined || internals.type !== className)
- ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, className, methodName, className);
+function getIntlObjectInternals(obj) {
+ assert(IsObject(obj), "getIntlObjectInternals called with non-Object");
+ assert(IsCollator(obj) || IsDateTimeFormat(obj) || IsNumberFormat(obj) ||
+ IsPluralRules(obj) || IsRelativeTimeFormat(obj),
+ "getIntlObjectInternals called with non-Intl object");
+
+ var internals = UnsafeGetReservedSlot(obj, INTL_INTERNALS_OBJECT_SLOT);
+
+ assert(IsObject(internals), "internals not an object");
+ assert(hasOwn("type", internals), "missing type");
+ assert((internals.type === "Collator" && IsCollator(obj)) ||
+ (internals.type === "DateTimeFormat" && IsDateTimeFormat(obj)) ||
+ (internals.type === "NumberFormat" && IsNumberFormat(obj)) ||
+ (internals.type === "PluralRules" && IsPluralRules(obj)) ||
+ (internals.type === "RelativeTimeFormat" && IsRelativeTimeFormat(obj)),
+ "type must match the object's class");
+ assert(hasOwn("lazyData", internals),
+ "missing lazyData");
+ assert(hasOwn("internalProps", internals),
+ "missing internalProps");
return internals;
}
@@ -1208,35 +802,32 @@ function getIntlObjectInternals(obj, className, methodName) {
* Get the internal properties of known-Intl object |obj|. For use only by
* C++ code that knows what it's doing!
*/
-function getInternals(obj)
-{
- assert(isInitializedIntlObject(obj), "for use only on guaranteed Intl objects");
+function getInternals(obj) {
+ var internals = getIntlObjectInternals(obj);
- var internals = callFunction(std_WeakMap_get, internalsMap, obj);
+ // If internal properties have already been computed, use them.
+ var internalProps = maybeInternalProperties(internals);
+ if (internalProps)
+ return internalProps;
- assert(internals.type !== "partial", "must have been successfully initialized");
- var lazyData = internals.lazyData;
- if (!lazyData)
- return internals.internalProps;
-
- var internalProps;
+ // Otherwise it's time to fully create them.
var type = internals.type;
-
+
switch (type) {
case "Collator":
- internalProps = resolveCollatorInternals(lazyData);
+ internalProps = resolveCollatorInternals(internals.lazyData);
break;
case "DateTimeFormat":
- internalProps = resolveDateTimeFormatInternals(lazyData);
+ internalProps = resolveDateTimeFormatInternals(internals.lazyData);
break;
case "PluralRules":
- internalProps = resolvePluralRulesInternals(lazyData);
+ internalProps = resolvePluralRulesInternals(internals.lazyData);
break;
- case "RelativeTimeFormat":
- internalProps = resolveRelativeTimeFormatInternals(lazyData);
+ case "NumberFormat":
+ internalProps = resolveNumberFormatInternals(internals.lazyData);
break;
- default: // type === "NumberFormat"
- internalProps = resolveNumberFormatInternals(lazyData);
+ default: // type === "RelativeTimeFormat"
+ internalProps = resolveRelativeTimeFormatInternals(internals.lazyData);
break;
}
setInternalProperties(internals, internalProps);
diff --git a/js/src/builtin/intl/DateTimeFormat.cpp b/js/src/builtin/intl/DateTimeFormat.cpp
index 2ac50897fe..dd9df42192 100644
--- a/js/src/builtin/intl/DateTimeFormat.cpp
+++ b/js/src/builtin/intl/DateTimeFormat.cpp
@@ -9,12 +9,14 @@
#include "mozilla/Assertions.h"
#include "mozilla/Range.h"
+#include "mozilla/Span.h"
#include "jscntxt.h"
#include "jsfriendapi.h"
#include "builtin/intl/CommonFunctions.h"
#include "builtin/intl/ICUHeader.h"
+#include "builtin/intl/LanguageTag.h"
#include "builtin/intl/ScopedICUObject.h"
#include "builtin/intl/SharedIntlData.h"
#include "builtin/intl/TimeZoneDataGenerated.h"
@@ -33,7 +35,7 @@ using JS::ClippedTime;
using JS::TimeClip;
using js::intl::CallICU;
-using js::intl::GetAvailableLocales;
+using js::intl::DateTimeFormatOptions;
using js::intl::IcuLocale;
using js::intl::INITIAL_CHAR_BUFFER_SIZE;
using js::intl::SharedIntlData;
@@ -89,72 +91,58 @@ static const JSFunctionSpec dateTimeFormat_methods[] = {
* ES2017 Intl draft rev 94045d234762ad107a3d09bb6f7381a65f1a2f9b
*/
static bool
-DateTimeFormat(JSContext* cx, const CallArgs& args, bool construct)
+DateTimeFormat(JSContext* cx, const CallArgs& args, bool construct, DateTimeFormatOptions dtfOptions)
{
- RootedObject obj(cx);
-
- // We're following ECMA-402 1st Edition when DateTimeFormat is called
- // because of backward compatibility issues.
- // See https://github.com/tc39/ecma402/issues/57
- if (!construct) {
- // ES Intl 1st ed., 12.1.2.1 step 3
- JSObject* intl = GlobalObject::getOrCreateIntlObject(cx, cx->global());
- if (!intl)
- return false;
- RootedValue self(cx, args.thisv());
- if (!self.isUndefined() && (!self.isObject() || self.toObject() != *intl)) {
- // ES Intl 1st ed., 12.1.2.1 step 4
- obj = ToObject(cx, self);
- if (!obj)
- return false;
-
- // ES Intl 1st ed., 12.1.2.1 step 5
- bool extensible;
- if (!IsExtensible(cx, obj, &extensible))
- return false;
- if (!extensible)
- return Throw(cx, obj, JSMSG_OBJECT_NOT_EXTENSIBLE);
- } else {
- // ES Intl 1st ed., 12.1.2.1 step 3.a
- construct = true;
- }
- }
- if (construct) {
- // Step 2 (Inlined 9.1.14, OrdinaryCreateFromConstructor).
- RootedObject proto(cx);
- if (args.isConstructing() && !GetPrototypeFromCallableConstructor(cx, args, &proto))
- return false;
+ // Step 1 (Handled by OrdinaryCreateFromConstructor fallback code).
- if (!proto) {
- proto = GlobalObject::getOrCreateDateTimeFormatPrototype(cx, cx->global());
- if (!proto)
- return false;
- }
+ // Step 2 (Inlined 9.1.14, OrdinaryCreateFromConstructor).
+ RootedObject proto(cx);
+ if (args.isConstructing() && !GetPrototypeFromCallableConstructor(cx, args, &proto))
+ return false;
- obj = NewObjectWithGivenProto<DateTimeFormatObject>(cx, proto);
- if (!obj)
+ if (!proto) {
+ proto = GlobalObject::getOrCreateDateTimeFormatPrototype(cx, cx->global());
+ if (!proto)
return false;
-
- obj->as<NativeObject>().setReservedSlot(DateTimeFormatObject::INTERNALS_SLOT, NullValue());
- obj->as<NativeObject>().setReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT, PrivateValue(nullptr));
}
- RootedValue locales(cx, args.length() > 0 ? args[0] : UndefinedValue());
- RootedValue options(cx, args.length() > 1 ? args[1] : UndefinedValue());
-
- // Step 3.
- if (!intl::InitializeObject(cx, obj, cx->names().InitializeDateTimeFormat, locales, options))
+ Rooted<DateTimeFormatObject*> dateTimeFormat(cx);
+ dateTimeFormat = NewObjectWithGivenProto<DateTimeFormatObject>(cx, proto);
+ if (!dateTimeFormat)
return false;
- args.rval().setObject(*obj);
- return true;
+ dateTimeFormat->setReservedSlot(DateTimeFormatObject::INTERNALS_SLOT, NullValue());
+ dateTimeFormat->setReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT,
+ PrivateValue(nullptr));
+
+ RootedValue thisValue(cx, construct ? ObjectValue(*dateTimeFormat) : args.thisv());
+ RootedValue locales(cx, args.get(0));
+ RootedValue options(cx, args.get(1));
+
+ // Step 3.
+ return intl::LegacyIntlInitialize(cx, dateTimeFormat, cx->names().InitializeDateTimeFormat,
+ thisValue, locales, options, dtfOptions, args.rval());
}
static bool
DateTimeFormat(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
- return DateTimeFormat(cx, args, args.isConstructing());
+ return DateTimeFormat(cx, args, args.isConstructing(), DateTimeFormatOptions::Standard);
+}
+
+static bool
+MozDateTimeFormat(JSContext* cx, unsigned argc, Value* vp)
+{
+ CallArgs args = CallArgsFromVp(argc, vp);
+
+ // Don't allow to call mozIntl.DateTimeFormat as a function. That way we
+ // don't need to worry how to handle the legacy initialization semantics
+ // when applied on mozIntl.DateTimeFormat.
+ if (!ThrowIfNotConstructing(cx, args, "mozIntl.DateTimeFormat"))
+ return false;
+
+ return DateTimeFormat(cx, args, true, DateTimeFormatOptions::EnableMozExtensions);
}
bool
@@ -166,7 +154,7 @@ js::intl_DateTimeFormat(JSContext* cx, unsigned argc, Value* vp)
// intl_DateTimeFormat is an intrinsic for self-hosted JavaScript, so it
// cannot be used with "new", but it still has to be treated as a
// constructor.
- return DateTimeFormat(cx, args, true);
+ return DateTimeFormat(cx, args, true, DateTimeFormatOptions::Standard);
}
void
@@ -174,30 +162,25 @@ js::DateTimeFormatObject::finalize(FreeOp* fop, JSObject* obj)
{
MOZ_ASSERT(fop->onMainThread());
- // This is-undefined check shouldn't be necessary, but for internal
- // brokenness in object allocation code. For the moment, hack around it by
- // explicitly guarding against the possibility of the reserved slot not
- // containing a private. See bug 949220.
const Value& slot = obj->as<DateTimeFormatObject>().getReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT);
- if (!slot.isUndefined()) {
- if (UDateFormat* df = static_cast<UDateFormat*>(slot.toPrivate()))
- udat_close(df);
- }
+ if (UDateFormat* df = static_cast<UDateFormat*>(slot.toPrivate()))
+ udat_close(df);
}
JSObject*
-js::CreateDateTimeFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global)
+js::CreateDateTimeFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global,
+ MutableHandleObject constructor, DateTimeFormatOptions dtfOptions)
{
RootedFunction ctor(cx);
- ctor = GlobalObject::createConstructor(cx, &DateTimeFormat, cx->names().DateTimeFormat, 0);
+ ctor = dtfOptions == DateTimeFormatOptions::EnableMozExtensions
+ ? GlobalObject::createConstructor(cx, MozDateTimeFormat, cx->names().DateTimeFormat, 0)
+ : GlobalObject::createConstructor(cx, DateTimeFormat, cx->names().DateTimeFormat, 0);
if (!ctor)
return nullptr;
- RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global,
- &DateTimeFormatObject::class_));
+ RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
if (!proto)
return nullptr;
- proto->setReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT, PrivateValue(nullptr));
if (!LinkConstructorAndPrototype(cx, ctor, proto))
return nullptr;
@@ -226,51 +209,60 @@ js::CreateDateTimeFormatPrototype(JSContext* cx, HandleObject Intl, Handle<Globa
return nullptr;
}
- RootedValue options(cx);
- if (!intl::CreateDefaultOptions(cx, &options))
- return nullptr;
-
- // 12.2.1 and 12.3
- if (!intl::InitializeObject(cx, proto, cx->names().InitializeDateTimeFormat, UndefinedHandleValue,
- options))
- {
- return nullptr;
- }
-
// 8.1
RootedValue ctorValue(cx, ObjectValue(*ctor));
if (!DefineProperty(cx, Intl, cx->names().DateTimeFormat, ctorValue, nullptr, nullptr, 0))
return nullptr;
+ constructor.set(ctor);
return proto;
}
bool
-js::intl_DateTimeFormat_availableLocales(JSContext* cx, unsigned argc, Value* vp)
+js::AddMozDateTimeFormatConstructor(JSContext* cx, JS::Handle<JSObject*> intl)
{
- CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 0);
+ Handle<GlobalObject*> global = cx->global();
+
+ RootedObject mozDateTimeFormat(cx);
+ JSObject* mozDateTimeFormatProto =
+ CreateDateTimeFormatPrototype(cx, intl, global, &mozDateTimeFormat, DateTimeFormatOptions::EnableMozExtensions);
+ return mozDateTimeFormatProto != nullptr;
+}
+
+static bool
+DefaultCalendar(JSContext* cx, const JSAutoByteString& locale, MutableHandleValue rval)
+{
+ UErrorCode status = U_ZERO_ERROR;
+ UCalendar* cal = ucal_open(nullptr, 0, locale.ptr(), UCAL_DEFAULT, &status);
+
+ // This correctly handles nullptr |cal| when opening failed.
+ ScopedICUObject<UCalendar, ucal_close> closeCalendar(cal);
+
+ const char* calendar = ucal_getType(cal, &status);
+ if (U_FAILURE(status)) {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
+ return false;
+ }
- RootedValue result(cx);
- if (!GetAvailableLocales(cx, udat_countAvailable, udat_getAvailable, &result))
+ // ICU returns old-style keyword values; map them to BCP 47 equivalents
+ JSString* str = JS_NewStringCopyZ(cx, uloc_toUnicodeLocaleType("ca", calendar));
+ if (!str)
return false;
- args.rval().set(result);
+
+ rval.setString(str);
return true;
}
-// ICU returns old-style keyword values; map them to BCP 47 equivalents
-// (see http://bugs.icu-project.org/trac/ticket/9620).
-static const char*
-bcp47CalendarName(const char* icuName)
+struct CalendarAlias
{
- if (StringsAreEqual(icuName, "ethiopic-amete-alem"))
- return "ethioaa";
- if (StringsAreEqual(icuName, "gregorian"))
- return "gregory";
- if (StringsAreEqual(icuName, "islamic-civil"))
- return "islamicc";
- return icuName;
-}
+ const char* const calendar;
+ const char* const alias;
+};
+
+const CalendarAlias calendarAliases[] = {
+ { "islamic-civil", "islamicc" },
+ { "ethioaa", "ethiopic-amete-alem" }
+};
bool
js::intl_availableCalendars(JSContext* cx, unsigned argc, Value* vp)
@@ -289,30 +281,15 @@ js::intl_availableCalendars(JSContext* cx, unsigned argc, Value* vp)
uint32_t index = 0;
// We need the default calendar for the locale as the first result.
- UErrorCode status = U_ZERO_ERROR;
- RootedString jscalendar(cx);
- {
- UCalendar* cal = ucal_open(nullptr, 0, locale.ptr(), UCAL_DEFAULT, &status);
-
- // This correctly handles nullptr |cal| when opening failed.
- ScopedICUObject<UCalendar, ucal_close> closeCalendar(cal);
-
- const char* calendar = ucal_getType(cal, &status);
- if (U_FAILURE(status)) {
- intl::ReportInternalError(cx);
- return false;
- }
-
- jscalendar = JS_NewStringCopyZ(cx, bcp47CalendarName(calendar));
- if (!jscalendar)
- return false;
- }
+ RootedValue element(cx);
+ if (!DefaultCalendar(cx, locale, &element))
+ return false;
- RootedValue element(cx, StringValue(jscalendar));
if (!DefineElement(cx, calendars, index++, element))
return false;
// Now get the calendars that "would make a difference", i.e., not the default.
+ UErrorCode status = U_ZERO_ERROR;
UEnumeration* values = ucal_getKeywordValuesForLocale("ca", locale.ptr(), false, &status);
if (U_FAILURE(status)) {
intl::ReportInternalError(cx);
@@ -333,12 +310,27 @@ js::intl_availableCalendars(JSContext* cx, unsigned argc, Value* vp)
return false;
}
- jscalendar = JS_NewStringCopyZ(cx, bcp47CalendarName(calendar));
+ // ICU returns old-style keyword values; map them to BCP 47 equivalents
+ calendar = uloc_toUnicodeLocaleType("ca", calendar);
+
+ JSString* jscalendar = JS_NewStringCopyZ(cx, calendar);
if (!jscalendar)
return false;
element = StringValue(jscalendar);
if (!DefineElement(cx, calendars, index++, element))
return false;
+
+ // ICU doesn't return calendar aliases, append them here.
+ for (const auto& calendarAlias : calendarAliases) {
+ if (StringsAreEqual(calendar, calendarAlias.calendar)) {
+ JSString* jscalendar = JS_NewStringCopyZ(cx, calendarAlias.alias);
+ if (!jscalendar)
+ return false;
+ element = StringValue(jscalendar);
+ if (!DefineElement(cx, calendars, index++, element))
+ return false;
+ }
+ }
}
args.rval().setObject(*calendars);
@@ -346,6 +338,20 @@ js::intl_availableCalendars(JSContext* cx, unsigned argc, Value* vp)
}
bool
+js::intl_defaultCalendar(JSContext* cx, unsigned argc, Value* vp)
+{
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 1);
+ MOZ_ASSERT(args[0].isString());
+
+ JSAutoByteString locale(cx, args[0].toString());
+ if (!locale)
+ return false;
+
+ return DefaultCalendar(cx, locale, args.rval());
+}
+
+bool
js::intl_IsValidTimeZoneName(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
@@ -448,13 +454,139 @@ js::intl_defaultTimeZoneOffset(JSContext* cx, unsigned argc, Value* vp) {
return true;
}
+enum class HourCycle {
+ // 12 hour cycle, from 0 to 11.
+ H11,
+
+ // 12 hour cycle, from 1 to 12.
+ H12,
+
+ // 24 hour cycle, from 0 to 23.
+ H23,
+
+ // 24 hour cycle, from 1 to 24.
+ H24
+};
+
+static bool
+IsHour12(HourCycle hc)
+{
+ return hc == HourCycle::H11 || hc == HourCycle::H12;
+}
+
+static char16_t
+HourSymbol(HourCycle hc)
+{
+ switch (hc) {
+ case HourCycle::H11:
+ return 'K';
+ case HourCycle::H12:
+ return 'h';
+ case HourCycle::H23:
+ return 'H';
+ case HourCycle::H24:
+ return 'k';
+ }
+ MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("unexpected hour cycle");
+}
+
+/**
+* Parse a pattern according to the format specified in
+* <https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns>.
+*/
+template <typename CharT>
+class PatternIterator {
+ CharT* iter_;
+ const CharT* const end_;
+
+ public:
+ explicit PatternIterator(mozilla::Span<CharT> pattern)
+ : iter_(pattern.data()), end_(pattern.data() + pattern.size()) {}
+
+ CharT* next() {
+ MOZ_ASSERT(iter_ != nullptr);
+
+ bool inQuote = false;
+ while (iter_ < end_) {
+ CharT* cur = iter_++;
+ if (*cur == '\'') {
+ inQuote = !inQuote;
+ } else if (!inQuote) {
+ return cur;
+ }
+ }
+
+ iter_ = nullptr;
+ return nullptr;
+ }
+};
+
+/**
+* Return the hour cycle for the given option string.
+*/
+static HourCycle
+HourCycleFromOption(JSLinearString* str)
+{
+ if (StringEqualsAscii(str, "h11")) {
+ return HourCycle::H11;
+ }
+ if (StringEqualsAscii(str, "h12")) {
+ return HourCycle::H12;
+ }
+ if (StringEqualsAscii(str, "h23")) {
+ return HourCycle::H23;
+ }
+ MOZ_ASSERT(StringEqualsAscii(str, "h24"));
+ return HourCycle::H24;
+}
+
+/**
+* Return the hour cycle used in the input pattern or Nothing if none was found.
+*/
+static mozilla::Maybe<HourCycle>
+HourCycleFromPattern(mozilla::Span<const char16_t> pattern)
+{
+ PatternIterator<const char16_t> iter(pattern);
+ while (const auto* ptr = iter.next()) {
+ switch (*ptr) {
+ case 'K':
+ return mozilla::Some(HourCycle::H11);
+ case 'h':
+ return mozilla::Some(HourCycle::H12);
+ case 'H':
+ return mozilla::Some(HourCycle::H23);
+ case 'k':
+ return mozilla::Some(HourCycle::H24);
+ }
+ }
+ return mozilla::Nothing();
+}
+
+/**
+* Replaces all hour pattern characters in |pattern| to use the matching hour
+* representation for |hourCycle|.
+*/
+static void
+ReplaceHourSymbol(mozilla::Span<char16_t> pattern, HourCycle hc)
+{
+ char16_t replacement = HourSymbol(hc);
+ PatternIterator<char16_t> iter(pattern);
+ while (auto* ptr = iter.next()) {
+ char16_t ch = *ptr;
+ if (ch == 'K' || ch == 'h' || ch == 'H' || ch == 'k') {
+ *ptr = replacement;
+ }
+ }
+}
+
bool
js::intl_patternForSkeleton(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 2);
+ MOZ_ASSERT(args.length() == 3);
MOZ_ASSERT(args[0].isString());
MOZ_ASSERT(args[1].isString());
+ MOZ_ASSERT(args[2].isString() || args[2].isUndefined());
JSAutoByteString locale(cx, args[0].toString());
if (!locale)
@@ -468,6 +600,16 @@ js::intl_patternForSkeleton(JSContext* cx, unsigned argc, Value* vp)
if (!stableChars.initTwoByte(cx, skeletonFlat))
return false;
+ mozilla::Maybe<HourCycle> hourCycle;
+ if (args[2].isString()) {
+ JSLinearString* hourCycleStr = args[2].toString()->ensureLinear(cx);
+ if (!hourCycleStr) {
+ return false;
+ }
+
+ hourCycle.emplace(HourCycleFromOption(hourCycleStr));
+ }
+
mozilla::Range<const char16_t> skeletonChars = stableChars.twoByteRange();
uint32_t skeletonLen = u_strlen(Char16ToUChar(skeletonChars.begin().get()));
@@ -479,11 +621,220 @@ js::intl_patternForSkeleton(JSContext* cx, unsigned argc, Value* vp)
}
ScopedICUObject<UDateTimePatternGenerator, udatpg_close> toClose(gen);
- JSString* str =
- CallICU(cx, [gen, &skeletonChars, skeletonLen](UChar* chars, uint32_t size, UErrorCode* status) {
- return udatpg_getBestPattern(gen, skeletonChars.begin().get(), skeletonLen,
- chars, size, status);
+ Vector<char16_t, intl::INITIAL_CHAR_BUFFER_SIZE> pattern(cx);
+
+ int32_t patternSize = CallICU(
+ cx,
+ pattern,
+ [gen, &skeletonChars](UChar* chars, uint32_t size, UErrorCode* status) {
+ return udatpg_getBestPattern(gen, skeletonChars.begin().get(),
+ skeletonChars.length(), chars, size, status);
+ });
+ if (patternSize < 0) {
+ return false;
+ }
+
+ // If the hourCycle option was set, adjust the resolved pattern to use the
+ // requested hour cycle representation.
+ if (hourCycle) {
+ ReplaceHourSymbol(pattern, hourCycle.value());
+ }
+
+ JSString* str = NewStringCopyN<CanGC>(cx, pattern.begin(), pattern.length());
+ if (!str) {
+ return false;
+ }
+ args.rval().setString(str);
+ return true;
+}
+
+/**
+ * Find a matching pattern using the requested hour-12 options.
+ *
+ * This function is needed to work around the following two issues.
+ * - https://unicode-org.atlassian.net/browse/ICU-21023
+ * - https://unicode-org.atlassian.net/browse/CLDR-13425
+ *
+ * We're currently using a relatively simple workaround, which doesn't give the
+ * most accurate results. For example:
+ *
+ * ```
+ * var dtf = new Intl.DateTimeFormat("en", {
+ * timeZone: "UTC",
+ * dateStyle: "long",
+ * timeStyle: "long",
+ * hourCycle: "h12",
+ * });
+ * print(dtf.format(new Date("2020-01-01T00:00Z")));
+ * ```
+ *
+ * Returns the pattern "MMMM d, y 'at' h:mm:ss a z", but when going through
+ * |udatpg_getSkeleton| and then |udatpg_getBestPattern| to find an equivalent
+ * pattern for "h23", we'll end up with the pattern "MMMM d, y, HH:mm:ss z", so
+ * the combinator element " 'at' " was lost in the process.
+ */
+template <size_t N>
+static bool
+FindPatternWithHourCycle(JSContext* cx, const char* locale,
+ Vector<char16_t, N>& pattern, bool hour12)
+{
+ UErrorCode status = U_ZERO_ERROR;
+ UDateTimePatternGenerator* gen = udatpg_open(IcuLocale(locale), &status);
+ if (U_FAILURE(status)) {
+ intl::ReportInternalError(cx);
+ return false;
+ }
+ ScopedICUObject<UDateTimePatternGenerator, udatpg_close> toClose(gen);
+
+ if (!gen) {
+ return false;
+ }
+
+ Vector<char16_t, intl::INITIAL_CHAR_BUFFER_SIZE> skeleton(cx);
+
+ int32_t skeletonSize = CallICU(
+ cx,
+ skeleton,
+ [&pattern](UChar* chars, uint32_t size, UErrorCode* status) {
+ return udatpg_getSkeleton(nullptr, pattern.begin(), pattern.length(),
+ chars, size, status);
+ });
+ if (skeletonSize < 0) {
+ return false;
+ }
+
+ // Input skeletons don't differentiate between "K" and "h" resp. "k" and "H".
+ ReplaceHourSymbol(skeleton, hour12 ? HourCycle::H12 : HourCycle::H23);
+
+ MOZ_ALWAYS_TRUE(pattern.resize(0));
+
+ int32_t patternSize = CallICU(
+ cx,
+ pattern,
+ [gen, &skeleton](UChar* chars, uint32_t size, UErrorCode* status) {
+ return udatpg_getBestPattern(gen, skeleton.begin(), skeleton.length(),
+ chars, size, status);
+ });
+ if (patternSize < 0) {
+ return false;
+ }
+
+ return true;
+}
+
+bool
+js::intl_patternForStyle(JSContext* cx, unsigned argc, Value* vp)
+{
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 6);
+ MOZ_ASSERT(args[0].isString());
+ MOZ_ASSERT(args[1].isString() || args[1].isUndefined());
+ MOZ_ASSERT(args[2].isString() || args[2].isUndefined());
+ MOZ_ASSERT(args[3].isString());
+ MOZ_ASSERT(args[4].isBoolean() || args[4].isUndefined());
+ MOZ_ASSERT(args[5].isString() || args[5].isUndefined());
+
+ JSAutoByteString locale(cx, args[0].toString());
+ if (!locale)
+ return false;
+
+ auto toDateFormatStyle = [](JSLinearString* str) {
+ if (StringEqualsAscii(str, "full")) {
+ return UDAT_FULL;
+ }
+ if (StringEqualsAscii(str, "long")) {
+ return UDAT_LONG;
+ }
+ if (StringEqualsAscii(str, "medium")) {
+ return UDAT_MEDIUM;
+ }
+ MOZ_ASSERT(StringEqualsAscii(str, "short"));
+ return UDAT_SHORT;
+ };
+
+ UDateFormatStyle dateStyle = UDAT_NONE;
+
+ if (args[1].isString()) {
+ JSLinearString* dateStyleStr = args[1].toString()->ensureLinear(cx);
+ if (!dateStyleStr)
+ return false;
+
+ dateStyle = toDateFormatStyle(dateStyleStr);
+ }
+
+ UDateFormatStyle timeStyle = UDAT_NONE;
+ if (args[2].isString()) {
+ JSLinearString* timeStyleStr = args[2].toString()->ensureLinear(cx);
+ if (!timeStyleStr)
+ return false;
+
+ timeStyle = toDateFormatStyle(timeStyleStr);
+ }
+
+ AutoStableStringChars timeZone(cx);
+ if (!timeZone.initTwoByte(cx, args[3].toString()))
+ return false;
+
+ mozilla::Maybe<bool> hour12;
+ if (args[4].isBoolean()) {
+ hour12.emplace(args[4].toBoolean());
+ }
+
+ mozilla::Maybe<HourCycle> hourCycle;
+ if (args[5].isString()) {
+ JSLinearString* hourCycleStr = args[5].toString()->ensureLinear(cx);
+ if (!hourCycleStr) {
+ return false;
+ }
+
+ hourCycle.emplace(HourCycleFromOption(hourCycleStr));
+ }
+
+ mozilla::Range<const char16_t> timeZoneChars = timeZone.twoByteRange();
+
+ UErrorCode status = U_ZERO_ERROR;
+ UDateFormat* df = udat_open(timeStyle, dateStyle, IcuLocale(locale.ptr()),
+ Char16ToUChar(timeZoneChars.begin().get()),
+ timeZoneChars.length(), nullptr, -1, &status);
+ if (U_FAILURE(status)) {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
+ return false;
+ }
+ ScopedICUObject<UDateFormat, udat_close> toClose(df);
+
+ Vector<char16_t, intl::INITIAL_CHAR_BUFFER_SIZE> pattern(cx);
+
+ int32_t patternSize = CallICU(
+ cx,
+ pattern,
+ [df](UChar* chars, uint32_t size, UErrorCode* status) {
+ return udat_toPattern(df, false, chars, size, status);
});
+ if (patternSize < 0) {
+ return false;
+ }
+
+ // If a specific hour cycle was requested and this hour cycle doesn't match
+ // the hour cycle used in the resolved pattern, find an equivalent pattern
+ // with the correct hour cycle.
+ if (timeStyle != UDAT_NONE && (hour12 || hourCycle)) {
+ if (auto hcPattern = HourCycleFromPattern(pattern)) {
+ bool wantHour12 = hour12 ? hour12.value() : IsHour12(hourCycle.value());
+ if (wantHour12 != IsHour12(hcPattern.value())) {
+ if (!FindPatternWithHourCycle(cx, locale.ptr(), pattern, wantHour12)) {
+ return false;
+ }
+ }
+ }
+ }
+
+ // If the hourCycle option was set, adjust the resolved pattern to use the
+ // requested hour cycle representation.
+ if (hourCycle) {
+ ReplaceHourSymbol(pattern, hourCycle.value());
+ }
+
+ JSString* str = NewStringCopyN<CanGC>(cx, pattern.begin(), pattern.length());
if (!str)
return false;
args.rval().setString(str);
@@ -495,7 +846,7 @@ js::intl_patternForSkeleton(JSContext* cx, unsigned argc, Value* vp)
* of the given DateTimeFormat.
*/
static UDateFormat*
-NewUDateFormat(JSContext* cx, HandleObject dateTimeFormat)
+NewUDateFormat(JSContext* cx, Handle<DateTimeFormatObject*> dateTimeFormat)
{
RootedValue value(cx);
@@ -505,14 +856,57 @@ NewUDateFormat(JSContext* cx, HandleObject dateTimeFormat)
if (!GetProperty(cx, internals, internals, cx->names().locale, &value))
return nullptr;
- JSAutoByteString locale(cx, value.toString());
- if (!locale)
- return nullptr;
- // We don't need to look at calendar and numberingSystem - they can only be
- // set via the Unicode locale extension and are therefore already set on
+ // ICU expects calendar and numberingSystem as Unicode locale extensions on
// locale.
+ intl::LanguageTag tag(cx);
+ {
+ JSLinearString* locale = value.toString()->ensureLinear(cx);
+ if (!locale)
+ return nullptr;
+
+ if (!intl::LanguageTagParser::parse(cx, locale, tag))
+ return nullptr;
+ }
+
+ JS::RootedVector<intl::UnicodeExtensionKeyword> keywords(cx);
+
+ if (!GetProperty(cx, internals, internals, cx->names().calendar, &value))
+ return nullptr;
+
+ {
+ JSLinearString* calendar = value.toString()->ensureLinear(cx);
+ if (!calendar)
+ return nullptr;
+
+ if (!keywords.emplaceBack("ca", calendar))
+ return nullptr;
+ }
+
+ if (!GetProperty(cx, internals, internals, cx->names().numberingSystem, &value))
+ return nullptr;
+
+ {
+ JSLinearString* numberingSystem = value.toString()->ensureLinear(cx);
+ if (!numberingSystem)
+ return nullptr;
+
+ if (!keywords.emplaceBack("nu", numberingSystem))
+ return nullptr;
+ }
+
+ // |ApplyUnicodeExtensionToTag| applies the new keywords to the front of
+ // the Unicode extension subtag. We're then relying on ICU to follow RFC
+ // 6067, which states that any trailing keywords using the same key
+ // should be ignored.
+ if (!intl::ApplyUnicodeExtensionToTag(cx, tag, keywords))
+ return nullptr;
+
+ UniqueChars locale = tag.toStringZ(cx);
+ if (!locale)
+ return nullptr;
+
if (!GetProperty(cx, internals, internals, cx->names().timeZone, &value))
return nullptr;
@@ -537,7 +931,7 @@ NewUDateFormat(JSContext* cx, HandleObject dateTimeFormat)
UErrorCode status = U_ZERO_ERROR;
UDateFormat* df =
- udat_open(UDAT_PATTERN, UDAT_PATTERN, IcuLocale(locale.ptr()), uTimeZone, uTimeZoneLength,
+ udat_open(UDAT_PATTERN, UDAT_PATTERN, IcuLocale(locale.get()), uTimeZone, uTimeZoneLength,
uPattern, uPatternLength, &status);
if (U_FAILURE(status)) {
intl::ReportInternalError(cx);
@@ -558,7 +952,8 @@ static bool
intl_FormatDateTime(JSContext* cx, UDateFormat* df, double x, MutableHandleValue result)
{
if (!IsFinite(x)) {
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DATE_NOT_FINITE);
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DATE_NOT_FINITE,
+ "DateTimeFormat", "format");
return false;
}
@@ -664,7 +1059,8 @@ static bool
intl_FormatToPartsDateTime(JSContext* cx, UDateFormat* df, double x, MutableHandleValue result)
{
if (!IsFinite(x)) {
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DATE_NOT_FINITE);
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DATE_NOT_FINITE,
+ "DateTimeFormat", "formatToParts");
return false;
}
@@ -777,42 +1173,23 @@ js::intl_FormatDateTime(JSContext* cx, unsigned argc, Value* vp)
MOZ_ASSERT(args[1].isNumber());
MOZ_ASSERT(args[2].isBoolean());
- RootedObject dateTimeFormat(cx, &args[0].toObject());
-
- // Obtain a UDateFormat object, cached if possible.
- bool isDateTimeFormatInstance = dateTimeFormat->getClass() == &DateTimeFormatObject::class_;
- UDateFormat* df;
- if (isDateTimeFormatInstance) {
- void* priv =
- dateTimeFormat->as<NativeObject>().getReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT).toPrivate();
- df = static_cast<UDateFormat*>(priv);
- if (!df) {
- df = NewUDateFormat(cx, dateTimeFormat);
- if (!df)
- return false;
- dateTimeFormat->as<NativeObject>().setReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT, PrivateValue(df));
- }
- } else {
- // There's no good place to cache the ICU date-time format for an object
- // that has been initialized as a DateTimeFormat but is not a
- // DateTimeFormat instance. One possibility might be to add a
- // DateTimeFormat instance as an internal property to each such object.
+ Rooted<DateTimeFormatObject*> dateTimeFormat(cx);
+ dateTimeFormat = &args[0].toObject().as<DateTimeFormatObject>();
+
+ // Obtain a cached UDateFormat object.
+ void* priv =
+ dateTimeFormat->getReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT).toPrivate();
+ UDateFormat* df = static_cast<UDateFormat*>(priv);
+ if (!df) {
df = NewUDateFormat(cx, dateTimeFormat);
if (!df)
return false;
+ dateTimeFormat->setReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT, PrivateValue(df));
}
// Use the UDateFormat to actually format the time stamp.
- RootedValue result(cx);
- bool success = args[2].toBoolean()
- ? intl_FormatToPartsDateTime(cx, df, args[1].toNumber(), &result)
- : intl_FormatDateTime(cx, df, args[1].toNumber(), &result);
-
- if (!isDateTimeFormatInstance)
- udat_close(df);
- if (!success)
- return false;
- args.rval().set(result);
- return true;
+ return args[2].toBoolean()
+ ? intl_FormatToPartsDateTime(cx, df, args[1].toNumber(), args.rval())
+ : intl_FormatDateTime(cx, df, args[1].toNumber(), args.rval());
}
diff --git a/js/src/builtin/intl/DateTimeFormat.h b/js/src/builtin/intl/DateTimeFormat.h
index ff40de3c80..5a223e8716 100644
--- a/js/src/builtin/intl/DateTimeFormat.h
+++ b/js/src/builtin/intl/DateTimeFormat.h
@@ -41,7 +41,8 @@ class DateTimeFormatObject : public NativeObject
extern JSObject*
CreateDateTimeFormatPrototype(JSContext* cx, JS::Handle<JSObject*> Intl,
- JS::Handle<GlobalObject*> global);
+ JS::Handle<GlobalObject*> global, MutableHandleObject constructor,
+ intl::DateTimeFormatOptions dtfOptions);
/**
* Returns a new instance of the standard built-in DateTimeFormat constructor.
@@ -54,17 +55,6 @@ extern MOZ_MUST_USE bool
intl_DateTimeFormat(JSContext* cx, unsigned argc, Value* vp);
/**
- * Returns an object indicating the supported locales for date and time
- * formatting by having a true-valued property for each such locale with the
- * canonicalized language tag as the property name. The object has no
- * prototype.
- *
- * Usage: availableLocales = intl_DateTimeFormat_availableLocales()
- */
-extern MOZ_MUST_USE bool
-intl_DateTimeFormat_availableLocales(JSContext* cx, unsigned argc, Value* vp);
-
-/**
* Returns an array with the calendar type identifiers per Unicode
* Technical Standard 35, Unicode Locale Data Markup Language, for the
* supported calendars for the given locale. The default calendar is
@@ -76,6 +66,16 @@ extern MOZ_MUST_USE bool
intl_availableCalendars(JSContext* cx, unsigned argc, Value* vp);
/**
+ * Returns the calendar type identifier per Unicode Technical Standard 35,
+ * Unicode Locale Data Markup Language, for the default calendar for the given
+ * locale.
+ *
+ * Usage: calendar = intl_defaultCalendar(locale)
+ */
+extern MOZ_MUST_USE bool
+intl_defaultCalendar(JSContext* cx, unsigned argc, Value* vp);
+
+/**
* 6.4.1 IsValidTimeZoneName ( timeZone )
*
* Verifies that the given string is a valid time zone name. If it is a valid
@@ -119,19 +119,53 @@ intl_defaultTimeZoneOffset(JSContext* cx, unsigned argc, Value* vp);
* best-fit date-time format pattern corresponding to skeleton for the
* given locale.
*
- * Usage: pattern = intl_patternForSkeleton(locale, skeleton)
+ * Usage: pattern = intl_patternForSkeleton(locale, skeleton, hourCycle)
*/
extern MOZ_MUST_USE bool
intl_patternForSkeleton(JSContext* cx, unsigned argc, Value* vp);
/**
+ * Return a pattern in the date-time format pattern language of Unicode
+ * Technical Standard 35, Unicode Locale Data Markup Language, for the
+ * best-fit date-time style for the given locale.
+ * The function takes six arguments:
+ *
+ * locale
+ * BCP47 compliant locale string
+ * dateStyle
+ * A string with values: full or long or medium or short, or `undefined`
+ * timeStyle
+ * A string with values: full or long or medium or short, or `undefined`
+ * timeZone
+ * IANA time zone name
+ * hour12
+ * A boolean to request hour12 representation, or `undefined`
+ * hourCycle
+ * A string with values: h11, h12, h23, or h24, or `undefined`
+ *
+ * Date and time style categories map to CLDR time/date standard
+ * format patterns.
+ *
+ * For the definition of a pattern string, see LDML 4.8:
+ * http://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns
+ *
+ * If `undefined` is passed to `dateStyle` or `timeStyle`, the respective
+ * portions of the pattern will not be included in the result.
+ *
+ * Usage: pattern = intl_patternForStyle(locale, dateStyle, timeStyle, timeZone,
+ * hour12, hourCycle)
+ */
+extern MOZ_MUST_USE bool
+intl_patternForStyle(JSContext* cx, unsigned argc, Value* vp);
+
+/**
* Returns a String value representing x (which must be a Number value)
* according to the effective locale and the formatting options of the
* given DateTimeFormat.
*
* Spec: ECMAScript Internationalization API Specification, 12.3.2.
*
- * Usage: formatted = intl_FormatDateTime(dateTimeFormat, x)
+ * Usage: formatted = intl_FormatDateTime(dateTimeFormat, x, formatToParts)
*/
extern MOZ_MUST_USE bool
intl_FormatDateTime(JSContext* cx, unsigned argc, Value* vp);
diff --git a/js/src/builtin/intl/DateTimeFormat.js b/js/src/builtin/intl/DateTimeFormat.js
index b7a71bdd6b..99c078fec4 100644
--- a/js/src/builtin/intl/DateTimeFormat.js
+++ b/js/src/builtin/intl/DateTimeFormat.js
@@ -20,7 +20,11 @@ function resolveDateTimeFormatInternals(lazyDateTimeFormatData) {
// {
// localeMatcher: "lookup" / "best fit",
//
- // hour12: true / false, // optional
+ // ca: string matching a Unicode extension type, // optional
+ //
+ // nu: string matching a Unicode extension type, // optional
+ //
+ // hc: "h11" / "h12" / "h23" / "h24", // optional
// }
//
// timeZone: IANA time zone name,
@@ -29,9 +33,18 @@ function resolveDateTimeFormatInternals(lazyDateTimeFormatData) {
// {
// // all the properties/values listed in Table 3
// // (weekday, era, year, month, day, &c.)
+ //
+ // hour12: true / false, // optional
// }
//
// formatMatcher: "basic" / "best fit",
+ //
+ // dateStyle: "full" / "long" / "medium" / "short" / undefined,
+ //
+ // timeStyle: "full" / "long" / "medium" / "short" / undefined,
+ //
+ // patternOption:
+ // String representing LDML Date Format pattern or undefined
// }
//
// Note that lazy data is only installed as a final step of initialization,
@@ -39,22 +52,22 @@ function resolveDateTimeFormatInternals(lazyDateTimeFormatData) {
// never a subset of them.
var internalProps = std_Object_create(null);
+
+ var DateTimeFormat = dateTimeFormatInternalProperties;
// Compute effective locale.
- // Step 8.
- var DateTimeFormat = dateTimeFormatInternalProperties;
- // Step 9.
+ // Step 10.
var localeData = DateTimeFormat.localeData;
- // Step 10.
- var r = ResolveLocale(callFunction(DateTimeFormat.availableLocales, DateTimeFormat),
+ // Step 11.
+ var r = ResolveLocale("DateTimeFormat",
lazyDateTimeFormatData.requestedLocales,
lazyDateTimeFormatData.localeOpt,
DateTimeFormat.relevantExtensionKeys,
localeData);
- // Steps 11-13.
+ // Steps 12-13, 15.
internalProps.locale = r.locale;
internalProps.calendar = r.ca;
internalProps.numberingSystem = r.nu;
@@ -63,26 +76,43 @@ function resolveDateTimeFormatInternals(lazyDateTimeFormatData) {
// Step 14.
var dataLocale = r.dataLocale;
- // Steps 15-17.
- var tz = lazyDateTimeFormatData.timeZone;
- if (tz === undefined) {
- // Step 16.
- tz = DefaultTimeZone();
- }
- internalProps.timeZone = tz;
+ // Steps 20.
+ internalProps.timeZone = lazyDateTimeFormatData.timeZone;
- // Step 18.
+ // Step 21.
var formatOpt = lazyDateTimeFormatData.formatOpt;
- // Steps 27-28, more or less - see comment after this function.
- var pattern = toBestICUPattern(dataLocale, formatOpt);
+ // Step 16.
+ // Copy the hourCycle setting, if present, to the format options. But
+ // only do this if no hour12 option is present, because the latter takes
+ // precedence over hourCycle.
+ if (r.hc !== null && formatOpt.hour12 === undefined)
+ formatOpt.hourCycle = r.hc;
+
+ // Steps 26-30, more or less - see comment after this function.
+ var pattern;
+ if (lazyDateTimeFormatData.patternOption !== undefined) {
+ pattern = lazyDateTimeFormatData.patternOption;
+
+ internalProps.patternOption = lazyDateTimeFormatData.patternOption;
+ } else if (lazyDateTimeFormatData.dateStyle !== undefined ||
+ lazyDateTimeFormatData.timeStyle !== undefined) {
+ pattern = intl_patternForStyle(dataLocale,
+ lazyDateTimeFormatData.dateStyle,
+ lazyDateTimeFormatData.timeStyle,
+ lazyDateTimeFormatData.timeZone,
+ formatOpt.hour12,
+ formatOpt.hourCycle);
+
+ internalProps.dateStyle = lazyDateTimeFormatData.dateStyle;
+ internalProps.timeStyle = lazyDateTimeFormatData.timeStyle;
+ } else {
+ pattern = toBestICUPattern(dataLocale, formatOpt);
+ }
- // Step 29.
+ // Step 31.
internalProps.pattern = pattern;
- // Step 30.
- internalProps.boundFormat = undefined;
-
// The caller is responsible for associating |internalProps| with the right
// object using |setInternalProperties|.
return internalProps;
@@ -90,11 +120,13 @@ function resolveDateTimeFormatInternals(lazyDateTimeFormatData) {
/**
- * Returns an object containing the DateTimeFormat internal properties of |obj|,
- * or throws a TypeError if |obj| isn't DateTimeFormat-initialized.
+ * Returns an object containing the DateTimeFormat internal properties of |obj|.
*/
-function getDateTimeFormatInternals(obj, methodName) {
- var internals = getIntlObjectInternals(obj, "DateTimeFormat", methodName);
+function getDateTimeFormatInternals(obj) {
+ assert(IsObject(obj), "getDateTimeFormatInternals called with non-object");
+ assert(IsDateTimeFormat(obj), "getDateTimeFormatInternals called with non-DateTimeFormat");
+
+ var internals = getIntlObjectInternals(obj);
assert(internals.type === "DateTimeFormat", "bad type escaped getIntlObjectInternals");
// If internal properties have already been computed, use them.
@@ -214,6 +246,31 @@ function DefaultTimeZone() {
return defaultTimeZone;
}
+
+/**
+ * 12.1.10 UnwrapDateTimeFormat( dtf )
+ */
+function UnwrapDateTimeFormat(dtf, methodName) {
+ // Step 1 (not applicable in our implementation).
+
+ // Step 2.
+ if ((!IsObject(dtf) || !IsDateTimeFormat(dtf)) &&
+ dtf instanceof GetDateTimeFormatConstructor())
+ {
+ dtf = dtf[intlFallbackSymbol()];
+ }
+
+ // Step 3.
+ if (!IsObject(dtf) || !IsDateTimeFormat(dtf)) {
+ ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, "DateTimeFormat", methodName,
+ "DateTimeFormat");
+ }
+
+ // Step 4.
+ return dtf;
+}
+
+
/**
* Initializes an object as a DateTimeFormat.
*
@@ -225,15 +282,10 @@ function DefaultTimeZone() {
*
* Spec: ECMAScript Internationalization API Specification, 12.1.1.
*/
-function InitializeDateTimeFormat(dateTimeFormat, locales, options) {
- assert(IsObject(dateTimeFormat), "InitializeDateTimeFormat");
-
- // Step 1.
- if (isInitializedIntlObject(dateTimeFormat))
- ThrowTypeError(JSMSG_INTL_OBJECT_REINITED);
-
- // Step 2.
- var internals = initializeIntlObject(dateTimeFormat);
+function InitializeDateTimeFormat(dateTimeFormat, thisValue, locales, options, mozExtensions) {
+ assert(IsObject(dateTimeFormat), "InitializeDateTimeFormat called with non-Object");
+ assert(IsDateTimeFormat(dateTimeFormat),
+ "InitializeDateTimeFormat called with non-DateTimeFormat");
// Lazy DateTimeFormat data has the following structure:
//
@@ -243,6 +295,12 @@ function InitializeDateTimeFormat(dateTimeFormat, locales, options) {
// localeOpt: // *first* opt computed in InitializeDateTimeFormat
// {
// localeMatcher: "lookup" / "best fit",
+ //
+ // ca: string matching a Unicode extension type, // optional
+ //
+ // nu: string matching a Unicode extension type, // optional
+ //
+ // hc: "h11" / "h12" / "h23" / "h24", // optional
// }
//
// timeZone: IANA time zone name,
@@ -252,7 +310,7 @@ function InitializeDateTimeFormat(dateTimeFormat, locales, options) {
// // all the properties/values listed in Table 3
// // (weekday, era, year, month, day, &c.)
//
- // hour12: true / false // optional
+ // hour12: true / false, // optional
// }
//
// formatMatcher: "basic" / "best fit",
@@ -263,45 +321,89 @@ function InitializeDateTimeFormat(dateTimeFormat, locales, options) {
// never a subset of them.
var lazyDateTimeFormatData = std_Object_create(null);
- // Step 3.
+ // Step 1.
var requestedLocales = CanonicalizeLocaleList(locales);
lazyDateTimeFormatData.requestedLocales = requestedLocales;
- // Step 4.
+ // Step24.
options = ToDateTimeOptions(options, "any", "date");
// Compute options that impact interpretation of locale.
- // Step 5.
+ // Step 3.
var localeOpt = new Record();
lazyDateTimeFormatData.localeOpt = localeOpt;
- // Steps 6-7.
+ // Steps 4-5.
var localeMatcher =
GetOption(options, "localeMatcher", "string", ["lookup", "best fit"],
"best fit");
localeOpt.localeMatcher = localeMatcher;
- // Steps 15-17.
+ var calendar = GetOption(options, "calendar", "string", undefined, undefined);
+
+ if (calendar !== undefined) {
+ calendar = intl_ValidateAndCanonicalizeUnicodeExtensionType(calendar, "calendar", "ca");
+ }
+
+ localeOpt.ca = calendar;
+
+ var numberingSystem = GetOption(options, "numberingSystem", "string", undefined, undefined);
+
+ if (numberingSystem !== undefined) {
+ numberingSystem = intl_ValidateAndCanonicalizeUnicodeExtensionType(numberingSystem,
+ "numberingSystem",
+ "nu");
+ }
+
+ localeOpt.nu = numberingSystem;
+
+ // Step 6.
+ var hr12 = GetOption(options, "hour12", "boolean", undefined, undefined);
+
+ // Step 7.
+ var hc = GetOption(options, "hourCycle", "string", ["h11", "h12", "h23", "h24"], undefined);
+
+ // Step 8.
+ if (hr12 !== undefined) {
+ // The "hourCycle" option is ignored if "hr12" is also present.
+ hc = null;
+ }
+
+ // Step 9.
+ localeOpt.hc = hc;
+
+ // Steps 10-16 (see resolveDateTimeFormatInternals).
+
+ // Steps 17-20.
var tz = options.timeZone;
if (tz !== undefined) {
- // Step 15.a.
+ // Step 18.a.
tz = ToString(tz);
- // Step 15.b.
+ // Step 18.b.
var timeZone = intl_IsValidTimeZoneName(tz);
if (timeZone === null)
ThrowRangeError(JSMSG_INVALID_TIME_ZONE, tz);
- // Step 15.c.
+ // Step 18.c.
tz = CanonicalizeTimeZoneName(timeZone);
+ } else {
+ // Step 19.
+ tz = DefaultTimeZone();
}
lazyDateTimeFormatData.timeZone = tz;
- // Step 18.
+ // Step 21.
var formatOpt = new Record();
lazyDateTimeFormatData.formatOpt = formatOpt;
- // Step 19.
+ if (mozExtensions) {
+ let pattern = GetOption(options, "pattern", "string", undefined, undefined);
+ lazyDateTimeFormatData.patternOption = pattern;
+ }
+
+ // Step 22.
+ // 12.1, Table 5: Components of date and time formats.
var i, prop;
for (i = 0; i < dateTimeComponents.length; i++) {
prop = dateTimeComponents[i];
@@ -309,9 +411,9 @@ function InitializeDateTimeFormat(dateTimeFormat, locales, options) {
formatOpt[prop] = value;
}
- // Steps 20-21 provided by ICU - see comment after this function.
+ // Steps 23-24 provided by ICU - see comment after this function.
- // Step 22.
+ // Step 25.
//
// For some reason (ICU not exposing enough interface?) we drop the
// requested format matcher on the floor after this. In any case, even if
@@ -321,20 +423,58 @@ function InitializeDateTimeFormat(dateTimeFormat, locales, options) {
GetOption(options, "formatMatcher", "string", ["basic", "best fit"],
"best fit");
- // Steps 23-25 provided by ICU, more or less - see comment after this function.
+ // "DateTimeFormat dateStyle & timeStyle" propsal
+ // https://github.com/tc39/proposal-intl-datetime-style
+ var dateStyle = GetOption(options, "dateStyle", "string", ["full", "long", "medium", "short"],
+ undefined);
+ lazyDateTimeFormatData.dateStyle = dateStyle;
+
+ var timeStyle = GetOption(options, "timeStyle", "string", ["full", "long", "medium", "short"],
+ undefined);
+ lazyDateTimeFormatData.timeStyle = timeStyle;
+
+ if (dateStyle !== undefined || timeStyle !== undefined) {
+ var optionsList = [
+ "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName",
+ ];
+
+ for (var i = 0; i < optionsList.length; i++) {
+ var option = optionsList[i];
+ if (formatOpt[option] !== undefined) {
+ ThrowTypeError(JSMSG_INVALID_DATETIME_OPTION, option,
+ dateStyle !== undefined ? "dateStyle" : "timeStyle");
+ }
+ }
+ }
- // Step 26.
- var hr12 = GetOption(options, "hour12", "boolean", undefined, undefined);
+ // Steps 26-28 provided by ICU, more or less - see comment after this function.
+ // Steps 29-30.
// Pass hr12 on to ICU.
if (hr12 !== undefined)
formatOpt.hour12 = hr12;
- // Step 31.
+ // Step 32.
//
// We've done everything that must be done now: mark the lazy data as fully
// computed and install it.
- setLazyData(internals, "DateTimeFormat", lazyDateTimeFormatData);
+ initializeIntlObject(dateTimeFormat, "DateTimeFormat", lazyDateTimeFormatData);
+
+ // 12.2.1, steps 4-5.
+ // TODO: spec issue - The current spec doesn't have the IsObject check,
+ // which means |Intl.DateTimeFormat.call(null)| is supposed to throw here.
+ if (dateTimeFormat !== thisValue && thisValue instanceof GetDateTimeFormatConstructor()) {
+ if (!IsObject(thisValue))
+ ThrowTypeError(JSMSG_NOT_NONNULL_OBJECT, typeof thisValue);
+
+ _DefineDataProperty(thisValue, intlFallbackSymbol(), dateTimeFormat,
+ ATTR_NONENUMERABLE | ATTR_NONCONFIGURABLE | ATTR_NONWRITABLE);
+
+ return thisValue;
+ }
+
+ // 12.2.1, step 6.
+ return dateTimeFormat;
}
@@ -396,6 +536,7 @@ function InitializeDateTimeFormat(dateTimeFormat, locales, options) {
// - [[weekday]], [[era]], [[year]], [[month]], [[day]], [[hour]], [[minute]],
// [[second]], [[timeZoneName]]
// - [[hour12]]
+// - [[hourCycle]]
// - [[hourNo0]]
// When needed for the resolvedOptions method, the resolveICUPattern function
// maps the instance's ICU pattern back to the specified properties of the
@@ -469,12 +610,24 @@ function toBestICUPattern(locale, options) {
skeleton += "d";
break;
}
+ // If hour12 and hourCycle are both present, hour12 takes precedence.
var hourSkeletonChar = "j";
if (options.hour12 !== undefined) {
if (options.hour12)
hourSkeletonChar = "h";
else
hourSkeletonChar = "H";
+ } else {
+ switch (options.hourCycle) {
+ case "h11":
+ case "h12":
+ hourSkeletonChar = "h";
+ break;
+ case "h23":
+ case "h24":
+ hourSkeletonChar = "H";
+ break;
+ }
}
switch (options.hour) {
case "2-digit":
@@ -510,7 +663,7 @@ function toBestICUPattern(locale, options) {
}
// Let ICU convert the ICU skeleton to an ICU pattern for the given locale.
- return intl_patternForSkeleton(locale, skeleton);
+ return intl_patternForSkeleton(locale, skeleton, options.hourCycle);
}
@@ -526,17 +679,19 @@ function ToDateTimeOptions(options, required, defaults) {
assert(typeof required === "string", "ToDateTimeOptions");
assert(typeof defaults === "string", "ToDateTimeOptions");
- // Steps 1-3.
+ // Steps 1-2.
if (options === undefined)
options = null;
else
options = ToObject(options);
options = std_Object_create(options);
- // Step 4.
+ // Step 3.
var needDefaults = true;
- // Step 5.
+ // Step 4.
+ // TODO: spec issue - The spec requires to retrieve all options, so using
+ // the ||-operator with its lazy evaluation semantics is incorrect.
if ((required === "date" || required === "any") &&
(options.weekday !== undefined || options.year !== undefined ||
options.month !== undefined || options.day !== undefined))
@@ -544,7 +699,9 @@ function ToDateTimeOptions(options, required, defaults) {
needDefaults = false;
}
- // Step 6.
+ // Step 5.
+ // TODO: spec issue - The spec requires to retrieve all options, so using
+ // the ||-operator with its lazy evaluation semantics is incorrect.
if ((required === "time" || required === "any") &&
(options.hour !== undefined || options.minute !== undefined ||
options.second !== undefined))
@@ -552,7 +709,21 @@ function ToDateTimeOptions(options, required, defaults) {
needDefaults = false;
}
- // Step 7.
+ // "DateTimeFormat dateStyle & timeStyle" propsal
+ // https://github.com/tc39/proposal-intl-datetime-style
+ var dateStyle = options.dateStyle;
+ var timeStyle = options.timeStyle;
+
+ if (dateStyle !== undefined || timeStyle !== undefined)
+ needDefaults = false;
+
+ if (required === "date" && timeStyle !== undefined)
+ ThrowTypeError(JSMSG_INVALID_DATETIME_STYLE, "timeStyle", "toLocaleDateString");
+
+ if (required === "time" && dateStyle !== undefined)
+ ThrowTypeError(JSMSG_INVALID_DATETIME_STYLE, "dateStyle", "toLocaleTimeString");
+
+ // Step 6.
if (needDefaults && (defaults === "date" || defaults === "all")) {
// The specification says to call [[DefineOwnProperty]] with false for
// the Throw parameter, while Object.defineProperty uses true. For the
@@ -563,7 +734,7 @@ function ToDateTimeOptions(options, required, defaults) {
_DefineDataProperty(options, "day", "numeric");
}
- // Step 8.
+ // Step 7.
if (needDefaults && (defaults === "time" || defaults === "all")) {
// See comment for step 7.
_DefineDataProperty(options, "hour", "numeric");
@@ -571,7 +742,7 @@ function ToDateTimeOptions(options, required, defaults) {
_DefineDataProperty(options, "second", "numeric");
}
- // Step 9.
+ // Step 8.
return options;
}
@@ -623,7 +794,7 @@ function BasicFormatMatcher(options, formats) {
formatProp = undefined;
// Steps 11.c.ii-iii.
- if (callFunction(std_Object_hasOwnProperty, format, property))
+ if (hasOwn(property, format))
formatProp = format[property];
if (optionsProp === undefined && formatProp !== undefined) {
@@ -681,14 +852,18 @@ function BestFitFormatMatcher(options, formats) {
* matching (possibly fallback) locale. Locales appear in the same order in the
* returned list as in the input list.
*
- * Spec: ECMAScript Internationalization API Specification, 12.2.2.
+ * Spec: ECMAScript Internationalization API Specification, 12.3.2.
*/
function Intl_DateTimeFormat_supportedLocalesOf(locales /*, options*/) {
var options = arguments.length > 1 ? arguments[1] : undefined;
- var availableLocales = callFunction(dateTimeFormatInternalProperties.availableLocales,
- dateTimeFormatInternalProperties);
+ // Step 1.
+ var availableLocales = "DateTimeFormat";
+
+ // Step 2.
var requestedLocales = CanonicalizeLocaleList(locales);
+
+ // Step 3.
return SupportedLocales(availableLocales, requestedLocales, options);
}
@@ -696,29 +871,28 @@ function Intl_DateTimeFormat_supportedLocalesOf(locales /*, options*/) {
/**
* DateTimeFormat internal properties.
*
- * Spec: ECMAScript Internationalization API Specification, 9.1 and 12.2.3.
+ * Spec: ECMAScript Internationalization API Specification, 9.1 and 12.3.3.
*/
var dateTimeFormatInternalProperties = {
localeData: dateTimeFormatLocaleData,
- _availableLocales: null,
- availableLocales: function()
- {
- var locales = this._availableLocales;
- if (locales)
- return locales;
-
- locales = intl_DateTimeFormat_availableLocales();
- addSpecialMissingLanguageTags(locales);
- return (this._availableLocales = locales);
- },
- relevantExtensionKeys: ["ca", "nu"]
+ relevantExtensionKeys: ["ca", "nu", "hc"]
};
-function dateTimeFormatLocaleData(locale) {
+function dateTimeFormatLocaleData() {
return {
- ca: intl_availableCalendars(locale),
- nu: getNumberingSystems(locale)
+ ca: intl_availableCalendars,
+ nu: getNumberingSystems,
+ hc: () => {
+ return [null, "h11", "h12", "h23", "h24"];
+ },
+ default: {
+ ca: intl_defaultCalendar,
+ nu: intl_numberingSystem,
+ hc: () => {
+ return null;
+ }
+ }
};
}
@@ -726,7 +900,7 @@ function dateTimeFormatLocaleData(locale) {
/**
* Function to be bound and returned by Intl.DateTimeFormat.prototype.format.
*
- * Spec: ECMAScript Internationalization API Specification, 12.3.2.
+ * Spec: ECMAScript Internationalization API Specification, 12.1.5.
*/
function dateTimeFormatFormatToBind() {
// Steps 1.a.i-ii
@@ -734,7 +908,7 @@ function dateTimeFormatFormatToBind() {
var x = (date === undefined) ? std_Date_now() : ToNumber(date);
// Step 1.a.iii.
- return intl_FormatDateTime(this, x, false);
+ return intl_FormatDateTime(this, x, /* formatToParts = */ false);
}
/**
@@ -742,80 +916,95 @@ function dateTimeFormatFormatToBind() {
* representing the result of calling ToNumber(date) according to the
* effective locale and the formatting options of this DateTimeFormat.
*
- * Spec: ECMAScript Internationalization API Specification, 12.3.2.
+ * Spec: ECMAScript Internationalization API Specification, 12.4.3.
*/
function Intl_DateTimeFormat_format_get() {
- // Check "this DateTimeFormat object" per introduction of section 12.3.
- var internals = getDateTimeFormatInternals(this, "format");
+ // Steps 1-3.
+ var dtf = UnwrapDateTimeFormat(this, "format");
- // Step 1.
+ var internals = getDateTimeFormatInternals(dtf);
+
+ // Step 4.
if (internals.boundFormat === undefined) {
- // Step 1.a.
- var F = dateTimeFormatFormatToBind;
+ // Steps 4.a-b.
+ var F = callFunction(FunctionBind, dateTimeFormatFormatToBind, dtf);
- // Step 1.b-d.
- var bf = callFunction(FunctionBind, F, this);
- internals.boundFormat = bf;
+ // Step 4.c.
+ internals.boundFormat = F;
}
- // Step 2.
+ // Step 5.
return internals.boundFormat;
}
+_SetCanonicalName(Intl_DateTimeFormat_format_get, "get format");
+/**
+ * Intl.DateTimeFormat.prototype.formatToParts ( date )
+ *
+ * Spec: ECMAScript Internationalization API Specification, 12.4.4.
+ */
function Intl_DateTimeFormat_formatToParts() {
- // Check "this DateTimeFormat object" per introduction of section 12.3.
- getDateTimeFormatInternals(this, "formatToParts");
+ // Steps 1-3.
+ var dtf = UnwrapDateTimeFormat(this, "formatToParts");
- // Steps 1.a.i-ii
+ // Ensure the DateTimeFormat internals are resolved.
+ getDateTimeFormatInternals(dtf);
+
+ // Steps 4-5.
var date = arguments.length > 0 ? arguments[0] : undefined;
var x = (date === undefined) ? std_Date_now() : ToNumber(date);
- // Step 1.a.iii.
- return intl_FormatDateTime(this, x, true);
+ // Step 6.
+ return intl_FormatDateTime(dtf, x, /* formatToParts = */ true);
}
/**
* Returns the resolved options for a DateTimeFormat object.
*
- * Spec: ECMAScript Internationalization API Specification, 12.3.3 and 12.4.
+ * Spec: ECMAScript Internationalization API Specification, 12.4.5.
*/
function Intl_DateTimeFormat_resolvedOptions() {
- // Check "this DateTimeFormat object" per introduction of section 12.3.
- var internals = getDateTimeFormatInternals(this, "resolvedOptions");
+ // Steps 1-3.
+ var dtf = UnwrapDateTimeFormat(this, "resolvedOptions");
+ var internals = getDateTimeFormatInternals(dtf);
+
+ // Steps 4-5.
var result = {
locale: internals.locale,
calendar: internals.calendar,
numberingSystem: internals.numberingSystem,
- timeZone: internals.timeZone
+ timeZone: internals.timeZone,
};
- resolveICUPattern(internals.pattern, result);
- return result;
-}
+ if (internals.patternOption !== undefined) {
+ _DefineDataProperty(result, "pattern", internals.pattern);
+ }
-// Table mapping ICU pattern characters back to the corresponding date-time
-// components of DateTimeFormat. See
-// http://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
-var icuPatternCharToComponent = {
- E: "weekday",
- G: "era",
- y: "year",
- M: "month",
- L: "month",
- d: "day",
- h: "hour",
- H: "hour",
- k: "hour",
- K: "hour",
- m: "minute",
- s: "second",
- z: "timeZoneName",
- v: "timeZoneName",
- V: "timeZoneName"
-};
+ var hasDateStyle = internals.dateStyle !== undefined;
+ var hasTimeStyle = internals.timeStyle !== undefined;
+
+ if (hasDateStyle || hasTimeStyle) {
+ if (hasTimeStyle) {
+ // timeStyle (unlike dateStyle) requires resolving the pattern to
+ // ensure "hourCycle" and "hour12" properties are added to |result|.
+ resolveICUPattern(internals.pattern, result, /* includeDateTimeFields = */ false);
+ }
+ if (hasDateStyle) {
+ _DefineDataProperty(result, "dateStyle", internals.dateStyle);
+ }
+ if (hasTimeStyle) {
+ _DefineDataProperty(result, "timeStyle", internals.timeStyle);
+ }
+ } else {
+ resolveICUPattern(internals.pattern, result, /* includeDateTimeFields = */ true);
+ }
+
+ // Step 6.
+ return result;
+}
/**
@@ -825,8 +1014,12 @@ var icuPatternCharToComponent = {
* interpretation of ICU pattern characters, see
* http://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
*/
-function resolveICUPattern(pattern, result) {
+function resolveICUPattern(pattern, result, includeDateTimeFields) {
assert(IsObject(result), "resolveICUPattern");
+
+ var hourCycle, weekday, era, year, month, day, hour, minute, second,
+ timeZoneName;
+
var i = 0;
while (i < pattern.length) {
var c = pattern[i++];
@@ -886,13 +1079,91 @@ function resolveICUPattern(pattern, result) {
default:
// skip other pattern characters and literal text
}
- if (callFunction(std_Object_hasOwnProperty, icuPatternCharToComponent, c))
- _DefineDataProperty(result, icuPatternCharToComponent[c], value);
- if (c === "h" || c === "K")
- _DefineDataProperty(result, "hour12", true);
- else if (c === "H" || c === "k")
- _DefineDataProperty(result, "hour12", false);
+
+ // Map ICU pattern characters back to the corresponding date-time
+ // components of DateTimeFormat. See
+ // http://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
+ switch (c) {
+ case "E":
+ case "c":
+ weekday = value;
+ break;
+ case "G":
+ era = value;
+ break;
+ case "y":
+ year = value;
+ break;
+ case "M":
+ case "L":
+ month = value;
+ break;
+ case "d":
+ day = value;
+ break;
+ case "h":
+ hourCycle = "h12";
+ hour = value;
+ break;
+ case "H":
+ hourCycle = "h23";
+ hour = value;
+ break;
+ case "k":
+ hourCycle = "h24";
+ hour = value;
+ break;
+ case "K":
+ hourCycle = "h11";
+ hour = value;
+ break;
+ case "m":
+ minute = value;
+ break;
+ case "s":
+ second = value;
+ break;
+ case "z":
+ case "v":
+ case "V":
+ timeZoneName = value;
+ break;
+ }
}
}
+ if (hourCycle) {
+ _DefineDataProperty(result, "hourCycle", hourCycle);
+ _DefineDataProperty(result, "hour12", hourCycle === "h11" || hourCycle === "h12");
+ }
+ if (!includeDateTimeFields) {
+ return;
+ }
+ if (weekday) {
+ _DefineDataProperty(result, "weekday", weekday);
+ }
+ if (era) {
+ _DefineDataProperty(result, "era", era);
+ }
+ if (year) {
+ _DefineDataProperty(result, "year", year);
+ }
+ if (month) {
+ _DefineDataProperty(result, "month", month);
+ }
+ if (day) {
+ _DefineDataProperty(result, "day", day);
+ }
+ if (hour) {
+ _DefineDataProperty(result, "hour", hour);
+ }
+ if (minute) {
+ _DefineDataProperty(result, "minute", minute);
+ }
+ if (second) {
+ _DefineDataProperty(result, "second", second);
+ }
+ if (timeZoneName) {
+ _DefineDataProperty(result, "timeZoneName", timeZoneName);
+ }
}
diff --git a/js/src/builtin/intl/ICUHeader.h b/js/src/builtin/intl/ICUHeader.h
index 3e6ea92e32..f0600e232f 100644
--- a/js/src/builtin/intl/ICUHeader.h
+++ b/js/src/builtin/intl/ICUHeader.h
@@ -13,6 +13,7 @@
#include "unicode/udatpg.h"
#include "unicode/udisplaycontext.h"
#include "unicode/uenum.h"
+#include "unicode/uloc.h"
#include "unicode/unum.h"
#include "unicode/unumsys.h"
#include "unicode/upluralrules.h"
diff --git a/js/src/builtin/intl/IntlObject.cpp b/js/src/builtin/intl/IntlObject.cpp
index 6bb57adf41..2f42e1df76 100644
--- a/js/src/builtin/intl/IntlObject.cpp
+++ b/js/src/builtin/intl/IntlObject.cpp
@@ -11,6 +11,9 @@
#include "mozilla/Likely.h"
#include "mozilla/Range.h"
+#include <algorithm>
+#include <iterator>
+
#include "jsapi.h"
#include "jscntxt.h"
#include "jsobj.h"
@@ -18,11 +21,15 @@
#include "builtin/intl/Collator.h"
#include "builtin/intl/CommonFunctions.h"
#include "builtin/intl/DateTimeFormat.h"
+#include "builtin/intl/LanguageTag.h"
#include "builtin/intl/ICUHeader.h"
+#include "builtin/intl/Locale.h"
#include "builtin/intl/NumberFormat.h"
#include "builtin/intl/PluralRules.h"
#include "builtin/intl/RelativeTimeFormat.h"
#include "builtin/intl/ScopedICUObject.h"
+#include "builtin/intl/SharedIntlData.h"
+#include "js/Result.h"
#include "vm/GlobalObject.h"
#include "jsobjinlines.h"
@@ -30,7 +37,7 @@
using namespace js;
using js::intl::CallICU;
-using js::intl::GetAvailableLocales;
+using js::intl::DateTimeFormatOptions;
using js::intl::IcuLocale;
using js::intl::INITIAL_CHAR_BUFFER_SIZE;
using js::intl::StringsAreEqual;
@@ -405,6 +412,272 @@ js::intl_ComputeDisplayNames(JSContext* cx, unsigned argc, Value* vp)
return true;
}
+using SupportedLocaleKind = js::intl::SharedIntlData::SupportedLocaleKind;
+
+// 9.2.2 BestAvailableLocale ( availableLocales, locale )
+static JS::Result<JSString*>
+BestAvailableLocale(JSContext* cx, SupportedLocaleKind kind, HandleLinearString locale,
+ HandleLinearString defaultLocale)
+{
+ // In the spec, [[availableLocales]] is formally a list of all available
+ // locales. But in our implementation, it's an *incomplete* list, not
+ // necessarily including the default locale (and all locales implied by it,
+ // e.g. "de" implied by "de-CH"), if that locale isn't in every
+ // [[availableLocales]] list (because that locale is supported through
+ // fallback, e.g. "de-CH" supported through "de").
+ //
+ // If we're considering the default locale, augment the spec loop with
+ // additional checks to also test whether the current prefix is a prefix of
+ // the default locale.
+
+ intl::SharedIntlData& sharedIntlData = cx->sharedIntlData;
+
+ auto findLast = [](const auto* chars, size_t length) {
+ auto rbegin = std::make_reverse_iterator(chars + length);
+ auto rend = std::make_reverse_iterator(chars);
+ auto p = std::find(rbegin, rend, '-');
+
+ // |dist(chars, p.base())| is equal to |dist(p, rend)|, pick whichever you
+ // find easier to reason about when using reserve iterators.
+ ptrdiff_t r = std::distance(chars, p.base());
+ MOZ_ASSERT(r == std::distance(p, rend));
+
+ // But always subtract one to convert from the reverse iterator result to
+ // the corresponding forward iterator value, because reserve iterators point
+ // to one element past the forward iterator value.
+ return r - 1;
+ };
+
+ // Step 1.
+ RootedLinearString candidate(cx, locale);
+
+ // Step 2.
+ while (true) {
+ // Step 2.a.
+ bool supported = false;
+ if (!sharedIntlData.isSupportedLocale(cx, kind, candidate, &supported)) {
+ return cx->alreadyReportedError();
+ }
+ if (supported) {
+ return candidate.get();
+ }
+
+ if (defaultLocale && candidate->length() <= defaultLocale->length()) {
+ if (EqualStrings(candidate, defaultLocale)) {
+ return candidate.get();
+ }
+
+ if (candidate->length() < defaultLocale->length() &&
+ HasSubstringAt(defaultLocale, candidate, 0) &&
+ defaultLocale->latin1OrTwoByteChar(candidate->length()) == '-') {
+ return candidate.get();
+ }
+ }
+
+ // Step 2.b.
+ ptrdiff_t pos;
+ if (candidate->hasLatin1Chars()) {
+ JS::AutoCheckCannotGC nogc;
+ pos = findLast(candidate->latin1Chars(nogc), candidate->length());
+ } else {
+ JS::AutoCheckCannotGC nogc;
+ pos = findLast(candidate->twoByteChars(nogc), candidate->length());
+ }
+
+ if (pos < 0) {
+ return nullptr;
+ }
+
+ // Step 2.c.
+ size_t length = size_t(pos);
+ if (length >= 2 && candidate->latin1OrTwoByteChar(length - 2) == '-') {
+ length -= 2;
+ }
+
+ // Step 2.d.
+ candidate = NewDependentString(cx, candidate, 0, length);
+ if (!candidate) {
+ return cx->alreadyReportedError();
+ }
+ }
+}
+
+// 9.2.2 BestAvailableLocale ( availableLocales, locale )
+//
+// Carries an additional third argument in our implementation to provide the
+// default locale. See the doc-comment in the header file.
+bool
+js::intl_BestAvailableLocale(JSContext* cx, unsigned argc, Value* vp)
+{
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 3);
+
+ SupportedLocaleKind kind;
+ {
+ JSLinearString* typeStr = args[0].toString()->ensureLinear(cx);
+ if (!typeStr) {
+ return false;
+ }
+
+ if (StringEqualsAscii(typeStr, "Collator")) {
+ kind = SupportedLocaleKind::Collator;
+ } else if (StringEqualsAscii(typeStr, "DateTimeFormat")) {
+ kind = SupportedLocaleKind::DateTimeFormat;
+ } else if (StringEqualsAscii(typeStr, "NumberFormat")) {
+ kind = SupportedLocaleKind::NumberFormat;
+ } else if (StringEqualsAscii(typeStr, "PluralRules")) {
+ kind = SupportedLocaleKind::PluralRules;
+ } else {
+ MOZ_ASSERT(StringEqualsAscii(typeStr, "RelativeTimeFormat"));
+ kind = SupportedLocaleKind::RelativeTimeFormat;
+ }
+ }
+
+ RootedLinearString locale(cx, args[1].toString()->ensureLinear(cx));
+ if (!locale) {
+ return false;
+ }
+
+ #ifdef DEBUG
+ {
+ intl::LanguageTag tag(cx);
+ bool ok;
+ JS_TRY_VAR_OR_RETURN_FALSE(cx, ok, intl::LanguageTagParser::tryParse(cx, locale, tag));
+ MOZ_ASSERT(ok, "locale is a structurally valid language tag");
+
+ MOZ_ASSERT(!tag.unicodeExtension(),
+ "locale must contain no Unicode extensions");
+
+ if (!tag.canonicalize(cx)) {
+ return false;
+ }
+
+ JSString* tagStr = tag.toString(cx);
+ if (!tagStr) {
+ return false;
+ }
+
+ bool canonical;
+ if (!EqualStrings(cx, locale, tagStr, &canonical)) {
+ return false;
+ }
+ MOZ_ASSERT(canonical, "locale is a canonicalized language tag");
+ }
+ #endif
+
+ MOZ_ASSERT(args[2].isNull() || args[2].isString());
+
+ RootedLinearString defaultLocale(cx);
+ if (args[2].isString()) {
+ defaultLocale = args[2].toString()->ensureLinear(cx);
+ if (!defaultLocale) {
+ return false;
+ }
+ }
+
+ JSString* result;
+ JS_TRY_VAR_OR_RETURN_FALSE(cx, result, BestAvailableLocale(cx, kind, locale, defaultLocale));
+
+ if (result) {
+ args.rval().setString(result);
+ } else {
+ args.rval().setUndefined();
+ }
+ return true;
+}
+
+bool
+js::intl_supportedLocaleOrFallback(JSContext* cx, unsigned argc, Value* vp)
+{
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 1);
+
+ RootedLinearString locale(cx, args[0].toString()->ensureLinear(cx));
+ if (!locale) {
+ return false;
+ }
+
+ intl::LanguageTag tag(cx);
+ bool ok;
+ JS_TRY_VAR_OR_RETURN_FALSE(cx, ok, intl::LanguageTagParser::tryParse(cx, locale, tag));
+
+ RootedLinearString candidate(cx);
+ if (!ok) {
+ candidate = NewStringCopyZ<CanGC>(cx, intl::LastDitchLocale());
+ if (!candidate) {
+ return false;
+ }
+ } else {
+ if (!tag.canonicalize(cx)) {
+ return false;
+ }
+
+ // The default locale must be in [[AvailableLocales]], and that list must
+ // not contain any locales with Unicode extension sequences, so remove any
+ // present in the candidate.
+ tag.clearUnicodeExtension();
+
+ JSString* canonical = tag.toString(cx);
+ if (!canonical) {
+ return false;
+ }
+
+ candidate = canonical->ensureLinear(cx);
+ if (!candidate) {
+ return false;
+ }
+
+ for (const auto& mapping : js::intl::oldStyleLanguageTagMappings) {
+ const char* oldStyle = mapping.oldStyle;
+ const char* modernStyle = mapping.modernStyle;
+
+ if (StringEqualsAscii(candidate, oldStyle)) {
+ candidate = NewStringCopyZ<CanGC>(cx, modernStyle);
+ if (!candidate) {
+ return false;
+ }
+ break;
+ }
+ }
+ }
+
+ // 9.1 Internal slots of Service Constructors
+ //
+ // - [[AvailableLocales]] is a List [...]. The list must include the value
+ // returned by the DefaultLocale abstract operation (6.2.4), [...].
+ //
+ // That implies we must ignore any candidate which isn't supported by all Intl
+ // service constructors.
+ //
+ // Note: We don't test the supported locales of either Intl.PluralRules or
+ // Intl.RelativeTimeFormat, because ICU doesn't provide the necessary API to
+ // return actual set of supported locales for these constructors. Instead it
+ // returns the complete set of available locales for ULocale, which is a
+ // superset of the locales supported by Collator, NumberFormat, and
+ // DateTimeFormat.
+ bool isSupported = true;
+ for (auto kind : {SupportedLocaleKind::Collator, SupportedLocaleKind::DateTimeFormat,
+ SupportedLocaleKind::NumberFormat}) {
+ JSString* supported;
+ JS_TRY_VAR_OR_RETURN_FALSE(cx, supported, BestAvailableLocale(cx, kind, candidate, nullptr));
+
+ if (!supported) {
+ isSupported = false;
+ break;
+ }
+ }
+
+ if (!isSupported) {
+ candidate = NewStringCopyZ<CanGC>(cx, intl::LastDitchLocale());
+ if (!candidate) {
+ return false;
+ }
+ }
+
+ args.rval().setString(candidate);
+ return true;
+}
+
const Class js::IntlClass = {
js_Object_str,
JSCLASS_HAS_CACHED_PROTO(JSProto_Intl)
@@ -454,10 +727,16 @@ GlobalObject::initIntlObject(JSContext* cx, Handle<GlobalObject*> global)
RootedObject collatorProto(cx, CreateCollatorPrototype(cx, intl, global));
if (!collatorProto)
return false;
- RootedObject dateTimeFormatProto(cx, CreateDateTimeFormatPrototype(cx, intl, global));
+ RootedObject dateTimeFormatProto(cx), dateTimeFormat(cx);
+ dateTimeFormatProto = CreateDateTimeFormatPrototype(cx, intl, global, &dateTimeFormat, DateTimeFormatOptions::Standard);
if (!dateTimeFormatProto)
return false;
- RootedObject numberFormatProto(cx, CreateNumberFormatPrototype(cx, intl, global));
+ RootedObject localeProto(cx);
+ localeProto = CreateLocalePrototype(cx, intl, global);
+ if (!localeProto)
+ return false;
+ RootedObject numberFormatProto(cx), numberFormat(cx);
+ numberFormatProto = CreateNumberFormatPrototype(cx, intl, global, &numberFormat);
if (!numberFormatProto)
return false;
RootedObject pluralRulesProto(cx, CreatePluralRulesPrototype(cx, intl, global));
@@ -487,7 +766,10 @@ GlobalObject::initIntlObject(JSContext* cx, Handle<GlobalObject*> global)
// |getPrototype(JSProto_*)|, but that has global-object-property-related
// baggage we don't need or want, so we use one-off reserved slots.
global->setReservedSlot(COLLATOR_PROTO, ObjectValue(*collatorProto));
+ global->setReservedSlot(DATE_TIME_FORMAT, ObjectValue(*dateTimeFormat));
global->setReservedSlot(DATE_TIME_FORMAT_PROTO, ObjectValue(*dateTimeFormatProto));
+ global->setReservedSlot(LOCALE_PROTO, ObjectValue(*localeProto));
+ global->setReservedSlot(NUMBER_FORMAT, ObjectValue(*numberFormat));
global->setReservedSlot(NUMBER_FORMAT_PROTO, ObjectValue(*numberFormatProto));
global->setReservedSlot(PLURAL_RULES_PROTO, ObjectValue(*pluralRulesProto));
global->setReservedSlot(RELATIVE_TIME_FORMAT_PROTO, ObjectValue(*relativeTimeFmtProto));
diff --git a/js/src/builtin/intl/IntlObject.h b/js/src/builtin/intl/IntlObject.h
index 1f0b26c545..eb5b4c69f8 100644
--- a/js/src/builtin/intl/IntlObject.h
+++ b/js/src/builtin/intl/IntlObject.h
@@ -95,6 +95,35 @@ intl_GetCalendarInfo(JSContext* cx, unsigned argc, JS::Value* vp);
extern MOZ_MUST_USE bool
intl_ComputeDisplayNames(JSContext* cx, unsigned argc, JS::Value* vp);
+/**
+ * Compares a BCP 47 language tag against the locales in availableLocales and
+ * returns the best available match -- or |undefined| if no match was found.
+ * Uses the fallback mechanism of RFC 4647, section 3.4.
+ *
+ * The set of available locales consulted doesn't necessarily include the
+ * default locale or any generalized forms of it (e.g. "de" is a more-general
+ * form of "de-CH"). If you want to be sure to consider the default local and
+ * its generalized forms (you usually will), pass the default locale as the
+ * value of |defaultOrNull|; otherwise pass null.
+ *
+ * Spec: ECMAScript Internationalization API Specification, 9.2.2.
+ * Spec: RFC 4647, section 3.4.
+ *
+ * Usage: result = intl_BestAvailableLocale("Collator", locale, defaultOrNull)
+ */
+extern MOZ_MUST_USE bool
+intl_BestAvailableLocale(JSContext* cx, unsigned argc, JS::Value* vp);
+
+/**
+ * Returns the input locale in its canonicalized form if ICU supports that
+ * locale (perhaps via fallback, e.g. supporting "de-ZA" through "de" support
+ * implied by a "de-DE" locale). Otherwise uses the last-ditch locale.
+ *
+ * Usage: result = intl_supportedLocaleOrFallback(locale)
+ */
+extern MOZ_MUST_USE bool
+intl_supportedLocaleOrFallback(JSContext* cx, unsigned argc, JS::Value* vp);
+
} // namespace js
#endif /* builtin_intl_IntlObject_h */
diff --git a/js/src/builtin/intl/IntlObject.js b/js/src/builtin/intl/IntlObject.js
index 454d580995..65fa914e9d 100644
--- a/js/src/builtin/intl/IntlObject.js
+++ b/js/src/builtin/intl/IntlObject.js
@@ -3,44 +3,79 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
function Intl_getCanonicalLocales(locales) {
- let codes = CanonicalizeLocaleList(locales);
- let result = [];
+ // Step 1.
+ var localeList = CanonicalizeLocaleList(locales);
- let len = codes.length;
- let k = 0;
+ // Step 2 (Inlined CreateArrayFromList).
+ var array = [];
- while (k < len) {
- _DefineDataProperty(result, k, codes[k]);
- k++;
- }
- return result;
+ for (var n = 0, len = localeList.length; n < len; n++)
+ _DefineDataProperty(array, n, localeList[n]);
+
+ return array;
}
+/**
+ * This function is a custom function in the style of the standard Intl.*
+ * functions, that isn't part of any spec or proposal yet.
+ *
+ * Returns an object with the following properties:
+ * locale:
+ * The actual resolved locale.
+ *
+ * calendar:
+ * The default calendar of the resolved locale.
+ *
+ * firstDayOfWeek:
+ * The first day of the week for the resolved locale.
+ *
+ * minDays:
+ * The minimum number of days in a week for the resolved locale.
+ *
+ * weekendStart:
+ * The day considered the beginning of a weekend for the resolved locale.
+ *
+ * weekendEnd:
+ * The day considered the end of a weekend for the resolved locale.
+ *
+ * Days are encoded as integers in the range 1=Sunday to 7=Saturday.
+ */
function Intl_getCalendarInfo(locales) {
- const requestedLocales = CanonicalizeLocaleList(locales);
+ // 1. Let requestLocales be ? CanonicalizeLocaleList(locales).
+ const requestedLocales = CanonicalizeLocaleList(locales);
- const DateTimeFormat = dateTimeFormatInternalProperties;
- const localeData = DateTimeFormat.localeData;
+ const DateTimeFormat = dateTimeFormatInternalProperties;
- const localeOpt = new Record();
- localeOpt.localeMatcher = "best fit";
+ // 2. Let localeData be %DateTimeFormat%.[[localeData]].
+ const localeData = DateTimeFormat.localeData;
- const r = ResolveLocale(callFunction(DateTimeFormat.availableLocales, DateTimeFormat),
- requestedLocales,
- localeOpt,
- DateTimeFormat.relevantExtensionKeys,
- localeData);
+ // 3. Let localeOpt be a new Record.
+ const localeOpt = new Record();
- const result = intl_GetCalendarInfo(r.locale);
- result.calendar = r.ca;
- result.locale = r.locale;
+ // 4. Set localeOpt.[[localeMatcher]] to "best fit".
+ localeOpt.localeMatcher = "best fit";
- return result;
+ // 5. Let r be ResolveLocale(%DateTimeFormat%.[[availableLocales]],
+ // requestedLocales, localeOpt,
+ // %DateTimeFormat%.[[relevantExtensionKeys]], localeData).
+ const r = ResolveLocale("DateTimeFormat",
+ requestedLocales,
+ localeOpt,
+ DateTimeFormat.relevantExtensionKeys,
+ localeData);
+
+ // 6. Let result be GetCalendarInfo(r.[[locale]]).
+ const result = intl_GetCalendarInfo(r.locale);
+ _DefineDataProperty(result, "calendar", r.ca);
+ _DefineDataProperty(result, "locale", r.locale);
+
+ // 7. Return result.
+ return result;
}
/**
- * This function is a custom method designed after Intl API, but currently
- * not part of the spec or spec proposal.
+ * This function is a custom function in the style of the standard Intl.*
+ * functions, that isn't part of any spec or proposal yet.
* We want to use it internally to retrieve translated values from CLDR in
* order to ensure they're aligned with what Intl API returns.
*
@@ -86,21 +121,23 @@ function Intl_getDisplayNames(locales, options) {
// 4. Let localeData be %DateTimeFormat%.[[localeData]].
const localeData = DateTimeFormat.localeData;
- // 5. Let opt be a new Record.
+ // 5. Let localeOpt be a new Record.
const localeOpt = new Record();
+
// 6. Set localeOpt.[[localeMatcher]] to "best fit".
localeOpt.localeMatcher = "best fit";
// 7. Let r be ResolveLocale(%DateTimeFormat%.[[availableLocales]], requestedLocales, localeOpt,
// %DateTimeFormat%.[[relevantExtensionKeys]], localeData).
- const r = ResolveLocale(callFunction(DateTimeFormat.availableLocales, DateTimeFormat),
- requestedLocales,
- localeOpt,
- DateTimeFormat.relevantExtensionKeys,
- localeData);
+ const r = ResolveLocale("DateTimeFormat",
+ requestedLocales,
+ localeOpt,
+ DateTimeFormat.relevantExtensionKeys,
+ localeData);
// 8. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow" », "long").
const style = GetOption(options, "style", "string", ["long", "short", "narrow"], "long");
+
// 9. Let keys be ? Get(options, "keys").
let keys = options.keys;
@@ -119,8 +156,10 @@ function Intl_getDisplayNames(locales, options) {
// |intl_ComputeDisplayNames| may infallibly access the list's length via
// |ArrayObject::length|.)
let processedKeys = [];
+
// 13. Let len be ? ToLength(? Get(keys, "length")).
let len = ToLength(keys.length);
+
// 14. Let i be 0.
// 15. Repeat, while i < len
for (let i = 0; i < len; i++) {
diff --git a/js/src/builtin/intl/LangTagMappingsGenerated.js b/js/src/builtin/intl/LangTagMappingsGenerated.js
deleted file mode 100644
index 269cf9f93a..0000000000
--- a/js/src/builtin/intl/LangTagMappingsGenerated.js
+++ /dev/null
@@ -1,382 +0,0 @@
-// Generated by make_intl_data.py. DO NOT EDIT.
-
-// Mappings from complete tags to preferred values.
-// Derived from IANA Language Subtag Registry, file date 2016-10-12.
-// http://www.iana.org/assignments/language-subtag-registry
-var langTagMappings = {
- "art-lojban": "jbo",
- "cel-gaulish": "cel-gaulish",
- "en-gb-oed": "en-GB-oxendict",
- "i-ami": "ami",
- "i-bnn": "bnn",
- "i-default": "i-default",
- "i-enochian": "i-enochian",
- "i-hak": "hak",
- "i-klingon": "tlh",
- "i-lux": "lb",
- "i-mingo": "i-mingo",
- "i-navajo": "nv",
- "i-pwn": "pwn",
- "i-tao": "tao",
- "i-tay": "tay",
- "i-tsu": "tsu",
- "ja-latn-hepburn-heploc": "ja-Latn-alalc97",
- "no-bok": "nb",
- "no-nyn": "nn",
- "sgn-be-fr": "sfb",
- "sgn-be-nl": "vgt",
- "sgn-br": "bzs",
- "sgn-ch-de": "sgg",
- "sgn-co": "csn",
- "sgn-de": "gsg",
- "sgn-dk": "dsl",
- "sgn-es": "ssp",
- "sgn-fr": "fsl",
- "sgn-gb": "bfi",
- "sgn-gr": "gss",
- "sgn-ie": "isg",
- "sgn-it": "ise",
- "sgn-jp": "jsl",
- "sgn-mx": "mfs",
- "sgn-ni": "ncs",
- "sgn-nl": "dse",
- "sgn-no": "nsl",
- "sgn-pt": "psr",
- "sgn-se": "swl",
- "sgn-us": "ase",
- "sgn-za": "sfs",
- "zh-cmn": "cmn",
- "zh-cmn-hans": "cmn-Hans",
- "zh-cmn-hant": "cmn-Hant",
- "zh-gan": "gan",
- "zh-guoyu": "cmn",
- "zh-hakka": "hak",
- "zh-min": "zh-min",
- "zh-min-nan": "nan",
- "zh-wuu": "wuu",
- "zh-xiang": "hsn",
- "zh-yue": "yue",
-};
-
-// Mappings from non-extlang subtags to preferred values.
-// Derived from IANA Language Subtag Registry, file date 2016-10-12.
-// http://www.iana.org/assignments/language-subtag-registry
-var langSubtagMappings = {
- "BU": "MM",
- "DD": "DE",
- "FX": "FR",
- "TP": "TL",
- "YD": "YE",
- "ZR": "CD",
- "aam": "aas",
- "adp": "dz",
- "aue": "ktz",
- "ayx": "nun",
- "bgm": "bcg",
- "bjd": "drl",
- "ccq": "rki",
- "cjr": "mom",
- "cka": "cmr",
- "cmk": "xch",
- "coy": "pij",
- "cqu": "quh",
- "drh": "khk",
- "drw": "prs",
- "gav": "dev",
- "gfx": "vaj",
- "ggn": "gvr",
- "gti": "nyc",
- "guv": "duz",
- "hrr": "jal",
- "ibi": "opa",
- "ilw": "gal",
- "in": "id",
- "iw": "he",
- "ji": "yi",
- "jw": "jv",
- "kgc": "tdf",
- "kgh": "kml",
- "koj": "kwv",
- "ktr": "dtp",
- "kvs": "gdj",
- "kwq": "yam",
- "kxe": "tvd",
- "kzj": "dtp",
- "kzt": "dtp",
- "lii": "raq",
- "lmm": "rmx",
- "meg": "cir",
- "mo": "ro",
- "mst": "mry",
- "mwj": "vaj",
- "myt": "mry",
- "nad": "xny",
- "nnx": "ngv",
- "nts": "pij",
- "oun": "vaj",
- "pcr": "adx",
- "pmc": "huw",
- "pmu": "phr",
- "ppa": "bfy",
- "ppr": "lcq",
- "pry": "prt",
- "puz": "pub",
- "sca": "hle",
- "tdu": "dtp",
- "thc": "tpo",
- "thx": "oyb",
- "tie": "ras",
- "tkk": "twm",
- "tlw": "weo",
- "tmp": "tyj",
- "tne": "kak",
- "tnf": "prs",
- "tsf": "taj",
- "uok": "ema",
- "xba": "cax",
- "xia": "acn",
- "xkh": "waw",
- "xsj": "suj",
- "ybd": "rki",
- "yma": "lrr",
- "ymt": "mtm",
- "yos": "zom",
- "yuu": "yug",
-};
-
-// Mappings from extlang subtags to preferred values.
-// Derived from IANA Language Subtag Registry, file date 2016-10-12.
-// http://www.iana.org/assignments/language-subtag-registry
-var extlangMappings = {
- "aao": {preferred: "aao", prefix: "ar"},
- "abh": {preferred: "abh", prefix: "ar"},
- "abv": {preferred: "abv", prefix: "ar"},
- "acm": {preferred: "acm", prefix: "ar"},
- "acq": {preferred: "acq", prefix: "ar"},
- "acw": {preferred: "acw", prefix: "ar"},
- "acx": {preferred: "acx", prefix: "ar"},
- "acy": {preferred: "acy", prefix: "ar"},
- "adf": {preferred: "adf", prefix: "ar"},
- "ads": {preferred: "ads", prefix: "sgn"},
- "aeb": {preferred: "aeb", prefix: "ar"},
- "aec": {preferred: "aec", prefix: "ar"},
- "aed": {preferred: "aed", prefix: "sgn"},
- "aen": {preferred: "aen", prefix: "sgn"},
- "afb": {preferred: "afb", prefix: "ar"},
- "afg": {preferred: "afg", prefix: "sgn"},
- "ajp": {preferred: "ajp", prefix: "ar"},
- "apc": {preferred: "apc", prefix: "ar"},
- "apd": {preferred: "apd", prefix: "ar"},
- "arb": {preferred: "arb", prefix: "ar"},
- "arq": {preferred: "arq", prefix: "ar"},
- "ars": {preferred: "ars", prefix: "ar"},
- "ary": {preferred: "ary", prefix: "ar"},
- "arz": {preferred: "arz", prefix: "ar"},
- "ase": {preferred: "ase", prefix: "sgn"},
- "asf": {preferred: "asf", prefix: "sgn"},
- "asp": {preferred: "asp", prefix: "sgn"},
- "asq": {preferred: "asq", prefix: "sgn"},
- "asw": {preferred: "asw", prefix: "sgn"},
- "auz": {preferred: "auz", prefix: "ar"},
- "avl": {preferred: "avl", prefix: "ar"},
- "ayh": {preferred: "ayh", prefix: "ar"},
- "ayl": {preferred: "ayl", prefix: "ar"},
- "ayn": {preferred: "ayn", prefix: "ar"},
- "ayp": {preferred: "ayp", prefix: "ar"},
- "bbz": {preferred: "bbz", prefix: "ar"},
- "bfi": {preferred: "bfi", prefix: "sgn"},
- "bfk": {preferred: "bfk", prefix: "sgn"},
- "bjn": {preferred: "bjn", prefix: "ms"},
- "bog": {preferred: "bog", prefix: "sgn"},
- "bqn": {preferred: "bqn", prefix: "sgn"},
- "bqy": {preferred: "bqy", prefix: "sgn"},
- "btj": {preferred: "btj", prefix: "ms"},
- "bve": {preferred: "bve", prefix: "ms"},
- "bvl": {preferred: "bvl", prefix: "sgn"},
- "bvu": {preferred: "bvu", prefix: "ms"},
- "bzs": {preferred: "bzs", prefix: "sgn"},
- "cdo": {preferred: "cdo", prefix: "zh"},
- "cds": {preferred: "cds", prefix: "sgn"},
- "cjy": {preferred: "cjy", prefix: "zh"},
- "cmn": {preferred: "cmn", prefix: "zh"},
- "coa": {preferred: "coa", prefix: "ms"},
- "cpx": {preferred: "cpx", prefix: "zh"},
- "csc": {preferred: "csc", prefix: "sgn"},
- "csd": {preferred: "csd", prefix: "sgn"},
- "cse": {preferred: "cse", prefix: "sgn"},
- "csf": {preferred: "csf", prefix: "sgn"},
- "csg": {preferred: "csg", prefix: "sgn"},
- "csl": {preferred: "csl", prefix: "sgn"},
- "csn": {preferred: "csn", prefix: "sgn"},
- "csq": {preferred: "csq", prefix: "sgn"},
- "csr": {preferred: "csr", prefix: "sgn"},
- "czh": {preferred: "czh", prefix: "zh"},
- "czo": {preferred: "czo", prefix: "zh"},
- "doq": {preferred: "doq", prefix: "sgn"},
- "dse": {preferred: "dse", prefix: "sgn"},
- "dsl": {preferred: "dsl", prefix: "sgn"},
- "dup": {preferred: "dup", prefix: "ms"},
- "ecs": {preferred: "ecs", prefix: "sgn"},
- "esl": {preferred: "esl", prefix: "sgn"},
- "esn": {preferred: "esn", prefix: "sgn"},
- "eso": {preferred: "eso", prefix: "sgn"},
- "eth": {preferred: "eth", prefix: "sgn"},
- "fcs": {preferred: "fcs", prefix: "sgn"},
- "fse": {preferred: "fse", prefix: "sgn"},
- "fsl": {preferred: "fsl", prefix: "sgn"},
- "fss": {preferred: "fss", prefix: "sgn"},
- "gan": {preferred: "gan", prefix: "zh"},
- "gds": {preferred: "gds", prefix: "sgn"},
- "gom": {preferred: "gom", prefix: "kok"},
- "gse": {preferred: "gse", prefix: "sgn"},
- "gsg": {preferred: "gsg", prefix: "sgn"},
- "gsm": {preferred: "gsm", prefix: "sgn"},
- "gss": {preferred: "gss", prefix: "sgn"},
- "gus": {preferred: "gus", prefix: "sgn"},
- "hab": {preferred: "hab", prefix: "sgn"},
- "haf": {preferred: "haf", prefix: "sgn"},
- "hak": {preferred: "hak", prefix: "zh"},
- "hds": {preferred: "hds", prefix: "sgn"},
- "hji": {preferred: "hji", prefix: "ms"},
- "hks": {preferred: "hks", prefix: "sgn"},
- "hos": {preferred: "hos", prefix: "sgn"},
- "hps": {preferred: "hps", prefix: "sgn"},
- "hsh": {preferred: "hsh", prefix: "sgn"},
- "hsl": {preferred: "hsl", prefix: "sgn"},
- "hsn": {preferred: "hsn", prefix: "zh"},
- "icl": {preferred: "icl", prefix: "sgn"},
- "iks": {preferred: "iks", prefix: "sgn"},
- "ils": {preferred: "ils", prefix: "sgn"},
- "inl": {preferred: "inl", prefix: "sgn"},
- "ins": {preferred: "ins", prefix: "sgn"},
- "ise": {preferred: "ise", prefix: "sgn"},
- "isg": {preferred: "isg", prefix: "sgn"},
- "isr": {preferred: "isr", prefix: "sgn"},
- "jak": {preferred: "jak", prefix: "ms"},
- "jax": {preferred: "jax", prefix: "ms"},
- "jcs": {preferred: "jcs", prefix: "sgn"},
- "jhs": {preferred: "jhs", prefix: "sgn"},
- "jls": {preferred: "jls", prefix: "sgn"},
- "jos": {preferred: "jos", prefix: "sgn"},
- "jsl": {preferred: "jsl", prefix: "sgn"},
- "jus": {preferred: "jus", prefix: "sgn"},
- "kgi": {preferred: "kgi", prefix: "sgn"},
- "knn": {preferred: "knn", prefix: "kok"},
- "kvb": {preferred: "kvb", prefix: "ms"},
- "kvk": {preferred: "kvk", prefix: "sgn"},
- "kvr": {preferred: "kvr", prefix: "ms"},
- "kxd": {preferred: "kxd", prefix: "ms"},
- "lbs": {preferred: "lbs", prefix: "sgn"},
- "lce": {preferred: "lce", prefix: "ms"},
- "lcf": {preferred: "lcf", prefix: "ms"},
- "liw": {preferred: "liw", prefix: "ms"},
- "lls": {preferred: "lls", prefix: "sgn"},
- "lsg": {preferred: "lsg", prefix: "sgn"},
- "lsl": {preferred: "lsl", prefix: "sgn"},
- "lso": {preferred: "lso", prefix: "sgn"},
- "lsp": {preferred: "lsp", prefix: "sgn"},
- "lst": {preferred: "lst", prefix: "sgn"},
- "lsy": {preferred: "lsy", prefix: "sgn"},
- "ltg": {preferred: "ltg", prefix: "lv"},
- "lvs": {preferred: "lvs", prefix: "lv"},
- "lzh": {preferred: "lzh", prefix: "zh"},
- "max": {preferred: "max", prefix: "ms"},
- "mdl": {preferred: "mdl", prefix: "sgn"},
- "meo": {preferred: "meo", prefix: "ms"},
- "mfa": {preferred: "mfa", prefix: "ms"},
- "mfb": {preferred: "mfb", prefix: "ms"},
- "mfs": {preferred: "mfs", prefix: "sgn"},
- "min": {preferred: "min", prefix: "ms"},
- "mnp": {preferred: "mnp", prefix: "zh"},
- "mqg": {preferred: "mqg", prefix: "ms"},
- "mre": {preferred: "mre", prefix: "sgn"},
- "msd": {preferred: "msd", prefix: "sgn"},
- "msi": {preferred: "msi", prefix: "ms"},
- "msr": {preferred: "msr", prefix: "sgn"},
- "mui": {preferred: "mui", prefix: "ms"},
- "mzc": {preferred: "mzc", prefix: "sgn"},
- "mzg": {preferred: "mzg", prefix: "sgn"},
- "mzy": {preferred: "mzy", prefix: "sgn"},
- "nan": {preferred: "nan", prefix: "zh"},
- "nbs": {preferred: "nbs", prefix: "sgn"},
- "ncs": {preferred: "ncs", prefix: "sgn"},
- "nsi": {preferred: "nsi", prefix: "sgn"},
- "nsl": {preferred: "nsl", prefix: "sgn"},
- "nsp": {preferred: "nsp", prefix: "sgn"},
- "nsr": {preferred: "nsr", prefix: "sgn"},
- "nzs": {preferred: "nzs", prefix: "sgn"},
- "okl": {preferred: "okl", prefix: "sgn"},
- "orn": {preferred: "orn", prefix: "ms"},
- "ors": {preferred: "ors", prefix: "ms"},
- "pel": {preferred: "pel", prefix: "ms"},
- "pga": {preferred: "pga", prefix: "ar"},
- "pgz": {preferred: "pgz", prefix: "sgn"},
- "pks": {preferred: "pks", prefix: "sgn"},
- "prl": {preferred: "prl", prefix: "sgn"},
- "prz": {preferred: "prz", prefix: "sgn"},
- "psc": {preferred: "psc", prefix: "sgn"},
- "psd": {preferred: "psd", prefix: "sgn"},
- "pse": {preferred: "pse", prefix: "ms"},
- "psg": {preferred: "psg", prefix: "sgn"},
- "psl": {preferred: "psl", prefix: "sgn"},
- "pso": {preferred: "pso", prefix: "sgn"},
- "psp": {preferred: "psp", prefix: "sgn"},
- "psr": {preferred: "psr", prefix: "sgn"},
- "pys": {preferred: "pys", prefix: "sgn"},
- "rms": {preferred: "rms", prefix: "sgn"},
- "rsi": {preferred: "rsi", prefix: "sgn"},
- "rsl": {preferred: "rsl", prefix: "sgn"},
- "rsm": {preferred: "rsm", prefix: "sgn"},
- "sdl": {preferred: "sdl", prefix: "sgn"},
- "sfb": {preferred: "sfb", prefix: "sgn"},
- "sfs": {preferred: "sfs", prefix: "sgn"},
- "sgg": {preferred: "sgg", prefix: "sgn"},
- "sgx": {preferred: "sgx", prefix: "sgn"},
- "shu": {preferred: "shu", prefix: "ar"},
- "slf": {preferred: "slf", prefix: "sgn"},
- "sls": {preferred: "sls", prefix: "sgn"},
- "sqk": {preferred: "sqk", prefix: "sgn"},
- "sqs": {preferred: "sqs", prefix: "sgn"},
- "ssh": {preferred: "ssh", prefix: "ar"},
- "ssp": {preferred: "ssp", prefix: "sgn"},
- "ssr": {preferred: "ssr", prefix: "sgn"},
- "svk": {preferred: "svk", prefix: "sgn"},
- "swc": {preferred: "swc", prefix: "sw"},
- "swh": {preferred: "swh", prefix: "sw"},
- "swl": {preferred: "swl", prefix: "sgn"},
- "syy": {preferred: "syy", prefix: "sgn"},
- "tmw": {preferred: "tmw", prefix: "ms"},
- "tse": {preferred: "tse", prefix: "sgn"},
- "tsm": {preferred: "tsm", prefix: "sgn"},
- "tsq": {preferred: "tsq", prefix: "sgn"},
- "tss": {preferred: "tss", prefix: "sgn"},
- "tsy": {preferred: "tsy", prefix: "sgn"},
- "tza": {preferred: "tza", prefix: "sgn"},
- "ugn": {preferred: "ugn", prefix: "sgn"},
- "ugy": {preferred: "ugy", prefix: "sgn"},
- "ukl": {preferred: "ukl", prefix: "sgn"},
- "uks": {preferred: "uks", prefix: "sgn"},
- "urk": {preferred: "urk", prefix: "ms"},
- "uzn": {preferred: "uzn", prefix: "uz"},
- "uzs": {preferred: "uzs", prefix: "uz"},
- "vgt": {preferred: "vgt", prefix: "sgn"},
- "vkk": {preferred: "vkk", prefix: "ms"},
- "vkt": {preferred: "vkt", prefix: "ms"},
- "vsi": {preferred: "vsi", prefix: "sgn"},
- "vsl": {preferred: "vsl", prefix: "sgn"},
- "vsv": {preferred: "vsv", prefix: "sgn"},
- "wuu": {preferred: "wuu", prefix: "zh"},
- "xki": {preferred: "xki", prefix: "sgn"},
- "xml": {preferred: "xml", prefix: "sgn"},
- "xmm": {preferred: "xmm", prefix: "ms"},
- "xms": {preferred: "xms", prefix: "sgn"},
- "ygs": {preferred: "ygs", prefix: "sgn"},
- "yhs": {preferred: "yhs", prefix: "sgn"},
- "ysl": {preferred: "ysl", prefix: "sgn"},
- "yue": {preferred: "yue", prefix: "zh"},
- "zib": {preferred: "zib", prefix: "sgn"},
- "zlm": {preferred: "zlm", prefix: "ms"},
- "zmi": {preferred: "zmi", prefix: "ms"},
- "zsl": {preferred: "zsl", prefix: "sgn"},
- "zsm": {preferred: "zsm", prefix: "ms"},
-};
diff --git a/js/src/builtin/intl/LanguageTag.cpp b/js/src/builtin/intl/LanguageTag.cpp
new file mode 100644
index 0000000000..1049e91bc2
--- /dev/null
+++ b/js/src/builtin/intl/LanguageTag.cpp
@@ -0,0 +1,1728 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "builtin/intl/LanguageTag.h"
+
+#include "mozilla/Assertions.h"
+#include "mozilla/MathAlgorithms.h"
+#include "mozilla/Span.h"
+#include "mozilla/TextUtils.h"
+#include "mozilla/Variant.h"
+
+#include <algorithm>
+#include <iterator>
+#include <stddef.h>
+#include <stdint.h>
+#include <string>
+#include <string.h>
+#include <type_traits>
+#include <utility>
+
+#include "jsapi.h"
+#include "jsfriendapi.h"
+#include "jscntxt.h"
+
+#include "builtin/intl/CommonFunctions.h"
+#include "ds/Sort.h"
+#include "gc/Tracer.h"
+#include "js/Result.h"
+#include "js/TracingAPI.h"
+#include "js/Utility.h"
+#include "js/Vector.h"
+#include "unicode/uloc.h"
+#include "unicode/utypes.h"
+#include "vm/String.h"
+#include "vm/StringBuffer.h"
+
+namespace js {
+namespace intl {
+
+using namespace js::intl::LanguageTagLimits;
+
+template <typename CharT>
+bool IsStructurallyValidLanguageTag(mozilla::Span<const CharT> language) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ // unicode_language_subtag = alpha{2,3} | alpha{5,8};
+ size_t length = language.size();
+ const CharT* str = language.data();
+ return ((2 <= length && length <= 3) || (5 <= length && length <= 8)) &&
+ std::all_of(str, str + length, mozilla::IsAsciiAlpha<CharT>);
+}
+
+template bool IsStructurallyValidLanguageTag(
+ mozilla::Span<const char> language);
+template bool IsStructurallyValidLanguageTag(
+ mozilla::Span<const Latin1Char> language);
+template bool IsStructurallyValidLanguageTag(
+ mozilla::Span<const char16_t> language);
+
+template <typename CharT>
+bool IsStructurallyValidScriptTag(mozilla::Span<const CharT> script) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ // unicode_script_subtag = alpha{4} ;
+ size_t length = script.size();
+ const CharT* str = script.data();
+ return length == 4 &&
+ std::all_of(str, str + length, mozilla::IsAsciiAlpha<CharT>);
+}
+
+template bool IsStructurallyValidScriptTag(
+ mozilla::Span<const char> script);
+template bool IsStructurallyValidScriptTag(
+ mozilla::Span<const Latin1Char> script);
+template bool IsStructurallyValidScriptTag(
+ mozilla::Span<const char16_t> script);
+
+template <typename CharT>
+bool IsStructurallyValidRegionTag(mozilla::Span<const CharT> region) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ // unicode_region_subtag = (alpha{2} | digit{3}) ;
+ size_t length = region.size();
+ const CharT* str = region.data();
+ return (length == 2 &&
+ std::all_of(str, str + length, mozilla::IsAsciiAlpha<CharT>)) ||
+ (length == 3 &&
+ std::all_of(str, str + length, mozilla::IsAsciiDigit<CharT>));
+}
+
+template bool IsStructurallyValidRegionTag(
+ mozilla::Span<const char> region);
+template bool IsStructurallyValidRegionTag(
+ mozilla::Span<const Latin1Char> region);
+template bool IsStructurallyValidRegionTag(
+ mozilla::Span<const char16_t> region);
+
+#ifdef DEBUG
+bool IsStructurallyValidVariantTag(mozilla::Span<const char> variant) {
+ // unicode_variant_subtag = (alphanum{5,8} | digit alphanum{3}) ;
+ size_t length = variant.size();
+ const char* str = variant.data();
+ return ((5 <= length && length <= 8) ||
+ (length == 4 && mozilla::IsAsciiDigit(str[0]))) &&
+ std::all_of(str, str + length, mozilla::IsAsciiAlphanumeric<char>);
+}
+
+bool IsStructurallyValidUnicodeExtensionTag(
+ mozilla::Span<const char> extension) {
+ return LanguageTagParser::canParseUnicodeExtension(extension);
+}
+
+static bool IsStructurallyValidExtensionTag(
+ mozilla::Span<const char> extension) {
+ // other_extensions = sep [alphanum-[tTuUxX]] (sep alphanum{2,8})+ ;
+ // NB: Allow any extension, including Unicode and Transform here, because
+ // this function is only used for an assertion.
+
+ size_t length = extension.size();
+ const char* str = extension.data();
+ const char* const end = extension.data() + length;
+ if (length <= 2) {
+ return false;
+ }
+ if (!mozilla::IsAsciiAlphanumeric(str[0]) || str[0] == 'x' || str[0] == 'X') {
+ return false;
+ }
+ str++;
+ if (*str++ != '-') {
+ return false;
+ }
+ while (true) {
+ const char* sep =
+ reinterpret_cast<const char*>(memchr(str, '-', end - str));
+ size_t len = (sep ? sep : end) - str;
+ if (len < 2 || len > 8 ||
+ !std::all_of(str, str + len, mozilla::IsAsciiAlphanumeric<char>)) {
+ return false;
+ }
+ if (!sep) {
+ return true;
+ }
+ str = sep + 1;
+ }
+}
+
+bool IsStructurallyValidPrivateUseTag(mozilla::Span<const char> privateUse) {
+ // pu_extensions = sep [xX] (sep alphanum{1,8})+ ;
+
+ size_t length = privateUse.size();
+ const char* str = privateUse.data();
+ const char* const end = privateUse.data() + length;
+ if (length <= 2) {
+ return false;
+ }
+ if (str[0] != 'x' && str[0] != 'X') {
+ return false;
+ }
+ str++;
+ if (*str++ != '-') {
+ return false;
+ }
+ while (true) {
+ const char* sep =
+ reinterpret_cast<const char*>(memchr(str, '-', end - str));
+ size_t len = (sep ? sep : end) - str;
+ if (len == 0 || len > 8 ||
+ !std::all_of(str, str + len, mozilla::IsAsciiAlphanumeric<char>)) {
+ return false;
+ }
+ if (!sep) {
+ return true;
+ }
+ str = sep + 1;
+ }
+}
+#endif
+
+ptrdiff_t LanguageTag::unicodeExtensionIndex() const {
+ // The extension subtags aren't necessarily sorted, so we can't use binary
+ // search here.
+ auto p = std::find_if(
+ extensions().begin(), extensions().end(),
+ [](const auto& ext) { return ext[0] == 'u' || ext[0] == 'U'; });
+ if (p != extensions().end()) {
+ return std::distance(extensions().begin(), p);
+ }
+ return -1;
+}
+
+const char* LanguageTag::unicodeExtension() const {
+ ptrdiff_t index = unicodeExtensionIndex();
+ if (index >= 0) {
+ return extensions()[index].get();
+ }
+ return nullptr;
+}
+
+bool LanguageTag::setUnicodeExtension(UniqueChars extension) {
+ MOZ_ASSERT(IsStructurallyValidUnicodeExtensionTag(
+ mozilla::MakeCStringSpan(extension.get())));
+
+ // Replace the existing Unicode extension subtag or append a new one.
+ ptrdiff_t index = unicodeExtensionIndex();
+ if (index >= 0) {
+ extensions_[index] = std::move(extension);
+ return true;
+ }
+ return extensions_.append(std::move(extension));
+}
+
+void LanguageTag::clearUnicodeExtension() {
+ ptrdiff_t index = unicodeExtensionIndex();
+ if (index >= 0) {
+ extensions_.erase(extensions_.begin() + index);
+ }
+}
+
+template <size_t InitialCapacity>
+static bool SortAlphabetically(JSContext* cx,
+ Vector<UniqueChars, InitialCapacity>& subtags) {
+ size_t length = subtags.length();
+
+ // Zero or one element lists are already sorted.
+ if (length < 2) {
+ return true;
+ }
+
+ // Handle two element lists inline.
+ if (length == 2) {
+ if (strcmp(subtags[0].get(), subtags[1].get()) > 0) {
+ subtags[0].swap(subtags[1]);
+ }
+ return true;
+ }
+
+ Vector<char*, 8> scratch(cx);
+ if (!scratch.resizeUninitialized(length * 2)) {
+ return false;
+ }
+ for (size_t i = 0; i < length; i++) {
+ scratch[i] = subtags[i].release();
+ }
+
+ MOZ_ALWAYS_TRUE(
+ MergeSort(scratch.begin(), length, scratch.begin() + length,
+ [](const char* a, const char* b, bool* lessOrEqualp) {
+ *lessOrEqualp = strcmp(a, b) <= 0;
+ return true;
+ }));
+
+ for (size_t i = 0; i < length; i++) {
+ subtags[i] = UniqueChars(scratch[i]);
+ }
+ return true;
+}
+
+bool LanguageTag::canonicalizeBaseName(JSContext* cx,
+ DuplicateVariants duplicateVariants) {
+ // Per 6.2.3 CanonicalizeUnicodeLocaleId, the very first step is to
+ // canonicalize the syntax by normalizing the case and ordering all subtags.
+ // The canonical syntax form is specified in UTS 35, 3.2.1.
+
+ // Language codes need to be in lower case. "JA" -> "ja"
+ language_.toLowerCase();
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(language().span()));
+
+ // The first character of a script code needs to be capitalized.
+ // "hans" -> "Hans"
+ script_.toTitleCase();
+ MOZ_ASSERT(script().missing() ||
+ IsStructurallyValidScriptTag(script().span()));
+
+ // Region codes need to be in upper case. "bu" -> "BU"
+ region_.toUpperCase();
+ MOZ_ASSERT(region().missing() ||
+ IsStructurallyValidRegionTag(region().span()));
+
+ // The canonical case for variant subtags is lowercase.
+ for (UniqueChars& variant : variants_) {
+ char* variantChars = variant.get();
+ size_t variantLength = strlen(variantChars);
+ AsciiToLowerCase(variantChars, variantLength, variantChars);
+
+ MOZ_ASSERT(IsStructurallyValidVariantTag({variantChars, variantLength}));
+ }
+
+ // Extensions and privateuse subtags are case normalized in the
+ // |canonicalizeExtensions| method.
+
+ // The second step in UTS 35, 3.2.1, is to order all subtags.
+
+ if (variants_.length() > 1) {
+ // 1. Any variants are in alphabetical order.
+ if (!SortAlphabetically(cx, variants_)) {
+ return false;
+ }
+
+ if (duplicateVariants == DuplicateVariants::Reject) {
+ // Reject the Locale identifier if a duplicate variant was found, e.g.
+ // "en-variant-Variant".
+ const UniqueChars* duplicate =
+ std::adjacent_find(variants().begin(), variants().end(),
+ [](const auto& a, const auto& b) {
+ return strcmp(a.get(), b.get()) == 0;
+ });
+ if (duplicate != variants().end()) {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
+ JSMSG_DUPLICATE_VARIANT_SUBTAG,
+ duplicate->get());
+ return false;
+ }
+ }
+ }
+
+ // 2. Any extensions are in alphabetical order by their singleton.
+ // 3. All attributes are sorted in alphabetical order.
+ // 4. All keywords and tfields are sorted by alphabetical order of their keys,
+ // within their respective extensions.
+ // 5. Any type or tfield value "true" is removed.
+ // - A subsequent call to canonicalizeExtensions() will perform these steps.
+
+ // 6.2.3 CanonicalizeUnicodeLocaleId, step 2 transforms the locale identifier
+ // into its canonical form per UTS 3.2.1.
+
+ // 1. Use the bcp47 data to replace keys, types, tfields, and tvalues by their
+ // canonical forms.
+ // - A subsequent call to canonicalizeExtensions() will perform this step.
+
+ // 2. Replace aliases in the unicode_language_id and tlang (if any).
+ // - tlang is handled in canonicalizeExtensions().
+
+ // Replace deprecated language, region, and variant subtags with their
+ // preferred mappings.
+
+ if (!updateGrandfatheredMappings(cx)) {
+ return false;
+ }
+
+ // Replace deprecated language subtags with their preferred values.
+ if (!languageMapping(language_) && complexLanguageMapping(language_)) {
+ performComplexLanguageMappings();
+ }
+
+ // No script replacements are currently present.
+
+ // Replace deprecated region subtags with their preferred values.
+ if (region().present()) {
+ if (!regionMapping(region_) && complexRegionMapping(region_)) {
+ performComplexRegionMappings();
+ }
+ }
+
+ // Replace deprecated variant subtags with their preferred values.
+ if (!performVariantMappings(cx)) {
+ return false;
+ }
+
+ // No extension replacements are currently present.
+ // Private use sequences are left as is.
+
+ // 3. Replace aliases in special key values.
+ // - A subsequent call to canonicalizeExtensions() will perform this step.
+
+ return true;
+}
+
+#ifdef DEBUG
+template <typename CharT>
+static bool IsAsciiLowercaseAlphanumericOrDash(
+ mozilla::Span<const CharT> span) {
+ const CharT* ptr = span.data();
+ size_t length = span.size();
+ return std::all_of(ptr, ptr + length, [](auto c) {
+ return mozilla::IsAsciiLowercaseAlpha(c) || mozilla::IsAsciiDigit(c) ||
+ c == '-';
+ });
+}
+#endif
+
+bool LanguageTag::canonicalizeExtensions(JSContext* cx) {
+ // The canonical case for all extension subtags is lowercase.
+ for (UniqueChars& extension : extensions_) {
+ char* extensionChars = extension.get();
+ size_t extensionLength = strlen(extensionChars);
+ AsciiToLowerCase(extensionChars, extensionLength, extensionChars);
+
+ MOZ_ASSERT(
+ IsStructurallyValidExtensionTag({extensionChars, extensionLength}));
+ }
+
+ // Any extensions are in alphabetical order by their singleton.
+ // "u-ca-chinese-t-zh-latn" -> "t-zh-latn-u-ca-chinese"
+ if (!SortAlphabetically(cx, extensions_)) {
+ return false;
+ }
+
+ for (UniqueChars& extension : extensions_) {
+ if (extension[0] == 'u') {
+ if (!canonicalizeUnicodeExtension(cx, extension)) {
+ return false;
+ }
+ } else if (extension[0] == 't') {
+ if (!canonicalizeTransformExtension(cx, extension)) {
+ return false;
+ }
+ }
+
+ MOZ_ASSERT(IsAsciiLowercaseAlphanumericOrDash(
+ mozilla::MakeCStringSpan(extension.get())));
+ }
+
+ // The canonical case for privateuse subtags is lowercase.
+ if (char* privateuse = privateuse_.get()) {
+ size_t privateuseLength = strlen(privateuse);
+ AsciiToLowerCase(privateuse, privateuseLength, privateuse);
+
+ MOZ_ASSERT(
+ IsStructurallyValidPrivateUseTag({privateuse, privateuseLength}));
+ }
+ return true;
+}
+
+/**
+ * CanonicalizeUnicodeExtension( attributes, keywords )
+ *
+ * Canonical syntax per
+ * <https://unicode.org/reports/tr35/#Canonical_Unicode_Locale_Identifiers>:
+ *
+ * - All attributes and keywords are in lowercase.
+ * - Note: The parser already converted keywords to lowercase.
+ * - All attributes are sorted in alphabetical order.
+ * - All keywords are sorted by alphabetical order of their keys.
+ * - Any type value "true" is removed.
+ *
+ * Canonical form:
+ * - All keys and types use the canonical form (from the name attribute;
+ * see Section 3.6.4 U Extension Data Files).
+ */
+bool LanguageTag::canonicalizeUnicodeExtension(
+ JSContext* cx, JS::UniqueChars& unicodeExtension) {
+ const char* const extension = unicodeExtension.get();
+ MOZ_ASSERT(extension[0] == 'u');
+ MOZ_ASSERT(extension[1] == '-');
+ MOZ_ASSERT(
+ IsStructurallyValidExtensionTag(mozilla::MakeCStringSpan(extension)));
+
+ size_t length = strlen(extension);
+
+ LanguageTagParser::AttributesVector attributes(cx);
+ LanguageTagParser::KeywordsVector keywords(cx);
+
+ using Attribute = LanguageTagParser::AttributesVector::ElementType;
+ using Keyword = LanguageTagParser::KeywordsVector::ElementType;
+
+ bool ok;
+ JS_TRY_VAR_OR_RETURN_FALSE(
+ cx, ok,
+ LanguageTagParser::parseUnicodeExtension(
+ cx, mozilla::MakeSpan(extension, length), attributes, keywords));
+ MOZ_ASSERT(ok, "unexpected invalid Unicode extension subtag");
+
+ auto attributesLessOrEqual = [extension](const Attribute& a,
+ const Attribute& b) {
+ const char* astr = a.begin(extension);
+ const char* bstr = b.begin(extension);
+ size_t alen = a.length();
+ size_t blen = b.length();
+
+ if (int r =
+ std::char_traits<char>::compare(astr, bstr, std::min(alen, blen))) {
+ return r < 0;
+ }
+ return alen <= blen;
+ };
+
+ // All attributes are sorted in alphabetical order.
+ size_t attributesLength = attributes.length();
+ if (attributesLength > 1) {
+ if (!attributes.growByUninitialized(attributesLength)) {
+ return false;
+ }
+
+ MOZ_ALWAYS_TRUE(
+ MergeSort(attributes.begin(), attributesLength,
+ attributes.begin() + attributesLength,
+ [&](const auto& a, const auto& b, bool* lessOrEqualp) {
+ *lessOrEqualp = attributesLessOrEqual(a, b);
+ return true;
+ }));
+
+ attributes.shrinkBy(attributesLength);
+ }
+
+ auto keywordsLessOrEqual = [extension](const Keyword& a, const Keyword& b) {
+ const char* astr = a.begin(extension);
+ const char* bstr = b.begin(extension);
+ MOZ_ASSERT(a.length() >= UnicodeKeyLength);
+ MOZ_ASSERT(b.length() >= UnicodeKeyLength);
+
+ return std::char_traits<char>::compare(astr, bstr, UnicodeKeyLength) <= 0;
+ };
+
+ // All keywords are sorted by alphabetical order of keys.
+ size_t keywordsLength = keywords.length();
+ if (keywordsLength > 1) {
+ if (!keywords.growByUninitialized(keywordsLength)) {
+ return false;
+ }
+
+ // Using merge sort, being a stable sort algorithm, guarantees that two
+ // keywords using the same key are never reordered. That means for example
+ // when we have the input "u-nu-thai-kf-false-nu-latn", we are guaranteed to
+ // get the result "u-kf-false-nu-thai-nu-latn", i.e. "nu-thai" still occurs
+ // before "nu-latn".
+ // This is required so that deduplication below preserves the first keyword
+ // for a given key and discards the rest.
+ MOZ_ALWAYS_TRUE(MergeSort(
+ keywords.begin(), keywordsLength, keywords.begin() + keywordsLength,
+ [&](const auto& a, const auto& b, bool* lessOrEqualp) {
+ *lessOrEqualp = keywordsLessOrEqual(a, b);
+ return true;
+ }));
+
+ keywords.shrinkBy(keywordsLength);
+ }
+
+ Vector<char, 32> sb(cx);
+ if (!sb.append('u')) {
+ return false;
+ }
+
+ // Append all Unicode extension attributes.
+ for (size_t i = 0; i < attributes.length(); i++) {
+ const auto& attribute = attributes[i];
+
+ // Skip duplicate attributes.
+ if (i > 0) {
+ const auto& lastAttribute = attributes[i - 1];
+ if (attribute.length() == lastAttribute.length() &&
+ std::char_traits<char>::compare(attribute.begin(extension),
+ lastAttribute.begin(extension),
+ attribute.length()) == 0) {
+ continue;
+ }
+ MOZ_ASSERT(!attributesLessOrEqual(attribute, lastAttribute));
+ }
+
+ if (!sb.append('-')) {
+ return false;
+ }
+ if (!sb.append(attribute.begin(extension), attribute.length())) {
+ return false;
+ }
+ }
+
+ static constexpr size_t UnicodeKeyWithSepLength = UnicodeKeyLength + 1;
+
+ using StringSpan = mozilla::Span<const char>;
+
+ static auto isTrue = [](StringSpan type) {
+ constexpr char True[] = "true";
+ const size_t TrueLength = strlen(True);
+ return type.size() == TrueLength &&
+ std::char_traits<char>::compare(type.data(), True, TrueLength) == 0;
+ };
+
+ auto appendKey = [&sb, extension](const Keyword& keyword) {
+ MOZ_ASSERT(keyword.length() == UnicodeKeyLength);
+ return sb.append(keyword.begin(extension), UnicodeKeyLength);
+ };
+
+ auto appendKeyword = [&sb, extension](const Keyword& keyword,
+ StringSpan type) {
+ MOZ_ASSERT(keyword.length() > UnicodeKeyLength);
+
+ // Elide the Unicode extension type "true".
+ if (isTrue(type)) {
+ return sb.append(keyword.begin(extension), UnicodeKeyLength);
+ }
+ // Otherwise append the complete Unicode extension keyword.
+ return sb.append(keyword.begin(extension), keyword.length());
+ };
+
+ auto appendReplacement = [&sb, extension](const Keyword& keyword,
+ StringSpan replacement) {
+ MOZ_ASSERT(keyword.length() > UnicodeKeyLength);
+
+ // Elide the type "true" if present in the replacement.
+ if (isTrue(replacement)) {
+ return sb.append(keyword.begin(extension), UnicodeKeyLength);
+ }
+ // Otherwise append the Unicode key (including the separator) and the
+ // replaced type.
+ return sb.append(keyword.begin(extension), UnicodeKeyWithSepLength) &&
+ sb.append(replacement.data(), replacement.size());
+ };
+
+ // Append all Unicode extension keywords.
+ for (size_t i = 0; i < keywords.length(); i++) {
+ const auto& keyword = keywords[i];
+
+ // Skip duplicate keywords.
+ if (i > 0) {
+ const auto& lastKeyword = keywords[i - 1];
+ if (std::char_traits<char>::compare(keyword.begin(extension),
+ lastKeyword.begin(extension),
+ UnicodeKeyLength) == 0) {
+ continue;
+ }
+ MOZ_ASSERT(!keywordsLessOrEqual(keyword, lastKeyword));
+ }
+
+ if (!sb.append('-')) {
+ return false;
+ }
+
+ if (keyword.length() == UnicodeKeyLength) {
+ // Keyword without type value.
+ if (!appendKey(keyword)) {
+ return false;
+ }
+ } else {
+ StringSpan key(keyword.begin(extension), UnicodeKeyLength);
+ StringSpan type(keyword.begin(extension) + UnicodeKeyWithSepLength,
+ keyword.length() - UnicodeKeyWithSepLength);
+
+ // Search if there's a replacement for the current Unicode keyword.
+ if (const char* replacement = replaceUnicodeExtensionType(key, type)) {
+ if (!appendReplacement(keyword, mozilla::MakeCStringSpan(replacement))) {
+ return false;
+ }
+ } else {
+ if (!appendKeyword(keyword, type)) {
+ return false;
+ }
+ }
+ }
+ }
+
+ // We can keep the previous extension when canonicalization didn't modify it.
+ if (sb.length() != length ||
+ std::char_traits<char>::compare(sb.begin(), extension, length) != 0) {
+ // Null-terminate the new string and replace the previous extension.
+ if (!sb.append('\0')) {
+ return false;
+ }
+ UniqueChars canonical(sb.extractOrCopyRawBuffer());
+ if (!canonical) {
+ return false;
+ }
+ unicodeExtension = std::move(canonical);
+ }
+
+ return true;
+}
+
+template <class Buffer>
+static bool LanguageTagToString(JSContext* cx, const LanguageTag& tag,
+ Buffer& sb) {
+ auto appendSubtag = [&sb](const auto& subtag) {
+ auto span = subtag.span();
+ MOZ_ASSERT(span.size() > 0);
+ return sb.append(span.data(), span.size());
+ };
+
+ auto appendSubtagZ = [&sb](const char* subtag) {
+ MOZ_ASSERT(strlen(subtag) > 0);
+ return sb.append(subtag, strlen(subtag));
+ };
+
+ auto appendSubtagsZ = [&sb, &appendSubtagZ](const auto& subtags) {
+ for (const auto& subtag : subtags) {
+ if (!sb.append('-') || !appendSubtagZ(subtag.get())) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ // Append the language subtag.
+ if (!appendSubtag(tag.language())) {
+ return false;
+ }
+
+ // Append the script subtag if present.
+ if (tag.script().present()) {
+ if (!sb.append('-') || !appendSubtag(tag.script())) {
+ return false;
+ }
+ }
+
+ // Append the region subtag if present.
+ if (tag.region().present()) {
+ if (!sb.append('-') || !appendSubtag(tag.region())) {
+ return false;
+ }
+ }
+
+ // Append the variant subtags if present.
+ if (!appendSubtagsZ(tag.variants())) {
+ return false;
+ }
+
+ // Append the extensions subtags if present.
+ if (!appendSubtagsZ(tag.extensions())) {
+ return false;
+ }
+
+ // Append the private-use subtag if present.
+ if (tag.privateuse()) {
+ if (!sb.append('-') || !appendSubtagZ(tag.privateuse())) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * CanonicalizeTransformExtension
+ *
+ * Canonical form per <https://unicode.org/reports/tr35/#BCP47_T_Extension>:
+ *
+ * - These subtags are all in lowercase (that is the canonical casing for these
+ * subtags), [...].
+ *
+ * And per
+ * <https://unicode.org/reports/tr35/#Canonical_Unicode_Locale_Identifiers>:
+ *
+ * - All keywords and tfields are sorted by alphabetical order of their keys,
+ * within their respective extensions.
+ */
+bool LanguageTag::canonicalizeTransformExtension(
+ JSContext* cx, JS::UniqueChars& transformExtension) {
+ const char* const extension = transformExtension.get();
+ MOZ_ASSERT(extension[0] == 't');
+ MOZ_ASSERT(extension[1] == '-');
+ MOZ_ASSERT(
+ IsStructurallyValidExtensionTag(mozilla::MakeCStringSpan(extension)));
+
+ size_t length = strlen(extension);
+
+ LanguageTag tag(cx);
+ LanguageTagParser::TFieldVector fields(cx);
+
+ using TField = LanguageTagParser::TFieldVector::ElementType;
+
+ bool ok;
+ JS_TRY_VAR_OR_RETURN_FALSE(
+ cx, ok,
+ LanguageTagParser::parseTransformExtension(
+ cx, mozilla::MakeSpan(extension, length), tag, fields));
+ MOZ_ASSERT(ok, "unexpected invalid transform extension subtag");
+
+ auto tfieldLessOrEqual = [extension](const TField& a, const TField& b) {
+ MOZ_ASSERT(a.length() > TransformKeyLength);
+ MOZ_ASSERT(b.length() > TransformKeyLength);
+ const char* astr = a.begin(extension);
+ const char* bstr = b.begin(extension);
+ return std::char_traits<char>::compare(astr, bstr, TransformKeyLength) <= 0;
+ };
+
+ // All tfields are sorted by alphabetical order of their keys.
+ size_t fieldsLength = fields.length();
+ if (fieldsLength > 1) {
+ if (!fields.growByUninitialized(fieldsLength)) {
+ return false;
+ }
+
+ MOZ_ALWAYS_TRUE(
+ MergeSort(fields.begin(), fieldsLength, fields.begin() + fieldsLength,
+ [&](const auto& a, const auto& b, bool* lessOrEqualp) {
+ *lessOrEqualp = tfieldLessOrEqual(a, b);
+ return true;
+ }));
+
+ fields.shrinkBy(fieldsLength);
+ }
+
+ Vector<char, 32> sb(cx);
+ if (!sb.append('t')) {
+ return false;
+ }
+
+ // Append the language subtag if present.
+ //
+ // Replace aliases in tlang per
+ // <https://unicode.org/reports/tr35/#Canonical_Unicode_Locale_Identifiers>.
+ if (tag.language().present()) {
+ if (!sb.append('-')) {
+ return false;
+ }
+
+ // ECMA-402 is unclear whether or not duplicate variants are allowed in
+ // transform extensions. Tentatively allow duplicates until
+ // https://github.com/tc39/ecma402/issues/330 has been addressed.
+ if (!tag.canonicalizeBaseName(cx, DuplicateVariants::Accept)) {
+ return false;
+ }
+
+ // The canonical case for Transform extensions is lowercase per
+ // <https://unicode.org/reports/tr35/#BCP47_T_Extension>. Convert the two
+ // subtags which don't use lowercase for their canonical syntax.
+ tag.script_.toLowerCase();
+ tag.region_.toLowerCase();
+
+ if (!LanguageTagToString(cx, tag, sb)) {
+ return false;
+ }
+ }
+
+ static constexpr size_t TransformKeyWithSepLength = TransformKeyLength + 1;
+
+ using StringSpan = mozilla::Span<const char>;
+
+ // Append all fields.
+ //
+ // UTS 35, 3.2.1 specifies:
+ // - Any type or tfield value "true" is removed.
+ //
+ // But the `tvalue` subtag is mandatory in `tfield: tkey tvalue`, so ignore
+ // this apparently invalid part of the UTS 35 specification and simply
+ // append all `tfield` subtags.
+ for (const auto& field : fields) {
+ if (!sb.append('-')) {
+ return false;
+ }
+
+ StringSpan key(field.begin(extension), TransformKeyLength);
+ StringSpan value(field.begin(extension) + TransformKeyWithSepLength,
+ field.length() - TransformKeyWithSepLength);
+
+ // Search if there's a replacement for the current transform keyword.
+ if (const char* replacement = replaceTransformExtensionType(key, value)) {
+ if (!sb.append(field.begin(extension), TransformKeyWithSepLength)) {
+ return false;
+ }
+ if (!sb.append(replacement, strlen(replacement))) {
+ return false;
+ }
+ } else {
+ if (!sb.append(field.begin(extension), field.length())) {
+ return false;
+ }
+ }
+ }
+
+ // We can keep the previous extension when canonicalization didn't modify it.
+ if (sb.length() != length ||
+ std::char_traits<char>::compare(sb.begin(), extension, length) != 0) {
+ // Null-terminate the new string and replace the previous extension.
+ if (!sb.append('\0')) {
+ return false;
+ }
+ UniqueChars canonical(sb.extractOrCopyRawBuffer());
+ if (!canonical) {
+ return false;
+ }
+ transformExtension = std::move(canonical);
+ }
+
+ return true;
+}
+
+JSString* LanguageTag::toString(JSContext* cx) const {
+ StringBuffer sb(cx);
+ if (!LanguageTagToString(cx, *this, sb)) {
+ return nullptr;
+ }
+
+ return sb.finishString();
+}
+
+UniqueChars LanguageTag::toStringZ(JSContext* cx) const {
+ Vector<char, 16> sb(cx);
+ if (!LanguageTagToString(cx, *this, sb)) {
+ return nullptr;
+ }
+ if (!sb.append('\0')) {
+ return nullptr;
+ }
+
+ return UniqueChars(sb.extractOrCopyRawBuffer());
+}
+
+// Zero-terminated ICU Locale ID.
+using LocaleId =
+ js::Vector<char, LanguageLength + 1 + ScriptLength + 1 + RegionLength + 1>;
+
+enum class LikelySubtags : bool { Add, Remove };
+
+// Return true iff the language tag is already maximized resp. minimized.
+static bool HasLikelySubtags(LikelySubtags likelySubtags,
+ const LanguageTag& tag) {
+ // The language tag is already maximized if the language, script, and region
+ // subtags are present and no placeholder subtags ("und", "Zzzz", "ZZ") are
+ // used.
+ if (likelySubtags == LikelySubtags::Add) {
+ return !tag.language().equalTo("und") &&
+ (tag.script().present() && !tag.script().equalTo("Zzzz")) &&
+ (tag.region().present() && !tag.region().equalTo("ZZ"));
+ }
+
+ // The language tag is already minimized if it only contains a language
+ // subtag whose value is not the placeholder value "und".
+ return !tag.language().equalTo("und") && tag.script().missing() &&
+ tag.region().missing();
+}
+
+// Create an ICU locale ID from the given language tag.
+static bool CreateLocaleForLikelySubtags(const LanguageTag& tag,
+ LocaleId& locale) {
+ MOZ_ASSERT(locale.length() == 0);
+
+ auto appendSubtag = [&locale](const auto& subtag) {
+ auto span = subtag.span();
+ MOZ_ASSERT(span.size() > 0);
+ return locale.append(span.data(), span.size());
+ };
+
+ // Append the language subtag.
+ if (!appendSubtag(tag.language())) {
+ return false;
+ }
+
+ // Append the script subtag if present.
+ if (tag.script().present()) {
+ if (!locale.append('_') || !appendSubtag(tag.script())) {
+ return false;
+ }
+ }
+
+ // Append the region subtag if present.
+ if (tag.region().present()) {
+ if (!locale.append('_') || !appendSubtag(tag.region())) {
+ return false;
+ }
+ }
+
+ // Zero-terminated for use with ICU.
+ return locale.append('\0');
+}
+
+// Assign the language, script, and region subtags from an ICU locale ID.
+//
+// ICU provides |uloc_getLanguage|, |uloc_getScript|, and |uloc_getCountry| to
+// retrieve these subtags, but unfortunately these functions are rather slow, so
+// we use our own implementation.
+static bool AssignFromLocaleId(JSContext* cx, LocaleId& localeId,
+ LanguageTag& tag) {
+ MOZ_ASSERT(localeId.back() == '\0',
+ "Locale ID should be zero-terminated for ICU");
+
+ // Replace the ICU locale ID separator.
+ std::replace(localeId.begin(), localeId.end(), '_', '-');
+
+ // ICU replaces "und" with the empty string, which means "und" becomes "" and
+ // "und-Latn" becomes "-Latn". Handle this case separately.
+ if (localeId[0] == '\0' || localeId[0] == '-') {
+ static constexpr char und[] = "und";
+ size_t length = strlen(und);
+
+ // Insert "und" in front of the locale ID.
+ if (!localeId.growBy(length)) {
+ return false;
+ }
+ memmove(localeId.begin() + length, localeId.begin(), localeId.length());
+ memmove(localeId.begin(), und, length);
+ }
+
+ mozilla::Span<const char> localeSpan(localeId.begin(), localeId.length() - 1);
+
+ // Retrieve the language, script, and region subtags from the locale ID, but
+ // ignore any other subtags.
+ LanguageTag localeTag(cx);
+ if (!LanguageTagParser::parseBaseName(cx, localeSpan, localeTag)) {
+ return false;
+ }
+
+ tag.setLanguage(localeTag.language());
+ tag.setScript(localeTag.script());
+ tag.setRegion(localeTag.region());
+
+ return true;
+}
+
+template <decltype(uloc_addLikelySubtags) likelySubtagsFn>
+static bool CallLikelySubtags(JSContext* cx, const LocaleId& localeId,
+ LocaleId& result) {
+ // Locale ID must be zero-terminated before passing it to ICU.
+ MOZ_ASSERT(localeId.back() == '\0');
+ MOZ_ASSERT(result.length() == 0);
+
+ int32_t length = intl::CallICU(
+ cx,
+ result,
+ [&localeId](char* chars, int32_t size, UErrorCode* status) {
+ return likelySubtagsFn(localeId.begin(), chars, size, status);
+ });
+ if (length < 0) {
+ return false;
+ }
+
+ MOZ_ASSERT(
+ size_t(length) <= LocaleId::InlineLength,
+ "Unexpected extra subtags were added by ICU. If this assertion ever "
+ "fails, simply remove it and move on like nothing ever happended.");
+
+ // Resize the vector to the actual string length.
+ result.shrinkTo(length);
+
+ // Zero-terminated for use with ICU.
+ return result.append('\0');
+}
+
+// The canonical way to compute the Unicode BCP 47 locale identifier with likely
+// subtags is as follows:
+//
+// 1. Call uloc_forLanguageTag() to transform the locale identifer into an ICU
+// locale ID.
+// 2. Call uloc_addLikelySubtags() to add the likely subtags to the locale ID.
+// 3. Call uloc_toLanguageTag() to transform the resulting locale ID back into
+// a Unicode BCP 47 locale identifier.
+//
+// Since uloc_forLanguageTag() and uloc_toLanguageTag() are both kind of slow
+// and we know, by construction, that the input Unicode BCP 47 locale identifier
+// only contains valid language, script, and region subtags, we can avoid both
+// calls if we implement them ourselves, see CreateLocaleForLikelySubtags() and
+// AssignFromLocaleId(). (Where "slow" means about 50% of the execution time of
+// |Intl.Locale.prototype.maximize|.)
+static bool LikelySubtags(JSContext* cx, LikelySubtags likelySubtags,
+ LanguageTag& tag) {
+ // Return early if the input is already maximized/minimized.
+ if (HasLikelySubtags(likelySubtags, tag)) {
+ return true;
+ }
+
+ // Create the locale ID for the input argument.
+ LocaleId locale(cx);
+ if (!CreateLocaleForLikelySubtags(tag, locale)) {
+ return false;
+ }
+
+ // UTS #35 requires that locale ID is maximized before its likely subtags are
+ // removed, so we need to call uloc_addLikelySubtags() for both cases.
+ // See <https://ssl.icu-project.org/trac/ticket/10220> and
+ // <https://ssl.icu-project.org/trac/ticket/12345>.
+
+ LocaleId localeLikelySubtags(cx);
+
+ // Add likely subtags to the locale ID. When minimizing we can skip adding the
+ // likely subtags for already maximized tags. (When maximizing we've already
+ // verified above that the tag is missing likely subtags.)
+ bool addLikelySubtags = likelySubtags == LikelySubtags::Add ||
+ !HasLikelySubtags(LikelySubtags::Add, tag);
+
+ if (addLikelySubtags) {
+ if (!CallLikelySubtags<uloc_addLikelySubtags>(cx, locale,
+ localeLikelySubtags)) {
+ return false;
+ }
+ }
+
+ // Now that we've succesfully maximized the locale, we can minimize it.
+ if (likelySubtags == LikelySubtags::Remove) {
+ if (addLikelySubtags) {
+ // Copy the maximized subtags back into |locale|.
+ locale = std::move(localeLikelySubtags);
+ localeLikelySubtags = LocaleId(cx);
+ }
+
+ // Remove likely subtags from the locale ID.
+ if (!CallLikelySubtags<uloc_minimizeSubtags>(cx, locale,
+ localeLikelySubtags)) {
+ return false;
+ }
+ }
+
+ // Assign the language, script, and region subtags from the locale ID.
+ if (!AssignFromLocaleId(cx, localeLikelySubtags, tag)) {
+ return false;
+ }
+
+ // Update mappings in case ICU returned a non-canonical locale.
+ return tag.canonicalizeBaseName(cx);
+}
+
+bool LanguageTag::addLikelySubtags(JSContext* cx) {
+ return LikelySubtags(cx, LikelySubtags::Add, *this);
+}
+
+bool LanguageTag::removeLikelySubtags(JSContext* cx) {
+ return LikelySubtags(cx, LikelySubtags::Remove, *this);
+}
+
+LanguageTagParser::Token LanguageTagParser::nextToken() {
+ MOZ_ASSERT(index_ <= length_ + 1, "called after 'None' token was read");
+
+ TokenKind kind = TokenKind::None;
+ size_t tokenLength = 0;
+ for (size_t i = index_; i < length_; i++) {
+ // UTS 35, section 3.1.
+ // alpha = [A-Z a-z] ;
+ // digit = [0-9] ;
+ char16_t c = charAtUnchecked(i);
+ if (mozilla::IsAsciiAlpha(c)) {
+ kind |= TokenKind::Alpha;
+ } else if (mozilla::IsAsciiDigit(c)) {
+ kind |= TokenKind::Digit;
+ } else if (c == '-' && i > index_ && i + 1 < length_) {
+ break;
+ } else {
+ return {TokenKind::Error, 0, 0};
+ }
+ tokenLength += 1;
+ }
+
+ Token token{kind, index_, tokenLength};
+ index_ += tokenLength + 1;
+ return token;
+}
+
+UniqueChars LanguageTagParser::chars(JSContext* cx, size_t index,
+ size_t length) const {
+ // Add +1 to null-terminate the string.
+ auto chars = cx->make_pod_array<char>(length + 1);
+ if (chars) {
+ char* dest = chars.get();
+ if (locale_.is<const JS::Latin1Char*>()) {
+ std::copy_n(locale_.as<const JS::Latin1Char*>() + index, length, dest);
+ } else {
+ std::copy_n(locale_.as<const char16_t*>() + index, length, dest);
+ }
+ dest[length] = '\0';
+ }
+ return chars;
+}
+
+// Parse the `unicode_language_id` production.
+//
+// unicode_language_id = unicode_language_subtag
+// (sep unicode_script_subtag)?
+// (sep unicode_region_subtag)?
+// (sep unicode_variant_subtag)* ;
+//
+// sep = "-"
+//
+// Note: Unicode CLDR locale identifier backward compatibility extensions
+// removed from `unicode_language_id`.
+//
+// |tok| is the current token from |ts|.
+//
+// All subtags will be added unaltered to |tag|, without canonicalizing their
+// case or, in the case of variant subtags, detecting and rejecting duplicate
+// variants. Users must subsequently |canonicalizeBaseName| to perform these
+// actions.
+//
+// Do not use this function directly: use |parseBaseName| or
+// |parseTlangFromTransformExtension| instead.
+JS::Result<bool> LanguageTagParser::internalParseBaseName(JSContext* cx,
+ LanguageTagParser& ts,
+ LanguageTag& tag,
+ Token& tok) {
+ if (ts.isLanguage(tok)) {
+ ts.copyChars(tok, tag.language_);
+
+ tok = ts.nextToken();
+ } else {
+ // The language subtag is mandatory.
+ return false;
+ }
+
+ if (ts.isScript(tok)) {
+ ts.copyChars(tok, tag.script_);
+
+ tok = ts.nextToken();
+ }
+
+ if (ts.isRegion(tok)) {
+ ts.copyChars(tok, tag.region_);
+
+ tok = ts.nextToken();
+ }
+
+ auto& variants = tag.variants_;
+ MOZ_ASSERT(variants.length() == 0);
+ while (ts.isVariant(tok)) {
+ auto variant = ts.chars(cx, tok);
+ if (!variant) {
+ return cx->alreadyReportedOOM();
+ }
+ if (!variants.append(std::move(variant))) {
+ return cx->alreadyReportedOOM();
+ }
+
+ tok = ts.nextToken();
+ }
+
+ return true;
+}
+
+static mozilla::Variant<const Latin1Char*, const char16_t*> StringChars(
+ const char* locale) {
+ return mozilla::AsVariant(reinterpret_cast<const JS::Latin1Char*>(locale));
+}
+
+static mozilla::Variant<const Latin1Char*, const char16_t*> StringChars(
+ JSLinearString* linear, JS::AutoCheckCannotGC& nogc) {
+ if (linear->hasLatin1Chars()) {
+ return mozilla::AsVariant(linear->latin1Chars(nogc));
+ }
+ return mozilla::AsVariant(linear->twoByteChars(nogc));
+}
+
+JS::Result<bool> LanguageTagParser::tryParse(JSContext* cx,
+ JSLinearString* locale,
+ LanguageTag& tag) {
+ JS::AutoCheckCannotGC nogc;
+ LocaleChars localeChars = StringChars(locale, nogc);
+ return tryParse(cx, localeChars, locale->length(), tag);
+}
+
+JS::Result<bool> LanguageTagParser::tryParse(JSContext* cx,
+ mozilla::Span<const char> locale,
+ LanguageTag& tag) {
+ LocaleChars localeChars = StringChars(locale.data());
+ return tryParse(cx, localeChars, locale.size(), tag);
+}
+
+JS::Result<bool> LanguageTagParser::tryParse(JSContext* cx,
+ LocaleChars& localeChars,
+ size_t localeLength,
+ LanguageTag& tag) {
+ // unicode_locale_id = unicode_language_id
+ // extensions*
+ // pu_extensions? ;
+
+ LanguageTagParser ts(localeChars, localeLength);
+ Token tok = ts.nextToken();
+
+ bool ok;
+ MOZ_TRY_VAR(ok, parseBaseName(cx, ts, tag, tok));
+ if (!ok) {
+ return false;
+ }
+
+ // extensions = unicode_locale_extensions
+ // | transformed_extensions
+ // | other_extensions ;
+
+ // Bit set of seen singletons.
+ uint64_t seenSingletons = 0;
+
+ auto& extensions = tag.extensions_;
+ while (ts.isExtensionStart(tok)) {
+ char singleton = ts.singletonKey(tok);
+
+ // Reject the input if a duplicate singleton was found.
+ uint64_t hash = 1ULL << (mozilla::AsciiAlphanumericToNumber(singleton) + 1);
+ if (seenSingletons & hash) {
+ return false;
+ }
+ seenSingletons |= hash;
+
+ Token start = tok;
+ tok = ts.nextToken();
+
+ // We'll check for missing non-singleton subtags after this block by
+ // comparing |startValue| with the then-current position.
+ size_t startValue = tok.index();
+
+ if (singleton == 'u') {
+ while (ts.isUnicodeExtensionPart(tok)) {
+ tok = ts.nextToken();
+ }
+ } else if (singleton == 't') {
+ // transformed_extensions = sep [tT]
+ // ((sep tlang (sep tfield)*)
+ // | (sep tfield)+) ;
+
+ // tlang = unicode_language_subtag
+ // (sep unicode_script_subtag)?
+ // (sep unicode_region_subtag)?
+ // (sep unicode_variant_subtag)* ;
+ if (ts.isLanguage(tok)) {
+ tok = ts.nextToken();
+
+ if (ts.isScript(tok)) {
+ tok = ts.nextToken();
+ }
+
+ if (ts.isRegion(tok)) {
+ tok = ts.nextToken();
+ }
+
+ while (ts.isVariant(tok)) {
+ tok = ts.nextToken();
+ }
+ }
+
+ // tfield = tkey tvalue;
+ while (ts.isTransformExtensionKey(tok)) {
+ tok = ts.nextToken();
+
+ size_t startTValue = tok.index();
+ while (ts.isTransformExtensionPart(tok)) {
+ tok = ts.nextToken();
+ }
+
+ // `tfield` requires at least one `tvalue`.
+ if (tok.index() <= startTValue) {
+ return false;
+ }
+ }
+ } else {
+ while (ts.isOtherExtensionPart(tok)) {
+ tok = ts.nextToken();
+ }
+ }
+
+ // Singletons must be followed by a non-singleton subtag, "en-a-b" is not
+ // allowed.
+ if (tok.index() <= startValue) {
+ return false;
+ }
+
+ UniqueChars extension = ts.extension(cx, start, tok);
+ if (!extension) {
+ return cx->alreadyReportedOOM();
+ }
+ if (!extensions.append(std::move(extension))) {
+ return cx->alreadyReportedOOM();
+ }
+ }
+
+ // Trailing `pu_extension` component of the `unicode_locale_id` production.
+ if (ts.isPrivateUseStart(tok)) {
+ Token start = tok;
+ tok = ts.nextToken();
+
+ size_t startValue = tok.index();
+ while (ts.isPrivateUsePart(tok)) {
+ tok = ts.nextToken();
+ }
+
+ // There must be at least one subtag after the "-x-".
+ if (tok.index() <= startValue) {
+ return false;
+ }
+
+ UniqueChars privateUse = ts.extension(cx, start, tok);
+ if (!privateUse) {
+ return cx->alreadyReportedOOM();
+ }
+ tag.privateuse_ = std::move(privateUse);
+ }
+
+ // Return true if the complete input was successfully parsed.
+ return tok.isNone();
+}
+
+bool LanguageTagParser::parse(JSContext* cx, JSLinearString* locale,
+ LanguageTag& tag) {
+ bool ok;
+ JS_TRY_VAR_OR_RETURN_FALSE(cx, ok, tryParse(cx, locale, tag));
+ if (ok) {
+ return true;
+ }
+ if (UniqueChars localeChars = StringToNewUTF8CharsZ(cx, *locale)) {
+ JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr,
+ JSMSG_INVALID_LANGUAGE_TAG, localeChars.get());
+ }
+ return false;
+}
+
+bool LanguageTagParser::parse(JSContext* cx, mozilla::Span<const char> locale,
+ LanguageTag& tag) {
+ bool ok;
+ JS_TRY_VAR_OR_RETURN_FALSE(cx, ok, tryParse(cx, locale, tag));
+ if (ok) {
+ return true;
+ }
+ if (UniqueChars localeChars = DuplicateString(cx, locale.data())) {
+ JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr,
+ JSMSG_INVALID_LANGUAGE_TAG, localeChars.get());
+ }
+ return false;
+}
+
+bool LanguageTagParser::parseBaseName(JSContext* cx,
+ mozilla::Span<const char> locale,
+ LanguageTag& tag) {
+ LocaleChars localeChars = StringChars(locale.data());
+ LanguageTagParser ts(localeChars, locale.size());
+ Token tok = ts.nextToken();
+
+ // Parse only the base-name part and ignore any trailing characters.
+ bool ok;
+ JS_TRY_VAR_OR_RETURN_FALSE(cx, ok, parseBaseName(cx, ts, tag, tok));
+ if (ok) {
+ return true;
+ }
+ if (UniqueChars localeChars = DuplicateString(cx, locale.data())) {
+ JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr,
+ JSMSG_INVALID_LANGUAGE_TAG, localeChars.get());
+ }
+ return false;
+}
+
+// Parse |extension|, which must be a valid `transformed_extensions` subtag, and
+// fill |tag| and |fields| from the `tlang` and `tfield` components.
+JS::Result<bool> LanguageTagParser::parseTransformExtension(
+ JSContext* cx, mozilla::Span<const char> extension, LanguageTag& tag,
+ TFieldVector& fields) {
+ LocaleChars extensionChars = StringChars(extension.data());
+ LanguageTagParser ts(extensionChars, extension.size());
+ Token tok = ts.nextToken();
+
+ if (!ts.isExtensionStart(tok) || ts.singletonKey(tok) != 't') {
+ return false;
+ }
+
+ tok = ts.nextToken();
+
+ if (tok.isNone()) {
+ return false;
+ }
+
+ if (ts.isLanguage(tok)) {
+ // We're parsing a possible `tlang` in a known-valid transform extension, so
+ // use the special-purpose function that takes advantage of this to compute
+ // lowercased |tag| contents in an optimal manner.
+ MOZ_TRY(parseTlangInTransformExtension(cx, ts, tag, tok));
+
+ // After `tlang` we must have a `tfield` and its `tkey`, or we're at the end
+ // of the transform extension.
+ MOZ_ASSERT(ts.isTransformExtensionKey(tok) || tok.isNone());
+ } else {
+ // If there's no `tlang` subtag, at least one `tfield` must be present.
+ MOZ_ASSERT(ts.isTransformExtensionKey(tok));
+ }
+
+ // Trailing `tfield` subtags. (Any other trailing subtags are an error,
+ // because we're guaranteed to only see a valid tranform extension here.)
+ while (ts.isTransformExtensionKey(tok)) {
+ size_t begin = tok.index();
+ tok = ts.nextToken();
+
+ size_t startTValue = tok.index();
+ while (ts.isTransformExtensionPart(tok)) {
+ tok = ts.nextToken();
+ }
+
+ // `tfield` requires at least one `tvalue`.
+ if (tok.index() <= startTValue) {
+ return false;
+ }
+
+ size_t length = tok.index() - 1 - begin;
+ if (!fields.emplaceBack(begin, length)) {
+ return cx->alreadyReportedOOM();
+ }
+ }
+
+ // Return true if the complete input was successfully parsed.
+ return tok.isNone();
+}
+
+// Parse |extension|, which must be a valid `unicode_locale_extensions` subtag,
+// and fill |attributes| and |keywords| from the `attribute` and `keyword`
+// components.
+JS::Result<bool> LanguageTagParser::parseUnicodeExtension(
+ JSContext* cx, mozilla::Span<const char> extension,
+ AttributesVector& attributes, KeywordsVector& keywords) {
+ LocaleChars extensionChars = StringChars(extension.data());
+ LanguageTagParser ts(extensionChars, extension.size());
+ Token tok = ts.nextToken();
+
+ // unicode_locale_extensions = sep [uU] ((sep keyword)+ |
+ // (sep attribute)+ (sep keyword)*) ;
+
+ if (!ts.isExtensionStart(tok) || ts.singletonKey(tok) != 'u') {
+ return false;
+ }
+
+ tok = ts.nextToken();
+
+ if (tok.isNone()) {
+ return false;
+ }
+
+ while (ts.isUnicodeExtensionAttribute(tok)) {
+ if (!attributes.emplaceBack(tok.index(), tok.length())) {
+ return cx->alreadyReportedOOM();
+ }
+
+ tok = ts.nextToken();
+ }
+
+ // keyword = key (sep type)? ;
+ while (ts.isUnicodeExtensionKey(tok)) {
+ size_t begin = tok.index();
+ tok = ts.nextToken();
+
+ while (ts.isUnicodeExtensionType(tok)) {
+ tok = ts.nextToken();
+ }
+
+ if (tok.isError()) {
+ return false;
+ }
+
+ size_t length = tok.index() - 1 - begin;
+ if (!keywords.emplaceBack(begin, length)) {
+ return cx->alreadyReportedOOM();
+ }
+ }
+
+ // Return true if the complete input was successfully parsed.
+ return tok.isNone();
+}
+
+bool LanguageTagParser::canParseUnicodeExtension(
+ mozilla::Span<const char> extension) {
+ LocaleChars extensionChars = StringChars(extension.data());
+ LanguageTagParser ts(extensionChars, extension.size());
+ Token tok = ts.nextToken();
+
+ // unicode_locale_extensions = sep [uU] ((sep keyword)+ |
+ // (sep attribute)+ (sep keyword)*) ;
+
+ if (!ts.isExtensionStart(tok) || ts.singletonKey(tok) != 'u') {
+ return false;
+ }
+
+ tok = ts.nextToken();
+
+ if (tok.isNone()) {
+ return false;
+ }
+
+ while (ts.isUnicodeExtensionAttribute(tok)) {
+ tok = ts.nextToken();
+ }
+
+ // keyword = key (sep type)? ;
+ while (ts.isUnicodeExtensionKey(tok)) {
+ tok = ts.nextToken();
+
+ while (ts.isUnicodeExtensionType(tok)) {
+ tok = ts.nextToken();
+ }
+
+ if (tok.isError()) {
+ return false;
+ }
+ }
+
+ // Return true if the complete input was successfully parsed.
+ return tok.isNone();
+}
+
+bool LanguageTagParser::canParseUnicodeExtensionType(
+ JSLinearString* unicodeType) {
+ MOZ_ASSERT(unicodeType->length() > 0, "caller must exclude empty strings");
+
+ JS::AutoCheckCannotGC nogc;
+ LocaleChars unicodeTypeChars = StringChars(unicodeType, nogc);
+
+ LanguageTagParser ts(unicodeTypeChars, unicodeType->length());
+ Token tok = ts.nextToken();
+
+ while (ts.isUnicodeExtensionType(tok)) {
+ tok = ts.nextToken();
+ }
+
+ // Return true if the complete input was successfully parsed.
+ return tok.isNone();
+}
+
+bool ParseStandaloneLanguageTag(HandleLinearString str,
+ LanguageSubtag& result) {
+ JS::AutoCheckCannotGC nogc;
+ if (str->hasLatin1Chars()) {
+ if (!IsStructurallyValidLanguageTag<Latin1Char>(str->latin1Range(nogc))) {
+ return false;
+ }
+ result.set<Latin1Char>(str->latin1Range(nogc));
+ } else {
+ if (!IsStructurallyValidLanguageTag<char16_t>(str->twoByteRange(nogc))) {
+ return false;
+ }
+ result.set<char16_t>(str->twoByteRange(nogc));
+ }
+ return true;
+}
+
+bool ParseStandaloneScriptTag(HandleLinearString str, ScriptSubtag& result) {
+ JS::AutoCheckCannotGC nogc;
+ if (str->hasLatin1Chars()) {
+ if (!IsStructurallyValidScriptTag<Latin1Char>(str->latin1Range(nogc))) {
+ return false;
+ }
+ result.set<Latin1Char>(str->latin1Range(nogc));
+ } else {
+ if (!IsStructurallyValidScriptTag<char16_t>(str->twoByteRange(nogc))) {
+ return false;
+ }
+ result.set<char16_t>(str->twoByteRange(nogc));
+ }
+ return true;
+}
+
+bool ParseStandaloneRegionTag(HandleLinearString str, RegionSubtag& result) {
+ JS::AutoCheckCannotGC nogc;
+ if (str->hasLatin1Chars()) {
+ if (!IsStructurallyValidRegionTag<Latin1Char>(str->latin1Range(nogc))) {
+ return false;
+ }
+ result.set<Latin1Char>(str->latin1Range(nogc));
+ } else {
+ if (!IsStructurallyValidRegionTag<char16_t>(str->twoByteRange(nogc))) {
+ return false;
+ }
+ result.set<char16_t>(str->twoByteRange(nogc));
+ }
+ return true;
+}
+
+template <typename CharT>
+static bool IsAsciiLowercaseAlpha(mozilla::Span<const CharT> span) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ const CharT* ptr = span.data();
+ size_t length = span.size();
+ return std::all_of(ptr, ptr + length, mozilla::IsAsciiLowercaseAlpha<CharT>);
+}
+
+static bool IsAsciiLowercaseAlpha(JSLinearString* str) {
+ JS::AutoCheckCannotGC nogc;
+ if (str->hasLatin1Chars()) {
+ return IsAsciiLowercaseAlpha<Latin1Char>(str->latin1Range(nogc));
+ }
+ return IsAsciiLowercaseAlpha<char16_t>(str->twoByteRange(nogc));
+}
+
+template <typename CharT>
+static bool IsAsciiAlpha(mozilla::Span<const CharT> span) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ const CharT* ptr = span.data();
+ size_t length = span.size();
+ return std::all_of(ptr, ptr + length, mozilla::IsAsciiAlpha<CharT>);
+}
+
+static bool IsAsciiAlpha(JSLinearString* str) {
+ JS::AutoCheckCannotGC nogc;
+ if (str->hasLatin1Chars()) {
+ return IsAsciiAlpha<Latin1Char>(str->latin1Range(nogc));
+ }
+ return IsAsciiAlpha<char16_t>(str->twoByteRange(nogc));
+}
+
+JS::Result<JSString*> ParseStandaloneISO639LanguageTag(JSContext* cx,
+ HandleLinearString str) {
+ // ISO-639 language codes contain either two or three characters.
+ size_t length = str->length();
+ if (length != 2 && length != 3) {
+ return nullptr;
+ }
+
+ // We can directly the return the input below if it's in the correct case.
+ bool isLowerCase = IsAsciiLowercaseAlpha(str);
+ if (!isLowerCase) {
+ // Must be an ASCII alpha string.
+ if (!IsAsciiAlpha(str)) {
+ return nullptr;
+ }
+ }
+
+ LanguageSubtag languageTag;
+ if (str->hasLatin1Chars()) {
+ JS::AutoCheckCannotGC nogc;
+ languageTag.set<Latin1Char>(str->latin1Range(nogc));
+ } else {
+ JS::AutoCheckCannotGC nogc;
+ languageTag.set<char16_t>(str->twoByteRange(nogc));
+ }
+
+ if (!isLowerCase) {
+ // The language subtag is canonicalized to lower case.
+ languageTag.toLowerCase();
+ }
+
+ // Reject the input if the canonical tag contains more than just a single
+ // language subtag.
+ if (LanguageTag::complexLanguageMapping(languageTag)) {
+ return nullptr;
+ }
+
+ // Take care to replace deprecated subtags with their preferred values.
+ JSString* result;
+ if (LanguageTag::languageMapping(languageTag) || !isLowerCase) {
+ auto span = languageTag.span();
+ result = NewStringCopyN<CanGC>(cx, span.data(), span.size());
+ } else {
+ result = str;
+ }
+ if (!result) {
+ return cx->alreadyReportedOOM();
+ }
+ return result;
+}
+
+void js::intl::UnicodeExtensionKeyword::trace(JSTracer* trc) {
+ TraceRoot(trc, &type_, "UnicodeExtensionKeyword::type");
+}
+
+} // namespace intl
+} // namespace js
diff --git a/js/src/builtin/intl/LanguageTag.h b/js/src/builtin/intl/LanguageTag.h
new file mode 100644
index 0000000000..3c2ecb1553
--- /dev/null
+++ b/js/src/builtin/intl/LanguageTag.h
@@ -0,0 +1,770 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* Structured representation of Unicode locale IDs used with Intl functions. */
+
+#ifndef builtin_intl_LanguageTag_h
+#define builtin_intl_LanguageTag_h
+
+#include "mozilla/Assertions.h"
+#include "mozilla/Span.h"
+#include "mozilla/TextUtils.h"
+#include "mozilla/TypedEnumBits.h"
+#include "mozilla/Variant.h"
+
+#include <algorithm>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include <utility>
+
+#include "jsalloc.h"
+#include "js/Result.h"
+
+#include "js/GCAPI.h"
+#include "js/Utility.h"
+#include "js/Vector.h"
+
+struct JSContext;
+class JSLinearString;
+class JSString;
+class JSTracer;
+
+namespace js {
+
+namespace intl {
+
+/**
+ * Return true if |language| is a valid language subtag.
+ */
+template <typename CharT>
+bool IsStructurallyValidLanguageTag(mozilla::Span<const CharT> language);
+
+/**
+ * Return true if |script| is a valid script subtag.
+ */
+template <typename CharT>
+bool IsStructurallyValidScriptTag(mozilla::Span<const CharT> script);
+
+/**
+ * Return true if |region| is a valid region subtag.
+ */
+template <typename CharT>
+bool IsStructurallyValidRegionTag(mozilla::Span<const CharT> region);
+
+#ifdef DEBUG
+/**
+ * Return true if |variant| is a valid variant subtag.
+ */
+bool IsStructurallyValidVariantTag(mozilla::Span<const char> variant);
+
+/**
+ * Return true if |extension| is a valid Unicode extension subtag.
+ */
+bool IsStructurallyValidUnicodeExtensionTag(
+ mozilla::Span<const char> extension);
+
+/**
+ * Return true if |privateUse| is a valid private-use subtag.
+ */
+bool IsStructurallyValidPrivateUseTag(mozilla::Span<const char> privateUse);
+
+#endif
+
+template <typename CharT>
+char AsciiToLowerCase(CharT c) {
+ MOZ_ASSERT(mozilla::IsAscii(c));
+ return mozilla::IsAsciiUppercaseAlpha(c) ? (c + 0x20) : c;
+}
+
+template <typename CharT>
+char AsciiToUpperCase(CharT c) {
+ MOZ_ASSERT(mozilla::IsAscii(c));
+ return mozilla::IsAsciiLowercaseAlpha(c) ? (c - 0x20) : c;
+}
+
+template <typename CharT>
+void AsciiToLowerCase(CharT* chars, size_t length, char* dest) {
+ // Tell the analysis the |std::transform| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ char (&fn)(CharT) = AsciiToLowerCase;
+ std::transform(chars, chars + length, dest, fn);
+}
+
+template <typename CharT>
+void AsciiToUpperCase(CharT* chars, size_t length, char* dest) {
+ // Tell the analysis the |std::transform| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ char (&fn)(CharT) = AsciiToUpperCase;
+ std::transform(chars, chars + length, dest, fn);
+}
+
+template <typename CharT>
+void AsciiToTitleCase(CharT* chars, size_t length, char* dest) {
+ if (length > 0) {
+ AsciiToUpperCase(chars, 1, dest);
+ AsciiToLowerCase(chars + 1, length - 1, dest + 1);
+ }
+}
+
+// Constants for language subtag lengths.
+namespace LanguageTagLimits {
+
+// unicode_language_subtag = alpha{2,3} | alpha{5,8} ;
+static constexpr size_t LanguageLength = 8;
+
+// unicode_script_subtag = alpha{4} ;
+static constexpr size_t ScriptLength = 4;
+
+// unicode_region_subtag = (alpha{2} | digit{3}) ;
+static constexpr size_t RegionLength = 3;
+static constexpr size_t AlphaRegionLength = 2;
+static constexpr size_t DigitRegionLength = 3;
+
+// key = alphanum alpha ;
+static constexpr size_t UnicodeKeyLength = 2;
+
+// tkey = alpha digit ;
+static constexpr size_t TransformKeyLength = 2;
+
+} // namespace LanguageTagLimits
+
+// Fixed size language subtag which is stored inline in LanguageTag.
+template <size_t Length>
+class LanguageTagSubtag final {
+ uint8_t length_ = 0;
+ char chars_[Length] = {}; // zero initialize
+
+ public:
+ LanguageTagSubtag() = default;
+
+ LanguageTagSubtag(const LanguageTagSubtag&) = delete;
+ LanguageTagSubtag& operator=(const LanguageTagSubtag&) = delete;
+
+ size_t length() const { return length_; }
+ bool missing() const { return length_ == 0; }
+ bool present() const { return length_ > 0; }
+
+ mozilla::Span<const char> span() const { return {chars_, length_}; }
+
+ template <typename CharT>
+ void set(mozilla::Span<const CharT> str) {
+ MOZ_ASSERT(str.size() <= Length);
+ std::copy_n(str.data(), str.size(), chars_);
+ length_ = str.size();
+ }
+
+ // The toXYZCase() methods are using |Length| instead of |length()|, because
+ // current compilers (tested GCC and Clang) can't infer the maximum string
+ // length - even when using hints like |std::min| - and instead are emitting
+ // SIMD optimized code. Using a fixed sized length avoids emitting the SIMD
+ // code. (Emitting SIMD code doesn't make sense here, because the SIMD code
+ // only kicks in for long strings.) A fixed length will additionally ensure
+ // the compiler unrolls the loop in the case conversion code.
+
+ void toLowerCase() { AsciiToLowerCase(chars_, Length, chars_); }
+
+ void toUpperCase() { AsciiToUpperCase(chars_, Length, chars_); }
+
+ void toTitleCase() { AsciiToTitleCase(chars_, Length, chars_); }
+
+ template <size_t N>
+ bool equalTo(const char (&str)[N]) const {
+ static_assert(N - 1 <= Length,
+ "subtag literals must not exceed the maximum subtag length");
+
+ return length_ == N - 1 && memcmp(chars_, str, N - 1) == 0;
+ }
+};
+
+using LanguageSubtag = LanguageTagSubtag<LanguageTagLimits::LanguageLength>;
+using ScriptSubtag = LanguageTagSubtag<LanguageTagLimits::ScriptLength>;
+using RegionSubtag = LanguageTagSubtag<LanguageTagLimits::RegionLength>;
+
+/**
+ * Object representing a language tag.
+ *
+ * All subtags are already in canonicalized case.
+ */
+class MOZ_STACK_CLASS LanguageTag final {
+ LanguageSubtag language_ = {};
+ ScriptSubtag script_ = {};
+ RegionSubtag region_ = {};
+
+ using VariantsVector = Vector<JS::UniqueChars, 2>;
+ using ExtensionsVector = Vector<JS::UniqueChars, 2>;
+
+ VariantsVector variants_;
+ ExtensionsVector extensions_;
+ JS::UniqueChars privateuse_ = nullptr;
+
+ friend class LanguageTagParser;
+
+ bool canonicalizeUnicodeExtension(JSContext* cx,
+ JS::UniqueChars& unicodeExtension);
+
+ bool canonicalizeTransformExtension(JSContext* cx,
+ JS::UniqueChars& transformExtension);
+
+ public:
+ static bool languageMapping(LanguageSubtag& language);
+ static bool complexLanguageMapping(const LanguageSubtag& language);
+
+ private:
+ static bool regionMapping(RegionSubtag& region);
+ static bool complexRegionMapping(const RegionSubtag& region);
+
+ void performComplexLanguageMappings();
+ void performComplexRegionMappings();
+ MOZ_MUST_USE bool performVariantMappings(JSContext* cx);
+
+ MOZ_MUST_USE bool updateGrandfatheredMappings(JSContext* cx);
+
+ static const char* replaceTransformExtensionType(
+ mozilla::Span<const char> key, mozilla::Span<const char> type);
+
+ public:
+ /**
+ * Given a Unicode key and type, return the null-terminated preferred
+ * replacement for that type if there is one, or null if there is none, e.g.
+ * in effect
+ * |replaceUnicodeExtensionType("ca", "islamicc") == "islamic-civil"|
+ * and
+ * |replaceUnicodeExtensionType("ca", "islamic-civil") == nullptr|.
+ */
+ static const char* replaceUnicodeExtensionType(
+ mozilla::Span<const char> key, mozilla::Span<const char> type);
+
+ public:
+ explicit LanguageTag(JSContext* cx) : variants_(cx), extensions_(cx) {}
+
+ LanguageTag(const LanguageTag&) = delete;
+ LanguageTag& operator=(const LanguageTag&) = delete;
+
+ const LanguageSubtag& language() const { return language_; }
+ const ScriptSubtag& script() const { return script_; }
+ const RegionSubtag& region() const { return region_; }
+ const auto& variants() const { return variants_; }
+ const auto& extensions() const { return extensions_; }
+ const char* privateuse() const { return privateuse_.get(); }
+
+ /**
+ * Return the Unicode extension subtag or nullptr if not present.
+ */
+ const char* unicodeExtension() const;
+
+ private:
+ ptrdiff_t unicodeExtensionIndex() const;
+
+ public:
+ /**
+ * Set the language subtag. The input must be a valid language subtag.
+ */
+ template <size_t N>
+ void setLanguage(const char (&language)[N]) {
+ mozilla::Span<const char> span(language, N - 1);
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(span));
+ language_.set(span);
+ }
+
+ /**
+ * Set the language subtag. The input must be a valid language subtag.
+ */
+ void setLanguage(const LanguageSubtag& language) {
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(language.span()));
+ language_.set(language.span());
+ }
+
+ /**
+ * Set the script subtag. The input must be a valid script subtag.
+ */
+ template <size_t N>
+ void setScript(const char (&script)[N]) {
+ mozilla::Span<const char> span(script, N - 1);
+ MOZ_ASSERT(IsStructurallyValidScriptTag(span));
+ script_.set(span);
+ }
+
+ /**
+ * Set the script subtag. The input must be a valid script subtag or the empty
+ * string.
+ */
+ void setScript(const ScriptSubtag& script) {
+ MOZ_ASSERT(script.missing() || IsStructurallyValidScriptTag(script.span()));
+ script_.set(script.span());
+ }
+
+ /**
+ * Set the region subtag. The input must be a valid region subtag.
+ */
+ template <size_t N>
+ void setRegion(const char (&region)[N]) {
+ mozilla::Span<const char> span(region, N - 1);
+ MOZ_ASSERT(IsStructurallyValidRegionTag(span));
+ region_.set(span);
+ }
+
+ /**
+ * Set the region subtag. The input must be a valid region subtag or the empty
+ * empty string.
+ */
+ void setRegion(const RegionSubtag& region) {
+ MOZ_ASSERT(region.missing() || IsStructurallyValidRegionTag(region.span()));
+ region_.set(region.span());
+ }
+
+ /**
+ * Removes all variant subtags.
+ */
+ void clearVariants() { variants_.clearAndFree(); }
+
+ /**
+ * Set the Unicode extension subtag. The input must be a valid Unicode
+ * extension subtag.
+ */
+ bool setUnicodeExtension(JS::UniqueChars extension);
+
+ /**
+ * Remove any Unicode extension subtag if present.
+ */
+ void clearUnicodeExtension();
+
+ /**
+ * Set the private-use subtag. The input must be a valid private-use subtag
+ * or nullptr.
+ */
+ void setPrivateuse(JS::UniqueChars privateuse) {
+ MOZ_ASSERT(!privateuse ||
+ IsStructurallyValidPrivateUseTag(
+ {privateuse.get(), strlen(privateuse.get())}));
+ privateuse_ = std::move(privateuse);
+ }
+
+ private:
+ enum class DuplicateVariants { Reject, Accept };
+
+ bool canonicalizeBaseName(JSContext* cx, DuplicateVariants duplicateVariants);
+
+ public:
+ /**
+ * Canonicalize the base-name subtags, that means the language, script,
+ * region, and variant subtags.
+ */
+ bool canonicalizeBaseName(JSContext* cx) {
+ return canonicalizeBaseName(cx, DuplicateVariants::Reject);
+ }
+
+ /**
+ * Canonicalize all extension subtags.
+ */
+ bool canonicalizeExtensions(JSContext* cx);
+
+ /**
+ * Canonicalizes the given structurally valid Unicode BCP 47 locale
+ * identifier, including regularized case of subtags. For example, the
+ * language tag Zh-haNS-bu-variant2-Variant1-u-ca-chinese-t-Zh-laTN-x-PRIVATE,
+ * where
+ *
+ * Zh ; 2*3ALPHA
+ * -haNS ; ["-" script]
+ * -bu ; ["-" region]
+ * -variant2 ; *("-" variant)
+ * -Variant1
+ * -u-ca-chinese ; *("-" extension)
+ * -t-Zh-laTN
+ * -x-PRIVATE ; ["-" privateuse]
+ *
+ * becomes zh-Hans-MM-variant1-variant2-t-zh-latn-u-ca-chinese-x-private
+ *
+ * Spec: ECMAScript Internationalization API Specification, 6.2.3.
+ */
+ bool canonicalize(JSContext* cx) {
+ return canonicalizeBaseName(cx) && canonicalizeExtensions(cx);
+ }
+
+ /**
+ * Return the string representation of this language tag.
+ */
+ JSString* toString(JSContext* cx) const;
+
+ /**
+ * Return the string representation of this language tag as a null-terminated
+ * C-string.
+ */
+ JS::UniqueChars toStringZ(JSContext* cx) const;
+
+ /**
+ * Add likely-subtags to the language tag.
+ *
+ * Spec: <https://www.unicode.org/reports/tr35/#Likely_Subtags>
+ */
+ bool addLikelySubtags(JSContext* cx);
+
+ /**
+ * Remove likely-subtags from the language tag.
+ *
+ * Spec: <https://www.unicode.org/reports/tr35/#Likely_Subtags>
+ */
+ bool removeLikelySubtags(JSContext* cx);
+};
+
+/**
+ * Parser for Unicode BCP 47 locale identifiers.
+ *
+ * <https://unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers>
+ */
+class MOZ_STACK_CLASS LanguageTagParser final {
+ public:
+ // Exposed as |public| for |MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS|.
+ enum class TokenKind : uint8_t {
+ None = 0b000,
+ Alpha = 0b001,
+ Digit = 0b010,
+ AlphaDigit = 0b011,
+ Error = 0b100
+ };
+
+ private:
+ class Token final {
+ size_t index_;
+ size_t length_;
+ TokenKind kind_;
+
+ public:
+ Token(TokenKind kind, size_t index, size_t length)
+ : index_(index), length_(length), kind_(kind) {}
+
+ TokenKind kind() const { return kind_; }
+ size_t index() const { return index_; }
+ size_t length() const { return length_; }
+
+ bool isError() const { return kind_ == TokenKind::Error; }
+ bool isNone() const { return kind_ == TokenKind::None; }
+ bool isAlpha() const { return kind_ == TokenKind::Alpha; }
+ bool isDigit() const { return kind_ == TokenKind::Digit; }
+ bool isAlphaDigit() const { return kind_ == TokenKind::AlphaDigit; }
+ };
+
+ using LocaleChars = mozilla::Variant<const JS::Latin1Char*, const char16_t*>;
+
+ const LocaleChars& locale_;
+ size_t length_;
+ size_t index_ = 0;
+
+ LanguageTagParser(const LocaleChars& locale, size_t length)
+ : locale_(locale), length_(length) {}
+
+ char16_t charAtUnchecked(size_t index) const {
+ if (locale_.is<const JS::Latin1Char*>()) {
+ return locale_.as<const JS::Latin1Char*>()[index];
+ }
+ return locale_.as<const char16_t*>()[index];
+ }
+
+ char charAt(size_t index) const {
+ char16_t c = charAtUnchecked(index);
+ MOZ_ASSERT(mozilla::IsAscii(c));
+ return c;
+ }
+
+ // Copy the token characters into |subtag|.
+ template <size_t N>
+ void copyChars(const Token& tok, LanguageTagSubtag<N>& subtag) const {
+ size_t index = tok.index();
+ size_t length = tok.length();
+ if (locale_.is<const JS::Latin1Char*>()) {
+ using T = const JS::Latin1Char;
+ subtag.set(mozilla::MakeSpan(locale_.as<T*>() + index, length));
+ } else {
+ using T = const char16_t;
+ subtag.set(mozilla::MakeSpan(locale_.as<T*>() + index, length));
+ }
+ }
+
+ // Create a string copy of |length| characters starting at |index|.
+ JS::UniqueChars chars(JSContext* cx, size_t index, size_t length) const;
+
+ // Create a string copy of the token characters.
+ JS::UniqueChars chars(JSContext* cx, const Token& tok) const {
+ return chars(cx, tok.index(), tok.length());
+ }
+
+ JS::UniqueChars extension(JSContext* cx, const Token& start,
+ const Token& end) const {
+ MOZ_ASSERT(start.index() < end.index());
+
+ size_t length = end.index() - 1 - start.index();
+ return chars(cx, start.index(), length);
+ }
+
+ Token nextToken();
+
+ // unicode_language_subtag = alpha{2,3} | alpha{5,8} ;
+ //
+ // Four character language subtags are not allowed in Unicode BCP 47 locale
+ // identifiers. Also see the comparison to Unicode CLDR locale identifiers in
+ // <https://unicode.org/reports/tr35/#BCP_47_Conformance>.
+ bool isLanguage(const Token& tok) const {
+ return tok.isAlpha() && ((2 <= tok.length() && tok.length() <= 3) ||
+ (5 <= tok.length() && tok.length() <= 8));
+ }
+
+ // unicode_script_subtag = alpha{4} ;
+ bool isScript(const Token& tok) const {
+ return tok.isAlpha() && tok.length() == 4;
+ }
+
+ // unicode_region_subtag = (alpha{2} | digit{3}) ;
+ bool isRegion(const Token& tok) const {
+ return (tok.isAlpha() && tok.length() == 2) ||
+ (tok.isDigit() && tok.length() == 3);
+ }
+
+ // unicode_variant_subtag = (alphanum{5,8} | digit alphanum{3}) ;
+ bool isVariant(const Token& tok) const {
+ return (5 <= tok.length() && tok.length() <= 8) ||
+ (tok.length() == 4 && mozilla::IsAsciiDigit(charAt(tok.index())));
+ }
+
+ // Returns the code unit of the first character at the given singleton token.
+ // Always returns the lower case form of an alphabetical character.
+ char singletonKey(const Token& tok) const {
+ MOZ_ASSERT(tok.length() == 1);
+ return AsciiToLowerCase(charAt(tok.index()));
+ }
+
+ // extensions = unicode_locale_extensions |
+ // transformed_extensions |
+ // other_extensions ;
+ //
+ // unicode_locale_extensions = sep [uU] ((sep keyword)+ |
+ // (sep attribute)+ (sep keyword)*) ;
+ //
+ // transformed_extensions = sep [tT] ((sep tlang (sep tfield)*) |
+ // (sep tfield)+) ;
+ //
+ // other_extensions = sep [alphanum-[tTuUxX]] (sep alphanum{2,8})+ ;
+ bool isExtensionStart(const Token& tok) const {
+ return tok.length() == 1 && singletonKey(tok) != 'x';
+ }
+
+ // other_extensions = sep [alphanum-[tTuUxX]] (sep alphanum{2,8})+ ;
+ bool isOtherExtensionPart(const Token& tok) const {
+ return 2 <= tok.length() && tok.length() <= 8;
+ }
+
+ // unicode_locale_extensions = sep [uU] ((sep keyword)+ |
+ // (sep attribute)+ (sep keyword)*) ;
+ // keyword = key (sep type)? ;
+ bool isUnicodeExtensionPart(const Token& tok) const {
+ return isUnicodeExtensionKey(tok) || isUnicodeExtensionType(tok) ||
+ isUnicodeExtensionAttribute(tok);
+ }
+
+ // attribute = alphanum{3,8} ;
+ bool isUnicodeExtensionAttribute(const Token& tok) const {
+ return 3 <= tok.length() && tok.length() <= 8;
+ }
+
+ // key = alphanum alpha ;
+ bool isUnicodeExtensionKey(const Token& tok) const {
+ return tok.length() == 2 && mozilla::IsAsciiAlpha(charAt(tok.index() + 1));
+ }
+
+ // type = alphanum{3,8} (sep alphanum{3,8})* ;
+ bool isUnicodeExtensionType(const Token& tok) const {
+ return 3 <= tok.length() && tok.length() <= 8;
+ }
+
+ // tkey = alpha digit ;
+ bool isTransformExtensionKey(const Token& tok) const {
+ return tok.length() == 2 && mozilla::IsAsciiAlpha(charAt(tok.index())) &&
+ mozilla::IsAsciiDigit(charAt(tok.index() + 1));
+ }
+
+ // tvalue = (sep alphanum{3,8})+ ;
+ bool isTransformExtensionPart(const Token& tok) const {
+ return 3 <= tok.length() && tok.length() <= 8;
+ }
+
+ // pu_extensions = sep [xX] (sep alphanum{1,8})+ ;
+ bool isPrivateUseStart(const Token& tok) const {
+ return tok.length() == 1 && singletonKey(tok) == 'x';
+ }
+
+ // pu_extensions = sep [xX] (sep alphanum{1,8})+ ;
+ bool isPrivateUsePart(const Token& tok) const {
+ return 1 <= tok.length() && tok.length() <= 8;
+ }
+
+ // Helper function for use in |parseBaseName| and
+ // |parseTlangInTransformExtension|. Do not use this directly!
+ static JS::Result<bool> internalParseBaseName(JSContext* cx,
+ LanguageTagParser& ts,
+ LanguageTag& tag, Token& tok);
+
+ // Parse the `unicode_language_id` production, i.e. the
+ // language/script/region/variants portion of a language tag, into |tag|.
+ // |tok| must be the current token.
+ static JS::Result<bool> parseBaseName(JSContext* cx, LanguageTagParser& ts,
+ LanguageTag& tag, Token& tok) {
+ return internalParseBaseName(cx, ts, tag, tok);
+ }
+
+ // Parse the `tlang` production within a parsed 't' transform extension.
+ // The precise requirements for "previously parsed" are:
+ //
+ // * the input begins from current token |tok| with a valid `tlang`
+ // * the `tlang` is wholly lowercase (*not* canonical case)
+ // * variant subtags in the `tlang` may contain duplicates and be
+ // unordered
+ //
+ // Return an error on internal failure. Otherwise, return a success value. If
+ // there was no `tlang`, then |tag.language().missing()|. But if there was a
+ // `tlang`, then |tag| is filled with subtags exactly as they appeared in the
+ // parse input.
+ static JS::Result<JS::Ok> parseTlangInTransformExtension(
+ JSContext* cx, LanguageTagParser& ts, LanguageTag& tag, Token& tok) {
+ MOZ_ASSERT(ts.isLanguage(tok));
+ return internalParseBaseName(cx, ts, tag, tok).map([](bool parsed) {
+ MOZ_ASSERT(parsed);
+ return JS::Ok();
+ });
+ }
+
+ friend class LanguageTag;
+
+ class Range final {
+ size_t begin_;
+ size_t length_;
+
+ public:
+ Range(size_t begin, size_t length) : begin_(begin), length_(length) {}
+
+ template <typename T>
+ T* begin(T* ptr) const {
+ return ptr + begin_;
+ }
+
+ size_t length() const { return length_; }
+ };
+
+ using TFieldVector = js::Vector<Range, 8>;
+ using AttributesVector = js::Vector<Range, 8>;
+ using KeywordsVector = js::Vector<Range, 8>;
+
+ // Parse |extension|, which must be a validated, fully lowercase
+ // `transformed_extensions` subtag, and fill |tag| and |fields| from the
+ // `tlang` and `tfield` components. Data in |tag| is lowercase, consistent
+ // with |extension|.
+ static JS::Result<bool> parseTransformExtension(
+ JSContext* cx, mozilla::Span<const char> extension, LanguageTag& tag,
+ TFieldVector& fields);
+
+ // Parse |extension|, which must be a validated, fully lowercase
+ // `unicode_locale_extensions` subtag, and fill |attributes| and |keywords|
+ // from the `attribute` and `keyword` components.
+ static JS::Result<bool> parseUnicodeExtension(
+ JSContext* cx, mozilla::Span<const char> extension,
+ AttributesVector& attributes, KeywordsVector& keywords);
+
+ static JS::Result<bool> tryParse(JSContext* cx, LocaleChars& localeChars,
+ size_t localeLength, LanguageTag& tag);
+
+ public:
+ // Parse the input string as a language tag. Reports an error to the context
+ // if the input can't be parsed completely.
+ static bool parse(JSContext* cx, JSLinearString* locale, LanguageTag& tag);
+
+ // Parse the input string as a language tag. Reports an error to the context
+ // if the input can't be parsed completely.
+ static bool parse(JSContext* cx, mozilla::Span<const char> locale,
+ LanguageTag& tag);
+
+ // Parse the input string as a language tag. Returns Ok(true) if the input
+ // could be completely parsed, Ok(false) if the input couldn't be parsed,
+ // or Err() in case of internal error.
+ static JS::Result<bool> tryParse(JSContext* cx, JSLinearString* locale,
+ LanguageTag& tag);
+
+ // Parse the input string as a language tag. Returns Ok(true) if the input
+ // could be completely parsed, Ok(false) if the input couldn't be parsed,
+ // or Err() in case of internal error.
+ static JS::Result<bool> tryParse(JSContext* cx,
+ mozilla::Span<const char> locale,
+ LanguageTag& tag);
+
+ // Parse the input string as the base-name parts (language, script, region,
+ // variants) of a language tag. Ignores any trailing characters.
+ static bool parseBaseName(JSContext* cx, mozilla::Span<const char> locale,
+ LanguageTag& tag);
+
+ // Return true iff |extension| can be parsed as a Unicode extension subtag.
+ static bool canParseUnicodeExtension(mozilla::Span<const char> extension);
+
+ // Return true iff |unicodeType| can be parsed as a Unicode extension type.
+ static bool canParseUnicodeExtensionType(JSLinearString* unicodeType);
+};
+
+MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(LanguageTagParser::TokenKind)
+
+/**
+ * Parse a string as a standalone |language| tag. If |str| is a standalone
+ * language tag, store it in |result| and return true. Otherwise return false.
+ */
+MOZ_MUST_USE bool ParseStandaloneLanguageTag(JS::Handle<JSLinearString*> str,
+ LanguageSubtag& result);
+
+/**
+ * Parse a string as a standalone |script| tag. If |str| is a standalone script
+ * tag, store it in |result| and return true. Otherwise return false.
+ */
+MOZ_MUST_USE bool ParseStandaloneScriptTag(JS::Handle<JSLinearString*> str,
+ ScriptSubtag& result);
+
+/**
+ * Parse a string as a standalone |region| tag. If |str| is a standalone region
+ * tag, store it in |result| and return true. Otherwise return false.
+ */
+MOZ_MUST_USE bool ParseStandaloneRegionTag(JS::Handle<JSLinearString*> str,
+ RegionSubtag& result);
+
+/**
+ * Parse a string as an ISO-639 language code. Return |nullptr| in the result if
+ * the input could not be parsed or the canonical form of the resulting language
+ * tag contains more than a single language subtag.
+ */
+JS::Result<JSString*> ParseStandaloneISO639LanguageTag(
+ JSContext* cx, JS::Handle<JSLinearString*> str);
+
+class UnicodeExtensionKeyword final {
+ char key_[LanguageTagLimits::UnicodeKeyLength];
+ JSLinearString* type_;
+
+ public:
+ using UnicodeKey = const char (&)[LanguageTagLimits::UnicodeKeyLength + 1];
+ using UnicodeKeySpan =
+ mozilla::Span<const char, LanguageTagLimits::UnicodeKeyLength>;
+
+ UnicodeExtensionKeyword(UnicodeKey key, JSLinearString* type)
+ : key_{key[0], key[1]}, type_(type) {}
+
+ UnicodeKeySpan key() const { return {key_, sizeof(key_)}; }
+ JSLinearString* type() const { return type_; }
+
+ void trace(JSTracer* trc);
+};
+
+extern MOZ_MUST_USE bool ApplyUnicodeExtensionToTag(
+ JSContext* cx, LanguageTag& tag,
+ JS::HandleVector<UnicodeExtensionKeyword> keywords);
+
+} // namespace intl
+
+} // namespace js
+
+#endif /* builtin_intl_LanguageTag_h */
diff --git a/js/src/builtin/intl/LanguageTagGenerated.cpp b/js/src/builtin/intl/LanguageTagGenerated.cpp
new file mode 100644
index 0000000000..bd99140ace
--- /dev/null
+++ b/js/src/builtin/intl/LanguageTagGenerated.cpp
@@ -0,0 +1,950 @@
+// Generated by make_intl_data.py. DO NOT EDIT.
+// Version: CLDR-35.1
+// URL: https://unicode.org/Public/cldr/35.1/core.zip
+
+#include "mozilla/Assertions.h"
+#include "mozilla/Span.h"
+#include "mozilla/TextUtils.h"
+
+#include <algorithm>
+#include <cstdint>
+#include <cstring>
+#include <iterator>
+#include <string>
+#include <type_traits>
+
+#include "jscntxt.h"
+#include "jsstr.h"
+
+#include "builtin/intl/LanguageTag.h"
+
+using namespace js::intl::LanguageTagLimits;
+
+template <size_t Length, size_t TagLength, size_t SubtagLength>
+static inline bool HasReplacement(
+ const char (&subtags)[Length][TagLength],
+ const js::intl::LanguageTagSubtag<SubtagLength>& subtag) {
+ MOZ_ASSERT(subtag.length() == TagLength - 1,
+ "subtag must have the same length as the list of subtags");
+
+ const char* ptr = subtag.span().data();
+ return std::binary_search(std::begin(subtags), std::end(subtags), ptr,
+ [](const char* a, const char* b) {
+ return memcmp(a, b, TagLength - 1) < 0;
+ });
+}
+
+template <size_t Length, size_t TagLength, size_t SubtagLength>
+static inline const char* SearchReplacement(
+ const char (&subtags)[Length][TagLength],
+ const char* (&aliases)[Length],
+ const js::intl::LanguageTagSubtag<SubtagLength>& subtag) {
+ MOZ_ASSERT(subtag.length() == TagLength - 1,
+ "subtag must have the same length as the list of subtags");
+
+ const char* ptr = subtag.span().data();
+ auto p = std::lower_bound(std::begin(subtags), std::end(subtags), ptr,
+ [](const char* a, const char* b) {
+ return memcmp(a, b, TagLength - 1) < 0;
+ });
+ if (p != std::end(subtags) && memcmp(*p, ptr, TagLength - 1) == 0) {
+ return aliases[std::distance(std::begin(subtags), p)];
+ }
+ return nullptr;
+}
+
+#ifdef DEBUG
+static bool IsAsciiLowercaseAlphanumeric(char c) {
+ return mozilla::IsAsciiLowercaseAlpha(c) || mozilla::IsAsciiDigit(c);
+}
+
+static bool IsAsciiLowercaseAlphanumericOrDash(char c) {
+ return IsAsciiLowercaseAlphanumeric(c) || c == '-';
+}
+
+static bool IsCanonicallyCasedLanguageTag(mozilla::Span<const char> span) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ return std::all_of(span.begin(), span.end(), mozilla::IsAsciiLowercaseAlpha<char>);
+}
+
+static bool IsCanonicallyCasedRegionTag(mozilla::Span<const char> span) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ return std::all_of(span.begin(), span.end(), mozilla::IsAsciiUppercaseAlpha<char>) ||
+ std::all_of(span.begin(), span.end(), mozilla::IsAsciiDigit<char>);
+}
+
+static bool IsCanonicallyCasedVariantTag(mozilla::Span<const char> span) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ return std::all_of(span.begin(), span.end(), IsAsciiLowercaseAlphanumeric);
+}
+
+static bool IsCanonicallyCasedUnicodeKey(mozilla::Span<const char> key) {
+ return std::all_of(key.begin(), key.end(), IsAsciiLowercaseAlphanumeric);
+}
+
+static bool IsCanonicallyCasedUnicodeType(mozilla::Span<const char> type) {
+ return std::all_of(type.begin(), type.end(), IsAsciiLowercaseAlphanumericOrDash);
+}
+
+static bool IsCanonicallyCasedTransformKey(mozilla::Span<const char> key) {
+ return std::all_of(key.begin(), key.end(), IsAsciiLowercaseAlphanumeric);
+}
+
+static bool IsCanonicallyCasedTransformType(mozilla::Span<const char> type) {
+ return std::all_of(type.begin(), type.end(), IsAsciiLowercaseAlphanumericOrDash);
+}
+#endif
+
+// Mappings from language subtags to preferred values.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+bool js::intl::LanguageTag::languageMapping(LanguageSubtag& language) {
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(language.span()));
+ MOZ_ASSERT(IsCanonicallyCasedLanguageTag(language.span()));
+
+ if (language.length() == 2) {
+ static const char languages[9][3] = {
+ "bh", "in", "iw", "ji", "jw", "mo", "no", "tl", "tw",
+ };
+ static const char* aliases[9] = {
+ "bho", "id", "he", "yi", "jv", "ro", "nb", "fil", "ak",
+ };
+
+ if (const char* replacement = SearchReplacement(languages, aliases, language)) {
+ language.set(mozilla::MakeCStringSpan(replacement));
+ return true;
+ }
+ return false;
+ }
+
+ if (language.length() == 3) {
+ static const char languages[340][4] = {
+ "aam", "aar", "abk", "adp", "afr", "aju", "aka", "alb", "als", "amh",
+ "ara", "arb", "arg", "arm", "asm", "aue", "ava", "ave", "aym", "ayr",
+ "ayx", "aze", "azj", "bak", "bam", "baq", "bcc", "bcl", "bel", "ben",
+ "bgm", "bih", "bis", "bjd", "bod", "bos", "bre", "bul", "bur", "bxk",
+ "bxr", "cat", "ccq", "ces", "cha", "che", "chi", "chu", "chv", "cjr",
+ "cka", "cld", "cmk", "cmn", "cor", "cos", "coy", "cqu", "cre", "cwd",
+ "cym", "cze", "dan", "deu", "dgo", "dhd", "dik", "diq", "div", "drh",
+ "dut", "dzo", "ekk", "ell", "emk", "eng", "epo", "esk", "est", "eus",
+ "ewe", "fao", "fas", "fat", "fij", "fin", "fra", "fre", "fry", "fuc",
+ "ful", "gav", "gaz", "gbo", "geo", "ger", "gfx", "ggn", "gla", "gle",
+ "glg", "glv", "gno", "gre", "grn", "gti", "gug", "guj", "guv", "gya",
+ "hat", "hau", "hdn", "hea", "heb", "her", "him", "hin", "hmo", "hrr",
+ "hrv", "hun", "hye", "ibi", "ibo", "ice", "ido", "iii", "ike", "iku",
+ "ile", "ilw", "ina", "ind", "ipk", "isl", "ita", "jav", "jeg", "jpn",
+ "kal", "kan", "kas", "kat", "kau", "kaz", "kgc", "kgh", "khk", "khm",
+ "kik", "kin", "kir", "kmr", "knc", "kng", "knn", "koj", "kom", "kon",
+ "kor", "kpv", "krm", "ktr", "kua", "kur", "kvs", "kwq", "kxe", "kzj",
+ "kzt", "lao", "lat", "lav", "lbk", "lii", "lim", "lin", "lit", "lmm",
+ "ltz", "lub", "lug", "lvs", "mac", "mah", "mal", "mao", "mar", "may",
+ "meg", "mhr", "mkd", "mlg", "mlt", "mnk", "mol", "mon", "mri", "msa",
+ "mst", "mup", "mwj", "mya", "myt", "nad", "nau", "nav", "nbl", "ncp",
+ "nde", "ndo", "nep", "nld", "nno", "nnx", "nob", "nor", "npi", "nts",
+ "nya", "oci", "ojg", "oji", "ori", "orm", "ory", "oss", "oun", "pan",
+ "pbu", "pcr", "per", "pes", "pli", "plt", "pmc", "pmu", "pnb", "pol",
+ "por", "ppa", "ppr", "pry", "pus", "puz", "que", "quz", "rmy", "roh",
+ "ron", "rum", "run", "rus", "sag", "san", "sca", "scc", "scr", "sin",
+ "skk", "slk", "slo", "slv", "sme", "smo", "sna", "snd", "som", "sot",
+ "spa", "spy", "sqi", "src", "srd", "srp", "ssw", "sun", "swa", "swe",
+ "swh", "tah", "tam", "tat", "tdu", "tel", "tgk", "tgl", "tha", "thc",
+ "thx", "tib", "tie", "tir", "tkk", "tlw", "tmp", "tne", "ton", "tsf",
+ "tsn", "tso", "ttq", "tuk", "tur", "twi", "uig", "ukr", "umu", "uok",
+ "urd", "uzb", "uzn", "ven", "vie", "vol", "wel", "wln", "wol", "xba",
+ "xho", "xia", "xkh", "xpe", "xsj", "xsl", "ybd", "ydd", "yid", "yma",
+ "ymt", "yor", "yos", "yuu", "zai", "zha", "zho", "zsm", "zul", "zyb",
+ };
+ static const char* aliases[340] = {
+ "aas", "aa", "ab", "dz", "af", "jrb", "ak", "sq", "sq", "am",
+ "ar", "ar", "an", "hy", "as", "ktz", "av", "ae", "ay", "ay",
+ "nun", "az", "az", "ba", "bm", "eu", "bal", "bik", "be", "bn",
+ "bcg", "bho", "bi", "drl", "bo", "bs", "br", "bg", "my", "luy",
+ "bua", "ca", "rki", "cs", "ch", "ce", "zh", "cu", "cv", "mom",
+ "cmr", "syr", "xch", "zh", "kw", "co", "pij", "quh", "cr", "cr",
+ "cy", "cs", "da", "de", "doi", "mwr", "din", "zza", "dv", "mn",
+ "nl", "dz", "et", "el", "man", "en", "eo", "ik", "et", "eu",
+ "ee", "fo", "fa", "ak", "fj", "fi", "fr", "fr", "fy", "ff",
+ "ff", "dev", "om", "grb", "ka", "de", "vaj", "gvr", "gd", "ga",
+ "gl", "gv", "gon", "el", "gn", "nyc", "gn", "gu", "duz", "gba",
+ "ht", "ha", "hai", "hmn", "he", "hz", "srx", "hi", "ho", "jal",
+ "hr", "hu", "hy", "opa", "ig", "is", "io", "ii", "iu", "iu",
+ "ie", "gal", "ia", "id", "ik", "is", "it", "jv", "oyb", "ja",
+ "kl", "kn", "ks", "ka", "kr", "kk", "tdf", "kml", "mn", "km",
+ "ki", "rw", "ky", "ku", "kr", "kg", "kok", "kwv", "kv", "kg",
+ "ko", "kv", "bmf", "dtp", "kj", "ku", "gdj", "yam", "tvd", "dtp",
+ "dtp", "lo", "la", "lv", "bnc", "raq", "li", "ln", "lt", "rmx",
+ "lb", "lu", "lg", "lv", "mk", "mh", "ml", "mi", "mr", "ms",
+ "cir", "chm", "mk", "mg", "mt", "man", "ro", "mn", "mi", "ms",
+ "mry", "raj", "vaj", "my", "mry", "xny", "na", "nv", "nr", "kdz",
+ "nd", "ng", "ne", "nl", "nn", "ngv", "nb", "nb", "ne", "pij",
+ "ny", "oc", "oj", "oj", "or", "om", "or", "os", "vaj", "pa",
+ "ps", "adx", "fa", "fa", "pi", "mg", "huw", "phr", "lah", "pl",
+ "pt", "bfy", "lcq", "prt", "ps", "pub", "qu", "qu", "rom", "rm",
+ "ro", "ro", "rn", "ru", "sg", "sa", "hle", "sr", "hr", "si",
+ "oyb", "sk", "sk", "sl", "se", "sm", "sn", "sd", "so", "st",
+ "es", "kln", "sq", "sc", "sc", "sr", "ss", "su", "sw", "sv",
+ "sw", "ty", "ta", "tt", "dtp", "te", "tg", "fil", "th", "tpo",
+ "oyb", "bo", "ras", "ti", "twm", "weo", "tyj", "kak", "to", "taj",
+ "tn", "ts", "tmh", "tk", "tr", "ak", "ug", "uk", "del", "ema",
+ "ur", "uz", "uz", "ve", "vi", "vo", "cy", "wa", "wo", "cax",
+ "xh", "acn", "waw", "kpe", "suj", "den", "rki", "yi", "yi", "lrr",
+ "mtm", "yo", "zom", "yug", "zap", "za", "zh", "ms", "zu", "za",
+ };
+
+ if (const char* replacement = SearchReplacement(languages, aliases, language)) {
+ language.set(mozilla::MakeCStringSpan(replacement));
+ return true;
+ }
+ return false;
+ }
+
+ return false;
+}
+
+// Language subtags with complex mappings.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+bool js::intl::LanguageTag::complexLanguageMapping(const LanguageSubtag& language) {
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(language.span()));
+ MOZ_ASSERT(IsCanonicallyCasedLanguageTag(language.span()));
+
+ if (language.length() == 2) {
+ return language.equalTo("sh");
+ }
+
+ if (language.length() == 3) {
+ static const char languages[6][4] = {
+ "cnr", "drw", "hbs", "prs", "swc", "tnf",
+ };
+
+ return HasReplacement(languages, language);
+ }
+
+ return false;
+}
+
+// Mappings from region subtags to preferred values.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+bool js::intl::LanguageTag::regionMapping(RegionSubtag& region) {
+ MOZ_ASSERT(IsStructurallyValidRegionTag(region.span()));
+ MOZ_ASSERT(IsCanonicallyCasedRegionTag(region.span()));
+
+ if (region.length() == 2) {
+ static const char regions[23][3] = {
+ "BU", "CS", "CT", "DD", "DY", "FQ", "FX", "HV", "JT", "MI",
+ "NH", "NQ", "PU", "PZ", "QU", "RH", "TP", "UK", "VD", "WK",
+ "YD", "YU", "ZR",
+ };
+ static const char* aliases[23] = {
+ "MM", "RS", "KI", "DE", "BJ", "AQ", "FR", "BF", "UM", "UM",
+ "VU", "AQ", "UM", "PA", "EU", "ZW", "TL", "GB", "VN", "UM",
+ "YE", "RS", "CD",
+ };
+
+ if (const char* replacement = SearchReplacement(regions, aliases, region)) {
+ region.set(mozilla::MakeCStringSpan(replacement));
+ return true;
+ }
+ return false;
+ }
+
+ {
+ static const char regions[300][4] = {
+ "004", "008", "010", "012", "016", "020", "024", "028", "031", "032",
+ "036", "040", "044", "048", "050", "051", "052", "056", "060", "062",
+ "064", "068", "070", "072", "074", "076", "084", "086", "090", "092",
+ "096", "100", "104", "108", "112", "116", "120", "124", "132", "136",
+ "140", "144", "148", "152", "156", "158", "162", "166", "170", "174",
+ "175", "178", "180", "184", "188", "191", "192", "196", "203", "204",
+ "208", "212", "214", "218", "222", "226", "230", "231", "232", "233",
+ "234", "238", "239", "242", "246", "248", "249", "250", "254", "258",
+ "260", "262", "266", "268", "270", "275", "276", "278", "280", "288",
+ "292", "296", "300", "304", "308", "312", "316", "320", "324", "328",
+ "332", "334", "336", "340", "344", "348", "352", "356", "360", "364",
+ "368", "372", "376", "380", "384", "388", "392", "398", "400", "404",
+ "408", "410", "414", "417", "418", "422", "426", "428", "430", "434",
+ "438", "440", "442", "446", "450", "454", "458", "462", "466", "470",
+ "474", "478", "480", "484", "492", "496", "498", "499", "500", "504",
+ "508", "512", "516", "520", "524", "528", "531", "533", "534", "535",
+ "540", "548", "554", "558", "562", "566", "570", "574", "578", "580",
+ "581", "583", "584", "585", "586", "591", "598", "600", "604", "608",
+ "612", "616", "620", "624", "626", "630", "634", "638", "642", "643",
+ "646", "652", "654", "659", "660", "662", "663", "666", "670", "674",
+ "678", "682", "686", "688", "690", "694", "702", "703", "704", "705",
+ "706", "710", "716", "720", "724", "728", "729", "732", "736", "740",
+ "744", "748", "752", "756", "760", "762", "764", "768", "772", "776",
+ "780", "784", "788", "792", "795", "796", "798", "800", "804", "807",
+ "818", "826", "830", "831", "832", "833", "834", "840", "850", "854",
+ "858", "860", "862", "876", "882", "886", "887", "891", "894", "958",
+ "959", "960", "962", "963", "964", "965", "966", "967", "968", "969",
+ "970", "971", "972", "973", "974", "975", "976", "977", "978", "979",
+ "980", "981", "982", "983", "984", "985", "986", "987", "988", "989",
+ "990", "991", "992", "993", "994", "995", "996", "997", "998", "999",
+ };
+ static const char* aliases[300] = {
+ "AF", "AL", "AQ", "DZ", "AS", "AD", "AO", "AG", "AZ", "AR",
+ "AU", "AT", "BS", "BH", "BD", "AM", "BB", "BE", "BM", "034",
+ "BT", "BO", "BA", "BW", "BV", "BR", "BZ", "IO", "SB", "VG",
+ "BN", "BG", "MM", "BI", "BY", "KH", "CM", "CA", "CV", "KY",
+ "CF", "LK", "TD", "CL", "CN", "TW", "CX", "CC", "CO", "KM",
+ "YT", "CG", "CD", "CK", "CR", "HR", "CU", "CY", "CZ", "BJ",
+ "DK", "DM", "DO", "EC", "SV", "GQ", "ET", "ET", "ER", "EE",
+ "FO", "FK", "GS", "FJ", "FI", "AX", "FR", "FR", "GF", "PF",
+ "TF", "DJ", "GA", "GE", "GM", "PS", "DE", "DE", "DE", "GH",
+ "GI", "KI", "GR", "GL", "GD", "GP", "GU", "GT", "GN", "GY",
+ "HT", "HM", "VA", "HN", "HK", "HU", "IS", "IN", "ID", "IR",
+ "IQ", "IE", "IL", "IT", "CI", "JM", "JP", "KZ", "JO", "KE",
+ "KP", "KR", "KW", "KG", "LA", "LB", "LS", "LV", "LR", "LY",
+ "LI", "LT", "LU", "MO", "MG", "MW", "MY", "MV", "ML", "MT",
+ "MQ", "MR", "MU", "MX", "MC", "MN", "MD", "ME", "MS", "MA",
+ "MZ", "OM", "NA", "NR", "NP", "NL", "CW", "AW", "SX", "BQ",
+ "NC", "VU", "NZ", "NI", "NE", "NG", "NU", "NF", "NO", "MP",
+ "UM", "FM", "MH", "PW", "PK", "PA", "PG", "PY", "PE", "PH",
+ "PN", "PL", "PT", "GW", "TL", "PR", "QA", "RE", "RO", "RU",
+ "RW", "BL", "SH", "KN", "AI", "LC", "MF", "PM", "VC", "SM",
+ "ST", "SA", "SN", "RS", "SC", "SL", "SG", "SK", "VN", "SI",
+ "SO", "ZA", "ZW", "YE", "ES", "SS", "SD", "EH", "SD", "SR",
+ "SJ", "SZ", "SE", "CH", "SY", "TJ", "TH", "TG", "TK", "TO",
+ "TT", "AE", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "MK",
+ "EG", "GB", "JE", "GG", "JE", "IM", "TZ", "US", "VI", "BF",
+ "UY", "UZ", "VE", "WF", "WS", "YE", "YE", "RS", "ZM", "AA",
+ "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "EU", "QV", "QW",
+ "QX", "QY", "QZ", "XA", "XB", "XC", "XD", "XE", "XF", "XG",
+ "XH", "XI", "XJ", "XK", "XL", "XM", "XN", "XO", "XP", "XQ",
+ "XR", "XS", "XT", "XU", "XV", "XW", "XX", "XY", "XZ", "ZZ",
+ };
+
+ if (const char* replacement = SearchReplacement(regions, aliases, region)) {
+ region.set(mozilla::MakeCStringSpan(replacement));
+ return true;
+ }
+ return false;
+ }
+}
+
+// Region subtags with complex mappings.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+bool js::intl::LanguageTag::complexRegionMapping(const RegionSubtag& region) {
+ MOZ_ASSERT(IsStructurallyValidRegionTag(region.span()));
+ MOZ_ASSERT(IsCanonicallyCasedRegionTag(region.span()));
+
+ if (region.length() == 2) {
+ return region.equalTo("AN") ||
+ region.equalTo("NT") ||
+ region.equalTo("PC") ||
+ region.equalTo("SU");
+ }
+
+ {
+ static const char regions[8][4] = {
+ "172", "200", "530", "532", "536", "582", "810", "890",
+ };
+
+ return HasReplacement(regions, region);
+ }
+}
+
+// Language subtags with complex mappings.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+void js::intl::LanguageTag::performComplexLanguageMappings() {
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(language().span()));
+ MOZ_ASSERT(IsCanonicallyCasedLanguageTag(language().span()));
+
+ if (language().equalTo("cnr")) {
+ setLanguage("sr");
+ if (region().missing()) {
+ setRegion("ME");
+ }
+ }
+ else if (language().equalTo("drw") ||
+ language().equalTo("prs") ||
+ language().equalTo("tnf")) {
+ setLanguage("fa");
+ if (region().missing()) {
+ setRegion("AF");
+ }
+ }
+ else if (language().equalTo("hbs") ||
+ language().equalTo("sh")) {
+ setLanguage("sr");
+ if (script().missing()) {
+ setScript("Latn");
+ }
+ }
+ else if (language().equalTo("swc")) {
+ setLanguage("sw");
+ if (region().missing()) {
+ setRegion("CD");
+ }
+ }
+}
+
+// Region subtags with complex mappings.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+void js::intl::LanguageTag::performComplexRegionMappings() {
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(language().span()));
+ MOZ_ASSERT(IsCanonicallyCasedLanguageTag(language().span()));
+ MOZ_ASSERT(IsStructurallyValidRegionTag(region().span()));
+ MOZ_ASSERT(IsCanonicallyCasedRegionTag(region().span()));
+
+ if (region().equalTo("172")) {
+ if (language().equalTo("hy") ||
+ (language().equalTo("und") && script().equalTo("Armn"))) {
+ setRegion("AM");
+ }
+ else if (language().equalTo("az") ||
+ language().equalTo("tkr") ||
+ language().equalTo("tly") ||
+ language().equalTo("ttt")) {
+ setRegion("AZ");
+ }
+ else if (language().equalTo("be")) {
+ setRegion("BY");
+ }
+ else if (language().equalTo("ab") ||
+ language().equalTo("ka") ||
+ language().equalTo("os") ||
+ (language().equalTo("und") && script().equalTo("Geor")) ||
+ language().equalTo("xmf")) {
+ setRegion("GE");
+ }
+ else if (language().equalTo("ky")) {
+ setRegion("KG");
+ }
+ else if (language().equalTo("kk") ||
+ (language().equalTo("ug") && script().equalTo("Cyrl"))) {
+ setRegion("KZ");
+ }
+ else if (language().equalTo("gag")) {
+ setRegion("MD");
+ }
+ else if (language().equalTo("tg")) {
+ setRegion("TJ");
+ }
+ else if (language().equalTo("tk")) {
+ setRegion("TM");
+ }
+ else if (language().equalTo("crh") ||
+ language().equalTo("got") ||
+ language().equalTo("ji") ||
+ language().equalTo("rue") ||
+ language().equalTo("uk") ||
+ (language().equalTo("und") && script().equalTo("Goth"))) {
+ setRegion("UA");
+ }
+ else if (language().equalTo("kaa") ||
+ language().equalTo("sog") ||
+ (language().equalTo("und") && script().equalTo("Sogd")) ||
+ (language().equalTo("und") && script().equalTo("Sogo")) ||
+ language().equalTo("uz")) {
+ setRegion("UZ");
+ }
+ else {
+ setRegion("RU");
+ }
+ }
+ else if (region().equalTo("200")) {
+ if (language().equalTo("sk")) {
+ setRegion("SK");
+ }
+ else {
+ setRegion("CZ");
+ }
+ }
+ else if (region().equalTo("530") ||
+ region().equalTo("532") ||
+ region().equalTo("AN")) {
+ if (language().equalTo("vic")) {
+ setRegion("SX");
+ }
+ else {
+ setRegion("CW");
+ }
+ }
+ else if (region().equalTo("536") ||
+ region().equalTo("NT")) {
+ if (language().equalTo("akk") ||
+ language().equalTo("ckb") ||
+ (language().equalTo("ku") && script().equalTo("Arab")) ||
+ language().equalTo("mis") ||
+ language().equalTo("syr") ||
+ (language().equalTo("und") && script().equalTo("Syrc")) ||
+ (language().equalTo("und") && script().equalTo("Xsux")) ||
+ (language().equalTo("und") && script().equalTo("Hatr"))) {
+ setRegion("IQ");
+ }
+ else {
+ setRegion("SA");
+ }
+ }
+ else if (region().equalTo("582") ||
+ region().equalTo("PC")) {
+ if (language().equalTo("mh")) {
+ setRegion("MH");
+ }
+ else if (language().equalTo("pau")) {
+ setRegion("PW");
+ }
+ else {
+ setRegion("FM");
+ }
+ }
+ else if (region().equalTo("810") ||
+ region().equalTo("SU")) {
+ if (language().equalTo("hy") ||
+ (language().equalTo("und") && script().equalTo("Armn"))) {
+ setRegion("AM");
+ }
+ else if (language().equalTo("az") ||
+ language().equalTo("tkr") ||
+ language().equalTo("tly") ||
+ language().equalTo("ttt")) {
+ setRegion("AZ");
+ }
+ else if (language().equalTo("be")) {
+ setRegion("BY");
+ }
+ else if (language().equalTo("et") ||
+ language().equalTo("vro")) {
+ setRegion("EE");
+ }
+ else if (language().equalTo("ab") ||
+ language().equalTo("ka") ||
+ language().equalTo("os") ||
+ (language().equalTo("und") && script().equalTo("Geor")) ||
+ language().equalTo("xmf")) {
+ setRegion("GE");
+ }
+ else if (language().equalTo("ky")) {
+ setRegion("KG");
+ }
+ else if (language().equalTo("kk") ||
+ (language().equalTo("ug") && script().equalTo("Cyrl"))) {
+ setRegion("KZ");
+ }
+ else if (language().equalTo("lt") ||
+ language().equalTo("sgs")) {
+ setRegion("LT");
+ }
+ else if (language().equalTo("ltg") ||
+ language().equalTo("lv")) {
+ setRegion("LV");
+ }
+ else if (language().equalTo("gag")) {
+ setRegion("MD");
+ }
+ else if (language().equalTo("tg")) {
+ setRegion("TJ");
+ }
+ else if (language().equalTo("tk")) {
+ setRegion("TM");
+ }
+ else if (language().equalTo("crh") ||
+ language().equalTo("got") ||
+ language().equalTo("ji") ||
+ language().equalTo("rue") ||
+ language().equalTo("uk") ||
+ (language().equalTo("und") && script().equalTo("Goth"))) {
+ setRegion("UA");
+ }
+ else if (language().equalTo("kaa") ||
+ language().equalTo("sog") ||
+ (language().equalTo("und") && script().equalTo("Sogd")) ||
+ (language().equalTo("und") && script().equalTo("Sogo")) ||
+ language().equalTo("uz")) {
+ setRegion("UZ");
+ }
+ else {
+ setRegion("RU");
+ }
+ }
+ else if (region().equalTo("890")) {
+ if (language().equalTo("bs")) {
+ setRegion("BA");
+ }
+ else if (language().equalTo("hr")) {
+ setRegion("HR");
+ }
+ else if (language().equalTo("mk")) {
+ setRegion("MK");
+ }
+ else if (language().equalTo("sl")) {
+ setRegion("SI");
+ }
+ else {
+ setRegion("RS");
+ }
+ }
+}
+
+static const char* ToCharPointer(const char* str) {
+ return str;
+}
+
+static const char* ToCharPointer(const js::UniqueChars& str) {
+ return str.get();
+}
+
+template <typename T, typename U = T>
+static bool IsLessThan(const T& a, const U& b) {
+ return strcmp(ToCharPointer(a), ToCharPointer(b)) < 0;
+}
+
+// Mappings from variant subtags to preferred values.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+bool js::intl::LanguageTag::performVariantMappings(JSContext* cx) {
+ // The variant subtags need to be sorted for binary search.
+ MOZ_ASSERT(std::is_sorted(variants_.begin(), variants_.end(),
+ IsLessThan<decltype(variants_)::ElementType>));
+
+ auto insertVariantSortedIfNotPresent = [&](const char* variant) {
+ auto* p = std::lower_bound(variants_.begin(), variants_.end(), variant,
+ IsLessThan<decltype(variants_)::ElementType,
+ decltype(variant)>);
+
+ // Don't insert the replacement when already present.
+ if (p != variants_.end() && strcmp(p->get(), variant) == 0) {
+ return true;
+ }
+
+ // Insert the preferred variant in sort order.
+ auto preferred = DuplicateString(cx, variant);
+ if (!preferred) {
+ return false;
+ }
+ return !!variants_.insert(p, std::move(preferred));
+ };
+
+ for (size_t i = 0; i < variants_.length(); ) {
+ auto& variant = variants_[i];
+ MOZ_ASSERT(IsCanonicallyCasedVariantTag(mozilla::MakeCStringSpan(variant.get())));
+
+ if (strcmp(variant.get(), "aaland") == 0) {
+ variants_.erase(variants_.begin() + i);
+ setRegion("AX");
+ }
+ else if (strcmp(variant.get(), "arevela") == 0) {
+ variants_.erase(variants_.begin() + i);
+ setLanguage("hy");
+ }
+ else if (strcmp(variant.get(), "arevmda") == 0) {
+ variants_.erase(variants_.begin() + i);
+ setLanguage("hyw");
+ }
+ else if (strcmp(variant.get(), "heploc") == 0) {
+ variants_.erase(variants_.begin() + i);
+ if (!insertVariantSortedIfNotPresent("alalc97")) {
+ return false;
+ }
+ }
+ else if (strcmp(variant.get(), "polytoni") == 0) {
+ variants_.erase(variants_.begin() + i);
+ if (!insertVariantSortedIfNotPresent("polyton")) {
+ return false;
+ }
+ }
+ else {
+ i++;
+ }
+ }
+ return true;
+}
+
+// Canonicalize grandfathered locale identifiers.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+bool js::intl::LanguageTag::updateGrandfatheredMappings(JSContext* cx) {
+ // We're mapping regular grandfathered tags to non-grandfathered form here.
+ // Other tags remain unchanged.
+ //
+ // regular = "art-lojban"
+ // / "cel-gaulish"
+ // / "no-bok"
+ // / "no-nyn"
+ // / "zh-guoyu"
+ // / "zh-hakka"
+ // / "zh-min"
+ // / "zh-min-nan"
+ // / "zh-xiang"
+ //
+ // Therefore we can quickly exclude most tags by checking every
+ // |unicode_locale_id| subcomponent for characteristics not shared by any of
+ // the regular grandfathered (RG) tags:
+ //
+ // * Real-world |unicode_language_subtag|s are all two or three letters,
+ // so don't waste time running a useless |language.length > 3| fast-path.
+ // * No RG tag has a "script"-looking component.
+ // * No RG tag has a "region"-looking component.
+ // * The RG tags that match |unicode_locale_id| (art-lojban, cel-gaulish,
+ // zh-guoyu, zh-hakka, zh-xiang) have exactly one "variant". (no-bok,
+ // no-nyn, zh-min, and zh-min-nan require BCP47's extlang subtag
+ // that |unicode_locale_id| doesn't support.)
+ // * No RG tag contains |extensions| or |pu_extensions|.
+ if (script().present() ||
+ region().present() ||
+ variants().length() != 1 ||
+ extensions().length() != 0 ||
+ privateuse()) {
+ return true;
+ }
+
+ MOZ_ASSERT(IsCanonicallyCasedLanguageTag(language().span()));
+ MOZ_ASSERT(IsCanonicallyCasedVariantTag(mozilla::MakeCStringSpan(variants()[0].get())));
+
+ auto variantEqualTo = [this](const char* variant) {
+ return strcmp(variants()[0].get(), variant) == 0;
+ };
+
+ // art-lojban -> jbo
+ if (language().equalTo("art") && variantEqualTo("lojban")) {
+ setLanguage("jbo");
+ clearVariants();
+ return true;
+ }
+
+ // cel-gaulish -> xtg-x-cel-gaulish
+ else if (language().equalTo("cel") && variantEqualTo("gaulish")) {
+ setLanguage("xtg");
+ clearVariants();
+
+ auto privateuse = DuplicateString(cx, "x-cel-gaulish");
+ if (!privateuse) {
+ return false;
+ }
+ setPrivateuse(std::move(privateuse));
+ return true;
+ }
+
+ // zh-guoyu -> zh
+ else if (language().equalTo("zh") && variantEqualTo("guoyu")) {
+ setLanguage("zh");
+ clearVariants();
+ return true;
+ }
+
+ // zh-hakka -> hak
+ else if (language().equalTo("zh") && variantEqualTo("hakka")) {
+ setLanguage("hak");
+ clearVariants();
+ return true;
+ }
+
+ // zh-xiang -> hsn
+ else if (language().equalTo("zh") && variantEqualTo("xiang")) {
+ setLanguage("hsn");
+ clearVariants();
+ return true;
+ }
+
+ return true;
+}
+
+template <size_t Length>
+static inline bool IsUnicodeKey(
+ mozilla::Span<const char> key, const char (&str)[Length]) {
+ static_assert(Length == UnicodeKeyLength + 1,
+ "Unicode extension key is two characters long");
+ return memcmp(key.data(), str, Length - 1) == 0;
+}
+
+template <size_t Length>
+static inline bool IsUnicodeType(
+ mozilla::Span<const char> type, const char (&str)[Length]) {
+ static_assert(Length > UnicodeKeyLength + 1,
+ "Unicode extension type contains more than two characters");
+ return type.size() == (Length - 1) &&
+ memcmp(type.data(), str, Length - 1) == 0;
+}
+
+static int32_t CompareUnicodeType(const char* a, mozilla::Span<const char> b) {
+ MOZ_ASSERT(!std::char_traits<char>::find(b.data(), b.size(), '\0'),
+ "unexpected null-character in string");
+
+ using UnsignedChar = unsigned char;
+ for (size_t i = 0; i < b.size(); i++) {
+ // |a| is zero-terminated and |b| doesn't contain a null-terminator. So if
+ // we've reached the end of |a|, the below if-statement will always be true.
+ // That ensures we don't read past the end of |a|.
+ if (int32_t r = UnsignedChar(a[i]) - UnsignedChar(b[i])) {
+ return r;
+ }
+ }
+
+ // Return zero if both strings are equal or a negative number if |b| is a
+ // prefix of |a|.
+ return -int32_t(UnsignedChar(a[b.size()]));
+}
+
+template <size_t Length>
+static inline const char* SearchUnicodeReplacement(
+ const char* (&types)[Length], const char* (&aliases)[Length],
+ mozilla::Span<const char> type) {
+
+ auto p = std::lower_bound(std::begin(types), std::end(types), type,
+ [](const auto& a, const auto& b) {
+ return CompareUnicodeType(a, b) < 0;
+ });
+ if (p != std::end(types) && CompareUnicodeType(*p, type) == 0) {
+ return aliases[std::distance(std::begin(types), p)];
+ }
+ return nullptr;
+}
+
+/**
+ * Mapping from deprecated BCP 47 Unicode extension types to their preferred
+ * values.
+ *
+ * Spec: https://www.unicode.org/reports/tr35/#Unicode_Locale_Extension_Data_Files
+ * Spec: https://www.unicode.org/reports/tr35/#t_Extension
+ */
+const char* js::intl::LanguageTag::replaceUnicodeExtensionType(
+ mozilla::Span<const char> key, mozilla::Span<const char> type) {
+ MOZ_ASSERT(key.size() == UnicodeKeyLength);
+ MOZ_ASSERT(IsCanonicallyCasedUnicodeKey(key));
+
+ MOZ_ASSERT(type.size() > UnicodeKeyLength);
+ MOZ_ASSERT(IsCanonicallyCasedUnicodeType(type));
+
+ if (IsUnicodeKey(key, "ca")) {
+ if (IsUnicodeType(type, "ethiopic-amete-alem")) {
+ return "ethioaa";
+ }
+ if (IsUnicodeType(type, "islamicc")) {
+ return "islamic-civil";
+ }
+ }
+ else if (IsUnicodeKey(key, "kb") ||
+ IsUnicodeKey(key, "kc") ||
+ IsUnicodeKey(key, "kh") ||
+ IsUnicodeKey(key, "kk") ||
+ IsUnicodeKey(key, "kn")) {
+ if (IsUnicodeType(type, "yes")) {
+ return "true";
+ }
+ }
+ else if (IsUnicodeKey(key, "ks")) {
+ if (IsUnicodeType(type, "primary")) {
+ return "level1";
+ }
+ if (IsUnicodeType(type, "tertiary")) {
+ return "level3";
+ }
+ }
+ else if (IsUnicodeKey(key, "ms")) {
+ if (IsUnicodeType(type, "imperial")) {
+ return "uksystem";
+ }
+ }
+ else if (IsUnicodeKey(key, "rg") ||
+ IsUnicodeKey(key, "sd")) {
+ static const char* types[116] = {
+ "cn11", "cn12", "cn13", "cn14", "cn15", "cn21", "cn22", "cn23",
+ "cn31", "cn32", "cn33", "cn34", "cn35", "cn36", "cn37", "cn41",
+ "cn42", "cn43", "cn44", "cn45", "cn46", "cn50", "cn51", "cn52",
+ "cn53", "cn54", "cn61", "cn62", "cn63", "cn64", "cn65", "cz10a",
+ "cz10b", "cz10c", "cz10d", "cz10e", "cz10f", "cz611", "cz612", "cz613",
+ "cz614", "cz615", "cz621", "cz622", "cz623", "cz624", "cz626", "cz627",
+ "czjc", "czjm", "czka", "czkr", "czli", "czmo", "czol", "czpa",
+ "czpl", "czpr", "czst", "czus", "czvy", "czzl", "fra", "frb",
+ "frc", "frd", "fre", "frf", "frg", "frh", "fri", "frj",
+ "frk", "frl", "frm", "frn", "fro", "frp", "frq", "frr",
+ "frs", "frt", "fru", "frv", "laxn", "lud", "lug", "lul",
+ "mrnkc", "nzn", "nzs", "omba", "omsh", "plds", "plkp", "pllb",
+ "plld", "pllu", "plma", "plmz", "plop", "plpd", "plpk", "plpm",
+ "plsk", "plsl", "plwn", "plwp", "plzp", "tteto", "ttrcm", "ttwto",
+ "twkhq", "twtnq", "twtpq", "twtxq",
+ };
+ static const char* aliases[116] = {
+ "cnbj", "cntj", "cnhe", "cnsx", "cnmn", "cnln", "cnjl", "cnhl",
+ "cnsh", "cnjs", "cnzj", "cnah", "cnfj", "cnjx", "cnsd", "cnha",
+ "cnhb", "cnhn", "cngd", "cngx", "cnhi", "cncq", "cnsc", "cngz",
+ "cnyn", "cnxz", "cnsn", "cngs", "cnqh", "cnnx", "cnxj", "cz110",
+ "cz111", "cz112", "cz113", "cz114", "cz115", "cz663", "cz632", "cz633",
+ "cz634", "cz635", "cz641", "cz642", "cz643", "cz644", "cz646", "cz647",
+ "cz31", "cz64", "cz41", "cz52", "cz51", "cz80", "cz71", "cz53",
+ "cz32", "cz10", "cz20", "cz42", "cz63", "cz72", "frges", "frnaq",
+ "frara", "frbfc", "frbre", "frcvl", "frges", "frcor", "frbfc", "fridf",
+ "frocc", "frnaq", "frges", "frocc", "frhdf", "frnor", "frnor", "frpdl",
+ "frhdf", "frnaq", "frpac", "frara", "laxs", "lucl", "luec", "luca",
+ "mr13", "nzauk", "nzcan", "ombj", "omsj", "pl02", "pl04", "pl08",
+ "pl10", "pl06", "pl12", "pl14", "pl16", "pl20", "pl18", "pl22",
+ "pl26", "pl24", "pl28", "pl30", "pl32", "tttob", "ttmrc", "tttob",
+ "twkhh", "twtnn", "twnwt", "twtxg",
+ };
+ return SearchUnicodeReplacement(types, aliases, type);
+ }
+ else if (IsUnicodeKey(key, "tz")) {
+ static const char* types[28] = {
+ "aqams", "cnckg", "cnhrb", "cnkhg", "cuba", "egypt",
+ "eire", "est", "gmt0", "hongkong", "hst", "iceland",
+ "iran", "israel", "jamaica", "japan", "libya", "mst",
+ "navajo", "poland", "portugal", "prc", "roc", "rok",
+ "turkey", "uct", "usnavajo", "zulu",
+ };
+ static const char* aliases[28] = {
+ "nzakl", "cnsha", "cnsha", "cnurc", "cuhav", "egcai",
+ "iedub", "utcw05", "gmt", "hkhkg", "utcw10", "isrey",
+ "irthr", "jeruslm", "jmkin", "jptyo", "lytip", "utcw07",
+ "usden", "plwaw", "ptlis", "cnsha", "twtpe", "krsel",
+ "trist", "utc", "usden", "utc",
+ };
+ return SearchUnicodeReplacement(types, aliases, type);
+ }
+ return nullptr;
+}
+
+template <size_t Length>
+static inline bool IsTransformKey(
+ mozilla::Span<const char> key, const char (&str)[Length]) {
+ static_assert(Length == TransformKeyLength + 1,
+ "Transform extension key is two characters long");
+ return memcmp(key.data(), str, Length - 1) == 0;
+}
+
+template <size_t Length>
+static inline bool IsTransformType(
+ mozilla::Span<const char> type, const char (&str)[Length]) {
+ static_assert(Length > TransformKeyLength + 1,
+ "Transform extension type contains more than two characters");
+ return type.size() == (Length - 1) &&
+ memcmp(type.data(), str, Length - 1) == 0;
+}
+
+/**
+ * Mapping from deprecated BCP 47 Transform extension types to their preferred
+ * values.
+ *
+ * Spec: https://www.unicode.org/reports/tr35/#Unicode_Locale_Extension_Data_Files
+ * Spec: https://www.unicode.org/reports/tr35/#t_Extension
+ */
+const char* js::intl::LanguageTag::replaceTransformExtensionType(
+ mozilla::Span<const char> key, mozilla::Span<const char> type) {
+ MOZ_ASSERT(key.size() == TransformKeyLength);
+ MOZ_ASSERT(IsCanonicallyCasedTransformKey(key));
+
+ MOZ_ASSERT(type.size() > TransformKeyLength);
+ MOZ_ASSERT(IsCanonicallyCasedTransformType(type));
+
+ if (IsTransformKey(key, "d0")) {
+ if (IsTransformType(type, "name")) {
+ return "charname";
+ }
+ }
+ else if (IsTransformKey(key, "m0")) {
+ if (IsTransformType(type, "names")) {
+ return "prprname";
+ }
+ }
+ return nullptr;
+}
diff --git a/js/src/builtin/intl/Locale.cpp b/js/src/builtin/intl/Locale.cpp
new file mode 100644
index 0000000000..980ab37f66
--- /dev/null
+++ b/js/src/builtin/intl/Locale.cpp
@@ -0,0 +1,1430 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* Intl.Locale implementation. */
+
+#include "builtin/intl/Locale.h"
+
+#include "mozilla/ArrayUtils.h"
+#include "mozilla/Assertions.h"
+#include "mozilla/Casting.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/Span.h"
+#include "mozilla/TextUtils.h"
+
+#include <algorithm>
+#include <iterator>
+#include <string>
+#include <string.h>
+#include <utility>
+
+#include "jsapi.h"
+#include "jsfriendapi.h"
+#include "jscntxt.h"
+#include "jsobjinlines.h"
+#include "jswrapper.h"
+
+#include "builtin/intl/CommonFunctions.h"
+#include "builtin/intl/LanguageTag.h"
+#include "gc/Rooting.h"
+#include "js/Conversions.h"
+#include "js/TypeDecls.h"
+#include "vm/GlobalObject.h"
+#include "vm/String.h"
+#include "vm/StringBuffer.h"
+
+#include "vm/NativeObject-inl.h"
+
+using namespace js;
+using namespace js::intl::LanguageTagLimits;
+
+using intl::LanguageTag;
+using intl::LanguageTagParser;
+
+const Class LocaleObject::class_ = {
+ js_Object_str,
+ JSCLASS_HAS_RESERVED_SLOTS(LocaleObject::SLOT_COUNT),
+};
+
+static inline bool IsLocale(HandleValue v) {
+ return v.isObject() && v.toObject().is<LocaleObject>();
+}
+
+// Return the length of the base-name subtags.
+static size_t BaseNameLength(const LanguageTag& tag) {
+ size_t baseNameLength = tag.language().length();
+ if (tag.script().present()) {
+ baseNameLength += 1 + tag.script().length();
+ }
+ if (tag.region().present()) {
+ baseNameLength += 1 + tag.region().length();
+ }
+ for (const auto& variant : tag.variants()) {
+ baseNameLength += 1 + strlen(variant.get());
+ }
+ return baseNameLength;
+}
+
+struct IndexAndLength {
+ size_t index;
+ size_t length;
+
+ IndexAndLength(size_t index, size_t length) : index(index), length(length){};
+
+ template <typename T>
+ mozilla::Span<const T> spanOf(const T* ptr) const {
+ return {ptr + index, length};
+ }
+};
+
+// Compute the Unicode extension's index and length in the extension subtag.
+static mozilla::Maybe<IndexAndLength> UnicodeExtensionPosition(
+ const LanguageTag& tag) {
+ size_t index = 0;
+ for (const auto& extension : tag.extensions()) {
+ MOZ_ASSERT(!mozilla::IsAsciiUppercaseAlpha(extension[0]),
+ "extensions are case normalized to lowercase");
+
+ size_t extensionLength = strlen(extension.get());
+ if (extension[0] == 'u') {
+ return mozilla::Some(IndexAndLength{index, extensionLength});
+ }
+
+ // Add +1 to skip over the preceding separator.
+ index += 1 + extensionLength;
+ }
+ return mozilla::Nothing();
+}
+
+static LocaleObject* CreateLocaleObject(JSContext* cx, HandleObject prototype,
+ const LanguageTag& tag) {
+ RootedObject proto(cx, prototype);
+ if (!proto) {
+ proto = GlobalObject::getOrCreateLocalePrototype(cx, cx->global());
+ if (!proto) {
+ return nullptr;
+ }
+ }
+
+ RootedString tagStr(cx, tag.toString(cx));
+ if (!tagStr) {
+ return nullptr;
+ }
+
+ size_t baseNameLength = BaseNameLength(tag);
+
+ RootedString baseName(cx, NewDependentString(cx, tagStr, 0, baseNameLength));
+ if (!baseName) {
+ return nullptr;
+ }
+
+ RootedValue unicodeExtension(cx, UndefinedValue());
+ if (auto result = UnicodeExtensionPosition(tag)) {
+ JSString* str = NewDependentString(
+ cx, tagStr, baseNameLength + 1 + result->index, result->length);
+ if (!str) {
+ return nullptr;
+ }
+
+ unicodeExtension.setString(str);
+ }
+
+ auto* locale = NewObjectWithGivenProto<LocaleObject>(cx, proto);
+ if (!locale) {
+ return nullptr;
+ }
+
+ locale->setFixedSlot(LocaleObject::LANGUAGE_TAG_SLOT, StringValue(tagStr));
+ locale->setFixedSlot(LocaleObject::BASENAME_SLOT, StringValue(baseName));
+ locale->setFixedSlot(LocaleObject::UNICODE_EXTENSION_SLOT, unicodeExtension);
+
+ return locale;
+}
+
+static inline bool IsValidUnicodeExtensionValue(JSLinearString* linear) {
+ return linear->length() > 0 &&
+ LanguageTagParser::canParseUnicodeExtensionType(linear);
+}
+
+/** Iterate through (sep keyword) in a valid, lowercased Unicode extension. */
+template <typename CharT>
+class SepKeywordIterator {
+ const CharT* iter_;
+ const CharT* const end_;
+
+ public:
+ SepKeywordIterator(const CharT* unicodeExtensionBegin,
+ const CharT* unicodeExtensionEnd)
+ : iter_(unicodeExtensionBegin), end_(unicodeExtensionEnd) {}
+
+ /**
+ * Return (sep keyword) in the Unicode locale extension from begin to end.
+ * The first call after all (sep keyword) are consumed returns |nullptr|; no
+ * further calls are allowed.
+ */
+ const CharT* next() {
+ MOZ_ASSERT(iter_ != nullptr,
+ "can't call next() once it's returned nullptr");
+
+ constexpr size_t SepKeyLength = 1 + UnicodeKeyLength; // "-co"/"-nu"/etc.
+
+ MOZ_ASSERT(iter_ + SepKeyLength <= end_,
+ "overall Unicode locale extension or non-leading subtags must "
+ "be at least key-sized");
+
+ MOZ_ASSERT((iter_[0] == 'u' && iter_[1] == '-') || iter_[0] == '-');
+
+ while (true) {
+ // Skip past '-' so |std::char_traits::find| makes progress. Skipping
+ // 'u' is harmless -- skip or not, |find| returns the first '-'.
+ iter_++;
+
+ // Find the next separator.
+ iter_ = std::char_traits<CharT>::find(
+ iter_, mozilla::PointerRangeSize(iter_, end_), CharT('-'));
+ if (!iter_) {
+ return nullptr;
+ }
+
+ MOZ_ASSERT(iter_ + SepKeyLength <= end_,
+ "non-leading subtags in a Unicode locale extension are all "
+ "at least as long as a key");
+
+ if (iter_ + SepKeyLength == end_ || // key is terminal subtag
+ iter_[SepKeyLength] == '-') { // key is followed by more subtags
+ break;
+ }
+ }
+
+ MOZ_ASSERT(iter_[0] == '-');
+ MOZ_ASSERT(mozilla::IsAsciiLowercaseAlpha(iter_[1]) ||
+ mozilla::IsAsciiDigit(iter_[1]));
+ MOZ_ASSERT(mozilla::IsAsciiLowercaseAlpha(iter_[2]));
+ MOZ_ASSERT_IF(iter_ + SepKeyLength < end_, iter_[SepKeyLength] == '-');
+ return iter_;
+ }
+};
+
+/**
+ * 9.2.10 GetOption ( options, property, type, values, fallback )
+ *
+ * If the requested property is present and not-undefined, set the result string
+ * to |ToString(value)|. Otherwise set the result string to nullptr.
+ */
+static bool GetStringOption(JSContext* cx, HandleObject options,
+ HandlePropertyName name,
+ MutableHandle<JSLinearString*> string) {
+ // Step 1.
+ RootedValue option(cx);
+ if (!GetProperty(cx, options, options, name, &option)) {
+ return false;
+ }
+
+ // Step 2.
+ JSLinearString* linear = nullptr;
+ if (!option.isUndefined()) {
+ // Steps 2.a-b, 2.d (not applicable).
+
+ // Steps 2.c, 2.e.
+ JSString* str = ToString(cx, option);
+ if (!str) {
+ return false;
+ }
+ linear = str->ensureLinear(cx);
+ if (!linear) {
+ return false;
+ }
+ }
+
+ // Step 3.
+ string.set(linear);
+ return true;
+}
+
+/**
+ * 9.2.10 GetOption ( options, property, type, values, fallback )
+ *
+ * If the requested property is present and not-undefined, set the result string
+ * to |ToString(ToBoolean(value))|. Otherwise set the result string to nullptr.
+ */
+static bool GetBooleanOption(JSContext* cx, HandleObject options,
+ HandlePropertyName name,
+ MutableHandle<JSLinearString*> string) {
+ // Step 1.
+ RootedValue option(cx);
+ if (!GetProperty(cx, options, options, name, &option)) {
+ return false;
+ }
+
+ // Step 2.
+ JSLinearString* linear = nullptr;
+ if (!option.isUndefined()) {
+ // Steps 2.a, 2.c-d (not applicable).
+
+ // Steps 2.c, 2.e.
+ JSString* str = BooleanToString(cx, ToBoolean(option));
+ MOZ_ALWAYS_TRUE(linear = str->ensureLinear(cx));
+ }
+
+ // Step 3.
+ string.set(linear);
+ return true;
+}
+
+/**
+ * ApplyOptionsToTag ( tag, options )
+ */
+static bool ApplyOptionsToTag(JSContext* cx, LanguageTag& tag,
+ HandleObject options) {
+ // Steps 1-2 (Already performed in caller).
+
+ RootedLinearString option(cx);
+
+ // Step 3.
+ if (!GetStringOption(cx, options, cx->names().language, &option)) {
+ return false;
+ }
+
+ // Step 4.
+ intl::LanguageSubtag language;
+ if (option && !intl::ParseStandaloneLanguageTag(option, language)) {
+ if (UniqueChars str = StringToNewUTF8CharsZ(cx, *option)) {
+ JS_ReportErrorNumberUTF8(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE, "language",
+ str.get());
+ }
+ return false;
+ }
+
+ // Step 5.
+ if (!GetStringOption(cx, options, cx->names().script, &option)) {
+ return false;
+ }
+
+ // Step 6.
+ intl::ScriptSubtag script;
+ if (option && !intl::ParseStandaloneScriptTag(option, script)) {
+ if (UniqueChars str = StringToNewUTF8CharsZ(cx, *option)) {
+ JS_ReportErrorNumberUTF8(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE, "script", str.get());
+ }
+ return false;
+ }
+
+ // Step 7.
+ if (!GetStringOption(cx, options, cx->names().region, &option)) {
+ return false;
+ }
+
+ // Step 8.
+ intl::RegionSubtag region;
+ if (option && !intl::ParseStandaloneRegionTag(option, region)) {
+ if (UniqueChars str = StringToNewUTF8CharsZ(cx, *option)) {
+ JS_ReportErrorNumberUTF8(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE, "region", str.get());
+ }
+ return false;
+ }
+
+ // Step 9 (Already performed in caller).
+
+ // Skip steps 10-13 when no subtags were modified.
+ if (language.present() || script.present() || region.present()) {
+ // Step 10.
+ if (language.present()) {
+ tag.setLanguage(language);
+ }
+
+ // Step 11.
+ if (script.present()) {
+ tag.setScript(script);
+ }
+
+ // Step 12.
+ if (region.present()) {
+ tag.setRegion(region);
+ }
+
+ // Step 13.
+ // Optimized to only canonicalize the base-name subtags. All other
+ // canonicalization steps will happen later.
+ if (!tag.canonicalizeBaseName(cx)) {
+ return true;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * ApplyUnicodeExtensionToTag( tag, options, relevantExtensionKeys )
+ */
+bool js::intl::ApplyUnicodeExtensionToTag(
+ JSContext* cx, LanguageTag& tag,
+ JS::HandleVector<intl::UnicodeExtensionKeyword> keywords) {
+ // If no Unicode extensions were present in the options object, we can skip
+ // everything below and directly return.
+ if (keywords.length() == 0) {
+ return true;
+ }
+
+ Vector<char, 32> newExtension(cx);
+ if (!newExtension.append('u')) {
+ return false;
+ }
+
+ // Check if there's an existing Unicode extension subtag.
+
+ const char* unicodeExtensionEnd = nullptr;
+ const char* unicodeExtensionKeywords = nullptr;
+ if (const char* unicodeExtension = tag.unicodeExtension()) {
+ unicodeExtensionEnd = unicodeExtension + strlen(unicodeExtension);
+
+ SepKeywordIterator<char> iter(unicodeExtension, unicodeExtensionEnd);
+
+ // Find the start of the first keyword.
+ unicodeExtensionKeywords = iter.next();
+
+ // Copy any attributes present before the first keyword.
+ const char* attributesEnd = unicodeExtensionKeywords
+ ? unicodeExtensionKeywords
+ : unicodeExtensionEnd;
+ if (!newExtension.append(unicodeExtension + 1, attributesEnd)) {
+ return false;
+ }
+ }
+
+ // Append the new keywords before any existing keywords. That way any previous
+ // keyword with the same key is detected as a duplicate when canonicalizing
+ // the Unicode extension subtag and gets discarded.
+
+ for (const auto& keyword : keywords) {
+ UnicodeExtensionKeyword::UnicodeKeySpan key = keyword.key();
+ if (!newExtension.append('-')) {
+ return false;
+ }
+ if (!newExtension.append(key.data(), key.size())) {
+ return false;
+ }
+ if (!newExtension.append('-')) {
+ return false;
+ }
+
+ JS::AutoCheckCannotGC nogc;
+ JSLinearString* type = keyword.type();
+ if (type->hasLatin1Chars()) {
+ if (!newExtension.append(type->latin1Chars(nogc), type->length())) {
+ return false;
+ }
+ } else {
+ if (!newExtension.append(type->twoByteChars(nogc), type->length())) {
+ return false;
+ }
+ }
+ }
+
+ // Append the remaining keywords from the previous Unicode extension subtag.
+ if (unicodeExtensionKeywords) {
+ if (!newExtension.append(unicodeExtensionKeywords, unicodeExtensionEnd)) {
+ return false;
+ }
+ }
+
+ // Null-terminate the new Unicode extension string.
+ if (!newExtension.append('\0')) {
+ return false;
+ }
+
+ // Insert the new Unicode extension string into the language tag.
+ UniqueChars newExtensionChars(newExtension.extractOrCopyRawBuffer());
+ if (!newExtensionChars) {
+ return false;
+ }
+ return tag.setUnicodeExtension(std::move(newExtensionChars));
+}
+
+static JS::Result<JSString*> LanguageTagFromMaybeWrappedLocale(JSContext* cx,
+ JSObject* obj) {
+ if (obj->is<LocaleObject>()) {
+ return obj->as<LocaleObject>().languageTag();
+ }
+
+ JSObject* unwrapped = CheckedUnwrap(obj);
+ if (!unwrapped) {
+ /* ReportAccessDenied(cx); */
+ return cx->alreadyReportedError();
+ }
+
+ if (!unwrapped->is<LocaleObject>()) {
+ return nullptr;
+ }
+
+ RootedString tagStr(cx, unwrapped->as<LocaleObject>().languageTag());
+ if (!cx->compartment()->wrap(cx, &tagStr)) {
+ return cx->alreadyReportedError();
+ }
+ return tagStr.get();
+}
+
+/**
+ * Intl.Locale( tag[, options] )
+ */
+static bool Locale(JSContext* cx, unsigned argc, Value* vp) {
+ CallArgs args = CallArgsFromVp(argc, vp);
+
+ // Step 1.
+ if (!ThrowIfNotConstructing(cx, args, "Intl.Locale")) {
+ return false;
+ }
+
+ // Steps 2-6 (Inlined 9.1.14, OrdinaryCreateFromConstructor).
+ RootedObject proto(cx);
+ if (!GetPrototypeFromCallableConstructor(cx, args, &proto)) {
+ return false;
+ }
+
+ // Steps 7-9.
+ HandleValue tagValue = args.get(0);
+ JSString* tagStr;
+ if (tagValue.isObject()) {
+ JS_TRY_VAR_OR_RETURN_FALSE(
+ cx, tagStr,
+ LanguageTagFromMaybeWrappedLocale(cx, &tagValue.toObject()));
+ if (!tagStr) {
+ tagStr = ToString(cx, tagValue);
+ if (!tagStr) {
+ return false;
+ }
+ }
+ } else if (tagValue.isString()) {
+ tagStr = tagValue.toString();
+ } else {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
+ JSMSG_INVALID_LOCALES_ELEMENT);
+ return false;
+ }
+
+ RootedLinearString tagLinearStr(cx, tagStr->ensureLinear(cx));
+ if (!tagLinearStr) {
+ return false;
+ }
+
+ // ApplyOptionsToTag, steps 2 and 9.
+ LanguageTag tag(cx);
+ if (!LanguageTagParser::parse(cx, tagLinearStr, tag)) {
+ return false;
+ }
+
+ if (!tag.canonicalizeBaseName(cx)) {
+ return false;
+ }
+
+ // Steps 10-11.
+ if (args.hasDefined(1)) {
+ RootedObject options(cx, ToObject(cx, args[1]));
+ if (!options) {
+ return false;
+ }
+
+ // Step 12.
+ if (!ApplyOptionsToTag(cx, tag, options)) {
+ return false;
+ }
+
+ // Step 13.
+ JS::RootedVector<intl::UnicodeExtensionKeyword> keywords(cx);
+
+ // Step 14.
+ RootedLinearString calendar(cx);
+ if (!GetStringOption(cx, options, cx->names().calendar, &calendar)) {
+ return false;
+ }
+
+ // Steps 15-16.
+ if (calendar) {
+ if (!IsValidUnicodeExtensionValue(calendar)) {
+ if (UniqueChars str = StringToNewUTF8CharsZ(cx, *calendar)) {
+ JS_ReportErrorNumberUTF8(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE, "calendar",
+ str.get());
+ }
+ return false;
+ }
+
+ if (!keywords.emplaceBack("ca", calendar)) {
+ return false;
+ }
+ }
+
+ // Step 17.
+ RootedLinearString collation(cx);
+ if (!GetStringOption(cx, options, cx->names().collation, &collation)) {
+ return false;
+ }
+
+ // Steps 18-19.
+ if (collation) {
+ if (!IsValidUnicodeExtensionValue(collation)) {
+ if (UniqueChars str = StringToNewUTF8CharsZ(cx, *collation)) {
+ JS_ReportErrorNumberUTF8(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE, "collation",
+ str.get());
+ }
+ return false;
+ }
+
+ if (!keywords.emplaceBack("co", collation)) {
+ return false;
+ }
+ }
+
+ // Step 20 (without validation).
+ RootedLinearString hourCycle(cx);
+ if (!GetStringOption(cx, options, cx->names().hourCycle, &hourCycle)) {
+ return false;
+ }
+
+ // Steps 20-21.
+ if (hourCycle) {
+ if (!StringEqualsAscii(hourCycle, "h11") &&
+ !StringEqualsAscii(hourCycle, "h12") &&
+ !StringEqualsAscii(hourCycle, "h23") &&
+ !StringEqualsAscii(hourCycle, "h24")) {
+ if (UniqueChars str = StringToNewUTF8CharsZ(cx, *hourCycle)) {
+ JS_ReportErrorNumberUTF8(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE, "hourCycle",
+ str.get());
+ }
+ return false;
+ }
+
+ if (!keywords.emplaceBack("hc", hourCycle)) {
+ return false;
+ }
+ }
+
+ // Step 22 (without validation).
+ RootedLinearString caseFirst(cx);
+ if (!GetStringOption(cx, options, cx->names().caseFirst, &caseFirst)) {
+ return false;
+ }
+
+ // Steps 22-23.
+ if (caseFirst) {
+ if (!StringEqualsAscii(caseFirst, "upper") &&
+ !StringEqualsAscii(caseFirst, "lower") &&
+ !StringEqualsAscii(caseFirst, "false")) {
+ if (UniqueChars str = StringToNewUTF8CharsZ(cx, *caseFirst)) {
+ JS_ReportErrorNumberUTF8(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE, "caseFirst",
+ str.get());
+ }
+ return false;
+ }
+
+ if (!keywords.emplaceBack("kf", caseFirst)) {
+ return false;
+ }
+ }
+
+ // Steps 24-25.
+ RootedLinearString numeric(cx);
+ if (!GetBooleanOption(cx, options, cx->names().numeric, &numeric)) {
+ return false;
+ }
+
+ // Step 26.
+ if (numeric) {
+ if (!keywords.emplaceBack("kn", numeric)) {
+ return false;
+ }
+ }
+
+ // Step 27.
+ RootedLinearString numberingSystem(cx);
+ if (!GetStringOption(cx, options, cx->names().numberingSystem,
+ &numberingSystem)) {
+ return false;
+ }
+
+ // Steps 28-29.
+ if (numberingSystem) {
+ if (!IsValidUnicodeExtensionValue(numberingSystem)) {
+ if (UniqueChars str = StringToNewUTF8CharsZ(cx, *numberingSystem)) {
+ JS_ReportErrorNumberUTF8(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE,
+ "numberingSystem", str.get());
+ }
+ return false;
+ }
+
+ if (!keywords.emplaceBack("nu", numberingSystem)) {
+ return false;
+ }
+ }
+
+ // Step 30.
+ if (!ApplyUnicodeExtensionToTag(cx, tag, keywords)) {
+ return false;
+ }
+ }
+
+ // ApplyOptionsToTag, steps 9 and 13.
+ // ApplyUnicodeExtensionToTag, step 9.
+ if (!tag.canonicalizeExtensions(cx)) {
+ return false;
+ }
+
+ // Steps 6, 31-37.
+ JSObject* obj = CreateLocaleObject(cx, proto, tag);
+ if (!obj) {
+ return false;
+ }
+
+ // Step 38.
+ args.rval().setObject(*obj);
+ return true;
+}
+
+using UnicodeKey = const char (&)[UnicodeKeyLength + 1];
+
+// Returns the tuple [index, length] of the `type` in the `keyword` in Unicode
+// locale extension |extension| that has |key| as its `key`. If `keyword` lacks
+// a type, the returned |index| will be where `type` would have been, and
+// |length| will be set to zero.
+template <typename CharT>
+static mozilla::Maybe<IndexAndLength> FindUnicodeExtensionType(
+ const CharT* extension, size_t length, UnicodeKey key) {
+ MOZ_ASSERT(extension[0] == 'u');
+ MOZ_ASSERT(extension[1] == '-');
+
+ const CharT* end = extension + length;
+
+ SepKeywordIterator<CharT> iter(extension, end);
+
+ // Search all keywords until a match was found.
+ const CharT* beginKey;
+ while (true) {
+ beginKey = iter.next();
+ if (!beginKey) {
+ return mozilla::Nothing();
+ }
+
+ // Add +1 to skip over the separator preceding the keyword.
+ MOZ_ASSERT(beginKey[0] == '-');
+ beginKey++;
+
+ // Exit the loop on the first match.
+ if (std::equal(beginKey, beginKey + UnicodeKeyLength, key)) {
+ break;
+ }
+ }
+
+ // Skip over the key.
+ const CharT* beginType = beginKey + UnicodeKeyLength;
+
+ // Find the start of the next keyword.
+ const CharT* endType = iter.next();
+
+ // No further keyword present, the current keyword ends the Unicode extension.
+ if (!endType) {
+ endType = end;
+ }
+
+ // If the keyword has a type, skip over the separator preceding the type.
+ if (beginType != endType) {
+ MOZ_ASSERT(beginType[0] == '-');
+ beginType++;
+ }
+ return mozilla::Some(IndexAndLength{size_t(beginType - extension),
+ size_t(endType - beginType)});
+}
+
+static inline auto FindUnicodeExtensionType(JSLinearString* unicodeExtension,
+ UnicodeKey key) {
+ JS::AutoCheckCannotGC nogc;
+ return unicodeExtension->hasLatin1Chars()
+ ? FindUnicodeExtensionType(unicodeExtension->latin1Chars(nogc),
+ unicodeExtension->length(), key)
+ : FindUnicodeExtensionType(unicodeExtension->twoByteChars(nogc),
+ unicodeExtension->length(), key);
+}
+
+// Return the sequence of types for the Unicode extension keyword specified by
+// key or undefined when the keyword isn't present.
+static bool GetUnicodeExtension(JSContext* cx, LocaleObject* locale,
+ UnicodeKey key, MutableHandleValue value) {
+ // Return undefined when no Unicode extension subtag is present.
+ const Value& unicodeExtensionValue = locale->unicodeExtension();
+ if (unicodeExtensionValue.isUndefined()) {
+ value.setUndefined();
+ return true;
+ }
+
+ JSLinearString* unicodeExtension =
+ unicodeExtensionValue.toString()->ensureLinear(cx);
+ if (!unicodeExtension) {
+ return false;
+ }
+
+ // Find the type of the requested key in the Unicode extension subtag.
+ auto result = FindUnicodeExtensionType(unicodeExtension, key);
+
+ // Return undefined if the requested key isn't present in the extension.
+ if (!result) {
+ value.setUndefined();
+ return true;
+ }
+
+ size_t index = result->index;
+ size_t length = result->length;
+
+ // Otherwise return the type value of the found keyword.
+ JSString* str = NewDependentString(cx, unicodeExtension, index, length);
+ if (!str) {
+ return false;
+ }
+ value.setString(str);
+ return true;
+}
+
+struct BaseNamePartsResult {
+ IndexAndLength language;
+ mozilla::Maybe<IndexAndLength> script;
+ mozilla::Maybe<IndexAndLength> region;
+};
+
+// Returns [language-length, script-index, region-index, region-length].
+template <typename CharT>
+static BaseNamePartsResult BaseNameParts(const CharT* baseName, size_t length) {
+ size_t languageLength;
+ size_t scriptIndex = 0;
+ size_t regionIndex = 0;
+ size_t regionLength = 0;
+
+ // Search the first separator to find the end of the language subtag.
+ if (const CharT* sep = std::char_traits<CharT>::find(baseName, length, '-')) {
+ languageLength = sep - baseName;
+
+ // Add +1 to skip over the separator character.
+ size_t nextSubtag = languageLength + 1;
+
+ // Script subtags are always four characters long, but take care for a four
+ // character long variant subtag. These start with a digit.
+ if ((nextSubtag + ScriptLength == length ||
+ (nextSubtag + ScriptLength < length &&
+ baseName[nextSubtag + ScriptLength] == '-')) &&
+ mozilla::IsAsciiAlpha(baseName[nextSubtag])) {
+ scriptIndex = nextSubtag;
+ nextSubtag = scriptIndex + ScriptLength + 1;
+ }
+
+ // Region subtags can be either two or three characters long.
+ if (nextSubtag < length) {
+ for (size_t rlen : {AlphaRegionLength, DigitRegionLength}) {
+ MOZ_ASSERT(nextSubtag + rlen <= length);
+ if (nextSubtag + rlen == length || baseName[nextSubtag + rlen] == '-') {
+ regionIndex = nextSubtag;
+ regionLength = rlen;
+ break;
+ }
+ }
+ }
+ } else {
+ // No separator found, the base-name consists of just a language subtag.
+ languageLength = length;
+ }
+
+ IndexAndLength language{0, languageLength};
+ MOZ_ASSERT(intl::IsStructurallyValidLanguageTag(language.spanOf(baseName)));
+
+ mozilla::Maybe<IndexAndLength> script{};
+ if (scriptIndex) {
+ script.emplace(scriptIndex, ScriptLength);
+ MOZ_ASSERT(intl::IsStructurallyValidScriptTag(script->spanOf(baseName)));
+ }
+
+ mozilla::Maybe<IndexAndLength> region{};
+ if (regionIndex) {
+ region.emplace(regionIndex, regionLength);
+ MOZ_ASSERT(intl::IsStructurallyValidRegionTag(region->spanOf(baseName)));
+ }
+
+ return {language, script, region};
+}
+
+static inline auto BaseNameParts(JSLinearString* baseName) {
+ JS::AutoCheckCannotGC nogc;
+ return baseName->hasLatin1Chars()
+ ? BaseNameParts(baseName->latin1Chars(nogc), baseName->length())
+ : BaseNameParts(baseName->twoByteChars(nogc), baseName->length());
+}
+
+// Intl.Locale.prototype.maximize ()
+static bool Locale_maximize(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ RootedLinearString tagStr(cx, locale->languageTag()->ensureLinear(cx));
+ if (!tagStr) {
+ return false;
+ }
+
+ LanguageTag tag(cx);
+ if (!LanguageTagParser::parse(cx, tagStr, tag)) {
+ return false;
+ }
+
+ if (!tag.addLikelySubtags(cx)) {
+ return false;
+ }
+
+ // Step 4.
+ auto* result = CreateLocaleObject(cx, nullptr, tag);
+ if (!result) {
+ return false;
+ }
+ args.rval().setObject(*result);
+ return true;
+}
+
+// Intl.Locale.prototype.maximize ()
+static bool Locale_maximize(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_maximize>(cx, args);
+}
+
+// Intl.Locale.prototype.minimize ()
+static bool Locale_minimize(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ RootedLinearString tagStr(cx, locale->languageTag()->ensureLinear(cx));
+ if (!tagStr) {
+ return false;
+ }
+
+ LanguageTag tag(cx);
+ if (!LanguageTagParser::parse(cx, tagStr, tag)) {
+ return false;
+ }
+
+ if (!tag.removeLikelySubtags(cx)) {
+ return false;
+ }
+
+ // Step 4.
+ auto* result = CreateLocaleObject(cx, nullptr, tag);
+ if (!result) {
+ return false;
+ }
+ args.rval().setObject(*result);
+ return true;
+}
+
+// Intl.Locale.prototype.minimize ()
+static bool Locale_minimize(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_minimize>(cx, args);
+}
+
+// Intl.Locale.prototype.toString ()
+static bool Locale_toString(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ args.rval().setString(locale->languageTag());
+ return true;
+}
+
+// Intl.Locale.prototype.toString ()
+static bool Locale_toString(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_toString>(cx, args);
+}
+
+// get Intl.Locale.prototype.baseName
+static bool Locale_baseName(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Steps 3-4.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ args.rval().setString(locale->baseName());
+ return true;
+}
+
+// get Intl.Locale.prototype.baseName
+static bool Locale_baseName(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_baseName>(cx, args);
+}
+
+// get Intl.Locale.prototype.calendar
+static bool Locale_calendar(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ return GetUnicodeExtension(cx, locale, "ca", args.rval());
+}
+
+// get Intl.Locale.prototype.calendar
+static bool Locale_calendar(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_calendar>(cx, args);
+}
+
+// get Intl.Locale.prototype.caseFirst
+static bool Locale_caseFirst(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ return GetUnicodeExtension(cx, locale, "kf", args.rval());
+}
+
+// get Intl.Locale.prototype.caseFirst
+static bool Locale_caseFirst(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_caseFirst>(cx, args);
+}
+
+// get Intl.Locale.prototype.collation
+static bool Locale_collation(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ return GetUnicodeExtension(cx, locale, "co", args.rval());
+}
+
+// get Intl.Locale.prototype.collation
+static bool Locale_collation(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_collation>(cx, args);
+}
+
+// get Intl.Locale.prototype.hourCycle
+static bool Locale_hourCycle(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ return GetUnicodeExtension(cx, locale, "hc", args.rval());
+}
+
+// get Intl.Locale.prototype.hourCycle
+static bool Locale_hourCycle(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_hourCycle>(cx, args);
+}
+
+// get Intl.Locale.prototype.numeric
+static bool Locale_numeric(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ RootedValue value(cx);
+ if (!GetUnicodeExtension(cx, locale, "kn", &value)) {
+ return false;
+ }
+
+ // Compare against the empty string per Intl.Locale, step 36.a. The Unicode
+ // extension is already canonicalized, so we don't need to compare against
+ // "true" at this point.
+ MOZ_ASSERT(value.isUndefined() || value.isString());
+ MOZ_ASSERT_IF(value.isString(),
+ !StringEqualsAscii(&value.toString()->asLinear(), "true"));
+
+ args.rval().setBoolean(value.isString() && value.toString()->empty());
+ return true;
+}
+
+// get Intl.Locale.prototype.numeric
+static bool Locale_numeric(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_numeric>(cx, args);
+}
+
+// get Intl.Locale.prototype.numberingSystem
+static bool Intl_Locale_numberingSystem(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ return GetUnicodeExtension(cx, locale, "nu", args.rval());
+}
+
+// get Intl.Locale.prototype.numberingSystem
+static bool Locale_numberingSystem(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Intl_Locale_numberingSystem>(cx, args);
+}
+
+// get Intl.Locale.prototype.language
+static bool Locale_language(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ JSLinearString* baseName = locale->baseName()->ensureLinear(cx);
+ if (!baseName) {
+ return false;
+ }
+
+ // Step 4 (Unnecessary assertion).
+
+ auto language = BaseNameParts(baseName).language;
+
+ size_t index = language.index;
+ size_t length = language.length;
+
+ // Step 5.
+ JSString* str = NewDependentString(cx, baseName, index, length);
+ if (!str) {
+ return false;
+ }
+
+ args.rval().setString(str);
+ return true;
+}
+
+// get Intl.Locale.prototype.language
+static bool Locale_language(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_language>(cx, args);
+}
+
+// get Intl.Locale.prototype.script
+static bool Locale_script(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ JSLinearString* baseName = locale->baseName()->ensureLinear(cx);
+ if (!baseName) {
+ return false;
+ }
+
+ // Step 4 (Unnecessary assertion).
+
+ auto script = BaseNameParts(baseName).script;
+
+ // Step 5.
+ if (!script) {
+ args.rval().setUndefined();
+ return true;
+ }
+
+ size_t index = script->index;
+ size_t length = script->length;
+
+ // Step 6.
+ JSString* str = NewDependentString(cx, baseName, index, length);
+ if (!str) {
+ return false;
+ }
+
+ args.rval().setString(str);
+ return true;
+}
+
+// get Intl.Locale.prototype.script
+static bool Locale_script(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_script>(cx, args);
+}
+
+// get Intl.Locale.prototype.region
+static bool Locale_region(JSContext* cx, const CallArgs& args) {
+ MOZ_ASSERT(IsLocale(args.thisv()));
+
+ // Step 3.
+ auto* locale = &args.thisv().toObject().as<LocaleObject>();
+ JSLinearString* baseName = locale->baseName()->ensureLinear(cx);
+ if (!baseName) {
+ return false;
+ }
+
+ // Step 4 (Unnecessary assertion).
+
+ auto region = BaseNameParts(baseName).region;
+
+ // Step 5.
+ if (!region) {
+ args.rval().setUndefined();
+ return true;
+ }
+
+ size_t index = region->index;
+ size_t length = region->length;
+
+ // Step 6.
+ JSString* str = NewDependentString(cx, baseName, index, length);
+ if (!str) {
+ return false;
+ }
+
+ args.rval().setString(str);
+ return true;
+}
+
+// get Intl.Locale.prototype.region
+static bool Locale_region(JSContext* cx, unsigned argc, Value* vp) {
+ // Steps 1-2.
+ CallArgs args = CallArgsFromVp(argc, vp);
+ return CallNonGenericMethod<IsLocale, Locale_region>(cx, args);
+}
+
+static bool Locale_toSource(JSContext* cx, unsigned argc, Value* vp) {
+ CallArgs args = CallArgsFromVp(argc, vp);
+ args.rval().setString(cx->names().Locale);
+ return true;
+}
+
+static const JSFunctionSpec locale_methods[] = {
+ JS_FN("maximize", Locale_maximize, 0, 0),
+ JS_FN("minimize", Locale_minimize, 0, 0),
+ JS_FN(js_toString_str, Locale_toString, 0, 0),
+ JS_FN(js_toSource_str, Locale_toSource, 0, 0), JS_FS_END};
+
+static const JSPropertySpec locale_properties[] = {
+ JS_PSG("baseName", Locale_baseName, 0),
+ JS_PSG("calendar", Locale_calendar, 0),
+ JS_PSG("caseFirst", Locale_caseFirst, 0),
+ JS_PSG("collation", Locale_collation, 0),
+ JS_PSG("hourCycle", Locale_hourCycle, 0),
+ JS_PSG("numeric", Locale_numeric, 0),
+ JS_PSG("numberingSystem", Locale_numberingSystem, 0),
+ JS_PSG("language", Locale_language, 0),
+ JS_PSG("script", Locale_script, 0),
+ JS_PSG("region", Locale_region, 0),
+ JS_STRING_SYM_PS(toStringTag, "Intl.Locale", JSPROP_READONLY),
+ JS_PS_END};
+
+JSObject* js::CreateLocalePrototype(JSContext* cx, HandleObject Intl,
+ Handle<GlobalObject*> global) {
+ RootedFunction ctor(cx,
+ GlobalObject::createConstructor(cx, &Locale, cx->names().Locale, 1));
+ if (!ctor) {
+ return nullptr;
+ }
+
+ RootedObject proto(
+ cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
+ if (!proto) {
+ return nullptr;
+ }
+
+ if (!LinkConstructorAndPrototype(cx, ctor, proto)) {
+ return nullptr;
+ }
+
+ if (!DefinePropertiesAndFunctions(cx, proto, locale_properties, locale_methods)) {
+ return nullptr;
+ }
+
+ RootedValue ctorValue(cx, ObjectValue(*ctor));
+ if (!DefineProperty(cx, Intl, cx->names().Locale, ctorValue, nullptr, nullptr, 0)) {
+ return nullptr;
+ }
+
+ return proto;
+}
+
+bool js::intl_ValidateAndCanonicalizeLanguageTag(JSContext* cx, unsigned argc,
+ Value* vp) {
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 2);
+
+ HandleValue tagValue = args[0];
+ bool applyToString = args[1].toBoolean();
+
+ if (tagValue.isObject()) {
+ JSString* tagStr;
+ JS_TRY_VAR_OR_RETURN_FALSE(
+ cx, tagStr,
+ LanguageTagFromMaybeWrappedLocale(cx, &tagValue.toObject()));
+ if (tagStr) {
+ args.rval().setString(tagStr);
+ return true;
+ }
+ }
+
+ if (!applyToString && !tagValue.isString()) {
+ args.rval().setNull();
+ return true;
+ }
+
+ JSString* tagStr = ToString(cx, tagValue);
+ if (!tagStr) {
+ return false;
+ }
+
+ RootedLinearString tagLinearStr(cx, tagStr->ensureLinear(cx));
+ if (!tagLinearStr) {
+ return false;
+ }
+
+ // Handle the common case (a standalone language) first.
+ // Only the following Unicode BCP 47 locale identifier subset is accepted:
+ // unicode_locale_id = unicode_language_id
+ // unicode_language_id = unicode_language_subtag
+ // unicode_language_subtag = alpha{2,3}
+ JSString* language;
+ JS_TRY_VAR_OR_RETURN_FALSE(
+ cx, language, intl::ParseStandaloneISO639LanguageTag(cx, tagLinearStr));
+ if (language) {
+ args.rval().setString(language);
+ return true;
+ }
+
+ LanguageTag tag(cx);
+ if (!LanguageTagParser::parse(cx, tagLinearStr, tag)) {
+ return false;
+ }
+
+ if (!tag.canonicalize(cx)) {
+ return false;
+ }
+
+ JSString* resultStr = tag.toString(cx);
+ if (!resultStr) {
+ return false;
+ }
+ args.rval().setString(resultStr);
+ return true;
+}
+
+bool js::intl_TryValidateAndCanonicalizeLanguageTag(JSContext* cx,
+ unsigned argc, Value* vp) {
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 1);
+
+ RootedLinearString linear(cx, args[0].toString()->ensureLinear(cx));
+ if (!linear) {
+ return false;
+ }
+
+ LanguageTag tag(cx);
+ bool ok;
+ JS_TRY_VAR_OR_RETURN_FALSE(cx, ok,
+ LanguageTagParser::tryParse(cx, linear, tag));
+
+ // The caller handles invalid inputs.
+ if (!ok) {
+ args.rval().setNull();
+ return true;
+ }
+
+ if (!tag.canonicalize(cx)) {
+ return false;
+ }
+
+ JSString* resultStr = tag.toString(cx);
+ if (!resultStr) {
+ return false;
+ }
+ args.rval().setString(resultStr);
+ return true;
+}
+
+bool js::intl_ValidateAndCanonicalizeUnicodeExtensionType(JSContext* cx,
+ unsigned argc,
+ Value* vp) {
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 3);
+
+ HandleValue typeArg = args[0];
+ MOZ_ASSERT(typeArg.isString(), "type must be a string");
+
+ HandleValue optionArg = args[1];
+ MOZ_ASSERT(optionArg.isString(), "option name must be a string");
+
+ HandleValue keyArg = args[2];
+ MOZ_ASSERT(keyArg.isString(), "key must be a string");
+
+ RootedLinearString unicodeType(cx, typeArg.toString()->ensureLinear(cx));
+ if (!unicodeType) {
+ return false;
+ }
+
+ if (!IsValidUnicodeExtensionValue(unicodeType)) {
+ JSAutoByteString optionStr(cx, optionArg.toString());
+ if (!optionStr) {
+ return false;
+ }
+
+ JSAutoByteString unicodeTypeQuot(cx, QuoteString(cx, unicodeType, '"'));
+ if (!unicodeTypeQuot) {
+ return false;
+ }
+
+ JS_ReportErrorNumberASCII(cx, js::GetErrorMessage, nullptr,
+ JSMSG_INVALID_OPTION_VALUE, optionStr.ptr(),
+ unicodeTypeQuot.ptr());
+ return false;
+ }
+
+ char unicodeKey[UnicodeKeyLength];
+ {
+ JSLinearString* str = keyArg.toString()->ensureLinear(cx);
+ if (!str) {
+ return false;
+ }
+ MOZ_ASSERT(str->length() == UnicodeKeyLength);
+
+ for (size_t i = 0; i < UnicodeKeyLength; i++) {
+ char16_t ch = str->latin1OrTwoByteChar(i);
+ MOZ_ASSERT(mozilla::IsAscii(ch));
+ unicodeKey[i] = char(ch);
+ }
+ }
+
+ JSAutoByteString unicodeTypeChars(cx, unicodeType);
+ if (!unicodeTypeChars) {
+ return false;
+ }
+
+ size_t unicodeTypeLength = unicodeType->length();
+ MOZ_ASSERT(strlen(unicodeTypeChars.ptr()) == unicodeTypeLength);
+
+ // Convert into canonical case before searching for replacements.
+ intl::AsciiToLowerCase(unicodeTypeChars.ptr(), unicodeTypeLength,
+ unicodeTypeChars.ptr());
+
+ auto key = mozilla::MakeSpan(unicodeKey, UnicodeKeyLength);
+ auto type = mozilla::MakeSpan(unicodeTypeChars.ptr(), unicodeTypeLength);
+
+ // Search if there's a replacement for the current Unicode keyword.
+ JSString* result;
+ if (const char* replacement = LanguageTag::replaceUnicodeExtensionType(key, type)) {
+ result = NewStringCopyZ<CanGC>(cx, replacement);
+ } else {
+ result = StringToLowerCase(cx, unicodeType);
+ }
+ if (!result) {
+ return false;
+ }
+
+ args.rval().setString(result);
+ return true;
+}
diff --git a/js/src/builtin/intl/Locale.h b/js/src/builtin/intl/Locale.h
new file mode 100644
index 0000000000..881906616b
--- /dev/null
+++ b/js/src/builtin/intl/Locale.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef builtin_intl_Locale_h
+#define builtin_intl_Locale_h
+
+#include <stdint.h>
+
+#include "builtin/SelfHostingDefines.h"
+#include "js/Class.h"
+#include "vm/NativeObject.h"
+
+namespace js {
+
+class GlobalObject;
+
+class LocaleObject : public NativeObject {
+ public:
+ static const Class class_;
+
+ static constexpr uint32_t LANGUAGE_TAG_SLOT = 0;
+ static constexpr uint32_t BASENAME_SLOT = 1;
+ static constexpr uint32_t UNICODE_EXTENSION_SLOT = 2;
+ static constexpr uint32_t SLOT_COUNT = 3;
+
+ /**
+ * Returns the complete language tag, including any extensions and privateuse
+ * subtags.
+ */
+ JSString* languageTag() const {
+ return getFixedSlot(LANGUAGE_TAG_SLOT).toString();
+ }
+
+ /**
+ * Returns the basename subtags, i.e. excluding any extensions and privateuse
+ * subtags.
+ */
+ JSString* baseName() const { return getFixedSlot(BASENAME_SLOT).toString(); }
+
+ const Value& unicodeExtension() const {
+ return getFixedSlot(UNICODE_EXTENSION_SLOT);
+ }
+};
+
+extern JSObject* CreateLocalePrototype(JSContext* cx,
+ JS::Handle<JSObject*> Intl,
+ JS::Handle<GlobalObject*> global);
+
+extern MOZ_MUST_USE bool intl_ValidateAndCanonicalizeLanguageTag(JSContext* cx,
+ unsigned argc,
+ Value* vp);
+
+extern MOZ_MUST_USE bool intl_TryValidateAndCanonicalizeLanguageTag(
+ JSContext* cx, unsigned argc, Value* vp);
+
+extern MOZ_MUST_USE bool intl_ValidateAndCanonicalizeUnicodeExtensionType(
+ JSContext* cx, unsigned argc, Value* vp);
+
+} // namespace js
+
+#endif /* builtin_intl_Locale_h */
diff --git a/js/src/builtin/intl/NumberFormat.cpp b/js/src/builtin/intl/NumberFormat.cpp
index 1cd173fd54..9ee3b02109 100644
--- a/js/src/builtin/intl/NumberFormat.cpp
+++ b/js/src/builtin/intl/NumberFormat.cpp
@@ -18,6 +18,7 @@
#include "builtin/intl/CommonFunctions.h"
#include "builtin/intl/ICUHeader.h"
+#include "builtin/intl/LanguageTag.h"
#include "builtin/intl/ScopedICUObject.h"
#include "ds/Sort.h"
#include "js/RootingAPI.h"
@@ -35,7 +36,7 @@ using mozilla::IsFinite;
using mozilla::IsNaN;
using mozilla::IsNegativeZero;
using js::intl::CallICU;
-using js::intl::GetAvailableLocales;
+using js::intl::DateTimeFormatOptions;
using js::intl::IcuLocale;
using js::intl::INITIAL_CHAR_BUFFER_SIZE;
using js::intl::StringsAreEqual;
@@ -92,63 +93,34 @@ static const JSFunctionSpec numberFormat_methods[] = {
static bool
NumberFormat(JSContext* cx, const CallArgs& args, bool construct)
{
- RootedObject obj(cx);
-
- // We're following ECMA-402 1st Edition when NumberFormat is called
- // because of backward compatibility issues.
- // See https://github.com/tc39/ecma402/issues/57
- if (!construct) {
- // ES Intl 1st ed., 11.1.2.1 step 3
- JSObject* intl = GlobalObject::getOrCreateIntlObject(cx, cx->global());
- if (!intl)
- return false;
- RootedValue self(cx, args.thisv());
- if (!self.isUndefined() && (!self.isObject() || self.toObject() != *intl)) {
- // ES Intl 1st ed., 11.1.2.1 step 4
- obj = ToObject(cx, self);
- if (!obj)
- return false;
-
- // ES Intl 1st ed., 11.1.2.1 step 5
- bool extensible;
- if (!IsExtensible(cx, obj, &extensible))
- return false;
- if (!extensible)
- return Throw(cx, obj, JSMSG_OBJECT_NOT_EXTENSIBLE);
- } else {
- // ES Intl 1st ed., 11.1.2.1 step 3.a
- construct = true;
- }
- }
- if (construct) {
- // Step 2 (Inlined 9.1.14, OrdinaryCreateFromConstructor).
- RootedObject proto(cx);
- if (args.isConstructing() && !GetPrototypeFromCallableConstructor(cx, args, &proto))
- return false;
+ // Step 1 (Handled by OrdinaryCreateFromConstructor fallback code).
- if (!proto) {
- proto = GlobalObject::getOrCreateNumberFormatPrototype(cx, cx->global());
- if (!proto)
- return false;
- }
+ // Step 2 (Inlined 9.1.14, OrdinaryCreateFromConstructor).
+ RootedObject proto(cx);
+ if (args.isConstructing() && !GetPrototypeFromCallableConstructor(cx, args, &proto))
+ return false;
- obj = NewObjectWithGivenProto<NumberFormatObject>(cx, proto);
- if (!obj)
+ if (!proto) {
+ proto = GlobalObject::getOrCreateNumberFormatPrototype(cx, cx->global());
+ if (!proto)
return false;
-
- obj->as<NativeObject>().setReservedSlot(NumberFormatObject::INTERNALS_SLOT, NullValue());
- obj->as<NativeObject>().setReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT, PrivateValue(nullptr));
}
- RootedValue locales(cx, args.length() > 0 ? args[0] : UndefinedValue());
- RootedValue options(cx, args.length() > 1 ? args[1] : UndefinedValue());
-
- // Step 3.
- if (!intl::InitializeObject(cx, obj, cx->names().InitializeNumberFormat, locales, options))
+ Rooted<NumberFormatObject*> numberFormat(cx);
+ numberFormat = NewObjectWithGivenProto<NumberFormatObject>(cx, proto);
+ if (!numberFormat)
return false;
- args.rval().setObject(*obj);
- return true;
+ numberFormat->setReservedSlot(NumberFormatObject::INTERNALS_SLOT, NullValue());
+ numberFormat->setReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT, PrivateValue(nullptr));
+
+ RootedValue thisValue(cx, construct ? ObjectValue(*numberFormat) : args.thisv());
+ RootedValue locales(cx, args.get(0));
+ RootedValue options(cx, args.get(1));
+
+ // Step 3.
+ return intl::LegacyIntlInitialize(cx, numberFormat, cx->names().InitializeNumberFormat, thisValue,
+ locales, options, DateTimeFormatOptions::Standard, args.rval());
}
static bool
@@ -175,30 +147,23 @@ js::NumberFormatObject::finalize(FreeOp* fop, JSObject* obj)
{
MOZ_ASSERT(fop->onMainThread());
- // This is-undefined check shouldn't be necessary, but for internal
- // brokenness in object allocation code. For the moment, hack around it by
- // explicitly guarding against the possibility of the reserved slot not
- // containing a private. See bug 949220.
- const Value& slot = obj->as<NativeObject>().getReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT);
- if (!slot.isUndefined()) {
- if (UNumberFormat* nf = static_cast<UNumberFormat*>(slot.toPrivate()))
- unum_close(nf);
- }
+ const Value& slot = obj->as<NumberFormatObject>().getReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT);
+ if (UNumberFormat* nf = static_cast<UNumberFormat*>(slot.toPrivate()))
+ unum_close(nf);
}
JSObject*
-js::CreateNumberFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global)
+js::CreateNumberFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global,
+ MutableHandleObject constructor)
{
RootedFunction ctor(cx);
ctor = GlobalObject::createConstructor(cx, &NumberFormat, cx->names().NumberFormat, 0);
if (!ctor)
return nullptr;
- RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global,
- &NumberFormatObject::class_));
+ RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
if (!proto)
return nullptr;
- proto->setReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT, PrivateValue(nullptr));
if (!LinkConstructorAndPrototype(cx, ctor, proto))
return nullptr;
@@ -229,39 +194,16 @@ js::CreateNumberFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalO
return nullptr;
}
- RootedValue options(cx);
- if (!intl::CreateDefaultOptions(cx, &options))
- return nullptr;
-
- // 11.2.1 and 11.3
- if (!intl::InitializeObject(cx, proto, cx->names().InitializeNumberFormat, UndefinedHandleValue,
- options))
- {
- return nullptr;
- }
-
// 8.1
RootedValue ctorValue(cx, ObjectValue(*ctor));
if (!DefineProperty(cx, Intl, cx->names().NumberFormat, ctorValue, nullptr, nullptr, 0))
return nullptr;
+ constructor.set(ctor);
return proto;
}
bool
-js::intl_NumberFormat_availableLocales(JSContext* cx, unsigned argc, Value* vp)
-{
- CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 0);
-
- RootedValue result(cx);
- if (!GetAvailableLocales(cx, unum_countAvailable, unum_getAvailable, &result))
- return false;
- args.rval().set(result);
- return true;
-}
-
-bool
js::intl_numberingSystem(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
@@ -295,7 +237,7 @@ js::intl_numberingSystem(JSContext* cx, unsigned argc, Value* vp)
* of the given NumberFormat.
*/
static UNumberFormat*
-NewUNumberFormat(JSContext* cx, HandleObject numberFormat)
+NewUNumberFormat(JSContext* cx, Handle<NumberFormatObject*> numberFormat)
{
RootedValue value(cx);
@@ -305,7 +247,41 @@ NewUNumberFormat(JSContext* cx, HandleObject numberFormat)
if (!GetProperty(cx, internals, internals, cx->names().locale, &value))
return nullptr;
- JSAutoByteString locale(cx, value.toString());
+
+ // ICU expects numberingSystem as a Unicode locale extensions on locale.
+
+ intl::LanguageTag tag(cx);
+ {
+ JSLinearString* locale = value.toString()->ensureLinear(cx);
+ if (!locale)
+ return nullptr;
+
+ if (!intl::LanguageTagParser::parse(cx, locale, tag))
+ return nullptr;
+ }
+
+ JS::RootedVector<intl::UnicodeExtensionKeyword> keywords(cx);
+
+ if (!GetProperty(cx, internals, internals, cx->names().numberingSystem, &value))
+ return nullptr;
+
+ {
+ JSLinearString* numberingSystem = value.toString()->ensureLinear(cx);
+ if (!numberingSystem)
+ return nullptr;
+
+ if (!keywords.emplaceBack("nu", numberingSystem))
+ return nullptr;
+ }
+
+ // |ApplyUnicodeExtensionToTag| applies the new keywords to the front of
+ // the Unicode extension subtag. We're then relying on ICU to follow RFC
+ // 6067, which states that any trailing keywords using the same key
+ // should be ignored.
+ if (!intl::ApplyUnicodeExtensionToTag(cx, tag, keywords))
+ return nullptr;
+
+ UniqueChars locale = tag.toStringZ(cx);
if (!locale)
return nullptr;
@@ -323,9 +299,6 @@ NewUNumberFormat(JSContext* cx, HandleObject numberFormat)
RootedString currency(cx);
AutoStableStringChars stableChars(cx);
- // We don't need to look at numberingSystem - it can only be set via
- // the Unicode locale extension and is therefore already set on locale.
-
if (!GetProperty(cx, internals, internals, cx->names().style, &value))
return nullptr;
JSAutoByteString style(cx, value.toString());
@@ -398,7 +371,7 @@ NewUNumberFormat(JSContext* cx, HandleObject numberFormat)
uUseGrouping = value.toBoolean();
UErrorCode status = U_ZERO_ERROR;
- UNumberFormat* nf = unum_open(uStyle, nullptr, 0, IcuLocale(locale.ptr()), nullptr, &status);
+ UNumberFormat* nf = unum_open(uStyle, nullptr, 0, IcuLocale(locale.get()), nullptr, &status);
if (U_FAILURE(status)) {
intl::ReportInternalError(cx);
return nullptr;
@@ -854,50 +827,23 @@ js::intl_FormatNumber(JSContext* cx, unsigned argc, Value* vp)
MOZ_ASSERT(args[1].isNumber());
MOZ_ASSERT(args[2].isBoolean());
- RootedObject numberFormat(cx, &args[0].toObject());
-
- // Obtain a UNumberFormat object, cached if possible.
- bool isNumberFormatInstance = numberFormat->getClass() == &NumberFormatObject::class_;
- UNumberFormat* nf;
- if (isNumberFormatInstance) {
- void* priv =
- numberFormat->as<NativeObject>().getReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT).toPrivate();
- nf = static_cast<UNumberFormat*>(priv);
- if (!nf) {
- nf = NewUNumberFormat(cx, numberFormat);
- if (!nf)
- return false;
- numberFormat->as<NativeObject>().setReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT, PrivateValue(nf));
- }
- } else {
- // There's no good place to cache the ICU number format for an object
- // that has been initialized as a NumberFormat but is not a
- // NumberFormat instance. One possibility might be to add a
- // NumberFormat instance as an internal property to each such object.
+ Rooted<NumberFormatObject*> numberFormat(cx, &args[0].toObject().as<NumberFormatObject>());
+
+ // Obtain a cached UNumberFormat object.
+ void* priv =
+ numberFormat->getReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT).toPrivate();
+ UNumberFormat* nf = static_cast<UNumberFormat*>(priv);
+ if (!nf) {
nf = NewUNumberFormat(cx, numberFormat);
if (!nf)
return false;
+ numberFormat->setReservedSlot(NumberFormatObject::UNUMBER_FORMAT_SLOT, PrivateValue(nf));
}
// Use the UNumberFormat to actually format the number.
- double d = args[1].toNumber();
- RootedValue result(cx);
-
- bool success;
if (args[2].toBoolean()) {
- success = intl_FormatNumberToParts(cx, nf, d, &result);
- } else {
- MOZ_ASSERT(!args[2].toBoolean(),
- "shouldn't be doing formatToParts without an ICU that "
- "supports it");
- success = js::intl_FormatNumber(cx, nf, d, &result);
+ return intl_FormatNumberToParts(cx, nf, args[1].toNumber(), args.rval());
}
-
- if (!isNumberFormatInstance)
- unum_close(nf);
- if (!success)
- return false;
- args.rval().set(result);
- return true;
+ return intl_FormatNumber(cx, nf, args[1].toNumber(), args.rval());
}
diff --git a/js/src/builtin/intl/NumberFormat.h b/js/src/builtin/intl/NumberFormat.h
index 60da423bd2..befa0c3e0d 100644
--- a/js/src/builtin/intl/NumberFormat.h
+++ b/js/src/builtin/intl/NumberFormat.h
@@ -37,7 +37,8 @@ class NumberFormatObject : public NativeObject
};
extern JSObject*
-CreateNumberFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global);
+CreateNumberFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global,
+ MutableHandleObject constructor);
/**
* Returns a new instance of the standard built-in NumberFormat constructor.
@@ -50,17 +51,6 @@ extern MOZ_MUST_USE bool
intl_NumberFormat(JSContext* cx, unsigned argc, Value* vp);
/**
- * Returns an object indicating the supported locales for number formatting
- * by having a true-valued property for each such locale with the
- * canonicalized language tag as the property name. The object has no
- * prototype.
- *
- * Usage: availableLocales = intl_NumberFormat_availableLocales()
- */
-extern MOZ_MUST_USE bool
-intl_NumberFormat_availableLocales(JSContext* cx, unsigned argc, Value* vp);
-
-/**
* Returns the numbering system type identifier per Unicode
* Technical Standard 35, Unicode Locale Data Markup Language, for the
* default numbering system for the given locale.
@@ -76,7 +66,7 @@ intl_numberingSystem(JSContext* cx, unsigned argc, Value* vp);
*
* Spec: ECMAScript Internationalization API Specification, 11.3.2.
*
- * Usage: formatted = intl_FormatNumber(numberFormat, x)
+ * Usage: formatted = intl_FormatNumber(numberFormat, x, formatToParts)
*/
extern MOZ_MUST_USE bool
intl_FormatNumber(JSContext* cx, unsigned argc, Value* vp);
diff --git a/js/src/builtin/intl/NumberFormat.js b/js/src/builtin/intl/NumberFormat.js
index c97395880d..238a59405b 100644
--- a/js/src/builtin/intl/NumberFormat.js
+++ b/js/src/builtin/intl/NumberFormat.js
@@ -8,21 +8,10 @@
/**
* NumberFormat internal properties.
*
- * Spec: ECMAScript Internationalization API Specification, 9.1 and 11.2.3.
+ * Spec: ECMAScript Internationalization API Specification, 9.1 and 11.3.3.
*/
var numberFormatInternalProperties = {
localeData: numberFormatLocaleData,
- _availableLocales: null,
- availableLocales: function()
- {
- var locales = this._availableLocales;
- if (locales)
- return locales;
-
- locales = intl_NumberFormat_availableLocales();
- addSpecialMissingLanguageTags(locales);
- return (this._availableLocales = locales);
- },
relevantExtensionKeys: ["nu"]
};
@@ -35,44 +24,38 @@ function resolveNumberFormatInternals(lazyNumberFormatData) {
var internalProps = std_Object_create(null);
- // Step 3.
- var requestedLocales = lazyNumberFormatData.requestedLocales;
-
- // Compute options that impact interpretation of locale.
- // Step 6.
- var opt = lazyNumberFormatData.opt;
-
var NumberFormat = numberFormatInternalProperties;
- // Step 9.
+ // Compute effective locale.
+
+ // Step 7.
var localeData = NumberFormat.localeData;
- // Step 10.
- var r = ResolveLocale(callFunction(NumberFormat.availableLocales, NumberFormat),
+ // Step 8.
+ var r = ResolveLocale("NumberFormat",
lazyNumberFormatData.requestedLocales,
lazyNumberFormatData.opt,
NumberFormat.relevantExtensionKeys,
localeData);
- // Steps 11-12. (Step 13 is not relevant to our implementation.)
+ // Steps 9-10. (Step 11 is not relevant to our implementation.)
internalProps.locale = r.locale;
internalProps.numberingSystem = r.nu;
// Compute formatting options.
- // Step 15.
+ // Step 13.
var s = lazyNumberFormatData.style;
internalProps.style = s;
- // Steps 19, 21.
+ // Steps 17, 19.
if (s === "currency") {
internalProps.currency = lazyNumberFormatData.currency;
internalProps.currencyDisplay = lazyNumberFormatData.currencyDisplay;
}
+ // Step 22.
internalProps.minimumIntegerDigits = lazyNumberFormatData.minimumIntegerDigits;
-
internalProps.minimumFractionDigits = lazyNumberFormatData.minimumFractionDigits;
-
internalProps.maximumFractionDigits = lazyNumberFormatData.maximumFractionDigits;
if ("minimumSignificantDigits" in lazyNumberFormatData) {
@@ -83,12 +66,9 @@ function resolveNumberFormatInternals(lazyNumberFormatData) {
internalProps.maximumSignificantDigits = lazyNumberFormatData.maximumSignificantDigits;
}
- // Step 27.
+ // Step 24.
internalProps.useGrouping = lazyNumberFormatData.useGrouping;
- // Step 34.
- internalProps.boundFormat = undefined;
-
// The caller is responsible for associating |internalProps| with the right
// object using |setInternalProperties|.
return internalProps;
@@ -96,11 +76,13 @@ function resolveNumberFormatInternals(lazyNumberFormatData) {
/**
- * Returns an object containing the NumberFormat internal properties of |obj|,
- * or throws a TypeError if |obj| isn't NumberFormat-initialized.
+ * Returns an object containing the NumberFormat internal properties of |obj|.
*/
-function getNumberFormatInternals(obj, methodName) {
- var internals = getIntlObjectInternals(obj, "NumberFormat", methodName);
+function getNumberFormatInternals(obj) {
+ assert(IsObject(obj), "getNumberFormatInternals called with non-object");
+ assert(IsNumberFormat(obj), "getNumberFormatInternals called with non-NumberFormat");
+
+ var internals = getIntlObjectInternals(obj);
assert(internals.type === "NumberFormat", "bad type escaped getIntlObjectInternals");
// If internal properties have already been computed, use them.
@@ -114,24 +96,45 @@ function getNumberFormatInternals(obj, methodName) {
return internalProps;
}
+
+/**
+ * 11.1.11 UnwrapNumberFormat( nf )
+ */
+function UnwrapNumberFormat(nf, methodName) {
+ // Step 1 (not applicable in our implementation).
+
+ // Step 2.
+ if ((!IsObject(nf) || !IsNumberFormat(nf)) && nf instanceof GetNumberFormatConstructor()) {
+ nf = nf[intlFallbackSymbol()];
+ }
+
+ // Step 3.
+ if (!IsObject(nf) || !IsNumberFormat(nf))
+ ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, "NumberFormat", methodName, "NumberFormat");
+
+ // Step 4.
+ return nf;
+}
+
+
/**
* Applies digit options used for number formatting onto the intl object.
*
* Spec: ECMAScript Internationalization API Specification, 11.1.1.
*/
function SetNumberFormatDigitOptions(lazyData, options, mnfdDefault) {
- // We skip Step 1 because we set the properties on a lazyData object.
+ // We skip step 1 because we set the properties on a lazyData object.
- // Step 2-3.
+ // Steps 2-4.
assert(IsObject(options), "SetNumberFormatDigitOptions");
assert(typeof mnfdDefault === "number", "SetNumberFormatDigitOptions");
- // Steps 4-6.
+ // Steps 5-8.
const mnid = GetNumberOption(options, "minimumIntegerDigits", 1, 21, 1);
const mnfd = GetNumberOption(options, "minimumFractionDigits", 0, 20, mnfdDefault);
const mxfd = GetNumberOption(options, "maximumFractionDigits", mnfd, 20);
- // Steps 7-8.
+ // Steps 9-10.
let mnsd = options.minimumSignificantDigits;
let mxsd = options.maximumSignificantDigits;
@@ -175,17 +178,9 @@ function toASCIIUpperCase(s) {
*
* Spec: ECMAScript Internationalization API Specification, 6.3.1.
*/
-function getIsWellFormedCurrencyCodeRE() {
- return internalIntlRegExps.isWellFormedCurrencyCodeRE ||
- (internalIntlRegExps.isWellFormedCurrencyCodeRE = RegExpCreate("[^A-Z]"));
-}
-
function IsWellFormedCurrencyCode(currency) {
- var c = ToString(currency);
- var normalized = toASCIIUpperCase(c);
- if (normalized.length !== 3)
- return false;
- return !regexp_test_no_statics(getIsWellFormedCurrencyCodeRE(), normalized);
+ assert(typeof currency === "string", "currency is a string value");
+ return currency.length === 3 && IsASCIIAlphaString(currency);
}
/**
@@ -197,17 +192,11 @@ function IsWellFormedCurrencyCode(currency) {
* This later work occurs in |resolveNumberFormatInternals|; steps not noted
* here occur there.
*
- * Spec: ECMAScript Internationalization API Specification, 11.1.1.
+ * Spec: ECMAScript Internationalization API Specification, 11.1.2.
*/
-function InitializeNumberFormat(numberFormat, locales, options) {
- assert(IsObject(numberFormat), "InitializeNumberFormat");
-
- // Step 1.
- if (isInitializedIntlObject(numberFormat))
- ThrowTypeError(JSMSG_INTL_OBJECT_REINITED);
-
- // Step 2.
- var internals = initializeIntlObject(numberFormat);
+function InitializeNumberFormat(numberFormat, thisValue, locales, options) {
+ assert(IsObject(numberFormat), "InitializeNumberFormat called with non-object");
+ assert(IsNumberFormat(numberFormat), "InitializeNumberFormat called with non-NumberFormat");
// Lazy NumberFormat data has the following structure:
//
@@ -222,6 +211,8 @@ function InitializeNumberFormat(numberFormat, locales, options) {
// opt: // opt object computed in InitializeNumberFormat
// {
// localeMatcher: "lookup" / "best fit",
+ //
+ // nu: string matching a Unicode extension type, // optional
// }
//
// minimumIntegerDigits: integer ∈ [1, 21],
@@ -240,11 +231,11 @@ function InitializeNumberFormat(numberFormat, locales, options) {
// subset of them.
var lazyNumberFormatData = std_Object_create(null);
- // Step 3.
+ // Step 1.
var requestedLocales = CanonicalizeLocaleList(locales);
lazyNumberFormatData.requestedLocales = requestedLocales;
- // Steps 4-5.
+ // Steps 2-3.
//
// If we ever need more speed here at startup, we should try to detect the
// case where |options === undefined| and Object.prototype hasn't been
@@ -257,20 +248,30 @@ function InitializeNumberFormat(numberFormat, locales, options) {
options = ToObject(options);
// Compute options that impact interpretation of locale.
- // Step 6.
+ // Step 4.
var opt = new Record();
lazyNumberFormatData.opt = opt;
- // Steps 7-8.
+ // Steps 5-6.
var matcher = GetOption(options, "localeMatcher", "string", ["lookup", "best fit"], "best fit");
opt.localeMatcher = matcher;
+
+ var numberingSystem = GetOption(options, "numberingSystem", "string", undefined, undefined);
+
+ if (numberingSystem !== undefined) {
+ numberingSystem = intl_ValidateAndCanonicalizeUnicodeExtensionType(numberingSystem,
+ "numberingSystem",
+ "nu");
+ }
+
+ opt.nu = numberingSystem;
// Compute formatting options.
- // Step 14.
+ // Step 12.
var s = GetOption(options, "style", "string", ["decimal", "percent", "currency"], "decimal");
lazyNumberFormatData.style = s;
- // Steps 16-19.
+ // Steps 14-17.
var c = GetOption(options, "currency", "string", undefined, undefined);
if (c !== undefined && !IsWellFormedCurrencyCode(c))
ThrowRangeError(JSMSG_INVALID_CURRENCY_CODE, c);
@@ -285,12 +286,12 @@ function InitializeNumberFormat(numberFormat, locales, options) {
cDigits = CurrencyDigits(c);
}
- // Step 20.
+ // Step 18.
var cd = GetOption(options, "currencyDisplay", "string", ["code", "symbol", "name"], "symbol");
if (s === "currency")
lazyNumberFormatData.currencyDisplay = cd;
- // Steps 22-24.
+ // Steps 20-22.
SetNumberFormatDigitOptions(lazyNumberFormatData, options, s === "currency" ? cDigits: 0);
// Step 25.
@@ -304,15 +305,31 @@ function InitializeNumberFormat(numberFormat, locales, options) {
std_Math_max(lazyNumberFormatData.minimumFractionDigits, mxfdDefault);
}
- // Step 26.
+ // Steps 23.
var g = GetOption(options, "useGrouping", "boolean", undefined, true);
lazyNumberFormatData.useGrouping = g;
- // Steps 35-36.
+ // Step 31.
//
// We've done everything that must be done now: mark the lazy data as fully
// computed and install it.
- setLazyData(internals, "NumberFormat", lazyNumberFormatData);
+ initializeIntlObject(numberFormat, "NumberFormat", lazyNumberFormatData);
+
+ // 11.2.1, steps 4-5.
+ // TODO: spec issue - The current spec doesn't have the IsObject check,
+ // which means |Intl.NumberFormat.call(null)| is supposed to throw here.
+ if (numberFormat !== thisValue && thisValue instanceof GetNumberFormatConstructor()) {
+ if (!IsObject(thisValue))
+ ThrowTypeError(JSMSG_NOT_NONNULL_OBJECT, typeof thisValue);
+
+ _DefineDataProperty(thisValue, intlFallbackSymbol(), numberFormat,
+ ATTR_NONENUMERABLE | ATTR_NONCONFIGURABLE | ATTR_NONWRITABLE);
+
+ return thisValue;
+ }
+
+ // 11.2.1, step 6.
+ return numberFormat;
}
@@ -356,17 +373,14 @@ var currencyDigits = {
/**
* Returns the number of decimal digits to be used for the given currency.
*
- * Spec: ECMAScript Internationalization API Specification, 11.1.1.
+ * Spec: ECMAScript Internationalization API Specification, 11.1.3.
*/
-function getCurrencyDigitsRE() {
- return internalIntlRegExps.currencyDigitsRE ||
- (internalIntlRegExps.currencyDigitsRE = RegExpCreate("^[A-Z]{3}$"));
-}
function CurrencyDigits(currency) {
- assert(typeof currency === "string", "CurrencyDigits");
- assert(regexp_test_no_statics(getCurrencyDigitsRE(), currency), "CurrencyDigits");
+ assert(typeof currency === "string", "currency is a string value");
+ assert(IsWellFormedCurrencyCode(currency), "currency is well-formed");
+ assert(currency == toASCIIUpperCase(currency), "currency is all upper-case");
- if (callFunction(std_Object_hasOwnProperty, currencyDigits, currency))
+ if (hasOwn(currency, currencyDigits))
return currencyDigits[currency];
return 2;
}
@@ -377,14 +391,18 @@ function CurrencyDigits(currency) {
* matching (possibly fallback) locale. Locales appear in the same order in the
* returned list as in the input list.
*
- * Spec: ECMAScript Internationalization API Specification, 11.2.2.
+ * Spec: ECMAScript Internationalization API Specification, 11.3.2.
*/
function Intl_NumberFormat_supportedLocalesOf(locales /*, options*/) {
var options = arguments.length > 1 ? arguments[1] : undefined;
- var availableLocales = callFunction(numberFormatInternalProperties.availableLocales,
- numberFormatInternalProperties);
+ // Step 1.
+ var availableLocales = "NumberFormat";
+
+ // Step 2.
var requestedLocales = CanonicalizeLocaleList(locales);
+
+ // Step 3.
return SupportedLocales(availableLocales, requestedLocales, options);
}
@@ -397,8 +415,8 @@ function getNumberingSystems(locale) {
// Algorithmic numbering systems are typically tied to one locale, so for
// lack of information we don't offer them. To increase chances that
// other software will process output correctly, we further restrict to
- // those decimal numbering systems explicitly listed in table 2 of
- // the ECMAScript Internationalization API Specification, 11.3.2, which
+ // those decimal numbering systems explicitly listed in table 3 of
+ // the ECMAScript Internationalization API Specification, 11.1.6, which
// in turn are those with full specifications in version 21 of Unicode
// Technical Standard #35 using digits that were defined in Unicode 5.0,
// the Unicode version supported in Windows Vista.
@@ -416,9 +434,12 @@ function getNumberingSystems(locale) {
}
-function numberFormatLocaleData(locale) {
+function numberFormatLocaleData() {
return {
- nu: getNumberingSystems(locale)
+ nu: getNumberingSystems,
+ default: {
+ nu: intl_numberingSystem,
+ }
};
}
@@ -426,7 +447,7 @@ function numberFormatLocaleData(locale) {
/**
* Function to be bound and returned by Intl.NumberFormat.prototype.format.
*
- * Spec: ECMAScript Internationalization API Specification, 11.3.2.
+ * Spec: ECMAScript Internationalization API Specification, 11.1.4.
*/
function numberFormatFormatToBind(value) {
// Steps 1.a.i implemented by ECMAScript declaration binding instantiation,
@@ -443,31 +464,37 @@ function numberFormatFormatToBind(value) {
* representing the result of calling ToNumber(value) according to the
* effective locale and the formatting options of this NumberFormat.
*
- * Spec: ECMAScript Internationalization API Specification, 11.3.2.
+ * Spec: ECMAScript Internationalization API Specification, 11.4.3.
*/
function Intl_NumberFormat_format_get() {
- // Check "this NumberFormat object" per introduction of section 11.3.
- var internals = getNumberFormatInternals(this, "format");
+ // Steps 1-3.
+ var nf = UnwrapNumberFormat(this, "format");
- // Step 1.
+ var internals = getNumberFormatInternals(nf);
+
+ // Step 4.
if (internals.boundFormat === undefined) {
- // Step 1.a.
- var F = numberFormatFormatToBind;
+ // Steps 4.a-b.
+ var F = callFunction(FunctionBind, numberFormatFormatToBind, nf);
- // Step 1.b-d.
- var bf = callFunction(FunctionBind, F, this);
- internals.boundFormat = bf;
+ // Step 4.c.
+ internals.boundFormat = F;
}
- // Step 2.
+
+ // Step 5.
return internals.boundFormat;
}
+_SetCanonicalName(Intl_NumberFormat_format_get, "get format");
+/**
+ * 11.4.4 Intl.NumberFormat.prototype.formatToParts ( value )
+ */
function Intl_NumberFormat_formatToParts(value) {
- // Step 1.
- var nf = this;
+ // Steps 1-3.
+ var nf = UnwrapNumberFormat(this, "formatToParts");
- // Steps 2-3.
- getNumberFormatInternals(nf, "formatToParts");
+ // Ensure the NumberFormat internals are resolved.
+ getNumberFormatInternals(nf);
// Step 4.
var x = ToNumber(value);
@@ -479,12 +506,15 @@ function Intl_NumberFormat_formatToParts(value) {
/**
* Returns the resolved options for a NumberFormat object.
*
- * Spec: ECMAScript Internationalization API Specification, 11.3.3 and 11.4.
+ * Spec: ECMAScript Internationalization API Specification, 11.4.5.
*/
function Intl_NumberFormat_resolvedOptions() {
- // Check "this NumberFormat object" per introduction of section 11.3.
- var internals = getNumberFormatInternals(this, "resolvedOptions");
+ // Steps 1-3.
+ var nf = UnwrapNumberFormat(this, "resolvedOptions");
+
+ var internals = getNumberFormatInternals(nf);
+ // Steps 4-5.
var result = {
locale: internals.locale,
numberingSystem: internals.numberingSystem,
@@ -494,17 +524,31 @@ function Intl_NumberFormat_resolvedOptions() {
maximumFractionDigits: internals.maximumFractionDigits,
useGrouping: internals.useGrouping
};
- var optionalProperties = [
- "currency",
- "currencyDisplay",
- "minimumSignificantDigits",
- "maximumSignificantDigits"
- ];
- for (var i = 0; i < optionalProperties.length; i++) {
- var p = optionalProperties[i];
- if (callFunction(std_Object_hasOwnProperty, internals, p))
- _DefineDataProperty(result, p, internals[p]);
+
+ // currency and currencyDisplay are only present for currency formatters.
+ assert(hasOwn("currency", internals) === (internals.style === "currency"),
+ "currency is present iff style is 'currency'");
+ assert(hasOwn("currencyDisplay", internals) === (internals.style === "currency"),
+ "currencyDisplay is present iff style is 'currency'");
+
+ if (hasOwn("currency", internals)) {
+ _DefineDataProperty(result, "currency", internals.currency);
+ _DefineDataProperty(result, "currencyDisplay", internals.currencyDisplay);
}
+
+ // Min/Max significant digits are either both present or not at all.
+ assert(hasOwn("minimumSignificantDigits", internals) ===
+ hasOwn("maximumSignificantDigits", internals),
+ "minimumSignificantDigits is present iff maximumSignificantDigits is present");
+
+ if (hasOwn("minimumSignificantDigits", internals)) {
+ _DefineDataProperty(result, "minimumSignificantDigits",
+ internals.minimumSignificantDigits);
+ _DefineDataProperty(result, "maximumSignificantDigits",
+ internals.maximumSignificantDigits);
+ }
+
+ // Step 6.
return result;
}
diff --git a/js/src/builtin/intl/PluralRules.cpp b/js/src/builtin/intl/PluralRules.cpp
index 624b1510a5..e1e8e37044 100644
--- a/js/src/builtin/intl/PluralRules.cpp
+++ b/js/src/builtin/intl/PluralRules.cpp
@@ -28,7 +28,6 @@ using namespace js;
using mozilla::AssertedCast;
using js::intl::CallICU;
-using js::intl::GetAvailableLocales;
using js::intl::IcuLocale;
using js::intl::INITIAL_CHAR_BUFFER_SIZE;
using js::intl::StringsAreEqual;
@@ -79,7 +78,7 @@ static const JSFunctionSpec pluralRules_methods[] = {
/**
* PluralRules constructor.
- * Spec: ECMAScript 402 API, PluralRules, 1.1
+ * Spec: ECMAScript 402 API, PluralRules, 13.2.1
*/
static bool
PluralRules(JSContext* cx, const CallArgs& args, bool construct)
@@ -113,8 +112,8 @@ PluralRules(JSContext* cx, const CallArgs& args, bool construct)
if (!obj)
return false;
- obj->as<NativeObject>().setReservedSlot(PluralRulesObject::INTERNALS_SLOT, NullValue());
- obj->as<NativeObject>().setReservedSlot(PluralRulesObject::UPLURAL_RULES_SLOT, PrivateValue(nullptr));
+ obj->as<PluralRulesObject>().setReservedSlot(PluralRulesObject::INTERNALS_SLOT, NullValue());
+ obj->as<PluralRulesObject>().setReservedSlot(PluralRulesObject::UPLURAL_RULES_SLOT, PrivateValue(nullptr));
}
RootedValue locales(cx, args.get(0));
@@ -147,15 +146,9 @@ js::PluralRulesObject::finalize(FreeOp* fop, JSObject* obj)
{
MOZ_ASSERT(fop->onMainThread());
- // This is-undefined check shouldn't be necessary, but for internal
- // brokenness in object allocation code. For the moment, hack around it by
- // explicitly guarding against the possibility of the reserved slot not
- // containing a private. See bug 949220.
const Value& slot = obj->as<PluralRulesObject>().getReservedSlot(PluralRulesObject::UPLURAL_RULES_SLOT);
- if (!slot.isUndefined()) {
- if (UPluralRules* pr = static_cast<UPluralRules*>(slot.toPrivate()))
- uplrules_close(pr);
- }
+ if (UPluralRules* pr = static_cast<UPluralRules*>(slot.toPrivate()))
+ uplrules_close(pr);
}
JSObject*
@@ -166,10 +159,9 @@ js::CreatePluralRulesPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalOb
if (!ctor)
return nullptr;
- RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global, &PluralRulesObject::class_));
+ RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
if (!proto)
return nullptr;
- proto->setReservedSlot(PluralRulesObject::UPLURAL_RULES_SLOT, PrivateValue(nullptr));
if (!LinkConstructorAndPrototype(cx, ctor, proto))
return nullptr;
@@ -180,16 +172,6 @@ js::CreatePluralRulesPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalOb
if (!JS_DefineFunctions(cx, proto, pluralRules_methods))
return nullptr;
- RootedValue options(cx);
- if (!intl::CreateDefaultOptions(cx, &options))
- return nullptr;
-
- if (!intl::InitializeObject(cx, proto, cx->names().InitializePluralRules, UndefinedHandleValue,
- options))
- {
- return nullptr;
- }
-
RootedValue ctorValue(cx, ObjectValue(*ctor));
if (!DefineProperty(cx, Intl, cx->names().PluralRules, ctorValue, nullptr, nullptr, 0))
return nullptr;
@@ -197,21 +179,6 @@ js::CreatePluralRulesPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalOb
return proto;
}
-bool
-js::intl_PluralRules_availableLocales(JSContext* cx, unsigned argc, Value* vp)
-{
- CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 0);
-
- RootedValue result(cx);
- // We're going to use ULocale availableLocales as per ICU recommendation:
- // https://ssl.icu-project.org/trac/ticket/12756
- if (!GetAvailableLocales(cx, uloc_countAvailable, uloc_getAvailable, &result))
- return false;
- args.rval().set(result);
- return true;
-}
-
/**
*
* This creates new UNumberFormat with calculated digit formatting
@@ -222,7 +189,7 @@ js::intl_PluralRules_availableLocales(JSContext* cx, unsigned argc, Value* vp)
*
*/
static UNumberFormat*
-NewUNumberFormatForPluralRules(JSContext* cx, HandleObject pluralRules)
+NewUNumberFormatForPluralRules(JSContext* cx, Handle<PluralRulesObject*> pluralRules)
{
RootedObject internals(cx, intl::GetInternalsObject(cx, pluralRules));
if (!internals)
@@ -299,7 +266,7 @@ js::intl_SelectPluralRule(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
- RootedObject pluralRules(cx, &args[0].toObject());
+ Rooted<PluralRulesObject*> pluralRules(cx, &args[0].toObject().as<PluralRulesObject>());
UNumberFormat* nf = NewUNumberFormatForPluralRules(cx, pluralRules);
if (!nf)
diff --git a/js/src/builtin/intl/PluralRules.h b/js/src/builtin/intl/PluralRules.h
index 0ff408c1a8..6f8e09ac80 100644
--- a/js/src/builtin/intl/PluralRules.h
+++ b/js/src/builtin/intl/PluralRules.h
@@ -50,17 +50,6 @@ extern MOZ_MUST_USE bool
intl_PluralRules(JSContext* cx, unsigned argc, Value* vp);
/**
- * Returns an object indicating the supported locales for plural rules
- * by having a true-valued property for each such locale with the
- * canonicalized language tag as the property name. The object has no
- * prototype.
- *
- * Usage: availableLocales = intl_PluralRules_availableLocales()
- */
-extern MOZ_MUST_USE bool
-intl_PluralRules_availableLocales(JSContext* cx, unsigned argc, Value* vp);
-
-/**
* Returns a plural rule for the number x according to the effective
* locale and the formatting options of the given PluralRules.
*
diff --git a/js/src/builtin/intl/PluralRules.js b/js/src/builtin/intl/PluralRules.js
index 0ba289d85e..eb19bf067e 100644
--- a/js/src/builtin/intl/PluralRules.js
+++ b/js/src/builtin/intl/PluralRules.js
@@ -7,22 +7,20 @@
/**
* PluralRules internal properties.
*
- * Spec: ECMAScript 402 API, PluralRules, 1.3.3.
+ * Spec: ECMAScript 402 API, PluralRules, 13.3.3.
*/
var pluralRulesInternalProperties = {
- _availableLocales: null,
- availableLocales: function()
- {
- var locales = this._availableLocales;
- if (locales)
- return locales;
-
- locales = intl_PluralRules_availableLocales();
- addSpecialMissingLanguageTags(locales);
- return (this._availableLocales = locales);
- }
+ localeData: pluralRulesLocaleData,
+ relevantExtensionKeys: [],
};
+
+function pluralRulesLocaleData() {
+ // PluralRules don't support any extension keys.
+ return {};
+}
+
+
/**
* Compute an internal properties object from |lazyPluralRulesData|.
*/
@@ -35,20 +33,25 @@ function resolvePluralRulesInternals(lazyPluralRulesData) {
var PluralRules = pluralRulesInternalProperties;
- // Step 13.
- const r = ResolveLocale(callFunction(PluralRules.availableLocales, PluralRules),
- lazyPluralRulesData.requestedLocales,
- lazyPluralRulesData.opt,
- noRelevantExtensionKeys, undefined);
+ // Compute effective locale.
+
+ // Step 10.
+ var localeData = PluralRules.localeData;
- // Step 14.
+ // Step 11.
+ const r = ResolveLocale("PluralRules",
+ lazyPluralRulesData.requestedLocales,
+ lazyPluralRulesData.opt,
+ PluralRules.relevantExtensionKeys,
+ localeData);
+
+ // Step 12.
internalProps.locale = r.locale;
- internalProps.type = lazyPluralRulesData.type;
- internalProps.pluralCategories = intl_GetPluralCategories(
- internalProps.locale,
- internalProps.type);
+ // Step 8.
+ internalProps.type = lazyPluralRulesData.type;
+ // Step 9.
internalProps.minimumIntegerDigits = lazyPluralRulesData.minimumIntegerDigits;
internalProps.minimumFractionDigits = lazyPluralRulesData.minimumFractionDigits;
internalProps.maximumFractionDigits = lazyPluralRulesData.maximumFractionDigits;
@@ -59,15 +62,20 @@ function resolvePluralRulesInternals(lazyPluralRulesData) {
internalProps.maximumSignificantDigits = lazyPluralRulesData.maximumSignificantDigits;
}
+ // Step 13 (lazily computed on first access).
+ internalProps.pluralCategories = null;
+
return internalProps;
}
/**
- * Returns an object containing the PluralRules internal properties of |obj|,
- * or throws a TypeError if |obj| isn't PluralRules-initialized.
+ * Returns an object containing the PluralRules internal properties of |obj|.
*/
-function getPluralRulesInternals(obj, methodName) {
- var internals = getIntlObjectInternals(obj, "PluralRules", methodName);
+function getPluralRulesInternals(obj) {
+ assert(IsObject(obj), "getPluralRulesInternals called with non-object");
+ assert(IsPluralRules(obj), "getPluralRulesInternals called with non-PluralRules");
+
+ var internals = getIntlObjectInternals(obj);
assert(internals.type === "PluralRules", "bad type escaped getIntlObjectInternals");
var internalProps = maybeInternalProperties(internals);
@@ -88,16 +96,11 @@ function getPluralRulesInternals(obj, methodName) {
* This later work occurs in |resolvePluralRulesInternals|; steps not noted
* here occur there.
*
- * Spec: ECMAScript 402 API, PluralRules, 1.1.1.
+ * Spec: ECMAScript 402 API, PluralRules, 13.1.1.
*/
function InitializePluralRules(pluralRules, locales, options) {
- assert(IsObject(pluralRules), "InitializePluralRules");
-
- // Step 1.
- if (isInitializedIntlObject(pluralRules))
- ThrowTypeError(JSMSG_INTL_OBJECT_REINITED);
-
- let internals = initializeIntlObject(pluralRules);
+ assert(IsObject(pluralRules), "InitializePluralRules called with non-object");
+ assert(IsPluralRules(pluralRules), "InitializePluralRules called with non-PluralRules");
// Lazy PluralRules data has the following structure:
//
@@ -124,30 +127,29 @@ function InitializePluralRules(pluralRules, locales, options) {
// subset of them.
const lazyPluralRulesData = std_Object_create(null);
- // Step 3.
+ // Step 1.
let requestedLocales = CanonicalizeLocaleList(locales);
lazyPluralRulesData.requestedLocales = requestedLocales;
- // Steps 4-5.
+ // Steps 2-3.
if (options === undefined)
options = {};
else
options = ToObject(options);
- // Step 6.
- const type = GetOption(options, "type", "string", ["cardinal", "ordinal"], "cardinal");
- lazyPluralRulesData.type = type;
-
- // Step 8.
+ // Step 4.
let opt = new Record();
lazyPluralRulesData.opt = opt;
- // Steps 9-10.
+ // Steps 5-6.
let matcher = GetOption(options, "localeMatcher", "string", ["lookup", "best fit"], "best fit");
opt.localeMatcher = matcher;
+ // Step 7.
+ const type = GetOption(options, "type", "string", ["cardinal", "ordinal"], "cardinal");
+ lazyPluralRulesData.type = type;
- // Step 11.
+ // Step 9.
SetNumberFormatDigitOptions(lazyPluralRulesData, options, 0);
// Step 12.
@@ -156,7 +158,11 @@ function InitializePluralRules(pluralRules, locales, options) {
std_Math_max(lazyPluralRulesData.minimumFractionDigits, 3);
}
- setLazyData(internals, "PluralRules", lazyPluralRulesData)
+ // Step 15.
+ //
+ // We've done everything that must be done now: mark the lazy data as fully
+ // computed and install it.
+ initializeIntlObject(pluralRules, "PluralRules", lazyPluralRulesData)
}
/**
@@ -164,14 +170,14 @@ function InitializePluralRules(pluralRules, locales, options) {
* matching (possibly fallback) locale. Locales appear in the same order in the
* returned list as in the input list.
*
- * Spec: ECMAScript 402 API, PluralRules, 1.3.2.
+ * Spec: ECMAScript 402 API, PluralRules, 13.3.2.
*/
function Intl_PluralRules_supportedLocalesOf(locales /*, options*/) {
var options = arguments.length > 1 ? arguments[1] : undefined;
// Step 1.
- var availableLocales = callFunction(pluralRulesInternalProperties.availableLocales,
- pluralRulesInternalProperties);
+ var availableLocales = "PluralRules";
+
// Step 2.
let requestedLocales = CanonicalizeLocaleList(locales);
@@ -184,15 +190,20 @@ function Intl_PluralRules_supportedLocalesOf(locales /*, options*/) {
* the number passed as value according to the
* effective locale and the formatting options of this PluralRules.
*
- * Spec: ECMAScript 402 API, PluralRules, 1.4.3.
+ * Spec: ECMAScript 402 API, PluralRules, 13.4.3.
*/
function Intl_PluralRules_select(value) {
// Step 1.
let pluralRules = this;
- // Step 2.
- let internals = getPluralRulesInternals(pluralRules, "select");
- // Steps 3-4.
+ // Steps 2-3.
+ if (!IsObject(pluralRules) || !IsPluralRules(pluralRules))
+ ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, "PluralRules", "select", "PluralRules");
+
+ // Ensure the PluralRules internals are resolved.
+ getPluralRulesInternals(pluralRules);
+
+ // Step 4.
let n = ToNumber(value);
// Step 5.
@@ -202,11 +213,34 @@ function Intl_PluralRules_select(value) {
/**
* Returns the resolved options for a PluralRules object.
*
- * Spec: ECMAScript 402 API, PluralRules, 1.4.4.
+ * Spec: ECMAScript 402 API, PluralRules, 13.4.4.
*/
function Intl_PluralRules_resolvedOptions() {
- var internals = getPluralRulesInternals(this, "resolvedOptions");
+ // Step 1.
+ var pluralRules = this;
+
+ // Steps 2-3.
+ if (!IsObject(pluralRules) || !IsPluralRules(pluralRules)) {
+ ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, "PluralRules", "resolvedOptions",
+ "PluralRules");
+ }
+
+ var internals = getPluralRulesInternals(pluralRules);
+
+ var internalsPluralCategories = internals.pluralCategories;
+ if (internalsPluralCategories === null) {
+ internalsPluralCategories = intl_GetPluralCategories(internals.locale, internals.type);
+ internals.pluralCategories = internalsPluralCategories;
+ }
+
+ // TODO: The current spec actually requires to return the internal array
+ // object and not a copy of it.
+ // <https://github.com/tc39/proposal-intl-plural-rules/issues/28#issuecomment-341557030>
+ var pluralCategories = [];
+ for (var i = 0; i < internalsPluralCategories.length; i++)
+ _DefineDataProperty(pluralCategories, i, internalsPluralCategories[i]);
+ // Steps 4-5.
var result = {
locale: internals.locale,
type: internals.type,
@@ -216,16 +250,19 @@ function Intl_PluralRules_resolvedOptions() {
maximumFractionDigits: internals.maximumFractionDigits,
};
- var optionalProperties = [
- "minimumSignificantDigits",
- "maximumSignificantDigits"
- ];
+ // Min/Max significant digits are either both present or not at all.
+ assert(hasOwn("minimumSignificantDigits", internals) ===
+ hasOwn("maximumSignificantDigits", internals),
+ "minimumSignificantDigits is present iff maximumSignificantDigits is present");
- for (var i = 0; i < optionalProperties.length; i++) {
- var p = optionalProperties[i];
- if (callFunction(std_Object_hasOwnProperty, internals, p))
- _DefineDataProperty(result, p, internals[p]);
+ if (hasOwn("minimumSignificantDigits", internals)) {
+ _DefineDataProperty(result, "minimumSignificantDigits",
+ internals.minimumSignificantDigits);
+ _DefineDataProperty(result, "maximumSignificantDigits",
+ internals.maximumSignificantDigits);
}
+
+ // Step 6.
return result;
}
diff --git a/js/src/builtin/intl/RelativeTimeFormat.cpp b/js/src/builtin/intl/RelativeTimeFormat.cpp
index eb8d152d63..31e481a3b2 100644
--- a/js/src/builtin/intl/RelativeTimeFormat.cpp
+++ b/js/src/builtin/intl/RelativeTimeFormat.cpp
@@ -26,7 +26,6 @@ using mozilla::Range;
using mozilla::RangedPtr;
using js::intl::CallICU;
-using js::intl::GetAvailableLocales;
using js::intl::IcuLocale;
using js::intl::INITIAL_CHAR_BUFFER_SIZE;
using js::intl::StringsAreEqual;
@@ -108,8 +107,8 @@ RelativeTimeFormat(JSContext* cx, unsigned argc, Value* vp)
if (!relativeTimeFormat)
return false;
- relativeTimeFormat->as<NativeObject>().setReservedSlot(RelativeTimeFormatObject::INTERNALS_SLOT, NullValue());
- relativeTimeFormat->as<NativeObject>().setReservedSlot(RelativeTimeFormatObject::URELATIVE_TIME_FORMAT_SLOT, PrivateValue(nullptr));
+ relativeTimeFormat->as<RelativeTimeFormatObject>().setReservedSlot(RelativeTimeFormatObject::INTERNALS_SLOT, NullValue());
+ relativeTimeFormat->as<RelativeTimeFormatObject>().setReservedSlot(RelativeTimeFormatObject::URELATIVE_TIME_FORMAT_SLOT, PrivateValue(nullptr));
RootedValue locales(cx, args.get(0));
RootedValue options(cx, args.get(1));
@@ -127,15 +126,9 @@ js::RelativeTimeFormatObject::finalize(FreeOp* fop, JSObject* obj)
{
MOZ_ASSERT(fop->onMainThread());
- // This is-undefined check shouldn't be necessary, but for internal
- // brokenness in object allocation code. For the moment, hack around it by
- // explicitly guarding against the possibility of the reserved slot not
- // containing a private. See bug 949220.
const Value& slot = obj->as<RelativeTimeFormatObject>().getReservedSlot(RelativeTimeFormatObject::URELATIVE_TIME_FORMAT_SLOT);
- if (!slot.isUndefined()) {
- if (URelativeDateTimeFormatter* rtf = static_cast<URelativeDateTimeFormatter*>(slot.toPrivate()))
- ureldatefmt_close(rtf);
- }
+ if (URelativeDateTimeFormatter* rtf = static_cast<URelativeDateTimeFormatter*>(slot.toPrivate()))
+ ureldatefmt_close(rtf);
}
JSObject*
@@ -146,10 +139,9 @@ js::CreateRelativeTimeFormatPrototype(JSContext* cx, HandleObject Intl, Handle<G
if (!ctor)
return nullptr;
- RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global, &RelativeTimeFormatObject::class_));
+ RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
if (!proto)
return nullptr;
- proto->setReservedSlot(RelativeTimeFormatObject::URELATIVE_TIME_FORMAT_SLOT, PrivateValue(nullptr));
if (!LinkConstructorAndPrototype(cx, ctor, proto))
return nullptr;
@@ -163,16 +155,6 @@ js::CreateRelativeTimeFormatPrototype(JSContext* cx, HandleObject Intl, Handle<G
if (!JS_DefineProperties(cx, proto, relativeTimeFormat_properties))
return nullptr;
- RootedValue options(cx);
- if (!intl::CreateDefaultOptions(cx, &options))
- return nullptr;
-
- if (!intl::InitializeObject(cx, proto, cx->names().InitializeRelativeTimeFormat, UndefinedHandleValue,
- options))
- {
- return nullptr;
- }
-
RootedValue ctorValue(cx, ObjectValue(*ctor));
if (!DefineProperty(cx, Intl, cx->names().RelativeTimeFormat, ctorValue, nullptr, nullptr, 0)) {
return nullptr;
@@ -181,22 +163,6 @@ js::CreateRelativeTimeFormatPrototype(JSContext* cx, HandleObject Intl, Handle<G
return proto;
}
-bool
-js::intl_RelativeTimeFormat_availableLocales(JSContext* cx, unsigned argc, Value* vp)
-{
- CallArgs args = CallArgsFromVp(argc, vp);
- MOZ_ASSERT(args.length() == 0);
-
- RootedValue result(cx);
- // We're going to use ULocale availableLocales as per ICU recommendation:
- // https://ssl.icu-project.org/trac/ticket/12756
- if (!GetAvailableLocales(cx, uloc_countAvailable, uloc_getAvailable, &result))
- return false;
- args.rval().set(result);
- return true;
-}
-
-
enum class RelativeTimeNumeric
{
/**
diff --git a/js/src/builtin/intl/RelativeTimeFormat.h b/js/src/builtin/intl/RelativeTimeFormat.h
index 4f3374d555..85b6d645b4 100644
--- a/js/src/builtin/intl/RelativeTimeFormat.h
+++ b/js/src/builtin/intl/RelativeTimeFormat.h
@@ -40,17 +40,6 @@ CreateRelativeTimeFormatPrototype(JSContext* cx, JS::Handle<JSObject*> Intl,
JS::Handle<GlobalObject*> global);
/**
- * Returns an object indicating the supported locales for relative time format
- * by having a true-valued property for each such locale with the
- * canonicalized language tag as the property name. The object has no
- * prototype.
- *
- * Usage: availableLocales = intl_RelativeTimeFormat_availableLocales()
- */
-extern MOZ_MUST_USE bool
-intl_RelativeTimeFormat_availableLocales(JSContext* cx, unsigned argc, Value* vp);
-
-/**
* Returns a relative time as a string formatted according to the effective
* locale and the formatting options of the given RelativeTimeFormat.
*
diff --git a/js/src/builtin/intl/RelativeTimeFormat.js b/js/src/builtin/intl/RelativeTimeFormat.js
index 7cb8d3b083..91348a70b8 100644
--- a/js/src/builtin/intl/RelativeTimeFormat.js
+++ b/js/src/builtin/intl/RelativeTimeFormat.js
@@ -11,17 +11,6 @@
*/
var relativeTimeFormatInternalProperties = {
localeData: relativeTimeFormatLocaleData,
- _availableLocales: null,
- availableLocales: function() // eslint-disable-line object-shorthand
- {
- var locales = this._availableLocales;
- if (locales)
- return locales;
-
- locales = intl_RelativeTimeFormat_availableLocales();
- addSpecialMissingLanguageTags(locales);
- return (this._availableLocales = locales);
- },
relevantExtensionKeys: [],
};
@@ -41,7 +30,7 @@ function resolveRelativeTimeFormatInternals(lazyRelativeTimeFormatData) {
var RelativeTimeFormat = relativeTimeFormatInternalProperties;
// Steps 7-8.
- const r = ResolveLocale(callFunction(RelativeTimeFormat.availableLocales, RelativeTimeFormat),
+ const r = ResolveLocale("RelativeTimeFormat",
lazyRelativeTimeFormatData.requestedLocales,
lazyRelativeTimeFormatData.opt,
RelativeTimeFormat.relevantExtensionKeys,
@@ -69,8 +58,11 @@ function resolveRelativeTimeFormatInternals(lazyRelativeTimeFormatData) {
* Returns an object containing the RelativeTimeFormat internal properties of |obj|,
* or throws a TypeError if |obj| isn't RelativeTimeFormat-initialized.
*/
-function getRelativeTimeFormatInternals(obj, methodName) {
- var internals = getIntlObjectInternals(obj, "RelativeTimeFormat", methodName);
+function getRelativeTimeFormatInternals(obj) {
+ assert(IsObject(obj), "getRelativeTimeFormatInternals called with non-object");
+ assert(IsRelativeTimeFormat(obj), "getRelativeTimeFormatInternals called with non-RelativeTimeFormat");
+
+ var internals = getIntlObjectInternals(obj);
assert(internals.type === "RelativeTimeFormat", "bad type escaped getIntlObjectInternals");
var internalProps = maybeInternalProperties(internals);
@@ -94,12 +86,8 @@ function getRelativeTimeFormatInternals(obj, methodName) {
* Spec: ECMAScript 402 API, RelativeTimeFormat, 1.1.1.
*/
function InitializeRelativeTimeFormat(relativeTimeFormat, locales, options) {
- assert(IsObject(relativeTimeFormat), "InitializeRelativeTimeFormat");
-
- if (isInitializedIntlObject(relativeTimeFormat))
- ThrowTypeError(JSMSG_INTL_OBJECT_REINITED);
-
- let internals = initializeIntlObject(relativeTimeFormat);
+ assert(IsObject(relativeTimeFormat), "InitializeRelativeTimeFormat called with non-object");
+ assert(IsRelativeTimeFormat(relativeTimeFormat), "InitializeRelativeTimeFormat called with non-RelativeTimeFormat");
// Lazy RelativeTimeFormat data has the following structure:
//
@@ -146,7 +134,7 @@ function InitializeRelativeTimeFormat(relativeTimeFormat, locales, options) {
const numeric = GetOption(options, "numeric", "string", ["always", "auto"], "always");
lazyRelativeTimeFormatData.numeric = numeric;
- setLazyData(internals, "RelativeTimeFormat", lazyRelativeTimeFormatData)
+ initializeIntlObject(relativeTimeFormat, "RelativeTimeFormat", lazyRelativeTimeFormatData)
}
/**
@@ -160,8 +148,8 @@ function Intl_RelativeTimeFormat_supportedLocalesOf(locales /*, options*/) {
var options = arguments.length > 1 ? arguments[1] : undefined;
// Step 1.
- var availableLocales = callFunction(relativeTimeFormatInternalProperties.availableLocales,
- relativeTimeFormatInternalProperties);
+ var availableLocales = "RelativeTimeFormat";
+
// Step 2.
let requestedLocales = CanonicalizeLocaleList(locales);
@@ -181,7 +169,11 @@ function Intl_RelativeTimeFormat_format(value, unit) {
let relativeTimeFormat = this;
// Step 2.
- let internals = getRelativeTimeFormatInternals(relativeTimeFormat, "format");
+ if (!IsObject(relativeTimeFormat) || !IsRelativeTimeFormat(relativeTimeFormat))
+ ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, "RelativeTimeFormat", "format", "RelativeTimeFormat");
+
+ // Ensure the RelativeTimeFormat internals are resolved.
+ let internals = getRelativeTimeFormatInternals(relativeTimeFormat);
// Step 3.
let t = ToNumber(value);
@@ -191,7 +183,7 @@ function Intl_RelativeTimeFormat_format(value, unit) {
// PartitionRelativeTimePattern, step 4.
if (!Number_isFinite(t)) {
- ThrowRangeError(JSMSG_DATE_NOT_FINITE, "RelativeTimeFormat");
+ ThrowRangeError(JSMSG_DATE_NOT_FINITE, "RelativeTimeFormat", "format");
}
// PartitionRelativeTimePattern, step 5.
@@ -227,7 +219,13 @@ function Intl_RelativeTimeFormat_format(value, unit) {
* Spec: ECMAScript 402 API, RelativeTimeFormat, 1.4.4.
*/
function Intl_RelativeTimeFormat_resolvedOptions() {
- var internals = getRelativeTimeFormatInternals(this, "resolvedOptions");
+ // Check "this RelativeTimeFormat object" per introduction of section 1.4.
+ if (!IsObject(this) || !IsRelativeTimeFormat(this)) {
+ ThrowTypeError(JSMSG_INTL_OBJECT_NOT_INITED, "RelativeTimeFormat", "resolvedOptions",
+ "RelativeTimeFormat");
+ }
+
+ var internals = getRelativeTimeFormatInternals(this);
// Steps 4-5.
var result = {
diff --git a/js/src/builtin/intl/SharedIntlData.cpp b/js/src/builtin/intl/SharedIntlData.cpp
index def8ceaf07..6aeea0ad93 100644
--- a/js/src/builtin/intl/SharedIntlData.cpp
+++ b/js/src/builtin/intl/SharedIntlData.cpp
@@ -10,6 +10,7 @@
#include "mozilla/Assertions.h"
#include "mozilla/HashFunctions.h"
+#include <algorithm>
#include <stdint.h>
#include "jsatom.h"
@@ -21,6 +22,7 @@
#include "builtin/intl/ScopedICUObject.h"
#include "builtin/intl/TimeZoneDataGenerated.h"
#include "js/Utility.h"
+#include "js/Vector.h"
using js::HashNumber;
using js::intl::StringsAreEqual;
@@ -29,9 +31,7 @@ template<typename Char>
static constexpr Char
ToUpperASCII(Char c)
{
- return ('a' <= c && c <= 'z')
- ? (c & ~0x20)
- : c;
+ return mozilla::IsAsciiLowercaseAlpha(c) ? (c - 0x20) : c;
}
static_assert(ToUpperASCII('a') == 'A', "verifying 'a' uppercases correctly");
@@ -63,15 +63,12 @@ EqualCharsIgnoreCaseASCII(const Char1* s1, const Char2* s2, size_t len)
}
js::intl::SharedIntlData::TimeZoneHasher::Lookup::Lookup(JSFlatString* timeZone)
- : isLatin1(timeZone->hasLatin1Chars()), length(timeZone->length())
+ : js::intl::SharedIntlData::LinearStringLookup(timeZone)
{
- if (isLatin1) {
- latin1Chars = timeZone->latin1Chars(nogc);
+ if (isLatin1)
hash = HashStringIgnoreCaseASCII(latin1Chars, length);
- } else {
- twoByteChars = timeZone->twoByteChars(nogc);
+ else
hash = HashStringIgnoreCaseASCII(twoByteChars, length);
- }
}
bool
@@ -110,7 +107,7 @@ js::intl::SharedIntlData::ensureTimeZones(JSContext* cx)
if (timeZoneDataInitialized)
return true;
- // If initTimeZones() was called previously, but didn't complete due to
+ // If ensureTimeZones() was called previously, but didn't complete due to
// OOM, clear all sets/maps and start from scratch.
if (availableTimeZones.initialized())
availableTimeZones.finish();
@@ -272,12 +269,307 @@ js::intl::SharedIntlData::tryCanonicalizeTimeZoneConsistentWithIANA(JSContext* c
return true;
}
+js::intl::SharedIntlData::LocaleHasher::Lookup::Lookup(JSLinearString* locale)
+ : js::intl::SharedIntlData::LinearStringLookup(locale)
+{
+ if (isLatin1)
+ hash = mozilla::HashString(latin1Chars, length);
+ else
+ hash = mozilla::HashString(twoByteChars, length);
+}
+
+js::intl::SharedIntlData::LocaleHasher::Lookup::Lookup(const char* chars,
+ size_t length)
+ : js::intl::SharedIntlData::LinearStringLookup(chars, length)
+{
+ hash = mozilla::HashString(latin1Chars, length);
+}
+
+bool
+js::intl::SharedIntlData::LocaleHasher::match(Locale key, const Lookup& lookup)
+{
+ if (key->length() != lookup.length)
+ return false;
+
+ if (key->hasLatin1Chars()) {
+ const Latin1Char* keyChars = key->latin1Chars(lookup.nogc);
+ if (lookup.isLatin1)
+ return EqualChars(keyChars, lookup.latin1Chars, lookup.length);
+ return EqualChars(keyChars, lookup.twoByteChars, lookup.length);
+ }
+
+ const char16_t* keyChars = key->twoByteChars(lookup.nogc);
+ if (lookup.isLatin1)
+ return EqualChars(lookup.latin1Chars, keyChars, lookup.length);
+ return EqualChars(keyChars, lookup.twoByteChars, lookup.length);
+}
+
+bool
+js::intl::SharedIntlData::getAvailableLocales(JSContext* cx, LocaleSet& locales,
+ CountAvailable countAvailable,
+ GetAvailable getAvailable)
+{
+ auto addLocale = [cx, &locales](const char* locale, size_t length) {
+ JSAtom* atom = Atomize(cx, locale, length);
+ if (!atom)
+ return false;
+
+ LocaleHasher::Lookup lookup(atom);
+ LocaleSet::AddPtr p = locales.lookupForAdd(lookup);
+
+ // ICU shouldn't report any duplicate locales, but if it does, just
+ // ignore the duplicated locale.
+ if (!p && !locales.add(p, atom)) {
+ ReportOutOfMemory(cx);
+ return false;
+ }
+
+ return true;
+ };
+
+ js::Vector<char, 16> lang(cx);
+
+ int32_t count = countAvailable();
+ for (int32_t i = 0; i < count; i++) {
+ const char* locale = getAvailable(i);
+ size_t length = strlen(locale);
+
+ lang.clear();
+ if (!lang.append(locale, length))
+ return false;
+
+ std::replace(lang.begin(), lang.end(), '_', '-');
+
+ if (!addLocale(lang.begin(), length))
+ return false;
+ }
+
+ // Add old-style language tags without script code for locales that in current
+ // usage would include a script subtag. Also add an entry for the last-ditch
+ // locale, in case ICU doesn't directly support it (but does support it
+ // through fallback, e.g. supporting "en-GB" indirectly using "en" support).
+
+ // Certain old-style language tags lack a script code, but in current usage
+ // they *would* include a script code. Map these over to modern forms.
+ for (const auto& mapping : js::intl::oldStyleLanguageTagMappings) {
+ const char* oldStyle = mapping.oldStyle;
+ const char* modernStyle = mapping.modernStyle;
+
+ LocaleHasher::Lookup lookup(modernStyle, strlen(modernStyle));
+ if (locales.has(lookup)) {
+ if (!addLocale(oldStyle, strlen(oldStyle)))
+ return false;
+ }
+ }
+
+ // Also forcibly provide the last-ditch locale.
+ {
+ const char* lastDitch = intl::LastDitchLocale();
+ MOZ_ASSERT(strcmp(lastDitch, "en-GB") == 0);
+
+#ifdef DEBUG
+ static constexpr char lastDitchParent[] = "en";
+
+ LocaleHasher::Lookup lookup(lastDitchParent, strlen(lastDitchParent));
+ MOZ_ASSERT(locales.has(lookup),
+ "shouldn't be a need to add every locale implied by the "
+ "last-ditch locale, merely just the last-ditch locale");
+#endif
+
+ if (!addLocale(lastDitch, strlen(lastDitch)))
+ return false;
+ }
+
+ return true;
+}
+
+#ifdef DEBUG
+template <typename CountAvailable, typename GetAvailable>
+static bool
+IsSameAvailableLocales(CountAvailable countAvailable1,
+ GetAvailable getAvailable1,
+ CountAvailable countAvailable2,
+ GetAvailable getAvailable2)
+{
+ int32_t count = countAvailable1();
+ if (count != countAvailable2()) {
+ return false;
+ }
+ for (int32_t i = 0; i < count; i++) {
+ if (getAvailable1(i) != getAvailable2(i)) {
+ return false;
+ }
+ }
+ return true;
+}
+#endif
+
+bool
+js::intl::SharedIntlData::ensureSupportedLocales(JSContext* cx)
+{
+ if (supportedLocalesInitialized)
+ return true;
+
+ // If ensureSupportedLocales() was called previously, but didn't complete due
+ // to OOM, clear all data and start from scratch.
+ if (supportedLocales.initialized())
+ supportedLocales.finish();
+ if (collatorSupportedLocales.initialized())
+ collatorSupportedLocales.finish();
+ if (!supportedLocales.init() ||
+ !collatorSupportedLocales.init()) {
+ ReportOutOfMemory(cx);
+ return false;
+ }
+
+ if (!getAvailableLocales(cx, supportedLocales, uloc_countAvailable, uloc_getAvailable))
+ return false;
+
+ if (!getAvailableLocales(cx, collatorSupportedLocales, ucol_countAvailable, ucol_getAvailable))
+ return false;
+
+ MOZ_ASSERT(IsSameAvailableLocales(uloc_countAvailable, uloc_getAvailable,
+ udat_countAvailable, udat_getAvailable));
+
+ MOZ_ASSERT(IsSameAvailableLocales(uloc_countAvailable, uloc_getAvailable,
+ unum_countAvailable, unum_getAvailable));
+
+ MOZ_ASSERT(!supportedLocalesInitialized, "ensureSupportedLocales is neither reentrant nor thread-safe");
+ supportedLocalesInitialized = true;
+
+ return true;
+}
+
+bool
+js::intl::SharedIntlData::isSupportedLocale(JSContext* cx,
+ SupportedLocaleKind kind,
+ HandleString locale,
+ bool* supported)
+{
+ if (!ensureSupportedLocales(cx))
+ return false;
+
+
+ RootedLinearString localeLinear(cx, locale->ensureLinear(cx));
+ if (!localeLinear)
+ return false;
+
+ LocaleHasher::Lookup lookup(localeLinear);
+ switch (kind) {
+ case SupportedLocaleKind::Collator:
+ *supported = collatorSupportedLocales.has(lookup);
+ return true;
+ case SupportedLocaleKind::DateTimeFormat:
+ case SupportedLocaleKind::NumberFormat:
+ case SupportedLocaleKind::PluralRules:
+ case SupportedLocaleKind::RelativeTimeFormat:
+ *supported = supportedLocales.has(lookup);
+ return true;
+ }
+ MOZ_CRASH("Invalid Intl constructor");
+
+ return true;
+}
+
+bool
+js::intl::SharedIntlData::ensureUpperCaseFirstLocales(JSContext* cx)
+{
+ if (upperCaseFirstInitialized)
+ return true;
+
+ // If ensureUpperCaseFirstLocales() was called previously, but didn't
+ // complete due to OOM, clear all data and start from scratch.
+ if (upperCaseFirstLocales.initialized())
+ upperCaseFirstLocales.finish();
+ if (!upperCaseFirstLocales.init()) {
+ ReportOutOfMemory(cx);
+ return false;
+ }
+
+ UErrorCode status = U_ZERO_ERROR;
+ UEnumeration* available = ucol_openAvailableLocales(&status);
+ if (U_FAILURE(status)) {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
+ return false;
+ }
+ ScopedICUObject<UEnumeration, uenum_close> toClose(available);
+
+ RootedAtom locale(cx);
+ while (true) {
+ int32_t size;
+ const char* rawLocale = uenum_next(available, &size, &status);
+ if (U_FAILURE(status)) {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
+ return false;
+ }
+
+ if (rawLocale == nullptr)
+ break;
+
+ UCollator* collator = ucol_open(rawLocale, &status);
+ if (U_FAILURE(status)) {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
+ return false;
+ }
+ ScopedICUObject<UCollator, ucol_close> toCloseCollator(collator);
+
+ UColAttributeValue caseFirst = ucol_getAttribute(collator, UCOL_CASE_FIRST, &status);
+ if (U_FAILURE(status)) {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
+ return false;
+ }
+
+ if (caseFirst != UCOL_UPPER_FIRST)
+ continue;
+
+ MOZ_ASSERT(size >= 0);
+ locale = Atomize(cx, rawLocale, size_t(size));
+ if (!locale)
+ return false;
+
+ LocaleHasher::Lookup lookup(locale);
+ LocaleSet::AddPtr p = upperCaseFirstLocales.lookupForAdd(lookup);
+
+ // ICU shouldn't report any duplicate locales, but if it does, just
+ // ignore the duplicated locale.
+ if (!p && !upperCaseFirstLocales.add(p, locale)) {
+ ReportOutOfMemory(cx);
+ return false;
+ }
+ }
+
+ MOZ_ASSERT(!upperCaseFirstInitialized,
+ "ensureUpperCaseFirstLocales is neither reentrant nor thread-safe");
+ upperCaseFirstInitialized = true;
+
+ return true;
+}
+
+bool
+js::intl::SharedIntlData::isUpperCaseFirst(JSContext* cx, HandleString locale, bool* isUpperFirst)
+{
+ if (!ensureUpperCaseFirstLocales(cx))
+ return false;
+
+ RootedLinearString localeLinear(cx, locale->ensureLinear(cx));
+ if (!localeLinear)
+ return false;
+
+ LocaleHasher::Lookup lookup(localeLinear);
+ *isUpperFirst = upperCaseFirstLocales.has(lookup);
+
+ return true;
+}
+
void
js::intl::SharedIntlData::destroyInstance()
{
availableTimeZones.finish();
ianaZonesTreatedAsLinksByICU.finish();
ianaLinksCanonicalizedDifferentlyByICU.finish();
+ supportedLocales.finish();
+ collatorSupportedLocales.finish();
+ upperCaseFirstLocales.finish();
}
void
@@ -288,6 +580,9 @@ js::intl::SharedIntlData::trace(JSTracer* trc)
availableTimeZones.trace(trc);
ianaZonesTreatedAsLinksByICU.trace(trc);
ianaLinksCanonicalizedDifferentlyByICU.trace(trc);
+ supportedLocales.trace(trc);
+ collatorSupportedLocales.trace(trc);
+ upperCaseFirstLocales.trace(trc);
}
}
@@ -296,5 +591,8 @@ js::intl::SharedIntlData::sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf
{
return availableTimeZones.sizeOfExcludingThis(mallocSizeOf) +
ianaZonesTreatedAsLinksByICU.sizeOfExcludingThis(mallocSizeOf) +
- ianaLinksCanonicalizedDifferentlyByICU.sizeOfExcludingThis(mallocSizeOf);
+ ianaLinksCanonicalizedDifferentlyByICU.sizeOfExcludingThis(mallocSizeOf) +
+ supportedLocales.sizeOfExcludingThis(mallocSizeOf) +
+ collatorSupportedLocales.sizeOfExcludingThis(mallocSizeOf) +
+ upperCaseFirstLocales.sizeOfExcludingThis(mallocSizeOf);
}
diff --git a/js/src/builtin/intl/SharedIntlData.h b/js/src/builtin/intl/SharedIntlData.h
index 959d1d6a74..edf90308df 100644
--- a/js/src/builtin/intl/SharedIntlData.h
+++ b/js/src/builtin/intl/SharedIntlData.h
@@ -30,6 +30,34 @@ namespace intl {
*/
class SharedIntlData
{
+ struct LinearStringLookup
+ {
+ union {
+ const JS::Latin1Char* latin1Chars;
+ const char16_t* twoByteChars;
+ };
+ bool isLatin1;
+ size_t length;
+ JS::AutoCheckCannotGC nogc;
+ HashNumber hash = 0;
+
+ explicit LinearStringLookup(JSLinearString* string)
+ : isLatin1(string->hasLatin1Chars()), length(string->length())
+ {
+ if (isLatin1)
+ latin1Chars = string->latin1Chars(nogc);
+ else
+ twoByteChars = string->twoByteChars(nogc);
+ }
+
+ LinearStringLookup(const char* chars, size_t length)
+ : isLatin1(true), length(length)
+ {
+ latin1Chars = reinterpret_cast<const JS::Latin1Char*>(chars);
+ }
+ };
+
+ private:
/**
* Information tracking the set of the supported time zone names, derived
* from the IANA time zone database <https://www.iana.org/time-zones>.
@@ -59,17 +87,8 @@ class SharedIntlData
struct TimeZoneHasher
{
- struct Lookup
+ struct Lookup : LinearStringLookup
{
- union {
- const JS::Latin1Char* latin1Chars;
- const char16_t* twoByteChars;
- };
- bool isLatin1;
- size_t length;
- JS::AutoCheckCannotGC nogc;
- HashNumber hash;
-
explicit Lookup(JSFlatString* timeZone);
};
@@ -148,7 +167,110 @@ class SharedIntlData
*/
bool tryCanonicalizeTimeZoneConsistentWithIANA(JSContext* cx, JS::HandleString timeZone,
JS::MutableHandleString result);
+ private:
+ using Locale = JSAtom*;
+
+ struct LocaleHasher
+ {
+ struct Lookup : LinearStringLookup
+ {
+ explicit Lookup(JSLinearString* locale);
+ Lookup(const char* chars, size_t length);
+ };
+
+ static js::HashNumber hash(const Lookup& lookup) { return lookup.hash; }
+ static bool match(Locale key, const Lookup& lookup);
+ };
+
+ using LocaleSet = GCHashSet<Locale, LocaleHasher, SystemAllocPolicy>;
+
+ // Set of supported locales for all Intl service constructors except Collator,
+ // which uses its own set.
+ //
+ // UDateFormat:
+ // udat_[count,get]Available() return the same results as their
+ // uloc_[count,get]Available() counterparts.
+ //
+ // UNumberFormatter:
+ // unum_[count,get]Available() return the same results as their
+ // uloc_[count,get]Available() counterparts.
+ //
+ // UPluralRules and URelativeDateTimeFormatter:
+ // We're going to use ULocale availableLocales as per ICU recommendation:
+ // https://unicode-org.atlassian.net/browse/ICU-12756
+ LocaleSet supportedLocales;
+
+ // ucol_[count,get]Available() return different results compared to
+ // uloc_[count,get]Available(), we can't use |supportedLocales| here.
+ LocaleSet collatorSupportedLocales;
+
+ bool supportedLocalesInitialized = false;
+
+ // CountAvailable and GetAvailable describe the signatures used for ICU API
+ // to determine available locales for various functionality.
+ using CountAvailable = int32_t (*)();
+ using GetAvailable = const char* (*)(int32_t localeIndex);
+ static bool getAvailableLocales(JSContext* cx, LocaleSet& locales,
+ CountAvailable countAvailable,
+ GetAvailable getAvailable);
+
+ /**
+ * Precomputes the available locales sets.
+ */
+ bool ensureSupportedLocales(JSContext* cx);
+
+ public:
+ enum class SupportedLocaleKind {
+ Collator,
+ DateTimeFormat,
+ NumberFormat,
+ PluralRules,
+ RelativeTimeFormat
+ };
+
+ /**
+ * Sets |supported| to true if |locale| is supported by the requested Intl
+ * service constructor. Otherwise sets |supported| to false.
+ */
+ MOZ_MUST_USE bool isSupportedLocale(JSContext* cx, SupportedLocaleKind kind,
+ JS::Handle<JSString*> locale,
+ bool* supported);
+
+ private:
+ /**
+ * The case first parameter (BCP47 key "kf") allows to switch the order of
+ * upper- and lower-case characters. ICU doesn't directly provide an API
+ * to query the default case first value of a given locale, but instead
+ * requires to instantiate a collator object and then query the case first
+ * attribute (UCOL_CASE_FIRST).
+ * To avoid instantiating an additional collator object whenever we need
+ * to retrieve the default case first value of a specific locale, we
+ * compute the default case first value for every supported locale only
+ * once and then keep a list of all locales which don't use the default
+ * case first setting.
+ * There is almost no difference between lower-case first and when case
+ * first is disabled (UCOL_LOWER_FIRST resp. UCOL_OFF), so we only need to
+ * track locales which use upper-case first as their default setting.
+ */
+
+ LocaleSet upperCaseFirstLocales;
+
+ bool upperCaseFirstInitialized = false;
+
+ /**
+ * Precomputes the available locales which use upper-case first sorting.
+ */
+ bool ensureUpperCaseFirstLocales(JSContext* cx);
+
+ public:
+ /**
+ * Sets |isUpperFirst| to true if |locale| sorts upper-case characters
+ * before lower-case characters.
+ */
+ bool isUpperCaseFirst(JSContext* cx, JS::HandleString locale, bool* isUpperFirst);
+
+ public:
void destroyInstance();
void trace(JSTracer* trc);
diff --git a/js/src/builtin/intl/make_intl_data.py b/js/src/builtin/intl/make_intl_data.py
index a81001e0f3..59ff14d76c 100644
--- a/js/src/builtin/intl/make_intl_data.py
+++ b/js/src/builtin/intl/make_intl_data.py
@@ -6,19 +6,15 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
""" Usage:
- make_intl_data.py langtags [language-subtag-registry.txt]
+ make_intl_data.py langtags [cldr_core.zip]
make_intl_data.py tzdata
+ make_intl_data.py unicode-ext
Target "langtags":
- This script extracts information about mappings between deprecated and
- current BCP 47 language tags from the IANA Language Subtag Registry and
- converts it to JavaScript object definitions in
- LangTagMappingsGenerated.js. The definitions are used in Intl.js.
-
- The IANA Language Subtag Registry is imported from
- https://www.iana.org/assignments/language-subtag-registry
- and uses the syntax specified in
- https://tools.ietf.org/html/rfc5646#section-3
+ This script extracts information about 1) mappings between deprecated and
+ current Unicode BCP 47 locale identifiers, and 2) deprecated and current
+ BCP 47 Unicode extension value from CLDR, and converts it to C++ mapping
+ code in LanguageTagGenerated.cpp. The code is used in LanguageTag.cpp.
Target "tzdata":
@@ -36,194 +32,1330 @@ import sys
import tarfile
import tempfile
import urllib2
-import urlparse
from contextlib import closing
from functools import partial
-from itertools import chain, ifilter, ifilterfalse, imap, tee
+from itertools import chain, ifilter, ifilterfalse, imap, izip_longest, groupby, tee
from operator import attrgetter, itemgetter
+from urlparse import urlsplit
+from zipfile import ZipFile
+
+# From https://docs.python.org/3/library/itertools.html
+def grouper(iterable, n, fillvalue=None):
+ "Collect data into fixed-length chunks or blocks"
+ # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
+ args = [iter(iterable)] * n
+ return izip_longest(*args, fillvalue=fillvalue)
+
+def writeMappingHeader(println, description, source, url):
+ if type(description) is not list:
+ description = [description]
+ for desc in description:
+ println(u"// {0}".format(desc))
+ println(u"// Derived from {0}.".format(source))
+ println(u"// {0}".format(url))
+
+def writeMappingsVar(println, mapping, name, description, source, url):
+ """ Writes a variable definition with a mapping table.
+
+ Writes the contents of dictionary |mapping| through the |println|
+ function with the given variable name and a comment with description,
+ source, and URL.
+ """
+ println(u"")
+ writeMappingHeader(println, description, source, url)
+ println(u"var {0} = {{".format(name))
+ for (key, value) in sorted(mapping.items(), key=itemgetter(0)):
+ println(u' "{0}": "{1}",'.format(key, value))
+ println(u"};")
+
+def writeMappingsBinarySearch(println, fn_name, type_name, name, validate_fn, validate_case_fn,
+ mappings, tag_maxlength, description, source, url):
+ """ Emit code to perform a binary search on language tag subtags.
+
+ Uses the contents of |mapping|, which can either be a dictionary or set,
+ to emit a mapping function to find subtag replacements.
+ """
+ println(u"")
+ writeMappingHeader(println, description, source, url)
+ println(u"""
+bool js::intl::LanguageTag::{0}({1} {2}) {{
+ MOZ_ASSERT({3}({2}.span()));
+ MOZ_ASSERT({4}({2}.span()));
+""".format(fn_name, type_name, name, validate_fn, validate_case_fn).strip())
+
+ def write_array(subtags, name, length, fixed):
+ if fixed:
+ println(u" static const char {}[{}][{}] = {{".format(name, len(subtags),
+ length + 1))
+ else:
+ println(u" static const char* {}[{}] = {{".format(name, len(subtags)))
+
+ # Group in pairs of ten to not exceed the 80 line column limit.
+ for entries in grouper(subtags, 10):
+ entries = (u"\"{}\"".format(tag).rjust(length + 2)
+ for tag in entries if tag is not None)
+ println(u" {},".format(u", ".join(entries)))
+
+ println(u" };")
+
+ trailing_return = True
+
+ # Sort the subtags by length. That enables using an optimized comparator
+ # for the binary search, which only performs a single |memcmp| for multiple
+ # of two subtag lengths.
+ mappings_keys = mappings.keys() if type(mappings) == dict else mappings
+ for (length, subtags) in groupby(sorted(mappings_keys, key=len), len):
+ # Omit the length check if the current length is the maximum length.
+ if length != tag_maxlength:
+ println(u"""
+ if ({}.length() == {}) {{
+""".format(name, length).rstrip("\n"))
+ else:
+ trailing_return = False
+ println(u"""
+ {
+""".rstrip("\n"))
+
+ # The subtags need to be sorted for binary search to work.
+ subtags = sorted(subtags)
+
+ def equals(subtag):
+ return u"""{}.equalTo("{}")""".format(name, subtag)
+
+ # Don't emit a binary search for short lists.
+ if len(subtags) == 1:
+ if type(mappings) == dict:
+ println(u"""
+ if ({}) {{
+ {}.set("{}");
+ return true;
+ }}
+ return false;
+""".format(equals(subtags[0]), name, mappings[subtags[0]]).strip("\n"))
+ else:
+ println(u"""
+ return {};
+""".format(equals(subtags[0])).strip("\n"))
+ elif len(subtags) <= 4:
+ if type(mappings) == dict:
+ for subtag in subtags:
+ println(u"""
+ if ({}) {{
+ {}.set("{}");
+ return true;
+ }}
+""".format(equals(subtag), name, mappings[subtag]).strip("\n"))
+
+ println(u"""
+ return false;
+""".strip("\n"))
+ else:
+ cond = (equals(subtag) for subtag in subtags)
+ cond = (u" ||\n" + u" " * (4 + len("return "))).join(cond)
+ println(u"""
+ return {};
+""".format(cond).strip("\n"))
+ else:
+ write_array(subtags, name + "s", length, True)
+
+ if type(mappings) == dict:
+ write_array([mappings[k] for k in subtags], u"aliases", length, False)
+
+ println(u"""
+ if (const char* replacement = SearchReplacement({0}s, aliases, {0})) {{
+ {0}.set(mozilla::MakeCStringSpan(replacement));
+ return true;
+ }}
+ return false;
+""".format(name).rstrip())
+ else:
+ println(u"""
+ return HasReplacement({0}s, {0});
+""".format(name).rstrip())
-def readRegistryRecord(registry):
- """ Yields the records of the IANA Language Subtag Registry as dictionaries. """
- record = {}
- for line in registry:
- line = line.strip()
- if line == "":
+ println(u"""
+ }
+""".strip("\n"))
+
+ if trailing_return:
+ println(u"""
+ return false;""")
+
+ println(u"""
+}""".lstrip("\n"))
+
+
+def writeComplexLanguageTagMappings(println, complex_language_mappings,
+ description, source, url):
+ println(u"")
+ writeMappingHeader(println, description, source, url)
+ println(u"""
+void js::intl::LanguageTag::performComplexLanguageMappings() {
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(language().span()));
+ MOZ_ASSERT(IsCanonicallyCasedLanguageTag(language().span()));
+""".lstrip())
+
+ # Merge duplicate language entries.
+ language_aliases = {}
+ for (deprecated_language, (language, script, region)) in (
+ sorted(complex_language_mappings.items(), key=itemgetter(0))
+ ):
+ key = (language, script, region)
+ if key not in language_aliases:
+ language_aliases[key] = []
+ else:
+ language_aliases[key].append(deprecated_language)
+
+ first_language = True
+ for (deprecated_language, (language, script, region)) in (
+ sorted(complex_language_mappings.items(), key=itemgetter(0))
+ ):
+ key = (language, script, region)
+ if deprecated_language in language_aliases[key]:
continue
- if line == "%%":
- yield record
- record = {}
+
+ if_kind = u"if" if first_language else u"else if"
+ first_language = False
+
+ cond = (u"language().equalTo(\"{}\")".format(lang)
+ for lang in [deprecated_language] + language_aliases[key])
+ cond = (u" ||\n" + u" " * (2 + len(if_kind) + 2)).join(cond)
+
+ println(u"""
+ {} ({}) {{""".format(if_kind, cond).strip("\n"))
+
+ println(u"""
+ setLanguage("{}");""".format(language).strip("\n"))
+
+ if script is not None:
+ println(u"""
+ if (script().missing()) {{
+ setScript("{}");
+ }}""".format(script).strip("\n"))
+ if region is not None:
+ println(u"""
+ if (region().missing()) {{
+ setRegion("{}");
+ }}""".format(region).strip("\n"))
+ println(u"""
+ }""".strip("\n"))
+
+ println(u"""
+}
+""".strip("\n"))
+
+
+def writeComplexRegionTagMappings(println, complex_region_mappings,
+ description, source, url):
+ println(u"")
+ writeMappingHeader(println, description, source, url)
+ println(u"""
+void js::intl::LanguageTag::performComplexRegionMappings() {
+ MOZ_ASSERT(IsStructurallyValidLanguageTag(language().span()));
+ MOZ_ASSERT(IsCanonicallyCasedLanguageTag(language().span()));
+ MOZ_ASSERT(IsStructurallyValidRegionTag(region().span()));
+ MOZ_ASSERT(IsCanonicallyCasedRegionTag(region().span()));
+""".lstrip())
+
+ # |non_default_replacements| is a list and hence not hashable. Convert it
+ # to a string to get a proper hashable value.
+ def hash_key(default, non_default_replacements):
+ return (default, str(sorted(str(v) for v in non_default_replacements)))
+
+ # Merge duplicate region entries.
+ region_aliases = {}
+ for (deprecated_region, (default, non_default_replacements)) in (
+ sorted(complex_region_mappings.items(), key=itemgetter(0))
+ ):
+ key = hash_key(default, non_default_replacements)
+ if key not in region_aliases:
+ region_aliases[key] = []
else:
- if ":" in line:
- key, value = line.split(":", 1)
- key, value = key.strip(), value.strip()
- record[key] = value
- else:
- # continuation line
- record[key] += " " + line
- if record:
- yield record
- return
+ region_aliases[key].append(deprecated_region)
+
+ first_region = True
+ for (deprecated_region, (default, non_default_replacements)) in (
+ sorted(complex_region_mappings.items(), key=itemgetter(0))
+ ):
+ key = hash_key(default, non_default_replacements)
+ if deprecated_region in region_aliases[key]:
+ continue
+
+ if_kind = u"if" if first_region else u"else if"
+ first_region = False
+
+ cond = (u"region().equalTo(\"{}\")".format(region)
+ for region in [deprecated_region] + region_aliases[key])
+ cond = (u" ||\n" + u" " * (2 + len(if_kind) + 2)).join(cond)
+
+ println(u"""
+ {} ({}) {{""".format(if_kind, cond).strip("\n"))
+
+ replacement_regions = sorted({region for (_, _, region) in non_default_replacements})
+
+ first_case = True
+ for replacement_region in replacement_regions:
+ replacement_language_script = sorted(((language, script)
+ for (language, script, region) in (
+ non_default_replacements
+ )
+ if region == replacement_region),
+ key=itemgetter(0))
+
+ if_kind = u"if" if first_case else u"else if"
+ first_case = False
+
+ def compare_tags(language, script):
+ if script is None:
+ return u"language().equalTo(\"{}\")".format(language)
+ return u"(language().equalTo(\"{}\") && script().equalTo(\"{}\"))".format(
+ language, script)
+
+ cond = (compare_tags(language, script)
+ for (language, script) in replacement_language_script)
+ cond = (u" ||\n" + u" " * (4 + len(if_kind) + 2)).join(cond)
+
+ println(u"""
+ {} ({}) {{
+ setRegion("{}");
+ }}""".format(if_kind, cond, replacement_region).rstrip().strip("\n"))
+
+ println(u"""
+ else {{
+ setRegion("{}");
+ }}
+ }}""".format(default).rstrip().strip("\n"))
+
+ println(u"""
+}
+""".strip("\n"))
+
+
+def writeVariantTagMappings(println, variant_mappings, description, source,
+ url):
+ """ Writes a function definition that maps variant subtags. """
+ println(u"""
+static const char* ToCharPointer(const char* str) {
+ return str;
+}
+
+static const char* ToCharPointer(const js::UniqueChars& str) {
+ return str.get();
+}
+
+template <typename T, typename U = T>
+static bool IsLessThan(const T& a, const U& b) {
+ return strcmp(ToCharPointer(a), ToCharPointer(b)) < 0;
+}
+""")
+ writeMappingHeader(println, description, source, url)
+ println(u"""
+bool js::intl::LanguageTag::performVariantMappings(JSContext* cx) {
+ // The variant subtags need to be sorted for binary search.
+ MOZ_ASSERT(std::is_sorted(variants_.begin(), variants_.end(),
+ IsLessThan<decltype(variants_)::ElementType>));
+
+ auto insertVariantSortedIfNotPresent = [&](const char* variant) {
+ auto* p = std::lower_bound(variants_.begin(), variants_.end(), variant,
+ IsLessThan<decltype(variants_)::ElementType,
+ decltype(variant)>);
+
+ // Don't insert the replacement when already present.
+ if (p != variants_.end() && strcmp(p->get(), variant) == 0) {
+ return true;
+ }
+
+ // Insert the preferred variant in sort order.
+ auto preferred = DuplicateString(cx, variant);
+ if (!preferred) {
+ return false;
+ }
+ return !!variants_.insert(p, std::move(preferred));
+ };
+
+ for (size_t i = 0; i < variants_.length(); ) {
+ auto& variant = variants_[i];
+ MOZ_ASSERT(IsCanonicallyCasedVariantTag(mozilla::MakeCStringSpan(variant.get())));
+""".lstrip())
+
+ first_variant = True
+
+ for (deprecated_variant, (type, replacement)) in (
+ sorted(variant_mappings.items(), key=itemgetter(0))
+ ):
+ if_kind = u"if" if first_variant else u"else if"
+ first_variant = False
+
+ println(u"""
+ {} (strcmp(variant.get(), "{}") == 0) {{
+ variants_.erase(variants_.begin() + i);
+""".format(if_kind, deprecated_variant).strip("\n"))
+
+ if type == "language":
+ println(u"""
+ setLanguage("{}");
+""".format(replacement).strip("\n"))
+ elif type == "region":
+ println(u"""
+ setRegion("{}");
+""".format(replacement).strip("\n"))
+ else:
+ assert type == "variant"
+ println(u"""
+ if (!insertVariantSortedIfNotPresent("{}")) {{
+ return false;
+ }}
+""".format(replacement).strip("\n"))
+
+ println(u"""
+ }
+""".strip("\n"))
+
+ println(u"""
+ else {
+ i++;
+ }
+ }
+ return true;
+}
+""".strip("\n"))
+
+
+def writeGrandfatheredMappingsFunction(println, grandfathered_mappings,
+ description, source, url):
+ """ Writes a function definition that maps grandfathered language tags. """
+ println(u"")
+ writeMappingHeader(println, description, source, url)
+ println(u"""\
+bool js::intl::LanguageTag::updateGrandfatheredMappings(JSContext* cx) {
+ // We're mapping regular grandfathered tags to non-grandfathered form here.
+ // Other tags remain unchanged.
+ //
+ // regular = "art-lojban"
+ // / "cel-gaulish"
+ // / "no-bok"
+ // / "no-nyn"
+ // / "zh-guoyu"
+ // / "zh-hakka"
+ // / "zh-min"
+ // / "zh-min-nan"
+ // / "zh-xiang"
+ //
+ // Therefore we can quickly exclude most tags by checking every
+ // |unicode_locale_id| subcomponent for characteristics not shared by any of
+ // the regular grandfathered (RG) tags:
+ //
+ // * Real-world |unicode_language_subtag|s are all two or three letters,
+ // so don't waste time running a useless |language.length > 3| fast-path.
+ // * No RG tag has a "script"-looking component.
+ // * No RG tag has a "region"-looking component.
+ // * The RG tags that match |unicode_locale_id| (art-lojban, cel-gaulish,
+ // zh-guoyu, zh-hakka, zh-xiang) have exactly one "variant". (no-bok,
+ // no-nyn, zh-min, and zh-min-nan require BCP47's extlang subtag
+ // that |unicode_locale_id| doesn't support.)
+ // * No RG tag contains |extensions| or |pu_extensions|.
+ if (script().present() ||
+ region().present() ||
+ variants().length() != 1 ||
+ extensions().length() != 0 ||
+ privateuse()) {
+ return true;
+ }
+
+ MOZ_ASSERT(IsCanonicallyCasedLanguageTag(language().span()));
+ MOZ_ASSERT(IsCanonicallyCasedVariantTag(mozilla::MakeCStringSpan(variants()[0].get())));
+
+ auto variantEqualTo = [this](const char* variant) {
+ return strcmp(variants()[0].get(), variant) == 0;
+ };""")
+
+ # From Unicode BCP 47 locale identifier <https://unicode.org/reports/tr35/>.
+ #
+ # Doesn't allow any 'extensions' subtags.
+ re_unicode_locale_id = re.compile(
+ r"""
+ ^
+ # unicode_language_id = unicode_language_subtag
+ # unicode_language_subtag = alpha{2,3} | alpha{5,8}
+ (?P<language>[a-z]{2,3}|[a-z]{5,8})
+
+ # (sep unicode_script_subtag)?
+ # unicode_script_subtag = alpha{4}
+ (?:-(?P<script>[a-z]{4}))?
+
+ # (sep unicode_region_subtag)?
+ # unicode_region_subtag = (alpha{2} | digit{3})
+ (?:-(?P<region>([a-z]{2}|[0-9]{3})))?
+
+ # (sep unicode_variant_subtag)*
+ # unicode_variant_subtag = (alphanum{5,8} | digit alphanum{3})
+ (?P<variants>(-([a-z0-9]{5,8}|[0-9][a-z0-9]{3}))+)?
+
+ # pu_extensions?
+ # pu_extensions = sep [xX] (sep alphanum{1,8})+
+ (?:-(?P<privateuse>x(-[a-z0-9]{1,8})+))?
+ $
+ """, re.IGNORECASE | re.VERBOSE)
+
+ is_first = True
+
+ for (tag, modern) in sorted(grandfathered_mappings.items(), key=itemgetter(0)):
+ tag_match = re_unicode_locale_id.match(tag)
+ assert tag_match is not None
+
+ tag_language = tag_match.group("language")
+ assert tag_match.group("script") is None, (
+ "{} does not contain a script subtag".format(tag))
+ assert tag_match.group("region") is None, (
+ "{} does not contain a region subtag".format(tag))
+ tag_variants = tag_match.group("variants")
+ assert tag_variants is not None, (
+ "{} contains a variant subtag".format(tag))
+ assert tag_match.group("privateuse") is None, (
+ "{} does not contain a privateuse subtag".format(tag))
+
+ tag_variant = tag_variants[1:]
+ assert "-" not in tag_variant, (
+ "{} contains only a single variant".format(tag))
+
+ modern_match = re_unicode_locale_id.match(modern)
+ assert modern_match is not None
+
+ modern_language = modern_match.group("language")
+ modern_script = modern_match.group("script")
+ modern_region = modern_match.group("region")
+ modern_variants = modern_match.group("variants")
+ modern_privateuse = modern_match.group("privateuse")
+
+ println(u"""
+ // {} -> {}
+""".format(tag, modern).rstrip())
+
+ println(u"""
+ {}if (language().equalTo("{}") && variantEqualTo("{}")) {{
+ """.format("" if is_first else "else ",
+ tag_language,
+ tag_variant).rstrip().strip("\n"))
+
+ is_first = False
+
+ println(u"""
+ setLanguage("{}");
+ """.format(modern_language).rstrip().strip("\n"))
+
+ if modern_script is not None:
+ println(u"""
+ setScript("{}");
+ """.format(modern_script).rstrip().strip("\n"))
+
+ if modern_region is not None:
+ println(u"""
+ setRegion("{}");
+ """.format(modern_region).rstrip().strip("\n"))
+
+ assert modern_variants is None, (
+ "all regular grandfathered tags' modern forms do not contain variant subtags")
+
+ println(u"""
+ clearVariants();
+ """.rstrip().strip("\n"))
+
+ if modern_privateuse is not None:
+ println(u"""
+ auto privateuse = DuplicateString(cx, "{}");
+ if (!privateuse) {{
+ return false;
+ }}
+ setPrivateuse(std::move(privateuse));
+ """.format(modern_privateuse).rstrip().rstrip("\n"))
+
+ println(u"""
+ return true;
+ }""".rstrip().strip("\n"))
+ println(u"""
+ return true;
+}""")
-def readRegistry(registry):
- """ Reads IANA Language Subtag Registry and extracts information for Intl.js.
+
+def readSupplementalData(core_file):
+ """ Reads CLDR Supplemental Data and extracts information for Intl.js.
Information extracted:
- - langTagMappings: mappings from complete language tags to preferred
+ - grandfatheredMappings: mappings from grandfathered tags to preferred
complete language tags
- - langSubtagMappings: mappings from subtags to preferred subtags
- - extlangMappings: mappings from extlang subtags to preferred subtags,
- with prefix to be removed
- Returns these three mappings as dictionaries, along with the registry's
- file date.
-
- We also check that mappings for language subtags don't affect extlang
- subtags and vice versa, so that CanonicalizeLanguageTag doesn't have
- to separate them for processing. Region codes are separated by case,
- and script codes by length, so they're unproblematic.
+ - languageMappings: mappings from language subtags to preferred subtags
+ - complexLanguageMappings: mappings from language subtags with complex rules
+ - regionMappings: mappings from region subtags to preferred subtags
+ - complexRegionMappings: mappings from region subtags with complex rules
+ - variantMappings: mappings from variant subtags to preferred subtags
+ - likelySubtags: likely subtags used for generating test data only
+ Returns these mappings as dictionaries.
"""
- langTagMappings = {}
- langSubtagMappings = {}
- extlangMappings = {}
- languageSubtags = set()
- extlangSubtags = set()
-
- for record in readRegistryRecord(registry):
- if "File-Date" in record:
- fileDate = record["File-Date"]
+ import xml.etree.ElementTree as ET
+
+ # From Unicode BCP 47 locale identifier <https://unicode.org/reports/tr35/>.
+ re_unicode_language_id = re.compile(
+ r"""
+ ^
+ # unicode_language_id = unicode_language_subtag
+ # unicode_language_subtag = alpha{2,3} | alpha{5,8}
+ (?P<language>[a-z]{2,3}|[a-z]{5,8})
+
+ # (sep unicode_script_subtag)?
+ # unicode_script_subtag = alpha{4}
+ (?:-(?P<script>[a-z]{4}))?
+
+ # (sep unicode_region_subtag)?
+ # unicode_region_subtag = (alpha{2} | digit{3})
+ (?:-(?P<region>([a-z]{2}|[0-9]{3})))?
+
+ # (sep unicode_variant_subtag)*
+ # unicode_variant_subtag = (alphanum{5,8} | digit alphanum{3})
+ (?P<variants>(-([a-z0-9]{5,8}|[0-9][a-z0-9]{3}))+)?
+ $
+ """, re.IGNORECASE | re.VERBOSE)
+
+ re_unicode_language_subtag = re.compile(
+ r"""
+ ^
+ # unicode_language_subtag = alpha{2,3} | alpha{5,8}
+ ([a-z]{2,3}|[a-z]{5,8})
+ $
+ """, re.IGNORECASE | re.VERBOSE)
+
+ re_unicode_region_subtag = re.compile(
+ r"""
+ ^
+ # unicode_region_subtag = (alpha{2} | digit{3})
+ ([a-z]{2}|[0-9]{3})
+ $
+ """, re.IGNORECASE | re.VERBOSE)
+
+ re_unicode_variant_subtag = re.compile(
+ r"""
+ ^
+ # unicode_variant_subtag = (alphanum{5,8} | digit alphanum{3})
+ ([a-z0-9]{5,8}|(?:[0-9][a-z0-9]{3}))
+ $
+ """, re.IGNORECASE | re.VERBOSE)
+
+ # The fixed list of BCP 47 grandfathered language tags.
+ grandfathered_tags = (
+ "art-lojban",
+ "cel-gaulish",
+ "en-GB-oed",
+ "i-ami",
+ "i-bnn",
+ "i-default",
+ "i-enochian",
+ "i-hak",
+ "i-klingon",
+ "i-lux",
+ "i-mingo",
+ "i-navajo",
+ "i-pwn",
+ "i-tao",
+ "i-tay",
+ "i-tsu",
+ "no-bok",
+ "no-nyn",
+ "sgn-BE-FR",
+ "sgn-BE-NL",
+ "sgn-CH-DE",
+ "zh-guoyu",
+ "zh-hakka",
+ "zh-min",
+ "zh-min-nan",
+ "zh-xiang",
+ )
+
+ # The list of grandfathered tags which are valid Unicode BCP 47 locale identifiers.
+ unicode_bcp47_grandfathered_tags = {tag for tag in grandfathered_tags
+ if re_unicode_language_id.match(tag)}
+
+ # Dictionary of simple language subtag mappings, e.g. "in" -> "id".
+ language_mappings = {}
+
+ # Dictionary of complex language subtag mappings, modifying more than one
+ # subtag, e.g. "sh" -> ("sr", "Latn", None) and "cnr" -> ("sr", None, "ME").
+ complex_language_mappings = {}
+
+ # Dictionary of simple region subtag mappings, e.g. "DD" -> "DE".
+ region_mappings = {}
+
+ # Dictionary of complex region subtag mappings, containing more than one
+ # replacement, e.g. "SU" -> ("RU", ["AM",complex_region_mappings[type] = replacements "AZ", "BY", ...]).
+ complex_region_mappings = {}
+
+ # Dictionary of aliased variant subtags to a tuple of preferred replacement
+ # type and replacement, e.g. "arevela" -> ("language", "hy") or
+ # "aaland" -> ("region", "AX") or "heploc" -> ("variant", "alalc97").
+ variant_mappings = {}
+
+ # Dictionary of grandfathered mappings to preferred values.
+ grandfathered_mappings = {}
+
+ # CLDR uses "_" as the separator for some elements. Replace it with "-".
+ def bcp47_id(cldr_id):
+ return cldr_id.replace("_", "-")
+
+ # CLDR uses the canonical case for most entries, but there are some
+ # exceptions, like:
+ # <languageAlias type="drw" replacement="fa_af" reason="deprecated"/>
+ # Therefore canonicalize all tags to be on the safe side.
+ def bcp47_canonical(language, script, region):
+ # Canonical case for language subtags is lower case.
+ # Canonical case for script subtags is title case.
+ # Canonical case for region subtags is upper case.
+ return (language.lower() if language else None,
+ script.title() if script else None,
+ region.upper() if region else None)
+
+ tree = ET.parse(core_file.open("common/supplemental/supplementalMetadata.xml"))
+
+ for language_alias in tree.iterfind(".//languageAlias"):
+ type = bcp47_id(language_alias.get("type"))
+ replacement = bcp47_id(language_alias.get("replacement"))
+
+ # Handle grandfathered mappings first.
+ if type in unicode_bcp47_grandfathered_tags:
+ grandfathered_mappings[type] = replacement
continue
- if record["Type"] == "grandfathered":
- # Grandfathered tags don't use standard syntax, so
- # CanonicalizeLanguageTag expects the mapping table to provide
- # the final form for all.
- # For langTagMappings, keys must be in lower case; values in
- # the case used in the registry.
- tag = record["Tag"]
- if "Preferred-Value" in record:
- langTagMappings[tag.lower()] = record["Preferred-Value"]
- else:
- langTagMappings[tag.lower()] = tag
- elif record["Type"] == "redundant":
- # For langTagMappings, keys must be in lower case; values in
- # the case used in the registry.
- if "Preferred-Value" in record:
- langTagMappings[record["Tag"].lower()] = record["Preferred-Value"]
- elif record["Type"] in ("language", "script", "region", "variant"):
- # For langSubtagMappings, keys and values must be in the case used
- # in the registry.
- subtag = record["Subtag"]
- if record["Type"] == "language":
- languageSubtags.add(subtag)
- if "Preferred-Value" in record:
- if subtag == "heploc":
- # The entry for heploc is unique in its complexity; handle
- # it as special case below.
- continue
- if "Prefix" in record:
- # This might indicate another heploc-like complex case.
- raise Exception("Please evaluate: subtag mapping with prefix value.")
- langSubtagMappings[subtag] = record["Preferred-Value"]
- elif record["Type"] == "extlang":
- # For extlangMappings, keys must be in the case used in the
- # registry; values are records with the preferred value and the
- # prefix to be removed.
- subtag = record["Subtag"]
- extlangSubtags.add(subtag)
- if "Preferred-Value" in record:
- preferred = record["Preferred-Value"]
- prefix = record["Prefix"]
- extlangMappings[subtag] = {"preferred": preferred, "prefix": prefix}
+ # We're only interested in language subtag matches, so ignore any
+ # entries which have additional subtags.
+ if re_unicode_language_subtag.match(type) is None:
+ continue
+
+ assert type.islower()
+
+ if re_unicode_language_subtag.match(replacement) is not None:
+ # Canonical case for language subtags is lower-case.
+ language_mappings[type] = replacement.lower()
else:
- # No other types are allowed by
- # https://tools.ietf.org/html/rfc5646#section-3.1.3
- assert False, "Unrecognized Type: {0}".format(record["Type"])
+ replacement_match = re_unicode_language_id.match(replacement)
+ assert replacement_match is not None, (
+ "{} invalid Unicode BCP 47 locale identifier".format(replacement))
+ assert replacement_match.group("variants") is None, (
+ "{}: unexpected variant subtags in {}".format(type, replacement))
+
+ complex_language_mappings[type] = bcp47_canonical(replacement_match.group("language"),
+ replacement_match.group("script"),
+ replacement_match.group("region"))
+
+ for territory_alias in tree.iterfind(".//territoryAlias"):
+ type = territory_alias.get("type")
+ replacement = territory_alias.get("replacement")
+
+ # We're only interested in region subtag matches, so ignore any entries
+ # which contain legacy formats, e.g. three letter region codes.
+ if re_unicode_region_subtag.match(type) is None:
+ continue
- # Check that mappings for language subtags and extlang subtags don't affect
- # each other.
- for lang in languageSubtags:
- if lang in extlangMappings and extlangMappings[lang]["preferred"] != lang:
- raise Exception("Conflict: lang with extlang mapping: " + lang)
- for extlang in extlangSubtags:
- if extlang in langSubtagMappings:
- raise Exception("Conflict: extlang with lang mapping: " + extlang)
+ assert type.isupper() or type.isdigit()
- # Special case for heploc.
- langTagMappings["ja-latn-hepburn-heploc"] = "ja-Latn-alalc97"
+ if re_unicode_region_subtag.match(replacement) is not None:
+ # Canonical case for region subtags is upper-case.
+ region_mappings[type] = replacement.upper()
+ else:
+ # Canonical case for region subtags is upper-case.
+ replacements = [r.upper() for r in replacement.split(" ")]
+ assert all(
+ re_unicode_region_subtag.match(loc) is not None for loc in replacements
+ ), "{} invalid region subtags".format(replacement)
+ complex_region_mappings[type] = replacements
- return {"fileDate": fileDate,
- "langTagMappings": langTagMappings,
- "langSubtagMappings": langSubtagMappings,
- "extlangMappings": extlangMappings}
+ for variant_alias in tree.iterfind(".//variantAlias"):
+ type = variant_alias.get("type")
+ replacement = variant_alias.get("replacement")
+ assert re_unicode_variant_subtag.match(type) is not None, (
+ "{} invalid variant subtag".format(type))
-def writeMappingsVar(intlData, dict, name, description, fileDate, url):
- """ Writes a variable definition with a mapping table to file intlData.
+ # Normalize the case, because some variants are in upper case.
+ type = type.lower()
+
+ # The replacement can be a language, a region, or a variant subtag.
+ # Language and region subtags are case normalized, variant subtags can
+ # be in any case.
+
+ if re_unicode_language_subtag.match(replacement) is not None and replacement.islower():
+ variant_mappings[type] = ("language", replacement)
+
+ elif re_unicode_region_subtag.match(replacement) is not None:
+ assert replacement.isupper() or replacement.isdigit(), (
+ "{} invalid variant subtag replacement".format(replacement))
+ variant_mappings[type] = ("region", replacement)
- Writes the contents of dictionary dict to file intlData with the given
- variable name and a comment with description, fileDate, and URL.
- """
- intlData.write("\n")
- intlData.write("// {0}.\n".format(description))
- intlData.write("// Derived from IANA Language Subtag Registry, file date {0}.\n".format(fileDate))
- intlData.write("// {0}\n".format(url))
- intlData.write("var {0} = {{\n".format(name))
- keys = sorted(dict)
- for key in keys:
- if isinstance(dict[key], basestring):
- value = '"{0}"'.format(dict[key])
else:
- preferred = dict[key]["preferred"]
- prefix = dict[key]["prefix"]
- value = '{{preferred: "{0}", prefix: "{1}"}}'.format(preferred, prefix)
- intlData.write(' "{0}": {1},\n'.format(key, value))
- intlData.write("};\n")
+ assert re_unicode_variant_subtag.match(replacement) is not None, (
+ "{} invalid variant subtag replacement".format(replacement))
+ variant_mappings[type] = ("variant", replacement.lower())
+
+ tree = ET.parse(core_file.open("common/supplemental/likelySubtags.xml"))
+
+ likely_subtags = {}
+
+ for likely_subtag in tree.iterfind(".//likelySubtag"):
+ from_tag = bcp47_id(likely_subtag.get("from"))
+ from_match = re_unicode_language_id.match(from_tag)
+ assert from_match is not None, (
+ "{} invalid Unicode BCP 47 locale identifier".format(from_tag))
+ assert from_match.group("variants") is None, (
+ "unexpected variant subtags in {}".format(from_tag))
+
+ to_tag = bcp47_id(likely_subtag.get("to"))
+ to_match = re_unicode_language_id.match(to_tag)
+ assert to_match is not None, (
+ "{} invalid Unicode BCP 47 locale identifier".format(to_tag))
+ assert to_match.group("variants") is None, (
+ "unexpected variant subtags in {}".format(to_tag))
+
+ from_canonical = bcp47_canonical(from_match.group("language"),
+ from_match.group("script"),
+ from_match.group("region"))
+
+ to_canonical = bcp47_canonical(to_match.group("language"),
+ to_match.group("script"),
+ to_match.group("region"))
+
+ likely_subtags[from_canonical] = to_canonical
+
+ complex_region_mappings_final = {}
+
+ for (deprecated_region, replacements) in complex_region_mappings.items():
+ # Find all likely subtag entries which don't already contain a region
+ # subtag and whose target region is in the list of replacement regions.
+ region_likely_subtags = [(from_language, from_script, to_region)
+ for ((from_language, from_script, from_region),
+ (_, _, to_region)) in likely_subtags.items()
+ if from_region is None and to_region in replacements]
+
+ # The first replacement entry is the default region.
+ default = replacements[0]
+
+ # Find all likely subtag entries whose region matches the default region.
+ default_replacements = {(language, script)
+ for (language, script, region) in region_likely_subtags
+ if region == default}
+
+ # And finally find those entries which don't use the default region.
+ # These are the entries we're actually interested in, because those need
+ # to be handled specially when selecting the correct preferred region.
+ non_default_replacements = [(language, script, region)
+ for (language, script, region) in region_likely_subtags
+ if (language, script) not in default_replacements]
+
+ # If there are no non-default replacements, we can handle the region as
+ # part of the simple region mapping.
+ if non_default_replacements:
+ complex_region_mappings_final[deprecated_region] = (default, non_default_replacements)
+ else:
+ region_mappings[deprecated_region] = default
+
+ return {"grandfatheredMappings": grandfathered_mappings,
+ "languageMappings": language_mappings,
+ "complexLanguageMappings": complex_language_mappings,
+ "regionMappings": region_mappings,
+ "complexRegionMappings": complex_region_mappings_final,
+ "variantMappings": variant_mappings,
+ "likelySubtags": likely_subtags,
+ }
+
+def readUnicodeExtensions(core_file):
+ import xml.etree.ElementTree as ET
+
+ # Match all xml-files in the BCP 47 directory.
+ bcpFileRE = re.compile(r"^common/bcp47/.+\.xml$")
+
+ # https://www.unicode.org/reports/tr35/#Unicode_locale_identifier
+ #
+ # type = alphanum{3,8} (sep alphanum{3,8})* ;
+ typeRE = re.compile(r"^[a-z0-9]{3,8}(-[a-z0-9]{3,8})*$")
+
+ # Mapping from Unicode extension types to dict of deprecated to
+ # preferred values.
+ mapping = {
+ # Unicode BCP 47 U Extension
+ "u": {},
+
+ # Unicode BCP 47 T Extension
+ "t": {},
+ }
+ def readBCP47File(file):
+ tree = ET.parse(file)
+ for keyword in tree.iterfind(".//keyword/key"):
+ extension = keyword.get("extension", "u")
+ assert extension == "u" or extension == "t", (
+ "unknown extension type: {}".format(extension))
+
+ extension_name = keyword.get("name")
+
+ for type in keyword.iterfind("type"):
+ # <https://unicode.org/reports/tr35/#Unicode_Locale_Extension_Data_Files>:
+ #
+ # The key or type name used by Unicode locale extension with 'u' extension
+ # syntax or the 't' extensions syntax. When alias below is absent, this name
+ # can be also used with the old style "@key=type" syntax.
+ name = type.get("name")
+
+ # Ignore the special name:
+ # - <https://unicode.org/reports/tr35/#CODEPOINTS>
+ # - <https://unicode.org/reports/tr35/#REORDER_CODE>
+ # - <https://unicode.org/reports/tr35/#RG_KEY_VALUE>
+ # - <https://unicode.org/reports/tr35/#SUBDIVISION_CODE>
+ # - <https://unicode.org/reports/tr35/#PRIVATE_USE>
+ if name in ("CODEPOINTS", "REORDER_CODE", "RG_KEY_VALUE", "SUBDIVISION_CODE",
+ "PRIVATE_USE"):
+ continue
-def writeLanguageTagData(intlData, fileDate, url, langTagMappings, langSubtagMappings, extlangMappings):
+ # All other names should match the 'type' production.
+ assert typeRE.match(name) is not None, (
+ "{} matches the 'type' production".format(name))
+
+ # <https://unicode.org/reports/tr35/#Unicode_Locale_Extension_Data_Files>:
+ #
+ # The preferred value of the deprecated key, type or attribute element.
+ # When a key, type or attribute element is deprecated, this attribute is
+ # used for specifying a new canonical form if available.
+ preferred = type.get("preferred")
+
+ # <https://unicode.org/reports/tr35/#Unicode_Locale_Extension_Data_Files>:
+ #
+ # The BCP 47 form is the canonical form, and recommended. Other aliases are
+ # included only for backwards compatibility.
+ alias = type.get("alias")
+
+ # <https://unicode.org/reports/tr35/#Canonical_Unicode_Locale_Identifiers>
+ #
+ # Use the bcp47 data to replace keys, types, tfields, and tvalues by their
+ # canonical forms. See Section 3.6.4 U Extension Data Files) and Section
+ # 3.7.1 T Extension Data Files. The aliases are in the alias attribute
+ # value, while the canonical is in the name attribute value.
+
+ # 'preferred' contains the new preferred name, 'alias' the compatibility
+ # name, but then there's this entry where 'preferred' and 'alias' are the
+ # same. So which one to choose? Assume 'preferred' is the actual canonical
+ # name.
+ #
+ # <type name="islamicc"
+ # description="Civil (algorithmic) Arabic calendar"
+ # deprecated="true"
+ # preferred="islamic-civil"
+ # alias="islamic-civil"/>
+
+ if preferred is not None:
+ assert typeRE.match(preferred), preferred
+ mapping[extension].setdefault(extension_name, {})[name] = preferred
+
+ if alias is not None:
+ for alias_name in alias.lower().split(" "):
+ # Ignore alias entries which don't match the 'type' production.
+ if typeRE.match(alias_name) is None:
+ continue
+
+ # See comment above when 'alias' and 'preferred' are both present.
+ if (preferred is not None and
+ name in mapping[extension][extension_name]):
+ continue
+
+ # Skip over entries where 'name' and 'alias' are equal.
+ #
+ # <type name="pst8pdt"
+ # description="POSIX style time zone for US Pacific Time"
+ # alias="PST8PDT"
+ # since="1.8"/>
+ if name == alias_name:
+ continue
+
+ mapping[extension].setdefault(extension_name, {})[alias_name] = name
+
+ def readSupplementalMetadata(file):
+ # Find subdivision and region replacements.
+ #
+ # <https://www.unicode.org/reports/tr35/#Canonical_Unicode_Locale_Identifiers>
+ #
+ # Replace aliases in special key values:
+ # - If there is an 'sd' or 'rg' key, replace any subdivision alias
+ # in its value in the same way, using subdivisionAlias data.
+ tree = ET.parse(file)
+ for alias in tree.iterfind(".//subdivisionAlias"):
+ type = alias.get("type")
+ assert typeRE.match(type) is not None, (
+ "{} matches the 'type' production".format(type))
+
+ # Take the first replacement when multiple ones are present.
+ replacement = alias.get("replacement").split(" ")[0].lower()
+
+ # Skip over invalid replacements.
+ #
+ # <subdivisionAlias type="fi01" replacement="AX" reason="overlong"/>
+ #
+ # It's not entirely clear to me if CLDR actually wants to use
+ # "axzzzz" as the replacement for this case.
+ if typeRE.match(replacement) is None:
+ continue
+
+ # 'subdivisionAlias' applies to 'rg' and 'sd' keys.
+ mapping["u"].setdefault("rg", {})[type] = replacement
+ mapping["u"].setdefault("sd", {})[type] = replacement
+
+ for name in core_file.namelist():
+ if bcpFileRE.match(name):
+ readBCP47File(core_file.open(name))
+
+ readSupplementalMetadata(core_file.open("common/supplemental/supplementalMetadata.xml"))
+
+ return {
+ "unicodeMappings": mapping["u"],
+ "transformMappings": mapping["t"],
+ }
+
+def writeCLDRLanguageTagData(println, data, url):
""" Writes the language tag data to the Intl data file. """
- writeMappingsVar(intlData, langTagMappings, "langTagMappings",
- "Mappings from complete tags to preferred values", fileDate, url)
- writeMappingsVar(intlData, langSubtagMappings, "langSubtagMappings",
- "Mappings from non-extlang subtags to preferred values", fileDate, url)
- writeMappingsVar(intlData, extlangMappings, "extlangMappings",
- "Mappings from extlang subtags to preferred values", fileDate, url)
-
-def updateLangTags(args):
- """ Update the LangTagMappingsGenerated.js file. """
+
+ println(generatedFileWarning)
+ println(u"// Version: CLDR-{}".format(data["version"]))
+ println(u"// URL: {}".format(url))
+
+ println(u"""
+#include "mozilla/Assertions.h"
+#include "mozilla/Span.h"
+#include "mozilla/TextUtils.h"
+
+#include <algorithm>
+#include <cstdint>
+#include <cstring>
+#include <iterator>
+#include <string>
+#include <type_traits>
+
+#include "jscntxt.h"
+#include "jsstr.h"
+
+#include "builtin/intl/LanguageTag.h"
+
+using namespace js::intl::LanguageTagLimits;
+
+template <size_t Length, size_t TagLength, size_t SubtagLength>
+static inline bool HasReplacement(
+ const char (&subtags)[Length][TagLength],
+ const js::intl::LanguageTagSubtag<SubtagLength>& subtag) {
+ MOZ_ASSERT(subtag.length() == TagLength - 1,
+ "subtag must have the same length as the list of subtags");
+
+ const char* ptr = subtag.span().data();
+ return std::binary_search(std::begin(subtags), std::end(subtags), ptr,
+ [](const char* a, const char* b) {
+ return memcmp(a, b, TagLength - 1) < 0;
+ });
+}
+
+template <size_t Length, size_t TagLength, size_t SubtagLength>
+static inline const char* SearchReplacement(
+ const char (&subtags)[Length][TagLength],
+ const char* (&aliases)[Length],
+ const js::intl::LanguageTagSubtag<SubtagLength>& subtag) {
+ MOZ_ASSERT(subtag.length() == TagLength - 1,
+ "subtag must have the same length as the list of subtags");
+
+ const char* ptr = subtag.span().data();
+ auto p = std::lower_bound(std::begin(subtags), std::end(subtags), ptr,
+ [](const char* a, const char* b) {
+ return memcmp(a, b, TagLength - 1) < 0;
+ });
+ if (p != std::end(subtags) && memcmp(*p, ptr, TagLength - 1) == 0) {
+ return aliases[std::distance(std::begin(subtags), p)];
+ }
+ return nullptr;
+}
+
+#ifdef DEBUG
+static bool IsAsciiLowercaseAlphanumeric(char c) {
+ return mozilla::IsAsciiLowercaseAlpha(c) || mozilla::IsAsciiDigit(c);
+}
+
+static bool IsAsciiLowercaseAlphanumericOrDash(char c) {
+ return IsAsciiLowercaseAlphanumeric(c) || c == '-';
+}
+
+static bool IsCanonicallyCasedLanguageTag(mozilla::Span<const char> span) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ return std::all_of(span.begin(), span.end(), mozilla::IsAsciiLowercaseAlpha<char>);
+}
+
+static bool IsCanonicallyCasedRegionTag(mozilla::Span<const char> span) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ return std::all_of(span.begin(), span.end(), mozilla::IsAsciiUppercaseAlpha<char>) ||
+ std::all_of(span.begin(), span.end(), mozilla::IsAsciiDigit<char>);
+}
+
+static bool IsCanonicallyCasedVariantTag(mozilla::Span<const char> span) {
+ // Tell the analysis the |std::all_of| function can't GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ return std::all_of(span.begin(), span.end(), IsAsciiLowercaseAlphanumeric);
+}
+
+static bool IsCanonicallyCasedUnicodeKey(mozilla::Span<const char> key) {
+ return std::all_of(key.begin(), key.end(), IsAsciiLowercaseAlphanumeric);
+}
+
+static bool IsCanonicallyCasedUnicodeType(mozilla::Span<const char> type) {
+ return std::all_of(type.begin(), type.end(), IsAsciiLowercaseAlphanumericOrDash);
+}
+
+static bool IsCanonicallyCasedTransformKey(mozilla::Span<const char> key) {
+ return std::all_of(key.begin(), key.end(), IsAsciiLowercaseAlphanumeric);
+}
+
+static bool IsCanonicallyCasedTransformType(mozilla::Span<const char> type) {
+ return std::all_of(type.begin(), type.end(), IsAsciiLowercaseAlphanumericOrDash);
+}
+#endif
+""".rstrip())
+
+ source = u"CLDR Supplemental Data, version {}".format(data["version"])
+ grandfathered_mappings = data["grandfatheredMappings"]
+ language_mappings = data["languageMappings"]
+ complex_language_mappings = data["complexLanguageMappings"]
+ region_mappings = data["regionMappings"]
+ complex_region_mappings = data["complexRegionMappings"]
+ variant_mappings = data["variantMappings"]
+ unicode_mappings = data["unicodeMappings"]
+ transform_mappings = data["transformMappings"]
+
+ # unicode_language_subtag = alpha{2,3} | alpha{5,8} ;
+ language_maxlength = 8
+
+ # unicode_region_subtag = (alpha{2} | digit{3}) ;
+ region_maxlength = 3
+
+ writeMappingsBinarySearch(println, "languageMapping",
+ "LanguageSubtag&", "language",
+ "IsStructurallyValidLanguageTag",
+ "IsCanonicallyCasedLanguageTag",
+ language_mappings, language_maxlength,
+ "Mappings from language subtags to preferred values.", source, url)
+ writeMappingsBinarySearch(println, "complexLanguageMapping",
+ "const LanguageSubtag&", "language",
+ "IsStructurallyValidLanguageTag",
+ "IsCanonicallyCasedLanguageTag",
+ complex_language_mappings.keys(), language_maxlength,
+ "Language subtags with complex mappings.", source, url)
+ writeMappingsBinarySearch(println, "regionMapping",
+ "RegionSubtag&", "region",
+ "IsStructurallyValidRegionTag",
+ "IsCanonicallyCasedRegionTag",
+ region_mappings, region_maxlength,
+ "Mappings from region subtags to preferred values.", source, url)
+ writeMappingsBinarySearch(println, "complexRegionMapping",
+ "const RegionSubtag&", "region",
+ "IsStructurallyValidRegionTag",
+ "IsCanonicallyCasedRegionTag",
+ complex_region_mappings.keys(), region_maxlength,
+ "Region subtags with complex mappings.", source, url)
+
+ writeComplexLanguageTagMappings(println, complex_language_mappings,
+ "Language subtags with complex mappings.", source, url)
+ writeComplexRegionTagMappings(println, complex_region_mappings,
+ "Region subtags with complex mappings.", source, url)
+
+ writeVariantTagMappings(println, variant_mappings,
+ "Mappings from variant subtags to preferred values.", source, url)
+
+ writeGrandfatheredMappingsFunction(println, grandfathered_mappings,
+ "Canonicalize grandfathered locale identifiers.", source,
+ url)
+
+ writeUnicodeExtensionsMappings(println, unicode_mappings, "Unicode")
+ writeUnicodeExtensionsMappings(println, transform_mappings, "Transform")
+
+
+def writeCLDRLanguageTagLikelySubtagsTest(println, data, url):
+ """ Writes the likely-subtags test file. """
+
+ println(generatedFileWarning)
+
+ source = u"CLDR Supplemental Data, version {}".format(data["version"])
+ language_mappings = data["languageMappings"]
+ complex_language_mappings = data["complexLanguageMappings"]
+ region_mappings = data["regionMappings"]
+ complex_region_mappings = data["complexRegionMappings"]
+ likely_subtags = data["likelySubtags"]
+
+ def bcp47(tag):
+ (language, script, region) = tag
+ return "{}{}{}".format(language,
+ "-" + script if script else "",
+ "-" + region if region else "")
+
+ def canonical(tag):
+ (language, script, region) = tag
+
+ # Map deprecated language subtags.
+ if language in language_mappings:
+ language = language_mappings[language]
+ elif language in complex_language_mappings:
+ (language2, script2, region2) = complex_language_mappings[language]
+ (language, script, region) = (language2,
+ script if script else script2,
+ region if region else region2)
+
+ # Map deprecated region subtags.
+ if region in region_mappings:
+ region = region_mappings[region]
+ else:
+ # Assume no complex region mappings are needed for now.
+ assert region not in complex_region_mappings,\
+ "unexpected region with complex mappings: {}".format(region)
+
+ return (language, script, region)
+
+ # https://unicode.org/reports/tr35/#Likely_Subtags
+
+ def addLikelySubtags(tag):
+ # Step 1: Canonicalize.
+ (language, script, region) = canonical(tag)
+ if script == "Zzzz":
+ script = None
+ if region == "ZZ":
+ region = None
+
+ # Step 2: Lookup.
+ searches = ((language, script, region),
+ (language, None, region),
+ (language, script, None),
+ (language, None, None),
+ ("und", script, None))
+ search = next(search for search in searches if search in likely_subtags)
+
+ (language_s, script_s, region_s) = search
+ (language_m, script_m, region_m) = likely_subtags[search]
+
+ # Step 3: Return.
+ return (language if language != language_s else language_m,
+ script if script != script_s else script_m,
+ region if region != region_s else region_m)
+
+ # https://unicode.org/reports/tr35/#Likely_Subtags
+ def removeLikelySubtags(tag):
+ # Step 1: Add likely subtags.
+ max = addLikelySubtags(tag)
+
+ # Step 2: Remove variants (doesn't apply here).
+
+ # Step 3: Find a match.
+ (language, script, region) = max
+ for trial in ((language, None, None), (language, None, region), (language, script, None)):
+ if addLikelySubtags(trial) == max:
+ return trial
+
+ # Step 4: Return maximized if no match found.
+ return max
+
+ def likely_canonical(from_tag, to_tag):
+ # Canonicalize the input tag.
+ from_tag = canonical(from_tag)
+
+ # Update the expected result if necessary.
+ if from_tag in likely_subtags:
+ to_tag = likely_subtags[from_tag]
+
+ # Canonicalize the expected output.
+ to_canonical = canonical(to_tag)
+
+ # Sanity check: This should match the result of |addLikelySubtags|.
+ assert to_canonical == addLikelySubtags(from_tag)
+
+ return to_canonical
+
+ # |likely_subtags| contains non-canonicalized tags, so canonicalize it first.
+ likely_subtags_canonical = {k: likely_canonical(k, v) for (k, v) in likely_subtags.items()}
+
+ # Add test data for |Intl.Locale.prototype.maximize()|.
+ writeMappingsVar(println, {bcp47(k): bcp47(v) for (k, v) in likely_subtags_canonical.items()},
+ "maxLikelySubtags", "Extracted from likelySubtags.xml.", source, url)
+
+ # Use the maximalized tags as the input for the remove likely-subtags test.
+ minimized = {tag: removeLikelySubtags(tag) for tag in likely_subtags_canonical.values()}
+
+ # Add test data for |Intl.Locale.prototype.minimize()|.
+ writeMappingsVar(println, {bcp47(k): bcp47(v) for (k, v) in minimized.items()},
+ "minLikelySubtags", "Extracted from likelySubtags.xml.", source, url)
+
+ println(u"""
+for (let [tag, maximal] of Object.entries(maxLikelySubtags)) {
+ assertEq(new Intl.Locale(tag).maximize().toString(), maximal);
+}""")
+
+ println(u"""
+for (let [tag, minimal] of Object.entries(minLikelySubtags)) {
+ assertEq(new Intl.Locale(tag).minimize().toString(), minimal);
+}""")
+
+ println(u"""
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);""")
+
+
+def updateCLDRLangTags(args):
+ """ Update the LanguageTagGenerated.cpp file. """
+ version = args.version
url = args.url
out = args.out
filename = args.file
+ url = url.replace("<VERSION>", version)
+
print("Arguments:")
+ print("\tCLDR version: %s" % version)
print("\tDownload url: %s" % url)
- print("\tLocal registry: %s" % filename)
+ if filename is not None:
+ print("\tLocal CLDR core.zip file: %s" % filename)
print("\tOutput file: %s" % out)
print("")
+ data = {
+ "version": version,
+ }
+
+ def readFiles(cldr_file):
+ with ZipFile(cldr_file) as zip_file:
+ data.update(readSupplementalData(zip_file))
+ data.update(readUnicodeExtensions(zip_file))
+
+ print("Processing CLDR data...")
if filename is not None:
- print("Always make sure you have the newest language-subtag-registry.txt!")
- registry = codecs.open(filename, "r", encoding="utf-8")
+ print("Always make sure you have the newest CLDR core.zip!")
+ with open(filename, "rb") as cldr_file:
+ readFiles(cldr_file)
else:
- print("Downloading IANA Language Subtag Registry...")
- with closing(urllib2.urlopen(url)) as reader:
- text = reader.read().decode("utf-8")
- registry = codecs.open("language-subtag-registry.txt", "w+", encoding="utf-8")
- registry.write(text)
- registry.seek(0)
-
- print("Processing IANA Language Subtag Registry...")
- with closing(registry) as reg:
- data = readRegistry(reg)
- fileDate = data["fileDate"]
- langTagMappings = data["langTagMappings"]
- langSubtagMappings = data["langSubtagMappings"]
- extlangMappings = data["extlangMappings"]
+ print("Downloading CLDR core.zip...")
+ with closing(urllib2.urlopen(url)) as cldr_file:
+ cldr_data = io.BytesIO(cldr_file.read())
+ readFiles(cldr_data)
print("Writing Intl data...")
- with codecs.open(out, "w", encoding="utf-8") as intlData:
- intlData.write("// Generated by make_intl_data.py. DO NOT EDIT.\n")
- writeLanguageTagData(intlData, fileDate, url, langTagMappings, langSubtagMappings, extlangMappings)
+ with io.open(out, mode="w", encoding="utf-8", newline="") as f:
+ println = partial(print, file=f)
+ writeCLDRLanguageTagData(println, data, url)
+
+ print("Writing Intl test data...")
+ test_file = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+ "../../tests/non262/Intl/Locale/likely-subtags-generated.js")
+ with io.open(test_file, mode="w", encoding="utf-8", newline="") as f:
+ println = partial(print, file=f)
+
+ println(u"// |reftest| skip-if(!this.hasOwnProperty('Intl'))")
+ writeCLDRLanguageTagLikelySubtagsTest(println, data, url)
+
def flines(filepath, encoding="utf-8"):
""" Open filepath and iterate over its content. """
@@ -703,11 +1835,11 @@ def processTimeZones(tzdataDir, icuDir, icuTzDir, version, ignoreBackzone, ignor
println(u"// Format:")
println(u'// "LinkName", "Target" // ICU-Target [time zone file]')
- println(u"struct LinkAndTarget");
- println(u"{");
- println(u" const char* const link;");
- println(u" const char* const target;");
- println(u"};");
+ println(u"struct LinkAndTarget")
+ println(u"{")
+ println(u" const char* const link;")
+ println(u" const char* const target;")
+ println(u"};")
println(u"")
println(u"const LinkAndTarget ianaLinksCanonicalizedDifferentlyByICU[] = {")
for (zone, target, icuTarget) in incorrectLinks:
@@ -928,7 +2060,7 @@ def updateTzdata(topsrcdir, args):
if tzDir is None:
print("Downloading tzdata file...")
with closing(urllib2.urlopen(url)) as tzfile:
- fname = urlparse.urlsplit(tzfile.geturl()).path.split("/")[-1]
+ fname = urlsplit(tzfile.geturl()).path.split("/")[-1]
with tempfile.NamedTemporaryFile(suffix=fname) as tztmpfile:
print("File stored in %s" % tztmpfile.name)
tztmpfile.write(tzfile.read())
@@ -937,6 +2069,152 @@ def updateTzdata(topsrcdir, args):
else:
updateFrom(tzDir)
+def writeUnicodeExtensionsMappings(println, mapping, extension):
+ println(u"""
+template <size_t Length>
+static inline bool Is{0}Key(
+ mozilla::Span<const char> key, const char (&str)[Length]) {{
+ static_assert(Length == {0}KeyLength + 1,
+ "{0} extension key is two characters long");
+ return memcmp(key.data(), str, Length - 1) == 0;
+}}
+
+template <size_t Length>
+static inline bool Is{0}Type(
+ mozilla::Span<const char> type, const char (&str)[Length]) {{
+ static_assert(Length > {0}KeyLength + 1,
+ "{0} extension type contains more than two characters");
+ return type.size() == (Length - 1) &&
+ memcmp(type.data(), str, Length - 1) == 0;
+}}
+""".format(extension).rstrip("\n"))
+
+ linear_search_max_length = 4
+
+ needs_binary_search = any(len(replacements.items()) > linear_search_max_length
+ for replacements in mapping.values())
+
+ if needs_binary_search:
+ println(u"""
+static int32_t Compare{0}Type(const char* a, mozilla::Span<const char> b) {{
+ MOZ_ASSERT(!std::char_traits<char>::find(b.data(), b.size(), '\\0'),
+ "unexpected null-character in string");
+
+ using UnsignedChar = unsigned char;
+ for (size_t i = 0; i < b.size(); i++) {{
+ // |a| is zero-terminated and |b| doesn't contain a null-terminator. So if
+ // we've reached the end of |a|, the below if-statement will always be true.
+ // That ensures we don't read past the end of |a|.
+ if (int32_t r = UnsignedChar(a[i]) - UnsignedChar(b[i])) {{
+ return r;
+ }}
+ }}
+
+ // Return zero if both strings are equal or a negative number if |b| is a
+ // prefix of |a|.
+ return -int32_t(UnsignedChar(a[b.size()]));
+}}
+
+template <size_t Length>
+static inline const char* Search{0}Replacement(
+ const char* (&types)[Length], const char* (&aliases)[Length],
+ mozilla::Span<const char> type) {{
+
+ auto p = std::lower_bound(std::begin(types), std::end(types), type,
+ [](const auto& a, const auto& b) {{
+ return Compare{0}Type(a, b) < 0;
+ }});
+ if (p != std::end(types) && Compare{0}Type(*p, type) == 0) {{
+ return aliases[std::distance(std::begin(types), p)];
+ }}
+ return nullptr;
+}}
+""".format(extension).rstrip("\n"))
+
+ println(u"""
+/**
+ * Mapping from deprecated BCP 47 {0} extension types to their preferred
+ * values.
+ *
+ * Spec: https://www.unicode.org/reports/tr35/#Unicode_Locale_Extension_Data_Files
+ * Spec: https://www.unicode.org/reports/tr35/#t_Extension
+ */
+const char* js::intl::LanguageTag::replace{0}ExtensionType(
+ mozilla::Span<const char> key, mozilla::Span<const char> type) {{
+ MOZ_ASSERT(key.size() == {0}KeyLength);
+ MOZ_ASSERT(IsCanonicallyCased{0}Key(key));
+
+ MOZ_ASSERT(type.size() > {0}KeyLength);
+ MOZ_ASSERT(IsCanonicallyCased{0}Type(type));
+""".format(extension))
+
+ def to_hash_key(replacements):
+ return str(sorted(replacements.items()))
+
+ def write_array(subtags, name, length):
+ max_entries = (80 - len(" ")) // (length + len('"", '))
+
+ println(u" static const char* {}[{}] = {{".format(name, len(subtags)))
+
+ for entries in grouper(subtags, max_entries):
+ entries = (u"\"{}\"".format(tag).rjust(length + 2)
+ for tag in entries if tag is not None)
+ println(u" {},".format(u", ".join(entries)))
+
+ println(u" };")
+
+ # Merge duplicate keys.
+ key_aliases = {}
+ for (key, replacements) in sorted(mapping.items(), key=itemgetter(0)):
+ hash_key = to_hash_key(replacements)
+ if hash_key not in key_aliases:
+ key_aliases[hash_key] = []
+ else:
+ key_aliases[hash_key].append(key)
+
+ first_key = True
+ for (key, replacements) in sorted(mapping.items(), key=itemgetter(0)):
+ hash_key = to_hash_key(replacements)
+ if key in key_aliases[hash_key]:
+ continue
+
+ cond = (u"Is{}Key(key, \"{}\")".format(extension, k)
+ for k in [key] + key_aliases[hash_key])
+
+ if_kind = u"if" if first_key else u"else if"
+ cond = (u" ||\n" + u" " * (2 + len(if_kind) + 2)).join(cond)
+ println(u"""
+ {} ({}) {{""".format(if_kind, cond).strip("\n"))
+ first_key = False
+
+ replacements = sorted(replacements.items(), key=itemgetter(0))
+
+ if len(replacements) > linear_search_max_length:
+ types = [t for (t, _) in replacements]
+ preferred = [r for (_, r) in replacements]
+ max_len = max(len(k) for k in types + preferred)
+
+ write_array(types, "types", max_len)
+ write_array(preferred, "aliases", max_len)
+ println(u"""
+ return Search{}Replacement(types, aliases, type);
+""".format(extension).strip("\n"))
+ else:
+ for (type, replacement) in replacements:
+ println(u"""
+ if (Is{}Type(type, "{}")) {{
+ return "{}";
+ }}""".format(extension, type, replacement).strip("\n"))
+
+ println(u"""
+ }""".lstrip("\n"))
+
+ println(u"""
+ return nullptr;
+}
+""".strip("\n"))
+
+
if __name__ == "__main__":
import argparse
@@ -955,20 +2233,24 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Update intl data.")
subparsers = parser.add_subparsers(help="Select update mode")
- parser_tags = subparsers.add_parser("langtags",
- help="Update language-subtag-registry")
- parser_tags.add_argument("--url",
- metavar="URL",
- default="https://www.iana.org/assignments/language-subtag-registry",
- type=EnsureHttps,
- help="Download url for language-subtag-registry.txt (default: %(default)s)")
- parser_tags.add_argument("--out",
- default="LangTagMappingsGenerated.js",
- help="Output file (default: %(default)s)")
- parser_tags.add_argument("file",
- nargs="?",
- help="Local language-subtag-registry.txt file, if omitted uses <URL>")
- parser_tags.set_defaults(func=updateLangTags)
+ parser_cldr_tags = subparsers.add_parser("langtags",
+ help="Update CLDR language tags data")
+ parser_cldr_tags.add_argument("--version",
+ metavar="VERSION",
+ required=True,
+ help="CLDR version number")
+ parser_cldr_tags.add_argument("--url",
+ metavar="URL",
+ default="https://unicode.org/Public/cldr/<VERSION>/core.zip",
+ type=EnsureHttps,
+ help="Download url CLDR data (default: %(default)s)")
+ parser_cldr_tags.add_argument("--out",
+ default="LanguageTagGenerated.cpp",
+ help="Output file (default: %(default)s)")
+ parser_cldr_tags.add_argument("file",
+ nargs="?",
+ help="Local cldr-core.zip file, if omitted uses <URL>")
+ parser_cldr_tags.set_defaults(func=updateCLDRLangTags)
parser_tz = subparsers.add_parser("tzdata", help="Update tzdata")
parser_tz.add_argument("--tz",
diff --git a/js/src/gc/Allocator.cpp b/js/src/gc/Allocator.cpp
index 115a131127..8ecdd49a5b 100644
--- a/js/src/gc/Allocator.cpp
+++ b/js/src/gc/Allocator.cpp
@@ -254,7 +254,7 @@ GCRuntime::checkIncrementalZoneState(ExclusiveContext* cx, T* t)
return;
Zone* zone = cx->asJSContext()->zone();
- MOZ_ASSERT_IF(t && zone->wasGCStarted() && (zone->isGCMarking() || zone->isGCSweeping()),
+ MOZ_ASSERT_IF(t && zone->wasGCStarted() && (zone->shouldMarkInZone() || zone->isGCSweeping()),
t->asTenured().arena()->allocatedDuringIncremental);
#endif
}
diff --git a/js/src/gc/GCRuntime.h b/js/src/gc/GCRuntime.h
index de3db9bc31..cf2f7b036a 100644
--- a/js/src/gc/GCRuntime.h
+++ b/js/src/gc/GCRuntime.h
@@ -35,6 +35,12 @@ class MarkingValidator;
class AutoTraceSession;
struct MovingTracer;
+enum IncrementalProgress
+{
+ NotFinished = 0,
+ Finished
+};
+
class ChunkPool
{
Chunk* head_;
@@ -737,6 +743,8 @@ class GCRuntime
bool isShrinkingGC() const { return invocationKind == GC_SHRINK; }
+ static bool initializeSweepActions();
+
void setGrayRootsTracer(JSTraceDataOp traceOp, void* data);
MOZ_MUST_USE bool addBlackRootsTracer(JSTraceDataOp traceOp, void* data);
void removeBlackRootsTracer(JSTraceDataOp traceOp, void* data);
@@ -863,12 +871,6 @@ class GCRuntime
static TenuredCell* refillFreeListInGC(Zone* zone, AllocKind thingKind);
private:
- enum IncrementalProgress
- {
- NotFinished = 0,
- Finished
- };
-
// For ArenaLists::allocateFromArena()
friend class ArenaLists;
Chunk* pickChunk(const AutoLockGC& lock,
@@ -951,7 +953,15 @@ class GCRuntime
void beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock);
bool shouldReleaseObservedTypes();
void endSweepingZoneGroup();
- IncrementalProgress sweepPhase(SliceBudget& sliceBudget, AutoLockForExclusiveAccess& lock);
+ IncrementalProgress performSweepActions(SliceBudget& sliceBudget, AutoLockForExclusiveAccess& lock);
+ static IncrementalProgress sweepTypeInformation(GCRuntime* gc, FreeOp* fop, Zone* zone,
+ SliceBudget& budget, AllocKind kind);
+ static IncrementalProgress mergeSweptObjectArenas(GCRuntime* gc, FreeOp* fop, Zone* zone,
+ SliceBudget& budget, AllocKind kind);
+ static IncrementalProgress finalizeAllocKind(GCRuntime* gc, FreeOp* fop, Zone* zone,
+ SliceBudget& budget, AllocKind kind);
+ static IncrementalProgress sweepShapeTree(GCRuntime* gc, FreeOp* fop, Zone* zone,
+ SliceBudget& budget, AllocKind kind);
void endSweepPhase(bool lastGC, AutoLockForExclusiveAccess& lock);
void sweepZones(FreeOp* fop, bool lastGC);
void decommitAllWithoutUnlocking(const AutoLockGC& lock);
@@ -1165,10 +1175,9 @@ class GCRuntime
*/
JS::Zone* zoneGroups;
JS::Zone* currentZoneGroup;
- bool sweepingTypes;
- unsigned finalizePhase;
+ size_t sweepPhaseIndex;
JS::Zone* sweepZone;
- AllocKind sweepKind;
+ size_t sweepActionIndex;
bool abortSweepAfterCurrentGroup;
/*
diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp
index 058c495a77..42c872a1da 100644
--- a/js/src/gc/Marking.cpp
+++ b/js/src/gc/Marking.cpp
@@ -308,7 +308,7 @@ ShouldMarkCrossCompartment(JSTracer* trc, JSObject* src, Cell* cell)
MOZ_ASSERT(!zone->isCollecting());
trc->runtime()->gc.setFoundBlackGrayEdges(tenured);
}
- return zone->isGCMarking();
+ return zone->shouldMarkInZone();
} else {
if (zone->isGCMarkingBlack()) {
/*
@@ -331,26 +331,26 @@ ShouldMarkCrossCompartment(JSTracer* trc, JSObject* src, const Value& val)
}
static void
-AssertZoneIsMarking(Cell* thing)
+AssertShouldMarkInZone(Cell* thing)
{
- MOZ_ASSERT(TenuredCell::fromPointer(thing)->zone()->isGCMarking());
+ MOZ_ASSERT(thing->asTenured().zone()->shouldMarkInZone());
}
static void
-AssertZoneIsMarking(JSString* str)
+AssertShouldMarkInZone(JSString* str)
{
#ifdef DEBUG
- Zone* zone = TenuredCell::fromPointer(str)->zone();
- MOZ_ASSERT(zone->isGCMarking() || zone->isAtomsZone());
+ Zone* zone = str->asTenured().zone();
+ MOZ_ASSERT(zone->shouldMarkInZone() || zone->isAtomsZone());
#endif
}
static void
-AssertZoneIsMarking(JS::Symbol* sym)
+AssertShouldMarkInZone(JS::Symbol* sym)
{
#ifdef DEBUG
- Zone* zone = TenuredCell::fromPointer(sym)->zone();
- MOZ_ASSERT(zone->isGCMarking() || zone->isAtomsZone());
+ Zone* zone = sym->asTenured().zone();
+ MOZ_ASSERT(zone->shouldMarkInZone() || zone->isAtomsZone());
#endif
}
@@ -730,7 +730,7 @@ GCMarker::markImplicitEdgesHelper(T markedThing)
return;
Zone* zone = gc::TenuredCell::fromPointer(markedThing)->zone();
- MOZ_ASSERT(zone->isGCMarking());
+ MOZ_ASSERT(zone->shouldMarkInZone());
MOZ_ASSERT(!zone->isGCSweeping());
auto p = zone->gcWeakKeys.get(JS::GCCellPtr(markedThing));
@@ -759,35 +759,35 @@ GCMarker::markImplicitEdges(T* thing)
template <typename T>
static inline bool
-MustSkipMarking(GCMarker* gcmarker, T thing)
+ShouldMark(GCMarker* gcmarker, T thing)
{
// Don't trace things that are owned by another runtime.
if (IsOwnedByOtherRuntime(gcmarker->runtime(), thing))
- return true;
+ return false;
// Don't mark things outside a zone if we are in a per-zone GC.
- return !thing->zone()->isGCMarking();
+ return thing->zone()->shouldMarkInZone();
}
template <>
bool
-MustSkipMarking<JSObject*>(GCMarker* gcmarker, JSObject* obj)
+ShouldMark<JSObject*>(GCMarker* gcmarker, JSObject* obj)
{
// Don't trace things that are owned by another runtime.
if (IsOwnedByOtherRuntime(gcmarker->runtime(), obj))
- return true;
+ return false;
// We may mark a Nursery thing outside the context of the
// MinorCollectionTracer because of a pre-barrier. The pre-barrier is not
// needed in this case because we perform a minor collection before each
// incremental slice.
if (IsInsideNursery(obj))
- return true;
+ return false;
// Don't mark things outside a zone if we are in a per-zone GC. It is
// faster to check our own arena, which we can do since we know that
// the object is tenured.
- return !TenuredCell::fromPointer(obj)->zone()->isGCMarking();
+ return obj->asTenured().zone()->shouldMarkInZone();
}
template <typename T>
@@ -795,7 +795,7 @@ void
DoMarking(GCMarker* gcmarker, T* thing)
{
// Do per-type marking precondition checks.
- if (MustSkipMarking(gcmarker, thing))
+ if (!ShouldMark(gcmarker, thing))
return;
CheckTracedThing(gcmarker, thing);
@@ -822,7 +822,7 @@ void
NoteWeakEdge(GCMarker* gcmarker, T** thingp)
{
// Do per-type marking precondition checks.
- if (MustSkipMarking(gcmarker, *thingp))
+ if (!ShouldMark(gcmarker, *thingp))
return;
CheckTracedThing(gcmarker, *thingp);
@@ -971,7 +971,7 @@ template <typename T>
bool
js::GCMarker::mark(T* thing)
{
- AssertZoneIsMarking(thing);
+ AssertShouldMarkInZone(thing);
MOZ_ASSERT(!IsInsideNursery(gc::TenuredCell::fromPointer(thing)));
return gc::ParticipatesInCC<T>::value
? gc::TenuredCell::fromPointer(thing)->markIfUnmarked(markColor())
@@ -1106,7 +1106,7 @@ JSString::traceBase(JSTracer* trc)
inline void
js::GCMarker::eagerlyMarkChildren(JSLinearString* linearStr)
{
- AssertZoneIsMarking(linearStr);
+ AssertShouldMarkInZone(linearStr);
MOZ_ASSERT(linearStr->isMarked());
MOZ_ASSERT(linearStr->JSString::isLinear());
@@ -1116,7 +1116,7 @@ js::GCMarker::eagerlyMarkChildren(JSLinearString* linearStr)
MOZ_ASSERT(linearStr->JSString::isLinear());
if (linearStr->isPermanentAtom())
break;
- AssertZoneIsMarking(linearStr);
+ AssertShouldMarkInZone(linearStr);
if (!mark(static_cast<JSString*>(linearStr)))
break;
}
@@ -1169,7 +1169,7 @@ js::GCMarker::eagerlyMarkChildren(JSRope* rope)
JS_DIAGNOSTICS_ASSERT(rope->getTraceKind() == JS::TraceKind::String);
JS_DIAGNOSTICS_ASSERT(rope->JSString::isRope());
- AssertZoneIsMarking(rope);
+ AssertShouldMarkInZone(rope);
MOZ_ASSERT(rope->isMarked());
JSRope* next = nullptr;
@@ -1649,7 +1649,7 @@ GCMarker::processMarkStackTop(SliceBudget& budget)
case ObjectTag: {
obj = reinterpret_cast<JSObject*>(addr);
- AssertZoneIsMarking(obj);
+ AssertShouldMarkInZone(obj);
goto scan_obj;
}
@@ -1712,7 +1712,7 @@ GCMarker::processMarkStackTop(SliceBudget& budget)
scan_obj:
{
- AssertZoneIsMarking(obj);
+ AssertShouldMarkInZone(obj);
budget.step();
if (budget.isOverBudget()) {
diff --git a/js/src/gc/Zone.h b/js/src/gc/Zone.h
index eedd5455a1..323aa27758 100644
--- a/js/src/gc/Zone.h
+++ b/js/src/gc/Zone.h
@@ -232,11 +232,9 @@ struct Zone : public JS::shadow::Zone,
return rt->isHeapMajorCollecting() && !rt->gc.isHeapCompacting() && gcState_ != NoGC;
}
- bool isGCMarking() {
- if (runtimeFromMainThread()->isHeapCollecting())
- return gcState_ == Mark || gcState_ == MarkGray;
- else
- return needsIncrementalBarrier();
+ bool shouldMarkInZone() const {
+ return needsIncrementalBarrier() ||
+ (gcState_ == Mark || gcState_ == MarkGray);
}
GCState gcState() const { return gcState_; }
diff --git a/js/src/jit-test/tests/auto-regress/bug1263558.js b/js/src/jit-test/tests/auto-regress/bug1263558.js
index 66aa81d8dc..08443144e7 100644
--- a/js/src/jit-test/tests/auto-regress/bug1263558.js
+++ b/js/src/jit-test/tests/auto-regress/bug1263558.js
@@ -13,5 +13,5 @@ evalcx(`
');
oomTest(() => eval('Array(..."")'));
if ('Intl' in this)
- Intl.NumberFormat.prototype.format(0);
+ new Intl.NumberFormat().format(0);
`, newGlobal());
diff --git a/js/src/jit-test/tests/basic/bug920484.js b/js/src/jit-test/tests/basic/bug920484.js
index 0c9e4c9ac6..d2312b0e16 100644
--- a/js/src/jit-test/tests/basic/bug920484.js
+++ b/js/src/jit-test/tests/basic/bug920484.js
@@ -4,15 +4,8 @@ load(libdir + "asserts.js");
// any value except "best fit" or "lookup" is okay.
Object.prototype.localeMatcher = "invalid matcher option";
-// The Intl API may not be available in the testing environment. Note that |hasOwnProperty("Intl")|
-// initializes the Intl API if present, so this if-statement needs to appear after "localeMatcher"
-// was added to Object.prototype.
+// The Intl API may not be available in the testing environment.
if (this.hasOwnProperty("Intl")) {
- // Intl prototypes are properly initialized despite changed Object.prototype.
- Intl.Collator.prototype.compare("a", "b");
- Intl.NumberFormat.prototype.format(10);
- Intl.DateTimeFormat.prototype.format(new Date);
-
// Intl constructors no longer work properly, because "localeMatcher" defaults to the invalid
// value from Object.prototype. Except for Intl.DateTimeFormat, cf. ECMA-402 ToDateTimeOptions.
assertThrowsInstanceOf(() => new Intl.Collator(), RangeError);
diff --git a/js/src/jit-test/tests/ion/bug913749.js b/js/src/jit-test/tests/ion/bug913749.js
index a952caf1c8..fd74753595 100644
--- a/js/src/jit-test/tests/ion/bug913749.js
+++ b/js/src/jit-test/tests/ion/bug913749.js
@@ -15,6 +15,7 @@ for (var i = 0; i < 3; i++) {
x.toString();
assertEq(0, 1);
} catch (e) {
- assertEq(e.message, "y is undefined");
+ assertEq(e.message === "y is undefined" ||
+ e.message === "undefined has no properties", true);
}
}
diff --git a/js/src/jit/InlinableNatives.h b/js/src/jit/InlinableNatives.h
index 01b5f78522..561eb4b2db 100644
--- a/js/src/jit/InlinableNatives.h
+++ b/js/src/jit/InlinableNatives.h
@@ -26,6 +26,12 @@
_(AtomicsXor) \
_(AtomicsIsLockFree) \
\
+ _(IntlIsCollator) \
+ _(IntlIsDateTimeFormat) \
+ _(IntlIsNumberFormat) \
+ _(IntlIsPluralRules) \
+ _(IntlIsRelativeTimeFormat) \
+ \
_(MathAbs) \
_(MathFloor) \
_(MathCeil) \
diff --git a/js/src/jit/MCallOptimize.cpp b/js/src/jit/MCallOptimize.cpp
index 23e894ffb2..1a98432ffa 100644
--- a/js/src/jit/MCallOptimize.cpp
+++ b/js/src/jit/MCallOptimize.cpp
@@ -13,6 +13,11 @@
#include "builtin/SIMD.h"
#include "builtin/TestingFunctions.h"
#include "builtin/TypedObject.h"
+#include "builtin/intl/Collator.h"
+#include "builtin/intl/DateTimeFormat.h"
+#include "builtin/intl/NumberFormat.h"
+#include "builtin/intl/PluralRules.h"
+#include "builtin/intl/RelativeTimeFormat.h"
#include "jit/BaselineInspector.h"
#include "jit/InlinableNatives.h"
#include "jit/IonBuilder.h"
@@ -104,6 +109,18 @@ IonBuilder::inlineNativeCall(CallInfo& callInfo, JSFunction* target)
case InlinableNative::AtomicsIsLockFree:
return inlineAtomicsIsLockFree(callInfo);
+ // Intl natives.
+ case InlinableNative::IntlIsCollator:
+ return inlineHasClass(callInfo, &CollatorObject::class_);
+ case InlinableNative::IntlIsDateTimeFormat:
+ return inlineHasClass(callInfo, &DateTimeFormatObject::class_);
+ case InlinableNative::IntlIsNumberFormat:
+ return inlineHasClass(callInfo, &NumberFormatObject::class_);
+ case InlinableNative::IntlIsPluralRules:
+ return inlineHasClass(callInfo, &PluralRulesObject::class_);
+ case InlinableNative::IntlIsRelativeTimeFormat:
+ return inlineHasClass(callInfo, &RelativeTimeFormatObject::class_);
+
// Math natives.
case InlinableNative::MathAbs:
return inlineMathAbs(callInfo);
diff --git a/js/src/jit/VMFunctions.cpp b/js/src/jit/VMFunctions.cpp
index f191ce7d6d..6e5676f153 100644
--- a/js/src/jit/VMFunctions.cpp
+++ b/js/src/jit/VMFunctions.cpp
@@ -17,6 +17,7 @@
#include "jit/mips64/Simulator-mips64.h"
#include "vm/ArrayObject.h"
#include "vm/Debugger.h"
+#include "vm/EqualityOperations.h" // js::StrictlyEqual
#include "vm/Interpreter.h"
#include "vm/TraceLogging.h"
diff --git a/js/src/js.msg b/js/src/js.msg
index 91637edc6a..242d81a5c8 100644
--- a/js/src/js.msg
+++ b/js/src/js.msg
@@ -484,10 +484,10 @@ MSG_DEF(JSMSG_DEBUG_PROMISE_NOT_REJECTED, 0, JSEXN_TYPEERR, "Promise hasn't been
MSG_DEF(JSMSG_TRACELOGGER_ENABLE_FAIL, 1, JSEXN_ERR, "enabling tracelogger failed: {0}")
// Intl
-MSG_DEF(JSMSG_DATE_NOT_FINITE, 0, JSEXN_RANGEERR, "date value is not finite in DateTimeFormat.format()")
+MSG_DEF(JSMSG_DATE_NOT_FINITE, 2, JSEXN_RANGEERR, "date value is not finite in {0}.{1}()")
+MSG_DEF(JSMSG_DUPLICATE_VARIANT_SUBTAG, 1, JSEXN_RANGEERR, "duplicate variant subtag: {0}")
MSG_DEF(JSMSG_INTERNAL_INTL_ERROR, 0, JSEXN_ERR, "internal error while computing Intl data")
MSG_DEF(JSMSG_INTL_OBJECT_NOT_INITED, 3, JSEXN_TYPEERR, "Intl.{0}.prototype.{1} called on value that's not an object initialized as a {2}")
-MSG_DEF(JSMSG_INTL_OBJECT_REINITED, 0, JSEXN_TYPEERR, "can't initialize object twice as an object of an Intl constructor")
MSG_DEF(JSMSG_INVALID_CURRENCY_CODE, 1, JSEXN_RANGEERR, "invalid currency code in NumberFormat(): {0}")
MSG_DEF(JSMSG_INVALID_DIGITS_VALUE, 1, JSEXN_RANGEERR, "invalid digits value: {0}")
MSG_DEF(JSMSG_INVALID_KEYS_TYPE, 0, JSEXN_TYPEERR, "calendar info keys must be an object or undefined")
@@ -497,6 +497,8 @@ MSG_DEF(JSMSG_INVALID_LOCALES_ELEMENT, 0, JSEXN_TYPEERR, "invalid element in loc
MSG_DEF(JSMSG_INVALID_LOCALE_MATCHER, 1, JSEXN_RANGEERR, "invalid locale matcher in supportedLocalesOf(): {0}")
MSG_DEF(JSMSG_INVALID_OPTION_VALUE, 2, JSEXN_RANGEERR, "invalid value {1} for option {0}")
MSG_DEF(JSMSG_INVALID_TIME_ZONE, 1, JSEXN_RANGEERR, "invalid time zone in DateTimeFormat(): {0}")
+MSG_DEF(JSMSG_INVALID_DATETIME_OPTION, 2, JSEXN_TYPEERR, "can't set option {0} when {1} is used")
+MSG_DEF(JSMSG_INVALID_DATETIME_STYLE, 2, JSEXN_TYPEERR, "can't set option {0} in Date.{1}()")
MSG_DEF(JSMSG_UNDEFINED_CURRENCY, 0, JSEXN_TYPEERR, "undefined currency in NumberFormat() with currency style")
// RegExp
diff --git a/js/src/jsapi-tests/testLooselyEqual.cpp b/js/src/jsapi-tests/testLooselyEqual.cpp
index 70f5cf8964..5c017497c9 100644
--- a/js/src/jsapi-tests/testLooselyEqual.cpp
+++ b/js/src/jsapi-tests/testLooselyEqual.cpp
@@ -5,6 +5,8 @@
#include <limits>
#include <math.h>
+#include "js/Equality.h" // JS::LooselyEqual
+
#include "jsapi-tests/tests.h"
using namespace std;
@@ -15,15 +17,15 @@ struct LooseEqualityFixture : public JSAPITest
bool leq(JS::HandleValue x, JS::HandleValue y) {
bool equal;
- CHECK(JS_LooselyEqual(cx, x, y, &equal) && equal);
- CHECK(JS_LooselyEqual(cx, y, x, &equal) && equal);
+ CHECK(JS::LooselyEqual(cx, x, y, &equal) && equal);
+ CHECK(JS::LooselyEqual(cx, y, x, &equal) && equal);
return true;
}
bool nleq(JS::HandleValue x, JS::HandleValue y) {
bool equal;
- CHECK(JS_LooselyEqual(cx, x, y, &equal) && !equal);
- CHECK(JS_LooselyEqual(cx, y, x, &equal) && !equal);
+ CHECK(JS::LooselyEqual(cx, x, y, &equal) && !equal);
+ CHECK(JS::LooselyEqual(cx, y, x, &equal) && !equal);
return true;
}
};
diff --git a/js/src/jsapi-tests/testSameValue.cpp b/js/src/jsapi-tests/testSameValue.cpp
index 666da40360..50d2208d86 100644
--- a/js/src/jsapi-tests/testSameValue.cpp
+++ b/js/src/jsapi-tests/testSameValue.cpp
@@ -4,6 +4,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "js/Equality.h" // JS::SameValue
#include "jsapi-tests/tests.h"
BEGIN_TEST(testSameValue)
@@ -11,7 +12,7 @@ BEGIN_TEST(testSameValue)
/*
* NB: passing a double that fits in an integer jsval is API misuse. As a
- * matter of defense in depth, however, JS_SameValue should return the
+ * matter of defense in depth, however, JS::SameValue should return the
* correct result comparing a positive-zero double to a negative-zero
* double, and this is believed to be the only way to make such a
* comparison possible.
@@ -19,7 +20,7 @@ BEGIN_TEST(testSameValue)
JS::RootedValue v1(cx, JS::DoubleValue(0.0));
JS::RootedValue v2(cx, JS::DoubleValue(-0.0));
bool same;
- CHECK(JS_SameValue(cx, v1, v2, &same));
+ CHECK(JS::SameValue(cx, v1, v2, &same));
CHECK(!same);
return true;
}
diff --git a/js/src/jsapi-tests/tests.h b/js/src/jsapi-tests/tests.h
index 4d30ba8c85..dfb9f49887 100644
--- a/js/src/jsapi-tests/tests.h
+++ b/js/src/jsapi-tests/tests.h
@@ -18,6 +18,7 @@
#include "jscntxt.h"
#include "jsgc.h"
+#include "js/Equality.h" // JS::SameValue
#include "js/Vector.h"
/* Note: Aborts on OOM. */
@@ -201,9 +202,9 @@ class JSAPITest
const char* filename, int lineno) {
bool same;
JS::RootedValue actual(cx, actualArg), expected(cx, expectedArg);
- return (JS_SameValue(cx, actual, expected, &same) && same) ||
- fail(JSAPITestString("CHECK_SAME failed: expected JS_SameValue(cx, ") +
- actualExpr + ", " + expectedExpr + "), got !JS_SameValue(cx, " +
+ return (JS::SameValue(cx, actual, expected, &same) && same) ||
+ fail(JSAPITestString("CHECK_SAME failed: expected JS::SameValue(cx, ") +
+ actualExpr + ", " + expectedExpr + "), got !JS::SameValue(cx, " +
jsvalToSource(actual) + ", " + jsvalToSource(expected) + ")", filename, lineno);
}
diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp
index 50e3442ae8..9e5853b454 100644
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -392,36 +392,6 @@ JS_TypeOfValue(JSContext* cx, HandleValue value)
}
JS_PUBLIC_API(bool)
-JS_StrictlyEqual(JSContext* cx, HandleValue value1, HandleValue value2, bool* equal)
-{
- AssertHeapIsIdle(cx);
- CHECK_REQUEST(cx);
- assertSameCompartment(cx, value1, value2);
- MOZ_ASSERT(equal);
- return StrictlyEqual(cx, value1, value2, equal);
-}
-
-JS_PUBLIC_API(bool)
-JS_LooselyEqual(JSContext* cx, HandleValue value1, HandleValue value2, bool* equal)
-{
- AssertHeapIsIdle(cx);
- CHECK_REQUEST(cx);
- assertSameCompartment(cx, value1, value2);
- MOZ_ASSERT(equal);
- return LooselyEqual(cx, value1, value2, equal);
-}
-
-JS_PUBLIC_API(bool)
-JS_SameValue(JSContext* cx, HandleValue value1, HandleValue value2, bool* same)
-{
- AssertHeapIsIdle(cx);
- CHECK_REQUEST(cx);
- assertSameCompartment(cx, value1, value2);
- MOZ_ASSERT(same);
- return SameValue(cx, value1, value2, same);
-}
-
-JS_PUBLIC_API(bool)
JS_IsBuiltinEvalFunction(JSFunction* fun)
{
return IsAnyBuiltinEval(fun);
diff --git a/js/src/jsapi.h b/js/src/jsapi.h
index a6a5429cf5..f80d2602e6 100644
--- a/js/src/jsapi.h
+++ b/js/src/jsapi.h
@@ -959,15 +959,6 @@ InformalValueTypeName(const JS::Value& v);
} /* namespace JS */
-extern JS_PUBLIC_API(bool)
-JS_StrictlyEqual(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* equal);
-
-extern JS_PUBLIC_API(bool)
-JS_LooselyEqual(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* equal);
-
-extern JS_PUBLIC_API(bool)
-JS_SameValue(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* same);
-
/** True iff fun is the global eval function. */
extern JS_PUBLIC_API(bool)
JS_IsBuiltinEvalFunction(JSFunction* fun);
@@ -5336,8 +5327,8 @@ JS_ResetDefaultLocale(JSContext* cx);
* Locale specific string conversion and error message callbacks.
*/
struct JSLocaleCallbacks {
- JSLocaleToUpperCase localeToUpperCase;
- JSLocaleToLowerCase localeToLowerCase;
+ JSLocaleToUpperCase localeToUpperCase; // not used
+ JSLocaleToLowerCase localeToLowerCase; // not used
JSLocaleCompare localeCompare; // not used
JSLocaleToUnicode localeToUnicode;
};
diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp
index 912f393942..b166a786ca 100644
--- a/js/src/jsarray.cpp
+++ b/js/src/jsarray.cpp
@@ -3191,6 +3191,10 @@ static const JSFunctionSpec array_methods[] = {
/* ES2022 additions */
JS_SELF_HOSTED_FN("at", "ArrayAt", 1,0),
+
+ /* ES2023 proposals */
+ JS_SELF_HOSTED_FN("findLast", "ArrayFindLast", 1,0),
+ JS_SELF_HOSTED_FN("findLastIndex", "ArrayFindLastIndex", 1,0),
JS_FS_END
};
@@ -3356,6 +3360,8 @@ array_proto_finish(JSContext* cx, JS::HandleObject ctor, JS::HandleObject proto)
!DefineProperty(cx, unscopables, cx->names().fill, value) ||
!DefineProperty(cx, unscopables, cx->names().find, value) ||
!DefineProperty(cx, unscopables, cx->names().findIndex, value) ||
+ !DefineProperty(cx, unscopables, cx->names().findLast, value) ||
+ !DefineProperty(cx, unscopables, cx->names().findLastIndex, value) ||
!DefineProperty(cx, unscopables, cx->names().flat, value) ||
!DefineProperty(cx, unscopables, cx->names().flatMap, value) ||
!DefineProperty(cx, unscopables, cx->names().includes, value) ||
diff --git a/js/src/jscntxt.cpp b/js/src/jscntxt.cpp
index dc14b83fd9..66a548d6e8 100644
--- a/js/src/jscntxt.cpp
+++ b/js/src/jscntxt.cpp
@@ -240,6 +240,13 @@ js::ReportOutOfMemory(ExclusiveContext* cxArg)
cx->setPendingException(oomMessage, nullptr);
}
+mozilla::GenericErrorResult<OOM&>
+js::ReportOutOfMemoryResult(ExclusiveContext* cx)
+{
+ ReportOutOfMemory(cx);
+ return cx->alreadyReportedOOM();
+}
+
void
js::ReportOverRecursed(JSContext* maybecx, unsigned errorNumber)
{
@@ -1004,6 +1011,34 @@ ExclusiveContext::recoverFromOutOfMemory()
task->outOfMemory = false;
}
+JS::Error ExclusiveContext::reportedError;
+JS::OOM ExclusiveContext::reportedOOM;
+
+mozilla::GenericErrorResult<OOM&>
+ExclusiveContext::alreadyReportedOOM()
+{
+#ifdef DEBUG
+ if (JSContext* maybecx = maybeJSContext()) {
+ MOZ_ASSERT(maybecx->isThrowingOutOfMemory());
+ } else {
+ // Keep in sync with addPendingOutOfMemory.
+ if (ParseTask* task = helperThread()->parseTask())
+ MOZ_ASSERT(task->outOfMemory);
+ }
+#endif
+ return mozilla::MakeGenericErrorResult(reportedOOM);
+}
+
+mozilla::GenericErrorResult<JS::Error&>
+ExclusiveContext::alreadyReportedError()
+{
+#ifdef DEBUG
+ if (JSContext* maybecx = maybeJSContext())
+ MOZ_ASSERT(maybecx->isExceptionPending());
+#endif
+ return mozilla::MakeGenericErrorResult(reportedError);
+}
+
JSContext::JSContext(JSRuntime* parentRuntime)
: ExclusiveContext(this, &this->JSRuntime::mainThread, Context_JS, JS::ContextOptions()),
JSRuntime(parentRuntime),
diff --git a/js/src/jscntxt.h b/js/src/jscntxt.h
index 93106d681e..c4ef783d3a 100644
--- a/js/src/jscntxt.h
+++ b/js/src/jscntxt.h
@@ -12,6 +12,7 @@
#include "js/CharacterEncoding.h"
#include "js/GCVector.h"
+#include "js/Result.h"
#include "js/Utility.h"
#include "js/Vector.h"
#include "vm/Caches.h"
@@ -314,6 +315,30 @@ class ExclusiveContext : public ContextFriendFields,
bool addPendingCompileError(frontend::CompileError** err);
void addPendingOverRecursed();
void addPendingOutOfMemory();
+
+ private:
+ static JS::Error reportedError;
+ static JS::OOM reportedOOM;
+
+ public:
+ inline JS::Result<> boolToResult(bool ok);
+
+ /**
+ * Intentionally awkward signpost method that is stationed on the
+ * boundary between Result-using and non-Result-using code.
+ */
+ template <typename V, typename E>
+ bool resultToBool(JS::Result<V, E> result) {
+ return result.isOk();
+ }
+
+ template <typename V, typename E>
+ V* resultToPtr(JS::Result<V*, E> result) {
+ return result.isOk() ? result.unwrap() : nullptr;
+ }
+
+ mozilla::GenericErrorResult<JS::OOM&> alreadyReportedOOM();
+ mozilla::GenericErrorResult<JS::Error&> alreadyReportedError();
};
void ReportOverRecursed(JSContext* cx, unsigned errorNumber);
@@ -340,6 +365,7 @@ struct JSContext : public js::ExclusiveContext,
using ExclusiveContext::permanentAtoms;
using ExclusiveContext::pod_calloc;
using ExclusiveContext::pod_malloc;
+ using ExclusiveContext::pod_realloc;
using ExclusiveContext::staticStrings;
using ExclusiveContext::updateMallocCounter;
using ExclusiveContext::wellKnownSymbols;
@@ -490,7 +516,7 @@ struct JSContext : public js::ExclusiveContext,
}
public:
- bool isExceptionPending() {
+ bool isExceptionPending() const {
return throwing;
}
@@ -540,6 +566,17 @@ struct JSContext : public js::ExclusiveContext,
namespace js {
+inline JS::Result<>
+ExclusiveContext::boolToResult(bool ok)
+{
+ if (MOZ_LIKELY(ok)) {
+ MOZ_ASSERT_IF(isJSContext(), !asJSContext()->isExceptionPending());
+ MOZ_ASSERT_IF(isJSContext(), !asJSContext()->isPropagatingForcedReturn());
+ return JS::Ok();
+ }
+ return JS::Result<>(reportedError);
+}
+
struct MOZ_RAII AutoResolving {
public:
enum Kind {
diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h
index 71c9deb94e..6a13d4343c 100644
--- a/js/src/jsfriendapi.h
+++ b/js/src/jsfriendapi.h
@@ -2862,6 +2862,20 @@ ToWindowProxyIfWindow(JSObject* obj);
extern JS_FRIEND_API(JSObject*)
ToWindowIfWindowProxy(JSObject* obj);
+/*
+ * This custom date/time formatter constructor gives users the ability
+ * to specify a custom format pattern. This pattern is passed *directly*
+ * to ICU with NO SYNTAX PARSING OR VALIDATION WHATSOEVER. ICU appears to
+ * have a a modicum of testing of this, and it won't fall over completely
+ * if passed bad input. But the current behavior is entirely under-specified
+ * and emphatically not shippable on the web, and it *must* be fixed before
+ * this functionality can be exposed in the real world. (There are also some
+ * questions about whether the format exposed here is the *right* one to
+ * standardize, that will also need to be resolved to ship this.)
+ */
+extern bool
+AddMozDateTimeFormatConstructor(JSContext* cx, JS::Handle<JSObject*> intl);
+
} /* namespace js */
class NativeProfiler
diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp
index 7fb035794b..e172ea36c2 100644
--- a/js/src/jsgc.cpp
+++ b/js/src/jsgc.cpp
@@ -384,6 +384,42 @@ static const FinalizePhase BackgroundFinalizePhases[] = {
}
};
+// Incremental sweeping is controlled by a list of actions that describe what
+// happens and in what order. Due to the incremental nature of sweeping an
+// action does not necessarily run to completion so the current state is tracked
+// in the GCRuntime by the performSweepActions() method.
+//
+// Actions are performed in phases run per sweep group, and each action is run
+// for every zone in the group, i.e. as if by the following pseudocode:
+//
+// for each sweep group:
+// for each phase:
+// for each zone in sweep group:
+// for each action in phase:
+// perform_action
+
+struct SweepAction
+{
+ using Func = IncrementalProgress (*)(GCRuntime* gc, FreeOp* fop, Zone* zone,
+ SliceBudget& budget, AllocKind kind);
+
+ Func func;
+ AllocKind kind;
+
+ SweepAction(Func func, AllocKind kind) : func(func), kind(kind) {}
+};
+
+using SweepActionVector = Vector<SweepAction, 0, SystemAllocPolicy>;
+using SweepPhaseVector = Vector<SweepActionVector, 0, SystemAllocPolicy>;
+
+static SweepPhaseVector SweepPhases;
+
+bool
+js::gc::InitializeStaticData()
+{
+ return GCRuntime::initializeSweepActions();
+}
+
template<>
JSObject*
ArenaCellIterImpl::get<JSObject>() const
@@ -841,8 +877,9 @@ GCRuntime::GCRuntime(JSRuntime* rt) :
zoneGroupIndex(0),
zoneGroups(nullptr),
currentZoneGroup(nullptr),
+ sweepPhaseIndex(0),
sweepZone(nullptr),
- sweepKind(AllocKind::FIRST),
+ sweepActionIndex(0),
abortSweepAfterCurrentGroup(false),
arenasAllocatedDuringSweep(nullptr),
startedCompacting(false),
@@ -883,7 +920,7 @@ static const uint64_t JIT_SCRIPT_RELEASE_TYPES_PERIOD = 20;
bool
GCRuntime::init(uint32_t maxbytes, uint32_t maxNurseryBytes)
{
- InitMemorySubsystem();
+ MOZ_ASSERT(SystemPageSize());
if (!rootsHash.init(256))
return false;
@@ -3915,7 +3952,7 @@ struct AddOutgoingEdgeFunctor {
*/
if (needsEdge_) {
JS::Zone* zone = other.zone();
- if (zone->isGCMarking())
+ if (zone->shouldMarkInZone())
finder_.addEdgeTo(zone);
}
}
@@ -3946,14 +3983,14 @@ Zone::findOutgoingEdges(ZoneComponentFinder& finder)
*/
JSRuntime* rt = runtimeFromMainThread();
Zone* atomsZone = rt->atomsCompartment(finder.lock)->zone();
- if (atomsZone->isGCMarking())
+ if (atomsZone->shouldMarkInZone())
finder.addEdgeTo(atomsZone);
for (CompartmentsInZoneIter comp(this); !comp.done(); comp.next())
comp->findOutgoingEdges(finder);
for (ZoneSet::Range r = gcZoneGroupEdges.all(); !r.empty(); r.popFront()) {
- if (r.front()->isGCMarking())
+ if (r.front()->shouldMarkInZone())
finder.addEdgeTo(r.front());
}
@@ -3995,7 +4032,7 @@ GCRuntime::findZoneGroups(AutoLockForExclusiveAccess& lock)
finder.useOneComponent();
for (GCZonesIter zone(rt); !zone.done(); zone.next()) {
- MOZ_ASSERT(zone->isGCMarking());
+ MOZ_ASSERT(zone->shouldMarkInZone());
finder.addNode(zone);
}
zoneGroups = finder.getResultsList();
@@ -4008,7 +4045,7 @@ GCRuntime::findZoneGroups(AutoLockForExclusiveAccess& lock)
#ifdef DEBUG
for (Zone* head = currentZoneGroup; head; head = head->nextGroup()) {
for (Zone* zone = head; zone; zone = zone->nextNodeInGroup())
- MOZ_ASSERT(zone->isGCMarking());
+ MOZ_ASSERT(zone->shouldMarkInZone());
}
MOZ_ASSERT_IF(!isIncremental, !currentZoneGroup->nextGroup());
@@ -4031,7 +4068,7 @@ GCRuntime::getNextZoneGroup()
}
for (Zone* zone = currentZoneGroup; zone; zone = zone->nextNodeInGroup()) {
- MOZ_ASSERT(zone->isGCMarking());
+ MOZ_ASSERT(zone->shouldMarkInZone());
MOZ_ASSERT(!zone->isQueuedForBackgroundSweep());
}
@@ -4042,7 +4079,7 @@ GCRuntime::getNextZoneGroup()
MOZ_ASSERT(!isIncremental);
for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) {
MOZ_ASSERT(!zone->gcNextGraphComponent);
- MOZ_ASSERT(zone->isGCMarking());
+ MOZ_ASSERT(zone->shouldMarkInZone());
zone->setNeedsIncrementalBarrier(false, Zone::UpdateJit);
zone->setGCState(Zone::NoGC);
zone->gcGrayRoots.clearAndFree();
@@ -4485,7 +4522,7 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock)
bool sweepingAtoms = false;
for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) {
/* Set the GC state to sweeping. */
- MOZ_ASSERT(zone->isGCMarking());
+ MOZ_ASSERT(zone->shouldMarkInZone());
zone->setGCState(Zone::Sweep);
/* Purge the ArenaLists before sweeping. */
@@ -4667,11 +4704,9 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock)
zone->arenas.queueForegroundThingsForSweep(&fop);
}
- sweepingTypes = true;
-
- finalizePhase = 0;
+ sweepPhaseIndex = 0;
sweepZone = currentZoneGroup;
- sweepKind = AllocKind::FIRST;
+ sweepActionIndex = 0;
{
gcstats::AutoPhase ap(stats, gcstats::PHASE_FINALIZE_END);
@@ -4765,7 +4800,7 @@ ArenaLists::foregroundFinalize(FreeOp* fop, AllocKind thingKind, SliceBudget& sl
return true;
}
-GCRuntime::IncrementalProgress
+IncrementalProgress
GCRuntime::drainMarkStack(SliceBudget& sliceBudget, gcstats::Phase phase)
{
/* Run a marking slice and return whether the stack is now empty. */
@@ -4810,105 +4845,160 @@ SweepArenaList(Arena** arenasToSweep, SliceBudget& sliceBudget, Args... args)
return true;
}
-GCRuntime::IncrementalProgress
-GCRuntime::sweepPhase(SliceBudget& sliceBudget, AutoLockForExclusiveAccess& lock)
+/* static */ IncrementalProgress
+GCRuntime::sweepTypeInformation(GCRuntime* gc, FreeOp* fop, Zone* zone, SliceBudget& budget,
+ AllocKind kind)
{
- AutoSetThreadIsSweeping threadIsSweeping;
+ // Sweep dead type information stored in scripts and object groups, but
+ // don't finalize them yet. We have to sweep dead information from both live
+ // and dead scripts and object groups, so that no dead references remain in
+ // them. Type inference can end up crawling these zones again, such as for
+ // TypeCompartment::markSetsUnknown, and if this happens after sweeping for
+ // the sweep group finishes we won't be able to determine which things in
+ // the zone are live.
- gcstats::AutoPhase ap(stats, gcstats::PHASE_SWEEP);
- FreeOp fop(rt);
+ MOZ_ASSERT(kind == AllocKind::LIMIT);
+
+ gcstats::AutoPhase ap1(gc->stats, gcstats::PHASE_SWEEP_COMPARTMENTS);
+ gcstats::AutoPhase ap2(gc->stats, gcstats::PHASE_SWEEP_TYPES);
- if (drainMarkStack(sliceBudget, gcstats::PHASE_SWEEP_MARK) == NotFinished)
+ ArenaLists& al = zone->arenas;
+
+ AutoClearTypeInferenceStateOnOOM oom(zone);
+
+ if (!SweepArenaList<JSScript>(&al.gcScriptArenasToUpdate, budget, &oom))
return NotFinished;
+ if (!SweepArenaList<ObjectGroup>(&al.gcObjectGroupArenasToUpdate, budget, &oom))
+ return NotFinished;
- for (;;) {
- // Sweep dead type information stored in scripts and object groups, but
- // don't finalize them yet. We have to sweep dead information from both
- // live and dead scripts and object groups, so that no dead references
- // remain in them. Type inference can end up crawling these zones
- // again, such as for TypeCompartment::markSetsUnknown, and if this
- // happens after sweeping for the zone group finishes we won't be able
- // to determine which things in the zone are live.
- if (sweepingTypes) {
- gcstats::AutoPhase ap1(stats, gcstats::PHASE_SWEEP_COMPARTMENTS);
- gcstats::AutoPhase ap2(stats, gcstats::PHASE_SWEEP_TYPES);
+ // Finish sweeping type information in the zone.
+ {
+ gcstats::AutoPhase ap(gc->stats, gcstats::PHASE_SWEEP_TYPES_END);
+ zone->types.endSweep(gc->rt);
+ }
- for (; sweepZone; sweepZone = sweepZone->nextNodeInGroup()) {
- ArenaLists& al = sweepZone->arenas;
+ return Finished;
+}
- AutoClearTypeInferenceStateOnOOM oom(sweepZone);
+/* static */ IncrementalProgress
+GCRuntime::mergeSweptObjectArenas(GCRuntime* gc, FreeOp* fop, Zone* zone, SliceBudget& budget,
+ AllocKind kind)
+{
+ // Foreground finalized objects have already been finalized, and now their
+ // arenas can be reclaimed by freeing empty ones and making non-empty ones
+ // available for allocation.
- if (!SweepArenaList<JSScript>(&al.gcScriptArenasToUpdate, sliceBudget, &oom))
- return NotFinished;
+ MOZ_ASSERT(kind == AllocKind::LIMIT);
+ zone->arenas.mergeForegroundSweptObjectArenas();
+ return Finished;
+}
- if (!SweepArenaList<ObjectGroup>(
- &al.gcObjectGroupArenasToUpdate, sliceBudget, &oom))
- {
- return NotFinished;
- }
+/* static */ IncrementalProgress
+GCRuntime::finalizeAllocKind(GCRuntime* gc, FreeOp* fop, Zone* zone, SliceBudget& budget,
+ AllocKind kind)
+{
+ // Set the number of things per arena for this AllocKind.
+ size_t thingsPerArena = Arena::thingsPerArena(kind);
+ auto& sweepList = gc->incrementalSweepList;
+ sweepList.setThingsPerArena(thingsPerArena);
- // Finish sweeping type information in the zone.
- {
- gcstats::AutoPhase ap(stats, gcstats::PHASE_SWEEP_TYPES_END);
- sweepZone->types.endSweep(rt);
- }
+ if (!zone->arenas.foregroundFinalize(fop, kind, budget, sweepList))
+ return NotFinished;
- // Foreground finalized objects have already been finalized,
- // and now their arenas can be reclaimed by freeing empty ones
- // and making non-empty ones available for allocation.
- al.mergeForegroundSweptObjectArenas();
- }
+ // Reset the slots of the sweep list that we used.
+ sweepList.reset(thingsPerArena);
- sweepZone = currentZoneGroup;
- sweepingTypes = false;
- }
+ return Finished;
+}
- /* Finalize foreground finalized things. */
- for (; finalizePhase < ArrayLength(IncrementalFinalizePhases) ; ++finalizePhase) {
- gcstats::AutoPhase ap(stats, IncrementalFinalizePhases[finalizePhase].statsPhase);
+/* static */ IncrementalProgress
+GCRuntime::sweepShapeTree(GCRuntime* gc, FreeOp* fop, Zone* zone, SliceBudget& budget,
+ AllocKind kind)
+{
+ // Remove dead shapes from the shape tree, but don't finalize them yet.
- for (; sweepZone; sweepZone = sweepZone->nextNodeInGroup()) {
- Zone* zone = sweepZone;
+ MOZ_ASSERT(kind == AllocKind::LIMIT);
- for (auto kind : SomeAllocKinds(sweepKind, AllocKind::LIMIT)) {
- if (!IncrementalFinalizePhases[finalizePhase].kinds.contains(kind))
- continue;
+ gcstats::AutoPhase ap(gc->stats, gcstats::PHASE_SWEEP_SHAPE);
- /* Set the number of things per arena for this AllocKind. */
- size_t thingsPerArena = Arena::thingsPerArena(kind);
- incrementalSweepList.setThingsPerArena(thingsPerArena);
+ ArenaLists& al = zone->arenas;
- if (!zone->arenas.foregroundFinalize(&fop, kind, sliceBudget,
- incrementalSweepList))
- {
- sweepKind = kind;
- return NotFinished;
- }
+ if (!SweepArenaList<Shape>(&al.gcShapeArenasToUpdate, budget))
+ return NotFinished;
- /* Reset the slots of the sweep list that we used. */
- incrementalSweepList.reset(thingsPerArena);
- }
- sweepKind = AllocKind::FIRST;
- }
- sweepZone = currentZoneGroup;
- }
+ if (!SweepArenaList<AccessorShape>(&al.gcAccessorShapeArenasToUpdate, budget))
+ return NotFinished;
- /* Remove dead shapes from the shape tree, but don't finalize them yet. */
- {
- gcstats::AutoPhase ap(stats, gcstats::PHASE_SWEEP_SHAPE);
+ return Finished;
+}
- for (; sweepZone; sweepZone = sweepZone->nextNodeInGroup()) {
- ArenaLists& al = sweepZone->arenas;
+static void
+AddSweepPhase(bool* ok)
+{
+ if (*ok)
+ *ok = SweepPhases.emplaceBack();
+}
+
+static void
+AddSweepAction(bool* ok, SweepAction::Func func, AllocKind kind = AllocKind::LIMIT)
+{
+ if (*ok)
+ *ok = SweepPhases.back().emplaceBack(func, kind);
+}
+
+/* static */ bool
+GCRuntime::initializeSweepActions()
+{
+ bool ok = true;
+
+ AddSweepPhase(&ok);
- if (!SweepArenaList<Shape>(&al.gcShapeArenasToUpdate, sliceBudget))
- return NotFinished;
+ AddSweepAction(&ok, GCRuntime::sweepTypeInformation);
+ AddSweepAction(&ok, GCRuntime::mergeSweptObjectArenas);
- if (!SweepArenaList<AccessorShape>(&al.gcAccessorShapeArenasToUpdate, sliceBudget))
- return NotFinished;
+ for (const auto& finalizePhase : IncrementalFinalizePhases) {
+ AddSweepPhase(&ok);
+ for (auto kind : finalizePhase.kinds)
+ AddSweepAction(&ok, GCRuntime::finalizeAllocKind, kind);
+ }
+
+ AddSweepPhase(&ok);
+ AddSweepAction(&ok, GCRuntime::sweepShapeTree);
+
+ return ok;
+}
+
+IncrementalProgress
+GCRuntime::performSweepActions(SliceBudget& budget, AutoLockForExclusiveAccess& lock)
+{
+ AutoSetThreadIsSweeping threadIsSweeping;
+
+ gcstats::AutoPhase ap(stats, gcstats::PHASE_SWEEP);
+ FreeOp fop(rt);
+
+ if (drainMarkStack(budget, gcstats::PHASE_SWEEP_MARK) == NotFinished)
+ return NotFinished;
+
+
+ for (;;) {
+ for (; sweepPhaseIndex < SweepPhases.length(); sweepPhaseIndex++) {
+ const auto& actions = SweepPhases[sweepPhaseIndex];
+ for (; sweepZone; sweepZone = sweepZone->nextNodeInGroup()) {
+ for (; sweepActionIndex < actions.length(); sweepActionIndex++) {
+ const auto& action = actions[sweepActionIndex];
+ if (action.func(this, &fop, sweepZone, budget, action.kind) == NotFinished)
+ return NotFinished;
+ }
+ // Reset action index to first.
+ sweepActionIndex = 0;
}
+ sweepZone = currentZoneGroup;
}
+ // Reset phase index.
+ sweepPhaseIndex = 0;
+
endSweepingZoneGroup();
getNextZoneGroup();
if (!currentZoneGroup)
@@ -4999,7 +5089,7 @@ GCRuntime::beginCompactPhase()
startedCompacting = true;
}
-GCRuntime::IncrementalProgress
+IncrementalProgress
GCRuntime::compactPhase(JS::gcreason::Reason reason, SliceBudget& sliceBudget,
AutoLockForExclusiveAccess& lock)
{
@@ -5141,7 +5231,7 @@ GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoLockForExclusiveAccess
ResetGrayList(c);
for (GCZonesIter zone(rt); !zone.done(); zone.next()) {
- MOZ_ASSERT(zone->isGCMarking());
+ MOZ_ASSERT(zone->shouldMarkInZone());
zone->setNeedsIncrementalBarrier(false, Zone::UpdateJit);
zone->setGCState(Zone::NoGC);
}
@@ -5265,7 +5355,7 @@ AutoGCSlice::AutoGCSlice(JSRuntime* rt)
* is expensive) because Ion code doesn't run during GC. If need be,
* we'll update the Ion barriers in ~AutoGCSlice.
*/
- if (zone->isGCMarking()) {
+ if (zone->shouldMarkInZone()) {
MOZ_ASSERT(zone->needsIncrementalBarrier());
zone->setNeedsIncrementalBarrier(false, Zone::DontUpdateJit);
} else {
@@ -5278,7 +5368,7 @@ AutoGCSlice::~AutoGCSlice()
{
/* We can't use GCZonesIter if this is the end of the last slice. */
for (ZonesIter zone(runtime, WithAtoms); !zone.done(); zone.next()) {
- if (zone->isGCMarking()) {
+ if (zone->shouldMarkInZone()) {
zone->setNeedsIncrementalBarrier(true, Zone::UpdateJit);
zone->arenas.purge();
} else {
@@ -5381,7 +5471,7 @@ GCRuntime::incrementalCollectSlice(SliceBudget& budget, JS::gcreason::Reason rea
MOZ_FALLTHROUGH;
case State::Sweep:
- if (sweepPhase(budget, lock) == NotFinished)
+ if (performSweepActions(budget, lock) == NotFinished)
break;
endSweepPhase(destroyingRuntime, lock);
diff --git a/js/src/jsgc.h b/js/src/jsgc.h
index 4d6e086521..ffd6102747 100644
--- a/js/src/jsgc.h
+++ b/js/src/jsgc.h
@@ -838,6 +838,9 @@ class ArenaLists
/* The number of GC cycles an empty chunk can survive before been released. */
const size_t MAX_EMPTY_CHUNK_AGE = 4;
+extern bool
+InitializeStaticData();
+
} /* namespace gc */
class InterpreterFrame;
diff --git a/js/src/jsiter.cpp b/js/src/jsiter.cpp
index f7fb664b0c..726a84985a 100644
--- a/js/src/jsiter.cpp
+++ b/js/src/jsiter.cpp
@@ -553,10 +553,10 @@ NewPropertyIteratorObject(JSContext* cx, unsigned flags)
if (!shape)
return nullptr;
- JSObject* obj = JSObject::create(cx, ITERATOR_FINALIZE_KIND,
- GetInitialHeap(GenericObject, clasp), shape, group);
- if (!obj)
- return nullptr;
+ JSObject* obj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, obj, JSObject::create(cx, ITERATOR_FINALIZE_KIND,
+ GetInitialHeap(GenericObject, clasp),
+ shape, group));
PropertyIteratorObject* res = &obj->as<PropertyIteratorObject>();
diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp
index 4357aa8f68..b0cf6bc69b 100644
--- a/js/src/jsobj.cpp
+++ b/js/src/jsobj.cpp
@@ -257,15 +257,15 @@ js::Throw(JSContext* cx, JSObject* obj, unsigned errorNumber)
/*** PropertyDescriptor operations and DefineProperties ******************************************/
-bool
+static Result<>
CheckCallable(JSContext* cx, JSObject* obj, const char* fieldName)
{
if (obj && !obj->isCallable()) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_GET_SET_FIELD,
fieldName);
- return false;
+ return cx->alreadyReportedError();
}
- return true;
+ return Ok();
}
bool
@@ -335,8 +335,8 @@ js::ToPropertyDescriptor(JSContext* cx, HandleValue descval, bool checkAccessors
hasGetOrSet = found;
if (found) {
if (v.isObject()) {
- if (checkAccessors && !CheckCallable(cx, &v.toObject(), js_getter_str))
- return false;
+ if (checkAccessors)
+ JS_TRY_OR_RETURN_FALSE(cx, CheckCallable(cx, &v.toObject(), js_getter_str));
desc.setGetterObject(&v.toObject());
} else if (!v.isUndefined()) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_GET_SET_FIELD,
@@ -353,8 +353,8 @@ js::ToPropertyDescriptor(JSContext* cx, HandleValue descval, bool checkAccessors
hasGetOrSet |= found;
if (found) {
if (v.isObject()) {
- if (checkAccessors && !CheckCallable(cx, &v.toObject(), js_setter_str))
- return false;
+ if (checkAccessors)
+ JS_TRY_OR_RETURN_FALSE(cx, CheckCallable(cx, &v.toObject(), js_setter_str));
desc.setSetterObject(&v.toObject());
} else if (!v.isUndefined()) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_GET_SET_FIELD,
@@ -381,18 +381,16 @@ js::ToPropertyDescriptor(JSContext* cx, HandleValue descval, bool checkAccessors
return true;
}
-bool
+Result<>
js::CheckPropertyDescriptorAccessors(JSContext* cx, Handle<PropertyDescriptor> desc)
{
- if (desc.hasGetterObject()) {
- if (!CheckCallable(cx, desc.getterObject(), js_getter_str))
- return false;
- }
- if (desc.hasSetterObject()) {
- if (!CheckCallable(cx, desc.setterObject(), js_setter_str))
- return false;
- }
- return true;
+ if (desc.hasGetterObject())
+ MOZ_TRY(CheckCallable(cx, desc.getterObject(), js_getter_str));
+
+ if (desc.hasSetterObject())
+ MOZ_TRY(CheckCallable(cx, desc.setterObject(), js_setter_str));
+
+ return Ok();
}
void
@@ -646,9 +644,8 @@ NewObject(ExclusiveContext* cx, HandleObjectGroup group, gc::AllocKind kind,
return nullptr;
gc::InitialHeap heap = GetInitialHeap(newKind, clasp);
- JSObject* obj = JSObject::create(cx, kind, heap, shape, group);
- if (!obj)
- return nullptr;
+ JSObject* obj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, obj, JSObject::create(cx, kind, heap, shape, group));
if (newKind == SingletonObject) {
RootedObject nobj(cx, obj);
diff --git a/js/src/jsobj.h b/js/src/jsobj.h
index 49047192ed..a53667d251 100644
--- a/js/src/jsobj.h
+++ b/js/src/jsobj.h
@@ -179,11 +179,9 @@ class JSObject : public js::gc::Cell
* Make a non-array object with the specified initial state. This method
* takes ownership of any extantSlots it is passed.
*/
- static inline JSObject* create(js::ExclusiveContext* cx,
- js::gc::AllocKind kind,
- js::gc::InitialHeap heap,
- js::HandleShape shape,
- js::HandleObjectGroup group);
+ static inline JS::Result<JSObject*, JS::OOM&>
+ create(js::ExclusiveContext* cx, js::gc::AllocKind kind, js::gc::InitialHeap heap,
+ js::HandleShape shape, js::HandleObjectGroup group);
// Set the initial slots and elements of an object. These pointers are only
// valid for native objects, but during initialization are set for all
@@ -1173,7 +1171,7 @@ ToPropertyDescriptor(JSContext* cx, HandleValue descval, bool checkAccessors,
* callable. This performs exactly the checks omitted by ToPropertyDescriptor
* when checkAccessors is false.
*/
-bool
+Result<>
CheckPropertyDescriptorAccessors(JSContext* cx, Handle<JS::PropertyDescriptor> desc);
void
diff --git a/js/src/jsobjinlines.h b/js/src/jsobjinlines.h
index 9039fc7eb6..a27a13fd6c 100644
--- a/js/src/jsobjinlines.h
+++ b/js/src/jsobjinlines.h
@@ -319,7 +319,7 @@ SetNewObjectMetadata(ExclusiveContext* cxArg, JSObject* obj)
} // namespace js
-/* static */ inline JSObject*
+/* static */ inline JS::Result<JSObject*, JS::OOM&>
JSObject::create(js::ExclusiveContext* cx, js::gc::AllocKind kind, js::gc::InitialHeap heap,
js::HandleShape shape, js::HandleObjectGroup group)
{
@@ -375,7 +375,7 @@ JSObject::create(js::ExclusiveContext* cx, js::gc::AllocKind kind, js::gc::Initi
JSObject* obj = js::Allocate<JSObject>(cx, kind, nDynamicSlots, heap, clasp);
if (!obj)
- return nullptr;
+ return cx->alreadyReportedOOM();
obj->group_.init(group);
diff --git a/js/src/jspubtd.h b/js/src/jspubtd.h
index 065d2790ec..01d3143023 100644
--- a/js/src/jspubtd.h
+++ b/js/src/jspubtd.h
@@ -18,6 +18,7 @@
#include "jsprototypes.h"
#include "jstypes.h"
+#include "js/Result.h"
#include "js/TraceKind.h"
#include "js/TypeDecls.h"
diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp
index 6726da9457..fdee274c32 100644
--- a/js/src/jsstr.cpp
+++ b/js/src/jsstr.cpp
@@ -31,10 +31,12 @@
#include "jsutil.h"
#include "builtin/intl/ICUHeader.h"
+#include "builtin/intl/CommonFunctions.h"
#include "builtin/RegExp.h"
#include "jit/InlinableNatives.h"
#include "js/Conversions.h"
#include "js/UniquePtr.h"
+#include "unicode/uchar.h"
#include "unicode/unorm2.h"
#include "vm/GlobalObject.h"
#include "vm/Interpreter.h"
@@ -599,18 +601,209 @@ js::SubstringKernel(JSContext* cx, HandleString str, int32_t beginInt, int32_t l
}
template <typename CharT>
+static auto
+ReallocChars(JSContext* cx, UniquePtr<CharT[], JS::FreePolicy> chars, size_t oldLength,
+ size_t newLength)
+ -> decltype(chars)
+{
+ using AnyCharPtr = decltype(chars);
+
+ CharT* oldChars = chars.release();
+ CharT* newChars = cx->pod_realloc<CharT>(oldChars, oldLength, newLength);
+ if (!newChars) {
+ js_free(oldChars);
+ return AnyCharPtr();
+ }
+
+ return AnyCharPtr(newChars);
+}
+
+/**
+ * U+03A3 GREEK CAPITAL LETTER SIGMA has two different lower case mappings
+ * depending on its context:
+ * When it's preceded by a cased character and not followed by another cased
+ * character, its lower case form is U+03C2 GREEK SMALL LETTER FINAL SIGMA.
+ * Otherwise its lower case mapping is U+03C3 GREEK SMALL LETTER SIGMA.
+ *
+ * Unicode 9.0, §3.13 Default Case Algorithms
+ */
+static char16_t
+Final_Sigma(const char16_t* chars, size_t length, size_t index)
+{
+ MOZ_ASSERT(index < length);
+ MOZ_ASSERT(chars[index] == unicode::GREEK_CAPITAL_LETTER_SIGMA);
+ MOZ_ASSERT(unicode::ToLowerCase(unicode::GREEK_CAPITAL_LETTER_SIGMA) ==
+ unicode::GREEK_SMALL_LETTER_SIGMA);
+
+ // Tell the analysis the BinaryProperty.contains function pointer called by
+ // u_hasBinaryProperty cannot GC.
+ JS::AutoSuppressGCAnalysis nogc;
+
+ bool precededByCased = false;
+ for (size_t i = index; i > 0; ) {
+ char16_t c = chars[--i];
+ uint32_t codePoint = c;
+ if (unicode::IsTrailSurrogate(c) && i > 0) {
+ char16_t lead = chars[i - 1];
+ if (unicode::IsLeadSurrogate(lead)) {
+ codePoint = unicode::UTF16Decode(lead, c);
+ i--;
+ }
+ }
+
+ // Ignore any characters with the property Case_Ignorable.
+ // NB: We need to skip over all Case_Ignorable characters, even when
+ // they also have the Cased binary property.
+ if (u_hasBinaryProperty(codePoint, UCHAR_CASE_IGNORABLE))
+ continue;
+
+ precededByCased = u_hasBinaryProperty(codePoint, UCHAR_CASED);
+ break;
+ }
+ if (!precededByCased)
+ return unicode::GREEK_SMALL_LETTER_SIGMA;
+
+ bool followedByCased = false;
+ for (size_t i = index + 1; i < length; ) {
+ char16_t c = chars[i++];
+ uint32_t codePoint = c;
+ if (unicode::IsLeadSurrogate(c) && i < length) {
+ char16_t trail = chars[i];
+ if (unicode::IsTrailSurrogate(trail)) {
+ codePoint = unicode::UTF16Decode(c, trail);
+ i++;
+ }
+ }
+
+ // Ignore any characters with the property Case_Ignorable.
+ // NB: We need to skip over all Case_Ignorable characters, even when
+ // they also have the Cased binary property.
+ if (u_hasBinaryProperty(codePoint, UCHAR_CASE_IGNORABLE))
+ continue;
+
+ followedByCased = u_hasBinaryProperty(codePoint, UCHAR_CASED);
+ break;
+ }
+ if (!followedByCased)
+ return unicode::GREEK_SMALL_LETTER_FINAL_SIGMA;
+
+ return unicode::GREEK_SMALL_LETTER_SIGMA;
+}
+
+static Latin1Char
+Final_Sigma(const Latin1Char* chars, size_t length, size_t index)
+{
+ MOZ_ASSERT_UNREACHABLE("U+03A3 is not a Latin-1 character");
+ return 0;
+}
+
+// If |srcLength == destLength| is true, the destination buffer was allocated
+// with the same size as the source buffer. When we append characters which
+// have special casing mappings, we test |srcLength == destLength| to decide
+// if we need to back out and reallocate a sufficiently large destination
+// buffer. Otherwise the destination buffer was allocated with the correct
+// size to hold all lower case mapped characters, i.e.
+// |destLength == ToLowerCaseLength(srcChars, 0, srcLength)| is true.
+template <typename CharT>
+static size_t
+ToLowerCaseImpl(CharT* destChars, const CharT* srcChars, size_t startIndex, size_t srcLength,
+ size_t destLength)
+{
+ MOZ_ASSERT(startIndex < srcLength);
+ MOZ_ASSERT(srcLength <= destLength);
+ MOZ_ASSERT_IF((IsSame<CharT, Latin1Char>::value), srcLength == destLength);
+
+ size_t j = startIndex;
+ for (size_t i = startIndex; i < srcLength; i++) {
+ char16_t c = srcChars[i];
+ if (!IsSame<CharT, Latin1Char>::value) {
+ if (unicode::IsLeadSurrogate(c) && i + 1 < srcLength) {
+ char16_t trail = srcChars[i + 1];
+ if (unicode::IsTrailSurrogate(trail)) {
+ trail = unicode::ToLowerCaseNonBMPTrail(c, trail);
+ destChars[j++] = c;
+ destChars[j++] = trail;
+ i++;
+ continue;
+ }
+ }
+
+ // Special case: U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+ // lowercases to <U+0069 U+0307>.
+ if (c == unicode::LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) {
+ // Return if the output buffer is too small.
+ if (srcLength == destLength)
+ return i;
+
+ destChars[j++] = CharT('i');
+ destChars[j++] = CharT(unicode::COMBINING_DOT_ABOVE);
+ continue;
+ }
+
+ // Special case: U+03A3 GREEK CAPITAL LETTER SIGMA lowercases to
+ // one of two codepoints depending on context.
+ if (c == unicode::GREEK_CAPITAL_LETTER_SIGMA) {
+ destChars[j++] = Final_Sigma(srcChars, srcLength, i);
+ continue;
+ }
+ }
+
+ c = unicode::ToLowerCase(c);
+ MOZ_ASSERT_IF((IsSame<CharT, Latin1Char>::value), c <= JSString::MAX_LATIN1_CHAR);
+ destChars[j++] = c;
+ }
+
+ MOZ_ASSERT(j == destLength);
+ destChars[destLength] = '\0';
+
+ return srcLength;
+}
+
+static size_t
+ToLowerCaseLength(const char16_t* chars, size_t startIndex, size_t length)
+{
+ size_t lowerLength = length;
+ for (size_t i = startIndex; i < length; i++) {
+ char16_t c = chars[i];
+
+ // U+0130 is lowercased to the two-element sequence <U+0069 U+0307>.
+ if (c == unicode::LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE)
+ lowerLength += 1;
+ }
+ return lowerLength;
+}
+
+static size_t
+ToLowerCaseLength(const Latin1Char* chars, size_t startIndex, size_t length)
+{
+ MOZ_ASSERT_UNREACHABLE("never called for Latin-1 strings");
+ return 0;
+}
+
+template <typename CharT>
static JSString*
ToLowerCase(JSContext* cx, JSLinearString* str)
{
- // Unlike toUpperCase, toLowerCase has the nice invariant that if the input
- // is a Latin1 string, the output is also a Latin1 string.
- UniquePtr<CharT[], JS::FreePolicy> newChars;
- size_t length = str->length();
+ // Unlike toUpperCase, toLowerCase has the nice invariant that if the
+ // input is a Latin-1 string, the output is also a Latin-1 string.
+ using AnyCharPtr = UniquePtr<CharT[], JS::FreePolicy>;
+
+ AnyCharPtr newChars;
+ const size_t length = str->length();
+ size_t resultLength;
{
AutoCheckCannotGC nogc;
const CharT* chars = str->chars<CharT>(nogc);
- // Look for the first upper case character.
+ // We don't need extra special casing checks in the loop below,
+ // because U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE and U+03A3
+ // GREEK CAPITAL LETTER SIGMA already have simple lower case mappings.
+ MOZ_ASSERT(unicode::CanLowerCase(unicode::LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE),
+ "U+0130 has a simple lower case mapping");
+ MOZ_ASSERT(unicode::CanLowerCase(unicode::GREEK_CAPITAL_LETTER_SIGMA),
+ "U+03A3 has a simple lower case mapping");
+
+ // Look for the first character that changes when lowercased.
size_t i = 0;
for (; i < length; i++) {
char16_t c = chars[i];
@@ -630,40 +823,35 @@ ToLowerCase(JSContext* cx, JSLinearString* str)
break;
}
- // If all characters are lower case, return the input string.
+ // If no character needs to change, return the input string.
if (i == length)
return str;
- newChars = cx->make_pod_array<CharT>(length + 1);
+ resultLength = length;
+ newChars = cx->make_pod_array<CharT>(resultLength + 1);
if (!newChars)
return nullptr;
PodCopy(newChars.get(), chars, i);
- for (; i < length; i++) {
- char16_t c = chars[i];
- if (!IsSame<CharT, Latin1Char>::value) {
- if (unicode::IsLeadSurrogate(c) && i + 1 < length) {
- char16_t trail = chars[i + 1];
- if (unicode::IsTrailSurrogate(trail)) {
- trail = unicode::ToLowerCaseNonBMPTrail(c, trail);
- newChars[i] = c;
- newChars[i + 1] = trail;
- i++;
- continue;
- }
- }
- }
+ size_t readChars = ToLowerCaseImpl(newChars.get(), chars, i, length, resultLength);
+ if (readChars < length) {
+ MOZ_ASSERT((!IsSame<CharT, Latin1Char>::value),
+ "Latin-1 strings don't have special lower case mappings");
+ resultLength = ToLowerCaseLength(chars, readChars, length);
- c = unicode::ToLowerCase(c);
- MOZ_ASSERT_IF((IsSame<CharT, Latin1Char>::value), c <= JSString::MAX_LATIN1_CHAR);
- newChars[i] = c;
- }
+ AnyCharPtr buf = ReallocChars(cx, Move(newChars), length + 1, resultLength + 1);
+ if (!buf)
+ return nullptr;
- newChars[length] = 0;
+ newChars = Move(buf);
+
+ MOZ_ALWAYS_TRUE(length ==
+ ToLowerCaseImpl(newChars.get(), chars, readChars, length, resultLength));
+ }
}
- JSString* res = NewStringDontDeflate<CanGC>(cx, newChars.get(), length);
+ JSString* res = NewStringDontDeflate<CanGC>(cx, newChars.get(), resultLength);
if (!res)
return nullptr;
@@ -671,104 +859,295 @@ ToLowerCase(JSContext* cx, JSLinearString* str)
return res;
}
-static inline bool
-ToLowerCaseHelper(JSContext* cx, const CallArgs& args)
+JSString*
+js::StringToLowerCase(JSContext* cx, HandleLinearString string)
+{
+ if (string->hasLatin1Chars())
+ return ToLowerCase<Latin1Char>(cx, string);
+ return ToLowerCase<char16_t>(cx, string);
+}
+
+bool
+js::str_toLowerCase(JSContext* cx, unsigned argc, Value* vp)
{
+ CallArgs args = CallArgsFromVp(argc, vp);
+
RootedString str(cx, ToStringForStringFunction(cx, args.thisv()));
if (!str)
return false;
- JSLinearString* linear = str->ensureLinear(cx);
+ RootedLinearString linear(cx, str->ensureLinear(cx));
if (!linear)
return false;
- if (linear->hasLatin1Chars())
- str = ToLowerCase<Latin1Char>(cx, linear);
- else
- str = ToLowerCase<char16_t>(cx, linear);
- if (!str)
+ JSString* result = StringToLowerCase(cx, linear);
+ if (!result)
return false;
- args.rval().setString(str);
+ args.rval().setString(result);
return true;
}
-bool
-js::str_toLowerCase(JSContext* cx, unsigned argc, Value* vp)
+static const char*
+CaseMappingLocale(JSContext* cx, JSString* str)
{
- return ToLowerCaseHelper(cx, CallArgsFromVp(argc, vp));
+ JSLinearString* locale = str->ensureLinear(cx);
+ if (!locale)
+ return nullptr;
+
+ MOZ_ASSERT(locale->length() >= 2, "locale is a valid language tag");
+
+ // Lithuanian, Turkish, and Azeri have language dependent case mappings.
+ static const char languagesWithSpecialCasing[][3] = { "lt", "tr", "az" };
+
+ // All strings in |languagesWithSpecialCasing| are of length two, so we
+ // only need to compare the first two characters to find a matching locale.
+ // ES2017 Intl, §9.2.2 BestAvailableLocale
+ if (locale->length() == 2 || locale->latin1OrTwoByteChar(2) == '-') {
+ for (const auto& language : languagesWithSpecialCasing) {
+ if (locale->latin1OrTwoByteChar(0) == language[0] &&
+ locale->latin1OrTwoByteChar(1) == language[1])
+ {
+ return language;
+ }
+ }
+ }
+
+ return ""; // ICU root locale
}
bool
-js::str_toLocaleLowerCase(JSContext* cx, unsigned argc, Value* vp)
+js::intl_toLocaleLowerCase(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 2);
+ MOZ_ASSERT(args[0].isString());
+ MOZ_ASSERT(args[1].isString());
- /*
- * Forcefully ignore the first (or any) argument and return toLowerCase(),
- * ECMA has reserved that argument, presumably for defining the locale.
- */
- if (cx->runtime()->localeCallbacks && cx->runtime()->localeCallbacks->localeToLowerCase) {
- RootedString str(cx, ToStringForStringFunction(cx, args.thisv()));
- if (!str)
- return false;
+ RootedLinearString linear(cx, args[0].toString()->ensureLinear(cx));
+ if (!linear)
+ return false;
- RootedValue result(cx);
- if (!cx->runtime()->localeCallbacks->localeToLowerCase(cx, str, &result))
+ const char* locale = CaseMappingLocale(cx, args[1].toString());
+ if (!locale)
+ return false;
+
+ // Call String.prototype.toLowerCase() for language independent casing.
+ if (intl::StringsAreEqual(locale, "")) {
+ JSString* str = StringToLowerCase(cx, linear);
+ if (!str)
return false;
- args.rval().set(result);
+ args.rval().setString(str);
return true;
}
- return ToLowerCaseHelper(cx, args);
+ AutoStableStringChars inputChars(cx);
+ if (!inputChars.initTwoByte(cx, linear))
+ return false;
+ mozilla::Range<const char16_t> input = inputChars.twoByteRange();
+
+ // Maximum case mapping length is three characters.
+ static_assert(JSString::MAX_LENGTH < INT32_MAX / 3,
+ "Case conversion doesn't overflow int32_t indices");
+
+ JSString* str = intl::CallICU(cx, [&input, locale](UChar* chars, int32_t size, UErrorCode* status) {
+ return u_strToLower(chars, size, Char16ToUChar(input.begin().get()), input.length(),
+ locale, status);
+ });
+ if (!str)
+ return false;
+
+ args.rval().setString(str);
+ return true;
}
-template <typename DestChar, typename SrcChar>
-static void
-ToUpperCaseImpl(DestChar* destChars, const SrcChar* srcChars, size_t firstLowerCase, size_t length)
+static inline bool
+CanUpperCaseSpecialCasing(Latin1Char charCode)
{
- MOZ_ASSERT(firstLowerCase < length);
+ // Handle U+00DF LATIN SMALL LETTER SHARP S inline, all other Latin-1
+ // characters don't have special casing rules.
+ MOZ_ASSERT_IF(charCode != unicode::LATIN_SMALL_LETTER_SHARP_S,
+ !unicode::CanUpperCaseSpecialCasing(charCode));
- for (size_t i = 0; i < firstLowerCase; i++)
- destChars[i] = srcChars[i];
+ return charCode == unicode::LATIN_SMALL_LETTER_SHARP_S;
+}
+
+static inline bool
+CanUpperCaseSpecialCasing(char16_t charCode)
+{
+ return unicode::CanUpperCaseSpecialCasing(charCode);
+}
+
+static inline size_t
+LengthUpperCaseSpecialCasing(Latin1Char charCode)
+{
+ // U+00DF LATIN SMALL LETTER SHARP S is uppercased to two 'S'.
+ MOZ_ASSERT(charCode == unicode::LATIN_SMALL_LETTER_SHARP_S);
+
+ return 2;
+}
+
+static inline size_t
+LengthUpperCaseSpecialCasing(char16_t charCode)
+{
+ MOZ_ASSERT(CanUpperCaseSpecialCasing(charCode));
+
+ return unicode::LengthUpperCaseSpecialCasing(charCode);
+}
+
+static inline void
+AppendUpperCaseSpecialCasing(char16_t charCode, Latin1Char* elements, size_t* index)
+{
+ // U+00DF LATIN SMALL LETTER SHARP S is uppercased to two 'S'.
+ MOZ_ASSERT(charCode == unicode::LATIN_SMALL_LETTER_SHARP_S);
+ static_assert('S' <= JSString::MAX_LATIN1_CHAR, "'S' is a Latin-1 character");
+
+ elements[(*index)++] = 'S';
+ elements[(*index)++] = 'S';
+}
- for (size_t i = firstLowerCase; i < length; i++) {
+static inline void
+AppendUpperCaseSpecialCasing(char16_t charCode, char16_t* elements, size_t* index)
+{
+ unicode::AppendUpperCaseSpecialCasing(charCode, elements, index);
+}
+
+// See ToLowerCaseImpl for an explanation of the parameters.
+template <typename DestChar, typename SrcChar>
+static size_t
+ToUpperCaseImpl(DestChar* destChars, const SrcChar* srcChars, size_t startIndex, size_t srcLength,
+ size_t destLength)
+{
+ static_assert(IsSame<SrcChar, Latin1Char>::value || !IsSame<DestChar, Latin1Char>::value,
+ "cannot write non-Latin-1 characters into Latin-1 string");
+ MOZ_ASSERT(startIndex < srcLength);
+ MOZ_ASSERT(srcLength <= destLength);
+
+ size_t j = startIndex;
+ for (size_t i = startIndex; i < srcLength; i++) {
char16_t c = srcChars[i];
if (!IsSame<DestChar, Latin1Char>::value) {
- if (unicode::IsLeadSurrogate(c) && i + 1 < length) {
+ if (unicode::IsLeadSurrogate(c) && i + 1 < srcLength) {
char16_t trail = srcChars[i + 1];
if (unicode::IsTrailSurrogate(trail)) {
trail = unicode::ToUpperCaseNonBMPTrail(c, trail);
- destChars[i] = c;
- destChars[i + 1] = trail;
+ destChars[j++] = c;
+ destChars[j++] = trail;
i++;
continue;
}
}
}
+
+ if (MOZ_UNLIKELY(c > 0x7f && CanUpperCaseSpecialCasing(static_cast<SrcChar>(c)))) {
+ // Return if the output buffer is too small.
+ if (srcLength == destLength)
+ return i;
+
+ AppendUpperCaseSpecialCasing(c, destChars, &j);
+ continue;
+ }
+
c = unicode::ToUpperCase(c);
MOZ_ASSERT_IF((IsSame<DestChar, Latin1Char>::value), c <= JSString::MAX_LATIN1_CHAR);
- destChars[i] = c;
+ destChars[j++] = c;
+ }
+
+ MOZ_ASSERT(j == destLength);
+ destChars[destLength] = '\0';
+
+ return srcLength;
+}
+
+// Explicit instantiation so we don't hit the static_assert from above.
+static bool
+ToUpperCaseImpl(Latin1Char* destChars, const char16_t* srcChars, size_t startIndex,
+ size_t srcLength, size_t destLength)
+{
+ MOZ_ASSERT_UNREACHABLE("cannot write non-Latin-1 characters into Latin-1 string");
+ return false;
+}
+
+template <typename CharT>
+static size_t
+ToUpperCaseLength(const CharT* chars, size_t startIndex, size_t length)
+{
+ size_t upperLength = length;
+ for (size_t i = startIndex; i < length; i++) {
+ char16_t c = chars[i];
+
+ if (c > 0x7f && CanUpperCaseSpecialCasing(static_cast<CharT>(c)))
+ upperLength += LengthUpperCaseSpecialCasing(static_cast<CharT>(c)) - 1;
+ }
+ return upperLength;
+}
+
+template <typename DestChar, typename SrcChar>
+static inline void
+CopyChars(DestChar* destChars, const SrcChar* srcChars, size_t length)
+{
+ static_assert(!IsSame<DestChar, SrcChar>::value, "PodCopy is used for the same type case");
+ for (size_t i = 0; i < length; i++)
+ destChars[i] = srcChars[i];
+}
+
+template <typename CharT>
+static inline void
+CopyChars(CharT* destChars, const CharT* srcChars, size_t length)
+{
+ PodCopy(destChars, srcChars, length);
+}
+
+template <typename DestChar, typename SrcChar>
+static inline UniquePtr<DestChar[], JS::FreePolicy>
+ToUpperCase(JSContext* cx, const SrcChar* chars, size_t startIndex, size_t length,
+ size_t* resultLength)
+{
+ MOZ_ASSERT(startIndex < length);
+
+ using DestCharPtr = UniquePtr<DestChar[], JS::FreePolicy>;
+
+ *resultLength = length;
+ DestCharPtr buf = cx->make_pod_array<DestChar>(length + 1);
+ if (!buf)
+ return buf;
+
+ CopyChars(buf.get(), chars, startIndex);
+
+ size_t readChars = ToUpperCaseImpl(buf.get(), chars, startIndex, length, length);
+ if (readChars < length) {
+ size_t actualLength = ToUpperCaseLength(chars, readChars, length);
+
+ *resultLength = actualLength;
+ DestCharPtr buf2 = ReallocChars(cx, Move(buf), length + 1, actualLength + 1);
+ if (!buf2)
+ return buf2;
+
+ buf = Move(buf2);
+
+ MOZ_ALWAYS_TRUE(length ==
+ ToUpperCaseImpl(buf.get(), chars, readChars, length, actualLength));
}
- destChars[length] = '\0';
+ return buf;
}
template <typename CharT>
static JSString*
ToUpperCase(JSContext* cx, JSLinearString* str)
{
- typedef UniquePtr<Latin1Char[], JS::FreePolicy> Latin1CharPtr;
- typedef UniquePtr<char16_t[], JS::FreePolicy> TwoByteCharPtr;
+ using Latin1CharPtr = UniquePtr<Latin1Char[], JS::FreePolicy>;
+ using TwoByteCharPtr = UniquePtr<char16_t[], JS::FreePolicy>;
mozilla::MaybeOneOf<Latin1CharPtr, TwoByteCharPtr> newChars;
- size_t length = str->length();
+ const size_t length = str->length();
+ size_t resultLength;
{
AutoCheckCannotGC nogc;
const CharT* chars = str->chars<CharT>(nogc);
- // Look for the first lower case character.
+ // Look for the first character that changes when uppercased.
size_t i = 0;
for (; i < length; i++) {
char16_t c = chars[i];
@@ -786,21 +1165,33 @@ ToUpperCase(JSContext* cx, JSLinearString* str)
}
if (unicode::CanUpperCase(c))
break;
+ if (MOZ_UNLIKELY(c > 0x7f && CanUpperCaseSpecialCasing(static_cast<CharT>(c))))
+ break;
}
- // If all characters are upper case, return the input string.
+ // If no character needs to change, return the input string.
if (i == length)
return str;
- // If the string is Latin1, check if it contains the MICRO SIGN (0xb5)
- // or SMALL LETTER Y WITH DIAERESIS (0xff) character. The corresponding
- // upper case characters are not in the Latin1 range.
+ // The string changes when uppercased, so we must create a new string.
+ // Can it be Latin-1?
+ //
+ // If the original string is Latin-1, it can -- unless the string
+ // contains U+00B5 MICRO SIGN or U+00FF SMALL LETTER Y WITH DIAERESIS,
+ // the only Latin-1 codepoints that don't uppercase within Latin-1.
+ // Search for those codepoints to decide whether the new string can be
+ // Latin-1.
+ // If the original string is a two-byte string, its uppercase form is
+ // so rarely Latin-1 that we don't even consider creating a new
+ // Latin-1 string.
bool resultIsLatin1;
if (IsSame<CharT, Latin1Char>::value) {
resultIsLatin1 = true;
for (size_t j = i; j < length; j++) {
Latin1Char c = chars[j];
- if (c == 0xb5 || c == 0xff) {
+ if (c == unicode::MICRO_SIGN ||
+ c == unicode::LATIN_SMALL_LETTER_Y_WITH_DIAERESIS)
+ {
MOZ_ASSERT(unicode::ToUpperCase(c) > JSString::MAX_LATIN1_CHAR);
resultIsLatin1 = false;
break;
@@ -813,31 +1204,29 @@ ToUpperCase(JSContext* cx, JSLinearString* str)
}
if (resultIsLatin1) {
- Latin1CharPtr buf = cx->make_pod_array<Latin1Char>(length + 1);
+ Latin1CharPtr buf = ToUpperCase<Latin1Char>(cx, chars, i, length, &resultLength);
if (!buf)
return nullptr;
- ToUpperCaseImpl(buf.get(), chars, i, length);
newChars.construct<Latin1CharPtr>(Move(buf));
} else {
- TwoByteCharPtr buf = cx->make_pod_array<char16_t>(length + 1);
+ TwoByteCharPtr buf = ToUpperCase<char16_t>(cx, chars, i, length, &resultLength);
if (!buf)
return nullptr;
- ToUpperCaseImpl(buf.get(), chars, i, length);
newChars.construct<TwoByteCharPtr>(Move(buf));
}
}
JSString* res;
if (newChars.constructed<Latin1CharPtr>()) {
- res = NewStringDontDeflate<CanGC>(cx, newChars.ref<Latin1CharPtr>().get(), length);
+ res = NewStringDontDeflate<CanGC>(cx, newChars.ref<Latin1CharPtr>().get(), resultLength);
if (!res)
return nullptr;
mozilla::Unused << newChars.ref<Latin1CharPtr>().release();
} else {
- res = NewStringDontDeflate<CanGC>(cx, newChars.ref<TwoByteCharPtr>().get(), length);
+ res = NewStringDontDeflate<CanGC>(cx, newChars.ref<TwoByteCharPtr>().get(), resultLength);
if (!res)
return nullptr;
@@ -847,57 +1236,79 @@ ToUpperCase(JSContext* cx, JSLinearString* str)
return res;
}
-static bool
-ToUpperCaseHelper(JSContext* cx, const CallArgs& args)
+JSString*
+js::StringToUpperCase(JSContext* cx, HandleLinearString string)
+{
+ if (string->hasLatin1Chars())
+ return ToUpperCase<Latin1Char>(cx, string);
+ return ToUpperCase<char16_t>(cx, string);
+}
+
+bool
+js::str_toUpperCase(JSContext* cx, unsigned argc, Value* vp)
{
+ CallArgs args = CallArgsFromVp(argc, vp);
+
RootedString str(cx, ToStringForStringFunction(cx, args.thisv()));
if (!str)
return false;
- JSLinearString* linear = str->ensureLinear(cx);
+ RootedLinearString linear(cx, str->ensureLinear(cx));
if (!linear)
return false;
- if (linear->hasLatin1Chars())
- str = ToUpperCase<Latin1Char>(cx, linear);
- else
- str = ToUpperCase<char16_t>(cx, linear);
- if (!str)
+ JSString* result = StringToUpperCase(cx, linear);
+ if (!result)
return false;
- args.rval().setString(str);
+ args.rval().setString(result);
return true;
}
bool
-js::str_toUpperCase(JSContext* cx, unsigned argc, Value* vp)
-{
- return ToUpperCaseHelper(cx, CallArgsFromVp(argc, vp));
-}
-
-bool
-js::str_toLocaleUpperCase(JSContext* cx, unsigned argc, Value* vp)
+js::intl_toLocaleUpperCase(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 2);
+ MOZ_ASSERT(args[0].isString());
+ MOZ_ASSERT(args[1].isString());
- /*
- * Forcefully ignore the first (or any) argument and return toUpperCase(),
- * ECMA has reserved that argument, presumably for defining the locale.
- */
- if (cx->runtime()->localeCallbacks && cx->runtime()->localeCallbacks->localeToUpperCase) {
- RootedString str(cx, ToStringForStringFunction(cx, args.thisv()));
- if (!str)
- return false;
+ RootedLinearString linear(cx, args[0].toString()->ensureLinear(cx));
+ if (!linear)
+ return false;
+
+ const char* locale = CaseMappingLocale(cx, args[1].toString());
+ if (!locale)
+ return false;
- RootedValue result(cx);
- if (!cx->runtime()->localeCallbacks->localeToUpperCase(cx, str, &result))
+ // Call String.prototype.toUpperCase() for language independent casing.
+ if (intl::StringsAreEqual(locale, "")) {
+ JSString* str = StringToUpperCase(cx, linear);
+ if (!str)
return false;
- args.rval().set(result);
+ args.rval().setString(str);
return true;
}
- return ToUpperCaseHelper(cx, args);
+ AutoStableStringChars inputChars(cx);
+ if (!inputChars.initTwoByte(cx, linear))
+ return false;
+ mozilla::Range<const char16_t> input = inputChars.twoByteRange();
+
+ // Maximum case mapping length is three characters.
+ static_assert(JSString::MAX_LENGTH < INT32_MAX / 3,
+ "Case conversion doesn't overflow int32_t indices");
+
+ JSString* str = intl::CallICU(cx, [&input, locale](UChar* chars, int32_t size, UErrorCode* status) {
+ return u_strToUpper(chars, size, Char16ToUChar(input.begin().get()), input.length(),
+ locale, status);
+ });
+ if (!str)
+ return false;
+
+ args.rval().setString(str);
+ return true;
}
/* ES2017 21.1.3.12. */
@@ -944,7 +1355,7 @@ js::str_normalize(JSContext* cx, unsigned argc, Value* vp)
if (!linear)
return false;
- // Latin1 strings are already in Normalization Form C.
+ // Latin-1 strings are already in Normalization Form C.
if (form == NFC && linear->hasLatin1Chars()) {
// Step 7.
args.rval().setString(str);
@@ -1359,7 +1770,7 @@ StringMatch(const TextChar* text, uint32_t textLen, const PatChar* pat, uint32_t
/*
* For big patterns with large potential overlap we want the SIMD-optimized
* speed of memcmp. For small patterns, a simple loop is faster. We also can't
- * use memcmp if one of the strings is TwoByte and the other is Latin1.
+ * use memcmp if one of the strings is TwoByte and the other is Latin-1.
*
* FIXME: Linux memcmp performance is sad and the manual loop is faster.
*/
@@ -1555,7 +1966,7 @@ RopeMatch(JSContext* cx, JSRope* text, JSLinearString* pat, int* match)
* need to build the list of leaf nodes. Do both here: iterate over the
* nodes so long as there are not too many.
*
- * We also don't use rope matching if the rope contains both Latin1 and
+ * We also don't use rope matching if the rope contains both Latin-1 and
* TwoByte nodes, to simplify the match algorithm.
*/
{
@@ -2890,8 +3301,8 @@ static const JSFunctionSpec string_methods[] = {
JS_FN("trimStart", str_trimStart, 0,0),
JS_FN("trimRight", str_trimEnd, 0,0),
JS_FN("trimEnd", str_trimEnd, 0,0),
- JS_FN("toLocaleLowerCase", str_toLocaleLowerCase, 0,0),
- JS_FN("toLocaleUpperCase", str_toLocaleUpperCase, 0,0),
+ JS_SELF_HOSTED_FN("toLocaleLowerCase", "String_toLocaleLowerCase", 0,0),
+ JS_SELF_HOSTED_FN("toLocaleUpperCase", "String_toLocaleUpperCase", 0,0),
JS_SELF_HOSTED_FN("localeCompare", "String_localeCompare", 1,0),
JS_SELF_HOSTED_FN("repeat", "String_repeat", 1,0),
JS_FN("normalize", str_normalize, 0,0),
@@ -3000,7 +3411,7 @@ js::str_fromCharCode(JSContext* cx, unsigned argc, Value* vp)
// string (thin or fat) and so we don't need to malloc the chars. (We could
// cover some cases where args.length() goes up to
// JSFatInlineString::MAX_LENGTH_LATIN1 if we also checked if the chars are
- // all Latin1, but it doesn't seem worth the effort.)
+ // all Latin-1, but it doesn't seem worth the effort.)
if (args.length() <= JSFatInlineString::MAX_LENGTH_TWO_BYTE)
return str_fromCharCode_few_args(cx, args);
@@ -3143,7 +3554,7 @@ js::str_fromCodePoint(JSContext* cx, unsigned argc, Value* vp)
// string (thin or fat) and so we don't need to malloc the chars. (We could
// cover some cases where |args.length()| goes up to
// JSFatInlineString::MAX_LENGTH_LATIN1 / 2 if we also checked if the chars
- // are all Latin1, but it doesn't seem worth the effort.)
+ // are all Latin-1, but it doesn't seem worth the effort.)
if (args.length() <= JSFatInlineString::MAX_LENGTH_TWO_BYTE / 2)
return str_fromCodePoint_few_args(cx, args);
diff --git a/js/src/jsstr.h b/js/src/jsstr.h
index 0e31276a86..cd2be4e59b 100644
--- a/js/src/jsstr.h
+++ b/js/src/jsstr.h
@@ -371,11 +371,24 @@ str_trimStart(JSContext* cx, unsigned argc, Value* vp);
extern bool
str_trimEnd(JSContext* cx, unsigned argc, Value* vp);
-extern bool
-str_toLocaleLowerCase(JSContext* cx, unsigned argc, Value* vp);
+/**
+ * Returns the input string converted to lower case based on the language
+ * specific case mappings for the input locale.
+ *
+ * Usage: lowerCase = intl_toLocaleLowerCase(string, locale)
+ */
+extern MOZ_MUST_USE bool
+intl_toLocaleLowerCase(JSContext* cx, unsigned argc, Value* vp);
+
+/**
+ * Returns the input string converted to upper case based on the language
+ * specific case mappings for the input locale.
+ *
+ * Usage: upperCase = intl_toLocaleUpperCase(string, locale)
+ */
+extern MOZ_MUST_USE bool
+intl_toLocaleUpperCase(JSContext* cx, unsigned argc, Value* vp);
-extern bool
-str_toLocaleUpperCase(JSContext* cx, unsigned argc, Value* vp);
extern bool
str_normalize(JSContext* cx, unsigned argc, Value* vp);
@@ -480,6 +493,12 @@ JSString*
str_replaceAll_string_raw(JSContext* cx, HandleString string, HandleString pattern,
HandleString replacement);
+extern JSString*
+StringToLowerCase(JSContext* cx, HandleLinearString string);
+
+extern JSString*
+StringToUpperCase(JSContext* cx, HandleLinearString string);
+
extern bool
StringConstructor(JSContext* cx, unsigned argc, Value* vp);
diff --git a/js/src/jsweakmap.cpp b/js/src/jsweakmap.cpp
index 3b4579d652..03d1a0847e 100644
--- a/js/src/jsweakmap.cpp
+++ b/js/src/jsweakmap.cpp
@@ -121,7 +121,7 @@ WeakMapBase::restoreMarkedWeakMaps(WeakMapSet& markedWeakMaps)
{
for (WeakMapSet::Range r = markedWeakMaps.all(); !r.empty(); r.popFront()) {
WeakMapBase* map = r.front();
- MOZ_ASSERT(map->zone->isGCMarking());
+ MOZ_ASSERT(map->zone->shouldMarkInZone());
MOZ_ASSERT(!map->marked);
map->marked = true;
}
@@ -144,7 +144,7 @@ ObjectValueMap::findZoneEdges()
if (!delegate)
continue;
Zone* delegateZone = delegate->zone();
- if (delegateZone == zone || !delegateZone->isGCMarking())
+ if (delegateZone == zone || !delegateZone->shouldMarkInZone())
continue;
if (!delegateZone->gcZoneGroupEdges.put(key->zone()))
return false;
diff --git a/js/src/moz.build b/js/src/moz.build
index 05ee31e34c..cecb7ae32d 100644
--- a/js/src/moz.build
+++ b/js/src/moz.build
@@ -70,6 +70,7 @@ EXPORTS.js += [
'../public/Conversions.h',
'../public/Date.h',
'../public/Debug.h',
+ '../public/Equality.h',
'../public/GCAnnotations.h',
'../public/GCAPI.h',
'../public/GCHashTable.h',
@@ -88,6 +89,7 @@ EXPORTS.js += [
'../public/Proxy.h',
'../public/Realm.h',
'../public/RequiredDefines.h',
+ '../public/Result.h',
'../public/RootingAPI.h',
'../public/SliceBudget.h',
'../public/StructuredClone.h',
@@ -116,6 +118,9 @@ main_deunified_sources = [
'builtin/intl/CommonFunctions.cpp',
'builtin/intl/DateTimeFormat.cpp',
'builtin/intl/IntlObject.cpp',
+ 'builtin/intl/LanguageTag.cpp',
+ 'builtin/intl/LanguageTagGenerated.cpp',
+ 'builtin/intl/Locale.cpp',
'builtin/intl/NumberFormat.cpp',
'builtin/intl/PluralRules.cpp',
'builtin/intl/RelativeTimeFormat.cpp',
@@ -293,6 +298,7 @@ main_deunified_sources = [
'vm/Debugger.cpp',
'vm/DebuggerMemory.cpp',
'vm/EnvironmentObject.cpp',
+ 'vm/EqualityOperations.cpp',
'vm/ErrorObject.cpp',
'vm/ForOfIterator.cpp',
'vm/GeneratorObject.cpp',
@@ -706,7 +712,6 @@ selfhosted.inputs = [
'builtin/intl/CommonFunctions.js',
'builtin/intl/DateTimeFormat.js',
'builtin/intl/IntlObject.js',
- 'builtin/intl/LangTagMappingsGenerated.js',
'builtin/intl/NumberFormat.js',
'builtin/intl/PluralRules.js',
'builtin/intl/RelativeTimeFormat.js',
diff --git a/js/src/old-configure.in b/js/src/old-configure.in
index 62a01a9e3b..3a9aa80553 100644
--- a/js/src/old-configure.in
+++ b/js/src/old-configure.in
@@ -2128,10 +2128,12 @@ AC_SUBST(MC_OFFICIAL)
dnl Echo the CFLAGS to remove extra whitespace.
CFLAGS=`echo \
$_WARNINGS_CFLAGS \
+ $_COMPILATION_CFLAGS \
$CFLAGS`
CXXFLAGS=`echo \
$_WARNINGS_CXXFLAGS \
+ $_COMPILATION_CXXFLAGS \
$CXXFLAGS`
COMPILE_CFLAGS=`echo \
diff --git a/js/src/proxy/ScriptedProxyHandler.cpp b/js/src/proxy/ScriptedProxyHandler.cpp
index adb98edbdd..d396b7805c 100644
--- a/js/src/proxy/ScriptedProxyHandler.cpp
+++ b/js/src/proxy/ScriptedProxyHandler.cpp
@@ -7,6 +7,8 @@
#include "jsapi.h"
+#include "vm/EqualityOperations.h" // js::SameValue
+
#include "jsobjinlines.h"
#include "vm/NativeObject-inl.h"
diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp
index bab5cbb0b5..a77e128a52 100644
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -71,6 +71,7 @@
#include "jit/JitcodeMap.h"
#include "jit/OptimizationTracking.h"
#include "js/Debug.h"
+#include "js/Equality.h" // JS::SameValue
#include "js/GCAPI.h"
#include "js/Initialization.h"
#include "js/StructuredClone.h"
@@ -926,6 +927,9 @@ AddIntlExtras(JSContext* cx, unsigned argc, Value* vp)
if (!JS_DefineFunctions(cx, intl, funcs))
return false;
+ if (!js::AddMozDateTimeFormatConstructor(cx, intl))
+ return false;
+
args.rval().setUndefined();
return true;
}
@@ -2286,7 +2290,7 @@ AssertEq(JSContext* cx, unsigned argc, Value* vp)
}
bool same;
- if (!JS_SameValue(cx, args[0], args[1], &same))
+ if (!JS::SameValue(cx, args[0], args[1], &same))
return false;
if (!same) {
JSAutoByteString bytes0, bytes1;
diff --git a/js/src/tests/Intl/Collator/call.js b/js/src/tests/Intl/Collator/call.js
new file mode 100644
index 0000000000..18d81c13cd
--- /dev/null
+++ b/js/src/tests/Intl/Collator/call.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsConstructor(o) {
+ try {
+ new (new Proxy(o, {construct: () => ({})}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsConstructor);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => [
+ // Instance of an Intl constructor.
+ new ctor(),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {},
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(), Object.prototype),
+ ])),
+ ];
+}
+
+// Invoking [[Call]] for Intl.Collator always returns a new Collator instance.
+for (let thisValue of thisValues()) {
+ let obj = Intl.Collator.call(thisValue);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.Collator, true);
+
+ // Ensure Intl.[[FallbackSymbol]] wasn't installed on |thisValue|.
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// Intl.Collator doesn't use the legacy Intl constructor compromise semantics.
+for (let thisValue of thisValues()) {
+ // Ensure instanceof operator isn't invoked for Intl.Collator.
+ Object.defineProperty(Intl.Collator, Symbol.hasInstance, {
+ get() {
+ assertEq(false, true, "@@hasInstance operator called");
+ }, configurable: true
+ });
+ let obj = Intl.Collator.call(thisValue);
+ delete Intl.Collator[Symbol.hasInstance];
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.Collator, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/Intl/Collator/caseFirst.js b/js/src/tests/Intl/Collator/caseFirst.js
new file mode 100644
index 0000000000..d183c8fdd5
--- /dev/null
+++ b/js/src/tests/Intl/Collator/caseFirst.js
@@ -0,0 +1,197 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Locales which use caseFirst=off for the standard (sort) collation type.
+const defaultLocales = Intl.Collator.supportedLocalesOf(["en", "de", "es", "sv", "ar", "zh", "ja"]);
+
+// Locales which use caseFirst=upper for the standard (sort) collation type.
+const upperFirstLocales = Intl.Collator.supportedLocalesOf(["cu", "da", "mt"]);
+
+// Default collation for zh (pinyin) reorders "á" before "a" at secondary strength level.
+const accentReordered = ["zh"];
+
+const allLocales = [...defaultLocales, ...upperFirstLocales];
+
+
+// Check default "caseFirst" option is resolved correctly.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, {usage: "sort"});
+ assertEq(col.resolvedOptions().caseFirst, "false");
+}
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, {usage: "sort"});
+ assertEq(col.resolvedOptions().caseFirst, "upper");
+}
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, {usage: "search"});
+ assertEq(col.resolvedOptions().caseFirst, "false");
+}
+
+
+const collOptions = {usage: "sort"};
+const primary = {sensitivity: "base"};
+const secondary = {sensitivity: "accent"};
+const tertiary = {sensitivity: "variant"};
+const caseLevel = {sensitivity: "case"};
+const strengths = [primary, secondary, tertiary, caseLevel];
+
+// "A" is sorted after "a" when caseFirst=off is the default and strength is tertiary.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "a"), 1);
+ assertEq(col.compare("a", "A"), -1);
+}
+for (let locale of defaultLocales.filter(loc => !accentReordered.includes(loc))) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+// Also sorted after "a" with the sensitivity=case collator.
+for (let locale of defaultLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
+
+ assertEq(col.compare("A", "a"), 1);
+ assertEq(col.compare("a", "A"), -1);
+
+ assertEq(col.compare("A", "á"), 1);
+ assertEq(col.compare("á", "A"), -1);
+}
+
+
+// "A" is sorted before "a" when caseFirst=upper is the default and strength is tertiary.
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
+
+ assertEq(col.compare("A", "a"), -1);
+ assertEq(col.compare("a", "A"), 1);
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+// Also sorted before "a" with the sensitivity=case collator.
+for (let locale of upperFirstLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
+
+ assertEq(col.compare("A", "a"), -1);
+ assertEq(col.compare("a", "A"), 1);
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+
+// caseFirst=upper doesn't change the sort order when strength is below tertiary.
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
+
+ assertEq(col.compare("A", "a"), 0);
+ assertEq(col.compare("a", "A"), 0);
+}
+for (let locale of allLocales.filter(loc => !accentReordered.includes(loc))) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
+
+ assertEq(col.compare("A", "á"), -1);
+ assertEq(col.compare("á", "A"), 1);
+}
+
+for (let locale of allLocales) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, primary));
+
+ assertEq(col.compare("A", "a"), 0);
+ assertEq(col.compare("a", "A"), 0);
+
+ assertEq(col.compare("A", "á"), 0);
+ assertEq(col.compare("á", "A"), 0);
+}
+
+
+// caseFirst=upper doesn't change the sort order when there's a primary difference.
+for (let locale of allLocales) {
+ for (let strength of strengths) {
+ let col = new Intl.Collator(locale, Object.assign({}, collOptions, strength));
+
+ assertEq(col.compare("A", "b"), -1);
+ assertEq(col.compare("a", "B"), -1);
+ }
+}
+
+
+// caseFirst set through Unicode extension tag.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale + "-u-kf-false", {});
+ let colKfLower = new Intl.Collator(locale + "-u-kf-lower", {});
+ let colKfUpper = new Intl.Collator(locale + "-u-kf-upper", {});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+
+// caseFirst set through options value.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale, {caseFirst: "false"});
+ let colKfLower = new Intl.Collator(locale, {caseFirst: "lower"});
+ let colKfUpper = new Intl.Collator(locale, {caseFirst: "upper"});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+
+// Test Unicode extension tag and options value, the latter should win.
+for (let locale of allLocales) {
+ let colKfFalse = new Intl.Collator(locale + "-u-kf-upper", {caseFirst: "false"});
+ let colKfLower = new Intl.Collator(locale + "-u-kf-upper", {caseFirst: "lower"});
+ let colKfUpper = new Intl.Collator(locale + "-u-kf-lower", {caseFirst: "upper"});
+
+ assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
+ assertEq(colKfFalse.compare("A", "a"), 1);
+ assertEq(colKfFalse.compare("a", "A"), -1);
+
+ assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
+ assertEq(colKfLower.compare("A", "a"), 1);
+ assertEq(colKfLower.compare("a", "A"), -1);
+
+ assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
+ assertEq(colKfUpper.compare("A", "a"), -1);
+ assertEq(colKfUpper.compare("a", "A"), 1);
+}
+
+// Ensure languages are properly detected when additional subtags are present.
+if (Intl.Collator.supportedLocalesOf("da").length !== 0) {
+ assertEq(new Intl.Collator("da-DK", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+ assertEq(new Intl.Collator("da-Latn-DK", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+}
+if (Intl.Collator.supportedLocalesOf("mt").length !== 0) {
+ assertEq(new Intl.Collator("mt-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+ assertEq(new Intl.Collator("mt-Latn-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
+}
+
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/Intl/DateTimeFormat/call.js b/js/src/tests/Intl/DateTimeFormat/call.js
new file mode 100644
index 0000000000..8e9603f646
--- /dev/null
+++ b/js/src/tests/Intl/DateTimeFormat/call.js
@@ -0,0 +1,167 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsConstructor(o) {
+ try {
+ new (new Proxy(o, {construct: () => ({})}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsConstructor);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => [
+ // Instance of an Intl constructor.
+ new ctor(),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {},
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(), Object.prototype),
+ ])),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)))[0];
+
+// Invoking [[Call]] for Intl.DateTimeFormat returns a new instance unless called
+// with an instance inheriting from Intl.DateTimeFormat.prototype.
+for (let thisValue of thisValues()) {
+ let obj = Intl.DateTimeFormat.call(thisValue);
+
+ if (!Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue)) {
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+ } else {
+ assertEq(Object.is(obj, thisValue), true);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+ }
+}
+
+// Intl.DateTimeFormat uses the legacy Intl constructor compromise semantics.
+// - Test when InstanceofOperator(thisValue, %DateTimeFormat%) returns true.
+for (let thisValue of thisValues()) {
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ if (!IsObject(thisValue)) {
+ // A TypeError is thrown when Intl.DateTimeFormat tries to install the
+ // [[FallbackSymbol]] property on |thisValue|.
+ assertThrowsInstanceOf(() => Intl.DateTimeFormat.call(thisValue), TypeError);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+ } else {
+ let obj = Intl.DateTimeFormat.call(thisValue);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+ assertEq(Object.is(obj, thisValue), true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+ }
+ assertEq(hasInstanceCalled, true);
+}
+// - Test when InstanceofOperator(thisValue, %DateTimeFormat%) returns false.
+for (let thisValue of thisValues()) {
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return false;
+ }, configurable: true
+ });
+ let obj = Intl.DateTimeFormat.call(thisValue);
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.DateTimeFormat, true);
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+ assertEq(hasInstanceCalled, true);
+}
+
+// Throws an error when attempting to install [[FallbackSymbol]] twice.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+
+ assertEq(Intl.DateTimeFormat.call(thisValue), thisValue);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+
+ assertThrowsInstanceOf(() => Intl.DateTimeFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+
+// Throws an error when the thisValue is non-extensible.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Object.preventExtensions(thisValue);
+
+ assertThrowsInstanceOf(() => Intl.DateTimeFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// [[FallbackSymbol]] is installed as a frozen property holding an Intl.DateTimeFormat instance.
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ let desc = Object.getOwnPropertyDescriptor(thisValue, intlFallbackSymbol);
+ assertEq(desc !== undefined, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(desc.value instanceof Intl.DateTimeFormat, true);
+}
+
+// Ensure [[FallbackSymbol]] is installed last by changing the [[Prototype]]
+// during initialization.
+{
+ let thisValue = {};
+ let options = {
+ get hour12() {
+ Object.setPrototypeOf(thisValue, Intl.DateTimeFormat.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.DateTimeFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+{
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ let options = {
+ get hour12() {
+ Object.setPrototypeOf(thisValue, Object.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.DateTimeFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/Intl/DateTimeFormat/hourCycle.js b/js/src/tests/Intl/DateTimeFormat/hourCycle.js
new file mode 100644
index 0000000000..5fbdafdc84
--- /dev/null
+++ b/js/src/tests/Intl/DateTimeFormat/hourCycle.js
@@ -0,0 +1,145 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const hourCycleToH12Map = {
+ "h11": true,
+ "h12": true,
+ "h23": false,
+ "h24": false,
+};
+
+for (const key of Object.keys(hourCycleToH12Map)) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ const dtf2 = new Intl.DateTimeFormat(langTag, {hour: "numeric", hourCycle: key});
+ assertEq(dtf.resolvedOptions().hourCycle, dtf2.resolvedOptions().hourCycle);
+}
+
+
+/* Legacy hour12 compatibility */
+
+// When constructed with hourCycle option, resolvedOptions' hour12 is correct.
+for (const key of Object.keys(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", hourCycle: key});
+ assertEq(dtf.resolvedOptions().hour12, hourCycleToH12Map[key]);
+}
+
+// When constructed with hour12 option, resolvedOptions' hourCycle is correct
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {hour: "numeric", hour12: value});
+ assertEq(hourCycleToH12Map[dtf.resolvedOptions().hourCycle], value);
+}
+
+// When constructed with both hour12 and hourCycle options that don't match
+// hour12 takes a precedence.
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const dtf = new Intl.DateTimeFormat("en-US", {
+ hour: "numeric",
+ hourCycle: key,
+ hour12: !value
+ });
+ assertEq(hourCycleToH12Map[dtf.resolvedOptions().hourCycle], !value);
+ assertEq(dtf.resolvedOptions().hour12, !value);
+}
+
+// When constructed with hourCycle as extkey, resolvedOptions' hour12 is correct.
+for (const [key, value] of Object.entries(hourCycleToH12Map)) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ assertEq(dtf.resolvedOptions().hour12, value);
+}
+
+const expectedValuesENUS = {
+ h11: "0 AM",
+ h12: "12 AM",
+ h23: "00",
+ h24: "24"
+};
+
+const exampleDate = new Date(2017, 10-1, 10, 0);
+for (const [key, val] of Object.entries(expectedValuesENUS)) {
+ assertEq(
+ Intl.DateTimeFormat("en-US", {hour: "numeric", hourCycle: key}).format(exampleDate),
+ val
+ );
+}
+
+const invalidHourCycleValues = [
+ "h5",
+ "h0",
+ "h28",
+ "f28",
+ "23",
+];
+
+for (const key of invalidHourCycleValues) {
+ const langTag = "en-US";
+ const loc = `${langTag}-u-hc-${key}`;
+
+ const dtf = new Intl.DateTimeFormat(loc, {hour: "numeric"});
+ assertEq(dtf.resolvedOptions().hour12, true); // default value for en-US
+ assertEq(dtf.resolvedOptions().hourCycle, "h12"); //default value for en-US
+}
+
+{
+ // hourCycle is not present in resolvedOptions when the formatter has no hour field
+ const options = Intl.DateTimeFormat("en-US", {hourCycle:"h11"}).resolvedOptions();
+ assertEq("hourCycle" in options, false);
+ assertEq("hour12" in options, false);
+}
+
+{
+ // Make sure that hourCycle option overrides the unicode extension
+ let dtf = Intl.DateTimeFormat("en-US-u-hc-h23", {hourCycle: "h24", hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h24"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides the unicode extension
+ let dtf = Intl.DateTimeFormat("en-US-u-hc-h23", {hour12: true, hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h12"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides hourCycle options
+ let dtf = Intl.DateTimeFormat("en-US",
+ {hourCycle: "h12", hour12: false, hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h23"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides hourCycle options
+ let dtf = Intl.DateTimeFormat("en-u-hc-h11", {hour: "numeric"});
+ assertEq(
+ dtf.resolvedOptions().locale,
+ "en-u-hc-h11"
+ );
+}
+
+{
+ // Make sure that hour12 option overrides unicode extension
+ let dtf = Intl.DateTimeFormat("en-u-hc-h11", {hour: "numeric", hourCycle: "h24"});
+ assertEq(
+ dtf.resolvedOptions().locale,
+ "en"
+ );
+ assertEq(
+ dtf.resolvedOptions().hourCycle,
+ "h24"
+ );
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/Intl/DateTimeFormat/mozExtensions.js b/js/src/tests/Intl/DateTimeFormat/mozExtensions.js
new file mode 100644
index 0000000000..e0ce902220
--- /dev/null
+++ b/js/src/tests/Intl/DateTimeFormat/mozExtensions.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!this.hasOwnProperty("addIntlExtras"))
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Tests the format function with a diverse set of locales and options.
+// Always use UTC to avoid dependencies on test environment.
+
+let mozIntl = {};
+addIntlExtras(mozIntl);
+
+// Pattern
+
+var dtf = new Intl.DateTimeFormat("en-US", {pattern: "HH:mm MM/dd/YYYY"});
+var mozDtf = new mozIntl.DateTimeFormat("en-US", {pattern: "HH:mm MM/dd/YYYY"});
+
+assertEq(dtf.resolvedOptions().hasOwnProperty('pattern'), false);
+assertEq(mozDtf.resolvedOptions().pattern, "HH:mm MM/dd/YYYY");
+
+// Date style
+
+var dtf = new Intl.DateTimeFormat("en-US", {dateStyle: 'long'});
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('dateStyle'), false);
+
+var mozDtf = new mozIntl.DateTimeFormat("en-US", {dateStyle: 'long'});
+assertEq(mozDtf.resolvedOptions().dateStyle, 'long');
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('year'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('month'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('day'), true);
+
+// Time style
+
+var dtf = new Intl.DateTimeFormat("en-US", {timeStyle: 'long'});
+assertEq(dtf.resolvedOptions().hasOwnProperty('dateStyle'), false);
+
+var mozDtf = new mozIntl.DateTimeFormat("en-US", {timeStyle: 'long'});
+assertEq(mozDtf.resolvedOptions().timeStyle, 'long');
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('hour'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('minute'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('second'), true);
+
+// Date/Time style
+
+var dtf = new Intl.DateTimeFormat("en-US", {timeStyle: 'medium', dateStyle: 'medium'});
+assertEq(dtf.resolvedOptions().hasOwnProperty('dateStyle'), false);
+assertEq(dtf.resolvedOptions().hasOwnProperty('timeStyle'), false);
+
+var mozDtf = new mozIntl.DateTimeFormat("en-US", {dateStyle: 'medium', timeStyle: 'medium'});
+assertEq(mozDtf.resolvedOptions().timeStyle, 'medium');
+assertEq(mozDtf.resolvedOptions().dateStyle, 'medium');
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('hour'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('minute'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('second'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('year'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('month'), true);
+assertEq(mozDtf.resolvedOptions().hasOwnProperty('day'), true);
+
+reportCompare(0, 0, 'ok');
diff --git a/js/src/tests/Intl/DateTimeFormat/unwrapping.js b/js/src/tests/Intl/DateTimeFormat/unwrapping.js
new file mode 100644
index 0000000000..07141a127e
--- /dev/null
+++ b/js/src/tests/Intl/DateTimeFormat/unwrapping.js
@@ -0,0 +1,224 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test UnwrapDateTimeFormat operation.
+
+const dateTimeFormatFunctions = [];
+dateTimeFormatFunctions.push(Intl.DateTimeFormat.prototype.resolvedOptions);
+dateTimeFormatFunctions.push(Object.getOwnPropertyDescriptor(Intl.DateTimeFormat.prototype, "format").get);
+dateTimeFormatFunctions.push(Intl.DateTimeFormat.prototype.formatToParts);
+
+function IsConstructor(o) {
+ try {
+ new (new Proxy(o, {construct: () => ({})}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function intlObjects(ctor) {
+ return [
+ // Instance of an Intl constructor.
+ new ctor(),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {},
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(), Object.prototype),
+ ];
+}
+
+function thisValues(C) {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsConstructor);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.filter(ctor => ctor !== C).map(intlObjects)),
+
+ // Object inheriting from an Intl constructor prototype.
+ ...intlConstructors.map(ctor => Object.create(ctor.prototype)),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.DateTimeFormat.call(Object.create(Intl.DateTimeFormat.prototype)))[0];
+
+// Test Intl.DateTimeFormat.prototype methods.
+for (let dateTimeFormatFunction of dateTimeFormatFunctions) {
+ // Test a TypeError is thrown when the this-value isn't an initialized
+ // Intl.DateTimeFormat instance.
+ for (let thisValue of thisValues(Intl.DateTimeFormat)) {
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+ }
+
+ // And test no error is thrown for initialized Intl.DateTimeFormat instances.
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ dateTimeFormatFunction.call(thisValue);
+ }
+
+ // Manually add [[FallbackSymbol]] to objects and then repeat the tests from above.
+ for (let thisValue of thisValues(Intl.DateTimeFormat)) {
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call({
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ }), TypeError);
+ }
+
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ dateTimeFormatFunction.call({
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ });
+ }
+
+ // Ensure [[FallbackSymbol]] isn't retrieved for Intl.DateTimeFormat instances.
+ for (let thisValue of intlObjects(Intl.DateTimeFormat)) {
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ dateTimeFormatFunction.call(thisValue);
+ }
+
+ // Ensure [[FallbackSymbol]] is only retrieved for objects inheriting from Intl.DateTimeFormat.prototype.
+ for (let thisValue of thisValues(Intl.DateTimeFormat)) {
+ if (!IsObject(thisValue) || Intl.DateTimeFormat.prototype.isPrototypeOf(thisValue))
+ continue;
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+ }
+
+ // Repeat the test from above, but also change Intl.DateTimeFormat[@@hasInstance]
+ // so it always returns |null|.
+ for (let thisValue of thisValues(Intl.DateTimeFormat)) {
+ let hasInstanceCalled = false, symbolGetterCalled = false;
+ Object.defineProperty(Intl.DateTimeFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ let isUndefinedOrNull = thisValue !== undefined || thisValue !== null;
+ let symbolHolder;
+ if (!isUndefinedOrNull) {
+ symbolHolder = IsObject(thisValue) ? thisValue : Object.getPrototypeOf(thisValue);
+ Object.defineProperty(symbolHolder, intlFallbackSymbol, {
+ get() {
+ assertEq(symbolGetterCalled, false);
+ symbolGetterCalled = true;
+ return null;
+ }, configurable: true
+ });
+ }
+
+ assertThrowsInstanceOf(() => dateTimeFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.DateTimeFormat[Symbol.hasInstance];
+ if (!isUndefinedOrNull && !IsObject(thisValue))
+ delete symbolHolder[intlFallbackSymbol];
+
+ assertEq(hasInstanceCalled, true);
+ assertEq(symbolGetterCalled, !isUndefinedOrNull);
+ }
+}
+
+// Test format() returns the correct result for objects initialized as Intl.DateTimeFormat instances.
+{
+ // An actual Intl.DateTimeFormat instance.
+ let dateTimeFormat = new Intl.DateTimeFormat();
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: dateTimeFormat,
+ };
+
+ for (let number of [0, Date.now(), -Date.now()]) {
+ let expected = dateTimeFormat.format(number);
+ assertEq(thisValue.format(number), expected);
+ assertEq(thisValue[intlFallbackSymbol].format(number), expected);
+ assertEq(fakeObj.format(number), expected);
+ }
+}
+
+// Test formatToParts() returns the correct result for objects initialized as Intl.DateTimeFormat instances.
+if ("formatToParts" in Intl.DateTimeFormat.prototype) {
+ // An actual Intl.DateTimeFormat instance.
+ let dateTimeFormat = new Intl.DateTimeFormat();
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: dateTimeFormat,
+ };
+
+ function assertEqParts(actual, expected) {
+ assertEq(actual.length, expected.length, "parts count mismatch");
+ for (var i = 0; i < expected.length; i++) {
+ assertEq(actual[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(actual[i].value, expected[i].value, "value mismatch at " + i);
+ }
+ }
+
+ for (let number of [0, Date.now(), -Date.now()]) {
+ let expected = dateTimeFormat.formatToParts(number);
+ assertEqParts(thisValue.formatToParts(number), expected);
+ assertEqParts(thisValue[intlFallbackSymbol].formatToParts(number), expected);
+ assertEqParts(fakeObj.formatToParts(number), expected);
+ }
+}
+
+// Test resolvedOptions() returns the same results.
+{
+ // An actual Intl.DateTimeFormat instance.
+ let dateTimeFormat = new Intl.DateTimeFormat();
+
+ // An object initialized as a DateTimeFormat instance.
+ let thisValue = Object.create(Intl.DateTimeFormat.prototype);
+ Intl.DateTimeFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to DateTimeFormat instance.
+ let fakeObj = {
+ __proto__: Intl.DateTimeFormat.prototype,
+ [intlFallbackSymbol]: dateTimeFormat,
+ };
+
+ function assertEqOptions(actual, expected) {
+ actual = Object.entries(actual);
+ expected = Object.entries(expected);
+
+ assertEq(actual.length, expected.length, "options count mismatch");
+ for (var i = 0; i < expected.length; i++) {
+ assertEq(actual[i][0], expected[i][0], "key mismatch at " + i);
+ assertEq(actual[i][1], expected[i][1], "value mismatch at " + i);
+ }
+ }
+
+ let expected = dateTimeFormat.resolvedOptions();
+ assertEqOptions(thisValue.resolvedOptions(), expected);
+ assertEqOptions(thisValue[intlFallbackSymbol].resolvedOptions(), expected);
+ assertEqOptions(fakeObj.resolvedOptions(), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/Intl/NumberFormat/call.js b/js/src/tests/Intl/NumberFormat/call.js
new file mode 100644
index 0000000000..0387ecc0d1
--- /dev/null
+++ b/js/src/tests/Intl/NumberFormat/call.js
@@ -0,0 +1,167 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+function IsConstructor(o) {
+ try {
+ new (new Proxy(o, {construct: () => ({})}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsConstructor);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => [
+ // Instance of an Intl constructor.
+ new ctor(),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {},
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(), Object.prototype),
+ ])),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.NumberFormat.call(Object.create(Intl.NumberFormat.prototype)))[0];
+
+// Invoking [[Call]] for Intl.NumberFormat returns a new instance unless called
+// with an instance inheriting from Intl.NumberFormat.prototype.
+for (let thisValue of thisValues()) {
+ let obj = Intl.NumberFormat.call(thisValue);
+
+ if (!Intl.NumberFormat.prototype.isPrototypeOf(thisValue)) {
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+ } else {
+ assertEq(Object.is(obj, thisValue), true);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+ }
+}
+
+// Intl.NumberFormat uses the legacy Intl constructor compromise semantics.
+// - Test when InstanceofOperator(thisValue, %NumberFormat%) returns true.
+for (let thisValue of thisValues()) {
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ if (!IsObject(thisValue)) {
+ // A TypeError is thrown when Intl.NumberFormat tries to install the
+ // [[FallbackSymbol]] property on |thisValue|.
+ assertThrowsInstanceOf(() => Intl.NumberFormat.call(thisValue), TypeError);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+ } else {
+ let obj = Intl.NumberFormat.call(thisValue);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+ assertEq(Object.is(obj, thisValue), true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+ }
+ assertEq(hasInstanceCalled, true);
+}
+// - Test when InstanceofOperator(thisValue, %NumberFormat%) returns false.
+for (let thisValue of thisValues()) {
+ let hasInstanceCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return false;
+ }, configurable: true
+ });
+ let obj = Intl.NumberFormat.call(thisValue);
+ delete Intl.NumberFormat[Symbol.hasInstance];
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.NumberFormat, true);
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+ assertEq(hasInstanceCalled, true);
+}
+
+// Throws an error when attempting to install [[FallbackSymbol]] twice.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+
+ assertEq(Intl.NumberFormat.call(thisValue), thisValue);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+
+ assertThrowsInstanceOf(() => Intl.NumberFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+
+// Throws an error when the thisValue is non-extensible.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Object.preventExtensions(thisValue);
+
+ assertThrowsInstanceOf(() => Intl.NumberFormat.call(thisValue), TypeError);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// [[FallbackSymbol]] is installed as a frozen property holding an Intl.NumberFormat instance.
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ let desc = Object.getOwnPropertyDescriptor(thisValue, intlFallbackSymbol);
+ assertEq(desc !== undefined, true);
+ assertEq(desc.writable, false);
+ assertEq(desc.enumerable, false);
+ assertEq(desc.configurable, false);
+ assertEq(desc.value instanceof Intl.NumberFormat, true);
+}
+
+// Ensure [[FallbackSymbol]] is installed last by changing the [[Prototype]]
+// during initialization.
+{
+ let thisValue = {};
+ let options = {
+ get useGrouping() {
+ Object.setPrototypeOf(thisValue, Intl.NumberFormat.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.NumberFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), true);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), [intlFallbackSymbol]);
+}
+{
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ let options = {
+ get useGrouping() {
+ Object.setPrototypeOf(thisValue, Object.prototype);
+ return false;
+ }
+ };
+ let obj = Intl.NumberFormat.call(thisValue, undefined, options);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/Intl/NumberFormat/unwrapping.js b/js/src/tests/Intl/NumberFormat/unwrapping.js
new file mode 100644
index 0000000000..f12eb25c57
--- /dev/null
+++ b/js/src/tests/Intl/NumberFormat/unwrapping.js
@@ -0,0 +1,226 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test UnwrapNumberFormat operation.
+
+const numberFormatFunctions = [];
+numberFormatFunctions.push(Intl.NumberFormat.prototype.resolvedOptions);
+numberFormatFunctions.push(Object.getOwnPropertyDescriptor(Intl.NumberFormat.prototype, "format").get);
+// "formatToParts" isn't yet enabled by default.
+if ("formatToParts" in Intl.NumberFormat.prototype)
+ numberFormatFunctions.push(Intl.NumberFormat.prototype.formatToParts);
+
+function IsConstructor(o) {
+ try {
+ new (new Proxy(o, {construct: () => ({})}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function intlObjects(ctor) {
+ return [
+ // Instance of an Intl constructor.
+ new ctor(),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {},
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(), Object.prototype),
+ ];
+}
+
+function thisValues(C) {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsConstructor);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.filter(ctor => ctor !== C).map(intlObjects)),
+
+ // Object inheriting from an Intl constructor prototype.
+ ...intlConstructors.map(ctor => Object.create(ctor.prototype)),
+ ];
+}
+
+const intlFallbackSymbol = Object.getOwnPropertySymbols(Intl.NumberFormat.call(Object.create(Intl.NumberFormat.prototype)))[0];
+
+// Test Intl.NumberFormat.prototype methods.
+for (let numberFormatFunction of numberFormatFunctions) {
+ // Test a TypeError is thrown when the this-value isn't an initialized
+ // Intl.NumberFormat instance.
+ for (let thisValue of thisValues(Intl.NumberFormat)) {
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+ }
+
+ // And test no error is thrown for initialized Intl.NumberFormat instances.
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ numberFormatFunction.call(thisValue);
+ }
+
+ // Manually add [[FallbackSymbol]] to objects and then repeat the tests from above.
+ for (let thisValue of thisValues(Intl.NumberFormat)) {
+ assertThrowsInstanceOf(() => numberFormatFunction.call({
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ }), TypeError);
+ }
+
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ numberFormatFunction.call({
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: thisValue,
+ });
+ }
+
+ // Ensure [[FallbackSymbol]] isn't retrieved for Intl.NumberFormat instances.
+ for (let thisValue of intlObjects(Intl.NumberFormat)) {
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ numberFormatFunction.call(thisValue);
+ }
+
+ // Ensure [[FallbackSymbol]] is only retrieved for objects inheriting from Intl.NumberFormat.prototype.
+ for (let thisValue of thisValues(Intl.NumberFormat)) {
+ if (!IsObject(thisValue) || Intl.NumberFormat.prototype.isPrototypeOf(thisValue))
+ continue;
+ Object.defineProperty(thisValue, intlFallbackSymbol, {
+ get() { assertEq(false, true); }
+ });
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+ }
+
+ // Repeat the test from above, but also change Intl.NumberFormat[@@hasInstance]
+ // so it always returns |null|.
+ for (let thisValue of thisValues(Intl.NumberFormat)) {
+ let hasInstanceCalled = false, symbolGetterCalled = false;
+ Object.defineProperty(Intl.NumberFormat, Symbol.hasInstance, {
+ value() {
+ assertEq(hasInstanceCalled, false);
+ hasInstanceCalled = true;
+ return true;
+ }, configurable: true
+ });
+ let isUndefinedOrNull = thisValue !== undefined || thisValue !== null;
+ let symbolHolder;
+ if (!isUndefinedOrNull) {
+ symbolHolder = IsObject(thisValue) ? thisValue : Object.getPrototypeOf(thisValue);
+ Object.defineProperty(symbolHolder, intlFallbackSymbol, {
+ get() {
+ assertEq(symbolGetterCalled, false);
+ symbolGetterCalled = true;
+ return null;
+ }, configurable: true
+ });
+ }
+
+ assertThrowsInstanceOf(() => numberFormatFunction.call(thisValue), TypeError);
+
+ delete Intl.NumberFormat[Symbol.hasInstance];
+ if (!isUndefinedOrNull && !IsObject(thisValue))
+ delete symbolHolder[intlFallbackSymbol];
+
+ assertEq(hasInstanceCalled, true);
+ assertEq(symbolGetterCalled, !isUndefinedOrNull);
+ }
+}
+
+// Test format() returns the correct result for objects initialized as Intl.NumberFormat instances.
+{
+ // An actual Intl.NumberFormat instance.
+ let numberFormat = new Intl.NumberFormat();
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: numberFormat,
+ };
+
+ for (let number of [0, 1, 1.5, Infinity, NaN]) {
+ let expected = numberFormat.format(number);
+ assertEq(thisValue.format(number), expected);
+ assertEq(thisValue[intlFallbackSymbol].format(number), expected);
+ assertEq(fakeObj.format(number), expected);
+ }
+}
+
+// Test formatToParts() returns the correct result for objects initialized as Intl.NumberFormat instances.
+if ("formatToParts" in Intl.NumberFormat.prototype) {
+ // An actual Intl.NumberFormat instance.
+ let numberFormat = new Intl.NumberFormat();
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: numberFormat,
+ };
+
+ function assertEqParts(actual, expected) {
+ assertEq(actual.length, expected.length, "parts count mismatch");
+ for (var i = 0; i < expected.length; i++) {
+ assertEq(actual[i].type, expected[i].type, "type mismatch at " + i);
+ assertEq(actual[i].value, expected[i].value, "value mismatch at " + i);
+ }
+ }
+
+ for (let number of [0, 1, 1.5, Infinity, NaN]) {
+ let expected = numberFormat.formatToParts(number);
+ assertEqParts(thisValue.formatToParts(number), expected);
+ assertEqParts(thisValue[intlFallbackSymbol].formatToParts(number), expected);
+ assertEqParts(fakeObj.formatToParts(number), expected);
+ }
+}
+
+// Test resolvedOptions() returns the same results.
+{
+ // An actual Intl.NumberFormat instance.
+ let numberFormat = new Intl.NumberFormat();
+
+ // An object initialized as a NumberFormat instance.
+ let thisValue = Object.create(Intl.NumberFormat.prototype);
+ Intl.NumberFormat.call(thisValue);
+
+ // Object with [[FallbackSymbol]] set to NumberFormat instance.
+ let fakeObj = {
+ __proto__: Intl.NumberFormat.prototype,
+ [intlFallbackSymbol]: numberFormat,
+ };
+
+ function assertEqOptions(actual, expected) {
+ actual = Object.entries(actual);
+ expected = Object.entries(expected);
+
+ assertEq(actual.length, expected.length, "options count mismatch");
+ for (var i = 0; i < expected.length; i++) {
+ assertEq(actual[i][0], expected[i][0], "key mismatch at " + i);
+ assertEq(actual[i][1], expected[i][1], "value mismatch at " + i);
+ }
+ }
+
+ let expected = numberFormat.resolvedOptions();
+ assertEqOptions(thisValue.resolvedOptions(), expected);
+ assertEqOptions(thisValue[intlFallbackSymbol].resolvedOptions(), expected);
+ assertEqOptions(fakeObj.resolvedOptions(), expected);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/Intl/PluralRules/call.js b/js/src/tests/Intl/PluralRules/call.js
new file mode 100644
index 0000000000..d10027f366
--- /dev/null
+++ b/js/src/tests/Intl/PluralRules/call.js
@@ -0,0 +1,71 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl")||!this.hasOwnProperty("addIntlExtras"))
+
+addIntlExtras(Intl);
+
+function IsConstructor(o) {
+ try {
+ new (new Proxy(o, {construct: () => ({})}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function IsObject(o) {
+ return Object(o) === o;
+}
+
+function thisValues() {
+ const intlConstructors = Object.getOwnPropertyNames(Intl).map(name => Intl[name]).filter(IsConstructor);
+
+ return [
+ // Primitive values.
+ ...[undefined, null, true, "abc", Symbol(), 123],
+
+ // Object values.
+ ...[{}, [], /(?:)/, function(){}, new Proxy({}, {})],
+
+ // Intl objects.
+ ...[].concat(...intlConstructors.map(ctor => [
+ // Instance of an Intl constructor.
+ new ctor(),
+
+ // Instance of a subclassed Intl constructor.
+ new class extends ctor {},
+
+ // Object inheriting from an Intl constructor prototype.
+ Object.create(ctor.prototype),
+
+ // Intl object not inheriting from its default prototype.
+ Object.setPrototypeOf(new ctor(), Object.prototype),
+ ])),
+ ];
+}
+
+// Invoking [[Call]] for Intl.PluralRules always returns a new PluralRules instance.
+for (let thisValue of thisValues()) {
+ let obj = Intl.PluralRules.call(thisValue);
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.PluralRules, true);
+
+ // Ensure Intl.[[FallbackSymbol]] wasn't installed on |thisValue|.
+ if (IsObject(thisValue))
+ assertEqArray(Object.getOwnPropertySymbols(thisValue), []);
+}
+
+// Intl.PluralRules doesn't use the legacy Intl constructor compromise semantics.
+for (let thisValue of thisValues()) {
+ // Ensure instanceof operator isn't invoked for Intl.PluralRules.
+ Object.defineProperty(Intl.PluralRules, Symbol.hasInstance, {
+ get() {
+ assertEq(false, true, "@@hasInstance operator called");
+ }, configurable: true
+ });
+ let obj = Intl.PluralRules.call(thisValue);
+ delete Intl.PluralRules[Symbol.hasInstance];
+ assertEq(Object.is(obj, thisValue), false);
+ assertEq(obj instanceof Intl.PluralRules, true);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/Intl/String/shell.js b/js/src/tests/Intl/String/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/Intl/String/shell.js
diff --git a/js/src/tests/Intl/String/toLocaleLowerCase.js b/js/src/tests/Intl/String/toLocaleLowerCase.js
new file mode 100644
index 0000000000..523738ffd0
--- /dev/null
+++ b/js/src/tests/Intl/String/toLocaleLowerCase.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test language dependent special casing with different language tags.
+for (let locale of ["tr", "TR", "tr-TR", "tr-u-co-search", "tr-x-turkish"]) {
+ assertEq("\u0130".toLocaleLowerCase(locale), "i");
+ assertEq("\u0130".toLocaleLowerCase([locale]), "i");
+
+ // Additional language tags are ignored.
+ assertEq("\u0130".toLocaleLowerCase([locale, "und"]), "i");
+ assertEq("\u0130".toLocaleLowerCase(["und", locale]), "\u0069\u0307");
+}
+
+// Ensure "trl" (Traveller Scottish) isn't misrecognized as "tr", even though
+// both share the same prefix.
+assertEq("\u0130".toLocaleLowerCase("trl"), "\u0069\u0307");
+assertEq("\u0130".toLocaleLowerCase(["trl"]), "\u0069\u0307");
+
+// Language tag is always verified.
+for (let locale of ["no_locale", "tr-invalid_ext", ["no_locale"], ["en", "no_locale"]]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase(locale), RangeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "x".toLocaleLowerCase(locale), RangeError);
+}
+
+// The language tag fast-path for String.prototype.toLocaleLowerCase doesn't
+// trip up on three element private-use only language tags.
+assertEq("A".toLocaleLowerCase("x-x"), "a");
+assertEq("A".toLocaleLowerCase("x-0"), "a");
+
+// No locale argument, undefined as locale, and empty array or array-like all
+// return the same result. Testing with "a/A" because it has only simple case
+// mappings.
+assertEq("A".toLocaleLowerCase(), "a");
+assertEq("A".toLocaleLowerCase(undefined), "a");
+assertEq("A".toLocaleLowerCase([]), "a");
+assertEq("A".toLocaleLowerCase({}), "a");
+assertEq("A".toLocaleLowerCase({length: 0}), "a");
+assertEq("A".toLocaleLowerCase({length: -1}), "a");
+
+// Test with incorrect locale type.
+for (let locale of [null, 0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "A".toLocaleLowerCase([locale]), TypeError);
+}
+
+// Primitives are converted with ToObject and then queried for .length property.
+for (let locale of [null]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleLowerCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "A".toLocaleLowerCase([locale]), TypeError);
+}
+// ToLength(ToObject(<primitive>)) returns 0.
+for (let locale of [0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertEq("".toLocaleLowerCase(locale), "");
+
+ // Non-empty input string.
+ assertEq("A".toLocaleLowerCase(locale), "a");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/Intl/String/toLocaleUpperCase.js b/js/src/tests/Intl/String/toLocaleUpperCase.js
new file mode 100644
index 0000000000..84daf6a913
--- /dev/null
+++ b/js/src/tests/Intl/String/toLocaleUpperCase.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Test language dependent special casing with different language tags.
+for (let locale of ["lt", "LT", "lt-LT", "lt-u-co-phonebk", "lt-x-lietuva"]) {
+ assertEq("i\u0307".toLocaleUpperCase(locale), "I");
+ assertEq("i\u0307".toLocaleUpperCase([locale]), "I");
+
+ // Additional language tags are ignored.
+ assertEq("i\u0307".toLocaleUpperCase([locale, "und"]), "I");
+ assertEq("i\u0307".toLocaleUpperCase(["und", locale]), "I\u0307");
+}
+
+// Ensure "lti" (Leti) isn't misrecognized as "lt", even though both share the
+// same prefix.
+assertEq("i\u0307".toLocaleUpperCase("lti"), "I\u0307");
+assertEq("i\u0307".toLocaleUpperCase(["lti"]), "I\u0307");
+
+// Language tag is always verified.
+for (let locale of ["no_locale", "lt-invalid_ext", ["no_locale"], ["en", "no_locale"]]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase(locale), RangeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase(locale), RangeError);
+}
+
+// The language tag fast-path for String.prototype.toLocaleUpperCase doesn't
+// trip up on three element private-use only language tags.
+assertEq("a".toLocaleUpperCase("x-x"), "A");
+assertEq("a".toLocaleUpperCase("x-0"), "A");
+
+// No locale argument, undefined as locale, and empty array or array-like all
+// return the same result. Testing with "a/A" because it has only simple case
+// mappings.
+assertEq("a".toLocaleUpperCase(), "A");
+assertEq("a".toLocaleUpperCase(undefined), "A");
+assertEq("a".toLocaleUpperCase([]), "A");
+assertEq("a".toLocaleUpperCase({}), "A");
+assertEq("a".toLocaleUpperCase({length: 0}), "A");
+assertEq("a".toLocaleUpperCase({length: -1}), "A");
+
+// Test with incorrect locale type.
+for (let locale of [null, 0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase([locale]), TypeError);
+}
+
+// Primitives are converted with ToObject and then queried for .length property.
+for (let locale of [null]) {
+ // Empty input string.
+ assertThrowsInstanceOf(() => "".toLocaleUpperCase([locale]), TypeError);
+
+ // Non-empty input string.
+ assertThrowsInstanceOf(() => "a".toLocaleUpperCase([locale]), TypeError);
+}
+// ToLength(ToObject(<primitive>)) returns 0.
+for (let locale of [0, Math.PI, NaN, Infinity, true, false, Symbol()]) {
+ // Empty input string.
+ assertEq("".toLocaleUpperCase(locale), "");
+
+ // Non-empty input string.
+ assertEq("a".toLocaleUpperCase(locale), "A");
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0, "ok");
diff --git a/js/src/tests/ecma/String/15.5.4.12-5.js b/js/src/tests/ecma/String/15.5.4.12-5.js
index 505fadd0dc..6e4ab906ab 100644
--- a/js/src/tests/ecma/String/15.5.4.12-5.js
+++ b/js/src/tests/ecma/String/15.5.4.12-5.js
@@ -35,6 +35,9 @@ writeHeaderToLog( SECTION + " "+ TITLE);
// Armenian
// Range: U+0530 to U+058F
for ( var i = 0x0530; i <= 0x058F; i++ ) {
+ // U+0587 (ARMENIAN SMALL LIGATURE ECH YIWN) has special upper casing.
+ if (i == 0x0587) continue;
+
var U = new Unicode( i );
/*
new TestCase( SECTION,
diff --git a/js/src/tests/ecma_5/String/string-space-trim.js b/js/src/tests/ecma_5/String/string-space-trim.js
index d76e2d7852..96deacda65 100644
--- a/js/src/tests/ecma_5/String/string-space-trim.js
+++ b/js/src/tests/ecma_5/String/string-space-trim.js
@@ -5,7 +5,33 @@
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
-var onlySpace = String.fromCharCode(0x9, 0xa, 0xb, 0xc, 0xd, 0x20, 0xa0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2028, 0x2029, 0x202f, 0x205f, 0x3000, 0xfeff);
+var onlySpace = String.fromCharCode(
+ 0x0009 /* <control> (CHARACTER TABULATION) */,
+ 0x000A /* <control> (LINE FEED (LF)) */,
+ 0x000B /* <control> (LINE TABULATION) */,
+ 0x000C /* <control> (FORM FEED (FF)) */,
+ 0x000D /* <control> (CARRIAGE RETURN (CR)) */,
+ 0x0020 /* SPACE */,
+ 0x00A0 /* NO-BREAK SPACE (NON-BREAKING SPACE) */,
+ 0x1680 /* OGHAM SPACE MARK */,
+ 0x2000 /* EN QUAD */,
+ 0x2001 /* EM QUAD */,
+ 0x2002 /* EN SPACE */,
+ 0x2003 /* EM SPACE */,
+ 0x2004 /* THREE-PER-EM SPACE */,
+ 0x2005 /* FOUR-PER-EM SPACE */,
+ 0x2006 /* SIX-PER-EM SPACE */,
+ 0x2007 /* FIGURE SPACE */,
+ 0x2008 /* PUNCTUATION SPACE */,
+ 0x2009 /* THIN SPACE */,
+ 0x200A /* HAIR SPACE */,
+ 0x2028 /* LINE SEPARATOR */,
+ 0x2029 /* PARAGRAPH SEPARATOR */,
+ 0x202F /* NARROW NO-BREAK SPACE */,
+ 0x205F /* MEDIUM MATHEMATICAL SPACE */,
+ 0x3000 /* IDEOGRAPHIC SPACE */,
+ 0xFEFF /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */
+);
assertEq(onlySpace.trim(), "");
assertEq((onlySpace + 'aaaa').trim(), 'aaaa');
diff --git a/js/src/tests/ecma_5/String/string-upper-lower-mapping.js b/js/src/tests/ecma_5/String/string-upper-lower-mapping.js
index 97760b747a..0be26d25eb 100644
--- a/js/src/tests/ecma_5/String/string-upper-lower-mapping.js
+++ b/js/src/tests/ecma_5/String/string-upper-lower-mapping.js
@@ -6,65550 +6,65551 @@
* http://creativecommons.org/licenses/publicdomain/
*/
var mapping = [
- [0x0, 0x0], /* <control> (NULL) */
- [0x1, 0x1], /* <control> (START OF HEADING) */
- [0x2, 0x2], /* <control> (START OF TEXT) */
- [0x3, 0x3], /* <control> (END OF TEXT) */
- [0x4, 0x4], /* <control> (END OF TRANSMISSION) */
- [0x5, 0x5], /* <control> (ENQUIRY) */
- [0x6, 0x6], /* <control> (ACKNOWLEDGE) */
- [0x7, 0x7], /* <control> (BELL) */
- [0x8, 0x8], /* <control> (BACKSPACE) */
- [0x9, 0x9], /* <control> (CHARACTER TABULATION) */
- [0xa, 0xa], /* <control> (LINE FEED (LF)) */
- [0xb, 0xb], /* <control> (LINE TABULATION) */
- [0xc, 0xc], /* <control> (FORM FEED (FF)) */
- [0xd, 0xd], /* <control> (CARRIAGE RETURN (CR)) */
- [0xe, 0xe], /* <control> (SHIFT OUT) */
- [0xf, 0xf], /* <control> (SHIFT IN) */
- [0x10, 0x10], /* <control> (DATA LINK ESCAPE) */
- [0x11, 0x11], /* <control> (DEVICE CONTROL ONE) */
- [0x12, 0x12], /* <control> (DEVICE CONTROL TWO) */
- [0x13, 0x13], /* <control> (DEVICE CONTROL THREE) */
- [0x14, 0x14], /* <control> (DEVICE CONTROL FOUR) */
- [0x15, 0x15], /* <control> (NEGATIVE ACKNOWLEDGE) */
- [0x16, 0x16], /* <control> (SYNCHRONOUS IDLE) */
- [0x17, 0x17], /* <control> (END OF TRANSMISSION BLOCK) */
- [0x18, 0x18], /* <control> (CANCEL) */
- [0x19, 0x19], /* <control> (END OF MEDIUM) */
- [0x1a, 0x1a], /* <control> (SUBSTITUTE) */
- [0x1b, 0x1b], /* <control> (ESCAPE) */
- [0x1c, 0x1c], /* <control> (INFORMATION SEPARATOR FOUR) */
- [0x1d, 0x1d], /* <control> (INFORMATION SEPARATOR THREE) */
- [0x1e, 0x1e], /* <control> (INFORMATION SEPARATOR TWO) */
- [0x1f, 0x1f], /* <control> (INFORMATION SEPARATOR ONE) */
- [0x20, 0x20], /* SPACE */
- [0x21, 0x21], /* EXCLAMATION MARK */
- [0x22, 0x22], /* QUOTATION MARK */
- [0x23, 0x23], /* NUMBER SIGN */
- [0x24, 0x24], /* DOLLAR SIGN */
- [0x25, 0x25], /* PERCENT SIGN */
- [0x26, 0x26], /* AMPERSAND */
- [0x27, 0x27], /* APOSTROPHE (APOSTROPHE-QUOTE) */
- [0x28, 0x28], /* LEFT PARENTHESIS (OPENING PARENTHESIS) */
- [0x29, 0x29], /* RIGHT PARENTHESIS (CLOSING PARENTHESIS) */
- [0x2a, 0x2a], /* ASTERISK */
- [0x2b, 0x2b], /* PLUS SIGN */
- [0x2c, 0x2c], /* COMMA */
- [0x2d, 0x2d], /* HYPHEN-MINUS */
- [0x2e, 0x2e], /* FULL STOP (PERIOD) */
- [0x2f, 0x2f], /* SOLIDUS (SLASH) */
- [0x30, 0x30], /* DIGIT ZERO */
- [0x31, 0x31], /* DIGIT ONE */
- [0x32, 0x32], /* DIGIT TWO */
- [0x33, 0x33], /* DIGIT THREE */
- [0x34, 0x34], /* DIGIT FOUR */
- [0x35, 0x35], /* DIGIT FIVE */
- [0x36, 0x36], /* DIGIT SIX */
- [0x37, 0x37], /* DIGIT SEVEN */
- [0x38, 0x38], /* DIGIT EIGHT */
- [0x39, 0x39], /* DIGIT NINE */
- [0x3a, 0x3a], /* COLON */
- [0x3b, 0x3b], /* SEMICOLON */
- [0x3c, 0x3c], /* LESS-THAN SIGN */
- [0x3d, 0x3d], /* EQUALS SIGN */
- [0x3e, 0x3e], /* GREATER-THAN SIGN */
- [0x3f, 0x3f], /* QUESTION MARK */
- [0x40, 0x40], /* COMMERCIAL AT */
- [0x41, 0x61], /* LATIN CAPITAL LETTER A */
- [0x42, 0x62], /* LATIN CAPITAL LETTER B */
- [0x43, 0x63], /* LATIN CAPITAL LETTER C */
- [0x44, 0x64], /* LATIN CAPITAL LETTER D */
- [0x45, 0x65], /* LATIN CAPITAL LETTER E */
- [0x46, 0x66], /* LATIN CAPITAL LETTER F */
- [0x47, 0x67], /* LATIN CAPITAL LETTER G */
- [0x48, 0x68], /* LATIN CAPITAL LETTER H */
- [0x49, 0x69], /* LATIN CAPITAL LETTER I */
- [0x4a, 0x6a], /* LATIN CAPITAL LETTER J */
- [0x4b, 0x6b], /* LATIN CAPITAL LETTER K */
- [0x4c, 0x6c], /* LATIN CAPITAL LETTER L */
- [0x4d, 0x6d], /* LATIN CAPITAL LETTER M */
- [0x4e, 0x6e], /* LATIN CAPITAL LETTER N */
- [0x4f, 0x6f], /* LATIN CAPITAL LETTER O */
- [0x50, 0x70], /* LATIN CAPITAL LETTER P */
- [0x51, 0x71], /* LATIN CAPITAL LETTER Q */
- [0x52, 0x72], /* LATIN CAPITAL LETTER R */
- [0x53, 0x73], /* LATIN CAPITAL LETTER S */
- [0x54, 0x74], /* LATIN CAPITAL LETTER T */
- [0x55, 0x75], /* LATIN CAPITAL LETTER U */
- [0x56, 0x76], /* LATIN CAPITAL LETTER V */
- [0x57, 0x77], /* LATIN CAPITAL LETTER W */
- [0x58, 0x78], /* LATIN CAPITAL LETTER X */
- [0x59, 0x79], /* LATIN CAPITAL LETTER Y */
- [0x5a, 0x7a], /* LATIN CAPITAL LETTER Z */
- [0x5b, 0x5b], /* LEFT SQUARE BRACKET (OPENING SQUARE BRACKET) */
- [0x5c, 0x5c], /* REVERSE SOLIDUS (BACKSLASH) */
- [0x5d, 0x5d], /* RIGHT SQUARE BRACKET (CLOSING SQUARE BRACKET) */
- [0x5e, 0x5e], /* CIRCUMFLEX ACCENT (SPACING CIRCUMFLEX) */
- [0x5f, 0x5f], /* LOW LINE (SPACING UNDERSCORE) */
- [0x60, 0x60], /* GRAVE ACCENT (SPACING GRAVE) */
- [0x41, 0x61], /* LATIN SMALL LETTER A */
- [0x42, 0x62], /* LATIN SMALL LETTER B */
- [0x43, 0x63], /* LATIN SMALL LETTER C */
- [0x44, 0x64], /* LATIN SMALL LETTER D */
- [0x45, 0x65], /* LATIN SMALL LETTER E */
- [0x46, 0x66], /* LATIN SMALL LETTER F */
- [0x47, 0x67], /* LATIN SMALL LETTER G */
- [0x48, 0x68], /* LATIN SMALL LETTER H */
- [0x49, 0x69], /* LATIN SMALL LETTER I */
- [0x4a, 0x6a], /* LATIN SMALL LETTER J */
- [0x4b, 0x6b], /* LATIN SMALL LETTER K */
- [0x4c, 0x6c], /* LATIN SMALL LETTER L */
- [0x4d, 0x6d], /* LATIN SMALL LETTER M */
- [0x4e, 0x6e], /* LATIN SMALL LETTER N */
- [0x4f, 0x6f], /* LATIN SMALL LETTER O */
- [0x50, 0x70], /* LATIN SMALL LETTER P */
- [0x51, 0x71], /* LATIN SMALL LETTER Q */
- [0x52, 0x72], /* LATIN SMALL LETTER R */
- [0x53, 0x73], /* LATIN SMALL LETTER S */
- [0x54, 0x74], /* LATIN SMALL LETTER T */
- [0x55, 0x75], /* LATIN SMALL LETTER U */
- [0x56, 0x76], /* LATIN SMALL LETTER V */
- [0x57, 0x77], /* LATIN SMALL LETTER W */
- [0x58, 0x78], /* LATIN SMALL LETTER X */
- [0x59, 0x79], /* LATIN SMALL LETTER Y */
- [0x5a, 0x7a], /* LATIN SMALL LETTER Z */
- [0x7b, 0x7b], /* LEFT CURLY BRACKET (OPENING CURLY BRACKET) */
- [0x7c, 0x7c], /* VERTICAL LINE (VERTICAL BAR) */
- [0x7d, 0x7d], /* RIGHT CURLY BRACKET (CLOSING CURLY BRACKET) */
- [0x7e, 0x7e], /* TILDE */
- [0x7f, 0x7f], /* <control> (DELETE) */
- [0x80, 0x80], /* <control> */
- [0x81, 0x81], /* <control> */
- [0x82, 0x82], /* <control> (BREAK PERMITTED HERE) */
- [0x83, 0x83], /* <control> (NO BREAK HERE) */
- [0x84, 0x84], /* <control> */
- [0x85, 0x85], /* <control> (NEXT LINE (NEL)) */
- [0x86, 0x86], /* <control> (START OF SELECTED AREA) */
- [0x87, 0x87], /* <control> (END OF SELECTED AREA) */
- [0x88, 0x88], /* <control> (CHARACTER TABULATION SET) */
- [0x89, 0x89], /* <control> (CHARACTER TABULATION WITH JUSTIFICATION) */
- [0x8a, 0x8a], /* <control> (LINE TABULATION SET) */
- [0x8b, 0x8b], /* <control> (PARTIAL LINE FORWARD) */
- [0x8c, 0x8c], /* <control> (PARTIAL LINE BACKWARD) */
- [0x8d, 0x8d], /* <control> (REVERSE LINE FEED) */
- [0x8e, 0x8e], /* <control> (SINGLE SHIFT TWO) */
- [0x8f, 0x8f], /* <control> (SINGLE SHIFT THREE) */
- [0x90, 0x90], /* <control> (DEVICE CONTROL STRING) */
- [0x91, 0x91], /* <control> (PRIVATE USE ONE) */
- [0x92, 0x92], /* <control> (PRIVATE USE TWO) */
- [0x93, 0x93], /* <control> (SET TRANSMIT STATE) */
- [0x94, 0x94], /* <control> (CANCEL CHARACTER) */
- [0x95, 0x95], /* <control> (MESSAGE WAITING) */
- [0x96, 0x96], /* <control> (START OF GUARDED AREA) */
- [0x97, 0x97], /* <control> (END OF GUARDED AREA) */
- [0x98, 0x98], /* <control> (START OF STRING) */
- [0x99, 0x99], /* <control> */
- [0x9a, 0x9a], /* <control> (SINGLE CHARACTER INTRODUCER) */
- [0x9b, 0x9b], /* <control> (CONTROL SEQUENCE INTRODUCER) */
- [0x9c, 0x9c], /* <control> (STRING TERMINATOR) */
- [0x9d, 0x9d], /* <control> (OPERATING SYSTEM COMMAND) */
- [0x9e, 0x9e], /* <control> (PRIVACY MESSAGE) */
- [0x9f, 0x9f], /* <control> (APPLICATION PROGRAM COMMAND) */
- [0xa0, 0xa0], /* NO-BREAK SPACE (NON-BREAKING SPACE) */
- [0xa1, 0xa1], /* INVERTED EXCLAMATION MARK */
- [0xa2, 0xa2], /* CENT SIGN */
- [0xa3, 0xa3], /* POUND SIGN */
- [0xa4, 0xa4], /* CURRENCY SIGN */
- [0xa5, 0xa5], /* YEN SIGN */
- [0xa6, 0xa6], /* BROKEN BAR (BROKEN VERTICAL BAR) */
- [0xa7, 0xa7], /* SECTION SIGN */
- [0xa8, 0xa8], /* DIAERESIS (SPACING DIAERESIS) */
- [0xa9, 0xa9], /* COPYRIGHT SIGN */
- [0xaa, 0xaa], /* FEMININE ORDINAL INDICATOR */
- [0xab, 0xab], /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (LEFT POINTING GUILLEMET) */
- [0xac, 0xac], /* NOT SIGN */
- [0xad, 0xad], /* SOFT HYPHEN */
- [0xae, 0xae], /* REGISTERED SIGN (REGISTERED TRADE MARK SIGN) */
- [0xaf, 0xaf], /* MACRON (SPACING MACRON) */
- [0xb0, 0xb0], /* DEGREE SIGN */
- [0xb1, 0xb1], /* PLUS-MINUS SIGN (PLUS-OR-MINUS SIGN) */
- [0xb2, 0xb2], /* SUPERSCRIPT TWO (SUPERSCRIPT DIGIT TWO) */
- [0xb3, 0xb3], /* SUPERSCRIPT THREE (SUPERSCRIPT DIGIT THREE) */
- [0xb4, 0xb4], /* ACUTE ACCENT (SPACING ACUTE) */
- [0x39c, 0xb5], /* MICRO SIGN */
- [0xb6, 0xb6], /* PILCROW SIGN (PARAGRAPH SIGN) */
- [0xb7, 0xb7], /* MIDDLE DOT */
- [0xb8, 0xb8], /* CEDILLA (SPACING CEDILLA) */
- [0xb9, 0xb9], /* SUPERSCRIPT ONE (SUPERSCRIPT DIGIT ONE) */
- [0xba, 0xba], /* MASCULINE ORDINAL INDICATOR */
- [0xbb, 0xbb], /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (RIGHT POINTING GUILLEMET) */
- [0xbc, 0xbc], /* VULGAR FRACTION ONE QUARTER (FRACTION ONE QUARTER) */
- [0xbd, 0xbd], /* VULGAR FRACTION ONE HALF (FRACTION ONE HALF) */
- [0xbe, 0xbe], /* VULGAR FRACTION THREE QUARTERS (FRACTION THREE QUARTERS) */
- [0xbf, 0xbf], /* INVERTED QUESTION MARK */
- [0xc0, 0xe0], /* LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE) */
- [0xc1, 0xe1], /* LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE) */
- [0xc2, 0xe2], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX) */
- [0xc3, 0xe3], /* LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE) */
- [0xc4, 0xe4], /* LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS) */
- [0xc5, 0xe5], /* LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING) */
- [0xc6, 0xe6], /* LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E) */
- [0xc7, 0xe7], /* LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA) */
- [0xc8, 0xe8], /* LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE) */
- [0xc9, 0xe9], /* LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE) */
- [0xca, 0xea], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX) */
- [0xcb, 0xeb], /* LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS) */
- [0xcc, 0xec], /* LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE) */
- [0xcd, 0xed], /* LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE) */
- [0xce, 0xee], /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX) */
- [0xcf, 0xef], /* LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS) */
- [0xd0, 0xf0], /* LATIN CAPITAL LETTER ETH */
- [0xd1, 0xf1], /* LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE) */
- [0xd2, 0xf2], /* LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE) */
- [0xd3, 0xf3], /* LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE) */
- [0xd4, 0xf4], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX) */
- [0xd5, 0xf5], /* LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE) */
- [0xd6, 0xf6], /* LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS) */
- [0xd7, 0xd7], /* MULTIPLICATION SIGN */
- [0xd8, 0xf8], /* LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH) */
- [0xd9, 0xf9], /* LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE) */
- [0xda, 0xfa], /* LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE) */
- [0xdb, 0xfb], /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX) */
- [0xdc, 0xfc], /* LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS) */
- [0xdd, 0xfd], /* LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE) */
- [0xde, 0xfe], /* LATIN CAPITAL LETTER THORN */
- [0xdf, 0xdf], /* LATIN SMALL LETTER SHARP S */
- [0xc0, 0xe0], /* LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE) */
- [0xc1, 0xe1], /* LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE) */
- [0xc2, 0xe2], /* LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX) */
- [0xc3, 0xe3], /* LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE) */
- [0xc4, 0xe4], /* LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS) */
- [0xc5, 0xe5], /* LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING) */
- [0xc6, 0xe6], /* LATIN SMALL LETTER AE (LATIN SMALL LETTER A E) */
- [0xc7, 0xe7], /* LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA) */
- [0xc8, 0xe8], /* LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE) */
- [0xc9, 0xe9], /* LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE) */
- [0xca, 0xea], /* LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX) */
- [0xcb, 0xeb], /* LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS) */
- [0xcc, 0xec], /* LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE) */
- [0xcd, 0xed], /* LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE) */
- [0xce, 0xee], /* LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX) */
- [0xcf, 0xef], /* LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS) */
- [0xd0, 0xf0], /* LATIN SMALL LETTER ETH */
- [0xd1, 0xf1], /* LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE) */
- [0xd2, 0xf2], /* LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE) */
- [0xd3, 0xf3], /* LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE) */
- [0xd4, 0xf4], /* LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX) */
- [0xd5, 0xf5], /* LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE) */
- [0xd6, 0xf6], /* LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS) */
- [0xf7, 0xf7], /* DIVISION SIGN */
- [0xd8, 0xf8], /* LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH) */
- [0xd9, 0xf9], /* LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE) */
- [0xda, 0xfa], /* LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE) */
- [0xdb, 0xfb], /* LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX) */
- [0xdc, 0xfc], /* LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS) */
- [0xdd, 0xfd], /* LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE) */
- [0xde, 0xfe], /* LATIN SMALL LETTER THORN */
- [0x178, 0xff], /* LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS) */
- [0x100, 0x101], /* LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON) */
- [0x100, 0x101], /* LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON) */
- [0x102, 0x103], /* LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE) */
- [0x102, 0x103], /* LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE) */
- [0x104, 0x105], /* LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK) */
- [0x104, 0x105], /* LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK) */
- [0x106, 0x107], /* LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE) */
- [0x106, 0x107], /* LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE) */
- [0x108, 0x109], /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX) */
- [0x108, 0x109], /* LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX) */
- [0x10a, 0x10b], /* LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT) */
- [0x10a, 0x10b], /* LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT) */
- [0x10c, 0x10d], /* LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK) */
- [0x10c, 0x10d], /* LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK) */
- [0x10e, 0x10f], /* LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK) */
- [0x10e, 0x10f], /* LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK) */
- [0x110, 0x111], /* LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR) */
- [0x110, 0x111], /* LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR) */
- [0x112, 0x113], /* LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON) */
- [0x112, 0x113], /* LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON) */
- [0x114, 0x115], /* LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE) */
- [0x114, 0x115], /* LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE) */
- [0x116, 0x117], /* LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT) */
- [0x116, 0x117], /* LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT) */
- [0x118, 0x119], /* LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK) */
- [0x118, 0x119], /* LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK) */
- [0x11a, 0x11b], /* LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK) */
- [0x11a, 0x11b], /* LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK) */
- [0x11c, 0x11d], /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX) */
- [0x11c, 0x11d], /* LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX) */
- [0x11e, 0x11f], /* LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE) */
- [0x11e, 0x11f], /* LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE) */
- [0x120, 0x121], /* LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT) */
- [0x120, 0x121], /* LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT) */
- [0x122, 0x123], /* LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA) */
- [0x122, 0x123], /* LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA) */
- [0x124, 0x125], /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX) */
- [0x124, 0x125], /* LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX) */
- [0x126, 0x127], /* LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR) */
- [0x126, 0x127], /* LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR) */
- [0x128, 0x129], /* LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE) */
- [0x128, 0x129], /* LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE) */
- [0x12a, 0x12b], /* LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON) */
- [0x12a, 0x12b], /* LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON) */
- [0x12c, 0x12d], /* LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE) */
- [0x12c, 0x12d], /* LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE) */
- [0x12e, 0x12f], /* LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK) */
- [0x12e, 0x12f], /* LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK) */
- [0x130, 0x69], /* LATIN CAPITAL LETTER I WITH DOT ABOVE (LATIN CAPITAL LETTER I DOT) */
- [0x49, 0x131], /* LATIN SMALL LETTER DOTLESS I */
- [0x132, 0x133], /* LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J) */
- [0x132, 0x133], /* LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J) */
- [0x134, 0x135], /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX) */
- [0x134, 0x135], /* LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX) */
- [0x136, 0x137], /* LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA) */
- [0x136, 0x137], /* LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA) */
- [0x138, 0x138], /* LATIN SMALL LETTER KRA */
- [0x139, 0x13a], /* LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE) */
- [0x139, 0x13a], /* LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE) */
- [0x13b, 0x13c], /* LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA) */
- [0x13b, 0x13c], /* LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA) */
- [0x13d, 0x13e], /* LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK) */
- [0x13d, 0x13e], /* LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK) */
- [0x13f, 0x140], /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */
- [0x13f, 0x140], /* LATIN SMALL LETTER L WITH MIDDLE DOT */
- [0x141, 0x142], /* LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH) */
- [0x141, 0x142], /* LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH) */
- [0x143, 0x144], /* LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE) */
- [0x143, 0x144], /* LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE) */
- [0x145, 0x146], /* LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA) */
- [0x145, 0x146], /* LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA) */
- [0x147, 0x148], /* LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK) */
- [0x147, 0x148], /* LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK) */
- [0x149, 0x149], /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N) */
- [0x14a, 0x14b], /* LATIN CAPITAL LETTER ENG */
- [0x14a, 0x14b], /* LATIN SMALL LETTER ENG */
- [0x14c, 0x14d], /* LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON) */
- [0x14c, 0x14d], /* LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON) */
- [0x14e, 0x14f], /* LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE) */
- [0x14e, 0x14f], /* LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE) */
- [0x150, 0x151], /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE) */
- [0x150, 0x151], /* LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE) */
- [0x152, 0x153], /* LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E) */
- [0x152, 0x153], /* LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E) */
- [0x154, 0x155], /* LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE) */
- [0x154, 0x155], /* LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE) */
- [0x156, 0x157], /* LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA) */
- [0x156, 0x157], /* LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA) */
- [0x158, 0x159], /* LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK) */
- [0x158, 0x159], /* LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK) */
- [0x15a, 0x15b], /* LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE) */
- [0x15a, 0x15b], /* LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE) */
- [0x15c, 0x15d], /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX) */
- [0x15c, 0x15d], /* LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX) */
- [0x15e, 0x15f], /* LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA) */
- [0x15e, 0x15f], /* LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA) */
- [0x160, 0x161], /* LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK) */
- [0x160, 0x161], /* LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK) */
- [0x162, 0x163], /* LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA) */
- [0x162, 0x163], /* LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA) */
- [0x164, 0x165], /* LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK) */
- [0x164, 0x165], /* LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK) */
- [0x166, 0x167], /* LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR) */
- [0x166, 0x167], /* LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR) */
- [0x168, 0x169], /* LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE) */
- [0x168, 0x169], /* LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE) */
- [0x16a, 0x16b], /* LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON) */
- [0x16a, 0x16b], /* LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON) */
- [0x16c, 0x16d], /* LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE) */
- [0x16c, 0x16d], /* LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE) */
- [0x16e, 0x16f], /* LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING) */
- [0x16e, 0x16f], /* LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING) */
- [0x170, 0x171], /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE) */
- [0x170, 0x171], /* LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE) */
- [0x172, 0x173], /* LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK) */
- [0x172, 0x173], /* LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK) */
- [0x174, 0x175], /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX) */
- [0x174, 0x175], /* LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX) */
- [0x176, 0x177], /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX) */
- [0x176, 0x177], /* LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX) */
- [0x178, 0xff], /* LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS) */
- [0x179, 0x17a], /* LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE) */
- [0x179, 0x17a], /* LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE) */
- [0x17b, 0x17c], /* LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT) */
- [0x17b, 0x17c], /* LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT) */
- [0x17d, 0x17e], /* LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK) */
- [0x17d, 0x17e], /* LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK) */
- [0x53, 0x17f], /* LATIN SMALL LETTER LONG S */
- [0x243, 0x180], /* LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR) */
- [0x181, 0x253], /* LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK) */
- [0x182, 0x183], /* LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR) */
- [0x182, 0x183], /* LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR) */
- [0x184, 0x185], /* LATIN CAPITAL LETTER TONE SIX */
- [0x184, 0x185], /* LATIN SMALL LETTER TONE SIX */
- [0x186, 0x254], /* LATIN CAPITAL LETTER OPEN O */
- [0x187, 0x188], /* LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK) */
- [0x187, 0x188], /* LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK) */
- [0x189, 0x256], /* LATIN CAPITAL LETTER AFRICAN D */
- [0x18a, 0x257], /* LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK) */
- [0x18b, 0x18c], /* LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR) */
- [0x18b, 0x18c], /* LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR) */
- [0x18d, 0x18d], /* LATIN SMALL LETTER TURNED DELTA */
- [0x18e, 0x1dd], /* LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E) */
- [0x18f, 0x259], /* LATIN CAPITAL LETTER SCHWA */
- [0x190, 0x25b], /* LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON) */
- [0x191, 0x192], /* LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK) */
- [0x191, 0x192], /* LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F) */
- [0x193, 0x260], /* LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK) */
- [0x194, 0x263], /* LATIN CAPITAL LETTER GAMMA */
- [0x1f6, 0x195], /* LATIN SMALL LETTER HV (LATIN SMALL LETTER H V) */
- [0x196, 0x269], /* LATIN CAPITAL LETTER IOTA */
- [0x197, 0x268], /* LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I) */
- [0x198, 0x199], /* LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK) */
- [0x198, 0x199], /* LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK) */
- [0x23d, 0x19a], /* LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L) */
- [0x19b, 0x19b], /* LATIN SMALL LETTER LAMBDA WITH STROKE (LATIN SMALL LETTER BARRED LAMBDA) */
- [0x19c, 0x26f], /* LATIN CAPITAL LETTER TURNED M */
- [0x19d, 0x272], /* LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK) */
- [0x220, 0x19e], /* LATIN SMALL LETTER N WITH LONG RIGHT LEG */
- [0x19f, 0x275], /* LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O) */
- [0x1a0, 0x1a1], /* LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN) */
- [0x1a0, 0x1a1], /* LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN) */
- [0x1a2, 0x1a3], /* LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I) */
- [0x1a2, 0x1a3], /* LATIN SMALL LETTER OI (LATIN SMALL LETTER O I) */
- [0x1a4, 0x1a5], /* LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK) */
- [0x1a4, 0x1a5], /* LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK) */
- [0x1a6, 0x280], /* LATIN LETTER YR (LATIN LETTER Y R) */
- [0x1a7, 0x1a8], /* LATIN CAPITAL LETTER TONE TWO */
- [0x1a7, 0x1a8], /* LATIN SMALL LETTER TONE TWO */
- [0x1a9, 0x283], /* LATIN CAPITAL LETTER ESH */
- [0x1aa, 0x1aa], /* LATIN LETTER REVERSED ESH LOOP */
- [0x1ab, 0x1ab], /* LATIN SMALL LETTER T WITH PALATAL HOOK (LATIN SMALL LETTER T PALATAL HOOK) */
- [0x1ac, 0x1ad], /* LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK) */
- [0x1ac, 0x1ad], /* LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK) */
- [0x1ae, 0x288], /* LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK) */
- [0x1af, 0x1b0], /* LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN) */
- [0x1af, 0x1b0], /* LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN) */
- [0x1b1, 0x28a], /* LATIN CAPITAL LETTER UPSILON */
- [0x1b2, 0x28b], /* LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V) */
- [0x1b3, 0x1b4], /* LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK) */
- [0x1b3, 0x1b4], /* LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK) */
- [0x1b5, 0x1b6], /* LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR) */
- [0x1b5, 0x1b6], /* LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR) */
- [0x1b7, 0x292], /* LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH) */
- [0x1b8, 0x1b9], /* LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH) */
- [0x1b8, 0x1b9], /* LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH) */
- [0x1ba, 0x1ba], /* LATIN SMALL LETTER EZH WITH TAIL (LATIN SMALL LETTER YOGH WITH TAIL) */
- [0x1bb, 0x1bb], /* LATIN LETTER TWO WITH STROKE (LATIN LETTER TWO BAR) */
- [0x1bc, 0x1bd], /* LATIN CAPITAL LETTER TONE FIVE */
- [0x1bc, 0x1bd], /* LATIN SMALL LETTER TONE FIVE */
- [0x1be, 0x1be], /* LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE (LATIN LETTER INVERTED GLOTTAL STOP BAR) */
- [0x1f7, 0x1bf], /* LATIN LETTER WYNN */
- [0x1c0, 0x1c0], /* LATIN LETTER DENTAL CLICK (LATIN LETTER PIPE) */
- [0x1c1, 0x1c1], /* LATIN LETTER LATERAL CLICK (LATIN LETTER DOUBLE PIPE) */
- [0x1c2, 0x1c2], /* LATIN LETTER ALVEOLAR CLICK (LATIN LETTER PIPE DOUBLE BAR) */
- [0x1c3, 0x1c3], /* LATIN LETTER RETROFLEX CLICK (LATIN LETTER EXCLAMATION MARK) */
- [0x1c4, 0x1c6], /* LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK) */
- [0x1c4, 0x1c6], /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK) */
- [0x1c4, 0x1c6], /* LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK) */
- [0x1c7, 0x1c9], /* LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J) */
- [0x1c7, 0x1c9], /* LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J) */
- [0x1c7, 0x1c9], /* LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J) */
- [0x1ca, 0x1cc], /* LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J) */
- [0x1ca, 0x1cc], /* LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J) */
- [0x1ca, 0x1cc], /* LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J) */
- [0x1cd, 0x1ce], /* LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK) */
- [0x1cd, 0x1ce], /* LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK) */
- [0x1cf, 0x1d0], /* LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK) */
- [0x1cf, 0x1d0], /* LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK) */
- [0x1d1, 0x1d2], /* LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK) */
- [0x1d1, 0x1d2], /* LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK) */
- [0x1d3, 0x1d4], /* LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK) */
- [0x1d3, 0x1d4], /* LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK) */
- [0x1d5, 0x1d6], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON) */
- [0x1d5, 0x1d6], /* LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON) */
- [0x1d7, 0x1d8], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE) */
- [0x1d7, 0x1d8], /* LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE) */
- [0x1d9, 0x1da], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK) */
- [0x1d9, 0x1da], /* LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK) */
- [0x1db, 0x1dc], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE) */
- [0x1db, 0x1dc], /* LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE) */
- [0x18e, 0x1dd], /* LATIN SMALL LETTER TURNED E */
- [0x1de, 0x1df], /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON) */
- [0x1de, 0x1df], /* LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON) */
- [0x1e0, 0x1e1], /* LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON) */
- [0x1e0, 0x1e1], /* LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON) */
- [0x1e2, 0x1e3], /* LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON) */
- [0x1e2, 0x1e3], /* LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON) */
- [0x1e4, 0x1e5], /* LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR) */
- [0x1e4, 0x1e5], /* LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR) */
- [0x1e6, 0x1e7], /* LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK) */
- [0x1e6, 0x1e7], /* LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK) */
- [0x1e8, 0x1e9], /* LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK) */
- [0x1e8, 0x1e9], /* LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK) */
- [0x1ea, 0x1eb], /* LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK) */
- [0x1ea, 0x1eb], /* LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK) */
- [0x1ec, 0x1ed], /* LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON) */
- [0x1ec, 0x1ed], /* LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON) */
- [0x1ee, 0x1ef], /* LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK) */
- [0x1ee, 0x1ef], /* LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK) */
- [0x1f0, 0x1f0], /* LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK) */
- [0x1f1, 0x1f3], /* LATIN CAPITAL LETTER DZ */
- [0x1f1, 0x1f3], /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z */
- [0x1f1, 0x1f3], /* LATIN SMALL LETTER DZ */
- [0x1f4, 0x1f5], /* LATIN CAPITAL LETTER G WITH ACUTE */
- [0x1f4, 0x1f5], /* LATIN SMALL LETTER G WITH ACUTE */
- [0x1f6, 0x195], /* LATIN CAPITAL LETTER HWAIR */
- [0x1f7, 0x1bf], /* LATIN CAPITAL LETTER WYNN */
- [0x1f8, 0x1f9], /* LATIN CAPITAL LETTER N WITH GRAVE */
- [0x1f8, 0x1f9], /* LATIN SMALL LETTER N WITH GRAVE */
- [0x1fa, 0x1fb], /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */
- [0x1fa, 0x1fb], /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */
- [0x1fc, 0x1fd], /* LATIN CAPITAL LETTER AE WITH ACUTE */
- [0x1fc, 0x1fd], /* LATIN SMALL LETTER AE WITH ACUTE */
- [0x1fe, 0x1ff], /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */
- [0x1fe, 0x1ff], /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */
- [0x200, 0x201], /* LATIN CAPITAL LETTER A WITH DOUBLE GRAVE */
- [0x200, 0x201], /* LATIN SMALL LETTER A WITH DOUBLE GRAVE */
- [0x202, 0x203], /* LATIN CAPITAL LETTER A WITH INVERTED BREVE */
- [0x202, 0x203], /* LATIN SMALL LETTER A WITH INVERTED BREVE */
- [0x204, 0x205], /* LATIN CAPITAL LETTER E WITH DOUBLE GRAVE */
- [0x204, 0x205], /* LATIN SMALL LETTER E WITH DOUBLE GRAVE */
- [0x206, 0x207], /* LATIN CAPITAL LETTER E WITH INVERTED BREVE */
- [0x206, 0x207], /* LATIN SMALL LETTER E WITH INVERTED BREVE */
- [0x208, 0x209], /* LATIN CAPITAL LETTER I WITH DOUBLE GRAVE */
- [0x208, 0x209], /* LATIN SMALL LETTER I WITH DOUBLE GRAVE */
- [0x20a, 0x20b], /* LATIN CAPITAL LETTER I WITH INVERTED BREVE */
- [0x20a, 0x20b], /* LATIN SMALL LETTER I WITH INVERTED BREVE */
- [0x20c, 0x20d], /* LATIN CAPITAL LETTER O WITH DOUBLE GRAVE */
- [0x20c, 0x20d], /* LATIN SMALL LETTER O WITH DOUBLE GRAVE */
- [0x20e, 0x20f], /* LATIN CAPITAL LETTER O WITH INVERTED BREVE */
- [0x20e, 0x20f], /* LATIN SMALL LETTER O WITH INVERTED BREVE */
- [0x210, 0x211], /* LATIN CAPITAL LETTER R WITH DOUBLE GRAVE */
- [0x210, 0x211], /* LATIN SMALL LETTER R WITH DOUBLE GRAVE */
- [0x212, 0x213], /* LATIN CAPITAL LETTER R WITH INVERTED BREVE */
- [0x212, 0x213], /* LATIN SMALL LETTER R WITH INVERTED BREVE */
- [0x214, 0x215], /* LATIN CAPITAL LETTER U WITH DOUBLE GRAVE */
- [0x214, 0x215], /* LATIN SMALL LETTER U WITH DOUBLE GRAVE */
- [0x216, 0x217], /* LATIN CAPITAL LETTER U WITH INVERTED BREVE */
- [0x216, 0x217], /* LATIN SMALL LETTER U WITH INVERTED BREVE */
- [0x218, 0x219], /* LATIN CAPITAL LETTER S WITH COMMA BELOW */
- [0x218, 0x219], /* LATIN SMALL LETTER S WITH COMMA BELOW */
- [0x21a, 0x21b], /* LATIN CAPITAL LETTER T WITH COMMA BELOW */
- [0x21a, 0x21b], /* LATIN SMALL LETTER T WITH COMMA BELOW */
- [0x21c, 0x21d], /* LATIN CAPITAL LETTER YOGH */
- [0x21c, 0x21d], /* LATIN SMALL LETTER YOGH */
- [0x21e, 0x21f], /* LATIN CAPITAL LETTER H WITH CARON */
- [0x21e, 0x21f], /* LATIN SMALL LETTER H WITH CARON */
- [0x220, 0x19e], /* LATIN CAPITAL LETTER N WITH LONG RIGHT LEG */
- [0x221, 0x221], /* LATIN SMALL LETTER D WITH CURL */
- [0x222, 0x223], /* LATIN CAPITAL LETTER OU */
- [0x222, 0x223], /* LATIN SMALL LETTER OU */
- [0x224, 0x225], /* LATIN CAPITAL LETTER Z WITH HOOK */
- [0x224, 0x225], /* LATIN SMALL LETTER Z WITH HOOK */
- [0x226, 0x227], /* LATIN CAPITAL LETTER A WITH DOT ABOVE */
- [0x226, 0x227], /* LATIN SMALL LETTER A WITH DOT ABOVE */
- [0x228, 0x229], /* LATIN CAPITAL LETTER E WITH CEDILLA */
- [0x228, 0x229], /* LATIN SMALL LETTER E WITH CEDILLA */
- [0x22a, 0x22b], /* LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON */
- [0x22a, 0x22b], /* LATIN SMALL LETTER O WITH DIAERESIS AND MACRON */
- [0x22c, 0x22d], /* LATIN CAPITAL LETTER O WITH TILDE AND MACRON */
- [0x22c, 0x22d], /* LATIN SMALL LETTER O WITH TILDE AND MACRON */
- [0x22e, 0x22f], /* LATIN CAPITAL LETTER O WITH DOT ABOVE */
- [0x22e, 0x22f], /* LATIN SMALL LETTER O WITH DOT ABOVE */
- [0x230, 0x231], /* LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON */
- [0x230, 0x231], /* LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON */
- [0x232, 0x233], /* LATIN CAPITAL LETTER Y WITH MACRON */
- [0x232, 0x233], /* LATIN SMALL LETTER Y WITH MACRON */
- [0x234, 0x234], /* LATIN SMALL LETTER L WITH CURL */
- [0x235, 0x235], /* LATIN SMALL LETTER N WITH CURL */
- [0x236, 0x236], /* LATIN SMALL LETTER T WITH CURL */
- [0x237, 0x237], /* LATIN SMALL LETTER DOTLESS J */
- [0x238, 0x238], /* LATIN SMALL LETTER DB DIGRAPH */
- [0x239, 0x239], /* LATIN SMALL LETTER QP DIGRAPH */
- [0x23a, 0x2c65], /* LATIN CAPITAL LETTER A WITH STROKE */
- [0x23b, 0x23c], /* LATIN CAPITAL LETTER C WITH STROKE */
- [0x23b, 0x23c], /* LATIN SMALL LETTER C WITH STROKE */
- [0x23d, 0x19a], /* LATIN CAPITAL LETTER L WITH BAR */
- [0x23e, 0x2c66], /* LATIN CAPITAL LETTER T WITH DIAGONAL STROKE */
- [0x2c7e, 0x23f], /* LATIN SMALL LETTER S WITH SWASH TAIL */
- [0x2c7f, 0x240], /* LATIN SMALL LETTER Z WITH SWASH TAIL */
- [0x241, 0x242], /* LATIN CAPITAL LETTER GLOTTAL STOP */
- [0x241, 0x242], /* LATIN SMALL LETTER GLOTTAL STOP */
- [0x243, 0x180], /* LATIN CAPITAL LETTER B WITH STROKE */
- [0x244, 0x289], /* LATIN CAPITAL LETTER U BAR */
- [0x245, 0x28c], /* LATIN CAPITAL LETTER TURNED V */
- [0x246, 0x247], /* LATIN CAPITAL LETTER E WITH STROKE */
- [0x246, 0x247], /* LATIN SMALL LETTER E WITH STROKE */
- [0x248, 0x249], /* LATIN CAPITAL LETTER J WITH STROKE */
- [0x248, 0x249], /* LATIN SMALL LETTER J WITH STROKE */
- [0x24a, 0x24b], /* LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL */
- [0x24a, 0x24b], /* LATIN SMALL LETTER Q WITH HOOK TAIL */
- [0x24c, 0x24d], /* LATIN CAPITAL LETTER R WITH STROKE */
- [0x24c, 0x24d], /* LATIN SMALL LETTER R WITH STROKE */
- [0x24e, 0x24f], /* LATIN CAPITAL LETTER Y WITH STROKE */
- [0x24e, 0x24f], /* LATIN SMALL LETTER Y WITH STROKE */
- [0x2c6f, 0x250], /* LATIN SMALL LETTER TURNED A */
- [0x2c6d, 0x251], /* LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A) */
- [0x2c70, 0x252], /* LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A) */
- [0x181, 0x253], /* LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK) */
- [0x186, 0x254], /* LATIN SMALL LETTER OPEN O */
- [0x255, 0x255], /* LATIN SMALL LETTER C WITH CURL (LATIN SMALL LETTER C CURL) */
- [0x189, 0x256], /* LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK) */
- [0x18a, 0x257], /* LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK) */
- [0x258, 0x258], /* LATIN SMALL LETTER REVERSED E */
- [0x18f, 0x259], /* LATIN SMALL LETTER SCHWA */
- [0x25a, 0x25a], /* LATIN SMALL LETTER SCHWA WITH HOOK (LATIN SMALL LETTER SCHWA HOOK) */
- [0x190, 0x25b], /* LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON) */
- [0xa7ab, 0x25c], /* LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) */
- [0x25d, 0x25d], /* LATIN SMALL LETTER REVERSED OPEN E WITH HOOK (LATIN SMALL LETTER REVERSED EPSILON HOOK) */
- [0x25e, 0x25e], /* LATIN SMALL LETTER CLOSED REVERSED OPEN E (LATIN SMALL LETTER CLOSED REVERSED EPSILON) */
- [0x25f, 0x25f], /* LATIN SMALL LETTER DOTLESS J WITH STROKE (LATIN SMALL LETTER DOTLESS J BAR) */
- [0x193, 0x260], /* LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK) */
- [0xa7ac, 0x261], /* LATIN SMALL LETTER SCRIPT G */
- [0x262, 0x262], /* LATIN LETTER SMALL CAPITAL G */
- [0x194, 0x263], /* LATIN SMALL LETTER GAMMA */
- [0x264, 0x264], /* LATIN SMALL LETTER RAMS HORN (LATIN SMALL LETTER BABY GAMMA) */
- [0xa78d, 0x265], /* LATIN SMALL LETTER TURNED H */
- [0xa7aa, 0x266], /* LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK) */
- [0x267, 0x267], /* LATIN SMALL LETTER HENG WITH HOOK (LATIN SMALL LETTER HENG HOOK) */
- [0x197, 0x268], /* LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I) */
- [0x196, 0x269], /* LATIN SMALL LETTER IOTA */
- [0xa7ae, 0x26a], /* LATIN LETTER SMALL CAPITAL I */
- [0x2c62, 0x26b], /* LATIN SMALL LETTER L WITH MIDDLE TILDE */
- [0xa7ad, 0x26c], /* LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) */
- [0x26d, 0x26d], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK (LATIN SMALL LETTER L RETROFLEX HOOK) */
- [0x26e, 0x26e], /* LATIN SMALL LETTER LEZH (LATIN SMALL LETTER L YOGH) */
- [0x19c, 0x26f], /* LATIN SMALL LETTER TURNED M */
- [0x270, 0x270], /* LATIN SMALL LETTER TURNED M WITH LONG LEG */
- [0x2c6e, 0x271], /* LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK) */
- [0x19d, 0x272], /* LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK) */
- [0x273, 0x273], /* LATIN SMALL LETTER N WITH RETROFLEX HOOK (LATIN SMALL LETTER N RETROFLEX HOOK) */
- [0x274, 0x274], /* LATIN LETTER SMALL CAPITAL N */
- [0x19f, 0x275], /* LATIN SMALL LETTER BARRED O */
- [0x276, 0x276], /* LATIN LETTER SMALL CAPITAL OE (LATIN LETTER SMALL CAPITAL O E) */
- [0x277, 0x277], /* LATIN SMALL LETTER CLOSED OMEGA */
- [0x278, 0x278], /* LATIN SMALL LETTER PHI */
- [0x279, 0x279], /* LATIN SMALL LETTER TURNED R */
- [0x27a, 0x27a], /* LATIN SMALL LETTER TURNED R WITH LONG LEG */
- [0x27b, 0x27b], /* LATIN SMALL LETTER TURNED R WITH HOOK (LATIN SMALL LETTER TURNED R HOOK) */
- [0x27c, 0x27c], /* LATIN SMALL LETTER R WITH LONG LEG */
- [0x2c64, 0x27d], /* LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK) */
- [0x27e, 0x27e], /* LATIN SMALL LETTER R WITH FISHHOOK (LATIN SMALL LETTER FISHHOOK R) */
- [0x27f, 0x27f], /* LATIN SMALL LETTER REVERSED R WITH FISHHOOK (LATIN SMALL LETTER REVERSED FISHHOOK R) */
- [0x1a6, 0x280], /* LATIN LETTER SMALL CAPITAL R */
- [0x281, 0x281], /* LATIN LETTER SMALL CAPITAL INVERTED R */
- [0x282, 0x282], /* LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK) */
- [0x1a9, 0x283], /* LATIN SMALL LETTER ESH */
- [0x284, 0x284], /* LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK (LATIN SMALL LETTER DOTLESS J BAR HOOK) */
- [0x285, 0x285], /* LATIN SMALL LETTER SQUAT REVERSED ESH */
- [0x286, 0x286], /* LATIN SMALL LETTER ESH WITH CURL (LATIN SMALL LETTER ESH CURL) */
- [0xa7b1, 0x287], /* LATIN SMALL LETTER TURNED T */
- [0x1ae, 0x288], /* LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK) */
- [0x244, 0x289], /* LATIN SMALL LETTER U BAR */
- [0x1b1, 0x28a], /* LATIN SMALL LETTER UPSILON */
- [0x1b2, 0x28b], /* LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V) */
- [0x245, 0x28c], /* LATIN SMALL LETTER TURNED V */
- [0x28d, 0x28d], /* LATIN SMALL LETTER TURNED W */
- [0x28e, 0x28e], /* LATIN SMALL LETTER TURNED Y */
- [0x28f, 0x28f], /* LATIN LETTER SMALL CAPITAL Y */
- [0x290, 0x290], /* LATIN SMALL LETTER Z WITH RETROFLEX HOOK (LATIN SMALL LETTER Z RETROFLEX HOOK) */
- [0x291, 0x291], /* LATIN SMALL LETTER Z WITH CURL (LATIN SMALL LETTER Z CURL) */
- [0x1b7, 0x292], /* LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH) */
- [0x293, 0x293], /* LATIN SMALL LETTER EZH WITH CURL (LATIN SMALL LETTER YOGH CURL) */
- [0x294, 0x294], /* LATIN LETTER GLOTTAL STOP */
- [0x295, 0x295], /* LATIN LETTER PHARYNGEAL VOICED FRICATIVE (LATIN LETTER REVERSED GLOTTAL STOP) */
- [0x296, 0x296], /* LATIN LETTER INVERTED GLOTTAL STOP */
- [0x297, 0x297], /* LATIN LETTER STRETCHED C */
- [0x298, 0x298], /* LATIN LETTER BILABIAL CLICK (LATIN LETTER BULLSEYE) */
- [0x299, 0x299], /* LATIN LETTER SMALL CAPITAL B */
- [0x29a, 0x29a], /* LATIN SMALL LETTER CLOSED OPEN E (LATIN SMALL LETTER CLOSED EPSILON) */
- [0x29b, 0x29b], /* LATIN LETTER SMALL CAPITAL G WITH HOOK (LATIN LETTER SMALL CAPITAL G HOOK) */
- [0x29c, 0x29c], /* LATIN LETTER SMALL CAPITAL H */
- [0xa7b2, 0x29d], /* LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) */
- [0xa7b0, 0x29e], /* LATIN SMALL LETTER TURNED K */
- [0x29f, 0x29f], /* LATIN LETTER SMALL CAPITAL L */
- [0x2a0, 0x2a0], /* LATIN SMALL LETTER Q WITH HOOK (LATIN SMALL LETTER Q HOOK) */
- [0x2a1, 0x2a1], /* LATIN LETTER GLOTTAL STOP WITH STROKE (LATIN LETTER GLOTTAL STOP BAR) */
- [0x2a2, 0x2a2], /* LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE (LATIN LETTER REVERSED GLOTTAL STOP BAR) */
- [0x2a3, 0x2a3], /* LATIN SMALL LETTER DZ DIGRAPH (LATIN SMALL LETTER D Z) */
- [0x2a4, 0x2a4], /* LATIN SMALL LETTER DEZH DIGRAPH (LATIN SMALL LETTER D YOGH) */
- [0x2a5, 0x2a5], /* LATIN SMALL LETTER DZ DIGRAPH WITH CURL (LATIN SMALL LETTER D Z CURL) */
- [0x2a6, 0x2a6], /* LATIN SMALL LETTER TS DIGRAPH (LATIN SMALL LETTER T S) */
- [0x2a7, 0x2a7], /* LATIN SMALL LETTER TESH DIGRAPH (LATIN SMALL LETTER T ESH) */
- [0x2a8, 0x2a8], /* LATIN SMALL LETTER TC DIGRAPH WITH CURL (LATIN SMALL LETTER T C CURL) */
- [0x2a9, 0x2a9], /* LATIN SMALL LETTER FENG DIGRAPH */
- [0x2aa, 0x2aa], /* LATIN SMALL LETTER LS DIGRAPH */
- [0x2ab, 0x2ab], /* LATIN SMALL LETTER LZ DIGRAPH */
- [0x2ac, 0x2ac], /* LATIN LETTER BILABIAL PERCUSSIVE */
- [0x2ad, 0x2ad], /* LATIN LETTER BIDENTAL PERCUSSIVE */
- [0x2ae, 0x2ae], /* LATIN SMALL LETTER TURNED H WITH FISHHOOK */
- [0x2af, 0x2af], /* LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL */
- [0x2b0, 0x2b0], /* MODIFIER LETTER SMALL H */
- [0x2b1, 0x2b1], /* MODIFIER LETTER SMALL H WITH HOOK (MODIFIER LETTER SMALL H HOOK) */
- [0x2b2, 0x2b2], /* MODIFIER LETTER SMALL J */
- [0x2b3, 0x2b3], /* MODIFIER LETTER SMALL R */
- [0x2b4, 0x2b4], /* MODIFIER LETTER SMALL TURNED R */
- [0x2b5, 0x2b5], /* MODIFIER LETTER SMALL TURNED R WITH HOOK (MODIFIER LETTER SMALL TURNED R HOOK) */
- [0x2b6, 0x2b6], /* MODIFIER LETTER SMALL CAPITAL INVERTED R */
- [0x2b7, 0x2b7], /* MODIFIER LETTER SMALL W */
- [0x2b8, 0x2b8], /* MODIFIER LETTER SMALL Y */
- [0x2b9, 0x2b9], /* MODIFIER LETTER PRIME */
- [0x2ba, 0x2ba], /* MODIFIER LETTER DOUBLE PRIME */
- [0x2bb, 0x2bb], /* MODIFIER LETTER TURNED COMMA */
- [0x2bc, 0x2bc], /* MODIFIER LETTER APOSTROPHE */
- [0x2bd, 0x2bd], /* MODIFIER LETTER REVERSED COMMA */
- [0x2be, 0x2be], /* MODIFIER LETTER RIGHT HALF RING */
- [0x2bf, 0x2bf], /* MODIFIER LETTER LEFT HALF RING */
- [0x2c0, 0x2c0], /* MODIFIER LETTER GLOTTAL STOP */
- [0x2c1, 0x2c1], /* MODIFIER LETTER REVERSED GLOTTAL STOP */
- [0x2c2, 0x2c2], /* MODIFIER LETTER LEFT ARROWHEAD */
- [0x2c3, 0x2c3], /* MODIFIER LETTER RIGHT ARROWHEAD */
- [0x2c4, 0x2c4], /* MODIFIER LETTER UP ARROWHEAD */
- [0x2c5, 0x2c5], /* MODIFIER LETTER DOWN ARROWHEAD */
- [0x2c6, 0x2c6], /* MODIFIER LETTER CIRCUMFLEX ACCENT (MODIFIER LETTER CIRCUMFLEX) */
- [0x2c7, 0x2c7], /* CARON (MODIFIER LETTER HACEK) */
- [0x2c8, 0x2c8], /* MODIFIER LETTER VERTICAL LINE */
- [0x2c9, 0x2c9], /* MODIFIER LETTER MACRON */
- [0x2ca, 0x2ca], /* MODIFIER LETTER ACUTE ACCENT (MODIFIER LETTER ACUTE) */
- [0x2cb, 0x2cb], /* MODIFIER LETTER GRAVE ACCENT (MODIFIER LETTER GRAVE) */
- [0x2cc, 0x2cc], /* MODIFIER LETTER LOW VERTICAL LINE */
- [0x2cd, 0x2cd], /* MODIFIER LETTER LOW MACRON */
- [0x2ce, 0x2ce], /* MODIFIER LETTER LOW GRAVE ACCENT (MODIFIER LETTER LOW GRAVE) */
- [0x2cf, 0x2cf], /* MODIFIER LETTER LOW ACUTE ACCENT (MODIFIER LETTER LOW ACUTE) */
- [0x2d0, 0x2d0], /* MODIFIER LETTER TRIANGULAR COLON */
- [0x2d1, 0x2d1], /* MODIFIER LETTER HALF TRIANGULAR COLON */
- [0x2d2, 0x2d2], /* MODIFIER LETTER CENTRED RIGHT HALF RING (MODIFIER LETTER CENTERED RIGHT HALF RING) */
- [0x2d3, 0x2d3], /* MODIFIER LETTER CENTRED LEFT HALF RING (MODIFIER LETTER CENTERED LEFT HALF RING) */
- [0x2d4, 0x2d4], /* MODIFIER LETTER UP TACK */
- [0x2d5, 0x2d5], /* MODIFIER LETTER DOWN TACK */
- [0x2d6, 0x2d6], /* MODIFIER LETTER PLUS SIGN */
- [0x2d7, 0x2d7], /* MODIFIER LETTER MINUS SIGN */
- [0x2d8, 0x2d8], /* BREVE (SPACING BREVE) */
- [0x2d9, 0x2d9], /* DOT ABOVE (SPACING DOT ABOVE) */
- [0x2da, 0x2da], /* RING ABOVE (SPACING RING ABOVE) */
- [0x2db, 0x2db], /* OGONEK (SPACING OGONEK) */
- [0x2dc, 0x2dc], /* SMALL TILDE (SPACING TILDE) */
- [0x2dd, 0x2dd], /* DOUBLE ACUTE ACCENT (SPACING DOUBLE ACUTE) */
- [0x2de, 0x2de], /* MODIFIER LETTER RHOTIC HOOK */
- [0x2df, 0x2df], /* MODIFIER LETTER CROSS ACCENT */
- [0x2e0, 0x2e0], /* MODIFIER LETTER SMALL GAMMA */
- [0x2e1, 0x2e1], /* MODIFIER LETTER SMALL L */
- [0x2e2, 0x2e2], /* MODIFIER LETTER SMALL S */
- [0x2e3, 0x2e3], /* MODIFIER LETTER SMALL X */
- [0x2e4, 0x2e4], /* MODIFIER LETTER SMALL REVERSED GLOTTAL STOP */
- [0x2e5, 0x2e5], /* MODIFIER LETTER EXTRA-HIGH TONE BAR */
- [0x2e6, 0x2e6], /* MODIFIER LETTER HIGH TONE BAR */
- [0x2e7, 0x2e7], /* MODIFIER LETTER MID TONE BAR */
- [0x2e8, 0x2e8], /* MODIFIER LETTER LOW TONE BAR */
- [0x2e9, 0x2e9], /* MODIFIER LETTER EXTRA-LOW TONE BAR */
- [0x2ea, 0x2ea], /* MODIFIER LETTER YIN DEPARTING TONE MARK */
- [0x2eb, 0x2eb], /* MODIFIER LETTER YANG DEPARTING TONE MARK */
- [0x2ec, 0x2ec], /* MODIFIER LETTER VOICING */
- [0x2ed, 0x2ed], /* MODIFIER LETTER UNASPIRATED */
- [0x2ee, 0x2ee], /* MODIFIER LETTER DOUBLE APOSTROPHE */
- [0x2ef, 0x2ef], /* MODIFIER LETTER LOW DOWN ARROWHEAD */
- [0x2f0, 0x2f0], /* MODIFIER LETTER LOW UP ARROWHEAD */
- [0x2f1, 0x2f1], /* MODIFIER LETTER LOW LEFT ARROWHEAD */
- [0x2f2, 0x2f2], /* MODIFIER LETTER LOW RIGHT ARROWHEAD */
- [0x2f3, 0x2f3], /* MODIFIER LETTER LOW RING */
- [0x2f4, 0x2f4], /* MODIFIER LETTER MIDDLE GRAVE ACCENT */
- [0x2f5, 0x2f5], /* MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT */
- [0x2f6, 0x2f6], /* MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT */
- [0x2f7, 0x2f7], /* MODIFIER LETTER LOW TILDE */
- [0x2f8, 0x2f8], /* MODIFIER LETTER RAISED COLON */
- [0x2f9, 0x2f9], /* MODIFIER LETTER BEGIN HIGH TONE */
- [0x2fa, 0x2fa], /* MODIFIER LETTER END HIGH TONE */
- [0x2fb, 0x2fb], /* MODIFIER LETTER BEGIN LOW TONE */
- [0x2fc, 0x2fc], /* MODIFIER LETTER END LOW TONE */
- [0x2fd, 0x2fd], /* MODIFIER LETTER SHELF */
- [0x2fe, 0x2fe], /* MODIFIER LETTER OPEN SHELF */
- [0x2ff, 0x2ff], /* MODIFIER LETTER LOW LEFT ARROW */
- [0x300, 0x300], /* COMBINING GRAVE ACCENT (NON-SPACING GRAVE) */
- [0x301, 0x301], /* COMBINING ACUTE ACCENT (NON-SPACING ACUTE) */
- [0x302, 0x302], /* COMBINING CIRCUMFLEX ACCENT (NON-SPACING CIRCUMFLEX) */
- [0x303, 0x303], /* COMBINING TILDE (NON-SPACING TILDE) */
- [0x304, 0x304], /* COMBINING MACRON (NON-SPACING MACRON) */
- [0x305, 0x305], /* COMBINING OVERLINE (NON-SPACING OVERSCORE) */
- [0x306, 0x306], /* COMBINING BREVE (NON-SPACING BREVE) */
- [0x307, 0x307], /* COMBINING DOT ABOVE (NON-SPACING DOT ABOVE) */
- [0x308, 0x308], /* COMBINING DIAERESIS (NON-SPACING DIAERESIS) */
- [0x309, 0x309], /* COMBINING HOOK ABOVE (NON-SPACING HOOK ABOVE) */
- [0x30a, 0x30a], /* COMBINING RING ABOVE (NON-SPACING RING ABOVE) */
- [0x30b, 0x30b], /* COMBINING DOUBLE ACUTE ACCENT (NON-SPACING DOUBLE ACUTE) */
- [0x30c, 0x30c], /* COMBINING CARON (NON-SPACING HACEK) */
- [0x30d, 0x30d], /* COMBINING VERTICAL LINE ABOVE (NON-SPACING VERTICAL LINE ABOVE) */
- [0x30e, 0x30e], /* COMBINING DOUBLE VERTICAL LINE ABOVE (NON-SPACING DOUBLE VERTICAL LINE ABOVE) */
- [0x30f, 0x30f], /* COMBINING DOUBLE GRAVE ACCENT (NON-SPACING DOUBLE GRAVE) */
- [0x310, 0x310], /* COMBINING CANDRABINDU (NON-SPACING CANDRABINDU) */
- [0x311, 0x311], /* COMBINING INVERTED BREVE (NON-SPACING INVERTED BREVE) */
- [0x312, 0x312], /* COMBINING TURNED COMMA ABOVE (NON-SPACING TURNED COMMA ABOVE) */
- [0x313, 0x313], /* COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE) */
- [0x314, 0x314], /* COMBINING REVERSED COMMA ABOVE (NON-SPACING REVERSED COMMA ABOVE) */
- [0x315, 0x315], /* COMBINING COMMA ABOVE RIGHT (NON-SPACING COMMA ABOVE RIGHT) */
- [0x316, 0x316], /* COMBINING GRAVE ACCENT BELOW (NON-SPACING GRAVE BELOW) */
- [0x317, 0x317], /* COMBINING ACUTE ACCENT BELOW (NON-SPACING ACUTE BELOW) */
- [0x318, 0x318], /* COMBINING LEFT TACK BELOW (NON-SPACING LEFT TACK BELOW) */
- [0x319, 0x319], /* COMBINING RIGHT TACK BELOW (NON-SPACING RIGHT TACK BELOW) */
- [0x31a, 0x31a], /* COMBINING LEFT ANGLE ABOVE (NON-SPACING LEFT ANGLE ABOVE) */
- [0x31b, 0x31b], /* COMBINING HORN (NON-SPACING HORN) */
- [0x31c, 0x31c], /* COMBINING LEFT HALF RING BELOW (NON-SPACING LEFT HALF RING BELOW) */
- [0x31d, 0x31d], /* COMBINING UP TACK BELOW (NON-SPACING UP TACK BELOW) */
- [0x31e, 0x31e], /* COMBINING DOWN TACK BELOW (NON-SPACING DOWN TACK BELOW) */
- [0x31f, 0x31f], /* COMBINING PLUS SIGN BELOW (NON-SPACING PLUS SIGN BELOW) */
- [0x320, 0x320], /* COMBINING MINUS SIGN BELOW (NON-SPACING MINUS SIGN BELOW) */
- [0x321, 0x321], /* COMBINING PALATALIZED HOOK BELOW (NON-SPACING PALATALIZED HOOK BELOW) */
- [0x322, 0x322], /* COMBINING RETROFLEX HOOK BELOW (NON-SPACING RETROFLEX HOOK BELOW) */
- [0x323, 0x323], /* COMBINING DOT BELOW (NON-SPACING DOT BELOW) */
- [0x324, 0x324], /* COMBINING DIAERESIS BELOW (NON-SPACING DOUBLE DOT BELOW) */
- [0x325, 0x325], /* COMBINING RING BELOW (NON-SPACING RING BELOW) */
- [0x326, 0x326], /* COMBINING COMMA BELOW (NON-SPACING COMMA BELOW) */
- [0x327, 0x327], /* COMBINING CEDILLA (NON-SPACING CEDILLA) */
- [0x328, 0x328], /* COMBINING OGONEK (NON-SPACING OGONEK) */
- [0x329, 0x329], /* COMBINING VERTICAL LINE BELOW (NON-SPACING VERTICAL LINE BELOW) */
- [0x32a, 0x32a], /* COMBINING BRIDGE BELOW (NON-SPACING BRIDGE BELOW) */
- [0x32b, 0x32b], /* COMBINING INVERTED DOUBLE ARCH BELOW (NON-SPACING INVERTED DOUBLE ARCH BELOW) */
- [0x32c, 0x32c], /* COMBINING CARON BELOW (NON-SPACING HACEK BELOW) */
- [0x32d, 0x32d], /* COMBINING CIRCUMFLEX ACCENT BELOW (NON-SPACING CIRCUMFLEX BELOW) */
- [0x32e, 0x32e], /* COMBINING BREVE BELOW (NON-SPACING BREVE BELOW) */
- [0x32f, 0x32f], /* COMBINING INVERTED BREVE BELOW (NON-SPACING INVERTED BREVE BELOW) */
- [0x330, 0x330], /* COMBINING TILDE BELOW (NON-SPACING TILDE BELOW) */
- [0x331, 0x331], /* COMBINING MACRON BELOW (NON-SPACING MACRON BELOW) */
- [0x332, 0x332], /* COMBINING LOW LINE (NON-SPACING UNDERSCORE) */
- [0x333, 0x333], /* COMBINING DOUBLE LOW LINE (NON-SPACING DOUBLE UNDERSCORE) */
- [0x334, 0x334], /* COMBINING TILDE OVERLAY (NON-SPACING TILDE OVERLAY) */
- [0x335, 0x335], /* COMBINING SHORT STROKE OVERLAY (NON-SPACING SHORT BAR OVERLAY) */
- [0x336, 0x336], /* COMBINING LONG STROKE OVERLAY (NON-SPACING LONG BAR OVERLAY) */
- [0x337, 0x337], /* COMBINING SHORT SOLIDUS OVERLAY (NON-SPACING SHORT SLASH OVERLAY) */
- [0x338, 0x338], /* COMBINING LONG SOLIDUS OVERLAY (NON-SPACING LONG SLASH OVERLAY) */
- [0x339, 0x339], /* COMBINING RIGHT HALF RING BELOW (NON-SPACING RIGHT HALF RING BELOW) */
- [0x33a, 0x33a], /* COMBINING INVERTED BRIDGE BELOW (NON-SPACING INVERTED BRIDGE BELOW) */
- [0x33b, 0x33b], /* COMBINING SQUARE BELOW (NON-SPACING SQUARE BELOW) */
- [0x33c, 0x33c], /* COMBINING SEAGULL BELOW (NON-SPACING SEAGULL BELOW) */
- [0x33d, 0x33d], /* COMBINING X ABOVE (NON-SPACING X ABOVE) */
- [0x33e, 0x33e], /* COMBINING VERTICAL TILDE (NON-SPACING VERTICAL TILDE) */
- [0x33f, 0x33f], /* COMBINING DOUBLE OVERLINE (NON-SPACING DOUBLE OVERSCORE) */
- [0x340, 0x340], /* COMBINING GRAVE TONE MARK (NON-SPACING GRAVE TONE MARK) */
- [0x341, 0x341], /* COMBINING ACUTE TONE MARK (NON-SPACING ACUTE TONE MARK) */
- [0x342, 0x342], /* COMBINING GREEK PERISPOMENI */
- [0x343, 0x343], /* COMBINING GREEK KORONIS */
- [0x344, 0x344], /* COMBINING GREEK DIALYTIKA TONOS (GREEK NON-SPACING DIAERESIS TONOS) */
- [0x399, 0x345], /* COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW) */
- [0x346, 0x346], /* COMBINING BRIDGE ABOVE */
- [0x347, 0x347], /* COMBINING EQUALS SIGN BELOW */
- [0x348, 0x348], /* COMBINING DOUBLE VERTICAL LINE BELOW */
- [0x349, 0x349], /* COMBINING LEFT ANGLE BELOW */
- [0x34a, 0x34a], /* COMBINING NOT TILDE ABOVE */
- [0x34b, 0x34b], /* COMBINING HOMOTHETIC ABOVE */
- [0x34c, 0x34c], /* COMBINING ALMOST EQUAL TO ABOVE */
- [0x34d, 0x34d], /* COMBINING LEFT RIGHT ARROW BELOW */
- [0x34e, 0x34e], /* COMBINING UPWARDS ARROW BELOW */
- [0x34f, 0x34f], /* COMBINING GRAPHEME JOINER */
- [0x350, 0x350], /* COMBINING RIGHT ARROWHEAD ABOVE */
- [0x351, 0x351], /* COMBINING LEFT HALF RING ABOVE */
- [0x352, 0x352], /* COMBINING FERMATA */
- [0x353, 0x353], /* COMBINING X BELOW */
- [0x354, 0x354], /* COMBINING LEFT ARROWHEAD BELOW */
- [0x355, 0x355], /* COMBINING RIGHT ARROWHEAD BELOW */
- [0x356, 0x356], /* COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW */
- [0x357, 0x357], /* COMBINING RIGHT HALF RING ABOVE */
- [0x358, 0x358], /* COMBINING DOT ABOVE RIGHT */
- [0x359, 0x359], /* COMBINING ASTERISK BELOW */
- [0x35a, 0x35a], /* COMBINING DOUBLE RING BELOW */
- [0x35b, 0x35b], /* COMBINING ZIGZAG ABOVE */
- [0x35c, 0x35c], /* COMBINING DOUBLE BREVE BELOW */
- [0x35d, 0x35d], /* COMBINING DOUBLE BREVE */
- [0x35e, 0x35e], /* COMBINING DOUBLE MACRON */
- [0x35f, 0x35f], /* COMBINING DOUBLE MACRON BELOW */
- [0x360, 0x360], /* COMBINING DOUBLE TILDE */
- [0x361, 0x361], /* COMBINING DOUBLE INVERTED BREVE */
- [0x362, 0x362], /* COMBINING DOUBLE RIGHTWARDS ARROW BELOW */
- [0x363, 0x363], /* COMBINING LATIN SMALL LETTER A */
- [0x364, 0x364], /* COMBINING LATIN SMALL LETTER E */
- [0x365, 0x365], /* COMBINING LATIN SMALL LETTER I */
- [0x366, 0x366], /* COMBINING LATIN SMALL LETTER O */
- [0x367, 0x367], /* COMBINING LATIN SMALL LETTER U */
- [0x368, 0x368], /* COMBINING LATIN SMALL LETTER C */
- [0x369, 0x369], /* COMBINING LATIN SMALL LETTER D */
- [0x36a, 0x36a], /* COMBINING LATIN SMALL LETTER H */
- [0x36b, 0x36b], /* COMBINING LATIN SMALL LETTER M */
- [0x36c, 0x36c], /* COMBINING LATIN SMALL LETTER R */
- [0x36d, 0x36d], /* COMBINING LATIN SMALL LETTER T */
- [0x36e, 0x36e], /* COMBINING LATIN SMALL LETTER V */
- [0x36f, 0x36f], /* COMBINING LATIN SMALL LETTER X */
- [0x370, 0x371], /* GREEK CAPITAL LETTER HETA */
- [0x370, 0x371], /* GREEK SMALL LETTER HETA */
- [0x372, 0x373], /* GREEK CAPITAL LETTER ARCHAIC SAMPI */
- [0x372, 0x373], /* GREEK SMALL LETTER ARCHAIC SAMPI */
- [0x374, 0x374], /* GREEK NUMERAL SIGN (GREEK UPPER NUMERAL SIGN) */
- [0x375, 0x375], /* GREEK LOWER NUMERAL SIGN */
- [0x376, 0x377], /* GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA */
- [0x376, 0x377], /* GREEK SMALL LETTER PAMPHYLIAN DIGAMMA */
- [0x378, 0x378],
- [0x379, 0x379],
- [0x37a, 0x37a], /* GREEK YPOGEGRAMMENI (GREEK SPACING IOTA BELOW) */
- [0x3fd, 0x37b], /* GREEK SMALL REVERSED LUNATE SIGMA SYMBOL */
- [0x3fe, 0x37c], /* GREEK SMALL DOTTED LUNATE SIGMA SYMBOL */
- [0x3ff, 0x37d], /* GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL */
- [0x37e, 0x37e], /* GREEK QUESTION MARK */
- [0x37f, 0x3f3], /* GREEK CAPITAL LETTER YOT */
- [0x380, 0x380],
- [0x381, 0x381],
- [0x382, 0x382],
- [0x383, 0x383],
- [0x384, 0x384], /* GREEK TONOS (GREEK SPACING TONOS) */
- [0x385, 0x385], /* GREEK DIALYTIKA TONOS (GREEK SPACING DIAERESIS TONOS) */
- [0x386, 0x3ac], /* GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS) */
- [0x387, 0x387], /* GREEK ANO TELEIA */
- [0x388, 0x3ad], /* GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS) */
- [0x389, 0x3ae], /* GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS) */
- [0x38a, 0x3af], /* GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS) */
- [0x38b, 0x38b],
- [0x38c, 0x3cc], /* GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS) */
- [0x38d, 0x38d],
- [0x38e, 0x3cd], /* GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS) */
- [0x38f, 0x3ce], /* GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS) */
- [0x390, 0x390], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS) */
- [0x391, 0x3b1], /* GREEK CAPITAL LETTER ALPHA */
- [0x392, 0x3b2], /* GREEK CAPITAL LETTER BETA */
- [0x393, 0x3b3], /* GREEK CAPITAL LETTER GAMMA */
- [0x394, 0x3b4], /* GREEK CAPITAL LETTER DELTA */
- [0x395, 0x3b5], /* GREEK CAPITAL LETTER EPSILON */
- [0x396, 0x3b6], /* GREEK CAPITAL LETTER ZETA */
- [0x397, 0x3b7], /* GREEK CAPITAL LETTER ETA */
- [0x398, 0x3b8], /* GREEK CAPITAL LETTER THETA */
- [0x399, 0x3b9], /* GREEK CAPITAL LETTER IOTA */
- [0x39a, 0x3ba], /* GREEK CAPITAL LETTER KAPPA */
- [0x39b, 0x3bb], /* GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA) */
- [0x39c, 0x3bc], /* GREEK CAPITAL LETTER MU */
- [0x39d, 0x3bd], /* GREEK CAPITAL LETTER NU */
- [0x39e, 0x3be], /* GREEK CAPITAL LETTER XI */
- [0x39f, 0x3bf], /* GREEK CAPITAL LETTER OMICRON */
- [0x3a0, 0x3c0], /* GREEK CAPITAL LETTER PI */
- [0x3a1, 0x3c1], /* GREEK CAPITAL LETTER RHO */
- [0x3a2, 0x3a2],
- [0x3a3, 0x3c3], /* GREEK CAPITAL LETTER SIGMA */
- [0x3a4, 0x3c4], /* GREEK CAPITAL LETTER TAU */
- [0x3a5, 0x3c5], /* GREEK CAPITAL LETTER UPSILON */
- [0x3a6, 0x3c6], /* GREEK CAPITAL LETTER PHI */
- [0x3a7, 0x3c7], /* GREEK CAPITAL LETTER CHI */
- [0x3a8, 0x3c8], /* GREEK CAPITAL LETTER PSI */
- [0x3a9, 0x3c9], /* GREEK CAPITAL LETTER OMEGA */
- [0x3aa, 0x3ca], /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS) */
- [0x3ab, 0x3cb], /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS) */
- [0x386, 0x3ac], /* GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS) */
- [0x388, 0x3ad], /* GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS) */
- [0x389, 0x3ae], /* GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS) */
- [0x38a, 0x3af], /* GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS) */
- [0x3b0, 0x3b0], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS) */
- [0x391, 0x3b1], /* GREEK SMALL LETTER ALPHA */
- [0x392, 0x3b2], /* GREEK SMALL LETTER BETA */
- [0x393, 0x3b3], /* GREEK SMALL LETTER GAMMA */
- [0x394, 0x3b4], /* GREEK SMALL LETTER DELTA */
- [0x395, 0x3b5], /* GREEK SMALL LETTER EPSILON */
- [0x396, 0x3b6], /* GREEK SMALL LETTER ZETA */
- [0x397, 0x3b7], /* GREEK SMALL LETTER ETA */
- [0x398, 0x3b8], /* GREEK SMALL LETTER THETA */
- [0x399, 0x3b9], /* GREEK SMALL LETTER IOTA */
- [0x39a, 0x3ba], /* GREEK SMALL LETTER KAPPA */
- [0x39b, 0x3bb], /* GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA) */
- [0x39c, 0x3bc], /* GREEK SMALL LETTER MU */
- [0x39d, 0x3bd], /* GREEK SMALL LETTER NU */
- [0x39e, 0x3be], /* GREEK SMALL LETTER XI */
- [0x39f, 0x3bf], /* GREEK SMALL LETTER OMICRON */
- [0x3a0, 0x3c0], /* GREEK SMALL LETTER PI */
- [0x3a1, 0x3c1], /* GREEK SMALL LETTER RHO */
- [0x3a3, 0x3c2], /* GREEK SMALL LETTER FINAL SIGMA */
- [0x3a3, 0x3c3], /* GREEK SMALL LETTER SIGMA */
- [0x3a4, 0x3c4], /* GREEK SMALL LETTER TAU */
- [0x3a5, 0x3c5], /* GREEK SMALL LETTER UPSILON */
- [0x3a6, 0x3c6], /* GREEK SMALL LETTER PHI */
- [0x3a7, 0x3c7], /* GREEK SMALL LETTER CHI */
- [0x3a8, 0x3c8], /* GREEK SMALL LETTER PSI */
- [0x3a9, 0x3c9], /* GREEK SMALL LETTER OMEGA */
- [0x3aa, 0x3ca], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS) */
- [0x3ab, 0x3cb], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS) */
- [0x38c, 0x3cc], /* GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS) */
- [0x38e, 0x3cd], /* GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS) */
- [0x38f, 0x3ce], /* GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS) */
- [0x3cf, 0x3d7], /* GREEK CAPITAL KAI SYMBOL */
- [0x392, 0x3d0], /* GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA) */
- [0x398, 0x3d1], /* GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA) */
- [0x3d2, 0x3d2], /* GREEK UPSILON WITH HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK) */
- [0x3d3, 0x3d3], /* GREEK UPSILON WITH ACUTE AND HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK TONOS) */
- [0x3d4, 0x3d4], /* GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS) */
- [0x3a6, 0x3d5], /* GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI) */
- [0x3a0, 0x3d6], /* GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI) */
- [0x3cf, 0x3d7], /* GREEK KAI SYMBOL */
- [0x3d8, 0x3d9], /* GREEK LETTER ARCHAIC KOPPA */
- [0x3d8, 0x3d9], /* GREEK SMALL LETTER ARCHAIC KOPPA */
- [0x3da, 0x3db], /* GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA) */
- [0x3da, 0x3db], /* GREEK SMALL LETTER STIGMA */
- [0x3dc, 0x3dd], /* GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA) */
- [0x3dc, 0x3dd], /* GREEK SMALL LETTER DIGAMMA */
- [0x3de, 0x3df], /* GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA) */
- [0x3de, 0x3df], /* GREEK SMALL LETTER KOPPA */
- [0x3e0, 0x3e1], /* GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI) */
- [0x3e0, 0x3e1], /* GREEK SMALL LETTER SAMPI */
- [0x3e2, 0x3e3], /* COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI) */
- [0x3e2, 0x3e3], /* COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI) */
- [0x3e4, 0x3e5], /* COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI) */
- [0x3e4, 0x3e5], /* COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI) */
- [0x3e6, 0x3e7], /* COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI) */
- [0x3e6, 0x3e7], /* COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI) */
- [0x3e8, 0x3e9], /* COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI) */
- [0x3e8, 0x3e9], /* COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI) */
- [0x3ea, 0x3eb], /* COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA) */
- [0x3ea, 0x3eb], /* COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA) */
- [0x3ec, 0x3ed], /* COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA) */
- [0x3ec, 0x3ed], /* COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA) */
- [0x3ee, 0x3ef], /* COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI) */
- [0x3ee, 0x3ef], /* COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI) */
- [0x39a, 0x3f0], /* GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA) */
- [0x3a1, 0x3f1], /* GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO) */
- [0x3f9, 0x3f2], /* GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA) */
- [0x37f, 0x3f3], /* GREEK LETTER YOT */
- [0x3f4, 0x3b8], /* GREEK CAPITAL THETA SYMBOL */
- [0x395, 0x3f5], /* GREEK LUNATE EPSILON SYMBOL */
- [0x3f6, 0x3f6], /* GREEK REVERSED LUNATE EPSILON SYMBOL */
- [0x3f7, 0x3f8], /* GREEK CAPITAL LETTER SHO */
- [0x3f7, 0x3f8], /* GREEK SMALL LETTER SHO */
- [0x3f9, 0x3f2], /* GREEK CAPITAL LUNATE SIGMA SYMBOL */
- [0x3fa, 0x3fb], /* GREEK CAPITAL LETTER SAN */
- [0x3fa, 0x3fb], /* GREEK SMALL LETTER SAN */
- [0x3fc, 0x3fc], /* GREEK RHO WITH STROKE SYMBOL */
- [0x3fd, 0x37b], /* GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL */
- [0x3fe, 0x37c], /* GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL */
- [0x3ff, 0x37d], /* GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL */
- [0x400, 0x450], /* CYRILLIC CAPITAL LETTER IE WITH GRAVE */
- [0x401, 0x451], /* CYRILLIC CAPITAL LETTER IO */
- [0x402, 0x452], /* CYRILLIC CAPITAL LETTER DJE */
- [0x403, 0x453], /* CYRILLIC CAPITAL LETTER GJE */
- [0x404, 0x454], /* CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E) */
- [0x405, 0x455], /* CYRILLIC CAPITAL LETTER DZE */
- [0x406, 0x456], /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I) */
- [0x407, 0x457], /* CYRILLIC CAPITAL LETTER YI */
- [0x408, 0x458], /* CYRILLIC CAPITAL LETTER JE */
- [0x409, 0x459], /* CYRILLIC CAPITAL LETTER LJE */
- [0x40a, 0x45a], /* CYRILLIC CAPITAL LETTER NJE */
- [0x40b, 0x45b], /* CYRILLIC CAPITAL LETTER TSHE */
- [0x40c, 0x45c], /* CYRILLIC CAPITAL LETTER KJE */
- [0x40d, 0x45d], /* CYRILLIC CAPITAL LETTER I WITH GRAVE */
- [0x40e, 0x45e], /* CYRILLIC CAPITAL LETTER SHORT U */
- [0x40f, 0x45f], /* CYRILLIC CAPITAL LETTER DZHE */
- [0x410, 0x430], /* CYRILLIC CAPITAL LETTER A */
- [0x411, 0x431], /* CYRILLIC CAPITAL LETTER BE */
- [0x412, 0x432], /* CYRILLIC CAPITAL LETTER VE */
- [0x413, 0x433], /* CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE) */
- [0x414, 0x434], /* CYRILLIC CAPITAL LETTER DE */
- [0x415, 0x435], /* CYRILLIC CAPITAL LETTER IE */
- [0x416, 0x436], /* CYRILLIC CAPITAL LETTER ZHE */
- [0x417, 0x437], /* CYRILLIC CAPITAL LETTER ZE */
- [0x418, 0x438], /* CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II) */
- [0x419, 0x439], /* CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II) */
- [0x41a, 0x43a], /* CYRILLIC CAPITAL LETTER KA */
- [0x41b, 0x43b], /* CYRILLIC CAPITAL LETTER EL */
- [0x41c, 0x43c], /* CYRILLIC CAPITAL LETTER EM */
- [0x41d, 0x43d], /* CYRILLIC CAPITAL LETTER EN */
- [0x41e, 0x43e], /* CYRILLIC CAPITAL LETTER O */
- [0x41f, 0x43f], /* CYRILLIC CAPITAL LETTER PE */
- [0x420, 0x440], /* CYRILLIC CAPITAL LETTER ER */
- [0x421, 0x441], /* CYRILLIC CAPITAL LETTER ES */
- [0x422, 0x442], /* CYRILLIC CAPITAL LETTER TE */
- [0x423, 0x443], /* CYRILLIC CAPITAL LETTER U */
- [0x424, 0x444], /* CYRILLIC CAPITAL LETTER EF */
- [0x425, 0x445], /* CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA) */
- [0x426, 0x446], /* CYRILLIC CAPITAL LETTER TSE */
- [0x427, 0x447], /* CYRILLIC CAPITAL LETTER CHE */
- [0x428, 0x448], /* CYRILLIC CAPITAL LETTER SHA */
- [0x429, 0x449], /* CYRILLIC CAPITAL LETTER SHCHA */
- [0x42a, 0x44a], /* CYRILLIC CAPITAL LETTER HARD SIGN */
- [0x42b, 0x44b], /* CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI) */
- [0x42c, 0x44c], /* CYRILLIC CAPITAL LETTER SOFT SIGN */
- [0x42d, 0x44d], /* CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E) */
- [0x42e, 0x44e], /* CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU) */
- [0x42f, 0x44f], /* CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA) */
- [0x410, 0x430], /* CYRILLIC SMALL LETTER A */
- [0x411, 0x431], /* CYRILLIC SMALL LETTER BE */
- [0x412, 0x432], /* CYRILLIC SMALL LETTER VE */
- [0x413, 0x433], /* CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE) */
- [0x414, 0x434], /* CYRILLIC SMALL LETTER DE */
- [0x415, 0x435], /* CYRILLIC SMALL LETTER IE */
- [0x416, 0x436], /* CYRILLIC SMALL LETTER ZHE */
- [0x417, 0x437], /* CYRILLIC SMALL LETTER ZE */
- [0x418, 0x438], /* CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II) */
- [0x419, 0x439], /* CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II) */
- [0x41a, 0x43a], /* CYRILLIC SMALL LETTER KA */
- [0x41b, 0x43b], /* CYRILLIC SMALL LETTER EL */
- [0x41c, 0x43c], /* CYRILLIC SMALL LETTER EM */
- [0x41d, 0x43d], /* CYRILLIC SMALL LETTER EN */
- [0x41e, 0x43e], /* CYRILLIC SMALL LETTER O */
- [0x41f, 0x43f], /* CYRILLIC SMALL LETTER PE */
- [0x420, 0x440], /* CYRILLIC SMALL LETTER ER */
- [0x421, 0x441], /* CYRILLIC SMALL LETTER ES */
- [0x422, 0x442], /* CYRILLIC SMALL LETTER TE */
- [0x423, 0x443], /* CYRILLIC SMALL LETTER U */
- [0x424, 0x444], /* CYRILLIC SMALL LETTER EF */
- [0x425, 0x445], /* CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA) */
- [0x426, 0x446], /* CYRILLIC SMALL LETTER TSE */
- [0x427, 0x447], /* CYRILLIC SMALL LETTER CHE */
- [0x428, 0x448], /* CYRILLIC SMALL LETTER SHA */
- [0x429, 0x449], /* CYRILLIC SMALL LETTER SHCHA */
- [0x42a, 0x44a], /* CYRILLIC SMALL LETTER HARD SIGN */
- [0x42b, 0x44b], /* CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI) */
- [0x42c, 0x44c], /* CYRILLIC SMALL LETTER SOFT SIGN */
- [0x42d, 0x44d], /* CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E) */
- [0x42e, 0x44e], /* CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU) */
- [0x42f, 0x44f], /* CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA) */
- [0x400, 0x450], /* CYRILLIC SMALL LETTER IE WITH GRAVE */
- [0x401, 0x451], /* CYRILLIC SMALL LETTER IO */
- [0x402, 0x452], /* CYRILLIC SMALL LETTER DJE */
- [0x403, 0x453], /* CYRILLIC SMALL LETTER GJE */
- [0x404, 0x454], /* CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E) */
- [0x405, 0x455], /* CYRILLIC SMALL LETTER DZE */
- [0x406, 0x456], /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I) */
- [0x407, 0x457], /* CYRILLIC SMALL LETTER YI */
- [0x408, 0x458], /* CYRILLIC SMALL LETTER JE */
- [0x409, 0x459], /* CYRILLIC SMALL LETTER LJE */
- [0x40a, 0x45a], /* CYRILLIC SMALL LETTER NJE */
- [0x40b, 0x45b], /* CYRILLIC SMALL LETTER TSHE */
- [0x40c, 0x45c], /* CYRILLIC SMALL LETTER KJE */
- [0x40d, 0x45d], /* CYRILLIC SMALL LETTER I WITH GRAVE */
- [0x40e, 0x45e], /* CYRILLIC SMALL LETTER SHORT U */
- [0x40f, 0x45f], /* CYRILLIC SMALL LETTER DZHE */
- [0x460, 0x461], /* CYRILLIC CAPITAL LETTER OMEGA */
- [0x460, 0x461], /* CYRILLIC SMALL LETTER OMEGA */
- [0x462, 0x463], /* CYRILLIC CAPITAL LETTER YAT */
- [0x462, 0x463], /* CYRILLIC SMALL LETTER YAT */
- [0x464, 0x465], /* CYRILLIC CAPITAL LETTER IOTIFIED E */
- [0x464, 0x465], /* CYRILLIC SMALL LETTER IOTIFIED E */
- [0x466, 0x467], /* CYRILLIC CAPITAL LETTER LITTLE YUS */
- [0x466, 0x467], /* CYRILLIC SMALL LETTER LITTLE YUS */
- [0x468, 0x469], /* CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS */
- [0x468, 0x469], /* CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS */
- [0x46a, 0x46b], /* CYRILLIC CAPITAL LETTER BIG YUS */
- [0x46a, 0x46b], /* CYRILLIC SMALL LETTER BIG YUS */
- [0x46c, 0x46d], /* CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS */
- [0x46c, 0x46d], /* CYRILLIC SMALL LETTER IOTIFIED BIG YUS */
- [0x46e, 0x46f], /* CYRILLIC CAPITAL LETTER KSI */
- [0x46e, 0x46f], /* CYRILLIC SMALL LETTER KSI */
- [0x470, 0x471], /* CYRILLIC CAPITAL LETTER PSI */
- [0x470, 0x471], /* CYRILLIC SMALL LETTER PSI */
- [0x472, 0x473], /* CYRILLIC CAPITAL LETTER FITA */
- [0x472, 0x473], /* CYRILLIC SMALL LETTER FITA */
- [0x474, 0x475], /* CYRILLIC CAPITAL LETTER IZHITSA */
- [0x474, 0x475], /* CYRILLIC SMALL LETTER IZHITSA */
- [0x476, 0x477], /* CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE) */
- [0x476, 0x477], /* CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE) */
- [0x478, 0x479], /* CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH) */
- [0x478, 0x479], /* CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH) */
- [0x47a, 0x47b], /* CYRILLIC CAPITAL LETTER ROUND OMEGA */
- [0x47a, 0x47b], /* CYRILLIC SMALL LETTER ROUND OMEGA */
- [0x47c, 0x47d], /* CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO) */
- [0x47c, 0x47d], /* CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO) */
- [0x47e, 0x47f], /* CYRILLIC CAPITAL LETTER OT */
- [0x47e, 0x47f], /* CYRILLIC SMALL LETTER OT */
- [0x480, 0x481], /* CYRILLIC CAPITAL LETTER KOPPA */
- [0x480, 0x481], /* CYRILLIC SMALL LETTER KOPPA */
- [0x482, 0x482], /* CYRILLIC THOUSANDS SIGN */
- [0x483, 0x483], /* COMBINING CYRILLIC TITLO (CYRILLIC NON-SPACING TITLO) */
- [0x484, 0x484], /* COMBINING CYRILLIC PALATALIZATION (CYRILLIC NON-SPACING PALATALIZATION) */
- [0x485, 0x485], /* COMBINING CYRILLIC DASIA PNEUMATA (CYRILLIC NON-SPACING DASIA PNEUMATA) */
- [0x486, 0x486], /* COMBINING CYRILLIC PSILI PNEUMATA (CYRILLIC NON-SPACING PSILI PNEUMATA) */
- [0x487, 0x487], /* COMBINING CYRILLIC POKRYTIE */
- [0x488, 0x488], /* COMBINING CYRILLIC HUNDRED THOUSANDS SIGN */
- [0x489, 0x489], /* COMBINING CYRILLIC MILLIONS SIGN */
- [0x48a, 0x48b], /* CYRILLIC CAPITAL LETTER SHORT I WITH TAIL */
- [0x48a, 0x48b], /* CYRILLIC SMALL LETTER SHORT I WITH TAIL */
- [0x48c, 0x48d], /* CYRILLIC CAPITAL LETTER SEMISOFT SIGN */
- [0x48c, 0x48d], /* CYRILLIC SMALL LETTER SEMISOFT SIGN */
- [0x48e, 0x48f], /* CYRILLIC CAPITAL LETTER ER WITH TICK */
- [0x48e, 0x48f], /* CYRILLIC SMALL LETTER ER WITH TICK */
- [0x490, 0x491], /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN) */
- [0x490, 0x491], /* CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN) */
- [0x492, 0x493], /* CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR) */
- [0x492, 0x493], /* CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR) */
- [0x494, 0x495], /* CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK) */
- [0x494, 0x495], /* CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK) */
- [0x496, 0x497], /* CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER) */
- [0x496, 0x497], /* CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER) */
- [0x498, 0x499], /* CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA) */
- [0x498, 0x499], /* CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA) */
- [0x49a, 0x49b], /* CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER) */
- [0x49a, 0x49b], /* CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER) */
- [0x49c, 0x49d], /* CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR) */
- [0x49c, 0x49d], /* CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR) */
- [0x49e, 0x49f], /* CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR) */
- [0x49e, 0x49f], /* CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR) */
- [0x4a0, 0x4a1], /* CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA) */
- [0x4a0, 0x4a1], /* CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA) */
- [0x4a2, 0x4a3], /* CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER) */
- [0x4a2, 0x4a3], /* CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER) */
- [0x4a4, 0x4a5], /* CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE) */
- [0x4a4, 0x4a5], /* CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE) */
- [0x4a6, 0x4a7], /* CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK) */
- [0x4a6, 0x4a7], /* CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK) */
- [0x4a8, 0x4a9], /* CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK) */
- [0x4a8, 0x4a9], /* CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK) */
- [0x4aa, 0x4ab], /* CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA) */
- [0x4aa, 0x4ab], /* CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA) */
- [0x4ac, 0x4ad], /* CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER) */
- [0x4ac, 0x4ad], /* CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER) */
- [0x4ae, 0x4af], /* CYRILLIC CAPITAL LETTER STRAIGHT U */
- [0x4ae, 0x4af], /* CYRILLIC SMALL LETTER STRAIGHT U */
- [0x4b0, 0x4b1], /* CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR) */
- [0x4b0, 0x4b1], /* CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR) */
- [0x4b2, 0x4b3], /* CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER) */
- [0x4b2, 0x4b3], /* CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER) */
- [0x4b4, 0x4b5], /* CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE) */
- [0x4b4, 0x4b5], /* CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE) */
- [0x4b6, 0x4b7], /* CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER) */
- [0x4b6, 0x4b7], /* CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER) */
- [0x4b8, 0x4b9], /* CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR) */
- [0x4b8, 0x4b9], /* CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR) */
- [0x4ba, 0x4bb], /* CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H) */
- [0x4ba, 0x4bb], /* CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H) */
- [0x4bc, 0x4bd], /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK) */
- [0x4bc, 0x4bd], /* CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK) */
- [0x4be, 0x4bf], /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK) */
- [0x4be, 0x4bf], /* CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK) */
- [0x4c0, 0x4cf], /* CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I) */
- [0x4c1, 0x4c2], /* CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE) */
- [0x4c1, 0x4c2], /* CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE) */
- [0x4c3, 0x4c4], /* CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK) */
- [0x4c3, 0x4c4], /* CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK) */
- [0x4c5, 0x4c6], /* CYRILLIC CAPITAL LETTER EL WITH TAIL */
- [0x4c5, 0x4c6], /* CYRILLIC SMALL LETTER EL WITH TAIL */
- [0x4c7, 0x4c8], /* CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK) */
- [0x4c7, 0x4c8], /* CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK) */
- [0x4c9, 0x4ca], /* CYRILLIC CAPITAL LETTER EN WITH TAIL */
- [0x4c9, 0x4ca], /* CYRILLIC SMALL LETTER EN WITH TAIL */
- [0x4cb, 0x4cc], /* CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER) */
- [0x4cb, 0x4cc], /* CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER) */
- [0x4cd, 0x4ce], /* CYRILLIC CAPITAL LETTER EM WITH TAIL */
- [0x4cd, 0x4ce], /* CYRILLIC SMALL LETTER EM WITH TAIL */
- [0x4c0, 0x4cf], /* CYRILLIC SMALL LETTER PALOCHKA */
- [0x4d0, 0x4d1], /* CYRILLIC CAPITAL LETTER A WITH BREVE */
- [0x4d0, 0x4d1], /* CYRILLIC SMALL LETTER A WITH BREVE */
- [0x4d2, 0x4d3], /* CYRILLIC CAPITAL LETTER A WITH DIAERESIS */
- [0x4d2, 0x4d3], /* CYRILLIC SMALL LETTER A WITH DIAERESIS */
- [0x4d4, 0x4d5], /* CYRILLIC CAPITAL LIGATURE A IE */
- [0x4d4, 0x4d5], /* CYRILLIC SMALL LIGATURE A IE */
- [0x4d6, 0x4d7], /* CYRILLIC CAPITAL LETTER IE WITH BREVE */
- [0x4d6, 0x4d7], /* CYRILLIC SMALL LETTER IE WITH BREVE */
- [0x4d8, 0x4d9], /* CYRILLIC CAPITAL LETTER SCHWA */
- [0x4d8, 0x4d9], /* CYRILLIC SMALL LETTER SCHWA */
- [0x4da, 0x4db], /* CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS */
- [0x4da, 0x4db], /* CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS */
- [0x4dc, 0x4dd], /* CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS */
- [0x4dc, 0x4dd], /* CYRILLIC SMALL LETTER ZHE WITH DIAERESIS */
- [0x4de, 0x4df], /* CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS */
- [0x4de, 0x4df], /* CYRILLIC SMALL LETTER ZE WITH DIAERESIS */
- [0x4e0, 0x4e1], /* CYRILLIC CAPITAL LETTER ABKHASIAN DZE */
- [0x4e0, 0x4e1], /* CYRILLIC SMALL LETTER ABKHASIAN DZE */
- [0x4e2, 0x4e3], /* CYRILLIC CAPITAL LETTER I WITH MACRON */
- [0x4e2, 0x4e3], /* CYRILLIC SMALL LETTER I WITH MACRON */
- [0x4e4, 0x4e5], /* CYRILLIC CAPITAL LETTER I WITH DIAERESIS */
- [0x4e4, 0x4e5], /* CYRILLIC SMALL LETTER I WITH DIAERESIS */
- [0x4e6, 0x4e7], /* CYRILLIC CAPITAL LETTER O WITH DIAERESIS */
- [0x4e6, 0x4e7], /* CYRILLIC SMALL LETTER O WITH DIAERESIS */
- [0x4e8, 0x4e9], /* CYRILLIC CAPITAL LETTER BARRED O */
- [0x4e8, 0x4e9], /* CYRILLIC SMALL LETTER BARRED O */
- [0x4ea, 0x4eb], /* CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS */
- [0x4ea, 0x4eb], /* CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS */
- [0x4ec, 0x4ed], /* CYRILLIC CAPITAL LETTER E WITH DIAERESIS */
- [0x4ec, 0x4ed], /* CYRILLIC SMALL LETTER E WITH DIAERESIS */
- [0x4ee, 0x4ef], /* CYRILLIC CAPITAL LETTER U WITH MACRON */
- [0x4ee, 0x4ef], /* CYRILLIC SMALL LETTER U WITH MACRON */
- [0x4f0, 0x4f1], /* CYRILLIC CAPITAL LETTER U WITH DIAERESIS */
- [0x4f0, 0x4f1], /* CYRILLIC SMALL LETTER U WITH DIAERESIS */
- [0x4f2, 0x4f3], /* CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE */
- [0x4f2, 0x4f3], /* CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE */
- [0x4f4, 0x4f5], /* CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS */
- [0x4f4, 0x4f5], /* CYRILLIC SMALL LETTER CHE WITH DIAERESIS */
- [0x4f6, 0x4f7], /* CYRILLIC CAPITAL LETTER GHE WITH DESCENDER */
- [0x4f6, 0x4f7], /* CYRILLIC SMALL LETTER GHE WITH DESCENDER */
- [0x4f8, 0x4f9], /* CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS */
- [0x4f8, 0x4f9], /* CYRILLIC SMALL LETTER YERU WITH DIAERESIS */
- [0x4fa, 0x4fb], /* CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK */
- [0x4fa, 0x4fb], /* CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK */
- [0x4fc, 0x4fd], /* CYRILLIC CAPITAL LETTER HA WITH HOOK */
- [0x4fc, 0x4fd], /* CYRILLIC SMALL LETTER HA WITH HOOK */
- [0x4fe, 0x4ff], /* CYRILLIC CAPITAL LETTER HA WITH STROKE */
- [0x4fe, 0x4ff], /* CYRILLIC SMALL LETTER HA WITH STROKE */
- [0x500, 0x501], /* CYRILLIC CAPITAL LETTER KOMI DE */
- [0x500, 0x501], /* CYRILLIC SMALL LETTER KOMI DE */
- [0x502, 0x503], /* CYRILLIC CAPITAL LETTER KOMI DJE */
- [0x502, 0x503], /* CYRILLIC SMALL LETTER KOMI DJE */
- [0x504, 0x505], /* CYRILLIC CAPITAL LETTER KOMI ZJE */
- [0x504, 0x505], /* CYRILLIC SMALL LETTER KOMI ZJE */
- [0x506, 0x507], /* CYRILLIC CAPITAL LETTER KOMI DZJE */
- [0x506, 0x507], /* CYRILLIC SMALL LETTER KOMI DZJE */
- [0x508, 0x509], /* CYRILLIC CAPITAL LETTER KOMI LJE */
- [0x508, 0x509], /* CYRILLIC SMALL LETTER KOMI LJE */
- [0x50a, 0x50b], /* CYRILLIC CAPITAL LETTER KOMI NJE */
- [0x50a, 0x50b], /* CYRILLIC SMALL LETTER KOMI NJE */
- [0x50c, 0x50d], /* CYRILLIC CAPITAL LETTER KOMI SJE */
- [0x50c, 0x50d], /* CYRILLIC SMALL LETTER KOMI SJE */
- [0x50e, 0x50f], /* CYRILLIC CAPITAL LETTER KOMI TJE */
- [0x50e, 0x50f], /* CYRILLIC SMALL LETTER KOMI TJE */
- [0x510, 0x511], /* CYRILLIC CAPITAL LETTER REVERSED ZE */
- [0x510, 0x511], /* CYRILLIC SMALL LETTER REVERSED ZE */
- [0x512, 0x513], /* CYRILLIC CAPITAL LETTER EL WITH HOOK */
- [0x512, 0x513], /* CYRILLIC SMALL LETTER EL WITH HOOK */
- [0x514, 0x515], /* CYRILLIC CAPITAL LETTER LHA */
- [0x514, 0x515], /* CYRILLIC SMALL LETTER LHA */
- [0x516, 0x517], /* CYRILLIC CAPITAL LETTER RHA */
- [0x516, 0x517], /* CYRILLIC SMALL LETTER RHA */
- [0x518, 0x519], /* CYRILLIC CAPITAL LETTER YAE */
- [0x518, 0x519], /* CYRILLIC SMALL LETTER YAE */
- [0x51a, 0x51b], /* CYRILLIC CAPITAL LETTER QA */
- [0x51a, 0x51b], /* CYRILLIC SMALL LETTER QA */
- [0x51c, 0x51d], /* CYRILLIC CAPITAL LETTER WE */
- [0x51c, 0x51d], /* CYRILLIC SMALL LETTER WE */
- [0x51e, 0x51f], /* CYRILLIC CAPITAL LETTER ALEUT KA */
- [0x51e, 0x51f], /* CYRILLIC SMALL LETTER ALEUT KA */
- [0x520, 0x521], /* CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK */
- [0x520, 0x521], /* CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK */
- [0x522, 0x523], /* CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK */
- [0x522, 0x523], /* CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK */
- [0x524, 0x525], /* CYRILLIC CAPITAL LETTER PE WITH DESCENDER */
- [0x524, 0x525], /* CYRILLIC SMALL LETTER PE WITH DESCENDER */
- [0x526, 0x527], /* CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER */
- [0x526, 0x527], /* CYRILLIC SMALL LETTER SHHA WITH DESCENDER */
- [0x528, 0x529], /* CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK */
- [0x528, 0x529], /* CYRILLIC SMALL LETTER EN WITH LEFT HOOK */
- [0x52a, 0x52b], /* CYRILLIC CAPITAL LETTER DZZHE */
- [0x52a, 0x52b], /* CYRILLIC SMALL LETTER DZZHE */
- [0x52c, 0x52d], /* CYRILLIC CAPITAL LETTER DCHE */
- [0x52c, 0x52d], /* CYRILLIC SMALL LETTER DCHE */
- [0x52e, 0x52f], /* CYRILLIC CAPITAL LETTER EL WITH DESCENDER */
- [0x52e, 0x52f], /* CYRILLIC SMALL LETTER EL WITH DESCENDER */
- [0x530, 0x530],
- [0x531, 0x561], /* ARMENIAN CAPITAL LETTER AYB */
- [0x532, 0x562], /* ARMENIAN CAPITAL LETTER BEN */
- [0x533, 0x563], /* ARMENIAN CAPITAL LETTER GIM */
- [0x534, 0x564], /* ARMENIAN CAPITAL LETTER DA */
- [0x535, 0x565], /* ARMENIAN CAPITAL LETTER ECH */
- [0x536, 0x566], /* ARMENIAN CAPITAL LETTER ZA */
- [0x537, 0x567], /* ARMENIAN CAPITAL LETTER EH */
- [0x538, 0x568], /* ARMENIAN CAPITAL LETTER ET */
- [0x539, 0x569], /* ARMENIAN CAPITAL LETTER TO */
- [0x53a, 0x56a], /* ARMENIAN CAPITAL LETTER ZHE */
- [0x53b, 0x56b], /* ARMENIAN CAPITAL LETTER INI */
- [0x53c, 0x56c], /* ARMENIAN CAPITAL LETTER LIWN */
- [0x53d, 0x56d], /* ARMENIAN CAPITAL LETTER XEH */
- [0x53e, 0x56e], /* ARMENIAN CAPITAL LETTER CA */
- [0x53f, 0x56f], /* ARMENIAN CAPITAL LETTER KEN */
- [0x540, 0x570], /* ARMENIAN CAPITAL LETTER HO */
- [0x541, 0x571], /* ARMENIAN CAPITAL LETTER JA */
- [0x542, 0x572], /* ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD) */
- [0x543, 0x573], /* ARMENIAN CAPITAL LETTER CHEH */
- [0x544, 0x574], /* ARMENIAN CAPITAL LETTER MEN */
- [0x545, 0x575], /* ARMENIAN CAPITAL LETTER YI */
- [0x546, 0x576], /* ARMENIAN CAPITAL LETTER NOW */
- [0x547, 0x577], /* ARMENIAN CAPITAL LETTER SHA */
- [0x548, 0x578], /* ARMENIAN CAPITAL LETTER VO */
- [0x549, 0x579], /* ARMENIAN CAPITAL LETTER CHA */
- [0x54a, 0x57a], /* ARMENIAN CAPITAL LETTER PEH */
- [0x54b, 0x57b], /* ARMENIAN CAPITAL LETTER JHEH */
- [0x54c, 0x57c], /* ARMENIAN CAPITAL LETTER RA */
- [0x54d, 0x57d], /* ARMENIAN CAPITAL LETTER SEH */
- [0x54e, 0x57e], /* ARMENIAN CAPITAL LETTER VEW */
- [0x54f, 0x57f], /* ARMENIAN CAPITAL LETTER TIWN */
- [0x550, 0x580], /* ARMENIAN CAPITAL LETTER REH */
- [0x551, 0x581], /* ARMENIAN CAPITAL LETTER CO */
- [0x552, 0x582], /* ARMENIAN CAPITAL LETTER YIWN */
- [0x553, 0x583], /* ARMENIAN CAPITAL LETTER PIWR */
- [0x554, 0x584], /* ARMENIAN CAPITAL LETTER KEH */
- [0x555, 0x585], /* ARMENIAN CAPITAL LETTER OH */
- [0x556, 0x586], /* ARMENIAN CAPITAL LETTER FEH */
- [0x557, 0x557],
- [0x558, 0x558],
- [0x559, 0x559], /* ARMENIAN MODIFIER LETTER LEFT HALF RING */
- [0x55a, 0x55a], /* ARMENIAN APOSTROPHE (ARMENIAN MODIFIER LETTER RIGHT HALF RING) */
- [0x55b, 0x55b], /* ARMENIAN EMPHASIS MARK */
- [0x55c, 0x55c], /* ARMENIAN EXCLAMATION MARK */
- [0x55d, 0x55d], /* ARMENIAN COMMA */
- [0x55e, 0x55e], /* ARMENIAN QUESTION MARK */
- [0x55f, 0x55f], /* ARMENIAN ABBREVIATION MARK */
- [0x560, 0x560], /* ARMENIAN SMALL LETTER TURNED AYB */
- [0x531, 0x561], /* ARMENIAN SMALL LETTER AYB */
- [0x532, 0x562], /* ARMENIAN SMALL LETTER BEN */
- [0x533, 0x563], /* ARMENIAN SMALL LETTER GIM */
- [0x534, 0x564], /* ARMENIAN SMALL LETTER DA */
- [0x535, 0x565], /* ARMENIAN SMALL LETTER ECH */
- [0x536, 0x566], /* ARMENIAN SMALL LETTER ZA */
- [0x537, 0x567], /* ARMENIAN SMALL LETTER EH */
- [0x538, 0x568], /* ARMENIAN SMALL LETTER ET */
- [0x539, 0x569], /* ARMENIAN SMALL LETTER TO */
- [0x53a, 0x56a], /* ARMENIAN SMALL LETTER ZHE */
- [0x53b, 0x56b], /* ARMENIAN SMALL LETTER INI */
- [0x53c, 0x56c], /* ARMENIAN SMALL LETTER LIWN */
- [0x53d, 0x56d], /* ARMENIAN SMALL LETTER XEH */
- [0x53e, 0x56e], /* ARMENIAN SMALL LETTER CA */
- [0x53f, 0x56f], /* ARMENIAN SMALL LETTER KEN */
- [0x540, 0x570], /* ARMENIAN SMALL LETTER HO */
- [0x541, 0x571], /* ARMENIAN SMALL LETTER JA */
- [0x542, 0x572], /* ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD) */
- [0x543, 0x573], /* ARMENIAN SMALL LETTER CHEH */
- [0x544, 0x574], /* ARMENIAN SMALL LETTER MEN */
- [0x545, 0x575], /* ARMENIAN SMALL LETTER YI */
- [0x546, 0x576], /* ARMENIAN SMALL LETTER NOW */
- [0x547, 0x577], /* ARMENIAN SMALL LETTER SHA */
- [0x548, 0x578], /* ARMENIAN SMALL LETTER VO */
- [0x549, 0x579], /* ARMENIAN SMALL LETTER CHA */
- [0x54a, 0x57a], /* ARMENIAN SMALL LETTER PEH */
- [0x54b, 0x57b], /* ARMENIAN SMALL LETTER JHEH */
- [0x54c, 0x57c], /* ARMENIAN SMALL LETTER RA */
- [0x54d, 0x57d], /* ARMENIAN SMALL LETTER SEH */
- [0x54e, 0x57e], /* ARMENIAN SMALL LETTER VEW */
- [0x54f, 0x57f], /* ARMENIAN SMALL LETTER TIWN */
- [0x550, 0x580], /* ARMENIAN SMALL LETTER REH */
- [0x551, 0x581], /* ARMENIAN SMALL LETTER CO */
- [0x552, 0x582], /* ARMENIAN SMALL LETTER YIWN */
- [0x553, 0x583], /* ARMENIAN SMALL LETTER PIWR */
- [0x554, 0x584], /* ARMENIAN SMALL LETTER KEH */
- [0x555, 0x585], /* ARMENIAN SMALL LETTER OH */
- [0x556, 0x586], /* ARMENIAN SMALL LETTER FEH */
- [0x587, 0x587], /* ARMENIAN SMALL LIGATURE ECH YIWN */
- [0x588, 0x588], /* ARMENIAN SMALL LETTER YI WITH STROKE */
- [0x589, 0x589], /* ARMENIAN FULL STOP (ARMENIAN PERIOD) */
- [0x58a, 0x58a], /* ARMENIAN HYPHEN */
- [0x58b, 0x58b],
- [0x58c, 0x58c],
- [0x58d, 0x58d], /* RIGHT-FACING ARMENIAN ETERNITY SIGN */
- [0x58e, 0x58e], /* LEFT-FACING ARMENIAN ETERNITY SIGN */
- [0x58f, 0x58f], /* ARMENIAN DRAM SIGN */
- [0x590, 0x590],
- [0x591, 0x591], /* HEBREW ACCENT ETNAHTA */
- [0x592, 0x592], /* HEBREW ACCENT SEGOL */
- [0x593, 0x593], /* HEBREW ACCENT SHALSHELET */
- [0x594, 0x594], /* HEBREW ACCENT ZAQEF QATAN */
- [0x595, 0x595], /* HEBREW ACCENT ZAQEF GADOL */
- [0x596, 0x596], /* HEBREW ACCENT TIPEHA */
- [0x597, 0x597], /* HEBREW ACCENT REVIA */
- [0x598, 0x598], /* HEBREW ACCENT ZARQA */
- [0x599, 0x599], /* HEBREW ACCENT PASHTA */
- [0x59a, 0x59a], /* HEBREW ACCENT YETIV */
- [0x59b, 0x59b], /* HEBREW ACCENT TEVIR */
- [0x59c, 0x59c], /* HEBREW ACCENT GERESH */
- [0x59d, 0x59d], /* HEBREW ACCENT GERESH MUQDAM */
- [0x59e, 0x59e], /* HEBREW ACCENT GERSHAYIM */
- [0x59f, 0x59f], /* HEBREW ACCENT QARNEY PARA */
- [0x5a0, 0x5a0], /* HEBREW ACCENT TELISHA GEDOLA */
- [0x5a1, 0x5a1], /* HEBREW ACCENT PAZER */
- [0x5a2, 0x5a2], /* HEBREW ACCENT ATNAH HAFUKH */
- [0x5a3, 0x5a3], /* HEBREW ACCENT MUNAH */
- [0x5a4, 0x5a4], /* HEBREW ACCENT MAHAPAKH */
- [0x5a5, 0x5a5], /* HEBREW ACCENT MERKHA */
- [0x5a6, 0x5a6], /* HEBREW ACCENT MERKHA KEFULA */
- [0x5a7, 0x5a7], /* HEBREW ACCENT DARGA */
- [0x5a8, 0x5a8], /* HEBREW ACCENT QADMA */
- [0x5a9, 0x5a9], /* HEBREW ACCENT TELISHA QETANA */
- [0x5aa, 0x5aa], /* HEBREW ACCENT YERAH BEN YOMO */
- [0x5ab, 0x5ab], /* HEBREW ACCENT OLE */
- [0x5ac, 0x5ac], /* HEBREW ACCENT ILUY */
- [0x5ad, 0x5ad], /* HEBREW ACCENT DEHI */
- [0x5ae, 0x5ae], /* HEBREW ACCENT ZINOR */
- [0x5af, 0x5af], /* HEBREW MARK MASORA CIRCLE */
- [0x5b0, 0x5b0], /* HEBREW POINT SHEVA */
- [0x5b1, 0x5b1], /* HEBREW POINT HATAF SEGOL */
- [0x5b2, 0x5b2], /* HEBREW POINT HATAF PATAH */
- [0x5b3, 0x5b3], /* HEBREW POINT HATAF QAMATS */
- [0x5b4, 0x5b4], /* HEBREW POINT HIRIQ */
- [0x5b5, 0x5b5], /* HEBREW POINT TSERE */
- [0x5b6, 0x5b6], /* HEBREW POINT SEGOL */
- [0x5b7, 0x5b7], /* HEBREW POINT PATAH */
- [0x5b8, 0x5b8], /* HEBREW POINT QAMATS */
- [0x5b9, 0x5b9], /* HEBREW POINT HOLAM */
- [0x5ba, 0x5ba], /* HEBREW POINT HOLAM HASER FOR VAV */
- [0x5bb, 0x5bb], /* HEBREW POINT QUBUTS */
- [0x5bc, 0x5bc], /* HEBREW POINT DAGESH OR MAPIQ (HEBREW POINT DAGESH) */
- [0x5bd, 0x5bd], /* HEBREW POINT METEG */
- [0x5be, 0x5be], /* HEBREW PUNCTUATION MAQAF */
- [0x5bf, 0x5bf], /* HEBREW POINT RAFE */
- [0x5c0, 0x5c0], /* HEBREW PUNCTUATION PASEQ (HEBREW POINT PASEQ) */
- [0x5c1, 0x5c1], /* HEBREW POINT SHIN DOT */
- [0x5c2, 0x5c2], /* HEBREW POINT SIN DOT */
- [0x5c3, 0x5c3], /* HEBREW PUNCTUATION SOF PASUQ */
- [0x5c4, 0x5c4], /* HEBREW MARK UPPER DOT */
- [0x5c5, 0x5c5], /* HEBREW MARK LOWER DOT */
- [0x5c6, 0x5c6], /* HEBREW PUNCTUATION NUN HAFUKHA */
- [0x5c7, 0x5c7], /* HEBREW POINT QAMATS QATAN */
- [0x5c8, 0x5c8],
- [0x5c9, 0x5c9],
- [0x5ca, 0x5ca],
- [0x5cb, 0x5cb],
- [0x5cc, 0x5cc],
- [0x5cd, 0x5cd],
- [0x5ce, 0x5ce],
- [0x5cf, 0x5cf],
- [0x5d0, 0x5d0], /* HEBREW LETTER ALEF */
- [0x5d1, 0x5d1], /* HEBREW LETTER BET */
- [0x5d2, 0x5d2], /* HEBREW LETTER GIMEL */
- [0x5d3, 0x5d3], /* HEBREW LETTER DALET */
- [0x5d4, 0x5d4], /* HEBREW LETTER HE */
- [0x5d5, 0x5d5], /* HEBREW LETTER VAV */
- [0x5d6, 0x5d6], /* HEBREW LETTER ZAYIN */
- [0x5d7, 0x5d7], /* HEBREW LETTER HET */
- [0x5d8, 0x5d8], /* HEBREW LETTER TET */
- [0x5d9, 0x5d9], /* HEBREW LETTER YOD */
- [0x5da, 0x5da], /* HEBREW LETTER FINAL KAF */
- [0x5db, 0x5db], /* HEBREW LETTER KAF */
- [0x5dc, 0x5dc], /* HEBREW LETTER LAMED */
- [0x5dd, 0x5dd], /* HEBREW LETTER FINAL MEM */
- [0x5de, 0x5de], /* HEBREW LETTER MEM */
- [0x5df, 0x5df], /* HEBREW LETTER FINAL NUN */
- [0x5e0, 0x5e0], /* HEBREW LETTER NUN */
- [0x5e1, 0x5e1], /* HEBREW LETTER SAMEKH */
- [0x5e2, 0x5e2], /* HEBREW LETTER AYIN */
- [0x5e3, 0x5e3], /* HEBREW LETTER FINAL PE */
- [0x5e4, 0x5e4], /* HEBREW LETTER PE */
- [0x5e5, 0x5e5], /* HEBREW LETTER FINAL TSADI */
- [0x5e6, 0x5e6], /* HEBREW LETTER TSADI */
- [0x5e7, 0x5e7], /* HEBREW LETTER QOF */
- [0x5e8, 0x5e8], /* HEBREW LETTER RESH */
- [0x5e9, 0x5e9], /* HEBREW LETTER SHIN */
- [0x5ea, 0x5ea], /* HEBREW LETTER TAV */
- [0x5eb, 0x5eb],
- [0x5ec, 0x5ec],
- [0x5ed, 0x5ed],
- [0x5ee, 0x5ee],
- [0x5ef, 0x5ef], /* HEBREW YOD TRIANGLE */
- [0x5f0, 0x5f0], /* HEBREW LIGATURE YIDDISH DOUBLE VAV (HEBREW LETTER DOUBLE VAV) */
- [0x5f1, 0x5f1], /* HEBREW LIGATURE YIDDISH VAV YOD (HEBREW LETTER VAV YOD) */
- [0x5f2, 0x5f2], /* HEBREW LIGATURE YIDDISH DOUBLE YOD (HEBREW LETTER DOUBLE YOD) */
- [0x5f3, 0x5f3], /* HEBREW PUNCTUATION GERESH */
- [0x5f4, 0x5f4], /* HEBREW PUNCTUATION GERSHAYIM */
- [0x5f5, 0x5f5],
- [0x5f6, 0x5f6],
- [0x5f7, 0x5f7],
- [0x5f8, 0x5f8],
- [0x5f9, 0x5f9],
- [0x5fa, 0x5fa],
- [0x5fb, 0x5fb],
- [0x5fc, 0x5fc],
- [0x5fd, 0x5fd],
- [0x5fe, 0x5fe],
- [0x5ff, 0x5ff],
- [0x600, 0x600], /* ARABIC NUMBER SIGN */
- [0x601, 0x601], /* ARABIC SIGN SANAH */
- [0x602, 0x602], /* ARABIC FOOTNOTE MARKER */
- [0x603, 0x603], /* ARABIC SIGN SAFHA */
- [0x604, 0x604], /* ARABIC SIGN SAMVAT */
- [0x605, 0x605], /* ARABIC NUMBER MARK ABOVE */
- [0x606, 0x606], /* ARABIC-INDIC CUBE ROOT */
- [0x607, 0x607], /* ARABIC-INDIC FOURTH ROOT */
- [0x608, 0x608], /* ARABIC RAY */
- [0x609, 0x609], /* ARABIC-INDIC PER MILLE SIGN */
- [0x60a, 0x60a], /* ARABIC-INDIC PER TEN THOUSAND SIGN */
- [0x60b, 0x60b], /* AFGHANI SIGN */
- [0x60c, 0x60c], /* ARABIC COMMA */
- [0x60d, 0x60d], /* ARABIC DATE SEPARATOR */
- [0x60e, 0x60e], /* ARABIC POETIC VERSE SIGN */
- [0x60f, 0x60f], /* ARABIC SIGN MISRA */
- [0x610, 0x610], /* ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM */
- [0x611, 0x611], /* ARABIC SIGN ALAYHE ASSALLAM */
- [0x612, 0x612], /* ARABIC SIGN RAHMATULLAH ALAYHE */
- [0x613, 0x613], /* ARABIC SIGN RADI ALLAHOU ANHU */
- [0x614, 0x614], /* ARABIC SIGN TAKHALLUS */
- [0x615, 0x615], /* ARABIC SMALL HIGH TAH */
- [0x616, 0x616], /* ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH */
- [0x617, 0x617], /* ARABIC SMALL HIGH ZAIN */
- [0x618, 0x618], /* ARABIC SMALL FATHA */
- [0x619, 0x619], /* ARABIC SMALL DAMMA */
- [0x61a, 0x61a], /* ARABIC SMALL KASRA */
- [0x61b, 0x61b], /* ARABIC SEMICOLON */
- [0x61c, 0x61c], /* ARABIC LETTER MARK */
- [0x61d, 0x61d],
- [0x61e, 0x61e], /* ARABIC TRIPLE DOT PUNCTUATION MARK */
- [0x61f, 0x61f], /* ARABIC QUESTION MARK */
- [0x620, 0x620], /* ARABIC LETTER KASHMIRI YEH */
- [0x621, 0x621], /* ARABIC LETTER HAMZA (ARABIC LETTER HAMZAH) */
- [0x622, 0x622], /* ARABIC LETTER ALEF WITH MADDA ABOVE (ARABIC LETTER MADDAH ON ALEF) */
- [0x623, 0x623], /* ARABIC LETTER ALEF WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON ALEF) */
- [0x624, 0x624], /* ARABIC LETTER WAW WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON WAW) */
- [0x625, 0x625], /* ARABIC LETTER ALEF WITH HAMZA BELOW (ARABIC LETTER HAMZAH UNDER ALEF) */
- [0x626, 0x626], /* ARABIC LETTER YEH WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON YA) */
- [0x627, 0x627], /* ARABIC LETTER ALEF */
- [0x628, 0x628], /* ARABIC LETTER BEH (ARABIC LETTER BAA) */
- [0x629, 0x629], /* ARABIC LETTER TEH MARBUTA (ARABIC LETTER TAA MARBUTAH) */
- [0x62a, 0x62a], /* ARABIC LETTER TEH (ARABIC LETTER TAA) */
- [0x62b, 0x62b], /* ARABIC LETTER THEH (ARABIC LETTER THAA) */
- [0x62c, 0x62c], /* ARABIC LETTER JEEM */
- [0x62d, 0x62d], /* ARABIC LETTER HAH (ARABIC LETTER HAA) */
- [0x62e, 0x62e], /* ARABIC LETTER KHAH (ARABIC LETTER KHAA) */
- [0x62f, 0x62f], /* ARABIC LETTER DAL */
- [0x630, 0x630], /* ARABIC LETTER THAL */
- [0x631, 0x631], /* ARABIC LETTER REH (ARABIC LETTER RA) */
- [0x632, 0x632], /* ARABIC LETTER ZAIN */
- [0x633, 0x633], /* ARABIC LETTER SEEN */
- [0x634, 0x634], /* ARABIC LETTER SHEEN */
- [0x635, 0x635], /* ARABIC LETTER SAD */
- [0x636, 0x636], /* ARABIC LETTER DAD */
- [0x637, 0x637], /* ARABIC LETTER TAH */
- [0x638, 0x638], /* ARABIC LETTER ZAH (ARABIC LETTER DHAH) */
- [0x639, 0x639], /* ARABIC LETTER AIN */
- [0x63a, 0x63a], /* ARABIC LETTER GHAIN */
- [0x63b, 0x63b], /* ARABIC LETTER KEHEH WITH TWO DOTS ABOVE */
- [0x63c, 0x63c], /* ARABIC LETTER KEHEH WITH THREE DOTS BELOW */
- [0x63d, 0x63d], /* ARABIC LETTER FARSI YEH WITH INVERTED V */
- [0x63e, 0x63e], /* ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE */
- [0x63f, 0x63f], /* ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE */
- [0x640, 0x640], /* ARABIC TATWEEL */
- [0x641, 0x641], /* ARABIC LETTER FEH (ARABIC LETTER FA) */
- [0x642, 0x642], /* ARABIC LETTER QAF */
- [0x643, 0x643], /* ARABIC LETTER KAF (ARABIC LETTER CAF) */
- [0x644, 0x644], /* ARABIC LETTER LAM */
- [0x645, 0x645], /* ARABIC LETTER MEEM */
- [0x646, 0x646], /* ARABIC LETTER NOON */
- [0x647, 0x647], /* ARABIC LETTER HEH (ARABIC LETTER HA) */
- [0x648, 0x648], /* ARABIC LETTER WAW */
- [0x649, 0x649], /* ARABIC LETTER ALEF MAKSURA (ARABIC LETTER ALEF MAQSURAH) */
- [0x64a, 0x64a], /* ARABIC LETTER YEH (ARABIC LETTER YA) */
- [0x64b, 0x64b], /* ARABIC FATHATAN */
- [0x64c, 0x64c], /* ARABIC DAMMATAN */
- [0x64d, 0x64d], /* ARABIC KASRATAN */
- [0x64e, 0x64e], /* ARABIC FATHA (ARABIC FATHAH) */
- [0x64f, 0x64f], /* ARABIC DAMMA (ARABIC DAMMAH) */
- [0x650, 0x650], /* ARABIC KASRA (ARABIC KASRAH) */
- [0x651, 0x651], /* ARABIC SHADDA (ARABIC SHADDAH) */
- [0x652, 0x652], /* ARABIC SUKUN */
- [0x653, 0x653], /* ARABIC MADDAH ABOVE */
- [0x654, 0x654], /* ARABIC HAMZA ABOVE */
- [0x655, 0x655], /* ARABIC HAMZA BELOW */
- [0x656, 0x656], /* ARABIC SUBSCRIPT ALEF */
- [0x657, 0x657], /* ARABIC INVERTED DAMMA */
- [0x658, 0x658], /* ARABIC MARK NOON GHUNNA */
- [0x659, 0x659], /* ARABIC ZWARAKAY */
- [0x65a, 0x65a], /* ARABIC VOWEL SIGN SMALL V ABOVE */
- [0x65b, 0x65b], /* ARABIC VOWEL SIGN INVERTED SMALL V ABOVE */
- [0x65c, 0x65c], /* ARABIC VOWEL SIGN DOT BELOW */
- [0x65d, 0x65d], /* ARABIC REVERSED DAMMA */
- [0x65e, 0x65e], /* ARABIC FATHA WITH TWO DOTS */
- [0x65f, 0x65f], /* ARABIC WAVY HAMZA BELOW */
- [0x660, 0x660], /* ARABIC-INDIC DIGIT ZERO */
- [0x661, 0x661], /* ARABIC-INDIC DIGIT ONE */
- [0x662, 0x662], /* ARABIC-INDIC DIGIT TWO */
- [0x663, 0x663], /* ARABIC-INDIC DIGIT THREE */
- [0x664, 0x664], /* ARABIC-INDIC DIGIT FOUR */
- [0x665, 0x665], /* ARABIC-INDIC DIGIT FIVE */
- [0x666, 0x666], /* ARABIC-INDIC DIGIT SIX */
- [0x667, 0x667], /* ARABIC-INDIC DIGIT SEVEN */
- [0x668, 0x668], /* ARABIC-INDIC DIGIT EIGHT */
- [0x669, 0x669], /* ARABIC-INDIC DIGIT NINE */
- [0x66a, 0x66a], /* ARABIC PERCENT SIGN */
- [0x66b, 0x66b], /* ARABIC DECIMAL SEPARATOR */
- [0x66c, 0x66c], /* ARABIC THOUSANDS SEPARATOR */
- [0x66d, 0x66d], /* ARABIC FIVE POINTED STAR */
- [0x66e, 0x66e], /* ARABIC LETTER DOTLESS BEH */
- [0x66f, 0x66f], /* ARABIC LETTER DOTLESS QAF */
- [0x670, 0x670], /* ARABIC LETTER SUPERSCRIPT ALEF (ARABIC ALEF ABOVE) */
- [0x671, 0x671], /* ARABIC LETTER ALEF WASLA (ARABIC LETTER HAMZAT WASL ON ALEF) */
- [0x672, 0x672], /* ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE (ARABIC LETTER WAVY HAMZAH ON ALEF) */
- [0x673, 0x673], /* ARABIC LETTER ALEF WITH WAVY HAMZA BELOW (ARABIC LETTER WAVY HAMZAH UNDER ALEF) */
- [0x674, 0x674], /* ARABIC LETTER HIGH HAMZA (ARABIC LETTER HIGH HAMZAH) */
- [0x675, 0x675], /* ARABIC LETTER HIGH HAMZA ALEF (ARABIC LETTER HIGH HAMZAH ALEF) */
- [0x676, 0x676], /* ARABIC LETTER HIGH HAMZA WAW (ARABIC LETTER HIGH HAMZAH WAW) */
- [0x677, 0x677], /* ARABIC LETTER U WITH HAMZA ABOVE (ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH) */
- [0x678, 0x678], /* ARABIC LETTER HIGH HAMZA YEH (ARABIC LETTER HIGH HAMZAH YA) */
- [0x679, 0x679], /* ARABIC LETTER TTEH (ARABIC LETTER TAA WITH SMALL TAH) */
- [0x67a, 0x67a], /* ARABIC LETTER TTEHEH (ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE) */
- [0x67b, 0x67b], /* ARABIC LETTER BEEH (ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW) */
- [0x67c, 0x67c], /* ARABIC LETTER TEH WITH RING (ARABIC LETTER TAA WITH RING) */
- [0x67d, 0x67d], /* ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS (ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD) */
- [0x67e, 0x67e], /* ARABIC LETTER PEH (ARABIC LETTER TAA WITH THREE DOTS BELOW) */
- [0x67f, 0x67f], /* ARABIC LETTER TEHEH (ARABIC LETTER TAA WITH FOUR DOTS ABOVE) */
- [0x680, 0x680], /* ARABIC LETTER BEHEH (ARABIC LETTER BAA WITH FOUR DOTS BELOW) */
- [0x681, 0x681], /* ARABIC LETTER HAH WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON HAA) */
- [0x682, 0x682], /* ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE (ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE) */
- [0x683, 0x683], /* ARABIC LETTER NYEH (ARABIC LETTER HAA WITH MIDDLE TWO DOTS) */
- [0x684, 0x684], /* ARABIC LETTER DYEH (ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL) */
- [0x685, 0x685], /* ARABIC LETTER HAH WITH THREE DOTS ABOVE (ARABIC LETTER HAA WITH THREE DOTS ABOVE) */
- [0x686, 0x686], /* ARABIC LETTER TCHEH (ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD) */
- [0x687, 0x687], /* ARABIC LETTER TCHEHEH (ARABIC LETTER HAA WITH MIDDLE FOUR DOTS) */
- [0x688, 0x688], /* ARABIC LETTER DDAL (ARABIC LETTER DAL WITH SMALL TAH) */
- [0x689, 0x689], /* ARABIC LETTER DAL WITH RING */
- [0x68a, 0x68a], /* ARABIC LETTER DAL WITH DOT BELOW */
- [0x68b, 0x68b], /* ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH */
- [0x68c, 0x68c], /* ARABIC LETTER DAHAL (ARABIC LETTER DAL WITH TWO DOTS ABOVE) */
- [0x68d, 0x68d], /* ARABIC LETTER DDAHAL (ARABIC LETTER DAL WITH TWO DOTS BELOW) */
- [0x68e, 0x68e], /* ARABIC LETTER DUL (ARABIC LETTER DAL WITH THREE DOTS ABOVE) */
- [0x68f, 0x68f], /* ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS (ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD) */
- [0x690, 0x690], /* ARABIC LETTER DAL WITH FOUR DOTS ABOVE */
- [0x691, 0x691], /* ARABIC LETTER RREH (ARABIC LETTER RA WITH SMALL TAH) */
- [0x692, 0x692], /* ARABIC LETTER REH WITH SMALL V (ARABIC LETTER RA WITH SMALL V) */
- [0x693, 0x693], /* ARABIC LETTER REH WITH RING (ARABIC LETTER RA WITH RING) */
- [0x694, 0x694], /* ARABIC LETTER REH WITH DOT BELOW (ARABIC LETTER RA WITH DOT BELOW) */
- [0x695, 0x695], /* ARABIC LETTER REH WITH SMALL V BELOW (ARABIC LETTER RA WITH SMALL V BELOW) */
- [0x696, 0x696], /* ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE (ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE) */
- [0x697, 0x697], /* ARABIC LETTER REH WITH TWO DOTS ABOVE (ARABIC LETTER RA WITH TWO DOTS ABOVE) */
- [0x698, 0x698], /* ARABIC LETTER JEH (ARABIC LETTER RA WITH THREE DOTS ABOVE) */
- [0x699, 0x699], /* ARABIC LETTER REH WITH FOUR DOTS ABOVE (ARABIC LETTER RA WITH FOUR DOTS ABOVE) */
- [0x69a, 0x69a], /* ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE */
- [0x69b, 0x69b], /* ARABIC LETTER SEEN WITH THREE DOTS BELOW */
- [0x69c, 0x69c], /* ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE */
- [0x69d, 0x69d], /* ARABIC LETTER SAD WITH TWO DOTS BELOW */
- [0x69e, 0x69e], /* ARABIC LETTER SAD WITH THREE DOTS ABOVE */
- [0x69f, 0x69f], /* ARABIC LETTER TAH WITH THREE DOTS ABOVE */
- [0x6a0, 0x6a0], /* ARABIC LETTER AIN WITH THREE DOTS ABOVE */
- [0x6a1, 0x6a1], /* ARABIC LETTER DOTLESS FEH (ARABIC LETTER DOTLESS FA) */
- [0x6a2, 0x6a2], /* ARABIC LETTER FEH WITH DOT MOVED BELOW (ARABIC LETTER FA WITH DOT MOVED BELOW) */
- [0x6a3, 0x6a3], /* ARABIC LETTER FEH WITH DOT BELOW (ARABIC LETTER FA WITH DOT BELOW) */
- [0x6a4, 0x6a4], /* ARABIC LETTER VEH (ARABIC LETTER FA WITH THREE DOTS ABOVE) */
- [0x6a5, 0x6a5], /* ARABIC LETTER FEH WITH THREE DOTS BELOW (ARABIC LETTER FA WITH THREE DOTS BELOW) */
- [0x6a6, 0x6a6], /* ARABIC LETTER PEHEH (ARABIC LETTER FA WITH FOUR DOTS ABOVE) */
- [0x6a7, 0x6a7], /* ARABIC LETTER QAF WITH DOT ABOVE */
- [0x6a8, 0x6a8], /* ARABIC LETTER QAF WITH THREE DOTS ABOVE */
- [0x6a9, 0x6a9], /* ARABIC LETTER KEHEH (ARABIC LETTER OPEN CAF) */
- [0x6aa, 0x6aa], /* ARABIC LETTER SWASH KAF (ARABIC LETTER SWASH CAF) */
- [0x6ab, 0x6ab], /* ARABIC LETTER KAF WITH RING (ARABIC LETTER CAF WITH RING) */
- [0x6ac, 0x6ac], /* ARABIC LETTER KAF WITH DOT ABOVE (ARABIC LETTER CAF WITH DOT ABOVE) */
- [0x6ad, 0x6ad], /* ARABIC LETTER NG (ARABIC LETTER CAF WITH THREE DOTS ABOVE) */
- [0x6ae, 0x6ae], /* ARABIC LETTER KAF WITH THREE DOTS BELOW (ARABIC LETTER CAF WITH THREE DOTS BELOW) */
- [0x6af, 0x6af], /* ARABIC LETTER GAF */
- [0x6b0, 0x6b0], /* ARABIC LETTER GAF WITH RING */
- [0x6b1, 0x6b1], /* ARABIC LETTER NGOEH (ARABIC LETTER GAF WITH TWO DOTS ABOVE) */
- [0x6b2, 0x6b2], /* ARABIC LETTER GAF WITH TWO DOTS BELOW */
- [0x6b3, 0x6b3], /* ARABIC LETTER GUEH (ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW) */
- [0x6b4, 0x6b4], /* ARABIC LETTER GAF WITH THREE DOTS ABOVE */
- [0x6b5, 0x6b5], /* ARABIC LETTER LAM WITH SMALL V */
- [0x6b6, 0x6b6], /* ARABIC LETTER LAM WITH DOT ABOVE */
- [0x6b7, 0x6b7], /* ARABIC LETTER LAM WITH THREE DOTS ABOVE */
- [0x6b8, 0x6b8], /* ARABIC LETTER LAM WITH THREE DOTS BELOW */
- [0x6b9, 0x6b9], /* ARABIC LETTER NOON WITH DOT BELOW */
- [0x6ba, 0x6ba], /* ARABIC LETTER NOON GHUNNA (ARABIC LETTER DOTLESS NOON) */
- [0x6bb, 0x6bb], /* ARABIC LETTER RNOON (ARABIC LETTER DOTLESS NOON WITH SMALL TAH) */
- [0x6bc, 0x6bc], /* ARABIC LETTER NOON WITH RING */
- [0x6bd, 0x6bd], /* ARABIC LETTER NOON WITH THREE DOTS ABOVE */
- [0x6be, 0x6be], /* ARABIC LETTER HEH DOACHASHMEE (ARABIC LETTER KNOTTED HA) */
- [0x6bf, 0x6bf], /* ARABIC LETTER TCHEH WITH DOT ABOVE */
- [0x6c0, 0x6c0], /* ARABIC LETTER HEH WITH YEH ABOVE (ARABIC LETTER HAMZAH ON HA) */
- [0x6c1, 0x6c1], /* ARABIC LETTER HEH GOAL (ARABIC LETTER HA GOAL) */
- [0x6c2, 0x6c2], /* ARABIC LETTER HEH GOAL WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON HA GOAL) */
- [0x6c3, 0x6c3], /* ARABIC LETTER TEH MARBUTA GOAL (ARABIC LETTER TAA MARBUTAH GOAL) */
- [0x6c4, 0x6c4], /* ARABIC LETTER WAW WITH RING */
- [0x6c5, 0x6c5], /* ARABIC LETTER KIRGHIZ OE (ARABIC LETTER WAW WITH BAR) */
- [0x6c6, 0x6c6], /* ARABIC LETTER OE (ARABIC LETTER WAW WITH SMALL V) */
- [0x6c7, 0x6c7], /* ARABIC LETTER U (ARABIC LETTER WAW WITH DAMMAH) */
- [0x6c8, 0x6c8], /* ARABIC LETTER YU (ARABIC LETTER WAW WITH ALEF ABOVE) */
- [0x6c9, 0x6c9], /* ARABIC LETTER KIRGHIZ YU (ARABIC LETTER WAW WITH INVERTED SMALL V) */
- [0x6ca, 0x6ca], /* ARABIC LETTER WAW WITH TWO DOTS ABOVE */
- [0x6cb, 0x6cb], /* ARABIC LETTER VE (ARABIC LETTER WAW WITH THREE DOTS ABOVE) */
- [0x6cc, 0x6cc], /* ARABIC LETTER FARSI YEH (ARABIC LETTER DOTLESS YA) */
- [0x6cd, 0x6cd], /* ARABIC LETTER YEH WITH TAIL (ARABIC LETTER YA WITH TAIL) */
- [0x6ce, 0x6ce], /* ARABIC LETTER YEH WITH SMALL V (ARABIC LETTER YA WITH SMALL V) */
- [0x6cf, 0x6cf], /* ARABIC LETTER WAW WITH DOT ABOVE */
- [0x6d0, 0x6d0], /* ARABIC LETTER E (ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW) */
- [0x6d1, 0x6d1], /* ARABIC LETTER YEH WITH THREE DOTS BELOW (ARABIC LETTER YA WITH THREE DOTS BELOW) */
- [0x6d2, 0x6d2], /* ARABIC LETTER YEH BARREE (ARABIC LETTER YA BARREE) */
- [0x6d3, 0x6d3], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON YA BARREE) */
- [0x6d4, 0x6d4], /* ARABIC FULL STOP (ARABIC PERIOD) */
- [0x6d5, 0x6d5], /* ARABIC LETTER AE */
- [0x6d6, 0x6d6], /* ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA */
- [0x6d7, 0x6d7], /* ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA */
- [0x6d8, 0x6d8], /* ARABIC SMALL HIGH MEEM INITIAL FORM */
- [0x6d9, 0x6d9], /* ARABIC SMALL HIGH LAM ALEF */
- [0x6da, 0x6da], /* ARABIC SMALL HIGH JEEM */
- [0x6db, 0x6db], /* ARABIC SMALL HIGH THREE DOTS */
- [0x6dc, 0x6dc], /* ARABIC SMALL HIGH SEEN */
- [0x6dd, 0x6dd], /* ARABIC END OF AYAH */
- [0x6de, 0x6de], /* ARABIC START OF RUB EL HIZB */
- [0x6df, 0x6df], /* ARABIC SMALL HIGH ROUNDED ZERO */
- [0x6e0, 0x6e0], /* ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO */
- [0x6e1, 0x6e1], /* ARABIC SMALL HIGH DOTLESS HEAD OF KHAH */
- [0x6e2, 0x6e2], /* ARABIC SMALL HIGH MEEM ISOLATED FORM */
- [0x6e3, 0x6e3], /* ARABIC SMALL LOW SEEN */
- [0x6e4, 0x6e4], /* ARABIC SMALL HIGH MADDA */
- [0x6e5, 0x6e5], /* ARABIC SMALL WAW */
- [0x6e6, 0x6e6], /* ARABIC SMALL YEH */
- [0x6e7, 0x6e7], /* ARABIC SMALL HIGH YEH */
- [0x6e8, 0x6e8], /* ARABIC SMALL HIGH NOON */
- [0x6e9, 0x6e9], /* ARABIC PLACE OF SAJDAH */
- [0x6ea, 0x6ea], /* ARABIC EMPTY CENTRE LOW STOP */
- [0x6eb, 0x6eb], /* ARABIC EMPTY CENTRE HIGH STOP */
- [0x6ec, 0x6ec], /* ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE */
- [0x6ed, 0x6ed], /* ARABIC SMALL LOW MEEM */
- [0x6ee, 0x6ee], /* ARABIC LETTER DAL WITH INVERTED V */
- [0x6ef, 0x6ef], /* ARABIC LETTER REH WITH INVERTED V */
- [0x6f0, 0x6f0], /* EXTENDED ARABIC-INDIC DIGIT ZERO (EASTERN ARABIC-INDIC DIGIT ZERO) */
- [0x6f1, 0x6f1], /* EXTENDED ARABIC-INDIC DIGIT ONE (EASTERN ARABIC-INDIC DIGIT ONE) */
- [0x6f2, 0x6f2], /* EXTENDED ARABIC-INDIC DIGIT TWO (EASTERN ARABIC-INDIC DIGIT TWO) */
- [0x6f3, 0x6f3], /* EXTENDED ARABIC-INDIC DIGIT THREE (EASTERN ARABIC-INDIC DIGIT THREE) */
- [0x6f4, 0x6f4], /* EXTENDED ARABIC-INDIC DIGIT FOUR (EASTERN ARABIC-INDIC DIGIT FOUR) */
- [0x6f5, 0x6f5], /* EXTENDED ARABIC-INDIC DIGIT FIVE (EASTERN ARABIC-INDIC DIGIT FIVE) */
- [0x6f6, 0x6f6], /* EXTENDED ARABIC-INDIC DIGIT SIX (EASTERN ARABIC-INDIC DIGIT SIX) */
- [0x6f7, 0x6f7], /* EXTENDED ARABIC-INDIC DIGIT SEVEN (EASTERN ARABIC-INDIC DIGIT SEVEN) */
- [0x6f8, 0x6f8], /* EXTENDED ARABIC-INDIC DIGIT EIGHT (EASTERN ARABIC-INDIC DIGIT EIGHT) */
- [0x6f9, 0x6f9], /* EXTENDED ARABIC-INDIC DIGIT NINE (EASTERN ARABIC-INDIC DIGIT NINE) */
- [0x6fa, 0x6fa], /* ARABIC LETTER SHEEN WITH DOT BELOW */
- [0x6fb, 0x6fb], /* ARABIC LETTER DAD WITH DOT BELOW */
- [0x6fc, 0x6fc], /* ARABIC LETTER GHAIN WITH DOT BELOW */
- [0x6fd, 0x6fd], /* ARABIC SIGN SINDHI AMPERSAND */
- [0x6fe, 0x6fe], /* ARABIC SIGN SINDHI POSTPOSITION MEN */
- [0x6ff, 0x6ff], /* ARABIC LETTER HEH WITH INVERTED V */
- [0x700, 0x700], /* SYRIAC END OF PARAGRAPH */
- [0x701, 0x701], /* SYRIAC SUPRALINEAR FULL STOP */
- [0x702, 0x702], /* SYRIAC SUBLINEAR FULL STOP */
- [0x703, 0x703], /* SYRIAC SUPRALINEAR COLON */
- [0x704, 0x704], /* SYRIAC SUBLINEAR COLON */
- [0x705, 0x705], /* SYRIAC HORIZONTAL COLON */
- [0x706, 0x706], /* SYRIAC COLON SKEWED LEFT */
- [0x707, 0x707], /* SYRIAC COLON SKEWED RIGHT */
- [0x708, 0x708], /* SYRIAC SUPRALINEAR COLON SKEWED LEFT */
- [0x709, 0x709], /* SYRIAC SUBLINEAR COLON SKEWED RIGHT */
- [0x70a, 0x70a], /* SYRIAC CONTRACTION */
- [0x70b, 0x70b], /* SYRIAC HARKLEAN OBELUS */
- [0x70c, 0x70c], /* SYRIAC HARKLEAN METOBELUS */
- [0x70d, 0x70d], /* SYRIAC HARKLEAN ASTERISCUS */
- [0x70e, 0x70e],
- [0x70f, 0x70f], /* SYRIAC ABBREVIATION MARK */
- [0x710, 0x710], /* SYRIAC LETTER ALAPH */
- [0x711, 0x711], /* SYRIAC LETTER SUPERSCRIPT ALAPH */
- [0x712, 0x712], /* SYRIAC LETTER BETH */
- [0x713, 0x713], /* SYRIAC LETTER GAMAL */
- [0x714, 0x714], /* SYRIAC LETTER GAMAL GARSHUNI */
- [0x715, 0x715], /* SYRIAC LETTER DALATH */
- [0x716, 0x716], /* SYRIAC LETTER DOTLESS DALATH RISH */
- [0x717, 0x717], /* SYRIAC LETTER HE */
- [0x718, 0x718], /* SYRIAC LETTER WAW */
- [0x719, 0x719], /* SYRIAC LETTER ZAIN */
- [0x71a, 0x71a], /* SYRIAC LETTER HETH */
- [0x71b, 0x71b], /* SYRIAC LETTER TETH */
- [0x71c, 0x71c], /* SYRIAC LETTER TETH GARSHUNI */
- [0x71d, 0x71d], /* SYRIAC LETTER YUDH */
- [0x71e, 0x71e], /* SYRIAC LETTER YUDH HE */
- [0x71f, 0x71f], /* SYRIAC LETTER KAPH */
- [0x720, 0x720], /* SYRIAC LETTER LAMADH */
- [0x721, 0x721], /* SYRIAC LETTER MIM */
- [0x722, 0x722], /* SYRIAC LETTER NUN */
- [0x723, 0x723], /* SYRIAC LETTER SEMKATH */
- [0x724, 0x724], /* SYRIAC LETTER FINAL SEMKATH */
- [0x725, 0x725], /* SYRIAC LETTER E */
- [0x726, 0x726], /* SYRIAC LETTER PE */
- [0x727, 0x727], /* SYRIAC LETTER REVERSED PE */
- [0x728, 0x728], /* SYRIAC LETTER SADHE */
- [0x729, 0x729], /* SYRIAC LETTER QAPH */
- [0x72a, 0x72a], /* SYRIAC LETTER RISH */
- [0x72b, 0x72b], /* SYRIAC LETTER SHIN */
- [0x72c, 0x72c], /* SYRIAC LETTER TAW */
- [0x72d, 0x72d], /* SYRIAC LETTER PERSIAN BHETH */
- [0x72e, 0x72e], /* SYRIAC LETTER PERSIAN GHAMAL */
- [0x72f, 0x72f], /* SYRIAC LETTER PERSIAN DHALATH */
- [0x730, 0x730], /* SYRIAC PTHAHA ABOVE */
- [0x731, 0x731], /* SYRIAC PTHAHA BELOW */
- [0x732, 0x732], /* SYRIAC PTHAHA DOTTED */
- [0x733, 0x733], /* SYRIAC ZQAPHA ABOVE */
- [0x734, 0x734], /* SYRIAC ZQAPHA BELOW */
- [0x735, 0x735], /* SYRIAC ZQAPHA DOTTED */
- [0x736, 0x736], /* SYRIAC RBASA ABOVE */
- [0x737, 0x737], /* SYRIAC RBASA BELOW */
- [0x738, 0x738], /* SYRIAC DOTTED ZLAMA HORIZONTAL */
- [0x739, 0x739], /* SYRIAC DOTTED ZLAMA ANGULAR */
- [0x73a, 0x73a], /* SYRIAC HBASA ABOVE */
- [0x73b, 0x73b], /* SYRIAC HBASA BELOW */
- [0x73c, 0x73c], /* SYRIAC HBASA-ESASA DOTTED */
- [0x73d, 0x73d], /* SYRIAC ESASA ABOVE */
- [0x73e, 0x73e], /* SYRIAC ESASA BELOW */
- [0x73f, 0x73f], /* SYRIAC RWAHA */
- [0x740, 0x740], /* SYRIAC FEMININE DOT */
- [0x741, 0x741], /* SYRIAC QUSHSHAYA */
- [0x742, 0x742], /* SYRIAC RUKKAKHA */
- [0x743, 0x743], /* SYRIAC TWO VERTICAL DOTS ABOVE */
- [0x744, 0x744], /* SYRIAC TWO VERTICAL DOTS BELOW */
- [0x745, 0x745], /* SYRIAC THREE DOTS ABOVE */
- [0x746, 0x746], /* SYRIAC THREE DOTS BELOW */
- [0x747, 0x747], /* SYRIAC OBLIQUE LINE ABOVE */
- [0x748, 0x748], /* SYRIAC OBLIQUE LINE BELOW */
- [0x749, 0x749], /* SYRIAC MUSIC */
- [0x74a, 0x74a], /* SYRIAC BARREKH */
- [0x74b, 0x74b],
- [0x74c, 0x74c],
- [0x74d, 0x74d], /* SYRIAC LETTER SOGDIAN ZHAIN */
- [0x74e, 0x74e], /* SYRIAC LETTER SOGDIAN KHAPH */
- [0x74f, 0x74f], /* SYRIAC LETTER SOGDIAN FE */
- [0x750, 0x750], /* ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW */
- [0x751, 0x751], /* ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE */
- [0x752, 0x752], /* ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW */
- [0x753, 0x753], /* ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE */
- [0x754, 0x754], /* ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE */
- [0x755, 0x755], /* ARABIC LETTER BEH WITH INVERTED SMALL V BELOW */
- [0x756, 0x756], /* ARABIC LETTER BEH WITH SMALL V */
- [0x757, 0x757], /* ARABIC LETTER HAH WITH TWO DOTS ABOVE */
- [0x758, 0x758], /* ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW */
- [0x759, 0x759], /* ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH */
- [0x75a, 0x75a], /* ARABIC LETTER DAL WITH INVERTED SMALL V BELOW */
- [0x75b, 0x75b], /* ARABIC LETTER REH WITH STROKE */
- [0x75c, 0x75c], /* ARABIC LETTER SEEN WITH FOUR DOTS ABOVE */
- [0x75d, 0x75d], /* ARABIC LETTER AIN WITH TWO DOTS ABOVE */
- [0x75e, 0x75e], /* ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE */
- [0x75f, 0x75f], /* ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE */
- [0x760, 0x760], /* ARABIC LETTER FEH WITH TWO DOTS BELOW */
- [0x761, 0x761], /* ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW */
- [0x762, 0x762], /* ARABIC LETTER KEHEH WITH DOT ABOVE */
- [0x763, 0x763], /* ARABIC LETTER KEHEH WITH THREE DOTS ABOVE */
- [0x764, 0x764], /* ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW */
- [0x765, 0x765], /* ARABIC LETTER MEEM WITH DOT ABOVE */
- [0x766, 0x766], /* ARABIC LETTER MEEM WITH DOT BELOW */
- [0x767, 0x767], /* ARABIC LETTER NOON WITH TWO DOTS BELOW */
- [0x768, 0x768], /* ARABIC LETTER NOON WITH SMALL TAH */
- [0x769, 0x769], /* ARABIC LETTER NOON WITH SMALL V */
- [0x76a, 0x76a], /* ARABIC LETTER LAM WITH BAR */
- [0x76b, 0x76b], /* ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE */
- [0x76c, 0x76c], /* ARABIC LETTER REH WITH HAMZA ABOVE */
- [0x76d, 0x76d], /* ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE */
- [0x76e, 0x76e], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW */
- [0x76f, 0x76f], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
- [0x770, 0x770], /* ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
- [0x771, 0x771], /* ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
- [0x772, 0x772], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE */
- [0x773, 0x773], /* ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
- [0x774, 0x774], /* ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
- [0x775, 0x775], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
- [0x776, 0x776], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
- [0x777, 0x777], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW */
- [0x778, 0x778], /* ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
- [0x779, 0x779], /* ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
- [0x77a, 0x77a], /* ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
- [0x77b, 0x77b], /* ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
- [0x77c, 0x77c], /* ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW */
- [0x77d, 0x77d], /* ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE */
- [0x77e, 0x77e], /* ARABIC LETTER SEEN WITH INVERTED V */
- [0x77f, 0x77f], /* ARABIC LETTER KAF WITH TWO DOTS ABOVE */
- [0x780, 0x780], /* THAANA LETTER HAA */
- [0x781, 0x781], /* THAANA LETTER SHAVIYANI */
- [0x782, 0x782], /* THAANA LETTER NOONU */
- [0x783, 0x783], /* THAANA LETTER RAA */
- [0x784, 0x784], /* THAANA LETTER BAA */
- [0x785, 0x785], /* THAANA LETTER LHAVIYANI */
- [0x786, 0x786], /* THAANA LETTER KAAFU */
- [0x787, 0x787], /* THAANA LETTER ALIFU */
- [0x788, 0x788], /* THAANA LETTER VAAVU */
- [0x789, 0x789], /* THAANA LETTER MEEMU */
- [0x78a, 0x78a], /* THAANA LETTER FAAFU */
- [0x78b, 0x78b], /* THAANA LETTER DHAALU */
- [0x78c, 0x78c], /* THAANA LETTER THAA */
- [0x78d, 0x78d], /* THAANA LETTER LAAMU */
- [0x78e, 0x78e], /* THAANA LETTER GAAFU */
- [0x78f, 0x78f], /* THAANA LETTER GNAVIYANI */
- [0x790, 0x790], /* THAANA LETTER SEENU */
- [0x791, 0x791], /* THAANA LETTER DAVIYANI */
- [0x792, 0x792], /* THAANA LETTER ZAVIYANI */
- [0x793, 0x793], /* THAANA LETTER TAVIYANI */
- [0x794, 0x794], /* THAANA LETTER YAA */
- [0x795, 0x795], /* THAANA LETTER PAVIYANI */
- [0x796, 0x796], /* THAANA LETTER JAVIYANI */
- [0x797, 0x797], /* THAANA LETTER CHAVIYANI */
- [0x798, 0x798], /* THAANA LETTER TTAA */
- [0x799, 0x799], /* THAANA LETTER HHAA */
- [0x79a, 0x79a], /* THAANA LETTER KHAA */
- [0x79b, 0x79b], /* THAANA LETTER THAALU */
- [0x79c, 0x79c], /* THAANA LETTER ZAA */
- [0x79d, 0x79d], /* THAANA LETTER SHEENU */
- [0x79e, 0x79e], /* THAANA LETTER SAADHU */
- [0x79f, 0x79f], /* THAANA LETTER DAADHU */
- [0x7a0, 0x7a0], /* THAANA LETTER TO */
- [0x7a1, 0x7a1], /* THAANA LETTER ZO */
- [0x7a2, 0x7a2], /* THAANA LETTER AINU */
- [0x7a3, 0x7a3], /* THAANA LETTER GHAINU */
- [0x7a4, 0x7a4], /* THAANA LETTER QAAFU */
- [0x7a5, 0x7a5], /* THAANA LETTER WAAVU */
- [0x7a6, 0x7a6], /* THAANA ABAFILI */
- [0x7a7, 0x7a7], /* THAANA AABAAFILI */
- [0x7a8, 0x7a8], /* THAANA IBIFILI */
- [0x7a9, 0x7a9], /* THAANA EEBEEFILI */
- [0x7aa, 0x7aa], /* THAANA UBUFILI */
- [0x7ab, 0x7ab], /* THAANA OOBOOFILI */
- [0x7ac, 0x7ac], /* THAANA EBEFILI */
- [0x7ad, 0x7ad], /* THAANA EYBEYFILI */
- [0x7ae, 0x7ae], /* THAANA OBOFILI */
- [0x7af, 0x7af], /* THAANA OABOAFILI */
- [0x7b0, 0x7b0], /* THAANA SUKUN */
- [0x7b1, 0x7b1], /* THAANA LETTER NAA */
- [0x7b2, 0x7b2],
- [0x7b3, 0x7b3],
- [0x7b4, 0x7b4],
- [0x7b5, 0x7b5],
- [0x7b6, 0x7b6],
- [0x7b7, 0x7b7],
- [0x7b8, 0x7b8],
- [0x7b9, 0x7b9],
- [0x7ba, 0x7ba],
- [0x7bb, 0x7bb],
- [0x7bc, 0x7bc],
- [0x7bd, 0x7bd],
- [0x7be, 0x7be],
- [0x7bf, 0x7bf],
- [0x7c0, 0x7c0], /* NKO DIGIT ZERO */
- [0x7c1, 0x7c1], /* NKO DIGIT ONE */
- [0x7c2, 0x7c2], /* NKO DIGIT TWO */
- [0x7c3, 0x7c3], /* NKO DIGIT THREE */
- [0x7c4, 0x7c4], /* NKO DIGIT FOUR */
- [0x7c5, 0x7c5], /* NKO DIGIT FIVE */
- [0x7c6, 0x7c6], /* NKO DIGIT SIX */
- [0x7c7, 0x7c7], /* NKO DIGIT SEVEN */
- [0x7c8, 0x7c8], /* NKO DIGIT EIGHT */
- [0x7c9, 0x7c9], /* NKO DIGIT NINE */
- [0x7ca, 0x7ca], /* NKO LETTER A */
- [0x7cb, 0x7cb], /* NKO LETTER EE */
- [0x7cc, 0x7cc], /* NKO LETTER I */
- [0x7cd, 0x7cd], /* NKO LETTER E */
- [0x7ce, 0x7ce], /* NKO LETTER U */
- [0x7cf, 0x7cf], /* NKO LETTER OO */
- [0x7d0, 0x7d0], /* NKO LETTER O */
- [0x7d1, 0x7d1], /* NKO LETTER DAGBASINNA */
- [0x7d2, 0x7d2], /* NKO LETTER N */
- [0x7d3, 0x7d3], /* NKO LETTER BA */
- [0x7d4, 0x7d4], /* NKO LETTER PA */
- [0x7d5, 0x7d5], /* NKO LETTER TA */
- [0x7d6, 0x7d6], /* NKO LETTER JA */
- [0x7d7, 0x7d7], /* NKO LETTER CHA */
- [0x7d8, 0x7d8], /* NKO LETTER DA */
- [0x7d9, 0x7d9], /* NKO LETTER RA */
- [0x7da, 0x7da], /* NKO LETTER RRA */
- [0x7db, 0x7db], /* NKO LETTER SA */
- [0x7dc, 0x7dc], /* NKO LETTER GBA */
- [0x7dd, 0x7dd], /* NKO LETTER FA */
- [0x7de, 0x7de], /* NKO LETTER KA */
- [0x7df, 0x7df], /* NKO LETTER LA */
- [0x7e0, 0x7e0], /* NKO LETTER NA WOLOSO */
- [0x7e1, 0x7e1], /* NKO LETTER MA */
- [0x7e2, 0x7e2], /* NKO LETTER NYA */
- [0x7e3, 0x7e3], /* NKO LETTER NA */
- [0x7e4, 0x7e4], /* NKO LETTER HA */
- [0x7e5, 0x7e5], /* NKO LETTER WA */
- [0x7e6, 0x7e6], /* NKO LETTER YA */
- [0x7e7, 0x7e7], /* NKO LETTER NYA WOLOSO */
- [0x7e8, 0x7e8], /* NKO LETTER JONA JA */
- [0x7e9, 0x7e9], /* NKO LETTER JONA CHA */
- [0x7ea, 0x7ea], /* NKO LETTER JONA RA */
- [0x7eb, 0x7eb], /* NKO COMBINING SHORT HIGH TONE */
- [0x7ec, 0x7ec], /* NKO COMBINING SHORT LOW TONE */
- [0x7ed, 0x7ed], /* NKO COMBINING SHORT RISING TONE */
- [0x7ee, 0x7ee], /* NKO COMBINING LONG DESCENDING TONE */
- [0x7ef, 0x7ef], /* NKO COMBINING LONG HIGH TONE */
- [0x7f0, 0x7f0], /* NKO COMBINING LONG LOW TONE */
- [0x7f1, 0x7f1], /* NKO COMBINING LONG RISING TONE */
- [0x7f2, 0x7f2], /* NKO COMBINING NASALIZATION MARK */
- [0x7f3, 0x7f3], /* NKO COMBINING DOUBLE DOT ABOVE */
- [0x7f4, 0x7f4], /* NKO HIGH TONE APOSTROPHE */
- [0x7f5, 0x7f5], /* NKO LOW TONE APOSTROPHE */
- [0x7f6, 0x7f6], /* NKO SYMBOL OO DENNEN */
- [0x7f7, 0x7f7], /* NKO SYMBOL GBAKURUNEN */
- [0x7f8, 0x7f8], /* NKO COMMA */
- [0x7f9, 0x7f9], /* NKO EXCLAMATION MARK */
- [0x7fa, 0x7fa], /* NKO LAJANYALAN */
- [0x7fb, 0x7fb],
- [0x7fc, 0x7fc],
- [0x7fd, 0x7fd], /* NKO DANTAYALAN */
- [0x7fe, 0x7fe], /* NKO DOROME SIGN */
- [0x7ff, 0x7ff], /* NKO TAMAN SIGN */
- [0x800, 0x800], /* SAMARITAN LETTER ALAF */
- [0x801, 0x801], /* SAMARITAN LETTER BIT */
- [0x802, 0x802], /* SAMARITAN LETTER GAMAN */
- [0x803, 0x803], /* SAMARITAN LETTER DALAT */
- [0x804, 0x804], /* SAMARITAN LETTER IY */
- [0x805, 0x805], /* SAMARITAN LETTER BAA */
- [0x806, 0x806], /* SAMARITAN LETTER ZEN */
- [0x807, 0x807], /* SAMARITAN LETTER IT */
- [0x808, 0x808], /* SAMARITAN LETTER TIT */
- [0x809, 0x809], /* SAMARITAN LETTER YUT */
- [0x80a, 0x80a], /* SAMARITAN LETTER KAAF */
- [0x80b, 0x80b], /* SAMARITAN LETTER LABAT */
- [0x80c, 0x80c], /* SAMARITAN LETTER MIM */
- [0x80d, 0x80d], /* SAMARITAN LETTER NUN */
- [0x80e, 0x80e], /* SAMARITAN LETTER SINGAAT */
- [0x80f, 0x80f], /* SAMARITAN LETTER IN */
- [0x810, 0x810], /* SAMARITAN LETTER FI */
- [0x811, 0x811], /* SAMARITAN LETTER TSAADIY */
- [0x812, 0x812], /* SAMARITAN LETTER QUF */
- [0x813, 0x813], /* SAMARITAN LETTER RISH */
- [0x814, 0x814], /* SAMARITAN LETTER SHAN */
- [0x815, 0x815], /* SAMARITAN LETTER TAAF */
- [0x816, 0x816], /* SAMARITAN MARK IN */
- [0x817, 0x817], /* SAMARITAN MARK IN-ALAF */
- [0x818, 0x818], /* SAMARITAN MARK OCCLUSION */
- [0x819, 0x819], /* SAMARITAN MARK DAGESH */
- [0x81a, 0x81a], /* SAMARITAN MODIFIER LETTER EPENTHETIC YUT */
- [0x81b, 0x81b], /* SAMARITAN MARK EPENTHETIC YUT */
- [0x81c, 0x81c], /* SAMARITAN VOWEL SIGN LONG E */
- [0x81d, 0x81d], /* SAMARITAN VOWEL SIGN E */
- [0x81e, 0x81e], /* SAMARITAN VOWEL SIGN OVERLONG AA */
- [0x81f, 0x81f], /* SAMARITAN VOWEL SIGN LONG AA */
- [0x820, 0x820], /* SAMARITAN VOWEL SIGN AA */
- [0x821, 0x821], /* SAMARITAN VOWEL SIGN OVERLONG A */
- [0x822, 0x822], /* SAMARITAN VOWEL SIGN LONG A */
- [0x823, 0x823], /* SAMARITAN VOWEL SIGN A */
- [0x824, 0x824], /* SAMARITAN MODIFIER LETTER SHORT A */
- [0x825, 0x825], /* SAMARITAN VOWEL SIGN SHORT A */
- [0x826, 0x826], /* SAMARITAN VOWEL SIGN LONG U */
- [0x827, 0x827], /* SAMARITAN VOWEL SIGN U */
- [0x828, 0x828], /* SAMARITAN MODIFIER LETTER I */
- [0x829, 0x829], /* SAMARITAN VOWEL SIGN LONG I */
- [0x82a, 0x82a], /* SAMARITAN VOWEL SIGN I */
- [0x82b, 0x82b], /* SAMARITAN VOWEL SIGN O */
- [0x82c, 0x82c], /* SAMARITAN VOWEL SIGN SUKUN */
- [0x82d, 0x82d], /* SAMARITAN MARK NEQUDAA */
- [0x82e, 0x82e],
- [0x82f, 0x82f],
- [0x830, 0x830], /* SAMARITAN PUNCTUATION NEQUDAA */
- [0x831, 0x831], /* SAMARITAN PUNCTUATION AFSAAQ */
- [0x832, 0x832], /* SAMARITAN PUNCTUATION ANGED */
- [0x833, 0x833], /* SAMARITAN PUNCTUATION BAU */
- [0x834, 0x834], /* SAMARITAN PUNCTUATION ATMAAU */
- [0x835, 0x835], /* SAMARITAN PUNCTUATION SHIYYAALAA */
- [0x836, 0x836], /* SAMARITAN ABBREVIATION MARK */
- [0x837, 0x837], /* SAMARITAN PUNCTUATION MELODIC QITSA */
- [0x838, 0x838], /* SAMARITAN PUNCTUATION ZIQAA */
- [0x839, 0x839], /* SAMARITAN PUNCTUATION QITSA */
- [0x83a, 0x83a], /* SAMARITAN PUNCTUATION ZAEF */
- [0x83b, 0x83b], /* SAMARITAN PUNCTUATION TURU */
- [0x83c, 0x83c], /* SAMARITAN PUNCTUATION ARKAANU */
- [0x83d, 0x83d], /* SAMARITAN PUNCTUATION SOF MASHFAAT */
- [0x83e, 0x83e], /* SAMARITAN PUNCTUATION ANNAAU */
- [0x83f, 0x83f],
- [0x840, 0x840], /* MANDAIC LETTER HALQA */
- [0x841, 0x841], /* MANDAIC LETTER AB */
- [0x842, 0x842], /* MANDAIC LETTER AG */
- [0x843, 0x843], /* MANDAIC LETTER AD */
- [0x844, 0x844], /* MANDAIC LETTER AH */
- [0x845, 0x845], /* MANDAIC LETTER USHENNA */
- [0x846, 0x846], /* MANDAIC LETTER AZ */
- [0x847, 0x847], /* MANDAIC LETTER IT */
- [0x848, 0x848], /* MANDAIC LETTER ATT */
- [0x849, 0x849], /* MANDAIC LETTER AKSA */
- [0x84a, 0x84a], /* MANDAIC LETTER AK */
- [0x84b, 0x84b], /* MANDAIC LETTER AL */
- [0x84c, 0x84c], /* MANDAIC LETTER AM */
- [0x84d, 0x84d], /* MANDAIC LETTER AN */
- [0x84e, 0x84e], /* MANDAIC LETTER AS */
- [0x84f, 0x84f], /* MANDAIC LETTER IN */
- [0x850, 0x850], /* MANDAIC LETTER AP */
- [0x851, 0x851], /* MANDAIC LETTER ASZ */
- [0x852, 0x852], /* MANDAIC LETTER AQ */
- [0x853, 0x853], /* MANDAIC LETTER AR */
- [0x854, 0x854], /* MANDAIC LETTER ASH */
- [0x855, 0x855], /* MANDAIC LETTER AT */
- [0x856, 0x856], /* MANDAIC LETTER DUSHENNA */
- [0x857, 0x857], /* MANDAIC LETTER KAD */
- [0x858, 0x858], /* MANDAIC LETTER AIN */
- [0x859, 0x859], /* MANDAIC AFFRICATION MARK */
- [0x85a, 0x85a], /* MANDAIC VOCALIZATION MARK */
- [0x85b, 0x85b], /* MANDAIC GEMINATION MARK */
- [0x85c, 0x85c],
- [0x85d, 0x85d],
- [0x85e, 0x85e], /* MANDAIC PUNCTUATION */
- [0x85f, 0x85f],
- [0x860, 0x860], /* SYRIAC LETTER MALAYALAM NGA */
- [0x861, 0x861], /* SYRIAC LETTER MALAYALAM JA */
- [0x862, 0x862], /* SYRIAC LETTER MALAYALAM NYA */
- [0x863, 0x863], /* SYRIAC LETTER MALAYALAM TTA */
- [0x864, 0x864], /* SYRIAC LETTER MALAYALAM NNA */
- [0x865, 0x865], /* SYRIAC LETTER MALAYALAM NNNA */
- [0x866, 0x866], /* SYRIAC LETTER MALAYALAM BHA */
- [0x867, 0x867], /* SYRIAC LETTER MALAYALAM RA */
- [0x868, 0x868], /* SYRIAC LETTER MALAYALAM LLA */
- [0x869, 0x869], /* SYRIAC LETTER MALAYALAM LLLA */
- [0x86a, 0x86a], /* SYRIAC LETTER MALAYALAM SSA */
- [0x86b, 0x86b],
- [0x86c, 0x86c],
- [0x86d, 0x86d],
- [0x86e, 0x86e],
- [0x86f, 0x86f],
- [0x870, 0x870],
- [0x871, 0x871],
- [0x872, 0x872],
- [0x873, 0x873],
- [0x874, 0x874],
- [0x875, 0x875],
- [0x876, 0x876],
- [0x877, 0x877],
- [0x878, 0x878],
- [0x879, 0x879],
- [0x87a, 0x87a],
- [0x87b, 0x87b],
- [0x87c, 0x87c],
- [0x87d, 0x87d],
- [0x87e, 0x87e],
- [0x87f, 0x87f],
- [0x880, 0x880],
- [0x881, 0x881],
- [0x882, 0x882],
- [0x883, 0x883],
- [0x884, 0x884],
- [0x885, 0x885],
- [0x886, 0x886],
- [0x887, 0x887],
- [0x888, 0x888],
- [0x889, 0x889],
- [0x88a, 0x88a],
- [0x88b, 0x88b],
- [0x88c, 0x88c],
- [0x88d, 0x88d],
- [0x88e, 0x88e],
- [0x88f, 0x88f],
- [0x890, 0x890],
- [0x891, 0x891],
- [0x892, 0x892],
- [0x893, 0x893],
- [0x894, 0x894],
- [0x895, 0x895],
- [0x896, 0x896],
- [0x897, 0x897],
- [0x898, 0x898],
- [0x899, 0x899],
- [0x89a, 0x89a],
- [0x89b, 0x89b],
- [0x89c, 0x89c],
- [0x89d, 0x89d],
- [0x89e, 0x89e],
- [0x89f, 0x89f],
- [0x8a0, 0x8a0], /* ARABIC LETTER BEH WITH SMALL V BELOW */
- [0x8a1, 0x8a1], /* ARABIC LETTER BEH WITH HAMZA ABOVE */
- [0x8a2, 0x8a2], /* ARABIC LETTER JEEM WITH TWO DOTS ABOVE */
- [0x8a3, 0x8a3], /* ARABIC LETTER TAH WITH TWO DOTS ABOVE */
- [0x8a4, 0x8a4], /* ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE */
- [0x8a5, 0x8a5], /* ARABIC LETTER QAF WITH DOT BELOW */
- [0x8a6, 0x8a6], /* ARABIC LETTER LAM WITH DOUBLE BAR */
- [0x8a7, 0x8a7], /* ARABIC LETTER MEEM WITH THREE DOTS ABOVE */
- [0x8a8, 0x8a8], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE */
- [0x8a9, 0x8a9], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE */
- [0x8aa, 0x8aa], /* ARABIC LETTER REH WITH LOOP */
- [0x8ab, 0x8ab], /* ARABIC LETTER WAW WITH DOT WITHIN */
- [0x8ac, 0x8ac], /* ARABIC LETTER ROHINGYA YEH */
- [0x8ad, 0x8ad], /* ARABIC LETTER LOW ALEF */
- [0x8ae, 0x8ae], /* ARABIC LETTER DAL WITH THREE DOTS BELOW */
- [0x8af, 0x8af], /* ARABIC LETTER SAD WITH THREE DOTS BELOW */
- [0x8b0, 0x8b0], /* ARABIC LETTER GAF WITH INVERTED STROKE */
- [0x8b1, 0x8b1], /* ARABIC LETTER STRAIGHT WAW */
- [0x8b2, 0x8b2], /* ARABIC LETTER ZAIN WITH INVERTED V ABOVE */
- [0x8b3, 0x8b3], /* ARABIC LETTER AIN WITH THREE DOTS BELOW */
- [0x8b4, 0x8b4], /* ARABIC LETTER KAF WITH DOT BELOW */
- [0x8b5, 0x8b5],
- [0x8b6, 0x8b6], /* ARABIC LETTER BEH WITH SMALL MEEM ABOVE */
- [0x8b7, 0x8b7], /* ARABIC LETTER PEH WITH SMALL MEEM ABOVE */
- [0x8b8, 0x8b8], /* ARABIC LETTER TEH WITH SMALL TEH ABOVE */
- [0x8b9, 0x8b9], /* ARABIC LETTER REH WITH SMALL NOON ABOVE */
- [0x8ba, 0x8ba], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE */
- [0x8bb, 0x8bb], /* ARABIC LETTER AFRICAN FEH */
- [0x8bc, 0x8bc], /* ARABIC LETTER AFRICAN QAF */
- [0x8bd, 0x8bd], /* ARABIC LETTER AFRICAN NOON */
- [0x8be, 0x8be],
- [0x8bf, 0x8bf],
- [0x8c0, 0x8c0],
- [0x8c1, 0x8c1],
- [0x8c2, 0x8c2],
- [0x8c3, 0x8c3],
- [0x8c4, 0x8c4],
- [0x8c5, 0x8c5],
- [0x8c6, 0x8c6],
- [0x8c7, 0x8c7],
- [0x8c8, 0x8c8],
- [0x8c9, 0x8c9],
- [0x8ca, 0x8ca],
- [0x8cb, 0x8cb],
- [0x8cc, 0x8cc],
- [0x8cd, 0x8cd],
- [0x8ce, 0x8ce],
- [0x8cf, 0x8cf],
- [0x8d0, 0x8d0],
- [0x8d1, 0x8d1],
- [0x8d2, 0x8d2],
- [0x8d3, 0x8d3], /* ARABIC SMALL LOW WAW */
- [0x8d4, 0x8d4], /* ARABIC SMALL HIGH WORD AR-RUB */
- [0x8d5, 0x8d5], /* ARABIC SMALL HIGH SAD */
- [0x8d6, 0x8d6], /* ARABIC SMALL HIGH AIN */
- [0x8d7, 0x8d7], /* ARABIC SMALL HIGH QAF */
- [0x8d8, 0x8d8], /* ARABIC SMALL HIGH NOON WITH KASRA */
- [0x8d9, 0x8d9], /* ARABIC SMALL LOW NOON WITH KASRA */
- [0x8da, 0x8da], /* ARABIC SMALL HIGH WORD ATH-THALATHA */
- [0x8db, 0x8db], /* ARABIC SMALL HIGH WORD AS-SAJDA */
- [0x8dc, 0x8dc], /* ARABIC SMALL HIGH WORD AN-NISF */
- [0x8dd, 0x8dd], /* ARABIC SMALL HIGH WORD SAKTA */
- [0x8de, 0x8de], /* ARABIC SMALL HIGH WORD QIF */
- [0x8df, 0x8df], /* ARABIC SMALL HIGH WORD WAQFA */
- [0x8e0, 0x8e0], /* ARABIC SMALL HIGH FOOTNOTE MARKER */
- [0x8e1, 0x8e1], /* ARABIC SMALL HIGH SIGN SAFHA */
- [0x8e2, 0x8e2], /* ARABIC DISPUTED END OF AYAH */
- [0x8e3, 0x8e3], /* ARABIC TURNED DAMMA BELOW */
- [0x8e4, 0x8e4], /* ARABIC CURLY FATHA */
- [0x8e5, 0x8e5], /* ARABIC CURLY DAMMA */
- [0x8e6, 0x8e6], /* ARABIC CURLY KASRA */
- [0x8e7, 0x8e7], /* ARABIC CURLY FATHATAN */
- [0x8e8, 0x8e8], /* ARABIC CURLY DAMMATAN */
- [0x8e9, 0x8e9], /* ARABIC CURLY KASRATAN */
- [0x8ea, 0x8ea], /* ARABIC TONE ONE DOT ABOVE */
- [0x8eb, 0x8eb], /* ARABIC TONE TWO DOTS ABOVE */
- [0x8ec, 0x8ec], /* ARABIC TONE LOOP ABOVE */
- [0x8ed, 0x8ed], /* ARABIC TONE ONE DOT BELOW */
- [0x8ee, 0x8ee], /* ARABIC TONE TWO DOTS BELOW */
- [0x8ef, 0x8ef], /* ARABIC TONE LOOP BELOW */
- [0x8f0, 0x8f0], /* ARABIC OPEN FATHATAN */
- [0x8f1, 0x8f1], /* ARABIC OPEN DAMMATAN */
- [0x8f2, 0x8f2], /* ARABIC OPEN KASRATAN */
- [0x8f3, 0x8f3], /* ARABIC SMALL HIGH WAW */
- [0x8f4, 0x8f4], /* ARABIC FATHA WITH RING */
- [0x8f5, 0x8f5], /* ARABIC FATHA WITH DOT ABOVE */
- [0x8f6, 0x8f6], /* ARABIC KASRA WITH DOT BELOW */
- [0x8f7, 0x8f7], /* ARABIC LEFT ARROWHEAD ABOVE */
- [0x8f8, 0x8f8], /* ARABIC RIGHT ARROWHEAD ABOVE */
- [0x8f9, 0x8f9], /* ARABIC LEFT ARROWHEAD BELOW */
- [0x8fa, 0x8fa], /* ARABIC RIGHT ARROWHEAD BELOW */
- [0x8fb, 0x8fb], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE */
- [0x8fc, 0x8fc], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT */
- [0x8fd, 0x8fd], /* ARABIC RIGHT ARROWHEAD ABOVE WITH DOT */
- [0x8fe, 0x8fe], /* ARABIC DAMMA WITH DOT */
- [0x8ff, 0x8ff], /* ARABIC MARK SIDEWAYS NOON GHUNNA */
- [0x900, 0x900], /* DEVANAGARI SIGN INVERTED CANDRABINDU */
- [0x901, 0x901], /* DEVANAGARI SIGN CANDRABINDU */
- [0x902, 0x902], /* DEVANAGARI SIGN ANUSVARA */
- [0x903, 0x903], /* DEVANAGARI SIGN VISARGA */
- [0x904, 0x904], /* DEVANAGARI LETTER SHORT A */
- [0x905, 0x905], /* DEVANAGARI LETTER A */
- [0x906, 0x906], /* DEVANAGARI LETTER AA */
- [0x907, 0x907], /* DEVANAGARI LETTER I */
- [0x908, 0x908], /* DEVANAGARI LETTER II */
- [0x909, 0x909], /* DEVANAGARI LETTER U */
- [0x90a, 0x90a], /* DEVANAGARI LETTER UU */
- [0x90b, 0x90b], /* DEVANAGARI LETTER VOCALIC R */
- [0x90c, 0x90c], /* DEVANAGARI LETTER VOCALIC L */
- [0x90d, 0x90d], /* DEVANAGARI LETTER CANDRA E */
- [0x90e, 0x90e], /* DEVANAGARI LETTER SHORT E */
- [0x90f, 0x90f], /* DEVANAGARI LETTER E */
- [0x910, 0x910], /* DEVANAGARI LETTER AI */
- [0x911, 0x911], /* DEVANAGARI LETTER CANDRA O */
- [0x912, 0x912], /* DEVANAGARI LETTER SHORT O */
- [0x913, 0x913], /* DEVANAGARI LETTER O */
- [0x914, 0x914], /* DEVANAGARI LETTER AU */
- [0x915, 0x915], /* DEVANAGARI LETTER KA */
- [0x916, 0x916], /* DEVANAGARI LETTER KHA */
- [0x917, 0x917], /* DEVANAGARI LETTER GA */
- [0x918, 0x918], /* DEVANAGARI LETTER GHA */
- [0x919, 0x919], /* DEVANAGARI LETTER NGA */
- [0x91a, 0x91a], /* DEVANAGARI LETTER CA */
- [0x91b, 0x91b], /* DEVANAGARI LETTER CHA */
- [0x91c, 0x91c], /* DEVANAGARI LETTER JA */
- [0x91d, 0x91d], /* DEVANAGARI LETTER JHA */
- [0x91e, 0x91e], /* DEVANAGARI LETTER NYA */
- [0x91f, 0x91f], /* DEVANAGARI LETTER TTA */
- [0x920, 0x920], /* DEVANAGARI LETTER TTHA */
- [0x921, 0x921], /* DEVANAGARI LETTER DDA */
- [0x922, 0x922], /* DEVANAGARI LETTER DDHA */
- [0x923, 0x923], /* DEVANAGARI LETTER NNA */
- [0x924, 0x924], /* DEVANAGARI LETTER TA */
- [0x925, 0x925], /* DEVANAGARI LETTER THA */
- [0x926, 0x926], /* DEVANAGARI LETTER DA */
- [0x927, 0x927], /* DEVANAGARI LETTER DHA */
- [0x928, 0x928], /* DEVANAGARI LETTER NA */
- [0x929, 0x929], /* DEVANAGARI LETTER NNNA */
- [0x92a, 0x92a], /* DEVANAGARI LETTER PA */
- [0x92b, 0x92b], /* DEVANAGARI LETTER PHA */
- [0x92c, 0x92c], /* DEVANAGARI LETTER BA */
- [0x92d, 0x92d], /* DEVANAGARI LETTER BHA */
- [0x92e, 0x92e], /* DEVANAGARI LETTER MA */
- [0x92f, 0x92f], /* DEVANAGARI LETTER YA */
- [0x930, 0x930], /* DEVANAGARI LETTER RA */
- [0x931, 0x931], /* DEVANAGARI LETTER RRA */
- [0x932, 0x932], /* DEVANAGARI LETTER LA */
- [0x933, 0x933], /* DEVANAGARI LETTER LLA */
- [0x934, 0x934], /* DEVANAGARI LETTER LLLA */
- [0x935, 0x935], /* DEVANAGARI LETTER VA */
- [0x936, 0x936], /* DEVANAGARI LETTER SHA */
- [0x937, 0x937], /* DEVANAGARI LETTER SSA */
- [0x938, 0x938], /* DEVANAGARI LETTER SA */
- [0x939, 0x939], /* DEVANAGARI LETTER HA */
- [0x93a, 0x93a], /* DEVANAGARI VOWEL SIGN OE */
- [0x93b, 0x93b], /* DEVANAGARI VOWEL SIGN OOE */
- [0x93c, 0x93c], /* DEVANAGARI SIGN NUKTA */
- [0x93d, 0x93d], /* DEVANAGARI SIGN AVAGRAHA */
- [0x93e, 0x93e], /* DEVANAGARI VOWEL SIGN AA */
- [0x93f, 0x93f], /* DEVANAGARI VOWEL SIGN I */
- [0x940, 0x940], /* DEVANAGARI VOWEL SIGN II */
- [0x941, 0x941], /* DEVANAGARI VOWEL SIGN U */
- [0x942, 0x942], /* DEVANAGARI VOWEL SIGN UU */
- [0x943, 0x943], /* DEVANAGARI VOWEL SIGN VOCALIC R */
- [0x944, 0x944], /* DEVANAGARI VOWEL SIGN VOCALIC RR */
- [0x945, 0x945], /* DEVANAGARI VOWEL SIGN CANDRA E */
- [0x946, 0x946], /* DEVANAGARI VOWEL SIGN SHORT E */
- [0x947, 0x947], /* DEVANAGARI VOWEL SIGN E */
- [0x948, 0x948], /* DEVANAGARI VOWEL SIGN AI */
- [0x949, 0x949], /* DEVANAGARI VOWEL SIGN CANDRA O */
- [0x94a, 0x94a], /* DEVANAGARI VOWEL SIGN SHORT O */
- [0x94b, 0x94b], /* DEVANAGARI VOWEL SIGN O */
- [0x94c, 0x94c], /* DEVANAGARI VOWEL SIGN AU */
- [0x94d, 0x94d], /* DEVANAGARI SIGN VIRAMA */
- [0x94e, 0x94e], /* DEVANAGARI VOWEL SIGN PRISHTHAMATRA E */
- [0x94f, 0x94f], /* DEVANAGARI VOWEL SIGN AW */
- [0x950, 0x950], /* DEVANAGARI OM */
- [0x951, 0x951], /* DEVANAGARI STRESS SIGN UDATTA */
- [0x952, 0x952], /* DEVANAGARI STRESS SIGN ANUDATTA */
- [0x953, 0x953], /* DEVANAGARI GRAVE ACCENT */
- [0x954, 0x954], /* DEVANAGARI ACUTE ACCENT */
- [0x955, 0x955], /* DEVANAGARI VOWEL SIGN CANDRA LONG E */
- [0x956, 0x956], /* DEVANAGARI VOWEL SIGN UE */
- [0x957, 0x957], /* DEVANAGARI VOWEL SIGN UUE */
- [0x958, 0x958], /* DEVANAGARI LETTER QA */
- [0x959, 0x959], /* DEVANAGARI LETTER KHHA */
- [0x95a, 0x95a], /* DEVANAGARI LETTER GHHA */
- [0x95b, 0x95b], /* DEVANAGARI LETTER ZA */
- [0x95c, 0x95c], /* DEVANAGARI LETTER DDDHA */
- [0x95d, 0x95d], /* DEVANAGARI LETTER RHA */
- [0x95e, 0x95e], /* DEVANAGARI LETTER FA */
- [0x95f, 0x95f], /* DEVANAGARI LETTER YYA */
- [0x960, 0x960], /* DEVANAGARI LETTER VOCALIC RR */
- [0x961, 0x961], /* DEVANAGARI LETTER VOCALIC LL */
- [0x962, 0x962], /* DEVANAGARI VOWEL SIGN VOCALIC L */
- [0x963, 0x963], /* DEVANAGARI VOWEL SIGN VOCALIC LL */
- [0x964, 0x964], /* DEVANAGARI DANDA */
- [0x965, 0x965], /* DEVANAGARI DOUBLE DANDA */
- [0x966, 0x966], /* DEVANAGARI DIGIT ZERO */
- [0x967, 0x967], /* DEVANAGARI DIGIT ONE */
- [0x968, 0x968], /* DEVANAGARI DIGIT TWO */
- [0x969, 0x969], /* DEVANAGARI DIGIT THREE */
- [0x96a, 0x96a], /* DEVANAGARI DIGIT FOUR */
- [0x96b, 0x96b], /* DEVANAGARI DIGIT FIVE */
- [0x96c, 0x96c], /* DEVANAGARI DIGIT SIX */
- [0x96d, 0x96d], /* DEVANAGARI DIGIT SEVEN */
- [0x96e, 0x96e], /* DEVANAGARI DIGIT EIGHT */
- [0x96f, 0x96f], /* DEVANAGARI DIGIT NINE */
- [0x970, 0x970], /* DEVANAGARI ABBREVIATION SIGN */
- [0x971, 0x971], /* DEVANAGARI SIGN HIGH SPACING DOT */
- [0x972, 0x972], /* DEVANAGARI LETTER CANDRA A */
- [0x973, 0x973], /* DEVANAGARI LETTER OE */
- [0x974, 0x974], /* DEVANAGARI LETTER OOE */
- [0x975, 0x975], /* DEVANAGARI LETTER AW */
- [0x976, 0x976], /* DEVANAGARI LETTER UE */
- [0x977, 0x977], /* DEVANAGARI LETTER UUE */
- [0x978, 0x978], /* DEVANAGARI LETTER MARWARI DDA */
- [0x979, 0x979], /* DEVANAGARI LETTER ZHA */
- [0x97a, 0x97a], /* DEVANAGARI LETTER HEAVY YA */
- [0x97b, 0x97b], /* DEVANAGARI LETTER GGA */
- [0x97c, 0x97c], /* DEVANAGARI LETTER JJA */
- [0x97d, 0x97d], /* DEVANAGARI LETTER GLOTTAL STOP */
- [0x97e, 0x97e], /* DEVANAGARI LETTER DDDA */
- [0x97f, 0x97f], /* DEVANAGARI LETTER BBA */
- [0x980, 0x980], /* BENGALI ANJI */
- [0x981, 0x981], /* BENGALI SIGN CANDRABINDU */
- [0x982, 0x982], /* BENGALI SIGN ANUSVARA */
- [0x983, 0x983], /* BENGALI SIGN VISARGA */
- [0x984, 0x984],
- [0x985, 0x985], /* BENGALI LETTER A */
- [0x986, 0x986], /* BENGALI LETTER AA */
- [0x987, 0x987], /* BENGALI LETTER I */
- [0x988, 0x988], /* BENGALI LETTER II */
- [0x989, 0x989], /* BENGALI LETTER U */
- [0x98a, 0x98a], /* BENGALI LETTER UU */
- [0x98b, 0x98b], /* BENGALI LETTER VOCALIC R */
- [0x98c, 0x98c], /* BENGALI LETTER VOCALIC L */
- [0x98d, 0x98d],
- [0x98e, 0x98e],
- [0x98f, 0x98f], /* BENGALI LETTER E */
- [0x990, 0x990], /* BENGALI LETTER AI */
- [0x991, 0x991],
- [0x992, 0x992],
- [0x993, 0x993], /* BENGALI LETTER O */
- [0x994, 0x994], /* BENGALI LETTER AU */
- [0x995, 0x995], /* BENGALI LETTER KA */
- [0x996, 0x996], /* BENGALI LETTER KHA */
- [0x997, 0x997], /* BENGALI LETTER GA */
- [0x998, 0x998], /* BENGALI LETTER GHA */
- [0x999, 0x999], /* BENGALI LETTER NGA */
- [0x99a, 0x99a], /* BENGALI LETTER CA */
- [0x99b, 0x99b], /* BENGALI LETTER CHA */
- [0x99c, 0x99c], /* BENGALI LETTER JA */
- [0x99d, 0x99d], /* BENGALI LETTER JHA */
- [0x99e, 0x99e], /* BENGALI LETTER NYA */
- [0x99f, 0x99f], /* BENGALI LETTER TTA */
- [0x9a0, 0x9a0], /* BENGALI LETTER TTHA */
- [0x9a1, 0x9a1], /* BENGALI LETTER DDA */
- [0x9a2, 0x9a2], /* BENGALI LETTER DDHA */
- [0x9a3, 0x9a3], /* BENGALI LETTER NNA */
- [0x9a4, 0x9a4], /* BENGALI LETTER TA */
- [0x9a5, 0x9a5], /* BENGALI LETTER THA */
- [0x9a6, 0x9a6], /* BENGALI LETTER DA */
- [0x9a7, 0x9a7], /* BENGALI LETTER DHA */
- [0x9a8, 0x9a8], /* BENGALI LETTER NA */
- [0x9a9, 0x9a9],
- [0x9aa, 0x9aa], /* BENGALI LETTER PA */
- [0x9ab, 0x9ab], /* BENGALI LETTER PHA */
- [0x9ac, 0x9ac], /* BENGALI LETTER BA */
- [0x9ad, 0x9ad], /* BENGALI LETTER BHA */
- [0x9ae, 0x9ae], /* BENGALI LETTER MA */
- [0x9af, 0x9af], /* BENGALI LETTER YA */
- [0x9b0, 0x9b0], /* BENGALI LETTER RA */
- [0x9b1, 0x9b1],
- [0x9b2, 0x9b2], /* BENGALI LETTER LA */
- [0x9b3, 0x9b3],
- [0x9b4, 0x9b4],
- [0x9b5, 0x9b5],
- [0x9b6, 0x9b6], /* BENGALI LETTER SHA */
- [0x9b7, 0x9b7], /* BENGALI LETTER SSA */
- [0x9b8, 0x9b8], /* BENGALI LETTER SA */
- [0x9b9, 0x9b9], /* BENGALI LETTER HA */
- [0x9ba, 0x9ba],
- [0x9bb, 0x9bb],
- [0x9bc, 0x9bc], /* BENGALI SIGN NUKTA */
- [0x9bd, 0x9bd], /* BENGALI SIGN AVAGRAHA */
- [0x9be, 0x9be], /* BENGALI VOWEL SIGN AA */
- [0x9bf, 0x9bf], /* BENGALI VOWEL SIGN I */
- [0x9c0, 0x9c0], /* BENGALI VOWEL SIGN II */
- [0x9c1, 0x9c1], /* BENGALI VOWEL SIGN U */
- [0x9c2, 0x9c2], /* BENGALI VOWEL SIGN UU */
- [0x9c3, 0x9c3], /* BENGALI VOWEL SIGN VOCALIC R */
- [0x9c4, 0x9c4], /* BENGALI VOWEL SIGN VOCALIC RR */
- [0x9c5, 0x9c5],
- [0x9c6, 0x9c6],
- [0x9c7, 0x9c7], /* BENGALI VOWEL SIGN E */
- [0x9c8, 0x9c8], /* BENGALI VOWEL SIGN AI */
- [0x9c9, 0x9c9],
- [0x9ca, 0x9ca],
- [0x9cb, 0x9cb], /* BENGALI VOWEL SIGN O */
- [0x9cc, 0x9cc], /* BENGALI VOWEL SIGN AU */
- [0x9cd, 0x9cd], /* BENGALI SIGN VIRAMA */
- [0x9ce, 0x9ce], /* BENGALI LETTER KHANDA TA */
- [0x9cf, 0x9cf],
- [0x9d0, 0x9d0],
- [0x9d1, 0x9d1],
- [0x9d2, 0x9d2],
- [0x9d3, 0x9d3],
- [0x9d4, 0x9d4],
- [0x9d5, 0x9d5],
- [0x9d6, 0x9d6],
- [0x9d7, 0x9d7], /* BENGALI AU LENGTH MARK */
- [0x9d8, 0x9d8],
- [0x9d9, 0x9d9],
- [0x9da, 0x9da],
- [0x9db, 0x9db],
- [0x9dc, 0x9dc], /* BENGALI LETTER RRA */
- [0x9dd, 0x9dd], /* BENGALI LETTER RHA */
- [0x9de, 0x9de],
- [0x9df, 0x9df], /* BENGALI LETTER YYA */
- [0x9e0, 0x9e0], /* BENGALI LETTER VOCALIC RR */
- [0x9e1, 0x9e1], /* BENGALI LETTER VOCALIC LL */
- [0x9e2, 0x9e2], /* BENGALI VOWEL SIGN VOCALIC L */
- [0x9e3, 0x9e3], /* BENGALI VOWEL SIGN VOCALIC LL */
- [0x9e4, 0x9e4],
- [0x9e5, 0x9e5],
- [0x9e6, 0x9e6], /* BENGALI DIGIT ZERO */
- [0x9e7, 0x9e7], /* BENGALI DIGIT ONE */
- [0x9e8, 0x9e8], /* BENGALI DIGIT TWO */
- [0x9e9, 0x9e9], /* BENGALI DIGIT THREE */
- [0x9ea, 0x9ea], /* BENGALI DIGIT FOUR */
- [0x9eb, 0x9eb], /* BENGALI DIGIT FIVE */
- [0x9ec, 0x9ec], /* BENGALI DIGIT SIX */
- [0x9ed, 0x9ed], /* BENGALI DIGIT SEVEN */
- [0x9ee, 0x9ee], /* BENGALI DIGIT EIGHT */
- [0x9ef, 0x9ef], /* BENGALI DIGIT NINE */
- [0x9f0, 0x9f0], /* BENGALI LETTER RA WITH MIDDLE DIAGONAL */
- [0x9f1, 0x9f1], /* BENGALI LETTER RA WITH LOWER DIAGONAL (BENGALI LETTER VA WITH LOWER DIAGONAL) */
- [0x9f2, 0x9f2], /* BENGALI RUPEE MARK */
- [0x9f3, 0x9f3], /* BENGALI RUPEE SIGN */
- [0x9f4, 0x9f4], /* BENGALI CURRENCY NUMERATOR ONE */
- [0x9f5, 0x9f5], /* BENGALI CURRENCY NUMERATOR TWO */
- [0x9f6, 0x9f6], /* BENGALI CURRENCY NUMERATOR THREE */
- [0x9f7, 0x9f7], /* BENGALI CURRENCY NUMERATOR FOUR */
- [0x9f8, 0x9f8], /* BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR */
- [0x9f9, 0x9f9], /* BENGALI CURRENCY DENOMINATOR SIXTEEN */
- [0x9fa, 0x9fa], /* BENGALI ISSHAR */
- [0x9fb, 0x9fb], /* BENGALI GANDA MARK */
- [0x9fc, 0x9fc], /* BENGALI LETTER VEDIC ANUSVARA */
- [0x9fd, 0x9fd], /* BENGALI ABBREVIATION SIGN */
- [0x9fe, 0x9fe], /* BENGALI SANDHI MARK */
- [0x9ff, 0x9ff],
- [0xa00, 0xa00],
- [0xa01, 0xa01], /* GURMUKHI SIGN ADAK BINDI */
- [0xa02, 0xa02], /* GURMUKHI SIGN BINDI */
- [0xa03, 0xa03], /* GURMUKHI SIGN VISARGA */
- [0xa04, 0xa04],
- [0xa05, 0xa05], /* GURMUKHI LETTER A */
- [0xa06, 0xa06], /* GURMUKHI LETTER AA */
- [0xa07, 0xa07], /* GURMUKHI LETTER I */
- [0xa08, 0xa08], /* GURMUKHI LETTER II */
- [0xa09, 0xa09], /* GURMUKHI LETTER U */
- [0xa0a, 0xa0a], /* GURMUKHI LETTER UU */
- [0xa0b, 0xa0b],
- [0xa0c, 0xa0c],
- [0xa0d, 0xa0d],
- [0xa0e, 0xa0e],
- [0xa0f, 0xa0f], /* GURMUKHI LETTER EE */
- [0xa10, 0xa10], /* GURMUKHI LETTER AI */
- [0xa11, 0xa11],
- [0xa12, 0xa12],
- [0xa13, 0xa13], /* GURMUKHI LETTER OO */
- [0xa14, 0xa14], /* GURMUKHI LETTER AU */
- [0xa15, 0xa15], /* GURMUKHI LETTER KA */
- [0xa16, 0xa16], /* GURMUKHI LETTER KHA */
- [0xa17, 0xa17], /* GURMUKHI LETTER GA */
- [0xa18, 0xa18], /* GURMUKHI LETTER GHA */
- [0xa19, 0xa19], /* GURMUKHI LETTER NGA */
- [0xa1a, 0xa1a], /* GURMUKHI LETTER CA */
- [0xa1b, 0xa1b], /* GURMUKHI LETTER CHA */
- [0xa1c, 0xa1c], /* GURMUKHI LETTER JA */
- [0xa1d, 0xa1d], /* GURMUKHI LETTER JHA */
- [0xa1e, 0xa1e], /* GURMUKHI LETTER NYA */
- [0xa1f, 0xa1f], /* GURMUKHI LETTER TTA */
- [0xa20, 0xa20], /* GURMUKHI LETTER TTHA */
- [0xa21, 0xa21], /* GURMUKHI LETTER DDA */
- [0xa22, 0xa22], /* GURMUKHI LETTER DDHA */
- [0xa23, 0xa23], /* GURMUKHI LETTER NNA */
- [0xa24, 0xa24], /* GURMUKHI LETTER TA */
- [0xa25, 0xa25], /* GURMUKHI LETTER THA */
- [0xa26, 0xa26], /* GURMUKHI LETTER DA */
- [0xa27, 0xa27], /* GURMUKHI LETTER DHA */
- [0xa28, 0xa28], /* GURMUKHI LETTER NA */
- [0xa29, 0xa29],
- [0xa2a, 0xa2a], /* GURMUKHI LETTER PA */
- [0xa2b, 0xa2b], /* GURMUKHI LETTER PHA */
- [0xa2c, 0xa2c], /* GURMUKHI LETTER BA */
- [0xa2d, 0xa2d], /* GURMUKHI LETTER BHA */
- [0xa2e, 0xa2e], /* GURMUKHI LETTER MA */
- [0xa2f, 0xa2f], /* GURMUKHI LETTER YA */
- [0xa30, 0xa30], /* GURMUKHI LETTER RA */
- [0xa31, 0xa31],
- [0xa32, 0xa32], /* GURMUKHI LETTER LA */
- [0xa33, 0xa33], /* GURMUKHI LETTER LLA */
- [0xa34, 0xa34],
- [0xa35, 0xa35], /* GURMUKHI LETTER VA */
- [0xa36, 0xa36], /* GURMUKHI LETTER SHA */
- [0xa37, 0xa37],
- [0xa38, 0xa38], /* GURMUKHI LETTER SA */
- [0xa39, 0xa39], /* GURMUKHI LETTER HA */
- [0xa3a, 0xa3a],
- [0xa3b, 0xa3b],
- [0xa3c, 0xa3c], /* GURMUKHI SIGN NUKTA */
- [0xa3d, 0xa3d],
- [0xa3e, 0xa3e], /* GURMUKHI VOWEL SIGN AA */
- [0xa3f, 0xa3f], /* GURMUKHI VOWEL SIGN I */
- [0xa40, 0xa40], /* GURMUKHI VOWEL SIGN II */
- [0xa41, 0xa41], /* GURMUKHI VOWEL SIGN U */
- [0xa42, 0xa42], /* GURMUKHI VOWEL SIGN UU */
- [0xa43, 0xa43],
- [0xa44, 0xa44],
- [0xa45, 0xa45],
- [0xa46, 0xa46],
- [0xa47, 0xa47], /* GURMUKHI VOWEL SIGN EE */
- [0xa48, 0xa48], /* GURMUKHI VOWEL SIGN AI */
- [0xa49, 0xa49],
- [0xa4a, 0xa4a],
- [0xa4b, 0xa4b], /* GURMUKHI VOWEL SIGN OO */
- [0xa4c, 0xa4c], /* GURMUKHI VOWEL SIGN AU */
- [0xa4d, 0xa4d], /* GURMUKHI SIGN VIRAMA */
- [0xa4e, 0xa4e],
- [0xa4f, 0xa4f],
- [0xa50, 0xa50],
- [0xa51, 0xa51], /* GURMUKHI SIGN UDAAT */
- [0xa52, 0xa52],
- [0xa53, 0xa53],
- [0xa54, 0xa54],
- [0xa55, 0xa55],
- [0xa56, 0xa56],
- [0xa57, 0xa57],
- [0xa58, 0xa58],
- [0xa59, 0xa59], /* GURMUKHI LETTER KHHA */
- [0xa5a, 0xa5a], /* GURMUKHI LETTER GHHA */
- [0xa5b, 0xa5b], /* GURMUKHI LETTER ZA */
- [0xa5c, 0xa5c], /* GURMUKHI LETTER RRA */
- [0xa5d, 0xa5d],
- [0xa5e, 0xa5e], /* GURMUKHI LETTER FA */
- [0xa5f, 0xa5f],
- [0xa60, 0xa60],
- [0xa61, 0xa61],
- [0xa62, 0xa62],
- [0xa63, 0xa63],
- [0xa64, 0xa64],
- [0xa65, 0xa65],
- [0xa66, 0xa66], /* GURMUKHI DIGIT ZERO */
- [0xa67, 0xa67], /* GURMUKHI DIGIT ONE */
- [0xa68, 0xa68], /* GURMUKHI DIGIT TWO */
- [0xa69, 0xa69], /* GURMUKHI DIGIT THREE */
- [0xa6a, 0xa6a], /* GURMUKHI DIGIT FOUR */
- [0xa6b, 0xa6b], /* GURMUKHI DIGIT FIVE */
- [0xa6c, 0xa6c], /* GURMUKHI DIGIT SIX */
- [0xa6d, 0xa6d], /* GURMUKHI DIGIT SEVEN */
- [0xa6e, 0xa6e], /* GURMUKHI DIGIT EIGHT */
- [0xa6f, 0xa6f], /* GURMUKHI DIGIT NINE */
- [0xa70, 0xa70], /* GURMUKHI TIPPI */
- [0xa71, 0xa71], /* GURMUKHI ADDAK */
- [0xa72, 0xa72], /* GURMUKHI IRI */
- [0xa73, 0xa73], /* GURMUKHI URA */
- [0xa74, 0xa74], /* GURMUKHI EK ONKAR */
- [0xa75, 0xa75], /* GURMUKHI SIGN YAKASH */
- [0xa76, 0xa76], /* GURMUKHI ABBREVIATION SIGN */
- [0xa77, 0xa77],
- [0xa78, 0xa78],
- [0xa79, 0xa79],
- [0xa7a, 0xa7a],
- [0xa7b, 0xa7b],
- [0xa7c, 0xa7c],
- [0xa7d, 0xa7d],
- [0xa7e, 0xa7e],
- [0xa7f, 0xa7f],
- [0xa80, 0xa80],
- [0xa81, 0xa81], /* GUJARATI SIGN CANDRABINDU */
- [0xa82, 0xa82], /* GUJARATI SIGN ANUSVARA */
- [0xa83, 0xa83], /* GUJARATI SIGN VISARGA */
- [0xa84, 0xa84],
- [0xa85, 0xa85], /* GUJARATI LETTER A */
- [0xa86, 0xa86], /* GUJARATI LETTER AA */
- [0xa87, 0xa87], /* GUJARATI LETTER I */
- [0xa88, 0xa88], /* GUJARATI LETTER II */
- [0xa89, 0xa89], /* GUJARATI LETTER U */
- [0xa8a, 0xa8a], /* GUJARATI LETTER UU */
- [0xa8b, 0xa8b], /* GUJARATI LETTER VOCALIC R */
- [0xa8c, 0xa8c], /* GUJARATI LETTER VOCALIC L */
- [0xa8d, 0xa8d], /* GUJARATI VOWEL CANDRA E */
- [0xa8e, 0xa8e],
- [0xa8f, 0xa8f], /* GUJARATI LETTER E */
- [0xa90, 0xa90], /* GUJARATI LETTER AI */
- [0xa91, 0xa91], /* GUJARATI VOWEL CANDRA O */
- [0xa92, 0xa92],
- [0xa93, 0xa93], /* GUJARATI LETTER O */
- [0xa94, 0xa94], /* GUJARATI LETTER AU */
- [0xa95, 0xa95], /* GUJARATI LETTER KA */
- [0xa96, 0xa96], /* GUJARATI LETTER KHA */
- [0xa97, 0xa97], /* GUJARATI LETTER GA */
- [0xa98, 0xa98], /* GUJARATI LETTER GHA */
- [0xa99, 0xa99], /* GUJARATI LETTER NGA */
- [0xa9a, 0xa9a], /* GUJARATI LETTER CA */
- [0xa9b, 0xa9b], /* GUJARATI LETTER CHA */
- [0xa9c, 0xa9c], /* GUJARATI LETTER JA */
- [0xa9d, 0xa9d], /* GUJARATI LETTER JHA */
- [0xa9e, 0xa9e], /* GUJARATI LETTER NYA */
- [0xa9f, 0xa9f], /* GUJARATI LETTER TTA */
- [0xaa0, 0xaa0], /* GUJARATI LETTER TTHA */
- [0xaa1, 0xaa1], /* GUJARATI LETTER DDA */
- [0xaa2, 0xaa2], /* GUJARATI LETTER DDHA */
- [0xaa3, 0xaa3], /* GUJARATI LETTER NNA */
- [0xaa4, 0xaa4], /* GUJARATI LETTER TA */
- [0xaa5, 0xaa5], /* GUJARATI LETTER THA */
- [0xaa6, 0xaa6], /* GUJARATI LETTER DA */
- [0xaa7, 0xaa7], /* GUJARATI LETTER DHA */
- [0xaa8, 0xaa8], /* GUJARATI LETTER NA */
- [0xaa9, 0xaa9],
- [0xaaa, 0xaaa], /* GUJARATI LETTER PA */
- [0xaab, 0xaab], /* GUJARATI LETTER PHA */
- [0xaac, 0xaac], /* GUJARATI LETTER BA */
- [0xaad, 0xaad], /* GUJARATI LETTER BHA */
- [0xaae, 0xaae], /* GUJARATI LETTER MA */
- [0xaaf, 0xaaf], /* GUJARATI LETTER YA */
- [0xab0, 0xab0], /* GUJARATI LETTER RA */
- [0xab1, 0xab1],
- [0xab2, 0xab2], /* GUJARATI LETTER LA */
- [0xab3, 0xab3], /* GUJARATI LETTER LLA */
- [0xab4, 0xab4],
- [0xab5, 0xab5], /* GUJARATI LETTER VA */
- [0xab6, 0xab6], /* GUJARATI LETTER SHA */
- [0xab7, 0xab7], /* GUJARATI LETTER SSA */
- [0xab8, 0xab8], /* GUJARATI LETTER SA */
- [0xab9, 0xab9], /* GUJARATI LETTER HA */
- [0xaba, 0xaba],
- [0xabb, 0xabb],
- [0xabc, 0xabc], /* GUJARATI SIGN NUKTA */
- [0xabd, 0xabd], /* GUJARATI SIGN AVAGRAHA */
- [0xabe, 0xabe], /* GUJARATI VOWEL SIGN AA */
- [0xabf, 0xabf], /* GUJARATI VOWEL SIGN I */
- [0xac0, 0xac0], /* GUJARATI VOWEL SIGN II */
- [0xac1, 0xac1], /* GUJARATI VOWEL SIGN U */
- [0xac2, 0xac2], /* GUJARATI VOWEL SIGN UU */
- [0xac3, 0xac3], /* GUJARATI VOWEL SIGN VOCALIC R */
- [0xac4, 0xac4], /* GUJARATI VOWEL SIGN VOCALIC RR */
- [0xac5, 0xac5], /* GUJARATI VOWEL SIGN CANDRA E */
- [0xac6, 0xac6],
- [0xac7, 0xac7], /* GUJARATI VOWEL SIGN E */
- [0xac8, 0xac8], /* GUJARATI VOWEL SIGN AI */
- [0xac9, 0xac9], /* GUJARATI VOWEL SIGN CANDRA O */
- [0xaca, 0xaca],
- [0xacb, 0xacb], /* GUJARATI VOWEL SIGN O */
- [0xacc, 0xacc], /* GUJARATI VOWEL SIGN AU */
- [0xacd, 0xacd], /* GUJARATI SIGN VIRAMA */
- [0xace, 0xace],
- [0xacf, 0xacf],
- [0xad0, 0xad0], /* GUJARATI OM */
- [0xad1, 0xad1],
- [0xad2, 0xad2],
- [0xad3, 0xad3],
- [0xad4, 0xad4],
- [0xad5, 0xad5],
- [0xad6, 0xad6],
- [0xad7, 0xad7],
- [0xad8, 0xad8],
- [0xad9, 0xad9],
- [0xada, 0xada],
- [0xadb, 0xadb],
- [0xadc, 0xadc],
- [0xadd, 0xadd],
- [0xade, 0xade],
- [0xadf, 0xadf],
- [0xae0, 0xae0], /* GUJARATI LETTER VOCALIC RR */
- [0xae1, 0xae1], /* GUJARATI LETTER VOCALIC LL */
- [0xae2, 0xae2], /* GUJARATI VOWEL SIGN VOCALIC L */
- [0xae3, 0xae3], /* GUJARATI VOWEL SIGN VOCALIC LL */
- [0xae4, 0xae4],
- [0xae5, 0xae5],
- [0xae6, 0xae6], /* GUJARATI DIGIT ZERO */
- [0xae7, 0xae7], /* GUJARATI DIGIT ONE */
- [0xae8, 0xae8], /* GUJARATI DIGIT TWO */
- [0xae9, 0xae9], /* GUJARATI DIGIT THREE */
- [0xaea, 0xaea], /* GUJARATI DIGIT FOUR */
- [0xaeb, 0xaeb], /* GUJARATI DIGIT FIVE */
- [0xaec, 0xaec], /* GUJARATI DIGIT SIX */
- [0xaed, 0xaed], /* GUJARATI DIGIT SEVEN */
- [0xaee, 0xaee], /* GUJARATI DIGIT EIGHT */
- [0xaef, 0xaef], /* GUJARATI DIGIT NINE */
- [0xaf0, 0xaf0], /* GUJARATI ABBREVIATION SIGN */
- [0xaf1, 0xaf1], /* GUJARATI RUPEE SIGN */
- [0xaf2, 0xaf2],
- [0xaf3, 0xaf3],
- [0xaf4, 0xaf4],
- [0xaf5, 0xaf5],
- [0xaf6, 0xaf6],
- [0xaf7, 0xaf7],
- [0xaf8, 0xaf8],
- [0xaf9, 0xaf9], /* GUJARATI LETTER ZHA */
- [0xafa, 0xafa], /* GUJARATI SIGN SUKUN */
- [0xafb, 0xafb], /* GUJARATI SIGN SHADDA */
- [0xafc, 0xafc], /* GUJARATI SIGN MADDAH */
- [0xafd, 0xafd], /* GUJARATI SIGN THREE-DOT NUKTA ABOVE */
- [0xafe, 0xafe], /* GUJARATI SIGN CIRCLE NUKTA ABOVE */
- [0xaff, 0xaff], /* GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE */
- [0xb00, 0xb00],
- [0xb01, 0xb01], /* ORIYA SIGN CANDRABINDU */
- [0xb02, 0xb02], /* ORIYA SIGN ANUSVARA */
- [0xb03, 0xb03], /* ORIYA SIGN VISARGA */
- [0xb04, 0xb04],
- [0xb05, 0xb05], /* ORIYA LETTER A */
- [0xb06, 0xb06], /* ORIYA LETTER AA */
- [0xb07, 0xb07], /* ORIYA LETTER I */
- [0xb08, 0xb08], /* ORIYA LETTER II */
- [0xb09, 0xb09], /* ORIYA LETTER U */
- [0xb0a, 0xb0a], /* ORIYA LETTER UU */
- [0xb0b, 0xb0b], /* ORIYA LETTER VOCALIC R */
- [0xb0c, 0xb0c], /* ORIYA LETTER VOCALIC L */
- [0xb0d, 0xb0d],
- [0xb0e, 0xb0e],
- [0xb0f, 0xb0f], /* ORIYA LETTER E */
- [0xb10, 0xb10], /* ORIYA LETTER AI */
- [0xb11, 0xb11],
- [0xb12, 0xb12],
- [0xb13, 0xb13], /* ORIYA LETTER O */
- [0xb14, 0xb14], /* ORIYA LETTER AU */
- [0xb15, 0xb15], /* ORIYA LETTER KA */
- [0xb16, 0xb16], /* ORIYA LETTER KHA */
- [0xb17, 0xb17], /* ORIYA LETTER GA */
- [0xb18, 0xb18], /* ORIYA LETTER GHA */
- [0xb19, 0xb19], /* ORIYA LETTER NGA */
- [0xb1a, 0xb1a], /* ORIYA LETTER CA */
- [0xb1b, 0xb1b], /* ORIYA LETTER CHA */
- [0xb1c, 0xb1c], /* ORIYA LETTER JA */
- [0xb1d, 0xb1d], /* ORIYA LETTER JHA */
- [0xb1e, 0xb1e], /* ORIYA LETTER NYA */
- [0xb1f, 0xb1f], /* ORIYA LETTER TTA */
- [0xb20, 0xb20], /* ORIYA LETTER TTHA */
- [0xb21, 0xb21], /* ORIYA LETTER DDA */
- [0xb22, 0xb22], /* ORIYA LETTER DDHA */
- [0xb23, 0xb23], /* ORIYA LETTER NNA */
- [0xb24, 0xb24], /* ORIYA LETTER TA */
- [0xb25, 0xb25], /* ORIYA LETTER THA */
- [0xb26, 0xb26], /* ORIYA LETTER DA */
- [0xb27, 0xb27], /* ORIYA LETTER DHA */
- [0xb28, 0xb28], /* ORIYA LETTER NA */
- [0xb29, 0xb29],
- [0xb2a, 0xb2a], /* ORIYA LETTER PA */
- [0xb2b, 0xb2b], /* ORIYA LETTER PHA */
- [0xb2c, 0xb2c], /* ORIYA LETTER BA */
- [0xb2d, 0xb2d], /* ORIYA LETTER BHA */
- [0xb2e, 0xb2e], /* ORIYA LETTER MA */
- [0xb2f, 0xb2f], /* ORIYA LETTER YA */
- [0xb30, 0xb30], /* ORIYA LETTER RA */
- [0xb31, 0xb31],
- [0xb32, 0xb32], /* ORIYA LETTER LA */
- [0xb33, 0xb33], /* ORIYA LETTER LLA */
- [0xb34, 0xb34],
- [0xb35, 0xb35], /* ORIYA LETTER VA */
- [0xb36, 0xb36], /* ORIYA LETTER SHA */
- [0xb37, 0xb37], /* ORIYA LETTER SSA */
- [0xb38, 0xb38], /* ORIYA LETTER SA */
- [0xb39, 0xb39], /* ORIYA LETTER HA */
- [0xb3a, 0xb3a],
- [0xb3b, 0xb3b],
- [0xb3c, 0xb3c], /* ORIYA SIGN NUKTA */
- [0xb3d, 0xb3d], /* ORIYA SIGN AVAGRAHA */
- [0xb3e, 0xb3e], /* ORIYA VOWEL SIGN AA */
- [0xb3f, 0xb3f], /* ORIYA VOWEL SIGN I */
- [0xb40, 0xb40], /* ORIYA VOWEL SIGN II */
- [0xb41, 0xb41], /* ORIYA VOWEL SIGN U */
- [0xb42, 0xb42], /* ORIYA VOWEL SIGN UU */
- [0xb43, 0xb43], /* ORIYA VOWEL SIGN VOCALIC R */
- [0xb44, 0xb44], /* ORIYA VOWEL SIGN VOCALIC RR */
- [0xb45, 0xb45],
- [0xb46, 0xb46],
- [0xb47, 0xb47], /* ORIYA VOWEL SIGN E */
- [0xb48, 0xb48], /* ORIYA VOWEL SIGN AI */
- [0xb49, 0xb49],
- [0xb4a, 0xb4a],
- [0xb4b, 0xb4b], /* ORIYA VOWEL SIGN O */
- [0xb4c, 0xb4c], /* ORIYA VOWEL SIGN AU */
- [0xb4d, 0xb4d], /* ORIYA SIGN VIRAMA */
- [0xb4e, 0xb4e],
- [0xb4f, 0xb4f],
- [0xb50, 0xb50],
- [0xb51, 0xb51],
- [0xb52, 0xb52],
- [0xb53, 0xb53],
- [0xb54, 0xb54],
- [0xb55, 0xb55],
- [0xb56, 0xb56], /* ORIYA AI LENGTH MARK */
- [0xb57, 0xb57], /* ORIYA AU LENGTH MARK */
- [0xb58, 0xb58],
- [0xb59, 0xb59],
- [0xb5a, 0xb5a],
- [0xb5b, 0xb5b],
- [0xb5c, 0xb5c], /* ORIYA LETTER RRA */
- [0xb5d, 0xb5d], /* ORIYA LETTER RHA */
- [0xb5e, 0xb5e],
- [0xb5f, 0xb5f], /* ORIYA LETTER YYA */
- [0xb60, 0xb60], /* ORIYA LETTER VOCALIC RR */
- [0xb61, 0xb61], /* ORIYA LETTER VOCALIC LL */
- [0xb62, 0xb62], /* ORIYA VOWEL SIGN VOCALIC L */
- [0xb63, 0xb63], /* ORIYA VOWEL SIGN VOCALIC LL */
- [0xb64, 0xb64],
- [0xb65, 0xb65],
- [0xb66, 0xb66], /* ORIYA DIGIT ZERO */
- [0xb67, 0xb67], /* ORIYA DIGIT ONE */
- [0xb68, 0xb68], /* ORIYA DIGIT TWO */
- [0xb69, 0xb69], /* ORIYA DIGIT THREE */
- [0xb6a, 0xb6a], /* ORIYA DIGIT FOUR */
- [0xb6b, 0xb6b], /* ORIYA DIGIT FIVE */
- [0xb6c, 0xb6c], /* ORIYA DIGIT SIX */
- [0xb6d, 0xb6d], /* ORIYA DIGIT SEVEN */
- [0xb6e, 0xb6e], /* ORIYA DIGIT EIGHT */
- [0xb6f, 0xb6f], /* ORIYA DIGIT NINE */
- [0xb70, 0xb70], /* ORIYA ISSHAR */
- [0xb71, 0xb71], /* ORIYA LETTER WA */
- [0xb72, 0xb72], /* ORIYA FRACTION ONE QUARTER */
- [0xb73, 0xb73], /* ORIYA FRACTION ONE HALF */
- [0xb74, 0xb74], /* ORIYA FRACTION THREE QUARTERS */
- [0xb75, 0xb75], /* ORIYA FRACTION ONE SIXTEENTH */
- [0xb76, 0xb76], /* ORIYA FRACTION ONE EIGHTH */
- [0xb77, 0xb77], /* ORIYA FRACTION THREE SIXTEENTHS */
- [0xb78, 0xb78],
- [0xb79, 0xb79],
- [0xb7a, 0xb7a],
- [0xb7b, 0xb7b],
- [0xb7c, 0xb7c],
- [0xb7d, 0xb7d],
- [0xb7e, 0xb7e],
- [0xb7f, 0xb7f],
- [0xb80, 0xb80],
- [0xb81, 0xb81],
- [0xb82, 0xb82], /* TAMIL SIGN ANUSVARA */
- [0xb83, 0xb83], /* TAMIL SIGN VISARGA */
- [0xb84, 0xb84],
- [0xb85, 0xb85], /* TAMIL LETTER A */
- [0xb86, 0xb86], /* TAMIL LETTER AA */
- [0xb87, 0xb87], /* TAMIL LETTER I */
- [0xb88, 0xb88], /* TAMIL LETTER II */
- [0xb89, 0xb89], /* TAMIL LETTER U */
- [0xb8a, 0xb8a], /* TAMIL LETTER UU */
- [0xb8b, 0xb8b],
- [0xb8c, 0xb8c],
- [0xb8d, 0xb8d],
- [0xb8e, 0xb8e], /* TAMIL LETTER E */
- [0xb8f, 0xb8f], /* TAMIL LETTER EE */
- [0xb90, 0xb90], /* TAMIL LETTER AI */
- [0xb91, 0xb91],
- [0xb92, 0xb92], /* TAMIL LETTER O */
- [0xb93, 0xb93], /* TAMIL LETTER OO */
- [0xb94, 0xb94], /* TAMIL LETTER AU */
- [0xb95, 0xb95], /* TAMIL LETTER KA */
- [0xb96, 0xb96],
- [0xb97, 0xb97],
- [0xb98, 0xb98],
- [0xb99, 0xb99], /* TAMIL LETTER NGA */
- [0xb9a, 0xb9a], /* TAMIL LETTER CA */
- [0xb9b, 0xb9b],
- [0xb9c, 0xb9c], /* TAMIL LETTER JA */
- [0xb9d, 0xb9d],
- [0xb9e, 0xb9e], /* TAMIL LETTER NYA */
- [0xb9f, 0xb9f], /* TAMIL LETTER TTA */
- [0xba0, 0xba0],
- [0xba1, 0xba1],
- [0xba2, 0xba2],
- [0xba3, 0xba3], /* TAMIL LETTER NNA */
- [0xba4, 0xba4], /* TAMIL LETTER TA */
- [0xba5, 0xba5],
- [0xba6, 0xba6],
- [0xba7, 0xba7],
- [0xba8, 0xba8], /* TAMIL LETTER NA */
- [0xba9, 0xba9], /* TAMIL LETTER NNNA */
- [0xbaa, 0xbaa], /* TAMIL LETTER PA */
- [0xbab, 0xbab],
- [0xbac, 0xbac],
- [0xbad, 0xbad],
- [0xbae, 0xbae], /* TAMIL LETTER MA */
- [0xbaf, 0xbaf], /* TAMIL LETTER YA */
- [0xbb0, 0xbb0], /* TAMIL LETTER RA */
- [0xbb1, 0xbb1], /* TAMIL LETTER RRA */
- [0xbb2, 0xbb2], /* TAMIL LETTER LA */
- [0xbb3, 0xbb3], /* TAMIL LETTER LLA */
- [0xbb4, 0xbb4], /* TAMIL LETTER LLLA */
- [0xbb5, 0xbb5], /* TAMIL LETTER VA */
- [0xbb6, 0xbb6], /* TAMIL LETTER SHA */
- [0xbb7, 0xbb7], /* TAMIL LETTER SSA */
- [0xbb8, 0xbb8], /* TAMIL LETTER SA */
- [0xbb9, 0xbb9], /* TAMIL LETTER HA */
- [0xbba, 0xbba],
- [0xbbb, 0xbbb],
- [0xbbc, 0xbbc],
- [0xbbd, 0xbbd],
- [0xbbe, 0xbbe], /* TAMIL VOWEL SIGN AA */
- [0xbbf, 0xbbf], /* TAMIL VOWEL SIGN I */
- [0xbc0, 0xbc0], /* TAMIL VOWEL SIGN II */
- [0xbc1, 0xbc1], /* TAMIL VOWEL SIGN U */
- [0xbc2, 0xbc2], /* TAMIL VOWEL SIGN UU */
- [0xbc3, 0xbc3],
- [0xbc4, 0xbc4],
- [0xbc5, 0xbc5],
- [0xbc6, 0xbc6], /* TAMIL VOWEL SIGN E */
- [0xbc7, 0xbc7], /* TAMIL VOWEL SIGN EE */
- [0xbc8, 0xbc8], /* TAMIL VOWEL SIGN AI */
- [0xbc9, 0xbc9],
- [0xbca, 0xbca], /* TAMIL VOWEL SIGN O */
- [0xbcb, 0xbcb], /* TAMIL VOWEL SIGN OO */
- [0xbcc, 0xbcc], /* TAMIL VOWEL SIGN AU */
- [0xbcd, 0xbcd], /* TAMIL SIGN VIRAMA */
- [0xbce, 0xbce],
- [0xbcf, 0xbcf],
- [0xbd0, 0xbd0], /* TAMIL OM */
- [0xbd1, 0xbd1],
- [0xbd2, 0xbd2],
- [0xbd3, 0xbd3],
- [0xbd4, 0xbd4],
- [0xbd5, 0xbd5],
- [0xbd6, 0xbd6],
- [0xbd7, 0xbd7], /* TAMIL AU LENGTH MARK */
- [0xbd8, 0xbd8],
- [0xbd9, 0xbd9],
- [0xbda, 0xbda],
- [0xbdb, 0xbdb],
- [0xbdc, 0xbdc],
- [0xbdd, 0xbdd],
- [0xbde, 0xbde],
- [0xbdf, 0xbdf],
- [0xbe0, 0xbe0],
- [0xbe1, 0xbe1],
- [0xbe2, 0xbe2],
- [0xbe3, 0xbe3],
- [0xbe4, 0xbe4],
- [0xbe5, 0xbe5],
- [0xbe6, 0xbe6], /* TAMIL DIGIT ZERO */
- [0xbe7, 0xbe7], /* TAMIL DIGIT ONE */
- [0xbe8, 0xbe8], /* TAMIL DIGIT TWO */
- [0xbe9, 0xbe9], /* TAMIL DIGIT THREE */
- [0xbea, 0xbea], /* TAMIL DIGIT FOUR */
- [0xbeb, 0xbeb], /* TAMIL DIGIT FIVE */
- [0xbec, 0xbec], /* TAMIL DIGIT SIX */
- [0xbed, 0xbed], /* TAMIL DIGIT SEVEN */
- [0xbee, 0xbee], /* TAMIL DIGIT EIGHT */
- [0xbef, 0xbef], /* TAMIL DIGIT NINE */
- [0xbf0, 0xbf0], /* TAMIL NUMBER TEN */
- [0xbf1, 0xbf1], /* TAMIL NUMBER ONE HUNDRED */
- [0xbf2, 0xbf2], /* TAMIL NUMBER ONE THOUSAND */
- [0xbf3, 0xbf3], /* TAMIL DAY SIGN */
- [0xbf4, 0xbf4], /* TAMIL MONTH SIGN */
- [0xbf5, 0xbf5], /* TAMIL YEAR SIGN */
- [0xbf6, 0xbf6], /* TAMIL DEBIT SIGN */
- [0xbf7, 0xbf7], /* TAMIL CREDIT SIGN */
- [0xbf8, 0xbf8], /* TAMIL AS ABOVE SIGN */
- [0xbf9, 0xbf9], /* TAMIL RUPEE SIGN */
- [0xbfa, 0xbfa], /* TAMIL NUMBER SIGN */
- [0xbfb, 0xbfb],
- [0xbfc, 0xbfc],
- [0xbfd, 0xbfd],
- [0xbfe, 0xbfe],
- [0xbff, 0xbff],
- [0xc00, 0xc00], /* TELUGU SIGN COMBINING CANDRABINDU ABOVE */
- [0xc01, 0xc01], /* TELUGU SIGN CANDRABINDU */
- [0xc02, 0xc02], /* TELUGU SIGN ANUSVARA */
- [0xc03, 0xc03], /* TELUGU SIGN VISARGA */
- [0xc04, 0xc04], /* TELUGU SIGN COMBINING ANUSVARA ABOVE */
- [0xc05, 0xc05], /* TELUGU LETTER A */
- [0xc06, 0xc06], /* TELUGU LETTER AA */
- [0xc07, 0xc07], /* TELUGU LETTER I */
- [0xc08, 0xc08], /* TELUGU LETTER II */
- [0xc09, 0xc09], /* TELUGU LETTER U */
- [0xc0a, 0xc0a], /* TELUGU LETTER UU */
- [0xc0b, 0xc0b], /* TELUGU LETTER VOCALIC R */
- [0xc0c, 0xc0c], /* TELUGU LETTER VOCALIC L */
- [0xc0d, 0xc0d],
- [0xc0e, 0xc0e], /* TELUGU LETTER E */
- [0xc0f, 0xc0f], /* TELUGU LETTER EE */
- [0xc10, 0xc10], /* TELUGU LETTER AI */
- [0xc11, 0xc11],
- [0xc12, 0xc12], /* TELUGU LETTER O */
- [0xc13, 0xc13], /* TELUGU LETTER OO */
- [0xc14, 0xc14], /* TELUGU LETTER AU */
- [0xc15, 0xc15], /* TELUGU LETTER KA */
- [0xc16, 0xc16], /* TELUGU LETTER KHA */
- [0xc17, 0xc17], /* TELUGU LETTER GA */
- [0xc18, 0xc18], /* TELUGU LETTER GHA */
- [0xc19, 0xc19], /* TELUGU LETTER NGA */
- [0xc1a, 0xc1a], /* TELUGU LETTER CA */
- [0xc1b, 0xc1b], /* TELUGU LETTER CHA */
- [0xc1c, 0xc1c], /* TELUGU LETTER JA */
- [0xc1d, 0xc1d], /* TELUGU LETTER JHA */
- [0xc1e, 0xc1e], /* TELUGU LETTER NYA */
- [0xc1f, 0xc1f], /* TELUGU LETTER TTA */
- [0xc20, 0xc20], /* TELUGU LETTER TTHA */
- [0xc21, 0xc21], /* TELUGU LETTER DDA */
- [0xc22, 0xc22], /* TELUGU LETTER DDHA */
- [0xc23, 0xc23], /* TELUGU LETTER NNA */
- [0xc24, 0xc24], /* TELUGU LETTER TA */
- [0xc25, 0xc25], /* TELUGU LETTER THA */
- [0xc26, 0xc26], /* TELUGU LETTER DA */
- [0xc27, 0xc27], /* TELUGU LETTER DHA */
- [0xc28, 0xc28], /* TELUGU LETTER NA */
- [0xc29, 0xc29],
- [0xc2a, 0xc2a], /* TELUGU LETTER PA */
- [0xc2b, 0xc2b], /* TELUGU LETTER PHA */
- [0xc2c, 0xc2c], /* TELUGU LETTER BA */
- [0xc2d, 0xc2d], /* TELUGU LETTER BHA */
- [0xc2e, 0xc2e], /* TELUGU LETTER MA */
- [0xc2f, 0xc2f], /* TELUGU LETTER YA */
- [0xc30, 0xc30], /* TELUGU LETTER RA */
- [0xc31, 0xc31], /* TELUGU LETTER RRA */
- [0xc32, 0xc32], /* TELUGU LETTER LA */
- [0xc33, 0xc33], /* TELUGU LETTER LLA */
- [0xc34, 0xc34], /* TELUGU LETTER LLLA */
- [0xc35, 0xc35], /* TELUGU LETTER VA */
- [0xc36, 0xc36], /* TELUGU LETTER SHA */
- [0xc37, 0xc37], /* TELUGU LETTER SSA */
- [0xc38, 0xc38], /* TELUGU LETTER SA */
- [0xc39, 0xc39], /* TELUGU LETTER HA */
- [0xc3a, 0xc3a],
- [0xc3b, 0xc3b],
- [0xc3c, 0xc3c],
- [0xc3d, 0xc3d], /* TELUGU SIGN AVAGRAHA */
- [0xc3e, 0xc3e], /* TELUGU VOWEL SIGN AA */
- [0xc3f, 0xc3f], /* TELUGU VOWEL SIGN I */
- [0xc40, 0xc40], /* TELUGU VOWEL SIGN II */
- [0xc41, 0xc41], /* TELUGU VOWEL SIGN U */
- [0xc42, 0xc42], /* TELUGU VOWEL SIGN UU */
- [0xc43, 0xc43], /* TELUGU VOWEL SIGN VOCALIC R */
- [0xc44, 0xc44], /* TELUGU VOWEL SIGN VOCALIC RR */
- [0xc45, 0xc45],
- [0xc46, 0xc46], /* TELUGU VOWEL SIGN E */
- [0xc47, 0xc47], /* TELUGU VOWEL SIGN EE */
- [0xc48, 0xc48], /* TELUGU VOWEL SIGN AI */
- [0xc49, 0xc49],
- [0xc4a, 0xc4a], /* TELUGU VOWEL SIGN O */
- [0xc4b, 0xc4b], /* TELUGU VOWEL SIGN OO */
- [0xc4c, 0xc4c], /* TELUGU VOWEL SIGN AU */
- [0xc4d, 0xc4d], /* TELUGU SIGN VIRAMA */
- [0xc4e, 0xc4e],
- [0xc4f, 0xc4f],
- [0xc50, 0xc50],
- [0xc51, 0xc51],
- [0xc52, 0xc52],
- [0xc53, 0xc53],
- [0xc54, 0xc54],
- [0xc55, 0xc55], /* TELUGU LENGTH MARK */
- [0xc56, 0xc56], /* TELUGU AI LENGTH MARK */
- [0xc57, 0xc57],
- [0xc58, 0xc58], /* TELUGU LETTER TSA */
- [0xc59, 0xc59], /* TELUGU LETTER DZA */
- [0xc5a, 0xc5a], /* TELUGU LETTER RRRA */
- [0xc5b, 0xc5b],
- [0xc5c, 0xc5c],
- [0xc5d, 0xc5d],
- [0xc5e, 0xc5e],
- [0xc5f, 0xc5f],
- [0xc60, 0xc60], /* TELUGU LETTER VOCALIC RR */
- [0xc61, 0xc61], /* TELUGU LETTER VOCALIC LL */
- [0xc62, 0xc62], /* TELUGU VOWEL SIGN VOCALIC L */
- [0xc63, 0xc63], /* TELUGU VOWEL SIGN VOCALIC LL */
- [0xc64, 0xc64],
- [0xc65, 0xc65],
- [0xc66, 0xc66], /* TELUGU DIGIT ZERO */
- [0xc67, 0xc67], /* TELUGU DIGIT ONE */
- [0xc68, 0xc68], /* TELUGU DIGIT TWO */
- [0xc69, 0xc69], /* TELUGU DIGIT THREE */
- [0xc6a, 0xc6a], /* TELUGU DIGIT FOUR */
- [0xc6b, 0xc6b], /* TELUGU DIGIT FIVE */
- [0xc6c, 0xc6c], /* TELUGU DIGIT SIX */
- [0xc6d, 0xc6d], /* TELUGU DIGIT SEVEN */
- [0xc6e, 0xc6e], /* TELUGU DIGIT EIGHT */
- [0xc6f, 0xc6f], /* TELUGU DIGIT NINE */
- [0xc70, 0xc70],
- [0xc71, 0xc71],
- [0xc72, 0xc72],
- [0xc73, 0xc73],
- [0xc74, 0xc74],
- [0xc75, 0xc75],
- [0xc76, 0xc76],
- [0xc77, 0xc77],
- [0xc78, 0xc78], /* TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR */
- [0xc79, 0xc79], /* TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR */
- [0xc7a, 0xc7a], /* TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR */
- [0xc7b, 0xc7b], /* TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR */
- [0xc7c, 0xc7c], /* TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR */
- [0xc7d, 0xc7d], /* TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR */
- [0xc7e, 0xc7e], /* TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR */
- [0xc7f, 0xc7f], /* TELUGU SIGN TUUMU */
- [0xc80, 0xc80], /* KANNADA SIGN SPACING CANDRABINDU */
- [0xc81, 0xc81], /* KANNADA SIGN CANDRABINDU */
- [0xc82, 0xc82], /* KANNADA SIGN ANUSVARA */
- [0xc83, 0xc83], /* KANNADA SIGN VISARGA */
- [0xc84, 0xc84], /* KANNADA SIGN SIDDHAM */
- [0xc85, 0xc85], /* KANNADA LETTER A */
- [0xc86, 0xc86], /* KANNADA LETTER AA */
- [0xc87, 0xc87], /* KANNADA LETTER I */
- [0xc88, 0xc88], /* KANNADA LETTER II */
- [0xc89, 0xc89], /* KANNADA LETTER U */
- [0xc8a, 0xc8a], /* KANNADA LETTER UU */
- [0xc8b, 0xc8b], /* KANNADA LETTER VOCALIC R */
- [0xc8c, 0xc8c], /* KANNADA LETTER VOCALIC L */
- [0xc8d, 0xc8d],
- [0xc8e, 0xc8e], /* KANNADA LETTER E */
- [0xc8f, 0xc8f], /* KANNADA LETTER EE */
- [0xc90, 0xc90], /* KANNADA LETTER AI */
- [0xc91, 0xc91],
- [0xc92, 0xc92], /* KANNADA LETTER O */
- [0xc93, 0xc93], /* KANNADA LETTER OO */
- [0xc94, 0xc94], /* KANNADA LETTER AU */
- [0xc95, 0xc95], /* KANNADA LETTER KA */
- [0xc96, 0xc96], /* KANNADA LETTER KHA */
- [0xc97, 0xc97], /* KANNADA LETTER GA */
- [0xc98, 0xc98], /* KANNADA LETTER GHA */
- [0xc99, 0xc99], /* KANNADA LETTER NGA */
- [0xc9a, 0xc9a], /* KANNADA LETTER CA */
- [0xc9b, 0xc9b], /* KANNADA LETTER CHA */
- [0xc9c, 0xc9c], /* KANNADA LETTER JA */
- [0xc9d, 0xc9d], /* KANNADA LETTER JHA */
- [0xc9e, 0xc9e], /* KANNADA LETTER NYA */
- [0xc9f, 0xc9f], /* KANNADA LETTER TTA */
- [0xca0, 0xca0], /* KANNADA LETTER TTHA */
- [0xca1, 0xca1], /* KANNADA LETTER DDA */
- [0xca2, 0xca2], /* KANNADA LETTER DDHA */
- [0xca3, 0xca3], /* KANNADA LETTER NNA */
- [0xca4, 0xca4], /* KANNADA LETTER TA */
- [0xca5, 0xca5], /* KANNADA LETTER THA */
- [0xca6, 0xca6], /* KANNADA LETTER DA */
- [0xca7, 0xca7], /* KANNADA LETTER DHA */
- [0xca8, 0xca8], /* KANNADA LETTER NA */
- [0xca9, 0xca9],
- [0xcaa, 0xcaa], /* KANNADA LETTER PA */
- [0xcab, 0xcab], /* KANNADA LETTER PHA */
- [0xcac, 0xcac], /* KANNADA LETTER BA */
- [0xcad, 0xcad], /* KANNADA LETTER BHA */
- [0xcae, 0xcae], /* KANNADA LETTER MA */
- [0xcaf, 0xcaf], /* KANNADA LETTER YA */
- [0xcb0, 0xcb0], /* KANNADA LETTER RA */
- [0xcb1, 0xcb1], /* KANNADA LETTER RRA */
- [0xcb2, 0xcb2], /* KANNADA LETTER LA */
- [0xcb3, 0xcb3], /* KANNADA LETTER LLA */
- [0xcb4, 0xcb4],
- [0xcb5, 0xcb5], /* KANNADA LETTER VA */
- [0xcb6, 0xcb6], /* KANNADA LETTER SHA */
- [0xcb7, 0xcb7], /* KANNADA LETTER SSA */
- [0xcb8, 0xcb8], /* KANNADA LETTER SA */
- [0xcb9, 0xcb9], /* KANNADA LETTER HA */
- [0xcba, 0xcba],
- [0xcbb, 0xcbb],
- [0xcbc, 0xcbc], /* KANNADA SIGN NUKTA */
- [0xcbd, 0xcbd], /* KANNADA SIGN AVAGRAHA */
- [0xcbe, 0xcbe], /* KANNADA VOWEL SIGN AA */
- [0xcbf, 0xcbf], /* KANNADA VOWEL SIGN I */
- [0xcc0, 0xcc0], /* KANNADA VOWEL SIGN II */
- [0xcc1, 0xcc1], /* KANNADA VOWEL SIGN U */
- [0xcc2, 0xcc2], /* KANNADA VOWEL SIGN UU */
- [0xcc3, 0xcc3], /* KANNADA VOWEL SIGN VOCALIC R */
- [0xcc4, 0xcc4], /* KANNADA VOWEL SIGN VOCALIC RR */
- [0xcc5, 0xcc5],
- [0xcc6, 0xcc6], /* KANNADA VOWEL SIGN E */
- [0xcc7, 0xcc7], /* KANNADA VOWEL SIGN EE */
- [0xcc8, 0xcc8], /* KANNADA VOWEL SIGN AI */
- [0xcc9, 0xcc9],
- [0xcca, 0xcca], /* KANNADA VOWEL SIGN O */
- [0xccb, 0xccb], /* KANNADA VOWEL SIGN OO */
- [0xccc, 0xccc], /* KANNADA VOWEL SIGN AU */
- [0xccd, 0xccd], /* KANNADA SIGN VIRAMA */
- [0xcce, 0xcce],
- [0xccf, 0xccf],
- [0xcd0, 0xcd0],
- [0xcd1, 0xcd1],
- [0xcd2, 0xcd2],
- [0xcd3, 0xcd3],
- [0xcd4, 0xcd4],
- [0xcd5, 0xcd5], /* KANNADA LENGTH MARK */
- [0xcd6, 0xcd6], /* KANNADA AI LENGTH MARK */
- [0xcd7, 0xcd7],
- [0xcd8, 0xcd8],
- [0xcd9, 0xcd9],
- [0xcda, 0xcda],
- [0xcdb, 0xcdb],
- [0xcdc, 0xcdc],
- [0xcdd, 0xcdd],
- [0xcde, 0xcde], /* KANNADA LETTER FA */
- [0xcdf, 0xcdf],
- [0xce0, 0xce0], /* KANNADA LETTER VOCALIC RR */
- [0xce1, 0xce1], /* KANNADA LETTER VOCALIC LL */
- [0xce2, 0xce2], /* KANNADA VOWEL SIGN VOCALIC L */
- [0xce3, 0xce3], /* KANNADA VOWEL SIGN VOCALIC LL */
- [0xce4, 0xce4],
- [0xce5, 0xce5],
- [0xce6, 0xce6], /* KANNADA DIGIT ZERO */
- [0xce7, 0xce7], /* KANNADA DIGIT ONE */
- [0xce8, 0xce8], /* KANNADA DIGIT TWO */
- [0xce9, 0xce9], /* KANNADA DIGIT THREE */
- [0xcea, 0xcea], /* KANNADA DIGIT FOUR */
- [0xceb, 0xceb], /* KANNADA DIGIT FIVE */
- [0xcec, 0xcec], /* KANNADA DIGIT SIX */
- [0xced, 0xced], /* KANNADA DIGIT SEVEN */
- [0xcee, 0xcee], /* KANNADA DIGIT EIGHT */
- [0xcef, 0xcef], /* KANNADA DIGIT NINE */
- [0xcf0, 0xcf0],
- [0xcf1, 0xcf1], /* KANNADA SIGN JIHVAMULIYA */
- [0xcf2, 0xcf2], /* KANNADA SIGN UPADHMANIYA */
- [0xcf3, 0xcf3],
- [0xcf4, 0xcf4],
- [0xcf5, 0xcf5],
- [0xcf6, 0xcf6],
- [0xcf7, 0xcf7],
- [0xcf8, 0xcf8],
- [0xcf9, 0xcf9],
- [0xcfa, 0xcfa],
- [0xcfb, 0xcfb],
- [0xcfc, 0xcfc],
- [0xcfd, 0xcfd],
- [0xcfe, 0xcfe],
- [0xcff, 0xcff],
- [0xd00, 0xd00], /* MALAYALAM SIGN COMBINING ANUSVARA ABOVE */
- [0xd01, 0xd01], /* MALAYALAM SIGN CANDRABINDU */
- [0xd02, 0xd02], /* MALAYALAM SIGN ANUSVARA */
- [0xd03, 0xd03], /* MALAYALAM SIGN VISARGA */
- [0xd04, 0xd04],
- [0xd05, 0xd05], /* MALAYALAM LETTER A */
- [0xd06, 0xd06], /* MALAYALAM LETTER AA */
- [0xd07, 0xd07], /* MALAYALAM LETTER I */
- [0xd08, 0xd08], /* MALAYALAM LETTER II */
- [0xd09, 0xd09], /* MALAYALAM LETTER U */
- [0xd0a, 0xd0a], /* MALAYALAM LETTER UU */
- [0xd0b, 0xd0b], /* MALAYALAM LETTER VOCALIC R */
- [0xd0c, 0xd0c], /* MALAYALAM LETTER VOCALIC L */
- [0xd0d, 0xd0d],
- [0xd0e, 0xd0e], /* MALAYALAM LETTER E */
- [0xd0f, 0xd0f], /* MALAYALAM LETTER EE */
- [0xd10, 0xd10], /* MALAYALAM LETTER AI */
- [0xd11, 0xd11],
- [0xd12, 0xd12], /* MALAYALAM LETTER O */
- [0xd13, 0xd13], /* MALAYALAM LETTER OO */
- [0xd14, 0xd14], /* MALAYALAM LETTER AU */
- [0xd15, 0xd15], /* MALAYALAM LETTER KA */
- [0xd16, 0xd16], /* MALAYALAM LETTER KHA */
- [0xd17, 0xd17], /* MALAYALAM LETTER GA */
- [0xd18, 0xd18], /* MALAYALAM LETTER GHA */
- [0xd19, 0xd19], /* MALAYALAM LETTER NGA */
- [0xd1a, 0xd1a], /* MALAYALAM LETTER CA */
- [0xd1b, 0xd1b], /* MALAYALAM LETTER CHA */
- [0xd1c, 0xd1c], /* MALAYALAM LETTER JA */
- [0xd1d, 0xd1d], /* MALAYALAM LETTER JHA */
- [0xd1e, 0xd1e], /* MALAYALAM LETTER NYA */
- [0xd1f, 0xd1f], /* MALAYALAM LETTER TTA */
- [0xd20, 0xd20], /* MALAYALAM LETTER TTHA */
- [0xd21, 0xd21], /* MALAYALAM LETTER DDA */
- [0xd22, 0xd22], /* MALAYALAM LETTER DDHA */
- [0xd23, 0xd23], /* MALAYALAM LETTER NNA */
- [0xd24, 0xd24], /* MALAYALAM LETTER TA */
- [0xd25, 0xd25], /* MALAYALAM LETTER THA */
- [0xd26, 0xd26], /* MALAYALAM LETTER DA */
- [0xd27, 0xd27], /* MALAYALAM LETTER DHA */
- [0xd28, 0xd28], /* MALAYALAM LETTER NA */
- [0xd29, 0xd29], /* MALAYALAM LETTER NNNA */
- [0xd2a, 0xd2a], /* MALAYALAM LETTER PA */
- [0xd2b, 0xd2b], /* MALAYALAM LETTER PHA */
- [0xd2c, 0xd2c], /* MALAYALAM LETTER BA */
- [0xd2d, 0xd2d], /* MALAYALAM LETTER BHA */
- [0xd2e, 0xd2e], /* MALAYALAM LETTER MA */
- [0xd2f, 0xd2f], /* MALAYALAM LETTER YA */
- [0xd30, 0xd30], /* MALAYALAM LETTER RA */
- [0xd31, 0xd31], /* MALAYALAM LETTER RRA */
- [0xd32, 0xd32], /* MALAYALAM LETTER LA */
- [0xd33, 0xd33], /* MALAYALAM LETTER LLA */
- [0xd34, 0xd34], /* MALAYALAM LETTER LLLA */
- [0xd35, 0xd35], /* MALAYALAM LETTER VA */
- [0xd36, 0xd36], /* MALAYALAM LETTER SHA */
- [0xd37, 0xd37], /* MALAYALAM LETTER SSA */
- [0xd38, 0xd38], /* MALAYALAM LETTER SA */
- [0xd39, 0xd39], /* MALAYALAM LETTER HA */
- [0xd3a, 0xd3a], /* MALAYALAM LETTER TTTA */
- [0xd3b, 0xd3b], /* MALAYALAM SIGN VERTICAL BAR VIRAMA */
- [0xd3c, 0xd3c], /* MALAYALAM SIGN CIRCULAR VIRAMA */
- [0xd3d, 0xd3d], /* MALAYALAM SIGN AVAGRAHA */
- [0xd3e, 0xd3e], /* MALAYALAM VOWEL SIGN AA */
- [0xd3f, 0xd3f], /* MALAYALAM VOWEL SIGN I */
- [0xd40, 0xd40], /* MALAYALAM VOWEL SIGN II */
- [0xd41, 0xd41], /* MALAYALAM VOWEL SIGN U */
- [0xd42, 0xd42], /* MALAYALAM VOWEL SIGN UU */
- [0xd43, 0xd43], /* MALAYALAM VOWEL SIGN VOCALIC R */
- [0xd44, 0xd44], /* MALAYALAM VOWEL SIGN VOCALIC RR */
- [0xd45, 0xd45],
- [0xd46, 0xd46], /* MALAYALAM VOWEL SIGN E */
- [0xd47, 0xd47], /* MALAYALAM VOWEL SIGN EE */
- [0xd48, 0xd48], /* MALAYALAM VOWEL SIGN AI */
- [0xd49, 0xd49],
- [0xd4a, 0xd4a], /* MALAYALAM VOWEL SIGN O */
- [0xd4b, 0xd4b], /* MALAYALAM VOWEL SIGN OO */
- [0xd4c, 0xd4c], /* MALAYALAM VOWEL SIGN AU */
- [0xd4d, 0xd4d], /* MALAYALAM SIGN VIRAMA */
- [0xd4e, 0xd4e], /* MALAYALAM LETTER DOT REPH */
- [0xd4f, 0xd4f], /* MALAYALAM SIGN PARA */
- [0xd50, 0xd50],
- [0xd51, 0xd51],
- [0xd52, 0xd52],
- [0xd53, 0xd53],
- [0xd54, 0xd54], /* MALAYALAM LETTER CHILLU M */
- [0xd55, 0xd55], /* MALAYALAM LETTER CHILLU Y */
- [0xd56, 0xd56], /* MALAYALAM LETTER CHILLU LLL */
- [0xd57, 0xd57], /* MALAYALAM AU LENGTH MARK */
- [0xd58, 0xd58], /* MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH */
- [0xd59, 0xd59], /* MALAYALAM FRACTION ONE FORTIETH */
- [0xd5a, 0xd5a], /* MALAYALAM FRACTION THREE EIGHTIETHS */
- [0xd5b, 0xd5b], /* MALAYALAM FRACTION ONE TWENTIETH */
- [0xd5c, 0xd5c], /* MALAYALAM FRACTION ONE TENTH */
- [0xd5d, 0xd5d], /* MALAYALAM FRACTION THREE TWENTIETHS */
- [0xd5e, 0xd5e], /* MALAYALAM FRACTION ONE FIFTH */
- [0xd5f, 0xd5f], /* MALAYALAM LETTER ARCHAIC II */
- [0xd60, 0xd60], /* MALAYALAM LETTER VOCALIC RR */
- [0xd61, 0xd61], /* MALAYALAM LETTER VOCALIC LL */
- [0xd62, 0xd62], /* MALAYALAM VOWEL SIGN VOCALIC L */
- [0xd63, 0xd63], /* MALAYALAM VOWEL SIGN VOCALIC LL */
- [0xd64, 0xd64],
- [0xd65, 0xd65],
- [0xd66, 0xd66], /* MALAYALAM DIGIT ZERO */
- [0xd67, 0xd67], /* MALAYALAM DIGIT ONE */
- [0xd68, 0xd68], /* MALAYALAM DIGIT TWO */
- [0xd69, 0xd69], /* MALAYALAM DIGIT THREE */
- [0xd6a, 0xd6a], /* MALAYALAM DIGIT FOUR */
- [0xd6b, 0xd6b], /* MALAYALAM DIGIT FIVE */
- [0xd6c, 0xd6c], /* MALAYALAM DIGIT SIX */
- [0xd6d, 0xd6d], /* MALAYALAM DIGIT SEVEN */
- [0xd6e, 0xd6e], /* MALAYALAM DIGIT EIGHT */
- [0xd6f, 0xd6f], /* MALAYALAM DIGIT NINE */
- [0xd70, 0xd70], /* MALAYALAM NUMBER TEN */
- [0xd71, 0xd71], /* MALAYALAM NUMBER ONE HUNDRED */
- [0xd72, 0xd72], /* MALAYALAM NUMBER ONE THOUSAND */
- [0xd73, 0xd73], /* MALAYALAM FRACTION ONE QUARTER */
- [0xd74, 0xd74], /* MALAYALAM FRACTION ONE HALF */
- [0xd75, 0xd75], /* MALAYALAM FRACTION THREE QUARTERS */
- [0xd76, 0xd76], /* MALAYALAM FRACTION ONE SIXTEENTH */
- [0xd77, 0xd77], /* MALAYALAM FRACTION ONE EIGHTH */
- [0xd78, 0xd78], /* MALAYALAM FRACTION THREE SIXTEENTHS */
- [0xd79, 0xd79], /* MALAYALAM DATE MARK */
- [0xd7a, 0xd7a], /* MALAYALAM LETTER CHILLU NN */
- [0xd7b, 0xd7b], /* MALAYALAM LETTER CHILLU N */
- [0xd7c, 0xd7c], /* MALAYALAM LETTER CHILLU RR */
- [0xd7d, 0xd7d], /* MALAYALAM LETTER CHILLU L */
- [0xd7e, 0xd7e], /* MALAYALAM LETTER CHILLU LL */
- [0xd7f, 0xd7f], /* MALAYALAM LETTER CHILLU K */
- [0xd80, 0xd80],
- [0xd81, 0xd81],
- [0xd82, 0xd82], /* SINHALA SIGN ANUSVARAYA */
- [0xd83, 0xd83], /* SINHALA SIGN VISARGAYA */
- [0xd84, 0xd84],
- [0xd85, 0xd85], /* SINHALA LETTER AYANNA */
- [0xd86, 0xd86], /* SINHALA LETTER AAYANNA */
- [0xd87, 0xd87], /* SINHALA LETTER AEYANNA */
- [0xd88, 0xd88], /* SINHALA LETTER AEEYANNA */
- [0xd89, 0xd89], /* SINHALA LETTER IYANNA */
- [0xd8a, 0xd8a], /* SINHALA LETTER IIYANNA */
- [0xd8b, 0xd8b], /* SINHALA LETTER UYANNA */
- [0xd8c, 0xd8c], /* SINHALA LETTER UUYANNA */
- [0xd8d, 0xd8d], /* SINHALA LETTER IRUYANNA */
- [0xd8e, 0xd8e], /* SINHALA LETTER IRUUYANNA */
- [0xd8f, 0xd8f], /* SINHALA LETTER ILUYANNA */
- [0xd90, 0xd90], /* SINHALA LETTER ILUUYANNA */
- [0xd91, 0xd91], /* SINHALA LETTER EYANNA */
- [0xd92, 0xd92], /* SINHALA LETTER EEYANNA */
- [0xd93, 0xd93], /* SINHALA LETTER AIYANNA */
- [0xd94, 0xd94], /* SINHALA LETTER OYANNA */
- [0xd95, 0xd95], /* SINHALA LETTER OOYANNA */
- [0xd96, 0xd96], /* SINHALA LETTER AUYANNA */
- [0xd97, 0xd97],
- [0xd98, 0xd98],
- [0xd99, 0xd99],
- [0xd9a, 0xd9a], /* SINHALA LETTER ALPAPRAANA KAYANNA */
- [0xd9b, 0xd9b], /* SINHALA LETTER MAHAAPRAANA KAYANNA */
- [0xd9c, 0xd9c], /* SINHALA LETTER ALPAPRAANA GAYANNA */
- [0xd9d, 0xd9d], /* SINHALA LETTER MAHAAPRAANA GAYANNA */
- [0xd9e, 0xd9e], /* SINHALA LETTER KANTAJA NAASIKYAYA */
- [0xd9f, 0xd9f], /* SINHALA LETTER SANYAKA GAYANNA */
- [0xda0, 0xda0], /* SINHALA LETTER ALPAPRAANA CAYANNA */
- [0xda1, 0xda1], /* SINHALA LETTER MAHAAPRAANA CAYANNA */
- [0xda2, 0xda2], /* SINHALA LETTER ALPAPRAANA JAYANNA */
- [0xda3, 0xda3], /* SINHALA LETTER MAHAAPRAANA JAYANNA */
- [0xda4, 0xda4], /* SINHALA LETTER TAALUJA NAASIKYAYA */
- [0xda5, 0xda5], /* SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA */
- [0xda6, 0xda6], /* SINHALA LETTER SANYAKA JAYANNA */
- [0xda7, 0xda7], /* SINHALA LETTER ALPAPRAANA TTAYANNA */
- [0xda8, 0xda8], /* SINHALA LETTER MAHAAPRAANA TTAYANNA */
- [0xda9, 0xda9], /* SINHALA LETTER ALPAPRAANA DDAYANNA */
- [0xdaa, 0xdaa], /* SINHALA LETTER MAHAAPRAANA DDAYANNA */
- [0xdab, 0xdab], /* SINHALA LETTER MUURDHAJA NAYANNA */
- [0xdac, 0xdac], /* SINHALA LETTER SANYAKA DDAYANNA */
- [0xdad, 0xdad], /* SINHALA LETTER ALPAPRAANA TAYANNA */
- [0xdae, 0xdae], /* SINHALA LETTER MAHAAPRAANA TAYANNA */
- [0xdaf, 0xdaf], /* SINHALA LETTER ALPAPRAANA DAYANNA */
- [0xdb0, 0xdb0], /* SINHALA LETTER MAHAAPRAANA DAYANNA */
- [0xdb1, 0xdb1], /* SINHALA LETTER DANTAJA NAYANNA */
- [0xdb2, 0xdb2],
- [0xdb3, 0xdb3], /* SINHALA LETTER SANYAKA DAYANNA */
- [0xdb4, 0xdb4], /* SINHALA LETTER ALPAPRAANA PAYANNA */
- [0xdb5, 0xdb5], /* SINHALA LETTER MAHAAPRAANA PAYANNA */
- [0xdb6, 0xdb6], /* SINHALA LETTER ALPAPRAANA BAYANNA */
- [0xdb7, 0xdb7], /* SINHALA LETTER MAHAAPRAANA BAYANNA */
- [0xdb8, 0xdb8], /* SINHALA LETTER MAYANNA */
- [0xdb9, 0xdb9], /* SINHALA LETTER AMBA BAYANNA */
- [0xdba, 0xdba], /* SINHALA LETTER YAYANNA */
- [0xdbb, 0xdbb], /* SINHALA LETTER RAYANNA */
- [0xdbc, 0xdbc],
- [0xdbd, 0xdbd], /* SINHALA LETTER DANTAJA LAYANNA */
- [0xdbe, 0xdbe],
- [0xdbf, 0xdbf],
- [0xdc0, 0xdc0], /* SINHALA LETTER VAYANNA */
- [0xdc1, 0xdc1], /* SINHALA LETTER TAALUJA SAYANNA */
- [0xdc2, 0xdc2], /* SINHALA LETTER MUURDHAJA SAYANNA */
- [0xdc3, 0xdc3], /* SINHALA LETTER DANTAJA SAYANNA */
- [0xdc4, 0xdc4], /* SINHALA LETTER HAYANNA */
- [0xdc5, 0xdc5], /* SINHALA LETTER MUURDHAJA LAYANNA */
- [0xdc6, 0xdc6], /* SINHALA LETTER FAYANNA */
- [0xdc7, 0xdc7],
- [0xdc8, 0xdc8],
- [0xdc9, 0xdc9],
- [0xdca, 0xdca], /* SINHALA SIGN AL-LAKUNA */
- [0xdcb, 0xdcb],
- [0xdcc, 0xdcc],
- [0xdcd, 0xdcd],
- [0xdce, 0xdce],
- [0xdcf, 0xdcf], /* SINHALA VOWEL SIGN AELA-PILLA */
- [0xdd0, 0xdd0], /* SINHALA VOWEL SIGN KETTI AEDA-PILLA */
- [0xdd1, 0xdd1], /* SINHALA VOWEL SIGN DIGA AEDA-PILLA */
- [0xdd2, 0xdd2], /* SINHALA VOWEL SIGN KETTI IS-PILLA */
- [0xdd3, 0xdd3], /* SINHALA VOWEL SIGN DIGA IS-PILLA */
- [0xdd4, 0xdd4], /* SINHALA VOWEL SIGN KETTI PAA-PILLA */
- [0xdd5, 0xdd5],
- [0xdd6, 0xdd6], /* SINHALA VOWEL SIGN DIGA PAA-PILLA */
- [0xdd7, 0xdd7],
- [0xdd8, 0xdd8], /* SINHALA VOWEL SIGN GAETTA-PILLA */
- [0xdd9, 0xdd9], /* SINHALA VOWEL SIGN KOMBUVA */
- [0xdda, 0xdda], /* SINHALA VOWEL SIGN DIGA KOMBUVA */
- [0xddb, 0xddb], /* SINHALA VOWEL SIGN KOMBU DEKA */
- [0xddc, 0xddc], /* SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA */
- [0xddd, 0xddd], /* SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA */
- [0xdde, 0xdde], /* SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA */
- [0xddf, 0xddf], /* SINHALA VOWEL SIGN GAYANUKITTA */
- [0xde0, 0xde0],
- [0xde1, 0xde1],
- [0xde2, 0xde2],
- [0xde3, 0xde3],
- [0xde4, 0xde4],
- [0xde5, 0xde5],
- [0xde6, 0xde6], /* SINHALA LITH DIGIT ZERO */
- [0xde7, 0xde7], /* SINHALA LITH DIGIT ONE */
- [0xde8, 0xde8], /* SINHALA LITH DIGIT TWO */
- [0xde9, 0xde9], /* SINHALA LITH DIGIT THREE */
- [0xdea, 0xdea], /* SINHALA LITH DIGIT FOUR */
- [0xdeb, 0xdeb], /* SINHALA LITH DIGIT FIVE */
- [0xdec, 0xdec], /* SINHALA LITH DIGIT SIX */
- [0xded, 0xded], /* SINHALA LITH DIGIT SEVEN */
- [0xdee, 0xdee], /* SINHALA LITH DIGIT EIGHT */
- [0xdef, 0xdef], /* SINHALA LITH DIGIT NINE */
- [0xdf0, 0xdf0],
- [0xdf1, 0xdf1],
- [0xdf2, 0xdf2], /* SINHALA VOWEL SIGN DIGA GAETTA-PILLA */
- [0xdf3, 0xdf3], /* SINHALA VOWEL SIGN DIGA GAYANUKITTA */
- [0xdf4, 0xdf4], /* SINHALA PUNCTUATION KUNDDALIYA */
- [0xdf5, 0xdf5],
- [0xdf6, 0xdf6],
- [0xdf7, 0xdf7],
- [0xdf8, 0xdf8],
- [0xdf9, 0xdf9],
- [0xdfa, 0xdfa],
- [0xdfb, 0xdfb],
- [0xdfc, 0xdfc],
- [0xdfd, 0xdfd],
- [0xdfe, 0xdfe],
- [0xdff, 0xdff],
- [0xe00, 0xe00],
- [0xe01, 0xe01], /* THAI CHARACTER KO KAI (THAI LETTER KO KAI) */
- [0xe02, 0xe02], /* THAI CHARACTER KHO KHAI (THAI LETTER KHO KHAI) */
- [0xe03, 0xe03], /* THAI CHARACTER KHO KHUAT (THAI LETTER KHO KHUAT) */
- [0xe04, 0xe04], /* THAI CHARACTER KHO KHWAI (THAI LETTER KHO KHWAI) */
- [0xe05, 0xe05], /* THAI CHARACTER KHO KHON (THAI LETTER KHO KHON) */
- [0xe06, 0xe06], /* THAI CHARACTER KHO RAKHANG (THAI LETTER KHO RAKHANG) */
- [0xe07, 0xe07], /* THAI CHARACTER NGO NGU (THAI LETTER NGO NGU) */
- [0xe08, 0xe08], /* THAI CHARACTER CHO CHAN (THAI LETTER CHO CHAN) */
- [0xe09, 0xe09], /* THAI CHARACTER CHO CHING (THAI LETTER CHO CHING) */
- [0xe0a, 0xe0a], /* THAI CHARACTER CHO CHANG (THAI LETTER CHO CHANG) */
- [0xe0b, 0xe0b], /* THAI CHARACTER SO SO (THAI LETTER SO SO) */
- [0xe0c, 0xe0c], /* THAI CHARACTER CHO CHOE (THAI LETTER CHO CHOE) */
- [0xe0d, 0xe0d], /* THAI CHARACTER YO YING (THAI LETTER YO YING) */
- [0xe0e, 0xe0e], /* THAI CHARACTER DO CHADA (THAI LETTER DO CHADA) */
- [0xe0f, 0xe0f], /* THAI CHARACTER TO PATAK (THAI LETTER TO PATAK) */
- [0xe10, 0xe10], /* THAI CHARACTER THO THAN (THAI LETTER THO THAN) */
- [0xe11, 0xe11], /* THAI CHARACTER THO NANGMONTHO (THAI LETTER THO NANGMONTHO) */
- [0xe12, 0xe12], /* THAI CHARACTER THO PHUTHAO (THAI LETTER THO PHUTHAO) */
- [0xe13, 0xe13], /* THAI CHARACTER NO NEN (THAI LETTER NO NEN) */
- [0xe14, 0xe14], /* THAI CHARACTER DO DEK (THAI LETTER DO DEK) */
- [0xe15, 0xe15], /* THAI CHARACTER TO TAO (THAI LETTER TO TAO) */
- [0xe16, 0xe16], /* THAI CHARACTER THO THUNG (THAI LETTER THO THUNG) */
- [0xe17, 0xe17], /* THAI CHARACTER THO THAHAN (THAI LETTER THO THAHAN) */
- [0xe18, 0xe18], /* THAI CHARACTER THO THONG (THAI LETTER THO THONG) */
- [0xe19, 0xe19], /* THAI CHARACTER NO NU (THAI LETTER NO NU) */
- [0xe1a, 0xe1a], /* THAI CHARACTER BO BAIMAI (THAI LETTER BO BAIMAI) */
- [0xe1b, 0xe1b], /* THAI CHARACTER PO PLA (THAI LETTER PO PLA) */
- [0xe1c, 0xe1c], /* THAI CHARACTER PHO PHUNG (THAI LETTER PHO PHUNG) */
- [0xe1d, 0xe1d], /* THAI CHARACTER FO FA (THAI LETTER FO FA) */
- [0xe1e, 0xe1e], /* THAI CHARACTER PHO PHAN (THAI LETTER PHO PHAN) */
- [0xe1f, 0xe1f], /* THAI CHARACTER FO FAN (THAI LETTER FO FAN) */
- [0xe20, 0xe20], /* THAI CHARACTER PHO SAMPHAO (THAI LETTER PHO SAMPHAO) */
- [0xe21, 0xe21], /* THAI CHARACTER MO MA (THAI LETTER MO MA) */
- [0xe22, 0xe22], /* THAI CHARACTER YO YAK (THAI LETTER YO YAK) */
- [0xe23, 0xe23], /* THAI CHARACTER RO RUA (THAI LETTER RO RUA) */
- [0xe24, 0xe24], /* THAI CHARACTER RU (THAI LETTER RU) */
- [0xe25, 0xe25], /* THAI CHARACTER LO LING (THAI LETTER LO LING) */
- [0xe26, 0xe26], /* THAI CHARACTER LU (THAI LETTER LU) */
- [0xe27, 0xe27], /* THAI CHARACTER WO WAEN (THAI LETTER WO WAEN) */
- [0xe28, 0xe28], /* THAI CHARACTER SO SALA (THAI LETTER SO SALA) */
- [0xe29, 0xe29], /* THAI CHARACTER SO RUSI (THAI LETTER SO RUSI) */
- [0xe2a, 0xe2a], /* THAI CHARACTER SO SUA (THAI LETTER SO SUA) */
- [0xe2b, 0xe2b], /* THAI CHARACTER HO HIP (THAI LETTER HO HIP) */
- [0xe2c, 0xe2c], /* THAI CHARACTER LO CHULA (THAI LETTER LO CHULA) */
- [0xe2d, 0xe2d], /* THAI CHARACTER O ANG (THAI LETTER O ANG) */
- [0xe2e, 0xe2e], /* THAI CHARACTER HO NOKHUK (THAI LETTER HO NOK HUK) */
- [0xe2f, 0xe2f], /* THAI CHARACTER PAIYANNOI (THAI PAI YAN NOI) */
- [0xe30, 0xe30], /* THAI CHARACTER SARA A (THAI VOWEL SIGN SARA A) */
- [0xe31, 0xe31], /* THAI CHARACTER MAI HAN-AKAT (THAI VOWEL SIGN MAI HAN-AKAT) */
- [0xe32, 0xe32], /* THAI CHARACTER SARA AA (THAI VOWEL SIGN SARA AA) */
- [0xe33, 0xe33], /* THAI CHARACTER SARA AM (THAI VOWEL SIGN SARA AM) */
- [0xe34, 0xe34], /* THAI CHARACTER SARA I (THAI VOWEL SIGN SARA I) */
- [0xe35, 0xe35], /* THAI CHARACTER SARA II (THAI VOWEL SIGN SARA II) */
- [0xe36, 0xe36], /* THAI CHARACTER SARA UE (THAI VOWEL SIGN SARA UE) */
- [0xe37, 0xe37], /* THAI CHARACTER SARA UEE (THAI VOWEL SIGN SARA UEE) */
- [0xe38, 0xe38], /* THAI CHARACTER SARA U (THAI VOWEL SIGN SARA U) */
- [0xe39, 0xe39], /* THAI CHARACTER SARA UU (THAI VOWEL SIGN SARA UU) */
- [0xe3a, 0xe3a], /* THAI CHARACTER PHINTHU (THAI VOWEL SIGN PHINTHU) */
- [0xe3b, 0xe3b],
- [0xe3c, 0xe3c],
- [0xe3d, 0xe3d],
- [0xe3e, 0xe3e],
- [0xe3f, 0xe3f], /* THAI CURRENCY SYMBOL BAHT (THAI BAHT SIGN) */
- [0xe40, 0xe40], /* THAI CHARACTER SARA E (THAI VOWEL SIGN SARA E) */
- [0xe41, 0xe41], /* THAI CHARACTER SARA AE (THAI VOWEL SIGN SARA AE) */
- [0xe42, 0xe42], /* THAI CHARACTER SARA O (THAI VOWEL SIGN SARA O) */
- [0xe43, 0xe43], /* THAI CHARACTER SARA AI MAIMUAN (THAI VOWEL SIGN SARA MAI MUAN) */
- [0xe44, 0xe44], /* THAI CHARACTER SARA AI MAIMALAI (THAI VOWEL SIGN SARA MAI MALAI) */
- [0xe45, 0xe45], /* THAI CHARACTER LAKKHANGYAO (THAI LAK KHANG YAO) */
- [0xe46, 0xe46], /* THAI CHARACTER MAIYAMOK (THAI MAI YAMOK) */
- [0xe47, 0xe47], /* THAI CHARACTER MAITAIKHU (THAI VOWEL SIGN MAI TAI KHU) */
- [0xe48, 0xe48], /* THAI CHARACTER MAI EK (THAI TONE MAI EK) */
- [0xe49, 0xe49], /* THAI CHARACTER MAI THO (THAI TONE MAI THO) */
- [0xe4a, 0xe4a], /* THAI CHARACTER MAI TRI (THAI TONE MAI TRI) */
- [0xe4b, 0xe4b], /* THAI CHARACTER MAI CHATTAWA (THAI TONE MAI CHATTAWA) */
- [0xe4c, 0xe4c], /* THAI CHARACTER THANTHAKHAT (THAI THANTHAKHAT) */
- [0xe4d, 0xe4d], /* THAI CHARACTER NIKHAHIT (THAI NIKKHAHIT) */
- [0xe4e, 0xe4e], /* THAI CHARACTER YAMAKKAN (THAI YAMAKKAN) */
- [0xe4f, 0xe4f], /* THAI CHARACTER FONGMAN (THAI FONGMAN) */
- [0xe50, 0xe50], /* THAI DIGIT ZERO */
- [0xe51, 0xe51], /* THAI DIGIT ONE */
- [0xe52, 0xe52], /* THAI DIGIT TWO */
- [0xe53, 0xe53], /* THAI DIGIT THREE */
- [0xe54, 0xe54], /* THAI DIGIT FOUR */
- [0xe55, 0xe55], /* THAI DIGIT FIVE */
- [0xe56, 0xe56], /* THAI DIGIT SIX */
- [0xe57, 0xe57], /* THAI DIGIT SEVEN */
- [0xe58, 0xe58], /* THAI DIGIT EIGHT */
- [0xe59, 0xe59], /* THAI DIGIT NINE */
- [0xe5a, 0xe5a], /* THAI CHARACTER ANGKHANKHU (THAI ANGKHANKHU) */
- [0xe5b, 0xe5b], /* THAI CHARACTER KHOMUT (THAI KHOMUT) */
- [0xe5c, 0xe5c],
- [0xe5d, 0xe5d],
- [0xe5e, 0xe5e],
- [0xe5f, 0xe5f],
- [0xe60, 0xe60],
- [0xe61, 0xe61],
- [0xe62, 0xe62],
- [0xe63, 0xe63],
- [0xe64, 0xe64],
- [0xe65, 0xe65],
- [0xe66, 0xe66],
- [0xe67, 0xe67],
- [0xe68, 0xe68],
- [0xe69, 0xe69],
- [0xe6a, 0xe6a],
- [0xe6b, 0xe6b],
- [0xe6c, 0xe6c],
- [0xe6d, 0xe6d],
- [0xe6e, 0xe6e],
- [0xe6f, 0xe6f],
- [0xe70, 0xe70],
- [0xe71, 0xe71],
- [0xe72, 0xe72],
- [0xe73, 0xe73],
- [0xe74, 0xe74],
- [0xe75, 0xe75],
- [0xe76, 0xe76],
- [0xe77, 0xe77],
- [0xe78, 0xe78],
- [0xe79, 0xe79],
- [0xe7a, 0xe7a],
- [0xe7b, 0xe7b],
- [0xe7c, 0xe7c],
- [0xe7d, 0xe7d],
- [0xe7e, 0xe7e],
- [0xe7f, 0xe7f],
- [0xe80, 0xe80],
- [0xe81, 0xe81], /* LAO LETTER KO */
- [0xe82, 0xe82], /* LAO LETTER KHO SUNG */
- [0xe83, 0xe83],
- [0xe84, 0xe84], /* LAO LETTER KHO TAM */
- [0xe85, 0xe85],
- [0xe86, 0xe86],
- [0xe87, 0xe87], /* LAO LETTER NGO */
- [0xe88, 0xe88], /* LAO LETTER CO */
- [0xe89, 0xe89],
- [0xe8a, 0xe8a], /* LAO LETTER SO TAM */
- [0xe8b, 0xe8b],
- [0xe8c, 0xe8c],
- [0xe8d, 0xe8d], /* LAO LETTER NYO */
- [0xe8e, 0xe8e],
- [0xe8f, 0xe8f],
- [0xe90, 0xe90],
- [0xe91, 0xe91],
- [0xe92, 0xe92],
- [0xe93, 0xe93],
- [0xe94, 0xe94], /* LAO LETTER DO */
- [0xe95, 0xe95], /* LAO LETTER TO */
- [0xe96, 0xe96], /* LAO LETTER THO SUNG */
- [0xe97, 0xe97], /* LAO LETTER THO TAM */
- [0xe98, 0xe98],
- [0xe99, 0xe99], /* LAO LETTER NO */
- [0xe9a, 0xe9a], /* LAO LETTER BO */
- [0xe9b, 0xe9b], /* LAO LETTER PO */
- [0xe9c, 0xe9c], /* LAO LETTER PHO SUNG */
- [0xe9d, 0xe9d], /* LAO LETTER FO TAM */
- [0xe9e, 0xe9e], /* LAO LETTER PHO TAM */
- [0xe9f, 0xe9f], /* LAO LETTER FO SUNG */
- [0xea0, 0xea0],
- [0xea1, 0xea1], /* LAO LETTER MO */
- [0xea2, 0xea2], /* LAO LETTER YO */
- [0xea3, 0xea3], /* LAO LETTER LO LING */
- [0xea4, 0xea4],
- [0xea5, 0xea5], /* LAO LETTER LO LOOT */
- [0xea6, 0xea6],
- [0xea7, 0xea7], /* LAO LETTER WO */
- [0xea8, 0xea8],
- [0xea9, 0xea9],
- [0xeaa, 0xeaa], /* LAO LETTER SO SUNG */
- [0xeab, 0xeab], /* LAO LETTER HO SUNG */
- [0xeac, 0xeac],
- [0xead, 0xead], /* LAO LETTER O */
- [0xeae, 0xeae], /* LAO LETTER HO TAM */
- [0xeaf, 0xeaf], /* LAO ELLIPSIS */
- [0xeb0, 0xeb0], /* LAO VOWEL SIGN A */
- [0xeb1, 0xeb1], /* LAO VOWEL SIGN MAI KAN */
- [0xeb2, 0xeb2], /* LAO VOWEL SIGN AA */
- [0xeb3, 0xeb3], /* LAO VOWEL SIGN AM */
- [0xeb4, 0xeb4], /* LAO VOWEL SIGN I */
- [0xeb5, 0xeb5], /* LAO VOWEL SIGN II */
- [0xeb6, 0xeb6], /* LAO VOWEL SIGN Y */
- [0xeb7, 0xeb7], /* LAO VOWEL SIGN YY */
- [0xeb8, 0xeb8], /* LAO VOWEL SIGN U */
- [0xeb9, 0xeb9], /* LAO VOWEL SIGN UU */
- [0xeba, 0xeba],
- [0xebb, 0xebb], /* LAO VOWEL SIGN MAI KON */
- [0xebc, 0xebc], /* LAO SEMIVOWEL SIGN LO */
- [0xebd, 0xebd], /* LAO SEMIVOWEL SIGN NYO */
- [0xebe, 0xebe],
- [0xebf, 0xebf],
- [0xec0, 0xec0], /* LAO VOWEL SIGN E */
- [0xec1, 0xec1], /* LAO VOWEL SIGN EI */
- [0xec2, 0xec2], /* LAO VOWEL SIGN O */
- [0xec3, 0xec3], /* LAO VOWEL SIGN AY */
- [0xec4, 0xec4], /* LAO VOWEL SIGN AI */
- [0xec5, 0xec5],
- [0xec6, 0xec6], /* LAO KO LA */
- [0xec7, 0xec7],
- [0xec8, 0xec8], /* LAO TONE MAI EK */
- [0xec9, 0xec9], /* LAO TONE MAI THO */
- [0xeca, 0xeca], /* LAO TONE MAI TI */
- [0xecb, 0xecb], /* LAO TONE MAI CATAWA */
- [0xecc, 0xecc], /* LAO CANCELLATION MARK */
- [0xecd, 0xecd], /* LAO NIGGAHITA */
- [0xece, 0xece],
- [0xecf, 0xecf],
- [0xed0, 0xed0], /* LAO DIGIT ZERO */
- [0xed1, 0xed1], /* LAO DIGIT ONE */
- [0xed2, 0xed2], /* LAO DIGIT TWO */
- [0xed3, 0xed3], /* LAO DIGIT THREE */
- [0xed4, 0xed4], /* LAO DIGIT FOUR */
- [0xed5, 0xed5], /* LAO DIGIT FIVE */
- [0xed6, 0xed6], /* LAO DIGIT SIX */
- [0xed7, 0xed7], /* LAO DIGIT SEVEN */
- [0xed8, 0xed8], /* LAO DIGIT EIGHT */
- [0xed9, 0xed9], /* LAO DIGIT NINE */
- [0xeda, 0xeda],
- [0xedb, 0xedb],
- [0xedc, 0xedc], /* LAO HO NO */
- [0xedd, 0xedd], /* LAO HO MO */
- [0xede, 0xede], /* LAO LETTER KHMU GO */
- [0xedf, 0xedf], /* LAO LETTER KHMU NYO */
- [0xee0, 0xee0],
- [0xee1, 0xee1],
- [0xee2, 0xee2],
- [0xee3, 0xee3],
- [0xee4, 0xee4],
- [0xee5, 0xee5],
- [0xee6, 0xee6],
- [0xee7, 0xee7],
- [0xee8, 0xee8],
- [0xee9, 0xee9],
- [0xeea, 0xeea],
- [0xeeb, 0xeeb],
- [0xeec, 0xeec],
- [0xeed, 0xeed],
- [0xeee, 0xeee],
- [0xeef, 0xeef],
- [0xef0, 0xef0],
- [0xef1, 0xef1],
- [0xef2, 0xef2],
- [0xef3, 0xef3],
- [0xef4, 0xef4],
- [0xef5, 0xef5],
- [0xef6, 0xef6],
- [0xef7, 0xef7],
- [0xef8, 0xef8],
- [0xef9, 0xef9],
- [0xefa, 0xefa],
- [0xefb, 0xefb],
- [0xefc, 0xefc],
- [0xefd, 0xefd],
- [0xefe, 0xefe],
- [0xeff, 0xeff],
- [0xf00, 0xf00], /* TIBETAN SYLLABLE OM */
- [0xf01, 0xf01], /* TIBETAN MARK GTER YIG MGO TRUNCATED A */
- [0xf02, 0xf02], /* TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA */
- [0xf03, 0xf03], /* TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA */
- [0xf04, 0xf04], /* TIBETAN MARK INITIAL YIG MGO MDUN MA (TIBETAN SINGLE ORNAMENT) */
- [0xf05, 0xf05], /* TIBETAN MARK CLOSING YIG MGO SGAB MA */
- [0xf06, 0xf06], /* TIBETAN MARK CARET YIG MGO PHUR SHAD MA */
- [0xf07, 0xf07], /* TIBETAN MARK YIG MGO TSHEG SHAD MA */
- [0xf08, 0xf08], /* TIBETAN MARK SBRUL SHAD (TIBETAN RGYANSHAD) */
- [0xf09, 0xf09], /* TIBETAN MARK BSKUR YIG MGO */
- [0xf0a, 0xf0a], /* TIBETAN MARK BKA- SHOG YIG MGO */
- [0xf0b, 0xf0b], /* TIBETAN MARK INTERSYLLABIC TSHEG (TIBETAN TSEG) */
- [0xf0c, 0xf0c], /* TIBETAN MARK DELIMITER TSHEG BSTAR */
- [0xf0d, 0xf0d], /* TIBETAN MARK SHAD (TIBETAN SHAD) */
- [0xf0e, 0xf0e], /* TIBETAN MARK NYIS SHAD (TIBETAN DOUBLE SHAD) */
- [0xf0f, 0xf0f], /* TIBETAN MARK TSHEG SHAD */
- [0xf10, 0xf10], /* TIBETAN MARK NYIS TSHEG SHAD */
- [0xf11, 0xf11], /* TIBETAN MARK RIN CHEN SPUNGS SHAD (TIBETAN RINCHANPHUNGSHAD) */
- [0xf12, 0xf12], /* TIBETAN MARK RGYA GRAM SHAD */
- [0xf13, 0xf13], /* TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN */
- [0xf14, 0xf14], /* TIBETAN MARK GTER TSHEG (TIBETAN COMMA) */
- [0xf15, 0xf15], /* TIBETAN LOGOTYPE SIGN CHAD RTAGS */
- [0xf16, 0xf16], /* TIBETAN LOGOTYPE SIGN LHAG RTAGS */
- [0xf17, 0xf17], /* TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS */
- [0xf18, 0xf18], /* TIBETAN ASTROLOGICAL SIGN -KHYUD PA */
- [0xf19, 0xf19], /* TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS */
- [0xf1a, 0xf1a], /* TIBETAN SIGN RDEL DKAR GCIG */
- [0xf1b, 0xf1b], /* TIBETAN SIGN RDEL DKAR GNYIS */
- [0xf1c, 0xf1c], /* TIBETAN SIGN RDEL DKAR GSUM */
- [0xf1d, 0xf1d], /* TIBETAN SIGN RDEL NAG GCIG */
- [0xf1e, 0xf1e], /* TIBETAN SIGN RDEL NAG GNYIS */
- [0xf1f, 0xf1f], /* TIBETAN SIGN RDEL DKAR RDEL NAG */
- [0xf20, 0xf20], /* TIBETAN DIGIT ZERO */
- [0xf21, 0xf21], /* TIBETAN DIGIT ONE */
- [0xf22, 0xf22], /* TIBETAN DIGIT TWO */
- [0xf23, 0xf23], /* TIBETAN DIGIT THREE */
- [0xf24, 0xf24], /* TIBETAN DIGIT FOUR */
- [0xf25, 0xf25], /* TIBETAN DIGIT FIVE */
- [0xf26, 0xf26], /* TIBETAN DIGIT SIX */
- [0xf27, 0xf27], /* TIBETAN DIGIT SEVEN */
- [0xf28, 0xf28], /* TIBETAN DIGIT EIGHT */
- [0xf29, 0xf29], /* TIBETAN DIGIT NINE */
- [0xf2a, 0xf2a], /* TIBETAN DIGIT HALF ONE */
- [0xf2b, 0xf2b], /* TIBETAN DIGIT HALF TWO */
- [0xf2c, 0xf2c], /* TIBETAN DIGIT HALF THREE */
- [0xf2d, 0xf2d], /* TIBETAN DIGIT HALF FOUR */
- [0xf2e, 0xf2e], /* TIBETAN DIGIT HALF FIVE */
- [0xf2f, 0xf2f], /* TIBETAN DIGIT HALF SIX */
- [0xf30, 0xf30], /* TIBETAN DIGIT HALF SEVEN */
- [0xf31, 0xf31], /* TIBETAN DIGIT HALF EIGHT */
- [0xf32, 0xf32], /* TIBETAN DIGIT HALF NINE */
- [0xf33, 0xf33], /* TIBETAN DIGIT HALF ZERO */
- [0xf34, 0xf34], /* TIBETAN MARK BSDUS RTAGS */
- [0xf35, 0xf35], /* TIBETAN MARK NGAS BZUNG NYI ZLA (TIBETAN HONORIFIC UNDER RING) */
- [0xf36, 0xf36], /* TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN */
- [0xf37, 0xf37], /* TIBETAN MARK NGAS BZUNG SGOR RTAGS (TIBETAN UNDER RING) */
- [0xf38, 0xf38], /* TIBETAN MARK CHE MGO */
- [0xf39, 0xf39], /* TIBETAN MARK TSA -PHRU (TIBETAN LENITION MARK) */
- [0xf3a, 0xf3a], /* TIBETAN MARK GUG RTAGS GYON */
- [0xf3b, 0xf3b], /* TIBETAN MARK GUG RTAGS GYAS */
- [0xf3c, 0xf3c], /* TIBETAN MARK ANG KHANG GYON (TIBETAN LEFT BRACE) */
- [0xf3d, 0xf3d], /* TIBETAN MARK ANG KHANG GYAS (TIBETAN RIGHT BRACE) */
- [0xf3e, 0xf3e], /* TIBETAN SIGN YAR TSHES */
- [0xf3f, 0xf3f], /* TIBETAN SIGN MAR TSHES */
- [0xf40, 0xf40], /* TIBETAN LETTER KA */
- [0xf41, 0xf41], /* TIBETAN LETTER KHA */
- [0xf42, 0xf42], /* TIBETAN LETTER GA */
- [0xf43, 0xf43], /* TIBETAN LETTER GHA */
- [0xf44, 0xf44], /* TIBETAN LETTER NGA */
- [0xf45, 0xf45], /* TIBETAN LETTER CA */
- [0xf46, 0xf46], /* TIBETAN LETTER CHA */
- [0xf47, 0xf47], /* TIBETAN LETTER JA */
- [0xf48, 0xf48],
- [0xf49, 0xf49], /* TIBETAN LETTER NYA */
- [0xf4a, 0xf4a], /* TIBETAN LETTER TTA (TIBETAN LETTER REVERSED TA) */
- [0xf4b, 0xf4b], /* TIBETAN LETTER TTHA (TIBETAN LETTER REVERSED THA) */
- [0xf4c, 0xf4c], /* TIBETAN LETTER DDA (TIBETAN LETTER REVERSED DA) */
- [0xf4d, 0xf4d], /* TIBETAN LETTER DDHA */
- [0xf4e, 0xf4e], /* TIBETAN LETTER NNA (TIBETAN LETTER REVERSED NA) */
- [0xf4f, 0xf4f], /* TIBETAN LETTER TA */
- [0xf50, 0xf50], /* TIBETAN LETTER THA */
- [0xf51, 0xf51], /* TIBETAN LETTER DA */
- [0xf52, 0xf52], /* TIBETAN LETTER DHA */
- [0xf53, 0xf53], /* TIBETAN LETTER NA */
- [0xf54, 0xf54], /* TIBETAN LETTER PA */
- [0xf55, 0xf55], /* TIBETAN LETTER PHA */
- [0xf56, 0xf56], /* TIBETAN LETTER BA */
- [0xf57, 0xf57], /* TIBETAN LETTER BHA */
- [0xf58, 0xf58], /* TIBETAN LETTER MA */
- [0xf59, 0xf59], /* TIBETAN LETTER TSA */
- [0xf5a, 0xf5a], /* TIBETAN LETTER TSHA */
- [0xf5b, 0xf5b], /* TIBETAN LETTER DZA */
- [0xf5c, 0xf5c], /* TIBETAN LETTER DZHA */
- [0xf5d, 0xf5d], /* TIBETAN LETTER WA */
- [0xf5e, 0xf5e], /* TIBETAN LETTER ZHA */
- [0xf5f, 0xf5f], /* TIBETAN LETTER ZA */
- [0xf60, 0xf60], /* TIBETAN LETTER -A (TIBETAN LETTER AA) */
- [0xf61, 0xf61], /* TIBETAN LETTER YA */
- [0xf62, 0xf62], /* TIBETAN LETTER RA */
- [0xf63, 0xf63], /* TIBETAN LETTER LA */
- [0xf64, 0xf64], /* TIBETAN LETTER SHA */
- [0xf65, 0xf65], /* TIBETAN LETTER SSA (TIBETAN LETTER REVERSED SHA) */
- [0xf66, 0xf66], /* TIBETAN LETTER SA */
- [0xf67, 0xf67], /* TIBETAN LETTER HA */
- [0xf68, 0xf68], /* TIBETAN LETTER A */
- [0xf69, 0xf69], /* TIBETAN LETTER KSSA */
- [0xf6a, 0xf6a], /* TIBETAN LETTER FIXED-FORM RA */
- [0xf6b, 0xf6b], /* TIBETAN LETTER KKA */
- [0xf6c, 0xf6c], /* TIBETAN LETTER RRA */
- [0xf6d, 0xf6d],
- [0xf6e, 0xf6e],
- [0xf6f, 0xf6f],
- [0xf70, 0xf70],
- [0xf71, 0xf71], /* TIBETAN VOWEL SIGN AA */
- [0xf72, 0xf72], /* TIBETAN VOWEL SIGN I */
- [0xf73, 0xf73], /* TIBETAN VOWEL SIGN II */
- [0xf74, 0xf74], /* TIBETAN VOWEL SIGN U */
- [0xf75, 0xf75], /* TIBETAN VOWEL SIGN UU */
- [0xf76, 0xf76], /* TIBETAN VOWEL SIGN VOCALIC R */
- [0xf77, 0xf77], /* TIBETAN VOWEL SIGN VOCALIC RR */
- [0xf78, 0xf78], /* TIBETAN VOWEL SIGN VOCALIC L */
- [0xf79, 0xf79], /* TIBETAN VOWEL SIGN VOCALIC LL */
- [0xf7a, 0xf7a], /* TIBETAN VOWEL SIGN E */
- [0xf7b, 0xf7b], /* TIBETAN VOWEL SIGN EE (TIBETAN VOWEL SIGN AI) */
- [0xf7c, 0xf7c], /* TIBETAN VOWEL SIGN O */
- [0xf7d, 0xf7d], /* TIBETAN VOWEL SIGN OO (TIBETAN VOWEL SIGN AU) */
- [0xf7e, 0xf7e], /* TIBETAN SIGN RJES SU NGA RO (TIBETAN ANUSVARA) */
- [0xf7f, 0xf7f], /* TIBETAN SIGN RNAM BCAD (TIBETAN VISARGA) */
- [0xf80, 0xf80], /* TIBETAN VOWEL SIGN REVERSED I (TIBETAN VOWEL SIGN SHORT I) */
- [0xf81, 0xf81], /* TIBETAN VOWEL SIGN REVERSED II */
- [0xf82, 0xf82], /* TIBETAN SIGN NYI ZLA NAA DA (TIBETAN CANDRABINDU WITH ORNAMENT) */
- [0xf83, 0xf83], /* TIBETAN SIGN SNA LDAN (TIBETAN CANDRABINDU) */
- [0xf84, 0xf84], /* TIBETAN MARK HALANTA (TIBETAN VIRAMA) */
- [0xf85, 0xf85], /* TIBETAN MARK PALUTA (TIBETAN CHUCHENYIGE) */
- [0xf86, 0xf86], /* TIBETAN SIGN LCI RTAGS */
- [0xf87, 0xf87], /* TIBETAN SIGN YANG RTAGS */
- [0xf88, 0xf88], /* TIBETAN SIGN LCE TSA CAN */
- [0xf89, 0xf89], /* TIBETAN SIGN MCHU CAN */
- [0xf8a, 0xf8a], /* TIBETAN SIGN GRU CAN RGYINGS */
- [0xf8b, 0xf8b], /* TIBETAN SIGN GRU MED RGYINGS */
- [0xf8c, 0xf8c], /* TIBETAN SIGN INVERTED MCHU CAN */
- [0xf8d, 0xf8d], /* TIBETAN SUBJOINED SIGN LCE TSA CAN */
- [0xf8e, 0xf8e], /* TIBETAN SUBJOINED SIGN MCHU CAN */
- [0xf8f, 0xf8f], /* TIBETAN SUBJOINED SIGN INVERTED MCHU CAN */
- [0xf90, 0xf90], /* TIBETAN SUBJOINED LETTER KA */
- [0xf91, 0xf91], /* TIBETAN SUBJOINED LETTER KHA */
- [0xf92, 0xf92], /* TIBETAN SUBJOINED LETTER GA */
- [0xf93, 0xf93], /* TIBETAN SUBJOINED LETTER GHA */
- [0xf94, 0xf94], /* TIBETAN SUBJOINED LETTER NGA */
- [0xf95, 0xf95], /* TIBETAN SUBJOINED LETTER CA */
- [0xf96, 0xf96], /* TIBETAN SUBJOINED LETTER CHA */
- [0xf97, 0xf97], /* TIBETAN SUBJOINED LETTER JA */
- [0xf98, 0xf98],
- [0xf99, 0xf99], /* TIBETAN SUBJOINED LETTER NYA */
- [0xf9a, 0xf9a], /* TIBETAN SUBJOINED LETTER TTA */
- [0xf9b, 0xf9b], /* TIBETAN SUBJOINED LETTER TTHA */
- [0xf9c, 0xf9c], /* TIBETAN SUBJOINED LETTER DDA */
- [0xf9d, 0xf9d], /* TIBETAN SUBJOINED LETTER DDHA */
- [0xf9e, 0xf9e], /* TIBETAN SUBJOINED LETTER NNA */
- [0xf9f, 0xf9f], /* TIBETAN SUBJOINED LETTER TA */
- [0xfa0, 0xfa0], /* TIBETAN SUBJOINED LETTER THA */
- [0xfa1, 0xfa1], /* TIBETAN SUBJOINED LETTER DA */
- [0xfa2, 0xfa2], /* TIBETAN SUBJOINED LETTER DHA */
- [0xfa3, 0xfa3], /* TIBETAN SUBJOINED LETTER NA */
- [0xfa4, 0xfa4], /* TIBETAN SUBJOINED LETTER PA */
- [0xfa5, 0xfa5], /* TIBETAN SUBJOINED LETTER PHA */
- [0xfa6, 0xfa6], /* TIBETAN SUBJOINED LETTER BA */
- [0xfa7, 0xfa7], /* TIBETAN SUBJOINED LETTER BHA */
- [0xfa8, 0xfa8], /* TIBETAN SUBJOINED LETTER MA */
- [0xfa9, 0xfa9], /* TIBETAN SUBJOINED LETTER TSA */
- [0xfaa, 0xfaa], /* TIBETAN SUBJOINED LETTER TSHA */
- [0xfab, 0xfab], /* TIBETAN SUBJOINED LETTER DZA */
- [0xfac, 0xfac], /* TIBETAN SUBJOINED LETTER DZHA */
- [0xfad, 0xfad], /* TIBETAN SUBJOINED LETTER WA */
- [0xfae, 0xfae], /* TIBETAN SUBJOINED LETTER ZHA */
- [0xfaf, 0xfaf], /* TIBETAN SUBJOINED LETTER ZA */
- [0xfb0, 0xfb0], /* TIBETAN SUBJOINED LETTER -A */
- [0xfb1, 0xfb1], /* TIBETAN SUBJOINED LETTER YA */
- [0xfb2, 0xfb2], /* TIBETAN SUBJOINED LETTER RA */
- [0xfb3, 0xfb3], /* TIBETAN SUBJOINED LETTER LA */
- [0xfb4, 0xfb4], /* TIBETAN SUBJOINED LETTER SHA */
- [0xfb5, 0xfb5], /* TIBETAN SUBJOINED LETTER SSA */
- [0xfb6, 0xfb6], /* TIBETAN SUBJOINED LETTER SA */
- [0xfb7, 0xfb7], /* TIBETAN SUBJOINED LETTER HA */
- [0xfb8, 0xfb8], /* TIBETAN SUBJOINED LETTER A */
- [0xfb9, 0xfb9], /* TIBETAN SUBJOINED LETTER KSSA */
- [0xfba, 0xfba], /* TIBETAN SUBJOINED LETTER FIXED-FORM WA */
- [0xfbb, 0xfbb], /* TIBETAN SUBJOINED LETTER FIXED-FORM YA */
- [0xfbc, 0xfbc], /* TIBETAN SUBJOINED LETTER FIXED-FORM RA */
- [0xfbd, 0xfbd],
- [0xfbe, 0xfbe], /* TIBETAN KU RU KHA */
- [0xfbf, 0xfbf], /* TIBETAN KU RU KHA BZHI MIG CAN */
- [0xfc0, 0xfc0], /* TIBETAN CANTILLATION SIGN HEAVY BEAT */
- [0xfc1, 0xfc1], /* TIBETAN CANTILLATION SIGN LIGHT BEAT */
- [0xfc2, 0xfc2], /* TIBETAN CANTILLATION SIGN CANG TE-U */
- [0xfc3, 0xfc3], /* TIBETAN CANTILLATION SIGN SBUB -CHAL */
- [0xfc4, 0xfc4], /* TIBETAN SYMBOL DRIL BU */
- [0xfc5, 0xfc5], /* TIBETAN SYMBOL RDO RJE */
- [0xfc6, 0xfc6], /* TIBETAN SYMBOL PADMA GDAN */
- [0xfc7, 0xfc7], /* TIBETAN SYMBOL RDO RJE RGYA GRAM */
- [0xfc8, 0xfc8], /* TIBETAN SYMBOL PHUR PA */
- [0xfc9, 0xfc9], /* TIBETAN SYMBOL NOR BU */
- [0xfca, 0xfca], /* TIBETAN SYMBOL NOR BU NYIS -KHYIL */
- [0xfcb, 0xfcb], /* TIBETAN SYMBOL NOR BU GSUM -KHYIL */
- [0xfcc, 0xfcc], /* TIBETAN SYMBOL NOR BU BZHI -KHYIL */
- [0xfcd, 0xfcd],
- [0xfce, 0xfce], /* TIBETAN SIGN RDEL NAG RDEL DKAR */
- [0xfcf, 0xfcf], /* TIBETAN SIGN RDEL NAG GSUM */
- [0xfd0, 0xfd0], /* TIBETAN MARK BSKA- SHOG GI MGO RGYAN */
- [0xfd1, 0xfd1], /* TIBETAN MARK MNYAM YIG GI MGO RGYAN */
- [0xfd2, 0xfd2], /* TIBETAN MARK NYIS TSHEG */
- [0xfd3, 0xfd3], /* TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA */
- [0xfd4, 0xfd4], /* TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA */
- [0xfd5, 0xfd5], /* RIGHT-FACING SVASTI SIGN */
- [0xfd6, 0xfd6], /* LEFT-FACING SVASTI SIGN */
- [0xfd7, 0xfd7], /* RIGHT-FACING SVASTI SIGN WITH DOTS */
- [0xfd8, 0xfd8], /* LEFT-FACING SVASTI SIGN WITH DOTS */
- [0xfd9, 0xfd9], /* TIBETAN MARK LEADING MCHAN RTAGS */
- [0xfda, 0xfda], /* TIBETAN MARK TRAILING MCHAN RTAGS */
- [0xfdb, 0xfdb],
- [0xfdc, 0xfdc],
- [0xfdd, 0xfdd],
- [0xfde, 0xfde],
- [0xfdf, 0xfdf],
- [0xfe0, 0xfe0],
- [0xfe1, 0xfe1],
- [0xfe2, 0xfe2],
- [0xfe3, 0xfe3],
- [0xfe4, 0xfe4],
- [0xfe5, 0xfe5],
- [0xfe6, 0xfe6],
- [0xfe7, 0xfe7],
- [0xfe8, 0xfe8],
- [0xfe9, 0xfe9],
- [0xfea, 0xfea],
- [0xfeb, 0xfeb],
- [0xfec, 0xfec],
- [0xfed, 0xfed],
- [0xfee, 0xfee],
- [0xfef, 0xfef],
- [0xff0, 0xff0],
- [0xff1, 0xff1],
- [0xff2, 0xff2],
- [0xff3, 0xff3],
- [0xff4, 0xff4],
- [0xff5, 0xff5],
- [0xff6, 0xff6],
- [0xff7, 0xff7],
- [0xff8, 0xff8],
- [0xff9, 0xff9],
- [0xffa, 0xffa],
- [0xffb, 0xffb],
- [0xffc, 0xffc],
- [0xffd, 0xffd],
- [0xffe, 0xffe],
- [0xfff, 0xfff],
- [0x1000, 0x1000], /* MYANMAR LETTER KA */
- [0x1001, 0x1001], /* MYANMAR LETTER KHA */
- [0x1002, 0x1002], /* MYANMAR LETTER GA */
- [0x1003, 0x1003], /* MYANMAR LETTER GHA */
- [0x1004, 0x1004], /* MYANMAR LETTER NGA */
- [0x1005, 0x1005], /* MYANMAR LETTER CA */
- [0x1006, 0x1006], /* MYANMAR LETTER CHA */
- [0x1007, 0x1007], /* MYANMAR LETTER JA */
- [0x1008, 0x1008], /* MYANMAR LETTER JHA */
- [0x1009, 0x1009], /* MYANMAR LETTER NYA */
- [0x100a, 0x100a], /* MYANMAR LETTER NNYA */
- [0x100b, 0x100b], /* MYANMAR LETTER TTA */
- [0x100c, 0x100c], /* MYANMAR LETTER TTHA */
- [0x100d, 0x100d], /* MYANMAR LETTER DDA */
- [0x100e, 0x100e], /* MYANMAR LETTER DDHA */
- [0x100f, 0x100f], /* MYANMAR LETTER NNA */
- [0x1010, 0x1010], /* MYANMAR LETTER TA */
- [0x1011, 0x1011], /* MYANMAR LETTER THA */
- [0x1012, 0x1012], /* MYANMAR LETTER DA */
- [0x1013, 0x1013], /* MYANMAR LETTER DHA */
- [0x1014, 0x1014], /* MYANMAR LETTER NA */
- [0x1015, 0x1015], /* MYANMAR LETTER PA */
- [0x1016, 0x1016], /* MYANMAR LETTER PHA */
- [0x1017, 0x1017], /* MYANMAR LETTER BA */
- [0x1018, 0x1018], /* MYANMAR LETTER BHA */
- [0x1019, 0x1019], /* MYANMAR LETTER MA */
- [0x101a, 0x101a], /* MYANMAR LETTER YA */
- [0x101b, 0x101b], /* MYANMAR LETTER RA */
- [0x101c, 0x101c], /* MYANMAR LETTER LA */
- [0x101d, 0x101d], /* MYANMAR LETTER WA */
- [0x101e, 0x101e], /* MYANMAR LETTER SA */
- [0x101f, 0x101f], /* MYANMAR LETTER HA */
- [0x1020, 0x1020], /* MYANMAR LETTER LLA */
- [0x1021, 0x1021], /* MYANMAR LETTER A */
- [0x1022, 0x1022], /* MYANMAR LETTER SHAN A */
- [0x1023, 0x1023], /* MYANMAR LETTER I */
- [0x1024, 0x1024], /* MYANMAR LETTER II */
- [0x1025, 0x1025], /* MYANMAR LETTER U */
- [0x1026, 0x1026], /* MYANMAR LETTER UU */
- [0x1027, 0x1027], /* MYANMAR LETTER E */
- [0x1028, 0x1028], /* MYANMAR LETTER MON E */
- [0x1029, 0x1029], /* MYANMAR LETTER O */
- [0x102a, 0x102a], /* MYANMAR LETTER AU */
- [0x102b, 0x102b], /* MYANMAR VOWEL SIGN TALL AA */
- [0x102c, 0x102c], /* MYANMAR VOWEL SIGN AA */
- [0x102d, 0x102d], /* MYANMAR VOWEL SIGN I */
- [0x102e, 0x102e], /* MYANMAR VOWEL SIGN II */
- [0x102f, 0x102f], /* MYANMAR VOWEL SIGN U */
- [0x1030, 0x1030], /* MYANMAR VOWEL SIGN UU */
- [0x1031, 0x1031], /* MYANMAR VOWEL SIGN E */
- [0x1032, 0x1032], /* MYANMAR VOWEL SIGN AI */
- [0x1033, 0x1033], /* MYANMAR VOWEL SIGN MON II */
- [0x1034, 0x1034], /* MYANMAR VOWEL SIGN MON O */
- [0x1035, 0x1035], /* MYANMAR VOWEL SIGN E ABOVE */
- [0x1036, 0x1036], /* MYANMAR SIGN ANUSVARA */
- [0x1037, 0x1037], /* MYANMAR SIGN DOT BELOW */
- [0x1038, 0x1038], /* MYANMAR SIGN VISARGA */
- [0x1039, 0x1039], /* MYANMAR SIGN VIRAMA */
- [0x103a, 0x103a], /* MYANMAR SIGN ASAT */
- [0x103b, 0x103b], /* MYANMAR CONSONANT SIGN MEDIAL YA */
- [0x103c, 0x103c], /* MYANMAR CONSONANT SIGN MEDIAL RA */
- [0x103d, 0x103d], /* MYANMAR CONSONANT SIGN MEDIAL WA */
- [0x103e, 0x103e], /* MYANMAR CONSONANT SIGN MEDIAL HA */
- [0x103f, 0x103f], /* MYANMAR LETTER GREAT SA */
- [0x1040, 0x1040], /* MYANMAR DIGIT ZERO */
- [0x1041, 0x1041], /* MYANMAR DIGIT ONE */
- [0x1042, 0x1042], /* MYANMAR DIGIT TWO */
- [0x1043, 0x1043], /* MYANMAR DIGIT THREE */
- [0x1044, 0x1044], /* MYANMAR DIGIT FOUR */
- [0x1045, 0x1045], /* MYANMAR DIGIT FIVE */
- [0x1046, 0x1046], /* MYANMAR DIGIT SIX */
- [0x1047, 0x1047], /* MYANMAR DIGIT SEVEN */
- [0x1048, 0x1048], /* MYANMAR DIGIT EIGHT */
- [0x1049, 0x1049], /* MYANMAR DIGIT NINE */
- [0x104a, 0x104a], /* MYANMAR SIGN LITTLE SECTION */
- [0x104b, 0x104b], /* MYANMAR SIGN SECTION */
- [0x104c, 0x104c], /* MYANMAR SYMBOL LOCATIVE */
- [0x104d, 0x104d], /* MYANMAR SYMBOL COMPLETED */
- [0x104e, 0x104e], /* MYANMAR SYMBOL AFOREMENTIONED */
- [0x104f, 0x104f], /* MYANMAR SYMBOL GENITIVE */
- [0x1050, 0x1050], /* MYANMAR LETTER SHA */
- [0x1051, 0x1051], /* MYANMAR LETTER SSA */
- [0x1052, 0x1052], /* MYANMAR LETTER VOCALIC R */
- [0x1053, 0x1053], /* MYANMAR LETTER VOCALIC RR */
- [0x1054, 0x1054], /* MYANMAR LETTER VOCALIC L */
- [0x1055, 0x1055], /* MYANMAR LETTER VOCALIC LL */
- [0x1056, 0x1056], /* MYANMAR VOWEL SIGN VOCALIC R */
- [0x1057, 0x1057], /* MYANMAR VOWEL SIGN VOCALIC RR */
- [0x1058, 0x1058], /* MYANMAR VOWEL SIGN VOCALIC L */
- [0x1059, 0x1059], /* MYANMAR VOWEL SIGN VOCALIC LL */
- [0x105a, 0x105a], /* MYANMAR LETTER MON NGA */
- [0x105b, 0x105b], /* MYANMAR LETTER MON JHA */
- [0x105c, 0x105c], /* MYANMAR LETTER MON BBA */
- [0x105d, 0x105d], /* MYANMAR LETTER MON BBE */
- [0x105e, 0x105e], /* MYANMAR CONSONANT SIGN MON MEDIAL NA */
- [0x105f, 0x105f], /* MYANMAR CONSONANT SIGN MON MEDIAL MA */
- [0x1060, 0x1060], /* MYANMAR CONSONANT SIGN MON MEDIAL LA */
- [0x1061, 0x1061], /* MYANMAR LETTER SGAW KAREN SHA */
- [0x1062, 0x1062], /* MYANMAR VOWEL SIGN SGAW KAREN EU */
- [0x1063, 0x1063], /* MYANMAR TONE MARK SGAW KAREN HATHI */
- [0x1064, 0x1064], /* MYANMAR TONE MARK SGAW KAREN KE PHO */
- [0x1065, 0x1065], /* MYANMAR LETTER WESTERN PWO KAREN THA */
- [0x1066, 0x1066], /* MYANMAR LETTER WESTERN PWO KAREN PWA */
- [0x1067, 0x1067], /* MYANMAR VOWEL SIGN WESTERN PWO KAREN EU */
- [0x1068, 0x1068], /* MYANMAR VOWEL SIGN WESTERN PWO KAREN UE */
- [0x1069, 0x1069], /* MYANMAR SIGN WESTERN PWO KAREN TONE-1 */
- [0x106a, 0x106a], /* MYANMAR SIGN WESTERN PWO KAREN TONE-2 */
- [0x106b, 0x106b], /* MYANMAR SIGN WESTERN PWO KAREN TONE-3 */
- [0x106c, 0x106c], /* MYANMAR SIGN WESTERN PWO KAREN TONE-4 */
- [0x106d, 0x106d], /* MYANMAR SIGN WESTERN PWO KAREN TONE-5 */
- [0x106e, 0x106e], /* MYANMAR LETTER EASTERN PWO KAREN NNA */
- [0x106f, 0x106f], /* MYANMAR LETTER EASTERN PWO KAREN YWA */
- [0x1070, 0x1070], /* MYANMAR LETTER EASTERN PWO KAREN GHWA */
- [0x1071, 0x1071], /* MYANMAR VOWEL SIGN GEBA KAREN I */
- [0x1072, 0x1072], /* MYANMAR VOWEL SIGN KAYAH OE */
- [0x1073, 0x1073], /* MYANMAR VOWEL SIGN KAYAH U */
- [0x1074, 0x1074], /* MYANMAR VOWEL SIGN KAYAH EE */
- [0x1075, 0x1075], /* MYANMAR LETTER SHAN KA */
- [0x1076, 0x1076], /* MYANMAR LETTER SHAN KHA */
- [0x1077, 0x1077], /* MYANMAR LETTER SHAN GA */
- [0x1078, 0x1078], /* MYANMAR LETTER SHAN CA */
- [0x1079, 0x1079], /* MYANMAR LETTER SHAN ZA */
- [0x107a, 0x107a], /* MYANMAR LETTER SHAN NYA */
- [0x107b, 0x107b], /* MYANMAR LETTER SHAN DA */
- [0x107c, 0x107c], /* MYANMAR LETTER SHAN NA */
- [0x107d, 0x107d], /* MYANMAR LETTER SHAN PHA */
- [0x107e, 0x107e], /* MYANMAR LETTER SHAN FA */
- [0x107f, 0x107f], /* MYANMAR LETTER SHAN BA */
- [0x1080, 0x1080], /* MYANMAR LETTER SHAN THA */
- [0x1081, 0x1081], /* MYANMAR LETTER SHAN HA */
- [0x1082, 0x1082], /* MYANMAR CONSONANT SIGN SHAN MEDIAL WA */
- [0x1083, 0x1083], /* MYANMAR VOWEL SIGN SHAN AA */
- [0x1084, 0x1084], /* MYANMAR VOWEL SIGN SHAN E */
- [0x1085, 0x1085], /* MYANMAR VOWEL SIGN SHAN E ABOVE */
- [0x1086, 0x1086], /* MYANMAR VOWEL SIGN SHAN FINAL Y */
- [0x1087, 0x1087], /* MYANMAR SIGN SHAN TONE-2 */
- [0x1088, 0x1088], /* MYANMAR SIGN SHAN TONE-3 */
- [0x1089, 0x1089], /* MYANMAR SIGN SHAN TONE-5 */
- [0x108a, 0x108a], /* MYANMAR SIGN SHAN TONE-6 */
- [0x108b, 0x108b], /* MYANMAR SIGN SHAN COUNCIL TONE-2 */
- [0x108c, 0x108c], /* MYANMAR SIGN SHAN COUNCIL TONE-3 */
- [0x108d, 0x108d], /* MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE */
- [0x108e, 0x108e], /* MYANMAR LETTER RUMAI PALAUNG FA */
- [0x108f, 0x108f], /* MYANMAR SIGN RUMAI PALAUNG TONE-5 */
- [0x1090, 0x1090], /* MYANMAR SHAN DIGIT ZERO */
- [0x1091, 0x1091], /* MYANMAR SHAN DIGIT ONE */
- [0x1092, 0x1092], /* MYANMAR SHAN DIGIT TWO */
- [0x1093, 0x1093], /* MYANMAR SHAN DIGIT THREE */
- [0x1094, 0x1094], /* MYANMAR SHAN DIGIT FOUR */
- [0x1095, 0x1095], /* MYANMAR SHAN DIGIT FIVE */
- [0x1096, 0x1096], /* MYANMAR SHAN DIGIT SIX */
- [0x1097, 0x1097], /* MYANMAR SHAN DIGIT SEVEN */
- [0x1098, 0x1098], /* MYANMAR SHAN DIGIT EIGHT */
- [0x1099, 0x1099], /* MYANMAR SHAN DIGIT NINE */
- [0x109a, 0x109a], /* MYANMAR SIGN KHAMTI TONE-1 */
- [0x109b, 0x109b], /* MYANMAR SIGN KHAMTI TONE-3 */
- [0x109c, 0x109c], /* MYANMAR VOWEL SIGN AITON A */
- [0x109d, 0x109d], /* MYANMAR VOWEL SIGN AITON AI */
- [0x109e, 0x109e], /* MYANMAR SYMBOL SHAN ONE */
- [0x109f, 0x109f], /* MYANMAR SYMBOL SHAN EXCLAMATION */
- [0x10a0, 0x2d00], /* GEORGIAN CAPITAL LETTER AN */
- [0x10a1, 0x2d01], /* GEORGIAN CAPITAL LETTER BAN */
- [0x10a2, 0x2d02], /* GEORGIAN CAPITAL LETTER GAN */
- [0x10a3, 0x2d03], /* GEORGIAN CAPITAL LETTER DON */
- [0x10a4, 0x2d04], /* GEORGIAN CAPITAL LETTER EN */
- [0x10a5, 0x2d05], /* GEORGIAN CAPITAL LETTER VIN */
- [0x10a6, 0x2d06], /* GEORGIAN CAPITAL LETTER ZEN */
- [0x10a7, 0x2d07], /* GEORGIAN CAPITAL LETTER TAN */
- [0x10a8, 0x2d08], /* GEORGIAN CAPITAL LETTER IN */
- [0x10a9, 0x2d09], /* GEORGIAN CAPITAL LETTER KAN */
- [0x10aa, 0x2d0a], /* GEORGIAN CAPITAL LETTER LAS */
- [0x10ab, 0x2d0b], /* GEORGIAN CAPITAL LETTER MAN */
- [0x10ac, 0x2d0c], /* GEORGIAN CAPITAL LETTER NAR */
- [0x10ad, 0x2d0d], /* GEORGIAN CAPITAL LETTER ON */
- [0x10ae, 0x2d0e], /* GEORGIAN CAPITAL LETTER PAR */
- [0x10af, 0x2d0f], /* GEORGIAN CAPITAL LETTER ZHAR */
- [0x10b0, 0x2d10], /* GEORGIAN CAPITAL LETTER RAE */
- [0x10b1, 0x2d11], /* GEORGIAN CAPITAL LETTER SAN */
- [0x10b2, 0x2d12], /* GEORGIAN CAPITAL LETTER TAR */
- [0x10b3, 0x2d13], /* GEORGIAN CAPITAL LETTER UN */
- [0x10b4, 0x2d14], /* GEORGIAN CAPITAL LETTER PHAR */
- [0x10b5, 0x2d15], /* GEORGIAN CAPITAL LETTER KHAR */
- [0x10b6, 0x2d16], /* GEORGIAN CAPITAL LETTER GHAN */
- [0x10b7, 0x2d17], /* GEORGIAN CAPITAL LETTER QAR */
- [0x10b8, 0x2d18], /* GEORGIAN CAPITAL LETTER SHIN */
- [0x10b9, 0x2d19], /* GEORGIAN CAPITAL LETTER CHIN */
- [0x10ba, 0x2d1a], /* GEORGIAN CAPITAL LETTER CAN */
- [0x10bb, 0x2d1b], /* GEORGIAN CAPITAL LETTER JIL */
- [0x10bc, 0x2d1c], /* GEORGIAN CAPITAL LETTER CIL */
- [0x10bd, 0x2d1d], /* GEORGIAN CAPITAL LETTER CHAR */
- [0x10be, 0x2d1e], /* GEORGIAN CAPITAL LETTER XAN */
- [0x10bf, 0x2d1f], /* GEORGIAN CAPITAL LETTER JHAN */
- [0x10c0, 0x2d20], /* GEORGIAN CAPITAL LETTER HAE */
- [0x10c1, 0x2d21], /* GEORGIAN CAPITAL LETTER HE */
- [0x10c2, 0x2d22], /* GEORGIAN CAPITAL LETTER HIE */
- [0x10c3, 0x2d23], /* GEORGIAN CAPITAL LETTER WE */
- [0x10c4, 0x2d24], /* GEORGIAN CAPITAL LETTER HAR */
- [0x10c5, 0x2d25], /* GEORGIAN CAPITAL LETTER HOE */
- [0x10c6, 0x10c6],
- [0x10c7, 0x2d27], /* GEORGIAN CAPITAL LETTER YN */
- [0x10c8, 0x10c8],
- [0x10c9, 0x10c9],
- [0x10ca, 0x10ca],
- [0x10cb, 0x10cb],
- [0x10cc, 0x10cc],
- [0x10cd, 0x2d2d], /* GEORGIAN CAPITAL LETTER AEN */
- [0x10ce, 0x10ce],
- [0x10cf, 0x10cf],
- [0x1c90, 0x10d0], /* GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN) */
- [0x1c91, 0x10d1], /* GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN) */
- [0x1c92, 0x10d2], /* GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN) */
- [0x1c93, 0x10d3], /* GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON) */
- [0x1c94, 0x10d4], /* GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN) */
- [0x1c95, 0x10d5], /* GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN) */
- [0x1c96, 0x10d6], /* GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN) */
- [0x1c97, 0x10d7], /* GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN) */
- [0x1c98, 0x10d8], /* GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN) */
- [0x1c99, 0x10d9], /* GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN) */
- [0x1c9a, 0x10da], /* GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS) */
- [0x1c9b, 0x10db], /* GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN) */
- [0x1c9c, 0x10dc], /* GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR) */
- [0x1c9d, 0x10dd], /* GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON) */
- [0x1c9e, 0x10de], /* GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR) */
- [0x1c9f, 0x10df], /* GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR) */
- [0x1ca0, 0x10e0], /* GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE) */
- [0x1ca1, 0x10e1], /* GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN) */
- [0x1ca2, 0x10e2], /* GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR) */
- [0x1ca3, 0x10e3], /* GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN) */
- [0x1ca4, 0x10e4], /* GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR) */
- [0x1ca5, 0x10e5], /* GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR) */
- [0x1ca6, 0x10e6], /* GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN) */
- [0x1ca7, 0x10e7], /* GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR) */
- [0x1ca8, 0x10e8], /* GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN) */
- [0x1ca9, 0x10e9], /* GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN) */
- [0x1caa, 0x10ea], /* GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN) */
- [0x1cab, 0x10eb], /* GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL) */
- [0x1cac, 0x10ec], /* GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL) */
- [0x1cad, 0x10ed], /* GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR) */
- [0x1cae, 0x10ee], /* GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN) */
- [0x1caf, 0x10ef], /* GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN) */
- [0x1cb0, 0x10f0], /* GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE) */
- [0x1cb1, 0x10f1], /* GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE) */
- [0x1cb2, 0x10f2], /* GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE) */
- [0x1cb3, 0x10f3], /* GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE) */
- [0x1cb4, 0x10f4], /* GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR) */
- [0x1cb5, 0x10f5], /* GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE) */
- [0x1cb6, 0x10f6], /* GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI) */
- [0x1cb7, 0x10f7], /* GEORGIAN LETTER YN */
- [0x1cb8, 0x10f8], /* GEORGIAN LETTER ELIFI */
- [0x1cb9, 0x10f9], /* GEORGIAN LETTER TURNED GAN */
- [0x1cba, 0x10fa], /* GEORGIAN LETTER AIN */
- [0x10fb, 0x10fb], /* GEORGIAN PARAGRAPH SEPARATOR */
- [0x10fc, 0x10fc], /* MODIFIER LETTER GEORGIAN NAR */
- [0x1cbd, 0x10fd], /* GEORGIAN LETTER AEN */
- [0x1cbe, 0x10fe], /* GEORGIAN LETTER HARD SIGN */
- [0x1cbf, 0x10ff], /* GEORGIAN LETTER LABIAL SIGN */
- [0x1100, 0x1100], /* HANGUL CHOSEONG KIYEOK */
- [0x1101, 0x1101], /* HANGUL CHOSEONG SSANGKIYEOK */
- [0x1102, 0x1102], /* HANGUL CHOSEONG NIEUN */
- [0x1103, 0x1103], /* HANGUL CHOSEONG TIKEUT */
- [0x1104, 0x1104], /* HANGUL CHOSEONG SSANGTIKEUT */
- [0x1105, 0x1105], /* HANGUL CHOSEONG RIEUL */
- [0x1106, 0x1106], /* HANGUL CHOSEONG MIEUM */
- [0x1107, 0x1107], /* HANGUL CHOSEONG PIEUP */
- [0x1108, 0x1108], /* HANGUL CHOSEONG SSANGPIEUP */
- [0x1109, 0x1109], /* HANGUL CHOSEONG SIOS */
- [0x110a, 0x110a], /* HANGUL CHOSEONG SSANGSIOS */
- [0x110b, 0x110b], /* HANGUL CHOSEONG IEUNG */
- [0x110c, 0x110c], /* HANGUL CHOSEONG CIEUC */
- [0x110d, 0x110d], /* HANGUL CHOSEONG SSANGCIEUC */
- [0x110e, 0x110e], /* HANGUL CHOSEONG CHIEUCH */
- [0x110f, 0x110f], /* HANGUL CHOSEONG KHIEUKH */
- [0x1110, 0x1110], /* HANGUL CHOSEONG THIEUTH */
- [0x1111, 0x1111], /* HANGUL CHOSEONG PHIEUPH */
- [0x1112, 0x1112], /* HANGUL CHOSEONG HIEUH */
- [0x1113, 0x1113], /* HANGUL CHOSEONG NIEUN-KIYEOK */
- [0x1114, 0x1114], /* HANGUL CHOSEONG SSANGNIEUN */
- [0x1115, 0x1115], /* HANGUL CHOSEONG NIEUN-TIKEUT */
- [0x1116, 0x1116], /* HANGUL CHOSEONG NIEUN-PIEUP */
- [0x1117, 0x1117], /* HANGUL CHOSEONG TIKEUT-KIYEOK */
- [0x1118, 0x1118], /* HANGUL CHOSEONG RIEUL-NIEUN */
- [0x1119, 0x1119], /* HANGUL CHOSEONG SSANGRIEUL */
- [0x111a, 0x111a], /* HANGUL CHOSEONG RIEUL-HIEUH */
- [0x111b, 0x111b], /* HANGUL CHOSEONG KAPYEOUNRIEUL */
- [0x111c, 0x111c], /* HANGUL CHOSEONG MIEUM-PIEUP */
- [0x111d, 0x111d], /* HANGUL CHOSEONG KAPYEOUNMIEUM */
- [0x111e, 0x111e], /* HANGUL CHOSEONG PIEUP-KIYEOK */
- [0x111f, 0x111f], /* HANGUL CHOSEONG PIEUP-NIEUN */
- [0x1120, 0x1120], /* HANGUL CHOSEONG PIEUP-TIKEUT */
- [0x1121, 0x1121], /* HANGUL CHOSEONG PIEUP-SIOS */
- [0x1122, 0x1122], /* HANGUL CHOSEONG PIEUP-SIOS-KIYEOK */
- [0x1123, 0x1123], /* HANGUL CHOSEONG PIEUP-SIOS-TIKEUT */
- [0x1124, 0x1124], /* HANGUL CHOSEONG PIEUP-SIOS-PIEUP */
- [0x1125, 0x1125], /* HANGUL CHOSEONG PIEUP-SSANGSIOS */
- [0x1126, 0x1126], /* HANGUL CHOSEONG PIEUP-SIOS-CIEUC */
- [0x1127, 0x1127], /* HANGUL CHOSEONG PIEUP-CIEUC */
- [0x1128, 0x1128], /* HANGUL CHOSEONG PIEUP-CHIEUCH */
- [0x1129, 0x1129], /* HANGUL CHOSEONG PIEUP-THIEUTH */
- [0x112a, 0x112a], /* HANGUL CHOSEONG PIEUP-PHIEUPH */
- [0x112b, 0x112b], /* HANGUL CHOSEONG KAPYEOUNPIEUP */
- [0x112c, 0x112c], /* HANGUL CHOSEONG KAPYEOUNSSANGPIEUP */
- [0x112d, 0x112d], /* HANGUL CHOSEONG SIOS-KIYEOK */
- [0x112e, 0x112e], /* HANGUL CHOSEONG SIOS-NIEUN */
- [0x112f, 0x112f], /* HANGUL CHOSEONG SIOS-TIKEUT */
- [0x1130, 0x1130], /* HANGUL CHOSEONG SIOS-RIEUL */
- [0x1131, 0x1131], /* HANGUL CHOSEONG SIOS-MIEUM */
- [0x1132, 0x1132], /* HANGUL CHOSEONG SIOS-PIEUP */
- [0x1133, 0x1133], /* HANGUL CHOSEONG SIOS-PIEUP-KIYEOK */
- [0x1134, 0x1134], /* HANGUL CHOSEONG SIOS-SSANGSIOS */
- [0x1135, 0x1135], /* HANGUL CHOSEONG SIOS-IEUNG */
- [0x1136, 0x1136], /* HANGUL CHOSEONG SIOS-CIEUC */
- [0x1137, 0x1137], /* HANGUL CHOSEONG SIOS-CHIEUCH */
- [0x1138, 0x1138], /* HANGUL CHOSEONG SIOS-KHIEUKH */
- [0x1139, 0x1139], /* HANGUL CHOSEONG SIOS-THIEUTH */
- [0x113a, 0x113a], /* HANGUL CHOSEONG SIOS-PHIEUPH */
- [0x113b, 0x113b], /* HANGUL CHOSEONG SIOS-HIEUH */
- [0x113c, 0x113c], /* HANGUL CHOSEONG CHITUEUMSIOS */
- [0x113d, 0x113d], /* HANGUL CHOSEONG CHITUEUMSSANGSIOS */
- [0x113e, 0x113e], /* HANGUL CHOSEONG CEONGCHIEUMSIOS */
- [0x113f, 0x113f], /* HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS */
- [0x1140, 0x1140], /* HANGUL CHOSEONG PANSIOS */
- [0x1141, 0x1141], /* HANGUL CHOSEONG IEUNG-KIYEOK */
- [0x1142, 0x1142], /* HANGUL CHOSEONG IEUNG-TIKEUT */
- [0x1143, 0x1143], /* HANGUL CHOSEONG IEUNG-MIEUM */
- [0x1144, 0x1144], /* HANGUL CHOSEONG IEUNG-PIEUP */
- [0x1145, 0x1145], /* HANGUL CHOSEONG IEUNG-SIOS */
- [0x1146, 0x1146], /* HANGUL CHOSEONG IEUNG-PANSIOS */
- [0x1147, 0x1147], /* HANGUL CHOSEONG SSANGIEUNG */
- [0x1148, 0x1148], /* HANGUL CHOSEONG IEUNG-CIEUC */
- [0x1149, 0x1149], /* HANGUL CHOSEONG IEUNG-CHIEUCH */
- [0x114a, 0x114a], /* HANGUL CHOSEONG IEUNG-THIEUTH */
- [0x114b, 0x114b], /* HANGUL CHOSEONG IEUNG-PHIEUPH */
- [0x114c, 0x114c], /* HANGUL CHOSEONG YESIEUNG */
- [0x114d, 0x114d], /* HANGUL CHOSEONG CIEUC-IEUNG */
- [0x114e, 0x114e], /* HANGUL CHOSEONG CHITUEUMCIEUC */
- [0x114f, 0x114f], /* HANGUL CHOSEONG CHITUEUMSSANGCIEUC */
- [0x1150, 0x1150], /* HANGUL CHOSEONG CEONGCHIEUMCIEUC */
- [0x1151, 0x1151], /* HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC */
- [0x1152, 0x1152], /* HANGUL CHOSEONG CHIEUCH-KHIEUKH */
- [0x1153, 0x1153], /* HANGUL CHOSEONG CHIEUCH-HIEUH */
- [0x1154, 0x1154], /* HANGUL CHOSEONG CHITUEUMCHIEUCH */
- [0x1155, 0x1155], /* HANGUL CHOSEONG CEONGCHIEUMCHIEUCH */
- [0x1156, 0x1156], /* HANGUL CHOSEONG PHIEUPH-PIEUP */
- [0x1157, 0x1157], /* HANGUL CHOSEONG KAPYEOUNPHIEUPH */
- [0x1158, 0x1158], /* HANGUL CHOSEONG SSANGHIEUH */
- [0x1159, 0x1159], /* HANGUL CHOSEONG YEORINHIEUH */
- [0x115a, 0x115a], /* HANGUL CHOSEONG KIYEOK-TIKEUT */
- [0x115b, 0x115b], /* HANGUL CHOSEONG NIEUN-SIOS */
- [0x115c, 0x115c], /* HANGUL CHOSEONG NIEUN-CIEUC */
- [0x115d, 0x115d], /* HANGUL CHOSEONG NIEUN-HIEUH */
- [0x115e, 0x115e], /* HANGUL CHOSEONG TIKEUT-RIEUL */
- [0x115f, 0x115f], /* HANGUL CHOSEONG FILLER */
- [0x1160, 0x1160], /* HANGUL JUNGSEONG FILLER */
- [0x1161, 0x1161], /* HANGUL JUNGSEONG A */
- [0x1162, 0x1162], /* HANGUL JUNGSEONG AE */
- [0x1163, 0x1163], /* HANGUL JUNGSEONG YA */
- [0x1164, 0x1164], /* HANGUL JUNGSEONG YAE */
- [0x1165, 0x1165], /* HANGUL JUNGSEONG EO */
- [0x1166, 0x1166], /* HANGUL JUNGSEONG E */
- [0x1167, 0x1167], /* HANGUL JUNGSEONG YEO */
- [0x1168, 0x1168], /* HANGUL JUNGSEONG YE */
- [0x1169, 0x1169], /* HANGUL JUNGSEONG O */
- [0x116a, 0x116a], /* HANGUL JUNGSEONG WA */
- [0x116b, 0x116b], /* HANGUL JUNGSEONG WAE */
- [0x116c, 0x116c], /* HANGUL JUNGSEONG OE */
- [0x116d, 0x116d], /* HANGUL JUNGSEONG YO */
- [0x116e, 0x116e], /* HANGUL JUNGSEONG U */
- [0x116f, 0x116f], /* HANGUL JUNGSEONG WEO */
- [0x1170, 0x1170], /* HANGUL JUNGSEONG WE */
- [0x1171, 0x1171], /* HANGUL JUNGSEONG WI */
- [0x1172, 0x1172], /* HANGUL JUNGSEONG YU */
- [0x1173, 0x1173], /* HANGUL JUNGSEONG EU */
- [0x1174, 0x1174], /* HANGUL JUNGSEONG YI */
- [0x1175, 0x1175], /* HANGUL JUNGSEONG I */
- [0x1176, 0x1176], /* HANGUL JUNGSEONG A-O */
- [0x1177, 0x1177], /* HANGUL JUNGSEONG A-U */
- [0x1178, 0x1178], /* HANGUL JUNGSEONG YA-O */
- [0x1179, 0x1179], /* HANGUL JUNGSEONG YA-YO */
- [0x117a, 0x117a], /* HANGUL JUNGSEONG EO-O */
- [0x117b, 0x117b], /* HANGUL JUNGSEONG EO-U */
- [0x117c, 0x117c], /* HANGUL JUNGSEONG EO-EU */
- [0x117d, 0x117d], /* HANGUL JUNGSEONG YEO-O */
- [0x117e, 0x117e], /* HANGUL JUNGSEONG YEO-U */
- [0x117f, 0x117f], /* HANGUL JUNGSEONG O-EO */
- [0x1180, 0x1180], /* HANGUL JUNGSEONG O-E */
- [0x1181, 0x1181], /* HANGUL JUNGSEONG O-YE */
- [0x1182, 0x1182], /* HANGUL JUNGSEONG O-O */
- [0x1183, 0x1183], /* HANGUL JUNGSEONG O-U */
- [0x1184, 0x1184], /* HANGUL JUNGSEONG YO-YA */
- [0x1185, 0x1185], /* HANGUL JUNGSEONG YO-YAE */
- [0x1186, 0x1186], /* HANGUL JUNGSEONG YO-YEO */
- [0x1187, 0x1187], /* HANGUL JUNGSEONG YO-O */
- [0x1188, 0x1188], /* HANGUL JUNGSEONG YO-I */
- [0x1189, 0x1189], /* HANGUL JUNGSEONG U-A */
- [0x118a, 0x118a], /* HANGUL JUNGSEONG U-AE */
- [0x118b, 0x118b], /* HANGUL JUNGSEONG U-EO-EU */
- [0x118c, 0x118c], /* HANGUL JUNGSEONG U-YE */
- [0x118d, 0x118d], /* HANGUL JUNGSEONG U-U */
- [0x118e, 0x118e], /* HANGUL JUNGSEONG YU-A */
- [0x118f, 0x118f], /* HANGUL JUNGSEONG YU-EO */
- [0x1190, 0x1190], /* HANGUL JUNGSEONG YU-E */
- [0x1191, 0x1191], /* HANGUL JUNGSEONG YU-YEO */
- [0x1192, 0x1192], /* HANGUL JUNGSEONG YU-YE */
- [0x1193, 0x1193], /* HANGUL JUNGSEONG YU-U */
- [0x1194, 0x1194], /* HANGUL JUNGSEONG YU-I */
- [0x1195, 0x1195], /* HANGUL JUNGSEONG EU-U */
- [0x1196, 0x1196], /* HANGUL JUNGSEONG EU-EU */
- [0x1197, 0x1197], /* HANGUL JUNGSEONG YI-U */
- [0x1198, 0x1198], /* HANGUL JUNGSEONG I-A */
- [0x1199, 0x1199], /* HANGUL JUNGSEONG I-YA */
- [0x119a, 0x119a], /* HANGUL JUNGSEONG I-O */
- [0x119b, 0x119b], /* HANGUL JUNGSEONG I-U */
- [0x119c, 0x119c], /* HANGUL JUNGSEONG I-EU */
- [0x119d, 0x119d], /* HANGUL JUNGSEONG I-ARAEA */
- [0x119e, 0x119e], /* HANGUL JUNGSEONG ARAEA */
- [0x119f, 0x119f], /* HANGUL JUNGSEONG ARAEA-EO */
- [0x11a0, 0x11a0], /* HANGUL JUNGSEONG ARAEA-U */
- [0x11a1, 0x11a1], /* HANGUL JUNGSEONG ARAEA-I */
- [0x11a2, 0x11a2], /* HANGUL JUNGSEONG SSANGARAEA */
- [0x11a3, 0x11a3], /* HANGUL JUNGSEONG A-EU */
- [0x11a4, 0x11a4], /* HANGUL JUNGSEONG YA-U */
- [0x11a5, 0x11a5], /* HANGUL JUNGSEONG YEO-YA */
- [0x11a6, 0x11a6], /* HANGUL JUNGSEONG O-YA */
- [0x11a7, 0x11a7], /* HANGUL JUNGSEONG O-YAE */
- [0x11a8, 0x11a8], /* HANGUL JONGSEONG KIYEOK */
- [0x11a9, 0x11a9], /* HANGUL JONGSEONG SSANGKIYEOK */
- [0x11aa, 0x11aa], /* HANGUL JONGSEONG KIYEOK-SIOS */
- [0x11ab, 0x11ab], /* HANGUL JONGSEONG NIEUN */
- [0x11ac, 0x11ac], /* HANGUL JONGSEONG NIEUN-CIEUC */
- [0x11ad, 0x11ad], /* HANGUL JONGSEONG NIEUN-HIEUH */
- [0x11ae, 0x11ae], /* HANGUL JONGSEONG TIKEUT */
- [0x11af, 0x11af], /* HANGUL JONGSEONG RIEUL */
- [0x11b0, 0x11b0], /* HANGUL JONGSEONG RIEUL-KIYEOK */
- [0x11b1, 0x11b1], /* HANGUL JONGSEONG RIEUL-MIEUM */
- [0x11b2, 0x11b2], /* HANGUL JONGSEONG RIEUL-PIEUP */
- [0x11b3, 0x11b3], /* HANGUL JONGSEONG RIEUL-SIOS */
- [0x11b4, 0x11b4], /* HANGUL JONGSEONG RIEUL-THIEUTH */
- [0x11b5, 0x11b5], /* HANGUL JONGSEONG RIEUL-PHIEUPH */
- [0x11b6, 0x11b6], /* HANGUL JONGSEONG RIEUL-HIEUH */
- [0x11b7, 0x11b7], /* HANGUL JONGSEONG MIEUM */
- [0x11b8, 0x11b8], /* HANGUL JONGSEONG PIEUP */
- [0x11b9, 0x11b9], /* HANGUL JONGSEONG PIEUP-SIOS */
- [0x11ba, 0x11ba], /* HANGUL JONGSEONG SIOS */
- [0x11bb, 0x11bb], /* HANGUL JONGSEONG SSANGSIOS */
- [0x11bc, 0x11bc], /* HANGUL JONGSEONG IEUNG */
- [0x11bd, 0x11bd], /* HANGUL JONGSEONG CIEUC */
- [0x11be, 0x11be], /* HANGUL JONGSEONG CHIEUCH */
- [0x11bf, 0x11bf], /* HANGUL JONGSEONG KHIEUKH */
- [0x11c0, 0x11c0], /* HANGUL JONGSEONG THIEUTH */
- [0x11c1, 0x11c1], /* HANGUL JONGSEONG PHIEUPH */
- [0x11c2, 0x11c2], /* HANGUL JONGSEONG HIEUH */
- [0x11c3, 0x11c3], /* HANGUL JONGSEONG KIYEOK-RIEUL */
- [0x11c4, 0x11c4], /* HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK */
- [0x11c5, 0x11c5], /* HANGUL JONGSEONG NIEUN-KIYEOK */
- [0x11c6, 0x11c6], /* HANGUL JONGSEONG NIEUN-TIKEUT */
- [0x11c7, 0x11c7], /* HANGUL JONGSEONG NIEUN-SIOS */
- [0x11c8, 0x11c8], /* HANGUL JONGSEONG NIEUN-PANSIOS */
- [0x11c9, 0x11c9], /* HANGUL JONGSEONG NIEUN-THIEUTH */
- [0x11ca, 0x11ca], /* HANGUL JONGSEONG TIKEUT-KIYEOK */
- [0x11cb, 0x11cb], /* HANGUL JONGSEONG TIKEUT-RIEUL */
- [0x11cc, 0x11cc], /* HANGUL JONGSEONG RIEUL-KIYEOK-SIOS */
- [0x11cd, 0x11cd], /* HANGUL JONGSEONG RIEUL-NIEUN */
- [0x11ce, 0x11ce], /* HANGUL JONGSEONG RIEUL-TIKEUT */
- [0x11cf, 0x11cf], /* HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH */
- [0x11d0, 0x11d0], /* HANGUL JONGSEONG SSANGRIEUL */
- [0x11d1, 0x11d1], /* HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK */
- [0x11d2, 0x11d2], /* HANGUL JONGSEONG RIEUL-MIEUM-SIOS */
- [0x11d3, 0x11d3], /* HANGUL JONGSEONG RIEUL-PIEUP-SIOS */
- [0x11d4, 0x11d4], /* HANGUL JONGSEONG RIEUL-PIEUP-HIEUH */
- [0x11d5, 0x11d5], /* HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP */
- [0x11d6, 0x11d6], /* HANGUL JONGSEONG RIEUL-SSANGSIOS */
- [0x11d7, 0x11d7], /* HANGUL JONGSEONG RIEUL-PANSIOS */
- [0x11d8, 0x11d8], /* HANGUL JONGSEONG RIEUL-KHIEUKH */
- [0x11d9, 0x11d9], /* HANGUL JONGSEONG RIEUL-YEORINHIEUH */
- [0x11da, 0x11da], /* HANGUL JONGSEONG MIEUM-KIYEOK */
- [0x11db, 0x11db], /* HANGUL JONGSEONG MIEUM-RIEUL */
- [0x11dc, 0x11dc], /* HANGUL JONGSEONG MIEUM-PIEUP */
- [0x11dd, 0x11dd], /* HANGUL JONGSEONG MIEUM-SIOS */
- [0x11de, 0x11de], /* HANGUL JONGSEONG MIEUM-SSANGSIOS */
- [0x11df, 0x11df], /* HANGUL JONGSEONG MIEUM-PANSIOS */
- [0x11e0, 0x11e0], /* HANGUL JONGSEONG MIEUM-CHIEUCH */
- [0x11e1, 0x11e1], /* HANGUL JONGSEONG MIEUM-HIEUH */
- [0x11e2, 0x11e2], /* HANGUL JONGSEONG KAPYEOUNMIEUM */
- [0x11e3, 0x11e3], /* HANGUL JONGSEONG PIEUP-RIEUL */
- [0x11e4, 0x11e4], /* HANGUL JONGSEONG PIEUP-PHIEUPH */
- [0x11e5, 0x11e5], /* HANGUL JONGSEONG PIEUP-HIEUH */
- [0x11e6, 0x11e6], /* HANGUL JONGSEONG KAPYEOUNPIEUP */
- [0x11e7, 0x11e7], /* HANGUL JONGSEONG SIOS-KIYEOK */
- [0x11e8, 0x11e8], /* HANGUL JONGSEONG SIOS-TIKEUT */
- [0x11e9, 0x11e9], /* HANGUL JONGSEONG SIOS-RIEUL */
- [0x11ea, 0x11ea], /* HANGUL JONGSEONG SIOS-PIEUP */
- [0x11eb, 0x11eb], /* HANGUL JONGSEONG PANSIOS */
- [0x11ec, 0x11ec], /* HANGUL JONGSEONG IEUNG-KIYEOK */
- [0x11ed, 0x11ed], /* HANGUL JONGSEONG IEUNG-SSANGKIYEOK */
- [0x11ee, 0x11ee], /* HANGUL JONGSEONG SSANGIEUNG */
- [0x11ef, 0x11ef], /* HANGUL JONGSEONG IEUNG-KHIEUKH */
- [0x11f0, 0x11f0], /* HANGUL JONGSEONG YESIEUNG */
- [0x11f1, 0x11f1], /* HANGUL JONGSEONG YESIEUNG-SIOS */
- [0x11f2, 0x11f2], /* HANGUL JONGSEONG YESIEUNG-PANSIOS */
- [0x11f3, 0x11f3], /* HANGUL JONGSEONG PHIEUPH-PIEUP */
- [0x11f4, 0x11f4], /* HANGUL JONGSEONG KAPYEOUNPHIEUPH */
- [0x11f5, 0x11f5], /* HANGUL JONGSEONG HIEUH-NIEUN */
- [0x11f6, 0x11f6], /* HANGUL JONGSEONG HIEUH-RIEUL */
- [0x11f7, 0x11f7], /* HANGUL JONGSEONG HIEUH-MIEUM */
- [0x11f8, 0x11f8], /* HANGUL JONGSEONG HIEUH-PIEUP */
- [0x11f9, 0x11f9], /* HANGUL JONGSEONG YEORINHIEUH */
- [0x11fa, 0x11fa], /* HANGUL JONGSEONG KIYEOK-NIEUN */
- [0x11fb, 0x11fb], /* HANGUL JONGSEONG KIYEOK-PIEUP */
- [0x11fc, 0x11fc], /* HANGUL JONGSEONG KIYEOK-CHIEUCH */
- [0x11fd, 0x11fd], /* HANGUL JONGSEONG KIYEOK-KHIEUKH */
- [0x11fe, 0x11fe], /* HANGUL JONGSEONG KIYEOK-HIEUH */
- [0x11ff, 0x11ff], /* HANGUL JONGSEONG SSANGNIEUN */
- [0x1200, 0x1200], /* ETHIOPIC SYLLABLE HA */
- [0x1201, 0x1201], /* ETHIOPIC SYLLABLE HU */
- [0x1202, 0x1202], /* ETHIOPIC SYLLABLE HI */
- [0x1203, 0x1203], /* ETHIOPIC SYLLABLE HAA */
- [0x1204, 0x1204], /* ETHIOPIC SYLLABLE HEE */
- [0x1205, 0x1205], /* ETHIOPIC SYLLABLE HE */
- [0x1206, 0x1206], /* ETHIOPIC SYLLABLE HO */
- [0x1207, 0x1207], /* ETHIOPIC SYLLABLE HOA */
- [0x1208, 0x1208], /* ETHIOPIC SYLLABLE LA */
- [0x1209, 0x1209], /* ETHIOPIC SYLLABLE LU */
- [0x120a, 0x120a], /* ETHIOPIC SYLLABLE LI */
- [0x120b, 0x120b], /* ETHIOPIC SYLLABLE LAA */
- [0x120c, 0x120c], /* ETHIOPIC SYLLABLE LEE */
- [0x120d, 0x120d], /* ETHIOPIC SYLLABLE LE */
- [0x120e, 0x120e], /* ETHIOPIC SYLLABLE LO */
- [0x120f, 0x120f], /* ETHIOPIC SYLLABLE LWA */
- [0x1210, 0x1210], /* ETHIOPIC SYLLABLE HHA */
- [0x1211, 0x1211], /* ETHIOPIC SYLLABLE HHU */
- [0x1212, 0x1212], /* ETHIOPIC SYLLABLE HHI */
- [0x1213, 0x1213], /* ETHIOPIC SYLLABLE HHAA */
- [0x1214, 0x1214], /* ETHIOPIC SYLLABLE HHEE */
- [0x1215, 0x1215], /* ETHIOPIC SYLLABLE HHE */
- [0x1216, 0x1216], /* ETHIOPIC SYLLABLE HHO */
- [0x1217, 0x1217], /* ETHIOPIC SYLLABLE HHWA */
- [0x1218, 0x1218], /* ETHIOPIC SYLLABLE MA */
- [0x1219, 0x1219], /* ETHIOPIC SYLLABLE MU */
- [0x121a, 0x121a], /* ETHIOPIC SYLLABLE MI */
- [0x121b, 0x121b], /* ETHIOPIC SYLLABLE MAA */
- [0x121c, 0x121c], /* ETHIOPIC SYLLABLE MEE */
- [0x121d, 0x121d], /* ETHIOPIC SYLLABLE ME */
- [0x121e, 0x121e], /* ETHIOPIC SYLLABLE MO */
- [0x121f, 0x121f], /* ETHIOPIC SYLLABLE MWA */
- [0x1220, 0x1220], /* ETHIOPIC SYLLABLE SZA */
- [0x1221, 0x1221], /* ETHIOPIC SYLLABLE SZU */
- [0x1222, 0x1222], /* ETHIOPIC SYLLABLE SZI */
- [0x1223, 0x1223], /* ETHIOPIC SYLLABLE SZAA */
- [0x1224, 0x1224], /* ETHIOPIC SYLLABLE SZEE */
- [0x1225, 0x1225], /* ETHIOPIC SYLLABLE SZE */
- [0x1226, 0x1226], /* ETHIOPIC SYLLABLE SZO */
- [0x1227, 0x1227], /* ETHIOPIC SYLLABLE SZWA */
- [0x1228, 0x1228], /* ETHIOPIC SYLLABLE RA */
- [0x1229, 0x1229], /* ETHIOPIC SYLLABLE RU */
- [0x122a, 0x122a], /* ETHIOPIC SYLLABLE RI */
- [0x122b, 0x122b], /* ETHIOPIC SYLLABLE RAA */
- [0x122c, 0x122c], /* ETHIOPIC SYLLABLE REE */
- [0x122d, 0x122d], /* ETHIOPIC SYLLABLE RE */
- [0x122e, 0x122e], /* ETHIOPIC SYLLABLE RO */
- [0x122f, 0x122f], /* ETHIOPIC SYLLABLE RWA */
- [0x1230, 0x1230], /* ETHIOPIC SYLLABLE SA */
- [0x1231, 0x1231], /* ETHIOPIC SYLLABLE SU */
- [0x1232, 0x1232], /* ETHIOPIC SYLLABLE SI */
- [0x1233, 0x1233], /* ETHIOPIC SYLLABLE SAA */
- [0x1234, 0x1234], /* ETHIOPIC SYLLABLE SEE */
- [0x1235, 0x1235], /* ETHIOPIC SYLLABLE SE */
- [0x1236, 0x1236], /* ETHIOPIC SYLLABLE SO */
- [0x1237, 0x1237], /* ETHIOPIC SYLLABLE SWA */
- [0x1238, 0x1238], /* ETHIOPIC SYLLABLE SHA */
- [0x1239, 0x1239], /* ETHIOPIC SYLLABLE SHU */
- [0x123a, 0x123a], /* ETHIOPIC SYLLABLE SHI */
- [0x123b, 0x123b], /* ETHIOPIC SYLLABLE SHAA */
- [0x123c, 0x123c], /* ETHIOPIC SYLLABLE SHEE */
- [0x123d, 0x123d], /* ETHIOPIC SYLLABLE SHE */
- [0x123e, 0x123e], /* ETHIOPIC SYLLABLE SHO */
- [0x123f, 0x123f], /* ETHIOPIC SYLLABLE SHWA */
- [0x1240, 0x1240], /* ETHIOPIC SYLLABLE QA */
- [0x1241, 0x1241], /* ETHIOPIC SYLLABLE QU */
- [0x1242, 0x1242], /* ETHIOPIC SYLLABLE QI */
- [0x1243, 0x1243], /* ETHIOPIC SYLLABLE QAA */
- [0x1244, 0x1244], /* ETHIOPIC SYLLABLE QEE */
- [0x1245, 0x1245], /* ETHIOPIC SYLLABLE QE */
- [0x1246, 0x1246], /* ETHIOPIC SYLLABLE QO */
- [0x1247, 0x1247], /* ETHIOPIC SYLLABLE QOA */
- [0x1248, 0x1248], /* ETHIOPIC SYLLABLE QWA */
- [0x1249, 0x1249],
- [0x124a, 0x124a], /* ETHIOPIC SYLLABLE QWI */
- [0x124b, 0x124b], /* ETHIOPIC SYLLABLE QWAA */
- [0x124c, 0x124c], /* ETHIOPIC SYLLABLE QWEE */
- [0x124d, 0x124d], /* ETHIOPIC SYLLABLE QWE */
- [0x124e, 0x124e],
- [0x124f, 0x124f],
- [0x1250, 0x1250], /* ETHIOPIC SYLLABLE QHA */
- [0x1251, 0x1251], /* ETHIOPIC SYLLABLE QHU */
- [0x1252, 0x1252], /* ETHIOPIC SYLLABLE QHI */
- [0x1253, 0x1253], /* ETHIOPIC SYLLABLE QHAA */
- [0x1254, 0x1254], /* ETHIOPIC SYLLABLE QHEE */
- [0x1255, 0x1255], /* ETHIOPIC SYLLABLE QHE */
- [0x1256, 0x1256], /* ETHIOPIC SYLLABLE QHO */
- [0x1257, 0x1257],
- [0x1258, 0x1258], /* ETHIOPIC SYLLABLE QHWA */
- [0x1259, 0x1259],
- [0x125a, 0x125a], /* ETHIOPIC SYLLABLE QHWI */
- [0x125b, 0x125b], /* ETHIOPIC SYLLABLE QHWAA */
- [0x125c, 0x125c], /* ETHIOPIC SYLLABLE QHWEE */
- [0x125d, 0x125d], /* ETHIOPIC SYLLABLE QHWE */
- [0x125e, 0x125e],
- [0x125f, 0x125f],
- [0x1260, 0x1260], /* ETHIOPIC SYLLABLE BA */
- [0x1261, 0x1261], /* ETHIOPIC SYLLABLE BU */
- [0x1262, 0x1262], /* ETHIOPIC SYLLABLE BI */
- [0x1263, 0x1263], /* ETHIOPIC SYLLABLE BAA */
- [0x1264, 0x1264], /* ETHIOPIC SYLLABLE BEE */
- [0x1265, 0x1265], /* ETHIOPIC SYLLABLE BE */
- [0x1266, 0x1266], /* ETHIOPIC SYLLABLE BO */
- [0x1267, 0x1267], /* ETHIOPIC SYLLABLE BWA */
- [0x1268, 0x1268], /* ETHIOPIC SYLLABLE VA */
- [0x1269, 0x1269], /* ETHIOPIC SYLLABLE VU */
- [0x126a, 0x126a], /* ETHIOPIC SYLLABLE VI */
- [0x126b, 0x126b], /* ETHIOPIC SYLLABLE VAA */
- [0x126c, 0x126c], /* ETHIOPIC SYLLABLE VEE */
- [0x126d, 0x126d], /* ETHIOPIC SYLLABLE VE */
- [0x126e, 0x126e], /* ETHIOPIC SYLLABLE VO */
- [0x126f, 0x126f], /* ETHIOPIC SYLLABLE VWA */
- [0x1270, 0x1270], /* ETHIOPIC SYLLABLE TA */
- [0x1271, 0x1271], /* ETHIOPIC SYLLABLE TU */
- [0x1272, 0x1272], /* ETHIOPIC SYLLABLE TI */
- [0x1273, 0x1273], /* ETHIOPIC SYLLABLE TAA */
- [0x1274, 0x1274], /* ETHIOPIC SYLLABLE TEE */
- [0x1275, 0x1275], /* ETHIOPIC SYLLABLE TE */
- [0x1276, 0x1276], /* ETHIOPIC SYLLABLE TO */
- [0x1277, 0x1277], /* ETHIOPIC SYLLABLE TWA */
- [0x1278, 0x1278], /* ETHIOPIC SYLLABLE CA */
- [0x1279, 0x1279], /* ETHIOPIC SYLLABLE CU */
- [0x127a, 0x127a], /* ETHIOPIC SYLLABLE CI */
- [0x127b, 0x127b], /* ETHIOPIC SYLLABLE CAA */
- [0x127c, 0x127c], /* ETHIOPIC SYLLABLE CEE */
- [0x127d, 0x127d], /* ETHIOPIC SYLLABLE CE */
- [0x127e, 0x127e], /* ETHIOPIC SYLLABLE CO */
- [0x127f, 0x127f], /* ETHIOPIC SYLLABLE CWA */
- [0x1280, 0x1280], /* ETHIOPIC SYLLABLE XA */
- [0x1281, 0x1281], /* ETHIOPIC SYLLABLE XU */
- [0x1282, 0x1282], /* ETHIOPIC SYLLABLE XI */
- [0x1283, 0x1283], /* ETHIOPIC SYLLABLE XAA */
- [0x1284, 0x1284], /* ETHIOPIC SYLLABLE XEE */
- [0x1285, 0x1285], /* ETHIOPIC SYLLABLE XE */
- [0x1286, 0x1286], /* ETHIOPIC SYLLABLE XO */
- [0x1287, 0x1287], /* ETHIOPIC SYLLABLE XOA */
- [0x1288, 0x1288], /* ETHIOPIC SYLLABLE XWA */
- [0x1289, 0x1289],
- [0x128a, 0x128a], /* ETHIOPIC SYLLABLE XWI */
- [0x128b, 0x128b], /* ETHIOPIC SYLLABLE XWAA */
- [0x128c, 0x128c], /* ETHIOPIC SYLLABLE XWEE */
- [0x128d, 0x128d], /* ETHIOPIC SYLLABLE XWE */
- [0x128e, 0x128e],
- [0x128f, 0x128f],
- [0x1290, 0x1290], /* ETHIOPIC SYLLABLE NA */
- [0x1291, 0x1291], /* ETHIOPIC SYLLABLE NU */
- [0x1292, 0x1292], /* ETHIOPIC SYLLABLE NI */
- [0x1293, 0x1293], /* ETHIOPIC SYLLABLE NAA */
- [0x1294, 0x1294], /* ETHIOPIC SYLLABLE NEE */
- [0x1295, 0x1295], /* ETHIOPIC SYLLABLE NE */
- [0x1296, 0x1296], /* ETHIOPIC SYLLABLE NO */
- [0x1297, 0x1297], /* ETHIOPIC SYLLABLE NWA */
- [0x1298, 0x1298], /* ETHIOPIC SYLLABLE NYA */
- [0x1299, 0x1299], /* ETHIOPIC SYLLABLE NYU */
- [0x129a, 0x129a], /* ETHIOPIC SYLLABLE NYI */
- [0x129b, 0x129b], /* ETHIOPIC SYLLABLE NYAA */
- [0x129c, 0x129c], /* ETHIOPIC SYLLABLE NYEE */
- [0x129d, 0x129d], /* ETHIOPIC SYLLABLE NYE */
- [0x129e, 0x129e], /* ETHIOPIC SYLLABLE NYO */
- [0x129f, 0x129f], /* ETHIOPIC SYLLABLE NYWA */
- [0x12a0, 0x12a0], /* ETHIOPIC SYLLABLE GLOTTAL A */
- [0x12a1, 0x12a1], /* ETHIOPIC SYLLABLE GLOTTAL U */
- [0x12a2, 0x12a2], /* ETHIOPIC SYLLABLE GLOTTAL I */
- [0x12a3, 0x12a3], /* ETHIOPIC SYLLABLE GLOTTAL AA */
- [0x12a4, 0x12a4], /* ETHIOPIC SYLLABLE GLOTTAL EE */
- [0x12a5, 0x12a5], /* ETHIOPIC SYLLABLE GLOTTAL E */
- [0x12a6, 0x12a6], /* ETHIOPIC SYLLABLE GLOTTAL O */
- [0x12a7, 0x12a7], /* ETHIOPIC SYLLABLE GLOTTAL WA */
- [0x12a8, 0x12a8], /* ETHIOPIC SYLLABLE KA */
- [0x12a9, 0x12a9], /* ETHIOPIC SYLLABLE KU */
- [0x12aa, 0x12aa], /* ETHIOPIC SYLLABLE KI */
- [0x12ab, 0x12ab], /* ETHIOPIC SYLLABLE KAA */
- [0x12ac, 0x12ac], /* ETHIOPIC SYLLABLE KEE */
- [0x12ad, 0x12ad], /* ETHIOPIC SYLLABLE KE */
- [0x12ae, 0x12ae], /* ETHIOPIC SYLLABLE KO */
- [0x12af, 0x12af], /* ETHIOPIC SYLLABLE KOA */
- [0x12b0, 0x12b0], /* ETHIOPIC SYLLABLE KWA */
- [0x12b1, 0x12b1],
- [0x12b2, 0x12b2], /* ETHIOPIC SYLLABLE KWI */
- [0x12b3, 0x12b3], /* ETHIOPIC SYLLABLE KWAA */
- [0x12b4, 0x12b4], /* ETHIOPIC SYLLABLE KWEE */
- [0x12b5, 0x12b5], /* ETHIOPIC SYLLABLE KWE */
- [0x12b6, 0x12b6],
- [0x12b7, 0x12b7],
- [0x12b8, 0x12b8], /* ETHIOPIC SYLLABLE KXA */
- [0x12b9, 0x12b9], /* ETHIOPIC SYLLABLE KXU */
- [0x12ba, 0x12ba], /* ETHIOPIC SYLLABLE KXI */
- [0x12bb, 0x12bb], /* ETHIOPIC SYLLABLE KXAA */
- [0x12bc, 0x12bc], /* ETHIOPIC SYLLABLE KXEE */
- [0x12bd, 0x12bd], /* ETHIOPIC SYLLABLE KXE */
- [0x12be, 0x12be], /* ETHIOPIC SYLLABLE KXO */
- [0x12bf, 0x12bf],
- [0x12c0, 0x12c0], /* ETHIOPIC SYLLABLE KXWA */
- [0x12c1, 0x12c1],
- [0x12c2, 0x12c2], /* ETHIOPIC SYLLABLE KXWI */
- [0x12c3, 0x12c3], /* ETHIOPIC SYLLABLE KXWAA */
- [0x12c4, 0x12c4], /* ETHIOPIC SYLLABLE KXWEE */
- [0x12c5, 0x12c5], /* ETHIOPIC SYLLABLE KXWE */
- [0x12c6, 0x12c6],
- [0x12c7, 0x12c7],
- [0x12c8, 0x12c8], /* ETHIOPIC SYLLABLE WA */
- [0x12c9, 0x12c9], /* ETHIOPIC SYLLABLE WU */
- [0x12ca, 0x12ca], /* ETHIOPIC SYLLABLE WI */
- [0x12cb, 0x12cb], /* ETHIOPIC SYLLABLE WAA */
- [0x12cc, 0x12cc], /* ETHIOPIC SYLLABLE WEE */
- [0x12cd, 0x12cd], /* ETHIOPIC SYLLABLE WE */
- [0x12ce, 0x12ce], /* ETHIOPIC SYLLABLE WO */
- [0x12cf, 0x12cf], /* ETHIOPIC SYLLABLE WOA */
- [0x12d0, 0x12d0], /* ETHIOPIC SYLLABLE PHARYNGEAL A */
- [0x12d1, 0x12d1], /* ETHIOPIC SYLLABLE PHARYNGEAL U */
- [0x12d2, 0x12d2], /* ETHIOPIC SYLLABLE PHARYNGEAL I */
- [0x12d3, 0x12d3], /* ETHIOPIC SYLLABLE PHARYNGEAL AA */
- [0x12d4, 0x12d4], /* ETHIOPIC SYLLABLE PHARYNGEAL EE */
- [0x12d5, 0x12d5], /* ETHIOPIC SYLLABLE PHARYNGEAL E */
- [0x12d6, 0x12d6], /* ETHIOPIC SYLLABLE PHARYNGEAL O */
- [0x12d7, 0x12d7],
- [0x12d8, 0x12d8], /* ETHIOPIC SYLLABLE ZA */
- [0x12d9, 0x12d9], /* ETHIOPIC SYLLABLE ZU */
- [0x12da, 0x12da], /* ETHIOPIC SYLLABLE ZI */
- [0x12db, 0x12db], /* ETHIOPIC SYLLABLE ZAA */
- [0x12dc, 0x12dc], /* ETHIOPIC SYLLABLE ZEE */
- [0x12dd, 0x12dd], /* ETHIOPIC SYLLABLE ZE */
- [0x12de, 0x12de], /* ETHIOPIC SYLLABLE ZO */
- [0x12df, 0x12df], /* ETHIOPIC SYLLABLE ZWA */
- [0x12e0, 0x12e0], /* ETHIOPIC SYLLABLE ZHA */
- [0x12e1, 0x12e1], /* ETHIOPIC SYLLABLE ZHU */
- [0x12e2, 0x12e2], /* ETHIOPIC SYLLABLE ZHI */
- [0x12e3, 0x12e3], /* ETHIOPIC SYLLABLE ZHAA */
- [0x12e4, 0x12e4], /* ETHIOPIC SYLLABLE ZHEE */
- [0x12e5, 0x12e5], /* ETHIOPIC SYLLABLE ZHE */
- [0x12e6, 0x12e6], /* ETHIOPIC SYLLABLE ZHO */
- [0x12e7, 0x12e7], /* ETHIOPIC SYLLABLE ZHWA */
- [0x12e8, 0x12e8], /* ETHIOPIC SYLLABLE YA */
- [0x12e9, 0x12e9], /* ETHIOPIC SYLLABLE YU */
- [0x12ea, 0x12ea], /* ETHIOPIC SYLLABLE YI */
- [0x12eb, 0x12eb], /* ETHIOPIC SYLLABLE YAA */
- [0x12ec, 0x12ec], /* ETHIOPIC SYLLABLE YEE */
- [0x12ed, 0x12ed], /* ETHIOPIC SYLLABLE YE */
- [0x12ee, 0x12ee], /* ETHIOPIC SYLLABLE YO */
- [0x12ef, 0x12ef], /* ETHIOPIC SYLLABLE YOA */
- [0x12f0, 0x12f0], /* ETHIOPIC SYLLABLE DA */
- [0x12f1, 0x12f1], /* ETHIOPIC SYLLABLE DU */
- [0x12f2, 0x12f2], /* ETHIOPIC SYLLABLE DI */
- [0x12f3, 0x12f3], /* ETHIOPIC SYLLABLE DAA */
- [0x12f4, 0x12f4], /* ETHIOPIC SYLLABLE DEE */
- [0x12f5, 0x12f5], /* ETHIOPIC SYLLABLE DE */
- [0x12f6, 0x12f6], /* ETHIOPIC SYLLABLE DO */
- [0x12f7, 0x12f7], /* ETHIOPIC SYLLABLE DWA */
- [0x12f8, 0x12f8], /* ETHIOPIC SYLLABLE DDA */
- [0x12f9, 0x12f9], /* ETHIOPIC SYLLABLE DDU */
- [0x12fa, 0x12fa], /* ETHIOPIC SYLLABLE DDI */
- [0x12fb, 0x12fb], /* ETHIOPIC SYLLABLE DDAA */
- [0x12fc, 0x12fc], /* ETHIOPIC SYLLABLE DDEE */
- [0x12fd, 0x12fd], /* ETHIOPIC SYLLABLE DDE */
- [0x12fe, 0x12fe], /* ETHIOPIC SYLLABLE DDO */
- [0x12ff, 0x12ff], /* ETHIOPIC SYLLABLE DDWA */
- [0x1300, 0x1300], /* ETHIOPIC SYLLABLE JA */
- [0x1301, 0x1301], /* ETHIOPIC SYLLABLE JU */
- [0x1302, 0x1302], /* ETHIOPIC SYLLABLE JI */
- [0x1303, 0x1303], /* ETHIOPIC SYLLABLE JAA */
- [0x1304, 0x1304], /* ETHIOPIC SYLLABLE JEE */
- [0x1305, 0x1305], /* ETHIOPIC SYLLABLE JE */
- [0x1306, 0x1306], /* ETHIOPIC SYLLABLE JO */
- [0x1307, 0x1307], /* ETHIOPIC SYLLABLE JWA */
- [0x1308, 0x1308], /* ETHIOPIC SYLLABLE GA */
- [0x1309, 0x1309], /* ETHIOPIC SYLLABLE GU */
- [0x130a, 0x130a], /* ETHIOPIC SYLLABLE GI */
- [0x130b, 0x130b], /* ETHIOPIC SYLLABLE GAA */
- [0x130c, 0x130c], /* ETHIOPIC SYLLABLE GEE */
- [0x130d, 0x130d], /* ETHIOPIC SYLLABLE GE */
- [0x130e, 0x130e], /* ETHIOPIC SYLLABLE GO */
- [0x130f, 0x130f], /* ETHIOPIC SYLLABLE GOA */
- [0x1310, 0x1310], /* ETHIOPIC SYLLABLE GWA */
- [0x1311, 0x1311],
- [0x1312, 0x1312], /* ETHIOPIC SYLLABLE GWI */
- [0x1313, 0x1313], /* ETHIOPIC SYLLABLE GWAA */
- [0x1314, 0x1314], /* ETHIOPIC SYLLABLE GWEE */
- [0x1315, 0x1315], /* ETHIOPIC SYLLABLE GWE */
- [0x1316, 0x1316],
- [0x1317, 0x1317],
- [0x1318, 0x1318], /* ETHIOPIC SYLLABLE GGA */
- [0x1319, 0x1319], /* ETHIOPIC SYLLABLE GGU */
- [0x131a, 0x131a], /* ETHIOPIC SYLLABLE GGI */
- [0x131b, 0x131b], /* ETHIOPIC SYLLABLE GGAA */
- [0x131c, 0x131c], /* ETHIOPIC SYLLABLE GGEE */
- [0x131d, 0x131d], /* ETHIOPIC SYLLABLE GGE */
- [0x131e, 0x131e], /* ETHIOPIC SYLLABLE GGO */
- [0x131f, 0x131f], /* ETHIOPIC SYLLABLE GGWAA */
- [0x1320, 0x1320], /* ETHIOPIC SYLLABLE THA */
- [0x1321, 0x1321], /* ETHIOPIC SYLLABLE THU */
- [0x1322, 0x1322], /* ETHIOPIC SYLLABLE THI */
- [0x1323, 0x1323], /* ETHIOPIC SYLLABLE THAA */
- [0x1324, 0x1324], /* ETHIOPIC SYLLABLE THEE */
- [0x1325, 0x1325], /* ETHIOPIC SYLLABLE THE */
- [0x1326, 0x1326], /* ETHIOPIC SYLLABLE THO */
- [0x1327, 0x1327], /* ETHIOPIC SYLLABLE THWA */
- [0x1328, 0x1328], /* ETHIOPIC SYLLABLE CHA */
- [0x1329, 0x1329], /* ETHIOPIC SYLLABLE CHU */
- [0x132a, 0x132a], /* ETHIOPIC SYLLABLE CHI */
- [0x132b, 0x132b], /* ETHIOPIC SYLLABLE CHAA */
- [0x132c, 0x132c], /* ETHIOPIC SYLLABLE CHEE */
- [0x132d, 0x132d], /* ETHIOPIC SYLLABLE CHE */
- [0x132e, 0x132e], /* ETHIOPIC SYLLABLE CHO */
- [0x132f, 0x132f], /* ETHIOPIC SYLLABLE CHWA */
- [0x1330, 0x1330], /* ETHIOPIC SYLLABLE PHA */
- [0x1331, 0x1331], /* ETHIOPIC SYLLABLE PHU */
- [0x1332, 0x1332], /* ETHIOPIC SYLLABLE PHI */
- [0x1333, 0x1333], /* ETHIOPIC SYLLABLE PHAA */
- [0x1334, 0x1334], /* ETHIOPIC SYLLABLE PHEE */
- [0x1335, 0x1335], /* ETHIOPIC SYLLABLE PHE */
- [0x1336, 0x1336], /* ETHIOPIC SYLLABLE PHO */
- [0x1337, 0x1337], /* ETHIOPIC SYLLABLE PHWA */
- [0x1338, 0x1338], /* ETHIOPIC SYLLABLE TSA */
- [0x1339, 0x1339], /* ETHIOPIC SYLLABLE TSU */
- [0x133a, 0x133a], /* ETHIOPIC SYLLABLE TSI */
- [0x133b, 0x133b], /* ETHIOPIC SYLLABLE TSAA */
- [0x133c, 0x133c], /* ETHIOPIC SYLLABLE TSEE */
- [0x133d, 0x133d], /* ETHIOPIC SYLLABLE TSE */
- [0x133e, 0x133e], /* ETHIOPIC SYLLABLE TSO */
- [0x133f, 0x133f], /* ETHIOPIC SYLLABLE TSWA */
- [0x1340, 0x1340], /* ETHIOPIC SYLLABLE TZA */
- [0x1341, 0x1341], /* ETHIOPIC SYLLABLE TZU */
- [0x1342, 0x1342], /* ETHIOPIC SYLLABLE TZI */
- [0x1343, 0x1343], /* ETHIOPIC SYLLABLE TZAA */
- [0x1344, 0x1344], /* ETHIOPIC SYLLABLE TZEE */
- [0x1345, 0x1345], /* ETHIOPIC SYLLABLE TZE */
- [0x1346, 0x1346], /* ETHIOPIC SYLLABLE TZO */
- [0x1347, 0x1347], /* ETHIOPIC SYLLABLE TZOA */
- [0x1348, 0x1348], /* ETHIOPIC SYLLABLE FA */
- [0x1349, 0x1349], /* ETHIOPIC SYLLABLE FU */
- [0x134a, 0x134a], /* ETHIOPIC SYLLABLE FI */
- [0x134b, 0x134b], /* ETHIOPIC SYLLABLE FAA */
- [0x134c, 0x134c], /* ETHIOPIC SYLLABLE FEE */
- [0x134d, 0x134d], /* ETHIOPIC SYLLABLE FE */
- [0x134e, 0x134e], /* ETHIOPIC SYLLABLE FO */
- [0x134f, 0x134f], /* ETHIOPIC SYLLABLE FWA */
- [0x1350, 0x1350], /* ETHIOPIC SYLLABLE PA */
- [0x1351, 0x1351], /* ETHIOPIC SYLLABLE PU */
- [0x1352, 0x1352], /* ETHIOPIC SYLLABLE PI */
- [0x1353, 0x1353], /* ETHIOPIC SYLLABLE PAA */
- [0x1354, 0x1354], /* ETHIOPIC SYLLABLE PEE */
- [0x1355, 0x1355], /* ETHIOPIC SYLLABLE PE */
- [0x1356, 0x1356], /* ETHIOPIC SYLLABLE PO */
- [0x1357, 0x1357], /* ETHIOPIC SYLLABLE PWA */
- [0x1358, 0x1358], /* ETHIOPIC SYLLABLE RYA */
- [0x1359, 0x1359], /* ETHIOPIC SYLLABLE MYA */
- [0x135a, 0x135a], /* ETHIOPIC SYLLABLE FYA */
- [0x135b, 0x135b],
- [0x135c, 0x135c],
- [0x135d, 0x135d], /* ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK */
- [0x135e, 0x135e], /* ETHIOPIC COMBINING VOWEL LENGTH MARK */
- [0x135f, 0x135f], /* ETHIOPIC COMBINING GEMINATION MARK */
- [0x1360, 0x1360], /* ETHIOPIC SECTION MARK */
- [0x1361, 0x1361], /* ETHIOPIC WORDSPACE */
- [0x1362, 0x1362], /* ETHIOPIC FULL STOP */
- [0x1363, 0x1363], /* ETHIOPIC COMMA */
- [0x1364, 0x1364], /* ETHIOPIC SEMICOLON */
- [0x1365, 0x1365], /* ETHIOPIC COLON */
- [0x1366, 0x1366], /* ETHIOPIC PREFACE COLON */
- [0x1367, 0x1367], /* ETHIOPIC QUESTION MARK */
- [0x1368, 0x1368], /* ETHIOPIC PARAGRAPH SEPARATOR */
- [0x1369, 0x1369], /* ETHIOPIC DIGIT ONE */
- [0x136a, 0x136a], /* ETHIOPIC DIGIT TWO */
- [0x136b, 0x136b], /* ETHIOPIC DIGIT THREE */
- [0x136c, 0x136c], /* ETHIOPIC DIGIT FOUR */
- [0x136d, 0x136d], /* ETHIOPIC DIGIT FIVE */
- [0x136e, 0x136e], /* ETHIOPIC DIGIT SIX */
- [0x136f, 0x136f], /* ETHIOPIC DIGIT SEVEN */
- [0x1370, 0x1370], /* ETHIOPIC DIGIT EIGHT */
- [0x1371, 0x1371], /* ETHIOPIC DIGIT NINE */
- [0x1372, 0x1372], /* ETHIOPIC NUMBER TEN */
- [0x1373, 0x1373], /* ETHIOPIC NUMBER TWENTY */
- [0x1374, 0x1374], /* ETHIOPIC NUMBER THIRTY */
- [0x1375, 0x1375], /* ETHIOPIC NUMBER FORTY */
- [0x1376, 0x1376], /* ETHIOPIC NUMBER FIFTY */
- [0x1377, 0x1377], /* ETHIOPIC NUMBER SIXTY */
- [0x1378, 0x1378], /* ETHIOPIC NUMBER SEVENTY */
- [0x1379, 0x1379], /* ETHIOPIC NUMBER EIGHTY */
- [0x137a, 0x137a], /* ETHIOPIC NUMBER NINETY */
- [0x137b, 0x137b], /* ETHIOPIC NUMBER HUNDRED */
- [0x137c, 0x137c], /* ETHIOPIC NUMBER TEN THOUSAND */
- [0x137d, 0x137d],
- [0x137e, 0x137e],
- [0x137f, 0x137f],
- [0x1380, 0x1380], /* ETHIOPIC SYLLABLE SEBATBEIT MWA */
- [0x1381, 0x1381], /* ETHIOPIC SYLLABLE MWI */
- [0x1382, 0x1382], /* ETHIOPIC SYLLABLE MWEE */
- [0x1383, 0x1383], /* ETHIOPIC SYLLABLE MWE */
- [0x1384, 0x1384], /* ETHIOPIC SYLLABLE SEBATBEIT BWA */
- [0x1385, 0x1385], /* ETHIOPIC SYLLABLE BWI */
- [0x1386, 0x1386], /* ETHIOPIC SYLLABLE BWEE */
- [0x1387, 0x1387], /* ETHIOPIC SYLLABLE BWE */
- [0x1388, 0x1388], /* ETHIOPIC SYLLABLE SEBATBEIT FWA */
- [0x1389, 0x1389], /* ETHIOPIC SYLLABLE FWI */
- [0x138a, 0x138a], /* ETHIOPIC SYLLABLE FWEE */
- [0x138b, 0x138b], /* ETHIOPIC SYLLABLE FWE */
- [0x138c, 0x138c], /* ETHIOPIC SYLLABLE SEBATBEIT PWA */
- [0x138d, 0x138d], /* ETHIOPIC SYLLABLE PWI */
- [0x138e, 0x138e], /* ETHIOPIC SYLLABLE PWEE */
- [0x138f, 0x138f], /* ETHIOPIC SYLLABLE PWE */
- [0x1390, 0x1390], /* ETHIOPIC TONAL MARK YIZET */
- [0x1391, 0x1391], /* ETHIOPIC TONAL MARK DERET */
- [0x1392, 0x1392], /* ETHIOPIC TONAL MARK RIKRIK */
- [0x1393, 0x1393], /* ETHIOPIC TONAL MARK SHORT RIKRIK */
- [0x1394, 0x1394], /* ETHIOPIC TONAL MARK DIFAT */
- [0x1395, 0x1395], /* ETHIOPIC TONAL MARK KENAT */
- [0x1396, 0x1396], /* ETHIOPIC TONAL MARK CHIRET */
- [0x1397, 0x1397], /* ETHIOPIC TONAL MARK HIDET */
- [0x1398, 0x1398], /* ETHIOPIC TONAL MARK DERET-HIDET */
- [0x1399, 0x1399], /* ETHIOPIC TONAL MARK KURT */
- [0x139a, 0x139a],
- [0x139b, 0x139b],
- [0x139c, 0x139c],
- [0x139d, 0x139d],
- [0x139e, 0x139e],
- [0x139f, 0x139f],
- [0x13a0, 0xab70], /* CHEROKEE LETTER A */
- [0x13a1, 0xab71], /* CHEROKEE LETTER E */
- [0x13a2, 0xab72], /* CHEROKEE LETTER I */
- [0x13a3, 0xab73], /* CHEROKEE LETTER O */
- [0x13a4, 0xab74], /* CHEROKEE LETTER U */
- [0x13a5, 0xab75], /* CHEROKEE LETTER V */
- [0x13a6, 0xab76], /* CHEROKEE LETTER GA */
- [0x13a7, 0xab77], /* CHEROKEE LETTER KA */
- [0x13a8, 0xab78], /* CHEROKEE LETTER GE */
- [0x13a9, 0xab79], /* CHEROKEE LETTER GI */
- [0x13aa, 0xab7a], /* CHEROKEE LETTER GO */
- [0x13ab, 0xab7b], /* CHEROKEE LETTER GU */
- [0x13ac, 0xab7c], /* CHEROKEE LETTER GV */
- [0x13ad, 0xab7d], /* CHEROKEE LETTER HA */
- [0x13ae, 0xab7e], /* CHEROKEE LETTER HE */
- [0x13af, 0xab7f], /* CHEROKEE LETTER HI */
- [0x13b0, 0xab80], /* CHEROKEE LETTER HO */
- [0x13b1, 0xab81], /* CHEROKEE LETTER HU */
- [0x13b2, 0xab82], /* CHEROKEE LETTER HV */
- [0x13b3, 0xab83], /* CHEROKEE LETTER LA */
- [0x13b4, 0xab84], /* CHEROKEE LETTER LE */
- [0x13b5, 0xab85], /* CHEROKEE LETTER LI */
- [0x13b6, 0xab86], /* CHEROKEE LETTER LO */
- [0x13b7, 0xab87], /* CHEROKEE LETTER LU */
- [0x13b8, 0xab88], /* CHEROKEE LETTER LV */
- [0x13b9, 0xab89], /* CHEROKEE LETTER MA */
- [0x13ba, 0xab8a], /* CHEROKEE LETTER ME */
- [0x13bb, 0xab8b], /* CHEROKEE LETTER MI */
- [0x13bc, 0xab8c], /* CHEROKEE LETTER MO */
- [0x13bd, 0xab8d], /* CHEROKEE LETTER MU */
- [0x13be, 0xab8e], /* CHEROKEE LETTER NA */
- [0x13bf, 0xab8f], /* CHEROKEE LETTER HNA */
- [0x13c0, 0xab90], /* CHEROKEE LETTER NAH */
- [0x13c1, 0xab91], /* CHEROKEE LETTER NE */
- [0x13c2, 0xab92], /* CHEROKEE LETTER NI */
- [0x13c3, 0xab93], /* CHEROKEE LETTER NO */
- [0x13c4, 0xab94], /* CHEROKEE LETTER NU */
- [0x13c5, 0xab95], /* CHEROKEE LETTER NV */
- [0x13c6, 0xab96], /* CHEROKEE LETTER QUA */
- [0x13c7, 0xab97], /* CHEROKEE LETTER QUE */
- [0x13c8, 0xab98], /* CHEROKEE LETTER QUI */
- [0x13c9, 0xab99], /* CHEROKEE LETTER QUO */
- [0x13ca, 0xab9a], /* CHEROKEE LETTER QUU */
- [0x13cb, 0xab9b], /* CHEROKEE LETTER QUV */
- [0x13cc, 0xab9c], /* CHEROKEE LETTER SA */
- [0x13cd, 0xab9d], /* CHEROKEE LETTER S */
- [0x13ce, 0xab9e], /* CHEROKEE LETTER SE */
- [0x13cf, 0xab9f], /* CHEROKEE LETTER SI */
- [0x13d0, 0xaba0], /* CHEROKEE LETTER SO */
- [0x13d1, 0xaba1], /* CHEROKEE LETTER SU */
- [0x13d2, 0xaba2], /* CHEROKEE LETTER SV */
- [0x13d3, 0xaba3], /* CHEROKEE LETTER DA */
- [0x13d4, 0xaba4], /* CHEROKEE LETTER TA */
- [0x13d5, 0xaba5], /* CHEROKEE LETTER DE */
- [0x13d6, 0xaba6], /* CHEROKEE LETTER TE */
- [0x13d7, 0xaba7], /* CHEROKEE LETTER DI */
- [0x13d8, 0xaba8], /* CHEROKEE LETTER TI */
- [0x13d9, 0xaba9], /* CHEROKEE LETTER DO */
- [0x13da, 0xabaa], /* CHEROKEE LETTER DU */
- [0x13db, 0xabab], /* CHEROKEE LETTER DV */
- [0x13dc, 0xabac], /* CHEROKEE LETTER DLA */
- [0x13dd, 0xabad], /* CHEROKEE LETTER TLA */
- [0x13de, 0xabae], /* CHEROKEE LETTER TLE */
- [0x13df, 0xabaf], /* CHEROKEE LETTER TLI */
- [0x13e0, 0xabb0], /* CHEROKEE LETTER TLO */
- [0x13e1, 0xabb1], /* CHEROKEE LETTER TLU */
- [0x13e2, 0xabb2], /* CHEROKEE LETTER TLV */
- [0x13e3, 0xabb3], /* CHEROKEE LETTER TSA */
- [0x13e4, 0xabb4], /* CHEROKEE LETTER TSE */
- [0x13e5, 0xabb5], /* CHEROKEE LETTER TSI */
- [0x13e6, 0xabb6], /* CHEROKEE LETTER TSO */
- [0x13e7, 0xabb7], /* CHEROKEE LETTER TSU */
- [0x13e8, 0xabb8], /* CHEROKEE LETTER TSV */
- [0x13e9, 0xabb9], /* CHEROKEE LETTER WA */
- [0x13ea, 0xabba], /* CHEROKEE LETTER WE */
- [0x13eb, 0xabbb], /* CHEROKEE LETTER WI */
- [0x13ec, 0xabbc], /* CHEROKEE LETTER WO */
- [0x13ed, 0xabbd], /* CHEROKEE LETTER WU */
- [0x13ee, 0xabbe], /* CHEROKEE LETTER WV */
- [0x13ef, 0xabbf], /* CHEROKEE LETTER YA */
- [0x13f0, 0x13f8], /* CHEROKEE LETTER YE */
- [0x13f1, 0x13f9], /* CHEROKEE LETTER YI */
- [0x13f2, 0x13fa], /* CHEROKEE LETTER YO */
- [0x13f3, 0x13fb], /* CHEROKEE LETTER YU */
- [0x13f4, 0x13fc], /* CHEROKEE LETTER YV */
- [0x13f5, 0x13fd], /* CHEROKEE LETTER MV */
- [0x13f6, 0x13f6],
- [0x13f7, 0x13f7],
- [0x13f0, 0x13f8], /* CHEROKEE SMALL LETTER YE */
- [0x13f1, 0x13f9], /* CHEROKEE SMALL LETTER YI */
- [0x13f2, 0x13fa], /* CHEROKEE SMALL LETTER YO */
- [0x13f3, 0x13fb], /* CHEROKEE SMALL LETTER YU */
- [0x13f4, 0x13fc], /* CHEROKEE SMALL LETTER YV */
- [0x13f5, 0x13fd], /* CHEROKEE SMALL LETTER MV */
- [0x13fe, 0x13fe],
- [0x13ff, 0x13ff],
- [0x1400, 0x1400], /* CANADIAN SYLLABICS HYPHEN */
- [0x1401, 0x1401], /* CANADIAN SYLLABICS E */
- [0x1402, 0x1402], /* CANADIAN SYLLABICS AAI */
- [0x1403, 0x1403], /* CANADIAN SYLLABICS I */
- [0x1404, 0x1404], /* CANADIAN SYLLABICS II */
- [0x1405, 0x1405], /* CANADIAN SYLLABICS O */
- [0x1406, 0x1406], /* CANADIAN SYLLABICS OO */
- [0x1407, 0x1407], /* CANADIAN SYLLABICS Y-CREE OO */
- [0x1408, 0x1408], /* CANADIAN SYLLABICS CARRIER EE */
- [0x1409, 0x1409], /* CANADIAN SYLLABICS CARRIER I */
- [0x140a, 0x140a], /* CANADIAN SYLLABICS A */
- [0x140b, 0x140b], /* CANADIAN SYLLABICS AA */
- [0x140c, 0x140c], /* CANADIAN SYLLABICS WE */
- [0x140d, 0x140d], /* CANADIAN SYLLABICS WEST-CREE WE */
- [0x140e, 0x140e], /* CANADIAN SYLLABICS WI */
- [0x140f, 0x140f], /* CANADIAN SYLLABICS WEST-CREE WI */
- [0x1410, 0x1410], /* CANADIAN SYLLABICS WII */
- [0x1411, 0x1411], /* CANADIAN SYLLABICS WEST-CREE WII */
- [0x1412, 0x1412], /* CANADIAN SYLLABICS WO */
- [0x1413, 0x1413], /* CANADIAN SYLLABICS WEST-CREE WO */
- [0x1414, 0x1414], /* CANADIAN SYLLABICS WOO */
- [0x1415, 0x1415], /* CANADIAN SYLLABICS WEST-CREE WOO */
- [0x1416, 0x1416], /* CANADIAN SYLLABICS NASKAPI WOO */
- [0x1417, 0x1417], /* CANADIAN SYLLABICS WA */
- [0x1418, 0x1418], /* CANADIAN SYLLABICS WEST-CREE WA */
- [0x1419, 0x1419], /* CANADIAN SYLLABICS WAA */
- [0x141a, 0x141a], /* CANADIAN SYLLABICS WEST-CREE WAA */
- [0x141b, 0x141b], /* CANADIAN SYLLABICS NASKAPI WAA */
- [0x141c, 0x141c], /* CANADIAN SYLLABICS AI */
- [0x141d, 0x141d], /* CANADIAN SYLLABICS Y-CREE W */
- [0x141e, 0x141e], /* CANADIAN SYLLABICS GLOTTAL STOP */
- [0x141f, 0x141f], /* CANADIAN SYLLABICS FINAL ACUTE */
- [0x1420, 0x1420], /* CANADIAN SYLLABICS FINAL GRAVE */
- [0x1421, 0x1421], /* CANADIAN SYLLABICS FINAL BOTTOM HALF RING */
- [0x1422, 0x1422], /* CANADIAN SYLLABICS FINAL TOP HALF RING */
- [0x1423, 0x1423], /* CANADIAN SYLLABICS FINAL RIGHT HALF RING */
- [0x1424, 0x1424], /* CANADIAN SYLLABICS FINAL RING */
- [0x1425, 0x1425], /* CANADIAN SYLLABICS FINAL DOUBLE ACUTE */
- [0x1426, 0x1426], /* CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES */
- [0x1427, 0x1427], /* CANADIAN SYLLABICS FINAL MIDDLE DOT */
- [0x1428, 0x1428], /* CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE */
- [0x1429, 0x1429], /* CANADIAN SYLLABICS FINAL PLUS */
- [0x142a, 0x142a], /* CANADIAN SYLLABICS FINAL DOWN TACK */
- [0x142b, 0x142b], /* CANADIAN SYLLABICS EN */
- [0x142c, 0x142c], /* CANADIAN SYLLABICS IN */
- [0x142d, 0x142d], /* CANADIAN SYLLABICS ON */
- [0x142e, 0x142e], /* CANADIAN SYLLABICS AN */
- [0x142f, 0x142f], /* CANADIAN SYLLABICS PE */
- [0x1430, 0x1430], /* CANADIAN SYLLABICS PAAI */
- [0x1431, 0x1431], /* CANADIAN SYLLABICS PI */
- [0x1432, 0x1432], /* CANADIAN SYLLABICS PII */
- [0x1433, 0x1433], /* CANADIAN SYLLABICS PO */
- [0x1434, 0x1434], /* CANADIAN SYLLABICS POO */
- [0x1435, 0x1435], /* CANADIAN SYLLABICS Y-CREE POO */
- [0x1436, 0x1436], /* CANADIAN SYLLABICS CARRIER HEE */
- [0x1437, 0x1437], /* CANADIAN SYLLABICS CARRIER HI */
- [0x1438, 0x1438], /* CANADIAN SYLLABICS PA */
- [0x1439, 0x1439], /* CANADIAN SYLLABICS PAA */
- [0x143a, 0x143a], /* CANADIAN SYLLABICS PWE */
- [0x143b, 0x143b], /* CANADIAN SYLLABICS WEST-CREE PWE */
- [0x143c, 0x143c], /* CANADIAN SYLLABICS PWI */
- [0x143d, 0x143d], /* CANADIAN SYLLABICS WEST-CREE PWI */
- [0x143e, 0x143e], /* CANADIAN SYLLABICS PWII */
- [0x143f, 0x143f], /* CANADIAN SYLLABICS WEST-CREE PWII */
- [0x1440, 0x1440], /* CANADIAN SYLLABICS PWO */
- [0x1441, 0x1441], /* CANADIAN SYLLABICS WEST-CREE PWO */
- [0x1442, 0x1442], /* CANADIAN SYLLABICS PWOO */
- [0x1443, 0x1443], /* CANADIAN SYLLABICS WEST-CREE PWOO */
- [0x1444, 0x1444], /* CANADIAN SYLLABICS PWA */
- [0x1445, 0x1445], /* CANADIAN SYLLABICS WEST-CREE PWA */
- [0x1446, 0x1446], /* CANADIAN SYLLABICS PWAA */
- [0x1447, 0x1447], /* CANADIAN SYLLABICS WEST-CREE PWAA */
- [0x1448, 0x1448], /* CANADIAN SYLLABICS Y-CREE PWAA */
- [0x1449, 0x1449], /* CANADIAN SYLLABICS P */
- [0x144a, 0x144a], /* CANADIAN SYLLABICS WEST-CREE P */
- [0x144b, 0x144b], /* CANADIAN SYLLABICS CARRIER H */
- [0x144c, 0x144c], /* CANADIAN SYLLABICS TE */
- [0x144d, 0x144d], /* CANADIAN SYLLABICS TAAI */
- [0x144e, 0x144e], /* CANADIAN SYLLABICS TI */
- [0x144f, 0x144f], /* CANADIAN SYLLABICS TII */
- [0x1450, 0x1450], /* CANADIAN SYLLABICS TO */
- [0x1451, 0x1451], /* CANADIAN SYLLABICS TOO */
- [0x1452, 0x1452], /* CANADIAN SYLLABICS Y-CREE TOO */
- [0x1453, 0x1453], /* CANADIAN SYLLABICS CARRIER DEE */
- [0x1454, 0x1454], /* CANADIAN SYLLABICS CARRIER DI */
- [0x1455, 0x1455], /* CANADIAN SYLLABICS TA */
- [0x1456, 0x1456], /* CANADIAN SYLLABICS TAA */
- [0x1457, 0x1457], /* CANADIAN SYLLABICS TWE */
- [0x1458, 0x1458], /* CANADIAN SYLLABICS WEST-CREE TWE */
- [0x1459, 0x1459], /* CANADIAN SYLLABICS TWI */
- [0x145a, 0x145a], /* CANADIAN SYLLABICS WEST-CREE TWI */
- [0x145b, 0x145b], /* CANADIAN SYLLABICS TWII */
- [0x145c, 0x145c], /* CANADIAN SYLLABICS WEST-CREE TWII */
- [0x145d, 0x145d], /* CANADIAN SYLLABICS TWO */
- [0x145e, 0x145e], /* CANADIAN SYLLABICS WEST-CREE TWO */
- [0x145f, 0x145f], /* CANADIAN SYLLABICS TWOO */
- [0x1460, 0x1460], /* CANADIAN SYLLABICS WEST-CREE TWOO */
- [0x1461, 0x1461], /* CANADIAN SYLLABICS TWA */
- [0x1462, 0x1462], /* CANADIAN SYLLABICS WEST-CREE TWA */
- [0x1463, 0x1463], /* CANADIAN SYLLABICS TWAA */
- [0x1464, 0x1464], /* CANADIAN SYLLABICS WEST-CREE TWAA */
- [0x1465, 0x1465], /* CANADIAN SYLLABICS NASKAPI TWAA */
- [0x1466, 0x1466], /* CANADIAN SYLLABICS T */
- [0x1467, 0x1467], /* CANADIAN SYLLABICS TTE */
- [0x1468, 0x1468], /* CANADIAN SYLLABICS TTI */
- [0x1469, 0x1469], /* CANADIAN SYLLABICS TTO */
- [0x146a, 0x146a], /* CANADIAN SYLLABICS TTA */
- [0x146b, 0x146b], /* CANADIAN SYLLABICS KE */
- [0x146c, 0x146c], /* CANADIAN SYLLABICS KAAI */
- [0x146d, 0x146d], /* CANADIAN SYLLABICS KI */
- [0x146e, 0x146e], /* CANADIAN SYLLABICS KII */
- [0x146f, 0x146f], /* CANADIAN SYLLABICS KO */
- [0x1470, 0x1470], /* CANADIAN SYLLABICS KOO */
- [0x1471, 0x1471], /* CANADIAN SYLLABICS Y-CREE KOO */
- [0x1472, 0x1472], /* CANADIAN SYLLABICS KA */
- [0x1473, 0x1473], /* CANADIAN SYLLABICS KAA */
- [0x1474, 0x1474], /* CANADIAN SYLLABICS KWE */
- [0x1475, 0x1475], /* CANADIAN SYLLABICS WEST-CREE KWE */
- [0x1476, 0x1476], /* CANADIAN SYLLABICS KWI */
- [0x1477, 0x1477], /* CANADIAN SYLLABICS WEST-CREE KWI */
- [0x1478, 0x1478], /* CANADIAN SYLLABICS KWII */
- [0x1479, 0x1479], /* CANADIAN SYLLABICS WEST-CREE KWII */
- [0x147a, 0x147a], /* CANADIAN SYLLABICS KWO */
- [0x147b, 0x147b], /* CANADIAN SYLLABICS WEST-CREE KWO */
- [0x147c, 0x147c], /* CANADIAN SYLLABICS KWOO */
- [0x147d, 0x147d], /* CANADIAN SYLLABICS WEST-CREE KWOO */
- [0x147e, 0x147e], /* CANADIAN SYLLABICS KWA */
- [0x147f, 0x147f], /* CANADIAN SYLLABICS WEST-CREE KWA */
- [0x1480, 0x1480], /* CANADIAN SYLLABICS KWAA */
- [0x1481, 0x1481], /* CANADIAN SYLLABICS WEST-CREE KWAA */
- [0x1482, 0x1482], /* CANADIAN SYLLABICS NASKAPI KWAA */
- [0x1483, 0x1483], /* CANADIAN SYLLABICS K */
- [0x1484, 0x1484], /* CANADIAN SYLLABICS KW */
- [0x1485, 0x1485], /* CANADIAN SYLLABICS SOUTH-SLAVEY KEH */
- [0x1486, 0x1486], /* CANADIAN SYLLABICS SOUTH-SLAVEY KIH */
- [0x1487, 0x1487], /* CANADIAN SYLLABICS SOUTH-SLAVEY KOH */
- [0x1488, 0x1488], /* CANADIAN SYLLABICS SOUTH-SLAVEY KAH */
- [0x1489, 0x1489], /* CANADIAN SYLLABICS CE */
- [0x148a, 0x148a], /* CANADIAN SYLLABICS CAAI */
- [0x148b, 0x148b], /* CANADIAN SYLLABICS CI */
- [0x148c, 0x148c], /* CANADIAN SYLLABICS CII */
- [0x148d, 0x148d], /* CANADIAN SYLLABICS CO */
- [0x148e, 0x148e], /* CANADIAN SYLLABICS COO */
- [0x148f, 0x148f], /* CANADIAN SYLLABICS Y-CREE COO */
- [0x1490, 0x1490], /* CANADIAN SYLLABICS CA */
- [0x1491, 0x1491], /* CANADIAN SYLLABICS CAA */
- [0x1492, 0x1492], /* CANADIAN SYLLABICS CWE */
- [0x1493, 0x1493], /* CANADIAN SYLLABICS WEST-CREE CWE */
- [0x1494, 0x1494], /* CANADIAN SYLLABICS CWI */
- [0x1495, 0x1495], /* CANADIAN SYLLABICS WEST-CREE CWI */
- [0x1496, 0x1496], /* CANADIAN SYLLABICS CWII */
- [0x1497, 0x1497], /* CANADIAN SYLLABICS WEST-CREE CWII */
- [0x1498, 0x1498], /* CANADIAN SYLLABICS CWO */
- [0x1499, 0x1499], /* CANADIAN SYLLABICS WEST-CREE CWO */
- [0x149a, 0x149a], /* CANADIAN SYLLABICS CWOO */
- [0x149b, 0x149b], /* CANADIAN SYLLABICS WEST-CREE CWOO */
- [0x149c, 0x149c], /* CANADIAN SYLLABICS CWA */
- [0x149d, 0x149d], /* CANADIAN SYLLABICS WEST-CREE CWA */
- [0x149e, 0x149e], /* CANADIAN SYLLABICS CWAA */
- [0x149f, 0x149f], /* CANADIAN SYLLABICS WEST-CREE CWAA */
- [0x14a0, 0x14a0], /* CANADIAN SYLLABICS NASKAPI CWAA */
- [0x14a1, 0x14a1], /* CANADIAN SYLLABICS C */
- [0x14a2, 0x14a2], /* CANADIAN SYLLABICS SAYISI TH */
- [0x14a3, 0x14a3], /* CANADIAN SYLLABICS ME */
- [0x14a4, 0x14a4], /* CANADIAN SYLLABICS MAAI */
- [0x14a5, 0x14a5], /* CANADIAN SYLLABICS MI */
- [0x14a6, 0x14a6], /* CANADIAN SYLLABICS MII */
- [0x14a7, 0x14a7], /* CANADIAN SYLLABICS MO */
- [0x14a8, 0x14a8], /* CANADIAN SYLLABICS MOO */
- [0x14a9, 0x14a9], /* CANADIAN SYLLABICS Y-CREE MOO */
- [0x14aa, 0x14aa], /* CANADIAN SYLLABICS MA */
- [0x14ab, 0x14ab], /* CANADIAN SYLLABICS MAA */
- [0x14ac, 0x14ac], /* CANADIAN SYLLABICS MWE */
- [0x14ad, 0x14ad], /* CANADIAN SYLLABICS WEST-CREE MWE */
- [0x14ae, 0x14ae], /* CANADIAN SYLLABICS MWI */
- [0x14af, 0x14af], /* CANADIAN SYLLABICS WEST-CREE MWI */
- [0x14b0, 0x14b0], /* CANADIAN SYLLABICS MWII */
- [0x14b1, 0x14b1], /* CANADIAN SYLLABICS WEST-CREE MWII */
- [0x14b2, 0x14b2], /* CANADIAN SYLLABICS MWO */
- [0x14b3, 0x14b3], /* CANADIAN SYLLABICS WEST-CREE MWO */
- [0x14b4, 0x14b4], /* CANADIAN SYLLABICS MWOO */
- [0x14b5, 0x14b5], /* CANADIAN SYLLABICS WEST-CREE MWOO */
- [0x14b6, 0x14b6], /* CANADIAN SYLLABICS MWA */
- [0x14b7, 0x14b7], /* CANADIAN SYLLABICS WEST-CREE MWA */
- [0x14b8, 0x14b8], /* CANADIAN SYLLABICS MWAA */
- [0x14b9, 0x14b9], /* CANADIAN SYLLABICS WEST-CREE MWAA */
- [0x14ba, 0x14ba], /* CANADIAN SYLLABICS NASKAPI MWAA */
- [0x14bb, 0x14bb], /* CANADIAN SYLLABICS M */
- [0x14bc, 0x14bc], /* CANADIAN SYLLABICS WEST-CREE M */
- [0x14bd, 0x14bd], /* CANADIAN SYLLABICS MH */
- [0x14be, 0x14be], /* CANADIAN SYLLABICS ATHAPASCAN M */
- [0x14bf, 0x14bf], /* CANADIAN SYLLABICS SAYISI M */
- [0x14c0, 0x14c0], /* CANADIAN SYLLABICS NE */
- [0x14c1, 0x14c1], /* CANADIAN SYLLABICS NAAI */
- [0x14c2, 0x14c2], /* CANADIAN SYLLABICS NI */
- [0x14c3, 0x14c3], /* CANADIAN SYLLABICS NII */
- [0x14c4, 0x14c4], /* CANADIAN SYLLABICS NO */
- [0x14c5, 0x14c5], /* CANADIAN SYLLABICS NOO */
- [0x14c6, 0x14c6], /* CANADIAN SYLLABICS Y-CREE NOO */
- [0x14c7, 0x14c7], /* CANADIAN SYLLABICS NA */
- [0x14c8, 0x14c8], /* CANADIAN SYLLABICS NAA */
- [0x14c9, 0x14c9], /* CANADIAN SYLLABICS NWE */
- [0x14ca, 0x14ca], /* CANADIAN SYLLABICS WEST-CREE NWE */
- [0x14cb, 0x14cb], /* CANADIAN SYLLABICS NWA */
- [0x14cc, 0x14cc], /* CANADIAN SYLLABICS WEST-CREE NWA */
- [0x14cd, 0x14cd], /* CANADIAN SYLLABICS NWAA */
- [0x14ce, 0x14ce], /* CANADIAN SYLLABICS WEST-CREE NWAA */
- [0x14cf, 0x14cf], /* CANADIAN SYLLABICS NASKAPI NWAA */
- [0x14d0, 0x14d0], /* CANADIAN SYLLABICS N */
- [0x14d1, 0x14d1], /* CANADIAN SYLLABICS CARRIER NG */
- [0x14d2, 0x14d2], /* CANADIAN SYLLABICS NH */
- [0x14d3, 0x14d3], /* CANADIAN SYLLABICS LE */
- [0x14d4, 0x14d4], /* CANADIAN SYLLABICS LAAI */
- [0x14d5, 0x14d5], /* CANADIAN SYLLABICS LI */
- [0x14d6, 0x14d6], /* CANADIAN SYLLABICS LII */
- [0x14d7, 0x14d7], /* CANADIAN SYLLABICS LO */
- [0x14d8, 0x14d8], /* CANADIAN SYLLABICS LOO */
- [0x14d9, 0x14d9], /* CANADIAN SYLLABICS Y-CREE LOO */
- [0x14da, 0x14da], /* CANADIAN SYLLABICS LA */
- [0x14db, 0x14db], /* CANADIAN SYLLABICS LAA */
- [0x14dc, 0x14dc], /* CANADIAN SYLLABICS LWE */
- [0x14dd, 0x14dd], /* CANADIAN SYLLABICS WEST-CREE LWE */
- [0x14de, 0x14de], /* CANADIAN SYLLABICS LWI */
- [0x14df, 0x14df], /* CANADIAN SYLLABICS WEST-CREE LWI */
- [0x14e0, 0x14e0], /* CANADIAN SYLLABICS LWII */
- [0x14e1, 0x14e1], /* CANADIAN SYLLABICS WEST-CREE LWII */
- [0x14e2, 0x14e2], /* CANADIAN SYLLABICS LWO */
- [0x14e3, 0x14e3], /* CANADIAN SYLLABICS WEST-CREE LWO */
- [0x14e4, 0x14e4], /* CANADIAN SYLLABICS LWOO */
- [0x14e5, 0x14e5], /* CANADIAN SYLLABICS WEST-CREE LWOO */
- [0x14e6, 0x14e6], /* CANADIAN SYLLABICS LWA */
- [0x14e7, 0x14e7], /* CANADIAN SYLLABICS WEST-CREE LWA */
- [0x14e8, 0x14e8], /* CANADIAN SYLLABICS LWAA */
- [0x14e9, 0x14e9], /* CANADIAN SYLLABICS WEST-CREE LWAA */
- [0x14ea, 0x14ea], /* CANADIAN SYLLABICS L */
- [0x14eb, 0x14eb], /* CANADIAN SYLLABICS WEST-CREE L */
- [0x14ec, 0x14ec], /* CANADIAN SYLLABICS MEDIAL L */
- [0x14ed, 0x14ed], /* CANADIAN SYLLABICS SE */
- [0x14ee, 0x14ee], /* CANADIAN SYLLABICS SAAI */
- [0x14ef, 0x14ef], /* CANADIAN SYLLABICS SI */
- [0x14f0, 0x14f0], /* CANADIAN SYLLABICS SII */
- [0x14f1, 0x14f1], /* CANADIAN SYLLABICS SO */
- [0x14f2, 0x14f2], /* CANADIAN SYLLABICS SOO */
- [0x14f3, 0x14f3], /* CANADIAN SYLLABICS Y-CREE SOO */
- [0x14f4, 0x14f4], /* CANADIAN SYLLABICS SA */
- [0x14f5, 0x14f5], /* CANADIAN SYLLABICS SAA */
- [0x14f6, 0x14f6], /* CANADIAN SYLLABICS SWE */
- [0x14f7, 0x14f7], /* CANADIAN SYLLABICS WEST-CREE SWE */
- [0x14f8, 0x14f8], /* CANADIAN SYLLABICS SWI */
- [0x14f9, 0x14f9], /* CANADIAN SYLLABICS WEST-CREE SWI */
- [0x14fa, 0x14fa], /* CANADIAN SYLLABICS SWII */
- [0x14fb, 0x14fb], /* CANADIAN SYLLABICS WEST-CREE SWII */
- [0x14fc, 0x14fc], /* CANADIAN SYLLABICS SWO */
- [0x14fd, 0x14fd], /* CANADIAN SYLLABICS WEST-CREE SWO */
- [0x14fe, 0x14fe], /* CANADIAN SYLLABICS SWOO */
- [0x14ff, 0x14ff], /* CANADIAN SYLLABICS WEST-CREE SWOO */
- [0x1500, 0x1500], /* CANADIAN SYLLABICS SWA */
- [0x1501, 0x1501], /* CANADIAN SYLLABICS WEST-CREE SWA */
- [0x1502, 0x1502], /* CANADIAN SYLLABICS SWAA */
- [0x1503, 0x1503], /* CANADIAN SYLLABICS WEST-CREE SWAA */
- [0x1504, 0x1504], /* CANADIAN SYLLABICS NASKAPI SWAA */
- [0x1505, 0x1505], /* CANADIAN SYLLABICS S */
- [0x1506, 0x1506], /* CANADIAN SYLLABICS ATHAPASCAN S */
- [0x1507, 0x1507], /* CANADIAN SYLLABICS SW */
- [0x1508, 0x1508], /* CANADIAN SYLLABICS BLACKFOOT S */
- [0x1509, 0x1509], /* CANADIAN SYLLABICS MOOSE-CREE SK */
- [0x150a, 0x150a], /* CANADIAN SYLLABICS NASKAPI SKW */
- [0x150b, 0x150b], /* CANADIAN SYLLABICS NASKAPI S-W */
- [0x150c, 0x150c], /* CANADIAN SYLLABICS NASKAPI SPWA */
- [0x150d, 0x150d], /* CANADIAN SYLLABICS NASKAPI STWA */
- [0x150e, 0x150e], /* CANADIAN SYLLABICS NASKAPI SKWA */
- [0x150f, 0x150f], /* CANADIAN SYLLABICS NASKAPI SCWA */
- [0x1510, 0x1510], /* CANADIAN SYLLABICS SHE */
- [0x1511, 0x1511], /* CANADIAN SYLLABICS SHI */
- [0x1512, 0x1512], /* CANADIAN SYLLABICS SHII */
- [0x1513, 0x1513], /* CANADIAN SYLLABICS SHO */
- [0x1514, 0x1514], /* CANADIAN SYLLABICS SHOO */
- [0x1515, 0x1515], /* CANADIAN SYLLABICS SHA */
- [0x1516, 0x1516], /* CANADIAN SYLLABICS SHAA */
- [0x1517, 0x1517], /* CANADIAN SYLLABICS SHWE */
- [0x1518, 0x1518], /* CANADIAN SYLLABICS WEST-CREE SHWE */
- [0x1519, 0x1519], /* CANADIAN SYLLABICS SHWI */
- [0x151a, 0x151a], /* CANADIAN SYLLABICS WEST-CREE SHWI */
- [0x151b, 0x151b], /* CANADIAN SYLLABICS SHWII */
- [0x151c, 0x151c], /* CANADIAN SYLLABICS WEST-CREE SHWII */
- [0x151d, 0x151d], /* CANADIAN SYLLABICS SHWO */
- [0x151e, 0x151e], /* CANADIAN SYLLABICS WEST-CREE SHWO */
- [0x151f, 0x151f], /* CANADIAN SYLLABICS SHWOO */
- [0x1520, 0x1520], /* CANADIAN SYLLABICS WEST-CREE SHWOO */
- [0x1521, 0x1521], /* CANADIAN SYLLABICS SHWA */
- [0x1522, 0x1522], /* CANADIAN SYLLABICS WEST-CREE SHWA */
- [0x1523, 0x1523], /* CANADIAN SYLLABICS SHWAA */
- [0x1524, 0x1524], /* CANADIAN SYLLABICS WEST-CREE SHWAA */
- [0x1525, 0x1525], /* CANADIAN SYLLABICS SH */
- [0x1526, 0x1526], /* CANADIAN SYLLABICS YE */
- [0x1527, 0x1527], /* CANADIAN SYLLABICS YAAI */
- [0x1528, 0x1528], /* CANADIAN SYLLABICS YI */
- [0x1529, 0x1529], /* CANADIAN SYLLABICS YII */
- [0x152a, 0x152a], /* CANADIAN SYLLABICS YO */
- [0x152b, 0x152b], /* CANADIAN SYLLABICS YOO */
- [0x152c, 0x152c], /* CANADIAN SYLLABICS Y-CREE YOO */
- [0x152d, 0x152d], /* CANADIAN SYLLABICS YA */
- [0x152e, 0x152e], /* CANADIAN SYLLABICS YAA */
- [0x152f, 0x152f], /* CANADIAN SYLLABICS YWE */
- [0x1530, 0x1530], /* CANADIAN SYLLABICS WEST-CREE YWE */
- [0x1531, 0x1531], /* CANADIAN SYLLABICS YWI */
- [0x1532, 0x1532], /* CANADIAN SYLLABICS WEST-CREE YWI */
- [0x1533, 0x1533], /* CANADIAN SYLLABICS YWII */
- [0x1534, 0x1534], /* CANADIAN SYLLABICS WEST-CREE YWII */
- [0x1535, 0x1535], /* CANADIAN SYLLABICS YWO */
- [0x1536, 0x1536], /* CANADIAN SYLLABICS WEST-CREE YWO */
- [0x1537, 0x1537], /* CANADIAN SYLLABICS YWOO */
- [0x1538, 0x1538], /* CANADIAN SYLLABICS WEST-CREE YWOO */
- [0x1539, 0x1539], /* CANADIAN SYLLABICS YWA */
- [0x153a, 0x153a], /* CANADIAN SYLLABICS WEST-CREE YWA */
- [0x153b, 0x153b], /* CANADIAN SYLLABICS YWAA */
- [0x153c, 0x153c], /* CANADIAN SYLLABICS WEST-CREE YWAA */
- [0x153d, 0x153d], /* CANADIAN SYLLABICS NASKAPI YWAA */
- [0x153e, 0x153e], /* CANADIAN SYLLABICS Y */
- [0x153f, 0x153f], /* CANADIAN SYLLABICS BIBLE-CREE Y */
- [0x1540, 0x1540], /* CANADIAN SYLLABICS WEST-CREE Y */
- [0x1541, 0x1541], /* CANADIAN SYLLABICS SAYISI YI */
- [0x1542, 0x1542], /* CANADIAN SYLLABICS RE */
- [0x1543, 0x1543], /* CANADIAN SYLLABICS R-CREE RE */
- [0x1544, 0x1544], /* CANADIAN SYLLABICS WEST-CREE LE */
- [0x1545, 0x1545], /* CANADIAN SYLLABICS RAAI */
- [0x1546, 0x1546], /* CANADIAN SYLLABICS RI */
- [0x1547, 0x1547], /* CANADIAN SYLLABICS RII */
- [0x1548, 0x1548], /* CANADIAN SYLLABICS RO */
- [0x1549, 0x1549], /* CANADIAN SYLLABICS ROO */
- [0x154a, 0x154a], /* CANADIAN SYLLABICS WEST-CREE LO */
- [0x154b, 0x154b], /* CANADIAN SYLLABICS RA */
- [0x154c, 0x154c], /* CANADIAN SYLLABICS RAA */
- [0x154d, 0x154d], /* CANADIAN SYLLABICS WEST-CREE LA */
- [0x154e, 0x154e], /* CANADIAN SYLLABICS RWAA */
- [0x154f, 0x154f], /* CANADIAN SYLLABICS WEST-CREE RWAA */
- [0x1550, 0x1550], /* CANADIAN SYLLABICS R */
- [0x1551, 0x1551], /* CANADIAN SYLLABICS WEST-CREE R */
- [0x1552, 0x1552], /* CANADIAN SYLLABICS MEDIAL R */
- [0x1553, 0x1553], /* CANADIAN SYLLABICS FE */
- [0x1554, 0x1554], /* CANADIAN SYLLABICS FAAI */
- [0x1555, 0x1555], /* CANADIAN SYLLABICS FI */
- [0x1556, 0x1556], /* CANADIAN SYLLABICS FII */
- [0x1557, 0x1557], /* CANADIAN SYLLABICS FO */
- [0x1558, 0x1558], /* CANADIAN SYLLABICS FOO */
- [0x1559, 0x1559], /* CANADIAN SYLLABICS FA */
- [0x155a, 0x155a], /* CANADIAN SYLLABICS FAA */
- [0x155b, 0x155b], /* CANADIAN SYLLABICS FWAA */
- [0x155c, 0x155c], /* CANADIAN SYLLABICS WEST-CREE FWAA */
- [0x155d, 0x155d], /* CANADIAN SYLLABICS F */
- [0x155e, 0x155e], /* CANADIAN SYLLABICS THE */
- [0x155f, 0x155f], /* CANADIAN SYLLABICS N-CREE THE */
- [0x1560, 0x1560], /* CANADIAN SYLLABICS THI */
- [0x1561, 0x1561], /* CANADIAN SYLLABICS N-CREE THI */
- [0x1562, 0x1562], /* CANADIAN SYLLABICS THII */
- [0x1563, 0x1563], /* CANADIAN SYLLABICS N-CREE THII */
- [0x1564, 0x1564], /* CANADIAN SYLLABICS THO */
- [0x1565, 0x1565], /* CANADIAN SYLLABICS THOO */
- [0x1566, 0x1566], /* CANADIAN SYLLABICS THA */
- [0x1567, 0x1567], /* CANADIAN SYLLABICS THAA */
- [0x1568, 0x1568], /* CANADIAN SYLLABICS THWAA */
- [0x1569, 0x1569], /* CANADIAN SYLLABICS WEST-CREE THWAA */
- [0x156a, 0x156a], /* CANADIAN SYLLABICS TH */
- [0x156b, 0x156b], /* CANADIAN SYLLABICS TTHE */
- [0x156c, 0x156c], /* CANADIAN SYLLABICS TTHI */
- [0x156d, 0x156d], /* CANADIAN SYLLABICS TTHO */
- [0x156e, 0x156e], /* CANADIAN SYLLABICS TTHA */
- [0x156f, 0x156f], /* CANADIAN SYLLABICS TTH */
- [0x1570, 0x1570], /* CANADIAN SYLLABICS TYE */
- [0x1571, 0x1571], /* CANADIAN SYLLABICS TYI */
- [0x1572, 0x1572], /* CANADIAN SYLLABICS TYO */
- [0x1573, 0x1573], /* CANADIAN SYLLABICS TYA */
- [0x1574, 0x1574], /* CANADIAN SYLLABICS NUNAVIK HE */
- [0x1575, 0x1575], /* CANADIAN SYLLABICS NUNAVIK HI */
- [0x1576, 0x1576], /* CANADIAN SYLLABICS NUNAVIK HII */
- [0x1577, 0x1577], /* CANADIAN SYLLABICS NUNAVIK HO */
- [0x1578, 0x1578], /* CANADIAN SYLLABICS NUNAVIK HOO */
- [0x1579, 0x1579], /* CANADIAN SYLLABICS NUNAVIK HA */
- [0x157a, 0x157a], /* CANADIAN SYLLABICS NUNAVIK HAA */
- [0x157b, 0x157b], /* CANADIAN SYLLABICS NUNAVIK H */
- [0x157c, 0x157c], /* CANADIAN SYLLABICS NUNAVUT H */
- [0x157d, 0x157d], /* CANADIAN SYLLABICS HK */
- [0x157e, 0x157e], /* CANADIAN SYLLABICS QAAI */
- [0x157f, 0x157f], /* CANADIAN SYLLABICS QI */
- [0x1580, 0x1580], /* CANADIAN SYLLABICS QII */
- [0x1581, 0x1581], /* CANADIAN SYLLABICS QO */
- [0x1582, 0x1582], /* CANADIAN SYLLABICS QOO */
- [0x1583, 0x1583], /* CANADIAN SYLLABICS QA */
- [0x1584, 0x1584], /* CANADIAN SYLLABICS QAA */
- [0x1585, 0x1585], /* CANADIAN SYLLABICS Q */
- [0x1586, 0x1586], /* CANADIAN SYLLABICS TLHE */
- [0x1587, 0x1587], /* CANADIAN SYLLABICS TLHI */
- [0x1588, 0x1588], /* CANADIAN SYLLABICS TLHO */
- [0x1589, 0x1589], /* CANADIAN SYLLABICS TLHA */
- [0x158a, 0x158a], /* CANADIAN SYLLABICS WEST-CREE RE */
- [0x158b, 0x158b], /* CANADIAN SYLLABICS WEST-CREE RI */
- [0x158c, 0x158c], /* CANADIAN SYLLABICS WEST-CREE RO */
- [0x158d, 0x158d], /* CANADIAN SYLLABICS WEST-CREE RA */
- [0x158e, 0x158e], /* CANADIAN SYLLABICS NGAAI */
- [0x158f, 0x158f], /* CANADIAN SYLLABICS NGI */
- [0x1590, 0x1590], /* CANADIAN SYLLABICS NGII */
- [0x1591, 0x1591], /* CANADIAN SYLLABICS NGO */
- [0x1592, 0x1592], /* CANADIAN SYLLABICS NGOO */
- [0x1593, 0x1593], /* CANADIAN SYLLABICS NGA */
- [0x1594, 0x1594], /* CANADIAN SYLLABICS NGAA */
- [0x1595, 0x1595], /* CANADIAN SYLLABICS NG */
- [0x1596, 0x1596], /* CANADIAN SYLLABICS NNG */
- [0x1597, 0x1597], /* CANADIAN SYLLABICS SAYISI SHE */
- [0x1598, 0x1598], /* CANADIAN SYLLABICS SAYISI SHI */
- [0x1599, 0x1599], /* CANADIAN SYLLABICS SAYISI SHO */
- [0x159a, 0x159a], /* CANADIAN SYLLABICS SAYISI SHA */
- [0x159b, 0x159b], /* CANADIAN SYLLABICS WOODS-CREE THE */
- [0x159c, 0x159c], /* CANADIAN SYLLABICS WOODS-CREE THI */
- [0x159d, 0x159d], /* CANADIAN SYLLABICS WOODS-CREE THO */
- [0x159e, 0x159e], /* CANADIAN SYLLABICS WOODS-CREE THA */
- [0x159f, 0x159f], /* CANADIAN SYLLABICS WOODS-CREE TH */
- [0x15a0, 0x15a0], /* CANADIAN SYLLABICS LHI */
- [0x15a1, 0x15a1], /* CANADIAN SYLLABICS LHII */
- [0x15a2, 0x15a2], /* CANADIAN SYLLABICS LHO */
- [0x15a3, 0x15a3], /* CANADIAN SYLLABICS LHOO */
- [0x15a4, 0x15a4], /* CANADIAN SYLLABICS LHA */
- [0x15a5, 0x15a5], /* CANADIAN SYLLABICS LHAA */
- [0x15a6, 0x15a6], /* CANADIAN SYLLABICS LH */
- [0x15a7, 0x15a7], /* CANADIAN SYLLABICS TH-CREE THE */
- [0x15a8, 0x15a8], /* CANADIAN SYLLABICS TH-CREE THI */
- [0x15a9, 0x15a9], /* CANADIAN SYLLABICS TH-CREE THII */
- [0x15aa, 0x15aa], /* CANADIAN SYLLABICS TH-CREE THO */
- [0x15ab, 0x15ab], /* CANADIAN SYLLABICS TH-CREE THOO */
- [0x15ac, 0x15ac], /* CANADIAN SYLLABICS TH-CREE THA */
- [0x15ad, 0x15ad], /* CANADIAN SYLLABICS TH-CREE THAA */
- [0x15ae, 0x15ae], /* CANADIAN SYLLABICS TH-CREE TH */
- [0x15af, 0x15af], /* CANADIAN SYLLABICS AIVILIK B */
- [0x15b0, 0x15b0], /* CANADIAN SYLLABICS BLACKFOOT E */
- [0x15b1, 0x15b1], /* CANADIAN SYLLABICS BLACKFOOT I */
- [0x15b2, 0x15b2], /* CANADIAN SYLLABICS BLACKFOOT O */
- [0x15b3, 0x15b3], /* CANADIAN SYLLABICS BLACKFOOT A */
- [0x15b4, 0x15b4], /* CANADIAN SYLLABICS BLACKFOOT WE */
- [0x15b5, 0x15b5], /* CANADIAN SYLLABICS BLACKFOOT WI */
- [0x15b6, 0x15b6], /* CANADIAN SYLLABICS BLACKFOOT WO */
- [0x15b7, 0x15b7], /* CANADIAN SYLLABICS BLACKFOOT WA */
- [0x15b8, 0x15b8], /* CANADIAN SYLLABICS BLACKFOOT NE */
- [0x15b9, 0x15b9], /* CANADIAN SYLLABICS BLACKFOOT NI */
- [0x15ba, 0x15ba], /* CANADIAN SYLLABICS BLACKFOOT NO */
- [0x15bb, 0x15bb], /* CANADIAN SYLLABICS BLACKFOOT NA */
- [0x15bc, 0x15bc], /* CANADIAN SYLLABICS BLACKFOOT KE */
- [0x15bd, 0x15bd], /* CANADIAN SYLLABICS BLACKFOOT KI */
- [0x15be, 0x15be], /* CANADIAN SYLLABICS BLACKFOOT KO */
- [0x15bf, 0x15bf], /* CANADIAN SYLLABICS BLACKFOOT KA */
- [0x15c0, 0x15c0], /* CANADIAN SYLLABICS SAYISI HE */
- [0x15c1, 0x15c1], /* CANADIAN SYLLABICS SAYISI HI */
- [0x15c2, 0x15c2], /* CANADIAN SYLLABICS SAYISI HO */
- [0x15c3, 0x15c3], /* CANADIAN SYLLABICS SAYISI HA */
- [0x15c4, 0x15c4], /* CANADIAN SYLLABICS CARRIER GHU */
- [0x15c5, 0x15c5], /* CANADIAN SYLLABICS CARRIER GHO */
- [0x15c6, 0x15c6], /* CANADIAN SYLLABICS CARRIER GHE */
- [0x15c7, 0x15c7], /* CANADIAN SYLLABICS CARRIER GHEE */
- [0x15c8, 0x15c8], /* CANADIAN SYLLABICS CARRIER GHI */
- [0x15c9, 0x15c9], /* CANADIAN SYLLABICS CARRIER GHA */
- [0x15ca, 0x15ca], /* CANADIAN SYLLABICS CARRIER RU */
- [0x15cb, 0x15cb], /* CANADIAN SYLLABICS CARRIER RO */
- [0x15cc, 0x15cc], /* CANADIAN SYLLABICS CARRIER RE */
- [0x15cd, 0x15cd], /* CANADIAN SYLLABICS CARRIER REE */
- [0x15ce, 0x15ce], /* CANADIAN SYLLABICS CARRIER RI */
- [0x15cf, 0x15cf], /* CANADIAN SYLLABICS CARRIER RA */
- [0x15d0, 0x15d0], /* CANADIAN SYLLABICS CARRIER WU */
- [0x15d1, 0x15d1], /* CANADIAN SYLLABICS CARRIER WO */
- [0x15d2, 0x15d2], /* CANADIAN SYLLABICS CARRIER WE */
- [0x15d3, 0x15d3], /* CANADIAN SYLLABICS CARRIER WEE */
- [0x15d4, 0x15d4], /* CANADIAN SYLLABICS CARRIER WI */
- [0x15d5, 0x15d5], /* CANADIAN SYLLABICS CARRIER WA */
- [0x15d6, 0x15d6], /* CANADIAN SYLLABICS CARRIER HWU */
- [0x15d7, 0x15d7], /* CANADIAN SYLLABICS CARRIER HWO */
- [0x15d8, 0x15d8], /* CANADIAN SYLLABICS CARRIER HWE */
- [0x15d9, 0x15d9], /* CANADIAN SYLLABICS CARRIER HWEE */
- [0x15da, 0x15da], /* CANADIAN SYLLABICS CARRIER HWI */
- [0x15db, 0x15db], /* CANADIAN SYLLABICS CARRIER HWA */
- [0x15dc, 0x15dc], /* CANADIAN SYLLABICS CARRIER THU */
- [0x15dd, 0x15dd], /* CANADIAN SYLLABICS CARRIER THO */
- [0x15de, 0x15de], /* CANADIAN SYLLABICS CARRIER THE */
- [0x15df, 0x15df], /* CANADIAN SYLLABICS CARRIER THEE */
- [0x15e0, 0x15e0], /* CANADIAN SYLLABICS CARRIER THI */
- [0x15e1, 0x15e1], /* CANADIAN SYLLABICS CARRIER THA */
- [0x15e2, 0x15e2], /* CANADIAN SYLLABICS CARRIER TTU */
- [0x15e3, 0x15e3], /* CANADIAN SYLLABICS CARRIER TTO */
- [0x15e4, 0x15e4], /* CANADIAN SYLLABICS CARRIER TTE */
- [0x15e5, 0x15e5], /* CANADIAN SYLLABICS CARRIER TTEE */
- [0x15e6, 0x15e6], /* CANADIAN SYLLABICS CARRIER TTI */
- [0x15e7, 0x15e7], /* CANADIAN SYLLABICS CARRIER TTA */
- [0x15e8, 0x15e8], /* CANADIAN SYLLABICS CARRIER PU */
- [0x15e9, 0x15e9], /* CANADIAN SYLLABICS CARRIER PO */
- [0x15ea, 0x15ea], /* CANADIAN SYLLABICS CARRIER PE */
- [0x15eb, 0x15eb], /* CANADIAN SYLLABICS CARRIER PEE */
- [0x15ec, 0x15ec], /* CANADIAN SYLLABICS CARRIER PI */
- [0x15ed, 0x15ed], /* CANADIAN SYLLABICS CARRIER PA */
- [0x15ee, 0x15ee], /* CANADIAN SYLLABICS CARRIER P */
- [0x15ef, 0x15ef], /* CANADIAN SYLLABICS CARRIER GU */
- [0x15f0, 0x15f0], /* CANADIAN SYLLABICS CARRIER GO */
- [0x15f1, 0x15f1], /* CANADIAN SYLLABICS CARRIER GE */
- [0x15f2, 0x15f2], /* CANADIAN SYLLABICS CARRIER GEE */
- [0x15f3, 0x15f3], /* CANADIAN SYLLABICS CARRIER GI */
- [0x15f4, 0x15f4], /* CANADIAN SYLLABICS CARRIER GA */
- [0x15f5, 0x15f5], /* CANADIAN SYLLABICS CARRIER KHU */
- [0x15f6, 0x15f6], /* CANADIAN SYLLABICS CARRIER KHO */
- [0x15f7, 0x15f7], /* CANADIAN SYLLABICS CARRIER KHE */
- [0x15f8, 0x15f8], /* CANADIAN SYLLABICS CARRIER KHEE */
- [0x15f9, 0x15f9], /* CANADIAN SYLLABICS CARRIER KHI */
- [0x15fa, 0x15fa], /* CANADIAN SYLLABICS CARRIER KHA */
- [0x15fb, 0x15fb], /* CANADIAN SYLLABICS CARRIER KKU */
- [0x15fc, 0x15fc], /* CANADIAN SYLLABICS CARRIER KKO */
- [0x15fd, 0x15fd], /* CANADIAN SYLLABICS CARRIER KKE */
- [0x15fe, 0x15fe], /* CANADIAN SYLLABICS CARRIER KKEE */
- [0x15ff, 0x15ff], /* CANADIAN SYLLABICS CARRIER KKI */
- [0x1600, 0x1600], /* CANADIAN SYLLABICS CARRIER KKA */
- [0x1601, 0x1601], /* CANADIAN SYLLABICS CARRIER KK */
- [0x1602, 0x1602], /* CANADIAN SYLLABICS CARRIER NU */
- [0x1603, 0x1603], /* CANADIAN SYLLABICS CARRIER NO */
- [0x1604, 0x1604], /* CANADIAN SYLLABICS CARRIER NE */
- [0x1605, 0x1605], /* CANADIAN SYLLABICS CARRIER NEE */
- [0x1606, 0x1606], /* CANADIAN SYLLABICS CARRIER NI */
- [0x1607, 0x1607], /* CANADIAN SYLLABICS CARRIER NA */
- [0x1608, 0x1608], /* CANADIAN SYLLABICS CARRIER MU */
- [0x1609, 0x1609], /* CANADIAN SYLLABICS CARRIER MO */
- [0x160a, 0x160a], /* CANADIAN SYLLABICS CARRIER ME */
- [0x160b, 0x160b], /* CANADIAN SYLLABICS CARRIER MEE */
- [0x160c, 0x160c], /* CANADIAN SYLLABICS CARRIER MI */
- [0x160d, 0x160d], /* CANADIAN SYLLABICS CARRIER MA */
- [0x160e, 0x160e], /* CANADIAN SYLLABICS CARRIER YU */
- [0x160f, 0x160f], /* CANADIAN SYLLABICS CARRIER YO */
- [0x1610, 0x1610], /* CANADIAN SYLLABICS CARRIER YE */
- [0x1611, 0x1611], /* CANADIAN SYLLABICS CARRIER YEE */
- [0x1612, 0x1612], /* CANADIAN SYLLABICS CARRIER YI */
- [0x1613, 0x1613], /* CANADIAN SYLLABICS CARRIER YA */
- [0x1614, 0x1614], /* CANADIAN SYLLABICS CARRIER JU */
- [0x1615, 0x1615], /* CANADIAN SYLLABICS SAYISI JU */
- [0x1616, 0x1616], /* CANADIAN SYLLABICS CARRIER JO */
- [0x1617, 0x1617], /* CANADIAN SYLLABICS CARRIER JE */
- [0x1618, 0x1618], /* CANADIAN SYLLABICS CARRIER JEE */
- [0x1619, 0x1619], /* CANADIAN SYLLABICS CARRIER JI */
- [0x161a, 0x161a], /* CANADIAN SYLLABICS SAYISI JI */
- [0x161b, 0x161b], /* CANADIAN SYLLABICS CARRIER JA */
- [0x161c, 0x161c], /* CANADIAN SYLLABICS CARRIER JJU */
- [0x161d, 0x161d], /* CANADIAN SYLLABICS CARRIER JJO */
- [0x161e, 0x161e], /* CANADIAN SYLLABICS CARRIER JJE */
- [0x161f, 0x161f], /* CANADIAN SYLLABICS CARRIER JJEE */
- [0x1620, 0x1620], /* CANADIAN SYLLABICS CARRIER JJI */
- [0x1621, 0x1621], /* CANADIAN SYLLABICS CARRIER JJA */
- [0x1622, 0x1622], /* CANADIAN SYLLABICS CARRIER LU */
- [0x1623, 0x1623], /* CANADIAN SYLLABICS CARRIER LO */
- [0x1624, 0x1624], /* CANADIAN SYLLABICS CARRIER LE */
- [0x1625, 0x1625], /* CANADIAN SYLLABICS CARRIER LEE */
- [0x1626, 0x1626], /* CANADIAN SYLLABICS CARRIER LI */
- [0x1627, 0x1627], /* CANADIAN SYLLABICS CARRIER LA */
- [0x1628, 0x1628], /* CANADIAN SYLLABICS CARRIER DLU */
- [0x1629, 0x1629], /* CANADIAN SYLLABICS CARRIER DLO */
- [0x162a, 0x162a], /* CANADIAN SYLLABICS CARRIER DLE */
- [0x162b, 0x162b], /* CANADIAN SYLLABICS CARRIER DLEE */
- [0x162c, 0x162c], /* CANADIAN SYLLABICS CARRIER DLI */
- [0x162d, 0x162d], /* CANADIAN SYLLABICS CARRIER DLA */
- [0x162e, 0x162e], /* CANADIAN SYLLABICS CARRIER LHU */
- [0x162f, 0x162f], /* CANADIAN SYLLABICS CARRIER LHO */
- [0x1630, 0x1630], /* CANADIAN SYLLABICS CARRIER LHE */
- [0x1631, 0x1631], /* CANADIAN SYLLABICS CARRIER LHEE */
- [0x1632, 0x1632], /* CANADIAN SYLLABICS CARRIER LHI */
- [0x1633, 0x1633], /* CANADIAN SYLLABICS CARRIER LHA */
- [0x1634, 0x1634], /* CANADIAN SYLLABICS CARRIER TLHU */
- [0x1635, 0x1635], /* CANADIAN SYLLABICS CARRIER TLHO */
- [0x1636, 0x1636], /* CANADIAN SYLLABICS CARRIER TLHE */
- [0x1637, 0x1637], /* CANADIAN SYLLABICS CARRIER TLHEE */
- [0x1638, 0x1638], /* CANADIAN SYLLABICS CARRIER TLHI */
- [0x1639, 0x1639], /* CANADIAN SYLLABICS CARRIER TLHA */
- [0x163a, 0x163a], /* CANADIAN SYLLABICS CARRIER TLU */
- [0x163b, 0x163b], /* CANADIAN SYLLABICS CARRIER TLO */
- [0x163c, 0x163c], /* CANADIAN SYLLABICS CARRIER TLE */
- [0x163d, 0x163d], /* CANADIAN SYLLABICS CARRIER TLEE */
- [0x163e, 0x163e], /* CANADIAN SYLLABICS CARRIER TLI */
- [0x163f, 0x163f], /* CANADIAN SYLLABICS CARRIER TLA */
- [0x1640, 0x1640], /* CANADIAN SYLLABICS CARRIER ZU */
- [0x1641, 0x1641], /* CANADIAN SYLLABICS CARRIER ZO */
- [0x1642, 0x1642], /* CANADIAN SYLLABICS CARRIER ZE */
- [0x1643, 0x1643], /* CANADIAN SYLLABICS CARRIER ZEE */
- [0x1644, 0x1644], /* CANADIAN SYLLABICS CARRIER ZI */
- [0x1645, 0x1645], /* CANADIAN SYLLABICS CARRIER ZA */
- [0x1646, 0x1646], /* CANADIAN SYLLABICS CARRIER Z */
- [0x1647, 0x1647], /* CANADIAN SYLLABICS CARRIER INITIAL Z */
- [0x1648, 0x1648], /* CANADIAN SYLLABICS CARRIER DZU */
- [0x1649, 0x1649], /* CANADIAN SYLLABICS CARRIER DZO */
- [0x164a, 0x164a], /* CANADIAN SYLLABICS CARRIER DZE */
- [0x164b, 0x164b], /* CANADIAN SYLLABICS CARRIER DZEE */
- [0x164c, 0x164c], /* CANADIAN SYLLABICS CARRIER DZI */
- [0x164d, 0x164d], /* CANADIAN SYLLABICS CARRIER DZA */
- [0x164e, 0x164e], /* CANADIAN SYLLABICS CARRIER SU */
- [0x164f, 0x164f], /* CANADIAN SYLLABICS CARRIER SO */
- [0x1650, 0x1650], /* CANADIAN SYLLABICS CARRIER SE */
- [0x1651, 0x1651], /* CANADIAN SYLLABICS CARRIER SEE */
- [0x1652, 0x1652], /* CANADIAN SYLLABICS CARRIER SI */
- [0x1653, 0x1653], /* CANADIAN SYLLABICS CARRIER SA */
- [0x1654, 0x1654], /* CANADIAN SYLLABICS CARRIER SHU */
- [0x1655, 0x1655], /* CANADIAN SYLLABICS CARRIER SHO */
- [0x1656, 0x1656], /* CANADIAN SYLLABICS CARRIER SHE */
- [0x1657, 0x1657], /* CANADIAN SYLLABICS CARRIER SHEE */
- [0x1658, 0x1658], /* CANADIAN SYLLABICS CARRIER SHI */
- [0x1659, 0x1659], /* CANADIAN SYLLABICS CARRIER SHA */
- [0x165a, 0x165a], /* CANADIAN SYLLABICS CARRIER SH */
- [0x165b, 0x165b], /* CANADIAN SYLLABICS CARRIER TSU */
- [0x165c, 0x165c], /* CANADIAN SYLLABICS CARRIER TSO */
- [0x165d, 0x165d], /* CANADIAN SYLLABICS CARRIER TSE */
- [0x165e, 0x165e], /* CANADIAN SYLLABICS CARRIER TSEE */
- [0x165f, 0x165f], /* CANADIAN SYLLABICS CARRIER TSI */
- [0x1660, 0x1660], /* CANADIAN SYLLABICS CARRIER TSA */
- [0x1661, 0x1661], /* CANADIAN SYLLABICS CARRIER CHU */
- [0x1662, 0x1662], /* CANADIAN SYLLABICS CARRIER CHO */
- [0x1663, 0x1663], /* CANADIAN SYLLABICS CARRIER CHE */
- [0x1664, 0x1664], /* CANADIAN SYLLABICS CARRIER CHEE */
- [0x1665, 0x1665], /* CANADIAN SYLLABICS CARRIER CHI */
- [0x1666, 0x1666], /* CANADIAN SYLLABICS CARRIER CHA */
- [0x1667, 0x1667], /* CANADIAN SYLLABICS CARRIER TTSU */
- [0x1668, 0x1668], /* CANADIAN SYLLABICS CARRIER TTSO */
- [0x1669, 0x1669], /* CANADIAN SYLLABICS CARRIER TTSE */
- [0x166a, 0x166a], /* CANADIAN SYLLABICS CARRIER TTSEE */
- [0x166b, 0x166b], /* CANADIAN SYLLABICS CARRIER TTSI */
- [0x166c, 0x166c], /* CANADIAN SYLLABICS CARRIER TTSA */
- [0x166d, 0x166d], /* CANADIAN SYLLABICS CHI SIGN */
- [0x166e, 0x166e], /* CANADIAN SYLLABICS FULL STOP */
- [0x166f, 0x166f], /* CANADIAN SYLLABICS QAI */
- [0x1670, 0x1670], /* CANADIAN SYLLABICS NGAI */
- [0x1671, 0x1671], /* CANADIAN SYLLABICS NNGI */
- [0x1672, 0x1672], /* CANADIAN SYLLABICS NNGII */
- [0x1673, 0x1673], /* CANADIAN SYLLABICS NNGO */
- [0x1674, 0x1674], /* CANADIAN SYLLABICS NNGOO */
- [0x1675, 0x1675], /* CANADIAN SYLLABICS NNGA */
- [0x1676, 0x1676], /* CANADIAN SYLLABICS NNGAA */
- [0x1677, 0x1677], /* CANADIAN SYLLABICS WOODS-CREE THWEE */
- [0x1678, 0x1678], /* CANADIAN SYLLABICS WOODS-CREE THWI */
- [0x1679, 0x1679], /* CANADIAN SYLLABICS WOODS-CREE THWII */
- [0x167a, 0x167a], /* CANADIAN SYLLABICS WOODS-CREE THWO */
- [0x167b, 0x167b], /* CANADIAN SYLLABICS WOODS-CREE THWOO */
- [0x167c, 0x167c], /* CANADIAN SYLLABICS WOODS-CREE THWA */
- [0x167d, 0x167d], /* CANADIAN SYLLABICS WOODS-CREE THWAA */
- [0x167e, 0x167e], /* CANADIAN SYLLABICS WOODS-CREE FINAL TH */
- [0x167f, 0x167f], /* CANADIAN SYLLABICS BLACKFOOT W */
- [0x1680, 0x1680], /* OGHAM SPACE MARK */
- [0x1681, 0x1681], /* OGHAM LETTER BEITH */
- [0x1682, 0x1682], /* OGHAM LETTER LUIS */
- [0x1683, 0x1683], /* OGHAM LETTER FEARN */
- [0x1684, 0x1684], /* OGHAM LETTER SAIL */
- [0x1685, 0x1685], /* OGHAM LETTER NION */
- [0x1686, 0x1686], /* OGHAM LETTER UATH */
- [0x1687, 0x1687], /* OGHAM LETTER DAIR */
- [0x1688, 0x1688], /* OGHAM LETTER TINNE */
- [0x1689, 0x1689], /* OGHAM LETTER COLL */
- [0x168a, 0x168a], /* OGHAM LETTER CEIRT */
- [0x168b, 0x168b], /* OGHAM LETTER MUIN */
- [0x168c, 0x168c], /* OGHAM LETTER GORT */
- [0x168d, 0x168d], /* OGHAM LETTER NGEADAL */
- [0x168e, 0x168e], /* OGHAM LETTER STRAIF */
- [0x168f, 0x168f], /* OGHAM LETTER RUIS */
- [0x1690, 0x1690], /* OGHAM LETTER AILM */
- [0x1691, 0x1691], /* OGHAM LETTER ONN */
- [0x1692, 0x1692], /* OGHAM LETTER UR */
- [0x1693, 0x1693], /* OGHAM LETTER EADHADH */
- [0x1694, 0x1694], /* OGHAM LETTER IODHADH */
- [0x1695, 0x1695], /* OGHAM LETTER EABHADH */
- [0x1696, 0x1696], /* OGHAM LETTER OR */
- [0x1697, 0x1697], /* OGHAM LETTER UILLEANN */
- [0x1698, 0x1698], /* OGHAM LETTER IFIN */
- [0x1699, 0x1699], /* OGHAM LETTER EAMHANCHOLL */
- [0x169a, 0x169a], /* OGHAM LETTER PEITH */
- [0x169b, 0x169b], /* OGHAM FEATHER MARK */
- [0x169c, 0x169c], /* OGHAM REVERSED FEATHER MARK */
- [0x169d, 0x169d],
- [0x169e, 0x169e],
- [0x169f, 0x169f],
- [0x16a0, 0x16a0], /* RUNIC LETTER FEHU FEOH FE F */
- [0x16a1, 0x16a1], /* RUNIC LETTER V */
- [0x16a2, 0x16a2], /* RUNIC LETTER URUZ UR U */
- [0x16a3, 0x16a3], /* RUNIC LETTER YR */
- [0x16a4, 0x16a4], /* RUNIC LETTER Y */
- [0x16a5, 0x16a5], /* RUNIC LETTER W */
- [0x16a6, 0x16a6], /* RUNIC LETTER THURISAZ THURS THORN */
- [0x16a7, 0x16a7], /* RUNIC LETTER ETH */
- [0x16a8, 0x16a8], /* RUNIC LETTER ANSUZ A */
- [0x16a9, 0x16a9], /* RUNIC LETTER OS O */
- [0x16aa, 0x16aa], /* RUNIC LETTER AC A */
- [0x16ab, 0x16ab], /* RUNIC LETTER AESC */
- [0x16ac, 0x16ac], /* RUNIC LETTER LONG-BRANCH-OSS O */
- [0x16ad, 0x16ad], /* RUNIC LETTER SHORT-TWIG-OSS O */
- [0x16ae, 0x16ae], /* RUNIC LETTER O */
- [0x16af, 0x16af], /* RUNIC LETTER OE */
- [0x16b0, 0x16b0], /* RUNIC LETTER ON */
- [0x16b1, 0x16b1], /* RUNIC LETTER RAIDO RAD REID R */
- [0x16b2, 0x16b2], /* RUNIC LETTER KAUNA */
- [0x16b3, 0x16b3], /* RUNIC LETTER CEN */
- [0x16b4, 0x16b4], /* RUNIC LETTER KAUN K */
- [0x16b5, 0x16b5], /* RUNIC LETTER G */
- [0x16b6, 0x16b6], /* RUNIC LETTER ENG */
- [0x16b7, 0x16b7], /* RUNIC LETTER GEBO GYFU G */
- [0x16b8, 0x16b8], /* RUNIC LETTER GAR */
- [0x16b9, 0x16b9], /* RUNIC LETTER WUNJO WYNN W */
- [0x16ba, 0x16ba], /* RUNIC LETTER HAGLAZ H */
- [0x16bb, 0x16bb], /* RUNIC LETTER HAEGL H */
- [0x16bc, 0x16bc], /* RUNIC LETTER LONG-BRANCH-HAGALL H */
- [0x16bd, 0x16bd], /* RUNIC LETTER SHORT-TWIG-HAGALL H */
- [0x16be, 0x16be], /* RUNIC LETTER NAUDIZ NYD NAUD N */
- [0x16bf, 0x16bf], /* RUNIC LETTER SHORT-TWIG-NAUD N */
- [0x16c0, 0x16c0], /* RUNIC LETTER DOTTED-N */
- [0x16c1, 0x16c1], /* RUNIC LETTER ISAZ IS ISS I */
- [0x16c2, 0x16c2], /* RUNIC LETTER E */
- [0x16c3, 0x16c3], /* RUNIC LETTER JERAN J */
- [0x16c4, 0x16c4], /* RUNIC LETTER GER */
- [0x16c5, 0x16c5], /* RUNIC LETTER LONG-BRANCH-AR AE */
- [0x16c6, 0x16c6], /* RUNIC LETTER SHORT-TWIG-AR A */
- [0x16c7, 0x16c7], /* RUNIC LETTER IWAZ EOH */
- [0x16c8, 0x16c8], /* RUNIC LETTER PERTHO PEORTH P */
- [0x16c9, 0x16c9], /* RUNIC LETTER ALGIZ EOLHX */
- [0x16ca, 0x16ca], /* RUNIC LETTER SOWILO S */
- [0x16cb, 0x16cb], /* RUNIC LETTER SIGEL LONG-BRANCH-SOL S */
- [0x16cc, 0x16cc], /* RUNIC LETTER SHORT-TWIG-SOL S */
- [0x16cd, 0x16cd], /* RUNIC LETTER C */
- [0x16ce, 0x16ce], /* RUNIC LETTER Z */
- [0x16cf, 0x16cf], /* RUNIC LETTER TIWAZ TIR TYR T */
- [0x16d0, 0x16d0], /* RUNIC LETTER SHORT-TWIG-TYR T */
- [0x16d1, 0x16d1], /* RUNIC LETTER D */
- [0x16d2, 0x16d2], /* RUNIC LETTER BERKANAN BEORC BJARKAN B */
- [0x16d3, 0x16d3], /* RUNIC LETTER SHORT-TWIG-BJARKAN B */
- [0x16d4, 0x16d4], /* RUNIC LETTER DOTTED-P */
- [0x16d5, 0x16d5], /* RUNIC LETTER OPEN-P */
- [0x16d6, 0x16d6], /* RUNIC LETTER EHWAZ EH E */
- [0x16d7, 0x16d7], /* RUNIC LETTER MANNAZ MAN M */
- [0x16d8, 0x16d8], /* RUNIC LETTER LONG-BRANCH-MADR M */
- [0x16d9, 0x16d9], /* RUNIC LETTER SHORT-TWIG-MADR M */
- [0x16da, 0x16da], /* RUNIC LETTER LAUKAZ LAGU LOGR L */
- [0x16db, 0x16db], /* RUNIC LETTER DOTTED-L */
- [0x16dc, 0x16dc], /* RUNIC LETTER INGWAZ */
- [0x16dd, 0x16dd], /* RUNIC LETTER ING */
- [0x16de, 0x16de], /* RUNIC LETTER DAGAZ DAEG D */
- [0x16df, 0x16df], /* RUNIC LETTER OTHALAN ETHEL O */
- [0x16e0, 0x16e0], /* RUNIC LETTER EAR */
- [0x16e1, 0x16e1], /* RUNIC LETTER IOR */
- [0x16e2, 0x16e2], /* RUNIC LETTER CWEORTH */
- [0x16e3, 0x16e3], /* RUNIC LETTER CALC */
- [0x16e4, 0x16e4], /* RUNIC LETTER CEALC */
- [0x16e5, 0x16e5], /* RUNIC LETTER STAN */
- [0x16e6, 0x16e6], /* RUNIC LETTER LONG-BRANCH-YR */
- [0x16e7, 0x16e7], /* RUNIC LETTER SHORT-TWIG-YR */
- [0x16e8, 0x16e8], /* RUNIC LETTER ICELANDIC-YR */
- [0x16e9, 0x16e9], /* RUNIC LETTER Q */
- [0x16ea, 0x16ea], /* RUNIC LETTER X */
- [0x16eb, 0x16eb], /* RUNIC SINGLE PUNCTUATION */
- [0x16ec, 0x16ec], /* RUNIC MULTIPLE PUNCTUATION */
- [0x16ed, 0x16ed], /* RUNIC CROSS PUNCTUATION */
- [0x16ee, 0x16ee], /* RUNIC ARLAUG SYMBOL */
- [0x16ef, 0x16ef], /* RUNIC TVIMADUR SYMBOL */
- [0x16f0, 0x16f0], /* RUNIC BELGTHOR SYMBOL */
- [0x16f1, 0x16f1], /* RUNIC LETTER K */
- [0x16f2, 0x16f2], /* RUNIC LETTER SH */
- [0x16f3, 0x16f3], /* RUNIC LETTER OO */
- [0x16f4, 0x16f4], /* RUNIC LETTER FRANKS CASKET OS */
- [0x16f5, 0x16f5], /* RUNIC LETTER FRANKS CASKET IS */
- [0x16f6, 0x16f6], /* RUNIC LETTER FRANKS CASKET EH */
- [0x16f7, 0x16f7], /* RUNIC LETTER FRANKS CASKET AC */
- [0x16f8, 0x16f8], /* RUNIC LETTER FRANKS CASKET AESC */
- [0x16f9, 0x16f9],
- [0x16fa, 0x16fa],
- [0x16fb, 0x16fb],
- [0x16fc, 0x16fc],
- [0x16fd, 0x16fd],
- [0x16fe, 0x16fe],
- [0x16ff, 0x16ff],
- [0x1700, 0x1700], /* TAGALOG LETTER A */
- [0x1701, 0x1701], /* TAGALOG LETTER I */
- [0x1702, 0x1702], /* TAGALOG LETTER U */
- [0x1703, 0x1703], /* TAGALOG LETTER KA */
- [0x1704, 0x1704], /* TAGALOG LETTER GA */
- [0x1705, 0x1705], /* TAGALOG LETTER NGA */
- [0x1706, 0x1706], /* TAGALOG LETTER TA */
- [0x1707, 0x1707], /* TAGALOG LETTER DA */
- [0x1708, 0x1708], /* TAGALOG LETTER NA */
- [0x1709, 0x1709], /* TAGALOG LETTER PA */
- [0x170a, 0x170a], /* TAGALOG LETTER BA */
- [0x170b, 0x170b], /* TAGALOG LETTER MA */
- [0x170c, 0x170c], /* TAGALOG LETTER YA */
- [0x170d, 0x170d],
- [0x170e, 0x170e], /* TAGALOG LETTER LA */
- [0x170f, 0x170f], /* TAGALOG LETTER WA */
- [0x1710, 0x1710], /* TAGALOG LETTER SA */
- [0x1711, 0x1711], /* TAGALOG LETTER HA */
- [0x1712, 0x1712], /* TAGALOG VOWEL SIGN I */
- [0x1713, 0x1713], /* TAGALOG VOWEL SIGN U */
- [0x1714, 0x1714], /* TAGALOG SIGN VIRAMA */
- [0x1715, 0x1715],
- [0x1716, 0x1716],
- [0x1717, 0x1717],
- [0x1718, 0x1718],
- [0x1719, 0x1719],
- [0x171a, 0x171a],
- [0x171b, 0x171b],
- [0x171c, 0x171c],
- [0x171d, 0x171d],
- [0x171e, 0x171e],
- [0x171f, 0x171f],
- [0x1720, 0x1720], /* HANUNOO LETTER A */
- [0x1721, 0x1721], /* HANUNOO LETTER I */
- [0x1722, 0x1722], /* HANUNOO LETTER U */
- [0x1723, 0x1723], /* HANUNOO LETTER KA */
- [0x1724, 0x1724], /* HANUNOO LETTER GA */
- [0x1725, 0x1725], /* HANUNOO LETTER NGA */
- [0x1726, 0x1726], /* HANUNOO LETTER TA */
- [0x1727, 0x1727], /* HANUNOO LETTER DA */
- [0x1728, 0x1728], /* HANUNOO LETTER NA */
- [0x1729, 0x1729], /* HANUNOO LETTER PA */
- [0x172a, 0x172a], /* HANUNOO LETTER BA */
- [0x172b, 0x172b], /* HANUNOO LETTER MA */
- [0x172c, 0x172c], /* HANUNOO LETTER YA */
- [0x172d, 0x172d], /* HANUNOO LETTER RA */
- [0x172e, 0x172e], /* HANUNOO LETTER LA */
- [0x172f, 0x172f], /* HANUNOO LETTER WA */
- [0x1730, 0x1730], /* HANUNOO LETTER SA */
- [0x1731, 0x1731], /* HANUNOO LETTER HA */
- [0x1732, 0x1732], /* HANUNOO VOWEL SIGN I */
- [0x1733, 0x1733], /* HANUNOO VOWEL SIGN U */
- [0x1734, 0x1734], /* HANUNOO SIGN PAMUDPOD */
- [0x1735, 0x1735], /* PHILIPPINE SINGLE PUNCTUATION */
- [0x1736, 0x1736], /* PHILIPPINE DOUBLE PUNCTUATION */
- [0x1737, 0x1737],
- [0x1738, 0x1738],
- [0x1739, 0x1739],
- [0x173a, 0x173a],
- [0x173b, 0x173b],
- [0x173c, 0x173c],
- [0x173d, 0x173d],
- [0x173e, 0x173e],
- [0x173f, 0x173f],
- [0x1740, 0x1740], /* BUHID LETTER A */
- [0x1741, 0x1741], /* BUHID LETTER I */
- [0x1742, 0x1742], /* BUHID LETTER U */
- [0x1743, 0x1743], /* BUHID LETTER KA */
- [0x1744, 0x1744], /* BUHID LETTER GA */
- [0x1745, 0x1745], /* BUHID LETTER NGA */
- [0x1746, 0x1746], /* BUHID LETTER TA */
- [0x1747, 0x1747], /* BUHID LETTER DA */
- [0x1748, 0x1748], /* BUHID LETTER NA */
- [0x1749, 0x1749], /* BUHID LETTER PA */
- [0x174a, 0x174a], /* BUHID LETTER BA */
- [0x174b, 0x174b], /* BUHID LETTER MA */
- [0x174c, 0x174c], /* BUHID LETTER YA */
- [0x174d, 0x174d], /* BUHID LETTER RA */
- [0x174e, 0x174e], /* BUHID LETTER LA */
- [0x174f, 0x174f], /* BUHID LETTER WA */
- [0x1750, 0x1750], /* BUHID LETTER SA */
- [0x1751, 0x1751], /* BUHID LETTER HA */
- [0x1752, 0x1752], /* BUHID VOWEL SIGN I */
- [0x1753, 0x1753], /* BUHID VOWEL SIGN U */
- [0x1754, 0x1754],
- [0x1755, 0x1755],
- [0x1756, 0x1756],
- [0x1757, 0x1757],
- [0x1758, 0x1758],
- [0x1759, 0x1759],
- [0x175a, 0x175a],
- [0x175b, 0x175b],
- [0x175c, 0x175c],
- [0x175d, 0x175d],
- [0x175e, 0x175e],
- [0x175f, 0x175f],
- [0x1760, 0x1760], /* TAGBANWA LETTER A */
- [0x1761, 0x1761], /* TAGBANWA LETTER I */
- [0x1762, 0x1762], /* TAGBANWA LETTER U */
- [0x1763, 0x1763], /* TAGBANWA LETTER KA */
- [0x1764, 0x1764], /* TAGBANWA LETTER GA */
- [0x1765, 0x1765], /* TAGBANWA LETTER NGA */
- [0x1766, 0x1766], /* TAGBANWA LETTER TA */
- [0x1767, 0x1767], /* TAGBANWA LETTER DA */
- [0x1768, 0x1768], /* TAGBANWA LETTER NA */
- [0x1769, 0x1769], /* TAGBANWA LETTER PA */
- [0x176a, 0x176a], /* TAGBANWA LETTER BA */
- [0x176b, 0x176b], /* TAGBANWA LETTER MA */
- [0x176c, 0x176c], /* TAGBANWA LETTER YA */
- [0x176d, 0x176d],
- [0x176e, 0x176e], /* TAGBANWA LETTER LA */
- [0x176f, 0x176f], /* TAGBANWA LETTER WA */
- [0x1770, 0x1770], /* TAGBANWA LETTER SA */
- [0x1771, 0x1771],
- [0x1772, 0x1772], /* TAGBANWA VOWEL SIGN I */
- [0x1773, 0x1773], /* TAGBANWA VOWEL SIGN U */
- [0x1774, 0x1774],
- [0x1775, 0x1775],
- [0x1776, 0x1776],
- [0x1777, 0x1777],
- [0x1778, 0x1778],
- [0x1779, 0x1779],
- [0x177a, 0x177a],
- [0x177b, 0x177b],
- [0x177c, 0x177c],
- [0x177d, 0x177d],
- [0x177e, 0x177e],
- [0x177f, 0x177f],
- [0x1780, 0x1780], /* KHMER LETTER KA */
- [0x1781, 0x1781], /* KHMER LETTER KHA */
- [0x1782, 0x1782], /* KHMER LETTER KO */
- [0x1783, 0x1783], /* KHMER LETTER KHO */
- [0x1784, 0x1784], /* KHMER LETTER NGO */
- [0x1785, 0x1785], /* KHMER LETTER CA */
- [0x1786, 0x1786], /* KHMER LETTER CHA */
- [0x1787, 0x1787], /* KHMER LETTER CO */
- [0x1788, 0x1788], /* KHMER LETTER CHO */
- [0x1789, 0x1789], /* KHMER LETTER NYO */
- [0x178a, 0x178a], /* KHMER LETTER DA */
- [0x178b, 0x178b], /* KHMER LETTER TTHA */
- [0x178c, 0x178c], /* KHMER LETTER DO */
- [0x178d, 0x178d], /* KHMER LETTER TTHO */
- [0x178e, 0x178e], /* KHMER LETTER NNO */
- [0x178f, 0x178f], /* KHMER LETTER TA */
- [0x1790, 0x1790], /* KHMER LETTER THA */
- [0x1791, 0x1791], /* KHMER LETTER TO */
- [0x1792, 0x1792], /* KHMER LETTER THO */
- [0x1793, 0x1793], /* KHMER LETTER NO */
- [0x1794, 0x1794], /* KHMER LETTER BA */
- [0x1795, 0x1795], /* KHMER LETTER PHA */
- [0x1796, 0x1796], /* KHMER LETTER PO */
- [0x1797, 0x1797], /* KHMER LETTER PHO */
- [0x1798, 0x1798], /* KHMER LETTER MO */
- [0x1799, 0x1799], /* KHMER LETTER YO */
- [0x179a, 0x179a], /* KHMER LETTER RO */
- [0x179b, 0x179b], /* KHMER LETTER LO */
- [0x179c, 0x179c], /* KHMER LETTER VO */
- [0x179d, 0x179d], /* KHMER LETTER SHA */
- [0x179e, 0x179e], /* KHMER LETTER SSO */
- [0x179f, 0x179f], /* KHMER LETTER SA */
- [0x17a0, 0x17a0], /* KHMER LETTER HA */
- [0x17a1, 0x17a1], /* KHMER LETTER LA */
- [0x17a2, 0x17a2], /* KHMER LETTER QA */
- [0x17a3, 0x17a3], /* KHMER INDEPENDENT VOWEL QAQ */
- [0x17a4, 0x17a4], /* KHMER INDEPENDENT VOWEL QAA */
- [0x17a5, 0x17a5], /* KHMER INDEPENDENT VOWEL QI */
- [0x17a6, 0x17a6], /* KHMER INDEPENDENT VOWEL QII */
- [0x17a7, 0x17a7], /* KHMER INDEPENDENT VOWEL QU */
- [0x17a8, 0x17a8], /* KHMER INDEPENDENT VOWEL QUK */
- [0x17a9, 0x17a9], /* KHMER INDEPENDENT VOWEL QUU */
- [0x17aa, 0x17aa], /* KHMER INDEPENDENT VOWEL QUUV */
- [0x17ab, 0x17ab], /* KHMER INDEPENDENT VOWEL RY */
- [0x17ac, 0x17ac], /* KHMER INDEPENDENT VOWEL RYY */
- [0x17ad, 0x17ad], /* KHMER INDEPENDENT VOWEL LY */
- [0x17ae, 0x17ae], /* KHMER INDEPENDENT VOWEL LYY */
- [0x17af, 0x17af], /* KHMER INDEPENDENT VOWEL QE */
- [0x17b0, 0x17b0], /* KHMER INDEPENDENT VOWEL QAI */
- [0x17b1, 0x17b1], /* KHMER INDEPENDENT VOWEL QOO TYPE ONE */
- [0x17b2, 0x17b2], /* KHMER INDEPENDENT VOWEL QOO TYPE TWO */
- [0x17b3, 0x17b3], /* KHMER INDEPENDENT VOWEL QAU */
- [0x17b4, 0x17b4], /* KHMER VOWEL INHERENT AQ */
- [0x17b5, 0x17b5], /* KHMER VOWEL INHERENT AA */
- [0x17b6, 0x17b6], /* KHMER VOWEL SIGN AA */
- [0x17b7, 0x17b7], /* KHMER VOWEL SIGN I */
- [0x17b8, 0x17b8], /* KHMER VOWEL SIGN II */
- [0x17b9, 0x17b9], /* KHMER VOWEL SIGN Y */
- [0x17ba, 0x17ba], /* KHMER VOWEL SIGN YY */
- [0x17bb, 0x17bb], /* KHMER VOWEL SIGN U */
- [0x17bc, 0x17bc], /* KHMER VOWEL SIGN UU */
- [0x17bd, 0x17bd], /* KHMER VOWEL SIGN UA */
- [0x17be, 0x17be], /* KHMER VOWEL SIGN OE */
- [0x17bf, 0x17bf], /* KHMER VOWEL SIGN YA */
- [0x17c0, 0x17c0], /* KHMER VOWEL SIGN IE */
- [0x17c1, 0x17c1], /* KHMER VOWEL SIGN E */
- [0x17c2, 0x17c2], /* KHMER VOWEL SIGN AE */
- [0x17c3, 0x17c3], /* KHMER VOWEL SIGN AI */
- [0x17c4, 0x17c4], /* KHMER VOWEL SIGN OO */
- [0x17c5, 0x17c5], /* KHMER VOWEL SIGN AU */
- [0x17c6, 0x17c6], /* KHMER SIGN NIKAHIT */
- [0x17c7, 0x17c7], /* KHMER SIGN REAHMUK */
- [0x17c8, 0x17c8], /* KHMER SIGN YUUKALEAPINTU */
- [0x17c9, 0x17c9], /* KHMER SIGN MUUSIKATOAN */
- [0x17ca, 0x17ca], /* KHMER SIGN TRIISAP */
- [0x17cb, 0x17cb], /* KHMER SIGN BANTOC */
- [0x17cc, 0x17cc], /* KHMER SIGN ROBAT */
- [0x17cd, 0x17cd], /* KHMER SIGN TOANDAKHIAT */
- [0x17ce, 0x17ce], /* KHMER SIGN KAKABAT */
- [0x17cf, 0x17cf], /* KHMER SIGN AHSDA */
- [0x17d0, 0x17d0], /* KHMER SIGN SAMYOK SANNYA */
- [0x17d1, 0x17d1], /* KHMER SIGN VIRIAM */
- [0x17d2, 0x17d2], /* KHMER SIGN COENG */
- [0x17d3, 0x17d3], /* KHMER SIGN BATHAMASAT */
- [0x17d4, 0x17d4], /* KHMER SIGN KHAN */
- [0x17d5, 0x17d5], /* KHMER SIGN BARIYOOSAN */
- [0x17d6, 0x17d6], /* KHMER SIGN CAMNUC PII KUUH */
- [0x17d7, 0x17d7], /* KHMER SIGN LEK TOO */
- [0x17d8, 0x17d8], /* KHMER SIGN BEYYAL */
- [0x17d9, 0x17d9], /* KHMER SIGN PHNAEK MUAN */
- [0x17da, 0x17da], /* KHMER SIGN KOOMUUT */
- [0x17db, 0x17db], /* KHMER CURRENCY SYMBOL RIEL */
- [0x17dc, 0x17dc], /* KHMER SIGN AVAKRAHASANYA */
- [0x17dd, 0x17dd], /* KHMER SIGN ATTHACAN */
- [0x17de, 0x17de],
- [0x17df, 0x17df],
- [0x17e0, 0x17e0], /* KHMER DIGIT ZERO */
- [0x17e1, 0x17e1], /* KHMER DIGIT ONE */
- [0x17e2, 0x17e2], /* KHMER DIGIT TWO */
- [0x17e3, 0x17e3], /* KHMER DIGIT THREE */
- [0x17e4, 0x17e4], /* KHMER DIGIT FOUR */
- [0x17e5, 0x17e5], /* KHMER DIGIT FIVE */
- [0x17e6, 0x17e6], /* KHMER DIGIT SIX */
- [0x17e7, 0x17e7], /* KHMER DIGIT SEVEN */
- [0x17e8, 0x17e8], /* KHMER DIGIT EIGHT */
- [0x17e9, 0x17e9], /* KHMER DIGIT NINE */
- [0x17ea, 0x17ea],
- [0x17eb, 0x17eb],
- [0x17ec, 0x17ec],
- [0x17ed, 0x17ed],
- [0x17ee, 0x17ee],
- [0x17ef, 0x17ef],
- [0x17f0, 0x17f0], /* KHMER SYMBOL LEK ATTAK SON */
- [0x17f1, 0x17f1], /* KHMER SYMBOL LEK ATTAK MUOY */
- [0x17f2, 0x17f2], /* KHMER SYMBOL LEK ATTAK PII */
- [0x17f3, 0x17f3], /* KHMER SYMBOL LEK ATTAK BEI */
- [0x17f4, 0x17f4], /* KHMER SYMBOL LEK ATTAK BUON */
- [0x17f5, 0x17f5], /* KHMER SYMBOL LEK ATTAK PRAM */
- [0x17f6, 0x17f6], /* KHMER SYMBOL LEK ATTAK PRAM-MUOY */
- [0x17f7, 0x17f7], /* KHMER SYMBOL LEK ATTAK PRAM-PII */
- [0x17f8, 0x17f8], /* KHMER SYMBOL LEK ATTAK PRAM-BEI */
- [0x17f9, 0x17f9], /* KHMER SYMBOL LEK ATTAK PRAM-BUON */
- [0x17fa, 0x17fa],
- [0x17fb, 0x17fb],
- [0x17fc, 0x17fc],
- [0x17fd, 0x17fd],
- [0x17fe, 0x17fe],
- [0x17ff, 0x17ff],
- [0x1800, 0x1800], /* MONGOLIAN BIRGA */
- [0x1801, 0x1801], /* MONGOLIAN ELLIPSIS */
- [0x1802, 0x1802], /* MONGOLIAN COMMA */
- [0x1803, 0x1803], /* MONGOLIAN FULL STOP */
- [0x1804, 0x1804], /* MONGOLIAN COLON */
- [0x1805, 0x1805], /* MONGOLIAN FOUR DOTS */
- [0x1806, 0x1806], /* MONGOLIAN TODO SOFT HYPHEN */
- [0x1807, 0x1807], /* MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER */
- [0x1808, 0x1808], /* MONGOLIAN MANCHU COMMA */
- [0x1809, 0x1809], /* MONGOLIAN MANCHU FULL STOP */
- [0x180a, 0x180a], /* MONGOLIAN NIRUGU */
- [0x180b, 0x180b], /* MONGOLIAN FREE VARIATION SELECTOR ONE */
- [0x180c, 0x180c], /* MONGOLIAN FREE VARIATION SELECTOR TWO */
- [0x180d, 0x180d], /* MONGOLIAN FREE VARIATION SELECTOR THREE */
- [0x180e, 0x180e], /* MONGOLIAN VOWEL SEPARATOR */
- [0x180f, 0x180f],
- [0x1810, 0x1810], /* MONGOLIAN DIGIT ZERO */
- [0x1811, 0x1811], /* MONGOLIAN DIGIT ONE */
- [0x1812, 0x1812], /* MONGOLIAN DIGIT TWO */
- [0x1813, 0x1813], /* MONGOLIAN DIGIT THREE */
- [0x1814, 0x1814], /* MONGOLIAN DIGIT FOUR */
- [0x1815, 0x1815], /* MONGOLIAN DIGIT FIVE */
- [0x1816, 0x1816], /* MONGOLIAN DIGIT SIX */
- [0x1817, 0x1817], /* MONGOLIAN DIGIT SEVEN */
- [0x1818, 0x1818], /* MONGOLIAN DIGIT EIGHT */
- [0x1819, 0x1819], /* MONGOLIAN DIGIT NINE */
- [0x181a, 0x181a],
- [0x181b, 0x181b],
- [0x181c, 0x181c],
- [0x181d, 0x181d],
- [0x181e, 0x181e],
- [0x181f, 0x181f],
- [0x1820, 0x1820], /* MONGOLIAN LETTER A */
- [0x1821, 0x1821], /* MONGOLIAN LETTER E */
- [0x1822, 0x1822], /* MONGOLIAN LETTER I */
- [0x1823, 0x1823], /* MONGOLIAN LETTER O */
- [0x1824, 0x1824], /* MONGOLIAN LETTER U */
- [0x1825, 0x1825], /* MONGOLIAN LETTER OE */
- [0x1826, 0x1826], /* MONGOLIAN LETTER UE */
- [0x1827, 0x1827], /* MONGOLIAN LETTER EE */
- [0x1828, 0x1828], /* MONGOLIAN LETTER NA */
- [0x1829, 0x1829], /* MONGOLIAN LETTER ANG */
- [0x182a, 0x182a], /* MONGOLIAN LETTER BA */
- [0x182b, 0x182b], /* MONGOLIAN LETTER PA */
- [0x182c, 0x182c], /* MONGOLIAN LETTER QA */
- [0x182d, 0x182d], /* MONGOLIAN LETTER GA */
- [0x182e, 0x182e], /* MONGOLIAN LETTER MA */
- [0x182f, 0x182f], /* MONGOLIAN LETTER LA */
- [0x1830, 0x1830], /* MONGOLIAN LETTER SA */
- [0x1831, 0x1831], /* MONGOLIAN LETTER SHA */
- [0x1832, 0x1832], /* MONGOLIAN LETTER TA */
- [0x1833, 0x1833], /* MONGOLIAN LETTER DA */
- [0x1834, 0x1834], /* MONGOLIAN LETTER CHA */
- [0x1835, 0x1835], /* MONGOLIAN LETTER JA */
- [0x1836, 0x1836], /* MONGOLIAN LETTER YA */
- [0x1837, 0x1837], /* MONGOLIAN LETTER RA */
- [0x1838, 0x1838], /* MONGOLIAN LETTER WA */
- [0x1839, 0x1839], /* MONGOLIAN LETTER FA */
- [0x183a, 0x183a], /* MONGOLIAN LETTER KA */
- [0x183b, 0x183b], /* MONGOLIAN LETTER KHA */
- [0x183c, 0x183c], /* MONGOLIAN LETTER TSA */
- [0x183d, 0x183d], /* MONGOLIAN LETTER ZA */
- [0x183e, 0x183e], /* MONGOLIAN LETTER HAA */
- [0x183f, 0x183f], /* MONGOLIAN LETTER ZRA */
- [0x1840, 0x1840], /* MONGOLIAN LETTER LHA */
- [0x1841, 0x1841], /* MONGOLIAN LETTER ZHI */
- [0x1842, 0x1842], /* MONGOLIAN LETTER CHI */
- [0x1843, 0x1843], /* MONGOLIAN LETTER TODO LONG VOWEL SIGN */
- [0x1844, 0x1844], /* MONGOLIAN LETTER TODO E */
- [0x1845, 0x1845], /* MONGOLIAN LETTER TODO I */
- [0x1846, 0x1846], /* MONGOLIAN LETTER TODO O */
- [0x1847, 0x1847], /* MONGOLIAN LETTER TODO U */
- [0x1848, 0x1848], /* MONGOLIAN LETTER TODO OE */
- [0x1849, 0x1849], /* MONGOLIAN LETTER TODO UE */
- [0x184a, 0x184a], /* MONGOLIAN LETTER TODO ANG */
- [0x184b, 0x184b], /* MONGOLIAN LETTER TODO BA */
- [0x184c, 0x184c], /* MONGOLIAN LETTER TODO PA */
- [0x184d, 0x184d], /* MONGOLIAN LETTER TODO QA */
- [0x184e, 0x184e], /* MONGOLIAN LETTER TODO GA */
- [0x184f, 0x184f], /* MONGOLIAN LETTER TODO MA */
- [0x1850, 0x1850], /* MONGOLIAN LETTER TODO TA */
- [0x1851, 0x1851], /* MONGOLIAN LETTER TODO DA */
- [0x1852, 0x1852], /* MONGOLIAN LETTER TODO CHA */
- [0x1853, 0x1853], /* MONGOLIAN LETTER TODO JA */
- [0x1854, 0x1854], /* MONGOLIAN LETTER TODO TSA */
- [0x1855, 0x1855], /* MONGOLIAN LETTER TODO YA */
- [0x1856, 0x1856], /* MONGOLIAN LETTER TODO WA */
- [0x1857, 0x1857], /* MONGOLIAN LETTER TODO KA */
- [0x1858, 0x1858], /* MONGOLIAN LETTER TODO GAA */
- [0x1859, 0x1859], /* MONGOLIAN LETTER TODO HAA */
- [0x185a, 0x185a], /* MONGOLIAN LETTER TODO JIA */
- [0x185b, 0x185b], /* MONGOLIAN LETTER TODO NIA */
- [0x185c, 0x185c], /* MONGOLIAN LETTER TODO DZA */
- [0x185d, 0x185d], /* MONGOLIAN LETTER SIBE E */
- [0x185e, 0x185e], /* MONGOLIAN LETTER SIBE I */
- [0x185f, 0x185f], /* MONGOLIAN LETTER SIBE IY */
- [0x1860, 0x1860], /* MONGOLIAN LETTER SIBE UE */
- [0x1861, 0x1861], /* MONGOLIAN LETTER SIBE U */
- [0x1862, 0x1862], /* MONGOLIAN LETTER SIBE ANG */
- [0x1863, 0x1863], /* MONGOLIAN LETTER SIBE KA */
- [0x1864, 0x1864], /* MONGOLIAN LETTER SIBE GA */
- [0x1865, 0x1865], /* MONGOLIAN LETTER SIBE HA */
- [0x1866, 0x1866], /* MONGOLIAN LETTER SIBE PA */
- [0x1867, 0x1867], /* MONGOLIAN LETTER SIBE SHA */
- [0x1868, 0x1868], /* MONGOLIAN LETTER SIBE TA */
- [0x1869, 0x1869], /* MONGOLIAN LETTER SIBE DA */
- [0x186a, 0x186a], /* MONGOLIAN LETTER SIBE JA */
- [0x186b, 0x186b], /* MONGOLIAN LETTER SIBE FA */
- [0x186c, 0x186c], /* MONGOLIAN LETTER SIBE GAA */
- [0x186d, 0x186d], /* MONGOLIAN LETTER SIBE HAA */
- [0x186e, 0x186e], /* MONGOLIAN LETTER SIBE TSA */
- [0x186f, 0x186f], /* MONGOLIAN LETTER SIBE ZA */
- [0x1870, 0x1870], /* MONGOLIAN LETTER SIBE RAA */
- [0x1871, 0x1871], /* MONGOLIAN LETTER SIBE CHA */
- [0x1872, 0x1872], /* MONGOLIAN LETTER SIBE ZHA */
- [0x1873, 0x1873], /* MONGOLIAN LETTER MANCHU I */
- [0x1874, 0x1874], /* MONGOLIAN LETTER MANCHU KA */
- [0x1875, 0x1875], /* MONGOLIAN LETTER MANCHU RA */
- [0x1876, 0x1876], /* MONGOLIAN LETTER MANCHU FA */
- [0x1877, 0x1877], /* MONGOLIAN LETTER MANCHU ZHA */
- [0x1878, 0x1878], /* MONGOLIAN LETTER CHA WITH TWO DOTS */
- [0x1879, 0x1879],
- [0x187a, 0x187a],
- [0x187b, 0x187b],
- [0x187c, 0x187c],
- [0x187d, 0x187d],
- [0x187e, 0x187e],
- [0x187f, 0x187f],
- [0x1880, 0x1880], /* MONGOLIAN LETTER ALI GALI ANUSVARA ONE */
- [0x1881, 0x1881], /* MONGOLIAN LETTER ALI GALI VISARGA ONE */
- [0x1882, 0x1882], /* MONGOLIAN LETTER ALI GALI DAMARU */
- [0x1883, 0x1883], /* MONGOLIAN LETTER ALI GALI UBADAMA */
- [0x1884, 0x1884], /* MONGOLIAN LETTER ALI GALI INVERTED UBADAMA */
- [0x1885, 0x1885], /* MONGOLIAN LETTER ALI GALI BALUDA */
- [0x1886, 0x1886], /* MONGOLIAN LETTER ALI GALI THREE BALUDA */
- [0x1887, 0x1887], /* MONGOLIAN LETTER ALI GALI A */
- [0x1888, 0x1888], /* MONGOLIAN LETTER ALI GALI I */
- [0x1889, 0x1889], /* MONGOLIAN LETTER ALI GALI KA */
- [0x188a, 0x188a], /* MONGOLIAN LETTER ALI GALI NGA */
- [0x188b, 0x188b], /* MONGOLIAN LETTER ALI GALI CA */
- [0x188c, 0x188c], /* MONGOLIAN LETTER ALI GALI TTA */
- [0x188d, 0x188d], /* MONGOLIAN LETTER ALI GALI TTHA */
- [0x188e, 0x188e], /* MONGOLIAN LETTER ALI GALI DDA */
- [0x188f, 0x188f], /* MONGOLIAN LETTER ALI GALI NNA */
- [0x1890, 0x1890], /* MONGOLIAN LETTER ALI GALI TA */
- [0x1891, 0x1891], /* MONGOLIAN LETTER ALI GALI DA */
- [0x1892, 0x1892], /* MONGOLIAN LETTER ALI GALI PA */
- [0x1893, 0x1893], /* MONGOLIAN LETTER ALI GALI PHA */
- [0x1894, 0x1894], /* MONGOLIAN LETTER ALI GALI SSA */
- [0x1895, 0x1895], /* MONGOLIAN LETTER ALI GALI ZHA */
- [0x1896, 0x1896], /* MONGOLIAN LETTER ALI GALI ZA */
- [0x1897, 0x1897], /* MONGOLIAN LETTER ALI GALI AH */
- [0x1898, 0x1898], /* MONGOLIAN LETTER TODO ALI GALI TA */
- [0x1899, 0x1899], /* MONGOLIAN LETTER TODO ALI GALI ZHA */
- [0x189a, 0x189a], /* MONGOLIAN LETTER MANCHU ALI GALI GHA */
- [0x189b, 0x189b], /* MONGOLIAN LETTER MANCHU ALI GALI NGA */
- [0x189c, 0x189c], /* MONGOLIAN LETTER MANCHU ALI GALI CA */
- [0x189d, 0x189d], /* MONGOLIAN LETTER MANCHU ALI GALI JHA */
- [0x189e, 0x189e], /* MONGOLIAN LETTER MANCHU ALI GALI TTA */
- [0x189f, 0x189f], /* MONGOLIAN LETTER MANCHU ALI GALI DDHA */
- [0x18a0, 0x18a0], /* MONGOLIAN LETTER MANCHU ALI GALI TA */
- [0x18a1, 0x18a1], /* MONGOLIAN LETTER MANCHU ALI GALI DHA */
- [0x18a2, 0x18a2], /* MONGOLIAN LETTER MANCHU ALI GALI SSA */
- [0x18a3, 0x18a3], /* MONGOLIAN LETTER MANCHU ALI GALI CYA */
- [0x18a4, 0x18a4], /* MONGOLIAN LETTER MANCHU ALI GALI ZHA */
- [0x18a5, 0x18a5], /* MONGOLIAN LETTER MANCHU ALI GALI ZA */
- [0x18a6, 0x18a6], /* MONGOLIAN LETTER ALI GALI HALF U */
- [0x18a7, 0x18a7], /* MONGOLIAN LETTER ALI GALI HALF YA */
- [0x18a8, 0x18a8], /* MONGOLIAN LETTER MANCHU ALI GALI BHA */
- [0x18a9, 0x18a9], /* MONGOLIAN LETTER ALI GALI DAGALGA */
- [0x18aa, 0x18aa], /* MONGOLIAN LETTER MANCHU ALI GALI LHA */
- [0x18ab, 0x18ab],
- [0x18ac, 0x18ac],
- [0x18ad, 0x18ad],
- [0x18ae, 0x18ae],
- [0x18af, 0x18af],
- [0x18b0, 0x18b0], /* CANADIAN SYLLABICS OY */
- [0x18b1, 0x18b1], /* CANADIAN SYLLABICS AY */
- [0x18b2, 0x18b2], /* CANADIAN SYLLABICS AAY */
- [0x18b3, 0x18b3], /* CANADIAN SYLLABICS WAY */
- [0x18b4, 0x18b4], /* CANADIAN SYLLABICS POY */
- [0x18b5, 0x18b5], /* CANADIAN SYLLABICS PAY */
- [0x18b6, 0x18b6], /* CANADIAN SYLLABICS PWOY */
- [0x18b7, 0x18b7], /* CANADIAN SYLLABICS TAY */
- [0x18b8, 0x18b8], /* CANADIAN SYLLABICS KAY */
- [0x18b9, 0x18b9], /* CANADIAN SYLLABICS KWAY */
- [0x18ba, 0x18ba], /* CANADIAN SYLLABICS MAY */
- [0x18bb, 0x18bb], /* CANADIAN SYLLABICS NOY */
- [0x18bc, 0x18bc], /* CANADIAN SYLLABICS NAY */
- [0x18bd, 0x18bd], /* CANADIAN SYLLABICS LAY */
- [0x18be, 0x18be], /* CANADIAN SYLLABICS SOY */
- [0x18bf, 0x18bf], /* CANADIAN SYLLABICS SAY */
- [0x18c0, 0x18c0], /* CANADIAN SYLLABICS SHOY */
- [0x18c1, 0x18c1], /* CANADIAN SYLLABICS SHAY */
- [0x18c2, 0x18c2], /* CANADIAN SYLLABICS SHWOY */
- [0x18c3, 0x18c3], /* CANADIAN SYLLABICS YOY */
- [0x18c4, 0x18c4], /* CANADIAN SYLLABICS YAY */
- [0x18c5, 0x18c5], /* CANADIAN SYLLABICS RAY */
- [0x18c6, 0x18c6], /* CANADIAN SYLLABICS NWI */
- [0x18c7, 0x18c7], /* CANADIAN SYLLABICS OJIBWAY NWI */
- [0x18c8, 0x18c8], /* CANADIAN SYLLABICS NWII */
- [0x18c9, 0x18c9], /* CANADIAN SYLLABICS OJIBWAY NWII */
- [0x18ca, 0x18ca], /* CANADIAN SYLLABICS NWO */
- [0x18cb, 0x18cb], /* CANADIAN SYLLABICS OJIBWAY NWO */
- [0x18cc, 0x18cc], /* CANADIAN SYLLABICS NWOO */
- [0x18cd, 0x18cd], /* CANADIAN SYLLABICS OJIBWAY NWOO */
- [0x18ce, 0x18ce], /* CANADIAN SYLLABICS RWEE */
- [0x18cf, 0x18cf], /* CANADIAN SYLLABICS RWI */
- [0x18d0, 0x18d0], /* CANADIAN SYLLABICS RWII */
- [0x18d1, 0x18d1], /* CANADIAN SYLLABICS RWO */
- [0x18d2, 0x18d2], /* CANADIAN SYLLABICS RWOO */
- [0x18d3, 0x18d3], /* CANADIAN SYLLABICS RWA */
- [0x18d4, 0x18d4], /* CANADIAN SYLLABICS OJIBWAY P */
- [0x18d5, 0x18d5], /* CANADIAN SYLLABICS OJIBWAY T */
- [0x18d6, 0x18d6], /* CANADIAN SYLLABICS OJIBWAY K */
- [0x18d7, 0x18d7], /* CANADIAN SYLLABICS OJIBWAY C */
- [0x18d8, 0x18d8], /* CANADIAN SYLLABICS OJIBWAY M */
- [0x18d9, 0x18d9], /* CANADIAN SYLLABICS OJIBWAY N */
- [0x18da, 0x18da], /* CANADIAN SYLLABICS OJIBWAY S */
- [0x18db, 0x18db], /* CANADIAN SYLLABICS OJIBWAY SH */
- [0x18dc, 0x18dc], /* CANADIAN SYLLABICS EASTERN W */
- [0x18dd, 0x18dd], /* CANADIAN SYLLABICS WESTERN W */
- [0x18de, 0x18de], /* CANADIAN SYLLABICS FINAL SMALL RING */
- [0x18df, 0x18df], /* CANADIAN SYLLABICS FINAL RAISED DOT */
- [0x18e0, 0x18e0], /* CANADIAN SYLLABICS R-CREE RWE */
- [0x18e1, 0x18e1], /* CANADIAN SYLLABICS WEST-CREE LOO */
- [0x18e2, 0x18e2], /* CANADIAN SYLLABICS WEST-CREE LAA */
- [0x18e3, 0x18e3], /* CANADIAN SYLLABICS THWE */
- [0x18e4, 0x18e4], /* CANADIAN SYLLABICS THWA */
- [0x18e5, 0x18e5], /* CANADIAN SYLLABICS TTHWE */
- [0x18e6, 0x18e6], /* CANADIAN SYLLABICS TTHOO */
- [0x18e7, 0x18e7], /* CANADIAN SYLLABICS TTHAA */
- [0x18e8, 0x18e8], /* CANADIAN SYLLABICS TLHWE */
- [0x18e9, 0x18e9], /* CANADIAN SYLLABICS TLHOO */
- [0x18ea, 0x18ea], /* CANADIAN SYLLABICS SAYISI SHWE */
- [0x18eb, 0x18eb], /* CANADIAN SYLLABICS SAYISI SHOO */
- [0x18ec, 0x18ec], /* CANADIAN SYLLABICS SAYISI HOO */
- [0x18ed, 0x18ed], /* CANADIAN SYLLABICS CARRIER GWU */
- [0x18ee, 0x18ee], /* CANADIAN SYLLABICS CARRIER DENE GEE */
- [0x18ef, 0x18ef], /* CANADIAN SYLLABICS CARRIER GAA */
- [0x18f0, 0x18f0], /* CANADIAN SYLLABICS CARRIER GWA */
- [0x18f1, 0x18f1], /* CANADIAN SYLLABICS SAYISI JUU */
- [0x18f2, 0x18f2], /* CANADIAN SYLLABICS CARRIER JWA */
- [0x18f3, 0x18f3], /* CANADIAN SYLLABICS BEAVER DENE L */
- [0x18f4, 0x18f4], /* CANADIAN SYLLABICS BEAVER DENE R */
- [0x18f5, 0x18f5], /* CANADIAN SYLLABICS CARRIER DENTAL S */
- [0x18f6, 0x18f6],
- [0x18f7, 0x18f7],
- [0x18f8, 0x18f8],
- [0x18f9, 0x18f9],
- [0x18fa, 0x18fa],
- [0x18fb, 0x18fb],
- [0x18fc, 0x18fc],
- [0x18fd, 0x18fd],
- [0x18fe, 0x18fe],
- [0x18ff, 0x18ff],
- [0x1900, 0x1900], /* LIMBU VOWEL-CARRIER LETTER */
- [0x1901, 0x1901], /* LIMBU LETTER KA */
- [0x1902, 0x1902], /* LIMBU LETTER KHA */
- [0x1903, 0x1903], /* LIMBU LETTER GA */
- [0x1904, 0x1904], /* LIMBU LETTER GHA */
- [0x1905, 0x1905], /* LIMBU LETTER NGA */
- [0x1906, 0x1906], /* LIMBU LETTER CA */
- [0x1907, 0x1907], /* LIMBU LETTER CHA */
- [0x1908, 0x1908], /* LIMBU LETTER JA */
- [0x1909, 0x1909], /* LIMBU LETTER JHA */
- [0x190a, 0x190a], /* LIMBU LETTER YAN */
- [0x190b, 0x190b], /* LIMBU LETTER TA */
- [0x190c, 0x190c], /* LIMBU LETTER THA */
- [0x190d, 0x190d], /* LIMBU LETTER DA */
- [0x190e, 0x190e], /* LIMBU LETTER DHA */
- [0x190f, 0x190f], /* LIMBU LETTER NA */
- [0x1910, 0x1910], /* LIMBU LETTER PA */
- [0x1911, 0x1911], /* LIMBU LETTER PHA */
- [0x1912, 0x1912], /* LIMBU LETTER BA */
- [0x1913, 0x1913], /* LIMBU LETTER BHA */
- [0x1914, 0x1914], /* LIMBU LETTER MA */
- [0x1915, 0x1915], /* LIMBU LETTER YA */
- [0x1916, 0x1916], /* LIMBU LETTER RA */
- [0x1917, 0x1917], /* LIMBU LETTER LA */
- [0x1918, 0x1918], /* LIMBU LETTER WA */
- [0x1919, 0x1919], /* LIMBU LETTER SHA */
- [0x191a, 0x191a], /* LIMBU LETTER SSA */
- [0x191b, 0x191b], /* LIMBU LETTER SA */
- [0x191c, 0x191c], /* LIMBU LETTER HA */
- [0x191d, 0x191d], /* LIMBU LETTER GYAN */
- [0x191e, 0x191e], /* LIMBU LETTER TRA */
- [0x191f, 0x191f],
- [0x1920, 0x1920], /* LIMBU VOWEL SIGN A */
- [0x1921, 0x1921], /* LIMBU VOWEL SIGN I */
- [0x1922, 0x1922], /* LIMBU VOWEL SIGN U */
- [0x1923, 0x1923], /* LIMBU VOWEL SIGN EE */
- [0x1924, 0x1924], /* LIMBU VOWEL SIGN AI */
- [0x1925, 0x1925], /* LIMBU VOWEL SIGN OO */
- [0x1926, 0x1926], /* LIMBU VOWEL SIGN AU */
- [0x1927, 0x1927], /* LIMBU VOWEL SIGN E */
- [0x1928, 0x1928], /* LIMBU VOWEL SIGN O */
- [0x1929, 0x1929], /* LIMBU SUBJOINED LETTER YA */
- [0x192a, 0x192a], /* LIMBU SUBJOINED LETTER RA */
- [0x192b, 0x192b], /* LIMBU SUBJOINED LETTER WA */
- [0x192c, 0x192c],
- [0x192d, 0x192d],
- [0x192e, 0x192e],
- [0x192f, 0x192f],
- [0x1930, 0x1930], /* LIMBU SMALL LETTER KA */
- [0x1931, 0x1931], /* LIMBU SMALL LETTER NGA */
- [0x1932, 0x1932], /* LIMBU SMALL LETTER ANUSVARA */
- [0x1933, 0x1933], /* LIMBU SMALL LETTER TA */
- [0x1934, 0x1934], /* LIMBU SMALL LETTER NA */
- [0x1935, 0x1935], /* LIMBU SMALL LETTER PA */
- [0x1936, 0x1936], /* LIMBU SMALL LETTER MA */
- [0x1937, 0x1937], /* LIMBU SMALL LETTER RA */
- [0x1938, 0x1938], /* LIMBU SMALL LETTER LA */
- [0x1939, 0x1939], /* LIMBU SIGN MUKPHRENG */
- [0x193a, 0x193a], /* LIMBU SIGN KEMPHRENG */
- [0x193b, 0x193b], /* LIMBU SIGN SA-I */
- [0x193c, 0x193c],
- [0x193d, 0x193d],
- [0x193e, 0x193e],
- [0x193f, 0x193f],
- [0x1940, 0x1940], /* LIMBU SIGN LOO */
- [0x1941, 0x1941],
- [0x1942, 0x1942],
- [0x1943, 0x1943],
- [0x1944, 0x1944], /* LIMBU EXCLAMATION MARK */
- [0x1945, 0x1945], /* LIMBU QUESTION MARK */
- [0x1946, 0x1946], /* LIMBU DIGIT ZERO */
- [0x1947, 0x1947], /* LIMBU DIGIT ONE */
- [0x1948, 0x1948], /* LIMBU DIGIT TWO */
- [0x1949, 0x1949], /* LIMBU DIGIT THREE */
- [0x194a, 0x194a], /* LIMBU DIGIT FOUR */
- [0x194b, 0x194b], /* LIMBU DIGIT FIVE */
- [0x194c, 0x194c], /* LIMBU DIGIT SIX */
- [0x194d, 0x194d], /* LIMBU DIGIT SEVEN */
- [0x194e, 0x194e], /* LIMBU DIGIT EIGHT */
- [0x194f, 0x194f], /* LIMBU DIGIT NINE */
- [0x1950, 0x1950], /* TAI LE LETTER KA */
- [0x1951, 0x1951], /* TAI LE LETTER XA */
- [0x1952, 0x1952], /* TAI LE LETTER NGA */
- [0x1953, 0x1953], /* TAI LE LETTER TSA */
- [0x1954, 0x1954], /* TAI LE LETTER SA */
- [0x1955, 0x1955], /* TAI LE LETTER YA */
- [0x1956, 0x1956], /* TAI LE LETTER TA */
- [0x1957, 0x1957], /* TAI LE LETTER THA */
- [0x1958, 0x1958], /* TAI LE LETTER LA */
- [0x1959, 0x1959], /* TAI LE LETTER PA */
- [0x195a, 0x195a], /* TAI LE LETTER PHA */
- [0x195b, 0x195b], /* TAI LE LETTER MA */
- [0x195c, 0x195c], /* TAI LE LETTER FA */
- [0x195d, 0x195d], /* TAI LE LETTER VA */
- [0x195e, 0x195e], /* TAI LE LETTER HA */
- [0x195f, 0x195f], /* TAI LE LETTER QA */
- [0x1960, 0x1960], /* TAI LE LETTER KHA */
- [0x1961, 0x1961], /* TAI LE LETTER TSHA */
- [0x1962, 0x1962], /* TAI LE LETTER NA */
- [0x1963, 0x1963], /* TAI LE LETTER A */
- [0x1964, 0x1964], /* TAI LE LETTER I */
- [0x1965, 0x1965], /* TAI LE LETTER EE */
- [0x1966, 0x1966], /* TAI LE LETTER EH */
- [0x1967, 0x1967], /* TAI LE LETTER U */
- [0x1968, 0x1968], /* TAI LE LETTER OO */
- [0x1969, 0x1969], /* TAI LE LETTER O */
- [0x196a, 0x196a], /* TAI LE LETTER UE */
- [0x196b, 0x196b], /* TAI LE LETTER E */
- [0x196c, 0x196c], /* TAI LE LETTER AUE */
- [0x196d, 0x196d], /* TAI LE LETTER AI */
- [0x196e, 0x196e],
- [0x196f, 0x196f],
- [0x1970, 0x1970], /* TAI LE LETTER TONE-2 */
- [0x1971, 0x1971], /* TAI LE LETTER TONE-3 */
- [0x1972, 0x1972], /* TAI LE LETTER TONE-4 */
- [0x1973, 0x1973], /* TAI LE LETTER TONE-5 */
- [0x1974, 0x1974], /* TAI LE LETTER TONE-6 */
- [0x1975, 0x1975],
- [0x1976, 0x1976],
- [0x1977, 0x1977],
- [0x1978, 0x1978],
- [0x1979, 0x1979],
- [0x197a, 0x197a],
- [0x197b, 0x197b],
- [0x197c, 0x197c],
- [0x197d, 0x197d],
- [0x197e, 0x197e],
- [0x197f, 0x197f],
- [0x1980, 0x1980], /* NEW TAI LUE LETTER HIGH QA */
- [0x1981, 0x1981], /* NEW TAI LUE LETTER LOW QA */
- [0x1982, 0x1982], /* NEW TAI LUE LETTER HIGH KA */
- [0x1983, 0x1983], /* NEW TAI LUE LETTER HIGH XA */
- [0x1984, 0x1984], /* NEW TAI LUE LETTER HIGH NGA */
- [0x1985, 0x1985], /* NEW TAI LUE LETTER LOW KA */
- [0x1986, 0x1986], /* NEW TAI LUE LETTER LOW XA */
- [0x1987, 0x1987], /* NEW TAI LUE LETTER LOW NGA */
- [0x1988, 0x1988], /* NEW TAI LUE LETTER HIGH TSA */
- [0x1989, 0x1989], /* NEW TAI LUE LETTER HIGH SA */
- [0x198a, 0x198a], /* NEW TAI LUE LETTER HIGH YA */
- [0x198b, 0x198b], /* NEW TAI LUE LETTER LOW TSA */
- [0x198c, 0x198c], /* NEW TAI LUE LETTER LOW SA */
- [0x198d, 0x198d], /* NEW TAI LUE LETTER LOW YA */
- [0x198e, 0x198e], /* NEW TAI LUE LETTER HIGH TA */
- [0x198f, 0x198f], /* NEW TAI LUE LETTER HIGH THA */
- [0x1990, 0x1990], /* NEW TAI LUE LETTER HIGH NA */
- [0x1991, 0x1991], /* NEW TAI LUE LETTER LOW TA */
- [0x1992, 0x1992], /* NEW TAI LUE LETTER LOW THA */
- [0x1993, 0x1993], /* NEW TAI LUE LETTER LOW NA */
- [0x1994, 0x1994], /* NEW TAI LUE LETTER HIGH PA */
- [0x1995, 0x1995], /* NEW TAI LUE LETTER HIGH PHA */
- [0x1996, 0x1996], /* NEW TAI LUE LETTER HIGH MA */
- [0x1997, 0x1997], /* NEW TAI LUE LETTER LOW PA */
- [0x1998, 0x1998], /* NEW TAI LUE LETTER LOW PHA */
- [0x1999, 0x1999], /* NEW TAI LUE LETTER LOW MA */
- [0x199a, 0x199a], /* NEW TAI LUE LETTER HIGH FA */
- [0x199b, 0x199b], /* NEW TAI LUE LETTER HIGH VA */
- [0x199c, 0x199c], /* NEW TAI LUE LETTER HIGH LA */
- [0x199d, 0x199d], /* NEW TAI LUE LETTER LOW FA */
- [0x199e, 0x199e], /* NEW TAI LUE LETTER LOW VA */
- [0x199f, 0x199f], /* NEW TAI LUE LETTER LOW LA */
- [0x19a0, 0x19a0], /* NEW TAI LUE LETTER HIGH HA */
- [0x19a1, 0x19a1], /* NEW TAI LUE LETTER HIGH DA */
- [0x19a2, 0x19a2], /* NEW TAI LUE LETTER HIGH BA */
- [0x19a3, 0x19a3], /* NEW TAI LUE LETTER LOW HA */
- [0x19a4, 0x19a4], /* NEW TAI LUE LETTER LOW DA */
- [0x19a5, 0x19a5], /* NEW TAI LUE LETTER LOW BA */
- [0x19a6, 0x19a6], /* NEW TAI LUE LETTER HIGH KVA */
- [0x19a7, 0x19a7], /* NEW TAI LUE LETTER HIGH XVA */
- [0x19a8, 0x19a8], /* NEW TAI LUE LETTER LOW KVA */
- [0x19a9, 0x19a9], /* NEW TAI LUE LETTER LOW XVA */
- [0x19aa, 0x19aa], /* NEW TAI LUE LETTER HIGH SUA */
- [0x19ab, 0x19ab], /* NEW TAI LUE LETTER LOW SUA */
- [0x19ac, 0x19ac],
- [0x19ad, 0x19ad],
- [0x19ae, 0x19ae],
- [0x19af, 0x19af],
- [0x19b0, 0x19b0], /* NEW TAI LUE VOWEL SIGN VOWEL SHORTENER */
- [0x19b1, 0x19b1], /* NEW TAI LUE VOWEL SIGN AA */
- [0x19b2, 0x19b2], /* NEW TAI LUE VOWEL SIGN II */
- [0x19b3, 0x19b3], /* NEW TAI LUE VOWEL SIGN U */
- [0x19b4, 0x19b4], /* NEW TAI LUE VOWEL SIGN UU */
- [0x19b5, 0x19b5], /* NEW TAI LUE VOWEL SIGN E */
- [0x19b6, 0x19b6], /* NEW TAI LUE VOWEL SIGN AE */
- [0x19b7, 0x19b7], /* NEW TAI LUE VOWEL SIGN O */
- [0x19b8, 0x19b8], /* NEW TAI LUE VOWEL SIGN OA */
- [0x19b9, 0x19b9], /* NEW TAI LUE VOWEL SIGN UE */
- [0x19ba, 0x19ba], /* NEW TAI LUE VOWEL SIGN AY */
- [0x19bb, 0x19bb], /* NEW TAI LUE VOWEL SIGN AAY */
- [0x19bc, 0x19bc], /* NEW TAI LUE VOWEL SIGN UY */
- [0x19bd, 0x19bd], /* NEW TAI LUE VOWEL SIGN OY */
- [0x19be, 0x19be], /* NEW TAI LUE VOWEL SIGN OAY */
- [0x19bf, 0x19bf], /* NEW TAI LUE VOWEL SIGN UEY */
- [0x19c0, 0x19c0], /* NEW TAI LUE VOWEL SIGN IY */
- [0x19c1, 0x19c1], /* NEW TAI LUE LETTER FINAL V */
- [0x19c2, 0x19c2], /* NEW TAI LUE LETTER FINAL NG */
- [0x19c3, 0x19c3], /* NEW TAI LUE LETTER FINAL N */
- [0x19c4, 0x19c4], /* NEW TAI LUE LETTER FINAL M */
- [0x19c5, 0x19c5], /* NEW TAI LUE LETTER FINAL K */
- [0x19c6, 0x19c6], /* NEW TAI LUE LETTER FINAL D */
- [0x19c7, 0x19c7], /* NEW TAI LUE LETTER FINAL B */
- [0x19c8, 0x19c8], /* NEW TAI LUE TONE MARK-1 */
- [0x19c9, 0x19c9], /* NEW TAI LUE TONE MARK-2 */
- [0x19ca, 0x19ca],
- [0x19cb, 0x19cb],
- [0x19cc, 0x19cc],
- [0x19cd, 0x19cd],
- [0x19ce, 0x19ce],
- [0x19cf, 0x19cf],
- [0x19d0, 0x19d0], /* NEW TAI LUE DIGIT ZERO */
- [0x19d1, 0x19d1], /* NEW TAI LUE DIGIT ONE */
- [0x19d2, 0x19d2], /* NEW TAI LUE DIGIT TWO */
- [0x19d3, 0x19d3], /* NEW TAI LUE DIGIT THREE */
- [0x19d4, 0x19d4], /* NEW TAI LUE DIGIT FOUR */
- [0x19d5, 0x19d5], /* NEW TAI LUE DIGIT FIVE */
- [0x19d6, 0x19d6], /* NEW TAI LUE DIGIT SIX */
- [0x19d7, 0x19d7], /* NEW TAI LUE DIGIT SEVEN */
- [0x19d8, 0x19d8], /* NEW TAI LUE DIGIT EIGHT */
- [0x19d9, 0x19d9], /* NEW TAI LUE DIGIT NINE */
- [0x19da, 0x19da], /* NEW TAI LUE THAM DIGIT ONE */
- [0x19db, 0x19db],
- [0x19dc, 0x19dc],
- [0x19dd, 0x19dd],
- [0x19de, 0x19de], /* NEW TAI LUE SIGN LAE */
- [0x19df, 0x19df], /* NEW TAI LUE SIGN LAEV */
- [0x19e0, 0x19e0], /* KHMER SYMBOL PATHAMASAT */
- [0x19e1, 0x19e1], /* KHMER SYMBOL MUOY KOET */
- [0x19e2, 0x19e2], /* KHMER SYMBOL PII KOET */
- [0x19e3, 0x19e3], /* KHMER SYMBOL BEI KOET */
- [0x19e4, 0x19e4], /* KHMER SYMBOL BUON KOET */
- [0x19e5, 0x19e5], /* KHMER SYMBOL PRAM KOET */
- [0x19e6, 0x19e6], /* KHMER SYMBOL PRAM-MUOY KOET */
- [0x19e7, 0x19e7], /* KHMER SYMBOL PRAM-PII KOET */
- [0x19e8, 0x19e8], /* KHMER SYMBOL PRAM-BEI KOET */
- [0x19e9, 0x19e9], /* KHMER SYMBOL PRAM-BUON KOET */
- [0x19ea, 0x19ea], /* KHMER SYMBOL DAP KOET */
- [0x19eb, 0x19eb], /* KHMER SYMBOL DAP-MUOY KOET */
- [0x19ec, 0x19ec], /* KHMER SYMBOL DAP-PII KOET */
- [0x19ed, 0x19ed], /* KHMER SYMBOL DAP-BEI KOET */
- [0x19ee, 0x19ee], /* KHMER SYMBOL DAP-BUON KOET */
- [0x19ef, 0x19ef], /* KHMER SYMBOL DAP-PRAM KOET */
- [0x19f0, 0x19f0], /* KHMER SYMBOL TUTEYASAT */
- [0x19f1, 0x19f1], /* KHMER SYMBOL MUOY ROC */
- [0x19f2, 0x19f2], /* KHMER SYMBOL PII ROC */
- [0x19f3, 0x19f3], /* KHMER SYMBOL BEI ROC */
- [0x19f4, 0x19f4], /* KHMER SYMBOL BUON ROC */
- [0x19f5, 0x19f5], /* KHMER SYMBOL PRAM ROC */
- [0x19f6, 0x19f6], /* KHMER SYMBOL PRAM-MUOY ROC */
- [0x19f7, 0x19f7], /* KHMER SYMBOL PRAM-PII ROC */
- [0x19f8, 0x19f8], /* KHMER SYMBOL PRAM-BEI ROC */
- [0x19f9, 0x19f9], /* KHMER SYMBOL PRAM-BUON ROC */
- [0x19fa, 0x19fa], /* KHMER SYMBOL DAP ROC */
- [0x19fb, 0x19fb], /* KHMER SYMBOL DAP-MUOY ROC */
- [0x19fc, 0x19fc], /* KHMER SYMBOL DAP-PII ROC */
- [0x19fd, 0x19fd], /* KHMER SYMBOL DAP-BEI ROC */
- [0x19fe, 0x19fe], /* KHMER SYMBOL DAP-BUON ROC */
- [0x19ff, 0x19ff], /* KHMER SYMBOL DAP-PRAM ROC */
- [0x1a00, 0x1a00], /* BUGINESE LETTER KA */
- [0x1a01, 0x1a01], /* BUGINESE LETTER GA */
- [0x1a02, 0x1a02], /* BUGINESE LETTER NGA */
- [0x1a03, 0x1a03], /* BUGINESE LETTER NGKA */
- [0x1a04, 0x1a04], /* BUGINESE LETTER PA */
- [0x1a05, 0x1a05], /* BUGINESE LETTER BA */
- [0x1a06, 0x1a06], /* BUGINESE LETTER MA */
- [0x1a07, 0x1a07], /* BUGINESE LETTER MPA */
- [0x1a08, 0x1a08], /* BUGINESE LETTER TA */
- [0x1a09, 0x1a09], /* BUGINESE LETTER DA */
- [0x1a0a, 0x1a0a], /* BUGINESE LETTER NA */
- [0x1a0b, 0x1a0b], /* BUGINESE LETTER NRA */
- [0x1a0c, 0x1a0c], /* BUGINESE LETTER CA */
- [0x1a0d, 0x1a0d], /* BUGINESE LETTER JA */
- [0x1a0e, 0x1a0e], /* BUGINESE LETTER NYA */
- [0x1a0f, 0x1a0f], /* BUGINESE LETTER NYCA */
- [0x1a10, 0x1a10], /* BUGINESE LETTER YA */
- [0x1a11, 0x1a11], /* BUGINESE LETTER RA */
- [0x1a12, 0x1a12], /* BUGINESE LETTER LA */
- [0x1a13, 0x1a13], /* BUGINESE LETTER VA */
- [0x1a14, 0x1a14], /* BUGINESE LETTER SA */
- [0x1a15, 0x1a15], /* BUGINESE LETTER A */
- [0x1a16, 0x1a16], /* BUGINESE LETTER HA */
- [0x1a17, 0x1a17], /* BUGINESE VOWEL SIGN I */
- [0x1a18, 0x1a18], /* BUGINESE VOWEL SIGN U */
- [0x1a19, 0x1a19], /* BUGINESE VOWEL SIGN E */
- [0x1a1a, 0x1a1a], /* BUGINESE VOWEL SIGN O */
- [0x1a1b, 0x1a1b], /* BUGINESE VOWEL SIGN AE */
- [0x1a1c, 0x1a1c],
- [0x1a1d, 0x1a1d],
- [0x1a1e, 0x1a1e], /* BUGINESE PALLAWA */
- [0x1a1f, 0x1a1f], /* BUGINESE END OF SECTION */
- [0x1a20, 0x1a20], /* TAI THAM LETTER HIGH KA */
- [0x1a21, 0x1a21], /* TAI THAM LETTER HIGH KHA */
- [0x1a22, 0x1a22], /* TAI THAM LETTER HIGH KXA */
- [0x1a23, 0x1a23], /* TAI THAM LETTER LOW KA */
- [0x1a24, 0x1a24], /* TAI THAM LETTER LOW KXA */
- [0x1a25, 0x1a25], /* TAI THAM LETTER LOW KHA */
- [0x1a26, 0x1a26], /* TAI THAM LETTER NGA */
- [0x1a27, 0x1a27], /* TAI THAM LETTER HIGH CA */
- [0x1a28, 0x1a28], /* TAI THAM LETTER HIGH CHA */
- [0x1a29, 0x1a29], /* TAI THAM LETTER LOW CA */
- [0x1a2a, 0x1a2a], /* TAI THAM LETTER LOW SA */
- [0x1a2b, 0x1a2b], /* TAI THAM LETTER LOW CHA */
- [0x1a2c, 0x1a2c], /* TAI THAM LETTER NYA */
- [0x1a2d, 0x1a2d], /* TAI THAM LETTER RATA */
- [0x1a2e, 0x1a2e], /* TAI THAM LETTER HIGH RATHA */
- [0x1a2f, 0x1a2f], /* TAI THAM LETTER DA */
- [0x1a30, 0x1a30], /* TAI THAM LETTER LOW RATHA */
- [0x1a31, 0x1a31], /* TAI THAM LETTER RANA */
- [0x1a32, 0x1a32], /* TAI THAM LETTER HIGH TA */
- [0x1a33, 0x1a33], /* TAI THAM LETTER HIGH THA */
- [0x1a34, 0x1a34], /* TAI THAM LETTER LOW TA */
- [0x1a35, 0x1a35], /* TAI THAM LETTER LOW THA */
- [0x1a36, 0x1a36], /* TAI THAM LETTER NA */
- [0x1a37, 0x1a37], /* TAI THAM LETTER BA */
- [0x1a38, 0x1a38], /* TAI THAM LETTER HIGH PA */
- [0x1a39, 0x1a39], /* TAI THAM LETTER HIGH PHA */
- [0x1a3a, 0x1a3a], /* TAI THAM LETTER HIGH FA */
- [0x1a3b, 0x1a3b], /* TAI THAM LETTER LOW PA */
- [0x1a3c, 0x1a3c], /* TAI THAM LETTER LOW FA */
- [0x1a3d, 0x1a3d], /* TAI THAM LETTER LOW PHA */
- [0x1a3e, 0x1a3e], /* TAI THAM LETTER MA */
- [0x1a3f, 0x1a3f], /* TAI THAM LETTER LOW YA */
- [0x1a40, 0x1a40], /* TAI THAM LETTER HIGH YA */
- [0x1a41, 0x1a41], /* TAI THAM LETTER RA */
- [0x1a42, 0x1a42], /* TAI THAM LETTER RUE */
- [0x1a43, 0x1a43], /* TAI THAM LETTER LA */
- [0x1a44, 0x1a44], /* TAI THAM LETTER LUE */
- [0x1a45, 0x1a45], /* TAI THAM LETTER WA */
- [0x1a46, 0x1a46], /* TAI THAM LETTER HIGH SHA */
- [0x1a47, 0x1a47], /* TAI THAM LETTER HIGH SSA */
- [0x1a48, 0x1a48], /* TAI THAM LETTER HIGH SA */
- [0x1a49, 0x1a49], /* TAI THAM LETTER HIGH HA */
- [0x1a4a, 0x1a4a], /* TAI THAM LETTER LLA */
- [0x1a4b, 0x1a4b], /* TAI THAM LETTER A */
- [0x1a4c, 0x1a4c], /* TAI THAM LETTER LOW HA */
- [0x1a4d, 0x1a4d], /* TAI THAM LETTER I */
- [0x1a4e, 0x1a4e], /* TAI THAM LETTER II */
- [0x1a4f, 0x1a4f], /* TAI THAM LETTER U */
- [0x1a50, 0x1a50], /* TAI THAM LETTER UU */
- [0x1a51, 0x1a51], /* TAI THAM LETTER EE */
- [0x1a52, 0x1a52], /* TAI THAM LETTER OO */
- [0x1a53, 0x1a53], /* TAI THAM LETTER LAE */
- [0x1a54, 0x1a54], /* TAI THAM LETTER GREAT SA */
- [0x1a55, 0x1a55], /* TAI THAM CONSONANT SIGN MEDIAL RA */
- [0x1a56, 0x1a56], /* TAI THAM CONSONANT SIGN MEDIAL LA */
- [0x1a57, 0x1a57], /* TAI THAM CONSONANT SIGN LA TANG LAI */
- [0x1a58, 0x1a58], /* TAI THAM SIGN MAI KANG LAI */
- [0x1a59, 0x1a59], /* TAI THAM CONSONANT SIGN FINAL NGA */
- [0x1a5a, 0x1a5a], /* TAI THAM CONSONANT SIGN LOW PA */
- [0x1a5b, 0x1a5b], /* TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA */
- [0x1a5c, 0x1a5c], /* TAI THAM CONSONANT SIGN MA */
- [0x1a5d, 0x1a5d], /* TAI THAM CONSONANT SIGN BA */
- [0x1a5e, 0x1a5e], /* TAI THAM CONSONANT SIGN SA */
- [0x1a5f, 0x1a5f],
- [0x1a60, 0x1a60], /* TAI THAM SIGN SAKOT */
- [0x1a61, 0x1a61], /* TAI THAM VOWEL SIGN A */
- [0x1a62, 0x1a62], /* TAI THAM VOWEL SIGN MAI SAT */
- [0x1a63, 0x1a63], /* TAI THAM VOWEL SIGN AA */
- [0x1a64, 0x1a64], /* TAI THAM VOWEL SIGN TALL AA */
- [0x1a65, 0x1a65], /* TAI THAM VOWEL SIGN I */
- [0x1a66, 0x1a66], /* TAI THAM VOWEL SIGN II */
- [0x1a67, 0x1a67], /* TAI THAM VOWEL SIGN UE */
- [0x1a68, 0x1a68], /* TAI THAM VOWEL SIGN UUE */
- [0x1a69, 0x1a69], /* TAI THAM VOWEL SIGN U */
- [0x1a6a, 0x1a6a], /* TAI THAM VOWEL SIGN UU */
- [0x1a6b, 0x1a6b], /* TAI THAM VOWEL SIGN O */
- [0x1a6c, 0x1a6c], /* TAI THAM VOWEL SIGN OA BELOW */
- [0x1a6d, 0x1a6d], /* TAI THAM VOWEL SIGN OY */
- [0x1a6e, 0x1a6e], /* TAI THAM VOWEL SIGN E */
- [0x1a6f, 0x1a6f], /* TAI THAM VOWEL SIGN AE */
- [0x1a70, 0x1a70], /* TAI THAM VOWEL SIGN OO */
- [0x1a71, 0x1a71], /* TAI THAM VOWEL SIGN AI */
- [0x1a72, 0x1a72], /* TAI THAM VOWEL SIGN THAM AI */
- [0x1a73, 0x1a73], /* TAI THAM VOWEL SIGN OA ABOVE */
- [0x1a74, 0x1a74], /* TAI THAM SIGN MAI KANG */
- [0x1a75, 0x1a75], /* TAI THAM SIGN TONE-1 */
- [0x1a76, 0x1a76], /* TAI THAM SIGN TONE-2 */
- [0x1a77, 0x1a77], /* TAI THAM SIGN KHUEN TONE-3 */
- [0x1a78, 0x1a78], /* TAI THAM SIGN KHUEN TONE-4 */
- [0x1a79, 0x1a79], /* TAI THAM SIGN KHUEN TONE-5 */
- [0x1a7a, 0x1a7a], /* TAI THAM SIGN RA HAAM */
- [0x1a7b, 0x1a7b], /* TAI THAM SIGN MAI SAM */
- [0x1a7c, 0x1a7c], /* TAI THAM SIGN KHUEN-LUE KARAN */
- [0x1a7d, 0x1a7d],
- [0x1a7e, 0x1a7e],
- [0x1a7f, 0x1a7f], /* TAI THAM COMBINING CRYPTOGRAMMIC DOT */
- [0x1a80, 0x1a80], /* TAI THAM HORA DIGIT ZERO */
- [0x1a81, 0x1a81], /* TAI THAM HORA DIGIT ONE */
- [0x1a82, 0x1a82], /* TAI THAM HORA DIGIT TWO */
- [0x1a83, 0x1a83], /* TAI THAM HORA DIGIT THREE */
- [0x1a84, 0x1a84], /* TAI THAM HORA DIGIT FOUR */
- [0x1a85, 0x1a85], /* TAI THAM HORA DIGIT FIVE */
- [0x1a86, 0x1a86], /* TAI THAM HORA DIGIT SIX */
- [0x1a87, 0x1a87], /* TAI THAM HORA DIGIT SEVEN */
- [0x1a88, 0x1a88], /* TAI THAM HORA DIGIT EIGHT */
- [0x1a89, 0x1a89], /* TAI THAM HORA DIGIT NINE */
- [0x1a8a, 0x1a8a],
- [0x1a8b, 0x1a8b],
- [0x1a8c, 0x1a8c],
- [0x1a8d, 0x1a8d],
- [0x1a8e, 0x1a8e],
- [0x1a8f, 0x1a8f],
- [0x1a90, 0x1a90], /* TAI THAM THAM DIGIT ZERO */
- [0x1a91, 0x1a91], /* TAI THAM THAM DIGIT ONE */
- [0x1a92, 0x1a92], /* TAI THAM THAM DIGIT TWO */
- [0x1a93, 0x1a93], /* TAI THAM THAM DIGIT THREE */
- [0x1a94, 0x1a94], /* TAI THAM THAM DIGIT FOUR */
- [0x1a95, 0x1a95], /* TAI THAM THAM DIGIT FIVE */
- [0x1a96, 0x1a96], /* TAI THAM THAM DIGIT SIX */
- [0x1a97, 0x1a97], /* TAI THAM THAM DIGIT SEVEN */
- [0x1a98, 0x1a98], /* TAI THAM THAM DIGIT EIGHT */
- [0x1a99, 0x1a99], /* TAI THAM THAM DIGIT NINE */
- [0x1a9a, 0x1a9a],
- [0x1a9b, 0x1a9b],
- [0x1a9c, 0x1a9c],
- [0x1a9d, 0x1a9d],
- [0x1a9e, 0x1a9e],
- [0x1a9f, 0x1a9f],
- [0x1aa0, 0x1aa0], /* TAI THAM SIGN WIANG */
- [0x1aa1, 0x1aa1], /* TAI THAM SIGN WIANGWAAK */
- [0x1aa2, 0x1aa2], /* TAI THAM SIGN SAWAN */
- [0x1aa3, 0x1aa3], /* TAI THAM SIGN KEOW */
- [0x1aa4, 0x1aa4], /* TAI THAM SIGN HOY */
- [0x1aa5, 0x1aa5], /* TAI THAM SIGN DOKMAI */
- [0x1aa6, 0x1aa6], /* TAI THAM SIGN REVERSED ROTATED RANA */
- [0x1aa7, 0x1aa7], /* TAI THAM SIGN MAI YAMOK */
- [0x1aa8, 0x1aa8], /* TAI THAM SIGN KAAN */
- [0x1aa9, 0x1aa9], /* TAI THAM SIGN KAANKUU */
- [0x1aaa, 0x1aaa], /* TAI THAM SIGN SATKAAN */
- [0x1aab, 0x1aab], /* TAI THAM SIGN SATKAANKUU */
- [0x1aac, 0x1aac], /* TAI THAM SIGN HANG */
- [0x1aad, 0x1aad], /* TAI THAM SIGN CAANG */
- [0x1aae, 0x1aae],
- [0x1aaf, 0x1aaf],
- [0x1ab0, 0x1ab0], /* COMBINING DOUBLED CIRCUMFLEX ACCENT */
- [0x1ab1, 0x1ab1], /* COMBINING DIAERESIS-RING */
- [0x1ab2, 0x1ab2], /* COMBINING INFINITY */
- [0x1ab3, 0x1ab3], /* COMBINING DOWNWARDS ARROW */
- [0x1ab4, 0x1ab4], /* COMBINING TRIPLE DOT */
- [0x1ab5, 0x1ab5], /* COMBINING X-X BELOW */
- [0x1ab6, 0x1ab6], /* COMBINING WIGGLY LINE BELOW */
- [0x1ab7, 0x1ab7], /* COMBINING OPEN MARK BELOW */
- [0x1ab8, 0x1ab8], /* COMBINING DOUBLE OPEN MARK BELOW */
- [0x1ab9, 0x1ab9], /* COMBINING LIGHT CENTRALIZATION STROKE BELOW */
- [0x1aba, 0x1aba], /* COMBINING STRONG CENTRALIZATION STROKE BELOW */
- [0x1abb, 0x1abb], /* COMBINING PARENTHESES ABOVE */
- [0x1abc, 0x1abc], /* COMBINING DOUBLE PARENTHESES ABOVE */
- [0x1abd, 0x1abd], /* COMBINING PARENTHESES BELOW */
- [0x1abe, 0x1abe], /* COMBINING PARENTHESES OVERLAY */
- [0x1abf, 0x1abf],
- [0x1ac0, 0x1ac0],
- [0x1ac1, 0x1ac1],
- [0x1ac2, 0x1ac2],
- [0x1ac3, 0x1ac3],
- [0x1ac4, 0x1ac4],
- [0x1ac5, 0x1ac5],
- [0x1ac6, 0x1ac6],
- [0x1ac7, 0x1ac7],
- [0x1ac8, 0x1ac8],
- [0x1ac9, 0x1ac9],
- [0x1aca, 0x1aca],
- [0x1acb, 0x1acb],
- [0x1acc, 0x1acc],
- [0x1acd, 0x1acd],
- [0x1ace, 0x1ace],
- [0x1acf, 0x1acf],
- [0x1ad0, 0x1ad0],
- [0x1ad1, 0x1ad1],
- [0x1ad2, 0x1ad2],
- [0x1ad3, 0x1ad3],
- [0x1ad4, 0x1ad4],
- [0x1ad5, 0x1ad5],
- [0x1ad6, 0x1ad6],
- [0x1ad7, 0x1ad7],
- [0x1ad8, 0x1ad8],
- [0x1ad9, 0x1ad9],
- [0x1ada, 0x1ada],
- [0x1adb, 0x1adb],
- [0x1adc, 0x1adc],
- [0x1add, 0x1add],
- [0x1ade, 0x1ade],
- [0x1adf, 0x1adf],
- [0x1ae0, 0x1ae0],
- [0x1ae1, 0x1ae1],
- [0x1ae2, 0x1ae2],
- [0x1ae3, 0x1ae3],
- [0x1ae4, 0x1ae4],
- [0x1ae5, 0x1ae5],
- [0x1ae6, 0x1ae6],
- [0x1ae7, 0x1ae7],
- [0x1ae8, 0x1ae8],
- [0x1ae9, 0x1ae9],
- [0x1aea, 0x1aea],
- [0x1aeb, 0x1aeb],
- [0x1aec, 0x1aec],
- [0x1aed, 0x1aed],
- [0x1aee, 0x1aee],
- [0x1aef, 0x1aef],
- [0x1af0, 0x1af0],
- [0x1af1, 0x1af1],
- [0x1af2, 0x1af2],
- [0x1af3, 0x1af3],
- [0x1af4, 0x1af4],
- [0x1af5, 0x1af5],
- [0x1af6, 0x1af6],
- [0x1af7, 0x1af7],
- [0x1af8, 0x1af8],
- [0x1af9, 0x1af9],
- [0x1afa, 0x1afa],
- [0x1afb, 0x1afb],
- [0x1afc, 0x1afc],
- [0x1afd, 0x1afd],
- [0x1afe, 0x1afe],
- [0x1aff, 0x1aff],
- [0x1b00, 0x1b00], /* BALINESE SIGN ULU RICEM */
- [0x1b01, 0x1b01], /* BALINESE SIGN ULU CANDRA */
- [0x1b02, 0x1b02], /* BALINESE SIGN CECEK */
- [0x1b03, 0x1b03], /* BALINESE SIGN SURANG */
- [0x1b04, 0x1b04], /* BALINESE SIGN BISAH */
- [0x1b05, 0x1b05], /* BALINESE LETTER AKARA */
- [0x1b06, 0x1b06], /* BALINESE LETTER AKARA TEDUNG */
- [0x1b07, 0x1b07], /* BALINESE LETTER IKARA */
- [0x1b08, 0x1b08], /* BALINESE LETTER IKARA TEDUNG */
- [0x1b09, 0x1b09], /* BALINESE LETTER UKARA */
- [0x1b0a, 0x1b0a], /* BALINESE LETTER UKARA TEDUNG */
- [0x1b0b, 0x1b0b], /* BALINESE LETTER RA REPA */
- [0x1b0c, 0x1b0c], /* BALINESE LETTER RA REPA TEDUNG */
- [0x1b0d, 0x1b0d], /* BALINESE LETTER LA LENGA */
- [0x1b0e, 0x1b0e], /* BALINESE LETTER LA LENGA TEDUNG */
- [0x1b0f, 0x1b0f], /* BALINESE LETTER EKARA */
- [0x1b10, 0x1b10], /* BALINESE LETTER AIKARA */
- [0x1b11, 0x1b11], /* BALINESE LETTER OKARA */
- [0x1b12, 0x1b12], /* BALINESE LETTER OKARA TEDUNG */
- [0x1b13, 0x1b13], /* BALINESE LETTER KA */
- [0x1b14, 0x1b14], /* BALINESE LETTER KA MAHAPRANA */
- [0x1b15, 0x1b15], /* BALINESE LETTER GA */
- [0x1b16, 0x1b16], /* BALINESE LETTER GA GORA */
- [0x1b17, 0x1b17], /* BALINESE LETTER NGA */
- [0x1b18, 0x1b18], /* BALINESE LETTER CA */
- [0x1b19, 0x1b19], /* BALINESE LETTER CA LACA */
- [0x1b1a, 0x1b1a], /* BALINESE LETTER JA */
- [0x1b1b, 0x1b1b], /* BALINESE LETTER JA JERA */
- [0x1b1c, 0x1b1c], /* BALINESE LETTER NYA */
- [0x1b1d, 0x1b1d], /* BALINESE LETTER TA LATIK */
- [0x1b1e, 0x1b1e], /* BALINESE LETTER TA MURDA MAHAPRANA */
- [0x1b1f, 0x1b1f], /* BALINESE LETTER DA MURDA ALPAPRANA */
- [0x1b20, 0x1b20], /* BALINESE LETTER DA MURDA MAHAPRANA */
- [0x1b21, 0x1b21], /* BALINESE LETTER NA RAMBAT */
- [0x1b22, 0x1b22], /* BALINESE LETTER TA */
- [0x1b23, 0x1b23], /* BALINESE LETTER TA TAWA */
- [0x1b24, 0x1b24], /* BALINESE LETTER DA */
- [0x1b25, 0x1b25], /* BALINESE LETTER DA MADU */
- [0x1b26, 0x1b26], /* BALINESE LETTER NA */
- [0x1b27, 0x1b27], /* BALINESE LETTER PA */
- [0x1b28, 0x1b28], /* BALINESE LETTER PA KAPAL */
- [0x1b29, 0x1b29], /* BALINESE LETTER BA */
- [0x1b2a, 0x1b2a], /* BALINESE LETTER BA KEMBANG */
- [0x1b2b, 0x1b2b], /* BALINESE LETTER MA */
- [0x1b2c, 0x1b2c], /* BALINESE LETTER YA */
- [0x1b2d, 0x1b2d], /* BALINESE LETTER RA */
- [0x1b2e, 0x1b2e], /* BALINESE LETTER LA */
- [0x1b2f, 0x1b2f], /* BALINESE LETTER WA */
- [0x1b30, 0x1b30], /* BALINESE LETTER SA SAGA */
- [0x1b31, 0x1b31], /* BALINESE LETTER SA SAPA */
- [0x1b32, 0x1b32], /* BALINESE LETTER SA */
- [0x1b33, 0x1b33], /* BALINESE LETTER HA */
- [0x1b34, 0x1b34], /* BALINESE SIGN REREKAN */
- [0x1b35, 0x1b35], /* BALINESE VOWEL SIGN TEDUNG */
- [0x1b36, 0x1b36], /* BALINESE VOWEL SIGN ULU */
- [0x1b37, 0x1b37], /* BALINESE VOWEL SIGN ULU SARI */
- [0x1b38, 0x1b38], /* BALINESE VOWEL SIGN SUKU */
- [0x1b39, 0x1b39], /* BALINESE VOWEL SIGN SUKU ILUT */
- [0x1b3a, 0x1b3a], /* BALINESE VOWEL SIGN RA REPA */
- [0x1b3b, 0x1b3b], /* BALINESE VOWEL SIGN RA REPA TEDUNG */
- [0x1b3c, 0x1b3c], /* BALINESE VOWEL SIGN LA LENGA */
- [0x1b3d, 0x1b3d], /* BALINESE VOWEL SIGN LA LENGA TEDUNG */
- [0x1b3e, 0x1b3e], /* BALINESE VOWEL SIGN TALING */
- [0x1b3f, 0x1b3f], /* BALINESE VOWEL SIGN TALING REPA */
- [0x1b40, 0x1b40], /* BALINESE VOWEL SIGN TALING TEDUNG */
- [0x1b41, 0x1b41], /* BALINESE VOWEL SIGN TALING REPA TEDUNG */
- [0x1b42, 0x1b42], /* BALINESE VOWEL SIGN PEPET */
- [0x1b43, 0x1b43], /* BALINESE VOWEL SIGN PEPET TEDUNG */
- [0x1b44, 0x1b44], /* BALINESE ADEG ADEG */
- [0x1b45, 0x1b45], /* BALINESE LETTER KAF SASAK */
- [0x1b46, 0x1b46], /* BALINESE LETTER KHOT SASAK */
- [0x1b47, 0x1b47], /* BALINESE LETTER TZIR SASAK */
- [0x1b48, 0x1b48], /* BALINESE LETTER EF SASAK */
- [0x1b49, 0x1b49], /* BALINESE LETTER VE SASAK */
- [0x1b4a, 0x1b4a], /* BALINESE LETTER ZAL SASAK */
- [0x1b4b, 0x1b4b], /* BALINESE LETTER ASYURA SASAK */
- [0x1b4c, 0x1b4c],
- [0x1b4d, 0x1b4d],
- [0x1b4e, 0x1b4e],
- [0x1b4f, 0x1b4f],
- [0x1b50, 0x1b50], /* BALINESE DIGIT ZERO */
- [0x1b51, 0x1b51], /* BALINESE DIGIT ONE */
- [0x1b52, 0x1b52], /* BALINESE DIGIT TWO */
- [0x1b53, 0x1b53], /* BALINESE DIGIT THREE */
- [0x1b54, 0x1b54], /* BALINESE DIGIT FOUR */
- [0x1b55, 0x1b55], /* BALINESE DIGIT FIVE */
- [0x1b56, 0x1b56], /* BALINESE DIGIT SIX */
- [0x1b57, 0x1b57], /* BALINESE DIGIT SEVEN */
- [0x1b58, 0x1b58], /* BALINESE DIGIT EIGHT */
- [0x1b59, 0x1b59], /* BALINESE DIGIT NINE */
- [0x1b5a, 0x1b5a], /* BALINESE PANTI */
- [0x1b5b, 0x1b5b], /* BALINESE PAMADA */
- [0x1b5c, 0x1b5c], /* BALINESE WINDU */
- [0x1b5d, 0x1b5d], /* BALINESE CARIK PAMUNGKAH */
- [0x1b5e, 0x1b5e], /* BALINESE CARIK SIKI */
- [0x1b5f, 0x1b5f], /* BALINESE CARIK PAREREN */
- [0x1b60, 0x1b60], /* BALINESE PAMENENG */
- [0x1b61, 0x1b61], /* BALINESE MUSICAL SYMBOL DONG */
- [0x1b62, 0x1b62], /* BALINESE MUSICAL SYMBOL DENG */
- [0x1b63, 0x1b63], /* BALINESE MUSICAL SYMBOL DUNG */
- [0x1b64, 0x1b64], /* BALINESE MUSICAL SYMBOL DANG */
- [0x1b65, 0x1b65], /* BALINESE MUSICAL SYMBOL DANG SURANG */
- [0x1b66, 0x1b66], /* BALINESE MUSICAL SYMBOL DING */
- [0x1b67, 0x1b67], /* BALINESE MUSICAL SYMBOL DAENG */
- [0x1b68, 0x1b68], /* BALINESE MUSICAL SYMBOL DEUNG */
- [0x1b69, 0x1b69], /* BALINESE MUSICAL SYMBOL DAING */
- [0x1b6a, 0x1b6a], /* BALINESE MUSICAL SYMBOL DANG GEDE */
- [0x1b6b, 0x1b6b], /* BALINESE MUSICAL SYMBOL COMBINING TEGEH */
- [0x1b6c, 0x1b6c], /* BALINESE MUSICAL SYMBOL COMBINING ENDEP */
- [0x1b6d, 0x1b6d], /* BALINESE MUSICAL SYMBOL COMBINING KEMPUL */
- [0x1b6e, 0x1b6e], /* BALINESE MUSICAL SYMBOL COMBINING KEMPLI */
- [0x1b6f, 0x1b6f], /* BALINESE MUSICAL SYMBOL COMBINING JEGOGAN */
- [0x1b70, 0x1b70], /* BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN */
- [0x1b71, 0x1b71], /* BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN */
- [0x1b72, 0x1b72], /* BALINESE MUSICAL SYMBOL COMBINING BENDE */
- [0x1b73, 0x1b73], /* BALINESE MUSICAL SYMBOL COMBINING GONG */
- [0x1b74, 0x1b74], /* BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG */
- [0x1b75, 0x1b75], /* BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG */
- [0x1b76, 0x1b76], /* BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK */
- [0x1b77, 0x1b77], /* BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK */
- [0x1b78, 0x1b78], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG */
- [0x1b79, 0x1b79], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG */
- [0x1b7a, 0x1b7a], /* BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK */
- [0x1b7b, 0x1b7b], /* BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK */
- [0x1b7c, 0x1b7c], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING */
- [0x1b7d, 0x1b7d],
- [0x1b7e, 0x1b7e],
- [0x1b7f, 0x1b7f],
- [0x1b80, 0x1b80], /* SUNDANESE SIGN PANYECEK */
- [0x1b81, 0x1b81], /* SUNDANESE SIGN PANGLAYAR */
- [0x1b82, 0x1b82], /* SUNDANESE SIGN PANGWISAD */
- [0x1b83, 0x1b83], /* SUNDANESE LETTER A */
- [0x1b84, 0x1b84], /* SUNDANESE LETTER I */
- [0x1b85, 0x1b85], /* SUNDANESE LETTER U */
- [0x1b86, 0x1b86], /* SUNDANESE LETTER AE */
- [0x1b87, 0x1b87], /* SUNDANESE LETTER O */
- [0x1b88, 0x1b88], /* SUNDANESE LETTER E */
- [0x1b89, 0x1b89], /* SUNDANESE LETTER EU */
- [0x1b8a, 0x1b8a], /* SUNDANESE LETTER KA */
- [0x1b8b, 0x1b8b], /* SUNDANESE LETTER QA */
- [0x1b8c, 0x1b8c], /* SUNDANESE LETTER GA */
- [0x1b8d, 0x1b8d], /* SUNDANESE LETTER NGA */
- [0x1b8e, 0x1b8e], /* SUNDANESE LETTER CA */
- [0x1b8f, 0x1b8f], /* SUNDANESE LETTER JA */
- [0x1b90, 0x1b90], /* SUNDANESE LETTER ZA */
- [0x1b91, 0x1b91], /* SUNDANESE LETTER NYA */
- [0x1b92, 0x1b92], /* SUNDANESE LETTER TA */
- [0x1b93, 0x1b93], /* SUNDANESE LETTER DA */
- [0x1b94, 0x1b94], /* SUNDANESE LETTER NA */
- [0x1b95, 0x1b95], /* SUNDANESE LETTER PA */
- [0x1b96, 0x1b96], /* SUNDANESE LETTER FA */
- [0x1b97, 0x1b97], /* SUNDANESE LETTER VA */
- [0x1b98, 0x1b98], /* SUNDANESE LETTER BA */
- [0x1b99, 0x1b99], /* SUNDANESE LETTER MA */
- [0x1b9a, 0x1b9a], /* SUNDANESE LETTER YA */
- [0x1b9b, 0x1b9b], /* SUNDANESE LETTER RA */
- [0x1b9c, 0x1b9c], /* SUNDANESE LETTER LA */
- [0x1b9d, 0x1b9d], /* SUNDANESE LETTER WA */
- [0x1b9e, 0x1b9e], /* SUNDANESE LETTER SA */
- [0x1b9f, 0x1b9f], /* SUNDANESE LETTER XA */
- [0x1ba0, 0x1ba0], /* SUNDANESE LETTER HA */
- [0x1ba1, 0x1ba1], /* SUNDANESE CONSONANT SIGN PAMINGKAL */
- [0x1ba2, 0x1ba2], /* SUNDANESE CONSONANT SIGN PANYAKRA */
- [0x1ba3, 0x1ba3], /* SUNDANESE CONSONANT SIGN PANYIKU */
- [0x1ba4, 0x1ba4], /* SUNDANESE VOWEL SIGN PANGHULU */
- [0x1ba5, 0x1ba5], /* SUNDANESE VOWEL SIGN PANYUKU */
- [0x1ba6, 0x1ba6], /* SUNDANESE VOWEL SIGN PANAELAENG */
- [0x1ba7, 0x1ba7], /* SUNDANESE VOWEL SIGN PANOLONG */
- [0x1ba8, 0x1ba8], /* SUNDANESE VOWEL SIGN PAMEPET */
- [0x1ba9, 0x1ba9], /* SUNDANESE VOWEL SIGN PANEULEUNG */
- [0x1baa, 0x1baa], /* SUNDANESE SIGN PAMAAEH */
- [0x1bab, 0x1bab], /* SUNDANESE SIGN VIRAMA */
- [0x1bac, 0x1bac], /* SUNDANESE CONSONANT SIGN PASANGAN MA */
- [0x1bad, 0x1bad], /* SUNDANESE CONSONANT SIGN PASANGAN WA */
- [0x1bae, 0x1bae], /* SUNDANESE LETTER KHA */
- [0x1baf, 0x1baf], /* SUNDANESE LETTER SYA */
- [0x1bb0, 0x1bb0], /* SUNDANESE DIGIT ZERO */
- [0x1bb1, 0x1bb1], /* SUNDANESE DIGIT ONE */
- [0x1bb2, 0x1bb2], /* SUNDANESE DIGIT TWO */
- [0x1bb3, 0x1bb3], /* SUNDANESE DIGIT THREE */
- [0x1bb4, 0x1bb4], /* SUNDANESE DIGIT FOUR */
- [0x1bb5, 0x1bb5], /* SUNDANESE DIGIT FIVE */
- [0x1bb6, 0x1bb6], /* SUNDANESE DIGIT SIX */
- [0x1bb7, 0x1bb7], /* SUNDANESE DIGIT SEVEN */
- [0x1bb8, 0x1bb8], /* SUNDANESE DIGIT EIGHT */
- [0x1bb9, 0x1bb9], /* SUNDANESE DIGIT NINE */
- [0x1bba, 0x1bba], /* SUNDANESE AVAGRAHA */
- [0x1bbb, 0x1bbb], /* SUNDANESE LETTER REU */
- [0x1bbc, 0x1bbc], /* SUNDANESE LETTER LEU */
- [0x1bbd, 0x1bbd], /* SUNDANESE LETTER BHA */
- [0x1bbe, 0x1bbe], /* SUNDANESE LETTER FINAL K */
- [0x1bbf, 0x1bbf], /* SUNDANESE LETTER FINAL M */
- [0x1bc0, 0x1bc0], /* BATAK LETTER A */
- [0x1bc1, 0x1bc1], /* BATAK LETTER SIMALUNGUN A */
- [0x1bc2, 0x1bc2], /* BATAK LETTER HA */
- [0x1bc3, 0x1bc3], /* BATAK LETTER SIMALUNGUN HA */
- [0x1bc4, 0x1bc4], /* BATAK LETTER MANDAILING HA */
- [0x1bc5, 0x1bc5], /* BATAK LETTER BA */
- [0x1bc6, 0x1bc6], /* BATAK LETTER KARO BA */
- [0x1bc7, 0x1bc7], /* BATAK LETTER PA */
- [0x1bc8, 0x1bc8], /* BATAK LETTER SIMALUNGUN PA */
- [0x1bc9, 0x1bc9], /* BATAK LETTER NA */
- [0x1bca, 0x1bca], /* BATAK LETTER MANDAILING NA */
- [0x1bcb, 0x1bcb], /* BATAK LETTER WA */
- [0x1bcc, 0x1bcc], /* BATAK LETTER SIMALUNGUN WA */
- [0x1bcd, 0x1bcd], /* BATAK LETTER PAKPAK WA */
- [0x1bce, 0x1bce], /* BATAK LETTER GA */
- [0x1bcf, 0x1bcf], /* BATAK LETTER SIMALUNGUN GA */
- [0x1bd0, 0x1bd0], /* BATAK LETTER JA */
- [0x1bd1, 0x1bd1], /* BATAK LETTER DA */
- [0x1bd2, 0x1bd2], /* BATAK LETTER RA */
- [0x1bd3, 0x1bd3], /* BATAK LETTER SIMALUNGUN RA */
- [0x1bd4, 0x1bd4], /* BATAK LETTER MA */
- [0x1bd5, 0x1bd5], /* BATAK LETTER SIMALUNGUN MA */
- [0x1bd6, 0x1bd6], /* BATAK LETTER SOUTHERN TA */
- [0x1bd7, 0x1bd7], /* BATAK LETTER NORTHERN TA */
- [0x1bd8, 0x1bd8], /* BATAK LETTER SA */
- [0x1bd9, 0x1bd9], /* BATAK LETTER SIMALUNGUN SA */
- [0x1bda, 0x1bda], /* BATAK LETTER MANDAILING SA */
- [0x1bdb, 0x1bdb], /* BATAK LETTER YA */
- [0x1bdc, 0x1bdc], /* BATAK LETTER SIMALUNGUN YA */
- [0x1bdd, 0x1bdd], /* BATAK LETTER NGA */
- [0x1bde, 0x1bde], /* BATAK LETTER LA */
- [0x1bdf, 0x1bdf], /* BATAK LETTER SIMALUNGUN LA */
- [0x1be0, 0x1be0], /* BATAK LETTER NYA */
- [0x1be1, 0x1be1], /* BATAK LETTER CA */
- [0x1be2, 0x1be2], /* BATAK LETTER NDA */
- [0x1be3, 0x1be3], /* BATAK LETTER MBA */
- [0x1be4, 0x1be4], /* BATAK LETTER I */
- [0x1be5, 0x1be5], /* BATAK LETTER U */
- [0x1be6, 0x1be6], /* BATAK SIGN TOMPI */
- [0x1be7, 0x1be7], /* BATAK VOWEL SIGN E */
- [0x1be8, 0x1be8], /* BATAK VOWEL SIGN PAKPAK E */
- [0x1be9, 0x1be9], /* BATAK VOWEL SIGN EE */
- [0x1bea, 0x1bea], /* BATAK VOWEL SIGN I */
- [0x1beb, 0x1beb], /* BATAK VOWEL SIGN KARO I */
- [0x1bec, 0x1bec], /* BATAK VOWEL SIGN O */
- [0x1bed, 0x1bed], /* BATAK VOWEL SIGN KARO O */
- [0x1bee, 0x1bee], /* BATAK VOWEL SIGN U */
- [0x1bef, 0x1bef], /* BATAK VOWEL SIGN U FOR SIMALUNGUN SA */
- [0x1bf0, 0x1bf0], /* BATAK CONSONANT SIGN NG */
- [0x1bf1, 0x1bf1], /* BATAK CONSONANT SIGN H */
- [0x1bf2, 0x1bf2], /* BATAK PANGOLAT */
- [0x1bf3, 0x1bf3], /* BATAK PANONGONAN */
- [0x1bf4, 0x1bf4],
- [0x1bf5, 0x1bf5],
- [0x1bf6, 0x1bf6],
- [0x1bf7, 0x1bf7],
- [0x1bf8, 0x1bf8],
- [0x1bf9, 0x1bf9],
- [0x1bfa, 0x1bfa],
- [0x1bfb, 0x1bfb],
- [0x1bfc, 0x1bfc], /* BATAK SYMBOL BINDU NA METEK */
- [0x1bfd, 0x1bfd], /* BATAK SYMBOL BINDU PINARBORAS */
- [0x1bfe, 0x1bfe], /* BATAK SYMBOL BINDU JUDUL */
- [0x1bff, 0x1bff], /* BATAK SYMBOL BINDU PANGOLAT */
- [0x1c00, 0x1c00], /* LEPCHA LETTER KA */
- [0x1c01, 0x1c01], /* LEPCHA LETTER KLA */
- [0x1c02, 0x1c02], /* LEPCHA LETTER KHA */
- [0x1c03, 0x1c03], /* LEPCHA LETTER GA */
- [0x1c04, 0x1c04], /* LEPCHA LETTER GLA */
- [0x1c05, 0x1c05], /* LEPCHA LETTER NGA */
- [0x1c06, 0x1c06], /* LEPCHA LETTER CA */
- [0x1c07, 0x1c07], /* LEPCHA LETTER CHA */
- [0x1c08, 0x1c08], /* LEPCHA LETTER JA */
- [0x1c09, 0x1c09], /* LEPCHA LETTER NYA */
- [0x1c0a, 0x1c0a], /* LEPCHA LETTER TA */
- [0x1c0b, 0x1c0b], /* LEPCHA LETTER THA */
- [0x1c0c, 0x1c0c], /* LEPCHA LETTER DA */
- [0x1c0d, 0x1c0d], /* LEPCHA LETTER NA */
- [0x1c0e, 0x1c0e], /* LEPCHA LETTER PA */
- [0x1c0f, 0x1c0f], /* LEPCHA LETTER PLA */
- [0x1c10, 0x1c10], /* LEPCHA LETTER PHA */
- [0x1c11, 0x1c11], /* LEPCHA LETTER FA */
- [0x1c12, 0x1c12], /* LEPCHA LETTER FLA */
- [0x1c13, 0x1c13], /* LEPCHA LETTER BA */
- [0x1c14, 0x1c14], /* LEPCHA LETTER BLA */
- [0x1c15, 0x1c15], /* LEPCHA LETTER MA */
- [0x1c16, 0x1c16], /* LEPCHA LETTER MLA */
- [0x1c17, 0x1c17], /* LEPCHA LETTER TSA */
- [0x1c18, 0x1c18], /* LEPCHA LETTER TSHA */
- [0x1c19, 0x1c19], /* LEPCHA LETTER DZA */
- [0x1c1a, 0x1c1a], /* LEPCHA LETTER YA */
- [0x1c1b, 0x1c1b], /* LEPCHA LETTER RA */
- [0x1c1c, 0x1c1c], /* LEPCHA LETTER LA */
- [0x1c1d, 0x1c1d], /* LEPCHA LETTER HA */
- [0x1c1e, 0x1c1e], /* LEPCHA LETTER HLA */
- [0x1c1f, 0x1c1f], /* LEPCHA LETTER VA */
- [0x1c20, 0x1c20], /* LEPCHA LETTER SA */
- [0x1c21, 0x1c21], /* LEPCHA LETTER SHA */
- [0x1c22, 0x1c22], /* LEPCHA LETTER WA */
- [0x1c23, 0x1c23], /* LEPCHA LETTER A */
- [0x1c24, 0x1c24], /* LEPCHA SUBJOINED LETTER YA */
- [0x1c25, 0x1c25], /* LEPCHA SUBJOINED LETTER RA */
- [0x1c26, 0x1c26], /* LEPCHA VOWEL SIGN AA */
- [0x1c27, 0x1c27], /* LEPCHA VOWEL SIGN I */
- [0x1c28, 0x1c28], /* LEPCHA VOWEL SIGN O */
- [0x1c29, 0x1c29], /* LEPCHA VOWEL SIGN OO */
- [0x1c2a, 0x1c2a], /* LEPCHA VOWEL SIGN U */
- [0x1c2b, 0x1c2b], /* LEPCHA VOWEL SIGN UU */
- [0x1c2c, 0x1c2c], /* LEPCHA VOWEL SIGN E */
- [0x1c2d, 0x1c2d], /* LEPCHA CONSONANT SIGN K */
- [0x1c2e, 0x1c2e], /* LEPCHA CONSONANT SIGN M */
- [0x1c2f, 0x1c2f], /* LEPCHA CONSONANT SIGN L */
- [0x1c30, 0x1c30], /* LEPCHA CONSONANT SIGN N */
- [0x1c31, 0x1c31], /* LEPCHA CONSONANT SIGN P */
- [0x1c32, 0x1c32], /* LEPCHA CONSONANT SIGN R */
- [0x1c33, 0x1c33], /* LEPCHA CONSONANT SIGN T */
- [0x1c34, 0x1c34], /* LEPCHA CONSONANT SIGN NYIN-DO */
- [0x1c35, 0x1c35], /* LEPCHA CONSONANT SIGN KANG */
- [0x1c36, 0x1c36], /* LEPCHA SIGN RAN */
- [0x1c37, 0x1c37], /* LEPCHA SIGN NUKTA */
- [0x1c38, 0x1c38],
- [0x1c39, 0x1c39],
- [0x1c3a, 0x1c3a],
- [0x1c3b, 0x1c3b], /* LEPCHA PUNCTUATION TA-ROL */
- [0x1c3c, 0x1c3c], /* LEPCHA PUNCTUATION NYET THYOOM TA-ROL */
- [0x1c3d, 0x1c3d], /* LEPCHA PUNCTUATION CER-WA */
- [0x1c3e, 0x1c3e], /* LEPCHA PUNCTUATION TSHOOK CER-WA */
- [0x1c3f, 0x1c3f], /* LEPCHA PUNCTUATION TSHOOK */
- [0x1c40, 0x1c40], /* LEPCHA DIGIT ZERO */
- [0x1c41, 0x1c41], /* LEPCHA DIGIT ONE */
- [0x1c42, 0x1c42], /* LEPCHA DIGIT TWO */
- [0x1c43, 0x1c43], /* LEPCHA DIGIT THREE */
- [0x1c44, 0x1c44], /* LEPCHA DIGIT FOUR */
- [0x1c45, 0x1c45], /* LEPCHA DIGIT FIVE */
- [0x1c46, 0x1c46], /* LEPCHA DIGIT SIX */
- [0x1c47, 0x1c47], /* LEPCHA DIGIT SEVEN */
- [0x1c48, 0x1c48], /* LEPCHA DIGIT EIGHT */
- [0x1c49, 0x1c49], /* LEPCHA DIGIT NINE */
- [0x1c4a, 0x1c4a],
- [0x1c4b, 0x1c4b],
- [0x1c4c, 0x1c4c],
- [0x1c4d, 0x1c4d], /* LEPCHA LETTER TTA */
- [0x1c4e, 0x1c4e], /* LEPCHA LETTER TTHA */
- [0x1c4f, 0x1c4f], /* LEPCHA LETTER DDA */
- [0x1c50, 0x1c50], /* OL CHIKI DIGIT ZERO */
- [0x1c51, 0x1c51], /* OL CHIKI DIGIT ONE */
- [0x1c52, 0x1c52], /* OL CHIKI DIGIT TWO */
- [0x1c53, 0x1c53], /* OL CHIKI DIGIT THREE */
- [0x1c54, 0x1c54], /* OL CHIKI DIGIT FOUR */
- [0x1c55, 0x1c55], /* OL CHIKI DIGIT FIVE */
- [0x1c56, 0x1c56], /* OL CHIKI DIGIT SIX */
- [0x1c57, 0x1c57], /* OL CHIKI DIGIT SEVEN */
- [0x1c58, 0x1c58], /* OL CHIKI DIGIT EIGHT */
- [0x1c59, 0x1c59], /* OL CHIKI DIGIT NINE */
- [0x1c5a, 0x1c5a], /* OL CHIKI LETTER LA */
- [0x1c5b, 0x1c5b], /* OL CHIKI LETTER AT */
- [0x1c5c, 0x1c5c], /* OL CHIKI LETTER AG */
- [0x1c5d, 0x1c5d], /* OL CHIKI LETTER ANG */
- [0x1c5e, 0x1c5e], /* OL CHIKI LETTER AL */
- [0x1c5f, 0x1c5f], /* OL CHIKI LETTER LAA */
- [0x1c60, 0x1c60], /* OL CHIKI LETTER AAK */
- [0x1c61, 0x1c61], /* OL CHIKI LETTER AAJ */
- [0x1c62, 0x1c62], /* OL CHIKI LETTER AAM */
- [0x1c63, 0x1c63], /* OL CHIKI LETTER AAW */
- [0x1c64, 0x1c64], /* OL CHIKI LETTER LI */
- [0x1c65, 0x1c65], /* OL CHIKI LETTER IS */
- [0x1c66, 0x1c66], /* OL CHIKI LETTER IH */
- [0x1c67, 0x1c67], /* OL CHIKI LETTER INY */
- [0x1c68, 0x1c68], /* OL CHIKI LETTER IR */
- [0x1c69, 0x1c69], /* OL CHIKI LETTER LU */
- [0x1c6a, 0x1c6a], /* OL CHIKI LETTER UC */
- [0x1c6b, 0x1c6b], /* OL CHIKI LETTER UD */
- [0x1c6c, 0x1c6c], /* OL CHIKI LETTER UNN */
- [0x1c6d, 0x1c6d], /* OL CHIKI LETTER UY */
- [0x1c6e, 0x1c6e], /* OL CHIKI LETTER LE */
- [0x1c6f, 0x1c6f], /* OL CHIKI LETTER EP */
- [0x1c70, 0x1c70], /* OL CHIKI LETTER EDD */
- [0x1c71, 0x1c71], /* OL CHIKI LETTER EN */
- [0x1c72, 0x1c72], /* OL CHIKI LETTER ERR */
- [0x1c73, 0x1c73], /* OL CHIKI LETTER LO */
- [0x1c74, 0x1c74], /* OL CHIKI LETTER OTT */
- [0x1c75, 0x1c75], /* OL CHIKI LETTER OB */
- [0x1c76, 0x1c76], /* OL CHIKI LETTER OV */
- [0x1c77, 0x1c77], /* OL CHIKI LETTER OH */
- [0x1c78, 0x1c78], /* OL CHIKI MU TTUDDAG */
- [0x1c79, 0x1c79], /* OL CHIKI GAAHLAA TTUDDAAG */
- [0x1c7a, 0x1c7a], /* OL CHIKI MU-GAAHLAA TTUDDAAG */
- [0x1c7b, 0x1c7b], /* OL CHIKI RELAA */
- [0x1c7c, 0x1c7c], /* OL CHIKI PHAARKAA */
- [0x1c7d, 0x1c7d], /* OL CHIKI AHAD */
- [0x1c7e, 0x1c7e], /* OL CHIKI PUNCTUATION MUCAAD */
- [0x1c7f, 0x1c7f], /* OL CHIKI PUNCTUATION DOUBLE MUCAAD */
- [0x412, 0x1c80], /* CYRILLIC SMALL LETTER ROUNDED VE */
- [0x414, 0x1c81], /* CYRILLIC SMALL LETTER LONG-LEGGED DE */
- [0x41e, 0x1c82], /* CYRILLIC SMALL LETTER NARROW O */
- [0x421, 0x1c83], /* CYRILLIC SMALL LETTER WIDE ES */
- [0x422, 0x1c84], /* CYRILLIC SMALL LETTER TALL TE */
- [0x422, 0x1c85], /* CYRILLIC SMALL LETTER THREE-LEGGED TE */
- [0x42a, 0x1c86], /* CYRILLIC SMALL LETTER TALL HARD SIGN */
- [0x462, 0x1c87], /* CYRILLIC SMALL LETTER TALL YAT */
- [0xa64a, 0x1c88], /* CYRILLIC SMALL LETTER UNBLENDED UK */
- [0x1c89, 0x1c89],
- [0x1c8a, 0x1c8a],
- [0x1c8b, 0x1c8b],
- [0x1c8c, 0x1c8c],
- [0x1c8d, 0x1c8d],
- [0x1c8e, 0x1c8e],
- [0x1c8f, 0x1c8f],
- [0x1c90, 0x10d0], /* GEORGIAN MTAVRULI CAPITAL LETTER AN */
- [0x1c91, 0x10d1], /* GEORGIAN MTAVRULI CAPITAL LETTER BAN */
- [0x1c92, 0x10d2], /* GEORGIAN MTAVRULI CAPITAL LETTER GAN */
- [0x1c93, 0x10d3], /* GEORGIAN MTAVRULI CAPITAL LETTER DON */
- [0x1c94, 0x10d4], /* GEORGIAN MTAVRULI CAPITAL LETTER EN */
- [0x1c95, 0x10d5], /* GEORGIAN MTAVRULI CAPITAL LETTER VIN */
- [0x1c96, 0x10d6], /* GEORGIAN MTAVRULI CAPITAL LETTER ZEN */
- [0x1c97, 0x10d7], /* GEORGIAN MTAVRULI CAPITAL LETTER TAN */
- [0x1c98, 0x10d8], /* GEORGIAN MTAVRULI CAPITAL LETTER IN */
- [0x1c99, 0x10d9], /* GEORGIAN MTAVRULI CAPITAL LETTER KAN */
- [0x1c9a, 0x10da], /* GEORGIAN MTAVRULI CAPITAL LETTER LAS */
- [0x1c9b, 0x10db], /* GEORGIAN MTAVRULI CAPITAL LETTER MAN */
- [0x1c9c, 0x10dc], /* GEORGIAN MTAVRULI CAPITAL LETTER NAR */
- [0x1c9d, 0x10dd], /* GEORGIAN MTAVRULI CAPITAL LETTER ON */
- [0x1c9e, 0x10de], /* GEORGIAN MTAVRULI CAPITAL LETTER PAR */
- [0x1c9f, 0x10df], /* GEORGIAN MTAVRULI CAPITAL LETTER ZHAR */
- [0x1ca0, 0x10e0], /* GEORGIAN MTAVRULI CAPITAL LETTER RAE */
- [0x1ca1, 0x10e1], /* GEORGIAN MTAVRULI CAPITAL LETTER SAN */
- [0x1ca2, 0x10e2], /* GEORGIAN MTAVRULI CAPITAL LETTER TAR */
- [0x1ca3, 0x10e3], /* GEORGIAN MTAVRULI CAPITAL LETTER UN */
- [0x1ca4, 0x10e4], /* GEORGIAN MTAVRULI CAPITAL LETTER PHAR */
- [0x1ca5, 0x10e5], /* GEORGIAN MTAVRULI CAPITAL LETTER KHAR */
- [0x1ca6, 0x10e6], /* GEORGIAN MTAVRULI CAPITAL LETTER GHAN */
- [0x1ca7, 0x10e7], /* GEORGIAN MTAVRULI CAPITAL LETTER QAR */
- [0x1ca8, 0x10e8], /* GEORGIAN MTAVRULI CAPITAL LETTER SHIN */
- [0x1ca9, 0x10e9], /* GEORGIAN MTAVRULI CAPITAL LETTER CHIN */
- [0x1caa, 0x10ea], /* GEORGIAN MTAVRULI CAPITAL LETTER CAN */
- [0x1cab, 0x10eb], /* GEORGIAN MTAVRULI CAPITAL LETTER JIL */
- [0x1cac, 0x10ec], /* GEORGIAN MTAVRULI CAPITAL LETTER CIL */
- [0x1cad, 0x10ed], /* GEORGIAN MTAVRULI CAPITAL LETTER CHAR */
- [0x1cae, 0x10ee], /* GEORGIAN MTAVRULI CAPITAL LETTER XAN */
- [0x1caf, 0x10ef], /* GEORGIAN MTAVRULI CAPITAL LETTER JHAN */
- [0x1cb0, 0x10f0], /* GEORGIAN MTAVRULI CAPITAL LETTER HAE */
- [0x1cb1, 0x10f1], /* GEORGIAN MTAVRULI CAPITAL LETTER HE */
- [0x1cb2, 0x10f2], /* GEORGIAN MTAVRULI CAPITAL LETTER HIE */
- [0x1cb3, 0x10f3], /* GEORGIAN MTAVRULI CAPITAL LETTER WE */
- [0x1cb4, 0x10f4], /* GEORGIAN MTAVRULI CAPITAL LETTER HAR */
- [0x1cb5, 0x10f5], /* GEORGIAN MTAVRULI CAPITAL LETTER HOE */
- [0x1cb6, 0x10f6], /* GEORGIAN MTAVRULI CAPITAL LETTER FI */
- [0x1cb7, 0x10f7], /* GEORGIAN MTAVRULI CAPITAL LETTER YN */
- [0x1cb8, 0x10f8], /* GEORGIAN MTAVRULI CAPITAL LETTER ELIFI */
- [0x1cb9, 0x10f9], /* GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN */
- [0x1cba, 0x10fa], /* GEORGIAN MTAVRULI CAPITAL LETTER AIN */
- [0x1cbb, 0x1cbb],
- [0x1cbc, 0x1cbc],
- [0x1cbd, 0x10fd], /* GEORGIAN MTAVRULI CAPITAL LETTER AEN */
- [0x1cbe, 0x10fe], /* GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN */
- [0x1cbf, 0x10ff], /* GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN */
- [0x1cc0, 0x1cc0], /* SUNDANESE PUNCTUATION BINDU SURYA */
- [0x1cc1, 0x1cc1], /* SUNDANESE PUNCTUATION BINDU PANGLONG */
- [0x1cc2, 0x1cc2], /* SUNDANESE PUNCTUATION BINDU PURNAMA */
- [0x1cc3, 0x1cc3], /* SUNDANESE PUNCTUATION BINDU CAKRA */
- [0x1cc4, 0x1cc4], /* SUNDANESE PUNCTUATION BINDU LEU SATANGA */
- [0x1cc5, 0x1cc5], /* SUNDANESE PUNCTUATION BINDU KA SATANGA */
- [0x1cc6, 0x1cc6], /* SUNDANESE PUNCTUATION BINDU DA SATANGA */
- [0x1cc7, 0x1cc7], /* SUNDANESE PUNCTUATION BINDU BA SATANGA */
- [0x1cc8, 0x1cc8],
- [0x1cc9, 0x1cc9],
- [0x1cca, 0x1cca],
- [0x1ccb, 0x1ccb],
- [0x1ccc, 0x1ccc],
- [0x1ccd, 0x1ccd],
- [0x1cce, 0x1cce],
- [0x1ccf, 0x1ccf],
- [0x1cd0, 0x1cd0], /* VEDIC TONE KARSHANA */
- [0x1cd1, 0x1cd1], /* VEDIC TONE SHARA */
- [0x1cd2, 0x1cd2], /* VEDIC TONE PRENKHA */
- [0x1cd3, 0x1cd3], /* VEDIC SIGN NIHSHVASA */
- [0x1cd4, 0x1cd4], /* VEDIC SIGN YAJURVEDIC MIDLINE SVARITA */
- [0x1cd5, 0x1cd5], /* VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA */
- [0x1cd6, 0x1cd6], /* VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA */
- [0x1cd7, 0x1cd7], /* VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA */
- [0x1cd8, 0x1cd8], /* VEDIC TONE CANDRA BELOW */
- [0x1cd9, 0x1cd9], /* VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER */
- [0x1cda, 0x1cda], /* VEDIC TONE DOUBLE SVARITA */
- [0x1cdb, 0x1cdb], /* VEDIC TONE TRIPLE SVARITA */
- [0x1cdc, 0x1cdc], /* VEDIC TONE KATHAKA ANUDATTA */
- [0x1cdd, 0x1cdd], /* VEDIC TONE DOT BELOW */
- [0x1cde, 0x1cde], /* VEDIC TONE TWO DOTS BELOW */
- [0x1cdf, 0x1cdf], /* VEDIC TONE THREE DOTS BELOW */
- [0x1ce0, 0x1ce0], /* VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA */
- [0x1ce1, 0x1ce1], /* VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA */
- [0x1ce2, 0x1ce2], /* VEDIC SIGN VISARGA SVARITA */
- [0x1ce3, 0x1ce3], /* VEDIC SIGN VISARGA UDATTA */
- [0x1ce4, 0x1ce4], /* VEDIC SIGN REVERSED VISARGA UDATTA */
- [0x1ce5, 0x1ce5], /* VEDIC SIGN VISARGA ANUDATTA */
- [0x1ce6, 0x1ce6], /* VEDIC SIGN REVERSED VISARGA ANUDATTA */
- [0x1ce7, 0x1ce7], /* VEDIC SIGN VISARGA UDATTA WITH TAIL */
- [0x1ce8, 0x1ce8], /* VEDIC SIGN VISARGA ANUDATTA WITH TAIL */
- [0x1ce9, 0x1ce9], /* VEDIC SIGN ANUSVARA ANTARGOMUKHA */
- [0x1cea, 0x1cea], /* VEDIC SIGN ANUSVARA BAHIRGOMUKHA */
- [0x1ceb, 0x1ceb], /* VEDIC SIGN ANUSVARA VAMAGOMUKHA */
- [0x1cec, 0x1cec], /* VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL */
- [0x1ced, 0x1ced], /* VEDIC SIGN TIRYAK */
- [0x1cee, 0x1cee], /* VEDIC SIGN HEXIFORM LONG ANUSVARA */
- [0x1cef, 0x1cef], /* VEDIC SIGN LONG ANUSVARA */
- [0x1cf0, 0x1cf0], /* VEDIC SIGN RTHANG LONG ANUSVARA */
- [0x1cf1, 0x1cf1], /* VEDIC SIGN ANUSVARA UBHAYATO MUKHA */
- [0x1cf2, 0x1cf2], /* VEDIC SIGN ARDHAVISARGA */
- [0x1cf3, 0x1cf3], /* VEDIC SIGN ROTATED ARDHAVISARGA */
- [0x1cf4, 0x1cf4], /* VEDIC TONE CANDRA ABOVE */
- [0x1cf5, 0x1cf5], /* VEDIC SIGN JIHVAMULIYA */
- [0x1cf6, 0x1cf6], /* VEDIC SIGN UPADHMANIYA */
- [0x1cf7, 0x1cf7], /* VEDIC SIGN ATIKRAMA */
- [0x1cf8, 0x1cf8], /* VEDIC TONE RING ABOVE */
- [0x1cf9, 0x1cf9], /* VEDIC TONE DOUBLE RING ABOVE */
- [0x1cfa, 0x1cfa],
- [0x1cfb, 0x1cfb],
- [0x1cfc, 0x1cfc],
- [0x1cfd, 0x1cfd],
- [0x1cfe, 0x1cfe],
- [0x1cff, 0x1cff],
- [0x1d00, 0x1d00], /* LATIN LETTER SMALL CAPITAL A */
- [0x1d01, 0x1d01], /* LATIN LETTER SMALL CAPITAL AE */
- [0x1d02, 0x1d02], /* LATIN SMALL LETTER TURNED AE */
- [0x1d03, 0x1d03], /* LATIN LETTER SMALL CAPITAL BARRED B */
- [0x1d04, 0x1d04], /* LATIN LETTER SMALL CAPITAL C */
- [0x1d05, 0x1d05], /* LATIN LETTER SMALL CAPITAL D */
- [0x1d06, 0x1d06], /* LATIN LETTER SMALL CAPITAL ETH */
- [0x1d07, 0x1d07], /* LATIN LETTER SMALL CAPITAL E */
- [0x1d08, 0x1d08], /* LATIN SMALL LETTER TURNED OPEN E */
- [0x1d09, 0x1d09], /* LATIN SMALL LETTER TURNED I */
- [0x1d0a, 0x1d0a], /* LATIN LETTER SMALL CAPITAL J */
- [0x1d0b, 0x1d0b], /* LATIN LETTER SMALL CAPITAL K */
- [0x1d0c, 0x1d0c], /* LATIN LETTER SMALL CAPITAL L WITH STROKE */
- [0x1d0d, 0x1d0d], /* LATIN LETTER SMALL CAPITAL M */
- [0x1d0e, 0x1d0e], /* LATIN LETTER SMALL CAPITAL REVERSED N */
- [0x1d0f, 0x1d0f], /* LATIN LETTER SMALL CAPITAL O */
- [0x1d10, 0x1d10], /* LATIN LETTER SMALL CAPITAL OPEN O */
- [0x1d11, 0x1d11], /* LATIN SMALL LETTER SIDEWAYS O */
- [0x1d12, 0x1d12], /* LATIN SMALL LETTER SIDEWAYS OPEN O */
- [0x1d13, 0x1d13], /* LATIN SMALL LETTER SIDEWAYS O WITH STROKE */
- [0x1d14, 0x1d14], /* LATIN SMALL LETTER TURNED OE */
- [0x1d15, 0x1d15], /* LATIN LETTER SMALL CAPITAL OU */
- [0x1d16, 0x1d16], /* LATIN SMALL LETTER TOP HALF O */
- [0x1d17, 0x1d17], /* LATIN SMALL LETTER BOTTOM HALF O */
- [0x1d18, 0x1d18], /* LATIN LETTER SMALL CAPITAL P */
- [0x1d19, 0x1d19], /* LATIN LETTER SMALL CAPITAL REVERSED R */
- [0x1d1a, 0x1d1a], /* LATIN LETTER SMALL CAPITAL TURNED R */
- [0x1d1b, 0x1d1b], /* LATIN LETTER SMALL CAPITAL T */
- [0x1d1c, 0x1d1c], /* LATIN LETTER SMALL CAPITAL U */
- [0x1d1d, 0x1d1d], /* LATIN SMALL LETTER SIDEWAYS U */
- [0x1d1e, 0x1d1e], /* LATIN SMALL LETTER SIDEWAYS DIAERESIZED U */
- [0x1d1f, 0x1d1f], /* LATIN SMALL LETTER SIDEWAYS TURNED M */
- [0x1d20, 0x1d20], /* LATIN LETTER SMALL CAPITAL V */
- [0x1d21, 0x1d21], /* LATIN LETTER SMALL CAPITAL W */
- [0x1d22, 0x1d22], /* LATIN LETTER SMALL CAPITAL Z */
- [0x1d23, 0x1d23], /* LATIN LETTER SMALL CAPITAL EZH */
- [0x1d24, 0x1d24], /* LATIN LETTER VOICED LARYNGEAL SPIRANT */
- [0x1d25, 0x1d25], /* LATIN LETTER AIN */
- [0x1d26, 0x1d26], /* GREEK LETTER SMALL CAPITAL GAMMA */
- [0x1d27, 0x1d27], /* GREEK LETTER SMALL CAPITAL LAMDA */
- [0x1d28, 0x1d28], /* GREEK LETTER SMALL CAPITAL PI */
- [0x1d29, 0x1d29], /* GREEK LETTER SMALL CAPITAL RHO */
- [0x1d2a, 0x1d2a], /* GREEK LETTER SMALL CAPITAL PSI */
- [0x1d2b, 0x1d2b], /* CYRILLIC LETTER SMALL CAPITAL EL */
- [0x1d2c, 0x1d2c], /* MODIFIER LETTER CAPITAL A */
- [0x1d2d, 0x1d2d], /* MODIFIER LETTER CAPITAL AE */
- [0x1d2e, 0x1d2e], /* MODIFIER LETTER CAPITAL B */
- [0x1d2f, 0x1d2f], /* MODIFIER LETTER CAPITAL BARRED B */
- [0x1d30, 0x1d30], /* MODIFIER LETTER CAPITAL D */
- [0x1d31, 0x1d31], /* MODIFIER LETTER CAPITAL E */
- [0x1d32, 0x1d32], /* MODIFIER LETTER CAPITAL REVERSED E */
- [0x1d33, 0x1d33], /* MODIFIER LETTER CAPITAL G */
- [0x1d34, 0x1d34], /* MODIFIER LETTER CAPITAL H */
- [0x1d35, 0x1d35], /* MODIFIER LETTER CAPITAL I */
- [0x1d36, 0x1d36], /* MODIFIER LETTER CAPITAL J */
- [0x1d37, 0x1d37], /* MODIFIER LETTER CAPITAL K */
- [0x1d38, 0x1d38], /* MODIFIER LETTER CAPITAL L */
- [0x1d39, 0x1d39], /* MODIFIER LETTER CAPITAL M */
- [0x1d3a, 0x1d3a], /* MODIFIER LETTER CAPITAL N */
- [0x1d3b, 0x1d3b], /* MODIFIER LETTER CAPITAL REVERSED N */
- [0x1d3c, 0x1d3c], /* MODIFIER LETTER CAPITAL O */
- [0x1d3d, 0x1d3d], /* MODIFIER LETTER CAPITAL OU */
- [0x1d3e, 0x1d3e], /* MODIFIER LETTER CAPITAL P */
- [0x1d3f, 0x1d3f], /* MODIFIER LETTER CAPITAL R */
- [0x1d40, 0x1d40], /* MODIFIER LETTER CAPITAL T */
- [0x1d41, 0x1d41], /* MODIFIER LETTER CAPITAL U */
- [0x1d42, 0x1d42], /* MODIFIER LETTER CAPITAL W */
- [0x1d43, 0x1d43], /* MODIFIER LETTER SMALL A */
- [0x1d44, 0x1d44], /* MODIFIER LETTER SMALL TURNED A */
- [0x1d45, 0x1d45], /* MODIFIER LETTER SMALL ALPHA */
- [0x1d46, 0x1d46], /* MODIFIER LETTER SMALL TURNED AE */
- [0x1d47, 0x1d47], /* MODIFIER LETTER SMALL B */
- [0x1d48, 0x1d48], /* MODIFIER LETTER SMALL D */
- [0x1d49, 0x1d49], /* MODIFIER LETTER SMALL E */
- [0x1d4a, 0x1d4a], /* MODIFIER LETTER SMALL SCHWA */
- [0x1d4b, 0x1d4b], /* MODIFIER LETTER SMALL OPEN E */
- [0x1d4c, 0x1d4c], /* MODIFIER LETTER SMALL TURNED OPEN E */
- [0x1d4d, 0x1d4d], /* MODIFIER LETTER SMALL G */
- [0x1d4e, 0x1d4e], /* MODIFIER LETTER SMALL TURNED I */
- [0x1d4f, 0x1d4f], /* MODIFIER LETTER SMALL K */
- [0x1d50, 0x1d50], /* MODIFIER LETTER SMALL M */
- [0x1d51, 0x1d51], /* MODIFIER LETTER SMALL ENG */
- [0x1d52, 0x1d52], /* MODIFIER LETTER SMALL O */
- [0x1d53, 0x1d53], /* MODIFIER LETTER SMALL OPEN O */
- [0x1d54, 0x1d54], /* MODIFIER LETTER SMALL TOP HALF O */
- [0x1d55, 0x1d55], /* MODIFIER LETTER SMALL BOTTOM HALF O */
- [0x1d56, 0x1d56], /* MODIFIER LETTER SMALL P */
- [0x1d57, 0x1d57], /* MODIFIER LETTER SMALL T */
- [0x1d58, 0x1d58], /* MODIFIER LETTER SMALL U */
- [0x1d59, 0x1d59], /* MODIFIER LETTER SMALL SIDEWAYS U */
- [0x1d5a, 0x1d5a], /* MODIFIER LETTER SMALL TURNED M */
- [0x1d5b, 0x1d5b], /* MODIFIER LETTER SMALL V */
- [0x1d5c, 0x1d5c], /* MODIFIER LETTER SMALL AIN */
- [0x1d5d, 0x1d5d], /* MODIFIER LETTER SMALL BETA */
- [0x1d5e, 0x1d5e], /* MODIFIER LETTER SMALL GREEK GAMMA */
- [0x1d5f, 0x1d5f], /* MODIFIER LETTER SMALL DELTA */
- [0x1d60, 0x1d60], /* MODIFIER LETTER SMALL GREEK PHI */
- [0x1d61, 0x1d61], /* MODIFIER LETTER SMALL CHI */
- [0x1d62, 0x1d62], /* LATIN SUBSCRIPT SMALL LETTER I */
- [0x1d63, 0x1d63], /* LATIN SUBSCRIPT SMALL LETTER R */
- [0x1d64, 0x1d64], /* LATIN SUBSCRIPT SMALL LETTER U */
- [0x1d65, 0x1d65], /* LATIN SUBSCRIPT SMALL LETTER V */
- [0x1d66, 0x1d66], /* GREEK SUBSCRIPT SMALL LETTER BETA */
- [0x1d67, 0x1d67], /* GREEK SUBSCRIPT SMALL LETTER GAMMA */
- [0x1d68, 0x1d68], /* GREEK SUBSCRIPT SMALL LETTER RHO */
- [0x1d69, 0x1d69], /* GREEK SUBSCRIPT SMALL LETTER PHI */
- [0x1d6a, 0x1d6a], /* GREEK SUBSCRIPT SMALL LETTER CHI */
- [0x1d6b, 0x1d6b], /* LATIN SMALL LETTER UE */
- [0x1d6c, 0x1d6c], /* LATIN SMALL LETTER B WITH MIDDLE TILDE */
- [0x1d6d, 0x1d6d], /* LATIN SMALL LETTER D WITH MIDDLE TILDE */
- [0x1d6e, 0x1d6e], /* LATIN SMALL LETTER F WITH MIDDLE TILDE */
- [0x1d6f, 0x1d6f], /* LATIN SMALL LETTER M WITH MIDDLE TILDE */
- [0x1d70, 0x1d70], /* LATIN SMALL LETTER N WITH MIDDLE TILDE */
- [0x1d71, 0x1d71], /* LATIN SMALL LETTER P WITH MIDDLE TILDE */
- [0x1d72, 0x1d72], /* LATIN SMALL LETTER R WITH MIDDLE TILDE */
- [0x1d73, 0x1d73], /* LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE */
- [0x1d74, 0x1d74], /* LATIN SMALL LETTER S WITH MIDDLE TILDE */
- [0x1d75, 0x1d75], /* LATIN SMALL LETTER T WITH MIDDLE TILDE */
- [0x1d76, 0x1d76], /* LATIN SMALL LETTER Z WITH MIDDLE TILDE */
- [0x1d77, 0x1d77], /* LATIN SMALL LETTER TURNED G */
- [0x1d78, 0x1d78], /* MODIFIER LETTER CYRILLIC EN */
- [0xa77d, 0x1d79], /* LATIN SMALL LETTER INSULAR G */
- [0x1d7a, 0x1d7a], /* LATIN SMALL LETTER TH WITH STRIKETHROUGH */
- [0x1d7b, 0x1d7b], /* LATIN SMALL CAPITAL LETTER I WITH STROKE */
- [0x1d7c, 0x1d7c], /* LATIN SMALL LETTER IOTA WITH STROKE */
- [0x2c63, 0x1d7d], /* LATIN SMALL LETTER P WITH STROKE */
- [0x1d7e, 0x1d7e], /* LATIN SMALL CAPITAL LETTER U WITH STROKE */
- [0x1d7f, 0x1d7f], /* LATIN SMALL LETTER UPSILON WITH STROKE */
- [0x1d80, 0x1d80], /* LATIN SMALL LETTER B WITH PALATAL HOOK */
- [0x1d81, 0x1d81], /* LATIN SMALL LETTER D WITH PALATAL HOOK */
- [0x1d82, 0x1d82], /* LATIN SMALL LETTER F WITH PALATAL HOOK */
- [0x1d83, 0x1d83], /* LATIN SMALL LETTER G WITH PALATAL HOOK */
- [0x1d84, 0x1d84], /* LATIN SMALL LETTER K WITH PALATAL HOOK */
- [0x1d85, 0x1d85], /* LATIN SMALL LETTER L WITH PALATAL HOOK */
- [0x1d86, 0x1d86], /* LATIN SMALL LETTER M WITH PALATAL HOOK */
- [0x1d87, 0x1d87], /* LATIN SMALL LETTER N WITH PALATAL HOOK */
- [0x1d88, 0x1d88], /* LATIN SMALL LETTER P WITH PALATAL HOOK */
- [0x1d89, 0x1d89], /* LATIN SMALL LETTER R WITH PALATAL HOOK */
- [0x1d8a, 0x1d8a], /* LATIN SMALL LETTER S WITH PALATAL HOOK */
- [0x1d8b, 0x1d8b], /* LATIN SMALL LETTER ESH WITH PALATAL HOOK */
- [0x1d8c, 0x1d8c], /* LATIN SMALL LETTER V WITH PALATAL HOOK */
- [0x1d8d, 0x1d8d], /* LATIN SMALL LETTER X WITH PALATAL HOOK */
- [0x1d8e, 0x1d8e], /* LATIN SMALL LETTER Z WITH PALATAL HOOK */
- [0x1d8f, 0x1d8f], /* LATIN SMALL LETTER A WITH RETROFLEX HOOK */
- [0x1d90, 0x1d90], /* LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK */
- [0x1d91, 0x1d91], /* LATIN SMALL LETTER D WITH HOOK AND TAIL */
- [0x1d92, 0x1d92], /* LATIN SMALL LETTER E WITH RETROFLEX HOOK */
- [0x1d93, 0x1d93], /* LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK */
- [0x1d94, 0x1d94], /* LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK */
- [0x1d95, 0x1d95], /* LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK */
- [0x1d96, 0x1d96], /* LATIN SMALL LETTER I WITH RETROFLEX HOOK */
- [0x1d97, 0x1d97], /* LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK */
- [0x1d98, 0x1d98], /* LATIN SMALL LETTER ESH WITH RETROFLEX HOOK */
- [0x1d99, 0x1d99], /* LATIN SMALL LETTER U WITH RETROFLEX HOOK */
- [0x1d9a, 0x1d9a], /* LATIN SMALL LETTER EZH WITH RETROFLEX HOOK */
- [0x1d9b, 0x1d9b], /* MODIFIER LETTER SMALL TURNED ALPHA */
- [0x1d9c, 0x1d9c], /* MODIFIER LETTER SMALL C */
- [0x1d9d, 0x1d9d], /* MODIFIER LETTER SMALL C WITH CURL */
- [0x1d9e, 0x1d9e], /* MODIFIER LETTER SMALL ETH */
- [0x1d9f, 0x1d9f], /* MODIFIER LETTER SMALL REVERSED OPEN E */
- [0x1da0, 0x1da0], /* MODIFIER LETTER SMALL F */
- [0x1da1, 0x1da1], /* MODIFIER LETTER SMALL DOTLESS J WITH STROKE */
- [0x1da2, 0x1da2], /* MODIFIER LETTER SMALL SCRIPT G */
- [0x1da3, 0x1da3], /* MODIFIER LETTER SMALL TURNED H */
- [0x1da4, 0x1da4], /* MODIFIER LETTER SMALL I WITH STROKE */
- [0x1da5, 0x1da5], /* MODIFIER LETTER SMALL IOTA */
- [0x1da6, 0x1da6], /* MODIFIER LETTER SMALL CAPITAL I */
- [0x1da7, 0x1da7], /* MODIFIER LETTER SMALL CAPITAL I WITH STROKE */
- [0x1da8, 0x1da8], /* MODIFIER LETTER SMALL J WITH CROSSED-TAIL */
- [0x1da9, 0x1da9], /* MODIFIER LETTER SMALL L WITH RETROFLEX HOOK */
- [0x1daa, 0x1daa], /* MODIFIER LETTER SMALL L WITH PALATAL HOOK */
- [0x1dab, 0x1dab], /* MODIFIER LETTER SMALL CAPITAL L */
- [0x1dac, 0x1dac], /* MODIFIER LETTER SMALL M WITH HOOK */
- [0x1dad, 0x1dad], /* MODIFIER LETTER SMALL TURNED M WITH LONG LEG */
- [0x1dae, 0x1dae], /* MODIFIER LETTER SMALL N WITH LEFT HOOK */
- [0x1daf, 0x1daf], /* MODIFIER LETTER SMALL N WITH RETROFLEX HOOK */
- [0x1db0, 0x1db0], /* MODIFIER LETTER SMALL CAPITAL N */
- [0x1db1, 0x1db1], /* MODIFIER LETTER SMALL BARRED O */
- [0x1db2, 0x1db2], /* MODIFIER LETTER SMALL PHI */
- [0x1db3, 0x1db3], /* MODIFIER LETTER SMALL S WITH HOOK */
- [0x1db4, 0x1db4], /* MODIFIER LETTER SMALL ESH */
- [0x1db5, 0x1db5], /* MODIFIER LETTER SMALL T WITH PALATAL HOOK */
- [0x1db6, 0x1db6], /* MODIFIER LETTER SMALL U BAR */
- [0x1db7, 0x1db7], /* MODIFIER LETTER SMALL UPSILON */
- [0x1db8, 0x1db8], /* MODIFIER LETTER SMALL CAPITAL U */
- [0x1db9, 0x1db9], /* MODIFIER LETTER SMALL V WITH HOOK */
- [0x1dba, 0x1dba], /* MODIFIER LETTER SMALL TURNED V */
- [0x1dbb, 0x1dbb], /* MODIFIER LETTER SMALL Z */
- [0x1dbc, 0x1dbc], /* MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK */
- [0x1dbd, 0x1dbd], /* MODIFIER LETTER SMALL Z WITH CURL */
- [0x1dbe, 0x1dbe], /* MODIFIER LETTER SMALL EZH */
- [0x1dbf, 0x1dbf], /* MODIFIER LETTER SMALL THETA */
- [0x1dc0, 0x1dc0], /* COMBINING DOTTED GRAVE ACCENT */
- [0x1dc1, 0x1dc1], /* COMBINING DOTTED ACUTE ACCENT */
- [0x1dc2, 0x1dc2], /* COMBINING SNAKE BELOW */
- [0x1dc3, 0x1dc3], /* COMBINING SUSPENSION MARK */
- [0x1dc4, 0x1dc4], /* COMBINING MACRON-ACUTE */
- [0x1dc5, 0x1dc5], /* COMBINING GRAVE-MACRON */
- [0x1dc6, 0x1dc6], /* COMBINING MACRON-GRAVE */
- [0x1dc7, 0x1dc7], /* COMBINING ACUTE-MACRON */
- [0x1dc8, 0x1dc8], /* COMBINING GRAVE-ACUTE-GRAVE */
- [0x1dc9, 0x1dc9], /* COMBINING ACUTE-GRAVE-ACUTE */
- [0x1dca, 0x1dca], /* COMBINING LATIN SMALL LETTER R BELOW */
- [0x1dcb, 0x1dcb], /* COMBINING BREVE-MACRON */
- [0x1dcc, 0x1dcc], /* COMBINING MACRON-BREVE */
- [0x1dcd, 0x1dcd], /* COMBINING DOUBLE CIRCUMFLEX ABOVE */
- [0x1dce, 0x1dce], /* COMBINING OGONEK ABOVE */
- [0x1dcf, 0x1dcf], /* COMBINING ZIGZAG BELOW */
- [0x1dd0, 0x1dd0], /* COMBINING IS BELOW */
- [0x1dd1, 0x1dd1], /* COMBINING UR ABOVE */
- [0x1dd2, 0x1dd2], /* COMBINING US ABOVE */
- [0x1dd3, 0x1dd3], /* COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE */
- [0x1dd4, 0x1dd4], /* COMBINING LATIN SMALL LETTER AE */
- [0x1dd5, 0x1dd5], /* COMBINING LATIN SMALL LETTER AO */
- [0x1dd6, 0x1dd6], /* COMBINING LATIN SMALL LETTER AV */
- [0x1dd7, 0x1dd7], /* COMBINING LATIN SMALL LETTER C CEDILLA */
- [0x1dd8, 0x1dd8], /* COMBINING LATIN SMALL LETTER INSULAR D */
- [0x1dd9, 0x1dd9], /* COMBINING LATIN SMALL LETTER ETH */
- [0x1dda, 0x1dda], /* COMBINING LATIN SMALL LETTER G */
- [0x1ddb, 0x1ddb], /* COMBINING LATIN LETTER SMALL CAPITAL G */
- [0x1ddc, 0x1ddc], /* COMBINING LATIN SMALL LETTER K */
- [0x1ddd, 0x1ddd], /* COMBINING LATIN SMALL LETTER L */
- [0x1dde, 0x1dde], /* COMBINING LATIN LETTER SMALL CAPITAL L */
- [0x1ddf, 0x1ddf], /* COMBINING LATIN LETTER SMALL CAPITAL M */
- [0x1de0, 0x1de0], /* COMBINING LATIN SMALL LETTER N */
- [0x1de1, 0x1de1], /* COMBINING LATIN LETTER SMALL CAPITAL N */
- [0x1de2, 0x1de2], /* COMBINING LATIN LETTER SMALL CAPITAL R */
- [0x1de3, 0x1de3], /* COMBINING LATIN SMALL LETTER R ROTUNDA */
- [0x1de4, 0x1de4], /* COMBINING LATIN SMALL LETTER S */
- [0x1de5, 0x1de5], /* COMBINING LATIN SMALL LETTER LONG S */
- [0x1de6, 0x1de6], /* COMBINING LATIN SMALL LETTER Z */
- [0x1de7, 0x1de7], /* COMBINING LATIN SMALL LETTER ALPHA */
- [0x1de8, 0x1de8], /* COMBINING LATIN SMALL LETTER B */
- [0x1de9, 0x1de9], /* COMBINING LATIN SMALL LETTER BETA */
- [0x1dea, 0x1dea], /* COMBINING LATIN SMALL LETTER SCHWA */
- [0x1deb, 0x1deb], /* COMBINING LATIN SMALL LETTER F */
- [0x1dec, 0x1dec], /* COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */
- [0x1ded, 0x1ded], /* COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE */
- [0x1dee, 0x1dee], /* COMBINING LATIN SMALL LETTER P */
- [0x1def, 0x1def], /* COMBINING LATIN SMALL LETTER ESH */
- [0x1df0, 0x1df0], /* COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE */
- [0x1df1, 0x1df1], /* COMBINING LATIN SMALL LETTER W */
- [0x1df2, 0x1df2], /* COMBINING LATIN SMALL LETTER A WITH DIAERESIS */
- [0x1df3, 0x1df3], /* COMBINING LATIN SMALL LETTER O WITH DIAERESIS */
- [0x1df4, 0x1df4], /* COMBINING LATIN SMALL LETTER U WITH DIAERESIS */
- [0x1df5, 0x1df5], /* COMBINING UP TACK ABOVE */
- [0x1df6, 0x1df6], /* COMBINING KAVYKA ABOVE RIGHT */
- [0x1df7, 0x1df7], /* COMBINING KAVYKA ABOVE LEFT */
- [0x1df8, 0x1df8], /* COMBINING DOT ABOVE LEFT */
- [0x1df9, 0x1df9], /* COMBINING WIDE INVERTED BRIDGE BELOW */
- [0x1dfa, 0x1dfa],
- [0x1dfb, 0x1dfb], /* COMBINING DELETION MARK */
- [0x1dfc, 0x1dfc], /* COMBINING DOUBLE INVERTED BREVE BELOW */
- [0x1dfd, 0x1dfd], /* COMBINING ALMOST EQUAL TO BELOW */
- [0x1dfe, 0x1dfe], /* COMBINING LEFT ARROWHEAD ABOVE */
- [0x1dff, 0x1dff], /* COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW */
- [0x1e00, 0x1e01], /* LATIN CAPITAL LETTER A WITH RING BELOW */
- [0x1e00, 0x1e01], /* LATIN SMALL LETTER A WITH RING BELOW */
- [0x1e02, 0x1e03], /* LATIN CAPITAL LETTER B WITH DOT ABOVE */
- [0x1e02, 0x1e03], /* LATIN SMALL LETTER B WITH DOT ABOVE */
- [0x1e04, 0x1e05], /* LATIN CAPITAL LETTER B WITH DOT BELOW */
- [0x1e04, 0x1e05], /* LATIN SMALL LETTER B WITH DOT BELOW */
- [0x1e06, 0x1e07], /* LATIN CAPITAL LETTER B WITH LINE BELOW */
- [0x1e06, 0x1e07], /* LATIN SMALL LETTER B WITH LINE BELOW */
- [0x1e08, 0x1e09], /* LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */
- [0x1e08, 0x1e09], /* LATIN SMALL LETTER C WITH CEDILLA AND ACUTE */
- [0x1e0a, 0x1e0b], /* LATIN CAPITAL LETTER D WITH DOT ABOVE */
- [0x1e0a, 0x1e0b], /* LATIN SMALL LETTER D WITH DOT ABOVE */
- [0x1e0c, 0x1e0d], /* LATIN CAPITAL LETTER D WITH DOT BELOW */
- [0x1e0c, 0x1e0d], /* LATIN SMALL LETTER D WITH DOT BELOW */
- [0x1e0e, 0x1e0f], /* LATIN CAPITAL LETTER D WITH LINE BELOW */
- [0x1e0e, 0x1e0f], /* LATIN SMALL LETTER D WITH LINE BELOW */
- [0x1e10, 0x1e11], /* LATIN CAPITAL LETTER D WITH CEDILLA */
- [0x1e10, 0x1e11], /* LATIN SMALL LETTER D WITH CEDILLA */
- [0x1e12, 0x1e13], /* LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW */
- [0x1e12, 0x1e13], /* LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW */
- [0x1e14, 0x1e15], /* LATIN CAPITAL LETTER E WITH MACRON AND GRAVE */
- [0x1e14, 0x1e15], /* LATIN SMALL LETTER E WITH MACRON AND GRAVE */
- [0x1e16, 0x1e17], /* LATIN CAPITAL LETTER E WITH MACRON AND ACUTE */
- [0x1e16, 0x1e17], /* LATIN SMALL LETTER E WITH MACRON AND ACUTE */
- [0x1e18, 0x1e19], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW */
- [0x1e18, 0x1e19], /* LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW */
- [0x1e1a, 0x1e1b], /* LATIN CAPITAL LETTER E WITH TILDE BELOW */
- [0x1e1a, 0x1e1b], /* LATIN SMALL LETTER E WITH TILDE BELOW */
- [0x1e1c, 0x1e1d], /* LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE */
- [0x1e1c, 0x1e1d], /* LATIN SMALL LETTER E WITH CEDILLA AND BREVE */
- [0x1e1e, 0x1e1f], /* LATIN CAPITAL LETTER F WITH DOT ABOVE */
- [0x1e1e, 0x1e1f], /* LATIN SMALL LETTER F WITH DOT ABOVE */
- [0x1e20, 0x1e21], /* LATIN CAPITAL LETTER G WITH MACRON */
- [0x1e20, 0x1e21], /* LATIN SMALL LETTER G WITH MACRON */
- [0x1e22, 0x1e23], /* LATIN CAPITAL LETTER H WITH DOT ABOVE */
- [0x1e22, 0x1e23], /* LATIN SMALL LETTER H WITH DOT ABOVE */
- [0x1e24, 0x1e25], /* LATIN CAPITAL LETTER H WITH DOT BELOW */
- [0x1e24, 0x1e25], /* LATIN SMALL LETTER H WITH DOT BELOW */
- [0x1e26, 0x1e27], /* LATIN CAPITAL LETTER H WITH DIAERESIS */
- [0x1e26, 0x1e27], /* LATIN SMALL LETTER H WITH DIAERESIS */
- [0x1e28, 0x1e29], /* LATIN CAPITAL LETTER H WITH CEDILLA */
- [0x1e28, 0x1e29], /* LATIN SMALL LETTER H WITH CEDILLA */
- [0x1e2a, 0x1e2b], /* LATIN CAPITAL LETTER H WITH BREVE BELOW */
- [0x1e2a, 0x1e2b], /* LATIN SMALL LETTER H WITH BREVE BELOW */
- [0x1e2c, 0x1e2d], /* LATIN CAPITAL LETTER I WITH TILDE BELOW */
- [0x1e2c, 0x1e2d], /* LATIN SMALL LETTER I WITH TILDE BELOW */
- [0x1e2e, 0x1e2f], /* LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE */
- [0x1e2e, 0x1e2f], /* LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE */
- [0x1e30, 0x1e31], /* LATIN CAPITAL LETTER K WITH ACUTE */
- [0x1e30, 0x1e31], /* LATIN SMALL LETTER K WITH ACUTE */
- [0x1e32, 0x1e33], /* LATIN CAPITAL LETTER K WITH DOT BELOW */
- [0x1e32, 0x1e33], /* LATIN SMALL LETTER K WITH DOT BELOW */
- [0x1e34, 0x1e35], /* LATIN CAPITAL LETTER K WITH LINE BELOW */
- [0x1e34, 0x1e35], /* LATIN SMALL LETTER K WITH LINE BELOW */
- [0x1e36, 0x1e37], /* LATIN CAPITAL LETTER L WITH DOT BELOW */
- [0x1e36, 0x1e37], /* LATIN SMALL LETTER L WITH DOT BELOW */
- [0x1e38, 0x1e39], /* LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON */
- [0x1e38, 0x1e39], /* LATIN SMALL LETTER L WITH DOT BELOW AND MACRON */
- [0x1e3a, 0x1e3b], /* LATIN CAPITAL LETTER L WITH LINE BELOW */
- [0x1e3a, 0x1e3b], /* LATIN SMALL LETTER L WITH LINE BELOW */
- [0x1e3c, 0x1e3d], /* LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW */
- [0x1e3c, 0x1e3d], /* LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW */
- [0x1e3e, 0x1e3f], /* LATIN CAPITAL LETTER M WITH ACUTE */
- [0x1e3e, 0x1e3f], /* LATIN SMALL LETTER M WITH ACUTE */
- [0x1e40, 0x1e41], /* LATIN CAPITAL LETTER M WITH DOT ABOVE */
- [0x1e40, 0x1e41], /* LATIN SMALL LETTER M WITH DOT ABOVE */
- [0x1e42, 0x1e43], /* LATIN CAPITAL LETTER M WITH DOT BELOW */
- [0x1e42, 0x1e43], /* LATIN SMALL LETTER M WITH DOT BELOW */
- [0x1e44, 0x1e45], /* LATIN CAPITAL LETTER N WITH DOT ABOVE */
- [0x1e44, 0x1e45], /* LATIN SMALL LETTER N WITH DOT ABOVE */
- [0x1e46, 0x1e47], /* LATIN CAPITAL LETTER N WITH DOT BELOW */
- [0x1e46, 0x1e47], /* LATIN SMALL LETTER N WITH DOT BELOW */
- [0x1e48, 0x1e49], /* LATIN CAPITAL LETTER N WITH LINE BELOW */
- [0x1e48, 0x1e49], /* LATIN SMALL LETTER N WITH LINE BELOW */
- [0x1e4a, 0x1e4b], /* LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW */
- [0x1e4a, 0x1e4b], /* LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW */
- [0x1e4c, 0x1e4d], /* LATIN CAPITAL LETTER O WITH TILDE AND ACUTE */
- [0x1e4c, 0x1e4d], /* LATIN SMALL LETTER O WITH TILDE AND ACUTE */
- [0x1e4e, 0x1e4f], /* LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS */
- [0x1e4e, 0x1e4f], /* LATIN SMALL LETTER O WITH TILDE AND DIAERESIS */
- [0x1e50, 0x1e51], /* LATIN CAPITAL LETTER O WITH MACRON AND GRAVE */
- [0x1e50, 0x1e51], /* LATIN SMALL LETTER O WITH MACRON AND GRAVE */
- [0x1e52, 0x1e53], /* LATIN CAPITAL LETTER O WITH MACRON AND ACUTE */
- [0x1e52, 0x1e53], /* LATIN SMALL LETTER O WITH MACRON AND ACUTE */
- [0x1e54, 0x1e55], /* LATIN CAPITAL LETTER P WITH ACUTE */
- [0x1e54, 0x1e55], /* LATIN SMALL LETTER P WITH ACUTE */
- [0x1e56, 0x1e57], /* LATIN CAPITAL LETTER P WITH DOT ABOVE */
- [0x1e56, 0x1e57], /* LATIN SMALL LETTER P WITH DOT ABOVE */
- [0x1e58, 0x1e59], /* LATIN CAPITAL LETTER R WITH DOT ABOVE */
- [0x1e58, 0x1e59], /* LATIN SMALL LETTER R WITH DOT ABOVE */
- [0x1e5a, 0x1e5b], /* LATIN CAPITAL LETTER R WITH DOT BELOW */
- [0x1e5a, 0x1e5b], /* LATIN SMALL LETTER R WITH DOT BELOW */
- [0x1e5c, 0x1e5d], /* LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON */
- [0x1e5c, 0x1e5d], /* LATIN SMALL LETTER R WITH DOT BELOW AND MACRON */
- [0x1e5e, 0x1e5f], /* LATIN CAPITAL LETTER R WITH LINE BELOW */
- [0x1e5e, 0x1e5f], /* LATIN SMALL LETTER R WITH LINE BELOW */
- [0x1e60, 0x1e61], /* LATIN CAPITAL LETTER S WITH DOT ABOVE */
- [0x1e60, 0x1e61], /* LATIN SMALL LETTER S WITH DOT ABOVE */
- [0x1e62, 0x1e63], /* LATIN CAPITAL LETTER S WITH DOT BELOW */
- [0x1e62, 0x1e63], /* LATIN SMALL LETTER S WITH DOT BELOW */
- [0x1e64, 0x1e65], /* LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE */
- [0x1e64, 0x1e65], /* LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE */
- [0x1e66, 0x1e67], /* LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE */
- [0x1e66, 0x1e67], /* LATIN SMALL LETTER S WITH CARON AND DOT ABOVE */
- [0x1e68, 0x1e69], /* LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE */
- [0x1e68, 0x1e69], /* LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE */
- [0x1e6a, 0x1e6b], /* LATIN CAPITAL LETTER T WITH DOT ABOVE */
- [0x1e6a, 0x1e6b], /* LATIN SMALL LETTER T WITH DOT ABOVE */
- [0x1e6c, 0x1e6d], /* LATIN CAPITAL LETTER T WITH DOT BELOW */
- [0x1e6c, 0x1e6d], /* LATIN SMALL LETTER T WITH DOT BELOW */
- [0x1e6e, 0x1e6f], /* LATIN CAPITAL LETTER T WITH LINE BELOW */
- [0x1e6e, 0x1e6f], /* LATIN SMALL LETTER T WITH LINE BELOW */
- [0x1e70, 0x1e71], /* LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW */
- [0x1e70, 0x1e71], /* LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW */
- [0x1e72, 0x1e73], /* LATIN CAPITAL LETTER U WITH DIAERESIS BELOW */
- [0x1e72, 0x1e73], /* LATIN SMALL LETTER U WITH DIAERESIS BELOW */
- [0x1e74, 0x1e75], /* LATIN CAPITAL LETTER U WITH TILDE BELOW */
- [0x1e74, 0x1e75], /* LATIN SMALL LETTER U WITH TILDE BELOW */
- [0x1e76, 0x1e77], /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW */
- [0x1e76, 0x1e77], /* LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW */
- [0x1e78, 0x1e79], /* LATIN CAPITAL LETTER U WITH TILDE AND ACUTE */
- [0x1e78, 0x1e79], /* LATIN SMALL LETTER U WITH TILDE AND ACUTE */
- [0x1e7a, 0x1e7b], /* LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS */
- [0x1e7a, 0x1e7b], /* LATIN SMALL LETTER U WITH MACRON AND DIAERESIS */
- [0x1e7c, 0x1e7d], /* LATIN CAPITAL LETTER V WITH TILDE */
- [0x1e7c, 0x1e7d], /* LATIN SMALL LETTER V WITH TILDE */
- [0x1e7e, 0x1e7f], /* LATIN CAPITAL LETTER V WITH DOT BELOW */
- [0x1e7e, 0x1e7f], /* LATIN SMALL LETTER V WITH DOT BELOW */
- [0x1e80, 0x1e81], /* LATIN CAPITAL LETTER W WITH GRAVE */
- [0x1e80, 0x1e81], /* LATIN SMALL LETTER W WITH GRAVE */
- [0x1e82, 0x1e83], /* LATIN CAPITAL LETTER W WITH ACUTE */
- [0x1e82, 0x1e83], /* LATIN SMALL LETTER W WITH ACUTE */
- [0x1e84, 0x1e85], /* LATIN CAPITAL LETTER W WITH DIAERESIS */
- [0x1e84, 0x1e85], /* LATIN SMALL LETTER W WITH DIAERESIS */
- [0x1e86, 0x1e87], /* LATIN CAPITAL LETTER W WITH DOT ABOVE */
- [0x1e86, 0x1e87], /* LATIN SMALL LETTER W WITH DOT ABOVE */
- [0x1e88, 0x1e89], /* LATIN CAPITAL LETTER W WITH DOT BELOW */
- [0x1e88, 0x1e89], /* LATIN SMALL LETTER W WITH DOT BELOW */
- [0x1e8a, 0x1e8b], /* LATIN CAPITAL LETTER X WITH DOT ABOVE */
- [0x1e8a, 0x1e8b], /* LATIN SMALL LETTER X WITH DOT ABOVE */
- [0x1e8c, 0x1e8d], /* LATIN CAPITAL LETTER X WITH DIAERESIS */
- [0x1e8c, 0x1e8d], /* LATIN SMALL LETTER X WITH DIAERESIS */
- [0x1e8e, 0x1e8f], /* LATIN CAPITAL LETTER Y WITH DOT ABOVE */
- [0x1e8e, 0x1e8f], /* LATIN SMALL LETTER Y WITH DOT ABOVE */
- [0x1e90, 0x1e91], /* LATIN CAPITAL LETTER Z WITH CIRCUMFLEX */
- [0x1e90, 0x1e91], /* LATIN SMALL LETTER Z WITH CIRCUMFLEX */
- [0x1e92, 0x1e93], /* LATIN CAPITAL LETTER Z WITH DOT BELOW */
- [0x1e92, 0x1e93], /* LATIN SMALL LETTER Z WITH DOT BELOW */
- [0x1e94, 0x1e95], /* LATIN CAPITAL LETTER Z WITH LINE BELOW */
- [0x1e94, 0x1e95], /* LATIN SMALL LETTER Z WITH LINE BELOW */
- [0x1e96, 0x1e96], /* LATIN SMALL LETTER H WITH LINE BELOW */
- [0x1e97, 0x1e97], /* LATIN SMALL LETTER T WITH DIAERESIS */
- [0x1e98, 0x1e98], /* LATIN SMALL LETTER W WITH RING ABOVE */
- [0x1e99, 0x1e99], /* LATIN SMALL LETTER Y WITH RING ABOVE */
- [0x1e9a, 0x1e9a], /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
- [0x1e60, 0x1e9b], /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */
- [0x1e9c, 0x1e9c], /* LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE */
- [0x1e9d, 0x1e9d], /* LATIN SMALL LETTER LONG S WITH HIGH STROKE */
- [0x1e9e, 0xdf], /* LATIN CAPITAL LETTER SHARP S */
- [0x1e9f, 0x1e9f], /* LATIN SMALL LETTER DELTA */
- [0x1ea0, 0x1ea1], /* LATIN CAPITAL LETTER A WITH DOT BELOW */
- [0x1ea0, 0x1ea1], /* LATIN SMALL LETTER A WITH DOT BELOW */
- [0x1ea2, 0x1ea3], /* LATIN CAPITAL LETTER A WITH HOOK ABOVE */
- [0x1ea2, 0x1ea3], /* LATIN SMALL LETTER A WITH HOOK ABOVE */
- [0x1ea4, 0x1ea5], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */
- [0x1ea4, 0x1ea5], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */
- [0x1ea6, 0x1ea7], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */
- [0x1ea6, 0x1ea7], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */
- [0x1ea8, 0x1ea9], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
- [0x1ea8, 0x1ea9], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
- [0x1eaa, 0x1eab], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */
- [0x1eaa, 0x1eab], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */
- [0x1eac, 0x1ead], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
- [0x1eac, 0x1ead], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
- [0x1eae, 0x1eaf], /* LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */
- [0x1eae, 0x1eaf], /* LATIN SMALL LETTER A WITH BREVE AND ACUTE */
- [0x1eb0, 0x1eb1], /* LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */
- [0x1eb0, 0x1eb1], /* LATIN SMALL LETTER A WITH BREVE AND GRAVE */
- [0x1eb2, 0x1eb3], /* LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */
- [0x1eb2, 0x1eb3], /* LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */
- [0x1eb4, 0x1eb5], /* LATIN CAPITAL LETTER A WITH BREVE AND TILDE */
- [0x1eb4, 0x1eb5], /* LATIN SMALL LETTER A WITH BREVE AND TILDE */
- [0x1eb6, 0x1eb7], /* LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */
- [0x1eb6, 0x1eb7], /* LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */
- [0x1eb8, 0x1eb9], /* LATIN CAPITAL LETTER E WITH DOT BELOW */
- [0x1eb8, 0x1eb9], /* LATIN SMALL LETTER E WITH DOT BELOW */
- [0x1eba, 0x1ebb], /* LATIN CAPITAL LETTER E WITH HOOK ABOVE */
- [0x1eba, 0x1ebb], /* LATIN SMALL LETTER E WITH HOOK ABOVE */
- [0x1ebc, 0x1ebd], /* LATIN CAPITAL LETTER E WITH TILDE */
- [0x1ebc, 0x1ebd], /* LATIN SMALL LETTER E WITH TILDE */
- [0x1ebe, 0x1ebf], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */
- [0x1ebe, 0x1ebf], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */
- [0x1ec0, 0x1ec1], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */
- [0x1ec0, 0x1ec1], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */
- [0x1ec2, 0x1ec3], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
- [0x1ec2, 0x1ec3], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
- [0x1ec4, 0x1ec5], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */
- [0x1ec4, 0x1ec5], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */
- [0x1ec6, 0x1ec7], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
- [0x1ec6, 0x1ec7], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
- [0x1ec8, 0x1ec9], /* LATIN CAPITAL LETTER I WITH HOOK ABOVE */
- [0x1ec8, 0x1ec9], /* LATIN SMALL LETTER I WITH HOOK ABOVE */
- [0x1eca, 0x1ecb], /* LATIN CAPITAL LETTER I WITH DOT BELOW */
- [0x1eca, 0x1ecb], /* LATIN SMALL LETTER I WITH DOT BELOW */
- [0x1ecc, 0x1ecd], /* LATIN CAPITAL LETTER O WITH DOT BELOW */
- [0x1ecc, 0x1ecd], /* LATIN SMALL LETTER O WITH DOT BELOW */
- [0x1ece, 0x1ecf], /* LATIN CAPITAL LETTER O WITH HOOK ABOVE */
- [0x1ece, 0x1ecf], /* LATIN SMALL LETTER O WITH HOOK ABOVE */
- [0x1ed0, 0x1ed1], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */
- [0x1ed0, 0x1ed1], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */
- [0x1ed2, 0x1ed3], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */
- [0x1ed2, 0x1ed3], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */
- [0x1ed4, 0x1ed5], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
- [0x1ed4, 0x1ed5], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
- [0x1ed6, 0x1ed7], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */
- [0x1ed6, 0x1ed7], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */
- [0x1ed8, 0x1ed9], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
- [0x1ed8, 0x1ed9], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
- [0x1eda, 0x1edb], /* LATIN CAPITAL LETTER O WITH HORN AND ACUTE */
- [0x1eda, 0x1edb], /* LATIN SMALL LETTER O WITH HORN AND ACUTE */
- [0x1edc, 0x1edd], /* LATIN CAPITAL LETTER O WITH HORN AND GRAVE */
- [0x1edc, 0x1edd], /* LATIN SMALL LETTER O WITH HORN AND GRAVE */
- [0x1ede, 0x1edf], /* LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */
- [0x1ede, 0x1edf], /* LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */
- [0x1ee0, 0x1ee1], /* LATIN CAPITAL LETTER O WITH HORN AND TILDE */
- [0x1ee0, 0x1ee1], /* LATIN SMALL LETTER O WITH HORN AND TILDE */
- [0x1ee2, 0x1ee3], /* LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */
- [0x1ee2, 0x1ee3], /* LATIN SMALL LETTER O WITH HORN AND DOT BELOW */
- [0x1ee4, 0x1ee5], /* LATIN CAPITAL LETTER U WITH DOT BELOW */
- [0x1ee4, 0x1ee5], /* LATIN SMALL LETTER U WITH DOT BELOW */
- [0x1ee6, 0x1ee7], /* LATIN CAPITAL LETTER U WITH HOOK ABOVE */
- [0x1ee6, 0x1ee7], /* LATIN SMALL LETTER U WITH HOOK ABOVE */
- [0x1ee8, 0x1ee9], /* LATIN CAPITAL LETTER U WITH HORN AND ACUTE */
- [0x1ee8, 0x1ee9], /* LATIN SMALL LETTER U WITH HORN AND ACUTE */
- [0x1eea, 0x1eeb], /* LATIN CAPITAL LETTER U WITH HORN AND GRAVE */
- [0x1eea, 0x1eeb], /* LATIN SMALL LETTER U WITH HORN AND GRAVE */
- [0x1eec, 0x1eed], /* LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */
- [0x1eec, 0x1eed], /* LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */
- [0x1eee, 0x1eef], /* LATIN CAPITAL LETTER U WITH HORN AND TILDE */
- [0x1eee, 0x1eef], /* LATIN SMALL LETTER U WITH HORN AND TILDE */
- [0x1ef0, 0x1ef1], /* LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */
- [0x1ef0, 0x1ef1], /* LATIN SMALL LETTER U WITH HORN AND DOT BELOW */
- [0x1ef2, 0x1ef3], /* LATIN CAPITAL LETTER Y WITH GRAVE */
- [0x1ef2, 0x1ef3], /* LATIN SMALL LETTER Y WITH GRAVE */
- [0x1ef4, 0x1ef5], /* LATIN CAPITAL LETTER Y WITH DOT BELOW */
- [0x1ef4, 0x1ef5], /* LATIN SMALL LETTER Y WITH DOT BELOW */
- [0x1ef6, 0x1ef7], /* LATIN CAPITAL LETTER Y WITH HOOK ABOVE */
- [0x1ef6, 0x1ef7], /* LATIN SMALL LETTER Y WITH HOOK ABOVE */
- [0x1ef8, 0x1ef9], /* LATIN CAPITAL LETTER Y WITH TILDE */
- [0x1ef8, 0x1ef9], /* LATIN SMALL LETTER Y WITH TILDE */
- [0x1efa, 0x1efb], /* LATIN CAPITAL LETTER MIDDLE-WELSH LL */
- [0x1efa, 0x1efb], /* LATIN SMALL LETTER MIDDLE-WELSH LL */
- [0x1efc, 0x1efd], /* LATIN CAPITAL LETTER MIDDLE-WELSH V */
- [0x1efc, 0x1efd], /* LATIN SMALL LETTER MIDDLE-WELSH V */
- [0x1efe, 0x1eff], /* LATIN CAPITAL LETTER Y WITH LOOP */
- [0x1efe, 0x1eff], /* LATIN SMALL LETTER Y WITH LOOP */
- [0x1f08, 0x1f00], /* GREEK SMALL LETTER ALPHA WITH PSILI */
- [0x1f09, 0x1f01], /* GREEK SMALL LETTER ALPHA WITH DASIA */
- [0x1f0a, 0x1f02], /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA */
- [0x1f0b, 0x1f03], /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA */
- [0x1f0c, 0x1f04], /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA */
- [0x1f0d, 0x1f05], /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA */
- [0x1f0e, 0x1f06], /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI */
- [0x1f0f, 0x1f07], /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI */
- [0x1f08, 0x1f00], /* GREEK CAPITAL LETTER ALPHA WITH PSILI */
- [0x1f09, 0x1f01], /* GREEK CAPITAL LETTER ALPHA WITH DASIA */
- [0x1f0a, 0x1f02], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA */
- [0x1f0b, 0x1f03], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA */
- [0x1f0c, 0x1f04], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA */
- [0x1f0d, 0x1f05], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA */
- [0x1f0e, 0x1f06], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI */
- [0x1f0f, 0x1f07], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI */
- [0x1f18, 0x1f10], /* GREEK SMALL LETTER EPSILON WITH PSILI */
- [0x1f19, 0x1f11], /* GREEK SMALL LETTER EPSILON WITH DASIA */
- [0x1f1a, 0x1f12], /* GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA */
- [0x1f1b, 0x1f13], /* GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA */
- [0x1f1c, 0x1f14], /* GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA */
- [0x1f1d, 0x1f15], /* GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA */
- [0x1f16, 0x1f16],
- [0x1f17, 0x1f17],
- [0x1f18, 0x1f10], /* GREEK CAPITAL LETTER EPSILON WITH PSILI */
- [0x1f19, 0x1f11], /* GREEK CAPITAL LETTER EPSILON WITH DASIA */
- [0x1f1a, 0x1f12], /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA */
- [0x1f1b, 0x1f13], /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA */
- [0x1f1c, 0x1f14], /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA */
- [0x1f1d, 0x1f15], /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA */
- [0x1f1e, 0x1f1e],
- [0x1f1f, 0x1f1f],
- [0x1f28, 0x1f20], /* GREEK SMALL LETTER ETA WITH PSILI */
- [0x1f29, 0x1f21], /* GREEK SMALL LETTER ETA WITH DASIA */
- [0x1f2a, 0x1f22], /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA */
- [0x1f2b, 0x1f23], /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA */
- [0x1f2c, 0x1f24], /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA */
- [0x1f2d, 0x1f25], /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA */
- [0x1f2e, 0x1f26], /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI */
- [0x1f2f, 0x1f27], /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI */
- [0x1f28, 0x1f20], /* GREEK CAPITAL LETTER ETA WITH PSILI */
- [0x1f29, 0x1f21], /* GREEK CAPITAL LETTER ETA WITH DASIA */
- [0x1f2a, 0x1f22], /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA */
- [0x1f2b, 0x1f23], /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA */
- [0x1f2c, 0x1f24], /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA */
- [0x1f2d, 0x1f25], /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA */
- [0x1f2e, 0x1f26], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI */
- [0x1f2f, 0x1f27], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI */
- [0x1f38, 0x1f30], /* GREEK SMALL LETTER IOTA WITH PSILI */
- [0x1f39, 0x1f31], /* GREEK SMALL LETTER IOTA WITH DASIA */
- [0x1f3a, 0x1f32], /* GREEK SMALL LETTER IOTA WITH PSILI AND VARIA */
- [0x1f3b, 0x1f33], /* GREEK SMALL LETTER IOTA WITH DASIA AND VARIA */
- [0x1f3c, 0x1f34], /* GREEK SMALL LETTER IOTA WITH PSILI AND OXIA */
- [0x1f3d, 0x1f35], /* GREEK SMALL LETTER IOTA WITH DASIA AND OXIA */
- [0x1f3e, 0x1f36], /* GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI */
- [0x1f3f, 0x1f37], /* GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI */
- [0x1f38, 0x1f30], /* GREEK CAPITAL LETTER IOTA WITH PSILI */
- [0x1f39, 0x1f31], /* GREEK CAPITAL LETTER IOTA WITH DASIA */
- [0x1f3a, 0x1f32], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA */
- [0x1f3b, 0x1f33], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA */
- [0x1f3c, 0x1f34], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA */
- [0x1f3d, 0x1f35], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA */
- [0x1f3e, 0x1f36], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI */
- [0x1f3f, 0x1f37], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI */
- [0x1f48, 0x1f40], /* GREEK SMALL LETTER OMICRON WITH PSILI */
- [0x1f49, 0x1f41], /* GREEK SMALL LETTER OMICRON WITH DASIA */
- [0x1f4a, 0x1f42], /* GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA */
- [0x1f4b, 0x1f43], /* GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA */
- [0x1f4c, 0x1f44], /* GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA */
- [0x1f4d, 0x1f45], /* GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA */
- [0x1f46, 0x1f46],
- [0x1f47, 0x1f47],
- [0x1f48, 0x1f40], /* GREEK CAPITAL LETTER OMICRON WITH PSILI */
- [0x1f49, 0x1f41], /* GREEK CAPITAL LETTER OMICRON WITH DASIA */
- [0x1f4a, 0x1f42], /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA */
- [0x1f4b, 0x1f43], /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA */
- [0x1f4c, 0x1f44], /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA */
- [0x1f4d, 0x1f45], /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA */
- [0x1f4e, 0x1f4e],
- [0x1f4f, 0x1f4f],
- [0x1f50, 0x1f50], /* GREEK SMALL LETTER UPSILON WITH PSILI */
- [0x1f59, 0x1f51], /* GREEK SMALL LETTER UPSILON WITH DASIA */
- [0x1f52, 0x1f52], /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
- [0x1f5b, 0x1f53], /* GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA */
- [0x1f54, 0x1f54], /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
- [0x1f5d, 0x1f55], /* GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA */
- [0x1f56, 0x1f56], /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
- [0x1f5f, 0x1f57], /* GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI */
- [0x1f58, 0x1f58],
- [0x1f59, 0x1f51], /* GREEK CAPITAL LETTER UPSILON WITH DASIA */
- [0x1f5a, 0x1f5a],
- [0x1f5b, 0x1f53], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA */
- [0x1f5c, 0x1f5c],
- [0x1f5d, 0x1f55], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA */
- [0x1f5e, 0x1f5e],
- [0x1f5f, 0x1f57], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI */
- [0x1f68, 0x1f60], /* GREEK SMALL LETTER OMEGA WITH PSILI */
- [0x1f69, 0x1f61], /* GREEK SMALL LETTER OMEGA WITH DASIA */
- [0x1f6a, 0x1f62], /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA */
- [0x1f6b, 0x1f63], /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA */
- [0x1f6c, 0x1f64], /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA */
- [0x1f6d, 0x1f65], /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA */
- [0x1f6e, 0x1f66], /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI */
- [0x1f6f, 0x1f67], /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI */
- [0x1f68, 0x1f60], /* GREEK CAPITAL LETTER OMEGA WITH PSILI */
- [0x1f69, 0x1f61], /* GREEK CAPITAL LETTER OMEGA WITH DASIA */
- [0x1f6a, 0x1f62], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA */
- [0x1f6b, 0x1f63], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA */
- [0x1f6c, 0x1f64], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA */
- [0x1f6d, 0x1f65], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA */
- [0x1f6e, 0x1f66], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI */
- [0x1f6f, 0x1f67], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI */
- [0x1fba, 0x1f70], /* GREEK SMALL LETTER ALPHA WITH VARIA */
- [0x1fbb, 0x1f71], /* GREEK SMALL LETTER ALPHA WITH OXIA */
- [0x1fc8, 0x1f72], /* GREEK SMALL LETTER EPSILON WITH VARIA */
- [0x1fc9, 0x1f73], /* GREEK SMALL LETTER EPSILON WITH OXIA */
- [0x1fca, 0x1f74], /* GREEK SMALL LETTER ETA WITH VARIA */
- [0x1fcb, 0x1f75], /* GREEK SMALL LETTER ETA WITH OXIA */
- [0x1fda, 0x1f76], /* GREEK SMALL LETTER IOTA WITH VARIA */
- [0x1fdb, 0x1f77], /* GREEK SMALL LETTER IOTA WITH OXIA */
- [0x1ff8, 0x1f78], /* GREEK SMALL LETTER OMICRON WITH VARIA */
- [0x1ff9, 0x1f79], /* GREEK SMALL LETTER OMICRON WITH OXIA */
- [0x1fea, 0x1f7a], /* GREEK SMALL LETTER UPSILON WITH VARIA */
- [0x1feb, 0x1f7b], /* GREEK SMALL LETTER UPSILON WITH OXIA */
- [0x1ffa, 0x1f7c], /* GREEK SMALL LETTER OMEGA WITH VARIA */
- [0x1ffb, 0x1f7d], /* GREEK SMALL LETTER OMEGA WITH OXIA */
- [0x1f7e, 0x1f7e],
- [0x1f7f, 0x1f7f],
- [0x1f88, 0x1f80], /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
- [0x1f89, 0x1f81], /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
- [0x1f8a, 0x1f82], /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
- [0x1f8b, 0x1f83], /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
- [0x1f8c, 0x1f84], /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
- [0x1f8d, 0x1f85], /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
- [0x1f8e, 0x1f86], /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
- [0x1f8f, 0x1f87], /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
- [0x1f88, 0x1f80], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
- [0x1f89, 0x1f81], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
- [0x1f8a, 0x1f82], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
- [0x1f8b, 0x1f83], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
- [0x1f8c, 0x1f84], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
- [0x1f8d, 0x1f85], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
- [0x1f8e, 0x1f86], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
- [0x1f8f, 0x1f87], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
- [0x1f98, 0x1f90], /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
- [0x1f99, 0x1f91], /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
- [0x1f9a, 0x1f92], /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
- [0x1f9b, 0x1f93], /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
- [0x1f9c, 0x1f94], /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
- [0x1f9d, 0x1f95], /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
- [0x1f9e, 0x1f96], /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
- [0x1f9f, 0x1f97], /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
- [0x1f98, 0x1f90], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
- [0x1f99, 0x1f91], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
- [0x1f9a, 0x1f92], /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
- [0x1f9b, 0x1f93], /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
- [0x1f9c, 0x1f94], /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
- [0x1f9d, 0x1f95], /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
- [0x1f9e, 0x1f96], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
- [0x1f9f, 0x1f97], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
- [0x1fa8, 0x1fa0], /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
- [0x1fa9, 0x1fa1], /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
- [0x1faa, 0x1fa2], /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
- [0x1fab, 0x1fa3], /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
- [0x1fac, 0x1fa4], /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
- [0x1fad, 0x1fa5], /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
- [0x1fae, 0x1fa6], /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
- [0x1faf, 0x1fa7], /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
- [0x1fa8, 0x1fa0], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
- [0x1fa9, 0x1fa1], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
- [0x1faa, 0x1fa2], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
- [0x1fab, 0x1fa3], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
- [0x1fac, 0x1fa4], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
- [0x1fad, 0x1fa5], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
- [0x1fae, 0x1fa6], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
- [0x1faf, 0x1fa7], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
- [0x1fb8, 0x1fb0], /* GREEK SMALL LETTER ALPHA WITH VRACHY */
- [0x1fb9, 0x1fb1], /* GREEK SMALL LETTER ALPHA WITH MACRON */
- [0x1fb2, 0x1fb2], /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
- [0x1fbc, 0x1fb3], /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
- [0x1fb4, 0x1fb4], /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
- [0x1fb5, 0x1fb5],
- [0x1fb6, 0x1fb6], /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
- [0x1fb7, 0x1fb7], /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
- [0x1fb8, 0x1fb0], /* GREEK CAPITAL LETTER ALPHA WITH VRACHY */
- [0x1fb9, 0x1fb1], /* GREEK CAPITAL LETTER ALPHA WITH MACRON */
- [0x1fba, 0x1f70], /* GREEK CAPITAL LETTER ALPHA WITH VARIA */
- [0x1fbb, 0x1f71], /* GREEK CAPITAL LETTER ALPHA WITH OXIA */
- [0x1fbc, 0x1fb3], /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
- [0x1fbd, 0x1fbd], /* GREEK KORONIS */
- [0x399, 0x1fbe], /* GREEK PROSGEGRAMMENI */
- [0x1fbf, 0x1fbf], /* GREEK PSILI */
- [0x1fc0, 0x1fc0], /* GREEK PERISPOMENI */
- [0x1fc1, 0x1fc1], /* GREEK DIALYTIKA AND PERISPOMENI */
- [0x1fc2, 0x1fc2], /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
- [0x1fcc, 0x1fc3], /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
- [0x1fc4, 0x1fc4], /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
- [0x1fc5, 0x1fc5],
- [0x1fc6, 0x1fc6], /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
- [0x1fc7, 0x1fc7], /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
- [0x1fc8, 0x1f72], /* GREEK CAPITAL LETTER EPSILON WITH VARIA */
- [0x1fc9, 0x1f73], /* GREEK CAPITAL LETTER EPSILON WITH OXIA */
- [0x1fca, 0x1f74], /* GREEK CAPITAL LETTER ETA WITH VARIA */
- [0x1fcb, 0x1f75], /* GREEK CAPITAL LETTER ETA WITH OXIA */
- [0x1fcc, 0x1fc3], /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
- [0x1fcd, 0x1fcd], /* GREEK PSILI AND VARIA */
- [0x1fce, 0x1fce], /* GREEK PSILI AND OXIA */
- [0x1fcf, 0x1fcf], /* GREEK PSILI AND PERISPOMENI */
- [0x1fd8, 0x1fd0], /* GREEK SMALL LETTER IOTA WITH VRACHY */
- [0x1fd9, 0x1fd1], /* GREEK SMALL LETTER IOTA WITH MACRON */
- [0x1fd2, 0x1fd2], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
- [0x1fd3, 0x1fd3], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
- [0x1fd4, 0x1fd4],
- [0x1fd5, 0x1fd5],
- [0x1fd6, 0x1fd6], /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
- [0x1fd7, 0x1fd7], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
- [0x1fd8, 0x1fd0], /* GREEK CAPITAL LETTER IOTA WITH VRACHY */
- [0x1fd9, 0x1fd1], /* GREEK CAPITAL LETTER IOTA WITH MACRON */
- [0x1fda, 0x1f76], /* GREEK CAPITAL LETTER IOTA WITH VARIA */
- [0x1fdb, 0x1f77], /* GREEK CAPITAL LETTER IOTA WITH OXIA */
- [0x1fdc, 0x1fdc],
- [0x1fdd, 0x1fdd], /* GREEK DASIA AND VARIA */
- [0x1fde, 0x1fde], /* GREEK DASIA AND OXIA */
- [0x1fdf, 0x1fdf], /* GREEK DASIA AND PERISPOMENI */
- [0x1fe8, 0x1fe0], /* GREEK SMALL LETTER UPSILON WITH VRACHY */
- [0x1fe9, 0x1fe1], /* GREEK SMALL LETTER UPSILON WITH MACRON */
- [0x1fe2, 0x1fe2], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
- [0x1fe3, 0x1fe3], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
- [0x1fe4, 0x1fe4], /* GREEK SMALL LETTER RHO WITH PSILI */
- [0x1fec, 0x1fe5], /* GREEK SMALL LETTER RHO WITH DASIA */
- [0x1fe6, 0x1fe6], /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
- [0x1fe7, 0x1fe7], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
- [0x1fe8, 0x1fe0], /* GREEK CAPITAL LETTER UPSILON WITH VRACHY */
- [0x1fe9, 0x1fe1], /* GREEK CAPITAL LETTER UPSILON WITH MACRON */
- [0x1fea, 0x1f7a], /* GREEK CAPITAL LETTER UPSILON WITH VARIA */
- [0x1feb, 0x1f7b], /* GREEK CAPITAL LETTER UPSILON WITH OXIA */
- [0x1fec, 0x1fe5], /* GREEK CAPITAL LETTER RHO WITH DASIA */
- [0x1fed, 0x1fed], /* GREEK DIALYTIKA AND VARIA */
- [0x1fee, 0x1fee], /* GREEK DIALYTIKA AND OXIA */
- [0x1fef, 0x1fef], /* GREEK VARIA */
- [0x1ff0, 0x1ff0],
- [0x1ff1, 0x1ff1],
- [0x1ff2, 0x1ff2], /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
- [0x1ffc, 0x1ff3], /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
- [0x1ff4, 0x1ff4], /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
- [0x1ff5, 0x1ff5],
- [0x1ff6, 0x1ff6], /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
- [0x1ff7, 0x1ff7], /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
- [0x1ff8, 0x1f78], /* GREEK CAPITAL LETTER OMICRON WITH VARIA */
- [0x1ff9, 0x1f79], /* GREEK CAPITAL LETTER OMICRON WITH OXIA */
- [0x1ffa, 0x1f7c], /* GREEK CAPITAL LETTER OMEGA WITH VARIA */
- [0x1ffb, 0x1f7d], /* GREEK CAPITAL LETTER OMEGA WITH OXIA */
- [0x1ffc, 0x1ff3], /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
- [0x1ffd, 0x1ffd], /* GREEK OXIA */
- [0x1ffe, 0x1ffe], /* GREEK DASIA */
- [0x1fff, 0x1fff],
- [0x2000, 0x2000], /* EN QUAD */
- [0x2001, 0x2001], /* EM QUAD */
- [0x2002, 0x2002], /* EN SPACE */
- [0x2003, 0x2003], /* EM SPACE */
- [0x2004, 0x2004], /* THREE-PER-EM SPACE */
- [0x2005, 0x2005], /* FOUR-PER-EM SPACE */
- [0x2006, 0x2006], /* SIX-PER-EM SPACE */
- [0x2007, 0x2007], /* FIGURE SPACE */
- [0x2008, 0x2008], /* PUNCTUATION SPACE */
- [0x2009, 0x2009], /* THIN SPACE */
- [0x200a, 0x200a], /* HAIR SPACE */
- [0x200b, 0x200b], /* ZERO WIDTH SPACE */
- [0x200c, 0x200c], /* ZERO WIDTH NON-JOINER */
- [0x200d, 0x200d], /* ZERO WIDTH JOINER */
- [0x200e, 0x200e], /* LEFT-TO-RIGHT MARK */
- [0x200f, 0x200f], /* RIGHT-TO-LEFT MARK */
- [0x2010, 0x2010], /* HYPHEN */
- [0x2011, 0x2011], /* NON-BREAKING HYPHEN */
- [0x2012, 0x2012], /* FIGURE DASH */
- [0x2013, 0x2013], /* EN DASH */
- [0x2014, 0x2014], /* EM DASH */
- [0x2015, 0x2015], /* HORIZONTAL BAR (QUOTATION DASH) */
- [0x2016, 0x2016], /* DOUBLE VERTICAL LINE (DOUBLE VERTICAL BAR) */
- [0x2017, 0x2017], /* DOUBLE LOW LINE (SPACING DOUBLE UNDERSCORE) */
- [0x2018, 0x2018], /* LEFT SINGLE QUOTATION MARK (SINGLE TURNED COMMA QUOTATION MARK) */
- [0x2019, 0x2019], /* RIGHT SINGLE QUOTATION MARK (SINGLE COMMA QUOTATION MARK) */
- [0x201a, 0x201a], /* SINGLE LOW-9 QUOTATION MARK (LOW SINGLE COMMA QUOTATION MARK) */
- [0x201b, 0x201b], /* SINGLE HIGH-REVERSED-9 QUOTATION MARK (SINGLE REVERSED COMMA QUOTATION MARK) */
- [0x201c, 0x201c], /* LEFT DOUBLE QUOTATION MARK (DOUBLE TURNED COMMA QUOTATION MARK) */
- [0x201d, 0x201d], /* RIGHT DOUBLE QUOTATION MARK (DOUBLE COMMA QUOTATION MARK) */
- [0x201e, 0x201e], /* DOUBLE LOW-9 QUOTATION MARK (LOW DOUBLE COMMA QUOTATION MARK) */
- [0x201f, 0x201f], /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK (DOUBLE REVERSED COMMA QUOTATION MARK) */
- [0x2020, 0x2020], /* DAGGER */
- [0x2021, 0x2021], /* DOUBLE DAGGER */
- [0x2022, 0x2022], /* BULLET */
- [0x2023, 0x2023], /* TRIANGULAR BULLET */
- [0x2024, 0x2024], /* ONE DOT LEADER */
- [0x2025, 0x2025], /* TWO DOT LEADER */
- [0x2026, 0x2026], /* HORIZONTAL ELLIPSIS */
- [0x2027, 0x2027], /* HYPHENATION POINT */
- [0x2028, 0x2028], /* LINE SEPARATOR */
- [0x2029, 0x2029], /* PARAGRAPH SEPARATOR */
- [0x202a, 0x202a], /* LEFT-TO-RIGHT EMBEDDING */
- [0x202b, 0x202b], /* RIGHT-TO-LEFT EMBEDDING */
- [0x202c, 0x202c], /* POP DIRECTIONAL FORMATTING */
- [0x202d, 0x202d], /* LEFT-TO-RIGHT OVERRIDE */
- [0x202e, 0x202e], /* RIGHT-TO-LEFT OVERRIDE */
- [0x202f, 0x202f], /* NARROW NO-BREAK SPACE */
- [0x2030, 0x2030], /* PER MILLE SIGN */
- [0x2031, 0x2031], /* PER TEN THOUSAND SIGN */
- [0x2032, 0x2032], /* PRIME */
- [0x2033, 0x2033], /* DOUBLE PRIME */
- [0x2034, 0x2034], /* TRIPLE PRIME */
- [0x2035, 0x2035], /* REVERSED PRIME */
- [0x2036, 0x2036], /* REVERSED DOUBLE PRIME */
- [0x2037, 0x2037], /* REVERSED TRIPLE PRIME */
- [0x2038, 0x2038], /* CARET */
- [0x2039, 0x2039], /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK (LEFT POINTING SINGLE GUILLEMET) */
- [0x203a, 0x203a], /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (RIGHT POINTING SINGLE GUILLEMET) */
- [0x203b, 0x203b], /* REFERENCE MARK */
- [0x203c, 0x203c], /* DOUBLE EXCLAMATION MARK */
- [0x203d, 0x203d], /* INTERROBANG */
- [0x203e, 0x203e], /* OVERLINE (SPACING OVERSCORE) */
- [0x203f, 0x203f], /* UNDERTIE */
- [0x2040, 0x2040], /* CHARACTER TIE */
- [0x2041, 0x2041], /* CARET INSERTION POINT */
- [0x2042, 0x2042], /* ASTERISM */
- [0x2043, 0x2043], /* HYPHEN BULLET */
- [0x2044, 0x2044], /* FRACTION SLASH */
- [0x2045, 0x2045], /* LEFT SQUARE BRACKET WITH QUILL */
- [0x2046, 0x2046], /* RIGHT SQUARE BRACKET WITH QUILL */
- [0x2047, 0x2047], /* DOUBLE QUESTION MARK */
- [0x2048, 0x2048], /* QUESTION EXCLAMATION MARK */
- [0x2049, 0x2049], /* EXCLAMATION QUESTION MARK */
- [0x204a, 0x204a], /* TIRONIAN SIGN ET */
- [0x204b, 0x204b], /* REVERSED PILCROW SIGN */
- [0x204c, 0x204c], /* BLACK LEFTWARDS BULLET */
- [0x204d, 0x204d], /* BLACK RIGHTWARDS BULLET */
- [0x204e, 0x204e], /* LOW ASTERISK */
- [0x204f, 0x204f], /* REVERSED SEMICOLON */
- [0x2050, 0x2050], /* CLOSE UP */
- [0x2051, 0x2051], /* TWO ASTERISKS ALIGNED VERTICALLY */
- [0x2052, 0x2052], /* COMMERCIAL MINUS SIGN */
- [0x2053, 0x2053], /* SWUNG DASH */
- [0x2054, 0x2054], /* INVERTED UNDERTIE */
- [0x2055, 0x2055], /* FLOWER PUNCTUATION MARK */
- [0x2056, 0x2056], /* THREE DOT PUNCTUATION */
- [0x2057, 0x2057], /* QUADRUPLE PRIME */
- [0x2058, 0x2058], /* FOUR DOT PUNCTUATION */
- [0x2059, 0x2059], /* FIVE DOT PUNCTUATION */
- [0x205a, 0x205a], /* TWO DOT PUNCTUATION */
- [0x205b, 0x205b], /* FOUR DOT MARK */
- [0x205c, 0x205c], /* DOTTED CROSS */
- [0x205d, 0x205d], /* TRICOLON */
- [0x205e, 0x205e], /* VERTICAL FOUR DOTS */
- [0x205f, 0x205f], /* MEDIUM MATHEMATICAL SPACE */
- [0x2060, 0x2060], /* WORD JOINER */
- [0x2061, 0x2061], /* FUNCTION APPLICATION */
- [0x2062, 0x2062], /* INVISIBLE TIMES */
- [0x2063, 0x2063], /* INVISIBLE SEPARATOR */
- [0x2064, 0x2064], /* INVISIBLE PLUS */
- [0x2065, 0x2065],
- [0x2066, 0x2066], /* LEFT-TO-RIGHT ISOLATE */
- [0x2067, 0x2067], /* RIGHT-TO-LEFT ISOLATE */
- [0x2068, 0x2068], /* FIRST STRONG ISOLATE */
- [0x2069, 0x2069], /* POP DIRECTIONAL ISOLATE */
- [0x206a, 0x206a], /* INHIBIT SYMMETRIC SWAPPING */
- [0x206b, 0x206b], /* ACTIVATE SYMMETRIC SWAPPING */
- [0x206c, 0x206c], /* INHIBIT ARABIC FORM SHAPING */
- [0x206d, 0x206d], /* ACTIVATE ARABIC FORM SHAPING */
- [0x206e, 0x206e], /* NATIONAL DIGIT SHAPES */
- [0x206f, 0x206f], /* NOMINAL DIGIT SHAPES */
- [0x2070, 0x2070], /* SUPERSCRIPT ZERO (SUPERSCRIPT DIGIT ZERO) */
- [0x2071, 0x2071], /* SUPERSCRIPT LATIN SMALL LETTER I */
- [0x2072, 0x2072],
- [0x2073, 0x2073],
- [0x2074, 0x2074], /* SUPERSCRIPT FOUR (SUPERSCRIPT DIGIT FOUR) */
- [0x2075, 0x2075], /* SUPERSCRIPT FIVE (SUPERSCRIPT DIGIT FIVE) */
- [0x2076, 0x2076], /* SUPERSCRIPT SIX (SUPERSCRIPT DIGIT SIX) */
- [0x2077, 0x2077], /* SUPERSCRIPT SEVEN (SUPERSCRIPT DIGIT SEVEN) */
- [0x2078, 0x2078], /* SUPERSCRIPT EIGHT (SUPERSCRIPT DIGIT EIGHT) */
- [0x2079, 0x2079], /* SUPERSCRIPT NINE (SUPERSCRIPT DIGIT NINE) */
- [0x207a, 0x207a], /* SUPERSCRIPT PLUS SIGN */
- [0x207b, 0x207b], /* SUPERSCRIPT MINUS (SUPERSCRIPT HYPHEN-MINUS) */
- [0x207c, 0x207c], /* SUPERSCRIPT EQUALS SIGN */
- [0x207d, 0x207d], /* SUPERSCRIPT LEFT PARENTHESIS (SUPERSCRIPT OPENING PARENTHESIS) */
- [0x207e, 0x207e], /* SUPERSCRIPT RIGHT PARENTHESIS (SUPERSCRIPT CLOSING PARENTHESIS) */
- [0x207f, 0x207f], /* SUPERSCRIPT LATIN SMALL LETTER N */
- [0x2080, 0x2080], /* SUBSCRIPT ZERO (SUBSCRIPT DIGIT ZERO) */
- [0x2081, 0x2081], /* SUBSCRIPT ONE (SUBSCRIPT DIGIT ONE) */
- [0x2082, 0x2082], /* SUBSCRIPT TWO (SUBSCRIPT DIGIT TWO) */
- [0x2083, 0x2083], /* SUBSCRIPT THREE (SUBSCRIPT DIGIT THREE) */
- [0x2084, 0x2084], /* SUBSCRIPT FOUR (SUBSCRIPT DIGIT FOUR) */
- [0x2085, 0x2085], /* SUBSCRIPT FIVE (SUBSCRIPT DIGIT FIVE) */
- [0x2086, 0x2086], /* SUBSCRIPT SIX (SUBSCRIPT DIGIT SIX) */
- [0x2087, 0x2087], /* SUBSCRIPT SEVEN (SUBSCRIPT DIGIT SEVEN) */
- [0x2088, 0x2088], /* SUBSCRIPT EIGHT (SUBSCRIPT DIGIT EIGHT) */
- [0x2089, 0x2089], /* SUBSCRIPT NINE (SUBSCRIPT DIGIT NINE) */
- [0x208a, 0x208a], /* SUBSCRIPT PLUS SIGN */
- [0x208b, 0x208b], /* SUBSCRIPT MINUS (SUBSCRIPT HYPHEN-MINUS) */
- [0x208c, 0x208c], /* SUBSCRIPT EQUALS SIGN */
- [0x208d, 0x208d], /* SUBSCRIPT LEFT PARENTHESIS (SUBSCRIPT OPENING PARENTHESIS) */
- [0x208e, 0x208e], /* SUBSCRIPT RIGHT PARENTHESIS (SUBSCRIPT CLOSING PARENTHESIS) */
- [0x208f, 0x208f],
- [0x2090, 0x2090], /* LATIN SUBSCRIPT SMALL LETTER A */
- [0x2091, 0x2091], /* LATIN SUBSCRIPT SMALL LETTER E */
- [0x2092, 0x2092], /* LATIN SUBSCRIPT SMALL LETTER O */
- [0x2093, 0x2093], /* LATIN SUBSCRIPT SMALL LETTER X */
- [0x2094, 0x2094], /* LATIN SUBSCRIPT SMALL LETTER SCHWA */
- [0x2095, 0x2095], /* LATIN SUBSCRIPT SMALL LETTER H */
- [0x2096, 0x2096], /* LATIN SUBSCRIPT SMALL LETTER K */
- [0x2097, 0x2097], /* LATIN SUBSCRIPT SMALL LETTER L */
- [0x2098, 0x2098], /* LATIN SUBSCRIPT SMALL LETTER M */
- [0x2099, 0x2099], /* LATIN SUBSCRIPT SMALL LETTER N */
- [0x209a, 0x209a], /* LATIN SUBSCRIPT SMALL LETTER P */
- [0x209b, 0x209b], /* LATIN SUBSCRIPT SMALL LETTER S */
- [0x209c, 0x209c], /* LATIN SUBSCRIPT SMALL LETTER T */
- [0x209d, 0x209d],
- [0x209e, 0x209e],
- [0x209f, 0x209f],
- [0x20a0, 0x20a0], /* EURO-CURRENCY SIGN */
- [0x20a1, 0x20a1], /* COLON SIGN */
- [0x20a2, 0x20a2], /* CRUZEIRO SIGN */
- [0x20a3, 0x20a3], /* FRENCH FRANC SIGN */
- [0x20a4, 0x20a4], /* LIRA SIGN */
- [0x20a5, 0x20a5], /* MILL SIGN */
- [0x20a6, 0x20a6], /* NAIRA SIGN */
- [0x20a7, 0x20a7], /* PESETA SIGN */
- [0x20a8, 0x20a8], /* RUPEE SIGN */
- [0x20a9, 0x20a9], /* WON SIGN */
- [0x20aa, 0x20aa], /* NEW SHEQEL SIGN */
- [0x20ab, 0x20ab], /* DONG SIGN */
- [0x20ac, 0x20ac], /* EURO SIGN */
- [0x20ad, 0x20ad], /* KIP SIGN */
- [0x20ae, 0x20ae], /* TUGRIK SIGN */
- [0x20af, 0x20af], /* DRACHMA SIGN */
- [0x20b0, 0x20b0], /* GERMAN PENNY SIGN */
- [0x20b1, 0x20b1], /* PESO SIGN */
- [0x20b2, 0x20b2], /* GUARANI SIGN */
- [0x20b3, 0x20b3], /* AUSTRAL SIGN */
- [0x20b4, 0x20b4], /* HRYVNIA SIGN */
- [0x20b5, 0x20b5], /* CEDI SIGN */
- [0x20b6, 0x20b6], /* LIVRE TOURNOIS SIGN */
- [0x20b7, 0x20b7], /* SPESMILO SIGN */
- [0x20b8, 0x20b8], /* TENGE SIGN */
- [0x20b9, 0x20b9], /* INDIAN RUPEE SIGN */
- [0x20ba, 0x20ba], /* TURKISH LIRA SIGN */
- [0x20bb, 0x20bb], /* NORDIC MARK SIGN */
- [0x20bc, 0x20bc], /* MANAT SIGN */
- [0x20bd, 0x20bd], /* RUBLE SIGN */
- [0x20be, 0x20be], /* LARI SIGN */
- [0x20bf, 0x20bf], /* BITCOIN SIGN */
- [0x20c0, 0x20c0],
- [0x20c1, 0x20c1],
- [0x20c2, 0x20c2],
- [0x20c3, 0x20c3],
- [0x20c4, 0x20c4],
- [0x20c5, 0x20c5],
- [0x20c6, 0x20c6],
- [0x20c7, 0x20c7],
- [0x20c8, 0x20c8],
- [0x20c9, 0x20c9],
- [0x20ca, 0x20ca],
- [0x20cb, 0x20cb],
- [0x20cc, 0x20cc],
- [0x20cd, 0x20cd],
- [0x20ce, 0x20ce],
- [0x20cf, 0x20cf],
- [0x20d0, 0x20d0], /* COMBINING LEFT HARPOON ABOVE (NON-SPACING LEFT HARPOON ABOVE) */
- [0x20d1, 0x20d1], /* COMBINING RIGHT HARPOON ABOVE (NON-SPACING RIGHT HARPOON ABOVE) */
- [0x20d2, 0x20d2], /* COMBINING LONG VERTICAL LINE OVERLAY (NON-SPACING LONG VERTICAL BAR OVERLAY) */
- [0x20d3, 0x20d3], /* COMBINING SHORT VERTICAL LINE OVERLAY (NON-SPACING SHORT VERTICAL BAR OVERLAY) */
- [0x20d4, 0x20d4], /* COMBINING ANTICLOCKWISE ARROW ABOVE (NON-SPACING ANTICLOCKWISE ARROW ABOVE) */
- [0x20d5, 0x20d5], /* COMBINING CLOCKWISE ARROW ABOVE (NON-SPACING CLOCKWISE ARROW ABOVE) */
- [0x20d6, 0x20d6], /* COMBINING LEFT ARROW ABOVE (NON-SPACING LEFT ARROW ABOVE) */
- [0x20d7, 0x20d7], /* COMBINING RIGHT ARROW ABOVE (NON-SPACING RIGHT ARROW ABOVE) */
- [0x20d8, 0x20d8], /* COMBINING RING OVERLAY (NON-SPACING RING OVERLAY) */
- [0x20d9, 0x20d9], /* COMBINING CLOCKWISE RING OVERLAY (NON-SPACING CLOCKWISE RING OVERLAY) */
- [0x20da, 0x20da], /* COMBINING ANTICLOCKWISE RING OVERLAY (NON-SPACING ANTICLOCKWISE RING OVERLAY) */
- [0x20db, 0x20db], /* COMBINING THREE DOTS ABOVE (NON-SPACING THREE DOTS ABOVE) */
- [0x20dc, 0x20dc], /* COMBINING FOUR DOTS ABOVE (NON-SPACING FOUR DOTS ABOVE) */
- [0x20dd, 0x20dd], /* COMBINING ENCLOSING CIRCLE (ENCLOSING CIRCLE) */
- [0x20de, 0x20de], /* COMBINING ENCLOSING SQUARE (ENCLOSING SQUARE) */
- [0x20df, 0x20df], /* COMBINING ENCLOSING DIAMOND (ENCLOSING DIAMOND) */
- [0x20e0, 0x20e0], /* COMBINING ENCLOSING CIRCLE BACKSLASH (ENCLOSING CIRCLE SLASH) */
- [0x20e1, 0x20e1], /* COMBINING LEFT RIGHT ARROW ABOVE (NON-SPACING LEFT RIGHT ARROW ABOVE) */
- [0x20e2, 0x20e2], /* COMBINING ENCLOSING SCREEN */
- [0x20e3, 0x20e3], /* COMBINING ENCLOSING KEYCAP */
- [0x20e4, 0x20e4], /* COMBINING ENCLOSING UPWARD POINTING TRIANGLE */
- [0x20e5, 0x20e5], /* COMBINING REVERSE SOLIDUS OVERLAY */
- [0x20e6, 0x20e6], /* COMBINING DOUBLE VERTICAL STROKE OVERLAY */
- [0x20e7, 0x20e7], /* COMBINING ANNUITY SYMBOL */
- [0x20e8, 0x20e8], /* COMBINING TRIPLE UNDERDOT */
- [0x20e9, 0x20e9], /* COMBINING WIDE BRIDGE ABOVE */
- [0x20ea, 0x20ea], /* COMBINING LEFTWARDS ARROW OVERLAY */
- [0x20eb, 0x20eb], /* COMBINING LONG DOUBLE SOLIDUS OVERLAY */
- [0x20ec, 0x20ec], /* COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS */
- [0x20ed, 0x20ed], /* COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS */
- [0x20ee, 0x20ee], /* COMBINING LEFT ARROW BELOW */
- [0x20ef, 0x20ef], /* COMBINING RIGHT ARROW BELOW */
- [0x20f0, 0x20f0], /* COMBINING ASTERISK ABOVE */
- [0x20f1, 0x20f1],
- [0x20f2, 0x20f2],
- [0x20f3, 0x20f3],
- [0x20f4, 0x20f4],
- [0x20f5, 0x20f5],
- [0x20f6, 0x20f6],
- [0x20f7, 0x20f7],
- [0x20f8, 0x20f8],
- [0x20f9, 0x20f9],
- [0x20fa, 0x20fa],
- [0x20fb, 0x20fb],
- [0x20fc, 0x20fc],
- [0x20fd, 0x20fd],
- [0x20fe, 0x20fe],
- [0x20ff, 0x20ff],
- [0x2100, 0x2100], /* ACCOUNT OF */
- [0x2101, 0x2101], /* ADDRESSED TO THE SUBJECT */
- [0x2102, 0x2102], /* DOUBLE-STRUCK CAPITAL C (DOUBLE-STRUCK C) */
- [0x2103, 0x2103], /* DEGREE CELSIUS (DEGREES CENTIGRADE) */
- [0x2104, 0x2104], /* CENTRE LINE SYMBOL (C L SYMBOL) */
- [0x2105, 0x2105], /* CARE OF */
- [0x2106, 0x2106], /* CADA UNA */
- [0x2107, 0x2107], /* EULER CONSTANT (EULERS) */
- [0x2108, 0x2108], /* SCRUPLE */
- [0x2109, 0x2109], /* DEGREE FAHRENHEIT (DEGREES FAHRENHEIT) */
- [0x210a, 0x210a], /* SCRIPT SMALL G */
- [0x210b, 0x210b], /* SCRIPT CAPITAL H (SCRIPT H) */
- [0x210c, 0x210c], /* BLACK-LETTER CAPITAL H (BLACK-LETTER H) */
- [0x210d, 0x210d], /* DOUBLE-STRUCK CAPITAL H (DOUBLE-STRUCK H) */
- [0x210e, 0x210e], /* PLANCK CONSTANT */
- [0x210f, 0x210f], /* PLANCK CONSTANT OVER TWO PI (PLANCK CONSTANT OVER 2 PI) */
- [0x2110, 0x2110], /* SCRIPT CAPITAL I (SCRIPT I) */
- [0x2111, 0x2111], /* BLACK-LETTER CAPITAL I (BLACK-LETTER I) */
- [0x2112, 0x2112], /* SCRIPT CAPITAL L (SCRIPT L) */
- [0x2113, 0x2113], /* SCRIPT SMALL L */
- [0x2114, 0x2114], /* L B BAR SYMBOL */
- [0x2115, 0x2115], /* DOUBLE-STRUCK CAPITAL N (DOUBLE-STRUCK N) */
- [0x2116, 0x2116], /* NUMERO SIGN (NUMERO) */
- [0x2117, 0x2117], /* SOUND RECORDING COPYRIGHT */
- [0x2118, 0x2118], /* SCRIPT CAPITAL P (SCRIPT P) */
- [0x2119, 0x2119], /* DOUBLE-STRUCK CAPITAL P (DOUBLE-STRUCK P) */
- [0x211a, 0x211a], /* DOUBLE-STRUCK CAPITAL Q (DOUBLE-STRUCK Q) */
- [0x211b, 0x211b], /* SCRIPT CAPITAL R (SCRIPT R) */
- [0x211c, 0x211c], /* BLACK-LETTER CAPITAL R (BLACK-LETTER R) */
- [0x211d, 0x211d], /* DOUBLE-STRUCK CAPITAL R (DOUBLE-STRUCK R) */
- [0x211e, 0x211e], /* PRESCRIPTION TAKE */
- [0x211f, 0x211f], /* RESPONSE */
- [0x2120, 0x2120], /* SERVICE MARK */
- [0x2121, 0x2121], /* TELEPHONE SIGN (T E L SYMBOL) */
- [0x2122, 0x2122], /* TRADE MARK SIGN (TRADEMARK) */
- [0x2123, 0x2123], /* VERSICLE */
- [0x2124, 0x2124], /* DOUBLE-STRUCK CAPITAL Z (DOUBLE-STRUCK Z) */
- [0x2125, 0x2125], /* OUNCE SIGN (OUNCE) */
- [0x2126, 0x3c9], /* OHM SIGN (OHM) */
- [0x2127, 0x2127], /* INVERTED OHM SIGN (MHO) */
- [0x2128, 0x2128], /* BLACK-LETTER CAPITAL Z (BLACK-LETTER Z) */
- [0x2129, 0x2129], /* TURNED GREEK SMALL LETTER IOTA */
- [0x212a, 0x6b], /* KELVIN SIGN (DEGREES KELVIN) */
- [0x212b, 0xe5], /* ANGSTROM SIGN (ANGSTROM UNIT) */
- [0x212c, 0x212c], /* SCRIPT CAPITAL B (SCRIPT B) */
- [0x212d, 0x212d], /* BLACK-LETTER CAPITAL C (BLACK-LETTER C) */
- [0x212e, 0x212e], /* ESTIMATED SYMBOL */
- [0x212f, 0x212f], /* SCRIPT SMALL E */
- [0x2130, 0x2130], /* SCRIPT CAPITAL E (SCRIPT E) */
- [0x2131, 0x2131], /* SCRIPT CAPITAL F (SCRIPT F) */
- [0x2132, 0x214e], /* TURNED CAPITAL F (TURNED F) */
- [0x2133, 0x2133], /* SCRIPT CAPITAL M (SCRIPT M) */
- [0x2134, 0x2134], /* SCRIPT SMALL O */
- [0x2135, 0x2135], /* ALEF SYMBOL (FIRST TRANSFINITE CARDINAL) */
- [0x2136, 0x2136], /* BET SYMBOL (SECOND TRANSFINITE CARDINAL) */
- [0x2137, 0x2137], /* GIMEL SYMBOL (THIRD TRANSFINITE CARDINAL) */
- [0x2138, 0x2138], /* DALET SYMBOL (FOURTH TRANSFINITE CARDINAL) */
- [0x2139, 0x2139], /* INFORMATION SOURCE */
- [0x213a, 0x213a], /* ROTATED CAPITAL Q */
- [0x213b, 0x213b], /* FACSIMILE SIGN */
- [0x213c, 0x213c], /* DOUBLE-STRUCK SMALL PI */
- [0x213d, 0x213d], /* DOUBLE-STRUCK SMALL GAMMA */
- [0x213e, 0x213e], /* DOUBLE-STRUCK CAPITAL GAMMA */
- [0x213f, 0x213f], /* DOUBLE-STRUCK CAPITAL PI */
- [0x2140, 0x2140], /* DOUBLE-STRUCK N-ARY SUMMATION */
- [0x2141, 0x2141], /* TURNED SANS-SERIF CAPITAL G */
- [0x2142, 0x2142], /* TURNED SANS-SERIF CAPITAL L */
- [0x2143, 0x2143], /* REVERSED SANS-SERIF CAPITAL L */
- [0x2144, 0x2144], /* TURNED SANS-SERIF CAPITAL Y */
- [0x2145, 0x2145], /* DOUBLE-STRUCK ITALIC CAPITAL D */
- [0x2146, 0x2146], /* DOUBLE-STRUCK ITALIC SMALL D */
- [0x2147, 0x2147], /* DOUBLE-STRUCK ITALIC SMALL E */
- [0x2148, 0x2148], /* DOUBLE-STRUCK ITALIC SMALL I */
- [0x2149, 0x2149], /* DOUBLE-STRUCK ITALIC SMALL J */
- [0x214a, 0x214a], /* PROPERTY LINE */
- [0x214b, 0x214b], /* TURNED AMPERSAND */
- [0x214c, 0x214c], /* PER SIGN */
- [0x214d, 0x214d], /* AKTIESELSKAB */
- [0x2132, 0x214e], /* TURNED SMALL F */
- [0x214f, 0x214f], /* SYMBOL FOR SAMARITAN SOURCE */
- [0x2150, 0x2150], /* VULGAR FRACTION ONE SEVENTH */
- [0x2151, 0x2151], /* VULGAR FRACTION ONE NINTH */
- [0x2152, 0x2152], /* VULGAR FRACTION ONE TENTH */
- [0x2153, 0x2153], /* VULGAR FRACTION ONE THIRD (FRACTION ONE THIRD) */
- [0x2154, 0x2154], /* VULGAR FRACTION TWO THIRDS (FRACTION TWO THIRDS) */
- [0x2155, 0x2155], /* VULGAR FRACTION ONE FIFTH (FRACTION ONE FIFTH) */
- [0x2156, 0x2156], /* VULGAR FRACTION TWO FIFTHS (FRACTION TWO FIFTHS) */
- [0x2157, 0x2157], /* VULGAR FRACTION THREE FIFTHS (FRACTION THREE FIFTHS) */
- [0x2158, 0x2158], /* VULGAR FRACTION FOUR FIFTHS (FRACTION FOUR FIFTHS) */
- [0x2159, 0x2159], /* VULGAR FRACTION ONE SIXTH (FRACTION ONE SIXTH) */
- [0x215a, 0x215a], /* VULGAR FRACTION FIVE SIXTHS (FRACTION FIVE SIXTHS) */
- [0x215b, 0x215b], /* VULGAR FRACTION ONE EIGHTH (FRACTION ONE EIGHTH) */
- [0x215c, 0x215c], /* VULGAR FRACTION THREE EIGHTHS (FRACTION THREE EIGHTHS) */
- [0x215d, 0x215d], /* VULGAR FRACTION FIVE EIGHTHS (FRACTION FIVE EIGHTHS) */
- [0x215e, 0x215e], /* VULGAR FRACTION SEVEN EIGHTHS (FRACTION SEVEN EIGHTHS) */
- [0x215f, 0x215f], /* FRACTION NUMERATOR ONE */
- [0x2160, 0x2170], /* ROMAN NUMERAL ONE */
- [0x2161, 0x2171], /* ROMAN NUMERAL TWO */
- [0x2162, 0x2172], /* ROMAN NUMERAL THREE */
- [0x2163, 0x2173], /* ROMAN NUMERAL FOUR */
- [0x2164, 0x2174], /* ROMAN NUMERAL FIVE */
- [0x2165, 0x2175], /* ROMAN NUMERAL SIX */
- [0x2166, 0x2176], /* ROMAN NUMERAL SEVEN */
- [0x2167, 0x2177], /* ROMAN NUMERAL EIGHT */
- [0x2168, 0x2178], /* ROMAN NUMERAL NINE */
- [0x2169, 0x2179], /* ROMAN NUMERAL TEN */
- [0x216a, 0x217a], /* ROMAN NUMERAL ELEVEN */
- [0x216b, 0x217b], /* ROMAN NUMERAL TWELVE */
- [0x216c, 0x217c], /* ROMAN NUMERAL FIFTY */
- [0x216d, 0x217d], /* ROMAN NUMERAL ONE HUNDRED */
- [0x216e, 0x217e], /* ROMAN NUMERAL FIVE HUNDRED */
- [0x216f, 0x217f], /* ROMAN NUMERAL ONE THOUSAND */
- [0x2160, 0x2170], /* SMALL ROMAN NUMERAL ONE */
- [0x2161, 0x2171], /* SMALL ROMAN NUMERAL TWO */
- [0x2162, 0x2172], /* SMALL ROMAN NUMERAL THREE */
- [0x2163, 0x2173], /* SMALL ROMAN NUMERAL FOUR */
- [0x2164, 0x2174], /* SMALL ROMAN NUMERAL FIVE */
- [0x2165, 0x2175], /* SMALL ROMAN NUMERAL SIX */
- [0x2166, 0x2176], /* SMALL ROMAN NUMERAL SEVEN */
- [0x2167, 0x2177], /* SMALL ROMAN NUMERAL EIGHT */
- [0x2168, 0x2178], /* SMALL ROMAN NUMERAL NINE */
- [0x2169, 0x2179], /* SMALL ROMAN NUMERAL TEN */
- [0x216a, 0x217a], /* SMALL ROMAN NUMERAL ELEVEN */
- [0x216b, 0x217b], /* SMALL ROMAN NUMERAL TWELVE */
- [0x216c, 0x217c], /* SMALL ROMAN NUMERAL FIFTY */
- [0x216d, 0x217d], /* SMALL ROMAN NUMERAL ONE HUNDRED */
- [0x216e, 0x217e], /* SMALL ROMAN NUMERAL FIVE HUNDRED */
- [0x216f, 0x217f], /* SMALL ROMAN NUMERAL ONE THOUSAND */
- [0x2180, 0x2180], /* ROMAN NUMERAL ONE THOUSAND C D */
- [0x2181, 0x2181], /* ROMAN NUMERAL FIVE THOUSAND */
- [0x2182, 0x2182], /* ROMAN NUMERAL TEN THOUSAND */
- [0x2183, 0x2184], /* ROMAN NUMERAL REVERSED ONE HUNDRED */
- [0x2183, 0x2184], /* LATIN SMALL LETTER REVERSED C */
- [0x2185, 0x2185], /* ROMAN NUMERAL SIX LATE FORM */
- [0x2186, 0x2186], /* ROMAN NUMERAL FIFTY EARLY FORM */
- [0x2187, 0x2187], /* ROMAN NUMERAL FIFTY THOUSAND */
- [0x2188, 0x2188], /* ROMAN NUMERAL ONE HUNDRED THOUSAND */
- [0x2189, 0x2189], /* VULGAR FRACTION ZERO THIRDS */
- [0x218a, 0x218a], /* TURNED DIGIT TWO */
- [0x218b, 0x218b], /* TURNED DIGIT THREE */
- [0x218c, 0x218c],
- [0x218d, 0x218d],
- [0x218e, 0x218e],
- [0x218f, 0x218f],
- [0x2190, 0x2190], /* LEFTWARDS ARROW (LEFT ARROW) */
- [0x2191, 0x2191], /* UPWARDS ARROW (UP ARROW) */
- [0x2192, 0x2192], /* RIGHTWARDS ARROW (RIGHT ARROW) */
- [0x2193, 0x2193], /* DOWNWARDS ARROW (DOWN ARROW) */
- [0x2194, 0x2194], /* LEFT RIGHT ARROW */
- [0x2195, 0x2195], /* UP DOWN ARROW */
- [0x2196, 0x2196], /* NORTH WEST ARROW (UPPER LEFT ARROW) */
- [0x2197, 0x2197], /* NORTH EAST ARROW (UPPER RIGHT ARROW) */
- [0x2198, 0x2198], /* SOUTH EAST ARROW (LOWER RIGHT ARROW) */
- [0x2199, 0x2199], /* SOUTH WEST ARROW (LOWER LEFT ARROW) */
- [0x219a, 0x219a], /* LEFTWARDS ARROW WITH STROKE (LEFT ARROW WITH STROKE) */
- [0x219b, 0x219b], /* RIGHTWARDS ARROW WITH STROKE (RIGHT ARROW WITH STROKE) */
- [0x219c, 0x219c], /* LEFTWARDS WAVE ARROW (LEFT WAVE ARROW) */
- [0x219d, 0x219d], /* RIGHTWARDS WAVE ARROW (RIGHT WAVE ARROW) */
- [0x219e, 0x219e], /* LEFTWARDS TWO HEADED ARROW (LEFT TWO HEADED ARROW) */
- [0x219f, 0x219f], /* UPWARDS TWO HEADED ARROW (UP TWO HEADED ARROW) */
- [0x21a0, 0x21a0], /* RIGHTWARDS TWO HEADED ARROW (RIGHT TWO HEADED ARROW) */
- [0x21a1, 0x21a1], /* DOWNWARDS TWO HEADED ARROW (DOWN TWO HEADED ARROW) */
- [0x21a2, 0x21a2], /* LEFTWARDS ARROW WITH TAIL (LEFT ARROW WITH TAIL) */
- [0x21a3, 0x21a3], /* RIGHTWARDS ARROW WITH TAIL (RIGHT ARROW WITH TAIL) */
- [0x21a4, 0x21a4], /* LEFTWARDS ARROW FROM BAR (LEFT ARROW FROM BAR) */
- [0x21a5, 0x21a5], /* UPWARDS ARROW FROM BAR (UP ARROW FROM BAR) */
- [0x21a6, 0x21a6], /* RIGHTWARDS ARROW FROM BAR (RIGHT ARROW FROM BAR) */
- [0x21a7, 0x21a7], /* DOWNWARDS ARROW FROM BAR (DOWN ARROW FROM BAR) */
- [0x21a8, 0x21a8], /* UP DOWN ARROW WITH BASE */
- [0x21a9, 0x21a9], /* LEFTWARDS ARROW WITH HOOK (LEFT ARROW WITH HOOK) */
- [0x21aa, 0x21aa], /* RIGHTWARDS ARROW WITH HOOK (RIGHT ARROW WITH HOOK) */
- [0x21ab, 0x21ab], /* LEFTWARDS ARROW WITH LOOP (LEFT ARROW WITH LOOP) */
- [0x21ac, 0x21ac], /* RIGHTWARDS ARROW WITH LOOP (RIGHT ARROW WITH LOOP) */
- [0x21ad, 0x21ad], /* LEFT RIGHT WAVE ARROW */
- [0x21ae, 0x21ae], /* LEFT RIGHT ARROW WITH STROKE */
- [0x21af, 0x21af], /* DOWNWARDS ZIGZAG ARROW (DOWN ZIGZAG ARROW) */
- [0x21b0, 0x21b0], /* UPWARDS ARROW WITH TIP LEFTWARDS (UP ARROW WITH TIP LEFT) */
- [0x21b1, 0x21b1], /* UPWARDS ARROW WITH TIP RIGHTWARDS (UP ARROW WITH TIP RIGHT) */
- [0x21b2, 0x21b2], /* DOWNWARDS ARROW WITH TIP LEFTWARDS (DOWN ARROW WITH TIP LEFT) */
- [0x21b3, 0x21b3], /* DOWNWARDS ARROW WITH TIP RIGHTWARDS (DOWN ARROW WITH TIP RIGHT) */
- [0x21b4, 0x21b4], /* RIGHTWARDS ARROW WITH CORNER DOWNWARDS (RIGHT ARROW WITH CORNER DOWN) */
- [0x21b5, 0x21b5], /* DOWNWARDS ARROW WITH CORNER LEFTWARDS (DOWN ARROW WITH CORNER LEFT) */
- [0x21b6, 0x21b6], /* ANTICLOCKWISE TOP SEMICIRCLE ARROW */
- [0x21b7, 0x21b7], /* CLOCKWISE TOP SEMICIRCLE ARROW */
- [0x21b8, 0x21b8], /* NORTH WEST ARROW TO LONG BAR (UPPER LEFT ARROW TO LONG BAR) */
- [0x21b9, 0x21b9], /* LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR (LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR) */
- [0x21ba, 0x21ba], /* ANTICLOCKWISE OPEN CIRCLE ARROW */
- [0x21bb, 0x21bb], /* CLOCKWISE OPEN CIRCLE ARROW */
- [0x21bc, 0x21bc], /* LEFTWARDS HARPOON WITH BARB UPWARDS (LEFT HARPOON WITH BARB UP) */
- [0x21bd, 0x21bd], /* LEFTWARDS HARPOON WITH BARB DOWNWARDS (LEFT HARPOON WITH BARB DOWN) */
- [0x21be, 0x21be], /* UPWARDS HARPOON WITH BARB RIGHTWARDS (UP HARPOON WITH BARB RIGHT) */
- [0x21bf, 0x21bf], /* UPWARDS HARPOON WITH BARB LEFTWARDS (UP HARPOON WITH BARB LEFT) */
- [0x21c0, 0x21c0], /* RIGHTWARDS HARPOON WITH BARB UPWARDS (RIGHT HARPOON WITH BARB UP) */
- [0x21c1, 0x21c1], /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS (RIGHT HARPOON WITH BARB DOWN) */
- [0x21c2, 0x21c2], /* DOWNWARDS HARPOON WITH BARB RIGHTWARDS (DOWN HARPOON WITH BARB RIGHT) */
- [0x21c3, 0x21c3], /* DOWNWARDS HARPOON WITH BARB LEFTWARDS (DOWN HARPOON WITH BARB LEFT) */
- [0x21c4, 0x21c4], /* RIGHTWARDS ARROW OVER LEFTWARDS ARROW (RIGHT ARROW OVER LEFT ARROW) */
- [0x21c5, 0x21c5], /* UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW (UP ARROW LEFT OF DOWN ARROW) */
- [0x21c6, 0x21c6], /* LEFTWARDS ARROW OVER RIGHTWARDS ARROW (LEFT ARROW OVER RIGHT ARROW) */
- [0x21c7, 0x21c7], /* LEFTWARDS PAIRED ARROWS (LEFT PAIRED ARROWS) */
- [0x21c8, 0x21c8], /* UPWARDS PAIRED ARROWS (UP PAIRED ARROWS) */
- [0x21c9, 0x21c9], /* RIGHTWARDS PAIRED ARROWS (RIGHT PAIRED ARROWS) */
- [0x21ca, 0x21ca], /* DOWNWARDS PAIRED ARROWS (DOWN PAIRED ARROWS) */
- [0x21cb, 0x21cb], /* LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON (LEFT HARPOON OVER RIGHT HARPOON) */
- [0x21cc, 0x21cc], /* RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON (RIGHT HARPOON OVER LEFT HARPOON) */
- [0x21cd, 0x21cd], /* LEFTWARDS DOUBLE ARROW WITH STROKE (LEFT DOUBLE ARROW WITH STROKE) */
- [0x21ce, 0x21ce], /* LEFT RIGHT DOUBLE ARROW WITH STROKE */
- [0x21cf, 0x21cf], /* RIGHTWARDS DOUBLE ARROW WITH STROKE (RIGHT DOUBLE ARROW WITH STROKE) */
- [0x21d0, 0x21d0], /* LEFTWARDS DOUBLE ARROW (LEFT DOUBLE ARROW) */
- [0x21d1, 0x21d1], /* UPWARDS DOUBLE ARROW (UP DOUBLE ARROW) */
- [0x21d2, 0x21d2], /* RIGHTWARDS DOUBLE ARROW (RIGHT DOUBLE ARROW) */
- [0x21d3, 0x21d3], /* DOWNWARDS DOUBLE ARROW (DOWN DOUBLE ARROW) */
- [0x21d4, 0x21d4], /* LEFT RIGHT DOUBLE ARROW */
- [0x21d5, 0x21d5], /* UP DOWN DOUBLE ARROW */
- [0x21d6, 0x21d6], /* NORTH WEST DOUBLE ARROW (UPPER LEFT DOUBLE ARROW) */
- [0x21d7, 0x21d7], /* NORTH EAST DOUBLE ARROW (UPPER RIGHT DOUBLE ARROW) */
- [0x21d8, 0x21d8], /* SOUTH EAST DOUBLE ARROW (LOWER RIGHT DOUBLE ARROW) */
- [0x21d9, 0x21d9], /* SOUTH WEST DOUBLE ARROW (LOWER LEFT DOUBLE ARROW) */
- [0x21da, 0x21da], /* LEFTWARDS TRIPLE ARROW (LEFT TRIPLE ARROW) */
- [0x21db, 0x21db], /* RIGHTWARDS TRIPLE ARROW (RIGHT TRIPLE ARROW) */
- [0x21dc, 0x21dc], /* LEFTWARDS SQUIGGLE ARROW (LEFT SQUIGGLE ARROW) */
- [0x21dd, 0x21dd], /* RIGHTWARDS SQUIGGLE ARROW (RIGHT SQUIGGLE ARROW) */
- [0x21de, 0x21de], /* UPWARDS ARROW WITH DOUBLE STROKE (UP ARROW WITH DOUBLE STROKE) */
- [0x21df, 0x21df], /* DOWNWARDS ARROW WITH DOUBLE STROKE (DOWN ARROW WITH DOUBLE STROKE) */
- [0x21e0, 0x21e0], /* LEFTWARDS DASHED ARROW (LEFT DASHED ARROW) */
- [0x21e1, 0x21e1], /* UPWARDS DASHED ARROW (UP DASHED ARROW) */
- [0x21e2, 0x21e2], /* RIGHTWARDS DASHED ARROW (RIGHT DASHED ARROW) */
- [0x21e3, 0x21e3], /* DOWNWARDS DASHED ARROW (DOWN DASHED ARROW) */
- [0x21e4, 0x21e4], /* LEFTWARDS ARROW TO BAR (LEFT ARROW TO BAR) */
- [0x21e5, 0x21e5], /* RIGHTWARDS ARROW TO BAR (RIGHT ARROW TO BAR) */
- [0x21e6, 0x21e6], /* LEFTWARDS WHITE ARROW (WHITE LEFT ARROW) */
- [0x21e7, 0x21e7], /* UPWARDS WHITE ARROW (WHITE UP ARROW) */
- [0x21e8, 0x21e8], /* RIGHTWARDS WHITE ARROW (WHITE RIGHT ARROW) */
- [0x21e9, 0x21e9], /* DOWNWARDS WHITE ARROW (WHITE DOWN ARROW) */
- [0x21ea, 0x21ea], /* UPWARDS WHITE ARROW FROM BAR (WHITE UP ARROW FROM BAR) */
- [0x21eb, 0x21eb], /* UPWARDS WHITE ARROW ON PEDESTAL */
- [0x21ec, 0x21ec], /* UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR */
- [0x21ed, 0x21ed], /* UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR */
- [0x21ee, 0x21ee], /* UPWARDS WHITE DOUBLE ARROW */
- [0x21ef, 0x21ef], /* UPWARDS WHITE DOUBLE ARROW ON PEDESTAL */
- [0x21f0, 0x21f0], /* RIGHTWARDS WHITE ARROW FROM WALL */
- [0x21f1, 0x21f1], /* NORTH WEST ARROW TO CORNER */
- [0x21f2, 0x21f2], /* SOUTH EAST ARROW TO CORNER */
- [0x21f3, 0x21f3], /* UP DOWN WHITE ARROW */
- [0x21f4, 0x21f4], /* RIGHT ARROW WITH SMALL CIRCLE */
- [0x21f5, 0x21f5], /* DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW */
- [0x21f6, 0x21f6], /* THREE RIGHTWARDS ARROWS */
- [0x21f7, 0x21f7], /* LEFTWARDS ARROW WITH VERTICAL STROKE */
- [0x21f8, 0x21f8], /* RIGHTWARDS ARROW WITH VERTICAL STROKE */
- [0x21f9, 0x21f9], /* LEFT RIGHT ARROW WITH VERTICAL STROKE */
- [0x21fa, 0x21fa], /* LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE */
- [0x21fb, 0x21fb], /* RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE */
- [0x21fc, 0x21fc], /* LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE */
- [0x21fd, 0x21fd], /* LEFTWARDS OPEN-HEADED ARROW */
- [0x21fe, 0x21fe], /* RIGHTWARDS OPEN-HEADED ARROW */
- [0x21ff, 0x21ff], /* LEFT RIGHT OPEN-HEADED ARROW */
- [0x2200, 0x2200], /* FOR ALL */
- [0x2201, 0x2201], /* COMPLEMENT */
- [0x2202, 0x2202], /* PARTIAL DIFFERENTIAL */
- [0x2203, 0x2203], /* THERE EXISTS */
- [0x2204, 0x2204], /* THERE DOES NOT EXIST */
- [0x2205, 0x2205], /* EMPTY SET */
- [0x2206, 0x2206], /* INCREMENT */
- [0x2207, 0x2207], /* NABLA */
- [0x2208, 0x2208], /* ELEMENT OF */
- [0x2209, 0x2209], /* NOT AN ELEMENT OF */
- [0x220a, 0x220a], /* SMALL ELEMENT OF */
- [0x220b, 0x220b], /* CONTAINS AS MEMBER */
- [0x220c, 0x220c], /* DOES NOT CONTAIN AS MEMBER */
- [0x220d, 0x220d], /* SMALL CONTAINS AS MEMBER */
- [0x220e, 0x220e], /* END OF PROOF */
- [0x220f, 0x220f], /* N-ARY PRODUCT */
- [0x2210, 0x2210], /* N-ARY COPRODUCT */
- [0x2211, 0x2211], /* N-ARY SUMMATION */
- [0x2212, 0x2212], /* MINUS SIGN */
- [0x2213, 0x2213], /* MINUS-OR-PLUS SIGN */
- [0x2214, 0x2214], /* DOT PLUS */
- [0x2215, 0x2215], /* DIVISION SLASH */
- [0x2216, 0x2216], /* SET MINUS */
- [0x2217, 0x2217], /* ASTERISK OPERATOR */
- [0x2218, 0x2218], /* RING OPERATOR */
- [0x2219, 0x2219], /* BULLET OPERATOR */
- [0x221a, 0x221a], /* SQUARE ROOT */
- [0x221b, 0x221b], /* CUBE ROOT */
- [0x221c, 0x221c], /* FOURTH ROOT */
- [0x221d, 0x221d], /* PROPORTIONAL TO */
- [0x221e, 0x221e], /* INFINITY */
- [0x221f, 0x221f], /* RIGHT ANGLE */
- [0x2220, 0x2220], /* ANGLE */
- [0x2221, 0x2221], /* MEASURED ANGLE */
- [0x2222, 0x2222], /* SPHERICAL ANGLE */
- [0x2223, 0x2223], /* DIVIDES */
- [0x2224, 0x2224], /* DOES NOT DIVIDE */
- [0x2225, 0x2225], /* PARALLEL TO */
- [0x2226, 0x2226], /* NOT PARALLEL TO */
- [0x2227, 0x2227], /* LOGICAL AND */
- [0x2228, 0x2228], /* LOGICAL OR */
- [0x2229, 0x2229], /* INTERSECTION */
- [0x222a, 0x222a], /* UNION */
- [0x222b, 0x222b], /* INTEGRAL */
- [0x222c, 0x222c], /* DOUBLE INTEGRAL */
- [0x222d, 0x222d], /* TRIPLE INTEGRAL */
- [0x222e, 0x222e], /* CONTOUR INTEGRAL */
- [0x222f, 0x222f], /* SURFACE INTEGRAL */
- [0x2230, 0x2230], /* VOLUME INTEGRAL */
- [0x2231, 0x2231], /* CLOCKWISE INTEGRAL */
- [0x2232, 0x2232], /* CLOCKWISE CONTOUR INTEGRAL */
- [0x2233, 0x2233], /* ANTICLOCKWISE CONTOUR INTEGRAL */
- [0x2234, 0x2234], /* THEREFORE */
- [0x2235, 0x2235], /* BECAUSE */
- [0x2236, 0x2236], /* RATIO */
- [0x2237, 0x2237], /* PROPORTION */
- [0x2238, 0x2238], /* DOT MINUS */
- [0x2239, 0x2239], /* EXCESS */
- [0x223a, 0x223a], /* GEOMETRIC PROPORTION */
- [0x223b, 0x223b], /* HOMOTHETIC */
- [0x223c, 0x223c], /* TILDE OPERATOR */
- [0x223d, 0x223d], /* REVERSED TILDE */
- [0x223e, 0x223e], /* INVERTED LAZY S */
- [0x223f, 0x223f], /* SINE WAVE */
- [0x2240, 0x2240], /* WREATH PRODUCT */
- [0x2241, 0x2241], /* NOT TILDE */
- [0x2242, 0x2242], /* MINUS TILDE */
- [0x2243, 0x2243], /* ASYMPTOTICALLY EQUAL TO */
- [0x2244, 0x2244], /* NOT ASYMPTOTICALLY EQUAL TO */
- [0x2245, 0x2245], /* APPROXIMATELY EQUAL TO */
- [0x2246, 0x2246], /* APPROXIMATELY BUT NOT ACTUALLY EQUAL TO */
- [0x2247, 0x2247], /* NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO */
- [0x2248, 0x2248], /* ALMOST EQUAL TO */
- [0x2249, 0x2249], /* NOT ALMOST EQUAL TO */
- [0x224a, 0x224a], /* ALMOST EQUAL OR EQUAL TO */
- [0x224b, 0x224b], /* TRIPLE TILDE */
- [0x224c, 0x224c], /* ALL EQUAL TO */
- [0x224d, 0x224d], /* EQUIVALENT TO */
- [0x224e, 0x224e], /* GEOMETRICALLY EQUIVALENT TO */
- [0x224f, 0x224f], /* DIFFERENCE BETWEEN */
- [0x2250, 0x2250], /* APPROACHES THE LIMIT */
- [0x2251, 0x2251], /* GEOMETRICALLY EQUAL TO */
- [0x2252, 0x2252], /* APPROXIMATELY EQUAL TO OR THE IMAGE OF */
- [0x2253, 0x2253], /* IMAGE OF OR APPROXIMATELY EQUAL TO */
- [0x2254, 0x2254], /* COLON EQUALS (COLON EQUAL) */
- [0x2255, 0x2255], /* EQUALS COLON (EQUAL COLON) */
- [0x2256, 0x2256], /* RING IN EQUAL TO */
- [0x2257, 0x2257], /* RING EQUAL TO */
- [0x2258, 0x2258], /* CORRESPONDS TO */
- [0x2259, 0x2259], /* ESTIMATES */
- [0x225a, 0x225a], /* EQUIANGULAR TO */
- [0x225b, 0x225b], /* STAR EQUALS */
- [0x225c, 0x225c], /* DELTA EQUAL TO */
- [0x225d, 0x225d], /* EQUAL TO BY DEFINITION */
- [0x225e, 0x225e], /* MEASURED BY */
- [0x225f, 0x225f], /* QUESTIONED EQUAL TO */
- [0x2260, 0x2260], /* NOT EQUAL TO */
- [0x2261, 0x2261], /* IDENTICAL TO */
- [0x2262, 0x2262], /* NOT IDENTICAL TO */
- [0x2263, 0x2263], /* STRICTLY EQUIVALENT TO */
- [0x2264, 0x2264], /* LESS-THAN OR EQUAL TO (LESS THAN OR EQUAL TO) */
- [0x2265, 0x2265], /* GREATER-THAN OR EQUAL TO (GREATER THAN OR EQUAL TO) */
- [0x2266, 0x2266], /* LESS-THAN OVER EQUAL TO (LESS THAN OVER EQUAL TO) */
- [0x2267, 0x2267], /* GREATER-THAN OVER EQUAL TO (GREATER THAN OVER EQUAL TO) */
- [0x2268, 0x2268], /* LESS-THAN BUT NOT EQUAL TO (LESS THAN BUT NOT EQUAL TO) */
- [0x2269, 0x2269], /* GREATER-THAN BUT NOT EQUAL TO (GREATER THAN BUT NOT EQUAL TO) */
- [0x226a, 0x226a], /* MUCH LESS-THAN (MUCH LESS THAN) */
- [0x226b, 0x226b], /* MUCH GREATER-THAN (MUCH GREATER THAN) */
- [0x226c, 0x226c], /* BETWEEN */
- [0x226d, 0x226d], /* NOT EQUIVALENT TO */
- [0x226e, 0x226e], /* NOT LESS-THAN (NOT LESS THAN) */
- [0x226f, 0x226f], /* NOT GREATER-THAN (NOT GREATER THAN) */
- [0x2270, 0x2270], /* NEITHER LESS-THAN NOR EQUAL TO (NEITHER LESS THAN NOR EQUAL TO) */
- [0x2271, 0x2271], /* NEITHER GREATER-THAN NOR EQUAL TO (NEITHER GREATER THAN NOR EQUAL TO) */
- [0x2272, 0x2272], /* LESS-THAN OR EQUIVALENT TO (LESS THAN OR EQUIVALENT TO) */
- [0x2273, 0x2273], /* GREATER-THAN OR EQUIVALENT TO (GREATER THAN OR EQUIVALENT TO) */
- [0x2274, 0x2274], /* NEITHER LESS-THAN NOR EQUIVALENT TO (NEITHER LESS THAN NOR EQUIVALENT TO) */
- [0x2275, 0x2275], /* NEITHER GREATER-THAN NOR EQUIVALENT TO (NEITHER GREATER THAN NOR EQUIVALENT TO) */
- [0x2276, 0x2276], /* LESS-THAN OR GREATER-THAN (LESS THAN OR GREATER THAN) */
- [0x2277, 0x2277], /* GREATER-THAN OR LESS-THAN (GREATER THAN OR LESS THAN) */
- [0x2278, 0x2278], /* NEITHER LESS-THAN NOR GREATER-THAN (NEITHER LESS THAN NOR GREATER THAN) */
- [0x2279, 0x2279], /* NEITHER GREATER-THAN NOR LESS-THAN (NEITHER GREATER THAN NOR LESS THAN) */
- [0x227a, 0x227a], /* PRECEDES */
- [0x227b, 0x227b], /* SUCCEEDS */
- [0x227c, 0x227c], /* PRECEDES OR EQUAL TO */
- [0x227d, 0x227d], /* SUCCEEDS OR EQUAL TO */
- [0x227e, 0x227e], /* PRECEDES OR EQUIVALENT TO */
- [0x227f, 0x227f], /* SUCCEEDS OR EQUIVALENT TO */
- [0x2280, 0x2280], /* DOES NOT PRECEDE */
- [0x2281, 0x2281], /* DOES NOT SUCCEED */
- [0x2282, 0x2282], /* SUBSET OF */
- [0x2283, 0x2283], /* SUPERSET OF */
- [0x2284, 0x2284], /* NOT A SUBSET OF */
- [0x2285, 0x2285], /* NOT A SUPERSET OF */
- [0x2286, 0x2286], /* SUBSET OF OR EQUAL TO */
- [0x2287, 0x2287], /* SUPERSET OF OR EQUAL TO */
- [0x2288, 0x2288], /* NEITHER A SUBSET OF NOR EQUAL TO */
- [0x2289, 0x2289], /* NEITHER A SUPERSET OF NOR EQUAL TO */
- [0x228a, 0x228a], /* SUBSET OF WITH NOT EQUAL TO (SUBSET OF OR NOT EQUAL TO) */
- [0x228b, 0x228b], /* SUPERSET OF WITH NOT EQUAL TO (SUPERSET OF OR NOT EQUAL TO) */
- [0x228c, 0x228c], /* MULTISET */
- [0x228d, 0x228d], /* MULTISET MULTIPLICATION */
- [0x228e, 0x228e], /* MULTISET UNION */
- [0x228f, 0x228f], /* SQUARE IMAGE OF */
- [0x2290, 0x2290], /* SQUARE ORIGINAL OF */
- [0x2291, 0x2291], /* SQUARE IMAGE OF OR EQUAL TO */
- [0x2292, 0x2292], /* SQUARE ORIGINAL OF OR EQUAL TO */
- [0x2293, 0x2293], /* SQUARE CAP */
- [0x2294, 0x2294], /* SQUARE CUP */
- [0x2295, 0x2295], /* CIRCLED PLUS */
- [0x2296, 0x2296], /* CIRCLED MINUS */
- [0x2297, 0x2297], /* CIRCLED TIMES */
- [0x2298, 0x2298], /* CIRCLED DIVISION SLASH */
- [0x2299, 0x2299], /* CIRCLED DOT OPERATOR */
- [0x229a, 0x229a], /* CIRCLED RING OPERATOR */
- [0x229b, 0x229b], /* CIRCLED ASTERISK OPERATOR */
- [0x229c, 0x229c], /* CIRCLED EQUALS */
- [0x229d, 0x229d], /* CIRCLED DASH */
- [0x229e, 0x229e], /* SQUARED PLUS */
- [0x229f, 0x229f], /* SQUARED MINUS */
- [0x22a0, 0x22a0], /* SQUARED TIMES */
- [0x22a1, 0x22a1], /* SQUARED DOT OPERATOR */
- [0x22a2, 0x22a2], /* RIGHT TACK */
- [0x22a3, 0x22a3], /* LEFT TACK */
- [0x22a4, 0x22a4], /* DOWN TACK */
- [0x22a5, 0x22a5], /* UP TACK */
- [0x22a6, 0x22a6], /* ASSERTION */
- [0x22a7, 0x22a7], /* MODELS */
- [0x22a8, 0x22a8], /* TRUE */
- [0x22a9, 0x22a9], /* FORCES */
- [0x22aa, 0x22aa], /* TRIPLE VERTICAL BAR RIGHT TURNSTILE */
- [0x22ab, 0x22ab], /* DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */
- [0x22ac, 0x22ac], /* DOES NOT PROVE */
- [0x22ad, 0x22ad], /* NOT TRUE */
- [0x22ae, 0x22ae], /* DOES NOT FORCE */
- [0x22af, 0x22af], /* NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */
- [0x22b0, 0x22b0], /* PRECEDES UNDER RELATION */
- [0x22b1, 0x22b1], /* SUCCEEDS UNDER RELATION */
- [0x22b2, 0x22b2], /* NORMAL SUBGROUP OF */
- [0x22b3, 0x22b3], /* CONTAINS AS NORMAL SUBGROUP */
- [0x22b4, 0x22b4], /* NORMAL SUBGROUP OF OR EQUAL TO */
- [0x22b5, 0x22b5], /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */
- [0x22b6, 0x22b6], /* ORIGINAL OF */
- [0x22b7, 0x22b7], /* IMAGE OF */
- [0x22b8, 0x22b8], /* MULTIMAP */
- [0x22b9, 0x22b9], /* HERMITIAN CONJUGATE MATRIX */
- [0x22ba, 0x22ba], /* INTERCALATE */
- [0x22bb, 0x22bb], /* XOR */
- [0x22bc, 0x22bc], /* NAND */
- [0x22bd, 0x22bd], /* NOR */
- [0x22be, 0x22be], /* RIGHT ANGLE WITH ARC */
- [0x22bf, 0x22bf], /* RIGHT TRIANGLE */
- [0x22c0, 0x22c0], /* N-ARY LOGICAL AND */
- [0x22c1, 0x22c1], /* N-ARY LOGICAL OR */
- [0x22c2, 0x22c2], /* N-ARY INTERSECTION */
- [0x22c3, 0x22c3], /* N-ARY UNION */
- [0x22c4, 0x22c4], /* DIAMOND OPERATOR */
- [0x22c5, 0x22c5], /* DOT OPERATOR */
- [0x22c6, 0x22c6], /* STAR OPERATOR */
- [0x22c7, 0x22c7], /* DIVISION TIMES */
- [0x22c8, 0x22c8], /* BOWTIE */
- [0x22c9, 0x22c9], /* LEFT NORMAL FACTOR SEMIDIRECT PRODUCT */
- [0x22ca, 0x22ca], /* RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT */
- [0x22cb, 0x22cb], /* LEFT SEMIDIRECT PRODUCT */
- [0x22cc, 0x22cc], /* RIGHT SEMIDIRECT PRODUCT */
- [0x22cd, 0x22cd], /* REVERSED TILDE EQUALS */
- [0x22ce, 0x22ce], /* CURLY LOGICAL OR */
- [0x22cf, 0x22cf], /* CURLY LOGICAL AND */
- [0x22d0, 0x22d0], /* DOUBLE SUBSET */
- [0x22d1, 0x22d1], /* DOUBLE SUPERSET */
- [0x22d2, 0x22d2], /* DOUBLE INTERSECTION */
- [0x22d3, 0x22d3], /* DOUBLE UNION */
- [0x22d4, 0x22d4], /* PITCHFORK */
- [0x22d5, 0x22d5], /* EQUAL AND PARALLEL TO */
- [0x22d6, 0x22d6], /* LESS-THAN WITH DOT (LESS THAN WITH DOT) */
- [0x22d7, 0x22d7], /* GREATER-THAN WITH DOT (GREATER THAN WITH DOT) */
- [0x22d8, 0x22d8], /* VERY MUCH LESS-THAN (VERY MUCH LESS THAN) */
- [0x22d9, 0x22d9], /* VERY MUCH GREATER-THAN (VERY MUCH GREATER THAN) */
- [0x22da, 0x22da], /* LESS-THAN EQUAL TO OR GREATER-THAN (LESS THAN EQUAL TO OR GREATER THAN) */
- [0x22db, 0x22db], /* GREATER-THAN EQUAL TO OR LESS-THAN (GREATER THAN EQUAL TO OR LESS THAN) */
- [0x22dc, 0x22dc], /* EQUAL TO OR LESS-THAN (EQUAL TO OR LESS THAN) */
- [0x22dd, 0x22dd], /* EQUAL TO OR GREATER-THAN (EQUAL TO OR GREATER THAN) */
- [0x22de, 0x22de], /* EQUAL TO OR PRECEDES */
- [0x22df, 0x22df], /* EQUAL TO OR SUCCEEDS */
- [0x22e0, 0x22e0], /* DOES NOT PRECEDE OR EQUAL */
- [0x22e1, 0x22e1], /* DOES NOT SUCCEED OR EQUAL */
- [0x22e2, 0x22e2], /* NOT SQUARE IMAGE OF OR EQUAL TO */
- [0x22e3, 0x22e3], /* NOT SQUARE ORIGINAL OF OR EQUAL TO */
- [0x22e4, 0x22e4], /* SQUARE IMAGE OF OR NOT EQUAL TO */
- [0x22e5, 0x22e5], /* SQUARE ORIGINAL OF OR NOT EQUAL TO */
- [0x22e6, 0x22e6], /* LESS-THAN BUT NOT EQUIVALENT TO (LESS THAN BUT NOT EQUIVALENT TO) */
- [0x22e7, 0x22e7], /* GREATER-THAN BUT NOT EQUIVALENT TO (GREATER THAN BUT NOT EQUIVALENT TO) */
- [0x22e8, 0x22e8], /* PRECEDES BUT NOT EQUIVALENT TO */
- [0x22e9, 0x22e9], /* SUCCEEDS BUT NOT EQUIVALENT TO */
- [0x22ea, 0x22ea], /* NOT NORMAL SUBGROUP OF */
- [0x22eb, 0x22eb], /* DOES NOT CONTAIN AS NORMAL SUBGROUP */
- [0x22ec, 0x22ec], /* NOT NORMAL SUBGROUP OF OR EQUAL TO */
- [0x22ed, 0x22ed], /* DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL */
- [0x22ee, 0x22ee], /* VERTICAL ELLIPSIS */
- [0x22ef, 0x22ef], /* MIDLINE HORIZONTAL ELLIPSIS */
- [0x22f0, 0x22f0], /* UP RIGHT DIAGONAL ELLIPSIS */
- [0x22f1, 0x22f1], /* DOWN RIGHT DIAGONAL ELLIPSIS */
- [0x22f2, 0x22f2], /* ELEMENT OF WITH LONG HORIZONTAL STROKE */
- [0x22f3, 0x22f3], /* ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
- [0x22f4, 0x22f4], /* SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
- [0x22f5, 0x22f5], /* ELEMENT OF WITH DOT ABOVE */
- [0x22f6, 0x22f6], /* ELEMENT OF WITH OVERBAR */
- [0x22f7, 0x22f7], /* SMALL ELEMENT OF WITH OVERBAR */
- [0x22f8, 0x22f8], /* ELEMENT OF WITH UNDERBAR */
- [0x22f9, 0x22f9], /* ELEMENT OF WITH TWO HORIZONTAL STROKES */
- [0x22fa, 0x22fa], /* CONTAINS WITH LONG HORIZONTAL STROKE */
- [0x22fb, 0x22fb], /* CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
- [0x22fc, 0x22fc], /* SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
- [0x22fd, 0x22fd], /* CONTAINS WITH OVERBAR */
- [0x22fe, 0x22fe], /* SMALL CONTAINS WITH OVERBAR */
- [0x22ff, 0x22ff], /* Z NOTATION BAG MEMBERSHIP */
- [0x2300, 0x2300], /* DIAMETER SIGN */
- [0x2301, 0x2301], /* ELECTRIC ARROW */
- [0x2302, 0x2302], /* HOUSE */
- [0x2303, 0x2303], /* UP ARROWHEAD */
- [0x2304, 0x2304], /* DOWN ARROWHEAD */
- [0x2305, 0x2305], /* PROJECTIVE */
- [0x2306, 0x2306], /* PERSPECTIVE */
- [0x2307, 0x2307], /* WAVY LINE */
- [0x2308, 0x2308], /* LEFT CEILING */
- [0x2309, 0x2309], /* RIGHT CEILING */
- [0x230a, 0x230a], /* LEFT FLOOR */
- [0x230b, 0x230b], /* RIGHT FLOOR */
- [0x230c, 0x230c], /* BOTTOM RIGHT CROP */
- [0x230d, 0x230d], /* BOTTOM LEFT CROP */
- [0x230e, 0x230e], /* TOP RIGHT CROP */
- [0x230f, 0x230f], /* TOP LEFT CROP */
- [0x2310, 0x2310], /* REVERSED NOT SIGN */
- [0x2311, 0x2311], /* SQUARE LOZENGE */
- [0x2312, 0x2312], /* ARC */
- [0x2313, 0x2313], /* SEGMENT */
- [0x2314, 0x2314], /* SECTOR */
- [0x2315, 0x2315], /* TELEPHONE RECORDER */
- [0x2316, 0x2316], /* POSITION INDICATOR */
- [0x2317, 0x2317], /* VIEWDATA SQUARE */
- [0x2318, 0x2318], /* PLACE OF INTEREST SIGN (COMMAND KEY) */
- [0x2319, 0x2319], /* TURNED NOT SIGN */
- [0x231a, 0x231a], /* WATCH */
- [0x231b, 0x231b], /* HOURGLASS */
- [0x231c, 0x231c], /* TOP LEFT CORNER */
- [0x231d, 0x231d], /* TOP RIGHT CORNER */
- [0x231e, 0x231e], /* BOTTOM LEFT CORNER */
- [0x231f, 0x231f], /* BOTTOM RIGHT CORNER */
- [0x2320, 0x2320], /* TOP HALF INTEGRAL */
- [0x2321, 0x2321], /* BOTTOM HALF INTEGRAL */
- [0x2322, 0x2322], /* FROWN */
- [0x2323, 0x2323], /* SMILE */
- [0x2324, 0x2324], /* UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS (ENTER KEY) */
- [0x2325, 0x2325], /* OPTION KEY */
- [0x2326, 0x2326], /* ERASE TO THE RIGHT (DELETE TO THE RIGHT KEY) */
- [0x2327, 0x2327], /* X IN A RECTANGLE BOX (CLEAR KEY) */
- [0x2328, 0x2328], /* KEYBOARD */
- [0x2329, 0x2329], /* LEFT-POINTING ANGLE BRACKET (BRA) */
- [0x232a, 0x232a], /* RIGHT-POINTING ANGLE BRACKET (KET) */
- [0x232b, 0x232b], /* ERASE TO THE LEFT (DELETE TO THE LEFT KEY) */
- [0x232c, 0x232c], /* BENZENE RING */
- [0x232d, 0x232d], /* CYLINDRICITY */
- [0x232e, 0x232e], /* ALL AROUND-PROFILE */
- [0x232f, 0x232f], /* SYMMETRY */
- [0x2330, 0x2330], /* TOTAL RUNOUT */
- [0x2331, 0x2331], /* DIMENSION ORIGIN */
- [0x2332, 0x2332], /* CONICAL TAPER */
- [0x2333, 0x2333], /* SLOPE */
- [0x2334, 0x2334], /* COUNTERBORE */
- [0x2335, 0x2335], /* COUNTERSINK */
- [0x2336, 0x2336], /* APL FUNCTIONAL SYMBOL I-BEAM */
- [0x2337, 0x2337], /* APL FUNCTIONAL SYMBOL SQUISH QUAD */
- [0x2338, 0x2338], /* APL FUNCTIONAL SYMBOL QUAD EQUAL */
- [0x2339, 0x2339], /* APL FUNCTIONAL SYMBOL QUAD DIVIDE */
- [0x233a, 0x233a], /* APL FUNCTIONAL SYMBOL QUAD DIAMOND */
- [0x233b, 0x233b], /* APL FUNCTIONAL SYMBOL QUAD JOT */
- [0x233c, 0x233c], /* APL FUNCTIONAL SYMBOL QUAD CIRCLE */
- [0x233d, 0x233d], /* APL FUNCTIONAL SYMBOL CIRCLE STILE */
- [0x233e, 0x233e], /* APL FUNCTIONAL SYMBOL CIRCLE JOT */
- [0x233f, 0x233f], /* APL FUNCTIONAL SYMBOL SLASH BAR */
- [0x2340, 0x2340], /* APL FUNCTIONAL SYMBOL BACKSLASH BAR */
- [0x2341, 0x2341], /* APL FUNCTIONAL SYMBOL QUAD SLASH */
- [0x2342, 0x2342], /* APL FUNCTIONAL SYMBOL QUAD BACKSLASH */
- [0x2343, 0x2343], /* APL FUNCTIONAL SYMBOL QUAD LESS-THAN */
- [0x2344, 0x2344], /* APL FUNCTIONAL SYMBOL QUAD GREATER-THAN */
- [0x2345, 0x2345], /* APL FUNCTIONAL SYMBOL LEFTWARDS VANE */
- [0x2346, 0x2346], /* APL FUNCTIONAL SYMBOL RIGHTWARDS VANE */
- [0x2347, 0x2347], /* APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW */
- [0x2348, 0x2348], /* APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW */
- [0x2349, 0x2349], /* APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH */
- [0x234a, 0x234a], /* APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR */
- [0x234b, 0x234b], /* APL FUNCTIONAL SYMBOL DELTA STILE */
- [0x234c, 0x234c], /* APL FUNCTIONAL SYMBOL QUAD DOWN CARET */
- [0x234d, 0x234d], /* APL FUNCTIONAL SYMBOL QUAD DELTA */
- [0x234e, 0x234e], /* APL FUNCTIONAL SYMBOL DOWN TACK JOT */
- [0x234f, 0x234f], /* APL FUNCTIONAL SYMBOL UPWARDS VANE */
- [0x2350, 0x2350], /* APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW */
- [0x2351, 0x2351], /* APL FUNCTIONAL SYMBOL UP TACK OVERBAR */
- [0x2352, 0x2352], /* APL FUNCTIONAL SYMBOL DEL STILE */
- [0x2353, 0x2353], /* APL FUNCTIONAL SYMBOL QUAD UP CARET */
- [0x2354, 0x2354], /* APL FUNCTIONAL SYMBOL QUAD DEL */
- [0x2355, 0x2355], /* APL FUNCTIONAL SYMBOL UP TACK JOT */
- [0x2356, 0x2356], /* APL FUNCTIONAL SYMBOL DOWNWARDS VANE */
- [0x2357, 0x2357], /* APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW */
- [0x2358, 0x2358], /* APL FUNCTIONAL SYMBOL QUOTE UNDERBAR */
- [0x2359, 0x2359], /* APL FUNCTIONAL SYMBOL DELTA UNDERBAR */
- [0x235a, 0x235a], /* APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR */
- [0x235b, 0x235b], /* APL FUNCTIONAL SYMBOL JOT UNDERBAR */
- [0x235c, 0x235c], /* APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR */
- [0x235d, 0x235d], /* APL FUNCTIONAL SYMBOL UP SHOE JOT */
- [0x235e, 0x235e], /* APL FUNCTIONAL SYMBOL QUOTE QUAD */
- [0x235f, 0x235f], /* APL FUNCTIONAL SYMBOL CIRCLE STAR */
- [0x2360, 0x2360], /* APL FUNCTIONAL SYMBOL QUAD COLON */
- [0x2361, 0x2361], /* APL FUNCTIONAL SYMBOL UP TACK DIAERESIS */
- [0x2362, 0x2362], /* APL FUNCTIONAL SYMBOL DEL DIAERESIS */
- [0x2363, 0x2363], /* APL FUNCTIONAL SYMBOL STAR DIAERESIS */
- [0x2364, 0x2364], /* APL FUNCTIONAL SYMBOL JOT DIAERESIS */
- [0x2365, 0x2365], /* APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS */
- [0x2366, 0x2366], /* APL FUNCTIONAL SYMBOL DOWN SHOE STILE */
- [0x2367, 0x2367], /* APL FUNCTIONAL SYMBOL LEFT SHOE STILE */
- [0x2368, 0x2368], /* APL FUNCTIONAL SYMBOL TILDE DIAERESIS */
- [0x2369, 0x2369], /* APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS */
- [0x236a, 0x236a], /* APL FUNCTIONAL SYMBOL COMMA BAR */
- [0x236b, 0x236b], /* APL FUNCTIONAL SYMBOL DEL TILDE */
- [0x236c, 0x236c], /* APL FUNCTIONAL SYMBOL ZILDE */
- [0x236d, 0x236d], /* APL FUNCTIONAL SYMBOL STILE TILDE */
- [0x236e, 0x236e], /* APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR */
- [0x236f, 0x236f], /* APL FUNCTIONAL SYMBOL QUAD NOT EQUAL */
- [0x2370, 0x2370], /* APL FUNCTIONAL SYMBOL QUAD QUESTION */
- [0x2371, 0x2371], /* APL FUNCTIONAL SYMBOL DOWN CARET TILDE */
- [0x2372, 0x2372], /* APL FUNCTIONAL SYMBOL UP CARET TILDE */
- [0x2373, 0x2373], /* APL FUNCTIONAL SYMBOL IOTA */
- [0x2374, 0x2374], /* APL FUNCTIONAL SYMBOL RHO */
- [0x2375, 0x2375], /* APL FUNCTIONAL SYMBOL OMEGA */
- [0x2376, 0x2376], /* APL FUNCTIONAL SYMBOL ALPHA UNDERBAR */
- [0x2377, 0x2377], /* APL FUNCTIONAL SYMBOL EPSILON UNDERBAR */
- [0x2378, 0x2378], /* APL FUNCTIONAL SYMBOL IOTA UNDERBAR */
- [0x2379, 0x2379], /* APL FUNCTIONAL SYMBOL OMEGA UNDERBAR */
- [0x237a, 0x237a], /* APL FUNCTIONAL SYMBOL ALPHA */
- [0x237b, 0x237b], /* NOT CHECK MARK */
- [0x237c, 0x237c], /* RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW */
- [0x237d, 0x237d], /* SHOULDERED OPEN BOX */
- [0x237e, 0x237e], /* BELL SYMBOL */
- [0x237f, 0x237f], /* VERTICAL LINE WITH MIDDLE DOT */
- [0x2380, 0x2380], /* INSERTION SYMBOL */
- [0x2381, 0x2381], /* CONTINUOUS UNDERLINE SYMBOL */
- [0x2382, 0x2382], /* DISCONTINUOUS UNDERLINE SYMBOL */
- [0x2383, 0x2383], /* EMPHASIS SYMBOL */
- [0x2384, 0x2384], /* COMPOSITION SYMBOL */
- [0x2385, 0x2385], /* WHITE SQUARE WITH CENTRE VERTICAL LINE */
- [0x2386, 0x2386], /* ENTER SYMBOL */
- [0x2387, 0x2387], /* ALTERNATIVE KEY SYMBOL */
- [0x2388, 0x2388], /* HELM SYMBOL */
- [0x2389, 0x2389], /* CIRCLED HORIZONTAL BAR WITH NOTCH */
- [0x238a, 0x238a], /* CIRCLED TRIANGLE DOWN */
- [0x238b, 0x238b], /* BROKEN CIRCLE WITH NORTHWEST ARROW */
- [0x238c, 0x238c], /* UNDO SYMBOL */
- [0x238d, 0x238d], /* MONOSTABLE SYMBOL */
- [0x238e, 0x238e], /* HYSTERESIS SYMBOL */
- [0x238f, 0x238f], /* OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL */
- [0x2390, 0x2390], /* OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL */
- [0x2391, 0x2391], /* PASSIVE-PULL-DOWN-OUTPUT SYMBOL */
- [0x2392, 0x2392], /* PASSIVE-PULL-UP-OUTPUT SYMBOL */
- [0x2393, 0x2393], /* DIRECT CURRENT SYMBOL FORM TWO */
- [0x2394, 0x2394], /* SOFTWARE-FUNCTION SYMBOL */
- [0x2395, 0x2395], /* APL FUNCTIONAL SYMBOL QUAD */
- [0x2396, 0x2396], /* DECIMAL SEPARATOR KEY SYMBOL */
- [0x2397, 0x2397], /* PREVIOUS PAGE */
- [0x2398, 0x2398], /* NEXT PAGE */
- [0x2399, 0x2399], /* PRINT SCREEN SYMBOL */
- [0x239a, 0x239a], /* CLEAR SCREEN SYMBOL */
- [0x239b, 0x239b], /* LEFT PARENTHESIS UPPER HOOK */
- [0x239c, 0x239c], /* LEFT PARENTHESIS EXTENSION */
- [0x239d, 0x239d], /* LEFT PARENTHESIS LOWER HOOK */
- [0x239e, 0x239e], /* RIGHT PARENTHESIS UPPER HOOK */
- [0x239f, 0x239f], /* RIGHT PARENTHESIS EXTENSION */
- [0x23a0, 0x23a0], /* RIGHT PARENTHESIS LOWER HOOK */
- [0x23a1, 0x23a1], /* LEFT SQUARE BRACKET UPPER CORNER */
- [0x23a2, 0x23a2], /* LEFT SQUARE BRACKET EXTENSION */
- [0x23a3, 0x23a3], /* LEFT SQUARE BRACKET LOWER CORNER */
- [0x23a4, 0x23a4], /* RIGHT SQUARE BRACKET UPPER CORNER */
- [0x23a5, 0x23a5], /* RIGHT SQUARE BRACKET EXTENSION */
- [0x23a6, 0x23a6], /* RIGHT SQUARE BRACKET LOWER CORNER */
- [0x23a7, 0x23a7], /* LEFT CURLY BRACKET UPPER HOOK */
- [0x23a8, 0x23a8], /* LEFT CURLY BRACKET MIDDLE PIECE */
- [0x23a9, 0x23a9], /* LEFT CURLY BRACKET LOWER HOOK */
- [0x23aa, 0x23aa], /* CURLY BRACKET EXTENSION */
- [0x23ab, 0x23ab], /* RIGHT CURLY BRACKET UPPER HOOK */
- [0x23ac, 0x23ac], /* RIGHT CURLY BRACKET MIDDLE PIECE */
- [0x23ad, 0x23ad], /* RIGHT CURLY BRACKET LOWER HOOK */
- [0x23ae, 0x23ae], /* INTEGRAL EXTENSION */
- [0x23af, 0x23af], /* HORIZONTAL LINE EXTENSION */
- [0x23b0, 0x23b0], /* UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION */
- [0x23b1, 0x23b1], /* UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION */
- [0x23b2, 0x23b2], /* SUMMATION TOP */
- [0x23b3, 0x23b3], /* SUMMATION BOTTOM */
- [0x23b4, 0x23b4], /* TOP SQUARE BRACKET */
- [0x23b5, 0x23b5], /* BOTTOM SQUARE BRACKET */
- [0x23b6, 0x23b6], /* BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET */
- [0x23b7, 0x23b7], /* RADICAL SYMBOL BOTTOM */
- [0x23b8, 0x23b8], /* LEFT VERTICAL BOX LINE */
- [0x23b9, 0x23b9], /* RIGHT VERTICAL BOX LINE */
- [0x23ba, 0x23ba], /* HORIZONTAL SCAN LINE-1 */
- [0x23bb, 0x23bb], /* HORIZONTAL SCAN LINE-3 */
- [0x23bc, 0x23bc], /* HORIZONTAL SCAN LINE-7 */
- [0x23bd, 0x23bd], /* HORIZONTAL SCAN LINE-9 */
- [0x23be, 0x23be], /* DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT */
- [0x23bf, 0x23bf], /* DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT */
- [0x23c0, 0x23c0], /* DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE */
- [0x23c1, 0x23c1], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE */
- [0x23c2, 0x23c2], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE */
- [0x23c3, 0x23c3], /* DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE */
- [0x23c4, 0x23c4], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE */
- [0x23c5, 0x23c5], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE */
- [0x23c6, 0x23c6], /* DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE */
- [0x23c7, 0x23c7], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE */
- [0x23c8, 0x23c8], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE */
- [0x23c9, 0x23c9], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL */
- [0x23ca, 0x23ca], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL */
- [0x23cb, 0x23cb], /* DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT */
- [0x23cc, 0x23cc], /* DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT */
- [0x23cd, 0x23cd], /* SQUARE FOOT */
- [0x23ce, 0x23ce], /* RETURN SYMBOL */
- [0x23cf, 0x23cf], /* EJECT SYMBOL */
- [0x23d0, 0x23d0], /* VERTICAL LINE EXTENSION */
- [0x23d1, 0x23d1], /* METRICAL BREVE */
- [0x23d2, 0x23d2], /* METRICAL LONG OVER SHORT */
- [0x23d3, 0x23d3], /* METRICAL SHORT OVER LONG */
- [0x23d4, 0x23d4], /* METRICAL LONG OVER TWO SHORTS */
- [0x23d5, 0x23d5], /* METRICAL TWO SHORTS OVER LONG */
- [0x23d6, 0x23d6], /* METRICAL TWO SHORTS JOINED */
- [0x23d7, 0x23d7], /* METRICAL TRISEME */
- [0x23d8, 0x23d8], /* METRICAL TETRASEME */
- [0x23d9, 0x23d9], /* METRICAL PENTASEME */
- [0x23da, 0x23da], /* EARTH GROUND */
- [0x23db, 0x23db], /* FUSE */
- [0x23dc, 0x23dc], /* TOP PARENTHESIS */
- [0x23dd, 0x23dd], /* BOTTOM PARENTHESIS */
- [0x23de, 0x23de], /* TOP CURLY BRACKET */
- [0x23df, 0x23df], /* BOTTOM CURLY BRACKET */
- [0x23e0, 0x23e0], /* TOP TORTOISE SHELL BRACKET */
- [0x23e1, 0x23e1], /* BOTTOM TORTOISE SHELL BRACKET */
- [0x23e2, 0x23e2], /* WHITE TRAPEZIUM */
- [0x23e3, 0x23e3], /* BENZENE RING WITH CIRCLE */
- [0x23e4, 0x23e4], /* STRAIGHTNESS */
- [0x23e5, 0x23e5], /* FLATNESS */
- [0x23e6, 0x23e6], /* AC CURRENT */
- [0x23e7, 0x23e7], /* ELECTRICAL INTERSECTION */
- [0x23e8, 0x23e8], /* DECIMAL EXPONENT SYMBOL */
- [0x23e9, 0x23e9], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE */
- [0x23ea, 0x23ea], /* BLACK LEFT-POINTING DOUBLE TRIANGLE */
- [0x23eb, 0x23eb], /* BLACK UP-POINTING DOUBLE TRIANGLE */
- [0x23ec, 0x23ec], /* BLACK DOWN-POINTING DOUBLE TRIANGLE */
- [0x23ed, 0x23ed], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */
- [0x23ee, 0x23ee], /* BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */
- [0x23ef, 0x23ef], /* BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR */
- [0x23f0, 0x23f0], /* ALARM CLOCK */
- [0x23f1, 0x23f1], /* STOPWATCH */
- [0x23f2, 0x23f2], /* TIMER CLOCK */
- [0x23f3, 0x23f3], /* HOURGLASS WITH FLOWING SAND */
- [0x23f4, 0x23f4], /* BLACK MEDIUM LEFT-POINTING TRIANGLE */
- [0x23f5, 0x23f5], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE */
- [0x23f6, 0x23f6], /* BLACK MEDIUM UP-POINTING TRIANGLE */
- [0x23f7, 0x23f7], /* BLACK MEDIUM DOWN-POINTING TRIANGLE */
- [0x23f8, 0x23f8], /* DOUBLE VERTICAL BAR */
- [0x23f9, 0x23f9], /* BLACK SQUARE FOR STOP */
- [0x23fa, 0x23fa], /* BLACK CIRCLE FOR RECORD */
- [0x23fb, 0x23fb], /* POWER SYMBOL */
- [0x23fc, 0x23fc], /* POWER ON-OFF SYMBOL */
- [0x23fd, 0x23fd], /* POWER ON SYMBOL */
- [0x23fe, 0x23fe], /* POWER SLEEP SYMBOL */
- [0x23ff, 0x23ff], /* OBSERVER EYE SYMBOL */
- [0x2400, 0x2400], /* SYMBOL FOR NULL (GRAPHIC FOR NULL) */
- [0x2401, 0x2401], /* SYMBOL FOR START OF HEADING (GRAPHIC FOR START OF HEADING) */
- [0x2402, 0x2402], /* SYMBOL FOR START OF TEXT (GRAPHIC FOR START OF TEXT) */
- [0x2403, 0x2403], /* SYMBOL FOR END OF TEXT (GRAPHIC FOR END OF TEXT) */
- [0x2404, 0x2404], /* SYMBOL FOR END OF TRANSMISSION (GRAPHIC FOR END OF TRANSMISSION) */
- [0x2405, 0x2405], /* SYMBOL FOR ENQUIRY (GRAPHIC FOR ENQUIRY) */
- [0x2406, 0x2406], /* SYMBOL FOR ACKNOWLEDGE (GRAPHIC FOR ACKNOWLEDGE) */
- [0x2407, 0x2407], /* SYMBOL FOR BELL (GRAPHIC FOR BELL) */
- [0x2408, 0x2408], /* SYMBOL FOR BACKSPACE (GRAPHIC FOR BACKSPACE) */
- [0x2409, 0x2409], /* SYMBOL FOR HORIZONTAL TABULATION (GRAPHIC FOR HORIZONTAL TABULATION) */
- [0x240a, 0x240a], /* SYMBOL FOR LINE FEED (GRAPHIC FOR LINE FEED) */
- [0x240b, 0x240b], /* SYMBOL FOR VERTICAL TABULATION (GRAPHIC FOR VERTICAL TABULATION) */
- [0x240c, 0x240c], /* SYMBOL FOR FORM FEED (GRAPHIC FOR FORM FEED) */
- [0x240d, 0x240d], /* SYMBOL FOR CARRIAGE RETURN (GRAPHIC FOR CARRIAGE RETURN) */
- [0x240e, 0x240e], /* SYMBOL FOR SHIFT OUT (GRAPHIC FOR SHIFT OUT) */
- [0x240f, 0x240f], /* SYMBOL FOR SHIFT IN (GRAPHIC FOR SHIFT IN) */
- [0x2410, 0x2410], /* SYMBOL FOR DATA LINK ESCAPE (GRAPHIC FOR DATA LINK ESCAPE) */
- [0x2411, 0x2411], /* SYMBOL FOR DEVICE CONTROL ONE (GRAPHIC FOR DEVICE CONTROL ONE) */
- [0x2412, 0x2412], /* SYMBOL FOR DEVICE CONTROL TWO (GRAPHIC FOR DEVICE CONTROL TWO) */
- [0x2413, 0x2413], /* SYMBOL FOR DEVICE CONTROL THREE (GRAPHIC FOR DEVICE CONTROL THREE) */
- [0x2414, 0x2414], /* SYMBOL FOR DEVICE CONTROL FOUR (GRAPHIC FOR DEVICE CONTROL FOUR) */
- [0x2415, 0x2415], /* SYMBOL FOR NEGATIVE ACKNOWLEDGE (GRAPHIC FOR NEGATIVE ACKNOWLEDGE) */
- [0x2416, 0x2416], /* SYMBOL FOR SYNCHRONOUS IDLE (GRAPHIC FOR SYNCHRONOUS IDLE) */
- [0x2417, 0x2417], /* SYMBOL FOR END OF TRANSMISSION BLOCK (GRAPHIC FOR END OF TRANSMISSION BLOCK) */
- [0x2418, 0x2418], /* SYMBOL FOR CANCEL (GRAPHIC FOR CANCEL) */
- [0x2419, 0x2419], /* SYMBOL FOR END OF MEDIUM (GRAPHIC FOR END OF MEDIUM) */
- [0x241a, 0x241a], /* SYMBOL FOR SUBSTITUTE (GRAPHIC FOR SUBSTITUTE) */
- [0x241b, 0x241b], /* SYMBOL FOR ESCAPE (GRAPHIC FOR ESCAPE) */
- [0x241c, 0x241c], /* SYMBOL FOR FILE SEPARATOR (GRAPHIC FOR FILE SEPARATOR) */
- [0x241d, 0x241d], /* SYMBOL FOR GROUP SEPARATOR (GRAPHIC FOR GROUP SEPARATOR) */
- [0x241e, 0x241e], /* SYMBOL FOR RECORD SEPARATOR (GRAPHIC FOR RECORD SEPARATOR) */
- [0x241f, 0x241f], /* SYMBOL FOR UNIT SEPARATOR (GRAPHIC FOR UNIT SEPARATOR) */
- [0x2420, 0x2420], /* SYMBOL FOR SPACE (GRAPHIC FOR SPACE) */
- [0x2421, 0x2421], /* SYMBOL FOR DELETE (GRAPHIC FOR DELETE) */
- [0x2422, 0x2422], /* BLANK SYMBOL (BLANK) */
- [0x2423, 0x2423], /* OPEN BOX */
- [0x2424, 0x2424], /* SYMBOL FOR NEWLINE (GRAPHIC FOR NEWLINE) */
- [0x2425, 0x2425], /* SYMBOL FOR DELETE FORM TWO */
- [0x2426, 0x2426], /* SYMBOL FOR SUBSTITUTE FORM TWO */
- [0x2427, 0x2427],
- [0x2428, 0x2428],
- [0x2429, 0x2429],
- [0x242a, 0x242a],
- [0x242b, 0x242b],
- [0x242c, 0x242c],
- [0x242d, 0x242d],
- [0x242e, 0x242e],
- [0x242f, 0x242f],
- [0x2430, 0x2430],
- [0x2431, 0x2431],
- [0x2432, 0x2432],
- [0x2433, 0x2433],
- [0x2434, 0x2434],
- [0x2435, 0x2435],
- [0x2436, 0x2436],
- [0x2437, 0x2437],
- [0x2438, 0x2438],
- [0x2439, 0x2439],
- [0x243a, 0x243a],
- [0x243b, 0x243b],
- [0x243c, 0x243c],
- [0x243d, 0x243d],
- [0x243e, 0x243e],
- [0x243f, 0x243f],
- [0x2440, 0x2440], /* OCR HOOK */
- [0x2441, 0x2441], /* OCR CHAIR */
- [0x2442, 0x2442], /* OCR FORK */
- [0x2443, 0x2443], /* OCR INVERTED FORK */
- [0x2444, 0x2444], /* OCR BELT BUCKLE */
- [0x2445, 0x2445], /* OCR BOW TIE */
- [0x2446, 0x2446], /* OCR BRANCH BANK IDENTIFICATION */
- [0x2447, 0x2447], /* OCR AMOUNT OF CHECK */
- [0x2448, 0x2448], /* OCR DASH */
- [0x2449, 0x2449], /* OCR CUSTOMER ACCOUNT NUMBER */
- [0x244a, 0x244a], /* OCR DOUBLE BACKSLASH */
- [0x244b, 0x244b],
- [0x244c, 0x244c],
- [0x244d, 0x244d],
- [0x244e, 0x244e],
- [0x244f, 0x244f],
- [0x2450, 0x2450],
- [0x2451, 0x2451],
- [0x2452, 0x2452],
- [0x2453, 0x2453],
- [0x2454, 0x2454],
- [0x2455, 0x2455],
- [0x2456, 0x2456],
- [0x2457, 0x2457],
- [0x2458, 0x2458],
- [0x2459, 0x2459],
- [0x245a, 0x245a],
- [0x245b, 0x245b],
- [0x245c, 0x245c],
- [0x245d, 0x245d],
- [0x245e, 0x245e],
- [0x245f, 0x245f],
- [0x2460, 0x2460], /* CIRCLED DIGIT ONE */
- [0x2461, 0x2461], /* CIRCLED DIGIT TWO */
- [0x2462, 0x2462], /* CIRCLED DIGIT THREE */
- [0x2463, 0x2463], /* CIRCLED DIGIT FOUR */
- [0x2464, 0x2464], /* CIRCLED DIGIT FIVE */
- [0x2465, 0x2465], /* CIRCLED DIGIT SIX */
- [0x2466, 0x2466], /* CIRCLED DIGIT SEVEN */
- [0x2467, 0x2467], /* CIRCLED DIGIT EIGHT */
- [0x2468, 0x2468], /* CIRCLED DIGIT NINE */
- [0x2469, 0x2469], /* CIRCLED NUMBER TEN */
- [0x246a, 0x246a], /* CIRCLED NUMBER ELEVEN */
- [0x246b, 0x246b], /* CIRCLED NUMBER TWELVE */
- [0x246c, 0x246c], /* CIRCLED NUMBER THIRTEEN */
- [0x246d, 0x246d], /* CIRCLED NUMBER FOURTEEN */
- [0x246e, 0x246e], /* CIRCLED NUMBER FIFTEEN */
- [0x246f, 0x246f], /* CIRCLED NUMBER SIXTEEN */
- [0x2470, 0x2470], /* CIRCLED NUMBER SEVENTEEN */
- [0x2471, 0x2471], /* CIRCLED NUMBER EIGHTEEN */
- [0x2472, 0x2472], /* CIRCLED NUMBER NINETEEN */
- [0x2473, 0x2473], /* CIRCLED NUMBER TWENTY */
- [0x2474, 0x2474], /* PARENTHESIZED DIGIT ONE */
- [0x2475, 0x2475], /* PARENTHESIZED DIGIT TWO */
- [0x2476, 0x2476], /* PARENTHESIZED DIGIT THREE */
- [0x2477, 0x2477], /* PARENTHESIZED DIGIT FOUR */
- [0x2478, 0x2478], /* PARENTHESIZED DIGIT FIVE */
- [0x2479, 0x2479], /* PARENTHESIZED DIGIT SIX */
- [0x247a, 0x247a], /* PARENTHESIZED DIGIT SEVEN */
- [0x247b, 0x247b], /* PARENTHESIZED DIGIT EIGHT */
- [0x247c, 0x247c], /* PARENTHESIZED DIGIT NINE */
- [0x247d, 0x247d], /* PARENTHESIZED NUMBER TEN */
- [0x247e, 0x247e], /* PARENTHESIZED NUMBER ELEVEN */
- [0x247f, 0x247f], /* PARENTHESIZED NUMBER TWELVE */
- [0x2480, 0x2480], /* PARENTHESIZED NUMBER THIRTEEN */
- [0x2481, 0x2481], /* PARENTHESIZED NUMBER FOURTEEN */
- [0x2482, 0x2482], /* PARENTHESIZED NUMBER FIFTEEN */
- [0x2483, 0x2483], /* PARENTHESIZED NUMBER SIXTEEN */
- [0x2484, 0x2484], /* PARENTHESIZED NUMBER SEVENTEEN */
- [0x2485, 0x2485], /* PARENTHESIZED NUMBER EIGHTEEN */
- [0x2486, 0x2486], /* PARENTHESIZED NUMBER NINETEEN */
- [0x2487, 0x2487], /* PARENTHESIZED NUMBER TWENTY */
- [0x2488, 0x2488], /* DIGIT ONE FULL STOP (DIGIT ONE PERIOD) */
- [0x2489, 0x2489], /* DIGIT TWO FULL STOP (DIGIT TWO PERIOD) */
- [0x248a, 0x248a], /* DIGIT THREE FULL STOP (DIGIT THREE PERIOD) */
- [0x248b, 0x248b], /* DIGIT FOUR FULL STOP (DIGIT FOUR PERIOD) */
- [0x248c, 0x248c], /* DIGIT FIVE FULL STOP (DIGIT FIVE PERIOD) */
- [0x248d, 0x248d], /* DIGIT SIX FULL STOP (DIGIT SIX PERIOD) */
- [0x248e, 0x248e], /* DIGIT SEVEN FULL STOP (DIGIT SEVEN PERIOD) */
- [0x248f, 0x248f], /* DIGIT EIGHT FULL STOP (DIGIT EIGHT PERIOD) */
- [0x2490, 0x2490], /* DIGIT NINE FULL STOP (DIGIT NINE PERIOD) */
- [0x2491, 0x2491], /* NUMBER TEN FULL STOP (NUMBER TEN PERIOD) */
- [0x2492, 0x2492], /* NUMBER ELEVEN FULL STOP (NUMBER ELEVEN PERIOD) */
- [0x2493, 0x2493], /* NUMBER TWELVE FULL STOP (NUMBER TWELVE PERIOD) */
- [0x2494, 0x2494], /* NUMBER THIRTEEN FULL STOP (NUMBER THIRTEEN PERIOD) */
- [0x2495, 0x2495], /* NUMBER FOURTEEN FULL STOP (NUMBER FOURTEEN PERIOD) */
- [0x2496, 0x2496], /* NUMBER FIFTEEN FULL STOP (NUMBER FIFTEEN PERIOD) */
- [0x2497, 0x2497], /* NUMBER SIXTEEN FULL STOP (NUMBER SIXTEEN PERIOD) */
- [0x2498, 0x2498], /* NUMBER SEVENTEEN FULL STOP (NUMBER SEVENTEEN PERIOD) */
- [0x2499, 0x2499], /* NUMBER EIGHTEEN FULL STOP (NUMBER EIGHTEEN PERIOD) */
- [0x249a, 0x249a], /* NUMBER NINETEEN FULL STOP (NUMBER NINETEEN PERIOD) */
- [0x249b, 0x249b], /* NUMBER TWENTY FULL STOP (NUMBER TWENTY PERIOD) */
- [0x249c, 0x249c], /* PARENTHESIZED LATIN SMALL LETTER A */
- [0x249d, 0x249d], /* PARENTHESIZED LATIN SMALL LETTER B */
- [0x249e, 0x249e], /* PARENTHESIZED LATIN SMALL LETTER C */
- [0x249f, 0x249f], /* PARENTHESIZED LATIN SMALL LETTER D */
- [0x24a0, 0x24a0], /* PARENTHESIZED LATIN SMALL LETTER E */
- [0x24a1, 0x24a1], /* PARENTHESIZED LATIN SMALL LETTER F */
- [0x24a2, 0x24a2], /* PARENTHESIZED LATIN SMALL LETTER G */
- [0x24a3, 0x24a3], /* PARENTHESIZED LATIN SMALL LETTER H */
- [0x24a4, 0x24a4], /* PARENTHESIZED LATIN SMALL LETTER I */
- [0x24a5, 0x24a5], /* PARENTHESIZED LATIN SMALL LETTER J */
- [0x24a6, 0x24a6], /* PARENTHESIZED LATIN SMALL LETTER K */
- [0x24a7, 0x24a7], /* PARENTHESIZED LATIN SMALL LETTER L */
- [0x24a8, 0x24a8], /* PARENTHESIZED LATIN SMALL LETTER M */
- [0x24a9, 0x24a9], /* PARENTHESIZED LATIN SMALL LETTER N */
- [0x24aa, 0x24aa], /* PARENTHESIZED LATIN SMALL LETTER O */
- [0x24ab, 0x24ab], /* PARENTHESIZED LATIN SMALL LETTER P */
- [0x24ac, 0x24ac], /* PARENTHESIZED LATIN SMALL LETTER Q */
- [0x24ad, 0x24ad], /* PARENTHESIZED LATIN SMALL LETTER R */
- [0x24ae, 0x24ae], /* PARENTHESIZED LATIN SMALL LETTER S */
- [0x24af, 0x24af], /* PARENTHESIZED LATIN SMALL LETTER T */
- [0x24b0, 0x24b0], /* PARENTHESIZED LATIN SMALL LETTER U */
- [0x24b1, 0x24b1], /* PARENTHESIZED LATIN SMALL LETTER V */
- [0x24b2, 0x24b2], /* PARENTHESIZED LATIN SMALL LETTER W */
- [0x24b3, 0x24b3], /* PARENTHESIZED LATIN SMALL LETTER X */
- [0x24b4, 0x24b4], /* PARENTHESIZED LATIN SMALL LETTER Y */
- [0x24b5, 0x24b5], /* PARENTHESIZED LATIN SMALL LETTER Z */
- [0x24b6, 0x24d0], /* CIRCLED LATIN CAPITAL LETTER A */
- [0x24b7, 0x24d1], /* CIRCLED LATIN CAPITAL LETTER B */
- [0x24b8, 0x24d2], /* CIRCLED LATIN CAPITAL LETTER C */
- [0x24b9, 0x24d3], /* CIRCLED LATIN CAPITAL LETTER D */
- [0x24ba, 0x24d4], /* CIRCLED LATIN CAPITAL LETTER E */
- [0x24bb, 0x24d5], /* CIRCLED LATIN CAPITAL LETTER F */
- [0x24bc, 0x24d6], /* CIRCLED LATIN CAPITAL LETTER G */
- [0x24bd, 0x24d7], /* CIRCLED LATIN CAPITAL LETTER H */
- [0x24be, 0x24d8], /* CIRCLED LATIN CAPITAL LETTER I */
- [0x24bf, 0x24d9], /* CIRCLED LATIN CAPITAL LETTER J */
- [0x24c0, 0x24da], /* CIRCLED LATIN CAPITAL LETTER K */
- [0x24c1, 0x24db], /* CIRCLED LATIN CAPITAL LETTER L */
- [0x24c2, 0x24dc], /* CIRCLED LATIN CAPITAL LETTER M */
- [0x24c3, 0x24dd], /* CIRCLED LATIN CAPITAL LETTER N */
- [0x24c4, 0x24de], /* CIRCLED LATIN CAPITAL LETTER O */
- [0x24c5, 0x24df], /* CIRCLED LATIN CAPITAL LETTER P */
- [0x24c6, 0x24e0], /* CIRCLED LATIN CAPITAL LETTER Q */
- [0x24c7, 0x24e1], /* CIRCLED LATIN CAPITAL LETTER R */
- [0x24c8, 0x24e2], /* CIRCLED LATIN CAPITAL LETTER S */
- [0x24c9, 0x24e3], /* CIRCLED LATIN CAPITAL LETTER T */
- [0x24ca, 0x24e4], /* CIRCLED LATIN CAPITAL LETTER U */
- [0x24cb, 0x24e5], /* CIRCLED LATIN CAPITAL LETTER V */
- [0x24cc, 0x24e6], /* CIRCLED LATIN CAPITAL LETTER W */
- [0x24cd, 0x24e7], /* CIRCLED LATIN CAPITAL LETTER X */
- [0x24ce, 0x24e8], /* CIRCLED LATIN CAPITAL LETTER Y */
- [0x24cf, 0x24e9], /* CIRCLED LATIN CAPITAL LETTER Z */
- [0x24b6, 0x24d0], /* CIRCLED LATIN SMALL LETTER A */
- [0x24b7, 0x24d1], /* CIRCLED LATIN SMALL LETTER B */
- [0x24b8, 0x24d2], /* CIRCLED LATIN SMALL LETTER C */
- [0x24b9, 0x24d3], /* CIRCLED LATIN SMALL LETTER D */
- [0x24ba, 0x24d4], /* CIRCLED LATIN SMALL LETTER E */
- [0x24bb, 0x24d5], /* CIRCLED LATIN SMALL LETTER F */
- [0x24bc, 0x24d6], /* CIRCLED LATIN SMALL LETTER G */
- [0x24bd, 0x24d7], /* CIRCLED LATIN SMALL LETTER H */
- [0x24be, 0x24d8], /* CIRCLED LATIN SMALL LETTER I */
- [0x24bf, 0x24d9], /* CIRCLED LATIN SMALL LETTER J */
- [0x24c0, 0x24da], /* CIRCLED LATIN SMALL LETTER K */
- [0x24c1, 0x24db], /* CIRCLED LATIN SMALL LETTER L */
- [0x24c2, 0x24dc], /* CIRCLED LATIN SMALL LETTER M */
- [0x24c3, 0x24dd], /* CIRCLED LATIN SMALL LETTER N */
- [0x24c4, 0x24de], /* CIRCLED LATIN SMALL LETTER O */
- [0x24c5, 0x24df], /* CIRCLED LATIN SMALL LETTER P */
- [0x24c6, 0x24e0], /* CIRCLED LATIN SMALL LETTER Q */
- [0x24c7, 0x24e1], /* CIRCLED LATIN SMALL LETTER R */
- [0x24c8, 0x24e2], /* CIRCLED LATIN SMALL LETTER S */
- [0x24c9, 0x24e3], /* CIRCLED LATIN SMALL LETTER T */
- [0x24ca, 0x24e4], /* CIRCLED LATIN SMALL LETTER U */
- [0x24cb, 0x24e5], /* CIRCLED LATIN SMALL LETTER V */
- [0x24cc, 0x24e6], /* CIRCLED LATIN SMALL LETTER W */
- [0x24cd, 0x24e7], /* CIRCLED LATIN SMALL LETTER X */
- [0x24ce, 0x24e8], /* CIRCLED LATIN SMALL LETTER Y */
- [0x24cf, 0x24e9], /* CIRCLED LATIN SMALL LETTER Z */
- [0x24ea, 0x24ea], /* CIRCLED DIGIT ZERO */
- [0x24eb, 0x24eb], /* NEGATIVE CIRCLED NUMBER ELEVEN */
- [0x24ec, 0x24ec], /* NEGATIVE CIRCLED NUMBER TWELVE */
- [0x24ed, 0x24ed], /* NEGATIVE CIRCLED NUMBER THIRTEEN */
- [0x24ee, 0x24ee], /* NEGATIVE CIRCLED NUMBER FOURTEEN */
- [0x24ef, 0x24ef], /* NEGATIVE CIRCLED NUMBER FIFTEEN */
- [0x24f0, 0x24f0], /* NEGATIVE CIRCLED NUMBER SIXTEEN */
- [0x24f1, 0x24f1], /* NEGATIVE CIRCLED NUMBER SEVENTEEN */
- [0x24f2, 0x24f2], /* NEGATIVE CIRCLED NUMBER EIGHTEEN */
- [0x24f3, 0x24f3], /* NEGATIVE CIRCLED NUMBER NINETEEN */
- [0x24f4, 0x24f4], /* NEGATIVE CIRCLED NUMBER TWENTY */
- [0x24f5, 0x24f5], /* DOUBLE CIRCLED DIGIT ONE */
- [0x24f6, 0x24f6], /* DOUBLE CIRCLED DIGIT TWO */
- [0x24f7, 0x24f7], /* DOUBLE CIRCLED DIGIT THREE */
- [0x24f8, 0x24f8], /* DOUBLE CIRCLED DIGIT FOUR */
- [0x24f9, 0x24f9], /* DOUBLE CIRCLED DIGIT FIVE */
- [0x24fa, 0x24fa], /* DOUBLE CIRCLED DIGIT SIX */
- [0x24fb, 0x24fb], /* DOUBLE CIRCLED DIGIT SEVEN */
- [0x24fc, 0x24fc], /* DOUBLE CIRCLED DIGIT EIGHT */
- [0x24fd, 0x24fd], /* DOUBLE CIRCLED DIGIT NINE */
- [0x24fe, 0x24fe], /* DOUBLE CIRCLED NUMBER TEN */
- [0x24ff, 0x24ff], /* NEGATIVE CIRCLED DIGIT ZERO */
- [0x2500, 0x2500], /* BOX DRAWINGS LIGHT HORIZONTAL (FORMS LIGHT HORIZONTAL) */
- [0x2501, 0x2501], /* BOX DRAWINGS HEAVY HORIZONTAL (FORMS HEAVY HORIZONTAL) */
- [0x2502, 0x2502], /* BOX DRAWINGS LIGHT VERTICAL (FORMS LIGHT VERTICAL) */
- [0x2503, 0x2503], /* BOX DRAWINGS HEAVY VERTICAL (FORMS HEAVY VERTICAL) */
- [0x2504, 0x2504], /* BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL (FORMS LIGHT TRIPLE DASH HORIZONTAL) */
- [0x2505, 0x2505], /* BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL (FORMS HEAVY TRIPLE DASH HORIZONTAL) */
- [0x2506, 0x2506], /* BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL (FORMS LIGHT TRIPLE DASH VERTICAL) */
- [0x2507, 0x2507], /* BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL (FORMS HEAVY TRIPLE DASH VERTICAL) */
- [0x2508, 0x2508], /* BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL (FORMS LIGHT QUADRUPLE DASH HORIZONTAL) */
- [0x2509, 0x2509], /* BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL (FORMS HEAVY QUADRUPLE DASH HORIZONTAL) */
- [0x250a, 0x250a], /* BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL (FORMS LIGHT QUADRUPLE DASH VERTICAL) */
- [0x250b, 0x250b], /* BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL (FORMS HEAVY QUADRUPLE DASH VERTICAL) */
- [0x250c, 0x250c], /* BOX DRAWINGS LIGHT DOWN AND RIGHT (FORMS LIGHT DOWN AND RIGHT) */
- [0x250d, 0x250d], /* BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY (FORMS DOWN LIGHT AND RIGHT HEAVY) */
- [0x250e, 0x250e], /* BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT (FORMS DOWN HEAVY AND RIGHT LIGHT) */
- [0x250f, 0x250f], /* BOX DRAWINGS HEAVY DOWN AND RIGHT (FORMS HEAVY DOWN AND RIGHT) */
- [0x2510, 0x2510], /* BOX DRAWINGS LIGHT DOWN AND LEFT (FORMS LIGHT DOWN AND LEFT) */
- [0x2511, 0x2511], /* BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY (FORMS DOWN LIGHT AND LEFT HEAVY) */
- [0x2512, 0x2512], /* BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT (FORMS DOWN HEAVY AND LEFT LIGHT) */
- [0x2513, 0x2513], /* BOX DRAWINGS HEAVY DOWN AND LEFT (FORMS HEAVY DOWN AND LEFT) */
- [0x2514, 0x2514], /* BOX DRAWINGS LIGHT UP AND RIGHT (FORMS LIGHT UP AND RIGHT) */
- [0x2515, 0x2515], /* BOX DRAWINGS UP LIGHT AND RIGHT HEAVY (FORMS UP LIGHT AND RIGHT HEAVY) */
- [0x2516, 0x2516], /* BOX DRAWINGS UP HEAVY AND RIGHT LIGHT (FORMS UP HEAVY AND RIGHT LIGHT) */
- [0x2517, 0x2517], /* BOX DRAWINGS HEAVY UP AND RIGHT (FORMS HEAVY UP AND RIGHT) */
- [0x2518, 0x2518], /* BOX DRAWINGS LIGHT UP AND LEFT (FORMS LIGHT UP AND LEFT) */
- [0x2519, 0x2519], /* BOX DRAWINGS UP LIGHT AND LEFT HEAVY (FORMS UP LIGHT AND LEFT HEAVY) */
- [0x251a, 0x251a], /* BOX DRAWINGS UP HEAVY AND LEFT LIGHT (FORMS UP HEAVY AND LEFT LIGHT) */
- [0x251b, 0x251b], /* BOX DRAWINGS HEAVY UP AND LEFT (FORMS HEAVY UP AND LEFT) */
- [0x251c, 0x251c], /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT (FORMS LIGHT VERTICAL AND RIGHT) */
- [0x251d, 0x251d], /* BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY (FORMS VERTICAL LIGHT AND RIGHT HEAVY) */
- [0x251e, 0x251e], /* BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT (FORMS UP HEAVY AND RIGHT DOWN LIGHT) */
- [0x251f, 0x251f], /* BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT (FORMS DOWN HEAVY AND RIGHT UP LIGHT) */
- [0x2520, 0x2520], /* BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT (FORMS VERTICAL HEAVY AND RIGHT LIGHT) */
- [0x2521, 0x2521], /* BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY (FORMS DOWN LIGHT AND RIGHT UP HEAVY) */
- [0x2522, 0x2522], /* BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY (FORMS UP LIGHT AND RIGHT DOWN HEAVY) */
- [0x2523, 0x2523], /* BOX DRAWINGS HEAVY VERTICAL AND RIGHT (FORMS HEAVY VERTICAL AND RIGHT) */
- [0x2524, 0x2524], /* BOX DRAWINGS LIGHT VERTICAL AND LEFT (FORMS LIGHT VERTICAL AND LEFT) */
- [0x2525, 0x2525], /* BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY (FORMS VERTICAL LIGHT AND LEFT HEAVY) */
- [0x2526, 0x2526], /* BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT (FORMS UP HEAVY AND LEFT DOWN LIGHT) */
- [0x2527, 0x2527], /* BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT (FORMS DOWN HEAVY AND LEFT UP LIGHT) */
- [0x2528, 0x2528], /* BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT (FORMS VERTICAL HEAVY AND LEFT LIGHT) */
- [0x2529, 0x2529], /* BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY (FORMS DOWN LIGHT AND LEFT UP HEAVY) */
- [0x252a, 0x252a], /* BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY (FORMS UP LIGHT AND LEFT DOWN HEAVY) */
- [0x252b, 0x252b], /* BOX DRAWINGS HEAVY VERTICAL AND LEFT (FORMS HEAVY VERTICAL AND LEFT) */
- [0x252c, 0x252c], /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL (FORMS LIGHT DOWN AND HORIZONTAL) */
- [0x252d, 0x252d], /* BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT (FORMS LEFT HEAVY AND RIGHT DOWN LIGHT) */
- [0x252e, 0x252e], /* BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT (FORMS RIGHT HEAVY AND LEFT DOWN LIGHT) */
- [0x252f, 0x252f], /* BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY (FORMS DOWN LIGHT AND HORIZONTAL HEAVY) */
- [0x2530, 0x2530], /* BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT (FORMS DOWN HEAVY AND HORIZONTAL LIGHT) */
- [0x2531, 0x2531], /* BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY (FORMS RIGHT LIGHT AND LEFT DOWN HEAVY) */
- [0x2532, 0x2532], /* BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY (FORMS LEFT LIGHT AND RIGHT DOWN HEAVY) */
- [0x2533, 0x2533], /* BOX DRAWINGS HEAVY DOWN AND HORIZONTAL (FORMS HEAVY DOWN AND HORIZONTAL) */
- [0x2534, 0x2534], /* BOX DRAWINGS LIGHT UP AND HORIZONTAL (FORMS LIGHT UP AND HORIZONTAL) */
- [0x2535, 0x2535], /* BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT (FORMS LEFT HEAVY AND RIGHT UP LIGHT) */
- [0x2536, 0x2536], /* BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT (FORMS RIGHT HEAVY AND LEFT UP LIGHT) */
- [0x2537, 0x2537], /* BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY (FORMS UP LIGHT AND HORIZONTAL HEAVY) */
- [0x2538, 0x2538], /* BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT (FORMS UP HEAVY AND HORIZONTAL LIGHT) */
- [0x2539, 0x2539], /* BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY (FORMS RIGHT LIGHT AND LEFT UP HEAVY) */
- [0x253a, 0x253a], /* BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY (FORMS LEFT LIGHT AND RIGHT UP HEAVY) */
- [0x253b, 0x253b], /* BOX DRAWINGS HEAVY UP AND HORIZONTAL (FORMS HEAVY UP AND HORIZONTAL) */
- [0x253c, 0x253c], /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL (FORMS LIGHT VERTICAL AND HORIZONTAL) */
- [0x253d, 0x253d], /* BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT (FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT) */
- [0x253e, 0x253e], /* BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT (FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT) */
- [0x253f, 0x253f], /* BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY (FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY) */
- [0x2540, 0x2540], /* BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT (FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT) */
- [0x2541, 0x2541], /* BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT (FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT) */
- [0x2542, 0x2542], /* BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT (FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT) */
- [0x2543, 0x2543], /* BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT (FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT) */
- [0x2544, 0x2544], /* BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT (FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT) */
- [0x2545, 0x2545], /* BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT (FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT) */
- [0x2546, 0x2546], /* BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT (FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT) */
- [0x2547, 0x2547], /* BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY (FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY) */
- [0x2548, 0x2548], /* BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY (FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY) */
- [0x2549, 0x2549], /* BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY (FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY) */
- [0x254a, 0x254a], /* BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY (FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY) */
- [0x254b, 0x254b], /* BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL (FORMS HEAVY VERTICAL AND HORIZONTAL) */
- [0x254c, 0x254c], /* BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL (FORMS LIGHT DOUBLE DASH HORIZONTAL) */
- [0x254d, 0x254d], /* BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL (FORMS HEAVY DOUBLE DASH HORIZONTAL) */
- [0x254e, 0x254e], /* BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL (FORMS LIGHT DOUBLE DASH VERTICAL) */
- [0x254f, 0x254f], /* BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL (FORMS HEAVY DOUBLE DASH VERTICAL) */
- [0x2550, 0x2550], /* BOX DRAWINGS DOUBLE HORIZONTAL (FORMS DOUBLE HORIZONTAL) */
- [0x2551, 0x2551], /* BOX DRAWINGS DOUBLE VERTICAL (FORMS DOUBLE VERTICAL) */
- [0x2552, 0x2552], /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE (FORMS DOWN SINGLE AND RIGHT DOUBLE) */
- [0x2553, 0x2553], /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE (FORMS DOWN DOUBLE AND RIGHT SINGLE) */
- [0x2554, 0x2554], /* BOX DRAWINGS DOUBLE DOWN AND RIGHT (FORMS DOUBLE DOWN AND RIGHT) */
- [0x2555, 0x2555], /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE (FORMS DOWN SINGLE AND LEFT DOUBLE) */
- [0x2556, 0x2556], /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE (FORMS DOWN DOUBLE AND LEFT SINGLE) */
- [0x2557, 0x2557], /* BOX DRAWINGS DOUBLE DOWN AND LEFT (FORMS DOUBLE DOWN AND LEFT) */
- [0x2558, 0x2558], /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE (FORMS UP SINGLE AND RIGHT DOUBLE) */
- [0x2559, 0x2559], /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE (FORMS UP DOUBLE AND RIGHT SINGLE) */
- [0x255a, 0x255a], /* BOX DRAWINGS DOUBLE UP AND RIGHT (FORMS DOUBLE UP AND RIGHT) */
- [0x255b, 0x255b], /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE (FORMS UP SINGLE AND LEFT DOUBLE) */
- [0x255c, 0x255c], /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE (FORMS UP DOUBLE AND LEFT SINGLE) */
- [0x255d, 0x255d], /* BOX DRAWINGS DOUBLE UP AND LEFT (FORMS DOUBLE UP AND LEFT) */
- [0x255e, 0x255e], /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE (FORMS VERTICAL SINGLE AND RIGHT DOUBLE) */
- [0x255f, 0x255f], /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE (FORMS VERTICAL DOUBLE AND RIGHT SINGLE) */
- [0x2560, 0x2560], /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT (FORMS DOUBLE VERTICAL AND RIGHT) */
- [0x2561, 0x2561], /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE (FORMS VERTICAL SINGLE AND LEFT DOUBLE) */
- [0x2562, 0x2562], /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE (FORMS VERTICAL DOUBLE AND LEFT SINGLE) */
- [0x2563, 0x2563], /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT (FORMS DOUBLE VERTICAL AND LEFT) */
- [0x2564, 0x2564], /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE (FORMS DOWN SINGLE AND HORIZONTAL DOUBLE) */
- [0x2565, 0x2565], /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE (FORMS DOWN DOUBLE AND HORIZONTAL SINGLE) */
- [0x2566, 0x2566], /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL (FORMS DOUBLE DOWN AND HORIZONTAL) */
- [0x2567, 0x2567], /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE (FORMS UP SINGLE AND HORIZONTAL DOUBLE) */
- [0x2568, 0x2568], /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE (FORMS UP DOUBLE AND HORIZONTAL SINGLE) */
- [0x2569, 0x2569], /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL (FORMS DOUBLE UP AND HORIZONTAL) */
- [0x256a, 0x256a], /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE (FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE) */
- [0x256b, 0x256b], /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE (FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE) */
- [0x256c, 0x256c], /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL (FORMS DOUBLE VERTICAL AND HORIZONTAL) */
- [0x256d, 0x256d], /* BOX DRAWINGS LIGHT ARC DOWN AND RIGHT (FORMS LIGHT ARC DOWN AND RIGHT) */
- [0x256e, 0x256e], /* BOX DRAWINGS LIGHT ARC DOWN AND LEFT (FORMS LIGHT ARC DOWN AND LEFT) */
- [0x256f, 0x256f], /* BOX DRAWINGS LIGHT ARC UP AND LEFT (FORMS LIGHT ARC UP AND LEFT) */
- [0x2570, 0x2570], /* BOX DRAWINGS LIGHT ARC UP AND RIGHT (FORMS LIGHT ARC UP AND RIGHT) */
- [0x2571, 0x2571], /* BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT (FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT) */
- [0x2572, 0x2572], /* BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT (FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT) */
- [0x2573, 0x2573], /* BOX DRAWINGS LIGHT DIAGONAL CROSS (FORMS LIGHT DIAGONAL CROSS) */
- [0x2574, 0x2574], /* BOX DRAWINGS LIGHT LEFT (FORMS LIGHT LEFT) */
- [0x2575, 0x2575], /* BOX DRAWINGS LIGHT UP (FORMS LIGHT UP) */
- [0x2576, 0x2576], /* BOX DRAWINGS LIGHT RIGHT (FORMS LIGHT RIGHT) */
- [0x2577, 0x2577], /* BOX DRAWINGS LIGHT DOWN (FORMS LIGHT DOWN) */
- [0x2578, 0x2578], /* BOX DRAWINGS HEAVY LEFT (FORMS HEAVY LEFT) */
- [0x2579, 0x2579], /* BOX DRAWINGS HEAVY UP (FORMS HEAVY UP) */
- [0x257a, 0x257a], /* BOX DRAWINGS HEAVY RIGHT (FORMS HEAVY RIGHT) */
- [0x257b, 0x257b], /* BOX DRAWINGS HEAVY DOWN (FORMS HEAVY DOWN) */
- [0x257c, 0x257c], /* BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT (FORMS LIGHT LEFT AND HEAVY RIGHT) */
- [0x257d, 0x257d], /* BOX DRAWINGS LIGHT UP AND HEAVY DOWN (FORMS LIGHT UP AND HEAVY DOWN) */
- [0x257e, 0x257e], /* BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT (FORMS HEAVY LEFT AND LIGHT RIGHT) */
- [0x257f, 0x257f], /* BOX DRAWINGS HEAVY UP AND LIGHT DOWN (FORMS HEAVY UP AND LIGHT DOWN) */
- [0x2580, 0x2580], /* UPPER HALF BLOCK */
- [0x2581, 0x2581], /* LOWER ONE EIGHTH BLOCK */
- [0x2582, 0x2582], /* LOWER ONE QUARTER BLOCK */
- [0x2583, 0x2583], /* LOWER THREE EIGHTHS BLOCK */
- [0x2584, 0x2584], /* LOWER HALF BLOCK */
- [0x2585, 0x2585], /* LOWER FIVE EIGHTHS BLOCK */
- [0x2586, 0x2586], /* LOWER THREE QUARTERS BLOCK (LOWER THREE QUARTER BLOCK) */
- [0x2587, 0x2587], /* LOWER SEVEN EIGHTHS BLOCK */
- [0x2588, 0x2588], /* FULL BLOCK */
- [0x2589, 0x2589], /* LEFT SEVEN EIGHTHS BLOCK */
- [0x258a, 0x258a], /* LEFT THREE QUARTERS BLOCK (LEFT THREE QUARTER BLOCK) */
- [0x258b, 0x258b], /* LEFT FIVE EIGHTHS BLOCK */
- [0x258c, 0x258c], /* LEFT HALF BLOCK */
- [0x258d, 0x258d], /* LEFT THREE EIGHTHS BLOCK */
- [0x258e, 0x258e], /* LEFT ONE QUARTER BLOCK */
- [0x258f, 0x258f], /* LEFT ONE EIGHTH BLOCK */
- [0x2590, 0x2590], /* RIGHT HALF BLOCK */
- [0x2591, 0x2591], /* LIGHT SHADE */
- [0x2592, 0x2592], /* MEDIUM SHADE */
- [0x2593, 0x2593], /* DARK SHADE */
- [0x2594, 0x2594], /* UPPER ONE EIGHTH BLOCK */
- [0x2595, 0x2595], /* RIGHT ONE EIGHTH BLOCK */
- [0x2596, 0x2596], /* QUADRANT LOWER LEFT */
- [0x2597, 0x2597], /* QUADRANT LOWER RIGHT */
- [0x2598, 0x2598], /* QUADRANT UPPER LEFT */
- [0x2599, 0x2599], /* QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT */
- [0x259a, 0x259a], /* QUADRANT UPPER LEFT AND LOWER RIGHT */
- [0x259b, 0x259b], /* QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT */
- [0x259c, 0x259c], /* QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT */
- [0x259d, 0x259d], /* QUADRANT UPPER RIGHT */
- [0x259e, 0x259e], /* QUADRANT UPPER RIGHT AND LOWER LEFT */
- [0x259f, 0x259f], /* QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT */
- [0x25a0, 0x25a0], /* BLACK SQUARE */
- [0x25a1, 0x25a1], /* WHITE SQUARE */
- [0x25a2, 0x25a2], /* WHITE SQUARE WITH ROUNDED CORNERS */
- [0x25a3, 0x25a3], /* WHITE SQUARE CONTAINING BLACK SMALL SQUARE */
- [0x25a4, 0x25a4], /* SQUARE WITH HORIZONTAL FILL */
- [0x25a5, 0x25a5], /* SQUARE WITH VERTICAL FILL */
- [0x25a6, 0x25a6], /* SQUARE WITH ORTHOGONAL CROSSHATCH FILL */
- [0x25a7, 0x25a7], /* SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL */
- [0x25a8, 0x25a8], /* SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL */
- [0x25a9, 0x25a9], /* SQUARE WITH DIAGONAL CROSSHATCH FILL */
- [0x25aa, 0x25aa], /* BLACK SMALL SQUARE */
- [0x25ab, 0x25ab], /* WHITE SMALL SQUARE */
- [0x25ac, 0x25ac], /* BLACK RECTANGLE */
- [0x25ad, 0x25ad], /* WHITE RECTANGLE */
- [0x25ae, 0x25ae], /* BLACK VERTICAL RECTANGLE */
- [0x25af, 0x25af], /* WHITE VERTICAL RECTANGLE */
- [0x25b0, 0x25b0], /* BLACK PARALLELOGRAM */
- [0x25b1, 0x25b1], /* WHITE PARALLELOGRAM */
- [0x25b2, 0x25b2], /* BLACK UP-POINTING TRIANGLE (BLACK UP POINTING TRIANGLE) */
- [0x25b3, 0x25b3], /* WHITE UP-POINTING TRIANGLE (WHITE UP POINTING TRIANGLE) */
- [0x25b4, 0x25b4], /* BLACK UP-POINTING SMALL TRIANGLE (BLACK UP POINTING SMALL TRIANGLE) */
- [0x25b5, 0x25b5], /* WHITE UP-POINTING SMALL TRIANGLE (WHITE UP POINTING SMALL TRIANGLE) */
- [0x25b6, 0x25b6], /* BLACK RIGHT-POINTING TRIANGLE (BLACK RIGHT POINTING TRIANGLE) */
- [0x25b7, 0x25b7], /* WHITE RIGHT-POINTING TRIANGLE (WHITE RIGHT POINTING TRIANGLE) */
- [0x25b8, 0x25b8], /* BLACK RIGHT-POINTING SMALL TRIANGLE (BLACK RIGHT POINTING SMALL TRIANGLE) */
- [0x25b9, 0x25b9], /* WHITE RIGHT-POINTING SMALL TRIANGLE (WHITE RIGHT POINTING SMALL TRIANGLE) */
- [0x25ba, 0x25ba], /* BLACK RIGHT-POINTING POINTER (BLACK RIGHT POINTING POINTER) */
- [0x25bb, 0x25bb], /* WHITE RIGHT-POINTING POINTER (WHITE RIGHT POINTING POINTER) */
- [0x25bc, 0x25bc], /* BLACK DOWN-POINTING TRIANGLE (BLACK DOWN POINTING TRIANGLE) */
- [0x25bd, 0x25bd], /* WHITE DOWN-POINTING TRIANGLE (WHITE DOWN POINTING TRIANGLE) */
- [0x25be, 0x25be], /* BLACK DOWN-POINTING SMALL TRIANGLE (BLACK DOWN POINTING SMALL TRIANGLE) */
- [0x25bf, 0x25bf], /* WHITE DOWN-POINTING SMALL TRIANGLE (WHITE DOWN POINTING SMALL TRIANGLE) */
- [0x25c0, 0x25c0], /* BLACK LEFT-POINTING TRIANGLE (BLACK LEFT POINTING TRIANGLE) */
- [0x25c1, 0x25c1], /* WHITE LEFT-POINTING TRIANGLE (WHITE LEFT POINTING TRIANGLE) */
- [0x25c2, 0x25c2], /* BLACK LEFT-POINTING SMALL TRIANGLE (BLACK LEFT POINTING SMALL TRIANGLE) */
- [0x25c3, 0x25c3], /* WHITE LEFT-POINTING SMALL TRIANGLE (WHITE LEFT POINTING SMALL TRIANGLE) */
- [0x25c4, 0x25c4], /* BLACK LEFT-POINTING POINTER (BLACK LEFT POINTING POINTER) */
- [0x25c5, 0x25c5], /* WHITE LEFT-POINTING POINTER (WHITE LEFT POINTING POINTER) */
- [0x25c6, 0x25c6], /* BLACK DIAMOND */
- [0x25c7, 0x25c7], /* WHITE DIAMOND */
- [0x25c8, 0x25c8], /* WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND */
- [0x25c9, 0x25c9], /* FISHEYE */
- [0x25ca, 0x25ca], /* LOZENGE */
- [0x25cb, 0x25cb], /* WHITE CIRCLE */
- [0x25cc, 0x25cc], /* DOTTED CIRCLE */
- [0x25cd, 0x25cd], /* CIRCLE WITH VERTICAL FILL */
- [0x25ce, 0x25ce], /* BULLSEYE */
- [0x25cf, 0x25cf], /* BLACK CIRCLE */
- [0x25d0, 0x25d0], /* CIRCLE WITH LEFT HALF BLACK */
- [0x25d1, 0x25d1], /* CIRCLE WITH RIGHT HALF BLACK */
- [0x25d2, 0x25d2], /* CIRCLE WITH LOWER HALF BLACK */
- [0x25d3, 0x25d3], /* CIRCLE WITH UPPER HALF BLACK */
- [0x25d4, 0x25d4], /* CIRCLE WITH UPPER RIGHT QUADRANT BLACK */
- [0x25d5, 0x25d5], /* CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK */
- [0x25d6, 0x25d6], /* LEFT HALF BLACK CIRCLE */
- [0x25d7, 0x25d7], /* RIGHT HALF BLACK CIRCLE */
- [0x25d8, 0x25d8], /* INVERSE BULLET */
- [0x25d9, 0x25d9], /* INVERSE WHITE CIRCLE */
- [0x25da, 0x25da], /* UPPER HALF INVERSE WHITE CIRCLE */
- [0x25db, 0x25db], /* LOWER HALF INVERSE WHITE CIRCLE */
- [0x25dc, 0x25dc], /* UPPER LEFT QUADRANT CIRCULAR ARC */
- [0x25dd, 0x25dd], /* UPPER RIGHT QUADRANT CIRCULAR ARC */
- [0x25de, 0x25de], /* LOWER RIGHT QUADRANT CIRCULAR ARC */
- [0x25df, 0x25df], /* LOWER LEFT QUADRANT CIRCULAR ARC */
- [0x25e0, 0x25e0], /* UPPER HALF CIRCLE */
- [0x25e1, 0x25e1], /* LOWER HALF CIRCLE */
- [0x25e2, 0x25e2], /* BLACK LOWER RIGHT TRIANGLE */
- [0x25e3, 0x25e3], /* BLACK LOWER LEFT TRIANGLE */
- [0x25e4, 0x25e4], /* BLACK UPPER LEFT TRIANGLE */
- [0x25e5, 0x25e5], /* BLACK UPPER RIGHT TRIANGLE */
- [0x25e6, 0x25e6], /* WHITE BULLET */
- [0x25e7, 0x25e7], /* SQUARE WITH LEFT HALF BLACK */
- [0x25e8, 0x25e8], /* SQUARE WITH RIGHT HALF BLACK */
- [0x25e9, 0x25e9], /* SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK */
- [0x25ea, 0x25ea], /* SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK */
- [0x25eb, 0x25eb], /* WHITE SQUARE WITH VERTICAL BISECTING LINE */
- [0x25ec, 0x25ec], /* WHITE UP-POINTING TRIANGLE WITH DOT (WHITE UP POINTING TRIANGLE WITH DOT) */
- [0x25ed, 0x25ed], /* UP-POINTING TRIANGLE WITH LEFT HALF BLACK (UP POINTING TRIANGLE WITH LEFT HALF BLACK) */
- [0x25ee, 0x25ee], /* UP-POINTING TRIANGLE WITH RIGHT HALF BLACK (UP POINTING TRIANGLE WITH RIGHT HALF BLACK) */
- [0x25ef, 0x25ef], /* LARGE CIRCLE */
- [0x25f0, 0x25f0], /* WHITE SQUARE WITH UPPER LEFT QUADRANT */
- [0x25f1, 0x25f1], /* WHITE SQUARE WITH LOWER LEFT QUADRANT */
- [0x25f2, 0x25f2], /* WHITE SQUARE WITH LOWER RIGHT QUADRANT */
- [0x25f3, 0x25f3], /* WHITE SQUARE WITH UPPER RIGHT QUADRANT */
- [0x25f4, 0x25f4], /* WHITE CIRCLE WITH UPPER LEFT QUADRANT */
- [0x25f5, 0x25f5], /* WHITE CIRCLE WITH LOWER LEFT QUADRANT */
- [0x25f6, 0x25f6], /* WHITE CIRCLE WITH LOWER RIGHT QUADRANT */
- [0x25f7, 0x25f7], /* WHITE CIRCLE WITH UPPER RIGHT QUADRANT */
- [0x25f8, 0x25f8], /* UPPER LEFT TRIANGLE */
- [0x25f9, 0x25f9], /* UPPER RIGHT TRIANGLE */
- [0x25fa, 0x25fa], /* LOWER LEFT TRIANGLE */
- [0x25fb, 0x25fb], /* WHITE MEDIUM SQUARE */
- [0x25fc, 0x25fc], /* BLACK MEDIUM SQUARE */
- [0x25fd, 0x25fd], /* WHITE MEDIUM SMALL SQUARE */
- [0x25fe, 0x25fe], /* BLACK MEDIUM SMALL SQUARE */
- [0x25ff, 0x25ff], /* LOWER RIGHT TRIANGLE */
- [0x2600, 0x2600], /* BLACK SUN WITH RAYS */
- [0x2601, 0x2601], /* CLOUD */
- [0x2602, 0x2602], /* UMBRELLA */
- [0x2603, 0x2603], /* SNOWMAN */
- [0x2604, 0x2604], /* COMET */
- [0x2605, 0x2605], /* BLACK STAR */
- [0x2606, 0x2606], /* WHITE STAR */
- [0x2607, 0x2607], /* LIGHTNING */
- [0x2608, 0x2608], /* THUNDERSTORM */
- [0x2609, 0x2609], /* SUN */
- [0x260a, 0x260a], /* ASCENDING NODE */
- [0x260b, 0x260b], /* DESCENDING NODE */
- [0x260c, 0x260c], /* CONJUNCTION */
- [0x260d, 0x260d], /* OPPOSITION */
- [0x260e, 0x260e], /* BLACK TELEPHONE */
- [0x260f, 0x260f], /* WHITE TELEPHONE */
- [0x2610, 0x2610], /* BALLOT BOX */
- [0x2611, 0x2611], /* BALLOT BOX WITH CHECK */
- [0x2612, 0x2612], /* BALLOT BOX WITH X */
- [0x2613, 0x2613], /* SALTIRE */
- [0x2614, 0x2614], /* UMBRELLA WITH RAIN DROPS */
- [0x2615, 0x2615], /* HOT BEVERAGE */
- [0x2616, 0x2616], /* WHITE SHOGI PIECE */
- [0x2617, 0x2617], /* BLACK SHOGI PIECE */
- [0x2618, 0x2618], /* SHAMROCK */
- [0x2619, 0x2619], /* REVERSED ROTATED FLORAL HEART BULLET */
- [0x261a, 0x261a], /* BLACK LEFT POINTING INDEX */
- [0x261b, 0x261b], /* BLACK RIGHT POINTING INDEX */
- [0x261c, 0x261c], /* WHITE LEFT POINTING INDEX */
- [0x261d, 0x261d], /* WHITE UP POINTING INDEX */
- [0x261e, 0x261e], /* WHITE RIGHT POINTING INDEX */
- [0x261f, 0x261f], /* WHITE DOWN POINTING INDEX */
- [0x2620, 0x2620], /* SKULL AND CROSSBONES */
- [0x2621, 0x2621], /* CAUTION SIGN */
- [0x2622, 0x2622], /* RADIOACTIVE SIGN */
- [0x2623, 0x2623], /* BIOHAZARD SIGN */
- [0x2624, 0x2624], /* CADUCEUS */
- [0x2625, 0x2625], /* ANKH */
- [0x2626, 0x2626], /* ORTHODOX CROSS */
- [0x2627, 0x2627], /* CHI RHO */
- [0x2628, 0x2628], /* CROSS OF LORRAINE */
- [0x2629, 0x2629], /* CROSS OF JERUSALEM */
- [0x262a, 0x262a], /* STAR AND CRESCENT */
- [0x262b, 0x262b], /* FARSI SYMBOL (SYMBOL OF IRAN) */
- [0x262c, 0x262c], /* ADI SHAKTI */
- [0x262d, 0x262d], /* HAMMER AND SICKLE */
- [0x262e, 0x262e], /* PEACE SYMBOL */
- [0x262f, 0x262f], /* YIN YANG */
- [0x2630, 0x2630], /* TRIGRAM FOR HEAVEN */
- [0x2631, 0x2631], /* TRIGRAM FOR LAKE */
- [0x2632, 0x2632], /* TRIGRAM FOR FIRE */
- [0x2633, 0x2633], /* TRIGRAM FOR THUNDER */
- [0x2634, 0x2634], /* TRIGRAM FOR WIND */
- [0x2635, 0x2635], /* TRIGRAM FOR WATER */
- [0x2636, 0x2636], /* TRIGRAM FOR MOUNTAIN */
- [0x2637, 0x2637], /* TRIGRAM FOR EARTH */
- [0x2638, 0x2638], /* WHEEL OF DHARMA */
- [0x2639, 0x2639], /* WHITE FROWNING FACE */
- [0x263a, 0x263a], /* WHITE SMILING FACE */
- [0x263b, 0x263b], /* BLACK SMILING FACE */
- [0x263c, 0x263c], /* WHITE SUN WITH RAYS */
- [0x263d, 0x263d], /* FIRST QUARTER MOON */
- [0x263e, 0x263e], /* LAST QUARTER MOON */
- [0x263f, 0x263f], /* MERCURY */
- [0x2640, 0x2640], /* FEMALE SIGN */
- [0x2641, 0x2641], /* EARTH */
- [0x2642, 0x2642], /* MALE SIGN */
- [0x2643, 0x2643], /* JUPITER */
- [0x2644, 0x2644], /* SATURN */
- [0x2645, 0x2645], /* URANUS */
- [0x2646, 0x2646], /* NEPTUNE */
- [0x2647, 0x2647], /* PLUTO */
- [0x2648, 0x2648], /* ARIES */
- [0x2649, 0x2649], /* TAURUS */
- [0x264a, 0x264a], /* GEMINI */
- [0x264b, 0x264b], /* CANCER */
- [0x264c, 0x264c], /* LEO */
- [0x264d, 0x264d], /* VIRGO */
- [0x264e, 0x264e], /* LIBRA */
- [0x264f, 0x264f], /* SCORPIUS */
- [0x2650, 0x2650], /* SAGITTARIUS */
- [0x2651, 0x2651], /* CAPRICORN */
- [0x2652, 0x2652], /* AQUARIUS */
- [0x2653, 0x2653], /* PISCES */
- [0x2654, 0x2654], /* WHITE CHESS KING */
- [0x2655, 0x2655], /* WHITE CHESS QUEEN */
- [0x2656, 0x2656], /* WHITE CHESS ROOK */
- [0x2657, 0x2657], /* WHITE CHESS BISHOP */
- [0x2658, 0x2658], /* WHITE CHESS KNIGHT */
- [0x2659, 0x2659], /* WHITE CHESS PAWN */
- [0x265a, 0x265a], /* BLACK CHESS KING */
- [0x265b, 0x265b], /* BLACK CHESS QUEEN */
- [0x265c, 0x265c], /* BLACK CHESS ROOK */
- [0x265d, 0x265d], /* BLACK CHESS BISHOP */
- [0x265e, 0x265e], /* BLACK CHESS KNIGHT */
- [0x265f, 0x265f], /* BLACK CHESS PAWN */
- [0x2660, 0x2660], /* BLACK SPADE SUIT */
- [0x2661, 0x2661], /* WHITE HEART SUIT */
- [0x2662, 0x2662], /* WHITE DIAMOND SUIT */
- [0x2663, 0x2663], /* BLACK CLUB SUIT */
- [0x2664, 0x2664], /* WHITE SPADE SUIT */
- [0x2665, 0x2665], /* BLACK HEART SUIT */
- [0x2666, 0x2666], /* BLACK DIAMOND SUIT */
- [0x2667, 0x2667], /* WHITE CLUB SUIT */
- [0x2668, 0x2668], /* HOT SPRINGS */
- [0x2669, 0x2669], /* QUARTER NOTE */
- [0x266a, 0x266a], /* EIGHTH NOTE */
- [0x266b, 0x266b], /* BEAMED EIGHTH NOTES (BARRED EIGHTH NOTES) */
- [0x266c, 0x266c], /* BEAMED SIXTEENTH NOTES (BARRED SIXTEENTH NOTES) */
- [0x266d, 0x266d], /* MUSIC FLAT SIGN (FLAT) */
- [0x266e, 0x266e], /* MUSIC NATURAL SIGN (NATURAL) */
- [0x266f, 0x266f], /* MUSIC SHARP SIGN (SHARP) */
- [0x2670, 0x2670], /* WEST SYRIAC CROSS */
- [0x2671, 0x2671], /* EAST SYRIAC CROSS */
- [0x2672, 0x2672], /* UNIVERSAL RECYCLING SYMBOL */
- [0x2673, 0x2673], /* RECYCLING SYMBOL FOR TYPE-1 PLASTICS */
- [0x2674, 0x2674], /* RECYCLING SYMBOL FOR TYPE-2 PLASTICS */
- [0x2675, 0x2675], /* RECYCLING SYMBOL FOR TYPE-3 PLASTICS */
- [0x2676, 0x2676], /* RECYCLING SYMBOL FOR TYPE-4 PLASTICS */
- [0x2677, 0x2677], /* RECYCLING SYMBOL FOR TYPE-5 PLASTICS */
- [0x2678, 0x2678], /* RECYCLING SYMBOL FOR TYPE-6 PLASTICS */
- [0x2679, 0x2679], /* RECYCLING SYMBOL FOR TYPE-7 PLASTICS */
- [0x267a, 0x267a], /* RECYCLING SYMBOL FOR GENERIC MATERIALS */
- [0x267b, 0x267b], /* BLACK UNIVERSAL RECYCLING SYMBOL */
- [0x267c, 0x267c], /* RECYCLED PAPER SYMBOL */
- [0x267d, 0x267d], /* PARTIALLY-RECYCLED PAPER SYMBOL */
- [0x267e, 0x267e], /* PERMANENT PAPER SIGN */
- [0x267f, 0x267f], /* WHEELCHAIR SYMBOL */
- [0x2680, 0x2680], /* DIE FACE-1 */
- [0x2681, 0x2681], /* DIE FACE-2 */
- [0x2682, 0x2682], /* DIE FACE-3 */
- [0x2683, 0x2683], /* DIE FACE-4 */
- [0x2684, 0x2684], /* DIE FACE-5 */
- [0x2685, 0x2685], /* DIE FACE-6 */
- [0x2686, 0x2686], /* WHITE CIRCLE WITH DOT RIGHT */
- [0x2687, 0x2687], /* WHITE CIRCLE WITH TWO DOTS */
- [0x2688, 0x2688], /* BLACK CIRCLE WITH WHITE DOT RIGHT */
- [0x2689, 0x2689], /* BLACK CIRCLE WITH TWO WHITE DOTS */
- [0x268a, 0x268a], /* MONOGRAM FOR YANG */
- [0x268b, 0x268b], /* MONOGRAM FOR YIN */
- [0x268c, 0x268c], /* DIGRAM FOR GREATER YANG */
- [0x268d, 0x268d], /* DIGRAM FOR LESSER YIN */
- [0x268e, 0x268e], /* DIGRAM FOR LESSER YANG */
- [0x268f, 0x268f], /* DIGRAM FOR GREATER YIN */
- [0x2690, 0x2690], /* WHITE FLAG */
- [0x2691, 0x2691], /* BLACK FLAG */
- [0x2692, 0x2692], /* HAMMER AND PICK */
- [0x2693, 0x2693], /* ANCHOR */
- [0x2694, 0x2694], /* CROSSED SWORDS */
- [0x2695, 0x2695], /* STAFF OF AESCULAPIUS */
- [0x2696, 0x2696], /* SCALES */
- [0x2697, 0x2697], /* ALEMBIC */
- [0x2698, 0x2698], /* FLOWER */
- [0x2699, 0x2699], /* GEAR */
- [0x269a, 0x269a], /* STAFF OF HERMES */
- [0x269b, 0x269b], /* ATOM SYMBOL */
- [0x269c, 0x269c], /* FLEUR-DE-LIS */
- [0x269d, 0x269d], /* OUTLINED WHITE STAR */
- [0x269e, 0x269e], /* THREE LINES CONVERGING RIGHT */
- [0x269f, 0x269f], /* THREE LINES CONVERGING LEFT */
- [0x26a0, 0x26a0], /* WARNING SIGN */
- [0x26a1, 0x26a1], /* HIGH VOLTAGE SIGN */
- [0x26a2, 0x26a2], /* DOUBLED FEMALE SIGN */
- [0x26a3, 0x26a3], /* DOUBLED MALE SIGN */
- [0x26a4, 0x26a4], /* INTERLOCKED FEMALE AND MALE SIGN */
- [0x26a5, 0x26a5], /* MALE AND FEMALE SIGN */
- [0x26a6, 0x26a6], /* MALE WITH STROKE SIGN */
- [0x26a7, 0x26a7], /* MALE WITH STROKE AND MALE AND FEMALE SIGN */
- [0x26a8, 0x26a8], /* VERTICAL MALE WITH STROKE SIGN */
- [0x26a9, 0x26a9], /* HORIZONTAL MALE WITH STROKE SIGN */
- [0x26aa, 0x26aa], /* MEDIUM WHITE CIRCLE */
- [0x26ab, 0x26ab], /* MEDIUM BLACK CIRCLE */
- [0x26ac, 0x26ac], /* MEDIUM SMALL WHITE CIRCLE */
- [0x26ad, 0x26ad], /* MARRIAGE SYMBOL */
- [0x26ae, 0x26ae], /* DIVORCE SYMBOL */
- [0x26af, 0x26af], /* UNMARRIED PARTNERSHIP SYMBOL */
- [0x26b0, 0x26b0], /* COFFIN */
- [0x26b1, 0x26b1], /* FUNERAL URN */
- [0x26b2, 0x26b2], /* NEUTER */
- [0x26b3, 0x26b3], /* CERES */
- [0x26b4, 0x26b4], /* PALLAS */
- [0x26b5, 0x26b5], /* JUNO */
- [0x26b6, 0x26b6], /* VESTA */
- [0x26b7, 0x26b7], /* CHIRON */
- [0x26b8, 0x26b8], /* BLACK MOON LILITH */
- [0x26b9, 0x26b9], /* SEXTILE */
- [0x26ba, 0x26ba], /* SEMISEXTILE */
- [0x26bb, 0x26bb], /* QUINCUNX */
- [0x26bc, 0x26bc], /* SESQUIQUADRATE */
- [0x26bd, 0x26bd], /* SOCCER BALL */
- [0x26be, 0x26be], /* BASEBALL */
- [0x26bf, 0x26bf], /* SQUARED KEY */
- [0x26c0, 0x26c0], /* WHITE DRAUGHTS MAN */
- [0x26c1, 0x26c1], /* WHITE DRAUGHTS KING */
- [0x26c2, 0x26c2], /* BLACK DRAUGHTS MAN */
- [0x26c3, 0x26c3], /* BLACK DRAUGHTS KING */
- [0x26c4, 0x26c4], /* SNOWMAN WITHOUT SNOW */
- [0x26c5, 0x26c5], /* SUN BEHIND CLOUD */
- [0x26c6, 0x26c6], /* RAIN */
- [0x26c7, 0x26c7], /* BLACK SNOWMAN */
- [0x26c8, 0x26c8], /* THUNDER CLOUD AND RAIN */
- [0x26c9, 0x26c9], /* TURNED WHITE SHOGI PIECE */
- [0x26ca, 0x26ca], /* TURNED BLACK SHOGI PIECE */
- [0x26cb, 0x26cb], /* WHITE DIAMOND IN SQUARE */
- [0x26cc, 0x26cc], /* CROSSING LANES */
- [0x26cd, 0x26cd], /* DISABLED CAR */
- [0x26ce, 0x26ce], /* OPHIUCHUS */
- [0x26cf, 0x26cf], /* PICK */
- [0x26d0, 0x26d0], /* CAR SLIDING */
- [0x26d1, 0x26d1], /* HELMET WITH WHITE CROSS */
- [0x26d2, 0x26d2], /* CIRCLED CROSSING LANES */
- [0x26d3, 0x26d3], /* CHAINS */
- [0x26d4, 0x26d4], /* NO ENTRY */
- [0x26d5, 0x26d5], /* ALTERNATE ONE-WAY LEFT WAY TRAFFIC */
- [0x26d6, 0x26d6], /* BLACK TWO-WAY LEFT WAY TRAFFIC */
- [0x26d7, 0x26d7], /* WHITE TWO-WAY LEFT WAY TRAFFIC */
- [0x26d8, 0x26d8], /* BLACK LEFT LANE MERGE */
- [0x26d9, 0x26d9], /* WHITE LEFT LANE MERGE */
- [0x26da, 0x26da], /* DRIVE SLOW SIGN */
- [0x26db, 0x26db], /* HEAVY WHITE DOWN-POINTING TRIANGLE */
- [0x26dc, 0x26dc], /* LEFT CLOSED ENTRY */
- [0x26dd, 0x26dd], /* SQUARED SALTIRE */
- [0x26de, 0x26de], /* FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE */
- [0x26df, 0x26df], /* BLACK TRUCK */
- [0x26e0, 0x26e0], /* RESTRICTED LEFT ENTRY-1 */
- [0x26e1, 0x26e1], /* RESTRICTED LEFT ENTRY-2 */
- [0x26e2, 0x26e2], /* ASTRONOMICAL SYMBOL FOR URANUS */
- [0x26e3, 0x26e3], /* HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE */
- [0x26e4, 0x26e4], /* PENTAGRAM */
- [0x26e5, 0x26e5], /* RIGHT-HANDED INTERLACED PENTAGRAM */
- [0x26e6, 0x26e6], /* LEFT-HANDED INTERLACED PENTAGRAM */
- [0x26e7, 0x26e7], /* INVERTED PENTAGRAM */
- [0x26e8, 0x26e8], /* BLACK CROSS ON SHIELD */
- [0x26e9, 0x26e9], /* SHINTO SHRINE */
- [0x26ea, 0x26ea], /* CHURCH */
- [0x26eb, 0x26eb], /* CASTLE */
- [0x26ec, 0x26ec], /* HISTORIC SITE */
- [0x26ed, 0x26ed], /* GEAR WITHOUT HUB */
- [0x26ee, 0x26ee], /* GEAR WITH HANDLES */
- [0x26ef, 0x26ef], /* MAP SYMBOL FOR LIGHTHOUSE */
- [0x26f0, 0x26f0], /* MOUNTAIN */
- [0x26f1, 0x26f1], /* UMBRELLA ON GROUND */
- [0x26f2, 0x26f2], /* FOUNTAIN */
- [0x26f3, 0x26f3], /* FLAG IN HOLE */
- [0x26f4, 0x26f4], /* FERRY */
- [0x26f5, 0x26f5], /* SAILBOAT */
- [0x26f6, 0x26f6], /* SQUARE FOUR CORNERS */
- [0x26f7, 0x26f7], /* SKIER */
- [0x26f8, 0x26f8], /* ICE SKATE */
- [0x26f9, 0x26f9], /* PERSON WITH BALL */
- [0x26fa, 0x26fa], /* TENT */
- [0x26fb, 0x26fb], /* JAPANESE BANK SYMBOL */
- [0x26fc, 0x26fc], /* HEADSTONE GRAVEYARD SYMBOL */
- [0x26fd, 0x26fd], /* FUEL PUMP */
- [0x26fe, 0x26fe], /* CUP ON BLACK SQUARE */
- [0x26ff, 0x26ff], /* WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE */
- [0x2700, 0x2700], /* BLACK SAFETY SCISSORS */
- [0x2701, 0x2701], /* UPPER BLADE SCISSORS */
- [0x2702, 0x2702], /* BLACK SCISSORS */
- [0x2703, 0x2703], /* LOWER BLADE SCISSORS */
- [0x2704, 0x2704], /* WHITE SCISSORS */
- [0x2705, 0x2705], /* WHITE HEAVY CHECK MARK */
- [0x2706, 0x2706], /* TELEPHONE LOCATION SIGN */
- [0x2707, 0x2707], /* TAPE DRIVE */
- [0x2708, 0x2708], /* AIRPLANE */
- [0x2709, 0x2709], /* ENVELOPE */
- [0x270a, 0x270a], /* RAISED FIST */
- [0x270b, 0x270b], /* RAISED HAND */
- [0x270c, 0x270c], /* VICTORY HAND */
- [0x270d, 0x270d], /* WRITING HAND */
- [0x270e, 0x270e], /* LOWER RIGHT PENCIL */
- [0x270f, 0x270f], /* PENCIL */
- [0x2710, 0x2710], /* UPPER RIGHT PENCIL */
- [0x2711, 0x2711], /* WHITE NIB */
- [0x2712, 0x2712], /* BLACK NIB */
- [0x2713, 0x2713], /* CHECK MARK */
- [0x2714, 0x2714], /* HEAVY CHECK MARK */
- [0x2715, 0x2715], /* MULTIPLICATION X */
- [0x2716, 0x2716], /* HEAVY MULTIPLICATION X */
- [0x2717, 0x2717], /* BALLOT X */
- [0x2718, 0x2718], /* HEAVY BALLOT X */
- [0x2719, 0x2719], /* OUTLINED GREEK CROSS */
- [0x271a, 0x271a], /* HEAVY GREEK CROSS */
- [0x271b, 0x271b], /* OPEN CENTRE CROSS (OPEN CENTER CROSS) */
- [0x271c, 0x271c], /* HEAVY OPEN CENTRE CROSS (HEAVY OPEN CENTER CROSS) */
- [0x271d, 0x271d], /* LATIN CROSS */
- [0x271e, 0x271e], /* SHADOWED WHITE LATIN CROSS */
- [0x271f, 0x271f], /* OUTLINED LATIN CROSS */
- [0x2720, 0x2720], /* MALTESE CROSS */
- [0x2721, 0x2721], /* STAR OF DAVID */
- [0x2722, 0x2722], /* FOUR TEARDROP-SPOKED ASTERISK */
- [0x2723, 0x2723], /* FOUR BALLOON-SPOKED ASTERISK */
- [0x2724, 0x2724], /* HEAVY FOUR BALLOON-SPOKED ASTERISK */
- [0x2725, 0x2725], /* FOUR CLUB-SPOKED ASTERISK */
- [0x2726, 0x2726], /* BLACK FOUR POINTED STAR */
- [0x2727, 0x2727], /* WHITE FOUR POINTED STAR */
- [0x2728, 0x2728], /* SPARKLES */
- [0x2729, 0x2729], /* STRESS OUTLINED WHITE STAR */
- [0x272a, 0x272a], /* CIRCLED WHITE STAR */
- [0x272b, 0x272b], /* OPEN CENTRE BLACK STAR (OPEN CENTER BLACK STAR) */
- [0x272c, 0x272c], /* BLACK CENTRE WHITE STAR (BLACK CENTER WHITE STAR) */
- [0x272d, 0x272d], /* OUTLINED BLACK STAR */
- [0x272e, 0x272e], /* HEAVY OUTLINED BLACK STAR */
- [0x272f, 0x272f], /* PINWHEEL STAR */
- [0x2730, 0x2730], /* SHADOWED WHITE STAR */
- [0x2731, 0x2731], /* HEAVY ASTERISK */
- [0x2732, 0x2732], /* OPEN CENTRE ASTERISK (OPEN CENTER ASTERISK) */
- [0x2733, 0x2733], /* EIGHT SPOKED ASTERISK */
- [0x2734, 0x2734], /* EIGHT POINTED BLACK STAR */
- [0x2735, 0x2735], /* EIGHT POINTED PINWHEEL STAR */
- [0x2736, 0x2736], /* SIX POINTED BLACK STAR */
- [0x2737, 0x2737], /* EIGHT POINTED RECTILINEAR BLACK STAR */
- [0x2738, 0x2738], /* HEAVY EIGHT POINTED RECTILINEAR BLACK STAR */
- [0x2739, 0x2739], /* TWELVE POINTED BLACK STAR */
- [0x273a, 0x273a], /* SIXTEEN POINTED ASTERISK */
- [0x273b, 0x273b], /* TEARDROP-SPOKED ASTERISK */
- [0x273c, 0x273c], /* OPEN CENTRE TEARDROP-SPOKED ASTERISK (OPEN CENTER TEARDROP-SPOKED ASTERISK) */
- [0x273d, 0x273d], /* HEAVY TEARDROP-SPOKED ASTERISK */
- [0x273e, 0x273e], /* SIX PETALLED BLACK AND WHITE FLORETTE */
- [0x273f, 0x273f], /* BLACK FLORETTE */
- [0x2740, 0x2740], /* WHITE FLORETTE */
- [0x2741, 0x2741], /* EIGHT PETALLED OUTLINED BLACK FLORETTE */
- [0x2742, 0x2742], /* CIRCLED OPEN CENTRE EIGHT POINTED STAR (CIRCLED OPEN CENTER EIGHT POINTED STAR) */
- [0x2743, 0x2743], /* HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK */
- [0x2744, 0x2744], /* SNOWFLAKE */
- [0x2745, 0x2745], /* TIGHT TRIFOLIATE SNOWFLAKE */
- [0x2746, 0x2746], /* HEAVY CHEVRON SNOWFLAKE */
- [0x2747, 0x2747], /* SPARKLE */
- [0x2748, 0x2748], /* HEAVY SPARKLE */
- [0x2749, 0x2749], /* BALLOON-SPOKED ASTERISK */
- [0x274a, 0x274a], /* EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */
- [0x274b, 0x274b], /* HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */
- [0x274c, 0x274c], /* CROSS MARK */
- [0x274d, 0x274d], /* SHADOWED WHITE CIRCLE */
- [0x274e, 0x274e], /* NEGATIVE SQUARED CROSS MARK */
- [0x274f, 0x274f], /* LOWER RIGHT DROP-SHADOWED WHITE SQUARE */
- [0x2750, 0x2750], /* UPPER RIGHT DROP-SHADOWED WHITE SQUARE */
- [0x2751, 0x2751], /* LOWER RIGHT SHADOWED WHITE SQUARE */
- [0x2752, 0x2752], /* UPPER RIGHT SHADOWED WHITE SQUARE */
- [0x2753, 0x2753], /* BLACK QUESTION MARK ORNAMENT */
- [0x2754, 0x2754], /* WHITE QUESTION MARK ORNAMENT */
- [0x2755, 0x2755], /* WHITE EXCLAMATION MARK ORNAMENT */
- [0x2756, 0x2756], /* BLACK DIAMOND MINUS WHITE X */
- [0x2757, 0x2757], /* HEAVY EXCLAMATION MARK SYMBOL */
- [0x2758, 0x2758], /* LIGHT VERTICAL BAR */
- [0x2759, 0x2759], /* MEDIUM VERTICAL BAR */
- [0x275a, 0x275a], /* HEAVY VERTICAL BAR */
- [0x275b, 0x275b], /* HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT */
- [0x275c, 0x275c], /* HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT */
- [0x275d, 0x275d], /* HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT */
- [0x275e, 0x275e], /* HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT */
- [0x275f, 0x275f], /* HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT */
- [0x2760, 0x2760], /* HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT */
- [0x2761, 0x2761], /* CURVED STEM PARAGRAPH SIGN ORNAMENT */
- [0x2762, 0x2762], /* HEAVY EXCLAMATION MARK ORNAMENT */
- [0x2763, 0x2763], /* HEAVY HEART EXCLAMATION MARK ORNAMENT */
- [0x2764, 0x2764], /* HEAVY BLACK HEART */
- [0x2765, 0x2765], /* ROTATED HEAVY BLACK HEART BULLET */
- [0x2766, 0x2766], /* FLORAL HEART */
- [0x2767, 0x2767], /* ROTATED FLORAL HEART BULLET */
- [0x2768, 0x2768], /* MEDIUM LEFT PARENTHESIS ORNAMENT */
- [0x2769, 0x2769], /* MEDIUM RIGHT PARENTHESIS ORNAMENT */
- [0x276a, 0x276a], /* MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT */
- [0x276b, 0x276b], /* MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT */
- [0x276c, 0x276c], /* MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT */
- [0x276d, 0x276d], /* MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT */
- [0x276e, 0x276e], /* HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT */
- [0x276f, 0x276f], /* HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT */
- [0x2770, 0x2770], /* HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT */
- [0x2771, 0x2771], /* HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT */
- [0x2772, 0x2772], /* LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT */
- [0x2773, 0x2773], /* LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT */
- [0x2774, 0x2774], /* MEDIUM LEFT CURLY BRACKET ORNAMENT */
- [0x2775, 0x2775], /* MEDIUM RIGHT CURLY BRACKET ORNAMENT */
- [0x2776, 0x2776], /* DINGBAT NEGATIVE CIRCLED DIGIT ONE (INVERSE CIRCLED DIGIT ONE) */
- [0x2777, 0x2777], /* DINGBAT NEGATIVE CIRCLED DIGIT TWO (INVERSE CIRCLED DIGIT TWO) */
- [0x2778, 0x2778], /* DINGBAT NEGATIVE CIRCLED DIGIT THREE (INVERSE CIRCLED DIGIT THREE) */
- [0x2779, 0x2779], /* DINGBAT NEGATIVE CIRCLED DIGIT FOUR (INVERSE CIRCLED DIGIT FOUR) */
- [0x277a, 0x277a], /* DINGBAT NEGATIVE CIRCLED DIGIT FIVE (INVERSE CIRCLED DIGIT FIVE) */
- [0x277b, 0x277b], /* DINGBAT NEGATIVE CIRCLED DIGIT SIX (INVERSE CIRCLED DIGIT SIX) */
- [0x277c, 0x277c], /* DINGBAT NEGATIVE CIRCLED DIGIT SEVEN (INVERSE CIRCLED DIGIT SEVEN) */
- [0x277d, 0x277d], /* DINGBAT NEGATIVE CIRCLED DIGIT EIGHT (INVERSE CIRCLED DIGIT EIGHT) */
- [0x277e, 0x277e], /* DINGBAT NEGATIVE CIRCLED DIGIT NINE (INVERSE CIRCLED DIGIT NINE) */
- [0x277f, 0x277f], /* DINGBAT NEGATIVE CIRCLED NUMBER TEN (INVERSE CIRCLED NUMBER TEN) */
- [0x2780, 0x2780], /* DINGBAT CIRCLED SANS-SERIF DIGIT ONE (CIRCLED SANS-SERIF DIGIT ONE) */
- [0x2781, 0x2781], /* DINGBAT CIRCLED SANS-SERIF DIGIT TWO (CIRCLED SANS-SERIF DIGIT TWO) */
- [0x2782, 0x2782], /* DINGBAT CIRCLED SANS-SERIF DIGIT THREE (CIRCLED SANS-SERIF DIGIT THREE) */
- [0x2783, 0x2783], /* DINGBAT CIRCLED SANS-SERIF DIGIT FOUR (CIRCLED SANS-SERIF DIGIT FOUR) */
- [0x2784, 0x2784], /* DINGBAT CIRCLED SANS-SERIF DIGIT FIVE (CIRCLED SANS-SERIF DIGIT FIVE) */
- [0x2785, 0x2785], /* DINGBAT CIRCLED SANS-SERIF DIGIT SIX (CIRCLED SANS-SERIF DIGIT SIX) */
- [0x2786, 0x2786], /* DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN (CIRCLED SANS-SERIF DIGIT SEVEN) */
- [0x2787, 0x2787], /* DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT (CIRCLED SANS-SERIF DIGIT EIGHT) */
- [0x2788, 0x2788], /* DINGBAT CIRCLED SANS-SERIF DIGIT NINE (CIRCLED SANS-SERIF DIGIT NINE) */
- [0x2789, 0x2789], /* DINGBAT CIRCLED SANS-SERIF NUMBER TEN (CIRCLED SANS-SERIF NUMBER TEN) */
- [0x278a, 0x278a], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE (INVERSE CIRCLED SANS-SERIF DIGIT ONE) */
- [0x278b, 0x278b], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO (INVERSE CIRCLED SANS-SERIF DIGIT TWO) */
- [0x278c, 0x278c], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE (INVERSE CIRCLED SANS-SERIF DIGIT THREE) */
- [0x278d, 0x278d], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR (INVERSE CIRCLED SANS-SERIF DIGIT FOUR) */
- [0x278e, 0x278e], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE (INVERSE CIRCLED SANS-SERIF DIGIT FIVE) */
- [0x278f, 0x278f], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX (INVERSE CIRCLED SANS-SERIF DIGIT SIX) */
- [0x2790, 0x2790], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN (INVERSE CIRCLED SANS-SERIF DIGIT SEVEN) */
- [0x2791, 0x2791], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT (INVERSE CIRCLED SANS-SERIF DIGIT EIGHT) */
- [0x2792, 0x2792], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE (INVERSE CIRCLED SANS-SERIF DIGIT NINE) */
- [0x2793, 0x2793], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN (INVERSE CIRCLED SANS-SERIF NUMBER TEN) */
- [0x2794, 0x2794], /* HEAVY WIDE-HEADED RIGHTWARDS ARROW (HEAVY WIDE-HEADED RIGHT ARROW) */
- [0x2795, 0x2795], /* HEAVY PLUS SIGN */
- [0x2796, 0x2796], /* HEAVY MINUS SIGN */
- [0x2797, 0x2797], /* HEAVY DIVISION SIGN */
- [0x2798, 0x2798], /* HEAVY SOUTH EAST ARROW (HEAVY LOWER RIGHT ARROW) */
- [0x2799, 0x2799], /* HEAVY RIGHTWARDS ARROW (HEAVY RIGHT ARROW) */
- [0x279a, 0x279a], /* HEAVY NORTH EAST ARROW (HEAVY UPPER RIGHT ARROW) */
- [0x279b, 0x279b], /* DRAFTING POINT RIGHTWARDS ARROW (DRAFTING POINT RIGHT ARROW) */
- [0x279c, 0x279c], /* HEAVY ROUND-TIPPED RIGHTWARDS ARROW (HEAVY ROUND-TIPPED RIGHT ARROW) */
- [0x279d, 0x279d], /* TRIANGLE-HEADED RIGHTWARDS ARROW (TRIANGLE-HEADED RIGHT ARROW) */
- [0x279e, 0x279e], /* HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW (HEAVY TRIANGLE-HEADED RIGHT ARROW) */
- [0x279f, 0x279f], /* DASHED TRIANGLE-HEADED RIGHTWARDS ARROW (DASHED TRIANGLE-HEADED RIGHT ARROW) */
- [0x27a0, 0x27a0], /* HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW (HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW) */
- [0x27a1, 0x27a1], /* BLACK RIGHTWARDS ARROW (BLACK RIGHT ARROW) */
- [0x27a2, 0x27a2], /* THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD (THREE-D TOP-LIGHTED RIGHT ARROWHEAD) */
- [0x27a3, 0x27a3], /* THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD (THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD) */
- [0x27a4, 0x27a4], /* BLACK RIGHTWARDS ARROWHEAD (BLACK RIGHT ARROWHEAD) */
- [0x27a5, 0x27a5], /* HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW (HEAVY BLACK CURVED DOWN AND RIGHT ARROW) */
- [0x27a6, 0x27a6], /* HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW (HEAVY BLACK CURVED UP AND RIGHT ARROW) */
- [0x27a7, 0x27a7], /* SQUAT BLACK RIGHTWARDS ARROW (SQUAT BLACK RIGHT ARROW) */
- [0x27a8, 0x27a8], /* HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW (HEAVY CONCAVE-POINTED BLACK RIGHT ARROW) */
- [0x27a9, 0x27a9], /* RIGHT-SHADED WHITE RIGHTWARDS ARROW (RIGHT-SHADED WHITE RIGHT ARROW) */
- [0x27aa, 0x27aa], /* LEFT-SHADED WHITE RIGHTWARDS ARROW (LEFT-SHADED WHITE RIGHT ARROW) */
- [0x27ab, 0x27ab], /* BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW (BACK-TILTED SHADOWED WHITE RIGHT ARROW) */
- [0x27ac, 0x27ac], /* FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW (FRONT-TILTED SHADOWED WHITE RIGHT ARROW) */
- [0x27ad, 0x27ad], /* HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW) */
- [0x27ae, 0x27ae], /* HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW) */
- [0x27af, 0x27af], /* NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW) */
- [0x27b0, 0x27b0], /* CURLY LOOP */
- [0x27b1, 0x27b1], /* NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW) */
- [0x27b2, 0x27b2], /* CIRCLED HEAVY WHITE RIGHTWARDS ARROW (CIRCLED HEAVY WHITE RIGHT ARROW) */
- [0x27b3, 0x27b3], /* WHITE-FEATHERED RIGHTWARDS ARROW (WHITE-FEATHERED RIGHT ARROW) */
- [0x27b4, 0x27b4], /* BLACK-FEATHERED SOUTH EAST ARROW (BLACK-FEATHERED LOWER RIGHT ARROW) */
- [0x27b5, 0x27b5], /* BLACK-FEATHERED RIGHTWARDS ARROW (BLACK-FEATHERED RIGHT ARROW) */
- [0x27b6, 0x27b6], /* BLACK-FEATHERED NORTH EAST ARROW (BLACK-FEATHERED UPPER RIGHT ARROW) */
- [0x27b7, 0x27b7], /* HEAVY BLACK-FEATHERED SOUTH EAST ARROW (HEAVY BLACK-FEATHERED LOWER RIGHT ARROW) */
- [0x27b8, 0x27b8], /* HEAVY BLACK-FEATHERED RIGHTWARDS ARROW (HEAVY BLACK-FEATHERED RIGHT ARROW) */
- [0x27b9, 0x27b9], /* HEAVY BLACK-FEATHERED NORTH EAST ARROW (HEAVY BLACK-FEATHERED UPPER RIGHT ARROW) */
- [0x27ba, 0x27ba], /* TEARDROP-BARBED RIGHTWARDS ARROW (TEARDROP-BARBED RIGHT ARROW) */
- [0x27bb, 0x27bb], /* HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW (HEAVY TEARDROP-SHANKED RIGHT ARROW) */
- [0x27bc, 0x27bc], /* WEDGE-TAILED RIGHTWARDS ARROW (WEDGE-TAILED RIGHT ARROW) */
- [0x27bd, 0x27bd], /* HEAVY WEDGE-TAILED RIGHTWARDS ARROW (HEAVY WEDGE-TAILED RIGHT ARROW) */
- [0x27be, 0x27be], /* OPEN-OUTLINED RIGHTWARDS ARROW (OPEN-OUTLINED RIGHT ARROW) */
- [0x27bf, 0x27bf], /* DOUBLE CURLY LOOP */
- [0x27c0, 0x27c0], /* THREE DIMENSIONAL ANGLE */
- [0x27c1, 0x27c1], /* WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE */
- [0x27c2, 0x27c2], /* PERPENDICULAR */
- [0x27c3, 0x27c3], /* OPEN SUBSET */
- [0x27c4, 0x27c4], /* OPEN SUPERSET */
- [0x27c5, 0x27c5], /* LEFT S-SHAPED BAG DELIMITER */
- [0x27c6, 0x27c6], /* RIGHT S-SHAPED BAG DELIMITER */
- [0x27c7, 0x27c7], /* OR WITH DOT INSIDE */
- [0x27c8, 0x27c8], /* REVERSE SOLIDUS PRECEDING SUBSET */
- [0x27c9, 0x27c9], /* SUPERSET PRECEDING SOLIDUS */
- [0x27ca, 0x27ca], /* VERTICAL BAR WITH HORIZONTAL STROKE */
- [0x27cb, 0x27cb], /* MATHEMATICAL RISING DIAGONAL */
- [0x27cc, 0x27cc], /* LONG DIVISION */
- [0x27cd, 0x27cd], /* MATHEMATICAL FALLING DIAGONAL */
- [0x27ce, 0x27ce], /* SQUARED LOGICAL AND */
- [0x27cf, 0x27cf], /* SQUARED LOGICAL OR */
- [0x27d0, 0x27d0], /* WHITE DIAMOND WITH CENTRED DOT */
- [0x27d1, 0x27d1], /* AND WITH DOT */
- [0x27d2, 0x27d2], /* ELEMENT OF OPENING UPWARDS */
- [0x27d3, 0x27d3], /* LOWER RIGHT CORNER WITH DOT */
- [0x27d4, 0x27d4], /* UPPER LEFT CORNER WITH DOT */
- [0x27d5, 0x27d5], /* LEFT OUTER JOIN */
- [0x27d6, 0x27d6], /* RIGHT OUTER JOIN */
- [0x27d7, 0x27d7], /* FULL OUTER JOIN */
- [0x27d8, 0x27d8], /* LARGE UP TACK */
- [0x27d9, 0x27d9], /* LARGE DOWN TACK */
- [0x27da, 0x27da], /* LEFT AND RIGHT DOUBLE TURNSTILE */
- [0x27db, 0x27db], /* LEFT AND RIGHT TACK */
- [0x27dc, 0x27dc], /* LEFT MULTIMAP */
- [0x27dd, 0x27dd], /* LONG RIGHT TACK */
- [0x27de, 0x27de], /* LONG LEFT TACK */
- [0x27df, 0x27df], /* UP TACK WITH CIRCLE ABOVE */
- [0x27e0, 0x27e0], /* LOZENGE DIVIDED BY HORIZONTAL RULE */
- [0x27e1, 0x27e1], /* WHITE CONCAVE-SIDED DIAMOND */
- [0x27e2, 0x27e2], /* WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK */
- [0x27e3, 0x27e3], /* WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK */
- [0x27e4, 0x27e4], /* WHITE SQUARE WITH LEFTWARDS TICK */
- [0x27e5, 0x27e5], /* WHITE SQUARE WITH RIGHTWARDS TICK */
- [0x27e6, 0x27e6], /* MATHEMATICAL LEFT WHITE SQUARE BRACKET */
- [0x27e7, 0x27e7], /* MATHEMATICAL RIGHT WHITE SQUARE BRACKET */
- [0x27e8, 0x27e8], /* MATHEMATICAL LEFT ANGLE BRACKET */
- [0x27e9, 0x27e9], /* MATHEMATICAL RIGHT ANGLE BRACKET */
- [0x27ea, 0x27ea], /* MATHEMATICAL LEFT DOUBLE ANGLE BRACKET */
- [0x27eb, 0x27eb], /* MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET */
- [0x27ec, 0x27ec], /* MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET */
- [0x27ed, 0x27ed], /* MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET */
- [0x27ee, 0x27ee], /* MATHEMATICAL LEFT FLATTENED PARENTHESIS */
- [0x27ef, 0x27ef], /* MATHEMATICAL RIGHT FLATTENED PARENTHESIS */
- [0x27f0, 0x27f0], /* UPWARDS QUADRUPLE ARROW */
- [0x27f1, 0x27f1], /* DOWNWARDS QUADRUPLE ARROW */
- [0x27f2, 0x27f2], /* ANTICLOCKWISE GAPPED CIRCLE ARROW */
- [0x27f3, 0x27f3], /* CLOCKWISE GAPPED CIRCLE ARROW */
- [0x27f4, 0x27f4], /* RIGHT ARROW WITH CIRCLED PLUS */
- [0x27f5, 0x27f5], /* LONG LEFTWARDS ARROW */
- [0x27f6, 0x27f6], /* LONG RIGHTWARDS ARROW */
- [0x27f7, 0x27f7], /* LONG LEFT RIGHT ARROW */
- [0x27f8, 0x27f8], /* LONG LEFTWARDS DOUBLE ARROW */
- [0x27f9, 0x27f9], /* LONG RIGHTWARDS DOUBLE ARROW */
- [0x27fa, 0x27fa], /* LONG LEFT RIGHT DOUBLE ARROW */
- [0x27fb, 0x27fb], /* LONG LEFTWARDS ARROW FROM BAR */
- [0x27fc, 0x27fc], /* LONG RIGHTWARDS ARROW FROM BAR */
- [0x27fd, 0x27fd], /* LONG LEFTWARDS DOUBLE ARROW FROM BAR */
- [0x27fe, 0x27fe], /* LONG RIGHTWARDS DOUBLE ARROW FROM BAR */
- [0x27ff, 0x27ff], /* LONG RIGHTWARDS SQUIGGLE ARROW */
- [0x2800, 0x2800], /* BRAILLE PATTERN BLANK */
- [0x2801, 0x2801], /* BRAILLE PATTERN DOTS-1 */
- [0x2802, 0x2802], /* BRAILLE PATTERN DOTS-2 */
- [0x2803, 0x2803], /* BRAILLE PATTERN DOTS-12 */
- [0x2804, 0x2804], /* BRAILLE PATTERN DOTS-3 */
- [0x2805, 0x2805], /* BRAILLE PATTERN DOTS-13 */
- [0x2806, 0x2806], /* BRAILLE PATTERN DOTS-23 */
- [0x2807, 0x2807], /* BRAILLE PATTERN DOTS-123 */
- [0x2808, 0x2808], /* BRAILLE PATTERN DOTS-4 */
- [0x2809, 0x2809], /* BRAILLE PATTERN DOTS-14 */
- [0x280a, 0x280a], /* BRAILLE PATTERN DOTS-24 */
- [0x280b, 0x280b], /* BRAILLE PATTERN DOTS-124 */
- [0x280c, 0x280c], /* BRAILLE PATTERN DOTS-34 */
- [0x280d, 0x280d], /* BRAILLE PATTERN DOTS-134 */
- [0x280e, 0x280e], /* BRAILLE PATTERN DOTS-234 */
- [0x280f, 0x280f], /* BRAILLE PATTERN DOTS-1234 */
- [0x2810, 0x2810], /* BRAILLE PATTERN DOTS-5 */
- [0x2811, 0x2811], /* BRAILLE PATTERN DOTS-15 */
- [0x2812, 0x2812], /* BRAILLE PATTERN DOTS-25 */
- [0x2813, 0x2813], /* BRAILLE PATTERN DOTS-125 */
- [0x2814, 0x2814], /* BRAILLE PATTERN DOTS-35 */
- [0x2815, 0x2815], /* BRAILLE PATTERN DOTS-135 */
- [0x2816, 0x2816], /* BRAILLE PATTERN DOTS-235 */
- [0x2817, 0x2817], /* BRAILLE PATTERN DOTS-1235 */
- [0x2818, 0x2818], /* BRAILLE PATTERN DOTS-45 */
- [0x2819, 0x2819], /* BRAILLE PATTERN DOTS-145 */
- [0x281a, 0x281a], /* BRAILLE PATTERN DOTS-245 */
- [0x281b, 0x281b], /* BRAILLE PATTERN DOTS-1245 */
- [0x281c, 0x281c], /* BRAILLE PATTERN DOTS-345 */
- [0x281d, 0x281d], /* BRAILLE PATTERN DOTS-1345 */
- [0x281e, 0x281e], /* BRAILLE PATTERN DOTS-2345 */
- [0x281f, 0x281f], /* BRAILLE PATTERN DOTS-12345 */
- [0x2820, 0x2820], /* BRAILLE PATTERN DOTS-6 */
- [0x2821, 0x2821], /* BRAILLE PATTERN DOTS-16 */
- [0x2822, 0x2822], /* BRAILLE PATTERN DOTS-26 */
- [0x2823, 0x2823], /* BRAILLE PATTERN DOTS-126 */
- [0x2824, 0x2824], /* BRAILLE PATTERN DOTS-36 */
- [0x2825, 0x2825], /* BRAILLE PATTERN DOTS-136 */
- [0x2826, 0x2826], /* BRAILLE PATTERN DOTS-236 */
- [0x2827, 0x2827], /* BRAILLE PATTERN DOTS-1236 */
- [0x2828, 0x2828], /* BRAILLE PATTERN DOTS-46 */
- [0x2829, 0x2829], /* BRAILLE PATTERN DOTS-146 */
- [0x282a, 0x282a], /* BRAILLE PATTERN DOTS-246 */
- [0x282b, 0x282b], /* BRAILLE PATTERN DOTS-1246 */
- [0x282c, 0x282c], /* BRAILLE PATTERN DOTS-346 */
- [0x282d, 0x282d], /* BRAILLE PATTERN DOTS-1346 */
- [0x282e, 0x282e], /* BRAILLE PATTERN DOTS-2346 */
- [0x282f, 0x282f], /* BRAILLE PATTERN DOTS-12346 */
- [0x2830, 0x2830], /* BRAILLE PATTERN DOTS-56 */
- [0x2831, 0x2831], /* BRAILLE PATTERN DOTS-156 */
- [0x2832, 0x2832], /* BRAILLE PATTERN DOTS-256 */
- [0x2833, 0x2833], /* BRAILLE PATTERN DOTS-1256 */
- [0x2834, 0x2834], /* BRAILLE PATTERN DOTS-356 */
- [0x2835, 0x2835], /* BRAILLE PATTERN DOTS-1356 */
- [0x2836, 0x2836], /* BRAILLE PATTERN DOTS-2356 */
- [0x2837, 0x2837], /* BRAILLE PATTERN DOTS-12356 */
- [0x2838, 0x2838], /* BRAILLE PATTERN DOTS-456 */
- [0x2839, 0x2839], /* BRAILLE PATTERN DOTS-1456 */
- [0x283a, 0x283a], /* BRAILLE PATTERN DOTS-2456 */
- [0x283b, 0x283b], /* BRAILLE PATTERN DOTS-12456 */
- [0x283c, 0x283c], /* BRAILLE PATTERN DOTS-3456 */
- [0x283d, 0x283d], /* BRAILLE PATTERN DOTS-13456 */
- [0x283e, 0x283e], /* BRAILLE PATTERN DOTS-23456 */
- [0x283f, 0x283f], /* BRAILLE PATTERN DOTS-123456 */
- [0x2840, 0x2840], /* BRAILLE PATTERN DOTS-7 */
- [0x2841, 0x2841], /* BRAILLE PATTERN DOTS-17 */
- [0x2842, 0x2842], /* BRAILLE PATTERN DOTS-27 */
- [0x2843, 0x2843], /* BRAILLE PATTERN DOTS-127 */
- [0x2844, 0x2844], /* BRAILLE PATTERN DOTS-37 */
- [0x2845, 0x2845], /* BRAILLE PATTERN DOTS-137 */
- [0x2846, 0x2846], /* BRAILLE PATTERN DOTS-237 */
- [0x2847, 0x2847], /* BRAILLE PATTERN DOTS-1237 */
- [0x2848, 0x2848], /* BRAILLE PATTERN DOTS-47 */
- [0x2849, 0x2849], /* BRAILLE PATTERN DOTS-147 */
- [0x284a, 0x284a], /* BRAILLE PATTERN DOTS-247 */
- [0x284b, 0x284b], /* BRAILLE PATTERN DOTS-1247 */
- [0x284c, 0x284c], /* BRAILLE PATTERN DOTS-347 */
- [0x284d, 0x284d], /* BRAILLE PATTERN DOTS-1347 */
- [0x284e, 0x284e], /* BRAILLE PATTERN DOTS-2347 */
- [0x284f, 0x284f], /* BRAILLE PATTERN DOTS-12347 */
- [0x2850, 0x2850], /* BRAILLE PATTERN DOTS-57 */
- [0x2851, 0x2851], /* BRAILLE PATTERN DOTS-157 */
- [0x2852, 0x2852], /* BRAILLE PATTERN DOTS-257 */
- [0x2853, 0x2853], /* BRAILLE PATTERN DOTS-1257 */
- [0x2854, 0x2854], /* BRAILLE PATTERN DOTS-357 */
- [0x2855, 0x2855], /* BRAILLE PATTERN DOTS-1357 */
- [0x2856, 0x2856], /* BRAILLE PATTERN DOTS-2357 */
- [0x2857, 0x2857], /* BRAILLE PATTERN DOTS-12357 */
- [0x2858, 0x2858], /* BRAILLE PATTERN DOTS-457 */
- [0x2859, 0x2859], /* BRAILLE PATTERN DOTS-1457 */
- [0x285a, 0x285a], /* BRAILLE PATTERN DOTS-2457 */
- [0x285b, 0x285b], /* BRAILLE PATTERN DOTS-12457 */
- [0x285c, 0x285c], /* BRAILLE PATTERN DOTS-3457 */
- [0x285d, 0x285d], /* BRAILLE PATTERN DOTS-13457 */
- [0x285e, 0x285e], /* BRAILLE PATTERN DOTS-23457 */
- [0x285f, 0x285f], /* BRAILLE PATTERN DOTS-123457 */
- [0x2860, 0x2860], /* BRAILLE PATTERN DOTS-67 */
- [0x2861, 0x2861], /* BRAILLE PATTERN DOTS-167 */
- [0x2862, 0x2862], /* BRAILLE PATTERN DOTS-267 */
- [0x2863, 0x2863], /* BRAILLE PATTERN DOTS-1267 */
- [0x2864, 0x2864], /* BRAILLE PATTERN DOTS-367 */
- [0x2865, 0x2865], /* BRAILLE PATTERN DOTS-1367 */
- [0x2866, 0x2866], /* BRAILLE PATTERN DOTS-2367 */
- [0x2867, 0x2867], /* BRAILLE PATTERN DOTS-12367 */
- [0x2868, 0x2868], /* BRAILLE PATTERN DOTS-467 */
- [0x2869, 0x2869], /* BRAILLE PATTERN DOTS-1467 */
- [0x286a, 0x286a], /* BRAILLE PATTERN DOTS-2467 */
- [0x286b, 0x286b], /* BRAILLE PATTERN DOTS-12467 */
- [0x286c, 0x286c], /* BRAILLE PATTERN DOTS-3467 */
- [0x286d, 0x286d], /* BRAILLE PATTERN DOTS-13467 */
- [0x286e, 0x286e], /* BRAILLE PATTERN DOTS-23467 */
- [0x286f, 0x286f], /* BRAILLE PATTERN DOTS-123467 */
- [0x2870, 0x2870], /* BRAILLE PATTERN DOTS-567 */
- [0x2871, 0x2871], /* BRAILLE PATTERN DOTS-1567 */
- [0x2872, 0x2872], /* BRAILLE PATTERN DOTS-2567 */
- [0x2873, 0x2873], /* BRAILLE PATTERN DOTS-12567 */
- [0x2874, 0x2874], /* BRAILLE PATTERN DOTS-3567 */
- [0x2875, 0x2875], /* BRAILLE PATTERN DOTS-13567 */
- [0x2876, 0x2876], /* BRAILLE PATTERN DOTS-23567 */
- [0x2877, 0x2877], /* BRAILLE PATTERN DOTS-123567 */
- [0x2878, 0x2878], /* BRAILLE PATTERN DOTS-4567 */
- [0x2879, 0x2879], /* BRAILLE PATTERN DOTS-14567 */
- [0x287a, 0x287a], /* BRAILLE PATTERN DOTS-24567 */
- [0x287b, 0x287b], /* BRAILLE PATTERN DOTS-124567 */
- [0x287c, 0x287c], /* BRAILLE PATTERN DOTS-34567 */
- [0x287d, 0x287d], /* BRAILLE PATTERN DOTS-134567 */
- [0x287e, 0x287e], /* BRAILLE PATTERN DOTS-234567 */
- [0x287f, 0x287f], /* BRAILLE PATTERN DOTS-1234567 */
- [0x2880, 0x2880], /* BRAILLE PATTERN DOTS-8 */
- [0x2881, 0x2881], /* BRAILLE PATTERN DOTS-18 */
- [0x2882, 0x2882], /* BRAILLE PATTERN DOTS-28 */
- [0x2883, 0x2883], /* BRAILLE PATTERN DOTS-128 */
- [0x2884, 0x2884], /* BRAILLE PATTERN DOTS-38 */
- [0x2885, 0x2885], /* BRAILLE PATTERN DOTS-138 */
- [0x2886, 0x2886], /* BRAILLE PATTERN DOTS-238 */
- [0x2887, 0x2887], /* BRAILLE PATTERN DOTS-1238 */
- [0x2888, 0x2888], /* BRAILLE PATTERN DOTS-48 */
- [0x2889, 0x2889], /* BRAILLE PATTERN DOTS-148 */
- [0x288a, 0x288a], /* BRAILLE PATTERN DOTS-248 */
- [0x288b, 0x288b], /* BRAILLE PATTERN DOTS-1248 */
- [0x288c, 0x288c], /* BRAILLE PATTERN DOTS-348 */
- [0x288d, 0x288d], /* BRAILLE PATTERN DOTS-1348 */
- [0x288e, 0x288e], /* BRAILLE PATTERN DOTS-2348 */
- [0x288f, 0x288f], /* BRAILLE PATTERN DOTS-12348 */
- [0x2890, 0x2890], /* BRAILLE PATTERN DOTS-58 */
- [0x2891, 0x2891], /* BRAILLE PATTERN DOTS-158 */
- [0x2892, 0x2892], /* BRAILLE PATTERN DOTS-258 */
- [0x2893, 0x2893], /* BRAILLE PATTERN DOTS-1258 */
- [0x2894, 0x2894], /* BRAILLE PATTERN DOTS-358 */
- [0x2895, 0x2895], /* BRAILLE PATTERN DOTS-1358 */
- [0x2896, 0x2896], /* BRAILLE PATTERN DOTS-2358 */
- [0x2897, 0x2897], /* BRAILLE PATTERN DOTS-12358 */
- [0x2898, 0x2898], /* BRAILLE PATTERN DOTS-458 */
- [0x2899, 0x2899], /* BRAILLE PATTERN DOTS-1458 */
- [0x289a, 0x289a], /* BRAILLE PATTERN DOTS-2458 */
- [0x289b, 0x289b], /* BRAILLE PATTERN DOTS-12458 */
- [0x289c, 0x289c], /* BRAILLE PATTERN DOTS-3458 */
- [0x289d, 0x289d], /* BRAILLE PATTERN DOTS-13458 */
- [0x289e, 0x289e], /* BRAILLE PATTERN DOTS-23458 */
- [0x289f, 0x289f], /* BRAILLE PATTERN DOTS-123458 */
- [0x28a0, 0x28a0], /* BRAILLE PATTERN DOTS-68 */
- [0x28a1, 0x28a1], /* BRAILLE PATTERN DOTS-168 */
- [0x28a2, 0x28a2], /* BRAILLE PATTERN DOTS-268 */
- [0x28a3, 0x28a3], /* BRAILLE PATTERN DOTS-1268 */
- [0x28a4, 0x28a4], /* BRAILLE PATTERN DOTS-368 */
- [0x28a5, 0x28a5], /* BRAILLE PATTERN DOTS-1368 */
- [0x28a6, 0x28a6], /* BRAILLE PATTERN DOTS-2368 */
- [0x28a7, 0x28a7], /* BRAILLE PATTERN DOTS-12368 */
- [0x28a8, 0x28a8], /* BRAILLE PATTERN DOTS-468 */
- [0x28a9, 0x28a9], /* BRAILLE PATTERN DOTS-1468 */
- [0x28aa, 0x28aa], /* BRAILLE PATTERN DOTS-2468 */
- [0x28ab, 0x28ab], /* BRAILLE PATTERN DOTS-12468 */
- [0x28ac, 0x28ac], /* BRAILLE PATTERN DOTS-3468 */
- [0x28ad, 0x28ad], /* BRAILLE PATTERN DOTS-13468 */
- [0x28ae, 0x28ae], /* BRAILLE PATTERN DOTS-23468 */
- [0x28af, 0x28af], /* BRAILLE PATTERN DOTS-123468 */
- [0x28b0, 0x28b0], /* BRAILLE PATTERN DOTS-568 */
- [0x28b1, 0x28b1], /* BRAILLE PATTERN DOTS-1568 */
- [0x28b2, 0x28b2], /* BRAILLE PATTERN DOTS-2568 */
- [0x28b3, 0x28b3], /* BRAILLE PATTERN DOTS-12568 */
- [0x28b4, 0x28b4], /* BRAILLE PATTERN DOTS-3568 */
- [0x28b5, 0x28b5], /* BRAILLE PATTERN DOTS-13568 */
- [0x28b6, 0x28b6], /* BRAILLE PATTERN DOTS-23568 */
- [0x28b7, 0x28b7], /* BRAILLE PATTERN DOTS-123568 */
- [0x28b8, 0x28b8], /* BRAILLE PATTERN DOTS-4568 */
- [0x28b9, 0x28b9], /* BRAILLE PATTERN DOTS-14568 */
- [0x28ba, 0x28ba], /* BRAILLE PATTERN DOTS-24568 */
- [0x28bb, 0x28bb], /* BRAILLE PATTERN DOTS-124568 */
- [0x28bc, 0x28bc], /* BRAILLE PATTERN DOTS-34568 */
- [0x28bd, 0x28bd], /* BRAILLE PATTERN DOTS-134568 */
- [0x28be, 0x28be], /* BRAILLE PATTERN DOTS-234568 */
- [0x28bf, 0x28bf], /* BRAILLE PATTERN DOTS-1234568 */
- [0x28c0, 0x28c0], /* BRAILLE PATTERN DOTS-78 */
- [0x28c1, 0x28c1], /* BRAILLE PATTERN DOTS-178 */
- [0x28c2, 0x28c2], /* BRAILLE PATTERN DOTS-278 */
- [0x28c3, 0x28c3], /* BRAILLE PATTERN DOTS-1278 */
- [0x28c4, 0x28c4], /* BRAILLE PATTERN DOTS-378 */
- [0x28c5, 0x28c5], /* BRAILLE PATTERN DOTS-1378 */
- [0x28c6, 0x28c6], /* BRAILLE PATTERN DOTS-2378 */
- [0x28c7, 0x28c7], /* BRAILLE PATTERN DOTS-12378 */
- [0x28c8, 0x28c8], /* BRAILLE PATTERN DOTS-478 */
- [0x28c9, 0x28c9], /* BRAILLE PATTERN DOTS-1478 */
- [0x28ca, 0x28ca], /* BRAILLE PATTERN DOTS-2478 */
- [0x28cb, 0x28cb], /* BRAILLE PATTERN DOTS-12478 */
- [0x28cc, 0x28cc], /* BRAILLE PATTERN DOTS-3478 */
- [0x28cd, 0x28cd], /* BRAILLE PATTERN DOTS-13478 */
- [0x28ce, 0x28ce], /* BRAILLE PATTERN DOTS-23478 */
- [0x28cf, 0x28cf], /* BRAILLE PATTERN DOTS-123478 */
- [0x28d0, 0x28d0], /* BRAILLE PATTERN DOTS-578 */
- [0x28d1, 0x28d1], /* BRAILLE PATTERN DOTS-1578 */
- [0x28d2, 0x28d2], /* BRAILLE PATTERN DOTS-2578 */
- [0x28d3, 0x28d3], /* BRAILLE PATTERN DOTS-12578 */
- [0x28d4, 0x28d4], /* BRAILLE PATTERN DOTS-3578 */
- [0x28d5, 0x28d5], /* BRAILLE PATTERN DOTS-13578 */
- [0x28d6, 0x28d6], /* BRAILLE PATTERN DOTS-23578 */
- [0x28d7, 0x28d7], /* BRAILLE PATTERN DOTS-123578 */
- [0x28d8, 0x28d8], /* BRAILLE PATTERN DOTS-4578 */
- [0x28d9, 0x28d9], /* BRAILLE PATTERN DOTS-14578 */
- [0x28da, 0x28da], /* BRAILLE PATTERN DOTS-24578 */
- [0x28db, 0x28db], /* BRAILLE PATTERN DOTS-124578 */
- [0x28dc, 0x28dc], /* BRAILLE PATTERN DOTS-34578 */
- [0x28dd, 0x28dd], /* BRAILLE PATTERN DOTS-134578 */
- [0x28de, 0x28de], /* BRAILLE PATTERN DOTS-234578 */
- [0x28df, 0x28df], /* BRAILLE PATTERN DOTS-1234578 */
- [0x28e0, 0x28e0], /* BRAILLE PATTERN DOTS-678 */
- [0x28e1, 0x28e1], /* BRAILLE PATTERN DOTS-1678 */
- [0x28e2, 0x28e2], /* BRAILLE PATTERN DOTS-2678 */
- [0x28e3, 0x28e3], /* BRAILLE PATTERN DOTS-12678 */
- [0x28e4, 0x28e4], /* BRAILLE PATTERN DOTS-3678 */
- [0x28e5, 0x28e5], /* BRAILLE PATTERN DOTS-13678 */
- [0x28e6, 0x28e6], /* BRAILLE PATTERN DOTS-23678 */
- [0x28e7, 0x28e7], /* BRAILLE PATTERN DOTS-123678 */
- [0x28e8, 0x28e8], /* BRAILLE PATTERN DOTS-4678 */
- [0x28e9, 0x28e9], /* BRAILLE PATTERN DOTS-14678 */
- [0x28ea, 0x28ea], /* BRAILLE PATTERN DOTS-24678 */
- [0x28eb, 0x28eb], /* BRAILLE PATTERN DOTS-124678 */
- [0x28ec, 0x28ec], /* BRAILLE PATTERN DOTS-34678 */
- [0x28ed, 0x28ed], /* BRAILLE PATTERN DOTS-134678 */
- [0x28ee, 0x28ee], /* BRAILLE PATTERN DOTS-234678 */
- [0x28ef, 0x28ef], /* BRAILLE PATTERN DOTS-1234678 */
- [0x28f0, 0x28f0], /* BRAILLE PATTERN DOTS-5678 */
- [0x28f1, 0x28f1], /* BRAILLE PATTERN DOTS-15678 */
- [0x28f2, 0x28f2], /* BRAILLE PATTERN DOTS-25678 */
- [0x28f3, 0x28f3], /* BRAILLE PATTERN DOTS-125678 */
- [0x28f4, 0x28f4], /* BRAILLE PATTERN DOTS-35678 */
- [0x28f5, 0x28f5], /* BRAILLE PATTERN DOTS-135678 */
- [0x28f6, 0x28f6], /* BRAILLE PATTERN DOTS-235678 */
- [0x28f7, 0x28f7], /* BRAILLE PATTERN DOTS-1235678 */
- [0x28f8, 0x28f8], /* BRAILLE PATTERN DOTS-45678 */
- [0x28f9, 0x28f9], /* BRAILLE PATTERN DOTS-145678 */
- [0x28fa, 0x28fa], /* BRAILLE PATTERN DOTS-245678 */
- [0x28fb, 0x28fb], /* BRAILLE PATTERN DOTS-1245678 */
- [0x28fc, 0x28fc], /* BRAILLE PATTERN DOTS-345678 */
- [0x28fd, 0x28fd], /* BRAILLE PATTERN DOTS-1345678 */
- [0x28fe, 0x28fe], /* BRAILLE PATTERN DOTS-2345678 */
- [0x28ff, 0x28ff], /* BRAILLE PATTERN DOTS-12345678 */
- [0x2900, 0x2900], /* RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE */
- [0x2901, 0x2901], /* RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE */
- [0x2902, 0x2902], /* LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE */
- [0x2903, 0x2903], /* RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE */
- [0x2904, 0x2904], /* LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE */
- [0x2905, 0x2905], /* RIGHTWARDS TWO-HEADED ARROW FROM BAR */
- [0x2906, 0x2906], /* LEFTWARDS DOUBLE ARROW FROM BAR */
- [0x2907, 0x2907], /* RIGHTWARDS DOUBLE ARROW FROM BAR */
- [0x2908, 0x2908], /* DOWNWARDS ARROW WITH HORIZONTAL STROKE */
- [0x2909, 0x2909], /* UPWARDS ARROW WITH HORIZONTAL STROKE */
- [0x290a, 0x290a], /* UPWARDS TRIPLE ARROW */
- [0x290b, 0x290b], /* DOWNWARDS TRIPLE ARROW */
- [0x290c, 0x290c], /* LEFTWARDS DOUBLE DASH ARROW */
- [0x290d, 0x290d], /* RIGHTWARDS DOUBLE DASH ARROW */
- [0x290e, 0x290e], /* LEFTWARDS TRIPLE DASH ARROW */
- [0x290f, 0x290f], /* RIGHTWARDS TRIPLE DASH ARROW */
- [0x2910, 0x2910], /* RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW */
- [0x2911, 0x2911], /* RIGHTWARDS ARROW WITH DOTTED STEM */
- [0x2912, 0x2912], /* UPWARDS ARROW TO BAR */
- [0x2913, 0x2913], /* DOWNWARDS ARROW TO BAR */
- [0x2914, 0x2914], /* RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE */
- [0x2915, 0x2915], /* RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
- [0x2916, 0x2916], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL */
- [0x2917, 0x2917], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE */
- [0x2918, 0x2918], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
- [0x2919, 0x2919], /* LEFTWARDS ARROW-TAIL */
- [0x291a, 0x291a], /* RIGHTWARDS ARROW-TAIL */
- [0x291b, 0x291b], /* LEFTWARDS DOUBLE ARROW-TAIL */
- [0x291c, 0x291c], /* RIGHTWARDS DOUBLE ARROW-TAIL */
- [0x291d, 0x291d], /* LEFTWARDS ARROW TO BLACK DIAMOND */
- [0x291e, 0x291e], /* RIGHTWARDS ARROW TO BLACK DIAMOND */
- [0x291f, 0x291f], /* LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND */
- [0x2920, 0x2920], /* RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND */
- [0x2921, 0x2921], /* NORTH WEST AND SOUTH EAST ARROW */
- [0x2922, 0x2922], /* NORTH EAST AND SOUTH WEST ARROW */
- [0x2923, 0x2923], /* NORTH WEST ARROW WITH HOOK */
- [0x2924, 0x2924], /* NORTH EAST ARROW WITH HOOK */
- [0x2925, 0x2925], /* SOUTH EAST ARROW WITH HOOK */
- [0x2926, 0x2926], /* SOUTH WEST ARROW WITH HOOK */
- [0x2927, 0x2927], /* NORTH WEST ARROW AND NORTH EAST ARROW */
- [0x2928, 0x2928], /* NORTH EAST ARROW AND SOUTH EAST ARROW */
- [0x2929, 0x2929], /* SOUTH EAST ARROW AND SOUTH WEST ARROW */
- [0x292a, 0x292a], /* SOUTH WEST ARROW AND NORTH WEST ARROW */
- [0x292b, 0x292b], /* RISING DIAGONAL CROSSING FALLING DIAGONAL */
- [0x292c, 0x292c], /* FALLING DIAGONAL CROSSING RISING DIAGONAL */
- [0x292d, 0x292d], /* SOUTH EAST ARROW CROSSING NORTH EAST ARROW */
- [0x292e, 0x292e], /* NORTH EAST ARROW CROSSING SOUTH EAST ARROW */
- [0x292f, 0x292f], /* FALLING DIAGONAL CROSSING NORTH EAST ARROW */
- [0x2930, 0x2930], /* RISING DIAGONAL CROSSING SOUTH EAST ARROW */
- [0x2931, 0x2931], /* NORTH EAST ARROW CROSSING NORTH WEST ARROW */
- [0x2932, 0x2932], /* NORTH WEST ARROW CROSSING NORTH EAST ARROW */
- [0x2933, 0x2933], /* WAVE ARROW POINTING DIRECTLY RIGHT */
- [0x2934, 0x2934], /* ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS */
- [0x2935, 0x2935], /* ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS */
- [0x2936, 0x2936], /* ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS */
- [0x2937, 0x2937], /* ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS */
- [0x2938, 0x2938], /* RIGHT-SIDE ARC CLOCKWISE ARROW */
- [0x2939, 0x2939], /* LEFT-SIDE ARC ANTICLOCKWISE ARROW */
- [0x293a, 0x293a], /* TOP ARC ANTICLOCKWISE ARROW */
- [0x293b, 0x293b], /* BOTTOM ARC ANTICLOCKWISE ARROW */
- [0x293c, 0x293c], /* TOP ARC CLOCKWISE ARROW WITH MINUS */
- [0x293d, 0x293d], /* TOP ARC ANTICLOCKWISE ARROW WITH PLUS */
- [0x293e, 0x293e], /* LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW */
- [0x293f, 0x293f], /* LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW */
- [0x2940, 0x2940], /* ANTICLOCKWISE CLOSED CIRCLE ARROW */
- [0x2941, 0x2941], /* CLOCKWISE CLOSED CIRCLE ARROW */
- [0x2942, 0x2942], /* RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW */
- [0x2943, 0x2943], /* LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW */
- [0x2944, 0x2944], /* SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW */
- [0x2945, 0x2945], /* RIGHTWARDS ARROW WITH PLUS BELOW */
- [0x2946, 0x2946], /* LEFTWARDS ARROW WITH PLUS BELOW */
- [0x2947, 0x2947], /* RIGHTWARDS ARROW THROUGH X */
- [0x2948, 0x2948], /* LEFT RIGHT ARROW THROUGH SMALL CIRCLE */
- [0x2949, 0x2949], /* UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE */
- [0x294a, 0x294a], /* LEFT BARB UP RIGHT BARB DOWN HARPOON */
- [0x294b, 0x294b], /* LEFT BARB DOWN RIGHT BARB UP HARPOON */
- [0x294c, 0x294c], /* UP BARB RIGHT DOWN BARB LEFT HARPOON */
- [0x294d, 0x294d], /* UP BARB LEFT DOWN BARB RIGHT HARPOON */
- [0x294e, 0x294e], /* LEFT BARB UP RIGHT BARB UP HARPOON */
- [0x294f, 0x294f], /* UP BARB RIGHT DOWN BARB RIGHT HARPOON */
- [0x2950, 0x2950], /* LEFT BARB DOWN RIGHT BARB DOWN HARPOON */
- [0x2951, 0x2951], /* UP BARB LEFT DOWN BARB LEFT HARPOON */
- [0x2952, 0x2952], /* LEFTWARDS HARPOON WITH BARB UP TO BAR */
- [0x2953, 0x2953], /* RIGHTWARDS HARPOON WITH BARB UP TO BAR */
- [0x2954, 0x2954], /* UPWARDS HARPOON WITH BARB RIGHT TO BAR */
- [0x2955, 0x2955], /* DOWNWARDS HARPOON WITH BARB RIGHT TO BAR */
- [0x2956, 0x2956], /* LEFTWARDS HARPOON WITH BARB DOWN TO BAR */
- [0x2957, 0x2957], /* RIGHTWARDS HARPOON WITH BARB DOWN TO BAR */
- [0x2958, 0x2958], /* UPWARDS HARPOON WITH BARB LEFT TO BAR */
- [0x2959, 0x2959], /* DOWNWARDS HARPOON WITH BARB LEFT TO BAR */
- [0x295a, 0x295a], /* LEFTWARDS HARPOON WITH BARB UP FROM BAR */
- [0x295b, 0x295b], /* RIGHTWARDS HARPOON WITH BARB UP FROM BAR */
- [0x295c, 0x295c], /* UPWARDS HARPOON WITH BARB RIGHT FROM BAR */
- [0x295d, 0x295d], /* DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR */
- [0x295e, 0x295e], /* LEFTWARDS HARPOON WITH BARB DOWN FROM BAR */
- [0x295f, 0x295f], /* RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR */
- [0x2960, 0x2960], /* UPWARDS HARPOON WITH BARB LEFT FROM BAR */
- [0x2961, 0x2961], /* DOWNWARDS HARPOON WITH BARB LEFT FROM BAR */
- [0x2962, 0x2962], /* LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN */
- [0x2963, 0x2963], /* UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT */
- [0x2964, 0x2964], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN */
- [0x2965, 0x2965], /* DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT */
- [0x2966, 0x2966], /* LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP */
- [0x2967, 0x2967], /* LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN */
- [0x2968, 0x2968], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP */
- [0x2969, 0x2969], /* RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN */
- [0x296a, 0x296a], /* LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH */
- [0x296b, 0x296b], /* LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH */
- [0x296c, 0x296c], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH */
- [0x296d, 0x296d], /* RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH */
- [0x296e, 0x296e], /* UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT */
- [0x296f, 0x296f], /* DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT */
- [0x2970, 0x2970], /* RIGHT DOUBLE ARROW WITH ROUNDED HEAD */
- [0x2971, 0x2971], /* EQUALS SIGN ABOVE RIGHTWARDS ARROW */
- [0x2972, 0x2972], /* TILDE OPERATOR ABOVE RIGHTWARDS ARROW */
- [0x2973, 0x2973], /* LEFTWARDS ARROW ABOVE TILDE OPERATOR */
- [0x2974, 0x2974], /* RIGHTWARDS ARROW ABOVE TILDE OPERATOR */
- [0x2975, 0x2975], /* RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO */
- [0x2976, 0x2976], /* LESS-THAN ABOVE LEFTWARDS ARROW */
- [0x2977, 0x2977], /* LEFTWARDS ARROW THROUGH LESS-THAN */
- [0x2978, 0x2978], /* GREATER-THAN ABOVE RIGHTWARDS ARROW */
- [0x2979, 0x2979], /* SUBSET ABOVE RIGHTWARDS ARROW */
- [0x297a, 0x297a], /* LEFTWARDS ARROW THROUGH SUBSET */
- [0x297b, 0x297b], /* SUPERSET ABOVE LEFTWARDS ARROW */
- [0x297c, 0x297c], /* LEFT FISH TAIL */
- [0x297d, 0x297d], /* RIGHT FISH TAIL */
- [0x297e, 0x297e], /* UP FISH TAIL */
- [0x297f, 0x297f], /* DOWN FISH TAIL */
- [0x2980, 0x2980], /* TRIPLE VERTICAL BAR DELIMITER */
- [0x2981, 0x2981], /* Z NOTATION SPOT */
- [0x2982, 0x2982], /* Z NOTATION TYPE COLON */
- [0x2983, 0x2983], /* LEFT WHITE CURLY BRACKET */
- [0x2984, 0x2984], /* RIGHT WHITE CURLY BRACKET */
- [0x2985, 0x2985], /* LEFT WHITE PARENTHESIS */
- [0x2986, 0x2986], /* RIGHT WHITE PARENTHESIS */
- [0x2987, 0x2987], /* Z NOTATION LEFT IMAGE BRACKET */
- [0x2988, 0x2988], /* Z NOTATION RIGHT IMAGE BRACKET */
- [0x2989, 0x2989], /* Z NOTATION LEFT BINDING BRACKET */
- [0x298a, 0x298a], /* Z NOTATION RIGHT BINDING BRACKET */
- [0x298b, 0x298b], /* LEFT SQUARE BRACKET WITH UNDERBAR */
- [0x298c, 0x298c], /* RIGHT SQUARE BRACKET WITH UNDERBAR */
- [0x298d, 0x298d], /* LEFT SQUARE BRACKET WITH TICK IN TOP CORNER */
- [0x298e, 0x298e], /* RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */
- [0x298f, 0x298f], /* LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */
- [0x2990, 0x2990], /* RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER */
- [0x2991, 0x2991], /* LEFT ANGLE BRACKET WITH DOT */
- [0x2992, 0x2992], /* RIGHT ANGLE BRACKET WITH DOT */
- [0x2993, 0x2993], /* LEFT ARC LESS-THAN BRACKET */
- [0x2994, 0x2994], /* RIGHT ARC GREATER-THAN BRACKET */
- [0x2995, 0x2995], /* DOUBLE LEFT ARC GREATER-THAN BRACKET */
- [0x2996, 0x2996], /* DOUBLE RIGHT ARC LESS-THAN BRACKET */
- [0x2997, 0x2997], /* LEFT BLACK TORTOISE SHELL BRACKET */
- [0x2998, 0x2998], /* RIGHT BLACK TORTOISE SHELL BRACKET */
- [0x2999, 0x2999], /* DOTTED FENCE */
- [0x299a, 0x299a], /* VERTICAL ZIGZAG LINE */
- [0x299b, 0x299b], /* MEASURED ANGLE OPENING LEFT */
- [0x299c, 0x299c], /* RIGHT ANGLE VARIANT WITH SQUARE */
- [0x299d, 0x299d], /* MEASURED RIGHT ANGLE WITH DOT */
- [0x299e, 0x299e], /* ANGLE WITH S INSIDE */
- [0x299f, 0x299f], /* ACUTE ANGLE */
- [0x29a0, 0x29a0], /* SPHERICAL ANGLE OPENING LEFT */
- [0x29a1, 0x29a1], /* SPHERICAL ANGLE OPENING UP */
- [0x29a2, 0x29a2], /* TURNED ANGLE */
- [0x29a3, 0x29a3], /* REVERSED ANGLE */
- [0x29a4, 0x29a4], /* ANGLE WITH UNDERBAR */
- [0x29a5, 0x29a5], /* REVERSED ANGLE WITH UNDERBAR */
- [0x29a6, 0x29a6], /* OBLIQUE ANGLE OPENING UP */
- [0x29a7, 0x29a7], /* OBLIQUE ANGLE OPENING DOWN */
- [0x29a8, 0x29a8], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT */
- [0x29a9, 0x29a9], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT */
- [0x29aa, 0x29aa], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT */
- [0x29ab, 0x29ab], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT */
- [0x29ac, 0x29ac], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP */
- [0x29ad, 0x29ad], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP */
- [0x29ae, 0x29ae], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN */
- [0x29af, 0x29af], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN */
- [0x29b0, 0x29b0], /* REVERSED EMPTY SET */
- [0x29b1, 0x29b1], /* EMPTY SET WITH OVERBAR */
- [0x29b2, 0x29b2], /* EMPTY SET WITH SMALL CIRCLE ABOVE */
- [0x29b3, 0x29b3], /* EMPTY SET WITH RIGHT ARROW ABOVE */
- [0x29b4, 0x29b4], /* EMPTY SET WITH LEFT ARROW ABOVE */
- [0x29b5, 0x29b5], /* CIRCLE WITH HORIZONTAL BAR */
- [0x29b6, 0x29b6], /* CIRCLED VERTICAL BAR */
- [0x29b7, 0x29b7], /* CIRCLED PARALLEL */
- [0x29b8, 0x29b8], /* CIRCLED REVERSE SOLIDUS */
- [0x29b9, 0x29b9], /* CIRCLED PERPENDICULAR */
- [0x29ba, 0x29ba], /* CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR */
- [0x29bb, 0x29bb], /* CIRCLE WITH SUPERIMPOSED X */
- [0x29bc, 0x29bc], /* CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN */
- [0x29bd, 0x29bd], /* UP ARROW THROUGH CIRCLE */
- [0x29be, 0x29be], /* CIRCLED WHITE BULLET */
- [0x29bf, 0x29bf], /* CIRCLED BULLET */
- [0x29c0, 0x29c0], /* CIRCLED LESS-THAN */
- [0x29c1, 0x29c1], /* CIRCLED GREATER-THAN */
- [0x29c2, 0x29c2], /* CIRCLE WITH SMALL CIRCLE TO THE RIGHT */
- [0x29c3, 0x29c3], /* CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT */
- [0x29c4, 0x29c4], /* SQUARED RISING DIAGONAL SLASH */
- [0x29c5, 0x29c5], /* SQUARED FALLING DIAGONAL SLASH */
- [0x29c6, 0x29c6], /* SQUARED ASTERISK */
- [0x29c7, 0x29c7], /* SQUARED SMALL CIRCLE */
- [0x29c8, 0x29c8], /* SQUARED SQUARE */
- [0x29c9, 0x29c9], /* TWO JOINED SQUARES */
- [0x29ca, 0x29ca], /* TRIANGLE WITH DOT ABOVE */
- [0x29cb, 0x29cb], /* TRIANGLE WITH UNDERBAR */
- [0x29cc, 0x29cc], /* S IN TRIANGLE */
- [0x29cd, 0x29cd], /* TRIANGLE WITH SERIFS AT BOTTOM */
- [0x29ce, 0x29ce], /* RIGHT TRIANGLE ABOVE LEFT TRIANGLE */
- [0x29cf, 0x29cf], /* LEFT TRIANGLE BESIDE VERTICAL BAR */
- [0x29d0, 0x29d0], /* VERTICAL BAR BESIDE RIGHT TRIANGLE */
- [0x29d1, 0x29d1], /* BOWTIE WITH LEFT HALF BLACK */
- [0x29d2, 0x29d2], /* BOWTIE WITH RIGHT HALF BLACK */
- [0x29d3, 0x29d3], /* BLACK BOWTIE */
- [0x29d4, 0x29d4], /* TIMES WITH LEFT HALF BLACK */
- [0x29d5, 0x29d5], /* TIMES WITH RIGHT HALF BLACK */
- [0x29d6, 0x29d6], /* WHITE HOURGLASS */
- [0x29d7, 0x29d7], /* BLACK HOURGLASS */
- [0x29d8, 0x29d8], /* LEFT WIGGLY FENCE */
- [0x29d9, 0x29d9], /* RIGHT WIGGLY FENCE */
- [0x29da, 0x29da], /* LEFT DOUBLE WIGGLY FENCE */
- [0x29db, 0x29db], /* RIGHT DOUBLE WIGGLY FENCE */
- [0x29dc, 0x29dc], /* INCOMPLETE INFINITY */
- [0x29dd, 0x29dd], /* TIE OVER INFINITY */
- [0x29de, 0x29de], /* INFINITY NEGATED WITH VERTICAL BAR */
- [0x29df, 0x29df], /* DOUBLE-ENDED MULTIMAP */
- [0x29e0, 0x29e0], /* SQUARE WITH CONTOURED OUTLINE */
- [0x29e1, 0x29e1], /* INCREASES AS */
- [0x29e2, 0x29e2], /* SHUFFLE PRODUCT */
- [0x29e3, 0x29e3], /* EQUALS SIGN AND SLANTED PARALLEL */
- [0x29e4, 0x29e4], /* EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE */
- [0x29e5, 0x29e5], /* IDENTICAL TO AND SLANTED PARALLEL */
- [0x29e6, 0x29e6], /* GLEICH STARK */
- [0x29e7, 0x29e7], /* THERMODYNAMIC */
- [0x29e8, 0x29e8], /* DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK */
- [0x29e9, 0x29e9], /* DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK */
- [0x29ea, 0x29ea], /* BLACK DIAMOND WITH DOWN ARROW */
- [0x29eb, 0x29eb], /* BLACK LOZENGE */
- [0x29ec, 0x29ec], /* WHITE CIRCLE WITH DOWN ARROW */
- [0x29ed, 0x29ed], /* BLACK CIRCLE WITH DOWN ARROW */
- [0x29ee, 0x29ee], /* ERROR-BARRED WHITE SQUARE */
- [0x29ef, 0x29ef], /* ERROR-BARRED BLACK SQUARE */
- [0x29f0, 0x29f0], /* ERROR-BARRED WHITE DIAMOND */
- [0x29f1, 0x29f1], /* ERROR-BARRED BLACK DIAMOND */
- [0x29f2, 0x29f2], /* ERROR-BARRED WHITE CIRCLE */
- [0x29f3, 0x29f3], /* ERROR-BARRED BLACK CIRCLE */
- [0x29f4, 0x29f4], /* RULE-DELAYED */
- [0x29f5, 0x29f5], /* REVERSE SOLIDUS OPERATOR */
- [0x29f6, 0x29f6], /* SOLIDUS WITH OVERBAR */
- [0x29f7, 0x29f7], /* REVERSE SOLIDUS WITH HORIZONTAL STROKE */
- [0x29f8, 0x29f8], /* BIG SOLIDUS */
- [0x29f9, 0x29f9], /* BIG REVERSE SOLIDUS */
- [0x29fa, 0x29fa], /* DOUBLE PLUS */
- [0x29fb, 0x29fb], /* TRIPLE PLUS */
- [0x29fc, 0x29fc], /* LEFT-POINTING CURVED ANGLE BRACKET */
- [0x29fd, 0x29fd], /* RIGHT-POINTING CURVED ANGLE BRACKET */
- [0x29fe, 0x29fe], /* TINY */
- [0x29ff, 0x29ff], /* MINY */
- [0x2a00, 0x2a00], /* N-ARY CIRCLED DOT OPERATOR */
- [0x2a01, 0x2a01], /* N-ARY CIRCLED PLUS OPERATOR */
- [0x2a02, 0x2a02], /* N-ARY CIRCLED TIMES OPERATOR */
- [0x2a03, 0x2a03], /* N-ARY UNION OPERATOR WITH DOT */
- [0x2a04, 0x2a04], /* N-ARY UNION OPERATOR WITH PLUS */
- [0x2a05, 0x2a05], /* N-ARY SQUARE INTERSECTION OPERATOR */
- [0x2a06, 0x2a06], /* N-ARY SQUARE UNION OPERATOR */
- [0x2a07, 0x2a07], /* TWO LOGICAL AND OPERATOR */
- [0x2a08, 0x2a08], /* TWO LOGICAL OR OPERATOR */
- [0x2a09, 0x2a09], /* N-ARY TIMES OPERATOR */
- [0x2a0a, 0x2a0a], /* MODULO TWO SUM */
- [0x2a0b, 0x2a0b], /* SUMMATION WITH INTEGRAL */
- [0x2a0c, 0x2a0c], /* QUADRUPLE INTEGRAL OPERATOR */
- [0x2a0d, 0x2a0d], /* FINITE PART INTEGRAL */
- [0x2a0e, 0x2a0e], /* INTEGRAL WITH DOUBLE STROKE */
- [0x2a0f, 0x2a0f], /* INTEGRAL AVERAGE WITH SLASH */
- [0x2a10, 0x2a10], /* CIRCULATION FUNCTION */
- [0x2a11, 0x2a11], /* ANTICLOCKWISE INTEGRATION */
- [0x2a12, 0x2a12], /* LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE */
- [0x2a13, 0x2a13], /* LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE */
- [0x2a14, 0x2a14], /* LINE INTEGRATION NOT INCLUDING THE POLE */
- [0x2a15, 0x2a15], /* INTEGRAL AROUND A POINT OPERATOR */
- [0x2a16, 0x2a16], /* QUATERNION INTEGRAL OPERATOR */
- [0x2a17, 0x2a17], /* INTEGRAL WITH LEFTWARDS ARROW WITH HOOK */
- [0x2a18, 0x2a18], /* INTEGRAL WITH TIMES SIGN */
- [0x2a19, 0x2a19], /* INTEGRAL WITH INTERSECTION */
- [0x2a1a, 0x2a1a], /* INTEGRAL WITH UNION */
- [0x2a1b, 0x2a1b], /* INTEGRAL WITH OVERBAR */
- [0x2a1c, 0x2a1c], /* INTEGRAL WITH UNDERBAR */
- [0x2a1d, 0x2a1d], /* JOIN */
- [0x2a1e, 0x2a1e], /* LARGE LEFT TRIANGLE OPERATOR */
- [0x2a1f, 0x2a1f], /* Z NOTATION SCHEMA COMPOSITION */
- [0x2a20, 0x2a20], /* Z NOTATION SCHEMA PIPING */
- [0x2a21, 0x2a21], /* Z NOTATION SCHEMA PROJECTION */
- [0x2a22, 0x2a22], /* PLUS SIGN WITH SMALL CIRCLE ABOVE */
- [0x2a23, 0x2a23], /* PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE */
- [0x2a24, 0x2a24], /* PLUS SIGN WITH TILDE ABOVE */
- [0x2a25, 0x2a25], /* PLUS SIGN WITH DOT BELOW */
- [0x2a26, 0x2a26], /* PLUS SIGN WITH TILDE BELOW */
- [0x2a27, 0x2a27], /* PLUS SIGN WITH SUBSCRIPT TWO */
- [0x2a28, 0x2a28], /* PLUS SIGN WITH BLACK TRIANGLE */
- [0x2a29, 0x2a29], /* MINUS SIGN WITH COMMA ABOVE */
- [0x2a2a, 0x2a2a], /* MINUS SIGN WITH DOT BELOW */
- [0x2a2b, 0x2a2b], /* MINUS SIGN WITH FALLING DOTS */
- [0x2a2c, 0x2a2c], /* MINUS SIGN WITH RISING DOTS */
- [0x2a2d, 0x2a2d], /* PLUS SIGN IN LEFT HALF CIRCLE */
- [0x2a2e, 0x2a2e], /* PLUS SIGN IN RIGHT HALF CIRCLE */
- [0x2a2f, 0x2a2f], /* VECTOR OR CROSS PRODUCT */
- [0x2a30, 0x2a30], /* MULTIPLICATION SIGN WITH DOT ABOVE */
- [0x2a31, 0x2a31], /* MULTIPLICATION SIGN WITH UNDERBAR */
- [0x2a32, 0x2a32], /* SEMIDIRECT PRODUCT WITH BOTTOM CLOSED */
- [0x2a33, 0x2a33], /* SMASH PRODUCT */
- [0x2a34, 0x2a34], /* MULTIPLICATION SIGN IN LEFT HALF CIRCLE */
- [0x2a35, 0x2a35], /* MULTIPLICATION SIGN IN RIGHT HALF CIRCLE */
- [0x2a36, 0x2a36], /* CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT */
- [0x2a37, 0x2a37], /* MULTIPLICATION SIGN IN DOUBLE CIRCLE */
- [0x2a38, 0x2a38], /* CIRCLED DIVISION SIGN */
- [0x2a39, 0x2a39], /* PLUS SIGN IN TRIANGLE */
- [0x2a3a, 0x2a3a], /* MINUS SIGN IN TRIANGLE */
- [0x2a3b, 0x2a3b], /* MULTIPLICATION SIGN IN TRIANGLE */
- [0x2a3c, 0x2a3c], /* INTERIOR PRODUCT */
- [0x2a3d, 0x2a3d], /* RIGHTHAND INTERIOR PRODUCT */
- [0x2a3e, 0x2a3e], /* Z NOTATION RELATIONAL COMPOSITION */
- [0x2a3f, 0x2a3f], /* AMALGAMATION OR COPRODUCT */
- [0x2a40, 0x2a40], /* INTERSECTION WITH DOT */
- [0x2a41, 0x2a41], /* UNION WITH MINUS SIGN */
- [0x2a42, 0x2a42], /* UNION WITH OVERBAR */
- [0x2a43, 0x2a43], /* INTERSECTION WITH OVERBAR */
- [0x2a44, 0x2a44], /* INTERSECTION WITH LOGICAL AND */
- [0x2a45, 0x2a45], /* UNION WITH LOGICAL OR */
- [0x2a46, 0x2a46], /* UNION ABOVE INTERSECTION */
- [0x2a47, 0x2a47], /* INTERSECTION ABOVE UNION */
- [0x2a48, 0x2a48], /* UNION ABOVE BAR ABOVE INTERSECTION */
- [0x2a49, 0x2a49], /* INTERSECTION ABOVE BAR ABOVE UNION */
- [0x2a4a, 0x2a4a], /* UNION BESIDE AND JOINED WITH UNION */
- [0x2a4b, 0x2a4b], /* INTERSECTION BESIDE AND JOINED WITH INTERSECTION */
- [0x2a4c, 0x2a4c], /* CLOSED UNION WITH SERIFS */
- [0x2a4d, 0x2a4d], /* CLOSED INTERSECTION WITH SERIFS */
- [0x2a4e, 0x2a4e], /* DOUBLE SQUARE INTERSECTION */
- [0x2a4f, 0x2a4f], /* DOUBLE SQUARE UNION */
- [0x2a50, 0x2a50], /* CLOSED UNION WITH SERIFS AND SMASH PRODUCT */
- [0x2a51, 0x2a51], /* LOGICAL AND WITH DOT ABOVE */
- [0x2a52, 0x2a52], /* LOGICAL OR WITH DOT ABOVE */
- [0x2a53, 0x2a53], /* DOUBLE LOGICAL AND */
- [0x2a54, 0x2a54], /* DOUBLE LOGICAL OR */
- [0x2a55, 0x2a55], /* TWO INTERSECTING LOGICAL AND */
- [0x2a56, 0x2a56], /* TWO INTERSECTING LOGICAL OR */
- [0x2a57, 0x2a57], /* SLOPING LARGE OR */
- [0x2a58, 0x2a58], /* SLOPING LARGE AND */
- [0x2a59, 0x2a59], /* LOGICAL OR OVERLAPPING LOGICAL AND */
- [0x2a5a, 0x2a5a], /* LOGICAL AND WITH MIDDLE STEM */
- [0x2a5b, 0x2a5b], /* LOGICAL OR WITH MIDDLE STEM */
- [0x2a5c, 0x2a5c], /* LOGICAL AND WITH HORIZONTAL DASH */
- [0x2a5d, 0x2a5d], /* LOGICAL OR WITH HORIZONTAL DASH */
- [0x2a5e, 0x2a5e], /* LOGICAL AND WITH DOUBLE OVERBAR */
- [0x2a5f, 0x2a5f], /* LOGICAL AND WITH UNDERBAR */
- [0x2a60, 0x2a60], /* LOGICAL AND WITH DOUBLE UNDERBAR */
- [0x2a61, 0x2a61], /* SMALL VEE WITH UNDERBAR */
- [0x2a62, 0x2a62], /* LOGICAL OR WITH DOUBLE OVERBAR */
- [0x2a63, 0x2a63], /* LOGICAL OR WITH DOUBLE UNDERBAR */
- [0x2a64, 0x2a64], /* Z NOTATION DOMAIN ANTIRESTRICTION */
- [0x2a65, 0x2a65], /* Z NOTATION RANGE ANTIRESTRICTION */
- [0x2a66, 0x2a66], /* EQUALS SIGN WITH DOT BELOW */
- [0x2a67, 0x2a67], /* IDENTICAL WITH DOT ABOVE */
- [0x2a68, 0x2a68], /* TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE */
- [0x2a69, 0x2a69], /* TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE */
- [0x2a6a, 0x2a6a], /* TILDE OPERATOR WITH DOT ABOVE */
- [0x2a6b, 0x2a6b], /* TILDE OPERATOR WITH RISING DOTS */
- [0x2a6c, 0x2a6c], /* SIMILAR MINUS SIMILAR */
- [0x2a6d, 0x2a6d], /* CONGRUENT WITH DOT ABOVE */
- [0x2a6e, 0x2a6e], /* EQUALS WITH ASTERISK */
- [0x2a6f, 0x2a6f], /* ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT */
- [0x2a70, 0x2a70], /* APPROXIMATELY EQUAL OR EQUAL TO */
- [0x2a71, 0x2a71], /* EQUALS SIGN ABOVE PLUS SIGN */
- [0x2a72, 0x2a72], /* PLUS SIGN ABOVE EQUALS SIGN */
- [0x2a73, 0x2a73], /* EQUALS SIGN ABOVE TILDE OPERATOR */
- [0x2a74, 0x2a74], /* DOUBLE COLON EQUAL */
- [0x2a75, 0x2a75], /* TWO CONSECUTIVE EQUALS SIGNS */
- [0x2a76, 0x2a76], /* THREE CONSECUTIVE EQUALS SIGNS */
- [0x2a77, 0x2a77], /* EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW */
- [0x2a78, 0x2a78], /* EQUIVALENT WITH FOUR DOTS ABOVE */
- [0x2a79, 0x2a79], /* LESS-THAN WITH CIRCLE INSIDE */
- [0x2a7a, 0x2a7a], /* GREATER-THAN WITH CIRCLE INSIDE */
- [0x2a7b, 0x2a7b], /* LESS-THAN WITH QUESTION MARK ABOVE */
- [0x2a7c, 0x2a7c], /* GREATER-THAN WITH QUESTION MARK ABOVE */
- [0x2a7d, 0x2a7d], /* LESS-THAN OR SLANTED EQUAL TO */
- [0x2a7e, 0x2a7e], /* GREATER-THAN OR SLANTED EQUAL TO */
- [0x2a7f, 0x2a7f], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */
- [0x2a80, 0x2a80], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */
- [0x2a81, 0x2a81], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */
- [0x2a82, 0x2a82], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */
- [0x2a83, 0x2a83], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT */
- [0x2a84, 0x2a84], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT */
- [0x2a85, 0x2a85], /* LESS-THAN OR APPROXIMATE */
- [0x2a86, 0x2a86], /* GREATER-THAN OR APPROXIMATE */
- [0x2a87, 0x2a87], /* LESS-THAN AND SINGLE-LINE NOT EQUAL TO */
- [0x2a88, 0x2a88], /* GREATER-THAN AND SINGLE-LINE NOT EQUAL TO */
- [0x2a89, 0x2a89], /* LESS-THAN AND NOT APPROXIMATE */
- [0x2a8a, 0x2a8a], /* GREATER-THAN AND NOT APPROXIMATE */
- [0x2a8b, 0x2a8b], /* LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN */
- [0x2a8c, 0x2a8c], /* GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN */
- [0x2a8d, 0x2a8d], /* LESS-THAN ABOVE SIMILAR OR EQUAL */
- [0x2a8e, 0x2a8e], /* GREATER-THAN ABOVE SIMILAR OR EQUAL */
- [0x2a8f, 0x2a8f], /* LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN */
- [0x2a90, 0x2a90], /* GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN */
- [0x2a91, 0x2a91], /* LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL */
- [0x2a92, 0x2a92], /* GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL */
- [0x2a93, 0x2a93], /* LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL */
- [0x2a94, 0x2a94], /* GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL */
- [0x2a95, 0x2a95], /* SLANTED EQUAL TO OR LESS-THAN */
- [0x2a96, 0x2a96], /* SLANTED EQUAL TO OR GREATER-THAN */
- [0x2a97, 0x2a97], /* SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE */
- [0x2a98, 0x2a98], /* SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE */
- [0x2a99, 0x2a99], /* DOUBLE-LINE EQUAL TO OR LESS-THAN */
- [0x2a9a, 0x2a9a], /* DOUBLE-LINE EQUAL TO OR GREATER-THAN */
- [0x2a9b, 0x2a9b], /* DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN */
- [0x2a9c, 0x2a9c], /* DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN */
- [0x2a9d, 0x2a9d], /* SIMILAR OR LESS-THAN */
- [0x2a9e, 0x2a9e], /* SIMILAR OR GREATER-THAN */
- [0x2a9f, 0x2a9f], /* SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN */
- [0x2aa0, 0x2aa0], /* SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN */
- [0x2aa1, 0x2aa1], /* DOUBLE NESTED LESS-THAN */
- [0x2aa2, 0x2aa2], /* DOUBLE NESTED GREATER-THAN */
- [0x2aa3, 0x2aa3], /* DOUBLE NESTED LESS-THAN WITH UNDERBAR */
- [0x2aa4, 0x2aa4], /* GREATER-THAN OVERLAPPING LESS-THAN */
- [0x2aa5, 0x2aa5], /* GREATER-THAN BESIDE LESS-THAN */
- [0x2aa6, 0x2aa6], /* LESS-THAN CLOSED BY CURVE */
- [0x2aa7, 0x2aa7], /* GREATER-THAN CLOSED BY CURVE */
- [0x2aa8, 0x2aa8], /* LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */
- [0x2aa9, 0x2aa9], /* GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */
- [0x2aaa, 0x2aaa], /* SMALLER THAN */
- [0x2aab, 0x2aab], /* LARGER THAN */
- [0x2aac, 0x2aac], /* SMALLER THAN OR EQUAL TO */
- [0x2aad, 0x2aad], /* LARGER THAN OR EQUAL TO */
- [0x2aae, 0x2aae], /* EQUALS SIGN WITH BUMPY ABOVE */
- [0x2aaf, 0x2aaf], /* PRECEDES ABOVE SINGLE-LINE EQUALS SIGN */
- [0x2ab0, 0x2ab0], /* SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN */
- [0x2ab1, 0x2ab1], /* PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO */
- [0x2ab2, 0x2ab2], /* SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO */
- [0x2ab3, 0x2ab3], /* PRECEDES ABOVE EQUALS SIGN */
- [0x2ab4, 0x2ab4], /* SUCCEEDS ABOVE EQUALS SIGN */
- [0x2ab5, 0x2ab5], /* PRECEDES ABOVE NOT EQUAL TO */
- [0x2ab6, 0x2ab6], /* SUCCEEDS ABOVE NOT EQUAL TO */
- [0x2ab7, 0x2ab7], /* PRECEDES ABOVE ALMOST EQUAL TO */
- [0x2ab8, 0x2ab8], /* SUCCEEDS ABOVE ALMOST EQUAL TO */
- [0x2ab9, 0x2ab9], /* PRECEDES ABOVE NOT ALMOST EQUAL TO */
- [0x2aba, 0x2aba], /* SUCCEEDS ABOVE NOT ALMOST EQUAL TO */
- [0x2abb, 0x2abb], /* DOUBLE PRECEDES */
- [0x2abc, 0x2abc], /* DOUBLE SUCCEEDS */
- [0x2abd, 0x2abd], /* SUBSET WITH DOT */
- [0x2abe, 0x2abe], /* SUPERSET WITH DOT */
- [0x2abf, 0x2abf], /* SUBSET WITH PLUS SIGN BELOW */
- [0x2ac0, 0x2ac0], /* SUPERSET WITH PLUS SIGN BELOW */
- [0x2ac1, 0x2ac1], /* SUBSET WITH MULTIPLICATION SIGN BELOW */
- [0x2ac2, 0x2ac2], /* SUPERSET WITH MULTIPLICATION SIGN BELOW */
- [0x2ac3, 0x2ac3], /* SUBSET OF OR EQUAL TO WITH DOT ABOVE */
- [0x2ac4, 0x2ac4], /* SUPERSET OF OR EQUAL TO WITH DOT ABOVE */
- [0x2ac5, 0x2ac5], /* SUBSET OF ABOVE EQUALS SIGN */
- [0x2ac6, 0x2ac6], /* SUPERSET OF ABOVE EQUALS SIGN */
- [0x2ac7, 0x2ac7], /* SUBSET OF ABOVE TILDE OPERATOR */
- [0x2ac8, 0x2ac8], /* SUPERSET OF ABOVE TILDE OPERATOR */
- [0x2ac9, 0x2ac9], /* SUBSET OF ABOVE ALMOST EQUAL TO */
- [0x2aca, 0x2aca], /* SUPERSET OF ABOVE ALMOST EQUAL TO */
- [0x2acb, 0x2acb], /* SUBSET OF ABOVE NOT EQUAL TO */
- [0x2acc, 0x2acc], /* SUPERSET OF ABOVE NOT EQUAL TO */
- [0x2acd, 0x2acd], /* SQUARE LEFT OPEN BOX OPERATOR */
- [0x2ace, 0x2ace], /* SQUARE RIGHT OPEN BOX OPERATOR */
- [0x2acf, 0x2acf], /* CLOSED SUBSET */
- [0x2ad0, 0x2ad0], /* CLOSED SUPERSET */
- [0x2ad1, 0x2ad1], /* CLOSED SUBSET OR EQUAL TO */
- [0x2ad2, 0x2ad2], /* CLOSED SUPERSET OR EQUAL TO */
- [0x2ad3, 0x2ad3], /* SUBSET ABOVE SUPERSET */
- [0x2ad4, 0x2ad4], /* SUPERSET ABOVE SUBSET */
- [0x2ad5, 0x2ad5], /* SUBSET ABOVE SUBSET */
- [0x2ad6, 0x2ad6], /* SUPERSET ABOVE SUPERSET */
- [0x2ad7, 0x2ad7], /* SUPERSET BESIDE SUBSET */
- [0x2ad8, 0x2ad8], /* SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET */
- [0x2ad9, 0x2ad9], /* ELEMENT OF OPENING DOWNWARDS */
- [0x2ada, 0x2ada], /* PITCHFORK WITH TEE TOP */
- [0x2adb, 0x2adb], /* TRANSVERSAL INTERSECTION */
- [0x2adc, 0x2adc], /* FORKING */
- [0x2add, 0x2add], /* NONFORKING */
- [0x2ade, 0x2ade], /* SHORT LEFT TACK */
- [0x2adf, 0x2adf], /* SHORT DOWN TACK */
- [0x2ae0, 0x2ae0], /* SHORT UP TACK */
- [0x2ae1, 0x2ae1], /* PERPENDICULAR WITH S */
- [0x2ae2, 0x2ae2], /* VERTICAL BAR TRIPLE RIGHT TURNSTILE */
- [0x2ae3, 0x2ae3], /* DOUBLE VERTICAL BAR LEFT TURNSTILE */
- [0x2ae4, 0x2ae4], /* VERTICAL BAR DOUBLE LEFT TURNSTILE */
- [0x2ae5, 0x2ae5], /* DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE */
- [0x2ae6, 0x2ae6], /* LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL */
- [0x2ae7, 0x2ae7], /* SHORT DOWN TACK WITH OVERBAR */
- [0x2ae8, 0x2ae8], /* SHORT UP TACK WITH UNDERBAR */
- [0x2ae9, 0x2ae9], /* SHORT UP TACK ABOVE SHORT DOWN TACK */
- [0x2aea, 0x2aea], /* DOUBLE DOWN TACK */
- [0x2aeb, 0x2aeb], /* DOUBLE UP TACK */
- [0x2aec, 0x2aec], /* DOUBLE STROKE NOT SIGN */
- [0x2aed, 0x2aed], /* REVERSED DOUBLE STROKE NOT SIGN */
- [0x2aee, 0x2aee], /* DOES NOT DIVIDE WITH REVERSED NEGATION SLASH */
- [0x2aef, 0x2aef], /* VERTICAL LINE WITH CIRCLE ABOVE */
- [0x2af0, 0x2af0], /* VERTICAL LINE WITH CIRCLE BELOW */
- [0x2af1, 0x2af1], /* DOWN TACK WITH CIRCLE BELOW */
- [0x2af2, 0x2af2], /* PARALLEL WITH HORIZONTAL STROKE */
- [0x2af3, 0x2af3], /* PARALLEL WITH TILDE OPERATOR */
- [0x2af4, 0x2af4], /* TRIPLE VERTICAL BAR BINARY RELATION */
- [0x2af5, 0x2af5], /* TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE */
- [0x2af6, 0x2af6], /* TRIPLE COLON OPERATOR */
- [0x2af7, 0x2af7], /* TRIPLE NESTED LESS-THAN */
- [0x2af8, 0x2af8], /* TRIPLE NESTED GREATER-THAN */
- [0x2af9, 0x2af9], /* DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO */
- [0x2afa, 0x2afa], /* DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO */
- [0x2afb, 0x2afb], /* TRIPLE SOLIDUS BINARY RELATION */
- [0x2afc, 0x2afc], /* LARGE TRIPLE VERTICAL BAR OPERATOR */
- [0x2afd, 0x2afd], /* DOUBLE SOLIDUS OPERATOR */
- [0x2afe, 0x2afe], /* WHITE VERTICAL BAR */
- [0x2aff, 0x2aff], /* N-ARY WHITE VERTICAL BAR */
- [0x2b00, 0x2b00], /* NORTH EAST WHITE ARROW */
- [0x2b01, 0x2b01], /* NORTH WEST WHITE ARROW */
- [0x2b02, 0x2b02], /* SOUTH EAST WHITE ARROW */
- [0x2b03, 0x2b03], /* SOUTH WEST WHITE ARROW */
- [0x2b04, 0x2b04], /* LEFT RIGHT WHITE ARROW */
- [0x2b05, 0x2b05], /* LEFTWARDS BLACK ARROW */
- [0x2b06, 0x2b06], /* UPWARDS BLACK ARROW */
- [0x2b07, 0x2b07], /* DOWNWARDS BLACK ARROW */
- [0x2b08, 0x2b08], /* NORTH EAST BLACK ARROW */
- [0x2b09, 0x2b09], /* NORTH WEST BLACK ARROW */
- [0x2b0a, 0x2b0a], /* SOUTH EAST BLACK ARROW */
- [0x2b0b, 0x2b0b], /* SOUTH WEST BLACK ARROW */
- [0x2b0c, 0x2b0c], /* LEFT RIGHT BLACK ARROW */
- [0x2b0d, 0x2b0d], /* UP DOWN BLACK ARROW */
- [0x2b0e, 0x2b0e], /* RIGHTWARDS ARROW WITH TIP DOWNWARDS */
- [0x2b0f, 0x2b0f], /* RIGHTWARDS ARROW WITH TIP UPWARDS */
- [0x2b10, 0x2b10], /* LEFTWARDS ARROW WITH TIP DOWNWARDS */
- [0x2b11, 0x2b11], /* LEFTWARDS ARROW WITH TIP UPWARDS */
- [0x2b12, 0x2b12], /* SQUARE WITH TOP HALF BLACK */
- [0x2b13, 0x2b13], /* SQUARE WITH BOTTOM HALF BLACK */
- [0x2b14, 0x2b14], /* SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK */
- [0x2b15, 0x2b15], /* SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK */
- [0x2b16, 0x2b16], /* DIAMOND WITH LEFT HALF BLACK */
- [0x2b17, 0x2b17], /* DIAMOND WITH RIGHT HALF BLACK */
- [0x2b18, 0x2b18], /* DIAMOND WITH TOP HALF BLACK */
- [0x2b19, 0x2b19], /* DIAMOND WITH BOTTOM HALF BLACK */
- [0x2b1a, 0x2b1a], /* DOTTED SQUARE */
- [0x2b1b, 0x2b1b], /* BLACK LARGE SQUARE */
- [0x2b1c, 0x2b1c], /* WHITE LARGE SQUARE */
- [0x2b1d, 0x2b1d], /* BLACK VERY SMALL SQUARE */
- [0x2b1e, 0x2b1e], /* WHITE VERY SMALL SQUARE */
- [0x2b1f, 0x2b1f], /* BLACK PENTAGON */
- [0x2b20, 0x2b20], /* WHITE PENTAGON */
- [0x2b21, 0x2b21], /* WHITE HEXAGON */
- [0x2b22, 0x2b22], /* BLACK HEXAGON */
- [0x2b23, 0x2b23], /* HORIZONTAL BLACK HEXAGON */
- [0x2b24, 0x2b24], /* BLACK LARGE CIRCLE */
- [0x2b25, 0x2b25], /* BLACK MEDIUM DIAMOND */
- [0x2b26, 0x2b26], /* WHITE MEDIUM DIAMOND */
- [0x2b27, 0x2b27], /* BLACK MEDIUM LOZENGE */
- [0x2b28, 0x2b28], /* WHITE MEDIUM LOZENGE */
- [0x2b29, 0x2b29], /* BLACK SMALL DIAMOND */
- [0x2b2a, 0x2b2a], /* BLACK SMALL LOZENGE */
- [0x2b2b, 0x2b2b], /* WHITE SMALL LOZENGE */
- [0x2b2c, 0x2b2c], /* BLACK HORIZONTAL ELLIPSE */
- [0x2b2d, 0x2b2d], /* WHITE HORIZONTAL ELLIPSE */
- [0x2b2e, 0x2b2e], /* BLACK VERTICAL ELLIPSE */
- [0x2b2f, 0x2b2f], /* WHITE VERTICAL ELLIPSE */
- [0x2b30, 0x2b30], /* LEFT ARROW WITH SMALL CIRCLE */
- [0x2b31, 0x2b31], /* THREE LEFTWARDS ARROWS */
- [0x2b32, 0x2b32], /* LEFT ARROW WITH CIRCLED PLUS */
- [0x2b33, 0x2b33], /* LONG LEFTWARDS SQUIGGLE ARROW */
- [0x2b34, 0x2b34], /* LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE */
- [0x2b35, 0x2b35], /* LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE */
- [0x2b36, 0x2b36], /* LEFTWARDS TWO-HEADED ARROW FROM BAR */
- [0x2b37, 0x2b37], /* LEFTWARDS TWO-HEADED TRIPLE DASH ARROW */
- [0x2b38, 0x2b38], /* LEFTWARDS ARROW WITH DOTTED STEM */
- [0x2b39, 0x2b39], /* LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE */
- [0x2b3a, 0x2b3a], /* LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
- [0x2b3b, 0x2b3b], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL */
- [0x2b3c, 0x2b3c], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE */
- [0x2b3d, 0x2b3d], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
- [0x2b3e, 0x2b3e], /* LEFTWARDS ARROW THROUGH X */
- [0x2b3f, 0x2b3f], /* WAVE ARROW POINTING DIRECTLY LEFT */
- [0x2b40, 0x2b40], /* EQUALS SIGN ABOVE LEFTWARDS ARROW */
- [0x2b41, 0x2b41], /* REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW */
- [0x2b42, 0x2b42], /* LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */
- [0x2b43, 0x2b43], /* RIGHTWARDS ARROW THROUGH GREATER-THAN */
- [0x2b44, 0x2b44], /* RIGHTWARDS ARROW THROUGH SUPERSET */
- [0x2b45, 0x2b45], /* LEFTWARDS QUADRUPLE ARROW */
- [0x2b46, 0x2b46], /* RIGHTWARDS QUADRUPLE ARROW */
- [0x2b47, 0x2b47], /* REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW */
- [0x2b48, 0x2b48], /* RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */
- [0x2b49, 0x2b49], /* TILDE OPERATOR ABOVE LEFTWARDS ARROW */
- [0x2b4a, 0x2b4a], /* LEFTWARDS ARROW ABOVE ALMOST EQUAL TO */
- [0x2b4b, 0x2b4b], /* LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */
- [0x2b4c, 0x2b4c], /* RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */
- [0x2b4d, 0x2b4d], /* DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW */
- [0x2b4e, 0x2b4e], /* SHORT SLANTED NORTH ARROW */
- [0x2b4f, 0x2b4f], /* SHORT BACKSLANTED SOUTH ARROW */
- [0x2b50, 0x2b50], /* WHITE MEDIUM STAR */
- [0x2b51, 0x2b51], /* BLACK SMALL STAR */
- [0x2b52, 0x2b52], /* WHITE SMALL STAR */
- [0x2b53, 0x2b53], /* BLACK RIGHT-POINTING PENTAGON */
- [0x2b54, 0x2b54], /* WHITE RIGHT-POINTING PENTAGON */
- [0x2b55, 0x2b55], /* HEAVY LARGE CIRCLE */
- [0x2b56, 0x2b56], /* HEAVY OVAL WITH OVAL INSIDE */
- [0x2b57, 0x2b57], /* HEAVY CIRCLE WITH CIRCLE INSIDE */
- [0x2b58, 0x2b58], /* HEAVY CIRCLE */
- [0x2b59, 0x2b59], /* HEAVY CIRCLED SALTIRE */
- [0x2b5a, 0x2b5a], /* SLANTED NORTH ARROW WITH HOOKED HEAD */
- [0x2b5b, 0x2b5b], /* BACKSLANTED SOUTH ARROW WITH HOOKED TAIL */
- [0x2b5c, 0x2b5c], /* SLANTED NORTH ARROW WITH HORIZONTAL TAIL */
- [0x2b5d, 0x2b5d], /* BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL */
- [0x2b5e, 0x2b5e], /* BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */
- [0x2b5f, 0x2b5f], /* SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */
- [0x2b60, 0x2b60], /* LEFTWARDS TRIANGLE-HEADED ARROW */
- [0x2b61, 0x2b61], /* UPWARDS TRIANGLE-HEADED ARROW */
- [0x2b62, 0x2b62], /* RIGHTWARDS TRIANGLE-HEADED ARROW */
- [0x2b63, 0x2b63], /* DOWNWARDS TRIANGLE-HEADED ARROW */
- [0x2b64, 0x2b64], /* LEFT RIGHT TRIANGLE-HEADED ARROW */
- [0x2b65, 0x2b65], /* UP DOWN TRIANGLE-HEADED ARROW */
- [0x2b66, 0x2b66], /* NORTH WEST TRIANGLE-HEADED ARROW */
- [0x2b67, 0x2b67], /* NORTH EAST TRIANGLE-HEADED ARROW */
- [0x2b68, 0x2b68], /* SOUTH EAST TRIANGLE-HEADED ARROW */
- [0x2b69, 0x2b69], /* SOUTH WEST TRIANGLE-HEADED ARROW */
- [0x2b6a, 0x2b6a], /* LEFTWARDS TRIANGLE-HEADED DASHED ARROW */
- [0x2b6b, 0x2b6b], /* UPWARDS TRIANGLE-HEADED DASHED ARROW */
- [0x2b6c, 0x2b6c], /* RIGHTWARDS TRIANGLE-HEADED DASHED ARROW */
- [0x2b6d, 0x2b6d], /* DOWNWARDS TRIANGLE-HEADED DASHED ARROW */
- [0x2b6e, 0x2b6e], /* CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */
- [0x2b6f, 0x2b6f], /* ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */
- [0x2b70, 0x2b70], /* LEFTWARDS TRIANGLE-HEADED ARROW TO BAR */
- [0x2b71, 0x2b71], /* UPWARDS TRIANGLE-HEADED ARROW TO BAR */
- [0x2b72, 0x2b72], /* RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR */
- [0x2b73, 0x2b73], /* DOWNWARDS TRIANGLE-HEADED ARROW TO BAR */
- [0x2b74, 0x2b74],
- [0x2b75, 0x2b75],
- [0x2b76, 0x2b76], /* NORTH WEST TRIANGLE-HEADED ARROW TO BAR */
- [0x2b77, 0x2b77], /* NORTH EAST TRIANGLE-HEADED ARROW TO BAR */
- [0x2b78, 0x2b78], /* SOUTH EAST TRIANGLE-HEADED ARROW TO BAR */
- [0x2b79, 0x2b79], /* SOUTH WEST TRIANGLE-HEADED ARROW TO BAR */
- [0x2b7a, 0x2b7a], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
- [0x2b7b, 0x2b7b], /* UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
- [0x2b7c, 0x2b7c], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
- [0x2b7d, 0x2b7d], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
- [0x2b7e, 0x2b7e], /* HORIZONTAL TAB KEY */
- [0x2b7f, 0x2b7f], /* VERTICAL TAB KEY */
- [0x2b80, 0x2b80], /* LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW */
- [0x2b81, 0x2b81], /* UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW */
- [0x2b82, 0x2b82], /* RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW */
- [0x2b83, 0x2b83], /* DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW */
- [0x2b84, 0x2b84], /* LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS */
- [0x2b85, 0x2b85], /* UPWARDS TRIANGLE-HEADED PAIRED ARROWS */
- [0x2b86, 0x2b86], /* RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS */
- [0x2b87, 0x2b87], /* DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS */
- [0x2b88, 0x2b88], /* LEFTWARDS BLACK CIRCLED WHITE ARROW */
- [0x2b89, 0x2b89], /* UPWARDS BLACK CIRCLED WHITE ARROW */
- [0x2b8a, 0x2b8a], /* RIGHTWARDS BLACK CIRCLED WHITE ARROW */
- [0x2b8b, 0x2b8b], /* DOWNWARDS BLACK CIRCLED WHITE ARROW */
- [0x2b8c, 0x2b8c], /* ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW */
- [0x2b8d, 0x2b8d], /* ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW */
- [0x2b8e, 0x2b8e], /* ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW */
- [0x2b8f, 0x2b8f], /* ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW */
- [0x2b90, 0x2b90], /* RETURN LEFT */
- [0x2b91, 0x2b91], /* RETURN RIGHT */
- [0x2b92, 0x2b92], /* NEWLINE LEFT */
- [0x2b93, 0x2b93], /* NEWLINE RIGHT */
- [0x2b94, 0x2b94], /* FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE */
- [0x2b95, 0x2b95], /* RIGHTWARDS BLACK ARROW */
- [0x2b96, 0x2b96],
- [0x2b97, 0x2b97],
- [0x2b98, 0x2b98], /* THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD */
- [0x2b99, 0x2b99], /* THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD */
- [0x2b9a, 0x2b9a], /* THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD */
- [0x2b9b, 0x2b9b], /* THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD */
- [0x2b9c, 0x2b9c], /* BLACK LEFTWARDS EQUILATERAL ARROWHEAD */
- [0x2b9d, 0x2b9d], /* BLACK UPWARDS EQUILATERAL ARROWHEAD */
- [0x2b9e, 0x2b9e], /* BLACK RIGHTWARDS EQUILATERAL ARROWHEAD */
- [0x2b9f, 0x2b9f], /* BLACK DOWNWARDS EQUILATERAL ARROWHEAD */
- [0x2ba0, 0x2ba0], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */
- [0x2ba1, 0x2ba1], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */
- [0x2ba2, 0x2ba2], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */
- [0x2ba3, 0x2ba3], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */
- [0x2ba4, 0x2ba4], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */
- [0x2ba5, 0x2ba5], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */
- [0x2ba6, 0x2ba6], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */
- [0x2ba7, 0x2ba7], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */
- [0x2ba8, 0x2ba8], /* BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW */
- [0x2ba9, 0x2ba9], /* BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW */
- [0x2baa, 0x2baa], /* BLACK CURVED UPWARDS AND LEFTWARDS ARROW */
- [0x2bab, 0x2bab], /* BLACK CURVED UPWARDS AND RIGHTWARDS ARROW */
- [0x2bac, 0x2bac], /* BLACK CURVED LEFTWARDS AND UPWARDS ARROW */
- [0x2bad, 0x2bad], /* BLACK CURVED RIGHTWARDS AND UPWARDS ARROW */
- [0x2bae, 0x2bae], /* BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW */
- [0x2baf, 0x2baf], /* BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW */
- [0x2bb0, 0x2bb0], /* RIBBON ARROW DOWN LEFT */
- [0x2bb1, 0x2bb1], /* RIBBON ARROW DOWN RIGHT */
- [0x2bb2, 0x2bb2], /* RIBBON ARROW UP LEFT */
- [0x2bb3, 0x2bb3], /* RIBBON ARROW UP RIGHT */
- [0x2bb4, 0x2bb4], /* RIBBON ARROW LEFT UP */
- [0x2bb5, 0x2bb5], /* RIBBON ARROW RIGHT UP */
- [0x2bb6, 0x2bb6], /* RIBBON ARROW LEFT DOWN */
- [0x2bb7, 0x2bb7], /* RIBBON ARROW RIGHT DOWN */
- [0x2bb8, 0x2bb8], /* UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR */
- [0x2bb9, 0x2bb9], /* UP ARROWHEAD IN A RECTANGLE BOX */
- [0x2bba, 0x2bba], /* OVERLAPPING WHITE SQUARES */
- [0x2bbb, 0x2bbb], /* OVERLAPPING WHITE AND BLACK SQUARES */
- [0x2bbc, 0x2bbc], /* OVERLAPPING BLACK SQUARES */
- [0x2bbd, 0x2bbd], /* BALLOT BOX WITH LIGHT X */
- [0x2bbe, 0x2bbe], /* CIRCLED X */
- [0x2bbf, 0x2bbf], /* CIRCLED BOLD X */
- [0x2bc0, 0x2bc0], /* BLACK SQUARE CENTRED */
- [0x2bc1, 0x2bc1], /* BLACK DIAMOND CENTRED */
- [0x2bc2, 0x2bc2], /* TURNED BLACK PENTAGON */
- [0x2bc3, 0x2bc3], /* HORIZONTAL BLACK OCTAGON */
- [0x2bc4, 0x2bc4], /* BLACK OCTAGON */
- [0x2bc5, 0x2bc5], /* BLACK MEDIUM UP-POINTING TRIANGLE CENTRED */
- [0x2bc6, 0x2bc6], /* BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED */
- [0x2bc7, 0x2bc7], /* BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED */
- [0x2bc8, 0x2bc8], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED */
- [0x2bc9, 0x2bc9],
- [0x2bca, 0x2bca], /* TOP HALF BLACK CIRCLE */
- [0x2bcb, 0x2bcb], /* BOTTOM HALF BLACK CIRCLE */
- [0x2bcc, 0x2bcc], /* LIGHT FOUR POINTED BLACK CUSP */
- [0x2bcd, 0x2bcd], /* ROTATED LIGHT FOUR POINTED BLACK CUSP */
- [0x2bce, 0x2bce], /* WHITE FOUR POINTED CUSP */
- [0x2bcf, 0x2bcf], /* ROTATED WHITE FOUR POINTED CUSP */
- [0x2bd0, 0x2bd0], /* SQUARE POSITION INDICATOR */
- [0x2bd1, 0x2bd1], /* UNCERTAINTY SIGN */
- [0x2bd2, 0x2bd2], /* GROUP MARK */
- [0x2bd3, 0x2bd3], /* PLUTO FORM TWO */
- [0x2bd4, 0x2bd4], /* PLUTO FORM THREE */
- [0x2bd5, 0x2bd5], /* PLUTO FORM FOUR */
- [0x2bd6, 0x2bd6], /* PLUTO FORM FIVE */
- [0x2bd7, 0x2bd7], /* TRANSPLUTO */
- [0x2bd8, 0x2bd8], /* PROSERPINA */
- [0x2bd9, 0x2bd9], /* ASTRAEA */
- [0x2bda, 0x2bda], /* HYGIEA */
- [0x2bdb, 0x2bdb], /* PHOLUS */
- [0x2bdc, 0x2bdc], /* NESSUS */
- [0x2bdd, 0x2bdd], /* WHITE MOON SELENA */
- [0x2bde, 0x2bde], /* BLACK DIAMOND ON CROSS */
- [0x2bdf, 0x2bdf], /* TRUE LIGHT MOON ARTA */
- [0x2be0, 0x2be0], /* CUPIDO */
- [0x2be1, 0x2be1], /* HADES */
- [0x2be2, 0x2be2], /* ZEUS */
- [0x2be3, 0x2be3], /* KRONOS */
- [0x2be4, 0x2be4], /* APOLLON */
- [0x2be5, 0x2be5], /* ADMETOS */
- [0x2be6, 0x2be6], /* VULCANUS */
- [0x2be7, 0x2be7], /* POSEIDON */
- [0x2be8, 0x2be8], /* LEFT HALF BLACK STAR */
- [0x2be9, 0x2be9], /* RIGHT HALF BLACK STAR */
- [0x2bea, 0x2bea], /* STAR WITH LEFT HALF BLACK */
- [0x2beb, 0x2beb], /* STAR WITH RIGHT HALF BLACK */
- [0x2bec, 0x2bec], /* LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
- [0x2bed, 0x2bed], /* UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
- [0x2bee, 0x2bee], /* RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
- [0x2bef, 0x2bef], /* DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
- [0x2bf0, 0x2bf0], /* ERIS FORM ONE */
- [0x2bf1, 0x2bf1], /* ERIS FORM TWO */
- [0x2bf2, 0x2bf2], /* SEDNA */
- [0x2bf3, 0x2bf3], /* RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE */
- [0x2bf4, 0x2bf4], /* RUSSIAN ASTROLOGICAL SYMBOL NOVILE */
- [0x2bf5, 0x2bf5], /* RUSSIAN ASTROLOGICAL SYMBOL QUINTILE */
- [0x2bf6, 0x2bf6], /* RUSSIAN ASTROLOGICAL SYMBOL BINOVILE */
- [0x2bf7, 0x2bf7], /* RUSSIAN ASTROLOGICAL SYMBOL SENTAGON */
- [0x2bf8, 0x2bf8], /* RUSSIAN ASTROLOGICAL SYMBOL TREDECILE */
- [0x2bf9, 0x2bf9], /* EQUALS SIGN WITH INFINITY BELOW */
- [0x2bfa, 0x2bfa], /* UNITED SYMBOL */
- [0x2bfb, 0x2bfb], /* SEPARATED SYMBOL */
- [0x2bfc, 0x2bfc], /* DOUBLED SYMBOL */
- [0x2bfd, 0x2bfd], /* PASSED SYMBOL */
- [0x2bfe, 0x2bfe], /* REVERSED RIGHT ANGLE */
- [0x2bff, 0x2bff],
- [0x2c00, 0x2c30], /* GLAGOLITIC CAPITAL LETTER AZU */
- [0x2c01, 0x2c31], /* GLAGOLITIC CAPITAL LETTER BUKY */
- [0x2c02, 0x2c32], /* GLAGOLITIC CAPITAL LETTER VEDE */
- [0x2c03, 0x2c33], /* GLAGOLITIC CAPITAL LETTER GLAGOLI */
- [0x2c04, 0x2c34], /* GLAGOLITIC CAPITAL LETTER DOBRO */
- [0x2c05, 0x2c35], /* GLAGOLITIC CAPITAL LETTER YESTU */
- [0x2c06, 0x2c36], /* GLAGOLITIC CAPITAL LETTER ZHIVETE */
- [0x2c07, 0x2c37], /* GLAGOLITIC CAPITAL LETTER DZELO */
- [0x2c08, 0x2c38], /* GLAGOLITIC CAPITAL LETTER ZEMLJA */
- [0x2c09, 0x2c39], /* GLAGOLITIC CAPITAL LETTER IZHE */
- [0x2c0a, 0x2c3a], /* GLAGOLITIC CAPITAL LETTER INITIAL IZHE */
- [0x2c0b, 0x2c3b], /* GLAGOLITIC CAPITAL LETTER I */
- [0x2c0c, 0x2c3c], /* GLAGOLITIC CAPITAL LETTER DJERVI */
- [0x2c0d, 0x2c3d], /* GLAGOLITIC CAPITAL LETTER KAKO */
- [0x2c0e, 0x2c3e], /* GLAGOLITIC CAPITAL LETTER LJUDIJE */
- [0x2c0f, 0x2c3f], /* GLAGOLITIC CAPITAL LETTER MYSLITE */
- [0x2c10, 0x2c40], /* GLAGOLITIC CAPITAL LETTER NASHI */
- [0x2c11, 0x2c41], /* GLAGOLITIC CAPITAL LETTER ONU */
- [0x2c12, 0x2c42], /* GLAGOLITIC CAPITAL LETTER POKOJI */
- [0x2c13, 0x2c43], /* GLAGOLITIC CAPITAL LETTER RITSI */
- [0x2c14, 0x2c44], /* GLAGOLITIC CAPITAL LETTER SLOVO */
- [0x2c15, 0x2c45], /* GLAGOLITIC CAPITAL LETTER TVRIDO */
- [0x2c16, 0x2c46], /* GLAGOLITIC CAPITAL LETTER UKU */
- [0x2c17, 0x2c47], /* GLAGOLITIC CAPITAL LETTER FRITU */
- [0x2c18, 0x2c48], /* GLAGOLITIC CAPITAL LETTER HERU */
- [0x2c19, 0x2c49], /* GLAGOLITIC CAPITAL LETTER OTU */
- [0x2c1a, 0x2c4a], /* GLAGOLITIC CAPITAL LETTER PE */
- [0x2c1b, 0x2c4b], /* GLAGOLITIC CAPITAL LETTER SHTA */
- [0x2c1c, 0x2c4c], /* GLAGOLITIC CAPITAL LETTER TSI */
- [0x2c1d, 0x2c4d], /* GLAGOLITIC CAPITAL LETTER CHRIVI */
- [0x2c1e, 0x2c4e], /* GLAGOLITIC CAPITAL LETTER SHA */
- [0x2c1f, 0x2c4f], /* GLAGOLITIC CAPITAL LETTER YERU */
- [0x2c20, 0x2c50], /* GLAGOLITIC CAPITAL LETTER YERI */
- [0x2c21, 0x2c51], /* GLAGOLITIC CAPITAL LETTER YATI */
- [0x2c22, 0x2c52], /* GLAGOLITIC CAPITAL LETTER SPIDERY HA */
- [0x2c23, 0x2c53], /* GLAGOLITIC CAPITAL LETTER YU */
- [0x2c24, 0x2c54], /* GLAGOLITIC CAPITAL LETTER SMALL YUS */
- [0x2c25, 0x2c55], /* GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL */
- [0x2c26, 0x2c56], /* GLAGOLITIC CAPITAL LETTER YO */
- [0x2c27, 0x2c57], /* GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS */
- [0x2c28, 0x2c58], /* GLAGOLITIC CAPITAL LETTER BIG YUS */
- [0x2c29, 0x2c59], /* GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS */
- [0x2c2a, 0x2c5a], /* GLAGOLITIC CAPITAL LETTER FITA */
- [0x2c2b, 0x2c5b], /* GLAGOLITIC CAPITAL LETTER IZHITSA */
- [0x2c2c, 0x2c5c], /* GLAGOLITIC CAPITAL LETTER SHTAPIC */
- [0x2c2d, 0x2c5d], /* GLAGOLITIC CAPITAL LETTER TROKUTASTI A */
- [0x2c2e, 0x2c5e], /* GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE */
- [0x2c2f, 0x2c2f],
- [0x2c00, 0x2c30], /* GLAGOLITIC SMALL LETTER AZU */
- [0x2c01, 0x2c31], /* GLAGOLITIC SMALL LETTER BUKY */
- [0x2c02, 0x2c32], /* GLAGOLITIC SMALL LETTER VEDE */
- [0x2c03, 0x2c33], /* GLAGOLITIC SMALL LETTER GLAGOLI */
- [0x2c04, 0x2c34], /* GLAGOLITIC SMALL LETTER DOBRO */
- [0x2c05, 0x2c35], /* GLAGOLITIC SMALL LETTER YESTU */
- [0x2c06, 0x2c36], /* GLAGOLITIC SMALL LETTER ZHIVETE */
- [0x2c07, 0x2c37], /* GLAGOLITIC SMALL LETTER DZELO */
- [0x2c08, 0x2c38], /* GLAGOLITIC SMALL LETTER ZEMLJA */
- [0x2c09, 0x2c39], /* GLAGOLITIC SMALL LETTER IZHE */
- [0x2c0a, 0x2c3a], /* GLAGOLITIC SMALL LETTER INITIAL IZHE */
- [0x2c0b, 0x2c3b], /* GLAGOLITIC SMALL LETTER I */
- [0x2c0c, 0x2c3c], /* GLAGOLITIC SMALL LETTER DJERVI */
- [0x2c0d, 0x2c3d], /* GLAGOLITIC SMALL LETTER KAKO */
- [0x2c0e, 0x2c3e], /* GLAGOLITIC SMALL LETTER LJUDIJE */
- [0x2c0f, 0x2c3f], /* GLAGOLITIC SMALL LETTER MYSLITE */
- [0x2c10, 0x2c40], /* GLAGOLITIC SMALL LETTER NASHI */
- [0x2c11, 0x2c41], /* GLAGOLITIC SMALL LETTER ONU */
- [0x2c12, 0x2c42], /* GLAGOLITIC SMALL LETTER POKOJI */
- [0x2c13, 0x2c43], /* GLAGOLITIC SMALL LETTER RITSI */
- [0x2c14, 0x2c44], /* GLAGOLITIC SMALL LETTER SLOVO */
- [0x2c15, 0x2c45], /* GLAGOLITIC SMALL LETTER TVRIDO */
- [0x2c16, 0x2c46], /* GLAGOLITIC SMALL LETTER UKU */
- [0x2c17, 0x2c47], /* GLAGOLITIC SMALL LETTER FRITU */
- [0x2c18, 0x2c48], /* GLAGOLITIC SMALL LETTER HERU */
- [0x2c19, 0x2c49], /* GLAGOLITIC SMALL LETTER OTU */
- [0x2c1a, 0x2c4a], /* GLAGOLITIC SMALL LETTER PE */
- [0x2c1b, 0x2c4b], /* GLAGOLITIC SMALL LETTER SHTA */
- [0x2c1c, 0x2c4c], /* GLAGOLITIC SMALL LETTER TSI */
- [0x2c1d, 0x2c4d], /* GLAGOLITIC SMALL LETTER CHRIVI */
- [0x2c1e, 0x2c4e], /* GLAGOLITIC SMALL LETTER SHA */
- [0x2c1f, 0x2c4f], /* GLAGOLITIC SMALL LETTER YERU */
- [0x2c20, 0x2c50], /* GLAGOLITIC SMALL LETTER YERI */
- [0x2c21, 0x2c51], /* GLAGOLITIC SMALL LETTER YATI */
- [0x2c22, 0x2c52], /* GLAGOLITIC SMALL LETTER SPIDERY HA */
- [0x2c23, 0x2c53], /* GLAGOLITIC SMALL LETTER YU */
- [0x2c24, 0x2c54], /* GLAGOLITIC SMALL LETTER SMALL YUS */
- [0x2c25, 0x2c55], /* GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL */
- [0x2c26, 0x2c56], /* GLAGOLITIC SMALL LETTER YO */
- [0x2c27, 0x2c57], /* GLAGOLITIC SMALL LETTER IOTATED SMALL YUS */
- [0x2c28, 0x2c58], /* GLAGOLITIC SMALL LETTER BIG YUS */
- [0x2c29, 0x2c59], /* GLAGOLITIC SMALL LETTER IOTATED BIG YUS */
- [0x2c2a, 0x2c5a], /* GLAGOLITIC SMALL LETTER FITA */
- [0x2c2b, 0x2c5b], /* GLAGOLITIC SMALL LETTER IZHITSA */
- [0x2c2c, 0x2c5c], /* GLAGOLITIC SMALL LETTER SHTAPIC */
- [0x2c2d, 0x2c5d], /* GLAGOLITIC SMALL LETTER TROKUTASTI A */
- [0x2c2e, 0x2c5e], /* GLAGOLITIC SMALL LETTER LATINATE MYSLITE */
- [0x2c5f, 0x2c5f],
- [0x2c60, 0x2c61], /* LATIN CAPITAL LETTER L WITH DOUBLE BAR */
- [0x2c60, 0x2c61], /* LATIN SMALL LETTER L WITH DOUBLE BAR */
- [0x2c62, 0x26b], /* LATIN CAPITAL LETTER L WITH MIDDLE TILDE */
- [0x2c63, 0x1d7d], /* LATIN CAPITAL LETTER P WITH STROKE */
- [0x2c64, 0x27d], /* LATIN CAPITAL LETTER R WITH TAIL */
- [0x23a, 0x2c65], /* LATIN SMALL LETTER A WITH STROKE */
- [0x23e, 0x2c66], /* LATIN SMALL LETTER T WITH DIAGONAL STROKE */
- [0x2c67, 0x2c68], /* LATIN CAPITAL LETTER H WITH DESCENDER */
- [0x2c67, 0x2c68], /* LATIN SMALL LETTER H WITH DESCENDER */
- [0x2c69, 0x2c6a], /* LATIN CAPITAL LETTER K WITH DESCENDER */
- [0x2c69, 0x2c6a], /* LATIN SMALL LETTER K WITH DESCENDER */
- [0x2c6b, 0x2c6c], /* LATIN CAPITAL LETTER Z WITH DESCENDER */
- [0x2c6b, 0x2c6c], /* LATIN SMALL LETTER Z WITH DESCENDER */
- [0x2c6d, 0x251], /* LATIN CAPITAL LETTER ALPHA */
- [0x2c6e, 0x271], /* LATIN CAPITAL LETTER M WITH HOOK */
- [0x2c6f, 0x250], /* LATIN CAPITAL LETTER TURNED A */
- [0x2c70, 0x252], /* LATIN CAPITAL LETTER TURNED ALPHA */
- [0x2c71, 0x2c71], /* LATIN SMALL LETTER V WITH RIGHT HOOK */
- [0x2c72, 0x2c73], /* LATIN CAPITAL LETTER W WITH HOOK */
- [0x2c72, 0x2c73], /* LATIN SMALL LETTER W WITH HOOK */
- [0x2c74, 0x2c74], /* LATIN SMALL LETTER V WITH CURL */
- [0x2c75, 0x2c76], /* LATIN CAPITAL LETTER HALF H */
- [0x2c75, 0x2c76], /* LATIN SMALL LETTER HALF H */
- [0x2c77, 0x2c77], /* LATIN SMALL LETTER TAILLESS PHI */
- [0x2c78, 0x2c78], /* LATIN SMALL LETTER E WITH NOTCH */
- [0x2c79, 0x2c79], /* LATIN SMALL LETTER TURNED R WITH TAIL */
- [0x2c7a, 0x2c7a], /* LATIN SMALL LETTER O WITH LOW RING INSIDE */
- [0x2c7b, 0x2c7b], /* LATIN LETTER SMALL CAPITAL TURNED E */
- [0x2c7c, 0x2c7c], /* LATIN SUBSCRIPT SMALL LETTER J */
- [0x2c7d, 0x2c7d], /* MODIFIER LETTER CAPITAL V */
- [0x2c7e, 0x23f], /* LATIN CAPITAL LETTER S WITH SWASH TAIL */
- [0x2c7f, 0x240], /* LATIN CAPITAL LETTER Z WITH SWASH TAIL */
- [0x2c80, 0x2c81], /* COPTIC CAPITAL LETTER ALFA */
- [0x2c80, 0x2c81], /* COPTIC SMALL LETTER ALFA */
- [0x2c82, 0x2c83], /* COPTIC CAPITAL LETTER VIDA */
- [0x2c82, 0x2c83], /* COPTIC SMALL LETTER VIDA */
- [0x2c84, 0x2c85], /* COPTIC CAPITAL LETTER GAMMA */
- [0x2c84, 0x2c85], /* COPTIC SMALL LETTER GAMMA */
- [0x2c86, 0x2c87], /* COPTIC CAPITAL LETTER DALDA */
- [0x2c86, 0x2c87], /* COPTIC SMALL LETTER DALDA */
- [0x2c88, 0x2c89], /* COPTIC CAPITAL LETTER EIE */
- [0x2c88, 0x2c89], /* COPTIC SMALL LETTER EIE */
- [0x2c8a, 0x2c8b], /* COPTIC CAPITAL LETTER SOU */
- [0x2c8a, 0x2c8b], /* COPTIC SMALL LETTER SOU */
- [0x2c8c, 0x2c8d], /* COPTIC CAPITAL LETTER ZATA */
- [0x2c8c, 0x2c8d], /* COPTIC SMALL LETTER ZATA */
- [0x2c8e, 0x2c8f], /* COPTIC CAPITAL LETTER HATE */
- [0x2c8e, 0x2c8f], /* COPTIC SMALL LETTER HATE */
- [0x2c90, 0x2c91], /* COPTIC CAPITAL LETTER THETHE */
- [0x2c90, 0x2c91], /* COPTIC SMALL LETTER THETHE */
- [0x2c92, 0x2c93], /* COPTIC CAPITAL LETTER IAUDA */
- [0x2c92, 0x2c93], /* COPTIC SMALL LETTER IAUDA */
- [0x2c94, 0x2c95], /* COPTIC CAPITAL LETTER KAPA */
- [0x2c94, 0x2c95], /* COPTIC SMALL LETTER KAPA */
- [0x2c96, 0x2c97], /* COPTIC CAPITAL LETTER LAULA */
- [0x2c96, 0x2c97], /* COPTIC SMALL LETTER LAULA */
- [0x2c98, 0x2c99], /* COPTIC CAPITAL LETTER MI */
- [0x2c98, 0x2c99], /* COPTIC SMALL LETTER MI */
- [0x2c9a, 0x2c9b], /* COPTIC CAPITAL LETTER NI */
- [0x2c9a, 0x2c9b], /* COPTIC SMALL LETTER NI */
- [0x2c9c, 0x2c9d], /* COPTIC CAPITAL LETTER KSI */
- [0x2c9c, 0x2c9d], /* COPTIC SMALL LETTER KSI */
- [0x2c9e, 0x2c9f], /* COPTIC CAPITAL LETTER O */
- [0x2c9e, 0x2c9f], /* COPTIC SMALL LETTER O */
- [0x2ca0, 0x2ca1], /* COPTIC CAPITAL LETTER PI */
- [0x2ca0, 0x2ca1], /* COPTIC SMALL LETTER PI */
- [0x2ca2, 0x2ca3], /* COPTIC CAPITAL LETTER RO */
- [0x2ca2, 0x2ca3], /* COPTIC SMALL LETTER RO */
- [0x2ca4, 0x2ca5], /* COPTIC CAPITAL LETTER SIMA */
- [0x2ca4, 0x2ca5], /* COPTIC SMALL LETTER SIMA */
- [0x2ca6, 0x2ca7], /* COPTIC CAPITAL LETTER TAU */
- [0x2ca6, 0x2ca7], /* COPTIC SMALL LETTER TAU */
- [0x2ca8, 0x2ca9], /* COPTIC CAPITAL LETTER UA */
- [0x2ca8, 0x2ca9], /* COPTIC SMALL LETTER UA */
- [0x2caa, 0x2cab], /* COPTIC CAPITAL LETTER FI */
- [0x2caa, 0x2cab], /* COPTIC SMALL LETTER FI */
- [0x2cac, 0x2cad], /* COPTIC CAPITAL LETTER KHI */
- [0x2cac, 0x2cad], /* COPTIC SMALL LETTER KHI */
- [0x2cae, 0x2caf], /* COPTIC CAPITAL LETTER PSI */
- [0x2cae, 0x2caf], /* COPTIC SMALL LETTER PSI */
- [0x2cb0, 0x2cb1], /* COPTIC CAPITAL LETTER OOU */
- [0x2cb0, 0x2cb1], /* COPTIC SMALL LETTER OOU */
- [0x2cb2, 0x2cb3], /* COPTIC CAPITAL LETTER DIALECT-P ALEF */
- [0x2cb2, 0x2cb3], /* COPTIC SMALL LETTER DIALECT-P ALEF */
- [0x2cb4, 0x2cb5], /* COPTIC CAPITAL LETTER OLD COPTIC AIN */
- [0x2cb4, 0x2cb5], /* COPTIC SMALL LETTER OLD COPTIC AIN */
- [0x2cb6, 0x2cb7], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE */
- [0x2cb6, 0x2cb7], /* COPTIC SMALL LETTER CRYPTOGRAMMIC EIE */
- [0x2cb8, 0x2cb9], /* COPTIC CAPITAL LETTER DIALECT-P KAPA */
- [0x2cb8, 0x2cb9], /* COPTIC SMALL LETTER DIALECT-P KAPA */
- [0x2cba, 0x2cbb], /* COPTIC CAPITAL LETTER DIALECT-P NI */
- [0x2cba, 0x2cbb], /* COPTIC SMALL LETTER DIALECT-P NI */
- [0x2cbc, 0x2cbd], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI */
- [0x2cbc, 0x2cbd], /* COPTIC SMALL LETTER CRYPTOGRAMMIC NI */
- [0x2cbe, 0x2cbf], /* COPTIC CAPITAL LETTER OLD COPTIC OOU */
- [0x2cbe, 0x2cbf], /* COPTIC SMALL LETTER OLD COPTIC OOU */
- [0x2cc0, 0x2cc1], /* COPTIC CAPITAL LETTER SAMPI */
- [0x2cc0, 0x2cc1], /* COPTIC SMALL LETTER SAMPI */
- [0x2cc2, 0x2cc3], /* COPTIC CAPITAL LETTER CROSSED SHEI */
- [0x2cc2, 0x2cc3], /* COPTIC SMALL LETTER CROSSED SHEI */
- [0x2cc4, 0x2cc5], /* COPTIC CAPITAL LETTER OLD COPTIC SHEI */
- [0x2cc4, 0x2cc5], /* COPTIC SMALL LETTER OLD COPTIC SHEI */
- [0x2cc6, 0x2cc7], /* COPTIC CAPITAL LETTER OLD COPTIC ESH */
- [0x2cc6, 0x2cc7], /* COPTIC SMALL LETTER OLD COPTIC ESH */
- [0x2cc8, 0x2cc9], /* COPTIC CAPITAL LETTER AKHMIMIC KHEI */
- [0x2cc8, 0x2cc9], /* COPTIC SMALL LETTER AKHMIMIC KHEI */
- [0x2cca, 0x2ccb], /* COPTIC CAPITAL LETTER DIALECT-P HORI */
- [0x2cca, 0x2ccb], /* COPTIC SMALL LETTER DIALECT-P HORI */
- [0x2ccc, 0x2ccd], /* COPTIC CAPITAL LETTER OLD COPTIC HORI */
- [0x2ccc, 0x2ccd], /* COPTIC SMALL LETTER OLD COPTIC HORI */
- [0x2cce, 0x2ccf], /* COPTIC CAPITAL LETTER OLD COPTIC HA */
- [0x2cce, 0x2ccf], /* COPTIC SMALL LETTER OLD COPTIC HA */
- [0x2cd0, 0x2cd1], /* COPTIC CAPITAL LETTER L-SHAPED HA */
- [0x2cd0, 0x2cd1], /* COPTIC SMALL LETTER L-SHAPED HA */
- [0x2cd2, 0x2cd3], /* COPTIC CAPITAL LETTER OLD COPTIC HEI */
- [0x2cd2, 0x2cd3], /* COPTIC SMALL LETTER OLD COPTIC HEI */
- [0x2cd4, 0x2cd5], /* COPTIC CAPITAL LETTER OLD COPTIC HAT */
- [0x2cd4, 0x2cd5], /* COPTIC SMALL LETTER OLD COPTIC HAT */
- [0x2cd6, 0x2cd7], /* COPTIC CAPITAL LETTER OLD COPTIC GANGIA */
- [0x2cd6, 0x2cd7], /* COPTIC SMALL LETTER OLD COPTIC GANGIA */
- [0x2cd8, 0x2cd9], /* COPTIC CAPITAL LETTER OLD COPTIC DJA */
- [0x2cd8, 0x2cd9], /* COPTIC SMALL LETTER OLD COPTIC DJA */
- [0x2cda, 0x2cdb], /* COPTIC CAPITAL LETTER OLD COPTIC SHIMA */
- [0x2cda, 0x2cdb], /* COPTIC SMALL LETTER OLD COPTIC SHIMA */
- [0x2cdc, 0x2cdd], /* COPTIC CAPITAL LETTER OLD NUBIAN SHIMA */
- [0x2cdc, 0x2cdd], /* COPTIC SMALL LETTER OLD NUBIAN SHIMA */
- [0x2cde, 0x2cdf], /* COPTIC CAPITAL LETTER OLD NUBIAN NGI */
- [0x2cde, 0x2cdf], /* COPTIC SMALL LETTER OLD NUBIAN NGI */
- [0x2ce0, 0x2ce1], /* COPTIC CAPITAL LETTER OLD NUBIAN NYI */
- [0x2ce0, 0x2ce1], /* COPTIC SMALL LETTER OLD NUBIAN NYI */
- [0x2ce2, 0x2ce3], /* COPTIC CAPITAL LETTER OLD NUBIAN WAU */
- [0x2ce2, 0x2ce3], /* COPTIC SMALL LETTER OLD NUBIAN WAU */
- [0x2ce4, 0x2ce4], /* COPTIC SYMBOL KAI */
- [0x2ce5, 0x2ce5], /* COPTIC SYMBOL MI RO */
- [0x2ce6, 0x2ce6], /* COPTIC SYMBOL PI RO */
- [0x2ce7, 0x2ce7], /* COPTIC SYMBOL STAUROS */
- [0x2ce8, 0x2ce8], /* COPTIC SYMBOL TAU RO */
- [0x2ce9, 0x2ce9], /* COPTIC SYMBOL KHI RO */
- [0x2cea, 0x2cea], /* COPTIC SYMBOL SHIMA SIMA */
- [0x2ceb, 0x2cec], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI */
- [0x2ceb, 0x2cec], /* COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI */
- [0x2ced, 0x2cee], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA */
- [0x2ced, 0x2cee], /* COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA */
- [0x2cef, 0x2cef], /* COPTIC COMBINING NI ABOVE */
- [0x2cf0, 0x2cf0], /* COPTIC COMBINING SPIRITUS ASPER */
- [0x2cf1, 0x2cf1], /* COPTIC COMBINING SPIRITUS LENIS */
- [0x2cf2, 0x2cf3], /* COPTIC CAPITAL LETTER BOHAIRIC KHEI */
- [0x2cf2, 0x2cf3], /* COPTIC SMALL LETTER BOHAIRIC KHEI */
- [0x2cf4, 0x2cf4],
- [0x2cf5, 0x2cf5],
- [0x2cf6, 0x2cf6],
- [0x2cf7, 0x2cf7],
- [0x2cf8, 0x2cf8],
- [0x2cf9, 0x2cf9], /* COPTIC OLD NUBIAN FULL STOP */
- [0x2cfa, 0x2cfa], /* COPTIC OLD NUBIAN DIRECT QUESTION MARK */
- [0x2cfb, 0x2cfb], /* COPTIC OLD NUBIAN INDIRECT QUESTION MARK */
- [0x2cfc, 0x2cfc], /* COPTIC OLD NUBIAN VERSE DIVIDER */
- [0x2cfd, 0x2cfd], /* COPTIC FRACTION ONE HALF */
- [0x2cfe, 0x2cfe], /* COPTIC FULL STOP */
- [0x2cff, 0x2cff], /* COPTIC MORPHOLOGICAL DIVIDER */
- [0x10a0, 0x2d00], /* GEORGIAN SMALL LETTER AN */
- [0x10a1, 0x2d01], /* GEORGIAN SMALL LETTER BAN */
- [0x10a2, 0x2d02], /* GEORGIAN SMALL LETTER GAN */
- [0x10a3, 0x2d03], /* GEORGIAN SMALL LETTER DON */
- [0x10a4, 0x2d04], /* GEORGIAN SMALL LETTER EN */
- [0x10a5, 0x2d05], /* GEORGIAN SMALL LETTER VIN */
- [0x10a6, 0x2d06], /* GEORGIAN SMALL LETTER ZEN */
- [0x10a7, 0x2d07], /* GEORGIAN SMALL LETTER TAN */
- [0x10a8, 0x2d08], /* GEORGIAN SMALL LETTER IN */
- [0x10a9, 0x2d09], /* GEORGIAN SMALL LETTER KAN */
- [0x10aa, 0x2d0a], /* GEORGIAN SMALL LETTER LAS */
- [0x10ab, 0x2d0b], /* GEORGIAN SMALL LETTER MAN */
- [0x10ac, 0x2d0c], /* GEORGIAN SMALL LETTER NAR */
- [0x10ad, 0x2d0d], /* GEORGIAN SMALL LETTER ON */
- [0x10ae, 0x2d0e], /* GEORGIAN SMALL LETTER PAR */
- [0x10af, 0x2d0f], /* GEORGIAN SMALL LETTER ZHAR */
- [0x10b0, 0x2d10], /* GEORGIAN SMALL LETTER RAE */
- [0x10b1, 0x2d11], /* GEORGIAN SMALL LETTER SAN */
- [0x10b2, 0x2d12], /* GEORGIAN SMALL LETTER TAR */
- [0x10b3, 0x2d13], /* GEORGIAN SMALL LETTER UN */
- [0x10b4, 0x2d14], /* GEORGIAN SMALL LETTER PHAR */
- [0x10b5, 0x2d15], /* GEORGIAN SMALL LETTER KHAR */
- [0x10b6, 0x2d16], /* GEORGIAN SMALL LETTER GHAN */
- [0x10b7, 0x2d17], /* GEORGIAN SMALL LETTER QAR */
- [0x10b8, 0x2d18], /* GEORGIAN SMALL LETTER SHIN */
- [0x10b9, 0x2d19], /* GEORGIAN SMALL LETTER CHIN */
- [0x10ba, 0x2d1a], /* GEORGIAN SMALL LETTER CAN */
- [0x10bb, 0x2d1b], /* GEORGIAN SMALL LETTER JIL */
- [0x10bc, 0x2d1c], /* GEORGIAN SMALL LETTER CIL */
- [0x10bd, 0x2d1d], /* GEORGIAN SMALL LETTER CHAR */
- [0x10be, 0x2d1e], /* GEORGIAN SMALL LETTER XAN */
- [0x10bf, 0x2d1f], /* GEORGIAN SMALL LETTER JHAN */
- [0x10c0, 0x2d20], /* GEORGIAN SMALL LETTER HAE */
- [0x10c1, 0x2d21], /* GEORGIAN SMALL LETTER HE */
- [0x10c2, 0x2d22], /* GEORGIAN SMALL LETTER HIE */
- [0x10c3, 0x2d23], /* GEORGIAN SMALL LETTER WE */
- [0x10c4, 0x2d24], /* GEORGIAN SMALL LETTER HAR */
- [0x10c5, 0x2d25], /* GEORGIAN SMALL LETTER HOE */
- [0x2d26, 0x2d26],
- [0x10c7, 0x2d27], /* GEORGIAN SMALL LETTER YN */
- [0x2d28, 0x2d28],
- [0x2d29, 0x2d29],
- [0x2d2a, 0x2d2a],
- [0x2d2b, 0x2d2b],
- [0x2d2c, 0x2d2c],
- [0x10cd, 0x2d2d], /* GEORGIAN SMALL LETTER AEN */
- [0x2d2e, 0x2d2e],
- [0x2d2f, 0x2d2f],
- [0x2d30, 0x2d30], /* TIFINAGH LETTER YA */
- [0x2d31, 0x2d31], /* TIFINAGH LETTER YAB */
- [0x2d32, 0x2d32], /* TIFINAGH LETTER YABH */
- [0x2d33, 0x2d33], /* TIFINAGH LETTER YAG */
- [0x2d34, 0x2d34], /* TIFINAGH LETTER YAGHH */
- [0x2d35, 0x2d35], /* TIFINAGH LETTER BERBER ACADEMY YAJ */
- [0x2d36, 0x2d36], /* TIFINAGH LETTER YAJ */
- [0x2d37, 0x2d37], /* TIFINAGH LETTER YAD */
- [0x2d38, 0x2d38], /* TIFINAGH LETTER YADH */
- [0x2d39, 0x2d39], /* TIFINAGH LETTER YADD */
- [0x2d3a, 0x2d3a], /* TIFINAGH LETTER YADDH */
- [0x2d3b, 0x2d3b], /* TIFINAGH LETTER YEY */
- [0x2d3c, 0x2d3c], /* TIFINAGH LETTER YAF */
- [0x2d3d, 0x2d3d], /* TIFINAGH LETTER YAK */
- [0x2d3e, 0x2d3e], /* TIFINAGH LETTER TUAREG YAK */
- [0x2d3f, 0x2d3f], /* TIFINAGH LETTER YAKHH */
- [0x2d40, 0x2d40], /* TIFINAGH LETTER YAH */
- [0x2d41, 0x2d41], /* TIFINAGH LETTER BERBER ACADEMY YAH */
- [0x2d42, 0x2d42], /* TIFINAGH LETTER TUAREG YAH */
- [0x2d43, 0x2d43], /* TIFINAGH LETTER YAHH */
- [0x2d44, 0x2d44], /* TIFINAGH LETTER YAA */
- [0x2d45, 0x2d45], /* TIFINAGH LETTER YAKH */
- [0x2d46, 0x2d46], /* TIFINAGH LETTER TUAREG YAKH */
- [0x2d47, 0x2d47], /* TIFINAGH LETTER YAQ */
- [0x2d48, 0x2d48], /* TIFINAGH LETTER TUAREG YAQ */
- [0x2d49, 0x2d49], /* TIFINAGH LETTER YI */
- [0x2d4a, 0x2d4a], /* TIFINAGH LETTER YAZH */
- [0x2d4b, 0x2d4b], /* TIFINAGH LETTER AHAGGAR YAZH */
- [0x2d4c, 0x2d4c], /* TIFINAGH LETTER TUAREG YAZH */
- [0x2d4d, 0x2d4d], /* TIFINAGH LETTER YAL */
- [0x2d4e, 0x2d4e], /* TIFINAGH LETTER YAM */
- [0x2d4f, 0x2d4f], /* TIFINAGH LETTER YAN */
- [0x2d50, 0x2d50], /* TIFINAGH LETTER TUAREG YAGN */
- [0x2d51, 0x2d51], /* TIFINAGH LETTER TUAREG YANG */
- [0x2d52, 0x2d52], /* TIFINAGH LETTER YAP */
- [0x2d53, 0x2d53], /* TIFINAGH LETTER YU */
- [0x2d54, 0x2d54], /* TIFINAGH LETTER YAR */
- [0x2d55, 0x2d55], /* TIFINAGH LETTER YARR */
- [0x2d56, 0x2d56], /* TIFINAGH LETTER YAGH */
- [0x2d57, 0x2d57], /* TIFINAGH LETTER TUAREG YAGH */
- [0x2d58, 0x2d58], /* TIFINAGH LETTER AYER YAGH */
- [0x2d59, 0x2d59], /* TIFINAGH LETTER YAS */
- [0x2d5a, 0x2d5a], /* TIFINAGH LETTER YASS */
- [0x2d5b, 0x2d5b], /* TIFINAGH LETTER YASH */
- [0x2d5c, 0x2d5c], /* TIFINAGH LETTER YAT */
- [0x2d5d, 0x2d5d], /* TIFINAGH LETTER YATH */
- [0x2d5e, 0x2d5e], /* TIFINAGH LETTER YACH */
- [0x2d5f, 0x2d5f], /* TIFINAGH LETTER YATT */
- [0x2d60, 0x2d60], /* TIFINAGH LETTER YAV */
- [0x2d61, 0x2d61], /* TIFINAGH LETTER YAW */
- [0x2d62, 0x2d62], /* TIFINAGH LETTER YAY */
- [0x2d63, 0x2d63], /* TIFINAGH LETTER YAZ */
- [0x2d64, 0x2d64], /* TIFINAGH LETTER TAWELLEMET YAZ */
- [0x2d65, 0x2d65], /* TIFINAGH LETTER YAZZ */
- [0x2d66, 0x2d66], /* TIFINAGH LETTER YE */
- [0x2d67, 0x2d67], /* TIFINAGH LETTER YO */
- [0x2d68, 0x2d68],
- [0x2d69, 0x2d69],
- [0x2d6a, 0x2d6a],
- [0x2d6b, 0x2d6b],
- [0x2d6c, 0x2d6c],
- [0x2d6d, 0x2d6d],
- [0x2d6e, 0x2d6e],
- [0x2d6f, 0x2d6f], /* TIFINAGH MODIFIER LETTER LABIALIZATION MARK */
- [0x2d70, 0x2d70], /* TIFINAGH SEPARATOR MARK */
- [0x2d71, 0x2d71],
- [0x2d72, 0x2d72],
- [0x2d73, 0x2d73],
- [0x2d74, 0x2d74],
- [0x2d75, 0x2d75],
- [0x2d76, 0x2d76],
- [0x2d77, 0x2d77],
- [0x2d78, 0x2d78],
- [0x2d79, 0x2d79],
- [0x2d7a, 0x2d7a],
- [0x2d7b, 0x2d7b],
- [0x2d7c, 0x2d7c],
- [0x2d7d, 0x2d7d],
- [0x2d7e, 0x2d7e],
- [0x2d7f, 0x2d7f], /* TIFINAGH CONSONANT JOINER */
- [0x2d80, 0x2d80], /* ETHIOPIC SYLLABLE LOA */
- [0x2d81, 0x2d81], /* ETHIOPIC SYLLABLE MOA */
- [0x2d82, 0x2d82], /* ETHIOPIC SYLLABLE ROA */
- [0x2d83, 0x2d83], /* ETHIOPIC SYLLABLE SOA */
- [0x2d84, 0x2d84], /* ETHIOPIC SYLLABLE SHOA */
- [0x2d85, 0x2d85], /* ETHIOPIC SYLLABLE BOA */
- [0x2d86, 0x2d86], /* ETHIOPIC SYLLABLE TOA */
- [0x2d87, 0x2d87], /* ETHIOPIC SYLLABLE COA */
- [0x2d88, 0x2d88], /* ETHIOPIC SYLLABLE NOA */
- [0x2d89, 0x2d89], /* ETHIOPIC SYLLABLE NYOA */
- [0x2d8a, 0x2d8a], /* ETHIOPIC SYLLABLE GLOTTAL OA */
- [0x2d8b, 0x2d8b], /* ETHIOPIC SYLLABLE ZOA */
- [0x2d8c, 0x2d8c], /* ETHIOPIC SYLLABLE DOA */
- [0x2d8d, 0x2d8d], /* ETHIOPIC SYLLABLE DDOA */
- [0x2d8e, 0x2d8e], /* ETHIOPIC SYLLABLE JOA */
- [0x2d8f, 0x2d8f], /* ETHIOPIC SYLLABLE THOA */
- [0x2d90, 0x2d90], /* ETHIOPIC SYLLABLE CHOA */
- [0x2d91, 0x2d91], /* ETHIOPIC SYLLABLE PHOA */
- [0x2d92, 0x2d92], /* ETHIOPIC SYLLABLE POA */
- [0x2d93, 0x2d93], /* ETHIOPIC SYLLABLE GGWA */
- [0x2d94, 0x2d94], /* ETHIOPIC SYLLABLE GGWI */
- [0x2d95, 0x2d95], /* ETHIOPIC SYLLABLE GGWEE */
- [0x2d96, 0x2d96], /* ETHIOPIC SYLLABLE GGWE */
- [0x2d97, 0x2d97],
- [0x2d98, 0x2d98],
- [0x2d99, 0x2d99],
- [0x2d9a, 0x2d9a],
- [0x2d9b, 0x2d9b],
- [0x2d9c, 0x2d9c],
- [0x2d9d, 0x2d9d],
- [0x2d9e, 0x2d9e],
- [0x2d9f, 0x2d9f],
- [0x2da0, 0x2da0], /* ETHIOPIC SYLLABLE SSA */
- [0x2da1, 0x2da1], /* ETHIOPIC SYLLABLE SSU */
- [0x2da2, 0x2da2], /* ETHIOPIC SYLLABLE SSI */
- [0x2da3, 0x2da3], /* ETHIOPIC SYLLABLE SSAA */
- [0x2da4, 0x2da4], /* ETHIOPIC SYLLABLE SSEE */
- [0x2da5, 0x2da5], /* ETHIOPIC SYLLABLE SSE */
- [0x2da6, 0x2da6], /* ETHIOPIC SYLLABLE SSO */
- [0x2da7, 0x2da7],
- [0x2da8, 0x2da8], /* ETHIOPIC SYLLABLE CCA */
- [0x2da9, 0x2da9], /* ETHIOPIC SYLLABLE CCU */
- [0x2daa, 0x2daa], /* ETHIOPIC SYLLABLE CCI */
- [0x2dab, 0x2dab], /* ETHIOPIC SYLLABLE CCAA */
- [0x2dac, 0x2dac], /* ETHIOPIC SYLLABLE CCEE */
- [0x2dad, 0x2dad], /* ETHIOPIC SYLLABLE CCE */
- [0x2dae, 0x2dae], /* ETHIOPIC SYLLABLE CCO */
- [0x2daf, 0x2daf],
- [0x2db0, 0x2db0], /* ETHIOPIC SYLLABLE ZZA */
- [0x2db1, 0x2db1], /* ETHIOPIC SYLLABLE ZZU */
- [0x2db2, 0x2db2], /* ETHIOPIC SYLLABLE ZZI */
- [0x2db3, 0x2db3], /* ETHIOPIC SYLLABLE ZZAA */
- [0x2db4, 0x2db4], /* ETHIOPIC SYLLABLE ZZEE */
- [0x2db5, 0x2db5], /* ETHIOPIC SYLLABLE ZZE */
- [0x2db6, 0x2db6], /* ETHIOPIC SYLLABLE ZZO */
- [0x2db7, 0x2db7],
- [0x2db8, 0x2db8], /* ETHIOPIC SYLLABLE CCHA */
- [0x2db9, 0x2db9], /* ETHIOPIC SYLLABLE CCHU */
- [0x2dba, 0x2dba], /* ETHIOPIC SYLLABLE CCHI */
- [0x2dbb, 0x2dbb], /* ETHIOPIC SYLLABLE CCHAA */
- [0x2dbc, 0x2dbc], /* ETHIOPIC SYLLABLE CCHEE */
- [0x2dbd, 0x2dbd], /* ETHIOPIC SYLLABLE CCHE */
- [0x2dbe, 0x2dbe], /* ETHIOPIC SYLLABLE CCHO */
- [0x2dbf, 0x2dbf],
- [0x2dc0, 0x2dc0], /* ETHIOPIC SYLLABLE QYA */
- [0x2dc1, 0x2dc1], /* ETHIOPIC SYLLABLE QYU */
- [0x2dc2, 0x2dc2], /* ETHIOPIC SYLLABLE QYI */
- [0x2dc3, 0x2dc3], /* ETHIOPIC SYLLABLE QYAA */
- [0x2dc4, 0x2dc4], /* ETHIOPIC SYLLABLE QYEE */
- [0x2dc5, 0x2dc5], /* ETHIOPIC SYLLABLE QYE */
- [0x2dc6, 0x2dc6], /* ETHIOPIC SYLLABLE QYO */
- [0x2dc7, 0x2dc7],
- [0x2dc8, 0x2dc8], /* ETHIOPIC SYLLABLE KYA */
- [0x2dc9, 0x2dc9], /* ETHIOPIC SYLLABLE KYU */
- [0x2dca, 0x2dca], /* ETHIOPIC SYLLABLE KYI */
- [0x2dcb, 0x2dcb], /* ETHIOPIC SYLLABLE KYAA */
- [0x2dcc, 0x2dcc], /* ETHIOPIC SYLLABLE KYEE */
- [0x2dcd, 0x2dcd], /* ETHIOPIC SYLLABLE KYE */
- [0x2dce, 0x2dce], /* ETHIOPIC SYLLABLE KYO */
- [0x2dcf, 0x2dcf],
- [0x2dd0, 0x2dd0], /* ETHIOPIC SYLLABLE XYA */
- [0x2dd1, 0x2dd1], /* ETHIOPIC SYLLABLE XYU */
- [0x2dd2, 0x2dd2], /* ETHIOPIC SYLLABLE XYI */
- [0x2dd3, 0x2dd3], /* ETHIOPIC SYLLABLE XYAA */
- [0x2dd4, 0x2dd4], /* ETHIOPIC SYLLABLE XYEE */
- [0x2dd5, 0x2dd5], /* ETHIOPIC SYLLABLE XYE */
- [0x2dd6, 0x2dd6], /* ETHIOPIC SYLLABLE XYO */
- [0x2dd7, 0x2dd7],
- [0x2dd8, 0x2dd8], /* ETHIOPIC SYLLABLE GYA */
- [0x2dd9, 0x2dd9], /* ETHIOPIC SYLLABLE GYU */
- [0x2dda, 0x2dda], /* ETHIOPIC SYLLABLE GYI */
- [0x2ddb, 0x2ddb], /* ETHIOPIC SYLLABLE GYAA */
- [0x2ddc, 0x2ddc], /* ETHIOPIC SYLLABLE GYEE */
- [0x2ddd, 0x2ddd], /* ETHIOPIC SYLLABLE GYE */
- [0x2dde, 0x2dde], /* ETHIOPIC SYLLABLE GYO */
- [0x2ddf, 0x2ddf],
- [0x2de0, 0x2de0], /* COMBINING CYRILLIC LETTER BE */
- [0x2de1, 0x2de1], /* COMBINING CYRILLIC LETTER VE */
- [0x2de2, 0x2de2], /* COMBINING CYRILLIC LETTER GHE */
- [0x2de3, 0x2de3], /* COMBINING CYRILLIC LETTER DE */
- [0x2de4, 0x2de4], /* COMBINING CYRILLIC LETTER ZHE */
- [0x2de5, 0x2de5], /* COMBINING CYRILLIC LETTER ZE */
- [0x2de6, 0x2de6], /* COMBINING CYRILLIC LETTER KA */
- [0x2de7, 0x2de7], /* COMBINING CYRILLIC LETTER EL */
- [0x2de8, 0x2de8], /* COMBINING CYRILLIC LETTER EM */
- [0x2de9, 0x2de9], /* COMBINING CYRILLIC LETTER EN */
- [0x2dea, 0x2dea], /* COMBINING CYRILLIC LETTER O */
- [0x2deb, 0x2deb], /* COMBINING CYRILLIC LETTER PE */
- [0x2dec, 0x2dec], /* COMBINING CYRILLIC LETTER ER */
- [0x2ded, 0x2ded], /* COMBINING CYRILLIC LETTER ES */
- [0x2dee, 0x2dee], /* COMBINING CYRILLIC LETTER TE */
- [0x2def, 0x2def], /* COMBINING CYRILLIC LETTER HA */
- [0x2df0, 0x2df0], /* COMBINING CYRILLIC LETTER TSE */
- [0x2df1, 0x2df1], /* COMBINING CYRILLIC LETTER CHE */
- [0x2df2, 0x2df2], /* COMBINING CYRILLIC LETTER SHA */
- [0x2df3, 0x2df3], /* COMBINING CYRILLIC LETTER SHCHA */
- [0x2df4, 0x2df4], /* COMBINING CYRILLIC LETTER FITA */
- [0x2df5, 0x2df5], /* COMBINING CYRILLIC LETTER ES-TE */
- [0x2df6, 0x2df6], /* COMBINING CYRILLIC LETTER A */
- [0x2df7, 0x2df7], /* COMBINING CYRILLIC LETTER IE */
- [0x2df8, 0x2df8], /* COMBINING CYRILLIC LETTER DJERV */
- [0x2df9, 0x2df9], /* COMBINING CYRILLIC LETTER MONOGRAPH UK */
- [0x2dfa, 0x2dfa], /* COMBINING CYRILLIC LETTER YAT */
- [0x2dfb, 0x2dfb], /* COMBINING CYRILLIC LETTER YU */
- [0x2dfc, 0x2dfc], /* COMBINING CYRILLIC LETTER IOTIFIED A */
- [0x2dfd, 0x2dfd], /* COMBINING CYRILLIC LETTER LITTLE YUS */
- [0x2dfe, 0x2dfe], /* COMBINING CYRILLIC LETTER BIG YUS */
- [0x2dff, 0x2dff], /* COMBINING CYRILLIC LETTER IOTIFIED BIG YUS */
- [0x2e00, 0x2e00], /* RIGHT ANGLE SUBSTITUTION MARKER */
- [0x2e01, 0x2e01], /* RIGHT ANGLE DOTTED SUBSTITUTION MARKER */
- [0x2e02, 0x2e02], /* LEFT SUBSTITUTION BRACKET */
- [0x2e03, 0x2e03], /* RIGHT SUBSTITUTION BRACKET */
- [0x2e04, 0x2e04], /* LEFT DOTTED SUBSTITUTION BRACKET */
- [0x2e05, 0x2e05], /* RIGHT DOTTED SUBSTITUTION BRACKET */
- [0x2e06, 0x2e06], /* RAISED INTERPOLATION MARKER */
- [0x2e07, 0x2e07], /* RAISED DOTTED INTERPOLATION MARKER */
- [0x2e08, 0x2e08], /* DOTTED TRANSPOSITION MARKER */
- [0x2e09, 0x2e09], /* LEFT TRANSPOSITION BRACKET */
- [0x2e0a, 0x2e0a], /* RIGHT TRANSPOSITION BRACKET */
- [0x2e0b, 0x2e0b], /* RAISED SQUARE */
- [0x2e0c, 0x2e0c], /* LEFT RAISED OMISSION BRACKET */
- [0x2e0d, 0x2e0d], /* RIGHT RAISED OMISSION BRACKET */
- [0x2e0e, 0x2e0e], /* EDITORIAL CORONIS */
- [0x2e0f, 0x2e0f], /* PARAGRAPHOS */
- [0x2e10, 0x2e10], /* FORKED PARAGRAPHOS */
- [0x2e11, 0x2e11], /* REVERSED FORKED PARAGRAPHOS */
- [0x2e12, 0x2e12], /* HYPODIASTOLE */
- [0x2e13, 0x2e13], /* DOTTED OBELOS */
- [0x2e14, 0x2e14], /* DOWNWARDS ANCORA */
- [0x2e15, 0x2e15], /* UPWARDS ANCORA */
- [0x2e16, 0x2e16], /* DOTTED RIGHT-POINTING ANGLE */
- [0x2e17, 0x2e17], /* DOUBLE OBLIQUE HYPHEN */
- [0x2e18, 0x2e18], /* INVERTED INTERROBANG */
- [0x2e19, 0x2e19], /* PALM BRANCH */
- [0x2e1a, 0x2e1a], /* HYPHEN WITH DIAERESIS */
- [0x2e1b, 0x2e1b], /* TILDE WITH RING ABOVE */
- [0x2e1c, 0x2e1c], /* LEFT LOW PARAPHRASE BRACKET */
- [0x2e1d, 0x2e1d], /* RIGHT LOW PARAPHRASE BRACKET */
- [0x2e1e, 0x2e1e], /* TILDE WITH DOT ABOVE */
- [0x2e1f, 0x2e1f], /* TILDE WITH DOT BELOW */
- [0x2e20, 0x2e20], /* LEFT VERTICAL BAR WITH QUILL */
- [0x2e21, 0x2e21], /* RIGHT VERTICAL BAR WITH QUILL */
- [0x2e22, 0x2e22], /* TOP LEFT HALF BRACKET */
- [0x2e23, 0x2e23], /* TOP RIGHT HALF BRACKET */
- [0x2e24, 0x2e24], /* BOTTOM LEFT HALF BRACKET */
- [0x2e25, 0x2e25], /* BOTTOM RIGHT HALF BRACKET */
- [0x2e26, 0x2e26], /* LEFT SIDEWAYS U BRACKET */
- [0x2e27, 0x2e27], /* RIGHT SIDEWAYS U BRACKET */
- [0x2e28, 0x2e28], /* LEFT DOUBLE PARENTHESIS */
- [0x2e29, 0x2e29], /* RIGHT DOUBLE PARENTHESIS */
- [0x2e2a, 0x2e2a], /* TWO DOTS OVER ONE DOT PUNCTUATION */
- [0x2e2b, 0x2e2b], /* ONE DOT OVER TWO DOTS PUNCTUATION */
- [0x2e2c, 0x2e2c], /* SQUARED FOUR DOT PUNCTUATION */
- [0x2e2d, 0x2e2d], /* FIVE DOT MARK */
- [0x2e2e, 0x2e2e], /* REVERSED QUESTION MARK */
- [0x2e2f, 0x2e2f], /* VERTICAL TILDE */
- [0x2e30, 0x2e30], /* RING POINT */
- [0x2e31, 0x2e31], /* WORD SEPARATOR MIDDLE DOT */
- [0x2e32, 0x2e32], /* TURNED COMMA */
- [0x2e33, 0x2e33], /* RAISED DOT */
- [0x2e34, 0x2e34], /* RAISED COMMA */
- [0x2e35, 0x2e35], /* TURNED SEMICOLON */
- [0x2e36, 0x2e36], /* DAGGER WITH LEFT GUARD */
- [0x2e37, 0x2e37], /* DAGGER WITH RIGHT GUARD */
- [0x2e38, 0x2e38], /* TURNED DAGGER */
- [0x2e39, 0x2e39], /* TOP HALF SECTION SIGN */
- [0x2e3a, 0x2e3a], /* TWO-EM DASH */
- [0x2e3b, 0x2e3b], /* THREE-EM DASH */
- [0x2e3c, 0x2e3c], /* STENOGRAPHIC FULL STOP */
- [0x2e3d, 0x2e3d], /* VERTICAL SIX DOTS */
- [0x2e3e, 0x2e3e], /* WIGGLY VERTICAL LINE */
- [0x2e3f, 0x2e3f], /* CAPITULUM */
- [0x2e40, 0x2e40], /* DOUBLE HYPHEN */
- [0x2e41, 0x2e41], /* REVERSED COMMA */
- [0x2e42, 0x2e42], /* DOUBLE LOW-REVERSED-9 QUOTATION MARK */
- [0x2e43, 0x2e43], /* DASH WITH LEFT UPTURN */
- [0x2e44, 0x2e44], /* DOUBLE SUSPENSION MARK */
- [0x2e45, 0x2e45], /* INVERTED LOW KAVYKA */
- [0x2e46, 0x2e46], /* INVERTED LOW KAVYKA WITH KAVYKA ABOVE */
- [0x2e47, 0x2e47], /* LOW KAVYKA */
- [0x2e48, 0x2e48], /* LOW KAVYKA WITH DOT */
- [0x2e49, 0x2e49], /* DOUBLE STACKED COMMA */
- [0x2e4a, 0x2e4a], /* DOTTED SOLIDUS */
- [0x2e4b, 0x2e4b], /* TRIPLE DAGGER */
- [0x2e4c, 0x2e4c], /* MEDIEVAL COMMA */
- [0x2e4d, 0x2e4d], /* PARAGRAPHUS MARK */
- [0x2e4e, 0x2e4e], /* PUNCTUS ELEVATUS MARK */
- [0x2e4f, 0x2e4f],
- [0x2e50, 0x2e50],
- [0x2e51, 0x2e51],
- [0x2e52, 0x2e52],
- [0x2e53, 0x2e53],
- [0x2e54, 0x2e54],
- [0x2e55, 0x2e55],
- [0x2e56, 0x2e56],
- [0x2e57, 0x2e57],
- [0x2e58, 0x2e58],
- [0x2e59, 0x2e59],
- [0x2e5a, 0x2e5a],
- [0x2e5b, 0x2e5b],
- [0x2e5c, 0x2e5c],
- [0x2e5d, 0x2e5d],
- [0x2e5e, 0x2e5e],
- [0x2e5f, 0x2e5f],
- [0x2e60, 0x2e60],
- [0x2e61, 0x2e61],
- [0x2e62, 0x2e62],
- [0x2e63, 0x2e63],
- [0x2e64, 0x2e64],
- [0x2e65, 0x2e65],
- [0x2e66, 0x2e66],
- [0x2e67, 0x2e67],
- [0x2e68, 0x2e68],
- [0x2e69, 0x2e69],
- [0x2e6a, 0x2e6a],
- [0x2e6b, 0x2e6b],
- [0x2e6c, 0x2e6c],
- [0x2e6d, 0x2e6d],
- [0x2e6e, 0x2e6e],
- [0x2e6f, 0x2e6f],
- [0x2e70, 0x2e70],
- [0x2e71, 0x2e71],
- [0x2e72, 0x2e72],
- [0x2e73, 0x2e73],
- [0x2e74, 0x2e74],
- [0x2e75, 0x2e75],
- [0x2e76, 0x2e76],
- [0x2e77, 0x2e77],
- [0x2e78, 0x2e78],
- [0x2e79, 0x2e79],
- [0x2e7a, 0x2e7a],
- [0x2e7b, 0x2e7b],
- [0x2e7c, 0x2e7c],
- [0x2e7d, 0x2e7d],
- [0x2e7e, 0x2e7e],
- [0x2e7f, 0x2e7f],
- [0x2e80, 0x2e80], /* CJK RADICAL REPEAT */
- [0x2e81, 0x2e81], /* CJK RADICAL CLIFF */
- [0x2e82, 0x2e82], /* CJK RADICAL SECOND ONE */
- [0x2e83, 0x2e83], /* CJK RADICAL SECOND TWO */
- [0x2e84, 0x2e84], /* CJK RADICAL SECOND THREE */
- [0x2e85, 0x2e85], /* CJK RADICAL PERSON */
- [0x2e86, 0x2e86], /* CJK RADICAL BOX */
- [0x2e87, 0x2e87], /* CJK RADICAL TABLE */
- [0x2e88, 0x2e88], /* CJK RADICAL KNIFE ONE */
- [0x2e89, 0x2e89], /* CJK RADICAL KNIFE TWO */
- [0x2e8a, 0x2e8a], /* CJK RADICAL DIVINATION */
- [0x2e8b, 0x2e8b], /* CJK RADICAL SEAL */
- [0x2e8c, 0x2e8c], /* CJK RADICAL SMALL ONE */
- [0x2e8d, 0x2e8d], /* CJK RADICAL SMALL TWO */
- [0x2e8e, 0x2e8e], /* CJK RADICAL LAME ONE */
- [0x2e8f, 0x2e8f], /* CJK RADICAL LAME TWO */
- [0x2e90, 0x2e90], /* CJK RADICAL LAME THREE */
- [0x2e91, 0x2e91], /* CJK RADICAL LAME FOUR */
- [0x2e92, 0x2e92], /* CJK RADICAL SNAKE */
- [0x2e93, 0x2e93], /* CJK RADICAL THREAD */
- [0x2e94, 0x2e94], /* CJK RADICAL SNOUT ONE */
- [0x2e95, 0x2e95], /* CJK RADICAL SNOUT TWO */
- [0x2e96, 0x2e96], /* CJK RADICAL HEART ONE */
- [0x2e97, 0x2e97], /* CJK RADICAL HEART TWO */
- [0x2e98, 0x2e98], /* CJK RADICAL HAND */
- [0x2e99, 0x2e99], /* CJK RADICAL RAP */
- [0x2e9a, 0x2e9a],
- [0x2e9b, 0x2e9b], /* CJK RADICAL CHOKE */
- [0x2e9c, 0x2e9c], /* CJK RADICAL SUN */
- [0x2e9d, 0x2e9d], /* CJK RADICAL MOON */
- [0x2e9e, 0x2e9e], /* CJK RADICAL DEATH */
- [0x2e9f, 0x2e9f], /* CJK RADICAL MOTHER */
- [0x2ea0, 0x2ea0], /* CJK RADICAL CIVILIAN */
- [0x2ea1, 0x2ea1], /* CJK RADICAL WATER ONE */
- [0x2ea2, 0x2ea2], /* CJK RADICAL WATER TWO */
- [0x2ea3, 0x2ea3], /* CJK RADICAL FIRE */
- [0x2ea4, 0x2ea4], /* CJK RADICAL PAW ONE */
- [0x2ea5, 0x2ea5], /* CJK RADICAL PAW TWO */
- [0x2ea6, 0x2ea6], /* CJK RADICAL SIMPLIFIED HALF TREE TRUNK */
- [0x2ea7, 0x2ea7], /* CJK RADICAL COW */
- [0x2ea8, 0x2ea8], /* CJK RADICAL DOG */
- [0x2ea9, 0x2ea9], /* CJK RADICAL JADE */
- [0x2eaa, 0x2eaa], /* CJK RADICAL BOLT OF CLOTH */
- [0x2eab, 0x2eab], /* CJK RADICAL EYE */
- [0x2eac, 0x2eac], /* CJK RADICAL SPIRIT ONE */
- [0x2ead, 0x2ead], /* CJK RADICAL SPIRIT TWO */
- [0x2eae, 0x2eae], /* CJK RADICAL BAMBOO */
- [0x2eaf, 0x2eaf], /* CJK RADICAL SILK */
- [0x2eb0, 0x2eb0], /* CJK RADICAL C-SIMPLIFIED SILK */
- [0x2eb1, 0x2eb1], /* CJK RADICAL NET ONE */
- [0x2eb2, 0x2eb2], /* CJK RADICAL NET TWO */
- [0x2eb3, 0x2eb3], /* CJK RADICAL NET THREE */
- [0x2eb4, 0x2eb4], /* CJK RADICAL NET FOUR */
- [0x2eb5, 0x2eb5], /* CJK RADICAL MESH */
- [0x2eb6, 0x2eb6], /* CJK RADICAL SHEEP */
- [0x2eb7, 0x2eb7], /* CJK RADICAL RAM */
- [0x2eb8, 0x2eb8], /* CJK RADICAL EWE */
- [0x2eb9, 0x2eb9], /* CJK RADICAL OLD */
- [0x2eba, 0x2eba], /* CJK RADICAL BRUSH ONE */
- [0x2ebb, 0x2ebb], /* CJK RADICAL BRUSH TWO */
- [0x2ebc, 0x2ebc], /* CJK RADICAL MEAT */
- [0x2ebd, 0x2ebd], /* CJK RADICAL MORTAR */
- [0x2ebe, 0x2ebe], /* CJK RADICAL GRASS ONE */
- [0x2ebf, 0x2ebf], /* CJK RADICAL GRASS TWO */
- [0x2ec0, 0x2ec0], /* CJK RADICAL GRASS THREE */
- [0x2ec1, 0x2ec1], /* CJK RADICAL TIGER */
- [0x2ec2, 0x2ec2], /* CJK RADICAL CLOTHES */
- [0x2ec3, 0x2ec3], /* CJK RADICAL WEST ONE */
- [0x2ec4, 0x2ec4], /* CJK RADICAL WEST TWO */
- [0x2ec5, 0x2ec5], /* CJK RADICAL C-SIMPLIFIED SEE */
- [0x2ec6, 0x2ec6], /* CJK RADICAL SIMPLIFIED HORN */
- [0x2ec7, 0x2ec7], /* CJK RADICAL HORN */
- [0x2ec8, 0x2ec8], /* CJK RADICAL C-SIMPLIFIED SPEECH */
- [0x2ec9, 0x2ec9], /* CJK RADICAL C-SIMPLIFIED SHELL */
- [0x2eca, 0x2eca], /* CJK RADICAL FOOT */
- [0x2ecb, 0x2ecb], /* CJK RADICAL C-SIMPLIFIED CART */
- [0x2ecc, 0x2ecc], /* CJK RADICAL SIMPLIFIED WALK */
- [0x2ecd, 0x2ecd], /* CJK RADICAL WALK ONE */
- [0x2ece, 0x2ece], /* CJK RADICAL WALK TWO */
- [0x2ecf, 0x2ecf], /* CJK RADICAL CITY */
- [0x2ed0, 0x2ed0], /* CJK RADICAL C-SIMPLIFIED GOLD */
- [0x2ed1, 0x2ed1], /* CJK RADICAL LONG ONE */
- [0x2ed2, 0x2ed2], /* CJK RADICAL LONG TWO */
- [0x2ed3, 0x2ed3], /* CJK RADICAL C-SIMPLIFIED LONG */
- [0x2ed4, 0x2ed4], /* CJK RADICAL C-SIMPLIFIED GATE */
- [0x2ed5, 0x2ed5], /* CJK RADICAL MOUND ONE */
- [0x2ed6, 0x2ed6], /* CJK RADICAL MOUND TWO */
- [0x2ed7, 0x2ed7], /* CJK RADICAL RAIN */
- [0x2ed8, 0x2ed8], /* CJK RADICAL BLUE */
- [0x2ed9, 0x2ed9], /* CJK RADICAL C-SIMPLIFIED TANNED LEATHER */
- [0x2eda, 0x2eda], /* CJK RADICAL C-SIMPLIFIED LEAF */
- [0x2edb, 0x2edb], /* CJK RADICAL C-SIMPLIFIED WIND */
- [0x2edc, 0x2edc], /* CJK RADICAL C-SIMPLIFIED FLY */
- [0x2edd, 0x2edd], /* CJK RADICAL EAT ONE */
- [0x2ede, 0x2ede], /* CJK RADICAL EAT TWO */
- [0x2edf, 0x2edf], /* CJK RADICAL EAT THREE */
- [0x2ee0, 0x2ee0], /* CJK RADICAL C-SIMPLIFIED EAT */
- [0x2ee1, 0x2ee1], /* CJK RADICAL HEAD */
- [0x2ee2, 0x2ee2], /* CJK RADICAL C-SIMPLIFIED HORSE */
- [0x2ee3, 0x2ee3], /* CJK RADICAL BONE */
- [0x2ee4, 0x2ee4], /* CJK RADICAL GHOST */
- [0x2ee5, 0x2ee5], /* CJK RADICAL C-SIMPLIFIED FISH */
- [0x2ee6, 0x2ee6], /* CJK RADICAL C-SIMPLIFIED BIRD */
- [0x2ee7, 0x2ee7], /* CJK RADICAL C-SIMPLIFIED SALT */
- [0x2ee8, 0x2ee8], /* CJK RADICAL SIMPLIFIED WHEAT */
- [0x2ee9, 0x2ee9], /* CJK RADICAL SIMPLIFIED YELLOW */
- [0x2eea, 0x2eea], /* CJK RADICAL C-SIMPLIFIED FROG */
- [0x2eeb, 0x2eeb], /* CJK RADICAL J-SIMPLIFIED EVEN */
- [0x2eec, 0x2eec], /* CJK RADICAL C-SIMPLIFIED EVEN */
- [0x2eed, 0x2eed], /* CJK RADICAL J-SIMPLIFIED TOOTH */
- [0x2eee, 0x2eee], /* CJK RADICAL C-SIMPLIFIED TOOTH */
- [0x2eef, 0x2eef], /* CJK RADICAL J-SIMPLIFIED DRAGON */
- [0x2ef0, 0x2ef0], /* CJK RADICAL C-SIMPLIFIED DRAGON */
- [0x2ef1, 0x2ef1], /* CJK RADICAL TURTLE */
- [0x2ef2, 0x2ef2], /* CJK RADICAL J-SIMPLIFIED TURTLE */
- [0x2ef3, 0x2ef3], /* CJK RADICAL C-SIMPLIFIED TURTLE */
- [0x2ef4, 0x2ef4],
- [0x2ef5, 0x2ef5],
- [0x2ef6, 0x2ef6],
- [0x2ef7, 0x2ef7],
- [0x2ef8, 0x2ef8],
- [0x2ef9, 0x2ef9],
- [0x2efa, 0x2efa],
- [0x2efb, 0x2efb],
- [0x2efc, 0x2efc],
- [0x2efd, 0x2efd],
- [0x2efe, 0x2efe],
- [0x2eff, 0x2eff],
- [0x2f00, 0x2f00], /* KANGXI RADICAL ONE */
- [0x2f01, 0x2f01], /* KANGXI RADICAL LINE */
- [0x2f02, 0x2f02], /* KANGXI RADICAL DOT */
- [0x2f03, 0x2f03], /* KANGXI RADICAL SLASH */
- [0x2f04, 0x2f04], /* KANGXI RADICAL SECOND */
- [0x2f05, 0x2f05], /* KANGXI RADICAL HOOK */
- [0x2f06, 0x2f06], /* KANGXI RADICAL TWO */
- [0x2f07, 0x2f07], /* KANGXI RADICAL LID */
- [0x2f08, 0x2f08], /* KANGXI RADICAL MAN */
- [0x2f09, 0x2f09], /* KANGXI RADICAL LEGS */
- [0x2f0a, 0x2f0a], /* KANGXI RADICAL ENTER */
- [0x2f0b, 0x2f0b], /* KANGXI RADICAL EIGHT */
- [0x2f0c, 0x2f0c], /* KANGXI RADICAL DOWN BOX */
- [0x2f0d, 0x2f0d], /* KANGXI RADICAL COVER */
- [0x2f0e, 0x2f0e], /* KANGXI RADICAL ICE */
- [0x2f0f, 0x2f0f], /* KANGXI RADICAL TABLE */
- [0x2f10, 0x2f10], /* KANGXI RADICAL OPEN BOX */
- [0x2f11, 0x2f11], /* KANGXI RADICAL KNIFE */
- [0x2f12, 0x2f12], /* KANGXI RADICAL POWER */
- [0x2f13, 0x2f13], /* KANGXI RADICAL WRAP */
- [0x2f14, 0x2f14], /* KANGXI RADICAL SPOON */
- [0x2f15, 0x2f15], /* KANGXI RADICAL RIGHT OPEN BOX */
- [0x2f16, 0x2f16], /* KANGXI RADICAL HIDING ENCLOSURE */
- [0x2f17, 0x2f17], /* KANGXI RADICAL TEN */
- [0x2f18, 0x2f18], /* KANGXI RADICAL DIVINATION */
- [0x2f19, 0x2f19], /* KANGXI RADICAL SEAL */
- [0x2f1a, 0x2f1a], /* KANGXI RADICAL CLIFF */
- [0x2f1b, 0x2f1b], /* KANGXI RADICAL PRIVATE */
- [0x2f1c, 0x2f1c], /* KANGXI RADICAL AGAIN */
- [0x2f1d, 0x2f1d], /* KANGXI RADICAL MOUTH */
- [0x2f1e, 0x2f1e], /* KANGXI RADICAL ENCLOSURE */
- [0x2f1f, 0x2f1f], /* KANGXI RADICAL EARTH */
- [0x2f20, 0x2f20], /* KANGXI RADICAL SCHOLAR */
- [0x2f21, 0x2f21], /* KANGXI RADICAL GO */
- [0x2f22, 0x2f22], /* KANGXI RADICAL GO SLOWLY */
- [0x2f23, 0x2f23], /* KANGXI RADICAL EVENING */
- [0x2f24, 0x2f24], /* KANGXI RADICAL BIG */
- [0x2f25, 0x2f25], /* KANGXI RADICAL WOMAN */
- [0x2f26, 0x2f26], /* KANGXI RADICAL CHILD */
- [0x2f27, 0x2f27], /* KANGXI RADICAL ROOF */
- [0x2f28, 0x2f28], /* KANGXI RADICAL INCH */
- [0x2f29, 0x2f29], /* KANGXI RADICAL SMALL */
- [0x2f2a, 0x2f2a], /* KANGXI RADICAL LAME */
- [0x2f2b, 0x2f2b], /* KANGXI RADICAL CORPSE */
- [0x2f2c, 0x2f2c], /* KANGXI RADICAL SPROUT */
- [0x2f2d, 0x2f2d], /* KANGXI RADICAL MOUNTAIN */
- [0x2f2e, 0x2f2e], /* KANGXI RADICAL RIVER */
- [0x2f2f, 0x2f2f], /* KANGXI RADICAL WORK */
- [0x2f30, 0x2f30], /* KANGXI RADICAL ONESELF */
- [0x2f31, 0x2f31], /* KANGXI RADICAL TURBAN */
- [0x2f32, 0x2f32], /* KANGXI RADICAL DRY */
- [0x2f33, 0x2f33], /* KANGXI RADICAL SHORT THREAD */
- [0x2f34, 0x2f34], /* KANGXI RADICAL DOTTED CLIFF */
- [0x2f35, 0x2f35], /* KANGXI RADICAL LONG STRIDE */
- [0x2f36, 0x2f36], /* KANGXI RADICAL TWO HANDS */
- [0x2f37, 0x2f37], /* KANGXI RADICAL SHOOT */
- [0x2f38, 0x2f38], /* KANGXI RADICAL BOW */
- [0x2f39, 0x2f39], /* KANGXI RADICAL SNOUT */
- [0x2f3a, 0x2f3a], /* KANGXI RADICAL BRISTLE */
- [0x2f3b, 0x2f3b], /* KANGXI RADICAL STEP */
- [0x2f3c, 0x2f3c], /* KANGXI RADICAL HEART */
- [0x2f3d, 0x2f3d], /* KANGXI RADICAL HALBERD */
- [0x2f3e, 0x2f3e], /* KANGXI RADICAL DOOR */
- [0x2f3f, 0x2f3f], /* KANGXI RADICAL HAND */
- [0x2f40, 0x2f40], /* KANGXI RADICAL BRANCH */
- [0x2f41, 0x2f41], /* KANGXI RADICAL RAP */
- [0x2f42, 0x2f42], /* KANGXI RADICAL SCRIPT */
- [0x2f43, 0x2f43], /* KANGXI RADICAL DIPPER */
- [0x2f44, 0x2f44], /* KANGXI RADICAL AXE */
- [0x2f45, 0x2f45], /* KANGXI RADICAL SQUARE */
- [0x2f46, 0x2f46], /* KANGXI RADICAL NOT */
- [0x2f47, 0x2f47], /* KANGXI RADICAL SUN */
- [0x2f48, 0x2f48], /* KANGXI RADICAL SAY */
- [0x2f49, 0x2f49], /* KANGXI RADICAL MOON */
- [0x2f4a, 0x2f4a], /* KANGXI RADICAL TREE */
- [0x2f4b, 0x2f4b], /* KANGXI RADICAL LACK */
- [0x2f4c, 0x2f4c], /* KANGXI RADICAL STOP */
- [0x2f4d, 0x2f4d], /* KANGXI RADICAL DEATH */
- [0x2f4e, 0x2f4e], /* KANGXI RADICAL WEAPON */
- [0x2f4f, 0x2f4f], /* KANGXI RADICAL DO NOT */
- [0x2f50, 0x2f50], /* KANGXI RADICAL COMPARE */
- [0x2f51, 0x2f51], /* KANGXI RADICAL FUR */
- [0x2f52, 0x2f52], /* KANGXI RADICAL CLAN */
- [0x2f53, 0x2f53], /* KANGXI RADICAL STEAM */
- [0x2f54, 0x2f54], /* KANGXI RADICAL WATER */
- [0x2f55, 0x2f55], /* KANGXI RADICAL FIRE */
- [0x2f56, 0x2f56], /* KANGXI RADICAL CLAW */
- [0x2f57, 0x2f57], /* KANGXI RADICAL FATHER */
- [0x2f58, 0x2f58], /* KANGXI RADICAL DOUBLE X */
- [0x2f59, 0x2f59], /* KANGXI RADICAL HALF TREE TRUNK */
- [0x2f5a, 0x2f5a], /* KANGXI RADICAL SLICE */
- [0x2f5b, 0x2f5b], /* KANGXI RADICAL FANG */
- [0x2f5c, 0x2f5c], /* KANGXI RADICAL COW */
- [0x2f5d, 0x2f5d], /* KANGXI RADICAL DOG */
- [0x2f5e, 0x2f5e], /* KANGXI RADICAL PROFOUND */
- [0x2f5f, 0x2f5f], /* KANGXI RADICAL JADE */
- [0x2f60, 0x2f60], /* KANGXI RADICAL MELON */
- [0x2f61, 0x2f61], /* KANGXI RADICAL TILE */
- [0x2f62, 0x2f62], /* KANGXI RADICAL SWEET */
- [0x2f63, 0x2f63], /* KANGXI RADICAL LIFE */
- [0x2f64, 0x2f64], /* KANGXI RADICAL USE */
- [0x2f65, 0x2f65], /* KANGXI RADICAL FIELD */
- [0x2f66, 0x2f66], /* KANGXI RADICAL BOLT OF CLOTH */
- [0x2f67, 0x2f67], /* KANGXI RADICAL SICKNESS */
- [0x2f68, 0x2f68], /* KANGXI RADICAL DOTTED TENT */
- [0x2f69, 0x2f69], /* KANGXI RADICAL WHITE */
- [0x2f6a, 0x2f6a], /* KANGXI RADICAL SKIN */
- [0x2f6b, 0x2f6b], /* KANGXI RADICAL DISH */
- [0x2f6c, 0x2f6c], /* KANGXI RADICAL EYE */
- [0x2f6d, 0x2f6d], /* KANGXI RADICAL SPEAR */
- [0x2f6e, 0x2f6e], /* KANGXI RADICAL ARROW */
- [0x2f6f, 0x2f6f], /* KANGXI RADICAL STONE */
- [0x2f70, 0x2f70], /* KANGXI RADICAL SPIRIT */
- [0x2f71, 0x2f71], /* KANGXI RADICAL TRACK */
- [0x2f72, 0x2f72], /* KANGXI RADICAL GRAIN */
- [0x2f73, 0x2f73], /* KANGXI RADICAL CAVE */
- [0x2f74, 0x2f74], /* KANGXI RADICAL STAND */
- [0x2f75, 0x2f75], /* KANGXI RADICAL BAMBOO */
- [0x2f76, 0x2f76], /* KANGXI RADICAL RICE */
- [0x2f77, 0x2f77], /* KANGXI RADICAL SILK */
- [0x2f78, 0x2f78], /* KANGXI RADICAL JAR */
- [0x2f79, 0x2f79], /* KANGXI RADICAL NET */
- [0x2f7a, 0x2f7a], /* KANGXI RADICAL SHEEP */
- [0x2f7b, 0x2f7b], /* KANGXI RADICAL FEATHER */
- [0x2f7c, 0x2f7c], /* KANGXI RADICAL OLD */
- [0x2f7d, 0x2f7d], /* KANGXI RADICAL AND */
- [0x2f7e, 0x2f7e], /* KANGXI RADICAL PLOW */
- [0x2f7f, 0x2f7f], /* KANGXI RADICAL EAR */
- [0x2f80, 0x2f80], /* KANGXI RADICAL BRUSH */
- [0x2f81, 0x2f81], /* KANGXI RADICAL MEAT */
- [0x2f82, 0x2f82], /* KANGXI RADICAL MINISTER */
- [0x2f83, 0x2f83], /* KANGXI RADICAL SELF */
- [0x2f84, 0x2f84], /* KANGXI RADICAL ARRIVE */
- [0x2f85, 0x2f85], /* KANGXI RADICAL MORTAR */
- [0x2f86, 0x2f86], /* KANGXI RADICAL TONGUE */
- [0x2f87, 0x2f87], /* KANGXI RADICAL OPPOSE */
- [0x2f88, 0x2f88], /* KANGXI RADICAL BOAT */
- [0x2f89, 0x2f89], /* KANGXI RADICAL STOPPING */
- [0x2f8a, 0x2f8a], /* KANGXI RADICAL COLOR */
- [0x2f8b, 0x2f8b], /* KANGXI RADICAL GRASS */
- [0x2f8c, 0x2f8c], /* KANGXI RADICAL TIGER */
- [0x2f8d, 0x2f8d], /* KANGXI RADICAL INSECT */
- [0x2f8e, 0x2f8e], /* KANGXI RADICAL BLOOD */
- [0x2f8f, 0x2f8f], /* KANGXI RADICAL WALK ENCLOSURE */
- [0x2f90, 0x2f90], /* KANGXI RADICAL CLOTHES */
- [0x2f91, 0x2f91], /* KANGXI RADICAL WEST */
- [0x2f92, 0x2f92], /* KANGXI RADICAL SEE */
- [0x2f93, 0x2f93], /* KANGXI RADICAL HORN */
- [0x2f94, 0x2f94], /* KANGXI RADICAL SPEECH */
- [0x2f95, 0x2f95], /* KANGXI RADICAL VALLEY */
- [0x2f96, 0x2f96], /* KANGXI RADICAL BEAN */
- [0x2f97, 0x2f97], /* KANGXI RADICAL PIG */
- [0x2f98, 0x2f98], /* KANGXI RADICAL BADGER */
- [0x2f99, 0x2f99], /* KANGXI RADICAL SHELL */
- [0x2f9a, 0x2f9a], /* KANGXI RADICAL RED */
- [0x2f9b, 0x2f9b], /* KANGXI RADICAL RUN */
- [0x2f9c, 0x2f9c], /* KANGXI RADICAL FOOT */
- [0x2f9d, 0x2f9d], /* KANGXI RADICAL BODY */
- [0x2f9e, 0x2f9e], /* KANGXI RADICAL CART */
- [0x2f9f, 0x2f9f], /* KANGXI RADICAL BITTER */
- [0x2fa0, 0x2fa0], /* KANGXI RADICAL MORNING */
- [0x2fa1, 0x2fa1], /* KANGXI RADICAL WALK */
- [0x2fa2, 0x2fa2], /* KANGXI RADICAL CITY */
- [0x2fa3, 0x2fa3], /* KANGXI RADICAL WINE */
- [0x2fa4, 0x2fa4], /* KANGXI RADICAL DISTINGUISH */
- [0x2fa5, 0x2fa5], /* KANGXI RADICAL VILLAGE */
- [0x2fa6, 0x2fa6], /* KANGXI RADICAL GOLD */
- [0x2fa7, 0x2fa7], /* KANGXI RADICAL LONG */
- [0x2fa8, 0x2fa8], /* KANGXI RADICAL GATE */
- [0x2fa9, 0x2fa9], /* KANGXI RADICAL MOUND */
- [0x2faa, 0x2faa], /* KANGXI RADICAL SLAVE */
- [0x2fab, 0x2fab], /* KANGXI RADICAL SHORT TAILED BIRD */
- [0x2fac, 0x2fac], /* KANGXI RADICAL RAIN */
- [0x2fad, 0x2fad], /* KANGXI RADICAL BLUE */
- [0x2fae, 0x2fae], /* KANGXI RADICAL WRONG */
- [0x2faf, 0x2faf], /* KANGXI RADICAL FACE */
- [0x2fb0, 0x2fb0], /* KANGXI RADICAL LEATHER */
- [0x2fb1, 0x2fb1], /* KANGXI RADICAL TANNED LEATHER */
- [0x2fb2, 0x2fb2], /* KANGXI RADICAL LEEK */
- [0x2fb3, 0x2fb3], /* KANGXI RADICAL SOUND */
- [0x2fb4, 0x2fb4], /* KANGXI RADICAL LEAF */
- [0x2fb5, 0x2fb5], /* KANGXI RADICAL WIND */
- [0x2fb6, 0x2fb6], /* KANGXI RADICAL FLY */
- [0x2fb7, 0x2fb7], /* KANGXI RADICAL EAT */
- [0x2fb8, 0x2fb8], /* KANGXI RADICAL HEAD */
- [0x2fb9, 0x2fb9], /* KANGXI RADICAL FRAGRANT */
- [0x2fba, 0x2fba], /* KANGXI RADICAL HORSE */
- [0x2fbb, 0x2fbb], /* KANGXI RADICAL BONE */
- [0x2fbc, 0x2fbc], /* KANGXI RADICAL TALL */
- [0x2fbd, 0x2fbd], /* KANGXI RADICAL HAIR */
- [0x2fbe, 0x2fbe], /* KANGXI RADICAL FIGHT */
- [0x2fbf, 0x2fbf], /* KANGXI RADICAL SACRIFICIAL WINE */
- [0x2fc0, 0x2fc0], /* KANGXI RADICAL CAULDRON */
- [0x2fc1, 0x2fc1], /* KANGXI RADICAL GHOST */
- [0x2fc2, 0x2fc2], /* KANGXI RADICAL FISH */
- [0x2fc3, 0x2fc3], /* KANGXI RADICAL BIRD */
- [0x2fc4, 0x2fc4], /* KANGXI RADICAL SALT */
- [0x2fc5, 0x2fc5], /* KANGXI RADICAL DEER */
- [0x2fc6, 0x2fc6], /* KANGXI RADICAL WHEAT */
- [0x2fc7, 0x2fc7], /* KANGXI RADICAL HEMP */
- [0x2fc8, 0x2fc8], /* KANGXI RADICAL YELLOW */
- [0x2fc9, 0x2fc9], /* KANGXI RADICAL MILLET */
- [0x2fca, 0x2fca], /* KANGXI RADICAL BLACK */
- [0x2fcb, 0x2fcb], /* KANGXI RADICAL EMBROIDERY */
- [0x2fcc, 0x2fcc], /* KANGXI RADICAL FROG */
- [0x2fcd, 0x2fcd], /* KANGXI RADICAL TRIPOD */
- [0x2fce, 0x2fce], /* KANGXI RADICAL DRUM */
- [0x2fcf, 0x2fcf], /* KANGXI RADICAL RAT */
- [0x2fd0, 0x2fd0], /* KANGXI RADICAL NOSE */
- [0x2fd1, 0x2fd1], /* KANGXI RADICAL EVEN */
- [0x2fd2, 0x2fd2], /* KANGXI RADICAL TOOTH */
- [0x2fd3, 0x2fd3], /* KANGXI RADICAL DRAGON */
- [0x2fd4, 0x2fd4], /* KANGXI RADICAL TURTLE */
- [0x2fd5, 0x2fd5], /* KANGXI RADICAL FLUTE */
- [0x2fd6, 0x2fd6],
- [0x2fd7, 0x2fd7],
- [0x2fd8, 0x2fd8],
- [0x2fd9, 0x2fd9],
- [0x2fda, 0x2fda],
- [0x2fdb, 0x2fdb],
- [0x2fdc, 0x2fdc],
- [0x2fdd, 0x2fdd],
- [0x2fde, 0x2fde],
- [0x2fdf, 0x2fdf],
- [0x2fe0, 0x2fe0],
- [0x2fe1, 0x2fe1],
- [0x2fe2, 0x2fe2],
- [0x2fe3, 0x2fe3],
- [0x2fe4, 0x2fe4],
- [0x2fe5, 0x2fe5],
- [0x2fe6, 0x2fe6],
- [0x2fe7, 0x2fe7],
- [0x2fe8, 0x2fe8],
- [0x2fe9, 0x2fe9],
- [0x2fea, 0x2fea],
- [0x2feb, 0x2feb],
- [0x2fec, 0x2fec],
- [0x2fed, 0x2fed],
- [0x2fee, 0x2fee],
- [0x2fef, 0x2fef],
- [0x2ff0, 0x2ff0], /* IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT */
- [0x2ff1, 0x2ff1], /* IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW */
- [0x2ff2, 0x2ff2], /* IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT */
- [0x2ff3, 0x2ff3], /* IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW */
- [0x2ff4, 0x2ff4], /* IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND */
- [0x2ff5, 0x2ff5], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE */
- [0x2ff6, 0x2ff6], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW */
- [0x2ff7, 0x2ff7], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT */
- [0x2ff8, 0x2ff8], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT */
- [0x2ff9, 0x2ff9], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT */
- [0x2ffa, 0x2ffa], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT */
- [0x2ffb, 0x2ffb], /* IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID */
- [0x2ffc, 0x2ffc],
- [0x2ffd, 0x2ffd],
- [0x2ffe, 0x2ffe],
- [0x2fff, 0x2fff],
- [0x3000, 0x3000], /* IDEOGRAPHIC SPACE */
- [0x3001, 0x3001], /* IDEOGRAPHIC COMMA */
- [0x3002, 0x3002], /* IDEOGRAPHIC FULL STOP (IDEOGRAPHIC PERIOD) */
- [0x3003, 0x3003], /* DITTO MARK */
- [0x3004, 0x3004], /* JAPANESE INDUSTRIAL STANDARD SYMBOL */
- [0x3005, 0x3005], /* IDEOGRAPHIC ITERATION MARK */
- [0x3006, 0x3006], /* IDEOGRAPHIC CLOSING MARK */
- [0x3007, 0x3007], /* IDEOGRAPHIC NUMBER ZERO */
- [0x3008, 0x3008], /* LEFT ANGLE BRACKET (OPENING ANGLE BRACKET) */
- [0x3009, 0x3009], /* RIGHT ANGLE BRACKET (CLOSING ANGLE BRACKET) */
- [0x300a, 0x300a], /* LEFT DOUBLE ANGLE BRACKET (OPENING DOUBLE ANGLE BRACKET) */
- [0x300b, 0x300b], /* RIGHT DOUBLE ANGLE BRACKET (CLOSING DOUBLE ANGLE BRACKET) */
- [0x300c, 0x300c], /* LEFT CORNER BRACKET (OPENING CORNER BRACKET) */
- [0x300d, 0x300d], /* RIGHT CORNER BRACKET (CLOSING CORNER BRACKET) */
- [0x300e, 0x300e], /* LEFT WHITE CORNER BRACKET (OPENING WHITE CORNER BRACKET) */
- [0x300f, 0x300f], /* RIGHT WHITE CORNER BRACKET (CLOSING WHITE CORNER BRACKET) */
- [0x3010, 0x3010], /* LEFT BLACK LENTICULAR BRACKET (OPENING BLACK LENTICULAR BRACKET) */
- [0x3011, 0x3011], /* RIGHT BLACK LENTICULAR BRACKET (CLOSING BLACK LENTICULAR BRACKET) */
- [0x3012, 0x3012], /* POSTAL MARK */
- [0x3013, 0x3013], /* GETA MARK */
- [0x3014, 0x3014], /* LEFT TORTOISE SHELL BRACKET (OPENING TORTOISE SHELL BRACKET) */
- [0x3015, 0x3015], /* RIGHT TORTOISE SHELL BRACKET (CLOSING TORTOISE SHELL BRACKET) */
- [0x3016, 0x3016], /* LEFT WHITE LENTICULAR BRACKET (OPENING WHITE LENTICULAR BRACKET) */
- [0x3017, 0x3017], /* RIGHT WHITE LENTICULAR BRACKET (CLOSING WHITE LENTICULAR BRACKET) */
- [0x3018, 0x3018], /* LEFT WHITE TORTOISE SHELL BRACKET (OPENING WHITE TORTOISE SHELL BRACKET) */
- [0x3019, 0x3019], /* RIGHT WHITE TORTOISE SHELL BRACKET (CLOSING WHITE TORTOISE SHELL BRACKET) */
- [0x301a, 0x301a], /* LEFT WHITE SQUARE BRACKET (OPENING WHITE SQUARE BRACKET) */
- [0x301b, 0x301b], /* RIGHT WHITE SQUARE BRACKET (CLOSING WHITE SQUARE BRACKET) */
- [0x301c, 0x301c], /* WAVE DASH */
- [0x301d, 0x301d], /* REVERSED DOUBLE PRIME QUOTATION MARK */
- [0x301e, 0x301e], /* DOUBLE PRIME QUOTATION MARK */
- [0x301f, 0x301f], /* LOW DOUBLE PRIME QUOTATION MARK */
- [0x3020, 0x3020], /* POSTAL MARK FACE */
- [0x3021, 0x3021], /* HANGZHOU NUMERAL ONE */
- [0x3022, 0x3022], /* HANGZHOU NUMERAL TWO */
- [0x3023, 0x3023], /* HANGZHOU NUMERAL THREE */
- [0x3024, 0x3024], /* HANGZHOU NUMERAL FOUR */
- [0x3025, 0x3025], /* HANGZHOU NUMERAL FIVE */
- [0x3026, 0x3026], /* HANGZHOU NUMERAL SIX */
- [0x3027, 0x3027], /* HANGZHOU NUMERAL SEVEN */
- [0x3028, 0x3028], /* HANGZHOU NUMERAL EIGHT */
- [0x3029, 0x3029], /* HANGZHOU NUMERAL NINE */
- [0x302a, 0x302a], /* IDEOGRAPHIC LEVEL TONE MARK */
- [0x302b, 0x302b], /* IDEOGRAPHIC RISING TONE MARK */
- [0x302c, 0x302c], /* IDEOGRAPHIC DEPARTING TONE MARK */
- [0x302d, 0x302d], /* IDEOGRAPHIC ENTERING TONE MARK */
- [0x302e, 0x302e], /* HANGUL SINGLE DOT TONE MARK */
- [0x302f, 0x302f], /* HANGUL DOUBLE DOT TONE MARK */
- [0x3030, 0x3030], /* WAVY DASH */
- [0x3031, 0x3031], /* VERTICAL KANA REPEAT MARK */
- [0x3032, 0x3032], /* VERTICAL KANA REPEAT WITH VOICED SOUND MARK */
- [0x3033, 0x3033], /* VERTICAL KANA REPEAT MARK UPPER HALF */
- [0x3034, 0x3034], /* VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF */
- [0x3035, 0x3035], /* VERTICAL KANA REPEAT MARK LOWER HALF */
- [0x3036, 0x3036], /* CIRCLED POSTAL MARK */
- [0x3037, 0x3037], /* IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL */
- [0x3038, 0x3038], /* HANGZHOU NUMERAL TEN */
- [0x3039, 0x3039], /* HANGZHOU NUMERAL TWENTY */
- [0x303a, 0x303a], /* HANGZHOU NUMERAL THIRTY */
- [0x303b, 0x303b], /* VERTICAL IDEOGRAPHIC ITERATION MARK */
- [0x303c, 0x303c], /* MASU MARK */
- [0x303d, 0x303d], /* PART ALTERNATION MARK */
- [0x303e, 0x303e], /* IDEOGRAPHIC VARIATION INDICATOR */
- [0x303f, 0x303f], /* IDEOGRAPHIC HALF FILL SPACE */
- [0x3040, 0x3040],
- [0x3041, 0x3041], /* HIRAGANA LETTER SMALL A */
- [0x3042, 0x3042], /* HIRAGANA LETTER A */
- [0x3043, 0x3043], /* HIRAGANA LETTER SMALL I */
- [0x3044, 0x3044], /* HIRAGANA LETTER I */
- [0x3045, 0x3045], /* HIRAGANA LETTER SMALL U */
- [0x3046, 0x3046], /* HIRAGANA LETTER U */
- [0x3047, 0x3047], /* HIRAGANA LETTER SMALL E */
- [0x3048, 0x3048], /* HIRAGANA LETTER E */
- [0x3049, 0x3049], /* HIRAGANA LETTER SMALL O */
- [0x304a, 0x304a], /* HIRAGANA LETTER O */
- [0x304b, 0x304b], /* HIRAGANA LETTER KA */
- [0x304c, 0x304c], /* HIRAGANA LETTER GA */
- [0x304d, 0x304d], /* HIRAGANA LETTER KI */
- [0x304e, 0x304e], /* HIRAGANA LETTER GI */
- [0x304f, 0x304f], /* HIRAGANA LETTER KU */
- [0x3050, 0x3050], /* HIRAGANA LETTER GU */
- [0x3051, 0x3051], /* HIRAGANA LETTER KE */
- [0x3052, 0x3052], /* HIRAGANA LETTER GE */
- [0x3053, 0x3053], /* HIRAGANA LETTER KO */
- [0x3054, 0x3054], /* HIRAGANA LETTER GO */
- [0x3055, 0x3055], /* HIRAGANA LETTER SA */
- [0x3056, 0x3056], /* HIRAGANA LETTER ZA */
- [0x3057, 0x3057], /* HIRAGANA LETTER SI */
- [0x3058, 0x3058], /* HIRAGANA LETTER ZI */
- [0x3059, 0x3059], /* HIRAGANA LETTER SU */
- [0x305a, 0x305a], /* HIRAGANA LETTER ZU */
- [0x305b, 0x305b], /* HIRAGANA LETTER SE */
- [0x305c, 0x305c], /* HIRAGANA LETTER ZE */
- [0x305d, 0x305d], /* HIRAGANA LETTER SO */
- [0x305e, 0x305e], /* HIRAGANA LETTER ZO */
- [0x305f, 0x305f], /* HIRAGANA LETTER TA */
- [0x3060, 0x3060], /* HIRAGANA LETTER DA */
- [0x3061, 0x3061], /* HIRAGANA LETTER TI */
- [0x3062, 0x3062], /* HIRAGANA LETTER DI */
- [0x3063, 0x3063], /* HIRAGANA LETTER SMALL TU */
- [0x3064, 0x3064], /* HIRAGANA LETTER TU */
- [0x3065, 0x3065], /* HIRAGANA LETTER DU */
- [0x3066, 0x3066], /* HIRAGANA LETTER TE */
- [0x3067, 0x3067], /* HIRAGANA LETTER DE */
- [0x3068, 0x3068], /* HIRAGANA LETTER TO */
- [0x3069, 0x3069], /* HIRAGANA LETTER DO */
- [0x306a, 0x306a], /* HIRAGANA LETTER NA */
- [0x306b, 0x306b], /* HIRAGANA LETTER NI */
- [0x306c, 0x306c], /* HIRAGANA LETTER NU */
- [0x306d, 0x306d], /* HIRAGANA LETTER NE */
- [0x306e, 0x306e], /* HIRAGANA LETTER NO */
- [0x306f, 0x306f], /* HIRAGANA LETTER HA */
- [0x3070, 0x3070], /* HIRAGANA LETTER BA */
- [0x3071, 0x3071], /* HIRAGANA LETTER PA */
- [0x3072, 0x3072], /* HIRAGANA LETTER HI */
- [0x3073, 0x3073], /* HIRAGANA LETTER BI */
- [0x3074, 0x3074], /* HIRAGANA LETTER PI */
- [0x3075, 0x3075], /* HIRAGANA LETTER HU */
- [0x3076, 0x3076], /* HIRAGANA LETTER BU */
- [0x3077, 0x3077], /* HIRAGANA LETTER PU */
- [0x3078, 0x3078], /* HIRAGANA LETTER HE */
- [0x3079, 0x3079], /* HIRAGANA LETTER BE */
- [0x307a, 0x307a], /* HIRAGANA LETTER PE */
- [0x307b, 0x307b], /* HIRAGANA LETTER HO */
- [0x307c, 0x307c], /* HIRAGANA LETTER BO */
- [0x307d, 0x307d], /* HIRAGANA LETTER PO */
- [0x307e, 0x307e], /* HIRAGANA LETTER MA */
- [0x307f, 0x307f], /* HIRAGANA LETTER MI */
- [0x3080, 0x3080], /* HIRAGANA LETTER MU */
- [0x3081, 0x3081], /* HIRAGANA LETTER ME */
- [0x3082, 0x3082], /* HIRAGANA LETTER MO */
- [0x3083, 0x3083], /* HIRAGANA LETTER SMALL YA */
- [0x3084, 0x3084], /* HIRAGANA LETTER YA */
- [0x3085, 0x3085], /* HIRAGANA LETTER SMALL YU */
- [0x3086, 0x3086], /* HIRAGANA LETTER YU */
- [0x3087, 0x3087], /* HIRAGANA LETTER SMALL YO */
- [0x3088, 0x3088], /* HIRAGANA LETTER YO */
- [0x3089, 0x3089], /* HIRAGANA LETTER RA */
- [0x308a, 0x308a], /* HIRAGANA LETTER RI */
- [0x308b, 0x308b], /* HIRAGANA LETTER RU */
- [0x308c, 0x308c], /* HIRAGANA LETTER RE */
- [0x308d, 0x308d], /* HIRAGANA LETTER RO */
- [0x308e, 0x308e], /* HIRAGANA LETTER SMALL WA */
- [0x308f, 0x308f], /* HIRAGANA LETTER WA */
- [0x3090, 0x3090], /* HIRAGANA LETTER WI */
- [0x3091, 0x3091], /* HIRAGANA LETTER WE */
- [0x3092, 0x3092], /* HIRAGANA LETTER WO */
- [0x3093, 0x3093], /* HIRAGANA LETTER N */
- [0x3094, 0x3094], /* HIRAGANA LETTER VU */
- [0x3095, 0x3095], /* HIRAGANA LETTER SMALL KA */
- [0x3096, 0x3096], /* HIRAGANA LETTER SMALL KE */
- [0x3097, 0x3097],
- [0x3098, 0x3098],
- [0x3099, 0x3099], /* COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK (NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK) */
- [0x309a, 0x309a], /* COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK (NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK) */
- [0x309b, 0x309b], /* KATAKANA-HIRAGANA VOICED SOUND MARK */
- [0x309c, 0x309c], /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
- [0x309d, 0x309d], /* HIRAGANA ITERATION MARK */
- [0x309e, 0x309e], /* HIRAGANA VOICED ITERATION MARK */
- [0x309f, 0x309f], /* HIRAGANA DIGRAPH YORI */
- [0x30a0, 0x30a0], /* KATAKANA-HIRAGANA DOUBLE HYPHEN */
- [0x30a1, 0x30a1], /* KATAKANA LETTER SMALL A */
- [0x30a2, 0x30a2], /* KATAKANA LETTER A */
- [0x30a3, 0x30a3], /* KATAKANA LETTER SMALL I */
- [0x30a4, 0x30a4], /* KATAKANA LETTER I */
- [0x30a5, 0x30a5], /* KATAKANA LETTER SMALL U */
- [0x30a6, 0x30a6], /* KATAKANA LETTER U */
- [0x30a7, 0x30a7], /* KATAKANA LETTER SMALL E */
- [0x30a8, 0x30a8], /* KATAKANA LETTER E */
- [0x30a9, 0x30a9], /* KATAKANA LETTER SMALL O */
- [0x30aa, 0x30aa], /* KATAKANA LETTER O */
- [0x30ab, 0x30ab], /* KATAKANA LETTER KA */
- [0x30ac, 0x30ac], /* KATAKANA LETTER GA */
- [0x30ad, 0x30ad], /* KATAKANA LETTER KI */
- [0x30ae, 0x30ae], /* KATAKANA LETTER GI */
- [0x30af, 0x30af], /* KATAKANA LETTER KU */
- [0x30b0, 0x30b0], /* KATAKANA LETTER GU */
- [0x30b1, 0x30b1], /* KATAKANA LETTER KE */
- [0x30b2, 0x30b2], /* KATAKANA LETTER GE */
- [0x30b3, 0x30b3], /* KATAKANA LETTER KO */
- [0x30b4, 0x30b4], /* KATAKANA LETTER GO */
- [0x30b5, 0x30b5], /* KATAKANA LETTER SA */
- [0x30b6, 0x30b6], /* KATAKANA LETTER ZA */
- [0x30b7, 0x30b7], /* KATAKANA LETTER SI */
- [0x30b8, 0x30b8], /* KATAKANA LETTER ZI */
- [0x30b9, 0x30b9], /* KATAKANA LETTER SU */
- [0x30ba, 0x30ba], /* KATAKANA LETTER ZU */
- [0x30bb, 0x30bb], /* KATAKANA LETTER SE */
- [0x30bc, 0x30bc], /* KATAKANA LETTER ZE */
- [0x30bd, 0x30bd], /* KATAKANA LETTER SO */
- [0x30be, 0x30be], /* KATAKANA LETTER ZO */
- [0x30bf, 0x30bf], /* KATAKANA LETTER TA */
- [0x30c0, 0x30c0], /* KATAKANA LETTER DA */
- [0x30c1, 0x30c1], /* KATAKANA LETTER TI */
- [0x30c2, 0x30c2], /* KATAKANA LETTER DI */
- [0x30c3, 0x30c3], /* KATAKANA LETTER SMALL TU */
- [0x30c4, 0x30c4], /* KATAKANA LETTER TU */
- [0x30c5, 0x30c5], /* KATAKANA LETTER DU */
- [0x30c6, 0x30c6], /* KATAKANA LETTER TE */
- [0x30c7, 0x30c7], /* KATAKANA LETTER DE */
- [0x30c8, 0x30c8], /* KATAKANA LETTER TO */
- [0x30c9, 0x30c9], /* KATAKANA LETTER DO */
- [0x30ca, 0x30ca], /* KATAKANA LETTER NA */
- [0x30cb, 0x30cb], /* KATAKANA LETTER NI */
- [0x30cc, 0x30cc], /* KATAKANA LETTER NU */
- [0x30cd, 0x30cd], /* KATAKANA LETTER NE */
- [0x30ce, 0x30ce], /* KATAKANA LETTER NO */
- [0x30cf, 0x30cf], /* KATAKANA LETTER HA */
- [0x30d0, 0x30d0], /* KATAKANA LETTER BA */
- [0x30d1, 0x30d1], /* KATAKANA LETTER PA */
- [0x30d2, 0x30d2], /* KATAKANA LETTER HI */
- [0x30d3, 0x30d3], /* KATAKANA LETTER BI */
- [0x30d4, 0x30d4], /* KATAKANA LETTER PI */
- [0x30d5, 0x30d5], /* KATAKANA LETTER HU */
- [0x30d6, 0x30d6], /* KATAKANA LETTER BU */
- [0x30d7, 0x30d7], /* KATAKANA LETTER PU */
- [0x30d8, 0x30d8], /* KATAKANA LETTER HE */
- [0x30d9, 0x30d9], /* KATAKANA LETTER BE */
- [0x30da, 0x30da], /* KATAKANA LETTER PE */
- [0x30db, 0x30db], /* KATAKANA LETTER HO */
- [0x30dc, 0x30dc], /* KATAKANA LETTER BO */
- [0x30dd, 0x30dd], /* KATAKANA LETTER PO */
- [0x30de, 0x30de], /* KATAKANA LETTER MA */
- [0x30df, 0x30df], /* KATAKANA LETTER MI */
- [0x30e0, 0x30e0], /* KATAKANA LETTER MU */
- [0x30e1, 0x30e1], /* KATAKANA LETTER ME */
- [0x30e2, 0x30e2], /* KATAKANA LETTER MO */
- [0x30e3, 0x30e3], /* KATAKANA LETTER SMALL YA */
- [0x30e4, 0x30e4], /* KATAKANA LETTER YA */
- [0x30e5, 0x30e5], /* KATAKANA LETTER SMALL YU */
- [0x30e6, 0x30e6], /* KATAKANA LETTER YU */
- [0x30e7, 0x30e7], /* KATAKANA LETTER SMALL YO */
- [0x30e8, 0x30e8], /* KATAKANA LETTER YO */
- [0x30e9, 0x30e9], /* KATAKANA LETTER RA */
- [0x30ea, 0x30ea], /* KATAKANA LETTER RI */
- [0x30eb, 0x30eb], /* KATAKANA LETTER RU */
- [0x30ec, 0x30ec], /* KATAKANA LETTER RE */
- [0x30ed, 0x30ed], /* KATAKANA LETTER RO */
- [0x30ee, 0x30ee], /* KATAKANA LETTER SMALL WA */
- [0x30ef, 0x30ef], /* KATAKANA LETTER WA */
- [0x30f0, 0x30f0], /* KATAKANA LETTER WI */
- [0x30f1, 0x30f1], /* KATAKANA LETTER WE */
- [0x30f2, 0x30f2], /* KATAKANA LETTER WO */
- [0x30f3, 0x30f3], /* KATAKANA LETTER N */
- [0x30f4, 0x30f4], /* KATAKANA LETTER VU */
- [0x30f5, 0x30f5], /* KATAKANA LETTER SMALL KA */
- [0x30f6, 0x30f6], /* KATAKANA LETTER SMALL KE */
- [0x30f7, 0x30f7], /* KATAKANA LETTER VA */
- [0x30f8, 0x30f8], /* KATAKANA LETTER VI */
- [0x30f9, 0x30f9], /* KATAKANA LETTER VE */
- [0x30fa, 0x30fa], /* KATAKANA LETTER VO */
- [0x30fb, 0x30fb], /* KATAKANA MIDDLE DOT */
- [0x30fc, 0x30fc], /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
- [0x30fd, 0x30fd], /* KATAKANA ITERATION MARK */
- [0x30fe, 0x30fe], /* KATAKANA VOICED ITERATION MARK */
- [0x30ff, 0x30ff], /* KATAKANA DIGRAPH KOTO */
- [0x3100, 0x3100],
- [0x3101, 0x3101],
- [0x3102, 0x3102],
- [0x3103, 0x3103],
- [0x3104, 0x3104],
- [0x3105, 0x3105], /* BOPOMOFO LETTER B */
- [0x3106, 0x3106], /* BOPOMOFO LETTER P */
- [0x3107, 0x3107], /* BOPOMOFO LETTER M */
- [0x3108, 0x3108], /* BOPOMOFO LETTER F */
- [0x3109, 0x3109], /* BOPOMOFO LETTER D */
- [0x310a, 0x310a], /* BOPOMOFO LETTER T */
- [0x310b, 0x310b], /* BOPOMOFO LETTER N */
- [0x310c, 0x310c], /* BOPOMOFO LETTER L */
- [0x310d, 0x310d], /* BOPOMOFO LETTER G */
- [0x310e, 0x310e], /* BOPOMOFO LETTER K */
- [0x310f, 0x310f], /* BOPOMOFO LETTER H */
- [0x3110, 0x3110], /* BOPOMOFO LETTER J */
- [0x3111, 0x3111], /* BOPOMOFO LETTER Q */
- [0x3112, 0x3112], /* BOPOMOFO LETTER X */
- [0x3113, 0x3113], /* BOPOMOFO LETTER ZH */
- [0x3114, 0x3114], /* BOPOMOFO LETTER CH */
- [0x3115, 0x3115], /* BOPOMOFO LETTER SH */
- [0x3116, 0x3116], /* BOPOMOFO LETTER R */
- [0x3117, 0x3117], /* BOPOMOFO LETTER Z */
- [0x3118, 0x3118], /* BOPOMOFO LETTER C */
- [0x3119, 0x3119], /* BOPOMOFO LETTER S */
- [0x311a, 0x311a], /* BOPOMOFO LETTER A */
- [0x311b, 0x311b], /* BOPOMOFO LETTER O */
- [0x311c, 0x311c], /* BOPOMOFO LETTER E */
- [0x311d, 0x311d], /* BOPOMOFO LETTER EH */
- [0x311e, 0x311e], /* BOPOMOFO LETTER AI */
- [0x311f, 0x311f], /* BOPOMOFO LETTER EI */
- [0x3120, 0x3120], /* BOPOMOFO LETTER AU */
- [0x3121, 0x3121], /* BOPOMOFO LETTER OU */
- [0x3122, 0x3122], /* BOPOMOFO LETTER AN */
- [0x3123, 0x3123], /* BOPOMOFO LETTER EN */
- [0x3124, 0x3124], /* BOPOMOFO LETTER ANG */
- [0x3125, 0x3125], /* BOPOMOFO LETTER ENG */
- [0x3126, 0x3126], /* BOPOMOFO LETTER ER */
- [0x3127, 0x3127], /* BOPOMOFO LETTER I */
- [0x3128, 0x3128], /* BOPOMOFO LETTER U */
- [0x3129, 0x3129], /* BOPOMOFO LETTER IU */
- [0x312a, 0x312a], /* BOPOMOFO LETTER V */
- [0x312b, 0x312b], /* BOPOMOFO LETTER NG */
- [0x312c, 0x312c], /* BOPOMOFO LETTER GN */
- [0x312d, 0x312d], /* BOPOMOFO LETTER IH */
- [0x312e, 0x312e], /* BOPOMOFO LETTER O WITH DOT ABOVE */
- [0x312f, 0x312f], /* BOPOMOFO LETTER NN */
- [0x3130, 0x3130],
- [0x3131, 0x3131], /* HANGUL LETTER KIYEOK (HANGUL LETTER GIYEOG) */
- [0x3132, 0x3132], /* HANGUL LETTER SSANGKIYEOK (HANGUL LETTER SSANG GIYEOG) */
- [0x3133, 0x3133], /* HANGUL LETTER KIYEOK-SIOS (HANGUL LETTER GIYEOG SIOS) */
- [0x3134, 0x3134], /* HANGUL LETTER NIEUN */
- [0x3135, 0x3135], /* HANGUL LETTER NIEUN-CIEUC (HANGUL LETTER NIEUN JIEUJ) */
- [0x3136, 0x3136], /* HANGUL LETTER NIEUN-HIEUH (HANGUL LETTER NIEUN HIEUH) */
- [0x3137, 0x3137], /* HANGUL LETTER TIKEUT (HANGUL LETTER DIGEUD) */
- [0x3138, 0x3138], /* HANGUL LETTER SSANGTIKEUT (HANGUL LETTER SSANG DIGEUD) */
- [0x3139, 0x3139], /* HANGUL LETTER RIEUL (HANGUL LETTER LIEUL) */
- [0x313a, 0x313a], /* HANGUL LETTER RIEUL-KIYEOK (HANGUL LETTER LIEUL GIYEOG) */
- [0x313b, 0x313b], /* HANGUL LETTER RIEUL-MIEUM (HANGUL LETTER LIEUL MIEUM) */
- [0x313c, 0x313c], /* HANGUL LETTER RIEUL-PIEUP (HANGUL LETTER LIEUL BIEUB) */
- [0x313d, 0x313d], /* HANGUL LETTER RIEUL-SIOS (HANGUL LETTER LIEUL SIOS) */
- [0x313e, 0x313e], /* HANGUL LETTER RIEUL-THIEUTH (HANGUL LETTER LIEUL TIEUT) */
- [0x313f, 0x313f], /* HANGUL LETTER RIEUL-PHIEUPH (HANGUL LETTER LIEUL PIEUP) */
- [0x3140, 0x3140], /* HANGUL LETTER RIEUL-HIEUH (HANGUL LETTER LIEUL HIEUH) */
- [0x3141, 0x3141], /* HANGUL LETTER MIEUM */
- [0x3142, 0x3142], /* HANGUL LETTER PIEUP (HANGUL LETTER BIEUB) */
- [0x3143, 0x3143], /* HANGUL LETTER SSANGPIEUP (HANGUL LETTER SSANG BIEUB) */
- [0x3144, 0x3144], /* HANGUL LETTER PIEUP-SIOS (HANGUL LETTER BIEUB SIOS) */
- [0x3145, 0x3145], /* HANGUL LETTER SIOS */
- [0x3146, 0x3146], /* HANGUL LETTER SSANGSIOS (HANGUL LETTER SSANG SIOS) */
- [0x3147, 0x3147], /* HANGUL LETTER IEUNG */
- [0x3148, 0x3148], /* HANGUL LETTER CIEUC (HANGUL LETTER JIEUJ) */
- [0x3149, 0x3149], /* HANGUL LETTER SSANGCIEUC (HANGUL LETTER SSANG JIEUJ) */
- [0x314a, 0x314a], /* HANGUL LETTER CHIEUCH (HANGUL LETTER CIEUC) */
- [0x314b, 0x314b], /* HANGUL LETTER KHIEUKH (HANGUL LETTER KIYEOK) */
- [0x314c, 0x314c], /* HANGUL LETTER THIEUTH (HANGUL LETTER TIEUT) */
- [0x314d, 0x314d], /* HANGUL LETTER PHIEUPH (HANGUL LETTER PIEUP) */
- [0x314e, 0x314e], /* HANGUL LETTER HIEUH */
- [0x314f, 0x314f], /* HANGUL LETTER A */
- [0x3150, 0x3150], /* HANGUL LETTER AE */
- [0x3151, 0x3151], /* HANGUL LETTER YA */
- [0x3152, 0x3152], /* HANGUL LETTER YAE */
- [0x3153, 0x3153], /* HANGUL LETTER EO */
- [0x3154, 0x3154], /* HANGUL LETTER E */
- [0x3155, 0x3155], /* HANGUL LETTER YEO */
- [0x3156, 0x3156], /* HANGUL LETTER YE */
- [0x3157, 0x3157], /* HANGUL LETTER O */
- [0x3158, 0x3158], /* HANGUL LETTER WA */
- [0x3159, 0x3159], /* HANGUL LETTER WAE */
- [0x315a, 0x315a], /* HANGUL LETTER OE */
- [0x315b, 0x315b], /* HANGUL LETTER YO */
- [0x315c, 0x315c], /* HANGUL LETTER U */
- [0x315d, 0x315d], /* HANGUL LETTER WEO */
- [0x315e, 0x315e], /* HANGUL LETTER WE */
- [0x315f, 0x315f], /* HANGUL LETTER WI */
- [0x3160, 0x3160], /* HANGUL LETTER YU */
- [0x3161, 0x3161], /* HANGUL LETTER EU */
- [0x3162, 0x3162], /* HANGUL LETTER YI */
- [0x3163, 0x3163], /* HANGUL LETTER I */
- [0x3164, 0x3164], /* HANGUL FILLER (HANGUL CAE OM) */
- [0x3165, 0x3165], /* HANGUL LETTER SSANGNIEUN (HANGUL LETTER SSANG NIEUN) */
- [0x3166, 0x3166], /* HANGUL LETTER NIEUN-TIKEUT (HANGUL LETTER NIEUN DIGEUD) */
- [0x3167, 0x3167], /* HANGUL LETTER NIEUN-SIOS (HANGUL LETTER NIEUN SIOS) */
- [0x3168, 0x3168], /* HANGUL LETTER NIEUN-PANSIOS (HANGUL LETTER NIEUN BAN CHI EUM) */
- [0x3169, 0x3169], /* HANGUL LETTER RIEUL-KIYEOK-SIOS (HANGUL LETTER LIEUL GIYEOG SIOS) */
- [0x316a, 0x316a], /* HANGUL LETTER RIEUL-TIKEUT (HANGUL LETTER LIEUL DIGEUD) */
- [0x316b, 0x316b], /* HANGUL LETTER RIEUL-PIEUP-SIOS (HANGUL LETTER LIEUL BIEUB SIOS) */
- [0x316c, 0x316c], /* HANGUL LETTER RIEUL-PANSIOS (HANGUL LETTER LIEUL BAN CHI EUM) */
- [0x316d, 0x316d], /* HANGUL LETTER RIEUL-YEORINHIEUH (HANGUL LETTER LIEUL YEOLIN HIEUH) */
- [0x316e, 0x316e], /* HANGUL LETTER MIEUM-PIEUP (HANGUL LETTER MIEUM BIEUB) */
- [0x316f, 0x316f], /* HANGUL LETTER MIEUM-SIOS (HANGUL LETTER MIEUM SIOS) */
- [0x3170, 0x3170], /* HANGUL LETTER MIEUM-PANSIOS (HANGUL LETTER BIEUB BAN CHI EUM) */
- [0x3171, 0x3171], /* HANGUL LETTER KAPYEOUNMIEUM (HANGUL LETTER MIEUM SUN GYEONG EUM) */
- [0x3172, 0x3172], /* HANGUL LETTER PIEUP-KIYEOK (HANGUL LETTER BIEUB GIYEOG) */
- [0x3173, 0x3173], /* HANGUL LETTER PIEUP-TIKEUT (HANGUL LETTER BIEUB DIGEUD) */
- [0x3174, 0x3174], /* HANGUL LETTER PIEUP-SIOS-KIYEOK (HANGUL LETTER BIEUB SIOS GIYEOG) */
- [0x3175, 0x3175], /* HANGUL LETTER PIEUP-SIOS-TIKEUT (HANGUL LETTER BIEUB SIOS DIGEUD) */
- [0x3176, 0x3176], /* HANGUL LETTER PIEUP-CIEUC (HANGUL LETTER BIEUB JIEUJ) */
- [0x3177, 0x3177], /* HANGUL LETTER PIEUP-THIEUTH (HANGUL LETTER BIEUB TIEUT) */
- [0x3178, 0x3178], /* HANGUL LETTER KAPYEOUNPIEUP (HANGUL LETTER BIEUB SUN GYEONG EUM) */
- [0x3179, 0x3179], /* HANGUL LETTER KAPYEOUNSSANGPIEUP (HANGUL LETTER SSANG BIEUB SUN GYEONG EUM) */
- [0x317a, 0x317a], /* HANGUL LETTER SIOS-KIYEOK (HANGUL LETTER SIOS GIYEOG) */
- [0x317b, 0x317b], /* HANGUL LETTER SIOS-NIEUN (HANGUL LETTER SIOS NIEUN) */
- [0x317c, 0x317c], /* HANGUL LETTER SIOS-TIKEUT (HANGUL LETTER SIOS DIGEUD) */
- [0x317d, 0x317d], /* HANGUL LETTER SIOS-PIEUP (HANGUL LETTER SIOS BIEUB) */
- [0x317e, 0x317e], /* HANGUL LETTER SIOS-CIEUC (HANGUL LETTER SIOS JIEUJ) */
- [0x317f, 0x317f], /* HANGUL LETTER PANSIOS (HANGUL LETTER BAN CHI EUM) */
- [0x3180, 0x3180], /* HANGUL LETTER SSANGIEUNG (HANGUL LETTER SSANG IEUNG) */
- [0x3181, 0x3181], /* HANGUL LETTER YESIEUNG (HANGUL LETTER NGIEUNG) */
- [0x3182, 0x3182], /* HANGUL LETTER YESIEUNG-SIOS (HANGUL LETTER NGIEUNG SIOS) */
- [0x3183, 0x3183], /* HANGUL LETTER YESIEUNG-PANSIOS (HANGUL LETTER NGIEUNG BAN CHI EUM) */
- [0x3184, 0x3184], /* HANGUL LETTER KAPYEOUNPHIEUPH (HANGUL LETTER PIEUP SUN GYEONG EUM) */
- [0x3185, 0x3185], /* HANGUL LETTER SSANGHIEUH (HANGUL LETTER SSANG HIEUH) */
- [0x3186, 0x3186], /* HANGUL LETTER YEORINHIEUH (HANGUL LETTER YEOLIN HIEUH) */
- [0x3187, 0x3187], /* HANGUL LETTER YO-YA (HANGUL LETTER YOYA) */
- [0x3188, 0x3188], /* HANGUL LETTER YO-YAE (HANGUL LETTER YOYAE) */
- [0x3189, 0x3189], /* HANGUL LETTER YO-I (HANGUL LETTER YOI) */
- [0x318a, 0x318a], /* HANGUL LETTER YU-YEO (HANGUL LETTER YUYEO) */
- [0x318b, 0x318b], /* HANGUL LETTER YU-YE (HANGUL LETTER YUYE) */
- [0x318c, 0x318c], /* HANGUL LETTER YU-I (HANGUL LETTER YUI) */
- [0x318d, 0x318d], /* HANGUL LETTER ARAEA (HANGUL LETTER ALAE A) */
- [0x318e, 0x318e], /* HANGUL LETTER ARAEAE (HANGUL LETTER ALAE AE) */
- [0x318f, 0x318f],
- [0x3190, 0x3190], /* IDEOGRAPHIC ANNOTATION LINKING MARK (KANBUN TATETEN) */
- [0x3191, 0x3191], /* IDEOGRAPHIC ANNOTATION REVERSE MARK (KAERITEN RE) */
- [0x3192, 0x3192], /* IDEOGRAPHIC ANNOTATION ONE MARK (KAERITEN ITI) */
- [0x3193, 0x3193], /* IDEOGRAPHIC ANNOTATION TWO MARK (KAERITEN NI) */
- [0x3194, 0x3194], /* IDEOGRAPHIC ANNOTATION THREE MARK (KAERITEN SAN) */
- [0x3195, 0x3195], /* IDEOGRAPHIC ANNOTATION FOUR MARK (KAERITEN SI) */
- [0x3196, 0x3196], /* IDEOGRAPHIC ANNOTATION TOP MARK (KAERITEN ZYOU) */
- [0x3197, 0x3197], /* IDEOGRAPHIC ANNOTATION MIDDLE MARK (KAERITEN TYUU) */
- [0x3198, 0x3198], /* IDEOGRAPHIC ANNOTATION BOTTOM MARK (KAERITEN GE) */
- [0x3199, 0x3199], /* IDEOGRAPHIC ANNOTATION FIRST MARK (KAERITEN KOU) */
- [0x319a, 0x319a], /* IDEOGRAPHIC ANNOTATION SECOND MARK (KAERITEN OTU) */
- [0x319b, 0x319b], /* IDEOGRAPHIC ANNOTATION THIRD MARK (KAERITEN HEI) */
- [0x319c, 0x319c], /* IDEOGRAPHIC ANNOTATION FOURTH MARK (KAERITEN TEI) */
- [0x319d, 0x319d], /* IDEOGRAPHIC ANNOTATION HEAVEN MARK (KAERITEN TEN) */
- [0x319e, 0x319e], /* IDEOGRAPHIC ANNOTATION EARTH MARK (KAERITEN TI) */
- [0x319f, 0x319f], /* IDEOGRAPHIC ANNOTATION MAN MARK (KAERITEN ZIN) */
- [0x31a0, 0x31a0], /* BOPOMOFO LETTER BU */
- [0x31a1, 0x31a1], /* BOPOMOFO LETTER ZI */
- [0x31a2, 0x31a2], /* BOPOMOFO LETTER JI */
- [0x31a3, 0x31a3], /* BOPOMOFO LETTER GU */
- [0x31a4, 0x31a4], /* BOPOMOFO LETTER EE */
- [0x31a5, 0x31a5], /* BOPOMOFO LETTER ENN */
- [0x31a6, 0x31a6], /* BOPOMOFO LETTER OO */
- [0x31a7, 0x31a7], /* BOPOMOFO LETTER ONN */
- [0x31a8, 0x31a8], /* BOPOMOFO LETTER IR */
- [0x31a9, 0x31a9], /* BOPOMOFO LETTER ANN */
- [0x31aa, 0x31aa], /* BOPOMOFO LETTER INN */
- [0x31ab, 0x31ab], /* BOPOMOFO LETTER UNN */
- [0x31ac, 0x31ac], /* BOPOMOFO LETTER IM */
- [0x31ad, 0x31ad], /* BOPOMOFO LETTER NGG */
- [0x31ae, 0x31ae], /* BOPOMOFO LETTER AINN */
- [0x31af, 0x31af], /* BOPOMOFO LETTER AUNN */
- [0x31b0, 0x31b0], /* BOPOMOFO LETTER AM */
- [0x31b1, 0x31b1], /* BOPOMOFO LETTER OM */
- [0x31b2, 0x31b2], /* BOPOMOFO LETTER ONG */
- [0x31b3, 0x31b3], /* BOPOMOFO LETTER INNN */
- [0x31b4, 0x31b4], /* BOPOMOFO FINAL LETTER P */
- [0x31b5, 0x31b5], /* BOPOMOFO FINAL LETTER T */
- [0x31b6, 0x31b6], /* BOPOMOFO FINAL LETTER K */
- [0x31b7, 0x31b7], /* BOPOMOFO FINAL LETTER H */
- [0x31b8, 0x31b8], /* BOPOMOFO LETTER GH */
- [0x31b9, 0x31b9], /* BOPOMOFO LETTER LH */
- [0x31ba, 0x31ba], /* BOPOMOFO LETTER ZY */
- [0x31bb, 0x31bb],
- [0x31bc, 0x31bc],
- [0x31bd, 0x31bd],
- [0x31be, 0x31be],
- [0x31bf, 0x31bf],
- [0x31c0, 0x31c0], /* CJK STROKE T */
- [0x31c1, 0x31c1], /* CJK STROKE WG */
- [0x31c2, 0x31c2], /* CJK STROKE XG */
- [0x31c3, 0x31c3], /* CJK STROKE BXG */
- [0x31c4, 0x31c4], /* CJK STROKE SW */
- [0x31c5, 0x31c5], /* CJK STROKE HZZ */
- [0x31c6, 0x31c6], /* CJK STROKE HZG */
- [0x31c7, 0x31c7], /* CJK STROKE HP */
- [0x31c8, 0x31c8], /* CJK STROKE HZWG */
- [0x31c9, 0x31c9], /* CJK STROKE SZWG */
- [0x31ca, 0x31ca], /* CJK STROKE HZT */
- [0x31cb, 0x31cb], /* CJK STROKE HZZP */
- [0x31cc, 0x31cc], /* CJK STROKE HPWG */
- [0x31cd, 0x31cd], /* CJK STROKE HZW */
- [0x31ce, 0x31ce], /* CJK STROKE HZZZ */
- [0x31cf, 0x31cf], /* CJK STROKE N */
- [0x31d0, 0x31d0], /* CJK STROKE H */
- [0x31d1, 0x31d1], /* CJK STROKE S */
- [0x31d2, 0x31d2], /* CJK STROKE P */
- [0x31d3, 0x31d3], /* CJK STROKE SP */
- [0x31d4, 0x31d4], /* CJK STROKE D */
- [0x31d5, 0x31d5], /* CJK STROKE HZ */
- [0x31d6, 0x31d6], /* CJK STROKE HG */
- [0x31d7, 0x31d7], /* CJK STROKE SZ */
- [0x31d8, 0x31d8], /* CJK STROKE SWZ */
- [0x31d9, 0x31d9], /* CJK STROKE ST */
- [0x31da, 0x31da], /* CJK STROKE SG */
- [0x31db, 0x31db], /* CJK STROKE PD */
- [0x31dc, 0x31dc], /* CJK STROKE PZ */
- [0x31dd, 0x31dd], /* CJK STROKE TN */
- [0x31de, 0x31de], /* CJK STROKE SZZ */
- [0x31df, 0x31df], /* CJK STROKE SWG */
- [0x31e0, 0x31e0], /* CJK STROKE HXWG */
- [0x31e1, 0x31e1], /* CJK STROKE HZZZG */
- [0x31e2, 0x31e2], /* CJK STROKE PG */
- [0x31e3, 0x31e3], /* CJK STROKE Q */
- [0x31e4, 0x31e4],
- [0x31e5, 0x31e5],
- [0x31e6, 0x31e6],
- [0x31e7, 0x31e7],
- [0x31e8, 0x31e8],
- [0x31e9, 0x31e9],
- [0x31ea, 0x31ea],
- [0x31eb, 0x31eb],
- [0x31ec, 0x31ec],
- [0x31ed, 0x31ed],
- [0x31ee, 0x31ee],
- [0x31ef, 0x31ef],
- [0x31f0, 0x31f0], /* KATAKANA LETTER SMALL KU */
- [0x31f1, 0x31f1], /* KATAKANA LETTER SMALL SI */
- [0x31f2, 0x31f2], /* KATAKANA LETTER SMALL SU */
- [0x31f3, 0x31f3], /* KATAKANA LETTER SMALL TO */
- [0x31f4, 0x31f4], /* KATAKANA LETTER SMALL NU */
- [0x31f5, 0x31f5], /* KATAKANA LETTER SMALL HA */
- [0x31f6, 0x31f6], /* KATAKANA LETTER SMALL HI */
- [0x31f7, 0x31f7], /* KATAKANA LETTER SMALL HU */
- [0x31f8, 0x31f8], /* KATAKANA LETTER SMALL HE */
- [0x31f9, 0x31f9], /* KATAKANA LETTER SMALL HO */
- [0x31fa, 0x31fa], /* KATAKANA LETTER SMALL MU */
- [0x31fb, 0x31fb], /* KATAKANA LETTER SMALL RA */
- [0x31fc, 0x31fc], /* KATAKANA LETTER SMALL RI */
- [0x31fd, 0x31fd], /* KATAKANA LETTER SMALL RU */
- [0x31fe, 0x31fe], /* KATAKANA LETTER SMALL RE */
- [0x31ff, 0x31ff], /* KATAKANA LETTER SMALL RO */
- [0x3200, 0x3200], /* PARENTHESIZED HANGUL KIYEOK (PARENTHESIZED HANGUL GIYEOG) */
- [0x3201, 0x3201], /* PARENTHESIZED HANGUL NIEUN */
- [0x3202, 0x3202], /* PARENTHESIZED HANGUL TIKEUT (PARENTHESIZED HANGUL DIGEUD) */
- [0x3203, 0x3203], /* PARENTHESIZED HANGUL RIEUL (PARENTHESIZED HANGUL LIEUL) */
- [0x3204, 0x3204], /* PARENTHESIZED HANGUL MIEUM */
- [0x3205, 0x3205], /* PARENTHESIZED HANGUL PIEUP (PARENTHESIZED HANGUL BIEUB) */
- [0x3206, 0x3206], /* PARENTHESIZED HANGUL SIOS */
- [0x3207, 0x3207], /* PARENTHESIZED HANGUL IEUNG */
- [0x3208, 0x3208], /* PARENTHESIZED HANGUL CIEUC (PARENTHESIZED HANGUL JIEUJ) */
- [0x3209, 0x3209], /* PARENTHESIZED HANGUL CHIEUCH (PARENTHESIZED HANGUL CIEUC) */
- [0x320a, 0x320a], /* PARENTHESIZED HANGUL KHIEUKH (PARENTHESIZED HANGUL KIYEOK) */
- [0x320b, 0x320b], /* PARENTHESIZED HANGUL THIEUTH (PARENTHESIZED HANGUL TIEUT) */
- [0x320c, 0x320c], /* PARENTHESIZED HANGUL PHIEUPH (PARENTHESIZED HANGUL PIEUP) */
- [0x320d, 0x320d], /* PARENTHESIZED HANGUL HIEUH */
- [0x320e, 0x320e], /* PARENTHESIZED HANGUL KIYEOK A (PARENTHESIZED HANGUL GA) */
- [0x320f, 0x320f], /* PARENTHESIZED HANGUL NIEUN A (PARENTHESIZED HANGUL NA) */
- [0x3210, 0x3210], /* PARENTHESIZED HANGUL TIKEUT A (PARENTHESIZED HANGUL DA) */
- [0x3211, 0x3211], /* PARENTHESIZED HANGUL RIEUL A (PARENTHESIZED HANGUL LA) */
- [0x3212, 0x3212], /* PARENTHESIZED HANGUL MIEUM A (PARENTHESIZED HANGUL MA) */
- [0x3213, 0x3213], /* PARENTHESIZED HANGUL PIEUP A (PARENTHESIZED HANGUL BA) */
- [0x3214, 0x3214], /* PARENTHESIZED HANGUL SIOS A (PARENTHESIZED HANGUL SA) */
- [0x3215, 0x3215], /* PARENTHESIZED HANGUL IEUNG A (PARENTHESIZED HANGUL A) */
- [0x3216, 0x3216], /* PARENTHESIZED HANGUL CIEUC A (PARENTHESIZED HANGUL JA) */
- [0x3217, 0x3217], /* PARENTHESIZED HANGUL CHIEUCH A (PARENTHESIZED HANGUL CA) */
- [0x3218, 0x3218], /* PARENTHESIZED HANGUL KHIEUKH A (PARENTHESIZED HANGUL KA) */
- [0x3219, 0x3219], /* PARENTHESIZED HANGUL THIEUTH A (PARENTHESIZED HANGUL TA) */
- [0x321a, 0x321a], /* PARENTHESIZED HANGUL PHIEUPH A (PARENTHESIZED HANGUL PA) */
- [0x321b, 0x321b], /* PARENTHESIZED HANGUL HIEUH A (PARENTHESIZED HANGUL HA) */
- [0x321c, 0x321c], /* PARENTHESIZED HANGUL CIEUC U (PARENTHESIZED HANGUL JU) */
- [0x321d, 0x321d], /* PARENTHESIZED KOREAN CHARACTER OJEON */
- [0x321e, 0x321e], /* PARENTHESIZED KOREAN CHARACTER O HU */
- [0x321f, 0x321f],
- [0x3220, 0x3220], /* PARENTHESIZED IDEOGRAPH ONE */
- [0x3221, 0x3221], /* PARENTHESIZED IDEOGRAPH TWO */
- [0x3222, 0x3222], /* PARENTHESIZED IDEOGRAPH THREE */
- [0x3223, 0x3223], /* PARENTHESIZED IDEOGRAPH FOUR */
- [0x3224, 0x3224], /* PARENTHESIZED IDEOGRAPH FIVE */
- [0x3225, 0x3225], /* PARENTHESIZED IDEOGRAPH SIX */
- [0x3226, 0x3226], /* PARENTHESIZED IDEOGRAPH SEVEN */
- [0x3227, 0x3227], /* PARENTHESIZED IDEOGRAPH EIGHT */
- [0x3228, 0x3228], /* PARENTHESIZED IDEOGRAPH NINE */
- [0x3229, 0x3229], /* PARENTHESIZED IDEOGRAPH TEN */
- [0x322a, 0x322a], /* PARENTHESIZED IDEOGRAPH MOON */
- [0x322b, 0x322b], /* PARENTHESIZED IDEOGRAPH FIRE */
- [0x322c, 0x322c], /* PARENTHESIZED IDEOGRAPH WATER */
- [0x322d, 0x322d], /* PARENTHESIZED IDEOGRAPH WOOD */
- [0x322e, 0x322e], /* PARENTHESIZED IDEOGRAPH METAL */
- [0x322f, 0x322f], /* PARENTHESIZED IDEOGRAPH EARTH */
- [0x3230, 0x3230], /* PARENTHESIZED IDEOGRAPH SUN */
- [0x3231, 0x3231], /* PARENTHESIZED IDEOGRAPH STOCK */
- [0x3232, 0x3232], /* PARENTHESIZED IDEOGRAPH HAVE */
- [0x3233, 0x3233], /* PARENTHESIZED IDEOGRAPH SOCIETY */
- [0x3234, 0x3234], /* PARENTHESIZED IDEOGRAPH NAME */
- [0x3235, 0x3235], /* PARENTHESIZED IDEOGRAPH SPECIAL */
- [0x3236, 0x3236], /* PARENTHESIZED IDEOGRAPH FINANCIAL */
- [0x3237, 0x3237], /* PARENTHESIZED IDEOGRAPH CONGRATULATION */
- [0x3238, 0x3238], /* PARENTHESIZED IDEOGRAPH LABOR */
- [0x3239, 0x3239], /* PARENTHESIZED IDEOGRAPH REPRESENT */
- [0x323a, 0x323a], /* PARENTHESIZED IDEOGRAPH CALL */
- [0x323b, 0x323b], /* PARENTHESIZED IDEOGRAPH STUDY */
- [0x323c, 0x323c], /* PARENTHESIZED IDEOGRAPH SUPERVISE */
- [0x323d, 0x323d], /* PARENTHESIZED IDEOGRAPH ENTERPRISE */
- [0x323e, 0x323e], /* PARENTHESIZED IDEOGRAPH RESOURCE */
- [0x323f, 0x323f], /* PARENTHESIZED IDEOGRAPH ALLIANCE */
- [0x3240, 0x3240], /* PARENTHESIZED IDEOGRAPH FESTIVAL */
- [0x3241, 0x3241], /* PARENTHESIZED IDEOGRAPH REST */
- [0x3242, 0x3242], /* PARENTHESIZED IDEOGRAPH SELF */
- [0x3243, 0x3243], /* PARENTHESIZED IDEOGRAPH REACH */
- [0x3244, 0x3244], /* CIRCLED IDEOGRAPH QUESTION */
- [0x3245, 0x3245], /* CIRCLED IDEOGRAPH KINDERGARTEN */
- [0x3246, 0x3246], /* CIRCLED IDEOGRAPH SCHOOL */
- [0x3247, 0x3247], /* CIRCLED IDEOGRAPH KOTO */
- [0x3248, 0x3248], /* CIRCLED NUMBER TEN ON BLACK SQUARE */
- [0x3249, 0x3249], /* CIRCLED NUMBER TWENTY ON BLACK SQUARE */
- [0x324a, 0x324a], /* CIRCLED NUMBER THIRTY ON BLACK SQUARE */
- [0x324b, 0x324b], /* CIRCLED NUMBER FORTY ON BLACK SQUARE */
- [0x324c, 0x324c], /* CIRCLED NUMBER FIFTY ON BLACK SQUARE */
- [0x324d, 0x324d], /* CIRCLED NUMBER SIXTY ON BLACK SQUARE */
- [0x324e, 0x324e], /* CIRCLED NUMBER SEVENTY ON BLACK SQUARE */
- [0x324f, 0x324f], /* CIRCLED NUMBER EIGHTY ON BLACK SQUARE */
- [0x3250, 0x3250], /* PARTNERSHIP SIGN */
- [0x3251, 0x3251], /* CIRCLED NUMBER TWENTY ONE */
- [0x3252, 0x3252], /* CIRCLED NUMBER TWENTY TWO */
- [0x3253, 0x3253], /* CIRCLED NUMBER TWENTY THREE */
- [0x3254, 0x3254], /* CIRCLED NUMBER TWENTY FOUR */
- [0x3255, 0x3255], /* CIRCLED NUMBER TWENTY FIVE */
- [0x3256, 0x3256], /* CIRCLED NUMBER TWENTY SIX */
- [0x3257, 0x3257], /* CIRCLED NUMBER TWENTY SEVEN */
- [0x3258, 0x3258], /* CIRCLED NUMBER TWENTY EIGHT */
- [0x3259, 0x3259], /* CIRCLED NUMBER TWENTY NINE */
- [0x325a, 0x325a], /* CIRCLED NUMBER THIRTY */
- [0x325b, 0x325b], /* CIRCLED NUMBER THIRTY ONE */
- [0x325c, 0x325c], /* CIRCLED NUMBER THIRTY TWO */
- [0x325d, 0x325d], /* CIRCLED NUMBER THIRTY THREE */
- [0x325e, 0x325e], /* CIRCLED NUMBER THIRTY FOUR */
- [0x325f, 0x325f], /* CIRCLED NUMBER THIRTY FIVE */
- [0x3260, 0x3260], /* CIRCLED HANGUL KIYEOK (CIRCLED HANGUL GIYEOG) */
- [0x3261, 0x3261], /* CIRCLED HANGUL NIEUN */
- [0x3262, 0x3262], /* CIRCLED HANGUL TIKEUT (CIRCLED HANGUL DIGEUD) */
- [0x3263, 0x3263], /* CIRCLED HANGUL RIEUL (CIRCLED HANGUL LIEUL) */
- [0x3264, 0x3264], /* CIRCLED HANGUL MIEUM */
- [0x3265, 0x3265], /* CIRCLED HANGUL PIEUP (CIRCLED HANGUL BIEUB) */
- [0x3266, 0x3266], /* CIRCLED HANGUL SIOS */
- [0x3267, 0x3267], /* CIRCLED HANGUL IEUNG */
- [0x3268, 0x3268], /* CIRCLED HANGUL CIEUC (CIRCLED HANGUL JIEUJ) */
- [0x3269, 0x3269], /* CIRCLED HANGUL CHIEUCH (CIRCLED HANGUL CIEUC) */
- [0x326a, 0x326a], /* CIRCLED HANGUL KHIEUKH (CIRCLED HANGUL KIYEOK) */
- [0x326b, 0x326b], /* CIRCLED HANGUL THIEUTH (CIRCLED HANGUL TIEUT) */
- [0x326c, 0x326c], /* CIRCLED HANGUL PHIEUPH (CIRCLED HANGUL PIEUP) */
- [0x326d, 0x326d], /* CIRCLED HANGUL HIEUH */
- [0x326e, 0x326e], /* CIRCLED HANGUL KIYEOK A (CIRCLED HANGUL GA) */
- [0x326f, 0x326f], /* CIRCLED HANGUL NIEUN A (CIRCLED HANGUL NA) */
- [0x3270, 0x3270], /* CIRCLED HANGUL TIKEUT A (CIRCLED HANGUL DA) */
- [0x3271, 0x3271], /* CIRCLED HANGUL RIEUL A (CIRCLED HANGUL LA) */
- [0x3272, 0x3272], /* CIRCLED HANGUL MIEUM A (CIRCLED HANGUL MA) */
- [0x3273, 0x3273], /* CIRCLED HANGUL PIEUP A (CIRCLED HANGUL BA) */
- [0x3274, 0x3274], /* CIRCLED HANGUL SIOS A (CIRCLED HANGUL SA) */
- [0x3275, 0x3275], /* CIRCLED HANGUL IEUNG A (CIRCLED HANGUL A) */
- [0x3276, 0x3276], /* CIRCLED HANGUL CIEUC A (CIRCLED HANGUL JA) */
- [0x3277, 0x3277], /* CIRCLED HANGUL CHIEUCH A (CIRCLED HANGUL CA) */
- [0x3278, 0x3278], /* CIRCLED HANGUL KHIEUKH A (CIRCLED HANGUL KA) */
- [0x3279, 0x3279], /* CIRCLED HANGUL THIEUTH A (CIRCLED HANGUL TA) */
- [0x327a, 0x327a], /* CIRCLED HANGUL PHIEUPH A (CIRCLED HANGUL PA) */
- [0x327b, 0x327b], /* CIRCLED HANGUL HIEUH A (CIRCLED HANGUL HA) */
- [0x327c, 0x327c], /* CIRCLED KOREAN CHARACTER CHAMKO */
- [0x327d, 0x327d], /* CIRCLED KOREAN CHARACTER JUEUI */
- [0x327e, 0x327e], /* CIRCLED HANGUL IEUNG U */
- [0x327f, 0x327f], /* KOREAN STANDARD SYMBOL */
- [0x3280, 0x3280], /* CIRCLED IDEOGRAPH ONE */
- [0x3281, 0x3281], /* CIRCLED IDEOGRAPH TWO */
- [0x3282, 0x3282], /* CIRCLED IDEOGRAPH THREE */
- [0x3283, 0x3283], /* CIRCLED IDEOGRAPH FOUR */
- [0x3284, 0x3284], /* CIRCLED IDEOGRAPH FIVE */
- [0x3285, 0x3285], /* CIRCLED IDEOGRAPH SIX */
- [0x3286, 0x3286], /* CIRCLED IDEOGRAPH SEVEN */
- [0x3287, 0x3287], /* CIRCLED IDEOGRAPH EIGHT */
- [0x3288, 0x3288], /* CIRCLED IDEOGRAPH NINE */
- [0x3289, 0x3289], /* CIRCLED IDEOGRAPH TEN */
- [0x328a, 0x328a], /* CIRCLED IDEOGRAPH MOON */
- [0x328b, 0x328b], /* CIRCLED IDEOGRAPH FIRE */
- [0x328c, 0x328c], /* CIRCLED IDEOGRAPH WATER */
- [0x328d, 0x328d], /* CIRCLED IDEOGRAPH WOOD */
- [0x328e, 0x328e], /* CIRCLED IDEOGRAPH METAL */
- [0x328f, 0x328f], /* CIRCLED IDEOGRAPH EARTH */
- [0x3290, 0x3290], /* CIRCLED IDEOGRAPH SUN */
- [0x3291, 0x3291], /* CIRCLED IDEOGRAPH STOCK */
- [0x3292, 0x3292], /* CIRCLED IDEOGRAPH HAVE */
- [0x3293, 0x3293], /* CIRCLED IDEOGRAPH SOCIETY */
- [0x3294, 0x3294], /* CIRCLED IDEOGRAPH NAME */
- [0x3295, 0x3295], /* CIRCLED IDEOGRAPH SPECIAL */
- [0x3296, 0x3296], /* CIRCLED IDEOGRAPH FINANCIAL */
- [0x3297, 0x3297], /* CIRCLED IDEOGRAPH CONGRATULATION */
- [0x3298, 0x3298], /* CIRCLED IDEOGRAPH LABOR */
- [0x3299, 0x3299], /* CIRCLED IDEOGRAPH SECRET */
- [0x329a, 0x329a], /* CIRCLED IDEOGRAPH MALE */
- [0x329b, 0x329b], /* CIRCLED IDEOGRAPH FEMALE */
- [0x329c, 0x329c], /* CIRCLED IDEOGRAPH SUITABLE */
- [0x329d, 0x329d], /* CIRCLED IDEOGRAPH EXCELLENT */
- [0x329e, 0x329e], /* CIRCLED IDEOGRAPH PRINT */
- [0x329f, 0x329f], /* CIRCLED IDEOGRAPH ATTENTION */
- [0x32a0, 0x32a0], /* CIRCLED IDEOGRAPH ITEM */
- [0x32a1, 0x32a1], /* CIRCLED IDEOGRAPH REST */
- [0x32a2, 0x32a2], /* CIRCLED IDEOGRAPH COPY */
- [0x32a3, 0x32a3], /* CIRCLED IDEOGRAPH CORRECT */
- [0x32a4, 0x32a4], /* CIRCLED IDEOGRAPH HIGH */
- [0x32a5, 0x32a5], /* CIRCLED IDEOGRAPH CENTRE (CIRCLED IDEOGRAPH CENTER) */
- [0x32a6, 0x32a6], /* CIRCLED IDEOGRAPH LOW */
- [0x32a7, 0x32a7], /* CIRCLED IDEOGRAPH LEFT */
- [0x32a8, 0x32a8], /* CIRCLED IDEOGRAPH RIGHT */
- [0x32a9, 0x32a9], /* CIRCLED IDEOGRAPH MEDICINE */
- [0x32aa, 0x32aa], /* CIRCLED IDEOGRAPH RELIGION */
- [0x32ab, 0x32ab], /* CIRCLED IDEOGRAPH STUDY */
- [0x32ac, 0x32ac], /* CIRCLED IDEOGRAPH SUPERVISE */
- [0x32ad, 0x32ad], /* CIRCLED IDEOGRAPH ENTERPRISE */
- [0x32ae, 0x32ae], /* CIRCLED IDEOGRAPH RESOURCE */
- [0x32af, 0x32af], /* CIRCLED IDEOGRAPH ALLIANCE */
- [0x32b0, 0x32b0], /* CIRCLED IDEOGRAPH NIGHT */
- [0x32b1, 0x32b1], /* CIRCLED NUMBER THIRTY SIX */
- [0x32b2, 0x32b2], /* CIRCLED NUMBER THIRTY SEVEN */
- [0x32b3, 0x32b3], /* CIRCLED NUMBER THIRTY EIGHT */
- [0x32b4, 0x32b4], /* CIRCLED NUMBER THIRTY NINE */
- [0x32b5, 0x32b5], /* CIRCLED NUMBER FORTY */
- [0x32b6, 0x32b6], /* CIRCLED NUMBER FORTY ONE */
- [0x32b7, 0x32b7], /* CIRCLED NUMBER FORTY TWO */
- [0x32b8, 0x32b8], /* CIRCLED NUMBER FORTY THREE */
- [0x32b9, 0x32b9], /* CIRCLED NUMBER FORTY FOUR */
- [0x32ba, 0x32ba], /* CIRCLED NUMBER FORTY FIVE */
- [0x32bb, 0x32bb], /* CIRCLED NUMBER FORTY SIX */
- [0x32bc, 0x32bc], /* CIRCLED NUMBER FORTY SEVEN */
- [0x32bd, 0x32bd], /* CIRCLED NUMBER FORTY EIGHT */
- [0x32be, 0x32be], /* CIRCLED NUMBER FORTY NINE */
- [0x32bf, 0x32bf], /* CIRCLED NUMBER FIFTY */
- [0x32c0, 0x32c0], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY */
- [0x32c1, 0x32c1], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY */
- [0x32c2, 0x32c2], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH */
- [0x32c3, 0x32c3], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL */
- [0x32c4, 0x32c4], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY */
- [0x32c5, 0x32c5], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE */
- [0x32c6, 0x32c6], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY */
- [0x32c7, 0x32c7], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST */
- [0x32c8, 0x32c8], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER */
- [0x32c9, 0x32c9], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER */
- [0x32ca, 0x32ca], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER */
- [0x32cb, 0x32cb], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER */
- [0x32cc, 0x32cc], /* SQUARE HG */
- [0x32cd, 0x32cd], /* SQUARE ERG */
- [0x32ce, 0x32ce], /* SQUARE EV */
- [0x32cf, 0x32cf], /* LIMITED LIABILITY SIGN */
- [0x32d0, 0x32d0], /* CIRCLED KATAKANA A */
- [0x32d1, 0x32d1], /* CIRCLED KATAKANA I */
- [0x32d2, 0x32d2], /* CIRCLED KATAKANA U */
- [0x32d3, 0x32d3], /* CIRCLED KATAKANA E */
- [0x32d4, 0x32d4], /* CIRCLED KATAKANA O */
- [0x32d5, 0x32d5], /* CIRCLED KATAKANA KA */
- [0x32d6, 0x32d6], /* CIRCLED KATAKANA KI */
- [0x32d7, 0x32d7], /* CIRCLED KATAKANA KU */
- [0x32d8, 0x32d8], /* CIRCLED KATAKANA KE */
- [0x32d9, 0x32d9], /* CIRCLED KATAKANA KO */
- [0x32da, 0x32da], /* CIRCLED KATAKANA SA */
- [0x32db, 0x32db], /* CIRCLED KATAKANA SI */
- [0x32dc, 0x32dc], /* CIRCLED KATAKANA SU */
- [0x32dd, 0x32dd], /* CIRCLED KATAKANA SE */
- [0x32de, 0x32de], /* CIRCLED KATAKANA SO */
- [0x32df, 0x32df], /* CIRCLED KATAKANA TA */
- [0x32e0, 0x32e0], /* CIRCLED KATAKANA TI */
- [0x32e1, 0x32e1], /* CIRCLED KATAKANA TU */
- [0x32e2, 0x32e2], /* CIRCLED KATAKANA TE */
- [0x32e3, 0x32e3], /* CIRCLED KATAKANA TO */
- [0x32e4, 0x32e4], /* CIRCLED KATAKANA NA */
- [0x32e5, 0x32e5], /* CIRCLED KATAKANA NI */
- [0x32e6, 0x32e6], /* CIRCLED KATAKANA NU */
- [0x32e7, 0x32e7], /* CIRCLED KATAKANA NE */
- [0x32e8, 0x32e8], /* CIRCLED KATAKANA NO */
- [0x32e9, 0x32e9], /* CIRCLED KATAKANA HA */
- [0x32ea, 0x32ea], /* CIRCLED KATAKANA HI */
- [0x32eb, 0x32eb], /* CIRCLED KATAKANA HU */
- [0x32ec, 0x32ec], /* CIRCLED KATAKANA HE */
- [0x32ed, 0x32ed], /* CIRCLED KATAKANA HO */
- [0x32ee, 0x32ee], /* CIRCLED KATAKANA MA */
- [0x32ef, 0x32ef], /* CIRCLED KATAKANA MI */
- [0x32f0, 0x32f0], /* CIRCLED KATAKANA MU */
- [0x32f1, 0x32f1], /* CIRCLED KATAKANA ME */
- [0x32f2, 0x32f2], /* CIRCLED KATAKANA MO */
- [0x32f3, 0x32f3], /* CIRCLED KATAKANA YA */
- [0x32f4, 0x32f4], /* CIRCLED KATAKANA YU */
- [0x32f5, 0x32f5], /* CIRCLED KATAKANA YO */
- [0x32f6, 0x32f6], /* CIRCLED KATAKANA RA */
- [0x32f7, 0x32f7], /* CIRCLED KATAKANA RI */
- [0x32f8, 0x32f8], /* CIRCLED KATAKANA RU */
- [0x32f9, 0x32f9], /* CIRCLED KATAKANA RE */
- [0x32fa, 0x32fa], /* CIRCLED KATAKANA RO */
- [0x32fb, 0x32fb], /* CIRCLED KATAKANA WA */
- [0x32fc, 0x32fc], /* CIRCLED KATAKANA WI */
- [0x32fd, 0x32fd], /* CIRCLED KATAKANA WE */
- [0x32fe, 0x32fe], /* CIRCLED KATAKANA WO */
- [0x32ff, 0x32ff],
- [0x3300, 0x3300], /* SQUARE APAATO (SQUARED APAATO) */
- [0x3301, 0x3301], /* SQUARE ARUHUA (SQUARED ARUHUA) */
- [0x3302, 0x3302], /* SQUARE ANPEA (SQUARED ANPEA) */
- [0x3303, 0x3303], /* SQUARE AARU (SQUARED AARU) */
- [0x3304, 0x3304], /* SQUARE ININGU (SQUARED ININGU) */
- [0x3305, 0x3305], /* SQUARE INTI (SQUARED INTI) */
- [0x3306, 0x3306], /* SQUARE UON (SQUARED UON) */
- [0x3307, 0x3307], /* SQUARE ESUKUUDO (SQUARED ESUKUUDO) */
- [0x3308, 0x3308], /* SQUARE EEKAA (SQUARED EEKAA) */
- [0x3309, 0x3309], /* SQUARE ONSU (SQUARED ONSU) */
- [0x330a, 0x330a], /* SQUARE OOMU (SQUARED OOMU) */
- [0x330b, 0x330b], /* SQUARE KAIRI (SQUARED KAIRI) */
- [0x330c, 0x330c], /* SQUARE KARATTO (SQUARED KARATTO) */
- [0x330d, 0x330d], /* SQUARE KARORII (SQUARED KARORII) */
- [0x330e, 0x330e], /* SQUARE GARON (SQUARED GARON) */
- [0x330f, 0x330f], /* SQUARE GANMA (SQUARED GANMA) */
- [0x3310, 0x3310], /* SQUARE GIGA (SQUARED GIGA) */
- [0x3311, 0x3311], /* SQUARE GINII (SQUARED GINII) */
- [0x3312, 0x3312], /* SQUARE KYURII (SQUARED KYURII) */
- [0x3313, 0x3313], /* SQUARE GIRUDAA (SQUARED GIRUDAA) */
- [0x3314, 0x3314], /* SQUARE KIRO (SQUARED KIRO) */
- [0x3315, 0x3315], /* SQUARE KIROGURAMU (SQUARED KIROGURAMU) */
- [0x3316, 0x3316], /* SQUARE KIROMEETORU (SQUARED KIROMEETORU) */
- [0x3317, 0x3317], /* SQUARE KIROWATTO (SQUARED KIROWATTO) */
- [0x3318, 0x3318], /* SQUARE GURAMU (SQUARED GURAMU) */
- [0x3319, 0x3319], /* SQUARE GURAMUTON (SQUARED GURAMUTON) */
- [0x331a, 0x331a], /* SQUARE KURUZEIRO (SQUARED KURUZEIRO) */
- [0x331b, 0x331b], /* SQUARE KUROONE (SQUARED KUROONE) */
- [0x331c, 0x331c], /* SQUARE KEESU (SQUARED KEESU) */
- [0x331d, 0x331d], /* SQUARE KORUNA (SQUARED KORUNA) */
- [0x331e, 0x331e], /* SQUARE KOOPO (SQUARED KOOPO) */
- [0x331f, 0x331f], /* SQUARE SAIKURU (SQUARED SAIKURU) */
- [0x3320, 0x3320], /* SQUARE SANTIIMU (SQUARED SANTIIMU) */
- [0x3321, 0x3321], /* SQUARE SIRINGU (SQUARED SIRINGU) */
- [0x3322, 0x3322], /* SQUARE SENTI (SQUARED SENTI) */
- [0x3323, 0x3323], /* SQUARE SENTO (SQUARED SENTO) */
- [0x3324, 0x3324], /* SQUARE DAASU (SQUARED DAASU) */
- [0x3325, 0x3325], /* SQUARE DESI (SQUARED DESI) */
- [0x3326, 0x3326], /* SQUARE DORU (SQUARED DORU) */
- [0x3327, 0x3327], /* SQUARE TON (SQUARED TON) */
- [0x3328, 0x3328], /* SQUARE NANO (SQUARED NANO) */
- [0x3329, 0x3329], /* SQUARE NOTTO (SQUARED NOTTO) */
- [0x332a, 0x332a], /* SQUARE HAITU (SQUARED HAITU) */
- [0x332b, 0x332b], /* SQUARE PAASENTO (SQUARED PAASENTO) */
- [0x332c, 0x332c], /* SQUARE PAATU (SQUARED PAATU) */
- [0x332d, 0x332d], /* SQUARE BAARERU (SQUARED BAARERU) */
- [0x332e, 0x332e], /* SQUARE PIASUTORU (SQUARED PIASUTORU) */
- [0x332f, 0x332f], /* SQUARE PIKURU (SQUARED PIKURU) */
- [0x3330, 0x3330], /* SQUARE PIKO (SQUARED PIKO) */
- [0x3331, 0x3331], /* SQUARE BIRU (SQUARED BIRU) */
- [0x3332, 0x3332], /* SQUARE HUARADDO (SQUARED HUARADDO) */
- [0x3333, 0x3333], /* SQUARE HUIITO (SQUARED HUIITO) */
- [0x3334, 0x3334], /* SQUARE BUSSYERU (SQUARED BUSSYERU) */
- [0x3335, 0x3335], /* SQUARE HURAN (SQUARED HURAN) */
- [0x3336, 0x3336], /* SQUARE HEKUTAARU (SQUARED HEKUTAARU) */
- [0x3337, 0x3337], /* SQUARE PESO (SQUARED PESO) */
- [0x3338, 0x3338], /* SQUARE PENIHI (SQUARED PENIHI) */
- [0x3339, 0x3339], /* SQUARE HERUTU (SQUARED HERUTU) */
- [0x333a, 0x333a], /* SQUARE PENSU (SQUARED PENSU) */
- [0x333b, 0x333b], /* SQUARE PEEZI (SQUARED PEEZI) */
- [0x333c, 0x333c], /* SQUARE BEETA (SQUARED BEETA) */
- [0x333d, 0x333d], /* SQUARE POINTO (SQUARED POINTO) */
- [0x333e, 0x333e], /* SQUARE BORUTO (SQUARED BORUTO) */
- [0x333f, 0x333f], /* SQUARE HON (SQUARED HON) */
- [0x3340, 0x3340], /* SQUARE PONDO (SQUARED PONDO) */
- [0x3341, 0x3341], /* SQUARE HOORU (SQUARED HOORU) */
- [0x3342, 0x3342], /* SQUARE HOON (SQUARED HOON) */
- [0x3343, 0x3343], /* SQUARE MAIKURO (SQUARED MAIKURO) */
- [0x3344, 0x3344], /* SQUARE MAIRU (SQUARED MAIRU) */
- [0x3345, 0x3345], /* SQUARE MAHHA (SQUARED MAHHA) */
- [0x3346, 0x3346], /* SQUARE MARUKU (SQUARED MARUKU) */
- [0x3347, 0x3347], /* SQUARE MANSYON (SQUARED MANSYON) */
- [0x3348, 0x3348], /* SQUARE MIKURON (SQUARED MIKURON) */
- [0x3349, 0x3349], /* SQUARE MIRI (SQUARED MIRI) */
- [0x334a, 0x334a], /* SQUARE MIRIBAARU (SQUARED MIRIBAARU) */
- [0x334b, 0x334b], /* SQUARE MEGA (SQUARED MEGA) */
- [0x334c, 0x334c], /* SQUARE MEGATON (SQUARED MEGATON) */
- [0x334d, 0x334d], /* SQUARE MEETORU (SQUARED MEETORU) */
- [0x334e, 0x334e], /* SQUARE YAADO (SQUARED YAADO) */
- [0x334f, 0x334f], /* SQUARE YAARU (SQUARED YAARU) */
- [0x3350, 0x3350], /* SQUARE YUAN (SQUARED YUAN) */
- [0x3351, 0x3351], /* SQUARE RITTORU (SQUARED RITTORU) */
- [0x3352, 0x3352], /* SQUARE RIRA (SQUARED RIRA) */
- [0x3353, 0x3353], /* SQUARE RUPII (SQUARED RUPII) */
- [0x3354, 0x3354], /* SQUARE RUUBURU (SQUARED RUUBURU) */
- [0x3355, 0x3355], /* SQUARE REMU (SQUARED REMU) */
- [0x3356, 0x3356], /* SQUARE RENTOGEN (SQUARED RENTOGEN) */
- [0x3357, 0x3357], /* SQUARE WATTO (SQUARED WATTO) */
- [0x3358, 0x3358], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO */
- [0x3359, 0x3359], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE */
- [0x335a, 0x335a], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO */
- [0x335b, 0x335b], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE */
- [0x335c, 0x335c], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR */
- [0x335d, 0x335d], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE */
- [0x335e, 0x335e], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX */
- [0x335f, 0x335f], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN */
- [0x3360, 0x3360], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT */
- [0x3361, 0x3361], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE */
- [0x3362, 0x3362], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN */
- [0x3363, 0x3363], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN */
- [0x3364, 0x3364], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE */
- [0x3365, 0x3365], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN */
- [0x3366, 0x3366], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN */
- [0x3367, 0x3367], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN */
- [0x3368, 0x3368], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN */
- [0x3369, 0x3369], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN */
- [0x336a, 0x336a], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN */
- [0x336b, 0x336b], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN */
- [0x336c, 0x336c], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY */
- [0x336d, 0x336d], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE */
- [0x336e, 0x336e], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO */
- [0x336f, 0x336f], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE */
- [0x3370, 0x3370], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR */
- [0x3371, 0x3371], /* SQUARE HPA */
- [0x3372, 0x3372], /* SQUARE DA */
- [0x3373, 0x3373], /* SQUARE AU */
- [0x3374, 0x3374], /* SQUARE BAR */
- [0x3375, 0x3375], /* SQUARE OV */
- [0x3376, 0x3376], /* SQUARE PC */
- [0x3377, 0x3377], /* SQUARE DM */
- [0x3378, 0x3378], /* SQUARE DM SQUARED */
- [0x3379, 0x3379], /* SQUARE DM CUBED */
- [0x337a, 0x337a], /* SQUARE IU */
- [0x337b, 0x337b], /* SQUARE ERA NAME HEISEI (SQUARED TWO IDEOGRAPHS ERA NAME HEISEI) */
- [0x337c, 0x337c], /* SQUARE ERA NAME SYOUWA (SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA) */
- [0x337d, 0x337d], /* SQUARE ERA NAME TAISYOU (SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU) */
- [0x337e, 0x337e], /* SQUARE ERA NAME MEIZI (SQUARED TWO IDEOGRAPHS ERA NAME MEIZI) */
- [0x337f, 0x337f], /* SQUARE CORPORATION (SQUARED FOUR IDEOGRAPHS CORPORATION) */
- [0x3380, 0x3380], /* SQUARE PA AMPS (SQUARED PA AMPS) */
- [0x3381, 0x3381], /* SQUARE NA (SQUARED NA) */
- [0x3382, 0x3382], /* SQUARE MU A (SQUARED MU A) */
- [0x3383, 0x3383], /* SQUARE MA (SQUARED MA) */
- [0x3384, 0x3384], /* SQUARE KA (SQUARED KA) */
- [0x3385, 0x3385], /* SQUARE KB (SQUARED KB) */
- [0x3386, 0x3386], /* SQUARE MB (SQUARED MB) */
- [0x3387, 0x3387], /* SQUARE GB (SQUARED GB) */
- [0x3388, 0x3388], /* SQUARE CAL (SQUARED CAL) */
- [0x3389, 0x3389], /* SQUARE KCAL (SQUARED KCAL) */
- [0x338a, 0x338a], /* SQUARE PF (SQUARED PF) */
- [0x338b, 0x338b], /* SQUARE NF (SQUARED NF) */
- [0x338c, 0x338c], /* SQUARE MU F (SQUARED MU F) */
- [0x338d, 0x338d], /* SQUARE MU G (SQUARED MU G) */
- [0x338e, 0x338e], /* SQUARE MG (SQUARED MG) */
- [0x338f, 0x338f], /* SQUARE KG (SQUARED KG) */
- [0x3390, 0x3390], /* SQUARE HZ (SQUARED HZ) */
- [0x3391, 0x3391], /* SQUARE KHZ (SQUARED KHZ) */
- [0x3392, 0x3392], /* SQUARE MHZ (SQUARED MHZ) */
- [0x3393, 0x3393], /* SQUARE GHZ (SQUARED GHZ) */
- [0x3394, 0x3394], /* SQUARE THZ (SQUARED THZ) */
- [0x3395, 0x3395], /* SQUARE MU L (SQUARED MU L) */
- [0x3396, 0x3396], /* SQUARE ML (SQUARED ML) */
- [0x3397, 0x3397], /* SQUARE DL (SQUARED DL) */
- [0x3398, 0x3398], /* SQUARE KL (SQUARED KL) */
- [0x3399, 0x3399], /* SQUARE FM (SQUARED FM) */
- [0x339a, 0x339a], /* SQUARE NM (SQUARED NM) */
- [0x339b, 0x339b], /* SQUARE MU M (SQUARED MU M) */
- [0x339c, 0x339c], /* SQUARE MM (SQUARED MM) */
- [0x339d, 0x339d], /* SQUARE CM (SQUARED CM) */
- [0x339e, 0x339e], /* SQUARE KM (SQUARED KM) */
- [0x339f, 0x339f], /* SQUARE MM SQUARED (SQUARED MM SQUARED) */
- [0x33a0, 0x33a0], /* SQUARE CM SQUARED (SQUARED CM SQUARED) */
- [0x33a1, 0x33a1], /* SQUARE M SQUARED (SQUARED M SQUARED) */
- [0x33a2, 0x33a2], /* SQUARE KM SQUARED (SQUARED KM SQUARED) */
- [0x33a3, 0x33a3], /* SQUARE MM CUBED (SQUARED MM CUBED) */
- [0x33a4, 0x33a4], /* SQUARE CM CUBED (SQUARED CM CUBED) */
- [0x33a5, 0x33a5], /* SQUARE M CUBED (SQUARED M CUBED) */
- [0x33a6, 0x33a6], /* SQUARE KM CUBED (SQUARED KM CUBED) */
- [0x33a7, 0x33a7], /* SQUARE M OVER S (SQUARED M OVER S) */
- [0x33a8, 0x33a8], /* SQUARE M OVER S SQUARED (SQUARED M OVER S SQUARED) */
- [0x33a9, 0x33a9], /* SQUARE PA (SQUARED PA) */
- [0x33aa, 0x33aa], /* SQUARE KPA (SQUARED KPA) */
- [0x33ab, 0x33ab], /* SQUARE MPA (SQUARED MPA) */
- [0x33ac, 0x33ac], /* SQUARE GPA (SQUARED GPA) */
- [0x33ad, 0x33ad], /* SQUARE RAD (SQUARED RAD) */
- [0x33ae, 0x33ae], /* SQUARE RAD OVER S (SQUARED RAD OVER S) */
- [0x33af, 0x33af], /* SQUARE RAD OVER S SQUARED (SQUARED RAD OVER S SQUARED) */
- [0x33b0, 0x33b0], /* SQUARE PS (SQUARED PS) */
- [0x33b1, 0x33b1], /* SQUARE NS (SQUARED NS) */
- [0x33b2, 0x33b2], /* SQUARE MU S (SQUARED MU S) */
- [0x33b3, 0x33b3], /* SQUARE MS (SQUARED MS) */
- [0x33b4, 0x33b4], /* SQUARE PV (SQUARED PV) */
- [0x33b5, 0x33b5], /* SQUARE NV (SQUARED NV) */
- [0x33b6, 0x33b6], /* SQUARE MU V (SQUARED MU V) */
- [0x33b7, 0x33b7], /* SQUARE MV (SQUARED MV) */
- [0x33b8, 0x33b8], /* SQUARE KV (SQUARED KV) */
- [0x33b9, 0x33b9], /* SQUARE MV MEGA (SQUARED MV MEGA) */
- [0x33ba, 0x33ba], /* SQUARE PW (SQUARED PW) */
- [0x33bb, 0x33bb], /* SQUARE NW (SQUARED NW) */
- [0x33bc, 0x33bc], /* SQUARE MU W (SQUARED MU W) */
- [0x33bd, 0x33bd], /* SQUARE MW (SQUARED MW) */
- [0x33be, 0x33be], /* SQUARE KW (SQUARED KW) */
- [0x33bf, 0x33bf], /* SQUARE MW MEGA (SQUARED MW MEGA) */
- [0x33c0, 0x33c0], /* SQUARE K OHM (SQUARED K OHM) */
- [0x33c1, 0x33c1], /* SQUARE M OHM (SQUARED M OHM) */
- [0x33c2, 0x33c2], /* SQUARE AM (SQUARED AM) */
- [0x33c3, 0x33c3], /* SQUARE BQ (SQUARED BQ) */
- [0x33c4, 0x33c4], /* SQUARE CC (SQUARED CC) */
- [0x33c5, 0x33c5], /* SQUARE CD (SQUARED CD) */
- [0x33c6, 0x33c6], /* SQUARE C OVER KG (SQUARED C OVER KG) */
- [0x33c7, 0x33c7], /* SQUARE CO (SQUARED CO) */
- [0x33c8, 0x33c8], /* SQUARE DB (SQUARED DB) */
- [0x33c9, 0x33c9], /* SQUARE GY (SQUARED GY) */
- [0x33ca, 0x33ca], /* SQUARE HA (SQUARED HA) */
- [0x33cb, 0x33cb], /* SQUARE HP (SQUARED HP) */
- [0x33cc, 0x33cc], /* SQUARE IN (SQUARED IN) */
- [0x33cd, 0x33cd], /* SQUARE KK (SQUARED KK) */
- [0x33ce, 0x33ce], /* SQUARE KM CAPITAL (SQUARED KM CAPITAL) */
- [0x33cf, 0x33cf], /* SQUARE KT (SQUARED KT) */
- [0x33d0, 0x33d0], /* SQUARE LM (SQUARED LM) */
- [0x33d1, 0x33d1], /* SQUARE LN (SQUARED LN) */
- [0x33d2, 0x33d2], /* SQUARE LOG (SQUARED LOG) */
- [0x33d3, 0x33d3], /* SQUARE LX (SQUARED LX) */
- [0x33d4, 0x33d4], /* SQUARE MB SMALL (SQUARED MB SMALL) */
- [0x33d5, 0x33d5], /* SQUARE MIL (SQUARED MIL) */
- [0x33d6, 0x33d6], /* SQUARE MOL (SQUARED MOL) */
- [0x33d7, 0x33d7], /* SQUARE PH (SQUARED PH) */
- [0x33d8, 0x33d8], /* SQUARE PM (SQUARED PM) */
- [0x33d9, 0x33d9], /* SQUARE PPM (SQUARED PPM) */
- [0x33da, 0x33da], /* SQUARE PR (SQUARED PR) */
- [0x33db, 0x33db], /* SQUARE SR (SQUARED SR) */
- [0x33dc, 0x33dc], /* SQUARE SV (SQUARED SV) */
- [0x33dd, 0x33dd], /* SQUARE WB (SQUARED WB) */
- [0x33de, 0x33de], /* SQUARE V OVER M */
- [0x33df, 0x33df], /* SQUARE A OVER M */
- [0x33e0, 0x33e0], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE */
- [0x33e1, 0x33e1], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO */
- [0x33e2, 0x33e2], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE */
- [0x33e3, 0x33e3], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR */
- [0x33e4, 0x33e4], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE */
- [0x33e5, 0x33e5], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX */
- [0x33e6, 0x33e6], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN */
- [0x33e7, 0x33e7], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT */
- [0x33e8, 0x33e8], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE */
- [0x33e9, 0x33e9], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN */
- [0x33ea, 0x33ea], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN */
- [0x33eb, 0x33eb], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE */
- [0x33ec, 0x33ec], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN */
- [0x33ed, 0x33ed], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN */
- [0x33ee, 0x33ee], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN */
- [0x33ef, 0x33ef], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN */
- [0x33f0, 0x33f0], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN */
- [0x33f1, 0x33f1], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN */
- [0x33f2, 0x33f2], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN */
- [0x33f3, 0x33f3], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY */
- [0x33f4, 0x33f4], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE */
- [0x33f5, 0x33f5], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO */
- [0x33f6, 0x33f6], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE */
- [0x33f7, 0x33f7], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR */
- [0x33f8, 0x33f8], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE */
- [0x33f9, 0x33f9], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX */
- [0x33fa, 0x33fa], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN */
- [0x33fb, 0x33fb], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT */
- [0x33fc, 0x33fc], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE */
- [0x33fd, 0x33fd], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY */
- [0x33fe, 0x33fe], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE */
- [0x33ff, 0x33ff], /* SQUARE GAL */
- [0x3400, 0x3400], /* CJK Ideograph Extension A */
- [0x3401, 0x3401], /* CJK Ideograph Extension A */
- [0x3402, 0x3402], /* CJK Ideograph Extension A */
- [0x3403, 0x3403], /* CJK Ideograph Extension A */
- [0x3404, 0x3404], /* CJK Ideograph Extension A */
- [0x3405, 0x3405], /* CJK Ideograph Extension A */
- [0x3406, 0x3406], /* CJK Ideograph Extension A */
- [0x3407, 0x3407], /* CJK Ideograph Extension A */
- [0x3408, 0x3408], /* CJK Ideograph Extension A */
- [0x3409, 0x3409], /* CJK Ideograph Extension A */
- [0x340a, 0x340a], /* CJK Ideograph Extension A */
- [0x340b, 0x340b], /* CJK Ideograph Extension A */
- [0x340c, 0x340c], /* CJK Ideograph Extension A */
- [0x340d, 0x340d], /* CJK Ideograph Extension A */
- [0x340e, 0x340e], /* CJK Ideograph Extension A */
- [0x340f, 0x340f], /* CJK Ideograph Extension A */
- [0x3410, 0x3410], /* CJK Ideograph Extension A */
- [0x3411, 0x3411], /* CJK Ideograph Extension A */
- [0x3412, 0x3412], /* CJK Ideograph Extension A */
- [0x3413, 0x3413], /* CJK Ideograph Extension A */
- [0x3414, 0x3414], /* CJK Ideograph Extension A */
- [0x3415, 0x3415], /* CJK Ideograph Extension A */
- [0x3416, 0x3416], /* CJK Ideograph Extension A */
- [0x3417, 0x3417], /* CJK Ideograph Extension A */
- [0x3418, 0x3418], /* CJK Ideograph Extension A */
- [0x3419, 0x3419], /* CJK Ideograph Extension A */
- [0x341a, 0x341a], /* CJK Ideograph Extension A */
- [0x341b, 0x341b], /* CJK Ideograph Extension A */
- [0x341c, 0x341c], /* CJK Ideograph Extension A */
- [0x341d, 0x341d], /* CJK Ideograph Extension A */
- [0x341e, 0x341e], /* CJK Ideograph Extension A */
- [0x341f, 0x341f], /* CJK Ideograph Extension A */
- [0x3420, 0x3420], /* CJK Ideograph Extension A */
- [0x3421, 0x3421], /* CJK Ideograph Extension A */
- [0x3422, 0x3422], /* CJK Ideograph Extension A */
- [0x3423, 0x3423], /* CJK Ideograph Extension A */
- [0x3424, 0x3424], /* CJK Ideograph Extension A */
- [0x3425, 0x3425], /* CJK Ideograph Extension A */
- [0x3426, 0x3426], /* CJK Ideograph Extension A */
- [0x3427, 0x3427], /* CJK Ideograph Extension A */
- [0x3428, 0x3428], /* CJK Ideograph Extension A */
- [0x3429, 0x3429], /* CJK Ideograph Extension A */
- [0x342a, 0x342a], /* CJK Ideograph Extension A */
- [0x342b, 0x342b], /* CJK Ideograph Extension A */
- [0x342c, 0x342c], /* CJK Ideograph Extension A */
- [0x342d, 0x342d], /* CJK Ideograph Extension A */
- [0x342e, 0x342e], /* CJK Ideograph Extension A */
- [0x342f, 0x342f], /* CJK Ideograph Extension A */
- [0x3430, 0x3430], /* CJK Ideograph Extension A */
- [0x3431, 0x3431], /* CJK Ideograph Extension A */
- [0x3432, 0x3432], /* CJK Ideograph Extension A */
- [0x3433, 0x3433], /* CJK Ideograph Extension A */
- [0x3434, 0x3434], /* CJK Ideograph Extension A */
- [0x3435, 0x3435], /* CJK Ideograph Extension A */
- [0x3436, 0x3436], /* CJK Ideograph Extension A */
- [0x3437, 0x3437], /* CJK Ideograph Extension A */
- [0x3438, 0x3438], /* CJK Ideograph Extension A */
- [0x3439, 0x3439], /* CJK Ideograph Extension A */
- [0x343a, 0x343a], /* CJK Ideograph Extension A */
- [0x343b, 0x343b], /* CJK Ideograph Extension A */
- [0x343c, 0x343c], /* CJK Ideograph Extension A */
- [0x343d, 0x343d], /* CJK Ideograph Extension A */
- [0x343e, 0x343e], /* CJK Ideograph Extension A */
- [0x343f, 0x343f], /* CJK Ideograph Extension A */
- [0x3440, 0x3440], /* CJK Ideograph Extension A */
- [0x3441, 0x3441], /* CJK Ideograph Extension A */
- [0x3442, 0x3442], /* CJK Ideograph Extension A */
- [0x3443, 0x3443], /* CJK Ideograph Extension A */
- [0x3444, 0x3444], /* CJK Ideograph Extension A */
- [0x3445, 0x3445], /* CJK Ideograph Extension A */
- [0x3446, 0x3446], /* CJK Ideograph Extension A */
- [0x3447, 0x3447], /* CJK Ideograph Extension A */
- [0x3448, 0x3448], /* CJK Ideograph Extension A */
- [0x3449, 0x3449], /* CJK Ideograph Extension A */
- [0x344a, 0x344a], /* CJK Ideograph Extension A */
- [0x344b, 0x344b], /* CJK Ideograph Extension A */
- [0x344c, 0x344c], /* CJK Ideograph Extension A */
- [0x344d, 0x344d], /* CJK Ideograph Extension A */
- [0x344e, 0x344e], /* CJK Ideograph Extension A */
- [0x344f, 0x344f], /* CJK Ideograph Extension A */
- [0x3450, 0x3450], /* CJK Ideograph Extension A */
- [0x3451, 0x3451], /* CJK Ideograph Extension A */
- [0x3452, 0x3452], /* CJK Ideograph Extension A */
- [0x3453, 0x3453], /* CJK Ideograph Extension A */
- [0x3454, 0x3454], /* CJK Ideograph Extension A */
- [0x3455, 0x3455], /* CJK Ideograph Extension A */
- [0x3456, 0x3456], /* CJK Ideograph Extension A */
- [0x3457, 0x3457], /* CJK Ideograph Extension A */
- [0x3458, 0x3458], /* CJK Ideograph Extension A */
- [0x3459, 0x3459], /* CJK Ideograph Extension A */
- [0x345a, 0x345a], /* CJK Ideograph Extension A */
- [0x345b, 0x345b], /* CJK Ideograph Extension A */
- [0x345c, 0x345c], /* CJK Ideograph Extension A */
- [0x345d, 0x345d], /* CJK Ideograph Extension A */
- [0x345e, 0x345e], /* CJK Ideograph Extension A */
- [0x345f, 0x345f], /* CJK Ideograph Extension A */
- [0x3460, 0x3460], /* CJK Ideograph Extension A */
- [0x3461, 0x3461], /* CJK Ideograph Extension A */
- [0x3462, 0x3462], /* CJK Ideograph Extension A */
- [0x3463, 0x3463], /* CJK Ideograph Extension A */
- [0x3464, 0x3464], /* CJK Ideograph Extension A */
- [0x3465, 0x3465], /* CJK Ideograph Extension A */
- [0x3466, 0x3466], /* CJK Ideograph Extension A */
- [0x3467, 0x3467], /* CJK Ideograph Extension A */
- [0x3468, 0x3468], /* CJK Ideograph Extension A */
- [0x3469, 0x3469], /* CJK Ideograph Extension A */
- [0x346a, 0x346a], /* CJK Ideograph Extension A */
- [0x346b, 0x346b], /* CJK Ideograph Extension A */
- [0x346c, 0x346c], /* CJK Ideograph Extension A */
- [0x346d, 0x346d], /* CJK Ideograph Extension A */
- [0x346e, 0x346e], /* CJK Ideograph Extension A */
- [0x346f, 0x346f], /* CJK Ideograph Extension A */
- [0x3470, 0x3470], /* CJK Ideograph Extension A */
- [0x3471, 0x3471], /* CJK Ideograph Extension A */
- [0x3472, 0x3472], /* CJK Ideograph Extension A */
- [0x3473, 0x3473], /* CJK Ideograph Extension A */
- [0x3474, 0x3474], /* CJK Ideograph Extension A */
- [0x3475, 0x3475], /* CJK Ideograph Extension A */
- [0x3476, 0x3476], /* CJK Ideograph Extension A */
- [0x3477, 0x3477], /* CJK Ideograph Extension A */
- [0x3478, 0x3478], /* CJK Ideograph Extension A */
- [0x3479, 0x3479], /* CJK Ideograph Extension A */
- [0x347a, 0x347a], /* CJK Ideograph Extension A */
- [0x347b, 0x347b], /* CJK Ideograph Extension A */
- [0x347c, 0x347c], /* CJK Ideograph Extension A */
- [0x347d, 0x347d], /* CJK Ideograph Extension A */
- [0x347e, 0x347e], /* CJK Ideograph Extension A */
- [0x347f, 0x347f], /* CJK Ideograph Extension A */
- [0x3480, 0x3480], /* CJK Ideograph Extension A */
- [0x3481, 0x3481], /* CJK Ideograph Extension A */
- [0x3482, 0x3482], /* CJK Ideograph Extension A */
- [0x3483, 0x3483], /* CJK Ideograph Extension A */
- [0x3484, 0x3484], /* CJK Ideograph Extension A */
- [0x3485, 0x3485], /* CJK Ideograph Extension A */
- [0x3486, 0x3486], /* CJK Ideograph Extension A */
- [0x3487, 0x3487], /* CJK Ideograph Extension A */
- [0x3488, 0x3488], /* CJK Ideograph Extension A */
- [0x3489, 0x3489], /* CJK Ideograph Extension A */
- [0x348a, 0x348a], /* CJK Ideograph Extension A */
- [0x348b, 0x348b], /* CJK Ideograph Extension A */
- [0x348c, 0x348c], /* CJK Ideograph Extension A */
- [0x348d, 0x348d], /* CJK Ideograph Extension A */
- [0x348e, 0x348e], /* CJK Ideograph Extension A */
- [0x348f, 0x348f], /* CJK Ideograph Extension A */
- [0x3490, 0x3490], /* CJK Ideograph Extension A */
- [0x3491, 0x3491], /* CJK Ideograph Extension A */
- [0x3492, 0x3492], /* CJK Ideograph Extension A */
- [0x3493, 0x3493], /* CJK Ideograph Extension A */
- [0x3494, 0x3494], /* CJK Ideograph Extension A */
- [0x3495, 0x3495], /* CJK Ideograph Extension A */
- [0x3496, 0x3496], /* CJK Ideograph Extension A */
- [0x3497, 0x3497], /* CJK Ideograph Extension A */
- [0x3498, 0x3498], /* CJK Ideograph Extension A */
- [0x3499, 0x3499], /* CJK Ideograph Extension A */
- [0x349a, 0x349a], /* CJK Ideograph Extension A */
- [0x349b, 0x349b], /* CJK Ideograph Extension A */
- [0x349c, 0x349c], /* CJK Ideograph Extension A */
- [0x349d, 0x349d], /* CJK Ideograph Extension A */
- [0x349e, 0x349e], /* CJK Ideograph Extension A */
- [0x349f, 0x349f], /* CJK Ideograph Extension A */
- [0x34a0, 0x34a0], /* CJK Ideograph Extension A */
- [0x34a1, 0x34a1], /* CJK Ideograph Extension A */
- [0x34a2, 0x34a2], /* CJK Ideograph Extension A */
- [0x34a3, 0x34a3], /* CJK Ideograph Extension A */
- [0x34a4, 0x34a4], /* CJK Ideograph Extension A */
- [0x34a5, 0x34a5], /* CJK Ideograph Extension A */
- [0x34a6, 0x34a6], /* CJK Ideograph Extension A */
- [0x34a7, 0x34a7], /* CJK Ideograph Extension A */
- [0x34a8, 0x34a8], /* CJK Ideograph Extension A */
- [0x34a9, 0x34a9], /* CJK Ideograph Extension A */
- [0x34aa, 0x34aa], /* CJK Ideograph Extension A */
- [0x34ab, 0x34ab], /* CJK Ideograph Extension A */
- [0x34ac, 0x34ac], /* CJK Ideograph Extension A */
- [0x34ad, 0x34ad], /* CJK Ideograph Extension A */
- [0x34ae, 0x34ae], /* CJK Ideograph Extension A */
- [0x34af, 0x34af], /* CJK Ideograph Extension A */
- [0x34b0, 0x34b0], /* CJK Ideograph Extension A */
- [0x34b1, 0x34b1], /* CJK Ideograph Extension A */
- [0x34b2, 0x34b2], /* CJK Ideograph Extension A */
- [0x34b3, 0x34b3], /* CJK Ideograph Extension A */
- [0x34b4, 0x34b4], /* CJK Ideograph Extension A */
- [0x34b5, 0x34b5], /* CJK Ideograph Extension A */
- [0x34b6, 0x34b6], /* CJK Ideograph Extension A */
- [0x34b7, 0x34b7], /* CJK Ideograph Extension A */
- [0x34b8, 0x34b8], /* CJK Ideograph Extension A */
- [0x34b9, 0x34b9], /* CJK Ideograph Extension A */
- [0x34ba, 0x34ba], /* CJK Ideograph Extension A */
- [0x34bb, 0x34bb], /* CJK Ideograph Extension A */
- [0x34bc, 0x34bc], /* CJK Ideograph Extension A */
- [0x34bd, 0x34bd], /* CJK Ideograph Extension A */
- [0x34be, 0x34be], /* CJK Ideograph Extension A */
- [0x34bf, 0x34bf], /* CJK Ideograph Extension A */
- [0x34c0, 0x34c0], /* CJK Ideograph Extension A */
- [0x34c1, 0x34c1], /* CJK Ideograph Extension A */
- [0x34c2, 0x34c2], /* CJK Ideograph Extension A */
- [0x34c3, 0x34c3], /* CJK Ideograph Extension A */
- [0x34c4, 0x34c4], /* CJK Ideograph Extension A */
- [0x34c5, 0x34c5], /* CJK Ideograph Extension A */
- [0x34c6, 0x34c6], /* CJK Ideograph Extension A */
- [0x34c7, 0x34c7], /* CJK Ideograph Extension A */
- [0x34c8, 0x34c8], /* CJK Ideograph Extension A */
- [0x34c9, 0x34c9], /* CJK Ideograph Extension A */
- [0x34ca, 0x34ca], /* CJK Ideograph Extension A */
- [0x34cb, 0x34cb], /* CJK Ideograph Extension A */
- [0x34cc, 0x34cc], /* CJK Ideograph Extension A */
- [0x34cd, 0x34cd], /* CJK Ideograph Extension A */
- [0x34ce, 0x34ce], /* CJK Ideograph Extension A */
- [0x34cf, 0x34cf], /* CJK Ideograph Extension A */
- [0x34d0, 0x34d0], /* CJK Ideograph Extension A */
- [0x34d1, 0x34d1], /* CJK Ideograph Extension A */
- [0x34d2, 0x34d2], /* CJK Ideograph Extension A */
- [0x34d3, 0x34d3], /* CJK Ideograph Extension A */
- [0x34d4, 0x34d4], /* CJK Ideograph Extension A */
- [0x34d5, 0x34d5], /* CJK Ideograph Extension A */
- [0x34d6, 0x34d6], /* CJK Ideograph Extension A */
- [0x34d7, 0x34d7], /* CJK Ideograph Extension A */
- [0x34d8, 0x34d8], /* CJK Ideograph Extension A */
- [0x34d9, 0x34d9], /* CJK Ideograph Extension A */
- [0x34da, 0x34da], /* CJK Ideograph Extension A */
- [0x34db, 0x34db], /* CJK Ideograph Extension A */
- [0x34dc, 0x34dc], /* CJK Ideograph Extension A */
- [0x34dd, 0x34dd], /* CJK Ideograph Extension A */
- [0x34de, 0x34de], /* CJK Ideograph Extension A */
- [0x34df, 0x34df], /* CJK Ideograph Extension A */
- [0x34e0, 0x34e0], /* CJK Ideograph Extension A */
- [0x34e1, 0x34e1], /* CJK Ideograph Extension A */
- [0x34e2, 0x34e2], /* CJK Ideograph Extension A */
- [0x34e3, 0x34e3], /* CJK Ideograph Extension A */
- [0x34e4, 0x34e4], /* CJK Ideograph Extension A */
- [0x34e5, 0x34e5], /* CJK Ideograph Extension A */
- [0x34e6, 0x34e6], /* CJK Ideograph Extension A */
- [0x34e7, 0x34e7], /* CJK Ideograph Extension A */
- [0x34e8, 0x34e8], /* CJK Ideograph Extension A */
- [0x34e9, 0x34e9], /* CJK Ideograph Extension A */
- [0x34ea, 0x34ea], /* CJK Ideograph Extension A */
- [0x34eb, 0x34eb], /* CJK Ideograph Extension A */
- [0x34ec, 0x34ec], /* CJK Ideograph Extension A */
- [0x34ed, 0x34ed], /* CJK Ideograph Extension A */
- [0x34ee, 0x34ee], /* CJK Ideograph Extension A */
- [0x34ef, 0x34ef], /* CJK Ideograph Extension A */
- [0x34f0, 0x34f0], /* CJK Ideograph Extension A */
- [0x34f1, 0x34f1], /* CJK Ideograph Extension A */
- [0x34f2, 0x34f2], /* CJK Ideograph Extension A */
- [0x34f3, 0x34f3], /* CJK Ideograph Extension A */
- [0x34f4, 0x34f4], /* CJK Ideograph Extension A */
- [0x34f5, 0x34f5], /* CJK Ideograph Extension A */
- [0x34f6, 0x34f6], /* CJK Ideograph Extension A */
- [0x34f7, 0x34f7], /* CJK Ideograph Extension A */
- [0x34f8, 0x34f8], /* CJK Ideograph Extension A */
- [0x34f9, 0x34f9], /* CJK Ideograph Extension A */
- [0x34fa, 0x34fa], /* CJK Ideograph Extension A */
- [0x34fb, 0x34fb], /* CJK Ideograph Extension A */
- [0x34fc, 0x34fc], /* CJK Ideograph Extension A */
- [0x34fd, 0x34fd], /* CJK Ideograph Extension A */
- [0x34fe, 0x34fe], /* CJK Ideograph Extension A */
- [0x34ff, 0x34ff], /* CJK Ideograph Extension A */
- [0x3500, 0x3500], /* CJK Ideograph Extension A */
- [0x3501, 0x3501], /* CJK Ideograph Extension A */
- [0x3502, 0x3502], /* CJK Ideograph Extension A */
- [0x3503, 0x3503], /* CJK Ideograph Extension A */
- [0x3504, 0x3504], /* CJK Ideograph Extension A */
- [0x3505, 0x3505], /* CJK Ideograph Extension A */
- [0x3506, 0x3506], /* CJK Ideograph Extension A */
- [0x3507, 0x3507], /* CJK Ideograph Extension A */
- [0x3508, 0x3508], /* CJK Ideograph Extension A */
- [0x3509, 0x3509], /* CJK Ideograph Extension A */
- [0x350a, 0x350a], /* CJK Ideograph Extension A */
- [0x350b, 0x350b], /* CJK Ideograph Extension A */
- [0x350c, 0x350c], /* CJK Ideograph Extension A */
- [0x350d, 0x350d], /* CJK Ideograph Extension A */
- [0x350e, 0x350e], /* CJK Ideograph Extension A */
- [0x350f, 0x350f], /* CJK Ideograph Extension A */
- [0x3510, 0x3510], /* CJK Ideograph Extension A */
- [0x3511, 0x3511], /* CJK Ideograph Extension A */
- [0x3512, 0x3512], /* CJK Ideograph Extension A */
- [0x3513, 0x3513], /* CJK Ideograph Extension A */
- [0x3514, 0x3514], /* CJK Ideograph Extension A */
- [0x3515, 0x3515], /* CJK Ideograph Extension A */
- [0x3516, 0x3516], /* CJK Ideograph Extension A */
- [0x3517, 0x3517], /* CJK Ideograph Extension A */
- [0x3518, 0x3518], /* CJK Ideograph Extension A */
- [0x3519, 0x3519], /* CJK Ideograph Extension A */
- [0x351a, 0x351a], /* CJK Ideograph Extension A */
- [0x351b, 0x351b], /* CJK Ideograph Extension A */
- [0x351c, 0x351c], /* CJK Ideograph Extension A */
- [0x351d, 0x351d], /* CJK Ideograph Extension A */
- [0x351e, 0x351e], /* CJK Ideograph Extension A */
- [0x351f, 0x351f], /* CJK Ideograph Extension A */
- [0x3520, 0x3520], /* CJK Ideograph Extension A */
- [0x3521, 0x3521], /* CJK Ideograph Extension A */
- [0x3522, 0x3522], /* CJK Ideograph Extension A */
- [0x3523, 0x3523], /* CJK Ideograph Extension A */
- [0x3524, 0x3524], /* CJK Ideograph Extension A */
- [0x3525, 0x3525], /* CJK Ideograph Extension A */
- [0x3526, 0x3526], /* CJK Ideograph Extension A */
- [0x3527, 0x3527], /* CJK Ideograph Extension A */
- [0x3528, 0x3528], /* CJK Ideograph Extension A */
- [0x3529, 0x3529], /* CJK Ideograph Extension A */
- [0x352a, 0x352a], /* CJK Ideograph Extension A */
- [0x352b, 0x352b], /* CJK Ideograph Extension A */
- [0x352c, 0x352c], /* CJK Ideograph Extension A */
- [0x352d, 0x352d], /* CJK Ideograph Extension A */
- [0x352e, 0x352e], /* CJK Ideograph Extension A */
- [0x352f, 0x352f], /* CJK Ideograph Extension A */
- [0x3530, 0x3530], /* CJK Ideograph Extension A */
- [0x3531, 0x3531], /* CJK Ideograph Extension A */
- [0x3532, 0x3532], /* CJK Ideograph Extension A */
- [0x3533, 0x3533], /* CJK Ideograph Extension A */
- [0x3534, 0x3534], /* CJK Ideograph Extension A */
- [0x3535, 0x3535], /* CJK Ideograph Extension A */
- [0x3536, 0x3536], /* CJK Ideograph Extension A */
- [0x3537, 0x3537], /* CJK Ideograph Extension A */
- [0x3538, 0x3538], /* CJK Ideograph Extension A */
- [0x3539, 0x3539], /* CJK Ideograph Extension A */
- [0x353a, 0x353a], /* CJK Ideograph Extension A */
- [0x353b, 0x353b], /* CJK Ideograph Extension A */
- [0x353c, 0x353c], /* CJK Ideograph Extension A */
- [0x353d, 0x353d], /* CJK Ideograph Extension A */
- [0x353e, 0x353e], /* CJK Ideograph Extension A */
- [0x353f, 0x353f], /* CJK Ideograph Extension A */
- [0x3540, 0x3540], /* CJK Ideograph Extension A */
- [0x3541, 0x3541], /* CJK Ideograph Extension A */
- [0x3542, 0x3542], /* CJK Ideograph Extension A */
- [0x3543, 0x3543], /* CJK Ideograph Extension A */
- [0x3544, 0x3544], /* CJK Ideograph Extension A */
- [0x3545, 0x3545], /* CJK Ideograph Extension A */
- [0x3546, 0x3546], /* CJK Ideograph Extension A */
- [0x3547, 0x3547], /* CJK Ideograph Extension A */
- [0x3548, 0x3548], /* CJK Ideograph Extension A */
- [0x3549, 0x3549], /* CJK Ideograph Extension A */
- [0x354a, 0x354a], /* CJK Ideograph Extension A */
- [0x354b, 0x354b], /* CJK Ideograph Extension A */
- [0x354c, 0x354c], /* CJK Ideograph Extension A */
- [0x354d, 0x354d], /* CJK Ideograph Extension A */
- [0x354e, 0x354e], /* CJK Ideograph Extension A */
- [0x354f, 0x354f], /* CJK Ideograph Extension A */
- [0x3550, 0x3550], /* CJK Ideograph Extension A */
- [0x3551, 0x3551], /* CJK Ideograph Extension A */
- [0x3552, 0x3552], /* CJK Ideograph Extension A */
- [0x3553, 0x3553], /* CJK Ideograph Extension A */
- [0x3554, 0x3554], /* CJK Ideograph Extension A */
- [0x3555, 0x3555], /* CJK Ideograph Extension A */
- [0x3556, 0x3556], /* CJK Ideograph Extension A */
- [0x3557, 0x3557], /* CJK Ideograph Extension A */
- [0x3558, 0x3558], /* CJK Ideograph Extension A */
- [0x3559, 0x3559], /* CJK Ideograph Extension A */
- [0x355a, 0x355a], /* CJK Ideograph Extension A */
- [0x355b, 0x355b], /* CJK Ideograph Extension A */
- [0x355c, 0x355c], /* CJK Ideograph Extension A */
- [0x355d, 0x355d], /* CJK Ideograph Extension A */
- [0x355e, 0x355e], /* CJK Ideograph Extension A */
- [0x355f, 0x355f], /* CJK Ideograph Extension A */
- [0x3560, 0x3560], /* CJK Ideograph Extension A */
- [0x3561, 0x3561], /* CJK Ideograph Extension A */
- [0x3562, 0x3562], /* CJK Ideograph Extension A */
- [0x3563, 0x3563], /* CJK Ideograph Extension A */
- [0x3564, 0x3564], /* CJK Ideograph Extension A */
- [0x3565, 0x3565], /* CJK Ideograph Extension A */
- [0x3566, 0x3566], /* CJK Ideograph Extension A */
- [0x3567, 0x3567], /* CJK Ideograph Extension A */
- [0x3568, 0x3568], /* CJK Ideograph Extension A */
- [0x3569, 0x3569], /* CJK Ideograph Extension A */
- [0x356a, 0x356a], /* CJK Ideograph Extension A */
- [0x356b, 0x356b], /* CJK Ideograph Extension A */
- [0x356c, 0x356c], /* CJK Ideograph Extension A */
- [0x356d, 0x356d], /* CJK Ideograph Extension A */
- [0x356e, 0x356e], /* CJK Ideograph Extension A */
- [0x356f, 0x356f], /* CJK Ideograph Extension A */
- [0x3570, 0x3570], /* CJK Ideograph Extension A */
- [0x3571, 0x3571], /* CJK Ideograph Extension A */
- [0x3572, 0x3572], /* CJK Ideograph Extension A */
- [0x3573, 0x3573], /* CJK Ideograph Extension A */
- [0x3574, 0x3574], /* CJK Ideograph Extension A */
- [0x3575, 0x3575], /* CJK Ideograph Extension A */
- [0x3576, 0x3576], /* CJK Ideograph Extension A */
- [0x3577, 0x3577], /* CJK Ideograph Extension A */
- [0x3578, 0x3578], /* CJK Ideograph Extension A */
- [0x3579, 0x3579], /* CJK Ideograph Extension A */
- [0x357a, 0x357a], /* CJK Ideograph Extension A */
- [0x357b, 0x357b], /* CJK Ideograph Extension A */
- [0x357c, 0x357c], /* CJK Ideograph Extension A */
- [0x357d, 0x357d], /* CJK Ideograph Extension A */
- [0x357e, 0x357e], /* CJK Ideograph Extension A */
- [0x357f, 0x357f], /* CJK Ideograph Extension A */
- [0x3580, 0x3580], /* CJK Ideograph Extension A */
- [0x3581, 0x3581], /* CJK Ideograph Extension A */
- [0x3582, 0x3582], /* CJK Ideograph Extension A */
- [0x3583, 0x3583], /* CJK Ideograph Extension A */
- [0x3584, 0x3584], /* CJK Ideograph Extension A */
- [0x3585, 0x3585], /* CJK Ideograph Extension A */
- [0x3586, 0x3586], /* CJK Ideograph Extension A */
- [0x3587, 0x3587], /* CJK Ideograph Extension A */
- [0x3588, 0x3588], /* CJK Ideograph Extension A */
- [0x3589, 0x3589], /* CJK Ideograph Extension A */
- [0x358a, 0x358a], /* CJK Ideograph Extension A */
- [0x358b, 0x358b], /* CJK Ideograph Extension A */
- [0x358c, 0x358c], /* CJK Ideograph Extension A */
- [0x358d, 0x358d], /* CJK Ideograph Extension A */
- [0x358e, 0x358e], /* CJK Ideograph Extension A */
- [0x358f, 0x358f], /* CJK Ideograph Extension A */
- [0x3590, 0x3590], /* CJK Ideograph Extension A */
- [0x3591, 0x3591], /* CJK Ideograph Extension A */
- [0x3592, 0x3592], /* CJK Ideograph Extension A */
- [0x3593, 0x3593], /* CJK Ideograph Extension A */
- [0x3594, 0x3594], /* CJK Ideograph Extension A */
- [0x3595, 0x3595], /* CJK Ideograph Extension A */
- [0x3596, 0x3596], /* CJK Ideograph Extension A */
- [0x3597, 0x3597], /* CJK Ideograph Extension A */
- [0x3598, 0x3598], /* CJK Ideograph Extension A */
- [0x3599, 0x3599], /* CJK Ideograph Extension A */
- [0x359a, 0x359a], /* CJK Ideograph Extension A */
- [0x359b, 0x359b], /* CJK Ideograph Extension A */
- [0x359c, 0x359c], /* CJK Ideograph Extension A */
- [0x359d, 0x359d], /* CJK Ideograph Extension A */
- [0x359e, 0x359e], /* CJK Ideograph Extension A */
- [0x359f, 0x359f], /* CJK Ideograph Extension A */
- [0x35a0, 0x35a0], /* CJK Ideograph Extension A */
- [0x35a1, 0x35a1], /* CJK Ideograph Extension A */
- [0x35a2, 0x35a2], /* CJK Ideograph Extension A */
- [0x35a3, 0x35a3], /* CJK Ideograph Extension A */
- [0x35a4, 0x35a4], /* CJK Ideograph Extension A */
- [0x35a5, 0x35a5], /* CJK Ideograph Extension A */
- [0x35a6, 0x35a6], /* CJK Ideograph Extension A */
- [0x35a7, 0x35a7], /* CJK Ideograph Extension A */
- [0x35a8, 0x35a8], /* CJK Ideograph Extension A */
- [0x35a9, 0x35a9], /* CJK Ideograph Extension A */
- [0x35aa, 0x35aa], /* CJK Ideograph Extension A */
- [0x35ab, 0x35ab], /* CJK Ideograph Extension A */
- [0x35ac, 0x35ac], /* CJK Ideograph Extension A */
- [0x35ad, 0x35ad], /* CJK Ideograph Extension A */
- [0x35ae, 0x35ae], /* CJK Ideograph Extension A */
- [0x35af, 0x35af], /* CJK Ideograph Extension A */
- [0x35b0, 0x35b0], /* CJK Ideograph Extension A */
- [0x35b1, 0x35b1], /* CJK Ideograph Extension A */
- [0x35b2, 0x35b2], /* CJK Ideograph Extension A */
- [0x35b3, 0x35b3], /* CJK Ideograph Extension A */
- [0x35b4, 0x35b4], /* CJK Ideograph Extension A */
- [0x35b5, 0x35b5], /* CJK Ideograph Extension A */
- [0x35b6, 0x35b6], /* CJK Ideograph Extension A */
- [0x35b7, 0x35b7], /* CJK Ideograph Extension A */
- [0x35b8, 0x35b8], /* CJK Ideograph Extension A */
- [0x35b9, 0x35b9], /* CJK Ideograph Extension A */
- [0x35ba, 0x35ba], /* CJK Ideograph Extension A */
- [0x35bb, 0x35bb], /* CJK Ideograph Extension A */
- [0x35bc, 0x35bc], /* CJK Ideograph Extension A */
- [0x35bd, 0x35bd], /* CJK Ideograph Extension A */
- [0x35be, 0x35be], /* CJK Ideograph Extension A */
- [0x35bf, 0x35bf], /* CJK Ideograph Extension A */
- [0x35c0, 0x35c0], /* CJK Ideograph Extension A */
- [0x35c1, 0x35c1], /* CJK Ideograph Extension A */
- [0x35c2, 0x35c2], /* CJK Ideograph Extension A */
- [0x35c3, 0x35c3], /* CJK Ideograph Extension A */
- [0x35c4, 0x35c4], /* CJK Ideograph Extension A */
- [0x35c5, 0x35c5], /* CJK Ideograph Extension A */
- [0x35c6, 0x35c6], /* CJK Ideograph Extension A */
- [0x35c7, 0x35c7], /* CJK Ideograph Extension A */
- [0x35c8, 0x35c8], /* CJK Ideograph Extension A */
- [0x35c9, 0x35c9], /* CJK Ideograph Extension A */
- [0x35ca, 0x35ca], /* CJK Ideograph Extension A */
- [0x35cb, 0x35cb], /* CJK Ideograph Extension A */
- [0x35cc, 0x35cc], /* CJK Ideograph Extension A */
- [0x35cd, 0x35cd], /* CJK Ideograph Extension A */
- [0x35ce, 0x35ce], /* CJK Ideograph Extension A */
- [0x35cf, 0x35cf], /* CJK Ideograph Extension A */
- [0x35d0, 0x35d0], /* CJK Ideograph Extension A */
- [0x35d1, 0x35d1], /* CJK Ideograph Extension A */
- [0x35d2, 0x35d2], /* CJK Ideograph Extension A */
- [0x35d3, 0x35d3], /* CJK Ideograph Extension A */
- [0x35d4, 0x35d4], /* CJK Ideograph Extension A */
- [0x35d5, 0x35d5], /* CJK Ideograph Extension A */
- [0x35d6, 0x35d6], /* CJK Ideograph Extension A */
- [0x35d7, 0x35d7], /* CJK Ideograph Extension A */
- [0x35d8, 0x35d8], /* CJK Ideograph Extension A */
- [0x35d9, 0x35d9], /* CJK Ideograph Extension A */
- [0x35da, 0x35da], /* CJK Ideograph Extension A */
- [0x35db, 0x35db], /* CJK Ideograph Extension A */
- [0x35dc, 0x35dc], /* CJK Ideograph Extension A */
- [0x35dd, 0x35dd], /* CJK Ideograph Extension A */
- [0x35de, 0x35de], /* CJK Ideograph Extension A */
- [0x35df, 0x35df], /* CJK Ideograph Extension A */
- [0x35e0, 0x35e0], /* CJK Ideograph Extension A */
- [0x35e1, 0x35e1], /* CJK Ideograph Extension A */
- [0x35e2, 0x35e2], /* CJK Ideograph Extension A */
- [0x35e3, 0x35e3], /* CJK Ideograph Extension A */
- [0x35e4, 0x35e4], /* CJK Ideograph Extension A */
- [0x35e5, 0x35e5], /* CJK Ideograph Extension A */
- [0x35e6, 0x35e6], /* CJK Ideograph Extension A */
- [0x35e7, 0x35e7], /* CJK Ideograph Extension A */
- [0x35e8, 0x35e8], /* CJK Ideograph Extension A */
- [0x35e9, 0x35e9], /* CJK Ideograph Extension A */
- [0x35ea, 0x35ea], /* CJK Ideograph Extension A */
- [0x35eb, 0x35eb], /* CJK Ideograph Extension A */
- [0x35ec, 0x35ec], /* CJK Ideograph Extension A */
- [0x35ed, 0x35ed], /* CJK Ideograph Extension A */
- [0x35ee, 0x35ee], /* CJK Ideograph Extension A */
- [0x35ef, 0x35ef], /* CJK Ideograph Extension A */
- [0x35f0, 0x35f0], /* CJK Ideograph Extension A */
- [0x35f1, 0x35f1], /* CJK Ideograph Extension A */
- [0x35f2, 0x35f2], /* CJK Ideograph Extension A */
- [0x35f3, 0x35f3], /* CJK Ideograph Extension A */
- [0x35f4, 0x35f4], /* CJK Ideograph Extension A */
- [0x35f5, 0x35f5], /* CJK Ideograph Extension A */
- [0x35f6, 0x35f6], /* CJK Ideograph Extension A */
- [0x35f7, 0x35f7], /* CJK Ideograph Extension A */
- [0x35f8, 0x35f8], /* CJK Ideograph Extension A */
- [0x35f9, 0x35f9], /* CJK Ideograph Extension A */
- [0x35fa, 0x35fa], /* CJK Ideograph Extension A */
- [0x35fb, 0x35fb], /* CJK Ideograph Extension A */
- [0x35fc, 0x35fc], /* CJK Ideograph Extension A */
- [0x35fd, 0x35fd], /* CJK Ideograph Extension A */
- [0x35fe, 0x35fe], /* CJK Ideograph Extension A */
- [0x35ff, 0x35ff], /* CJK Ideograph Extension A */
- [0x3600, 0x3600], /* CJK Ideograph Extension A */
- [0x3601, 0x3601], /* CJK Ideograph Extension A */
- [0x3602, 0x3602], /* CJK Ideograph Extension A */
- [0x3603, 0x3603], /* CJK Ideograph Extension A */
- [0x3604, 0x3604], /* CJK Ideograph Extension A */
- [0x3605, 0x3605], /* CJK Ideograph Extension A */
- [0x3606, 0x3606], /* CJK Ideograph Extension A */
- [0x3607, 0x3607], /* CJK Ideograph Extension A */
- [0x3608, 0x3608], /* CJK Ideograph Extension A */
- [0x3609, 0x3609], /* CJK Ideograph Extension A */
- [0x360a, 0x360a], /* CJK Ideograph Extension A */
- [0x360b, 0x360b], /* CJK Ideograph Extension A */
- [0x360c, 0x360c], /* CJK Ideograph Extension A */
- [0x360d, 0x360d], /* CJK Ideograph Extension A */
- [0x360e, 0x360e], /* CJK Ideograph Extension A */
- [0x360f, 0x360f], /* CJK Ideograph Extension A */
- [0x3610, 0x3610], /* CJK Ideograph Extension A */
- [0x3611, 0x3611], /* CJK Ideograph Extension A */
- [0x3612, 0x3612], /* CJK Ideograph Extension A */
- [0x3613, 0x3613], /* CJK Ideograph Extension A */
- [0x3614, 0x3614], /* CJK Ideograph Extension A */
- [0x3615, 0x3615], /* CJK Ideograph Extension A */
- [0x3616, 0x3616], /* CJK Ideograph Extension A */
- [0x3617, 0x3617], /* CJK Ideograph Extension A */
- [0x3618, 0x3618], /* CJK Ideograph Extension A */
- [0x3619, 0x3619], /* CJK Ideograph Extension A */
- [0x361a, 0x361a], /* CJK Ideograph Extension A */
- [0x361b, 0x361b], /* CJK Ideograph Extension A */
- [0x361c, 0x361c], /* CJK Ideograph Extension A */
- [0x361d, 0x361d], /* CJK Ideograph Extension A */
- [0x361e, 0x361e], /* CJK Ideograph Extension A */
- [0x361f, 0x361f], /* CJK Ideograph Extension A */
- [0x3620, 0x3620], /* CJK Ideograph Extension A */
- [0x3621, 0x3621], /* CJK Ideograph Extension A */
- [0x3622, 0x3622], /* CJK Ideograph Extension A */
- [0x3623, 0x3623], /* CJK Ideograph Extension A */
- [0x3624, 0x3624], /* CJK Ideograph Extension A */
- [0x3625, 0x3625], /* CJK Ideograph Extension A */
- [0x3626, 0x3626], /* CJK Ideograph Extension A */
- [0x3627, 0x3627], /* CJK Ideograph Extension A */
- [0x3628, 0x3628], /* CJK Ideograph Extension A */
- [0x3629, 0x3629], /* CJK Ideograph Extension A */
- [0x362a, 0x362a], /* CJK Ideograph Extension A */
- [0x362b, 0x362b], /* CJK Ideograph Extension A */
- [0x362c, 0x362c], /* CJK Ideograph Extension A */
- [0x362d, 0x362d], /* CJK Ideograph Extension A */
- [0x362e, 0x362e], /* CJK Ideograph Extension A */
- [0x362f, 0x362f], /* CJK Ideograph Extension A */
- [0x3630, 0x3630], /* CJK Ideograph Extension A */
- [0x3631, 0x3631], /* CJK Ideograph Extension A */
- [0x3632, 0x3632], /* CJK Ideograph Extension A */
- [0x3633, 0x3633], /* CJK Ideograph Extension A */
- [0x3634, 0x3634], /* CJK Ideograph Extension A */
- [0x3635, 0x3635], /* CJK Ideograph Extension A */
- [0x3636, 0x3636], /* CJK Ideograph Extension A */
- [0x3637, 0x3637], /* CJK Ideograph Extension A */
- [0x3638, 0x3638], /* CJK Ideograph Extension A */
- [0x3639, 0x3639], /* CJK Ideograph Extension A */
- [0x363a, 0x363a], /* CJK Ideograph Extension A */
- [0x363b, 0x363b], /* CJK Ideograph Extension A */
- [0x363c, 0x363c], /* CJK Ideograph Extension A */
- [0x363d, 0x363d], /* CJK Ideograph Extension A */
- [0x363e, 0x363e], /* CJK Ideograph Extension A */
- [0x363f, 0x363f], /* CJK Ideograph Extension A */
- [0x3640, 0x3640], /* CJK Ideograph Extension A */
- [0x3641, 0x3641], /* CJK Ideograph Extension A */
- [0x3642, 0x3642], /* CJK Ideograph Extension A */
- [0x3643, 0x3643], /* CJK Ideograph Extension A */
- [0x3644, 0x3644], /* CJK Ideograph Extension A */
- [0x3645, 0x3645], /* CJK Ideograph Extension A */
- [0x3646, 0x3646], /* CJK Ideograph Extension A */
- [0x3647, 0x3647], /* CJK Ideograph Extension A */
- [0x3648, 0x3648], /* CJK Ideograph Extension A */
- [0x3649, 0x3649], /* CJK Ideograph Extension A */
- [0x364a, 0x364a], /* CJK Ideograph Extension A */
- [0x364b, 0x364b], /* CJK Ideograph Extension A */
- [0x364c, 0x364c], /* CJK Ideograph Extension A */
- [0x364d, 0x364d], /* CJK Ideograph Extension A */
- [0x364e, 0x364e], /* CJK Ideograph Extension A */
- [0x364f, 0x364f], /* CJK Ideograph Extension A */
- [0x3650, 0x3650], /* CJK Ideograph Extension A */
- [0x3651, 0x3651], /* CJK Ideograph Extension A */
- [0x3652, 0x3652], /* CJK Ideograph Extension A */
- [0x3653, 0x3653], /* CJK Ideograph Extension A */
- [0x3654, 0x3654], /* CJK Ideograph Extension A */
- [0x3655, 0x3655], /* CJK Ideograph Extension A */
- [0x3656, 0x3656], /* CJK Ideograph Extension A */
- [0x3657, 0x3657], /* CJK Ideograph Extension A */
- [0x3658, 0x3658], /* CJK Ideograph Extension A */
- [0x3659, 0x3659], /* CJK Ideograph Extension A */
- [0x365a, 0x365a], /* CJK Ideograph Extension A */
- [0x365b, 0x365b], /* CJK Ideograph Extension A */
- [0x365c, 0x365c], /* CJK Ideograph Extension A */
- [0x365d, 0x365d], /* CJK Ideograph Extension A */
- [0x365e, 0x365e], /* CJK Ideograph Extension A */
- [0x365f, 0x365f], /* CJK Ideograph Extension A */
- [0x3660, 0x3660], /* CJK Ideograph Extension A */
- [0x3661, 0x3661], /* CJK Ideograph Extension A */
- [0x3662, 0x3662], /* CJK Ideograph Extension A */
- [0x3663, 0x3663], /* CJK Ideograph Extension A */
- [0x3664, 0x3664], /* CJK Ideograph Extension A */
- [0x3665, 0x3665], /* CJK Ideograph Extension A */
- [0x3666, 0x3666], /* CJK Ideograph Extension A */
- [0x3667, 0x3667], /* CJK Ideograph Extension A */
- [0x3668, 0x3668], /* CJK Ideograph Extension A */
- [0x3669, 0x3669], /* CJK Ideograph Extension A */
- [0x366a, 0x366a], /* CJK Ideograph Extension A */
- [0x366b, 0x366b], /* CJK Ideograph Extension A */
- [0x366c, 0x366c], /* CJK Ideograph Extension A */
- [0x366d, 0x366d], /* CJK Ideograph Extension A */
- [0x366e, 0x366e], /* CJK Ideograph Extension A */
- [0x366f, 0x366f], /* CJK Ideograph Extension A */
- [0x3670, 0x3670], /* CJK Ideograph Extension A */
- [0x3671, 0x3671], /* CJK Ideograph Extension A */
- [0x3672, 0x3672], /* CJK Ideograph Extension A */
- [0x3673, 0x3673], /* CJK Ideograph Extension A */
- [0x3674, 0x3674], /* CJK Ideograph Extension A */
- [0x3675, 0x3675], /* CJK Ideograph Extension A */
- [0x3676, 0x3676], /* CJK Ideograph Extension A */
- [0x3677, 0x3677], /* CJK Ideograph Extension A */
- [0x3678, 0x3678], /* CJK Ideograph Extension A */
- [0x3679, 0x3679], /* CJK Ideograph Extension A */
- [0x367a, 0x367a], /* CJK Ideograph Extension A */
- [0x367b, 0x367b], /* CJK Ideograph Extension A */
- [0x367c, 0x367c], /* CJK Ideograph Extension A */
- [0x367d, 0x367d], /* CJK Ideograph Extension A */
- [0x367e, 0x367e], /* CJK Ideograph Extension A */
- [0x367f, 0x367f], /* CJK Ideograph Extension A */
- [0x3680, 0x3680], /* CJK Ideograph Extension A */
- [0x3681, 0x3681], /* CJK Ideograph Extension A */
- [0x3682, 0x3682], /* CJK Ideograph Extension A */
- [0x3683, 0x3683], /* CJK Ideograph Extension A */
- [0x3684, 0x3684], /* CJK Ideograph Extension A */
- [0x3685, 0x3685], /* CJK Ideograph Extension A */
- [0x3686, 0x3686], /* CJK Ideograph Extension A */
- [0x3687, 0x3687], /* CJK Ideograph Extension A */
- [0x3688, 0x3688], /* CJK Ideograph Extension A */
- [0x3689, 0x3689], /* CJK Ideograph Extension A */
- [0x368a, 0x368a], /* CJK Ideograph Extension A */
- [0x368b, 0x368b], /* CJK Ideograph Extension A */
- [0x368c, 0x368c], /* CJK Ideograph Extension A */
- [0x368d, 0x368d], /* CJK Ideograph Extension A */
- [0x368e, 0x368e], /* CJK Ideograph Extension A */
- [0x368f, 0x368f], /* CJK Ideograph Extension A */
- [0x3690, 0x3690], /* CJK Ideograph Extension A */
- [0x3691, 0x3691], /* CJK Ideograph Extension A */
- [0x3692, 0x3692], /* CJK Ideograph Extension A */
- [0x3693, 0x3693], /* CJK Ideograph Extension A */
- [0x3694, 0x3694], /* CJK Ideograph Extension A */
- [0x3695, 0x3695], /* CJK Ideograph Extension A */
- [0x3696, 0x3696], /* CJK Ideograph Extension A */
- [0x3697, 0x3697], /* CJK Ideograph Extension A */
- [0x3698, 0x3698], /* CJK Ideograph Extension A */
- [0x3699, 0x3699], /* CJK Ideograph Extension A */
- [0x369a, 0x369a], /* CJK Ideograph Extension A */
- [0x369b, 0x369b], /* CJK Ideograph Extension A */
- [0x369c, 0x369c], /* CJK Ideograph Extension A */
- [0x369d, 0x369d], /* CJK Ideograph Extension A */
- [0x369e, 0x369e], /* CJK Ideograph Extension A */
- [0x369f, 0x369f], /* CJK Ideograph Extension A */
- [0x36a0, 0x36a0], /* CJK Ideograph Extension A */
- [0x36a1, 0x36a1], /* CJK Ideograph Extension A */
- [0x36a2, 0x36a2], /* CJK Ideograph Extension A */
- [0x36a3, 0x36a3], /* CJK Ideograph Extension A */
- [0x36a4, 0x36a4], /* CJK Ideograph Extension A */
- [0x36a5, 0x36a5], /* CJK Ideograph Extension A */
- [0x36a6, 0x36a6], /* CJK Ideograph Extension A */
- [0x36a7, 0x36a7], /* CJK Ideograph Extension A */
- [0x36a8, 0x36a8], /* CJK Ideograph Extension A */
- [0x36a9, 0x36a9], /* CJK Ideograph Extension A */
- [0x36aa, 0x36aa], /* CJK Ideograph Extension A */
- [0x36ab, 0x36ab], /* CJK Ideograph Extension A */
- [0x36ac, 0x36ac], /* CJK Ideograph Extension A */
- [0x36ad, 0x36ad], /* CJK Ideograph Extension A */
- [0x36ae, 0x36ae], /* CJK Ideograph Extension A */
- [0x36af, 0x36af], /* CJK Ideograph Extension A */
- [0x36b0, 0x36b0], /* CJK Ideograph Extension A */
- [0x36b1, 0x36b1], /* CJK Ideograph Extension A */
- [0x36b2, 0x36b2], /* CJK Ideograph Extension A */
- [0x36b3, 0x36b3], /* CJK Ideograph Extension A */
- [0x36b4, 0x36b4], /* CJK Ideograph Extension A */
- [0x36b5, 0x36b5], /* CJK Ideograph Extension A */
- [0x36b6, 0x36b6], /* CJK Ideograph Extension A */
- [0x36b7, 0x36b7], /* CJK Ideograph Extension A */
- [0x36b8, 0x36b8], /* CJK Ideograph Extension A */
- [0x36b9, 0x36b9], /* CJK Ideograph Extension A */
- [0x36ba, 0x36ba], /* CJK Ideograph Extension A */
- [0x36bb, 0x36bb], /* CJK Ideograph Extension A */
- [0x36bc, 0x36bc], /* CJK Ideograph Extension A */
- [0x36bd, 0x36bd], /* CJK Ideograph Extension A */
- [0x36be, 0x36be], /* CJK Ideograph Extension A */
- [0x36bf, 0x36bf], /* CJK Ideograph Extension A */
- [0x36c0, 0x36c0], /* CJK Ideograph Extension A */
- [0x36c1, 0x36c1], /* CJK Ideograph Extension A */
- [0x36c2, 0x36c2], /* CJK Ideograph Extension A */
- [0x36c3, 0x36c3], /* CJK Ideograph Extension A */
- [0x36c4, 0x36c4], /* CJK Ideograph Extension A */
- [0x36c5, 0x36c5], /* CJK Ideograph Extension A */
- [0x36c6, 0x36c6], /* CJK Ideograph Extension A */
- [0x36c7, 0x36c7], /* CJK Ideograph Extension A */
- [0x36c8, 0x36c8], /* CJK Ideograph Extension A */
- [0x36c9, 0x36c9], /* CJK Ideograph Extension A */
- [0x36ca, 0x36ca], /* CJK Ideograph Extension A */
- [0x36cb, 0x36cb], /* CJK Ideograph Extension A */
- [0x36cc, 0x36cc], /* CJK Ideograph Extension A */
- [0x36cd, 0x36cd], /* CJK Ideograph Extension A */
- [0x36ce, 0x36ce], /* CJK Ideograph Extension A */
- [0x36cf, 0x36cf], /* CJK Ideograph Extension A */
- [0x36d0, 0x36d0], /* CJK Ideograph Extension A */
- [0x36d1, 0x36d1], /* CJK Ideograph Extension A */
- [0x36d2, 0x36d2], /* CJK Ideograph Extension A */
- [0x36d3, 0x36d3], /* CJK Ideograph Extension A */
- [0x36d4, 0x36d4], /* CJK Ideograph Extension A */
- [0x36d5, 0x36d5], /* CJK Ideograph Extension A */
- [0x36d6, 0x36d6], /* CJK Ideograph Extension A */
- [0x36d7, 0x36d7], /* CJK Ideograph Extension A */
- [0x36d8, 0x36d8], /* CJK Ideograph Extension A */
- [0x36d9, 0x36d9], /* CJK Ideograph Extension A */
- [0x36da, 0x36da], /* CJK Ideograph Extension A */
- [0x36db, 0x36db], /* CJK Ideograph Extension A */
- [0x36dc, 0x36dc], /* CJK Ideograph Extension A */
- [0x36dd, 0x36dd], /* CJK Ideograph Extension A */
- [0x36de, 0x36de], /* CJK Ideograph Extension A */
- [0x36df, 0x36df], /* CJK Ideograph Extension A */
- [0x36e0, 0x36e0], /* CJK Ideograph Extension A */
- [0x36e1, 0x36e1], /* CJK Ideograph Extension A */
- [0x36e2, 0x36e2], /* CJK Ideograph Extension A */
- [0x36e3, 0x36e3], /* CJK Ideograph Extension A */
- [0x36e4, 0x36e4], /* CJK Ideograph Extension A */
- [0x36e5, 0x36e5], /* CJK Ideograph Extension A */
- [0x36e6, 0x36e6], /* CJK Ideograph Extension A */
- [0x36e7, 0x36e7], /* CJK Ideograph Extension A */
- [0x36e8, 0x36e8], /* CJK Ideograph Extension A */
- [0x36e9, 0x36e9], /* CJK Ideograph Extension A */
- [0x36ea, 0x36ea], /* CJK Ideograph Extension A */
- [0x36eb, 0x36eb], /* CJK Ideograph Extension A */
- [0x36ec, 0x36ec], /* CJK Ideograph Extension A */
- [0x36ed, 0x36ed], /* CJK Ideograph Extension A */
- [0x36ee, 0x36ee], /* CJK Ideograph Extension A */
- [0x36ef, 0x36ef], /* CJK Ideograph Extension A */
- [0x36f0, 0x36f0], /* CJK Ideograph Extension A */
- [0x36f1, 0x36f1], /* CJK Ideograph Extension A */
- [0x36f2, 0x36f2], /* CJK Ideograph Extension A */
- [0x36f3, 0x36f3], /* CJK Ideograph Extension A */
- [0x36f4, 0x36f4], /* CJK Ideograph Extension A */
- [0x36f5, 0x36f5], /* CJK Ideograph Extension A */
- [0x36f6, 0x36f6], /* CJK Ideograph Extension A */
- [0x36f7, 0x36f7], /* CJK Ideograph Extension A */
- [0x36f8, 0x36f8], /* CJK Ideograph Extension A */
- [0x36f9, 0x36f9], /* CJK Ideograph Extension A */
- [0x36fa, 0x36fa], /* CJK Ideograph Extension A */
- [0x36fb, 0x36fb], /* CJK Ideograph Extension A */
- [0x36fc, 0x36fc], /* CJK Ideograph Extension A */
- [0x36fd, 0x36fd], /* CJK Ideograph Extension A */
- [0x36fe, 0x36fe], /* CJK Ideograph Extension A */
- [0x36ff, 0x36ff], /* CJK Ideograph Extension A */
- [0x3700, 0x3700], /* CJK Ideograph Extension A */
- [0x3701, 0x3701], /* CJK Ideograph Extension A */
- [0x3702, 0x3702], /* CJK Ideograph Extension A */
- [0x3703, 0x3703], /* CJK Ideograph Extension A */
- [0x3704, 0x3704], /* CJK Ideograph Extension A */
- [0x3705, 0x3705], /* CJK Ideograph Extension A */
- [0x3706, 0x3706], /* CJK Ideograph Extension A */
- [0x3707, 0x3707], /* CJK Ideograph Extension A */
- [0x3708, 0x3708], /* CJK Ideograph Extension A */
- [0x3709, 0x3709], /* CJK Ideograph Extension A */
- [0x370a, 0x370a], /* CJK Ideograph Extension A */
- [0x370b, 0x370b], /* CJK Ideograph Extension A */
- [0x370c, 0x370c], /* CJK Ideograph Extension A */
- [0x370d, 0x370d], /* CJK Ideograph Extension A */
- [0x370e, 0x370e], /* CJK Ideograph Extension A */
- [0x370f, 0x370f], /* CJK Ideograph Extension A */
- [0x3710, 0x3710], /* CJK Ideograph Extension A */
- [0x3711, 0x3711], /* CJK Ideograph Extension A */
- [0x3712, 0x3712], /* CJK Ideograph Extension A */
- [0x3713, 0x3713], /* CJK Ideograph Extension A */
- [0x3714, 0x3714], /* CJK Ideograph Extension A */
- [0x3715, 0x3715], /* CJK Ideograph Extension A */
- [0x3716, 0x3716], /* CJK Ideograph Extension A */
- [0x3717, 0x3717], /* CJK Ideograph Extension A */
- [0x3718, 0x3718], /* CJK Ideograph Extension A */
- [0x3719, 0x3719], /* CJK Ideograph Extension A */
- [0x371a, 0x371a], /* CJK Ideograph Extension A */
- [0x371b, 0x371b], /* CJK Ideograph Extension A */
- [0x371c, 0x371c], /* CJK Ideograph Extension A */
- [0x371d, 0x371d], /* CJK Ideograph Extension A */
- [0x371e, 0x371e], /* CJK Ideograph Extension A */
- [0x371f, 0x371f], /* CJK Ideograph Extension A */
- [0x3720, 0x3720], /* CJK Ideograph Extension A */
- [0x3721, 0x3721], /* CJK Ideograph Extension A */
- [0x3722, 0x3722], /* CJK Ideograph Extension A */
- [0x3723, 0x3723], /* CJK Ideograph Extension A */
- [0x3724, 0x3724], /* CJK Ideograph Extension A */
- [0x3725, 0x3725], /* CJK Ideograph Extension A */
- [0x3726, 0x3726], /* CJK Ideograph Extension A */
- [0x3727, 0x3727], /* CJK Ideograph Extension A */
- [0x3728, 0x3728], /* CJK Ideograph Extension A */
- [0x3729, 0x3729], /* CJK Ideograph Extension A */
- [0x372a, 0x372a], /* CJK Ideograph Extension A */
- [0x372b, 0x372b], /* CJK Ideograph Extension A */
- [0x372c, 0x372c], /* CJK Ideograph Extension A */
- [0x372d, 0x372d], /* CJK Ideograph Extension A */
- [0x372e, 0x372e], /* CJK Ideograph Extension A */
- [0x372f, 0x372f], /* CJK Ideograph Extension A */
- [0x3730, 0x3730], /* CJK Ideograph Extension A */
- [0x3731, 0x3731], /* CJK Ideograph Extension A */
- [0x3732, 0x3732], /* CJK Ideograph Extension A */
- [0x3733, 0x3733], /* CJK Ideograph Extension A */
- [0x3734, 0x3734], /* CJK Ideograph Extension A */
- [0x3735, 0x3735], /* CJK Ideograph Extension A */
- [0x3736, 0x3736], /* CJK Ideograph Extension A */
- [0x3737, 0x3737], /* CJK Ideograph Extension A */
- [0x3738, 0x3738], /* CJK Ideograph Extension A */
- [0x3739, 0x3739], /* CJK Ideograph Extension A */
- [0x373a, 0x373a], /* CJK Ideograph Extension A */
- [0x373b, 0x373b], /* CJK Ideograph Extension A */
- [0x373c, 0x373c], /* CJK Ideograph Extension A */
- [0x373d, 0x373d], /* CJK Ideograph Extension A */
- [0x373e, 0x373e], /* CJK Ideograph Extension A */
- [0x373f, 0x373f], /* CJK Ideograph Extension A */
- [0x3740, 0x3740], /* CJK Ideograph Extension A */
- [0x3741, 0x3741], /* CJK Ideograph Extension A */
- [0x3742, 0x3742], /* CJK Ideograph Extension A */
- [0x3743, 0x3743], /* CJK Ideograph Extension A */
- [0x3744, 0x3744], /* CJK Ideograph Extension A */
- [0x3745, 0x3745], /* CJK Ideograph Extension A */
- [0x3746, 0x3746], /* CJK Ideograph Extension A */
- [0x3747, 0x3747], /* CJK Ideograph Extension A */
- [0x3748, 0x3748], /* CJK Ideograph Extension A */
- [0x3749, 0x3749], /* CJK Ideograph Extension A */
- [0x374a, 0x374a], /* CJK Ideograph Extension A */
- [0x374b, 0x374b], /* CJK Ideograph Extension A */
- [0x374c, 0x374c], /* CJK Ideograph Extension A */
- [0x374d, 0x374d], /* CJK Ideograph Extension A */
- [0x374e, 0x374e], /* CJK Ideograph Extension A */
- [0x374f, 0x374f], /* CJK Ideograph Extension A */
- [0x3750, 0x3750], /* CJK Ideograph Extension A */
- [0x3751, 0x3751], /* CJK Ideograph Extension A */
- [0x3752, 0x3752], /* CJK Ideograph Extension A */
- [0x3753, 0x3753], /* CJK Ideograph Extension A */
- [0x3754, 0x3754], /* CJK Ideograph Extension A */
- [0x3755, 0x3755], /* CJK Ideograph Extension A */
- [0x3756, 0x3756], /* CJK Ideograph Extension A */
- [0x3757, 0x3757], /* CJK Ideograph Extension A */
- [0x3758, 0x3758], /* CJK Ideograph Extension A */
- [0x3759, 0x3759], /* CJK Ideograph Extension A */
- [0x375a, 0x375a], /* CJK Ideograph Extension A */
- [0x375b, 0x375b], /* CJK Ideograph Extension A */
- [0x375c, 0x375c], /* CJK Ideograph Extension A */
- [0x375d, 0x375d], /* CJK Ideograph Extension A */
- [0x375e, 0x375e], /* CJK Ideograph Extension A */
- [0x375f, 0x375f], /* CJK Ideograph Extension A */
- [0x3760, 0x3760], /* CJK Ideograph Extension A */
- [0x3761, 0x3761], /* CJK Ideograph Extension A */
- [0x3762, 0x3762], /* CJK Ideograph Extension A */
- [0x3763, 0x3763], /* CJK Ideograph Extension A */
- [0x3764, 0x3764], /* CJK Ideograph Extension A */
- [0x3765, 0x3765], /* CJK Ideograph Extension A */
- [0x3766, 0x3766], /* CJK Ideograph Extension A */
- [0x3767, 0x3767], /* CJK Ideograph Extension A */
- [0x3768, 0x3768], /* CJK Ideograph Extension A */
- [0x3769, 0x3769], /* CJK Ideograph Extension A */
- [0x376a, 0x376a], /* CJK Ideograph Extension A */
- [0x376b, 0x376b], /* CJK Ideograph Extension A */
- [0x376c, 0x376c], /* CJK Ideograph Extension A */
- [0x376d, 0x376d], /* CJK Ideograph Extension A */
- [0x376e, 0x376e], /* CJK Ideograph Extension A */
- [0x376f, 0x376f], /* CJK Ideograph Extension A */
- [0x3770, 0x3770], /* CJK Ideograph Extension A */
- [0x3771, 0x3771], /* CJK Ideograph Extension A */
- [0x3772, 0x3772], /* CJK Ideograph Extension A */
- [0x3773, 0x3773], /* CJK Ideograph Extension A */
- [0x3774, 0x3774], /* CJK Ideograph Extension A */
- [0x3775, 0x3775], /* CJK Ideograph Extension A */
- [0x3776, 0x3776], /* CJK Ideograph Extension A */
- [0x3777, 0x3777], /* CJK Ideograph Extension A */
- [0x3778, 0x3778], /* CJK Ideograph Extension A */
- [0x3779, 0x3779], /* CJK Ideograph Extension A */
- [0x377a, 0x377a], /* CJK Ideograph Extension A */
- [0x377b, 0x377b], /* CJK Ideograph Extension A */
- [0x377c, 0x377c], /* CJK Ideograph Extension A */
- [0x377d, 0x377d], /* CJK Ideograph Extension A */
- [0x377e, 0x377e], /* CJK Ideograph Extension A */
- [0x377f, 0x377f], /* CJK Ideograph Extension A */
- [0x3780, 0x3780], /* CJK Ideograph Extension A */
- [0x3781, 0x3781], /* CJK Ideograph Extension A */
- [0x3782, 0x3782], /* CJK Ideograph Extension A */
- [0x3783, 0x3783], /* CJK Ideograph Extension A */
- [0x3784, 0x3784], /* CJK Ideograph Extension A */
- [0x3785, 0x3785], /* CJK Ideograph Extension A */
- [0x3786, 0x3786], /* CJK Ideograph Extension A */
- [0x3787, 0x3787], /* CJK Ideograph Extension A */
- [0x3788, 0x3788], /* CJK Ideograph Extension A */
- [0x3789, 0x3789], /* CJK Ideograph Extension A */
- [0x378a, 0x378a], /* CJK Ideograph Extension A */
- [0x378b, 0x378b], /* CJK Ideograph Extension A */
- [0x378c, 0x378c], /* CJK Ideograph Extension A */
- [0x378d, 0x378d], /* CJK Ideograph Extension A */
- [0x378e, 0x378e], /* CJK Ideograph Extension A */
- [0x378f, 0x378f], /* CJK Ideograph Extension A */
- [0x3790, 0x3790], /* CJK Ideograph Extension A */
- [0x3791, 0x3791], /* CJK Ideograph Extension A */
- [0x3792, 0x3792], /* CJK Ideograph Extension A */
- [0x3793, 0x3793], /* CJK Ideograph Extension A */
- [0x3794, 0x3794], /* CJK Ideograph Extension A */
- [0x3795, 0x3795], /* CJK Ideograph Extension A */
- [0x3796, 0x3796], /* CJK Ideograph Extension A */
- [0x3797, 0x3797], /* CJK Ideograph Extension A */
- [0x3798, 0x3798], /* CJK Ideograph Extension A */
- [0x3799, 0x3799], /* CJK Ideograph Extension A */
- [0x379a, 0x379a], /* CJK Ideograph Extension A */
- [0x379b, 0x379b], /* CJK Ideograph Extension A */
- [0x379c, 0x379c], /* CJK Ideograph Extension A */
- [0x379d, 0x379d], /* CJK Ideograph Extension A */
- [0x379e, 0x379e], /* CJK Ideograph Extension A */
- [0x379f, 0x379f], /* CJK Ideograph Extension A */
- [0x37a0, 0x37a0], /* CJK Ideograph Extension A */
- [0x37a1, 0x37a1], /* CJK Ideograph Extension A */
- [0x37a2, 0x37a2], /* CJK Ideograph Extension A */
- [0x37a3, 0x37a3], /* CJK Ideograph Extension A */
- [0x37a4, 0x37a4], /* CJK Ideograph Extension A */
- [0x37a5, 0x37a5], /* CJK Ideograph Extension A */
- [0x37a6, 0x37a6], /* CJK Ideograph Extension A */
- [0x37a7, 0x37a7], /* CJK Ideograph Extension A */
- [0x37a8, 0x37a8], /* CJK Ideograph Extension A */
- [0x37a9, 0x37a9], /* CJK Ideograph Extension A */
- [0x37aa, 0x37aa], /* CJK Ideograph Extension A */
- [0x37ab, 0x37ab], /* CJK Ideograph Extension A */
- [0x37ac, 0x37ac], /* CJK Ideograph Extension A */
- [0x37ad, 0x37ad], /* CJK Ideograph Extension A */
- [0x37ae, 0x37ae], /* CJK Ideograph Extension A */
- [0x37af, 0x37af], /* CJK Ideograph Extension A */
- [0x37b0, 0x37b0], /* CJK Ideograph Extension A */
- [0x37b1, 0x37b1], /* CJK Ideograph Extension A */
- [0x37b2, 0x37b2], /* CJK Ideograph Extension A */
- [0x37b3, 0x37b3], /* CJK Ideograph Extension A */
- [0x37b4, 0x37b4], /* CJK Ideograph Extension A */
- [0x37b5, 0x37b5], /* CJK Ideograph Extension A */
- [0x37b6, 0x37b6], /* CJK Ideograph Extension A */
- [0x37b7, 0x37b7], /* CJK Ideograph Extension A */
- [0x37b8, 0x37b8], /* CJK Ideograph Extension A */
- [0x37b9, 0x37b9], /* CJK Ideograph Extension A */
- [0x37ba, 0x37ba], /* CJK Ideograph Extension A */
- [0x37bb, 0x37bb], /* CJK Ideograph Extension A */
- [0x37bc, 0x37bc], /* CJK Ideograph Extension A */
- [0x37bd, 0x37bd], /* CJK Ideograph Extension A */
- [0x37be, 0x37be], /* CJK Ideograph Extension A */
- [0x37bf, 0x37bf], /* CJK Ideograph Extension A */
- [0x37c0, 0x37c0], /* CJK Ideograph Extension A */
- [0x37c1, 0x37c1], /* CJK Ideograph Extension A */
- [0x37c2, 0x37c2], /* CJK Ideograph Extension A */
- [0x37c3, 0x37c3], /* CJK Ideograph Extension A */
- [0x37c4, 0x37c4], /* CJK Ideograph Extension A */
- [0x37c5, 0x37c5], /* CJK Ideograph Extension A */
- [0x37c6, 0x37c6], /* CJK Ideograph Extension A */
- [0x37c7, 0x37c7], /* CJK Ideograph Extension A */
- [0x37c8, 0x37c8], /* CJK Ideograph Extension A */
- [0x37c9, 0x37c9], /* CJK Ideograph Extension A */
- [0x37ca, 0x37ca], /* CJK Ideograph Extension A */
- [0x37cb, 0x37cb], /* CJK Ideograph Extension A */
- [0x37cc, 0x37cc], /* CJK Ideograph Extension A */
- [0x37cd, 0x37cd], /* CJK Ideograph Extension A */
- [0x37ce, 0x37ce], /* CJK Ideograph Extension A */
- [0x37cf, 0x37cf], /* CJK Ideograph Extension A */
- [0x37d0, 0x37d0], /* CJK Ideograph Extension A */
- [0x37d1, 0x37d1], /* CJK Ideograph Extension A */
- [0x37d2, 0x37d2], /* CJK Ideograph Extension A */
- [0x37d3, 0x37d3], /* CJK Ideograph Extension A */
- [0x37d4, 0x37d4], /* CJK Ideograph Extension A */
- [0x37d5, 0x37d5], /* CJK Ideograph Extension A */
- [0x37d6, 0x37d6], /* CJK Ideograph Extension A */
- [0x37d7, 0x37d7], /* CJK Ideograph Extension A */
- [0x37d8, 0x37d8], /* CJK Ideograph Extension A */
- [0x37d9, 0x37d9], /* CJK Ideograph Extension A */
- [0x37da, 0x37da], /* CJK Ideograph Extension A */
- [0x37db, 0x37db], /* CJK Ideograph Extension A */
- [0x37dc, 0x37dc], /* CJK Ideograph Extension A */
- [0x37dd, 0x37dd], /* CJK Ideograph Extension A */
- [0x37de, 0x37de], /* CJK Ideograph Extension A */
- [0x37df, 0x37df], /* CJK Ideograph Extension A */
- [0x37e0, 0x37e0], /* CJK Ideograph Extension A */
- [0x37e1, 0x37e1], /* CJK Ideograph Extension A */
- [0x37e2, 0x37e2], /* CJK Ideograph Extension A */
- [0x37e3, 0x37e3], /* CJK Ideograph Extension A */
- [0x37e4, 0x37e4], /* CJK Ideograph Extension A */
- [0x37e5, 0x37e5], /* CJK Ideograph Extension A */
- [0x37e6, 0x37e6], /* CJK Ideograph Extension A */
- [0x37e7, 0x37e7], /* CJK Ideograph Extension A */
- [0x37e8, 0x37e8], /* CJK Ideograph Extension A */
- [0x37e9, 0x37e9], /* CJK Ideograph Extension A */
- [0x37ea, 0x37ea], /* CJK Ideograph Extension A */
- [0x37eb, 0x37eb], /* CJK Ideograph Extension A */
- [0x37ec, 0x37ec], /* CJK Ideograph Extension A */
- [0x37ed, 0x37ed], /* CJK Ideograph Extension A */
- [0x37ee, 0x37ee], /* CJK Ideograph Extension A */
- [0x37ef, 0x37ef], /* CJK Ideograph Extension A */
- [0x37f0, 0x37f0], /* CJK Ideograph Extension A */
- [0x37f1, 0x37f1], /* CJK Ideograph Extension A */
- [0x37f2, 0x37f2], /* CJK Ideograph Extension A */
- [0x37f3, 0x37f3], /* CJK Ideograph Extension A */
- [0x37f4, 0x37f4], /* CJK Ideograph Extension A */
- [0x37f5, 0x37f5], /* CJK Ideograph Extension A */
- [0x37f6, 0x37f6], /* CJK Ideograph Extension A */
- [0x37f7, 0x37f7], /* CJK Ideograph Extension A */
- [0x37f8, 0x37f8], /* CJK Ideograph Extension A */
- [0x37f9, 0x37f9], /* CJK Ideograph Extension A */
- [0x37fa, 0x37fa], /* CJK Ideograph Extension A */
- [0x37fb, 0x37fb], /* CJK Ideograph Extension A */
- [0x37fc, 0x37fc], /* CJK Ideograph Extension A */
- [0x37fd, 0x37fd], /* CJK Ideograph Extension A */
- [0x37fe, 0x37fe], /* CJK Ideograph Extension A */
- [0x37ff, 0x37ff], /* CJK Ideograph Extension A */
- [0x3800, 0x3800], /* CJK Ideograph Extension A */
- [0x3801, 0x3801], /* CJK Ideograph Extension A */
- [0x3802, 0x3802], /* CJK Ideograph Extension A */
- [0x3803, 0x3803], /* CJK Ideograph Extension A */
- [0x3804, 0x3804], /* CJK Ideograph Extension A */
- [0x3805, 0x3805], /* CJK Ideograph Extension A */
- [0x3806, 0x3806], /* CJK Ideograph Extension A */
- [0x3807, 0x3807], /* CJK Ideograph Extension A */
- [0x3808, 0x3808], /* CJK Ideograph Extension A */
- [0x3809, 0x3809], /* CJK Ideograph Extension A */
- [0x380a, 0x380a], /* CJK Ideograph Extension A */
- [0x380b, 0x380b], /* CJK Ideograph Extension A */
- [0x380c, 0x380c], /* CJK Ideograph Extension A */
- [0x380d, 0x380d], /* CJK Ideograph Extension A */
- [0x380e, 0x380e], /* CJK Ideograph Extension A */
- [0x380f, 0x380f], /* CJK Ideograph Extension A */
- [0x3810, 0x3810], /* CJK Ideograph Extension A */
- [0x3811, 0x3811], /* CJK Ideograph Extension A */
- [0x3812, 0x3812], /* CJK Ideograph Extension A */
- [0x3813, 0x3813], /* CJK Ideograph Extension A */
- [0x3814, 0x3814], /* CJK Ideograph Extension A */
- [0x3815, 0x3815], /* CJK Ideograph Extension A */
- [0x3816, 0x3816], /* CJK Ideograph Extension A */
- [0x3817, 0x3817], /* CJK Ideograph Extension A */
- [0x3818, 0x3818], /* CJK Ideograph Extension A */
- [0x3819, 0x3819], /* CJK Ideograph Extension A */
- [0x381a, 0x381a], /* CJK Ideograph Extension A */
- [0x381b, 0x381b], /* CJK Ideograph Extension A */
- [0x381c, 0x381c], /* CJK Ideograph Extension A */
- [0x381d, 0x381d], /* CJK Ideograph Extension A */
- [0x381e, 0x381e], /* CJK Ideograph Extension A */
- [0x381f, 0x381f], /* CJK Ideograph Extension A */
- [0x3820, 0x3820], /* CJK Ideograph Extension A */
- [0x3821, 0x3821], /* CJK Ideograph Extension A */
- [0x3822, 0x3822], /* CJK Ideograph Extension A */
- [0x3823, 0x3823], /* CJK Ideograph Extension A */
- [0x3824, 0x3824], /* CJK Ideograph Extension A */
- [0x3825, 0x3825], /* CJK Ideograph Extension A */
- [0x3826, 0x3826], /* CJK Ideograph Extension A */
- [0x3827, 0x3827], /* CJK Ideograph Extension A */
- [0x3828, 0x3828], /* CJK Ideograph Extension A */
- [0x3829, 0x3829], /* CJK Ideograph Extension A */
- [0x382a, 0x382a], /* CJK Ideograph Extension A */
- [0x382b, 0x382b], /* CJK Ideograph Extension A */
- [0x382c, 0x382c], /* CJK Ideograph Extension A */
- [0x382d, 0x382d], /* CJK Ideograph Extension A */
- [0x382e, 0x382e], /* CJK Ideograph Extension A */
- [0x382f, 0x382f], /* CJK Ideograph Extension A */
- [0x3830, 0x3830], /* CJK Ideograph Extension A */
- [0x3831, 0x3831], /* CJK Ideograph Extension A */
- [0x3832, 0x3832], /* CJK Ideograph Extension A */
- [0x3833, 0x3833], /* CJK Ideograph Extension A */
- [0x3834, 0x3834], /* CJK Ideograph Extension A */
- [0x3835, 0x3835], /* CJK Ideograph Extension A */
- [0x3836, 0x3836], /* CJK Ideograph Extension A */
- [0x3837, 0x3837], /* CJK Ideograph Extension A */
- [0x3838, 0x3838], /* CJK Ideograph Extension A */
- [0x3839, 0x3839], /* CJK Ideograph Extension A */
- [0x383a, 0x383a], /* CJK Ideograph Extension A */
- [0x383b, 0x383b], /* CJK Ideograph Extension A */
- [0x383c, 0x383c], /* CJK Ideograph Extension A */
- [0x383d, 0x383d], /* CJK Ideograph Extension A */
- [0x383e, 0x383e], /* CJK Ideograph Extension A */
- [0x383f, 0x383f], /* CJK Ideograph Extension A */
- [0x3840, 0x3840], /* CJK Ideograph Extension A */
- [0x3841, 0x3841], /* CJK Ideograph Extension A */
- [0x3842, 0x3842], /* CJK Ideograph Extension A */
- [0x3843, 0x3843], /* CJK Ideograph Extension A */
- [0x3844, 0x3844], /* CJK Ideograph Extension A */
- [0x3845, 0x3845], /* CJK Ideograph Extension A */
- [0x3846, 0x3846], /* CJK Ideograph Extension A */
- [0x3847, 0x3847], /* CJK Ideograph Extension A */
- [0x3848, 0x3848], /* CJK Ideograph Extension A */
- [0x3849, 0x3849], /* CJK Ideograph Extension A */
- [0x384a, 0x384a], /* CJK Ideograph Extension A */
- [0x384b, 0x384b], /* CJK Ideograph Extension A */
- [0x384c, 0x384c], /* CJK Ideograph Extension A */
- [0x384d, 0x384d], /* CJK Ideograph Extension A */
- [0x384e, 0x384e], /* CJK Ideograph Extension A */
- [0x384f, 0x384f], /* CJK Ideograph Extension A */
- [0x3850, 0x3850], /* CJK Ideograph Extension A */
- [0x3851, 0x3851], /* CJK Ideograph Extension A */
- [0x3852, 0x3852], /* CJK Ideograph Extension A */
- [0x3853, 0x3853], /* CJK Ideograph Extension A */
- [0x3854, 0x3854], /* CJK Ideograph Extension A */
- [0x3855, 0x3855], /* CJK Ideograph Extension A */
- [0x3856, 0x3856], /* CJK Ideograph Extension A */
- [0x3857, 0x3857], /* CJK Ideograph Extension A */
- [0x3858, 0x3858], /* CJK Ideograph Extension A */
- [0x3859, 0x3859], /* CJK Ideograph Extension A */
- [0x385a, 0x385a], /* CJK Ideograph Extension A */
- [0x385b, 0x385b], /* CJK Ideograph Extension A */
- [0x385c, 0x385c], /* CJK Ideograph Extension A */
- [0x385d, 0x385d], /* CJK Ideograph Extension A */
- [0x385e, 0x385e], /* CJK Ideograph Extension A */
- [0x385f, 0x385f], /* CJK Ideograph Extension A */
- [0x3860, 0x3860], /* CJK Ideograph Extension A */
- [0x3861, 0x3861], /* CJK Ideograph Extension A */
- [0x3862, 0x3862], /* CJK Ideograph Extension A */
- [0x3863, 0x3863], /* CJK Ideograph Extension A */
- [0x3864, 0x3864], /* CJK Ideograph Extension A */
- [0x3865, 0x3865], /* CJK Ideograph Extension A */
- [0x3866, 0x3866], /* CJK Ideograph Extension A */
- [0x3867, 0x3867], /* CJK Ideograph Extension A */
- [0x3868, 0x3868], /* CJK Ideograph Extension A */
- [0x3869, 0x3869], /* CJK Ideograph Extension A */
- [0x386a, 0x386a], /* CJK Ideograph Extension A */
- [0x386b, 0x386b], /* CJK Ideograph Extension A */
- [0x386c, 0x386c], /* CJK Ideograph Extension A */
- [0x386d, 0x386d], /* CJK Ideograph Extension A */
- [0x386e, 0x386e], /* CJK Ideograph Extension A */
- [0x386f, 0x386f], /* CJK Ideograph Extension A */
- [0x3870, 0x3870], /* CJK Ideograph Extension A */
- [0x3871, 0x3871], /* CJK Ideograph Extension A */
- [0x3872, 0x3872], /* CJK Ideograph Extension A */
- [0x3873, 0x3873], /* CJK Ideograph Extension A */
- [0x3874, 0x3874], /* CJK Ideograph Extension A */
- [0x3875, 0x3875], /* CJK Ideograph Extension A */
- [0x3876, 0x3876], /* CJK Ideograph Extension A */
- [0x3877, 0x3877], /* CJK Ideograph Extension A */
- [0x3878, 0x3878], /* CJK Ideograph Extension A */
- [0x3879, 0x3879], /* CJK Ideograph Extension A */
- [0x387a, 0x387a], /* CJK Ideograph Extension A */
- [0x387b, 0x387b], /* CJK Ideograph Extension A */
- [0x387c, 0x387c], /* CJK Ideograph Extension A */
- [0x387d, 0x387d], /* CJK Ideograph Extension A */
- [0x387e, 0x387e], /* CJK Ideograph Extension A */
- [0x387f, 0x387f], /* CJK Ideograph Extension A */
- [0x3880, 0x3880], /* CJK Ideograph Extension A */
- [0x3881, 0x3881], /* CJK Ideograph Extension A */
- [0x3882, 0x3882], /* CJK Ideograph Extension A */
- [0x3883, 0x3883], /* CJK Ideograph Extension A */
- [0x3884, 0x3884], /* CJK Ideograph Extension A */
- [0x3885, 0x3885], /* CJK Ideograph Extension A */
- [0x3886, 0x3886], /* CJK Ideograph Extension A */
- [0x3887, 0x3887], /* CJK Ideograph Extension A */
- [0x3888, 0x3888], /* CJK Ideograph Extension A */
- [0x3889, 0x3889], /* CJK Ideograph Extension A */
- [0x388a, 0x388a], /* CJK Ideograph Extension A */
- [0x388b, 0x388b], /* CJK Ideograph Extension A */
- [0x388c, 0x388c], /* CJK Ideograph Extension A */
- [0x388d, 0x388d], /* CJK Ideograph Extension A */
- [0x388e, 0x388e], /* CJK Ideograph Extension A */
- [0x388f, 0x388f], /* CJK Ideograph Extension A */
- [0x3890, 0x3890], /* CJK Ideograph Extension A */
- [0x3891, 0x3891], /* CJK Ideograph Extension A */
- [0x3892, 0x3892], /* CJK Ideograph Extension A */
- [0x3893, 0x3893], /* CJK Ideograph Extension A */
- [0x3894, 0x3894], /* CJK Ideograph Extension A */
- [0x3895, 0x3895], /* CJK Ideograph Extension A */
- [0x3896, 0x3896], /* CJK Ideograph Extension A */
- [0x3897, 0x3897], /* CJK Ideograph Extension A */
- [0x3898, 0x3898], /* CJK Ideograph Extension A */
- [0x3899, 0x3899], /* CJK Ideograph Extension A */
- [0x389a, 0x389a], /* CJK Ideograph Extension A */
- [0x389b, 0x389b], /* CJK Ideograph Extension A */
- [0x389c, 0x389c], /* CJK Ideograph Extension A */
- [0x389d, 0x389d], /* CJK Ideograph Extension A */
- [0x389e, 0x389e], /* CJK Ideograph Extension A */
- [0x389f, 0x389f], /* CJK Ideograph Extension A */
- [0x38a0, 0x38a0], /* CJK Ideograph Extension A */
- [0x38a1, 0x38a1], /* CJK Ideograph Extension A */
- [0x38a2, 0x38a2], /* CJK Ideograph Extension A */
- [0x38a3, 0x38a3], /* CJK Ideograph Extension A */
- [0x38a4, 0x38a4], /* CJK Ideograph Extension A */
- [0x38a5, 0x38a5], /* CJK Ideograph Extension A */
- [0x38a6, 0x38a6], /* CJK Ideograph Extension A */
- [0x38a7, 0x38a7], /* CJK Ideograph Extension A */
- [0x38a8, 0x38a8], /* CJK Ideograph Extension A */
- [0x38a9, 0x38a9], /* CJK Ideograph Extension A */
- [0x38aa, 0x38aa], /* CJK Ideograph Extension A */
- [0x38ab, 0x38ab], /* CJK Ideograph Extension A */
- [0x38ac, 0x38ac], /* CJK Ideograph Extension A */
- [0x38ad, 0x38ad], /* CJK Ideograph Extension A */
- [0x38ae, 0x38ae], /* CJK Ideograph Extension A */
- [0x38af, 0x38af], /* CJK Ideograph Extension A */
- [0x38b0, 0x38b0], /* CJK Ideograph Extension A */
- [0x38b1, 0x38b1], /* CJK Ideograph Extension A */
- [0x38b2, 0x38b2], /* CJK Ideograph Extension A */
- [0x38b3, 0x38b3], /* CJK Ideograph Extension A */
- [0x38b4, 0x38b4], /* CJK Ideograph Extension A */
- [0x38b5, 0x38b5], /* CJK Ideograph Extension A */
- [0x38b6, 0x38b6], /* CJK Ideograph Extension A */
- [0x38b7, 0x38b7], /* CJK Ideograph Extension A */
- [0x38b8, 0x38b8], /* CJK Ideograph Extension A */
- [0x38b9, 0x38b9], /* CJK Ideograph Extension A */
- [0x38ba, 0x38ba], /* CJK Ideograph Extension A */
- [0x38bb, 0x38bb], /* CJK Ideograph Extension A */
- [0x38bc, 0x38bc], /* CJK Ideograph Extension A */
- [0x38bd, 0x38bd], /* CJK Ideograph Extension A */
- [0x38be, 0x38be], /* CJK Ideograph Extension A */
- [0x38bf, 0x38bf], /* CJK Ideograph Extension A */
- [0x38c0, 0x38c0], /* CJK Ideograph Extension A */
- [0x38c1, 0x38c1], /* CJK Ideograph Extension A */
- [0x38c2, 0x38c2], /* CJK Ideograph Extension A */
- [0x38c3, 0x38c3], /* CJK Ideograph Extension A */
- [0x38c4, 0x38c4], /* CJK Ideograph Extension A */
- [0x38c5, 0x38c5], /* CJK Ideograph Extension A */
- [0x38c6, 0x38c6], /* CJK Ideograph Extension A */
- [0x38c7, 0x38c7], /* CJK Ideograph Extension A */
- [0x38c8, 0x38c8], /* CJK Ideograph Extension A */
- [0x38c9, 0x38c9], /* CJK Ideograph Extension A */
- [0x38ca, 0x38ca], /* CJK Ideograph Extension A */
- [0x38cb, 0x38cb], /* CJK Ideograph Extension A */
- [0x38cc, 0x38cc], /* CJK Ideograph Extension A */
- [0x38cd, 0x38cd], /* CJK Ideograph Extension A */
- [0x38ce, 0x38ce], /* CJK Ideograph Extension A */
- [0x38cf, 0x38cf], /* CJK Ideograph Extension A */
- [0x38d0, 0x38d0], /* CJK Ideograph Extension A */
- [0x38d1, 0x38d1], /* CJK Ideograph Extension A */
- [0x38d2, 0x38d2], /* CJK Ideograph Extension A */
- [0x38d3, 0x38d3], /* CJK Ideograph Extension A */
- [0x38d4, 0x38d4], /* CJK Ideograph Extension A */
- [0x38d5, 0x38d5], /* CJK Ideograph Extension A */
- [0x38d6, 0x38d6], /* CJK Ideograph Extension A */
- [0x38d7, 0x38d7], /* CJK Ideograph Extension A */
- [0x38d8, 0x38d8], /* CJK Ideograph Extension A */
- [0x38d9, 0x38d9], /* CJK Ideograph Extension A */
- [0x38da, 0x38da], /* CJK Ideograph Extension A */
- [0x38db, 0x38db], /* CJK Ideograph Extension A */
- [0x38dc, 0x38dc], /* CJK Ideograph Extension A */
- [0x38dd, 0x38dd], /* CJK Ideograph Extension A */
- [0x38de, 0x38de], /* CJK Ideograph Extension A */
- [0x38df, 0x38df], /* CJK Ideograph Extension A */
- [0x38e0, 0x38e0], /* CJK Ideograph Extension A */
- [0x38e1, 0x38e1], /* CJK Ideograph Extension A */
- [0x38e2, 0x38e2], /* CJK Ideograph Extension A */
- [0x38e3, 0x38e3], /* CJK Ideograph Extension A */
- [0x38e4, 0x38e4], /* CJK Ideograph Extension A */
- [0x38e5, 0x38e5], /* CJK Ideograph Extension A */
- [0x38e6, 0x38e6], /* CJK Ideograph Extension A */
- [0x38e7, 0x38e7], /* CJK Ideograph Extension A */
- [0x38e8, 0x38e8], /* CJK Ideograph Extension A */
- [0x38e9, 0x38e9], /* CJK Ideograph Extension A */
- [0x38ea, 0x38ea], /* CJK Ideograph Extension A */
- [0x38eb, 0x38eb], /* CJK Ideograph Extension A */
- [0x38ec, 0x38ec], /* CJK Ideograph Extension A */
- [0x38ed, 0x38ed], /* CJK Ideograph Extension A */
- [0x38ee, 0x38ee], /* CJK Ideograph Extension A */
- [0x38ef, 0x38ef], /* CJK Ideograph Extension A */
- [0x38f0, 0x38f0], /* CJK Ideograph Extension A */
- [0x38f1, 0x38f1], /* CJK Ideograph Extension A */
- [0x38f2, 0x38f2], /* CJK Ideograph Extension A */
- [0x38f3, 0x38f3], /* CJK Ideograph Extension A */
- [0x38f4, 0x38f4], /* CJK Ideograph Extension A */
- [0x38f5, 0x38f5], /* CJK Ideograph Extension A */
- [0x38f6, 0x38f6], /* CJK Ideograph Extension A */
- [0x38f7, 0x38f7], /* CJK Ideograph Extension A */
- [0x38f8, 0x38f8], /* CJK Ideograph Extension A */
- [0x38f9, 0x38f9], /* CJK Ideograph Extension A */
- [0x38fa, 0x38fa], /* CJK Ideograph Extension A */
- [0x38fb, 0x38fb], /* CJK Ideograph Extension A */
- [0x38fc, 0x38fc], /* CJK Ideograph Extension A */
- [0x38fd, 0x38fd], /* CJK Ideograph Extension A */
- [0x38fe, 0x38fe], /* CJK Ideograph Extension A */
- [0x38ff, 0x38ff], /* CJK Ideograph Extension A */
- [0x3900, 0x3900], /* CJK Ideograph Extension A */
- [0x3901, 0x3901], /* CJK Ideograph Extension A */
- [0x3902, 0x3902], /* CJK Ideograph Extension A */
- [0x3903, 0x3903], /* CJK Ideograph Extension A */
- [0x3904, 0x3904], /* CJK Ideograph Extension A */
- [0x3905, 0x3905], /* CJK Ideograph Extension A */
- [0x3906, 0x3906], /* CJK Ideograph Extension A */
- [0x3907, 0x3907], /* CJK Ideograph Extension A */
- [0x3908, 0x3908], /* CJK Ideograph Extension A */
- [0x3909, 0x3909], /* CJK Ideograph Extension A */
- [0x390a, 0x390a], /* CJK Ideograph Extension A */
- [0x390b, 0x390b], /* CJK Ideograph Extension A */
- [0x390c, 0x390c], /* CJK Ideograph Extension A */
- [0x390d, 0x390d], /* CJK Ideograph Extension A */
- [0x390e, 0x390e], /* CJK Ideograph Extension A */
- [0x390f, 0x390f], /* CJK Ideograph Extension A */
- [0x3910, 0x3910], /* CJK Ideograph Extension A */
- [0x3911, 0x3911], /* CJK Ideograph Extension A */
- [0x3912, 0x3912], /* CJK Ideograph Extension A */
- [0x3913, 0x3913], /* CJK Ideograph Extension A */
- [0x3914, 0x3914], /* CJK Ideograph Extension A */
- [0x3915, 0x3915], /* CJK Ideograph Extension A */
- [0x3916, 0x3916], /* CJK Ideograph Extension A */
- [0x3917, 0x3917], /* CJK Ideograph Extension A */
- [0x3918, 0x3918], /* CJK Ideograph Extension A */
- [0x3919, 0x3919], /* CJK Ideograph Extension A */
- [0x391a, 0x391a], /* CJK Ideograph Extension A */
- [0x391b, 0x391b], /* CJK Ideograph Extension A */
- [0x391c, 0x391c], /* CJK Ideograph Extension A */
- [0x391d, 0x391d], /* CJK Ideograph Extension A */
- [0x391e, 0x391e], /* CJK Ideograph Extension A */
- [0x391f, 0x391f], /* CJK Ideograph Extension A */
- [0x3920, 0x3920], /* CJK Ideograph Extension A */
- [0x3921, 0x3921], /* CJK Ideograph Extension A */
- [0x3922, 0x3922], /* CJK Ideograph Extension A */
- [0x3923, 0x3923], /* CJK Ideograph Extension A */
- [0x3924, 0x3924], /* CJK Ideograph Extension A */
- [0x3925, 0x3925], /* CJK Ideograph Extension A */
- [0x3926, 0x3926], /* CJK Ideograph Extension A */
- [0x3927, 0x3927], /* CJK Ideograph Extension A */
- [0x3928, 0x3928], /* CJK Ideograph Extension A */
- [0x3929, 0x3929], /* CJK Ideograph Extension A */
- [0x392a, 0x392a], /* CJK Ideograph Extension A */
- [0x392b, 0x392b], /* CJK Ideograph Extension A */
- [0x392c, 0x392c], /* CJK Ideograph Extension A */
- [0x392d, 0x392d], /* CJK Ideograph Extension A */
- [0x392e, 0x392e], /* CJK Ideograph Extension A */
- [0x392f, 0x392f], /* CJK Ideograph Extension A */
- [0x3930, 0x3930], /* CJK Ideograph Extension A */
- [0x3931, 0x3931], /* CJK Ideograph Extension A */
- [0x3932, 0x3932], /* CJK Ideograph Extension A */
- [0x3933, 0x3933], /* CJK Ideograph Extension A */
- [0x3934, 0x3934], /* CJK Ideograph Extension A */
- [0x3935, 0x3935], /* CJK Ideograph Extension A */
- [0x3936, 0x3936], /* CJK Ideograph Extension A */
- [0x3937, 0x3937], /* CJK Ideograph Extension A */
- [0x3938, 0x3938], /* CJK Ideograph Extension A */
- [0x3939, 0x3939], /* CJK Ideograph Extension A */
- [0x393a, 0x393a], /* CJK Ideograph Extension A */
- [0x393b, 0x393b], /* CJK Ideograph Extension A */
- [0x393c, 0x393c], /* CJK Ideograph Extension A */
- [0x393d, 0x393d], /* CJK Ideograph Extension A */
- [0x393e, 0x393e], /* CJK Ideograph Extension A */
- [0x393f, 0x393f], /* CJK Ideograph Extension A */
- [0x3940, 0x3940], /* CJK Ideograph Extension A */
- [0x3941, 0x3941], /* CJK Ideograph Extension A */
- [0x3942, 0x3942], /* CJK Ideograph Extension A */
- [0x3943, 0x3943], /* CJK Ideograph Extension A */
- [0x3944, 0x3944], /* CJK Ideograph Extension A */
- [0x3945, 0x3945], /* CJK Ideograph Extension A */
- [0x3946, 0x3946], /* CJK Ideograph Extension A */
- [0x3947, 0x3947], /* CJK Ideograph Extension A */
- [0x3948, 0x3948], /* CJK Ideograph Extension A */
- [0x3949, 0x3949], /* CJK Ideograph Extension A */
- [0x394a, 0x394a], /* CJK Ideograph Extension A */
- [0x394b, 0x394b], /* CJK Ideograph Extension A */
- [0x394c, 0x394c], /* CJK Ideograph Extension A */
- [0x394d, 0x394d], /* CJK Ideograph Extension A */
- [0x394e, 0x394e], /* CJK Ideograph Extension A */
- [0x394f, 0x394f], /* CJK Ideograph Extension A */
- [0x3950, 0x3950], /* CJK Ideograph Extension A */
- [0x3951, 0x3951], /* CJK Ideograph Extension A */
- [0x3952, 0x3952], /* CJK Ideograph Extension A */
- [0x3953, 0x3953], /* CJK Ideograph Extension A */
- [0x3954, 0x3954], /* CJK Ideograph Extension A */
- [0x3955, 0x3955], /* CJK Ideograph Extension A */
- [0x3956, 0x3956], /* CJK Ideograph Extension A */
- [0x3957, 0x3957], /* CJK Ideograph Extension A */
- [0x3958, 0x3958], /* CJK Ideograph Extension A */
- [0x3959, 0x3959], /* CJK Ideograph Extension A */
- [0x395a, 0x395a], /* CJK Ideograph Extension A */
- [0x395b, 0x395b], /* CJK Ideograph Extension A */
- [0x395c, 0x395c], /* CJK Ideograph Extension A */
- [0x395d, 0x395d], /* CJK Ideograph Extension A */
- [0x395e, 0x395e], /* CJK Ideograph Extension A */
- [0x395f, 0x395f], /* CJK Ideograph Extension A */
- [0x3960, 0x3960], /* CJK Ideograph Extension A */
- [0x3961, 0x3961], /* CJK Ideograph Extension A */
- [0x3962, 0x3962], /* CJK Ideograph Extension A */
- [0x3963, 0x3963], /* CJK Ideograph Extension A */
- [0x3964, 0x3964], /* CJK Ideograph Extension A */
- [0x3965, 0x3965], /* CJK Ideograph Extension A */
- [0x3966, 0x3966], /* CJK Ideograph Extension A */
- [0x3967, 0x3967], /* CJK Ideograph Extension A */
- [0x3968, 0x3968], /* CJK Ideograph Extension A */
- [0x3969, 0x3969], /* CJK Ideograph Extension A */
- [0x396a, 0x396a], /* CJK Ideograph Extension A */
- [0x396b, 0x396b], /* CJK Ideograph Extension A */
- [0x396c, 0x396c], /* CJK Ideograph Extension A */
- [0x396d, 0x396d], /* CJK Ideograph Extension A */
- [0x396e, 0x396e], /* CJK Ideograph Extension A */
- [0x396f, 0x396f], /* CJK Ideograph Extension A */
- [0x3970, 0x3970], /* CJK Ideograph Extension A */
- [0x3971, 0x3971], /* CJK Ideograph Extension A */
- [0x3972, 0x3972], /* CJK Ideograph Extension A */
- [0x3973, 0x3973], /* CJK Ideograph Extension A */
- [0x3974, 0x3974], /* CJK Ideograph Extension A */
- [0x3975, 0x3975], /* CJK Ideograph Extension A */
- [0x3976, 0x3976], /* CJK Ideograph Extension A */
- [0x3977, 0x3977], /* CJK Ideograph Extension A */
- [0x3978, 0x3978], /* CJK Ideograph Extension A */
- [0x3979, 0x3979], /* CJK Ideograph Extension A */
- [0x397a, 0x397a], /* CJK Ideograph Extension A */
- [0x397b, 0x397b], /* CJK Ideograph Extension A */
- [0x397c, 0x397c], /* CJK Ideograph Extension A */
- [0x397d, 0x397d], /* CJK Ideograph Extension A */
- [0x397e, 0x397e], /* CJK Ideograph Extension A */
- [0x397f, 0x397f], /* CJK Ideograph Extension A */
- [0x3980, 0x3980], /* CJK Ideograph Extension A */
- [0x3981, 0x3981], /* CJK Ideograph Extension A */
- [0x3982, 0x3982], /* CJK Ideograph Extension A */
- [0x3983, 0x3983], /* CJK Ideograph Extension A */
- [0x3984, 0x3984], /* CJK Ideograph Extension A */
- [0x3985, 0x3985], /* CJK Ideograph Extension A */
- [0x3986, 0x3986], /* CJK Ideograph Extension A */
- [0x3987, 0x3987], /* CJK Ideograph Extension A */
- [0x3988, 0x3988], /* CJK Ideograph Extension A */
- [0x3989, 0x3989], /* CJK Ideograph Extension A */
- [0x398a, 0x398a], /* CJK Ideograph Extension A */
- [0x398b, 0x398b], /* CJK Ideograph Extension A */
- [0x398c, 0x398c], /* CJK Ideograph Extension A */
- [0x398d, 0x398d], /* CJK Ideograph Extension A */
- [0x398e, 0x398e], /* CJK Ideograph Extension A */
- [0x398f, 0x398f], /* CJK Ideograph Extension A */
- [0x3990, 0x3990], /* CJK Ideograph Extension A */
- [0x3991, 0x3991], /* CJK Ideograph Extension A */
- [0x3992, 0x3992], /* CJK Ideograph Extension A */
- [0x3993, 0x3993], /* CJK Ideograph Extension A */
- [0x3994, 0x3994], /* CJK Ideograph Extension A */
- [0x3995, 0x3995], /* CJK Ideograph Extension A */
- [0x3996, 0x3996], /* CJK Ideograph Extension A */
- [0x3997, 0x3997], /* CJK Ideograph Extension A */
- [0x3998, 0x3998], /* CJK Ideograph Extension A */
- [0x3999, 0x3999], /* CJK Ideograph Extension A */
- [0x399a, 0x399a], /* CJK Ideograph Extension A */
- [0x399b, 0x399b], /* CJK Ideograph Extension A */
- [0x399c, 0x399c], /* CJK Ideograph Extension A */
- [0x399d, 0x399d], /* CJK Ideograph Extension A */
- [0x399e, 0x399e], /* CJK Ideograph Extension A */
- [0x399f, 0x399f], /* CJK Ideograph Extension A */
- [0x39a0, 0x39a0], /* CJK Ideograph Extension A */
- [0x39a1, 0x39a1], /* CJK Ideograph Extension A */
- [0x39a2, 0x39a2], /* CJK Ideograph Extension A */
- [0x39a3, 0x39a3], /* CJK Ideograph Extension A */
- [0x39a4, 0x39a4], /* CJK Ideograph Extension A */
- [0x39a5, 0x39a5], /* CJK Ideograph Extension A */
- [0x39a6, 0x39a6], /* CJK Ideograph Extension A */
- [0x39a7, 0x39a7], /* CJK Ideograph Extension A */
- [0x39a8, 0x39a8], /* CJK Ideograph Extension A */
- [0x39a9, 0x39a9], /* CJK Ideograph Extension A */
- [0x39aa, 0x39aa], /* CJK Ideograph Extension A */
- [0x39ab, 0x39ab], /* CJK Ideograph Extension A */
- [0x39ac, 0x39ac], /* CJK Ideograph Extension A */
- [0x39ad, 0x39ad], /* CJK Ideograph Extension A */
- [0x39ae, 0x39ae], /* CJK Ideograph Extension A */
- [0x39af, 0x39af], /* CJK Ideograph Extension A */
- [0x39b0, 0x39b0], /* CJK Ideograph Extension A */
- [0x39b1, 0x39b1], /* CJK Ideograph Extension A */
- [0x39b2, 0x39b2], /* CJK Ideograph Extension A */
- [0x39b3, 0x39b3], /* CJK Ideograph Extension A */
- [0x39b4, 0x39b4], /* CJK Ideograph Extension A */
- [0x39b5, 0x39b5], /* CJK Ideograph Extension A */
- [0x39b6, 0x39b6], /* CJK Ideograph Extension A */
- [0x39b7, 0x39b7], /* CJK Ideograph Extension A */
- [0x39b8, 0x39b8], /* CJK Ideograph Extension A */
- [0x39b9, 0x39b9], /* CJK Ideograph Extension A */
- [0x39ba, 0x39ba], /* CJK Ideograph Extension A */
- [0x39bb, 0x39bb], /* CJK Ideograph Extension A */
- [0x39bc, 0x39bc], /* CJK Ideograph Extension A */
- [0x39bd, 0x39bd], /* CJK Ideograph Extension A */
- [0x39be, 0x39be], /* CJK Ideograph Extension A */
- [0x39bf, 0x39bf], /* CJK Ideograph Extension A */
- [0x39c0, 0x39c0], /* CJK Ideograph Extension A */
- [0x39c1, 0x39c1], /* CJK Ideograph Extension A */
- [0x39c2, 0x39c2], /* CJK Ideograph Extension A */
- [0x39c3, 0x39c3], /* CJK Ideograph Extension A */
- [0x39c4, 0x39c4], /* CJK Ideograph Extension A */
- [0x39c5, 0x39c5], /* CJK Ideograph Extension A */
- [0x39c6, 0x39c6], /* CJK Ideograph Extension A */
- [0x39c7, 0x39c7], /* CJK Ideograph Extension A */
- [0x39c8, 0x39c8], /* CJK Ideograph Extension A */
- [0x39c9, 0x39c9], /* CJK Ideograph Extension A */
- [0x39ca, 0x39ca], /* CJK Ideograph Extension A */
- [0x39cb, 0x39cb], /* CJK Ideograph Extension A */
- [0x39cc, 0x39cc], /* CJK Ideograph Extension A */
- [0x39cd, 0x39cd], /* CJK Ideograph Extension A */
- [0x39ce, 0x39ce], /* CJK Ideograph Extension A */
- [0x39cf, 0x39cf], /* CJK Ideograph Extension A */
- [0x39d0, 0x39d0], /* CJK Ideograph Extension A */
- [0x39d1, 0x39d1], /* CJK Ideograph Extension A */
- [0x39d2, 0x39d2], /* CJK Ideograph Extension A */
- [0x39d3, 0x39d3], /* CJK Ideograph Extension A */
- [0x39d4, 0x39d4], /* CJK Ideograph Extension A */
- [0x39d5, 0x39d5], /* CJK Ideograph Extension A */
- [0x39d6, 0x39d6], /* CJK Ideograph Extension A */
- [0x39d7, 0x39d7], /* CJK Ideograph Extension A */
- [0x39d8, 0x39d8], /* CJK Ideograph Extension A */
- [0x39d9, 0x39d9], /* CJK Ideograph Extension A */
- [0x39da, 0x39da], /* CJK Ideograph Extension A */
- [0x39db, 0x39db], /* CJK Ideograph Extension A */
- [0x39dc, 0x39dc], /* CJK Ideograph Extension A */
- [0x39dd, 0x39dd], /* CJK Ideograph Extension A */
- [0x39de, 0x39de], /* CJK Ideograph Extension A */
- [0x39df, 0x39df], /* CJK Ideograph Extension A */
- [0x39e0, 0x39e0], /* CJK Ideograph Extension A */
- [0x39e1, 0x39e1], /* CJK Ideograph Extension A */
- [0x39e2, 0x39e2], /* CJK Ideograph Extension A */
- [0x39e3, 0x39e3], /* CJK Ideograph Extension A */
- [0x39e4, 0x39e4], /* CJK Ideograph Extension A */
- [0x39e5, 0x39e5], /* CJK Ideograph Extension A */
- [0x39e6, 0x39e6], /* CJK Ideograph Extension A */
- [0x39e7, 0x39e7], /* CJK Ideograph Extension A */
- [0x39e8, 0x39e8], /* CJK Ideograph Extension A */
- [0x39e9, 0x39e9], /* CJK Ideograph Extension A */
- [0x39ea, 0x39ea], /* CJK Ideograph Extension A */
- [0x39eb, 0x39eb], /* CJK Ideograph Extension A */
- [0x39ec, 0x39ec], /* CJK Ideograph Extension A */
- [0x39ed, 0x39ed], /* CJK Ideograph Extension A */
- [0x39ee, 0x39ee], /* CJK Ideograph Extension A */
- [0x39ef, 0x39ef], /* CJK Ideograph Extension A */
- [0x39f0, 0x39f0], /* CJK Ideograph Extension A */
- [0x39f1, 0x39f1], /* CJK Ideograph Extension A */
- [0x39f2, 0x39f2], /* CJK Ideograph Extension A */
- [0x39f3, 0x39f3], /* CJK Ideograph Extension A */
- [0x39f4, 0x39f4], /* CJK Ideograph Extension A */
- [0x39f5, 0x39f5], /* CJK Ideograph Extension A */
- [0x39f6, 0x39f6], /* CJK Ideograph Extension A */
- [0x39f7, 0x39f7], /* CJK Ideograph Extension A */
- [0x39f8, 0x39f8], /* CJK Ideograph Extension A */
- [0x39f9, 0x39f9], /* CJK Ideograph Extension A */
- [0x39fa, 0x39fa], /* CJK Ideograph Extension A */
- [0x39fb, 0x39fb], /* CJK Ideograph Extension A */
- [0x39fc, 0x39fc], /* CJK Ideograph Extension A */
- [0x39fd, 0x39fd], /* CJK Ideograph Extension A */
- [0x39fe, 0x39fe], /* CJK Ideograph Extension A */
- [0x39ff, 0x39ff], /* CJK Ideograph Extension A */
- [0x3a00, 0x3a00], /* CJK Ideograph Extension A */
- [0x3a01, 0x3a01], /* CJK Ideograph Extension A */
- [0x3a02, 0x3a02], /* CJK Ideograph Extension A */
- [0x3a03, 0x3a03], /* CJK Ideograph Extension A */
- [0x3a04, 0x3a04], /* CJK Ideograph Extension A */
- [0x3a05, 0x3a05], /* CJK Ideograph Extension A */
- [0x3a06, 0x3a06], /* CJK Ideograph Extension A */
- [0x3a07, 0x3a07], /* CJK Ideograph Extension A */
- [0x3a08, 0x3a08], /* CJK Ideograph Extension A */
- [0x3a09, 0x3a09], /* CJK Ideograph Extension A */
- [0x3a0a, 0x3a0a], /* CJK Ideograph Extension A */
- [0x3a0b, 0x3a0b], /* CJK Ideograph Extension A */
- [0x3a0c, 0x3a0c], /* CJK Ideograph Extension A */
- [0x3a0d, 0x3a0d], /* CJK Ideograph Extension A */
- [0x3a0e, 0x3a0e], /* CJK Ideograph Extension A */
- [0x3a0f, 0x3a0f], /* CJK Ideograph Extension A */
- [0x3a10, 0x3a10], /* CJK Ideograph Extension A */
- [0x3a11, 0x3a11], /* CJK Ideograph Extension A */
- [0x3a12, 0x3a12], /* CJK Ideograph Extension A */
- [0x3a13, 0x3a13], /* CJK Ideograph Extension A */
- [0x3a14, 0x3a14], /* CJK Ideograph Extension A */
- [0x3a15, 0x3a15], /* CJK Ideograph Extension A */
- [0x3a16, 0x3a16], /* CJK Ideograph Extension A */
- [0x3a17, 0x3a17], /* CJK Ideograph Extension A */
- [0x3a18, 0x3a18], /* CJK Ideograph Extension A */
- [0x3a19, 0x3a19], /* CJK Ideograph Extension A */
- [0x3a1a, 0x3a1a], /* CJK Ideograph Extension A */
- [0x3a1b, 0x3a1b], /* CJK Ideograph Extension A */
- [0x3a1c, 0x3a1c], /* CJK Ideograph Extension A */
- [0x3a1d, 0x3a1d], /* CJK Ideograph Extension A */
- [0x3a1e, 0x3a1e], /* CJK Ideograph Extension A */
- [0x3a1f, 0x3a1f], /* CJK Ideograph Extension A */
- [0x3a20, 0x3a20], /* CJK Ideograph Extension A */
- [0x3a21, 0x3a21], /* CJK Ideograph Extension A */
- [0x3a22, 0x3a22], /* CJK Ideograph Extension A */
- [0x3a23, 0x3a23], /* CJK Ideograph Extension A */
- [0x3a24, 0x3a24], /* CJK Ideograph Extension A */
- [0x3a25, 0x3a25], /* CJK Ideograph Extension A */
- [0x3a26, 0x3a26], /* CJK Ideograph Extension A */
- [0x3a27, 0x3a27], /* CJK Ideograph Extension A */
- [0x3a28, 0x3a28], /* CJK Ideograph Extension A */
- [0x3a29, 0x3a29], /* CJK Ideograph Extension A */
- [0x3a2a, 0x3a2a], /* CJK Ideograph Extension A */
- [0x3a2b, 0x3a2b], /* CJK Ideograph Extension A */
- [0x3a2c, 0x3a2c], /* CJK Ideograph Extension A */
- [0x3a2d, 0x3a2d], /* CJK Ideograph Extension A */
- [0x3a2e, 0x3a2e], /* CJK Ideograph Extension A */
- [0x3a2f, 0x3a2f], /* CJK Ideograph Extension A */
- [0x3a30, 0x3a30], /* CJK Ideograph Extension A */
- [0x3a31, 0x3a31], /* CJK Ideograph Extension A */
- [0x3a32, 0x3a32], /* CJK Ideograph Extension A */
- [0x3a33, 0x3a33], /* CJK Ideograph Extension A */
- [0x3a34, 0x3a34], /* CJK Ideograph Extension A */
- [0x3a35, 0x3a35], /* CJK Ideograph Extension A */
- [0x3a36, 0x3a36], /* CJK Ideograph Extension A */
- [0x3a37, 0x3a37], /* CJK Ideograph Extension A */
- [0x3a38, 0x3a38], /* CJK Ideograph Extension A */
- [0x3a39, 0x3a39], /* CJK Ideograph Extension A */
- [0x3a3a, 0x3a3a], /* CJK Ideograph Extension A */
- [0x3a3b, 0x3a3b], /* CJK Ideograph Extension A */
- [0x3a3c, 0x3a3c], /* CJK Ideograph Extension A */
- [0x3a3d, 0x3a3d], /* CJK Ideograph Extension A */
- [0x3a3e, 0x3a3e], /* CJK Ideograph Extension A */
- [0x3a3f, 0x3a3f], /* CJK Ideograph Extension A */
- [0x3a40, 0x3a40], /* CJK Ideograph Extension A */
- [0x3a41, 0x3a41], /* CJK Ideograph Extension A */
- [0x3a42, 0x3a42], /* CJK Ideograph Extension A */
- [0x3a43, 0x3a43], /* CJK Ideograph Extension A */
- [0x3a44, 0x3a44], /* CJK Ideograph Extension A */
- [0x3a45, 0x3a45], /* CJK Ideograph Extension A */
- [0x3a46, 0x3a46], /* CJK Ideograph Extension A */
- [0x3a47, 0x3a47], /* CJK Ideograph Extension A */
- [0x3a48, 0x3a48], /* CJK Ideograph Extension A */
- [0x3a49, 0x3a49], /* CJK Ideograph Extension A */
- [0x3a4a, 0x3a4a], /* CJK Ideograph Extension A */
- [0x3a4b, 0x3a4b], /* CJK Ideograph Extension A */
- [0x3a4c, 0x3a4c], /* CJK Ideograph Extension A */
- [0x3a4d, 0x3a4d], /* CJK Ideograph Extension A */
- [0x3a4e, 0x3a4e], /* CJK Ideograph Extension A */
- [0x3a4f, 0x3a4f], /* CJK Ideograph Extension A */
- [0x3a50, 0x3a50], /* CJK Ideograph Extension A */
- [0x3a51, 0x3a51], /* CJK Ideograph Extension A */
- [0x3a52, 0x3a52], /* CJK Ideograph Extension A */
- [0x3a53, 0x3a53], /* CJK Ideograph Extension A */
- [0x3a54, 0x3a54], /* CJK Ideograph Extension A */
- [0x3a55, 0x3a55], /* CJK Ideograph Extension A */
- [0x3a56, 0x3a56], /* CJK Ideograph Extension A */
- [0x3a57, 0x3a57], /* CJK Ideograph Extension A */
- [0x3a58, 0x3a58], /* CJK Ideograph Extension A */
- [0x3a59, 0x3a59], /* CJK Ideograph Extension A */
- [0x3a5a, 0x3a5a], /* CJK Ideograph Extension A */
- [0x3a5b, 0x3a5b], /* CJK Ideograph Extension A */
- [0x3a5c, 0x3a5c], /* CJK Ideograph Extension A */
- [0x3a5d, 0x3a5d], /* CJK Ideograph Extension A */
- [0x3a5e, 0x3a5e], /* CJK Ideograph Extension A */
- [0x3a5f, 0x3a5f], /* CJK Ideograph Extension A */
- [0x3a60, 0x3a60], /* CJK Ideograph Extension A */
- [0x3a61, 0x3a61], /* CJK Ideograph Extension A */
- [0x3a62, 0x3a62], /* CJK Ideograph Extension A */
- [0x3a63, 0x3a63], /* CJK Ideograph Extension A */
- [0x3a64, 0x3a64], /* CJK Ideograph Extension A */
- [0x3a65, 0x3a65], /* CJK Ideograph Extension A */
- [0x3a66, 0x3a66], /* CJK Ideograph Extension A */
- [0x3a67, 0x3a67], /* CJK Ideograph Extension A */
- [0x3a68, 0x3a68], /* CJK Ideograph Extension A */
- [0x3a69, 0x3a69], /* CJK Ideograph Extension A */
- [0x3a6a, 0x3a6a], /* CJK Ideograph Extension A */
- [0x3a6b, 0x3a6b], /* CJK Ideograph Extension A */
- [0x3a6c, 0x3a6c], /* CJK Ideograph Extension A */
- [0x3a6d, 0x3a6d], /* CJK Ideograph Extension A */
- [0x3a6e, 0x3a6e], /* CJK Ideograph Extension A */
- [0x3a6f, 0x3a6f], /* CJK Ideograph Extension A */
- [0x3a70, 0x3a70], /* CJK Ideograph Extension A */
- [0x3a71, 0x3a71], /* CJK Ideograph Extension A */
- [0x3a72, 0x3a72], /* CJK Ideograph Extension A */
- [0x3a73, 0x3a73], /* CJK Ideograph Extension A */
- [0x3a74, 0x3a74], /* CJK Ideograph Extension A */
- [0x3a75, 0x3a75], /* CJK Ideograph Extension A */
- [0x3a76, 0x3a76], /* CJK Ideograph Extension A */
- [0x3a77, 0x3a77], /* CJK Ideograph Extension A */
- [0x3a78, 0x3a78], /* CJK Ideograph Extension A */
- [0x3a79, 0x3a79], /* CJK Ideograph Extension A */
- [0x3a7a, 0x3a7a], /* CJK Ideograph Extension A */
- [0x3a7b, 0x3a7b], /* CJK Ideograph Extension A */
- [0x3a7c, 0x3a7c], /* CJK Ideograph Extension A */
- [0x3a7d, 0x3a7d], /* CJK Ideograph Extension A */
- [0x3a7e, 0x3a7e], /* CJK Ideograph Extension A */
- [0x3a7f, 0x3a7f], /* CJK Ideograph Extension A */
- [0x3a80, 0x3a80], /* CJK Ideograph Extension A */
- [0x3a81, 0x3a81], /* CJK Ideograph Extension A */
- [0x3a82, 0x3a82], /* CJK Ideograph Extension A */
- [0x3a83, 0x3a83], /* CJK Ideograph Extension A */
- [0x3a84, 0x3a84], /* CJK Ideograph Extension A */
- [0x3a85, 0x3a85], /* CJK Ideograph Extension A */
- [0x3a86, 0x3a86], /* CJK Ideograph Extension A */
- [0x3a87, 0x3a87], /* CJK Ideograph Extension A */
- [0x3a88, 0x3a88], /* CJK Ideograph Extension A */
- [0x3a89, 0x3a89], /* CJK Ideograph Extension A */
- [0x3a8a, 0x3a8a], /* CJK Ideograph Extension A */
- [0x3a8b, 0x3a8b], /* CJK Ideograph Extension A */
- [0x3a8c, 0x3a8c], /* CJK Ideograph Extension A */
- [0x3a8d, 0x3a8d], /* CJK Ideograph Extension A */
- [0x3a8e, 0x3a8e], /* CJK Ideograph Extension A */
- [0x3a8f, 0x3a8f], /* CJK Ideograph Extension A */
- [0x3a90, 0x3a90], /* CJK Ideograph Extension A */
- [0x3a91, 0x3a91], /* CJK Ideograph Extension A */
- [0x3a92, 0x3a92], /* CJK Ideograph Extension A */
- [0x3a93, 0x3a93], /* CJK Ideograph Extension A */
- [0x3a94, 0x3a94], /* CJK Ideograph Extension A */
- [0x3a95, 0x3a95], /* CJK Ideograph Extension A */
- [0x3a96, 0x3a96], /* CJK Ideograph Extension A */
- [0x3a97, 0x3a97], /* CJK Ideograph Extension A */
- [0x3a98, 0x3a98], /* CJK Ideograph Extension A */
- [0x3a99, 0x3a99], /* CJK Ideograph Extension A */
- [0x3a9a, 0x3a9a], /* CJK Ideograph Extension A */
- [0x3a9b, 0x3a9b], /* CJK Ideograph Extension A */
- [0x3a9c, 0x3a9c], /* CJK Ideograph Extension A */
- [0x3a9d, 0x3a9d], /* CJK Ideograph Extension A */
- [0x3a9e, 0x3a9e], /* CJK Ideograph Extension A */
- [0x3a9f, 0x3a9f], /* CJK Ideograph Extension A */
- [0x3aa0, 0x3aa0], /* CJK Ideograph Extension A */
- [0x3aa1, 0x3aa1], /* CJK Ideograph Extension A */
- [0x3aa2, 0x3aa2], /* CJK Ideograph Extension A */
- [0x3aa3, 0x3aa3], /* CJK Ideograph Extension A */
- [0x3aa4, 0x3aa4], /* CJK Ideograph Extension A */
- [0x3aa5, 0x3aa5], /* CJK Ideograph Extension A */
- [0x3aa6, 0x3aa6], /* CJK Ideograph Extension A */
- [0x3aa7, 0x3aa7], /* CJK Ideograph Extension A */
- [0x3aa8, 0x3aa8], /* CJK Ideograph Extension A */
- [0x3aa9, 0x3aa9], /* CJK Ideograph Extension A */
- [0x3aaa, 0x3aaa], /* CJK Ideograph Extension A */
- [0x3aab, 0x3aab], /* CJK Ideograph Extension A */
- [0x3aac, 0x3aac], /* CJK Ideograph Extension A */
- [0x3aad, 0x3aad], /* CJK Ideograph Extension A */
- [0x3aae, 0x3aae], /* CJK Ideograph Extension A */
- [0x3aaf, 0x3aaf], /* CJK Ideograph Extension A */
- [0x3ab0, 0x3ab0], /* CJK Ideograph Extension A */
- [0x3ab1, 0x3ab1], /* CJK Ideograph Extension A */
- [0x3ab2, 0x3ab2], /* CJK Ideograph Extension A */
- [0x3ab3, 0x3ab3], /* CJK Ideograph Extension A */
- [0x3ab4, 0x3ab4], /* CJK Ideograph Extension A */
- [0x3ab5, 0x3ab5], /* CJK Ideograph Extension A */
- [0x3ab6, 0x3ab6], /* CJK Ideograph Extension A */
- [0x3ab7, 0x3ab7], /* CJK Ideograph Extension A */
- [0x3ab8, 0x3ab8], /* CJK Ideograph Extension A */
- [0x3ab9, 0x3ab9], /* CJK Ideograph Extension A */
- [0x3aba, 0x3aba], /* CJK Ideograph Extension A */
- [0x3abb, 0x3abb], /* CJK Ideograph Extension A */
- [0x3abc, 0x3abc], /* CJK Ideograph Extension A */
- [0x3abd, 0x3abd], /* CJK Ideograph Extension A */
- [0x3abe, 0x3abe], /* CJK Ideograph Extension A */
- [0x3abf, 0x3abf], /* CJK Ideograph Extension A */
- [0x3ac0, 0x3ac0], /* CJK Ideograph Extension A */
- [0x3ac1, 0x3ac1], /* CJK Ideograph Extension A */
- [0x3ac2, 0x3ac2], /* CJK Ideograph Extension A */
- [0x3ac3, 0x3ac3], /* CJK Ideograph Extension A */
- [0x3ac4, 0x3ac4], /* CJK Ideograph Extension A */
- [0x3ac5, 0x3ac5], /* CJK Ideograph Extension A */
- [0x3ac6, 0x3ac6], /* CJK Ideograph Extension A */
- [0x3ac7, 0x3ac7], /* CJK Ideograph Extension A */
- [0x3ac8, 0x3ac8], /* CJK Ideograph Extension A */
- [0x3ac9, 0x3ac9], /* CJK Ideograph Extension A */
- [0x3aca, 0x3aca], /* CJK Ideograph Extension A */
- [0x3acb, 0x3acb], /* CJK Ideograph Extension A */
- [0x3acc, 0x3acc], /* CJK Ideograph Extension A */
- [0x3acd, 0x3acd], /* CJK Ideograph Extension A */
- [0x3ace, 0x3ace], /* CJK Ideograph Extension A */
- [0x3acf, 0x3acf], /* CJK Ideograph Extension A */
- [0x3ad0, 0x3ad0], /* CJK Ideograph Extension A */
- [0x3ad1, 0x3ad1], /* CJK Ideograph Extension A */
- [0x3ad2, 0x3ad2], /* CJK Ideograph Extension A */
- [0x3ad3, 0x3ad3], /* CJK Ideograph Extension A */
- [0x3ad4, 0x3ad4], /* CJK Ideograph Extension A */
- [0x3ad5, 0x3ad5], /* CJK Ideograph Extension A */
- [0x3ad6, 0x3ad6], /* CJK Ideograph Extension A */
- [0x3ad7, 0x3ad7], /* CJK Ideograph Extension A */
- [0x3ad8, 0x3ad8], /* CJK Ideograph Extension A */
- [0x3ad9, 0x3ad9], /* CJK Ideograph Extension A */
- [0x3ada, 0x3ada], /* CJK Ideograph Extension A */
- [0x3adb, 0x3adb], /* CJK Ideograph Extension A */
- [0x3adc, 0x3adc], /* CJK Ideograph Extension A */
- [0x3add, 0x3add], /* CJK Ideograph Extension A */
- [0x3ade, 0x3ade], /* CJK Ideograph Extension A */
- [0x3adf, 0x3adf], /* CJK Ideograph Extension A */
- [0x3ae0, 0x3ae0], /* CJK Ideograph Extension A */
- [0x3ae1, 0x3ae1], /* CJK Ideograph Extension A */
- [0x3ae2, 0x3ae2], /* CJK Ideograph Extension A */
- [0x3ae3, 0x3ae3], /* CJK Ideograph Extension A */
- [0x3ae4, 0x3ae4], /* CJK Ideograph Extension A */
- [0x3ae5, 0x3ae5], /* CJK Ideograph Extension A */
- [0x3ae6, 0x3ae6], /* CJK Ideograph Extension A */
- [0x3ae7, 0x3ae7], /* CJK Ideograph Extension A */
- [0x3ae8, 0x3ae8], /* CJK Ideograph Extension A */
- [0x3ae9, 0x3ae9], /* CJK Ideograph Extension A */
- [0x3aea, 0x3aea], /* CJK Ideograph Extension A */
- [0x3aeb, 0x3aeb], /* CJK Ideograph Extension A */
- [0x3aec, 0x3aec], /* CJK Ideograph Extension A */
- [0x3aed, 0x3aed], /* CJK Ideograph Extension A */
- [0x3aee, 0x3aee], /* CJK Ideograph Extension A */
- [0x3aef, 0x3aef], /* CJK Ideograph Extension A */
- [0x3af0, 0x3af0], /* CJK Ideograph Extension A */
- [0x3af1, 0x3af1], /* CJK Ideograph Extension A */
- [0x3af2, 0x3af2], /* CJK Ideograph Extension A */
- [0x3af3, 0x3af3], /* CJK Ideograph Extension A */
- [0x3af4, 0x3af4], /* CJK Ideograph Extension A */
- [0x3af5, 0x3af5], /* CJK Ideograph Extension A */
- [0x3af6, 0x3af6], /* CJK Ideograph Extension A */
- [0x3af7, 0x3af7], /* CJK Ideograph Extension A */
- [0x3af8, 0x3af8], /* CJK Ideograph Extension A */
- [0x3af9, 0x3af9], /* CJK Ideograph Extension A */
- [0x3afa, 0x3afa], /* CJK Ideograph Extension A */
- [0x3afb, 0x3afb], /* CJK Ideograph Extension A */
- [0x3afc, 0x3afc], /* CJK Ideograph Extension A */
- [0x3afd, 0x3afd], /* CJK Ideograph Extension A */
- [0x3afe, 0x3afe], /* CJK Ideograph Extension A */
- [0x3aff, 0x3aff], /* CJK Ideograph Extension A */
- [0x3b00, 0x3b00], /* CJK Ideograph Extension A */
- [0x3b01, 0x3b01], /* CJK Ideograph Extension A */
- [0x3b02, 0x3b02], /* CJK Ideograph Extension A */
- [0x3b03, 0x3b03], /* CJK Ideograph Extension A */
- [0x3b04, 0x3b04], /* CJK Ideograph Extension A */
- [0x3b05, 0x3b05], /* CJK Ideograph Extension A */
- [0x3b06, 0x3b06], /* CJK Ideograph Extension A */
- [0x3b07, 0x3b07], /* CJK Ideograph Extension A */
- [0x3b08, 0x3b08], /* CJK Ideograph Extension A */
- [0x3b09, 0x3b09], /* CJK Ideograph Extension A */
- [0x3b0a, 0x3b0a], /* CJK Ideograph Extension A */
- [0x3b0b, 0x3b0b], /* CJK Ideograph Extension A */
- [0x3b0c, 0x3b0c], /* CJK Ideograph Extension A */
- [0x3b0d, 0x3b0d], /* CJK Ideograph Extension A */
- [0x3b0e, 0x3b0e], /* CJK Ideograph Extension A */
- [0x3b0f, 0x3b0f], /* CJK Ideograph Extension A */
- [0x3b10, 0x3b10], /* CJK Ideograph Extension A */
- [0x3b11, 0x3b11], /* CJK Ideograph Extension A */
- [0x3b12, 0x3b12], /* CJK Ideograph Extension A */
- [0x3b13, 0x3b13], /* CJK Ideograph Extension A */
- [0x3b14, 0x3b14], /* CJK Ideograph Extension A */
- [0x3b15, 0x3b15], /* CJK Ideograph Extension A */
- [0x3b16, 0x3b16], /* CJK Ideograph Extension A */
- [0x3b17, 0x3b17], /* CJK Ideograph Extension A */
- [0x3b18, 0x3b18], /* CJK Ideograph Extension A */
- [0x3b19, 0x3b19], /* CJK Ideograph Extension A */
- [0x3b1a, 0x3b1a], /* CJK Ideograph Extension A */
- [0x3b1b, 0x3b1b], /* CJK Ideograph Extension A */
- [0x3b1c, 0x3b1c], /* CJK Ideograph Extension A */
- [0x3b1d, 0x3b1d], /* CJK Ideograph Extension A */
- [0x3b1e, 0x3b1e], /* CJK Ideograph Extension A */
- [0x3b1f, 0x3b1f], /* CJK Ideograph Extension A */
- [0x3b20, 0x3b20], /* CJK Ideograph Extension A */
- [0x3b21, 0x3b21], /* CJK Ideograph Extension A */
- [0x3b22, 0x3b22], /* CJK Ideograph Extension A */
- [0x3b23, 0x3b23], /* CJK Ideograph Extension A */
- [0x3b24, 0x3b24], /* CJK Ideograph Extension A */
- [0x3b25, 0x3b25], /* CJK Ideograph Extension A */
- [0x3b26, 0x3b26], /* CJK Ideograph Extension A */
- [0x3b27, 0x3b27], /* CJK Ideograph Extension A */
- [0x3b28, 0x3b28], /* CJK Ideograph Extension A */
- [0x3b29, 0x3b29], /* CJK Ideograph Extension A */
- [0x3b2a, 0x3b2a], /* CJK Ideograph Extension A */
- [0x3b2b, 0x3b2b], /* CJK Ideograph Extension A */
- [0x3b2c, 0x3b2c], /* CJK Ideograph Extension A */
- [0x3b2d, 0x3b2d], /* CJK Ideograph Extension A */
- [0x3b2e, 0x3b2e], /* CJK Ideograph Extension A */
- [0x3b2f, 0x3b2f], /* CJK Ideograph Extension A */
- [0x3b30, 0x3b30], /* CJK Ideograph Extension A */
- [0x3b31, 0x3b31], /* CJK Ideograph Extension A */
- [0x3b32, 0x3b32], /* CJK Ideograph Extension A */
- [0x3b33, 0x3b33], /* CJK Ideograph Extension A */
- [0x3b34, 0x3b34], /* CJK Ideograph Extension A */
- [0x3b35, 0x3b35], /* CJK Ideograph Extension A */
- [0x3b36, 0x3b36], /* CJK Ideograph Extension A */
- [0x3b37, 0x3b37], /* CJK Ideograph Extension A */
- [0x3b38, 0x3b38], /* CJK Ideograph Extension A */
- [0x3b39, 0x3b39], /* CJK Ideograph Extension A */
- [0x3b3a, 0x3b3a], /* CJK Ideograph Extension A */
- [0x3b3b, 0x3b3b], /* CJK Ideograph Extension A */
- [0x3b3c, 0x3b3c], /* CJK Ideograph Extension A */
- [0x3b3d, 0x3b3d], /* CJK Ideograph Extension A */
- [0x3b3e, 0x3b3e], /* CJK Ideograph Extension A */
- [0x3b3f, 0x3b3f], /* CJK Ideograph Extension A */
- [0x3b40, 0x3b40], /* CJK Ideograph Extension A */
- [0x3b41, 0x3b41], /* CJK Ideograph Extension A */
- [0x3b42, 0x3b42], /* CJK Ideograph Extension A */
- [0x3b43, 0x3b43], /* CJK Ideograph Extension A */
- [0x3b44, 0x3b44], /* CJK Ideograph Extension A */
- [0x3b45, 0x3b45], /* CJK Ideograph Extension A */
- [0x3b46, 0x3b46], /* CJK Ideograph Extension A */
- [0x3b47, 0x3b47], /* CJK Ideograph Extension A */
- [0x3b48, 0x3b48], /* CJK Ideograph Extension A */
- [0x3b49, 0x3b49], /* CJK Ideograph Extension A */
- [0x3b4a, 0x3b4a], /* CJK Ideograph Extension A */
- [0x3b4b, 0x3b4b], /* CJK Ideograph Extension A */
- [0x3b4c, 0x3b4c], /* CJK Ideograph Extension A */
- [0x3b4d, 0x3b4d], /* CJK Ideograph Extension A */
- [0x3b4e, 0x3b4e], /* CJK Ideograph Extension A */
- [0x3b4f, 0x3b4f], /* CJK Ideograph Extension A */
- [0x3b50, 0x3b50], /* CJK Ideograph Extension A */
- [0x3b51, 0x3b51], /* CJK Ideograph Extension A */
- [0x3b52, 0x3b52], /* CJK Ideograph Extension A */
- [0x3b53, 0x3b53], /* CJK Ideograph Extension A */
- [0x3b54, 0x3b54], /* CJK Ideograph Extension A */
- [0x3b55, 0x3b55], /* CJK Ideograph Extension A */
- [0x3b56, 0x3b56], /* CJK Ideograph Extension A */
- [0x3b57, 0x3b57], /* CJK Ideograph Extension A */
- [0x3b58, 0x3b58], /* CJK Ideograph Extension A */
- [0x3b59, 0x3b59], /* CJK Ideograph Extension A */
- [0x3b5a, 0x3b5a], /* CJK Ideograph Extension A */
- [0x3b5b, 0x3b5b], /* CJK Ideograph Extension A */
- [0x3b5c, 0x3b5c], /* CJK Ideograph Extension A */
- [0x3b5d, 0x3b5d], /* CJK Ideograph Extension A */
- [0x3b5e, 0x3b5e], /* CJK Ideograph Extension A */
- [0x3b5f, 0x3b5f], /* CJK Ideograph Extension A */
- [0x3b60, 0x3b60], /* CJK Ideograph Extension A */
- [0x3b61, 0x3b61], /* CJK Ideograph Extension A */
- [0x3b62, 0x3b62], /* CJK Ideograph Extension A */
- [0x3b63, 0x3b63], /* CJK Ideograph Extension A */
- [0x3b64, 0x3b64], /* CJK Ideograph Extension A */
- [0x3b65, 0x3b65], /* CJK Ideograph Extension A */
- [0x3b66, 0x3b66], /* CJK Ideograph Extension A */
- [0x3b67, 0x3b67], /* CJK Ideograph Extension A */
- [0x3b68, 0x3b68], /* CJK Ideograph Extension A */
- [0x3b69, 0x3b69], /* CJK Ideograph Extension A */
- [0x3b6a, 0x3b6a], /* CJK Ideograph Extension A */
- [0x3b6b, 0x3b6b], /* CJK Ideograph Extension A */
- [0x3b6c, 0x3b6c], /* CJK Ideograph Extension A */
- [0x3b6d, 0x3b6d], /* CJK Ideograph Extension A */
- [0x3b6e, 0x3b6e], /* CJK Ideograph Extension A */
- [0x3b6f, 0x3b6f], /* CJK Ideograph Extension A */
- [0x3b70, 0x3b70], /* CJK Ideograph Extension A */
- [0x3b71, 0x3b71], /* CJK Ideograph Extension A */
- [0x3b72, 0x3b72], /* CJK Ideograph Extension A */
- [0x3b73, 0x3b73], /* CJK Ideograph Extension A */
- [0x3b74, 0x3b74], /* CJK Ideograph Extension A */
- [0x3b75, 0x3b75], /* CJK Ideograph Extension A */
- [0x3b76, 0x3b76], /* CJK Ideograph Extension A */
- [0x3b77, 0x3b77], /* CJK Ideograph Extension A */
- [0x3b78, 0x3b78], /* CJK Ideograph Extension A */
- [0x3b79, 0x3b79], /* CJK Ideograph Extension A */
- [0x3b7a, 0x3b7a], /* CJK Ideograph Extension A */
- [0x3b7b, 0x3b7b], /* CJK Ideograph Extension A */
- [0x3b7c, 0x3b7c], /* CJK Ideograph Extension A */
- [0x3b7d, 0x3b7d], /* CJK Ideograph Extension A */
- [0x3b7e, 0x3b7e], /* CJK Ideograph Extension A */
- [0x3b7f, 0x3b7f], /* CJK Ideograph Extension A */
- [0x3b80, 0x3b80], /* CJK Ideograph Extension A */
- [0x3b81, 0x3b81], /* CJK Ideograph Extension A */
- [0x3b82, 0x3b82], /* CJK Ideograph Extension A */
- [0x3b83, 0x3b83], /* CJK Ideograph Extension A */
- [0x3b84, 0x3b84], /* CJK Ideograph Extension A */
- [0x3b85, 0x3b85], /* CJK Ideograph Extension A */
- [0x3b86, 0x3b86], /* CJK Ideograph Extension A */
- [0x3b87, 0x3b87], /* CJK Ideograph Extension A */
- [0x3b88, 0x3b88], /* CJK Ideograph Extension A */
- [0x3b89, 0x3b89], /* CJK Ideograph Extension A */
- [0x3b8a, 0x3b8a], /* CJK Ideograph Extension A */
- [0x3b8b, 0x3b8b], /* CJK Ideograph Extension A */
- [0x3b8c, 0x3b8c], /* CJK Ideograph Extension A */
- [0x3b8d, 0x3b8d], /* CJK Ideograph Extension A */
- [0x3b8e, 0x3b8e], /* CJK Ideograph Extension A */
- [0x3b8f, 0x3b8f], /* CJK Ideograph Extension A */
- [0x3b90, 0x3b90], /* CJK Ideograph Extension A */
- [0x3b91, 0x3b91], /* CJK Ideograph Extension A */
- [0x3b92, 0x3b92], /* CJK Ideograph Extension A */
- [0x3b93, 0x3b93], /* CJK Ideograph Extension A */
- [0x3b94, 0x3b94], /* CJK Ideograph Extension A */
- [0x3b95, 0x3b95], /* CJK Ideograph Extension A */
- [0x3b96, 0x3b96], /* CJK Ideograph Extension A */
- [0x3b97, 0x3b97], /* CJK Ideograph Extension A */
- [0x3b98, 0x3b98], /* CJK Ideograph Extension A */
- [0x3b99, 0x3b99], /* CJK Ideograph Extension A */
- [0x3b9a, 0x3b9a], /* CJK Ideograph Extension A */
- [0x3b9b, 0x3b9b], /* CJK Ideograph Extension A */
- [0x3b9c, 0x3b9c], /* CJK Ideograph Extension A */
- [0x3b9d, 0x3b9d], /* CJK Ideograph Extension A */
- [0x3b9e, 0x3b9e], /* CJK Ideograph Extension A */
- [0x3b9f, 0x3b9f], /* CJK Ideograph Extension A */
- [0x3ba0, 0x3ba0], /* CJK Ideograph Extension A */
- [0x3ba1, 0x3ba1], /* CJK Ideograph Extension A */
- [0x3ba2, 0x3ba2], /* CJK Ideograph Extension A */
- [0x3ba3, 0x3ba3], /* CJK Ideograph Extension A */
- [0x3ba4, 0x3ba4], /* CJK Ideograph Extension A */
- [0x3ba5, 0x3ba5], /* CJK Ideograph Extension A */
- [0x3ba6, 0x3ba6], /* CJK Ideograph Extension A */
- [0x3ba7, 0x3ba7], /* CJK Ideograph Extension A */
- [0x3ba8, 0x3ba8], /* CJK Ideograph Extension A */
- [0x3ba9, 0x3ba9], /* CJK Ideograph Extension A */
- [0x3baa, 0x3baa], /* CJK Ideograph Extension A */
- [0x3bab, 0x3bab], /* CJK Ideograph Extension A */
- [0x3bac, 0x3bac], /* CJK Ideograph Extension A */
- [0x3bad, 0x3bad], /* CJK Ideograph Extension A */
- [0x3bae, 0x3bae], /* CJK Ideograph Extension A */
- [0x3baf, 0x3baf], /* CJK Ideograph Extension A */
- [0x3bb0, 0x3bb0], /* CJK Ideograph Extension A */
- [0x3bb1, 0x3bb1], /* CJK Ideograph Extension A */
- [0x3bb2, 0x3bb2], /* CJK Ideograph Extension A */
- [0x3bb3, 0x3bb3], /* CJK Ideograph Extension A */
- [0x3bb4, 0x3bb4], /* CJK Ideograph Extension A */
- [0x3bb5, 0x3bb5], /* CJK Ideograph Extension A */
- [0x3bb6, 0x3bb6], /* CJK Ideograph Extension A */
- [0x3bb7, 0x3bb7], /* CJK Ideograph Extension A */
- [0x3bb8, 0x3bb8], /* CJK Ideograph Extension A */
- [0x3bb9, 0x3bb9], /* CJK Ideograph Extension A */
- [0x3bba, 0x3bba], /* CJK Ideograph Extension A */
- [0x3bbb, 0x3bbb], /* CJK Ideograph Extension A */
- [0x3bbc, 0x3bbc], /* CJK Ideograph Extension A */
- [0x3bbd, 0x3bbd], /* CJK Ideograph Extension A */
- [0x3bbe, 0x3bbe], /* CJK Ideograph Extension A */
- [0x3bbf, 0x3bbf], /* CJK Ideograph Extension A */
- [0x3bc0, 0x3bc0], /* CJK Ideograph Extension A */
- [0x3bc1, 0x3bc1], /* CJK Ideograph Extension A */
- [0x3bc2, 0x3bc2], /* CJK Ideograph Extension A */
- [0x3bc3, 0x3bc3], /* CJK Ideograph Extension A */
- [0x3bc4, 0x3bc4], /* CJK Ideograph Extension A */
- [0x3bc5, 0x3bc5], /* CJK Ideograph Extension A */
- [0x3bc6, 0x3bc6], /* CJK Ideograph Extension A */
- [0x3bc7, 0x3bc7], /* CJK Ideograph Extension A */
- [0x3bc8, 0x3bc8], /* CJK Ideograph Extension A */
- [0x3bc9, 0x3bc9], /* CJK Ideograph Extension A */
- [0x3bca, 0x3bca], /* CJK Ideograph Extension A */
- [0x3bcb, 0x3bcb], /* CJK Ideograph Extension A */
- [0x3bcc, 0x3bcc], /* CJK Ideograph Extension A */
- [0x3bcd, 0x3bcd], /* CJK Ideograph Extension A */
- [0x3bce, 0x3bce], /* CJK Ideograph Extension A */
- [0x3bcf, 0x3bcf], /* CJK Ideograph Extension A */
- [0x3bd0, 0x3bd0], /* CJK Ideograph Extension A */
- [0x3bd1, 0x3bd1], /* CJK Ideograph Extension A */
- [0x3bd2, 0x3bd2], /* CJK Ideograph Extension A */
- [0x3bd3, 0x3bd3], /* CJK Ideograph Extension A */
- [0x3bd4, 0x3bd4], /* CJK Ideograph Extension A */
- [0x3bd5, 0x3bd5], /* CJK Ideograph Extension A */
- [0x3bd6, 0x3bd6], /* CJK Ideograph Extension A */
- [0x3bd7, 0x3bd7], /* CJK Ideograph Extension A */
- [0x3bd8, 0x3bd8], /* CJK Ideograph Extension A */
- [0x3bd9, 0x3bd9], /* CJK Ideograph Extension A */
- [0x3bda, 0x3bda], /* CJK Ideograph Extension A */
- [0x3bdb, 0x3bdb], /* CJK Ideograph Extension A */
- [0x3bdc, 0x3bdc], /* CJK Ideograph Extension A */
- [0x3bdd, 0x3bdd], /* CJK Ideograph Extension A */
- [0x3bde, 0x3bde], /* CJK Ideograph Extension A */
- [0x3bdf, 0x3bdf], /* CJK Ideograph Extension A */
- [0x3be0, 0x3be0], /* CJK Ideograph Extension A */
- [0x3be1, 0x3be1], /* CJK Ideograph Extension A */
- [0x3be2, 0x3be2], /* CJK Ideograph Extension A */
- [0x3be3, 0x3be3], /* CJK Ideograph Extension A */
- [0x3be4, 0x3be4], /* CJK Ideograph Extension A */
- [0x3be5, 0x3be5], /* CJK Ideograph Extension A */
- [0x3be6, 0x3be6], /* CJK Ideograph Extension A */
- [0x3be7, 0x3be7], /* CJK Ideograph Extension A */
- [0x3be8, 0x3be8], /* CJK Ideograph Extension A */
- [0x3be9, 0x3be9], /* CJK Ideograph Extension A */
- [0x3bea, 0x3bea], /* CJK Ideograph Extension A */
- [0x3beb, 0x3beb], /* CJK Ideograph Extension A */
- [0x3bec, 0x3bec], /* CJK Ideograph Extension A */
- [0x3bed, 0x3bed], /* CJK Ideograph Extension A */
- [0x3bee, 0x3bee], /* CJK Ideograph Extension A */
- [0x3bef, 0x3bef], /* CJK Ideograph Extension A */
- [0x3bf0, 0x3bf0], /* CJK Ideograph Extension A */
- [0x3bf1, 0x3bf1], /* CJK Ideograph Extension A */
- [0x3bf2, 0x3bf2], /* CJK Ideograph Extension A */
- [0x3bf3, 0x3bf3], /* CJK Ideograph Extension A */
- [0x3bf4, 0x3bf4], /* CJK Ideograph Extension A */
- [0x3bf5, 0x3bf5], /* CJK Ideograph Extension A */
- [0x3bf6, 0x3bf6], /* CJK Ideograph Extension A */
- [0x3bf7, 0x3bf7], /* CJK Ideograph Extension A */
- [0x3bf8, 0x3bf8], /* CJK Ideograph Extension A */
- [0x3bf9, 0x3bf9], /* CJK Ideograph Extension A */
- [0x3bfa, 0x3bfa], /* CJK Ideograph Extension A */
- [0x3bfb, 0x3bfb], /* CJK Ideograph Extension A */
- [0x3bfc, 0x3bfc], /* CJK Ideograph Extension A */
- [0x3bfd, 0x3bfd], /* CJK Ideograph Extension A */
- [0x3bfe, 0x3bfe], /* CJK Ideograph Extension A */
- [0x3bff, 0x3bff], /* CJK Ideograph Extension A */
- [0x3c00, 0x3c00], /* CJK Ideograph Extension A */
- [0x3c01, 0x3c01], /* CJK Ideograph Extension A */
- [0x3c02, 0x3c02], /* CJK Ideograph Extension A */
- [0x3c03, 0x3c03], /* CJK Ideograph Extension A */
- [0x3c04, 0x3c04], /* CJK Ideograph Extension A */
- [0x3c05, 0x3c05], /* CJK Ideograph Extension A */
- [0x3c06, 0x3c06], /* CJK Ideograph Extension A */
- [0x3c07, 0x3c07], /* CJK Ideograph Extension A */
- [0x3c08, 0x3c08], /* CJK Ideograph Extension A */
- [0x3c09, 0x3c09], /* CJK Ideograph Extension A */
- [0x3c0a, 0x3c0a], /* CJK Ideograph Extension A */
- [0x3c0b, 0x3c0b], /* CJK Ideograph Extension A */
- [0x3c0c, 0x3c0c], /* CJK Ideograph Extension A */
- [0x3c0d, 0x3c0d], /* CJK Ideograph Extension A */
- [0x3c0e, 0x3c0e], /* CJK Ideograph Extension A */
- [0x3c0f, 0x3c0f], /* CJK Ideograph Extension A */
- [0x3c10, 0x3c10], /* CJK Ideograph Extension A */
- [0x3c11, 0x3c11], /* CJK Ideograph Extension A */
- [0x3c12, 0x3c12], /* CJK Ideograph Extension A */
- [0x3c13, 0x3c13], /* CJK Ideograph Extension A */
- [0x3c14, 0x3c14], /* CJK Ideograph Extension A */
- [0x3c15, 0x3c15], /* CJK Ideograph Extension A */
- [0x3c16, 0x3c16], /* CJK Ideograph Extension A */
- [0x3c17, 0x3c17], /* CJK Ideograph Extension A */
- [0x3c18, 0x3c18], /* CJK Ideograph Extension A */
- [0x3c19, 0x3c19], /* CJK Ideograph Extension A */
- [0x3c1a, 0x3c1a], /* CJK Ideograph Extension A */
- [0x3c1b, 0x3c1b], /* CJK Ideograph Extension A */
- [0x3c1c, 0x3c1c], /* CJK Ideograph Extension A */
- [0x3c1d, 0x3c1d], /* CJK Ideograph Extension A */
- [0x3c1e, 0x3c1e], /* CJK Ideograph Extension A */
- [0x3c1f, 0x3c1f], /* CJK Ideograph Extension A */
- [0x3c20, 0x3c20], /* CJK Ideograph Extension A */
- [0x3c21, 0x3c21], /* CJK Ideograph Extension A */
- [0x3c22, 0x3c22], /* CJK Ideograph Extension A */
- [0x3c23, 0x3c23], /* CJK Ideograph Extension A */
- [0x3c24, 0x3c24], /* CJK Ideograph Extension A */
- [0x3c25, 0x3c25], /* CJK Ideograph Extension A */
- [0x3c26, 0x3c26], /* CJK Ideograph Extension A */
- [0x3c27, 0x3c27], /* CJK Ideograph Extension A */
- [0x3c28, 0x3c28], /* CJK Ideograph Extension A */
- [0x3c29, 0x3c29], /* CJK Ideograph Extension A */
- [0x3c2a, 0x3c2a], /* CJK Ideograph Extension A */
- [0x3c2b, 0x3c2b], /* CJK Ideograph Extension A */
- [0x3c2c, 0x3c2c], /* CJK Ideograph Extension A */
- [0x3c2d, 0x3c2d], /* CJK Ideograph Extension A */
- [0x3c2e, 0x3c2e], /* CJK Ideograph Extension A */
- [0x3c2f, 0x3c2f], /* CJK Ideograph Extension A */
- [0x3c30, 0x3c30], /* CJK Ideograph Extension A */
- [0x3c31, 0x3c31], /* CJK Ideograph Extension A */
- [0x3c32, 0x3c32], /* CJK Ideograph Extension A */
- [0x3c33, 0x3c33], /* CJK Ideograph Extension A */
- [0x3c34, 0x3c34], /* CJK Ideograph Extension A */
- [0x3c35, 0x3c35], /* CJK Ideograph Extension A */
- [0x3c36, 0x3c36], /* CJK Ideograph Extension A */
- [0x3c37, 0x3c37], /* CJK Ideograph Extension A */
- [0x3c38, 0x3c38], /* CJK Ideograph Extension A */
- [0x3c39, 0x3c39], /* CJK Ideograph Extension A */
- [0x3c3a, 0x3c3a], /* CJK Ideograph Extension A */
- [0x3c3b, 0x3c3b], /* CJK Ideograph Extension A */
- [0x3c3c, 0x3c3c], /* CJK Ideograph Extension A */
- [0x3c3d, 0x3c3d], /* CJK Ideograph Extension A */
- [0x3c3e, 0x3c3e], /* CJK Ideograph Extension A */
- [0x3c3f, 0x3c3f], /* CJK Ideograph Extension A */
- [0x3c40, 0x3c40], /* CJK Ideograph Extension A */
- [0x3c41, 0x3c41], /* CJK Ideograph Extension A */
- [0x3c42, 0x3c42], /* CJK Ideograph Extension A */
- [0x3c43, 0x3c43], /* CJK Ideograph Extension A */
- [0x3c44, 0x3c44], /* CJK Ideograph Extension A */
- [0x3c45, 0x3c45], /* CJK Ideograph Extension A */
- [0x3c46, 0x3c46], /* CJK Ideograph Extension A */
- [0x3c47, 0x3c47], /* CJK Ideograph Extension A */
- [0x3c48, 0x3c48], /* CJK Ideograph Extension A */
- [0x3c49, 0x3c49], /* CJK Ideograph Extension A */
- [0x3c4a, 0x3c4a], /* CJK Ideograph Extension A */
- [0x3c4b, 0x3c4b], /* CJK Ideograph Extension A */
- [0x3c4c, 0x3c4c], /* CJK Ideograph Extension A */
- [0x3c4d, 0x3c4d], /* CJK Ideograph Extension A */
- [0x3c4e, 0x3c4e], /* CJK Ideograph Extension A */
- [0x3c4f, 0x3c4f], /* CJK Ideograph Extension A */
- [0x3c50, 0x3c50], /* CJK Ideograph Extension A */
- [0x3c51, 0x3c51], /* CJK Ideograph Extension A */
- [0x3c52, 0x3c52], /* CJK Ideograph Extension A */
- [0x3c53, 0x3c53], /* CJK Ideograph Extension A */
- [0x3c54, 0x3c54], /* CJK Ideograph Extension A */
- [0x3c55, 0x3c55], /* CJK Ideograph Extension A */
- [0x3c56, 0x3c56], /* CJK Ideograph Extension A */
- [0x3c57, 0x3c57], /* CJK Ideograph Extension A */
- [0x3c58, 0x3c58], /* CJK Ideograph Extension A */
- [0x3c59, 0x3c59], /* CJK Ideograph Extension A */
- [0x3c5a, 0x3c5a], /* CJK Ideograph Extension A */
- [0x3c5b, 0x3c5b], /* CJK Ideograph Extension A */
- [0x3c5c, 0x3c5c], /* CJK Ideograph Extension A */
- [0x3c5d, 0x3c5d], /* CJK Ideograph Extension A */
- [0x3c5e, 0x3c5e], /* CJK Ideograph Extension A */
- [0x3c5f, 0x3c5f], /* CJK Ideograph Extension A */
- [0x3c60, 0x3c60], /* CJK Ideograph Extension A */
- [0x3c61, 0x3c61], /* CJK Ideograph Extension A */
- [0x3c62, 0x3c62], /* CJK Ideograph Extension A */
- [0x3c63, 0x3c63], /* CJK Ideograph Extension A */
- [0x3c64, 0x3c64], /* CJK Ideograph Extension A */
- [0x3c65, 0x3c65], /* CJK Ideograph Extension A */
- [0x3c66, 0x3c66], /* CJK Ideograph Extension A */
- [0x3c67, 0x3c67], /* CJK Ideograph Extension A */
- [0x3c68, 0x3c68], /* CJK Ideograph Extension A */
- [0x3c69, 0x3c69], /* CJK Ideograph Extension A */
- [0x3c6a, 0x3c6a], /* CJK Ideograph Extension A */
- [0x3c6b, 0x3c6b], /* CJK Ideograph Extension A */
- [0x3c6c, 0x3c6c], /* CJK Ideograph Extension A */
- [0x3c6d, 0x3c6d], /* CJK Ideograph Extension A */
- [0x3c6e, 0x3c6e], /* CJK Ideograph Extension A */
- [0x3c6f, 0x3c6f], /* CJK Ideograph Extension A */
- [0x3c70, 0x3c70], /* CJK Ideograph Extension A */
- [0x3c71, 0x3c71], /* CJK Ideograph Extension A */
- [0x3c72, 0x3c72], /* CJK Ideograph Extension A */
- [0x3c73, 0x3c73], /* CJK Ideograph Extension A */
- [0x3c74, 0x3c74], /* CJK Ideograph Extension A */
- [0x3c75, 0x3c75], /* CJK Ideograph Extension A */
- [0x3c76, 0x3c76], /* CJK Ideograph Extension A */
- [0x3c77, 0x3c77], /* CJK Ideograph Extension A */
- [0x3c78, 0x3c78], /* CJK Ideograph Extension A */
- [0x3c79, 0x3c79], /* CJK Ideograph Extension A */
- [0x3c7a, 0x3c7a], /* CJK Ideograph Extension A */
- [0x3c7b, 0x3c7b], /* CJK Ideograph Extension A */
- [0x3c7c, 0x3c7c], /* CJK Ideograph Extension A */
- [0x3c7d, 0x3c7d], /* CJK Ideograph Extension A */
- [0x3c7e, 0x3c7e], /* CJK Ideograph Extension A */
- [0x3c7f, 0x3c7f], /* CJK Ideograph Extension A */
- [0x3c80, 0x3c80], /* CJK Ideograph Extension A */
- [0x3c81, 0x3c81], /* CJK Ideograph Extension A */
- [0x3c82, 0x3c82], /* CJK Ideograph Extension A */
- [0x3c83, 0x3c83], /* CJK Ideograph Extension A */
- [0x3c84, 0x3c84], /* CJK Ideograph Extension A */
- [0x3c85, 0x3c85], /* CJK Ideograph Extension A */
- [0x3c86, 0x3c86], /* CJK Ideograph Extension A */
- [0x3c87, 0x3c87], /* CJK Ideograph Extension A */
- [0x3c88, 0x3c88], /* CJK Ideograph Extension A */
- [0x3c89, 0x3c89], /* CJK Ideograph Extension A */
- [0x3c8a, 0x3c8a], /* CJK Ideograph Extension A */
- [0x3c8b, 0x3c8b], /* CJK Ideograph Extension A */
- [0x3c8c, 0x3c8c], /* CJK Ideograph Extension A */
- [0x3c8d, 0x3c8d], /* CJK Ideograph Extension A */
- [0x3c8e, 0x3c8e], /* CJK Ideograph Extension A */
- [0x3c8f, 0x3c8f], /* CJK Ideograph Extension A */
- [0x3c90, 0x3c90], /* CJK Ideograph Extension A */
- [0x3c91, 0x3c91], /* CJK Ideograph Extension A */
- [0x3c92, 0x3c92], /* CJK Ideograph Extension A */
- [0x3c93, 0x3c93], /* CJK Ideograph Extension A */
- [0x3c94, 0x3c94], /* CJK Ideograph Extension A */
- [0x3c95, 0x3c95], /* CJK Ideograph Extension A */
- [0x3c96, 0x3c96], /* CJK Ideograph Extension A */
- [0x3c97, 0x3c97], /* CJK Ideograph Extension A */
- [0x3c98, 0x3c98], /* CJK Ideograph Extension A */
- [0x3c99, 0x3c99], /* CJK Ideograph Extension A */
- [0x3c9a, 0x3c9a], /* CJK Ideograph Extension A */
- [0x3c9b, 0x3c9b], /* CJK Ideograph Extension A */
- [0x3c9c, 0x3c9c], /* CJK Ideograph Extension A */
- [0x3c9d, 0x3c9d], /* CJK Ideograph Extension A */
- [0x3c9e, 0x3c9e], /* CJK Ideograph Extension A */
- [0x3c9f, 0x3c9f], /* CJK Ideograph Extension A */
- [0x3ca0, 0x3ca0], /* CJK Ideograph Extension A */
- [0x3ca1, 0x3ca1], /* CJK Ideograph Extension A */
- [0x3ca2, 0x3ca2], /* CJK Ideograph Extension A */
- [0x3ca3, 0x3ca3], /* CJK Ideograph Extension A */
- [0x3ca4, 0x3ca4], /* CJK Ideograph Extension A */
- [0x3ca5, 0x3ca5], /* CJK Ideograph Extension A */
- [0x3ca6, 0x3ca6], /* CJK Ideograph Extension A */
- [0x3ca7, 0x3ca7], /* CJK Ideograph Extension A */
- [0x3ca8, 0x3ca8], /* CJK Ideograph Extension A */
- [0x3ca9, 0x3ca9], /* CJK Ideograph Extension A */
- [0x3caa, 0x3caa], /* CJK Ideograph Extension A */
- [0x3cab, 0x3cab], /* CJK Ideograph Extension A */
- [0x3cac, 0x3cac], /* CJK Ideograph Extension A */
- [0x3cad, 0x3cad], /* CJK Ideograph Extension A */
- [0x3cae, 0x3cae], /* CJK Ideograph Extension A */
- [0x3caf, 0x3caf], /* CJK Ideograph Extension A */
- [0x3cb0, 0x3cb0], /* CJK Ideograph Extension A */
- [0x3cb1, 0x3cb1], /* CJK Ideograph Extension A */
- [0x3cb2, 0x3cb2], /* CJK Ideograph Extension A */
- [0x3cb3, 0x3cb3], /* CJK Ideograph Extension A */
- [0x3cb4, 0x3cb4], /* CJK Ideograph Extension A */
- [0x3cb5, 0x3cb5], /* CJK Ideograph Extension A */
- [0x3cb6, 0x3cb6], /* CJK Ideograph Extension A */
- [0x3cb7, 0x3cb7], /* CJK Ideograph Extension A */
- [0x3cb8, 0x3cb8], /* CJK Ideograph Extension A */
- [0x3cb9, 0x3cb9], /* CJK Ideograph Extension A */
- [0x3cba, 0x3cba], /* CJK Ideograph Extension A */
- [0x3cbb, 0x3cbb], /* CJK Ideograph Extension A */
- [0x3cbc, 0x3cbc], /* CJK Ideograph Extension A */
- [0x3cbd, 0x3cbd], /* CJK Ideograph Extension A */
- [0x3cbe, 0x3cbe], /* CJK Ideograph Extension A */
- [0x3cbf, 0x3cbf], /* CJK Ideograph Extension A */
- [0x3cc0, 0x3cc0], /* CJK Ideograph Extension A */
- [0x3cc1, 0x3cc1], /* CJK Ideograph Extension A */
- [0x3cc2, 0x3cc2], /* CJK Ideograph Extension A */
- [0x3cc3, 0x3cc3], /* CJK Ideograph Extension A */
- [0x3cc4, 0x3cc4], /* CJK Ideograph Extension A */
- [0x3cc5, 0x3cc5], /* CJK Ideograph Extension A */
- [0x3cc6, 0x3cc6], /* CJK Ideograph Extension A */
- [0x3cc7, 0x3cc7], /* CJK Ideograph Extension A */
- [0x3cc8, 0x3cc8], /* CJK Ideograph Extension A */
- [0x3cc9, 0x3cc9], /* CJK Ideograph Extension A */
- [0x3cca, 0x3cca], /* CJK Ideograph Extension A */
- [0x3ccb, 0x3ccb], /* CJK Ideograph Extension A */
- [0x3ccc, 0x3ccc], /* CJK Ideograph Extension A */
- [0x3ccd, 0x3ccd], /* CJK Ideograph Extension A */
- [0x3cce, 0x3cce], /* CJK Ideograph Extension A */
- [0x3ccf, 0x3ccf], /* CJK Ideograph Extension A */
- [0x3cd0, 0x3cd0], /* CJK Ideograph Extension A */
- [0x3cd1, 0x3cd1], /* CJK Ideograph Extension A */
- [0x3cd2, 0x3cd2], /* CJK Ideograph Extension A */
- [0x3cd3, 0x3cd3], /* CJK Ideograph Extension A */
- [0x3cd4, 0x3cd4], /* CJK Ideograph Extension A */
- [0x3cd5, 0x3cd5], /* CJK Ideograph Extension A */
- [0x3cd6, 0x3cd6], /* CJK Ideograph Extension A */
- [0x3cd7, 0x3cd7], /* CJK Ideograph Extension A */
- [0x3cd8, 0x3cd8], /* CJK Ideograph Extension A */
- [0x3cd9, 0x3cd9], /* CJK Ideograph Extension A */
- [0x3cda, 0x3cda], /* CJK Ideograph Extension A */
- [0x3cdb, 0x3cdb], /* CJK Ideograph Extension A */
- [0x3cdc, 0x3cdc], /* CJK Ideograph Extension A */
- [0x3cdd, 0x3cdd], /* CJK Ideograph Extension A */
- [0x3cde, 0x3cde], /* CJK Ideograph Extension A */
- [0x3cdf, 0x3cdf], /* CJK Ideograph Extension A */
- [0x3ce0, 0x3ce0], /* CJK Ideograph Extension A */
- [0x3ce1, 0x3ce1], /* CJK Ideograph Extension A */
- [0x3ce2, 0x3ce2], /* CJK Ideograph Extension A */
- [0x3ce3, 0x3ce3], /* CJK Ideograph Extension A */
- [0x3ce4, 0x3ce4], /* CJK Ideograph Extension A */
- [0x3ce5, 0x3ce5], /* CJK Ideograph Extension A */
- [0x3ce6, 0x3ce6], /* CJK Ideograph Extension A */
- [0x3ce7, 0x3ce7], /* CJK Ideograph Extension A */
- [0x3ce8, 0x3ce8], /* CJK Ideograph Extension A */
- [0x3ce9, 0x3ce9], /* CJK Ideograph Extension A */
- [0x3cea, 0x3cea], /* CJK Ideograph Extension A */
- [0x3ceb, 0x3ceb], /* CJK Ideograph Extension A */
- [0x3cec, 0x3cec], /* CJK Ideograph Extension A */
- [0x3ced, 0x3ced], /* CJK Ideograph Extension A */
- [0x3cee, 0x3cee], /* CJK Ideograph Extension A */
- [0x3cef, 0x3cef], /* CJK Ideograph Extension A */
- [0x3cf0, 0x3cf0], /* CJK Ideograph Extension A */
- [0x3cf1, 0x3cf1], /* CJK Ideograph Extension A */
- [0x3cf2, 0x3cf2], /* CJK Ideograph Extension A */
- [0x3cf3, 0x3cf3], /* CJK Ideograph Extension A */
- [0x3cf4, 0x3cf4], /* CJK Ideograph Extension A */
- [0x3cf5, 0x3cf5], /* CJK Ideograph Extension A */
- [0x3cf6, 0x3cf6], /* CJK Ideograph Extension A */
- [0x3cf7, 0x3cf7], /* CJK Ideograph Extension A */
- [0x3cf8, 0x3cf8], /* CJK Ideograph Extension A */
- [0x3cf9, 0x3cf9], /* CJK Ideograph Extension A */
- [0x3cfa, 0x3cfa], /* CJK Ideograph Extension A */
- [0x3cfb, 0x3cfb], /* CJK Ideograph Extension A */
- [0x3cfc, 0x3cfc], /* CJK Ideograph Extension A */
- [0x3cfd, 0x3cfd], /* CJK Ideograph Extension A */
- [0x3cfe, 0x3cfe], /* CJK Ideograph Extension A */
- [0x3cff, 0x3cff], /* CJK Ideograph Extension A */
- [0x3d00, 0x3d00], /* CJK Ideograph Extension A */
- [0x3d01, 0x3d01], /* CJK Ideograph Extension A */
- [0x3d02, 0x3d02], /* CJK Ideograph Extension A */
- [0x3d03, 0x3d03], /* CJK Ideograph Extension A */
- [0x3d04, 0x3d04], /* CJK Ideograph Extension A */
- [0x3d05, 0x3d05], /* CJK Ideograph Extension A */
- [0x3d06, 0x3d06], /* CJK Ideograph Extension A */
- [0x3d07, 0x3d07], /* CJK Ideograph Extension A */
- [0x3d08, 0x3d08], /* CJK Ideograph Extension A */
- [0x3d09, 0x3d09], /* CJK Ideograph Extension A */
- [0x3d0a, 0x3d0a], /* CJK Ideograph Extension A */
- [0x3d0b, 0x3d0b], /* CJK Ideograph Extension A */
- [0x3d0c, 0x3d0c], /* CJK Ideograph Extension A */
- [0x3d0d, 0x3d0d], /* CJK Ideograph Extension A */
- [0x3d0e, 0x3d0e], /* CJK Ideograph Extension A */
- [0x3d0f, 0x3d0f], /* CJK Ideograph Extension A */
- [0x3d10, 0x3d10], /* CJK Ideograph Extension A */
- [0x3d11, 0x3d11], /* CJK Ideograph Extension A */
- [0x3d12, 0x3d12], /* CJK Ideograph Extension A */
- [0x3d13, 0x3d13], /* CJK Ideograph Extension A */
- [0x3d14, 0x3d14], /* CJK Ideograph Extension A */
- [0x3d15, 0x3d15], /* CJK Ideograph Extension A */
- [0x3d16, 0x3d16], /* CJK Ideograph Extension A */
- [0x3d17, 0x3d17], /* CJK Ideograph Extension A */
- [0x3d18, 0x3d18], /* CJK Ideograph Extension A */
- [0x3d19, 0x3d19], /* CJK Ideograph Extension A */
- [0x3d1a, 0x3d1a], /* CJK Ideograph Extension A */
- [0x3d1b, 0x3d1b], /* CJK Ideograph Extension A */
- [0x3d1c, 0x3d1c], /* CJK Ideograph Extension A */
- [0x3d1d, 0x3d1d], /* CJK Ideograph Extension A */
- [0x3d1e, 0x3d1e], /* CJK Ideograph Extension A */
- [0x3d1f, 0x3d1f], /* CJK Ideograph Extension A */
- [0x3d20, 0x3d20], /* CJK Ideograph Extension A */
- [0x3d21, 0x3d21], /* CJK Ideograph Extension A */
- [0x3d22, 0x3d22], /* CJK Ideograph Extension A */
- [0x3d23, 0x3d23], /* CJK Ideograph Extension A */
- [0x3d24, 0x3d24], /* CJK Ideograph Extension A */
- [0x3d25, 0x3d25], /* CJK Ideograph Extension A */
- [0x3d26, 0x3d26], /* CJK Ideograph Extension A */
- [0x3d27, 0x3d27], /* CJK Ideograph Extension A */
- [0x3d28, 0x3d28], /* CJK Ideograph Extension A */
- [0x3d29, 0x3d29], /* CJK Ideograph Extension A */
- [0x3d2a, 0x3d2a], /* CJK Ideograph Extension A */
- [0x3d2b, 0x3d2b], /* CJK Ideograph Extension A */
- [0x3d2c, 0x3d2c], /* CJK Ideograph Extension A */
- [0x3d2d, 0x3d2d], /* CJK Ideograph Extension A */
- [0x3d2e, 0x3d2e], /* CJK Ideograph Extension A */
- [0x3d2f, 0x3d2f], /* CJK Ideograph Extension A */
- [0x3d30, 0x3d30], /* CJK Ideograph Extension A */
- [0x3d31, 0x3d31], /* CJK Ideograph Extension A */
- [0x3d32, 0x3d32], /* CJK Ideograph Extension A */
- [0x3d33, 0x3d33], /* CJK Ideograph Extension A */
- [0x3d34, 0x3d34], /* CJK Ideograph Extension A */
- [0x3d35, 0x3d35], /* CJK Ideograph Extension A */
- [0x3d36, 0x3d36], /* CJK Ideograph Extension A */
- [0x3d37, 0x3d37], /* CJK Ideograph Extension A */
- [0x3d38, 0x3d38], /* CJK Ideograph Extension A */
- [0x3d39, 0x3d39], /* CJK Ideograph Extension A */
- [0x3d3a, 0x3d3a], /* CJK Ideograph Extension A */
- [0x3d3b, 0x3d3b], /* CJK Ideograph Extension A */
- [0x3d3c, 0x3d3c], /* CJK Ideograph Extension A */
- [0x3d3d, 0x3d3d], /* CJK Ideograph Extension A */
- [0x3d3e, 0x3d3e], /* CJK Ideograph Extension A */
- [0x3d3f, 0x3d3f], /* CJK Ideograph Extension A */
- [0x3d40, 0x3d40], /* CJK Ideograph Extension A */
- [0x3d41, 0x3d41], /* CJK Ideograph Extension A */
- [0x3d42, 0x3d42], /* CJK Ideograph Extension A */
- [0x3d43, 0x3d43], /* CJK Ideograph Extension A */
- [0x3d44, 0x3d44], /* CJK Ideograph Extension A */
- [0x3d45, 0x3d45], /* CJK Ideograph Extension A */
- [0x3d46, 0x3d46], /* CJK Ideograph Extension A */
- [0x3d47, 0x3d47], /* CJK Ideograph Extension A */
- [0x3d48, 0x3d48], /* CJK Ideograph Extension A */
- [0x3d49, 0x3d49], /* CJK Ideograph Extension A */
- [0x3d4a, 0x3d4a], /* CJK Ideograph Extension A */
- [0x3d4b, 0x3d4b], /* CJK Ideograph Extension A */
- [0x3d4c, 0x3d4c], /* CJK Ideograph Extension A */
- [0x3d4d, 0x3d4d], /* CJK Ideograph Extension A */
- [0x3d4e, 0x3d4e], /* CJK Ideograph Extension A */
- [0x3d4f, 0x3d4f], /* CJK Ideograph Extension A */
- [0x3d50, 0x3d50], /* CJK Ideograph Extension A */
- [0x3d51, 0x3d51], /* CJK Ideograph Extension A */
- [0x3d52, 0x3d52], /* CJK Ideograph Extension A */
- [0x3d53, 0x3d53], /* CJK Ideograph Extension A */
- [0x3d54, 0x3d54], /* CJK Ideograph Extension A */
- [0x3d55, 0x3d55], /* CJK Ideograph Extension A */
- [0x3d56, 0x3d56], /* CJK Ideograph Extension A */
- [0x3d57, 0x3d57], /* CJK Ideograph Extension A */
- [0x3d58, 0x3d58], /* CJK Ideograph Extension A */
- [0x3d59, 0x3d59], /* CJK Ideograph Extension A */
- [0x3d5a, 0x3d5a], /* CJK Ideograph Extension A */
- [0x3d5b, 0x3d5b], /* CJK Ideograph Extension A */
- [0x3d5c, 0x3d5c], /* CJK Ideograph Extension A */
- [0x3d5d, 0x3d5d], /* CJK Ideograph Extension A */
- [0x3d5e, 0x3d5e], /* CJK Ideograph Extension A */
- [0x3d5f, 0x3d5f], /* CJK Ideograph Extension A */
- [0x3d60, 0x3d60], /* CJK Ideograph Extension A */
- [0x3d61, 0x3d61], /* CJK Ideograph Extension A */
- [0x3d62, 0x3d62], /* CJK Ideograph Extension A */
- [0x3d63, 0x3d63], /* CJK Ideograph Extension A */
- [0x3d64, 0x3d64], /* CJK Ideograph Extension A */
- [0x3d65, 0x3d65], /* CJK Ideograph Extension A */
- [0x3d66, 0x3d66], /* CJK Ideograph Extension A */
- [0x3d67, 0x3d67], /* CJK Ideograph Extension A */
- [0x3d68, 0x3d68], /* CJK Ideograph Extension A */
- [0x3d69, 0x3d69], /* CJK Ideograph Extension A */
- [0x3d6a, 0x3d6a], /* CJK Ideograph Extension A */
- [0x3d6b, 0x3d6b], /* CJK Ideograph Extension A */
- [0x3d6c, 0x3d6c], /* CJK Ideograph Extension A */
- [0x3d6d, 0x3d6d], /* CJK Ideograph Extension A */
- [0x3d6e, 0x3d6e], /* CJK Ideograph Extension A */
- [0x3d6f, 0x3d6f], /* CJK Ideograph Extension A */
- [0x3d70, 0x3d70], /* CJK Ideograph Extension A */
- [0x3d71, 0x3d71], /* CJK Ideograph Extension A */
- [0x3d72, 0x3d72], /* CJK Ideograph Extension A */
- [0x3d73, 0x3d73], /* CJK Ideograph Extension A */
- [0x3d74, 0x3d74], /* CJK Ideograph Extension A */
- [0x3d75, 0x3d75], /* CJK Ideograph Extension A */
- [0x3d76, 0x3d76], /* CJK Ideograph Extension A */
- [0x3d77, 0x3d77], /* CJK Ideograph Extension A */
- [0x3d78, 0x3d78], /* CJK Ideograph Extension A */
- [0x3d79, 0x3d79], /* CJK Ideograph Extension A */
- [0x3d7a, 0x3d7a], /* CJK Ideograph Extension A */
- [0x3d7b, 0x3d7b], /* CJK Ideograph Extension A */
- [0x3d7c, 0x3d7c], /* CJK Ideograph Extension A */
- [0x3d7d, 0x3d7d], /* CJK Ideograph Extension A */
- [0x3d7e, 0x3d7e], /* CJK Ideograph Extension A */
- [0x3d7f, 0x3d7f], /* CJK Ideograph Extension A */
- [0x3d80, 0x3d80], /* CJK Ideograph Extension A */
- [0x3d81, 0x3d81], /* CJK Ideograph Extension A */
- [0x3d82, 0x3d82], /* CJK Ideograph Extension A */
- [0x3d83, 0x3d83], /* CJK Ideograph Extension A */
- [0x3d84, 0x3d84], /* CJK Ideograph Extension A */
- [0x3d85, 0x3d85], /* CJK Ideograph Extension A */
- [0x3d86, 0x3d86], /* CJK Ideograph Extension A */
- [0x3d87, 0x3d87], /* CJK Ideograph Extension A */
- [0x3d88, 0x3d88], /* CJK Ideograph Extension A */
- [0x3d89, 0x3d89], /* CJK Ideograph Extension A */
- [0x3d8a, 0x3d8a], /* CJK Ideograph Extension A */
- [0x3d8b, 0x3d8b], /* CJK Ideograph Extension A */
- [0x3d8c, 0x3d8c], /* CJK Ideograph Extension A */
- [0x3d8d, 0x3d8d], /* CJK Ideograph Extension A */
- [0x3d8e, 0x3d8e], /* CJK Ideograph Extension A */
- [0x3d8f, 0x3d8f], /* CJK Ideograph Extension A */
- [0x3d90, 0x3d90], /* CJK Ideograph Extension A */
- [0x3d91, 0x3d91], /* CJK Ideograph Extension A */
- [0x3d92, 0x3d92], /* CJK Ideograph Extension A */
- [0x3d93, 0x3d93], /* CJK Ideograph Extension A */
- [0x3d94, 0x3d94], /* CJK Ideograph Extension A */
- [0x3d95, 0x3d95], /* CJK Ideograph Extension A */
- [0x3d96, 0x3d96], /* CJK Ideograph Extension A */
- [0x3d97, 0x3d97], /* CJK Ideograph Extension A */
- [0x3d98, 0x3d98], /* CJK Ideograph Extension A */
- [0x3d99, 0x3d99], /* CJK Ideograph Extension A */
- [0x3d9a, 0x3d9a], /* CJK Ideograph Extension A */
- [0x3d9b, 0x3d9b], /* CJK Ideograph Extension A */
- [0x3d9c, 0x3d9c], /* CJK Ideograph Extension A */
- [0x3d9d, 0x3d9d], /* CJK Ideograph Extension A */
- [0x3d9e, 0x3d9e], /* CJK Ideograph Extension A */
- [0x3d9f, 0x3d9f], /* CJK Ideograph Extension A */
- [0x3da0, 0x3da0], /* CJK Ideograph Extension A */
- [0x3da1, 0x3da1], /* CJK Ideograph Extension A */
- [0x3da2, 0x3da2], /* CJK Ideograph Extension A */
- [0x3da3, 0x3da3], /* CJK Ideograph Extension A */
- [0x3da4, 0x3da4], /* CJK Ideograph Extension A */
- [0x3da5, 0x3da5], /* CJK Ideograph Extension A */
- [0x3da6, 0x3da6], /* CJK Ideograph Extension A */
- [0x3da7, 0x3da7], /* CJK Ideograph Extension A */
- [0x3da8, 0x3da8], /* CJK Ideograph Extension A */
- [0x3da9, 0x3da9], /* CJK Ideograph Extension A */
- [0x3daa, 0x3daa], /* CJK Ideograph Extension A */
- [0x3dab, 0x3dab], /* CJK Ideograph Extension A */
- [0x3dac, 0x3dac], /* CJK Ideograph Extension A */
- [0x3dad, 0x3dad], /* CJK Ideograph Extension A */
- [0x3dae, 0x3dae], /* CJK Ideograph Extension A */
- [0x3daf, 0x3daf], /* CJK Ideograph Extension A */
- [0x3db0, 0x3db0], /* CJK Ideograph Extension A */
- [0x3db1, 0x3db1], /* CJK Ideograph Extension A */
- [0x3db2, 0x3db2], /* CJK Ideograph Extension A */
- [0x3db3, 0x3db3], /* CJK Ideograph Extension A */
- [0x3db4, 0x3db4], /* CJK Ideograph Extension A */
- [0x3db5, 0x3db5], /* CJK Ideograph Extension A */
- [0x3db6, 0x3db6], /* CJK Ideograph Extension A */
- [0x3db7, 0x3db7], /* CJK Ideograph Extension A */
- [0x3db8, 0x3db8], /* CJK Ideograph Extension A */
- [0x3db9, 0x3db9], /* CJK Ideograph Extension A */
- [0x3dba, 0x3dba], /* CJK Ideograph Extension A */
- [0x3dbb, 0x3dbb], /* CJK Ideograph Extension A */
- [0x3dbc, 0x3dbc], /* CJK Ideograph Extension A */
- [0x3dbd, 0x3dbd], /* CJK Ideograph Extension A */
- [0x3dbe, 0x3dbe], /* CJK Ideograph Extension A */
- [0x3dbf, 0x3dbf], /* CJK Ideograph Extension A */
- [0x3dc0, 0x3dc0], /* CJK Ideograph Extension A */
- [0x3dc1, 0x3dc1], /* CJK Ideograph Extension A */
- [0x3dc2, 0x3dc2], /* CJK Ideograph Extension A */
- [0x3dc3, 0x3dc3], /* CJK Ideograph Extension A */
- [0x3dc4, 0x3dc4], /* CJK Ideograph Extension A */
- [0x3dc5, 0x3dc5], /* CJK Ideograph Extension A */
- [0x3dc6, 0x3dc6], /* CJK Ideograph Extension A */
- [0x3dc7, 0x3dc7], /* CJK Ideograph Extension A */
- [0x3dc8, 0x3dc8], /* CJK Ideograph Extension A */
- [0x3dc9, 0x3dc9], /* CJK Ideograph Extension A */
- [0x3dca, 0x3dca], /* CJK Ideograph Extension A */
- [0x3dcb, 0x3dcb], /* CJK Ideograph Extension A */
- [0x3dcc, 0x3dcc], /* CJK Ideograph Extension A */
- [0x3dcd, 0x3dcd], /* CJK Ideograph Extension A */
- [0x3dce, 0x3dce], /* CJK Ideograph Extension A */
- [0x3dcf, 0x3dcf], /* CJK Ideograph Extension A */
- [0x3dd0, 0x3dd0], /* CJK Ideograph Extension A */
- [0x3dd1, 0x3dd1], /* CJK Ideograph Extension A */
- [0x3dd2, 0x3dd2], /* CJK Ideograph Extension A */
- [0x3dd3, 0x3dd3], /* CJK Ideograph Extension A */
- [0x3dd4, 0x3dd4], /* CJK Ideograph Extension A */
- [0x3dd5, 0x3dd5], /* CJK Ideograph Extension A */
- [0x3dd6, 0x3dd6], /* CJK Ideograph Extension A */
- [0x3dd7, 0x3dd7], /* CJK Ideograph Extension A */
- [0x3dd8, 0x3dd8], /* CJK Ideograph Extension A */
- [0x3dd9, 0x3dd9], /* CJK Ideograph Extension A */
- [0x3dda, 0x3dda], /* CJK Ideograph Extension A */
- [0x3ddb, 0x3ddb], /* CJK Ideograph Extension A */
- [0x3ddc, 0x3ddc], /* CJK Ideograph Extension A */
- [0x3ddd, 0x3ddd], /* CJK Ideograph Extension A */
- [0x3dde, 0x3dde], /* CJK Ideograph Extension A */
- [0x3ddf, 0x3ddf], /* CJK Ideograph Extension A */
- [0x3de0, 0x3de0], /* CJK Ideograph Extension A */
- [0x3de1, 0x3de1], /* CJK Ideograph Extension A */
- [0x3de2, 0x3de2], /* CJK Ideograph Extension A */
- [0x3de3, 0x3de3], /* CJK Ideograph Extension A */
- [0x3de4, 0x3de4], /* CJK Ideograph Extension A */
- [0x3de5, 0x3de5], /* CJK Ideograph Extension A */
- [0x3de6, 0x3de6], /* CJK Ideograph Extension A */
- [0x3de7, 0x3de7], /* CJK Ideograph Extension A */
- [0x3de8, 0x3de8], /* CJK Ideograph Extension A */
- [0x3de9, 0x3de9], /* CJK Ideograph Extension A */
- [0x3dea, 0x3dea], /* CJK Ideograph Extension A */
- [0x3deb, 0x3deb], /* CJK Ideograph Extension A */
- [0x3dec, 0x3dec], /* CJK Ideograph Extension A */
- [0x3ded, 0x3ded], /* CJK Ideograph Extension A */
- [0x3dee, 0x3dee], /* CJK Ideograph Extension A */
- [0x3def, 0x3def], /* CJK Ideograph Extension A */
- [0x3df0, 0x3df0], /* CJK Ideograph Extension A */
- [0x3df1, 0x3df1], /* CJK Ideograph Extension A */
- [0x3df2, 0x3df2], /* CJK Ideograph Extension A */
- [0x3df3, 0x3df3], /* CJK Ideograph Extension A */
- [0x3df4, 0x3df4], /* CJK Ideograph Extension A */
- [0x3df5, 0x3df5], /* CJK Ideograph Extension A */
- [0x3df6, 0x3df6], /* CJK Ideograph Extension A */
- [0x3df7, 0x3df7], /* CJK Ideograph Extension A */
- [0x3df8, 0x3df8], /* CJK Ideograph Extension A */
- [0x3df9, 0x3df9], /* CJK Ideograph Extension A */
- [0x3dfa, 0x3dfa], /* CJK Ideograph Extension A */
- [0x3dfb, 0x3dfb], /* CJK Ideograph Extension A */
- [0x3dfc, 0x3dfc], /* CJK Ideograph Extension A */
- [0x3dfd, 0x3dfd], /* CJK Ideograph Extension A */
- [0x3dfe, 0x3dfe], /* CJK Ideograph Extension A */
- [0x3dff, 0x3dff], /* CJK Ideograph Extension A */
- [0x3e00, 0x3e00], /* CJK Ideograph Extension A */
- [0x3e01, 0x3e01], /* CJK Ideograph Extension A */
- [0x3e02, 0x3e02], /* CJK Ideograph Extension A */
- [0x3e03, 0x3e03], /* CJK Ideograph Extension A */
- [0x3e04, 0x3e04], /* CJK Ideograph Extension A */
- [0x3e05, 0x3e05], /* CJK Ideograph Extension A */
- [0x3e06, 0x3e06], /* CJK Ideograph Extension A */
- [0x3e07, 0x3e07], /* CJK Ideograph Extension A */
- [0x3e08, 0x3e08], /* CJK Ideograph Extension A */
- [0x3e09, 0x3e09], /* CJK Ideograph Extension A */
- [0x3e0a, 0x3e0a], /* CJK Ideograph Extension A */
- [0x3e0b, 0x3e0b], /* CJK Ideograph Extension A */
- [0x3e0c, 0x3e0c], /* CJK Ideograph Extension A */
- [0x3e0d, 0x3e0d], /* CJK Ideograph Extension A */
- [0x3e0e, 0x3e0e], /* CJK Ideograph Extension A */
- [0x3e0f, 0x3e0f], /* CJK Ideograph Extension A */
- [0x3e10, 0x3e10], /* CJK Ideograph Extension A */
- [0x3e11, 0x3e11], /* CJK Ideograph Extension A */
- [0x3e12, 0x3e12], /* CJK Ideograph Extension A */
- [0x3e13, 0x3e13], /* CJK Ideograph Extension A */
- [0x3e14, 0x3e14], /* CJK Ideograph Extension A */
- [0x3e15, 0x3e15], /* CJK Ideograph Extension A */
- [0x3e16, 0x3e16], /* CJK Ideograph Extension A */
- [0x3e17, 0x3e17], /* CJK Ideograph Extension A */
- [0x3e18, 0x3e18], /* CJK Ideograph Extension A */
- [0x3e19, 0x3e19], /* CJK Ideograph Extension A */
- [0x3e1a, 0x3e1a], /* CJK Ideograph Extension A */
- [0x3e1b, 0x3e1b], /* CJK Ideograph Extension A */
- [0x3e1c, 0x3e1c], /* CJK Ideograph Extension A */
- [0x3e1d, 0x3e1d], /* CJK Ideograph Extension A */
- [0x3e1e, 0x3e1e], /* CJK Ideograph Extension A */
- [0x3e1f, 0x3e1f], /* CJK Ideograph Extension A */
- [0x3e20, 0x3e20], /* CJK Ideograph Extension A */
- [0x3e21, 0x3e21], /* CJK Ideograph Extension A */
- [0x3e22, 0x3e22], /* CJK Ideograph Extension A */
- [0x3e23, 0x3e23], /* CJK Ideograph Extension A */
- [0x3e24, 0x3e24], /* CJK Ideograph Extension A */
- [0x3e25, 0x3e25], /* CJK Ideograph Extension A */
- [0x3e26, 0x3e26], /* CJK Ideograph Extension A */
- [0x3e27, 0x3e27], /* CJK Ideograph Extension A */
- [0x3e28, 0x3e28], /* CJK Ideograph Extension A */
- [0x3e29, 0x3e29], /* CJK Ideograph Extension A */
- [0x3e2a, 0x3e2a], /* CJK Ideograph Extension A */
- [0x3e2b, 0x3e2b], /* CJK Ideograph Extension A */
- [0x3e2c, 0x3e2c], /* CJK Ideograph Extension A */
- [0x3e2d, 0x3e2d], /* CJK Ideograph Extension A */
- [0x3e2e, 0x3e2e], /* CJK Ideograph Extension A */
- [0x3e2f, 0x3e2f], /* CJK Ideograph Extension A */
- [0x3e30, 0x3e30], /* CJK Ideograph Extension A */
- [0x3e31, 0x3e31], /* CJK Ideograph Extension A */
- [0x3e32, 0x3e32], /* CJK Ideograph Extension A */
- [0x3e33, 0x3e33], /* CJK Ideograph Extension A */
- [0x3e34, 0x3e34], /* CJK Ideograph Extension A */
- [0x3e35, 0x3e35], /* CJK Ideograph Extension A */
- [0x3e36, 0x3e36], /* CJK Ideograph Extension A */
- [0x3e37, 0x3e37], /* CJK Ideograph Extension A */
- [0x3e38, 0x3e38], /* CJK Ideograph Extension A */
- [0x3e39, 0x3e39], /* CJK Ideograph Extension A */
- [0x3e3a, 0x3e3a], /* CJK Ideograph Extension A */
- [0x3e3b, 0x3e3b], /* CJK Ideograph Extension A */
- [0x3e3c, 0x3e3c], /* CJK Ideograph Extension A */
- [0x3e3d, 0x3e3d], /* CJK Ideograph Extension A */
- [0x3e3e, 0x3e3e], /* CJK Ideograph Extension A */
- [0x3e3f, 0x3e3f], /* CJK Ideograph Extension A */
- [0x3e40, 0x3e40], /* CJK Ideograph Extension A */
- [0x3e41, 0x3e41], /* CJK Ideograph Extension A */
- [0x3e42, 0x3e42], /* CJK Ideograph Extension A */
- [0x3e43, 0x3e43], /* CJK Ideograph Extension A */
- [0x3e44, 0x3e44], /* CJK Ideograph Extension A */
- [0x3e45, 0x3e45], /* CJK Ideograph Extension A */
- [0x3e46, 0x3e46], /* CJK Ideograph Extension A */
- [0x3e47, 0x3e47], /* CJK Ideograph Extension A */
- [0x3e48, 0x3e48], /* CJK Ideograph Extension A */
- [0x3e49, 0x3e49], /* CJK Ideograph Extension A */
- [0x3e4a, 0x3e4a], /* CJK Ideograph Extension A */
- [0x3e4b, 0x3e4b], /* CJK Ideograph Extension A */
- [0x3e4c, 0x3e4c], /* CJK Ideograph Extension A */
- [0x3e4d, 0x3e4d], /* CJK Ideograph Extension A */
- [0x3e4e, 0x3e4e], /* CJK Ideograph Extension A */
- [0x3e4f, 0x3e4f], /* CJK Ideograph Extension A */
- [0x3e50, 0x3e50], /* CJK Ideograph Extension A */
- [0x3e51, 0x3e51], /* CJK Ideograph Extension A */
- [0x3e52, 0x3e52], /* CJK Ideograph Extension A */
- [0x3e53, 0x3e53], /* CJK Ideograph Extension A */
- [0x3e54, 0x3e54], /* CJK Ideograph Extension A */
- [0x3e55, 0x3e55], /* CJK Ideograph Extension A */
- [0x3e56, 0x3e56], /* CJK Ideograph Extension A */
- [0x3e57, 0x3e57], /* CJK Ideograph Extension A */
- [0x3e58, 0x3e58], /* CJK Ideograph Extension A */
- [0x3e59, 0x3e59], /* CJK Ideograph Extension A */
- [0x3e5a, 0x3e5a], /* CJK Ideograph Extension A */
- [0x3e5b, 0x3e5b], /* CJK Ideograph Extension A */
- [0x3e5c, 0x3e5c], /* CJK Ideograph Extension A */
- [0x3e5d, 0x3e5d], /* CJK Ideograph Extension A */
- [0x3e5e, 0x3e5e], /* CJK Ideograph Extension A */
- [0x3e5f, 0x3e5f], /* CJK Ideograph Extension A */
- [0x3e60, 0x3e60], /* CJK Ideograph Extension A */
- [0x3e61, 0x3e61], /* CJK Ideograph Extension A */
- [0x3e62, 0x3e62], /* CJK Ideograph Extension A */
- [0x3e63, 0x3e63], /* CJK Ideograph Extension A */
- [0x3e64, 0x3e64], /* CJK Ideograph Extension A */
- [0x3e65, 0x3e65], /* CJK Ideograph Extension A */
- [0x3e66, 0x3e66], /* CJK Ideograph Extension A */
- [0x3e67, 0x3e67], /* CJK Ideograph Extension A */
- [0x3e68, 0x3e68], /* CJK Ideograph Extension A */
- [0x3e69, 0x3e69], /* CJK Ideograph Extension A */
- [0x3e6a, 0x3e6a], /* CJK Ideograph Extension A */
- [0x3e6b, 0x3e6b], /* CJK Ideograph Extension A */
- [0x3e6c, 0x3e6c], /* CJK Ideograph Extension A */
- [0x3e6d, 0x3e6d], /* CJK Ideograph Extension A */
- [0x3e6e, 0x3e6e], /* CJK Ideograph Extension A */
- [0x3e6f, 0x3e6f], /* CJK Ideograph Extension A */
- [0x3e70, 0x3e70], /* CJK Ideograph Extension A */
- [0x3e71, 0x3e71], /* CJK Ideograph Extension A */
- [0x3e72, 0x3e72], /* CJK Ideograph Extension A */
- [0x3e73, 0x3e73], /* CJK Ideograph Extension A */
- [0x3e74, 0x3e74], /* CJK Ideograph Extension A */
- [0x3e75, 0x3e75], /* CJK Ideograph Extension A */
- [0x3e76, 0x3e76], /* CJK Ideograph Extension A */
- [0x3e77, 0x3e77], /* CJK Ideograph Extension A */
- [0x3e78, 0x3e78], /* CJK Ideograph Extension A */
- [0x3e79, 0x3e79], /* CJK Ideograph Extension A */
- [0x3e7a, 0x3e7a], /* CJK Ideograph Extension A */
- [0x3e7b, 0x3e7b], /* CJK Ideograph Extension A */
- [0x3e7c, 0x3e7c], /* CJK Ideograph Extension A */
- [0x3e7d, 0x3e7d], /* CJK Ideograph Extension A */
- [0x3e7e, 0x3e7e], /* CJK Ideograph Extension A */
- [0x3e7f, 0x3e7f], /* CJK Ideograph Extension A */
- [0x3e80, 0x3e80], /* CJK Ideograph Extension A */
- [0x3e81, 0x3e81], /* CJK Ideograph Extension A */
- [0x3e82, 0x3e82], /* CJK Ideograph Extension A */
- [0x3e83, 0x3e83], /* CJK Ideograph Extension A */
- [0x3e84, 0x3e84], /* CJK Ideograph Extension A */
- [0x3e85, 0x3e85], /* CJK Ideograph Extension A */
- [0x3e86, 0x3e86], /* CJK Ideograph Extension A */
- [0x3e87, 0x3e87], /* CJK Ideograph Extension A */
- [0x3e88, 0x3e88], /* CJK Ideograph Extension A */
- [0x3e89, 0x3e89], /* CJK Ideograph Extension A */
- [0x3e8a, 0x3e8a], /* CJK Ideograph Extension A */
- [0x3e8b, 0x3e8b], /* CJK Ideograph Extension A */
- [0x3e8c, 0x3e8c], /* CJK Ideograph Extension A */
- [0x3e8d, 0x3e8d], /* CJK Ideograph Extension A */
- [0x3e8e, 0x3e8e], /* CJK Ideograph Extension A */
- [0x3e8f, 0x3e8f], /* CJK Ideograph Extension A */
- [0x3e90, 0x3e90], /* CJK Ideograph Extension A */
- [0x3e91, 0x3e91], /* CJK Ideograph Extension A */
- [0x3e92, 0x3e92], /* CJK Ideograph Extension A */
- [0x3e93, 0x3e93], /* CJK Ideograph Extension A */
- [0x3e94, 0x3e94], /* CJK Ideograph Extension A */
- [0x3e95, 0x3e95], /* CJK Ideograph Extension A */
- [0x3e96, 0x3e96], /* CJK Ideograph Extension A */
- [0x3e97, 0x3e97], /* CJK Ideograph Extension A */
- [0x3e98, 0x3e98], /* CJK Ideograph Extension A */
- [0x3e99, 0x3e99], /* CJK Ideograph Extension A */
- [0x3e9a, 0x3e9a], /* CJK Ideograph Extension A */
- [0x3e9b, 0x3e9b], /* CJK Ideograph Extension A */
- [0x3e9c, 0x3e9c], /* CJK Ideograph Extension A */
- [0x3e9d, 0x3e9d], /* CJK Ideograph Extension A */
- [0x3e9e, 0x3e9e], /* CJK Ideograph Extension A */
- [0x3e9f, 0x3e9f], /* CJK Ideograph Extension A */
- [0x3ea0, 0x3ea0], /* CJK Ideograph Extension A */
- [0x3ea1, 0x3ea1], /* CJK Ideograph Extension A */
- [0x3ea2, 0x3ea2], /* CJK Ideograph Extension A */
- [0x3ea3, 0x3ea3], /* CJK Ideograph Extension A */
- [0x3ea4, 0x3ea4], /* CJK Ideograph Extension A */
- [0x3ea5, 0x3ea5], /* CJK Ideograph Extension A */
- [0x3ea6, 0x3ea6], /* CJK Ideograph Extension A */
- [0x3ea7, 0x3ea7], /* CJK Ideograph Extension A */
- [0x3ea8, 0x3ea8], /* CJK Ideograph Extension A */
- [0x3ea9, 0x3ea9], /* CJK Ideograph Extension A */
- [0x3eaa, 0x3eaa], /* CJK Ideograph Extension A */
- [0x3eab, 0x3eab], /* CJK Ideograph Extension A */
- [0x3eac, 0x3eac], /* CJK Ideograph Extension A */
- [0x3ead, 0x3ead], /* CJK Ideograph Extension A */
- [0x3eae, 0x3eae], /* CJK Ideograph Extension A */
- [0x3eaf, 0x3eaf], /* CJK Ideograph Extension A */
- [0x3eb0, 0x3eb0], /* CJK Ideograph Extension A */
- [0x3eb1, 0x3eb1], /* CJK Ideograph Extension A */
- [0x3eb2, 0x3eb2], /* CJK Ideograph Extension A */
- [0x3eb3, 0x3eb3], /* CJK Ideograph Extension A */
- [0x3eb4, 0x3eb4], /* CJK Ideograph Extension A */
- [0x3eb5, 0x3eb5], /* CJK Ideograph Extension A */
- [0x3eb6, 0x3eb6], /* CJK Ideograph Extension A */
- [0x3eb7, 0x3eb7], /* CJK Ideograph Extension A */
- [0x3eb8, 0x3eb8], /* CJK Ideograph Extension A */
- [0x3eb9, 0x3eb9], /* CJK Ideograph Extension A */
- [0x3eba, 0x3eba], /* CJK Ideograph Extension A */
- [0x3ebb, 0x3ebb], /* CJK Ideograph Extension A */
- [0x3ebc, 0x3ebc], /* CJK Ideograph Extension A */
- [0x3ebd, 0x3ebd], /* CJK Ideograph Extension A */
- [0x3ebe, 0x3ebe], /* CJK Ideograph Extension A */
- [0x3ebf, 0x3ebf], /* CJK Ideograph Extension A */
- [0x3ec0, 0x3ec0], /* CJK Ideograph Extension A */
- [0x3ec1, 0x3ec1], /* CJK Ideograph Extension A */
- [0x3ec2, 0x3ec2], /* CJK Ideograph Extension A */
- [0x3ec3, 0x3ec3], /* CJK Ideograph Extension A */
- [0x3ec4, 0x3ec4], /* CJK Ideograph Extension A */
- [0x3ec5, 0x3ec5], /* CJK Ideograph Extension A */
- [0x3ec6, 0x3ec6], /* CJK Ideograph Extension A */
- [0x3ec7, 0x3ec7], /* CJK Ideograph Extension A */
- [0x3ec8, 0x3ec8], /* CJK Ideograph Extension A */
- [0x3ec9, 0x3ec9], /* CJK Ideograph Extension A */
- [0x3eca, 0x3eca], /* CJK Ideograph Extension A */
- [0x3ecb, 0x3ecb], /* CJK Ideograph Extension A */
- [0x3ecc, 0x3ecc], /* CJK Ideograph Extension A */
- [0x3ecd, 0x3ecd], /* CJK Ideograph Extension A */
- [0x3ece, 0x3ece], /* CJK Ideograph Extension A */
- [0x3ecf, 0x3ecf], /* CJK Ideograph Extension A */
- [0x3ed0, 0x3ed0], /* CJK Ideograph Extension A */
- [0x3ed1, 0x3ed1], /* CJK Ideograph Extension A */
- [0x3ed2, 0x3ed2], /* CJK Ideograph Extension A */
- [0x3ed3, 0x3ed3], /* CJK Ideograph Extension A */
- [0x3ed4, 0x3ed4], /* CJK Ideograph Extension A */
- [0x3ed5, 0x3ed5], /* CJK Ideograph Extension A */
- [0x3ed6, 0x3ed6], /* CJK Ideograph Extension A */
- [0x3ed7, 0x3ed7], /* CJK Ideograph Extension A */
- [0x3ed8, 0x3ed8], /* CJK Ideograph Extension A */
- [0x3ed9, 0x3ed9], /* CJK Ideograph Extension A */
- [0x3eda, 0x3eda], /* CJK Ideograph Extension A */
- [0x3edb, 0x3edb], /* CJK Ideograph Extension A */
- [0x3edc, 0x3edc], /* CJK Ideograph Extension A */
- [0x3edd, 0x3edd], /* CJK Ideograph Extension A */
- [0x3ede, 0x3ede], /* CJK Ideograph Extension A */
- [0x3edf, 0x3edf], /* CJK Ideograph Extension A */
- [0x3ee0, 0x3ee0], /* CJK Ideograph Extension A */
- [0x3ee1, 0x3ee1], /* CJK Ideograph Extension A */
- [0x3ee2, 0x3ee2], /* CJK Ideograph Extension A */
- [0x3ee3, 0x3ee3], /* CJK Ideograph Extension A */
- [0x3ee4, 0x3ee4], /* CJK Ideograph Extension A */
- [0x3ee5, 0x3ee5], /* CJK Ideograph Extension A */
- [0x3ee6, 0x3ee6], /* CJK Ideograph Extension A */
- [0x3ee7, 0x3ee7], /* CJK Ideograph Extension A */
- [0x3ee8, 0x3ee8], /* CJK Ideograph Extension A */
- [0x3ee9, 0x3ee9], /* CJK Ideograph Extension A */
- [0x3eea, 0x3eea], /* CJK Ideograph Extension A */
- [0x3eeb, 0x3eeb], /* CJK Ideograph Extension A */
- [0x3eec, 0x3eec], /* CJK Ideograph Extension A */
- [0x3eed, 0x3eed], /* CJK Ideograph Extension A */
- [0x3eee, 0x3eee], /* CJK Ideograph Extension A */
- [0x3eef, 0x3eef], /* CJK Ideograph Extension A */
- [0x3ef0, 0x3ef0], /* CJK Ideograph Extension A */
- [0x3ef1, 0x3ef1], /* CJK Ideograph Extension A */
- [0x3ef2, 0x3ef2], /* CJK Ideograph Extension A */
- [0x3ef3, 0x3ef3], /* CJK Ideograph Extension A */
- [0x3ef4, 0x3ef4], /* CJK Ideograph Extension A */
- [0x3ef5, 0x3ef5], /* CJK Ideograph Extension A */
- [0x3ef6, 0x3ef6], /* CJK Ideograph Extension A */
- [0x3ef7, 0x3ef7], /* CJK Ideograph Extension A */
- [0x3ef8, 0x3ef8], /* CJK Ideograph Extension A */
- [0x3ef9, 0x3ef9], /* CJK Ideograph Extension A */
- [0x3efa, 0x3efa], /* CJK Ideograph Extension A */
- [0x3efb, 0x3efb], /* CJK Ideograph Extension A */
- [0x3efc, 0x3efc], /* CJK Ideograph Extension A */
- [0x3efd, 0x3efd], /* CJK Ideograph Extension A */
- [0x3efe, 0x3efe], /* CJK Ideograph Extension A */
- [0x3eff, 0x3eff], /* CJK Ideograph Extension A */
- [0x3f00, 0x3f00], /* CJK Ideograph Extension A */
- [0x3f01, 0x3f01], /* CJK Ideograph Extension A */
- [0x3f02, 0x3f02], /* CJK Ideograph Extension A */
- [0x3f03, 0x3f03], /* CJK Ideograph Extension A */
- [0x3f04, 0x3f04], /* CJK Ideograph Extension A */
- [0x3f05, 0x3f05], /* CJK Ideograph Extension A */
- [0x3f06, 0x3f06], /* CJK Ideograph Extension A */
- [0x3f07, 0x3f07], /* CJK Ideograph Extension A */
- [0x3f08, 0x3f08], /* CJK Ideograph Extension A */
- [0x3f09, 0x3f09], /* CJK Ideograph Extension A */
- [0x3f0a, 0x3f0a], /* CJK Ideograph Extension A */
- [0x3f0b, 0x3f0b], /* CJK Ideograph Extension A */
- [0x3f0c, 0x3f0c], /* CJK Ideograph Extension A */
- [0x3f0d, 0x3f0d], /* CJK Ideograph Extension A */
- [0x3f0e, 0x3f0e], /* CJK Ideograph Extension A */
- [0x3f0f, 0x3f0f], /* CJK Ideograph Extension A */
- [0x3f10, 0x3f10], /* CJK Ideograph Extension A */
- [0x3f11, 0x3f11], /* CJK Ideograph Extension A */
- [0x3f12, 0x3f12], /* CJK Ideograph Extension A */
- [0x3f13, 0x3f13], /* CJK Ideograph Extension A */
- [0x3f14, 0x3f14], /* CJK Ideograph Extension A */
- [0x3f15, 0x3f15], /* CJK Ideograph Extension A */
- [0x3f16, 0x3f16], /* CJK Ideograph Extension A */
- [0x3f17, 0x3f17], /* CJK Ideograph Extension A */
- [0x3f18, 0x3f18], /* CJK Ideograph Extension A */
- [0x3f19, 0x3f19], /* CJK Ideograph Extension A */
- [0x3f1a, 0x3f1a], /* CJK Ideograph Extension A */
- [0x3f1b, 0x3f1b], /* CJK Ideograph Extension A */
- [0x3f1c, 0x3f1c], /* CJK Ideograph Extension A */
- [0x3f1d, 0x3f1d], /* CJK Ideograph Extension A */
- [0x3f1e, 0x3f1e], /* CJK Ideograph Extension A */
- [0x3f1f, 0x3f1f], /* CJK Ideograph Extension A */
- [0x3f20, 0x3f20], /* CJK Ideograph Extension A */
- [0x3f21, 0x3f21], /* CJK Ideograph Extension A */
- [0x3f22, 0x3f22], /* CJK Ideograph Extension A */
- [0x3f23, 0x3f23], /* CJK Ideograph Extension A */
- [0x3f24, 0x3f24], /* CJK Ideograph Extension A */
- [0x3f25, 0x3f25], /* CJK Ideograph Extension A */
- [0x3f26, 0x3f26], /* CJK Ideograph Extension A */
- [0x3f27, 0x3f27], /* CJK Ideograph Extension A */
- [0x3f28, 0x3f28], /* CJK Ideograph Extension A */
- [0x3f29, 0x3f29], /* CJK Ideograph Extension A */
- [0x3f2a, 0x3f2a], /* CJK Ideograph Extension A */
- [0x3f2b, 0x3f2b], /* CJK Ideograph Extension A */
- [0x3f2c, 0x3f2c], /* CJK Ideograph Extension A */
- [0x3f2d, 0x3f2d], /* CJK Ideograph Extension A */
- [0x3f2e, 0x3f2e], /* CJK Ideograph Extension A */
- [0x3f2f, 0x3f2f], /* CJK Ideograph Extension A */
- [0x3f30, 0x3f30], /* CJK Ideograph Extension A */
- [0x3f31, 0x3f31], /* CJK Ideograph Extension A */
- [0x3f32, 0x3f32], /* CJK Ideograph Extension A */
- [0x3f33, 0x3f33], /* CJK Ideograph Extension A */
- [0x3f34, 0x3f34], /* CJK Ideograph Extension A */
- [0x3f35, 0x3f35], /* CJK Ideograph Extension A */
- [0x3f36, 0x3f36], /* CJK Ideograph Extension A */
- [0x3f37, 0x3f37], /* CJK Ideograph Extension A */
- [0x3f38, 0x3f38], /* CJK Ideograph Extension A */
- [0x3f39, 0x3f39], /* CJK Ideograph Extension A */
- [0x3f3a, 0x3f3a], /* CJK Ideograph Extension A */
- [0x3f3b, 0x3f3b], /* CJK Ideograph Extension A */
- [0x3f3c, 0x3f3c], /* CJK Ideograph Extension A */
- [0x3f3d, 0x3f3d], /* CJK Ideograph Extension A */
- [0x3f3e, 0x3f3e], /* CJK Ideograph Extension A */
- [0x3f3f, 0x3f3f], /* CJK Ideograph Extension A */
- [0x3f40, 0x3f40], /* CJK Ideograph Extension A */
- [0x3f41, 0x3f41], /* CJK Ideograph Extension A */
- [0x3f42, 0x3f42], /* CJK Ideograph Extension A */
- [0x3f43, 0x3f43], /* CJK Ideograph Extension A */
- [0x3f44, 0x3f44], /* CJK Ideograph Extension A */
- [0x3f45, 0x3f45], /* CJK Ideograph Extension A */
- [0x3f46, 0x3f46], /* CJK Ideograph Extension A */
- [0x3f47, 0x3f47], /* CJK Ideograph Extension A */
- [0x3f48, 0x3f48], /* CJK Ideograph Extension A */
- [0x3f49, 0x3f49], /* CJK Ideograph Extension A */
- [0x3f4a, 0x3f4a], /* CJK Ideograph Extension A */
- [0x3f4b, 0x3f4b], /* CJK Ideograph Extension A */
- [0x3f4c, 0x3f4c], /* CJK Ideograph Extension A */
- [0x3f4d, 0x3f4d], /* CJK Ideograph Extension A */
- [0x3f4e, 0x3f4e], /* CJK Ideograph Extension A */
- [0x3f4f, 0x3f4f], /* CJK Ideograph Extension A */
- [0x3f50, 0x3f50], /* CJK Ideograph Extension A */
- [0x3f51, 0x3f51], /* CJK Ideograph Extension A */
- [0x3f52, 0x3f52], /* CJK Ideograph Extension A */
- [0x3f53, 0x3f53], /* CJK Ideograph Extension A */
- [0x3f54, 0x3f54], /* CJK Ideograph Extension A */
- [0x3f55, 0x3f55], /* CJK Ideograph Extension A */
- [0x3f56, 0x3f56], /* CJK Ideograph Extension A */
- [0x3f57, 0x3f57], /* CJK Ideograph Extension A */
- [0x3f58, 0x3f58], /* CJK Ideograph Extension A */
- [0x3f59, 0x3f59], /* CJK Ideograph Extension A */
- [0x3f5a, 0x3f5a], /* CJK Ideograph Extension A */
- [0x3f5b, 0x3f5b], /* CJK Ideograph Extension A */
- [0x3f5c, 0x3f5c], /* CJK Ideograph Extension A */
- [0x3f5d, 0x3f5d], /* CJK Ideograph Extension A */
- [0x3f5e, 0x3f5e], /* CJK Ideograph Extension A */
- [0x3f5f, 0x3f5f], /* CJK Ideograph Extension A */
- [0x3f60, 0x3f60], /* CJK Ideograph Extension A */
- [0x3f61, 0x3f61], /* CJK Ideograph Extension A */
- [0x3f62, 0x3f62], /* CJK Ideograph Extension A */
- [0x3f63, 0x3f63], /* CJK Ideograph Extension A */
- [0x3f64, 0x3f64], /* CJK Ideograph Extension A */
- [0x3f65, 0x3f65], /* CJK Ideograph Extension A */
- [0x3f66, 0x3f66], /* CJK Ideograph Extension A */
- [0x3f67, 0x3f67], /* CJK Ideograph Extension A */
- [0x3f68, 0x3f68], /* CJK Ideograph Extension A */
- [0x3f69, 0x3f69], /* CJK Ideograph Extension A */
- [0x3f6a, 0x3f6a], /* CJK Ideograph Extension A */
- [0x3f6b, 0x3f6b], /* CJK Ideograph Extension A */
- [0x3f6c, 0x3f6c], /* CJK Ideograph Extension A */
- [0x3f6d, 0x3f6d], /* CJK Ideograph Extension A */
- [0x3f6e, 0x3f6e], /* CJK Ideograph Extension A */
- [0x3f6f, 0x3f6f], /* CJK Ideograph Extension A */
- [0x3f70, 0x3f70], /* CJK Ideograph Extension A */
- [0x3f71, 0x3f71], /* CJK Ideograph Extension A */
- [0x3f72, 0x3f72], /* CJK Ideograph Extension A */
- [0x3f73, 0x3f73], /* CJK Ideograph Extension A */
- [0x3f74, 0x3f74], /* CJK Ideograph Extension A */
- [0x3f75, 0x3f75], /* CJK Ideograph Extension A */
- [0x3f76, 0x3f76], /* CJK Ideograph Extension A */
- [0x3f77, 0x3f77], /* CJK Ideograph Extension A */
- [0x3f78, 0x3f78], /* CJK Ideograph Extension A */
- [0x3f79, 0x3f79], /* CJK Ideograph Extension A */
- [0x3f7a, 0x3f7a], /* CJK Ideograph Extension A */
- [0x3f7b, 0x3f7b], /* CJK Ideograph Extension A */
- [0x3f7c, 0x3f7c], /* CJK Ideograph Extension A */
- [0x3f7d, 0x3f7d], /* CJK Ideograph Extension A */
- [0x3f7e, 0x3f7e], /* CJK Ideograph Extension A */
- [0x3f7f, 0x3f7f], /* CJK Ideograph Extension A */
- [0x3f80, 0x3f80], /* CJK Ideograph Extension A */
- [0x3f81, 0x3f81], /* CJK Ideograph Extension A */
- [0x3f82, 0x3f82], /* CJK Ideograph Extension A */
- [0x3f83, 0x3f83], /* CJK Ideograph Extension A */
- [0x3f84, 0x3f84], /* CJK Ideograph Extension A */
- [0x3f85, 0x3f85], /* CJK Ideograph Extension A */
- [0x3f86, 0x3f86], /* CJK Ideograph Extension A */
- [0x3f87, 0x3f87], /* CJK Ideograph Extension A */
- [0x3f88, 0x3f88], /* CJK Ideograph Extension A */
- [0x3f89, 0x3f89], /* CJK Ideograph Extension A */
- [0x3f8a, 0x3f8a], /* CJK Ideograph Extension A */
- [0x3f8b, 0x3f8b], /* CJK Ideograph Extension A */
- [0x3f8c, 0x3f8c], /* CJK Ideograph Extension A */
- [0x3f8d, 0x3f8d], /* CJK Ideograph Extension A */
- [0x3f8e, 0x3f8e], /* CJK Ideograph Extension A */
- [0x3f8f, 0x3f8f], /* CJK Ideograph Extension A */
- [0x3f90, 0x3f90], /* CJK Ideograph Extension A */
- [0x3f91, 0x3f91], /* CJK Ideograph Extension A */
- [0x3f92, 0x3f92], /* CJK Ideograph Extension A */
- [0x3f93, 0x3f93], /* CJK Ideograph Extension A */
- [0x3f94, 0x3f94], /* CJK Ideograph Extension A */
- [0x3f95, 0x3f95], /* CJK Ideograph Extension A */
- [0x3f96, 0x3f96], /* CJK Ideograph Extension A */
- [0x3f97, 0x3f97], /* CJK Ideograph Extension A */
- [0x3f98, 0x3f98], /* CJK Ideograph Extension A */
- [0x3f99, 0x3f99], /* CJK Ideograph Extension A */
- [0x3f9a, 0x3f9a], /* CJK Ideograph Extension A */
- [0x3f9b, 0x3f9b], /* CJK Ideograph Extension A */
- [0x3f9c, 0x3f9c], /* CJK Ideograph Extension A */
- [0x3f9d, 0x3f9d], /* CJK Ideograph Extension A */
- [0x3f9e, 0x3f9e], /* CJK Ideograph Extension A */
- [0x3f9f, 0x3f9f], /* CJK Ideograph Extension A */
- [0x3fa0, 0x3fa0], /* CJK Ideograph Extension A */
- [0x3fa1, 0x3fa1], /* CJK Ideograph Extension A */
- [0x3fa2, 0x3fa2], /* CJK Ideograph Extension A */
- [0x3fa3, 0x3fa3], /* CJK Ideograph Extension A */
- [0x3fa4, 0x3fa4], /* CJK Ideograph Extension A */
- [0x3fa5, 0x3fa5], /* CJK Ideograph Extension A */
- [0x3fa6, 0x3fa6], /* CJK Ideograph Extension A */
- [0x3fa7, 0x3fa7], /* CJK Ideograph Extension A */
- [0x3fa8, 0x3fa8], /* CJK Ideograph Extension A */
- [0x3fa9, 0x3fa9], /* CJK Ideograph Extension A */
- [0x3faa, 0x3faa], /* CJK Ideograph Extension A */
- [0x3fab, 0x3fab], /* CJK Ideograph Extension A */
- [0x3fac, 0x3fac], /* CJK Ideograph Extension A */
- [0x3fad, 0x3fad], /* CJK Ideograph Extension A */
- [0x3fae, 0x3fae], /* CJK Ideograph Extension A */
- [0x3faf, 0x3faf], /* CJK Ideograph Extension A */
- [0x3fb0, 0x3fb0], /* CJK Ideograph Extension A */
- [0x3fb1, 0x3fb1], /* CJK Ideograph Extension A */
- [0x3fb2, 0x3fb2], /* CJK Ideograph Extension A */
- [0x3fb3, 0x3fb3], /* CJK Ideograph Extension A */
- [0x3fb4, 0x3fb4], /* CJK Ideograph Extension A */
- [0x3fb5, 0x3fb5], /* CJK Ideograph Extension A */
- [0x3fb6, 0x3fb6], /* CJK Ideograph Extension A */
- [0x3fb7, 0x3fb7], /* CJK Ideograph Extension A */
- [0x3fb8, 0x3fb8], /* CJK Ideograph Extension A */
- [0x3fb9, 0x3fb9], /* CJK Ideograph Extension A */
- [0x3fba, 0x3fba], /* CJK Ideograph Extension A */
- [0x3fbb, 0x3fbb], /* CJK Ideograph Extension A */
- [0x3fbc, 0x3fbc], /* CJK Ideograph Extension A */
- [0x3fbd, 0x3fbd], /* CJK Ideograph Extension A */
- [0x3fbe, 0x3fbe], /* CJK Ideograph Extension A */
- [0x3fbf, 0x3fbf], /* CJK Ideograph Extension A */
- [0x3fc0, 0x3fc0], /* CJK Ideograph Extension A */
- [0x3fc1, 0x3fc1], /* CJK Ideograph Extension A */
- [0x3fc2, 0x3fc2], /* CJK Ideograph Extension A */
- [0x3fc3, 0x3fc3], /* CJK Ideograph Extension A */
- [0x3fc4, 0x3fc4], /* CJK Ideograph Extension A */
- [0x3fc5, 0x3fc5], /* CJK Ideograph Extension A */
- [0x3fc6, 0x3fc6], /* CJK Ideograph Extension A */
- [0x3fc7, 0x3fc7], /* CJK Ideograph Extension A */
- [0x3fc8, 0x3fc8], /* CJK Ideograph Extension A */
- [0x3fc9, 0x3fc9], /* CJK Ideograph Extension A */
- [0x3fca, 0x3fca], /* CJK Ideograph Extension A */
- [0x3fcb, 0x3fcb], /* CJK Ideograph Extension A */
- [0x3fcc, 0x3fcc], /* CJK Ideograph Extension A */
- [0x3fcd, 0x3fcd], /* CJK Ideograph Extension A */
- [0x3fce, 0x3fce], /* CJK Ideograph Extension A */
- [0x3fcf, 0x3fcf], /* CJK Ideograph Extension A */
- [0x3fd0, 0x3fd0], /* CJK Ideograph Extension A */
- [0x3fd1, 0x3fd1], /* CJK Ideograph Extension A */
- [0x3fd2, 0x3fd2], /* CJK Ideograph Extension A */
- [0x3fd3, 0x3fd3], /* CJK Ideograph Extension A */
- [0x3fd4, 0x3fd4], /* CJK Ideograph Extension A */
- [0x3fd5, 0x3fd5], /* CJK Ideograph Extension A */
- [0x3fd6, 0x3fd6], /* CJK Ideograph Extension A */
- [0x3fd7, 0x3fd7], /* CJK Ideograph Extension A */
- [0x3fd8, 0x3fd8], /* CJK Ideograph Extension A */
- [0x3fd9, 0x3fd9], /* CJK Ideograph Extension A */
- [0x3fda, 0x3fda], /* CJK Ideograph Extension A */
- [0x3fdb, 0x3fdb], /* CJK Ideograph Extension A */
- [0x3fdc, 0x3fdc], /* CJK Ideograph Extension A */
- [0x3fdd, 0x3fdd], /* CJK Ideograph Extension A */
- [0x3fde, 0x3fde], /* CJK Ideograph Extension A */
- [0x3fdf, 0x3fdf], /* CJK Ideograph Extension A */
- [0x3fe0, 0x3fe0], /* CJK Ideograph Extension A */
- [0x3fe1, 0x3fe1], /* CJK Ideograph Extension A */
- [0x3fe2, 0x3fe2], /* CJK Ideograph Extension A */
- [0x3fe3, 0x3fe3], /* CJK Ideograph Extension A */
- [0x3fe4, 0x3fe4], /* CJK Ideograph Extension A */
- [0x3fe5, 0x3fe5], /* CJK Ideograph Extension A */
- [0x3fe6, 0x3fe6], /* CJK Ideograph Extension A */
- [0x3fe7, 0x3fe7], /* CJK Ideograph Extension A */
- [0x3fe8, 0x3fe8], /* CJK Ideograph Extension A */
- [0x3fe9, 0x3fe9], /* CJK Ideograph Extension A */
- [0x3fea, 0x3fea], /* CJK Ideograph Extension A */
- [0x3feb, 0x3feb], /* CJK Ideograph Extension A */
- [0x3fec, 0x3fec], /* CJK Ideograph Extension A */
- [0x3fed, 0x3fed], /* CJK Ideograph Extension A */
- [0x3fee, 0x3fee], /* CJK Ideograph Extension A */
- [0x3fef, 0x3fef], /* CJK Ideograph Extension A */
- [0x3ff0, 0x3ff0], /* CJK Ideograph Extension A */
- [0x3ff1, 0x3ff1], /* CJK Ideograph Extension A */
- [0x3ff2, 0x3ff2], /* CJK Ideograph Extension A */
- [0x3ff3, 0x3ff3], /* CJK Ideograph Extension A */
- [0x3ff4, 0x3ff4], /* CJK Ideograph Extension A */
- [0x3ff5, 0x3ff5], /* CJK Ideograph Extension A */
- [0x3ff6, 0x3ff6], /* CJK Ideograph Extension A */
- [0x3ff7, 0x3ff7], /* CJK Ideograph Extension A */
- [0x3ff8, 0x3ff8], /* CJK Ideograph Extension A */
- [0x3ff9, 0x3ff9], /* CJK Ideograph Extension A */
- [0x3ffa, 0x3ffa], /* CJK Ideograph Extension A */
- [0x3ffb, 0x3ffb], /* CJK Ideograph Extension A */
- [0x3ffc, 0x3ffc], /* CJK Ideograph Extension A */
- [0x3ffd, 0x3ffd], /* CJK Ideograph Extension A */
- [0x3ffe, 0x3ffe], /* CJK Ideograph Extension A */
- [0x3fff, 0x3fff], /* CJK Ideograph Extension A */
- [0x4000, 0x4000], /* CJK Ideograph Extension A */
- [0x4001, 0x4001], /* CJK Ideograph Extension A */
- [0x4002, 0x4002], /* CJK Ideograph Extension A */
- [0x4003, 0x4003], /* CJK Ideograph Extension A */
- [0x4004, 0x4004], /* CJK Ideograph Extension A */
- [0x4005, 0x4005], /* CJK Ideograph Extension A */
- [0x4006, 0x4006], /* CJK Ideograph Extension A */
- [0x4007, 0x4007], /* CJK Ideograph Extension A */
- [0x4008, 0x4008], /* CJK Ideograph Extension A */
- [0x4009, 0x4009], /* CJK Ideograph Extension A */
- [0x400a, 0x400a], /* CJK Ideograph Extension A */
- [0x400b, 0x400b], /* CJK Ideograph Extension A */
- [0x400c, 0x400c], /* CJK Ideograph Extension A */
- [0x400d, 0x400d], /* CJK Ideograph Extension A */
- [0x400e, 0x400e], /* CJK Ideograph Extension A */
- [0x400f, 0x400f], /* CJK Ideograph Extension A */
- [0x4010, 0x4010], /* CJK Ideograph Extension A */
- [0x4011, 0x4011], /* CJK Ideograph Extension A */
- [0x4012, 0x4012], /* CJK Ideograph Extension A */
- [0x4013, 0x4013], /* CJK Ideograph Extension A */
- [0x4014, 0x4014], /* CJK Ideograph Extension A */
- [0x4015, 0x4015], /* CJK Ideograph Extension A */
- [0x4016, 0x4016], /* CJK Ideograph Extension A */
- [0x4017, 0x4017], /* CJK Ideograph Extension A */
- [0x4018, 0x4018], /* CJK Ideograph Extension A */
- [0x4019, 0x4019], /* CJK Ideograph Extension A */
- [0x401a, 0x401a], /* CJK Ideograph Extension A */
- [0x401b, 0x401b], /* CJK Ideograph Extension A */
- [0x401c, 0x401c], /* CJK Ideograph Extension A */
- [0x401d, 0x401d], /* CJK Ideograph Extension A */
- [0x401e, 0x401e], /* CJK Ideograph Extension A */
- [0x401f, 0x401f], /* CJK Ideograph Extension A */
- [0x4020, 0x4020], /* CJK Ideograph Extension A */
- [0x4021, 0x4021], /* CJK Ideograph Extension A */
- [0x4022, 0x4022], /* CJK Ideograph Extension A */
- [0x4023, 0x4023], /* CJK Ideograph Extension A */
- [0x4024, 0x4024], /* CJK Ideograph Extension A */
- [0x4025, 0x4025], /* CJK Ideograph Extension A */
- [0x4026, 0x4026], /* CJK Ideograph Extension A */
- [0x4027, 0x4027], /* CJK Ideograph Extension A */
- [0x4028, 0x4028], /* CJK Ideograph Extension A */
- [0x4029, 0x4029], /* CJK Ideograph Extension A */
- [0x402a, 0x402a], /* CJK Ideograph Extension A */
- [0x402b, 0x402b], /* CJK Ideograph Extension A */
- [0x402c, 0x402c], /* CJK Ideograph Extension A */
- [0x402d, 0x402d], /* CJK Ideograph Extension A */
- [0x402e, 0x402e], /* CJK Ideograph Extension A */
- [0x402f, 0x402f], /* CJK Ideograph Extension A */
- [0x4030, 0x4030], /* CJK Ideograph Extension A */
- [0x4031, 0x4031], /* CJK Ideograph Extension A */
- [0x4032, 0x4032], /* CJK Ideograph Extension A */
- [0x4033, 0x4033], /* CJK Ideograph Extension A */
- [0x4034, 0x4034], /* CJK Ideograph Extension A */
- [0x4035, 0x4035], /* CJK Ideograph Extension A */
- [0x4036, 0x4036], /* CJK Ideograph Extension A */
- [0x4037, 0x4037], /* CJK Ideograph Extension A */
- [0x4038, 0x4038], /* CJK Ideograph Extension A */
- [0x4039, 0x4039], /* CJK Ideograph Extension A */
- [0x403a, 0x403a], /* CJK Ideograph Extension A */
- [0x403b, 0x403b], /* CJK Ideograph Extension A */
- [0x403c, 0x403c], /* CJK Ideograph Extension A */
- [0x403d, 0x403d], /* CJK Ideograph Extension A */
- [0x403e, 0x403e], /* CJK Ideograph Extension A */
- [0x403f, 0x403f], /* CJK Ideograph Extension A */
- [0x4040, 0x4040], /* CJK Ideograph Extension A */
- [0x4041, 0x4041], /* CJK Ideograph Extension A */
- [0x4042, 0x4042], /* CJK Ideograph Extension A */
- [0x4043, 0x4043], /* CJK Ideograph Extension A */
- [0x4044, 0x4044], /* CJK Ideograph Extension A */
- [0x4045, 0x4045], /* CJK Ideograph Extension A */
- [0x4046, 0x4046], /* CJK Ideograph Extension A */
- [0x4047, 0x4047], /* CJK Ideograph Extension A */
- [0x4048, 0x4048], /* CJK Ideograph Extension A */
- [0x4049, 0x4049], /* CJK Ideograph Extension A */
- [0x404a, 0x404a], /* CJK Ideograph Extension A */
- [0x404b, 0x404b], /* CJK Ideograph Extension A */
- [0x404c, 0x404c], /* CJK Ideograph Extension A */
- [0x404d, 0x404d], /* CJK Ideograph Extension A */
- [0x404e, 0x404e], /* CJK Ideograph Extension A */
- [0x404f, 0x404f], /* CJK Ideograph Extension A */
- [0x4050, 0x4050], /* CJK Ideograph Extension A */
- [0x4051, 0x4051], /* CJK Ideograph Extension A */
- [0x4052, 0x4052], /* CJK Ideograph Extension A */
- [0x4053, 0x4053], /* CJK Ideograph Extension A */
- [0x4054, 0x4054], /* CJK Ideograph Extension A */
- [0x4055, 0x4055], /* CJK Ideograph Extension A */
- [0x4056, 0x4056], /* CJK Ideograph Extension A */
- [0x4057, 0x4057], /* CJK Ideograph Extension A */
- [0x4058, 0x4058], /* CJK Ideograph Extension A */
- [0x4059, 0x4059], /* CJK Ideograph Extension A */
- [0x405a, 0x405a], /* CJK Ideograph Extension A */
- [0x405b, 0x405b], /* CJK Ideograph Extension A */
- [0x405c, 0x405c], /* CJK Ideograph Extension A */
- [0x405d, 0x405d], /* CJK Ideograph Extension A */
- [0x405e, 0x405e], /* CJK Ideograph Extension A */
- [0x405f, 0x405f], /* CJK Ideograph Extension A */
- [0x4060, 0x4060], /* CJK Ideograph Extension A */
- [0x4061, 0x4061], /* CJK Ideograph Extension A */
- [0x4062, 0x4062], /* CJK Ideograph Extension A */
- [0x4063, 0x4063], /* CJK Ideograph Extension A */
- [0x4064, 0x4064], /* CJK Ideograph Extension A */
- [0x4065, 0x4065], /* CJK Ideograph Extension A */
- [0x4066, 0x4066], /* CJK Ideograph Extension A */
- [0x4067, 0x4067], /* CJK Ideograph Extension A */
- [0x4068, 0x4068], /* CJK Ideograph Extension A */
- [0x4069, 0x4069], /* CJK Ideograph Extension A */
- [0x406a, 0x406a], /* CJK Ideograph Extension A */
- [0x406b, 0x406b], /* CJK Ideograph Extension A */
- [0x406c, 0x406c], /* CJK Ideograph Extension A */
- [0x406d, 0x406d], /* CJK Ideograph Extension A */
- [0x406e, 0x406e], /* CJK Ideograph Extension A */
- [0x406f, 0x406f], /* CJK Ideograph Extension A */
- [0x4070, 0x4070], /* CJK Ideograph Extension A */
- [0x4071, 0x4071], /* CJK Ideograph Extension A */
- [0x4072, 0x4072], /* CJK Ideograph Extension A */
- [0x4073, 0x4073], /* CJK Ideograph Extension A */
- [0x4074, 0x4074], /* CJK Ideograph Extension A */
- [0x4075, 0x4075], /* CJK Ideograph Extension A */
- [0x4076, 0x4076], /* CJK Ideograph Extension A */
- [0x4077, 0x4077], /* CJK Ideograph Extension A */
- [0x4078, 0x4078], /* CJK Ideograph Extension A */
- [0x4079, 0x4079], /* CJK Ideograph Extension A */
- [0x407a, 0x407a], /* CJK Ideograph Extension A */
- [0x407b, 0x407b], /* CJK Ideograph Extension A */
- [0x407c, 0x407c], /* CJK Ideograph Extension A */
- [0x407d, 0x407d], /* CJK Ideograph Extension A */
- [0x407e, 0x407e], /* CJK Ideograph Extension A */
- [0x407f, 0x407f], /* CJK Ideograph Extension A */
- [0x4080, 0x4080], /* CJK Ideograph Extension A */
- [0x4081, 0x4081], /* CJK Ideograph Extension A */
- [0x4082, 0x4082], /* CJK Ideograph Extension A */
- [0x4083, 0x4083], /* CJK Ideograph Extension A */
- [0x4084, 0x4084], /* CJK Ideograph Extension A */
- [0x4085, 0x4085], /* CJK Ideograph Extension A */
- [0x4086, 0x4086], /* CJK Ideograph Extension A */
- [0x4087, 0x4087], /* CJK Ideograph Extension A */
- [0x4088, 0x4088], /* CJK Ideograph Extension A */
- [0x4089, 0x4089], /* CJK Ideograph Extension A */
- [0x408a, 0x408a], /* CJK Ideograph Extension A */
- [0x408b, 0x408b], /* CJK Ideograph Extension A */
- [0x408c, 0x408c], /* CJK Ideograph Extension A */
- [0x408d, 0x408d], /* CJK Ideograph Extension A */
- [0x408e, 0x408e], /* CJK Ideograph Extension A */
- [0x408f, 0x408f], /* CJK Ideograph Extension A */
- [0x4090, 0x4090], /* CJK Ideograph Extension A */
- [0x4091, 0x4091], /* CJK Ideograph Extension A */
- [0x4092, 0x4092], /* CJK Ideograph Extension A */
- [0x4093, 0x4093], /* CJK Ideograph Extension A */
- [0x4094, 0x4094], /* CJK Ideograph Extension A */
- [0x4095, 0x4095], /* CJK Ideograph Extension A */
- [0x4096, 0x4096], /* CJK Ideograph Extension A */
- [0x4097, 0x4097], /* CJK Ideograph Extension A */
- [0x4098, 0x4098], /* CJK Ideograph Extension A */
- [0x4099, 0x4099], /* CJK Ideograph Extension A */
- [0x409a, 0x409a], /* CJK Ideograph Extension A */
- [0x409b, 0x409b], /* CJK Ideograph Extension A */
- [0x409c, 0x409c], /* CJK Ideograph Extension A */
- [0x409d, 0x409d], /* CJK Ideograph Extension A */
- [0x409e, 0x409e], /* CJK Ideograph Extension A */
- [0x409f, 0x409f], /* CJK Ideograph Extension A */
- [0x40a0, 0x40a0], /* CJK Ideograph Extension A */
- [0x40a1, 0x40a1], /* CJK Ideograph Extension A */
- [0x40a2, 0x40a2], /* CJK Ideograph Extension A */
- [0x40a3, 0x40a3], /* CJK Ideograph Extension A */
- [0x40a4, 0x40a4], /* CJK Ideograph Extension A */
- [0x40a5, 0x40a5], /* CJK Ideograph Extension A */
- [0x40a6, 0x40a6], /* CJK Ideograph Extension A */
- [0x40a7, 0x40a7], /* CJK Ideograph Extension A */
- [0x40a8, 0x40a8], /* CJK Ideograph Extension A */
- [0x40a9, 0x40a9], /* CJK Ideograph Extension A */
- [0x40aa, 0x40aa], /* CJK Ideograph Extension A */
- [0x40ab, 0x40ab], /* CJK Ideograph Extension A */
- [0x40ac, 0x40ac], /* CJK Ideograph Extension A */
- [0x40ad, 0x40ad], /* CJK Ideograph Extension A */
- [0x40ae, 0x40ae], /* CJK Ideograph Extension A */
- [0x40af, 0x40af], /* CJK Ideograph Extension A */
- [0x40b0, 0x40b0], /* CJK Ideograph Extension A */
- [0x40b1, 0x40b1], /* CJK Ideograph Extension A */
- [0x40b2, 0x40b2], /* CJK Ideograph Extension A */
- [0x40b3, 0x40b3], /* CJK Ideograph Extension A */
- [0x40b4, 0x40b4], /* CJK Ideograph Extension A */
- [0x40b5, 0x40b5], /* CJK Ideograph Extension A */
- [0x40b6, 0x40b6], /* CJK Ideograph Extension A */
- [0x40b7, 0x40b7], /* CJK Ideograph Extension A */
- [0x40b8, 0x40b8], /* CJK Ideograph Extension A */
- [0x40b9, 0x40b9], /* CJK Ideograph Extension A */
- [0x40ba, 0x40ba], /* CJK Ideograph Extension A */
- [0x40bb, 0x40bb], /* CJK Ideograph Extension A */
- [0x40bc, 0x40bc], /* CJK Ideograph Extension A */
- [0x40bd, 0x40bd], /* CJK Ideograph Extension A */
- [0x40be, 0x40be], /* CJK Ideograph Extension A */
- [0x40bf, 0x40bf], /* CJK Ideograph Extension A */
- [0x40c0, 0x40c0], /* CJK Ideograph Extension A */
- [0x40c1, 0x40c1], /* CJK Ideograph Extension A */
- [0x40c2, 0x40c2], /* CJK Ideograph Extension A */
- [0x40c3, 0x40c3], /* CJK Ideograph Extension A */
- [0x40c4, 0x40c4], /* CJK Ideograph Extension A */
- [0x40c5, 0x40c5], /* CJK Ideograph Extension A */
- [0x40c6, 0x40c6], /* CJK Ideograph Extension A */
- [0x40c7, 0x40c7], /* CJK Ideograph Extension A */
- [0x40c8, 0x40c8], /* CJK Ideograph Extension A */
- [0x40c9, 0x40c9], /* CJK Ideograph Extension A */
- [0x40ca, 0x40ca], /* CJK Ideograph Extension A */
- [0x40cb, 0x40cb], /* CJK Ideograph Extension A */
- [0x40cc, 0x40cc], /* CJK Ideograph Extension A */
- [0x40cd, 0x40cd], /* CJK Ideograph Extension A */
- [0x40ce, 0x40ce], /* CJK Ideograph Extension A */
- [0x40cf, 0x40cf], /* CJK Ideograph Extension A */
- [0x40d0, 0x40d0], /* CJK Ideograph Extension A */
- [0x40d1, 0x40d1], /* CJK Ideograph Extension A */
- [0x40d2, 0x40d2], /* CJK Ideograph Extension A */
- [0x40d3, 0x40d3], /* CJK Ideograph Extension A */
- [0x40d4, 0x40d4], /* CJK Ideograph Extension A */
- [0x40d5, 0x40d5], /* CJK Ideograph Extension A */
- [0x40d6, 0x40d6], /* CJK Ideograph Extension A */
- [0x40d7, 0x40d7], /* CJK Ideograph Extension A */
- [0x40d8, 0x40d8], /* CJK Ideograph Extension A */
- [0x40d9, 0x40d9], /* CJK Ideograph Extension A */
- [0x40da, 0x40da], /* CJK Ideograph Extension A */
- [0x40db, 0x40db], /* CJK Ideograph Extension A */
- [0x40dc, 0x40dc], /* CJK Ideograph Extension A */
- [0x40dd, 0x40dd], /* CJK Ideograph Extension A */
- [0x40de, 0x40de], /* CJK Ideograph Extension A */
- [0x40df, 0x40df], /* CJK Ideograph Extension A */
- [0x40e0, 0x40e0], /* CJK Ideograph Extension A */
- [0x40e1, 0x40e1], /* CJK Ideograph Extension A */
- [0x40e2, 0x40e2], /* CJK Ideograph Extension A */
- [0x40e3, 0x40e3], /* CJK Ideograph Extension A */
- [0x40e4, 0x40e4], /* CJK Ideograph Extension A */
- [0x40e5, 0x40e5], /* CJK Ideograph Extension A */
- [0x40e6, 0x40e6], /* CJK Ideograph Extension A */
- [0x40e7, 0x40e7], /* CJK Ideograph Extension A */
- [0x40e8, 0x40e8], /* CJK Ideograph Extension A */
- [0x40e9, 0x40e9], /* CJK Ideograph Extension A */
- [0x40ea, 0x40ea], /* CJK Ideograph Extension A */
- [0x40eb, 0x40eb], /* CJK Ideograph Extension A */
- [0x40ec, 0x40ec], /* CJK Ideograph Extension A */
- [0x40ed, 0x40ed], /* CJK Ideograph Extension A */
- [0x40ee, 0x40ee], /* CJK Ideograph Extension A */
- [0x40ef, 0x40ef], /* CJK Ideograph Extension A */
- [0x40f0, 0x40f0], /* CJK Ideograph Extension A */
- [0x40f1, 0x40f1], /* CJK Ideograph Extension A */
- [0x40f2, 0x40f2], /* CJK Ideograph Extension A */
- [0x40f3, 0x40f3], /* CJK Ideograph Extension A */
- [0x40f4, 0x40f4], /* CJK Ideograph Extension A */
- [0x40f5, 0x40f5], /* CJK Ideograph Extension A */
- [0x40f6, 0x40f6], /* CJK Ideograph Extension A */
- [0x40f7, 0x40f7], /* CJK Ideograph Extension A */
- [0x40f8, 0x40f8], /* CJK Ideograph Extension A */
- [0x40f9, 0x40f9], /* CJK Ideograph Extension A */
- [0x40fa, 0x40fa], /* CJK Ideograph Extension A */
- [0x40fb, 0x40fb], /* CJK Ideograph Extension A */
- [0x40fc, 0x40fc], /* CJK Ideograph Extension A */
- [0x40fd, 0x40fd], /* CJK Ideograph Extension A */
- [0x40fe, 0x40fe], /* CJK Ideograph Extension A */
- [0x40ff, 0x40ff], /* CJK Ideograph Extension A */
- [0x4100, 0x4100], /* CJK Ideograph Extension A */
- [0x4101, 0x4101], /* CJK Ideograph Extension A */
- [0x4102, 0x4102], /* CJK Ideograph Extension A */
- [0x4103, 0x4103], /* CJK Ideograph Extension A */
- [0x4104, 0x4104], /* CJK Ideograph Extension A */
- [0x4105, 0x4105], /* CJK Ideograph Extension A */
- [0x4106, 0x4106], /* CJK Ideograph Extension A */
- [0x4107, 0x4107], /* CJK Ideograph Extension A */
- [0x4108, 0x4108], /* CJK Ideograph Extension A */
- [0x4109, 0x4109], /* CJK Ideograph Extension A */
- [0x410a, 0x410a], /* CJK Ideograph Extension A */
- [0x410b, 0x410b], /* CJK Ideograph Extension A */
- [0x410c, 0x410c], /* CJK Ideograph Extension A */
- [0x410d, 0x410d], /* CJK Ideograph Extension A */
- [0x410e, 0x410e], /* CJK Ideograph Extension A */
- [0x410f, 0x410f], /* CJK Ideograph Extension A */
- [0x4110, 0x4110], /* CJK Ideograph Extension A */
- [0x4111, 0x4111], /* CJK Ideograph Extension A */
- [0x4112, 0x4112], /* CJK Ideograph Extension A */
- [0x4113, 0x4113], /* CJK Ideograph Extension A */
- [0x4114, 0x4114], /* CJK Ideograph Extension A */
- [0x4115, 0x4115], /* CJK Ideograph Extension A */
- [0x4116, 0x4116], /* CJK Ideograph Extension A */
- [0x4117, 0x4117], /* CJK Ideograph Extension A */
- [0x4118, 0x4118], /* CJK Ideograph Extension A */
- [0x4119, 0x4119], /* CJK Ideograph Extension A */
- [0x411a, 0x411a], /* CJK Ideograph Extension A */
- [0x411b, 0x411b], /* CJK Ideograph Extension A */
- [0x411c, 0x411c], /* CJK Ideograph Extension A */
- [0x411d, 0x411d], /* CJK Ideograph Extension A */
- [0x411e, 0x411e], /* CJK Ideograph Extension A */
- [0x411f, 0x411f], /* CJK Ideograph Extension A */
- [0x4120, 0x4120], /* CJK Ideograph Extension A */
- [0x4121, 0x4121], /* CJK Ideograph Extension A */
- [0x4122, 0x4122], /* CJK Ideograph Extension A */
- [0x4123, 0x4123], /* CJK Ideograph Extension A */
- [0x4124, 0x4124], /* CJK Ideograph Extension A */
- [0x4125, 0x4125], /* CJK Ideograph Extension A */
- [0x4126, 0x4126], /* CJK Ideograph Extension A */
- [0x4127, 0x4127], /* CJK Ideograph Extension A */
- [0x4128, 0x4128], /* CJK Ideograph Extension A */
- [0x4129, 0x4129], /* CJK Ideograph Extension A */
- [0x412a, 0x412a], /* CJK Ideograph Extension A */
- [0x412b, 0x412b], /* CJK Ideograph Extension A */
- [0x412c, 0x412c], /* CJK Ideograph Extension A */
- [0x412d, 0x412d], /* CJK Ideograph Extension A */
- [0x412e, 0x412e], /* CJK Ideograph Extension A */
- [0x412f, 0x412f], /* CJK Ideograph Extension A */
- [0x4130, 0x4130], /* CJK Ideograph Extension A */
- [0x4131, 0x4131], /* CJK Ideograph Extension A */
- [0x4132, 0x4132], /* CJK Ideograph Extension A */
- [0x4133, 0x4133], /* CJK Ideograph Extension A */
- [0x4134, 0x4134], /* CJK Ideograph Extension A */
- [0x4135, 0x4135], /* CJK Ideograph Extension A */
- [0x4136, 0x4136], /* CJK Ideograph Extension A */
- [0x4137, 0x4137], /* CJK Ideograph Extension A */
- [0x4138, 0x4138], /* CJK Ideograph Extension A */
- [0x4139, 0x4139], /* CJK Ideograph Extension A */
- [0x413a, 0x413a], /* CJK Ideograph Extension A */
- [0x413b, 0x413b], /* CJK Ideograph Extension A */
- [0x413c, 0x413c], /* CJK Ideograph Extension A */
- [0x413d, 0x413d], /* CJK Ideograph Extension A */
- [0x413e, 0x413e], /* CJK Ideograph Extension A */
- [0x413f, 0x413f], /* CJK Ideograph Extension A */
- [0x4140, 0x4140], /* CJK Ideograph Extension A */
- [0x4141, 0x4141], /* CJK Ideograph Extension A */
- [0x4142, 0x4142], /* CJK Ideograph Extension A */
- [0x4143, 0x4143], /* CJK Ideograph Extension A */
- [0x4144, 0x4144], /* CJK Ideograph Extension A */
- [0x4145, 0x4145], /* CJK Ideograph Extension A */
- [0x4146, 0x4146], /* CJK Ideograph Extension A */
- [0x4147, 0x4147], /* CJK Ideograph Extension A */
- [0x4148, 0x4148], /* CJK Ideograph Extension A */
- [0x4149, 0x4149], /* CJK Ideograph Extension A */
- [0x414a, 0x414a], /* CJK Ideograph Extension A */
- [0x414b, 0x414b], /* CJK Ideograph Extension A */
- [0x414c, 0x414c], /* CJK Ideograph Extension A */
- [0x414d, 0x414d], /* CJK Ideograph Extension A */
- [0x414e, 0x414e], /* CJK Ideograph Extension A */
- [0x414f, 0x414f], /* CJK Ideograph Extension A */
- [0x4150, 0x4150], /* CJK Ideograph Extension A */
- [0x4151, 0x4151], /* CJK Ideograph Extension A */
- [0x4152, 0x4152], /* CJK Ideograph Extension A */
- [0x4153, 0x4153], /* CJK Ideograph Extension A */
- [0x4154, 0x4154], /* CJK Ideograph Extension A */
- [0x4155, 0x4155], /* CJK Ideograph Extension A */
- [0x4156, 0x4156], /* CJK Ideograph Extension A */
- [0x4157, 0x4157], /* CJK Ideograph Extension A */
- [0x4158, 0x4158], /* CJK Ideograph Extension A */
- [0x4159, 0x4159], /* CJK Ideograph Extension A */
- [0x415a, 0x415a], /* CJK Ideograph Extension A */
- [0x415b, 0x415b], /* CJK Ideograph Extension A */
- [0x415c, 0x415c], /* CJK Ideograph Extension A */
- [0x415d, 0x415d], /* CJK Ideograph Extension A */
- [0x415e, 0x415e], /* CJK Ideograph Extension A */
- [0x415f, 0x415f], /* CJK Ideograph Extension A */
- [0x4160, 0x4160], /* CJK Ideograph Extension A */
- [0x4161, 0x4161], /* CJK Ideograph Extension A */
- [0x4162, 0x4162], /* CJK Ideograph Extension A */
- [0x4163, 0x4163], /* CJK Ideograph Extension A */
- [0x4164, 0x4164], /* CJK Ideograph Extension A */
- [0x4165, 0x4165], /* CJK Ideograph Extension A */
- [0x4166, 0x4166], /* CJK Ideograph Extension A */
- [0x4167, 0x4167], /* CJK Ideograph Extension A */
- [0x4168, 0x4168], /* CJK Ideograph Extension A */
- [0x4169, 0x4169], /* CJK Ideograph Extension A */
- [0x416a, 0x416a], /* CJK Ideograph Extension A */
- [0x416b, 0x416b], /* CJK Ideograph Extension A */
- [0x416c, 0x416c], /* CJK Ideograph Extension A */
- [0x416d, 0x416d], /* CJK Ideograph Extension A */
- [0x416e, 0x416e], /* CJK Ideograph Extension A */
- [0x416f, 0x416f], /* CJK Ideograph Extension A */
- [0x4170, 0x4170], /* CJK Ideograph Extension A */
- [0x4171, 0x4171], /* CJK Ideograph Extension A */
- [0x4172, 0x4172], /* CJK Ideograph Extension A */
- [0x4173, 0x4173], /* CJK Ideograph Extension A */
- [0x4174, 0x4174], /* CJK Ideograph Extension A */
- [0x4175, 0x4175], /* CJK Ideograph Extension A */
- [0x4176, 0x4176], /* CJK Ideograph Extension A */
- [0x4177, 0x4177], /* CJK Ideograph Extension A */
- [0x4178, 0x4178], /* CJK Ideograph Extension A */
- [0x4179, 0x4179], /* CJK Ideograph Extension A */
- [0x417a, 0x417a], /* CJK Ideograph Extension A */
- [0x417b, 0x417b], /* CJK Ideograph Extension A */
- [0x417c, 0x417c], /* CJK Ideograph Extension A */
- [0x417d, 0x417d], /* CJK Ideograph Extension A */
- [0x417e, 0x417e], /* CJK Ideograph Extension A */
- [0x417f, 0x417f], /* CJK Ideograph Extension A */
- [0x4180, 0x4180], /* CJK Ideograph Extension A */
- [0x4181, 0x4181], /* CJK Ideograph Extension A */
- [0x4182, 0x4182], /* CJK Ideograph Extension A */
- [0x4183, 0x4183], /* CJK Ideograph Extension A */
- [0x4184, 0x4184], /* CJK Ideograph Extension A */
- [0x4185, 0x4185], /* CJK Ideograph Extension A */
- [0x4186, 0x4186], /* CJK Ideograph Extension A */
- [0x4187, 0x4187], /* CJK Ideograph Extension A */
- [0x4188, 0x4188], /* CJK Ideograph Extension A */
- [0x4189, 0x4189], /* CJK Ideograph Extension A */
- [0x418a, 0x418a], /* CJK Ideograph Extension A */
- [0x418b, 0x418b], /* CJK Ideograph Extension A */
- [0x418c, 0x418c], /* CJK Ideograph Extension A */
- [0x418d, 0x418d], /* CJK Ideograph Extension A */
- [0x418e, 0x418e], /* CJK Ideograph Extension A */
- [0x418f, 0x418f], /* CJK Ideograph Extension A */
- [0x4190, 0x4190], /* CJK Ideograph Extension A */
- [0x4191, 0x4191], /* CJK Ideograph Extension A */
- [0x4192, 0x4192], /* CJK Ideograph Extension A */
- [0x4193, 0x4193], /* CJK Ideograph Extension A */
- [0x4194, 0x4194], /* CJK Ideograph Extension A */
- [0x4195, 0x4195], /* CJK Ideograph Extension A */
- [0x4196, 0x4196], /* CJK Ideograph Extension A */
- [0x4197, 0x4197], /* CJK Ideograph Extension A */
- [0x4198, 0x4198], /* CJK Ideograph Extension A */
- [0x4199, 0x4199], /* CJK Ideograph Extension A */
- [0x419a, 0x419a], /* CJK Ideograph Extension A */
- [0x419b, 0x419b], /* CJK Ideograph Extension A */
- [0x419c, 0x419c], /* CJK Ideograph Extension A */
- [0x419d, 0x419d], /* CJK Ideograph Extension A */
- [0x419e, 0x419e], /* CJK Ideograph Extension A */
- [0x419f, 0x419f], /* CJK Ideograph Extension A */
- [0x41a0, 0x41a0], /* CJK Ideograph Extension A */
- [0x41a1, 0x41a1], /* CJK Ideograph Extension A */
- [0x41a2, 0x41a2], /* CJK Ideograph Extension A */
- [0x41a3, 0x41a3], /* CJK Ideograph Extension A */
- [0x41a4, 0x41a4], /* CJK Ideograph Extension A */
- [0x41a5, 0x41a5], /* CJK Ideograph Extension A */
- [0x41a6, 0x41a6], /* CJK Ideograph Extension A */
- [0x41a7, 0x41a7], /* CJK Ideograph Extension A */
- [0x41a8, 0x41a8], /* CJK Ideograph Extension A */
- [0x41a9, 0x41a9], /* CJK Ideograph Extension A */
- [0x41aa, 0x41aa], /* CJK Ideograph Extension A */
- [0x41ab, 0x41ab], /* CJK Ideograph Extension A */
- [0x41ac, 0x41ac], /* CJK Ideograph Extension A */
- [0x41ad, 0x41ad], /* CJK Ideograph Extension A */
- [0x41ae, 0x41ae], /* CJK Ideograph Extension A */
- [0x41af, 0x41af], /* CJK Ideograph Extension A */
- [0x41b0, 0x41b0], /* CJK Ideograph Extension A */
- [0x41b1, 0x41b1], /* CJK Ideograph Extension A */
- [0x41b2, 0x41b2], /* CJK Ideograph Extension A */
- [0x41b3, 0x41b3], /* CJK Ideograph Extension A */
- [0x41b4, 0x41b4], /* CJK Ideograph Extension A */
- [0x41b5, 0x41b5], /* CJK Ideograph Extension A */
- [0x41b6, 0x41b6], /* CJK Ideograph Extension A */
- [0x41b7, 0x41b7], /* CJK Ideograph Extension A */
- [0x41b8, 0x41b8], /* CJK Ideograph Extension A */
- [0x41b9, 0x41b9], /* CJK Ideograph Extension A */
- [0x41ba, 0x41ba], /* CJK Ideograph Extension A */
- [0x41bb, 0x41bb], /* CJK Ideograph Extension A */
- [0x41bc, 0x41bc], /* CJK Ideograph Extension A */
- [0x41bd, 0x41bd], /* CJK Ideograph Extension A */
- [0x41be, 0x41be], /* CJK Ideograph Extension A */
- [0x41bf, 0x41bf], /* CJK Ideograph Extension A */
- [0x41c0, 0x41c0], /* CJK Ideograph Extension A */
- [0x41c1, 0x41c1], /* CJK Ideograph Extension A */
- [0x41c2, 0x41c2], /* CJK Ideograph Extension A */
- [0x41c3, 0x41c3], /* CJK Ideograph Extension A */
- [0x41c4, 0x41c4], /* CJK Ideograph Extension A */
- [0x41c5, 0x41c5], /* CJK Ideograph Extension A */
- [0x41c6, 0x41c6], /* CJK Ideograph Extension A */
- [0x41c7, 0x41c7], /* CJK Ideograph Extension A */
- [0x41c8, 0x41c8], /* CJK Ideograph Extension A */
- [0x41c9, 0x41c9], /* CJK Ideograph Extension A */
- [0x41ca, 0x41ca], /* CJK Ideograph Extension A */
- [0x41cb, 0x41cb], /* CJK Ideograph Extension A */
- [0x41cc, 0x41cc], /* CJK Ideograph Extension A */
- [0x41cd, 0x41cd], /* CJK Ideograph Extension A */
- [0x41ce, 0x41ce], /* CJK Ideograph Extension A */
- [0x41cf, 0x41cf], /* CJK Ideograph Extension A */
- [0x41d0, 0x41d0], /* CJK Ideograph Extension A */
- [0x41d1, 0x41d1], /* CJK Ideograph Extension A */
- [0x41d2, 0x41d2], /* CJK Ideograph Extension A */
- [0x41d3, 0x41d3], /* CJK Ideograph Extension A */
- [0x41d4, 0x41d4], /* CJK Ideograph Extension A */
- [0x41d5, 0x41d5], /* CJK Ideograph Extension A */
- [0x41d6, 0x41d6], /* CJK Ideograph Extension A */
- [0x41d7, 0x41d7], /* CJK Ideograph Extension A */
- [0x41d8, 0x41d8], /* CJK Ideograph Extension A */
- [0x41d9, 0x41d9], /* CJK Ideograph Extension A */
- [0x41da, 0x41da], /* CJK Ideograph Extension A */
- [0x41db, 0x41db], /* CJK Ideograph Extension A */
- [0x41dc, 0x41dc], /* CJK Ideograph Extension A */
- [0x41dd, 0x41dd], /* CJK Ideograph Extension A */
- [0x41de, 0x41de], /* CJK Ideograph Extension A */
- [0x41df, 0x41df], /* CJK Ideograph Extension A */
- [0x41e0, 0x41e0], /* CJK Ideograph Extension A */
- [0x41e1, 0x41e1], /* CJK Ideograph Extension A */
- [0x41e2, 0x41e2], /* CJK Ideograph Extension A */
- [0x41e3, 0x41e3], /* CJK Ideograph Extension A */
- [0x41e4, 0x41e4], /* CJK Ideograph Extension A */
- [0x41e5, 0x41e5], /* CJK Ideograph Extension A */
- [0x41e6, 0x41e6], /* CJK Ideograph Extension A */
- [0x41e7, 0x41e7], /* CJK Ideograph Extension A */
- [0x41e8, 0x41e8], /* CJK Ideograph Extension A */
- [0x41e9, 0x41e9], /* CJK Ideograph Extension A */
- [0x41ea, 0x41ea], /* CJK Ideograph Extension A */
- [0x41eb, 0x41eb], /* CJK Ideograph Extension A */
- [0x41ec, 0x41ec], /* CJK Ideograph Extension A */
- [0x41ed, 0x41ed], /* CJK Ideograph Extension A */
- [0x41ee, 0x41ee], /* CJK Ideograph Extension A */
- [0x41ef, 0x41ef], /* CJK Ideograph Extension A */
- [0x41f0, 0x41f0], /* CJK Ideograph Extension A */
- [0x41f1, 0x41f1], /* CJK Ideograph Extension A */
- [0x41f2, 0x41f2], /* CJK Ideograph Extension A */
- [0x41f3, 0x41f3], /* CJK Ideograph Extension A */
- [0x41f4, 0x41f4], /* CJK Ideograph Extension A */
- [0x41f5, 0x41f5], /* CJK Ideograph Extension A */
- [0x41f6, 0x41f6], /* CJK Ideograph Extension A */
- [0x41f7, 0x41f7], /* CJK Ideograph Extension A */
- [0x41f8, 0x41f8], /* CJK Ideograph Extension A */
- [0x41f9, 0x41f9], /* CJK Ideograph Extension A */
- [0x41fa, 0x41fa], /* CJK Ideograph Extension A */
- [0x41fb, 0x41fb], /* CJK Ideograph Extension A */
- [0x41fc, 0x41fc], /* CJK Ideograph Extension A */
- [0x41fd, 0x41fd], /* CJK Ideograph Extension A */
- [0x41fe, 0x41fe], /* CJK Ideograph Extension A */
- [0x41ff, 0x41ff], /* CJK Ideograph Extension A */
- [0x4200, 0x4200], /* CJK Ideograph Extension A */
- [0x4201, 0x4201], /* CJK Ideograph Extension A */
- [0x4202, 0x4202], /* CJK Ideograph Extension A */
- [0x4203, 0x4203], /* CJK Ideograph Extension A */
- [0x4204, 0x4204], /* CJK Ideograph Extension A */
- [0x4205, 0x4205], /* CJK Ideograph Extension A */
- [0x4206, 0x4206], /* CJK Ideograph Extension A */
- [0x4207, 0x4207], /* CJK Ideograph Extension A */
- [0x4208, 0x4208], /* CJK Ideograph Extension A */
- [0x4209, 0x4209], /* CJK Ideograph Extension A */
- [0x420a, 0x420a], /* CJK Ideograph Extension A */
- [0x420b, 0x420b], /* CJK Ideograph Extension A */
- [0x420c, 0x420c], /* CJK Ideograph Extension A */
- [0x420d, 0x420d], /* CJK Ideograph Extension A */
- [0x420e, 0x420e], /* CJK Ideograph Extension A */
- [0x420f, 0x420f], /* CJK Ideograph Extension A */
- [0x4210, 0x4210], /* CJK Ideograph Extension A */
- [0x4211, 0x4211], /* CJK Ideograph Extension A */
- [0x4212, 0x4212], /* CJK Ideograph Extension A */
- [0x4213, 0x4213], /* CJK Ideograph Extension A */
- [0x4214, 0x4214], /* CJK Ideograph Extension A */
- [0x4215, 0x4215], /* CJK Ideograph Extension A */
- [0x4216, 0x4216], /* CJK Ideograph Extension A */
- [0x4217, 0x4217], /* CJK Ideograph Extension A */
- [0x4218, 0x4218], /* CJK Ideograph Extension A */
- [0x4219, 0x4219], /* CJK Ideograph Extension A */
- [0x421a, 0x421a], /* CJK Ideograph Extension A */
- [0x421b, 0x421b], /* CJK Ideograph Extension A */
- [0x421c, 0x421c], /* CJK Ideograph Extension A */
- [0x421d, 0x421d], /* CJK Ideograph Extension A */
- [0x421e, 0x421e], /* CJK Ideograph Extension A */
- [0x421f, 0x421f], /* CJK Ideograph Extension A */
- [0x4220, 0x4220], /* CJK Ideograph Extension A */
- [0x4221, 0x4221], /* CJK Ideograph Extension A */
- [0x4222, 0x4222], /* CJK Ideograph Extension A */
- [0x4223, 0x4223], /* CJK Ideograph Extension A */
- [0x4224, 0x4224], /* CJK Ideograph Extension A */
- [0x4225, 0x4225], /* CJK Ideograph Extension A */
- [0x4226, 0x4226], /* CJK Ideograph Extension A */
- [0x4227, 0x4227], /* CJK Ideograph Extension A */
- [0x4228, 0x4228], /* CJK Ideograph Extension A */
- [0x4229, 0x4229], /* CJK Ideograph Extension A */
- [0x422a, 0x422a], /* CJK Ideograph Extension A */
- [0x422b, 0x422b], /* CJK Ideograph Extension A */
- [0x422c, 0x422c], /* CJK Ideograph Extension A */
- [0x422d, 0x422d], /* CJK Ideograph Extension A */
- [0x422e, 0x422e], /* CJK Ideograph Extension A */
- [0x422f, 0x422f], /* CJK Ideograph Extension A */
- [0x4230, 0x4230], /* CJK Ideograph Extension A */
- [0x4231, 0x4231], /* CJK Ideograph Extension A */
- [0x4232, 0x4232], /* CJK Ideograph Extension A */
- [0x4233, 0x4233], /* CJK Ideograph Extension A */
- [0x4234, 0x4234], /* CJK Ideograph Extension A */
- [0x4235, 0x4235], /* CJK Ideograph Extension A */
- [0x4236, 0x4236], /* CJK Ideograph Extension A */
- [0x4237, 0x4237], /* CJK Ideograph Extension A */
- [0x4238, 0x4238], /* CJK Ideograph Extension A */
- [0x4239, 0x4239], /* CJK Ideograph Extension A */
- [0x423a, 0x423a], /* CJK Ideograph Extension A */
- [0x423b, 0x423b], /* CJK Ideograph Extension A */
- [0x423c, 0x423c], /* CJK Ideograph Extension A */
- [0x423d, 0x423d], /* CJK Ideograph Extension A */
- [0x423e, 0x423e], /* CJK Ideograph Extension A */
- [0x423f, 0x423f], /* CJK Ideograph Extension A */
- [0x4240, 0x4240], /* CJK Ideograph Extension A */
- [0x4241, 0x4241], /* CJK Ideograph Extension A */
- [0x4242, 0x4242], /* CJK Ideograph Extension A */
- [0x4243, 0x4243], /* CJK Ideograph Extension A */
- [0x4244, 0x4244], /* CJK Ideograph Extension A */
- [0x4245, 0x4245], /* CJK Ideograph Extension A */
- [0x4246, 0x4246], /* CJK Ideograph Extension A */
- [0x4247, 0x4247], /* CJK Ideograph Extension A */
- [0x4248, 0x4248], /* CJK Ideograph Extension A */
- [0x4249, 0x4249], /* CJK Ideograph Extension A */
- [0x424a, 0x424a], /* CJK Ideograph Extension A */
- [0x424b, 0x424b], /* CJK Ideograph Extension A */
- [0x424c, 0x424c], /* CJK Ideograph Extension A */
- [0x424d, 0x424d], /* CJK Ideograph Extension A */
- [0x424e, 0x424e], /* CJK Ideograph Extension A */
- [0x424f, 0x424f], /* CJK Ideograph Extension A */
- [0x4250, 0x4250], /* CJK Ideograph Extension A */
- [0x4251, 0x4251], /* CJK Ideograph Extension A */
- [0x4252, 0x4252], /* CJK Ideograph Extension A */
- [0x4253, 0x4253], /* CJK Ideograph Extension A */
- [0x4254, 0x4254], /* CJK Ideograph Extension A */
- [0x4255, 0x4255], /* CJK Ideograph Extension A */
- [0x4256, 0x4256], /* CJK Ideograph Extension A */
- [0x4257, 0x4257], /* CJK Ideograph Extension A */
- [0x4258, 0x4258], /* CJK Ideograph Extension A */
- [0x4259, 0x4259], /* CJK Ideograph Extension A */
- [0x425a, 0x425a], /* CJK Ideograph Extension A */
- [0x425b, 0x425b], /* CJK Ideograph Extension A */
- [0x425c, 0x425c], /* CJK Ideograph Extension A */
- [0x425d, 0x425d], /* CJK Ideograph Extension A */
- [0x425e, 0x425e], /* CJK Ideograph Extension A */
- [0x425f, 0x425f], /* CJK Ideograph Extension A */
- [0x4260, 0x4260], /* CJK Ideograph Extension A */
- [0x4261, 0x4261], /* CJK Ideograph Extension A */
- [0x4262, 0x4262], /* CJK Ideograph Extension A */
- [0x4263, 0x4263], /* CJK Ideograph Extension A */
- [0x4264, 0x4264], /* CJK Ideograph Extension A */
- [0x4265, 0x4265], /* CJK Ideograph Extension A */
- [0x4266, 0x4266], /* CJK Ideograph Extension A */
- [0x4267, 0x4267], /* CJK Ideograph Extension A */
- [0x4268, 0x4268], /* CJK Ideograph Extension A */
- [0x4269, 0x4269], /* CJK Ideograph Extension A */
- [0x426a, 0x426a], /* CJK Ideograph Extension A */
- [0x426b, 0x426b], /* CJK Ideograph Extension A */
- [0x426c, 0x426c], /* CJK Ideograph Extension A */
- [0x426d, 0x426d], /* CJK Ideograph Extension A */
- [0x426e, 0x426e], /* CJK Ideograph Extension A */
- [0x426f, 0x426f], /* CJK Ideograph Extension A */
- [0x4270, 0x4270], /* CJK Ideograph Extension A */
- [0x4271, 0x4271], /* CJK Ideograph Extension A */
- [0x4272, 0x4272], /* CJK Ideograph Extension A */
- [0x4273, 0x4273], /* CJK Ideograph Extension A */
- [0x4274, 0x4274], /* CJK Ideograph Extension A */
- [0x4275, 0x4275], /* CJK Ideograph Extension A */
- [0x4276, 0x4276], /* CJK Ideograph Extension A */
- [0x4277, 0x4277], /* CJK Ideograph Extension A */
- [0x4278, 0x4278], /* CJK Ideograph Extension A */
- [0x4279, 0x4279], /* CJK Ideograph Extension A */
- [0x427a, 0x427a], /* CJK Ideograph Extension A */
- [0x427b, 0x427b], /* CJK Ideograph Extension A */
- [0x427c, 0x427c], /* CJK Ideograph Extension A */
- [0x427d, 0x427d], /* CJK Ideograph Extension A */
- [0x427e, 0x427e], /* CJK Ideograph Extension A */
- [0x427f, 0x427f], /* CJK Ideograph Extension A */
- [0x4280, 0x4280], /* CJK Ideograph Extension A */
- [0x4281, 0x4281], /* CJK Ideograph Extension A */
- [0x4282, 0x4282], /* CJK Ideograph Extension A */
- [0x4283, 0x4283], /* CJK Ideograph Extension A */
- [0x4284, 0x4284], /* CJK Ideograph Extension A */
- [0x4285, 0x4285], /* CJK Ideograph Extension A */
- [0x4286, 0x4286], /* CJK Ideograph Extension A */
- [0x4287, 0x4287], /* CJK Ideograph Extension A */
- [0x4288, 0x4288], /* CJK Ideograph Extension A */
- [0x4289, 0x4289], /* CJK Ideograph Extension A */
- [0x428a, 0x428a], /* CJK Ideograph Extension A */
- [0x428b, 0x428b], /* CJK Ideograph Extension A */
- [0x428c, 0x428c], /* CJK Ideograph Extension A */
- [0x428d, 0x428d], /* CJK Ideograph Extension A */
- [0x428e, 0x428e], /* CJK Ideograph Extension A */
- [0x428f, 0x428f], /* CJK Ideograph Extension A */
- [0x4290, 0x4290], /* CJK Ideograph Extension A */
- [0x4291, 0x4291], /* CJK Ideograph Extension A */
- [0x4292, 0x4292], /* CJK Ideograph Extension A */
- [0x4293, 0x4293], /* CJK Ideograph Extension A */
- [0x4294, 0x4294], /* CJK Ideograph Extension A */
- [0x4295, 0x4295], /* CJK Ideograph Extension A */
- [0x4296, 0x4296], /* CJK Ideograph Extension A */
- [0x4297, 0x4297], /* CJK Ideograph Extension A */
- [0x4298, 0x4298], /* CJK Ideograph Extension A */
- [0x4299, 0x4299], /* CJK Ideograph Extension A */
- [0x429a, 0x429a], /* CJK Ideograph Extension A */
- [0x429b, 0x429b], /* CJK Ideograph Extension A */
- [0x429c, 0x429c], /* CJK Ideograph Extension A */
- [0x429d, 0x429d], /* CJK Ideograph Extension A */
- [0x429e, 0x429e], /* CJK Ideograph Extension A */
- [0x429f, 0x429f], /* CJK Ideograph Extension A */
- [0x42a0, 0x42a0], /* CJK Ideograph Extension A */
- [0x42a1, 0x42a1], /* CJK Ideograph Extension A */
- [0x42a2, 0x42a2], /* CJK Ideograph Extension A */
- [0x42a3, 0x42a3], /* CJK Ideograph Extension A */
- [0x42a4, 0x42a4], /* CJK Ideograph Extension A */
- [0x42a5, 0x42a5], /* CJK Ideograph Extension A */
- [0x42a6, 0x42a6], /* CJK Ideograph Extension A */
- [0x42a7, 0x42a7], /* CJK Ideograph Extension A */
- [0x42a8, 0x42a8], /* CJK Ideograph Extension A */
- [0x42a9, 0x42a9], /* CJK Ideograph Extension A */
- [0x42aa, 0x42aa], /* CJK Ideograph Extension A */
- [0x42ab, 0x42ab], /* CJK Ideograph Extension A */
- [0x42ac, 0x42ac], /* CJK Ideograph Extension A */
- [0x42ad, 0x42ad], /* CJK Ideograph Extension A */
- [0x42ae, 0x42ae], /* CJK Ideograph Extension A */
- [0x42af, 0x42af], /* CJK Ideograph Extension A */
- [0x42b0, 0x42b0], /* CJK Ideograph Extension A */
- [0x42b1, 0x42b1], /* CJK Ideograph Extension A */
- [0x42b2, 0x42b2], /* CJK Ideograph Extension A */
- [0x42b3, 0x42b3], /* CJK Ideograph Extension A */
- [0x42b4, 0x42b4], /* CJK Ideograph Extension A */
- [0x42b5, 0x42b5], /* CJK Ideograph Extension A */
- [0x42b6, 0x42b6], /* CJK Ideograph Extension A */
- [0x42b7, 0x42b7], /* CJK Ideograph Extension A */
- [0x42b8, 0x42b8], /* CJK Ideograph Extension A */
- [0x42b9, 0x42b9], /* CJK Ideograph Extension A */
- [0x42ba, 0x42ba], /* CJK Ideograph Extension A */
- [0x42bb, 0x42bb], /* CJK Ideograph Extension A */
- [0x42bc, 0x42bc], /* CJK Ideograph Extension A */
- [0x42bd, 0x42bd], /* CJK Ideograph Extension A */
- [0x42be, 0x42be], /* CJK Ideograph Extension A */
- [0x42bf, 0x42bf], /* CJK Ideograph Extension A */
- [0x42c0, 0x42c0], /* CJK Ideograph Extension A */
- [0x42c1, 0x42c1], /* CJK Ideograph Extension A */
- [0x42c2, 0x42c2], /* CJK Ideograph Extension A */
- [0x42c3, 0x42c3], /* CJK Ideograph Extension A */
- [0x42c4, 0x42c4], /* CJK Ideograph Extension A */
- [0x42c5, 0x42c5], /* CJK Ideograph Extension A */
- [0x42c6, 0x42c6], /* CJK Ideograph Extension A */
- [0x42c7, 0x42c7], /* CJK Ideograph Extension A */
- [0x42c8, 0x42c8], /* CJK Ideograph Extension A */
- [0x42c9, 0x42c9], /* CJK Ideograph Extension A */
- [0x42ca, 0x42ca], /* CJK Ideograph Extension A */
- [0x42cb, 0x42cb], /* CJK Ideograph Extension A */
- [0x42cc, 0x42cc], /* CJK Ideograph Extension A */
- [0x42cd, 0x42cd], /* CJK Ideograph Extension A */
- [0x42ce, 0x42ce], /* CJK Ideograph Extension A */
- [0x42cf, 0x42cf], /* CJK Ideograph Extension A */
- [0x42d0, 0x42d0], /* CJK Ideograph Extension A */
- [0x42d1, 0x42d1], /* CJK Ideograph Extension A */
- [0x42d2, 0x42d2], /* CJK Ideograph Extension A */
- [0x42d3, 0x42d3], /* CJK Ideograph Extension A */
- [0x42d4, 0x42d4], /* CJK Ideograph Extension A */
- [0x42d5, 0x42d5], /* CJK Ideograph Extension A */
- [0x42d6, 0x42d6], /* CJK Ideograph Extension A */
- [0x42d7, 0x42d7], /* CJK Ideograph Extension A */
- [0x42d8, 0x42d8], /* CJK Ideograph Extension A */
- [0x42d9, 0x42d9], /* CJK Ideograph Extension A */
- [0x42da, 0x42da], /* CJK Ideograph Extension A */
- [0x42db, 0x42db], /* CJK Ideograph Extension A */
- [0x42dc, 0x42dc], /* CJK Ideograph Extension A */
- [0x42dd, 0x42dd], /* CJK Ideograph Extension A */
- [0x42de, 0x42de], /* CJK Ideograph Extension A */
- [0x42df, 0x42df], /* CJK Ideograph Extension A */
- [0x42e0, 0x42e0], /* CJK Ideograph Extension A */
- [0x42e1, 0x42e1], /* CJK Ideograph Extension A */
- [0x42e2, 0x42e2], /* CJK Ideograph Extension A */
- [0x42e3, 0x42e3], /* CJK Ideograph Extension A */
- [0x42e4, 0x42e4], /* CJK Ideograph Extension A */
- [0x42e5, 0x42e5], /* CJK Ideograph Extension A */
- [0x42e6, 0x42e6], /* CJK Ideograph Extension A */
- [0x42e7, 0x42e7], /* CJK Ideograph Extension A */
- [0x42e8, 0x42e8], /* CJK Ideograph Extension A */
- [0x42e9, 0x42e9], /* CJK Ideograph Extension A */
- [0x42ea, 0x42ea], /* CJK Ideograph Extension A */
- [0x42eb, 0x42eb], /* CJK Ideograph Extension A */
- [0x42ec, 0x42ec], /* CJK Ideograph Extension A */
- [0x42ed, 0x42ed], /* CJK Ideograph Extension A */
- [0x42ee, 0x42ee], /* CJK Ideograph Extension A */
- [0x42ef, 0x42ef], /* CJK Ideograph Extension A */
- [0x42f0, 0x42f0], /* CJK Ideograph Extension A */
- [0x42f1, 0x42f1], /* CJK Ideograph Extension A */
- [0x42f2, 0x42f2], /* CJK Ideograph Extension A */
- [0x42f3, 0x42f3], /* CJK Ideograph Extension A */
- [0x42f4, 0x42f4], /* CJK Ideograph Extension A */
- [0x42f5, 0x42f5], /* CJK Ideograph Extension A */
- [0x42f6, 0x42f6], /* CJK Ideograph Extension A */
- [0x42f7, 0x42f7], /* CJK Ideograph Extension A */
- [0x42f8, 0x42f8], /* CJK Ideograph Extension A */
- [0x42f9, 0x42f9], /* CJK Ideograph Extension A */
- [0x42fa, 0x42fa], /* CJK Ideograph Extension A */
- [0x42fb, 0x42fb], /* CJK Ideograph Extension A */
- [0x42fc, 0x42fc], /* CJK Ideograph Extension A */
- [0x42fd, 0x42fd], /* CJK Ideograph Extension A */
- [0x42fe, 0x42fe], /* CJK Ideograph Extension A */
- [0x42ff, 0x42ff], /* CJK Ideograph Extension A */
- [0x4300, 0x4300], /* CJK Ideograph Extension A */
- [0x4301, 0x4301], /* CJK Ideograph Extension A */
- [0x4302, 0x4302], /* CJK Ideograph Extension A */
- [0x4303, 0x4303], /* CJK Ideograph Extension A */
- [0x4304, 0x4304], /* CJK Ideograph Extension A */
- [0x4305, 0x4305], /* CJK Ideograph Extension A */
- [0x4306, 0x4306], /* CJK Ideograph Extension A */
- [0x4307, 0x4307], /* CJK Ideograph Extension A */
- [0x4308, 0x4308], /* CJK Ideograph Extension A */
- [0x4309, 0x4309], /* CJK Ideograph Extension A */
- [0x430a, 0x430a], /* CJK Ideograph Extension A */
- [0x430b, 0x430b], /* CJK Ideograph Extension A */
- [0x430c, 0x430c], /* CJK Ideograph Extension A */
- [0x430d, 0x430d], /* CJK Ideograph Extension A */
- [0x430e, 0x430e], /* CJK Ideograph Extension A */
- [0x430f, 0x430f], /* CJK Ideograph Extension A */
- [0x4310, 0x4310], /* CJK Ideograph Extension A */
- [0x4311, 0x4311], /* CJK Ideograph Extension A */
- [0x4312, 0x4312], /* CJK Ideograph Extension A */
- [0x4313, 0x4313], /* CJK Ideograph Extension A */
- [0x4314, 0x4314], /* CJK Ideograph Extension A */
- [0x4315, 0x4315], /* CJK Ideograph Extension A */
- [0x4316, 0x4316], /* CJK Ideograph Extension A */
- [0x4317, 0x4317], /* CJK Ideograph Extension A */
- [0x4318, 0x4318], /* CJK Ideograph Extension A */
- [0x4319, 0x4319], /* CJK Ideograph Extension A */
- [0x431a, 0x431a], /* CJK Ideograph Extension A */
- [0x431b, 0x431b], /* CJK Ideograph Extension A */
- [0x431c, 0x431c], /* CJK Ideograph Extension A */
- [0x431d, 0x431d], /* CJK Ideograph Extension A */
- [0x431e, 0x431e], /* CJK Ideograph Extension A */
- [0x431f, 0x431f], /* CJK Ideograph Extension A */
- [0x4320, 0x4320], /* CJK Ideograph Extension A */
- [0x4321, 0x4321], /* CJK Ideograph Extension A */
- [0x4322, 0x4322], /* CJK Ideograph Extension A */
- [0x4323, 0x4323], /* CJK Ideograph Extension A */
- [0x4324, 0x4324], /* CJK Ideograph Extension A */
- [0x4325, 0x4325], /* CJK Ideograph Extension A */
- [0x4326, 0x4326], /* CJK Ideograph Extension A */
- [0x4327, 0x4327], /* CJK Ideograph Extension A */
- [0x4328, 0x4328], /* CJK Ideograph Extension A */
- [0x4329, 0x4329], /* CJK Ideograph Extension A */
- [0x432a, 0x432a], /* CJK Ideograph Extension A */
- [0x432b, 0x432b], /* CJK Ideograph Extension A */
- [0x432c, 0x432c], /* CJK Ideograph Extension A */
- [0x432d, 0x432d], /* CJK Ideograph Extension A */
- [0x432e, 0x432e], /* CJK Ideograph Extension A */
- [0x432f, 0x432f], /* CJK Ideograph Extension A */
- [0x4330, 0x4330], /* CJK Ideograph Extension A */
- [0x4331, 0x4331], /* CJK Ideograph Extension A */
- [0x4332, 0x4332], /* CJK Ideograph Extension A */
- [0x4333, 0x4333], /* CJK Ideograph Extension A */
- [0x4334, 0x4334], /* CJK Ideograph Extension A */
- [0x4335, 0x4335], /* CJK Ideograph Extension A */
- [0x4336, 0x4336], /* CJK Ideograph Extension A */
- [0x4337, 0x4337], /* CJK Ideograph Extension A */
- [0x4338, 0x4338], /* CJK Ideograph Extension A */
- [0x4339, 0x4339], /* CJK Ideograph Extension A */
- [0x433a, 0x433a], /* CJK Ideograph Extension A */
- [0x433b, 0x433b], /* CJK Ideograph Extension A */
- [0x433c, 0x433c], /* CJK Ideograph Extension A */
- [0x433d, 0x433d], /* CJK Ideograph Extension A */
- [0x433e, 0x433e], /* CJK Ideograph Extension A */
- [0x433f, 0x433f], /* CJK Ideograph Extension A */
- [0x4340, 0x4340], /* CJK Ideograph Extension A */
- [0x4341, 0x4341], /* CJK Ideograph Extension A */
- [0x4342, 0x4342], /* CJK Ideograph Extension A */
- [0x4343, 0x4343], /* CJK Ideograph Extension A */
- [0x4344, 0x4344], /* CJK Ideograph Extension A */
- [0x4345, 0x4345], /* CJK Ideograph Extension A */
- [0x4346, 0x4346], /* CJK Ideograph Extension A */
- [0x4347, 0x4347], /* CJK Ideograph Extension A */
- [0x4348, 0x4348], /* CJK Ideograph Extension A */
- [0x4349, 0x4349], /* CJK Ideograph Extension A */
- [0x434a, 0x434a], /* CJK Ideograph Extension A */
- [0x434b, 0x434b], /* CJK Ideograph Extension A */
- [0x434c, 0x434c], /* CJK Ideograph Extension A */
- [0x434d, 0x434d], /* CJK Ideograph Extension A */
- [0x434e, 0x434e], /* CJK Ideograph Extension A */
- [0x434f, 0x434f], /* CJK Ideograph Extension A */
- [0x4350, 0x4350], /* CJK Ideograph Extension A */
- [0x4351, 0x4351], /* CJK Ideograph Extension A */
- [0x4352, 0x4352], /* CJK Ideograph Extension A */
- [0x4353, 0x4353], /* CJK Ideograph Extension A */
- [0x4354, 0x4354], /* CJK Ideograph Extension A */
- [0x4355, 0x4355], /* CJK Ideograph Extension A */
- [0x4356, 0x4356], /* CJK Ideograph Extension A */
- [0x4357, 0x4357], /* CJK Ideograph Extension A */
- [0x4358, 0x4358], /* CJK Ideograph Extension A */
- [0x4359, 0x4359], /* CJK Ideograph Extension A */
- [0x435a, 0x435a], /* CJK Ideograph Extension A */
- [0x435b, 0x435b], /* CJK Ideograph Extension A */
- [0x435c, 0x435c], /* CJK Ideograph Extension A */
- [0x435d, 0x435d], /* CJK Ideograph Extension A */
- [0x435e, 0x435e], /* CJK Ideograph Extension A */
- [0x435f, 0x435f], /* CJK Ideograph Extension A */
- [0x4360, 0x4360], /* CJK Ideograph Extension A */
- [0x4361, 0x4361], /* CJK Ideograph Extension A */
- [0x4362, 0x4362], /* CJK Ideograph Extension A */
- [0x4363, 0x4363], /* CJK Ideograph Extension A */
- [0x4364, 0x4364], /* CJK Ideograph Extension A */
- [0x4365, 0x4365], /* CJK Ideograph Extension A */
- [0x4366, 0x4366], /* CJK Ideograph Extension A */
- [0x4367, 0x4367], /* CJK Ideograph Extension A */
- [0x4368, 0x4368], /* CJK Ideograph Extension A */
- [0x4369, 0x4369], /* CJK Ideograph Extension A */
- [0x436a, 0x436a], /* CJK Ideograph Extension A */
- [0x436b, 0x436b], /* CJK Ideograph Extension A */
- [0x436c, 0x436c], /* CJK Ideograph Extension A */
- [0x436d, 0x436d], /* CJK Ideograph Extension A */
- [0x436e, 0x436e], /* CJK Ideograph Extension A */
- [0x436f, 0x436f], /* CJK Ideograph Extension A */
- [0x4370, 0x4370], /* CJK Ideograph Extension A */
- [0x4371, 0x4371], /* CJK Ideograph Extension A */
- [0x4372, 0x4372], /* CJK Ideograph Extension A */
- [0x4373, 0x4373], /* CJK Ideograph Extension A */
- [0x4374, 0x4374], /* CJK Ideograph Extension A */
- [0x4375, 0x4375], /* CJK Ideograph Extension A */
- [0x4376, 0x4376], /* CJK Ideograph Extension A */
- [0x4377, 0x4377], /* CJK Ideograph Extension A */
- [0x4378, 0x4378], /* CJK Ideograph Extension A */
- [0x4379, 0x4379], /* CJK Ideograph Extension A */
- [0x437a, 0x437a], /* CJK Ideograph Extension A */
- [0x437b, 0x437b], /* CJK Ideograph Extension A */
- [0x437c, 0x437c], /* CJK Ideograph Extension A */
- [0x437d, 0x437d], /* CJK Ideograph Extension A */
- [0x437e, 0x437e], /* CJK Ideograph Extension A */
- [0x437f, 0x437f], /* CJK Ideograph Extension A */
- [0x4380, 0x4380], /* CJK Ideograph Extension A */
- [0x4381, 0x4381], /* CJK Ideograph Extension A */
- [0x4382, 0x4382], /* CJK Ideograph Extension A */
- [0x4383, 0x4383], /* CJK Ideograph Extension A */
- [0x4384, 0x4384], /* CJK Ideograph Extension A */
- [0x4385, 0x4385], /* CJK Ideograph Extension A */
- [0x4386, 0x4386], /* CJK Ideograph Extension A */
- [0x4387, 0x4387], /* CJK Ideograph Extension A */
- [0x4388, 0x4388], /* CJK Ideograph Extension A */
- [0x4389, 0x4389], /* CJK Ideograph Extension A */
- [0x438a, 0x438a], /* CJK Ideograph Extension A */
- [0x438b, 0x438b], /* CJK Ideograph Extension A */
- [0x438c, 0x438c], /* CJK Ideograph Extension A */
- [0x438d, 0x438d], /* CJK Ideograph Extension A */
- [0x438e, 0x438e], /* CJK Ideograph Extension A */
- [0x438f, 0x438f], /* CJK Ideograph Extension A */
- [0x4390, 0x4390], /* CJK Ideograph Extension A */
- [0x4391, 0x4391], /* CJK Ideograph Extension A */
- [0x4392, 0x4392], /* CJK Ideograph Extension A */
- [0x4393, 0x4393], /* CJK Ideograph Extension A */
- [0x4394, 0x4394], /* CJK Ideograph Extension A */
- [0x4395, 0x4395], /* CJK Ideograph Extension A */
- [0x4396, 0x4396], /* CJK Ideograph Extension A */
- [0x4397, 0x4397], /* CJK Ideograph Extension A */
- [0x4398, 0x4398], /* CJK Ideograph Extension A */
- [0x4399, 0x4399], /* CJK Ideograph Extension A */
- [0x439a, 0x439a], /* CJK Ideograph Extension A */
- [0x439b, 0x439b], /* CJK Ideograph Extension A */
- [0x439c, 0x439c], /* CJK Ideograph Extension A */
- [0x439d, 0x439d], /* CJK Ideograph Extension A */
- [0x439e, 0x439e], /* CJK Ideograph Extension A */
- [0x439f, 0x439f], /* CJK Ideograph Extension A */
- [0x43a0, 0x43a0], /* CJK Ideograph Extension A */
- [0x43a1, 0x43a1], /* CJK Ideograph Extension A */
- [0x43a2, 0x43a2], /* CJK Ideograph Extension A */
- [0x43a3, 0x43a3], /* CJK Ideograph Extension A */
- [0x43a4, 0x43a4], /* CJK Ideograph Extension A */
- [0x43a5, 0x43a5], /* CJK Ideograph Extension A */
- [0x43a6, 0x43a6], /* CJK Ideograph Extension A */
- [0x43a7, 0x43a7], /* CJK Ideograph Extension A */
- [0x43a8, 0x43a8], /* CJK Ideograph Extension A */
- [0x43a9, 0x43a9], /* CJK Ideograph Extension A */
- [0x43aa, 0x43aa], /* CJK Ideograph Extension A */
- [0x43ab, 0x43ab], /* CJK Ideograph Extension A */
- [0x43ac, 0x43ac], /* CJK Ideograph Extension A */
- [0x43ad, 0x43ad], /* CJK Ideograph Extension A */
- [0x43ae, 0x43ae], /* CJK Ideograph Extension A */
- [0x43af, 0x43af], /* CJK Ideograph Extension A */
- [0x43b0, 0x43b0], /* CJK Ideograph Extension A */
- [0x43b1, 0x43b1], /* CJK Ideograph Extension A */
- [0x43b2, 0x43b2], /* CJK Ideograph Extension A */
- [0x43b3, 0x43b3], /* CJK Ideograph Extension A */
- [0x43b4, 0x43b4], /* CJK Ideograph Extension A */
- [0x43b5, 0x43b5], /* CJK Ideograph Extension A */
- [0x43b6, 0x43b6], /* CJK Ideograph Extension A */
- [0x43b7, 0x43b7], /* CJK Ideograph Extension A */
- [0x43b8, 0x43b8], /* CJK Ideograph Extension A */
- [0x43b9, 0x43b9], /* CJK Ideograph Extension A */
- [0x43ba, 0x43ba], /* CJK Ideograph Extension A */
- [0x43bb, 0x43bb], /* CJK Ideograph Extension A */
- [0x43bc, 0x43bc], /* CJK Ideograph Extension A */
- [0x43bd, 0x43bd], /* CJK Ideograph Extension A */
- [0x43be, 0x43be], /* CJK Ideograph Extension A */
- [0x43bf, 0x43bf], /* CJK Ideograph Extension A */
- [0x43c0, 0x43c0], /* CJK Ideograph Extension A */
- [0x43c1, 0x43c1], /* CJK Ideograph Extension A */
- [0x43c2, 0x43c2], /* CJK Ideograph Extension A */
- [0x43c3, 0x43c3], /* CJK Ideograph Extension A */
- [0x43c4, 0x43c4], /* CJK Ideograph Extension A */
- [0x43c5, 0x43c5], /* CJK Ideograph Extension A */
- [0x43c6, 0x43c6], /* CJK Ideograph Extension A */
- [0x43c7, 0x43c7], /* CJK Ideograph Extension A */
- [0x43c8, 0x43c8], /* CJK Ideograph Extension A */
- [0x43c9, 0x43c9], /* CJK Ideograph Extension A */
- [0x43ca, 0x43ca], /* CJK Ideograph Extension A */
- [0x43cb, 0x43cb], /* CJK Ideograph Extension A */
- [0x43cc, 0x43cc], /* CJK Ideograph Extension A */
- [0x43cd, 0x43cd], /* CJK Ideograph Extension A */
- [0x43ce, 0x43ce], /* CJK Ideograph Extension A */
- [0x43cf, 0x43cf], /* CJK Ideograph Extension A */
- [0x43d0, 0x43d0], /* CJK Ideograph Extension A */
- [0x43d1, 0x43d1], /* CJK Ideograph Extension A */
- [0x43d2, 0x43d2], /* CJK Ideograph Extension A */
- [0x43d3, 0x43d3], /* CJK Ideograph Extension A */
- [0x43d4, 0x43d4], /* CJK Ideograph Extension A */
- [0x43d5, 0x43d5], /* CJK Ideograph Extension A */
- [0x43d6, 0x43d6], /* CJK Ideograph Extension A */
- [0x43d7, 0x43d7], /* CJK Ideograph Extension A */
- [0x43d8, 0x43d8], /* CJK Ideograph Extension A */
- [0x43d9, 0x43d9], /* CJK Ideograph Extension A */
- [0x43da, 0x43da], /* CJK Ideograph Extension A */
- [0x43db, 0x43db], /* CJK Ideograph Extension A */
- [0x43dc, 0x43dc], /* CJK Ideograph Extension A */
- [0x43dd, 0x43dd], /* CJK Ideograph Extension A */
- [0x43de, 0x43de], /* CJK Ideograph Extension A */
- [0x43df, 0x43df], /* CJK Ideograph Extension A */
- [0x43e0, 0x43e0], /* CJK Ideograph Extension A */
- [0x43e1, 0x43e1], /* CJK Ideograph Extension A */
- [0x43e2, 0x43e2], /* CJK Ideograph Extension A */
- [0x43e3, 0x43e3], /* CJK Ideograph Extension A */
- [0x43e4, 0x43e4], /* CJK Ideograph Extension A */
- [0x43e5, 0x43e5], /* CJK Ideograph Extension A */
- [0x43e6, 0x43e6], /* CJK Ideograph Extension A */
- [0x43e7, 0x43e7], /* CJK Ideograph Extension A */
- [0x43e8, 0x43e8], /* CJK Ideograph Extension A */
- [0x43e9, 0x43e9], /* CJK Ideograph Extension A */
- [0x43ea, 0x43ea], /* CJK Ideograph Extension A */
- [0x43eb, 0x43eb], /* CJK Ideograph Extension A */
- [0x43ec, 0x43ec], /* CJK Ideograph Extension A */
- [0x43ed, 0x43ed], /* CJK Ideograph Extension A */
- [0x43ee, 0x43ee], /* CJK Ideograph Extension A */
- [0x43ef, 0x43ef], /* CJK Ideograph Extension A */
- [0x43f0, 0x43f0], /* CJK Ideograph Extension A */
- [0x43f1, 0x43f1], /* CJK Ideograph Extension A */
- [0x43f2, 0x43f2], /* CJK Ideograph Extension A */
- [0x43f3, 0x43f3], /* CJK Ideograph Extension A */
- [0x43f4, 0x43f4], /* CJK Ideograph Extension A */
- [0x43f5, 0x43f5], /* CJK Ideograph Extension A */
- [0x43f6, 0x43f6], /* CJK Ideograph Extension A */
- [0x43f7, 0x43f7], /* CJK Ideograph Extension A */
- [0x43f8, 0x43f8], /* CJK Ideograph Extension A */
- [0x43f9, 0x43f9], /* CJK Ideograph Extension A */
- [0x43fa, 0x43fa], /* CJK Ideograph Extension A */
- [0x43fb, 0x43fb], /* CJK Ideograph Extension A */
- [0x43fc, 0x43fc], /* CJK Ideograph Extension A */
- [0x43fd, 0x43fd], /* CJK Ideograph Extension A */
- [0x43fe, 0x43fe], /* CJK Ideograph Extension A */
- [0x43ff, 0x43ff], /* CJK Ideograph Extension A */
- [0x4400, 0x4400], /* CJK Ideograph Extension A */
- [0x4401, 0x4401], /* CJK Ideograph Extension A */
- [0x4402, 0x4402], /* CJK Ideograph Extension A */
- [0x4403, 0x4403], /* CJK Ideograph Extension A */
- [0x4404, 0x4404], /* CJK Ideograph Extension A */
- [0x4405, 0x4405], /* CJK Ideograph Extension A */
- [0x4406, 0x4406], /* CJK Ideograph Extension A */
- [0x4407, 0x4407], /* CJK Ideograph Extension A */
- [0x4408, 0x4408], /* CJK Ideograph Extension A */
- [0x4409, 0x4409], /* CJK Ideograph Extension A */
- [0x440a, 0x440a], /* CJK Ideograph Extension A */
- [0x440b, 0x440b], /* CJK Ideograph Extension A */
- [0x440c, 0x440c], /* CJK Ideograph Extension A */
- [0x440d, 0x440d], /* CJK Ideograph Extension A */
- [0x440e, 0x440e], /* CJK Ideograph Extension A */
- [0x440f, 0x440f], /* CJK Ideograph Extension A */
- [0x4410, 0x4410], /* CJK Ideograph Extension A */
- [0x4411, 0x4411], /* CJK Ideograph Extension A */
- [0x4412, 0x4412], /* CJK Ideograph Extension A */
- [0x4413, 0x4413], /* CJK Ideograph Extension A */
- [0x4414, 0x4414], /* CJK Ideograph Extension A */
- [0x4415, 0x4415], /* CJK Ideograph Extension A */
- [0x4416, 0x4416], /* CJK Ideograph Extension A */
- [0x4417, 0x4417], /* CJK Ideograph Extension A */
- [0x4418, 0x4418], /* CJK Ideograph Extension A */
- [0x4419, 0x4419], /* CJK Ideograph Extension A */
- [0x441a, 0x441a], /* CJK Ideograph Extension A */
- [0x441b, 0x441b], /* CJK Ideograph Extension A */
- [0x441c, 0x441c], /* CJK Ideograph Extension A */
- [0x441d, 0x441d], /* CJK Ideograph Extension A */
- [0x441e, 0x441e], /* CJK Ideograph Extension A */
- [0x441f, 0x441f], /* CJK Ideograph Extension A */
- [0x4420, 0x4420], /* CJK Ideograph Extension A */
- [0x4421, 0x4421], /* CJK Ideograph Extension A */
- [0x4422, 0x4422], /* CJK Ideograph Extension A */
- [0x4423, 0x4423], /* CJK Ideograph Extension A */
- [0x4424, 0x4424], /* CJK Ideograph Extension A */
- [0x4425, 0x4425], /* CJK Ideograph Extension A */
- [0x4426, 0x4426], /* CJK Ideograph Extension A */
- [0x4427, 0x4427], /* CJK Ideograph Extension A */
- [0x4428, 0x4428], /* CJK Ideograph Extension A */
- [0x4429, 0x4429], /* CJK Ideograph Extension A */
- [0x442a, 0x442a], /* CJK Ideograph Extension A */
- [0x442b, 0x442b], /* CJK Ideograph Extension A */
- [0x442c, 0x442c], /* CJK Ideograph Extension A */
- [0x442d, 0x442d], /* CJK Ideograph Extension A */
- [0x442e, 0x442e], /* CJK Ideograph Extension A */
- [0x442f, 0x442f], /* CJK Ideograph Extension A */
- [0x4430, 0x4430], /* CJK Ideograph Extension A */
- [0x4431, 0x4431], /* CJK Ideograph Extension A */
- [0x4432, 0x4432], /* CJK Ideograph Extension A */
- [0x4433, 0x4433], /* CJK Ideograph Extension A */
- [0x4434, 0x4434], /* CJK Ideograph Extension A */
- [0x4435, 0x4435], /* CJK Ideograph Extension A */
- [0x4436, 0x4436], /* CJK Ideograph Extension A */
- [0x4437, 0x4437], /* CJK Ideograph Extension A */
- [0x4438, 0x4438], /* CJK Ideograph Extension A */
- [0x4439, 0x4439], /* CJK Ideograph Extension A */
- [0x443a, 0x443a], /* CJK Ideograph Extension A */
- [0x443b, 0x443b], /* CJK Ideograph Extension A */
- [0x443c, 0x443c], /* CJK Ideograph Extension A */
- [0x443d, 0x443d], /* CJK Ideograph Extension A */
- [0x443e, 0x443e], /* CJK Ideograph Extension A */
- [0x443f, 0x443f], /* CJK Ideograph Extension A */
- [0x4440, 0x4440], /* CJK Ideograph Extension A */
- [0x4441, 0x4441], /* CJK Ideograph Extension A */
- [0x4442, 0x4442], /* CJK Ideograph Extension A */
- [0x4443, 0x4443], /* CJK Ideograph Extension A */
- [0x4444, 0x4444], /* CJK Ideograph Extension A */
- [0x4445, 0x4445], /* CJK Ideograph Extension A */
- [0x4446, 0x4446], /* CJK Ideograph Extension A */
- [0x4447, 0x4447], /* CJK Ideograph Extension A */
- [0x4448, 0x4448], /* CJK Ideograph Extension A */
- [0x4449, 0x4449], /* CJK Ideograph Extension A */
- [0x444a, 0x444a], /* CJK Ideograph Extension A */
- [0x444b, 0x444b], /* CJK Ideograph Extension A */
- [0x444c, 0x444c], /* CJK Ideograph Extension A */
- [0x444d, 0x444d], /* CJK Ideograph Extension A */
- [0x444e, 0x444e], /* CJK Ideograph Extension A */
- [0x444f, 0x444f], /* CJK Ideograph Extension A */
- [0x4450, 0x4450], /* CJK Ideograph Extension A */
- [0x4451, 0x4451], /* CJK Ideograph Extension A */
- [0x4452, 0x4452], /* CJK Ideograph Extension A */
- [0x4453, 0x4453], /* CJK Ideograph Extension A */
- [0x4454, 0x4454], /* CJK Ideograph Extension A */
- [0x4455, 0x4455], /* CJK Ideograph Extension A */
- [0x4456, 0x4456], /* CJK Ideograph Extension A */
- [0x4457, 0x4457], /* CJK Ideograph Extension A */
- [0x4458, 0x4458], /* CJK Ideograph Extension A */
- [0x4459, 0x4459], /* CJK Ideograph Extension A */
- [0x445a, 0x445a], /* CJK Ideograph Extension A */
- [0x445b, 0x445b], /* CJK Ideograph Extension A */
- [0x445c, 0x445c], /* CJK Ideograph Extension A */
- [0x445d, 0x445d], /* CJK Ideograph Extension A */
- [0x445e, 0x445e], /* CJK Ideograph Extension A */
- [0x445f, 0x445f], /* CJK Ideograph Extension A */
- [0x4460, 0x4460], /* CJK Ideograph Extension A */
- [0x4461, 0x4461], /* CJK Ideograph Extension A */
- [0x4462, 0x4462], /* CJK Ideograph Extension A */
- [0x4463, 0x4463], /* CJK Ideograph Extension A */
- [0x4464, 0x4464], /* CJK Ideograph Extension A */
- [0x4465, 0x4465], /* CJK Ideograph Extension A */
- [0x4466, 0x4466], /* CJK Ideograph Extension A */
- [0x4467, 0x4467], /* CJK Ideograph Extension A */
- [0x4468, 0x4468], /* CJK Ideograph Extension A */
- [0x4469, 0x4469], /* CJK Ideograph Extension A */
- [0x446a, 0x446a], /* CJK Ideograph Extension A */
- [0x446b, 0x446b], /* CJK Ideograph Extension A */
- [0x446c, 0x446c], /* CJK Ideograph Extension A */
- [0x446d, 0x446d], /* CJK Ideograph Extension A */
- [0x446e, 0x446e], /* CJK Ideograph Extension A */
- [0x446f, 0x446f], /* CJK Ideograph Extension A */
- [0x4470, 0x4470], /* CJK Ideograph Extension A */
- [0x4471, 0x4471], /* CJK Ideograph Extension A */
- [0x4472, 0x4472], /* CJK Ideograph Extension A */
- [0x4473, 0x4473], /* CJK Ideograph Extension A */
- [0x4474, 0x4474], /* CJK Ideograph Extension A */
- [0x4475, 0x4475], /* CJK Ideograph Extension A */
- [0x4476, 0x4476], /* CJK Ideograph Extension A */
- [0x4477, 0x4477], /* CJK Ideograph Extension A */
- [0x4478, 0x4478], /* CJK Ideograph Extension A */
- [0x4479, 0x4479], /* CJK Ideograph Extension A */
- [0x447a, 0x447a], /* CJK Ideograph Extension A */
- [0x447b, 0x447b], /* CJK Ideograph Extension A */
- [0x447c, 0x447c], /* CJK Ideograph Extension A */
- [0x447d, 0x447d], /* CJK Ideograph Extension A */
- [0x447e, 0x447e], /* CJK Ideograph Extension A */
- [0x447f, 0x447f], /* CJK Ideograph Extension A */
- [0x4480, 0x4480], /* CJK Ideograph Extension A */
- [0x4481, 0x4481], /* CJK Ideograph Extension A */
- [0x4482, 0x4482], /* CJK Ideograph Extension A */
- [0x4483, 0x4483], /* CJK Ideograph Extension A */
- [0x4484, 0x4484], /* CJK Ideograph Extension A */
- [0x4485, 0x4485], /* CJK Ideograph Extension A */
- [0x4486, 0x4486], /* CJK Ideograph Extension A */
- [0x4487, 0x4487], /* CJK Ideograph Extension A */
- [0x4488, 0x4488], /* CJK Ideograph Extension A */
- [0x4489, 0x4489], /* CJK Ideograph Extension A */
- [0x448a, 0x448a], /* CJK Ideograph Extension A */
- [0x448b, 0x448b], /* CJK Ideograph Extension A */
- [0x448c, 0x448c], /* CJK Ideograph Extension A */
- [0x448d, 0x448d], /* CJK Ideograph Extension A */
- [0x448e, 0x448e], /* CJK Ideograph Extension A */
- [0x448f, 0x448f], /* CJK Ideograph Extension A */
- [0x4490, 0x4490], /* CJK Ideograph Extension A */
- [0x4491, 0x4491], /* CJK Ideograph Extension A */
- [0x4492, 0x4492], /* CJK Ideograph Extension A */
- [0x4493, 0x4493], /* CJK Ideograph Extension A */
- [0x4494, 0x4494], /* CJK Ideograph Extension A */
- [0x4495, 0x4495], /* CJK Ideograph Extension A */
- [0x4496, 0x4496], /* CJK Ideograph Extension A */
- [0x4497, 0x4497], /* CJK Ideograph Extension A */
- [0x4498, 0x4498], /* CJK Ideograph Extension A */
- [0x4499, 0x4499], /* CJK Ideograph Extension A */
- [0x449a, 0x449a], /* CJK Ideograph Extension A */
- [0x449b, 0x449b], /* CJK Ideograph Extension A */
- [0x449c, 0x449c], /* CJK Ideograph Extension A */
- [0x449d, 0x449d], /* CJK Ideograph Extension A */
- [0x449e, 0x449e], /* CJK Ideograph Extension A */
- [0x449f, 0x449f], /* CJK Ideograph Extension A */
- [0x44a0, 0x44a0], /* CJK Ideograph Extension A */
- [0x44a1, 0x44a1], /* CJK Ideograph Extension A */
- [0x44a2, 0x44a2], /* CJK Ideograph Extension A */
- [0x44a3, 0x44a3], /* CJK Ideograph Extension A */
- [0x44a4, 0x44a4], /* CJK Ideograph Extension A */
- [0x44a5, 0x44a5], /* CJK Ideograph Extension A */
- [0x44a6, 0x44a6], /* CJK Ideograph Extension A */
- [0x44a7, 0x44a7], /* CJK Ideograph Extension A */
- [0x44a8, 0x44a8], /* CJK Ideograph Extension A */
- [0x44a9, 0x44a9], /* CJK Ideograph Extension A */
- [0x44aa, 0x44aa], /* CJK Ideograph Extension A */
- [0x44ab, 0x44ab], /* CJK Ideograph Extension A */
- [0x44ac, 0x44ac], /* CJK Ideograph Extension A */
- [0x44ad, 0x44ad], /* CJK Ideograph Extension A */
- [0x44ae, 0x44ae], /* CJK Ideograph Extension A */
- [0x44af, 0x44af], /* CJK Ideograph Extension A */
- [0x44b0, 0x44b0], /* CJK Ideograph Extension A */
- [0x44b1, 0x44b1], /* CJK Ideograph Extension A */
- [0x44b2, 0x44b2], /* CJK Ideograph Extension A */
- [0x44b3, 0x44b3], /* CJK Ideograph Extension A */
- [0x44b4, 0x44b4], /* CJK Ideograph Extension A */
- [0x44b5, 0x44b5], /* CJK Ideograph Extension A */
- [0x44b6, 0x44b6], /* CJK Ideograph Extension A */
- [0x44b7, 0x44b7], /* CJK Ideograph Extension A */
- [0x44b8, 0x44b8], /* CJK Ideograph Extension A */
- [0x44b9, 0x44b9], /* CJK Ideograph Extension A */
- [0x44ba, 0x44ba], /* CJK Ideograph Extension A */
- [0x44bb, 0x44bb], /* CJK Ideograph Extension A */
- [0x44bc, 0x44bc], /* CJK Ideograph Extension A */
- [0x44bd, 0x44bd], /* CJK Ideograph Extension A */
- [0x44be, 0x44be], /* CJK Ideograph Extension A */
- [0x44bf, 0x44bf], /* CJK Ideograph Extension A */
- [0x44c0, 0x44c0], /* CJK Ideograph Extension A */
- [0x44c1, 0x44c1], /* CJK Ideograph Extension A */
- [0x44c2, 0x44c2], /* CJK Ideograph Extension A */
- [0x44c3, 0x44c3], /* CJK Ideograph Extension A */
- [0x44c4, 0x44c4], /* CJK Ideograph Extension A */
- [0x44c5, 0x44c5], /* CJK Ideograph Extension A */
- [0x44c6, 0x44c6], /* CJK Ideograph Extension A */
- [0x44c7, 0x44c7], /* CJK Ideograph Extension A */
- [0x44c8, 0x44c8], /* CJK Ideograph Extension A */
- [0x44c9, 0x44c9], /* CJK Ideograph Extension A */
- [0x44ca, 0x44ca], /* CJK Ideograph Extension A */
- [0x44cb, 0x44cb], /* CJK Ideograph Extension A */
- [0x44cc, 0x44cc], /* CJK Ideograph Extension A */
- [0x44cd, 0x44cd], /* CJK Ideograph Extension A */
- [0x44ce, 0x44ce], /* CJK Ideograph Extension A */
- [0x44cf, 0x44cf], /* CJK Ideograph Extension A */
- [0x44d0, 0x44d0], /* CJK Ideograph Extension A */
- [0x44d1, 0x44d1], /* CJK Ideograph Extension A */
- [0x44d2, 0x44d2], /* CJK Ideograph Extension A */
- [0x44d3, 0x44d3], /* CJK Ideograph Extension A */
- [0x44d4, 0x44d4], /* CJK Ideograph Extension A */
- [0x44d5, 0x44d5], /* CJK Ideograph Extension A */
- [0x44d6, 0x44d6], /* CJK Ideograph Extension A */
- [0x44d7, 0x44d7], /* CJK Ideograph Extension A */
- [0x44d8, 0x44d8], /* CJK Ideograph Extension A */
- [0x44d9, 0x44d9], /* CJK Ideograph Extension A */
- [0x44da, 0x44da], /* CJK Ideograph Extension A */
- [0x44db, 0x44db], /* CJK Ideograph Extension A */
- [0x44dc, 0x44dc], /* CJK Ideograph Extension A */
- [0x44dd, 0x44dd], /* CJK Ideograph Extension A */
- [0x44de, 0x44de], /* CJK Ideograph Extension A */
- [0x44df, 0x44df], /* CJK Ideograph Extension A */
- [0x44e0, 0x44e0], /* CJK Ideograph Extension A */
- [0x44e1, 0x44e1], /* CJK Ideograph Extension A */
- [0x44e2, 0x44e2], /* CJK Ideograph Extension A */
- [0x44e3, 0x44e3], /* CJK Ideograph Extension A */
- [0x44e4, 0x44e4], /* CJK Ideograph Extension A */
- [0x44e5, 0x44e5], /* CJK Ideograph Extension A */
- [0x44e6, 0x44e6], /* CJK Ideograph Extension A */
- [0x44e7, 0x44e7], /* CJK Ideograph Extension A */
- [0x44e8, 0x44e8], /* CJK Ideograph Extension A */
- [0x44e9, 0x44e9], /* CJK Ideograph Extension A */
- [0x44ea, 0x44ea], /* CJK Ideograph Extension A */
- [0x44eb, 0x44eb], /* CJK Ideograph Extension A */
- [0x44ec, 0x44ec], /* CJK Ideograph Extension A */
- [0x44ed, 0x44ed], /* CJK Ideograph Extension A */
- [0x44ee, 0x44ee], /* CJK Ideograph Extension A */
- [0x44ef, 0x44ef], /* CJK Ideograph Extension A */
- [0x44f0, 0x44f0], /* CJK Ideograph Extension A */
- [0x44f1, 0x44f1], /* CJK Ideograph Extension A */
- [0x44f2, 0x44f2], /* CJK Ideograph Extension A */
- [0x44f3, 0x44f3], /* CJK Ideograph Extension A */
- [0x44f4, 0x44f4], /* CJK Ideograph Extension A */
- [0x44f5, 0x44f5], /* CJK Ideograph Extension A */
- [0x44f6, 0x44f6], /* CJK Ideograph Extension A */
- [0x44f7, 0x44f7], /* CJK Ideograph Extension A */
- [0x44f8, 0x44f8], /* CJK Ideograph Extension A */
- [0x44f9, 0x44f9], /* CJK Ideograph Extension A */
- [0x44fa, 0x44fa], /* CJK Ideograph Extension A */
- [0x44fb, 0x44fb], /* CJK Ideograph Extension A */
- [0x44fc, 0x44fc], /* CJK Ideograph Extension A */
- [0x44fd, 0x44fd], /* CJK Ideograph Extension A */
- [0x44fe, 0x44fe], /* CJK Ideograph Extension A */
- [0x44ff, 0x44ff], /* CJK Ideograph Extension A */
- [0x4500, 0x4500], /* CJK Ideograph Extension A */
- [0x4501, 0x4501], /* CJK Ideograph Extension A */
- [0x4502, 0x4502], /* CJK Ideograph Extension A */
- [0x4503, 0x4503], /* CJK Ideograph Extension A */
- [0x4504, 0x4504], /* CJK Ideograph Extension A */
- [0x4505, 0x4505], /* CJK Ideograph Extension A */
- [0x4506, 0x4506], /* CJK Ideograph Extension A */
- [0x4507, 0x4507], /* CJK Ideograph Extension A */
- [0x4508, 0x4508], /* CJK Ideograph Extension A */
- [0x4509, 0x4509], /* CJK Ideograph Extension A */
- [0x450a, 0x450a], /* CJK Ideograph Extension A */
- [0x450b, 0x450b], /* CJK Ideograph Extension A */
- [0x450c, 0x450c], /* CJK Ideograph Extension A */
- [0x450d, 0x450d], /* CJK Ideograph Extension A */
- [0x450e, 0x450e], /* CJK Ideograph Extension A */
- [0x450f, 0x450f], /* CJK Ideograph Extension A */
- [0x4510, 0x4510], /* CJK Ideograph Extension A */
- [0x4511, 0x4511], /* CJK Ideograph Extension A */
- [0x4512, 0x4512], /* CJK Ideograph Extension A */
- [0x4513, 0x4513], /* CJK Ideograph Extension A */
- [0x4514, 0x4514], /* CJK Ideograph Extension A */
- [0x4515, 0x4515], /* CJK Ideograph Extension A */
- [0x4516, 0x4516], /* CJK Ideograph Extension A */
- [0x4517, 0x4517], /* CJK Ideograph Extension A */
- [0x4518, 0x4518], /* CJK Ideograph Extension A */
- [0x4519, 0x4519], /* CJK Ideograph Extension A */
- [0x451a, 0x451a], /* CJK Ideograph Extension A */
- [0x451b, 0x451b], /* CJK Ideograph Extension A */
- [0x451c, 0x451c], /* CJK Ideograph Extension A */
- [0x451d, 0x451d], /* CJK Ideograph Extension A */
- [0x451e, 0x451e], /* CJK Ideograph Extension A */
- [0x451f, 0x451f], /* CJK Ideograph Extension A */
- [0x4520, 0x4520], /* CJK Ideograph Extension A */
- [0x4521, 0x4521], /* CJK Ideograph Extension A */
- [0x4522, 0x4522], /* CJK Ideograph Extension A */
- [0x4523, 0x4523], /* CJK Ideograph Extension A */
- [0x4524, 0x4524], /* CJK Ideograph Extension A */
- [0x4525, 0x4525], /* CJK Ideograph Extension A */
- [0x4526, 0x4526], /* CJK Ideograph Extension A */
- [0x4527, 0x4527], /* CJK Ideograph Extension A */
- [0x4528, 0x4528], /* CJK Ideograph Extension A */
- [0x4529, 0x4529], /* CJK Ideograph Extension A */
- [0x452a, 0x452a], /* CJK Ideograph Extension A */
- [0x452b, 0x452b], /* CJK Ideograph Extension A */
- [0x452c, 0x452c], /* CJK Ideograph Extension A */
- [0x452d, 0x452d], /* CJK Ideograph Extension A */
- [0x452e, 0x452e], /* CJK Ideograph Extension A */
- [0x452f, 0x452f], /* CJK Ideograph Extension A */
- [0x4530, 0x4530], /* CJK Ideograph Extension A */
- [0x4531, 0x4531], /* CJK Ideograph Extension A */
- [0x4532, 0x4532], /* CJK Ideograph Extension A */
- [0x4533, 0x4533], /* CJK Ideograph Extension A */
- [0x4534, 0x4534], /* CJK Ideograph Extension A */
- [0x4535, 0x4535], /* CJK Ideograph Extension A */
- [0x4536, 0x4536], /* CJK Ideograph Extension A */
- [0x4537, 0x4537], /* CJK Ideograph Extension A */
- [0x4538, 0x4538], /* CJK Ideograph Extension A */
- [0x4539, 0x4539], /* CJK Ideograph Extension A */
- [0x453a, 0x453a], /* CJK Ideograph Extension A */
- [0x453b, 0x453b], /* CJK Ideograph Extension A */
- [0x453c, 0x453c], /* CJK Ideograph Extension A */
- [0x453d, 0x453d], /* CJK Ideograph Extension A */
- [0x453e, 0x453e], /* CJK Ideograph Extension A */
- [0x453f, 0x453f], /* CJK Ideograph Extension A */
- [0x4540, 0x4540], /* CJK Ideograph Extension A */
- [0x4541, 0x4541], /* CJK Ideograph Extension A */
- [0x4542, 0x4542], /* CJK Ideograph Extension A */
- [0x4543, 0x4543], /* CJK Ideograph Extension A */
- [0x4544, 0x4544], /* CJK Ideograph Extension A */
- [0x4545, 0x4545], /* CJK Ideograph Extension A */
- [0x4546, 0x4546], /* CJK Ideograph Extension A */
- [0x4547, 0x4547], /* CJK Ideograph Extension A */
- [0x4548, 0x4548], /* CJK Ideograph Extension A */
- [0x4549, 0x4549], /* CJK Ideograph Extension A */
- [0x454a, 0x454a], /* CJK Ideograph Extension A */
- [0x454b, 0x454b], /* CJK Ideograph Extension A */
- [0x454c, 0x454c], /* CJK Ideograph Extension A */
- [0x454d, 0x454d], /* CJK Ideograph Extension A */
- [0x454e, 0x454e], /* CJK Ideograph Extension A */
- [0x454f, 0x454f], /* CJK Ideograph Extension A */
- [0x4550, 0x4550], /* CJK Ideograph Extension A */
- [0x4551, 0x4551], /* CJK Ideograph Extension A */
- [0x4552, 0x4552], /* CJK Ideograph Extension A */
- [0x4553, 0x4553], /* CJK Ideograph Extension A */
- [0x4554, 0x4554], /* CJK Ideograph Extension A */
- [0x4555, 0x4555], /* CJK Ideograph Extension A */
- [0x4556, 0x4556], /* CJK Ideograph Extension A */
- [0x4557, 0x4557], /* CJK Ideograph Extension A */
- [0x4558, 0x4558], /* CJK Ideograph Extension A */
- [0x4559, 0x4559], /* CJK Ideograph Extension A */
- [0x455a, 0x455a], /* CJK Ideograph Extension A */
- [0x455b, 0x455b], /* CJK Ideograph Extension A */
- [0x455c, 0x455c], /* CJK Ideograph Extension A */
- [0x455d, 0x455d], /* CJK Ideograph Extension A */
- [0x455e, 0x455e], /* CJK Ideograph Extension A */
- [0x455f, 0x455f], /* CJK Ideograph Extension A */
- [0x4560, 0x4560], /* CJK Ideograph Extension A */
- [0x4561, 0x4561], /* CJK Ideograph Extension A */
- [0x4562, 0x4562], /* CJK Ideograph Extension A */
- [0x4563, 0x4563], /* CJK Ideograph Extension A */
- [0x4564, 0x4564], /* CJK Ideograph Extension A */
- [0x4565, 0x4565], /* CJK Ideograph Extension A */
- [0x4566, 0x4566], /* CJK Ideograph Extension A */
- [0x4567, 0x4567], /* CJK Ideograph Extension A */
- [0x4568, 0x4568], /* CJK Ideograph Extension A */
- [0x4569, 0x4569], /* CJK Ideograph Extension A */
- [0x456a, 0x456a], /* CJK Ideograph Extension A */
- [0x456b, 0x456b], /* CJK Ideograph Extension A */
- [0x456c, 0x456c], /* CJK Ideograph Extension A */
- [0x456d, 0x456d], /* CJK Ideograph Extension A */
- [0x456e, 0x456e], /* CJK Ideograph Extension A */
- [0x456f, 0x456f], /* CJK Ideograph Extension A */
- [0x4570, 0x4570], /* CJK Ideograph Extension A */
- [0x4571, 0x4571], /* CJK Ideograph Extension A */
- [0x4572, 0x4572], /* CJK Ideograph Extension A */
- [0x4573, 0x4573], /* CJK Ideograph Extension A */
- [0x4574, 0x4574], /* CJK Ideograph Extension A */
- [0x4575, 0x4575], /* CJK Ideograph Extension A */
- [0x4576, 0x4576], /* CJK Ideograph Extension A */
- [0x4577, 0x4577], /* CJK Ideograph Extension A */
- [0x4578, 0x4578], /* CJK Ideograph Extension A */
- [0x4579, 0x4579], /* CJK Ideograph Extension A */
- [0x457a, 0x457a], /* CJK Ideograph Extension A */
- [0x457b, 0x457b], /* CJK Ideograph Extension A */
- [0x457c, 0x457c], /* CJK Ideograph Extension A */
- [0x457d, 0x457d], /* CJK Ideograph Extension A */
- [0x457e, 0x457e], /* CJK Ideograph Extension A */
- [0x457f, 0x457f], /* CJK Ideograph Extension A */
- [0x4580, 0x4580], /* CJK Ideograph Extension A */
- [0x4581, 0x4581], /* CJK Ideograph Extension A */
- [0x4582, 0x4582], /* CJK Ideograph Extension A */
- [0x4583, 0x4583], /* CJK Ideograph Extension A */
- [0x4584, 0x4584], /* CJK Ideograph Extension A */
- [0x4585, 0x4585], /* CJK Ideograph Extension A */
- [0x4586, 0x4586], /* CJK Ideograph Extension A */
- [0x4587, 0x4587], /* CJK Ideograph Extension A */
- [0x4588, 0x4588], /* CJK Ideograph Extension A */
- [0x4589, 0x4589], /* CJK Ideograph Extension A */
- [0x458a, 0x458a], /* CJK Ideograph Extension A */
- [0x458b, 0x458b], /* CJK Ideograph Extension A */
- [0x458c, 0x458c], /* CJK Ideograph Extension A */
- [0x458d, 0x458d], /* CJK Ideograph Extension A */
- [0x458e, 0x458e], /* CJK Ideograph Extension A */
- [0x458f, 0x458f], /* CJK Ideograph Extension A */
- [0x4590, 0x4590], /* CJK Ideograph Extension A */
- [0x4591, 0x4591], /* CJK Ideograph Extension A */
- [0x4592, 0x4592], /* CJK Ideograph Extension A */
- [0x4593, 0x4593], /* CJK Ideograph Extension A */
- [0x4594, 0x4594], /* CJK Ideograph Extension A */
- [0x4595, 0x4595], /* CJK Ideograph Extension A */
- [0x4596, 0x4596], /* CJK Ideograph Extension A */
- [0x4597, 0x4597], /* CJK Ideograph Extension A */
- [0x4598, 0x4598], /* CJK Ideograph Extension A */
- [0x4599, 0x4599], /* CJK Ideograph Extension A */
- [0x459a, 0x459a], /* CJK Ideograph Extension A */
- [0x459b, 0x459b], /* CJK Ideograph Extension A */
- [0x459c, 0x459c], /* CJK Ideograph Extension A */
- [0x459d, 0x459d], /* CJK Ideograph Extension A */
- [0x459e, 0x459e], /* CJK Ideograph Extension A */
- [0x459f, 0x459f], /* CJK Ideograph Extension A */
- [0x45a0, 0x45a0], /* CJK Ideograph Extension A */
- [0x45a1, 0x45a1], /* CJK Ideograph Extension A */
- [0x45a2, 0x45a2], /* CJK Ideograph Extension A */
- [0x45a3, 0x45a3], /* CJK Ideograph Extension A */
- [0x45a4, 0x45a4], /* CJK Ideograph Extension A */
- [0x45a5, 0x45a5], /* CJK Ideograph Extension A */
- [0x45a6, 0x45a6], /* CJK Ideograph Extension A */
- [0x45a7, 0x45a7], /* CJK Ideograph Extension A */
- [0x45a8, 0x45a8], /* CJK Ideograph Extension A */
- [0x45a9, 0x45a9], /* CJK Ideograph Extension A */
- [0x45aa, 0x45aa], /* CJK Ideograph Extension A */
- [0x45ab, 0x45ab], /* CJK Ideograph Extension A */
- [0x45ac, 0x45ac], /* CJK Ideograph Extension A */
- [0x45ad, 0x45ad], /* CJK Ideograph Extension A */
- [0x45ae, 0x45ae], /* CJK Ideograph Extension A */
- [0x45af, 0x45af], /* CJK Ideograph Extension A */
- [0x45b0, 0x45b0], /* CJK Ideograph Extension A */
- [0x45b1, 0x45b1], /* CJK Ideograph Extension A */
- [0x45b2, 0x45b2], /* CJK Ideograph Extension A */
- [0x45b3, 0x45b3], /* CJK Ideograph Extension A */
- [0x45b4, 0x45b4], /* CJK Ideograph Extension A */
- [0x45b5, 0x45b5], /* CJK Ideograph Extension A */
- [0x45b6, 0x45b6], /* CJK Ideograph Extension A */
- [0x45b7, 0x45b7], /* CJK Ideograph Extension A */
- [0x45b8, 0x45b8], /* CJK Ideograph Extension A */
- [0x45b9, 0x45b9], /* CJK Ideograph Extension A */
- [0x45ba, 0x45ba], /* CJK Ideograph Extension A */
- [0x45bb, 0x45bb], /* CJK Ideograph Extension A */
- [0x45bc, 0x45bc], /* CJK Ideograph Extension A */
- [0x45bd, 0x45bd], /* CJK Ideograph Extension A */
- [0x45be, 0x45be], /* CJK Ideograph Extension A */
- [0x45bf, 0x45bf], /* CJK Ideograph Extension A */
- [0x45c0, 0x45c0], /* CJK Ideograph Extension A */
- [0x45c1, 0x45c1], /* CJK Ideograph Extension A */
- [0x45c2, 0x45c2], /* CJK Ideograph Extension A */
- [0x45c3, 0x45c3], /* CJK Ideograph Extension A */
- [0x45c4, 0x45c4], /* CJK Ideograph Extension A */
- [0x45c5, 0x45c5], /* CJK Ideograph Extension A */
- [0x45c6, 0x45c6], /* CJK Ideograph Extension A */
- [0x45c7, 0x45c7], /* CJK Ideograph Extension A */
- [0x45c8, 0x45c8], /* CJK Ideograph Extension A */
- [0x45c9, 0x45c9], /* CJK Ideograph Extension A */
- [0x45ca, 0x45ca], /* CJK Ideograph Extension A */
- [0x45cb, 0x45cb], /* CJK Ideograph Extension A */
- [0x45cc, 0x45cc], /* CJK Ideograph Extension A */
- [0x45cd, 0x45cd], /* CJK Ideograph Extension A */
- [0x45ce, 0x45ce], /* CJK Ideograph Extension A */
- [0x45cf, 0x45cf], /* CJK Ideograph Extension A */
- [0x45d0, 0x45d0], /* CJK Ideograph Extension A */
- [0x45d1, 0x45d1], /* CJK Ideograph Extension A */
- [0x45d2, 0x45d2], /* CJK Ideograph Extension A */
- [0x45d3, 0x45d3], /* CJK Ideograph Extension A */
- [0x45d4, 0x45d4], /* CJK Ideograph Extension A */
- [0x45d5, 0x45d5], /* CJK Ideograph Extension A */
- [0x45d6, 0x45d6], /* CJK Ideograph Extension A */
- [0x45d7, 0x45d7], /* CJK Ideograph Extension A */
- [0x45d8, 0x45d8], /* CJK Ideograph Extension A */
- [0x45d9, 0x45d9], /* CJK Ideograph Extension A */
- [0x45da, 0x45da], /* CJK Ideograph Extension A */
- [0x45db, 0x45db], /* CJK Ideograph Extension A */
- [0x45dc, 0x45dc], /* CJK Ideograph Extension A */
- [0x45dd, 0x45dd], /* CJK Ideograph Extension A */
- [0x45de, 0x45de], /* CJK Ideograph Extension A */
- [0x45df, 0x45df], /* CJK Ideograph Extension A */
- [0x45e0, 0x45e0], /* CJK Ideograph Extension A */
- [0x45e1, 0x45e1], /* CJK Ideograph Extension A */
- [0x45e2, 0x45e2], /* CJK Ideograph Extension A */
- [0x45e3, 0x45e3], /* CJK Ideograph Extension A */
- [0x45e4, 0x45e4], /* CJK Ideograph Extension A */
- [0x45e5, 0x45e5], /* CJK Ideograph Extension A */
- [0x45e6, 0x45e6], /* CJK Ideograph Extension A */
- [0x45e7, 0x45e7], /* CJK Ideograph Extension A */
- [0x45e8, 0x45e8], /* CJK Ideograph Extension A */
- [0x45e9, 0x45e9], /* CJK Ideograph Extension A */
- [0x45ea, 0x45ea], /* CJK Ideograph Extension A */
- [0x45eb, 0x45eb], /* CJK Ideograph Extension A */
- [0x45ec, 0x45ec], /* CJK Ideograph Extension A */
- [0x45ed, 0x45ed], /* CJK Ideograph Extension A */
- [0x45ee, 0x45ee], /* CJK Ideograph Extension A */
- [0x45ef, 0x45ef], /* CJK Ideograph Extension A */
- [0x45f0, 0x45f0], /* CJK Ideograph Extension A */
- [0x45f1, 0x45f1], /* CJK Ideograph Extension A */
- [0x45f2, 0x45f2], /* CJK Ideograph Extension A */
- [0x45f3, 0x45f3], /* CJK Ideograph Extension A */
- [0x45f4, 0x45f4], /* CJK Ideograph Extension A */
- [0x45f5, 0x45f5], /* CJK Ideograph Extension A */
- [0x45f6, 0x45f6], /* CJK Ideograph Extension A */
- [0x45f7, 0x45f7], /* CJK Ideograph Extension A */
- [0x45f8, 0x45f8], /* CJK Ideograph Extension A */
- [0x45f9, 0x45f9], /* CJK Ideograph Extension A */
- [0x45fa, 0x45fa], /* CJK Ideograph Extension A */
- [0x45fb, 0x45fb], /* CJK Ideograph Extension A */
- [0x45fc, 0x45fc], /* CJK Ideograph Extension A */
- [0x45fd, 0x45fd], /* CJK Ideograph Extension A */
- [0x45fe, 0x45fe], /* CJK Ideograph Extension A */
- [0x45ff, 0x45ff], /* CJK Ideograph Extension A */
- [0x4600, 0x4600], /* CJK Ideograph Extension A */
- [0x4601, 0x4601], /* CJK Ideograph Extension A */
- [0x4602, 0x4602], /* CJK Ideograph Extension A */
- [0x4603, 0x4603], /* CJK Ideograph Extension A */
- [0x4604, 0x4604], /* CJK Ideograph Extension A */
- [0x4605, 0x4605], /* CJK Ideograph Extension A */
- [0x4606, 0x4606], /* CJK Ideograph Extension A */
- [0x4607, 0x4607], /* CJK Ideograph Extension A */
- [0x4608, 0x4608], /* CJK Ideograph Extension A */
- [0x4609, 0x4609], /* CJK Ideograph Extension A */
- [0x460a, 0x460a], /* CJK Ideograph Extension A */
- [0x460b, 0x460b], /* CJK Ideograph Extension A */
- [0x460c, 0x460c], /* CJK Ideograph Extension A */
- [0x460d, 0x460d], /* CJK Ideograph Extension A */
- [0x460e, 0x460e], /* CJK Ideograph Extension A */
- [0x460f, 0x460f], /* CJK Ideograph Extension A */
- [0x4610, 0x4610], /* CJK Ideograph Extension A */
- [0x4611, 0x4611], /* CJK Ideograph Extension A */
- [0x4612, 0x4612], /* CJK Ideograph Extension A */
- [0x4613, 0x4613], /* CJK Ideograph Extension A */
- [0x4614, 0x4614], /* CJK Ideograph Extension A */
- [0x4615, 0x4615], /* CJK Ideograph Extension A */
- [0x4616, 0x4616], /* CJK Ideograph Extension A */
- [0x4617, 0x4617], /* CJK Ideograph Extension A */
- [0x4618, 0x4618], /* CJK Ideograph Extension A */
- [0x4619, 0x4619], /* CJK Ideograph Extension A */
- [0x461a, 0x461a], /* CJK Ideograph Extension A */
- [0x461b, 0x461b], /* CJK Ideograph Extension A */
- [0x461c, 0x461c], /* CJK Ideograph Extension A */
- [0x461d, 0x461d], /* CJK Ideograph Extension A */
- [0x461e, 0x461e], /* CJK Ideograph Extension A */
- [0x461f, 0x461f], /* CJK Ideograph Extension A */
- [0x4620, 0x4620], /* CJK Ideograph Extension A */
- [0x4621, 0x4621], /* CJK Ideograph Extension A */
- [0x4622, 0x4622], /* CJK Ideograph Extension A */
- [0x4623, 0x4623], /* CJK Ideograph Extension A */
- [0x4624, 0x4624], /* CJK Ideograph Extension A */
- [0x4625, 0x4625], /* CJK Ideograph Extension A */
- [0x4626, 0x4626], /* CJK Ideograph Extension A */
- [0x4627, 0x4627], /* CJK Ideograph Extension A */
- [0x4628, 0x4628], /* CJK Ideograph Extension A */
- [0x4629, 0x4629], /* CJK Ideograph Extension A */
- [0x462a, 0x462a], /* CJK Ideograph Extension A */
- [0x462b, 0x462b], /* CJK Ideograph Extension A */
- [0x462c, 0x462c], /* CJK Ideograph Extension A */
- [0x462d, 0x462d], /* CJK Ideograph Extension A */
- [0x462e, 0x462e], /* CJK Ideograph Extension A */
- [0x462f, 0x462f], /* CJK Ideograph Extension A */
- [0x4630, 0x4630], /* CJK Ideograph Extension A */
- [0x4631, 0x4631], /* CJK Ideograph Extension A */
- [0x4632, 0x4632], /* CJK Ideograph Extension A */
- [0x4633, 0x4633], /* CJK Ideograph Extension A */
- [0x4634, 0x4634], /* CJK Ideograph Extension A */
- [0x4635, 0x4635], /* CJK Ideograph Extension A */
- [0x4636, 0x4636], /* CJK Ideograph Extension A */
- [0x4637, 0x4637], /* CJK Ideograph Extension A */
- [0x4638, 0x4638], /* CJK Ideograph Extension A */
- [0x4639, 0x4639], /* CJK Ideograph Extension A */
- [0x463a, 0x463a], /* CJK Ideograph Extension A */
- [0x463b, 0x463b], /* CJK Ideograph Extension A */
- [0x463c, 0x463c], /* CJK Ideograph Extension A */
- [0x463d, 0x463d], /* CJK Ideograph Extension A */
- [0x463e, 0x463e], /* CJK Ideograph Extension A */
- [0x463f, 0x463f], /* CJK Ideograph Extension A */
- [0x4640, 0x4640], /* CJK Ideograph Extension A */
- [0x4641, 0x4641], /* CJK Ideograph Extension A */
- [0x4642, 0x4642], /* CJK Ideograph Extension A */
- [0x4643, 0x4643], /* CJK Ideograph Extension A */
- [0x4644, 0x4644], /* CJK Ideograph Extension A */
- [0x4645, 0x4645], /* CJK Ideograph Extension A */
- [0x4646, 0x4646], /* CJK Ideograph Extension A */
- [0x4647, 0x4647], /* CJK Ideograph Extension A */
- [0x4648, 0x4648], /* CJK Ideograph Extension A */
- [0x4649, 0x4649], /* CJK Ideograph Extension A */
- [0x464a, 0x464a], /* CJK Ideograph Extension A */
- [0x464b, 0x464b], /* CJK Ideograph Extension A */
- [0x464c, 0x464c], /* CJK Ideograph Extension A */
- [0x464d, 0x464d], /* CJK Ideograph Extension A */
- [0x464e, 0x464e], /* CJK Ideograph Extension A */
- [0x464f, 0x464f], /* CJK Ideograph Extension A */
- [0x4650, 0x4650], /* CJK Ideograph Extension A */
- [0x4651, 0x4651], /* CJK Ideograph Extension A */
- [0x4652, 0x4652], /* CJK Ideograph Extension A */
- [0x4653, 0x4653], /* CJK Ideograph Extension A */
- [0x4654, 0x4654], /* CJK Ideograph Extension A */
- [0x4655, 0x4655], /* CJK Ideograph Extension A */
- [0x4656, 0x4656], /* CJK Ideograph Extension A */
- [0x4657, 0x4657], /* CJK Ideograph Extension A */
- [0x4658, 0x4658], /* CJK Ideograph Extension A */
- [0x4659, 0x4659], /* CJK Ideograph Extension A */
- [0x465a, 0x465a], /* CJK Ideograph Extension A */
- [0x465b, 0x465b], /* CJK Ideograph Extension A */
- [0x465c, 0x465c], /* CJK Ideograph Extension A */
- [0x465d, 0x465d], /* CJK Ideograph Extension A */
- [0x465e, 0x465e], /* CJK Ideograph Extension A */
- [0x465f, 0x465f], /* CJK Ideograph Extension A */
- [0x4660, 0x4660], /* CJK Ideograph Extension A */
- [0x4661, 0x4661], /* CJK Ideograph Extension A */
- [0x4662, 0x4662], /* CJK Ideograph Extension A */
- [0x4663, 0x4663], /* CJK Ideograph Extension A */
- [0x4664, 0x4664], /* CJK Ideograph Extension A */
- [0x4665, 0x4665], /* CJK Ideograph Extension A */
- [0x4666, 0x4666], /* CJK Ideograph Extension A */
- [0x4667, 0x4667], /* CJK Ideograph Extension A */
- [0x4668, 0x4668], /* CJK Ideograph Extension A */
- [0x4669, 0x4669], /* CJK Ideograph Extension A */
- [0x466a, 0x466a], /* CJK Ideograph Extension A */
- [0x466b, 0x466b], /* CJK Ideograph Extension A */
- [0x466c, 0x466c], /* CJK Ideograph Extension A */
- [0x466d, 0x466d], /* CJK Ideograph Extension A */
- [0x466e, 0x466e], /* CJK Ideograph Extension A */
- [0x466f, 0x466f], /* CJK Ideograph Extension A */
- [0x4670, 0x4670], /* CJK Ideograph Extension A */
- [0x4671, 0x4671], /* CJK Ideograph Extension A */
- [0x4672, 0x4672], /* CJK Ideograph Extension A */
- [0x4673, 0x4673], /* CJK Ideograph Extension A */
- [0x4674, 0x4674], /* CJK Ideograph Extension A */
- [0x4675, 0x4675], /* CJK Ideograph Extension A */
- [0x4676, 0x4676], /* CJK Ideograph Extension A */
- [0x4677, 0x4677], /* CJK Ideograph Extension A */
- [0x4678, 0x4678], /* CJK Ideograph Extension A */
- [0x4679, 0x4679], /* CJK Ideograph Extension A */
- [0x467a, 0x467a], /* CJK Ideograph Extension A */
- [0x467b, 0x467b], /* CJK Ideograph Extension A */
- [0x467c, 0x467c], /* CJK Ideograph Extension A */
- [0x467d, 0x467d], /* CJK Ideograph Extension A */
- [0x467e, 0x467e], /* CJK Ideograph Extension A */
- [0x467f, 0x467f], /* CJK Ideograph Extension A */
- [0x4680, 0x4680], /* CJK Ideograph Extension A */
- [0x4681, 0x4681], /* CJK Ideograph Extension A */
- [0x4682, 0x4682], /* CJK Ideograph Extension A */
- [0x4683, 0x4683], /* CJK Ideograph Extension A */
- [0x4684, 0x4684], /* CJK Ideograph Extension A */
- [0x4685, 0x4685], /* CJK Ideograph Extension A */
- [0x4686, 0x4686], /* CJK Ideograph Extension A */
- [0x4687, 0x4687], /* CJK Ideograph Extension A */
- [0x4688, 0x4688], /* CJK Ideograph Extension A */
- [0x4689, 0x4689], /* CJK Ideograph Extension A */
- [0x468a, 0x468a], /* CJK Ideograph Extension A */
- [0x468b, 0x468b], /* CJK Ideograph Extension A */
- [0x468c, 0x468c], /* CJK Ideograph Extension A */
- [0x468d, 0x468d], /* CJK Ideograph Extension A */
- [0x468e, 0x468e], /* CJK Ideograph Extension A */
- [0x468f, 0x468f], /* CJK Ideograph Extension A */
- [0x4690, 0x4690], /* CJK Ideograph Extension A */
- [0x4691, 0x4691], /* CJK Ideograph Extension A */
- [0x4692, 0x4692], /* CJK Ideograph Extension A */
- [0x4693, 0x4693], /* CJK Ideograph Extension A */
- [0x4694, 0x4694], /* CJK Ideograph Extension A */
- [0x4695, 0x4695], /* CJK Ideograph Extension A */
- [0x4696, 0x4696], /* CJK Ideograph Extension A */
- [0x4697, 0x4697], /* CJK Ideograph Extension A */
- [0x4698, 0x4698], /* CJK Ideograph Extension A */
- [0x4699, 0x4699], /* CJK Ideograph Extension A */
- [0x469a, 0x469a], /* CJK Ideograph Extension A */
- [0x469b, 0x469b], /* CJK Ideograph Extension A */
- [0x469c, 0x469c], /* CJK Ideograph Extension A */
- [0x469d, 0x469d], /* CJK Ideograph Extension A */
- [0x469e, 0x469e], /* CJK Ideograph Extension A */
- [0x469f, 0x469f], /* CJK Ideograph Extension A */
- [0x46a0, 0x46a0], /* CJK Ideograph Extension A */
- [0x46a1, 0x46a1], /* CJK Ideograph Extension A */
- [0x46a2, 0x46a2], /* CJK Ideograph Extension A */
- [0x46a3, 0x46a3], /* CJK Ideograph Extension A */
- [0x46a4, 0x46a4], /* CJK Ideograph Extension A */
- [0x46a5, 0x46a5], /* CJK Ideograph Extension A */
- [0x46a6, 0x46a6], /* CJK Ideograph Extension A */
- [0x46a7, 0x46a7], /* CJK Ideograph Extension A */
- [0x46a8, 0x46a8], /* CJK Ideograph Extension A */
- [0x46a9, 0x46a9], /* CJK Ideograph Extension A */
- [0x46aa, 0x46aa], /* CJK Ideograph Extension A */
- [0x46ab, 0x46ab], /* CJK Ideograph Extension A */
- [0x46ac, 0x46ac], /* CJK Ideograph Extension A */
- [0x46ad, 0x46ad], /* CJK Ideograph Extension A */
- [0x46ae, 0x46ae], /* CJK Ideograph Extension A */
- [0x46af, 0x46af], /* CJK Ideograph Extension A */
- [0x46b0, 0x46b0], /* CJK Ideograph Extension A */
- [0x46b1, 0x46b1], /* CJK Ideograph Extension A */
- [0x46b2, 0x46b2], /* CJK Ideograph Extension A */
- [0x46b3, 0x46b3], /* CJK Ideograph Extension A */
- [0x46b4, 0x46b4], /* CJK Ideograph Extension A */
- [0x46b5, 0x46b5], /* CJK Ideograph Extension A */
- [0x46b6, 0x46b6], /* CJK Ideograph Extension A */
- [0x46b7, 0x46b7], /* CJK Ideograph Extension A */
- [0x46b8, 0x46b8], /* CJK Ideograph Extension A */
- [0x46b9, 0x46b9], /* CJK Ideograph Extension A */
- [0x46ba, 0x46ba], /* CJK Ideograph Extension A */
- [0x46bb, 0x46bb], /* CJK Ideograph Extension A */
- [0x46bc, 0x46bc], /* CJK Ideograph Extension A */
- [0x46bd, 0x46bd], /* CJK Ideograph Extension A */
- [0x46be, 0x46be], /* CJK Ideograph Extension A */
- [0x46bf, 0x46bf], /* CJK Ideograph Extension A */
- [0x46c0, 0x46c0], /* CJK Ideograph Extension A */
- [0x46c1, 0x46c1], /* CJK Ideograph Extension A */
- [0x46c2, 0x46c2], /* CJK Ideograph Extension A */
- [0x46c3, 0x46c3], /* CJK Ideograph Extension A */
- [0x46c4, 0x46c4], /* CJK Ideograph Extension A */
- [0x46c5, 0x46c5], /* CJK Ideograph Extension A */
- [0x46c6, 0x46c6], /* CJK Ideograph Extension A */
- [0x46c7, 0x46c7], /* CJK Ideograph Extension A */
- [0x46c8, 0x46c8], /* CJK Ideograph Extension A */
- [0x46c9, 0x46c9], /* CJK Ideograph Extension A */
- [0x46ca, 0x46ca], /* CJK Ideograph Extension A */
- [0x46cb, 0x46cb], /* CJK Ideograph Extension A */
- [0x46cc, 0x46cc], /* CJK Ideograph Extension A */
- [0x46cd, 0x46cd], /* CJK Ideograph Extension A */
- [0x46ce, 0x46ce], /* CJK Ideograph Extension A */
- [0x46cf, 0x46cf], /* CJK Ideograph Extension A */
- [0x46d0, 0x46d0], /* CJK Ideograph Extension A */
- [0x46d1, 0x46d1], /* CJK Ideograph Extension A */
- [0x46d2, 0x46d2], /* CJK Ideograph Extension A */
- [0x46d3, 0x46d3], /* CJK Ideograph Extension A */
- [0x46d4, 0x46d4], /* CJK Ideograph Extension A */
- [0x46d5, 0x46d5], /* CJK Ideograph Extension A */
- [0x46d6, 0x46d6], /* CJK Ideograph Extension A */
- [0x46d7, 0x46d7], /* CJK Ideograph Extension A */
- [0x46d8, 0x46d8], /* CJK Ideograph Extension A */
- [0x46d9, 0x46d9], /* CJK Ideograph Extension A */
- [0x46da, 0x46da], /* CJK Ideograph Extension A */
- [0x46db, 0x46db], /* CJK Ideograph Extension A */
- [0x46dc, 0x46dc], /* CJK Ideograph Extension A */
- [0x46dd, 0x46dd], /* CJK Ideograph Extension A */
- [0x46de, 0x46de], /* CJK Ideograph Extension A */
- [0x46df, 0x46df], /* CJK Ideograph Extension A */
- [0x46e0, 0x46e0], /* CJK Ideograph Extension A */
- [0x46e1, 0x46e1], /* CJK Ideograph Extension A */
- [0x46e2, 0x46e2], /* CJK Ideograph Extension A */
- [0x46e3, 0x46e3], /* CJK Ideograph Extension A */
- [0x46e4, 0x46e4], /* CJK Ideograph Extension A */
- [0x46e5, 0x46e5], /* CJK Ideograph Extension A */
- [0x46e6, 0x46e6], /* CJK Ideograph Extension A */
- [0x46e7, 0x46e7], /* CJK Ideograph Extension A */
- [0x46e8, 0x46e8], /* CJK Ideograph Extension A */
- [0x46e9, 0x46e9], /* CJK Ideograph Extension A */
- [0x46ea, 0x46ea], /* CJK Ideograph Extension A */
- [0x46eb, 0x46eb], /* CJK Ideograph Extension A */
- [0x46ec, 0x46ec], /* CJK Ideograph Extension A */
- [0x46ed, 0x46ed], /* CJK Ideograph Extension A */
- [0x46ee, 0x46ee], /* CJK Ideograph Extension A */
- [0x46ef, 0x46ef], /* CJK Ideograph Extension A */
- [0x46f0, 0x46f0], /* CJK Ideograph Extension A */
- [0x46f1, 0x46f1], /* CJK Ideograph Extension A */
- [0x46f2, 0x46f2], /* CJK Ideograph Extension A */
- [0x46f3, 0x46f3], /* CJK Ideograph Extension A */
- [0x46f4, 0x46f4], /* CJK Ideograph Extension A */
- [0x46f5, 0x46f5], /* CJK Ideograph Extension A */
- [0x46f6, 0x46f6], /* CJK Ideograph Extension A */
- [0x46f7, 0x46f7], /* CJK Ideograph Extension A */
- [0x46f8, 0x46f8], /* CJK Ideograph Extension A */
- [0x46f9, 0x46f9], /* CJK Ideograph Extension A */
- [0x46fa, 0x46fa], /* CJK Ideograph Extension A */
- [0x46fb, 0x46fb], /* CJK Ideograph Extension A */
- [0x46fc, 0x46fc], /* CJK Ideograph Extension A */
- [0x46fd, 0x46fd], /* CJK Ideograph Extension A */
- [0x46fe, 0x46fe], /* CJK Ideograph Extension A */
- [0x46ff, 0x46ff], /* CJK Ideograph Extension A */
- [0x4700, 0x4700], /* CJK Ideograph Extension A */
- [0x4701, 0x4701], /* CJK Ideograph Extension A */
- [0x4702, 0x4702], /* CJK Ideograph Extension A */
- [0x4703, 0x4703], /* CJK Ideograph Extension A */
- [0x4704, 0x4704], /* CJK Ideograph Extension A */
- [0x4705, 0x4705], /* CJK Ideograph Extension A */
- [0x4706, 0x4706], /* CJK Ideograph Extension A */
- [0x4707, 0x4707], /* CJK Ideograph Extension A */
- [0x4708, 0x4708], /* CJK Ideograph Extension A */
- [0x4709, 0x4709], /* CJK Ideograph Extension A */
- [0x470a, 0x470a], /* CJK Ideograph Extension A */
- [0x470b, 0x470b], /* CJK Ideograph Extension A */
- [0x470c, 0x470c], /* CJK Ideograph Extension A */
- [0x470d, 0x470d], /* CJK Ideograph Extension A */
- [0x470e, 0x470e], /* CJK Ideograph Extension A */
- [0x470f, 0x470f], /* CJK Ideograph Extension A */
- [0x4710, 0x4710], /* CJK Ideograph Extension A */
- [0x4711, 0x4711], /* CJK Ideograph Extension A */
- [0x4712, 0x4712], /* CJK Ideograph Extension A */
- [0x4713, 0x4713], /* CJK Ideograph Extension A */
- [0x4714, 0x4714], /* CJK Ideograph Extension A */
- [0x4715, 0x4715], /* CJK Ideograph Extension A */
- [0x4716, 0x4716], /* CJK Ideograph Extension A */
- [0x4717, 0x4717], /* CJK Ideograph Extension A */
- [0x4718, 0x4718], /* CJK Ideograph Extension A */
- [0x4719, 0x4719], /* CJK Ideograph Extension A */
- [0x471a, 0x471a], /* CJK Ideograph Extension A */
- [0x471b, 0x471b], /* CJK Ideograph Extension A */
- [0x471c, 0x471c], /* CJK Ideograph Extension A */
- [0x471d, 0x471d], /* CJK Ideograph Extension A */
- [0x471e, 0x471e], /* CJK Ideograph Extension A */
- [0x471f, 0x471f], /* CJK Ideograph Extension A */
- [0x4720, 0x4720], /* CJK Ideograph Extension A */
- [0x4721, 0x4721], /* CJK Ideograph Extension A */
- [0x4722, 0x4722], /* CJK Ideograph Extension A */
- [0x4723, 0x4723], /* CJK Ideograph Extension A */
- [0x4724, 0x4724], /* CJK Ideograph Extension A */
- [0x4725, 0x4725], /* CJK Ideograph Extension A */
- [0x4726, 0x4726], /* CJK Ideograph Extension A */
- [0x4727, 0x4727], /* CJK Ideograph Extension A */
- [0x4728, 0x4728], /* CJK Ideograph Extension A */
- [0x4729, 0x4729], /* CJK Ideograph Extension A */
- [0x472a, 0x472a], /* CJK Ideograph Extension A */
- [0x472b, 0x472b], /* CJK Ideograph Extension A */
- [0x472c, 0x472c], /* CJK Ideograph Extension A */
- [0x472d, 0x472d], /* CJK Ideograph Extension A */
- [0x472e, 0x472e], /* CJK Ideograph Extension A */
- [0x472f, 0x472f], /* CJK Ideograph Extension A */
- [0x4730, 0x4730], /* CJK Ideograph Extension A */
- [0x4731, 0x4731], /* CJK Ideograph Extension A */
- [0x4732, 0x4732], /* CJK Ideograph Extension A */
- [0x4733, 0x4733], /* CJK Ideograph Extension A */
- [0x4734, 0x4734], /* CJK Ideograph Extension A */
- [0x4735, 0x4735], /* CJK Ideograph Extension A */
- [0x4736, 0x4736], /* CJK Ideograph Extension A */
- [0x4737, 0x4737], /* CJK Ideograph Extension A */
- [0x4738, 0x4738], /* CJK Ideograph Extension A */
- [0x4739, 0x4739], /* CJK Ideograph Extension A */
- [0x473a, 0x473a], /* CJK Ideograph Extension A */
- [0x473b, 0x473b], /* CJK Ideograph Extension A */
- [0x473c, 0x473c], /* CJK Ideograph Extension A */
- [0x473d, 0x473d], /* CJK Ideograph Extension A */
- [0x473e, 0x473e], /* CJK Ideograph Extension A */
- [0x473f, 0x473f], /* CJK Ideograph Extension A */
- [0x4740, 0x4740], /* CJK Ideograph Extension A */
- [0x4741, 0x4741], /* CJK Ideograph Extension A */
- [0x4742, 0x4742], /* CJK Ideograph Extension A */
- [0x4743, 0x4743], /* CJK Ideograph Extension A */
- [0x4744, 0x4744], /* CJK Ideograph Extension A */
- [0x4745, 0x4745], /* CJK Ideograph Extension A */
- [0x4746, 0x4746], /* CJK Ideograph Extension A */
- [0x4747, 0x4747], /* CJK Ideograph Extension A */
- [0x4748, 0x4748], /* CJK Ideograph Extension A */
- [0x4749, 0x4749], /* CJK Ideograph Extension A */
- [0x474a, 0x474a], /* CJK Ideograph Extension A */
- [0x474b, 0x474b], /* CJK Ideograph Extension A */
- [0x474c, 0x474c], /* CJK Ideograph Extension A */
- [0x474d, 0x474d], /* CJK Ideograph Extension A */
- [0x474e, 0x474e], /* CJK Ideograph Extension A */
- [0x474f, 0x474f], /* CJK Ideograph Extension A */
- [0x4750, 0x4750], /* CJK Ideograph Extension A */
- [0x4751, 0x4751], /* CJK Ideograph Extension A */
- [0x4752, 0x4752], /* CJK Ideograph Extension A */
- [0x4753, 0x4753], /* CJK Ideograph Extension A */
- [0x4754, 0x4754], /* CJK Ideograph Extension A */
- [0x4755, 0x4755], /* CJK Ideograph Extension A */
- [0x4756, 0x4756], /* CJK Ideograph Extension A */
- [0x4757, 0x4757], /* CJK Ideograph Extension A */
- [0x4758, 0x4758], /* CJK Ideograph Extension A */
- [0x4759, 0x4759], /* CJK Ideograph Extension A */
- [0x475a, 0x475a], /* CJK Ideograph Extension A */
- [0x475b, 0x475b], /* CJK Ideograph Extension A */
- [0x475c, 0x475c], /* CJK Ideograph Extension A */
- [0x475d, 0x475d], /* CJK Ideograph Extension A */
- [0x475e, 0x475e], /* CJK Ideograph Extension A */
- [0x475f, 0x475f], /* CJK Ideograph Extension A */
- [0x4760, 0x4760], /* CJK Ideograph Extension A */
- [0x4761, 0x4761], /* CJK Ideograph Extension A */
- [0x4762, 0x4762], /* CJK Ideograph Extension A */
- [0x4763, 0x4763], /* CJK Ideograph Extension A */
- [0x4764, 0x4764], /* CJK Ideograph Extension A */
- [0x4765, 0x4765], /* CJK Ideograph Extension A */
- [0x4766, 0x4766], /* CJK Ideograph Extension A */
- [0x4767, 0x4767], /* CJK Ideograph Extension A */
- [0x4768, 0x4768], /* CJK Ideograph Extension A */
- [0x4769, 0x4769], /* CJK Ideograph Extension A */
- [0x476a, 0x476a], /* CJK Ideograph Extension A */
- [0x476b, 0x476b], /* CJK Ideograph Extension A */
- [0x476c, 0x476c], /* CJK Ideograph Extension A */
- [0x476d, 0x476d], /* CJK Ideograph Extension A */
- [0x476e, 0x476e], /* CJK Ideograph Extension A */
- [0x476f, 0x476f], /* CJK Ideograph Extension A */
- [0x4770, 0x4770], /* CJK Ideograph Extension A */
- [0x4771, 0x4771], /* CJK Ideograph Extension A */
- [0x4772, 0x4772], /* CJK Ideograph Extension A */
- [0x4773, 0x4773], /* CJK Ideograph Extension A */
- [0x4774, 0x4774], /* CJK Ideograph Extension A */
- [0x4775, 0x4775], /* CJK Ideograph Extension A */
- [0x4776, 0x4776], /* CJK Ideograph Extension A */
- [0x4777, 0x4777], /* CJK Ideograph Extension A */
- [0x4778, 0x4778], /* CJK Ideograph Extension A */
- [0x4779, 0x4779], /* CJK Ideograph Extension A */
- [0x477a, 0x477a], /* CJK Ideograph Extension A */
- [0x477b, 0x477b], /* CJK Ideograph Extension A */
- [0x477c, 0x477c], /* CJK Ideograph Extension A */
- [0x477d, 0x477d], /* CJK Ideograph Extension A */
- [0x477e, 0x477e], /* CJK Ideograph Extension A */
- [0x477f, 0x477f], /* CJK Ideograph Extension A */
- [0x4780, 0x4780], /* CJK Ideograph Extension A */
- [0x4781, 0x4781], /* CJK Ideograph Extension A */
- [0x4782, 0x4782], /* CJK Ideograph Extension A */
- [0x4783, 0x4783], /* CJK Ideograph Extension A */
- [0x4784, 0x4784], /* CJK Ideograph Extension A */
- [0x4785, 0x4785], /* CJK Ideograph Extension A */
- [0x4786, 0x4786], /* CJK Ideograph Extension A */
- [0x4787, 0x4787], /* CJK Ideograph Extension A */
- [0x4788, 0x4788], /* CJK Ideograph Extension A */
- [0x4789, 0x4789], /* CJK Ideograph Extension A */
- [0x478a, 0x478a], /* CJK Ideograph Extension A */
- [0x478b, 0x478b], /* CJK Ideograph Extension A */
- [0x478c, 0x478c], /* CJK Ideograph Extension A */
- [0x478d, 0x478d], /* CJK Ideograph Extension A */
- [0x478e, 0x478e], /* CJK Ideograph Extension A */
- [0x478f, 0x478f], /* CJK Ideograph Extension A */
- [0x4790, 0x4790], /* CJK Ideograph Extension A */
- [0x4791, 0x4791], /* CJK Ideograph Extension A */
- [0x4792, 0x4792], /* CJK Ideograph Extension A */
- [0x4793, 0x4793], /* CJK Ideograph Extension A */
- [0x4794, 0x4794], /* CJK Ideograph Extension A */
- [0x4795, 0x4795], /* CJK Ideograph Extension A */
- [0x4796, 0x4796], /* CJK Ideograph Extension A */
- [0x4797, 0x4797], /* CJK Ideograph Extension A */
- [0x4798, 0x4798], /* CJK Ideograph Extension A */
- [0x4799, 0x4799], /* CJK Ideograph Extension A */
- [0x479a, 0x479a], /* CJK Ideograph Extension A */
- [0x479b, 0x479b], /* CJK Ideograph Extension A */
- [0x479c, 0x479c], /* CJK Ideograph Extension A */
- [0x479d, 0x479d], /* CJK Ideograph Extension A */
- [0x479e, 0x479e], /* CJK Ideograph Extension A */
- [0x479f, 0x479f], /* CJK Ideograph Extension A */
- [0x47a0, 0x47a0], /* CJK Ideograph Extension A */
- [0x47a1, 0x47a1], /* CJK Ideograph Extension A */
- [0x47a2, 0x47a2], /* CJK Ideograph Extension A */
- [0x47a3, 0x47a3], /* CJK Ideograph Extension A */
- [0x47a4, 0x47a4], /* CJK Ideograph Extension A */
- [0x47a5, 0x47a5], /* CJK Ideograph Extension A */
- [0x47a6, 0x47a6], /* CJK Ideograph Extension A */
- [0x47a7, 0x47a7], /* CJK Ideograph Extension A */
- [0x47a8, 0x47a8], /* CJK Ideograph Extension A */
- [0x47a9, 0x47a9], /* CJK Ideograph Extension A */
- [0x47aa, 0x47aa], /* CJK Ideograph Extension A */
- [0x47ab, 0x47ab], /* CJK Ideograph Extension A */
- [0x47ac, 0x47ac], /* CJK Ideograph Extension A */
- [0x47ad, 0x47ad], /* CJK Ideograph Extension A */
- [0x47ae, 0x47ae], /* CJK Ideograph Extension A */
- [0x47af, 0x47af], /* CJK Ideograph Extension A */
- [0x47b0, 0x47b0], /* CJK Ideograph Extension A */
- [0x47b1, 0x47b1], /* CJK Ideograph Extension A */
- [0x47b2, 0x47b2], /* CJK Ideograph Extension A */
- [0x47b3, 0x47b3], /* CJK Ideograph Extension A */
- [0x47b4, 0x47b4], /* CJK Ideograph Extension A */
- [0x47b5, 0x47b5], /* CJK Ideograph Extension A */
- [0x47b6, 0x47b6], /* CJK Ideograph Extension A */
- [0x47b7, 0x47b7], /* CJK Ideograph Extension A */
- [0x47b8, 0x47b8], /* CJK Ideograph Extension A */
- [0x47b9, 0x47b9], /* CJK Ideograph Extension A */
- [0x47ba, 0x47ba], /* CJK Ideograph Extension A */
- [0x47bb, 0x47bb], /* CJK Ideograph Extension A */
- [0x47bc, 0x47bc], /* CJK Ideograph Extension A */
- [0x47bd, 0x47bd], /* CJK Ideograph Extension A */
- [0x47be, 0x47be], /* CJK Ideograph Extension A */
- [0x47bf, 0x47bf], /* CJK Ideograph Extension A */
- [0x47c0, 0x47c0], /* CJK Ideograph Extension A */
- [0x47c1, 0x47c1], /* CJK Ideograph Extension A */
- [0x47c2, 0x47c2], /* CJK Ideograph Extension A */
- [0x47c3, 0x47c3], /* CJK Ideograph Extension A */
- [0x47c4, 0x47c4], /* CJK Ideograph Extension A */
- [0x47c5, 0x47c5], /* CJK Ideograph Extension A */
- [0x47c6, 0x47c6], /* CJK Ideograph Extension A */
- [0x47c7, 0x47c7], /* CJK Ideograph Extension A */
- [0x47c8, 0x47c8], /* CJK Ideograph Extension A */
- [0x47c9, 0x47c9], /* CJK Ideograph Extension A */
- [0x47ca, 0x47ca], /* CJK Ideograph Extension A */
- [0x47cb, 0x47cb], /* CJK Ideograph Extension A */
- [0x47cc, 0x47cc], /* CJK Ideograph Extension A */
- [0x47cd, 0x47cd], /* CJK Ideograph Extension A */
- [0x47ce, 0x47ce], /* CJK Ideograph Extension A */
- [0x47cf, 0x47cf], /* CJK Ideograph Extension A */
- [0x47d0, 0x47d0], /* CJK Ideograph Extension A */
- [0x47d1, 0x47d1], /* CJK Ideograph Extension A */
- [0x47d2, 0x47d2], /* CJK Ideograph Extension A */
- [0x47d3, 0x47d3], /* CJK Ideograph Extension A */
- [0x47d4, 0x47d4], /* CJK Ideograph Extension A */
- [0x47d5, 0x47d5], /* CJK Ideograph Extension A */
- [0x47d6, 0x47d6], /* CJK Ideograph Extension A */
- [0x47d7, 0x47d7], /* CJK Ideograph Extension A */
- [0x47d8, 0x47d8], /* CJK Ideograph Extension A */
- [0x47d9, 0x47d9], /* CJK Ideograph Extension A */
- [0x47da, 0x47da], /* CJK Ideograph Extension A */
- [0x47db, 0x47db], /* CJK Ideograph Extension A */
- [0x47dc, 0x47dc], /* CJK Ideograph Extension A */
- [0x47dd, 0x47dd], /* CJK Ideograph Extension A */
- [0x47de, 0x47de], /* CJK Ideograph Extension A */
- [0x47df, 0x47df], /* CJK Ideograph Extension A */
- [0x47e0, 0x47e0], /* CJK Ideograph Extension A */
- [0x47e1, 0x47e1], /* CJK Ideograph Extension A */
- [0x47e2, 0x47e2], /* CJK Ideograph Extension A */
- [0x47e3, 0x47e3], /* CJK Ideograph Extension A */
- [0x47e4, 0x47e4], /* CJK Ideograph Extension A */
- [0x47e5, 0x47e5], /* CJK Ideograph Extension A */
- [0x47e6, 0x47e6], /* CJK Ideograph Extension A */
- [0x47e7, 0x47e7], /* CJK Ideograph Extension A */
- [0x47e8, 0x47e8], /* CJK Ideograph Extension A */
- [0x47e9, 0x47e9], /* CJK Ideograph Extension A */
- [0x47ea, 0x47ea], /* CJK Ideograph Extension A */
- [0x47eb, 0x47eb], /* CJK Ideograph Extension A */
- [0x47ec, 0x47ec], /* CJK Ideograph Extension A */
- [0x47ed, 0x47ed], /* CJK Ideograph Extension A */
- [0x47ee, 0x47ee], /* CJK Ideograph Extension A */
- [0x47ef, 0x47ef], /* CJK Ideograph Extension A */
- [0x47f0, 0x47f0], /* CJK Ideograph Extension A */
- [0x47f1, 0x47f1], /* CJK Ideograph Extension A */
- [0x47f2, 0x47f2], /* CJK Ideograph Extension A */
- [0x47f3, 0x47f3], /* CJK Ideograph Extension A */
- [0x47f4, 0x47f4], /* CJK Ideograph Extension A */
- [0x47f5, 0x47f5], /* CJK Ideograph Extension A */
- [0x47f6, 0x47f6], /* CJK Ideograph Extension A */
- [0x47f7, 0x47f7], /* CJK Ideograph Extension A */
- [0x47f8, 0x47f8], /* CJK Ideograph Extension A */
- [0x47f9, 0x47f9], /* CJK Ideograph Extension A */
- [0x47fa, 0x47fa], /* CJK Ideograph Extension A */
- [0x47fb, 0x47fb], /* CJK Ideograph Extension A */
- [0x47fc, 0x47fc], /* CJK Ideograph Extension A */
- [0x47fd, 0x47fd], /* CJK Ideograph Extension A */
- [0x47fe, 0x47fe], /* CJK Ideograph Extension A */
- [0x47ff, 0x47ff], /* CJK Ideograph Extension A */
- [0x4800, 0x4800], /* CJK Ideograph Extension A */
- [0x4801, 0x4801], /* CJK Ideograph Extension A */
- [0x4802, 0x4802], /* CJK Ideograph Extension A */
- [0x4803, 0x4803], /* CJK Ideograph Extension A */
- [0x4804, 0x4804], /* CJK Ideograph Extension A */
- [0x4805, 0x4805], /* CJK Ideograph Extension A */
- [0x4806, 0x4806], /* CJK Ideograph Extension A */
- [0x4807, 0x4807], /* CJK Ideograph Extension A */
- [0x4808, 0x4808], /* CJK Ideograph Extension A */
- [0x4809, 0x4809], /* CJK Ideograph Extension A */
- [0x480a, 0x480a], /* CJK Ideograph Extension A */
- [0x480b, 0x480b], /* CJK Ideograph Extension A */
- [0x480c, 0x480c], /* CJK Ideograph Extension A */
- [0x480d, 0x480d], /* CJK Ideograph Extension A */
- [0x480e, 0x480e], /* CJK Ideograph Extension A */
- [0x480f, 0x480f], /* CJK Ideograph Extension A */
- [0x4810, 0x4810], /* CJK Ideograph Extension A */
- [0x4811, 0x4811], /* CJK Ideograph Extension A */
- [0x4812, 0x4812], /* CJK Ideograph Extension A */
- [0x4813, 0x4813], /* CJK Ideograph Extension A */
- [0x4814, 0x4814], /* CJK Ideograph Extension A */
- [0x4815, 0x4815], /* CJK Ideograph Extension A */
- [0x4816, 0x4816], /* CJK Ideograph Extension A */
- [0x4817, 0x4817], /* CJK Ideograph Extension A */
- [0x4818, 0x4818], /* CJK Ideograph Extension A */
- [0x4819, 0x4819], /* CJK Ideograph Extension A */
- [0x481a, 0x481a], /* CJK Ideograph Extension A */
- [0x481b, 0x481b], /* CJK Ideograph Extension A */
- [0x481c, 0x481c], /* CJK Ideograph Extension A */
- [0x481d, 0x481d], /* CJK Ideograph Extension A */
- [0x481e, 0x481e], /* CJK Ideograph Extension A */
- [0x481f, 0x481f], /* CJK Ideograph Extension A */
- [0x4820, 0x4820], /* CJK Ideograph Extension A */
- [0x4821, 0x4821], /* CJK Ideograph Extension A */
- [0x4822, 0x4822], /* CJK Ideograph Extension A */
- [0x4823, 0x4823], /* CJK Ideograph Extension A */
- [0x4824, 0x4824], /* CJK Ideograph Extension A */
- [0x4825, 0x4825], /* CJK Ideograph Extension A */
- [0x4826, 0x4826], /* CJK Ideograph Extension A */
- [0x4827, 0x4827], /* CJK Ideograph Extension A */
- [0x4828, 0x4828], /* CJK Ideograph Extension A */
- [0x4829, 0x4829], /* CJK Ideograph Extension A */
- [0x482a, 0x482a], /* CJK Ideograph Extension A */
- [0x482b, 0x482b], /* CJK Ideograph Extension A */
- [0x482c, 0x482c], /* CJK Ideograph Extension A */
- [0x482d, 0x482d], /* CJK Ideograph Extension A */
- [0x482e, 0x482e], /* CJK Ideograph Extension A */
- [0x482f, 0x482f], /* CJK Ideograph Extension A */
- [0x4830, 0x4830], /* CJK Ideograph Extension A */
- [0x4831, 0x4831], /* CJK Ideograph Extension A */
- [0x4832, 0x4832], /* CJK Ideograph Extension A */
- [0x4833, 0x4833], /* CJK Ideograph Extension A */
- [0x4834, 0x4834], /* CJK Ideograph Extension A */
- [0x4835, 0x4835], /* CJK Ideograph Extension A */
- [0x4836, 0x4836], /* CJK Ideograph Extension A */
- [0x4837, 0x4837], /* CJK Ideograph Extension A */
- [0x4838, 0x4838], /* CJK Ideograph Extension A */
- [0x4839, 0x4839], /* CJK Ideograph Extension A */
- [0x483a, 0x483a], /* CJK Ideograph Extension A */
- [0x483b, 0x483b], /* CJK Ideograph Extension A */
- [0x483c, 0x483c], /* CJK Ideograph Extension A */
- [0x483d, 0x483d], /* CJK Ideograph Extension A */
- [0x483e, 0x483e], /* CJK Ideograph Extension A */
- [0x483f, 0x483f], /* CJK Ideograph Extension A */
- [0x4840, 0x4840], /* CJK Ideograph Extension A */
- [0x4841, 0x4841], /* CJK Ideograph Extension A */
- [0x4842, 0x4842], /* CJK Ideograph Extension A */
- [0x4843, 0x4843], /* CJK Ideograph Extension A */
- [0x4844, 0x4844], /* CJK Ideograph Extension A */
- [0x4845, 0x4845], /* CJK Ideograph Extension A */
- [0x4846, 0x4846], /* CJK Ideograph Extension A */
- [0x4847, 0x4847], /* CJK Ideograph Extension A */
- [0x4848, 0x4848], /* CJK Ideograph Extension A */
- [0x4849, 0x4849], /* CJK Ideograph Extension A */
- [0x484a, 0x484a], /* CJK Ideograph Extension A */
- [0x484b, 0x484b], /* CJK Ideograph Extension A */
- [0x484c, 0x484c], /* CJK Ideograph Extension A */
- [0x484d, 0x484d], /* CJK Ideograph Extension A */
- [0x484e, 0x484e], /* CJK Ideograph Extension A */
- [0x484f, 0x484f], /* CJK Ideograph Extension A */
- [0x4850, 0x4850], /* CJK Ideograph Extension A */
- [0x4851, 0x4851], /* CJK Ideograph Extension A */
- [0x4852, 0x4852], /* CJK Ideograph Extension A */
- [0x4853, 0x4853], /* CJK Ideograph Extension A */
- [0x4854, 0x4854], /* CJK Ideograph Extension A */
- [0x4855, 0x4855], /* CJK Ideograph Extension A */
- [0x4856, 0x4856], /* CJK Ideograph Extension A */
- [0x4857, 0x4857], /* CJK Ideograph Extension A */
- [0x4858, 0x4858], /* CJK Ideograph Extension A */
- [0x4859, 0x4859], /* CJK Ideograph Extension A */
- [0x485a, 0x485a], /* CJK Ideograph Extension A */
- [0x485b, 0x485b], /* CJK Ideograph Extension A */
- [0x485c, 0x485c], /* CJK Ideograph Extension A */
- [0x485d, 0x485d], /* CJK Ideograph Extension A */
- [0x485e, 0x485e], /* CJK Ideograph Extension A */
- [0x485f, 0x485f], /* CJK Ideograph Extension A */
- [0x4860, 0x4860], /* CJK Ideograph Extension A */
- [0x4861, 0x4861], /* CJK Ideograph Extension A */
- [0x4862, 0x4862], /* CJK Ideograph Extension A */
- [0x4863, 0x4863], /* CJK Ideograph Extension A */
- [0x4864, 0x4864], /* CJK Ideograph Extension A */
- [0x4865, 0x4865], /* CJK Ideograph Extension A */
- [0x4866, 0x4866], /* CJK Ideograph Extension A */
- [0x4867, 0x4867], /* CJK Ideograph Extension A */
- [0x4868, 0x4868], /* CJK Ideograph Extension A */
- [0x4869, 0x4869], /* CJK Ideograph Extension A */
- [0x486a, 0x486a], /* CJK Ideograph Extension A */
- [0x486b, 0x486b], /* CJK Ideograph Extension A */
- [0x486c, 0x486c], /* CJK Ideograph Extension A */
- [0x486d, 0x486d], /* CJK Ideograph Extension A */
- [0x486e, 0x486e], /* CJK Ideograph Extension A */
- [0x486f, 0x486f], /* CJK Ideograph Extension A */
- [0x4870, 0x4870], /* CJK Ideograph Extension A */
- [0x4871, 0x4871], /* CJK Ideograph Extension A */
- [0x4872, 0x4872], /* CJK Ideograph Extension A */
- [0x4873, 0x4873], /* CJK Ideograph Extension A */
- [0x4874, 0x4874], /* CJK Ideograph Extension A */
- [0x4875, 0x4875], /* CJK Ideograph Extension A */
- [0x4876, 0x4876], /* CJK Ideograph Extension A */
- [0x4877, 0x4877], /* CJK Ideograph Extension A */
- [0x4878, 0x4878], /* CJK Ideograph Extension A */
- [0x4879, 0x4879], /* CJK Ideograph Extension A */
- [0x487a, 0x487a], /* CJK Ideograph Extension A */
- [0x487b, 0x487b], /* CJK Ideograph Extension A */
- [0x487c, 0x487c], /* CJK Ideograph Extension A */
- [0x487d, 0x487d], /* CJK Ideograph Extension A */
- [0x487e, 0x487e], /* CJK Ideograph Extension A */
- [0x487f, 0x487f], /* CJK Ideograph Extension A */
- [0x4880, 0x4880], /* CJK Ideograph Extension A */
- [0x4881, 0x4881], /* CJK Ideograph Extension A */
- [0x4882, 0x4882], /* CJK Ideograph Extension A */
- [0x4883, 0x4883], /* CJK Ideograph Extension A */
- [0x4884, 0x4884], /* CJK Ideograph Extension A */
- [0x4885, 0x4885], /* CJK Ideograph Extension A */
- [0x4886, 0x4886], /* CJK Ideograph Extension A */
- [0x4887, 0x4887], /* CJK Ideograph Extension A */
- [0x4888, 0x4888], /* CJK Ideograph Extension A */
- [0x4889, 0x4889], /* CJK Ideograph Extension A */
- [0x488a, 0x488a], /* CJK Ideograph Extension A */
- [0x488b, 0x488b], /* CJK Ideograph Extension A */
- [0x488c, 0x488c], /* CJK Ideograph Extension A */
- [0x488d, 0x488d], /* CJK Ideograph Extension A */
- [0x488e, 0x488e], /* CJK Ideograph Extension A */
- [0x488f, 0x488f], /* CJK Ideograph Extension A */
- [0x4890, 0x4890], /* CJK Ideograph Extension A */
- [0x4891, 0x4891], /* CJK Ideograph Extension A */
- [0x4892, 0x4892], /* CJK Ideograph Extension A */
- [0x4893, 0x4893], /* CJK Ideograph Extension A */
- [0x4894, 0x4894], /* CJK Ideograph Extension A */
- [0x4895, 0x4895], /* CJK Ideograph Extension A */
- [0x4896, 0x4896], /* CJK Ideograph Extension A */
- [0x4897, 0x4897], /* CJK Ideograph Extension A */
- [0x4898, 0x4898], /* CJK Ideograph Extension A */
- [0x4899, 0x4899], /* CJK Ideograph Extension A */
- [0x489a, 0x489a], /* CJK Ideograph Extension A */
- [0x489b, 0x489b], /* CJK Ideograph Extension A */
- [0x489c, 0x489c], /* CJK Ideograph Extension A */
- [0x489d, 0x489d], /* CJK Ideograph Extension A */
- [0x489e, 0x489e], /* CJK Ideograph Extension A */
- [0x489f, 0x489f], /* CJK Ideograph Extension A */
- [0x48a0, 0x48a0], /* CJK Ideograph Extension A */
- [0x48a1, 0x48a1], /* CJK Ideograph Extension A */
- [0x48a2, 0x48a2], /* CJK Ideograph Extension A */
- [0x48a3, 0x48a3], /* CJK Ideograph Extension A */
- [0x48a4, 0x48a4], /* CJK Ideograph Extension A */
- [0x48a5, 0x48a5], /* CJK Ideograph Extension A */
- [0x48a6, 0x48a6], /* CJK Ideograph Extension A */
- [0x48a7, 0x48a7], /* CJK Ideograph Extension A */
- [0x48a8, 0x48a8], /* CJK Ideograph Extension A */
- [0x48a9, 0x48a9], /* CJK Ideograph Extension A */
- [0x48aa, 0x48aa], /* CJK Ideograph Extension A */
- [0x48ab, 0x48ab], /* CJK Ideograph Extension A */
- [0x48ac, 0x48ac], /* CJK Ideograph Extension A */
- [0x48ad, 0x48ad], /* CJK Ideograph Extension A */
- [0x48ae, 0x48ae], /* CJK Ideograph Extension A */
- [0x48af, 0x48af], /* CJK Ideograph Extension A */
- [0x48b0, 0x48b0], /* CJK Ideograph Extension A */
- [0x48b1, 0x48b1], /* CJK Ideograph Extension A */
- [0x48b2, 0x48b2], /* CJK Ideograph Extension A */
- [0x48b3, 0x48b3], /* CJK Ideograph Extension A */
- [0x48b4, 0x48b4], /* CJK Ideograph Extension A */
- [0x48b5, 0x48b5], /* CJK Ideograph Extension A */
- [0x48b6, 0x48b6], /* CJK Ideograph Extension A */
- [0x48b7, 0x48b7], /* CJK Ideograph Extension A */
- [0x48b8, 0x48b8], /* CJK Ideograph Extension A */
- [0x48b9, 0x48b9], /* CJK Ideograph Extension A */
- [0x48ba, 0x48ba], /* CJK Ideograph Extension A */
- [0x48bb, 0x48bb], /* CJK Ideograph Extension A */
- [0x48bc, 0x48bc], /* CJK Ideograph Extension A */
- [0x48bd, 0x48bd], /* CJK Ideograph Extension A */
- [0x48be, 0x48be], /* CJK Ideograph Extension A */
- [0x48bf, 0x48bf], /* CJK Ideograph Extension A */
- [0x48c0, 0x48c0], /* CJK Ideograph Extension A */
- [0x48c1, 0x48c1], /* CJK Ideograph Extension A */
- [0x48c2, 0x48c2], /* CJK Ideograph Extension A */
- [0x48c3, 0x48c3], /* CJK Ideograph Extension A */
- [0x48c4, 0x48c4], /* CJK Ideograph Extension A */
- [0x48c5, 0x48c5], /* CJK Ideograph Extension A */
- [0x48c6, 0x48c6], /* CJK Ideograph Extension A */
- [0x48c7, 0x48c7], /* CJK Ideograph Extension A */
- [0x48c8, 0x48c8], /* CJK Ideograph Extension A */
- [0x48c9, 0x48c9], /* CJK Ideograph Extension A */
- [0x48ca, 0x48ca], /* CJK Ideograph Extension A */
- [0x48cb, 0x48cb], /* CJK Ideograph Extension A */
- [0x48cc, 0x48cc], /* CJK Ideograph Extension A */
- [0x48cd, 0x48cd], /* CJK Ideograph Extension A */
- [0x48ce, 0x48ce], /* CJK Ideograph Extension A */
- [0x48cf, 0x48cf], /* CJK Ideograph Extension A */
- [0x48d0, 0x48d0], /* CJK Ideograph Extension A */
- [0x48d1, 0x48d1], /* CJK Ideograph Extension A */
- [0x48d2, 0x48d2], /* CJK Ideograph Extension A */
- [0x48d3, 0x48d3], /* CJK Ideograph Extension A */
- [0x48d4, 0x48d4], /* CJK Ideograph Extension A */
- [0x48d5, 0x48d5], /* CJK Ideograph Extension A */
- [0x48d6, 0x48d6], /* CJK Ideograph Extension A */
- [0x48d7, 0x48d7], /* CJK Ideograph Extension A */
- [0x48d8, 0x48d8], /* CJK Ideograph Extension A */
- [0x48d9, 0x48d9], /* CJK Ideograph Extension A */
- [0x48da, 0x48da], /* CJK Ideograph Extension A */
- [0x48db, 0x48db], /* CJK Ideograph Extension A */
- [0x48dc, 0x48dc], /* CJK Ideograph Extension A */
- [0x48dd, 0x48dd], /* CJK Ideograph Extension A */
- [0x48de, 0x48de], /* CJK Ideograph Extension A */
- [0x48df, 0x48df], /* CJK Ideograph Extension A */
- [0x48e0, 0x48e0], /* CJK Ideograph Extension A */
- [0x48e1, 0x48e1], /* CJK Ideograph Extension A */
- [0x48e2, 0x48e2], /* CJK Ideograph Extension A */
- [0x48e3, 0x48e3], /* CJK Ideograph Extension A */
- [0x48e4, 0x48e4], /* CJK Ideograph Extension A */
- [0x48e5, 0x48e5], /* CJK Ideograph Extension A */
- [0x48e6, 0x48e6], /* CJK Ideograph Extension A */
- [0x48e7, 0x48e7], /* CJK Ideograph Extension A */
- [0x48e8, 0x48e8], /* CJK Ideograph Extension A */
- [0x48e9, 0x48e9], /* CJK Ideograph Extension A */
- [0x48ea, 0x48ea], /* CJK Ideograph Extension A */
- [0x48eb, 0x48eb], /* CJK Ideograph Extension A */
- [0x48ec, 0x48ec], /* CJK Ideograph Extension A */
- [0x48ed, 0x48ed], /* CJK Ideograph Extension A */
- [0x48ee, 0x48ee], /* CJK Ideograph Extension A */
- [0x48ef, 0x48ef], /* CJK Ideograph Extension A */
- [0x48f0, 0x48f0], /* CJK Ideograph Extension A */
- [0x48f1, 0x48f1], /* CJK Ideograph Extension A */
- [0x48f2, 0x48f2], /* CJK Ideograph Extension A */
- [0x48f3, 0x48f3], /* CJK Ideograph Extension A */
- [0x48f4, 0x48f4], /* CJK Ideograph Extension A */
- [0x48f5, 0x48f5], /* CJK Ideograph Extension A */
- [0x48f6, 0x48f6], /* CJK Ideograph Extension A */
- [0x48f7, 0x48f7], /* CJK Ideograph Extension A */
- [0x48f8, 0x48f8], /* CJK Ideograph Extension A */
- [0x48f9, 0x48f9], /* CJK Ideograph Extension A */
- [0x48fa, 0x48fa], /* CJK Ideograph Extension A */
- [0x48fb, 0x48fb], /* CJK Ideograph Extension A */
- [0x48fc, 0x48fc], /* CJK Ideograph Extension A */
- [0x48fd, 0x48fd], /* CJK Ideograph Extension A */
- [0x48fe, 0x48fe], /* CJK Ideograph Extension A */
- [0x48ff, 0x48ff], /* CJK Ideograph Extension A */
- [0x4900, 0x4900], /* CJK Ideograph Extension A */
- [0x4901, 0x4901], /* CJK Ideograph Extension A */
- [0x4902, 0x4902], /* CJK Ideograph Extension A */
- [0x4903, 0x4903], /* CJK Ideograph Extension A */
- [0x4904, 0x4904], /* CJK Ideograph Extension A */
- [0x4905, 0x4905], /* CJK Ideograph Extension A */
- [0x4906, 0x4906], /* CJK Ideograph Extension A */
- [0x4907, 0x4907], /* CJK Ideograph Extension A */
- [0x4908, 0x4908], /* CJK Ideograph Extension A */
- [0x4909, 0x4909], /* CJK Ideograph Extension A */
- [0x490a, 0x490a], /* CJK Ideograph Extension A */
- [0x490b, 0x490b], /* CJK Ideograph Extension A */
- [0x490c, 0x490c], /* CJK Ideograph Extension A */
- [0x490d, 0x490d], /* CJK Ideograph Extension A */
- [0x490e, 0x490e], /* CJK Ideograph Extension A */
- [0x490f, 0x490f], /* CJK Ideograph Extension A */
- [0x4910, 0x4910], /* CJK Ideograph Extension A */
- [0x4911, 0x4911], /* CJK Ideograph Extension A */
- [0x4912, 0x4912], /* CJK Ideograph Extension A */
- [0x4913, 0x4913], /* CJK Ideograph Extension A */
- [0x4914, 0x4914], /* CJK Ideograph Extension A */
- [0x4915, 0x4915], /* CJK Ideograph Extension A */
- [0x4916, 0x4916], /* CJK Ideograph Extension A */
- [0x4917, 0x4917], /* CJK Ideograph Extension A */
- [0x4918, 0x4918], /* CJK Ideograph Extension A */
- [0x4919, 0x4919], /* CJK Ideograph Extension A */
- [0x491a, 0x491a], /* CJK Ideograph Extension A */
- [0x491b, 0x491b], /* CJK Ideograph Extension A */
- [0x491c, 0x491c], /* CJK Ideograph Extension A */
- [0x491d, 0x491d], /* CJK Ideograph Extension A */
- [0x491e, 0x491e], /* CJK Ideograph Extension A */
- [0x491f, 0x491f], /* CJK Ideograph Extension A */
- [0x4920, 0x4920], /* CJK Ideograph Extension A */
- [0x4921, 0x4921], /* CJK Ideograph Extension A */
- [0x4922, 0x4922], /* CJK Ideograph Extension A */
- [0x4923, 0x4923], /* CJK Ideograph Extension A */
- [0x4924, 0x4924], /* CJK Ideograph Extension A */
- [0x4925, 0x4925], /* CJK Ideograph Extension A */
- [0x4926, 0x4926], /* CJK Ideograph Extension A */
- [0x4927, 0x4927], /* CJK Ideograph Extension A */
- [0x4928, 0x4928], /* CJK Ideograph Extension A */
- [0x4929, 0x4929], /* CJK Ideograph Extension A */
- [0x492a, 0x492a], /* CJK Ideograph Extension A */
- [0x492b, 0x492b], /* CJK Ideograph Extension A */
- [0x492c, 0x492c], /* CJK Ideograph Extension A */
- [0x492d, 0x492d], /* CJK Ideograph Extension A */
- [0x492e, 0x492e], /* CJK Ideograph Extension A */
- [0x492f, 0x492f], /* CJK Ideograph Extension A */
- [0x4930, 0x4930], /* CJK Ideograph Extension A */
- [0x4931, 0x4931], /* CJK Ideograph Extension A */
- [0x4932, 0x4932], /* CJK Ideograph Extension A */
- [0x4933, 0x4933], /* CJK Ideograph Extension A */
- [0x4934, 0x4934], /* CJK Ideograph Extension A */
- [0x4935, 0x4935], /* CJK Ideograph Extension A */
- [0x4936, 0x4936], /* CJK Ideograph Extension A */
- [0x4937, 0x4937], /* CJK Ideograph Extension A */
- [0x4938, 0x4938], /* CJK Ideograph Extension A */
- [0x4939, 0x4939], /* CJK Ideograph Extension A */
- [0x493a, 0x493a], /* CJK Ideograph Extension A */
- [0x493b, 0x493b], /* CJK Ideograph Extension A */
- [0x493c, 0x493c], /* CJK Ideograph Extension A */
- [0x493d, 0x493d], /* CJK Ideograph Extension A */
- [0x493e, 0x493e], /* CJK Ideograph Extension A */
- [0x493f, 0x493f], /* CJK Ideograph Extension A */
- [0x4940, 0x4940], /* CJK Ideograph Extension A */
- [0x4941, 0x4941], /* CJK Ideograph Extension A */
- [0x4942, 0x4942], /* CJK Ideograph Extension A */
- [0x4943, 0x4943], /* CJK Ideograph Extension A */
- [0x4944, 0x4944], /* CJK Ideograph Extension A */
- [0x4945, 0x4945], /* CJK Ideograph Extension A */
- [0x4946, 0x4946], /* CJK Ideograph Extension A */
- [0x4947, 0x4947], /* CJK Ideograph Extension A */
- [0x4948, 0x4948], /* CJK Ideograph Extension A */
- [0x4949, 0x4949], /* CJK Ideograph Extension A */
- [0x494a, 0x494a], /* CJK Ideograph Extension A */
- [0x494b, 0x494b], /* CJK Ideograph Extension A */
- [0x494c, 0x494c], /* CJK Ideograph Extension A */
- [0x494d, 0x494d], /* CJK Ideograph Extension A */
- [0x494e, 0x494e], /* CJK Ideograph Extension A */
- [0x494f, 0x494f], /* CJK Ideograph Extension A */
- [0x4950, 0x4950], /* CJK Ideograph Extension A */
- [0x4951, 0x4951], /* CJK Ideograph Extension A */
- [0x4952, 0x4952], /* CJK Ideograph Extension A */
- [0x4953, 0x4953], /* CJK Ideograph Extension A */
- [0x4954, 0x4954], /* CJK Ideograph Extension A */
- [0x4955, 0x4955], /* CJK Ideograph Extension A */
- [0x4956, 0x4956], /* CJK Ideograph Extension A */
- [0x4957, 0x4957], /* CJK Ideograph Extension A */
- [0x4958, 0x4958], /* CJK Ideograph Extension A */
- [0x4959, 0x4959], /* CJK Ideograph Extension A */
- [0x495a, 0x495a], /* CJK Ideograph Extension A */
- [0x495b, 0x495b], /* CJK Ideograph Extension A */
- [0x495c, 0x495c], /* CJK Ideograph Extension A */
- [0x495d, 0x495d], /* CJK Ideograph Extension A */
- [0x495e, 0x495e], /* CJK Ideograph Extension A */
- [0x495f, 0x495f], /* CJK Ideograph Extension A */
- [0x4960, 0x4960], /* CJK Ideograph Extension A */
- [0x4961, 0x4961], /* CJK Ideograph Extension A */
- [0x4962, 0x4962], /* CJK Ideograph Extension A */
- [0x4963, 0x4963], /* CJK Ideograph Extension A */
- [0x4964, 0x4964], /* CJK Ideograph Extension A */
- [0x4965, 0x4965], /* CJK Ideograph Extension A */
- [0x4966, 0x4966], /* CJK Ideograph Extension A */
- [0x4967, 0x4967], /* CJK Ideograph Extension A */
- [0x4968, 0x4968], /* CJK Ideograph Extension A */
- [0x4969, 0x4969], /* CJK Ideograph Extension A */
- [0x496a, 0x496a], /* CJK Ideograph Extension A */
- [0x496b, 0x496b], /* CJK Ideograph Extension A */
- [0x496c, 0x496c], /* CJK Ideograph Extension A */
- [0x496d, 0x496d], /* CJK Ideograph Extension A */
- [0x496e, 0x496e], /* CJK Ideograph Extension A */
- [0x496f, 0x496f], /* CJK Ideograph Extension A */
- [0x4970, 0x4970], /* CJK Ideograph Extension A */
- [0x4971, 0x4971], /* CJK Ideograph Extension A */
- [0x4972, 0x4972], /* CJK Ideograph Extension A */
- [0x4973, 0x4973], /* CJK Ideograph Extension A */
- [0x4974, 0x4974], /* CJK Ideograph Extension A */
- [0x4975, 0x4975], /* CJK Ideograph Extension A */
- [0x4976, 0x4976], /* CJK Ideograph Extension A */
- [0x4977, 0x4977], /* CJK Ideograph Extension A */
- [0x4978, 0x4978], /* CJK Ideograph Extension A */
- [0x4979, 0x4979], /* CJK Ideograph Extension A */
- [0x497a, 0x497a], /* CJK Ideograph Extension A */
- [0x497b, 0x497b], /* CJK Ideograph Extension A */
- [0x497c, 0x497c], /* CJK Ideograph Extension A */
- [0x497d, 0x497d], /* CJK Ideograph Extension A */
- [0x497e, 0x497e], /* CJK Ideograph Extension A */
- [0x497f, 0x497f], /* CJK Ideograph Extension A */
- [0x4980, 0x4980], /* CJK Ideograph Extension A */
- [0x4981, 0x4981], /* CJK Ideograph Extension A */
- [0x4982, 0x4982], /* CJK Ideograph Extension A */
- [0x4983, 0x4983], /* CJK Ideograph Extension A */
- [0x4984, 0x4984], /* CJK Ideograph Extension A */
- [0x4985, 0x4985], /* CJK Ideograph Extension A */
- [0x4986, 0x4986], /* CJK Ideograph Extension A */
- [0x4987, 0x4987], /* CJK Ideograph Extension A */
- [0x4988, 0x4988], /* CJK Ideograph Extension A */
- [0x4989, 0x4989], /* CJK Ideograph Extension A */
- [0x498a, 0x498a], /* CJK Ideograph Extension A */
- [0x498b, 0x498b], /* CJK Ideograph Extension A */
- [0x498c, 0x498c], /* CJK Ideograph Extension A */
- [0x498d, 0x498d], /* CJK Ideograph Extension A */
- [0x498e, 0x498e], /* CJK Ideograph Extension A */
- [0x498f, 0x498f], /* CJK Ideograph Extension A */
- [0x4990, 0x4990], /* CJK Ideograph Extension A */
- [0x4991, 0x4991], /* CJK Ideograph Extension A */
- [0x4992, 0x4992], /* CJK Ideograph Extension A */
- [0x4993, 0x4993], /* CJK Ideograph Extension A */
- [0x4994, 0x4994], /* CJK Ideograph Extension A */
- [0x4995, 0x4995], /* CJK Ideograph Extension A */
- [0x4996, 0x4996], /* CJK Ideograph Extension A */
- [0x4997, 0x4997], /* CJK Ideograph Extension A */
- [0x4998, 0x4998], /* CJK Ideograph Extension A */
- [0x4999, 0x4999], /* CJK Ideograph Extension A */
- [0x499a, 0x499a], /* CJK Ideograph Extension A */
- [0x499b, 0x499b], /* CJK Ideograph Extension A */
- [0x499c, 0x499c], /* CJK Ideograph Extension A */
- [0x499d, 0x499d], /* CJK Ideograph Extension A */
- [0x499e, 0x499e], /* CJK Ideograph Extension A */
- [0x499f, 0x499f], /* CJK Ideograph Extension A */
- [0x49a0, 0x49a0], /* CJK Ideograph Extension A */
- [0x49a1, 0x49a1], /* CJK Ideograph Extension A */
- [0x49a2, 0x49a2], /* CJK Ideograph Extension A */
- [0x49a3, 0x49a3], /* CJK Ideograph Extension A */
- [0x49a4, 0x49a4], /* CJK Ideograph Extension A */
- [0x49a5, 0x49a5], /* CJK Ideograph Extension A */
- [0x49a6, 0x49a6], /* CJK Ideograph Extension A */
- [0x49a7, 0x49a7], /* CJK Ideograph Extension A */
- [0x49a8, 0x49a8], /* CJK Ideograph Extension A */
- [0x49a9, 0x49a9], /* CJK Ideograph Extension A */
- [0x49aa, 0x49aa], /* CJK Ideograph Extension A */
- [0x49ab, 0x49ab], /* CJK Ideograph Extension A */
- [0x49ac, 0x49ac], /* CJK Ideograph Extension A */
- [0x49ad, 0x49ad], /* CJK Ideograph Extension A */
- [0x49ae, 0x49ae], /* CJK Ideograph Extension A */
- [0x49af, 0x49af], /* CJK Ideograph Extension A */
- [0x49b0, 0x49b0], /* CJK Ideograph Extension A */
- [0x49b1, 0x49b1], /* CJK Ideograph Extension A */
- [0x49b2, 0x49b2], /* CJK Ideograph Extension A */
- [0x49b3, 0x49b3], /* CJK Ideograph Extension A */
- [0x49b4, 0x49b4], /* CJK Ideograph Extension A */
- [0x49b5, 0x49b5], /* CJK Ideograph Extension A */
- [0x49b6, 0x49b6], /* CJK Ideograph Extension A */
- [0x49b7, 0x49b7], /* CJK Ideograph Extension A */
- [0x49b8, 0x49b8], /* CJK Ideograph Extension A */
- [0x49b9, 0x49b9], /* CJK Ideograph Extension A */
- [0x49ba, 0x49ba], /* CJK Ideograph Extension A */
- [0x49bb, 0x49bb], /* CJK Ideograph Extension A */
- [0x49bc, 0x49bc], /* CJK Ideograph Extension A */
- [0x49bd, 0x49bd], /* CJK Ideograph Extension A */
- [0x49be, 0x49be], /* CJK Ideograph Extension A */
- [0x49bf, 0x49bf], /* CJK Ideograph Extension A */
- [0x49c0, 0x49c0], /* CJK Ideograph Extension A */
- [0x49c1, 0x49c1], /* CJK Ideograph Extension A */
- [0x49c2, 0x49c2], /* CJK Ideograph Extension A */
- [0x49c3, 0x49c3], /* CJK Ideograph Extension A */
- [0x49c4, 0x49c4], /* CJK Ideograph Extension A */
- [0x49c5, 0x49c5], /* CJK Ideograph Extension A */
- [0x49c6, 0x49c6], /* CJK Ideograph Extension A */
- [0x49c7, 0x49c7], /* CJK Ideograph Extension A */
- [0x49c8, 0x49c8], /* CJK Ideograph Extension A */
- [0x49c9, 0x49c9], /* CJK Ideograph Extension A */
- [0x49ca, 0x49ca], /* CJK Ideograph Extension A */
- [0x49cb, 0x49cb], /* CJK Ideograph Extension A */
- [0x49cc, 0x49cc], /* CJK Ideograph Extension A */
- [0x49cd, 0x49cd], /* CJK Ideograph Extension A */
- [0x49ce, 0x49ce], /* CJK Ideograph Extension A */
- [0x49cf, 0x49cf], /* CJK Ideograph Extension A */
- [0x49d0, 0x49d0], /* CJK Ideograph Extension A */
- [0x49d1, 0x49d1], /* CJK Ideograph Extension A */
- [0x49d2, 0x49d2], /* CJK Ideograph Extension A */
- [0x49d3, 0x49d3], /* CJK Ideograph Extension A */
- [0x49d4, 0x49d4], /* CJK Ideograph Extension A */
- [0x49d5, 0x49d5], /* CJK Ideograph Extension A */
- [0x49d6, 0x49d6], /* CJK Ideograph Extension A */
- [0x49d7, 0x49d7], /* CJK Ideograph Extension A */
- [0x49d8, 0x49d8], /* CJK Ideograph Extension A */
- [0x49d9, 0x49d9], /* CJK Ideograph Extension A */
- [0x49da, 0x49da], /* CJK Ideograph Extension A */
- [0x49db, 0x49db], /* CJK Ideograph Extension A */
- [0x49dc, 0x49dc], /* CJK Ideograph Extension A */
- [0x49dd, 0x49dd], /* CJK Ideograph Extension A */
- [0x49de, 0x49de], /* CJK Ideograph Extension A */
- [0x49df, 0x49df], /* CJK Ideograph Extension A */
- [0x49e0, 0x49e0], /* CJK Ideograph Extension A */
- [0x49e1, 0x49e1], /* CJK Ideograph Extension A */
- [0x49e2, 0x49e2], /* CJK Ideograph Extension A */
- [0x49e3, 0x49e3], /* CJK Ideograph Extension A */
- [0x49e4, 0x49e4], /* CJK Ideograph Extension A */
- [0x49e5, 0x49e5], /* CJK Ideograph Extension A */
- [0x49e6, 0x49e6], /* CJK Ideograph Extension A */
- [0x49e7, 0x49e7], /* CJK Ideograph Extension A */
- [0x49e8, 0x49e8], /* CJK Ideograph Extension A */
- [0x49e9, 0x49e9], /* CJK Ideograph Extension A */
- [0x49ea, 0x49ea], /* CJK Ideograph Extension A */
- [0x49eb, 0x49eb], /* CJK Ideograph Extension A */
- [0x49ec, 0x49ec], /* CJK Ideograph Extension A */
- [0x49ed, 0x49ed], /* CJK Ideograph Extension A */
- [0x49ee, 0x49ee], /* CJK Ideograph Extension A */
- [0x49ef, 0x49ef], /* CJK Ideograph Extension A */
- [0x49f0, 0x49f0], /* CJK Ideograph Extension A */
- [0x49f1, 0x49f1], /* CJK Ideograph Extension A */
- [0x49f2, 0x49f2], /* CJK Ideograph Extension A */
- [0x49f3, 0x49f3], /* CJK Ideograph Extension A */
- [0x49f4, 0x49f4], /* CJK Ideograph Extension A */
- [0x49f5, 0x49f5], /* CJK Ideograph Extension A */
- [0x49f6, 0x49f6], /* CJK Ideograph Extension A */
- [0x49f7, 0x49f7], /* CJK Ideograph Extension A */
- [0x49f8, 0x49f8], /* CJK Ideograph Extension A */
- [0x49f9, 0x49f9], /* CJK Ideograph Extension A */
- [0x49fa, 0x49fa], /* CJK Ideograph Extension A */
- [0x49fb, 0x49fb], /* CJK Ideograph Extension A */
- [0x49fc, 0x49fc], /* CJK Ideograph Extension A */
- [0x49fd, 0x49fd], /* CJK Ideograph Extension A */
- [0x49fe, 0x49fe], /* CJK Ideograph Extension A */
- [0x49ff, 0x49ff], /* CJK Ideograph Extension A */
- [0x4a00, 0x4a00], /* CJK Ideograph Extension A */
- [0x4a01, 0x4a01], /* CJK Ideograph Extension A */
- [0x4a02, 0x4a02], /* CJK Ideograph Extension A */
- [0x4a03, 0x4a03], /* CJK Ideograph Extension A */
- [0x4a04, 0x4a04], /* CJK Ideograph Extension A */
- [0x4a05, 0x4a05], /* CJK Ideograph Extension A */
- [0x4a06, 0x4a06], /* CJK Ideograph Extension A */
- [0x4a07, 0x4a07], /* CJK Ideograph Extension A */
- [0x4a08, 0x4a08], /* CJK Ideograph Extension A */
- [0x4a09, 0x4a09], /* CJK Ideograph Extension A */
- [0x4a0a, 0x4a0a], /* CJK Ideograph Extension A */
- [0x4a0b, 0x4a0b], /* CJK Ideograph Extension A */
- [0x4a0c, 0x4a0c], /* CJK Ideograph Extension A */
- [0x4a0d, 0x4a0d], /* CJK Ideograph Extension A */
- [0x4a0e, 0x4a0e], /* CJK Ideograph Extension A */
- [0x4a0f, 0x4a0f], /* CJK Ideograph Extension A */
- [0x4a10, 0x4a10], /* CJK Ideograph Extension A */
- [0x4a11, 0x4a11], /* CJK Ideograph Extension A */
- [0x4a12, 0x4a12], /* CJK Ideograph Extension A */
- [0x4a13, 0x4a13], /* CJK Ideograph Extension A */
- [0x4a14, 0x4a14], /* CJK Ideograph Extension A */
- [0x4a15, 0x4a15], /* CJK Ideograph Extension A */
- [0x4a16, 0x4a16], /* CJK Ideograph Extension A */
- [0x4a17, 0x4a17], /* CJK Ideograph Extension A */
- [0x4a18, 0x4a18], /* CJK Ideograph Extension A */
- [0x4a19, 0x4a19], /* CJK Ideograph Extension A */
- [0x4a1a, 0x4a1a], /* CJK Ideograph Extension A */
- [0x4a1b, 0x4a1b], /* CJK Ideograph Extension A */
- [0x4a1c, 0x4a1c], /* CJK Ideograph Extension A */
- [0x4a1d, 0x4a1d], /* CJK Ideograph Extension A */
- [0x4a1e, 0x4a1e], /* CJK Ideograph Extension A */
- [0x4a1f, 0x4a1f], /* CJK Ideograph Extension A */
- [0x4a20, 0x4a20], /* CJK Ideograph Extension A */
- [0x4a21, 0x4a21], /* CJK Ideograph Extension A */
- [0x4a22, 0x4a22], /* CJK Ideograph Extension A */
- [0x4a23, 0x4a23], /* CJK Ideograph Extension A */
- [0x4a24, 0x4a24], /* CJK Ideograph Extension A */
- [0x4a25, 0x4a25], /* CJK Ideograph Extension A */
- [0x4a26, 0x4a26], /* CJK Ideograph Extension A */
- [0x4a27, 0x4a27], /* CJK Ideograph Extension A */
- [0x4a28, 0x4a28], /* CJK Ideograph Extension A */
- [0x4a29, 0x4a29], /* CJK Ideograph Extension A */
- [0x4a2a, 0x4a2a], /* CJK Ideograph Extension A */
- [0x4a2b, 0x4a2b], /* CJK Ideograph Extension A */
- [0x4a2c, 0x4a2c], /* CJK Ideograph Extension A */
- [0x4a2d, 0x4a2d], /* CJK Ideograph Extension A */
- [0x4a2e, 0x4a2e], /* CJK Ideograph Extension A */
- [0x4a2f, 0x4a2f], /* CJK Ideograph Extension A */
- [0x4a30, 0x4a30], /* CJK Ideograph Extension A */
- [0x4a31, 0x4a31], /* CJK Ideograph Extension A */
- [0x4a32, 0x4a32], /* CJK Ideograph Extension A */
- [0x4a33, 0x4a33], /* CJK Ideograph Extension A */
- [0x4a34, 0x4a34], /* CJK Ideograph Extension A */
- [0x4a35, 0x4a35], /* CJK Ideograph Extension A */
- [0x4a36, 0x4a36], /* CJK Ideograph Extension A */
- [0x4a37, 0x4a37], /* CJK Ideograph Extension A */
- [0x4a38, 0x4a38], /* CJK Ideograph Extension A */
- [0x4a39, 0x4a39], /* CJK Ideograph Extension A */
- [0x4a3a, 0x4a3a], /* CJK Ideograph Extension A */
- [0x4a3b, 0x4a3b], /* CJK Ideograph Extension A */
- [0x4a3c, 0x4a3c], /* CJK Ideograph Extension A */
- [0x4a3d, 0x4a3d], /* CJK Ideograph Extension A */
- [0x4a3e, 0x4a3e], /* CJK Ideograph Extension A */
- [0x4a3f, 0x4a3f], /* CJK Ideograph Extension A */
- [0x4a40, 0x4a40], /* CJK Ideograph Extension A */
- [0x4a41, 0x4a41], /* CJK Ideograph Extension A */
- [0x4a42, 0x4a42], /* CJK Ideograph Extension A */
- [0x4a43, 0x4a43], /* CJK Ideograph Extension A */
- [0x4a44, 0x4a44], /* CJK Ideograph Extension A */
- [0x4a45, 0x4a45], /* CJK Ideograph Extension A */
- [0x4a46, 0x4a46], /* CJK Ideograph Extension A */
- [0x4a47, 0x4a47], /* CJK Ideograph Extension A */
- [0x4a48, 0x4a48], /* CJK Ideograph Extension A */
- [0x4a49, 0x4a49], /* CJK Ideograph Extension A */
- [0x4a4a, 0x4a4a], /* CJK Ideograph Extension A */
- [0x4a4b, 0x4a4b], /* CJK Ideograph Extension A */
- [0x4a4c, 0x4a4c], /* CJK Ideograph Extension A */
- [0x4a4d, 0x4a4d], /* CJK Ideograph Extension A */
- [0x4a4e, 0x4a4e], /* CJK Ideograph Extension A */
- [0x4a4f, 0x4a4f], /* CJK Ideograph Extension A */
- [0x4a50, 0x4a50], /* CJK Ideograph Extension A */
- [0x4a51, 0x4a51], /* CJK Ideograph Extension A */
- [0x4a52, 0x4a52], /* CJK Ideograph Extension A */
- [0x4a53, 0x4a53], /* CJK Ideograph Extension A */
- [0x4a54, 0x4a54], /* CJK Ideograph Extension A */
- [0x4a55, 0x4a55], /* CJK Ideograph Extension A */
- [0x4a56, 0x4a56], /* CJK Ideograph Extension A */
- [0x4a57, 0x4a57], /* CJK Ideograph Extension A */
- [0x4a58, 0x4a58], /* CJK Ideograph Extension A */
- [0x4a59, 0x4a59], /* CJK Ideograph Extension A */
- [0x4a5a, 0x4a5a], /* CJK Ideograph Extension A */
- [0x4a5b, 0x4a5b], /* CJK Ideograph Extension A */
- [0x4a5c, 0x4a5c], /* CJK Ideograph Extension A */
- [0x4a5d, 0x4a5d], /* CJK Ideograph Extension A */
- [0x4a5e, 0x4a5e], /* CJK Ideograph Extension A */
- [0x4a5f, 0x4a5f], /* CJK Ideograph Extension A */
- [0x4a60, 0x4a60], /* CJK Ideograph Extension A */
- [0x4a61, 0x4a61], /* CJK Ideograph Extension A */
- [0x4a62, 0x4a62], /* CJK Ideograph Extension A */
- [0x4a63, 0x4a63], /* CJK Ideograph Extension A */
- [0x4a64, 0x4a64], /* CJK Ideograph Extension A */
- [0x4a65, 0x4a65], /* CJK Ideograph Extension A */
- [0x4a66, 0x4a66], /* CJK Ideograph Extension A */
- [0x4a67, 0x4a67], /* CJK Ideograph Extension A */
- [0x4a68, 0x4a68], /* CJK Ideograph Extension A */
- [0x4a69, 0x4a69], /* CJK Ideograph Extension A */
- [0x4a6a, 0x4a6a], /* CJK Ideograph Extension A */
- [0x4a6b, 0x4a6b], /* CJK Ideograph Extension A */
- [0x4a6c, 0x4a6c], /* CJK Ideograph Extension A */
- [0x4a6d, 0x4a6d], /* CJK Ideograph Extension A */
- [0x4a6e, 0x4a6e], /* CJK Ideograph Extension A */
- [0x4a6f, 0x4a6f], /* CJK Ideograph Extension A */
- [0x4a70, 0x4a70], /* CJK Ideograph Extension A */
- [0x4a71, 0x4a71], /* CJK Ideograph Extension A */
- [0x4a72, 0x4a72], /* CJK Ideograph Extension A */
- [0x4a73, 0x4a73], /* CJK Ideograph Extension A */
- [0x4a74, 0x4a74], /* CJK Ideograph Extension A */
- [0x4a75, 0x4a75], /* CJK Ideograph Extension A */
- [0x4a76, 0x4a76], /* CJK Ideograph Extension A */
- [0x4a77, 0x4a77], /* CJK Ideograph Extension A */
- [0x4a78, 0x4a78], /* CJK Ideograph Extension A */
- [0x4a79, 0x4a79], /* CJK Ideograph Extension A */
- [0x4a7a, 0x4a7a], /* CJK Ideograph Extension A */
- [0x4a7b, 0x4a7b], /* CJK Ideograph Extension A */
- [0x4a7c, 0x4a7c], /* CJK Ideograph Extension A */
- [0x4a7d, 0x4a7d], /* CJK Ideograph Extension A */
- [0x4a7e, 0x4a7e], /* CJK Ideograph Extension A */
- [0x4a7f, 0x4a7f], /* CJK Ideograph Extension A */
- [0x4a80, 0x4a80], /* CJK Ideograph Extension A */
- [0x4a81, 0x4a81], /* CJK Ideograph Extension A */
- [0x4a82, 0x4a82], /* CJK Ideograph Extension A */
- [0x4a83, 0x4a83], /* CJK Ideograph Extension A */
- [0x4a84, 0x4a84], /* CJK Ideograph Extension A */
- [0x4a85, 0x4a85], /* CJK Ideograph Extension A */
- [0x4a86, 0x4a86], /* CJK Ideograph Extension A */
- [0x4a87, 0x4a87], /* CJK Ideograph Extension A */
- [0x4a88, 0x4a88], /* CJK Ideograph Extension A */
- [0x4a89, 0x4a89], /* CJK Ideograph Extension A */
- [0x4a8a, 0x4a8a], /* CJK Ideograph Extension A */
- [0x4a8b, 0x4a8b], /* CJK Ideograph Extension A */
- [0x4a8c, 0x4a8c], /* CJK Ideograph Extension A */
- [0x4a8d, 0x4a8d], /* CJK Ideograph Extension A */
- [0x4a8e, 0x4a8e], /* CJK Ideograph Extension A */
- [0x4a8f, 0x4a8f], /* CJK Ideograph Extension A */
- [0x4a90, 0x4a90], /* CJK Ideograph Extension A */
- [0x4a91, 0x4a91], /* CJK Ideograph Extension A */
- [0x4a92, 0x4a92], /* CJK Ideograph Extension A */
- [0x4a93, 0x4a93], /* CJK Ideograph Extension A */
- [0x4a94, 0x4a94], /* CJK Ideograph Extension A */
- [0x4a95, 0x4a95], /* CJK Ideograph Extension A */
- [0x4a96, 0x4a96], /* CJK Ideograph Extension A */
- [0x4a97, 0x4a97], /* CJK Ideograph Extension A */
- [0x4a98, 0x4a98], /* CJK Ideograph Extension A */
- [0x4a99, 0x4a99], /* CJK Ideograph Extension A */
- [0x4a9a, 0x4a9a], /* CJK Ideograph Extension A */
- [0x4a9b, 0x4a9b], /* CJK Ideograph Extension A */
- [0x4a9c, 0x4a9c], /* CJK Ideograph Extension A */
- [0x4a9d, 0x4a9d], /* CJK Ideograph Extension A */
- [0x4a9e, 0x4a9e], /* CJK Ideograph Extension A */
- [0x4a9f, 0x4a9f], /* CJK Ideograph Extension A */
- [0x4aa0, 0x4aa0], /* CJK Ideograph Extension A */
- [0x4aa1, 0x4aa1], /* CJK Ideograph Extension A */
- [0x4aa2, 0x4aa2], /* CJK Ideograph Extension A */
- [0x4aa3, 0x4aa3], /* CJK Ideograph Extension A */
- [0x4aa4, 0x4aa4], /* CJK Ideograph Extension A */
- [0x4aa5, 0x4aa5], /* CJK Ideograph Extension A */
- [0x4aa6, 0x4aa6], /* CJK Ideograph Extension A */
- [0x4aa7, 0x4aa7], /* CJK Ideograph Extension A */
- [0x4aa8, 0x4aa8], /* CJK Ideograph Extension A */
- [0x4aa9, 0x4aa9], /* CJK Ideograph Extension A */
- [0x4aaa, 0x4aaa], /* CJK Ideograph Extension A */
- [0x4aab, 0x4aab], /* CJK Ideograph Extension A */
- [0x4aac, 0x4aac], /* CJK Ideograph Extension A */
- [0x4aad, 0x4aad], /* CJK Ideograph Extension A */
- [0x4aae, 0x4aae], /* CJK Ideograph Extension A */
- [0x4aaf, 0x4aaf], /* CJK Ideograph Extension A */
- [0x4ab0, 0x4ab0], /* CJK Ideograph Extension A */
- [0x4ab1, 0x4ab1], /* CJK Ideograph Extension A */
- [0x4ab2, 0x4ab2], /* CJK Ideograph Extension A */
- [0x4ab3, 0x4ab3], /* CJK Ideograph Extension A */
- [0x4ab4, 0x4ab4], /* CJK Ideograph Extension A */
- [0x4ab5, 0x4ab5], /* CJK Ideograph Extension A */
- [0x4ab6, 0x4ab6], /* CJK Ideograph Extension A */
- [0x4ab7, 0x4ab7], /* CJK Ideograph Extension A */
- [0x4ab8, 0x4ab8], /* CJK Ideograph Extension A */
- [0x4ab9, 0x4ab9], /* CJK Ideograph Extension A */
- [0x4aba, 0x4aba], /* CJK Ideograph Extension A */
- [0x4abb, 0x4abb], /* CJK Ideograph Extension A */
- [0x4abc, 0x4abc], /* CJK Ideograph Extension A */
- [0x4abd, 0x4abd], /* CJK Ideograph Extension A */
- [0x4abe, 0x4abe], /* CJK Ideograph Extension A */
- [0x4abf, 0x4abf], /* CJK Ideograph Extension A */
- [0x4ac0, 0x4ac0], /* CJK Ideograph Extension A */
- [0x4ac1, 0x4ac1], /* CJK Ideograph Extension A */
- [0x4ac2, 0x4ac2], /* CJK Ideograph Extension A */
- [0x4ac3, 0x4ac3], /* CJK Ideograph Extension A */
- [0x4ac4, 0x4ac4], /* CJK Ideograph Extension A */
- [0x4ac5, 0x4ac5], /* CJK Ideograph Extension A */
- [0x4ac6, 0x4ac6], /* CJK Ideograph Extension A */
- [0x4ac7, 0x4ac7], /* CJK Ideograph Extension A */
- [0x4ac8, 0x4ac8], /* CJK Ideograph Extension A */
- [0x4ac9, 0x4ac9], /* CJK Ideograph Extension A */
- [0x4aca, 0x4aca], /* CJK Ideograph Extension A */
- [0x4acb, 0x4acb], /* CJK Ideograph Extension A */
- [0x4acc, 0x4acc], /* CJK Ideograph Extension A */
- [0x4acd, 0x4acd], /* CJK Ideograph Extension A */
- [0x4ace, 0x4ace], /* CJK Ideograph Extension A */
- [0x4acf, 0x4acf], /* CJK Ideograph Extension A */
- [0x4ad0, 0x4ad0], /* CJK Ideograph Extension A */
- [0x4ad1, 0x4ad1], /* CJK Ideograph Extension A */
- [0x4ad2, 0x4ad2], /* CJK Ideograph Extension A */
- [0x4ad3, 0x4ad3], /* CJK Ideograph Extension A */
- [0x4ad4, 0x4ad4], /* CJK Ideograph Extension A */
- [0x4ad5, 0x4ad5], /* CJK Ideograph Extension A */
- [0x4ad6, 0x4ad6], /* CJK Ideograph Extension A */
- [0x4ad7, 0x4ad7], /* CJK Ideograph Extension A */
- [0x4ad8, 0x4ad8], /* CJK Ideograph Extension A */
- [0x4ad9, 0x4ad9], /* CJK Ideograph Extension A */
- [0x4ada, 0x4ada], /* CJK Ideograph Extension A */
- [0x4adb, 0x4adb], /* CJK Ideograph Extension A */
- [0x4adc, 0x4adc], /* CJK Ideograph Extension A */
- [0x4add, 0x4add], /* CJK Ideograph Extension A */
- [0x4ade, 0x4ade], /* CJK Ideograph Extension A */
- [0x4adf, 0x4adf], /* CJK Ideograph Extension A */
- [0x4ae0, 0x4ae0], /* CJK Ideograph Extension A */
- [0x4ae1, 0x4ae1], /* CJK Ideograph Extension A */
- [0x4ae2, 0x4ae2], /* CJK Ideograph Extension A */
- [0x4ae3, 0x4ae3], /* CJK Ideograph Extension A */
- [0x4ae4, 0x4ae4], /* CJK Ideograph Extension A */
- [0x4ae5, 0x4ae5], /* CJK Ideograph Extension A */
- [0x4ae6, 0x4ae6], /* CJK Ideograph Extension A */
- [0x4ae7, 0x4ae7], /* CJK Ideograph Extension A */
- [0x4ae8, 0x4ae8], /* CJK Ideograph Extension A */
- [0x4ae9, 0x4ae9], /* CJK Ideograph Extension A */
- [0x4aea, 0x4aea], /* CJK Ideograph Extension A */
- [0x4aeb, 0x4aeb], /* CJK Ideograph Extension A */
- [0x4aec, 0x4aec], /* CJK Ideograph Extension A */
- [0x4aed, 0x4aed], /* CJK Ideograph Extension A */
- [0x4aee, 0x4aee], /* CJK Ideograph Extension A */
- [0x4aef, 0x4aef], /* CJK Ideograph Extension A */
- [0x4af0, 0x4af0], /* CJK Ideograph Extension A */
- [0x4af1, 0x4af1], /* CJK Ideograph Extension A */
- [0x4af2, 0x4af2], /* CJK Ideograph Extension A */
- [0x4af3, 0x4af3], /* CJK Ideograph Extension A */
- [0x4af4, 0x4af4], /* CJK Ideograph Extension A */
- [0x4af5, 0x4af5], /* CJK Ideograph Extension A */
- [0x4af6, 0x4af6], /* CJK Ideograph Extension A */
- [0x4af7, 0x4af7], /* CJK Ideograph Extension A */
- [0x4af8, 0x4af8], /* CJK Ideograph Extension A */
- [0x4af9, 0x4af9], /* CJK Ideograph Extension A */
- [0x4afa, 0x4afa], /* CJK Ideograph Extension A */
- [0x4afb, 0x4afb], /* CJK Ideograph Extension A */
- [0x4afc, 0x4afc], /* CJK Ideograph Extension A */
- [0x4afd, 0x4afd], /* CJK Ideograph Extension A */
- [0x4afe, 0x4afe], /* CJK Ideograph Extension A */
- [0x4aff, 0x4aff], /* CJK Ideograph Extension A */
- [0x4b00, 0x4b00], /* CJK Ideograph Extension A */
- [0x4b01, 0x4b01], /* CJK Ideograph Extension A */
- [0x4b02, 0x4b02], /* CJK Ideograph Extension A */
- [0x4b03, 0x4b03], /* CJK Ideograph Extension A */
- [0x4b04, 0x4b04], /* CJK Ideograph Extension A */
- [0x4b05, 0x4b05], /* CJK Ideograph Extension A */
- [0x4b06, 0x4b06], /* CJK Ideograph Extension A */
- [0x4b07, 0x4b07], /* CJK Ideograph Extension A */
- [0x4b08, 0x4b08], /* CJK Ideograph Extension A */
- [0x4b09, 0x4b09], /* CJK Ideograph Extension A */
- [0x4b0a, 0x4b0a], /* CJK Ideograph Extension A */
- [0x4b0b, 0x4b0b], /* CJK Ideograph Extension A */
- [0x4b0c, 0x4b0c], /* CJK Ideograph Extension A */
- [0x4b0d, 0x4b0d], /* CJK Ideograph Extension A */
- [0x4b0e, 0x4b0e], /* CJK Ideograph Extension A */
- [0x4b0f, 0x4b0f], /* CJK Ideograph Extension A */
- [0x4b10, 0x4b10], /* CJK Ideograph Extension A */
- [0x4b11, 0x4b11], /* CJK Ideograph Extension A */
- [0x4b12, 0x4b12], /* CJK Ideograph Extension A */
- [0x4b13, 0x4b13], /* CJK Ideograph Extension A */
- [0x4b14, 0x4b14], /* CJK Ideograph Extension A */
- [0x4b15, 0x4b15], /* CJK Ideograph Extension A */
- [0x4b16, 0x4b16], /* CJK Ideograph Extension A */
- [0x4b17, 0x4b17], /* CJK Ideograph Extension A */
- [0x4b18, 0x4b18], /* CJK Ideograph Extension A */
- [0x4b19, 0x4b19], /* CJK Ideograph Extension A */
- [0x4b1a, 0x4b1a], /* CJK Ideograph Extension A */
- [0x4b1b, 0x4b1b], /* CJK Ideograph Extension A */
- [0x4b1c, 0x4b1c], /* CJK Ideograph Extension A */
- [0x4b1d, 0x4b1d], /* CJK Ideograph Extension A */
- [0x4b1e, 0x4b1e], /* CJK Ideograph Extension A */
- [0x4b1f, 0x4b1f], /* CJK Ideograph Extension A */
- [0x4b20, 0x4b20], /* CJK Ideograph Extension A */
- [0x4b21, 0x4b21], /* CJK Ideograph Extension A */
- [0x4b22, 0x4b22], /* CJK Ideograph Extension A */
- [0x4b23, 0x4b23], /* CJK Ideograph Extension A */
- [0x4b24, 0x4b24], /* CJK Ideograph Extension A */
- [0x4b25, 0x4b25], /* CJK Ideograph Extension A */
- [0x4b26, 0x4b26], /* CJK Ideograph Extension A */
- [0x4b27, 0x4b27], /* CJK Ideograph Extension A */
- [0x4b28, 0x4b28], /* CJK Ideograph Extension A */
- [0x4b29, 0x4b29], /* CJK Ideograph Extension A */
- [0x4b2a, 0x4b2a], /* CJK Ideograph Extension A */
- [0x4b2b, 0x4b2b], /* CJK Ideograph Extension A */
- [0x4b2c, 0x4b2c], /* CJK Ideograph Extension A */
- [0x4b2d, 0x4b2d], /* CJK Ideograph Extension A */
- [0x4b2e, 0x4b2e], /* CJK Ideograph Extension A */
- [0x4b2f, 0x4b2f], /* CJK Ideograph Extension A */
- [0x4b30, 0x4b30], /* CJK Ideograph Extension A */
- [0x4b31, 0x4b31], /* CJK Ideograph Extension A */
- [0x4b32, 0x4b32], /* CJK Ideograph Extension A */
- [0x4b33, 0x4b33], /* CJK Ideograph Extension A */
- [0x4b34, 0x4b34], /* CJK Ideograph Extension A */
- [0x4b35, 0x4b35], /* CJK Ideograph Extension A */
- [0x4b36, 0x4b36], /* CJK Ideograph Extension A */
- [0x4b37, 0x4b37], /* CJK Ideograph Extension A */
- [0x4b38, 0x4b38], /* CJK Ideograph Extension A */
- [0x4b39, 0x4b39], /* CJK Ideograph Extension A */
- [0x4b3a, 0x4b3a], /* CJK Ideograph Extension A */
- [0x4b3b, 0x4b3b], /* CJK Ideograph Extension A */
- [0x4b3c, 0x4b3c], /* CJK Ideograph Extension A */
- [0x4b3d, 0x4b3d], /* CJK Ideograph Extension A */
- [0x4b3e, 0x4b3e], /* CJK Ideograph Extension A */
- [0x4b3f, 0x4b3f], /* CJK Ideograph Extension A */
- [0x4b40, 0x4b40], /* CJK Ideograph Extension A */
- [0x4b41, 0x4b41], /* CJK Ideograph Extension A */
- [0x4b42, 0x4b42], /* CJK Ideograph Extension A */
- [0x4b43, 0x4b43], /* CJK Ideograph Extension A */
- [0x4b44, 0x4b44], /* CJK Ideograph Extension A */
- [0x4b45, 0x4b45], /* CJK Ideograph Extension A */
- [0x4b46, 0x4b46], /* CJK Ideograph Extension A */
- [0x4b47, 0x4b47], /* CJK Ideograph Extension A */
- [0x4b48, 0x4b48], /* CJK Ideograph Extension A */
- [0x4b49, 0x4b49], /* CJK Ideograph Extension A */
- [0x4b4a, 0x4b4a], /* CJK Ideograph Extension A */
- [0x4b4b, 0x4b4b], /* CJK Ideograph Extension A */
- [0x4b4c, 0x4b4c], /* CJK Ideograph Extension A */
- [0x4b4d, 0x4b4d], /* CJK Ideograph Extension A */
- [0x4b4e, 0x4b4e], /* CJK Ideograph Extension A */
- [0x4b4f, 0x4b4f], /* CJK Ideograph Extension A */
- [0x4b50, 0x4b50], /* CJK Ideograph Extension A */
- [0x4b51, 0x4b51], /* CJK Ideograph Extension A */
- [0x4b52, 0x4b52], /* CJK Ideograph Extension A */
- [0x4b53, 0x4b53], /* CJK Ideograph Extension A */
- [0x4b54, 0x4b54], /* CJK Ideograph Extension A */
- [0x4b55, 0x4b55], /* CJK Ideograph Extension A */
- [0x4b56, 0x4b56], /* CJK Ideograph Extension A */
- [0x4b57, 0x4b57], /* CJK Ideograph Extension A */
- [0x4b58, 0x4b58], /* CJK Ideograph Extension A */
- [0x4b59, 0x4b59], /* CJK Ideograph Extension A */
- [0x4b5a, 0x4b5a], /* CJK Ideograph Extension A */
- [0x4b5b, 0x4b5b], /* CJK Ideograph Extension A */
- [0x4b5c, 0x4b5c], /* CJK Ideograph Extension A */
- [0x4b5d, 0x4b5d], /* CJK Ideograph Extension A */
- [0x4b5e, 0x4b5e], /* CJK Ideograph Extension A */
- [0x4b5f, 0x4b5f], /* CJK Ideograph Extension A */
- [0x4b60, 0x4b60], /* CJK Ideograph Extension A */
- [0x4b61, 0x4b61], /* CJK Ideograph Extension A */
- [0x4b62, 0x4b62], /* CJK Ideograph Extension A */
- [0x4b63, 0x4b63], /* CJK Ideograph Extension A */
- [0x4b64, 0x4b64], /* CJK Ideograph Extension A */
- [0x4b65, 0x4b65], /* CJK Ideograph Extension A */
- [0x4b66, 0x4b66], /* CJK Ideograph Extension A */
- [0x4b67, 0x4b67], /* CJK Ideograph Extension A */
- [0x4b68, 0x4b68], /* CJK Ideograph Extension A */
- [0x4b69, 0x4b69], /* CJK Ideograph Extension A */
- [0x4b6a, 0x4b6a], /* CJK Ideograph Extension A */
- [0x4b6b, 0x4b6b], /* CJK Ideograph Extension A */
- [0x4b6c, 0x4b6c], /* CJK Ideograph Extension A */
- [0x4b6d, 0x4b6d], /* CJK Ideograph Extension A */
- [0x4b6e, 0x4b6e], /* CJK Ideograph Extension A */
- [0x4b6f, 0x4b6f], /* CJK Ideograph Extension A */
- [0x4b70, 0x4b70], /* CJK Ideograph Extension A */
- [0x4b71, 0x4b71], /* CJK Ideograph Extension A */
- [0x4b72, 0x4b72], /* CJK Ideograph Extension A */
- [0x4b73, 0x4b73], /* CJK Ideograph Extension A */
- [0x4b74, 0x4b74], /* CJK Ideograph Extension A */
- [0x4b75, 0x4b75], /* CJK Ideograph Extension A */
- [0x4b76, 0x4b76], /* CJK Ideograph Extension A */
- [0x4b77, 0x4b77], /* CJK Ideograph Extension A */
- [0x4b78, 0x4b78], /* CJK Ideograph Extension A */
- [0x4b79, 0x4b79], /* CJK Ideograph Extension A */
- [0x4b7a, 0x4b7a], /* CJK Ideograph Extension A */
- [0x4b7b, 0x4b7b], /* CJK Ideograph Extension A */
- [0x4b7c, 0x4b7c], /* CJK Ideograph Extension A */
- [0x4b7d, 0x4b7d], /* CJK Ideograph Extension A */
- [0x4b7e, 0x4b7e], /* CJK Ideograph Extension A */
- [0x4b7f, 0x4b7f], /* CJK Ideograph Extension A */
- [0x4b80, 0x4b80], /* CJK Ideograph Extension A */
- [0x4b81, 0x4b81], /* CJK Ideograph Extension A */
- [0x4b82, 0x4b82], /* CJK Ideograph Extension A */
- [0x4b83, 0x4b83], /* CJK Ideograph Extension A */
- [0x4b84, 0x4b84], /* CJK Ideograph Extension A */
- [0x4b85, 0x4b85], /* CJK Ideograph Extension A */
- [0x4b86, 0x4b86], /* CJK Ideograph Extension A */
- [0x4b87, 0x4b87], /* CJK Ideograph Extension A */
- [0x4b88, 0x4b88], /* CJK Ideograph Extension A */
- [0x4b89, 0x4b89], /* CJK Ideograph Extension A */
- [0x4b8a, 0x4b8a], /* CJK Ideograph Extension A */
- [0x4b8b, 0x4b8b], /* CJK Ideograph Extension A */
- [0x4b8c, 0x4b8c], /* CJK Ideograph Extension A */
- [0x4b8d, 0x4b8d], /* CJK Ideograph Extension A */
- [0x4b8e, 0x4b8e], /* CJK Ideograph Extension A */
- [0x4b8f, 0x4b8f], /* CJK Ideograph Extension A */
- [0x4b90, 0x4b90], /* CJK Ideograph Extension A */
- [0x4b91, 0x4b91], /* CJK Ideograph Extension A */
- [0x4b92, 0x4b92], /* CJK Ideograph Extension A */
- [0x4b93, 0x4b93], /* CJK Ideograph Extension A */
- [0x4b94, 0x4b94], /* CJK Ideograph Extension A */
- [0x4b95, 0x4b95], /* CJK Ideograph Extension A */
- [0x4b96, 0x4b96], /* CJK Ideograph Extension A */
- [0x4b97, 0x4b97], /* CJK Ideograph Extension A */
- [0x4b98, 0x4b98], /* CJK Ideograph Extension A */
- [0x4b99, 0x4b99], /* CJK Ideograph Extension A */
- [0x4b9a, 0x4b9a], /* CJK Ideograph Extension A */
- [0x4b9b, 0x4b9b], /* CJK Ideograph Extension A */
- [0x4b9c, 0x4b9c], /* CJK Ideograph Extension A */
- [0x4b9d, 0x4b9d], /* CJK Ideograph Extension A */
- [0x4b9e, 0x4b9e], /* CJK Ideograph Extension A */
- [0x4b9f, 0x4b9f], /* CJK Ideograph Extension A */
- [0x4ba0, 0x4ba0], /* CJK Ideograph Extension A */
- [0x4ba1, 0x4ba1], /* CJK Ideograph Extension A */
- [0x4ba2, 0x4ba2], /* CJK Ideograph Extension A */
- [0x4ba3, 0x4ba3], /* CJK Ideograph Extension A */
- [0x4ba4, 0x4ba4], /* CJK Ideograph Extension A */
- [0x4ba5, 0x4ba5], /* CJK Ideograph Extension A */
- [0x4ba6, 0x4ba6], /* CJK Ideograph Extension A */
- [0x4ba7, 0x4ba7], /* CJK Ideograph Extension A */
- [0x4ba8, 0x4ba8], /* CJK Ideograph Extension A */
- [0x4ba9, 0x4ba9], /* CJK Ideograph Extension A */
- [0x4baa, 0x4baa], /* CJK Ideograph Extension A */
- [0x4bab, 0x4bab], /* CJK Ideograph Extension A */
- [0x4bac, 0x4bac], /* CJK Ideograph Extension A */
- [0x4bad, 0x4bad], /* CJK Ideograph Extension A */
- [0x4bae, 0x4bae], /* CJK Ideograph Extension A */
- [0x4baf, 0x4baf], /* CJK Ideograph Extension A */
- [0x4bb0, 0x4bb0], /* CJK Ideograph Extension A */
- [0x4bb1, 0x4bb1], /* CJK Ideograph Extension A */
- [0x4bb2, 0x4bb2], /* CJK Ideograph Extension A */
- [0x4bb3, 0x4bb3], /* CJK Ideograph Extension A */
- [0x4bb4, 0x4bb4], /* CJK Ideograph Extension A */
- [0x4bb5, 0x4bb5], /* CJK Ideograph Extension A */
- [0x4bb6, 0x4bb6], /* CJK Ideograph Extension A */
- [0x4bb7, 0x4bb7], /* CJK Ideograph Extension A */
- [0x4bb8, 0x4bb8], /* CJK Ideograph Extension A */
- [0x4bb9, 0x4bb9], /* CJK Ideograph Extension A */
- [0x4bba, 0x4bba], /* CJK Ideograph Extension A */
- [0x4bbb, 0x4bbb], /* CJK Ideograph Extension A */
- [0x4bbc, 0x4bbc], /* CJK Ideograph Extension A */
- [0x4bbd, 0x4bbd], /* CJK Ideograph Extension A */
- [0x4bbe, 0x4bbe], /* CJK Ideograph Extension A */
- [0x4bbf, 0x4bbf], /* CJK Ideograph Extension A */
- [0x4bc0, 0x4bc0], /* CJK Ideograph Extension A */
- [0x4bc1, 0x4bc1], /* CJK Ideograph Extension A */
- [0x4bc2, 0x4bc2], /* CJK Ideograph Extension A */
- [0x4bc3, 0x4bc3], /* CJK Ideograph Extension A */
- [0x4bc4, 0x4bc4], /* CJK Ideograph Extension A */
- [0x4bc5, 0x4bc5], /* CJK Ideograph Extension A */
- [0x4bc6, 0x4bc6], /* CJK Ideograph Extension A */
- [0x4bc7, 0x4bc7], /* CJK Ideograph Extension A */
- [0x4bc8, 0x4bc8], /* CJK Ideograph Extension A */
- [0x4bc9, 0x4bc9], /* CJK Ideograph Extension A */
- [0x4bca, 0x4bca], /* CJK Ideograph Extension A */
- [0x4bcb, 0x4bcb], /* CJK Ideograph Extension A */
- [0x4bcc, 0x4bcc], /* CJK Ideograph Extension A */
- [0x4bcd, 0x4bcd], /* CJK Ideograph Extension A */
- [0x4bce, 0x4bce], /* CJK Ideograph Extension A */
- [0x4bcf, 0x4bcf], /* CJK Ideograph Extension A */
- [0x4bd0, 0x4bd0], /* CJK Ideograph Extension A */
- [0x4bd1, 0x4bd1], /* CJK Ideograph Extension A */
- [0x4bd2, 0x4bd2], /* CJK Ideograph Extension A */
- [0x4bd3, 0x4bd3], /* CJK Ideograph Extension A */
- [0x4bd4, 0x4bd4], /* CJK Ideograph Extension A */
- [0x4bd5, 0x4bd5], /* CJK Ideograph Extension A */
- [0x4bd6, 0x4bd6], /* CJK Ideograph Extension A */
- [0x4bd7, 0x4bd7], /* CJK Ideograph Extension A */
- [0x4bd8, 0x4bd8], /* CJK Ideograph Extension A */
- [0x4bd9, 0x4bd9], /* CJK Ideograph Extension A */
- [0x4bda, 0x4bda], /* CJK Ideograph Extension A */
- [0x4bdb, 0x4bdb], /* CJK Ideograph Extension A */
- [0x4bdc, 0x4bdc], /* CJK Ideograph Extension A */
- [0x4bdd, 0x4bdd], /* CJK Ideograph Extension A */
- [0x4bde, 0x4bde], /* CJK Ideograph Extension A */
- [0x4bdf, 0x4bdf], /* CJK Ideograph Extension A */
- [0x4be0, 0x4be0], /* CJK Ideograph Extension A */
- [0x4be1, 0x4be1], /* CJK Ideograph Extension A */
- [0x4be2, 0x4be2], /* CJK Ideograph Extension A */
- [0x4be3, 0x4be3], /* CJK Ideograph Extension A */
- [0x4be4, 0x4be4], /* CJK Ideograph Extension A */
- [0x4be5, 0x4be5], /* CJK Ideograph Extension A */
- [0x4be6, 0x4be6], /* CJK Ideograph Extension A */
- [0x4be7, 0x4be7], /* CJK Ideograph Extension A */
- [0x4be8, 0x4be8], /* CJK Ideograph Extension A */
- [0x4be9, 0x4be9], /* CJK Ideograph Extension A */
- [0x4bea, 0x4bea], /* CJK Ideograph Extension A */
- [0x4beb, 0x4beb], /* CJK Ideograph Extension A */
- [0x4bec, 0x4bec], /* CJK Ideograph Extension A */
- [0x4bed, 0x4bed], /* CJK Ideograph Extension A */
- [0x4bee, 0x4bee], /* CJK Ideograph Extension A */
- [0x4bef, 0x4bef], /* CJK Ideograph Extension A */
- [0x4bf0, 0x4bf0], /* CJK Ideograph Extension A */
- [0x4bf1, 0x4bf1], /* CJK Ideograph Extension A */
- [0x4bf2, 0x4bf2], /* CJK Ideograph Extension A */
- [0x4bf3, 0x4bf3], /* CJK Ideograph Extension A */
- [0x4bf4, 0x4bf4], /* CJK Ideograph Extension A */
- [0x4bf5, 0x4bf5], /* CJK Ideograph Extension A */
- [0x4bf6, 0x4bf6], /* CJK Ideograph Extension A */
- [0x4bf7, 0x4bf7], /* CJK Ideograph Extension A */
- [0x4bf8, 0x4bf8], /* CJK Ideograph Extension A */
- [0x4bf9, 0x4bf9], /* CJK Ideograph Extension A */
- [0x4bfa, 0x4bfa], /* CJK Ideograph Extension A */
- [0x4bfb, 0x4bfb], /* CJK Ideograph Extension A */
- [0x4bfc, 0x4bfc], /* CJK Ideograph Extension A */
- [0x4bfd, 0x4bfd], /* CJK Ideograph Extension A */
- [0x4bfe, 0x4bfe], /* CJK Ideograph Extension A */
- [0x4bff, 0x4bff], /* CJK Ideograph Extension A */
- [0x4c00, 0x4c00], /* CJK Ideograph Extension A */
- [0x4c01, 0x4c01], /* CJK Ideograph Extension A */
- [0x4c02, 0x4c02], /* CJK Ideograph Extension A */
- [0x4c03, 0x4c03], /* CJK Ideograph Extension A */
- [0x4c04, 0x4c04], /* CJK Ideograph Extension A */
- [0x4c05, 0x4c05], /* CJK Ideograph Extension A */
- [0x4c06, 0x4c06], /* CJK Ideograph Extension A */
- [0x4c07, 0x4c07], /* CJK Ideograph Extension A */
- [0x4c08, 0x4c08], /* CJK Ideograph Extension A */
- [0x4c09, 0x4c09], /* CJK Ideograph Extension A */
- [0x4c0a, 0x4c0a], /* CJK Ideograph Extension A */
- [0x4c0b, 0x4c0b], /* CJK Ideograph Extension A */
- [0x4c0c, 0x4c0c], /* CJK Ideograph Extension A */
- [0x4c0d, 0x4c0d], /* CJK Ideograph Extension A */
- [0x4c0e, 0x4c0e], /* CJK Ideograph Extension A */
- [0x4c0f, 0x4c0f], /* CJK Ideograph Extension A */
- [0x4c10, 0x4c10], /* CJK Ideograph Extension A */
- [0x4c11, 0x4c11], /* CJK Ideograph Extension A */
- [0x4c12, 0x4c12], /* CJK Ideograph Extension A */
- [0x4c13, 0x4c13], /* CJK Ideograph Extension A */
- [0x4c14, 0x4c14], /* CJK Ideograph Extension A */
- [0x4c15, 0x4c15], /* CJK Ideograph Extension A */
- [0x4c16, 0x4c16], /* CJK Ideograph Extension A */
- [0x4c17, 0x4c17], /* CJK Ideograph Extension A */
- [0x4c18, 0x4c18], /* CJK Ideograph Extension A */
- [0x4c19, 0x4c19], /* CJK Ideograph Extension A */
- [0x4c1a, 0x4c1a], /* CJK Ideograph Extension A */
- [0x4c1b, 0x4c1b], /* CJK Ideograph Extension A */
- [0x4c1c, 0x4c1c], /* CJK Ideograph Extension A */
- [0x4c1d, 0x4c1d], /* CJK Ideograph Extension A */
- [0x4c1e, 0x4c1e], /* CJK Ideograph Extension A */
- [0x4c1f, 0x4c1f], /* CJK Ideograph Extension A */
- [0x4c20, 0x4c20], /* CJK Ideograph Extension A */
- [0x4c21, 0x4c21], /* CJK Ideograph Extension A */
- [0x4c22, 0x4c22], /* CJK Ideograph Extension A */
- [0x4c23, 0x4c23], /* CJK Ideograph Extension A */
- [0x4c24, 0x4c24], /* CJK Ideograph Extension A */
- [0x4c25, 0x4c25], /* CJK Ideograph Extension A */
- [0x4c26, 0x4c26], /* CJK Ideograph Extension A */
- [0x4c27, 0x4c27], /* CJK Ideograph Extension A */
- [0x4c28, 0x4c28], /* CJK Ideograph Extension A */
- [0x4c29, 0x4c29], /* CJK Ideograph Extension A */
- [0x4c2a, 0x4c2a], /* CJK Ideograph Extension A */
- [0x4c2b, 0x4c2b], /* CJK Ideograph Extension A */
- [0x4c2c, 0x4c2c], /* CJK Ideograph Extension A */
- [0x4c2d, 0x4c2d], /* CJK Ideograph Extension A */
- [0x4c2e, 0x4c2e], /* CJK Ideograph Extension A */
- [0x4c2f, 0x4c2f], /* CJK Ideograph Extension A */
- [0x4c30, 0x4c30], /* CJK Ideograph Extension A */
- [0x4c31, 0x4c31], /* CJK Ideograph Extension A */
- [0x4c32, 0x4c32], /* CJK Ideograph Extension A */
- [0x4c33, 0x4c33], /* CJK Ideograph Extension A */
- [0x4c34, 0x4c34], /* CJK Ideograph Extension A */
- [0x4c35, 0x4c35], /* CJK Ideograph Extension A */
- [0x4c36, 0x4c36], /* CJK Ideograph Extension A */
- [0x4c37, 0x4c37], /* CJK Ideograph Extension A */
- [0x4c38, 0x4c38], /* CJK Ideograph Extension A */
- [0x4c39, 0x4c39], /* CJK Ideograph Extension A */
- [0x4c3a, 0x4c3a], /* CJK Ideograph Extension A */
- [0x4c3b, 0x4c3b], /* CJK Ideograph Extension A */
- [0x4c3c, 0x4c3c], /* CJK Ideograph Extension A */
- [0x4c3d, 0x4c3d], /* CJK Ideograph Extension A */
- [0x4c3e, 0x4c3e], /* CJK Ideograph Extension A */
- [0x4c3f, 0x4c3f], /* CJK Ideograph Extension A */
- [0x4c40, 0x4c40], /* CJK Ideograph Extension A */
- [0x4c41, 0x4c41], /* CJK Ideograph Extension A */
- [0x4c42, 0x4c42], /* CJK Ideograph Extension A */
- [0x4c43, 0x4c43], /* CJK Ideograph Extension A */
- [0x4c44, 0x4c44], /* CJK Ideograph Extension A */
- [0x4c45, 0x4c45], /* CJK Ideograph Extension A */
- [0x4c46, 0x4c46], /* CJK Ideograph Extension A */
- [0x4c47, 0x4c47], /* CJK Ideograph Extension A */
- [0x4c48, 0x4c48], /* CJK Ideograph Extension A */
- [0x4c49, 0x4c49], /* CJK Ideograph Extension A */
- [0x4c4a, 0x4c4a], /* CJK Ideograph Extension A */
- [0x4c4b, 0x4c4b], /* CJK Ideograph Extension A */
- [0x4c4c, 0x4c4c], /* CJK Ideograph Extension A */
- [0x4c4d, 0x4c4d], /* CJK Ideograph Extension A */
- [0x4c4e, 0x4c4e], /* CJK Ideograph Extension A */
- [0x4c4f, 0x4c4f], /* CJK Ideograph Extension A */
- [0x4c50, 0x4c50], /* CJK Ideograph Extension A */
- [0x4c51, 0x4c51], /* CJK Ideograph Extension A */
- [0x4c52, 0x4c52], /* CJK Ideograph Extension A */
- [0x4c53, 0x4c53], /* CJK Ideograph Extension A */
- [0x4c54, 0x4c54], /* CJK Ideograph Extension A */
- [0x4c55, 0x4c55], /* CJK Ideograph Extension A */
- [0x4c56, 0x4c56], /* CJK Ideograph Extension A */
- [0x4c57, 0x4c57], /* CJK Ideograph Extension A */
- [0x4c58, 0x4c58], /* CJK Ideograph Extension A */
- [0x4c59, 0x4c59], /* CJK Ideograph Extension A */
- [0x4c5a, 0x4c5a], /* CJK Ideograph Extension A */
- [0x4c5b, 0x4c5b], /* CJK Ideograph Extension A */
- [0x4c5c, 0x4c5c], /* CJK Ideograph Extension A */
- [0x4c5d, 0x4c5d], /* CJK Ideograph Extension A */
- [0x4c5e, 0x4c5e], /* CJK Ideograph Extension A */
- [0x4c5f, 0x4c5f], /* CJK Ideograph Extension A */
- [0x4c60, 0x4c60], /* CJK Ideograph Extension A */
- [0x4c61, 0x4c61], /* CJK Ideograph Extension A */
- [0x4c62, 0x4c62], /* CJK Ideograph Extension A */
- [0x4c63, 0x4c63], /* CJK Ideograph Extension A */
- [0x4c64, 0x4c64], /* CJK Ideograph Extension A */
- [0x4c65, 0x4c65], /* CJK Ideograph Extension A */
- [0x4c66, 0x4c66], /* CJK Ideograph Extension A */
- [0x4c67, 0x4c67], /* CJK Ideograph Extension A */
- [0x4c68, 0x4c68], /* CJK Ideograph Extension A */
- [0x4c69, 0x4c69], /* CJK Ideograph Extension A */
- [0x4c6a, 0x4c6a], /* CJK Ideograph Extension A */
- [0x4c6b, 0x4c6b], /* CJK Ideograph Extension A */
- [0x4c6c, 0x4c6c], /* CJK Ideograph Extension A */
- [0x4c6d, 0x4c6d], /* CJK Ideograph Extension A */
- [0x4c6e, 0x4c6e], /* CJK Ideograph Extension A */
- [0x4c6f, 0x4c6f], /* CJK Ideograph Extension A */
- [0x4c70, 0x4c70], /* CJK Ideograph Extension A */
- [0x4c71, 0x4c71], /* CJK Ideograph Extension A */
- [0x4c72, 0x4c72], /* CJK Ideograph Extension A */
- [0x4c73, 0x4c73], /* CJK Ideograph Extension A */
- [0x4c74, 0x4c74], /* CJK Ideograph Extension A */
- [0x4c75, 0x4c75], /* CJK Ideograph Extension A */
- [0x4c76, 0x4c76], /* CJK Ideograph Extension A */
- [0x4c77, 0x4c77], /* CJK Ideograph Extension A */
- [0x4c78, 0x4c78], /* CJK Ideograph Extension A */
- [0x4c79, 0x4c79], /* CJK Ideograph Extension A */
- [0x4c7a, 0x4c7a], /* CJK Ideograph Extension A */
- [0x4c7b, 0x4c7b], /* CJK Ideograph Extension A */
- [0x4c7c, 0x4c7c], /* CJK Ideograph Extension A */
- [0x4c7d, 0x4c7d], /* CJK Ideograph Extension A */
- [0x4c7e, 0x4c7e], /* CJK Ideograph Extension A */
- [0x4c7f, 0x4c7f], /* CJK Ideograph Extension A */
- [0x4c80, 0x4c80], /* CJK Ideograph Extension A */
- [0x4c81, 0x4c81], /* CJK Ideograph Extension A */
- [0x4c82, 0x4c82], /* CJK Ideograph Extension A */
- [0x4c83, 0x4c83], /* CJK Ideograph Extension A */
- [0x4c84, 0x4c84], /* CJK Ideograph Extension A */
- [0x4c85, 0x4c85], /* CJK Ideograph Extension A */
- [0x4c86, 0x4c86], /* CJK Ideograph Extension A */
- [0x4c87, 0x4c87], /* CJK Ideograph Extension A */
- [0x4c88, 0x4c88], /* CJK Ideograph Extension A */
- [0x4c89, 0x4c89], /* CJK Ideograph Extension A */
- [0x4c8a, 0x4c8a], /* CJK Ideograph Extension A */
- [0x4c8b, 0x4c8b], /* CJK Ideograph Extension A */
- [0x4c8c, 0x4c8c], /* CJK Ideograph Extension A */
- [0x4c8d, 0x4c8d], /* CJK Ideograph Extension A */
- [0x4c8e, 0x4c8e], /* CJK Ideograph Extension A */
- [0x4c8f, 0x4c8f], /* CJK Ideograph Extension A */
- [0x4c90, 0x4c90], /* CJK Ideograph Extension A */
- [0x4c91, 0x4c91], /* CJK Ideograph Extension A */
- [0x4c92, 0x4c92], /* CJK Ideograph Extension A */
- [0x4c93, 0x4c93], /* CJK Ideograph Extension A */
- [0x4c94, 0x4c94], /* CJK Ideograph Extension A */
- [0x4c95, 0x4c95], /* CJK Ideograph Extension A */
- [0x4c96, 0x4c96], /* CJK Ideograph Extension A */
- [0x4c97, 0x4c97], /* CJK Ideograph Extension A */
- [0x4c98, 0x4c98], /* CJK Ideograph Extension A */
- [0x4c99, 0x4c99], /* CJK Ideograph Extension A */
- [0x4c9a, 0x4c9a], /* CJK Ideograph Extension A */
- [0x4c9b, 0x4c9b], /* CJK Ideograph Extension A */
- [0x4c9c, 0x4c9c], /* CJK Ideograph Extension A */
- [0x4c9d, 0x4c9d], /* CJK Ideograph Extension A */
- [0x4c9e, 0x4c9e], /* CJK Ideograph Extension A */
- [0x4c9f, 0x4c9f], /* CJK Ideograph Extension A */
- [0x4ca0, 0x4ca0], /* CJK Ideograph Extension A */
- [0x4ca1, 0x4ca1], /* CJK Ideograph Extension A */
- [0x4ca2, 0x4ca2], /* CJK Ideograph Extension A */
- [0x4ca3, 0x4ca3], /* CJK Ideograph Extension A */
- [0x4ca4, 0x4ca4], /* CJK Ideograph Extension A */
- [0x4ca5, 0x4ca5], /* CJK Ideograph Extension A */
- [0x4ca6, 0x4ca6], /* CJK Ideograph Extension A */
- [0x4ca7, 0x4ca7], /* CJK Ideograph Extension A */
- [0x4ca8, 0x4ca8], /* CJK Ideograph Extension A */
- [0x4ca9, 0x4ca9], /* CJK Ideograph Extension A */
- [0x4caa, 0x4caa], /* CJK Ideograph Extension A */
- [0x4cab, 0x4cab], /* CJK Ideograph Extension A */
- [0x4cac, 0x4cac], /* CJK Ideograph Extension A */
- [0x4cad, 0x4cad], /* CJK Ideograph Extension A */
- [0x4cae, 0x4cae], /* CJK Ideograph Extension A */
- [0x4caf, 0x4caf], /* CJK Ideograph Extension A */
- [0x4cb0, 0x4cb0], /* CJK Ideograph Extension A */
- [0x4cb1, 0x4cb1], /* CJK Ideograph Extension A */
- [0x4cb2, 0x4cb2], /* CJK Ideograph Extension A */
- [0x4cb3, 0x4cb3], /* CJK Ideograph Extension A */
- [0x4cb4, 0x4cb4], /* CJK Ideograph Extension A */
- [0x4cb5, 0x4cb5], /* CJK Ideograph Extension A */
- [0x4cb6, 0x4cb6], /* CJK Ideograph Extension A */
- [0x4cb7, 0x4cb7], /* CJK Ideograph Extension A */
- [0x4cb8, 0x4cb8], /* CJK Ideograph Extension A */
- [0x4cb9, 0x4cb9], /* CJK Ideograph Extension A */
- [0x4cba, 0x4cba], /* CJK Ideograph Extension A */
- [0x4cbb, 0x4cbb], /* CJK Ideograph Extension A */
- [0x4cbc, 0x4cbc], /* CJK Ideograph Extension A */
- [0x4cbd, 0x4cbd], /* CJK Ideograph Extension A */
- [0x4cbe, 0x4cbe], /* CJK Ideograph Extension A */
- [0x4cbf, 0x4cbf], /* CJK Ideograph Extension A */
- [0x4cc0, 0x4cc0], /* CJK Ideograph Extension A */
- [0x4cc1, 0x4cc1], /* CJK Ideograph Extension A */
- [0x4cc2, 0x4cc2], /* CJK Ideograph Extension A */
- [0x4cc3, 0x4cc3], /* CJK Ideograph Extension A */
- [0x4cc4, 0x4cc4], /* CJK Ideograph Extension A */
- [0x4cc5, 0x4cc5], /* CJK Ideograph Extension A */
- [0x4cc6, 0x4cc6], /* CJK Ideograph Extension A */
- [0x4cc7, 0x4cc7], /* CJK Ideograph Extension A */
- [0x4cc8, 0x4cc8], /* CJK Ideograph Extension A */
- [0x4cc9, 0x4cc9], /* CJK Ideograph Extension A */
- [0x4cca, 0x4cca], /* CJK Ideograph Extension A */
- [0x4ccb, 0x4ccb], /* CJK Ideograph Extension A */
- [0x4ccc, 0x4ccc], /* CJK Ideograph Extension A */
- [0x4ccd, 0x4ccd], /* CJK Ideograph Extension A */
- [0x4cce, 0x4cce], /* CJK Ideograph Extension A */
- [0x4ccf, 0x4ccf], /* CJK Ideograph Extension A */
- [0x4cd0, 0x4cd0], /* CJK Ideograph Extension A */
- [0x4cd1, 0x4cd1], /* CJK Ideograph Extension A */
- [0x4cd2, 0x4cd2], /* CJK Ideograph Extension A */
- [0x4cd3, 0x4cd3], /* CJK Ideograph Extension A */
- [0x4cd4, 0x4cd4], /* CJK Ideograph Extension A */
- [0x4cd5, 0x4cd5], /* CJK Ideograph Extension A */
- [0x4cd6, 0x4cd6], /* CJK Ideograph Extension A */
- [0x4cd7, 0x4cd7], /* CJK Ideograph Extension A */
- [0x4cd8, 0x4cd8], /* CJK Ideograph Extension A */
- [0x4cd9, 0x4cd9], /* CJK Ideograph Extension A */
- [0x4cda, 0x4cda], /* CJK Ideograph Extension A */
- [0x4cdb, 0x4cdb], /* CJK Ideograph Extension A */
- [0x4cdc, 0x4cdc], /* CJK Ideograph Extension A */
- [0x4cdd, 0x4cdd], /* CJK Ideograph Extension A */
- [0x4cde, 0x4cde], /* CJK Ideograph Extension A */
- [0x4cdf, 0x4cdf], /* CJK Ideograph Extension A */
- [0x4ce0, 0x4ce0], /* CJK Ideograph Extension A */
- [0x4ce1, 0x4ce1], /* CJK Ideograph Extension A */
- [0x4ce2, 0x4ce2], /* CJK Ideograph Extension A */
- [0x4ce3, 0x4ce3], /* CJK Ideograph Extension A */
- [0x4ce4, 0x4ce4], /* CJK Ideograph Extension A */
- [0x4ce5, 0x4ce5], /* CJK Ideograph Extension A */
- [0x4ce6, 0x4ce6], /* CJK Ideograph Extension A */
- [0x4ce7, 0x4ce7], /* CJK Ideograph Extension A */
- [0x4ce8, 0x4ce8], /* CJK Ideograph Extension A */
- [0x4ce9, 0x4ce9], /* CJK Ideograph Extension A */
- [0x4cea, 0x4cea], /* CJK Ideograph Extension A */
- [0x4ceb, 0x4ceb], /* CJK Ideograph Extension A */
- [0x4cec, 0x4cec], /* CJK Ideograph Extension A */
- [0x4ced, 0x4ced], /* CJK Ideograph Extension A */
- [0x4cee, 0x4cee], /* CJK Ideograph Extension A */
- [0x4cef, 0x4cef], /* CJK Ideograph Extension A */
- [0x4cf0, 0x4cf0], /* CJK Ideograph Extension A */
- [0x4cf1, 0x4cf1], /* CJK Ideograph Extension A */
- [0x4cf2, 0x4cf2], /* CJK Ideograph Extension A */
- [0x4cf3, 0x4cf3], /* CJK Ideograph Extension A */
- [0x4cf4, 0x4cf4], /* CJK Ideograph Extension A */
- [0x4cf5, 0x4cf5], /* CJK Ideograph Extension A */
- [0x4cf6, 0x4cf6], /* CJK Ideograph Extension A */
- [0x4cf7, 0x4cf7], /* CJK Ideograph Extension A */
- [0x4cf8, 0x4cf8], /* CJK Ideograph Extension A */
- [0x4cf9, 0x4cf9], /* CJK Ideograph Extension A */
- [0x4cfa, 0x4cfa], /* CJK Ideograph Extension A */
- [0x4cfb, 0x4cfb], /* CJK Ideograph Extension A */
- [0x4cfc, 0x4cfc], /* CJK Ideograph Extension A */
- [0x4cfd, 0x4cfd], /* CJK Ideograph Extension A */
- [0x4cfe, 0x4cfe], /* CJK Ideograph Extension A */
- [0x4cff, 0x4cff], /* CJK Ideograph Extension A */
- [0x4d00, 0x4d00], /* CJK Ideograph Extension A */
- [0x4d01, 0x4d01], /* CJK Ideograph Extension A */
- [0x4d02, 0x4d02], /* CJK Ideograph Extension A */
- [0x4d03, 0x4d03], /* CJK Ideograph Extension A */
- [0x4d04, 0x4d04], /* CJK Ideograph Extension A */
- [0x4d05, 0x4d05], /* CJK Ideograph Extension A */
- [0x4d06, 0x4d06], /* CJK Ideograph Extension A */
- [0x4d07, 0x4d07], /* CJK Ideograph Extension A */
- [0x4d08, 0x4d08], /* CJK Ideograph Extension A */
- [0x4d09, 0x4d09], /* CJK Ideograph Extension A */
- [0x4d0a, 0x4d0a], /* CJK Ideograph Extension A */
- [0x4d0b, 0x4d0b], /* CJK Ideograph Extension A */
- [0x4d0c, 0x4d0c], /* CJK Ideograph Extension A */
- [0x4d0d, 0x4d0d], /* CJK Ideograph Extension A */
- [0x4d0e, 0x4d0e], /* CJK Ideograph Extension A */
- [0x4d0f, 0x4d0f], /* CJK Ideograph Extension A */
- [0x4d10, 0x4d10], /* CJK Ideograph Extension A */
- [0x4d11, 0x4d11], /* CJK Ideograph Extension A */
- [0x4d12, 0x4d12], /* CJK Ideograph Extension A */
- [0x4d13, 0x4d13], /* CJK Ideograph Extension A */
- [0x4d14, 0x4d14], /* CJK Ideograph Extension A */
- [0x4d15, 0x4d15], /* CJK Ideograph Extension A */
- [0x4d16, 0x4d16], /* CJK Ideograph Extension A */
- [0x4d17, 0x4d17], /* CJK Ideograph Extension A */
- [0x4d18, 0x4d18], /* CJK Ideograph Extension A */
- [0x4d19, 0x4d19], /* CJK Ideograph Extension A */
- [0x4d1a, 0x4d1a], /* CJK Ideograph Extension A */
- [0x4d1b, 0x4d1b], /* CJK Ideograph Extension A */
- [0x4d1c, 0x4d1c], /* CJK Ideograph Extension A */
- [0x4d1d, 0x4d1d], /* CJK Ideograph Extension A */
- [0x4d1e, 0x4d1e], /* CJK Ideograph Extension A */
- [0x4d1f, 0x4d1f], /* CJK Ideograph Extension A */
- [0x4d20, 0x4d20], /* CJK Ideograph Extension A */
- [0x4d21, 0x4d21], /* CJK Ideograph Extension A */
- [0x4d22, 0x4d22], /* CJK Ideograph Extension A */
- [0x4d23, 0x4d23], /* CJK Ideograph Extension A */
- [0x4d24, 0x4d24], /* CJK Ideograph Extension A */
- [0x4d25, 0x4d25], /* CJK Ideograph Extension A */
- [0x4d26, 0x4d26], /* CJK Ideograph Extension A */
- [0x4d27, 0x4d27], /* CJK Ideograph Extension A */
- [0x4d28, 0x4d28], /* CJK Ideograph Extension A */
- [0x4d29, 0x4d29], /* CJK Ideograph Extension A */
- [0x4d2a, 0x4d2a], /* CJK Ideograph Extension A */
- [0x4d2b, 0x4d2b], /* CJK Ideograph Extension A */
- [0x4d2c, 0x4d2c], /* CJK Ideograph Extension A */
- [0x4d2d, 0x4d2d], /* CJK Ideograph Extension A */
- [0x4d2e, 0x4d2e], /* CJK Ideograph Extension A */
- [0x4d2f, 0x4d2f], /* CJK Ideograph Extension A */
- [0x4d30, 0x4d30], /* CJK Ideograph Extension A */
- [0x4d31, 0x4d31], /* CJK Ideograph Extension A */
- [0x4d32, 0x4d32], /* CJK Ideograph Extension A */
- [0x4d33, 0x4d33], /* CJK Ideograph Extension A */
- [0x4d34, 0x4d34], /* CJK Ideograph Extension A */
- [0x4d35, 0x4d35], /* CJK Ideograph Extension A */
- [0x4d36, 0x4d36], /* CJK Ideograph Extension A */
- [0x4d37, 0x4d37], /* CJK Ideograph Extension A */
- [0x4d38, 0x4d38], /* CJK Ideograph Extension A */
- [0x4d39, 0x4d39], /* CJK Ideograph Extension A */
- [0x4d3a, 0x4d3a], /* CJK Ideograph Extension A */
- [0x4d3b, 0x4d3b], /* CJK Ideograph Extension A */
- [0x4d3c, 0x4d3c], /* CJK Ideograph Extension A */
- [0x4d3d, 0x4d3d], /* CJK Ideograph Extension A */
- [0x4d3e, 0x4d3e], /* CJK Ideograph Extension A */
- [0x4d3f, 0x4d3f], /* CJK Ideograph Extension A */
- [0x4d40, 0x4d40], /* CJK Ideograph Extension A */
- [0x4d41, 0x4d41], /* CJK Ideograph Extension A */
- [0x4d42, 0x4d42], /* CJK Ideograph Extension A */
- [0x4d43, 0x4d43], /* CJK Ideograph Extension A */
- [0x4d44, 0x4d44], /* CJK Ideograph Extension A */
- [0x4d45, 0x4d45], /* CJK Ideograph Extension A */
- [0x4d46, 0x4d46], /* CJK Ideograph Extension A */
- [0x4d47, 0x4d47], /* CJK Ideograph Extension A */
- [0x4d48, 0x4d48], /* CJK Ideograph Extension A */
- [0x4d49, 0x4d49], /* CJK Ideograph Extension A */
- [0x4d4a, 0x4d4a], /* CJK Ideograph Extension A */
- [0x4d4b, 0x4d4b], /* CJK Ideograph Extension A */
- [0x4d4c, 0x4d4c], /* CJK Ideograph Extension A */
- [0x4d4d, 0x4d4d], /* CJK Ideograph Extension A */
- [0x4d4e, 0x4d4e], /* CJK Ideograph Extension A */
- [0x4d4f, 0x4d4f], /* CJK Ideograph Extension A */
- [0x4d50, 0x4d50], /* CJK Ideograph Extension A */
- [0x4d51, 0x4d51], /* CJK Ideograph Extension A */
- [0x4d52, 0x4d52], /* CJK Ideograph Extension A */
- [0x4d53, 0x4d53], /* CJK Ideograph Extension A */
- [0x4d54, 0x4d54], /* CJK Ideograph Extension A */
- [0x4d55, 0x4d55], /* CJK Ideograph Extension A */
- [0x4d56, 0x4d56], /* CJK Ideograph Extension A */
- [0x4d57, 0x4d57], /* CJK Ideograph Extension A */
- [0x4d58, 0x4d58], /* CJK Ideograph Extension A */
- [0x4d59, 0x4d59], /* CJK Ideograph Extension A */
- [0x4d5a, 0x4d5a], /* CJK Ideograph Extension A */
- [0x4d5b, 0x4d5b], /* CJK Ideograph Extension A */
- [0x4d5c, 0x4d5c], /* CJK Ideograph Extension A */
- [0x4d5d, 0x4d5d], /* CJK Ideograph Extension A */
- [0x4d5e, 0x4d5e], /* CJK Ideograph Extension A */
- [0x4d5f, 0x4d5f], /* CJK Ideograph Extension A */
- [0x4d60, 0x4d60], /* CJK Ideograph Extension A */
- [0x4d61, 0x4d61], /* CJK Ideograph Extension A */
- [0x4d62, 0x4d62], /* CJK Ideograph Extension A */
- [0x4d63, 0x4d63], /* CJK Ideograph Extension A */
- [0x4d64, 0x4d64], /* CJK Ideograph Extension A */
- [0x4d65, 0x4d65], /* CJK Ideograph Extension A */
- [0x4d66, 0x4d66], /* CJK Ideograph Extension A */
- [0x4d67, 0x4d67], /* CJK Ideograph Extension A */
- [0x4d68, 0x4d68], /* CJK Ideograph Extension A */
- [0x4d69, 0x4d69], /* CJK Ideograph Extension A */
- [0x4d6a, 0x4d6a], /* CJK Ideograph Extension A */
- [0x4d6b, 0x4d6b], /* CJK Ideograph Extension A */
- [0x4d6c, 0x4d6c], /* CJK Ideograph Extension A */
- [0x4d6d, 0x4d6d], /* CJK Ideograph Extension A */
- [0x4d6e, 0x4d6e], /* CJK Ideograph Extension A */
- [0x4d6f, 0x4d6f], /* CJK Ideograph Extension A */
- [0x4d70, 0x4d70], /* CJK Ideograph Extension A */
- [0x4d71, 0x4d71], /* CJK Ideograph Extension A */
- [0x4d72, 0x4d72], /* CJK Ideograph Extension A */
- [0x4d73, 0x4d73], /* CJK Ideograph Extension A */
- [0x4d74, 0x4d74], /* CJK Ideograph Extension A */
- [0x4d75, 0x4d75], /* CJK Ideograph Extension A */
- [0x4d76, 0x4d76], /* CJK Ideograph Extension A */
- [0x4d77, 0x4d77], /* CJK Ideograph Extension A */
- [0x4d78, 0x4d78], /* CJK Ideograph Extension A */
- [0x4d79, 0x4d79], /* CJK Ideograph Extension A */
- [0x4d7a, 0x4d7a], /* CJK Ideograph Extension A */
- [0x4d7b, 0x4d7b], /* CJK Ideograph Extension A */
- [0x4d7c, 0x4d7c], /* CJK Ideograph Extension A */
- [0x4d7d, 0x4d7d], /* CJK Ideograph Extension A */
- [0x4d7e, 0x4d7e], /* CJK Ideograph Extension A */
- [0x4d7f, 0x4d7f], /* CJK Ideograph Extension A */
- [0x4d80, 0x4d80], /* CJK Ideograph Extension A */
- [0x4d81, 0x4d81], /* CJK Ideograph Extension A */
- [0x4d82, 0x4d82], /* CJK Ideograph Extension A */
- [0x4d83, 0x4d83], /* CJK Ideograph Extension A */
- [0x4d84, 0x4d84], /* CJK Ideograph Extension A */
- [0x4d85, 0x4d85], /* CJK Ideograph Extension A */
- [0x4d86, 0x4d86], /* CJK Ideograph Extension A */
- [0x4d87, 0x4d87], /* CJK Ideograph Extension A */
- [0x4d88, 0x4d88], /* CJK Ideograph Extension A */
- [0x4d89, 0x4d89], /* CJK Ideograph Extension A */
- [0x4d8a, 0x4d8a], /* CJK Ideograph Extension A */
- [0x4d8b, 0x4d8b], /* CJK Ideograph Extension A */
- [0x4d8c, 0x4d8c], /* CJK Ideograph Extension A */
- [0x4d8d, 0x4d8d], /* CJK Ideograph Extension A */
- [0x4d8e, 0x4d8e], /* CJK Ideograph Extension A */
- [0x4d8f, 0x4d8f], /* CJK Ideograph Extension A */
- [0x4d90, 0x4d90], /* CJK Ideograph Extension A */
- [0x4d91, 0x4d91], /* CJK Ideograph Extension A */
- [0x4d92, 0x4d92], /* CJK Ideograph Extension A */
- [0x4d93, 0x4d93], /* CJK Ideograph Extension A */
- [0x4d94, 0x4d94], /* CJK Ideograph Extension A */
- [0x4d95, 0x4d95], /* CJK Ideograph Extension A */
- [0x4d96, 0x4d96], /* CJK Ideograph Extension A */
- [0x4d97, 0x4d97], /* CJK Ideograph Extension A */
- [0x4d98, 0x4d98], /* CJK Ideograph Extension A */
- [0x4d99, 0x4d99], /* CJK Ideograph Extension A */
- [0x4d9a, 0x4d9a], /* CJK Ideograph Extension A */
- [0x4d9b, 0x4d9b], /* CJK Ideograph Extension A */
- [0x4d9c, 0x4d9c], /* CJK Ideograph Extension A */
- [0x4d9d, 0x4d9d], /* CJK Ideograph Extension A */
- [0x4d9e, 0x4d9e], /* CJK Ideograph Extension A */
- [0x4d9f, 0x4d9f], /* CJK Ideograph Extension A */
- [0x4da0, 0x4da0], /* CJK Ideograph Extension A */
- [0x4da1, 0x4da1], /* CJK Ideograph Extension A */
- [0x4da2, 0x4da2], /* CJK Ideograph Extension A */
- [0x4da3, 0x4da3], /* CJK Ideograph Extension A */
- [0x4da4, 0x4da4], /* CJK Ideograph Extension A */
- [0x4da5, 0x4da5], /* CJK Ideograph Extension A */
- [0x4da6, 0x4da6], /* CJK Ideograph Extension A */
- [0x4da7, 0x4da7], /* CJK Ideograph Extension A */
- [0x4da8, 0x4da8], /* CJK Ideograph Extension A */
- [0x4da9, 0x4da9], /* CJK Ideograph Extension A */
- [0x4daa, 0x4daa], /* CJK Ideograph Extension A */
- [0x4dab, 0x4dab], /* CJK Ideograph Extension A */
- [0x4dac, 0x4dac], /* CJK Ideograph Extension A */
- [0x4dad, 0x4dad], /* CJK Ideograph Extension A */
- [0x4dae, 0x4dae], /* CJK Ideograph Extension A */
- [0x4daf, 0x4daf], /* CJK Ideograph Extension A */
- [0x4db0, 0x4db0], /* CJK Ideograph Extension A */
- [0x4db1, 0x4db1], /* CJK Ideograph Extension A */
- [0x4db2, 0x4db2], /* CJK Ideograph Extension A */
- [0x4db3, 0x4db3], /* CJK Ideograph Extension A */
- [0x4db4, 0x4db4], /* CJK Ideograph Extension A */
- [0x4db5, 0x4db5], /* CJK Ideograph Extension A */
- [0x4db6, 0x4db6],
- [0x4db7, 0x4db7],
- [0x4db8, 0x4db8],
- [0x4db9, 0x4db9],
- [0x4dba, 0x4dba],
- [0x4dbb, 0x4dbb],
- [0x4dbc, 0x4dbc],
- [0x4dbd, 0x4dbd],
- [0x4dbe, 0x4dbe],
- [0x4dbf, 0x4dbf],
- [0x4dc0, 0x4dc0], /* HEXAGRAM FOR THE CREATIVE HEAVEN */
- [0x4dc1, 0x4dc1], /* HEXAGRAM FOR THE RECEPTIVE EARTH */
- [0x4dc2, 0x4dc2], /* HEXAGRAM FOR DIFFICULTY AT THE BEGINNING */
- [0x4dc3, 0x4dc3], /* HEXAGRAM FOR YOUTHFUL FOLLY */
- [0x4dc4, 0x4dc4], /* HEXAGRAM FOR WAITING */
- [0x4dc5, 0x4dc5], /* HEXAGRAM FOR CONFLICT */
- [0x4dc6, 0x4dc6], /* HEXAGRAM FOR THE ARMY */
- [0x4dc7, 0x4dc7], /* HEXAGRAM FOR HOLDING TOGETHER */
- [0x4dc8, 0x4dc8], /* HEXAGRAM FOR SMALL TAMING */
- [0x4dc9, 0x4dc9], /* HEXAGRAM FOR TREADING */
- [0x4dca, 0x4dca], /* HEXAGRAM FOR PEACE */
- [0x4dcb, 0x4dcb], /* HEXAGRAM FOR STANDSTILL */
- [0x4dcc, 0x4dcc], /* HEXAGRAM FOR FELLOWSHIP */
- [0x4dcd, 0x4dcd], /* HEXAGRAM FOR GREAT POSSESSION */
- [0x4dce, 0x4dce], /* HEXAGRAM FOR MODESTY */
- [0x4dcf, 0x4dcf], /* HEXAGRAM FOR ENTHUSIASM */
- [0x4dd0, 0x4dd0], /* HEXAGRAM FOR FOLLOWING */
- [0x4dd1, 0x4dd1], /* HEXAGRAM FOR WORK ON THE DECAYED */
- [0x4dd2, 0x4dd2], /* HEXAGRAM FOR APPROACH */
- [0x4dd3, 0x4dd3], /* HEXAGRAM FOR CONTEMPLATION */
- [0x4dd4, 0x4dd4], /* HEXAGRAM FOR BITING THROUGH */
- [0x4dd5, 0x4dd5], /* HEXAGRAM FOR GRACE */
- [0x4dd6, 0x4dd6], /* HEXAGRAM FOR SPLITTING APART */
- [0x4dd7, 0x4dd7], /* HEXAGRAM FOR RETURN */
- [0x4dd8, 0x4dd8], /* HEXAGRAM FOR INNOCENCE */
- [0x4dd9, 0x4dd9], /* HEXAGRAM FOR GREAT TAMING */
- [0x4dda, 0x4dda], /* HEXAGRAM FOR MOUTH CORNERS */
- [0x4ddb, 0x4ddb], /* HEXAGRAM FOR GREAT PREPONDERANCE */
- [0x4ddc, 0x4ddc], /* HEXAGRAM FOR THE ABYSMAL WATER */
- [0x4ddd, 0x4ddd], /* HEXAGRAM FOR THE CLINGING FIRE */
- [0x4dde, 0x4dde], /* HEXAGRAM FOR INFLUENCE */
- [0x4ddf, 0x4ddf], /* HEXAGRAM FOR DURATION */
- [0x4de0, 0x4de0], /* HEXAGRAM FOR RETREAT */
- [0x4de1, 0x4de1], /* HEXAGRAM FOR GREAT POWER */
- [0x4de2, 0x4de2], /* HEXAGRAM FOR PROGRESS */
- [0x4de3, 0x4de3], /* HEXAGRAM FOR DARKENING OF THE LIGHT */
- [0x4de4, 0x4de4], /* HEXAGRAM FOR THE FAMILY */
- [0x4de5, 0x4de5], /* HEXAGRAM FOR OPPOSITION */
- [0x4de6, 0x4de6], /* HEXAGRAM FOR OBSTRUCTION */
- [0x4de7, 0x4de7], /* HEXAGRAM FOR DELIVERANCE */
- [0x4de8, 0x4de8], /* HEXAGRAM FOR DECREASE */
- [0x4de9, 0x4de9], /* HEXAGRAM FOR INCREASE */
- [0x4dea, 0x4dea], /* HEXAGRAM FOR BREAKTHROUGH */
- [0x4deb, 0x4deb], /* HEXAGRAM FOR COMING TO MEET */
- [0x4dec, 0x4dec], /* HEXAGRAM FOR GATHERING TOGETHER */
- [0x4ded, 0x4ded], /* HEXAGRAM FOR PUSHING UPWARD */
- [0x4dee, 0x4dee], /* HEXAGRAM FOR OPPRESSION */
- [0x4def, 0x4def], /* HEXAGRAM FOR THE WELL */
- [0x4df0, 0x4df0], /* HEXAGRAM FOR REVOLUTION */
- [0x4df1, 0x4df1], /* HEXAGRAM FOR THE CAULDRON */
- [0x4df2, 0x4df2], /* HEXAGRAM FOR THE AROUSING THUNDER */
- [0x4df3, 0x4df3], /* HEXAGRAM FOR THE KEEPING STILL MOUNTAIN */
- [0x4df4, 0x4df4], /* HEXAGRAM FOR DEVELOPMENT */
- [0x4df5, 0x4df5], /* HEXAGRAM FOR THE MARRYING MAIDEN */
- [0x4df6, 0x4df6], /* HEXAGRAM FOR ABUNDANCE */
- [0x4df7, 0x4df7], /* HEXAGRAM FOR THE WANDERER */
- [0x4df8, 0x4df8], /* HEXAGRAM FOR THE GENTLE WIND */
- [0x4df9, 0x4df9], /* HEXAGRAM FOR THE JOYOUS LAKE */
- [0x4dfa, 0x4dfa], /* HEXAGRAM FOR DISPERSION */
- [0x4dfb, 0x4dfb], /* HEXAGRAM FOR LIMITATION */
- [0x4dfc, 0x4dfc], /* HEXAGRAM FOR INNER TRUTH */
- [0x4dfd, 0x4dfd], /* HEXAGRAM FOR SMALL PREPONDERANCE */
- [0x4dfe, 0x4dfe], /* HEXAGRAM FOR AFTER COMPLETION */
- [0x4dff, 0x4dff], /* HEXAGRAM FOR BEFORE COMPLETION */
- [0x4e00, 0x4e00], /* CJK Ideograph */
- [0x4e01, 0x4e01], /* CJK Ideograph */
- [0x4e02, 0x4e02], /* CJK Ideograph */
- [0x4e03, 0x4e03], /* CJK Ideograph */
- [0x4e04, 0x4e04], /* CJK Ideograph */
- [0x4e05, 0x4e05], /* CJK Ideograph */
- [0x4e06, 0x4e06], /* CJK Ideograph */
- [0x4e07, 0x4e07], /* CJK Ideograph */
- [0x4e08, 0x4e08], /* CJK Ideograph */
- [0x4e09, 0x4e09], /* CJK Ideograph */
- [0x4e0a, 0x4e0a], /* CJK Ideograph */
- [0x4e0b, 0x4e0b], /* CJK Ideograph */
- [0x4e0c, 0x4e0c], /* CJK Ideograph */
- [0x4e0d, 0x4e0d], /* CJK Ideograph */
- [0x4e0e, 0x4e0e], /* CJK Ideograph */
- [0x4e0f, 0x4e0f], /* CJK Ideograph */
- [0x4e10, 0x4e10], /* CJK Ideograph */
- [0x4e11, 0x4e11], /* CJK Ideograph */
- [0x4e12, 0x4e12], /* CJK Ideograph */
- [0x4e13, 0x4e13], /* CJK Ideograph */
- [0x4e14, 0x4e14], /* CJK Ideograph */
- [0x4e15, 0x4e15], /* CJK Ideograph */
- [0x4e16, 0x4e16], /* CJK Ideograph */
- [0x4e17, 0x4e17], /* CJK Ideograph */
- [0x4e18, 0x4e18], /* CJK Ideograph */
- [0x4e19, 0x4e19], /* CJK Ideograph */
- [0x4e1a, 0x4e1a], /* CJK Ideograph */
- [0x4e1b, 0x4e1b], /* CJK Ideograph */
- [0x4e1c, 0x4e1c], /* CJK Ideograph */
- [0x4e1d, 0x4e1d], /* CJK Ideograph */
- [0x4e1e, 0x4e1e], /* CJK Ideograph */
- [0x4e1f, 0x4e1f], /* CJK Ideograph */
- [0x4e20, 0x4e20], /* CJK Ideograph */
- [0x4e21, 0x4e21], /* CJK Ideograph */
- [0x4e22, 0x4e22], /* CJK Ideograph */
- [0x4e23, 0x4e23], /* CJK Ideograph */
- [0x4e24, 0x4e24], /* CJK Ideograph */
- [0x4e25, 0x4e25], /* CJK Ideograph */
- [0x4e26, 0x4e26], /* CJK Ideograph */
- [0x4e27, 0x4e27], /* CJK Ideograph */
- [0x4e28, 0x4e28], /* CJK Ideograph */
- [0x4e29, 0x4e29], /* CJK Ideograph */
- [0x4e2a, 0x4e2a], /* CJK Ideograph */
- [0x4e2b, 0x4e2b], /* CJK Ideograph */
- [0x4e2c, 0x4e2c], /* CJK Ideograph */
- [0x4e2d, 0x4e2d], /* CJK Ideograph */
- [0x4e2e, 0x4e2e], /* CJK Ideograph */
- [0x4e2f, 0x4e2f], /* CJK Ideograph */
- [0x4e30, 0x4e30], /* CJK Ideograph */
- [0x4e31, 0x4e31], /* CJK Ideograph */
- [0x4e32, 0x4e32], /* CJK Ideograph */
- [0x4e33, 0x4e33], /* CJK Ideograph */
- [0x4e34, 0x4e34], /* CJK Ideograph */
- [0x4e35, 0x4e35], /* CJK Ideograph */
- [0x4e36, 0x4e36], /* CJK Ideograph */
- [0x4e37, 0x4e37], /* CJK Ideograph */
- [0x4e38, 0x4e38], /* CJK Ideograph */
- [0x4e39, 0x4e39], /* CJK Ideograph */
- [0x4e3a, 0x4e3a], /* CJK Ideograph */
- [0x4e3b, 0x4e3b], /* CJK Ideograph */
- [0x4e3c, 0x4e3c], /* CJK Ideograph */
- [0x4e3d, 0x4e3d], /* CJK Ideograph */
- [0x4e3e, 0x4e3e], /* CJK Ideograph */
- [0x4e3f, 0x4e3f], /* CJK Ideograph */
- [0x4e40, 0x4e40], /* CJK Ideograph */
- [0x4e41, 0x4e41], /* CJK Ideograph */
- [0x4e42, 0x4e42], /* CJK Ideograph */
- [0x4e43, 0x4e43], /* CJK Ideograph */
- [0x4e44, 0x4e44], /* CJK Ideograph */
- [0x4e45, 0x4e45], /* CJK Ideograph */
- [0x4e46, 0x4e46], /* CJK Ideograph */
- [0x4e47, 0x4e47], /* CJK Ideograph */
- [0x4e48, 0x4e48], /* CJK Ideograph */
- [0x4e49, 0x4e49], /* CJK Ideograph */
- [0x4e4a, 0x4e4a], /* CJK Ideograph */
- [0x4e4b, 0x4e4b], /* CJK Ideograph */
- [0x4e4c, 0x4e4c], /* CJK Ideograph */
- [0x4e4d, 0x4e4d], /* CJK Ideograph */
- [0x4e4e, 0x4e4e], /* CJK Ideograph */
- [0x4e4f, 0x4e4f], /* CJK Ideograph */
- [0x4e50, 0x4e50], /* CJK Ideograph */
- [0x4e51, 0x4e51], /* CJK Ideograph */
- [0x4e52, 0x4e52], /* CJK Ideograph */
- [0x4e53, 0x4e53], /* CJK Ideograph */
- [0x4e54, 0x4e54], /* CJK Ideograph */
- [0x4e55, 0x4e55], /* CJK Ideograph */
- [0x4e56, 0x4e56], /* CJK Ideograph */
- [0x4e57, 0x4e57], /* CJK Ideograph */
- [0x4e58, 0x4e58], /* CJK Ideograph */
- [0x4e59, 0x4e59], /* CJK Ideograph */
- [0x4e5a, 0x4e5a], /* CJK Ideograph */
- [0x4e5b, 0x4e5b], /* CJK Ideograph */
- [0x4e5c, 0x4e5c], /* CJK Ideograph */
- [0x4e5d, 0x4e5d], /* CJK Ideograph */
- [0x4e5e, 0x4e5e], /* CJK Ideograph */
- [0x4e5f, 0x4e5f], /* CJK Ideograph */
- [0x4e60, 0x4e60], /* CJK Ideograph */
- [0x4e61, 0x4e61], /* CJK Ideograph */
- [0x4e62, 0x4e62], /* CJK Ideograph */
- [0x4e63, 0x4e63], /* CJK Ideograph */
- [0x4e64, 0x4e64], /* CJK Ideograph */
- [0x4e65, 0x4e65], /* CJK Ideograph */
- [0x4e66, 0x4e66], /* CJK Ideograph */
- [0x4e67, 0x4e67], /* CJK Ideograph */
- [0x4e68, 0x4e68], /* CJK Ideograph */
- [0x4e69, 0x4e69], /* CJK Ideograph */
- [0x4e6a, 0x4e6a], /* CJK Ideograph */
- [0x4e6b, 0x4e6b], /* CJK Ideograph */
- [0x4e6c, 0x4e6c], /* CJK Ideograph */
- [0x4e6d, 0x4e6d], /* CJK Ideograph */
- [0x4e6e, 0x4e6e], /* CJK Ideograph */
- [0x4e6f, 0x4e6f], /* CJK Ideograph */
- [0x4e70, 0x4e70], /* CJK Ideograph */
- [0x4e71, 0x4e71], /* CJK Ideograph */
- [0x4e72, 0x4e72], /* CJK Ideograph */
- [0x4e73, 0x4e73], /* CJK Ideograph */
- [0x4e74, 0x4e74], /* CJK Ideograph */
- [0x4e75, 0x4e75], /* CJK Ideograph */
- [0x4e76, 0x4e76], /* CJK Ideograph */
- [0x4e77, 0x4e77], /* CJK Ideograph */
- [0x4e78, 0x4e78], /* CJK Ideograph */
- [0x4e79, 0x4e79], /* CJK Ideograph */
- [0x4e7a, 0x4e7a], /* CJK Ideograph */
- [0x4e7b, 0x4e7b], /* CJK Ideograph */
- [0x4e7c, 0x4e7c], /* CJK Ideograph */
- [0x4e7d, 0x4e7d], /* CJK Ideograph */
- [0x4e7e, 0x4e7e], /* CJK Ideograph */
- [0x4e7f, 0x4e7f], /* CJK Ideograph */
- [0x4e80, 0x4e80], /* CJK Ideograph */
- [0x4e81, 0x4e81], /* CJK Ideograph */
- [0x4e82, 0x4e82], /* CJK Ideograph */
- [0x4e83, 0x4e83], /* CJK Ideograph */
- [0x4e84, 0x4e84], /* CJK Ideograph */
- [0x4e85, 0x4e85], /* CJK Ideograph */
- [0x4e86, 0x4e86], /* CJK Ideograph */
- [0x4e87, 0x4e87], /* CJK Ideograph */
- [0x4e88, 0x4e88], /* CJK Ideograph */
- [0x4e89, 0x4e89], /* CJK Ideograph */
- [0x4e8a, 0x4e8a], /* CJK Ideograph */
- [0x4e8b, 0x4e8b], /* CJK Ideograph */
- [0x4e8c, 0x4e8c], /* CJK Ideograph */
- [0x4e8d, 0x4e8d], /* CJK Ideograph */
- [0x4e8e, 0x4e8e], /* CJK Ideograph */
- [0x4e8f, 0x4e8f], /* CJK Ideograph */
- [0x4e90, 0x4e90], /* CJK Ideograph */
- [0x4e91, 0x4e91], /* CJK Ideograph */
- [0x4e92, 0x4e92], /* CJK Ideograph */
- [0x4e93, 0x4e93], /* CJK Ideograph */
- [0x4e94, 0x4e94], /* CJK Ideograph */
- [0x4e95, 0x4e95], /* CJK Ideograph */
- [0x4e96, 0x4e96], /* CJK Ideograph */
- [0x4e97, 0x4e97], /* CJK Ideograph */
- [0x4e98, 0x4e98], /* CJK Ideograph */
- [0x4e99, 0x4e99], /* CJK Ideograph */
- [0x4e9a, 0x4e9a], /* CJK Ideograph */
- [0x4e9b, 0x4e9b], /* CJK Ideograph */
- [0x4e9c, 0x4e9c], /* CJK Ideograph */
- [0x4e9d, 0x4e9d], /* CJK Ideograph */
- [0x4e9e, 0x4e9e], /* CJK Ideograph */
- [0x4e9f, 0x4e9f], /* CJK Ideograph */
- [0x4ea0, 0x4ea0], /* CJK Ideograph */
- [0x4ea1, 0x4ea1], /* CJK Ideograph */
- [0x4ea2, 0x4ea2], /* CJK Ideograph */
- [0x4ea3, 0x4ea3], /* CJK Ideograph */
- [0x4ea4, 0x4ea4], /* CJK Ideograph */
- [0x4ea5, 0x4ea5], /* CJK Ideograph */
- [0x4ea6, 0x4ea6], /* CJK Ideograph */
- [0x4ea7, 0x4ea7], /* CJK Ideograph */
- [0x4ea8, 0x4ea8], /* CJK Ideograph */
- [0x4ea9, 0x4ea9], /* CJK Ideograph */
- [0x4eaa, 0x4eaa], /* CJK Ideograph */
- [0x4eab, 0x4eab], /* CJK Ideograph */
- [0x4eac, 0x4eac], /* CJK Ideograph */
- [0x4ead, 0x4ead], /* CJK Ideograph */
- [0x4eae, 0x4eae], /* CJK Ideograph */
- [0x4eaf, 0x4eaf], /* CJK Ideograph */
- [0x4eb0, 0x4eb0], /* CJK Ideograph */
- [0x4eb1, 0x4eb1], /* CJK Ideograph */
- [0x4eb2, 0x4eb2], /* CJK Ideograph */
- [0x4eb3, 0x4eb3], /* CJK Ideograph */
- [0x4eb4, 0x4eb4], /* CJK Ideograph */
- [0x4eb5, 0x4eb5], /* CJK Ideograph */
- [0x4eb6, 0x4eb6], /* CJK Ideograph */
- [0x4eb7, 0x4eb7], /* CJK Ideograph */
- [0x4eb8, 0x4eb8], /* CJK Ideograph */
- [0x4eb9, 0x4eb9], /* CJK Ideograph */
- [0x4eba, 0x4eba], /* CJK Ideograph */
- [0x4ebb, 0x4ebb], /* CJK Ideograph */
- [0x4ebc, 0x4ebc], /* CJK Ideograph */
- [0x4ebd, 0x4ebd], /* CJK Ideograph */
- [0x4ebe, 0x4ebe], /* CJK Ideograph */
- [0x4ebf, 0x4ebf], /* CJK Ideograph */
- [0x4ec0, 0x4ec0], /* CJK Ideograph */
- [0x4ec1, 0x4ec1], /* CJK Ideograph */
- [0x4ec2, 0x4ec2], /* CJK Ideograph */
- [0x4ec3, 0x4ec3], /* CJK Ideograph */
- [0x4ec4, 0x4ec4], /* CJK Ideograph */
- [0x4ec5, 0x4ec5], /* CJK Ideograph */
- [0x4ec6, 0x4ec6], /* CJK Ideograph */
- [0x4ec7, 0x4ec7], /* CJK Ideograph */
- [0x4ec8, 0x4ec8], /* CJK Ideograph */
- [0x4ec9, 0x4ec9], /* CJK Ideograph */
- [0x4eca, 0x4eca], /* CJK Ideograph */
- [0x4ecb, 0x4ecb], /* CJK Ideograph */
- [0x4ecc, 0x4ecc], /* CJK Ideograph */
- [0x4ecd, 0x4ecd], /* CJK Ideograph */
- [0x4ece, 0x4ece], /* CJK Ideograph */
- [0x4ecf, 0x4ecf], /* CJK Ideograph */
- [0x4ed0, 0x4ed0], /* CJK Ideograph */
- [0x4ed1, 0x4ed1], /* CJK Ideograph */
- [0x4ed2, 0x4ed2], /* CJK Ideograph */
- [0x4ed3, 0x4ed3], /* CJK Ideograph */
- [0x4ed4, 0x4ed4], /* CJK Ideograph */
- [0x4ed5, 0x4ed5], /* CJK Ideograph */
- [0x4ed6, 0x4ed6], /* CJK Ideograph */
- [0x4ed7, 0x4ed7], /* CJK Ideograph */
- [0x4ed8, 0x4ed8], /* CJK Ideograph */
- [0x4ed9, 0x4ed9], /* CJK Ideograph */
- [0x4eda, 0x4eda], /* CJK Ideograph */
- [0x4edb, 0x4edb], /* CJK Ideograph */
- [0x4edc, 0x4edc], /* CJK Ideograph */
- [0x4edd, 0x4edd], /* CJK Ideograph */
- [0x4ede, 0x4ede], /* CJK Ideograph */
- [0x4edf, 0x4edf], /* CJK Ideograph */
- [0x4ee0, 0x4ee0], /* CJK Ideograph */
- [0x4ee1, 0x4ee1], /* CJK Ideograph */
- [0x4ee2, 0x4ee2], /* CJK Ideograph */
- [0x4ee3, 0x4ee3], /* CJK Ideograph */
- [0x4ee4, 0x4ee4], /* CJK Ideograph */
- [0x4ee5, 0x4ee5], /* CJK Ideograph */
- [0x4ee6, 0x4ee6], /* CJK Ideograph */
- [0x4ee7, 0x4ee7], /* CJK Ideograph */
- [0x4ee8, 0x4ee8], /* CJK Ideograph */
- [0x4ee9, 0x4ee9], /* CJK Ideograph */
- [0x4eea, 0x4eea], /* CJK Ideograph */
- [0x4eeb, 0x4eeb], /* CJK Ideograph */
- [0x4eec, 0x4eec], /* CJK Ideograph */
- [0x4eed, 0x4eed], /* CJK Ideograph */
- [0x4eee, 0x4eee], /* CJK Ideograph */
- [0x4eef, 0x4eef], /* CJK Ideograph */
- [0x4ef0, 0x4ef0], /* CJK Ideograph */
- [0x4ef1, 0x4ef1], /* CJK Ideograph */
- [0x4ef2, 0x4ef2], /* CJK Ideograph */
- [0x4ef3, 0x4ef3], /* CJK Ideograph */
- [0x4ef4, 0x4ef4], /* CJK Ideograph */
- [0x4ef5, 0x4ef5], /* CJK Ideograph */
- [0x4ef6, 0x4ef6], /* CJK Ideograph */
- [0x4ef7, 0x4ef7], /* CJK Ideograph */
- [0x4ef8, 0x4ef8], /* CJK Ideograph */
- [0x4ef9, 0x4ef9], /* CJK Ideograph */
- [0x4efa, 0x4efa], /* CJK Ideograph */
- [0x4efb, 0x4efb], /* CJK Ideograph */
- [0x4efc, 0x4efc], /* CJK Ideograph */
- [0x4efd, 0x4efd], /* CJK Ideograph */
- [0x4efe, 0x4efe], /* CJK Ideograph */
- [0x4eff, 0x4eff], /* CJK Ideograph */
- [0x4f00, 0x4f00], /* CJK Ideograph */
- [0x4f01, 0x4f01], /* CJK Ideograph */
- [0x4f02, 0x4f02], /* CJK Ideograph */
- [0x4f03, 0x4f03], /* CJK Ideograph */
- [0x4f04, 0x4f04], /* CJK Ideograph */
- [0x4f05, 0x4f05], /* CJK Ideograph */
- [0x4f06, 0x4f06], /* CJK Ideograph */
- [0x4f07, 0x4f07], /* CJK Ideograph */
- [0x4f08, 0x4f08], /* CJK Ideograph */
- [0x4f09, 0x4f09], /* CJK Ideograph */
- [0x4f0a, 0x4f0a], /* CJK Ideograph */
- [0x4f0b, 0x4f0b], /* CJK Ideograph */
- [0x4f0c, 0x4f0c], /* CJK Ideograph */
- [0x4f0d, 0x4f0d], /* CJK Ideograph */
- [0x4f0e, 0x4f0e], /* CJK Ideograph */
- [0x4f0f, 0x4f0f], /* CJK Ideograph */
- [0x4f10, 0x4f10], /* CJK Ideograph */
- [0x4f11, 0x4f11], /* CJK Ideograph */
- [0x4f12, 0x4f12], /* CJK Ideograph */
- [0x4f13, 0x4f13], /* CJK Ideograph */
- [0x4f14, 0x4f14], /* CJK Ideograph */
- [0x4f15, 0x4f15], /* CJK Ideograph */
- [0x4f16, 0x4f16], /* CJK Ideograph */
- [0x4f17, 0x4f17], /* CJK Ideograph */
- [0x4f18, 0x4f18], /* CJK Ideograph */
- [0x4f19, 0x4f19], /* CJK Ideograph */
- [0x4f1a, 0x4f1a], /* CJK Ideograph */
- [0x4f1b, 0x4f1b], /* CJK Ideograph */
- [0x4f1c, 0x4f1c], /* CJK Ideograph */
- [0x4f1d, 0x4f1d], /* CJK Ideograph */
- [0x4f1e, 0x4f1e], /* CJK Ideograph */
- [0x4f1f, 0x4f1f], /* CJK Ideograph */
- [0x4f20, 0x4f20], /* CJK Ideograph */
- [0x4f21, 0x4f21], /* CJK Ideograph */
- [0x4f22, 0x4f22], /* CJK Ideograph */
- [0x4f23, 0x4f23], /* CJK Ideograph */
- [0x4f24, 0x4f24], /* CJK Ideograph */
- [0x4f25, 0x4f25], /* CJK Ideograph */
- [0x4f26, 0x4f26], /* CJK Ideograph */
- [0x4f27, 0x4f27], /* CJK Ideograph */
- [0x4f28, 0x4f28], /* CJK Ideograph */
- [0x4f29, 0x4f29], /* CJK Ideograph */
- [0x4f2a, 0x4f2a], /* CJK Ideograph */
- [0x4f2b, 0x4f2b], /* CJK Ideograph */
- [0x4f2c, 0x4f2c], /* CJK Ideograph */
- [0x4f2d, 0x4f2d], /* CJK Ideograph */
- [0x4f2e, 0x4f2e], /* CJK Ideograph */
- [0x4f2f, 0x4f2f], /* CJK Ideograph */
- [0x4f30, 0x4f30], /* CJK Ideograph */
- [0x4f31, 0x4f31], /* CJK Ideograph */
- [0x4f32, 0x4f32], /* CJK Ideograph */
- [0x4f33, 0x4f33], /* CJK Ideograph */
- [0x4f34, 0x4f34], /* CJK Ideograph */
- [0x4f35, 0x4f35], /* CJK Ideograph */
- [0x4f36, 0x4f36], /* CJK Ideograph */
- [0x4f37, 0x4f37], /* CJK Ideograph */
- [0x4f38, 0x4f38], /* CJK Ideograph */
- [0x4f39, 0x4f39], /* CJK Ideograph */
- [0x4f3a, 0x4f3a], /* CJK Ideograph */
- [0x4f3b, 0x4f3b], /* CJK Ideograph */
- [0x4f3c, 0x4f3c], /* CJK Ideograph */
- [0x4f3d, 0x4f3d], /* CJK Ideograph */
- [0x4f3e, 0x4f3e], /* CJK Ideograph */
- [0x4f3f, 0x4f3f], /* CJK Ideograph */
- [0x4f40, 0x4f40], /* CJK Ideograph */
- [0x4f41, 0x4f41], /* CJK Ideograph */
- [0x4f42, 0x4f42], /* CJK Ideograph */
- [0x4f43, 0x4f43], /* CJK Ideograph */
- [0x4f44, 0x4f44], /* CJK Ideograph */
- [0x4f45, 0x4f45], /* CJK Ideograph */
- [0x4f46, 0x4f46], /* CJK Ideograph */
- [0x4f47, 0x4f47], /* CJK Ideograph */
- [0x4f48, 0x4f48], /* CJK Ideograph */
- [0x4f49, 0x4f49], /* CJK Ideograph */
- [0x4f4a, 0x4f4a], /* CJK Ideograph */
- [0x4f4b, 0x4f4b], /* CJK Ideograph */
- [0x4f4c, 0x4f4c], /* CJK Ideograph */
- [0x4f4d, 0x4f4d], /* CJK Ideograph */
- [0x4f4e, 0x4f4e], /* CJK Ideograph */
- [0x4f4f, 0x4f4f], /* CJK Ideograph */
- [0x4f50, 0x4f50], /* CJK Ideograph */
- [0x4f51, 0x4f51], /* CJK Ideograph */
- [0x4f52, 0x4f52], /* CJK Ideograph */
- [0x4f53, 0x4f53], /* CJK Ideograph */
- [0x4f54, 0x4f54], /* CJK Ideograph */
- [0x4f55, 0x4f55], /* CJK Ideograph */
- [0x4f56, 0x4f56], /* CJK Ideograph */
- [0x4f57, 0x4f57], /* CJK Ideograph */
- [0x4f58, 0x4f58], /* CJK Ideograph */
- [0x4f59, 0x4f59], /* CJK Ideograph */
- [0x4f5a, 0x4f5a], /* CJK Ideograph */
- [0x4f5b, 0x4f5b], /* CJK Ideograph */
- [0x4f5c, 0x4f5c], /* CJK Ideograph */
- [0x4f5d, 0x4f5d], /* CJK Ideograph */
- [0x4f5e, 0x4f5e], /* CJK Ideograph */
- [0x4f5f, 0x4f5f], /* CJK Ideograph */
- [0x4f60, 0x4f60], /* CJK Ideograph */
- [0x4f61, 0x4f61], /* CJK Ideograph */
- [0x4f62, 0x4f62], /* CJK Ideograph */
- [0x4f63, 0x4f63], /* CJK Ideograph */
- [0x4f64, 0x4f64], /* CJK Ideograph */
- [0x4f65, 0x4f65], /* CJK Ideograph */
- [0x4f66, 0x4f66], /* CJK Ideograph */
- [0x4f67, 0x4f67], /* CJK Ideograph */
- [0x4f68, 0x4f68], /* CJK Ideograph */
- [0x4f69, 0x4f69], /* CJK Ideograph */
- [0x4f6a, 0x4f6a], /* CJK Ideograph */
- [0x4f6b, 0x4f6b], /* CJK Ideograph */
- [0x4f6c, 0x4f6c], /* CJK Ideograph */
- [0x4f6d, 0x4f6d], /* CJK Ideograph */
- [0x4f6e, 0x4f6e], /* CJK Ideograph */
- [0x4f6f, 0x4f6f], /* CJK Ideograph */
- [0x4f70, 0x4f70], /* CJK Ideograph */
- [0x4f71, 0x4f71], /* CJK Ideograph */
- [0x4f72, 0x4f72], /* CJK Ideograph */
- [0x4f73, 0x4f73], /* CJK Ideograph */
- [0x4f74, 0x4f74], /* CJK Ideograph */
- [0x4f75, 0x4f75], /* CJK Ideograph */
- [0x4f76, 0x4f76], /* CJK Ideograph */
- [0x4f77, 0x4f77], /* CJK Ideograph */
- [0x4f78, 0x4f78], /* CJK Ideograph */
- [0x4f79, 0x4f79], /* CJK Ideograph */
- [0x4f7a, 0x4f7a], /* CJK Ideograph */
- [0x4f7b, 0x4f7b], /* CJK Ideograph */
- [0x4f7c, 0x4f7c], /* CJK Ideograph */
- [0x4f7d, 0x4f7d], /* CJK Ideograph */
- [0x4f7e, 0x4f7e], /* CJK Ideograph */
- [0x4f7f, 0x4f7f], /* CJK Ideograph */
- [0x4f80, 0x4f80], /* CJK Ideograph */
- [0x4f81, 0x4f81], /* CJK Ideograph */
- [0x4f82, 0x4f82], /* CJK Ideograph */
- [0x4f83, 0x4f83], /* CJK Ideograph */
- [0x4f84, 0x4f84], /* CJK Ideograph */
- [0x4f85, 0x4f85], /* CJK Ideograph */
- [0x4f86, 0x4f86], /* CJK Ideograph */
- [0x4f87, 0x4f87], /* CJK Ideograph */
- [0x4f88, 0x4f88], /* CJK Ideograph */
- [0x4f89, 0x4f89], /* CJK Ideograph */
- [0x4f8a, 0x4f8a], /* CJK Ideograph */
- [0x4f8b, 0x4f8b], /* CJK Ideograph */
- [0x4f8c, 0x4f8c], /* CJK Ideograph */
- [0x4f8d, 0x4f8d], /* CJK Ideograph */
- [0x4f8e, 0x4f8e], /* CJK Ideograph */
- [0x4f8f, 0x4f8f], /* CJK Ideograph */
- [0x4f90, 0x4f90], /* CJK Ideograph */
- [0x4f91, 0x4f91], /* CJK Ideograph */
- [0x4f92, 0x4f92], /* CJK Ideograph */
- [0x4f93, 0x4f93], /* CJK Ideograph */
- [0x4f94, 0x4f94], /* CJK Ideograph */
- [0x4f95, 0x4f95], /* CJK Ideograph */
- [0x4f96, 0x4f96], /* CJK Ideograph */
- [0x4f97, 0x4f97], /* CJK Ideograph */
- [0x4f98, 0x4f98], /* CJK Ideograph */
- [0x4f99, 0x4f99], /* CJK Ideograph */
- [0x4f9a, 0x4f9a], /* CJK Ideograph */
- [0x4f9b, 0x4f9b], /* CJK Ideograph */
- [0x4f9c, 0x4f9c], /* CJK Ideograph */
- [0x4f9d, 0x4f9d], /* CJK Ideograph */
- [0x4f9e, 0x4f9e], /* CJK Ideograph */
- [0x4f9f, 0x4f9f], /* CJK Ideograph */
- [0x4fa0, 0x4fa0], /* CJK Ideograph */
- [0x4fa1, 0x4fa1], /* CJK Ideograph */
- [0x4fa2, 0x4fa2], /* CJK Ideograph */
- [0x4fa3, 0x4fa3], /* CJK Ideograph */
- [0x4fa4, 0x4fa4], /* CJK Ideograph */
- [0x4fa5, 0x4fa5], /* CJK Ideograph */
- [0x4fa6, 0x4fa6], /* CJK Ideograph */
- [0x4fa7, 0x4fa7], /* CJK Ideograph */
- [0x4fa8, 0x4fa8], /* CJK Ideograph */
- [0x4fa9, 0x4fa9], /* CJK Ideograph */
- [0x4faa, 0x4faa], /* CJK Ideograph */
- [0x4fab, 0x4fab], /* CJK Ideograph */
- [0x4fac, 0x4fac], /* CJK Ideograph */
- [0x4fad, 0x4fad], /* CJK Ideograph */
- [0x4fae, 0x4fae], /* CJK Ideograph */
- [0x4faf, 0x4faf], /* CJK Ideograph */
- [0x4fb0, 0x4fb0], /* CJK Ideograph */
- [0x4fb1, 0x4fb1], /* CJK Ideograph */
- [0x4fb2, 0x4fb2], /* CJK Ideograph */
- [0x4fb3, 0x4fb3], /* CJK Ideograph */
- [0x4fb4, 0x4fb4], /* CJK Ideograph */
- [0x4fb5, 0x4fb5], /* CJK Ideograph */
- [0x4fb6, 0x4fb6], /* CJK Ideograph */
- [0x4fb7, 0x4fb7], /* CJK Ideograph */
- [0x4fb8, 0x4fb8], /* CJK Ideograph */
- [0x4fb9, 0x4fb9], /* CJK Ideograph */
- [0x4fba, 0x4fba], /* CJK Ideograph */
- [0x4fbb, 0x4fbb], /* CJK Ideograph */
- [0x4fbc, 0x4fbc], /* CJK Ideograph */
- [0x4fbd, 0x4fbd], /* CJK Ideograph */
- [0x4fbe, 0x4fbe], /* CJK Ideograph */
- [0x4fbf, 0x4fbf], /* CJK Ideograph */
- [0x4fc0, 0x4fc0], /* CJK Ideograph */
- [0x4fc1, 0x4fc1], /* CJK Ideograph */
- [0x4fc2, 0x4fc2], /* CJK Ideograph */
- [0x4fc3, 0x4fc3], /* CJK Ideograph */
- [0x4fc4, 0x4fc4], /* CJK Ideograph */
- [0x4fc5, 0x4fc5], /* CJK Ideograph */
- [0x4fc6, 0x4fc6], /* CJK Ideograph */
- [0x4fc7, 0x4fc7], /* CJK Ideograph */
- [0x4fc8, 0x4fc8], /* CJK Ideograph */
- [0x4fc9, 0x4fc9], /* CJK Ideograph */
- [0x4fca, 0x4fca], /* CJK Ideograph */
- [0x4fcb, 0x4fcb], /* CJK Ideograph */
- [0x4fcc, 0x4fcc], /* CJK Ideograph */
- [0x4fcd, 0x4fcd], /* CJK Ideograph */
- [0x4fce, 0x4fce], /* CJK Ideograph */
- [0x4fcf, 0x4fcf], /* CJK Ideograph */
- [0x4fd0, 0x4fd0], /* CJK Ideograph */
- [0x4fd1, 0x4fd1], /* CJK Ideograph */
- [0x4fd2, 0x4fd2], /* CJK Ideograph */
- [0x4fd3, 0x4fd3], /* CJK Ideograph */
- [0x4fd4, 0x4fd4], /* CJK Ideograph */
- [0x4fd5, 0x4fd5], /* CJK Ideograph */
- [0x4fd6, 0x4fd6], /* CJK Ideograph */
- [0x4fd7, 0x4fd7], /* CJK Ideograph */
- [0x4fd8, 0x4fd8], /* CJK Ideograph */
- [0x4fd9, 0x4fd9], /* CJK Ideograph */
- [0x4fda, 0x4fda], /* CJK Ideograph */
- [0x4fdb, 0x4fdb], /* CJK Ideograph */
- [0x4fdc, 0x4fdc], /* CJK Ideograph */
- [0x4fdd, 0x4fdd], /* CJK Ideograph */
- [0x4fde, 0x4fde], /* CJK Ideograph */
- [0x4fdf, 0x4fdf], /* CJK Ideograph */
- [0x4fe0, 0x4fe0], /* CJK Ideograph */
- [0x4fe1, 0x4fe1], /* CJK Ideograph */
- [0x4fe2, 0x4fe2], /* CJK Ideograph */
- [0x4fe3, 0x4fe3], /* CJK Ideograph */
- [0x4fe4, 0x4fe4], /* CJK Ideograph */
- [0x4fe5, 0x4fe5], /* CJK Ideograph */
- [0x4fe6, 0x4fe6], /* CJK Ideograph */
- [0x4fe7, 0x4fe7], /* CJK Ideograph */
- [0x4fe8, 0x4fe8], /* CJK Ideograph */
- [0x4fe9, 0x4fe9], /* CJK Ideograph */
- [0x4fea, 0x4fea], /* CJK Ideograph */
- [0x4feb, 0x4feb], /* CJK Ideograph */
- [0x4fec, 0x4fec], /* CJK Ideograph */
- [0x4fed, 0x4fed], /* CJK Ideograph */
- [0x4fee, 0x4fee], /* CJK Ideograph */
- [0x4fef, 0x4fef], /* CJK Ideograph */
- [0x4ff0, 0x4ff0], /* CJK Ideograph */
- [0x4ff1, 0x4ff1], /* CJK Ideograph */
- [0x4ff2, 0x4ff2], /* CJK Ideograph */
- [0x4ff3, 0x4ff3], /* CJK Ideograph */
- [0x4ff4, 0x4ff4], /* CJK Ideograph */
- [0x4ff5, 0x4ff5], /* CJK Ideograph */
- [0x4ff6, 0x4ff6], /* CJK Ideograph */
- [0x4ff7, 0x4ff7], /* CJK Ideograph */
- [0x4ff8, 0x4ff8], /* CJK Ideograph */
- [0x4ff9, 0x4ff9], /* CJK Ideograph */
- [0x4ffa, 0x4ffa], /* CJK Ideograph */
- [0x4ffb, 0x4ffb], /* CJK Ideograph */
- [0x4ffc, 0x4ffc], /* CJK Ideograph */
- [0x4ffd, 0x4ffd], /* CJK Ideograph */
- [0x4ffe, 0x4ffe], /* CJK Ideograph */
- [0x4fff, 0x4fff], /* CJK Ideograph */
- [0x5000, 0x5000], /* CJK Ideograph */
- [0x5001, 0x5001], /* CJK Ideograph */
- [0x5002, 0x5002], /* CJK Ideograph */
- [0x5003, 0x5003], /* CJK Ideograph */
- [0x5004, 0x5004], /* CJK Ideograph */
- [0x5005, 0x5005], /* CJK Ideograph */
- [0x5006, 0x5006], /* CJK Ideograph */
- [0x5007, 0x5007], /* CJK Ideograph */
- [0x5008, 0x5008], /* CJK Ideograph */
- [0x5009, 0x5009], /* CJK Ideograph */
- [0x500a, 0x500a], /* CJK Ideograph */
- [0x500b, 0x500b], /* CJK Ideograph */
- [0x500c, 0x500c], /* CJK Ideograph */
- [0x500d, 0x500d], /* CJK Ideograph */
- [0x500e, 0x500e], /* CJK Ideograph */
- [0x500f, 0x500f], /* CJK Ideograph */
- [0x5010, 0x5010], /* CJK Ideograph */
- [0x5011, 0x5011], /* CJK Ideograph */
- [0x5012, 0x5012], /* CJK Ideograph */
- [0x5013, 0x5013], /* CJK Ideograph */
- [0x5014, 0x5014], /* CJK Ideograph */
- [0x5015, 0x5015], /* CJK Ideograph */
- [0x5016, 0x5016], /* CJK Ideograph */
- [0x5017, 0x5017], /* CJK Ideograph */
- [0x5018, 0x5018], /* CJK Ideograph */
- [0x5019, 0x5019], /* CJK Ideograph */
- [0x501a, 0x501a], /* CJK Ideograph */
- [0x501b, 0x501b], /* CJK Ideograph */
- [0x501c, 0x501c], /* CJK Ideograph */
- [0x501d, 0x501d], /* CJK Ideograph */
- [0x501e, 0x501e], /* CJK Ideograph */
- [0x501f, 0x501f], /* CJK Ideograph */
- [0x5020, 0x5020], /* CJK Ideograph */
- [0x5021, 0x5021], /* CJK Ideograph */
- [0x5022, 0x5022], /* CJK Ideograph */
- [0x5023, 0x5023], /* CJK Ideograph */
- [0x5024, 0x5024], /* CJK Ideograph */
- [0x5025, 0x5025], /* CJK Ideograph */
- [0x5026, 0x5026], /* CJK Ideograph */
- [0x5027, 0x5027], /* CJK Ideograph */
- [0x5028, 0x5028], /* CJK Ideograph */
- [0x5029, 0x5029], /* CJK Ideograph */
- [0x502a, 0x502a], /* CJK Ideograph */
- [0x502b, 0x502b], /* CJK Ideograph */
- [0x502c, 0x502c], /* CJK Ideograph */
- [0x502d, 0x502d], /* CJK Ideograph */
- [0x502e, 0x502e], /* CJK Ideograph */
- [0x502f, 0x502f], /* CJK Ideograph */
- [0x5030, 0x5030], /* CJK Ideograph */
- [0x5031, 0x5031], /* CJK Ideograph */
- [0x5032, 0x5032], /* CJK Ideograph */
- [0x5033, 0x5033], /* CJK Ideograph */
- [0x5034, 0x5034], /* CJK Ideograph */
- [0x5035, 0x5035], /* CJK Ideograph */
- [0x5036, 0x5036], /* CJK Ideograph */
- [0x5037, 0x5037], /* CJK Ideograph */
- [0x5038, 0x5038], /* CJK Ideograph */
- [0x5039, 0x5039], /* CJK Ideograph */
- [0x503a, 0x503a], /* CJK Ideograph */
- [0x503b, 0x503b], /* CJK Ideograph */
- [0x503c, 0x503c], /* CJK Ideograph */
- [0x503d, 0x503d], /* CJK Ideograph */
- [0x503e, 0x503e], /* CJK Ideograph */
- [0x503f, 0x503f], /* CJK Ideograph */
- [0x5040, 0x5040], /* CJK Ideograph */
- [0x5041, 0x5041], /* CJK Ideograph */
- [0x5042, 0x5042], /* CJK Ideograph */
- [0x5043, 0x5043], /* CJK Ideograph */
- [0x5044, 0x5044], /* CJK Ideograph */
- [0x5045, 0x5045], /* CJK Ideograph */
- [0x5046, 0x5046], /* CJK Ideograph */
- [0x5047, 0x5047], /* CJK Ideograph */
- [0x5048, 0x5048], /* CJK Ideograph */
- [0x5049, 0x5049], /* CJK Ideograph */
- [0x504a, 0x504a], /* CJK Ideograph */
- [0x504b, 0x504b], /* CJK Ideograph */
- [0x504c, 0x504c], /* CJK Ideograph */
- [0x504d, 0x504d], /* CJK Ideograph */
- [0x504e, 0x504e], /* CJK Ideograph */
- [0x504f, 0x504f], /* CJK Ideograph */
- [0x5050, 0x5050], /* CJK Ideograph */
- [0x5051, 0x5051], /* CJK Ideograph */
- [0x5052, 0x5052], /* CJK Ideograph */
- [0x5053, 0x5053], /* CJK Ideograph */
- [0x5054, 0x5054], /* CJK Ideograph */
- [0x5055, 0x5055], /* CJK Ideograph */
- [0x5056, 0x5056], /* CJK Ideograph */
- [0x5057, 0x5057], /* CJK Ideograph */
- [0x5058, 0x5058], /* CJK Ideograph */
- [0x5059, 0x5059], /* CJK Ideograph */
- [0x505a, 0x505a], /* CJK Ideograph */
- [0x505b, 0x505b], /* CJK Ideograph */
- [0x505c, 0x505c], /* CJK Ideograph */
- [0x505d, 0x505d], /* CJK Ideograph */
- [0x505e, 0x505e], /* CJK Ideograph */
- [0x505f, 0x505f], /* CJK Ideograph */
- [0x5060, 0x5060], /* CJK Ideograph */
- [0x5061, 0x5061], /* CJK Ideograph */
- [0x5062, 0x5062], /* CJK Ideograph */
- [0x5063, 0x5063], /* CJK Ideograph */
- [0x5064, 0x5064], /* CJK Ideograph */
- [0x5065, 0x5065], /* CJK Ideograph */
- [0x5066, 0x5066], /* CJK Ideograph */
- [0x5067, 0x5067], /* CJK Ideograph */
- [0x5068, 0x5068], /* CJK Ideograph */
- [0x5069, 0x5069], /* CJK Ideograph */
- [0x506a, 0x506a], /* CJK Ideograph */
- [0x506b, 0x506b], /* CJK Ideograph */
- [0x506c, 0x506c], /* CJK Ideograph */
- [0x506d, 0x506d], /* CJK Ideograph */
- [0x506e, 0x506e], /* CJK Ideograph */
- [0x506f, 0x506f], /* CJK Ideograph */
- [0x5070, 0x5070], /* CJK Ideograph */
- [0x5071, 0x5071], /* CJK Ideograph */
- [0x5072, 0x5072], /* CJK Ideograph */
- [0x5073, 0x5073], /* CJK Ideograph */
- [0x5074, 0x5074], /* CJK Ideograph */
- [0x5075, 0x5075], /* CJK Ideograph */
- [0x5076, 0x5076], /* CJK Ideograph */
- [0x5077, 0x5077], /* CJK Ideograph */
- [0x5078, 0x5078], /* CJK Ideograph */
- [0x5079, 0x5079], /* CJK Ideograph */
- [0x507a, 0x507a], /* CJK Ideograph */
- [0x507b, 0x507b], /* CJK Ideograph */
- [0x507c, 0x507c], /* CJK Ideograph */
- [0x507d, 0x507d], /* CJK Ideograph */
- [0x507e, 0x507e], /* CJK Ideograph */
- [0x507f, 0x507f], /* CJK Ideograph */
- [0x5080, 0x5080], /* CJK Ideograph */
- [0x5081, 0x5081], /* CJK Ideograph */
- [0x5082, 0x5082], /* CJK Ideograph */
- [0x5083, 0x5083], /* CJK Ideograph */
- [0x5084, 0x5084], /* CJK Ideograph */
- [0x5085, 0x5085], /* CJK Ideograph */
- [0x5086, 0x5086], /* CJK Ideograph */
- [0x5087, 0x5087], /* CJK Ideograph */
- [0x5088, 0x5088], /* CJK Ideograph */
- [0x5089, 0x5089], /* CJK Ideograph */
- [0x508a, 0x508a], /* CJK Ideograph */
- [0x508b, 0x508b], /* CJK Ideograph */
- [0x508c, 0x508c], /* CJK Ideograph */
- [0x508d, 0x508d], /* CJK Ideograph */
- [0x508e, 0x508e], /* CJK Ideograph */
- [0x508f, 0x508f], /* CJK Ideograph */
- [0x5090, 0x5090], /* CJK Ideograph */
- [0x5091, 0x5091], /* CJK Ideograph */
- [0x5092, 0x5092], /* CJK Ideograph */
- [0x5093, 0x5093], /* CJK Ideograph */
- [0x5094, 0x5094], /* CJK Ideograph */
- [0x5095, 0x5095], /* CJK Ideograph */
- [0x5096, 0x5096], /* CJK Ideograph */
- [0x5097, 0x5097], /* CJK Ideograph */
- [0x5098, 0x5098], /* CJK Ideograph */
- [0x5099, 0x5099], /* CJK Ideograph */
- [0x509a, 0x509a], /* CJK Ideograph */
- [0x509b, 0x509b], /* CJK Ideograph */
- [0x509c, 0x509c], /* CJK Ideograph */
- [0x509d, 0x509d], /* CJK Ideograph */
- [0x509e, 0x509e], /* CJK Ideograph */
- [0x509f, 0x509f], /* CJK Ideograph */
- [0x50a0, 0x50a0], /* CJK Ideograph */
- [0x50a1, 0x50a1], /* CJK Ideograph */
- [0x50a2, 0x50a2], /* CJK Ideograph */
- [0x50a3, 0x50a3], /* CJK Ideograph */
- [0x50a4, 0x50a4], /* CJK Ideograph */
- [0x50a5, 0x50a5], /* CJK Ideograph */
- [0x50a6, 0x50a6], /* CJK Ideograph */
- [0x50a7, 0x50a7], /* CJK Ideograph */
- [0x50a8, 0x50a8], /* CJK Ideograph */
- [0x50a9, 0x50a9], /* CJK Ideograph */
- [0x50aa, 0x50aa], /* CJK Ideograph */
- [0x50ab, 0x50ab], /* CJK Ideograph */
- [0x50ac, 0x50ac], /* CJK Ideograph */
- [0x50ad, 0x50ad], /* CJK Ideograph */
- [0x50ae, 0x50ae], /* CJK Ideograph */
- [0x50af, 0x50af], /* CJK Ideograph */
- [0x50b0, 0x50b0], /* CJK Ideograph */
- [0x50b1, 0x50b1], /* CJK Ideograph */
- [0x50b2, 0x50b2], /* CJK Ideograph */
- [0x50b3, 0x50b3], /* CJK Ideograph */
- [0x50b4, 0x50b4], /* CJK Ideograph */
- [0x50b5, 0x50b5], /* CJK Ideograph */
- [0x50b6, 0x50b6], /* CJK Ideograph */
- [0x50b7, 0x50b7], /* CJK Ideograph */
- [0x50b8, 0x50b8], /* CJK Ideograph */
- [0x50b9, 0x50b9], /* CJK Ideograph */
- [0x50ba, 0x50ba], /* CJK Ideograph */
- [0x50bb, 0x50bb], /* CJK Ideograph */
- [0x50bc, 0x50bc], /* CJK Ideograph */
- [0x50bd, 0x50bd], /* CJK Ideograph */
- [0x50be, 0x50be], /* CJK Ideograph */
- [0x50bf, 0x50bf], /* CJK Ideograph */
- [0x50c0, 0x50c0], /* CJK Ideograph */
- [0x50c1, 0x50c1], /* CJK Ideograph */
- [0x50c2, 0x50c2], /* CJK Ideograph */
- [0x50c3, 0x50c3], /* CJK Ideograph */
- [0x50c4, 0x50c4], /* CJK Ideograph */
- [0x50c5, 0x50c5], /* CJK Ideograph */
- [0x50c6, 0x50c6], /* CJK Ideograph */
- [0x50c7, 0x50c7], /* CJK Ideograph */
- [0x50c8, 0x50c8], /* CJK Ideograph */
- [0x50c9, 0x50c9], /* CJK Ideograph */
- [0x50ca, 0x50ca], /* CJK Ideograph */
- [0x50cb, 0x50cb], /* CJK Ideograph */
- [0x50cc, 0x50cc], /* CJK Ideograph */
- [0x50cd, 0x50cd], /* CJK Ideograph */
- [0x50ce, 0x50ce], /* CJK Ideograph */
- [0x50cf, 0x50cf], /* CJK Ideograph */
- [0x50d0, 0x50d0], /* CJK Ideograph */
- [0x50d1, 0x50d1], /* CJK Ideograph */
- [0x50d2, 0x50d2], /* CJK Ideograph */
- [0x50d3, 0x50d3], /* CJK Ideograph */
- [0x50d4, 0x50d4], /* CJK Ideograph */
- [0x50d5, 0x50d5], /* CJK Ideograph */
- [0x50d6, 0x50d6], /* CJK Ideograph */
- [0x50d7, 0x50d7], /* CJK Ideograph */
- [0x50d8, 0x50d8], /* CJK Ideograph */
- [0x50d9, 0x50d9], /* CJK Ideograph */
- [0x50da, 0x50da], /* CJK Ideograph */
- [0x50db, 0x50db], /* CJK Ideograph */
- [0x50dc, 0x50dc], /* CJK Ideograph */
- [0x50dd, 0x50dd], /* CJK Ideograph */
- [0x50de, 0x50de], /* CJK Ideograph */
- [0x50df, 0x50df], /* CJK Ideograph */
- [0x50e0, 0x50e0], /* CJK Ideograph */
- [0x50e1, 0x50e1], /* CJK Ideograph */
- [0x50e2, 0x50e2], /* CJK Ideograph */
- [0x50e3, 0x50e3], /* CJK Ideograph */
- [0x50e4, 0x50e4], /* CJK Ideograph */
- [0x50e5, 0x50e5], /* CJK Ideograph */
- [0x50e6, 0x50e6], /* CJK Ideograph */
- [0x50e7, 0x50e7], /* CJK Ideograph */
- [0x50e8, 0x50e8], /* CJK Ideograph */
- [0x50e9, 0x50e9], /* CJK Ideograph */
- [0x50ea, 0x50ea], /* CJK Ideograph */
- [0x50eb, 0x50eb], /* CJK Ideograph */
- [0x50ec, 0x50ec], /* CJK Ideograph */
- [0x50ed, 0x50ed], /* CJK Ideograph */
- [0x50ee, 0x50ee], /* CJK Ideograph */
- [0x50ef, 0x50ef], /* CJK Ideograph */
- [0x50f0, 0x50f0], /* CJK Ideograph */
- [0x50f1, 0x50f1], /* CJK Ideograph */
- [0x50f2, 0x50f2], /* CJK Ideograph */
- [0x50f3, 0x50f3], /* CJK Ideograph */
- [0x50f4, 0x50f4], /* CJK Ideograph */
- [0x50f5, 0x50f5], /* CJK Ideograph */
- [0x50f6, 0x50f6], /* CJK Ideograph */
- [0x50f7, 0x50f7], /* CJK Ideograph */
- [0x50f8, 0x50f8], /* CJK Ideograph */
- [0x50f9, 0x50f9], /* CJK Ideograph */
- [0x50fa, 0x50fa], /* CJK Ideograph */
- [0x50fb, 0x50fb], /* CJK Ideograph */
- [0x50fc, 0x50fc], /* CJK Ideograph */
- [0x50fd, 0x50fd], /* CJK Ideograph */
- [0x50fe, 0x50fe], /* CJK Ideograph */
- [0x50ff, 0x50ff], /* CJK Ideograph */
- [0x5100, 0x5100], /* CJK Ideograph */
- [0x5101, 0x5101], /* CJK Ideograph */
- [0x5102, 0x5102], /* CJK Ideograph */
- [0x5103, 0x5103], /* CJK Ideograph */
- [0x5104, 0x5104], /* CJK Ideograph */
- [0x5105, 0x5105], /* CJK Ideograph */
- [0x5106, 0x5106], /* CJK Ideograph */
- [0x5107, 0x5107], /* CJK Ideograph */
- [0x5108, 0x5108], /* CJK Ideograph */
- [0x5109, 0x5109], /* CJK Ideograph */
- [0x510a, 0x510a], /* CJK Ideograph */
- [0x510b, 0x510b], /* CJK Ideograph */
- [0x510c, 0x510c], /* CJK Ideograph */
- [0x510d, 0x510d], /* CJK Ideograph */
- [0x510e, 0x510e], /* CJK Ideograph */
- [0x510f, 0x510f], /* CJK Ideograph */
- [0x5110, 0x5110], /* CJK Ideograph */
- [0x5111, 0x5111], /* CJK Ideograph */
- [0x5112, 0x5112], /* CJK Ideograph */
- [0x5113, 0x5113], /* CJK Ideograph */
- [0x5114, 0x5114], /* CJK Ideograph */
- [0x5115, 0x5115], /* CJK Ideograph */
- [0x5116, 0x5116], /* CJK Ideograph */
- [0x5117, 0x5117], /* CJK Ideograph */
- [0x5118, 0x5118], /* CJK Ideograph */
- [0x5119, 0x5119], /* CJK Ideograph */
- [0x511a, 0x511a], /* CJK Ideograph */
- [0x511b, 0x511b], /* CJK Ideograph */
- [0x511c, 0x511c], /* CJK Ideograph */
- [0x511d, 0x511d], /* CJK Ideograph */
- [0x511e, 0x511e], /* CJK Ideograph */
- [0x511f, 0x511f], /* CJK Ideograph */
- [0x5120, 0x5120], /* CJK Ideograph */
- [0x5121, 0x5121], /* CJK Ideograph */
- [0x5122, 0x5122], /* CJK Ideograph */
- [0x5123, 0x5123], /* CJK Ideograph */
- [0x5124, 0x5124], /* CJK Ideograph */
- [0x5125, 0x5125], /* CJK Ideograph */
- [0x5126, 0x5126], /* CJK Ideograph */
- [0x5127, 0x5127], /* CJK Ideograph */
- [0x5128, 0x5128], /* CJK Ideograph */
- [0x5129, 0x5129], /* CJK Ideograph */
- [0x512a, 0x512a], /* CJK Ideograph */
- [0x512b, 0x512b], /* CJK Ideograph */
- [0x512c, 0x512c], /* CJK Ideograph */
- [0x512d, 0x512d], /* CJK Ideograph */
- [0x512e, 0x512e], /* CJK Ideograph */
- [0x512f, 0x512f], /* CJK Ideograph */
- [0x5130, 0x5130], /* CJK Ideograph */
- [0x5131, 0x5131], /* CJK Ideograph */
- [0x5132, 0x5132], /* CJK Ideograph */
- [0x5133, 0x5133], /* CJK Ideograph */
- [0x5134, 0x5134], /* CJK Ideograph */
- [0x5135, 0x5135], /* CJK Ideograph */
- [0x5136, 0x5136], /* CJK Ideograph */
- [0x5137, 0x5137], /* CJK Ideograph */
- [0x5138, 0x5138], /* CJK Ideograph */
- [0x5139, 0x5139], /* CJK Ideograph */
- [0x513a, 0x513a], /* CJK Ideograph */
- [0x513b, 0x513b], /* CJK Ideograph */
- [0x513c, 0x513c], /* CJK Ideograph */
- [0x513d, 0x513d], /* CJK Ideograph */
- [0x513e, 0x513e], /* CJK Ideograph */
- [0x513f, 0x513f], /* CJK Ideograph */
- [0x5140, 0x5140], /* CJK Ideograph */
- [0x5141, 0x5141], /* CJK Ideograph */
- [0x5142, 0x5142], /* CJK Ideograph */
- [0x5143, 0x5143], /* CJK Ideograph */
- [0x5144, 0x5144], /* CJK Ideograph */
- [0x5145, 0x5145], /* CJK Ideograph */
- [0x5146, 0x5146], /* CJK Ideograph */
- [0x5147, 0x5147], /* CJK Ideograph */
- [0x5148, 0x5148], /* CJK Ideograph */
- [0x5149, 0x5149], /* CJK Ideograph */
- [0x514a, 0x514a], /* CJK Ideograph */
- [0x514b, 0x514b], /* CJK Ideograph */
- [0x514c, 0x514c], /* CJK Ideograph */
- [0x514d, 0x514d], /* CJK Ideograph */
- [0x514e, 0x514e], /* CJK Ideograph */
- [0x514f, 0x514f], /* CJK Ideograph */
- [0x5150, 0x5150], /* CJK Ideograph */
- [0x5151, 0x5151], /* CJK Ideograph */
- [0x5152, 0x5152], /* CJK Ideograph */
- [0x5153, 0x5153], /* CJK Ideograph */
- [0x5154, 0x5154], /* CJK Ideograph */
- [0x5155, 0x5155], /* CJK Ideograph */
- [0x5156, 0x5156], /* CJK Ideograph */
- [0x5157, 0x5157], /* CJK Ideograph */
- [0x5158, 0x5158], /* CJK Ideograph */
- [0x5159, 0x5159], /* CJK Ideograph */
- [0x515a, 0x515a], /* CJK Ideograph */
- [0x515b, 0x515b], /* CJK Ideograph */
- [0x515c, 0x515c], /* CJK Ideograph */
- [0x515d, 0x515d], /* CJK Ideograph */
- [0x515e, 0x515e], /* CJK Ideograph */
- [0x515f, 0x515f], /* CJK Ideograph */
- [0x5160, 0x5160], /* CJK Ideograph */
- [0x5161, 0x5161], /* CJK Ideograph */
- [0x5162, 0x5162], /* CJK Ideograph */
- [0x5163, 0x5163], /* CJK Ideograph */
- [0x5164, 0x5164], /* CJK Ideograph */
- [0x5165, 0x5165], /* CJK Ideograph */
- [0x5166, 0x5166], /* CJK Ideograph */
- [0x5167, 0x5167], /* CJK Ideograph */
- [0x5168, 0x5168], /* CJK Ideograph */
- [0x5169, 0x5169], /* CJK Ideograph */
- [0x516a, 0x516a], /* CJK Ideograph */
- [0x516b, 0x516b], /* CJK Ideograph */
- [0x516c, 0x516c], /* CJK Ideograph */
- [0x516d, 0x516d], /* CJK Ideograph */
- [0x516e, 0x516e], /* CJK Ideograph */
- [0x516f, 0x516f], /* CJK Ideograph */
- [0x5170, 0x5170], /* CJK Ideograph */
- [0x5171, 0x5171], /* CJK Ideograph */
- [0x5172, 0x5172], /* CJK Ideograph */
- [0x5173, 0x5173], /* CJK Ideograph */
- [0x5174, 0x5174], /* CJK Ideograph */
- [0x5175, 0x5175], /* CJK Ideograph */
- [0x5176, 0x5176], /* CJK Ideograph */
- [0x5177, 0x5177], /* CJK Ideograph */
- [0x5178, 0x5178], /* CJK Ideograph */
- [0x5179, 0x5179], /* CJK Ideograph */
- [0x517a, 0x517a], /* CJK Ideograph */
- [0x517b, 0x517b], /* CJK Ideograph */
- [0x517c, 0x517c], /* CJK Ideograph */
- [0x517d, 0x517d], /* CJK Ideograph */
- [0x517e, 0x517e], /* CJK Ideograph */
- [0x517f, 0x517f], /* CJK Ideograph */
- [0x5180, 0x5180], /* CJK Ideograph */
- [0x5181, 0x5181], /* CJK Ideograph */
- [0x5182, 0x5182], /* CJK Ideograph */
- [0x5183, 0x5183], /* CJK Ideograph */
- [0x5184, 0x5184], /* CJK Ideograph */
- [0x5185, 0x5185], /* CJK Ideograph */
- [0x5186, 0x5186], /* CJK Ideograph */
- [0x5187, 0x5187], /* CJK Ideograph */
- [0x5188, 0x5188], /* CJK Ideograph */
- [0x5189, 0x5189], /* CJK Ideograph */
- [0x518a, 0x518a], /* CJK Ideograph */
- [0x518b, 0x518b], /* CJK Ideograph */
- [0x518c, 0x518c], /* CJK Ideograph */
- [0x518d, 0x518d], /* CJK Ideograph */
- [0x518e, 0x518e], /* CJK Ideograph */
- [0x518f, 0x518f], /* CJK Ideograph */
- [0x5190, 0x5190], /* CJK Ideograph */
- [0x5191, 0x5191], /* CJK Ideograph */
- [0x5192, 0x5192], /* CJK Ideograph */
- [0x5193, 0x5193], /* CJK Ideograph */
- [0x5194, 0x5194], /* CJK Ideograph */
- [0x5195, 0x5195], /* CJK Ideograph */
- [0x5196, 0x5196], /* CJK Ideograph */
- [0x5197, 0x5197], /* CJK Ideograph */
- [0x5198, 0x5198], /* CJK Ideograph */
- [0x5199, 0x5199], /* CJK Ideograph */
- [0x519a, 0x519a], /* CJK Ideograph */
- [0x519b, 0x519b], /* CJK Ideograph */
- [0x519c, 0x519c], /* CJK Ideograph */
- [0x519d, 0x519d], /* CJK Ideograph */
- [0x519e, 0x519e], /* CJK Ideograph */
- [0x519f, 0x519f], /* CJK Ideograph */
- [0x51a0, 0x51a0], /* CJK Ideograph */
- [0x51a1, 0x51a1], /* CJK Ideograph */
- [0x51a2, 0x51a2], /* CJK Ideograph */
- [0x51a3, 0x51a3], /* CJK Ideograph */
- [0x51a4, 0x51a4], /* CJK Ideograph */
- [0x51a5, 0x51a5], /* CJK Ideograph */
- [0x51a6, 0x51a6], /* CJK Ideograph */
- [0x51a7, 0x51a7], /* CJK Ideograph */
- [0x51a8, 0x51a8], /* CJK Ideograph */
- [0x51a9, 0x51a9], /* CJK Ideograph */
- [0x51aa, 0x51aa], /* CJK Ideograph */
- [0x51ab, 0x51ab], /* CJK Ideograph */
- [0x51ac, 0x51ac], /* CJK Ideograph */
- [0x51ad, 0x51ad], /* CJK Ideograph */
- [0x51ae, 0x51ae], /* CJK Ideograph */
- [0x51af, 0x51af], /* CJK Ideograph */
- [0x51b0, 0x51b0], /* CJK Ideograph */
- [0x51b1, 0x51b1], /* CJK Ideograph */
- [0x51b2, 0x51b2], /* CJK Ideograph */
- [0x51b3, 0x51b3], /* CJK Ideograph */
- [0x51b4, 0x51b4], /* CJK Ideograph */
- [0x51b5, 0x51b5], /* CJK Ideograph */
- [0x51b6, 0x51b6], /* CJK Ideograph */
- [0x51b7, 0x51b7], /* CJK Ideograph */
- [0x51b8, 0x51b8], /* CJK Ideograph */
- [0x51b9, 0x51b9], /* CJK Ideograph */
- [0x51ba, 0x51ba], /* CJK Ideograph */
- [0x51bb, 0x51bb], /* CJK Ideograph */
- [0x51bc, 0x51bc], /* CJK Ideograph */
- [0x51bd, 0x51bd], /* CJK Ideograph */
- [0x51be, 0x51be], /* CJK Ideograph */
- [0x51bf, 0x51bf], /* CJK Ideograph */
- [0x51c0, 0x51c0], /* CJK Ideograph */
- [0x51c1, 0x51c1], /* CJK Ideograph */
- [0x51c2, 0x51c2], /* CJK Ideograph */
- [0x51c3, 0x51c3], /* CJK Ideograph */
- [0x51c4, 0x51c4], /* CJK Ideograph */
- [0x51c5, 0x51c5], /* CJK Ideograph */
- [0x51c6, 0x51c6], /* CJK Ideograph */
- [0x51c7, 0x51c7], /* CJK Ideograph */
- [0x51c8, 0x51c8], /* CJK Ideograph */
- [0x51c9, 0x51c9], /* CJK Ideograph */
- [0x51ca, 0x51ca], /* CJK Ideograph */
- [0x51cb, 0x51cb], /* CJK Ideograph */
- [0x51cc, 0x51cc], /* CJK Ideograph */
- [0x51cd, 0x51cd], /* CJK Ideograph */
- [0x51ce, 0x51ce], /* CJK Ideograph */
- [0x51cf, 0x51cf], /* CJK Ideograph */
- [0x51d0, 0x51d0], /* CJK Ideograph */
- [0x51d1, 0x51d1], /* CJK Ideograph */
- [0x51d2, 0x51d2], /* CJK Ideograph */
- [0x51d3, 0x51d3], /* CJK Ideograph */
- [0x51d4, 0x51d4], /* CJK Ideograph */
- [0x51d5, 0x51d5], /* CJK Ideograph */
- [0x51d6, 0x51d6], /* CJK Ideograph */
- [0x51d7, 0x51d7], /* CJK Ideograph */
- [0x51d8, 0x51d8], /* CJK Ideograph */
- [0x51d9, 0x51d9], /* CJK Ideograph */
- [0x51da, 0x51da], /* CJK Ideograph */
- [0x51db, 0x51db], /* CJK Ideograph */
- [0x51dc, 0x51dc], /* CJK Ideograph */
- [0x51dd, 0x51dd], /* CJK Ideograph */
- [0x51de, 0x51de], /* CJK Ideograph */
- [0x51df, 0x51df], /* CJK Ideograph */
- [0x51e0, 0x51e0], /* CJK Ideograph */
- [0x51e1, 0x51e1], /* CJK Ideograph */
- [0x51e2, 0x51e2], /* CJK Ideograph */
- [0x51e3, 0x51e3], /* CJK Ideograph */
- [0x51e4, 0x51e4], /* CJK Ideograph */
- [0x51e5, 0x51e5], /* CJK Ideograph */
- [0x51e6, 0x51e6], /* CJK Ideograph */
- [0x51e7, 0x51e7], /* CJK Ideograph */
- [0x51e8, 0x51e8], /* CJK Ideograph */
- [0x51e9, 0x51e9], /* CJK Ideograph */
- [0x51ea, 0x51ea], /* CJK Ideograph */
- [0x51eb, 0x51eb], /* CJK Ideograph */
- [0x51ec, 0x51ec], /* CJK Ideograph */
- [0x51ed, 0x51ed], /* CJK Ideograph */
- [0x51ee, 0x51ee], /* CJK Ideograph */
- [0x51ef, 0x51ef], /* CJK Ideograph */
- [0x51f0, 0x51f0], /* CJK Ideograph */
- [0x51f1, 0x51f1], /* CJK Ideograph */
- [0x51f2, 0x51f2], /* CJK Ideograph */
- [0x51f3, 0x51f3], /* CJK Ideograph */
- [0x51f4, 0x51f4], /* CJK Ideograph */
- [0x51f5, 0x51f5], /* CJK Ideograph */
- [0x51f6, 0x51f6], /* CJK Ideograph */
- [0x51f7, 0x51f7], /* CJK Ideograph */
- [0x51f8, 0x51f8], /* CJK Ideograph */
- [0x51f9, 0x51f9], /* CJK Ideograph */
- [0x51fa, 0x51fa], /* CJK Ideograph */
- [0x51fb, 0x51fb], /* CJK Ideograph */
- [0x51fc, 0x51fc], /* CJK Ideograph */
- [0x51fd, 0x51fd], /* CJK Ideograph */
- [0x51fe, 0x51fe], /* CJK Ideograph */
- [0x51ff, 0x51ff], /* CJK Ideograph */
- [0x5200, 0x5200], /* CJK Ideograph */
- [0x5201, 0x5201], /* CJK Ideograph */
- [0x5202, 0x5202], /* CJK Ideograph */
- [0x5203, 0x5203], /* CJK Ideograph */
- [0x5204, 0x5204], /* CJK Ideograph */
- [0x5205, 0x5205], /* CJK Ideograph */
- [0x5206, 0x5206], /* CJK Ideograph */
- [0x5207, 0x5207], /* CJK Ideograph */
- [0x5208, 0x5208], /* CJK Ideograph */
- [0x5209, 0x5209], /* CJK Ideograph */
- [0x520a, 0x520a], /* CJK Ideograph */
- [0x520b, 0x520b], /* CJK Ideograph */
- [0x520c, 0x520c], /* CJK Ideograph */
- [0x520d, 0x520d], /* CJK Ideograph */
- [0x520e, 0x520e], /* CJK Ideograph */
- [0x520f, 0x520f], /* CJK Ideograph */
- [0x5210, 0x5210], /* CJK Ideograph */
- [0x5211, 0x5211], /* CJK Ideograph */
- [0x5212, 0x5212], /* CJK Ideograph */
- [0x5213, 0x5213], /* CJK Ideograph */
- [0x5214, 0x5214], /* CJK Ideograph */
- [0x5215, 0x5215], /* CJK Ideograph */
- [0x5216, 0x5216], /* CJK Ideograph */
- [0x5217, 0x5217], /* CJK Ideograph */
- [0x5218, 0x5218], /* CJK Ideograph */
- [0x5219, 0x5219], /* CJK Ideograph */
- [0x521a, 0x521a], /* CJK Ideograph */
- [0x521b, 0x521b], /* CJK Ideograph */
- [0x521c, 0x521c], /* CJK Ideograph */
- [0x521d, 0x521d], /* CJK Ideograph */
- [0x521e, 0x521e], /* CJK Ideograph */
- [0x521f, 0x521f], /* CJK Ideograph */
- [0x5220, 0x5220], /* CJK Ideograph */
- [0x5221, 0x5221], /* CJK Ideograph */
- [0x5222, 0x5222], /* CJK Ideograph */
- [0x5223, 0x5223], /* CJK Ideograph */
- [0x5224, 0x5224], /* CJK Ideograph */
- [0x5225, 0x5225], /* CJK Ideograph */
- [0x5226, 0x5226], /* CJK Ideograph */
- [0x5227, 0x5227], /* CJK Ideograph */
- [0x5228, 0x5228], /* CJK Ideograph */
- [0x5229, 0x5229], /* CJK Ideograph */
- [0x522a, 0x522a], /* CJK Ideograph */
- [0x522b, 0x522b], /* CJK Ideograph */
- [0x522c, 0x522c], /* CJK Ideograph */
- [0x522d, 0x522d], /* CJK Ideograph */
- [0x522e, 0x522e], /* CJK Ideograph */
- [0x522f, 0x522f], /* CJK Ideograph */
- [0x5230, 0x5230], /* CJK Ideograph */
- [0x5231, 0x5231], /* CJK Ideograph */
- [0x5232, 0x5232], /* CJK Ideograph */
- [0x5233, 0x5233], /* CJK Ideograph */
- [0x5234, 0x5234], /* CJK Ideograph */
- [0x5235, 0x5235], /* CJK Ideograph */
- [0x5236, 0x5236], /* CJK Ideograph */
- [0x5237, 0x5237], /* CJK Ideograph */
- [0x5238, 0x5238], /* CJK Ideograph */
- [0x5239, 0x5239], /* CJK Ideograph */
- [0x523a, 0x523a], /* CJK Ideograph */
- [0x523b, 0x523b], /* CJK Ideograph */
- [0x523c, 0x523c], /* CJK Ideograph */
- [0x523d, 0x523d], /* CJK Ideograph */
- [0x523e, 0x523e], /* CJK Ideograph */
- [0x523f, 0x523f], /* CJK Ideograph */
- [0x5240, 0x5240], /* CJK Ideograph */
- [0x5241, 0x5241], /* CJK Ideograph */
- [0x5242, 0x5242], /* CJK Ideograph */
- [0x5243, 0x5243], /* CJK Ideograph */
- [0x5244, 0x5244], /* CJK Ideograph */
- [0x5245, 0x5245], /* CJK Ideograph */
- [0x5246, 0x5246], /* CJK Ideograph */
- [0x5247, 0x5247], /* CJK Ideograph */
- [0x5248, 0x5248], /* CJK Ideograph */
- [0x5249, 0x5249], /* CJK Ideograph */
- [0x524a, 0x524a], /* CJK Ideograph */
- [0x524b, 0x524b], /* CJK Ideograph */
- [0x524c, 0x524c], /* CJK Ideograph */
- [0x524d, 0x524d], /* CJK Ideograph */
- [0x524e, 0x524e], /* CJK Ideograph */
- [0x524f, 0x524f], /* CJK Ideograph */
- [0x5250, 0x5250], /* CJK Ideograph */
- [0x5251, 0x5251], /* CJK Ideograph */
- [0x5252, 0x5252], /* CJK Ideograph */
- [0x5253, 0x5253], /* CJK Ideograph */
- [0x5254, 0x5254], /* CJK Ideograph */
- [0x5255, 0x5255], /* CJK Ideograph */
- [0x5256, 0x5256], /* CJK Ideograph */
- [0x5257, 0x5257], /* CJK Ideograph */
- [0x5258, 0x5258], /* CJK Ideograph */
- [0x5259, 0x5259], /* CJK Ideograph */
- [0x525a, 0x525a], /* CJK Ideograph */
- [0x525b, 0x525b], /* CJK Ideograph */
- [0x525c, 0x525c], /* CJK Ideograph */
- [0x525d, 0x525d], /* CJK Ideograph */
- [0x525e, 0x525e], /* CJK Ideograph */
- [0x525f, 0x525f], /* CJK Ideograph */
- [0x5260, 0x5260], /* CJK Ideograph */
- [0x5261, 0x5261], /* CJK Ideograph */
- [0x5262, 0x5262], /* CJK Ideograph */
- [0x5263, 0x5263], /* CJK Ideograph */
- [0x5264, 0x5264], /* CJK Ideograph */
- [0x5265, 0x5265], /* CJK Ideograph */
- [0x5266, 0x5266], /* CJK Ideograph */
- [0x5267, 0x5267], /* CJK Ideograph */
- [0x5268, 0x5268], /* CJK Ideograph */
- [0x5269, 0x5269], /* CJK Ideograph */
- [0x526a, 0x526a], /* CJK Ideograph */
- [0x526b, 0x526b], /* CJK Ideograph */
- [0x526c, 0x526c], /* CJK Ideograph */
- [0x526d, 0x526d], /* CJK Ideograph */
- [0x526e, 0x526e], /* CJK Ideograph */
- [0x526f, 0x526f], /* CJK Ideograph */
- [0x5270, 0x5270], /* CJK Ideograph */
- [0x5271, 0x5271], /* CJK Ideograph */
- [0x5272, 0x5272], /* CJK Ideograph */
- [0x5273, 0x5273], /* CJK Ideograph */
- [0x5274, 0x5274], /* CJK Ideograph */
- [0x5275, 0x5275], /* CJK Ideograph */
- [0x5276, 0x5276], /* CJK Ideograph */
- [0x5277, 0x5277], /* CJK Ideograph */
- [0x5278, 0x5278], /* CJK Ideograph */
- [0x5279, 0x5279], /* CJK Ideograph */
- [0x527a, 0x527a], /* CJK Ideograph */
- [0x527b, 0x527b], /* CJK Ideograph */
- [0x527c, 0x527c], /* CJK Ideograph */
- [0x527d, 0x527d], /* CJK Ideograph */
- [0x527e, 0x527e], /* CJK Ideograph */
- [0x527f, 0x527f], /* CJK Ideograph */
- [0x5280, 0x5280], /* CJK Ideograph */
- [0x5281, 0x5281], /* CJK Ideograph */
- [0x5282, 0x5282], /* CJK Ideograph */
- [0x5283, 0x5283], /* CJK Ideograph */
- [0x5284, 0x5284], /* CJK Ideograph */
- [0x5285, 0x5285], /* CJK Ideograph */
- [0x5286, 0x5286], /* CJK Ideograph */
- [0x5287, 0x5287], /* CJK Ideograph */
- [0x5288, 0x5288], /* CJK Ideograph */
- [0x5289, 0x5289], /* CJK Ideograph */
- [0x528a, 0x528a], /* CJK Ideograph */
- [0x528b, 0x528b], /* CJK Ideograph */
- [0x528c, 0x528c], /* CJK Ideograph */
- [0x528d, 0x528d], /* CJK Ideograph */
- [0x528e, 0x528e], /* CJK Ideograph */
- [0x528f, 0x528f], /* CJK Ideograph */
- [0x5290, 0x5290], /* CJK Ideograph */
- [0x5291, 0x5291], /* CJK Ideograph */
- [0x5292, 0x5292], /* CJK Ideograph */
- [0x5293, 0x5293], /* CJK Ideograph */
- [0x5294, 0x5294], /* CJK Ideograph */
- [0x5295, 0x5295], /* CJK Ideograph */
- [0x5296, 0x5296], /* CJK Ideograph */
- [0x5297, 0x5297], /* CJK Ideograph */
- [0x5298, 0x5298], /* CJK Ideograph */
- [0x5299, 0x5299], /* CJK Ideograph */
- [0x529a, 0x529a], /* CJK Ideograph */
- [0x529b, 0x529b], /* CJK Ideograph */
- [0x529c, 0x529c], /* CJK Ideograph */
- [0x529d, 0x529d], /* CJK Ideograph */
- [0x529e, 0x529e], /* CJK Ideograph */
- [0x529f, 0x529f], /* CJK Ideograph */
- [0x52a0, 0x52a0], /* CJK Ideograph */
- [0x52a1, 0x52a1], /* CJK Ideograph */
- [0x52a2, 0x52a2], /* CJK Ideograph */
- [0x52a3, 0x52a3], /* CJK Ideograph */
- [0x52a4, 0x52a4], /* CJK Ideograph */
- [0x52a5, 0x52a5], /* CJK Ideograph */
- [0x52a6, 0x52a6], /* CJK Ideograph */
- [0x52a7, 0x52a7], /* CJK Ideograph */
- [0x52a8, 0x52a8], /* CJK Ideograph */
- [0x52a9, 0x52a9], /* CJK Ideograph */
- [0x52aa, 0x52aa], /* CJK Ideograph */
- [0x52ab, 0x52ab], /* CJK Ideograph */
- [0x52ac, 0x52ac], /* CJK Ideograph */
- [0x52ad, 0x52ad], /* CJK Ideograph */
- [0x52ae, 0x52ae], /* CJK Ideograph */
- [0x52af, 0x52af], /* CJK Ideograph */
- [0x52b0, 0x52b0], /* CJK Ideograph */
- [0x52b1, 0x52b1], /* CJK Ideograph */
- [0x52b2, 0x52b2], /* CJK Ideograph */
- [0x52b3, 0x52b3], /* CJK Ideograph */
- [0x52b4, 0x52b4], /* CJK Ideograph */
- [0x52b5, 0x52b5], /* CJK Ideograph */
- [0x52b6, 0x52b6], /* CJK Ideograph */
- [0x52b7, 0x52b7], /* CJK Ideograph */
- [0x52b8, 0x52b8], /* CJK Ideograph */
- [0x52b9, 0x52b9], /* CJK Ideograph */
- [0x52ba, 0x52ba], /* CJK Ideograph */
- [0x52bb, 0x52bb], /* CJK Ideograph */
- [0x52bc, 0x52bc], /* CJK Ideograph */
- [0x52bd, 0x52bd], /* CJK Ideograph */
- [0x52be, 0x52be], /* CJK Ideograph */
- [0x52bf, 0x52bf], /* CJK Ideograph */
- [0x52c0, 0x52c0], /* CJK Ideograph */
- [0x52c1, 0x52c1], /* CJK Ideograph */
- [0x52c2, 0x52c2], /* CJK Ideograph */
- [0x52c3, 0x52c3], /* CJK Ideograph */
- [0x52c4, 0x52c4], /* CJK Ideograph */
- [0x52c5, 0x52c5], /* CJK Ideograph */
- [0x52c6, 0x52c6], /* CJK Ideograph */
- [0x52c7, 0x52c7], /* CJK Ideograph */
- [0x52c8, 0x52c8], /* CJK Ideograph */
- [0x52c9, 0x52c9], /* CJK Ideograph */
- [0x52ca, 0x52ca], /* CJK Ideograph */
- [0x52cb, 0x52cb], /* CJK Ideograph */
- [0x52cc, 0x52cc], /* CJK Ideograph */
- [0x52cd, 0x52cd], /* CJK Ideograph */
- [0x52ce, 0x52ce], /* CJK Ideograph */
- [0x52cf, 0x52cf], /* CJK Ideograph */
- [0x52d0, 0x52d0], /* CJK Ideograph */
- [0x52d1, 0x52d1], /* CJK Ideograph */
- [0x52d2, 0x52d2], /* CJK Ideograph */
- [0x52d3, 0x52d3], /* CJK Ideograph */
- [0x52d4, 0x52d4], /* CJK Ideograph */
- [0x52d5, 0x52d5], /* CJK Ideograph */
- [0x52d6, 0x52d6], /* CJK Ideograph */
- [0x52d7, 0x52d7], /* CJK Ideograph */
- [0x52d8, 0x52d8], /* CJK Ideograph */
- [0x52d9, 0x52d9], /* CJK Ideograph */
- [0x52da, 0x52da], /* CJK Ideograph */
- [0x52db, 0x52db], /* CJK Ideograph */
- [0x52dc, 0x52dc], /* CJK Ideograph */
- [0x52dd, 0x52dd], /* CJK Ideograph */
- [0x52de, 0x52de], /* CJK Ideograph */
- [0x52df, 0x52df], /* CJK Ideograph */
- [0x52e0, 0x52e0], /* CJK Ideograph */
- [0x52e1, 0x52e1], /* CJK Ideograph */
- [0x52e2, 0x52e2], /* CJK Ideograph */
- [0x52e3, 0x52e3], /* CJK Ideograph */
- [0x52e4, 0x52e4], /* CJK Ideograph */
- [0x52e5, 0x52e5], /* CJK Ideograph */
- [0x52e6, 0x52e6], /* CJK Ideograph */
- [0x52e7, 0x52e7], /* CJK Ideograph */
- [0x52e8, 0x52e8], /* CJK Ideograph */
- [0x52e9, 0x52e9], /* CJK Ideograph */
- [0x52ea, 0x52ea], /* CJK Ideograph */
- [0x52eb, 0x52eb], /* CJK Ideograph */
- [0x52ec, 0x52ec], /* CJK Ideograph */
- [0x52ed, 0x52ed], /* CJK Ideograph */
- [0x52ee, 0x52ee], /* CJK Ideograph */
- [0x52ef, 0x52ef], /* CJK Ideograph */
- [0x52f0, 0x52f0], /* CJK Ideograph */
- [0x52f1, 0x52f1], /* CJK Ideograph */
- [0x52f2, 0x52f2], /* CJK Ideograph */
- [0x52f3, 0x52f3], /* CJK Ideograph */
- [0x52f4, 0x52f4], /* CJK Ideograph */
- [0x52f5, 0x52f5], /* CJK Ideograph */
- [0x52f6, 0x52f6], /* CJK Ideograph */
- [0x52f7, 0x52f7], /* CJK Ideograph */
- [0x52f8, 0x52f8], /* CJK Ideograph */
- [0x52f9, 0x52f9], /* CJK Ideograph */
- [0x52fa, 0x52fa], /* CJK Ideograph */
- [0x52fb, 0x52fb], /* CJK Ideograph */
- [0x52fc, 0x52fc], /* CJK Ideograph */
- [0x52fd, 0x52fd], /* CJK Ideograph */
- [0x52fe, 0x52fe], /* CJK Ideograph */
- [0x52ff, 0x52ff], /* CJK Ideograph */
- [0x5300, 0x5300], /* CJK Ideograph */
- [0x5301, 0x5301], /* CJK Ideograph */
- [0x5302, 0x5302], /* CJK Ideograph */
- [0x5303, 0x5303], /* CJK Ideograph */
- [0x5304, 0x5304], /* CJK Ideograph */
- [0x5305, 0x5305], /* CJK Ideograph */
- [0x5306, 0x5306], /* CJK Ideograph */
- [0x5307, 0x5307], /* CJK Ideograph */
- [0x5308, 0x5308], /* CJK Ideograph */
- [0x5309, 0x5309], /* CJK Ideograph */
- [0x530a, 0x530a], /* CJK Ideograph */
- [0x530b, 0x530b], /* CJK Ideograph */
- [0x530c, 0x530c], /* CJK Ideograph */
- [0x530d, 0x530d], /* CJK Ideograph */
- [0x530e, 0x530e], /* CJK Ideograph */
- [0x530f, 0x530f], /* CJK Ideograph */
- [0x5310, 0x5310], /* CJK Ideograph */
- [0x5311, 0x5311], /* CJK Ideograph */
- [0x5312, 0x5312], /* CJK Ideograph */
- [0x5313, 0x5313], /* CJK Ideograph */
- [0x5314, 0x5314], /* CJK Ideograph */
- [0x5315, 0x5315], /* CJK Ideograph */
- [0x5316, 0x5316], /* CJK Ideograph */
- [0x5317, 0x5317], /* CJK Ideograph */
- [0x5318, 0x5318], /* CJK Ideograph */
- [0x5319, 0x5319], /* CJK Ideograph */
- [0x531a, 0x531a], /* CJK Ideograph */
- [0x531b, 0x531b], /* CJK Ideograph */
- [0x531c, 0x531c], /* CJK Ideograph */
- [0x531d, 0x531d], /* CJK Ideograph */
- [0x531e, 0x531e], /* CJK Ideograph */
- [0x531f, 0x531f], /* CJK Ideograph */
- [0x5320, 0x5320], /* CJK Ideograph */
- [0x5321, 0x5321], /* CJK Ideograph */
- [0x5322, 0x5322], /* CJK Ideograph */
- [0x5323, 0x5323], /* CJK Ideograph */
- [0x5324, 0x5324], /* CJK Ideograph */
- [0x5325, 0x5325], /* CJK Ideograph */
- [0x5326, 0x5326], /* CJK Ideograph */
- [0x5327, 0x5327], /* CJK Ideograph */
- [0x5328, 0x5328], /* CJK Ideograph */
- [0x5329, 0x5329], /* CJK Ideograph */
- [0x532a, 0x532a], /* CJK Ideograph */
- [0x532b, 0x532b], /* CJK Ideograph */
- [0x532c, 0x532c], /* CJK Ideograph */
- [0x532d, 0x532d], /* CJK Ideograph */
- [0x532e, 0x532e], /* CJK Ideograph */
- [0x532f, 0x532f], /* CJK Ideograph */
- [0x5330, 0x5330], /* CJK Ideograph */
- [0x5331, 0x5331], /* CJK Ideograph */
- [0x5332, 0x5332], /* CJK Ideograph */
- [0x5333, 0x5333], /* CJK Ideograph */
- [0x5334, 0x5334], /* CJK Ideograph */
- [0x5335, 0x5335], /* CJK Ideograph */
- [0x5336, 0x5336], /* CJK Ideograph */
- [0x5337, 0x5337], /* CJK Ideograph */
- [0x5338, 0x5338], /* CJK Ideograph */
- [0x5339, 0x5339], /* CJK Ideograph */
- [0x533a, 0x533a], /* CJK Ideograph */
- [0x533b, 0x533b], /* CJK Ideograph */
- [0x533c, 0x533c], /* CJK Ideograph */
- [0x533d, 0x533d], /* CJK Ideograph */
- [0x533e, 0x533e], /* CJK Ideograph */
- [0x533f, 0x533f], /* CJK Ideograph */
- [0x5340, 0x5340], /* CJK Ideograph */
- [0x5341, 0x5341], /* CJK Ideograph */
- [0x5342, 0x5342], /* CJK Ideograph */
- [0x5343, 0x5343], /* CJK Ideograph */
- [0x5344, 0x5344], /* CJK Ideograph */
- [0x5345, 0x5345], /* CJK Ideograph */
- [0x5346, 0x5346], /* CJK Ideograph */
- [0x5347, 0x5347], /* CJK Ideograph */
- [0x5348, 0x5348], /* CJK Ideograph */
- [0x5349, 0x5349], /* CJK Ideograph */
- [0x534a, 0x534a], /* CJK Ideograph */
- [0x534b, 0x534b], /* CJK Ideograph */
- [0x534c, 0x534c], /* CJK Ideograph */
- [0x534d, 0x534d], /* CJK Ideograph */
- [0x534e, 0x534e], /* CJK Ideograph */
- [0x534f, 0x534f], /* CJK Ideograph */
- [0x5350, 0x5350], /* CJK Ideograph */
- [0x5351, 0x5351], /* CJK Ideograph */
- [0x5352, 0x5352], /* CJK Ideograph */
- [0x5353, 0x5353], /* CJK Ideograph */
- [0x5354, 0x5354], /* CJK Ideograph */
- [0x5355, 0x5355], /* CJK Ideograph */
- [0x5356, 0x5356], /* CJK Ideograph */
- [0x5357, 0x5357], /* CJK Ideograph */
- [0x5358, 0x5358], /* CJK Ideograph */
- [0x5359, 0x5359], /* CJK Ideograph */
- [0x535a, 0x535a], /* CJK Ideograph */
- [0x535b, 0x535b], /* CJK Ideograph */
- [0x535c, 0x535c], /* CJK Ideograph */
- [0x535d, 0x535d], /* CJK Ideograph */
- [0x535e, 0x535e], /* CJK Ideograph */
- [0x535f, 0x535f], /* CJK Ideograph */
- [0x5360, 0x5360], /* CJK Ideograph */
- [0x5361, 0x5361], /* CJK Ideograph */
- [0x5362, 0x5362], /* CJK Ideograph */
- [0x5363, 0x5363], /* CJK Ideograph */
- [0x5364, 0x5364], /* CJK Ideograph */
- [0x5365, 0x5365], /* CJK Ideograph */
- [0x5366, 0x5366], /* CJK Ideograph */
- [0x5367, 0x5367], /* CJK Ideograph */
- [0x5368, 0x5368], /* CJK Ideograph */
- [0x5369, 0x5369], /* CJK Ideograph */
- [0x536a, 0x536a], /* CJK Ideograph */
- [0x536b, 0x536b], /* CJK Ideograph */
- [0x536c, 0x536c], /* CJK Ideograph */
- [0x536d, 0x536d], /* CJK Ideograph */
- [0x536e, 0x536e], /* CJK Ideograph */
- [0x536f, 0x536f], /* CJK Ideograph */
- [0x5370, 0x5370], /* CJK Ideograph */
- [0x5371, 0x5371], /* CJK Ideograph */
- [0x5372, 0x5372], /* CJK Ideograph */
- [0x5373, 0x5373], /* CJK Ideograph */
- [0x5374, 0x5374], /* CJK Ideograph */
- [0x5375, 0x5375], /* CJK Ideograph */
- [0x5376, 0x5376], /* CJK Ideograph */
- [0x5377, 0x5377], /* CJK Ideograph */
- [0x5378, 0x5378], /* CJK Ideograph */
- [0x5379, 0x5379], /* CJK Ideograph */
- [0x537a, 0x537a], /* CJK Ideograph */
- [0x537b, 0x537b], /* CJK Ideograph */
- [0x537c, 0x537c], /* CJK Ideograph */
- [0x537d, 0x537d], /* CJK Ideograph */
- [0x537e, 0x537e], /* CJK Ideograph */
- [0x537f, 0x537f], /* CJK Ideograph */
- [0x5380, 0x5380], /* CJK Ideograph */
- [0x5381, 0x5381], /* CJK Ideograph */
- [0x5382, 0x5382], /* CJK Ideograph */
- [0x5383, 0x5383], /* CJK Ideograph */
- [0x5384, 0x5384], /* CJK Ideograph */
- [0x5385, 0x5385], /* CJK Ideograph */
- [0x5386, 0x5386], /* CJK Ideograph */
- [0x5387, 0x5387], /* CJK Ideograph */
- [0x5388, 0x5388], /* CJK Ideograph */
- [0x5389, 0x5389], /* CJK Ideograph */
- [0x538a, 0x538a], /* CJK Ideograph */
- [0x538b, 0x538b], /* CJK Ideograph */
- [0x538c, 0x538c], /* CJK Ideograph */
- [0x538d, 0x538d], /* CJK Ideograph */
- [0x538e, 0x538e], /* CJK Ideograph */
- [0x538f, 0x538f], /* CJK Ideograph */
- [0x5390, 0x5390], /* CJK Ideograph */
- [0x5391, 0x5391], /* CJK Ideograph */
- [0x5392, 0x5392], /* CJK Ideograph */
- [0x5393, 0x5393], /* CJK Ideograph */
- [0x5394, 0x5394], /* CJK Ideograph */
- [0x5395, 0x5395], /* CJK Ideograph */
- [0x5396, 0x5396], /* CJK Ideograph */
- [0x5397, 0x5397], /* CJK Ideograph */
- [0x5398, 0x5398], /* CJK Ideograph */
- [0x5399, 0x5399], /* CJK Ideograph */
- [0x539a, 0x539a], /* CJK Ideograph */
- [0x539b, 0x539b], /* CJK Ideograph */
- [0x539c, 0x539c], /* CJK Ideograph */
- [0x539d, 0x539d], /* CJK Ideograph */
- [0x539e, 0x539e], /* CJK Ideograph */
- [0x539f, 0x539f], /* CJK Ideograph */
- [0x53a0, 0x53a0], /* CJK Ideograph */
- [0x53a1, 0x53a1], /* CJK Ideograph */
- [0x53a2, 0x53a2], /* CJK Ideograph */
- [0x53a3, 0x53a3], /* CJK Ideograph */
- [0x53a4, 0x53a4], /* CJK Ideograph */
- [0x53a5, 0x53a5], /* CJK Ideograph */
- [0x53a6, 0x53a6], /* CJK Ideograph */
- [0x53a7, 0x53a7], /* CJK Ideograph */
- [0x53a8, 0x53a8], /* CJK Ideograph */
- [0x53a9, 0x53a9], /* CJK Ideograph */
- [0x53aa, 0x53aa], /* CJK Ideograph */
- [0x53ab, 0x53ab], /* CJK Ideograph */
- [0x53ac, 0x53ac], /* CJK Ideograph */
- [0x53ad, 0x53ad], /* CJK Ideograph */
- [0x53ae, 0x53ae], /* CJK Ideograph */
- [0x53af, 0x53af], /* CJK Ideograph */
- [0x53b0, 0x53b0], /* CJK Ideograph */
- [0x53b1, 0x53b1], /* CJK Ideograph */
- [0x53b2, 0x53b2], /* CJK Ideograph */
- [0x53b3, 0x53b3], /* CJK Ideograph */
- [0x53b4, 0x53b4], /* CJK Ideograph */
- [0x53b5, 0x53b5], /* CJK Ideograph */
- [0x53b6, 0x53b6], /* CJK Ideograph */
- [0x53b7, 0x53b7], /* CJK Ideograph */
- [0x53b8, 0x53b8], /* CJK Ideograph */
- [0x53b9, 0x53b9], /* CJK Ideograph */
- [0x53ba, 0x53ba], /* CJK Ideograph */
- [0x53bb, 0x53bb], /* CJK Ideograph */
- [0x53bc, 0x53bc], /* CJK Ideograph */
- [0x53bd, 0x53bd], /* CJK Ideograph */
- [0x53be, 0x53be], /* CJK Ideograph */
- [0x53bf, 0x53bf], /* CJK Ideograph */
- [0x53c0, 0x53c0], /* CJK Ideograph */
- [0x53c1, 0x53c1], /* CJK Ideograph */
- [0x53c2, 0x53c2], /* CJK Ideograph */
- [0x53c3, 0x53c3], /* CJK Ideograph */
- [0x53c4, 0x53c4], /* CJK Ideograph */
- [0x53c5, 0x53c5], /* CJK Ideograph */
- [0x53c6, 0x53c6], /* CJK Ideograph */
- [0x53c7, 0x53c7], /* CJK Ideograph */
- [0x53c8, 0x53c8], /* CJK Ideograph */
- [0x53c9, 0x53c9], /* CJK Ideograph */
- [0x53ca, 0x53ca], /* CJK Ideograph */
- [0x53cb, 0x53cb], /* CJK Ideograph */
- [0x53cc, 0x53cc], /* CJK Ideograph */
- [0x53cd, 0x53cd], /* CJK Ideograph */
- [0x53ce, 0x53ce], /* CJK Ideograph */
- [0x53cf, 0x53cf], /* CJK Ideograph */
- [0x53d0, 0x53d0], /* CJK Ideograph */
- [0x53d1, 0x53d1], /* CJK Ideograph */
- [0x53d2, 0x53d2], /* CJK Ideograph */
- [0x53d3, 0x53d3], /* CJK Ideograph */
- [0x53d4, 0x53d4], /* CJK Ideograph */
- [0x53d5, 0x53d5], /* CJK Ideograph */
- [0x53d6, 0x53d6], /* CJK Ideograph */
- [0x53d7, 0x53d7], /* CJK Ideograph */
- [0x53d8, 0x53d8], /* CJK Ideograph */
- [0x53d9, 0x53d9], /* CJK Ideograph */
- [0x53da, 0x53da], /* CJK Ideograph */
- [0x53db, 0x53db], /* CJK Ideograph */
- [0x53dc, 0x53dc], /* CJK Ideograph */
- [0x53dd, 0x53dd], /* CJK Ideograph */
- [0x53de, 0x53de], /* CJK Ideograph */
- [0x53df, 0x53df], /* CJK Ideograph */
- [0x53e0, 0x53e0], /* CJK Ideograph */
- [0x53e1, 0x53e1], /* CJK Ideograph */
- [0x53e2, 0x53e2], /* CJK Ideograph */
- [0x53e3, 0x53e3], /* CJK Ideograph */
- [0x53e4, 0x53e4], /* CJK Ideograph */
- [0x53e5, 0x53e5], /* CJK Ideograph */
- [0x53e6, 0x53e6], /* CJK Ideograph */
- [0x53e7, 0x53e7], /* CJK Ideograph */
- [0x53e8, 0x53e8], /* CJK Ideograph */
- [0x53e9, 0x53e9], /* CJK Ideograph */
- [0x53ea, 0x53ea], /* CJK Ideograph */
- [0x53eb, 0x53eb], /* CJK Ideograph */
- [0x53ec, 0x53ec], /* CJK Ideograph */
- [0x53ed, 0x53ed], /* CJK Ideograph */
- [0x53ee, 0x53ee], /* CJK Ideograph */
- [0x53ef, 0x53ef], /* CJK Ideograph */
- [0x53f0, 0x53f0], /* CJK Ideograph */
- [0x53f1, 0x53f1], /* CJK Ideograph */
- [0x53f2, 0x53f2], /* CJK Ideograph */
- [0x53f3, 0x53f3], /* CJK Ideograph */
- [0x53f4, 0x53f4], /* CJK Ideograph */
- [0x53f5, 0x53f5], /* CJK Ideograph */
- [0x53f6, 0x53f6], /* CJK Ideograph */
- [0x53f7, 0x53f7], /* CJK Ideograph */
- [0x53f8, 0x53f8], /* CJK Ideograph */
- [0x53f9, 0x53f9], /* CJK Ideograph */
- [0x53fa, 0x53fa], /* CJK Ideograph */
- [0x53fb, 0x53fb], /* CJK Ideograph */
- [0x53fc, 0x53fc], /* CJK Ideograph */
- [0x53fd, 0x53fd], /* CJK Ideograph */
- [0x53fe, 0x53fe], /* CJK Ideograph */
- [0x53ff, 0x53ff], /* CJK Ideograph */
- [0x5400, 0x5400], /* CJK Ideograph */
- [0x5401, 0x5401], /* CJK Ideograph */
- [0x5402, 0x5402], /* CJK Ideograph */
- [0x5403, 0x5403], /* CJK Ideograph */
- [0x5404, 0x5404], /* CJK Ideograph */
- [0x5405, 0x5405], /* CJK Ideograph */
- [0x5406, 0x5406], /* CJK Ideograph */
- [0x5407, 0x5407], /* CJK Ideograph */
- [0x5408, 0x5408], /* CJK Ideograph */
- [0x5409, 0x5409], /* CJK Ideograph */
- [0x540a, 0x540a], /* CJK Ideograph */
- [0x540b, 0x540b], /* CJK Ideograph */
- [0x540c, 0x540c], /* CJK Ideograph */
- [0x540d, 0x540d], /* CJK Ideograph */
- [0x540e, 0x540e], /* CJK Ideograph */
- [0x540f, 0x540f], /* CJK Ideograph */
- [0x5410, 0x5410], /* CJK Ideograph */
- [0x5411, 0x5411], /* CJK Ideograph */
- [0x5412, 0x5412], /* CJK Ideograph */
- [0x5413, 0x5413], /* CJK Ideograph */
- [0x5414, 0x5414], /* CJK Ideograph */
- [0x5415, 0x5415], /* CJK Ideograph */
- [0x5416, 0x5416], /* CJK Ideograph */
- [0x5417, 0x5417], /* CJK Ideograph */
- [0x5418, 0x5418], /* CJK Ideograph */
- [0x5419, 0x5419], /* CJK Ideograph */
- [0x541a, 0x541a], /* CJK Ideograph */
- [0x541b, 0x541b], /* CJK Ideograph */
- [0x541c, 0x541c], /* CJK Ideograph */
- [0x541d, 0x541d], /* CJK Ideograph */
- [0x541e, 0x541e], /* CJK Ideograph */
- [0x541f, 0x541f], /* CJK Ideograph */
- [0x5420, 0x5420], /* CJK Ideograph */
- [0x5421, 0x5421], /* CJK Ideograph */
- [0x5422, 0x5422], /* CJK Ideograph */
- [0x5423, 0x5423], /* CJK Ideograph */
- [0x5424, 0x5424], /* CJK Ideograph */
- [0x5425, 0x5425], /* CJK Ideograph */
- [0x5426, 0x5426], /* CJK Ideograph */
- [0x5427, 0x5427], /* CJK Ideograph */
- [0x5428, 0x5428], /* CJK Ideograph */
- [0x5429, 0x5429], /* CJK Ideograph */
- [0x542a, 0x542a], /* CJK Ideograph */
- [0x542b, 0x542b], /* CJK Ideograph */
- [0x542c, 0x542c], /* CJK Ideograph */
- [0x542d, 0x542d], /* CJK Ideograph */
- [0x542e, 0x542e], /* CJK Ideograph */
- [0x542f, 0x542f], /* CJK Ideograph */
- [0x5430, 0x5430], /* CJK Ideograph */
- [0x5431, 0x5431], /* CJK Ideograph */
- [0x5432, 0x5432], /* CJK Ideograph */
- [0x5433, 0x5433], /* CJK Ideograph */
- [0x5434, 0x5434], /* CJK Ideograph */
- [0x5435, 0x5435], /* CJK Ideograph */
- [0x5436, 0x5436], /* CJK Ideograph */
- [0x5437, 0x5437], /* CJK Ideograph */
- [0x5438, 0x5438], /* CJK Ideograph */
- [0x5439, 0x5439], /* CJK Ideograph */
- [0x543a, 0x543a], /* CJK Ideograph */
- [0x543b, 0x543b], /* CJK Ideograph */
- [0x543c, 0x543c], /* CJK Ideograph */
- [0x543d, 0x543d], /* CJK Ideograph */
- [0x543e, 0x543e], /* CJK Ideograph */
- [0x543f, 0x543f], /* CJK Ideograph */
- [0x5440, 0x5440], /* CJK Ideograph */
- [0x5441, 0x5441], /* CJK Ideograph */
- [0x5442, 0x5442], /* CJK Ideograph */
- [0x5443, 0x5443], /* CJK Ideograph */
- [0x5444, 0x5444], /* CJK Ideograph */
- [0x5445, 0x5445], /* CJK Ideograph */
- [0x5446, 0x5446], /* CJK Ideograph */
- [0x5447, 0x5447], /* CJK Ideograph */
- [0x5448, 0x5448], /* CJK Ideograph */
- [0x5449, 0x5449], /* CJK Ideograph */
- [0x544a, 0x544a], /* CJK Ideograph */
- [0x544b, 0x544b], /* CJK Ideograph */
- [0x544c, 0x544c], /* CJK Ideograph */
- [0x544d, 0x544d], /* CJK Ideograph */
- [0x544e, 0x544e], /* CJK Ideograph */
- [0x544f, 0x544f], /* CJK Ideograph */
- [0x5450, 0x5450], /* CJK Ideograph */
- [0x5451, 0x5451], /* CJK Ideograph */
- [0x5452, 0x5452], /* CJK Ideograph */
- [0x5453, 0x5453], /* CJK Ideograph */
- [0x5454, 0x5454], /* CJK Ideograph */
- [0x5455, 0x5455], /* CJK Ideograph */
- [0x5456, 0x5456], /* CJK Ideograph */
- [0x5457, 0x5457], /* CJK Ideograph */
- [0x5458, 0x5458], /* CJK Ideograph */
- [0x5459, 0x5459], /* CJK Ideograph */
- [0x545a, 0x545a], /* CJK Ideograph */
- [0x545b, 0x545b], /* CJK Ideograph */
- [0x545c, 0x545c], /* CJK Ideograph */
- [0x545d, 0x545d], /* CJK Ideograph */
- [0x545e, 0x545e], /* CJK Ideograph */
- [0x545f, 0x545f], /* CJK Ideograph */
- [0x5460, 0x5460], /* CJK Ideograph */
- [0x5461, 0x5461], /* CJK Ideograph */
- [0x5462, 0x5462], /* CJK Ideograph */
- [0x5463, 0x5463], /* CJK Ideograph */
- [0x5464, 0x5464], /* CJK Ideograph */
- [0x5465, 0x5465], /* CJK Ideograph */
- [0x5466, 0x5466], /* CJK Ideograph */
- [0x5467, 0x5467], /* CJK Ideograph */
- [0x5468, 0x5468], /* CJK Ideograph */
- [0x5469, 0x5469], /* CJK Ideograph */
- [0x546a, 0x546a], /* CJK Ideograph */
- [0x546b, 0x546b], /* CJK Ideograph */
- [0x546c, 0x546c], /* CJK Ideograph */
- [0x546d, 0x546d], /* CJK Ideograph */
- [0x546e, 0x546e], /* CJK Ideograph */
- [0x546f, 0x546f], /* CJK Ideograph */
- [0x5470, 0x5470], /* CJK Ideograph */
- [0x5471, 0x5471], /* CJK Ideograph */
- [0x5472, 0x5472], /* CJK Ideograph */
- [0x5473, 0x5473], /* CJK Ideograph */
- [0x5474, 0x5474], /* CJK Ideograph */
- [0x5475, 0x5475], /* CJK Ideograph */
- [0x5476, 0x5476], /* CJK Ideograph */
- [0x5477, 0x5477], /* CJK Ideograph */
- [0x5478, 0x5478], /* CJK Ideograph */
- [0x5479, 0x5479], /* CJK Ideograph */
- [0x547a, 0x547a], /* CJK Ideograph */
- [0x547b, 0x547b], /* CJK Ideograph */
- [0x547c, 0x547c], /* CJK Ideograph */
- [0x547d, 0x547d], /* CJK Ideograph */
- [0x547e, 0x547e], /* CJK Ideograph */
- [0x547f, 0x547f], /* CJK Ideograph */
- [0x5480, 0x5480], /* CJK Ideograph */
- [0x5481, 0x5481], /* CJK Ideograph */
- [0x5482, 0x5482], /* CJK Ideograph */
- [0x5483, 0x5483], /* CJK Ideograph */
- [0x5484, 0x5484], /* CJK Ideograph */
- [0x5485, 0x5485], /* CJK Ideograph */
- [0x5486, 0x5486], /* CJK Ideograph */
- [0x5487, 0x5487], /* CJK Ideograph */
- [0x5488, 0x5488], /* CJK Ideograph */
- [0x5489, 0x5489], /* CJK Ideograph */
- [0x548a, 0x548a], /* CJK Ideograph */
- [0x548b, 0x548b], /* CJK Ideograph */
- [0x548c, 0x548c], /* CJK Ideograph */
- [0x548d, 0x548d], /* CJK Ideograph */
- [0x548e, 0x548e], /* CJK Ideograph */
- [0x548f, 0x548f], /* CJK Ideograph */
- [0x5490, 0x5490], /* CJK Ideograph */
- [0x5491, 0x5491], /* CJK Ideograph */
- [0x5492, 0x5492], /* CJK Ideograph */
- [0x5493, 0x5493], /* CJK Ideograph */
- [0x5494, 0x5494], /* CJK Ideograph */
- [0x5495, 0x5495], /* CJK Ideograph */
- [0x5496, 0x5496], /* CJK Ideograph */
- [0x5497, 0x5497], /* CJK Ideograph */
- [0x5498, 0x5498], /* CJK Ideograph */
- [0x5499, 0x5499], /* CJK Ideograph */
- [0x549a, 0x549a], /* CJK Ideograph */
- [0x549b, 0x549b], /* CJK Ideograph */
- [0x549c, 0x549c], /* CJK Ideograph */
- [0x549d, 0x549d], /* CJK Ideograph */
- [0x549e, 0x549e], /* CJK Ideograph */
- [0x549f, 0x549f], /* CJK Ideograph */
- [0x54a0, 0x54a0], /* CJK Ideograph */
- [0x54a1, 0x54a1], /* CJK Ideograph */
- [0x54a2, 0x54a2], /* CJK Ideograph */
- [0x54a3, 0x54a3], /* CJK Ideograph */
- [0x54a4, 0x54a4], /* CJK Ideograph */
- [0x54a5, 0x54a5], /* CJK Ideograph */
- [0x54a6, 0x54a6], /* CJK Ideograph */
- [0x54a7, 0x54a7], /* CJK Ideograph */
- [0x54a8, 0x54a8], /* CJK Ideograph */
- [0x54a9, 0x54a9], /* CJK Ideograph */
- [0x54aa, 0x54aa], /* CJK Ideograph */
- [0x54ab, 0x54ab], /* CJK Ideograph */
- [0x54ac, 0x54ac], /* CJK Ideograph */
- [0x54ad, 0x54ad], /* CJK Ideograph */
- [0x54ae, 0x54ae], /* CJK Ideograph */
- [0x54af, 0x54af], /* CJK Ideograph */
- [0x54b0, 0x54b0], /* CJK Ideograph */
- [0x54b1, 0x54b1], /* CJK Ideograph */
- [0x54b2, 0x54b2], /* CJK Ideograph */
- [0x54b3, 0x54b3], /* CJK Ideograph */
- [0x54b4, 0x54b4], /* CJK Ideograph */
- [0x54b5, 0x54b5], /* CJK Ideograph */
- [0x54b6, 0x54b6], /* CJK Ideograph */
- [0x54b7, 0x54b7], /* CJK Ideograph */
- [0x54b8, 0x54b8], /* CJK Ideograph */
- [0x54b9, 0x54b9], /* CJK Ideograph */
- [0x54ba, 0x54ba], /* CJK Ideograph */
- [0x54bb, 0x54bb], /* CJK Ideograph */
- [0x54bc, 0x54bc], /* CJK Ideograph */
- [0x54bd, 0x54bd], /* CJK Ideograph */
- [0x54be, 0x54be], /* CJK Ideograph */
- [0x54bf, 0x54bf], /* CJK Ideograph */
- [0x54c0, 0x54c0], /* CJK Ideograph */
- [0x54c1, 0x54c1], /* CJK Ideograph */
- [0x54c2, 0x54c2], /* CJK Ideograph */
- [0x54c3, 0x54c3], /* CJK Ideograph */
- [0x54c4, 0x54c4], /* CJK Ideograph */
- [0x54c5, 0x54c5], /* CJK Ideograph */
- [0x54c6, 0x54c6], /* CJK Ideograph */
- [0x54c7, 0x54c7], /* CJK Ideograph */
- [0x54c8, 0x54c8], /* CJK Ideograph */
- [0x54c9, 0x54c9], /* CJK Ideograph */
- [0x54ca, 0x54ca], /* CJK Ideograph */
- [0x54cb, 0x54cb], /* CJK Ideograph */
- [0x54cc, 0x54cc], /* CJK Ideograph */
- [0x54cd, 0x54cd], /* CJK Ideograph */
- [0x54ce, 0x54ce], /* CJK Ideograph */
- [0x54cf, 0x54cf], /* CJK Ideograph */
- [0x54d0, 0x54d0], /* CJK Ideograph */
- [0x54d1, 0x54d1], /* CJK Ideograph */
- [0x54d2, 0x54d2], /* CJK Ideograph */
- [0x54d3, 0x54d3], /* CJK Ideograph */
- [0x54d4, 0x54d4], /* CJK Ideograph */
- [0x54d5, 0x54d5], /* CJK Ideograph */
- [0x54d6, 0x54d6], /* CJK Ideograph */
- [0x54d7, 0x54d7], /* CJK Ideograph */
- [0x54d8, 0x54d8], /* CJK Ideograph */
- [0x54d9, 0x54d9], /* CJK Ideograph */
- [0x54da, 0x54da], /* CJK Ideograph */
- [0x54db, 0x54db], /* CJK Ideograph */
- [0x54dc, 0x54dc], /* CJK Ideograph */
- [0x54dd, 0x54dd], /* CJK Ideograph */
- [0x54de, 0x54de], /* CJK Ideograph */
- [0x54df, 0x54df], /* CJK Ideograph */
- [0x54e0, 0x54e0], /* CJK Ideograph */
- [0x54e1, 0x54e1], /* CJK Ideograph */
- [0x54e2, 0x54e2], /* CJK Ideograph */
- [0x54e3, 0x54e3], /* CJK Ideograph */
- [0x54e4, 0x54e4], /* CJK Ideograph */
- [0x54e5, 0x54e5], /* CJK Ideograph */
- [0x54e6, 0x54e6], /* CJK Ideograph */
- [0x54e7, 0x54e7], /* CJK Ideograph */
- [0x54e8, 0x54e8], /* CJK Ideograph */
- [0x54e9, 0x54e9], /* CJK Ideograph */
- [0x54ea, 0x54ea], /* CJK Ideograph */
- [0x54eb, 0x54eb], /* CJK Ideograph */
- [0x54ec, 0x54ec], /* CJK Ideograph */
- [0x54ed, 0x54ed], /* CJK Ideograph */
- [0x54ee, 0x54ee], /* CJK Ideograph */
- [0x54ef, 0x54ef], /* CJK Ideograph */
- [0x54f0, 0x54f0], /* CJK Ideograph */
- [0x54f1, 0x54f1], /* CJK Ideograph */
- [0x54f2, 0x54f2], /* CJK Ideograph */
- [0x54f3, 0x54f3], /* CJK Ideograph */
- [0x54f4, 0x54f4], /* CJK Ideograph */
- [0x54f5, 0x54f5], /* CJK Ideograph */
- [0x54f6, 0x54f6], /* CJK Ideograph */
- [0x54f7, 0x54f7], /* CJK Ideograph */
- [0x54f8, 0x54f8], /* CJK Ideograph */
- [0x54f9, 0x54f9], /* CJK Ideograph */
- [0x54fa, 0x54fa], /* CJK Ideograph */
- [0x54fb, 0x54fb], /* CJK Ideograph */
- [0x54fc, 0x54fc], /* CJK Ideograph */
- [0x54fd, 0x54fd], /* CJK Ideograph */
- [0x54fe, 0x54fe], /* CJK Ideograph */
- [0x54ff, 0x54ff], /* CJK Ideograph */
- [0x5500, 0x5500], /* CJK Ideograph */
- [0x5501, 0x5501], /* CJK Ideograph */
- [0x5502, 0x5502], /* CJK Ideograph */
- [0x5503, 0x5503], /* CJK Ideograph */
- [0x5504, 0x5504], /* CJK Ideograph */
- [0x5505, 0x5505], /* CJK Ideograph */
- [0x5506, 0x5506], /* CJK Ideograph */
- [0x5507, 0x5507], /* CJK Ideograph */
- [0x5508, 0x5508], /* CJK Ideograph */
- [0x5509, 0x5509], /* CJK Ideograph */
- [0x550a, 0x550a], /* CJK Ideograph */
- [0x550b, 0x550b], /* CJK Ideograph */
- [0x550c, 0x550c], /* CJK Ideograph */
- [0x550d, 0x550d], /* CJK Ideograph */
- [0x550e, 0x550e], /* CJK Ideograph */
- [0x550f, 0x550f], /* CJK Ideograph */
- [0x5510, 0x5510], /* CJK Ideograph */
- [0x5511, 0x5511], /* CJK Ideograph */
- [0x5512, 0x5512], /* CJK Ideograph */
- [0x5513, 0x5513], /* CJK Ideograph */
- [0x5514, 0x5514], /* CJK Ideograph */
- [0x5515, 0x5515], /* CJK Ideograph */
- [0x5516, 0x5516], /* CJK Ideograph */
- [0x5517, 0x5517], /* CJK Ideograph */
- [0x5518, 0x5518], /* CJK Ideograph */
- [0x5519, 0x5519], /* CJK Ideograph */
- [0x551a, 0x551a], /* CJK Ideograph */
- [0x551b, 0x551b], /* CJK Ideograph */
- [0x551c, 0x551c], /* CJK Ideograph */
- [0x551d, 0x551d], /* CJK Ideograph */
- [0x551e, 0x551e], /* CJK Ideograph */
- [0x551f, 0x551f], /* CJK Ideograph */
- [0x5520, 0x5520], /* CJK Ideograph */
- [0x5521, 0x5521], /* CJK Ideograph */
- [0x5522, 0x5522], /* CJK Ideograph */
- [0x5523, 0x5523], /* CJK Ideograph */
- [0x5524, 0x5524], /* CJK Ideograph */
- [0x5525, 0x5525], /* CJK Ideograph */
- [0x5526, 0x5526], /* CJK Ideograph */
- [0x5527, 0x5527], /* CJK Ideograph */
- [0x5528, 0x5528], /* CJK Ideograph */
- [0x5529, 0x5529], /* CJK Ideograph */
- [0x552a, 0x552a], /* CJK Ideograph */
- [0x552b, 0x552b], /* CJK Ideograph */
- [0x552c, 0x552c], /* CJK Ideograph */
- [0x552d, 0x552d], /* CJK Ideograph */
- [0x552e, 0x552e], /* CJK Ideograph */
- [0x552f, 0x552f], /* CJK Ideograph */
- [0x5530, 0x5530], /* CJK Ideograph */
- [0x5531, 0x5531], /* CJK Ideograph */
- [0x5532, 0x5532], /* CJK Ideograph */
- [0x5533, 0x5533], /* CJK Ideograph */
- [0x5534, 0x5534], /* CJK Ideograph */
- [0x5535, 0x5535], /* CJK Ideograph */
- [0x5536, 0x5536], /* CJK Ideograph */
- [0x5537, 0x5537], /* CJK Ideograph */
- [0x5538, 0x5538], /* CJK Ideograph */
- [0x5539, 0x5539], /* CJK Ideograph */
- [0x553a, 0x553a], /* CJK Ideograph */
- [0x553b, 0x553b], /* CJK Ideograph */
- [0x553c, 0x553c], /* CJK Ideograph */
- [0x553d, 0x553d], /* CJK Ideograph */
- [0x553e, 0x553e], /* CJK Ideograph */
- [0x553f, 0x553f], /* CJK Ideograph */
- [0x5540, 0x5540], /* CJK Ideograph */
- [0x5541, 0x5541], /* CJK Ideograph */
- [0x5542, 0x5542], /* CJK Ideograph */
- [0x5543, 0x5543], /* CJK Ideograph */
- [0x5544, 0x5544], /* CJK Ideograph */
- [0x5545, 0x5545], /* CJK Ideograph */
- [0x5546, 0x5546], /* CJK Ideograph */
- [0x5547, 0x5547], /* CJK Ideograph */
- [0x5548, 0x5548], /* CJK Ideograph */
- [0x5549, 0x5549], /* CJK Ideograph */
- [0x554a, 0x554a], /* CJK Ideograph */
- [0x554b, 0x554b], /* CJK Ideograph */
- [0x554c, 0x554c], /* CJK Ideograph */
- [0x554d, 0x554d], /* CJK Ideograph */
- [0x554e, 0x554e], /* CJK Ideograph */
- [0x554f, 0x554f], /* CJK Ideograph */
- [0x5550, 0x5550], /* CJK Ideograph */
- [0x5551, 0x5551], /* CJK Ideograph */
- [0x5552, 0x5552], /* CJK Ideograph */
- [0x5553, 0x5553], /* CJK Ideograph */
- [0x5554, 0x5554], /* CJK Ideograph */
- [0x5555, 0x5555], /* CJK Ideograph */
- [0x5556, 0x5556], /* CJK Ideograph */
- [0x5557, 0x5557], /* CJK Ideograph */
- [0x5558, 0x5558], /* CJK Ideograph */
- [0x5559, 0x5559], /* CJK Ideograph */
- [0x555a, 0x555a], /* CJK Ideograph */
- [0x555b, 0x555b], /* CJK Ideograph */
- [0x555c, 0x555c], /* CJK Ideograph */
- [0x555d, 0x555d], /* CJK Ideograph */
- [0x555e, 0x555e], /* CJK Ideograph */
- [0x555f, 0x555f], /* CJK Ideograph */
- [0x5560, 0x5560], /* CJK Ideograph */
- [0x5561, 0x5561], /* CJK Ideograph */
- [0x5562, 0x5562], /* CJK Ideograph */
- [0x5563, 0x5563], /* CJK Ideograph */
- [0x5564, 0x5564], /* CJK Ideograph */
- [0x5565, 0x5565], /* CJK Ideograph */
- [0x5566, 0x5566], /* CJK Ideograph */
- [0x5567, 0x5567], /* CJK Ideograph */
- [0x5568, 0x5568], /* CJK Ideograph */
- [0x5569, 0x5569], /* CJK Ideograph */
- [0x556a, 0x556a], /* CJK Ideograph */
- [0x556b, 0x556b], /* CJK Ideograph */
- [0x556c, 0x556c], /* CJK Ideograph */
- [0x556d, 0x556d], /* CJK Ideograph */
- [0x556e, 0x556e], /* CJK Ideograph */
- [0x556f, 0x556f], /* CJK Ideograph */
- [0x5570, 0x5570], /* CJK Ideograph */
- [0x5571, 0x5571], /* CJK Ideograph */
- [0x5572, 0x5572], /* CJK Ideograph */
- [0x5573, 0x5573], /* CJK Ideograph */
- [0x5574, 0x5574], /* CJK Ideograph */
- [0x5575, 0x5575], /* CJK Ideograph */
- [0x5576, 0x5576], /* CJK Ideograph */
- [0x5577, 0x5577], /* CJK Ideograph */
- [0x5578, 0x5578], /* CJK Ideograph */
- [0x5579, 0x5579], /* CJK Ideograph */
- [0x557a, 0x557a], /* CJK Ideograph */
- [0x557b, 0x557b], /* CJK Ideograph */
- [0x557c, 0x557c], /* CJK Ideograph */
- [0x557d, 0x557d], /* CJK Ideograph */
- [0x557e, 0x557e], /* CJK Ideograph */
- [0x557f, 0x557f], /* CJK Ideograph */
- [0x5580, 0x5580], /* CJK Ideograph */
- [0x5581, 0x5581], /* CJK Ideograph */
- [0x5582, 0x5582], /* CJK Ideograph */
- [0x5583, 0x5583], /* CJK Ideograph */
- [0x5584, 0x5584], /* CJK Ideograph */
- [0x5585, 0x5585], /* CJK Ideograph */
- [0x5586, 0x5586], /* CJK Ideograph */
- [0x5587, 0x5587], /* CJK Ideograph */
- [0x5588, 0x5588], /* CJK Ideograph */
- [0x5589, 0x5589], /* CJK Ideograph */
- [0x558a, 0x558a], /* CJK Ideograph */
- [0x558b, 0x558b], /* CJK Ideograph */
- [0x558c, 0x558c], /* CJK Ideograph */
- [0x558d, 0x558d], /* CJK Ideograph */
- [0x558e, 0x558e], /* CJK Ideograph */
- [0x558f, 0x558f], /* CJK Ideograph */
- [0x5590, 0x5590], /* CJK Ideograph */
- [0x5591, 0x5591], /* CJK Ideograph */
- [0x5592, 0x5592], /* CJK Ideograph */
- [0x5593, 0x5593], /* CJK Ideograph */
- [0x5594, 0x5594], /* CJK Ideograph */
- [0x5595, 0x5595], /* CJK Ideograph */
- [0x5596, 0x5596], /* CJK Ideograph */
- [0x5597, 0x5597], /* CJK Ideograph */
- [0x5598, 0x5598], /* CJK Ideograph */
- [0x5599, 0x5599], /* CJK Ideograph */
- [0x559a, 0x559a], /* CJK Ideograph */
- [0x559b, 0x559b], /* CJK Ideograph */
- [0x559c, 0x559c], /* CJK Ideograph */
- [0x559d, 0x559d], /* CJK Ideograph */
- [0x559e, 0x559e], /* CJK Ideograph */
- [0x559f, 0x559f], /* CJK Ideograph */
- [0x55a0, 0x55a0], /* CJK Ideograph */
- [0x55a1, 0x55a1], /* CJK Ideograph */
- [0x55a2, 0x55a2], /* CJK Ideograph */
- [0x55a3, 0x55a3], /* CJK Ideograph */
- [0x55a4, 0x55a4], /* CJK Ideograph */
- [0x55a5, 0x55a5], /* CJK Ideograph */
- [0x55a6, 0x55a6], /* CJK Ideograph */
- [0x55a7, 0x55a7], /* CJK Ideograph */
- [0x55a8, 0x55a8], /* CJK Ideograph */
- [0x55a9, 0x55a9], /* CJK Ideograph */
- [0x55aa, 0x55aa], /* CJK Ideograph */
- [0x55ab, 0x55ab], /* CJK Ideograph */
- [0x55ac, 0x55ac], /* CJK Ideograph */
- [0x55ad, 0x55ad], /* CJK Ideograph */
- [0x55ae, 0x55ae], /* CJK Ideograph */
- [0x55af, 0x55af], /* CJK Ideograph */
- [0x55b0, 0x55b0], /* CJK Ideograph */
- [0x55b1, 0x55b1], /* CJK Ideograph */
- [0x55b2, 0x55b2], /* CJK Ideograph */
- [0x55b3, 0x55b3], /* CJK Ideograph */
- [0x55b4, 0x55b4], /* CJK Ideograph */
- [0x55b5, 0x55b5], /* CJK Ideograph */
- [0x55b6, 0x55b6], /* CJK Ideograph */
- [0x55b7, 0x55b7], /* CJK Ideograph */
- [0x55b8, 0x55b8], /* CJK Ideograph */
- [0x55b9, 0x55b9], /* CJK Ideograph */
- [0x55ba, 0x55ba], /* CJK Ideograph */
- [0x55bb, 0x55bb], /* CJK Ideograph */
- [0x55bc, 0x55bc], /* CJK Ideograph */
- [0x55bd, 0x55bd], /* CJK Ideograph */
- [0x55be, 0x55be], /* CJK Ideograph */
- [0x55bf, 0x55bf], /* CJK Ideograph */
- [0x55c0, 0x55c0], /* CJK Ideograph */
- [0x55c1, 0x55c1], /* CJK Ideograph */
- [0x55c2, 0x55c2], /* CJK Ideograph */
- [0x55c3, 0x55c3], /* CJK Ideograph */
- [0x55c4, 0x55c4], /* CJK Ideograph */
- [0x55c5, 0x55c5], /* CJK Ideograph */
- [0x55c6, 0x55c6], /* CJK Ideograph */
- [0x55c7, 0x55c7], /* CJK Ideograph */
- [0x55c8, 0x55c8], /* CJK Ideograph */
- [0x55c9, 0x55c9], /* CJK Ideograph */
- [0x55ca, 0x55ca], /* CJK Ideograph */
- [0x55cb, 0x55cb], /* CJK Ideograph */
- [0x55cc, 0x55cc], /* CJK Ideograph */
- [0x55cd, 0x55cd], /* CJK Ideograph */
- [0x55ce, 0x55ce], /* CJK Ideograph */
- [0x55cf, 0x55cf], /* CJK Ideograph */
- [0x55d0, 0x55d0], /* CJK Ideograph */
- [0x55d1, 0x55d1], /* CJK Ideograph */
- [0x55d2, 0x55d2], /* CJK Ideograph */
- [0x55d3, 0x55d3], /* CJK Ideograph */
- [0x55d4, 0x55d4], /* CJK Ideograph */
- [0x55d5, 0x55d5], /* CJK Ideograph */
- [0x55d6, 0x55d6], /* CJK Ideograph */
- [0x55d7, 0x55d7], /* CJK Ideograph */
- [0x55d8, 0x55d8], /* CJK Ideograph */
- [0x55d9, 0x55d9], /* CJK Ideograph */
- [0x55da, 0x55da], /* CJK Ideograph */
- [0x55db, 0x55db], /* CJK Ideograph */
- [0x55dc, 0x55dc], /* CJK Ideograph */
- [0x55dd, 0x55dd], /* CJK Ideograph */
- [0x55de, 0x55de], /* CJK Ideograph */
- [0x55df, 0x55df], /* CJK Ideograph */
- [0x55e0, 0x55e0], /* CJK Ideograph */
- [0x55e1, 0x55e1], /* CJK Ideograph */
- [0x55e2, 0x55e2], /* CJK Ideograph */
- [0x55e3, 0x55e3], /* CJK Ideograph */
- [0x55e4, 0x55e4], /* CJK Ideograph */
- [0x55e5, 0x55e5], /* CJK Ideograph */
- [0x55e6, 0x55e6], /* CJK Ideograph */
- [0x55e7, 0x55e7], /* CJK Ideograph */
- [0x55e8, 0x55e8], /* CJK Ideograph */
- [0x55e9, 0x55e9], /* CJK Ideograph */
- [0x55ea, 0x55ea], /* CJK Ideograph */
- [0x55eb, 0x55eb], /* CJK Ideograph */
- [0x55ec, 0x55ec], /* CJK Ideograph */
- [0x55ed, 0x55ed], /* CJK Ideograph */
- [0x55ee, 0x55ee], /* CJK Ideograph */
- [0x55ef, 0x55ef], /* CJK Ideograph */
- [0x55f0, 0x55f0], /* CJK Ideograph */
- [0x55f1, 0x55f1], /* CJK Ideograph */
- [0x55f2, 0x55f2], /* CJK Ideograph */
- [0x55f3, 0x55f3], /* CJK Ideograph */
- [0x55f4, 0x55f4], /* CJK Ideograph */
- [0x55f5, 0x55f5], /* CJK Ideograph */
- [0x55f6, 0x55f6], /* CJK Ideograph */
- [0x55f7, 0x55f7], /* CJK Ideograph */
- [0x55f8, 0x55f8], /* CJK Ideograph */
- [0x55f9, 0x55f9], /* CJK Ideograph */
- [0x55fa, 0x55fa], /* CJK Ideograph */
- [0x55fb, 0x55fb], /* CJK Ideograph */
- [0x55fc, 0x55fc], /* CJK Ideograph */
- [0x55fd, 0x55fd], /* CJK Ideograph */
- [0x55fe, 0x55fe], /* CJK Ideograph */
- [0x55ff, 0x55ff], /* CJK Ideograph */
- [0x5600, 0x5600], /* CJK Ideograph */
- [0x5601, 0x5601], /* CJK Ideograph */
- [0x5602, 0x5602], /* CJK Ideograph */
- [0x5603, 0x5603], /* CJK Ideograph */
- [0x5604, 0x5604], /* CJK Ideograph */
- [0x5605, 0x5605], /* CJK Ideograph */
- [0x5606, 0x5606], /* CJK Ideograph */
- [0x5607, 0x5607], /* CJK Ideograph */
- [0x5608, 0x5608], /* CJK Ideograph */
- [0x5609, 0x5609], /* CJK Ideograph */
- [0x560a, 0x560a], /* CJK Ideograph */
- [0x560b, 0x560b], /* CJK Ideograph */
- [0x560c, 0x560c], /* CJK Ideograph */
- [0x560d, 0x560d], /* CJK Ideograph */
- [0x560e, 0x560e], /* CJK Ideograph */
- [0x560f, 0x560f], /* CJK Ideograph */
- [0x5610, 0x5610], /* CJK Ideograph */
- [0x5611, 0x5611], /* CJK Ideograph */
- [0x5612, 0x5612], /* CJK Ideograph */
- [0x5613, 0x5613], /* CJK Ideograph */
- [0x5614, 0x5614], /* CJK Ideograph */
- [0x5615, 0x5615], /* CJK Ideograph */
- [0x5616, 0x5616], /* CJK Ideograph */
- [0x5617, 0x5617], /* CJK Ideograph */
- [0x5618, 0x5618], /* CJK Ideograph */
- [0x5619, 0x5619], /* CJK Ideograph */
- [0x561a, 0x561a], /* CJK Ideograph */
- [0x561b, 0x561b], /* CJK Ideograph */
- [0x561c, 0x561c], /* CJK Ideograph */
- [0x561d, 0x561d], /* CJK Ideograph */
- [0x561e, 0x561e], /* CJK Ideograph */
- [0x561f, 0x561f], /* CJK Ideograph */
- [0x5620, 0x5620], /* CJK Ideograph */
- [0x5621, 0x5621], /* CJK Ideograph */
- [0x5622, 0x5622], /* CJK Ideograph */
- [0x5623, 0x5623], /* CJK Ideograph */
- [0x5624, 0x5624], /* CJK Ideograph */
- [0x5625, 0x5625], /* CJK Ideograph */
- [0x5626, 0x5626], /* CJK Ideograph */
- [0x5627, 0x5627], /* CJK Ideograph */
- [0x5628, 0x5628], /* CJK Ideograph */
- [0x5629, 0x5629], /* CJK Ideograph */
- [0x562a, 0x562a], /* CJK Ideograph */
- [0x562b, 0x562b], /* CJK Ideograph */
- [0x562c, 0x562c], /* CJK Ideograph */
- [0x562d, 0x562d], /* CJK Ideograph */
- [0x562e, 0x562e], /* CJK Ideograph */
- [0x562f, 0x562f], /* CJK Ideograph */
- [0x5630, 0x5630], /* CJK Ideograph */
- [0x5631, 0x5631], /* CJK Ideograph */
- [0x5632, 0x5632], /* CJK Ideograph */
- [0x5633, 0x5633], /* CJK Ideograph */
- [0x5634, 0x5634], /* CJK Ideograph */
- [0x5635, 0x5635], /* CJK Ideograph */
- [0x5636, 0x5636], /* CJK Ideograph */
- [0x5637, 0x5637], /* CJK Ideograph */
- [0x5638, 0x5638], /* CJK Ideograph */
- [0x5639, 0x5639], /* CJK Ideograph */
- [0x563a, 0x563a], /* CJK Ideograph */
- [0x563b, 0x563b], /* CJK Ideograph */
- [0x563c, 0x563c], /* CJK Ideograph */
- [0x563d, 0x563d], /* CJK Ideograph */
- [0x563e, 0x563e], /* CJK Ideograph */
- [0x563f, 0x563f], /* CJK Ideograph */
- [0x5640, 0x5640], /* CJK Ideograph */
- [0x5641, 0x5641], /* CJK Ideograph */
- [0x5642, 0x5642], /* CJK Ideograph */
- [0x5643, 0x5643], /* CJK Ideograph */
- [0x5644, 0x5644], /* CJK Ideograph */
- [0x5645, 0x5645], /* CJK Ideograph */
- [0x5646, 0x5646], /* CJK Ideograph */
- [0x5647, 0x5647], /* CJK Ideograph */
- [0x5648, 0x5648], /* CJK Ideograph */
- [0x5649, 0x5649], /* CJK Ideograph */
- [0x564a, 0x564a], /* CJK Ideograph */
- [0x564b, 0x564b], /* CJK Ideograph */
- [0x564c, 0x564c], /* CJK Ideograph */
- [0x564d, 0x564d], /* CJK Ideograph */
- [0x564e, 0x564e], /* CJK Ideograph */
- [0x564f, 0x564f], /* CJK Ideograph */
- [0x5650, 0x5650], /* CJK Ideograph */
- [0x5651, 0x5651], /* CJK Ideograph */
- [0x5652, 0x5652], /* CJK Ideograph */
- [0x5653, 0x5653], /* CJK Ideograph */
- [0x5654, 0x5654], /* CJK Ideograph */
- [0x5655, 0x5655], /* CJK Ideograph */
- [0x5656, 0x5656], /* CJK Ideograph */
- [0x5657, 0x5657], /* CJK Ideograph */
- [0x5658, 0x5658], /* CJK Ideograph */
- [0x5659, 0x5659], /* CJK Ideograph */
- [0x565a, 0x565a], /* CJK Ideograph */
- [0x565b, 0x565b], /* CJK Ideograph */
- [0x565c, 0x565c], /* CJK Ideograph */
- [0x565d, 0x565d], /* CJK Ideograph */
- [0x565e, 0x565e], /* CJK Ideograph */
- [0x565f, 0x565f], /* CJK Ideograph */
- [0x5660, 0x5660], /* CJK Ideograph */
- [0x5661, 0x5661], /* CJK Ideograph */
- [0x5662, 0x5662], /* CJK Ideograph */
- [0x5663, 0x5663], /* CJK Ideograph */
- [0x5664, 0x5664], /* CJK Ideograph */
- [0x5665, 0x5665], /* CJK Ideograph */
- [0x5666, 0x5666], /* CJK Ideograph */
- [0x5667, 0x5667], /* CJK Ideograph */
- [0x5668, 0x5668], /* CJK Ideograph */
- [0x5669, 0x5669], /* CJK Ideograph */
- [0x566a, 0x566a], /* CJK Ideograph */
- [0x566b, 0x566b], /* CJK Ideograph */
- [0x566c, 0x566c], /* CJK Ideograph */
- [0x566d, 0x566d], /* CJK Ideograph */
- [0x566e, 0x566e], /* CJK Ideograph */
- [0x566f, 0x566f], /* CJK Ideograph */
- [0x5670, 0x5670], /* CJK Ideograph */
- [0x5671, 0x5671], /* CJK Ideograph */
- [0x5672, 0x5672], /* CJK Ideograph */
- [0x5673, 0x5673], /* CJK Ideograph */
- [0x5674, 0x5674], /* CJK Ideograph */
- [0x5675, 0x5675], /* CJK Ideograph */
- [0x5676, 0x5676], /* CJK Ideograph */
- [0x5677, 0x5677], /* CJK Ideograph */
- [0x5678, 0x5678], /* CJK Ideograph */
- [0x5679, 0x5679], /* CJK Ideograph */
- [0x567a, 0x567a], /* CJK Ideograph */
- [0x567b, 0x567b], /* CJK Ideograph */
- [0x567c, 0x567c], /* CJK Ideograph */
- [0x567d, 0x567d], /* CJK Ideograph */
- [0x567e, 0x567e], /* CJK Ideograph */
- [0x567f, 0x567f], /* CJK Ideograph */
- [0x5680, 0x5680], /* CJK Ideograph */
- [0x5681, 0x5681], /* CJK Ideograph */
- [0x5682, 0x5682], /* CJK Ideograph */
- [0x5683, 0x5683], /* CJK Ideograph */
- [0x5684, 0x5684], /* CJK Ideograph */
- [0x5685, 0x5685], /* CJK Ideograph */
- [0x5686, 0x5686], /* CJK Ideograph */
- [0x5687, 0x5687], /* CJK Ideograph */
- [0x5688, 0x5688], /* CJK Ideograph */
- [0x5689, 0x5689], /* CJK Ideograph */
- [0x568a, 0x568a], /* CJK Ideograph */
- [0x568b, 0x568b], /* CJK Ideograph */
- [0x568c, 0x568c], /* CJK Ideograph */
- [0x568d, 0x568d], /* CJK Ideograph */
- [0x568e, 0x568e], /* CJK Ideograph */
- [0x568f, 0x568f], /* CJK Ideograph */
- [0x5690, 0x5690], /* CJK Ideograph */
- [0x5691, 0x5691], /* CJK Ideograph */
- [0x5692, 0x5692], /* CJK Ideograph */
- [0x5693, 0x5693], /* CJK Ideograph */
- [0x5694, 0x5694], /* CJK Ideograph */
- [0x5695, 0x5695], /* CJK Ideograph */
- [0x5696, 0x5696], /* CJK Ideograph */
- [0x5697, 0x5697], /* CJK Ideograph */
- [0x5698, 0x5698], /* CJK Ideograph */
- [0x5699, 0x5699], /* CJK Ideograph */
- [0x569a, 0x569a], /* CJK Ideograph */
- [0x569b, 0x569b], /* CJK Ideograph */
- [0x569c, 0x569c], /* CJK Ideograph */
- [0x569d, 0x569d], /* CJK Ideograph */
- [0x569e, 0x569e], /* CJK Ideograph */
- [0x569f, 0x569f], /* CJK Ideograph */
- [0x56a0, 0x56a0], /* CJK Ideograph */
- [0x56a1, 0x56a1], /* CJK Ideograph */
- [0x56a2, 0x56a2], /* CJK Ideograph */
- [0x56a3, 0x56a3], /* CJK Ideograph */
- [0x56a4, 0x56a4], /* CJK Ideograph */
- [0x56a5, 0x56a5], /* CJK Ideograph */
- [0x56a6, 0x56a6], /* CJK Ideograph */
- [0x56a7, 0x56a7], /* CJK Ideograph */
- [0x56a8, 0x56a8], /* CJK Ideograph */
- [0x56a9, 0x56a9], /* CJK Ideograph */
- [0x56aa, 0x56aa], /* CJK Ideograph */
- [0x56ab, 0x56ab], /* CJK Ideograph */
- [0x56ac, 0x56ac], /* CJK Ideograph */
- [0x56ad, 0x56ad], /* CJK Ideograph */
- [0x56ae, 0x56ae], /* CJK Ideograph */
- [0x56af, 0x56af], /* CJK Ideograph */
- [0x56b0, 0x56b0], /* CJK Ideograph */
- [0x56b1, 0x56b1], /* CJK Ideograph */
- [0x56b2, 0x56b2], /* CJK Ideograph */
- [0x56b3, 0x56b3], /* CJK Ideograph */
- [0x56b4, 0x56b4], /* CJK Ideograph */
- [0x56b5, 0x56b5], /* CJK Ideograph */
- [0x56b6, 0x56b6], /* CJK Ideograph */
- [0x56b7, 0x56b7], /* CJK Ideograph */
- [0x56b8, 0x56b8], /* CJK Ideograph */
- [0x56b9, 0x56b9], /* CJK Ideograph */
- [0x56ba, 0x56ba], /* CJK Ideograph */
- [0x56bb, 0x56bb], /* CJK Ideograph */
- [0x56bc, 0x56bc], /* CJK Ideograph */
- [0x56bd, 0x56bd], /* CJK Ideograph */
- [0x56be, 0x56be], /* CJK Ideograph */
- [0x56bf, 0x56bf], /* CJK Ideograph */
- [0x56c0, 0x56c0], /* CJK Ideograph */
- [0x56c1, 0x56c1], /* CJK Ideograph */
- [0x56c2, 0x56c2], /* CJK Ideograph */
- [0x56c3, 0x56c3], /* CJK Ideograph */
- [0x56c4, 0x56c4], /* CJK Ideograph */
- [0x56c5, 0x56c5], /* CJK Ideograph */
- [0x56c6, 0x56c6], /* CJK Ideograph */
- [0x56c7, 0x56c7], /* CJK Ideograph */
- [0x56c8, 0x56c8], /* CJK Ideograph */
- [0x56c9, 0x56c9], /* CJK Ideograph */
- [0x56ca, 0x56ca], /* CJK Ideograph */
- [0x56cb, 0x56cb], /* CJK Ideograph */
- [0x56cc, 0x56cc], /* CJK Ideograph */
- [0x56cd, 0x56cd], /* CJK Ideograph */
- [0x56ce, 0x56ce], /* CJK Ideograph */
- [0x56cf, 0x56cf], /* CJK Ideograph */
- [0x56d0, 0x56d0], /* CJK Ideograph */
- [0x56d1, 0x56d1], /* CJK Ideograph */
- [0x56d2, 0x56d2], /* CJK Ideograph */
- [0x56d3, 0x56d3], /* CJK Ideograph */
- [0x56d4, 0x56d4], /* CJK Ideograph */
- [0x56d5, 0x56d5], /* CJK Ideograph */
- [0x56d6, 0x56d6], /* CJK Ideograph */
- [0x56d7, 0x56d7], /* CJK Ideograph */
- [0x56d8, 0x56d8], /* CJK Ideograph */
- [0x56d9, 0x56d9], /* CJK Ideograph */
- [0x56da, 0x56da], /* CJK Ideograph */
- [0x56db, 0x56db], /* CJK Ideograph */
- [0x56dc, 0x56dc], /* CJK Ideograph */
- [0x56dd, 0x56dd], /* CJK Ideograph */
- [0x56de, 0x56de], /* CJK Ideograph */
- [0x56df, 0x56df], /* CJK Ideograph */
- [0x56e0, 0x56e0], /* CJK Ideograph */
- [0x56e1, 0x56e1], /* CJK Ideograph */
- [0x56e2, 0x56e2], /* CJK Ideograph */
- [0x56e3, 0x56e3], /* CJK Ideograph */
- [0x56e4, 0x56e4], /* CJK Ideograph */
- [0x56e5, 0x56e5], /* CJK Ideograph */
- [0x56e6, 0x56e6], /* CJK Ideograph */
- [0x56e7, 0x56e7], /* CJK Ideograph */
- [0x56e8, 0x56e8], /* CJK Ideograph */
- [0x56e9, 0x56e9], /* CJK Ideograph */
- [0x56ea, 0x56ea], /* CJK Ideograph */
- [0x56eb, 0x56eb], /* CJK Ideograph */
- [0x56ec, 0x56ec], /* CJK Ideograph */
- [0x56ed, 0x56ed], /* CJK Ideograph */
- [0x56ee, 0x56ee], /* CJK Ideograph */
- [0x56ef, 0x56ef], /* CJK Ideograph */
- [0x56f0, 0x56f0], /* CJK Ideograph */
- [0x56f1, 0x56f1], /* CJK Ideograph */
- [0x56f2, 0x56f2], /* CJK Ideograph */
- [0x56f3, 0x56f3], /* CJK Ideograph */
- [0x56f4, 0x56f4], /* CJK Ideograph */
- [0x56f5, 0x56f5], /* CJK Ideograph */
- [0x56f6, 0x56f6], /* CJK Ideograph */
- [0x56f7, 0x56f7], /* CJK Ideograph */
- [0x56f8, 0x56f8], /* CJK Ideograph */
- [0x56f9, 0x56f9], /* CJK Ideograph */
- [0x56fa, 0x56fa], /* CJK Ideograph */
- [0x56fb, 0x56fb], /* CJK Ideograph */
- [0x56fc, 0x56fc], /* CJK Ideograph */
- [0x56fd, 0x56fd], /* CJK Ideograph */
- [0x56fe, 0x56fe], /* CJK Ideograph */
- [0x56ff, 0x56ff], /* CJK Ideograph */
- [0x5700, 0x5700], /* CJK Ideograph */
- [0x5701, 0x5701], /* CJK Ideograph */
- [0x5702, 0x5702], /* CJK Ideograph */
- [0x5703, 0x5703], /* CJK Ideograph */
- [0x5704, 0x5704], /* CJK Ideograph */
- [0x5705, 0x5705], /* CJK Ideograph */
- [0x5706, 0x5706], /* CJK Ideograph */
- [0x5707, 0x5707], /* CJK Ideograph */
- [0x5708, 0x5708], /* CJK Ideograph */
- [0x5709, 0x5709], /* CJK Ideograph */
- [0x570a, 0x570a], /* CJK Ideograph */
- [0x570b, 0x570b], /* CJK Ideograph */
- [0x570c, 0x570c], /* CJK Ideograph */
- [0x570d, 0x570d], /* CJK Ideograph */
- [0x570e, 0x570e], /* CJK Ideograph */
- [0x570f, 0x570f], /* CJK Ideograph */
- [0x5710, 0x5710], /* CJK Ideograph */
- [0x5711, 0x5711], /* CJK Ideograph */
- [0x5712, 0x5712], /* CJK Ideograph */
- [0x5713, 0x5713], /* CJK Ideograph */
- [0x5714, 0x5714], /* CJK Ideograph */
- [0x5715, 0x5715], /* CJK Ideograph */
- [0x5716, 0x5716], /* CJK Ideograph */
- [0x5717, 0x5717], /* CJK Ideograph */
- [0x5718, 0x5718], /* CJK Ideograph */
- [0x5719, 0x5719], /* CJK Ideograph */
- [0x571a, 0x571a], /* CJK Ideograph */
- [0x571b, 0x571b], /* CJK Ideograph */
- [0x571c, 0x571c], /* CJK Ideograph */
- [0x571d, 0x571d], /* CJK Ideograph */
- [0x571e, 0x571e], /* CJK Ideograph */
- [0x571f, 0x571f], /* CJK Ideograph */
- [0x5720, 0x5720], /* CJK Ideograph */
- [0x5721, 0x5721], /* CJK Ideograph */
- [0x5722, 0x5722], /* CJK Ideograph */
- [0x5723, 0x5723], /* CJK Ideograph */
- [0x5724, 0x5724], /* CJK Ideograph */
- [0x5725, 0x5725], /* CJK Ideograph */
- [0x5726, 0x5726], /* CJK Ideograph */
- [0x5727, 0x5727], /* CJK Ideograph */
- [0x5728, 0x5728], /* CJK Ideograph */
- [0x5729, 0x5729], /* CJK Ideograph */
- [0x572a, 0x572a], /* CJK Ideograph */
- [0x572b, 0x572b], /* CJK Ideograph */
- [0x572c, 0x572c], /* CJK Ideograph */
- [0x572d, 0x572d], /* CJK Ideograph */
- [0x572e, 0x572e], /* CJK Ideograph */
- [0x572f, 0x572f], /* CJK Ideograph */
- [0x5730, 0x5730], /* CJK Ideograph */
- [0x5731, 0x5731], /* CJK Ideograph */
- [0x5732, 0x5732], /* CJK Ideograph */
- [0x5733, 0x5733], /* CJK Ideograph */
- [0x5734, 0x5734], /* CJK Ideograph */
- [0x5735, 0x5735], /* CJK Ideograph */
- [0x5736, 0x5736], /* CJK Ideograph */
- [0x5737, 0x5737], /* CJK Ideograph */
- [0x5738, 0x5738], /* CJK Ideograph */
- [0x5739, 0x5739], /* CJK Ideograph */
- [0x573a, 0x573a], /* CJK Ideograph */
- [0x573b, 0x573b], /* CJK Ideograph */
- [0x573c, 0x573c], /* CJK Ideograph */
- [0x573d, 0x573d], /* CJK Ideograph */
- [0x573e, 0x573e], /* CJK Ideograph */
- [0x573f, 0x573f], /* CJK Ideograph */
- [0x5740, 0x5740], /* CJK Ideograph */
- [0x5741, 0x5741], /* CJK Ideograph */
- [0x5742, 0x5742], /* CJK Ideograph */
- [0x5743, 0x5743], /* CJK Ideograph */
- [0x5744, 0x5744], /* CJK Ideograph */
- [0x5745, 0x5745], /* CJK Ideograph */
- [0x5746, 0x5746], /* CJK Ideograph */
- [0x5747, 0x5747], /* CJK Ideograph */
- [0x5748, 0x5748], /* CJK Ideograph */
- [0x5749, 0x5749], /* CJK Ideograph */
- [0x574a, 0x574a], /* CJK Ideograph */
- [0x574b, 0x574b], /* CJK Ideograph */
- [0x574c, 0x574c], /* CJK Ideograph */
- [0x574d, 0x574d], /* CJK Ideograph */
- [0x574e, 0x574e], /* CJK Ideograph */
- [0x574f, 0x574f], /* CJK Ideograph */
- [0x5750, 0x5750], /* CJK Ideograph */
- [0x5751, 0x5751], /* CJK Ideograph */
- [0x5752, 0x5752], /* CJK Ideograph */
- [0x5753, 0x5753], /* CJK Ideograph */
- [0x5754, 0x5754], /* CJK Ideograph */
- [0x5755, 0x5755], /* CJK Ideograph */
- [0x5756, 0x5756], /* CJK Ideograph */
- [0x5757, 0x5757], /* CJK Ideograph */
- [0x5758, 0x5758], /* CJK Ideograph */
- [0x5759, 0x5759], /* CJK Ideograph */
- [0x575a, 0x575a], /* CJK Ideograph */
- [0x575b, 0x575b], /* CJK Ideograph */
- [0x575c, 0x575c], /* CJK Ideograph */
- [0x575d, 0x575d], /* CJK Ideograph */
- [0x575e, 0x575e], /* CJK Ideograph */
- [0x575f, 0x575f], /* CJK Ideograph */
- [0x5760, 0x5760], /* CJK Ideograph */
- [0x5761, 0x5761], /* CJK Ideograph */
- [0x5762, 0x5762], /* CJK Ideograph */
- [0x5763, 0x5763], /* CJK Ideograph */
- [0x5764, 0x5764], /* CJK Ideograph */
- [0x5765, 0x5765], /* CJK Ideograph */
- [0x5766, 0x5766], /* CJK Ideograph */
- [0x5767, 0x5767], /* CJK Ideograph */
- [0x5768, 0x5768], /* CJK Ideograph */
- [0x5769, 0x5769], /* CJK Ideograph */
- [0x576a, 0x576a], /* CJK Ideograph */
- [0x576b, 0x576b], /* CJK Ideograph */
- [0x576c, 0x576c], /* CJK Ideograph */
- [0x576d, 0x576d], /* CJK Ideograph */
- [0x576e, 0x576e], /* CJK Ideograph */
- [0x576f, 0x576f], /* CJK Ideograph */
- [0x5770, 0x5770], /* CJK Ideograph */
- [0x5771, 0x5771], /* CJK Ideograph */
- [0x5772, 0x5772], /* CJK Ideograph */
- [0x5773, 0x5773], /* CJK Ideograph */
- [0x5774, 0x5774], /* CJK Ideograph */
- [0x5775, 0x5775], /* CJK Ideograph */
- [0x5776, 0x5776], /* CJK Ideograph */
- [0x5777, 0x5777], /* CJK Ideograph */
- [0x5778, 0x5778], /* CJK Ideograph */
- [0x5779, 0x5779], /* CJK Ideograph */
- [0x577a, 0x577a], /* CJK Ideograph */
- [0x577b, 0x577b], /* CJK Ideograph */
- [0x577c, 0x577c], /* CJK Ideograph */
- [0x577d, 0x577d], /* CJK Ideograph */
- [0x577e, 0x577e], /* CJK Ideograph */
- [0x577f, 0x577f], /* CJK Ideograph */
- [0x5780, 0x5780], /* CJK Ideograph */
- [0x5781, 0x5781], /* CJK Ideograph */
- [0x5782, 0x5782], /* CJK Ideograph */
- [0x5783, 0x5783], /* CJK Ideograph */
- [0x5784, 0x5784], /* CJK Ideograph */
- [0x5785, 0x5785], /* CJK Ideograph */
- [0x5786, 0x5786], /* CJK Ideograph */
- [0x5787, 0x5787], /* CJK Ideograph */
- [0x5788, 0x5788], /* CJK Ideograph */
- [0x5789, 0x5789], /* CJK Ideograph */
- [0x578a, 0x578a], /* CJK Ideograph */
- [0x578b, 0x578b], /* CJK Ideograph */
- [0x578c, 0x578c], /* CJK Ideograph */
- [0x578d, 0x578d], /* CJK Ideograph */
- [0x578e, 0x578e], /* CJK Ideograph */
- [0x578f, 0x578f], /* CJK Ideograph */
- [0x5790, 0x5790], /* CJK Ideograph */
- [0x5791, 0x5791], /* CJK Ideograph */
- [0x5792, 0x5792], /* CJK Ideograph */
- [0x5793, 0x5793], /* CJK Ideograph */
- [0x5794, 0x5794], /* CJK Ideograph */
- [0x5795, 0x5795], /* CJK Ideograph */
- [0x5796, 0x5796], /* CJK Ideograph */
- [0x5797, 0x5797], /* CJK Ideograph */
- [0x5798, 0x5798], /* CJK Ideograph */
- [0x5799, 0x5799], /* CJK Ideograph */
- [0x579a, 0x579a], /* CJK Ideograph */
- [0x579b, 0x579b], /* CJK Ideograph */
- [0x579c, 0x579c], /* CJK Ideograph */
- [0x579d, 0x579d], /* CJK Ideograph */
- [0x579e, 0x579e], /* CJK Ideograph */
- [0x579f, 0x579f], /* CJK Ideograph */
- [0x57a0, 0x57a0], /* CJK Ideograph */
- [0x57a1, 0x57a1], /* CJK Ideograph */
- [0x57a2, 0x57a2], /* CJK Ideograph */
- [0x57a3, 0x57a3], /* CJK Ideograph */
- [0x57a4, 0x57a4], /* CJK Ideograph */
- [0x57a5, 0x57a5], /* CJK Ideograph */
- [0x57a6, 0x57a6], /* CJK Ideograph */
- [0x57a7, 0x57a7], /* CJK Ideograph */
- [0x57a8, 0x57a8], /* CJK Ideograph */
- [0x57a9, 0x57a9], /* CJK Ideograph */
- [0x57aa, 0x57aa], /* CJK Ideograph */
- [0x57ab, 0x57ab], /* CJK Ideograph */
- [0x57ac, 0x57ac], /* CJK Ideograph */
- [0x57ad, 0x57ad], /* CJK Ideograph */
- [0x57ae, 0x57ae], /* CJK Ideograph */
- [0x57af, 0x57af], /* CJK Ideograph */
- [0x57b0, 0x57b0], /* CJK Ideograph */
- [0x57b1, 0x57b1], /* CJK Ideograph */
- [0x57b2, 0x57b2], /* CJK Ideograph */
- [0x57b3, 0x57b3], /* CJK Ideograph */
- [0x57b4, 0x57b4], /* CJK Ideograph */
- [0x57b5, 0x57b5], /* CJK Ideograph */
- [0x57b6, 0x57b6], /* CJK Ideograph */
- [0x57b7, 0x57b7], /* CJK Ideograph */
- [0x57b8, 0x57b8], /* CJK Ideograph */
- [0x57b9, 0x57b9], /* CJK Ideograph */
- [0x57ba, 0x57ba], /* CJK Ideograph */
- [0x57bb, 0x57bb], /* CJK Ideograph */
- [0x57bc, 0x57bc], /* CJK Ideograph */
- [0x57bd, 0x57bd], /* CJK Ideograph */
- [0x57be, 0x57be], /* CJK Ideograph */
- [0x57bf, 0x57bf], /* CJK Ideograph */
- [0x57c0, 0x57c0], /* CJK Ideograph */
- [0x57c1, 0x57c1], /* CJK Ideograph */
- [0x57c2, 0x57c2], /* CJK Ideograph */
- [0x57c3, 0x57c3], /* CJK Ideograph */
- [0x57c4, 0x57c4], /* CJK Ideograph */
- [0x57c5, 0x57c5], /* CJK Ideograph */
- [0x57c6, 0x57c6], /* CJK Ideograph */
- [0x57c7, 0x57c7], /* CJK Ideograph */
- [0x57c8, 0x57c8], /* CJK Ideograph */
- [0x57c9, 0x57c9], /* CJK Ideograph */
- [0x57ca, 0x57ca], /* CJK Ideograph */
- [0x57cb, 0x57cb], /* CJK Ideograph */
- [0x57cc, 0x57cc], /* CJK Ideograph */
- [0x57cd, 0x57cd], /* CJK Ideograph */
- [0x57ce, 0x57ce], /* CJK Ideograph */
- [0x57cf, 0x57cf], /* CJK Ideograph */
- [0x57d0, 0x57d0], /* CJK Ideograph */
- [0x57d1, 0x57d1], /* CJK Ideograph */
- [0x57d2, 0x57d2], /* CJK Ideograph */
- [0x57d3, 0x57d3], /* CJK Ideograph */
- [0x57d4, 0x57d4], /* CJK Ideograph */
- [0x57d5, 0x57d5], /* CJK Ideograph */
- [0x57d6, 0x57d6], /* CJK Ideograph */
- [0x57d7, 0x57d7], /* CJK Ideograph */
- [0x57d8, 0x57d8], /* CJK Ideograph */
- [0x57d9, 0x57d9], /* CJK Ideograph */
- [0x57da, 0x57da], /* CJK Ideograph */
- [0x57db, 0x57db], /* CJK Ideograph */
- [0x57dc, 0x57dc], /* CJK Ideograph */
- [0x57dd, 0x57dd], /* CJK Ideograph */
- [0x57de, 0x57de], /* CJK Ideograph */
- [0x57df, 0x57df], /* CJK Ideograph */
- [0x57e0, 0x57e0], /* CJK Ideograph */
- [0x57e1, 0x57e1], /* CJK Ideograph */
- [0x57e2, 0x57e2], /* CJK Ideograph */
- [0x57e3, 0x57e3], /* CJK Ideograph */
- [0x57e4, 0x57e4], /* CJK Ideograph */
- [0x57e5, 0x57e5], /* CJK Ideograph */
- [0x57e6, 0x57e6], /* CJK Ideograph */
- [0x57e7, 0x57e7], /* CJK Ideograph */
- [0x57e8, 0x57e8], /* CJK Ideograph */
- [0x57e9, 0x57e9], /* CJK Ideograph */
- [0x57ea, 0x57ea], /* CJK Ideograph */
- [0x57eb, 0x57eb], /* CJK Ideograph */
- [0x57ec, 0x57ec], /* CJK Ideograph */
- [0x57ed, 0x57ed], /* CJK Ideograph */
- [0x57ee, 0x57ee], /* CJK Ideograph */
- [0x57ef, 0x57ef], /* CJK Ideograph */
- [0x57f0, 0x57f0], /* CJK Ideograph */
- [0x57f1, 0x57f1], /* CJK Ideograph */
- [0x57f2, 0x57f2], /* CJK Ideograph */
- [0x57f3, 0x57f3], /* CJK Ideograph */
- [0x57f4, 0x57f4], /* CJK Ideograph */
- [0x57f5, 0x57f5], /* CJK Ideograph */
- [0x57f6, 0x57f6], /* CJK Ideograph */
- [0x57f7, 0x57f7], /* CJK Ideograph */
- [0x57f8, 0x57f8], /* CJK Ideograph */
- [0x57f9, 0x57f9], /* CJK Ideograph */
- [0x57fa, 0x57fa], /* CJK Ideograph */
- [0x57fb, 0x57fb], /* CJK Ideograph */
- [0x57fc, 0x57fc], /* CJK Ideograph */
- [0x57fd, 0x57fd], /* CJK Ideograph */
- [0x57fe, 0x57fe], /* CJK Ideograph */
- [0x57ff, 0x57ff], /* CJK Ideograph */
- [0x5800, 0x5800], /* CJK Ideograph */
- [0x5801, 0x5801], /* CJK Ideograph */
- [0x5802, 0x5802], /* CJK Ideograph */
- [0x5803, 0x5803], /* CJK Ideograph */
- [0x5804, 0x5804], /* CJK Ideograph */
- [0x5805, 0x5805], /* CJK Ideograph */
- [0x5806, 0x5806], /* CJK Ideograph */
- [0x5807, 0x5807], /* CJK Ideograph */
- [0x5808, 0x5808], /* CJK Ideograph */
- [0x5809, 0x5809], /* CJK Ideograph */
- [0x580a, 0x580a], /* CJK Ideograph */
- [0x580b, 0x580b], /* CJK Ideograph */
- [0x580c, 0x580c], /* CJK Ideograph */
- [0x580d, 0x580d], /* CJK Ideograph */
- [0x580e, 0x580e], /* CJK Ideograph */
- [0x580f, 0x580f], /* CJK Ideograph */
- [0x5810, 0x5810], /* CJK Ideograph */
- [0x5811, 0x5811], /* CJK Ideograph */
- [0x5812, 0x5812], /* CJK Ideograph */
- [0x5813, 0x5813], /* CJK Ideograph */
- [0x5814, 0x5814], /* CJK Ideograph */
- [0x5815, 0x5815], /* CJK Ideograph */
- [0x5816, 0x5816], /* CJK Ideograph */
- [0x5817, 0x5817], /* CJK Ideograph */
- [0x5818, 0x5818], /* CJK Ideograph */
- [0x5819, 0x5819], /* CJK Ideograph */
- [0x581a, 0x581a], /* CJK Ideograph */
- [0x581b, 0x581b], /* CJK Ideograph */
- [0x581c, 0x581c], /* CJK Ideograph */
- [0x581d, 0x581d], /* CJK Ideograph */
- [0x581e, 0x581e], /* CJK Ideograph */
- [0x581f, 0x581f], /* CJK Ideograph */
- [0x5820, 0x5820], /* CJK Ideograph */
- [0x5821, 0x5821], /* CJK Ideograph */
- [0x5822, 0x5822], /* CJK Ideograph */
- [0x5823, 0x5823], /* CJK Ideograph */
- [0x5824, 0x5824], /* CJK Ideograph */
- [0x5825, 0x5825], /* CJK Ideograph */
- [0x5826, 0x5826], /* CJK Ideograph */
- [0x5827, 0x5827], /* CJK Ideograph */
- [0x5828, 0x5828], /* CJK Ideograph */
- [0x5829, 0x5829], /* CJK Ideograph */
- [0x582a, 0x582a], /* CJK Ideograph */
- [0x582b, 0x582b], /* CJK Ideograph */
- [0x582c, 0x582c], /* CJK Ideograph */
- [0x582d, 0x582d], /* CJK Ideograph */
- [0x582e, 0x582e], /* CJK Ideograph */
- [0x582f, 0x582f], /* CJK Ideograph */
- [0x5830, 0x5830], /* CJK Ideograph */
- [0x5831, 0x5831], /* CJK Ideograph */
- [0x5832, 0x5832], /* CJK Ideograph */
- [0x5833, 0x5833], /* CJK Ideograph */
- [0x5834, 0x5834], /* CJK Ideograph */
- [0x5835, 0x5835], /* CJK Ideograph */
- [0x5836, 0x5836], /* CJK Ideograph */
- [0x5837, 0x5837], /* CJK Ideograph */
- [0x5838, 0x5838], /* CJK Ideograph */
- [0x5839, 0x5839], /* CJK Ideograph */
- [0x583a, 0x583a], /* CJK Ideograph */
- [0x583b, 0x583b], /* CJK Ideograph */
- [0x583c, 0x583c], /* CJK Ideograph */
- [0x583d, 0x583d], /* CJK Ideograph */
- [0x583e, 0x583e], /* CJK Ideograph */
- [0x583f, 0x583f], /* CJK Ideograph */
- [0x5840, 0x5840], /* CJK Ideograph */
- [0x5841, 0x5841], /* CJK Ideograph */
- [0x5842, 0x5842], /* CJK Ideograph */
- [0x5843, 0x5843], /* CJK Ideograph */
- [0x5844, 0x5844], /* CJK Ideograph */
- [0x5845, 0x5845], /* CJK Ideograph */
- [0x5846, 0x5846], /* CJK Ideograph */
- [0x5847, 0x5847], /* CJK Ideograph */
- [0x5848, 0x5848], /* CJK Ideograph */
- [0x5849, 0x5849], /* CJK Ideograph */
- [0x584a, 0x584a], /* CJK Ideograph */
- [0x584b, 0x584b], /* CJK Ideograph */
- [0x584c, 0x584c], /* CJK Ideograph */
- [0x584d, 0x584d], /* CJK Ideograph */
- [0x584e, 0x584e], /* CJK Ideograph */
- [0x584f, 0x584f], /* CJK Ideograph */
- [0x5850, 0x5850], /* CJK Ideograph */
- [0x5851, 0x5851], /* CJK Ideograph */
- [0x5852, 0x5852], /* CJK Ideograph */
- [0x5853, 0x5853], /* CJK Ideograph */
- [0x5854, 0x5854], /* CJK Ideograph */
- [0x5855, 0x5855], /* CJK Ideograph */
- [0x5856, 0x5856], /* CJK Ideograph */
- [0x5857, 0x5857], /* CJK Ideograph */
- [0x5858, 0x5858], /* CJK Ideograph */
- [0x5859, 0x5859], /* CJK Ideograph */
- [0x585a, 0x585a], /* CJK Ideograph */
- [0x585b, 0x585b], /* CJK Ideograph */
- [0x585c, 0x585c], /* CJK Ideograph */
- [0x585d, 0x585d], /* CJK Ideograph */
- [0x585e, 0x585e], /* CJK Ideograph */
- [0x585f, 0x585f], /* CJK Ideograph */
- [0x5860, 0x5860], /* CJK Ideograph */
- [0x5861, 0x5861], /* CJK Ideograph */
- [0x5862, 0x5862], /* CJK Ideograph */
- [0x5863, 0x5863], /* CJK Ideograph */
- [0x5864, 0x5864], /* CJK Ideograph */
- [0x5865, 0x5865], /* CJK Ideograph */
- [0x5866, 0x5866], /* CJK Ideograph */
- [0x5867, 0x5867], /* CJK Ideograph */
- [0x5868, 0x5868], /* CJK Ideograph */
- [0x5869, 0x5869], /* CJK Ideograph */
- [0x586a, 0x586a], /* CJK Ideograph */
- [0x586b, 0x586b], /* CJK Ideograph */
- [0x586c, 0x586c], /* CJK Ideograph */
- [0x586d, 0x586d], /* CJK Ideograph */
- [0x586e, 0x586e], /* CJK Ideograph */
- [0x586f, 0x586f], /* CJK Ideograph */
- [0x5870, 0x5870], /* CJK Ideograph */
- [0x5871, 0x5871], /* CJK Ideograph */
- [0x5872, 0x5872], /* CJK Ideograph */
- [0x5873, 0x5873], /* CJK Ideograph */
- [0x5874, 0x5874], /* CJK Ideograph */
- [0x5875, 0x5875], /* CJK Ideograph */
- [0x5876, 0x5876], /* CJK Ideograph */
- [0x5877, 0x5877], /* CJK Ideograph */
- [0x5878, 0x5878], /* CJK Ideograph */
- [0x5879, 0x5879], /* CJK Ideograph */
- [0x587a, 0x587a], /* CJK Ideograph */
- [0x587b, 0x587b], /* CJK Ideograph */
- [0x587c, 0x587c], /* CJK Ideograph */
- [0x587d, 0x587d], /* CJK Ideograph */
- [0x587e, 0x587e], /* CJK Ideograph */
- [0x587f, 0x587f], /* CJK Ideograph */
- [0x5880, 0x5880], /* CJK Ideograph */
- [0x5881, 0x5881], /* CJK Ideograph */
- [0x5882, 0x5882], /* CJK Ideograph */
- [0x5883, 0x5883], /* CJK Ideograph */
- [0x5884, 0x5884], /* CJK Ideograph */
- [0x5885, 0x5885], /* CJK Ideograph */
- [0x5886, 0x5886], /* CJK Ideograph */
- [0x5887, 0x5887], /* CJK Ideograph */
- [0x5888, 0x5888], /* CJK Ideograph */
- [0x5889, 0x5889], /* CJK Ideograph */
- [0x588a, 0x588a], /* CJK Ideograph */
- [0x588b, 0x588b], /* CJK Ideograph */
- [0x588c, 0x588c], /* CJK Ideograph */
- [0x588d, 0x588d], /* CJK Ideograph */
- [0x588e, 0x588e], /* CJK Ideograph */
- [0x588f, 0x588f], /* CJK Ideograph */
- [0x5890, 0x5890], /* CJK Ideograph */
- [0x5891, 0x5891], /* CJK Ideograph */
- [0x5892, 0x5892], /* CJK Ideograph */
- [0x5893, 0x5893], /* CJK Ideograph */
- [0x5894, 0x5894], /* CJK Ideograph */
- [0x5895, 0x5895], /* CJK Ideograph */
- [0x5896, 0x5896], /* CJK Ideograph */
- [0x5897, 0x5897], /* CJK Ideograph */
- [0x5898, 0x5898], /* CJK Ideograph */
- [0x5899, 0x5899], /* CJK Ideograph */
- [0x589a, 0x589a], /* CJK Ideograph */
- [0x589b, 0x589b], /* CJK Ideograph */
- [0x589c, 0x589c], /* CJK Ideograph */
- [0x589d, 0x589d], /* CJK Ideograph */
- [0x589e, 0x589e], /* CJK Ideograph */
- [0x589f, 0x589f], /* CJK Ideograph */
- [0x58a0, 0x58a0], /* CJK Ideograph */
- [0x58a1, 0x58a1], /* CJK Ideograph */
- [0x58a2, 0x58a2], /* CJK Ideograph */
- [0x58a3, 0x58a3], /* CJK Ideograph */
- [0x58a4, 0x58a4], /* CJK Ideograph */
- [0x58a5, 0x58a5], /* CJK Ideograph */
- [0x58a6, 0x58a6], /* CJK Ideograph */
- [0x58a7, 0x58a7], /* CJK Ideograph */
- [0x58a8, 0x58a8], /* CJK Ideograph */
- [0x58a9, 0x58a9], /* CJK Ideograph */
- [0x58aa, 0x58aa], /* CJK Ideograph */
- [0x58ab, 0x58ab], /* CJK Ideograph */
- [0x58ac, 0x58ac], /* CJK Ideograph */
- [0x58ad, 0x58ad], /* CJK Ideograph */
- [0x58ae, 0x58ae], /* CJK Ideograph */
- [0x58af, 0x58af], /* CJK Ideograph */
- [0x58b0, 0x58b0], /* CJK Ideograph */
- [0x58b1, 0x58b1], /* CJK Ideograph */
- [0x58b2, 0x58b2], /* CJK Ideograph */
- [0x58b3, 0x58b3], /* CJK Ideograph */
- [0x58b4, 0x58b4], /* CJK Ideograph */
- [0x58b5, 0x58b5], /* CJK Ideograph */
- [0x58b6, 0x58b6], /* CJK Ideograph */
- [0x58b7, 0x58b7], /* CJK Ideograph */
- [0x58b8, 0x58b8], /* CJK Ideograph */
- [0x58b9, 0x58b9], /* CJK Ideograph */
- [0x58ba, 0x58ba], /* CJK Ideograph */
- [0x58bb, 0x58bb], /* CJK Ideograph */
- [0x58bc, 0x58bc], /* CJK Ideograph */
- [0x58bd, 0x58bd], /* CJK Ideograph */
- [0x58be, 0x58be], /* CJK Ideograph */
- [0x58bf, 0x58bf], /* CJK Ideograph */
- [0x58c0, 0x58c0], /* CJK Ideograph */
- [0x58c1, 0x58c1], /* CJK Ideograph */
- [0x58c2, 0x58c2], /* CJK Ideograph */
- [0x58c3, 0x58c3], /* CJK Ideograph */
- [0x58c4, 0x58c4], /* CJK Ideograph */
- [0x58c5, 0x58c5], /* CJK Ideograph */
- [0x58c6, 0x58c6], /* CJK Ideograph */
- [0x58c7, 0x58c7], /* CJK Ideograph */
- [0x58c8, 0x58c8], /* CJK Ideograph */
- [0x58c9, 0x58c9], /* CJK Ideograph */
- [0x58ca, 0x58ca], /* CJK Ideograph */
- [0x58cb, 0x58cb], /* CJK Ideograph */
- [0x58cc, 0x58cc], /* CJK Ideograph */
- [0x58cd, 0x58cd], /* CJK Ideograph */
- [0x58ce, 0x58ce], /* CJK Ideograph */
- [0x58cf, 0x58cf], /* CJK Ideograph */
- [0x58d0, 0x58d0], /* CJK Ideograph */
- [0x58d1, 0x58d1], /* CJK Ideograph */
- [0x58d2, 0x58d2], /* CJK Ideograph */
- [0x58d3, 0x58d3], /* CJK Ideograph */
- [0x58d4, 0x58d4], /* CJK Ideograph */
- [0x58d5, 0x58d5], /* CJK Ideograph */
- [0x58d6, 0x58d6], /* CJK Ideograph */
- [0x58d7, 0x58d7], /* CJK Ideograph */
- [0x58d8, 0x58d8], /* CJK Ideograph */
- [0x58d9, 0x58d9], /* CJK Ideograph */
- [0x58da, 0x58da], /* CJK Ideograph */
- [0x58db, 0x58db], /* CJK Ideograph */
- [0x58dc, 0x58dc], /* CJK Ideograph */
- [0x58dd, 0x58dd], /* CJK Ideograph */
- [0x58de, 0x58de], /* CJK Ideograph */
- [0x58df, 0x58df], /* CJK Ideograph */
- [0x58e0, 0x58e0], /* CJK Ideograph */
- [0x58e1, 0x58e1], /* CJK Ideograph */
- [0x58e2, 0x58e2], /* CJK Ideograph */
- [0x58e3, 0x58e3], /* CJK Ideograph */
- [0x58e4, 0x58e4], /* CJK Ideograph */
- [0x58e5, 0x58e5], /* CJK Ideograph */
- [0x58e6, 0x58e6], /* CJK Ideograph */
- [0x58e7, 0x58e7], /* CJK Ideograph */
- [0x58e8, 0x58e8], /* CJK Ideograph */
- [0x58e9, 0x58e9], /* CJK Ideograph */
- [0x58ea, 0x58ea], /* CJK Ideograph */
- [0x58eb, 0x58eb], /* CJK Ideograph */
- [0x58ec, 0x58ec], /* CJK Ideograph */
- [0x58ed, 0x58ed], /* CJK Ideograph */
- [0x58ee, 0x58ee], /* CJK Ideograph */
- [0x58ef, 0x58ef], /* CJK Ideograph */
- [0x58f0, 0x58f0], /* CJK Ideograph */
- [0x58f1, 0x58f1], /* CJK Ideograph */
- [0x58f2, 0x58f2], /* CJK Ideograph */
- [0x58f3, 0x58f3], /* CJK Ideograph */
- [0x58f4, 0x58f4], /* CJK Ideograph */
- [0x58f5, 0x58f5], /* CJK Ideograph */
- [0x58f6, 0x58f6], /* CJK Ideograph */
- [0x58f7, 0x58f7], /* CJK Ideograph */
- [0x58f8, 0x58f8], /* CJK Ideograph */
- [0x58f9, 0x58f9], /* CJK Ideograph */
- [0x58fa, 0x58fa], /* CJK Ideograph */
- [0x58fb, 0x58fb], /* CJK Ideograph */
- [0x58fc, 0x58fc], /* CJK Ideograph */
- [0x58fd, 0x58fd], /* CJK Ideograph */
- [0x58fe, 0x58fe], /* CJK Ideograph */
- [0x58ff, 0x58ff], /* CJK Ideograph */
- [0x5900, 0x5900], /* CJK Ideograph */
- [0x5901, 0x5901], /* CJK Ideograph */
- [0x5902, 0x5902], /* CJK Ideograph */
- [0x5903, 0x5903], /* CJK Ideograph */
- [0x5904, 0x5904], /* CJK Ideograph */
- [0x5905, 0x5905], /* CJK Ideograph */
- [0x5906, 0x5906], /* CJK Ideograph */
- [0x5907, 0x5907], /* CJK Ideograph */
- [0x5908, 0x5908], /* CJK Ideograph */
- [0x5909, 0x5909], /* CJK Ideograph */
- [0x590a, 0x590a], /* CJK Ideograph */
- [0x590b, 0x590b], /* CJK Ideograph */
- [0x590c, 0x590c], /* CJK Ideograph */
- [0x590d, 0x590d], /* CJK Ideograph */
- [0x590e, 0x590e], /* CJK Ideograph */
- [0x590f, 0x590f], /* CJK Ideograph */
- [0x5910, 0x5910], /* CJK Ideograph */
- [0x5911, 0x5911], /* CJK Ideograph */
- [0x5912, 0x5912], /* CJK Ideograph */
- [0x5913, 0x5913], /* CJK Ideograph */
- [0x5914, 0x5914], /* CJK Ideograph */
- [0x5915, 0x5915], /* CJK Ideograph */
- [0x5916, 0x5916], /* CJK Ideograph */
- [0x5917, 0x5917], /* CJK Ideograph */
- [0x5918, 0x5918], /* CJK Ideograph */
- [0x5919, 0x5919], /* CJK Ideograph */
- [0x591a, 0x591a], /* CJK Ideograph */
- [0x591b, 0x591b], /* CJK Ideograph */
- [0x591c, 0x591c], /* CJK Ideograph */
- [0x591d, 0x591d], /* CJK Ideograph */
- [0x591e, 0x591e], /* CJK Ideograph */
- [0x591f, 0x591f], /* CJK Ideograph */
- [0x5920, 0x5920], /* CJK Ideograph */
- [0x5921, 0x5921], /* CJK Ideograph */
- [0x5922, 0x5922], /* CJK Ideograph */
- [0x5923, 0x5923], /* CJK Ideograph */
- [0x5924, 0x5924], /* CJK Ideograph */
- [0x5925, 0x5925], /* CJK Ideograph */
- [0x5926, 0x5926], /* CJK Ideograph */
- [0x5927, 0x5927], /* CJK Ideograph */
- [0x5928, 0x5928], /* CJK Ideograph */
- [0x5929, 0x5929], /* CJK Ideograph */
- [0x592a, 0x592a], /* CJK Ideograph */
- [0x592b, 0x592b], /* CJK Ideograph */
- [0x592c, 0x592c], /* CJK Ideograph */
- [0x592d, 0x592d], /* CJK Ideograph */
- [0x592e, 0x592e], /* CJK Ideograph */
- [0x592f, 0x592f], /* CJK Ideograph */
- [0x5930, 0x5930], /* CJK Ideograph */
- [0x5931, 0x5931], /* CJK Ideograph */
- [0x5932, 0x5932], /* CJK Ideograph */
- [0x5933, 0x5933], /* CJK Ideograph */
- [0x5934, 0x5934], /* CJK Ideograph */
- [0x5935, 0x5935], /* CJK Ideograph */
- [0x5936, 0x5936], /* CJK Ideograph */
- [0x5937, 0x5937], /* CJK Ideograph */
- [0x5938, 0x5938], /* CJK Ideograph */
- [0x5939, 0x5939], /* CJK Ideograph */
- [0x593a, 0x593a], /* CJK Ideograph */
- [0x593b, 0x593b], /* CJK Ideograph */
- [0x593c, 0x593c], /* CJK Ideograph */
- [0x593d, 0x593d], /* CJK Ideograph */
- [0x593e, 0x593e], /* CJK Ideograph */
- [0x593f, 0x593f], /* CJK Ideograph */
- [0x5940, 0x5940], /* CJK Ideograph */
- [0x5941, 0x5941], /* CJK Ideograph */
- [0x5942, 0x5942], /* CJK Ideograph */
- [0x5943, 0x5943], /* CJK Ideograph */
- [0x5944, 0x5944], /* CJK Ideograph */
- [0x5945, 0x5945], /* CJK Ideograph */
- [0x5946, 0x5946], /* CJK Ideograph */
- [0x5947, 0x5947], /* CJK Ideograph */
- [0x5948, 0x5948], /* CJK Ideograph */
- [0x5949, 0x5949], /* CJK Ideograph */
- [0x594a, 0x594a], /* CJK Ideograph */
- [0x594b, 0x594b], /* CJK Ideograph */
- [0x594c, 0x594c], /* CJK Ideograph */
- [0x594d, 0x594d], /* CJK Ideograph */
- [0x594e, 0x594e], /* CJK Ideograph */
- [0x594f, 0x594f], /* CJK Ideograph */
- [0x5950, 0x5950], /* CJK Ideograph */
- [0x5951, 0x5951], /* CJK Ideograph */
- [0x5952, 0x5952], /* CJK Ideograph */
- [0x5953, 0x5953], /* CJK Ideograph */
- [0x5954, 0x5954], /* CJK Ideograph */
- [0x5955, 0x5955], /* CJK Ideograph */
- [0x5956, 0x5956], /* CJK Ideograph */
- [0x5957, 0x5957], /* CJK Ideograph */
- [0x5958, 0x5958], /* CJK Ideograph */
- [0x5959, 0x5959], /* CJK Ideograph */
- [0x595a, 0x595a], /* CJK Ideograph */
- [0x595b, 0x595b], /* CJK Ideograph */
- [0x595c, 0x595c], /* CJK Ideograph */
- [0x595d, 0x595d], /* CJK Ideograph */
- [0x595e, 0x595e], /* CJK Ideograph */
- [0x595f, 0x595f], /* CJK Ideograph */
- [0x5960, 0x5960], /* CJK Ideograph */
- [0x5961, 0x5961], /* CJK Ideograph */
- [0x5962, 0x5962], /* CJK Ideograph */
- [0x5963, 0x5963], /* CJK Ideograph */
- [0x5964, 0x5964], /* CJK Ideograph */
- [0x5965, 0x5965], /* CJK Ideograph */
- [0x5966, 0x5966], /* CJK Ideograph */
- [0x5967, 0x5967], /* CJK Ideograph */
- [0x5968, 0x5968], /* CJK Ideograph */
- [0x5969, 0x5969], /* CJK Ideograph */
- [0x596a, 0x596a], /* CJK Ideograph */
- [0x596b, 0x596b], /* CJK Ideograph */
- [0x596c, 0x596c], /* CJK Ideograph */
- [0x596d, 0x596d], /* CJK Ideograph */
- [0x596e, 0x596e], /* CJK Ideograph */
- [0x596f, 0x596f], /* CJK Ideograph */
- [0x5970, 0x5970], /* CJK Ideograph */
- [0x5971, 0x5971], /* CJK Ideograph */
- [0x5972, 0x5972], /* CJK Ideograph */
- [0x5973, 0x5973], /* CJK Ideograph */
- [0x5974, 0x5974], /* CJK Ideograph */
- [0x5975, 0x5975], /* CJK Ideograph */
- [0x5976, 0x5976], /* CJK Ideograph */
- [0x5977, 0x5977], /* CJK Ideograph */
- [0x5978, 0x5978], /* CJK Ideograph */
- [0x5979, 0x5979], /* CJK Ideograph */
- [0x597a, 0x597a], /* CJK Ideograph */
- [0x597b, 0x597b], /* CJK Ideograph */
- [0x597c, 0x597c], /* CJK Ideograph */
- [0x597d, 0x597d], /* CJK Ideograph */
- [0x597e, 0x597e], /* CJK Ideograph */
- [0x597f, 0x597f], /* CJK Ideograph */
- [0x5980, 0x5980], /* CJK Ideograph */
- [0x5981, 0x5981], /* CJK Ideograph */
- [0x5982, 0x5982], /* CJK Ideograph */
- [0x5983, 0x5983], /* CJK Ideograph */
- [0x5984, 0x5984], /* CJK Ideograph */
- [0x5985, 0x5985], /* CJK Ideograph */
- [0x5986, 0x5986], /* CJK Ideograph */
- [0x5987, 0x5987], /* CJK Ideograph */
- [0x5988, 0x5988], /* CJK Ideograph */
- [0x5989, 0x5989], /* CJK Ideograph */
- [0x598a, 0x598a], /* CJK Ideograph */
- [0x598b, 0x598b], /* CJK Ideograph */
- [0x598c, 0x598c], /* CJK Ideograph */
- [0x598d, 0x598d], /* CJK Ideograph */
- [0x598e, 0x598e], /* CJK Ideograph */
- [0x598f, 0x598f], /* CJK Ideograph */
- [0x5990, 0x5990], /* CJK Ideograph */
- [0x5991, 0x5991], /* CJK Ideograph */
- [0x5992, 0x5992], /* CJK Ideograph */
- [0x5993, 0x5993], /* CJK Ideograph */
- [0x5994, 0x5994], /* CJK Ideograph */
- [0x5995, 0x5995], /* CJK Ideograph */
- [0x5996, 0x5996], /* CJK Ideograph */
- [0x5997, 0x5997], /* CJK Ideograph */
- [0x5998, 0x5998], /* CJK Ideograph */
- [0x5999, 0x5999], /* CJK Ideograph */
- [0x599a, 0x599a], /* CJK Ideograph */
- [0x599b, 0x599b], /* CJK Ideograph */
- [0x599c, 0x599c], /* CJK Ideograph */
- [0x599d, 0x599d], /* CJK Ideograph */
- [0x599e, 0x599e], /* CJK Ideograph */
- [0x599f, 0x599f], /* CJK Ideograph */
- [0x59a0, 0x59a0], /* CJK Ideograph */
- [0x59a1, 0x59a1], /* CJK Ideograph */
- [0x59a2, 0x59a2], /* CJK Ideograph */
- [0x59a3, 0x59a3], /* CJK Ideograph */
- [0x59a4, 0x59a4], /* CJK Ideograph */
- [0x59a5, 0x59a5], /* CJK Ideograph */
- [0x59a6, 0x59a6], /* CJK Ideograph */
- [0x59a7, 0x59a7], /* CJK Ideograph */
- [0x59a8, 0x59a8], /* CJK Ideograph */
- [0x59a9, 0x59a9], /* CJK Ideograph */
- [0x59aa, 0x59aa], /* CJK Ideograph */
- [0x59ab, 0x59ab], /* CJK Ideograph */
- [0x59ac, 0x59ac], /* CJK Ideograph */
- [0x59ad, 0x59ad], /* CJK Ideograph */
- [0x59ae, 0x59ae], /* CJK Ideograph */
- [0x59af, 0x59af], /* CJK Ideograph */
- [0x59b0, 0x59b0], /* CJK Ideograph */
- [0x59b1, 0x59b1], /* CJK Ideograph */
- [0x59b2, 0x59b2], /* CJK Ideograph */
- [0x59b3, 0x59b3], /* CJK Ideograph */
- [0x59b4, 0x59b4], /* CJK Ideograph */
- [0x59b5, 0x59b5], /* CJK Ideograph */
- [0x59b6, 0x59b6], /* CJK Ideograph */
- [0x59b7, 0x59b7], /* CJK Ideograph */
- [0x59b8, 0x59b8], /* CJK Ideograph */
- [0x59b9, 0x59b9], /* CJK Ideograph */
- [0x59ba, 0x59ba], /* CJK Ideograph */
- [0x59bb, 0x59bb], /* CJK Ideograph */
- [0x59bc, 0x59bc], /* CJK Ideograph */
- [0x59bd, 0x59bd], /* CJK Ideograph */
- [0x59be, 0x59be], /* CJK Ideograph */
- [0x59bf, 0x59bf], /* CJK Ideograph */
- [0x59c0, 0x59c0], /* CJK Ideograph */
- [0x59c1, 0x59c1], /* CJK Ideograph */
- [0x59c2, 0x59c2], /* CJK Ideograph */
- [0x59c3, 0x59c3], /* CJK Ideograph */
- [0x59c4, 0x59c4], /* CJK Ideograph */
- [0x59c5, 0x59c5], /* CJK Ideograph */
- [0x59c6, 0x59c6], /* CJK Ideograph */
- [0x59c7, 0x59c7], /* CJK Ideograph */
- [0x59c8, 0x59c8], /* CJK Ideograph */
- [0x59c9, 0x59c9], /* CJK Ideograph */
- [0x59ca, 0x59ca], /* CJK Ideograph */
- [0x59cb, 0x59cb], /* CJK Ideograph */
- [0x59cc, 0x59cc], /* CJK Ideograph */
- [0x59cd, 0x59cd], /* CJK Ideograph */
- [0x59ce, 0x59ce], /* CJK Ideograph */
- [0x59cf, 0x59cf], /* CJK Ideograph */
- [0x59d0, 0x59d0], /* CJK Ideograph */
- [0x59d1, 0x59d1], /* CJK Ideograph */
- [0x59d2, 0x59d2], /* CJK Ideograph */
- [0x59d3, 0x59d3], /* CJK Ideograph */
- [0x59d4, 0x59d4], /* CJK Ideograph */
- [0x59d5, 0x59d5], /* CJK Ideograph */
- [0x59d6, 0x59d6], /* CJK Ideograph */
- [0x59d7, 0x59d7], /* CJK Ideograph */
- [0x59d8, 0x59d8], /* CJK Ideograph */
- [0x59d9, 0x59d9], /* CJK Ideograph */
- [0x59da, 0x59da], /* CJK Ideograph */
- [0x59db, 0x59db], /* CJK Ideograph */
- [0x59dc, 0x59dc], /* CJK Ideograph */
- [0x59dd, 0x59dd], /* CJK Ideograph */
- [0x59de, 0x59de], /* CJK Ideograph */
- [0x59df, 0x59df], /* CJK Ideograph */
- [0x59e0, 0x59e0], /* CJK Ideograph */
- [0x59e1, 0x59e1], /* CJK Ideograph */
- [0x59e2, 0x59e2], /* CJK Ideograph */
- [0x59e3, 0x59e3], /* CJK Ideograph */
- [0x59e4, 0x59e4], /* CJK Ideograph */
- [0x59e5, 0x59e5], /* CJK Ideograph */
- [0x59e6, 0x59e6], /* CJK Ideograph */
- [0x59e7, 0x59e7], /* CJK Ideograph */
- [0x59e8, 0x59e8], /* CJK Ideograph */
- [0x59e9, 0x59e9], /* CJK Ideograph */
- [0x59ea, 0x59ea], /* CJK Ideograph */
- [0x59eb, 0x59eb], /* CJK Ideograph */
- [0x59ec, 0x59ec], /* CJK Ideograph */
- [0x59ed, 0x59ed], /* CJK Ideograph */
- [0x59ee, 0x59ee], /* CJK Ideograph */
- [0x59ef, 0x59ef], /* CJK Ideograph */
- [0x59f0, 0x59f0], /* CJK Ideograph */
- [0x59f1, 0x59f1], /* CJK Ideograph */
- [0x59f2, 0x59f2], /* CJK Ideograph */
- [0x59f3, 0x59f3], /* CJK Ideograph */
- [0x59f4, 0x59f4], /* CJK Ideograph */
- [0x59f5, 0x59f5], /* CJK Ideograph */
- [0x59f6, 0x59f6], /* CJK Ideograph */
- [0x59f7, 0x59f7], /* CJK Ideograph */
- [0x59f8, 0x59f8], /* CJK Ideograph */
- [0x59f9, 0x59f9], /* CJK Ideograph */
- [0x59fa, 0x59fa], /* CJK Ideograph */
- [0x59fb, 0x59fb], /* CJK Ideograph */
- [0x59fc, 0x59fc], /* CJK Ideograph */
- [0x59fd, 0x59fd], /* CJK Ideograph */
- [0x59fe, 0x59fe], /* CJK Ideograph */
- [0x59ff, 0x59ff], /* CJK Ideograph */
- [0x5a00, 0x5a00], /* CJK Ideograph */
- [0x5a01, 0x5a01], /* CJK Ideograph */
- [0x5a02, 0x5a02], /* CJK Ideograph */
- [0x5a03, 0x5a03], /* CJK Ideograph */
- [0x5a04, 0x5a04], /* CJK Ideograph */
- [0x5a05, 0x5a05], /* CJK Ideograph */
- [0x5a06, 0x5a06], /* CJK Ideograph */
- [0x5a07, 0x5a07], /* CJK Ideograph */
- [0x5a08, 0x5a08], /* CJK Ideograph */
- [0x5a09, 0x5a09], /* CJK Ideograph */
- [0x5a0a, 0x5a0a], /* CJK Ideograph */
- [0x5a0b, 0x5a0b], /* CJK Ideograph */
- [0x5a0c, 0x5a0c], /* CJK Ideograph */
- [0x5a0d, 0x5a0d], /* CJK Ideograph */
- [0x5a0e, 0x5a0e], /* CJK Ideograph */
- [0x5a0f, 0x5a0f], /* CJK Ideograph */
- [0x5a10, 0x5a10], /* CJK Ideograph */
- [0x5a11, 0x5a11], /* CJK Ideograph */
- [0x5a12, 0x5a12], /* CJK Ideograph */
- [0x5a13, 0x5a13], /* CJK Ideograph */
- [0x5a14, 0x5a14], /* CJK Ideograph */
- [0x5a15, 0x5a15], /* CJK Ideograph */
- [0x5a16, 0x5a16], /* CJK Ideograph */
- [0x5a17, 0x5a17], /* CJK Ideograph */
- [0x5a18, 0x5a18], /* CJK Ideograph */
- [0x5a19, 0x5a19], /* CJK Ideograph */
- [0x5a1a, 0x5a1a], /* CJK Ideograph */
- [0x5a1b, 0x5a1b], /* CJK Ideograph */
- [0x5a1c, 0x5a1c], /* CJK Ideograph */
- [0x5a1d, 0x5a1d], /* CJK Ideograph */
- [0x5a1e, 0x5a1e], /* CJK Ideograph */
- [0x5a1f, 0x5a1f], /* CJK Ideograph */
- [0x5a20, 0x5a20], /* CJK Ideograph */
- [0x5a21, 0x5a21], /* CJK Ideograph */
- [0x5a22, 0x5a22], /* CJK Ideograph */
- [0x5a23, 0x5a23], /* CJK Ideograph */
- [0x5a24, 0x5a24], /* CJK Ideograph */
- [0x5a25, 0x5a25], /* CJK Ideograph */
- [0x5a26, 0x5a26], /* CJK Ideograph */
- [0x5a27, 0x5a27], /* CJK Ideograph */
- [0x5a28, 0x5a28], /* CJK Ideograph */
- [0x5a29, 0x5a29], /* CJK Ideograph */
- [0x5a2a, 0x5a2a], /* CJK Ideograph */
- [0x5a2b, 0x5a2b], /* CJK Ideograph */
- [0x5a2c, 0x5a2c], /* CJK Ideograph */
- [0x5a2d, 0x5a2d], /* CJK Ideograph */
- [0x5a2e, 0x5a2e], /* CJK Ideograph */
- [0x5a2f, 0x5a2f], /* CJK Ideograph */
- [0x5a30, 0x5a30], /* CJK Ideograph */
- [0x5a31, 0x5a31], /* CJK Ideograph */
- [0x5a32, 0x5a32], /* CJK Ideograph */
- [0x5a33, 0x5a33], /* CJK Ideograph */
- [0x5a34, 0x5a34], /* CJK Ideograph */
- [0x5a35, 0x5a35], /* CJK Ideograph */
- [0x5a36, 0x5a36], /* CJK Ideograph */
- [0x5a37, 0x5a37], /* CJK Ideograph */
- [0x5a38, 0x5a38], /* CJK Ideograph */
- [0x5a39, 0x5a39], /* CJK Ideograph */
- [0x5a3a, 0x5a3a], /* CJK Ideograph */
- [0x5a3b, 0x5a3b], /* CJK Ideograph */
- [0x5a3c, 0x5a3c], /* CJK Ideograph */
- [0x5a3d, 0x5a3d], /* CJK Ideograph */
- [0x5a3e, 0x5a3e], /* CJK Ideograph */
- [0x5a3f, 0x5a3f], /* CJK Ideograph */
- [0x5a40, 0x5a40], /* CJK Ideograph */
- [0x5a41, 0x5a41], /* CJK Ideograph */
- [0x5a42, 0x5a42], /* CJK Ideograph */
- [0x5a43, 0x5a43], /* CJK Ideograph */
- [0x5a44, 0x5a44], /* CJK Ideograph */
- [0x5a45, 0x5a45], /* CJK Ideograph */
- [0x5a46, 0x5a46], /* CJK Ideograph */
- [0x5a47, 0x5a47], /* CJK Ideograph */
- [0x5a48, 0x5a48], /* CJK Ideograph */
- [0x5a49, 0x5a49], /* CJK Ideograph */
- [0x5a4a, 0x5a4a], /* CJK Ideograph */
- [0x5a4b, 0x5a4b], /* CJK Ideograph */
- [0x5a4c, 0x5a4c], /* CJK Ideograph */
- [0x5a4d, 0x5a4d], /* CJK Ideograph */
- [0x5a4e, 0x5a4e], /* CJK Ideograph */
- [0x5a4f, 0x5a4f], /* CJK Ideograph */
- [0x5a50, 0x5a50], /* CJK Ideograph */
- [0x5a51, 0x5a51], /* CJK Ideograph */
- [0x5a52, 0x5a52], /* CJK Ideograph */
- [0x5a53, 0x5a53], /* CJK Ideograph */
- [0x5a54, 0x5a54], /* CJK Ideograph */
- [0x5a55, 0x5a55], /* CJK Ideograph */
- [0x5a56, 0x5a56], /* CJK Ideograph */
- [0x5a57, 0x5a57], /* CJK Ideograph */
- [0x5a58, 0x5a58], /* CJK Ideograph */
- [0x5a59, 0x5a59], /* CJK Ideograph */
- [0x5a5a, 0x5a5a], /* CJK Ideograph */
- [0x5a5b, 0x5a5b], /* CJK Ideograph */
- [0x5a5c, 0x5a5c], /* CJK Ideograph */
- [0x5a5d, 0x5a5d], /* CJK Ideograph */
- [0x5a5e, 0x5a5e], /* CJK Ideograph */
- [0x5a5f, 0x5a5f], /* CJK Ideograph */
- [0x5a60, 0x5a60], /* CJK Ideograph */
- [0x5a61, 0x5a61], /* CJK Ideograph */
- [0x5a62, 0x5a62], /* CJK Ideograph */
- [0x5a63, 0x5a63], /* CJK Ideograph */
- [0x5a64, 0x5a64], /* CJK Ideograph */
- [0x5a65, 0x5a65], /* CJK Ideograph */
- [0x5a66, 0x5a66], /* CJK Ideograph */
- [0x5a67, 0x5a67], /* CJK Ideograph */
- [0x5a68, 0x5a68], /* CJK Ideograph */
- [0x5a69, 0x5a69], /* CJK Ideograph */
- [0x5a6a, 0x5a6a], /* CJK Ideograph */
- [0x5a6b, 0x5a6b], /* CJK Ideograph */
- [0x5a6c, 0x5a6c], /* CJK Ideograph */
- [0x5a6d, 0x5a6d], /* CJK Ideograph */
- [0x5a6e, 0x5a6e], /* CJK Ideograph */
- [0x5a6f, 0x5a6f], /* CJK Ideograph */
- [0x5a70, 0x5a70], /* CJK Ideograph */
- [0x5a71, 0x5a71], /* CJK Ideograph */
- [0x5a72, 0x5a72], /* CJK Ideograph */
- [0x5a73, 0x5a73], /* CJK Ideograph */
- [0x5a74, 0x5a74], /* CJK Ideograph */
- [0x5a75, 0x5a75], /* CJK Ideograph */
- [0x5a76, 0x5a76], /* CJK Ideograph */
- [0x5a77, 0x5a77], /* CJK Ideograph */
- [0x5a78, 0x5a78], /* CJK Ideograph */
- [0x5a79, 0x5a79], /* CJK Ideograph */
- [0x5a7a, 0x5a7a], /* CJK Ideograph */
- [0x5a7b, 0x5a7b], /* CJK Ideograph */
- [0x5a7c, 0x5a7c], /* CJK Ideograph */
- [0x5a7d, 0x5a7d], /* CJK Ideograph */
- [0x5a7e, 0x5a7e], /* CJK Ideograph */
- [0x5a7f, 0x5a7f], /* CJK Ideograph */
- [0x5a80, 0x5a80], /* CJK Ideograph */
- [0x5a81, 0x5a81], /* CJK Ideograph */
- [0x5a82, 0x5a82], /* CJK Ideograph */
- [0x5a83, 0x5a83], /* CJK Ideograph */
- [0x5a84, 0x5a84], /* CJK Ideograph */
- [0x5a85, 0x5a85], /* CJK Ideograph */
- [0x5a86, 0x5a86], /* CJK Ideograph */
- [0x5a87, 0x5a87], /* CJK Ideograph */
- [0x5a88, 0x5a88], /* CJK Ideograph */
- [0x5a89, 0x5a89], /* CJK Ideograph */
- [0x5a8a, 0x5a8a], /* CJK Ideograph */
- [0x5a8b, 0x5a8b], /* CJK Ideograph */
- [0x5a8c, 0x5a8c], /* CJK Ideograph */
- [0x5a8d, 0x5a8d], /* CJK Ideograph */
- [0x5a8e, 0x5a8e], /* CJK Ideograph */
- [0x5a8f, 0x5a8f], /* CJK Ideograph */
- [0x5a90, 0x5a90], /* CJK Ideograph */
- [0x5a91, 0x5a91], /* CJK Ideograph */
- [0x5a92, 0x5a92], /* CJK Ideograph */
- [0x5a93, 0x5a93], /* CJK Ideograph */
- [0x5a94, 0x5a94], /* CJK Ideograph */
- [0x5a95, 0x5a95], /* CJK Ideograph */
- [0x5a96, 0x5a96], /* CJK Ideograph */
- [0x5a97, 0x5a97], /* CJK Ideograph */
- [0x5a98, 0x5a98], /* CJK Ideograph */
- [0x5a99, 0x5a99], /* CJK Ideograph */
- [0x5a9a, 0x5a9a], /* CJK Ideograph */
- [0x5a9b, 0x5a9b], /* CJK Ideograph */
- [0x5a9c, 0x5a9c], /* CJK Ideograph */
- [0x5a9d, 0x5a9d], /* CJK Ideograph */
- [0x5a9e, 0x5a9e], /* CJK Ideograph */
- [0x5a9f, 0x5a9f], /* CJK Ideograph */
- [0x5aa0, 0x5aa0], /* CJK Ideograph */
- [0x5aa1, 0x5aa1], /* CJK Ideograph */
- [0x5aa2, 0x5aa2], /* CJK Ideograph */
- [0x5aa3, 0x5aa3], /* CJK Ideograph */
- [0x5aa4, 0x5aa4], /* CJK Ideograph */
- [0x5aa5, 0x5aa5], /* CJK Ideograph */
- [0x5aa6, 0x5aa6], /* CJK Ideograph */
- [0x5aa7, 0x5aa7], /* CJK Ideograph */
- [0x5aa8, 0x5aa8], /* CJK Ideograph */
- [0x5aa9, 0x5aa9], /* CJK Ideograph */
- [0x5aaa, 0x5aaa], /* CJK Ideograph */
- [0x5aab, 0x5aab], /* CJK Ideograph */
- [0x5aac, 0x5aac], /* CJK Ideograph */
- [0x5aad, 0x5aad], /* CJK Ideograph */
- [0x5aae, 0x5aae], /* CJK Ideograph */
- [0x5aaf, 0x5aaf], /* CJK Ideograph */
- [0x5ab0, 0x5ab0], /* CJK Ideograph */
- [0x5ab1, 0x5ab1], /* CJK Ideograph */
- [0x5ab2, 0x5ab2], /* CJK Ideograph */
- [0x5ab3, 0x5ab3], /* CJK Ideograph */
- [0x5ab4, 0x5ab4], /* CJK Ideograph */
- [0x5ab5, 0x5ab5], /* CJK Ideograph */
- [0x5ab6, 0x5ab6], /* CJK Ideograph */
- [0x5ab7, 0x5ab7], /* CJK Ideograph */
- [0x5ab8, 0x5ab8], /* CJK Ideograph */
- [0x5ab9, 0x5ab9], /* CJK Ideograph */
- [0x5aba, 0x5aba], /* CJK Ideograph */
- [0x5abb, 0x5abb], /* CJK Ideograph */
- [0x5abc, 0x5abc], /* CJK Ideograph */
- [0x5abd, 0x5abd], /* CJK Ideograph */
- [0x5abe, 0x5abe], /* CJK Ideograph */
- [0x5abf, 0x5abf], /* CJK Ideograph */
- [0x5ac0, 0x5ac0], /* CJK Ideograph */
- [0x5ac1, 0x5ac1], /* CJK Ideograph */
- [0x5ac2, 0x5ac2], /* CJK Ideograph */
- [0x5ac3, 0x5ac3], /* CJK Ideograph */
- [0x5ac4, 0x5ac4], /* CJK Ideograph */
- [0x5ac5, 0x5ac5], /* CJK Ideograph */
- [0x5ac6, 0x5ac6], /* CJK Ideograph */
- [0x5ac7, 0x5ac7], /* CJK Ideograph */
- [0x5ac8, 0x5ac8], /* CJK Ideograph */
- [0x5ac9, 0x5ac9], /* CJK Ideograph */
- [0x5aca, 0x5aca], /* CJK Ideograph */
- [0x5acb, 0x5acb], /* CJK Ideograph */
- [0x5acc, 0x5acc], /* CJK Ideograph */
- [0x5acd, 0x5acd], /* CJK Ideograph */
- [0x5ace, 0x5ace], /* CJK Ideograph */
- [0x5acf, 0x5acf], /* CJK Ideograph */
- [0x5ad0, 0x5ad0], /* CJK Ideograph */
- [0x5ad1, 0x5ad1], /* CJK Ideograph */
- [0x5ad2, 0x5ad2], /* CJK Ideograph */
- [0x5ad3, 0x5ad3], /* CJK Ideograph */
- [0x5ad4, 0x5ad4], /* CJK Ideograph */
- [0x5ad5, 0x5ad5], /* CJK Ideograph */
- [0x5ad6, 0x5ad6], /* CJK Ideograph */
- [0x5ad7, 0x5ad7], /* CJK Ideograph */
- [0x5ad8, 0x5ad8], /* CJK Ideograph */
- [0x5ad9, 0x5ad9], /* CJK Ideograph */
- [0x5ada, 0x5ada], /* CJK Ideograph */
- [0x5adb, 0x5adb], /* CJK Ideograph */
- [0x5adc, 0x5adc], /* CJK Ideograph */
- [0x5add, 0x5add], /* CJK Ideograph */
- [0x5ade, 0x5ade], /* CJK Ideograph */
- [0x5adf, 0x5adf], /* CJK Ideograph */
- [0x5ae0, 0x5ae0], /* CJK Ideograph */
- [0x5ae1, 0x5ae1], /* CJK Ideograph */
- [0x5ae2, 0x5ae2], /* CJK Ideograph */
- [0x5ae3, 0x5ae3], /* CJK Ideograph */
- [0x5ae4, 0x5ae4], /* CJK Ideograph */
- [0x5ae5, 0x5ae5], /* CJK Ideograph */
- [0x5ae6, 0x5ae6], /* CJK Ideograph */
- [0x5ae7, 0x5ae7], /* CJK Ideograph */
- [0x5ae8, 0x5ae8], /* CJK Ideograph */
- [0x5ae9, 0x5ae9], /* CJK Ideograph */
- [0x5aea, 0x5aea], /* CJK Ideograph */
- [0x5aeb, 0x5aeb], /* CJK Ideograph */
- [0x5aec, 0x5aec], /* CJK Ideograph */
- [0x5aed, 0x5aed], /* CJK Ideograph */
- [0x5aee, 0x5aee], /* CJK Ideograph */
- [0x5aef, 0x5aef], /* CJK Ideograph */
- [0x5af0, 0x5af0], /* CJK Ideograph */
- [0x5af1, 0x5af1], /* CJK Ideograph */
- [0x5af2, 0x5af2], /* CJK Ideograph */
- [0x5af3, 0x5af3], /* CJK Ideograph */
- [0x5af4, 0x5af4], /* CJK Ideograph */
- [0x5af5, 0x5af5], /* CJK Ideograph */
- [0x5af6, 0x5af6], /* CJK Ideograph */
- [0x5af7, 0x5af7], /* CJK Ideograph */
- [0x5af8, 0x5af8], /* CJK Ideograph */
- [0x5af9, 0x5af9], /* CJK Ideograph */
- [0x5afa, 0x5afa], /* CJK Ideograph */
- [0x5afb, 0x5afb], /* CJK Ideograph */
- [0x5afc, 0x5afc], /* CJK Ideograph */
- [0x5afd, 0x5afd], /* CJK Ideograph */
- [0x5afe, 0x5afe], /* CJK Ideograph */
- [0x5aff, 0x5aff], /* CJK Ideograph */
- [0x5b00, 0x5b00], /* CJK Ideograph */
- [0x5b01, 0x5b01], /* CJK Ideograph */
- [0x5b02, 0x5b02], /* CJK Ideograph */
- [0x5b03, 0x5b03], /* CJK Ideograph */
- [0x5b04, 0x5b04], /* CJK Ideograph */
- [0x5b05, 0x5b05], /* CJK Ideograph */
- [0x5b06, 0x5b06], /* CJK Ideograph */
- [0x5b07, 0x5b07], /* CJK Ideograph */
- [0x5b08, 0x5b08], /* CJK Ideograph */
- [0x5b09, 0x5b09], /* CJK Ideograph */
- [0x5b0a, 0x5b0a], /* CJK Ideograph */
- [0x5b0b, 0x5b0b], /* CJK Ideograph */
- [0x5b0c, 0x5b0c], /* CJK Ideograph */
- [0x5b0d, 0x5b0d], /* CJK Ideograph */
- [0x5b0e, 0x5b0e], /* CJK Ideograph */
- [0x5b0f, 0x5b0f], /* CJK Ideograph */
- [0x5b10, 0x5b10], /* CJK Ideograph */
- [0x5b11, 0x5b11], /* CJK Ideograph */
- [0x5b12, 0x5b12], /* CJK Ideograph */
- [0x5b13, 0x5b13], /* CJK Ideograph */
- [0x5b14, 0x5b14], /* CJK Ideograph */
- [0x5b15, 0x5b15], /* CJK Ideograph */
- [0x5b16, 0x5b16], /* CJK Ideograph */
- [0x5b17, 0x5b17], /* CJK Ideograph */
- [0x5b18, 0x5b18], /* CJK Ideograph */
- [0x5b19, 0x5b19], /* CJK Ideograph */
- [0x5b1a, 0x5b1a], /* CJK Ideograph */
- [0x5b1b, 0x5b1b], /* CJK Ideograph */
- [0x5b1c, 0x5b1c], /* CJK Ideograph */
- [0x5b1d, 0x5b1d], /* CJK Ideograph */
- [0x5b1e, 0x5b1e], /* CJK Ideograph */
- [0x5b1f, 0x5b1f], /* CJK Ideograph */
- [0x5b20, 0x5b20], /* CJK Ideograph */
- [0x5b21, 0x5b21], /* CJK Ideograph */
- [0x5b22, 0x5b22], /* CJK Ideograph */
- [0x5b23, 0x5b23], /* CJK Ideograph */
- [0x5b24, 0x5b24], /* CJK Ideograph */
- [0x5b25, 0x5b25], /* CJK Ideograph */
- [0x5b26, 0x5b26], /* CJK Ideograph */
- [0x5b27, 0x5b27], /* CJK Ideograph */
- [0x5b28, 0x5b28], /* CJK Ideograph */
- [0x5b29, 0x5b29], /* CJK Ideograph */
- [0x5b2a, 0x5b2a], /* CJK Ideograph */
- [0x5b2b, 0x5b2b], /* CJK Ideograph */
- [0x5b2c, 0x5b2c], /* CJK Ideograph */
- [0x5b2d, 0x5b2d], /* CJK Ideograph */
- [0x5b2e, 0x5b2e], /* CJK Ideograph */
- [0x5b2f, 0x5b2f], /* CJK Ideograph */
- [0x5b30, 0x5b30], /* CJK Ideograph */
- [0x5b31, 0x5b31], /* CJK Ideograph */
- [0x5b32, 0x5b32], /* CJK Ideograph */
- [0x5b33, 0x5b33], /* CJK Ideograph */
- [0x5b34, 0x5b34], /* CJK Ideograph */
- [0x5b35, 0x5b35], /* CJK Ideograph */
- [0x5b36, 0x5b36], /* CJK Ideograph */
- [0x5b37, 0x5b37], /* CJK Ideograph */
- [0x5b38, 0x5b38], /* CJK Ideograph */
- [0x5b39, 0x5b39], /* CJK Ideograph */
- [0x5b3a, 0x5b3a], /* CJK Ideograph */
- [0x5b3b, 0x5b3b], /* CJK Ideograph */
- [0x5b3c, 0x5b3c], /* CJK Ideograph */
- [0x5b3d, 0x5b3d], /* CJK Ideograph */
- [0x5b3e, 0x5b3e], /* CJK Ideograph */
- [0x5b3f, 0x5b3f], /* CJK Ideograph */
- [0x5b40, 0x5b40], /* CJK Ideograph */
- [0x5b41, 0x5b41], /* CJK Ideograph */
- [0x5b42, 0x5b42], /* CJK Ideograph */
- [0x5b43, 0x5b43], /* CJK Ideograph */
- [0x5b44, 0x5b44], /* CJK Ideograph */
- [0x5b45, 0x5b45], /* CJK Ideograph */
- [0x5b46, 0x5b46], /* CJK Ideograph */
- [0x5b47, 0x5b47], /* CJK Ideograph */
- [0x5b48, 0x5b48], /* CJK Ideograph */
- [0x5b49, 0x5b49], /* CJK Ideograph */
- [0x5b4a, 0x5b4a], /* CJK Ideograph */
- [0x5b4b, 0x5b4b], /* CJK Ideograph */
- [0x5b4c, 0x5b4c], /* CJK Ideograph */
- [0x5b4d, 0x5b4d], /* CJK Ideograph */
- [0x5b4e, 0x5b4e], /* CJK Ideograph */
- [0x5b4f, 0x5b4f], /* CJK Ideograph */
- [0x5b50, 0x5b50], /* CJK Ideograph */
- [0x5b51, 0x5b51], /* CJK Ideograph */
- [0x5b52, 0x5b52], /* CJK Ideograph */
- [0x5b53, 0x5b53], /* CJK Ideograph */
- [0x5b54, 0x5b54], /* CJK Ideograph */
- [0x5b55, 0x5b55], /* CJK Ideograph */
- [0x5b56, 0x5b56], /* CJK Ideograph */
- [0x5b57, 0x5b57], /* CJK Ideograph */
- [0x5b58, 0x5b58], /* CJK Ideograph */
- [0x5b59, 0x5b59], /* CJK Ideograph */
- [0x5b5a, 0x5b5a], /* CJK Ideograph */
- [0x5b5b, 0x5b5b], /* CJK Ideograph */
- [0x5b5c, 0x5b5c], /* CJK Ideograph */
- [0x5b5d, 0x5b5d], /* CJK Ideograph */
- [0x5b5e, 0x5b5e], /* CJK Ideograph */
- [0x5b5f, 0x5b5f], /* CJK Ideograph */
- [0x5b60, 0x5b60], /* CJK Ideograph */
- [0x5b61, 0x5b61], /* CJK Ideograph */
- [0x5b62, 0x5b62], /* CJK Ideograph */
- [0x5b63, 0x5b63], /* CJK Ideograph */
- [0x5b64, 0x5b64], /* CJK Ideograph */
- [0x5b65, 0x5b65], /* CJK Ideograph */
- [0x5b66, 0x5b66], /* CJK Ideograph */
- [0x5b67, 0x5b67], /* CJK Ideograph */
- [0x5b68, 0x5b68], /* CJK Ideograph */
- [0x5b69, 0x5b69], /* CJK Ideograph */
- [0x5b6a, 0x5b6a], /* CJK Ideograph */
- [0x5b6b, 0x5b6b], /* CJK Ideograph */
- [0x5b6c, 0x5b6c], /* CJK Ideograph */
- [0x5b6d, 0x5b6d], /* CJK Ideograph */
- [0x5b6e, 0x5b6e], /* CJK Ideograph */
- [0x5b6f, 0x5b6f], /* CJK Ideograph */
- [0x5b70, 0x5b70], /* CJK Ideograph */
- [0x5b71, 0x5b71], /* CJK Ideograph */
- [0x5b72, 0x5b72], /* CJK Ideograph */
- [0x5b73, 0x5b73], /* CJK Ideograph */
- [0x5b74, 0x5b74], /* CJK Ideograph */
- [0x5b75, 0x5b75], /* CJK Ideograph */
- [0x5b76, 0x5b76], /* CJK Ideograph */
- [0x5b77, 0x5b77], /* CJK Ideograph */
- [0x5b78, 0x5b78], /* CJK Ideograph */
- [0x5b79, 0x5b79], /* CJK Ideograph */
- [0x5b7a, 0x5b7a], /* CJK Ideograph */
- [0x5b7b, 0x5b7b], /* CJK Ideograph */
- [0x5b7c, 0x5b7c], /* CJK Ideograph */
- [0x5b7d, 0x5b7d], /* CJK Ideograph */
- [0x5b7e, 0x5b7e], /* CJK Ideograph */
- [0x5b7f, 0x5b7f], /* CJK Ideograph */
- [0x5b80, 0x5b80], /* CJK Ideograph */
- [0x5b81, 0x5b81], /* CJK Ideograph */
- [0x5b82, 0x5b82], /* CJK Ideograph */
- [0x5b83, 0x5b83], /* CJK Ideograph */
- [0x5b84, 0x5b84], /* CJK Ideograph */
- [0x5b85, 0x5b85], /* CJK Ideograph */
- [0x5b86, 0x5b86], /* CJK Ideograph */
- [0x5b87, 0x5b87], /* CJK Ideograph */
- [0x5b88, 0x5b88], /* CJK Ideograph */
- [0x5b89, 0x5b89], /* CJK Ideograph */
- [0x5b8a, 0x5b8a], /* CJK Ideograph */
- [0x5b8b, 0x5b8b], /* CJK Ideograph */
- [0x5b8c, 0x5b8c], /* CJK Ideograph */
- [0x5b8d, 0x5b8d], /* CJK Ideograph */
- [0x5b8e, 0x5b8e], /* CJK Ideograph */
- [0x5b8f, 0x5b8f], /* CJK Ideograph */
- [0x5b90, 0x5b90], /* CJK Ideograph */
- [0x5b91, 0x5b91], /* CJK Ideograph */
- [0x5b92, 0x5b92], /* CJK Ideograph */
- [0x5b93, 0x5b93], /* CJK Ideograph */
- [0x5b94, 0x5b94], /* CJK Ideograph */
- [0x5b95, 0x5b95], /* CJK Ideograph */
- [0x5b96, 0x5b96], /* CJK Ideograph */
- [0x5b97, 0x5b97], /* CJK Ideograph */
- [0x5b98, 0x5b98], /* CJK Ideograph */
- [0x5b99, 0x5b99], /* CJK Ideograph */
- [0x5b9a, 0x5b9a], /* CJK Ideograph */
- [0x5b9b, 0x5b9b], /* CJK Ideograph */
- [0x5b9c, 0x5b9c], /* CJK Ideograph */
- [0x5b9d, 0x5b9d], /* CJK Ideograph */
- [0x5b9e, 0x5b9e], /* CJK Ideograph */
- [0x5b9f, 0x5b9f], /* CJK Ideograph */
- [0x5ba0, 0x5ba0], /* CJK Ideograph */
- [0x5ba1, 0x5ba1], /* CJK Ideograph */
- [0x5ba2, 0x5ba2], /* CJK Ideograph */
- [0x5ba3, 0x5ba3], /* CJK Ideograph */
- [0x5ba4, 0x5ba4], /* CJK Ideograph */
- [0x5ba5, 0x5ba5], /* CJK Ideograph */
- [0x5ba6, 0x5ba6], /* CJK Ideograph */
- [0x5ba7, 0x5ba7], /* CJK Ideograph */
- [0x5ba8, 0x5ba8], /* CJK Ideograph */
- [0x5ba9, 0x5ba9], /* CJK Ideograph */
- [0x5baa, 0x5baa], /* CJK Ideograph */
- [0x5bab, 0x5bab], /* CJK Ideograph */
- [0x5bac, 0x5bac], /* CJK Ideograph */
- [0x5bad, 0x5bad], /* CJK Ideograph */
- [0x5bae, 0x5bae], /* CJK Ideograph */
- [0x5baf, 0x5baf], /* CJK Ideograph */
- [0x5bb0, 0x5bb0], /* CJK Ideograph */
- [0x5bb1, 0x5bb1], /* CJK Ideograph */
- [0x5bb2, 0x5bb2], /* CJK Ideograph */
- [0x5bb3, 0x5bb3], /* CJK Ideograph */
- [0x5bb4, 0x5bb4], /* CJK Ideograph */
- [0x5bb5, 0x5bb5], /* CJK Ideograph */
- [0x5bb6, 0x5bb6], /* CJK Ideograph */
- [0x5bb7, 0x5bb7], /* CJK Ideograph */
- [0x5bb8, 0x5bb8], /* CJK Ideograph */
- [0x5bb9, 0x5bb9], /* CJK Ideograph */
- [0x5bba, 0x5bba], /* CJK Ideograph */
- [0x5bbb, 0x5bbb], /* CJK Ideograph */
- [0x5bbc, 0x5bbc], /* CJK Ideograph */
- [0x5bbd, 0x5bbd], /* CJK Ideograph */
- [0x5bbe, 0x5bbe], /* CJK Ideograph */
- [0x5bbf, 0x5bbf], /* CJK Ideograph */
- [0x5bc0, 0x5bc0], /* CJK Ideograph */
- [0x5bc1, 0x5bc1], /* CJK Ideograph */
- [0x5bc2, 0x5bc2], /* CJK Ideograph */
- [0x5bc3, 0x5bc3], /* CJK Ideograph */
- [0x5bc4, 0x5bc4], /* CJK Ideograph */
- [0x5bc5, 0x5bc5], /* CJK Ideograph */
- [0x5bc6, 0x5bc6], /* CJK Ideograph */
- [0x5bc7, 0x5bc7], /* CJK Ideograph */
- [0x5bc8, 0x5bc8], /* CJK Ideograph */
- [0x5bc9, 0x5bc9], /* CJK Ideograph */
- [0x5bca, 0x5bca], /* CJK Ideograph */
- [0x5bcb, 0x5bcb], /* CJK Ideograph */
- [0x5bcc, 0x5bcc], /* CJK Ideograph */
- [0x5bcd, 0x5bcd], /* CJK Ideograph */
- [0x5bce, 0x5bce], /* CJK Ideograph */
- [0x5bcf, 0x5bcf], /* CJK Ideograph */
- [0x5bd0, 0x5bd0], /* CJK Ideograph */
- [0x5bd1, 0x5bd1], /* CJK Ideograph */
- [0x5bd2, 0x5bd2], /* CJK Ideograph */
- [0x5bd3, 0x5bd3], /* CJK Ideograph */
- [0x5bd4, 0x5bd4], /* CJK Ideograph */
- [0x5bd5, 0x5bd5], /* CJK Ideograph */
- [0x5bd6, 0x5bd6], /* CJK Ideograph */
- [0x5bd7, 0x5bd7], /* CJK Ideograph */
- [0x5bd8, 0x5bd8], /* CJK Ideograph */
- [0x5bd9, 0x5bd9], /* CJK Ideograph */
- [0x5bda, 0x5bda], /* CJK Ideograph */
- [0x5bdb, 0x5bdb], /* CJK Ideograph */
- [0x5bdc, 0x5bdc], /* CJK Ideograph */
- [0x5bdd, 0x5bdd], /* CJK Ideograph */
- [0x5bde, 0x5bde], /* CJK Ideograph */
- [0x5bdf, 0x5bdf], /* CJK Ideograph */
- [0x5be0, 0x5be0], /* CJK Ideograph */
- [0x5be1, 0x5be1], /* CJK Ideograph */
- [0x5be2, 0x5be2], /* CJK Ideograph */
- [0x5be3, 0x5be3], /* CJK Ideograph */
- [0x5be4, 0x5be4], /* CJK Ideograph */
- [0x5be5, 0x5be5], /* CJK Ideograph */
- [0x5be6, 0x5be6], /* CJK Ideograph */
- [0x5be7, 0x5be7], /* CJK Ideograph */
- [0x5be8, 0x5be8], /* CJK Ideograph */
- [0x5be9, 0x5be9], /* CJK Ideograph */
- [0x5bea, 0x5bea], /* CJK Ideograph */
- [0x5beb, 0x5beb], /* CJK Ideograph */
- [0x5bec, 0x5bec], /* CJK Ideograph */
- [0x5bed, 0x5bed], /* CJK Ideograph */
- [0x5bee, 0x5bee], /* CJK Ideograph */
- [0x5bef, 0x5bef], /* CJK Ideograph */
- [0x5bf0, 0x5bf0], /* CJK Ideograph */
- [0x5bf1, 0x5bf1], /* CJK Ideograph */
- [0x5bf2, 0x5bf2], /* CJK Ideograph */
- [0x5bf3, 0x5bf3], /* CJK Ideograph */
- [0x5bf4, 0x5bf4], /* CJK Ideograph */
- [0x5bf5, 0x5bf5], /* CJK Ideograph */
- [0x5bf6, 0x5bf6], /* CJK Ideograph */
- [0x5bf7, 0x5bf7], /* CJK Ideograph */
- [0x5bf8, 0x5bf8], /* CJK Ideograph */
- [0x5bf9, 0x5bf9], /* CJK Ideograph */
- [0x5bfa, 0x5bfa], /* CJK Ideograph */
- [0x5bfb, 0x5bfb], /* CJK Ideograph */
- [0x5bfc, 0x5bfc], /* CJK Ideograph */
- [0x5bfd, 0x5bfd], /* CJK Ideograph */
- [0x5bfe, 0x5bfe], /* CJK Ideograph */
- [0x5bff, 0x5bff], /* CJK Ideograph */
- [0x5c00, 0x5c00], /* CJK Ideograph */
- [0x5c01, 0x5c01], /* CJK Ideograph */
- [0x5c02, 0x5c02], /* CJK Ideograph */
- [0x5c03, 0x5c03], /* CJK Ideograph */
- [0x5c04, 0x5c04], /* CJK Ideograph */
- [0x5c05, 0x5c05], /* CJK Ideograph */
- [0x5c06, 0x5c06], /* CJK Ideograph */
- [0x5c07, 0x5c07], /* CJK Ideograph */
- [0x5c08, 0x5c08], /* CJK Ideograph */
- [0x5c09, 0x5c09], /* CJK Ideograph */
- [0x5c0a, 0x5c0a], /* CJK Ideograph */
- [0x5c0b, 0x5c0b], /* CJK Ideograph */
- [0x5c0c, 0x5c0c], /* CJK Ideograph */
- [0x5c0d, 0x5c0d], /* CJK Ideograph */
- [0x5c0e, 0x5c0e], /* CJK Ideograph */
- [0x5c0f, 0x5c0f], /* CJK Ideograph */
- [0x5c10, 0x5c10], /* CJK Ideograph */
- [0x5c11, 0x5c11], /* CJK Ideograph */
- [0x5c12, 0x5c12], /* CJK Ideograph */
- [0x5c13, 0x5c13], /* CJK Ideograph */
- [0x5c14, 0x5c14], /* CJK Ideograph */
- [0x5c15, 0x5c15], /* CJK Ideograph */
- [0x5c16, 0x5c16], /* CJK Ideograph */
- [0x5c17, 0x5c17], /* CJK Ideograph */
- [0x5c18, 0x5c18], /* CJK Ideograph */
- [0x5c19, 0x5c19], /* CJK Ideograph */
- [0x5c1a, 0x5c1a], /* CJK Ideograph */
- [0x5c1b, 0x5c1b], /* CJK Ideograph */
- [0x5c1c, 0x5c1c], /* CJK Ideograph */
- [0x5c1d, 0x5c1d], /* CJK Ideograph */
- [0x5c1e, 0x5c1e], /* CJK Ideograph */
- [0x5c1f, 0x5c1f], /* CJK Ideograph */
- [0x5c20, 0x5c20], /* CJK Ideograph */
- [0x5c21, 0x5c21], /* CJK Ideograph */
- [0x5c22, 0x5c22], /* CJK Ideograph */
- [0x5c23, 0x5c23], /* CJK Ideograph */
- [0x5c24, 0x5c24], /* CJK Ideograph */
- [0x5c25, 0x5c25], /* CJK Ideograph */
- [0x5c26, 0x5c26], /* CJK Ideograph */
- [0x5c27, 0x5c27], /* CJK Ideograph */
- [0x5c28, 0x5c28], /* CJK Ideograph */
- [0x5c29, 0x5c29], /* CJK Ideograph */
- [0x5c2a, 0x5c2a], /* CJK Ideograph */
- [0x5c2b, 0x5c2b], /* CJK Ideograph */
- [0x5c2c, 0x5c2c], /* CJK Ideograph */
- [0x5c2d, 0x5c2d], /* CJK Ideograph */
- [0x5c2e, 0x5c2e], /* CJK Ideograph */
- [0x5c2f, 0x5c2f], /* CJK Ideograph */
- [0x5c30, 0x5c30], /* CJK Ideograph */
- [0x5c31, 0x5c31], /* CJK Ideograph */
- [0x5c32, 0x5c32], /* CJK Ideograph */
- [0x5c33, 0x5c33], /* CJK Ideograph */
- [0x5c34, 0x5c34], /* CJK Ideograph */
- [0x5c35, 0x5c35], /* CJK Ideograph */
- [0x5c36, 0x5c36], /* CJK Ideograph */
- [0x5c37, 0x5c37], /* CJK Ideograph */
- [0x5c38, 0x5c38], /* CJK Ideograph */
- [0x5c39, 0x5c39], /* CJK Ideograph */
- [0x5c3a, 0x5c3a], /* CJK Ideograph */
- [0x5c3b, 0x5c3b], /* CJK Ideograph */
- [0x5c3c, 0x5c3c], /* CJK Ideograph */
- [0x5c3d, 0x5c3d], /* CJK Ideograph */
- [0x5c3e, 0x5c3e], /* CJK Ideograph */
- [0x5c3f, 0x5c3f], /* CJK Ideograph */
- [0x5c40, 0x5c40], /* CJK Ideograph */
- [0x5c41, 0x5c41], /* CJK Ideograph */
- [0x5c42, 0x5c42], /* CJK Ideograph */
- [0x5c43, 0x5c43], /* CJK Ideograph */
- [0x5c44, 0x5c44], /* CJK Ideograph */
- [0x5c45, 0x5c45], /* CJK Ideograph */
- [0x5c46, 0x5c46], /* CJK Ideograph */
- [0x5c47, 0x5c47], /* CJK Ideograph */
- [0x5c48, 0x5c48], /* CJK Ideograph */
- [0x5c49, 0x5c49], /* CJK Ideograph */
- [0x5c4a, 0x5c4a], /* CJK Ideograph */
- [0x5c4b, 0x5c4b], /* CJK Ideograph */
- [0x5c4c, 0x5c4c], /* CJK Ideograph */
- [0x5c4d, 0x5c4d], /* CJK Ideograph */
- [0x5c4e, 0x5c4e], /* CJK Ideograph */
- [0x5c4f, 0x5c4f], /* CJK Ideograph */
- [0x5c50, 0x5c50], /* CJK Ideograph */
- [0x5c51, 0x5c51], /* CJK Ideograph */
- [0x5c52, 0x5c52], /* CJK Ideograph */
- [0x5c53, 0x5c53], /* CJK Ideograph */
- [0x5c54, 0x5c54], /* CJK Ideograph */
- [0x5c55, 0x5c55], /* CJK Ideograph */
- [0x5c56, 0x5c56], /* CJK Ideograph */
- [0x5c57, 0x5c57], /* CJK Ideograph */
- [0x5c58, 0x5c58], /* CJK Ideograph */
- [0x5c59, 0x5c59], /* CJK Ideograph */
- [0x5c5a, 0x5c5a], /* CJK Ideograph */
- [0x5c5b, 0x5c5b], /* CJK Ideograph */
- [0x5c5c, 0x5c5c], /* CJK Ideograph */
- [0x5c5d, 0x5c5d], /* CJK Ideograph */
- [0x5c5e, 0x5c5e], /* CJK Ideograph */
- [0x5c5f, 0x5c5f], /* CJK Ideograph */
- [0x5c60, 0x5c60], /* CJK Ideograph */
- [0x5c61, 0x5c61], /* CJK Ideograph */
- [0x5c62, 0x5c62], /* CJK Ideograph */
- [0x5c63, 0x5c63], /* CJK Ideograph */
- [0x5c64, 0x5c64], /* CJK Ideograph */
- [0x5c65, 0x5c65], /* CJK Ideograph */
- [0x5c66, 0x5c66], /* CJK Ideograph */
- [0x5c67, 0x5c67], /* CJK Ideograph */
- [0x5c68, 0x5c68], /* CJK Ideograph */
- [0x5c69, 0x5c69], /* CJK Ideograph */
- [0x5c6a, 0x5c6a], /* CJK Ideograph */
- [0x5c6b, 0x5c6b], /* CJK Ideograph */
- [0x5c6c, 0x5c6c], /* CJK Ideograph */
- [0x5c6d, 0x5c6d], /* CJK Ideograph */
- [0x5c6e, 0x5c6e], /* CJK Ideograph */
- [0x5c6f, 0x5c6f], /* CJK Ideograph */
- [0x5c70, 0x5c70], /* CJK Ideograph */
- [0x5c71, 0x5c71], /* CJK Ideograph */
- [0x5c72, 0x5c72], /* CJK Ideograph */
- [0x5c73, 0x5c73], /* CJK Ideograph */
- [0x5c74, 0x5c74], /* CJK Ideograph */
- [0x5c75, 0x5c75], /* CJK Ideograph */
- [0x5c76, 0x5c76], /* CJK Ideograph */
- [0x5c77, 0x5c77], /* CJK Ideograph */
- [0x5c78, 0x5c78], /* CJK Ideograph */
- [0x5c79, 0x5c79], /* CJK Ideograph */
- [0x5c7a, 0x5c7a], /* CJK Ideograph */
- [0x5c7b, 0x5c7b], /* CJK Ideograph */
- [0x5c7c, 0x5c7c], /* CJK Ideograph */
- [0x5c7d, 0x5c7d], /* CJK Ideograph */
- [0x5c7e, 0x5c7e], /* CJK Ideograph */
- [0x5c7f, 0x5c7f], /* CJK Ideograph */
- [0x5c80, 0x5c80], /* CJK Ideograph */
- [0x5c81, 0x5c81], /* CJK Ideograph */
- [0x5c82, 0x5c82], /* CJK Ideograph */
- [0x5c83, 0x5c83], /* CJK Ideograph */
- [0x5c84, 0x5c84], /* CJK Ideograph */
- [0x5c85, 0x5c85], /* CJK Ideograph */
- [0x5c86, 0x5c86], /* CJK Ideograph */
- [0x5c87, 0x5c87], /* CJK Ideograph */
- [0x5c88, 0x5c88], /* CJK Ideograph */
- [0x5c89, 0x5c89], /* CJK Ideograph */
- [0x5c8a, 0x5c8a], /* CJK Ideograph */
- [0x5c8b, 0x5c8b], /* CJK Ideograph */
- [0x5c8c, 0x5c8c], /* CJK Ideograph */
- [0x5c8d, 0x5c8d], /* CJK Ideograph */
- [0x5c8e, 0x5c8e], /* CJK Ideograph */
- [0x5c8f, 0x5c8f], /* CJK Ideograph */
- [0x5c90, 0x5c90], /* CJK Ideograph */
- [0x5c91, 0x5c91], /* CJK Ideograph */
- [0x5c92, 0x5c92], /* CJK Ideograph */
- [0x5c93, 0x5c93], /* CJK Ideograph */
- [0x5c94, 0x5c94], /* CJK Ideograph */
- [0x5c95, 0x5c95], /* CJK Ideograph */
- [0x5c96, 0x5c96], /* CJK Ideograph */
- [0x5c97, 0x5c97], /* CJK Ideograph */
- [0x5c98, 0x5c98], /* CJK Ideograph */
- [0x5c99, 0x5c99], /* CJK Ideograph */
- [0x5c9a, 0x5c9a], /* CJK Ideograph */
- [0x5c9b, 0x5c9b], /* CJK Ideograph */
- [0x5c9c, 0x5c9c], /* CJK Ideograph */
- [0x5c9d, 0x5c9d], /* CJK Ideograph */
- [0x5c9e, 0x5c9e], /* CJK Ideograph */
- [0x5c9f, 0x5c9f], /* CJK Ideograph */
- [0x5ca0, 0x5ca0], /* CJK Ideograph */
- [0x5ca1, 0x5ca1], /* CJK Ideograph */
- [0x5ca2, 0x5ca2], /* CJK Ideograph */
- [0x5ca3, 0x5ca3], /* CJK Ideograph */
- [0x5ca4, 0x5ca4], /* CJK Ideograph */
- [0x5ca5, 0x5ca5], /* CJK Ideograph */
- [0x5ca6, 0x5ca6], /* CJK Ideograph */
- [0x5ca7, 0x5ca7], /* CJK Ideograph */
- [0x5ca8, 0x5ca8], /* CJK Ideograph */
- [0x5ca9, 0x5ca9], /* CJK Ideograph */
- [0x5caa, 0x5caa], /* CJK Ideograph */
- [0x5cab, 0x5cab], /* CJK Ideograph */
- [0x5cac, 0x5cac], /* CJK Ideograph */
- [0x5cad, 0x5cad], /* CJK Ideograph */
- [0x5cae, 0x5cae], /* CJK Ideograph */
- [0x5caf, 0x5caf], /* CJK Ideograph */
- [0x5cb0, 0x5cb0], /* CJK Ideograph */
- [0x5cb1, 0x5cb1], /* CJK Ideograph */
- [0x5cb2, 0x5cb2], /* CJK Ideograph */
- [0x5cb3, 0x5cb3], /* CJK Ideograph */
- [0x5cb4, 0x5cb4], /* CJK Ideograph */
- [0x5cb5, 0x5cb5], /* CJK Ideograph */
- [0x5cb6, 0x5cb6], /* CJK Ideograph */
- [0x5cb7, 0x5cb7], /* CJK Ideograph */
- [0x5cb8, 0x5cb8], /* CJK Ideograph */
- [0x5cb9, 0x5cb9], /* CJK Ideograph */
- [0x5cba, 0x5cba], /* CJK Ideograph */
- [0x5cbb, 0x5cbb], /* CJK Ideograph */
- [0x5cbc, 0x5cbc], /* CJK Ideograph */
- [0x5cbd, 0x5cbd], /* CJK Ideograph */
- [0x5cbe, 0x5cbe], /* CJK Ideograph */
- [0x5cbf, 0x5cbf], /* CJK Ideograph */
- [0x5cc0, 0x5cc0], /* CJK Ideograph */
- [0x5cc1, 0x5cc1], /* CJK Ideograph */
- [0x5cc2, 0x5cc2], /* CJK Ideograph */
- [0x5cc3, 0x5cc3], /* CJK Ideograph */
- [0x5cc4, 0x5cc4], /* CJK Ideograph */
- [0x5cc5, 0x5cc5], /* CJK Ideograph */
- [0x5cc6, 0x5cc6], /* CJK Ideograph */
- [0x5cc7, 0x5cc7], /* CJK Ideograph */
- [0x5cc8, 0x5cc8], /* CJK Ideograph */
- [0x5cc9, 0x5cc9], /* CJK Ideograph */
- [0x5cca, 0x5cca], /* CJK Ideograph */
- [0x5ccb, 0x5ccb], /* CJK Ideograph */
- [0x5ccc, 0x5ccc], /* CJK Ideograph */
- [0x5ccd, 0x5ccd], /* CJK Ideograph */
- [0x5cce, 0x5cce], /* CJK Ideograph */
- [0x5ccf, 0x5ccf], /* CJK Ideograph */
- [0x5cd0, 0x5cd0], /* CJK Ideograph */
- [0x5cd1, 0x5cd1], /* CJK Ideograph */
- [0x5cd2, 0x5cd2], /* CJK Ideograph */
- [0x5cd3, 0x5cd3], /* CJK Ideograph */
- [0x5cd4, 0x5cd4], /* CJK Ideograph */
- [0x5cd5, 0x5cd5], /* CJK Ideograph */
- [0x5cd6, 0x5cd6], /* CJK Ideograph */
- [0x5cd7, 0x5cd7], /* CJK Ideograph */
- [0x5cd8, 0x5cd8], /* CJK Ideograph */
- [0x5cd9, 0x5cd9], /* CJK Ideograph */
- [0x5cda, 0x5cda], /* CJK Ideograph */
- [0x5cdb, 0x5cdb], /* CJK Ideograph */
- [0x5cdc, 0x5cdc], /* CJK Ideograph */
- [0x5cdd, 0x5cdd], /* CJK Ideograph */
- [0x5cde, 0x5cde], /* CJK Ideograph */
- [0x5cdf, 0x5cdf], /* CJK Ideograph */
- [0x5ce0, 0x5ce0], /* CJK Ideograph */
- [0x5ce1, 0x5ce1], /* CJK Ideograph */
- [0x5ce2, 0x5ce2], /* CJK Ideograph */
- [0x5ce3, 0x5ce3], /* CJK Ideograph */
- [0x5ce4, 0x5ce4], /* CJK Ideograph */
- [0x5ce5, 0x5ce5], /* CJK Ideograph */
- [0x5ce6, 0x5ce6], /* CJK Ideograph */
- [0x5ce7, 0x5ce7], /* CJK Ideograph */
- [0x5ce8, 0x5ce8], /* CJK Ideograph */
- [0x5ce9, 0x5ce9], /* CJK Ideograph */
- [0x5cea, 0x5cea], /* CJK Ideograph */
- [0x5ceb, 0x5ceb], /* CJK Ideograph */
- [0x5cec, 0x5cec], /* CJK Ideograph */
- [0x5ced, 0x5ced], /* CJK Ideograph */
- [0x5cee, 0x5cee], /* CJK Ideograph */
- [0x5cef, 0x5cef], /* CJK Ideograph */
- [0x5cf0, 0x5cf0], /* CJK Ideograph */
- [0x5cf1, 0x5cf1], /* CJK Ideograph */
- [0x5cf2, 0x5cf2], /* CJK Ideograph */
- [0x5cf3, 0x5cf3], /* CJK Ideograph */
- [0x5cf4, 0x5cf4], /* CJK Ideograph */
- [0x5cf5, 0x5cf5], /* CJK Ideograph */
- [0x5cf6, 0x5cf6], /* CJK Ideograph */
- [0x5cf7, 0x5cf7], /* CJK Ideograph */
- [0x5cf8, 0x5cf8], /* CJK Ideograph */
- [0x5cf9, 0x5cf9], /* CJK Ideograph */
- [0x5cfa, 0x5cfa], /* CJK Ideograph */
- [0x5cfb, 0x5cfb], /* CJK Ideograph */
- [0x5cfc, 0x5cfc], /* CJK Ideograph */
- [0x5cfd, 0x5cfd], /* CJK Ideograph */
- [0x5cfe, 0x5cfe], /* CJK Ideograph */
- [0x5cff, 0x5cff], /* CJK Ideograph */
- [0x5d00, 0x5d00], /* CJK Ideograph */
- [0x5d01, 0x5d01], /* CJK Ideograph */
- [0x5d02, 0x5d02], /* CJK Ideograph */
- [0x5d03, 0x5d03], /* CJK Ideograph */
- [0x5d04, 0x5d04], /* CJK Ideograph */
- [0x5d05, 0x5d05], /* CJK Ideograph */
- [0x5d06, 0x5d06], /* CJK Ideograph */
- [0x5d07, 0x5d07], /* CJK Ideograph */
- [0x5d08, 0x5d08], /* CJK Ideograph */
- [0x5d09, 0x5d09], /* CJK Ideograph */
- [0x5d0a, 0x5d0a], /* CJK Ideograph */
- [0x5d0b, 0x5d0b], /* CJK Ideograph */
- [0x5d0c, 0x5d0c], /* CJK Ideograph */
- [0x5d0d, 0x5d0d], /* CJK Ideograph */
- [0x5d0e, 0x5d0e], /* CJK Ideograph */
- [0x5d0f, 0x5d0f], /* CJK Ideograph */
- [0x5d10, 0x5d10], /* CJK Ideograph */
- [0x5d11, 0x5d11], /* CJK Ideograph */
- [0x5d12, 0x5d12], /* CJK Ideograph */
- [0x5d13, 0x5d13], /* CJK Ideograph */
- [0x5d14, 0x5d14], /* CJK Ideograph */
- [0x5d15, 0x5d15], /* CJK Ideograph */
- [0x5d16, 0x5d16], /* CJK Ideograph */
- [0x5d17, 0x5d17], /* CJK Ideograph */
- [0x5d18, 0x5d18], /* CJK Ideograph */
- [0x5d19, 0x5d19], /* CJK Ideograph */
- [0x5d1a, 0x5d1a], /* CJK Ideograph */
- [0x5d1b, 0x5d1b], /* CJK Ideograph */
- [0x5d1c, 0x5d1c], /* CJK Ideograph */
- [0x5d1d, 0x5d1d], /* CJK Ideograph */
- [0x5d1e, 0x5d1e], /* CJK Ideograph */
- [0x5d1f, 0x5d1f], /* CJK Ideograph */
- [0x5d20, 0x5d20], /* CJK Ideograph */
- [0x5d21, 0x5d21], /* CJK Ideograph */
- [0x5d22, 0x5d22], /* CJK Ideograph */
- [0x5d23, 0x5d23], /* CJK Ideograph */
- [0x5d24, 0x5d24], /* CJK Ideograph */
- [0x5d25, 0x5d25], /* CJK Ideograph */
- [0x5d26, 0x5d26], /* CJK Ideograph */
- [0x5d27, 0x5d27], /* CJK Ideograph */
- [0x5d28, 0x5d28], /* CJK Ideograph */
- [0x5d29, 0x5d29], /* CJK Ideograph */
- [0x5d2a, 0x5d2a], /* CJK Ideograph */
- [0x5d2b, 0x5d2b], /* CJK Ideograph */
- [0x5d2c, 0x5d2c], /* CJK Ideograph */
- [0x5d2d, 0x5d2d], /* CJK Ideograph */
- [0x5d2e, 0x5d2e], /* CJK Ideograph */
- [0x5d2f, 0x5d2f], /* CJK Ideograph */
- [0x5d30, 0x5d30], /* CJK Ideograph */
- [0x5d31, 0x5d31], /* CJK Ideograph */
- [0x5d32, 0x5d32], /* CJK Ideograph */
- [0x5d33, 0x5d33], /* CJK Ideograph */
- [0x5d34, 0x5d34], /* CJK Ideograph */
- [0x5d35, 0x5d35], /* CJK Ideograph */
- [0x5d36, 0x5d36], /* CJK Ideograph */
- [0x5d37, 0x5d37], /* CJK Ideograph */
- [0x5d38, 0x5d38], /* CJK Ideograph */
- [0x5d39, 0x5d39], /* CJK Ideograph */
- [0x5d3a, 0x5d3a], /* CJK Ideograph */
- [0x5d3b, 0x5d3b], /* CJK Ideograph */
- [0x5d3c, 0x5d3c], /* CJK Ideograph */
- [0x5d3d, 0x5d3d], /* CJK Ideograph */
- [0x5d3e, 0x5d3e], /* CJK Ideograph */
- [0x5d3f, 0x5d3f], /* CJK Ideograph */
- [0x5d40, 0x5d40], /* CJK Ideograph */
- [0x5d41, 0x5d41], /* CJK Ideograph */
- [0x5d42, 0x5d42], /* CJK Ideograph */
- [0x5d43, 0x5d43], /* CJK Ideograph */
- [0x5d44, 0x5d44], /* CJK Ideograph */
- [0x5d45, 0x5d45], /* CJK Ideograph */
- [0x5d46, 0x5d46], /* CJK Ideograph */
- [0x5d47, 0x5d47], /* CJK Ideograph */
- [0x5d48, 0x5d48], /* CJK Ideograph */
- [0x5d49, 0x5d49], /* CJK Ideograph */
- [0x5d4a, 0x5d4a], /* CJK Ideograph */
- [0x5d4b, 0x5d4b], /* CJK Ideograph */
- [0x5d4c, 0x5d4c], /* CJK Ideograph */
- [0x5d4d, 0x5d4d], /* CJK Ideograph */
- [0x5d4e, 0x5d4e], /* CJK Ideograph */
- [0x5d4f, 0x5d4f], /* CJK Ideograph */
- [0x5d50, 0x5d50], /* CJK Ideograph */
- [0x5d51, 0x5d51], /* CJK Ideograph */
- [0x5d52, 0x5d52], /* CJK Ideograph */
- [0x5d53, 0x5d53], /* CJK Ideograph */
- [0x5d54, 0x5d54], /* CJK Ideograph */
- [0x5d55, 0x5d55], /* CJK Ideograph */
- [0x5d56, 0x5d56], /* CJK Ideograph */
- [0x5d57, 0x5d57], /* CJK Ideograph */
- [0x5d58, 0x5d58], /* CJK Ideograph */
- [0x5d59, 0x5d59], /* CJK Ideograph */
- [0x5d5a, 0x5d5a], /* CJK Ideograph */
- [0x5d5b, 0x5d5b], /* CJK Ideograph */
- [0x5d5c, 0x5d5c], /* CJK Ideograph */
- [0x5d5d, 0x5d5d], /* CJK Ideograph */
- [0x5d5e, 0x5d5e], /* CJK Ideograph */
- [0x5d5f, 0x5d5f], /* CJK Ideograph */
- [0x5d60, 0x5d60], /* CJK Ideograph */
- [0x5d61, 0x5d61], /* CJK Ideograph */
- [0x5d62, 0x5d62], /* CJK Ideograph */
- [0x5d63, 0x5d63], /* CJK Ideograph */
- [0x5d64, 0x5d64], /* CJK Ideograph */
- [0x5d65, 0x5d65], /* CJK Ideograph */
- [0x5d66, 0x5d66], /* CJK Ideograph */
- [0x5d67, 0x5d67], /* CJK Ideograph */
- [0x5d68, 0x5d68], /* CJK Ideograph */
- [0x5d69, 0x5d69], /* CJK Ideograph */
- [0x5d6a, 0x5d6a], /* CJK Ideograph */
- [0x5d6b, 0x5d6b], /* CJK Ideograph */
- [0x5d6c, 0x5d6c], /* CJK Ideograph */
- [0x5d6d, 0x5d6d], /* CJK Ideograph */
- [0x5d6e, 0x5d6e], /* CJK Ideograph */
- [0x5d6f, 0x5d6f], /* CJK Ideograph */
- [0x5d70, 0x5d70], /* CJK Ideograph */
- [0x5d71, 0x5d71], /* CJK Ideograph */
- [0x5d72, 0x5d72], /* CJK Ideograph */
- [0x5d73, 0x5d73], /* CJK Ideograph */
- [0x5d74, 0x5d74], /* CJK Ideograph */
- [0x5d75, 0x5d75], /* CJK Ideograph */
- [0x5d76, 0x5d76], /* CJK Ideograph */
- [0x5d77, 0x5d77], /* CJK Ideograph */
- [0x5d78, 0x5d78], /* CJK Ideograph */
- [0x5d79, 0x5d79], /* CJK Ideograph */
- [0x5d7a, 0x5d7a], /* CJK Ideograph */
- [0x5d7b, 0x5d7b], /* CJK Ideograph */
- [0x5d7c, 0x5d7c], /* CJK Ideograph */
- [0x5d7d, 0x5d7d], /* CJK Ideograph */
- [0x5d7e, 0x5d7e], /* CJK Ideograph */
- [0x5d7f, 0x5d7f], /* CJK Ideograph */
- [0x5d80, 0x5d80], /* CJK Ideograph */
- [0x5d81, 0x5d81], /* CJK Ideograph */
- [0x5d82, 0x5d82], /* CJK Ideograph */
- [0x5d83, 0x5d83], /* CJK Ideograph */
- [0x5d84, 0x5d84], /* CJK Ideograph */
- [0x5d85, 0x5d85], /* CJK Ideograph */
- [0x5d86, 0x5d86], /* CJK Ideograph */
- [0x5d87, 0x5d87], /* CJK Ideograph */
- [0x5d88, 0x5d88], /* CJK Ideograph */
- [0x5d89, 0x5d89], /* CJK Ideograph */
- [0x5d8a, 0x5d8a], /* CJK Ideograph */
- [0x5d8b, 0x5d8b], /* CJK Ideograph */
- [0x5d8c, 0x5d8c], /* CJK Ideograph */
- [0x5d8d, 0x5d8d], /* CJK Ideograph */
- [0x5d8e, 0x5d8e], /* CJK Ideograph */
- [0x5d8f, 0x5d8f], /* CJK Ideograph */
- [0x5d90, 0x5d90], /* CJK Ideograph */
- [0x5d91, 0x5d91], /* CJK Ideograph */
- [0x5d92, 0x5d92], /* CJK Ideograph */
- [0x5d93, 0x5d93], /* CJK Ideograph */
- [0x5d94, 0x5d94], /* CJK Ideograph */
- [0x5d95, 0x5d95], /* CJK Ideograph */
- [0x5d96, 0x5d96], /* CJK Ideograph */
- [0x5d97, 0x5d97], /* CJK Ideograph */
- [0x5d98, 0x5d98], /* CJK Ideograph */
- [0x5d99, 0x5d99], /* CJK Ideograph */
- [0x5d9a, 0x5d9a], /* CJK Ideograph */
- [0x5d9b, 0x5d9b], /* CJK Ideograph */
- [0x5d9c, 0x5d9c], /* CJK Ideograph */
- [0x5d9d, 0x5d9d], /* CJK Ideograph */
- [0x5d9e, 0x5d9e], /* CJK Ideograph */
- [0x5d9f, 0x5d9f], /* CJK Ideograph */
- [0x5da0, 0x5da0], /* CJK Ideograph */
- [0x5da1, 0x5da1], /* CJK Ideograph */
- [0x5da2, 0x5da2], /* CJK Ideograph */
- [0x5da3, 0x5da3], /* CJK Ideograph */
- [0x5da4, 0x5da4], /* CJK Ideograph */
- [0x5da5, 0x5da5], /* CJK Ideograph */
- [0x5da6, 0x5da6], /* CJK Ideograph */
- [0x5da7, 0x5da7], /* CJK Ideograph */
- [0x5da8, 0x5da8], /* CJK Ideograph */
- [0x5da9, 0x5da9], /* CJK Ideograph */
- [0x5daa, 0x5daa], /* CJK Ideograph */
- [0x5dab, 0x5dab], /* CJK Ideograph */
- [0x5dac, 0x5dac], /* CJK Ideograph */
- [0x5dad, 0x5dad], /* CJK Ideograph */
- [0x5dae, 0x5dae], /* CJK Ideograph */
- [0x5daf, 0x5daf], /* CJK Ideograph */
- [0x5db0, 0x5db0], /* CJK Ideograph */
- [0x5db1, 0x5db1], /* CJK Ideograph */
- [0x5db2, 0x5db2], /* CJK Ideograph */
- [0x5db3, 0x5db3], /* CJK Ideograph */
- [0x5db4, 0x5db4], /* CJK Ideograph */
- [0x5db5, 0x5db5], /* CJK Ideograph */
- [0x5db6, 0x5db6], /* CJK Ideograph */
- [0x5db7, 0x5db7], /* CJK Ideograph */
- [0x5db8, 0x5db8], /* CJK Ideograph */
- [0x5db9, 0x5db9], /* CJK Ideograph */
- [0x5dba, 0x5dba], /* CJK Ideograph */
- [0x5dbb, 0x5dbb], /* CJK Ideograph */
- [0x5dbc, 0x5dbc], /* CJK Ideograph */
- [0x5dbd, 0x5dbd], /* CJK Ideograph */
- [0x5dbe, 0x5dbe], /* CJK Ideograph */
- [0x5dbf, 0x5dbf], /* CJK Ideograph */
- [0x5dc0, 0x5dc0], /* CJK Ideograph */
- [0x5dc1, 0x5dc1], /* CJK Ideograph */
- [0x5dc2, 0x5dc2], /* CJK Ideograph */
- [0x5dc3, 0x5dc3], /* CJK Ideograph */
- [0x5dc4, 0x5dc4], /* CJK Ideograph */
- [0x5dc5, 0x5dc5], /* CJK Ideograph */
- [0x5dc6, 0x5dc6], /* CJK Ideograph */
- [0x5dc7, 0x5dc7], /* CJK Ideograph */
- [0x5dc8, 0x5dc8], /* CJK Ideograph */
- [0x5dc9, 0x5dc9], /* CJK Ideograph */
- [0x5dca, 0x5dca], /* CJK Ideograph */
- [0x5dcb, 0x5dcb], /* CJK Ideograph */
- [0x5dcc, 0x5dcc], /* CJK Ideograph */
- [0x5dcd, 0x5dcd], /* CJK Ideograph */
- [0x5dce, 0x5dce], /* CJK Ideograph */
- [0x5dcf, 0x5dcf], /* CJK Ideograph */
- [0x5dd0, 0x5dd0], /* CJK Ideograph */
- [0x5dd1, 0x5dd1], /* CJK Ideograph */
- [0x5dd2, 0x5dd2], /* CJK Ideograph */
- [0x5dd3, 0x5dd3], /* CJK Ideograph */
- [0x5dd4, 0x5dd4], /* CJK Ideograph */
- [0x5dd5, 0x5dd5], /* CJK Ideograph */
- [0x5dd6, 0x5dd6], /* CJK Ideograph */
- [0x5dd7, 0x5dd7], /* CJK Ideograph */
- [0x5dd8, 0x5dd8], /* CJK Ideograph */
- [0x5dd9, 0x5dd9], /* CJK Ideograph */
- [0x5dda, 0x5dda], /* CJK Ideograph */
- [0x5ddb, 0x5ddb], /* CJK Ideograph */
- [0x5ddc, 0x5ddc], /* CJK Ideograph */
- [0x5ddd, 0x5ddd], /* CJK Ideograph */
- [0x5dde, 0x5dde], /* CJK Ideograph */
- [0x5ddf, 0x5ddf], /* CJK Ideograph */
- [0x5de0, 0x5de0], /* CJK Ideograph */
- [0x5de1, 0x5de1], /* CJK Ideograph */
- [0x5de2, 0x5de2], /* CJK Ideograph */
- [0x5de3, 0x5de3], /* CJK Ideograph */
- [0x5de4, 0x5de4], /* CJK Ideograph */
- [0x5de5, 0x5de5], /* CJK Ideograph */
- [0x5de6, 0x5de6], /* CJK Ideograph */
- [0x5de7, 0x5de7], /* CJK Ideograph */
- [0x5de8, 0x5de8], /* CJK Ideograph */
- [0x5de9, 0x5de9], /* CJK Ideograph */
- [0x5dea, 0x5dea], /* CJK Ideograph */
- [0x5deb, 0x5deb], /* CJK Ideograph */
- [0x5dec, 0x5dec], /* CJK Ideograph */
- [0x5ded, 0x5ded], /* CJK Ideograph */
- [0x5dee, 0x5dee], /* CJK Ideograph */
- [0x5def, 0x5def], /* CJK Ideograph */
- [0x5df0, 0x5df0], /* CJK Ideograph */
- [0x5df1, 0x5df1], /* CJK Ideograph */
- [0x5df2, 0x5df2], /* CJK Ideograph */
- [0x5df3, 0x5df3], /* CJK Ideograph */
- [0x5df4, 0x5df4], /* CJK Ideograph */
- [0x5df5, 0x5df5], /* CJK Ideograph */
- [0x5df6, 0x5df6], /* CJK Ideograph */
- [0x5df7, 0x5df7], /* CJK Ideograph */
- [0x5df8, 0x5df8], /* CJK Ideograph */
- [0x5df9, 0x5df9], /* CJK Ideograph */
- [0x5dfa, 0x5dfa], /* CJK Ideograph */
- [0x5dfb, 0x5dfb], /* CJK Ideograph */
- [0x5dfc, 0x5dfc], /* CJK Ideograph */
- [0x5dfd, 0x5dfd], /* CJK Ideograph */
- [0x5dfe, 0x5dfe], /* CJK Ideograph */
- [0x5dff, 0x5dff], /* CJK Ideograph */
- [0x5e00, 0x5e00], /* CJK Ideograph */
- [0x5e01, 0x5e01], /* CJK Ideograph */
- [0x5e02, 0x5e02], /* CJK Ideograph */
- [0x5e03, 0x5e03], /* CJK Ideograph */
- [0x5e04, 0x5e04], /* CJK Ideograph */
- [0x5e05, 0x5e05], /* CJK Ideograph */
- [0x5e06, 0x5e06], /* CJK Ideograph */
- [0x5e07, 0x5e07], /* CJK Ideograph */
- [0x5e08, 0x5e08], /* CJK Ideograph */
- [0x5e09, 0x5e09], /* CJK Ideograph */
- [0x5e0a, 0x5e0a], /* CJK Ideograph */
- [0x5e0b, 0x5e0b], /* CJK Ideograph */
- [0x5e0c, 0x5e0c], /* CJK Ideograph */
- [0x5e0d, 0x5e0d], /* CJK Ideograph */
- [0x5e0e, 0x5e0e], /* CJK Ideograph */
- [0x5e0f, 0x5e0f], /* CJK Ideograph */
- [0x5e10, 0x5e10], /* CJK Ideograph */
- [0x5e11, 0x5e11], /* CJK Ideograph */
- [0x5e12, 0x5e12], /* CJK Ideograph */
- [0x5e13, 0x5e13], /* CJK Ideograph */
- [0x5e14, 0x5e14], /* CJK Ideograph */
- [0x5e15, 0x5e15], /* CJK Ideograph */
- [0x5e16, 0x5e16], /* CJK Ideograph */
- [0x5e17, 0x5e17], /* CJK Ideograph */
- [0x5e18, 0x5e18], /* CJK Ideograph */
- [0x5e19, 0x5e19], /* CJK Ideograph */
- [0x5e1a, 0x5e1a], /* CJK Ideograph */
- [0x5e1b, 0x5e1b], /* CJK Ideograph */
- [0x5e1c, 0x5e1c], /* CJK Ideograph */
- [0x5e1d, 0x5e1d], /* CJK Ideograph */
- [0x5e1e, 0x5e1e], /* CJK Ideograph */
- [0x5e1f, 0x5e1f], /* CJK Ideograph */
- [0x5e20, 0x5e20], /* CJK Ideograph */
- [0x5e21, 0x5e21], /* CJK Ideograph */
- [0x5e22, 0x5e22], /* CJK Ideograph */
- [0x5e23, 0x5e23], /* CJK Ideograph */
- [0x5e24, 0x5e24], /* CJK Ideograph */
- [0x5e25, 0x5e25], /* CJK Ideograph */
- [0x5e26, 0x5e26], /* CJK Ideograph */
- [0x5e27, 0x5e27], /* CJK Ideograph */
- [0x5e28, 0x5e28], /* CJK Ideograph */
- [0x5e29, 0x5e29], /* CJK Ideograph */
- [0x5e2a, 0x5e2a], /* CJK Ideograph */
- [0x5e2b, 0x5e2b], /* CJK Ideograph */
- [0x5e2c, 0x5e2c], /* CJK Ideograph */
- [0x5e2d, 0x5e2d], /* CJK Ideograph */
- [0x5e2e, 0x5e2e], /* CJK Ideograph */
- [0x5e2f, 0x5e2f], /* CJK Ideograph */
- [0x5e30, 0x5e30], /* CJK Ideograph */
- [0x5e31, 0x5e31], /* CJK Ideograph */
- [0x5e32, 0x5e32], /* CJK Ideograph */
- [0x5e33, 0x5e33], /* CJK Ideograph */
- [0x5e34, 0x5e34], /* CJK Ideograph */
- [0x5e35, 0x5e35], /* CJK Ideograph */
- [0x5e36, 0x5e36], /* CJK Ideograph */
- [0x5e37, 0x5e37], /* CJK Ideograph */
- [0x5e38, 0x5e38], /* CJK Ideograph */
- [0x5e39, 0x5e39], /* CJK Ideograph */
- [0x5e3a, 0x5e3a], /* CJK Ideograph */
- [0x5e3b, 0x5e3b], /* CJK Ideograph */
- [0x5e3c, 0x5e3c], /* CJK Ideograph */
- [0x5e3d, 0x5e3d], /* CJK Ideograph */
- [0x5e3e, 0x5e3e], /* CJK Ideograph */
- [0x5e3f, 0x5e3f], /* CJK Ideograph */
- [0x5e40, 0x5e40], /* CJK Ideograph */
- [0x5e41, 0x5e41], /* CJK Ideograph */
- [0x5e42, 0x5e42], /* CJK Ideograph */
- [0x5e43, 0x5e43], /* CJK Ideograph */
- [0x5e44, 0x5e44], /* CJK Ideograph */
- [0x5e45, 0x5e45], /* CJK Ideograph */
- [0x5e46, 0x5e46], /* CJK Ideograph */
- [0x5e47, 0x5e47], /* CJK Ideograph */
- [0x5e48, 0x5e48], /* CJK Ideograph */
- [0x5e49, 0x5e49], /* CJK Ideograph */
- [0x5e4a, 0x5e4a], /* CJK Ideograph */
- [0x5e4b, 0x5e4b], /* CJK Ideograph */
- [0x5e4c, 0x5e4c], /* CJK Ideograph */
- [0x5e4d, 0x5e4d], /* CJK Ideograph */
- [0x5e4e, 0x5e4e], /* CJK Ideograph */
- [0x5e4f, 0x5e4f], /* CJK Ideograph */
- [0x5e50, 0x5e50], /* CJK Ideograph */
- [0x5e51, 0x5e51], /* CJK Ideograph */
- [0x5e52, 0x5e52], /* CJK Ideograph */
- [0x5e53, 0x5e53], /* CJK Ideograph */
- [0x5e54, 0x5e54], /* CJK Ideograph */
- [0x5e55, 0x5e55], /* CJK Ideograph */
- [0x5e56, 0x5e56], /* CJK Ideograph */
- [0x5e57, 0x5e57], /* CJK Ideograph */
- [0x5e58, 0x5e58], /* CJK Ideograph */
- [0x5e59, 0x5e59], /* CJK Ideograph */
- [0x5e5a, 0x5e5a], /* CJK Ideograph */
- [0x5e5b, 0x5e5b], /* CJK Ideograph */
- [0x5e5c, 0x5e5c], /* CJK Ideograph */
- [0x5e5d, 0x5e5d], /* CJK Ideograph */
- [0x5e5e, 0x5e5e], /* CJK Ideograph */
- [0x5e5f, 0x5e5f], /* CJK Ideograph */
- [0x5e60, 0x5e60], /* CJK Ideograph */
- [0x5e61, 0x5e61], /* CJK Ideograph */
- [0x5e62, 0x5e62], /* CJK Ideograph */
- [0x5e63, 0x5e63], /* CJK Ideograph */
- [0x5e64, 0x5e64], /* CJK Ideograph */
- [0x5e65, 0x5e65], /* CJK Ideograph */
- [0x5e66, 0x5e66], /* CJK Ideograph */
- [0x5e67, 0x5e67], /* CJK Ideograph */
- [0x5e68, 0x5e68], /* CJK Ideograph */
- [0x5e69, 0x5e69], /* CJK Ideograph */
- [0x5e6a, 0x5e6a], /* CJK Ideograph */
- [0x5e6b, 0x5e6b], /* CJK Ideograph */
- [0x5e6c, 0x5e6c], /* CJK Ideograph */
- [0x5e6d, 0x5e6d], /* CJK Ideograph */
- [0x5e6e, 0x5e6e], /* CJK Ideograph */
- [0x5e6f, 0x5e6f], /* CJK Ideograph */
- [0x5e70, 0x5e70], /* CJK Ideograph */
- [0x5e71, 0x5e71], /* CJK Ideograph */
- [0x5e72, 0x5e72], /* CJK Ideograph */
- [0x5e73, 0x5e73], /* CJK Ideograph */
- [0x5e74, 0x5e74], /* CJK Ideograph */
- [0x5e75, 0x5e75], /* CJK Ideograph */
- [0x5e76, 0x5e76], /* CJK Ideograph */
- [0x5e77, 0x5e77], /* CJK Ideograph */
- [0x5e78, 0x5e78], /* CJK Ideograph */
- [0x5e79, 0x5e79], /* CJK Ideograph */
- [0x5e7a, 0x5e7a], /* CJK Ideograph */
- [0x5e7b, 0x5e7b], /* CJK Ideograph */
- [0x5e7c, 0x5e7c], /* CJK Ideograph */
- [0x5e7d, 0x5e7d], /* CJK Ideograph */
- [0x5e7e, 0x5e7e], /* CJK Ideograph */
- [0x5e7f, 0x5e7f], /* CJK Ideograph */
- [0x5e80, 0x5e80], /* CJK Ideograph */
- [0x5e81, 0x5e81], /* CJK Ideograph */
- [0x5e82, 0x5e82], /* CJK Ideograph */
- [0x5e83, 0x5e83], /* CJK Ideograph */
- [0x5e84, 0x5e84], /* CJK Ideograph */
- [0x5e85, 0x5e85], /* CJK Ideograph */
- [0x5e86, 0x5e86], /* CJK Ideograph */
- [0x5e87, 0x5e87], /* CJK Ideograph */
- [0x5e88, 0x5e88], /* CJK Ideograph */
- [0x5e89, 0x5e89], /* CJK Ideograph */
- [0x5e8a, 0x5e8a], /* CJK Ideograph */
- [0x5e8b, 0x5e8b], /* CJK Ideograph */
- [0x5e8c, 0x5e8c], /* CJK Ideograph */
- [0x5e8d, 0x5e8d], /* CJK Ideograph */
- [0x5e8e, 0x5e8e], /* CJK Ideograph */
- [0x5e8f, 0x5e8f], /* CJK Ideograph */
- [0x5e90, 0x5e90], /* CJK Ideograph */
- [0x5e91, 0x5e91], /* CJK Ideograph */
- [0x5e92, 0x5e92], /* CJK Ideograph */
- [0x5e93, 0x5e93], /* CJK Ideograph */
- [0x5e94, 0x5e94], /* CJK Ideograph */
- [0x5e95, 0x5e95], /* CJK Ideograph */
- [0x5e96, 0x5e96], /* CJK Ideograph */
- [0x5e97, 0x5e97], /* CJK Ideograph */
- [0x5e98, 0x5e98], /* CJK Ideograph */
- [0x5e99, 0x5e99], /* CJK Ideograph */
- [0x5e9a, 0x5e9a], /* CJK Ideograph */
- [0x5e9b, 0x5e9b], /* CJK Ideograph */
- [0x5e9c, 0x5e9c], /* CJK Ideograph */
- [0x5e9d, 0x5e9d], /* CJK Ideograph */
- [0x5e9e, 0x5e9e], /* CJK Ideograph */
- [0x5e9f, 0x5e9f], /* CJK Ideograph */
- [0x5ea0, 0x5ea0], /* CJK Ideograph */
- [0x5ea1, 0x5ea1], /* CJK Ideograph */
- [0x5ea2, 0x5ea2], /* CJK Ideograph */
- [0x5ea3, 0x5ea3], /* CJK Ideograph */
- [0x5ea4, 0x5ea4], /* CJK Ideograph */
- [0x5ea5, 0x5ea5], /* CJK Ideograph */
- [0x5ea6, 0x5ea6], /* CJK Ideograph */
- [0x5ea7, 0x5ea7], /* CJK Ideograph */
- [0x5ea8, 0x5ea8], /* CJK Ideograph */
- [0x5ea9, 0x5ea9], /* CJK Ideograph */
- [0x5eaa, 0x5eaa], /* CJK Ideograph */
- [0x5eab, 0x5eab], /* CJK Ideograph */
- [0x5eac, 0x5eac], /* CJK Ideograph */
- [0x5ead, 0x5ead], /* CJK Ideograph */
- [0x5eae, 0x5eae], /* CJK Ideograph */
- [0x5eaf, 0x5eaf], /* CJK Ideograph */
- [0x5eb0, 0x5eb0], /* CJK Ideograph */
- [0x5eb1, 0x5eb1], /* CJK Ideograph */
- [0x5eb2, 0x5eb2], /* CJK Ideograph */
- [0x5eb3, 0x5eb3], /* CJK Ideograph */
- [0x5eb4, 0x5eb4], /* CJK Ideograph */
- [0x5eb5, 0x5eb5], /* CJK Ideograph */
- [0x5eb6, 0x5eb6], /* CJK Ideograph */
- [0x5eb7, 0x5eb7], /* CJK Ideograph */
- [0x5eb8, 0x5eb8], /* CJK Ideograph */
- [0x5eb9, 0x5eb9], /* CJK Ideograph */
- [0x5eba, 0x5eba], /* CJK Ideograph */
- [0x5ebb, 0x5ebb], /* CJK Ideograph */
- [0x5ebc, 0x5ebc], /* CJK Ideograph */
- [0x5ebd, 0x5ebd], /* CJK Ideograph */
- [0x5ebe, 0x5ebe], /* CJK Ideograph */
- [0x5ebf, 0x5ebf], /* CJK Ideograph */
- [0x5ec0, 0x5ec0], /* CJK Ideograph */
- [0x5ec1, 0x5ec1], /* CJK Ideograph */
- [0x5ec2, 0x5ec2], /* CJK Ideograph */
- [0x5ec3, 0x5ec3], /* CJK Ideograph */
- [0x5ec4, 0x5ec4], /* CJK Ideograph */
- [0x5ec5, 0x5ec5], /* CJK Ideograph */
- [0x5ec6, 0x5ec6], /* CJK Ideograph */
- [0x5ec7, 0x5ec7], /* CJK Ideograph */
- [0x5ec8, 0x5ec8], /* CJK Ideograph */
- [0x5ec9, 0x5ec9], /* CJK Ideograph */
- [0x5eca, 0x5eca], /* CJK Ideograph */
- [0x5ecb, 0x5ecb], /* CJK Ideograph */
- [0x5ecc, 0x5ecc], /* CJK Ideograph */
- [0x5ecd, 0x5ecd], /* CJK Ideograph */
- [0x5ece, 0x5ece], /* CJK Ideograph */
- [0x5ecf, 0x5ecf], /* CJK Ideograph */
- [0x5ed0, 0x5ed0], /* CJK Ideograph */
- [0x5ed1, 0x5ed1], /* CJK Ideograph */
- [0x5ed2, 0x5ed2], /* CJK Ideograph */
- [0x5ed3, 0x5ed3], /* CJK Ideograph */
- [0x5ed4, 0x5ed4], /* CJK Ideograph */
- [0x5ed5, 0x5ed5], /* CJK Ideograph */
- [0x5ed6, 0x5ed6], /* CJK Ideograph */
- [0x5ed7, 0x5ed7], /* CJK Ideograph */
- [0x5ed8, 0x5ed8], /* CJK Ideograph */
- [0x5ed9, 0x5ed9], /* CJK Ideograph */
- [0x5eda, 0x5eda], /* CJK Ideograph */
- [0x5edb, 0x5edb], /* CJK Ideograph */
- [0x5edc, 0x5edc], /* CJK Ideograph */
- [0x5edd, 0x5edd], /* CJK Ideograph */
- [0x5ede, 0x5ede], /* CJK Ideograph */
- [0x5edf, 0x5edf], /* CJK Ideograph */
- [0x5ee0, 0x5ee0], /* CJK Ideograph */
- [0x5ee1, 0x5ee1], /* CJK Ideograph */
- [0x5ee2, 0x5ee2], /* CJK Ideograph */
- [0x5ee3, 0x5ee3], /* CJK Ideograph */
- [0x5ee4, 0x5ee4], /* CJK Ideograph */
- [0x5ee5, 0x5ee5], /* CJK Ideograph */
- [0x5ee6, 0x5ee6], /* CJK Ideograph */
- [0x5ee7, 0x5ee7], /* CJK Ideograph */
- [0x5ee8, 0x5ee8], /* CJK Ideograph */
- [0x5ee9, 0x5ee9], /* CJK Ideograph */
- [0x5eea, 0x5eea], /* CJK Ideograph */
- [0x5eeb, 0x5eeb], /* CJK Ideograph */
- [0x5eec, 0x5eec], /* CJK Ideograph */
- [0x5eed, 0x5eed], /* CJK Ideograph */
- [0x5eee, 0x5eee], /* CJK Ideograph */
- [0x5eef, 0x5eef], /* CJK Ideograph */
- [0x5ef0, 0x5ef0], /* CJK Ideograph */
- [0x5ef1, 0x5ef1], /* CJK Ideograph */
- [0x5ef2, 0x5ef2], /* CJK Ideograph */
- [0x5ef3, 0x5ef3], /* CJK Ideograph */
- [0x5ef4, 0x5ef4], /* CJK Ideograph */
- [0x5ef5, 0x5ef5], /* CJK Ideograph */
- [0x5ef6, 0x5ef6], /* CJK Ideograph */
- [0x5ef7, 0x5ef7], /* CJK Ideograph */
- [0x5ef8, 0x5ef8], /* CJK Ideograph */
- [0x5ef9, 0x5ef9], /* CJK Ideograph */
- [0x5efa, 0x5efa], /* CJK Ideograph */
- [0x5efb, 0x5efb], /* CJK Ideograph */
- [0x5efc, 0x5efc], /* CJK Ideograph */
- [0x5efd, 0x5efd], /* CJK Ideograph */
- [0x5efe, 0x5efe], /* CJK Ideograph */
- [0x5eff, 0x5eff], /* CJK Ideograph */
- [0x5f00, 0x5f00], /* CJK Ideograph */
- [0x5f01, 0x5f01], /* CJK Ideograph */
- [0x5f02, 0x5f02], /* CJK Ideograph */
- [0x5f03, 0x5f03], /* CJK Ideograph */
- [0x5f04, 0x5f04], /* CJK Ideograph */
- [0x5f05, 0x5f05], /* CJK Ideograph */
- [0x5f06, 0x5f06], /* CJK Ideograph */
- [0x5f07, 0x5f07], /* CJK Ideograph */
- [0x5f08, 0x5f08], /* CJK Ideograph */
- [0x5f09, 0x5f09], /* CJK Ideograph */
- [0x5f0a, 0x5f0a], /* CJK Ideograph */
- [0x5f0b, 0x5f0b], /* CJK Ideograph */
- [0x5f0c, 0x5f0c], /* CJK Ideograph */
- [0x5f0d, 0x5f0d], /* CJK Ideograph */
- [0x5f0e, 0x5f0e], /* CJK Ideograph */
- [0x5f0f, 0x5f0f], /* CJK Ideograph */
- [0x5f10, 0x5f10], /* CJK Ideograph */
- [0x5f11, 0x5f11], /* CJK Ideograph */
- [0x5f12, 0x5f12], /* CJK Ideograph */
- [0x5f13, 0x5f13], /* CJK Ideograph */
- [0x5f14, 0x5f14], /* CJK Ideograph */
- [0x5f15, 0x5f15], /* CJK Ideograph */
- [0x5f16, 0x5f16], /* CJK Ideograph */
- [0x5f17, 0x5f17], /* CJK Ideograph */
- [0x5f18, 0x5f18], /* CJK Ideograph */
- [0x5f19, 0x5f19], /* CJK Ideograph */
- [0x5f1a, 0x5f1a], /* CJK Ideograph */
- [0x5f1b, 0x5f1b], /* CJK Ideograph */
- [0x5f1c, 0x5f1c], /* CJK Ideograph */
- [0x5f1d, 0x5f1d], /* CJK Ideograph */
- [0x5f1e, 0x5f1e], /* CJK Ideograph */
- [0x5f1f, 0x5f1f], /* CJK Ideograph */
- [0x5f20, 0x5f20], /* CJK Ideograph */
- [0x5f21, 0x5f21], /* CJK Ideograph */
- [0x5f22, 0x5f22], /* CJK Ideograph */
- [0x5f23, 0x5f23], /* CJK Ideograph */
- [0x5f24, 0x5f24], /* CJK Ideograph */
- [0x5f25, 0x5f25], /* CJK Ideograph */
- [0x5f26, 0x5f26], /* CJK Ideograph */
- [0x5f27, 0x5f27], /* CJK Ideograph */
- [0x5f28, 0x5f28], /* CJK Ideograph */
- [0x5f29, 0x5f29], /* CJK Ideograph */
- [0x5f2a, 0x5f2a], /* CJK Ideograph */
- [0x5f2b, 0x5f2b], /* CJK Ideograph */
- [0x5f2c, 0x5f2c], /* CJK Ideograph */
- [0x5f2d, 0x5f2d], /* CJK Ideograph */
- [0x5f2e, 0x5f2e], /* CJK Ideograph */
- [0x5f2f, 0x5f2f], /* CJK Ideograph */
- [0x5f30, 0x5f30], /* CJK Ideograph */
- [0x5f31, 0x5f31], /* CJK Ideograph */
- [0x5f32, 0x5f32], /* CJK Ideograph */
- [0x5f33, 0x5f33], /* CJK Ideograph */
- [0x5f34, 0x5f34], /* CJK Ideograph */
- [0x5f35, 0x5f35], /* CJK Ideograph */
- [0x5f36, 0x5f36], /* CJK Ideograph */
- [0x5f37, 0x5f37], /* CJK Ideograph */
- [0x5f38, 0x5f38], /* CJK Ideograph */
- [0x5f39, 0x5f39], /* CJK Ideograph */
- [0x5f3a, 0x5f3a], /* CJK Ideograph */
- [0x5f3b, 0x5f3b], /* CJK Ideograph */
- [0x5f3c, 0x5f3c], /* CJK Ideograph */
- [0x5f3d, 0x5f3d], /* CJK Ideograph */
- [0x5f3e, 0x5f3e], /* CJK Ideograph */
- [0x5f3f, 0x5f3f], /* CJK Ideograph */
- [0x5f40, 0x5f40], /* CJK Ideograph */
- [0x5f41, 0x5f41], /* CJK Ideograph */
- [0x5f42, 0x5f42], /* CJK Ideograph */
- [0x5f43, 0x5f43], /* CJK Ideograph */
- [0x5f44, 0x5f44], /* CJK Ideograph */
- [0x5f45, 0x5f45], /* CJK Ideograph */
- [0x5f46, 0x5f46], /* CJK Ideograph */
- [0x5f47, 0x5f47], /* CJK Ideograph */
- [0x5f48, 0x5f48], /* CJK Ideograph */
- [0x5f49, 0x5f49], /* CJK Ideograph */
- [0x5f4a, 0x5f4a], /* CJK Ideograph */
- [0x5f4b, 0x5f4b], /* CJK Ideograph */
- [0x5f4c, 0x5f4c], /* CJK Ideograph */
- [0x5f4d, 0x5f4d], /* CJK Ideograph */
- [0x5f4e, 0x5f4e], /* CJK Ideograph */
- [0x5f4f, 0x5f4f], /* CJK Ideograph */
- [0x5f50, 0x5f50], /* CJK Ideograph */
- [0x5f51, 0x5f51], /* CJK Ideograph */
- [0x5f52, 0x5f52], /* CJK Ideograph */
- [0x5f53, 0x5f53], /* CJK Ideograph */
- [0x5f54, 0x5f54], /* CJK Ideograph */
- [0x5f55, 0x5f55], /* CJK Ideograph */
- [0x5f56, 0x5f56], /* CJK Ideograph */
- [0x5f57, 0x5f57], /* CJK Ideograph */
- [0x5f58, 0x5f58], /* CJK Ideograph */
- [0x5f59, 0x5f59], /* CJK Ideograph */
- [0x5f5a, 0x5f5a], /* CJK Ideograph */
- [0x5f5b, 0x5f5b], /* CJK Ideograph */
- [0x5f5c, 0x5f5c], /* CJK Ideograph */
- [0x5f5d, 0x5f5d], /* CJK Ideograph */
- [0x5f5e, 0x5f5e], /* CJK Ideograph */
- [0x5f5f, 0x5f5f], /* CJK Ideograph */
- [0x5f60, 0x5f60], /* CJK Ideograph */
- [0x5f61, 0x5f61], /* CJK Ideograph */
- [0x5f62, 0x5f62], /* CJK Ideograph */
- [0x5f63, 0x5f63], /* CJK Ideograph */
- [0x5f64, 0x5f64], /* CJK Ideograph */
- [0x5f65, 0x5f65], /* CJK Ideograph */
- [0x5f66, 0x5f66], /* CJK Ideograph */
- [0x5f67, 0x5f67], /* CJK Ideograph */
- [0x5f68, 0x5f68], /* CJK Ideograph */
- [0x5f69, 0x5f69], /* CJK Ideograph */
- [0x5f6a, 0x5f6a], /* CJK Ideograph */
- [0x5f6b, 0x5f6b], /* CJK Ideograph */
- [0x5f6c, 0x5f6c], /* CJK Ideograph */
- [0x5f6d, 0x5f6d], /* CJK Ideograph */
- [0x5f6e, 0x5f6e], /* CJK Ideograph */
- [0x5f6f, 0x5f6f], /* CJK Ideograph */
- [0x5f70, 0x5f70], /* CJK Ideograph */
- [0x5f71, 0x5f71], /* CJK Ideograph */
- [0x5f72, 0x5f72], /* CJK Ideograph */
- [0x5f73, 0x5f73], /* CJK Ideograph */
- [0x5f74, 0x5f74], /* CJK Ideograph */
- [0x5f75, 0x5f75], /* CJK Ideograph */
- [0x5f76, 0x5f76], /* CJK Ideograph */
- [0x5f77, 0x5f77], /* CJK Ideograph */
- [0x5f78, 0x5f78], /* CJK Ideograph */
- [0x5f79, 0x5f79], /* CJK Ideograph */
- [0x5f7a, 0x5f7a], /* CJK Ideograph */
- [0x5f7b, 0x5f7b], /* CJK Ideograph */
- [0x5f7c, 0x5f7c], /* CJK Ideograph */
- [0x5f7d, 0x5f7d], /* CJK Ideograph */
- [0x5f7e, 0x5f7e], /* CJK Ideograph */
- [0x5f7f, 0x5f7f], /* CJK Ideograph */
- [0x5f80, 0x5f80], /* CJK Ideograph */
- [0x5f81, 0x5f81], /* CJK Ideograph */
- [0x5f82, 0x5f82], /* CJK Ideograph */
- [0x5f83, 0x5f83], /* CJK Ideograph */
- [0x5f84, 0x5f84], /* CJK Ideograph */
- [0x5f85, 0x5f85], /* CJK Ideograph */
- [0x5f86, 0x5f86], /* CJK Ideograph */
- [0x5f87, 0x5f87], /* CJK Ideograph */
- [0x5f88, 0x5f88], /* CJK Ideograph */
- [0x5f89, 0x5f89], /* CJK Ideograph */
- [0x5f8a, 0x5f8a], /* CJK Ideograph */
- [0x5f8b, 0x5f8b], /* CJK Ideograph */
- [0x5f8c, 0x5f8c], /* CJK Ideograph */
- [0x5f8d, 0x5f8d], /* CJK Ideograph */
- [0x5f8e, 0x5f8e], /* CJK Ideograph */
- [0x5f8f, 0x5f8f], /* CJK Ideograph */
- [0x5f90, 0x5f90], /* CJK Ideograph */
- [0x5f91, 0x5f91], /* CJK Ideograph */
- [0x5f92, 0x5f92], /* CJK Ideograph */
- [0x5f93, 0x5f93], /* CJK Ideograph */
- [0x5f94, 0x5f94], /* CJK Ideograph */
- [0x5f95, 0x5f95], /* CJK Ideograph */
- [0x5f96, 0x5f96], /* CJK Ideograph */
- [0x5f97, 0x5f97], /* CJK Ideograph */
- [0x5f98, 0x5f98], /* CJK Ideograph */
- [0x5f99, 0x5f99], /* CJK Ideograph */
- [0x5f9a, 0x5f9a], /* CJK Ideograph */
- [0x5f9b, 0x5f9b], /* CJK Ideograph */
- [0x5f9c, 0x5f9c], /* CJK Ideograph */
- [0x5f9d, 0x5f9d], /* CJK Ideograph */
- [0x5f9e, 0x5f9e], /* CJK Ideograph */
- [0x5f9f, 0x5f9f], /* CJK Ideograph */
- [0x5fa0, 0x5fa0], /* CJK Ideograph */
- [0x5fa1, 0x5fa1], /* CJK Ideograph */
- [0x5fa2, 0x5fa2], /* CJK Ideograph */
- [0x5fa3, 0x5fa3], /* CJK Ideograph */
- [0x5fa4, 0x5fa4], /* CJK Ideograph */
- [0x5fa5, 0x5fa5], /* CJK Ideograph */
- [0x5fa6, 0x5fa6], /* CJK Ideograph */
- [0x5fa7, 0x5fa7], /* CJK Ideograph */
- [0x5fa8, 0x5fa8], /* CJK Ideograph */
- [0x5fa9, 0x5fa9], /* CJK Ideograph */
- [0x5faa, 0x5faa], /* CJK Ideograph */
- [0x5fab, 0x5fab], /* CJK Ideograph */
- [0x5fac, 0x5fac], /* CJK Ideograph */
- [0x5fad, 0x5fad], /* CJK Ideograph */
- [0x5fae, 0x5fae], /* CJK Ideograph */
- [0x5faf, 0x5faf], /* CJK Ideograph */
- [0x5fb0, 0x5fb0], /* CJK Ideograph */
- [0x5fb1, 0x5fb1], /* CJK Ideograph */
- [0x5fb2, 0x5fb2], /* CJK Ideograph */
- [0x5fb3, 0x5fb3], /* CJK Ideograph */
- [0x5fb4, 0x5fb4], /* CJK Ideograph */
- [0x5fb5, 0x5fb5], /* CJK Ideograph */
- [0x5fb6, 0x5fb6], /* CJK Ideograph */
- [0x5fb7, 0x5fb7], /* CJK Ideograph */
- [0x5fb8, 0x5fb8], /* CJK Ideograph */
- [0x5fb9, 0x5fb9], /* CJK Ideograph */
- [0x5fba, 0x5fba], /* CJK Ideograph */
- [0x5fbb, 0x5fbb], /* CJK Ideograph */
- [0x5fbc, 0x5fbc], /* CJK Ideograph */
- [0x5fbd, 0x5fbd], /* CJK Ideograph */
- [0x5fbe, 0x5fbe], /* CJK Ideograph */
- [0x5fbf, 0x5fbf], /* CJK Ideograph */
- [0x5fc0, 0x5fc0], /* CJK Ideograph */
- [0x5fc1, 0x5fc1], /* CJK Ideograph */
- [0x5fc2, 0x5fc2], /* CJK Ideograph */
- [0x5fc3, 0x5fc3], /* CJK Ideograph */
- [0x5fc4, 0x5fc4], /* CJK Ideograph */
- [0x5fc5, 0x5fc5], /* CJK Ideograph */
- [0x5fc6, 0x5fc6], /* CJK Ideograph */
- [0x5fc7, 0x5fc7], /* CJK Ideograph */
- [0x5fc8, 0x5fc8], /* CJK Ideograph */
- [0x5fc9, 0x5fc9], /* CJK Ideograph */
- [0x5fca, 0x5fca], /* CJK Ideograph */
- [0x5fcb, 0x5fcb], /* CJK Ideograph */
- [0x5fcc, 0x5fcc], /* CJK Ideograph */
- [0x5fcd, 0x5fcd], /* CJK Ideograph */
- [0x5fce, 0x5fce], /* CJK Ideograph */
- [0x5fcf, 0x5fcf], /* CJK Ideograph */
- [0x5fd0, 0x5fd0], /* CJK Ideograph */
- [0x5fd1, 0x5fd1], /* CJK Ideograph */
- [0x5fd2, 0x5fd2], /* CJK Ideograph */
- [0x5fd3, 0x5fd3], /* CJK Ideograph */
- [0x5fd4, 0x5fd4], /* CJK Ideograph */
- [0x5fd5, 0x5fd5], /* CJK Ideograph */
- [0x5fd6, 0x5fd6], /* CJK Ideograph */
- [0x5fd7, 0x5fd7], /* CJK Ideograph */
- [0x5fd8, 0x5fd8], /* CJK Ideograph */
- [0x5fd9, 0x5fd9], /* CJK Ideograph */
- [0x5fda, 0x5fda], /* CJK Ideograph */
- [0x5fdb, 0x5fdb], /* CJK Ideograph */
- [0x5fdc, 0x5fdc], /* CJK Ideograph */
- [0x5fdd, 0x5fdd], /* CJK Ideograph */
- [0x5fde, 0x5fde], /* CJK Ideograph */
- [0x5fdf, 0x5fdf], /* CJK Ideograph */
- [0x5fe0, 0x5fe0], /* CJK Ideograph */
- [0x5fe1, 0x5fe1], /* CJK Ideograph */
- [0x5fe2, 0x5fe2], /* CJK Ideograph */
- [0x5fe3, 0x5fe3], /* CJK Ideograph */
- [0x5fe4, 0x5fe4], /* CJK Ideograph */
- [0x5fe5, 0x5fe5], /* CJK Ideograph */
- [0x5fe6, 0x5fe6], /* CJK Ideograph */
- [0x5fe7, 0x5fe7], /* CJK Ideograph */
- [0x5fe8, 0x5fe8], /* CJK Ideograph */
- [0x5fe9, 0x5fe9], /* CJK Ideograph */
- [0x5fea, 0x5fea], /* CJK Ideograph */
- [0x5feb, 0x5feb], /* CJK Ideograph */
- [0x5fec, 0x5fec], /* CJK Ideograph */
- [0x5fed, 0x5fed], /* CJK Ideograph */
- [0x5fee, 0x5fee], /* CJK Ideograph */
- [0x5fef, 0x5fef], /* CJK Ideograph */
- [0x5ff0, 0x5ff0], /* CJK Ideograph */
- [0x5ff1, 0x5ff1], /* CJK Ideograph */
- [0x5ff2, 0x5ff2], /* CJK Ideograph */
- [0x5ff3, 0x5ff3], /* CJK Ideograph */
- [0x5ff4, 0x5ff4], /* CJK Ideograph */
- [0x5ff5, 0x5ff5], /* CJK Ideograph */
- [0x5ff6, 0x5ff6], /* CJK Ideograph */
- [0x5ff7, 0x5ff7], /* CJK Ideograph */
- [0x5ff8, 0x5ff8], /* CJK Ideograph */
- [0x5ff9, 0x5ff9], /* CJK Ideograph */
- [0x5ffa, 0x5ffa], /* CJK Ideograph */
- [0x5ffb, 0x5ffb], /* CJK Ideograph */
- [0x5ffc, 0x5ffc], /* CJK Ideograph */
- [0x5ffd, 0x5ffd], /* CJK Ideograph */
- [0x5ffe, 0x5ffe], /* CJK Ideograph */
- [0x5fff, 0x5fff], /* CJK Ideograph */
- [0x6000, 0x6000], /* CJK Ideograph */
- [0x6001, 0x6001], /* CJK Ideograph */
- [0x6002, 0x6002], /* CJK Ideograph */
- [0x6003, 0x6003], /* CJK Ideograph */
- [0x6004, 0x6004], /* CJK Ideograph */
- [0x6005, 0x6005], /* CJK Ideograph */
- [0x6006, 0x6006], /* CJK Ideograph */
- [0x6007, 0x6007], /* CJK Ideograph */
- [0x6008, 0x6008], /* CJK Ideograph */
- [0x6009, 0x6009], /* CJK Ideograph */
- [0x600a, 0x600a], /* CJK Ideograph */
- [0x600b, 0x600b], /* CJK Ideograph */
- [0x600c, 0x600c], /* CJK Ideograph */
- [0x600d, 0x600d], /* CJK Ideograph */
- [0x600e, 0x600e], /* CJK Ideograph */
- [0x600f, 0x600f], /* CJK Ideograph */
- [0x6010, 0x6010], /* CJK Ideograph */
- [0x6011, 0x6011], /* CJK Ideograph */
- [0x6012, 0x6012], /* CJK Ideograph */
- [0x6013, 0x6013], /* CJK Ideograph */
- [0x6014, 0x6014], /* CJK Ideograph */
- [0x6015, 0x6015], /* CJK Ideograph */
- [0x6016, 0x6016], /* CJK Ideograph */
- [0x6017, 0x6017], /* CJK Ideograph */
- [0x6018, 0x6018], /* CJK Ideograph */
- [0x6019, 0x6019], /* CJK Ideograph */
- [0x601a, 0x601a], /* CJK Ideograph */
- [0x601b, 0x601b], /* CJK Ideograph */
- [0x601c, 0x601c], /* CJK Ideograph */
- [0x601d, 0x601d], /* CJK Ideograph */
- [0x601e, 0x601e], /* CJK Ideograph */
- [0x601f, 0x601f], /* CJK Ideograph */
- [0x6020, 0x6020], /* CJK Ideograph */
- [0x6021, 0x6021], /* CJK Ideograph */
- [0x6022, 0x6022], /* CJK Ideograph */
- [0x6023, 0x6023], /* CJK Ideograph */
- [0x6024, 0x6024], /* CJK Ideograph */
- [0x6025, 0x6025], /* CJK Ideograph */
- [0x6026, 0x6026], /* CJK Ideograph */
- [0x6027, 0x6027], /* CJK Ideograph */
- [0x6028, 0x6028], /* CJK Ideograph */
- [0x6029, 0x6029], /* CJK Ideograph */
- [0x602a, 0x602a], /* CJK Ideograph */
- [0x602b, 0x602b], /* CJK Ideograph */
- [0x602c, 0x602c], /* CJK Ideograph */
- [0x602d, 0x602d], /* CJK Ideograph */
- [0x602e, 0x602e], /* CJK Ideograph */
- [0x602f, 0x602f], /* CJK Ideograph */
- [0x6030, 0x6030], /* CJK Ideograph */
- [0x6031, 0x6031], /* CJK Ideograph */
- [0x6032, 0x6032], /* CJK Ideograph */
- [0x6033, 0x6033], /* CJK Ideograph */
- [0x6034, 0x6034], /* CJK Ideograph */
- [0x6035, 0x6035], /* CJK Ideograph */
- [0x6036, 0x6036], /* CJK Ideograph */
- [0x6037, 0x6037], /* CJK Ideograph */
- [0x6038, 0x6038], /* CJK Ideograph */
- [0x6039, 0x6039], /* CJK Ideograph */
- [0x603a, 0x603a], /* CJK Ideograph */
- [0x603b, 0x603b], /* CJK Ideograph */
- [0x603c, 0x603c], /* CJK Ideograph */
- [0x603d, 0x603d], /* CJK Ideograph */
- [0x603e, 0x603e], /* CJK Ideograph */
- [0x603f, 0x603f], /* CJK Ideograph */
- [0x6040, 0x6040], /* CJK Ideograph */
- [0x6041, 0x6041], /* CJK Ideograph */
- [0x6042, 0x6042], /* CJK Ideograph */
- [0x6043, 0x6043], /* CJK Ideograph */
- [0x6044, 0x6044], /* CJK Ideograph */
- [0x6045, 0x6045], /* CJK Ideograph */
- [0x6046, 0x6046], /* CJK Ideograph */
- [0x6047, 0x6047], /* CJK Ideograph */
- [0x6048, 0x6048], /* CJK Ideograph */
- [0x6049, 0x6049], /* CJK Ideograph */
- [0x604a, 0x604a], /* CJK Ideograph */
- [0x604b, 0x604b], /* CJK Ideograph */
- [0x604c, 0x604c], /* CJK Ideograph */
- [0x604d, 0x604d], /* CJK Ideograph */
- [0x604e, 0x604e], /* CJK Ideograph */
- [0x604f, 0x604f], /* CJK Ideograph */
- [0x6050, 0x6050], /* CJK Ideograph */
- [0x6051, 0x6051], /* CJK Ideograph */
- [0x6052, 0x6052], /* CJK Ideograph */
- [0x6053, 0x6053], /* CJK Ideograph */
- [0x6054, 0x6054], /* CJK Ideograph */
- [0x6055, 0x6055], /* CJK Ideograph */
- [0x6056, 0x6056], /* CJK Ideograph */
- [0x6057, 0x6057], /* CJK Ideograph */
- [0x6058, 0x6058], /* CJK Ideograph */
- [0x6059, 0x6059], /* CJK Ideograph */
- [0x605a, 0x605a], /* CJK Ideograph */
- [0x605b, 0x605b], /* CJK Ideograph */
- [0x605c, 0x605c], /* CJK Ideograph */
- [0x605d, 0x605d], /* CJK Ideograph */
- [0x605e, 0x605e], /* CJK Ideograph */
- [0x605f, 0x605f], /* CJK Ideograph */
- [0x6060, 0x6060], /* CJK Ideograph */
- [0x6061, 0x6061], /* CJK Ideograph */
- [0x6062, 0x6062], /* CJK Ideograph */
- [0x6063, 0x6063], /* CJK Ideograph */
- [0x6064, 0x6064], /* CJK Ideograph */
- [0x6065, 0x6065], /* CJK Ideograph */
- [0x6066, 0x6066], /* CJK Ideograph */
- [0x6067, 0x6067], /* CJK Ideograph */
- [0x6068, 0x6068], /* CJK Ideograph */
- [0x6069, 0x6069], /* CJK Ideograph */
- [0x606a, 0x606a], /* CJK Ideograph */
- [0x606b, 0x606b], /* CJK Ideograph */
- [0x606c, 0x606c], /* CJK Ideograph */
- [0x606d, 0x606d], /* CJK Ideograph */
- [0x606e, 0x606e], /* CJK Ideograph */
- [0x606f, 0x606f], /* CJK Ideograph */
- [0x6070, 0x6070], /* CJK Ideograph */
- [0x6071, 0x6071], /* CJK Ideograph */
- [0x6072, 0x6072], /* CJK Ideograph */
- [0x6073, 0x6073], /* CJK Ideograph */
- [0x6074, 0x6074], /* CJK Ideograph */
- [0x6075, 0x6075], /* CJK Ideograph */
- [0x6076, 0x6076], /* CJK Ideograph */
- [0x6077, 0x6077], /* CJK Ideograph */
- [0x6078, 0x6078], /* CJK Ideograph */
- [0x6079, 0x6079], /* CJK Ideograph */
- [0x607a, 0x607a], /* CJK Ideograph */
- [0x607b, 0x607b], /* CJK Ideograph */
- [0x607c, 0x607c], /* CJK Ideograph */
- [0x607d, 0x607d], /* CJK Ideograph */
- [0x607e, 0x607e], /* CJK Ideograph */
- [0x607f, 0x607f], /* CJK Ideograph */
- [0x6080, 0x6080], /* CJK Ideograph */
- [0x6081, 0x6081], /* CJK Ideograph */
- [0x6082, 0x6082], /* CJK Ideograph */
- [0x6083, 0x6083], /* CJK Ideograph */
- [0x6084, 0x6084], /* CJK Ideograph */
- [0x6085, 0x6085], /* CJK Ideograph */
- [0x6086, 0x6086], /* CJK Ideograph */
- [0x6087, 0x6087], /* CJK Ideograph */
- [0x6088, 0x6088], /* CJK Ideograph */
- [0x6089, 0x6089], /* CJK Ideograph */
- [0x608a, 0x608a], /* CJK Ideograph */
- [0x608b, 0x608b], /* CJK Ideograph */
- [0x608c, 0x608c], /* CJK Ideograph */
- [0x608d, 0x608d], /* CJK Ideograph */
- [0x608e, 0x608e], /* CJK Ideograph */
- [0x608f, 0x608f], /* CJK Ideograph */
- [0x6090, 0x6090], /* CJK Ideograph */
- [0x6091, 0x6091], /* CJK Ideograph */
- [0x6092, 0x6092], /* CJK Ideograph */
- [0x6093, 0x6093], /* CJK Ideograph */
- [0x6094, 0x6094], /* CJK Ideograph */
- [0x6095, 0x6095], /* CJK Ideograph */
- [0x6096, 0x6096], /* CJK Ideograph */
- [0x6097, 0x6097], /* CJK Ideograph */
- [0x6098, 0x6098], /* CJK Ideograph */
- [0x6099, 0x6099], /* CJK Ideograph */
- [0x609a, 0x609a], /* CJK Ideograph */
- [0x609b, 0x609b], /* CJK Ideograph */
- [0x609c, 0x609c], /* CJK Ideograph */
- [0x609d, 0x609d], /* CJK Ideograph */
- [0x609e, 0x609e], /* CJK Ideograph */
- [0x609f, 0x609f], /* CJK Ideograph */
- [0x60a0, 0x60a0], /* CJK Ideograph */
- [0x60a1, 0x60a1], /* CJK Ideograph */
- [0x60a2, 0x60a2], /* CJK Ideograph */
- [0x60a3, 0x60a3], /* CJK Ideograph */
- [0x60a4, 0x60a4], /* CJK Ideograph */
- [0x60a5, 0x60a5], /* CJK Ideograph */
- [0x60a6, 0x60a6], /* CJK Ideograph */
- [0x60a7, 0x60a7], /* CJK Ideograph */
- [0x60a8, 0x60a8], /* CJK Ideograph */
- [0x60a9, 0x60a9], /* CJK Ideograph */
- [0x60aa, 0x60aa], /* CJK Ideograph */
- [0x60ab, 0x60ab], /* CJK Ideograph */
- [0x60ac, 0x60ac], /* CJK Ideograph */
- [0x60ad, 0x60ad], /* CJK Ideograph */
- [0x60ae, 0x60ae], /* CJK Ideograph */
- [0x60af, 0x60af], /* CJK Ideograph */
- [0x60b0, 0x60b0], /* CJK Ideograph */
- [0x60b1, 0x60b1], /* CJK Ideograph */
- [0x60b2, 0x60b2], /* CJK Ideograph */
- [0x60b3, 0x60b3], /* CJK Ideograph */
- [0x60b4, 0x60b4], /* CJK Ideograph */
- [0x60b5, 0x60b5], /* CJK Ideograph */
- [0x60b6, 0x60b6], /* CJK Ideograph */
- [0x60b7, 0x60b7], /* CJK Ideograph */
- [0x60b8, 0x60b8], /* CJK Ideograph */
- [0x60b9, 0x60b9], /* CJK Ideograph */
- [0x60ba, 0x60ba], /* CJK Ideograph */
- [0x60bb, 0x60bb], /* CJK Ideograph */
- [0x60bc, 0x60bc], /* CJK Ideograph */
- [0x60bd, 0x60bd], /* CJK Ideograph */
- [0x60be, 0x60be], /* CJK Ideograph */
- [0x60bf, 0x60bf], /* CJK Ideograph */
- [0x60c0, 0x60c0], /* CJK Ideograph */
- [0x60c1, 0x60c1], /* CJK Ideograph */
- [0x60c2, 0x60c2], /* CJK Ideograph */
- [0x60c3, 0x60c3], /* CJK Ideograph */
- [0x60c4, 0x60c4], /* CJK Ideograph */
- [0x60c5, 0x60c5], /* CJK Ideograph */
- [0x60c6, 0x60c6], /* CJK Ideograph */
- [0x60c7, 0x60c7], /* CJK Ideograph */
- [0x60c8, 0x60c8], /* CJK Ideograph */
- [0x60c9, 0x60c9], /* CJK Ideograph */
- [0x60ca, 0x60ca], /* CJK Ideograph */
- [0x60cb, 0x60cb], /* CJK Ideograph */
- [0x60cc, 0x60cc], /* CJK Ideograph */
- [0x60cd, 0x60cd], /* CJK Ideograph */
- [0x60ce, 0x60ce], /* CJK Ideograph */
- [0x60cf, 0x60cf], /* CJK Ideograph */
- [0x60d0, 0x60d0], /* CJK Ideograph */
- [0x60d1, 0x60d1], /* CJK Ideograph */
- [0x60d2, 0x60d2], /* CJK Ideograph */
- [0x60d3, 0x60d3], /* CJK Ideograph */
- [0x60d4, 0x60d4], /* CJK Ideograph */
- [0x60d5, 0x60d5], /* CJK Ideograph */
- [0x60d6, 0x60d6], /* CJK Ideograph */
- [0x60d7, 0x60d7], /* CJK Ideograph */
- [0x60d8, 0x60d8], /* CJK Ideograph */
- [0x60d9, 0x60d9], /* CJK Ideograph */
- [0x60da, 0x60da], /* CJK Ideograph */
- [0x60db, 0x60db], /* CJK Ideograph */
- [0x60dc, 0x60dc], /* CJK Ideograph */
- [0x60dd, 0x60dd], /* CJK Ideograph */
- [0x60de, 0x60de], /* CJK Ideograph */
- [0x60df, 0x60df], /* CJK Ideograph */
- [0x60e0, 0x60e0], /* CJK Ideograph */
- [0x60e1, 0x60e1], /* CJK Ideograph */
- [0x60e2, 0x60e2], /* CJK Ideograph */
- [0x60e3, 0x60e3], /* CJK Ideograph */
- [0x60e4, 0x60e4], /* CJK Ideograph */
- [0x60e5, 0x60e5], /* CJK Ideograph */
- [0x60e6, 0x60e6], /* CJK Ideograph */
- [0x60e7, 0x60e7], /* CJK Ideograph */
- [0x60e8, 0x60e8], /* CJK Ideograph */
- [0x60e9, 0x60e9], /* CJK Ideograph */
- [0x60ea, 0x60ea], /* CJK Ideograph */
- [0x60eb, 0x60eb], /* CJK Ideograph */
- [0x60ec, 0x60ec], /* CJK Ideograph */
- [0x60ed, 0x60ed], /* CJK Ideograph */
- [0x60ee, 0x60ee], /* CJK Ideograph */
- [0x60ef, 0x60ef], /* CJK Ideograph */
- [0x60f0, 0x60f0], /* CJK Ideograph */
- [0x60f1, 0x60f1], /* CJK Ideograph */
- [0x60f2, 0x60f2], /* CJK Ideograph */
- [0x60f3, 0x60f3], /* CJK Ideograph */
- [0x60f4, 0x60f4], /* CJK Ideograph */
- [0x60f5, 0x60f5], /* CJK Ideograph */
- [0x60f6, 0x60f6], /* CJK Ideograph */
- [0x60f7, 0x60f7], /* CJK Ideograph */
- [0x60f8, 0x60f8], /* CJK Ideograph */
- [0x60f9, 0x60f9], /* CJK Ideograph */
- [0x60fa, 0x60fa], /* CJK Ideograph */
- [0x60fb, 0x60fb], /* CJK Ideograph */
- [0x60fc, 0x60fc], /* CJK Ideograph */
- [0x60fd, 0x60fd], /* CJK Ideograph */
- [0x60fe, 0x60fe], /* CJK Ideograph */
- [0x60ff, 0x60ff], /* CJK Ideograph */
- [0x6100, 0x6100], /* CJK Ideograph */
- [0x6101, 0x6101], /* CJK Ideograph */
- [0x6102, 0x6102], /* CJK Ideograph */
- [0x6103, 0x6103], /* CJK Ideograph */
- [0x6104, 0x6104], /* CJK Ideograph */
- [0x6105, 0x6105], /* CJK Ideograph */
- [0x6106, 0x6106], /* CJK Ideograph */
- [0x6107, 0x6107], /* CJK Ideograph */
- [0x6108, 0x6108], /* CJK Ideograph */
- [0x6109, 0x6109], /* CJK Ideograph */
- [0x610a, 0x610a], /* CJK Ideograph */
- [0x610b, 0x610b], /* CJK Ideograph */
- [0x610c, 0x610c], /* CJK Ideograph */
- [0x610d, 0x610d], /* CJK Ideograph */
- [0x610e, 0x610e], /* CJK Ideograph */
- [0x610f, 0x610f], /* CJK Ideograph */
- [0x6110, 0x6110], /* CJK Ideograph */
- [0x6111, 0x6111], /* CJK Ideograph */
- [0x6112, 0x6112], /* CJK Ideograph */
- [0x6113, 0x6113], /* CJK Ideograph */
- [0x6114, 0x6114], /* CJK Ideograph */
- [0x6115, 0x6115], /* CJK Ideograph */
- [0x6116, 0x6116], /* CJK Ideograph */
- [0x6117, 0x6117], /* CJK Ideograph */
- [0x6118, 0x6118], /* CJK Ideograph */
- [0x6119, 0x6119], /* CJK Ideograph */
- [0x611a, 0x611a], /* CJK Ideograph */
- [0x611b, 0x611b], /* CJK Ideograph */
- [0x611c, 0x611c], /* CJK Ideograph */
- [0x611d, 0x611d], /* CJK Ideograph */
- [0x611e, 0x611e], /* CJK Ideograph */
- [0x611f, 0x611f], /* CJK Ideograph */
- [0x6120, 0x6120], /* CJK Ideograph */
- [0x6121, 0x6121], /* CJK Ideograph */
- [0x6122, 0x6122], /* CJK Ideograph */
- [0x6123, 0x6123], /* CJK Ideograph */
- [0x6124, 0x6124], /* CJK Ideograph */
- [0x6125, 0x6125], /* CJK Ideograph */
- [0x6126, 0x6126], /* CJK Ideograph */
- [0x6127, 0x6127], /* CJK Ideograph */
- [0x6128, 0x6128], /* CJK Ideograph */
- [0x6129, 0x6129], /* CJK Ideograph */
- [0x612a, 0x612a], /* CJK Ideograph */
- [0x612b, 0x612b], /* CJK Ideograph */
- [0x612c, 0x612c], /* CJK Ideograph */
- [0x612d, 0x612d], /* CJK Ideograph */
- [0x612e, 0x612e], /* CJK Ideograph */
- [0x612f, 0x612f], /* CJK Ideograph */
- [0x6130, 0x6130], /* CJK Ideograph */
- [0x6131, 0x6131], /* CJK Ideograph */
- [0x6132, 0x6132], /* CJK Ideograph */
- [0x6133, 0x6133], /* CJK Ideograph */
- [0x6134, 0x6134], /* CJK Ideograph */
- [0x6135, 0x6135], /* CJK Ideograph */
- [0x6136, 0x6136], /* CJK Ideograph */
- [0x6137, 0x6137], /* CJK Ideograph */
- [0x6138, 0x6138], /* CJK Ideograph */
- [0x6139, 0x6139], /* CJK Ideograph */
- [0x613a, 0x613a], /* CJK Ideograph */
- [0x613b, 0x613b], /* CJK Ideograph */
- [0x613c, 0x613c], /* CJK Ideograph */
- [0x613d, 0x613d], /* CJK Ideograph */
- [0x613e, 0x613e], /* CJK Ideograph */
- [0x613f, 0x613f], /* CJK Ideograph */
- [0x6140, 0x6140], /* CJK Ideograph */
- [0x6141, 0x6141], /* CJK Ideograph */
- [0x6142, 0x6142], /* CJK Ideograph */
- [0x6143, 0x6143], /* CJK Ideograph */
- [0x6144, 0x6144], /* CJK Ideograph */
- [0x6145, 0x6145], /* CJK Ideograph */
- [0x6146, 0x6146], /* CJK Ideograph */
- [0x6147, 0x6147], /* CJK Ideograph */
- [0x6148, 0x6148], /* CJK Ideograph */
- [0x6149, 0x6149], /* CJK Ideograph */
- [0x614a, 0x614a], /* CJK Ideograph */
- [0x614b, 0x614b], /* CJK Ideograph */
- [0x614c, 0x614c], /* CJK Ideograph */
- [0x614d, 0x614d], /* CJK Ideograph */
- [0x614e, 0x614e], /* CJK Ideograph */
- [0x614f, 0x614f], /* CJK Ideograph */
- [0x6150, 0x6150], /* CJK Ideograph */
- [0x6151, 0x6151], /* CJK Ideograph */
- [0x6152, 0x6152], /* CJK Ideograph */
- [0x6153, 0x6153], /* CJK Ideograph */
- [0x6154, 0x6154], /* CJK Ideograph */
- [0x6155, 0x6155], /* CJK Ideograph */
- [0x6156, 0x6156], /* CJK Ideograph */
- [0x6157, 0x6157], /* CJK Ideograph */
- [0x6158, 0x6158], /* CJK Ideograph */
- [0x6159, 0x6159], /* CJK Ideograph */
- [0x615a, 0x615a], /* CJK Ideograph */
- [0x615b, 0x615b], /* CJK Ideograph */
- [0x615c, 0x615c], /* CJK Ideograph */
- [0x615d, 0x615d], /* CJK Ideograph */
- [0x615e, 0x615e], /* CJK Ideograph */
- [0x615f, 0x615f], /* CJK Ideograph */
- [0x6160, 0x6160], /* CJK Ideograph */
- [0x6161, 0x6161], /* CJK Ideograph */
- [0x6162, 0x6162], /* CJK Ideograph */
- [0x6163, 0x6163], /* CJK Ideograph */
- [0x6164, 0x6164], /* CJK Ideograph */
- [0x6165, 0x6165], /* CJK Ideograph */
- [0x6166, 0x6166], /* CJK Ideograph */
- [0x6167, 0x6167], /* CJK Ideograph */
- [0x6168, 0x6168], /* CJK Ideograph */
- [0x6169, 0x6169], /* CJK Ideograph */
- [0x616a, 0x616a], /* CJK Ideograph */
- [0x616b, 0x616b], /* CJK Ideograph */
- [0x616c, 0x616c], /* CJK Ideograph */
- [0x616d, 0x616d], /* CJK Ideograph */
- [0x616e, 0x616e], /* CJK Ideograph */
- [0x616f, 0x616f], /* CJK Ideograph */
- [0x6170, 0x6170], /* CJK Ideograph */
- [0x6171, 0x6171], /* CJK Ideograph */
- [0x6172, 0x6172], /* CJK Ideograph */
- [0x6173, 0x6173], /* CJK Ideograph */
- [0x6174, 0x6174], /* CJK Ideograph */
- [0x6175, 0x6175], /* CJK Ideograph */
- [0x6176, 0x6176], /* CJK Ideograph */
- [0x6177, 0x6177], /* CJK Ideograph */
- [0x6178, 0x6178], /* CJK Ideograph */
- [0x6179, 0x6179], /* CJK Ideograph */
- [0x617a, 0x617a], /* CJK Ideograph */
- [0x617b, 0x617b], /* CJK Ideograph */
- [0x617c, 0x617c], /* CJK Ideograph */
- [0x617d, 0x617d], /* CJK Ideograph */
- [0x617e, 0x617e], /* CJK Ideograph */
- [0x617f, 0x617f], /* CJK Ideograph */
- [0x6180, 0x6180], /* CJK Ideograph */
- [0x6181, 0x6181], /* CJK Ideograph */
- [0x6182, 0x6182], /* CJK Ideograph */
- [0x6183, 0x6183], /* CJK Ideograph */
- [0x6184, 0x6184], /* CJK Ideograph */
- [0x6185, 0x6185], /* CJK Ideograph */
- [0x6186, 0x6186], /* CJK Ideograph */
- [0x6187, 0x6187], /* CJK Ideograph */
- [0x6188, 0x6188], /* CJK Ideograph */
- [0x6189, 0x6189], /* CJK Ideograph */
- [0x618a, 0x618a], /* CJK Ideograph */
- [0x618b, 0x618b], /* CJK Ideograph */
- [0x618c, 0x618c], /* CJK Ideograph */
- [0x618d, 0x618d], /* CJK Ideograph */
- [0x618e, 0x618e], /* CJK Ideograph */
- [0x618f, 0x618f], /* CJK Ideograph */
- [0x6190, 0x6190], /* CJK Ideograph */
- [0x6191, 0x6191], /* CJK Ideograph */
- [0x6192, 0x6192], /* CJK Ideograph */
- [0x6193, 0x6193], /* CJK Ideograph */
- [0x6194, 0x6194], /* CJK Ideograph */
- [0x6195, 0x6195], /* CJK Ideograph */
- [0x6196, 0x6196], /* CJK Ideograph */
- [0x6197, 0x6197], /* CJK Ideograph */
- [0x6198, 0x6198], /* CJK Ideograph */
- [0x6199, 0x6199], /* CJK Ideograph */
- [0x619a, 0x619a], /* CJK Ideograph */
- [0x619b, 0x619b], /* CJK Ideograph */
- [0x619c, 0x619c], /* CJK Ideograph */
- [0x619d, 0x619d], /* CJK Ideograph */
- [0x619e, 0x619e], /* CJK Ideograph */
- [0x619f, 0x619f], /* CJK Ideograph */
- [0x61a0, 0x61a0], /* CJK Ideograph */
- [0x61a1, 0x61a1], /* CJK Ideograph */
- [0x61a2, 0x61a2], /* CJK Ideograph */
- [0x61a3, 0x61a3], /* CJK Ideograph */
- [0x61a4, 0x61a4], /* CJK Ideograph */
- [0x61a5, 0x61a5], /* CJK Ideograph */
- [0x61a6, 0x61a6], /* CJK Ideograph */
- [0x61a7, 0x61a7], /* CJK Ideograph */
- [0x61a8, 0x61a8], /* CJK Ideograph */
- [0x61a9, 0x61a9], /* CJK Ideograph */
- [0x61aa, 0x61aa], /* CJK Ideograph */
- [0x61ab, 0x61ab], /* CJK Ideograph */
- [0x61ac, 0x61ac], /* CJK Ideograph */
- [0x61ad, 0x61ad], /* CJK Ideograph */
- [0x61ae, 0x61ae], /* CJK Ideograph */
- [0x61af, 0x61af], /* CJK Ideograph */
- [0x61b0, 0x61b0], /* CJK Ideograph */
- [0x61b1, 0x61b1], /* CJK Ideograph */
- [0x61b2, 0x61b2], /* CJK Ideograph */
- [0x61b3, 0x61b3], /* CJK Ideograph */
- [0x61b4, 0x61b4], /* CJK Ideograph */
- [0x61b5, 0x61b5], /* CJK Ideograph */
- [0x61b6, 0x61b6], /* CJK Ideograph */
- [0x61b7, 0x61b7], /* CJK Ideograph */
- [0x61b8, 0x61b8], /* CJK Ideograph */
- [0x61b9, 0x61b9], /* CJK Ideograph */
- [0x61ba, 0x61ba], /* CJK Ideograph */
- [0x61bb, 0x61bb], /* CJK Ideograph */
- [0x61bc, 0x61bc], /* CJK Ideograph */
- [0x61bd, 0x61bd], /* CJK Ideograph */
- [0x61be, 0x61be], /* CJK Ideograph */
- [0x61bf, 0x61bf], /* CJK Ideograph */
- [0x61c0, 0x61c0], /* CJK Ideograph */
- [0x61c1, 0x61c1], /* CJK Ideograph */
- [0x61c2, 0x61c2], /* CJK Ideograph */
- [0x61c3, 0x61c3], /* CJK Ideograph */
- [0x61c4, 0x61c4], /* CJK Ideograph */
- [0x61c5, 0x61c5], /* CJK Ideograph */
- [0x61c6, 0x61c6], /* CJK Ideograph */
- [0x61c7, 0x61c7], /* CJK Ideograph */
- [0x61c8, 0x61c8], /* CJK Ideograph */
- [0x61c9, 0x61c9], /* CJK Ideograph */
- [0x61ca, 0x61ca], /* CJK Ideograph */
- [0x61cb, 0x61cb], /* CJK Ideograph */
- [0x61cc, 0x61cc], /* CJK Ideograph */
- [0x61cd, 0x61cd], /* CJK Ideograph */
- [0x61ce, 0x61ce], /* CJK Ideograph */
- [0x61cf, 0x61cf], /* CJK Ideograph */
- [0x61d0, 0x61d0], /* CJK Ideograph */
- [0x61d1, 0x61d1], /* CJK Ideograph */
- [0x61d2, 0x61d2], /* CJK Ideograph */
- [0x61d3, 0x61d3], /* CJK Ideograph */
- [0x61d4, 0x61d4], /* CJK Ideograph */
- [0x61d5, 0x61d5], /* CJK Ideograph */
- [0x61d6, 0x61d6], /* CJK Ideograph */
- [0x61d7, 0x61d7], /* CJK Ideograph */
- [0x61d8, 0x61d8], /* CJK Ideograph */
- [0x61d9, 0x61d9], /* CJK Ideograph */
- [0x61da, 0x61da], /* CJK Ideograph */
- [0x61db, 0x61db], /* CJK Ideograph */
- [0x61dc, 0x61dc], /* CJK Ideograph */
- [0x61dd, 0x61dd], /* CJK Ideograph */
- [0x61de, 0x61de], /* CJK Ideograph */
- [0x61df, 0x61df], /* CJK Ideograph */
- [0x61e0, 0x61e0], /* CJK Ideograph */
- [0x61e1, 0x61e1], /* CJK Ideograph */
- [0x61e2, 0x61e2], /* CJK Ideograph */
- [0x61e3, 0x61e3], /* CJK Ideograph */
- [0x61e4, 0x61e4], /* CJK Ideograph */
- [0x61e5, 0x61e5], /* CJK Ideograph */
- [0x61e6, 0x61e6], /* CJK Ideograph */
- [0x61e7, 0x61e7], /* CJK Ideograph */
- [0x61e8, 0x61e8], /* CJK Ideograph */
- [0x61e9, 0x61e9], /* CJK Ideograph */
- [0x61ea, 0x61ea], /* CJK Ideograph */
- [0x61eb, 0x61eb], /* CJK Ideograph */
- [0x61ec, 0x61ec], /* CJK Ideograph */
- [0x61ed, 0x61ed], /* CJK Ideograph */
- [0x61ee, 0x61ee], /* CJK Ideograph */
- [0x61ef, 0x61ef], /* CJK Ideograph */
- [0x61f0, 0x61f0], /* CJK Ideograph */
- [0x61f1, 0x61f1], /* CJK Ideograph */
- [0x61f2, 0x61f2], /* CJK Ideograph */
- [0x61f3, 0x61f3], /* CJK Ideograph */
- [0x61f4, 0x61f4], /* CJK Ideograph */
- [0x61f5, 0x61f5], /* CJK Ideograph */
- [0x61f6, 0x61f6], /* CJK Ideograph */
- [0x61f7, 0x61f7], /* CJK Ideograph */
- [0x61f8, 0x61f8], /* CJK Ideograph */
- [0x61f9, 0x61f9], /* CJK Ideograph */
- [0x61fa, 0x61fa], /* CJK Ideograph */
- [0x61fb, 0x61fb], /* CJK Ideograph */
- [0x61fc, 0x61fc], /* CJK Ideograph */
- [0x61fd, 0x61fd], /* CJK Ideograph */
- [0x61fe, 0x61fe], /* CJK Ideograph */
- [0x61ff, 0x61ff], /* CJK Ideograph */
- [0x6200, 0x6200], /* CJK Ideograph */
- [0x6201, 0x6201], /* CJK Ideograph */
- [0x6202, 0x6202], /* CJK Ideograph */
- [0x6203, 0x6203], /* CJK Ideograph */
- [0x6204, 0x6204], /* CJK Ideograph */
- [0x6205, 0x6205], /* CJK Ideograph */
- [0x6206, 0x6206], /* CJK Ideograph */
- [0x6207, 0x6207], /* CJK Ideograph */
- [0x6208, 0x6208], /* CJK Ideograph */
- [0x6209, 0x6209], /* CJK Ideograph */
- [0x620a, 0x620a], /* CJK Ideograph */
- [0x620b, 0x620b], /* CJK Ideograph */
- [0x620c, 0x620c], /* CJK Ideograph */
- [0x620d, 0x620d], /* CJK Ideograph */
- [0x620e, 0x620e], /* CJK Ideograph */
- [0x620f, 0x620f], /* CJK Ideograph */
- [0x6210, 0x6210], /* CJK Ideograph */
- [0x6211, 0x6211], /* CJK Ideograph */
- [0x6212, 0x6212], /* CJK Ideograph */
- [0x6213, 0x6213], /* CJK Ideograph */
- [0x6214, 0x6214], /* CJK Ideograph */
- [0x6215, 0x6215], /* CJK Ideograph */
- [0x6216, 0x6216], /* CJK Ideograph */
- [0x6217, 0x6217], /* CJK Ideograph */
- [0x6218, 0x6218], /* CJK Ideograph */
- [0x6219, 0x6219], /* CJK Ideograph */
- [0x621a, 0x621a], /* CJK Ideograph */
- [0x621b, 0x621b], /* CJK Ideograph */
- [0x621c, 0x621c], /* CJK Ideograph */
- [0x621d, 0x621d], /* CJK Ideograph */
- [0x621e, 0x621e], /* CJK Ideograph */
- [0x621f, 0x621f], /* CJK Ideograph */
- [0x6220, 0x6220], /* CJK Ideograph */
- [0x6221, 0x6221], /* CJK Ideograph */
- [0x6222, 0x6222], /* CJK Ideograph */
- [0x6223, 0x6223], /* CJK Ideograph */
- [0x6224, 0x6224], /* CJK Ideograph */
- [0x6225, 0x6225], /* CJK Ideograph */
- [0x6226, 0x6226], /* CJK Ideograph */
- [0x6227, 0x6227], /* CJK Ideograph */
- [0x6228, 0x6228], /* CJK Ideograph */
- [0x6229, 0x6229], /* CJK Ideograph */
- [0x622a, 0x622a], /* CJK Ideograph */
- [0x622b, 0x622b], /* CJK Ideograph */
- [0x622c, 0x622c], /* CJK Ideograph */
- [0x622d, 0x622d], /* CJK Ideograph */
- [0x622e, 0x622e], /* CJK Ideograph */
- [0x622f, 0x622f], /* CJK Ideograph */
- [0x6230, 0x6230], /* CJK Ideograph */
- [0x6231, 0x6231], /* CJK Ideograph */
- [0x6232, 0x6232], /* CJK Ideograph */
- [0x6233, 0x6233], /* CJK Ideograph */
- [0x6234, 0x6234], /* CJK Ideograph */
- [0x6235, 0x6235], /* CJK Ideograph */
- [0x6236, 0x6236], /* CJK Ideograph */
- [0x6237, 0x6237], /* CJK Ideograph */
- [0x6238, 0x6238], /* CJK Ideograph */
- [0x6239, 0x6239], /* CJK Ideograph */
- [0x623a, 0x623a], /* CJK Ideograph */
- [0x623b, 0x623b], /* CJK Ideograph */
- [0x623c, 0x623c], /* CJK Ideograph */
- [0x623d, 0x623d], /* CJK Ideograph */
- [0x623e, 0x623e], /* CJK Ideograph */
- [0x623f, 0x623f], /* CJK Ideograph */
- [0x6240, 0x6240], /* CJK Ideograph */
- [0x6241, 0x6241], /* CJK Ideograph */
- [0x6242, 0x6242], /* CJK Ideograph */
- [0x6243, 0x6243], /* CJK Ideograph */
- [0x6244, 0x6244], /* CJK Ideograph */
- [0x6245, 0x6245], /* CJK Ideograph */
- [0x6246, 0x6246], /* CJK Ideograph */
- [0x6247, 0x6247], /* CJK Ideograph */
- [0x6248, 0x6248], /* CJK Ideograph */
- [0x6249, 0x6249], /* CJK Ideograph */
- [0x624a, 0x624a], /* CJK Ideograph */
- [0x624b, 0x624b], /* CJK Ideograph */
- [0x624c, 0x624c], /* CJK Ideograph */
- [0x624d, 0x624d], /* CJK Ideograph */
- [0x624e, 0x624e], /* CJK Ideograph */
- [0x624f, 0x624f], /* CJK Ideograph */
- [0x6250, 0x6250], /* CJK Ideograph */
- [0x6251, 0x6251], /* CJK Ideograph */
- [0x6252, 0x6252], /* CJK Ideograph */
- [0x6253, 0x6253], /* CJK Ideograph */
- [0x6254, 0x6254], /* CJK Ideograph */
- [0x6255, 0x6255], /* CJK Ideograph */
- [0x6256, 0x6256], /* CJK Ideograph */
- [0x6257, 0x6257], /* CJK Ideograph */
- [0x6258, 0x6258], /* CJK Ideograph */
- [0x6259, 0x6259], /* CJK Ideograph */
- [0x625a, 0x625a], /* CJK Ideograph */
- [0x625b, 0x625b], /* CJK Ideograph */
- [0x625c, 0x625c], /* CJK Ideograph */
- [0x625d, 0x625d], /* CJK Ideograph */
- [0x625e, 0x625e], /* CJK Ideograph */
- [0x625f, 0x625f], /* CJK Ideograph */
- [0x6260, 0x6260], /* CJK Ideograph */
- [0x6261, 0x6261], /* CJK Ideograph */
- [0x6262, 0x6262], /* CJK Ideograph */
- [0x6263, 0x6263], /* CJK Ideograph */
- [0x6264, 0x6264], /* CJK Ideograph */
- [0x6265, 0x6265], /* CJK Ideograph */
- [0x6266, 0x6266], /* CJK Ideograph */
- [0x6267, 0x6267], /* CJK Ideograph */
- [0x6268, 0x6268], /* CJK Ideograph */
- [0x6269, 0x6269], /* CJK Ideograph */
- [0x626a, 0x626a], /* CJK Ideograph */
- [0x626b, 0x626b], /* CJK Ideograph */
- [0x626c, 0x626c], /* CJK Ideograph */
- [0x626d, 0x626d], /* CJK Ideograph */
- [0x626e, 0x626e], /* CJK Ideograph */
- [0x626f, 0x626f], /* CJK Ideograph */
- [0x6270, 0x6270], /* CJK Ideograph */
- [0x6271, 0x6271], /* CJK Ideograph */
- [0x6272, 0x6272], /* CJK Ideograph */
- [0x6273, 0x6273], /* CJK Ideograph */
- [0x6274, 0x6274], /* CJK Ideograph */
- [0x6275, 0x6275], /* CJK Ideograph */
- [0x6276, 0x6276], /* CJK Ideograph */
- [0x6277, 0x6277], /* CJK Ideograph */
- [0x6278, 0x6278], /* CJK Ideograph */
- [0x6279, 0x6279], /* CJK Ideograph */
- [0x627a, 0x627a], /* CJK Ideograph */
- [0x627b, 0x627b], /* CJK Ideograph */
- [0x627c, 0x627c], /* CJK Ideograph */
- [0x627d, 0x627d], /* CJK Ideograph */
- [0x627e, 0x627e], /* CJK Ideograph */
- [0x627f, 0x627f], /* CJK Ideograph */
- [0x6280, 0x6280], /* CJK Ideograph */
- [0x6281, 0x6281], /* CJK Ideograph */
- [0x6282, 0x6282], /* CJK Ideograph */
- [0x6283, 0x6283], /* CJK Ideograph */
- [0x6284, 0x6284], /* CJK Ideograph */
- [0x6285, 0x6285], /* CJK Ideograph */
- [0x6286, 0x6286], /* CJK Ideograph */
- [0x6287, 0x6287], /* CJK Ideograph */
- [0x6288, 0x6288], /* CJK Ideograph */
- [0x6289, 0x6289], /* CJK Ideograph */
- [0x628a, 0x628a], /* CJK Ideograph */
- [0x628b, 0x628b], /* CJK Ideograph */
- [0x628c, 0x628c], /* CJK Ideograph */
- [0x628d, 0x628d], /* CJK Ideograph */
- [0x628e, 0x628e], /* CJK Ideograph */
- [0x628f, 0x628f], /* CJK Ideograph */
- [0x6290, 0x6290], /* CJK Ideograph */
- [0x6291, 0x6291], /* CJK Ideograph */
- [0x6292, 0x6292], /* CJK Ideograph */
- [0x6293, 0x6293], /* CJK Ideograph */
- [0x6294, 0x6294], /* CJK Ideograph */
- [0x6295, 0x6295], /* CJK Ideograph */
- [0x6296, 0x6296], /* CJK Ideograph */
- [0x6297, 0x6297], /* CJK Ideograph */
- [0x6298, 0x6298], /* CJK Ideograph */
- [0x6299, 0x6299], /* CJK Ideograph */
- [0x629a, 0x629a], /* CJK Ideograph */
- [0x629b, 0x629b], /* CJK Ideograph */
- [0x629c, 0x629c], /* CJK Ideograph */
- [0x629d, 0x629d], /* CJK Ideograph */
- [0x629e, 0x629e], /* CJK Ideograph */
- [0x629f, 0x629f], /* CJK Ideograph */
- [0x62a0, 0x62a0], /* CJK Ideograph */
- [0x62a1, 0x62a1], /* CJK Ideograph */
- [0x62a2, 0x62a2], /* CJK Ideograph */
- [0x62a3, 0x62a3], /* CJK Ideograph */
- [0x62a4, 0x62a4], /* CJK Ideograph */
- [0x62a5, 0x62a5], /* CJK Ideograph */
- [0x62a6, 0x62a6], /* CJK Ideograph */
- [0x62a7, 0x62a7], /* CJK Ideograph */
- [0x62a8, 0x62a8], /* CJK Ideograph */
- [0x62a9, 0x62a9], /* CJK Ideograph */
- [0x62aa, 0x62aa], /* CJK Ideograph */
- [0x62ab, 0x62ab], /* CJK Ideograph */
- [0x62ac, 0x62ac], /* CJK Ideograph */
- [0x62ad, 0x62ad], /* CJK Ideograph */
- [0x62ae, 0x62ae], /* CJK Ideograph */
- [0x62af, 0x62af], /* CJK Ideograph */
- [0x62b0, 0x62b0], /* CJK Ideograph */
- [0x62b1, 0x62b1], /* CJK Ideograph */
- [0x62b2, 0x62b2], /* CJK Ideograph */
- [0x62b3, 0x62b3], /* CJK Ideograph */
- [0x62b4, 0x62b4], /* CJK Ideograph */
- [0x62b5, 0x62b5], /* CJK Ideograph */
- [0x62b6, 0x62b6], /* CJK Ideograph */
- [0x62b7, 0x62b7], /* CJK Ideograph */
- [0x62b8, 0x62b8], /* CJK Ideograph */
- [0x62b9, 0x62b9], /* CJK Ideograph */
- [0x62ba, 0x62ba], /* CJK Ideograph */
- [0x62bb, 0x62bb], /* CJK Ideograph */
- [0x62bc, 0x62bc], /* CJK Ideograph */
- [0x62bd, 0x62bd], /* CJK Ideograph */
- [0x62be, 0x62be], /* CJK Ideograph */
- [0x62bf, 0x62bf], /* CJK Ideograph */
- [0x62c0, 0x62c0], /* CJK Ideograph */
- [0x62c1, 0x62c1], /* CJK Ideograph */
- [0x62c2, 0x62c2], /* CJK Ideograph */
- [0x62c3, 0x62c3], /* CJK Ideograph */
- [0x62c4, 0x62c4], /* CJK Ideograph */
- [0x62c5, 0x62c5], /* CJK Ideograph */
- [0x62c6, 0x62c6], /* CJK Ideograph */
- [0x62c7, 0x62c7], /* CJK Ideograph */
- [0x62c8, 0x62c8], /* CJK Ideograph */
- [0x62c9, 0x62c9], /* CJK Ideograph */
- [0x62ca, 0x62ca], /* CJK Ideograph */
- [0x62cb, 0x62cb], /* CJK Ideograph */
- [0x62cc, 0x62cc], /* CJK Ideograph */
- [0x62cd, 0x62cd], /* CJK Ideograph */
- [0x62ce, 0x62ce], /* CJK Ideograph */
- [0x62cf, 0x62cf], /* CJK Ideograph */
- [0x62d0, 0x62d0], /* CJK Ideograph */
- [0x62d1, 0x62d1], /* CJK Ideograph */
- [0x62d2, 0x62d2], /* CJK Ideograph */
- [0x62d3, 0x62d3], /* CJK Ideograph */
- [0x62d4, 0x62d4], /* CJK Ideograph */
- [0x62d5, 0x62d5], /* CJK Ideograph */
- [0x62d6, 0x62d6], /* CJK Ideograph */
- [0x62d7, 0x62d7], /* CJK Ideograph */
- [0x62d8, 0x62d8], /* CJK Ideograph */
- [0x62d9, 0x62d9], /* CJK Ideograph */
- [0x62da, 0x62da], /* CJK Ideograph */
- [0x62db, 0x62db], /* CJK Ideograph */
- [0x62dc, 0x62dc], /* CJK Ideograph */
- [0x62dd, 0x62dd], /* CJK Ideograph */
- [0x62de, 0x62de], /* CJK Ideograph */
- [0x62df, 0x62df], /* CJK Ideograph */
- [0x62e0, 0x62e0], /* CJK Ideograph */
- [0x62e1, 0x62e1], /* CJK Ideograph */
- [0x62e2, 0x62e2], /* CJK Ideograph */
- [0x62e3, 0x62e3], /* CJK Ideograph */
- [0x62e4, 0x62e4], /* CJK Ideograph */
- [0x62e5, 0x62e5], /* CJK Ideograph */
- [0x62e6, 0x62e6], /* CJK Ideograph */
- [0x62e7, 0x62e7], /* CJK Ideograph */
- [0x62e8, 0x62e8], /* CJK Ideograph */
- [0x62e9, 0x62e9], /* CJK Ideograph */
- [0x62ea, 0x62ea], /* CJK Ideograph */
- [0x62eb, 0x62eb], /* CJK Ideograph */
- [0x62ec, 0x62ec], /* CJK Ideograph */
- [0x62ed, 0x62ed], /* CJK Ideograph */
- [0x62ee, 0x62ee], /* CJK Ideograph */
- [0x62ef, 0x62ef], /* CJK Ideograph */
- [0x62f0, 0x62f0], /* CJK Ideograph */
- [0x62f1, 0x62f1], /* CJK Ideograph */
- [0x62f2, 0x62f2], /* CJK Ideograph */
- [0x62f3, 0x62f3], /* CJK Ideograph */
- [0x62f4, 0x62f4], /* CJK Ideograph */
- [0x62f5, 0x62f5], /* CJK Ideograph */
- [0x62f6, 0x62f6], /* CJK Ideograph */
- [0x62f7, 0x62f7], /* CJK Ideograph */
- [0x62f8, 0x62f8], /* CJK Ideograph */
- [0x62f9, 0x62f9], /* CJK Ideograph */
- [0x62fa, 0x62fa], /* CJK Ideograph */
- [0x62fb, 0x62fb], /* CJK Ideograph */
- [0x62fc, 0x62fc], /* CJK Ideograph */
- [0x62fd, 0x62fd], /* CJK Ideograph */
- [0x62fe, 0x62fe], /* CJK Ideograph */
- [0x62ff, 0x62ff], /* CJK Ideograph */
- [0x6300, 0x6300], /* CJK Ideograph */
- [0x6301, 0x6301], /* CJK Ideograph */
- [0x6302, 0x6302], /* CJK Ideograph */
- [0x6303, 0x6303], /* CJK Ideograph */
- [0x6304, 0x6304], /* CJK Ideograph */
- [0x6305, 0x6305], /* CJK Ideograph */
- [0x6306, 0x6306], /* CJK Ideograph */
- [0x6307, 0x6307], /* CJK Ideograph */
- [0x6308, 0x6308], /* CJK Ideograph */
- [0x6309, 0x6309], /* CJK Ideograph */
- [0x630a, 0x630a], /* CJK Ideograph */
- [0x630b, 0x630b], /* CJK Ideograph */
- [0x630c, 0x630c], /* CJK Ideograph */
- [0x630d, 0x630d], /* CJK Ideograph */
- [0x630e, 0x630e], /* CJK Ideograph */
- [0x630f, 0x630f], /* CJK Ideograph */
- [0x6310, 0x6310], /* CJK Ideograph */
- [0x6311, 0x6311], /* CJK Ideograph */
- [0x6312, 0x6312], /* CJK Ideograph */
- [0x6313, 0x6313], /* CJK Ideograph */
- [0x6314, 0x6314], /* CJK Ideograph */
- [0x6315, 0x6315], /* CJK Ideograph */
- [0x6316, 0x6316], /* CJK Ideograph */
- [0x6317, 0x6317], /* CJK Ideograph */
- [0x6318, 0x6318], /* CJK Ideograph */
- [0x6319, 0x6319], /* CJK Ideograph */
- [0x631a, 0x631a], /* CJK Ideograph */
- [0x631b, 0x631b], /* CJK Ideograph */
- [0x631c, 0x631c], /* CJK Ideograph */
- [0x631d, 0x631d], /* CJK Ideograph */
- [0x631e, 0x631e], /* CJK Ideograph */
- [0x631f, 0x631f], /* CJK Ideograph */
- [0x6320, 0x6320], /* CJK Ideograph */
- [0x6321, 0x6321], /* CJK Ideograph */
- [0x6322, 0x6322], /* CJK Ideograph */
- [0x6323, 0x6323], /* CJK Ideograph */
- [0x6324, 0x6324], /* CJK Ideograph */
- [0x6325, 0x6325], /* CJK Ideograph */
- [0x6326, 0x6326], /* CJK Ideograph */
- [0x6327, 0x6327], /* CJK Ideograph */
- [0x6328, 0x6328], /* CJK Ideograph */
- [0x6329, 0x6329], /* CJK Ideograph */
- [0x632a, 0x632a], /* CJK Ideograph */
- [0x632b, 0x632b], /* CJK Ideograph */
- [0x632c, 0x632c], /* CJK Ideograph */
- [0x632d, 0x632d], /* CJK Ideograph */
- [0x632e, 0x632e], /* CJK Ideograph */
- [0x632f, 0x632f], /* CJK Ideograph */
- [0x6330, 0x6330], /* CJK Ideograph */
- [0x6331, 0x6331], /* CJK Ideograph */
- [0x6332, 0x6332], /* CJK Ideograph */
- [0x6333, 0x6333], /* CJK Ideograph */
- [0x6334, 0x6334], /* CJK Ideograph */
- [0x6335, 0x6335], /* CJK Ideograph */
- [0x6336, 0x6336], /* CJK Ideograph */
- [0x6337, 0x6337], /* CJK Ideograph */
- [0x6338, 0x6338], /* CJK Ideograph */
- [0x6339, 0x6339], /* CJK Ideograph */
- [0x633a, 0x633a], /* CJK Ideograph */
- [0x633b, 0x633b], /* CJK Ideograph */
- [0x633c, 0x633c], /* CJK Ideograph */
- [0x633d, 0x633d], /* CJK Ideograph */
- [0x633e, 0x633e], /* CJK Ideograph */
- [0x633f, 0x633f], /* CJK Ideograph */
- [0x6340, 0x6340], /* CJK Ideograph */
- [0x6341, 0x6341], /* CJK Ideograph */
- [0x6342, 0x6342], /* CJK Ideograph */
- [0x6343, 0x6343], /* CJK Ideograph */
- [0x6344, 0x6344], /* CJK Ideograph */
- [0x6345, 0x6345], /* CJK Ideograph */
- [0x6346, 0x6346], /* CJK Ideograph */
- [0x6347, 0x6347], /* CJK Ideograph */
- [0x6348, 0x6348], /* CJK Ideograph */
- [0x6349, 0x6349], /* CJK Ideograph */
- [0x634a, 0x634a], /* CJK Ideograph */
- [0x634b, 0x634b], /* CJK Ideograph */
- [0x634c, 0x634c], /* CJK Ideograph */
- [0x634d, 0x634d], /* CJK Ideograph */
- [0x634e, 0x634e], /* CJK Ideograph */
- [0x634f, 0x634f], /* CJK Ideograph */
- [0x6350, 0x6350], /* CJK Ideograph */
- [0x6351, 0x6351], /* CJK Ideograph */
- [0x6352, 0x6352], /* CJK Ideograph */
- [0x6353, 0x6353], /* CJK Ideograph */
- [0x6354, 0x6354], /* CJK Ideograph */
- [0x6355, 0x6355], /* CJK Ideograph */
- [0x6356, 0x6356], /* CJK Ideograph */
- [0x6357, 0x6357], /* CJK Ideograph */
- [0x6358, 0x6358], /* CJK Ideograph */
- [0x6359, 0x6359], /* CJK Ideograph */
- [0x635a, 0x635a], /* CJK Ideograph */
- [0x635b, 0x635b], /* CJK Ideograph */
- [0x635c, 0x635c], /* CJK Ideograph */
- [0x635d, 0x635d], /* CJK Ideograph */
- [0x635e, 0x635e], /* CJK Ideograph */
- [0x635f, 0x635f], /* CJK Ideograph */
- [0x6360, 0x6360], /* CJK Ideograph */
- [0x6361, 0x6361], /* CJK Ideograph */
- [0x6362, 0x6362], /* CJK Ideograph */
- [0x6363, 0x6363], /* CJK Ideograph */
- [0x6364, 0x6364], /* CJK Ideograph */
- [0x6365, 0x6365], /* CJK Ideograph */
- [0x6366, 0x6366], /* CJK Ideograph */
- [0x6367, 0x6367], /* CJK Ideograph */
- [0x6368, 0x6368], /* CJK Ideograph */
- [0x6369, 0x6369], /* CJK Ideograph */
- [0x636a, 0x636a], /* CJK Ideograph */
- [0x636b, 0x636b], /* CJK Ideograph */
- [0x636c, 0x636c], /* CJK Ideograph */
- [0x636d, 0x636d], /* CJK Ideograph */
- [0x636e, 0x636e], /* CJK Ideograph */
- [0x636f, 0x636f], /* CJK Ideograph */
- [0x6370, 0x6370], /* CJK Ideograph */
- [0x6371, 0x6371], /* CJK Ideograph */
- [0x6372, 0x6372], /* CJK Ideograph */
- [0x6373, 0x6373], /* CJK Ideograph */
- [0x6374, 0x6374], /* CJK Ideograph */
- [0x6375, 0x6375], /* CJK Ideograph */
- [0x6376, 0x6376], /* CJK Ideograph */
- [0x6377, 0x6377], /* CJK Ideograph */
- [0x6378, 0x6378], /* CJK Ideograph */
- [0x6379, 0x6379], /* CJK Ideograph */
- [0x637a, 0x637a], /* CJK Ideograph */
- [0x637b, 0x637b], /* CJK Ideograph */
- [0x637c, 0x637c], /* CJK Ideograph */
- [0x637d, 0x637d], /* CJK Ideograph */
- [0x637e, 0x637e], /* CJK Ideograph */
- [0x637f, 0x637f], /* CJK Ideograph */
- [0x6380, 0x6380], /* CJK Ideograph */
- [0x6381, 0x6381], /* CJK Ideograph */
- [0x6382, 0x6382], /* CJK Ideograph */
- [0x6383, 0x6383], /* CJK Ideograph */
- [0x6384, 0x6384], /* CJK Ideograph */
- [0x6385, 0x6385], /* CJK Ideograph */
- [0x6386, 0x6386], /* CJK Ideograph */
- [0x6387, 0x6387], /* CJK Ideograph */
- [0x6388, 0x6388], /* CJK Ideograph */
- [0x6389, 0x6389], /* CJK Ideograph */
- [0x638a, 0x638a], /* CJK Ideograph */
- [0x638b, 0x638b], /* CJK Ideograph */
- [0x638c, 0x638c], /* CJK Ideograph */
- [0x638d, 0x638d], /* CJK Ideograph */
- [0x638e, 0x638e], /* CJK Ideograph */
- [0x638f, 0x638f], /* CJK Ideograph */
- [0x6390, 0x6390], /* CJK Ideograph */
- [0x6391, 0x6391], /* CJK Ideograph */
- [0x6392, 0x6392], /* CJK Ideograph */
- [0x6393, 0x6393], /* CJK Ideograph */
- [0x6394, 0x6394], /* CJK Ideograph */
- [0x6395, 0x6395], /* CJK Ideograph */
- [0x6396, 0x6396], /* CJK Ideograph */
- [0x6397, 0x6397], /* CJK Ideograph */
- [0x6398, 0x6398], /* CJK Ideograph */
- [0x6399, 0x6399], /* CJK Ideograph */
- [0x639a, 0x639a], /* CJK Ideograph */
- [0x639b, 0x639b], /* CJK Ideograph */
- [0x639c, 0x639c], /* CJK Ideograph */
- [0x639d, 0x639d], /* CJK Ideograph */
- [0x639e, 0x639e], /* CJK Ideograph */
- [0x639f, 0x639f], /* CJK Ideograph */
- [0x63a0, 0x63a0], /* CJK Ideograph */
- [0x63a1, 0x63a1], /* CJK Ideograph */
- [0x63a2, 0x63a2], /* CJK Ideograph */
- [0x63a3, 0x63a3], /* CJK Ideograph */
- [0x63a4, 0x63a4], /* CJK Ideograph */
- [0x63a5, 0x63a5], /* CJK Ideograph */
- [0x63a6, 0x63a6], /* CJK Ideograph */
- [0x63a7, 0x63a7], /* CJK Ideograph */
- [0x63a8, 0x63a8], /* CJK Ideograph */
- [0x63a9, 0x63a9], /* CJK Ideograph */
- [0x63aa, 0x63aa], /* CJK Ideograph */
- [0x63ab, 0x63ab], /* CJK Ideograph */
- [0x63ac, 0x63ac], /* CJK Ideograph */
- [0x63ad, 0x63ad], /* CJK Ideograph */
- [0x63ae, 0x63ae], /* CJK Ideograph */
- [0x63af, 0x63af], /* CJK Ideograph */
- [0x63b0, 0x63b0], /* CJK Ideograph */
- [0x63b1, 0x63b1], /* CJK Ideograph */
- [0x63b2, 0x63b2], /* CJK Ideograph */
- [0x63b3, 0x63b3], /* CJK Ideograph */
- [0x63b4, 0x63b4], /* CJK Ideograph */
- [0x63b5, 0x63b5], /* CJK Ideograph */
- [0x63b6, 0x63b6], /* CJK Ideograph */
- [0x63b7, 0x63b7], /* CJK Ideograph */
- [0x63b8, 0x63b8], /* CJK Ideograph */
- [0x63b9, 0x63b9], /* CJK Ideograph */
- [0x63ba, 0x63ba], /* CJK Ideograph */
- [0x63bb, 0x63bb], /* CJK Ideograph */
- [0x63bc, 0x63bc], /* CJK Ideograph */
- [0x63bd, 0x63bd], /* CJK Ideograph */
- [0x63be, 0x63be], /* CJK Ideograph */
- [0x63bf, 0x63bf], /* CJK Ideograph */
- [0x63c0, 0x63c0], /* CJK Ideograph */
- [0x63c1, 0x63c1], /* CJK Ideograph */
- [0x63c2, 0x63c2], /* CJK Ideograph */
- [0x63c3, 0x63c3], /* CJK Ideograph */
- [0x63c4, 0x63c4], /* CJK Ideograph */
- [0x63c5, 0x63c5], /* CJK Ideograph */
- [0x63c6, 0x63c6], /* CJK Ideograph */
- [0x63c7, 0x63c7], /* CJK Ideograph */
- [0x63c8, 0x63c8], /* CJK Ideograph */
- [0x63c9, 0x63c9], /* CJK Ideograph */
- [0x63ca, 0x63ca], /* CJK Ideograph */
- [0x63cb, 0x63cb], /* CJK Ideograph */
- [0x63cc, 0x63cc], /* CJK Ideograph */
- [0x63cd, 0x63cd], /* CJK Ideograph */
- [0x63ce, 0x63ce], /* CJK Ideograph */
- [0x63cf, 0x63cf], /* CJK Ideograph */
- [0x63d0, 0x63d0], /* CJK Ideograph */
- [0x63d1, 0x63d1], /* CJK Ideograph */
- [0x63d2, 0x63d2], /* CJK Ideograph */
- [0x63d3, 0x63d3], /* CJK Ideograph */
- [0x63d4, 0x63d4], /* CJK Ideograph */
- [0x63d5, 0x63d5], /* CJK Ideograph */
- [0x63d6, 0x63d6], /* CJK Ideograph */
- [0x63d7, 0x63d7], /* CJK Ideograph */
- [0x63d8, 0x63d8], /* CJK Ideograph */
- [0x63d9, 0x63d9], /* CJK Ideograph */
- [0x63da, 0x63da], /* CJK Ideograph */
- [0x63db, 0x63db], /* CJK Ideograph */
- [0x63dc, 0x63dc], /* CJK Ideograph */
- [0x63dd, 0x63dd], /* CJK Ideograph */
- [0x63de, 0x63de], /* CJK Ideograph */
- [0x63df, 0x63df], /* CJK Ideograph */
- [0x63e0, 0x63e0], /* CJK Ideograph */
- [0x63e1, 0x63e1], /* CJK Ideograph */
- [0x63e2, 0x63e2], /* CJK Ideograph */
- [0x63e3, 0x63e3], /* CJK Ideograph */
- [0x63e4, 0x63e4], /* CJK Ideograph */
- [0x63e5, 0x63e5], /* CJK Ideograph */
- [0x63e6, 0x63e6], /* CJK Ideograph */
- [0x63e7, 0x63e7], /* CJK Ideograph */
- [0x63e8, 0x63e8], /* CJK Ideograph */
- [0x63e9, 0x63e9], /* CJK Ideograph */
- [0x63ea, 0x63ea], /* CJK Ideograph */
- [0x63eb, 0x63eb], /* CJK Ideograph */
- [0x63ec, 0x63ec], /* CJK Ideograph */
- [0x63ed, 0x63ed], /* CJK Ideograph */
- [0x63ee, 0x63ee], /* CJK Ideograph */
- [0x63ef, 0x63ef], /* CJK Ideograph */
- [0x63f0, 0x63f0], /* CJK Ideograph */
- [0x63f1, 0x63f1], /* CJK Ideograph */
- [0x63f2, 0x63f2], /* CJK Ideograph */
- [0x63f3, 0x63f3], /* CJK Ideograph */
- [0x63f4, 0x63f4], /* CJK Ideograph */
- [0x63f5, 0x63f5], /* CJK Ideograph */
- [0x63f6, 0x63f6], /* CJK Ideograph */
- [0x63f7, 0x63f7], /* CJK Ideograph */
- [0x63f8, 0x63f8], /* CJK Ideograph */
- [0x63f9, 0x63f9], /* CJK Ideograph */
- [0x63fa, 0x63fa], /* CJK Ideograph */
- [0x63fb, 0x63fb], /* CJK Ideograph */
- [0x63fc, 0x63fc], /* CJK Ideograph */
- [0x63fd, 0x63fd], /* CJK Ideograph */
- [0x63fe, 0x63fe], /* CJK Ideograph */
- [0x63ff, 0x63ff], /* CJK Ideograph */
- [0x6400, 0x6400], /* CJK Ideograph */
- [0x6401, 0x6401], /* CJK Ideograph */
- [0x6402, 0x6402], /* CJK Ideograph */
- [0x6403, 0x6403], /* CJK Ideograph */
- [0x6404, 0x6404], /* CJK Ideograph */
- [0x6405, 0x6405], /* CJK Ideograph */
- [0x6406, 0x6406], /* CJK Ideograph */
- [0x6407, 0x6407], /* CJK Ideograph */
- [0x6408, 0x6408], /* CJK Ideograph */
- [0x6409, 0x6409], /* CJK Ideograph */
- [0x640a, 0x640a], /* CJK Ideograph */
- [0x640b, 0x640b], /* CJK Ideograph */
- [0x640c, 0x640c], /* CJK Ideograph */
- [0x640d, 0x640d], /* CJK Ideograph */
- [0x640e, 0x640e], /* CJK Ideograph */
- [0x640f, 0x640f], /* CJK Ideograph */
- [0x6410, 0x6410], /* CJK Ideograph */
- [0x6411, 0x6411], /* CJK Ideograph */
- [0x6412, 0x6412], /* CJK Ideograph */
- [0x6413, 0x6413], /* CJK Ideograph */
- [0x6414, 0x6414], /* CJK Ideograph */
- [0x6415, 0x6415], /* CJK Ideograph */
- [0x6416, 0x6416], /* CJK Ideograph */
- [0x6417, 0x6417], /* CJK Ideograph */
- [0x6418, 0x6418], /* CJK Ideograph */
- [0x6419, 0x6419], /* CJK Ideograph */
- [0x641a, 0x641a], /* CJK Ideograph */
- [0x641b, 0x641b], /* CJK Ideograph */
- [0x641c, 0x641c], /* CJK Ideograph */
- [0x641d, 0x641d], /* CJK Ideograph */
- [0x641e, 0x641e], /* CJK Ideograph */
- [0x641f, 0x641f], /* CJK Ideograph */
- [0x6420, 0x6420], /* CJK Ideograph */
- [0x6421, 0x6421], /* CJK Ideograph */
- [0x6422, 0x6422], /* CJK Ideograph */
- [0x6423, 0x6423], /* CJK Ideograph */
- [0x6424, 0x6424], /* CJK Ideograph */
- [0x6425, 0x6425], /* CJK Ideograph */
- [0x6426, 0x6426], /* CJK Ideograph */
- [0x6427, 0x6427], /* CJK Ideograph */
- [0x6428, 0x6428], /* CJK Ideograph */
- [0x6429, 0x6429], /* CJK Ideograph */
- [0x642a, 0x642a], /* CJK Ideograph */
- [0x642b, 0x642b], /* CJK Ideograph */
- [0x642c, 0x642c], /* CJK Ideograph */
- [0x642d, 0x642d], /* CJK Ideograph */
- [0x642e, 0x642e], /* CJK Ideograph */
- [0x642f, 0x642f], /* CJK Ideograph */
- [0x6430, 0x6430], /* CJK Ideograph */
- [0x6431, 0x6431], /* CJK Ideograph */
- [0x6432, 0x6432], /* CJK Ideograph */
- [0x6433, 0x6433], /* CJK Ideograph */
- [0x6434, 0x6434], /* CJK Ideograph */
- [0x6435, 0x6435], /* CJK Ideograph */
- [0x6436, 0x6436], /* CJK Ideograph */
- [0x6437, 0x6437], /* CJK Ideograph */
- [0x6438, 0x6438], /* CJK Ideograph */
- [0x6439, 0x6439], /* CJK Ideograph */
- [0x643a, 0x643a], /* CJK Ideograph */
- [0x643b, 0x643b], /* CJK Ideograph */
- [0x643c, 0x643c], /* CJK Ideograph */
- [0x643d, 0x643d], /* CJK Ideograph */
- [0x643e, 0x643e], /* CJK Ideograph */
- [0x643f, 0x643f], /* CJK Ideograph */
- [0x6440, 0x6440], /* CJK Ideograph */
- [0x6441, 0x6441], /* CJK Ideograph */
- [0x6442, 0x6442], /* CJK Ideograph */
- [0x6443, 0x6443], /* CJK Ideograph */
- [0x6444, 0x6444], /* CJK Ideograph */
- [0x6445, 0x6445], /* CJK Ideograph */
- [0x6446, 0x6446], /* CJK Ideograph */
- [0x6447, 0x6447], /* CJK Ideograph */
- [0x6448, 0x6448], /* CJK Ideograph */
- [0x6449, 0x6449], /* CJK Ideograph */
- [0x644a, 0x644a], /* CJK Ideograph */
- [0x644b, 0x644b], /* CJK Ideograph */
- [0x644c, 0x644c], /* CJK Ideograph */
- [0x644d, 0x644d], /* CJK Ideograph */
- [0x644e, 0x644e], /* CJK Ideograph */
- [0x644f, 0x644f], /* CJK Ideograph */
- [0x6450, 0x6450], /* CJK Ideograph */
- [0x6451, 0x6451], /* CJK Ideograph */
- [0x6452, 0x6452], /* CJK Ideograph */
- [0x6453, 0x6453], /* CJK Ideograph */
- [0x6454, 0x6454], /* CJK Ideograph */
- [0x6455, 0x6455], /* CJK Ideograph */
- [0x6456, 0x6456], /* CJK Ideograph */
- [0x6457, 0x6457], /* CJK Ideograph */
- [0x6458, 0x6458], /* CJK Ideograph */
- [0x6459, 0x6459], /* CJK Ideograph */
- [0x645a, 0x645a], /* CJK Ideograph */
- [0x645b, 0x645b], /* CJK Ideograph */
- [0x645c, 0x645c], /* CJK Ideograph */
- [0x645d, 0x645d], /* CJK Ideograph */
- [0x645e, 0x645e], /* CJK Ideograph */
- [0x645f, 0x645f], /* CJK Ideograph */
- [0x6460, 0x6460], /* CJK Ideograph */
- [0x6461, 0x6461], /* CJK Ideograph */
- [0x6462, 0x6462], /* CJK Ideograph */
- [0x6463, 0x6463], /* CJK Ideograph */
- [0x6464, 0x6464], /* CJK Ideograph */
- [0x6465, 0x6465], /* CJK Ideograph */
- [0x6466, 0x6466], /* CJK Ideograph */
- [0x6467, 0x6467], /* CJK Ideograph */
- [0x6468, 0x6468], /* CJK Ideograph */
- [0x6469, 0x6469], /* CJK Ideograph */
- [0x646a, 0x646a], /* CJK Ideograph */
- [0x646b, 0x646b], /* CJK Ideograph */
- [0x646c, 0x646c], /* CJK Ideograph */
- [0x646d, 0x646d], /* CJK Ideograph */
- [0x646e, 0x646e], /* CJK Ideograph */
- [0x646f, 0x646f], /* CJK Ideograph */
- [0x6470, 0x6470], /* CJK Ideograph */
- [0x6471, 0x6471], /* CJK Ideograph */
- [0x6472, 0x6472], /* CJK Ideograph */
- [0x6473, 0x6473], /* CJK Ideograph */
- [0x6474, 0x6474], /* CJK Ideograph */
- [0x6475, 0x6475], /* CJK Ideograph */
- [0x6476, 0x6476], /* CJK Ideograph */
- [0x6477, 0x6477], /* CJK Ideograph */
- [0x6478, 0x6478], /* CJK Ideograph */
- [0x6479, 0x6479], /* CJK Ideograph */
- [0x647a, 0x647a], /* CJK Ideograph */
- [0x647b, 0x647b], /* CJK Ideograph */
- [0x647c, 0x647c], /* CJK Ideograph */
- [0x647d, 0x647d], /* CJK Ideograph */
- [0x647e, 0x647e], /* CJK Ideograph */
- [0x647f, 0x647f], /* CJK Ideograph */
- [0x6480, 0x6480], /* CJK Ideograph */
- [0x6481, 0x6481], /* CJK Ideograph */
- [0x6482, 0x6482], /* CJK Ideograph */
- [0x6483, 0x6483], /* CJK Ideograph */
- [0x6484, 0x6484], /* CJK Ideograph */
- [0x6485, 0x6485], /* CJK Ideograph */
- [0x6486, 0x6486], /* CJK Ideograph */
- [0x6487, 0x6487], /* CJK Ideograph */
- [0x6488, 0x6488], /* CJK Ideograph */
- [0x6489, 0x6489], /* CJK Ideograph */
- [0x648a, 0x648a], /* CJK Ideograph */
- [0x648b, 0x648b], /* CJK Ideograph */
- [0x648c, 0x648c], /* CJK Ideograph */
- [0x648d, 0x648d], /* CJK Ideograph */
- [0x648e, 0x648e], /* CJK Ideograph */
- [0x648f, 0x648f], /* CJK Ideograph */
- [0x6490, 0x6490], /* CJK Ideograph */
- [0x6491, 0x6491], /* CJK Ideograph */
- [0x6492, 0x6492], /* CJK Ideograph */
- [0x6493, 0x6493], /* CJK Ideograph */
- [0x6494, 0x6494], /* CJK Ideograph */
- [0x6495, 0x6495], /* CJK Ideograph */
- [0x6496, 0x6496], /* CJK Ideograph */
- [0x6497, 0x6497], /* CJK Ideograph */
- [0x6498, 0x6498], /* CJK Ideograph */
- [0x6499, 0x6499], /* CJK Ideograph */
- [0x649a, 0x649a], /* CJK Ideograph */
- [0x649b, 0x649b], /* CJK Ideograph */
- [0x649c, 0x649c], /* CJK Ideograph */
- [0x649d, 0x649d], /* CJK Ideograph */
- [0x649e, 0x649e], /* CJK Ideograph */
- [0x649f, 0x649f], /* CJK Ideograph */
- [0x64a0, 0x64a0], /* CJK Ideograph */
- [0x64a1, 0x64a1], /* CJK Ideograph */
- [0x64a2, 0x64a2], /* CJK Ideograph */
- [0x64a3, 0x64a3], /* CJK Ideograph */
- [0x64a4, 0x64a4], /* CJK Ideograph */
- [0x64a5, 0x64a5], /* CJK Ideograph */
- [0x64a6, 0x64a6], /* CJK Ideograph */
- [0x64a7, 0x64a7], /* CJK Ideograph */
- [0x64a8, 0x64a8], /* CJK Ideograph */
- [0x64a9, 0x64a9], /* CJK Ideograph */
- [0x64aa, 0x64aa], /* CJK Ideograph */
- [0x64ab, 0x64ab], /* CJK Ideograph */
- [0x64ac, 0x64ac], /* CJK Ideograph */
- [0x64ad, 0x64ad], /* CJK Ideograph */
- [0x64ae, 0x64ae], /* CJK Ideograph */
- [0x64af, 0x64af], /* CJK Ideograph */
- [0x64b0, 0x64b0], /* CJK Ideograph */
- [0x64b1, 0x64b1], /* CJK Ideograph */
- [0x64b2, 0x64b2], /* CJK Ideograph */
- [0x64b3, 0x64b3], /* CJK Ideograph */
- [0x64b4, 0x64b4], /* CJK Ideograph */
- [0x64b5, 0x64b5], /* CJK Ideograph */
- [0x64b6, 0x64b6], /* CJK Ideograph */
- [0x64b7, 0x64b7], /* CJK Ideograph */
- [0x64b8, 0x64b8], /* CJK Ideograph */
- [0x64b9, 0x64b9], /* CJK Ideograph */
- [0x64ba, 0x64ba], /* CJK Ideograph */
- [0x64bb, 0x64bb], /* CJK Ideograph */
- [0x64bc, 0x64bc], /* CJK Ideograph */
- [0x64bd, 0x64bd], /* CJK Ideograph */
- [0x64be, 0x64be], /* CJK Ideograph */
- [0x64bf, 0x64bf], /* CJK Ideograph */
- [0x64c0, 0x64c0], /* CJK Ideograph */
- [0x64c1, 0x64c1], /* CJK Ideograph */
- [0x64c2, 0x64c2], /* CJK Ideograph */
- [0x64c3, 0x64c3], /* CJK Ideograph */
- [0x64c4, 0x64c4], /* CJK Ideograph */
- [0x64c5, 0x64c5], /* CJK Ideograph */
- [0x64c6, 0x64c6], /* CJK Ideograph */
- [0x64c7, 0x64c7], /* CJK Ideograph */
- [0x64c8, 0x64c8], /* CJK Ideograph */
- [0x64c9, 0x64c9], /* CJK Ideograph */
- [0x64ca, 0x64ca], /* CJK Ideograph */
- [0x64cb, 0x64cb], /* CJK Ideograph */
- [0x64cc, 0x64cc], /* CJK Ideograph */
- [0x64cd, 0x64cd], /* CJK Ideograph */
- [0x64ce, 0x64ce], /* CJK Ideograph */
- [0x64cf, 0x64cf], /* CJK Ideograph */
- [0x64d0, 0x64d0], /* CJK Ideograph */
- [0x64d1, 0x64d1], /* CJK Ideograph */
- [0x64d2, 0x64d2], /* CJK Ideograph */
- [0x64d3, 0x64d3], /* CJK Ideograph */
- [0x64d4, 0x64d4], /* CJK Ideograph */
- [0x64d5, 0x64d5], /* CJK Ideograph */
- [0x64d6, 0x64d6], /* CJK Ideograph */
- [0x64d7, 0x64d7], /* CJK Ideograph */
- [0x64d8, 0x64d8], /* CJK Ideograph */
- [0x64d9, 0x64d9], /* CJK Ideograph */
- [0x64da, 0x64da], /* CJK Ideograph */
- [0x64db, 0x64db], /* CJK Ideograph */
- [0x64dc, 0x64dc], /* CJK Ideograph */
- [0x64dd, 0x64dd], /* CJK Ideograph */
- [0x64de, 0x64de], /* CJK Ideograph */
- [0x64df, 0x64df], /* CJK Ideograph */
- [0x64e0, 0x64e0], /* CJK Ideograph */
- [0x64e1, 0x64e1], /* CJK Ideograph */
- [0x64e2, 0x64e2], /* CJK Ideograph */
- [0x64e3, 0x64e3], /* CJK Ideograph */
- [0x64e4, 0x64e4], /* CJK Ideograph */
- [0x64e5, 0x64e5], /* CJK Ideograph */
- [0x64e6, 0x64e6], /* CJK Ideograph */
- [0x64e7, 0x64e7], /* CJK Ideograph */
- [0x64e8, 0x64e8], /* CJK Ideograph */
- [0x64e9, 0x64e9], /* CJK Ideograph */
- [0x64ea, 0x64ea], /* CJK Ideograph */
- [0x64eb, 0x64eb], /* CJK Ideograph */
- [0x64ec, 0x64ec], /* CJK Ideograph */
- [0x64ed, 0x64ed], /* CJK Ideograph */
- [0x64ee, 0x64ee], /* CJK Ideograph */
- [0x64ef, 0x64ef], /* CJK Ideograph */
- [0x64f0, 0x64f0], /* CJK Ideograph */
- [0x64f1, 0x64f1], /* CJK Ideograph */
- [0x64f2, 0x64f2], /* CJK Ideograph */
- [0x64f3, 0x64f3], /* CJK Ideograph */
- [0x64f4, 0x64f4], /* CJK Ideograph */
- [0x64f5, 0x64f5], /* CJK Ideograph */
- [0x64f6, 0x64f6], /* CJK Ideograph */
- [0x64f7, 0x64f7], /* CJK Ideograph */
- [0x64f8, 0x64f8], /* CJK Ideograph */
- [0x64f9, 0x64f9], /* CJK Ideograph */
- [0x64fa, 0x64fa], /* CJK Ideograph */
- [0x64fb, 0x64fb], /* CJK Ideograph */
- [0x64fc, 0x64fc], /* CJK Ideograph */
- [0x64fd, 0x64fd], /* CJK Ideograph */
- [0x64fe, 0x64fe], /* CJK Ideograph */
- [0x64ff, 0x64ff], /* CJK Ideograph */
- [0x6500, 0x6500], /* CJK Ideograph */
- [0x6501, 0x6501], /* CJK Ideograph */
- [0x6502, 0x6502], /* CJK Ideograph */
- [0x6503, 0x6503], /* CJK Ideograph */
- [0x6504, 0x6504], /* CJK Ideograph */
- [0x6505, 0x6505], /* CJK Ideograph */
- [0x6506, 0x6506], /* CJK Ideograph */
- [0x6507, 0x6507], /* CJK Ideograph */
- [0x6508, 0x6508], /* CJK Ideograph */
- [0x6509, 0x6509], /* CJK Ideograph */
- [0x650a, 0x650a], /* CJK Ideograph */
- [0x650b, 0x650b], /* CJK Ideograph */
- [0x650c, 0x650c], /* CJK Ideograph */
- [0x650d, 0x650d], /* CJK Ideograph */
- [0x650e, 0x650e], /* CJK Ideograph */
- [0x650f, 0x650f], /* CJK Ideograph */
- [0x6510, 0x6510], /* CJK Ideograph */
- [0x6511, 0x6511], /* CJK Ideograph */
- [0x6512, 0x6512], /* CJK Ideograph */
- [0x6513, 0x6513], /* CJK Ideograph */
- [0x6514, 0x6514], /* CJK Ideograph */
- [0x6515, 0x6515], /* CJK Ideograph */
- [0x6516, 0x6516], /* CJK Ideograph */
- [0x6517, 0x6517], /* CJK Ideograph */
- [0x6518, 0x6518], /* CJK Ideograph */
- [0x6519, 0x6519], /* CJK Ideograph */
- [0x651a, 0x651a], /* CJK Ideograph */
- [0x651b, 0x651b], /* CJK Ideograph */
- [0x651c, 0x651c], /* CJK Ideograph */
- [0x651d, 0x651d], /* CJK Ideograph */
- [0x651e, 0x651e], /* CJK Ideograph */
- [0x651f, 0x651f], /* CJK Ideograph */
- [0x6520, 0x6520], /* CJK Ideograph */
- [0x6521, 0x6521], /* CJK Ideograph */
- [0x6522, 0x6522], /* CJK Ideograph */
- [0x6523, 0x6523], /* CJK Ideograph */
- [0x6524, 0x6524], /* CJK Ideograph */
- [0x6525, 0x6525], /* CJK Ideograph */
- [0x6526, 0x6526], /* CJK Ideograph */
- [0x6527, 0x6527], /* CJK Ideograph */
- [0x6528, 0x6528], /* CJK Ideograph */
- [0x6529, 0x6529], /* CJK Ideograph */
- [0x652a, 0x652a], /* CJK Ideograph */
- [0x652b, 0x652b], /* CJK Ideograph */
- [0x652c, 0x652c], /* CJK Ideograph */
- [0x652d, 0x652d], /* CJK Ideograph */
- [0x652e, 0x652e], /* CJK Ideograph */
- [0x652f, 0x652f], /* CJK Ideograph */
- [0x6530, 0x6530], /* CJK Ideograph */
- [0x6531, 0x6531], /* CJK Ideograph */
- [0x6532, 0x6532], /* CJK Ideograph */
- [0x6533, 0x6533], /* CJK Ideograph */
- [0x6534, 0x6534], /* CJK Ideograph */
- [0x6535, 0x6535], /* CJK Ideograph */
- [0x6536, 0x6536], /* CJK Ideograph */
- [0x6537, 0x6537], /* CJK Ideograph */
- [0x6538, 0x6538], /* CJK Ideograph */
- [0x6539, 0x6539], /* CJK Ideograph */
- [0x653a, 0x653a], /* CJK Ideograph */
- [0x653b, 0x653b], /* CJK Ideograph */
- [0x653c, 0x653c], /* CJK Ideograph */
- [0x653d, 0x653d], /* CJK Ideograph */
- [0x653e, 0x653e], /* CJK Ideograph */
- [0x653f, 0x653f], /* CJK Ideograph */
- [0x6540, 0x6540], /* CJK Ideograph */
- [0x6541, 0x6541], /* CJK Ideograph */
- [0x6542, 0x6542], /* CJK Ideograph */
- [0x6543, 0x6543], /* CJK Ideograph */
- [0x6544, 0x6544], /* CJK Ideograph */
- [0x6545, 0x6545], /* CJK Ideograph */
- [0x6546, 0x6546], /* CJK Ideograph */
- [0x6547, 0x6547], /* CJK Ideograph */
- [0x6548, 0x6548], /* CJK Ideograph */
- [0x6549, 0x6549], /* CJK Ideograph */
- [0x654a, 0x654a], /* CJK Ideograph */
- [0x654b, 0x654b], /* CJK Ideograph */
- [0x654c, 0x654c], /* CJK Ideograph */
- [0x654d, 0x654d], /* CJK Ideograph */
- [0x654e, 0x654e], /* CJK Ideograph */
- [0x654f, 0x654f], /* CJK Ideograph */
- [0x6550, 0x6550], /* CJK Ideograph */
- [0x6551, 0x6551], /* CJK Ideograph */
- [0x6552, 0x6552], /* CJK Ideograph */
- [0x6553, 0x6553], /* CJK Ideograph */
- [0x6554, 0x6554], /* CJK Ideograph */
- [0x6555, 0x6555], /* CJK Ideograph */
- [0x6556, 0x6556], /* CJK Ideograph */
- [0x6557, 0x6557], /* CJK Ideograph */
- [0x6558, 0x6558], /* CJK Ideograph */
- [0x6559, 0x6559], /* CJK Ideograph */
- [0x655a, 0x655a], /* CJK Ideograph */
- [0x655b, 0x655b], /* CJK Ideograph */
- [0x655c, 0x655c], /* CJK Ideograph */
- [0x655d, 0x655d], /* CJK Ideograph */
- [0x655e, 0x655e], /* CJK Ideograph */
- [0x655f, 0x655f], /* CJK Ideograph */
- [0x6560, 0x6560], /* CJK Ideograph */
- [0x6561, 0x6561], /* CJK Ideograph */
- [0x6562, 0x6562], /* CJK Ideograph */
- [0x6563, 0x6563], /* CJK Ideograph */
- [0x6564, 0x6564], /* CJK Ideograph */
- [0x6565, 0x6565], /* CJK Ideograph */
- [0x6566, 0x6566], /* CJK Ideograph */
- [0x6567, 0x6567], /* CJK Ideograph */
- [0x6568, 0x6568], /* CJK Ideograph */
- [0x6569, 0x6569], /* CJK Ideograph */
- [0x656a, 0x656a], /* CJK Ideograph */
- [0x656b, 0x656b], /* CJK Ideograph */
- [0x656c, 0x656c], /* CJK Ideograph */
- [0x656d, 0x656d], /* CJK Ideograph */
- [0x656e, 0x656e], /* CJK Ideograph */
- [0x656f, 0x656f], /* CJK Ideograph */
- [0x6570, 0x6570], /* CJK Ideograph */
- [0x6571, 0x6571], /* CJK Ideograph */
- [0x6572, 0x6572], /* CJK Ideograph */
- [0x6573, 0x6573], /* CJK Ideograph */
- [0x6574, 0x6574], /* CJK Ideograph */
- [0x6575, 0x6575], /* CJK Ideograph */
- [0x6576, 0x6576], /* CJK Ideograph */
- [0x6577, 0x6577], /* CJK Ideograph */
- [0x6578, 0x6578], /* CJK Ideograph */
- [0x6579, 0x6579], /* CJK Ideograph */
- [0x657a, 0x657a], /* CJK Ideograph */
- [0x657b, 0x657b], /* CJK Ideograph */
- [0x657c, 0x657c], /* CJK Ideograph */
- [0x657d, 0x657d], /* CJK Ideograph */
- [0x657e, 0x657e], /* CJK Ideograph */
- [0x657f, 0x657f], /* CJK Ideograph */
- [0x6580, 0x6580], /* CJK Ideograph */
- [0x6581, 0x6581], /* CJK Ideograph */
- [0x6582, 0x6582], /* CJK Ideograph */
- [0x6583, 0x6583], /* CJK Ideograph */
- [0x6584, 0x6584], /* CJK Ideograph */
- [0x6585, 0x6585], /* CJK Ideograph */
- [0x6586, 0x6586], /* CJK Ideograph */
- [0x6587, 0x6587], /* CJK Ideograph */
- [0x6588, 0x6588], /* CJK Ideograph */
- [0x6589, 0x6589], /* CJK Ideograph */
- [0x658a, 0x658a], /* CJK Ideograph */
- [0x658b, 0x658b], /* CJK Ideograph */
- [0x658c, 0x658c], /* CJK Ideograph */
- [0x658d, 0x658d], /* CJK Ideograph */
- [0x658e, 0x658e], /* CJK Ideograph */
- [0x658f, 0x658f], /* CJK Ideograph */
- [0x6590, 0x6590], /* CJK Ideograph */
- [0x6591, 0x6591], /* CJK Ideograph */
- [0x6592, 0x6592], /* CJK Ideograph */
- [0x6593, 0x6593], /* CJK Ideograph */
- [0x6594, 0x6594], /* CJK Ideograph */
- [0x6595, 0x6595], /* CJK Ideograph */
- [0x6596, 0x6596], /* CJK Ideograph */
- [0x6597, 0x6597], /* CJK Ideograph */
- [0x6598, 0x6598], /* CJK Ideograph */
- [0x6599, 0x6599], /* CJK Ideograph */
- [0x659a, 0x659a], /* CJK Ideograph */
- [0x659b, 0x659b], /* CJK Ideograph */
- [0x659c, 0x659c], /* CJK Ideograph */
- [0x659d, 0x659d], /* CJK Ideograph */
- [0x659e, 0x659e], /* CJK Ideograph */
- [0x659f, 0x659f], /* CJK Ideograph */
- [0x65a0, 0x65a0], /* CJK Ideograph */
- [0x65a1, 0x65a1], /* CJK Ideograph */
- [0x65a2, 0x65a2], /* CJK Ideograph */
- [0x65a3, 0x65a3], /* CJK Ideograph */
- [0x65a4, 0x65a4], /* CJK Ideograph */
- [0x65a5, 0x65a5], /* CJK Ideograph */
- [0x65a6, 0x65a6], /* CJK Ideograph */
- [0x65a7, 0x65a7], /* CJK Ideograph */
- [0x65a8, 0x65a8], /* CJK Ideograph */
- [0x65a9, 0x65a9], /* CJK Ideograph */
- [0x65aa, 0x65aa], /* CJK Ideograph */
- [0x65ab, 0x65ab], /* CJK Ideograph */
- [0x65ac, 0x65ac], /* CJK Ideograph */
- [0x65ad, 0x65ad], /* CJK Ideograph */
- [0x65ae, 0x65ae], /* CJK Ideograph */
- [0x65af, 0x65af], /* CJK Ideograph */
- [0x65b0, 0x65b0], /* CJK Ideograph */
- [0x65b1, 0x65b1], /* CJK Ideograph */
- [0x65b2, 0x65b2], /* CJK Ideograph */
- [0x65b3, 0x65b3], /* CJK Ideograph */
- [0x65b4, 0x65b4], /* CJK Ideograph */
- [0x65b5, 0x65b5], /* CJK Ideograph */
- [0x65b6, 0x65b6], /* CJK Ideograph */
- [0x65b7, 0x65b7], /* CJK Ideograph */
- [0x65b8, 0x65b8], /* CJK Ideograph */
- [0x65b9, 0x65b9], /* CJK Ideograph */
- [0x65ba, 0x65ba], /* CJK Ideograph */
- [0x65bb, 0x65bb], /* CJK Ideograph */
- [0x65bc, 0x65bc], /* CJK Ideograph */
- [0x65bd, 0x65bd], /* CJK Ideograph */
- [0x65be, 0x65be], /* CJK Ideograph */
- [0x65bf, 0x65bf], /* CJK Ideograph */
- [0x65c0, 0x65c0], /* CJK Ideograph */
- [0x65c1, 0x65c1], /* CJK Ideograph */
- [0x65c2, 0x65c2], /* CJK Ideograph */
- [0x65c3, 0x65c3], /* CJK Ideograph */
- [0x65c4, 0x65c4], /* CJK Ideograph */
- [0x65c5, 0x65c5], /* CJK Ideograph */
- [0x65c6, 0x65c6], /* CJK Ideograph */
- [0x65c7, 0x65c7], /* CJK Ideograph */
- [0x65c8, 0x65c8], /* CJK Ideograph */
- [0x65c9, 0x65c9], /* CJK Ideograph */
- [0x65ca, 0x65ca], /* CJK Ideograph */
- [0x65cb, 0x65cb], /* CJK Ideograph */
- [0x65cc, 0x65cc], /* CJK Ideograph */
- [0x65cd, 0x65cd], /* CJK Ideograph */
- [0x65ce, 0x65ce], /* CJK Ideograph */
- [0x65cf, 0x65cf], /* CJK Ideograph */
- [0x65d0, 0x65d0], /* CJK Ideograph */
- [0x65d1, 0x65d1], /* CJK Ideograph */
- [0x65d2, 0x65d2], /* CJK Ideograph */
- [0x65d3, 0x65d3], /* CJK Ideograph */
- [0x65d4, 0x65d4], /* CJK Ideograph */
- [0x65d5, 0x65d5], /* CJK Ideograph */
- [0x65d6, 0x65d6], /* CJK Ideograph */
- [0x65d7, 0x65d7], /* CJK Ideograph */
- [0x65d8, 0x65d8], /* CJK Ideograph */
- [0x65d9, 0x65d9], /* CJK Ideograph */
- [0x65da, 0x65da], /* CJK Ideograph */
- [0x65db, 0x65db], /* CJK Ideograph */
- [0x65dc, 0x65dc], /* CJK Ideograph */
- [0x65dd, 0x65dd], /* CJK Ideograph */
- [0x65de, 0x65de], /* CJK Ideograph */
- [0x65df, 0x65df], /* CJK Ideograph */
- [0x65e0, 0x65e0], /* CJK Ideograph */
- [0x65e1, 0x65e1], /* CJK Ideograph */
- [0x65e2, 0x65e2], /* CJK Ideograph */
- [0x65e3, 0x65e3], /* CJK Ideograph */
- [0x65e4, 0x65e4], /* CJK Ideograph */
- [0x65e5, 0x65e5], /* CJK Ideograph */
- [0x65e6, 0x65e6], /* CJK Ideograph */
- [0x65e7, 0x65e7], /* CJK Ideograph */
- [0x65e8, 0x65e8], /* CJK Ideograph */
- [0x65e9, 0x65e9], /* CJK Ideograph */
- [0x65ea, 0x65ea], /* CJK Ideograph */
- [0x65eb, 0x65eb], /* CJK Ideograph */
- [0x65ec, 0x65ec], /* CJK Ideograph */
- [0x65ed, 0x65ed], /* CJK Ideograph */
- [0x65ee, 0x65ee], /* CJK Ideograph */
- [0x65ef, 0x65ef], /* CJK Ideograph */
- [0x65f0, 0x65f0], /* CJK Ideograph */
- [0x65f1, 0x65f1], /* CJK Ideograph */
- [0x65f2, 0x65f2], /* CJK Ideograph */
- [0x65f3, 0x65f3], /* CJK Ideograph */
- [0x65f4, 0x65f4], /* CJK Ideograph */
- [0x65f5, 0x65f5], /* CJK Ideograph */
- [0x65f6, 0x65f6], /* CJK Ideograph */
- [0x65f7, 0x65f7], /* CJK Ideograph */
- [0x65f8, 0x65f8], /* CJK Ideograph */
- [0x65f9, 0x65f9], /* CJK Ideograph */
- [0x65fa, 0x65fa], /* CJK Ideograph */
- [0x65fb, 0x65fb], /* CJK Ideograph */
- [0x65fc, 0x65fc], /* CJK Ideograph */
- [0x65fd, 0x65fd], /* CJK Ideograph */
- [0x65fe, 0x65fe], /* CJK Ideograph */
- [0x65ff, 0x65ff], /* CJK Ideograph */
- [0x6600, 0x6600], /* CJK Ideograph */
- [0x6601, 0x6601], /* CJK Ideograph */
- [0x6602, 0x6602], /* CJK Ideograph */
- [0x6603, 0x6603], /* CJK Ideograph */
- [0x6604, 0x6604], /* CJK Ideograph */
- [0x6605, 0x6605], /* CJK Ideograph */
- [0x6606, 0x6606], /* CJK Ideograph */
- [0x6607, 0x6607], /* CJK Ideograph */
- [0x6608, 0x6608], /* CJK Ideograph */
- [0x6609, 0x6609], /* CJK Ideograph */
- [0x660a, 0x660a], /* CJK Ideograph */
- [0x660b, 0x660b], /* CJK Ideograph */
- [0x660c, 0x660c], /* CJK Ideograph */
- [0x660d, 0x660d], /* CJK Ideograph */
- [0x660e, 0x660e], /* CJK Ideograph */
- [0x660f, 0x660f], /* CJK Ideograph */
- [0x6610, 0x6610], /* CJK Ideograph */
- [0x6611, 0x6611], /* CJK Ideograph */
- [0x6612, 0x6612], /* CJK Ideograph */
- [0x6613, 0x6613], /* CJK Ideograph */
- [0x6614, 0x6614], /* CJK Ideograph */
- [0x6615, 0x6615], /* CJK Ideograph */
- [0x6616, 0x6616], /* CJK Ideograph */
- [0x6617, 0x6617], /* CJK Ideograph */
- [0x6618, 0x6618], /* CJK Ideograph */
- [0x6619, 0x6619], /* CJK Ideograph */
- [0x661a, 0x661a], /* CJK Ideograph */
- [0x661b, 0x661b], /* CJK Ideograph */
- [0x661c, 0x661c], /* CJK Ideograph */
- [0x661d, 0x661d], /* CJK Ideograph */
- [0x661e, 0x661e], /* CJK Ideograph */
- [0x661f, 0x661f], /* CJK Ideograph */
- [0x6620, 0x6620], /* CJK Ideograph */
- [0x6621, 0x6621], /* CJK Ideograph */
- [0x6622, 0x6622], /* CJK Ideograph */
- [0x6623, 0x6623], /* CJK Ideograph */
- [0x6624, 0x6624], /* CJK Ideograph */
- [0x6625, 0x6625], /* CJK Ideograph */
- [0x6626, 0x6626], /* CJK Ideograph */
- [0x6627, 0x6627], /* CJK Ideograph */
- [0x6628, 0x6628], /* CJK Ideograph */
- [0x6629, 0x6629], /* CJK Ideograph */
- [0x662a, 0x662a], /* CJK Ideograph */
- [0x662b, 0x662b], /* CJK Ideograph */
- [0x662c, 0x662c], /* CJK Ideograph */
- [0x662d, 0x662d], /* CJK Ideograph */
- [0x662e, 0x662e], /* CJK Ideograph */
- [0x662f, 0x662f], /* CJK Ideograph */
- [0x6630, 0x6630], /* CJK Ideograph */
- [0x6631, 0x6631], /* CJK Ideograph */
- [0x6632, 0x6632], /* CJK Ideograph */
- [0x6633, 0x6633], /* CJK Ideograph */
- [0x6634, 0x6634], /* CJK Ideograph */
- [0x6635, 0x6635], /* CJK Ideograph */
- [0x6636, 0x6636], /* CJK Ideograph */
- [0x6637, 0x6637], /* CJK Ideograph */
- [0x6638, 0x6638], /* CJK Ideograph */
- [0x6639, 0x6639], /* CJK Ideograph */
- [0x663a, 0x663a], /* CJK Ideograph */
- [0x663b, 0x663b], /* CJK Ideograph */
- [0x663c, 0x663c], /* CJK Ideograph */
- [0x663d, 0x663d], /* CJK Ideograph */
- [0x663e, 0x663e], /* CJK Ideograph */
- [0x663f, 0x663f], /* CJK Ideograph */
- [0x6640, 0x6640], /* CJK Ideograph */
- [0x6641, 0x6641], /* CJK Ideograph */
- [0x6642, 0x6642], /* CJK Ideograph */
- [0x6643, 0x6643], /* CJK Ideograph */
- [0x6644, 0x6644], /* CJK Ideograph */
- [0x6645, 0x6645], /* CJK Ideograph */
- [0x6646, 0x6646], /* CJK Ideograph */
- [0x6647, 0x6647], /* CJK Ideograph */
- [0x6648, 0x6648], /* CJK Ideograph */
- [0x6649, 0x6649], /* CJK Ideograph */
- [0x664a, 0x664a], /* CJK Ideograph */
- [0x664b, 0x664b], /* CJK Ideograph */
- [0x664c, 0x664c], /* CJK Ideograph */
- [0x664d, 0x664d], /* CJK Ideograph */
- [0x664e, 0x664e], /* CJK Ideograph */
- [0x664f, 0x664f], /* CJK Ideograph */
- [0x6650, 0x6650], /* CJK Ideograph */
- [0x6651, 0x6651], /* CJK Ideograph */
- [0x6652, 0x6652], /* CJK Ideograph */
- [0x6653, 0x6653], /* CJK Ideograph */
- [0x6654, 0x6654], /* CJK Ideograph */
- [0x6655, 0x6655], /* CJK Ideograph */
- [0x6656, 0x6656], /* CJK Ideograph */
- [0x6657, 0x6657], /* CJK Ideograph */
- [0x6658, 0x6658], /* CJK Ideograph */
- [0x6659, 0x6659], /* CJK Ideograph */
- [0x665a, 0x665a], /* CJK Ideograph */
- [0x665b, 0x665b], /* CJK Ideograph */
- [0x665c, 0x665c], /* CJK Ideograph */
- [0x665d, 0x665d], /* CJK Ideograph */
- [0x665e, 0x665e], /* CJK Ideograph */
- [0x665f, 0x665f], /* CJK Ideograph */
- [0x6660, 0x6660], /* CJK Ideograph */
- [0x6661, 0x6661], /* CJK Ideograph */
- [0x6662, 0x6662], /* CJK Ideograph */
- [0x6663, 0x6663], /* CJK Ideograph */
- [0x6664, 0x6664], /* CJK Ideograph */
- [0x6665, 0x6665], /* CJK Ideograph */
- [0x6666, 0x6666], /* CJK Ideograph */
- [0x6667, 0x6667], /* CJK Ideograph */
- [0x6668, 0x6668], /* CJK Ideograph */
- [0x6669, 0x6669], /* CJK Ideograph */
- [0x666a, 0x666a], /* CJK Ideograph */
- [0x666b, 0x666b], /* CJK Ideograph */
- [0x666c, 0x666c], /* CJK Ideograph */
- [0x666d, 0x666d], /* CJK Ideograph */
- [0x666e, 0x666e], /* CJK Ideograph */
- [0x666f, 0x666f], /* CJK Ideograph */
- [0x6670, 0x6670], /* CJK Ideograph */
- [0x6671, 0x6671], /* CJK Ideograph */
- [0x6672, 0x6672], /* CJK Ideograph */
- [0x6673, 0x6673], /* CJK Ideograph */
- [0x6674, 0x6674], /* CJK Ideograph */
- [0x6675, 0x6675], /* CJK Ideograph */
- [0x6676, 0x6676], /* CJK Ideograph */
- [0x6677, 0x6677], /* CJK Ideograph */
- [0x6678, 0x6678], /* CJK Ideograph */
- [0x6679, 0x6679], /* CJK Ideograph */
- [0x667a, 0x667a], /* CJK Ideograph */
- [0x667b, 0x667b], /* CJK Ideograph */
- [0x667c, 0x667c], /* CJK Ideograph */
- [0x667d, 0x667d], /* CJK Ideograph */
- [0x667e, 0x667e], /* CJK Ideograph */
- [0x667f, 0x667f], /* CJK Ideograph */
- [0x6680, 0x6680], /* CJK Ideograph */
- [0x6681, 0x6681], /* CJK Ideograph */
- [0x6682, 0x6682], /* CJK Ideograph */
- [0x6683, 0x6683], /* CJK Ideograph */
- [0x6684, 0x6684], /* CJK Ideograph */
- [0x6685, 0x6685], /* CJK Ideograph */
- [0x6686, 0x6686], /* CJK Ideograph */
- [0x6687, 0x6687], /* CJK Ideograph */
- [0x6688, 0x6688], /* CJK Ideograph */
- [0x6689, 0x6689], /* CJK Ideograph */
- [0x668a, 0x668a], /* CJK Ideograph */
- [0x668b, 0x668b], /* CJK Ideograph */
- [0x668c, 0x668c], /* CJK Ideograph */
- [0x668d, 0x668d], /* CJK Ideograph */
- [0x668e, 0x668e], /* CJK Ideograph */
- [0x668f, 0x668f], /* CJK Ideograph */
- [0x6690, 0x6690], /* CJK Ideograph */
- [0x6691, 0x6691], /* CJK Ideograph */
- [0x6692, 0x6692], /* CJK Ideograph */
- [0x6693, 0x6693], /* CJK Ideograph */
- [0x6694, 0x6694], /* CJK Ideograph */
- [0x6695, 0x6695], /* CJK Ideograph */
- [0x6696, 0x6696], /* CJK Ideograph */
- [0x6697, 0x6697], /* CJK Ideograph */
- [0x6698, 0x6698], /* CJK Ideograph */
- [0x6699, 0x6699], /* CJK Ideograph */
- [0x669a, 0x669a], /* CJK Ideograph */
- [0x669b, 0x669b], /* CJK Ideograph */
- [0x669c, 0x669c], /* CJK Ideograph */
- [0x669d, 0x669d], /* CJK Ideograph */
- [0x669e, 0x669e], /* CJK Ideograph */
- [0x669f, 0x669f], /* CJK Ideograph */
- [0x66a0, 0x66a0], /* CJK Ideograph */
- [0x66a1, 0x66a1], /* CJK Ideograph */
- [0x66a2, 0x66a2], /* CJK Ideograph */
- [0x66a3, 0x66a3], /* CJK Ideograph */
- [0x66a4, 0x66a4], /* CJK Ideograph */
- [0x66a5, 0x66a5], /* CJK Ideograph */
- [0x66a6, 0x66a6], /* CJK Ideograph */
- [0x66a7, 0x66a7], /* CJK Ideograph */
- [0x66a8, 0x66a8], /* CJK Ideograph */
- [0x66a9, 0x66a9], /* CJK Ideograph */
- [0x66aa, 0x66aa], /* CJK Ideograph */
- [0x66ab, 0x66ab], /* CJK Ideograph */
- [0x66ac, 0x66ac], /* CJK Ideograph */
- [0x66ad, 0x66ad], /* CJK Ideograph */
- [0x66ae, 0x66ae], /* CJK Ideograph */
- [0x66af, 0x66af], /* CJK Ideograph */
- [0x66b0, 0x66b0], /* CJK Ideograph */
- [0x66b1, 0x66b1], /* CJK Ideograph */
- [0x66b2, 0x66b2], /* CJK Ideograph */
- [0x66b3, 0x66b3], /* CJK Ideograph */
- [0x66b4, 0x66b4], /* CJK Ideograph */
- [0x66b5, 0x66b5], /* CJK Ideograph */
- [0x66b6, 0x66b6], /* CJK Ideograph */
- [0x66b7, 0x66b7], /* CJK Ideograph */
- [0x66b8, 0x66b8], /* CJK Ideograph */
- [0x66b9, 0x66b9], /* CJK Ideograph */
- [0x66ba, 0x66ba], /* CJK Ideograph */
- [0x66bb, 0x66bb], /* CJK Ideograph */
- [0x66bc, 0x66bc], /* CJK Ideograph */
- [0x66bd, 0x66bd], /* CJK Ideograph */
- [0x66be, 0x66be], /* CJK Ideograph */
- [0x66bf, 0x66bf], /* CJK Ideograph */
- [0x66c0, 0x66c0], /* CJK Ideograph */
- [0x66c1, 0x66c1], /* CJK Ideograph */
- [0x66c2, 0x66c2], /* CJK Ideograph */
- [0x66c3, 0x66c3], /* CJK Ideograph */
- [0x66c4, 0x66c4], /* CJK Ideograph */
- [0x66c5, 0x66c5], /* CJK Ideograph */
- [0x66c6, 0x66c6], /* CJK Ideograph */
- [0x66c7, 0x66c7], /* CJK Ideograph */
- [0x66c8, 0x66c8], /* CJK Ideograph */
- [0x66c9, 0x66c9], /* CJK Ideograph */
- [0x66ca, 0x66ca], /* CJK Ideograph */
- [0x66cb, 0x66cb], /* CJK Ideograph */
- [0x66cc, 0x66cc], /* CJK Ideograph */
- [0x66cd, 0x66cd], /* CJK Ideograph */
- [0x66ce, 0x66ce], /* CJK Ideograph */
- [0x66cf, 0x66cf], /* CJK Ideograph */
- [0x66d0, 0x66d0], /* CJK Ideograph */
- [0x66d1, 0x66d1], /* CJK Ideograph */
- [0x66d2, 0x66d2], /* CJK Ideograph */
- [0x66d3, 0x66d3], /* CJK Ideograph */
- [0x66d4, 0x66d4], /* CJK Ideograph */
- [0x66d5, 0x66d5], /* CJK Ideograph */
- [0x66d6, 0x66d6], /* CJK Ideograph */
- [0x66d7, 0x66d7], /* CJK Ideograph */
- [0x66d8, 0x66d8], /* CJK Ideograph */
- [0x66d9, 0x66d9], /* CJK Ideograph */
- [0x66da, 0x66da], /* CJK Ideograph */
- [0x66db, 0x66db], /* CJK Ideograph */
- [0x66dc, 0x66dc], /* CJK Ideograph */
- [0x66dd, 0x66dd], /* CJK Ideograph */
- [0x66de, 0x66de], /* CJK Ideograph */
- [0x66df, 0x66df], /* CJK Ideograph */
- [0x66e0, 0x66e0], /* CJK Ideograph */
- [0x66e1, 0x66e1], /* CJK Ideograph */
- [0x66e2, 0x66e2], /* CJK Ideograph */
- [0x66e3, 0x66e3], /* CJK Ideograph */
- [0x66e4, 0x66e4], /* CJK Ideograph */
- [0x66e5, 0x66e5], /* CJK Ideograph */
- [0x66e6, 0x66e6], /* CJK Ideograph */
- [0x66e7, 0x66e7], /* CJK Ideograph */
- [0x66e8, 0x66e8], /* CJK Ideograph */
- [0x66e9, 0x66e9], /* CJK Ideograph */
- [0x66ea, 0x66ea], /* CJK Ideograph */
- [0x66eb, 0x66eb], /* CJK Ideograph */
- [0x66ec, 0x66ec], /* CJK Ideograph */
- [0x66ed, 0x66ed], /* CJK Ideograph */
- [0x66ee, 0x66ee], /* CJK Ideograph */
- [0x66ef, 0x66ef], /* CJK Ideograph */
- [0x66f0, 0x66f0], /* CJK Ideograph */
- [0x66f1, 0x66f1], /* CJK Ideograph */
- [0x66f2, 0x66f2], /* CJK Ideograph */
- [0x66f3, 0x66f3], /* CJK Ideograph */
- [0x66f4, 0x66f4], /* CJK Ideograph */
- [0x66f5, 0x66f5], /* CJK Ideograph */
- [0x66f6, 0x66f6], /* CJK Ideograph */
- [0x66f7, 0x66f7], /* CJK Ideograph */
- [0x66f8, 0x66f8], /* CJK Ideograph */
- [0x66f9, 0x66f9], /* CJK Ideograph */
- [0x66fa, 0x66fa], /* CJK Ideograph */
- [0x66fb, 0x66fb], /* CJK Ideograph */
- [0x66fc, 0x66fc], /* CJK Ideograph */
- [0x66fd, 0x66fd], /* CJK Ideograph */
- [0x66fe, 0x66fe], /* CJK Ideograph */
- [0x66ff, 0x66ff], /* CJK Ideograph */
- [0x6700, 0x6700], /* CJK Ideograph */
- [0x6701, 0x6701], /* CJK Ideograph */
- [0x6702, 0x6702], /* CJK Ideograph */
- [0x6703, 0x6703], /* CJK Ideograph */
- [0x6704, 0x6704], /* CJK Ideograph */
- [0x6705, 0x6705], /* CJK Ideograph */
- [0x6706, 0x6706], /* CJK Ideograph */
- [0x6707, 0x6707], /* CJK Ideograph */
- [0x6708, 0x6708], /* CJK Ideograph */
- [0x6709, 0x6709], /* CJK Ideograph */
- [0x670a, 0x670a], /* CJK Ideograph */
- [0x670b, 0x670b], /* CJK Ideograph */
- [0x670c, 0x670c], /* CJK Ideograph */
- [0x670d, 0x670d], /* CJK Ideograph */
- [0x670e, 0x670e], /* CJK Ideograph */
- [0x670f, 0x670f], /* CJK Ideograph */
- [0x6710, 0x6710], /* CJK Ideograph */
- [0x6711, 0x6711], /* CJK Ideograph */
- [0x6712, 0x6712], /* CJK Ideograph */
- [0x6713, 0x6713], /* CJK Ideograph */
- [0x6714, 0x6714], /* CJK Ideograph */
- [0x6715, 0x6715], /* CJK Ideograph */
- [0x6716, 0x6716], /* CJK Ideograph */
- [0x6717, 0x6717], /* CJK Ideograph */
- [0x6718, 0x6718], /* CJK Ideograph */
- [0x6719, 0x6719], /* CJK Ideograph */
- [0x671a, 0x671a], /* CJK Ideograph */
- [0x671b, 0x671b], /* CJK Ideograph */
- [0x671c, 0x671c], /* CJK Ideograph */
- [0x671d, 0x671d], /* CJK Ideograph */
- [0x671e, 0x671e], /* CJK Ideograph */
- [0x671f, 0x671f], /* CJK Ideograph */
- [0x6720, 0x6720], /* CJK Ideograph */
- [0x6721, 0x6721], /* CJK Ideograph */
- [0x6722, 0x6722], /* CJK Ideograph */
- [0x6723, 0x6723], /* CJK Ideograph */
- [0x6724, 0x6724], /* CJK Ideograph */
- [0x6725, 0x6725], /* CJK Ideograph */
- [0x6726, 0x6726], /* CJK Ideograph */
- [0x6727, 0x6727], /* CJK Ideograph */
- [0x6728, 0x6728], /* CJK Ideograph */
- [0x6729, 0x6729], /* CJK Ideograph */
- [0x672a, 0x672a], /* CJK Ideograph */
- [0x672b, 0x672b], /* CJK Ideograph */
- [0x672c, 0x672c], /* CJK Ideograph */
- [0x672d, 0x672d], /* CJK Ideograph */
- [0x672e, 0x672e], /* CJK Ideograph */
- [0x672f, 0x672f], /* CJK Ideograph */
- [0x6730, 0x6730], /* CJK Ideograph */
- [0x6731, 0x6731], /* CJK Ideograph */
- [0x6732, 0x6732], /* CJK Ideograph */
- [0x6733, 0x6733], /* CJK Ideograph */
- [0x6734, 0x6734], /* CJK Ideograph */
- [0x6735, 0x6735], /* CJK Ideograph */
- [0x6736, 0x6736], /* CJK Ideograph */
- [0x6737, 0x6737], /* CJK Ideograph */
- [0x6738, 0x6738], /* CJK Ideograph */
- [0x6739, 0x6739], /* CJK Ideograph */
- [0x673a, 0x673a], /* CJK Ideograph */
- [0x673b, 0x673b], /* CJK Ideograph */
- [0x673c, 0x673c], /* CJK Ideograph */
- [0x673d, 0x673d], /* CJK Ideograph */
- [0x673e, 0x673e], /* CJK Ideograph */
- [0x673f, 0x673f], /* CJK Ideograph */
- [0x6740, 0x6740], /* CJK Ideograph */
- [0x6741, 0x6741], /* CJK Ideograph */
- [0x6742, 0x6742], /* CJK Ideograph */
- [0x6743, 0x6743], /* CJK Ideograph */
- [0x6744, 0x6744], /* CJK Ideograph */
- [0x6745, 0x6745], /* CJK Ideograph */
- [0x6746, 0x6746], /* CJK Ideograph */
- [0x6747, 0x6747], /* CJK Ideograph */
- [0x6748, 0x6748], /* CJK Ideograph */
- [0x6749, 0x6749], /* CJK Ideograph */
- [0x674a, 0x674a], /* CJK Ideograph */
- [0x674b, 0x674b], /* CJK Ideograph */
- [0x674c, 0x674c], /* CJK Ideograph */
- [0x674d, 0x674d], /* CJK Ideograph */
- [0x674e, 0x674e], /* CJK Ideograph */
- [0x674f, 0x674f], /* CJK Ideograph */
- [0x6750, 0x6750], /* CJK Ideograph */
- [0x6751, 0x6751], /* CJK Ideograph */
- [0x6752, 0x6752], /* CJK Ideograph */
- [0x6753, 0x6753], /* CJK Ideograph */
- [0x6754, 0x6754], /* CJK Ideograph */
- [0x6755, 0x6755], /* CJK Ideograph */
- [0x6756, 0x6756], /* CJK Ideograph */
- [0x6757, 0x6757], /* CJK Ideograph */
- [0x6758, 0x6758], /* CJK Ideograph */
- [0x6759, 0x6759], /* CJK Ideograph */
- [0x675a, 0x675a], /* CJK Ideograph */
- [0x675b, 0x675b], /* CJK Ideograph */
- [0x675c, 0x675c], /* CJK Ideograph */
- [0x675d, 0x675d], /* CJK Ideograph */
- [0x675e, 0x675e], /* CJK Ideograph */
- [0x675f, 0x675f], /* CJK Ideograph */
- [0x6760, 0x6760], /* CJK Ideograph */
- [0x6761, 0x6761], /* CJK Ideograph */
- [0x6762, 0x6762], /* CJK Ideograph */
- [0x6763, 0x6763], /* CJK Ideograph */
- [0x6764, 0x6764], /* CJK Ideograph */
- [0x6765, 0x6765], /* CJK Ideograph */
- [0x6766, 0x6766], /* CJK Ideograph */
- [0x6767, 0x6767], /* CJK Ideograph */
- [0x6768, 0x6768], /* CJK Ideograph */
- [0x6769, 0x6769], /* CJK Ideograph */
- [0x676a, 0x676a], /* CJK Ideograph */
- [0x676b, 0x676b], /* CJK Ideograph */
- [0x676c, 0x676c], /* CJK Ideograph */
- [0x676d, 0x676d], /* CJK Ideograph */
- [0x676e, 0x676e], /* CJK Ideograph */
- [0x676f, 0x676f], /* CJK Ideograph */
- [0x6770, 0x6770], /* CJK Ideograph */
- [0x6771, 0x6771], /* CJK Ideograph */
- [0x6772, 0x6772], /* CJK Ideograph */
- [0x6773, 0x6773], /* CJK Ideograph */
- [0x6774, 0x6774], /* CJK Ideograph */
- [0x6775, 0x6775], /* CJK Ideograph */
- [0x6776, 0x6776], /* CJK Ideograph */
- [0x6777, 0x6777], /* CJK Ideograph */
- [0x6778, 0x6778], /* CJK Ideograph */
- [0x6779, 0x6779], /* CJK Ideograph */
- [0x677a, 0x677a], /* CJK Ideograph */
- [0x677b, 0x677b], /* CJK Ideograph */
- [0x677c, 0x677c], /* CJK Ideograph */
- [0x677d, 0x677d], /* CJK Ideograph */
- [0x677e, 0x677e], /* CJK Ideograph */
- [0x677f, 0x677f], /* CJK Ideograph */
- [0x6780, 0x6780], /* CJK Ideograph */
- [0x6781, 0x6781], /* CJK Ideograph */
- [0x6782, 0x6782], /* CJK Ideograph */
- [0x6783, 0x6783], /* CJK Ideograph */
- [0x6784, 0x6784], /* CJK Ideograph */
- [0x6785, 0x6785], /* CJK Ideograph */
- [0x6786, 0x6786], /* CJK Ideograph */
- [0x6787, 0x6787], /* CJK Ideograph */
- [0x6788, 0x6788], /* CJK Ideograph */
- [0x6789, 0x6789], /* CJK Ideograph */
- [0x678a, 0x678a], /* CJK Ideograph */
- [0x678b, 0x678b], /* CJK Ideograph */
- [0x678c, 0x678c], /* CJK Ideograph */
- [0x678d, 0x678d], /* CJK Ideograph */
- [0x678e, 0x678e], /* CJK Ideograph */
- [0x678f, 0x678f], /* CJK Ideograph */
- [0x6790, 0x6790], /* CJK Ideograph */
- [0x6791, 0x6791], /* CJK Ideograph */
- [0x6792, 0x6792], /* CJK Ideograph */
- [0x6793, 0x6793], /* CJK Ideograph */
- [0x6794, 0x6794], /* CJK Ideograph */
- [0x6795, 0x6795], /* CJK Ideograph */
- [0x6796, 0x6796], /* CJK Ideograph */
- [0x6797, 0x6797], /* CJK Ideograph */
- [0x6798, 0x6798], /* CJK Ideograph */
- [0x6799, 0x6799], /* CJK Ideograph */
- [0x679a, 0x679a], /* CJK Ideograph */
- [0x679b, 0x679b], /* CJK Ideograph */
- [0x679c, 0x679c], /* CJK Ideograph */
- [0x679d, 0x679d], /* CJK Ideograph */
- [0x679e, 0x679e], /* CJK Ideograph */
- [0x679f, 0x679f], /* CJK Ideograph */
- [0x67a0, 0x67a0], /* CJK Ideograph */
- [0x67a1, 0x67a1], /* CJK Ideograph */
- [0x67a2, 0x67a2], /* CJK Ideograph */
- [0x67a3, 0x67a3], /* CJK Ideograph */
- [0x67a4, 0x67a4], /* CJK Ideograph */
- [0x67a5, 0x67a5], /* CJK Ideograph */
- [0x67a6, 0x67a6], /* CJK Ideograph */
- [0x67a7, 0x67a7], /* CJK Ideograph */
- [0x67a8, 0x67a8], /* CJK Ideograph */
- [0x67a9, 0x67a9], /* CJK Ideograph */
- [0x67aa, 0x67aa], /* CJK Ideograph */
- [0x67ab, 0x67ab], /* CJK Ideograph */
- [0x67ac, 0x67ac], /* CJK Ideograph */
- [0x67ad, 0x67ad], /* CJK Ideograph */
- [0x67ae, 0x67ae], /* CJK Ideograph */
- [0x67af, 0x67af], /* CJK Ideograph */
- [0x67b0, 0x67b0], /* CJK Ideograph */
- [0x67b1, 0x67b1], /* CJK Ideograph */
- [0x67b2, 0x67b2], /* CJK Ideograph */
- [0x67b3, 0x67b3], /* CJK Ideograph */
- [0x67b4, 0x67b4], /* CJK Ideograph */
- [0x67b5, 0x67b5], /* CJK Ideograph */
- [0x67b6, 0x67b6], /* CJK Ideograph */
- [0x67b7, 0x67b7], /* CJK Ideograph */
- [0x67b8, 0x67b8], /* CJK Ideograph */
- [0x67b9, 0x67b9], /* CJK Ideograph */
- [0x67ba, 0x67ba], /* CJK Ideograph */
- [0x67bb, 0x67bb], /* CJK Ideograph */
- [0x67bc, 0x67bc], /* CJK Ideograph */
- [0x67bd, 0x67bd], /* CJK Ideograph */
- [0x67be, 0x67be], /* CJK Ideograph */
- [0x67bf, 0x67bf], /* CJK Ideograph */
- [0x67c0, 0x67c0], /* CJK Ideograph */
- [0x67c1, 0x67c1], /* CJK Ideograph */
- [0x67c2, 0x67c2], /* CJK Ideograph */
- [0x67c3, 0x67c3], /* CJK Ideograph */
- [0x67c4, 0x67c4], /* CJK Ideograph */
- [0x67c5, 0x67c5], /* CJK Ideograph */
- [0x67c6, 0x67c6], /* CJK Ideograph */
- [0x67c7, 0x67c7], /* CJK Ideograph */
- [0x67c8, 0x67c8], /* CJK Ideograph */
- [0x67c9, 0x67c9], /* CJK Ideograph */
- [0x67ca, 0x67ca], /* CJK Ideograph */
- [0x67cb, 0x67cb], /* CJK Ideograph */
- [0x67cc, 0x67cc], /* CJK Ideograph */
- [0x67cd, 0x67cd], /* CJK Ideograph */
- [0x67ce, 0x67ce], /* CJK Ideograph */
- [0x67cf, 0x67cf], /* CJK Ideograph */
- [0x67d0, 0x67d0], /* CJK Ideograph */
- [0x67d1, 0x67d1], /* CJK Ideograph */
- [0x67d2, 0x67d2], /* CJK Ideograph */
- [0x67d3, 0x67d3], /* CJK Ideograph */
- [0x67d4, 0x67d4], /* CJK Ideograph */
- [0x67d5, 0x67d5], /* CJK Ideograph */
- [0x67d6, 0x67d6], /* CJK Ideograph */
- [0x67d7, 0x67d7], /* CJK Ideograph */
- [0x67d8, 0x67d8], /* CJK Ideograph */
- [0x67d9, 0x67d9], /* CJK Ideograph */
- [0x67da, 0x67da], /* CJK Ideograph */
- [0x67db, 0x67db], /* CJK Ideograph */
- [0x67dc, 0x67dc], /* CJK Ideograph */
- [0x67dd, 0x67dd], /* CJK Ideograph */
- [0x67de, 0x67de], /* CJK Ideograph */
- [0x67df, 0x67df], /* CJK Ideograph */
- [0x67e0, 0x67e0], /* CJK Ideograph */
- [0x67e1, 0x67e1], /* CJK Ideograph */
- [0x67e2, 0x67e2], /* CJK Ideograph */
- [0x67e3, 0x67e3], /* CJK Ideograph */
- [0x67e4, 0x67e4], /* CJK Ideograph */
- [0x67e5, 0x67e5], /* CJK Ideograph */
- [0x67e6, 0x67e6], /* CJK Ideograph */
- [0x67e7, 0x67e7], /* CJK Ideograph */
- [0x67e8, 0x67e8], /* CJK Ideograph */
- [0x67e9, 0x67e9], /* CJK Ideograph */
- [0x67ea, 0x67ea], /* CJK Ideograph */
- [0x67eb, 0x67eb], /* CJK Ideograph */
- [0x67ec, 0x67ec], /* CJK Ideograph */
- [0x67ed, 0x67ed], /* CJK Ideograph */
- [0x67ee, 0x67ee], /* CJK Ideograph */
- [0x67ef, 0x67ef], /* CJK Ideograph */
- [0x67f0, 0x67f0], /* CJK Ideograph */
- [0x67f1, 0x67f1], /* CJK Ideograph */
- [0x67f2, 0x67f2], /* CJK Ideograph */
- [0x67f3, 0x67f3], /* CJK Ideograph */
- [0x67f4, 0x67f4], /* CJK Ideograph */
- [0x67f5, 0x67f5], /* CJK Ideograph */
- [0x67f6, 0x67f6], /* CJK Ideograph */
- [0x67f7, 0x67f7], /* CJK Ideograph */
- [0x67f8, 0x67f8], /* CJK Ideograph */
- [0x67f9, 0x67f9], /* CJK Ideograph */
- [0x67fa, 0x67fa], /* CJK Ideograph */
- [0x67fb, 0x67fb], /* CJK Ideograph */
- [0x67fc, 0x67fc], /* CJK Ideograph */
- [0x67fd, 0x67fd], /* CJK Ideograph */
- [0x67fe, 0x67fe], /* CJK Ideograph */
- [0x67ff, 0x67ff], /* CJK Ideograph */
- [0x6800, 0x6800], /* CJK Ideograph */
- [0x6801, 0x6801], /* CJK Ideograph */
- [0x6802, 0x6802], /* CJK Ideograph */
- [0x6803, 0x6803], /* CJK Ideograph */
- [0x6804, 0x6804], /* CJK Ideograph */
- [0x6805, 0x6805], /* CJK Ideograph */
- [0x6806, 0x6806], /* CJK Ideograph */
- [0x6807, 0x6807], /* CJK Ideograph */
- [0x6808, 0x6808], /* CJK Ideograph */
- [0x6809, 0x6809], /* CJK Ideograph */
- [0x680a, 0x680a], /* CJK Ideograph */
- [0x680b, 0x680b], /* CJK Ideograph */
- [0x680c, 0x680c], /* CJK Ideograph */
- [0x680d, 0x680d], /* CJK Ideograph */
- [0x680e, 0x680e], /* CJK Ideograph */
- [0x680f, 0x680f], /* CJK Ideograph */
- [0x6810, 0x6810], /* CJK Ideograph */
- [0x6811, 0x6811], /* CJK Ideograph */
- [0x6812, 0x6812], /* CJK Ideograph */
- [0x6813, 0x6813], /* CJK Ideograph */
- [0x6814, 0x6814], /* CJK Ideograph */
- [0x6815, 0x6815], /* CJK Ideograph */
- [0x6816, 0x6816], /* CJK Ideograph */
- [0x6817, 0x6817], /* CJK Ideograph */
- [0x6818, 0x6818], /* CJK Ideograph */
- [0x6819, 0x6819], /* CJK Ideograph */
- [0x681a, 0x681a], /* CJK Ideograph */
- [0x681b, 0x681b], /* CJK Ideograph */
- [0x681c, 0x681c], /* CJK Ideograph */
- [0x681d, 0x681d], /* CJK Ideograph */
- [0x681e, 0x681e], /* CJK Ideograph */
- [0x681f, 0x681f], /* CJK Ideograph */
- [0x6820, 0x6820], /* CJK Ideograph */
- [0x6821, 0x6821], /* CJK Ideograph */
- [0x6822, 0x6822], /* CJK Ideograph */
- [0x6823, 0x6823], /* CJK Ideograph */
- [0x6824, 0x6824], /* CJK Ideograph */
- [0x6825, 0x6825], /* CJK Ideograph */
- [0x6826, 0x6826], /* CJK Ideograph */
- [0x6827, 0x6827], /* CJK Ideograph */
- [0x6828, 0x6828], /* CJK Ideograph */
- [0x6829, 0x6829], /* CJK Ideograph */
- [0x682a, 0x682a], /* CJK Ideograph */
- [0x682b, 0x682b], /* CJK Ideograph */
- [0x682c, 0x682c], /* CJK Ideograph */
- [0x682d, 0x682d], /* CJK Ideograph */
- [0x682e, 0x682e], /* CJK Ideograph */
- [0x682f, 0x682f], /* CJK Ideograph */
- [0x6830, 0x6830], /* CJK Ideograph */
- [0x6831, 0x6831], /* CJK Ideograph */
- [0x6832, 0x6832], /* CJK Ideograph */
- [0x6833, 0x6833], /* CJK Ideograph */
- [0x6834, 0x6834], /* CJK Ideograph */
- [0x6835, 0x6835], /* CJK Ideograph */
- [0x6836, 0x6836], /* CJK Ideograph */
- [0x6837, 0x6837], /* CJK Ideograph */
- [0x6838, 0x6838], /* CJK Ideograph */
- [0x6839, 0x6839], /* CJK Ideograph */
- [0x683a, 0x683a], /* CJK Ideograph */
- [0x683b, 0x683b], /* CJK Ideograph */
- [0x683c, 0x683c], /* CJK Ideograph */
- [0x683d, 0x683d], /* CJK Ideograph */
- [0x683e, 0x683e], /* CJK Ideograph */
- [0x683f, 0x683f], /* CJK Ideograph */
- [0x6840, 0x6840], /* CJK Ideograph */
- [0x6841, 0x6841], /* CJK Ideograph */
- [0x6842, 0x6842], /* CJK Ideograph */
- [0x6843, 0x6843], /* CJK Ideograph */
- [0x6844, 0x6844], /* CJK Ideograph */
- [0x6845, 0x6845], /* CJK Ideograph */
- [0x6846, 0x6846], /* CJK Ideograph */
- [0x6847, 0x6847], /* CJK Ideograph */
- [0x6848, 0x6848], /* CJK Ideograph */
- [0x6849, 0x6849], /* CJK Ideograph */
- [0x684a, 0x684a], /* CJK Ideograph */
- [0x684b, 0x684b], /* CJK Ideograph */
- [0x684c, 0x684c], /* CJK Ideograph */
- [0x684d, 0x684d], /* CJK Ideograph */
- [0x684e, 0x684e], /* CJK Ideograph */
- [0x684f, 0x684f], /* CJK Ideograph */
- [0x6850, 0x6850], /* CJK Ideograph */
- [0x6851, 0x6851], /* CJK Ideograph */
- [0x6852, 0x6852], /* CJK Ideograph */
- [0x6853, 0x6853], /* CJK Ideograph */
- [0x6854, 0x6854], /* CJK Ideograph */
- [0x6855, 0x6855], /* CJK Ideograph */
- [0x6856, 0x6856], /* CJK Ideograph */
- [0x6857, 0x6857], /* CJK Ideograph */
- [0x6858, 0x6858], /* CJK Ideograph */
- [0x6859, 0x6859], /* CJK Ideograph */
- [0x685a, 0x685a], /* CJK Ideograph */
- [0x685b, 0x685b], /* CJK Ideograph */
- [0x685c, 0x685c], /* CJK Ideograph */
- [0x685d, 0x685d], /* CJK Ideograph */
- [0x685e, 0x685e], /* CJK Ideograph */
- [0x685f, 0x685f], /* CJK Ideograph */
- [0x6860, 0x6860], /* CJK Ideograph */
- [0x6861, 0x6861], /* CJK Ideograph */
- [0x6862, 0x6862], /* CJK Ideograph */
- [0x6863, 0x6863], /* CJK Ideograph */
- [0x6864, 0x6864], /* CJK Ideograph */
- [0x6865, 0x6865], /* CJK Ideograph */
- [0x6866, 0x6866], /* CJK Ideograph */
- [0x6867, 0x6867], /* CJK Ideograph */
- [0x6868, 0x6868], /* CJK Ideograph */
- [0x6869, 0x6869], /* CJK Ideograph */
- [0x686a, 0x686a], /* CJK Ideograph */
- [0x686b, 0x686b], /* CJK Ideograph */
- [0x686c, 0x686c], /* CJK Ideograph */
- [0x686d, 0x686d], /* CJK Ideograph */
- [0x686e, 0x686e], /* CJK Ideograph */
- [0x686f, 0x686f], /* CJK Ideograph */
- [0x6870, 0x6870], /* CJK Ideograph */
- [0x6871, 0x6871], /* CJK Ideograph */
- [0x6872, 0x6872], /* CJK Ideograph */
- [0x6873, 0x6873], /* CJK Ideograph */
- [0x6874, 0x6874], /* CJK Ideograph */
- [0x6875, 0x6875], /* CJK Ideograph */
- [0x6876, 0x6876], /* CJK Ideograph */
- [0x6877, 0x6877], /* CJK Ideograph */
- [0x6878, 0x6878], /* CJK Ideograph */
- [0x6879, 0x6879], /* CJK Ideograph */
- [0x687a, 0x687a], /* CJK Ideograph */
- [0x687b, 0x687b], /* CJK Ideograph */
- [0x687c, 0x687c], /* CJK Ideograph */
- [0x687d, 0x687d], /* CJK Ideograph */
- [0x687e, 0x687e], /* CJK Ideograph */
- [0x687f, 0x687f], /* CJK Ideograph */
- [0x6880, 0x6880], /* CJK Ideograph */
- [0x6881, 0x6881], /* CJK Ideograph */
- [0x6882, 0x6882], /* CJK Ideograph */
- [0x6883, 0x6883], /* CJK Ideograph */
- [0x6884, 0x6884], /* CJK Ideograph */
- [0x6885, 0x6885], /* CJK Ideograph */
- [0x6886, 0x6886], /* CJK Ideograph */
- [0x6887, 0x6887], /* CJK Ideograph */
- [0x6888, 0x6888], /* CJK Ideograph */
- [0x6889, 0x6889], /* CJK Ideograph */
- [0x688a, 0x688a], /* CJK Ideograph */
- [0x688b, 0x688b], /* CJK Ideograph */
- [0x688c, 0x688c], /* CJK Ideograph */
- [0x688d, 0x688d], /* CJK Ideograph */
- [0x688e, 0x688e], /* CJK Ideograph */
- [0x688f, 0x688f], /* CJK Ideograph */
- [0x6890, 0x6890], /* CJK Ideograph */
- [0x6891, 0x6891], /* CJK Ideograph */
- [0x6892, 0x6892], /* CJK Ideograph */
- [0x6893, 0x6893], /* CJK Ideograph */
- [0x6894, 0x6894], /* CJK Ideograph */
- [0x6895, 0x6895], /* CJK Ideograph */
- [0x6896, 0x6896], /* CJK Ideograph */
- [0x6897, 0x6897], /* CJK Ideograph */
- [0x6898, 0x6898], /* CJK Ideograph */
- [0x6899, 0x6899], /* CJK Ideograph */
- [0x689a, 0x689a], /* CJK Ideograph */
- [0x689b, 0x689b], /* CJK Ideograph */
- [0x689c, 0x689c], /* CJK Ideograph */
- [0x689d, 0x689d], /* CJK Ideograph */
- [0x689e, 0x689e], /* CJK Ideograph */
- [0x689f, 0x689f], /* CJK Ideograph */
- [0x68a0, 0x68a0], /* CJK Ideograph */
- [0x68a1, 0x68a1], /* CJK Ideograph */
- [0x68a2, 0x68a2], /* CJK Ideograph */
- [0x68a3, 0x68a3], /* CJK Ideograph */
- [0x68a4, 0x68a4], /* CJK Ideograph */
- [0x68a5, 0x68a5], /* CJK Ideograph */
- [0x68a6, 0x68a6], /* CJK Ideograph */
- [0x68a7, 0x68a7], /* CJK Ideograph */
- [0x68a8, 0x68a8], /* CJK Ideograph */
- [0x68a9, 0x68a9], /* CJK Ideograph */
- [0x68aa, 0x68aa], /* CJK Ideograph */
- [0x68ab, 0x68ab], /* CJK Ideograph */
- [0x68ac, 0x68ac], /* CJK Ideograph */
- [0x68ad, 0x68ad], /* CJK Ideograph */
- [0x68ae, 0x68ae], /* CJK Ideograph */
- [0x68af, 0x68af], /* CJK Ideograph */
- [0x68b0, 0x68b0], /* CJK Ideograph */
- [0x68b1, 0x68b1], /* CJK Ideograph */
- [0x68b2, 0x68b2], /* CJK Ideograph */
- [0x68b3, 0x68b3], /* CJK Ideograph */
- [0x68b4, 0x68b4], /* CJK Ideograph */
- [0x68b5, 0x68b5], /* CJK Ideograph */
- [0x68b6, 0x68b6], /* CJK Ideograph */
- [0x68b7, 0x68b7], /* CJK Ideograph */
- [0x68b8, 0x68b8], /* CJK Ideograph */
- [0x68b9, 0x68b9], /* CJK Ideograph */
- [0x68ba, 0x68ba], /* CJK Ideograph */
- [0x68bb, 0x68bb], /* CJK Ideograph */
- [0x68bc, 0x68bc], /* CJK Ideograph */
- [0x68bd, 0x68bd], /* CJK Ideograph */
- [0x68be, 0x68be], /* CJK Ideograph */
- [0x68bf, 0x68bf], /* CJK Ideograph */
- [0x68c0, 0x68c0], /* CJK Ideograph */
- [0x68c1, 0x68c1], /* CJK Ideograph */
- [0x68c2, 0x68c2], /* CJK Ideograph */
- [0x68c3, 0x68c3], /* CJK Ideograph */
- [0x68c4, 0x68c4], /* CJK Ideograph */
- [0x68c5, 0x68c5], /* CJK Ideograph */
- [0x68c6, 0x68c6], /* CJK Ideograph */
- [0x68c7, 0x68c7], /* CJK Ideograph */
- [0x68c8, 0x68c8], /* CJK Ideograph */
- [0x68c9, 0x68c9], /* CJK Ideograph */
- [0x68ca, 0x68ca], /* CJK Ideograph */
- [0x68cb, 0x68cb], /* CJK Ideograph */
- [0x68cc, 0x68cc], /* CJK Ideograph */
- [0x68cd, 0x68cd], /* CJK Ideograph */
- [0x68ce, 0x68ce], /* CJK Ideograph */
- [0x68cf, 0x68cf], /* CJK Ideograph */
- [0x68d0, 0x68d0], /* CJK Ideograph */
- [0x68d1, 0x68d1], /* CJK Ideograph */
- [0x68d2, 0x68d2], /* CJK Ideograph */
- [0x68d3, 0x68d3], /* CJK Ideograph */
- [0x68d4, 0x68d4], /* CJK Ideograph */
- [0x68d5, 0x68d5], /* CJK Ideograph */
- [0x68d6, 0x68d6], /* CJK Ideograph */
- [0x68d7, 0x68d7], /* CJK Ideograph */
- [0x68d8, 0x68d8], /* CJK Ideograph */
- [0x68d9, 0x68d9], /* CJK Ideograph */
- [0x68da, 0x68da], /* CJK Ideograph */
- [0x68db, 0x68db], /* CJK Ideograph */
- [0x68dc, 0x68dc], /* CJK Ideograph */
- [0x68dd, 0x68dd], /* CJK Ideograph */
- [0x68de, 0x68de], /* CJK Ideograph */
- [0x68df, 0x68df], /* CJK Ideograph */
- [0x68e0, 0x68e0], /* CJK Ideograph */
- [0x68e1, 0x68e1], /* CJK Ideograph */
- [0x68e2, 0x68e2], /* CJK Ideograph */
- [0x68e3, 0x68e3], /* CJK Ideograph */
- [0x68e4, 0x68e4], /* CJK Ideograph */
- [0x68e5, 0x68e5], /* CJK Ideograph */
- [0x68e6, 0x68e6], /* CJK Ideograph */
- [0x68e7, 0x68e7], /* CJK Ideograph */
- [0x68e8, 0x68e8], /* CJK Ideograph */
- [0x68e9, 0x68e9], /* CJK Ideograph */
- [0x68ea, 0x68ea], /* CJK Ideograph */
- [0x68eb, 0x68eb], /* CJK Ideograph */
- [0x68ec, 0x68ec], /* CJK Ideograph */
- [0x68ed, 0x68ed], /* CJK Ideograph */
- [0x68ee, 0x68ee], /* CJK Ideograph */
- [0x68ef, 0x68ef], /* CJK Ideograph */
- [0x68f0, 0x68f0], /* CJK Ideograph */
- [0x68f1, 0x68f1], /* CJK Ideograph */
- [0x68f2, 0x68f2], /* CJK Ideograph */
- [0x68f3, 0x68f3], /* CJK Ideograph */
- [0x68f4, 0x68f4], /* CJK Ideograph */
- [0x68f5, 0x68f5], /* CJK Ideograph */
- [0x68f6, 0x68f6], /* CJK Ideograph */
- [0x68f7, 0x68f7], /* CJK Ideograph */
- [0x68f8, 0x68f8], /* CJK Ideograph */
- [0x68f9, 0x68f9], /* CJK Ideograph */
- [0x68fa, 0x68fa], /* CJK Ideograph */
- [0x68fb, 0x68fb], /* CJK Ideograph */
- [0x68fc, 0x68fc], /* CJK Ideograph */
- [0x68fd, 0x68fd], /* CJK Ideograph */
- [0x68fe, 0x68fe], /* CJK Ideograph */
- [0x68ff, 0x68ff], /* CJK Ideograph */
- [0x6900, 0x6900], /* CJK Ideograph */
- [0x6901, 0x6901], /* CJK Ideograph */
- [0x6902, 0x6902], /* CJK Ideograph */
- [0x6903, 0x6903], /* CJK Ideograph */
- [0x6904, 0x6904], /* CJK Ideograph */
- [0x6905, 0x6905], /* CJK Ideograph */
- [0x6906, 0x6906], /* CJK Ideograph */
- [0x6907, 0x6907], /* CJK Ideograph */
- [0x6908, 0x6908], /* CJK Ideograph */
- [0x6909, 0x6909], /* CJK Ideograph */
- [0x690a, 0x690a], /* CJK Ideograph */
- [0x690b, 0x690b], /* CJK Ideograph */
- [0x690c, 0x690c], /* CJK Ideograph */
- [0x690d, 0x690d], /* CJK Ideograph */
- [0x690e, 0x690e], /* CJK Ideograph */
- [0x690f, 0x690f], /* CJK Ideograph */
- [0x6910, 0x6910], /* CJK Ideograph */
- [0x6911, 0x6911], /* CJK Ideograph */
- [0x6912, 0x6912], /* CJK Ideograph */
- [0x6913, 0x6913], /* CJK Ideograph */
- [0x6914, 0x6914], /* CJK Ideograph */
- [0x6915, 0x6915], /* CJK Ideograph */
- [0x6916, 0x6916], /* CJK Ideograph */
- [0x6917, 0x6917], /* CJK Ideograph */
- [0x6918, 0x6918], /* CJK Ideograph */
- [0x6919, 0x6919], /* CJK Ideograph */
- [0x691a, 0x691a], /* CJK Ideograph */
- [0x691b, 0x691b], /* CJK Ideograph */
- [0x691c, 0x691c], /* CJK Ideograph */
- [0x691d, 0x691d], /* CJK Ideograph */
- [0x691e, 0x691e], /* CJK Ideograph */
- [0x691f, 0x691f], /* CJK Ideograph */
- [0x6920, 0x6920], /* CJK Ideograph */
- [0x6921, 0x6921], /* CJK Ideograph */
- [0x6922, 0x6922], /* CJK Ideograph */
- [0x6923, 0x6923], /* CJK Ideograph */
- [0x6924, 0x6924], /* CJK Ideograph */
- [0x6925, 0x6925], /* CJK Ideograph */
- [0x6926, 0x6926], /* CJK Ideograph */
- [0x6927, 0x6927], /* CJK Ideograph */
- [0x6928, 0x6928], /* CJK Ideograph */
- [0x6929, 0x6929], /* CJK Ideograph */
- [0x692a, 0x692a], /* CJK Ideograph */
- [0x692b, 0x692b], /* CJK Ideograph */
- [0x692c, 0x692c], /* CJK Ideograph */
- [0x692d, 0x692d], /* CJK Ideograph */
- [0x692e, 0x692e], /* CJK Ideograph */
- [0x692f, 0x692f], /* CJK Ideograph */
- [0x6930, 0x6930], /* CJK Ideograph */
- [0x6931, 0x6931], /* CJK Ideograph */
- [0x6932, 0x6932], /* CJK Ideograph */
- [0x6933, 0x6933], /* CJK Ideograph */
- [0x6934, 0x6934], /* CJK Ideograph */
- [0x6935, 0x6935], /* CJK Ideograph */
- [0x6936, 0x6936], /* CJK Ideograph */
- [0x6937, 0x6937], /* CJK Ideograph */
- [0x6938, 0x6938], /* CJK Ideograph */
- [0x6939, 0x6939], /* CJK Ideograph */
- [0x693a, 0x693a], /* CJK Ideograph */
- [0x693b, 0x693b], /* CJK Ideograph */
- [0x693c, 0x693c], /* CJK Ideograph */
- [0x693d, 0x693d], /* CJK Ideograph */
- [0x693e, 0x693e], /* CJK Ideograph */
- [0x693f, 0x693f], /* CJK Ideograph */
- [0x6940, 0x6940], /* CJK Ideograph */
- [0x6941, 0x6941], /* CJK Ideograph */
- [0x6942, 0x6942], /* CJK Ideograph */
- [0x6943, 0x6943], /* CJK Ideograph */
- [0x6944, 0x6944], /* CJK Ideograph */
- [0x6945, 0x6945], /* CJK Ideograph */
- [0x6946, 0x6946], /* CJK Ideograph */
- [0x6947, 0x6947], /* CJK Ideograph */
- [0x6948, 0x6948], /* CJK Ideograph */
- [0x6949, 0x6949], /* CJK Ideograph */
- [0x694a, 0x694a], /* CJK Ideograph */
- [0x694b, 0x694b], /* CJK Ideograph */
- [0x694c, 0x694c], /* CJK Ideograph */
- [0x694d, 0x694d], /* CJK Ideograph */
- [0x694e, 0x694e], /* CJK Ideograph */
- [0x694f, 0x694f], /* CJK Ideograph */
- [0x6950, 0x6950], /* CJK Ideograph */
- [0x6951, 0x6951], /* CJK Ideograph */
- [0x6952, 0x6952], /* CJK Ideograph */
- [0x6953, 0x6953], /* CJK Ideograph */
- [0x6954, 0x6954], /* CJK Ideograph */
- [0x6955, 0x6955], /* CJK Ideograph */
- [0x6956, 0x6956], /* CJK Ideograph */
- [0x6957, 0x6957], /* CJK Ideograph */
- [0x6958, 0x6958], /* CJK Ideograph */
- [0x6959, 0x6959], /* CJK Ideograph */
- [0x695a, 0x695a], /* CJK Ideograph */
- [0x695b, 0x695b], /* CJK Ideograph */
- [0x695c, 0x695c], /* CJK Ideograph */
- [0x695d, 0x695d], /* CJK Ideograph */
- [0x695e, 0x695e], /* CJK Ideograph */
- [0x695f, 0x695f], /* CJK Ideograph */
- [0x6960, 0x6960], /* CJK Ideograph */
- [0x6961, 0x6961], /* CJK Ideograph */
- [0x6962, 0x6962], /* CJK Ideograph */
- [0x6963, 0x6963], /* CJK Ideograph */
- [0x6964, 0x6964], /* CJK Ideograph */
- [0x6965, 0x6965], /* CJK Ideograph */
- [0x6966, 0x6966], /* CJK Ideograph */
- [0x6967, 0x6967], /* CJK Ideograph */
- [0x6968, 0x6968], /* CJK Ideograph */
- [0x6969, 0x6969], /* CJK Ideograph */
- [0x696a, 0x696a], /* CJK Ideograph */
- [0x696b, 0x696b], /* CJK Ideograph */
- [0x696c, 0x696c], /* CJK Ideograph */
- [0x696d, 0x696d], /* CJK Ideograph */
- [0x696e, 0x696e], /* CJK Ideograph */
- [0x696f, 0x696f], /* CJK Ideograph */
- [0x6970, 0x6970], /* CJK Ideograph */
- [0x6971, 0x6971], /* CJK Ideograph */
- [0x6972, 0x6972], /* CJK Ideograph */
- [0x6973, 0x6973], /* CJK Ideograph */
- [0x6974, 0x6974], /* CJK Ideograph */
- [0x6975, 0x6975], /* CJK Ideograph */
- [0x6976, 0x6976], /* CJK Ideograph */
- [0x6977, 0x6977], /* CJK Ideograph */
- [0x6978, 0x6978], /* CJK Ideograph */
- [0x6979, 0x6979], /* CJK Ideograph */
- [0x697a, 0x697a], /* CJK Ideograph */
- [0x697b, 0x697b], /* CJK Ideograph */
- [0x697c, 0x697c], /* CJK Ideograph */
- [0x697d, 0x697d], /* CJK Ideograph */
- [0x697e, 0x697e], /* CJK Ideograph */
- [0x697f, 0x697f], /* CJK Ideograph */
- [0x6980, 0x6980], /* CJK Ideograph */
- [0x6981, 0x6981], /* CJK Ideograph */
- [0x6982, 0x6982], /* CJK Ideograph */
- [0x6983, 0x6983], /* CJK Ideograph */
- [0x6984, 0x6984], /* CJK Ideograph */
- [0x6985, 0x6985], /* CJK Ideograph */
- [0x6986, 0x6986], /* CJK Ideograph */
- [0x6987, 0x6987], /* CJK Ideograph */
- [0x6988, 0x6988], /* CJK Ideograph */
- [0x6989, 0x6989], /* CJK Ideograph */
- [0x698a, 0x698a], /* CJK Ideograph */
- [0x698b, 0x698b], /* CJK Ideograph */
- [0x698c, 0x698c], /* CJK Ideograph */
- [0x698d, 0x698d], /* CJK Ideograph */
- [0x698e, 0x698e], /* CJK Ideograph */
- [0x698f, 0x698f], /* CJK Ideograph */
- [0x6990, 0x6990], /* CJK Ideograph */
- [0x6991, 0x6991], /* CJK Ideograph */
- [0x6992, 0x6992], /* CJK Ideograph */
- [0x6993, 0x6993], /* CJK Ideograph */
- [0x6994, 0x6994], /* CJK Ideograph */
- [0x6995, 0x6995], /* CJK Ideograph */
- [0x6996, 0x6996], /* CJK Ideograph */
- [0x6997, 0x6997], /* CJK Ideograph */
- [0x6998, 0x6998], /* CJK Ideograph */
- [0x6999, 0x6999], /* CJK Ideograph */
- [0x699a, 0x699a], /* CJK Ideograph */
- [0x699b, 0x699b], /* CJK Ideograph */
- [0x699c, 0x699c], /* CJK Ideograph */
- [0x699d, 0x699d], /* CJK Ideograph */
- [0x699e, 0x699e], /* CJK Ideograph */
- [0x699f, 0x699f], /* CJK Ideograph */
- [0x69a0, 0x69a0], /* CJK Ideograph */
- [0x69a1, 0x69a1], /* CJK Ideograph */
- [0x69a2, 0x69a2], /* CJK Ideograph */
- [0x69a3, 0x69a3], /* CJK Ideograph */
- [0x69a4, 0x69a4], /* CJK Ideograph */
- [0x69a5, 0x69a5], /* CJK Ideograph */
- [0x69a6, 0x69a6], /* CJK Ideograph */
- [0x69a7, 0x69a7], /* CJK Ideograph */
- [0x69a8, 0x69a8], /* CJK Ideograph */
- [0x69a9, 0x69a9], /* CJK Ideograph */
- [0x69aa, 0x69aa], /* CJK Ideograph */
- [0x69ab, 0x69ab], /* CJK Ideograph */
- [0x69ac, 0x69ac], /* CJK Ideograph */
- [0x69ad, 0x69ad], /* CJK Ideograph */
- [0x69ae, 0x69ae], /* CJK Ideograph */
- [0x69af, 0x69af], /* CJK Ideograph */
- [0x69b0, 0x69b0], /* CJK Ideograph */
- [0x69b1, 0x69b1], /* CJK Ideograph */
- [0x69b2, 0x69b2], /* CJK Ideograph */
- [0x69b3, 0x69b3], /* CJK Ideograph */
- [0x69b4, 0x69b4], /* CJK Ideograph */
- [0x69b5, 0x69b5], /* CJK Ideograph */
- [0x69b6, 0x69b6], /* CJK Ideograph */
- [0x69b7, 0x69b7], /* CJK Ideograph */
- [0x69b8, 0x69b8], /* CJK Ideograph */
- [0x69b9, 0x69b9], /* CJK Ideograph */
- [0x69ba, 0x69ba], /* CJK Ideograph */
- [0x69bb, 0x69bb], /* CJK Ideograph */
- [0x69bc, 0x69bc], /* CJK Ideograph */
- [0x69bd, 0x69bd], /* CJK Ideograph */
- [0x69be, 0x69be], /* CJK Ideograph */
- [0x69bf, 0x69bf], /* CJK Ideograph */
- [0x69c0, 0x69c0], /* CJK Ideograph */
- [0x69c1, 0x69c1], /* CJK Ideograph */
- [0x69c2, 0x69c2], /* CJK Ideograph */
- [0x69c3, 0x69c3], /* CJK Ideograph */
- [0x69c4, 0x69c4], /* CJK Ideograph */
- [0x69c5, 0x69c5], /* CJK Ideograph */
- [0x69c6, 0x69c6], /* CJK Ideograph */
- [0x69c7, 0x69c7], /* CJK Ideograph */
- [0x69c8, 0x69c8], /* CJK Ideograph */
- [0x69c9, 0x69c9], /* CJK Ideograph */
- [0x69ca, 0x69ca], /* CJK Ideograph */
- [0x69cb, 0x69cb], /* CJK Ideograph */
- [0x69cc, 0x69cc], /* CJK Ideograph */
- [0x69cd, 0x69cd], /* CJK Ideograph */
- [0x69ce, 0x69ce], /* CJK Ideograph */
- [0x69cf, 0x69cf], /* CJK Ideograph */
- [0x69d0, 0x69d0], /* CJK Ideograph */
- [0x69d1, 0x69d1], /* CJK Ideograph */
- [0x69d2, 0x69d2], /* CJK Ideograph */
- [0x69d3, 0x69d3], /* CJK Ideograph */
- [0x69d4, 0x69d4], /* CJK Ideograph */
- [0x69d5, 0x69d5], /* CJK Ideograph */
- [0x69d6, 0x69d6], /* CJK Ideograph */
- [0x69d7, 0x69d7], /* CJK Ideograph */
- [0x69d8, 0x69d8], /* CJK Ideograph */
- [0x69d9, 0x69d9], /* CJK Ideograph */
- [0x69da, 0x69da], /* CJK Ideograph */
- [0x69db, 0x69db], /* CJK Ideograph */
- [0x69dc, 0x69dc], /* CJK Ideograph */
- [0x69dd, 0x69dd], /* CJK Ideograph */
- [0x69de, 0x69de], /* CJK Ideograph */
- [0x69df, 0x69df], /* CJK Ideograph */
- [0x69e0, 0x69e0], /* CJK Ideograph */
- [0x69e1, 0x69e1], /* CJK Ideograph */
- [0x69e2, 0x69e2], /* CJK Ideograph */
- [0x69e3, 0x69e3], /* CJK Ideograph */
- [0x69e4, 0x69e4], /* CJK Ideograph */
- [0x69e5, 0x69e5], /* CJK Ideograph */
- [0x69e6, 0x69e6], /* CJK Ideograph */
- [0x69e7, 0x69e7], /* CJK Ideograph */
- [0x69e8, 0x69e8], /* CJK Ideograph */
- [0x69e9, 0x69e9], /* CJK Ideograph */
- [0x69ea, 0x69ea], /* CJK Ideograph */
- [0x69eb, 0x69eb], /* CJK Ideograph */
- [0x69ec, 0x69ec], /* CJK Ideograph */
- [0x69ed, 0x69ed], /* CJK Ideograph */
- [0x69ee, 0x69ee], /* CJK Ideograph */
- [0x69ef, 0x69ef], /* CJK Ideograph */
- [0x69f0, 0x69f0], /* CJK Ideograph */
- [0x69f1, 0x69f1], /* CJK Ideograph */
- [0x69f2, 0x69f2], /* CJK Ideograph */
- [0x69f3, 0x69f3], /* CJK Ideograph */
- [0x69f4, 0x69f4], /* CJK Ideograph */
- [0x69f5, 0x69f5], /* CJK Ideograph */
- [0x69f6, 0x69f6], /* CJK Ideograph */
- [0x69f7, 0x69f7], /* CJK Ideograph */
- [0x69f8, 0x69f8], /* CJK Ideograph */
- [0x69f9, 0x69f9], /* CJK Ideograph */
- [0x69fa, 0x69fa], /* CJK Ideograph */
- [0x69fb, 0x69fb], /* CJK Ideograph */
- [0x69fc, 0x69fc], /* CJK Ideograph */
- [0x69fd, 0x69fd], /* CJK Ideograph */
- [0x69fe, 0x69fe], /* CJK Ideograph */
- [0x69ff, 0x69ff], /* CJK Ideograph */
- [0x6a00, 0x6a00], /* CJK Ideograph */
- [0x6a01, 0x6a01], /* CJK Ideograph */
- [0x6a02, 0x6a02], /* CJK Ideograph */
- [0x6a03, 0x6a03], /* CJK Ideograph */
- [0x6a04, 0x6a04], /* CJK Ideograph */
- [0x6a05, 0x6a05], /* CJK Ideograph */
- [0x6a06, 0x6a06], /* CJK Ideograph */
- [0x6a07, 0x6a07], /* CJK Ideograph */
- [0x6a08, 0x6a08], /* CJK Ideograph */
- [0x6a09, 0x6a09], /* CJK Ideograph */
- [0x6a0a, 0x6a0a], /* CJK Ideograph */
- [0x6a0b, 0x6a0b], /* CJK Ideograph */
- [0x6a0c, 0x6a0c], /* CJK Ideograph */
- [0x6a0d, 0x6a0d], /* CJK Ideograph */
- [0x6a0e, 0x6a0e], /* CJK Ideograph */
- [0x6a0f, 0x6a0f], /* CJK Ideograph */
- [0x6a10, 0x6a10], /* CJK Ideograph */
- [0x6a11, 0x6a11], /* CJK Ideograph */
- [0x6a12, 0x6a12], /* CJK Ideograph */
- [0x6a13, 0x6a13], /* CJK Ideograph */
- [0x6a14, 0x6a14], /* CJK Ideograph */
- [0x6a15, 0x6a15], /* CJK Ideograph */
- [0x6a16, 0x6a16], /* CJK Ideograph */
- [0x6a17, 0x6a17], /* CJK Ideograph */
- [0x6a18, 0x6a18], /* CJK Ideograph */
- [0x6a19, 0x6a19], /* CJK Ideograph */
- [0x6a1a, 0x6a1a], /* CJK Ideograph */
- [0x6a1b, 0x6a1b], /* CJK Ideograph */
- [0x6a1c, 0x6a1c], /* CJK Ideograph */
- [0x6a1d, 0x6a1d], /* CJK Ideograph */
- [0x6a1e, 0x6a1e], /* CJK Ideograph */
- [0x6a1f, 0x6a1f], /* CJK Ideograph */
- [0x6a20, 0x6a20], /* CJK Ideograph */
- [0x6a21, 0x6a21], /* CJK Ideograph */
- [0x6a22, 0x6a22], /* CJK Ideograph */
- [0x6a23, 0x6a23], /* CJK Ideograph */
- [0x6a24, 0x6a24], /* CJK Ideograph */
- [0x6a25, 0x6a25], /* CJK Ideograph */
- [0x6a26, 0x6a26], /* CJK Ideograph */
- [0x6a27, 0x6a27], /* CJK Ideograph */
- [0x6a28, 0x6a28], /* CJK Ideograph */
- [0x6a29, 0x6a29], /* CJK Ideograph */
- [0x6a2a, 0x6a2a], /* CJK Ideograph */
- [0x6a2b, 0x6a2b], /* CJK Ideograph */
- [0x6a2c, 0x6a2c], /* CJK Ideograph */
- [0x6a2d, 0x6a2d], /* CJK Ideograph */
- [0x6a2e, 0x6a2e], /* CJK Ideograph */
- [0x6a2f, 0x6a2f], /* CJK Ideograph */
- [0x6a30, 0x6a30], /* CJK Ideograph */
- [0x6a31, 0x6a31], /* CJK Ideograph */
- [0x6a32, 0x6a32], /* CJK Ideograph */
- [0x6a33, 0x6a33], /* CJK Ideograph */
- [0x6a34, 0x6a34], /* CJK Ideograph */
- [0x6a35, 0x6a35], /* CJK Ideograph */
- [0x6a36, 0x6a36], /* CJK Ideograph */
- [0x6a37, 0x6a37], /* CJK Ideograph */
- [0x6a38, 0x6a38], /* CJK Ideograph */
- [0x6a39, 0x6a39], /* CJK Ideograph */
- [0x6a3a, 0x6a3a], /* CJK Ideograph */
- [0x6a3b, 0x6a3b], /* CJK Ideograph */
- [0x6a3c, 0x6a3c], /* CJK Ideograph */
- [0x6a3d, 0x6a3d], /* CJK Ideograph */
- [0x6a3e, 0x6a3e], /* CJK Ideograph */
- [0x6a3f, 0x6a3f], /* CJK Ideograph */
- [0x6a40, 0x6a40], /* CJK Ideograph */
- [0x6a41, 0x6a41], /* CJK Ideograph */
- [0x6a42, 0x6a42], /* CJK Ideograph */
- [0x6a43, 0x6a43], /* CJK Ideograph */
- [0x6a44, 0x6a44], /* CJK Ideograph */
- [0x6a45, 0x6a45], /* CJK Ideograph */
- [0x6a46, 0x6a46], /* CJK Ideograph */
- [0x6a47, 0x6a47], /* CJK Ideograph */
- [0x6a48, 0x6a48], /* CJK Ideograph */
- [0x6a49, 0x6a49], /* CJK Ideograph */
- [0x6a4a, 0x6a4a], /* CJK Ideograph */
- [0x6a4b, 0x6a4b], /* CJK Ideograph */
- [0x6a4c, 0x6a4c], /* CJK Ideograph */
- [0x6a4d, 0x6a4d], /* CJK Ideograph */
- [0x6a4e, 0x6a4e], /* CJK Ideograph */
- [0x6a4f, 0x6a4f], /* CJK Ideograph */
- [0x6a50, 0x6a50], /* CJK Ideograph */
- [0x6a51, 0x6a51], /* CJK Ideograph */
- [0x6a52, 0x6a52], /* CJK Ideograph */
- [0x6a53, 0x6a53], /* CJK Ideograph */
- [0x6a54, 0x6a54], /* CJK Ideograph */
- [0x6a55, 0x6a55], /* CJK Ideograph */
- [0x6a56, 0x6a56], /* CJK Ideograph */
- [0x6a57, 0x6a57], /* CJK Ideograph */
- [0x6a58, 0x6a58], /* CJK Ideograph */
- [0x6a59, 0x6a59], /* CJK Ideograph */
- [0x6a5a, 0x6a5a], /* CJK Ideograph */
- [0x6a5b, 0x6a5b], /* CJK Ideograph */
- [0x6a5c, 0x6a5c], /* CJK Ideograph */
- [0x6a5d, 0x6a5d], /* CJK Ideograph */
- [0x6a5e, 0x6a5e], /* CJK Ideograph */
- [0x6a5f, 0x6a5f], /* CJK Ideograph */
- [0x6a60, 0x6a60], /* CJK Ideograph */
- [0x6a61, 0x6a61], /* CJK Ideograph */
- [0x6a62, 0x6a62], /* CJK Ideograph */
- [0x6a63, 0x6a63], /* CJK Ideograph */
- [0x6a64, 0x6a64], /* CJK Ideograph */
- [0x6a65, 0x6a65], /* CJK Ideograph */
- [0x6a66, 0x6a66], /* CJK Ideograph */
- [0x6a67, 0x6a67], /* CJK Ideograph */
- [0x6a68, 0x6a68], /* CJK Ideograph */
- [0x6a69, 0x6a69], /* CJK Ideograph */
- [0x6a6a, 0x6a6a], /* CJK Ideograph */
- [0x6a6b, 0x6a6b], /* CJK Ideograph */
- [0x6a6c, 0x6a6c], /* CJK Ideograph */
- [0x6a6d, 0x6a6d], /* CJK Ideograph */
- [0x6a6e, 0x6a6e], /* CJK Ideograph */
- [0x6a6f, 0x6a6f], /* CJK Ideograph */
- [0x6a70, 0x6a70], /* CJK Ideograph */
- [0x6a71, 0x6a71], /* CJK Ideograph */
- [0x6a72, 0x6a72], /* CJK Ideograph */
- [0x6a73, 0x6a73], /* CJK Ideograph */
- [0x6a74, 0x6a74], /* CJK Ideograph */
- [0x6a75, 0x6a75], /* CJK Ideograph */
- [0x6a76, 0x6a76], /* CJK Ideograph */
- [0x6a77, 0x6a77], /* CJK Ideograph */
- [0x6a78, 0x6a78], /* CJK Ideograph */
- [0x6a79, 0x6a79], /* CJK Ideograph */
- [0x6a7a, 0x6a7a], /* CJK Ideograph */
- [0x6a7b, 0x6a7b], /* CJK Ideograph */
- [0x6a7c, 0x6a7c], /* CJK Ideograph */
- [0x6a7d, 0x6a7d], /* CJK Ideograph */
- [0x6a7e, 0x6a7e], /* CJK Ideograph */
- [0x6a7f, 0x6a7f], /* CJK Ideograph */
- [0x6a80, 0x6a80], /* CJK Ideograph */
- [0x6a81, 0x6a81], /* CJK Ideograph */
- [0x6a82, 0x6a82], /* CJK Ideograph */
- [0x6a83, 0x6a83], /* CJK Ideograph */
- [0x6a84, 0x6a84], /* CJK Ideograph */
- [0x6a85, 0x6a85], /* CJK Ideograph */
- [0x6a86, 0x6a86], /* CJK Ideograph */
- [0x6a87, 0x6a87], /* CJK Ideograph */
- [0x6a88, 0x6a88], /* CJK Ideograph */
- [0x6a89, 0x6a89], /* CJK Ideograph */
- [0x6a8a, 0x6a8a], /* CJK Ideograph */
- [0x6a8b, 0x6a8b], /* CJK Ideograph */
- [0x6a8c, 0x6a8c], /* CJK Ideograph */
- [0x6a8d, 0x6a8d], /* CJK Ideograph */
- [0x6a8e, 0x6a8e], /* CJK Ideograph */
- [0x6a8f, 0x6a8f], /* CJK Ideograph */
- [0x6a90, 0x6a90], /* CJK Ideograph */
- [0x6a91, 0x6a91], /* CJK Ideograph */
- [0x6a92, 0x6a92], /* CJK Ideograph */
- [0x6a93, 0x6a93], /* CJK Ideograph */
- [0x6a94, 0x6a94], /* CJK Ideograph */
- [0x6a95, 0x6a95], /* CJK Ideograph */
- [0x6a96, 0x6a96], /* CJK Ideograph */
- [0x6a97, 0x6a97], /* CJK Ideograph */
- [0x6a98, 0x6a98], /* CJK Ideograph */
- [0x6a99, 0x6a99], /* CJK Ideograph */
- [0x6a9a, 0x6a9a], /* CJK Ideograph */
- [0x6a9b, 0x6a9b], /* CJK Ideograph */
- [0x6a9c, 0x6a9c], /* CJK Ideograph */
- [0x6a9d, 0x6a9d], /* CJK Ideograph */
- [0x6a9e, 0x6a9e], /* CJK Ideograph */
- [0x6a9f, 0x6a9f], /* CJK Ideograph */
- [0x6aa0, 0x6aa0], /* CJK Ideograph */
- [0x6aa1, 0x6aa1], /* CJK Ideograph */
- [0x6aa2, 0x6aa2], /* CJK Ideograph */
- [0x6aa3, 0x6aa3], /* CJK Ideograph */
- [0x6aa4, 0x6aa4], /* CJK Ideograph */
- [0x6aa5, 0x6aa5], /* CJK Ideograph */
- [0x6aa6, 0x6aa6], /* CJK Ideograph */
- [0x6aa7, 0x6aa7], /* CJK Ideograph */
- [0x6aa8, 0x6aa8], /* CJK Ideograph */
- [0x6aa9, 0x6aa9], /* CJK Ideograph */
- [0x6aaa, 0x6aaa], /* CJK Ideograph */
- [0x6aab, 0x6aab], /* CJK Ideograph */
- [0x6aac, 0x6aac], /* CJK Ideograph */
- [0x6aad, 0x6aad], /* CJK Ideograph */
- [0x6aae, 0x6aae], /* CJK Ideograph */
- [0x6aaf, 0x6aaf], /* CJK Ideograph */
- [0x6ab0, 0x6ab0], /* CJK Ideograph */
- [0x6ab1, 0x6ab1], /* CJK Ideograph */
- [0x6ab2, 0x6ab2], /* CJK Ideograph */
- [0x6ab3, 0x6ab3], /* CJK Ideograph */
- [0x6ab4, 0x6ab4], /* CJK Ideograph */
- [0x6ab5, 0x6ab5], /* CJK Ideograph */
- [0x6ab6, 0x6ab6], /* CJK Ideograph */
- [0x6ab7, 0x6ab7], /* CJK Ideograph */
- [0x6ab8, 0x6ab8], /* CJK Ideograph */
- [0x6ab9, 0x6ab9], /* CJK Ideograph */
- [0x6aba, 0x6aba], /* CJK Ideograph */
- [0x6abb, 0x6abb], /* CJK Ideograph */
- [0x6abc, 0x6abc], /* CJK Ideograph */
- [0x6abd, 0x6abd], /* CJK Ideograph */
- [0x6abe, 0x6abe], /* CJK Ideograph */
- [0x6abf, 0x6abf], /* CJK Ideograph */
- [0x6ac0, 0x6ac0], /* CJK Ideograph */
- [0x6ac1, 0x6ac1], /* CJK Ideograph */
- [0x6ac2, 0x6ac2], /* CJK Ideograph */
- [0x6ac3, 0x6ac3], /* CJK Ideograph */
- [0x6ac4, 0x6ac4], /* CJK Ideograph */
- [0x6ac5, 0x6ac5], /* CJK Ideograph */
- [0x6ac6, 0x6ac6], /* CJK Ideograph */
- [0x6ac7, 0x6ac7], /* CJK Ideograph */
- [0x6ac8, 0x6ac8], /* CJK Ideograph */
- [0x6ac9, 0x6ac9], /* CJK Ideograph */
- [0x6aca, 0x6aca], /* CJK Ideograph */
- [0x6acb, 0x6acb], /* CJK Ideograph */
- [0x6acc, 0x6acc], /* CJK Ideograph */
- [0x6acd, 0x6acd], /* CJK Ideograph */
- [0x6ace, 0x6ace], /* CJK Ideograph */
- [0x6acf, 0x6acf], /* CJK Ideograph */
- [0x6ad0, 0x6ad0], /* CJK Ideograph */
- [0x6ad1, 0x6ad1], /* CJK Ideograph */
- [0x6ad2, 0x6ad2], /* CJK Ideograph */
- [0x6ad3, 0x6ad3], /* CJK Ideograph */
- [0x6ad4, 0x6ad4], /* CJK Ideograph */
- [0x6ad5, 0x6ad5], /* CJK Ideograph */
- [0x6ad6, 0x6ad6], /* CJK Ideograph */
- [0x6ad7, 0x6ad7], /* CJK Ideograph */
- [0x6ad8, 0x6ad8], /* CJK Ideograph */
- [0x6ad9, 0x6ad9], /* CJK Ideograph */
- [0x6ada, 0x6ada], /* CJK Ideograph */
- [0x6adb, 0x6adb], /* CJK Ideograph */
- [0x6adc, 0x6adc], /* CJK Ideograph */
- [0x6add, 0x6add], /* CJK Ideograph */
- [0x6ade, 0x6ade], /* CJK Ideograph */
- [0x6adf, 0x6adf], /* CJK Ideograph */
- [0x6ae0, 0x6ae0], /* CJK Ideograph */
- [0x6ae1, 0x6ae1], /* CJK Ideograph */
- [0x6ae2, 0x6ae2], /* CJK Ideograph */
- [0x6ae3, 0x6ae3], /* CJK Ideograph */
- [0x6ae4, 0x6ae4], /* CJK Ideograph */
- [0x6ae5, 0x6ae5], /* CJK Ideograph */
- [0x6ae6, 0x6ae6], /* CJK Ideograph */
- [0x6ae7, 0x6ae7], /* CJK Ideograph */
- [0x6ae8, 0x6ae8], /* CJK Ideograph */
- [0x6ae9, 0x6ae9], /* CJK Ideograph */
- [0x6aea, 0x6aea], /* CJK Ideograph */
- [0x6aeb, 0x6aeb], /* CJK Ideograph */
- [0x6aec, 0x6aec], /* CJK Ideograph */
- [0x6aed, 0x6aed], /* CJK Ideograph */
- [0x6aee, 0x6aee], /* CJK Ideograph */
- [0x6aef, 0x6aef], /* CJK Ideograph */
- [0x6af0, 0x6af0], /* CJK Ideograph */
- [0x6af1, 0x6af1], /* CJK Ideograph */
- [0x6af2, 0x6af2], /* CJK Ideograph */
- [0x6af3, 0x6af3], /* CJK Ideograph */
- [0x6af4, 0x6af4], /* CJK Ideograph */
- [0x6af5, 0x6af5], /* CJK Ideograph */
- [0x6af6, 0x6af6], /* CJK Ideograph */
- [0x6af7, 0x6af7], /* CJK Ideograph */
- [0x6af8, 0x6af8], /* CJK Ideograph */
- [0x6af9, 0x6af9], /* CJK Ideograph */
- [0x6afa, 0x6afa], /* CJK Ideograph */
- [0x6afb, 0x6afb], /* CJK Ideograph */
- [0x6afc, 0x6afc], /* CJK Ideograph */
- [0x6afd, 0x6afd], /* CJK Ideograph */
- [0x6afe, 0x6afe], /* CJK Ideograph */
- [0x6aff, 0x6aff], /* CJK Ideograph */
- [0x6b00, 0x6b00], /* CJK Ideograph */
- [0x6b01, 0x6b01], /* CJK Ideograph */
- [0x6b02, 0x6b02], /* CJK Ideograph */
- [0x6b03, 0x6b03], /* CJK Ideograph */
- [0x6b04, 0x6b04], /* CJK Ideograph */
- [0x6b05, 0x6b05], /* CJK Ideograph */
- [0x6b06, 0x6b06], /* CJK Ideograph */
- [0x6b07, 0x6b07], /* CJK Ideograph */
- [0x6b08, 0x6b08], /* CJK Ideograph */
- [0x6b09, 0x6b09], /* CJK Ideograph */
- [0x6b0a, 0x6b0a], /* CJK Ideograph */
- [0x6b0b, 0x6b0b], /* CJK Ideograph */
- [0x6b0c, 0x6b0c], /* CJK Ideograph */
- [0x6b0d, 0x6b0d], /* CJK Ideograph */
- [0x6b0e, 0x6b0e], /* CJK Ideograph */
- [0x6b0f, 0x6b0f], /* CJK Ideograph */
- [0x6b10, 0x6b10], /* CJK Ideograph */
- [0x6b11, 0x6b11], /* CJK Ideograph */
- [0x6b12, 0x6b12], /* CJK Ideograph */
- [0x6b13, 0x6b13], /* CJK Ideograph */
- [0x6b14, 0x6b14], /* CJK Ideograph */
- [0x6b15, 0x6b15], /* CJK Ideograph */
- [0x6b16, 0x6b16], /* CJK Ideograph */
- [0x6b17, 0x6b17], /* CJK Ideograph */
- [0x6b18, 0x6b18], /* CJK Ideograph */
- [0x6b19, 0x6b19], /* CJK Ideograph */
- [0x6b1a, 0x6b1a], /* CJK Ideograph */
- [0x6b1b, 0x6b1b], /* CJK Ideograph */
- [0x6b1c, 0x6b1c], /* CJK Ideograph */
- [0x6b1d, 0x6b1d], /* CJK Ideograph */
- [0x6b1e, 0x6b1e], /* CJK Ideograph */
- [0x6b1f, 0x6b1f], /* CJK Ideograph */
- [0x6b20, 0x6b20], /* CJK Ideograph */
- [0x6b21, 0x6b21], /* CJK Ideograph */
- [0x6b22, 0x6b22], /* CJK Ideograph */
- [0x6b23, 0x6b23], /* CJK Ideograph */
- [0x6b24, 0x6b24], /* CJK Ideograph */
- [0x6b25, 0x6b25], /* CJK Ideograph */
- [0x6b26, 0x6b26], /* CJK Ideograph */
- [0x6b27, 0x6b27], /* CJK Ideograph */
- [0x6b28, 0x6b28], /* CJK Ideograph */
- [0x6b29, 0x6b29], /* CJK Ideograph */
- [0x6b2a, 0x6b2a], /* CJK Ideograph */
- [0x6b2b, 0x6b2b], /* CJK Ideograph */
- [0x6b2c, 0x6b2c], /* CJK Ideograph */
- [0x6b2d, 0x6b2d], /* CJK Ideograph */
- [0x6b2e, 0x6b2e], /* CJK Ideograph */
- [0x6b2f, 0x6b2f], /* CJK Ideograph */
- [0x6b30, 0x6b30], /* CJK Ideograph */
- [0x6b31, 0x6b31], /* CJK Ideograph */
- [0x6b32, 0x6b32], /* CJK Ideograph */
- [0x6b33, 0x6b33], /* CJK Ideograph */
- [0x6b34, 0x6b34], /* CJK Ideograph */
- [0x6b35, 0x6b35], /* CJK Ideograph */
- [0x6b36, 0x6b36], /* CJK Ideograph */
- [0x6b37, 0x6b37], /* CJK Ideograph */
- [0x6b38, 0x6b38], /* CJK Ideograph */
- [0x6b39, 0x6b39], /* CJK Ideograph */
- [0x6b3a, 0x6b3a], /* CJK Ideograph */
- [0x6b3b, 0x6b3b], /* CJK Ideograph */
- [0x6b3c, 0x6b3c], /* CJK Ideograph */
- [0x6b3d, 0x6b3d], /* CJK Ideograph */
- [0x6b3e, 0x6b3e], /* CJK Ideograph */
- [0x6b3f, 0x6b3f], /* CJK Ideograph */
- [0x6b40, 0x6b40], /* CJK Ideograph */
- [0x6b41, 0x6b41], /* CJK Ideograph */
- [0x6b42, 0x6b42], /* CJK Ideograph */
- [0x6b43, 0x6b43], /* CJK Ideograph */
- [0x6b44, 0x6b44], /* CJK Ideograph */
- [0x6b45, 0x6b45], /* CJK Ideograph */
- [0x6b46, 0x6b46], /* CJK Ideograph */
- [0x6b47, 0x6b47], /* CJK Ideograph */
- [0x6b48, 0x6b48], /* CJK Ideograph */
- [0x6b49, 0x6b49], /* CJK Ideograph */
- [0x6b4a, 0x6b4a], /* CJK Ideograph */
- [0x6b4b, 0x6b4b], /* CJK Ideograph */
- [0x6b4c, 0x6b4c], /* CJK Ideograph */
- [0x6b4d, 0x6b4d], /* CJK Ideograph */
- [0x6b4e, 0x6b4e], /* CJK Ideograph */
- [0x6b4f, 0x6b4f], /* CJK Ideograph */
- [0x6b50, 0x6b50], /* CJK Ideograph */
- [0x6b51, 0x6b51], /* CJK Ideograph */
- [0x6b52, 0x6b52], /* CJK Ideograph */
- [0x6b53, 0x6b53], /* CJK Ideograph */
- [0x6b54, 0x6b54], /* CJK Ideograph */
- [0x6b55, 0x6b55], /* CJK Ideograph */
- [0x6b56, 0x6b56], /* CJK Ideograph */
- [0x6b57, 0x6b57], /* CJK Ideograph */
- [0x6b58, 0x6b58], /* CJK Ideograph */
- [0x6b59, 0x6b59], /* CJK Ideograph */
- [0x6b5a, 0x6b5a], /* CJK Ideograph */
- [0x6b5b, 0x6b5b], /* CJK Ideograph */
- [0x6b5c, 0x6b5c], /* CJK Ideograph */
- [0x6b5d, 0x6b5d], /* CJK Ideograph */
- [0x6b5e, 0x6b5e], /* CJK Ideograph */
- [0x6b5f, 0x6b5f], /* CJK Ideograph */
- [0x6b60, 0x6b60], /* CJK Ideograph */
- [0x6b61, 0x6b61], /* CJK Ideograph */
- [0x6b62, 0x6b62], /* CJK Ideograph */
- [0x6b63, 0x6b63], /* CJK Ideograph */
- [0x6b64, 0x6b64], /* CJK Ideograph */
- [0x6b65, 0x6b65], /* CJK Ideograph */
- [0x6b66, 0x6b66], /* CJK Ideograph */
- [0x6b67, 0x6b67], /* CJK Ideograph */
- [0x6b68, 0x6b68], /* CJK Ideograph */
- [0x6b69, 0x6b69], /* CJK Ideograph */
- [0x6b6a, 0x6b6a], /* CJK Ideograph */
- [0x6b6b, 0x6b6b], /* CJK Ideograph */
- [0x6b6c, 0x6b6c], /* CJK Ideograph */
- [0x6b6d, 0x6b6d], /* CJK Ideograph */
- [0x6b6e, 0x6b6e], /* CJK Ideograph */
- [0x6b6f, 0x6b6f], /* CJK Ideograph */
- [0x6b70, 0x6b70], /* CJK Ideograph */
- [0x6b71, 0x6b71], /* CJK Ideograph */
- [0x6b72, 0x6b72], /* CJK Ideograph */
- [0x6b73, 0x6b73], /* CJK Ideograph */
- [0x6b74, 0x6b74], /* CJK Ideograph */
- [0x6b75, 0x6b75], /* CJK Ideograph */
- [0x6b76, 0x6b76], /* CJK Ideograph */
- [0x6b77, 0x6b77], /* CJK Ideograph */
- [0x6b78, 0x6b78], /* CJK Ideograph */
- [0x6b79, 0x6b79], /* CJK Ideograph */
- [0x6b7a, 0x6b7a], /* CJK Ideograph */
- [0x6b7b, 0x6b7b], /* CJK Ideograph */
- [0x6b7c, 0x6b7c], /* CJK Ideograph */
- [0x6b7d, 0x6b7d], /* CJK Ideograph */
- [0x6b7e, 0x6b7e], /* CJK Ideograph */
- [0x6b7f, 0x6b7f], /* CJK Ideograph */
- [0x6b80, 0x6b80], /* CJK Ideograph */
- [0x6b81, 0x6b81], /* CJK Ideograph */
- [0x6b82, 0x6b82], /* CJK Ideograph */
- [0x6b83, 0x6b83], /* CJK Ideograph */
- [0x6b84, 0x6b84], /* CJK Ideograph */
- [0x6b85, 0x6b85], /* CJK Ideograph */
- [0x6b86, 0x6b86], /* CJK Ideograph */
- [0x6b87, 0x6b87], /* CJK Ideograph */
- [0x6b88, 0x6b88], /* CJK Ideograph */
- [0x6b89, 0x6b89], /* CJK Ideograph */
- [0x6b8a, 0x6b8a], /* CJK Ideograph */
- [0x6b8b, 0x6b8b], /* CJK Ideograph */
- [0x6b8c, 0x6b8c], /* CJK Ideograph */
- [0x6b8d, 0x6b8d], /* CJK Ideograph */
- [0x6b8e, 0x6b8e], /* CJK Ideograph */
- [0x6b8f, 0x6b8f], /* CJK Ideograph */
- [0x6b90, 0x6b90], /* CJK Ideograph */
- [0x6b91, 0x6b91], /* CJK Ideograph */
- [0x6b92, 0x6b92], /* CJK Ideograph */
- [0x6b93, 0x6b93], /* CJK Ideograph */
- [0x6b94, 0x6b94], /* CJK Ideograph */
- [0x6b95, 0x6b95], /* CJK Ideograph */
- [0x6b96, 0x6b96], /* CJK Ideograph */
- [0x6b97, 0x6b97], /* CJK Ideograph */
- [0x6b98, 0x6b98], /* CJK Ideograph */
- [0x6b99, 0x6b99], /* CJK Ideograph */
- [0x6b9a, 0x6b9a], /* CJK Ideograph */
- [0x6b9b, 0x6b9b], /* CJK Ideograph */
- [0x6b9c, 0x6b9c], /* CJK Ideograph */
- [0x6b9d, 0x6b9d], /* CJK Ideograph */
- [0x6b9e, 0x6b9e], /* CJK Ideograph */
- [0x6b9f, 0x6b9f], /* CJK Ideograph */
- [0x6ba0, 0x6ba0], /* CJK Ideograph */
- [0x6ba1, 0x6ba1], /* CJK Ideograph */
- [0x6ba2, 0x6ba2], /* CJK Ideograph */
- [0x6ba3, 0x6ba3], /* CJK Ideograph */
- [0x6ba4, 0x6ba4], /* CJK Ideograph */
- [0x6ba5, 0x6ba5], /* CJK Ideograph */
- [0x6ba6, 0x6ba6], /* CJK Ideograph */
- [0x6ba7, 0x6ba7], /* CJK Ideograph */
- [0x6ba8, 0x6ba8], /* CJK Ideograph */
- [0x6ba9, 0x6ba9], /* CJK Ideograph */
- [0x6baa, 0x6baa], /* CJK Ideograph */
- [0x6bab, 0x6bab], /* CJK Ideograph */
- [0x6bac, 0x6bac], /* CJK Ideograph */
- [0x6bad, 0x6bad], /* CJK Ideograph */
- [0x6bae, 0x6bae], /* CJK Ideograph */
- [0x6baf, 0x6baf], /* CJK Ideograph */
- [0x6bb0, 0x6bb0], /* CJK Ideograph */
- [0x6bb1, 0x6bb1], /* CJK Ideograph */
- [0x6bb2, 0x6bb2], /* CJK Ideograph */
- [0x6bb3, 0x6bb3], /* CJK Ideograph */
- [0x6bb4, 0x6bb4], /* CJK Ideograph */
- [0x6bb5, 0x6bb5], /* CJK Ideograph */
- [0x6bb6, 0x6bb6], /* CJK Ideograph */
- [0x6bb7, 0x6bb7], /* CJK Ideograph */
- [0x6bb8, 0x6bb8], /* CJK Ideograph */
- [0x6bb9, 0x6bb9], /* CJK Ideograph */
- [0x6bba, 0x6bba], /* CJK Ideograph */
- [0x6bbb, 0x6bbb], /* CJK Ideograph */
- [0x6bbc, 0x6bbc], /* CJK Ideograph */
- [0x6bbd, 0x6bbd], /* CJK Ideograph */
- [0x6bbe, 0x6bbe], /* CJK Ideograph */
- [0x6bbf, 0x6bbf], /* CJK Ideograph */
- [0x6bc0, 0x6bc0], /* CJK Ideograph */
- [0x6bc1, 0x6bc1], /* CJK Ideograph */
- [0x6bc2, 0x6bc2], /* CJK Ideograph */
- [0x6bc3, 0x6bc3], /* CJK Ideograph */
- [0x6bc4, 0x6bc4], /* CJK Ideograph */
- [0x6bc5, 0x6bc5], /* CJK Ideograph */
- [0x6bc6, 0x6bc6], /* CJK Ideograph */
- [0x6bc7, 0x6bc7], /* CJK Ideograph */
- [0x6bc8, 0x6bc8], /* CJK Ideograph */
- [0x6bc9, 0x6bc9], /* CJK Ideograph */
- [0x6bca, 0x6bca], /* CJK Ideograph */
- [0x6bcb, 0x6bcb], /* CJK Ideograph */
- [0x6bcc, 0x6bcc], /* CJK Ideograph */
- [0x6bcd, 0x6bcd], /* CJK Ideograph */
- [0x6bce, 0x6bce], /* CJK Ideograph */
- [0x6bcf, 0x6bcf], /* CJK Ideograph */
- [0x6bd0, 0x6bd0], /* CJK Ideograph */
- [0x6bd1, 0x6bd1], /* CJK Ideograph */
- [0x6bd2, 0x6bd2], /* CJK Ideograph */
- [0x6bd3, 0x6bd3], /* CJK Ideograph */
- [0x6bd4, 0x6bd4], /* CJK Ideograph */
- [0x6bd5, 0x6bd5], /* CJK Ideograph */
- [0x6bd6, 0x6bd6], /* CJK Ideograph */
- [0x6bd7, 0x6bd7], /* CJK Ideograph */
- [0x6bd8, 0x6bd8], /* CJK Ideograph */
- [0x6bd9, 0x6bd9], /* CJK Ideograph */
- [0x6bda, 0x6bda], /* CJK Ideograph */
- [0x6bdb, 0x6bdb], /* CJK Ideograph */
- [0x6bdc, 0x6bdc], /* CJK Ideograph */
- [0x6bdd, 0x6bdd], /* CJK Ideograph */
- [0x6bde, 0x6bde], /* CJK Ideograph */
- [0x6bdf, 0x6bdf], /* CJK Ideograph */
- [0x6be0, 0x6be0], /* CJK Ideograph */
- [0x6be1, 0x6be1], /* CJK Ideograph */
- [0x6be2, 0x6be2], /* CJK Ideograph */
- [0x6be3, 0x6be3], /* CJK Ideograph */
- [0x6be4, 0x6be4], /* CJK Ideograph */
- [0x6be5, 0x6be5], /* CJK Ideograph */
- [0x6be6, 0x6be6], /* CJK Ideograph */
- [0x6be7, 0x6be7], /* CJK Ideograph */
- [0x6be8, 0x6be8], /* CJK Ideograph */
- [0x6be9, 0x6be9], /* CJK Ideograph */
- [0x6bea, 0x6bea], /* CJK Ideograph */
- [0x6beb, 0x6beb], /* CJK Ideograph */
- [0x6bec, 0x6bec], /* CJK Ideograph */
- [0x6bed, 0x6bed], /* CJK Ideograph */
- [0x6bee, 0x6bee], /* CJK Ideograph */
- [0x6bef, 0x6bef], /* CJK Ideograph */
- [0x6bf0, 0x6bf0], /* CJK Ideograph */
- [0x6bf1, 0x6bf1], /* CJK Ideograph */
- [0x6bf2, 0x6bf2], /* CJK Ideograph */
- [0x6bf3, 0x6bf3], /* CJK Ideograph */
- [0x6bf4, 0x6bf4], /* CJK Ideograph */
- [0x6bf5, 0x6bf5], /* CJK Ideograph */
- [0x6bf6, 0x6bf6], /* CJK Ideograph */
- [0x6bf7, 0x6bf7], /* CJK Ideograph */
- [0x6bf8, 0x6bf8], /* CJK Ideograph */
- [0x6bf9, 0x6bf9], /* CJK Ideograph */
- [0x6bfa, 0x6bfa], /* CJK Ideograph */
- [0x6bfb, 0x6bfb], /* CJK Ideograph */
- [0x6bfc, 0x6bfc], /* CJK Ideograph */
- [0x6bfd, 0x6bfd], /* CJK Ideograph */
- [0x6bfe, 0x6bfe], /* CJK Ideograph */
- [0x6bff, 0x6bff], /* CJK Ideograph */
- [0x6c00, 0x6c00], /* CJK Ideograph */
- [0x6c01, 0x6c01], /* CJK Ideograph */
- [0x6c02, 0x6c02], /* CJK Ideograph */
- [0x6c03, 0x6c03], /* CJK Ideograph */
- [0x6c04, 0x6c04], /* CJK Ideograph */
- [0x6c05, 0x6c05], /* CJK Ideograph */
- [0x6c06, 0x6c06], /* CJK Ideograph */
- [0x6c07, 0x6c07], /* CJK Ideograph */
- [0x6c08, 0x6c08], /* CJK Ideograph */
- [0x6c09, 0x6c09], /* CJK Ideograph */
- [0x6c0a, 0x6c0a], /* CJK Ideograph */
- [0x6c0b, 0x6c0b], /* CJK Ideograph */
- [0x6c0c, 0x6c0c], /* CJK Ideograph */
- [0x6c0d, 0x6c0d], /* CJK Ideograph */
- [0x6c0e, 0x6c0e], /* CJK Ideograph */
- [0x6c0f, 0x6c0f], /* CJK Ideograph */
- [0x6c10, 0x6c10], /* CJK Ideograph */
- [0x6c11, 0x6c11], /* CJK Ideograph */
- [0x6c12, 0x6c12], /* CJK Ideograph */
- [0x6c13, 0x6c13], /* CJK Ideograph */
- [0x6c14, 0x6c14], /* CJK Ideograph */
- [0x6c15, 0x6c15], /* CJK Ideograph */
- [0x6c16, 0x6c16], /* CJK Ideograph */
- [0x6c17, 0x6c17], /* CJK Ideograph */
- [0x6c18, 0x6c18], /* CJK Ideograph */
- [0x6c19, 0x6c19], /* CJK Ideograph */
- [0x6c1a, 0x6c1a], /* CJK Ideograph */
- [0x6c1b, 0x6c1b], /* CJK Ideograph */
- [0x6c1c, 0x6c1c], /* CJK Ideograph */
- [0x6c1d, 0x6c1d], /* CJK Ideograph */
- [0x6c1e, 0x6c1e], /* CJK Ideograph */
- [0x6c1f, 0x6c1f], /* CJK Ideograph */
- [0x6c20, 0x6c20], /* CJK Ideograph */
- [0x6c21, 0x6c21], /* CJK Ideograph */
- [0x6c22, 0x6c22], /* CJK Ideograph */
- [0x6c23, 0x6c23], /* CJK Ideograph */
- [0x6c24, 0x6c24], /* CJK Ideograph */
- [0x6c25, 0x6c25], /* CJK Ideograph */
- [0x6c26, 0x6c26], /* CJK Ideograph */
- [0x6c27, 0x6c27], /* CJK Ideograph */
- [0x6c28, 0x6c28], /* CJK Ideograph */
- [0x6c29, 0x6c29], /* CJK Ideograph */
- [0x6c2a, 0x6c2a], /* CJK Ideograph */
- [0x6c2b, 0x6c2b], /* CJK Ideograph */
- [0x6c2c, 0x6c2c], /* CJK Ideograph */
- [0x6c2d, 0x6c2d], /* CJK Ideograph */
- [0x6c2e, 0x6c2e], /* CJK Ideograph */
- [0x6c2f, 0x6c2f], /* CJK Ideograph */
- [0x6c30, 0x6c30], /* CJK Ideograph */
- [0x6c31, 0x6c31], /* CJK Ideograph */
- [0x6c32, 0x6c32], /* CJK Ideograph */
- [0x6c33, 0x6c33], /* CJK Ideograph */
- [0x6c34, 0x6c34], /* CJK Ideograph */
- [0x6c35, 0x6c35], /* CJK Ideograph */
- [0x6c36, 0x6c36], /* CJK Ideograph */
- [0x6c37, 0x6c37], /* CJK Ideograph */
- [0x6c38, 0x6c38], /* CJK Ideograph */
- [0x6c39, 0x6c39], /* CJK Ideograph */
- [0x6c3a, 0x6c3a], /* CJK Ideograph */
- [0x6c3b, 0x6c3b], /* CJK Ideograph */
- [0x6c3c, 0x6c3c], /* CJK Ideograph */
- [0x6c3d, 0x6c3d], /* CJK Ideograph */
- [0x6c3e, 0x6c3e], /* CJK Ideograph */
- [0x6c3f, 0x6c3f], /* CJK Ideograph */
- [0x6c40, 0x6c40], /* CJK Ideograph */
- [0x6c41, 0x6c41], /* CJK Ideograph */
- [0x6c42, 0x6c42], /* CJK Ideograph */
- [0x6c43, 0x6c43], /* CJK Ideograph */
- [0x6c44, 0x6c44], /* CJK Ideograph */
- [0x6c45, 0x6c45], /* CJK Ideograph */
- [0x6c46, 0x6c46], /* CJK Ideograph */
- [0x6c47, 0x6c47], /* CJK Ideograph */
- [0x6c48, 0x6c48], /* CJK Ideograph */
- [0x6c49, 0x6c49], /* CJK Ideograph */
- [0x6c4a, 0x6c4a], /* CJK Ideograph */
- [0x6c4b, 0x6c4b], /* CJK Ideograph */
- [0x6c4c, 0x6c4c], /* CJK Ideograph */
- [0x6c4d, 0x6c4d], /* CJK Ideograph */
- [0x6c4e, 0x6c4e], /* CJK Ideograph */
- [0x6c4f, 0x6c4f], /* CJK Ideograph */
- [0x6c50, 0x6c50], /* CJK Ideograph */
- [0x6c51, 0x6c51], /* CJK Ideograph */
- [0x6c52, 0x6c52], /* CJK Ideograph */
- [0x6c53, 0x6c53], /* CJK Ideograph */
- [0x6c54, 0x6c54], /* CJK Ideograph */
- [0x6c55, 0x6c55], /* CJK Ideograph */
- [0x6c56, 0x6c56], /* CJK Ideograph */
- [0x6c57, 0x6c57], /* CJK Ideograph */
- [0x6c58, 0x6c58], /* CJK Ideograph */
- [0x6c59, 0x6c59], /* CJK Ideograph */
- [0x6c5a, 0x6c5a], /* CJK Ideograph */
- [0x6c5b, 0x6c5b], /* CJK Ideograph */
- [0x6c5c, 0x6c5c], /* CJK Ideograph */
- [0x6c5d, 0x6c5d], /* CJK Ideograph */
- [0x6c5e, 0x6c5e], /* CJK Ideograph */
- [0x6c5f, 0x6c5f], /* CJK Ideograph */
- [0x6c60, 0x6c60], /* CJK Ideograph */
- [0x6c61, 0x6c61], /* CJK Ideograph */
- [0x6c62, 0x6c62], /* CJK Ideograph */
- [0x6c63, 0x6c63], /* CJK Ideograph */
- [0x6c64, 0x6c64], /* CJK Ideograph */
- [0x6c65, 0x6c65], /* CJK Ideograph */
- [0x6c66, 0x6c66], /* CJK Ideograph */
- [0x6c67, 0x6c67], /* CJK Ideograph */
- [0x6c68, 0x6c68], /* CJK Ideograph */
- [0x6c69, 0x6c69], /* CJK Ideograph */
- [0x6c6a, 0x6c6a], /* CJK Ideograph */
- [0x6c6b, 0x6c6b], /* CJK Ideograph */
- [0x6c6c, 0x6c6c], /* CJK Ideograph */
- [0x6c6d, 0x6c6d], /* CJK Ideograph */
- [0x6c6e, 0x6c6e], /* CJK Ideograph */
- [0x6c6f, 0x6c6f], /* CJK Ideograph */
- [0x6c70, 0x6c70], /* CJK Ideograph */
- [0x6c71, 0x6c71], /* CJK Ideograph */
- [0x6c72, 0x6c72], /* CJK Ideograph */
- [0x6c73, 0x6c73], /* CJK Ideograph */
- [0x6c74, 0x6c74], /* CJK Ideograph */
- [0x6c75, 0x6c75], /* CJK Ideograph */
- [0x6c76, 0x6c76], /* CJK Ideograph */
- [0x6c77, 0x6c77], /* CJK Ideograph */
- [0x6c78, 0x6c78], /* CJK Ideograph */
- [0x6c79, 0x6c79], /* CJK Ideograph */
- [0x6c7a, 0x6c7a], /* CJK Ideograph */
- [0x6c7b, 0x6c7b], /* CJK Ideograph */
- [0x6c7c, 0x6c7c], /* CJK Ideograph */
- [0x6c7d, 0x6c7d], /* CJK Ideograph */
- [0x6c7e, 0x6c7e], /* CJK Ideograph */
- [0x6c7f, 0x6c7f], /* CJK Ideograph */
- [0x6c80, 0x6c80], /* CJK Ideograph */
- [0x6c81, 0x6c81], /* CJK Ideograph */
- [0x6c82, 0x6c82], /* CJK Ideograph */
- [0x6c83, 0x6c83], /* CJK Ideograph */
- [0x6c84, 0x6c84], /* CJK Ideograph */
- [0x6c85, 0x6c85], /* CJK Ideograph */
- [0x6c86, 0x6c86], /* CJK Ideograph */
- [0x6c87, 0x6c87], /* CJK Ideograph */
- [0x6c88, 0x6c88], /* CJK Ideograph */
- [0x6c89, 0x6c89], /* CJK Ideograph */
- [0x6c8a, 0x6c8a], /* CJK Ideograph */
- [0x6c8b, 0x6c8b], /* CJK Ideograph */
- [0x6c8c, 0x6c8c], /* CJK Ideograph */
- [0x6c8d, 0x6c8d], /* CJK Ideograph */
- [0x6c8e, 0x6c8e], /* CJK Ideograph */
- [0x6c8f, 0x6c8f], /* CJK Ideograph */
- [0x6c90, 0x6c90], /* CJK Ideograph */
- [0x6c91, 0x6c91], /* CJK Ideograph */
- [0x6c92, 0x6c92], /* CJK Ideograph */
- [0x6c93, 0x6c93], /* CJK Ideograph */
- [0x6c94, 0x6c94], /* CJK Ideograph */
- [0x6c95, 0x6c95], /* CJK Ideograph */
- [0x6c96, 0x6c96], /* CJK Ideograph */
- [0x6c97, 0x6c97], /* CJK Ideograph */
- [0x6c98, 0x6c98], /* CJK Ideograph */
- [0x6c99, 0x6c99], /* CJK Ideograph */
- [0x6c9a, 0x6c9a], /* CJK Ideograph */
- [0x6c9b, 0x6c9b], /* CJK Ideograph */
- [0x6c9c, 0x6c9c], /* CJK Ideograph */
- [0x6c9d, 0x6c9d], /* CJK Ideograph */
- [0x6c9e, 0x6c9e], /* CJK Ideograph */
- [0x6c9f, 0x6c9f], /* CJK Ideograph */
- [0x6ca0, 0x6ca0], /* CJK Ideograph */
- [0x6ca1, 0x6ca1], /* CJK Ideograph */
- [0x6ca2, 0x6ca2], /* CJK Ideograph */
- [0x6ca3, 0x6ca3], /* CJK Ideograph */
- [0x6ca4, 0x6ca4], /* CJK Ideograph */
- [0x6ca5, 0x6ca5], /* CJK Ideograph */
- [0x6ca6, 0x6ca6], /* CJK Ideograph */
- [0x6ca7, 0x6ca7], /* CJK Ideograph */
- [0x6ca8, 0x6ca8], /* CJK Ideograph */
- [0x6ca9, 0x6ca9], /* CJK Ideograph */
- [0x6caa, 0x6caa], /* CJK Ideograph */
- [0x6cab, 0x6cab], /* CJK Ideograph */
- [0x6cac, 0x6cac], /* CJK Ideograph */
- [0x6cad, 0x6cad], /* CJK Ideograph */
- [0x6cae, 0x6cae], /* CJK Ideograph */
- [0x6caf, 0x6caf], /* CJK Ideograph */
- [0x6cb0, 0x6cb0], /* CJK Ideograph */
- [0x6cb1, 0x6cb1], /* CJK Ideograph */
- [0x6cb2, 0x6cb2], /* CJK Ideograph */
- [0x6cb3, 0x6cb3], /* CJK Ideograph */
- [0x6cb4, 0x6cb4], /* CJK Ideograph */
- [0x6cb5, 0x6cb5], /* CJK Ideograph */
- [0x6cb6, 0x6cb6], /* CJK Ideograph */
- [0x6cb7, 0x6cb7], /* CJK Ideograph */
- [0x6cb8, 0x6cb8], /* CJK Ideograph */
- [0x6cb9, 0x6cb9], /* CJK Ideograph */
- [0x6cba, 0x6cba], /* CJK Ideograph */
- [0x6cbb, 0x6cbb], /* CJK Ideograph */
- [0x6cbc, 0x6cbc], /* CJK Ideograph */
- [0x6cbd, 0x6cbd], /* CJK Ideograph */
- [0x6cbe, 0x6cbe], /* CJK Ideograph */
- [0x6cbf, 0x6cbf], /* CJK Ideograph */
- [0x6cc0, 0x6cc0], /* CJK Ideograph */
- [0x6cc1, 0x6cc1], /* CJK Ideograph */
- [0x6cc2, 0x6cc2], /* CJK Ideograph */
- [0x6cc3, 0x6cc3], /* CJK Ideograph */
- [0x6cc4, 0x6cc4], /* CJK Ideograph */
- [0x6cc5, 0x6cc5], /* CJK Ideograph */
- [0x6cc6, 0x6cc6], /* CJK Ideograph */
- [0x6cc7, 0x6cc7], /* CJK Ideograph */
- [0x6cc8, 0x6cc8], /* CJK Ideograph */
- [0x6cc9, 0x6cc9], /* CJK Ideograph */
- [0x6cca, 0x6cca], /* CJK Ideograph */
- [0x6ccb, 0x6ccb], /* CJK Ideograph */
- [0x6ccc, 0x6ccc], /* CJK Ideograph */
- [0x6ccd, 0x6ccd], /* CJK Ideograph */
- [0x6cce, 0x6cce], /* CJK Ideograph */
- [0x6ccf, 0x6ccf], /* CJK Ideograph */
- [0x6cd0, 0x6cd0], /* CJK Ideograph */
- [0x6cd1, 0x6cd1], /* CJK Ideograph */
- [0x6cd2, 0x6cd2], /* CJK Ideograph */
- [0x6cd3, 0x6cd3], /* CJK Ideograph */
- [0x6cd4, 0x6cd4], /* CJK Ideograph */
- [0x6cd5, 0x6cd5], /* CJK Ideograph */
- [0x6cd6, 0x6cd6], /* CJK Ideograph */
- [0x6cd7, 0x6cd7], /* CJK Ideograph */
- [0x6cd8, 0x6cd8], /* CJK Ideograph */
- [0x6cd9, 0x6cd9], /* CJK Ideograph */
- [0x6cda, 0x6cda], /* CJK Ideograph */
- [0x6cdb, 0x6cdb], /* CJK Ideograph */
- [0x6cdc, 0x6cdc], /* CJK Ideograph */
- [0x6cdd, 0x6cdd], /* CJK Ideograph */
- [0x6cde, 0x6cde], /* CJK Ideograph */
- [0x6cdf, 0x6cdf], /* CJK Ideograph */
- [0x6ce0, 0x6ce0], /* CJK Ideograph */
- [0x6ce1, 0x6ce1], /* CJK Ideograph */
- [0x6ce2, 0x6ce2], /* CJK Ideograph */
- [0x6ce3, 0x6ce3], /* CJK Ideograph */
- [0x6ce4, 0x6ce4], /* CJK Ideograph */
- [0x6ce5, 0x6ce5], /* CJK Ideograph */
- [0x6ce6, 0x6ce6], /* CJK Ideograph */
- [0x6ce7, 0x6ce7], /* CJK Ideograph */
- [0x6ce8, 0x6ce8], /* CJK Ideograph */
- [0x6ce9, 0x6ce9], /* CJK Ideograph */
- [0x6cea, 0x6cea], /* CJK Ideograph */
- [0x6ceb, 0x6ceb], /* CJK Ideograph */
- [0x6cec, 0x6cec], /* CJK Ideograph */
- [0x6ced, 0x6ced], /* CJK Ideograph */
- [0x6cee, 0x6cee], /* CJK Ideograph */
- [0x6cef, 0x6cef], /* CJK Ideograph */
- [0x6cf0, 0x6cf0], /* CJK Ideograph */
- [0x6cf1, 0x6cf1], /* CJK Ideograph */
- [0x6cf2, 0x6cf2], /* CJK Ideograph */
- [0x6cf3, 0x6cf3], /* CJK Ideograph */
- [0x6cf4, 0x6cf4], /* CJK Ideograph */
- [0x6cf5, 0x6cf5], /* CJK Ideograph */
- [0x6cf6, 0x6cf6], /* CJK Ideograph */
- [0x6cf7, 0x6cf7], /* CJK Ideograph */
- [0x6cf8, 0x6cf8], /* CJK Ideograph */
- [0x6cf9, 0x6cf9], /* CJK Ideograph */
- [0x6cfa, 0x6cfa], /* CJK Ideograph */
- [0x6cfb, 0x6cfb], /* CJK Ideograph */
- [0x6cfc, 0x6cfc], /* CJK Ideograph */
- [0x6cfd, 0x6cfd], /* CJK Ideograph */
- [0x6cfe, 0x6cfe], /* CJK Ideograph */
- [0x6cff, 0x6cff], /* CJK Ideograph */
- [0x6d00, 0x6d00], /* CJK Ideograph */
- [0x6d01, 0x6d01], /* CJK Ideograph */
- [0x6d02, 0x6d02], /* CJK Ideograph */
- [0x6d03, 0x6d03], /* CJK Ideograph */
- [0x6d04, 0x6d04], /* CJK Ideograph */
- [0x6d05, 0x6d05], /* CJK Ideograph */
- [0x6d06, 0x6d06], /* CJK Ideograph */
- [0x6d07, 0x6d07], /* CJK Ideograph */
- [0x6d08, 0x6d08], /* CJK Ideograph */
- [0x6d09, 0x6d09], /* CJK Ideograph */
- [0x6d0a, 0x6d0a], /* CJK Ideograph */
- [0x6d0b, 0x6d0b], /* CJK Ideograph */
- [0x6d0c, 0x6d0c], /* CJK Ideograph */
- [0x6d0d, 0x6d0d], /* CJK Ideograph */
- [0x6d0e, 0x6d0e], /* CJK Ideograph */
- [0x6d0f, 0x6d0f], /* CJK Ideograph */
- [0x6d10, 0x6d10], /* CJK Ideograph */
- [0x6d11, 0x6d11], /* CJK Ideograph */
- [0x6d12, 0x6d12], /* CJK Ideograph */
- [0x6d13, 0x6d13], /* CJK Ideograph */
- [0x6d14, 0x6d14], /* CJK Ideograph */
- [0x6d15, 0x6d15], /* CJK Ideograph */
- [0x6d16, 0x6d16], /* CJK Ideograph */
- [0x6d17, 0x6d17], /* CJK Ideograph */
- [0x6d18, 0x6d18], /* CJK Ideograph */
- [0x6d19, 0x6d19], /* CJK Ideograph */
- [0x6d1a, 0x6d1a], /* CJK Ideograph */
- [0x6d1b, 0x6d1b], /* CJK Ideograph */
- [0x6d1c, 0x6d1c], /* CJK Ideograph */
- [0x6d1d, 0x6d1d], /* CJK Ideograph */
- [0x6d1e, 0x6d1e], /* CJK Ideograph */
- [0x6d1f, 0x6d1f], /* CJK Ideograph */
- [0x6d20, 0x6d20], /* CJK Ideograph */
- [0x6d21, 0x6d21], /* CJK Ideograph */
- [0x6d22, 0x6d22], /* CJK Ideograph */
- [0x6d23, 0x6d23], /* CJK Ideograph */
- [0x6d24, 0x6d24], /* CJK Ideograph */
- [0x6d25, 0x6d25], /* CJK Ideograph */
- [0x6d26, 0x6d26], /* CJK Ideograph */
- [0x6d27, 0x6d27], /* CJK Ideograph */
- [0x6d28, 0x6d28], /* CJK Ideograph */
- [0x6d29, 0x6d29], /* CJK Ideograph */
- [0x6d2a, 0x6d2a], /* CJK Ideograph */
- [0x6d2b, 0x6d2b], /* CJK Ideograph */
- [0x6d2c, 0x6d2c], /* CJK Ideograph */
- [0x6d2d, 0x6d2d], /* CJK Ideograph */
- [0x6d2e, 0x6d2e], /* CJK Ideograph */
- [0x6d2f, 0x6d2f], /* CJK Ideograph */
- [0x6d30, 0x6d30], /* CJK Ideograph */
- [0x6d31, 0x6d31], /* CJK Ideograph */
- [0x6d32, 0x6d32], /* CJK Ideograph */
- [0x6d33, 0x6d33], /* CJK Ideograph */
- [0x6d34, 0x6d34], /* CJK Ideograph */
- [0x6d35, 0x6d35], /* CJK Ideograph */
- [0x6d36, 0x6d36], /* CJK Ideograph */
- [0x6d37, 0x6d37], /* CJK Ideograph */
- [0x6d38, 0x6d38], /* CJK Ideograph */
- [0x6d39, 0x6d39], /* CJK Ideograph */
- [0x6d3a, 0x6d3a], /* CJK Ideograph */
- [0x6d3b, 0x6d3b], /* CJK Ideograph */
- [0x6d3c, 0x6d3c], /* CJK Ideograph */
- [0x6d3d, 0x6d3d], /* CJK Ideograph */
- [0x6d3e, 0x6d3e], /* CJK Ideograph */
- [0x6d3f, 0x6d3f], /* CJK Ideograph */
- [0x6d40, 0x6d40], /* CJK Ideograph */
- [0x6d41, 0x6d41], /* CJK Ideograph */
- [0x6d42, 0x6d42], /* CJK Ideograph */
- [0x6d43, 0x6d43], /* CJK Ideograph */
- [0x6d44, 0x6d44], /* CJK Ideograph */
- [0x6d45, 0x6d45], /* CJK Ideograph */
- [0x6d46, 0x6d46], /* CJK Ideograph */
- [0x6d47, 0x6d47], /* CJK Ideograph */
- [0x6d48, 0x6d48], /* CJK Ideograph */
- [0x6d49, 0x6d49], /* CJK Ideograph */
- [0x6d4a, 0x6d4a], /* CJK Ideograph */
- [0x6d4b, 0x6d4b], /* CJK Ideograph */
- [0x6d4c, 0x6d4c], /* CJK Ideograph */
- [0x6d4d, 0x6d4d], /* CJK Ideograph */
- [0x6d4e, 0x6d4e], /* CJK Ideograph */
- [0x6d4f, 0x6d4f], /* CJK Ideograph */
- [0x6d50, 0x6d50], /* CJK Ideograph */
- [0x6d51, 0x6d51], /* CJK Ideograph */
- [0x6d52, 0x6d52], /* CJK Ideograph */
- [0x6d53, 0x6d53], /* CJK Ideograph */
- [0x6d54, 0x6d54], /* CJK Ideograph */
- [0x6d55, 0x6d55], /* CJK Ideograph */
- [0x6d56, 0x6d56], /* CJK Ideograph */
- [0x6d57, 0x6d57], /* CJK Ideograph */
- [0x6d58, 0x6d58], /* CJK Ideograph */
- [0x6d59, 0x6d59], /* CJK Ideograph */
- [0x6d5a, 0x6d5a], /* CJK Ideograph */
- [0x6d5b, 0x6d5b], /* CJK Ideograph */
- [0x6d5c, 0x6d5c], /* CJK Ideograph */
- [0x6d5d, 0x6d5d], /* CJK Ideograph */
- [0x6d5e, 0x6d5e], /* CJK Ideograph */
- [0x6d5f, 0x6d5f], /* CJK Ideograph */
- [0x6d60, 0x6d60], /* CJK Ideograph */
- [0x6d61, 0x6d61], /* CJK Ideograph */
- [0x6d62, 0x6d62], /* CJK Ideograph */
- [0x6d63, 0x6d63], /* CJK Ideograph */
- [0x6d64, 0x6d64], /* CJK Ideograph */
- [0x6d65, 0x6d65], /* CJK Ideograph */
- [0x6d66, 0x6d66], /* CJK Ideograph */
- [0x6d67, 0x6d67], /* CJK Ideograph */
- [0x6d68, 0x6d68], /* CJK Ideograph */
- [0x6d69, 0x6d69], /* CJK Ideograph */
- [0x6d6a, 0x6d6a], /* CJK Ideograph */
- [0x6d6b, 0x6d6b], /* CJK Ideograph */
- [0x6d6c, 0x6d6c], /* CJK Ideograph */
- [0x6d6d, 0x6d6d], /* CJK Ideograph */
- [0x6d6e, 0x6d6e], /* CJK Ideograph */
- [0x6d6f, 0x6d6f], /* CJK Ideograph */
- [0x6d70, 0x6d70], /* CJK Ideograph */
- [0x6d71, 0x6d71], /* CJK Ideograph */
- [0x6d72, 0x6d72], /* CJK Ideograph */
- [0x6d73, 0x6d73], /* CJK Ideograph */
- [0x6d74, 0x6d74], /* CJK Ideograph */
- [0x6d75, 0x6d75], /* CJK Ideograph */
- [0x6d76, 0x6d76], /* CJK Ideograph */
- [0x6d77, 0x6d77], /* CJK Ideograph */
- [0x6d78, 0x6d78], /* CJK Ideograph */
- [0x6d79, 0x6d79], /* CJK Ideograph */
- [0x6d7a, 0x6d7a], /* CJK Ideograph */
- [0x6d7b, 0x6d7b], /* CJK Ideograph */
- [0x6d7c, 0x6d7c], /* CJK Ideograph */
- [0x6d7d, 0x6d7d], /* CJK Ideograph */
- [0x6d7e, 0x6d7e], /* CJK Ideograph */
- [0x6d7f, 0x6d7f], /* CJK Ideograph */
- [0x6d80, 0x6d80], /* CJK Ideograph */
- [0x6d81, 0x6d81], /* CJK Ideograph */
- [0x6d82, 0x6d82], /* CJK Ideograph */
- [0x6d83, 0x6d83], /* CJK Ideograph */
- [0x6d84, 0x6d84], /* CJK Ideograph */
- [0x6d85, 0x6d85], /* CJK Ideograph */
- [0x6d86, 0x6d86], /* CJK Ideograph */
- [0x6d87, 0x6d87], /* CJK Ideograph */
- [0x6d88, 0x6d88], /* CJK Ideograph */
- [0x6d89, 0x6d89], /* CJK Ideograph */
- [0x6d8a, 0x6d8a], /* CJK Ideograph */
- [0x6d8b, 0x6d8b], /* CJK Ideograph */
- [0x6d8c, 0x6d8c], /* CJK Ideograph */
- [0x6d8d, 0x6d8d], /* CJK Ideograph */
- [0x6d8e, 0x6d8e], /* CJK Ideograph */
- [0x6d8f, 0x6d8f], /* CJK Ideograph */
- [0x6d90, 0x6d90], /* CJK Ideograph */
- [0x6d91, 0x6d91], /* CJK Ideograph */
- [0x6d92, 0x6d92], /* CJK Ideograph */
- [0x6d93, 0x6d93], /* CJK Ideograph */
- [0x6d94, 0x6d94], /* CJK Ideograph */
- [0x6d95, 0x6d95], /* CJK Ideograph */
- [0x6d96, 0x6d96], /* CJK Ideograph */
- [0x6d97, 0x6d97], /* CJK Ideograph */
- [0x6d98, 0x6d98], /* CJK Ideograph */
- [0x6d99, 0x6d99], /* CJK Ideograph */
- [0x6d9a, 0x6d9a], /* CJK Ideograph */
- [0x6d9b, 0x6d9b], /* CJK Ideograph */
- [0x6d9c, 0x6d9c], /* CJK Ideograph */
- [0x6d9d, 0x6d9d], /* CJK Ideograph */
- [0x6d9e, 0x6d9e], /* CJK Ideograph */
- [0x6d9f, 0x6d9f], /* CJK Ideograph */
- [0x6da0, 0x6da0], /* CJK Ideograph */
- [0x6da1, 0x6da1], /* CJK Ideograph */
- [0x6da2, 0x6da2], /* CJK Ideograph */
- [0x6da3, 0x6da3], /* CJK Ideograph */
- [0x6da4, 0x6da4], /* CJK Ideograph */
- [0x6da5, 0x6da5], /* CJK Ideograph */
- [0x6da6, 0x6da6], /* CJK Ideograph */
- [0x6da7, 0x6da7], /* CJK Ideograph */
- [0x6da8, 0x6da8], /* CJK Ideograph */
- [0x6da9, 0x6da9], /* CJK Ideograph */
- [0x6daa, 0x6daa], /* CJK Ideograph */
- [0x6dab, 0x6dab], /* CJK Ideograph */
- [0x6dac, 0x6dac], /* CJK Ideograph */
- [0x6dad, 0x6dad], /* CJK Ideograph */
- [0x6dae, 0x6dae], /* CJK Ideograph */
- [0x6daf, 0x6daf], /* CJK Ideograph */
- [0x6db0, 0x6db0], /* CJK Ideograph */
- [0x6db1, 0x6db1], /* CJK Ideograph */
- [0x6db2, 0x6db2], /* CJK Ideograph */
- [0x6db3, 0x6db3], /* CJK Ideograph */
- [0x6db4, 0x6db4], /* CJK Ideograph */
- [0x6db5, 0x6db5], /* CJK Ideograph */
- [0x6db6, 0x6db6], /* CJK Ideograph */
- [0x6db7, 0x6db7], /* CJK Ideograph */
- [0x6db8, 0x6db8], /* CJK Ideograph */
- [0x6db9, 0x6db9], /* CJK Ideograph */
- [0x6dba, 0x6dba], /* CJK Ideograph */
- [0x6dbb, 0x6dbb], /* CJK Ideograph */
- [0x6dbc, 0x6dbc], /* CJK Ideograph */
- [0x6dbd, 0x6dbd], /* CJK Ideograph */
- [0x6dbe, 0x6dbe], /* CJK Ideograph */
- [0x6dbf, 0x6dbf], /* CJK Ideograph */
- [0x6dc0, 0x6dc0], /* CJK Ideograph */
- [0x6dc1, 0x6dc1], /* CJK Ideograph */
- [0x6dc2, 0x6dc2], /* CJK Ideograph */
- [0x6dc3, 0x6dc3], /* CJK Ideograph */
- [0x6dc4, 0x6dc4], /* CJK Ideograph */
- [0x6dc5, 0x6dc5], /* CJK Ideograph */
- [0x6dc6, 0x6dc6], /* CJK Ideograph */
- [0x6dc7, 0x6dc7], /* CJK Ideograph */
- [0x6dc8, 0x6dc8], /* CJK Ideograph */
- [0x6dc9, 0x6dc9], /* CJK Ideograph */
- [0x6dca, 0x6dca], /* CJK Ideograph */
- [0x6dcb, 0x6dcb], /* CJK Ideograph */
- [0x6dcc, 0x6dcc], /* CJK Ideograph */
- [0x6dcd, 0x6dcd], /* CJK Ideograph */
- [0x6dce, 0x6dce], /* CJK Ideograph */
- [0x6dcf, 0x6dcf], /* CJK Ideograph */
- [0x6dd0, 0x6dd0], /* CJK Ideograph */
- [0x6dd1, 0x6dd1], /* CJK Ideograph */
- [0x6dd2, 0x6dd2], /* CJK Ideograph */
- [0x6dd3, 0x6dd3], /* CJK Ideograph */
- [0x6dd4, 0x6dd4], /* CJK Ideograph */
- [0x6dd5, 0x6dd5], /* CJK Ideograph */
- [0x6dd6, 0x6dd6], /* CJK Ideograph */
- [0x6dd7, 0x6dd7], /* CJK Ideograph */
- [0x6dd8, 0x6dd8], /* CJK Ideograph */
- [0x6dd9, 0x6dd9], /* CJK Ideograph */
- [0x6dda, 0x6dda], /* CJK Ideograph */
- [0x6ddb, 0x6ddb], /* CJK Ideograph */
- [0x6ddc, 0x6ddc], /* CJK Ideograph */
- [0x6ddd, 0x6ddd], /* CJK Ideograph */
- [0x6dde, 0x6dde], /* CJK Ideograph */
- [0x6ddf, 0x6ddf], /* CJK Ideograph */
- [0x6de0, 0x6de0], /* CJK Ideograph */
- [0x6de1, 0x6de1], /* CJK Ideograph */
- [0x6de2, 0x6de2], /* CJK Ideograph */
- [0x6de3, 0x6de3], /* CJK Ideograph */
- [0x6de4, 0x6de4], /* CJK Ideograph */
- [0x6de5, 0x6de5], /* CJK Ideograph */
- [0x6de6, 0x6de6], /* CJK Ideograph */
- [0x6de7, 0x6de7], /* CJK Ideograph */
- [0x6de8, 0x6de8], /* CJK Ideograph */
- [0x6de9, 0x6de9], /* CJK Ideograph */
- [0x6dea, 0x6dea], /* CJK Ideograph */
- [0x6deb, 0x6deb], /* CJK Ideograph */
- [0x6dec, 0x6dec], /* CJK Ideograph */
- [0x6ded, 0x6ded], /* CJK Ideograph */
- [0x6dee, 0x6dee], /* CJK Ideograph */
- [0x6def, 0x6def], /* CJK Ideograph */
- [0x6df0, 0x6df0], /* CJK Ideograph */
- [0x6df1, 0x6df1], /* CJK Ideograph */
- [0x6df2, 0x6df2], /* CJK Ideograph */
- [0x6df3, 0x6df3], /* CJK Ideograph */
- [0x6df4, 0x6df4], /* CJK Ideograph */
- [0x6df5, 0x6df5], /* CJK Ideograph */
- [0x6df6, 0x6df6], /* CJK Ideograph */
- [0x6df7, 0x6df7], /* CJK Ideograph */
- [0x6df8, 0x6df8], /* CJK Ideograph */
- [0x6df9, 0x6df9], /* CJK Ideograph */
- [0x6dfa, 0x6dfa], /* CJK Ideograph */
- [0x6dfb, 0x6dfb], /* CJK Ideograph */
- [0x6dfc, 0x6dfc], /* CJK Ideograph */
- [0x6dfd, 0x6dfd], /* CJK Ideograph */
- [0x6dfe, 0x6dfe], /* CJK Ideograph */
- [0x6dff, 0x6dff], /* CJK Ideograph */
- [0x6e00, 0x6e00], /* CJK Ideograph */
- [0x6e01, 0x6e01], /* CJK Ideograph */
- [0x6e02, 0x6e02], /* CJK Ideograph */
- [0x6e03, 0x6e03], /* CJK Ideograph */
- [0x6e04, 0x6e04], /* CJK Ideograph */
- [0x6e05, 0x6e05], /* CJK Ideograph */
- [0x6e06, 0x6e06], /* CJK Ideograph */
- [0x6e07, 0x6e07], /* CJK Ideograph */
- [0x6e08, 0x6e08], /* CJK Ideograph */
- [0x6e09, 0x6e09], /* CJK Ideograph */
- [0x6e0a, 0x6e0a], /* CJK Ideograph */
- [0x6e0b, 0x6e0b], /* CJK Ideograph */
- [0x6e0c, 0x6e0c], /* CJK Ideograph */
- [0x6e0d, 0x6e0d], /* CJK Ideograph */
- [0x6e0e, 0x6e0e], /* CJK Ideograph */
- [0x6e0f, 0x6e0f], /* CJK Ideograph */
- [0x6e10, 0x6e10], /* CJK Ideograph */
- [0x6e11, 0x6e11], /* CJK Ideograph */
- [0x6e12, 0x6e12], /* CJK Ideograph */
- [0x6e13, 0x6e13], /* CJK Ideograph */
- [0x6e14, 0x6e14], /* CJK Ideograph */
- [0x6e15, 0x6e15], /* CJK Ideograph */
- [0x6e16, 0x6e16], /* CJK Ideograph */
- [0x6e17, 0x6e17], /* CJK Ideograph */
- [0x6e18, 0x6e18], /* CJK Ideograph */
- [0x6e19, 0x6e19], /* CJK Ideograph */
- [0x6e1a, 0x6e1a], /* CJK Ideograph */
- [0x6e1b, 0x6e1b], /* CJK Ideograph */
- [0x6e1c, 0x6e1c], /* CJK Ideograph */
- [0x6e1d, 0x6e1d], /* CJK Ideograph */
- [0x6e1e, 0x6e1e], /* CJK Ideograph */
- [0x6e1f, 0x6e1f], /* CJK Ideograph */
- [0x6e20, 0x6e20], /* CJK Ideograph */
- [0x6e21, 0x6e21], /* CJK Ideograph */
- [0x6e22, 0x6e22], /* CJK Ideograph */
- [0x6e23, 0x6e23], /* CJK Ideograph */
- [0x6e24, 0x6e24], /* CJK Ideograph */
- [0x6e25, 0x6e25], /* CJK Ideograph */
- [0x6e26, 0x6e26], /* CJK Ideograph */
- [0x6e27, 0x6e27], /* CJK Ideograph */
- [0x6e28, 0x6e28], /* CJK Ideograph */
- [0x6e29, 0x6e29], /* CJK Ideograph */
- [0x6e2a, 0x6e2a], /* CJK Ideograph */
- [0x6e2b, 0x6e2b], /* CJK Ideograph */
- [0x6e2c, 0x6e2c], /* CJK Ideograph */
- [0x6e2d, 0x6e2d], /* CJK Ideograph */
- [0x6e2e, 0x6e2e], /* CJK Ideograph */
- [0x6e2f, 0x6e2f], /* CJK Ideograph */
- [0x6e30, 0x6e30], /* CJK Ideograph */
- [0x6e31, 0x6e31], /* CJK Ideograph */
- [0x6e32, 0x6e32], /* CJK Ideograph */
- [0x6e33, 0x6e33], /* CJK Ideograph */
- [0x6e34, 0x6e34], /* CJK Ideograph */
- [0x6e35, 0x6e35], /* CJK Ideograph */
- [0x6e36, 0x6e36], /* CJK Ideograph */
- [0x6e37, 0x6e37], /* CJK Ideograph */
- [0x6e38, 0x6e38], /* CJK Ideograph */
- [0x6e39, 0x6e39], /* CJK Ideograph */
- [0x6e3a, 0x6e3a], /* CJK Ideograph */
- [0x6e3b, 0x6e3b], /* CJK Ideograph */
- [0x6e3c, 0x6e3c], /* CJK Ideograph */
- [0x6e3d, 0x6e3d], /* CJK Ideograph */
- [0x6e3e, 0x6e3e], /* CJK Ideograph */
- [0x6e3f, 0x6e3f], /* CJK Ideograph */
- [0x6e40, 0x6e40], /* CJK Ideograph */
- [0x6e41, 0x6e41], /* CJK Ideograph */
- [0x6e42, 0x6e42], /* CJK Ideograph */
- [0x6e43, 0x6e43], /* CJK Ideograph */
- [0x6e44, 0x6e44], /* CJK Ideograph */
- [0x6e45, 0x6e45], /* CJK Ideograph */
- [0x6e46, 0x6e46], /* CJK Ideograph */
- [0x6e47, 0x6e47], /* CJK Ideograph */
- [0x6e48, 0x6e48], /* CJK Ideograph */
- [0x6e49, 0x6e49], /* CJK Ideograph */
- [0x6e4a, 0x6e4a], /* CJK Ideograph */
- [0x6e4b, 0x6e4b], /* CJK Ideograph */
- [0x6e4c, 0x6e4c], /* CJK Ideograph */
- [0x6e4d, 0x6e4d], /* CJK Ideograph */
- [0x6e4e, 0x6e4e], /* CJK Ideograph */
- [0x6e4f, 0x6e4f], /* CJK Ideograph */
- [0x6e50, 0x6e50], /* CJK Ideograph */
- [0x6e51, 0x6e51], /* CJK Ideograph */
- [0x6e52, 0x6e52], /* CJK Ideograph */
- [0x6e53, 0x6e53], /* CJK Ideograph */
- [0x6e54, 0x6e54], /* CJK Ideograph */
- [0x6e55, 0x6e55], /* CJK Ideograph */
- [0x6e56, 0x6e56], /* CJK Ideograph */
- [0x6e57, 0x6e57], /* CJK Ideograph */
- [0x6e58, 0x6e58], /* CJK Ideograph */
- [0x6e59, 0x6e59], /* CJK Ideograph */
- [0x6e5a, 0x6e5a], /* CJK Ideograph */
- [0x6e5b, 0x6e5b], /* CJK Ideograph */
- [0x6e5c, 0x6e5c], /* CJK Ideograph */
- [0x6e5d, 0x6e5d], /* CJK Ideograph */
- [0x6e5e, 0x6e5e], /* CJK Ideograph */
- [0x6e5f, 0x6e5f], /* CJK Ideograph */
- [0x6e60, 0x6e60], /* CJK Ideograph */
- [0x6e61, 0x6e61], /* CJK Ideograph */
- [0x6e62, 0x6e62], /* CJK Ideograph */
- [0x6e63, 0x6e63], /* CJK Ideograph */
- [0x6e64, 0x6e64], /* CJK Ideograph */
- [0x6e65, 0x6e65], /* CJK Ideograph */
- [0x6e66, 0x6e66], /* CJK Ideograph */
- [0x6e67, 0x6e67], /* CJK Ideograph */
- [0x6e68, 0x6e68], /* CJK Ideograph */
- [0x6e69, 0x6e69], /* CJK Ideograph */
- [0x6e6a, 0x6e6a], /* CJK Ideograph */
- [0x6e6b, 0x6e6b], /* CJK Ideograph */
- [0x6e6c, 0x6e6c], /* CJK Ideograph */
- [0x6e6d, 0x6e6d], /* CJK Ideograph */
- [0x6e6e, 0x6e6e], /* CJK Ideograph */
- [0x6e6f, 0x6e6f], /* CJK Ideograph */
- [0x6e70, 0x6e70], /* CJK Ideograph */
- [0x6e71, 0x6e71], /* CJK Ideograph */
- [0x6e72, 0x6e72], /* CJK Ideograph */
- [0x6e73, 0x6e73], /* CJK Ideograph */
- [0x6e74, 0x6e74], /* CJK Ideograph */
- [0x6e75, 0x6e75], /* CJK Ideograph */
- [0x6e76, 0x6e76], /* CJK Ideograph */
- [0x6e77, 0x6e77], /* CJK Ideograph */
- [0x6e78, 0x6e78], /* CJK Ideograph */
- [0x6e79, 0x6e79], /* CJK Ideograph */
- [0x6e7a, 0x6e7a], /* CJK Ideograph */
- [0x6e7b, 0x6e7b], /* CJK Ideograph */
- [0x6e7c, 0x6e7c], /* CJK Ideograph */
- [0x6e7d, 0x6e7d], /* CJK Ideograph */
- [0x6e7e, 0x6e7e], /* CJK Ideograph */
- [0x6e7f, 0x6e7f], /* CJK Ideograph */
- [0x6e80, 0x6e80], /* CJK Ideograph */
- [0x6e81, 0x6e81], /* CJK Ideograph */
- [0x6e82, 0x6e82], /* CJK Ideograph */
- [0x6e83, 0x6e83], /* CJK Ideograph */
- [0x6e84, 0x6e84], /* CJK Ideograph */
- [0x6e85, 0x6e85], /* CJK Ideograph */
- [0x6e86, 0x6e86], /* CJK Ideograph */
- [0x6e87, 0x6e87], /* CJK Ideograph */
- [0x6e88, 0x6e88], /* CJK Ideograph */
- [0x6e89, 0x6e89], /* CJK Ideograph */
- [0x6e8a, 0x6e8a], /* CJK Ideograph */
- [0x6e8b, 0x6e8b], /* CJK Ideograph */
- [0x6e8c, 0x6e8c], /* CJK Ideograph */
- [0x6e8d, 0x6e8d], /* CJK Ideograph */
- [0x6e8e, 0x6e8e], /* CJK Ideograph */
- [0x6e8f, 0x6e8f], /* CJK Ideograph */
- [0x6e90, 0x6e90], /* CJK Ideograph */
- [0x6e91, 0x6e91], /* CJK Ideograph */
- [0x6e92, 0x6e92], /* CJK Ideograph */
- [0x6e93, 0x6e93], /* CJK Ideograph */
- [0x6e94, 0x6e94], /* CJK Ideograph */
- [0x6e95, 0x6e95], /* CJK Ideograph */
- [0x6e96, 0x6e96], /* CJK Ideograph */
- [0x6e97, 0x6e97], /* CJK Ideograph */
- [0x6e98, 0x6e98], /* CJK Ideograph */
- [0x6e99, 0x6e99], /* CJK Ideograph */
- [0x6e9a, 0x6e9a], /* CJK Ideograph */
- [0x6e9b, 0x6e9b], /* CJK Ideograph */
- [0x6e9c, 0x6e9c], /* CJK Ideograph */
- [0x6e9d, 0x6e9d], /* CJK Ideograph */
- [0x6e9e, 0x6e9e], /* CJK Ideograph */
- [0x6e9f, 0x6e9f], /* CJK Ideograph */
- [0x6ea0, 0x6ea0], /* CJK Ideograph */
- [0x6ea1, 0x6ea1], /* CJK Ideograph */
- [0x6ea2, 0x6ea2], /* CJK Ideograph */
- [0x6ea3, 0x6ea3], /* CJK Ideograph */
- [0x6ea4, 0x6ea4], /* CJK Ideograph */
- [0x6ea5, 0x6ea5], /* CJK Ideograph */
- [0x6ea6, 0x6ea6], /* CJK Ideograph */
- [0x6ea7, 0x6ea7], /* CJK Ideograph */
- [0x6ea8, 0x6ea8], /* CJK Ideograph */
- [0x6ea9, 0x6ea9], /* CJK Ideograph */
- [0x6eaa, 0x6eaa], /* CJK Ideograph */
- [0x6eab, 0x6eab], /* CJK Ideograph */
- [0x6eac, 0x6eac], /* CJK Ideograph */
- [0x6ead, 0x6ead], /* CJK Ideograph */
- [0x6eae, 0x6eae], /* CJK Ideograph */
- [0x6eaf, 0x6eaf], /* CJK Ideograph */
- [0x6eb0, 0x6eb0], /* CJK Ideograph */
- [0x6eb1, 0x6eb1], /* CJK Ideograph */
- [0x6eb2, 0x6eb2], /* CJK Ideograph */
- [0x6eb3, 0x6eb3], /* CJK Ideograph */
- [0x6eb4, 0x6eb4], /* CJK Ideograph */
- [0x6eb5, 0x6eb5], /* CJK Ideograph */
- [0x6eb6, 0x6eb6], /* CJK Ideograph */
- [0x6eb7, 0x6eb7], /* CJK Ideograph */
- [0x6eb8, 0x6eb8], /* CJK Ideograph */
- [0x6eb9, 0x6eb9], /* CJK Ideograph */
- [0x6eba, 0x6eba], /* CJK Ideograph */
- [0x6ebb, 0x6ebb], /* CJK Ideograph */
- [0x6ebc, 0x6ebc], /* CJK Ideograph */
- [0x6ebd, 0x6ebd], /* CJK Ideograph */
- [0x6ebe, 0x6ebe], /* CJK Ideograph */
- [0x6ebf, 0x6ebf], /* CJK Ideograph */
- [0x6ec0, 0x6ec0], /* CJK Ideograph */
- [0x6ec1, 0x6ec1], /* CJK Ideograph */
- [0x6ec2, 0x6ec2], /* CJK Ideograph */
- [0x6ec3, 0x6ec3], /* CJK Ideograph */
- [0x6ec4, 0x6ec4], /* CJK Ideograph */
- [0x6ec5, 0x6ec5], /* CJK Ideograph */
- [0x6ec6, 0x6ec6], /* CJK Ideograph */
- [0x6ec7, 0x6ec7], /* CJK Ideograph */
- [0x6ec8, 0x6ec8], /* CJK Ideograph */
- [0x6ec9, 0x6ec9], /* CJK Ideograph */
- [0x6eca, 0x6eca], /* CJK Ideograph */
- [0x6ecb, 0x6ecb], /* CJK Ideograph */
- [0x6ecc, 0x6ecc], /* CJK Ideograph */
- [0x6ecd, 0x6ecd], /* CJK Ideograph */
- [0x6ece, 0x6ece], /* CJK Ideograph */
- [0x6ecf, 0x6ecf], /* CJK Ideograph */
- [0x6ed0, 0x6ed0], /* CJK Ideograph */
- [0x6ed1, 0x6ed1], /* CJK Ideograph */
- [0x6ed2, 0x6ed2], /* CJK Ideograph */
- [0x6ed3, 0x6ed3], /* CJK Ideograph */
- [0x6ed4, 0x6ed4], /* CJK Ideograph */
- [0x6ed5, 0x6ed5], /* CJK Ideograph */
- [0x6ed6, 0x6ed6], /* CJK Ideograph */
- [0x6ed7, 0x6ed7], /* CJK Ideograph */
- [0x6ed8, 0x6ed8], /* CJK Ideograph */
- [0x6ed9, 0x6ed9], /* CJK Ideograph */
- [0x6eda, 0x6eda], /* CJK Ideograph */
- [0x6edb, 0x6edb], /* CJK Ideograph */
- [0x6edc, 0x6edc], /* CJK Ideograph */
- [0x6edd, 0x6edd], /* CJK Ideograph */
- [0x6ede, 0x6ede], /* CJK Ideograph */
- [0x6edf, 0x6edf], /* CJK Ideograph */
- [0x6ee0, 0x6ee0], /* CJK Ideograph */
- [0x6ee1, 0x6ee1], /* CJK Ideograph */
- [0x6ee2, 0x6ee2], /* CJK Ideograph */
- [0x6ee3, 0x6ee3], /* CJK Ideograph */
- [0x6ee4, 0x6ee4], /* CJK Ideograph */
- [0x6ee5, 0x6ee5], /* CJK Ideograph */
- [0x6ee6, 0x6ee6], /* CJK Ideograph */
- [0x6ee7, 0x6ee7], /* CJK Ideograph */
- [0x6ee8, 0x6ee8], /* CJK Ideograph */
- [0x6ee9, 0x6ee9], /* CJK Ideograph */
- [0x6eea, 0x6eea], /* CJK Ideograph */
- [0x6eeb, 0x6eeb], /* CJK Ideograph */
- [0x6eec, 0x6eec], /* CJK Ideograph */
- [0x6eed, 0x6eed], /* CJK Ideograph */
- [0x6eee, 0x6eee], /* CJK Ideograph */
- [0x6eef, 0x6eef], /* CJK Ideograph */
- [0x6ef0, 0x6ef0], /* CJK Ideograph */
- [0x6ef1, 0x6ef1], /* CJK Ideograph */
- [0x6ef2, 0x6ef2], /* CJK Ideograph */
- [0x6ef3, 0x6ef3], /* CJK Ideograph */
- [0x6ef4, 0x6ef4], /* CJK Ideograph */
- [0x6ef5, 0x6ef5], /* CJK Ideograph */
- [0x6ef6, 0x6ef6], /* CJK Ideograph */
- [0x6ef7, 0x6ef7], /* CJK Ideograph */
- [0x6ef8, 0x6ef8], /* CJK Ideograph */
- [0x6ef9, 0x6ef9], /* CJK Ideograph */
- [0x6efa, 0x6efa], /* CJK Ideograph */
- [0x6efb, 0x6efb], /* CJK Ideograph */
- [0x6efc, 0x6efc], /* CJK Ideograph */
- [0x6efd, 0x6efd], /* CJK Ideograph */
- [0x6efe, 0x6efe], /* CJK Ideograph */
- [0x6eff, 0x6eff], /* CJK Ideograph */
- [0x6f00, 0x6f00], /* CJK Ideograph */
- [0x6f01, 0x6f01], /* CJK Ideograph */
- [0x6f02, 0x6f02], /* CJK Ideograph */
- [0x6f03, 0x6f03], /* CJK Ideograph */
- [0x6f04, 0x6f04], /* CJK Ideograph */
- [0x6f05, 0x6f05], /* CJK Ideograph */
- [0x6f06, 0x6f06], /* CJK Ideograph */
- [0x6f07, 0x6f07], /* CJK Ideograph */
- [0x6f08, 0x6f08], /* CJK Ideograph */
- [0x6f09, 0x6f09], /* CJK Ideograph */
- [0x6f0a, 0x6f0a], /* CJK Ideograph */
- [0x6f0b, 0x6f0b], /* CJK Ideograph */
- [0x6f0c, 0x6f0c], /* CJK Ideograph */
- [0x6f0d, 0x6f0d], /* CJK Ideograph */
- [0x6f0e, 0x6f0e], /* CJK Ideograph */
- [0x6f0f, 0x6f0f], /* CJK Ideograph */
- [0x6f10, 0x6f10], /* CJK Ideograph */
- [0x6f11, 0x6f11], /* CJK Ideograph */
- [0x6f12, 0x6f12], /* CJK Ideograph */
- [0x6f13, 0x6f13], /* CJK Ideograph */
- [0x6f14, 0x6f14], /* CJK Ideograph */
- [0x6f15, 0x6f15], /* CJK Ideograph */
- [0x6f16, 0x6f16], /* CJK Ideograph */
- [0x6f17, 0x6f17], /* CJK Ideograph */
- [0x6f18, 0x6f18], /* CJK Ideograph */
- [0x6f19, 0x6f19], /* CJK Ideograph */
- [0x6f1a, 0x6f1a], /* CJK Ideograph */
- [0x6f1b, 0x6f1b], /* CJK Ideograph */
- [0x6f1c, 0x6f1c], /* CJK Ideograph */
- [0x6f1d, 0x6f1d], /* CJK Ideograph */
- [0x6f1e, 0x6f1e], /* CJK Ideograph */
- [0x6f1f, 0x6f1f], /* CJK Ideograph */
- [0x6f20, 0x6f20], /* CJK Ideograph */
- [0x6f21, 0x6f21], /* CJK Ideograph */
- [0x6f22, 0x6f22], /* CJK Ideograph */
- [0x6f23, 0x6f23], /* CJK Ideograph */
- [0x6f24, 0x6f24], /* CJK Ideograph */
- [0x6f25, 0x6f25], /* CJK Ideograph */
- [0x6f26, 0x6f26], /* CJK Ideograph */
- [0x6f27, 0x6f27], /* CJK Ideograph */
- [0x6f28, 0x6f28], /* CJK Ideograph */
- [0x6f29, 0x6f29], /* CJK Ideograph */
- [0x6f2a, 0x6f2a], /* CJK Ideograph */
- [0x6f2b, 0x6f2b], /* CJK Ideograph */
- [0x6f2c, 0x6f2c], /* CJK Ideograph */
- [0x6f2d, 0x6f2d], /* CJK Ideograph */
- [0x6f2e, 0x6f2e], /* CJK Ideograph */
- [0x6f2f, 0x6f2f], /* CJK Ideograph */
- [0x6f30, 0x6f30], /* CJK Ideograph */
- [0x6f31, 0x6f31], /* CJK Ideograph */
- [0x6f32, 0x6f32], /* CJK Ideograph */
- [0x6f33, 0x6f33], /* CJK Ideograph */
- [0x6f34, 0x6f34], /* CJK Ideograph */
- [0x6f35, 0x6f35], /* CJK Ideograph */
- [0x6f36, 0x6f36], /* CJK Ideograph */
- [0x6f37, 0x6f37], /* CJK Ideograph */
- [0x6f38, 0x6f38], /* CJK Ideograph */
- [0x6f39, 0x6f39], /* CJK Ideograph */
- [0x6f3a, 0x6f3a], /* CJK Ideograph */
- [0x6f3b, 0x6f3b], /* CJK Ideograph */
- [0x6f3c, 0x6f3c], /* CJK Ideograph */
- [0x6f3d, 0x6f3d], /* CJK Ideograph */
- [0x6f3e, 0x6f3e], /* CJK Ideograph */
- [0x6f3f, 0x6f3f], /* CJK Ideograph */
- [0x6f40, 0x6f40], /* CJK Ideograph */
- [0x6f41, 0x6f41], /* CJK Ideograph */
- [0x6f42, 0x6f42], /* CJK Ideograph */
- [0x6f43, 0x6f43], /* CJK Ideograph */
- [0x6f44, 0x6f44], /* CJK Ideograph */
- [0x6f45, 0x6f45], /* CJK Ideograph */
- [0x6f46, 0x6f46], /* CJK Ideograph */
- [0x6f47, 0x6f47], /* CJK Ideograph */
- [0x6f48, 0x6f48], /* CJK Ideograph */
- [0x6f49, 0x6f49], /* CJK Ideograph */
- [0x6f4a, 0x6f4a], /* CJK Ideograph */
- [0x6f4b, 0x6f4b], /* CJK Ideograph */
- [0x6f4c, 0x6f4c], /* CJK Ideograph */
- [0x6f4d, 0x6f4d], /* CJK Ideograph */
- [0x6f4e, 0x6f4e], /* CJK Ideograph */
- [0x6f4f, 0x6f4f], /* CJK Ideograph */
- [0x6f50, 0x6f50], /* CJK Ideograph */
- [0x6f51, 0x6f51], /* CJK Ideograph */
- [0x6f52, 0x6f52], /* CJK Ideograph */
- [0x6f53, 0x6f53], /* CJK Ideograph */
- [0x6f54, 0x6f54], /* CJK Ideograph */
- [0x6f55, 0x6f55], /* CJK Ideograph */
- [0x6f56, 0x6f56], /* CJK Ideograph */
- [0x6f57, 0x6f57], /* CJK Ideograph */
- [0x6f58, 0x6f58], /* CJK Ideograph */
- [0x6f59, 0x6f59], /* CJK Ideograph */
- [0x6f5a, 0x6f5a], /* CJK Ideograph */
- [0x6f5b, 0x6f5b], /* CJK Ideograph */
- [0x6f5c, 0x6f5c], /* CJK Ideograph */
- [0x6f5d, 0x6f5d], /* CJK Ideograph */
- [0x6f5e, 0x6f5e], /* CJK Ideograph */
- [0x6f5f, 0x6f5f], /* CJK Ideograph */
- [0x6f60, 0x6f60], /* CJK Ideograph */
- [0x6f61, 0x6f61], /* CJK Ideograph */
- [0x6f62, 0x6f62], /* CJK Ideograph */
- [0x6f63, 0x6f63], /* CJK Ideograph */
- [0x6f64, 0x6f64], /* CJK Ideograph */
- [0x6f65, 0x6f65], /* CJK Ideograph */
- [0x6f66, 0x6f66], /* CJK Ideograph */
- [0x6f67, 0x6f67], /* CJK Ideograph */
- [0x6f68, 0x6f68], /* CJK Ideograph */
- [0x6f69, 0x6f69], /* CJK Ideograph */
- [0x6f6a, 0x6f6a], /* CJK Ideograph */
- [0x6f6b, 0x6f6b], /* CJK Ideograph */
- [0x6f6c, 0x6f6c], /* CJK Ideograph */
- [0x6f6d, 0x6f6d], /* CJK Ideograph */
- [0x6f6e, 0x6f6e], /* CJK Ideograph */
- [0x6f6f, 0x6f6f], /* CJK Ideograph */
- [0x6f70, 0x6f70], /* CJK Ideograph */
- [0x6f71, 0x6f71], /* CJK Ideograph */
- [0x6f72, 0x6f72], /* CJK Ideograph */
- [0x6f73, 0x6f73], /* CJK Ideograph */
- [0x6f74, 0x6f74], /* CJK Ideograph */
- [0x6f75, 0x6f75], /* CJK Ideograph */
- [0x6f76, 0x6f76], /* CJK Ideograph */
- [0x6f77, 0x6f77], /* CJK Ideograph */
- [0x6f78, 0x6f78], /* CJK Ideograph */
- [0x6f79, 0x6f79], /* CJK Ideograph */
- [0x6f7a, 0x6f7a], /* CJK Ideograph */
- [0x6f7b, 0x6f7b], /* CJK Ideograph */
- [0x6f7c, 0x6f7c], /* CJK Ideograph */
- [0x6f7d, 0x6f7d], /* CJK Ideograph */
- [0x6f7e, 0x6f7e], /* CJK Ideograph */
- [0x6f7f, 0x6f7f], /* CJK Ideograph */
- [0x6f80, 0x6f80], /* CJK Ideograph */
- [0x6f81, 0x6f81], /* CJK Ideograph */
- [0x6f82, 0x6f82], /* CJK Ideograph */
- [0x6f83, 0x6f83], /* CJK Ideograph */
- [0x6f84, 0x6f84], /* CJK Ideograph */
- [0x6f85, 0x6f85], /* CJK Ideograph */
- [0x6f86, 0x6f86], /* CJK Ideograph */
- [0x6f87, 0x6f87], /* CJK Ideograph */
- [0x6f88, 0x6f88], /* CJK Ideograph */
- [0x6f89, 0x6f89], /* CJK Ideograph */
- [0x6f8a, 0x6f8a], /* CJK Ideograph */
- [0x6f8b, 0x6f8b], /* CJK Ideograph */
- [0x6f8c, 0x6f8c], /* CJK Ideograph */
- [0x6f8d, 0x6f8d], /* CJK Ideograph */
- [0x6f8e, 0x6f8e], /* CJK Ideograph */
- [0x6f8f, 0x6f8f], /* CJK Ideograph */
- [0x6f90, 0x6f90], /* CJK Ideograph */
- [0x6f91, 0x6f91], /* CJK Ideograph */
- [0x6f92, 0x6f92], /* CJK Ideograph */
- [0x6f93, 0x6f93], /* CJK Ideograph */
- [0x6f94, 0x6f94], /* CJK Ideograph */
- [0x6f95, 0x6f95], /* CJK Ideograph */
- [0x6f96, 0x6f96], /* CJK Ideograph */
- [0x6f97, 0x6f97], /* CJK Ideograph */
- [0x6f98, 0x6f98], /* CJK Ideograph */
- [0x6f99, 0x6f99], /* CJK Ideograph */
- [0x6f9a, 0x6f9a], /* CJK Ideograph */
- [0x6f9b, 0x6f9b], /* CJK Ideograph */
- [0x6f9c, 0x6f9c], /* CJK Ideograph */
- [0x6f9d, 0x6f9d], /* CJK Ideograph */
- [0x6f9e, 0x6f9e], /* CJK Ideograph */
- [0x6f9f, 0x6f9f], /* CJK Ideograph */
- [0x6fa0, 0x6fa0], /* CJK Ideograph */
- [0x6fa1, 0x6fa1], /* CJK Ideograph */
- [0x6fa2, 0x6fa2], /* CJK Ideograph */
- [0x6fa3, 0x6fa3], /* CJK Ideograph */
- [0x6fa4, 0x6fa4], /* CJK Ideograph */
- [0x6fa5, 0x6fa5], /* CJK Ideograph */
- [0x6fa6, 0x6fa6], /* CJK Ideograph */
- [0x6fa7, 0x6fa7], /* CJK Ideograph */
- [0x6fa8, 0x6fa8], /* CJK Ideograph */
- [0x6fa9, 0x6fa9], /* CJK Ideograph */
- [0x6faa, 0x6faa], /* CJK Ideograph */
- [0x6fab, 0x6fab], /* CJK Ideograph */
- [0x6fac, 0x6fac], /* CJK Ideograph */
- [0x6fad, 0x6fad], /* CJK Ideograph */
- [0x6fae, 0x6fae], /* CJK Ideograph */
- [0x6faf, 0x6faf], /* CJK Ideograph */
- [0x6fb0, 0x6fb0], /* CJK Ideograph */
- [0x6fb1, 0x6fb1], /* CJK Ideograph */
- [0x6fb2, 0x6fb2], /* CJK Ideograph */
- [0x6fb3, 0x6fb3], /* CJK Ideograph */
- [0x6fb4, 0x6fb4], /* CJK Ideograph */
- [0x6fb5, 0x6fb5], /* CJK Ideograph */
- [0x6fb6, 0x6fb6], /* CJK Ideograph */
- [0x6fb7, 0x6fb7], /* CJK Ideograph */
- [0x6fb8, 0x6fb8], /* CJK Ideograph */
- [0x6fb9, 0x6fb9], /* CJK Ideograph */
- [0x6fba, 0x6fba], /* CJK Ideograph */
- [0x6fbb, 0x6fbb], /* CJK Ideograph */
- [0x6fbc, 0x6fbc], /* CJK Ideograph */
- [0x6fbd, 0x6fbd], /* CJK Ideograph */
- [0x6fbe, 0x6fbe], /* CJK Ideograph */
- [0x6fbf, 0x6fbf], /* CJK Ideograph */
- [0x6fc0, 0x6fc0], /* CJK Ideograph */
- [0x6fc1, 0x6fc1], /* CJK Ideograph */
- [0x6fc2, 0x6fc2], /* CJK Ideograph */
- [0x6fc3, 0x6fc3], /* CJK Ideograph */
- [0x6fc4, 0x6fc4], /* CJK Ideograph */
- [0x6fc5, 0x6fc5], /* CJK Ideograph */
- [0x6fc6, 0x6fc6], /* CJK Ideograph */
- [0x6fc7, 0x6fc7], /* CJK Ideograph */
- [0x6fc8, 0x6fc8], /* CJK Ideograph */
- [0x6fc9, 0x6fc9], /* CJK Ideograph */
- [0x6fca, 0x6fca], /* CJK Ideograph */
- [0x6fcb, 0x6fcb], /* CJK Ideograph */
- [0x6fcc, 0x6fcc], /* CJK Ideograph */
- [0x6fcd, 0x6fcd], /* CJK Ideograph */
- [0x6fce, 0x6fce], /* CJK Ideograph */
- [0x6fcf, 0x6fcf], /* CJK Ideograph */
- [0x6fd0, 0x6fd0], /* CJK Ideograph */
- [0x6fd1, 0x6fd1], /* CJK Ideograph */
- [0x6fd2, 0x6fd2], /* CJK Ideograph */
- [0x6fd3, 0x6fd3], /* CJK Ideograph */
- [0x6fd4, 0x6fd4], /* CJK Ideograph */
- [0x6fd5, 0x6fd5], /* CJK Ideograph */
- [0x6fd6, 0x6fd6], /* CJK Ideograph */
- [0x6fd7, 0x6fd7], /* CJK Ideograph */
- [0x6fd8, 0x6fd8], /* CJK Ideograph */
- [0x6fd9, 0x6fd9], /* CJK Ideograph */
- [0x6fda, 0x6fda], /* CJK Ideograph */
- [0x6fdb, 0x6fdb], /* CJK Ideograph */
- [0x6fdc, 0x6fdc], /* CJK Ideograph */
- [0x6fdd, 0x6fdd], /* CJK Ideograph */
- [0x6fde, 0x6fde], /* CJK Ideograph */
- [0x6fdf, 0x6fdf], /* CJK Ideograph */
- [0x6fe0, 0x6fe0], /* CJK Ideograph */
- [0x6fe1, 0x6fe1], /* CJK Ideograph */
- [0x6fe2, 0x6fe2], /* CJK Ideograph */
- [0x6fe3, 0x6fe3], /* CJK Ideograph */
- [0x6fe4, 0x6fe4], /* CJK Ideograph */
- [0x6fe5, 0x6fe5], /* CJK Ideograph */
- [0x6fe6, 0x6fe6], /* CJK Ideograph */
- [0x6fe7, 0x6fe7], /* CJK Ideograph */
- [0x6fe8, 0x6fe8], /* CJK Ideograph */
- [0x6fe9, 0x6fe9], /* CJK Ideograph */
- [0x6fea, 0x6fea], /* CJK Ideograph */
- [0x6feb, 0x6feb], /* CJK Ideograph */
- [0x6fec, 0x6fec], /* CJK Ideograph */
- [0x6fed, 0x6fed], /* CJK Ideograph */
- [0x6fee, 0x6fee], /* CJK Ideograph */
- [0x6fef, 0x6fef], /* CJK Ideograph */
- [0x6ff0, 0x6ff0], /* CJK Ideograph */
- [0x6ff1, 0x6ff1], /* CJK Ideograph */
- [0x6ff2, 0x6ff2], /* CJK Ideograph */
- [0x6ff3, 0x6ff3], /* CJK Ideograph */
- [0x6ff4, 0x6ff4], /* CJK Ideograph */
- [0x6ff5, 0x6ff5], /* CJK Ideograph */
- [0x6ff6, 0x6ff6], /* CJK Ideograph */
- [0x6ff7, 0x6ff7], /* CJK Ideograph */
- [0x6ff8, 0x6ff8], /* CJK Ideograph */
- [0x6ff9, 0x6ff9], /* CJK Ideograph */
- [0x6ffa, 0x6ffa], /* CJK Ideograph */
- [0x6ffb, 0x6ffb], /* CJK Ideograph */
- [0x6ffc, 0x6ffc], /* CJK Ideograph */
- [0x6ffd, 0x6ffd], /* CJK Ideograph */
- [0x6ffe, 0x6ffe], /* CJK Ideograph */
- [0x6fff, 0x6fff], /* CJK Ideograph */
- [0x7000, 0x7000], /* CJK Ideograph */
- [0x7001, 0x7001], /* CJK Ideograph */
- [0x7002, 0x7002], /* CJK Ideograph */
- [0x7003, 0x7003], /* CJK Ideograph */
- [0x7004, 0x7004], /* CJK Ideograph */
- [0x7005, 0x7005], /* CJK Ideograph */
- [0x7006, 0x7006], /* CJK Ideograph */
- [0x7007, 0x7007], /* CJK Ideograph */
- [0x7008, 0x7008], /* CJK Ideograph */
- [0x7009, 0x7009], /* CJK Ideograph */
- [0x700a, 0x700a], /* CJK Ideograph */
- [0x700b, 0x700b], /* CJK Ideograph */
- [0x700c, 0x700c], /* CJK Ideograph */
- [0x700d, 0x700d], /* CJK Ideograph */
- [0x700e, 0x700e], /* CJK Ideograph */
- [0x700f, 0x700f], /* CJK Ideograph */
- [0x7010, 0x7010], /* CJK Ideograph */
- [0x7011, 0x7011], /* CJK Ideograph */
- [0x7012, 0x7012], /* CJK Ideograph */
- [0x7013, 0x7013], /* CJK Ideograph */
- [0x7014, 0x7014], /* CJK Ideograph */
- [0x7015, 0x7015], /* CJK Ideograph */
- [0x7016, 0x7016], /* CJK Ideograph */
- [0x7017, 0x7017], /* CJK Ideograph */
- [0x7018, 0x7018], /* CJK Ideograph */
- [0x7019, 0x7019], /* CJK Ideograph */
- [0x701a, 0x701a], /* CJK Ideograph */
- [0x701b, 0x701b], /* CJK Ideograph */
- [0x701c, 0x701c], /* CJK Ideograph */
- [0x701d, 0x701d], /* CJK Ideograph */
- [0x701e, 0x701e], /* CJK Ideograph */
- [0x701f, 0x701f], /* CJK Ideograph */
- [0x7020, 0x7020], /* CJK Ideograph */
- [0x7021, 0x7021], /* CJK Ideograph */
- [0x7022, 0x7022], /* CJK Ideograph */
- [0x7023, 0x7023], /* CJK Ideograph */
- [0x7024, 0x7024], /* CJK Ideograph */
- [0x7025, 0x7025], /* CJK Ideograph */
- [0x7026, 0x7026], /* CJK Ideograph */
- [0x7027, 0x7027], /* CJK Ideograph */
- [0x7028, 0x7028], /* CJK Ideograph */
- [0x7029, 0x7029], /* CJK Ideograph */
- [0x702a, 0x702a], /* CJK Ideograph */
- [0x702b, 0x702b], /* CJK Ideograph */
- [0x702c, 0x702c], /* CJK Ideograph */
- [0x702d, 0x702d], /* CJK Ideograph */
- [0x702e, 0x702e], /* CJK Ideograph */
- [0x702f, 0x702f], /* CJK Ideograph */
- [0x7030, 0x7030], /* CJK Ideograph */
- [0x7031, 0x7031], /* CJK Ideograph */
- [0x7032, 0x7032], /* CJK Ideograph */
- [0x7033, 0x7033], /* CJK Ideograph */
- [0x7034, 0x7034], /* CJK Ideograph */
- [0x7035, 0x7035], /* CJK Ideograph */
- [0x7036, 0x7036], /* CJK Ideograph */
- [0x7037, 0x7037], /* CJK Ideograph */
- [0x7038, 0x7038], /* CJK Ideograph */
- [0x7039, 0x7039], /* CJK Ideograph */
- [0x703a, 0x703a], /* CJK Ideograph */
- [0x703b, 0x703b], /* CJK Ideograph */
- [0x703c, 0x703c], /* CJK Ideograph */
- [0x703d, 0x703d], /* CJK Ideograph */
- [0x703e, 0x703e], /* CJK Ideograph */
- [0x703f, 0x703f], /* CJK Ideograph */
- [0x7040, 0x7040], /* CJK Ideograph */
- [0x7041, 0x7041], /* CJK Ideograph */
- [0x7042, 0x7042], /* CJK Ideograph */
- [0x7043, 0x7043], /* CJK Ideograph */
- [0x7044, 0x7044], /* CJK Ideograph */
- [0x7045, 0x7045], /* CJK Ideograph */
- [0x7046, 0x7046], /* CJK Ideograph */
- [0x7047, 0x7047], /* CJK Ideograph */
- [0x7048, 0x7048], /* CJK Ideograph */
- [0x7049, 0x7049], /* CJK Ideograph */
- [0x704a, 0x704a], /* CJK Ideograph */
- [0x704b, 0x704b], /* CJK Ideograph */
- [0x704c, 0x704c], /* CJK Ideograph */
- [0x704d, 0x704d], /* CJK Ideograph */
- [0x704e, 0x704e], /* CJK Ideograph */
- [0x704f, 0x704f], /* CJK Ideograph */
- [0x7050, 0x7050], /* CJK Ideograph */
- [0x7051, 0x7051], /* CJK Ideograph */
- [0x7052, 0x7052], /* CJK Ideograph */
- [0x7053, 0x7053], /* CJK Ideograph */
- [0x7054, 0x7054], /* CJK Ideograph */
- [0x7055, 0x7055], /* CJK Ideograph */
- [0x7056, 0x7056], /* CJK Ideograph */
- [0x7057, 0x7057], /* CJK Ideograph */
- [0x7058, 0x7058], /* CJK Ideograph */
- [0x7059, 0x7059], /* CJK Ideograph */
- [0x705a, 0x705a], /* CJK Ideograph */
- [0x705b, 0x705b], /* CJK Ideograph */
- [0x705c, 0x705c], /* CJK Ideograph */
- [0x705d, 0x705d], /* CJK Ideograph */
- [0x705e, 0x705e], /* CJK Ideograph */
- [0x705f, 0x705f], /* CJK Ideograph */
- [0x7060, 0x7060], /* CJK Ideograph */
- [0x7061, 0x7061], /* CJK Ideograph */
- [0x7062, 0x7062], /* CJK Ideograph */
- [0x7063, 0x7063], /* CJK Ideograph */
- [0x7064, 0x7064], /* CJK Ideograph */
- [0x7065, 0x7065], /* CJK Ideograph */
- [0x7066, 0x7066], /* CJK Ideograph */
- [0x7067, 0x7067], /* CJK Ideograph */
- [0x7068, 0x7068], /* CJK Ideograph */
- [0x7069, 0x7069], /* CJK Ideograph */
- [0x706a, 0x706a], /* CJK Ideograph */
- [0x706b, 0x706b], /* CJK Ideograph */
- [0x706c, 0x706c], /* CJK Ideograph */
- [0x706d, 0x706d], /* CJK Ideograph */
- [0x706e, 0x706e], /* CJK Ideograph */
- [0x706f, 0x706f], /* CJK Ideograph */
- [0x7070, 0x7070], /* CJK Ideograph */
- [0x7071, 0x7071], /* CJK Ideograph */
- [0x7072, 0x7072], /* CJK Ideograph */
- [0x7073, 0x7073], /* CJK Ideograph */
- [0x7074, 0x7074], /* CJK Ideograph */
- [0x7075, 0x7075], /* CJK Ideograph */
- [0x7076, 0x7076], /* CJK Ideograph */
- [0x7077, 0x7077], /* CJK Ideograph */
- [0x7078, 0x7078], /* CJK Ideograph */
- [0x7079, 0x7079], /* CJK Ideograph */
- [0x707a, 0x707a], /* CJK Ideograph */
- [0x707b, 0x707b], /* CJK Ideograph */
- [0x707c, 0x707c], /* CJK Ideograph */
- [0x707d, 0x707d], /* CJK Ideograph */
- [0x707e, 0x707e], /* CJK Ideograph */
- [0x707f, 0x707f], /* CJK Ideograph */
- [0x7080, 0x7080], /* CJK Ideograph */
- [0x7081, 0x7081], /* CJK Ideograph */
- [0x7082, 0x7082], /* CJK Ideograph */
- [0x7083, 0x7083], /* CJK Ideograph */
- [0x7084, 0x7084], /* CJK Ideograph */
- [0x7085, 0x7085], /* CJK Ideograph */
- [0x7086, 0x7086], /* CJK Ideograph */
- [0x7087, 0x7087], /* CJK Ideograph */
- [0x7088, 0x7088], /* CJK Ideograph */
- [0x7089, 0x7089], /* CJK Ideograph */
- [0x708a, 0x708a], /* CJK Ideograph */
- [0x708b, 0x708b], /* CJK Ideograph */
- [0x708c, 0x708c], /* CJK Ideograph */
- [0x708d, 0x708d], /* CJK Ideograph */
- [0x708e, 0x708e], /* CJK Ideograph */
- [0x708f, 0x708f], /* CJK Ideograph */
- [0x7090, 0x7090], /* CJK Ideograph */
- [0x7091, 0x7091], /* CJK Ideograph */
- [0x7092, 0x7092], /* CJK Ideograph */
- [0x7093, 0x7093], /* CJK Ideograph */
- [0x7094, 0x7094], /* CJK Ideograph */
- [0x7095, 0x7095], /* CJK Ideograph */
- [0x7096, 0x7096], /* CJK Ideograph */
- [0x7097, 0x7097], /* CJK Ideograph */
- [0x7098, 0x7098], /* CJK Ideograph */
- [0x7099, 0x7099], /* CJK Ideograph */
- [0x709a, 0x709a], /* CJK Ideograph */
- [0x709b, 0x709b], /* CJK Ideograph */
- [0x709c, 0x709c], /* CJK Ideograph */
- [0x709d, 0x709d], /* CJK Ideograph */
- [0x709e, 0x709e], /* CJK Ideograph */
- [0x709f, 0x709f], /* CJK Ideograph */
- [0x70a0, 0x70a0], /* CJK Ideograph */
- [0x70a1, 0x70a1], /* CJK Ideograph */
- [0x70a2, 0x70a2], /* CJK Ideograph */
- [0x70a3, 0x70a3], /* CJK Ideograph */
- [0x70a4, 0x70a4], /* CJK Ideograph */
- [0x70a5, 0x70a5], /* CJK Ideograph */
- [0x70a6, 0x70a6], /* CJK Ideograph */
- [0x70a7, 0x70a7], /* CJK Ideograph */
- [0x70a8, 0x70a8], /* CJK Ideograph */
- [0x70a9, 0x70a9], /* CJK Ideograph */
- [0x70aa, 0x70aa], /* CJK Ideograph */
- [0x70ab, 0x70ab], /* CJK Ideograph */
- [0x70ac, 0x70ac], /* CJK Ideograph */
- [0x70ad, 0x70ad], /* CJK Ideograph */
- [0x70ae, 0x70ae], /* CJK Ideograph */
- [0x70af, 0x70af], /* CJK Ideograph */
- [0x70b0, 0x70b0], /* CJK Ideograph */
- [0x70b1, 0x70b1], /* CJK Ideograph */
- [0x70b2, 0x70b2], /* CJK Ideograph */
- [0x70b3, 0x70b3], /* CJK Ideograph */
- [0x70b4, 0x70b4], /* CJK Ideograph */
- [0x70b5, 0x70b5], /* CJK Ideograph */
- [0x70b6, 0x70b6], /* CJK Ideograph */
- [0x70b7, 0x70b7], /* CJK Ideograph */
- [0x70b8, 0x70b8], /* CJK Ideograph */
- [0x70b9, 0x70b9], /* CJK Ideograph */
- [0x70ba, 0x70ba], /* CJK Ideograph */
- [0x70bb, 0x70bb], /* CJK Ideograph */
- [0x70bc, 0x70bc], /* CJK Ideograph */
- [0x70bd, 0x70bd], /* CJK Ideograph */
- [0x70be, 0x70be], /* CJK Ideograph */
- [0x70bf, 0x70bf], /* CJK Ideograph */
- [0x70c0, 0x70c0], /* CJK Ideograph */
- [0x70c1, 0x70c1], /* CJK Ideograph */
- [0x70c2, 0x70c2], /* CJK Ideograph */
- [0x70c3, 0x70c3], /* CJK Ideograph */
- [0x70c4, 0x70c4], /* CJK Ideograph */
- [0x70c5, 0x70c5], /* CJK Ideograph */
- [0x70c6, 0x70c6], /* CJK Ideograph */
- [0x70c7, 0x70c7], /* CJK Ideograph */
- [0x70c8, 0x70c8], /* CJK Ideograph */
- [0x70c9, 0x70c9], /* CJK Ideograph */
- [0x70ca, 0x70ca], /* CJK Ideograph */
- [0x70cb, 0x70cb], /* CJK Ideograph */
- [0x70cc, 0x70cc], /* CJK Ideograph */
- [0x70cd, 0x70cd], /* CJK Ideograph */
- [0x70ce, 0x70ce], /* CJK Ideograph */
- [0x70cf, 0x70cf], /* CJK Ideograph */
- [0x70d0, 0x70d0], /* CJK Ideograph */
- [0x70d1, 0x70d1], /* CJK Ideograph */
- [0x70d2, 0x70d2], /* CJK Ideograph */
- [0x70d3, 0x70d3], /* CJK Ideograph */
- [0x70d4, 0x70d4], /* CJK Ideograph */
- [0x70d5, 0x70d5], /* CJK Ideograph */
- [0x70d6, 0x70d6], /* CJK Ideograph */
- [0x70d7, 0x70d7], /* CJK Ideograph */
- [0x70d8, 0x70d8], /* CJK Ideograph */
- [0x70d9, 0x70d9], /* CJK Ideograph */
- [0x70da, 0x70da], /* CJK Ideograph */
- [0x70db, 0x70db], /* CJK Ideograph */
- [0x70dc, 0x70dc], /* CJK Ideograph */
- [0x70dd, 0x70dd], /* CJK Ideograph */
- [0x70de, 0x70de], /* CJK Ideograph */
- [0x70df, 0x70df], /* CJK Ideograph */
- [0x70e0, 0x70e0], /* CJK Ideograph */
- [0x70e1, 0x70e1], /* CJK Ideograph */
- [0x70e2, 0x70e2], /* CJK Ideograph */
- [0x70e3, 0x70e3], /* CJK Ideograph */
- [0x70e4, 0x70e4], /* CJK Ideograph */
- [0x70e5, 0x70e5], /* CJK Ideograph */
- [0x70e6, 0x70e6], /* CJK Ideograph */
- [0x70e7, 0x70e7], /* CJK Ideograph */
- [0x70e8, 0x70e8], /* CJK Ideograph */
- [0x70e9, 0x70e9], /* CJK Ideograph */
- [0x70ea, 0x70ea], /* CJK Ideograph */
- [0x70eb, 0x70eb], /* CJK Ideograph */
- [0x70ec, 0x70ec], /* CJK Ideograph */
- [0x70ed, 0x70ed], /* CJK Ideograph */
- [0x70ee, 0x70ee], /* CJK Ideograph */
- [0x70ef, 0x70ef], /* CJK Ideograph */
- [0x70f0, 0x70f0], /* CJK Ideograph */
- [0x70f1, 0x70f1], /* CJK Ideograph */
- [0x70f2, 0x70f2], /* CJK Ideograph */
- [0x70f3, 0x70f3], /* CJK Ideograph */
- [0x70f4, 0x70f4], /* CJK Ideograph */
- [0x70f5, 0x70f5], /* CJK Ideograph */
- [0x70f6, 0x70f6], /* CJK Ideograph */
- [0x70f7, 0x70f7], /* CJK Ideograph */
- [0x70f8, 0x70f8], /* CJK Ideograph */
- [0x70f9, 0x70f9], /* CJK Ideograph */
- [0x70fa, 0x70fa], /* CJK Ideograph */
- [0x70fb, 0x70fb], /* CJK Ideograph */
- [0x70fc, 0x70fc], /* CJK Ideograph */
- [0x70fd, 0x70fd], /* CJK Ideograph */
- [0x70fe, 0x70fe], /* CJK Ideograph */
- [0x70ff, 0x70ff], /* CJK Ideograph */
- [0x7100, 0x7100], /* CJK Ideograph */
- [0x7101, 0x7101], /* CJK Ideograph */
- [0x7102, 0x7102], /* CJK Ideograph */
- [0x7103, 0x7103], /* CJK Ideograph */
- [0x7104, 0x7104], /* CJK Ideograph */
- [0x7105, 0x7105], /* CJK Ideograph */
- [0x7106, 0x7106], /* CJK Ideograph */
- [0x7107, 0x7107], /* CJK Ideograph */
- [0x7108, 0x7108], /* CJK Ideograph */
- [0x7109, 0x7109], /* CJK Ideograph */
- [0x710a, 0x710a], /* CJK Ideograph */
- [0x710b, 0x710b], /* CJK Ideograph */
- [0x710c, 0x710c], /* CJK Ideograph */
- [0x710d, 0x710d], /* CJK Ideograph */
- [0x710e, 0x710e], /* CJK Ideograph */
- [0x710f, 0x710f], /* CJK Ideograph */
- [0x7110, 0x7110], /* CJK Ideograph */
- [0x7111, 0x7111], /* CJK Ideograph */
- [0x7112, 0x7112], /* CJK Ideograph */
- [0x7113, 0x7113], /* CJK Ideograph */
- [0x7114, 0x7114], /* CJK Ideograph */
- [0x7115, 0x7115], /* CJK Ideograph */
- [0x7116, 0x7116], /* CJK Ideograph */
- [0x7117, 0x7117], /* CJK Ideograph */
- [0x7118, 0x7118], /* CJK Ideograph */
- [0x7119, 0x7119], /* CJK Ideograph */
- [0x711a, 0x711a], /* CJK Ideograph */
- [0x711b, 0x711b], /* CJK Ideograph */
- [0x711c, 0x711c], /* CJK Ideograph */
- [0x711d, 0x711d], /* CJK Ideograph */
- [0x711e, 0x711e], /* CJK Ideograph */
- [0x711f, 0x711f], /* CJK Ideograph */
- [0x7120, 0x7120], /* CJK Ideograph */
- [0x7121, 0x7121], /* CJK Ideograph */
- [0x7122, 0x7122], /* CJK Ideograph */
- [0x7123, 0x7123], /* CJK Ideograph */
- [0x7124, 0x7124], /* CJK Ideograph */
- [0x7125, 0x7125], /* CJK Ideograph */
- [0x7126, 0x7126], /* CJK Ideograph */
- [0x7127, 0x7127], /* CJK Ideograph */
- [0x7128, 0x7128], /* CJK Ideograph */
- [0x7129, 0x7129], /* CJK Ideograph */
- [0x712a, 0x712a], /* CJK Ideograph */
- [0x712b, 0x712b], /* CJK Ideograph */
- [0x712c, 0x712c], /* CJK Ideograph */
- [0x712d, 0x712d], /* CJK Ideograph */
- [0x712e, 0x712e], /* CJK Ideograph */
- [0x712f, 0x712f], /* CJK Ideograph */
- [0x7130, 0x7130], /* CJK Ideograph */
- [0x7131, 0x7131], /* CJK Ideograph */
- [0x7132, 0x7132], /* CJK Ideograph */
- [0x7133, 0x7133], /* CJK Ideograph */
- [0x7134, 0x7134], /* CJK Ideograph */
- [0x7135, 0x7135], /* CJK Ideograph */
- [0x7136, 0x7136], /* CJK Ideograph */
- [0x7137, 0x7137], /* CJK Ideograph */
- [0x7138, 0x7138], /* CJK Ideograph */
- [0x7139, 0x7139], /* CJK Ideograph */
- [0x713a, 0x713a], /* CJK Ideograph */
- [0x713b, 0x713b], /* CJK Ideograph */
- [0x713c, 0x713c], /* CJK Ideograph */
- [0x713d, 0x713d], /* CJK Ideograph */
- [0x713e, 0x713e], /* CJK Ideograph */
- [0x713f, 0x713f], /* CJK Ideograph */
- [0x7140, 0x7140], /* CJK Ideograph */
- [0x7141, 0x7141], /* CJK Ideograph */
- [0x7142, 0x7142], /* CJK Ideograph */
- [0x7143, 0x7143], /* CJK Ideograph */
- [0x7144, 0x7144], /* CJK Ideograph */
- [0x7145, 0x7145], /* CJK Ideograph */
- [0x7146, 0x7146], /* CJK Ideograph */
- [0x7147, 0x7147], /* CJK Ideograph */
- [0x7148, 0x7148], /* CJK Ideograph */
- [0x7149, 0x7149], /* CJK Ideograph */
- [0x714a, 0x714a], /* CJK Ideograph */
- [0x714b, 0x714b], /* CJK Ideograph */
- [0x714c, 0x714c], /* CJK Ideograph */
- [0x714d, 0x714d], /* CJK Ideograph */
- [0x714e, 0x714e], /* CJK Ideograph */
- [0x714f, 0x714f], /* CJK Ideograph */
- [0x7150, 0x7150], /* CJK Ideograph */
- [0x7151, 0x7151], /* CJK Ideograph */
- [0x7152, 0x7152], /* CJK Ideograph */
- [0x7153, 0x7153], /* CJK Ideograph */
- [0x7154, 0x7154], /* CJK Ideograph */
- [0x7155, 0x7155], /* CJK Ideograph */
- [0x7156, 0x7156], /* CJK Ideograph */
- [0x7157, 0x7157], /* CJK Ideograph */
- [0x7158, 0x7158], /* CJK Ideograph */
- [0x7159, 0x7159], /* CJK Ideograph */
- [0x715a, 0x715a], /* CJK Ideograph */
- [0x715b, 0x715b], /* CJK Ideograph */
- [0x715c, 0x715c], /* CJK Ideograph */
- [0x715d, 0x715d], /* CJK Ideograph */
- [0x715e, 0x715e], /* CJK Ideograph */
- [0x715f, 0x715f], /* CJK Ideograph */
- [0x7160, 0x7160], /* CJK Ideograph */
- [0x7161, 0x7161], /* CJK Ideograph */
- [0x7162, 0x7162], /* CJK Ideograph */
- [0x7163, 0x7163], /* CJK Ideograph */
- [0x7164, 0x7164], /* CJK Ideograph */
- [0x7165, 0x7165], /* CJK Ideograph */
- [0x7166, 0x7166], /* CJK Ideograph */
- [0x7167, 0x7167], /* CJK Ideograph */
- [0x7168, 0x7168], /* CJK Ideograph */
- [0x7169, 0x7169], /* CJK Ideograph */
- [0x716a, 0x716a], /* CJK Ideograph */
- [0x716b, 0x716b], /* CJK Ideograph */
- [0x716c, 0x716c], /* CJK Ideograph */
- [0x716d, 0x716d], /* CJK Ideograph */
- [0x716e, 0x716e], /* CJK Ideograph */
- [0x716f, 0x716f], /* CJK Ideograph */
- [0x7170, 0x7170], /* CJK Ideograph */
- [0x7171, 0x7171], /* CJK Ideograph */
- [0x7172, 0x7172], /* CJK Ideograph */
- [0x7173, 0x7173], /* CJK Ideograph */
- [0x7174, 0x7174], /* CJK Ideograph */
- [0x7175, 0x7175], /* CJK Ideograph */
- [0x7176, 0x7176], /* CJK Ideograph */
- [0x7177, 0x7177], /* CJK Ideograph */
- [0x7178, 0x7178], /* CJK Ideograph */
- [0x7179, 0x7179], /* CJK Ideograph */
- [0x717a, 0x717a], /* CJK Ideograph */
- [0x717b, 0x717b], /* CJK Ideograph */
- [0x717c, 0x717c], /* CJK Ideograph */
- [0x717d, 0x717d], /* CJK Ideograph */
- [0x717e, 0x717e], /* CJK Ideograph */
- [0x717f, 0x717f], /* CJK Ideograph */
- [0x7180, 0x7180], /* CJK Ideograph */
- [0x7181, 0x7181], /* CJK Ideograph */
- [0x7182, 0x7182], /* CJK Ideograph */
- [0x7183, 0x7183], /* CJK Ideograph */
- [0x7184, 0x7184], /* CJK Ideograph */
- [0x7185, 0x7185], /* CJK Ideograph */
- [0x7186, 0x7186], /* CJK Ideograph */
- [0x7187, 0x7187], /* CJK Ideograph */
- [0x7188, 0x7188], /* CJK Ideograph */
- [0x7189, 0x7189], /* CJK Ideograph */
- [0x718a, 0x718a], /* CJK Ideograph */
- [0x718b, 0x718b], /* CJK Ideograph */
- [0x718c, 0x718c], /* CJK Ideograph */
- [0x718d, 0x718d], /* CJK Ideograph */
- [0x718e, 0x718e], /* CJK Ideograph */
- [0x718f, 0x718f], /* CJK Ideograph */
- [0x7190, 0x7190], /* CJK Ideograph */
- [0x7191, 0x7191], /* CJK Ideograph */
- [0x7192, 0x7192], /* CJK Ideograph */
- [0x7193, 0x7193], /* CJK Ideograph */
- [0x7194, 0x7194], /* CJK Ideograph */
- [0x7195, 0x7195], /* CJK Ideograph */
- [0x7196, 0x7196], /* CJK Ideograph */
- [0x7197, 0x7197], /* CJK Ideograph */
- [0x7198, 0x7198], /* CJK Ideograph */
- [0x7199, 0x7199], /* CJK Ideograph */
- [0x719a, 0x719a], /* CJK Ideograph */
- [0x719b, 0x719b], /* CJK Ideograph */
- [0x719c, 0x719c], /* CJK Ideograph */
- [0x719d, 0x719d], /* CJK Ideograph */
- [0x719e, 0x719e], /* CJK Ideograph */
- [0x719f, 0x719f], /* CJK Ideograph */
- [0x71a0, 0x71a0], /* CJK Ideograph */
- [0x71a1, 0x71a1], /* CJK Ideograph */
- [0x71a2, 0x71a2], /* CJK Ideograph */
- [0x71a3, 0x71a3], /* CJK Ideograph */
- [0x71a4, 0x71a4], /* CJK Ideograph */
- [0x71a5, 0x71a5], /* CJK Ideograph */
- [0x71a6, 0x71a6], /* CJK Ideograph */
- [0x71a7, 0x71a7], /* CJK Ideograph */
- [0x71a8, 0x71a8], /* CJK Ideograph */
- [0x71a9, 0x71a9], /* CJK Ideograph */
- [0x71aa, 0x71aa], /* CJK Ideograph */
- [0x71ab, 0x71ab], /* CJK Ideograph */
- [0x71ac, 0x71ac], /* CJK Ideograph */
- [0x71ad, 0x71ad], /* CJK Ideograph */
- [0x71ae, 0x71ae], /* CJK Ideograph */
- [0x71af, 0x71af], /* CJK Ideograph */
- [0x71b0, 0x71b0], /* CJK Ideograph */
- [0x71b1, 0x71b1], /* CJK Ideograph */
- [0x71b2, 0x71b2], /* CJK Ideograph */
- [0x71b3, 0x71b3], /* CJK Ideograph */
- [0x71b4, 0x71b4], /* CJK Ideograph */
- [0x71b5, 0x71b5], /* CJK Ideograph */
- [0x71b6, 0x71b6], /* CJK Ideograph */
- [0x71b7, 0x71b7], /* CJK Ideograph */
- [0x71b8, 0x71b8], /* CJK Ideograph */
- [0x71b9, 0x71b9], /* CJK Ideograph */
- [0x71ba, 0x71ba], /* CJK Ideograph */
- [0x71bb, 0x71bb], /* CJK Ideograph */
- [0x71bc, 0x71bc], /* CJK Ideograph */
- [0x71bd, 0x71bd], /* CJK Ideograph */
- [0x71be, 0x71be], /* CJK Ideograph */
- [0x71bf, 0x71bf], /* CJK Ideograph */
- [0x71c0, 0x71c0], /* CJK Ideograph */
- [0x71c1, 0x71c1], /* CJK Ideograph */
- [0x71c2, 0x71c2], /* CJK Ideograph */
- [0x71c3, 0x71c3], /* CJK Ideograph */
- [0x71c4, 0x71c4], /* CJK Ideograph */
- [0x71c5, 0x71c5], /* CJK Ideograph */
- [0x71c6, 0x71c6], /* CJK Ideograph */
- [0x71c7, 0x71c7], /* CJK Ideograph */
- [0x71c8, 0x71c8], /* CJK Ideograph */
- [0x71c9, 0x71c9], /* CJK Ideograph */
- [0x71ca, 0x71ca], /* CJK Ideograph */
- [0x71cb, 0x71cb], /* CJK Ideograph */
- [0x71cc, 0x71cc], /* CJK Ideograph */
- [0x71cd, 0x71cd], /* CJK Ideograph */
- [0x71ce, 0x71ce], /* CJK Ideograph */
- [0x71cf, 0x71cf], /* CJK Ideograph */
- [0x71d0, 0x71d0], /* CJK Ideograph */
- [0x71d1, 0x71d1], /* CJK Ideograph */
- [0x71d2, 0x71d2], /* CJK Ideograph */
- [0x71d3, 0x71d3], /* CJK Ideograph */
- [0x71d4, 0x71d4], /* CJK Ideograph */
- [0x71d5, 0x71d5], /* CJK Ideograph */
- [0x71d6, 0x71d6], /* CJK Ideograph */
- [0x71d7, 0x71d7], /* CJK Ideograph */
- [0x71d8, 0x71d8], /* CJK Ideograph */
- [0x71d9, 0x71d9], /* CJK Ideograph */
- [0x71da, 0x71da], /* CJK Ideograph */
- [0x71db, 0x71db], /* CJK Ideograph */
- [0x71dc, 0x71dc], /* CJK Ideograph */
- [0x71dd, 0x71dd], /* CJK Ideograph */
- [0x71de, 0x71de], /* CJK Ideograph */
- [0x71df, 0x71df], /* CJK Ideograph */
- [0x71e0, 0x71e0], /* CJK Ideograph */
- [0x71e1, 0x71e1], /* CJK Ideograph */
- [0x71e2, 0x71e2], /* CJK Ideograph */
- [0x71e3, 0x71e3], /* CJK Ideograph */
- [0x71e4, 0x71e4], /* CJK Ideograph */
- [0x71e5, 0x71e5], /* CJK Ideograph */
- [0x71e6, 0x71e6], /* CJK Ideograph */
- [0x71e7, 0x71e7], /* CJK Ideograph */
- [0x71e8, 0x71e8], /* CJK Ideograph */
- [0x71e9, 0x71e9], /* CJK Ideograph */
- [0x71ea, 0x71ea], /* CJK Ideograph */
- [0x71eb, 0x71eb], /* CJK Ideograph */
- [0x71ec, 0x71ec], /* CJK Ideograph */
- [0x71ed, 0x71ed], /* CJK Ideograph */
- [0x71ee, 0x71ee], /* CJK Ideograph */
- [0x71ef, 0x71ef], /* CJK Ideograph */
- [0x71f0, 0x71f0], /* CJK Ideograph */
- [0x71f1, 0x71f1], /* CJK Ideograph */
- [0x71f2, 0x71f2], /* CJK Ideograph */
- [0x71f3, 0x71f3], /* CJK Ideograph */
- [0x71f4, 0x71f4], /* CJK Ideograph */
- [0x71f5, 0x71f5], /* CJK Ideograph */
- [0x71f6, 0x71f6], /* CJK Ideograph */
- [0x71f7, 0x71f7], /* CJK Ideograph */
- [0x71f8, 0x71f8], /* CJK Ideograph */
- [0x71f9, 0x71f9], /* CJK Ideograph */
- [0x71fa, 0x71fa], /* CJK Ideograph */
- [0x71fb, 0x71fb], /* CJK Ideograph */
- [0x71fc, 0x71fc], /* CJK Ideograph */
- [0x71fd, 0x71fd], /* CJK Ideograph */
- [0x71fe, 0x71fe], /* CJK Ideograph */
- [0x71ff, 0x71ff], /* CJK Ideograph */
- [0x7200, 0x7200], /* CJK Ideograph */
- [0x7201, 0x7201], /* CJK Ideograph */
- [0x7202, 0x7202], /* CJK Ideograph */
- [0x7203, 0x7203], /* CJK Ideograph */
- [0x7204, 0x7204], /* CJK Ideograph */
- [0x7205, 0x7205], /* CJK Ideograph */
- [0x7206, 0x7206], /* CJK Ideograph */
- [0x7207, 0x7207], /* CJK Ideograph */
- [0x7208, 0x7208], /* CJK Ideograph */
- [0x7209, 0x7209], /* CJK Ideograph */
- [0x720a, 0x720a], /* CJK Ideograph */
- [0x720b, 0x720b], /* CJK Ideograph */
- [0x720c, 0x720c], /* CJK Ideograph */
- [0x720d, 0x720d], /* CJK Ideograph */
- [0x720e, 0x720e], /* CJK Ideograph */
- [0x720f, 0x720f], /* CJK Ideograph */
- [0x7210, 0x7210], /* CJK Ideograph */
- [0x7211, 0x7211], /* CJK Ideograph */
- [0x7212, 0x7212], /* CJK Ideograph */
- [0x7213, 0x7213], /* CJK Ideograph */
- [0x7214, 0x7214], /* CJK Ideograph */
- [0x7215, 0x7215], /* CJK Ideograph */
- [0x7216, 0x7216], /* CJK Ideograph */
- [0x7217, 0x7217], /* CJK Ideograph */
- [0x7218, 0x7218], /* CJK Ideograph */
- [0x7219, 0x7219], /* CJK Ideograph */
- [0x721a, 0x721a], /* CJK Ideograph */
- [0x721b, 0x721b], /* CJK Ideograph */
- [0x721c, 0x721c], /* CJK Ideograph */
- [0x721d, 0x721d], /* CJK Ideograph */
- [0x721e, 0x721e], /* CJK Ideograph */
- [0x721f, 0x721f], /* CJK Ideograph */
- [0x7220, 0x7220], /* CJK Ideograph */
- [0x7221, 0x7221], /* CJK Ideograph */
- [0x7222, 0x7222], /* CJK Ideograph */
- [0x7223, 0x7223], /* CJK Ideograph */
- [0x7224, 0x7224], /* CJK Ideograph */
- [0x7225, 0x7225], /* CJK Ideograph */
- [0x7226, 0x7226], /* CJK Ideograph */
- [0x7227, 0x7227], /* CJK Ideograph */
- [0x7228, 0x7228], /* CJK Ideograph */
- [0x7229, 0x7229], /* CJK Ideograph */
- [0x722a, 0x722a], /* CJK Ideograph */
- [0x722b, 0x722b], /* CJK Ideograph */
- [0x722c, 0x722c], /* CJK Ideograph */
- [0x722d, 0x722d], /* CJK Ideograph */
- [0x722e, 0x722e], /* CJK Ideograph */
- [0x722f, 0x722f], /* CJK Ideograph */
- [0x7230, 0x7230], /* CJK Ideograph */
- [0x7231, 0x7231], /* CJK Ideograph */
- [0x7232, 0x7232], /* CJK Ideograph */
- [0x7233, 0x7233], /* CJK Ideograph */
- [0x7234, 0x7234], /* CJK Ideograph */
- [0x7235, 0x7235], /* CJK Ideograph */
- [0x7236, 0x7236], /* CJK Ideograph */
- [0x7237, 0x7237], /* CJK Ideograph */
- [0x7238, 0x7238], /* CJK Ideograph */
- [0x7239, 0x7239], /* CJK Ideograph */
- [0x723a, 0x723a], /* CJK Ideograph */
- [0x723b, 0x723b], /* CJK Ideograph */
- [0x723c, 0x723c], /* CJK Ideograph */
- [0x723d, 0x723d], /* CJK Ideograph */
- [0x723e, 0x723e], /* CJK Ideograph */
- [0x723f, 0x723f], /* CJK Ideograph */
- [0x7240, 0x7240], /* CJK Ideograph */
- [0x7241, 0x7241], /* CJK Ideograph */
- [0x7242, 0x7242], /* CJK Ideograph */
- [0x7243, 0x7243], /* CJK Ideograph */
- [0x7244, 0x7244], /* CJK Ideograph */
- [0x7245, 0x7245], /* CJK Ideograph */
- [0x7246, 0x7246], /* CJK Ideograph */
- [0x7247, 0x7247], /* CJK Ideograph */
- [0x7248, 0x7248], /* CJK Ideograph */
- [0x7249, 0x7249], /* CJK Ideograph */
- [0x724a, 0x724a], /* CJK Ideograph */
- [0x724b, 0x724b], /* CJK Ideograph */
- [0x724c, 0x724c], /* CJK Ideograph */
- [0x724d, 0x724d], /* CJK Ideograph */
- [0x724e, 0x724e], /* CJK Ideograph */
- [0x724f, 0x724f], /* CJK Ideograph */
- [0x7250, 0x7250], /* CJK Ideograph */
- [0x7251, 0x7251], /* CJK Ideograph */
- [0x7252, 0x7252], /* CJK Ideograph */
- [0x7253, 0x7253], /* CJK Ideograph */
- [0x7254, 0x7254], /* CJK Ideograph */
- [0x7255, 0x7255], /* CJK Ideograph */
- [0x7256, 0x7256], /* CJK Ideograph */
- [0x7257, 0x7257], /* CJK Ideograph */
- [0x7258, 0x7258], /* CJK Ideograph */
- [0x7259, 0x7259], /* CJK Ideograph */
- [0x725a, 0x725a], /* CJK Ideograph */
- [0x725b, 0x725b], /* CJK Ideograph */
- [0x725c, 0x725c], /* CJK Ideograph */
- [0x725d, 0x725d], /* CJK Ideograph */
- [0x725e, 0x725e], /* CJK Ideograph */
- [0x725f, 0x725f], /* CJK Ideograph */
- [0x7260, 0x7260], /* CJK Ideograph */
- [0x7261, 0x7261], /* CJK Ideograph */
- [0x7262, 0x7262], /* CJK Ideograph */
- [0x7263, 0x7263], /* CJK Ideograph */
- [0x7264, 0x7264], /* CJK Ideograph */
- [0x7265, 0x7265], /* CJK Ideograph */
- [0x7266, 0x7266], /* CJK Ideograph */
- [0x7267, 0x7267], /* CJK Ideograph */
- [0x7268, 0x7268], /* CJK Ideograph */
- [0x7269, 0x7269], /* CJK Ideograph */
- [0x726a, 0x726a], /* CJK Ideograph */
- [0x726b, 0x726b], /* CJK Ideograph */
- [0x726c, 0x726c], /* CJK Ideograph */
- [0x726d, 0x726d], /* CJK Ideograph */
- [0x726e, 0x726e], /* CJK Ideograph */
- [0x726f, 0x726f], /* CJK Ideograph */
- [0x7270, 0x7270], /* CJK Ideograph */
- [0x7271, 0x7271], /* CJK Ideograph */
- [0x7272, 0x7272], /* CJK Ideograph */
- [0x7273, 0x7273], /* CJK Ideograph */
- [0x7274, 0x7274], /* CJK Ideograph */
- [0x7275, 0x7275], /* CJK Ideograph */
- [0x7276, 0x7276], /* CJK Ideograph */
- [0x7277, 0x7277], /* CJK Ideograph */
- [0x7278, 0x7278], /* CJK Ideograph */
- [0x7279, 0x7279], /* CJK Ideograph */
- [0x727a, 0x727a], /* CJK Ideograph */
- [0x727b, 0x727b], /* CJK Ideograph */
- [0x727c, 0x727c], /* CJK Ideograph */
- [0x727d, 0x727d], /* CJK Ideograph */
- [0x727e, 0x727e], /* CJK Ideograph */
- [0x727f, 0x727f], /* CJK Ideograph */
- [0x7280, 0x7280], /* CJK Ideograph */
- [0x7281, 0x7281], /* CJK Ideograph */
- [0x7282, 0x7282], /* CJK Ideograph */
- [0x7283, 0x7283], /* CJK Ideograph */
- [0x7284, 0x7284], /* CJK Ideograph */
- [0x7285, 0x7285], /* CJK Ideograph */
- [0x7286, 0x7286], /* CJK Ideograph */
- [0x7287, 0x7287], /* CJK Ideograph */
- [0x7288, 0x7288], /* CJK Ideograph */
- [0x7289, 0x7289], /* CJK Ideograph */
- [0x728a, 0x728a], /* CJK Ideograph */
- [0x728b, 0x728b], /* CJK Ideograph */
- [0x728c, 0x728c], /* CJK Ideograph */
- [0x728d, 0x728d], /* CJK Ideograph */
- [0x728e, 0x728e], /* CJK Ideograph */
- [0x728f, 0x728f], /* CJK Ideograph */
- [0x7290, 0x7290], /* CJK Ideograph */
- [0x7291, 0x7291], /* CJK Ideograph */
- [0x7292, 0x7292], /* CJK Ideograph */
- [0x7293, 0x7293], /* CJK Ideograph */
- [0x7294, 0x7294], /* CJK Ideograph */
- [0x7295, 0x7295], /* CJK Ideograph */
- [0x7296, 0x7296], /* CJK Ideograph */
- [0x7297, 0x7297], /* CJK Ideograph */
- [0x7298, 0x7298], /* CJK Ideograph */
- [0x7299, 0x7299], /* CJK Ideograph */
- [0x729a, 0x729a], /* CJK Ideograph */
- [0x729b, 0x729b], /* CJK Ideograph */
- [0x729c, 0x729c], /* CJK Ideograph */
- [0x729d, 0x729d], /* CJK Ideograph */
- [0x729e, 0x729e], /* CJK Ideograph */
- [0x729f, 0x729f], /* CJK Ideograph */
- [0x72a0, 0x72a0], /* CJK Ideograph */
- [0x72a1, 0x72a1], /* CJK Ideograph */
- [0x72a2, 0x72a2], /* CJK Ideograph */
- [0x72a3, 0x72a3], /* CJK Ideograph */
- [0x72a4, 0x72a4], /* CJK Ideograph */
- [0x72a5, 0x72a5], /* CJK Ideograph */
- [0x72a6, 0x72a6], /* CJK Ideograph */
- [0x72a7, 0x72a7], /* CJK Ideograph */
- [0x72a8, 0x72a8], /* CJK Ideograph */
- [0x72a9, 0x72a9], /* CJK Ideograph */
- [0x72aa, 0x72aa], /* CJK Ideograph */
- [0x72ab, 0x72ab], /* CJK Ideograph */
- [0x72ac, 0x72ac], /* CJK Ideograph */
- [0x72ad, 0x72ad], /* CJK Ideograph */
- [0x72ae, 0x72ae], /* CJK Ideograph */
- [0x72af, 0x72af], /* CJK Ideograph */
- [0x72b0, 0x72b0], /* CJK Ideograph */
- [0x72b1, 0x72b1], /* CJK Ideograph */
- [0x72b2, 0x72b2], /* CJK Ideograph */
- [0x72b3, 0x72b3], /* CJK Ideograph */
- [0x72b4, 0x72b4], /* CJK Ideograph */
- [0x72b5, 0x72b5], /* CJK Ideograph */
- [0x72b6, 0x72b6], /* CJK Ideograph */
- [0x72b7, 0x72b7], /* CJK Ideograph */
- [0x72b8, 0x72b8], /* CJK Ideograph */
- [0x72b9, 0x72b9], /* CJK Ideograph */
- [0x72ba, 0x72ba], /* CJK Ideograph */
- [0x72bb, 0x72bb], /* CJK Ideograph */
- [0x72bc, 0x72bc], /* CJK Ideograph */
- [0x72bd, 0x72bd], /* CJK Ideograph */
- [0x72be, 0x72be], /* CJK Ideograph */
- [0x72bf, 0x72bf], /* CJK Ideograph */
- [0x72c0, 0x72c0], /* CJK Ideograph */
- [0x72c1, 0x72c1], /* CJK Ideograph */
- [0x72c2, 0x72c2], /* CJK Ideograph */
- [0x72c3, 0x72c3], /* CJK Ideograph */
- [0x72c4, 0x72c4], /* CJK Ideograph */
- [0x72c5, 0x72c5], /* CJK Ideograph */
- [0x72c6, 0x72c6], /* CJK Ideograph */
- [0x72c7, 0x72c7], /* CJK Ideograph */
- [0x72c8, 0x72c8], /* CJK Ideograph */
- [0x72c9, 0x72c9], /* CJK Ideograph */
- [0x72ca, 0x72ca], /* CJK Ideograph */
- [0x72cb, 0x72cb], /* CJK Ideograph */
- [0x72cc, 0x72cc], /* CJK Ideograph */
- [0x72cd, 0x72cd], /* CJK Ideograph */
- [0x72ce, 0x72ce], /* CJK Ideograph */
- [0x72cf, 0x72cf], /* CJK Ideograph */
- [0x72d0, 0x72d0], /* CJK Ideograph */
- [0x72d1, 0x72d1], /* CJK Ideograph */
- [0x72d2, 0x72d2], /* CJK Ideograph */
- [0x72d3, 0x72d3], /* CJK Ideograph */
- [0x72d4, 0x72d4], /* CJK Ideograph */
- [0x72d5, 0x72d5], /* CJK Ideograph */
- [0x72d6, 0x72d6], /* CJK Ideograph */
- [0x72d7, 0x72d7], /* CJK Ideograph */
- [0x72d8, 0x72d8], /* CJK Ideograph */
- [0x72d9, 0x72d9], /* CJK Ideograph */
- [0x72da, 0x72da], /* CJK Ideograph */
- [0x72db, 0x72db], /* CJK Ideograph */
- [0x72dc, 0x72dc], /* CJK Ideograph */
- [0x72dd, 0x72dd], /* CJK Ideograph */
- [0x72de, 0x72de], /* CJK Ideograph */
- [0x72df, 0x72df], /* CJK Ideograph */
- [0x72e0, 0x72e0], /* CJK Ideograph */
- [0x72e1, 0x72e1], /* CJK Ideograph */
- [0x72e2, 0x72e2], /* CJK Ideograph */
- [0x72e3, 0x72e3], /* CJK Ideograph */
- [0x72e4, 0x72e4], /* CJK Ideograph */
- [0x72e5, 0x72e5], /* CJK Ideograph */
- [0x72e6, 0x72e6], /* CJK Ideograph */
- [0x72e7, 0x72e7], /* CJK Ideograph */
- [0x72e8, 0x72e8], /* CJK Ideograph */
- [0x72e9, 0x72e9], /* CJK Ideograph */
- [0x72ea, 0x72ea], /* CJK Ideograph */
- [0x72eb, 0x72eb], /* CJK Ideograph */
- [0x72ec, 0x72ec], /* CJK Ideograph */
- [0x72ed, 0x72ed], /* CJK Ideograph */
- [0x72ee, 0x72ee], /* CJK Ideograph */
- [0x72ef, 0x72ef], /* CJK Ideograph */
- [0x72f0, 0x72f0], /* CJK Ideograph */
- [0x72f1, 0x72f1], /* CJK Ideograph */
- [0x72f2, 0x72f2], /* CJK Ideograph */
- [0x72f3, 0x72f3], /* CJK Ideograph */
- [0x72f4, 0x72f4], /* CJK Ideograph */
- [0x72f5, 0x72f5], /* CJK Ideograph */
- [0x72f6, 0x72f6], /* CJK Ideograph */
- [0x72f7, 0x72f7], /* CJK Ideograph */
- [0x72f8, 0x72f8], /* CJK Ideograph */
- [0x72f9, 0x72f9], /* CJK Ideograph */
- [0x72fa, 0x72fa], /* CJK Ideograph */
- [0x72fb, 0x72fb], /* CJK Ideograph */
- [0x72fc, 0x72fc], /* CJK Ideograph */
- [0x72fd, 0x72fd], /* CJK Ideograph */
- [0x72fe, 0x72fe], /* CJK Ideograph */
- [0x72ff, 0x72ff], /* CJK Ideograph */
- [0x7300, 0x7300], /* CJK Ideograph */
- [0x7301, 0x7301], /* CJK Ideograph */
- [0x7302, 0x7302], /* CJK Ideograph */
- [0x7303, 0x7303], /* CJK Ideograph */
- [0x7304, 0x7304], /* CJK Ideograph */
- [0x7305, 0x7305], /* CJK Ideograph */
- [0x7306, 0x7306], /* CJK Ideograph */
- [0x7307, 0x7307], /* CJK Ideograph */
- [0x7308, 0x7308], /* CJK Ideograph */
- [0x7309, 0x7309], /* CJK Ideograph */
- [0x730a, 0x730a], /* CJK Ideograph */
- [0x730b, 0x730b], /* CJK Ideograph */
- [0x730c, 0x730c], /* CJK Ideograph */
- [0x730d, 0x730d], /* CJK Ideograph */
- [0x730e, 0x730e], /* CJK Ideograph */
- [0x730f, 0x730f], /* CJK Ideograph */
- [0x7310, 0x7310], /* CJK Ideograph */
- [0x7311, 0x7311], /* CJK Ideograph */
- [0x7312, 0x7312], /* CJK Ideograph */
- [0x7313, 0x7313], /* CJK Ideograph */
- [0x7314, 0x7314], /* CJK Ideograph */
- [0x7315, 0x7315], /* CJK Ideograph */
- [0x7316, 0x7316], /* CJK Ideograph */
- [0x7317, 0x7317], /* CJK Ideograph */
- [0x7318, 0x7318], /* CJK Ideograph */
- [0x7319, 0x7319], /* CJK Ideograph */
- [0x731a, 0x731a], /* CJK Ideograph */
- [0x731b, 0x731b], /* CJK Ideograph */
- [0x731c, 0x731c], /* CJK Ideograph */
- [0x731d, 0x731d], /* CJK Ideograph */
- [0x731e, 0x731e], /* CJK Ideograph */
- [0x731f, 0x731f], /* CJK Ideograph */
- [0x7320, 0x7320], /* CJK Ideograph */
- [0x7321, 0x7321], /* CJK Ideograph */
- [0x7322, 0x7322], /* CJK Ideograph */
- [0x7323, 0x7323], /* CJK Ideograph */
- [0x7324, 0x7324], /* CJK Ideograph */
- [0x7325, 0x7325], /* CJK Ideograph */
- [0x7326, 0x7326], /* CJK Ideograph */
- [0x7327, 0x7327], /* CJK Ideograph */
- [0x7328, 0x7328], /* CJK Ideograph */
- [0x7329, 0x7329], /* CJK Ideograph */
- [0x732a, 0x732a], /* CJK Ideograph */
- [0x732b, 0x732b], /* CJK Ideograph */
- [0x732c, 0x732c], /* CJK Ideograph */
- [0x732d, 0x732d], /* CJK Ideograph */
- [0x732e, 0x732e], /* CJK Ideograph */
- [0x732f, 0x732f], /* CJK Ideograph */
- [0x7330, 0x7330], /* CJK Ideograph */
- [0x7331, 0x7331], /* CJK Ideograph */
- [0x7332, 0x7332], /* CJK Ideograph */
- [0x7333, 0x7333], /* CJK Ideograph */
- [0x7334, 0x7334], /* CJK Ideograph */
- [0x7335, 0x7335], /* CJK Ideograph */
- [0x7336, 0x7336], /* CJK Ideograph */
- [0x7337, 0x7337], /* CJK Ideograph */
- [0x7338, 0x7338], /* CJK Ideograph */
- [0x7339, 0x7339], /* CJK Ideograph */
- [0x733a, 0x733a], /* CJK Ideograph */
- [0x733b, 0x733b], /* CJK Ideograph */
- [0x733c, 0x733c], /* CJK Ideograph */
- [0x733d, 0x733d], /* CJK Ideograph */
- [0x733e, 0x733e], /* CJK Ideograph */
- [0x733f, 0x733f], /* CJK Ideograph */
- [0x7340, 0x7340], /* CJK Ideograph */
- [0x7341, 0x7341], /* CJK Ideograph */
- [0x7342, 0x7342], /* CJK Ideograph */
- [0x7343, 0x7343], /* CJK Ideograph */
- [0x7344, 0x7344], /* CJK Ideograph */
- [0x7345, 0x7345], /* CJK Ideograph */
- [0x7346, 0x7346], /* CJK Ideograph */
- [0x7347, 0x7347], /* CJK Ideograph */
- [0x7348, 0x7348], /* CJK Ideograph */
- [0x7349, 0x7349], /* CJK Ideograph */
- [0x734a, 0x734a], /* CJK Ideograph */
- [0x734b, 0x734b], /* CJK Ideograph */
- [0x734c, 0x734c], /* CJK Ideograph */
- [0x734d, 0x734d], /* CJK Ideograph */
- [0x734e, 0x734e], /* CJK Ideograph */
- [0x734f, 0x734f], /* CJK Ideograph */
- [0x7350, 0x7350], /* CJK Ideograph */
- [0x7351, 0x7351], /* CJK Ideograph */
- [0x7352, 0x7352], /* CJK Ideograph */
- [0x7353, 0x7353], /* CJK Ideograph */
- [0x7354, 0x7354], /* CJK Ideograph */
- [0x7355, 0x7355], /* CJK Ideograph */
- [0x7356, 0x7356], /* CJK Ideograph */
- [0x7357, 0x7357], /* CJK Ideograph */
- [0x7358, 0x7358], /* CJK Ideograph */
- [0x7359, 0x7359], /* CJK Ideograph */
- [0x735a, 0x735a], /* CJK Ideograph */
- [0x735b, 0x735b], /* CJK Ideograph */
- [0x735c, 0x735c], /* CJK Ideograph */
- [0x735d, 0x735d], /* CJK Ideograph */
- [0x735e, 0x735e], /* CJK Ideograph */
- [0x735f, 0x735f], /* CJK Ideograph */
- [0x7360, 0x7360], /* CJK Ideograph */
- [0x7361, 0x7361], /* CJK Ideograph */
- [0x7362, 0x7362], /* CJK Ideograph */
- [0x7363, 0x7363], /* CJK Ideograph */
- [0x7364, 0x7364], /* CJK Ideograph */
- [0x7365, 0x7365], /* CJK Ideograph */
- [0x7366, 0x7366], /* CJK Ideograph */
- [0x7367, 0x7367], /* CJK Ideograph */
- [0x7368, 0x7368], /* CJK Ideograph */
- [0x7369, 0x7369], /* CJK Ideograph */
- [0x736a, 0x736a], /* CJK Ideograph */
- [0x736b, 0x736b], /* CJK Ideograph */
- [0x736c, 0x736c], /* CJK Ideograph */
- [0x736d, 0x736d], /* CJK Ideograph */
- [0x736e, 0x736e], /* CJK Ideograph */
- [0x736f, 0x736f], /* CJK Ideograph */
- [0x7370, 0x7370], /* CJK Ideograph */
- [0x7371, 0x7371], /* CJK Ideograph */
- [0x7372, 0x7372], /* CJK Ideograph */
- [0x7373, 0x7373], /* CJK Ideograph */
- [0x7374, 0x7374], /* CJK Ideograph */
- [0x7375, 0x7375], /* CJK Ideograph */
- [0x7376, 0x7376], /* CJK Ideograph */
- [0x7377, 0x7377], /* CJK Ideograph */
- [0x7378, 0x7378], /* CJK Ideograph */
- [0x7379, 0x7379], /* CJK Ideograph */
- [0x737a, 0x737a], /* CJK Ideograph */
- [0x737b, 0x737b], /* CJK Ideograph */
- [0x737c, 0x737c], /* CJK Ideograph */
- [0x737d, 0x737d], /* CJK Ideograph */
- [0x737e, 0x737e], /* CJK Ideograph */
- [0x737f, 0x737f], /* CJK Ideograph */
- [0x7380, 0x7380], /* CJK Ideograph */
- [0x7381, 0x7381], /* CJK Ideograph */
- [0x7382, 0x7382], /* CJK Ideograph */
- [0x7383, 0x7383], /* CJK Ideograph */
- [0x7384, 0x7384], /* CJK Ideograph */
- [0x7385, 0x7385], /* CJK Ideograph */
- [0x7386, 0x7386], /* CJK Ideograph */
- [0x7387, 0x7387], /* CJK Ideograph */
- [0x7388, 0x7388], /* CJK Ideograph */
- [0x7389, 0x7389], /* CJK Ideograph */
- [0x738a, 0x738a], /* CJK Ideograph */
- [0x738b, 0x738b], /* CJK Ideograph */
- [0x738c, 0x738c], /* CJK Ideograph */
- [0x738d, 0x738d], /* CJK Ideograph */
- [0x738e, 0x738e], /* CJK Ideograph */
- [0x738f, 0x738f], /* CJK Ideograph */
- [0x7390, 0x7390], /* CJK Ideograph */
- [0x7391, 0x7391], /* CJK Ideograph */
- [0x7392, 0x7392], /* CJK Ideograph */
- [0x7393, 0x7393], /* CJK Ideograph */
- [0x7394, 0x7394], /* CJK Ideograph */
- [0x7395, 0x7395], /* CJK Ideograph */
- [0x7396, 0x7396], /* CJK Ideograph */
- [0x7397, 0x7397], /* CJK Ideograph */
- [0x7398, 0x7398], /* CJK Ideograph */
- [0x7399, 0x7399], /* CJK Ideograph */
- [0x739a, 0x739a], /* CJK Ideograph */
- [0x739b, 0x739b], /* CJK Ideograph */
- [0x739c, 0x739c], /* CJK Ideograph */
- [0x739d, 0x739d], /* CJK Ideograph */
- [0x739e, 0x739e], /* CJK Ideograph */
- [0x739f, 0x739f], /* CJK Ideograph */
- [0x73a0, 0x73a0], /* CJK Ideograph */
- [0x73a1, 0x73a1], /* CJK Ideograph */
- [0x73a2, 0x73a2], /* CJK Ideograph */
- [0x73a3, 0x73a3], /* CJK Ideograph */
- [0x73a4, 0x73a4], /* CJK Ideograph */
- [0x73a5, 0x73a5], /* CJK Ideograph */
- [0x73a6, 0x73a6], /* CJK Ideograph */
- [0x73a7, 0x73a7], /* CJK Ideograph */
- [0x73a8, 0x73a8], /* CJK Ideograph */
- [0x73a9, 0x73a9], /* CJK Ideograph */
- [0x73aa, 0x73aa], /* CJK Ideograph */
- [0x73ab, 0x73ab], /* CJK Ideograph */
- [0x73ac, 0x73ac], /* CJK Ideograph */
- [0x73ad, 0x73ad], /* CJK Ideograph */
- [0x73ae, 0x73ae], /* CJK Ideograph */
- [0x73af, 0x73af], /* CJK Ideograph */
- [0x73b0, 0x73b0], /* CJK Ideograph */
- [0x73b1, 0x73b1], /* CJK Ideograph */
- [0x73b2, 0x73b2], /* CJK Ideograph */
- [0x73b3, 0x73b3], /* CJK Ideograph */
- [0x73b4, 0x73b4], /* CJK Ideograph */
- [0x73b5, 0x73b5], /* CJK Ideograph */
- [0x73b6, 0x73b6], /* CJK Ideograph */
- [0x73b7, 0x73b7], /* CJK Ideograph */
- [0x73b8, 0x73b8], /* CJK Ideograph */
- [0x73b9, 0x73b9], /* CJK Ideograph */
- [0x73ba, 0x73ba], /* CJK Ideograph */
- [0x73bb, 0x73bb], /* CJK Ideograph */
- [0x73bc, 0x73bc], /* CJK Ideograph */
- [0x73bd, 0x73bd], /* CJK Ideograph */
- [0x73be, 0x73be], /* CJK Ideograph */
- [0x73bf, 0x73bf], /* CJK Ideograph */
- [0x73c0, 0x73c0], /* CJK Ideograph */
- [0x73c1, 0x73c1], /* CJK Ideograph */
- [0x73c2, 0x73c2], /* CJK Ideograph */
- [0x73c3, 0x73c3], /* CJK Ideograph */
- [0x73c4, 0x73c4], /* CJK Ideograph */
- [0x73c5, 0x73c5], /* CJK Ideograph */
- [0x73c6, 0x73c6], /* CJK Ideograph */
- [0x73c7, 0x73c7], /* CJK Ideograph */
- [0x73c8, 0x73c8], /* CJK Ideograph */
- [0x73c9, 0x73c9], /* CJK Ideograph */
- [0x73ca, 0x73ca], /* CJK Ideograph */
- [0x73cb, 0x73cb], /* CJK Ideograph */
- [0x73cc, 0x73cc], /* CJK Ideograph */
- [0x73cd, 0x73cd], /* CJK Ideograph */
- [0x73ce, 0x73ce], /* CJK Ideograph */
- [0x73cf, 0x73cf], /* CJK Ideograph */
- [0x73d0, 0x73d0], /* CJK Ideograph */
- [0x73d1, 0x73d1], /* CJK Ideograph */
- [0x73d2, 0x73d2], /* CJK Ideograph */
- [0x73d3, 0x73d3], /* CJK Ideograph */
- [0x73d4, 0x73d4], /* CJK Ideograph */
- [0x73d5, 0x73d5], /* CJK Ideograph */
- [0x73d6, 0x73d6], /* CJK Ideograph */
- [0x73d7, 0x73d7], /* CJK Ideograph */
- [0x73d8, 0x73d8], /* CJK Ideograph */
- [0x73d9, 0x73d9], /* CJK Ideograph */
- [0x73da, 0x73da], /* CJK Ideograph */
- [0x73db, 0x73db], /* CJK Ideograph */
- [0x73dc, 0x73dc], /* CJK Ideograph */
- [0x73dd, 0x73dd], /* CJK Ideograph */
- [0x73de, 0x73de], /* CJK Ideograph */
- [0x73df, 0x73df], /* CJK Ideograph */
- [0x73e0, 0x73e0], /* CJK Ideograph */
- [0x73e1, 0x73e1], /* CJK Ideograph */
- [0x73e2, 0x73e2], /* CJK Ideograph */
- [0x73e3, 0x73e3], /* CJK Ideograph */
- [0x73e4, 0x73e4], /* CJK Ideograph */
- [0x73e5, 0x73e5], /* CJK Ideograph */
- [0x73e6, 0x73e6], /* CJK Ideograph */
- [0x73e7, 0x73e7], /* CJK Ideograph */
- [0x73e8, 0x73e8], /* CJK Ideograph */
- [0x73e9, 0x73e9], /* CJK Ideograph */
- [0x73ea, 0x73ea], /* CJK Ideograph */
- [0x73eb, 0x73eb], /* CJK Ideograph */
- [0x73ec, 0x73ec], /* CJK Ideograph */
- [0x73ed, 0x73ed], /* CJK Ideograph */
- [0x73ee, 0x73ee], /* CJK Ideograph */
- [0x73ef, 0x73ef], /* CJK Ideograph */
- [0x73f0, 0x73f0], /* CJK Ideograph */
- [0x73f1, 0x73f1], /* CJK Ideograph */
- [0x73f2, 0x73f2], /* CJK Ideograph */
- [0x73f3, 0x73f3], /* CJK Ideograph */
- [0x73f4, 0x73f4], /* CJK Ideograph */
- [0x73f5, 0x73f5], /* CJK Ideograph */
- [0x73f6, 0x73f6], /* CJK Ideograph */
- [0x73f7, 0x73f7], /* CJK Ideograph */
- [0x73f8, 0x73f8], /* CJK Ideograph */
- [0x73f9, 0x73f9], /* CJK Ideograph */
- [0x73fa, 0x73fa], /* CJK Ideograph */
- [0x73fb, 0x73fb], /* CJK Ideograph */
- [0x73fc, 0x73fc], /* CJK Ideograph */
- [0x73fd, 0x73fd], /* CJK Ideograph */
- [0x73fe, 0x73fe], /* CJK Ideograph */
- [0x73ff, 0x73ff], /* CJK Ideograph */
- [0x7400, 0x7400], /* CJK Ideograph */
- [0x7401, 0x7401], /* CJK Ideograph */
- [0x7402, 0x7402], /* CJK Ideograph */
- [0x7403, 0x7403], /* CJK Ideograph */
- [0x7404, 0x7404], /* CJK Ideograph */
- [0x7405, 0x7405], /* CJK Ideograph */
- [0x7406, 0x7406], /* CJK Ideograph */
- [0x7407, 0x7407], /* CJK Ideograph */
- [0x7408, 0x7408], /* CJK Ideograph */
- [0x7409, 0x7409], /* CJK Ideograph */
- [0x740a, 0x740a], /* CJK Ideograph */
- [0x740b, 0x740b], /* CJK Ideograph */
- [0x740c, 0x740c], /* CJK Ideograph */
- [0x740d, 0x740d], /* CJK Ideograph */
- [0x740e, 0x740e], /* CJK Ideograph */
- [0x740f, 0x740f], /* CJK Ideograph */
- [0x7410, 0x7410], /* CJK Ideograph */
- [0x7411, 0x7411], /* CJK Ideograph */
- [0x7412, 0x7412], /* CJK Ideograph */
- [0x7413, 0x7413], /* CJK Ideograph */
- [0x7414, 0x7414], /* CJK Ideograph */
- [0x7415, 0x7415], /* CJK Ideograph */
- [0x7416, 0x7416], /* CJK Ideograph */
- [0x7417, 0x7417], /* CJK Ideograph */
- [0x7418, 0x7418], /* CJK Ideograph */
- [0x7419, 0x7419], /* CJK Ideograph */
- [0x741a, 0x741a], /* CJK Ideograph */
- [0x741b, 0x741b], /* CJK Ideograph */
- [0x741c, 0x741c], /* CJK Ideograph */
- [0x741d, 0x741d], /* CJK Ideograph */
- [0x741e, 0x741e], /* CJK Ideograph */
- [0x741f, 0x741f], /* CJK Ideograph */
- [0x7420, 0x7420], /* CJK Ideograph */
- [0x7421, 0x7421], /* CJK Ideograph */
- [0x7422, 0x7422], /* CJK Ideograph */
- [0x7423, 0x7423], /* CJK Ideograph */
- [0x7424, 0x7424], /* CJK Ideograph */
- [0x7425, 0x7425], /* CJK Ideograph */
- [0x7426, 0x7426], /* CJK Ideograph */
- [0x7427, 0x7427], /* CJK Ideograph */
- [0x7428, 0x7428], /* CJK Ideograph */
- [0x7429, 0x7429], /* CJK Ideograph */
- [0x742a, 0x742a], /* CJK Ideograph */
- [0x742b, 0x742b], /* CJK Ideograph */
- [0x742c, 0x742c], /* CJK Ideograph */
- [0x742d, 0x742d], /* CJK Ideograph */
- [0x742e, 0x742e], /* CJK Ideograph */
- [0x742f, 0x742f], /* CJK Ideograph */
- [0x7430, 0x7430], /* CJK Ideograph */
- [0x7431, 0x7431], /* CJK Ideograph */
- [0x7432, 0x7432], /* CJK Ideograph */
- [0x7433, 0x7433], /* CJK Ideograph */
- [0x7434, 0x7434], /* CJK Ideograph */
- [0x7435, 0x7435], /* CJK Ideograph */
- [0x7436, 0x7436], /* CJK Ideograph */
- [0x7437, 0x7437], /* CJK Ideograph */
- [0x7438, 0x7438], /* CJK Ideograph */
- [0x7439, 0x7439], /* CJK Ideograph */
- [0x743a, 0x743a], /* CJK Ideograph */
- [0x743b, 0x743b], /* CJK Ideograph */
- [0x743c, 0x743c], /* CJK Ideograph */
- [0x743d, 0x743d], /* CJK Ideograph */
- [0x743e, 0x743e], /* CJK Ideograph */
- [0x743f, 0x743f], /* CJK Ideograph */
- [0x7440, 0x7440], /* CJK Ideograph */
- [0x7441, 0x7441], /* CJK Ideograph */
- [0x7442, 0x7442], /* CJK Ideograph */
- [0x7443, 0x7443], /* CJK Ideograph */
- [0x7444, 0x7444], /* CJK Ideograph */
- [0x7445, 0x7445], /* CJK Ideograph */
- [0x7446, 0x7446], /* CJK Ideograph */
- [0x7447, 0x7447], /* CJK Ideograph */
- [0x7448, 0x7448], /* CJK Ideograph */
- [0x7449, 0x7449], /* CJK Ideograph */
- [0x744a, 0x744a], /* CJK Ideograph */
- [0x744b, 0x744b], /* CJK Ideograph */
- [0x744c, 0x744c], /* CJK Ideograph */
- [0x744d, 0x744d], /* CJK Ideograph */
- [0x744e, 0x744e], /* CJK Ideograph */
- [0x744f, 0x744f], /* CJK Ideograph */
- [0x7450, 0x7450], /* CJK Ideograph */
- [0x7451, 0x7451], /* CJK Ideograph */
- [0x7452, 0x7452], /* CJK Ideograph */
- [0x7453, 0x7453], /* CJK Ideograph */
- [0x7454, 0x7454], /* CJK Ideograph */
- [0x7455, 0x7455], /* CJK Ideograph */
- [0x7456, 0x7456], /* CJK Ideograph */
- [0x7457, 0x7457], /* CJK Ideograph */
- [0x7458, 0x7458], /* CJK Ideograph */
- [0x7459, 0x7459], /* CJK Ideograph */
- [0x745a, 0x745a], /* CJK Ideograph */
- [0x745b, 0x745b], /* CJK Ideograph */
- [0x745c, 0x745c], /* CJK Ideograph */
- [0x745d, 0x745d], /* CJK Ideograph */
- [0x745e, 0x745e], /* CJK Ideograph */
- [0x745f, 0x745f], /* CJK Ideograph */
- [0x7460, 0x7460], /* CJK Ideograph */
- [0x7461, 0x7461], /* CJK Ideograph */
- [0x7462, 0x7462], /* CJK Ideograph */
- [0x7463, 0x7463], /* CJK Ideograph */
- [0x7464, 0x7464], /* CJK Ideograph */
- [0x7465, 0x7465], /* CJK Ideograph */
- [0x7466, 0x7466], /* CJK Ideograph */
- [0x7467, 0x7467], /* CJK Ideograph */
- [0x7468, 0x7468], /* CJK Ideograph */
- [0x7469, 0x7469], /* CJK Ideograph */
- [0x746a, 0x746a], /* CJK Ideograph */
- [0x746b, 0x746b], /* CJK Ideograph */
- [0x746c, 0x746c], /* CJK Ideograph */
- [0x746d, 0x746d], /* CJK Ideograph */
- [0x746e, 0x746e], /* CJK Ideograph */
- [0x746f, 0x746f], /* CJK Ideograph */
- [0x7470, 0x7470], /* CJK Ideograph */
- [0x7471, 0x7471], /* CJK Ideograph */
- [0x7472, 0x7472], /* CJK Ideograph */
- [0x7473, 0x7473], /* CJK Ideograph */
- [0x7474, 0x7474], /* CJK Ideograph */
- [0x7475, 0x7475], /* CJK Ideograph */
- [0x7476, 0x7476], /* CJK Ideograph */
- [0x7477, 0x7477], /* CJK Ideograph */
- [0x7478, 0x7478], /* CJK Ideograph */
- [0x7479, 0x7479], /* CJK Ideograph */
- [0x747a, 0x747a], /* CJK Ideograph */
- [0x747b, 0x747b], /* CJK Ideograph */
- [0x747c, 0x747c], /* CJK Ideograph */
- [0x747d, 0x747d], /* CJK Ideograph */
- [0x747e, 0x747e], /* CJK Ideograph */
- [0x747f, 0x747f], /* CJK Ideograph */
- [0x7480, 0x7480], /* CJK Ideograph */
- [0x7481, 0x7481], /* CJK Ideograph */
- [0x7482, 0x7482], /* CJK Ideograph */
- [0x7483, 0x7483], /* CJK Ideograph */
- [0x7484, 0x7484], /* CJK Ideograph */
- [0x7485, 0x7485], /* CJK Ideograph */
- [0x7486, 0x7486], /* CJK Ideograph */
- [0x7487, 0x7487], /* CJK Ideograph */
- [0x7488, 0x7488], /* CJK Ideograph */
- [0x7489, 0x7489], /* CJK Ideograph */
- [0x748a, 0x748a], /* CJK Ideograph */
- [0x748b, 0x748b], /* CJK Ideograph */
- [0x748c, 0x748c], /* CJK Ideograph */
- [0x748d, 0x748d], /* CJK Ideograph */
- [0x748e, 0x748e], /* CJK Ideograph */
- [0x748f, 0x748f], /* CJK Ideograph */
- [0x7490, 0x7490], /* CJK Ideograph */
- [0x7491, 0x7491], /* CJK Ideograph */
- [0x7492, 0x7492], /* CJK Ideograph */
- [0x7493, 0x7493], /* CJK Ideograph */
- [0x7494, 0x7494], /* CJK Ideograph */
- [0x7495, 0x7495], /* CJK Ideograph */
- [0x7496, 0x7496], /* CJK Ideograph */
- [0x7497, 0x7497], /* CJK Ideograph */
- [0x7498, 0x7498], /* CJK Ideograph */
- [0x7499, 0x7499], /* CJK Ideograph */
- [0x749a, 0x749a], /* CJK Ideograph */
- [0x749b, 0x749b], /* CJK Ideograph */
- [0x749c, 0x749c], /* CJK Ideograph */
- [0x749d, 0x749d], /* CJK Ideograph */
- [0x749e, 0x749e], /* CJK Ideograph */
- [0x749f, 0x749f], /* CJK Ideograph */
- [0x74a0, 0x74a0], /* CJK Ideograph */
- [0x74a1, 0x74a1], /* CJK Ideograph */
- [0x74a2, 0x74a2], /* CJK Ideograph */
- [0x74a3, 0x74a3], /* CJK Ideograph */
- [0x74a4, 0x74a4], /* CJK Ideograph */
- [0x74a5, 0x74a5], /* CJK Ideograph */
- [0x74a6, 0x74a6], /* CJK Ideograph */
- [0x74a7, 0x74a7], /* CJK Ideograph */
- [0x74a8, 0x74a8], /* CJK Ideograph */
- [0x74a9, 0x74a9], /* CJK Ideograph */
- [0x74aa, 0x74aa], /* CJK Ideograph */
- [0x74ab, 0x74ab], /* CJK Ideograph */
- [0x74ac, 0x74ac], /* CJK Ideograph */
- [0x74ad, 0x74ad], /* CJK Ideograph */
- [0x74ae, 0x74ae], /* CJK Ideograph */
- [0x74af, 0x74af], /* CJK Ideograph */
- [0x74b0, 0x74b0], /* CJK Ideograph */
- [0x74b1, 0x74b1], /* CJK Ideograph */
- [0x74b2, 0x74b2], /* CJK Ideograph */
- [0x74b3, 0x74b3], /* CJK Ideograph */
- [0x74b4, 0x74b4], /* CJK Ideograph */
- [0x74b5, 0x74b5], /* CJK Ideograph */
- [0x74b6, 0x74b6], /* CJK Ideograph */
- [0x74b7, 0x74b7], /* CJK Ideograph */
- [0x74b8, 0x74b8], /* CJK Ideograph */
- [0x74b9, 0x74b9], /* CJK Ideograph */
- [0x74ba, 0x74ba], /* CJK Ideograph */
- [0x74bb, 0x74bb], /* CJK Ideograph */
- [0x74bc, 0x74bc], /* CJK Ideograph */
- [0x74bd, 0x74bd], /* CJK Ideograph */
- [0x74be, 0x74be], /* CJK Ideograph */
- [0x74bf, 0x74bf], /* CJK Ideograph */
- [0x74c0, 0x74c0], /* CJK Ideograph */
- [0x74c1, 0x74c1], /* CJK Ideograph */
- [0x74c2, 0x74c2], /* CJK Ideograph */
- [0x74c3, 0x74c3], /* CJK Ideograph */
- [0x74c4, 0x74c4], /* CJK Ideograph */
- [0x74c5, 0x74c5], /* CJK Ideograph */
- [0x74c6, 0x74c6], /* CJK Ideograph */
- [0x74c7, 0x74c7], /* CJK Ideograph */
- [0x74c8, 0x74c8], /* CJK Ideograph */
- [0x74c9, 0x74c9], /* CJK Ideograph */
- [0x74ca, 0x74ca], /* CJK Ideograph */
- [0x74cb, 0x74cb], /* CJK Ideograph */
- [0x74cc, 0x74cc], /* CJK Ideograph */
- [0x74cd, 0x74cd], /* CJK Ideograph */
- [0x74ce, 0x74ce], /* CJK Ideograph */
- [0x74cf, 0x74cf], /* CJK Ideograph */
- [0x74d0, 0x74d0], /* CJK Ideograph */
- [0x74d1, 0x74d1], /* CJK Ideograph */
- [0x74d2, 0x74d2], /* CJK Ideograph */
- [0x74d3, 0x74d3], /* CJK Ideograph */
- [0x74d4, 0x74d4], /* CJK Ideograph */
- [0x74d5, 0x74d5], /* CJK Ideograph */
- [0x74d6, 0x74d6], /* CJK Ideograph */
- [0x74d7, 0x74d7], /* CJK Ideograph */
- [0x74d8, 0x74d8], /* CJK Ideograph */
- [0x74d9, 0x74d9], /* CJK Ideograph */
- [0x74da, 0x74da], /* CJK Ideograph */
- [0x74db, 0x74db], /* CJK Ideograph */
- [0x74dc, 0x74dc], /* CJK Ideograph */
- [0x74dd, 0x74dd], /* CJK Ideograph */
- [0x74de, 0x74de], /* CJK Ideograph */
- [0x74df, 0x74df], /* CJK Ideograph */
- [0x74e0, 0x74e0], /* CJK Ideograph */
- [0x74e1, 0x74e1], /* CJK Ideograph */
- [0x74e2, 0x74e2], /* CJK Ideograph */
- [0x74e3, 0x74e3], /* CJK Ideograph */
- [0x74e4, 0x74e4], /* CJK Ideograph */
- [0x74e5, 0x74e5], /* CJK Ideograph */
- [0x74e6, 0x74e6], /* CJK Ideograph */
- [0x74e7, 0x74e7], /* CJK Ideograph */
- [0x74e8, 0x74e8], /* CJK Ideograph */
- [0x74e9, 0x74e9], /* CJK Ideograph */
- [0x74ea, 0x74ea], /* CJK Ideograph */
- [0x74eb, 0x74eb], /* CJK Ideograph */
- [0x74ec, 0x74ec], /* CJK Ideograph */
- [0x74ed, 0x74ed], /* CJK Ideograph */
- [0x74ee, 0x74ee], /* CJK Ideograph */
- [0x74ef, 0x74ef], /* CJK Ideograph */
- [0x74f0, 0x74f0], /* CJK Ideograph */
- [0x74f1, 0x74f1], /* CJK Ideograph */
- [0x74f2, 0x74f2], /* CJK Ideograph */
- [0x74f3, 0x74f3], /* CJK Ideograph */
- [0x74f4, 0x74f4], /* CJK Ideograph */
- [0x74f5, 0x74f5], /* CJK Ideograph */
- [0x74f6, 0x74f6], /* CJK Ideograph */
- [0x74f7, 0x74f7], /* CJK Ideograph */
- [0x74f8, 0x74f8], /* CJK Ideograph */
- [0x74f9, 0x74f9], /* CJK Ideograph */
- [0x74fa, 0x74fa], /* CJK Ideograph */
- [0x74fb, 0x74fb], /* CJK Ideograph */
- [0x74fc, 0x74fc], /* CJK Ideograph */
- [0x74fd, 0x74fd], /* CJK Ideograph */
- [0x74fe, 0x74fe], /* CJK Ideograph */
- [0x74ff, 0x74ff], /* CJK Ideograph */
- [0x7500, 0x7500], /* CJK Ideograph */
- [0x7501, 0x7501], /* CJK Ideograph */
- [0x7502, 0x7502], /* CJK Ideograph */
- [0x7503, 0x7503], /* CJK Ideograph */
- [0x7504, 0x7504], /* CJK Ideograph */
- [0x7505, 0x7505], /* CJK Ideograph */
- [0x7506, 0x7506], /* CJK Ideograph */
- [0x7507, 0x7507], /* CJK Ideograph */
- [0x7508, 0x7508], /* CJK Ideograph */
- [0x7509, 0x7509], /* CJK Ideograph */
- [0x750a, 0x750a], /* CJK Ideograph */
- [0x750b, 0x750b], /* CJK Ideograph */
- [0x750c, 0x750c], /* CJK Ideograph */
- [0x750d, 0x750d], /* CJK Ideograph */
- [0x750e, 0x750e], /* CJK Ideograph */
- [0x750f, 0x750f], /* CJK Ideograph */
- [0x7510, 0x7510], /* CJK Ideograph */
- [0x7511, 0x7511], /* CJK Ideograph */
- [0x7512, 0x7512], /* CJK Ideograph */
- [0x7513, 0x7513], /* CJK Ideograph */
- [0x7514, 0x7514], /* CJK Ideograph */
- [0x7515, 0x7515], /* CJK Ideograph */
- [0x7516, 0x7516], /* CJK Ideograph */
- [0x7517, 0x7517], /* CJK Ideograph */
- [0x7518, 0x7518], /* CJK Ideograph */
- [0x7519, 0x7519], /* CJK Ideograph */
- [0x751a, 0x751a], /* CJK Ideograph */
- [0x751b, 0x751b], /* CJK Ideograph */
- [0x751c, 0x751c], /* CJK Ideograph */
- [0x751d, 0x751d], /* CJK Ideograph */
- [0x751e, 0x751e], /* CJK Ideograph */
- [0x751f, 0x751f], /* CJK Ideograph */
- [0x7520, 0x7520], /* CJK Ideograph */
- [0x7521, 0x7521], /* CJK Ideograph */
- [0x7522, 0x7522], /* CJK Ideograph */
- [0x7523, 0x7523], /* CJK Ideograph */
- [0x7524, 0x7524], /* CJK Ideograph */
- [0x7525, 0x7525], /* CJK Ideograph */
- [0x7526, 0x7526], /* CJK Ideograph */
- [0x7527, 0x7527], /* CJK Ideograph */
- [0x7528, 0x7528], /* CJK Ideograph */
- [0x7529, 0x7529], /* CJK Ideograph */
- [0x752a, 0x752a], /* CJK Ideograph */
- [0x752b, 0x752b], /* CJK Ideograph */
- [0x752c, 0x752c], /* CJK Ideograph */
- [0x752d, 0x752d], /* CJK Ideograph */
- [0x752e, 0x752e], /* CJK Ideograph */
- [0x752f, 0x752f], /* CJK Ideograph */
- [0x7530, 0x7530], /* CJK Ideograph */
- [0x7531, 0x7531], /* CJK Ideograph */
- [0x7532, 0x7532], /* CJK Ideograph */
- [0x7533, 0x7533], /* CJK Ideograph */
- [0x7534, 0x7534], /* CJK Ideograph */
- [0x7535, 0x7535], /* CJK Ideograph */
- [0x7536, 0x7536], /* CJK Ideograph */
- [0x7537, 0x7537], /* CJK Ideograph */
- [0x7538, 0x7538], /* CJK Ideograph */
- [0x7539, 0x7539], /* CJK Ideograph */
- [0x753a, 0x753a], /* CJK Ideograph */
- [0x753b, 0x753b], /* CJK Ideograph */
- [0x753c, 0x753c], /* CJK Ideograph */
- [0x753d, 0x753d], /* CJK Ideograph */
- [0x753e, 0x753e], /* CJK Ideograph */
- [0x753f, 0x753f], /* CJK Ideograph */
- [0x7540, 0x7540], /* CJK Ideograph */
- [0x7541, 0x7541], /* CJK Ideograph */
- [0x7542, 0x7542], /* CJK Ideograph */
- [0x7543, 0x7543], /* CJK Ideograph */
- [0x7544, 0x7544], /* CJK Ideograph */
- [0x7545, 0x7545], /* CJK Ideograph */
- [0x7546, 0x7546], /* CJK Ideograph */
- [0x7547, 0x7547], /* CJK Ideograph */
- [0x7548, 0x7548], /* CJK Ideograph */
- [0x7549, 0x7549], /* CJK Ideograph */
- [0x754a, 0x754a], /* CJK Ideograph */
- [0x754b, 0x754b], /* CJK Ideograph */
- [0x754c, 0x754c], /* CJK Ideograph */
- [0x754d, 0x754d], /* CJK Ideograph */
- [0x754e, 0x754e], /* CJK Ideograph */
- [0x754f, 0x754f], /* CJK Ideograph */
- [0x7550, 0x7550], /* CJK Ideograph */
- [0x7551, 0x7551], /* CJK Ideograph */
- [0x7552, 0x7552], /* CJK Ideograph */
- [0x7553, 0x7553], /* CJK Ideograph */
- [0x7554, 0x7554], /* CJK Ideograph */
- [0x7555, 0x7555], /* CJK Ideograph */
- [0x7556, 0x7556], /* CJK Ideograph */
- [0x7557, 0x7557], /* CJK Ideograph */
- [0x7558, 0x7558], /* CJK Ideograph */
- [0x7559, 0x7559], /* CJK Ideograph */
- [0x755a, 0x755a], /* CJK Ideograph */
- [0x755b, 0x755b], /* CJK Ideograph */
- [0x755c, 0x755c], /* CJK Ideograph */
- [0x755d, 0x755d], /* CJK Ideograph */
- [0x755e, 0x755e], /* CJK Ideograph */
- [0x755f, 0x755f], /* CJK Ideograph */
- [0x7560, 0x7560], /* CJK Ideograph */
- [0x7561, 0x7561], /* CJK Ideograph */
- [0x7562, 0x7562], /* CJK Ideograph */
- [0x7563, 0x7563], /* CJK Ideograph */
- [0x7564, 0x7564], /* CJK Ideograph */
- [0x7565, 0x7565], /* CJK Ideograph */
- [0x7566, 0x7566], /* CJK Ideograph */
- [0x7567, 0x7567], /* CJK Ideograph */
- [0x7568, 0x7568], /* CJK Ideograph */
- [0x7569, 0x7569], /* CJK Ideograph */
- [0x756a, 0x756a], /* CJK Ideograph */
- [0x756b, 0x756b], /* CJK Ideograph */
- [0x756c, 0x756c], /* CJK Ideograph */
- [0x756d, 0x756d], /* CJK Ideograph */
- [0x756e, 0x756e], /* CJK Ideograph */
- [0x756f, 0x756f], /* CJK Ideograph */
- [0x7570, 0x7570], /* CJK Ideograph */
- [0x7571, 0x7571], /* CJK Ideograph */
- [0x7572, 0x7572], /* CJK Ideograph */
- [0x7573, 0x7573], /* CJK Ideograph */
- [0x7574, 0x7574], /* CJK Ideograph */
- [0x7575, 0x7575], /* CJK Ideograph */
- [0x7576, 0x7576], /* CJK Ideograph */
- [0x7577, 0x7577], /* CJK Ideograph */
- [0x7578, 0x7578], /* CJK Ideograph */
- [0x7579, 0x7579], /* CJK Ideograph */
- [0x757a, 0x757a], /* CJK Ideograph */
- [0x757b, 0x757b], /* CJK Ideograph */
- [0x757c, 0x757c], /* CJK Ideograph */
- [0x757d, 0x757d], /* CJK Ideograph */
- [0x757e, 0x757e], /* CJK Ideograph */
- [0x757f, 0x757f], /* CJK Ideograph */
- [0x7580, 0x7580], /* CJK Ideograph */
- [0x7581, 0x7581], /* CJK Ideograph */
- [0x7582, 0x7582], /* CJK Ideograph */
- [0x7583, 0x7583], /* CJK Ideograph */
- [0x7584, 0x7584], /* CJK Ideograph */
- [0x7585, 0x7585], /* CJK Ideograph */
- [0x7586, 0x7586], /* CJK Ideograph */
- [0x7587, 0x7587], /* CJK Ideograph */
- [0x7588, 0x7588], /* CJK Ideograph */
- [0x7589, 0x7589], /* CJK Ideograph */
- [0x758a, 0x758a], /* CJK Ideograph */
- [0x758b, 0x758b], /* CJK Ideograph */
- [0x758c, 0x758c], /* CJK Ideograph */
- [0x758d, 0x758d], /* CJK Ideograph */
- [0x758e, 0x758e], /* CJK Ideograph */
- [0x758f, 0x758f], /* CJK Ideograph */
- [0x7590, 0x7590], /* CJK Ideograph */
- [0x7591, 0x7591], /* CJK Ideograph */
- [0x7592, 0x7592], /* CJK Ideograph */
- [0x7593, 0x7593], /* CJK Ideograph */
- [0x7594, 0x7594], /* CJK Ideograph */
- [0x7595, 0x7595], /* CJK Ideograph */
- [0x7596, 0x7596], /* CJK Ideograph */
- [0x7597, 0x7597], /* CJK Ideograph */
- [0x7598, 0x7598], /* CJK Ideograph */
- [0x7599, 0x7599], /* CJK Ideograph */
- [0x759a, 0x759a], /* CJK Ideograph */
- [0x759b, 0x759b], /* CJK Ideograph */
- [0x759c, 0x759c], /* CJK Ideograph */
- [0x759d, 0x759d], /* CJK Ideograph */
- [0x759e, 0x759e], /* CJK Ideograph */
- [0x759f, 0x759f], /* CJK Ideograph */
- [0x75a0, 0x75a0], /* CJK Ideograph */
- [0x75a1, 0x75a1], /* CJK Ideograph */
- [0x75a2, 0x75a2], /* CJK Ideograph */
- [0x75a3, 0x75a3], /* CJK Ideograph */
- [0x75a4, 0x75a4], /* CJK Ideograph */
- [0x75a5, 0x75a5], /* CJK Ideograph */
- [0x75a6, 0x75a6], /* CJK Ideograph */
- [0x75a7, 0x75a7], /* CJK Ideograph */
- [0x75a8, 0x75a8], /* CJK Ideograph */
- [0x75a9, 0x75a9], /* CJK Ideograph */
- [0x75aa, 0x75aa], /* CJK Ideograph */
- [0x75ab, 0x75ab], /* CJK Ideograph */
- [0x75ac, 0x75ac], /* CJK Ideograph */
- [0x75ad, 0x75ad], /* CJK Ideograph */
- [0x75ae, 0x75ae], /* CJK Ideograph */
- [0x75af, 0x75af], /* CJK Ideograph */
- [0x75b0, 0x75b0], /* CJK Ideograph */
- [0x75b1, 0x75b1], /* CJK Ideograph */
- [0x75b2, 0x75b2], /* CJK Ideograph */
- [0x75b3, 0x75b3], /* CJK Ideograph */
- [0x75b4, 0x75b4], /* CJK Ideograph */
- [0x75b5, 0x75b5], /* CJK Ideograph */
- [0x75b6, 0x75b6], /* CJK Ideograph */
- [0x75b7, 0x75b7], /* CJK Ideograph */
- [0x75b8, 0x75b8], /* CJK Ideograph */
- [0x75b9, 0x75b9], /* CJK Ideograph */
- [0x75ba, 0x75ba], /* CJK Ideograph */
- [0x75bb, 0x75bb], /* CJK Ideograph */
- [0x75bc, 0x75bc], /* CJK Ideograph */
- [0x75bd, 0x75bd], /* CJK Ideograph */
- [0x75be, 0x75be], /* CJK Ideograph */
- [0x75bf, 0x75bf], /* CJK Ideograph */
- [0x75c0, 0x75c0], /* CJK Ideograph */
- [0x75c1, 0x75c1], /* CJK Ideograph */
- [0x75c2, 0x75c2], /* CJK Ideograph */
- [0x75c3, 0x75c3], /* CJK Ideograph */
- [0x75c4, 0x75c4], /* CJK Ideograph */
- [0x75c5, 0x75c5], /* CJK Ideograph */
- [0x75c6, 0x75c6], /* CJK Ideograph */
- [0x75c7, 0x75c7], /* CJK Ideograph */
- [0x75c8, 0x75c8], /* CJK Ideograph */
- [0x75c9, 0x75c9], /* CJK Ideograph */
- [0x75ca, 0x75ca], /* CJK Ideograph */
- [0x75cb, 0x75cb], /* CJK Ideograph */
- [0x75cc, 0x75cc], /* CJK Ideograph */
- [0x75cd, 0x75cd], /* CJK Ideograph */
- [0x75ce, 0x75ce], /* CJK Ideograph */
- [0x75cf, 0x75cf], /* CJK Ideograph */
- [0x75d0, 0x75d0], /* CJK Ideograph */
- [0x75d1, 0x75d1], /* CJK Ideograph */
- [0x75d2, 0x75d2], /* CJK Ideograph */
- [0x75d3, 0x75d3], /* CJK Ideograph */
- [0x75d4, 0x75d4], /* CJK Ideograph */
- [0x75d5, 0x75d5], /* CJK Ideograph */
- [0x75d6, 0x75d6], /* CJK Ideograph */
- [0x75d7, 0x75d7], /* CJK Ideograph */
- [0x75d8, 0x75d8], /* CJK Ideograph */
- [0x75d9, 0x75d9], /* CJK Ideograph */
- [0x75da, 0x75da], /* CJK Ideograph */
- [0x75db, 0x75db], /* CJK Ideograph */
- [0x75dc, 0x75dc], /* CJK Ideograph */
- [0x75dd, 0x75dd], /* CJK Ideograph */
- [0x75de, 0x75de], /* CJK Ideograph */
- [0x75df, 0x75df], /* CJK Ideograph */
- [0x75e0, 0x75e0], /* CJK Ideograph */
- [0x75e1, 0x75e1], /* CJK Ideograph */
- [0x75e2, 0x75e2], /* CJK Ideograph */
- [0x75e3, 0x75e3], /* CJK Ideograph */
- [0x75e4, 0x75e4], /* CJK Ideograph */
- [0x75e5, 0x75e5], /* CJK Ideograph */
- [0x75e6, 0x75e6], /* CJK Ideograph */
- [0x75e7, 0x75e7], /* CJK Ideograph */
- [0x75e8, 0x75e8], /* CJK Ideograph */
- [0x75e9, 0x75e9], /* CJK Ideograph */
- [0x75ea, 0x75ea], /* CJK Ideograph */
- [0x75eb, 0x75eb], /* CJK Ideograph */
- [0x75ec, 0x75ec], /* CJK Ideograph */
- [0x75ed, 0x75ed], /* CJK Ideograph */
- [0x75ee, 0x75ee], /* CJK Ideograph */
- [0x75ef, 0x75ef], /* CJK Ideograph */
- [0x75f0, 0x75f0], /* CJK Ideograph */
- [0x75f1, 0x75f1], /* CJK Ideograph */
- [0x75f2, 0x75f2], /* CJK Ideograph */
- [0x75f3, 0x75f3], /* CJK Ideograph */
- [0x75f4, 0x75f4], /* CJK Ideograph */
- [0x75f5, 0x75f5], /* CJK Ideograph */
- [0x75f6, 0x75f6], /* CJK Ideograph */
- [0x75f7, 0x75f7], /* CJK Ideograph */
- [0x75f8, 0x75f8], /* CJK Ideograph */
- [0x75f9, 0x75f9], /* CJK Ideograph */
- [0x75fa, 0x75fa], /* CJK Ideograph */
- [0x75fb, 0x75fb], /* CJK Ideograph */
- [0x75fc, 0x75fc], /* CJK Ideograph */
- [0x75fd, 0x75fd], /* CJK Ideograph */
- [0x75fe, 0x75fe], /* CJK Ideograph */
- [0x75ff, 0x75ff], /* CJK Ideograph */
- [0x7600, 0x7600], /* CJK Ideograph */
- [0x7601, 0x7601], /* CJK Ideograph */
- [0x7602, 0x7602], /* CJK Ideograph */
- [0x7603, 0x7603], /* CJK Ideograph */
- [0x7604, 0x7604], /* CJK Ideograph */
- [0x7605, 0x7605], /* CJK Ideograph */
- [0x7606, 0x7606], /* CJK Ideograph */
- [0x7607, 0x7607], /* CJK Ideograph */
- [0x7608, 0x7608], /* CJK Ideograph */
- [0x7609, 0x7609], /* CJK Ideograph */
- [0x760a, 0x760a], /* CJK Ideograph */
- [0x760b, 0x760b], /* CJK Ideograph */
- [0x760c, 0x760c], /* CJK Ideograph */
- [0x760d, 0x760d], /* CJK Ideograph */
- [0x760e, 0x760e], /* CJK Ideograph */
- [0x760f, 0x760f], /* CJK Ideograph */
- [0x7610, 0x7610], /* CJK Ideograph */
- [0x7611, 0x7611], /* CJK Ideograph */
- [0x7612, 0x7612], /* CJK Ideograph */
- [0x7613, 0x7613], /* CJK Ideograph */
- [0x7614, 0x7614], /* CJK Ideograph */
- [0x7615, 0x7615], /* CJK Ideograph */
- [0x7616, 0x7616], /* CJK Ideograph */
- [0x7617, 0x7617], /* CJK Ideograph */
- [0x7618, 0x7618], /* CJK Ideograph */
- [0x7619, 0x7619], /* CJK Ideograph */
- [0x761a, 0x761a], /* CJK Ideograph */
- [0x761b, 0x761b], /* CJK Ideograph */
- [0x761c, 0x761c], /* CJK Ideograph */
- [0x761d, 0x761d], /* CJK Ideograph */
- [0x761e, 0x761e], /* CJK Ideograph */
- [0x761f, 0x761f], /* CJK Ideograph */
- [0x7620, 0x7620], /* CJK Ideograph */
- [0x7621, 0x7621], /* CJK Ideograph */
- [0x7622, 0x7622], /* CJK Ideograph */
- [0x7623, 0x7623], /* CJK Ideograph */
- [0x7624, 0x7624], /* CJK Ideograph */
- [0x7625, 0x7625], /* CJK Ideograph */
- [0x7626, 0x7626], /* CJK Ideograph */
- [0x7627, 0x7627], /* CJK Ideograph */
- [0x7628, 0x7628], /* CJK Ideograph */
- [0x7629, 0x7629], /* CJK Ideograph */
- [0x762a, 0x762a], /* CJK Ideograph */
- [0x762b, 0x762b], /* CJK Ideograph */
- [0x762c, 0x762c], /* CJK Ideograph */
- [0x762d, 0x762d], /* CJK Ideograph */
- [0x762e, 0x762e], /* CJK Ideograph */
- [0x762f, 0x762f], /* CJK Ideograph */
- [0x7630, 0x7630], /* CJK Ideograph */
- [0x7631, 0x7631], /* CJK Ideograph */
- [0x7632, 0x7632], /* CJK Ideograph */
- [0x7633, 0x7633], /* CJK Ideograph */
- [0x7634, 0x7634], /* CJK Ideograph */
- [0x7635, 0x7635], /* CJK Ideograph */
- [0x7636, 0x7636], /* CJK Ideograph */
- [0x7637, 0x7637], /* CJK Ideograph */
- [0x7638, 0x7638], /* CJK Ideograph */
- [0x7639, 0x7639], /* CJK Ideograph */
- [0x763a, 0x763a], /* CJK Ideograph */
- [0x763b, 0x763b], /* CJK Ideograph */
- [0x763c, 0x763c], /* CJK Ideograph */
- [0x763d, 0x763d], /* CJK Ideograph */
- [0x763e, 0x763e], /* CJK Ideograph */
- [0x763f, 0x763f], /* CJK Ideograph */
- [0x7640, 0x7640], /* CJK Ideograph */
- [0x7641, 0x7641], /* CJK Ideograph */
- [0x7642, 0x7642], /* CJK Ideograph */
- [0x7643, 0x7643], /* CJK Ideograph */
- [0x7644, 0x7644], /* CJK Ideograph */
- [0x7645, 0x7645], /* CJK Ideograph */
- [0x7646, 0x7646], /* CJK Ideograph */
- [0x7647, 0x7647], /* CJK Ideograph */
- [0x7648, 0x7648], /* CJK Ideograph */
- [0x7649, 0x7649], /* CJK Ideograph */
- [0x764a, 0x764a], /* CJK Ideograph */
- [0x764b, 0x764b], /* CJK Ideograph */
- [0x764c, 0x764c], /* CJK Ideograph */
- [0x764d, 0x764d], /* CJK Ideograph */
- [0x764e, 0x764e], /* CJK Ideograph */
- [0x764f, 0x764f], /* CJK Ideograph */
- [0x7650, 0x7650], /* CJK Ideograph */
- [0x7651, 0x7651], /* CJK Ideograph */
- [0x7652, 0x7652], /* CJK Ideograph */
- [0x7653, 0x7653], /* CJK Ideograph */
- [0x7654, 0x7654], /* CJK Ideograph */
- [0x7655, 0x7655], /* CJK Ideograph */
- [0x7656, 0x7656], /* CJK Ideograph */
- [0x7657, 0x7657], /* CJK Ideograph */
- [0x7658, 0x7658], /* CJK Ideograph */
- [0x7659, 0x7659], /* CJK Ideograph */
- [0x765a, 0x765a], /* CJK Ideograph */
- [0x765b, 0x765b], /* CJK Ideograph */
- [0x765c, 0x765c], /* CJK Ideograph */
- [0x765d, 0x765d], /* CJK Ideograph */
- [0x765e, 0x765e], /* CJK Ideograph */
- [0x765f, 0x765f], /* CJK Ideograph */
- [0x7660, 0x7660], /* CJK Ideograph */
- [0x7661, 0x7661], /* CJK Ideograph */
- [0x7662, 0x7662], /* CJK Ideograph */
- [0x7663, 0x7663], /* CJK Ideograph */
- [0x7664, 0x7664], /* CJK Ideograph */
- [0x7665, 0x7665], /* CJK Ideograph */
- [0x7666, 0x7666], /* CJK Ideograph */
- [0x7667, 0x7667], /* CJK Ideograph */
- [0x7668, 0x7668], /* CJK Ideograph */
- [0x7669, 0x7669], /* CJK Ideograph */
- [0x766a, 0x766a], /* CJK Ideograph */
- [0x766b, 0x766b], /* CJK Ideograph */
- [0x766c, 0x766c], /* CJK Ideograph */
- [0x766d, 0x766d], /* CJK Ideograph */
- [0x766e, 0x766e], /* CJK Ideograph */
- [0x766f, 0x766f], /* CJK Ideograph */
- [0x7670, 0x7670], /* CJK Ideograph */
- [0x7671, 0x7671], /* CJK Ideograph */
- [0x7672, 0x7672], /* CJK Ideograph */
- [0x7673, 0x7673], /* CJK Ideograph */
- [0x7674, 0x7674], /* CJK Ideograph */
- [0x7675, 0x7675], /* CJK Ideograph */
- [0x7676, 0x7676], /* CJK Ideograph */
- [0x7677, 0x7677], /* CJK Ideograph */
- [0x7678, 0x7678], /* CJK Ideograph */
- [0x7679, 0x7679], /* CJK Ideograph */
- [0x767a, 0x767a], /* CJK Ideograph */
- [0x767b, 0x767b], /* CJK Ideograph */
- [0x767c, 0x767c], /* CJK Ideograph */
- [0x767d, 0x767d], /* CJK Ideograph */
- [0x767e, 0x767e], /* CJK Ideograph */
- [0x767f, 0x767f], /* CJK Ideograph */
- [0x7680, 0x7680], /* CJK Ideograph */
- [0x7681, 0x7681], /* CJK Ideograph */
- [0x7682, 0x7682], /* CJK Ideograph */
- [0x7683, 0x7683], /* CJK Ideograph */
- [0x7684, 0x7684], /* CJK Ideograph */
- [0x7685, 0x7685], /* CJK Ideograph */
- [0x7686, 0x7686], /* CJK Ideograph */
- [0x7687, 0x7687], /* CJK Ideograph */
- [0x7688, 0x7688], /* CJK Ideograph */
- [0x7689, 0x7689], /* CJK Ideograph */
- [0x768a, 0x768a], /* CJK Ideograph */
- [0x768b, 0x768b], /* CJK Ideograph */
- [0x768c, 0x768c], /* CJK Ideograph */
- [0x768d, 0x768d], /* CJK Ideograph */
- [0x768e, 0x768e], /* CJK Ideograph */
- [0x768f, 0x768f], /* CJK Ideograph */
- [0x7690, 0x7690], /* CJK Ideograph */
- [0x7691, 0x7691], /* CJK Ideograph */
- [0x7692, 0x7692], /* CJK Ideograph */
- [0x7693, 0x7693], /* CJK Ideograph */
- [0x7694, 0x7694], /* CJK Ideograph */
- [0x7695, 0x7695], /* CJK Ideograph */
- [0x7696, 0x7696], /* CJK Ideograph */
- [0x7697, 0x7697], /* CJK Ideograph */
- [0x7698, 0x7698], /* CJK Ideograph */
- [0x7699, 0x7699], /* CJK Ideograph */
- [0x769a, 0x769a], /* CJK Ideograph */
- [0x769b, 0x769b], /* CJK Ideograph */
- [0x769c, 0x769c], /* CJK Ideograph */
- [0x769d, 0x769d], /* CJK Ideograph */
- [0x769e, 0x769e], /* CJK Ideograph */
- [0x769f, 0x769f], /* CJK Ideograph */
- [0x76a0, 0x76a0], /* CJK Ideograph */
- [0x76a1, 0x76a1], /* CJK Ideograph */
- [0x76a2, 0x76a2], /* CJK Ideograph */
- [0x76a3, 0x76a3], /* CJK Ideograph */
- [0x76a4, 0x76a4], /* CJK Ideograph */
- [0x76a5, 0x76a5], /* CJK Ideograph */
- [0x76a6, 0x76a6], /* CJK Ideograph */
- [0x76a7, 0x76a7], /* CJK Ideograph */
- [0x76a8, 0x76a8], /* CJK Ideograph */
- [0x76a9, 0x76a9], /* CJK Ideograph */
- [0x76aa, 0x76aa], /* CJK Ideograph */
- [0x76ab, 0x76ab], /* CJK Ideograph */
- [0x76ac, 0x76ac], /* CJK Ideograph */
- [0x76ad, 0x76ad], /* CJK Ideograph */
- [0x76ae, 0x76ae], /* CJK Ideograph */
- [0x76af, 0x76af], /* CJK Ideograph */
- [0x76b0, 0x76b0], /* CJK Ideograph */
- [0x76b1, 0x76b1], /* CJK Ideograph */
- [0x76b2, 0x76b2], /* CJK Ideograph */
- [0x76b3, 0x76b3], /* CJK Ideograph */
- [0x76b4, 0x76b4], /* CJK Ideograph */
- [0x76b5, 0x76b5], /* CJK Ideograph */
- [0x76b6, 0x76b6], /* CJK Ideograph */
- [0x76b7, 0x76b7], /* CJK Ideograph */
- [0x76b8, 0x76b8], /* CJK Ideograph */
- [0x76b9, 0x76b9], /* CJK Ideograph */
- [0x76ba, 0x76ba], /* CJK Ideograph */
- [0x76bb, 0x76bb], /* CJK Ideograph */
- [0x76bc, 0x76bc], /* CJK Ideograph */
- [0x76bd, 0x76bd], /* CJK Ideograph */
- [0x76be, 0x76be], /* CJK Ideograph */
- [0x76bf, 0x76bf], /* CJK Ideograph */
- [0x76c0, 0x76c0], /* CJK Ideograph */
- [0x76c1, 0x76c1], /* CJK Ideograph */
- [0x76c2, 0x76c2], /* CJK Ideograph */
- [0x76c3, 0x76c3], /* CJK Ideograph */
- [0x76c4, 0x76c4], /* CJK Ideograph */
- [0x76c5, 0x76c5], /* CJK Ideograph */
- [0x76c6, 0x76c6], /* CJK Ideograph */
- [0x76c7, 0x76c7], /* CJK Ideograph */
- [0x76c8, 0x76c8], /* CJK Ideograph */
- [0x76c9, 0x76c9], /* CJK Ideograph */
- [0x76ca, 0x76ca], /* CJK Ideograph */
- [0x76cb, 0x76cb], /* CJK Ideograph */
- [0x76cc, 0x76cc], /* CJK Ideograph */
- [0x76cd, 0x76cd], /* CJK Ideograph */
- [0x76ce, 0x76ce], /* CJK Ideograph */
- [0x76cf, 0x76cf], /* CJK Ideograph */
- [0x76d0, 0x76d0], /* CJK Ideograph */
- [0x76d1, 0x76d1], /* CJK Ideograph */
- [0x76d2, 0x76d2], /* CJK Ideograph */
- [0x76d3, 0x76d3], /* CJK Ideograph */
- [0x76d4, 0x76d4], /* CJK Ideograph */
- [0x76d5, 0x76d5], /* CJK Ideograph */
- [0x76d6, 0x76d6], /* CJK Ideograph */
- [0x76d7, 0x76d7], /* CJK Ideograph */
- [0x76d8, 0x76d8], /* CJK Ideograph */
- [0x76d9, 0x76d9], /* CJK Ideograph */
- [0x76da, 0x76da], /* CJK Ideograph */
- [0x76db, 0x76db], /* CJK Ideograph */
- [0x76dc, 0x76dc], /* CJK Ideograph */
- [0x76dd, 0x76dd], /* CJK Ideograph */
- [0x76de, 0x76de], /* CJK Ideograph */
- [0x76df, 0x76df], /* CJK Ideograph */
- [0x76e0, 0x76e0], /* CJK Ideograph */
- [0x76e1, 0x76e1], /* CJK Ideograph */
- [0x76e2, 0x76e2], /* CJK Ideograph */
- [0x76e3, 0x76e3], /* CJK Ideograph */
- [0x76e4, 0x76e4], /* CJK Ideograph */
- [0x76e5, 0x76e5], /* CJK Ideograph */
- [0x76e6, 0x76e6], /* CJK Ideograph */
- [0x76e7, 0x76e7], /* CJK Ideograph */
- [0x76e8, 0x76e8], /* CJK Ideograph */
- [0x76e9, 0x76e9], /* CJK Ideograph */
- [0x76ea, 0x76ea], /* CJK Ideograph */
- [0x76eb, 0x76eb], /* CJK Ideograph */
- [0x76ec, 0x76ec], /* CJK Ideograph */
- [0x76ed, 0x76ed], /* CJK Ideograph */
- [0x76ee, 0x76ee], /* CJK Ideograph */
- [0x76ef, 0x76ef], /* CJK Ideograph */
- [0x76f0, 0x76f0], /* CJK Ideograph */
- [0x76f1, 0x76f1], /* CJK Ideograph */
- [0x76f2, 0x76f2], /* CJK Ideograph */
- [0x76f3, 0x76f3], /* CJK Ideograph */
- [0x76f4, 0x76f4], /* CJK Ideograph */
- [0x76f5, 0x76f5], /* CJK Ideograph */
- [0x76f6, 0x76f6], /* CJK Ideograph */
- [0x76f7, 0x76f7], /* CJK Ideograph */
- [0x76f8, 0x76f8], /* CJK Ideograph */
- [0x76f9, 0x76f9], /* CJK Ideograph */
- [0x76fa, 0x76fa], /* CJK Ideograph */
- [0x76fb, 0x76fb], /* CJK Ideograph */
- [0x76fc, 0x76fc], /* CJK Ideograph */
- [0x76fd, 0x76fd], /* CJK Ideograph */
- [0x76fe, 0x76fe], /* CJK Ideograph */
- [0x76ff, 0x76ff], /* CJK Ideograph */
- [0x7700, 0x7700], /* CJK Ideograph */
- [0x7701, 0x7701], /* CJK Ideograph */
- [0x7702, 0x7702], /* CJK Ideograph */
- [0x7703, 0x7703], /* CJK Ideograph */
- [0x7704, 0x7704], /* CJK Ideograph */
- [0x7705, 0x7705], /* CJK Ideograph */
- [0x7706, 0x7706], /* CJK Ideograph */
- [0x7707, 0x7707], /* CJK Ideograph */
- [0x7708, 0x7708], /* CJK Ideograph */
- [0x7709, 0x7709], /* CJK Ideograph */
- [0x770a, 0x770a], /* CJK Ideograph */
- [0x770b, 0x770b], /* CJK Ideograph */
- [0x770c, 0x770c], /* CJK Ideograph */
- [0x770d, 0x770d], /* CJK Ideograph */
- [0x770e, 0x770e], /* CJK Ideograph */
- [0x770f, 0x770f], /* CJK Ideograph */
- [0x7710, 0x7710], /* CJK Ideograph */
- [0x7711, 0x7711], /* CJK Ideograph */
- [0x7712, 0x7712], /* CJK Ideograph */
- [0x7713, 0x7713], /* CJK Ideograph */
- [0x7714, 0x7714], /* CJK Ideograph */
- [0x7715, 0x7715], /* CJK Ideograph */
- [0x7716, 0x7716], /* CJK Ideograph */
- [0x7717, 0x7717], /* CJK Ideograph */
- [0x7718, 0x7718], /* CJK Ideograph */
- [0x7719, 0x7719], /* CJK Ideograph */
- [0x771a, 0x771a], /* CJK Ideograph */
- [0x771b, 0x771b], /* CJK Ideograph */
- [0x771c, 0x771c], /* CJK Ideograph */
- [0x771d, 0x771d], /* CJK Ideograph */
- [0x771e, 0x771e], /* CJK Ideograph */
- [0x771f, 0x771f], /* CJK Ideograph */
- [0x7720, 0x7720], /* CJK Ideograph */
- [0x7721, 0x7721], /* CJK Ideograph */
- [0x7722, 0x7722], /* CJK Ideograph */
- [0x7723, 0x7723], /* CJK Ideograph */
- [0x7724, 0x7724], /* CJK Ideograph */
- [0x7725, 0x7725], /* CJK Ideograph */
- [0x7726, 0x7726], /* CJK Ideograph */
- [0x7727, 0x7727], /* CJK Ideograph */
- [0x7728, 0x7728], /* CJK Ideograph */
- [0x7729, 0x7729], /* CJK Ideograph */
- [0x772a, 0x772a], /* CJK Ideograph */
- [0x772b, 0x772b], /* CJK Ideograph */
- [0x772c, 0x772c], /* CJK Ideograph */
- [0x772d, 0x772d], /* CJK Ideograph */
- [0x772e, 0x772e], /* CJK Ideograph */
- [0x772f, 0x772f], /* CJK Ideograph */
- [0x7730, 0x7730], /* CJK Ideograph */
- [0x7731, 0x7731], /* CJK Ideograph */
- [0x7732, 0x7732], /* CJK Ideograph */
- [0x7733, 0x7733], /* CJK Ideograph */
- [0x7734, 0x7734], /* CJK Ideograph */
- [0x7735, 0x7735], /* CJK Ideograph */
- [0x7736, 0x7736], /* CJK Ideograph */
- [0x7737, 0x7737], /* CJK Ideograph */
- [0x7738, 0x7738], /* CJK Ideograph */
- [0x7739, 0x7739], /* CJK Ideograph */
- [0x773a, 0x773a], /* CJK Ideograph */
- [0x773b, 0x773b], /* CJK Ideograph */
- [0x773c, 0x773c], /* CJK Ideograph */
- [0x773d, 0x773d], /* CJK Ideograph */
- [0x773e, 0x773e], /* CJK Ideograph */
- [0x773f, 0x773f], /* CJK Ideograph */
- [0x7740, 0x7740], /* CJK Ideograph */
- [0x7741, 0x7741], /* CJK Ideograph */
- [0x7742, 0x7742], /* CJK Ideograph */
- [0x7743, 0x7743], /* CJK Ideograph */
- [0x7744, 0x7744], /* CJK Ideograph */
- [0x7745, 0x7745], /* CJK Ideograph */
- [0x7746, 0x7746], /* CJK Ideograph */
- [0x7747, 0x7747], /* CJK Ideograph */
- [0x7748, 0x7748], /* CJK Ideograph */
- [0x7749, 0x7749], /* CJK Ideograph */
- [0x774a, 0x774a], /* CJK Ideograph */
- [0x774b, 0x774b], /* CJK Ideograph */
- [0x774c, 0x774c], /* CJK Ideograph */
- [0x774d, 0x774d], /* CJK Ideograph */
- [0x774e, 0x774e], /* CJK Ideograph */
- [0x774f, 0x774f], /* CJK Ideograph */
- [0x7750, 0x7750], /* CJK Ideograph */
- [0x7751, 0x7751], /* CJK Ideograph */
- [0x7752, 0x7752], /* CJK Ideograph */
- [0x7753, 0x7753], /* CJK Ideograph */
- [0x7754, 0x7754], /* CJK Ideograph */
- [0x7755, 0x7755], /* CJK Ideograph */
- [0x7756, 0x7756], /* CJK Ideograph */
- [0x7757, 0x7757], /* CJK Ideograph */
- [0x7758, 0x7758], /* CJK Ideograph */
- [0x7759, 0x7759], /* CJK Ideograph */
- [0x775a, 0x775a], /* CJK Ideograph */
- [0x775b, 0x775b], /* CJK Ideograph */
- [0x775c, 0x775c], /* CJK Ideograph */
- [0x775d, 0x775d], /* CJK Ideograph */
- [0x775e, 0x775e], /* CJK Ideograph */
- [0x775f, 0x775f], /* CJK Ideograph */
- [0x7760, 0x7760], /* CJK Ideograph */
- [0x7761, 0x7761], /* CJK Ideograph */
- [0x7762, 0x7762], /* CJK Ideograph */
- [0x7763, 0x7763], /* CJK Ideograph */
- [0x7764, 0x7764], /* CJK Ideograph */
- [0x7765, 0x7765], /* CJK Ideograph */
- [0x7766, 0x7766], /* CJK Ideograph */
- [0x7767, 0x7767], /* CJK Ideograph */
- [0x7768, 0x7768], /* CJK Ideograph */
- [0x7769, 0x7769], /* CJK Ideograph */
- [0x776a, 0x776a], /* CJK Ideograph */
- [0x776b, 0x776b], /* CJK Ideograph */
- [0x776c, 0x776c], /* CJK Ideograph */
- [0x776d, 0x776d], /* CJK Ideograph */
- [0x776e, 0x776e], /* CJK Ideograph */
- [0x776f, 0x776f], /* CJK Ideograph */
- [0x7770, 0x7770], /* CJK Ideograph */
- [0x7771, 0x7771], /* CJK Ideograph */
- [0x7772, 0x7772], /* CJK Ideograph */
- [0x7773, 0x7773], /* CJK Ideograph */
- [0x7774, 0x7774], /* CJK Ideograph */
- [0x7775, 0x7775], /* CJK Ideograph */
- [0x7776, 0x7776], /* CJK Ideograph */
- [0x7777, 0x7777], /* CJK Ideograph */
- [0x7778, 0x7778], /* CJK Ideograph */
- [0x7779, 0x7779], /* CJK Ideograph */
- [0x777a, 0x777a], /* CJK Ideograph */
- [0x777b, 0x777b], /* CJK Ideograph */
- [0x777c, 0x777c], /* CJK Ideograph */
- [0x777d, 0x777d], /* CJK Ideograph */
- [0x777e, 0x777e], /* CJK Ideograph */
- [0x777f, 0x777f], /* CJK Ideograph */
- [0x7780, 0x7780], /* CJK Ideograph */
- [0x7781, 0x7781], /* CJK Ideograph */
- [0x7782, 0x7782], /* CJK Ideograph */
- [0x7783, 0x7783], /* CJK Ideograph */
- [0x7784, 0x7784], /* CJK Ideograph */
- [0x7785, 0x7785], /* CJK Ideograph */
- [0x7786, 0x7786], /* CJK Ideograph */
- [0x7787, 0x7787], /* CJK Ideograph */
- [0x7788, 0x7788], /* CJK Ideograph */
- [0x7789, 0x7789], /* CJK Ideograph */
- [0x778a, 0x778a], /* CJK Ideograph */
- [0x778b, 0x778b], /* CJK Ideograph */
- [0x778c, 0x778c], /* CJK Ideograph */
- [0x778d, 0x778d], /* CJK Ideograph */
- [0x778e, 0x778e], /* CJK Ideograph */
- [0x778f, 0x778f], /* CJK Ideograph */
- [0x7790, 0x7790], /* CJK Ideograph */
- [0x7791, 0x7791], /* CJK Ideograph */
- [0x7792, 0x7792], /* CJK Ideograph */
- [0x7793, 0x7793], /* CJK Ideograph */
- [0x7794, 0x7794], /* CJK Ideograph */
- [0x7795, 0x7795], /* CJK Ideograph */
- [0x7796, 0x7796], /* CJK Ideograph */
- [0x7797, 0x7797], /* CJK Ideograph */
- [0x7798, 0x7798], /* CJK Ideograph */
- [0x7799, 0x7799], /* CJK Ideograph */
- [0x779a, 0x779a], /* CJK Ideograph */
- [0x779b, 0x779b], /* CJK Ideograph */
- [0x779c, 0x779c], /* CJK Ideograph */
- [0x779d, 0x779d], /* CJK Ideograph */
- [0x779e, 0x779e], /* CJK Ideograph */
- [0x779f, 0x779f], /* CJK Ideograph */
- [0x77a0, 0x77a0], /* CJK Ideograph */
- [0x77a1, 0x77a1], /* CJK Ideograph */
- [0x77a2, 0x77a2], /* CJK Ideograph */
- [0x77a3, 0x77a3], /* CJK Ideograph */
- [0x77a4, 0x77a4], /* CJK Ideograph */
- [0x77a5, 0x77a5], /* CJK Ideograph */
- [0x77a6, 0x77a6], /* CJK Ideograph */
- [0x77a7, 0x77a7], /* CJK Ideograph */
- [0x77a8, 0x77a8], /* CJK Ideograph */
- [0x77a9, 0x77a9], /* CJK Ideograph */
- [0x77aa, 0x77aa], /* CJK Ideograph */
- [0x77ab, 0x77ab], /* CJK Ideograph */
- [0x77ac, 0x77ac], /* CJK Ideograph */
- [0x77ad, 0x77ad], /* CJK Ideograph */
- [0x77ae, 0x77ae], /* CJK Ideograph */
- [0x77af, 0x77af], /* CJK Ideograph */
- [0x77b0, 0x77b0], /* CJK Ideograph */
- [0x77b1, 0x77b1], /* CJK Ideograph */
- [0x77b2, 0x77b2], /* CJK Ideograph */
- [0x77b3, 0x77b3], /* CJK Ideograph */
- [0x77b4, 0x77b4], /* CJK Ideograph */
- [0x77b5, 0x77b5], /* CJK Ideograph */
- [0x77b6, 0x77b6], /* CJK Ideograph */
- [0x77b7, 0x77b7], /* CJK Ideograph */
- [0x77b8, 0x77b8], /* CJK Ideograph */
- [0x77b9, 0x77b9], /* CJK Ideograph */
- [0x77ba, 0x77ba], /* CJK Ideograph */
- [0x77bb, 0x77bb], /* CJK Ideograph */
- [0x77bc, 0x77bc], /* CJK Ideograph */
- [0x77bd, 0x77bd], /* CJK Ideograph */
- [0x77be, 0x77be], /* CJK Ideograph */
- [0x77bf, 0x77bf], /* CJK Ideograph */
- [0x77c0, 0x77c0], /* CJK Ideograph */
- [0x77c1, 0x77c1], /* CJK Ideograph */
- [0x77c2, 0x77c2], /* CJK Ideograph */
- [0x77c3, 0x77c3], /* CJK Ideograph */
- [0x77c4, 0x77c4], /* CJK Ideograph */
- [0x77c5, 0x77c5], /* CJK Ideograph */
- [0x77c6, 0x77c6], /* CJK Ideograph */
- [0x77c7, 0x77c7], /* CJK Ideograph */
- [0x77c8, 0x77c8], /* CJK Ideograph */
- [0x77c9, 0x77c9], /* CJK Ideograph */
- [0x77ca, 0x77ca], /* CJK Ideograph */
- [0x77cb, 0x77cb], /* CJK Ideograph */
- [0x77cc, 0x77cc], /* CJK Ideograph */
- [0x77cd, 0x77cd], /* CJK Ideograph */
- [0x77ce, 0x77ce], /* CJK Ideograph */
- [0x77cf, 0x77cf], /* CJK Ideograph */
- [0x77d0, 0x77d0], /* CJK Ideograph */
- [0x77d1, 0x77d1], /* CJK Ideograph */
- [0x77d2, 0x77d2], /* CJK Ideograph */
- [0x77d3, 0x77d3], /* CJK Ideograph */
- [0x77d4, 0x77d4], /* CJK Ideograph */
- [0x77d5, 0x77d5], /* CJK Ideograph */
- [0x77d6, 0x77d6], /* CJK Ideograph */
- [0x77d7, 0x77d7], /* CJK Ideograph */
- [0x77d8, 0x77d8], /* CJK Ideograph */
- [0x77d9, 0x77d9], /* CJK Ideograph */
- [0x77da, 0x77da], /* CJK Ideograph */
- [0x77db, 0x77db], /* CJK Ideograph */
- [0x77dc, 0x77dc], /* CJK Ideograph */
- [0x77dd, 0x77dd], /* CJK Ideograph */
- [0x77de, 0x77de], /* CJK Ideograph */
- [0x77df, 0x77df], /* CJK Ideograph */
- [0x77e0, 0x77e0], /* CJK Ideograph */
- [0x77e1, 0x77e1], /* CJK Ideograph */
- [0x77e2, 0x77e2], /* CJK Ideograph */
- [0x77e3, 0x77e3], /* CJK Ideograph */
- [0x77e4, 0x77e4], /* CJK Ideograph */
- [0x77e5, 0x77e5], /* CJK Ideograph */
- [0x77e6, 0x77e6], /* CJK Ideograph */
- [0x77e7, 0x77e7], /* CJK Ideograph */
- [0x77e8, 0x77e8], /* CJK Ideograph */
- [0x77e9, 0x77e9], /* CJK Ideograph */
- [0x77ea, 0x77ea], /* CJK Ideograph */
- [0x77eb, 0x77eb], /* CJK Ideograph */
- [0x77ec, 0x77ec], /* CJK Ideograph */
- [0x77ed, 0x77ed], /* CJK Ideograph */
- [0x77ee, 0x77ee], /* CJK Ideograph */
- [0x77ef, 0x77ef], /* CJK Ideograph */
- [0x77f0, 0x77f0], /* CJK Ideograph */
- [0x77f1, 0x77f1], /* CJK Ideograph */
- [0x77f2, 0x77f2], /* CJK Ideograph */
- [0x77f3, 0x77f3], /* CJK Ideograph */
- [0x77f4, 0x77f4], /* CJK Ideograph */
- [0x77f5, 0x77f5], /* CJK Ideograph */
- [0x77f6, 0x77f6], /* CJK Ideograph */
- [0x77f7, 0x77f7], /* CJK Ideograph */
- [0x77f8, 0x77f8], /* CJK Ideograph */
- [0x77f9, 0x77f9], /* CJK Ideograph */
- [0x77fa, 0x77fa], /* CJK Ideograph */
- [0x77fb, 0x77fb], /* CJK Ideograph */
- [0x77fc, 0x77fc], /* CJK Ideograph */
- [0x77fd, 0x77fd], /* CJK Ideograph */
- [0x77fe, 0x77fe], /* CJK Ideograph */
- [0x77ff, 0x77ff], /* CJK Ideograph */
- [0x7800, 0x7800], /* CJK Ideograph */
- [0x7801, 0x7801], /* CJK Ideograph */
- [0x7802, 0x7802], /* CJK Ideograph */
- [0x7803, 0x7803], /* CJK Ideograph */
- [0x7804, 0x7804], /* CJK Ideograph */
- [0x7805, 0x7805], /* CJK Ideograph */
- [0x7806, 0x7806], /* CJK Ideograph */
- [0x7807, 0x7807], /* CJK Ideograph */
- [0x7808, 0x7808], /* CJK Ideograph */
- [0x7809, 0x7809], /* CJK Ideograph */
- [0x780a, 0x780a], /* CJK Ideograph */
- [0x780b, 0x780b], /* CJK Ideograph */
- [0x780c, 0x780c], /* CJK Ideograph */
- [0x780d, 0x780d], /* CJK Ideograph */
- [0x780e, 0x780e], /* CJK Ideograph */
- [0x780f, 0x780f], /* CJK Ideograph */
- [0x7810, 0x7810], /* CJK Ideograph */
- [0x7811, 0x7811], /* CJK Ideograph */
- [0x7812, 0x7812], /* CJK Ideograph */
- [0x7813, 0x7813], /* CJK Ideograph */
- [0x7814, 0x7814], /* CJK Ideograph */
- [0x7815, 0x7815], /* CJK Ideograph */
- [0x7816, 0x7816], /* CJK Ideograph */
- [0x7817, 0x7817], /* CJK Ideograph */
- [0x7818, 0x7818], /* CJK Ideograph */
- [0x7819, 0x7819], /* CJK Ideograph */
- [0x781a, 0x781a], /* CJK Ideograph */
- [0x781b, 0x781b], /* CJK Ideograph */
- [0x781c, 0x781c], /* CJK Ideograph */
- [0x781d, 0x781d], /* CJK Ideograph */
- [0x781e, 0x781e], /* CJK Ideograph */
- [0x781f, 0x781f], /* CJK Ideograph */
- [0x7820, 0x7820], /* CJK Ideograph */
- [0x7821, 0x7821], /* CJK Ideograph */
- [0x7822, 0x7822], /* CJK Ideograph */
- [0x7823, 0x7823], /* CJK Ideograph */
- [0x7824, 0x7824], /* CJK Ideograph */
- [0x7825, 0x7825], /* CJK Ideograph */
- [0x7826, 0x7826], /* CJK Ideograph */
- [0x7827, 0x7827], /* CJK Ideograph */
- [0x7828, 0x7828], /* CJK Ideograph */
- [0x7829, 0x7829], /* CJK Ideograph */
- [0x782a, 0x782a], /* CJK Ideograph */
- [0x782b, 0x782b], /* CJK Ideograph */
- [0x782c, 0x782c], /* CJK Ideograph */
- [0x782d, 0x782d], /* CJK Ideograph */
- [0x782e, 0x782e], /* CJK Ideograph */
- [0x782f, 0x782f], /* CJK Ideograph */
- [0x7830, 0x7830], /* CJK Ideograph */
- [0x7831, 0x7831], /* CJK Ideograph */
- [0x7832, 0x7832], /* CJK Ideograph */
- [0x7833, 0x7833], /* CJK Ideograph */
- [0x7834, 0x7834], /* CJK Ideograph */
- [0x7835, 0x7835], /* CJK Ideograph */
- [0x7836, 0x7836], /* CJK Ideograph */
- [0x7837, 0x7837], /* CJK Ideograph */
- [0x7838, 0x7838], /* CJK Ideograph */
- [0x7839, 0x7839], /* CJK Ideograph */
- [0x783a, 0x783a], /* CJK Ideograph */
- [0x783b, 0x783b], /* CJK Ideograph */
- [0x783c, 0x783c], /* CJK Ideograph */
- [0x783d, 0x783d], /* CJK Ideograph */
- [0x783e, 0x783e], /* CJK Ideograph */
- [0x783f, 0x783f], /* CJK Ideograph */
- [0x7840, 0x7840], /* CJK Ideograph */
- [0x7841, 0x7841], /* CJK Ideograph */
- [0x7842, 0x7842], /* CJK Ideograph */
- [0x7843, 0x7843], /* CJK Ideograph */
- [0x7844, 0x7844], /* CJK Ideograph */
- [0x7845, 0x7845], /* CJK Ideograph */
- [0x7846, 0x7846], /* CJK Ideograph */
- [0x7847, 0x7847], /* CJK Ideograph */
- [0x7848, 0x7848], /* CJK Ideograph */
- [0x7849, 0x7849], /* CJK Ideograph */
- [0x784a, 0x784a], /* CJK Ideograph */
- [0x784b, 0x784b], /* CJK Ideograph */
- [0x784c, 0x784c], /* CJK Ideograph */
- [0x784d, 0x784d], /* CJK Ideograph */
- [0x784e, 0x784e], /* CJK Ideograph */
- [0x784f, 0x784f], /* CJK Ideograph */
- [0x7850, 0x7850], /* CJK Ideograph */
- [0x7851, 0x7851], /* CJK Ideograph */
- [0x7852, 0x7852], /* CJK Ideograph */
- [0x7853, 0x7853], /* CJK Ideograph */
- [0x7854, 0x7854], /* CJK Ideograph */
- [0x7855, 0x7855], /* CJK Ideograph */
- [0x7856, 0x7856], /* CJK Ideograph */
- [0x7857, 0x7857], /* CJK Ideograph */
- [0x7858, 0x7858], /* CJK Ideograph */
- [0x7859, 0x7859], /* CJK Ideograph */
- [0x785a, 0x785a], /* CJK Ideograph */
- [0x785b, 0x785b], /* CJK Ideograph */
- [0x785c, 0x785c], /* CJK Ideograph */
- [0x785d, 0x785d], /* CJK Ideograph */
- [0x785e, 0x785e], /* CJK Ideograph */
- [0x785f, 0x785f], /* CJK Ideograph */
- [0x7860, 0x7860], /* CJK Ideograph */
- [0x7861, 0x7861], /* CJK Ideograph */
- [0x7862, 0x7862], /* CJK Ideograph */
- [0x7863, 0x7863], /* CJK Ideograph */
- [0x7864, 0x7864], /* CJK Ideograph */
- [0x7865, 0x7865], /* CJK Ideograph */
- [0x7866, 0x7866], /* CJK Ideograph */
- [0x7867, 0x7867], /* CJK Ideograph */
- [0x7868, 0x7868], /* CJK Ideograph */
- [0x7869, 0x7869], /* CJK Ideograph */
- [0x786a, 0x786a], /* CJK Ideograph */
- [0x786b, 0x786b], /* CJK Ideograph */
- [0x786c, 0x786c], /* CJK Ideograph */
- [0x786d, 0x786d], /* CJK Ideograph */
- [0x786e, 0x786e], /* CJK Ideograph */
- [0x786f, 0x786f], /* CJK Ideograph */
- [0x7870, 0x7870], /* CJK Ideograph */
- [0x7871, 0x7871], /* CJK Ideograph */
- [0x7872, 0x7872], /* CJK Ideograph */
- [0x7873, 0x7873], /* CJK Ideograph */
- [0x7874, 0x7874], /* CJK Ideograph */
- [0x7875, 0x7875], /* CJK Ideograph */
- [0x7876, 0x7876], /* CJK Ideograph */
- [0x7877, 0x7877], /* CJK Ideograph */
- [0x7878, 0x7878], /* CJK Ideograph */
- [0x7879, 0x7879], /* CJK Ideograph */
- [0x787a, 0x787a], /* CJK Ideograph */
- [0x787b, 0x787b], /* CJK Ideograph */
- [0x787c, 0x787c], /* CJK Ideograph */
- [0x787d, 0x787d], /* CJK Ideograph */
- [0x787e, 0x787e], /* CJK Ideograph */
- [0x787f, 0x787f], /* CJK Ideograph */
- [0x7880, 0x7880], /* CJK Ideograph */
- [0x7881, 0x7881], /* CJK Ideograph */
- [0x7882, 0x7882], /* CJK Ideograph */
- [0x7883, 0x7883], /* CJK Ideograph */
- [0x7884, 0x7884], /* CJK Ideograph */
- [0x7885, 0x7885], /* CJK Ideograph */
- [0x7886, 0x7886], /* CJK Ideograph */
- [0x7887, 0x7887], /* CJK Ideograph */
- [0x7888, 0x7888], /* CJK Ideograph */
- [0x7889, 0x7889], /* CJK Ideograph */
- [0x788a, 0x788a], /* CJK Ideograph */
- [0x788b, 0x788b], /* CJK Ideograph */
- [0x788c, 0x788c], /* CJK Ideograph */
- [0x788d, 0x788d], /* CJK Ideograph */
- [0x788e, 0x788e], /* CJK Ideograph */
- [0x788f, 0x788f], /* CJK Ideograph */
- [0x7890, 0x7890], /* CJK Ideograph */
- [0x7891, 0x7891], /* CJK Ideograph */
- [0x7892, 0x7892], /* CJK Ideograph */
- [0x7893, 0x7893], /* CJK Ideograph */
- [0x7894, 0x7894], /* CJK Ideograph */
- [0x7895, 0x7895], /* CJK Ideograph */
- [0x7896, 0x7896], /* CJK Ideograph */
- [0x7897, 0x7897], /* CJK Ideograph */
- [0x7898, 0x7898], /* CJK Ideograph */
- [0x7899, 0x7899], /* CJK Ideograph */
- [0x789a, 0x789a], /* CJK Ideograph */
- [0x789b, 0x789b], /* CJK Ideograph */
- [0x789c, 0x789c], /* CJK Ideograph */
- [0x789d, 0x789d], /* CJK Ideograph */
- [0x789e, 0x789e], /* CJK Ideograph */
- [0x789f, 0x789f], /* CJK Ideograph */
- [0x78a0, 0x78a0], /* CJK Ideograph */
- [0x78a1, 0x78a1], /* CJK Ideograph */
- [0x78a2, 0x78a2], /* CJK Ideograph */
- [0x78a3, 0x78a3], /* CJK Ideograph */
- [0x78a4, 0x78a4], /* CJK Ideograph */
- [0x78a5, 0x78a5], /* CJK Ideograph */
- [0x78a6, 0x78a6], /* CJK Ideograph */
- [0x78a7, 0x78a7], /* CJK Ideograph */
- [0x78a8, 0x78a8], /* CJK Ideograph */
- [0x78a9, 0x78a9], /* CJK Ideograph */
- [0x78aa, 0x78aa], /* CJK Ideograph */
- [0x78ab, 0x78ab], /* CJK Ideograph */
- [0x78ac, 0x78ac], /* CJK Ideograph */
- [0x78ad, 0x78ad], /* CJK Ideograph */
- [0x78ae, 0x78ae], /* CJK Ideograph */
- [0x78af, 0x78af], /* CJK Ideograph */
- [0x78b0, 0x78b0], /* CJK Ideograph */
- [0x78b1, 0x78b1], /* CJK Ideograph */
- [0x78b2, 0x78b2], /* CJK Ideograph */
- [0x78b3, 0x78b3], /* CJK Ideograph */
- [0x78b4, 0x78b4], /* CJK Ideograph */
- [0x78b5, 0x78b5], /* CJK Ideograph */
- [0x78b6, 0x78b6], /* CJK Ideograph */
- [0x78b7, 0x78b7], /* CJK Ideograph */
- [0x78b8, 0x78b8], /* CJK Ideograph */
- [0x78b9, 0x78b9], /* CJK Ideograph */
- [0x78ba, 0x78ba], /* CJK Ideograph */
- [0x78bb, 0x78bb], /* CJK Ideograph */
- [0x78bc, 0x78bc], /* CJK Ideograph */
- [0x78bd, 0x78bd], /* CJK Ideograph */
- [0x78be, 0x78be], /* CJK Ideograph */
- [0x78bf, 0x78bf], /* CJK Ideograph */
- [0x78c0, 0x78c0], /* CJK Ideograph */
- [0x78c1, 0x78c1], /* CJK Ideograph */
- [0x78c2, 0x78c2], /* CJK Ideograph */
- [0x78c3, 0x78c3], /* CJK Ideograph */
- [0x78c4, 0x78c4], /* CJK Ideograph */
- [0x78c5, 0x78c5], /* CJK Ideograph */
- [0x78c6, 0x78c6], /* CJK Ideograph */
- [0x78c7, 0x78c7], /* CJK Ideograph */
- [0x78c8, 0x78c8], /* CJK Ideograph */
- [0x78c9, 0x78c9], /* CJK Ideograph */
- [0x78ca, 0x78ca], /* CJK Ideograph */
- [0x78cb, 0x78cb], /* CJK Ideograph */
- [0x78cc, 0x78cc], /* CJK Ideograph */
- [0x78cd, 0x78cd], /* CJK Ideograph */
- [0x78ce, 0x78ce], /* CJK Ideograph */
- [0x78cf, 0x78cf], /* CJK Ideograph */
- [0x78d0, 0x78d0], /* CJK Ideograph */
- [0x78d1, 0x78d1], /* CJK Ideograph */
- [0x78d2, 0x78d2], /* CJK Ideograph */
- [0x78d3, 0x78d3], /* CJK Ideograph */
- [0x78d4, 0x78d4], /* CJK Ideograph */
- [0x78d5, 0x78d5], /* CJK Ideograph */
- [0x78d6, 0x78d6], /* CJK Ideograph */
- [0x78d7, 0x78d7], /* CJK Ideograph */
- [0x78d8, 0x78d8], /* CJK Ideograph */
- [0x78d9, 0x78d9], /* CJK Ideograph */
- [0x78da, 0x78da], /* CJK Ideograph */
- [0x78db, 0x78db], /* CJK Ideograph */
- [0x78dc, 0x78dc], /* CJK Ideograph */
- [0x78dd, 0x78dd], /* CJK Ideograph */
- [0x78de, 0x78de], /* CJK Ideograph */
- [0x78df, 0x78df], /* CJK Ideograph */
- [0x78e0, 0x78e0], /* CJK Ideograph */
- [0x78e1, 0x78e1], /* CJK Ideograph */
- [0x78e2, 0x78e2], /* CJK Ideograph */
- [0x78e3, 0x78e3], /* CJK Ideograph */
- [0x78e4, 0x78e4], /* CJK Ideograph */
- [0x78e5, 0x78e5], /* CJK Ideograph */
- [0x78e6, 0x78e6], /* CJK Ideograph */
- [0x78e7, 0x78e7], /* CJK Ideograph */
- [0x78e8, 0x78e8], /* CJK Ideograph */
- [0x78e9, 0x78e9], /* CJK Ideograph */
- [0x78ea, 0x78ea], /* CJK Ideograph */
- [0x78eb, 0x78eb], /* CJK Ideograph */
- [0x78ec, 0x78ec], /* CJK Ideograph */
- [0x78ed, 0x78ed], /* CJK Ideograph */
- [0x78ee, 0x78ee], /* CJK Ideograph */
- [0x78ef, 0x78ef], /* CJK Ideograph */
- [0x78f0, 0x78f0], /* CJK Ideograph */
- [0x78f1, 0x78f1], /* CJK Ideograph */
- [0x78f2, 0x78f2], /* CJK Ideograph */
- [0x78f3, 0x78f3], /* CJK Ideograph */
- [0x78f4, 0x78f4], /* CJK Ideograph */
- [0x78f5, 0x78f5], /* CJK Ideograph */
- [0x78f6, 0x78f6], /* CJK Ideograph */
- [0x78f7, 0x78f7], /* CJK Ideograph */
- [0x78f8, 0x78f8], /* CJK Ideograph */
- [0x78f9, 0x78f9], /* CJK Ideograph */
- [0x78fa, 0x78fa], /* CJK Ideograph */
- [0x78fb, 0x78fb], /* CJK Ideograph */
- [0x78fc, 0x78fc], /* CJK Ideograph */
- [0x78fd, 0x78fd], /* CJK Ideograph */
- [0x78fe, 0x78fe], /* CJK Ideograph */
- [0x78ff, 0x78ff], /* CJK Ideograph */
- [0x7900, 0x7900], /* CJK Ideograph */
- [0x7901, 0x7901], /* CJK Ideograph */
- [0x7902, 0x7902], /* CJK Ideograph */
- [0x7903, 0x7903], /* CJK Ideograph */
- [0x7904, 0x7904], /* CJK Ideograph */
- [0x7905, 0x7905], /* CJK Ideograph */
- [0x7906, 0x7906], /* CJK Ideograph */
- [0x7907, 0x7907], /* CJK Ideograph */
- [0x7908, 0x7908], /* CJK Ideograph */
- [0x7909, 0x7909], /* CJK Ideograph */
- [0x790a, 0x790a], /* CJK Ideograph */
- [0x790b, 0x790b], /* CJK Ideograph */
- [0x790c, 0x790c], /* CJK Ideograph */
- [0x790d, 0x790d], /* CJK Ideograph */
- [0x790e, 0x790e], /* CJK Ideograph */
- [0x790f, 0x790f], /* CJK Ideograph */
- [0x7910, 0x7910], /* CJK Ideograph */
- [0x7911, 0x7911], /* CJK Ideograph */
- [0x7912, 0x7912], /* CJK Ideograph */
- [0x7913, 0x7913], /* CJK Ideograph */
- [0x7914, 0x7914], /* CJK Ideograph */
- [0x7915, 0x7915], /* CJK Ideograph */
- [0x7916, 0x7916], /* CJK Ideograph */
- [0x7917, 0x7917], /* CJK Ideograph */
- [0x7918, 0x7918], /* CJK Ideograph */
- [0x7919, 0x7919], /* CJK Ideograph */
- [0x791a, 0x791a], /* CJK Ideograph */
- [0x791b, 0x791b], /* CJK Ideograph */
- [0x791c, 0x791c], /* CJK Ideograph */
- [0x791d, 0x791d], /* CJK Ideograph */
- [0x791e, 0x791e], /* CJK Ideograph */
- [0x791f, 0x791f], /* CJK Ideograph */
- [0x7920, 0x7920], /* CJK Ideograph */
- [0x7921, 0x7921], /* CJK Ideograph */
- [0x7922, 0x7922], /* CJK Ideograph */
- [0x7923, 0x7923], /* CJK Ideograph */
- [0x7924, 0x7924], /* CJK Ideograph */
- [0x7925, 0x7925], /* CJK Ideograph */
- [0x7926, 0x7926], /* CJK Ideograph */
- [0x7927, 0x7927], /* CJK Ideograph */
- [0x7928, 0x7928], /* CJK Ideograph */
- [0x7929, 0x7929], /* CJK Ideograph */
- [0x792a, 0x792a], /* CJK Ideograph */
- [0x792b, 0x792b], /* CJK Ideograph */
- [0x792c, 0x792c], /* CJK Ideograph */
- [0x792d, 0x792d], /* CJK Ideograph */
- [0x792e, 0x792e], /* CJK Ideograph */
- [0x792f, 0x792f], /* CJK Ideograph */
- [0x7930, 0x7930], /* CJK Ideograph */
- [0x7931, 0x7931], /* CJK Ideograph */
- [0x7932, 0x7932], /* CJK Ideograph */
- [0x7933, 0x7933], /* CJK Ideograph */
- [0x7934, 0x7934], /* CJK Ideograph */
- [0x7935, 0x7935], /* CJK Ideograph */
- [0x7936, 0x7936], /* CJK Ideograph */
- [0x7937, 0x7937], /* CJK Ideograph */
- [0x7938, 0x7938], /* CJK Ideograph */
- [0x7939, 0x7939], /* CJK Ideograph */
- [0x793a, 0x793a], /* CJK Ideograph */
- [0x793b, 0x793b], /* CJK Ideograph */
- [0x793c, 0x793c], /* CJK Ideograph */
- [0x793d, 0x793d], /* CJK Ideograph */
- [0x793e, 0x793e], /* CJK Ideograph */
- [0x793f, 0x793f], /* CJK Ideograph */
- [0x7940, 0x7940], /* CJK Ideograph */
- [0x7941, 0x7941], /* CJK Ideograph */
- [0x7942, 0x7942], /* CJK Ideograph */
- [0x7943, 0x7943], /* CJK Ideograph */
- [0x7944, 0x7944], /* CJK Ideograph */
- [0x7945, 0x7945], /* CJK Ideograph */
- [0x7946, 0x7946], /* CJK Ideograph */
- [0x7947, 0x7947], /* CJK Ideograph */
- [0x7948, 0x7948], /* CJK Ideograph */
- [0x7949, 0x7949], /* CJK Ideograph */
- [0x794a, 0x794a], /* CJK Ideograph */
- [0x794b, 0x794b], /* CJK Ideograph */
- [0x794c, 0x794c], /* CJK Ideograph */
- [0x794d, 0x794d], /* CJK Ideograph */
- [0x794e, 0x794e], /* CJK Ideograph */
- [0x794f, 0x794f], /* CJK Ideograph */
- [0x7950, 0x7950], /* CJK Ideograph */
- [0x7951, 0x7951], /* CJK Ideograph */
- [0x7952, 0x7952], /* CJK Ideograph */
- [0x7953, 0x7953], /* CJK Ideograph */
- [0x7954, 0x7954], /* CJK Ideograph */
- [0x7955, 0x7955], /* CJK Ideograph */
- [0x7956, 0x7956], /* CJK Ideograph */
- [0x7957, 0x7957], /* CJK Ideograph */
- [0x7958, 0x7958], /* CJK Ideograph */
- [0x7959, 0x7959], /* CJK Ideograph */
- [0x795a, 0x795a], /* CJK Ideograph */
- [0x795b, 0x795b], /* CJK Ideograph */
- [0x795c, 0x795c], /* CJK Ideograph */
- [0x795d, 0x795d], /* CJK Ideograph */
- [0x795e, 0x795e], /* CJK Ideograph */
- [0x795f, 0x795f], /* CJK Ideograph */
- [0x7960, 0x7960], /* CJK Ideograph */
- [0x7961, 0x7961], /* CJK Ideograph */
- [0x7962, 0x7962], /* CJK Ideograph */
- [0x7963, 0x7963], /* CJK Ideograph */
- [0x7964, 0x7964], /* CJK Ideograph */
- [0x7965, 0x7965], /* CJK Ideograph */
- [0x7966, 0x7966], /* CJK Ideograph */
- [0x7967, 0x7967], /* CJK Ideograph */
- [0x7968, 0x7968], /* CJK Ideograph */
- [0x7969, 0x7969], /* CJK Ideograph */
- [0x796a, 0x796a], /* CJK Ideograph */
- [0x796b, 0x796b], /* CJK Ideograph */
- [0x796c, 0x796c], /* CJK Ideograph */
- [0x796d, 0x796d], /* CJK Ideograph */
- [0x796e, 0x796e], /* CJK Ideograph */
- [0x796f, 0x796f], /* CJK Ideograph */
- [0x7970, 0x7970], /* CJK Ideograph */
- [0x7971, 0x7971], /* CJK Ideograph */
- [0x7972, 0x7972], /* CJK Ideograph */
- [0x7973, 0x7973], /* CJK Ideograph */
- [0x7974, 0x7974], /* CJK Ideograph */
- [0x7975, 0x7975], /* CJK Ideograph */
- [0x7976, 0x7976], /* CJK Ideograph */
- [0x7977, 0x7977], /* CJK Ideograph */
- [0x7978, 0x7978], /* CJK Ideograph */
- [0x7979, 0x7979], /* CJK Ideograph */
- [0x797a, 0x797a], /* CJK Ideograph */
- [0x797b, 0x797b], /* CJK Ideograph */
- [0x797c, 0x797c], /* CJK Ideograph */
- [0x797d, 0x797d], /* CJK Ideograph */
- [0x797e, 0x797e], /* CJK Ideograph */
- [0x797f, 0x797f], /* CJK Ideograph */
- [0x7980, 0x7980], /* CJK Ideograph */
- [0x7981, 0x7981], /* CJK Ideograph */
- [0x7982, 0x7982], /* CJK Ideograph */
- [0x7983, 0x7983], /* CJK Ideograph */
- [0x7984, 0x7984], /* CJK Ideograph */
- [0x7985, 0x7985], /* CJK Ideograph */
- [0x7986, 0x7986], /* CJK Ideograph */
- [0x7987, 0x7987], /* CJK Ideograph */
- [0x7988, 0x7988], /* CJK Ideograph */
- [0x7989, 0x7989], /* CJK Ideograph */
- [0x798a, 0x798a], /* CJK Ideograph */
- [0x798b, 0x798b], /* CJK Ideograph */
- [0x798c, 0x798c], /* CJK Ideograph */
- [0x798d, 0x798d], /* CJK Ideograph */
- [0x798e, 0x798e], /* CJK Ideograph */
- [0x798f, 0x798f], /* CJK Ideograph */
- [0x7990, 0x7990], /* CJK Ideograph */
- [0x7991, 0x7991], /* CJK Ideograph */
- [0x7992, 0x7992], /* CJK Ideograph */
- [0x7993, 0x7993], /* CJK Ideograph */
- [0x7994, 0x7994], /* CJK Ideograph */
- [0x7995, 0x7995], /* CJK Ideograph */
- [0x7996, 0x7996], /* CJK Ideograph */
- [0x7997, 0x7997], /* CJK Ideograph */
- [0x7998, 0x7998], /* CJK Ideograph */
- [0x7999, 0x7999], /* CJK Ideograph */
- [0x799a, 0x799a], /* CJK Ideograph */
- [0x799b, 0x799b], /* CJK Ideograph */
- [0x799c, 0x799c], /* CJK Ideograph */
- [0x799d, 0x799d], /* CJK Ideograph */
- [0x799e, 0x799e], /* CJK Ideograph */
- [0x799f, 0x799f], /* CJK Ideograph */
- [0x79a0, 0x79a0], /* CJK Ideograph */
- [0x79a1, 0x79a1], /* CJK Ideograph */
- [0x79a2, 0x79a2], /* CJK Ideograph */
- [0x79a3, 0x79a3], /* CJK Ideograph */
- [0x79a4, 0x79a4], /* CJK Ideograph */
- [0x79a5, 0x79a5], /* CJK Ideograph */
- [0x79a6, 0x79a6], /* CJK Ideograph */
- [0x79a7, 0x79a7], /* CJK Ideograph */
- [0x79a8, 0x79a8], /* CJK Ideograph */
- [0x79a9, 0x79a9], /* CJK Ideograph */
- [0x79aa, 0x79aa], /* CJK Ideograph */
- [0x79ab, 0x79ab], /* CJK Ideograph */
- [0x79ac, 0x79ac], /* CJK Ideograph */
- [0x79ad, 0x79ad], /* CJK Ideograph */
- [0x79ae, 0x79ae], /* CJK Ideograph */
- [0x79af, 0x79af], /* CJK Ideograph */
- [0x79b0, 0x79b0], /* CJK Ideograph */
- [0x79b1, 0x79b1], /* CJK Ideograph */
- [0x79b2, 0x79b2], /* CJK Ideograph */
- [0x79b3, 0x79b3], /* CJK Ideograph */
- [0x79b4, 0x79b4], /* CJK Ideograph */
- [0x79b5, 0x79b5], /* CJK Ideograph */
- [0x79b6, 0x79b6], /* CJK Ideograph */
- [0x79b7, 0x79b7], /* CJK Ideograph */
- [0x79b8, 0x79b8], /* CJK Ideograph */
- [0x79b9, 0x79b9], /* CJK Ideograph */
- [0x79ba, 0x79ba], /* CJK Ideograph */
- [0x79bb, 0x79bb], /* CJK Ideograph */
- [0x79bc, 0x79bc], /* CJK Ideograph */
- [0x79bd, 0x79bd], /* CJK Ideograph */
- [0x79be, 0x79be], /* CJK Ideograph */
- [0x79bf, 0x79bf], /* CJK Ideograph */
- [0x79c0, 0x79c0], /* CJK Ideograph */
- [0x79c1, 0x79c1], /* CJK Ideograph */
- [0x79c2, 0x79c2], /* CJK Ideograph */
- [0x79c3, 0x79c3], /* CJK Ideograph */
- [0x79c4, 0x79c4], /* CJK Ideograph */
- [0x79c5, 0x79c5], /* CJK Ideograph */
- [0x79c6, 0x79c6], /* CJK Ideograph */
- [0x79c7, 0x79c7], /* CJK Ideograph */
- [0x79c8, 0x79c8], /* CJK Ideograph */
- [0x79c9, 0x79c9], /* CJK Ideograph */
- [0x79ca, 0x79ca], /* CJK Ideograph */
- [0x79cb, 0x79cb], /* CJK Ideograph */
- [0x79cc, 0x79cc], /* CJK Ideograph */
- [0x79cd, 0x79cd], /* CJK Ideograph */
- [0x79ce, 0x79ce], /* CJK Ideograph */
- [0x79cf, 0x79cf], /* CJK Ideograph */
- [0x79d0, 0x79d0], /* CJK Ideograph */
- [0x79d1, 0x79d1], /* CJK Ideograph */
- [0x79d2, 0x79d2], /* CJK Ideograph */
- [0x79d3, 0x79d3], /* CJK Ideograph */
- [0x79d4, 0x79d4], /* CJK Ideograph */
- [0x79d5, 0x79d5], /* CJK Ideograph */
- [0x79d6, 0x79d6], /* CJK Ideograph */
- [0x79d7, 0x79d7], /* CJK Ideograph */
- [0x79d8, 0x79d8], /* CJK Ideograph */
- [0x79d9, 0x79d9], /* CJK Ideograph */
- [0x79da, 0x79da], /* CJK Ideograph */
- [0x79db, 0x79db], /* CJK Ideograph */
- [0x79dc, 0x79dc], /* CJK Ideograph */
- [0x79dd, 0x79dd], /* CJK Ideograph */
- [0x79de, 0x79de], /* CJK Ideograph */
- [0x79df, 0x79df], /* CJK Ideograph */
- [0x79e0, 0x79e0], /* CJK Ideograph */
- [0x79e1, 0x79e1], /* CJK Ideograph */
- [0x79e2, 0x79e2], /* CJK Ideograph */
- [0x79e3, 0x79e3], /* CJK Ideograph */
- [0x79e4, 0x79e4], /* CJK Ideograph */
- [0x79e5, 0x79e5], /* CJK Ideograph */
- [0x79e6, 0x79e6], /* CJK Ideograph */
- [0x79e7, 0x79e7], /* CJK Ideograph */
- [0x79e8, 0x79e8], /* CJK Ideograph */
- [0x79e9, 0x79e9], /* CJK Ideograph */
- [0x79ea, 0x79ea], /* CJK Ideograph */
- [0x79eb, 0x79eb], /* CJK Ideograph */
- [0x79ec, 0x79ec], /* CJK Ideograph */
- [0x79ed, 0x79ed], /* CJK Ideograph */
- [0x79ee, 0x79ee], /* CJK Ideograph */
- [0x79ef, 0x79ef], /* CJK Ideograph */
- [0x79f0, 0x79f0], /* CJK Ideograph */
- [0x79f1, 0x79f1], /* CJK Ideograph */
- [0x79f2, 0x79f2], /* CJK Ideograph */
- [0x79f3, 0x79f3], /* CJK Ideograph */
- [0x79f4, 0x79f4], /* CJK Ideograph */
- [0x79f5, 0x79f5], /* CJK Ideograph */
- [0x79f6, 0x79f6], /* CJK Ideograph */
- [0x79f7, 0x79f7], /* CJK Ideograph */
- [0x79f8, 0x79f8], /* CJK Ideograph */
- [0x79f9, 0x79f9], /* CJK Ideograph */
- [0x79fa, 0x79fa], /* CJK Ideograph */
- [0x79fb, 0x79fb], /* CJK Ideograph */
- [0x79fc, 0x79fc], /* CJK Ideograph */
- [0x79fd, 0x79fd], /* CJK Ideograph */
- [0x79fe, 0x79fe], /* CJK Ideograph */
- [0x79ff, 0x79ff], /* CJK Ideograph */
- [0x7a00, 0x7a00], /* CJK Ideograph */
- [0x7a01, 0x7a01], /* CJK Ideograph */
- [0x7a02, 0x7a02], /* CJK Ideograph */
- [0x7a03, 0x7a03], /* CJK Ideograph */
- [0x7a04, 0x7a04], /* CJK Ideograph */
- [0x7a05, 0x7a05], /* CJK Ideograph */
- [0x7a06, 0x7a06], /* CJK Ideograph */
- [0x7a07, 0x7a07], /* CJK Ideograph */
- [0x7a08, 0x7a08], /* CJK Ideograph */
- [0x7a09, 0x7a09], /* CJK Ideograph */
- [0x7a0a, 0x7a0a], /* CJK Ideograph */
- [0x7a0b, 0x7a0b], /* CJK Ideograph */
- [0x7a0c, 0x7a0c], /* CJK Ideograph */
- [0x7a0d, 0x7a0d], /* CJK Ideograph */
- [0x7a0e, 0x7a0e], /* CJK Ideograph */
- [0x7a0f, 0x7a0f], /* CJK Ideograph */
- [0x7a10, 0x7a10], /* CJK Ideograph */
- [0x7a11, 0x7a11], /* CJK Ideograph */
- [0x7a12, 0x7a12], /* CJK Ideograph */
- [0x7a13, 0x7a13], /* CJK Ideograph */
- [0x7a14, 0x7a14], /* CJK Ideograph */
- [0x7a15, 0x7a15], /* CJK Ideograph */
- [0x7a16, 0x7a16], /* CJK Ideograph */
- [0x7a17, 0x7a17], /* CJK Ideograph */
- [0x7a18, 0x7a18], /* CJK Ideograph */
- [0x7a19, 0x7a19], /* CJK Ideograph */
- [0x7a1a, 0x7a1a], /* CJK Ideograph */
- [0x7a1b, 0x7a1b], /* CJK Ideograph */
- [0x7a1c, 0x7a1c], /* CJK Ideograph */
- [0x7a1d, 0x7a1d], /* CJK Ideograph */
- [0x7a1e, 0x7a1e], /* CJK Ideograph */
- [0x7a1f, 0x7a1f], /* CJK Ideograph */
- [0x7a20, 0x7a20], /* CJK Ideograph */
- [0x7a21, 0x7a21], /* CJK Ideograph */
- [0x7a22, 0x7a22], /* CJK Ideograph */
- [0x7a23, 0x7a23], /* CJK Ideograph */
- [0x7a24, 0x7a24], /* CJK Ideograph */
- [0x7a25, 0x7a25], /* CJK Ideograph */
- [0x7a26, 0x7a26], /* CJK Ideograph */
- [0x7a27, 0x7a27], /* CJK Ideograph */
- [0x7a28, 0x7a28], /* CJK Ideograph */
- [0x7a29, 0x7a29], /* CJK Ideograph */
- [0x7a2a, 0x7a2a], /* CJK Ideograph */
- [0x7a2b, 0x7a2b], /* CJK Ideograph */
- [0x7a2c, 0x7a2c], /* CJK Ideograph */
- [0x7a2d, 0x7a2d], /* CJK Ideograph */
- [0x7a2e, 0x7a2e], /* CJK Ideograph */
- [0x7a2f, 0x7a2f], /* CJK Ideograph */
- [0x7a30, 0x7a30], /* CJK Ideograph */
- [0x7a31, 0x7a31], /* CJK Ideograph */
- [0x7a32, 0x7a32], /* CJK Ideograph */
- [0x7a33, 0x7a33], /* CJK Ideograph */
- [0x7a34, 0x7a34], /* CJK Ideograph */
- [0x7a35, 0x7a35], /* CJK Ideograph */
- [0x7a36, 0x7a36], /* CJK Ideograph */
- [0x7a37, 0x7a37], /* CJK Ideograph */
- [0x7a38, 0x7a38], /* CJK Ideograph */
- [0x7a39, 0x7a39], /* CJK Ideograph */
- [0x7a3a, 0x7a3a], /* CJK Ideograph */
- [0x7a3b, 0x7a3b], /* CJK Ideograph */
- [0x7a3c, 0x7a3c], /* CJK Ideograph */
- [0x7a3d, 0x7a3d], /* CJK Ideograph */
- [0x7a3e, 0x7a3e], /* CJK Ideograph */
- [0x7a3f, 0x7a3f], /* CJK Ideograph */
- [0x7a40, 0x7a40], /* CJK Ideograph */
- [0x7a41, 0x7a41], /* CJK Ideograph */
- [0x7a42, 0x7a42], /* CJK Ideograph */
- [0x7a43, 0x7a43], /* CJK Ideograph */
- [0x7a44, 0x7a44], /* CJK Ideograph */
- [0x7a45, 0x7a45], /* CJK Ideograph */
- [0x7a46, 0x7a46], /* CJK Ideograph */
- [0x7a47, 0x7a47], /* CJK Ideograph */
- [0x7a48, 0x7a48], /* CJK Ideograph */
- [0x7a49, 0x7a49], /* CJK Ideograph */
- [0x7a4a, 0x7a4a], /* CJK Ideograph */
- [0x7a4b, 0x7a4b], /* CJK Ideograph */
- [0x7a4c, 0x7a4c], /* CJK Ideograph */
- [0x7a4d, 0x7a4d], /* CJK Ideograph */
- [0x7a4e, 0x7a4e], /* CJK Ideograph */
- [0x7a4f, 0x7a4f], /* CJK Ideograph */
- [0x7a50, 0x7a50], /* CJK Ideograph */
- [0x7a51, 0x7a51], /* CJK Ideograph */
- [0x7a52, 0x7a52], /* CJK Ideograph */
- [0x7a53, 0x7a53], /* CJK Ideograph */
- [0x7a54, 0x7a54], /* CJK Ideograph */
- [0x7a55, 0x7a55], /* CJK Ideograph */
- [0x7a56, 0x7a56], /* CJK Ideograph */
- [0x7a57, 0x7a57], /* CJK Ideograph */
- [0x7a58, 0x7a58], /* CJK Ideograph */
- [0x7a59, 0x7a59], /* CJK Ideograph */
- [0x7a5a, 0x7a5a], /* CJK Ideograph */
- [0x7a5b, 0x7a5b], /* CJK Ideograph */
- [0x7a5c, 0x7a5c], /* CJK Ideograph */
- [0x7a5d, 0x7a5d], /* CJK Ideograph */
- [0x7a5e, 0x7a5e], /* CJK Ideograph */
- [0x7a5f, 0x7a5f], /* CJK Ideograph */
- [0x7a60, 0x7a60], /* CJK Ideograph */
- [0x7a61, 0x7a61], /* CJK Ideograph */
- [0x7a62, 0x7a62], /* CJK Ideograph */
- [0x7a63, 0x7a63], /* CJK Ideograph */
- [0x7a64, 0x7a64], /* CJK Ideograph */
- [0x7a65, 0x7a65], /* CJK Ideograph */
- [0x7a66, 0x7a66], /* CJK Ideograph */
- [0x7a67, 0x7a67], /* CJK Ideograph */
- [0x7a68, 0x7a68], /* CJK Ideograph */
- [0x7a69, 0x7a69], /* CJK Ideograph */
- [0x7a6a, 0x7a6a], /* CJK Ideograph */
- [0x7a6b, 0x7a6b], /* CJK Ideograph */
- [0x7a6c, 0x7a6c], /* CJK Ideograph */
- [0x7a6d, 0x7a6d], /* CJK Ideograph */
- [0x7a6e, 0x7a6e], /* CJK Ideograph */
- [0x7a6f, 0x7a6f], /* CJK Ideograph */
- [0x7a70, 0x7a70], /* CJK Ideograph */
- [0x7a71, 0x7a71], /* CJK Ideograph */
- [0x7a72, 0x7a72], /* CJK Ideograph */
- [0x7a73, 0x7a73], /* CJK Ideograph */
- [0x7a74, 0x7a74], /* CJK Ideograph */
- [0x7a75, 0x7a75], /* CJK Ideograph */
- [0x7a76, 0x7a76], /* CJK Ideograph */
- [0x7a77, 0x7a77], /* CJK Ideograph */
- [0x7a78, 0x7a78], /* CJK Ideograph */
- [0x7a79, 0x7a79], /* CJK Ideograph */
- [0x7a7a, 0x7a7a], /* CJK Ideograph */
- [0x7a7b, 0x7a7b], /* CJK Ideograph */
- [0x7a7c, 0x7a7c], /* CJK Ideograph */
- [0x7a7d, 0x7a7d], /* CJK Ideograph */
- [0x7a7e, 0x7a7e], /* CJK Ideograph */
- [0x7a7f, 0x7a7f], /* CJK Ideograph */
- [0x7a80, 0x7a80], /* CJK Ideograph */
- [0x7a81, 0x7a81], /* CJK Ideograph */
- [0x7a82, 0x7a82], /* CJK Ideograph */
- [0x7a83, 0x7a83], /* CJK Ideograph */
- [0x7a84, 0x7a84], /* CJK Ideograph */
- [0x7a85, 0x7a85], /* CJK Ideograph */
- [0x7a86, 0x7a86], /* CJK Ideograph */
- [0x7a87, 0x7a87], /* CJK Ideograph */
- [0x7a88, 0x7a88], /* CJK Ideograph */
- [0x7a89, 0x7a89], /* CJK Ideograph */
- [0x7a8a, 0x7a8a], /* CJK Ideograph */
- [0x7a8b, 0x7a8b], /* CJK Ideograph */
- [0x7a8c, 0x7a8c], /* CJK Ideograph */
- [0x7a8d, 0x7a8d], /* CJK Ideograph */
- [0x7a8e, 0x7a8e], /* CJK Ideograph */
- [0x7a8f, 0x7a8f], /* CJK Ideograph */
- [0x7a90, 0x7a90], /* CJK Ideograph */
- [0x7a91, 0x7a91], /* CJK Ideograph */
- [0x7a92, 0x7a92], /* CJK Ideograph */
- [0x7a93, 0x7a93], /* CJK Ideograph */
- [0x7a94, 0x7a94], /* CJK Ideograph */
- [0x7a95, 0x7a95], /* CJK Ideograph */
- [0x7a96, 0x7a96], /* CJK Ideograph */
- [0x7a97, 0x7a97], /* CJK Ideograph */
- [0x7a98, 0x7a98], /* CJK Ideograph */
- [0x7a99, 0x7a99], /* CJK Ideograph */
- [0x7a9a, 0x7a9a], /* CJK Ideograph */
- [0x7a9b, 0x7a9b], /* CJK Ideograph */
- [0x7a9c, 0x7a9c], /* CJK Ideograph */
- [0x7a9d, 0x7a9d], /* CJK Ideograph */
- [0x7a9e, 0x7a9e], /* CJK Ideograph */
- [0x7a9f, 0x7a9f], /* CJK Ideograph */
- [0x7aa0, 0x7aa0], /* CJK Ideograph */
- [0x7aa1, 0x7aa1], /* CJK Ideograph */
- [0x7aa2, 0x7aa2], /* CJK Ideograph */
- [0x7aa3, 0x7aa3], /* CJK Ideograph */
- [0x7aa4, 0x7aa4], /* CJK Ideograph */
- [0x7aa5, 0x7aa5], /* CJK Ideograph */
- [0x7aa6, 0x7aa6], /* CJK Ideograph */
- [0x7aa7, 0x7aa7], /* CJK Ideograph */
- [0x7aa8, 0x7aa8], /* CJK Ideograph */
- [0x7aa9, 0x7aa9], /* CJK Ideograph */
- [0x7aaa, 0x7aaa], /* CJK Ideograph */
- [0x7aab, 0x7aab], /* CJK Ideograph */
- [0x7aac, 0x7aac], /* CJK Ideograph */
- [0x7aad, 0x7aad], /* CJK Ideograph */
- [0x7aae, 0x7aae], /* CJK Ideograph */
- [0x7aaf, 0x7aaf], /* CJK Ideograph */
- [0x7ab0, 0x7ab0], /* CJK Ideograph */
- [0x7ab1, 0x7ab1], /* CJK Ideograph */
- [0x7ab2, 0x7ab2], /* CJK Ideograph */
- [0x7ab3, 0x7ab3], /* CJK Ideograph */
- [0x7ab4, 0x7ab4], /* CJK Ideograph */
- [0x7ab5, 0x7ab5], /* CJK Ideograph */
- [0x7ab6, 0x7ab6], /* CJK Ideograph */
- [0x7ab7, 0x7ab7], /* CJK Ideograph */
- [0x7ab8, 0x7ab8], /* CJK Ideograph */
- [0x7ab9, 0x7ab9], /* CJK Ideograph */
- [0x7aba, 0x7aba], /* CJK Ideograph */
- [0x7abb, 0x7abb], /* CJK Ideograph */
- [0x7abc, 0x7abc], /* CJK Ideograph */
- [0x7abd, 0x7abd], /* CJK Ideograph */
- [0x7abe, 0x7abe], /* CJK Ideograph */
- [0x7abf, 0x7abf], /* CJK Ideograph */
- [0x7ac0, 0x7ac0], /* CJK Ideograph */
- [0x7ac1, 0x7ac1], /* CJK Ideograph */
- [0x7ac2, 0x7ac2], /* CJK Ideograph */
- [0x7ac3, 0x7ac3], /* CJK Ideograph */
- [0x7ac4, 0x7ac4], /* CJK Ideograph */
- [0x7ac5, 0x7ac5], /* CJK Ideograph */
- [0x7ac6, 0x7ac6], /* CJK Ideograph */
- [0x7ac7, 0x7ac7], /* CJK Ideograph */
- [0x7ac8, 0x7ac8], /* CJK Ideograph */
- [0x7ac9, 0x7ac9], /* CJK Ideograph */
- [0x7aca, 0x7aca], /* CJK Ideograph */
- [0x7acb, 0x7acb], /* CJK Ideograph */
- [0x7acc, 0x7acc], /* CJK Ideograph */
- [0x7acd, 0x7acd], /* CJK Ideograph */
- [0x7ace, 0x7ace], /* CJK Ideograph */
- [0x7acf, 0x7acf], /* CJK Ideograph */
- [0x7ad0, 0x7ad0], /* CJK Ideograph */
- [0x7ad1, 0x7ad1], /* CJK Ideograph */
- [0x7ad2, 0x7ad2], /* CJK Ideograph */
- [0x7ad3, 0x7ad3], /* CJK Ideograph */
- [0x7ad4, 0x7ad4], /* CJK Ideograph */
- [0x7ad5, 0x7ad5], /* CJK Ideograph */
- [0x7ad6, 0x7ad6], /* CJK Ideograph */
- [0x7ad7, 0x7ad7], /* CJK Ideograph */
- [0x7ad8, 0x7ad8], /* CJK Ideograph */
- [0x7ad9, 0x7ad9], /* CJK Ideograph */
- [0x7ada, 0x7ada], /* CJK Ideograph */
- [0x7adb, 0x7adb], /* CJK Ideograph */
- [0x7adc, 0x7adc], /* CJK Ideograph */
- [0x7add, 0x7add], /* CJK Ideograph */
- [0x7ade, 0x7ade], /* CJK Ideograph */
- [0x7adf, 0x7adf], /* CJK Ideograph */
- [0x7ae0, 0x7ae0], /* CJK Ideograph */
- [0x7ae1, 0x7ae1], /* CJK Ideograph */
- [0x7ae2, 0x7ae2], /* CJK Ideograph */
- [0x7ae3, 0x7ae3], /* CJK Ideograph */
- [0x7ae4, 0x7ae4], /* CJK Ideograph */
- [0x7ae5, 0x7ae5], /* CJK Ideograph */
- [0x7ae6, 0x7ae6], /* CJK Ideograph */
- [0x7ae7, 0x7ae7], /* CJK Ideograph */
- [0x7ae8, 0x7ae8], /* CJK Ideograph */
- [0x7ae9, 0x7ae9], /* CJK Ideograph */
- [0x7aea, 0x7aea], /* CJK Ideograph */
- [0x7aeb, 0x7aeb], /* CJK Ideograph */
- [0x7aec, 0x7aec], /* CJK Ideograph */
- [0x7aed, 0x7aed], /* CJK Ideograph */
- [0x7aee, 0x7aee], /* CJK Ideograph */
- [0x7aef, 0x7aef], /* CJK Ideograph */
- [0x7af0, 0x7af0], /* CJK Ideograph */
- [0x7af1, 0x7af1], /* CJK Ideograph */
- [0x7af2, 0x7af2], /* CJK Ideograph */
- [0x7af3, 0x7af3], /* CJK Ideograph */
- [0x7af4, 0x7af4], /* CJK Ideograph */
- [0x7af5, 0x7af5], /* CJK Ideograph */
- [0x7af6, 0x7af6], /* CJK Ideograph */
- [0x7af7, 0x7af7], /* CJK Ideograph */
- [0x7af8, 0x7af8], /* CJK Ideograph */
- [0x7af9, 0x7af9], /* CJK Ideograph */
- [0x7afa, 0x7afa], /* CJK Ideograph */
- [0x7afb, 0x7afb], /* CJK Ideograph */
- [0x7afc, 0x7afc], /* CJK Ideograph */
- [0x7afd, 0x7afd], /* CJK Ideograph */
- [0x7afe, 0x7afe], /* CJK Ideograph */
- [0x7aff, 0x7aff], /* CJK Ideograph */
- [0x7b00, 0x7b00], /* CJK Ideograph */
- [0x7b01, 0x7b01], /* CJK Ideograph */
- [0x7b02, 0x7b02], /* CJK Ideograph */
- [0x7b03, 0x7b03], /* CJK Ideograph */
- [0x7b04, 0x7b04], /* CJK Ideograph */
- [0x7b05, 0x7b05], /* CJK Ideograph */
- [0x7b06, 0x7b06], /* CJK Ideograph */
- [0x7b07, 0x7b07], /* CJK Ideograph */
- [0x7b08, 0x7b08], /* CJK Ideograph */
- [0x7b09, 0x7b09], /* CJK Ideograph */
- [0x7b0a, 0x7b0a], /* CJK Ideograph */
- [0x7b0b, 0x7b0b], /* CJK Ideograph */
- [0x7b0c, 0x7b0c], /* CJK Ideograph */
- [0x7b0d, 0x7b0d], /* CJK Ideograph */
- [0x7b0e, 0x7b0e], /* CJK Ideograph */
- [0x7b0f, 0x7b0f], /* CJK Ideograph */
- [0x7b10, 0x7b10], /* CJK Ideograph */
- [0x7b11, 0x7b11], /* CJK Ideograph */
- [0x7b12, 0x7b12], /* CJK Ideograph */
- [0x7b13, 0x7b13], /* CJK Ideograph */
- [0x7b14, 0x7b14], /* CJK Ideograph */
- [0x7b15, 0x7b15], /* CJK Ideograph */
- [0x7b16, 0x7b16], /* CJK Ideograph */
- [0x7b17, 0x7b17], /* CJK Ideograph */
- [0x7b18, 0x7b18], /* CJK Ideograph */
- [0x7b19, 0x7b19], /* CJK Ideograph */
- [0x7b1a, 0x7b1a], /* CJK Ideograph */
- [0x7b1b, 0x7b1b], /* CJK Ideograph */
- [0x7b1c, 0x7b1c], /* CJK Ideograph */
- [0x7b1d, 0x7b1d], /* CJK Ideograph */
- [0x7b1e, 0x7b1e], /* CJK Ideograph */
- [0x7b1f, 0x7b1f], /* CJK Ideograph */
- [0x7b20, 0x7b20], /* CJK Ideograph */
- [0x7b21, 0x7b21], /* CJK Ideograph */
- [0x7b22, 0x7b22], /* CJK Ideograph */
- [0x7b23, 0x7b23], /* CJK Ideograph */
- [0x7b24, 0x7b24], /* CJK Ideograph */
- [0x7b25, 0x7b25], /* CJK Ideograph */
- [0x7b26, 0x7b26], /* CJK Ideograph */
- [0x7b27, 0x7b27], /* CJK Ideograph */
- [0x7b28, 0x7b28], /* CJK Ideograph */
- [0x7b29, 0x7b29], /* CJK Ideograph */
- [0x7b2a, 0x7b2a], /* CJK Ideograph */
- [0x7b2b, 0x7b2b], /* CJK Ideograph */
- [0x7b2c, 0x7b2c], /* CJK Ideograph */
- [0x7b2d, 0x7b2d], /* CJK Ideograph */
- [0x7b2e, 0x7b2e], /* CJK Ideograph */
- [0x7b2f, 0x7b2f], /* CJK Ideograph */
- [0x7b30, 0x7b30], /* CJK Ideograph */
- [0x7b31, 0x7b31], /* CJK Ideograph */
- [0x7b32, 0x7b32], /* CJK Ideograph */
- [0x7b33, 0x7b33], /* CJK Ideograph */
- [0x7b34, 0x7b34], /* CJK Ideograph */
- [0x7b35, 0x7b35], /* CJK Ideograph */
- [0x7b36, 0x7b36], /* CJK Ideograph */
- [0x7b37, 0x7b37], /* CJK Ideograph */
- [0x7b38, 0x7b38], /* CJK Ideograph */
- [0x7b39, 0x7b39], /* CJK Ideograph */
- [0x7b3a, 0x7b3a], /* CJK Ideograph */
- [0x7b3b, 0x7b3b], /* CJK Ideograph */
- [0x7b3c, 0x7b3c], /* CJK Ideograph */
- [0x7b3d, 0x7b3d], /* CJK Ideograph */
- [0x7b3e, 0x7b3e], /* CJK Ideograph */
- [0x7b3f, 0x7b3f], /* CJK Ideograph */
- [0x7b40, 0x7b40], /* CJK Ideograph */
- [0x7b41, 0x7b41], /* CJK Ideograph */
- [0x7b42, 0x7b42], /* CJK Ideograph */
- [0x7b43, 0x7b43], /* CJK Ideograph */
- [0x7b44, 0x7b44], /* CJK Ideograph */
- [0x7b45, 0x7b45], /* CJK Ideograph */
- [0x7b46, 0x7b46], /* CJK Ideograph */
- [0x7b47, 0x7b47], /* CJK Ideograph */
- [0x7b48, 0x7b48], /* CJK Ideograph */
- [0x7b49, 0x7b49], /* CJK Ideograph */
- [0x7b4a, 0x7b4a], /* CJK Ideograph */
- [0x7b4b, 0x7b4b], /* CJK Ideograph */
- [0x7b4c, 0x7b4c], /* CJK Ideograph */
- [0x7b4d, 0x7b4d], /* CJK Ideograph */
- [0x7b4e, 0x7b4e], /* CJK Ideograph */
- [0x7b4f, 0x7b4f], /* CJK Ideograph */
- [0x7b50, 0x7b50], /* CJK Ideograph */
- [0x7b51, 0x7b51], /* CJK Ideograph */
- [0x7b52, 0x7b52], /* CJK Ideograph */
- [0x7b53, 0x7b53], /* CJK Ideograph */
- [0x7b54, 0x7b54], /* CJK Ideograph */
- [0x7b55, 0x7b55], /* CJK Ideograph */
- [0x7b56, 0x7b56], /* CJK Ideograph */
- [0x7b57, 0x7b57], /* CJK Ideograph */
- [0x7b58, 0x7b58], /* CJK Ideograph */
- [0x7b59, 0x7b59], /* CJK Ideograph */
- [0x7b5a, 0x7b5a], /* CJK Ideograph */
- [0x7b5b, 0x7b5b], /* CJK Ideograph */
- [0x7b5c, 0x7b5c], /* CJK Ideograph */
- [0x7b5d, 0x7b5d], /* CJK Ideograph */
- [0x7b5e, 0x7b5e], /* CJK Ideograph */
- [0x7b5f, 0x7b5f], /* CJK Ideograph */
- [0x7b60, 0x7b60], /* CJK Ideograph */
- [0x7b61, 0x7b61], /* CJK Ideograph */
- [0x7b62, 0x7b62], /* CJK Ideograph */
- [0x7b63, 0x7b63], /* CJK Ideograph */
- [0x7b64, 0x7b64], /* CJK Ideograph */
- [0x7b65, 0x7b65], /* CJK Ideograph */
- [0x7b66, 0x7b66], /* CJK Ideograph */
- [0x7b67, 0x7b67], /* CJK Ideograph */
- [0x7b68, 0x7b68], /* CJK Ideograph */
- [0x7b69, 0x7b69], /* CJK Ideograph */
- [0x7b6a, 0x7b6a], /* CJK Ideograph */
- [0x7b6b, 0x7b6b], /* CJK Ideograph */
- [0x7b6c, 0x7b6c], /* CJK Ideograph */
- [0x7b6d, 0x7b6d], /* CJK Ideograph */
- [0x7b6e, 0x7b6e], /* CJK Ideograph */
- [0x7b6f, 0x7b6f], /* CJK Ideograph */
- [0x7b70, 0x7b70], /* CJK Ideograph */
- [0x7b71, 0x7b71], /* CJK Ideograph */
- [0x7b72, 0x7b72], /* CJK Ideograph */
- [0x7b73, 0x7b73], /* CJK Ideograph */
- [0x7b74, 0x7b74], /* CJK Ideograph */
- [0x7b75, 0x7b75], /* CJK Ideograph */
- [0x7b76, 0x7b76], /* CJK Ideograph */
- [0x7b77, 0x7b77], /* CJK Ideograph */
- [0x7b78, 0x7b78], /* CJK Ideograph */
- [0x7b79, 0x7b79], /* CJK Ideograph */
- [0x7b7a, 0x7b7a], /* CJK Ideograph */
- [0x7b7b, 0x7b7b], /* CJK Ideograph */
- [0x7b7c, 0x7b7c], /* CJK Ideograph */
- [0x7b7d, 0x7b7d], /* CJK Ideograph */
- [0x7b7e, 0x7b7e], /* CJK Ideograph */
- [0x7b7f, 0x7b7f], /* CJK Ideograph */
- [0x7b80, 0x7b80], /* CJK Ideograph */
- [0x7b81, 0x7b81], /* CJK Ideograph */
- [0x7b82, 0x7b82], /* CJK Ideograph */
- [0x7b83, 0x7b83], /* CJK Ideograph */
- [0x7b84, 0x7b84], /* CJK Ideograph */
- [0x7b85, 0x7b85], /* CJK Ideograph */
- [0x7b86, 0x7b86], /* CJK Ideograph */
- [0x7b87, 0x7b87], /* CJK Ideograph */
- [0x7b88, 0x7b88], /* CJK Ideograph */
- [0x7b89, 0x7b89], /* CJK Ideograph */
- [0x7b8a, 0x7b8a], /* CJK Ideograph */
- [0x7b8b, 0x7b8b], /* CJK Ideograph */
- [0x7b8c, 0x7b8c], /* CJK Ideograph */
- [0x7b8d, 0x7b8d], /* CJK Ideograph */
- [0x7b8e, 0x7b8e], /* CJK Ideograph */
- [0x7b8f, 0x7b8f], /* CJK Ideograph */
- [0x7b90, 0x7b90], /* CJK Ideograph */
- [0x7b91, 0x7b91], /* CJK Ideograph */
- [0x7b92, 0x7b92], /* CJK Ideograph */
- [0x7b93, 0x7b93], /* CJK Ideograph */
- [0x7b94, 0x7b94], /* CJK Ideograph */
- [0x7b95, 0x7b95], /* CJK Ideograph */
- [0x7b96, 0x7b96], /* CJK Ideograph */
- [0x7b97, 0x7b97], /* CJK Ideograph */
- [0x7b98, 0x7b98], /* CJK Ideograph */
- [0x7b99, 0x7b99], /* CJK Ideograph */
- [0x7b9a, 0x7b9a], /* CJK Ideograph */
- [0x7b9b, 0x7b9b], /* CJK Ideograph */
- [0x7b9c, 0x7b9c], /* CJK Ideograph */
- [0x7b9d, 0x7b9d], /* CJK Ideograph */
- [0x7b9e, 0x7b9e], /* CJK Ideograph */
- [0x7b9f, 0x7b9f], /* CJK Ideograph */
- [0x7ba0, 0x7ba0], /* CJK Ideograph */
- [0x7ba1, 0x7ba1], /* CJK Ideograph */
- [0x7ba2, 0x7ba2], /* CJK Ideograph */
- [0x7ba3, 0x7ba3], /* CJK Ideograph */
- [0x7ba4, 0x7ba4], /* CJK Ideograph */
- [0x7ba5, 0x7ba5], /* CJK Ideograph */
- [0x7ba6, 0x7ba6], /* CJK Ideograph */
- [0x7ba7, 0x7ba7], /* CJK Ideograph */
- [0x7ba8, 0x7ba8], /* CJK Ideograph */
- [0x7ba9, 0x7ba9], /* CJK Ideograph */
- [0x7baa, 0x7baa], /* CJK Ideograph */
- [0x7bab, 0x7bab], /* CJK Ideograph */
- [0x7bac, 0x7bac], /* CJK Ideograph */
- [0x7bad, 0x7bad], /* CJK Ideograph */
- [0x7bae, 0x7bae], /* CJK Ideograph */
- [0x7baf, 0x7baf], /* CJK Ideograph */
- [0x7bb0, 0x7bb0], /* CJK Ideograph */
- [0x7bb1, 0x7bb1], /* CJK Ideograph */
- [0x7bb2, 0x7bb2], /* CJK Ideograph */
- [0x7bb3, 0x7bb3], /* CJK Ideograph */
- [0x7bb4, 0x7bb4], /* CJK Ideograph */
- [0x7bb5, 0x7bb5], /* CJK Ideograph */
- [0x7bb6, 0x7bb6], /* CJK Ideograph */
- [0x7bb7, 0x7bb7], /* CJK Ideograph */
- [0x7bb8, 0x7bb8], /* CJK Ideograph */
- [0x7bb9, 0x7bb9], /* CJK Ideograph */
- [0x7bba, 0x7bba], /* CJK Ideograph */
- [0x7bbb, 0x7bbb], /* CJK Ideograph */
- [0x7bbc, 0x7bbc], /* CJK Ideograph */
- [0x7bbd, 0x7bbd], /* CJK Ideograph */
- [0x7bbe, 0x7bbe], /* CJK Ideograph */
- [0x7bbf, 0x7bbf], /* CJK Ideograph */
- [0x7bc0, 0x7bc0], /* CJK Ideograph */
- [0x7bc1, 0x7bc1], /* CJK Ideograph */
- [0x7bc2, 0x7bc2], /* CJK Ideograph */
- [0x7bc3, 0x7bc3], /* CJK Ideograph */
- [0x7bc4, 0x7bc4], /* CJK Ideograph */
- [0x7bc5, 0x7bc5], /* CJK Ideograph */
- [0x7bc6, 0x7bc6], /* CJK Ideograph */
- [0x7bc7, 0x7bc7], /* CJK Ideograph */
- [0x7bc8, 0x7bc8], /* CJK Ideograph */
- [0x7bc9, 0x7bc9], /* CJK Ideograph */
- [0x7bca, 0x7bca], /* CJK Ideograph */
- [0x7bcb, 0x7bcb], /* CJK Ideograph */
- [0x7bcc, 0x7bcc], /* CJK Ideograph */
- [0x7bcd, 0x7bcd], /* CJK Ideograph */
- [0x7bce, 0x7bce], /* CJK Ideograph */
- [0x7bcf, 0x7bcf], /* CJK Ideograph */
- [0x7bd0, 0x7bd0], /* CJK Ideograph */
- [0x7bd1, 0x7bd1], /* CJK Ideograph */
- [0x7bd2, 0x7bd2], /* CJK Ideograph */
- [0x7bd3, 0x7bd3], /* CJK Ideograph */
- [0x7bd4, 0x7bd4], /* CJK Ideograph */
- [0x7bd5, 0x7bd5], /* CJK Ideograph */
- [0x7bd6, 0x7bd6], /* CJK Ideograph */
- [0x7bd7, 0x7bd7], /* CJK Ideograph */
- [0x7bd8, 0x7bd8], /* CJK Ideograph */
- [0x7bd9, 0x7bd9], /* CJK Ideograph */
- [0x7bda, 0x7bda], /* CJK Ideograph */
- [0x7bdb, 0x7bdb], /* CJK Ideograph */
- [0x7bdc, 0x7bdc], /* CJK Ideograph */
- [0x7bdd, 0x7bdd], /* CJK Ideograph */
- [0x7bde, 0x7bde], /* CJK Ideograph */
- [0x7bdf, 0x7bdf], /* CJK Ideograph */
- [0x7be0, 0x7be0], /* CJK Ideograph */
- [0x7be1, 0x7be1], /* CJK Ideograph */
- [0x7be2, 0x7be2], /* CJK Ideograph */
- [0x7be3, 0x7be3], /* CJK Ideograph */
- [0x7be4, 0x7be4], /* CJK Ideograph */
- [0x7be5, 0x7be5], /* CJK Ideograph */
- [0x7be6, 0x7be6], /* CJK Ideograph */
- [0x7be7, 0x7be7], /* CJK Ideograph */
- [0x7be8, 0x7be8], /* CJK Ideograph */
- [0x7be9, 0x7be9], /* CJK Ideograph */
- [0x7bea, 0x7bea], /* CJK Ideograph */
- [0x7beb, 0x7beb], /* CJK Ideograph */
- [0x7bec, 0x7bec], /* CJK Ideograph */
- [0x7bed, 0x7bed], /* CJK Ideograph */
- [0x7bee, 0x7bee], /* CJK Ideograph */
- [0x7bef, 0x7bef], /* CJK Ideograph */
- [0x7bf0, 0x7bf0], /* CJK Ideograph */
- [0x7bf1, 0x7bf1], /* CJK Ideograph */
- [0x7bf2, 0x7bf2], /* CJK Ideograph */
- [0x7bf3, 0x7bf3], /* CJK Ideograph */
- [0x7bf4, 0x7bf4], /* CJK Ideograph */
- [0x7bf5, 0x7bf5], /* CJK Ideograph */
- [0x7bf6, 0x7bf6], /* CJK Ideograph */
- [0x7bf7, 0x7bf7], /* CJK Ideograph */
- [0x7bf8, 0x7bf8], /* CJK Ideograph */
- [0x7bf9, 0x7bf9], /* CJK Ideograph */
- [0x7bfa, 0x7bfa], /* CJK Ideograph */
- [0x7bfb, 0x7bfb], /* CJK Ideograph */
- [0x7bfc, 0x7bfc], /* CJK Ideograph */
- [0x7bfd, 0x7bfd], /* CJK Ideograph */
- [0x7bfe, 0x7bfe], /* CJK Ideograph */
- [0x7bff, 0x7bff], /* CJK Ideograph */
- [0x7c00, 0x7c00], /* CJK Ideograph */
- [0x7c01, 0x7c01], /* CJK Ideograph */
- [0x7c02, 0x7c02], /* CJK Ideograph */
- [0x7c03, 0x7c03], /* CJK Ideograph */
- [0x7c04, 0x7c04], /* CJK Ideograph */
- [0x7c05, 0x7c05], /* CJK Ideograph */
- [0x7c06, 0x7c06], /* CJK Ideograph */
- [0x7c07, 0x7c07], /* CJK Ideograph */
- [0x7c08, 0x7c08], /* CJK Ideograph */
- [0x7c09, 0x7c09], /* CJK Ideograph */
- [0x7c0a, 0x7c0a], /* CJK Ideograph */
- [0x7c0b, 0x7c0b], /* CJK Ideograph */
- [0x7c0c, 0x7c0c], /* CJK Ideograph */
- [0x7c0d, 0x7c0d], /* CJK Ideograph */
- [0x7c0e, 0x7c0e], /* CJK Ideograph */
- [0x7c0f, 0x7c0f], /* CJK Ideograph */
- [0x7c10, 0x7c10], /* CJK Ideograph */
- [0x7c11, 0x7c11], /* CJK Ideograph */
- [0x7c12, 0x7c12], /* CJK Ideograph */
- [0x7c13, 0x7c13], /* CJK Ideograph */
- [0x7c14, 0x7c14], /* CJK Ideograph */
- [0x7c15, 0x7c15], /* CJK Ideograph */
- [0x7c16, 0x7c16], /* CJK Ideograph */
- [0x7c17, 0x7c17], /* CJK Ideograph */
- [0x7c18, 0x7c18], /* CJK Ideograph */
- [0x7c19, 0x7c19], /* CJK Ideograph */
- [0x7c1a, 0x7c1a], /* CJK Ideograph */
- [0x7c1b, 0x7c1b], /* CJK Ideograph */
- [0x7c1c, 0x7c1c], /* CJK Ideograph */
- [0x7c1d, 0x7c1d], /* CJK Ideograph */
- [0x7c1e, 0x7c1e], /* CJK Ideograph */
- [0x7c1f, 0x7c1f], /* CJK Ideograph */
- [0x7c20, 0x7c20], /* CJK Ideograph */
- [0x7c21, 0x7c21], /* CJK Ideograph */
- [0x7c22, 0x7c22], /* CJK Ideograph */
- [0x7c23, 0x7c23], /* CJK Ideograph */
- [0x7c24, 0x7c24], /* CJK Ideograph */
- [0x7c25, 0x7c25], /* CJK Ideograph */
- [0x7c26, 0x7c26], /* CJK Ideograph */
- [0x7c27, 0x7c27], /* CJK Ideograph */
- [0x7c28, 0x7c28], /* CJK Ideograph */
- [0x7c29, 0x7c29], /* CJK Ideograph */
- [0x7c2a, 0x7c2a], /* CJK Ideograph */
- [0x7c2b, 0x7c2b], /* CJK Ideograph */
- [0x7c2c, 0x7c2c], /* CJK Ideograph */
- [0x7c2d, 0x7c2d], /* CJK Ideograph */
- [0x7c2e, 0x7c2e], /* CJK Ideograph */
- [0x7c2f, 0x7c2f], /* CJK Ideograph */
- [0x7c30, 0x7c30], /* CJK Ideograph */
- [0x7c31, 0x7c31], /* CJK Ideograph */
- [0x7c32, 0x7c32], /* CJK Ideograph */
- [0x7c33, 0x7c33], /* CJK Ideograph */
- [0x7c34, 0x7c34], /* CJK Ideograph */
- [0x7c35, 0x7c35], /* CJK Ideograph */
- [0x7c36, 0x7c36], /* CJK Ideograph */
- [0x7c37, 0x7c37], /* CJK Ideograph */
- [0x7c38, 0x7c38], /* CJK Ideograph */
- [0x7c39, 0x7c39], /* CJK Ideograph */
- [0x7c3a, 0x7c3a], /* CJK Ideograph */
- [0x7c3b, 0x7c3b], /* CJK Ideograph */
- [0x7c3c, 0x7c3c], /* CJK Ideograph */
- [0x7c3d, 0x7c3d], /* CJK Ideograph */
- [0x7c3e, 0x7c3e], /* CJK Ideograph */
- [0x7c3f, 0x7c3f], /* CJK Ideograph */
- [0x7c40, 0x7c40], /* CJK Ideograph */
- [0x7c41, 0x7c41], /* CJK Ideograph */
- [0x7c42, 0x7c42], /* CJK Ideograph */
- [0x7c43, 0x7c43], /* CJK Ideograph */
- [0x7c44, 0x7c44], /* CJK Ideograph */
- [0x7c45, 0x7c45], /* CJK Ideograph */
- [0x7c46, 0x7c46], /* CJK Ideograph */
- [0x7c47, 0x7c47], /* CJK Ideograph */
- [0x7c48, 0x7c48], /* CJK Ideograph */
- [0x7c49, 0x7c49], /* CJK Ideograph */
- [0x7c4a, 0x7c4a], /* CJK Ideograph */
- [0x7c4b, 0x7c4b], /* CJK Ideograph */
- [0x7c4c, 0x7c4c], /* CJK Ideograph */
- [0x7c4d, 0x7c4d], /* CJK Ideograph */
- [0x7c4e, 0x7c4e], /* CJK Ideograph */
- [0x7c4f, 0x7c4f], /* CJK Ideograph */
- [0x7c50, 0x7c50], /* CJK Ideograph */
- [0x7c51, 0x7c51], /* CJK Ideograph */
- [0x7c52, 0x7c52], /* CJK Ideograph */
- [0x7c53, 0x7c53], /* CJK Ideograph */
- [0x7c54, 0x7c54], /* CJK Ideograph */
- [0x7c55, 0x7c55], /* CJK Ideograph */
- [0x7c56, 0x7c56], /* CJK Ideograph */
- [0x7c57, 0x7c57], /* CJK Ideograph */
- [0x7c58, 0x7c58], /* CJK Ideograph */
- [0x7c59, 0x7c59], /* CJK Ideograph */
- [0x7c5a, 0x7c5a], /* CJK Ideograph */
- [0x7c5b, 0x7c5b], /* CJK Ideograph */
- [0x7c5c, 0x7c5c], /* CJK Ideograph */
- [0x7c5d, 0x7c5d], /* CJK Ideograph */
- [0x7c5e, 0x7c5e], /* CJK Ideograph */
- [0x7c5f, 0x7c5f], /* CJK Ideograph */
- [0x7c60, 0x7c60], /* CJK Ideograph */
- [0x7c61, 0x7c61], /* CJK Ideograph */
- [0x7c62, 0x7c62], /* CJK Ideograph */
- [0x7c63, 0x7c63], /* CJK Ideograph */
- [0x7c64, 0x7c64], /* CJK Ideograph */
- [0x7c65, 0x7c65], /* CJK Ideograph */
- [0x7c66, 0x7c66], /* CJK Ideograph */
- [0x7c67, 0x7c67], /* CJK Ideograph */
- [0x7c68, 0x7c68], /* CJK Ideograph */
- [0x7c69, 0x7c69], /* CJK Ideograph */
- [0x7c6a, 0x7c6a], /* CJK Ideograph */
- [0x7c6b, 0x7c6b], /* CJK Ideograph */
- [0x7c6c, 0x7c6c], /* CJK Ideograph */
- [0x7c6d, 0x7c6d], /* CJK Ideograph */
- [0x7c6e, 0x7c6e], /* CJK Ideograph */
- [0x7c6f, 0x7c6f], /* CJK Ideograph */
- [0x7c70, 0x7c70], /* CJK Ideograph */
- [0x7c71, 0x7c71], /* CJK Ideograph */
- [0x7c72, 0x7c72], /* CJK Ideograph */
- [0x7c73, 0x7c73], /* CJK Ideograph */
- [0x7c74, 0x7c74], /* CJK Ideograph */
- [0x7c75, 0x7c75], /* CJK Ideograph */
- [0x7c76, 0x7c76], /* CJK Ideograph */
- [0x7c77, 0x7c77], /* CJK Ideograph */
- [0x7c78, 0x7c78], /* CJK Ideograph */
- [0x7c79, 0x7c79], /* CJK Ideograph */
- [0x7c7a, 0x7c7a], /* CJK Ideograph */
- [0x7c7b, 0x7c7b], /* CJK Ideograph */
- [0x7c7c, 0x7c7c], /* CJK Ideograph */
- [0x7c7d, 0x7c7d], /* CJK Ideograph */
- [0x7c7e, 0x7c7e], /* CJK Ideograph */
- [0x7c7f, 0x7c7f], /* CJK Ideograph */
- [0x7c80, 0x7c80], /* CJK Ideograph */
- [0x7c81, 0x7c81], /* CJK Ideograph */
- [0x7c82, 0x7c82], /* CJK Ideograph */
- [0x7c83, 0x7c83], /* CJK Ideograph */
- [0x7c84, 0x7c84], /* CJK Ideograph */
- [0x7c85, 0x7c85], /* CJK Ideograph */
- [0x7c86, 0x7c86], /* CJK Ideograph */
- [0x7c87, 0x7c87], /* CJK Ideograph */
- [0x7c88, 0x7c88], /* CJK Ideograph */
- [0x7c89, 0x7c89], /* CJK Ideograph */
- [0x7c8a, 0x7c8a], /* CJK Ideograph */
- [0x7c8b, 0x7c8b], /* CJK Ideograph */
- [0x7c8c, 0x7c8c], /* CJK Ideograph */
- [0x7c8d, 0x7c8d], /* CJK Ideograph */
- [0x7c8e, 0x7c8e], /* CJK Ideograph */
- [0x7c8f, 0x7c8f], /* CJK Ideograph */
- [0x7c90, 0x7c90], /* CJK Ideograph */
- [0x7c91, 0x7c91], /* CJK Ideograph */
- [0x7c92, 0x7c92], /* CJK Ideograph */
- [0x7c93, 0x7c93], /* CJK Ideograph */
- [0x7c94, 0x7c94], /* CJK Ideograph */
- [0x7c95, 0x7c95], /* CJK Ideograph */
- [0x7c96, 0x7c96], /* CJK Ideograph */
- [0x7c97, 0x7c97], /* CJK Ideograph */
- [0x7c98, 0x7c98], /* CJK Ideograph */
- [0x7c99, 0x7c99], /* CJK Ideograph */
- [0x7c9a, 0x7c9a], /* CJK Ideograph */
- [0x7c9b, 0x7c9b], /* CJK Ideograph */
- [0x7c9c, 0x7c9c], /* CJK Ideograph */
- [0x7c9d, 0x7c9d], /* CJK Ideograph */
- [0x7c9e, 0x7c9e], /* CJK Ideograph */
- [0x7c9f, 0x7c9f], /* CJK Ideograph */
- [0x7ca0, 0x7ca0], /* CJK Ideograph */
- [0x7ca1, 0x7ca1], /* CJK Ideograph */
- [0x7ca2, 0x7ca2], /* CJK Ideograph */
- [0x7ca3, 0x7ca3], /* CJK Ideograph */
- [0x7ca4, 0x7ca4], /* CJK Ideograph */
- [0x7ca5, 0x7ca5], /* CJK Ideograph */
- [0x7ca6, 0x7ca6], /* CJK Ideograph */
- [0x7ca7, 0x7ca7], /* CJK Ideograph */
- [0x7ca8, 0x7ca8], /* CJK Ideograph */
- [0x7ca9, 0x7ca9], /* CJK Ideograph */
- [0x7caa, 0x7caa], /* CJK Ideograph */
- [0x7cab, 0x7cab], /* CJK Ideograph */
- [0x7cac, 0x7cac], /* CJK Ideograph */
- [0x7cad, 0x7cad], /* CJK Ideograph */
- [0x7cae, 0x7cae], /* CJK Ideograph */
- [0x7caf, 0x7caf], /* CJK Ideograph */
- [0x7cb0, 0x7cb0], /* CJK Ideograph */
- [0x7cb1, 0x7cb1], /* CJK Ideograph */
- [0x7cb2, 0x7cb2], /* CJK Ideograph */
- [0x7cb3, 0x7cb3], /* CJK Ideograph */
- [0x7cb4, 0x7cb4], /* CJK Ideograph */
- [0x7cb5, 0x7cb5], /* CJK Ideograph */
- [0x7cb6, 0x7cb6], /* CJK Ideograph */
- [0x7cb7, 0x7cb7], /* CJK Ideograph */
- [0x7cb8, 0x7cb8], /* CJK Ideograph */
- [0x7cb9, 0x7cb9], /* CJK Ideograph */
- [0x7cba, 0x7cba], /* CJK Ideograph */
- [0x7cbb, 0x7cbb], /* CJK Ideograph */
- [0x7cbc, 0x7cbc], /* CJK Ideograph */
- [0x7cbd, 0x7cbd], /* CJK Ideograph */
- [0x7cbe, 0x7cbe], /* CJK Ideograph */
- [0x7cbf, 0x7cbf], /* CJK Ideograph */
- [0x7cc0, 0x7cc0], /* CJK Ideograph */
- [0x7cc1, 0x7cc1], /* CJK Ideograph */
- [0x7cc2, 0x7cc2], /* CJK Ideograph */
- [0x7cc3, 0x7cc3], /* CJK Ideograph */
- [0x7cc4, 0x7cc4], /* CJK Ideograph */
- [0x7cc5, 0x7cc5], /* CJK Ideograph */
- [0x7cc6, 0x7cc6], /* CJK Ideograph */
- [0x7cc7, 0x7cc7], /* CJK Ideograph */
- [0x7cc8, 0x7cc8], /* CJK Ideograph */
- [0x7cc9, 0x7cc9], /* CJK Ideograph */
- [0x7cca, 0x7cca], /* CJK Ideograph */
- [0x7ccb, 0x7ccb], /* CJK Ideograph */
- [0x7ccc, 0x7ccc], /* CJK Ideograph */
- [0x7ccd, 0x7ccd], /* CJK Ideograph */
- [0x7cce, 0x7cce], /* CJK Ideograph */
- [0x7ccf, 0x7ccf], /* CJK Ideograph */
- [0x7cd0, 0x7cd0], /* CJK Ideograph */
- [0x7cd1, 0x7cd1], /* CJK Ideograph */
- [0x7cd2, 0x7cd2], /* CJK Ideograph */
- [0x7cd3, 0x7cd3], /* CJK Ideograph */
- [0x7cd4, 0x7cd4], /* CJK Ideograph */
- [0x7cd5, 0x7cd5], /* CJK Ideograph */
- [0x7cd6, 0x7cd6], /* CJK Ideograph */
- [0x7cd7, 0x7cd7], /* CJK Ideograph */
- [0x7cd8, 0x7cd8], /* CJK Ideograph */
- [0x7cd9, 0x7cd9], /* CJK Ideograph */
- [0x7cda, 0x7cda], /* CJK Ideograph */
- [0x7cdb, 0x7cdb], /* CJK Ideograph */
- [0x7cdc, 0x7cdc], /* CJK Ideograph */
- [0x7cdd, 0x7cdd], /* CJK Ideograph */
- [0x7cde, 0x7cde], /* CJK Ideograph */
- [0x7cdf, 0x7cdf], /* CJK Ideograph */
- [0x7ce0, 0x7ce0], /* CJK Ideograph */
- [0x7ce1, 0x7ce1], /* CJK Ideograph */
- [0x7ce2, 0x7ce2], /* CJK Ideograph */
- [0x7ce3, 0x7ce3], /* CJK Ideograph */
- [0x7ce4, 0x7ce4], /* CJK Ideograph */
- [0x7ce5, 0x7ce5], /* CJK Ideograph */
- [0x7ce6, 0x7ce6], /* CJK Ideograph */
- [0x7ce7, 0x7ce7], /* CJK Ideograph */
- [0x7ce8, 0x7ce8], /* CJK Ideograph */
- [0x7ce9, 0x7ce9], /* CJK Ideograph */
- [0x7cea, 0x7cea], /* CJK Ideograph */
- [0x7ceb, 0x7ceb], /* CJK Ideograph */
- [0x7cec, 0x7cec], /* CJK Ideograph */
- [0x7ced, 0x7ced], /* CJK Ideograph */
- [0x7cee, 0x7cee], /* CJK Ideograph */
- [0x7cef, 0x7cef], /* CJK Ideograph */
- [0x7cf0, 0x7cf0], /* CJK Ideograph */
- [0x7cf1, 0x7cf1], /* CJK Ideograph */
- [0x7cf2, 0x7cf2], /* CJK Ideograph */
- [0x7cf3, 0x7cf3], /* CJK Ideograph */
- [0x7cf4, 0x7cf4], /* CJK Ideograph */
- [0x7cf5, 0x7cf5], /* CJK Ideograph */
- [0x7cf6, 0x7cf6], /* CJK Ideograph */
- [0x7cf7, 0x7cf7], /* CJK Ideograph */
- [0x7cf8, 0x7cf8], /* CJK Ideograph */
- [0x7cf9, 0x7cf9], /* CJK Ideograph */
- [0x7cfa, 0x7cfa], /* CJK Ideograph */
- [0x7cfb, 0x7cfb], /* CJK Ideograph */
- [0x7cfc, 0x7cfc], /* CJK Ideograph */
- [0x7cfd, 0x7cfd], /* CJK Ideograph */
- [0x7cfe, 0x7cfe], /* CJK Ideograph */
- [0x7cff, 0x7cff], /* CJK Ideograph */
- [0x7d00, 0x7d00], /* CJK Ideograph */
- [0x7d01, 0x7d01], /* CJK Ideograph */
- [0x7d02, 0x7d02], /* CJK Ideograph */
- [0x7d03, 0x7d03], /* CJK Ideograph */
- [0x7d04, 0x7d04], /* CJK Ideograph */
- [0x7d05, 0x7d05], /* CJK Ideograph */
- [0x7d06, 0x7d06], /* CJK Ideograph */
- [0x7d07, 0x7d07], /* CJK Ideograph */
- [0x7d08, 0x7d08], /* CJK Ideograph */
- [0x7d09, 0x7d09], /* CJK Ideograph */
- [0x7d0a, 0x7d0a], /* CJK Ideograph */
- [0x7d0b, 0x7d0b], /* CJK Ideograph */
- [0x7d0c, 0x7d0c], /* CJK Ideograph */
- [0x7d0d, 0x7d0d], /* CJK Ideograph */
- [0x7d0e, 0x7d0e], /* CJK Ideograph */
- [0x7d0f, 0x7d0f], /* CJK Ideograph */
- [0x7d10, 0x7d10], /* CJK Ideograph */
- [0x7d11, 0x7d11], /* CJK Ideograph */
- [0x7d12, 0x7d12], /* CJK Ideograph */
- [0x7d13, 0x7d13], /* CJK Ideograph */
- [0x7d14, 0x7d14], /* CJK Ideograph */
- [0x7d15, 0x7d15], /* CJK Ideograph */
- [0x7d16, 0x7d16], /* CJK Ideograph */
- [0x7d17, 0x7d17], /* CJK Ideograph */
- [0x7d18, 0x7d18], /* CJK Ideograph */
- [0x7d19, 0x7d19], /* CJK Ideograph */
- [0x7d1a, 0x7d1a], /* CJK Ideograph */
- [0x7d1b, 0x7d1b], /* CJK Ideograph */
- [0x7d1c, 0x7d1c], /* CJK Ideograph */
- [0x7d1d, 0x7d1d], /* CJK Ideograph */
- [0x7d1e, 0x7d1e], /* CJK Ideograph */
- [0x7d1f, 0x7d1f], /* CJK Ideograph */
- [0x7d20, 0x7d20], /* CJK Ideograph */
- [0x7d21, 0x7d21], /* CJK Ideograph */
- [0x7d22, 0x7d22], /* CJK Ideograph */
- [0x7d23, 0x7d23], /* CJK Ideograph */
- [0x7d24, 0x7d24], /* CJK Ideograph */
- [0x7d25, 0x7d25], /* CJK Ideograph */
- [0x7d26, 0x7d26], /* CJK Ideograph */
- [0x7d27, 0x7d27], /* CJK Ideograph */
- [0x7d28, 0x7d28], /* CJK Ideograph */
- [0x7d29, 0x7d29], /* CJK Ideograph */
- [0x7d2a, 0x7d2a], /* CJK Ideograph */
- [0x7d2b, 0x7d2b], /* CJK Ideograph */
- [0x7d2c, 0x7d2c], /* CJK Ideograph */
- [0x7d2d, 0x7d2d], /* CJK Ideograph */
- [0x7d2e, 0x7d2e], /* CJK Ideograph */
- [0x7d2f, 0x7d2f], /* CJK Ideograph */
- [0x7d30, 0x7d30], /* CJK Ideograph */
- [0x7d31, 0x7d31], /* CJK Ideograph */
- [0x7d32, 0x7d32], /* CJK Ideograph */
- [0x7d33, 0x7d33], /* CJK Ideograph */
- [0x7d34, 0x7d34], /* CJK Ideograph */
- [0x7d35, 0x7d35], /* CJK Ideograph */
- [0x7d36, 0x7d36], /* CJK Ideograph */
- [0x7d37, 0x7d37], /* CJK Ideograph */
- [0x7d38, 0x7d38], /* CJK Ideograph */
- [0x7d39, 0x7d39], /* CJK Ideograph */
- [0x7d3a, 0x7d3a], /* CJK Ideograph */
- [0x7d3b, 0x7d3b], /* CJK Ideograph */
- [0x7d3c, 0x7d3c], /* CJK Ideograph */
- [0x7d3d, 0x7d3d], /* CJK Ideograph */
- [0x7d3e, 0x7d3e], /* CJK Ideograph */
- [0x7d3f, 0x7d3f], /* CJK Ideograph */
- [0x7d40, 0x7d40], /* CJK Ideograph */
- [0x7d41, 0x7d41], /* CJK Ideograph */
- [0x7d42, 0x7d42], /* CJK Ideograph */
- [0x7d43, 0x7d43], /* CJK Ideograph */
- [0x7d44, 0x7d44], /* CJK Ideograph */
- [0x7d45, 0x7d45], /* CJK Ideograph */
- [0x7d46, 0x7d46], /* CJK Ideograph */
- [0x7d47, 0x7d47], /* CJK Ideograph */
- [0x7d48, 0x7d48], /* CJK Ideograph */
- [0x7d49, 0x7d49], /* CJK Ideograph */
- [0x7d4a, 0x7d4a], /* CJK Ideograph */
- [0x7d4b, 0x7d4b], /* CJK Ideograph */
- [0x7d4c, 0x7d4c], /* CJK Ideograph */
- [0x7d4d, 0x7d4d], /* CJK Ideograph */
- [0x7d4e, 0x7d4e], /* CJK Ideograph */
- [0x7d4f, 0x7d4f], /* CJK Ideograph */
- [0x7d50, 0x7d50], /* CJK Ideograph */
- [0x7d51, 0x7d51], /* CJK Ideograph */
- [0x7d52, 0x7d52], /* CJK Ideograph */
- [0x7d53, 0x7d53], /* CJK Ideograph */
- [0x7d54, 0x7d54], /* CJK Ideograph */
- [0x7d55, 0x7d55], /* CJK Ideograph */
- [0x7d56, 0x7d56], /* CJK Ideograph */
- [0x7d57, 0x7d57], /* CJK Ideograph */
- [0x7d58, 0x7d58], /* CJK Ideograph */
- [0x7d59, 0x7d59], /* CJK Ideograph */
- [0x7d5a, 0x7d5a], /* CJK Ideograph */
- [0x7d5b, 0x7d5b], /* CJK Ideograph */
- [0x7d5c, 0x7d5c], /* CJK Ideograph */
- [0x7d5d, 0x7d5d], /* CJK Ideograph */
- [0x7d5e, 0x7d5e], /* CJK Ideograph */
- [0x7d5f, 0x7d5f], /* CJK Ideograph */
- [0x7d60, 0x7d60], /* CJK Ideograph */
- [0x7d61, 0x7d61], /* CJK Ideograph */
- [0x7d62, 0x7d62], /* CJK Ideograph */
- [0x7d63, 0x7d63], /* CJK Ideograph */
- [0x7d64, 0x7d64], /* CJK Ideograph */
- [0x7d65, 0x7d65], /* CJK Ideograph */
- [0x7d66, 0x7d66], /* CJK Ideograph */
- [0x7d67, 0x7d67], /* CJK Ideograph */
- [0x7d68, 0x7d68], /* CJK Ideograph */
- [0x7d69, 0x7d69], /* CJK Ideograph */
- [0x7d6a, 0x7d6a], /* CJK Ideograph */
- [0x7d6b, 0x7d6b], /* CJK Ideograph */
- [0x7d6c, 0x7d6c], /* CJK Ideograph */
- [0x7d6d, 0x7d6d], /* CJK Ideograph */
- [0x7d6e, 0x7d6e], /* CJK Ideograph */
- [0x7d6f, 0x7d6f], /* CJK Ideograph */
- [0x7d70, 0x7d70], /* CJK Ideograph */
- [0x7d71, 0x7d71], /* CJK Ideograph */
- [0x7d72, 0x7d72], /* CJK Ideograph */
- [0x7d73, 0x7d73], /* CJK Ideograph */
- [0x7d74, 0x7d74], /* CJK Ideograph */
- [0x7d75, 0x7d75], /* CJK Ideograph */
- [0x7d76, 0x7d76], /* CJK Ideograph */
- [0x7d77, 0x7d77], /* CJK Ideograph */
- [0x7d78, 0x7d78], /* CJK Ideograph */
- [0x7d79, 0x7d79], /* CJK Ideograph */
- [0x7d7a, 0x7d7a], /* CJK Ideograph */
- [0x7d7b, 0x7d7b], /* CJK Ideograph */
- [0x7d7c, 0x7d7c], /* CJK Ideograph */
- [0x7d7d, 0x7d7d], /* CJK Ideograph */
- [0x7d7e, 0x7d7e], /* CJK Ideograph */
- [0x7d7f, 0x7d7f], /* CJK Ideograph */
- [0x7d80, 0x7d80], /* CJK Ideograph */
- [0x7d81, 0x7d81], /* CJK Ideograph */
- [0x7d82, 0x7d82], /* CJK Ideograph */
- [0x7d83, 0x7d83], /* CJK Ideograph */
- [0x7d84, 0x7d84], /* CJK Ideograph */
- [0x7d85, 0x7d85], /* CJK Ideograph */
- [0x7d86, 0x7d86], /* CJK Ideograph */
- [0x7d87, 0x7d87], /* CJK Ideograph */
- [0x7d88, 0x7d88], /* CJK Ideograph */
- [0x7d89, 0x7d89], /* CJK Ideograph */
- [0x7d8a, 0x7d8a], /* CJK Ideograph */
- [0x7d8b, 0x7d8b], /* CJK Ideograph */
- [0x7d8c, 0x7d8c], /* CJK Ideograph */
- [0x7d8d, 0x7d8d], /* CJK Ideograph */
- [0x7d8e, 0x7d8e], /* CJK Ideograph */
- [0x7d8f, 0x7d8f], /* CJK Ideograph */
- [0x7d90, 0x7d90], /* CJK Ideograph */
- [0x7d91, 0x7d91], /* CJK Ideograph */
- [0x7d92, 0x7d92], /* CJK Ideograph */
- [0x7d93, 0x7d93], /* CJK Ideograph */
- [0x7d94, 0x7d94], /* CJK Ideograph */
- [0x7d95, 0x7d95], /* CJK Ideograph */
- [0x7d96, 0x7d96], /* CJK Ideograph */
- [0x7d97, 0x7d97], /* CJK Ideograph */
- [0x7d98, 0x7d98], /* CJK Ideograph */
- [0x7d99, 0x7d99], /* CJK Ideograph */
- [0x7d9a, 0x7d9a], /* CJK Ideograph */
- [0x7d9b, 0x7d9b], /* CJK Ideograph */
- [0x7d9c, 0x7d9c], /* CJK Ideograph */
- [0x7d9d, 0x7d9d], /* CJK Ideograph */
- [0x7d9e, 0x7d9e], /* CJK Ideograph */
- [0x7d9f, 0x7d9f], /* CJK Ideograph */
- [0x7da0, 0x7da0], /* CJK Ideograph */
- [0x7da1, 0x7da1], /* CJK Ideograph */
- [0x7da2, 0x7da2], /* CJK Ideograph */
- [0x7da3, 0x7da3], /* CJK Ideograph */
- [0x7da4, 0x7da4], /* CJK Ideograph */
- [0x7da5, 0x7da5], /* CJK Ideograph */
- [0x7da6, 0x7da6], /* CJK Ideograph */
- [0x7da7, 0x7da7], /* CJK Ideograph */
- [0x7da8, 0x7da8], /* CJK Ideograph */
- [0x7da9, 0x7da9], /* CJK Ideograph */
- [0x7daa, 0x7daa], /* CJK Ideograph */
- [0x7dab, 0x7dab], /* CJK Ideograph */
- [0x7dac, 0x7dac], /* CJK Ideograph */
- [0x7dad, 0x7dad], /* CJK Ideograph */
- [0x7dae, 0x7dae], /* CJK Ideograph */
- [0x7daf, 0x7daf], /* CJK Ideograph */
- [0x7db0, 0x7db0], /* CJK Ideograph */
- [0x7db1, 0x7db1], /* CJK Ideograph */
- [0x7db2, 0x7db2], /* CJK Ideograph */
- [0x7db3, 0x7db3], /* CJK Ideograph */
- [0x7db4, 0x7db4], /* CJK Ideograph */
- [0x7db5, 0x7db5], /* CJK Ideograph */
- [0x7db6, 0x7db6], /* CJK Ideograph */
- [0x7db7, 0x7db7], /* CJK Ideograph */
- [0x7db8, 0x7db8], /* CJK Ideograph */
- [0x7db9, 0x7db9], /* CJK Ideograph */
- [0x7dba, 0x7dba], /* CJK Ideograph */
- [0x7dbb, 0x7dbb], /* CJK Ideograph */
- [0x7dbc, 0x7dbc], /* CJK Ideograph */
- [0x7dbd, 0x7dbd], /* CJK Ideograph */
- [0x7dbe, 0x7dbe], /* CJK Ideograph */
- [0x7dbf, 0x7dbf], /* CJK Ideograph */
- [0x7dc0, 0x7dc0], /* CJK Ideograph */
- [0x7dc1, 0x7dc1], /* CJK Ideograph */
- [0x7dc2, 0x7dc2], /* CJK Ideograph */
- [0x7dc3, 0x7dc3], /* CJK Ideograph */
- [0x7dc4, 0x7dc4], /* CJK Ideograph */
- [0x7dc5, 0x7dc5], /* CJK Ideograph */
- [0x7dc6, 0x7dc6], /* CJK Ideograph */
- [0x7dc7, 0x7dc7], /* CJK Ideograph */
- [0x7dc8, 0x7dc8], /* CJK Ideograph */
- [0x7dc9, 0x7dc9], /* CJK Ideograph */
- [0x7dca, 0x7dca], /* CJK Ideograph */
- [0x7dcb, 0x7dcb], /* CJK Ideograph */
- [0x7dcc, 0x7dcc], /* CJK Ideograph */
- [0x7dcd, 0x7dcd], /* CJK Ideograph */
- [0x7dce, 0x7dce], /* CJK Ideograph */
- [0x7dcf, 0x7dcf], /* CJK Ideograph */
- [0x7dd0, 0x7dd0], /* CJK Ideograph */
- [0x7dd1, 0x7dd1], /* CJK Ideograph */
- [0x7dd2, 0x7dd2], /* CJK Ideograph */
- [0x7dd3, 0x7dd3], /* CJK Ideograph */
- [0x7dd4, 0x7dd4], /* CJK Ideograph */
- [0x7dd5, 0x7dd5], /* CJK Ideograph */
- [0x7dd6, 0x7dd6], /* CJK Ideograph */
- [0x7dd7, 0x7dd7], /* CJK Ideograph */
- [0x7dd8, 0x7dd8], /* CJK Ideograph */
- [0x7dd9, 0x7dd9], /* CJK Ideograph */
- [0x7dda, 0x7dda], /* CJK Ideograph */
- [0x7ddb, 0x7ddb], /* CJK Ideograph */
- [0x7ddc, 0x7ddc], /* CJK Ideograph */
- [0x7ddd, 0x7ddd], /* CJK Ideograph */
- [0x7dde, 0x7dde], /* CJK Ideograph */
- [0x7ddf, 0x7ddf], /* CJK Ideograph */
- [0x7de0, 0x7de0], /* CJK Ideograph */
- [0x7de1, 0x7de1], /* CJK Ideograph */
- [0x7de2, 0x7de2], /* CJK Ideograph */
- [0x7de3, 0x7de3], /* CJK Ideograph */
- [0x7de4, 0x7de4], /* CJK Ideograph */
- [0x7de5, 0x7de5], /* CJK Ideograph */
- [0x7de6, 0x7de6], /* CJK Ideograph */
- [0x7de7, 0x7de7], /* CJK Ideograph */
- [0x7de8, 0x7de8], /* CJK Ideograph */
- [0x7de9, 0x7de9], /* CJK Ideograph */
- [0x7dea, 0x7dea], /* CJK Ideograph */
- [0x7deb, 0x7deb], /* CJK Ideograph */
- [0x7dec, 0x7dec], /* CJK Ideograph */
- [0x7ded, 0x7ded], /* CJK Ideograph */
- [0x7dee, 0x7dee], /* CJK Ideograph */
- [0x7def, 0x7def], /* CJK Ideograph */
- [0x7df0, 0x7df0], /* CJK Ideograph */
- [0x7df1, 0x7df1], /* CJK Ideograph */
- [0x7df2, 0x7df2], /* CJK Ideograph */
- [0x7df3, 0x7df3], /* CJK Ideograph */
- [0x7df4, 0x7df4], /* CJK Ideograph */
- [0x7df5, 0x7df5], /* CJK Ideograph */
- [0x7df6, 0x7df6], /* CJK Ideograph */
- [0x7df7, 0x7df7], /* CJK Ideograph */
- [0x7df8, 0x7df8], /* CJK Ideograph */
- [0x7df9, 0x7df9], /* CJK Ideograph */
- [0x7dfa, 0x7dfa], /* CJK Ideograph */
- [0x7dfb, 0x7dfb], /* CJK Ideograph */
- [0x7dfc, 0x7dfc], /* CJK Ideograph */
- [0x7dfd, 0x7dfd], /* CJK Ideograph */
- [0x7dfe, 0x7dfe], /* CJK Ideograph */
- [0x7dff, 0x7dff], /* CJK Ideograph */
- [0x7e00, 0x7e00], /* CJK Ideograph */
- [0x7e01, 0x7e01], /* CJK Ideograph */
- [0x7e02, 0x7e02], /* CJK Ideograph */
- [0x7e03, 0x7e03], /* CJK Ideograph */
- [0x7e04, 0x7e04], /* CJK Ideograph */
- [0x7e05, 0x7e05], /* CJK Ideograph */
- [0x7e06, 0x7e06], /* CJK Ideograph */
- [0x7e07, 0x7e07], /* CJK Ideograph */
- [0x7e08, 0x7e08], /* CJK Ideograph */
- [0x7e09, 0x7e09], /* CJK Ideograph */
- [0x7e0a, 0x7e0a], /* CJK Ideograph */
- [0x7e0b, 0x7e0b], /* CJK Ideograph */
- [0x7e0c, 0x7e0c], /* CJK Ideograph */
- [0x7e0d, 0x7e0d], /* CJK Ideograph */
- [0x7e0e, 0x7e0e], /* CJK Ideograph */
- [0x7e0f, 0x7e0f], /* CJK Ideograph */
- [0x7e10, 0x7e10], /* CJK Ideograph */
- [0x7e11, 0x7e11], /* CJK Ideograph */
- [0x7e12, 0x7e12], /* CJK Ideograph */
- [0x7e13, 0x7e13], /* CJK Ideograph */
- [0x7e14, 0x7e14], /* CJK Ideograph */
- [0x7e15, 0x7e15], /* CJK Ideograph */
- [0x7e16, 0x7e16], /* CJK Ideograph */
- [0x7e17, 0x7e17], /* CJK Ideograph */
- [0x7e18, 0x7e18], /* CJK Ideograph */
- [0x7e19, 0x7e19], /* CJK Ideograph */
- [0x7e1a, 0x7e1a], /* CJK Ideograph */
- [0x7e1b, 0x7e1b], /* CJK Ideograph */
- [0x7e1c, 0x7e1c], /* CJK Ideograph */
- [0x7e1d, 0x7e1d], /* CJK Ideograph */
- [0x7e1e, 0x7e1e], /* CJK Ideograph */
- [0x7e1f, 0x7e1f], /* CJK Ideograph */
- [0x7e20, 0x7e20], /* CJK Ideograph */
- [0x7e21, 0x7e21], /* CJK Ideograph */
- [0x7e22, 0x7e22], /* CJK Ideograph */
- [0x7e23, 0x7e23], /* CJK Ideograph */
- [0x7e24, 0x7e24], /* CJK Ideograph */
- [0x7e25, 0x7e25], /* CJK Ideograph */
- [0x7e26, 0x7e26], /* CJK Ideograph */
- [0x7e27, 0x7e27], /* CJK Ideograph */
- [0x7e28, 0x7e28], /* CJK Ideograph */
- [0x7e29, 0x7e29], /* CJK Ideograph */
- [0x7e2a, 0x7e2a], /* CJK Ideograph */
- [0x7e2b, 0x7e2b], /* CJK Ideograph */
- [0x7e2c, 0x7e2c], /* CJK Ideograph */
- [0x7e2d, 0x7e2d], /* CJK Ideograph */
- [0x7e2e, 0x7e2e], /* CJK Ideograph */
- [0x7e2f, 0x7e2f], /* CJK Ideograph */
- [0x7e30, 0x7e30], /* CJK Ideograph */
- [0x7e31, 0x7e31], /* CJK Ideograph */
- [0x7e32, 0x7e32], /* CJK Ideograph */
- [0x7e33, 0x7e33], /* CJK Ideograph */
- [0x7e34, 0x7e34], /* CJK Ideograph */
- [0x7e35, 0x7e35], /* CJK Ideograph */
- [0x7e36, 0x7e36], /* CJK Ideograph */
- [0x7e37, 0x7e37], /* CJK Ideograph */
- [0x7e38, 0x7e38], /* CJK Ideograph */
- [0x7e39, 0x7e39], /* CJK Ideograph */
- [0x7e3a, 0x7e3a], /* CJK Ideograph */
- [0x7e3b, 0x7e3b], /* CJK Ideograph */
- [0x7e3c, 0x7e3c], /* CJK Ideograph */
- [0x7e3d, 0x7e3d], /* CJK Ideograph */
- [0x7e3e, 0x7e3e], /* CJK Ideograph */
- [0x7e3f, 0x7e3f], /* CJK Ideograph */
- [0x7e40, 0x7e40], /* CJK Ideograph */
- [0x7e41, 0x7e41], /* CJK Ideograph */
- [0x7e42, 0x7e42], /* CJK Ideograph */
- [0x7e43, 0x7e43], /* CJK Ideograph */
- [0x7e44, 0x7e44], /* CJK Ideograph */
- [0x7e45, 0x7e45], /* CJK Ideograph */
- [0x7e46, 0x7e46], /* CJK Ideograph */
- [0x7e47, 0x7e47], /* CJK Ideograph */
- [0x7e48, 0x7e48], /* CJK Ideograph */
- [0x7e49, 0x7e49], /* CJK Ideograph */
- [0x7e4a, 0x7e4a], /* CJK Ideograph */
- [0x7e4b, 0x7e4b], /* CJK Ideograph */
- [0x7e4c, 0x7e4c], /* CJK Ideograph */
- [0x7e4d, 0x7e4d], /* CJK Ideograph */
- [0x7e4e, 0x7e4e], /* CJK Ideograph */
- [0x7e4f, 0x7e4f], /* CJK Ideograph */
- [0x7e50, 0x7e50], /* CJK Ideograph */
- [0x7e51, 0x7e51], /* CJK Ideograph */
- [0x7e52, 0x7e52], /* CJK Ideograph */
- [0x7e53, 0x7e53], /* CJK Ideograph */
- [0x7e54, 0x7e54], /* CJK Ideograph */
- [0x7e55, 0x7e55], /* CJK Ideograph */
- [0x7e56, 0x7e56], /* CJK Ideograph */
- [0x7e57, 0x7e57], /* CJK Ideograph */
- [0x7e58, 0x7e58], /* CJK Ideograph */
- [0x7e59, 0x7e59], /* CJK Ideograph */
- [0x7e5a, 0x7e5a], /* CJK Ideograph */
- [0x7e5b, 0x7e5b], /* CJK Ideograph */
- [0x7e5c, 0x7e5c], /* CJK Ideograph */
- [0x7e5d, 0x7e5d], /* CJK Ideograph */
- [0x7e5e, 0x7e5e], /* CJK Ideograph */
- [0x7e5f, 0x7e5f], /* CJK Ideograph */
- [0x7e60, 0x7e60], /* CJK Ideograph */
- [0x7e61, 0x7e61], /* CJK Ideograph */
- [0x7e62, 0x7e62], /* CJK Ideograph */
- [0x7e63, 0x7e63], /* CJK Ideograph */
- [0x7e64, 0x7e64], /* CJK Ideograph */
- [0x7e65, 0x7e65], /* CJK Ideograph */
- [0x7e66, 0x7e66], /* CJK Ideograph */
- [0x7e67, 0x7e67], /* CJK Ideograph */
- [0x7e68, 0x7e68], /* CJK Ideograph */
- [0x7e69, 0x7e69], /* CJK Ideograph */
- [0x7e6a, 0x7e6a], /* CJK Ideograph */
- [0x7e6b, 0x7e6b], /* CJK Ideograph */
- [0x7e6c, 0x7e6c], /* CJK Ideograph */
- [0x7e6d, 0x7e6d], /* CJK Ideograph */
- [0x7e6e, 0x7e6e], /* CJK Ideograph */
- [0x7e6f, 0x7e6f], /* CJK Ideograph */
- [0x7e70, 0x7e70], /* CJK Ideograph */
- [0x7e71, 0x7e71], /* CJK Ideograph */
- [0x7e72, 0x7e72], /* CJK Ideograph */
- [0x7e73, 0x7e73], /* CJK Ideograph */
- [0x7e74, 0x7e74], /* CJK Ideograph */
- [0x7e75, 0x7e75], /* CJK Ideograph */
- [0x7e76, 0x7e76], /* CJK Ideograph */
- [0x7e77, 0x7e77], /* CJK Ideograph */
- [0x7e78, 0x7e78], /* CJK Ideograph */
- [0x7e79, 0x7e79], /* CJK Ideograph */
- [0x7e7a, 0x7e7a], /* CJK Ideograph */
- [0x7e7b, 0x7e7b], /* CJK Ideograph */
- [0x7e7c, 0x7e7c], /* CJK Ideograph */
- [0x7e7d, 0x7e7d], /* CJK Ideograph */
- [0x7e7e, 0x7e7e], /* CJK Ideograph */
- [0x7e7f, 0x7e7f], /* CJK Ideograph */
- [0x7e80, 0x7e80], /* CJK Ideograph */
- [0x7e81, 0x7e81], /* CJK Ideograph */
- [0x7e82, 0x7e82], /* CJK Ideograph */
- [0x7e83, 0x7e83], /* CJK Ideograph */
- [0x7e84, 0x7e84], /* CJK Ideograph */
- [0x7e85, 0x7e85], /* CJK Ideograph */
- [0x7e86, 0x7e86], /* CJK Ideograph */
- [0x7e87, 0x7e87], /* CJK Ideograph */
- [0x7e88, 0x7e88], /* CJK Ideograph */
- [0x7e89, 0x7e89], /* CJK Ideograph */
- [0x7e8a, 0x7e8a], /* CJK Ideograph */
- [0x7e8b, 0x7e8b], /* CJK Ideograph */
- [0x7e8c, 0x7e8c], /* CJK Ideograph */
- [0x7e8d, 0x7e8d], /* CJK Ideograph */
- [0x7e8e, 0x7e8e], /* CJK Ideograph */
- [0x7e8f, 0x7e8f], /* CJK Ideograph */
- [0x7e90, 0x7e90], /* CJK Ideograph */
- [0x7e91, 0x7e91], /* CJK Ideograph */
- [0x7e92, 0x7e92], /* CJK Ideograph */
- [0x7e93, 0x7e93], /* CJK Ideograph */
- [0x7e94, 0x7e94], /* CJK Ideograph */
- [0x7e95, 0x7e95], /* CJK Ideograph */
- [0x7e96, 0x7e96], /* CJK Ideograph */
- [0x7e97, 0x7e97], /* CJK Ideograph */
- [0x7e98, 0x7e98], /* CJK Ideograph */
- [0x7e99, 0x7e99], /* CJK Ideograph */
- [0x7e9a, 0x7e9a], /* CJK Ideograph */
- [0x7e9b, 0x7e9b], /* CJK Ideograph */
- [0x7e9c, 0x7e9c], /* CJK Ideograph */
- [0x7e9d, 0x7e9d], /* CJK Ideograph */
- [0x7e9e, 0x7e9e], /* CJK Ideograph */
- [0x7e9f, 0x7e9f], /* CJK Ideograph */
- [0x7ea0, 0x7ea0], /* CJK Ideograph */
- [0x7ea1, 0x7ea1], /* CJK Ideograph */
- [0x7ea2, 0x7ea2], /* CJK Ideograph */
- [0x7ea3, 0x7ea3], /* CJK Ideograph */
- [0x7ea4, 0x7ea4], /* CJK Ideograph */
- [0x7ea5, 0x7ea5], /* CJK Ideograph */
- [0x7ea6, 0x7ea6], /* CJK Ideograph */
- [0x7ea7, 0x7ea7], /* CJK Ideograph */
- [0x7ea8, 0x7ea8], /* CJK Ideograph */
- [0x7ea9, 0x7ea9], /* CJK Ideograph */
- [0x7eaa, 0x7eaa], /* CJK Ideograph */
- [0x7eab, 0x7eab], /* CJK Ideograph */
- [0x7eac, 0x7eac], /* CJK Ideograph */
- [0x7ead, 0x7ead], /* CJK Ideograph */
- [0x7eae, 0x7eae], /* CJK Ideograph */
- [0x7eaf, 0x7eaf], /* CJK Ideograph */
- [0x7eb0, 0x7eb0], /* CJK Ideograph */
- [0x7eb1, 0x7eb1], /* CJK Ideograph */
- [0x7eb2, 0x7eb2], /* CJK Ideograph */
- [0x7eb3, 0x7eb3], /* CJK Ideograph */
- [0x7eb4, 0x7eb4], /* CJK Ideograph */
- [0x7eb5, 0x7eb5], /* CJK Ideograph */
- [0x7eb6, 0x7eb6], /* CJK Ideograph */
- [0x7eb7, 0x7eb7], /* CJK Ideograph */
- [0x7eb8, 0x7eb8], /* CJK Ideograph */
- [0x7eb9, 0x7eb9], /* CJK Ideograph */
- [0x7eba, 0x7eba], /* CJK Ideograph */
- [0x7ebb, 0x7ebb], /* CJK Ideograph */
- [0x7ebc, 0x7ebc], /* CJK Ideograph */
- [0x7ebd, 0x7ebd], /* CJK Ideograph */
- [0x7ebe, 0x7ebe], /* CJK Ideograph */
- [0x7ebf, 0x7ebf], /* CJK Ideograph */
- [0x7ec0, 0x7ec0], /* CJK Ideograph */
- [0x7ec1, 0x7ec1], /* CJK Ideograph */
- [0x7ec2, 0x7ec2], /* CJK Ideograph */
- [0x7ec3, 0x7ec3], /* CJK Ideograph */
- [0x7ec4, 0x7ec4], /* CJK Ideograph */
- [0x7ec5, 0x7ec5], /* CJK Ideograph */
- [0x7ec6, 0x7ec6], /* CJK Ideograph */
- [0x7ec7, 0x7ec7], /* CJK Ideograph */
- [0x7ec8, 0x7ec8], /* CJK Ideograph */
- [0x7ec9, 0x7ec9], /* CJK Ideograph */
- [0x7eca, 0x7eca], /* CJK Ideograph */
- [0x7ecb, 0x7ecb], /* CJK Ideograph */
- [0x7ecc, 0x7ecc], /* CJK Ideograph */
- [0x7ecd, 0x7ecd], /* CJK Ideograph */
- [0x7ece, 0x7ece], /* CJK Ideograph */
- [0x7ecf, 0x7ecf], /* CJK Ideograph */
- [0x7ed0, 0x7ed0], /* CJK Ideograph */
- [0x7ed1, 0x7ed1], /* CJK Ideograph */
- [0x7ed2, 0x7ed2], /* CJK Ideograph */
- [0x7ed3, 0x7ed3], /* CJK Ideograph */
- [0x7ed4, 0x7ed4], /* CJK Ideograph */
- [0x7ed5, 0x7ed5], /* CJK Ideograph */
- [0x7ed6, 0x7ed6], /* CJK Ideograph */
- [0x7ed7, 0x7ed7], /* CJK Ideograph */
- [0x7ed8, 0x7ed8], /* CJK Ideograph */
- [0x7ed9, 0x7ed9], /* CJK Ideograph */
- [0x7eda, 0x7eda], /* CJK Ideograph */
- [0x7edb, 0x7edb], /* CJK Ideograph */
- [0x7edc, 0x7edc], /* CJK Ideograph */
- [0x7edd, 0x7edd], /* CJK Ideograph */
- [0x7ede, 0x7ede], /* CJK Ideograph */
- [0x7edf, 0x7edf], /* CJK Ideograph */
- [0x7ee0, 0x7ee0], /* CJK Ideograph */
- [0x7ee1, 0x7ee1], /* CJK Ideograph */
- [0x7ee2, 0x7ee2], /* CJK Ideograph */
- [0x7ee3, 0x7ee3], /* CJK Ideograph */
- [0x7ee4, 0x7ee4], /* CJK Ideograph */
- [0x7ee5, 0x7ee5], /* CJK Ideograph */
- [0x7ee6, 0x7ee6], /* CJK Ideograph */
- [0x7ee7, 0x7ee7], /* CJK Ideograph */
- [0x7ee8, 0x7ee8], /* CJK Ideograph */
- [0x7ee9, 0x7ee9], /* CJK Ideograph */
- [0x7eea, 0x7eea], /* CJK Ideograph */
- [0x7eeb, 0x7eeb], /* CJK Ideograph */
- [0x7eec, 0x7eec], /* CJK Ideograph */
- [0x7eed, 0x7eed], /* CJK Ideograph */
- [0x7eee, 0x7eee], /* CJK Ideograph */
- [0x7eef, 0x7eef], /* CJK Ideograph */
- [0x7ef0, 0x7ef0], /* CJK Ideograph */
- [0x7ef1, 0x7ef1], /* CJK Ideograph */
- [0x7ef2, 0x7ef2], /* CJK Ideograph */
- [0x7ef3, 0x7ef3], /* CJK Ideograph */
- [0x7ef4, 0x7ef4], /* CJK Ideograph */
- [0x7ef5, 0x7ef5], /* CJK Ideograph */
- [0x7ef6, 0x7ef6], /* CJK Ideograph */
- [0x7ef7, 0x7ef7], /* CJK Ideograph */
- [0x7ef8, 0x7ef8], /* CJK Ideograph */
- [0x7ef9, 0x7ef9], /* CJK Ideograph */
- [0x7efa, 0x7efa], /* CJK Ideograph */
- [0x7efb, 0x7efb], /* CJK Ideograph */
- [0x7efc, 0x7efc], /* CJK Ideograph */
- [0x7efd, 0x7efd], /* CJK Ideograph */
- [0x7efe, 0x7efe], /* CJK Ideograph */
- [0x7eff, 0x7eff], /* CJK Ideograph */
- [0x7f00, 0x7f00], /* CJK Ideograph */
- [0x7f01, 0x7f01], /* CJK Ideograph */
- [0x7f02, 0x7f02], /* CJK Ideograph */
- [0x7f03, 0x7f03], /* CJK Ideograph */
- [0x7f04, 0x7f04], /* CJK Ideograph */
- [0x7f05, 0x7f05], /* CJK Ideograph */
- [0x7f06, 0x7f06], /* CJK Ideograph */
- [0x7f07, 0x7f07], /* CJK Ideograph */
- [0x7f08, 0x7f08], /* CJK Ideograph */
- [0x7f09, 0x7f09], /* CJK Ideograph */
- [0x7f0a, 0x7f0a], /* CJK Ideograph */
- [0x7f0b, 0x7f0b], /* CJK Ideograph */
- [0x7f0c, 0x7f0c], /* CJK Ideograph */
- [0x7f0d, 0x7f0d], /* CJK Ideograph */
- [0x7f0e, 0x7f0e], /* CJK Ideograph */
- [0x7f0f, 0x7f0f], /* CJK Ideograph */
- [0x7f10, 0x7f10], /* CJK Ideograph */
- [0x7f11, 0x7f11], /* CJK Ideograph */
- [0x7f12, 0x7f12], /* CJK Ideograph */
- [0x7f13, 0x7f13], /* CJK Ideograph */
- [0x7f14, 0x7f14], /* CJK Ideograph */
- [0x7f15, 0x7f15], /* CJK Ideograph */
- [0x7f16, 0x7f16], /* CJK Ideograph */
- [0x7f17, 0x7f17], /* CJK Ideograph */
- [0x7f18, 0x7f18], /* CJK Ideograph */
- [0x7f19, 0x7f19], /* CJK Ideograph */
- [0x7f1a, 0x7f1a], /* CJK Ideograph */
- [0x7f1b, 0x7f1b], /* CJK Ideograph */
- [0x7f1c, 0x7f1c], /* CJK Ideograph */
- [0x7f1d, 0x7f1d], /* CJK Ideograph */
- [0x7f1e, 0x7f1e], /* CJK Ideograph */
- [0x7f1f, 0x7f1f], /* CJK Ideograph */
- [0x7f20, 0x7f20], /* CJK Ideograph */
- [0x7f21, 0x7f21], /* CJK Ideograph */
- [0x7f22, 0x7f22], /* CJK Ideograph */
- [0x7f23, 0x7f23], /* CJK Ideograph */
- [0x7f24, 0x7f24], /* CJK Ideograph */
- [0x7f25, 0x7f25], /* CJK Ideograph */
- [0x7f26, 0x7f26], /* CJK Ideograph */
- [0x7f27, 0x7f27], /* CJK Ideograph */
- [0x7f28, 0x7f28], /* CJK Ideograph */
- [0x7f29, 0x7f29], /* CJK Ideograph */
- [0x7f2a, 0x7f2a], /* CJK Ideograph */
- [0x7f2b, 0x7f2b], /* CJK Ideograph */
- [0x7f2c, 0x7f2c], /* CJK Ideograph */
- [0x7f2d, 0x7f2d], /* CJK Ideograph */
- [0x7f2e, 0x7f2e], /* CJK Ideograph */
- [0x7f2f, 0x7f2f], /* CJK Ideograph */
- [0x7f30, 0x7f30], /* CJK Ideograph */
- [0x7f31, 0x7f31], /* CJK Ideograph */
- [0x7f32, 0x7f32], /* CJK Ideograph */
- [0x7f33, 0x7f33], /* CJK Ideograph */
- [0x7f34, 0x7f34], /* CJK Ideograph */
- [0x7f35, 0x7f35], /* CJK Ideograph */
- [0x7f36, 0x7f36], /* CJK Ideograph */
- [0x7f37, 0x7f37], /* CJK Ideograph */
- [0x7f38, 0x7f38], /* CJK Ideograph */
- [0x7f39, 0x7f39], /* CJK Ideograph */
- [0x7f3a, 0x7f3a], /* CJK Ideograph */
- [0x7f3b, 0x7f3b], /* CJK Ideograph */
- [0x7f3c, 0x7f3c], /* CJK Ideograph */
- [0x7f3d, 0x7f3d], /* CJK Ideograph */
- [0x7f3e, 0x7f3e], /* CJK Ideograph */
- [0x7f3f, 0x7f3f], /* CJK Ideograph */
- [0x7f40, 0x7f40], /* CJK Ideograph */
- [0x7f41, 0x7f41], /* CJK Ideograph */
- [0x7f42, 0x7f42], /* CJK Ideograph */
- [0x7f43, 0x7f43], /* CJK Ideograph */
- [0x7f44, 0x7f44], /* CJK Ideograph */
- [0x7f45, 0x7f45], /* CJK Ideograph */
- [0x7f46, 0x7f46], /* CJK Ideograph */
- [0x7f47, 0x7f47], /* CJK Ideograph */
- [0x7f48, 0x7f48], /* CJK Ideograph */
- [0x7f49, 0x7f49], /* CJK Ideograph */
- [0x7f4a, 0x7f4a], /* CJK Ideograph */
- [0x7f4b, 0x7f4b], /* CJK Ideograph */
- [0x7f4c, 0x7f4c], /* CJK Ideograph */
- [0x7f4d, 0x7f4d], /* CJK Ideograph */
- [0x7f4e, 0x7f4e], /* CJK Ideograph */
- [0x7f4f, 0x7f4f], /* CJK Ideograph */
- [0x7f50, 0x7f50], /* CJK Ideograph */
- [0x7f51, 0x7f51], /* CJK Ideograph */
- [0x7f52, 0x7f52], /* CJK Ideograph */
- [0x7f53, 0x7f53], /* CJK Ideograph */
- [0x7f54, 0x7f54], /* CJK Ideograph */
- [0x7f55, 0x7f55], /* CJK Ideograph */
- [0x7f56, 0x7f56], /* CJK Ideograph */
- [0x7f57, 0x7f57], /* CJK Ideograph */
- [0x7f58, 0x7f58], /* CJK Ideograph */
- [0x7f59, 0x7f59], /* CJK Ideograph */
- [0x7f5a, 0x7f5a], /* CJK Ideograph */
- [0x7f5b, 0x7f5b], /* CJK Ideograph */
- [0x7f5c, 0x7f5c], /* CJK Ideograph */
- [0x7f5d, 0x7f5d], /* CJK Ideograph */
- [0x7f5e, 0x7f5e], /* CJK Ideograph */
- [0x7f5f, 0x7f5f], /* CJK Ideograph */
- [0x7f60, 0x7f60], /* CJK Ideograph */
- [0x7f61, 0x7f61], /* CJK Ideograph */
- [0x7f62, 0x7f62], /* CJK Ideograph */
- [0x7f63, 0x7f63], /* CJK Ideograph */
- [0x7f64, 0x7f64], /* CJK Ideograph */
- [0x7f65, 0x7f65], /* CJK Ideograph */
- [0x7f66, 0x7f66], /* CJK Ideograph */
- [0x7f67, 0x7f67], /* CJK Ideograph */
- [0x7f68, 0x7f68], /* CJK Ideograph */
- [0x7f69, 0x7f69], /* CJK Ideograph */
- [0x7f6a, 0x7f6a], /* CJK Ideograph */
- [0x7f6b, 0x7f6b], /* CJK Ideograph */
- [0x7f6c, 0x7f6c], /* CJK Ideograph */
- [0x7f6d, 0x7f6d], /* CJK Ideograph */
- [0x7f6e, 0x7f6e], /* CJK Ideograph */
- [0x7f6f, 0x7f6f], /* CJK Ideograph */
- [0x7f70, 0x7f70], /* CJK Ideograph */
- [0x7f71, 0x7f71], /* CJK Ideograph */
- [0x7f72, 0x7f72], /* CJK Ideograph */
- [0x7f73, 0x7f73], /* CJK Ideograph */
- [0x7f74, 0x7f74], /* CJK Ideograph */
- [0x7f75, 0x7f75], /* CJK Ideograph */
- [0x7f76, 0x7f76], /* CJK Ideograph */
- [0x7f77, 0x7f77], /* CJK Ideograph */
- [0x7f78, 0x7f78], /* CJK Ideograph */
- [0x7f79, 0x7f79], /* CJK Ideograph */
- [0x7f7a, 0x7f7a], /* CJK Ideograph */
- [0x7f7b, 0x7f7b], /* CJK Ideograph */
- [0x7f7c, 0x7f7c], /* CJK Ideograph */
- [0x7f7d, 0x7f7d], /* CJK Ideograph */
- [0x7f7e, 0x7f7e], /* CJK Ideograph */
- [0x7f7f, 0x7f7f], /* CJK Ideograph */
- [0x7f80, 0x7f80], /* CJK Ideograph */
- [0x7f81, 0x7f81], /* CJK Ideograph */
- [0x7f82, 0x7f82], /* CJK Ideograph */
- [0x7f83, 0x7f83], /* CJK Ideograph */
- [0x7f84, 0x7f84], /* CJK Ideograph */
- [0x7f85, 0x7f85], /* CJK Ideograph */
- [0x7f86, 0x7f86], /* CJK Ideograph */
- [0x7f87, 0x7f87], /* CJK Ideograph */
- [0x7f88, 0x7f88], /* CJK Ideograph */
- [0x7f89, 0x7f89], /* CJK Ideograph */
- [0x7f8a, 0x7f8a], /* CJK Ideograph */
- [0x7f8b, 0x7f8b], /* CJK Ideograph */
- [0x7f8c, 0x7f8c], /* CJK Ideograph */
- [0x7f8d, 0x7f8d], /* CJK Ideograph */
- [0x7f8e, 0x7f8e], /* CJK Ideograph */
- [0x7f8f, 0x7f8f], /* CJK Ideograph */
- [0x7f90, 0x7f90], /* CJK Ideograph */
- [0x7f91, 0x7f91], /* CJK Ideograph */
- [0x7f92, 0x7f92], /* CJK Ideograph */
- [0x7f93, 0x7f93], /* CJK Ideograph */
- [0x7f94, 0x7f94], /* CJK Ideograph */
- [0x7f95, 0x7f95], /* CJK Ideograph */
- [0x7f96, 0x7f96], /* CJK Ideograph */
- [0x7f97, 0x7f97], /* CJK Ideograph */
- [0x7f98, 0x7f98], /* CJK Ideograph */
- [0x7f99, 0x7f99], /* CJK Ideograph */
- [0x7f9a, 0x7f9a], /* CJK Ideograph */
- [0x7f9b, 0x7f9b], /* CJK Ideograph */
- [0x7f9c, 0x7f9c], /* CJK Ideograph */
- [0x7f9d, 0x7f9d], /* CJK Ideograph */
- [0x7f9e, 0x7f9e], /* CJK Ideograph */
- [0x7f9f, 0x7f9f], /* CJK Ideograph */
- [0x7fa0, 0x7fa0], /* CJK Ideograph */
- [0x7fa1, 0x7fa1], /* CJK Ideograph */
- [0x7fa2, 0x7fa2], /* CJK Ideograph */
- [0x7fa3, 0x7fa3], /* CJK Ideograph */
- [0x7fa4, 0x7fa4], /* CJK Ideograph */
- [0x7fa5, 0x7fa5], /* CJK Ideograph */
- [0x7fa6, 0x7fa6], /* CJK Ideograph */
- [0x7fa7, 0x7fa7], /* CJK Ideograph */
- [0x7fa8, 0x7fa8], /* CJK Ideograph */
- [0x7fa9, 0x7fa9], /* CJK Ideograph */
- [0x7faa, 0x7faa], /* CJK Ideograph */
- [0x7fab, 0x7fab], /* CJK Ideograph */
- [0x7fac, 0x7fac], /* CJK Ideograph */
- [0x7fad, 0x7fad], /* CJK Ideograph */
- [0x7fae, 0x7fae], /* CJK Ideograph */
- [0x7faf, 0x7faf], /* CJK Ideograph */
- [0x7fb0, 0x7fb0], /* CJK Ideograph */
- [0x7fb1, 0x7fb1], /* CJK Ideograph */
- [0x7fb2, 0x7fb2], /* CJK Ideograph */
- [0x7fb3, 0x7fb3], /* CJK Ideograph */
- [0x7fb4, 0x7fb4], /* CJK Ideograph */
- [0x7fb5, 0x7fb5], /* CJK Ideograph */
- [0x7fb6, 0x7fb6], /* CJK Ideograph */
- [0x7fb7, 0x7fb7], /* CJK Ideograph */
- [0x7fb8, 0x7fb8], /* CJK Ideograph */
- [0x7fb9, 0x7fb9], /* CJK Ideograph */
- [0x7fba, 0x7fba], /* CJK Ideograph */
- [0x7fbb, 0x7fbb], /* CJK Ideograph */
- [0x7fbc, 0x7fbc], /* CJK Ideograph */
- [0x7fbd, 0x7fbd], /* CJK Ideograph */
- [0x7fbe, 0x7fbe], /* CJK Ideograph */
- [0x7fbf, 0x7fbf], /* CJK Ideograph */
- [0x7fc0, 0x7fc0], /* CJK Ideograph */
- [0x7fc1, 0x7fc1], /* CJK Ideograph */
- [0x7fc2, 0x7fc2], /* CJK Ideograph */
- [0x7fc3, 0x7fc3], /* CJK Ideograph */
- [0x7fc4, 0x7fc4], /* CJK Ideograph */
- [0x7fc5, 0x7fc5], /* CJK Ideograph */
- [0x7fc6, 0x7fc6], /* CJK Ideograph */
- [0x7fc7, 0x7fc7], /* CJK Ideograph */
- [0x7fc8, 0x7fc8], /* CJK Ideograph */
- [0x7fc9, 0x7fc9], /* CJK Ideograph */
- [0x7fca, 0x7fca], /* CJK Ideograph */
- [0x7fcb, 0x7fcb], /* CJK Ideograph */
- [0x7fcc, 0x7fcc], /* CJK Ideograph */
- [0x7fcd, 0x7fcd], /* CJK Ideograph */
- [0x7fce, 0x7fce], /* CJK Ideograph */
- [0x7fcf, 0x7fcf], /* CJK Ideograph */
- [0x7fd0, 0x7fd0], /* CJK Ideograph */
- [0x7fd1, 0x7fd1], /* CJK Ideograph */
- [0x7fd2, 0x7fd2], /* CJK Ideograph */
- [0x7fd3, 0x7fd3], /* CJK Ideograph */
- [0x7fd4, 0x7fd4], /* CJK Ideograph */
- [0x7fd5, 0x7fd5], /* CJK Ideograph */
- [0x7fd6, 0x7fd6], /* CJK Ideograph */
- [0x7fd7, 0x7fd7], /* CJK Ideograph */
- [0x7fd8, 0x7fd8], /* CJK Ideograph */
- [0x7fd9, 0x7fd9], /* CJK Ideograph */
- [0x7fda, 0x7fda], /* CJK Ideograph */
- [0x7fdb, 0x7fdb], /* CJK Ideograph */
- [0x7fdc, 0x7fdc], /* CJK Ideograph */
- [0x7fdd, 0x7fdd], /* CJK Ideograph */
- [0x7fde, 0x7fde], /* CJK Ideograph */
- [0x7fdf, 0x7fdf], /* CJK Ideograph */
- [0x7fe0, 0x7fe0], /* CJK Ideograph */
- [0x7fe1, 0x7fe1], /* CJK Ideograph */
- [0x7fe2, 0x7fe2], /* CJK Ideograph */
- [0x7fe3, 0x7fe3], /* CJK Ideograph */
- [0x7fe4, 0x7fe4], /* CJK Ideograph */
- [0x7fe5, 0x7fe5], /* CJK Ideograph */
- [0x7fe6, 0x7fe6], /* CJK Ideograph */
- [0x7fe7, 0x7fe7], /* CJK Ideograph */
- [0x7fe8, 0x7fe8], /* CJK Ideograph */
- [0x7fe9, 0x7fe9], /* CJK Ideograph */
- [0x7fea, 0x7fea], /* CJK Ideograph */
- [0x7feb, 0x7feb], /* CJK Ideograph */
- [0x7fec, 0x7fec], /* CJK Ideograph */
- [0x7fed, 0x7fed], /* CJK Ideograph */
- [0x7fee, 0x7fee], /* CJK Ideograph */
- [0x7fef, 0x7fef], /* CJK Ideograph */
- [0x7ff0, 0x7ff0], /* CJK Ideograph */
- [0x7ff1, 0x7ff1], /* CJK Ideograph */
- [0x7ff2, 0x7ff2], /* CJK Ideograph */
- [0x7ff3, 0x7ff3], /* CJK Ideograph */
- [0x7ff4, 0x7ff4], /* CJK Ideograph */
- [0x7ff5, 0x7ff5], /* CJK Ideograph */
- [0x7ff6, 0x7ff6], /* CJK Ideograph */
- [0x7ff7, 0x7ff7], /* CJK Ideograph */
- [0x7ff8, 0x7ff8], /* CJK Ideograph */
- [0x7ff9, 0x7ff9], /* CJK Ideograph */
- [0x7ffa, 0x7ffa], /* CJK Ideograph */
- [0x7ffb, 0x7ffb], /* CJK Ideograph */
- [0x7ffc, 0x7ffc], /* CJK Ideograph */
- [0x7ffd, 0x7ffd], /* CJK Ideograph */
- [0x7ffe, 0x7ffe], /* CJK Ideograph */
- [0x7fff, 0x7fff], /* CJK Ideograph */
- [0x8000, 0x8000], /* CJK Ideograph */
- [0x8001, 0x8001], /* CJK Ideograph */
- [0x8002, 0x8002], /* CJK Ideograph */
- [0x8003, 0x8003], /* CJK Ideograph */
- [0x8004, 0x8004], /* CJK Ideograph */
- [0x8005, 0x8005], /* CJK Ideograph */
- [0x8006, 0x8006], /* CJK Ideograph */
- [0x8007, 0x8007], /* CJK Ideograph */
- [0x8008, 0x8008], /* CJK Ideograph */
- [0x8009, 0x8009], /* CJK Ideograph */
- [0x800a, 0x800a], /* CJK Ideograph */
- [0x800b, 0x800b], /* CJK Ideograph */
- [0x800c, 0x800c], /* CJK Ideograph */
- [0x800d, 0x800d], /* CJK Ideograph */
- [0x800e, 0x800e], /* CJK Ideograph */
- [0x800f, 0x800f], /* CJK Ideograph */
- [0x8010, 0x8010], /* CJK Ideograph */
- [0x8011, 0x8011], /* CJK Ideograph */
- [0x8012, 0x8012], /* CJK Ideograph */
- [0x8013, 0x8013], /* CJK Ideograph */
- [0x8014, 0x8014], /* CJK Ideograph */
- [0x8015, 0x8015], /* CJK Ideograph */
- [0x8016, 0x8016], /* CJK Ideograph */
- [0x8017, 0x8017], /* CJK Ideograph */
- [0x8018, 0x8018], /* CJK Ideograph */
- [0x8019, 0x8019], /* CJK Ideograph */
- [0x801a, 0x801a], /* CJK Ideograph */
- [0x801b, 0x801b], /* CJK Ideograph */
- [0x801c, 0x801c], /* CJK Ideograph */
- [0x801d, 0x801d], /* CJK Ideograph */
- [0x801e, 0x801e], /* CJK Ideograph */
- [0x801f, 0x801f], /* CJK Ideograph */
- [0x8020, 0x8020], /* CJK Ideograph */
- [0x8021, 0x8021], /* CJK Ideograph */
- [0x8022, 0x8022], /* CJK Ideograph */
- [0x8023, 0x8023], /* CJK Ideograph */
- [0x8024, 0x8024], /* CJK Ideograph */
- [0x8025, 0x8025], /* CJK Ideograph */
- [0x8026, 0x8026], /* CJK Ideograph */
- [0x8027, 0x8027], /* CJK Ideograph */
- [0x8028, 0x8028], /* CJK Ideograph */
- [0x8029, 0x8029], /* CJK Ideograph */
- [0x802a, 0x802a], /* CJK Ideograph */
- [0x802b, 0x802b], /* CJK Ideograph */
- [0x802c, 0x802c], /* CJK Ideograph */
- [0x802d, 0x802d], /* CJK Ideograph */
- [0x802e, 0x802e], /* CJK Ideograph */
- [0x802f, 0x802f], /* CJK Ideograph */
- [0x8030, 0x8030], /* CJK Ideograph */
- [0x8031, 0x8031], /* CJK Ideograph */
- [0x8032, 0x8032], /* CJK Ideograph */
- [0x8033, 0x8033], /* CJK Ideograph */
- [0x8034, 0x8034], /* CJK Ideograph */
- [0x8035, 0x8035], /* CJK Ideograph */
- [0x8036, 0x8036], /* CJK Ideograph */
- [0x8037, 0x8037], /* CJK Ideograph */
- [0x8038, 0x8038], /* CJK Ideograph */
- [0x8039, 0x8039], /* CJK Ideograph */
- [0x803a, 0x803a], /* CJK Ideograph */
- [0x803b, 0x803b], /* CJK Ideograph */
- [0x803c, 0x803c], /* CJK Ideograph */
- [0x803d, 0x803d], /* CJK Ideograph */
- [0x803e, 0x803e], /* CJK Ideograph */
- [0x803f, 0x803f], /* CJK Ideograph */
- [0x8040, 0x8040], /* CJK Ideograph */
- [0x8041, 0x8041], /* CJK Ideograph */
- [0x8042, 0x8042], /* CJK Ideograph */
- [0x8043, 0x8043], /* CJK Ideograph */
- [0x8044, 0x8044], /* CJK Ideograph */
- [0x8045, 0x8045], /* CJK Ideograph */
- [0x8046, 0x8046], /* CJK Ideograph */
- [0x8047, 0x8047], /* CJK Ideograph */
- [0x8048, 0x8048], /* CJK Ideograph */
- [0x8049, 0x8049], /* CJK Ideograph */
- [0x804a, 0x804a], /* CJK Ideograph */
- [0x804b, 0x804b], /* CJK Ideograph */
- [0x804c, 0x804c], /* CJK Ideograph */
- [0x804d, 0x804d], /* CJK Ideograph */
- [0x804e, 0x804e], /* CJK Ideograph */
- [0x804f, 0x804f], /* CJK Ideograph */
- [0x8050, 0x8050], /* CJK Ideograph */
- [0x8051, 0x8051], /* CJK Ideograph */
- [0x8052, 0x8052], /* CJK Ideograph */
- [0x8053, 0x8053], /* CJK Ideograph */
- [0x8054, 0x8054], /* CJK Ideograph */
- [0x8055, 0x8055], /* CJK Ideograph */
- [0x8056, 0x8056], /* CJK Ideograph */
- [0x8057, 0x8057], /* CJK Ideograph */
- [0x8058, 0x8058], /* CJK Ideograph */
- [0x8059, 0x8059], /* CJK Ideograph */
- [0x805a, 0x805a], /* CJK Ideograph */
- [0x805b, 0x805b], /* CJK Ideograph */
- [0x805c, 0x805c], /* CJK Ideograph */
- [0x805d, 0x805d], /* CJK Ideograph */
- [0x805e, 0x805e], /* CJK Ideograph */
- [0x805f, 0x805f], /* CJK Ideograph */
- [0x8060, 0x8060], /* CJK Ideograph */
- [0x8061, 0x8061], /* CJK Ideograph */
- [0x8062, 0x8062], /* CJK Ideograph */
- [0x8063, 0x8063], /* CJK Ideograph */
- [0x8064, 0x8064], /* CJK Ideograph */
- [0x8065, 0x8065], /* CJK Ideograph */
- [0x8066, 0x8066], /* CJK Ideograph */
- [0x8067, 0x8067], /* CJK Ideograph */
- [0x8068, 0x8068], /* CJK Ideograph */
- [0x8069, 0x8069], /* CJK Ideograph */
- [0x806a, 0x806a], /* CJK Ideograph */
- [0x806b, 0x806b], /* CJK Ideograph */
- [0x806c, 0x806c], /* CJK Ideograph */
- [0x806d, 0x806d], /* CJK Ideograph */
- [0x806e, 0x806e], /* CJK Ideograph */
- [0x806f, 0x806f], /* CJK Ideograph */
- [0x8070, 0x8070], /* CJK Ideograph */
- [0x8071, 0x8071], /* CJK Ideograph */
- [0x8072, 0x8072], /* CJK Ideograph */
- [0x8073, 0x8073], /* CJK Ideograph */
- [0x8074, 0x8074], /* CJK Ideograph */
- [0x8075, 0x8075], /* CJK Ideograph */
- [0x8076, 0x8076], /* CJK Ideograph */
- [0x8077, 0x8077], /* CJK Ideograph */
- [0x8078, 0x8078], /* CJK Ideograph */
- [0x8079, 0x8079], /* CJK Ideograph */
- [0x807a, 0x807a], /* CJK Ideograph */
- [0x807b, 0x807b], /* CJK Ideograph */
- [0x807c, 0x807c], /* CJK Ideograph */
- [0x807d, 0x807d], /* CJK Ideograph */
- [0x807e, 0x807e], /* CJK Ideograph */
- [0x807f, 0x807f], /* CJK Ideograph */
- [0x8080, 0x8080], /* CJK Ideograph */
- [0x8081, 0x8081], /* CJK Ideograph */
- [0x8082, 0x8082], /* CJK Ideograph */
- [0x8083, 0x8083], /* CJK Ideograph */
- [0x8084, 0x8084], /* CJK Ideograph */
- [0x8085, 0x8085], /* CJK Ideograph */
- [0x8086, 0x8086], /* CJK Ideograph */
- [0x8087, 0x8087], /* CJK Ideograph */
- [0x8088, 0x8088], /* CJK Ideograph */
- [0x8089, 0x8089], /* CJK Ideograph */
- [0x808a, 0x808a], /* CJK Ideograph */
- [0x808b, 0x808b], /* CJK Ideograph */
- [0x808c, 0x808c], /* CJK Ideograph */
- [0x808d, 0x808d], /* CJK Ideograph */
- [0x808e, 0x808e], /* CJK Ideograph */
- [0x808f, 0x808f], /* CJK Ideograph */
- [0x8090, 0x8090], /* CJK Ideograph */
- [0x8091, 0x8091], /* CJK Ideograph */
- [0x8092, 0x8092], /* CJK Ideograph */
- [0x8093, 0x8093], /* CJK Ideograph */
- [0x8094, 0x8094], /* CJK Ideograph */
- [0x8095, 0x8095], /* CJK Ideograph */
- [0x8096, 0x8096], /* CJK Ideograph */
- [0x8097, 0x8097], /* CJK Ideograph */
- [0x8098, 0x8098], /* CJK Ideograph */
- [0x8099, 0x8099], /* CJK Ideograph */
- [0x809a, 0x809a], /* CJK Ideograph */
- [0x809b, 0x809b], /* CJK Ideograph */
- [0x809c, 0x809c], /* CJK Ideograph */
- [0x809d, 0x809d], /* CJK Ideograph */
- [0x809e, 0x809e], /* CJK Ideograph */
- [0x809f, 0x809f], /* CJK Ideograph */
- [0x80a0, 0x80a0], /* CJK Ideograph */
- [0x80a1, 0x80a1], /* CJK Ideograph */
- [0x80a2, 0x80a2], /* CJK Ideograph */
- [0x80a3, 0x80a3], /* CJK Ideograph */
- [0x80a4, 0x80a4], /* CJK Ideograph */
- [0x80a5, 0x80a5], /* CJK Ideograph */
- [0x80a6, 0x80a6], /* CJK Ideograph */
- [0x80a7, 0x80a7], /* CJK Ideograph */
- [0x80a8, 0x80a8], /* CJK Ideograph */
- [0x80a9, 0x80a9], /* CJK Ideograph */
- [0x80aa, 0x80aa], /* CJK Ideograph */
- [0x80ab, 0x80ab], /* CJK Ideograph */
- [0x80ac, 0x80ac], /* CJK Ideograph */
- [0x80ad, 0x80ad], /* CJK Ideograph */
- [0x80ae, 0x80ae], /* CJK Ideograph */
- [0x80af, 0x80af], /* CJK Ideograph */
- [0x80b0, 0x80b0], /* CJK Ideograph */
- [0x80b1, 0x80b1], /* CJK Ideograph */
- [0x80b2, 0x80b2], /* CJK Ideograph */
- [0x80b3, 0x80b3], /* CJK Ideograph */
- [0x80b4, 0x80b4], /* CJK Ideograph */
- [0x80b5, 0x80b5], /* CJK Ideograph */
- [0x80b6, 0x80b6], /* CJK Ideograph */
- [0x80b7, 0x80b7], /* CJK Ideograph */
- [0x80b8, 0x80b8], /* CJK Ideograph */
- [0x80b9, 0x80b9], /* CJK Ideograph */
- [0x80ba, 0x80ba], /* CJK Ideograph */
- [0x80bb, 0x80bb], /* CJK Ideograph */
- [0x80bc, 0x80bc], /* CJK Ideograph */
- [0x80bd, 0x80bd], /* CJK Ideograph */
- [0x80be, 0x80be], /* CJK Ideograph */
- [0x80bf, 0x80bf], /* CJK Ideograph */
- [0x80c0, 0x80c0], /* CJK Ideograph */
- [0x80c1, 0x80c1], /* CJK Ideograph */
- [0x80c2, 0x80c2], /* CJK Ideograph */
- [0x80c3, 0x80c3], /* CJK Ideograph */
- [0x80c4, 0x80c4], /* CJK Ideograph */
- [0x80c5, 0x80c5], /* CJK Ideograph */
- [0x80c6, 0x80c6], /* CJK Ideograph */
- [0x80c7, 0x80c7], /* CJK Ideograph */
- [0x80c8, 0x80c8], /* CJK Ideograph */
- [0x80c9, 0x80c9], /* CJK Ideograph */
- [0x80ca, 0x80ca], /* CJK Ideograph */
- [0x80cb, 0x80cb], /* CJK Ideograph */
- [0x80cc, 0x80cc], /* CJK Ideograph */
- [0x80cd, 0x80cd], /* CJK Ideograph */
- [0x80ce, 0x80ce], /* CJK Ideograph */
- [0x80cf, 0x80cf], /* CJK Ideograph */
- [0x80d0, 0x80d0], /* CJK Ideograph */
- [0x80d1, 0x80d1], /* CJK Ideograph */
- [0x80d2, 0x80d2], /* CJK Ideograph */
- [0x80d3, 0x80d3], /* CJK Ideograph */
- [0x80d4, 0x80d4], /* CJK Ideograph */
- [0x80d5, 0x80d5], /* CJK Ideograph */
- [0x80d6, 0x80d6], /* CJK Ideograph */
- [0x80d7, 0x80d7], /* CJK Ideograph */
- [0x80d8, 0x80d8], /* CJK Ideograph */
- [0x80d9, 0x80d9], /* CJK Ideograph */
- [0x80da, 0x80da], /* CJK Ideograph */
- [0x80db, 0x80db], /* CJK Ideograph */
- [0x80dc, 0x80dc], /* CJK Ideograph */
- [0x80dd, 0x80dd], /* CJK Ideograph */
- [0x80de, 0x80de], /* CJK Ideograph */
- [0x80df, 0x80df], /* CJK Ideograph */
- [0x80e0, 0x80e0], /* CJK Ideograph */
- [0x80e1, 0x80e1], /* CJK Ideograph */
- [0x80e2, 0x80e2], /* CJK Ideograph */
- [0x80e3, 0x80e3], /* CJK Ideograph */
- [0x80e4, 0x80e4], /* CJK Ideograph */
- [0x80e5, 0x80e5], /* CJK Ideograph */
- [0x80e6, 0x80e6], /* CJK Ideograph */
- [0x80e7, 0x80e7], /* CJK Ideograph */
- [0x80e8, 0x80e8], /* CJK Ideograph */
- [0x80e9, 0x80e9], /* CJK Ideograph */
- [0x80ea, 0x80ea], /* CJK Ideograph */
- [0x80eb, 0x80eb], /* CJK Ideograph */
- [0x80ec, 0x80ec], /* CJK Ideograph */
- [0x80ed, 0x80ed], /* CJK Ideograph */
- [0x80ee, 0x80ee], /* CJK Ideograph */
- [0x80ef, 0x80ef], /* CJK Ideograph */
- [0x80f0, 0x80f0], /* CJK Ideograph */
- [0x80f1, 0x80f1], /* CJK Ideograph */
- [0x80f2, 0x80f2], /* CJK Ideograph */
- [0x80f3, 0x80f3], /* CJK Ideograph */
- [0x80f4, 0x80f4], /* CJK Ideograph */
- [0x80f5, 0x80f5], /* CJK Ideograph */
- [0x80f6, 0x80f6], /* CJK Ideograph */
- [0x80f7, 0x80f7], /* CJK Ideograph */
- [0x80f8, 0x80f8], /* CJK Ideograph */
- [0x80f9, 0x80f9], /* CJK Ideograph */
- [0x80fa, 0x80fa], /* CJK Ideograph */
- [0x80fb, 0x80fb], /* CJK Ideograph */
- [0x80fc, 0x80fc], /* CJK Ideograph */
- [0x80fd, 0x80fd], /* CJK Ideograph */
- [0x80fe, 0x80fe], /* CJK Ideograph */
- [0x80ff, 0x80ff], /* CJK Ideograph */
- [0x8100, 0x8100], /* CJK Ideograph */
- [0x8101, 0x8101], /* CJK Ideograph */
- [0x8102, 0x8102], /* CJK Ideograph */
- [0x8103, 0x8103], /* CJK Ideograph */
- [0x8104, 0x8104], /* CJK Ideograph */
- [0x8105, 0x8105], /* CJK Ideograph */
- [0x8106, 0x8106], /* CJK Ideograph */
- [0x8107, 0x8107], /* CJK Ideograph */
- [0x8108, 0x8108], /* CJK Ideograph */
- [0x8109, 0x8109], /* CJK Ideograph */
- [0x810a, 0x810a], /* CJK Ideograph */
- [0x810b, 0x810b], /* CJK Ideograph */
- [0x810c, 0x810c], /* CJK Ideograph */
- [0x810d, 0x810d], /* CJK Ideograph */
- [0x810e, 0x810e], /* CJK Ideograph */
- [0x810f, 0x810f], /* CJK Ideograph */
- [0x8110, 0x8110], /* CJK Ideograph */
- [0x8111, 0x8111], /* CJK Ideograph */
- [0x8112, 0x8112], /* CJK Ideograph */
- [0x8113, 0x8113], /* CJK Ideograph */
- [0x8114, 0x8114], /* CJK Ideograph */
- [0x8115, 0x8115], /* CJK Ideograph */
- [0x8116, 0x8116], /* CJK Ideograph */
- [0x8117, 0x8117], /* CJK Ideograph */
- [0x8118, 0x8118], /* CJK Ideograph */
- [0x8119, 0x8119], /* CJK Ideograph */
- [0x811a, 0x811a], /* CJK Ideograph */
- [0x811b, 0x811b], /* CJK Ideograph */
- [0x811c, 0x811c], /* CJK Ideograph */
- [0x811d, 0x811d], /* CJK Ideograph */
- [0x811e, 0x811e], /* CJK Ideograph */
- [0x811f, 0x811f], /* CJK Ideograph */
- [0x8120, 0x8120], /* CJK Ideograph */
- [0x8121, 0x8121], /* CJK Ideograph */
- [0x8122, 0x8122], /* CJK Ideograph */
- [0x8123, 0x8123], /* CJK Ideograph */
- [0x8124, 0x8124], /* CJK Ideograph */
- [0x8125, 0x8125], /* CJK Ideograph */
- [0x8126, 0x8126], /* CJK Ideograph */
- [0x8127, 0x8127], /* CJK Ideograph */
- [0x8128, 0x8128], /* CJK Ideograph */
- [0x8129, 0x8129], /* CJK Ideograph */
- [0x812a, 0x812a], /* CJK Ideograph */
- [0x812b, 0x812b], /* CJK Ideograph */
- [0x812c, 0x812c], /* CJK Ideograph */
- [0x812d, 0x812d], /* CJK Ideograph */
- [0x812e, 0x812e], /* CJK Ideograph */
- [0x812f, 0x812f], /* CJK Ideograph */
- [0x8130, 0x8130], /* CJK Ideograph */
- [0x8131, 0x8131], /* CJK Ideograph */
- [0x8132, 0x8132], /* CJK Ideograph */
- [0x8133, 0x8133], /* CJK Ideograph */
- [0x8134, 0x8134], /* CJK Ideograph */
- [0x8135, 0x8135], /* CJK Ideograph */
- [0x8136, 0x8136], /* CJK Ideograph */
- [0x8137, 0x8137], /* CJK Ideograph */
- [0x8138, 0x8138], /* CJK Ideograph */
- [0x8139, 0x8139], /* CJK Ideograph */
- [0x813a, 0x813a], /* CJK Ideograph */
- [0x813b, 0x813b], /* CJK Ideograph */
- [0x813c, 0x813c], /* CJK Ideograph */
- [0x813d, 0x813d], /* CJK Ideograph */
- [0x813e, 0x813e], /* CJK Ideograph */
- [0x813f, 0x813f], /* CJK Ideograph */
- [0x8140, 0x8140], /* CJK Ideograph */
- [0x8141, 0x8141], /* CJK Ideograph */
- [0x8142, 0x8142], /* CJK Ideograph */
- [0x8143, 0x8143], /* CJK Ideograph */
- [0x8144, 0x8144], /* CJK Ideograph */
- [0x8145, 0x8145], /* CJK Ideograph */
- [0x8146, 0x8146], /* CJK Ideograph */
- [0x8147, 0x8147], /* CJK Ideograph */
- [0x8148, 0x8148], /* CJK Ideograph */
- [0x8149, 0x8149], /* CJK Ideograph */
- [0x814a, 0x814a], /* CJK Ideograph */
- [0x814b, 0x814b], /* CJK Ideograph */
- [0x814c, 0x814c], /* CJK Ideograph */
- [0x814d, 0x814d], /* CJK Ideograph */
- [0x814e, 0x814e], /* CJK Ideograph */
- [0x814f, 0x814f], /* CJK Ideograph */
- [0x8150, 0x8150], /* CJK Ideograph */
- [0x8151, 0x8151], /* CJK Ideograph */
- [0x8152, 0x8152], /* CJK Ideograph */
- [0x8153, 0x8153], /* CJK Ideograph */
- [0x8154, 0x8154], /* CJK Ideograph */
- [0x8155, 0x8155], /* CJK Ideograph */
- [0x8156, 0x8156], /* CJK Ideograph */
- [0x8157, 0x8157], /* CJK Ideograph */
- [0x8158, 0x8158], /* CJK Ideograph */
- [0x8159, 0x8159], /* CJK Ideograph */
- [0x815a, 0x815a], /* CJK Ideograph */
- [0x815b, 0x815b], /* CJK Ideograph */
- [0x815c, 0x815c], /* CJK Ideograph */
- [0x815d, 0x815d], /* CJK Ideograph */
- [0x815e, 0x815e], /* CJK Ideograph */
- [0x815f, 0x815f], /* CJK Ideograph */
- [0x8160, 0x8160], /* CJK Ideograph */
- [0x8161, 0x8161], /* CJK Ideograph */
- [0x8162, 0x8162], /* CJK Ideograph */
- [0x8163, 0x8163], /* CJK Ideograph */
- [0x8164, 0x8164], /* CJK Ideograph */
- [0x8165, 0x8165], /* CJK Ideograph */
- [0x8166, 0x8166], /* CJK Ideograph */
- [0x8167, 0x8167], /* CJK Ideograph */
- [0x8168, 0x8168], /* CJK Ideograph */
- [0x8169, 0x8169], /* CJK Ideograph */
- [0x816a, 0x816a], /* CJK Ideograph */
- [0x816b, 0x816b], /* CJK Ideograph */
- [0x816c, 0x816c], /* CJK Ideograph */
- [0x816d, 0x816d], /* CJK Ideograph */
- [0x816e, 0x816e], /* CJK Ideograph */
- [0x816f, 0x816f], /* CJK Ideograph */
- [0x8170, 0x8170], /* CJK Ideograph */
- [0x8171, 0x8171], /* CJK Ideograph */
- [0x8172, 0x8172], /* CJK Ideograph */
- [0x8173, 0x8173], /* CJK Ideograph */
- [0x8174, 0x8174], /* CJK Ideograph */
- [0x8175, 0x8175], /* CJK Ideograph */
- [0x8176, 0x8176], /* CJK Ideograph */
- [0x8177, 0x8177], /* CJK Ideograph */
- [0x8178, 0x8178], /* CJK Ideograph */
- [0x8179, 0x8179], /* CJK Ideograph */
- [0x817a, 0x817a], /* CJK Ideograph */
- [0x817b, 0x817b], /* CJK Ideograph */
- [0x817c, 0x817c], /* CJK Ideograph */
- [0x817d, 0x817d], /* CJK Ideograph */
- [0x817e, 0x817e], /* CJK Ideograph */
- [0x817f, 0x817f], /* CJK Ideograph */
- [0x8180, 0x8180], /* CJK Ideograph */
- [0x8181, 0x8181], /* CJK Ideograph */
- [0x8182, 0x8182], /* CJK Ideograph */
- [0x8183, 0x8183], /* CJK Ideograph */
- [0x8184, 0x8184], /* CJK Ideograph */
- [0x8185, 0x8185], /* CJK Ideograph */
- [0x8186, 0x8186], /* CJK Ideograph */
- [0x8187, 0x8187], /* CJK Ideograph */
- [0x8188, 0x8188], /* CJK Ideograph */
- [0x8189, 0x8189], /* CJK Ideograph */
- [0x818a, 0x818a], /* CJK Ideograph */
- [0x818b, 0x818b], /* CJK Ideograph */
- [0x818c, 0x818c], /* CJK Ideograph */
- [0x818d, 0x818d], /* CJK Ideograph */
- [0x818e, 0x818e], /* CJK Ideograph */
- [0x818f, 0x818f], /* CJK Ideograph */
- [0x8190, 0x8190], /* CJK Ideograph */
- [0x8191, 0x8191], /* CJK Ideograph */
- [0x8192, 0x8192], /* CJK Ideograph */
- [0x8193, 0x8193], /* CJK Ideograph */
- [0x8194, 0x8194], /* CJK Ideograph */
- [0x8195, 0x8195], /* CJK Ideograph */
- [0x8196, 0x8196], /* CJK Ideograph */
- [0x8197, 0x8197], /* CJK Ideograph */
- [0x8198, 0x8198], /* CJK Ideograph */
- [0x8199, 0x8199], /* CJK Ideograph */
- [0x819a, 0x819a], /* CJK Ideograph */
- [0x819b, 0x819b], /* CJK Ideograph */
- [0x819c, 0x819c], /* CJK Ideograph */
- [0x819d, 0x819d], /* CJK Ideograph */
- [0x819e, 0x819e], /* CJK Ideograph */
- [0x819f, 0x819f], /* CJK Ideograph */
- [0x81a0, 0x81a0], /* CJK Ideograph */
- [0x81a1, 0x81a1], /* CJK Ideograph */
- [0x81a2, 0x81a2], /* CJK Ideograph */
- [0x81a3, 0x81a3], /* CJK Ideograph */
- [0x81a4, 0x81a4], /* CJK Ideograph */
- [0x81a5, 0x81a5], /* CJK Ideograph */
- [0x81a6, 0x81a6], /* CJK Ideograph */
- [0x81a7, 0x81a7], /* CJK Ideograph */
- [0x81a8, 0x81a8], /* CJK Ideograph */
- [0x81a9, 0x81a9], /* CJK Ideograph */
- [0x81aa, 0x81aa], /* CJK Ideograph */
- [0x81ab, 0x81ab], /* CJK Ideograph */
- [0x81ac, 0x81ac], /* CJK Ideograph */
- [0x81ad, 0x81ad], /* CJK Ideograph */
- [0x81ae, 0x81ae], /* CJK Ideograph */
- [0x81af, 0x81af], /* CJK Ideograph */
- [0x81b0, 0x81b0], /* CJK Ideograph */
- [0x81b1, 0x81b1], /* CJK Ideograph */
- [0x81b2, 0x81b2], /* CJK Ideograph */
- [0x81b3, 0x81b3], /* CJK Ideograph */
- [0x81b4, 0x81b4], /* CJK Ideograph */
- [0x81b5, 0x81b5], /* CJK Ideograph */
- [0x81b6, 0x81b6], /* CJK Ideograph */
- [0x81b7, 0x81b7], /* CJK Ideograph */
- [0x81b8, 0x81b8], /* CJK Ideograph */
- [0x81b9, 0x81b9], /* CJK Ideograph */
- [0x81ba, 0x81ba], /* CJK Ideograph */
- [0x81bb, 0x81bb], /* CJK Ideograph */
- [0x81bc, 0x81bc], /* CJK Ideograph */
- [0x81bd, 0x81bd], /* CJK Ideograph */
- [0x81be, 0x81be], /* CJK Ideograph */
- [0x81bf, 0x81bf], /* CJK Ideograph */
- [0x81c0, 0x81c0], /* CJK Ideograph */
- [0x81c1, 0x81c1], /* CJK Ideograph */
- [0x81c2, 0x81c2], /* CJK Ideograph */
- [0x81c3, 0x81c3], /* CJK Ideograph */
- [0x81c4, 0x81c4], /* CJK Ideograph */
- [0x81c5, 0x81c5], /* CJK Ideograph */
- [0x81c6, 0x81c6], /* CJK Ideograph */
- [0x81c7, 0x81c7], /* CJK Ideograph */
- [0x81c8, 0x81c8], /* CJK Ideograph */
- [0x81c9, 0x81c9], /* CJK Ideograph */
- [0x81ca, 0x81ca], /* CJK Ideograph */
- [0x81cb, 0x81cb], /* CJK Ideograph */
- [0x81cc, 0x81cc], /* CJK Ideograph */
- [0x81cd, 0x81cd], /* CJK Ideograph */
- [0x81ce, 0x81ce], /* CJK Ideograph */
- [0x81cf, 0x81cf], /* CJK Ideograph */
- [0x81d0, 0x81d0], /* CJK Ideograph */
- [0x81d1, 0x81d1], /* CJK Ideograph */
- [0x81d2, 0x81d2], /* CJK Ideograph */
- [0x81d3, 0x81d3], /* CJK Ideograph */
- [0x81d4, 0x81d4], /* CJK Ideograph */
- [0x81d5, 0x81d5], /* CJK Ideograph */
- [0x81d6, 0x81d6], /* CJK Ideograph */
- [0x81d7, 0x81d7], /* CJK Ideograph */
- [0x81d8, 0x81d8], /* CJK Ideograph */
- [0x81d9, 0x81d9], /* CJK Ideograph */
- [0x81da, 0x81da], /* CJK Ideograph */
- [0x81db, 0x81db], /* CJK Ideograph */
- [0x81dc, 0x81dc], /* CJK Ideograph */
- [0x81dd, 0x81dd], /* CJK Ideograph */
- [0x81de, 0x81de], /* CJK Ideograph */
- [0x81df, 0x81df], /* CJK Ideograph */
- [0x81e0, 0x81e0], /* CJK Ideograph */
- [0x81e1, 0x81e1], /* CJK Ideograph */
- [0x81e2, 0x81e2], /* CJK Ideograph */
- [0x81e3, 0x81e3], /* CJK Ideograph */
- [0x81e4, 0x81e4], /* CJK Ideograph */
- [0x81e5, 0x81e5], /* CJK Ideograph */
- [0x81e6, 0x81e6], /* CJK Ideograph */
- [0x81e7, 0x81e7], /* CJK Ideograph */
- [0x81e8, 0x81e8], /* CJK Ideograph */
- [0x81e9, 0x81e9], /* CJK Ideograph */
- [0x81ea, 0x81ea], /* CJK Ideograph */
- [0x81eb, 0x81eb], /* CJK Ideograph */
- [0x81ec, 0x81ec], /* CJK Ideograph */
- [0x81ed, 0x81ed], /* CJK Ideograph */
- [0x81ee, 0x81ee], /* CJK Ideograph */
- [0x81ef, 0x81ef], /* CJK Ideograph */
- [0x81f0, 0x81f0], /* CJK Ideograph */
- [0x81f1, 0x81f1], /* CJK Ideograph */
- [0x81f2, 0x81f2], /* CJK Ideograph */
- [0x81f3, 0x81f3], /* CJK Ideograph */
- [0x81f4, 0x81f4], /* CJK Ideograph */
- [0x81f5, 0x81f5], /* CJK Ideograph */
- [0x81f6, 0x81f6], /* CJK Ideograph */
- [0x81f7, 0x81f7], /* CJK Ideograph */
- [0x81f8, 0x81f8], /* CJK Ideograph */
- [0x81f9, 0x81f9], /* CJK Ideograph */
- [0x81fa, 0x81fa], /* CJK Ideograph */
- [0x81fb, 0x81fb], /* CJK Ideograph */
- [0x81fc, 0x81fc], /* CJK Ideograph */
- [0x81fd, 0x81fd], /* CJK Ideograph */
- [0x81fe, 0x81fe], /* CJK Ideograph */
- [0x81ff, 0x81ff], /* CJK Ideograph */
- [0x8200, 0x8200], /* CJK Ideograph */
- [0x8201, 0x8201], /* CJK Ideograph */
- [0x8202, 0x8202], /* CJK Ideograph */
- [0x8203, 0x8203], /* CJK Ideograph */
- [0x8204, 0x8204], /* CJK Ideograph */
- [0x8205, 0x8205], /* CJK Ideograph */
- [0x8206, 0x8206], /* CJK Ideograph */
- [0x8207, 0x8207], /* CJK Ideograph */
- [0x8208, 0x8208], /* CJK Ideograph */
- [0x8209, 0x8209], /* CJK Ideograph */
- [0x820a, 0x820a], /* CJK Ideograph */
- [0x820b, 0x820b], /* CJK Ideograph */
- [0x820c, 0x820c], /* CJK Ideograph */
- [0x820d, 0x820d], /* CJK Ideograph */
- [0x820e, 0x820e], /* CJK Ideograph */
- [0x820f, 0x820f], /* CJK Ideograph */
- [0x8210, 0x8210], /* CJK Ideograph */
- [0x8211, 0x8211], /* CJK Ideograph */
- [0x8212, 0x8212], /* CJK Ideograph */
- [0x8213, 0x8213], /* CJK Ideograph */
- [0x8214, 0x8214], /* CJK Ideograph */
- [0x8215, 0x8215], /* CJK Ideograph */
- [0x8216, 0x8216], /* CJK Ideograph */
- [0x8217, 0x8217], /* CJK Ideograph */
- [0x8218, 0x8218], /* CJK Ideograph */
- [0x8219, 0x8219], /* CJK Ideograph */
- [0x821a, 0x821a], /* CJK Ideograph */
- [0x821b, 0x821b], /* CJK Ideograph */
- [0x821c, 0x821c], /* CJK Ideograph */
- [0x821d, 0x821d], /* CJK Ideograph */
- [0x821e, 0x821e], /* CJK Ideograph */
- [0x821f, 0x821f], /* CJK Ideograph */
- [0x8220, 0x8220], /* CJK Ideograph */
- [0x8221, 0x8221], /* CJK Ideograph */
- [0x8222, 0x8222], /* CJK Ideograph */
- [0x8223, 0x8223], /* CJK Ideograph */
- [0x8224, 0x8224], /* CJK Ideograph */
- [0x8225, 0x8225], /* CJK Ideograph */
- [0x8226, 0x8226], /* CJK Ideograph */
- [0x8227, 0x8227], /* CJK Ideograph */
- [0x8228, 0x8228], /* CJK Ideograph */
- [0x8229, 0x8229], /* CJK Ideograph */
- [0x822a, 0x822a], /* CJK Ideograph */
- [0x822b, 0x822b], /* CJK Ideograph */
- [0x822c, 0x822c], /* CJK Ideograph */
- [0x822d, 0x822d], /* CJK Ideograph */
- [0x822e, 0x822e], /* CJK Ideograph */
- [0x822f, 0x822f], /* CJK Ideograph */
- [0x8230, 0x8230], /* CJK Ideograph */
- [0x8231, 0x8231], /* CJK Ideograph */
- [0x8232, 0x8232], /* CJK Ideograph */
- [0x8233, 0x8233], /* CJK Ideograph */
- [0x8234, 0x8234], /* CJK Ideograph */
- [0x8235, 0x8235], /* CJK Ideograph */
- [0x8236, 0x8236], /* CJK Ideograph */
- [0x8237, 0x8237], /* CJK Ideograph */
- [0x8238, 0x8238], /* CJK Ideograph */
- [0x8239, 0x8239], /* CJK Ideograph */
- [0x823a, 0x823a], /* CJK Ideograph */
- [0x823b, 0x823b], /* CJK Ideograph */
- [0x823c, 0x823c], /* CJK Ideograph */
- [0x823d, 0x823d], /* CJK Ideograph */
- [0x823e, 0x823e], /* CJK Ideograph */
- [0x823f, 0x823f], /* CJK Ideograph */
- [0x8240, 0x8240], /* CJK Ideograph */
- [0x8241, 0x8241], /* CJK Ideograph */
- [0x8242, 0x8242], /* CJK Ideograph */
- [0x8243, 0x8243], /* CJK Ideograph */
- [0x8244, 0x8244], /* CJK Ideograph */
- [0x8245, 0x8245], /* CJK Ideograph */
- [0x8246, 0x8246], /* CJK Ideograph */
- [0x8247, 0x8247], /* CJK Ideograph */
- [0x8248, 0x8248], /* CJK Ideograph */
- [0x8249, 0x8249], /* CJK Ideograph */
- [0x824a, 0x824a], /* CJK Ideograph */
- [0x824b, 0x824b], /* CJK Ideograph */
- [0x824c, 0x824c], /* CJK Ideograph */
- [0x824d, 0x824d], /* CJK Ideograph */
- [0x824e, 0x824e], /* CJK Ideograph */
- [0x824f, 0x824f], /* CJK Ideograph */
- [0x8250, 0x8250], /* CJK Ideograph */
- [0x8251, 0x8251], /* CJK Ideograph */
- [0x8252, 0x8252], /* CJK Ideograph */
- [0x8253, 0x8253], /* CJK Ideograph */
- [0x8254, 0x8254], /* CJK Ideograph */
- [0x8255, 0x8255], /* CJK Ideograph */
- [0x8256, 0x8256], /* CJK Ideograph */
- [0x8257, 0x8257], /* CJK Ideograph */
- [0x8258, 0x8258], /* CJK Ideograph */
- [0x8259, 0x8259], /* CJK Ideograph */
- [0x825a, 0x825a], /* CJK Ideograph */
- [0x825b, 0x825b], /* CJK Ideograph */
- [0x825c, 0x825c], /* CJK Ideograph */
- [0x825d, 0x825d], /* CJK Ideograph */
- [0x825e, 0x825e], /* CJK Ideograph */
- [0x825f, 0x825f], /* CJK Ideograph */
- [0x8260, 0x8260], /* CJK Ideograph */
- [0x8261, 0x8261], /* CJK Ideograph */
- [0x8262, 0x8262], /* CJK Ideograph */
- [0x8263, 0x8263], /* CJK Ideograph */
- [0x8264, 0x8264], /* CJK Ideograph */
- [0x8265, 0x8265], /* CJK Ideograph */
- [0x8266, 0x8266], /* CJK Ideograph */
- [0x8267, 0x8267], /* CJK Ideograph */
- [0x8268, 0x8268], /* CJK Ideograph */
- [0x8269, 0x8269], /* CJK Ideograph */
- [0x826a, 0x826a], /* CJK Ideograph */
- [0x826b, 0x826b], /* CJK Ideograph */
- [0x826c, 0x826c], /* CJK Ideograph */
- [0x826d, 0x826d], /* CJK Ideograph */
- [0x826e, 0x826e], /* CJK Ideograph */
- [0x826f, 0x826f], /* CJK Ideograph */
- [0x8270, 0x8270], /* CJK Ideograph */
- [0x8271, 0x8271], /* CJK Ideograph */
- [0x8272, 0x8272], /* CJK Ideograph */
- [0x8273, 0x8273], /* CJK Ideograph */
- [0x8274, 0x8274], /* CJK Ideograph */
- [0x8275, 0x8275], /* CJK Ideograph */
- [0x8276, 0x8276], /* CJK Ideograph */
- [0x8277, 0x8277], /* CJK Ideograph */
- [0x8278, 0x8278], /* CJK Ideograph */
- [0x8279, 0x8279], /* CJK Ideograph */
- [0x827a, 0x827a], /* CJK Ideograph */
- [0x827b, 0x827b], /* CJK Ideograph */
- [0x827c, 0x827c], /* CJK Ideograph */
- [0x827d, 0x827d], /* CJK Ideograph */
- [0x827e, 0x827e], /* CJK Ideograph */
- [0x827f, 0x827f], /* CJK Ideograph */
- [0x8280, 0x8280], /* CJK Ideograph */
- [0x8281, 0x8281], /* CJK Ideograph */
- [0x8282, 0x8282], /* CJK Ideograph */
- [0x8283, 0x8283], /* CJK Ideograph */
- [0x8284, 0x8284], /* CJK Ideograph */
- [0x8285, 0x8285], /* CJK Ideograph */
- [0x8286, 0x8286], /* CJK Ideograph */
- [0x8287, 0x8287], /* CJK Ideograph */
- [0x8288, 0x8288], /* CJK Ideograph */
- [0x8289, 0x8289], /* CJK Ideograph */
- [0x828a, 0x828a], /* CJK Ideograph */
- [0x828b, 0x828b], /* CJK Ideograph */
- [0x828c, 0x828c], /* CJK Ideograph */
- [0x828d, 0x828d], /* CJK Ideograph */
- [0x828e, 0x828e], /* CJK Ideograph */
- [0x828f, 0x828f], /* CJK Ideograph */
- [0x8290, 0x8290], /* CJK Ideograph */
- [0x8291, 0x8291], /* CJK Ideograph */
- [0x8292, 0x8292], /* CJK Ideograph */
- [0x8293, 0x8293], /* CJK Ideograph */
- [0x8294, 0x8294], /* CJK Ideograph */
- [0x8295, 0x8295], /* CJK Ideograph */
- [0x8296, 0x8296], /* CJK Ideograph */
- [0x8297, 0x8297], /* CJK Ideograph */
- [0x8298, 0x8298], /* CJK Ideograph */
- [0x8299, 0x8299], /* CJK Ideograph */
- [0x829a, 0x829a], /* CJK Ideograph */
- [0x829b, 0x829b], /* CJK Ideograph */
- [0x829c, 0x829c], /* CJK Ideograph */
- [0x829d, 0x829d], /* CJK Ideograph */
- [0x829e, 0x829e], /* CJK Ideograph */
- [0x829f, 0x829f], /* CJK Ideograph */
- [0x82a0, 0x82a0], /* CJK Ideograph */
- [0x82a1, 0x82a1], /* CJK Ideograph */
- [0x82a2, 0x82a2], /* CJK Ideograph */
- [0x82a3, 0x82a3], /* CJK Ideograph */
- [0x82a4, 0x82a4], /* CJK Ideograph */
- [0x82a5, 0x82a5], /* CJK Ideograph */
- [0x82a6, 0x82a6], /* CJK Ideograph */
- [0x82a7, 0x82a7], /* CJK Ideograph */
- [0x82a8, 0x82a8], /* CJK Ideograph */
- [0x82a9, 0x82a9], /* CJK Ideograph */
- [0x82aa, 0x82aa], /* CJK Ideograph */
- [0x82ab, 0x82ab], /* CJK Ideograph */
- [0x82ac, 0x82ac], /* CJK Ideograph */
- [0x82ad, 0x82ad], /* CJK Ideograph */
- [0x82ae, 0x82ae], /* CJK Ideograph */
- [0x82af, 0x82af], /* CJK Ideograph */
- [0x82b0, 0x82b0], /* CJK Ideograph */
- [0x82b1, 0x82b1], /* CJK Ideograph */
- [0x82b2, 0x82b2], /* CJK Ideograph */
- [0x82b3, 0x82b3], /* CJK Ideograph */
- [0x82b4, 0x82b4], /* CJK Ideograph */
- [0x82b5, 0x82b5], /* CJK Ideograph */
- [0x82b6, 0x82b6], /* CJK Ideograph */
- [0x82b7, 0x82b7], /* CJK Ideograph */
- [0x82b8, 0x82b8], /* CJK Ideograph */
- [0x82b9, 0x82b9], /* CJK Ideograph */
- [0x82ba, 0x82ba], /* CJK Ideograph */
- [0x82bb, 0x82bb], /* CJK Ideograph */
- [0x82bc, 0x82bc], /* CJK Ideograph */
- [0x82bd, 0x82bd], /* CJK Ideograph */
- [0x82be, 0x82be], /* CJK Ideograph */
- [0x82bf, 0x82bf], /* CJK Ideograph */
- [0x82c0, 0x82c0], /* CJK Ideograph */
- [0x82c1, 0x82c1], /* CJK Ideograph */
- [0x82c2, 0x82c2], /* CJK Ideograph */
- [0x82c3, 0x82c3], /* CJK Ideograph */
- [0x82c4, 0x82c4], /* CJK Ideograph */
- [0x82c5, 0x82c5], /* CJK Ideograph */
- [0x82c6, 0x82c6], /* CJK Ideograph */
- [0x82c7, 0x82c7], /* CJK Ideograph */
- [0x82c8, 0x82c8], /* CJK Ideograph */
- [0x82c9, 0x82c9], /* CJK Ideograph */
- [0x82ca, 0x82ca], /* CJK Ideograph */
- [0x82cb, 0x82cb], /* CJK Ideograph */
- [0x82cc, 0x82cc], /* CJK Ideograph */
- [0x82cd, 0x82cd], /* CJK Ideograph */
- [0x82ce, 0x82ce], /* CJK Ideograph */
- [0x82cf, 0x82cf], /* CJK Ideograph */
- [0x82d0, 0x82d0], /* CJK Ideograph */
- [0x82d1, 0x82d1], /* CJK Ideograph */
- [0x82d2, 0x82d2], /* CJK Ideograph */
- [0x82d3, 0x82d3], /* CJK Ideograph */
- [0x82d4, 0x82d4], /* CJK Ideograph */
- [0x82d5, 0x82d5], /* CJK Ideograph */
- [0x82d6, 0x82d6], /* CJK Ideograph */
- [0x82d7, 0x82d7], /* CJK Ideograph */
- [0x82d8, 0x82d8], /* CJK Ideograph */
- [0x82d9, 0x82d9], /* CJK Ideograph */
- [0x82da, 0x82da], /* CJK Ideograph */
- [0x82db, 0x82db], /* CJK Ideograph */
- [0x82dc, 0x82dc], /* CJK Ideograph */
- [0x82dd, 0x82dd], /* CJK Ideograph */
- [0x82de, 0x82de], /* CJK Ideograph */
- [0x82df, 0x82df], /* CJK Ideograph */
- [0x82e0, 0x82e0], /* CJK Ideograph */
- [0x82e1, 0x82e1], /* CJK Ideograph */
- [0x82e2, 0x82e2], /* CJK Ideograph */
- [0x82e3, 0x82e3], /* CJK Ideograph */
- [0x82e4, 0x82e4], /* CJK Ideograph */
- [0x82e5, 0x82e5], /* CJK Ideograph */
- [0x82e6, 0x82e6], /* CJK Ideograph */
- [0x82e7, 0x82e7], /* CJK Ideograph */
- [0x82e8, 0x82e8], /* CJK Ideograph */
- [0x82e9, 0x82e9], /* CJK Ideograph */
- [0x82ea, 0x82ea], /* CJK Ideograph */
- [0x82eb, 0x82eb], /* CJK Ideograph */
- [0x82ec, 0x82ec], /* CJK Ideograph */
- [0x82ed, 0x82ed], /* CJK Ideograph */
- [0x82ee, 0x82ee], /* CJK Ideograph */
- [0x82ef, 0x82ef], /* CJK Ideograph */
- [0x82f0, 0x82f0], /* CJK Ideograph */
- [0x82f1, 0x82f1], /* CJK Ideograph */
- [0x82f2, 0x82f2], /* CJK Ideograph */
- [0x82f3, 0x82f3], /* CJK Ideograph */
- [0x82f4, 0x82f4], /* CJK Ideograph */
- [0x82f5, 0x82f5], /* CJK Ideograph */
- [0x82f6, 0x82f6], /* CJK Ideograph */
- [0x82f7, 0x82f7], /* CJK Ideograph */
- [0x82f8, 0x82f8], /* CJK Ideograph */
- [0x82f9, 0x82f9], /* CJK Ideograph */
- [0x82fa, 0x82fa], /* CJK Ideograph */
- [0x82fb, 0x82fb], /* CJK Ideograph */
- [0x82fc, 0x82fc], /* CJK Ideograph */
- [0x82fd, 0x82fd], /* CJK Ideograph */
- [0x82fe, 0x82fe], /* CJK Ideograph */
- [0x82ff, 0x82ff], /* CJK Ideograph */
- [0x8300, 0x8300], /* CJK Ideograph */
- [0x8301, 0x8301], /* CJK Ideograph */
- [0x8302, 0x8302], /* CJK Ideograph */
- [0x8303, 0x8303], /* CJK Ideograph */
- [0x8304, 0x8304], /* CJK Ideograph */
- [0x8305, 0x8305], /* CJK Ideograph */
- [0x8306, 0x8306], /* CJK Ideograph */
- [0x8307, 0x8307], /* CJK Ideograph */
- [0x8308, 0x8308], /* CJK Ideograph */
- [0x8309, 0x8309], /* CJK Ideograph */
- [0x830a, 0x830a], /* CJK Ideograph */
- [0x830b, 0x830b], /* CJK Ideograph */
- [0x830c, 0x830c], /* CJK Ideograph */
- [0x830d, 0x830d], /* CJK Ideograph */
- [0x830e, 0x830e], /* CJK Ideograph */
- [0x830f, 0x830f], /* CJK Ideograph */
- [0x8310, 0x8310], /* CJK Ideograph */
- [0x8311, 0x8311], /* CJK Ideograph */
- [0x8312, 0x8312], /* CJK Ideograph */
- [0x8313, 0x8313], /* CJK Ideograph */
- [0x8314, 0x8314], /* CJK Ideograph */
- [0x8315, 0x8315], /* CJK Ideograph */
- [0x8316, 0x8316], /* CJK Ideograph */
- [0x8317, 0x8317], /* CJK Ideograph */
- [0x8318, 0x8318], /* CJK Ideograph */
- [0x8319, 0x8319], /* CJK Ideograph */
- [0x831a, 0x831a], /* CJK Ideograph */
- [0x831b, 0x831b], /* CJK Ideograph */
- [0x831c, 0x831c], /* CJK Ideograph */
- [0x831d, 0x831d], /* CJK Ideograph */
- [0x831e, 0x831e], /* CJK Ideograph */
- [0x831f, 0x831f], /* CJK Ideograph */
- [0x8320, 0x8320], /* CJK Ideograph */
- [0x8321, 0x8321], /* CJK Ideograph */
- [0x8322, 0x8322], /* CJK Ideograph */
- [0x8323, 0x8323], /* CJK Ideograph */
- [0x8324, 0x8324], /* CJK Ideograph */
- [0x8325, 0x8325], /* CJK Ideograph */
- [0x8326, 0x8326], /* CJK Ideograph */
- [0x8327, 0x8327], /* CJK Ideograph */
- [0x8328, 0x8328], /* CJK Ideograph */
- [0x8329, 0x8329], /* CJK Ideograph */
- [0x832a, 0x832a], /* CJK Ideograph */
- [0x832b, 0x832b], /* CJK Ideograph */
- [0x832c, 0x832c], /* CJK Ideograph */
- [0x832d, 0x832d], /* CJK Ideograph */
- [0x832e, 0x832e], /* CJK Ideograph */
- [0x832f, 0x832f], /* CJK Ideograph */
- [0x8330, 0x8330], /* CJK Ideograph */
- [0x8331, 0x8331], /* CJK Ideograph */
- [0x8332, 0x8332], /* CJK Ideograph */
- [0x8333, 0x8333], /* CJK Ideograph */
- [0x8334, 0x8334], /* CJK Ideograph */
- [0x8335, 0x8335], /* CJK Ideograph */
- [0x8336, 0x8336], /* CJK Ideograph */
- [0x8337, 0x8337], /* CJK Ideograph */
- [0x8338, 0x8338], /* CJK Ideograph */
- [0x8339, 0x8339], /* CJK Ideograph */
- [0x833a, 0x833a], /* CJK Ideograph */
- [0x833b, 0x833b], /* CJK Ideograph */
- [0x833c, 0x833c], /* CJK Ideograph */
- [0x833d, 0x833d], /* CJK Ideograph */
- [0x833e, 0x833e], /* CJK Ideograph */
- [0x833f, 0x833f], /* CJK Ideograph */
- [0x8340, 0x8340], /* CJK Ideograph */
- [0x8341, 0x8341], /* CJK Ideograph */
- [0x8342, 0x8342], /* CJK Ideograph */
- [0x8343, 0x8343], /* CJK Ideograph */
- [0x8344, 0x8344], /* CJK Ideograph */
- [0x8345, 0x8345], /* CJK Ideograph */
- [0x8346, 0x8346], /* CJK Ideograph */
- [0x8347, 0x8347], /* CJK Ideograph */
- [0x8348, 0x8348], /* CJK Ideograph */
- [0x8349, 0x8349], /* CJK Ideograph */
- [0x834a, 0x834a], /* CJK Ideograph */
- [0x834b, 0x834b], /* CJK Ideograph */
- [0x834c, 0x834c], /* CJK Ideograph */
- [0x834d, 0x834d], /* CJK Ideograph */
- [0x834e, 0x834e], /* CJK Ideograph */
- [0x834f, 0x834f], /* CJK Ideograph */
- [0x8350, 0x8350], /* CJK Ideograph */
- [0x8351, 0x8351], /* CJK Ideograph */
- [0x8352, 0x8352], /* CJK Ideograph */
- [0x8353, 0x8353], /* CJK Ideograph */
- [0x8354, 0x8354], /* CJK Ideograph */
- [0x8355, 0x8355], /* CJK Ideograph */
- [0x8356, 0x8356], /* CJK Ideograph */
- [0x8357, 0x8357], /* CJK Ideograph */
- [0x8358, 0x8358], /* CJK Ideograph */
- [0x8359, 0x8359], /* CJK Ideograph */
- [0x835a, 0x835a], /* CJK Ideograph */
- [0x835b, 0x835b], /* CJK Ideograph */
- [0x835c, 0x835c], /* CJK Ideograph */
- [0x835d, 0x835d], /* CJK Ideograph */
- [0x835e, 0x835e], /* CJK Ideograph */
- [0x835f, 0x835f], /* CJK Ideograph */
- [0x8360, 0x8360], /* CJK Ideograph */
- [0x8361, 0x8361], /* CJK Ideograph */
- [0x8362, 0x8362], /* CJK Ideograph */
- [0x8363, 0x8363], /* CJK Ideograph */
- [0x8364, 0x8364], /* CJK Ideograph */
- [0x8365, 0x8365], /* CJK Ideograph */
- [0x8366, 0x8366], /* CJK Ideograph */
- [0x8367, 0x8367], /* CJK Ideograph */
- [0x8368, 0x8368], /* CJK Ideograph */
- [0x8369, 0x8369], /* CJK Ideograph */
- [0x836a, 0x836a], /* CJK Ideograph */
- [0x836b, 0x836b], /* CJK Ideograph */
- [0x836c, 0x836c], /* CJK Ideograph */
- [0x836d, 0x836d], /* CJK Ideograph */
- [0x836e, 0x836e], /* CJK Ideograph */
- [0x836f, 0x836f], /* CJK Ideograph */
- [0x8370, 0x8370], /* CJK Ideograph */
- [0x8371, 0x8371], /* CJK Ideograph */
- [0x8372, 0x8372], /* CJK Ideograph */
- [0x8373, 0x8373], /* CJK Ideograph */
- [0x8374, 0x8374], /* CJK Ideograph */
- [0x8375, 0x8375], /* CJK Ideograph */
- [0x8376, 0x8376], /* CJK Ideograph */
- [0x8377, 0x8377], /* CJK Ideograph */
- [0x8378, 0x8378], /* CJK Ideograph */
- [0x8379, 0x8379], /* CJK Ideograph */
- [0x837a, 0x837a], /* CJK Ideograph */
- [0x837b, 0x837b], /* CJK Ideograph */
- [0x837c, 0x837c], /* CJK Ideograph */
- [0x837d, 0x837d], /* CJK Ideograph */
- [0x837e, 0x837e], /* CJK Ideograph */
- [0x837f, 0x837f], /* CJK Ideograph */
- [0x8380, 0x8380], /* CJK Ideograph */
- [0x8381, 0x8381], /* CJK Ideograph */
- [0x8382, 0x8382], /* CJK Ideograph */
- [0x8383, 0x8383], /* CJK Ideograph */
- [0x8384, 0x8384], /* CJK Ideograph */
- [0x8385, 0x8385], /* CJK Ideograph */
- [0x8386, 0x8386], /* CJK Ideograph */
- [0x8387, 0x8387], /* CJK Ideograph */
- [0x8388, 0x8388], /* CJK Ideograph */
- [0x8389, 0x8389], /* CJK Ideograph */
- [0x838a, 0x838a], /* CJK Ideograph */
- [0x838b, 0x838b], /* CJK Ideograph */
- [0x838c, 0x838c], /* CJK Ideograph */
- [0x838d, 0x838d], /* CJK Ideograph */
- [0x838e, 0x838e], /* CJK Ideograph */
- [0x838f, 0x838f], /* CJK Ideograph */
- [0x8390, 0x8390], /* CJK Ideograph */
- [0x8391, 0x8391], /* CJK Ideograph */
- [0x8392, 0x8392], /* CJK Ideograph */
- [0x8393, 0x8393], /* CJK Ideograph */
- [0x8394, 0x8394], /* CJK Ideograph */
- [0x8395, 0x8395], /* CJK Ideograph */
- [0x8396, 0x8396], /* CJK Ideograph */
- [0x8397, 0x8397], /* CJK Ideograph */
- [0x8398, 0x8398], /* CJK Ideograph */
- [0x8399, 0x8399], /* CJK Ideograph */
- [0x839a, 0x839a], /* CJK Ideograph */
- [0x839b, 0x839b], /* CJK Ideograph */
- [0x839c, 0x839c], /* CJK Ideograph */
- [0x839d, 0x839d], /* CJK Ideograph */
- [0x839e, 0x839e], /* CJK Ideograph */
- [0x839f, 0x839f], /* CJK Ideograph */
- [0x83a0, 0x83a0], /* CJK Ideograph */
- [0x83a1, 0x83a1], /* CJK Ideograph */
- [0x83a2, 0x83a2], /* CJK Ideograph */
- [0x83a3, 0x83a3], /* CJK Ideograph */
- [0x83a4, 0x83a4], /* CJK Ideograph */
- [0x83a5, 0x83a5], /* CJK Ideograph */
- [0x83a6, 0x83a6], /* CJK Ideograph */
- [0x83a7, 0x83a7], /* CJK Ideograph */
- [0x83a8, 0x83a8], /* CJK Ideograph */
- [0x83a9, 0x83a9], /* CJK Ideograph */
- [0x83aa, 0x83aa], /* CJK Ideograph */
- [0x83ab, 0x83ab], /* CJK Ideograph */
- [0x83ac, 0x83ac], /* CJK Ideograph */
- [0x83ad, 0x83ad], /* CJK Ideograph */
- [0x83ae, 0x83ae], /* CJK Ideograph */
- [0x83af, 0x83af], /* CJK Ideograph */
- [0x83b0, 0x83b0], /* CJK Ideograph */
- [0x83b1, 0x83b1], /* CJK Ideograph */
- [0x83b2, 0x83b2], /* CJK Ideograph */
- [0x83b3, 0x83b3], /* CJK Ideograph */
- [0x83b4, 0x83b4], /* CJK Ideograph */
- [0x83b5, 0x83b5], /* CJK Ideograph */
- [0x83b6, 0x83b6], /* CJK Ideograph */
- [0x83b7, 0x83b7], /* CJK Ideograph */
- [0x83b8, 0x83b8], /* CJK Ideograph */
- [0x83b9, 0x83b9], /* CJK Ideograph */
- [0x83ba, 0x83ba], /* CJK Ideograph */
- [0x83bb, 0x83bb], /* CJK Ideograph */
- [0x83bc, 0x83bc], /* CJK Ideograph */
- [0x83bd, 0x83bd], /* CJK Ideograph */
- [0x83be, 0x83be], /* CJK Ideograph */
- [0x83bf, 0x83bf], /* CJK Ideograph */
- [0x83c0, 0x83c0], /* CJK Ideograph */
- [0x83c1, 0x83c1], /* CJK Ideograph */
- [0x83c2, 0x83c2], /* CJK Ideograph */
- [0x83c3, 0x83c3], /* CJK Ideograph */
- [0x83c4, 0x83c4], /* CJK Ideograph */
- [0x83c5, 0x83c5], /* CJK Ideograph */
- [0x83c6, 0x83c6], /* CJK Ideograph */
- [0x83c7, 0x83c7], /* CJK Ideograph */
- [0x83c8, 0x83c8], /* CJK Ideograph */
- [0x83c9, 0x83c9], /* CJK Ideograph */
- [0x83ca, 0x83ca], /* CJK Ideograph */
- [0x83cb, 0x83cb], /* CJK Ideograph */
- [0x83cc, 0x83cc], /* CJK Ideograph */
- [0x83cd, 0x83cd], /* CJK Ideograph */
- [0x83ce, 0x83ce], /* CJK Ideograph */
- [0x83cf, 0x83cf], /* CJK Ideograph */
- [0x83d0, 0x83d0], /* CJK Ideograph */
- [0x83d1, 0x83d1], /* CJK Ideograph */
- [0x83d2, 0x83d2], /* CJK Ideograph */
- [0x83d3, 0x83d3], /* CJK Ideograph */
- [0x83d4, 0x83d4], /* CJK Ideograph */
- [0x83d5, 0x83d5], /* CJK Ideograph */
- [0x83d6, 0x83d6], /* CJK Ideograph */
- [0x83d7, 0x83d7], /* CJK Ideograph */
- [0x83d8, 0x83d8], /* CJK Ideograph */
- [0x83d9, 0x83d9], /* CJK Ideograph */
- [0x83da, 0x83da], /* CJK Ideograph */
- [0x83db, 0x83db], /* CJK Ideograph */
- [0x83dc, 0x83dc], /* CJK Ideograph */
- [0x83dd, 0x83dd], /* CJK Ideograph */
- [0x83de, 0x83de], /* CJK Ideograph */
- [0x83df, 0x83df], /* CJK Ideograph */
- [0x83e0, 0x83e0], /* CJK Ideograph */
- [0x83e1, 0x83e1], /* CJK Ideograph */
- [0x83e2, 0x83e2], /* CJK Ideograph */
- [0x83e3, 0x83e3], /* CJK Ideograph */
- [0x83e4, 0x83e4], /* CJK Ideograph */
- [0x83e5, 0x83e5], /* CJK Ideograph */
- [0x83e6, 0x83e6], /* CJK Ideograph */
- [0x83e7, 0x83e7], /* CJK Ideograph */
- [0x83e8, 0x83e8], /* CJK Ideograph */
- [0x83e9, 0x83e9], /* CJK Ideograph */
- [0x83ea, 0x83ea], /* CJK Ideograph */
- [0x83eb, 0x83eb], /* CJK Ideograph */
- [0x83ec, 0x83ec], /* CJK Ideograph */
- [0x83ed, 0x83ed], /* CJK Ideograph */
- [0x83ee, 0x83ee], /* CJK Ideograph */
- [0x83ef, 0x83ef], /* CJK Ideograph */
- [0x83f0, 0x83f0], /* CJK Ideograph */
- [0x83f1, 0x83f1], /* CJK Ideograph */
- [0x83f2, 0x83f2], /* CJK Ideograph */
- [0x83f3, 0x83f3], /* CJK Ideograph */
- [0x83f4, 0x83f4], /* CJK Ideograph */
- [0x83f5, 0x83f5], /* CJK Ideograph */
- [0x83f6, 0x83f6], /* CJK Ideograph */
- [0x83f7, 0x83f7], /* CJK Ideograph */
- [0x83f8, 0x83f8], /* CJK Ideograph */
- [0x83f9, 0x83f9], /* CJK Ideograph */
- [0x83fa, 0x83fa], /* CJK Ideograph */
- [0x83fb, 0x83fb], /* CJK Ideograph */
- [0x83fc, 0x83fc], /* CJK Ideograph */
- [0x83fd, 0x83fd], /* CJK Ideograph */
- [0x83fe, 0x83fe], /* CJK Ideograph */
- [0x83ff, 0x83ff], /* CJK Ideograph */
- [0x8400, 0x8400], /* CJK Ideograph */
- [0x8401, 0x8401], /* CJK Ideograph */
- [0x8402, 0x8402], /* CJK Ideograph */
- [0x8403, 0x8403], /* CJK Ideograph */
- [0x8404, 0x8404], /* CJK Ideograph */
- [0x8405, 0x8405], /* CJK Ideograph */
- [0x8406, 0x8406], /* CJK Ideograph */
- [0x8407, 0x8407], /* CJK Ideograph */
- [0x8408, 0x8408], /* CJK Ideograph */
- [0x8409, 0x8409], /* CJK Ideograph */
- [0x840a, 0x840a], /* CJK Ideograph */
- [0x840b, 0x840b], /* CJK Ideograph */
- [0x840c, 0x840c], /* CJK Ideograph */
- [0x840d, 0x840d], /* CJK Ideograph */
- [0x840e, 0x840e], /* CJK Ideograph */
- [0x840f, 0x840f], /* CJK Ideograph */
- [0x8410, 0x8410], /* CJK Ideograph */
- [0x8411, 0x8411], /* CJK Ideograph */
- [0x8412, 0x8412], /* CJK Ideograph */
- [0x8413, 0x8413], /* CJK Ideograph */
- [0x8414, 0x8414], /* CJK Ideograph */
- [0x8415, 0x8415], /* CJK Ideograph */
- [0x8416, 0x8416], /* CJK Ideograph */
- [0x8417, 0x8417], /* CJK Ideograph */
- [0x8418, 0x8418], /* CJK Ideograph */
- [0x8419, 0x8419], /* CJK Ideograph */
- [0x841a, 0x841a], /* CJK Ideograph */
- [0x841b, 0x841b], /* CJK Ideograph */
- [0x841c, 0x841c], /* CJK Ideograph */
- [0x841d, 0x841d], /* CJK Ideograph */
- [0x841e, 0x841e], /* CJK Ideograph */
- [0x841f, 0x841f], /* CJK Ideograph */
- [0x8420, 0x8420], /* CJK Ideograph */
- [0x8421, 0x8421], /* CJK Ideograph */
- [0x8422, 0x8422], /* CJK Ideograph */
- [0x8423, 0x8423], /* CJK Ideograph */
- [0x8424, 0x8424], /* CJK Ideograph */
- [0x8425, 0x8425], /* CJK Ideograph */
- [0x8426, 0x8426], /* CJK Ideograph */
- [0x8427, 0x8427], /* CJK Ideograph */
- [0x8428, 0x8428], /* CJK Ideograph */
- [0x8429, 0x8429], /* CJK Ideograph */
- [0x842a, 0x842a], /* CJK Ideograph */
- [0x842b, 0x842b], /* CJK Ideograph */
- [0x842c, 0x842c], /* CJK Ideograph */
- [0x842d, 0x842d], /* CJK Ideograph */
- [0x842e, 0x842e], /* CJK Ideograph */
- [0x842f, 0x842f], /* CJK Ideograph */
- [0x8430, 0x8430], /* CJK Ideograph */
- [0x8431, 0x8431], /* CJK Ideograph */
- [0x8432, 0x8432], /* CJK Ideograph */
- [0x8433, 0x8433], /* CJK Ideograph */
- [0x8434, 0x8434], /* CJK Ideograph */
- [0x8435, 0x8435], /* CJK Ideograph */
- [0x8436, 0x8436], /* CJK Ideograph */
- [0x8437, 0x8437], /* CJK Ideograph */
- [0x8438, 0x8438], /* CJK Ideograph */
- [0x8439, 0x8439], /* CJK Ideograph */
- [0x843a, 0x843a], /* CJK Ideograph */
- [0x843b, 0x843b], /* CJK Ideograph */
- [0x843c, 0x843c], /* CJK Ideograph */
- [0x843d, 0x843d], /* CJK Ideograph */
- [0x843e, 0x843e], /* CJK Ideograph */
- [0x843f, 0x843f], /* CJK Ideograph */
- [0x8440, 0x8440], /* CJK Ideograph */
- [0x8441, 0x8441], /* CJK Ideograph */
- [0x8442, 0x8442], /* CJK Ideograph */
- [0x8443, 0x8443], /* CJK Ideograph */
- [0x8444, 0x8444], /* CJK Ideograph */
- [0x8445, 0x8445], /* CJK Ideograph */
- [0x8446, 0x8446], /* CJK Ideograph */
- [0x8447, 0x8447], /* CJK Ideograph */
- [0x8448, 0x8448], /* CJK Ideograph */
- [0x8449, 0x8449], /* CJK Ideograph */
- [0x844a, 0x844a], /* CJK Ideograph */
- [0x844b, 0x844b], /* CJK Ideograph */
- [0x844c, 0x844c], /* CJK Ideograph */
- [0x844d, 0x844d], /* CJK Ideograph */
- [0x844e, 0x844e], /* CJK Ideograph */
- [0x844f, 0x844f], /* CJK Ideograph */
- [0x8450, 0x8450], /* CJK Ideograph */
- [0x8451, 0x8451], /* CJK Ideograph */
- [0x8452, 0x8452], /* CJK Ideograph */
- [0x8453, 0x8453], /* CJK Ideograph */
- [0x8454, 0x8454], /* CJK Ideograph */
- [0x8455, 0x8455], /* CJK Ideograph */
- [0x8456, 0x8456], /* CJK Ideograph */
- [0x8457, 0x8457], /* CJK Ideograph */
- [0x8458, 0x8458], /* CJK Ideograph */
- [0x8459, 0x8459], /* CJK Ideograph */
- [0x845a, 0x845a], /* CJK Ideograph */
- [0x845b, 0x845b], /* CJK Ideograph */
- [0x845c, 0x845c], /* CJK Ideograph */
- [0x845d, 0x845d], /* CJK Ideograph */
- [0x845e, 0x845e], /* CJK Ideograph */
- [0x845f, 0x845f], /* CJK Ideograph */
- [0x8460, 0x8460], /* CJK Ideograph */
- [0x8461, 0x8461], /* CJK Ideograph */
- [0x8462, 0x8462], /* CJK Ideograph */
- [0x8463, 0x8463], /* CJK Ideograph */
- [0x8464, 0x8464], /* CJK Ideograph */
- [0x8465, 0x8465], /* CJK Ideograph */
- [0x8466, 0x8466], /* CJK Ideograph */
- [0x8467, 0x8467], /* CJK Ideograph */
- [0x8468, 0x8468], /* CJK Ideograph */
- [0x8469, 0x8469], /* CJK Ideograph */
- [0x846a, 0x846a], /* CJK Ideograph */
- [0x846b, 0x846b], /* CJK Ideograph */
- [0x846c, 0x846c], /* CJK Ideograph */
- [0x846d, 0x846d], /* CJK Ideograph */
- [0x846e, 0x846e], /* CJK Ideograph */
- [0x846f, 0x846f], /* CJK Ideograph */
- [0x8470, 0x8470], /* CJK Ideograph */
- [0x8471, 0x8471], /* CJK Ideograph */
- [0x8472, 0x8472], /* CJK Ideograph */
- [0x8473, 0x8473], /* CJK Ideograph */
- [0x8474, 0x8474], /* CJK Ideograph */
- [0x8475, 0x8475], /* CJK Ideograph */
- [0x8476, 0x8476], /* CJK Ideograph */
- [0x8477, 0x8477], /* CJK Ideograph */
- [0x8478, 0x8478], /* CJK Ideograph */
- [0x8479, 0x8479], /* CJK Ideograph */
- [0x847a, 0x847a], /* CJK Ideograph */
- [0x847b, 0x847b], /* CJK Ideograph */
- [0x847c, 0x847c], /* CJK Ideograph */
- [0x847d, 0x847d], /* CJK Ideograph */
- [0x847e, 0x847e], /* CJK Ideograph */
- [0x847f, 0x847f], /* CJK Ideograph */
- [0x8480, 0x8480], /* CJK Ideograph */
- [0x8481, 0x8481], /* CJK Ideograph */
- [0x8482, 0x8482], /* CJK Ideograph */
- [0x8483, 0x8483], /* CJK Ideograph */
- [0x8484, 0x8484], /* CJK Ideograph */
- [0x8485, 0x8485], /* CJK Ideograph */
- [0x8486, 0x8486], /* CJK Ideograph */
- [0x8487, 0x8487], /* CJK Ideograph */
- [0x8488, 0x8488], /* CJK Ideograph */
- [0x8489, 0x8489], /* CJK Ideograph */
- [0x848a, 0x848a], /* CJK Ideograph */
- [0x848b, 0x848b], /* CJK Ideograph */
- [0x848c, 0x848c], /* CJK Ideograph */
- [0x848d, 0x848d], /* CJK Ideograph */
- [0x848e, 0x848e], /* CJK Ideograph */
- [0x848f, 0x848f], /* CJK Ideograph */
- [0x8490, 0x8490], /* CJK Ideograph */
- [0x8491, 0x8491], /* CJK Ideograph */
- [0x8492, 0x8492], /* CJK Ideograph */
- [0x8493, 0x8493], /* CJK Ideograph */
- [0x8494, 0x8494], /* CJK Ideograph */
- [0x8495, 0x8495], /* CJK Ideograph */
- [0x8496, 0x8496], /* CJK Ideograph */
- [0x8497, 0x8497], /* CJK Ideograph */
- [0x8498, 0x8498], /* CJK Ideograph */
- [0x8499, 0x8499], /* CJK Ideograph */
- [0x849a, 0x849a], /* CJK Ideograph */
- [0x849b, 0x849b], /* CJK Ideograph */
- [0x849c, 0x849c], /* CJK Ideograph */
- [0x849d, 0x849d], /* CJK Ideograph */
- [0x849e, 0x849e], /* CJK Ideograph */
- [0x849f, 0x849f], /* CJK Ideograph */
- [0x84a0, 0x84a0], /* CJK Ideograph */
- [0x84a1, 0x84a1], /* CJK Ideograph */
- [0x84a2, 0x84a2], /* CJK Ideograph */
- [0x84a3, 0x84a3], /* CJK Ideograph */
- [0x84a4, 0x84a4], /* CJK Ideograph */
- [0x84a5, 0x84a5], /* CJK Ideograph */
- [0x84a6, 0x84a6], /* CJK Ideograph */
- [0x84a7, 0x84a7], /* CJK Ideograph */
- [0x84a8, 0x84a8], /* CJK Ideograph */
- [0x84a9, 0x84a9], /* CJK Ideograph */
- [0x84aa, 0x84aa], /* CJK Ideograph */
- [0x84ab, 0x84ab], /* CJK Ideograph */
- [0x84ac, 0x84ac], /* CJK Ideograph */
- [0x84ad, 0x84ad], /* CJK Ideograph */
- [0x84ae, 0x84ae], /* CJK Ideograph */
- [0x84af, 0x84af], /* CJK Ideograph */
- [0x84b0, 0x84b0], /* CJK Ideograph */
- [0x84b1, 0x84b1], /* CJK Ideograph */
- [0x84b2, 0x84b2], /* CJK Ideograph */
- [0x84b3, 0x84b3], /* CJK Ideograph */
- [0x84b4, 0x84b4], /* CJK Ideograph */
- [0x84b5, 0x84b5], /* CJK Ideograph */
- [0x84b6, 0x84b6], /* CJK Ideograph */
- [0x84b7, 0x84b7], /* CJK Ideograph */
- [0x84b8, 0x84b8], /* CJK Ideograph */
- [0x84b9, 0x84b9], /* CJK Ideograph */
- [0x84ba, 0x84ba], /* CJK Ideograph */
- [0x84bb, 0x84bb], /* CJK Ideograph */
- [0x84bc, 0x84bc], /* CJK Ideograph */
- [0x84bd, 0x84bd], /* CJK Ideograph */
- [0x84be, 0x84be], /* CJK Ideograph */
- [0x84bf, 0x84bf], /* CJK Ideograph */
- [0x84c0, 0x84c0], /* CJK Ideograph */
- [0x84c1, 0x84c1], /* CJK Ideograph */
- [0x84c2, 0x84c2], /* CJK Ideograph */
- [0x84c3, 0x84c3], /* CJK Ideograph */
- [0x84c4, 0x84c4], /* CJK Ideograph */
- [0x84c5, 0x84c5], /* CJK Ideograph */
- [0x84c6, 0x84c6], /* CJK Ideograph */
- [0x84c7, 0x84c7], /* CJK Ideograph */
- [0x84c8, 0x84c8], /* CJK Ideograph */
- [0x84c9, 0x84c9], /* CJK Ideograph */
- [0x84ca, 0x84ca], /* CJK Ideograph */
- [0x84cb, 0x84cb], /* CJK Ideograph */
- [0x84cc, 0x84cc], /* CJK Ideograph */
- [0x84cd, 0x84cd], /* CJK Ideograph */
- [0x84ce, 0x84ce], /* CJK Ideograph */
- [0x84cf, 0x84cf], /* CJK Ideograph */
- [0x84d0, 0x84d0], /* CJK Ideograph */
- [0x84d1, 0x84d1], /* CJK Ideograph */
- [0x84d2, 0x84d2], /* CJK Ideograph */
- [0x84d3, 0x84d3], /* CJK Ideograph */
- [0x84d4, 0x84d4], /* CJK Ideograph */
- [0x84d5, 0x84d5], /* CJK Ideograph */
- [0x84d6, 0x84d6], /* CJK Ideograph */
- [0x84d7, 0x84d7], /* CJK Ideograph */
- [0x84d8, 0x84d8], /* CJK Ideograph */
- [0x84d9, 0x84d9], /* CJK Ideograph */
- [0x84da, 0x84da], /* CJK Ideograph */
- [0x84db, 0x84db], /* CJK Ideograph */
- [0x84dc, 0x84dc], /* CJK Ideograph */
- [0x84dd, 0x84dd], /* CJK Ideograph */
- [0x84de, 0x84de], /* CJK Ideograph */
- [0x84df, 0x84df], /* CJK Ideograph */
- [0x84e0, 0x84e0], /* CJK Ideograph */
- [0x84e1, 0x84e1], /* CJK Ideograph */
- [0x84e2, 0x84e2], /* CJK Ideograph */
- [0x84e3, 0x84e3], /* CJK Ideograph */
- [0x84e4, 0x84e4], /* CJK Ideograph */
- [0x84e5, 0x84e5], /* CJK Ideograph */
- [0x84e6, 0x84e6], /* CJK Ideograph */
- [0x84e7, 0x84e7], /* CJK Ideograph */
- [0x84e8, 0x84e8], /* CJK Ideograph */
- [0x84e9, 0x84e9], /* CJK Ideograph */
- [0x84ea, 0x84ea], /* CJK Ideograph */
- [0x84eb, 0x84eb], /* CJK Ideograph */
- [0x84ec, 0x84ec], /* CJK Ideograph */
- [0x84ed, 0x84ed], /* CJK Ideograph */
- [0x84ee, 0x84ee], /* CJK Ideograph */
- [0x84ef, 0x84ef], /* CJK Ideograph */
- [0x84f0, 0x84f0], /* CJK Ideograph */
- [0x84f1, 0x84f1], /* CJK Ideograph */
- [0x84f2, 0x84f2], /* CJK Ideograph */
- [0x84f3, 0x84f3], /* CJK Ideograph */
- [0x84f4, 0x84f4], /* CJK Ideograph */
- [0x84f5, 0x84f5], /* CJK Ideograph */
- [0x84f6, 0x84f6], /* CJK Ideograph */
- [0x84f7, 0x84f7], /* CJK Ideograph */
- [0x84f8, 0x84f8], /* CJK Ideograph */
- [0x84f9, 0x84f9], /* CJK Ideograph */
- [0x84fa, 0x84fa], /* CJK Ideograph */
- [0x84fb, 0x84fb], /* CJK Ideograph */
- [0x84fc, 0x84fc], /* CJK Ideograph */
- [0x84fd, 0x84fd], /* CJK Ideograph */
- [0x84fe, 0x84fe], /* CJK Ideograph */
- [0x84ff, 0x84ff], /* CJK Ideograph */
- [0x8500, 0x8500], /* CJK Ideograph */
- [0x8501, 0x8501], /* CJK Ideograph */
- [0x8502, 0x8502], /* CJK Ideograph */
- [0x8503, 0x8503], /* CJK Ideograph */
- [0x8504, 0x8504], /* CJK Ideograph */
- [0x8505, 0x8505], /* CJK Ideograph */
- [0x8506, 0x8506], /* CJK Ideograph */
- [0x8507, 0x8507], /* CJK Ideograph */
- [0x8508, 0x8508], /* CJK Ideograph */
- [0x8509, 0x8509], /* CJK Ideograph */
- [0x850a, 0x850a], /* CJK Ideograph */
- [0x850b, 0x850b], /* CJK Ideograph */
- [0x850c, 0x850c], /* CJK Ideograph */
- [0x850d, 0x850d], /* CJK Ideograph */
- [0x850e, 0x850e], /* CJK Ideograph */
- [0x850f, 0x850f], /* CJK Ideograph */
- [0x8510, 0x8510], /* CJK Ideograph */
- [0x8511, 0x8511], /* CJK Ideograph */
- [0x8512, 0x8512], /* CJK Ideograph */
- [0x8513, 0x8513], /* CJK Ideograph */
- [0x8514, 0x8514], /* CJK Ideograph */
- [0x8515, 0x8515], /* CJK Ideograph */
- [0x8516, 0x8516], /* CJK Ideograph */
- [0x8517, 0x8517], /* CJK Ideograph */
- [0x8518, 0x8518], /* CJK Ideograph */
- [0x8519, 0x8519], /* CJK Ideograph */
- [0x851a, 0x851a], /* CJK Ideograph */
- [0x851b, 0x851b], /* CJK Ideograph */
- [0x851c, 0x851c], /* CJK Ideograph */
- [0x851d, 0x851d], /* CJK Ideograph */
- [0x851e, 0x851e], /* CJK Ideograph */
- [0x851f, 0x851f], /* CJK Ideograph */
- [0x8520, 0x8520], /* CJK Ideograph */
- [0x8521, 0x8521], /* CJK Ideograph */
- [0x8522, 0x8522], /* CJK Ideograph */
- [0x8523, 0x8523], /* CJK Ideograph */
- [0x8524, 0x8524], /* CJK Ideograph */
- [0x8525, 0x8525], /* CJK Ideograph */
- [0x8526, 0x8526], /* CJK Ideograph */
- [0x8527, 0x8527], /* CJK Ideograph */
- [0x8528, 0x8528], /* CJK Ideograph */
- [0x8529, 0x8529], /* CJK Ideograph */
- [0x852a, 0x852a], /* CJK Ideograph */
- [0x852b, 0x852b], /* CJK Ideograph */
- [0x852c, 0x852c], /* CJK Ideograph */
- [0x852d, 0x852d], /* CJK Ideograph */
- [0x852e, 0x852e], /* CJK Ideograph */
- [0x852f, 0x852f], /* CJK Ideograph */
- [0x8530, 0x8530], /* CJK Ideograph */
- [0x8531, 0x8531], /* CJK Ideograph */
- [0x8532, 0x8532], /* CJK Ideograph */
- [0x8533, 0x8533], /* CJK Ideograph */
- [0x8534, 0x8534], /* CJK Ideograph */
- [0x8535, 0x8535], /* CJK Ideograph */
- [0x8536, 0x8536], /* CJK Ideograph */
- [0x8537, 0x8537], /* CJK Ideograph */
- [0x8538, 0x8538], /* CJK Ideograph */
- [0x8539, 0x8539], /* CJK Ideograph */
- [0x853a, 0x853a], /* CJK Ideograph */
- [0x853b, 0x853b], /* CJK Ideograph */
- [0x853c, 0x853c], /* CJK Ideograph */
- [0x853d, 0x853d], /* CJK Ideograph */
- [0x853e, 0x853e], /* CJK Ideograph */
- [0x853f, 0x853f], /* CJK Ideograph */
- [0x8540, 0x8540], /* CJK Ideograph */
- [0x8541, 0x8541], /* CJK Ideograph */
- [0x8542, 0x8542], /* CJK Ideograph */
- [0x8543, 0x8543], /* CJK Ideograph */
- [0x8544, 0x8544], /* CJK Ideograph */
- [0x8545, 0x8545], /* CJK Ideograph */
- [0x8546, 0x8546], /* CJK Ideograph */
- [0x8547, 0x8547], /* CJK Ideograph */
- [0x8548, 0x8548], /* CJK Ideograph */
- [0x8549, 0x8549], /* CJK Ideograph */
- [0x854a, 0x854a], /* CJK Ideograph */
- [0x854b, 0x854b], /* CJK Ideograph */
- [0x854c, 0x854c], /* CJK Ideograph */
- [0x854d, 0x854d], /* CJK Ideograph */
- [0x854e, 0x854e], /* CJK Ideograph */
- [0x854f, 0x854f], /* CJK Ideograph */
- [0x8550, 0x8550], /* CJK Ideograph */
- [0x8551, 0x8551], /* CJK Ideograph */
- [0x8552, 0x8552], /* CJK Ideograph */
- [0x8553, 0x8553], /* CJK Ideograph */
- [0x8554, 0x8554], /* CJK Ideograph */
- [0x8555, 0x8555], /* CJK Ideograph */
- [0x8556, 0x8556], /* CJK Ideograph */
- [0x8557, 0x8557], /* CJK Ideograph */
- [0x8558, 0x8558], /* CJK Ideograph */
- [0x8559, 0x8559], /* CJK Ideograph */
- [0x855a, 0x855a], /* CJK Ideograph */
- [0x855b, 0x855b], /* CJK Ideograph */
- [0x855c, 0x855c], /* CJK Ideograph */
- [0x855d, 0x855d], /* CJK Ideograph */
- [0x855e, 0x855e], /* CJK Ideograph */
- [0x855f, 0x855f], /* CJK Ideograph */
- [0x8560, 0x8560], /* CJK Ideograph */
- [0x8561, 0x8561], /* CJK Ideograph */
- [0x8562, 0x8562], /* CJK Ideograph */
- [0x8563, 0x8563], /* CJK Ideograph */
- [0x8564, 0x8564], /* CJK Ideograph */
- [0x8565, 0x8565], /* CJK Ideograph */
- [0x8566, 0x8566], /* CJK Ideograph */
- [0x8567, 0x8567], /* CJK Ideograph */
- [0x8568, 0x8568], /* CJK Ideograph */
- [0x8569, 0x8569], /* CJK Ideograph */
- [0x856a, 0x856a], /* CJK Ideograph */
- [0x856b, 0x856b], /* CJK Ideograph */
- [0x856c, 0x856c], /* CJK Ideograph */
- [0x856d, 0x856d], /* CJK Ideograph */
- [0x856e, 0x856e], /* CJK Ideograph */
- [0x856f, 0x856f], /* CJK Ideograph */
- [0x8570, 0x8570], /* CJK Ideograph */
- [0x8571, 0x8571], /* CJK Ideograph */
- [0x8572, 0x8572], /* CJK Ideograph */
- [0x8573, 0x8573], /* CJK Ideograph */
- [0x8574, 0x8574], /* CJK Ideograph */
- [0x8575, 0x8575], /* CJK Ideograph */
- [0x8576, 0x8576], /* CJK Ideograph */
- [0x8577, 0x8577], /* CJK Ideograph */
- [0x8578, 0x8578], /* CJK Ideograph */
- [0x8579, 0x8579], /* CJK Ideograph */
- [0x857a, 0x857a], /* CJK Ideograph */
- [0x857b, 0x857b], /* CJK Ideograph */
- [0x857c, 0x857c], /* CJK Ideograph */
- [0x857d, 0x857d], /* CJK Ideograph */
- [0x857e, 0x857e], /* CJK Ideograph */
- [0x857f, 0x857f], /* CJK Ideograph */
- [0x8580, 0x8580], /* CJK Ideograph */
- [0x8581, 0x8581], /* CJK Ideograph */
- [0x8582, 0x8582], /* CJK Ideograph */
- [0x8583, 0x8583], /* CJK Ideograph */
- [0x8584, 0x8584], /* CJK Ideograph */
- [0x8585, 0x8585], /* CJK Ideograph */
- [0x8586, 0x8586], /* CJK Ideograph */
- [0x8587, 0x8587], /* CJK Ideograph */
- [0x8588, 0x8588], /* CJK Ideograph */
- [0x8589, 0x8589], /* CJK Ideograph */
- [0x858a, 0x858a], /* CJK Ideograph */
- [0x858b, 0x858b], /* CJK Ideograph */
- [0x858c, 0x858c], /* CJK Ideograph */
- [0x858d, 0x858d], /* CJK Ideograph */
- [0x858e, 0x858e], /* CJK Ideograph */
- [0x858f, 0x858f], /* CJK Ideograph */
- [0x8590, 0x8590], /* CJK Ideograph */
- [0x8591, 0x8591], /* CJK Ideograph */
- [0x8592, 0x8592], /* CJK Ideograph */
- [0x8593, 0x8593], /* CJK Ideograph */
- [0x8594, 0x8594], /* CJK Ideograph */
- [0x8595, 0x8595], /* CJK Ideograph */
- [0x8596, 0x8596], /* CJK Ideograph */
- [0x8597, 0x8597], /* CJK Ideograph */
- [0x8598, 0x8598], /* CJK Ideograph */
- [0x8599, 0x8599], /* CJK Ideograph */
- [0x859a, 0x859a], /* CJK Ideograph */
- [0x859b, 0x859b], /* CJK Ideograph */
- [0x859c, 0x859c], /* CJK Ideograph */
- [0x859d, 0x859d], /* CJK Ideograph */
- [0x859e, 0x859e], /* CJK Ideograph */
- [0x859f, 0x859f], /* CJK Ideograph */
- [0x85a0, 0x85a0], /* CJK Ideograph */
- [0x85a1, 0x85a1], /* CJK Ideograph */
- [0x85a2, 0x85a2], /* CJK Ideograph */
- [0x85a3, 0x85a3], /* CJK Ideograph */
- [0x85a4, 0x85a4], /* CJK Ideograph */
- [0x85a5, 0x85a5], /* CJK Ideograph */
- [0x85a6, 0x85a6], /* CJK Ideograph */
- [0x85a7, 0x85a7], /* CJK Ideograph */
- [0x85a8, 0x85a8], /* CJK Ideograph */
- [0x85a9, 0x85a9], /* CJK Ideograph */
- [0x85aa, 0x85aa], /* CJK Ideograph */
- [0x85ab, 0x85ab], /* CJK Ideograph */
- [0x85ac, 0x85ac], /* CJK Ideograph */
- [0x85ad, 0x85ad], /* CJK Ideograph */
- [0x85ae, 0x85ae], /* CJK Ideograph */
- [0x85af, 0x85af], /* CJK Ideograph */
- [0x85b0, 0x85b0], /* CJK Ideograph */
- [0x85b1, 0x85b1], /* CJK Ideograph */
- [0x85b2, 0x85b2], /* CJK Ideograph */
- [0x85b3, 0x85b3], /* CJK Ideograph */
- [0x85b4, 0x85b4], /* CJK Ideograph */
- [0x85b5, 0x85b5], /* CJK Ideograph */
- [0x85b6, 0x85b6], /* CJK Ideograph */
- [0x85b7, 0x85b7], /* CJK Ideograph */
- [0x85b8, 0x85b8], /* CJK Ideograph */
- [0x85b9, 0x85b9], /* CJK Ideograph */
- [0x85ba, 0x85ba], /* CJK Ideograph */
- [0x85bb, 0x85bb], /* CJK Ideograph */
- [0x85bc, 0x85bc], /* CJK Ideograph */
- [0x85bd, 0x85bd], /* CJK Ideograph */
- [0x85be, 0x85be], /* CJK Ideograph */
- [0x85bf, 0x85bf], /* CJK Ideograph */
- [0x85c0, 0x85c0], /* CJK Ideograph */
- [0x85c1, 0x85c1], /* CJK Ideograph */
- [0x85c2, 0x85c2], /* CJK Ideograph */
- [0x85c3, 0x85c3], /* CJK Ideograph */
- [0x85c4, 0x85c4], /* CJK Ideograph */
- [0x85c5, 0x85c5], /* CJK Ideograph */
- [0x85c6, 0x85c6], /* CJK Ideograph */
- [0x85c7, 0x85c7], /* CJK Ideograph */
- [0x85c8, 0x85c8], /* CJK Ideograph */
- [0x85c9, 0x85c9], /* CJK Ideograph */
- [0x85ca, 0x85ca], /* CJK Ideograph */
- [0x85cb, 0x85cb], /* CJK Ideograph */
- [0x85cc, 0x85cc], /* CJK Ideograph */
- [0x85cd, 0x85cd], /* CJK Ideograph */
- [0x85ce, 0x85ce], /* CJK Ideograph */
- [0x85cf, 0x85cf], /* CJK Ideograph */
- [0x85d0, 0x85d0], /* CJK Ideograph */
- [0x85d1, 0x85d1], /* CJK Ideograph */
- [0x85d2, 0x85d2], /* CJK Ideograph */
- [0x85d3, 0x85d3], /* CJK Ideograph */
- [0x85d4, 0x85d4], /* CJK Ideograph */
- [0x85d5, 0x85d5], /* CJK Ideograph */
- [0x85d6, 0x85d6], /* CJK Ideograph */
- [0x85d7, 0x85d7], /* CJK Ideograph */
- [0x85d8, 0x85d8], /* CJK Ideograph */
- [0x85d9, 0x85d9], /* CJK Ideograph */
- [0x85da, 0x85da], /* CJK Ideograph */
- [0x85db, 0x85db], /* CJK Ideograph */
- [0x85dc, 0x85dc], /* CJK Ideograph */
- [0x85dd, 0x85dd], /* CJK Ideograph */
- [0x85de, 0x85de], /* CJK Ideograph */
- [0x85df, 0x85df], /* CJK Ideograph */
- [0x85e0, 0x85e0], /* CJK Ideograph */
- [0x85e1, 0x85e1], /* CJK Ideograph */
- [0x85e2, 0x85e2], /* CJK Ideograph */
- [0x85e3, 0x85e3], /* CJK Ideograph */
- [0x85e4, 0x85e4], /* CJK Ideograph */
- [0x85e5, 0x85e5], /* CJK Ideograph */
- [0x85e6, 0x85e6], /* CJK Ideograph */
- [0x85e7, 0x85e7], /* CJK Ideograph */
- [0x85e8, 0x85e8], /* CJK Ideograph */
- [0x85e9, 0x85e9], /* CJK Ideograph */
- [0x85ea, 0x85ea], /* CJK Ideograph */
- [0x85eb, 0x85eb], /* CJK Ideograph */
- [0x85ec, 0x85ec], /* CJK Ideograph */
- [0x85ed, 0x85ed], /* CJK Ideograph */
- [0x85ee, 0x85ee], /* CJK Ideograph */
- [0x85ef, 0x85ef], /* CJK Ideograph */
- [0x85f0, 0x85f0], /* CJK Ideograph */
- [0x85f1, 0x85f1], /* CJK Ideograph */
- [0x85f2, 0x85f2], /* CJK Ideograph */
- [0x85f3, 0x85f3], /* CJK Ideograph */
- [0x85f4, 0x85f4], /* CJK Ideograph */
- [0x85f5, 0x85f5], /* CJK Ideograph */
- [0x85f6, 0x85f6], /* CJK Ideograph */
- [0x85f7, 0x85f7], /* CJK Ideograph */
- [0x85f8, 0x85f8], /* CJK Ideograph */
- [0x85f9, 0x85f9], /* CJK Ideograph */
- [0x85fa, 0x85fa], /* CJK Ideograph */
- [0x85fb, 0x85fb], /* CJK Ideograph */
- [0x85fc, 0x85fc], /* CJK Ideograph */
- [0x85fd, 0x85fd], /* CJK Ideograph */
- [0x85fe, 0x85fe], /* CJK Ideograph */
- [0x85ff, 0x85ff], /* CJK Ideograph */
- [0x8600, 0x8600], /* CJK Ideograph */
- [0x8601, 0x8601], /* CJK Ideograph */
- [0x8602, 0x8602], /* CJK Ideograph */
- [0x8603, 0x8603], /* CJK Ideograph */
- [0x8604, 0x8604], /* CJK Ideograph */
- [0x8605, 0x8605], /* CJK Ideograph */
- [0x8606, 0x8606], /* CJK Ideograph */
- [0x8607, 0x8607], /* CJK Ideograph */
- [0x8608, 0x8608], /* CJK Ideograph */
- [0x8609, 0x8609], /* CJK Ideograph */
- [0x860a, 0x860a], /* CJK Ideograph */
- [0x860b, 0x860b], /* CJK Ideograph */
- [0x860c, 0x860c], /* CJK Ideograph */
- [0x860d, 0x860d], /* CJK Ideograph */
- [0x860e, 0x860e], /* CJK Ideograph */
- [0x860f, 0x860f], /* CJK Ideograph */
- [0x8610, 0x8610], /* CJK Ideograph */
- [0x8611, 0x8611], /* CJK Ideograph */
- [0x8612, 0x8612], /* CJK Ideograph */
- [0x8613, 0x8613], /* CJK Ideograph */
- [0x8614, 0x8614], /* CJK Ideograph */
- [0x8615, 0x8615], /* CJK Ideograph */
- [0x8616, 0x8616], /* CJK Ideograph */
- [0x8617, 0x8617], /* CJK Ideograph */
- [0x8618, 0x8618], /* CJK Ideograph */
- [0x8619, 0x8619], /* CJK Ideograph */
- [0x861a, 0x861a], /* CJK Ideograph */
- [0x861b, 0x861b], /* CJK Ideograph */
- [0x861c, 0x861c], /* CJK Ideograph */
- [0x861d, 0x861d], /* CJK Ideograph */
- [0x861e, 0x861e], /* CJK Ideograph */
- [0x861f, 0x861f], /* CJK Ideograph */
- [0x8620, 0x8620], /* CJK Ideograph */
- [0x8621, 0x8621], /* CJK Ideograph */
- [0x8622, 0x8622], /* CJK Ideograph */
- [0x8623, 0x8623], /* CJK Ideograph */
- [0x8624, 0x8624], /* CJK Ideograph */
- [0x8625, 0x8625], /* CJK Ideograph */
- [0x8626, 0x8626], /* CJK Ideograph */
- [0x8627, 0x8627], /* CJK Ideograph */
- [0x8628, 0x8628], /* CJK Ideograph */
- [0x8629, 0x8629], /* CJK Ideograph */
- [0x862a, 0x862a], /* CJK Ideograph */
- [0x862b, 0x862b], /* CJK Ideograph */
- [0x862c, 0x862c], /* CJK Ideograph */
- [0x862d, 0x862d], /* CJK Ideograph */
- [0x862e, 0x862e], /* CJK Ideograph */
- [0x862f, 0x862f], /* CJK Ideograph */
- [0x8630, 0x8630], /* CJK Ideograph */
- [0x8631, 0x8631], /* CJK Ideograph */
- [0x8632, 0x8632], /* CJK Ideograph */
- [0x8633, 0x8633], /* CJK Ideograph */
- [0x8634, 0x8634], /* CJK Ideograph */
- [0x8635, 0x8635], /* CJK Ideograph */
- [0x8636, 0x8636], /* CJK Ideograph */
- [0x8637, 0x8637], /* CJK Ideograph */
- [0x8638, 0x8638], /* CJK Ideograph */
- [0x8639, 0x8639], /* CJK Ideograph */
- [0x863a, 0x863a], /* CJK Ideograph */
- [0x863b, 0x863b], /* CJK Ideograph */
- [0x863c, 0x863c], /* CJK Ideograph */
- [0x863d, 0x863d], /* CJK Ideograph */
- [0x863e, 0x863e], /* CJK Ideograph */
- [0x863f, 0x863f], /* CJK Ideograph */
- [0x8640, 0x8640], /* CJK Ideograph */
- [0x8641, 0x8641], /* CJK Ideograph */
- [0x8642, 0x8642], /* CJK Ideograph */
- [0x8643, 0x8643], /* CJK Ideograph */
- [0x8644, 0x8644], /* CJK Ideograph */
- [0x8645, 0x8645], /* CJK Ideograph */
- [0x8646, 0x8646], /* CJK Ideograph */
- [0x8647, 0x8647], /* CJK Ideograph */
- [0x8648, 0x8648], /* CJK Ideograph */
- [0x8649, 0x8649], /* CJK Ideograph */
- [0x864a, 0x864a], /* CJK Ideograph */
- [0x864b, 0x864b], /* CJK Ideograph */
- [0x864c, 0x864c], /* CJK Ideograph */
- [0x864d, 0x864d], /* CJK Ideograph */
- [0x864e, 0x864e], /* CJK Ideograph */
- [0x864f, 0x864f], /* CJK Ideograph */
- [0x8650, 0x8650], /* CJK Ideograph */
- [0x8651, 0x8651], /* CJK Ideograph */
- [0x8652, 0x8652], /* CJK Ideograph */
- [0x8653, 0x8653], /* CJK Ideograph */
- [0x8654, 0x8654], /* CJK Ideograph */
- [0x8655, 0x8655], /* CJK Ideograph */
- [0x8656, 0x8656], /* CJK Ideograph */
- [0x8657, 0x8657], /* CJK Ideograph */
- [0x8658, 0x8658], /* CJK Ideograph */
- [0x8659, 0x8659], /* CJK Ideograph */
- [0x865a, 0x865a], /* CJK Ideograph */
- [0x865b, 0x865b], /* CJK Ideograph */
- [0x865c, 0x865c], /* CJK Ideograph */
- [0x865d, 0x865d], /* CJK Ideograph */
- [0x865e, 0x865e], /* CJK Ideograph */
- [0x865f, 0x865f], /* CJK Ideograph */
- [0x8660, 0x8660], /* CJK Ideograph */
- [0x8661, 0x8661], /* CJK Ideograph */
- [0x8662, 0x8662], /* CJK Ideograph */
- [0x8663, 0x8663], /* CJK Ideograph */
- [0x8664, 0x8664], /* CJK Ideograph */
- [0x8665, 0x8665], /* CJK Ideograph */
- [0x8666, 0x8666], /* CJK Ideograph */
- [0x8667, 0x8667], /* CJK Ideograph */
- [0x8668, 0x8668], /* CJK Ideograph */
- [0x8669, 0x8669], /* CJK Ideograph */
- [0x866a, 0x866a], /* CJK Ideograph */
- [0x866b, 0x866b], /* CJK Ideograph */
- [0x866c, 0x866c], /* CJK Ideograph */
- [0x866d, 0x866d], /* CJK Ideograph */
- [0x866e, 0x866e], /* CJK Ideograph */
- [0x866f, 0x866f], /* CJK Ideograph */
- [0x8670, 0x8670], /* CJK Ideograph */
- [0x8671, 0x8671], /* CJK Ideograph */
- [0x8672, 0x8672], /* CJK Ideograph */
- [0x8673, 0x8673], /* CJK Ideograph */
- [0x8674, 0x8674], /* CJK Ideograph */
- [0x8675, 0x8675], /* CJK Ideograph */
- [0x8676, 0x8676], /* CJK Ideograph */
- [0x8677, 0x8677], /* CJK Ideograph */
- [0x8678, 0x8678], /* CJK Ideograph */
- [0x8679, 0x8679], /* CJK Ideograph */
- [0x867a, 0x867a], /* CJK Ideograph */
- [0x867b, 0x867b], /* CJK Ideograph */
- [0x867c, 0x867c], /* CJK Ideograph */
- [0x867d, 0x867d], /* CJK Ideograph */
- [0x867e, 0x867e], /* CJK Ideograph */
- [0x867f, 0x867f], /* CJK Ideograph */
- [0x8680, 0x8680], /* CJK Ideograph */
- [0x8681, 0x8681], /* CJK Ideograph */
- [0x8682, 0x8682], /* CJK Ideograph */
- [0x8683, 0x8683], /* CJK Ideograph */
- [0x8684, 0x8684], /* CJK Ideograph */
- [0x8685, 0x8685], /* CJK Ideograph */
- [0x8686, 0x8686], /* CJK Ideograph */
- [0x8687, 0x8687], /* CJK Ideograph */
- [0x8688, 0x8688], /* CJK Ideograph */
- [0x8689, 0x8689], /* CJK Ideograph */
- [0x868a, 0x868a], /* CJK Ideograph */
- [0x868b, 0x868b], /* CJK Ideograph */
- [0x868c, 0x868c], /* CJK Ideograph */
- [0x868d, 0x868d], /* CJK Ideograph */
- [0x868e, 0x868e], /* CJK Ideograph */
- [0x868f, 0x868f], /* CJK Ideograph */
- [0x8690, 0x8690], /* CJK Ideograph */
- [0x8691, 0x8691], /* CJK Ideograph */
- [0x8692, 0x8692], /* CJK Ideograph */
- [0x8693, 0x8693], /* CJK Ideograph */
- [0x8694, 0x8694], /* CJK Ideograph */
- [0x8695, 0x8695], /* CJK Ideograph */
- [0x8696, 0x8696], /* CJK Ideograph */
- [0x8697, 0x8697], /* CJK Ideograph */
- [0x8698, 0x8698], /* CJK Ideograph */
- [0x8699, 0x8699], /* CJK Ideograph */
- [0x869a, 0x869a], /* CJK Ideograph */
- [0x869b, 0x869b], /* CJK Ideograph */
- [0x869c, 0x869c], /* CJK Ideograph */
- [0x869d, 0x869d], /* CJK Ideograph */
- [0x869e, 0x869e], /* CJK Ideograph */
- [0x869f, 0x869f], /* CJK Ideograph */
- [0x86a0, 0x86a0], /* CJK Ideograph */
- [0x86a1, 0x86a1], /* CJK Ideograph */
- [0x86a2, 0x86a2], /* CJK Ideograph */
- [0x86a3, 0x86a3], /* CJK Ideograph */
- [0x86a4, 0x86a4], /* CJK Ideograph */
- [0x86a5, 0x86a5], /* CJK Ideograph */
- [0x86a6, 0x86a6], /* CJK Ideograph */
- [0x86a7, 0x86a7], /* CJK Ideograph */
- [0x86a8, 0x86a8], /* CJK Ideograph */
- [0x86a9, 0x86a9], /* CJK Ideograph */
- [0x86aa, 0x86aa], /* CJK Ideograph */
- [0x86ab, 0x86ab], /* CJK Ideograph */
- [0x86ac, 0x86ac], /* CJK Ideograph */
- [0x86ad, 0x86ad], /* CJK Ideograph */
- [0x86ae, 0x86ae], /* CJK Ideograph */
- [0x86af, 0x86af], /* CJK Ideograph */
- [0x86b0, 0x86b0], /* CJK Ideograph */
- [0x86b1, 0x86b1], /* CJK Ideograph */
- [0x86b2, 0x86b2], /* CJK Ideograph */
- [0x86b3, 0x86b3], /* CJK Ideograph */
- [0x86b4, 0x86b4], /* CJK Ideograph */
- [0x86b5, 0x86b5], /* CJK Ideograph */
- [0x86b6, 0x86b6], /* CJK Ideograph */
- [0x86b7, 0x86b7], /* CJK Ideograph */
- [0x86b8, 0x86b8], /* CJK Ideograph */
- [0x86b9, 0x86b9], /* CJK Ideograph */
- [0x86ba, 0x86ba], /* CJK Ideograph */
- [0x86bb, 0x86bb], /* CJK Ideograph */
- [0x86bc, 0x86bc], /* CJK Ideograph */
- [0x86bd, 0x86bd], /* CJK Ideograph */
- [0x86be, 0x86be], /* CJK Ideograph */
- [0x86bf, 0x86bf], /* CJK Ideograph */
- [0x86c0, 0x86c0], /* CJK Ideograph */
- [0x86c1, 0x86c1], /* CJK Ideograph */
- [0x86c2, 0x86c2], /* CJK Ideograph */
- [0x86c3, 0x86c3], /* CJK Ideograph */
- [0x86c4, 0x86c4], /* CJK Ideograph */
- [0x86c5, 0x86c5], /* CJK Ideograph */
- [0x86c6, 0x86c6], /* CJK Ideograph */
- [0x86c7, 0x86c7], /* CJK Ideograph */
- [0x86c8, 0x86c8], /* CJK Ideograph */
- [0x86c9, 0x86c9], /* CJK Ideograph */
- [0x86ca, 0x86ca], /* CJK Ideograph */
- [0x86cb, 0x86cb], /* CJK Ideograph */
- [0x86cc, 0x86cc], /* CJK Ideograph */
- [0x86cd, 0x86cd], /* CJK Ideograph */
- [0x86ce, 0x86ce], /* CJK Ideograph */
- [0x86cf, 0x86cf], /* CJK Ideograph */
- [0x86d0, 0x86d0], /* CJK Ideograph */
- [0x86d1, 0x86d1], /* CJK Ideograph */
- [0x86d2, 0x86d2], /* CJK Ideograph */
- [0x86d3, 0x86d3], /* CJK Ideograph */
- [0x86d4, 0x86d4], /* CJK Ideograph */
- [0x86d5, 0x86d5], /* CJK Ideograph */
- [0x86d6, 0x86d6], /* CJK Ideograph */
- [0x86d7, 0x86d7], /* CJK Ideograph */
- [0x86d8, 0x86d8], /* CJK Ideograph */
- [0x86d9, 0x86d9], /* CJK Ideograph */
- [0x86da, 0x86da], /* CJK Ideograph */
- [0x86db, 0x86db], /* CJK Ideograph */
- [0x86dc, 0x86dc], /* CJK Ideograph */
- [0x86dd, 0x86dd], /* CJK Ideograph */
- [0x86de, 0x86de], /* CJK Ideograph */
- [0x86df, 0x86df], /* CJK Ideograph */
- [0x86e0, 0x86e0], /* CJK Ideograph */
- [0x86e1, 0x86e1], /* CJK Ideograph */
- [0x86e2, 0x86e2], /* CJK Ideograph */
- [0x86e3, 0x86e3], /* CJK Ideograph */
- [0x86e4, 0x86e4], /* CJK Ideograph */
- [0x86e5, 0x86e5], /* CJK Ideograph */
- [0x86e6, 0x86e6], /* CJK Ideograph */
- [0x86e7, 0x86e7], /* CJK Ideograph */
- [0x86e8, 0x86e8], /* CJK Ideograph */
- [0x86e9, 0x86e9], /* CJK Ideograph */
- [0x86ea, 0x86ea], /* CJK Ideograph */
- [0x86eb, 0x86eb], /* CJK Ideograph */
- [0x86ec, 0x86ec], /* CJK Ideograph */
- [0x86ed, 0x86ed], /* CJK Ideograph */
- [0x86ee, 0x86ee], /* CJK Ideograph */
- [0x86ef, 0x86ef], /* CJK Ideograph */
- [0x86f0, 0x86f0], /* CJK Ideograph */
- [0x86f1, 0x86f1], /* CJK Ideograph */
- [0x86f2, 0x86f2], /* CJK Ideograph */
- [0x86f3, 0x86f3], /* CJK Ideograph */
- [0x86f4, 0x86f4], /* CJK Ideograph */
- [0x86f5, 0x86f5], /* CJK Ideograph */
- [0x86f6, 0x86f6], /* CJK Ideograph */
- [0x86f7, 0x86f7], /* CJK Ideograph */
- [0x86f8, 0x86f8], /* CJK Ideograph */
- [0x86f9, 0x86f9], /* CJK Ideograph */
- [0x86fa, 0x86fa], /* CJK Ideograph */
- [0x86fb, 0x86fb], /* CJK Ideograph */
- [0x86fc, 0x86fc], /* CJK Ideograph */
- [0x86fd, 0x86fd], /* CJK Ideograph */
- [0x86fe, 0x86fe], /* CJK Ideograph */
- [0x86ff, 0x86ff], /* CJK Ideograph */
- [0x8700, 0x8700], /* CJK Ideograph */
- [0x8701, 0x8701], /* CJK Ideograph */
- [0x8702, 0x8702], /* CJK Ideograph */
- [0x8703, 0x8703], /* CJK Ideograph */
- [0x8704, 0x8704], /* CJK Ideograph */
- [0x8705, 0x8705], /* CJK Ideograph */
- [0x8706, 0x8706], /* CJK Ideograph */
- [0x8707, 0x8707], /* CJK Ideograph */
- [0x8708, 0x8708], /* CJK Ideograph */
- [0x8709, 0x8709], /* CJK Ideograph */
- [0x870a, 0x870a], /* CJK Ideograph */
- [0x870b, 0x870b], /* CJK Ideograph */
- [0x870c, 0x870c], /* CJK Ideograph */
- [0x870d, 0x870d], /* CJK Ideograph */
- [0x870e, 0x870e], /* CJK Ideograph */
- [0x870f, 0x870f], /* CJK Ideograph */
- [0x8710, 0x8710], /* CJK Ideograph */
- [0x8711, 0x8711], /* CJK Ideograph */
- [0x8712, 0x8712], /* CJK Ideograph */
- [0x8713, 0x8713], /* CJK Ideograph */
- [0x8714, 0x8714], /* CJK Ideograph */
- [0x8715, 0x8715], /* CJK Ideograph */
- [0x8716, 0x8716], /* CJK Ideograph */
- [0x8717, 0x8717], /* CJK Ideograph */
- [0x8718, 0x8718], /* CJK Ideograph */
- [0x8719, 0x8719], /* CJK Ideograph */
- [0x871a, 0x871a], /* CJK Ideograph */
- [0x871b, 0x871b], /* CJK Ideograph */
- [0x871c, 0x871c], /* CJK Ideograph */
- [0x871d, 0x871d], /* CJK Ideograph */
- [0x871e, 0x871e], /* CJK Ideograph */
- [0x871f, 0x871f], /* CJK Ideograph */
- [0x8720, 0x8720], /* CJK Ideograph */
- [0x8721, 0x8721], /* CJK Ideograph */
- [0x8722, 0x8722], /* CJK Ideograph */
- [0x8723, 0x8723], /* CJK Ideograph */
- [0x8724, 0x8724], /* CJK Ideograph */
- [0x8725, 0x8725], /* CJK Ideograph */
- [0x8726, 0x8726], /* CJK Ideograph */
- [0x8727, 0x8727], /* CJK Ideograph */
- [0x8728, 0x8728], /* CJK Ideograph */
- [0x8729, 0x8729], /* CJK Ideograph */
- [0x872a, 0x872a], /* CJK Ideograph */
- [0x872b, 0x872b], /* CJK Ideograph */
- [0x872c, 0x872c], /* CJK Ideograph */
- [0x872d, 0x872d], /* CJK Ideograph */
- [0x872e, 0x872e], /* CJK Ideograph */
- [0x872f, 0x872f], /* CJK Ideograph */
- [0x8730, 0x8730], /* CJK Ideograph */
- [0x8731, 0x8731], /* CJK Ideograph */
- [0x8732, 0x8732], /* CJK Ideograph */
- [0x8733, 0x8733], /* CJK Ideograph */
- [0x8734, 0x8734], /* CJK Ideograph */
- [0x8735, 0x8735], /* CJK Ideograph */
- [0x8736, 0x8736], /* CJK Ideograph */
- [0x8737, 0x8737], /* CJK Ideograph */
- [0x8738, 0x8738], /* CJK Ideograph */
- [0x8739, 0x8739], /* CJK Ideograph */
- [0x873a, 0x873a], /* CJK Ideograph */
- [0x873b, 0x873b], /* CJK Ideograph */
- [0x873c, 0x873c], /* CJK Ideograph */
- [0x873d, 0x873d], /* CJK Ideograph */
- [0x873e, 0x873e], /* CJK Ideograph */
- [0x873f, 0x873f], /* CJK Ideograph */
- [0x8740, 0x8740], /* CJK Ideograph */
- [0x8741, 0x8741], /* CJK Ideograph */
- [0x8742, 0x8742], /* CJK Ideograph */
- [0x8743, 0x8743], /* CJK Ideograph */
- [0x8744, 0x8744], /* CJK Ideograph */
- [0x8745, 0x8745], /* CJK Ideograph */
- [0x8746, 0x8746], /* CJK Ideograph */
- [0x8747, 0x8747], /* CJK Ideograph */
- [0x8748, 0x8748], /* CJK Ideograph */
- [0x8749, 0x8749], /* CJK Ideograph */
- [0x874a, 0x874a], /* CJK Ideograph */
- [0x874b, 0x874b], /* CJK Ideograph */
- [0x874c, 0x874c], /* CJK Ideograph */
- [0x874d, 0x874d], /* CJK Ideograph */
- [0x874e, 0x874e], /* CJK Ideograph */
- [0x874f, 0x874f], /* CJK Ideograph */
- [0x8750, 0x8750], /* CJK Ideograph */
- [0x8751, 0x8751], /* CJK Ideograph */
- [0x8752, 0x8752], /* CJK Ideograph */
- [0x8753, 0x8753], /* CJK Ideograph */
- [0x8754, 0x8754], /* CJK Ideograph */
- [0x8755, 0x8755], /* CJK Ideograph */
- [0x8756, 0x8756], /* CJK Ideograph */
- [0x8757, 0x8757], /* CJK Ideograph */
- [0x8758, 0x8758], /* CJK Ideograph */
- [0x8759, 0x8759], /* CJK Ideograph */
- [0x875a, 0x875a], /* CJK Ideograph */
- [0x875b, 0x875b], /* CJK Ideograph */
- [0x875c, 0x875c], /* CJK Ideograph */
- [0x875d, 0x875d], /* CJK Ideograph */
- [0x875e, 0x875e], /* CJK Ideograph */
- [0x875f, 0x875f], /* CJK Ideograph */
- [0x8760, 0x8760], /* CJK Ideograph */
- [0x8761, 0x8761], /* CJK Ideograph */
- [0x8762, 0x8762], /* CJK Ideograph */
- [0x8763, 0x8763], /* CJK Ideograph */
- [0x8764, 0x8764], /* CJK Ideograph */
- [0x8765, 0x8765], /* CJK Ideograph */
- [0x8766, 0x8766], /* CJK Ideograph */
- [0x8767, 0x8767], /* CJK Ideograph */
- [0x8768, 0x8768], /* CJK Ideograph */
- [0x8769, 0x8769], /* CJK Ideograph */
- [0x876a, 0x876a], /* CJK Ideograph */
- [0x876b, 0x876b], /* CJK Ideograph */
- [0x876c, 0x876c], /* CJK Ideograph */
- [0x876d, 0x876d], /* CJK Ideograph */
- [0x876e, 0x876e], /* CJK Ideograph */
- [0x876f, 0x876f], /* CJK Ideograph */
- [0x8770, 0x8770], /* CJK Ideograph */
- [0x8771, 0x8771], /* CJK Ideograph */
- [0x8772, 0x8772], /* CJK Ideograph */
- [0x8773, 0x8773], /* CJK Ideograph */
- [0x8774, 0x8774], /* CJK Ideograph */
- [0x8775, 0x8775], /* CJK Ideograph */
- [0x8776, 0x8776], /* CJK Ideograph */
- [0x8777, 0x8777], /* CJK Ideograph */
- [0x8778, 0x8778], /* CJK Ideograph */
- [0x8779, 0x8779], /* CJK Ideograph */
- [0x877a, 0x877a], /* CJK Ideograph */
- [0x877b, 0x877b], /* CJK Ideograph */
- [0x877c, 0x877c], /* CJK Ideograph */
- [0x877d, 0x877d], /* CJK Ideograph */
- [0x877e, 0x877e], /* CJK Ideograph */
- [0x877f, 0x877f], /* CJK Ideograph */
- [0x8780, 0x8780], /* CJK Ideograph */
- [0x8781, 0x8781], /* CJK Ideograph */
- [0x8782, 0x8782], /* CJK Ideograph */
- [0x8783, 0x8783], /* CJK Ideograph */
- [0x8784, 0x8784], /* CJK Ideograph */
- [0x8785, 0x8785], /* CJK Ideograph */
- [0x8786, 0x8786], /* CJK Ideograph */
- [0x8787, 0x8787], /* CJK Ideograph */
- [0x8788, 0x8788], /* CJK Ideograph */
- [0x8789, 0x8789], /* CJK Ideograph */
- [0x878a, 0x878a], /* CJK Ideograph */
- [0x878b, 0x878b], /* CJK Ideograph */
- [0x878c, 0x878c], /* CJK Ideograph */
- [0x878d, 0x878d], /* CJK Ideograph */
- [0x878e, 0x878e], /* CJK Ideograph */
- [0x878f, 0x878f], /* CJK Ideograph */
- [0x8790, 0x8790], /* CJK Ideograph */
- [0x8791, 0x8791], /* CJK Ideograph */
- [0x8792, 0x8792], /* CJK Ideograph */
- [0x8793, 0x8793], /* CJK Ideograph */
- [0x8794, 0x8794], /* CJK Ideograph */
- [0x8795, 0x8795], /* CJK Ideograph */
- [0x8796, 0x8796], /* CJK Ideograph */
- [0x8797, 0x8797], /* CJK Ideograph */
- [0x8798, 0x8798], /* CJK Ideograph */
- [0x8799, 0x8799], /* CJK Ideograph */
- [0x879a, 0x879a], /* CJK Ideograph */
- [0x879b, 0x879b], /* CJK Ideograph */
- [0x879c, 0x879c], /* CJK Ideograph */
- [0x879d, 0x879d], /* CJK Ideograph */
- [0x879e, 0x879e], /* CJK Ideograph */
- [0x879f, 0x879f], /* CJK Ideograph */
- [0x87a0, 0x87a0], /* CJK Ideograph */
- [0x87a1, 0x87a1], /* CJK Ideograph */
- [0x87a2, 0x87a2], /* CJK Ideograph */
- [0x87a3, 0x87a3], /* CJK Ideograph */
- [0x87a4, 0x87a4], /* CJK Ideograph */
- [0x87a5, 0x87a5], /* CJK Ideograph */
- [0x87a6, 0x87a6], /* CJK Ideograph */
- [0x87a7, 0x87a7], /* CJK Ideograph */
- [0x87a8, 0x87a8], /* CJK Ideograph */
- [0x87a9, 0x87a9], /* CJK Ideograph */
- [0x87aa, 0x87aa], /* CJK Ideograph */
- [0x87ab, 0x87ab], /* CJK Ideograph */
- [0x87ac, 0x87ac], /* CJK Ideograph */
- [0x87ad, 0x87ad], /* CJK Ideograph */
- [0x87ae, 0x87ae], /* CJK Ideograph */
- [0x87af, 0x87af], /* CJK Ideograph */
- [0x87b0, 0x87b0], /* CJK Ideograph */
- [0x87b1, 0x87b1], /* CJK Ideograph */
- [0x87b2, 0x87b2], /* CJK Ideograph */
- [0x87b3, 0x87b3], /* CJK Ideograph */
- [0x87b4, 0x87b4], /* CJK Ideograph */
- [0x87b5, 0x87b5], /* CJK Ideograph */
- [0x87b6, 0x87b6], /* CJK Ideograph */
- [0x87b7, 0x87b7], /* CJK Ideograph */
- [0x87b8, 0x87b8], /* CJK Ideograph */
- [0x87b9, 0x87b9], /* CJK Ideograph */
- [0x87ba, 0x87ba], /* CJK Ideograph */
- [0x87bb, 0x87bb], /* CJK Ideograph */
- [0x87bc, 0x87bc], /* CJK Ideograph */
- [0x87bd, 0x87bd], /* CJK Ideograph */
- [0x87be, 0x87be], /* CJK Ideograph */
- [0x87bf, 0x87bf], /* CJK Ideograph */
- [0x87c0, 0x87c0], /* CJK Ideograph */
- [0x87c1, 0x87c1], /* CJK Ideograph */
- [0x87c2, 0x87c2], /* CJK Ideograph */
- [0x87c3, 0x87c3], /* CJK Ideograph */
- [0x87c4, 0x87c4], /* CJK Ideograph */
- [0x87c5, 0x87c5], /* CJK Ideograph */
- [0x87c6, 0x87c6], /* CJK Ideograph */
- [0x87c7, 0x87c7], /* CJK Ideograph */
- [0x87c8, 0x87c8], /* CJK Ideograph */
- [0x87c9, 0x87c9], /* CJK Ideograph */
- [0x87ca, 0x87ca], /* CJK Ideograph */
- [0x87cb, 0x87cb], /* CJK Ideograph */
- [0x87cc, 0x87cc], /* CJK Ideograph */
- [0x87cd, 0x87cd], /* CJK Ideograph */
- [0x87ce, 0x87ce], /* CJK Ideograph */
- [0x87cf, 0x87cf], /* CJK Ideograph */
- [0x87d0, 0x87d0], /* CJK Ideograph */
- [0x87d1, 0x87d1], /* CJK Ideograph */
- [0x87d2, 0x87d2], /* CJK Ideograph */
- [0x87d3, 0x87d3], /* CJK Ideograph */
- [0x87d4, 0x87d4], /* CJK Ideograph */
- [0x87d5, 0x87d5], /* CJK Ideograph */
- [0x87d6, 0x87d6], /* CJK Ideograph */
- [0x87d7, 0x87d7], /* CJK Ideograph */
- [0x87d8, 0x87d8], /* CJK Ideograph */
- [0x87d9, 0x87d9], /* CJK Ideograph */
- [0x87da, 0x87da], /* CJK Ideograph */
- [0x87db, 0x87db], /* CJK Ideograph */
- [0x87dc, 0x87dc], /* CJK Ideograph */
- [0x87dd, 0x87dd], /* CJK Ideograph */
- [0x87de, 0x87de], /* CJK Ideograph */
- [0x87df, 0x87df], /* CJK Ideograph */
- [0x87e0, 0x87e0], /* CJK Ideograph */
- [0x87e1, 0x87e1], /* CJK Ideograph */
- [0x87e2, 0x87e2], /* CJK Ideograph */
- [0x87e3, 0x87e3], /* CJK Ideograph */
- [0x87e4, 0x87e4], /* CJK Ideograph */
- [0x87e5, 0x87e5], /* CJK Ideograph */
- [0x87e6, 0x87e6], /* CJK Ideograph */
- [0x87e7, 0x87e7], /* CJK Ideograph */
- [0x87e8, 0x87e8], /* CJK Ideograph */
- [0x87e9, 0x87e9], /* CJK Ideograph */
- [0x87ea, 0x87ea], /* CJK Ideograph */
- [0x87eb, 0x87eb], /* CJK Ideograph */
- [0x87ec, 0x87ec], /* CJK Ideograph */
- [0x87ed, 0x87ed], /* CJK Ideograph */
- [0x87ee, 0x87ee], /* CJK Ideograph */
- [0x87ef, 0x87ef], /* CJK Ideograph */
- [0x87f0, 0x87f0], /* CJK Ideograph */
- [0x87f1, 0x87f1], /* CJK Ideograph */
- [0x87f2, 0x87f2], /* CJK Ideograph */
- [0x87f3, 0x87f3], /* CJK Ideograph */
- [0x87f4, 0x87f4], /* CJK Ideograph */
- [0x87f5, 0x87f5], /* CJK Ideograph */
- [0x87f6, 0x87f6], /* CJK Ideograph */
- [0x87f7, 0x87f7], /* CJK Ideograph */
- [0x87f8, 0x87f8], /* CJK Ideograph */
- [0x87f9, 0x87f9], /* CJK Ideograph */
- [0x87fa, 0x87fa], /* CJK Ideograph */
- [0x87fb, 0x87fb], /* CJK Ideograph */
- [0x87fc, 0x87fc], /* CJK Ideograph */
- [0x87fd, 0x87fd], /* CJK Ideograph */
- [0x87fe, 0x87fe], /* CJK Ideograph */
- [0x87ff, 0x87ff], /* CJK Ideograph */
- [0x8800, 0x8800], /* CJK Ideograph */
- [0x8801, 0x8801], /* CJK Ideograph */
- [0x8802, 0x8802], /* CJK Ideograph */
- [0x8803, 0x8803], /* CJK Ideograph */
- [0x8804, 0x8804], /* CJK Ideograph */
- [0x8805, 0x8805], /* CJK Ideograph */
- [0x8806, 0x8806], /* CJK Ideograph */
- [0x8807, 0x8807], /* CJK Ideograph */
- [0x8808, 0x8808], /* CJK Ideograph */
- [0x8809, 0x8809], /* CJK Ideograph */
- [0x880a, 0x880a], /* CJK Ideograph */
- [0x880b, 0x880b], /* CJK Ideograph */
- [0x880c, 0x880c], /* CJK Ideograph */
- [0x880d, 0x880d], /* CJK Ideograph */
- [0x880e, 0x880e], /* CJK Ideograph */
- [0x880f, 0x880f], /* CJK Ideograph */
- [0x8810, 0x8810], /* CJK Ideograph */
- [0x8811, 0x8811], /* CJK Ideograph */
- [0x8812, 0x8812], /* CJK Ideograph */
- [0x8813, 0x8813], /* CJK Ideograph */
- [0x8814, 0x8814], /* CJK Ideograph */
- [0x8815, 0x8815], /* CJK Ideograph */
- [0x8816, 0x8816], /* CJK Ideograph */
- [0x8817, 0x8817], /* CJK Ideograph */
- [0x8818, 0x8818], /* CJK Ideograph */
- [0x8819, 0x8819], /* CJK Ideograph */
- [0x881a, 0x881a], /* CJK Ideograph */
- [0x881b, 0x881b], /* CJK Ideograph */
- [0x881c, 0x881c], /* CJK Ideograph */
- [0x881d, 0x881d], /* CJK Ideograph */
- [0x881e, 0x881e], /* CJK Ideograph */
- [0x881f, 0x881f], /* CJK Ideograph */
- [0x8820, 0x8820], /* CJK Ideograph */
- [0x8821, 0x8821], /* CJK Ideograph */
- [0x8822, 0x8822], /* CJK Ideograph */
- [0x8823, 0x8823], /* CJK Ideograph */
- [0x8824, 0x8824], /* CJK Ideograph */
- [0x8825, 0x8825], /* CJK Ideograph */
- [0x8826, 0x8826], /* CJK Ideograph */
- [0x8827, 0x8827], /* CJK Ideograph */
- [0x8828, 0x8828], /* CJK Ideograph */
- [0x8829, 0x8829], /* CJK Ideograph */
- [0x882a, 0x882a], /* CJK Ideograph */
- [0x882b, 0x882b], /* CJK Ideograph */
- [0x882c, 0x882c], /* CJK Ideograph */
- [0x882d, 0x882d], /* CJK Ideograph */
- [0x882e, 0x882e], /* CJK Ideograph */
- [0x882f, 0x882f], /* CJK Ideograph */
- [0x8830, 0x8830], /* CJK Ideograph */
- [0x8831, 0x8831], /* CJK Ideograph */
- [0x8832, 0x8832], /* CJK Ideograph */
- [0x8833, 0x8833], /* CJK Ideograph */
- [0x8834, 0x8834], /* CJK Ideograph */
- [0x8835, 0x8835], /* CJK Ideograph */
- [0x8836, 0x8836], /* CJK Ideograph */
- [0x8837, 0x8837], /* CJK Ideograph */
- [0x8838, 0x8838], /* CJK Ideograph */
- [0x8839, 0x8839], /* CJK Ideograph */
- [0x883a, 0x883a], /* CJK Ideograph */
- [0x883b, 0x883b], /* CJK Ideograph */
- [0x883c, 0x883c], /* CJK Ideograph */
- [0x883d, 0x883d], /* CJK Ideograph */
- [0x883e, 0x883e], /* CJK Ideograph */
- [0x883f, 0x883f], /* CJK Ideograph */
- [0x8840, 0x8840], /* CJK Ideograph */
- [0x8841, 0x8841], /* CJK Ideograph */
- [0x8842, 0x8842], /* CJK Ideograph */
- [0x8843, 0x8843], /* CJK Ideograph */
- [0x8844, 0x8844], /* CJK Ideograph */
- [0x8845, 0x8845], /* CJK Ideograph */
- [0x8846, 0x8846], /* CJK Ideograph */
- [0x8847, 0x8847], /* CJK Ideograph */
- [0x8848, 0x8848], /* CJK Ideograph */
- [0x8849, 0x8849], /* CJK Ideograph */
- [0x884a, 0x884a], /* CJK Ideograph */
- [0x884b, 0x884b], /* CJK Ideograph */
- [0x884c, 0x884c], /* CJK Ideograph */
- [0x884d, 0x884d], /* CJK Ideograph */
- [0x884e, 0x884e], /* CJK Ideograph */
- [0x884f, 0x884f], /* CJK Ideograph */
- [0x8850, 0x8850], /* CJK Ideograph */
- [0x8851, 0x8851], /* CJK Ideograph */
- [0x8852, 0x8852], /* CJK Ideograph */
- [0x8853, 0x8853], /* CJK Ideograph */
- [0x8854, 0x8854], /* CJK Ideograph */
- [0x8855, 0x8855], /* CJK Ideograph */
- [0x8856, 0x8856], /* CJK Ideograph */
- [0x8857, 0x8857], /* CJK Ideograph */
- [0x8858, 0x8858], /* CJK Ideograph */
- [0x8859, 0x8859], /* CJK Ideograph */
- [0x885a, 0x885a], /* CJK Ideograph */
- [0x885b, 0x885b], /* CJK Ideograph */
- [0x885c, 0x885c], /* CJK Ideograph */
- [0x885d, 0x885d], /* CJK Ideograph */
- [0x885e, 0x885e], /* CJK Ideograph */
- [0x885f, 0x885f], /* CJK Ideograph */
- [0x8860, 0x8860], /* CJK Ideograph */
- [0x8861, 0x8861], /* CJK Ideograph */
- [0x8862, 0x8862], /* CJK Ideograph */
- [0x8863, 0x8863], /* CJK Ideograph */
- [0x8864, 0x8864], /* CJK Ideograph */
- [0x8865, 0x8865], /* CJK Ideograph */
- [0x8866, 0x8866], /* CJK Ideograph */
- [0x8867, 0x8867], /* CJK Ideograph */
- [0x8868, 0x8868], /* CJK Ideograph */
- [0x8869, 0x8869], /* CJK Ideograph */
- [0x886a, 0x886a], /* CJK Ideograph */
- [0x886b, 0x886b], /* CJK Ideograph */
- [0x886c, 0x886c], /* CJK Ideograph */
- [0x886d, 0x886d], /* CJK Ideograph */
- [0x886e, 0x886e], /* CJK Ideograph */
- [0x886f, 0x886f], /* CJK Ideograph */
- [0x8870, 0x8870], /* CJK Ideograph */
- [0x8871, 0x8871], /* CJK Ideograph */
- [0x8872, 0x8872], /* CJK Ideograph */
- [0x8873, 0x8873], /* CJK Ideograph */
- [0x8874, 0x8874], /* CJK Ideograph */
- [0x8875, 0x8875], /* CJK Ideograph */
- [0x8876, 0x8876], /* CJK Ideograph */
- [0x8877, 0x8877], /* CJK Ideograph */
- [0x8878, 0x8878], /* CJK Ideograph */
- [0x8879, 0x8879], /* CJK Ideograph */
- [0x887a, 0x887a], /* CJK Ideograph */
- [0x887b, 0x887b], /* CJK Ideograph */
- [0x887c, 0x887c], /* CJK Ideograph */
- [0x887d, 0x887d], /* CJK Ideograph */
- [0x887e, 0x887e], /* CJK Ideograph */
- [0x887f, 0x887f], /* CJK Ideograph */
- [0x8880, 0x8880], /* CJK Ideograph */
- [0x8881, 0x8881], /* CJK Ideograph */
- [0x8882, 0x8882], /* CJK Ideograph */
- [0x8883, 0x8883], /* CJK Ideograph */
- [0x8884, 0x8884], /* CJK Ideograph */
- [0x8885, 0x8885], /* CJK Ideograph */
- [0x8886, 0x8886], /* CJK Ideograph */
- [0x8887, 0x8887], /* CJK Ideograph */
- [0x8888, 0x8888], /* CJK Ideograph */
- [0x8889, 0x8889], /* CJK Ideograph */
- [0x888a, 0x888a], /* CJK Ideograph */
- [0x888b, 0x888b], /* CJK Ideograph */
- [0x888c, 0x888c], /* CJK Ideograph */
- [0x888d, 0x888d], /* CJK Ideograph */
- [0x888e, 0x888e], /* CJK Ideograph */
- [0x888f, 0x888f], /* CJK Ideograph */
- [0x8890, 0x8890], /* CJK Ideograph */
- [0x8891, 0x8891], /* CJK Ideograph */
- [0x8892, 0x8892], /* CJK Ideograph */
- [0x8893, 0x8893], /* CJK Ideograph */
- [0x8894, 0x8894], /* CJK Ideograph */
- [0x8895, 0x8895], /* CJK Ideograph */
- [0x8896, 0x8896], /* CJK Ideograph */
- [0x8897, 0x8897], /* CJK Ideograph */
- [0x8898, 0x8898], /* CJK Ideograph */
- [0x8899, 0x8899], /* CJK Ideograph */
- [0x889a, 0x889a], /* CJK Ideograph */
- [0x889b, 0x889b], /* CJK Ideograph */
- [0x889c, 0x889c], /* CJK Ideograph */
- [0x889d, 0x889d], /* CJK Ideograph */
- [0x889e, 0x889e], /* CJK Ideograph */
- [0x889f, 0x889f], /* CJK Ideograph */
- [0x88a0, 0x88a0], /* CJK Ideograph */
- [0x88a1, 0x88a1], /* CJK Ideograph */
- [0x88a2, 0x88a2], /* CJK Ideograph */
- [0x88a3, 0x88a3], /* CJK Ideograph */
- [0x88a4, 0x88a4], /* CJK Ideograph */
- [0x88a5, 0x88a5], /* CJK Ideograph */
- [0x88a6, 0x88a6], /* CJK Ideograph */
- [0x88a7, 0x88a7], /* CJK Ideograph */
- [0x88a8, 0x88a8], /* CJK Ideograph */
- [0x88a9, 0x88a9], /* CJK Ideograph */
- [0x88aa, 0x88aa], /* CJK Ideograph */
- [0x88ab, 0x88ab], /* CJK Ideograph */
- [0x88ac, 0x88ac], /* CJK Ideograph */
- [0x88ad, 0x88ad], /* CJK Ideograph */
- [0x88ae, 0x88ae], /* CJK Ideograph */
- [0x88af, 0x88af], /* CJK Ideograph */
- [0x88b0, 0x88b0], /* CJK Ideograph */
- [0x88b1, 0x88b1], /* CJK Ideograph */
- [0x88b2, 0x88b2], /* CJK Ideograph */
- [0x88b3, 0x88b3], /* CJK Ideograph */
- [0x88b4, 0x88b4], /* CJK Ideograph */
- [0x88b5, 0x88b5], /* CJK Ideograph */
- [0x88b6, 0x88b6], /* CJK Ideograph */
- [0x88b7, 0x88b7], /* CJK Ideograph */
- [0x88b8, 0x88b8], /* CJK Ideograph */
- [0x88b9, 0x88b9], /* CJK Ideograph */
- [0x88ba, 0x88ba], /* CJK Ideograph */
- [0x88bb, 0x88bb], /* CJK Ideograph */
- [0x88bc, 0x88bc], /* CJK Ideograph */
- [0x88bd, 0x88bd], /* CJK Ideograph */
- [0x88be, 0x88be], /* CJK Ideograph */
- [0x88bf, 0x88bf], /* CJK Ideograph */
- [0x88c0, 0x88c0], /* CJK Ideograph */
- [0x88c1, 0x88c1], /* CJK Ideograph */
- [0x88c2, 0x88c2], /* CJK Ideograph */
- [0x88c3, 0x88c3], /* CJK Ideograph */
- [0x88c4, 0x88c4], /* CJK Ideograph */
- [0x88c5, 0x88c5], /* CJK Ideograph */
- [0x88c6, 0x88c6], /* CJK Ideograph */
- [0x88c7, 0x88c7], /* CJK Ideograph */
- [0x88c8, 0x88c8], /* CJK Ideograph */
- [0x88c9, 0x88c9], /* CJK Ideograph */
- [0x88ca, 0x88ca], /* CJK Ideograph */
- [0x88cb, 0x88cb], /* CJK Ideograph */
- [0x88cc, 0x88cc], /* CJK Ideograph */
- [0x88cd, 0x88cd], /* CJK Ideograph */
- [0x88ce, 0x88ce], /* CJK Ideograph */
- [0x88cf, 0x88cf], /* CJK Ideograph */
- [0x88d0, 0x88d0], /* CJK Ideograph */
- [0x88d1, 0x88d1], /* CJK Ideograph */
- [0x88d2, 0x88d2], /* CJK Ideograph */
- [0x88d3, 0x88d3], /* CJK Ideograph */
- [0x88d4, 0x88d4], /* CJK Ideograph */
- [0x88d5, 0x88d5], /* CJK Ideograph */
- [0x88d6, 0x88d6], /* CJK Ideograph */
- [0x88d7, 0x88d7], /* CJK Ideograph */
- [0x88d8, 0x88d8], /* CJK Ideograph */
- [0x88d9, 0x88d9], /* CJK Ideograph */
- [0x88da, 0x88da], /* CJK Ideograph */
- [0x88db, 0x88db], /* CJK Ideograph */
- [0x88dc, 0x88dc], /* CJK Ideograph */
- [0x88dd, 0x88dd], /* CJK Ideograph */
- [0x88de, 0x88de], /* CJK Ideograph */
- [0x88df, 0x88df], /* CJK Ideograph */
- [0x88e0, 0x88e0], /* CJK Ideograph */
- [0x88e1, 0x88e1], /* CJK Ideograph */
- [0x88e2, 0x88e2], /* CJK Ideograph */
- [0x88e3, 0x88e3], /* CJK Ideograph */
- [0x88e4, 0x88e4], /* CJK Ideograph */
- [0x88e5, 0x88e5], /* CJK Ideograph */
- [0x88e6, 0x88e6], /* CJK Ideograph */
- [0x88e7, 0x88e7], /* CJK Ideograph */
- [0x88e8, 0x88e8], /* CJK Ideograph */
- [0x88e9, 0x88e9], /* CJK Ideograph */
- [0x88ea, 0x88ea], /* CJK Ideograph */
- [0x88eb, 0x88eb], /* CJK Ideograph */
- [0x88ec, 0x88ec], /* CJK Ideograph */
- [0x88ed, 0x88ed], /* CJK Ideograph */
- [0x88ee, 0x88ee], /* CJK Ideograph */
- [0x88ef, 0x88ef], /* CJK Ideograph */
- [0x88f0, 0x88f0], /* CJK Ideograph */
- [0x88f1, 0x88f1], /* CJK Ideograph */
- [0x88f2, 0x88f2], /* CJK Ideograph */
- [0x88f3, 0x88f3], /* CJK Ideograph */
- [0x88f4, 0x88f4], /* CJK Ideograph */
- [0x88f5, 0x88f5], /* CJK Ideograph */
- [0x88f6, 0x88f6], /* CJK Ideograph */
- [0x88f7, 0x88f7], /* CJK Ideograph */
- [0x88f8, 0x88f8], /* CJK Ideograph */
- [0x88f9, 0x88f9], /* CJK Ideograph */
- [0x88fa, 0x88fa], /* CJK Ideograph */
- [0x88fb, 0x88fb], /* CJK Ideograph */
- [0x88fc, 0x88fc], /* CJK Ideograph */
- [0x88fd, 0x88fd], /* CJK Ideograph */
- [0x88fe, 0x88fe], /* CJK Ideograph */
- [0x88ff, 0x88ff], /* CJK Ideograph */
- [0x8900, 0x8900], /* CJK Ideograph */
- [0x8901, 0x8901], /* CJK Ideograph */
- [0x8902, 0x8902], /* CJK Ideograph */
- [0x8903, 0x8903], /* CJK Ideograph */
- [0x8904, 0x8904], /* CJK Ideograph */
- [0x8905, 0x8905], /* CJK Ideograph */
- [0x8906, 0x8906], /* CJK Ideograph */
- [0x8907, 0x8907], /* CJK Ideograph */
- [0x8908, 0x8908], /* CJK Ideograph */
- [0x8909, 0x8909], /* CJK Ideograph */
- [0x890a, 0x890a], /* CJK Ideograph */
- [0x890b, 0x890b], /* CJK Ideograph */
- [0x890c, 0x890c], /* CJK Ideograph */
- [0x890d, 0x890d], /* CJK Ideograph */
- [0x890e, 0x890e], /* CJK Ideograph */
- [0x890f, 0x890f], /* CJK Ideograph */
- [0x8910, 0x8910], /* CJK Ideograph */
- [0x8911, 0x8911], /* CJK Ideograph */
- [0x8912, 0x8912], /* CJK Ideograph */
- [0x8913, 0x8913], /* CJK Ideograph */
- [0x8914, 0x8914], /* CJK Ideograph */
- [0x8915, 0x8915], /* CJK Ideograph */
- [0x8916, 0x8916], /* CJK Ideograph */
- [0x8917, 0x8917], /* CJK Ideograph */
- [0x8918, 0x8918], /* CJK Ideograph */
- [0x8919, 0x8919], /* CJK Ideograph */
- [0x891a, 0x891a], /* CJK Ideograph */
- [0x891b, 0x891b], /* CJK Ideograph */
- [0x891c, 0x891c], /* CJK Ideograph */
- [0x891d, 0x891d], /* CJK Ideograph */
- [0x891e, 0x891e], /* CJK Ideograph */
- [0x891f, 0x891f], /* CJK Ideograph */
- [0x8920, 0x8920], /* CJK Ideograph */
- [0x8921, 0x8921], /* CJK Ideograph */
- [0x8922, 0x8922], /* CJK Ideograph */
- [0x8923, 0x8923], /* CJK Ideograph */
- [0x8924, 0x8924], /* CJK Ideograph */
- [0x8925, 0x8925], /* CJK Ideograph */
- [0x8926, 0x8926], /* CJK Ideograph */
- [0x8927, 0x8927], /* CJK Ideograph */
- [0x8928, 0x8928], /* CJK Ideograph */
- [0x8929, 0x8929], /* CJK Ideograph */
- [0x892a, 0x892a], /* CJK Ideograph */
- [0x892b, 0x892b], /* CJK Ideograph */
- [0x892c, 0x892c], /* CJK Ideograph */
- [0x892d, 0x892d], /* CJK Ideograph */
- [0x892e, 0x892e], /* CJK Ideograph */
- [0x892f, 0x892f], /* CJK Ideograph */
- [0x8930, 0x8930], /* CJK Ideograph */
- [0x8931, 0x8931], /* CJK Ideograph */
- [0x8932, 0x8932], /* CJK Ideograph */
- [0x8933, 0x8933], /* CJK Ideograph */
- [0x8934, 0x8934], /* CJK Ideograph */
- [0x8935, 0x8935], /* CJK Ideograph */
- [0x8936, 0x8936], /* CJK Ideograph */
- [0x8937, 0x8937], /* CJK Ideograph */
- [0x8938, 0x8938], /* CJK Ideograph */
- [0x8939, 0x8939], /* CJK Ideograph */
- [0x893a, 0x893a], /* CJK Ideograph */
- [0x893b, 0x893b], /* CJK Ideograph */
- [0x893c, 0x893c], /* CJK Ideograph */
- [0x893d, 0x893d], /* CJK Ideograph */
- [0x893e, 0x893e], /* CJK Ideograph */
- [0x893f, 0x893f], /* CJK Ideograph */
- [0x8940, 0x8940], /* CJK Ideograph */
- [0x8941, 0x8941], /* CJK Ideograph */
- [0x8942, 0x8942], /* CJK Ideograph */
- [0x8943, 0x8943], /* CJK Ideograph */
- [0x8944, 0x8944], /* CJK Ideograph */
- [0x8945, 0x8945], /* CJK Ideograph */
- [0x8946, 0x8946], /* CJK Ideograph */
- [0x8947, 0x8947], /* CJK Ideograph */
- [0x8948, 0x8948], /* CJK Ideograph */
- [0x8949, 0x8949], /* CJK Ideograph */
- [0x894a, 0x894a], /* CJK Ideograph */
- [0x894b, 0x894b], /* CJK Ideograph */
- [0x894c, 0x894c], /* CJK Ideograph */
- [0x894d, 0x894d], /* CJK Ideograph */
- [0x894e, 0x894e], /* CJK Ideograph */
- [0x894f, 0x894f], /* CJK Ideograph */
- [0x8950, 0x8950], /* CJK Ideograph */
- [0x8951, 0x8951], /* CJK Ideograph */
- [0x8952, 0x8952], /* CJK Ideograph */
- [0x8953, 0x8953], /* CJK Ideograph */
- [0x8954, 0x8954], /* CJK Ideograph */
- [0x8955, 0x8955], /* CJK Ideograph */
- [0x8956, 0x8956], /* CJK Ideograph */
- [0x8957, 0x8957], /* CJK Ideograph */
- [0x8958, 0x8958], /* CJK Ideograph */
- [0x8959, 0x8959], /* CJK Ideograph */
- [0x895a, 0x895a], /* CJK Ideograph */
- [0x895b, 0x895b], /* CJK Ideograph */
- [0x895c, 0x895c], /* CJK Ideograph */
- [0x895d, 0x895d], /* CJK Ideograph */
- [0x895e, 0x895e], /* CJK Ideograph */
- [0x895f, 0x895f], /* CJK Ideograph */
- [0x8960, 0x8960], /* CJK Ideograph */
- [0x8961, 0x8961], /* CJK Ideograph */
- [0x8962, 0x8962], /* CJK Ideograph */
- [0x8963, 0x8963], /* CJK Ideograph */
- [0x8964, 0x8964], /* CJK Ideograph */
- [0x8965, 0x8965], /* CJK Ideograph */
- [0x8966, 0x8966], /* CJK Ideograph */
- [0x8967, 0x8967], /* CJK Ideograph */
- [0x8968, 0x8968], /* CJK Ideograph */
- [0x8969, 0x8969], /* CJK Ideograph */
- [0x896a, 0x896a], /* CJK Ideograph */
- [0x896b, 0x896b], /* CJK Ideograph */
- [0x896c, 0x896c], /* CJK Ideograph */
- [0x896d, 0x896d], /* CJK Ideograph */
- [0x896e, 0x896e], /* CJK Ideograph */
- [0x896f, 0x896f], /* CJK Ideograph */
- [0x8970, 0x8970], /* CJK Ideograph */
- [0x8971, 0x8971], /* CJK Ideograph */
- [0x8972, 0x8972], /* CJK Ideograph */
- [0x8973, 0x8973], /* CJK Ideograph */
- [0x8974, 0x8974], /* CJK Ideograph */
- [0x8975, 0x8975], /* CJK Ideograph */
- [0x8976, 0x8976], /* CJK Ideograph */
- [0x8977, 0x8977], /* CJK Ideograph */
- [0x8978, 0x8978], /* CJK Ideograph */
- [0x8979, 0x8979], /* CJK Ideograph */
- [0x897a, 0x897a], /* CJK Ideograph */
- [0x897b, 0x897b], /* CJK Ideograph */
- [0x897c, 0x897c], /* CJK Ideograph */
- [0x897d, 0x897d], /* CJK Ideograph */
- [0x897e, 0x897e], /* CJK Ideograph */
- [0x897f, 0x897f], /* CJK Ideograph */
- [0x8980, 0x8980], /* CJK Ideograph */
- [0x8981, 0x8981], /* CJK Ideograph */
- [0x8982, 0x8982], /* CJK Ideograph */
- [0x8983, 0x8983], /* CJK Ideograph */
- [0x8984, 0x8984], /* CJK Ideograph */
- [0x8985, 0x8985], /* CJK Ideograph */
- [0x8986, 0x8986], /* CJK Ideograph */
- [0x8987, 0x8987], /* CJK Ideograph */
- [0x8988, 0x8988], /* CJK Ideograph */
- [0x8989, 0x8989], /* CJK Ideograph */
- [0x898a, 0x898a], /* CJK Ideograph */
- [0x898b, 0x898b], /* CJK Ideograph */
- [0x898c, 0x898c], /* CJK Ideograph */
- [0x898d, 0x898d], /* CJK Ideograph */
- [0x898e, 0x898e], /* CJK Ideograph */
- [0x898f, 0x898f], /* CJK Ideograph */
- [0x8990, 0x8990], /* CJK Ideograph */
- [0x8991, 0x8991], /* CJK Ideograph */
- [0x8992, 0x8992], /* CJK Ideograph */
- [0x8993, 0x8993], /* CJK Ideograph */
- [0x8994, 0x8994], /* CJK Ideograph */
- [0x8995, 0x8995], /* CJK Ideograph */
- [0x8996, 0x8996], /* CJK Ideograph */
- [0x8997, 0x8997], /* CJK Ideograph */
- [0x8998, 0x8998], /* CJK Ideograph */
- [0x8999, 0x8999], /* CJK Ideograph */
- [0x899a, 0x899a], /* CJK Ideograph */
- [0x899b, 0x899b], /* CJK Ideograph */
- [0x899c, 0x899c], /* CJK Ideograph */
- [0x899d, 0x899d], /* CJK Ideograph */
- [0x899e, 0x899e], /* CJK Ideograph */
- [0x899f, 0x899f], /* CJK Ideograph */
- [0x89a0, 0x89a0], /* CJK Ideograph */
- [0x89a1, 0x89a1], /* CJK Ideograph */
- [0x89a2, 0x89a2], /* CJK Ideograph */
- [0x89a3, 0x89a3], /* CJK Ideograph */
- [0x89a4, 0x89a4], /* CJK Ideograph */
- [0x89a5, 0x89a5], /* CJK Ideograph */
- [0x89a6, 0x89a6], /* CJK Ideograph */
- [0x89a7, 0x89a7], /* CJK Ideograph */
- [0x89a8, 0x89a8], /* CJK Ideograph */
- [0x89a9, 0x89a9], /* CJK Ideograph */
- [0x89aa, 0x89aa], /* CJK Ideograph */
- [0x89ab, 0x89ab], /* CJK Ideograph */
- [0x89ac, 0x89ac], /* CJK Ideograph */
- [0x89ad, 0x89ad], /* CJK Ideograph */
- [0x89ae, 0x89ae], /* CJK Ideograph */
- [0x89af, 0x89af], /* CJK Ideograph */
- [0x89b0, 0x89b0], /* CJK Ideograph */
- [0x89b1, 0x89b1], /* CJK Ideograph */
- [0x89b2, 0x89b2], /* CJK Ideograph */
- [0x89b3, 0x89b3], /* CJK Ideograph */
- [0x89b4, 0x89b4], /* CJK Ideograph */
- [0x89b5, 0x89b5], /* CJK Ideograph */
- [0x89b6, 0x89b6], /* CJK Ideograph */
- [0x89b7, 0x89b7], /* CJK Ideograph */
- [0x89b8, 0x89b8], /* CJK Ideograph */
- [0x89b9, 0x89b9], /* CJK Ideograph */
- [0x89ba, 0x89ba], /* CJK Ideograph */
- [0x89bb, 0x89bb], /* CJK Ideograph */
- [0x89bc, 0x89bc], /* CJK Ideograph */
- [0x89bd, 0x89bd], /* CJK Ideograph */
- [0x89be, 0x89be], /* CJK Ideograph */
- [0x89bf, 0x89bf], /* CJK Ideograph */
- [0x89c0, 0x89c0], /* CJK Ideograph */
- [0x89c1, 0x89c1], /* CJK Ideograph */
- [0x89c2, 0x89c2], /* CJK Ideograph */
- [0x89c3, 0x89c3], /* CJK Ideograph */
- [0x89c4, 0x89c4], /* CJK Ideograph */
- [0x89c5, 0x89c5], /* CJK Ideograph */
- [0x89c6, 0x89c6], /* CJK Ideograph */
- [0x89c7, 0x89c7], /* CJK Ideograph */
- [0x89c8, 0x89c8], /* CJK Ideograph */
- [0x89c9, 0x89c9], /* CJK Ideograph */
- [0x89ca, 0x89ca], /* CJK Ideograph */
- [0x89cb, 0x89cb], /* CJK Ideograph */
- [0x89cc, 0x89cc], /* CJK Ideograph */
- [0x89cd, 0x89cd], /* CJK Ideograph */
- [0x89ce, 0x89ce], /* CJK Ideograph */
- [0x89cf, 0x89cf], /* CJK Ideograph */
- [0x89d0, 0x89d0], /* CJK Ideograph */
- [0x89d1, 0x89d1], /* CJK Ideograph */
- [0x89d2, 0x89d2], /* CJK Ideograph */
- [0x89d3, 0x89d3], /* CJK Ideograph */
- [0x89d4, 0x89d4], /* CJK Ideograph */
- [0x89d5, 0x89d5], /* CJK Ideograph */
- [0x89d6, 0x89d6], /* CJK Ideograph */
- [0x89d7, 0x89d7], /* CJK Ideograph */
- [0x89d8, 0x89d8], /* CJK Ideograph */
- [0x89d9, 0x89d9], /* CJK Ideograph */
- [0x89da, 0x89da], /* CJK Ideograph */
- [0x89db, 0x89db], /* CJK Ideograph */
- [0x89dc, 0x89dc], /* CJK Ideograph */
- [0x89dd, 0x89dd], /* CJK Ideograph */
- [0x89de, 0x89de], /* CJK Ideograph */
- [0x89df, 0x89df], /* CJK Ideograph */
- [0x89e0, 0x89e0], /* CJK Ideograph */
- [0x89e1, 0x89e1], /* CJK Ideograph */
- [0x89e2, 0x89e2], /* CJK Ideograph */
- [0x89e3, 0x89e3], /* CJK Ideograph */
- [0x89e4, 0x89e4], /* CJK Ideograph */
- [0x89e5, 0x89e5], /* CJK Ideograph */
- [0x89e6, 0x89e6], /* CJK Ideograph */
- [0x89e7, 0x89e7], /* CJK Ideograph */
- [0x89e8, 0x89e8], /* CJK Ideograph */
- [0x89e9, 0x89e9], /* CJK Ideograph */
- [0x89ea, 0x89ea], /* CJK Ideograph */
- [0x89eb, 0x89eb], /* CJK Ideograph */
- [0x89ec, 0x89ec], /* CJK Ideograph */
- [0x89ed, 0x89ed], /* CJK Ideograph */
- [0x89ee, 0x89ee], /* CJK Ideograph */
- [0x89ef, 0x89ef], /* CJK Ideograph */
- [0x89f0, 0x89f0], /* CJK Ideograph */
- [0x89f1, 0x89f1], /* CJK Ideograph */
- [0x89f2, 0x89f2], /* CJK Ideograph */
- [0x89f3, 0x89f3], /* CJK Ideograph */
- [0x89f4, 0x89f4], /* CJK Ideograph */
- [0x89f5, 0x89f5], /* CJK Ideograph */
- [0x89f6, 0x89f6], /* CJK Ideograph */
- [0x89f7, 0x89f7], /* CJK Ideograph */
- [0x89f8, 0x89f8], /* CJK Ideograph */
- [0x89f9, 0x89f9], /* CJK Ideograph */
- [0x89fa, 0x89fa], /* CJK Ideograph */
- [0x89fb, 0x89fb], /* CJK Ideograph */
- [0x89fc, 0x89fc], /* CJK Ideograph */
- [0x89fd, 0x89fd], /* CJK Ideograph */
- [0x89fe, 0x89fe], /* CJK Ideograph */
- [0x89ff, 0x89ff], /* CJK Ideograph */
- [0x8a00, 0x8a00], /* CJK Ideograph */
- [0x8a01, 0x8a01], /* CJK Ideograph */
- [0x8a02, 0x8a02], /* CJK Ideograph */
- [0x8a03, 0x8a03], /* CJK Ideograph */
- [0x8a04, 0x8a04], /* CJK Ideograph */
- [0x8a05, 0x8a05], /* CJK Ideograph */
- [0x8a06, 0x8a06], /* CJK Ideograph */
- [0x8a07, 0x8a07], /* CJK Ideograph */
- [0x8a08, 0x8a08], /* CJK Ideograph */
- [0x8a09, 0x8a09], /* CJK Ideograph */
- [0x8a0a, 0x8a0a], /* CJK Ideograph */
- [0x8a0b, 0x8a0b], /* CJK Ideograph */
- [0x8a0c, 0x8a0c], /* CJK Ideograph */
- [0x8a0d, 0x8a0d], /* CJK Ideograph */
- [0x8a0e, 0x8a0e], /* CJK Ideograph */
- [0x8a0f, 0x8a0f], /* CJK Ideograph */
- [0x8a10, 0x8a10], /* CJK Ideograph */
- [0x8a11, 0x8a11], /* CJK Ideograph */
- [0x8a12, 0x8a12], /* CJK Ideograph */
- [0x8a13, 0x8a13], /* CJK Ideograph */
- [0x8a14, 0x8a14], /* CJK Ideograph */
- [0x8a15, 0x8a15], /* CJK Ideograph */
- [0x8a16, 0x8a16], /* CJK Ideograph */
- [0x8a17, 0x8a17], /* CJK Ideograph */
- [0x8a18, 0x8a18], /* CJK Ideograph */
- [0x8a19, 0x8a19], /* CJK Ideograph */
- [0x8a1a, 0x8a1a], /* CJK Ideograph */
- [0x8a1b, 0x8a1b], /* CJK Ideograph */
- [0x8a1c, 0x8a1c], /* CJK Ideograph */
- [0x8a1d, 0x8a1d], /* CJK Ideograph */
- [0x8a1e, 0x8a1e], /* CJK Ideograph */
- [0x8a1f, 0x8a1f], /* CJK Ideograph */
- [0x8a20, 0x8a20], /* CJK Ideograph */
- [0x8a21, 0x8a21], /* CJK Ideograph */
- [0x8a22, 0x8a22], /* CJK Ideograph */
- [0x8a23, 0x8a23], /* CJK Ideograph */
- [0x8a24, 0x8a24], /* CJK Ideograph */
- [0x8a25, 0x8a25], /* CJK Ideograph */
- [0x8a26, 0x8a26], /* CJK Ideograph */
- [0x8a27, 0x8a27], /* CJK Ideograph */
- [0x8a28, 0x8a28], /* CJK Ideograph */
- [0x8a29, 0x8a29], /* CJK Ideograph */
- [0x8a2a, 0x8a2a], /* CJK Ideograph */
- [0x8a2b, 0x8a2b], /* CJK Ideograph */
- [0x8a2c, 0x8a2c], /* CJK Ideograph */
- [0x8a2d, 0x8a2d], /* CJK Ideograph */
- [0x8a2e, 0x8a2e], /* CJK Ideograph */
- [0x8a2f, 0x8a2f], /* CJK Ideograph */
- [0x8a30, 0x8a30], /* CJK Ideograph */
- [0x8a31, 0x8a31], /* CJK Ideograph */
- [0x8a32, 0x8a32], /* CJK Ideograph */
- [0x8a33, 0x8a33], /* CJK Ideograph */
- [0x8a34, 0x8a34], /* CJK Ideograph */
- [0x8a35, 0x8a35], /* CJK Ideograph */
- [0x8a36, 0x8a36], /* CJK Ideograph */
- [0x8a37, 0x8a37], /* CJK Ideograph */
- [0x8a38, 0x8a38], /* CJK Ideograph */
- [0x8a39, 0x8a39], /* CJK Ideograph */
- [0x8a3a, 0x8a3a], /* CJK Ideograph */
- [0x8a3b, 0x8a3b], /* CJK Ideograph */
- [0x8a3c, 0x8a3c], /* CJK Ideograph */
- [0x8a3d, 0x8a3d], /* CJK Ideograph */
- [0x8a3e, 0x8a3e], /* CJK Ideograph */
- [0x8a3f, 0x8a3f], /* CJK Ideograph */
- [0x8a40, 0x8a40], /* CJK Ideograph */
- [0x8a41, 0x8a41], /* CJK Ideograph */
- [0x8a42, 0x8a42], /* CJK Ideograph */
- [0x8a43, 0x8a43], /* CJK Ideograph */
- [0x8a44, 0x8a44], /* CJK Ideograph */
- [0x8a45, 0x8a45], /* CJK Ideograph */
- [0x8a46, 0x8a46], /* CJK Ideograph */
- [0x8a47, 0x8a47], /* CJK Ideograph */
- [0x8a48, 0x8a48], /* CJK Ideograph */
- [0x8a49, 0x8a49], /* CJK Ideograph */
- [0x8a4a, 0x8a4a], /* CJK Ideograph */
- [0x8a4b, 0x8a4b], /* CJK Ideograph */
- [0x8a4c, 0x8a4c], /* CJK Ideograph */
- [0x8a4d, 0x8a4d], /* CJK Ideograph */
- [0x8a4e, 0x8a4e], /* CJK Ideograph */
- [0x8a4f, 0x8a4f], /* CJK Ideograph */
- [0x8a50, 0x8a50], /* CJK Ideograph */
- [0x8a51, 0x8a51], /* CJK Ideograph */
- [0x8a52, 0x8a52], /* CJK Ideograph */
- [0x8a53, 0x8a53], /* CJK Ideograph */
- [0x8a54, 0x8a54], /* CJK Ideograph */
- [0x8a55, 0x8a55], /* CJK Ideograph */
- [0x8a56, 0x8a56], /* CJK Ideograph */
- [0x8a57, 0x8a57], /* CJK Ideograph */
- [0x8a58, 0x8a58], /* CJK Ideograph */
- [0x8a59, 0x8a59], /* CJK Ideograph */
- [0x8a5a, 0x8a5a], /* CJK Ideograph */
- [0x8a5b, 0x8a5b], /* CJK Ideograph */
- [0x8a5c, 0x8a5c], /* CJK Ideograph */
- [0x8a5d, 0x8a5d], /* CJK Ideograph */
- [0x8a5e, 0x8a5e], /* CJK Ideograph */
- [0x8a5f, 0x8a5f], /* CJK Ideograph */
- [0x8a60, 0x8a60], /* CJK Ideograph */
- [0x8a61, 0x8a61], /* CJK Ideograph */
- [0x8a62, 0x8a62], /* CJK Ideograph */
- [0x8a63, 0x8a63], /* CJK Ideograph */
- [0x8a64, 0x8a64], /* CJK Ideograph */
- [0x8a65, 0x8a65], /* CJK Ideograph */
- [0x8a66, 0x8a66], /* CJK Ideograph */
- [0x8a67, 0x8a67], /* CJK Ideograph */
- [0x8a68, 0x8a68], /* CJK Ideograph */
- [0x8a69, 0x8a69], /* CJK Ideograph */
- [0x8a6a, 0x8a6a], /* CJK Ideograph */
- [0x8a6b, 0x8a6b], /* CJK Ideograph */
- [0x8a6c, 0x8a6c], /* CJK Ideograph */
- [0x8a6d, 0x8a6d], /* CJK Ideograph */
- [0x8a6e, 0x8a6e], /* CJK Ideograph */
- [0x8a6f, 0x8a6f], /* CJK Ideograph */
- [0x8a70, 0x8a70], /* CJK Ideograph */
- [0x8a71, 0x8a71], /* CJK Ideograph */
- [0x8a72, 0x8a72], /* CJK Ideograph */
- [0x8a73, 0x8a73], /* CJK Ideograph */
- [0x8a74, 0x8a74], /* CJK Ideograph */
- [0x8a75, 0x8a75], /* CJK Ideograph */
- [0x8a76, 0x8a76], /* CJK Ideograph */
- [0x8a77, 0x8a77], /* CJK Ideograph */
- [0x8a78, 0x8a78], /* CJK Ideograph */
- [0x8a79, 0x8a79], /* CJK Ideograph */
- [0x8a7a, 0x8a7a], /* CJK Ideograph */
- [0x8a7b, 0x8a7b], /* CJK Ideograph */
- [0x8a7c, 0x8a7c], /* CJK Ideograph */
- [0x8a7d, 0x8a7d], /* CJK Ideograph */
- [0x8a7e, 0x8a7e], /* CJK Ideograph */
- [0x8a7f, 0x8a7f], /* CJK Ideograph */
- [0x8a80, 0x8a80], /* CJK Ideograph */
- [0x8a81, 0x8a81], /* CJK Ideograph */
- [0x8a82, 0x8a82], /* CJK Ideograph */
- [0x8a83, 0x8a83], /* CJK Ideograph */
- [0x8a84, 0x8a84], /* CJK Ideograph */
- [0x8a85, 0x8a85], /* CJK Ideograph */
- [0x8a86, 0x8a86], /* CJK Ideograph */
- [0x8a87, 0x8a87], /* CJK Ideograph */
- [0x8a88, 0x8a88], /* CJK Ideograph */
- [0x8a89, 0x8a89], /* CJK Ideograph */
- [0x8a8a, 0x8a8a], /* CJK Ideograph */
- [0x8a8b, 0x8a8b], /* CJK Ideograph */
- [0x8a8c, 0x8a8c], /* CJK Ideograph */
- [0x8a8d, 0x8a8d], /* CJK Ideograph */
- [0x8a8e, 0x8a8e], /* CJK Ideograph */
- [0x8a8f, 0x8a8f], /* CJK Ideograph */
- [0x8a90, 0x8a90], /* CJK Ideograph */
- [0x8a91, 0x8a91], /* CJK Ideograph */
- [0x8a92, 0x8a92], /* CJK Ideograph */
- [0x8a93, 0x8a93], /* CJK Ideograph */
- [0x8a94, 0x8a94], /* CJK Ideograph */
- [0x8a95, 0x8a95], /* CJK Ideograph */
- [0x8a96, 0x8a96], /* CJK Ideograph */
- [0x8a97, 0x8a97], /* CJK Ideograph */
- [0x8a98, 0x8a98], /* CJK Ideograph */
- [0x8a99, 0x8a99], /* CJK Ideograph */
- [0x8a9a, 0x8a9a], /* CJK Ideograph */
- [0x8a9b, 0x8a9b], /* CJK Ideograph */
- [0x8a9c, 0x8a9c], /* CJK Ideograph */
- [0x8a9d, 0x8a9d], /* CJK Ideograph */
- [0x8a9e, 0x8a9e], /* CJK Ideograph */
- [0x8a9f, 0x8a9f], /* CJK Ideograph */
- [0x8aa0, 0x8aa0], /* CJK Ideograph */
- [0x8aa1, 0x8aa1], /* CJK Ideograph */
- [0x8aa2, 0x8aa2], /* CJK Ideograph */
- [0x8aa3, 0x8aa3], /* CJK Ideograph */
- [0x8aa4, 0x8aa4], /* CJK Ideograph */
- [0x8aa5, 0x8aa5], /* CJK Ideograph */
- [0x8aa6, 0x8aa6], /* CJK Ideograph */
- [0x8aa7, 0x8aa7], /* CJK Ideograph */
- [0x8aa8, 0x8aa8], /* CJK Ideograph */
- [0x8aa9, 0x8aa9], /* CJK Ideograph */
- [0x8aaa, 0x8aaa], /* CJK Ideograph */
- [0x8aab, 0x8aab], /* CJK Ideograph */
- [0x8aac, 0x8aac], /* CJK Ideograph */
- [0x8aad, 0x8aad], /* CJK Ideograph */
- [0x8aae, 0x8aae], /* CJK Ideograph */
- [0x8aaf, 0x8aaf], /* CJK Ideograph */
- [0x8ab0, 0x8ab0], /* CJK Ideograph */
- [0x8ab1, 0x8ab1], /* CJK Ideograph */
- [0x8ab2, 0x8ab2], /* CJK Ideograph */
- [0x8ab3, 0x8ab3], /* CJK Ideograph */
- [0x8ab4, 0x8ab4], /* CJK Ideograph */
- [0x8ab5, 0x8ab5], /* CJK Ideograph */
- [0x8ab6, 0x8ab6], /* CJK Ideograph */
- [0x8ab7, 0x8ab7], /* CJK Ideograph */
- [0x8ab8, 0x8ab8], /* CJK Ideograph */
- [0x8ab9, 0x8ab9], /* CJK Ideograph */
- [0x8aba, 0x8aba], /* CJK Ideograph */
- [0x8abb, 0x8abb], /* CJK Ideograph */
- [0x8abc, 0x8abc], /* CJK Ideograph */
- [0x8abd, 0x8abd], /* CJK Ideograph */
- [0x8abe, 0x8abe], /* CJK Ideograph */
- [0x8abf, 0x8abf], /* CJK Ideograph */
- [0x8ac0, 0x8ac0], /* CJK Ideograph */
- [0x8ac1, 0x8ac1], /* CJK Ideograph */
- [0x8ac2, 0x8ac2], /* CJK Ideograph */
- [0x8ac3, 0x8ac3], /* CJK Ideograph */
- [0x8ac4, 0x8ac4], /* CJK Ideograph */
- [0x8ac5, 0x8ac5], /* CJK Ideograph */
- [0x8ac6, 0x8ac6], /* CJK Ideograph */
- [0x8ac7, 0x8ac7], /* CJK Ideograph */
- [0x8ac8, 0x8ac8], /* CJK Ideograph */
- [0x8ac9, 0x8ac9], /* CJK Ideograph */
- [0x8aca, 0x8aca], /* CJK Ideograph */
- [0x8acb, 0x8acb], /* CJK Ideograph */
- [0x8acc, 0x8acc], /* CJK Ideograph */
- [0x8acd, 0x8acd], /* CJK Ideograph */
- [0x8ace, 0x8ace], /* CJK Ideograph */
- [0x8acf, 0x8acf], /* CJK Ideograph */
- [0x8ad0, 0x8ad0], /* CJK Ideograph */
- [0x8ad1, 0x8ad1], /* CJK Ideograph */
- [0x8ad2, 0x8ad2], /* CJK Ideograph */
- [0x8ad3, 0x8ad3], /* CJK Ideograph */
- [0x8ad4, 0x8ad4], /* CJK Ideograph */
- [0x8ad5, 0x8ad5], /* CJK Ideograph */
- [0x8ad6, 0x8ad6], /* CJK Ideograph */
- [0x8ad7, 0x8ad7], /* CJK Ideograph */
- [0x8ad8, 0x8ad8], /* CJK Ideograph */
- [0x8ad9, 0x8ad9], /* CJK Ideograph */
- [0x8ada, 0x8ada], /* CJK Ideograph */
- [0x8adb, 0x8adb], /* CJK Ideograph */
- [0x8adc, 0x8adc], /* CJK Ideograph */
- [0x8add, 0x8add], /* CJK Ideograph */
- [0x8ade, 0x8ade], /* CJK Ideograph */
- [0x8adf, 0x8adf], /* CJK Ideograph */
- [0x8ae0, 0x8ae0], /* CJK Ideograph */
- [0x8ae1, 0x8ae1], /* CJK Ideograph */
- [0x8ae2, 0x8ae2], /* CJK Ideograph */
- [0x8ae3, 0x8ae3], /* CJK Ideograph */
- [0x8ae4, 0x8ae4], /* CJK Ideograph */
- [0x8ae5, 0x8ae5], /* CJK Ideograph */
- [0x8ae6, 0x8ae6], /* CJK Ideograph */
- [0x8ae7, 0x8ae7], /* CJK Ideograph */
- [0x8ae8, 0x8ae8], /* CJK Ideograph */
- [0x8ae9, 0x8ae9], /* CJK Ideograph */
- [0x8aea, 0x8aea], /* CJK Ideograph */
- [0x8aeb, 0x8aeb], /* CJK Ideograph */
- [0x8aec, 0x8aec], /* CJK Ideograph */
- [0x8aed, 0x8aed], /* CJK Ideograph */
- [0x8aee, 0x8aee], /* CJK Ideograph */
- [0x8aef, 0x8aef], /* CJK Ideograph */
- [0x8af0, 0x8af0], /* CJK Ideograph */
- [0x8af1, 0x8af1], /* CJK Ideograph */
- [0x8af2, 0x8af2], /* CJK Ideograph */
- [0x8af3, 0x8af3], /* CJK Ideograph */
- [0x8af4, 0x8af4], /* CJK Ideograph */
- [0x8af5, 0x8af5], /* CJK Ideograph */
- [0x8af6, 0x8af6], /* CJK Ideograph */
- [0x8af7, 0x8af7], /* CJK Ideograph */
- [0x8af8, 0x8af8], /* CJK Ideograph */
- [0x8af9, 0x8af9], /* CJK Ideograph */
- [0x8afa, 0x8afa], /* CJK Ideograph */
- [0x8afb, 0x8afb], /* CJK Ideograph */
- [0x8afc, 0x8afc], /* CJK Ideograph */
- [0x8afd, 0x8afd], /* CJK Ideograph */
- [0x8afe, 0x8afe], /* CJK Ideograph */
- [0x8aff, 0x8aff], /* CJK Ideograph */
- [0x8b00, 0x8b00], /* CJK Ideograph */
- [0x8b01, 0x8b01], /* CJK Ideograph */
- [0x8b02, 0x8b02], /* CJK Ideograph */
- [0x8b03, 0x8b03], /* CJK Ideograph */
- [0x8b04, 0x8b04], /* CJK Ideograph */
- [0x8b05, 0x8b05], /* CJK Ideograph */
- [0x8b06, 0x8b06], /* CJK Ideograph */
- [0x8b07, 0x8b07], /* CJK Ideograph */
- [0x8b08, 0x8b08], /* CJK Ideograph */
- [0x8b09, 0x8b09], /* CJK Ideograph */
- [0x8b0a, 0x8b0a], /* CJK Ideograph */
- [0x8b0b, 0x8b0b], /* CJK Ideograph */
- [0x8b0c, 0x8b0c], /* CJK Ideograph */
- [0x8b0d, 0x8b0d], /* CJK Ideograph */
- [0x8b0e, 0x8b0e], /* CJK Ideograph */
- [0x8b0f, 0x8b0f], /* CJK Ideograph */
- [0x8b10, 0x8b10], /* CJK Ideograph */
- [0x8b11, 0x8b11], /* CJK Ideograph */
- [0x8b12, 0x8b12], /* CJK Ideograph */
- [0x8b13, 0x8b13], /* CJK Ideograph */
- [0x8b14, 0x8b14], /* CJK Ideograph */
- [0x8b15, 0x8b15], /* CJK Ideograph */
- [0x8b16, 0x8b16], /* CJK Ideograph */
- [0x8b17, 0x8b17], /* CJK Ideograph */
- [0x8b18, 0x8b18], /* CJK Ideograph */
- [0x8b19, 0x8b19], /* CJK Ideograph */
- [0x8b1a, 0x8b1a], /* CJK Ideograph */
- [0x8b1b, 0x8b1b], /* CJK Ideograph */
- [0x8b1c, 0x8b1c], /* CJK Ideograph */
- [0x8b1d, 0x8b1d], /* CJK Ideograph */
- [0x8b1e, 0x8b1e], /* CJK Ideograph */
- [0x8b1f, 0x8b1f], /* CJK Ideograph */
- [0x8b20, 0x8b20], /* CJK Ideograph */
- [0x8b21, 0x8b21], /* CJK Ideograph */
- [0x8b22, 0x8b22], /* CJK Ideograph */
- [0x8b23, 0x8b23], /* CJK Ideograph */
- [0x8b24, 0x8b24], /* CJK Ideograph */
- [0x8b25, 0x8b25], /* CJK Ideograph */
- [0x8b26, 0x8b26], /* CJK Ideograph */
- [0x8b27, 0x8b27], /* CJK Ideograph */
- [0x8b28, 0x8b28], /* CJK Ideograph */
- [0x8b29, 0x8b29], /* CJK Ideograph */
- [0x8b2a, 0x8b2a], /* CJK Ideograph */
- [0x8b2b, 0x8b2b], /* CJK Ideograph */
- [0x8b2c, 0x8b2c], /* CJK Ideograph */
- [0x8b2d, 0x8b2d], /* CJK Ideograph */
- [0x8b2e, 0x8b2e], /* CJK Ideograph */
- [0x8b2f, 0x8b2f], /* CJK Ideograph */
- [0x8b30, 0x8b30], /* CJK Ideograph */
- [0x8b31, 0x8b31], /* CJK Ideograph */
- [0x8b32, 0x8b32], /* CJK Ideograph */
- [0x8b33, 0x8b33], /* CJK Ideograph */
- [0x8b34, 0x8b34], /* CJK Ideograph */
- [0x8b35, 0x8b35], /* CJK Ideograph */
- [0x8b36, 0x8b36], /* CJK Ideograph */
- [0x8b37, 0x8b37], /* CJK Ideograph */
- [0x8b38, 0x8b38], /* CJK Ideograph */
- [0x8b39, 0x8b39], /* CJK Ideograph */
- [0x8b3a, 0x8b3a], /* CJK Ideograph */
- [0x8b3b, 0x8b3b], /* CJK Ideograph */
- [0x8b3c, 0x8b3c], /* CJK Ideograph */
- [0x8b3d, 0x8b3d], /* CJK Ideograph */
- [0x8b3e, 0x8b3e], /* CJK Ideograph */
- [0x8b3f, 0x8b3f], /* CJK Ideograph */
- [0x8b40, 0x8b40], /* CJK Ideograph */
- [0x8b41, 0x8b41], /* CJK Ideograph */
- [0x8b42, 0x8b42], /* CJK Ideograph */
- [0x8b43, 0x8b43], /* CJK Ideograph */
- [0x8b44, 0x8b44], /* CJK Ideograph */
- [0x8b45, 0x8b45], /* CJK Ideograph */
- [0x8b46, 0x8b46], /* CJK Ideograph */
- [0x8b47, 0x8b47], /* CJK Ideograph */
- [0x8b48, 0x8b48], /* CJK Ideograph */
- [0x8b49, 0x8b49], /* CJK Ideograph */
- [0x8b4a, 0x8b4a], /* CJK Ideograph */
- [0x8b4b, 0x8b4b], /* CJK Ideograph */
- [0x8b4c, 0x8b4c], /* CJK Ideograph */
- [0x8b4d, 0x8b4d], /* CJK Ideograph */
- [0x8b4e, 0x8b4e], /* CJK Ideograph */
- [0x8b4f, 0x8b4f], /* CJK Ideograph */
- [0x8b50, 0x8b50], /* CJK Ideograph */
- [0x8b51, 0x8b51], /* CJK Ideograph */
- [0x8b52, 0x8b52], /* CJK Ideograph */
- [0x8b53, 0x8b53], /* CJK Ideograph */
- [0x8b54, 0x8b54], /* CJK Ideograph */
- [0x8b55, 0x8b55], /* CJK Ideograph */
- [0x8b56, 0x8b56], /* CJK Ideograph */
- [0x8b57, 0x8b57], /* CJK Ideograph */
- [0x8b58, 0x8b58], /* CJK Ideograph */
- [0x8b59, 0x8b59], /* CJK Ideograph */
- [0x8b5a, 0x8b5a], /* CJK Ideograph */
- [0x8b5b, 0x8b5b], /* CJK Ideograph */
- [0x8b5c, 0x8b5c], /* CJK Ideograph */
- [0x8b5d, 0x8b5d], /* CJK Ideograph */
- [0x8b5e, 0x8b5e], /* CJK Ideograph */
- [0x8b5f, 0x8b5f], /* CJK Ideograph */
- [0x8b60, 0x8b60], /* CJK Ideograph */
- [0x8b61, 0x8b61], /* CJK Ideograph */
- [0x8b62, 0x8b62], /* CJK Ideograph */
- [0x8b63, 0x8b63], /* CJK Ideograph */
- [0x8b64, 0x8b64], /* CJK Ideograph */
- [0x8b65, 0x8b65], /* CJK Ideograph */
- [0x8b66, 0x8b66], /* CJK Ideograph */
- [0x8b67, 0x8b67], /* CJK Ideograph */
- [0x8b68, 0x8b68], /* CJK Ideograph */
- [0x8b69, 0x8b69], /* CJK Ideograph */
- [0x8b6a, 0x8b6a], /* CJK Ideograph */
- [0x8b6b, 0x8b6b], /* CJK Ideograph */
- [0x8b6c, 0x8b6c], /* CJK Ideograph */
- [0x8b6d, 0x8b6d], /* CJK Ideograph */
- [0x8b6e, 0x8b6e], /* CJK Ideograph */
- [0x8b6f, 0x8b6f], /* CJK Ideograph */
- [0x8b70, 0x8b70], /* CJK Ideograph */
- [0x8b71, 0x8b71], /* CJK Ideograph */
- [0x8b72, 0x8b72], /* CJK Ideograph */
- [0x8b73, 0x8b73], /* CJK Ideograph */
- [0x8b74, 0x8b74], /* CJK Ideograph */
- [0x8b75, 0x8b75], /* CJK Ideograph */
- [0x8b76, 0x8b76], /* CJK Ideograph */
- [0x8b77, 0x8b77], /* CJK Ideograph */
- [0x8b78, 0x8b78], /* CJK Ideograph */
- [0x8b79, 0x8b79], /* CJK Ideograph */
- [0x8b7a, 0x8b7a], /* CJK Ideograph */
- [0x8b7b, 0x8b7b], /* CJK Ideograph */
- [0x8b7c, 0x8b7c], /* CJK Ideograph */
- [0x8b7d, 0x8b7d], /* CJK Ideograph */
- [0x8b7e, 0x8b7e], /* CJK Ideograph */
- [0x8b7f, 0x8b7f], /* CJK Ideograph */
- [0x8b80, 0x8b80], /* CJK Ideograph */
- [0x8b81, 0x8b81], /* CJK Ideograph */
- [0x8b82, 0x8b82], /* CJK Ideograph */
- [0x8b83, 0x8b83], /* CJK Ideograph */
- [0x8b84, 0x8b84], /* CJK Ideograph */
- [0x8b85, 0x8b85], /* CJK Ideograph */
- [0x8b86, 0x8b86], /* CJK Ideograph */
- [0x8b87, 0x8b87], /* CJK Ideograph */
- [0x8b88, 0x8b88], /* CJK Ideograph */
- [0x8b89, 0x8b89], /* CJK Ideograph */
- [0x8b8a, 0x8b8a], /* CJK Ideograph */
- [0x8b8b, 0x8b8b], /* CJK Ideograph */
- [0x8b8c, 0x8b8c], /* CJK Ideograph */
- [0x8b8d, 0x8b8d], /* CJK Ideograph */
- [0x8b8e, 0x8b8e], /* CJK Ideograph */
- [0x8b8f, 0x8b8f], /* CJK Ideograph */
- [0x8b90, 0x8b90], /* CJK Ideograph */
- [0x8b91, 0x8b91], /* CJK Ideograph */
- [0x8b92, 0x8b92], /* CJK Ideograph */
- [0x8b93, 0x8b93], /* CJK Ideograph */
- [0x8b94, 0x8b94], /* CJK Ideograph */
- [0x8b95, 0x8b95], /* CJK Ideograph */
- [0x8b96, 0x8b96], /* CJK Ideograph */
- [0x8b97, 0x8b97], /* CJK Ideograph */
- [0x8b98, 0x8b98], /* CJK Ideograph */
- [0x8b99, 0x8b99], /* CJK Ideograph */
- [0x8b9a, 0x8b9a], /* CJK Ideograph */
- [0x8b9b, 0x8b9b], /* CJK Ideograph */
- [0x8b9c, 0x8b9c], /* CJK Ideograph */
- [0x8b9d, 0x8b9d], /* CJK Ideograph */
- [0x8b9e, 0x8b9e], /* CJK Ideograph */
- [0x8b9f, 0x8b9f], /* CJK Ideograph */
- [0x8ba0, 0x8ba0], /* CJK Ideograph */
- [0x8ba1, 0x8ba1], /* CJK Ideograph */
- [0x8ba2, 0x8ba2], /* CJK Ideograph */
- [0x8ba3, 0x8ba3], /* CJK Ideograph */
- [0x8ba4, 0x8ba4], /* CJK Ideograph */
- [0x8ba5, 0x8ba5], /* CJK Ideograph */
- [0x8ba6, 0x8ba6], /* CJK Ideograph */
- [0x8ba7, 0x8ba7], /* CJK Ideograph */
- [0x8ba8, 0x8ba8], /* CJK Ideograph */
- [0x8ba9, 0x8ba9], /* CJK Ideograph */
- [0x8baa, 0x8baa], /* CJK Ideograph */
- [0x8bab, 0x8bab], /* CJK Ideograph */
- [0x8bac, 0x8bac], /* CJK Ideograph */
- [0x8bad, 0x8bad], /* CJK Ideograph */
- [0x8bae, 0x8bae], /* CJK Ideograph */
- [0x8baf, 0x8baf], /* CJK Ideograph */
- [0x8bb0, 0x8bb0], /* CJK Ideograph */
- [0x8bb1, 0x8bb1], /* CJK Ideograph */
- [0x8bb2, 0x8bb2], /* CJK Ideograph */
- [0x8bb3, 0x8bb3], /* CJK Ideograph */
- [0x8bb4, 0x8bb4], /* CJK Ideograph */
- [0x8bb5, 0x8bb5], /* CJK Ideograph */
- [0x8bb6, 0x8bb6], /* CJK Ideograph */
- [0x8bb7, 0x8bb7], /* CJK Ideograph */
- [0x8bb8, 0x8bb8], /* CJK Ideograph */
- [0x8bb9, 0x8bb9], /* CJK Ideograph */
- [0x8bba, 0x8bba], /* CJK Ideograph */
- [0x8bbb, 0x8bbb], /* CJK Ideograph */
- [0x8bbc, 0x8bbc], /* CJK Ideograph */
- [0x8bbd, 0x8bbd], /* CJK Ideograph */
- [0x8bbe, 0x8bbe], /* CJK Ideograph */
- [0x8bbf, 0x8bbf], /* CJK Ideograph */
- [0x8bc0, 0x8bc0], /* CJK Ideograph */
- [0x8bc1, 0x8bc1], /* CJK Ideograph */
- [0x8bc2, 0x8bc2], /* CJK Ideograph */
- [0x8bc3, 0x8bc3], /* CJK Ideograph */
- [0x8bc4, 0x8bc4], /* CJK Ideograph */
- [0x8bc5, 0x8bc5], /* CJK Ideograph */
- [0x8bc6, 0x8bc6], /* CJK Ideograph */
- [0x8bc7, 0x8bc7], /* CJK Ideograph */
- [0x8bc8, 0x8bc8], /* CJK Ideograph */
- [0x8bc9, 0x8bc9], /* CJK Ideograph */
- [0x8bca, 0x8bca], /* CJK Ideograph */
- [0x8bcb, 0x8bcb], /* CJK Ideograph */
- [0x8bcc, 0x8bcc], /* CJK Ideograph */
- [0x8bcd, 0x8bcd], /* CJK Ideograph */
- [0x8bce, 0x8bce], /* CJK Ideograph */
- [0x8bcf, 0x8bcf], /* CJK Ideograph */
- [0x8bd0, 0x8bd0], /* CJK Ideograph */
- [0x8bd1, 0x8bd1], /* CJK Ideograph */
- [0x8bd2, 0x8bd2], /* CJK Ideograph */
- [0x8bd3, 0x8bd3], /* CJK Ideograph */
- [0x8bd4, 0x8bd4], /* CJK Ideograph */
- [0x8bd5, 0x8bd5], /* CJK Ideograph */
- [0x8bd6, 0x8bd6], /* CJK Ideograph */
- [0x8bd7, 0x8bd7], /* CJK Ideograph */
- [0x8bd8, 0x8bd8], /* CJK Ideograph */
- [0x8bd9, 0x8bd9], /* CJK Ideograph */
- [0x8bda, 0x8bda], /* CJK Ideograph */
- [0x8bdb, 0x8bdb], /* CJK Ideograph */
- [0x8bdc, 0x8bdc], /* CJK Ideograph */
- [0x8bdd, 0x8bdd], /* CJK Ideograph */
- [0x8bde, 0x8bde], /* CJK Ideograph */
- [0x8bdf, 0x8bdf], /* CJK Ideograph */
- [0x8be0, 0x8be0], /* CJK Ideograph */
- [0x8be1, 0x8be1], /* CJK Ideograph */
- [0x8be2, 0x8be2], /* CJK Ideograph */
- [0x8be3, 0x8be3], /* CJK Ideograph */
- [0x8be4, 0x8be4], /* CJK Ideograph */
- [0x8be5, 0x8be5], /* CJK Ideograph */
- [0x8be6, 0x8be6], /* CJK Ideograph */
- [0x8be7, 0x8be7], /* CJK Ideograph */
- [0x8be8, 0x8be8], /* CJK Ideograph */
- [0x8be9, 0x8be9], /* CJK Ideograph */
- [0x8bea, 0x8bea], /* CJK Ideograph */
- [0x8beb, 0x8beb], /* CJK Ideograph */
- [0x8bec, 0x8bec], /* CJK Ideograph */
- [0x8bed, 0x8bed], /* CJK Ideograph */
- [0x8bee, 0x8bee], /* CJK Ideograph */
- [0x8bef, 0x8bef], /* CJK Ideograph */
- [0x8bf0, 0x8bf0], /* CJK Ideograph */
- [0x8bf1, 0x8bf1], /* CJK Ideograph */
- [0x8bf2, 0x8bf2], /* CJK Ideograph */
- [0x8bf3, 0x8bf3], /* CJK Ideograph */
- [0x8bf4, 0x8bf4], /* CJK Ideograph */
- [0x8bf5, 0x8bf5], /* CJK Ideograph */
- [0x8bf6, 0x8bf6], /* CJK Ideograph */
- [0x8bf7, 0x8bf7], /* CJK Ideograph */
- [0x8bf8, 0x8bf8], /* CJK Ideograph */
- [0x8bf9, 0x8bf9], /* CJK Ideograph */
- [0x8bfa, 0x8bfa], /* CJK Ideograph */
- [0x8bfb, 0x8bfb], /* CJK Ideograph */
- [0x8bfc, 0x8bfc], /* CJK Ideograph */
- [0x8bfd, 0x8bfd], /* CJK Ideograph */
- [0x8bfe, 0x8bfe], /* CJK Ideograph */
- [0x8bff, 0x8bff], /* CJK Ideograph */
- [0x8c00, 0x8c00], /* CJK Ideograph */
- [0x8c01, 0x8c01], /* CJK Ideograph */
- [0x8c02, 0x8c02], /* CJK Ideograph */
- [0x8c03, 0x8c03], /* CJK Ideograph */
- [0x8c04, 0x8c04], /* CJK Ideograph */
- [0x8c05, 0x8c05], /* CJK Ideograph */
- [0x8c06, 0x8c06], /* CJK Ideograph */
- [0x8c07, 0x8c07], /* CJK Ideograph */
- [0x8c08, 0x8c08], /* CJK Ideograph */
- [0x8c09, 0x8c09], /* CJK Ideograph */
- [0x8c0a, 0x8c0a], /* CJK Ideograph */
- [0x8c0b, 0x8c0b], /* CJK Ideograph */
- [0x8c0c, 0x8c0c], /* CJK Ideograph */
- [0x8c0d, 0x8c0d], /* CJK Ideograph */
- [0x8c0e, 0x8c0e], /* CJK Ideograph */
- [0x8c0f, 0x8c0f], /* CJK Ideograph */
- [0x8c10, 0x8c10], /* CJK Ideograph */
- [0x8c11, 0x8c11], /* CJK Ideograph */
- [0x8c12, 0x8c12], /* CJK Ideograph */
- [0x8c13, 0x8c13], /* CJK Ideograph */
- [0x8c14, 0x8c14], /* CJK Ideograph */
- [0x8c15, 0x8c15], /* CJK Ideograph */
- [0x8c16, 0x8c16], /* CJK Ideograph */
- [0x8c17, 0x8c17], /* CJK Ideograph */
- [0x8c18, 0x8c18], /* CJK Ideograph */
- [0x8c19, 0x8c19], /* CJK Ideograph */
- [0x8c1a, 0x8c1a], /* CJK Ideograph */
- [0x8c1b, 0x8c1b], /* CJK Ideograph */
- [0x8c1c, 0x8c1c], /* CJK Ideograph */
- [0x8c1d, 0x8c1d], /* CJK Ideograph */
- [0x8c1e, 0x8c1e], /* CJK Ideograph */
- [0x8c1f, 0x8c1f], /* CJK Ideograph */
- [0x8c20, 0x8c20], /* CJK Ideograph */
- [0x8c21, 0x8c21], /* CJK Ideograph */
- [0x8c22, 0x8c22], /* CJK Ideograph */
- [0x8c23, 0x8c23], /* CJK Ideograph */
- [0x8c24, 0x8c24], /* CJK Ideograph */
- [0x8c25, 0x8c25], /* CJK Ideograph */
- [0x8c26, 0x8c26], /* CJK Ideograph */
- [0x8c27, 0x8c27], /* CJK Ideograph */
- [0x8c28, 0x8c28], /* CJK Ideograph */
- [0x8c29, 0x8c29], /* CJK Ideograph */
- [0x8c2a, 0x8c2a], /* CJK Ideograph */
- [0x8c2b, 0x8c2b], /* CJK Ideograph */
- [0x8c2c, 0x8c2c], /* CJK Ideograph */
- [0x8c2d, 0x8c2d], /* CJK Ideograph */
- [0x8c2e, 0x8c2e], /* CJK Ideograph */
- [0x8c2f, 0x8c2f], /* CJK Ideograph */
- [0x8c30, 0x8c30], /* CJK Ideograph */
- [0x8c31, 0x8c31], /* CJK Ideograph */
- [0x8c32, 0x8c32], /* CJK Ideograph */
- [0x8c33, 0x8c33], /* CJK Ideograph */
- [0x8c34, 0x8c34], /* CJK Ideograph */
- [0x8c35, 0x8c35], /* CJK Ideograph */
- [0x8c36, 0x8c36], /* CJK Ideograph */
- [0x8c37, 0x8c37], /* CJK Ideograph */
- [0x8c38, 0x8c38], /* CJK Ideograph */
- [0x8c39, 0x8c39], /* CJK Ideograph */
- [0x8c3a, 0x8c3a], /* CJK Ideograph */
- [0x8c3b, 0x8c3b], /* CJK Ideograph */
- [0x8c3c, 0x8c3c], /* CJK Ideograph */
- [0x8c3d, 0x8c3d], /* CJK Ideograph */
- [0x8c3e, 0x8c3e], /* CJK Ideograph */
- [0x8c3f, 0x8c3f], /* CJK Ideograph */
- [0x8c40, 0x8c40], /* CJK Ideograph */
- [0x8c41, 0x8c41], /* CJK Ideograph */
- [0x8c42, 0x8c42], /* CJK Ideograph */
- [0x8c43, 0x8c43], /* CJK Ideograph */
- [0x8c44, 0x8c44], /* CJK Ideograph */
- [0x8c45, 0x8c45], /* CJK Ideograph */
- [0x8c46, 0x8c46], /* CJK Ideograph */
- [0x8c47, 0x8c47], /* CJK Ideograph */
- [0x8c48, 0x8c48], /* CJK Ideograph */
- [0x8c49, 0x8c49], /* CJK Ideograph */
- [0x8c4a, 0x8c4a], /* CJK Ideograph */
- [0x8c4b, 0x8c4b], /* CJK Ideograph */
- [0x8c4c, 0x8c4c], /* CJK Ideograph */
- [0x8c4d, 0x8c4d], /* CJK Ideograph */
- [0x8c4e, 0x8c4e], /* CJK Ideograph */
- [0x8c4f, 0x8c4f], /* CJK Ideograph */
- [0x8c50, 0x8c50], /* CJK Ideograph */
- [0x8c51, 0x8c51], /* CJK Ideograph */
- [0x8c52, 0x8c52], /* CJK Ideograph */
- [0x8c53, 0x8c53], /* CJK Ideograph */
- [0x8c54, 0x8c54], /* CJK Ideograph */
- [0x8c55, 0x8c55], /* CJK Ideograph */
- [0x8c56, 0x8c56], /* CJK Ideograph */
- [0x8c57, 0x8c57], /* CJK Ideograph */
- [0x8c58, 0x8c58], /* CJK Ideograph */
- [0x8c59, 0x8c59], /* CJK Ideograph */
- [0x8c5a, 0x8c5a], /* CJK Ideograph */
- [0x8c5b, 0x8c5b], /* CJK Ideograph */
- [0x8c5c, 0x8c5c], /* CJK Ideograph */
- [0x8c5d, 0x8c5d], /* CJK Ideograph */
- [0x8c5e, 0x8c5e], /* CJK Ideograph */
- [0x8c5f, 0x8c5f], /* CJK Ideograph */
- [0x8c60, 0x8c60], /* CJK Ideograph */
- [0x8c61, 0x8c61], /* CJK Ideograph */
- [0x8c62, 0x8c62], /* CJK Ideograph */
- [0x8c63, 0x8c63], /* CJK Ideograph */
- [0x8c64, 0x8c64], /* CJK Ideograph */
- [0x8c65, 0x8c65], /* CJK Ideograph */
- [0x8c66, 0x8c66], /* CJK Ideograph */
- [0x8c67, 0x8c67], /* CJK Ideograph */
- [0x8c68, 0x8c68], /* CJK Ideograph */
- [0x8c69, 0x8c69], /* CJK Ideograph */
- [0x8c6a, 0x8c6a], /* CJK Ideograph */
- [0x8c6b, 0x8c6b], /* CJK Ideograph */
- [0x8c6c, 0x8c6c], /* CJK Ideograph */
- [0x8c6d, 0x8c6d], /* CJK Ideograph */
- [0x8c6e, 0x8c6e], /* CJK Ideograph */
- [0x8c6f, 0x8c6f], /* CJK Ideograph */
- [0x8c70, 0x8c70], /* CJK Ideograph */
- [0x8c71, 0x8c71], /* CJK Ideograph */
- [0x8c72, 0x8c72], /* CJK Ideograph */
- [0x8c73, 0x8c73], /* CJK Ideograph */
- [0x8c74, 0x8c74], /* CJK Ideograph */
- [0x8c75, 0x8c75], /* CJK Ideograph */
- [0x8c76, 0x8c76], /* CJK Ideograph */
- [0x8c77, 0x8c77], /* CJK Ideograph */
- [0x8c78, 0x8c78], /* CJK Ideograph */
- [0x8c79, 0x8c79], /* CJK Ideograph */
- [0x8c7a, 0x8c7a], /* CJK Ideograph */
- [0x8c7b, 0x8c7b], /* CJK Ideograph */
- [0x8c7c, 0x8c7c], /* CJK Ideograph */
- [0x8c7d, 0x8c7d], /* CJK Ideograph */
- [0x8c7e, 0x8c7e], /* CJK Ideograph */
- [0x8c7f, 0x8c7f], /* CJK Ideograph */
- [0x8c80, 0x8c80], /* CJK Ideograph */
- [0x8c81, 0x8c81], /* CJK Ideograph */
- [0x8c82, 0x8c82], /* CJK Ideograph */
- [0x8c83, 0x8c83], /* CJK Ideograph */
- [0x8c84, 0x8c84], /* CJK Ideograph */
- [0x8c85, 0x8c85], /* CJK Ideograph */
- [0x8c86, 0x8c86], /* CJK Ideograph */
- [0x8c87, 0x8c87], /* CJK Ideograph */
- [0x8c88, 0x8c88], /* CJK Ideograph */
- [0x8c89, 0x8c89], /* CJK Ideograph */
- [0x8c8a, 0x8c8a], /* CJK Ideograph */
- [0x8c8b, 0x8c8b], /* CJK Ideograph */
- [0x8c8c, 0x8c8c], /* CJK Ideograph */
- [0x8c8d, 0x8c8d], /* CJK Ideograph */
- [0x8c8e, 0x8c8e], /* CJK Ideograph */
- [0x8c8f, 0x8c8f], /* CJK Ideograph */
- [0x8c90, 0x8c90], /* CJK Ideograph */
- [0x8c91, 0x8c91], /* CJK Ideograph */
- [0x8c92, 0x8c92], /* CJK Ideograph */
- [0x8c93, 0x8c93], /* CJK Ideograph */
- [0x8c94, 0x8c94], /* CJK Ideograph */
- [0x8c95, 0x8c95], /* CJK Ideograph */
- [0x8c96, 0x8c96], /* CJK Ideograph */
- [0x8c97, 0x8c97], /* CJK Ideograph */
- [0x8c98, 0x8c98], /* CJK Ideograph */
- [0x8c99, 0x8c99], /* CJK Ideograph */
- [0x8c9a, 0x8c9a], /* CJK Ideograph */
- [0x8c9b, 0x8c9b], /* CJK Ideograph */
- [0x8c9c, 0x8c9c], /* CJK Ideograph */
- [0x8c9d, 0x8c9d], /* CJK Ideograph */
- [0x8c9e, 0x8c9e], /* CJK Ideograph */
- [0x8c9f, 0x8c9f], /* CJK Ideograph */
- [0x8ca0, 0x8ca0], /* CJK Ideograph */
- [0x8ca1, 0x8ca1], /* CJK Ideograph */
- [0x8ca2, 0x8ca2], /* CJK Ideograph */
- [0x8ca3, 0x8ca3], /* CJK Ideograph */
- [0x8ca4, 0x8ca4], /* CJK Ideograph */
- [0x8ca5, 0x8ca5], /* CJK Ideograph */
- [0x8ca6, 0x8ca6], /* CJK Ideograph */
- [0x8ca7, 0x8ca7], /* CJK Ideograph */
- [0x8ca8, 0x8ca8], /* CJK Ideograph */
- [0x8ca9, 0x8ca9], /* CJK Ideograph */
- [0x8caa, 0x8caa], /* CJK Ideograph */
- [0x8cab, 0x8cab], /* CJK Ideograph */
- [0x8cac, 0x8cac], /* CJK Ideograph */
- [0x8cad, 0x8cad], /* CJK Ideograph */
- [0x8cae, 0x8cae], /* CJK Ideograph */
- [0x8caf, 0x8caf], /* CJK Ideograph */
- [0x8cb0, 0x8cb0], /* CJK Ideograph */
- [0x8cb1, 0x8cb1], /* CJK Ideograph */
- [0x8cb2, 0x8cb2], /* CJK Ideograph */
- [0x8cb3, 0x8cb3], /* CJK Ideograph */
- [0x8cb4, 0x8cb4], /* CJK Ideograph */
- [0x8cb5, 0x8cb5], /* CJK Ideograph */
- [0x8cb6, 0x8cb6], /* CJK Ideograph */
- [0x8cb7, 0x8cb7], /* CJK Ideograph */
- [0x8cb8, 0x8cb8], /* CJK Ideograph */
- [0x8cb9, 0x8cb9], /* CJK Ideograph */
- [0x8cba, 0x8cba], /* CJK Ideograph */
- [0x8cbb, 0x8cbb], /* CJK Ideograph */
- [0x8cbc, 0x8cbc], /* CJK Ideograph */
- [0x8cbd, 0x8cbd], /* CJK Ideograph */
- [0x8cbe, 0x8cbe], /* CJK Ideograph */
- [0x8cbf, 0x8cbf], /* CJK Ideograph */
- [0x8cc0, 0x8cc0], /* CJK Ideograph */
- [0x8cc1, 0x8cc1], /* CJK Ideograph */
- [0x8cc2, 0x8cc2], /* CJK Ideograph */
- [0x8cc3, 0x8cc3], /* CJK Ideograph */
- [0x8cc4, 0x8cc4], /* CJK Ideograph */
- [0x8cc5, 0x8cc5], /* CJK Ideograph */
- [0x8cc6, 0x8cc6], /* CJK Ideograph */
- [0x8cc7, 0x8cc7], /* CJK Ideograph */
- [0x8cc8, 0x8cc8], /* CJK Ideograph */
- [0x8cc9, 0x8cc9], /* CJK Ideograph */
- [0x8cca, 0x8cca], /* CJK Ideograph */
- [0x8ccb, 0x8ccb], /* CJK Ideograph */
- [0x8ccc, 0x8ccc], /* CJK Ideograph */
- [0x8ccd, 0x8ccd], /* CJK Ideograph */
- [0x8cce, 0x8cce], /* CJK Ideograph */
- [0x8ccf, 0x8ccf], /* CJK Ideograph */
- [0x8cd0, 0x8cd0], /* CJK Ideograph */
- [0x8cd1, 0x8cd1], /* CJK Ideograph */
- [0x8cd2, 0x8cd2], /* CJK Ideograph */
- [0x8cd3, 0x8cd3], /* CJK Ideograph */
- [0x8cd4, 0x8cd4], /* CJK Ideograph */
- [0x8cd5, 0x8cd5], /* CJK Ideograph */
- [0x8cd6, 0x8cd6], /* CJK Ideograph */
- [0x8cd7, 0x8cd7], /* CJK Ideograph */
- [0x8cd8, 0x8cd8], /* CJK Ideograph */
- [0x8cd9, 0x8cd9], /* CJK Ideograph */
- [0x8cda, 0x8cda], /* CJK Ideograph */
- [0x8cdb, 0x8cdb], /* CJK Ideograph */
- [0x8cdc, 0x8cdc], /* CJK Ideograph */
- [0x8cdd, 0x8cdd], /* CJK Ideograph */
- [0x8cde, 0x8cde], /* CJK Ideograph */
- [0x8cdf, 0x8cdf], /* CJK Ideograph */
- [0x8ce0, 0x8ce0], /* CJK Ideograph */
- [0x8ce1, 0x8ce1], /* CJK Ideograph */
- [0x8ce2, 0x8ce2], /* CJK Ideograph */
- [0x8ce3, 0x8ce3], /* CJK Ideograph */
- [0x8ce4, 0x8ce4], /* CJK Ideograph */
- [0x8ce5, 0x8ce5], /* CJK Ideograph */
- [0x8ce6, 0x8ce6], /* CJK Ideograph */
- [0x8ce7, 0x8ce7], /* CJK Ideograph */
- [0x8ce8, 0x8ce8], /* CJK Ideograph */
- [0x8ce9, 0x8ce9], /* CJK Ideograph */
- [0x8cea, 0x8cea], /* CJK Ideograph */
- [0x8ceb, 0x8ceb], /* CJK Ideograph */
- [0x8cec, 0x8cec], /* CJK Ideograph */
- [0x8ced, 0x8ced], /* CJK Ideograph */
- [0x8cee, 0x8cee], /* CJK Ideograph */
- [0x8cef, 0x8cef], /* CJK Ideograph */
- [0x8cf0, 0x8cf0], /* CJK Ideograph */
- [0x8cf1, 0x8cf1], /* CJK Ideograph */
- [0x8cf2, 0x8cf2], /* CJK Ideograph */
- [0x8cf3, 0x8cf3], /* CJK Ideograph */
- [0x8cf4, 0x8cf4], /* CJK Ideograph */
- [0x8cf5, 0x8cf5], /* CJK Ideograph */
- [0x8cf6, 0x8cf6], /* CJK Ideograph */
- [0x8cf7, 0x8cf7], /* CJK Ideograph */
- [0x8cf8, 0x8cf8], /* CJK Ideograph */
- [0x8cf9, 0x8cf9], /* CJK Ideograph */
- [0x8cfa, 0x8cfa], /* CJK Ideograph */
- [0x8cfb, 0x8cfb], /* CJK Ideograph */
- [0x8cfc, 0x8cfc], /* CJK Ideograph */
- [0x8cfd, 0x8cfd], /* CJK Ideograph */
- [0x8cfe, 0x8cfe], /* CJK Ideograph */
- [0x8cff, 0x8cff], /* CJK Ideograph */
- [0x8d00, 0x8d00], /* CJK Ideograph */
- [0x8d01, 0x8d01], /* CJK Ideograph */
- [0x8d02, 0x8d02], /* CJK Ideograph */
- [0x8d03, 0x8d03], /* CJK Ideograph */
- [0x8d04, 0x8d04], /* CJK Ideograph */
- [0x8d05, 0x8d05], /* CJK Ideograph */
- [0x8d06, 0x8d06], /* CJK Ideograph */
- [0x8d07, 0x8d07], /* CJK Ideograph */
- [0x8d08, 0x8d08], /* CJK Ideograph */
- [0x8d09, 0x8d09], /* CJK Ideograph */
- [0x8d0a, 0x8d0a], /* CJK Ideograph */
- [0x8d0b, 0x8d0b], /* CJK Ideograph */
- [0x8d0c, 0x8d0c], /* CJK Ideograph */
- [0x8d0d, 0x8d0d], /* CJK Ideograph */
- [0x8d0e, 0x8d0e], /* CJK Ideograph */
- [0x8d0f, 0x8d0f], /* CJK Ideograph */
- [0x8d10, 0x8d10], /* CJK Ideograph */
- [0x8d11, 0x8d11], /* CJK Ideograph */
- [0x8d12, 0x8d12], /* CJK Ideograph */
- [0x8d13, 0x8d13], /* CJK Ideograph */
- [0x8d14, 0x8d14], /* CJK Ideograph */
- [0x8d15, 0x8d15], /* CJK Ideograph */
- [0x8d16, 0x8d16], /* CJK Ideograph */
- [0x8d17, 0x8d17], /* CJK Ideograph */
- [0x8d18, 0x8d18], /* CJK Ideograph */
- [0x8d19, 0x8d19], /* CJK Ideograph */
- [0x8d1a, 0x8d1a], /* CJK Ideograph */
- [0x8d1b, 0x8d1b], /* CJK Ideograph */
- [0x8d1c, 0x8d1c], /* CJK Ideograph */
- [0x8d1d, 0x8d1d], /* CJK Ideograph */
- [0x8d1e, 0x8d1e], /* CJK Ideograph */
- [0x8d1f, 0x8d1f], /* CJK Ideograph */
- [0x8d20, 0x8d20], /* CJK Ideograph */
- [0x8d21, 0x8d21], /* CJK Ideograph */
- [0x8d22, 0x8d22], /* CJK Ideograph */
- [0x8d23, 0x8d23], /* CJK Ideograph */
- [0x8d24, 0x8d24], /* CJK Ideograph */
- [0x8d25, 0x8d25], /* CJK Ideograph */
- [0x8d26, 0x8d26], /* CJK Ideograph */
- [0x8d27, 0x8d27], /* CJK Ideograph */
- [0x8d28, 0x8d28], /* CJK Ideograph */
- [0x8d29, 0x8d29], /* CJK Ideograph */
- [0x8d2a, 0x8d2a], /* CJK Ideograph */
- [0x8d2b, 0x8d2b], /* CJK Ideograph */
- [0x8d2c, 0x8d2c], /* CJK Ideograph */
- [0x8d2d, 0x8d2d], /* CJK Ideograph */
- [0x8d2e, 0x8d2e], /* CJK Ideograph */
- [0x8d2f, 0x8d2f], /* CJK Ideograph */
- [0x8d30, 0x8d30], /* CJK Ideograph */
- [0x8d31, 0x8d31], /* CJK Ideograph */
- [0x8d32, 0x8d32], /* CJK Ideograph */
- [0x8d33, 0x8d33], /* CJK Ideograph */
- [0x8d34, 0x8d34], /* CJK Ideograph */
- [0x8d35, 0x8d35], /* CJK Ideograph */
- [0x8d36, 0x8d36], /* CJK Ideograph */
- [0x8d37, 0x8d37], /* CJK Ideograph */
- [0x8d38, 0x8d38], /* CJK Ideograph */
- [0x8d39, 0x8d39], /* CJK Ideograph */
- [0x8d3a, 0x8d3a], /* CJK Ideograph */
- [0x8d3b, 0x8d3b], /* CJK Ideograph */
- [0x8d3c, 0x8d3c], /* CJK Ideograph */
- [0x8d3d, 0x8d3d], /* CJK Ideograph */
- [0x8d3e, 0x8d3e], /* CJK Ideograph */
- [0x8d3f, 0x8d3f], /* CJK Ideograph */
- [0x8d40, 0x8d40], /* CJK Ideograph */
- [0x8d41, 0x8d41], /* CJK Ideograph */
- [0x8d42, 0x8d42], /* CJK Ideograph */
- [0x8d43, 0x8d43], /* CJK Ideograph */
- [0x8d44, 0x8d44], /* CJK Ideograph */
- [0x8d45, 0x8d45], /* CJK Ideograph */
- [0x8d46, 0x8d46], /* CJK Ideograph */
- [0x8d47, 0x8d47], /* CJK Ideograph */
- [0x8d48, 0x8d48], /* CJK Ideograph */
- [0x8d49, 0x8d49], /* CJK Ideograph */
- [0x8d4a, 0x8d4a], /* CJK Ideograph */
- [0x8d4b, 0x8d4b], /* CJK Ideograph */
- [0x8d4c, 0x8d4c], /* CJK Ideograph */
- [0x8d4d, 0x8d4d], /* CJK Ideograph */
- [0x8d4e, 0x8d4e], /* CJK Ideograph */
- [0x8d4f, 0x8d4f], /* CJK Ideograph */
- [0x8d50, 0x8d50], /* CJK Ideograph */
- [0x8d51, 0x8d51], /* CJK Ideograph */
- [0x8d52, 0x8d52], /* CJK Ideograph */
- [0x8d53, 0x8d53], /* CJK Ideograph */
- [0x8d54, 0x8d54], /* CJK Ideograph */
- [0x8d55, 0x8d55], /* CJK Ideograph */
- [0x8d56, 0x8d56], /* CJK Ideograph */
- [0x8d57, 0x8d57], /* CJK Ideograph */
- [0x8d58, 0x8d58], /* CJK Ideograph */
- [0x8d59, 0x8d59], /* CJK Ideograph */
- [0x8d5a, 0x8d5a], /* CJK Ideograph */
- [0x8d5b, 0x8d5b], /* CJK Ideograph */
- [0x8d5c, 0x8d5c], /* CJK Ideograph */
- [0x8d5d, 0x8d5d], /* CJK Ideograph */
- [0x8d5e, 0x8d5e], /* CJK Ideograph */
- [0x8d5f, 0x8d5f], /* CJK Ideograph */
- [0x8d60, 0x8d60], /* CJK Ideograph */
- [0x8d61, 0x8d61], /* CJK Ideograph */
- [0x8d62, 0x8d62], /* CJK Ideograph */
- [0x8d63, 0x8d63], /* CJK Ideograph */
- [0x8d64, 0x8d64], /* CJK Ideograph */
- [0x8d65, 0x8d65], /* CJK Ideograph */
- [0x8d66, 0x8d66], /* CJK Ideograph */
- [0x8d67, 0x8d67], /* CJK Ideograph */
- [0x8d68, 0x8d68], /* CJK Ideograph */
- [0x8d69, 0x8d69], /* CJK Ideograph */
- [0x8d6a, 0x8d6a], /* CJK Ideograph */
- [0x8d6b, 0x8d6b], /* CJK Ideograph */
- [0x8d6c, 0x8d6c], /* CJK Ideograph */
- [0x8d6d, 0x8d6d], /* CJK Ideograph */
- [0x8d6e, 0x8d6e], /* CJK Ideograph */
- [0x8d6f, 0x8d6f], /* CJK Ideograph */
- [0x8d70, 0x8d70], /* CJK Ideograph */
- [0x8d71, 0x8d71], /* CJK Ideograph */
- [0x8d72, 0x8d72], /* CJK Ideograph */
- [0x8d73, 0x8d73], /* CJK Ideograph */
- [0x8d74, 0x8d74], /* CJK Ideograph */
- [0x8d75, 0x8d75], /* CJK Ideograph */
- [0x8d76, 0x8d76], /* CJK Ideograph */
- [0x8d77, 0x8d77], /* CJK Ideograph */
- [0x8d78, 0x8d78], /* CJK Ideograph */
- [0x8d79, 0x8d79], /* CJK Ideograph */
- [0x8d7a, 0x8d7a], /* CJK Ideograph */
- [0x8d7b, 0x8d7b], /* CJK Ideograph */
- [0x8d7c, 0x8d7c], /* CJK Ideograph */
- [0x8d7d, 0x8d7d], /* CJK Ideograph */
- [0x8d7e, 0x8d7e], /* CJK Ideograph */
- [0x8d7f, 0x8d7f], /* CJK Ideograph */
- [0x8d80, 0x8d80], /* CJK Ideograph */
- [0x8d81, 0x8d81], /* CJK Ideograph */
- [0x8d82, 0x8d82], /* CJK Ideograph */
- [0x8d83, 0x8d83], /* CJK Ideograph */
- [0x8d84, 0x8d84], /* CJK Ideograph */
- [0x8d85, 0x8d85], /* CJK Ideograph */
- [0x8d86, 0x8d86], /* CJK Ideograph */
- [0x8d87, 0x8d87], /* CJK Ideograph */
- [0x8d88, 0x8d88], /* CJK Ideograph */
- [0x8d89, 0x8d89], /* CJK Ideograph */
- [0x8d8a, 0x8d8a], /* CJK Ideograph */
- [0x8d8b, 0x8d8b], /* CJK Ideograph */
- [0x8d8c, 0x8d8c], /* CJK Ideograph */
- [0x8d8d, 0x8d8d], /* CJK Ideograph */
- [0x8d8e, 0x8d8e], /* CJK Ideograph */
- [0x8d8f, 0x8d8f], /* CJK Ideograph */
- [0x8d90, 0x8d90], /* CJK Ideograph */
- [0x8d91, 0x8d91], /* CJK Ideograph */
- [0x8d92, 0x8d92], /* CJK Ideograph */
- [0x8d93, 0x8d93], /* CJK Ideograph */
- [0x8d94, 0x8d94], /* CJK Ideograph */
- [0x8d95, 0x8d95], /* CJK Ideograph */
- [0x8d96, 0x8d96], /* CJK Ideograph */
- [0x8d97, 0x8d97], /* CJK Ideograph */
- [0x8d98, 0x8d98], /* CJK Ideograph */
- [0x8d99, 0x8d99], /* CJK Ideograph */
- [0x8d9a, 0x8d9a], /* CJK Ideograph */
- [0x8d9b, 0x8d9b], /* CJK Ideograph */
- [0x8d9c, 0x8d9c], /* CJK Ideograph */
- [0x8d9d, 0x8d9d], /* CJK Ideograph */
- [0x8d9e, 0x8d9e], /* CJK Ideograph */
- [0x8d9f, 0x8d9f], /* CJK Ideograph */
- [0x8da0, 0x8da0], /* CJK Ideograph */
- [0x8da1, 0x8da1], /* CJK Ideograph */
- [0x8da2, 0x8da2], /* CJK Ideograph */
- [0x8da3, 0x8da3], /* CJK Ideograph */
- [0x8da4, 0x8da4], /* CJK Ideograph */
- [0x8da5, 0x8da5], /* CJK Ideograph */
- [0x8da6, 0x8da6], /* CJK Ideograph */
- [0x8da7, 0x8da7], /* CJK Ideograph */
- [0x8da8, 0x8da8], /* CJK Ideograph */
- [0x8da9, 0x8da9], /* CJK Ideograph */
- [0x8daa, 0x8daa], /* CJK Ideograph */
- [0x8dab, 0x8dab], /* CJK Ideograph */
- [0x8dac, 0x8dac], /* CJK Ideograph */
- [0x8dad, 0x8dad], /* CJK Ideograph */
- [0x8dae, 0x8dae], /* CJK Ideograph */
- [0x8daf, 0x8daf], /* CJK Ideograph */
- [0x8db0, 0x8db0], /* CJK Ideograph */
- [0x8db1, 0x8db1], /* CJK Ideograph */
- [0x8db2, 0x8db2], /* CJK Ideograph */
- [0x8db3, 0x8db3], /* CJK Ideograph */
- [0x8db4, 0x8db4], /* CJK Ideograph */
- [0x8db5, 0x8db5], /* CJK Ideograph */
- [0x8db6, 0x8db6], /* CJK Ideograph */
- [0x8db7, 0x8db7], /* CJK Ideograph */
- [0x8db8, 0x8db8], /* CJK Ideograph */
- [0x8db9, 0x8db9], /* CJK Ideograph */
- [0x8dba, 0x8dba], /* CJK Ideograph */
- [0x8dbb, 0x8dbb], /* CJK Ideograph */
- [0x8dbc, 0x8dbc], /* CJK Ideograph */
- [0x8dbd, 0x8dbd], /* CJK Ideograph */
- [0x8dbe, 0x8dbe], /* CJK Ideograph */
- [0x8dbf, 0x8dbf], /* CJK Ideograph */
- [0x8dc0, 0x8dc0], /* CJK Ideograph */
- [0x8dc1, 0x8dc1], /* CJK Ideograph */
- [0x8dc2, 0x8dc2], /* CJK Ideograph */
- [0x8dc3, 0x8dc3], /* CJK Ideograph */
- [0x8dc4, 0x8dc4], /* CJK Ideograph */
- [0x8dc5, 0x8dc5], /* CJK Ideograph */
- [0x8dc6, 0x8dc6], /* CJK Ideograph */
- [0x8dc7, 0x8dc7], /* CJK Ideograph */
- [0x8dc8, 0x8dc8], /* CJK Ideograph */
- [0x8dc9, 0x8dc9], /* CJK Ideograph */
- [0x8dca, 0x8dca], /* CJK Ideograph */
- [0x8dcb, 0x8dcb], /* CJK Ideograph */
- [0x8dcc, 0x8dcc], /* CJK Ideograph */
- [0x8dcd, 0x8dcd], /* CJK Ideograph */
- [0x8dce, 0x8dce], /* CJK Ideograph */
- [0x8dcf, 0x8dcf], /* CJK Ideograph */
- [0x8dd0, 0x8dd0], /* CJK Ideograph */
- [0x8dd1, 0x8dd1], /* CJK Ideograph */
- [0x8dd2, 0x8dd2], /* CJK Ideograph */
- [0x8dd3, 0x8dd3], /* CJK Ideograph */
- [0x8dd4, 0x8dd4], /* CJK Ideograph */
- [0x8dd5, 0x8dd5], /* CJK Ideograph */
- [0x8dd6, 0x8dd6], /* CJK Ideograph */
- [0x8dd7, 0x8dd7], /* CJK Ideograph */
- [0x8dd8, 0x8dd8], /* CJK Ideograph */
- [0x8dd9, 0x8dd9], /* CJK Ideograph */
- [0x8dda, 0x8dda], /* CJK Ideograph */
- [0x8ddb, 0x8ddb], /* CJK Ideograph */
- [0x8ddc, 0x8ddc], /* CJK Ideograph */
- [0x8ddd, 0x8ddd], /* CJK Ideograph */
- [0x8dde, 0x8dde], /* CJK Ideograph */
- [0x8ddf, 0x8ddf], /* CJK Ideograph */
- [0x8de0, 0x8de0], /* CJK Ideograph */
- [0x8de1, 0x8de1], /* CJK Ideograph */
- [0x8de2, 0x8de2], /* CJK Ideograph */
- [0x8de3, 0x8de3], /* CJK Ideograph */
- [0x8de4, 0x8de4], /* CJK Ideograph */
- [0x8de5, 0x8de5], /* CJK Ideograph */
- [0x8de6, 0x8de6], /* CJK Ideograph */
- [0x8de7, 0x8de7], /* CJK Ideograph */
- [0x8de8, 0x8de8], /* CJK Ideograph */
- [0x8de9, 0x8de9], /* CJK Ideograph */
- [0x8dea, 0x8dea], /* CJK Ideograph */
- [0x8deb, 0x8deb], /* CJK Ideograph */
- [0x8dec, 0x8dec], /* CJK Ideograph */
- [0x8ded, 0x8ded], /* CJK Ideograph */
- [0x8dee, 0x8dee], /* CJK Ideograph */
- [0x8def, 0x8def], /* CJK Ideograph */
- [0x8df0, 0x8df0], /* CJK Ideograph */
- [0x8df1, 0x8df1], /* CJK Ideograph */
- [0x8df2, 0x8df2], /* CJK Ideograph */
- [0x8df3, 0x8df3], /* CJK Ideograph */
- [0x8df4, 0x8df4], /* CJK Ideograph */
- [0x8df5, 0x8df5], /* CJK Ideograph */
- [0x8df6, 0x8df6], /* CJK Ideograph */
- [0x8df7, 0x8df7], /* CJK Ideograph */
- [0x8df8, 0x8df8], /* CJK Ideograph */
- [0x8df9, 0x8df9], /* CJK Ideograph */
- [0x8dfa, 0x8dfa], /* CJK Ideograph */
- [0x8dfb, 0x8dfb], /* CJK Ideograph */
- [0x8dfc, 0x8dfc], /* CJK Ideograph */
- [0x8dfd, 0x8dfd], /* CJK Ideograph */
- [0x8dfe, 0x8dfe], /* CJK Ideograph */
- [0x8dff, 0x8dff], /* CJK Ideograph */
- [0x8e00, 0x8e00], /* CJK Ideograph */
- [0x8e01, 0x8e01], /* CJK Ideograph */
- [0x8e02, 0x8e02], /* CJK Ideograph */
- [0x8e03, 0x8e03], /* CJK Ideograph */
- [0x8e04, 0x8e04], /* CJK Ideograph */
- [0x8e05, 0x8e05], /* CJK Ideograph */
- [0x8e06, 0x8e06], /* CJK Ideograph */
- [0x8e07, 0x8e07], /* CJK Ideograph */
- [0x8e08, 0x8e08], /* CJK Ideograph */
- [0x8e09, 0x8e09], /* CJK Ideograph */
- [0x8e0a, 0x8e0a], /* CJK Ideograph */
- [0x8e0b, 0x8e0b], /* CJK Ideograph */
- [0x8e0c, 0x8e0c], /* CJK Ideograph */
- [0x8e0d, 0x8e0d], /* CJK Ideograph */
- [0x8e0e, 0x8e0e], /* CJK Ideograph */
- [0x8e0f, 0x8e0f], /* CJK Ideograph */
- [0x8e10, 0x8e10], /* CJK Ideograph */
- [0x8e11, 0x8e11], /* CJK Ideograph */
- [0x8e12, 0x8e12], /* CJK Ideograph */
- [0x8e13, 0x8e13], /* CJK Ideograph */
- [0x8e14, 0x8e14], /* CJK Ideograph */
- [0x8e15, 0x8e15], /* CJK Ideograph */
- [0x8e16, 0x8e16], /* CJK Ideograph */
- [0x8e17, 0x8e17], /* CJK Ideograph */
- [0x8e18, 0x8e18], /* CJK Ideograph */
- [0x8e19, 0x8e19], /* CJK Ideograph */
- [0x8e1a, 0x8e1a], /* CJK Ideograph */
- [0x8e1b, 0x8e1b], /* CJK Ideograph */
- [0x8e1c, 0x8e1c], /* CJK Ideograph */
- [0x8e1d, 0x8e1d], /* CJK Ideograph */
- [0x8e1e, 0x8e1e], /* CJK Ideograph */
- [0x8e1f, 0x8e1f], /* CJK Ideograph */
- [0x8e20, 0x8e20], /* CJK Ideograph */
- [0x8e21, 0x8e21], /* CJK Ideograph */
- [0x8e22, 0x8e22], /* CJK Ideograph */
- [0x8e23, 0x8e23], /* CJK Ideograph */
- [0x8e24, 0x8e24], /* CJK Ideograph */
- [0x8e25, 0x8e25], /* CJK Ideograph */
- [0x8e26, 0x8e26], /* CJK Ideograph */
- [0x8e27, 0x8e27], /* CJK Ideograph */
- [0x8e28, 0x8e28], /* CJK Ideograph */
- [0x8e29, 0x8e29], /* CJK Ideograph */
- [0x8e2a, 0x8e2a], /* CJK Ideograph */
- [0x8e2b, 0x8e2b], /* CJK Ideograph */
- [0x8e2c, 0x8e2c], /* CJK Ideograph */
- [0x8e2d, 0x8e2d], /* CJK Ideograph */
- [0x8e2e, 0x8e2e], /* CJK Ideograph */
- [0x8e2f, 0x8e2f], /* CJK Ideograph */
- [0x8e30, 0x8e30], /* CJK Ideograph */
- [0x8e31, 0x8e31], /* CJK Ideograph */
- [0x8e32, 0x8e32], /* CJK Ideograph */
- [0x8e33, 0x8e33], /* CJK Ideograph */
- [0x8e34, 0x8e34], /* CJK Ideograph */
- [0x8e35, 0x8e35], /* CJK Ideograph */
- [0x8e36, 0x8e36], /* CJK Ideograph */
- [0x8e37, 0x8e37], /* CJK Ideograph */
- [0x8e38, 0x8e38], /* CJK Ideograph */
- [0x8e39, 0x8e39], /* CJK Ideograph */
- [0x8e3a, 0x8e3a], /* CJK Ideograph */
- [0x8e3b, 0x8e3b], /* CJK Ideograph */
- [0x8e3c, 0x8e3c], /* CJK Ideograph */
- [0x8e3d, 0x8e3d], /* CJK Ideograph */
- [0x8e3e, 0x8e3e], /* CJK Ideograph */
- [0x8e3f, 0x8e3f], /* CJK Ideograph */
- [0x8e40, 0x8e40], /* CJK Ideograph */
- [0x8e41, 0x8e41], /* CJK Ideograph */
- [0x8e42, 0x8e42], /* CJK Ideograph */
- [0x8e43, 0x8e43], /* CJK Ideograph */
- [0x8e44, 0x8e44], /* CJK Ideograph */
- [0x8e45, 0x8e45], /* CJK Ideograph */
- [0x8e46, 0x8e46], /* CJK Ideograph */
- [0x8e47, 0x8e47], /* CJK Ideograph */
- [0x8e48, 0x8e48], /* CJK Ideograph */
- [0x8e49, 0x8e49], /* CJK Ideograph */
- [0x8e4a, 0x8e4a], /* CJK Ideograph */
- [0x8e4b, 0x8e4b], /* CJK Ideograph */
- [0x8e4c, 0x8e4c], /* CJK Ideograph */
- [0x8e4d, 0x8e4d], /* CJK Ideograph */
- [0x8e4e, 0x8e4e], /* CJK Ideograph */
- [0x8e4f, 0x8e4f], /* CJK Ideograph */
- [0x8e50, 0x8e50], /* CJK Ideograph */
- [0x8e51, 0x8e51], /* CJK Ideograph */
- [0x8e52, 0x8e52], /* CJK Ideograph */
- [0x8e53, 0x8e53], /* CJK Ideograph */
- [0x8e54, 0x8e54], /* CJK Ideograph */
- [0x8e55, 0x8e55], /* CJK Ideograph */
- [0x8e56, 0x8e56], /* CJK Ideograph */
- [0x8e57, 0x8e57], /* CJK Ideograph */
- [0x8e58, 0x8e58], /* CJK Ideograph */
- [0x8e59, 0x8e59], /* CJK Ideograph */
- [0x8e5a, 0x8e5a], /* CJK Ideograph */
- [0x8e5b, 0x8e5b], /* CJK Ideograph */
- [0x8e5c, 0x8e5c], /* CJK Ideograph */
- [0x8e5d, 0x8e5d], /* CJK Ideograph */
- [0x8e5e, 0x8e5e], /* CJK Ideograph */
- [0x8e5f, 0x8e5f], /* CJK Ideograph */
- [0x8e60, 0x8e60], /* CJK Ideograph */
- [0x8e61, 0x8e61], /* CJK Ideograph */
- [0x8e62, 0x8e62], /* CJK Ideograph */
- [0x8e63, 0x8e63], /* CJK Ideograph */
- [0x8e64, 0x8e64], /* CJK Ideograph */
- [0x8e65, 0x8e65], /* CJK Ideograph */
- [0x8e66, 0x8e66], /* CJK Ideograph */
- [0x8e67, 0x8e67], /* CJK Ideograph */
- [0x8e68, 0x8e68], /* CJK Ideograph */
- [0x8e69, 0x8e69], /* CJK Ideograph */
- [0x8e6a, 0x8e6a], /* CJK Ideograph */
- [0x8e6b, 0x8e6b], /* CJK Ideograph */
- [0x8e6c, 0x8e6c], /* CJK Ideograph */
- [0x8e6d, 0x8e6d], /* CJK Ideograph */
- [0x8e6e, 0x8e6e], /* CJK Ideograph */
- [0x8e6f, 0x8e6f], /* CJK Ideograph */
- [0x8e70, 0x8e70], /* CJK Ideograph */
- [0x8e71, 0x8e71], /* CJK Ideograph */
- [0x8e72, 0x8e72], /* CJK Ideograph */
- [0x8e73, 0x8e73], /* CJK Ideograph */
- [0x8e74, 0x8e74], /* CJK Ideograph */
- [0x8e75, 0x8e75], /* CJK Ideograph */
- [0x8e76, 0x8e76], /* CJK Ideograph */
- [0x8e77, 0x8e77], /* CJK Ideograph */
- [0x8e78, 0x8e78], /* CJK Ideograph */
- [0x8e79, 0x8e79], /* CJK Ideograph */
- [0x8e7a, 0x8e7a], /* CJK Ideograph */
- [0x8e7b, 0x8e7b], /* CJK Ideograph */
- [0x8e7c, 0x8e7c], /* CJK Ideograph */
- [0x8e7d, 0x8e7d], /* CJK Ideograph */
- [0x8e7e, 0x8e7e], /* CJK Ideograph */
- [0x8e7f, 0x8e7f], /* CJK Ideograph */
- [0x8e80, 0x8e80], /* CJK Ideograph */
- [0x8e81, 0x8e81], /* CJK Ideograph */
- [0x8e82, 0x8e82], /* CJK Ideograph */
- [0x8e83, 0x8e83], /* CJK Ideograph */
- [0x8e84, 0x8e84], /* CJK Ideograph */
- [0x8e85, 0x8e85], /* CJK Ideograph */
- [0x8e86, 0x8e86], /* CJK Ideograph */
- [0x8e87, 0x8e87], /* CJK Ideograph */
- [0x8e88, 0x8e88], /* CJK Ideograph */
- [0x8e89, 0x8e89], /* CJK Ideograph */
- [0x8e8a, 0x8e8a], /* CJK Ideograph */
- [0x8e8b, 0x8e8b], /* CJK Ideograph */
- [0x8e8c, 0x8e8c], /* CJK Ideograph */
- [0x8e8d, 0x8e8d], /* CJK Ideograph */
- [0x8e8e, 0x8e8e], /* CJK Ideograph */
- [0x8e8f, 0x8e8f], /* CJK Ideograph */
- [0x8e90, 0x8e90], /* CJK Ideograph */
- [0x8e91, 0x8e91], /* CJK Ideograph */
- [0x8e92, 0x8e92], /* CJK Ideograph */
- [0x8e93, 0x8e93], /* CJK Ideograph */
- [0x8e94, 0x8e94], /* CJK Ideograph */
- [0x8e95, 0x8e95], /* CJK Ideograph */
- [0x8e96, 0x8e96], /* CJK Ideograph */
- [0x8e97, 0x8e97], /* CJK Ideograph */
- [0x8e98, 0x8e98], /* CJK Ideograph */
- [0x8e99, 0x8e99], /* CJK Ideograph */
- [0x8e9a, 0x8e9a], /* CJK Ideograph */
- [0x8e9b, 0x8e9b], /* CJK Ideograph */
- [0x8e9c, 0x8e9c], /* CJK Ideograph */
- [0x8e9d, 0x8e9d], /* CJK Ideograph */
- [0x8e9e, 0x8e9e], /* CJK Ideograph */
- [0x8e9f, 0x8e9f], /* CJK Ideograph */
- [0x8ea0, 0x8ea0], /* CJK Ideograph */
- [0x8ea1, 0x8ea1], /* CJK Ideograph */
- [0x8ea2, 0x8ea2], /* CJK Ideograph */
- [0x8ea3, 0x8ea3], /* CJK Ideograph */
- [0x8ea4, 0x8ea4], /* CJK Ideograph */
- [0x8ea5, 0x8ea5], /* CJK Ideograph */
- [0x8ea6, 0x8ea6], /* CJK Ideograph */
- [0x8ea7, 0x8ea7], /* CJK Ideograph */
- [0x8ea8, 0x8ea8], /* CJK Ideograph */
- [0x8ea9, 0x8ea9], /* CJK Ideograph */
- [0x8eaa, 0x8eaa], /* CJK Ideograph */
- [0x8eab, 0x8eab], /* CJK Ideograph */
- [0x8eac, 0x8eac], /* CJK Ideograph */
- [0x8ead, 0x8ead], /* CJK Ideograph */
- [0x8eae, 0x8eae], /* CJK Ideograph */
- [0x8eaf, 0x8eaf], /* CJK Ideograph */
- [0x8eb0, 0x8eb0], /* CJK Ideograph */
- [0x8eb1, 0x8eb1], /* CJK Ideograph */
- [0x8eb2, 0x8eb2], /* CJK Ideograph */
- [0x8eb3, 0x8eb3], /* CJK Ideograph */
- [0x8eb4, 0x8eb4], /* CJK Ideograph */
- [0x8eb5, 0x8eb5], /* CJK Ideograph */
- [0x8eb6, 0x8eb6], /* CJK Ideograph */
- [0x8eb7, 0x8eb7], /* CJK Ideograph */
- [0x8eb8, 0x8eb8], /* CJK Ideograph */
- [0x8eb9, 0x8eb9], /* CJK Ideograph */
- [0x8eba, 0x8eba], /* CJK Ideograph */
- [0x8ebb, 0x8ebb], /* CJK Ideograph */
- [0x8ebc, 0x8ebc], /* CJK Ideograph */
- [0x8ebd, 0x8ebd], /* CJK Ideograph */
- [0x8ebe, 0x8ebe], /* CJK Ideograph */
- [0x8ebf, 0x8ebf], /* CJK Ideograph */
- [0x8ec0, 0x8ec0], /* CJK Ideograph */
- [0x8ec1, 0x8ec1], /* CJK Ideograph */
- [0x8ec2, 0x8ec2], /* CJK Ideograph */
- [0x8ec3, 0x8ec3], /* CJK Ideograph */
- [0x8ec4, 0x8ec4], /* CJK Ideograph */
- [0x8ec5, 0x8ec5], /* CJK Ideograph */
- [0x8ec6, 0x8ec6], /* CJK Ideograph */
- [0x8ec7, 0x8ec7], /* CJK Ideograph */
- [0x8ec8, 0x8ec8], /* CJK Ideograph */
- [0x8ec9, 0x8ec9], /* CJK Ideograph */
- [0x8eca, 0x8eca], /* CJK Ideograph */
- [0x8ecb, 0x8ecb], /* CJK Ideograph */
- [0x8ecc, 0x8ecc], /* CJK Ideograph */
- [0x8ecd, 0x8ecd], /* CJK Ideograph */
- [0x8ece, 0x8ece], /* CJK Ideograph */
- [0x8ecf, 0x8ecf], /* CJK Ideograph */
- [0x8ed0, 0x8ed0], /* CJK Ideograph */
- [0x8ed1, 0x8ed1], /* CJK Ideograph */
- [0x8ed2, 0x8ed2], /* CJK Ideograph */
- [0x8ed3, 0x8ed3], /* CJK Ideograph */
- [0x8ed4, 0x8ed4], /* CJK Ideograph */
- [0x8ed5, 0x8ed5], /* CJK Ideograph */
- [0x8ed6, 0x8ed6], /* CJK Ideograph */
- [0x8ed7, 0x8ed7], /* CJK Ideograph */
- [0x8ed8, 0x8ed8], /* CJK Ideograph */
- [0x8ed9, 0x8ed9], /* CJK Ideograph */
- [0x8eda, 0x8eda], /* CJK Ideograph */
- [0x8edb, 0x8edb], /* CJK Ideograph */
- [0x8edc, 0x8edc], /* CJK Ideograph */
- [0x8edd, 0x8edd], /* CJK Ideograph */
- [0x8ede, 0x8ede], /* CJK Ideograph */
- [0x8edf, 0x8edf], /* CJK Ideograph */
- [0x8ee0, 0x8ee0], /* CJK Ideograph */
- [0x8ee1, 0x8ee1], /* CJK Ideograph */
- [0x8ee2, 0x8ee2], /* CJK Ideograph */
- [0x8ee3, 0x8ee3], /* CJK Ideograph */
- [0x8ee4, 0x8ee4], /* CJK Ideograph */
- [0x8ee5, 0x8ee5], /* CJK Ideograph */
- [0x8ee6, 0x8ee6], /* CJK Ideograph */
- [0x8ee7, 0x8ee7], /* CJK Ideograph */
- [0x8ee8, 0x8ee8], /* CJK Ideograph */
- [0x8ee9, 0x8ee9], /* CJK Ideograph */
- [0x8eea, 0x8eea], /* CJK Ideograph */
- [0x8eeb, 0x8eeb], /* CJK Ideograph */
- [0x8eec, 0x8eec], /* CJK Ideograph */
- [0x8eed, 0x8eed], /* CJK Ideograph */
- [0x8eee, 0x8eee], /* CJK Ideograph */
- [0x8eef, 0x8eef], /* CJK Ideograph */
- [0x8ef0, 0x8ef0], /* CJK Ideograph */
- [0x8ef1, 0x8ef1], /* CJK Ideograph */
- [0x8ef2, 0x8ef2], /* CJK Ideograph */
- [0x8ef3, 0x8ef3], /* CJK Ideograph */
- [0x8ef4, 0x8ef4], /* CJK Ideograph */
- [0x8ef5, 0x8ef5], /* CJK Ideograph */
- [0x8ef6, 0x8ef6], /* CJK Ideograph */
- [0x8ef7, 0x8ef7], /* CJK Ideograph */
- [0x8ef8, 0x8ef8], /* CJK Ideograph */
- [0x8ef9, 0x8ef9], /* CJK Ideograph */
- [0x8efa, 0x8efa], /* CJK Ideograph */
- [0x8efb, 0x8efb], /* CJK Ideograph */
- [0x8efc, 0x8efc], /* CJK Ideograph */
- [0x8efd, 0x8efd], /* CJK Ideograph */
- [0x8efe, 0x8efe], /* CJK Ideograph */
- [0x8eff, 0x8eff], /* CJK Ideograph */
- [0x8f00, 0x8f00], /* CJK Ideograph */
- [0x8f01, 0x8f01], /* CJK Ideograph */
- [0x8f02, 0x8f02], /* CJK Ideograph */
- [0x8f03, 0x8f03], /* CJK Ideograph */
- [0x8f04, 0x8f04], /* CJK Ideograph */
- [0x8f05, 0x8f05], /* CJK Ideograph */
- [0x8f06, 0x8f06], /* CJK Ideograph */
- [0x8f07, 0x8f07], /* CJK Ideograph */
- [0x8f08, 0x8f08], /* CJK Ideograph */
- [0x8f09, 0x8f09], /* CJK Ideograph */
- [0x8f0a, 0x8f0a], /* CJK Ideograph */
- [0x8f0b, 0x8f0b], /* CJK Ideograph */
- [0x8f0c, 0x8f0c], /* CJK Ideograph */
- [0x8f0d, 0x8f0d], /* CJK Ideograph */
- [0x8f0e, 0x8f0e], /* CJK Ideograph */
- [0x8f0f, 0x8f0f], /* CJK Ideograph */
- [0x8f10, 0x8f10], /* CJK Ideograph */
- [0x8f11, 0x8f11], /* CJK Ideograph */
- [0x8f12, 0x8f12], /* CJK Ideograph */
- [0x8f13, 0x8f13], /* CJK Ideograph */
- [0x8f14, 0x8f14], /* CJK Ideograph */
- [0x8f15, 0x8f15], /* CJK Ideograph */
- [0x8f16, 0x8f16], /* CJK Ideograph */
- [0x8f17, 0x8f17], /* CJK Ideograph */
- [0x8f18, 0x8f18], /* CJK Ideograph */
- [0x8f19, 0x8f19], /* CJK Ideograph */
- [0x8f1a, 0x8f1a], /* CJK Ideograph */
- [0x8f1b, 0x8f1b], /* CJK Ideograph */
- [0x8f1c, 0x8f1c], /* CJK Ideograph */
- [0x8f1d, 0x8f1d], /* CJK Ideograph */
- [0x8f1e, 0x8f1e], /* CJK Ideograph */
- [0x8f1f, 0x8f1f], /* CJK Ideograph */
- [0x8f20, 0x8f20], /* CJK Ideograph */
- [0x8f21, 0x8f21], /* CJK Ideograph */
- [0x8f22, 0x8f22], /* CJK Ideograph */
- [0x8f23, 0x8f23], /* CJK Ideograph */
- [0x8f24, 0x8f24], /* CJK Ideograph */
- [0x8f25, 0x8f25], /* CJK Ideograph */
- [0x8f26, 0x8f26], /* CJK Ideograph */
- [0x8f27, 0x8f27], /* CJK Ideograph */
- [0x8f28, 0x8f28], /* CJK Ideograph */
- [0x8f29, 0x8f29], /* CJK Ideograph */
- [0x8f2a, 0x8f2a], /* CJK Ideograph */
- [0x8f2b, 0x8f2b], /* CJK Ideograph */
- [0x8f2c, 0x8f2c], /* CJK Ideograph */
- [0x8f2d, 0x8f2d], /* CJK Ideograph */
- [0x8f2e, 0x8f2e], /* CJK Ideograph */
- [0x8f2f, 0x8f2f], /* CJK Ideograph */
- [0x8f30, 0x8f30], /* CJK Ideograph */
- [0x8f31, 0x8f31], /* CJK Ideograph */
- [0x8f32, 0x8f32], /* CJK Ideograph */
- [0x8f33, 0x8f33], /* CJK Ideograph */
- [0x8f34, 0x8f34], /* CJK Ideograph */
- [0x8f35, 0x8f35], /* CJK Ideograph */
- [0x8f36, 0x8f36], /* CJK Ideograph */
- [0x8f37, 0x8f37], /* CJK Ideograph */
- [0x8f38, 0x8f38], /* CJK Ideograph */
- [0x8f39, 0x8f39], /* CJK Ideograph */
- [0x8f3a, 0x8f3a], /* CJK Ideograph */
- [0x8f3b, 0x8f3b], /* CJK Ideograph */
- [0x8f3c, 0x8f3c], /* CJK Ideograph */
- [0x8f3d, 0x8f3d], /* CJK Ideograph */
- [0x8f3e, 0x8f3e], /* CJK Ideograph */
- [0x8f3f, 0x8f3f], /* CJK Ideograph */
- [0x8f40, 0x8f40], /* CJK Ideograph */
- [0x8f41, 0x8f41], /* CJK Ideograph */
- [0x8f42, 0x8f42], /* CJK Ideograph */
- [0x8f43, 0x8f43], /* CJK Ideograph */
- [0x8f44, 0x8f44], /* CJK Ideograph */
- [0x8f45, 0x8f45], /* CJK Ideograph */
- [0x8f46, 0x8f46], /* CJK Ideograph */
- [0x8f47, 0x8f47], /* CJK Ideograph */
- [0x8f48, 0x8f48], /* CJK Ideograph */
- [0x8f49, 0x8f49], /* CJK Ideograph */
- [0x8f4a, 0x8f4a], /* CJK Ideograph */
- [0x8f4b, 0x8f4b], /* CJK Ideograph */
- [0x8f4c, 0x8f4c], /* CJK Ideograph */
- [0x8f4d, 0x8f4d], /* CJK Ideograph */
- [0x8f4e, 0x8f4e], /* CJK Ideograph */
- [0x8f4f, 0x8f4f], /* CJK Ideograph */
- [0x8f50, 0x8f50], /* CJK Ideograph */
- [0x8f51, 0x8f51], /* CJK Ideograph */
- [0x8f52, 0x8f52], /* CJK Ideograph */
- [0x8f53, 0x8f53], /* CJK Ideograph */
- [0x8f54, 0x8f54], /* CJK Ideograph */
- [0x8f55, 0x8f55], /* CJK Ideograph */
- [0x8f56, 0x8f56], /* CJK Ideograph */
- [0x8f57, 0x8f57], /* CJK Ideograph */
- [0x8f58, 0x8f58], /* CJK Ideograph */
- [0x8f59, 0x8f59], /* CJK Ideograph */
- [0x8f5a, 0x8f5a], /* CJK Ideograph */
- [0x8f5b, 0x8f5b], /* CJK Ideograph */
- [0x8f5c, 0x8f5c], /* CJK Ideograph */
- [0x8f5d, 0x8f5d], /* CJK Ideograph */
- [0x8f5e, 0x8f5e], /* CJK Ideograph */
- [0x8f5f, 0x8f5f], /* CJK Ideograph */
- [0x8f60, 0x8f60], /* CJK Ideograph */
- [0x8f61, 0x8f61], /* CJK Ideograph */
- [0x8f62, 0x8f62], /* CJK Ideograph */
- [0x8f63, 0x8f63], /* CJK Ideograph */
- [0x8f64, 0x8f64], /* CJK Ideograph */
- [0x8f65, 0x8f65], /* CJK Ideograph */
- [0x8f66, 0x8f66], /* CJK Ideograph */
- [0x8f67, 0x8f67], /* CJK Ideograph */
- [0x8f68, 0x8f68], /* CJK Ideograph */
- [0x8f69, 0x8f69], /* CJK Ideograph */
- [0x8f6a, 0x8f6a], /* CJK Ideograph */
- [0x8f6b, 0x8f6b], /* CJK Ideograph */
- [0x8f6c, 0x8f6c], /* CJK Ideograph */
- [0x8f6d, 0x8f6d], /* CJK Ideograph */
- [0x8f6e, 0x8f6e], /* CJK Ideograph */
- [0x8f6f, 0x8f6f], /* CJK Ideograph */
- [0x8f70, 0x8f70], /* CJK Ideograph */
- [0x8f71, 0x8f71], /* CJK Ideograph */
- [0x8f72, 0x8f72], /* CJK Ideograph */
- [0x8f73, 0x8f73], /* CJK Ideograph */
- [0x8f74, 0x8f74], /* CJK Ideograph */
- [0x8f75, 0x8f75], /* CJK Ideograph */
- [0x8f76, 0x8f76], /* CJK Ideograph */
- [0x8f77, 0x8f77], /* CJK Ideograph */
- [0x8f78, 0x8f78], /* CJK Ideograph */
- [0x8f79, 0x8f79], /* CJK Ideograph */
- [0x8f7a, 0x8f7a], /* CJK Ideograph */
- [0x8f7b, 0x8f7b], /* CJK Ideograph */
- [0x8f7c, 0x8f7c], /* CJK Ideograph */
- [0x8f7d, 0x8f7d], /* CJK Ideograph */
- [0x8f7e, 0x8f7e], /* CJK Ideograph */
- [0x8f7f, 0x8f7f], /* CJK Ideograph */
- [0x8f80, 0x8f80], /* CJK Ideograph */
- [0x8f81, 0x8f81], /* CJK Ideograph */
- [0x8f82, 0x8f82], /* CJK Ideograph */
- [0x8f83, 0x8f83], /* CJK Ideograph */
- [0x8f84, 0x8f84], /* CJK Ideograph */
- [0x8f85, 0x8f85], /* CJK Ideograph */
- [0x8f86, 0x8f86], /* CJK Ideograph */
- [0x8f87, 0x8f87], /* CJK Ideograph */
- [0x8f88, 0x8f88], /* CJK Ideograph */
- [0x8f89, 0x8f89], /* CJK Ideograph */
- [0x8f8a, 0x8f8a], /* CJK Ideograph */
- [0x8f8b, 0x8f8b], /* CJK Ideograph */
- [0x8f8c, 0x8f8c], /* CJK Ideograph */
- [0x8f8d, 0x8f8d], /* CJK Ideograph */
- [0x8f8e, 0x8f8e], /* CJK Ideograph */
- [0x8f8f, 0x8f8f], /* CJK Ideograph */
- [0x8f90, 0x8f90], /* CJK Ideograph */
- [0x8f91, 0x8f91], /* CJK Ideograph */
- [0x8f92, 0x8f92], /* CJK Ideograph */
- [0x8f93, 0x8f93], /* CJK Ideograph */
- [0x8f94, 0x8f94], /* CJK Ideograph */
- [0x8f95, 0x8f95], /* CJK Ideograph */
- [0x8f96, 0x8f96], /* CJK Ideograph */
- [0x8f97, 0x8f97], /* CJK Ideograph */
- [0x8f98, 0x8f98], /* CJK Ideograph */
- [0x8f99, 0x8f99], /* CJK Ideograph */
- [0x8f9a, 0x8f9a], /* CJK Ideograph */
- [0x8f9b, 0x8f9b], /* CJK Ideograph */
- [0x8f9c, 0x8f9c], /* CJK Ideograph */
- [0x8f9d, 0x8f9d], /* CJK Ideograph */
- [0x8f9e, 0x8f9e], /* CJK Ideograph */
- [0x8f9f, 0x8f9f], /* CJK Ideograph */
- [0x8fa0, 0x8fa0], /* CJK Ideograph */
- [0x8fa1, 0x8fa1], /* CJK Ideograph */
- [0x8fa2, 0x8fa2], /* CJK Ideograph */
- [0x8fa3, 0x8fa3], /* CJK Ideograph */
- [0x8fa4, 0x8fa4], /* CJK Ideograph */
- [0x8fa5, 0x8fa5], /* CJK Ideograph */
- [0x8fa6, 0x8fa6], /* CJK Ideograph */
- [0x8fa7, 0x8fa7], /* CJK Ideograph */
- [0x8fa8, 0x8fa8], /* CJK Ideograph */
- [0x8fa9, 0x8fa9], /* CJK Ideograph */
- [0x8faa, 0x8faa], /* CJK Ideograph */
- [0x8fab, 0x8fab], /* CJK Ideograph */
- [0x8fac, 0x8fac], /* CJK Ideograph */
- [0x8fad, 0x8fad], /* CJK Ideograph */
- [0x8fae, 0x8fae], /* CJK Ideograph */
- [0x8faf, 0x8faf], /* CJK Ideograph */
- [0x8fb0, 0x8fb0], /* CJK Ideograph */
- [0x8fb1, 0x8fb1], /* CJK Ideograph */
- [0x8fb2, 0x8fb2], /* CJK Ideograph */
- [0x8fb3, 0x8fb3], /* CJK Ideograph */
- [0x8fb4, 0x8fb4], /* CJK Ideograph */
- [0x8fb5, 0x8fb5], /* CJK Ideograph */
- [0x8fb6, 0x8fb6], /* CJK Ideograph */
- [0x8fb7, 0x8fb7], /* CJK Ideograph */
- [0x8fb8, 0x8fb8], /* CJK Ideograph */
- [0x8fb9, 0x8fb9], /* CJK Ideograph */
- [0x8fba, 0x8fba], /* CJK Ideograph */
- [0x8fbb, 0x8fbb], /* CJK Ideograph */
- [0x8fbc, 0x8fbc], /* CJK Ideograph */
- [0x8fbd, 0x8fbd], /* CJK Ideograph */
- [0x8fbe, 0x8fbe], /* CJK Ideograph */
- [0x8fbf, 0x8fbf], /* CJK Ideograph */
- [0x8fc0, 0x8fc0], /* CJK Ideograph */
- [0x8fc1, 0x8fc1], /* CJK Ideograph */
- [0x8fc2, 0x8fc2], /* CJK Ideograph */
- [0x8fc3, 0x8fc3], /* CJK Ideograph */
- [0x8fc4, 0x8fc4], /* CJK Ideograph */
- [0x8fc5, 0x8fc5], /* CJK Ideograph */
- [0x8fc6, 0x8fc6], /* CJK Ideograph */
- [0x8fc7, 0x8fc7], /* CJK Ideograph */
- [0x8fc8, 0x8fc8], /* CJK Ideograph */
- [0x8fc9, 0x8fc9], /* CJK Ideograph */
- [0x8fca, 0x8fca], /* CJK Ideograph */
- [0x8fcb, 0x8fcb], /* CJK Ideograph */
- [0x8fcc, 0x8fcc], /* CJK Ideograph */
- [0x8fcd, 0x8fcd], /* CJK Ideograph */
- [0x8fce, 0x8fce], /* CJK Ideograph */
- [0x8fcf, 0x8fcf], /* CJK Ideograph */
- [0x8fd0, 0x8fd0], /* CJK Ideograph */
- [0x8fd1, 0x8fd1], /* CJK Ideograph */
- [0x8fd2, 0x8fd2], /* CJK Ideograph */
- [0x8fd3, 0x8fd3], /* CJK Ideograph */
- [0x8fd4, 0x8fd4], /* CJK Ideograph */
- [0x8fd5, 0x8fd5], /* CJK Ideograph */
- [0x8fd6, 0x8fd6], /* CJK Ideograph */
- [0x8fd7, 0x8fd7], /* CJK Ideograph */
- [0x8fd8, 0x8fd8], /* CJK Ideograph */
- [0x8fd9, 0x8fd9], /* CJK Ideograph */
- [0x8fda, 0x8fda], /* CJK Ideograph */
- [0x8fdb, 0x8fdb], /* CJK Ideograph */
- [0x8fdc, 0x8fdc], /* CJK Ideograph */
- [0x8fdd, 0x8fdd], /* CJK Ideograph */
- [0x8fde, 0x8fde], /* CJK Ideograph */
- [0x8fdf, 0x8fdf], /* CJK Ideograph */
- [0x8fe0, 0x8fe0], /* CJK Ideograph */
- [0x8fe1, 0x8fe1], /* CJK Ideograph */
- [0x8fe2, 0x8fe2], /* CJK Ideograph */
- [0x8fe3, 0x8fe3], /* CJK Ideograph */
- [0x8fe4, 0x8fe4], /* CJK Ideograph */
- [0x8fe5, 0x8fe5], /* CJK Ideograph */
- [0x8fe6, 0x8fe6], /* CJK Ideograph */
- [0x8fe7, 0x8fe7], /* CJK Ideograph */
- [0x8fe8, 0x8fe8], /* CJK Ideograph */
- [0x8fe9, 0x8fe9], /* CJK Ideograph */
- [0x8fea, 0x8fea], /* CJK Ideograph */
- [0x8feb, 0x8feb], /* CJK Ideograph */
- [0x8fec, 0x8fec], /* CJK Ideograph */
- [0x8fed, 0x8fed], /* CJK Ideograph */
- [0x8fee, 0x8fee], /* CJK Ideograph */
- [0x8fef, 0x8fef], /* CJK Ideograph */
- [0x8ff0, 0x8ff0], /* CJK Ideograph */
- [0x8ff1, 0x8ff1], /* CJK Ideograph */
- [0x8ff2, 0x8ff2], /* CJK Ideograph */
- [0x8ff3, 0x8ff3], /* CJK Ideograph */
- [0x8ff4, 0x8ff4], /* CJK Ideograph */
- [0x8ff5, 0x8ff5], /* CJK Ideograph */
- [0x8ff6, 0x8ff6], /* CJK Ideograph */
- [0x8ff7, 0x8ff7], /* CJK Ideograph */
- [0x8ff8, 0x8ff8], /* CJK Ideograph */
- [0x8ff9, 0x8ff9], /* CJK Ideograph */
- [0x8ffa, 0x8ffa], /* CJK Ideograph */
- [0x8ffb, 0x8ffb], /* CJK Ideograph */
- [0x8ffc, 0x8ffc], /* CJK Ideograph */
- [0x8ffd, 0x8ffd], /* CJK Ideograph */
- [0x8ffe, 0x8ffe], /* CJK Ideograph */
- [0x8fff, 0x8fff], /* CJK Ideograph */
- [0x9000, 0x9000], /* CJK Ideograph */
- [0x9001, 0x9001], /* CJK Ideograph */
- [0x9002, 0x9002], /* CJK Ideograph */
- [0x9003, 0x9003], /* CJK Ideograph */
- [0x9004, 0x9004], /* CJK Ideograph */
- [0x9005, 0x9005], /* CJK Ideograph */
- [0x9006, 0x9006], /* CJK Ideograph */
- [0x9007, 0x9007], /* CJK Ideograph */
- [0x9008, 0x9008], /* CJK Ideograph */
- [0x9009, 0x9009], /* CJK Ideograph */
- [0x900a, 0x900a], /* CJK Ideograph */
- [0x900b, 0x900b], /* CJK Ideograph */
- [0x900c, 0x900c], /* CJK Ideograph */
- [0x900d, 0x900d], /* CJK Ideograph */
- [0x900e, 0x900e], /* CJK Ideograph */
- [0x900f, 0x900f], /* CJK Ideograph */
- [0x9010, 0x9010], /* CJK Ideograph */
- [0x9011, 0x9011], /* CJK Ideograph */
- [0x9012, 0x9012], /* CJK Ideograph */
- [0x9013, 0x9013], /* CJK Ideograph */
- [0x9014, 0x9014], /* CJK Ideograph */
- [0x9015, 0x9015], /* CJK Ideograph */
- [0x9016, 0x9016], /* CJK Ideograph */
- [0x9017, 0x9017], /* CJK Ideograph */
- [0x9018, 0x9018], /* CJK Ideograph */
- [0x9019, 0x9019], /* CJK Ideograph */
- [0x901a, 0x901a], /* CJK Ideograph */
- [0x901b, 0x901b], /* CJK Ideograph */
- [0x901c, 0x901c], /* CJK Ideograph */
- [0x901d, 0x901d], /* CJK Ideograph */
- [0x901e, 0x901e], /* CJK Ideograph */
- [0x901f, 0x901f], /* CJK Ideograph */
- [0x9020, 0x9020], /* CJK Ideograph */
- [0x9021, 0x9021], /* CJK Ideograph */
- [0x9022, 0x9022], /* CJK Ideograph */
- [0x9023, 0x9023], /* CJK Ideograph */
- [0x9024, 0x9024], /* CJK Ideograph */
- [0x9025, 0x9025], /* CJK Ideograph */
- [0x9026, 0x9026], /* CJK Ideograph */
- [0x9027, 0x9027], /* CJK Ideograph */
- [0x9028, 0x9028], /* CJK Ideograph */
- [0x9029, 0x9029], /* CJK Ideograph */
- [0x902a, 0x902a], /* CJK Ideograph */
- [0x902b, 0x902b], /* CJK Ideograph */
- [0x902c, 0x902c], /* CJK Ideograph */
- [0x902d, 0x902d], /* CJK Ideograph */
- [0x902e, 0x902e], /* CJK Ideograph */
- [0x902f, 0x902f], /* CJK Ideograph */
- [0x9030, 0x9030], /* CJK Ideograph */
- [0x9031, 0x9031], /* CJK Ideograph */
- [0x9032, 0x9032], /* CJK Ideograph */
- [0x9033, 0x9033], /* CJK Ideograph */
- [0x9034, 0x9034], /* CJK Ideograph */
- [0x9035, 0x9035], /* CJK Ideograph */
- [0x9036, 0x9036], /* CJK Ideograph */
- [0x9037, 0x9037], /* CJK Ideograph */
- [0x9038, 0x9038], /* CJK Ideograph */
- [0x9039, 0x9039], /* CJK Ideograph */
- [0x903a, 0x903a], /* CJK Ideograph */
- [0x903b, 0x903b], /* CJK Ideograph */
- [0x903c, 0x903c], /* CJK Ideograph */
- [0x903d, 0x903d], /* CJK Ideograph */
- [0x903e, 0x903e], /* CJK Ideograph */
- [0x903f, 0x903f], /* CJK Ideograph */
- [0x9040, 0x9040], /* CJK Ideograph */
- [0x9041, 0x9041], /* CJK Ideograph */
- [0x9042, 0x9042], /* CJK Ideograph */
- [0x9043, 0x9043], /* CJK Ideograph */
- [0x9044, 0x9044], /* CJK Ideograph */
- [0x9045, 0x9045], /* CJK Ideograph */
- [0x9046, 0x9046], /* CJK Ideograph */
- [0x9047, 0x9047], /* CJK Ideograph */
- [0x9048, 0x9048], /* CJK Ideograph */
- [0x9049, 0x9049], /* CJK Ideograph */
- [0x904a, 0x904a], /* CJK Ideograph */
- [0x904b, 0x904b], /* CJK Ideograph */
- [0x904c, 0x904c], /* CJK Ideograph */
- [0x904d, 0x904d], /* CJK Ideograph */
- [0x904e, 0x904e], /* CJK Ideograph */
- [0x904f, 0x904f], /* CJK Ideograph */
- [0x9050, 0x9050], /* CJK Ideograph */
- [0x9051, 0x9051], /* CJK Ideograph */
- [0x9052, 0x9052], /* CJK Ideograph */
- [0x9053, 0x9053], /* CJK Ideograph */
- [0x9054, 0x9054], /* CJK Ideograph */
- [0x9055, 0x9055], /* CJK Ideograph */
- [0x9056, 0x9056], /* CJK Ideograph */
- [0x9057, 0x9057], /* CJK Ideograph */
- [0x9058, 0x9058], /* CJK Ideograph */
- [0x9059, 0x9059], /* CJK Ideograph */
- [0x905a, 0x905a], /* CJK Ideograph */
- [0x905b, 0x905b], /* CJK Ideograph */
- [0x905c, 0x905c], /* CJK Ideograph */
- [0x905d, 0x905d], /* CJK Ideograph */
- [0x905e, 0x905e], /* CJK Ideograph */
- [0x905f, 0x905f], /* CJK Ideograph */
- [0x9060, 0x9060], /* CJK Ideograph */
- [0x9061, 0x9061], /* CJK Ideograph */
- [0x9062, 0x9062], /* CJK Ideograph */
- [0x9063, 0x9063], /* CJK Ideograph */
- [0x9064, 0x9064], /* CJK Ideograph */
- [0x9065, 0x9065], /* CJK Ideograph */
- [0x9066, 0x9066], /* CJK Ideograph */
- [0x9067, 0x9067], /* CJK Ideograph */
- [0x9068, 0x9068], /* CJK Ideograph */
- [0x9069, 0x9069], /* CJK Ideograph */
- [0x906a, 0x906a], /* CJK Ideograph */
- [0x906b, 0x906b], /* CJK Ideograph */
- [0x906c, 0x906c], /* CJK Ideograph */
- [0x906d, 0x906d], /* CJK Ideograph */
- [0x906e, 0x906e], /* CJK Ideograph */
- [0x906f, 0x906f], /* CJK Ideograph */
- [0x9070, 0x9070], /* CJK Ideograph */
- [0x9071, 0x9071], /* CJK Ideograph */
- [0x9072, 0x9072], /* CJK Ideograph */
- [0x9073, 0x9073], /* CJK Ideograph */
- [0x9074, 0x9074], /* CJK Ideograph */
- [0x9075, 0x9075], /* CJK Ideograph */
- [0x9076, 0x9076], /* CJK Ideograph */
- [0x9077, 0x9077], /* CJK Ideograph */
- [0x9078, 0x9078], /* CJK Ideograph */
- [0x9079, 0x9079], /* CJK Ideograph */
- [0x907a, 0x907a], /* CJK Ideograph */
- [0x907b, 0x907b], /* CJK Ideograph */
- [0x907c, 0x907c], /* CJK Ideograph */
- [0x907d, 0x907d], /* CJK Ideograph */
- [0x907e, 0x907e], /* CJK Ideograph */
- [0x907f, 0x907f], /* CJK Ideograph */
- [0x9080, 0x9080], /* CJK Ideograph */
- [0x9081, 0x9081], /* CJK Ideograph */
- [0x9082, 0x9082], /* CJK Ideograph */
- [0x9083, 0x9083], /* CJK Ideograph */
- [0x9084, 0x9084], /* CJK Ideograph */
- [0x9085, 0x9085], /* CJK Ideograph */
- [0x9086, 0x9086], /* CJK Ideograph */
- [0x9087, 0x9087], /* CJK Ideograph */
- [0x9088, 0x9088], /* CJK Ideograph */
- [0x9089, 0x9089], /* CJK Ideograph */
- [0x908a, 0x908a], /* CJK Ideograph */
- [0x908b, 0x908b], /* CJK Ideograph */
- [0x908c, 0x908c], /* CJK Ideograph */
- [0x908d, 0x908d], /* CJK Ideograph */
- [0x908e, 0x908e], /* CJK Ideograph */
- [0x908f, 0x908f], /* CJK Ideograph */
- [0x9090, 0x9090], /* CJK Ideograph */
- [0x9091, 0x9091], /* CJK Ideograph */
- [0x9092, 0x9092], /* CJK Ideograph */
- [0x9093, 0x9093], /* CJK Ideograph */
- [0x9094, 0x9094], /* CJK Ideograph */
- [0x9095, 0x9095], /* CJK Ideograph */
- [0x9096, 0x9096], /* CJK Ideograph */
- [0x9097, 0x9097], /* CJK Ideograph */
- [0x9098, 0x9098], /* CJK Ideograph */
- [0x9099, 0x9099], /* CJK Ideograph */
- [0x909a, 0x909a], /* CJK Ideograph */
- [0x909b, 0x909b], /* CJK Ideograph */
- [0x909c, 0x909c], /* CJK Ideograph */
- [0x909d, 0x909d], /* CJK Ideograph */
- [0x909e, 0x909e], /* CJK Ideograph */
- [0x909f, 0x909f], /* CJK Ideograph */
- [0x90a0, 0x90a0], /* CJK Ideograph */
- [0x90a1, 0x90a1], /* CJK Ideograph */
- [0x90a2, 0x90a2], /* CJK Ideograph */
- [0x90a3, 0x90a3], /* CJK Ideograph */
- [0x90a4, 0x90a4], /* CJK Ideograph */
- [0x90a5, 0x90a5], /* CJK Ideograph */
- [0x90a6, 0x90a6], /* CJK Ideograph */
- [0x90a7, 0x90a7], /* CJK Ideograph */
- [0x90a8, 0x90a8], /* CJK Ideograph */
- [0x90a9, 0x90a9], /* CJK Ideograph */
- [0x90aa, 0x90aa], /* CJK Ideograph */
- [0x90ab, 0x90ab], /* CJK Ideograph */
- [0x90ac, 0x90ac], /* CJK Ideograph */
- [0x90ad, 0x90ad], /* CJK Ideograph */
- [0x90ae, 0x90ae], /* CJK Ideograph */
- [0x90af, 0x90af], /* CJK Ideograph */
- [0x90b0, 0x90b0], /* CJK Ideograph */
- [0x90b1, 0x90b1], /* CJK Ideograph */
- [0x90b2, 0x90b2], /* CJK Ideograph */
- [0x90b3, 0x90b3], /* CJK Ideograph */
- [0x90b4, 0x90b4], /* CJK Ideograph */
- [0x90b5, 0x90b5], /* CJK Ideograph */
- [0x90b6, 0x90b6], /* CJK Ideograph */
- [0x90b7, 0x90b7], /* CJK Ideograph */
- [0x90b8, 0x90b8], /* CJK Ideograph */
- [0x90b9, 0x90b9], /* CJK Ideograph */
- [0x90ba, 0x90ba], /* CJK Ideograph */
- [0x90bb, 0x90bb], /* CJK Ideograph */
- [0x90bc, 0x90bc], /* CJK Ideograph */
- [0x90bd, 0x90bd], /* CJK Ideograph */
- [0x90be, 0x90be], /* CJK Ideograph */
- [0x90bf, 0x90bf], /* CJK Ideograph */
- [0x90c0, 0x90c0], /* CJK Ideograph */
- [0x90c1, 0x90c1], /* CJK Ideograph */
- [0x90c2, 0x90c2], /* CJK Ideograph */
- [0x90c3, 0x90c3], /* CJK Ideograph */
- [0x90c4, 0x90c4], /* CJK Ideograph */
- [0x90c5, 0x90c5], /* CJK Ideograph */
- [0x90c6, 0x90c6], /* CJK Ideograph */
- [0x90c7, 0x90c7], /* CJK Ideograph */
- [0x90c8, 0x90c8], /* CJK Ideograph */
- [0x90c9, 0x90c9], /* CJK Ideograph */
- [0x90ca, 0x90ca], /* CJK Ideograph */
- [0x90cb, 0x90cb], /* CJK Ideograph */
- [0x90cc, 0x90cc], /* CJK Ideograph */
- [0x90cd, 0x90cd], /* CJK Ideograph */
- [0x90ce, 0x90ce], /* CJK Ideograph */
- [0x90cf, 0x90cf], /* CJK Ideograph */
- [0x90d0, 0x90d0], /* CJK Ideograph */
- [0x90d1, 0x90d1], /* CJK Ideograph */
- [0x90d2, 0x90d2], /* CJK Ideograph */
- [0x90d3, 0x90d3], /* CJK Ideograph */
- [0x90d4, 0x90d4], /* CJK Ideograph */
- [0x90d5, 0x90d5], /* CJK Ideograph */
- [0x90d6, 0x90d6], /* CJK Ideograph */
- [0x90d7, 0x90d7], /* CJK Ideograph */
- [0x90d8, 0x90d8], /* CJK Ideograph */
- [0x90d9, 0x90d9], /* CJK Ideograph */
- [0x90da, 0x90da], /* CJK Ideograph */
- [0x90db, 0x90db], /* CJK Ideograph */
- [0x90dc, 0x90dc], /* CJK Ideograph */
- [0x90dd, 0x90dd], /* CJK Ideograph */
- [0x90de, 0x90de], /* CJK Ideograph */
- [0x90df, 0x90df], /* CJK Ideograph */
- [0x90e0, 0x90e0], /* CJK Ideograph */
- [0x90e1, 0x90e1], /* CJK Ideograph */
- [0x90e2, 0x90e2], /* CJK Ideograph */
- [0x90e3, 0x90e3], /* CJK Ideograph */
- [0x90e4, 0x90e4], /* CJK Ideograph */
- [0x90e5, 0x90e5], /* CJK Ideograph */
- [0x90e6, 0x90e6], /* CJK Ideograph */
- [0x90e7, 0x90e7], /* CJK Ideograph */
- [0x90e8, 0x90e8], /* CJK Ideograph */
- [0x90e9, 0x90e9], /* CJK Ideograph */
- [0x90ea, 0x90ea], /* CJK Ideograph */
- [0x90eb, 0x90eb], /* CJK Ideograph */
- [0x90ec, 0x90ec], /* CJK Ideograph */
- [0x90ed, 0x90ed], /* CJK Ideograph */
- [0x90ee, 0x90ee], /* CJK Ideograph */
- [0x90ef, 0x90ef], /* CJK Ideograph */
- [0x90f0, 0x90f0], /* CJK Ideograph */
- [0x90f1, 0x90f1], /* CJK Ideograph */
- [0x90f2, 0x90f2], /* CJK Ideograph */
- [0x90f3, 0x90f3], /* CJK Ideograph */
- [0x90f4, 0x90f4], /* CJK Ideograph */
- [0x90f5, 0x90f5], /* CJK Ideograph */
- [0x90f6, 0x90f6], /* CJK Ideograph */
- [0x90f7, 0x90f7], /* CJK Ideograph */
- [0x90f8, 0x90f8], /* CJK Ideograph */
- [0x90f9, 0x90f9], /* CJK Ideograph */
- [0x90fa, 0x90fa], /* CJK Ideograph */
- [0x90fb, 0x90fb], /* CJK Ideograph */
- [0x90fc, 0x90fc], /* CJK Ideograph */
- [0x90fd, 0x90fd], /* CJK Ideograph */
- [0x90fe, 0x90fe], /* CJK Ideograph */
- [0x90ff, 0x90ff], /* CJK Ideograph */
- [0x9100, 0x9100], /* CJK Ideograph */
- [0x9101, 0x9101], /* CJK Ideograph */
- [0x9102, 0x9102], /* CJK Ideograph */
- [0x9103, 0x9103], /* CJK Ideograph */
- [0x9104, 0x9104], /* CJK Ideograph */
- [0x9105, 0x9105], /* CJK Ideograph */
- [0x9106, 0x9106], /* CJK Ideograph */
- [0x9107, 0x9107], /* CJK Ideograph */
- [0x9108, 0x9108], /* CJK Ideograph */
- [0x9109, 0x9109], /* CJK Ideograph */
- [0x910a, 0x910a], /* CJK Ideograph */
- [0x910b, 0x910b], /* CJK Ideograph */
- [0x910c, 0x910c], /* CJK Ideograph */
- [0x910d, 0x910d], /* CJK Ideograph */
- [0x910e, 0x910e], /* CJK Ideograph */
- [0x910f, 0x910f], /* CJK Ideograph */
- [0x9110, 0x9110], /* CJK Ideograph */
- [0x9111, 0x9111], /* CJK Ideograph */
- [0x9112, 0x9112], /* CJK Ideograph */
- [0x9113, 0x9113], /* CJK Ideograph */
- [0x9114, 0x9114], /* CJK Ideograph */
- [0x9115, 0x9115], /* CJK Ideograph */
- [0x9116, 0x9116], /* CJK Ideograph */
- [0x9117, 0x9117], /* CJK Ideograph */
- [0x9118, 0x9118], /* CJK Ideograph */
- [0x9119, 0x9119], /* CJK Ideograph */
- [0x911a, 0x911a], /* CJK Ideograph */
- [0x911b, 0x911b], /* CJK Ideograph */
- [0x911c, 0x911c], /* CJK Ideograph */
- [0x911d, 0x911d], /* CJK Ideograph */
- [0x911e, 0x911e], /* CJK Ideograph */
- [0x911f, 0x911f], /* CJK Ideograph */
- [0x9120, 0x9120], /* CJK Ideograph */
- [0x9121, 0x9121], /* CJK Ideograph */
- [0x9122, 0x9122], /* CJK Ideograph */
- [0x9123, 0x9123], /* CJK Ideograph */
- [0x9124, 0x9124], /* CJK Ideograph */
- [0x9125, 0x9125], /* CJK Ideograph */
- [0x9126, 0x9126], /* CJK Ideograph */
- [0x9127, 0x9127], /* CJK Ideograph */
- [0x9128, 0x9128], /* CJK Ideograph */
- [0x9129, 0x9129], /* CJK Ideograph */
- [0x912a, 0x912a], /* CJK Ideograph */
- [0x912b, 0x912b], /* CJK Ideograph */
- [0x912c, 0x912c], /* CJK Ideograph */
- [0x912d, 0x912d], /* CJK Ideograph */
- [0x912e, 0x912e], /* CJK Ideograph */
- [0x912f, 0x912f], /* CJK Ideograph */
- [0x9130, 0x9130], /* CJK Ideograph */
- [0x9131, 0x9131], /* CJK Ideograph */
- [0x9132, 0x9132], /* CJK Ideograph */
- [0x9133, 0x9133], /* CJK Ideograph */
- [0x9134, 0x9134], /* CJK Ideograph */
- [0x9135, 0x9135], /* CJK Ideograph */
- [0x9136, 0x9136], /* CJK Ideograph */
- [0x9137, 0x9137], /* CJK Ideograph */
- [0x9138, 0x9138], /* CJK Ideograph */
- [0x9139, 0x9139], /* CJK Ideograph */
- [0x913a, 0x913a], /* CJK Ideograph */
- [0x913b, 0x913b], /* CJK Ideograph */
- [0x913c, 0x913c], /* CJK Ideograph */
- [0x913d, 0x913d], /* CJK Ideograph */
- [0x913e, 0x913e], /* CJK Ideograph */
- [0x913f, 0x913f], /* CJK Ideograph */
- [0x9140, 0x9140], /* CJK Ideograph */
- [0x9141, 0x9141], /* CJK Ideograph */
- [0x9142, 0x9142], /* CJK Ideograph */
- [0x9143, 0x9143], /* CJK Ideograph */
- [0x9144, 0x9144], /* CJK Ideograph */
- [0x9145, 0x9145], /* CJK Ideograph */
- [0x9146, 0x9146], /* CJK Ideograph */
- [0x9147, 0x9147], /* CJK Ideograph */
- [0x9148, 0x9148], /* CJK Ideograph */
- [0x9149, 0x9149], /* CJK Ideograph */
- [0x914a, 0x914a], /* CJK Ideograph */
- [0x914b, 0x914b], /* CJK Ideograph */
- [0x914c, 0x914c], /* CJK Ideograph */
- [0x914d, 0x914d], /* CJK Ideograph */
- [0x914e, 0x914e], /* CJK Ideograph */
- [0x914f, 0x914f], /* CJK Ideograph */
- [0x9150, 0x9150], /* CJK Ideograph */
- [0x9151, 0x9151], /* CJK Ideograph */
- [0x9152, 0x9152], /* CJK Ideograph */
- [0x9153, 0x9153], /* CJK Ideograph */
- [0x9154, 0x9154], /* CJK Ideograph */
- [0x9155, 0x9155], /* CJK Ideograph */
- [0x9156, 0x9156], /* CJK Ideograph */
- [0x9157, 0x9157], /* CJK Ideograph */
- [0x9158, 0x9158], /* CJK Ideograph */
- [0x9159, 0x9159], /* CJK Ideograph */
- [0x915a, 0x915a], /* CJK Ideograph */
- [0x915b, 0x915b], /* CJK Ideograph */
- [0x915c, 0x915c], /* CJK Ideograph */
- [0x915d, 0x915d], /* CJK Ideograph */
- [0x915e, 0x915e], /* CJK Ideograph */
- [0x915f, 0x915f], /* CJK Ideograph */
- [0x9160, 0x9160], /* CJK Ideograph */
- [0x9161, 0x9161], /* CJK Ideograph */
- [0x9162, 0x9162], /* CJK Ideograph */
- [0x9163, 0x9163], /* CJK Ideograph */
- [0x9164, 0x9164], /* CJK Ideograph */
- [0x9165, 0x9165], /* CJK Ideograph */
- [0x9166, 0x9166], /* CJK Ideograph */
- [0x9167, 0x9167], /* CJK Ideograph */
- [0x9168, 0x9168], /* CJK Ideograph */
- [0x9169, 0x9169], /* CJK Ideograph */
- [0x916a, 0x916a], /* CJK Ideograph */
- [0x916b, 0x916b], /* CJK Ideograph */
- [0x916c, 0x916c], /* CJK Ideograph */
- [0x916d, 0x916d], /* CJK Ideograph */
- [0x916e, 0x916e], /* CJK Ideograph */
- [0x916f, 0x916f], /* CJK Ideograph */
- [0x9170, 0x9170], /* CJK Ideograph */
- [0x9171, 0x9171], /* CJK Ideograph */
- [0x9172, 0x9172], /* CJK Ideograph */
- [0x9173, 0x9173], /* CJK Ideograph */
- [0x9174, 0x9174], /* CJK Ideograph */
- [0x9175, 0x9175], /* CJK Ideograph */
- [0x9176, 0x9176], /* CJK Ideograph */
- [0x9177, 0x9177], /* CJK Ideograph */
- [0x9178, 0x9178], /* CJK Ideograph */
- [0x9179, 0x9179], /* CJK Ideograph */
- [0x917a, 0x917a], /* CJK Ideograph */
- [0x917b, 0x917b], /* CJK Ideograph */
- [0x917c, 0x917c], /* CJK Ideograph */
- [0x917d, 0x917d], /* CJK Ideograph */
- [0x917e, 0x917e], /* CJK Ideograph */
- [0x917f, 0x917f], /* CJK Ideograph */
- [0x9180, 0x9180], /* CJK Ideograph */
- [0x9181, 0x9181], /* CJK Ideograph */
- [0x9182, 0x9182], /* CJK Ideograph */
- [0x9183, 0x9183], /* CJK Ideograph */
- [0x9184, 0x9184], /* CJK Ideograph */
- [0x9185, 0x9185], /* CJK Ideograph */
- [0x9186, 0x9186], /* CJK Ideograph */
- [0x9187, 0x9187], /* CJK Ideograph */
- [0x9188, 0x9188], /* CJK Ideograph */
- [0x9189, 0x9189], /* CJK Ideograph */
- [0x918a, 0x918a], /* CJK Ideograph */
- [0x918b, 0x918b], /* CJK Ideograph */
- [0x918c, 0x918c], /* CJK Ideograph */
- [0x918d, 0x918d], /* CJK Ideograph */
- [0x918e, 0x918e], /* CJK Ideograph */
- [0x918f, 0x918f], /* CJK Ideograph */
- [0x9190, 0x9190], /* CJK Ideograph */
- [0x9191, 0x9191], /* CJK Ideograph */
- [0x9192, 0x9192], /* CJK Ideograph */
- [0x9193, 0x9193], /* CJK Ideograph */
- [0x9194, 0x9194], /* CJK Ideograph */
- [0x9195, 0x9195], /* CJK Ideograph */
- [0x9196, 0x9196], /* CJK Ideograph */
- [0x9197, 0x9197], /* CJK Ideograph */
- [0x9198, 0x9198], /* CJK Ideograph */
- [0x9199, 0x9199], /* CJK Ideograph */
- [0x919a, 0x919a], /* CJK Ideograph */
- [0x919b, 0x919b], /* CJK Ideograph */
- [0x919c, 0x919c], /* CJK Ideograph */
- [0x919d, 0x919d], /* CJK Ideograph */
- [0x919e, 0x919e], /* CJK Ideograph */
- [0x919f, 0x919f], /* CJK Ideograph */
- [0x91a0, 0x91a0], /* CJK Ideograph */
- [0x91a1, 0x91a1], /* CJK Ideograph */
- [0x91a2, 0x91a2], /* CJK Ideograph */
- [0x91a3, 0x91a3], /* CJK Ideograph */
- [0x91a4, 0x91a4], /* CJK Ideograph */
- [0x91a5, 0x91a5], /* CJK Ideograph */
- [0x91a6, 0x91a6], /* CJK Ideograph */
- [0x91a7, 0x91a7], /* CJK Ideograph */
- [0x91a8, 0x91a8], /* CJK Ideograph */
- [0x91a9, 0x91a9], /* CJK Ideograph */
- [0x91aa, 0x91aa], /* CJK Ideograph */
- [0x91ab, 0x91ab], /* CJK Ideograph */
- [0x91ac, 0x91ac], /* CJK Ideograph */
- [0x91ad, 0x91ad], /* CJK Ideograph */
- [0x91ae, 0x91ae], /* CJK Ideograph */
- [0x91af, 0x91af], /* CJK Ideograph */
- [0x91b0, 0x91b0], /* CJK Ideograph */
- [0x91b1, 0x91b1], /* CJK Ideograph */
- [0x91b2, 0x91b2], /* CJK Ideograph */
- [0x91b3, 0x91b3], /* CJK Ideograph */
- [0x91b4, 0x91b4], /* CJK Ideograph */
- [0x91b5, 0x91b5], /* CJK Ideograph */
- [0x91b6, 0x91b6], /* CJK Ideograph */
- [0x91b7, 0x91b7], /* CJK Ideograph */
- [0x91b8, 0x91b8], /* CJK Ideograph */
- [0x91b9, 0x91b9], /* CJK Ideograph */
- [0x91ba, 0x91ba], /* CJK Ideograph */
- [0x91bb, 0x91bb], /* CJK Ideograph */
- [0x91bc, 0x91bc], /* CJK Ideograph */
- [0x91bd, 0x91bd], /* CJK Ideograph */
- [0x91be, 0x91be], /* CJK Ideograph */
- [0x91bf, 0x91bf], /* CJK Ideograph */
- [0x91c0, 0x91c0], /* CJK Ideograph */
- [0x91c1, 0x91c1], /* CJK Ideograph */
- [0x91c2, 0x91c2], /* CJK Ideograph */
- [0x91c3, 0x91c3], /* CJK Ideograph */
- [0x91c4, 0x91c4], /* CJK Ideograph */
- [0x91c5, 0x91c5], /* CJK Ideograph */
- [0x91c6, 0x91c6], /* CJK Ideograph */
- [0x91c7, 0x91c7], /* CJK Ideograph */
- [0x91c8, 0x91c8], /* CJK Ideograph */
- [0x91c9, 0x91c9], /* CJK Ideograph */
- [0x91ca, 0x91ca], /* CJK Ideograph */
- [0x91cb, 0x91cb], /* CJK Ideograph */
- [0x91cc, 0x91cc], /* CJK Ideograph */
- [0x91cd, 0x91cd], /* CJK Ideograph */
- [0x91ce, 0x91ce], /* CJK Ideograph */
- [0x91cf, 0x91cf], /* CJK Ideograph */
- [0x91d0, 0x91d0], /* CJK Ideograph */
- [0x91d1, 0x91d1], /* CJK Ideograph */
- [0x91d2, 0x91d2], /* CJK Ideograph */
- [0x91d3, 0x91d3], /* CJK Ideograph */
- [0x91d4, 0x91d4], /* CJK Ideograph */
- [0x91d5, 0x91d5], /* CJK Ideograph */
- [0x91d6, 0x91d6], /* CJK Ideograph */
- [0x91d7, 0x91d7], /* CJK Ideograph */
- [0x91d8, 0x91d8], /* CJK Ideograph */
- [0x91d9, 0x91d9], /* CJK Ideograph */
- [0x91da, 0x91da], /* CJK Ideograph */
- [0x91db, 0x91db], /* CJK Ideograph */
- [0x91dc, 0x91dc], /* CJK Ideograph */
- [0x91dd, 0x91dd], /* CJK Ideograph */
- [0x91de, 0x91de], /* CJK Ideograph */
- [0x91df, 0x91df], /* CJK Ideograph */
- [0x91e0, 0x91e0], /* CJK Ideograph */
- [0x91e1, 0x91e1], /* CJK Ideograph */
- [0x91e2, 0x91e2], /* CJK Ideograph */
- [0x91e3, 0x91e3], /* CJK Ideograph */
- [0x91e4, 0x91e4], /* CJK Ideograph */
- [0x91e5, 0x91e5], /* CJK Ideograph */
- [0x91e6, 0x91e6], /* CJK Ideograph */
- [0x91e7, 0x91e7], /* CJK Ideograph */
- [0x91e8, 0x91e8], /* CJK Ideograph */
- [0x91e9, 0x91e9], /* CJK Ideograph */
- [0x91ea, 0x91ea], /* CJK Ideograph */
- [0x91eb, 0x91eb], /* CJK Ideograph */
- [0x91ec, 0x91ec], /* CJK Ideograph */
- [0x91ed, 0x91ed], /* CJK Ideograph */
- [0x91ee, 0x91ee], /* CJK Ideograph */
- [0x91ef, 0x91ef], /* CJK Ideograph */
- [0x91f0, 0x91f0], /* CJK Ideograph */
- [0x91f1, 0x91f1], /* CJK Ideograph */
- [0x91f2, 0x91f2], /* CJK Ideograph */
- [0x91f3, 0x91f3], /* CJK Ideograph */
- [0x91f4, 0x91f4], /* CJK Ideograph */
- [0x91f5, 0x91f5], /* CJK Ideograph */
- [0x91f6, 0x91f6], /* CJK Ideograph */
- [0x91f7, 0x91f7], /* CJK Ideograph */
- [0x91f8, 0x91f8], /* CJK Ideograph */
- [0x91f9, 0x91f9], /* CJK Ideograph */
- [0x91fa, 0x91fa], /* CJK Ideograph */
- [0x91fb, 0x91fb], /* CJK Ideograph */
- [0x91fc, 0x91fc], /* CJK Ideograph */
- [0x91fd, 0x91fd], /* CJK Ideograph */
- [0x91fe, 0x91fe], /* CJK Ideograph */
- [0x91ff, 0x91ff], /* CJK Ideograph */
- [0x9200, 0x9200], /* CJK Ideograph */
- [0x9201, 0x9201], /* CJK Ideograph */
- [0x9202, 0x9202], /* CJK Ideograph */
- [0x9203, 0x9203], /* CJK Ideograph */
- [0x9204, 0x9204], /* CJK Ideograph */
- [0x9205, 0x9205], /* CJK Ideograph */
- [0x9206, 0x9206], /* CJK Ideograph */
- [0x9207, 0x9207], /* CJK Ideograph */
- [0x9208, 0x9208], /* CJK Ideograph */
- [0x9209, 0x9209], /* CJK Ideograph */
- [0x920a, 0x920a], /* CJK Ideograph */
- [0x920b, 0x920b], /* CJK Ideograph */
- [0x920c, 0x920c], /* CJK Ideograph */
- [0x920d, 0x920d], /* CJK Ideograph */
- [0x920e, 0x920e], /* CJK Ideograph */
- [0x920f, 0x920f], /* CJK Ideograph */
- [0x9210, 0x9210], /* CJK Ideograph */
- [0x9211, 0x9211], /* CJK Ideograph */
- [0x9212, 0x9212], /* CJK Ideograph */
- [0x9213, 0x9213], /* CJK Ideograph */
- [0x9214, 0x9214], /* CJK Ideograph */
- [0x9215, 0x9215], /* CJK Ideograph */
- [0x9216, 0x9216], /* CJK Ideograph */
- [0x9217, 0x9217], /* CJK Ideograph */
- [0x9218, 0x9218], /* CJK Ideograph */
- [0x9219, 0x9219], /* CJK Ideograph */
- [0x921a, 0x921a], /* CJK Ideograph */
- [0x921b, 0x921b], /* CJK Ideograph */
- [0x921c, 0x921c], /* CJK Ideograph */
- [0x921d, 0x921d], /* CJK Ideograph */
- [0x921e, 0x921e], /* CJK Ideograph */
- [0x921f, 0x921f], /* CJK Ideograph */
- [0x9220, 0x9220], /* CJK Ideograph */
- [0x9221, 0x9221], /* CJK Ideograph */
- [0x9222, 0x9222], /* CJK Ideograph */
- [0x9223, 0x9223], /* CJK Ideograph */
- [0x9224, 0x9224], /* CJK Ideograph */
- [0x9225, 0x9225], /* CJK Ideograph */
- [0x9226, 0x9226], /* CJK Ideograph */
- [0x9227, 0x9227], /* CJK Ideograph */
- [0x9228, 0x9228], /* CJK Ideograph */
- [0x9229, 0x9229], /* CJK Ideograph */
- [0x922a, 0x922a], /* CJK Ideograph */
- [0x922b, 0x922b], /* CJK Ideograph */
- [0x922c, 0x922c], /* CJK Ideograph */
- [0x922d, 0x922d], /* CJK Ideograph */
- [0x922e, 0x922e], /* CJK Ideograph */
- [0x922f, 0x922f], /* CJK Ideograph */
- [0x9230, 0x9230], /* CJK Ideograph */
- [0x9231, 0x9231], /* CJK Ideograph */
- [0x9232, 0x9232], /* CJK Ideograph */
- [0x9233, 0x9233], /* CJK Ideograph */
- [0x9234, 0x9234], /* CJK Ideograph */
- [0x9235, 0x9235], /* CJK Ideograph */
- [0x9236, 0x9236], /* CJK Ideograph */
- [0x9237, 0x9237], /* CJK Ideograph */
- [0x9238, 0x9238], /* CJK Ideograph */
- [0x9239, 0x9239], /* CJK Ideograph */
- [0x923a, 0x923a], /* CJK Ideograph */
- [0x923b, 0x923b], /* CJK Ideograph */
- [0x923c, 0x923c], /* CJK Ideograph */
- [0x923d, 0x923d], /* CJK Ideograph */
- [0x923e, 0x923e], /* CJK Ideograph */
- [0x923f, 0x923f], /* CJK Ideograph */
- [0x9240, 0x9240], /* CJK Ideograph */
- [0x9241, 0x9241], /* CJK Ideograph */
- [0x9242, 0x9242], /* CJK Ideograph */
- [0x9243, 0x9243], /* CJK Ideograph */
- [0x9244, 0x9244], /* CJK Ideograph */
- [0x9245, 0x9245], /* CJK Ideograph */
- [0x9246, 0x9246], /* CJK Ideograph */
- [0x9247, 0x9247], /* CJK Ideograph */
- [0x9248, 0x9248], /* CJK Ideograph */
- [0x9249, 0x9249], /* CJK Ideograph */
- [0x924a, 0x924a], /* CJK Ideograph */
- [0x924b, 0x924b], /* CJK Ideograph */
- [0x924c, 0x924c], /* CJK Ideograph */
- [0x924d, 0x924d], /* CJK Ideograph */
- [0x924e, 0x924e], /* CJK Ideograph */
- [0x924f, 0x924f], /* CJK Ideograph */
- [0x9250, 0x9250], /* CJK Ideograph */
- [0x9251, 0x9251], /* CJK Ideograph */
- [0x9252, 0x9252], /* CJK Ideograph */
- [0x9253, 0x9253], /* CJK Ideograph */
- [0x9254, 0x9254], /* CJK Ideograph */
- [0x9255, 0x9255], /* CJK Ideograph */
- [0x9256, 0x9256], /* CJK Ideograph */
- [0x9257, 0x9257], /* CJK Ideograph */
- [0x9258, 0x9258], /* CJK Ideograph */
- [0x9259, 0x9259], /* CJK Ideograph */
- [0x925a, 0x925a], /* CJK Ideograph */
- [0x925b, 0x925b], /* CJK Ideograph */
- [0x925c, 0x925c], /* CJK Ideograph */
- [0x925d, 0x925d], /* CJK Ideograph */
- [0x925e, 0x925e], /* CJK Ideograph */
- [0x925f, 0x925f], /* CJK Ideograph */
- [0x9260, 0x9260], /* CJK Ideograph */
- [0x9261, 0x9261], /* CJK Ideograph */
- [0x9262, 0x9262], /* CJK Ideograph */
- [0x9263, 0x9263], /* CJK Ideograph */
- [0x9264, 0x9264], /* CJK Ideograph */
- [0x9265, 0x9265], /* CJK Ideograph */
- [0x9266, 0x9266], /* CJK Ideograph */
- [0x9267, 0x9267], /* CJK Ideograph */
- [0x9268, 0x9268], /* CJK Ideograph */
- [0x9269, 0x9269], /* CJK Ideograph */
- [0x926a, 0x926a], /* CJK Ideograph */
- [0x926b, 0x926b], /* CJK Ideograph */
- [0x926c, 0x926c], /* CJK Ideograph */
- [0x926d, 0x926d], /* CJK Ideograph */
- [0x926e, 0x926e], /* CJK Ideograph */
- [0x926f, 0x926f], /* CJK Ideograph */
- [0x9270, 0x9270], /* CJK Ideograph */
- [0x9271, 0x9271], /* CJK Ideograph */
- [0x9272, 0x9272], /* CJK Ideograph */
- [0x9273, 0x9273], /* CJK Ideograph */
- [0x9274, 0x9274], /* CJK Ideograph */
- [0x9275, 0x9275], /* CJK Ideograph */
- [0x9276, 0x9276], /* CJK Ideograph */
- [0x9277, 0x9277], /* CJK Ideograph */
- [0x9278, 0x9278], /* CJK Ideograph */
- [0x9279, 0x9279], /* CJK Ideograph */
- [0x927a, 0x927a], /* CJK Ideograph */
- [0x927b, 0x927b], /* CJK Ideograph */
- [0x927c, 0x927c], /* CJK Ideograph */
- [0x927d, 0x927d], /* CJK Ideograph */
- [0x927e, 0x927e], /* CJK Ideograph */
- [0x927f, 0x927f], /* CJK Ideograph */
- [0x9280, 0x9280], /* CJK Ideograph */
- [0x9281, 0x9281], /* CJK Ideograph */
- [0x9282, 0x9282], /* CJK Ideograph */
- [0x9283, 0x9283], /* CJK Ideograph */
- [0x9284, 0x9284], /* CJK Ideograph */
- [0x9285, 0x9285], /* CJK Ideograph */
- [0x9286, 0x9286], /* CJK Ideograph */
- [0x9287, 0x9287], /* CJK Ideograph */
- [0x9288, 0x9288], /* CJK Ideograph */
- [0x9289, 0x9289], /* CJK Ideograph */
- [0x928a, 0x928a], /* CJK Ideograph */
- [0x928b, 0x928b], /* CJK Ideograph */
- [0x928c, 0x928c], /* CJK Ideograph */
- [0x928d, 0x928d], /* CJK Ideograph */
- [0x928e, 0x928e], /* CJK Ideograph */
- [0x928f, 0x928f], /* CJK Ideograph */
- [0x9290, 0x9290], /* CJK Ideograph */
- [0x9291, 0x9291], /* CJK Ideograph */
- [0x9292, 0x9292], /* CJK Ideograph */
- [0x9293, 0x9293], /* CJK Ideograph */
- [0x9294, 0x9294], /* CJK Ideograph */
- [0x9295, 0x9295], /* CJK Ideograph */
- [0x9296, 0x9296], /* CJK Ideograph */
- [0x9297, 0x9297], /* CJK Ideograph */
- [0x9298, 0x9298], /* CJK Ideograph */
- [0x9299, 0x9299], /* CJK Ideograph */
- [0x929a, 0x929a], /* CJK Ideograph */
- [0x929b, 0x929b], /* CJK Ideograph */
- [0x929c, 0x929c], /* CJK Ideograph */
- [0x929d, 0x929d], /* CJK Ideograph */
- [0x929e, 0x929e], /* CJK Ideograph */
- [0x929f, 0x929f], /* CJK Ideograph */
- [0x92a0, 0x92a0], /* CJK Ideograph */
- [0x92a1, 0x92a1], /* CJK Ideograph */
- [0x92a2, 0x92a2], /* CJK Ideograph */
- [0x92a3, 0x92a3], /* CJK Ideograph */
- [0x92a4, 0x92a4], /* CJK Ideograph */
- [0x92a5, 0x92a5], /* CJK Ideograph */
- [0x92a6, 0x92a6], /* CJK Ideograph */
- [0x92a7, 0x92a7], /* CJK Ideograph */
- [0x92a8, 0x92a8], /* CJK Ideograph */
- [0x92a9, 0x92a9], /* CJK Ideograph */
- [0x92aa, 0x92aa], /* CJK Ideograph */
- [0x92ab, 0x92ab], /* CJK Ideograph */
- [0x92ac, 0x92ac], /* CJK Ideograph */
- [0x92ad, 0x92ad], /* CJK Ideograph */
- [0x92ae, 0x92ae], /* CJK Ideograph */
- [0x92af, 0x92af], /* CJK Ideograph */
- [0x92b0, 0x92b0], /* CJK Ideograph */
- [0x92b1, 0x92b1], /* CJK Ideograph */
- [0x92b2, 0x92b2], /* CJK Ideograph */
- [0x92b3, 0x92b3], /* CJK Ideograph */
- [0x92b4, 0x92b4], /* CJK Ideograph */
- [0x92b5, 0x92b5], /* CJK Ideograph */
- [0x92b6, 0x92b6], /* CJK Ideograph */
- [0x92b7, 0x92b7], /* CJK Ideograph */
- [0x92b8, 0x92b8], /* CJK Ideograph */
- [0x92b9, 0x92b9], /* CJK Ideograph */
- [0x92ba, 0x92ba], /* CJK Ideograph */
- [0x92bb, 0x92bb], /* CJK Ideograph */
- [0x92bc, 0x92bc], /* CJK Ideograph */
- [0x92bd, 0x92bd], /* CJK Ideograph */
- [0x92be, 0x92be], /* CJK Ideograph */
- [0x92bf, 0x92bf], /* CJK Ideograph */
- [0x92c0, 0x92c0], /* CJK Ideograph */
- [0x92c1, 0x92c1], /* CJK Ideograph */
- [0x92c2, 0x92c2], /* CJK Ideograph */
- [0x92c3, 0x92c3], /* CJK Ideograph */
- [0x92c4, 0x92c4], /* CJK Ideograph */
- [0x92c5, 0x92c5], /* CJK Ideograph */
- [0x92c6, 0x92c6], /* CJK Ideograph */
- [0x92c7, 0x92c7], /* CJK Ideograph */
- [0x92c8, 0x92c8], /* CJK Ideograph */
- [0x92c9, 0x92c9], /* CJK Ideograph */
- [0x92ca, 0x92ca], /* CJK Ideograph */
- [0x92cb, 0x92cb], /* CJK Ideograph */
- [0x92cc, 0x92cc], /* CJK Ideograph */
- [0x92cd, 0x92cd], /* CJK Ideograph */
- [0x92ce, 0x92ce], /* CJK Ideograph */
- [0x92cf, 0x92cf], /* CJK Ideograph */
- [0x92d0, 0x92d0], /* CJK Ideograph */
- [0x92d1, 0x92d1], /* CJK Ideograph */
- [0x92d2, 0x92d2], /* CJK Ideograph */
- [0x92d3, 0x92d3], /* CJK Ideograph */
- [0x92d4, 0x92d4], /* CJK Ideograph */
- [0x92d5, 0x92d5], /* CJK Ideograph */
- [0x92d6, 0x92d6], /* CJK Ideograph */
- [0x92d7, 0x92d7], /* CJK Ideograph */
- [0x92d8, 0x92d8], /* CJK Ideograph */
- [0x92d9, 0x92d9], /* CJK Ideograph */
- [0x92da, 0x92da], /* CJK Ideograph */
- [0x92db, 0x92db], /* CJK Ideograph */
- [0x92dc, 0x92dc], /* CJK Ideograph */
- [0x92dd, 0x92dd], /* CJK Ideograph */
- [0x92de, 0x92de], /* CJK Ideograph */
- [0x92df, 0x92df], /* CJK Ideograph */
- [0x92e0, 0x92e0], /* CJK Ideograph */
- [0x92e1, 0x92e1], /* CJK Ideograph */
- [0x92e2, 0x92e2], /* CJK Ideograph */
- [0x92e3, 0x92e3], /* CJK Ideograph */
- [0x92e4, 0x92e4], /* CJK Ideograph */
- [0x92e5, 0x92e5], /* CJK Ideograph */
- [0x92e6, 0x92e6], /* CJK Ideograph */
- [0x92e7, 0x92e7], /* CJK Ideograph */
- [0x92e8, 0x92e8], /* CJK Ideograph */
- [0x92e9, 0x92e9], /* CJK Ideograph */
- [0x92ea, 0x92ea], /* CJK Ideograph */
- [0x92eb, 0x92eb], /* CJK Ideograph */
- [0x92ec, 0x92ec], /* CJK Ideograph */
- [0x92ed, 0x92ed], /* CJK Ideograph */
- [0x92ee, 0x92ee], /* CJK Ideograph */
- [0x92ef, 0x92ef], /* CJK Ideograph */
- [0x92f0, 0x92f0], /* CJK Ideograph */
- [0x92f1, 0x92f1], /* CJK Ideograph */
- [0x92f2, 0x92f2], /* CJK Ideograph */
- [0x92f3, 0x92f3], /* CJK Ideograph */
- [0x92f4, 0x92f4], /* CJK Ideograph */
- [0x92f5, 0x92f5], /* CJK Ideograph */
- [0x92f6, 0x92f6], /* CJK Ideograph */
- [0x92f7, 0x92f7], /* CJK Ideograph */
- [0x92f8, 0x92f8], /* CJK Ideograph */
- [0x92f9, 0x92f9], /* CJK Ideograph */
- [0x92fa, 0x92fa], /* CJK Ideograph */
- [0x92fb, 0x92fb], /* CJK Ideograph */
- [0x92fc, 0x92fc], /* CJK Ideograph */
- [0x92fd, 0x92fd], /* CJK Ideograph */
- [0x92fe, 0x92fe], /* CJK Ideograph */
- [0x92ff, 0x92ff], /* CJK Ideograph */
- [0x9300, 0x9300], /* CJK Ideograph */
- [0x9301, 0x9301], /* CJK Ideograph */
- [0x9302, 0x9302], /* CJK Ideograph */
- [0x9303, 0x9303], /* CJK Ideograph */
- [0x9304, 0x9304], /* CJK Ideograph */
- [0x9305, 0x9305], /* CJK Ideograph */
- [0x9306, 0x9306], /* CJK Ideograph */
- [0x9307, 0x9307], /* CJK Ideograph */
- [0x9308, 0x9308], /* CJK Ideograph */
- [0x9309, 0x9309], /* CJK Ideograph */
- [0x930a, 0x930a], /* CJK Ideograph */
- [0x930b, 0x930b], /* CJK Ideograph */
- [0x930c, 0x930c], /* CJK Ideograph */
- [0x930d, 0x930d], /* CJK Ideograph */
- [0x930e, 0x930e], /* CJK Ideograph */
- [0x930f, 0x930f], /* CJK Ideograph */
- [0x9310, 0x9310], /* CJK Ideograph */
- [0x9311, 0x9311], /* CJK Ideograph */
- [0x9312, 0x9312], /* CJK Ideograph */
- [0x9313, 0x9313], /* CJK Ideograph */
- [0x9314, 0x9314], /* CJK Ideograph */
- [0x9315, 0x9315], /* CJK Ideograph */
- [0x9316, 0x9316], /* CJK Ideograph */
- [0x9317, 0x9317], /* CJK Ideograph */
- [0x9318, 0x9318], /* CJK Ideograph */
- [0x9319, 0x9319], /* CJK Ideograph */
- [0x931a, 0x931a], /* CJK Ideograph */
- [0x931b, 0x931b], /* CJK Ideograph */
- [0x931c, 0x931c], /* CJK Ideograph */
- [0x931d, 0x931d], /* CJK Ideograph */
- [0x931e, 0x931e], /* CJK Ideograph */
- [0x931f, 0x931f], /* CJK Ideograph */
- [0x9320, 0x9320], /* CJK Ideograph */
- [0x9321, 0x9321], /* CJK Ideograph */
- [0x9322, 0x9322], /* CJK Ideograph */
- [0x9323, 0x9323], /* CJK Ideograph */
- [0x9324, 0x9324], /* CJK Ideograph */
- [0x9325, 0x9325], /* CJK Ideograph */
- [0x9326, 0x9326], /* CJK Ideograph */
- [0x9327, 0x9327], /* CJK Ideograph */
- [0x9328, 0x9328], /* CJK Ideograph */
- [0x9329, 0x9329], /* CJK Ideograph */
- [0x932a, 0x932a], /* CJK Ideograph */
- [0x932b, 0x932b], /* CJK Ideograph */
- [0x932c, 0x932c], /* CJK Ideograph */
- [0x932d, 0x932d], /* CJK Ideograph */
- [0x932e, 0x932e], /* CJK Ideograph */
- [0x932f, 0x932f], /* CJK Ideograph */
- [0x9330, 0x9330], /* CJK Ideograph */
- [0x9331, 0x9331], /* CJK Ideograph */
- [0x9332, 0x9332], /* CJK Ideograph */
- [0x9333, 0x9333], /* CJK Ideograph */
- [0x9334, 0x9334], /* CJK Ideograph */
- [0x9335, 0x9335], /* CJK Ideograph */
- [0x9336, 0x9336], /* CJK Ideograph */
- [0x9337, 0x9337], /* CJK Ideograph */
- [0x9338, 0x9338], /* CJK Ideograph */
- [0x9339, 0x9339], /* CJK Ideograph */
- [0x933a, 0x933a], /* CJK Ideograph */
- [0x933b, 0x933b], /* CJK Ideograph */
- [0x933c, 0x933c], /* CJK Ideograph */
- [0x933d, 0x933d], /* CJK Ideograph */
- [0x933e, 0x933e], /* CJK Ideograph */
- [0x933f, 0x933f], /* CJK Ideograph */
- [0x9340, 0x9340], /* CJK Ideograph */
- [0x9341, 0x9341], /* CJK Ideograph */
- [0x9342, 0x9342], /* CJK Ideograph */
- [0x9343, 0x9343], /* CJK Ideograph */
- [0x9344, 0x9344], /* CJK Ideograph */
- [0x9345, 0x9345], /* CJK Ideograph */
- [0x9346, 0x9346], /* CJK Ideograph */
- [0x9347, 0x9347], /* CJK Ideograph */
- [0x9348, 0x9348], /* CJK Ideograph */
- [0x9349, 0x9349], /* CJK Ideograph */
- [0x934a, 0x934a], /* CJK Ideograph */
- [0x934b, 0x934b], /* CJK Ideograph */
- [0x934c, 0x934c], /* CJK Ideograph */
- [0x934d, 0x934d], /* CJK Ideograph */
- [0x934e, 0x934e], /* CJK Ideograph */
- [0x934f, 0x934f], /* CJK Ideograph */
- [0x9350, 0x9350], /* CJK Ideograph */
- [0x9351, 0x9351], /* CJK Ideograph */
- [0x9352, 0x9352], /* CJK Ideograph */
- [0x9353, 0x9353], /* CJK Ideograph */
- [0x9354, 0x9354], /* CJK Ideograph */
- [0x9355, 0x9355], /* CJK Ideograph */
- [0x9356, 0x9356], /* CJK Ideograph */
- [0x9357, 0x9357], /* CJK Ideograph */
- [0x9358, 0x9358], /* CJK Ideograph */
- [0x9359, 0x9359], /* CJK Ideograph */
- [0x935a, 0x935a], /* CJK Ideograph */
- [0x935b, 0x935b], /* CJK Ideograph */
- [0x935c, 0x935c], /* CJK Ideograph */
- [0x935d, 0x935d], /* CJK Ideograph */
- [0x935e, 0x935e], /* CJK Ideograph */
- [0x935f, 0x935f], /* CJK Ideograph */
- [0x9360, 0x9360], /* CJK Ideograph */
- [0x9361, 0x9361], /* CJK Ideograph */
- [0x9362, 0x9362], /* CJK Ideograph */
- [0x9363, 0x9363], /* CJK Ideograph */
- [0x9364, 0x9364], /* CJK Ideograph */
- [0x9365, 0x9365], /* CJK Ideograph */
- [0x9366, 0x9366], /* CJK Ideograph */
- [0x9367, 0x9367], /* CJK Ideograph */
- [0x9368, 0x9368], /* CJK Ideograph */
- [0x9369, 0x9369], /* CJK Ideograph */
- [0x936a, 0x936a], /* CJK Ideograph */
- [0x936b, 0x936b], /* CJK Ideograph */
- [0x936c, 0x936c], /* CJK Ideograph */
- [0x936d, 0x936d], /* CJK Ideograph */
- [0x936e, 0x936e], /* CJK Ideograph */
- [0x936f, 0x936f], /* CJK Ideograph */
- [0x9370, 0x9370], /* CJK Ideograph */
- [0x9371, 0x9371], /* CJK Ideograph */
- [0x9372, 0x9372], /* CJK Ideograph */
- [0x9373, 0x9373], /* CJK Ideograph */
- [0x9374, 0x9374], /* CJK Ideograph */
- [0x9375, 0x9375], /* CJK Ideograph */
- [0x9376, 0x9376], /* CJK Ideograph */
- [0x9377, 0x9377], /* CJK Ideograph */
- [0x9378, 0x9378], /* CJK Ideograph */
- [0x9379, 0x9379], /* CJK Ideograph */
- [0x937a, 0x937a], /* CJK Ideograph */
- [0x937b, 0x937b], /* CJK Ideograph */
- [0x937c, 0x937c], /* CJK Ideograph */
- [0x937d, 0x937d], /* CJK Ideograph */
- [0x937e, 0x937e], /* CJK Ideograph */
- [0x937f, 0x937f], /* CJK Ideograph */
- [0x9380, 0x9380], /* CJK Ideograph */
- [0x9381, 0x9381], /* CJK Ideograph */
- [0x9382, 0x9382], /* CJK Ideograph */
- [0x9383, 0x9383], /* CJK Ideograph */
- [0x9384, 0x9384], /* CJK Ideograph */
- [0x9385, 0x9385], /* CJK Ideograph */
- [0x9386, 0x9386], /* CJK Ideograph */
- [0x9387, 0x9387], /* CJK Ideograph */
- [0x9388, 0x9388], /* CJK Ideograph */
- [0x9389, 0x9389], /* CJK Ideograph */
- [0x938a, 0x938a], /* CJK Ideograph */
- [0x938b, 0x938b], /* CJK Ideograph */
- [0x938c, 0x938c], /* CJK Ideograph */
- [0x938d, 0x938d], /* CJK Ideograph */
- [0x938e, 0x938e], /* CJK Ideograph */
- [0x938f, 0x938f], /* CJK Ideograph */
- [0x9390, 0x9390], /* CJK Ideograph */
- [0x9391, 0x9391], /* CJK Ideograph */
- [0x9392, 0x9392], /* CJK Ideograph */
- [0x9393, 0x9393], /* CJK Ideograph */
- [0x9394, 0x9394], /* CJK Ideograph */
- [0x9395, 0x9395], /* CJK Ideograph */
- [0x9396, 0x9396], /* CJK Ideograph */
- [0x9397, 0x9397], /* CJK Ideograph */
- [0x9398, 0x9398], /* CJK Ideograph */
- [0x9399, 0x9399], /* CJK Ideograph */
- [0x939a, 0x939a], /* CJK Ideograph */
- [0x939b, 0x939b], /* CJK Ideograph */
- [0x939c, 0x939c], /* CJK Ideograph */
- [0x939d, 0x939d], /* CJK Ideograph */
- [0x939e, 0x939e], /* CJK Ideograph */
- [0x939f, 0x939f], /* CJK Ideograph */
- [0x93a0, 0x93a0], /* CJK Ideograph */
- [0x93a1, 0x93a1], /* CJK Ideograph */
- [0x93a2, 0x93a2], /* CJK Ideograph */
- [0x93a3, 0x93a3], /* CJK Ideograph */
- [0x93a4, 0x93a4], /* CJK Ideograph */
- [0x93a5, 0x93a5], /* CJK Ideograph */
- [0x93a6, 0x93a6], /* CJK Ideograph */
- [0x93a7, 0x93a7], /* CJK Ideograph */
- [0x93a8, 0x93a8], /* CJK Ideograph */
- [0x93a9, 0x93a9], /* CJK Ideograph */
- [0x93aa, 0x93aa], /* CJK Ideograph */
- [0x93ab, 0x93ab], /* CJK Ideograph */
- [0x93ac, 0x93ac], /* CJK Ideograph */
- [0x93ad, 0x93ad], /* CJK Ideograph */
- [0x93ae, 0x93ae], /* CJK Ideograph */
- [0x93af, 0x93af], /* CJK Ideograph */
- [0x93b0, 0x93b0], /* CJK Ideograph */
- [0x93b1, 0x93b1], /* CJK Ideograph */
- [0x93b2, 0x93b2], /* CJK Ideograph */
- [0x93b3, 0x93b3], /* CJK Ideograph */
- [0x93b4, 0x93b4], /* CJK Ideograph */
- [0x93b5, 0x93b5], /* CJK Ideograph */
- [0x93b6, 0x93b6], /* CJK Ideograph */
- [0x93b7, 0x93b7], /* CJK Ideograph */
- [0x93b8, 0x93b8], /* CJK Ideograph */
- [0x93b9, 0x93b9], /* CJK Ideograph */
- [0x93ba, 0x93ba], /* CJK Ideograph */
- [0x93bb, 0x93bb], /* CJK Ideograph */
- [0x93bc, 0x93bc], /* CJK Ideograph */
- [0x93bd, 0x93bd], /* CJK Ideograph */
- [0x93be, 0x93be], /* CJK Ideograph */
- [0x93bf, 0x93bf], /* CJK Ideograph */
- [0x93c0, 0x93c0], /* CJK Ideograph */
- [0x93c1, 0x93c1], /* CJK Ideograph */
- [0x93c2, 0x93c2], /* CJK Ideograph */
- [0x93c3, 0x93c3], /* CJK Ideograph */
- [0x93c4, 0x93c4], /* CJK Ideograph */
- [0x93c5, 0x93c5], /* CJK Ideograph */
- [0x93c6, 0x93c6], /* CJK Ideograph */
- [0x93c7, 0x93c7], /* CJK Ideograph */
- [0x93c8, 0x93c8], /* CJK Ideograph */
- [0x93c9, 0x93c9], /* CJK Ideograph */
- [0x93ca, 0x93ca], /* CJK Ideograph */
- [0x93cb, 0x93cb], /* CJK Ideograph */
- [0x93cc, 0x93cc], /* CJK Ideograph */
- [0x93cd, 0x93cd], /* CJK Ideograph */
- [0x93ce, 0x93ce], /* CJK Ideograph */
- [0x93cf, 0x93cf], /* CJK Ideograph */
- [0x93d0, 0x93d0], /* CJK Ideograph */
- [0x93d1, 0x93d1], /* CJK Ideograph */
- [0x93d2, 0x93d2], /* CJK Ideograph */
- [0x93d3, 0x93d3], /* CJK Ideograph */
- [0x93d4, 0x93d4], /* CJK Ideograph */
- [0x93d5, 0x93d5], /* CJK Ideograph */
- [0x93d6, 0x93d6], /* CJK Ideograph */
- [0x93d7, 0x93d7], /* CJK Ideograph */
- [0x93d8, 0x93d8], /* CJK Ideograph */
- [0x93d9, 0x93d9], /* CJK Ideograph */
- [0x93da, 0x93da], /* CJK Ideograph */
- [0x93db, 0x93db], /* CJK Ideograph */
- [0x93dc, 0x93dc], /* CJK Ideograph */
- [0x93dd, 0x93dd], /* CJK Ideograph */
- [0x93de, 0x93de], /* CJK Ideograph */
- [0x93df, 0x93df], /* CJK Ideograph */
- [0x93e0, 0x93e0], /* CJK Ideograph */
- [0x93e1, 0x93e1], /* CJK Ideograph */
- [0x93e2, 0x93e2], /* CJK Ideograph */
- [0x93e3, 0x93e3], /* CJK Ideograph */
- [0x93e4, 0x93e4], /* CJK Ideograph */
- [0x93e5, 0x93e5], /* CJK Ideograph */
- [0x93e6, 0x93e6], /* CJK Ideograph */
- [0x93e7, 0x93e7], /* CJK Ideograph */
- [0x93e8, 0x93e8], /* CJK Ideograph */
- [0x93e9, 0x93e9], /* CJK Ideograph */
- [0x93ea, 0x93ea], /* CJK Ideograph */
- [0x93eb, 0x93eb], /* CJK Ideograph */
- [0x93ec, 0x93ec], /* CJK Ideograph */
- [0x93ed, 0x93ed], /* CJK Ideograph */
- [0x93ee, 0x93ee], /* CJK Ideograph */
- [0x93ef, 0x93ef], /* CJK Ideograph */
- [0x93f0, 0x93f0], /* CJK Ideograph */
- [0x93f1, 0x93f1], /* CJK Ideograph */
- [0x93f2, 0x93f2], /* CJK Ideograph */
- [0x93f3, 0x93f3], /* CJK Ideograph */
- [0x93f4, 0x93f4], /* CJK Ideograph */
- [0x93f5, 0x93f5], /* CJK Ideograph */
- [0x93f6, 0x93f6], /* CJK Ideograph */
- [0x93f7, 0x93f7], /* CJK Ideograph */
- [0x93f8, 0x93f8], /* CJK Ideograph */
- [0x93f9, 0x93f9], /* CJK Ideograph */
- [0x93fa, 0x93fa], /* CJK Ideograph */
- [0x93fb, 0x93fb], /* CJK Ideograph */
- [0x93fc, 0x93fc], /* CJK Ideograph */
- [0x93fd, 0x93fd], /* CJK Ideograph */
- [0x93fe, 0x93fe], /* CJK Ideograph */
- [0x93ff, 0x93ff], /* CJK Ideograph */
- [0x9400, 0x9400], /* CJK Ideograph */
- [0x9401, 0x9401], /* CJK Ideograph */
- [0x9402, 0x9402], /* CJK Ideograph */
- [0x9403, 0x9403], /* CJK Ideograph */
- [0x9404, 0x9404], /* CJK Ideograph */
- [0x9405, 0x9405], /* CJK Ideograph */
- [0x9406, 0x9406], /* CJK Ideograph */
- [0x9407, 0x9407], /* CJK Ideograph */
- [0x9408, 0x9408], /* CJK Ideograph */
- [0x9409, 0x9409], /* CJK Ideograph */
- [0x940a, 0x940a], /* CJK Ideograph */
- [0x940b, 0x940b], /* CJK Ideograph */
- [0x940c, 0x940c], /* CJK Ideograph */
- [0x940d, 0x940d], /* CJK Ideograph */
- [0x940e, 0x940e], /* CJK Ideograph */
- [0x940f, 0x940f], /* CJK Ideograph */
- [0x9410, 0x9410], /* CJK Ideograph */
- [0x9411, 0x9411], /* CJK Ideograph */
- [0x9412, 0x9412], /* CJK Ideograph */
- [0x9413, 0x9413], /* CJK Ideograph */
- [0x9414, 0x9414], /* CJK Ideograph */
- [0x9415, 0x9415], /* CJK Ideograph */
- [0x9416, 0x9416], /* CJK Ideograph */
- [0x9417, 0x9417], /* CJK Ideograph */
- [0x9418, 0x9418], /* CJK Ideograph */
- [0x9419, 0x9419], /* CJK Ideograph */
- [0x941a, 0x941a], /* CJK Ideograph */
- [0x941b, 0x941b], /* CJK Ideograph */
- [0x941c, 0x941c], /* CJK Ideograph */
- [0x941d, 0x941d], /* CJK Ideograph */
- [0x941e, 0x941e], /* CJK Ideograph */
- [0x941f, 0x941f], /* CJK Ideograph */
- [0x9420, 0x9420], /* CJK Ideograph */
- [0x9421, 0x9421], /* CJK Ideograph */
- [0x9422, 0x9422], /* CJK Ideograph */
- [0x9423, 0x9423], /* CJK Ideograph */
- [0x9424, 0x9424], /* CJK Ideograph */
- [0x9425, 0x9425], /* CJK Ideograph */
- [0x9426, 0x9426], /* CJK Ideograph */
- [0x9427, 0x9427], /* CJK Ideograph */
- [0x9428, 0x9428], /* CJK Ideograph */
- [0x9429, 0x9429], /* CJK Ideograph */
- [0x942a, 0x942a], /* CJK Ideograph */
- [0x942b, 0x942b], /* CJK Ideograph */
- [0x942c, 0x942c], /* CJK Ideograph */
- [0x942d, 0x942d], /* CJK Ideograph */
- [0x942e, 0x942e], /* CJK Ideograph */
- [0x942f, 0x942f], /* CJK Ideograph */
- [0x9430, 0x9430], /* CJK Ideograph */
- [0x9431, 0x9431], /* CJK Ideograph */
- [0x9432, 0x9432], /* CJK Ideograph */
- [0x9433, 0x9433], /* CJK Ideograph */
- [0x9434, 0x9434], /* CJK Ideograph */
- [0x9435, 0x9435], /* CJK Ideograph */
- [0x9436, 0x9436], /* CJK Ideograph */
- [0x9437, 0x9437], /* CJK Ideograph */
- [0x9438, 0x9438], /* CJK Ideograph */
- [0x9439, 0x9439], /* CJK Ideograph */
- [0x943a, 0x943a], /* CJK Ideograph */
- [0x943b, 0x943b], /* CJK Ideograph */
- [0x943c, 0x943c], /* CJK Ideograph */
- [0x943d, 0x943d], /* CJK Ideograph */
- [0x943e, 0x943e], /* CJK Ideograph */
- [0x943f, 0x943f], /* CJK Ideograph */
- [0x9440, 0x9440], /* CJK Ideograph */
- [0x9441, 0x9441], /* CJK Ideograph */
- [0x9442, 0x9442], /* CJK Ideograph */
- [0x9443, 0x9443], /* CJK Ideograph */
- [0x9444, 0x9444], /* CJK Ideograph */
- [0x9445, 0x9445], /* CJK Ideograph */
- [0x9446, 0x9446], /* CJK Ideograph */
- [0x9447, 0x9447], /* CJK Ideograph */
- [0x9448, 0x9448], /* CJK Ideograph */
- [0x9449, 0x9449], /* CJK Ideograph */
- [0x944a, 0x944a], /* CJK Ideograph */
- [0x944b, 0x944b], /* CJK Ideograph */
- [0x944c, 0x944c], /* CJK Ideograph */
- [0x944d, 0x944d], /* CJK Ideograph */
- [0x944e, 0x944e], /* CJK Ideograph */
- [0x944f, 0x944f], /* CJK Ideograph */
- [0x9450, 0x9450], /* CJK Ideograph */
- [0x9451, 0x9451], /* CJK Ideograph */
- [0x9452, 0x9452], /* CJK Ideograph */
- [0x9453, 0x9453], /* CJK Ideograph */
- [0x9454, 0x9454], /* CJK Ideograph */
- [0x9455, 0x9455], /* CJK Ideograph */
- [0x9456, 0x9456], /* CJK Ideograph */
- [0x9457, 0x9457], /* CJK Ideograph */
- [0x9458, 0x9458], /* CJK Ideograph */
- [0x9459, 0x9459], /* CJK Ideograph */
- [0x945a, 0x945a], /* CJK Ideograph */
- [0x945b, 0x945b], /* CJK Ideograph */
- [0x945c, 0x945c], /* CJK Ideograph */
- [0x945d, 0x945d], /* CJK Ideograph */
- [0x945e, 0x945e], /* CJK Ideograph */
- [0x945f, 0x945f], /* CJK Ideograph */
- [0x9460, 0x9460], /* CJK Ideograph */
- [0x9461, 0x9461], /* CJK Ideograph */
- [0x9462, 0x9462], /* CJK Ideograph */
- [0x9463, 0x9463], /* CJK Ideograph */
- [0x9464, 0x9464], /* CJK Ideograph */
- [0x9465, 0x9465], /* CJK Ideograph */
- [0x9466, 0x9466], /* CJK Ideograph */
- [0x9467, 0x9467], /* CJK Ideograph */
- [0x9468, 0x9468], /* CJK Ideograph */
- [0x9469, 0x9469], /* CJK Ideograph */
- [0x946a, 0x946a], /* CJK Ideograph */
- [0x946b, 0x946b], /* CJK Ideograph */
- [0x946c, 0x946c], /* CJK Ideograph */
- [0x946d, 0x946d], /* CJK Ideograph */
- [0x946e, 0x946e], /* CJK Ideograph */
- [0x946f, 0x946f], /* CJK Ideograph */
- [0x9470, 0x9470], /* CJK Ideograph */
- [0x9471, 0x9471], /* CJK Ideograph */
- [0x9472, 0x9472], /* CJK Ideograph */
- [0x9473, 0x9473], /* CJK Ideograph */
- [0x9474, 0x9474], /* CJK Ideograph */
- [0x9475, 0x9475], /* CJK Ideograph */
- [0x9476, 0x9476], /* CJK Ideograph */
- [0x9477, 0x9477], /* CJK Ideograph */
- [0x9478, 0x9478], /* CJK Ideograph */
- [0x9479, 0x9479], /* CJK Ideograph */
- [0x947a, 0x947a], /* CJK Ideograph */
- [0x947b, 0x947b], /* CJK Ideograph */
- [0x947c, 0x947c], /* CJK Ideograph */
- [0x947d, 0x947d], /* CJK Ideograph */
- [0x947e, 0x947e], /* CJK Ideograph */
- [0x947f, 0x947f], /* CJK Ideograph */
- [0x9480, 0x9480], /* CJK Ideograph */
- [0x9481, 0x9481], /* CJK Ideograph */
- [0x9482, 0x9482], /* CJK Ideograph */
- [0x9483, 0x9483], /* CJK Ideograph */
- [0x9484, 0x9484], /* CJK Ideograph */
- [0x9485, 0x9485], /* CJK Ideograph */
- [0x9486, 0x9486], /* CJK Ideograph */
- [0x9487, 0x9487], /* CJK Ideograph */
- [0x9488, 0x9488], /* CJK Ideograph */
- [0x9489, 0x9489], /* CJK Ideograph */
- [0x948a, 0x948a], /* CJK Ideograph */
- [0x948b, 0x948b], /* CJK Ideograph */
- [0x948c, 0x948c], /* CJK Ideograph */
- [0x948d, 0x948d], /* CJK Ideograph */
- [0x948e, 0x948e], /* CJK Ideograph */
- [0x948f, 0x948f], /* CJK Ideograph */
- [0x9490, 0x9490], /* CJK Ideograph */
- [0x9491, 0x9491], /* CJK Ideograph */
- [0x9492, 0x9492], /* CJK Ideograph */
- [0x9493, 0x9493], /* CJK Ideograph */
- [0x9494, 0x9494], /* CJK Ideograph */
- [0x9495, 0x9495], /* CJK Ideograph */
- [0x9496, 0x9496], /* CJK Ideograph */
- [0x9497, 0x9497], /* CJK Ideograph */
- [0x9498, 0x9498], /* CJK Ideograph */
- [0x9499, 0x9499], /* CJK Ideograph */
- [0x949a, 0x949a], /* CJK Ideograph */
- [0x949b, 0x949b], /* CJK Ideograph */
- [0x949c, 0x949c], /* CJK Ideograph */
- [0x949d, 0x949d], /* CJK Ideograph */
- [0x949e, 0x949e], /* CJK Ideograph */
- [0x949f, 0x949f], /* CJK Ideograph */
- [0x94a0, 0x94a0], /* CJK Ideograph */
- [0x94a1, 0x94a1], /* CJK Ideograph */
- [0x94a2, 0x94a2], /* CJK Ideograph */
- [0x94a3, 0x94a3], /* CJK Ideograph */
- [0x94a4, 0x94a4], /* CJK Ideograph */
- [0x94a5, 0x94a5], /* CJK Ideograph */
- [0x94a6, 0x94a6], /* CJK Ideograph */
- [0x94a7, 0x94a7], /* CJK Ideograph */
- [0x94a8, 0x94a8], /* CJK Ideograph */
- [0x94a9, 0x94a9], /* CJK Ideograph */
- [0x94aa, 0x94aa], /* CJK Ideograph */
- [0x94ab, 0x94ab], /* CJK Ideograph */
- [0x94ac, 0x94ac], /* CJK Ideograph */
- [0x94ad, 0x94ad], /* CJK Ideograph */
- [0x94ae, 0x94ae], /* CJK Ideograph */
- [0x94af, 0x94af], /* CJK Ideograph */
- [0x94b0, 0x94b0], /* CJK Ideograph */
- [0x94b1, 0x94b1], /* CJK Ideograph */
- [0x94b2, 0x94b2], /* CJK Ideograph */
- [0x94b3, 0x94b3], /* CJK Ideograph */
- [0x94b4, 0x94b4], /* CJK Ideograph */
- [0x94b5, 0x94b5], /* CJK Ideograph */
- [0x94b6, 0x94b6], /* CJK Ideograph */
- [0x94b7, 0x94b7], /* CJK Ideograph */
- [0x94b8, 0x94b8], /* CJK Ideograph */
- [0x94b9, 0x94b9], /* CJK Ideograph */
- [0x94ba, 0x94ba], /* CJK Ideograph */
- [0x94bb, 0x94bb], /* CJK Ideograph */
- [0x94bc, 0x94bc], /* CJK Ideograph */
- [0x94bd, 0x94bd], /* CJK Ideograph */
- [0x94be, 0x94be], /* CJK Ideograph */
- [0x94bf, 0x94bf], /* CJK Ideograph */
- [0x94c0, 0x94c0], /* CJK Ideograph */
- [0x94c1, 0x94c1], /* CJK Ideograph */
- [0x94c2, 0x94c2], /* CJK Ideograph */
- [0x94c3, 0x94c3], /* CJK Ideograph */
- [0x94c4, 0x94c4], /* CJK Ideograph */
- [0x94c5, 0x94c5], /* CJK Ideograph */
- [0x94c6, 0x94c6], /* CJK Ideograph */
- [0x94c7, 0x94c7], /* CJK Ideograph */
- [0x94c8, 0x94c8], /* CJK Ideograph */
- [0x94c9, 0x94c9], /* CJK Ideograph */
- [0x94ca, 0x94ca], /* CJK Ideograph */
- [0x94cb, 0x94cb], /* CJK Ideograph */
- [0x94cc, 0x94cc], /* CJK Ideograph */
- [0x94cd, 0x94cd], /* CJK Ideograph */
- [0x94ce, 0x94ce], /* CJK Ideograph */
- [0x94cf, 0x94cf], /* CJK Ideograph */
- [0x94d0, 0x94d0], /* CJK Ideograph */
- [0x94d1, 0x94d1], /* CJK Ideograph */
- [0x94d2, 0x94d2], /* CJK Ideograph */
- [0x94d3, 0x94d3], /* CJK Ideograph */
- [0x94d4, 0x94d4], /* CJK Ideograph */
- [0x94d5, 0x94d5], /* CJK Ideograph */
- [0x94d6, 0x94d6], /* CJK Ideograph */
- [0x94d7, 0x94d7], /* CJK Ideograph */
- [0x94d8, 0x94d8], /* CJK Ideograph */
- [0x94d9, 0x94d9], /* CJK Ideograph */
- [0x94da, 0x94da], /* CJK Ideograph */
- [0x94db, 0x94db], /* CJK Ideograph */
- [0x94dc, 0x94dc], /* CJK Ideograph */
- [0x94dd, 0x94dd], /* CJK Ideograph */
- [0x94de, 0x94de], /* CJK Ideograph */
- [0x94df, 0x94df], /* CJK Ideograph */
- [0x94e0, 0x94e0], /* CJK Ideograph */
- [0x94e1, 0x94e1], /* CJK Ideograph */
- [0x94e2, 0x94e2], /* CJK Ideograph */
- [0x94e3, 0x94e3], /* CJK Ideograph */
- [0x94e4, 0x94e4], /* CJK Ideograph */
- [0x94e5, 0x94e5], /* CJK Ideograph */
- [0x94e6, 0x94e6], /* CJK Ideograph */
- [0x94e7, 0x94e7], /* CJK Ideograph */
- [0x94e8, 0x94e8], /* CJK Ideograph */
- [0x94e9, 0x94e9], /* CJK Ideograph */
- [0x94ea, 0x94ea], /* CJK Ideograph */
- [0x94eb, 0x94eb], /* CJK Ideograph */
- [0x94ec, 0x94ec], /* CJK Ideograph */
- [0x94ed, 0x94ed], /* CJK Ideograph */
- [0x94ee, 0x94ee], /* CJK Ideograph */
- [0x94ef, 0x94ef], /* CJK Ideograph */
- [0x94f0, 0x94f0], /* CJK Ideograph */
- [0x94f1, 0x94f1], /* CJK Ideograph */
- [0x94f2, 0x94f2], /* CJK Ideograph */
- [0x94f3, 0x94f3], /* CJK Ideograph */
- [0x94f4, 0x94f4], /* CJK Ideograph */
- [0x94f5, 0x94f5], /* CJK Ideograph */
- [0x94f6, 0x94f6], /* CJK Ideograph */
- [0x94f7, 0x94f7], /* CJK Ideograph */
- [0x94f8, 0x94f8], /* CJK Ideograph */
- [0x94f9, 0x94f9], /* CJK Ideograph */
- [0x94fa, 0x94fa], /* CJK Ideograph */
- [0x94fb, 0x94fb], /* CJK Ideograph */
- [0x94fc, 0x94fc], /* CJK Ideograph */
- [0x94fd, 0x94fd], /* CJK Ideograph */
- [0x94fe, 0x94fe], /* CJK Ideograph */
- [0x94ff, 0x94ff], /* CJK Ideograph */
- [0x9500, 0x9500], /* CJK Ideograph */
- [0x9501, 0x9501], /* CJK Ideograph */
- [0x9502, 0x9502], /* CJK Ideograph */
- [0x9503, 0x9503], /* CJK Ideograph */
- [0x9504, 0x9504], /* CJK Ideograph */
- [0x9505, 0x9505], /* CJK Ideograph */
- [0x9506, 0x9506], /* CJK Ideograph */
- [0x9507, 0x9507], /* CJK Ideograph */
- [0x9508, 0x9508], /* CJK Ideograph */
- [0x9509, 0x9509], /* CJK Ideograph */
- [0x950a, 0x950a], /* CJK Ideograph */
- [0x950b, 0x950b], /* CJK Ideograph */
- [0x950c, 0x950c], /* CJK Ideograph */
- [0x950d, 0x950d], /* CJK Ideograph */
- [0x950e, 0x950e], /* CJK Ideograph */
- [0x950f, 0x950f], /* CJK Ideograph */
- [0x9510, 0x9510], /* CJK Ideograph */
- [0x9511, 0x9511], /* CJK Ideograph */
- [0x9512, 0x9512], /* CJK Ideograph */
- [0x9513, 0x9513], /* CJK Ideograph */
- [0x9514, 0x9514], /* CJK Ideograph */
- [0x9515, 0x9515], /* CJK Ideograph */
- [0x9516, 0x9516], /* CJK Ideograph */
- [0x9517, 0x9517], /* CJK Ideograph */
- [0x9518, 0x9518], /* CJK Ideograph */
- [0x9519, 0x9519], /* CJK Ideograph */
- [0x951a, 0x951a], /* CJK Ideograph */
- [0x951b, 0x951b], /* CJK Ideograph */
- [0x951c, 0x951c], /* CJK Ideograph */
- [0x951d, 0x951d], /* CJK Ideograph */
- [0x951e, 0x951e], /* CJK Ideograph */
- [0x951f, 0x951f], /* CJK Ideograph */
- [0x9520, 0x9520], /* CJK Ideograph */
- [0x9521, 0x9521], /* CJK Ideograph */
- [0x9522, 0x9522], /* CJK Ideograph */
- [0x9523, 0x9523], /* CJK Ideograph */
- [0x9524, 0x9524], /* CJK Ideograph */
- [0x9525, 0x9525], /* CJK Ideograph */
- [0x9526, 0x9526], /* CJK Ideograph */
- [0x9527, 0x9527], /* CJK Ideograph */
- [0x9528, 0x9528], /* CJK Ideograph */
- [0x9529, 0x9529], /* CJK Ideograph */
- [0x952a, 0x952a], /* CJK Ideograph */
- [0x952b, 0x952b], /* CJK Ideograph */
- [0x952c, 0x952c], /* CJK Ideograph */
- [0x952d, 0x952d], /* CJK Ideograph */
- [0x952e, 0x952e], /* CJK Ideograph */
- [0x952f, 0x952f], /* CJK Ideograph */
- [0x9530, 0x9530], /* CJK Ideograph */
- [0x9531, 0x9531], /* CJK Ideograph */
- [0x9532, 0x9532], /* CJK Ideograph */
- [0x9533, 0x9533], /* CJK Ideograph */
- [0x9534, 0x9534], /* CJK Ideograph */
- [0x9535, 0x9535], /* CJK Ideograph */
- [0x9536, 0x9536], /* CJK Ideograph */
- [0x9537, 0x9537], /* CJK Ideograph */
- [0x9538, 0x9538], /* CJK Ideograph */
- [0x9539, 0x9539], /* CJK Ideograph */
- [0x953a, 0x953a], /* CJK Ideograph */
- [0x953b, 0x953b], /* CJK Ideograph */
- [0x953c, 0x953c], /* CJK Ideograph */
- [0x953d, 0x953d], /* CJK Ideograph */
- [0x953e, 0x953e], /* CJK Ideograph */
- [0x953f, 0x953f], /* CJK Ideograph */
- [0x9540, 0x9540], /* CJK Ideograph */
- [0x9541, 0x9541], /* CJK Ideograph */
- [0x9542, 0x9542], /* CJK Ideograph */
- [0x9543, 0x9543], /* CJK Ideograph */
- [0x9544, 0x9544], /* CJK Ideograph */
- [0x9545, 0x9545], /* CJK Ideograph */
- [0x9546, 0x9546], /* CJK Ideograph */
- [0x9547, 0x9547], /* CJK Ideograph */
- [0x9548, 0x9548], /* CJK Ideograph */
- [0x9549, 0x9549], /* CJK Ideograph */
- [0x954a, 0x954a], /* CJK Ideograph */
- [0x954b, 0x954b], /* CJK Ideograph */
- [0x954c, 0x954c], /* CJK Ideograph */
- [0x954d, 0x954d], /* CJK Ideograph */
- [0x954e, 0x954e], /* CJK Ideograph */
- [0x954f, 0x954f], /* CJK Ideograph */
- [0x9550, 0x9550], /* CJK Ideograph */
- [0x9551, 0x9551], /* CJK Ideograph */
- [0x9552, 0x9552], /* CJK Ideograph */
- [0x9553, 0x9553], /* CJK Ideograph */
- [0x9554, 0x9554], /* CJK Ideograph */
- [0x9555, 0x9555], /* CJK Ideograph */
- [0x9556, 0x9556], /* CJK Ideograph */
- [0x9557, 0x9557], /* CJK Ideograph */
- [0x9558, 0x9558], /* CJK Ideograph */
- [0x9559, 0x9559], /* CJK Ideograph */
- [0x955a, 0x955a], /* CJK Ideograph */
- [0x955b, 0x955b], /* CJK Ideograph */
- [0x955c, 0x955c], /* CJK Ideograph */
- [0x955d, 0x955d], /* CJK Ideograph */
- [0x955e, 0x955e], /* CJK Ideograph */
- [0x955f, 0x955f], /* CJK Ideograph */
- [0x9560, 0x9560], /* CJK Ideograph */
- [0x9561, 0x9561], /* CJK Ideograph */
- [0x9562, 0x9562], /* CJK Ideograph */
- [0x9563, 0x9563], /* CJK Ideograph */
- [0x9564, 0x9564], /* CJK Ideograph */
- [0x9565, 0x9565], /* CJK Ideograph */
- [0x9566, 0x9566], /* CJK Ideograph */
- [0x9567, 0x9567], /* CJK Ideograph */
- [0x9568, 0x9568], /* CJK Ideograph */
- [0x9569, 0x9569], /* CJK Ideograph */
- [0x956a, 0x956a], /* CJK Ideograph */
- [0x956b, 0x956b], /* CJK Ideograph */
- [0x956c, 0x956c], /* CJK Ideograph */
- [0x956d, 0x956d], /* CJK Ideograph */
- [0x956e, 0x956e], /* CJK Ideograph */
- [0x956f, 0x956f], /* CJK Ideograph */
- [0x9570, 0x9570], /* CJK Ideograph */
- [0x9571, 0x9571], /* CJK Ideograph */
- [0x9572, 0x9572], /* CJK Ideograph */
- [0x9573, 0x9573], /* CJK Ideograph */
- [0x9574, 0x9574], /* CJK Ideograph */
- [0x9575, 0x9575], /* CJK Ideograph */
- [0x9576, 0x9576], /* CJK Ideograph */
- [0x9577, 0x9577], /* CJK Ideograph */
- [0x9578, 0x9578], /* CJK Ideograph */
- [0x9579, 0x9579], /* CJK Ideograph */
- [0x957a, 0x957a], /* CJK Ideograph */
- [0x957b, 0x957b], /* CJK Ideograph */
- [0x957c, 0x957c], /* CJK Ideograph */
- [0x957d, 0x957d], /* CJK Ideograph */
- [0x957e, 0x957e], /* CJK Ideograph */
- [0x957f, 0x957f], /* CJK Ideograph */
- [0x9580, 0x9580], /* CJK Ideograph */
- [0x9581, 0x9581], /* CJK Ideograph */
- [0x9582, 0x9582], /* CJK Ideograph */
- [0x9583, 0x9583], /* CJK Ideograph */
- [0x9584, 0x9584], /* CJK Ideograph */
- [0x9585, 0x9585], /* CJK Ideograph */
- [0x9586, 0x9586], /* CJK Ideograph */
- [0x9587, 0x9587], /* CJK Ideograph */
- [0x9588, 0x9588], /* CJK Ideograph */
- [0x9589, 0x9589], /* CJK Ideograph */
- [0x958a, 0x958a], /* CJK Ideograph */
- [0x958b, 0x958b], /* CJK Ideograph */
- [0x958c, 0x958c], /* CJK Ideograph */
- [0x958d, 0x958d], /* CJK Ideograph */
- [0x958e, 0x958e], /* CJK Ideograph */
- [0x958f, 0x958f], /* CJK Ideograph */
- [0x9590, 0x9590], /* CJK Ideograph */
- [0x9591, 0x9591], /* CJK Ideograph */
- [0x9592, 0x9592], /* CJK Ideograph */
- [0x9593, 0x9593], /* CJK Ideograph */
- [0x9594, 0x9594], /* CJK Ideograph */
- [0x9595, 0x9595], /* CJK Ideograph */
- [0x9596, 0x9596], /* CJK Ideograph */
- [0x9597, 0x9597], /* CJK Ideograph */
- [0x9598, 0x9598], /* CJK Ideograph */
- [0x9599, 0x9599], /* CJK Ideograph */
- [0x959a, 0x959a], /* CJK Ideograph */
- [0x959b, 0x959b], /* CJK Ideograph */
- [0x959c, 0x959c], /* CJK Ideograph */
- [0x959d, 0x959d], /* CJK Ideograph */
- [0x959e, 0x959e], /* CJK Ideograph */
- [0x959f, 0x959f], /* CJK Ideograph */
- [0x95a0, 0x95a0], /* CJK Ideograph */
- [0x95a1, 0x95a1], /* CJK Ideograph */
- [0x95a2, 0x95a2], /* CJK Ideograph */
- [0x95a3, 0x95a3], /* CJK Ideograph */
- [0x95a4, 0x95a4], /* CJK Ideograph */
- [0x95a5, 0x95a5], /* CJK Ideograph */
- [0x95a6, 0x95a6], /* CJK Ideograph */
- [0x95a7, 0x95a7], /* CJK Ideograph */
- [0x95a8, 0x95a8], /* CJK Ideograph */
- [0x95a9, 0x95a9], /* CJK Ideograph */
- [0x95aa, 0x95aa], /* CJK Ideograph */
- [0x95ab, 0x95ab], /* CJK Ideograph */
- [0x95ac, 0x95ac], /* CJK Ideograph */
- [0x95ad, 0x95ad], /* CJK Ideograph */
- [0x95ae, 0x95ae], /* CJK Ideograph */
- [0x95af, 0x95af], /* CJK Ideograph */
- [0x95b0, 0x95b0], /* CJK Ideograph */
- [0x95b1, 0x95b1], /* CJK Ideograph */
- [0x95b2, 0x95b2], /* CJK Ideograph */
- [0x95b3, 0x95b3], /* CJK Ideograph */
- [0x95b4, 0x95b4], /* CJK Ideograph */
- [0x95b5, 0x95b5], /* CJK Ideograph */
- [0x95b6, 0x95b6], /* CJK Ideograph */
- [0x95b7, 0x95b7], /* CJK Ideograph */
- [0x95b8, 0x95b8], /* CJK Ideograph */
- [0x95b9, 0x95b9], /* CJK Ideograph */
- [0x95ba, 0x95ba], /* CJK Ideograph */
- [0x95bb, 0x95bb], /* CJK Ideograph */
- [0x95bc, 0x95bc], /* CJK Ideograph */
- [0x95bd, 0x95bd], /* CJK Ideograph */
- [0x95be, 0x95be], /* CJK Ideograph */
- [0x95bf, 0x95bf], /* CJK Ideograph */
- [0x95c0, 0x95c0], /* CJK Ideograph */
- [0x95c1, 0x95c1], /* CJK Ideograph */
- [0x95c2, 0x95c2], /* CJK Ideograph */
- [0x95c3, 0x95c3], /* CJK Ideograph */
- [0x95c4, 0x95c4], /* CJK Ideograph */
- [0x95c5, 0x95c5], /* CJK Ideograph */
- [0x95c6, 0x95c6], /* CJK Ideograph */
- [0x95c7, 0x95c7], /* CJK Ideograph */
- [0x95c8, 0x95c8], /* CJK Ideograph */
- [0x95c9, 0x95c9], /* CJK Ideograph */
- [0x95ca, 0x95ca], /* CJK Ideograph */
- [0x95cb, 0x95cb], /* CJK Ideograph */
- [0x95cc, 0x95cc], /* CJK Ideograph */
- [0x95cd, 0x95cd], /* CJK Ideograph */
- [0x95ce, 0x95ce], /* CJK Ideograph */
- [0x95cf, 0x95cf], /* CJK Ideograph */
- [0x95d0, 0x95d0], /* CJK Ideograph */
- [0x95d1, 0x95d1], /* CJK Ideograph */
- [0x95d2, 0x95d2], /* CJK Ideograph */
- [0x95d3, 0x95d3], /* CJK Ideograph */
- [0x95d4, 0x95d4], /* CJK Ideograph */
- [0x95d5, 0x95d5], /* CJK Ideograph */
- [0x95d6, 0x95d6], /* CJK Ideograph */
- [0x95d7, 0x95d7], /* CJK Ideograph */
- [0x95d8, 0x95d8], /* CJK Ideograph */
- [0x95d9, 0x95d9], /* CJK Ideograph */
- [0x95da, 0x95da], /* CJK Ideograph */
- [0x95db, 0x95db], /* CJK Ideograph */
- [0x95dc, 0x95dc], /* CJK Ideograph */
- [0x95dd, 0x95dd], /* CJK Ideograph */
- [0x95de, 0x95de], /* CJK Ideograph */
- [0x95df, 0x95df], /* CJK Ideograph */
- [0x95e0, 0x95e0], /* CJK Ideograph */
- [0x95e1, 0x95e1], /* CJK Ideograph */
- [0x95e2, 0x95e2], /* CJK Ideograph */
- [0x95e3, 0x95e3], /* CJK Ideograph */
- [0x95e4, 0x95e4], /* CJK Ideograph */
- [0x95e5, 0x95e5], /* CJK Ideograph */
- [0x95e6, 0x95e6], /* CJK Ideograph */
- [0x95e7, 0x95e7], /* CJK Ideograph */
- [0x95e8, 0x95e8], /* CJK Ideograph */
- [0x95e9, 0x95e9], /* CJK Ideograph */
- [0x95ea, 0x95ea], /* CJK Ideograph */
- [0x95eb, 0x95eb], /* CJK Ideograph */
- [0x95ec, 0x95ec], /* CJK Ideograph */
- [0x95ed, 0x95ed], /* CJK Ideograph */
- [0x95ee, 0x95ee], /* CJK Ideograph */
- [0x95ef, 0x95ef], /* CJK Ideograph */
- [0x95f0, 0x95f0], /* CJK Ideograph */
- [0x95f1, 0x95f1], /* CJK Ideograph */
- [0x95f2, 0x95f2], /* CJK Ideograph */
- [0x95f3, 0x95f3], /* CJK Ideograph */
- [0x95f4, 0x95f4], /* CJK Ideograph */
- [0x95f5, 0x95f5], /* CJK Ideograph */
- [0x95f6, 0x95f6], /* CJK Ideograph */
- [0x95f7, 0x95f7], /* CJK Ideograph */
- [0x95f8, 0x95f8], /* CJK Ideograph */
- [0x95f9, 0x95f9], /* CJK Ideograph */
- [0x95fa, 0x95fa], /* CJK Ideograph */
- [0x95fb, 0x95fb], /* CJK Ideograph */
- [0x95fc, 0x95fc], /* CJK Ideograph */
- [0x95fd, 0x95fd], /* CJK Ideograph */
- [0x95fe, 0x95fe], /* CJK Ideograph */
- [0x95ff, 0x95ff], /* CJK Ideograph */
- [0x9600, 0x9600], /* CJK Ideograph */
- [0x9601, 0x9601], /* CJK Ideograph */
- [0x9602, 0x9602], /* CJK Ideograph */
- [0x9603, 0x9603], /* CJK Ideograph */
- [0x9604, 0x9604], /* CJK Ideograph */
- [0x9605, 0x9605], /* CJK Ideograph */
- [0x9606, 0x9606], /* CJK Ideograph */
- [0x9607, 0x9607], /* CJK Ideograph */
- [0x9608, 0x9608], /* CJK Ideograph */
- [0x9609, 0x9609], /* CJK Ideograph */
- [0x960a, 0x960a], /* CJK Ideograph */
- [0x960b, 0x960b], /* CJK Ideograph */
- [0x960c, 0x960c], /* CJK Ideograph */
- [0x960d, 0x960d], /* CJK Ideograph */
- [0x960e, 0x960e], /* CJK Ideograph */
- [0x960f, 0x960f], /* CJK Ideograph */
- [0x9610, 0x9610], /* CJK Ideograph */
- [0x9611, 0x9611], /* CJK Ideograph */
- [0x9612, 0x9612], /* CJK Ideograph */
- [0x9613, 0x9613], /* CJK Ideograph */
- [0x9614, 0x9614], /* CJK Ideograph */
- [0x9615, 0x9615], /* CJK Ideograph */
- [0x9616, 0x9616], /* CJK Ideograph */
- [0x9617, 0x9617], /* CJK Ideograph */
- [0x9618, 0x9618], /* CJK Ideograph */
- [0x9619, 0x9619], /* CJK Ideograph */
- [0x961a, 0x961a], /* CJK Ideograph */
- [0x961b, 0x961b], /* CJK Ideograph */
- [0x961c, 0x961c], /* CJK Ideograph */
- [0x961d, 0x961d], /* CJK Ideograph */
- [0x961e, 0x961e], /* CJK Ideograph */
- [0x961f, 0x961f], /* CJK Ideograph */
- [0x9620, 0x9620], /* CJK Ideograph */
- [0x9621, 0x9621], /* CJK Ideograph */
- [0x9622, 0x9622], /* CJK Ideograph */
- [0x9623, 0x9623], /* CJK Ideograph */
- [0x9624, 0x9624], /* CJK Ideograph */
- [0x9625, 0x9625], /* CJK Ideograph */
- [0x9626, 0x9626], /* CJK Ideograph */
- [0x9627, 0x9627], /* CJK Ideograph */
- [0x9628, 0x9628], /* CJK Ideograph */
- [0x9629, 0x9629], /* CJK Ideograph */
- [0x962a, 0x962a], /* CJK Ideograph */
- [0x962b, 0x962b], /* CJK Ideograph */
- [0x962c, 0x962c], /* CJK Ideograph */
- [0x962d, 0x962d], /* CJK Ideograph */
- [0x962e, 0x962e], /* CJK Ideograph */
- [0x962f, 0x962f], /* CJK Ideograph */
- [0x9630, 0x9630], /* CJK Ideograph */
- [0x9631, 0x9631], /* CJK Ideograph */
- [0x9632, 0x9632], /* CJK Ideograph */
- [0x9633, 0x9633], /* CJK Ideograph */
- [0x9634, 0x9634], /* CJK Ideograph */
- [0x9635, 0x9635], /* CJK Ideograph */
- [0x9636, 0x9636], /* CJK Ideograph */
- [0x9637, 0x9637], /* CJK Ideograph */
- [0x9638, 0x9638], /* CJK Ideograph */
- [0x9639, 0x9639], /* CJK Ideograph */
- [0x963a, 0x963a], /* CJK Ideograph */
- [0x963b, 0x963b], /* CJK Ideograph */
- [0x963c, 0x963c], /* CJK Ideograph */
- [0x963d, 0x963d], /* CJK Ideograph */
- [0x963e, 0x963e], /* CJK Ideograph */
- [0x963f, 0x963f], /* CJK Ideograph */
- [0x9640, 0x9640], /* CJK Ideograph */
- [0x9641, 0x9641], /* CJK Ideograph */
- [0x9642, 0x9642], /* CJK Ideograph */
- [0x9643, 0x9643], /* CJK Ideograph */
- [0x9644, 0x9644], /* CJK Ideograph */
- [0x9645, 0x9645], /* CJK Ideograph */
- [0x9646, 0x9646], /* CJK Ideograph */
- [0x9647, 0x9647], /* CJK Ideograph */
- [0x9648, 0x9648], /* CJK Ideograph */
- [0x9649, 0x9649], /* CJK Ideograph */
- [0x964a, 0x964a], /* CJK Ideograph */
- [0x964b, 0x964b], /* CJK Ideograph */
- [0x964c, 0x964c], /* CJK Ideograph */
- [0x964d, 0x964d], /* CJK Ideograph */
- [0x964e, 0x964e], /* CJK Ideograph */
- [0x964f, 0x964f], /* CJK Ideograph */
- [0x9650, 0x9650], /* CJK Ideograph */
- [0x9651, 0x9651], /* CJK Ideograph */
- [0x9652, 0x9652], /* CJK Ideograph */
- [0x9653, 0x9653], /* CJK Ideograph */
- [0x9654, 0x9654], /* CJK Ideograph */
- [0x9655, 0x9655], /* CJK Ideograph */
- [0x9656, 0x9656], /* CJK Ideograph */
- [0x9657, 0x9657], /* CJK Ideograph */
- [0x9658, 0x9658], /* CJK Ideograph */
- [0x9659, 0x9659], /* CJK Ideograph */
- [0x965a, 0x965a], /* CJK Ideograph */
- [0x965b, 0x965b], /* CJK Ideograph */
- [0x965c, 0x965c], /* CJK Ideograph */
- [0x965d, 0x965d], /* CJK Ideograph */
- [0x965e, 0x965e], /* CJK Ideograph */
- [0x965f, 0x965f], /* CJK Ideograph */
- [0x9660, 0x9660], /* CJK Ideograph */
- [0x9661, 0x9661], /* CJK Ideograph */
- [0x9662, 0x9662], /* CJK Ideograph */
- [0x9663, 0x9663], /* CJK Ideograph */
- [0x9664, 0x9664], /* CJK Ideograph */
- [0x9665, 0x9665], /* CJK Ideograph */
- [0x9666, 0x9666], /* CJK Ideograph */
- [0x9667, 0x9667], /* CJK Ideograph */
- [0x9668, 0x9668], /* CJK Ideograph */
- [0x9669, 0x9669], /* CJK Ideograph */
- [0x966a, 0x966a], /* CJK Ideograph */
- [0x966b, 0x966b], /* CJK Ideograph */
- [0x966c, 0x966c], /* CJK Ideograph */
- [0x966d, 0x966d], /* CJK Ideograph */
- [0x966e, 0x966e], /* CJK Ideograph */
- [0x966f, 0x966f], /* CJK Ideograph */
- [0x9670, 0x9670], /* CJK Ideograph */
- [0x9671, 0x9671], /* CJK Ideograph */
- [0x9672, 0x9672], /* CJK Ideograph */
- [0x9673, 0x9673], /* CJK Ideograph */
- [0x9674, 0x9674], /* CJK Ideograph */
- [0x9675, 0x9675], /* CJK Ideograph */
- [0x9676, 0x9676], /* CJK Ideograph */
- [0x9677, 0x9677], /* CJK Ideograph */
- [0x9678, 0x9678], /* CJK Ideograph */
- [0x9679, 0x9679], /* CJK Ideograph */
- [0x967a, 0x967a], /* CJK Ideograph */
- [0x967b, 0x967b], /* CJK Ideograph */
- [0x967c, 0x967c], /* CJK Ideograph */
- [0x967d, 0x967d], /* CJK Ideograph */
- [0x967e, 0x967e], /* CJK Ideograph */
- [0x967f, 0x967f], /* CJK Ideograph */
- [0x9680, 0x9680], /* CJK Ideograph */
- [0x9681, 0x9681], /* CJK Ideograph */
- [0x9682, 0x9682], /* CJK Ideograph */
- [0x9683, 0x9683], /* CJK Ideograph */
- [0x9684, 0x9684], /* CJK Ideograph */
- [0x9685, 0x9685], /* CJK Ideograph */
- [0x9686, 0x9686], /* CJK Ideograph */
- [0x9687, 0x9687], /* CJK Ideograph */
- [0x9688, 0x9688], /* CJK Ideograph */
- [0x9689, 0x9689], /* CJK Ideograph */
- [0x968a, 0x968a], /* CJK Ideograph */
- [0x968b, 0x968b], /* CJK Ideograph */
- [0x968c, 0x968c], /* CJK Ideograph */
- [0x968d, 0x968d], /* CJK Ideograph */
- [0x968e, 0x968e], /* CJK Ideograph */
- [0x968f, 0x968f], /* CJK Ideograph */
- [0x9690, 0x9690], /* CJK Ideograph */
- [0x9691, 0x9691], /* CJK Ideograph */
- [0x9692, 0x9692], /* CJK Ideograph */
- [0x9693, 0x9693], /* CJK Ideograph */
- [0x9694, 0x9694], /* CJK Ideograph */
- [0x9695, 0x9695], /* CJK Ideograph */
- [0x9696, 0x9696], /* CJK Ideograph */
- [0x9697, 0x9697], /* CJK Ideograph */
- [0x9698, 0x9698], /* CJK Ideograph */
- [0x9699, 0x9699], /* CJK Ideograph */
- [0x969a, 0x969a], /* CJK Ideograph */
- [0x969b, 0x969b], /* CJK Ideograph */
- [0x969c, 0x969c], /* CJK Ideograph */
- [0x969d, 0x969d], /* CJK Ideograph */
- [0x969e, 0x969e], /* CJK Ideograph */
- [0x969f, 0x969f], /* CJK Ideograph */
- [0x96a0, 0x96a0], /* CJK Ideograph */
- [0x96a1, 0x96a1], /* CJK Ideograph */
- [0x96a2, 0x96a2], /* CJK Ideograph */
- [0x96a3, 0x96a3], /* CJK Ideograph */
- [0x96a4, 0x96a4], /* CJK Ideograph */
- [0x96a5, 0x96a5], /* CJK Ideograph */
- [0x96a6, 0x96a6], /* CJK Ideograph */
- [0x96a7, 0x96a7], /* CJK Ideograph */
- [0x96a8, 0x96a8], /* CJK Ideograph */
- [0x96a9, 0x96a9], /* CJK Ideograph */
- [0x96aa, 0x96aa], /* CJK Ideograph */
- [0x96ab, 0x96ab], /* CJK Ideograph */
- [0x96ac, 0x96ac], /* CJK Ideograph */
- [0x96ad, 0x96ad], /* CJK Ideograph */
- [0x96ae, 0x96ae], /* CJK Ideograph */
- [0x96af, 0x96af], /* CJK Ideograph */
- [0x96b0, 0x96b0], /* CJK Ideograph */
- [0x96b1, 0x96b1], /* CJK Ideograph */
- [0x96b2, 0x96b2], /* CJK Ideograph */
- [0x96b3, 0x96b3], /* CJK Ideograph */
- [0x96b4, 0x96b4], /* CJK Ideograph */
- [0x96b5, 0x96b5], /* CJK Ideograph */
- [0x96b6, 0x96b6], /* CJK Ideograph */
- [0x96b7, 0x96b7], /* CJK Ideograph */
- [0x96b8, 0x96b8], /* CJK Ideograph */
- [0x96b9, 0x96b9], /* CJK Ideograph */
- [0x96ba, 0x96ba], /* CJK Ideograph */
- [0x96bb, 0x96bb], /* CJK Ideograph */
- [0x96bc, 0x96bc], /* CJK Ideograph */
- [0x96bd, 0x96bd], /* CJK Ideograph */
- [0x96be, 0x96be], /* CJK Ideograph */
- [0x96bf, 0x96bf], /* CJK Ideograph */
- [0x96c0, 0x96c0], /* CJK Ideograph */
- [0x96c1, 0x96c1], /* CJK Ideograph */
- [0x96c2, 0x96c2], /* CJK Ideograph */
- [0x96c3, 0x96c3], /* CJK Ideograph */
- [0x96c4, 0x96c4], /* CJK Ideograph */
- [0x96c5, 0x96c5], /* CJK Ideograph */
- [0x96c6, 0x96c6], /* CJK Ideograph */
- [0x96c7, 0x96c7], /* CJK Ideograph */
- [0x96c8, 0x96c8], /* CJK Ideograph */
- [0x96c9, 0x96c9], /* CJK Ideograph */
- [0x96ca, 0x96ca], /* CJK Ideograph */
- [0x96cb, 0x96cb], /* CJK Ideograph */
- [0x96cc, 0x96cc], /* CJK Ideograph */
- [0x96cd, 0x96cd], /* CJK Ideograph */
- [0x96ce, 0x96ce], /* CJK Ideograph */
- [0x96cf, 0x96cf], /* CJK Ideograph */
- [0x96d0, 0x96d0], /* CJK Ideograph */
- [0x96d1, 0x96d1], /* CJK Ideograph */
- [0x96d2, 0x96d2], /* CJK Ideograph */
- [0x96d3, 0x96d3], /* CJK Ideograph */
- [0x96d4, 0x96d4], /* CJK Ideograph */
- [0x96d5, 0x96d5], /* CJK Ideograph */
- [0x96d6, 0x96d6], /* CJK Ideograph */
- [0x96d7, 0x96d7], /* CJK Ideograph */
- [0x96d8, 0x96d8], /* CJK Ideograph */
- [0x96d9, 0x96d9], /* CJK Ideograph */
- [0x96da, 0x96da], /* CJK Ideograph */
- [0x96db, 0x96db], /* CJK Ideograph */
- [0x96dc, 0x96dc], /* CJK Ideograph */
- [0x96dd, 0x96dd], /* CJK Ideograph */
- [0x96de, 0x96de], /* CJK Ideograph */
- [0x96df, 0x96df], /* CJK Ideograph */
- [0x96e0, 0x96e0], /* CJK Ideograph */
- [0x96e1, 0x96e1], /* CJK Ideograph */
- [0x96e2, 0x96e2], /* CJK Ideograph */
- [0x96e3, 0x96e3], /* CJK Ideograph */
- [0x96e4, 0x96e4], /* CJK Ideograph */
- [0x96e5, 0x96e5], /* CJK Ideograph */
- [0x96e6, 0x96e6], /* CJK Ideograph */
- [0x96e7, 0x96e7], /* CJK Ideograph */
- [0x96e8, 0x96e8], /* CJK Ideograph */
- [0x96e9, 0x96e9], /* CJK Ideograph */
- [0x96ea, 0x96ea], /* CJK Ideograph */
- [0x96eb, 0x96eb], /* CJK Ideograph */
- [0x96ec, 0x96ec], /* CJK Ideograph */
- [0x96ed, 0x96ed], /* CJK Ideograph */
- [0x96ee, 0x96ee], /* CJK Ideograph */
- [0x96ef, 0x96ef], /* CJK Ideograph */
- [0x96f0, 0x96f0], /* CJK Ideograph */
- [0x96f1, 0x96f1], /* CJK Ideograph */
- [0x96f2, 0x96f2], /* CJK Ideograph */
- [0x96f3, 0x96f3], /* CJK Ideograph */
- [0x96f4, 0x96f4], /* CJK Ideograph */
- [0x96f5, 0x96f5], /* CJK Ideograph */
- [0x96f6, 0x96f6], /* CJK Ideograph */
- [0x96f7, 0x96f7], /* CJK Ideograph */
- [0x96f8, 0x96f8], /* CJK Ideograph */
- [0x96f9, 0x96f9], /* CJK Ideograph */
- [0x96fa, 0x96fa], /* CJK Ideograph */
- [0x96fb, 0x96fb], /* CJK Ideograph */
- [0x96fc, 0x96fc], /* CJK Ideograph */
- [0x96fd, 0x96fd], /* CJK Ideograph */
- [0x96fe, 0x96fe], /* CJK Ideograph */
- [0x96ff, 0x96ff], /* CJK Ideograph */
- [0x9700, 0x9700], /* CJK Ideograph */
- [0x9701, 0x9701], /* CJK Ideograph */
- [0x9702, 0x9702], /* CJK Ideograph */
- [0x9703, 0x9703], /* CJK Ideograph */
- [0x9704, 0x9704], /* CJK Ideograph */
- [0x9705, 0x9705], /* CJK Ideograph */
- [0x9706, 0x9706], /* CJK Ideograph */
- [0x9707, 0x9707], /* CJK Ideograph */
- [0x9708, 0x9708], /* CJK Ideograph */
- [0x9709, 0x9709], /* CJK Ideograph */
- [0x970a, 0x970a], /* CJK Ideograph */
- [0x970b, 0x970b], /* CJK Ideograph */
- [0x970c, 0x970c], /* CJK Ideograph */
- [0x970d, 0x970d], /* CJK Ideograph */
- [0x970e, 0x970e], /* CJK Ideograph */
- [0x970f, 0x970f], /* CJK Ideograph */
- [0x9710, 0x9710], /* CJK Ideograph */
- [0x9711, 0x9711], /* CJK Ideograph */
- [0x9712, 0x9712], /* CJK Ideograph */
- [0x9713, 0x9713], /* CJK Ideograph */
- [0x9714, 0x9714], /* CJK Ideograph */
- [0x9715, 0x9715], /* CJK Ideograph */
- [0x9716, 0x9716], /* CJK Ideograph */
- [0x9717, 0x9717], /* CJK Ideograph */
- [0x9718, 0x9718], /* CJK Ideograph */
- [0x9719, 0x9719], /* CJK Ideograph */
- [0x971a, 0x971a], /* CJK Ideograph */
- [0x971b, 0x971b], /* CJK Ideograph */
- [0x971c, 0x971c], /* CJK Ideograph */
- [0x971d, 0x971d], /* CJK Ideograph */
- [0x971e, 0x971e], /* CJK Ideograph */
- [0x971f, 0x971f], /* CJK Ideograph */
- [0x9720, 0x9720], /* CJK Ideograph */
- [0x9721, 0x9721], /* CJK Ideograph */
- [0x9722, 0x9722], /* CJK Ideograph */
- [0x9723, 0x9723], /* CJK Ideograph */
- [0x9724, 0x9724], /* CJK Ideograph */
- [0x9725, 0x9725], /* CJK Ideograph */
- [0x9726, 0x9726], /* CJK Ideograph */
- [0x9727, 0x9727], /* CJK Ideograph */
- [0x9728, 0x9728], /* CJK Ideograph */
- [0x9729, 0x9729], /* CJK Ideograph */
- [0x972a, 0x972a], /* CJK Ideograph */
- [0x972b, 0x972b], /* CJK Ideograph */
- [0x972c, 0x972c], /* CJK Ideograph */
- [0x972d, 0x972d], /* CJK Ideograph */
- [0x972e, 0x972e], /* CJK Ideograph */
- [0x972f, 0x972f], /* CJK Ideograph */
- [0x9730, 0x9730], /* CJK Ideograph */
- [0x9731, 0x9731], /* CJK Ideograph */
- [0x9732, 0x9732], /* CJK Ideograph */
- [0x9733, 0x9733], /* CJK Ideograph */
- [0x9734, 0x9734], /* CJK Ideograph */
- [0x9735, 0x9735], /* CJK Ideograph */
- [0x9736, 0x9736], /* CJK Ideograph */
- [0x9737, 0x9737], /* CJK Ideograph */
- [0x9738, 0x9738], /* CJK Ideograph */
- [0x9739, 0x9739], /* CJK Ideograph */
- [0x973a, 0x973a], /* CJK Ideograph */
- [0x973b, 0x973b], /* CJK Ideograph */
- [0x973c, 0x973c], /* CJK Ideograph */
- [0x973d, 0x973d], /* CJK Ideograph */
- [0x973e, 0x973e], /* CJK Ideograph */
- [0x973f, 0x973f], /* CJK Ideograph */
- [0x9740, 0x9740], /* CJK Ideograph */
- [0x9741, 0x9741], /* CJK Ideograph */
- [0x9742, 0x9742], /* CJK Ideograph */
- [0x9743, 0x9743], /* CJK Ideograph */
- [0x9744, 0x9744], /* CJK Ideograph */
- [0x9745, 0x9745], /* CJK Ideograph */
- [0x9746, 0x9746], /* CJK Ideograph */
- [0x9747, 0x9747], /* CJK Ideograph */
- [0x9748, 0x9748], /* CJK Ideograph */
- [0x9749, 0x9749], /* CJK Ideograph */
- [0x974a, 0x974a], /* CJK Ideograph */
- [0x974b, 0x974b], /* CJK Ideograph */
- [0x974c, 0x974c], /* CJK Ideograph */
- [0x974d, 0x974d], /* CJK Ideograph */
- [0x974e, 0x974e], /* CJK Ideograph */
- [0x974f, 0x974f], /* CJK Ideograph */
- [0x9750, 0x9750], /* CJK Ideograph */
- [0x9751, 0x9751], /* CJK Ideograph */
- [0x9752, 0x9752], /* CJK Ideograph */
- [0x9753, 0x9753], /* CJK Ideograph */
- [0x9754, 0x9754], /* CJK Ideograph */
- [0x9755, 0x9755], /* CJK Ideograph */
- [0x9756, 0x9756], /* CJK Ideograph */
- [0x9757, 0x9757], /* CJK Ideograph */
- [0x9758, 0x9758], /* CJK Ideograph */
- [0x9759, 0x9759], /* CJK Ideograph */
- [0x975a, 0x975a], /* CJK Ideograph */
- [0x975b, 0x975b], /* CJK Ideograph */
- [0x975c, 0x975c], /* CJK Ideograph */
- [0x975d, 0x975d], /* CJK Ideograph */
- [0x975e, 0x975e], /* CJK Ideograph */
- [0x975f, 0x975f], /* CJK Ideograph */
- [0x9760, 0x9760], /* CJK Ideograph */
- [0x9761, 0x9761], /* CJK Ideograph */
- [0x9762, 0x9762], /* CJK Ideograph */
- [0x9763, 0x9763], /* CJK Ideograph */
- [0x9764, 0x9764], /* CJK Ideograph */
- [0x9765, 0x9765], /* CJK Ideograph */
- [0x9766, 0x9766], /* CJK Ideograph */
- [0x9767, 0x9767], /* CJK Ideograph */
- [0x9768, 0x9768], /* CJK Ideograph */
- [0x9769, 0x9769], /* CJK Ideograph */
- [0x976a, 0x976a], /* CJK Ideograph */
- [0x976b, 0x976b], /* CJK Ideograph */
- [0x976c, 0x976c], /* CJK Ideograph */
- [0x976d, 0x976d], /* CJK Ideograph */
- [0x976e, 0x976e], /* CJK Ideograph */
- [0x976f, 0x976f], /* CJK Ideograph */
- [0x9770, 0x9770], /* CJK Ideograph */
- [0x9771, 0x9771], /* CJK Ideograph */
- [0x9772, 0x9772], /* CJK Ideograph */
- [0x9773, 0x9773], /* CJK Ideograph */
- [0x9774, 0x9774], /* CJK Ideograph */
- [0x9775, 0x9775], /* CJK Ideograph */
- [0x9776, 0x9776], /* CJK Ideograph */
- [0x9777, 0x9777], /* CJK Ideograph */
- [0x9778, 0x9778], /* CJK Ideograph */
- [0x9779, 0x9779], /* CJK Ideograph */
- [0x977a, 0x977a], /* CJK Ideograph */
- [0x977b, 0x977b], /* CJK Ideograph */
- [0x977c, 0x977c], /* CJK Ideograph */
- [0x977d, 0x977d], /* CJK Ideograph */
- [0x977e, 0x977e], /* CJK Ideograph */
- [0x977f, 0x977f], /* CJK Ideograph */
- [0x9780, 0x9780], /* CJK Ideograph */
- [0x9781, 0x9781], /* CJK Ideograph */
- [0x9782, 0x9782], /* CJK Ideograph */
- [0x9783, 0x9783], /* CJK Ideograph */
- [0x9784, 0x9784], /* CJK Ideograph */
- [0x9785, 0x9785], /* CJK Ideograph */
- [0x9786, 0x9786], /* CJK Ideograph */
- [0x9787, 0x9787], /* CJK Ideograph */
- [0x9788, 0x9788], /* CJK Ideograph */
- [0x9789, 0x9789], /* CJK Ideograph */
- [0x978a, 0x978a], /* CJK Ideograph */
- [0x978b, 0x978b], /* CJK Ideograph */
- [0x978c, 0x978c], /* CJK Ideograph */
- [0x978d, 0x978d], /* CJK Ideograph */
- [0x978e, 0x978e], /* CJK Ideograph */
- [0x978f, 0x978f], /* CJK Ideograph */
- [0x9790, 0x9790], /* CJK Ideograph */
- [0x9791, 0x9791], /* CJK Ideograph */
- [0x9792, 0x9792], /* CJK Ideograph */
- [0x9793, 0x9793], /* CJK Ideograph */
- [0x9794, 0x9794], /* CJK Ideograph */
- [0x9795, 0x9795], /* CJK Ideograph */
- [0x9796, 0x9796], /* CJK Ideograph */
- [0x9797, 0x9797], /* CJK Ideograph */
- [0x9798, 0x9798], /* CJK Ideograph */
- [0x9799, 0x9799], /* CJK Ideograph */
- [0x979a, 0x979a], /* CJK Ideograph */
- [0x979b, 0x979b], /* CJK Ideograph */
- [0x979c, 0x979c], /* CJK Ideograph */
- [0x979d, 0x979d], /* CJK Ideograph */
- [0x979e, 0x979e], /* CJK Ideograph */
- [0x979f, 0x979f], /* CJK Ideograph */
- [0x97a0, 0x97a0], /* CJK Ideograph */
- [0x97a1, 0x97a1], /* CJK Ideograph */
- [0x97a2, 0x97a2], /* CJK Ideograph */
- [0x97a3, 0x97a3], /* CJK Ideograph */
- [0x97a4, 0x97a4], /* CJK Ideograph */
- [0x97a5, 0x97a5], /* CJK Ideograph */
- [0x97a6, 0x97a6], /* CJK Ideograph */
- [0x97a7, 0x97a7], /* CJK Ideograph */
- [0x97a8, 0x97a8], /* CJK Ideograph */
- [0x97a9, 0x97a9], /* CJK Ideograph */
- [0x97aa, 0x97aa], /* CJK Ideograph */
- [0x97ab, 0x97ab], /* CJK Ideograph */
- [0x97ac, 0x97ac], /* CJK Ideograph */
- [0x97ad, 0x97ad], /* CJK Ideograph */
- [0x97ae, 0x97ae], /* CJK Ideograph */
- [0x97af, 0x97af], /* CJK Ideograph */
- [0x97b0, 0x97b0], /* CJK Ideograph */
- [0x97b1, 0x97b1], /* CJK Ideograph */
- [0x97b2, 0x97b2], /* CJK Ideograph */
- [0x97b3, 0x97b3], /* CJK Ideograph */
- [0x97b4, 0x97b4], /* CJK Ideograph */
- [0x97b5, 0x97b5], /* CJK Ideograph */
- [0x97b6, 0x97b6], /* CJK Ideograph */
- [0x97b7, 0x97b7], /* CJK Ideograph */
- [0x97b8, 0x97b8], /* CJK Ideograph */
- [0x97b9, 0x97b9], /* CJK Ideograph */
- [0x97ba, 0x97ba], /* CJK Ideograph */
- [0x97bb, 0x97bb], /* CJK Ideograph */
- [0x97bc, 0x97bc], /* CJK Ideograph */
- [0x97bd, 0x97bd], /* CJK Ideograph */
- [0x97be, 0x97be], /* CJK Ideograph */
- [0x97bf, 0x97bf], /* CJK Ideograph */
- [0x97c0, 0x97c0], /* CJK Ideograph */
- [0x97c1, 0x97c1], /* CJK Ideograph */
- [0x97c2, 0x97c2], /* CJK Ideograph */
- [0x97c3, 0x97c3], /* CJK Ideograph */
- [0x97c4, 0x97c4], /* CJK Ideograph */
- [0x97c5, 0x97c5], /* CJK Ideograph */
- [0x97c6, 0x97c6], /* CJK Ideograph */
- [0x97c7, 0x97c7], /* CJK Ideograph */
- [0x97c8, 0x97c8], /* CJK Ideograph */
- [0x97c9, 0x97c9], /* CJK Ideograph */
- [0x97ca, 0x97ca], /* CJK Ideograph */
- [0x97cb, 0x97cb], /* CJK Ideograph */
- [0x97cc, 0x97cc], /* CJK Ideograph */
- [0x97cd, 0x97cd], /* CJK Ideograph */
- [0x97ce, 0x97ce], /* CJK Ideograph */
- [0x97cf, 0x97cf], /* CJK Ideograph */
- [0x97d0, 0x97d0], /* CJK Ideograph */
- [0x97d1, 0x97d1], /* CJK Ideograph */
- [0x97d2, 0x97d2], /* CJK Ideograph */
- [0x97d3, 0x97d3], /* CJK Ideograph */
- [0x97d4, 0x97d4], /* CJK Ideograph */
- [0x97d5, 0x97d5], /* CJK Ideograph */
- [0x97d6, 0x97d6], /* CJK Ideograph */
- [0x97d7, 0x97d7], /* CJK Ideograph */
- [0x97d8, 0x97d8], /* CJK Ideograph */
- [0x97d9, 0x97d9], /* CJK Ideograph */
- [0x97da, 0x97da], /* CJK Ideograph */
- [0x97db, 0x97db], /* CJK Ideograph */
- [0x97dc, 0x97dc], /* CJK Ideograph */
- [0x97dd, 0x97dd], /* CJK Ideograph */
- [0x97de, 0x97de], /* CJK Ideograph */
- [0x97df, 0x97df], /* CJK Ideograph */
- [0x97e0, 0x97e0], /* CJK Ideograph */
- [0x97e1, 0x97e1], /* CJK Ideograph */
- [0x97e2, 0x97e2], /* CJK Ideograph */
- [0x97e3, 0x97e3], /* CJK Ideograph */
- [0x97e4, 0x97e4], /* CJK Ideograph */
- [0x97e5, 0x97e5], /* CJK Ideograph */
- [0x97e6, 0x97e6], /* CJK Ideograph */
- [0x97e7, 0x97e7], /* CJK Ideograph */
- [0x97e8, 0x97e8], /* CJK Ideograph */
- [0x97e9, 0x97e9], /* CJK Ideograph */
- [0x97ea, 0x97ea], /* CJK Ideograph */
- [0x97eb, 0x97eb], /* CJK Ideograph */
- [0x97ec, 0x97ec], /* CJK Ideograph */
- [0x97ed, 0x97ed], /* CJK Ideograph */
- [0x97ee, 0x97ee], /* CJK Ideograph */
- [0x97ef, 0x97ef], /* CJK Ideograph */
- [0x97f0, 0x97f0], /* CJK Ideograph */
- [0x97f1, 0x97f1], /* CJK Ideograph */
- [0x97f2, 0x97f2], /* CJK Ideograph */
- [0x97f3, 0x97f3], /* CJK Ideograph */
- [0x97f4, 0x97f4], /* CJK Ideograph */
- [0x97f5, 0x97f5], /* CJK Ideograph */
- [0x97f6, 0x97f6], /* CJK Ideograph */
- [0x97f7, 0x97f7], /* CJK Ideograph */
- [0x97f8, 0x97f8], /* CJK Ideograph */
- [0x97f9, 0x97f9], /* CJK Ideograph */
- [0x97fa, 0x97fa], /* CJK Ideograph */
- [0x97fb, 0x97fb], /* CJK Ideograph */
- [0x97fc, 0x97fc], /* CJK Ideograph */
- [0x97fd, 0x97fd], /* CJK Ideograph */
- [0x97fe, 0x97fe], /* CJK Ideograph */
- [0x97ff, 0x97ff], /* CJK Ideograph */
- [0x9800, 0x9800], /* CJK Ideograph */
- [0x9801, 0x9801], /* CJK Ideograph */
- [0x9802, 0x9802], /* CJK Ideograph */
- [0x9803, 0x9803], /* CJK Ideograph */
- [0x9804, 0x9804], /* CJK Ideograph */
- [0x9805, 0x9805], /* CJK Ideograph */
- [0x9806, 0x9806], /* CJK Ideograph */
- [0x9807, 0x9807], /* CJK Ideograph */
- [0x9808, 0x9808], /* CJK Ideograph */
- [0x9809, 0x9809], /* CJK Ideograph */
- [0x980a, 0x980a], /* CJK Ideograph */
- [0x980b, 0x980b], /* CJK Ideograph */
- [0x980c, 0x980c], /* CJK Ideograph */
- [0x980d, 0x980d], /* CJK Ideograph */
- [0x980e, 0x980e], /* CJK Ideograph */
- [0x980f, 0x980f], /* CJK Ideograph */
- [0x9810, 0x9810], /* CJK Ideograph */
- [0x9811, 0x9811], /* CJK Ideograph */
- [0x9812, 0x9812], /* CJK Ideograph */
- [0x9813, 0x9813], /* CJK Ideograph */
- [0x9814, 0x9814], /* CJK Ideograph */
- [0x9815, 0x9815], /* CJK Ideograph */
- [0x9816, 0x9816], /* CJK Ideograph */
- [0x9817, 0x9817], /* CJK Ideograph */
- [0x9818, 0x9818], /* CJK Ideograph */
- [0x9819, 0x9819], /* CJK Ideograph */
- [0x981a, 0x981a], /* CJK Ideograph */
- [0x981b, 0x981b], /* CJK Ideograph */
- [0x981c, 0x981c], /* CJK Ideograph */
- [0x981d, 0x981d], /* CJK Ideograph */
- [0x981e, 0x981e], /* CJK Ideograph */
- [0x981f, 0x981f], /* CJK Ideograph */
- [0x9820, 0x9820], /* CJK Ideograph */
- [0x9821, 0x9821], /* CJK Ideograph */
- [0x9822, 0x9822], /* CJK Ideograph */
- [0x9823, 0x9823], /* CJK Ideograph */
- [0x9824, 0x9824], /* CJK Ideograph */
- [0x9825, 0x9825], /* CJK Ideograph */
- [0x9826, 0x9826], /* CJK Ideograph */
- [0x9827, 0x9827], /* CJK Ideograph */
- [0x9828, 0x9828], /* CJK Ideograph */
- [0x9829, 0x9829], /* CJK Ideograph */
- [0x982a, 0x982a], /* CJK Ideograph */
- [0x982b, 0x982b], /* CJK Ideograph */
- [0x982c, 0x982c], /* CJK Ideograph */
- [0x982d, 0x982d], /* CJK Ideograph */
- [0x982e, 0x982e], /* CJK Ideograph */
- [0x982f, 0x982f], /* CJK Ideograph */
- [0x9830, 0x9830], /* CJK Ideograph */
- [0x9831, 0x9831], /* CJK Ideograph */
- [0x9832, 0x9832], /* CJK Ideograph */
- [0x9833, 0x9833], /* CJK Ideograph */
- [0x9834, 0x9834], /* CJK Ideograph */
- [0x9835, 0x9835], /* CJK Ideograph */
- [0x9836, 0x9836], /* CJK Ideograph */
- [0x9837, 0x9837], /* CJK Ideograph */
- [0x9838, 0x9838], /* CJK Ideograph */
- [0x9839, 0x9839], /* CJK Ideograph */
- [0x983a, 0x983a], /* CJK Ideograph */
- [0x983b, 0x983b], /* CJK Ideograph */
- [0x983c, 0x983c], /* CJK Ideograph */
- [0x983d, 0x983d], /* CJK Ideograph */
- [0x983e, 0x983e], /* CJK Ideograph */
- [0x983f, 0x983f], /* CJK Ideograph */
- [0x9840, 0x9840], /* CJK Ideograph */
- [0x9841, 0x9841], /* CJK Ideograph */
- [0x9842, 0x9842], /* CJK Ideograph */
- [0x9843, 0x9843], /* CJK Ideograph */
- [0x9844, 0x9844], /* CJK Ideograph */
- [0x9845, 0x9845], /* CJK Ideograph */
- [0x9846, 0x9846], /* CJK Ideograph */
- [0x9847, 0x9847], /* CJK Ideograph */
- [0x9848, 0x9848], /* CJK Ideograph */
- [0x9849, 0x9849], /* CJK Ideograph */
- [0x984a, 0x984a], /* CJK Ideograph */
- [0x984b, 0x984b], /* CJK Ideograph */
- [0x984c, 0x984c], /* CJK Ideograph */
- [0x984d, 0x984d], /* CJK Ideograph */
- [0x984e, 0x984e], /* CJK Ideograph */
- [0x984f, 0x984f], /* CJK Ideograph */
- [0x9850, 0x9850], /* CJK Ideograph */
- [0x9851, 0x9851], /* CJK Ideograph */
- [0x9852, 0x9852], /* CJK Ideograph */
- [0x9853, 0x9853], /* CJK Ideograph */
- [0x9854, 0x9854], /* CJK Ideograph */
- [0x9855, 0x9855], /* CJK Ideograph */
- [0x9856, 0x9856], /* CJK Ideograph */
- [0x9857, 0x9857], /* CJK Ideograph */
- [0x9858, 0x9858], /* CJK Ideograph */
- [0x9859, 0x9859], /* CJK Ideograph */
- [0x985a, 0x985a], /* CJK Ideograph */
- [0x985b, 0x985b], /* CJK Ideograph */
- [0x985c, 0x985c], /* CJK Ideograph */
- [0x985d, 0x985d], /* CJK Ideograph */
- [0x985e, 0x985e], /* CJK Ideograph */
- [0x985f, 0x985f], /* CJK Ideograph */
- [0x9860, 0x9860], /* CJK Ideograph */
- [0x9861, 0x9861], /* CJK Ideograph */
- [0x9862, 0x9862], /* CJK Ideograph */
- [0x9863, 0x9863], /* CJK Ideograph */
- [0x9864, 0x9864], /* CJK Ideograph */
- [0x9865, 0x9865], /* CJK Ideograph */
- [0x9866, 0x9866], /* CJK Ideograph */
- [0x9867, 0x9867], /* CJK Ideograph */
- [0x9868, 0x9868], /* CJK Ideograph */
- [0x9869, 0x9869], /* CJK Ideograph */
- [0x986a, 0x986a], /* CJK Ideograph */
- [0x986b, 0x986b], /* CJK Ideograph */
- [0x986c, 0x986c], /* CJK Ideograph */
- [0x986d, 0x986d], /* CJK Ideograph */
- [0x986e, 0x986e], /* CJK Ideograph */
- [0x986f, 0x986f], /* CJK Ideograph */
- [0x9870, 0x9870], /* CJK Ideograph */
- [0x9871, 0x9871], /* CJK Ideograph */
- [0x9872, 0x9872], /* CJK Ideograph */
- [0x9873, 0x9873], /* CJK Ideograph */
- [0x9874, 0x9874], /* CJK Ideograph */
- [0x9875, 0x9875], /* CJK Ideograph */
- [0x9876, 0x9876], /* CJK Ideograph */
- [0x9877, 0x9877], /* CJK Ideograph */
- [0x9878, 0x9878], /* CJK Ideograph */
- [0x9879, 0x9879], /* CJK Ideograph */
- [0x987a, 0x987a], /* CJK Ideograph */
- [0x987b, 0x987b], /* CJK Ideograph */
- [0x987c, 0x987c], /* CJK Ideograph */
- [0x987d, 0x987d], /* CJK Ideograph */
- [0x987e, 0x987e], /* CJK Ideograph */
- [0x987f, 0x987f], /* CJK Ideograph */
- [0x9880, 0x9880], /* CJK Ideograph */
- [0x9881, 0x9881], /* CJK Ideograph */
- [0x9882, 0x9882], /* CJK Ideograph */
- [0x9883, 0x9883], /* CJK Ideograph */
- [0x9884, 0x9884], /* CJK Ideograph */
- [0x9885, 0x9885], /* CJK Ideograph */
- [0x9886, 0x9886], /* CJK Ideograph */
- [0x9887, 0x9887], /* CJK Ideograph */
- [0x9888, 0x9888], /* CJK Ideograph */
- [0x9889, 0x9889], /* CJK Ideograph */
- [0x988a, 0x988a], /* CJK Ideograph */
- [0x988b, 0x988b], /* CJK Ideograph */
- [0x988c, 0x988c], /* CJK Ideograph */
- [0x988d, 0x988d], /* CJK Ideograph */
- [0x988e, 0x988e], /* CJK Ideograph */
- [0x988f, 0x988f], /* CJK Ideograph */
- [0x9890, 0x9890], /* CJK Ideograph */
- [0x9891, 0x9891], /* CJK Ideograph */
- [0x9892, 0x9892], /* CJK Ideograph */
- [0x9893, 0x9893], /* CJK Ideograph */
- [0x9894, 0x9894], /* CJK Ideograph */
- [0x9895, 0x9895], /* CJK Ideograph */
- [0x9896, 0x9896], /* CJK Ideograph */
- [0x9897, 0x9897], /* CJK Ideograph */
- [0x9898, 0x9898], /* CJK Ideograph */
- [0x9899, 0x9899], /* CJK Ideograph */
- [0x989a, 0x989a], /* CJK Ideograph */
- [0x989b, 0x989b], /* CJK Ideograph */
- [0x989c, 0x989c], /* CJK Ideograph */
- [0x989d, 0x989d], /* CJK Ideograph */
- [0x989e, 0x989e], /* CJK Ideograph */
- [0x989f, 0x989f], /* CJK Ideograph */
- [0x98a0, 0x98a0], /* CJK Ideograph */
- [0x98a1, 0x98a1], /* CJK Ideograph */
- [0x98a2, 0x98a2], /* CJK Ideograph */
- [0x98a3, 0x98a3], /* CJK Ideograph */
- [0x98a4, 0x98a4], /* CJK Ideograph */
- [0x98a5, 0x98a5], /* CJK Ideograph */
- [0x98a6, 0x98a6], /* CJK Ideograph */
- [0x98a7, 0x98a7], /* CJK Ideograph */
- [0x98a8, 0x98a8], /* CJK Ideograph */
- [0x98a9, 0x98a9], /* CJK Ideograph */
- [0x98aa, 0x98aa], /* CJK Ideograph */
- [0x98ab, 0x98ab], /* CJK Ideograph */
- [0x98ac, 0x98ac], /* CJK Ideograph */
- [0x98ad, 0x98ad], /* CJK Ideograph */
- [0x98ae, 0x98ae], /* CJK Ideograph */
- [0x98af, 0x98af], /* CJK Ideograph */
- [0x98b0, 0x98b0], /* CJK Ideograph */
- [0x98b1, 0x98b1], /* CJK Ideograph */
- [0x98b2, 0x98b2], /* CJK Ideograph */
- [0x98b3, 0x98b3], /* CJK Ideograph */
- [0x98b4, 0x98b4], /* CJK Ideograph */
- [0x98b5, 0x98b5], /* CJK Ideograph */
- [0x98b6, 0x98b6], /* CJK Ideograph */
- [0x98b7, 0x98b7], /* CJK Ideograph */
- [0x98b8, 0x98b8], /* CJK Ideograph */
- [0x98b9, 0x98b9], /* CJK Ideograph */
- [0x98ba, 0x98ba], /* CJK Ideograph */
- [0x98bb, 0x98bb], /* CJK Ideograph */
- [0x98bc, 0x98bc], /* CJK Ideograph */
- [0x98bd, 0x98bd], /* CJK Ideograph */
- [0x98be, 0x98be], /* CJK Ideograph */
- [0x98bf, 0x98bf], /* CJK Ideograph */
- [0x98c0, 0x98c0], /* CJK Ideograph */
- [0x98c1, 0x98c1], /* CJK Ideograph */
- [0x98c2, 0x98c2], /* CJK Ideograph */
- [0x98c3, 0x98c3], /* CJK Ideograph */
- [0x98c4, 0x98c4], /* CJK Ideograph */
- [0x98c5, 0x98c5], /* CJK Ideograph */
- [0x98c6, 0x98c6], /* CJK Ideograph */
- [0x98c7, 0x98c7], /* CJK Ideograph */
- [0x98c8, 0x98c8], /* CJK Ideograph */
- [0x98c9, 0x98c9], /* CJK Ideograph */
- [0x98ca, 0x98ca], /* CJK Ideograph */
- [0x98cb, 0x98cb], /* CJK Ideograph */
- [0x98cc, 0x98cc], /* CJK Ideograph */
- [0x98cd, 0x98cd], /* CJK Ideograph */
- [0x98ce, 0x98ce], /* CJK Ideograph */
- [0x98cf, 0x98cf], /* CJK Ideograph */
- [0x98d0, 0x98d0], /* CJK Ideograph */
- [0x98d1, 0x98d1], /* CJK Ideograph */
- [0x98d2, 0x98d2], /* CJK Ideograph */
- [0x98d3, 0x98d3], /* CJK Ideograph */
- [0x98d4, 0x98d4], /* CJK Ideograph */
- [0x98d5, 0x98d5], /* CJK Ideograph */
- [0x98d6, 0x98d6], /* CJK Ideograph */
- [0x98d7, 0x98d7], /* CJK Ideograph */
- [0x98d8, 0x98d8], /* CJK Ideograph */
- [0x98d9, 0x98d9], /* CJK Ideograph */
- [0x98da, 0x98da], /* CJK Ideograph */
- [0x98db, 0x98db], /* CJK Ideograph */
- [0x98dc, 0x98dc], /* CJK Ideograph */
- [0x98dd, 0x98dd], /* CJK Ideograph */
- [0x98de, 0x98de], /* CJK Ideograph */
- [0x98df, 0x98df], /* CJK Ideograph */
- [0x98e0, 0x98e0], /* CJK Ideograph */
- [0x98e1, 0x98e1], /* CJK Ideograph */
- [0x98e2, 0x98e2], /* CJK Ideograph */
- [0x98e3, 0x98e3], /* CJK Ideograph */
- [0x98e4, 0x98e4], /* CJK Ideograph */
- [0x98e5, 0x98e5], /* CJK Ideograph */
- [0x98e6, 0x98e6], /* CJK Ideograph */
- [0x98e7, 0x98e7], /* CJK Ideograph */
- [0x98e8, 0x98e8], /* CJK Ideograph */
- [0x98e9, 0x98e9], /* CJK Ideograph */
- [0x98ea, 0x98ea], /* CJK Ideograph */
- [0x98eb, 0x98eb], /* CJK Ideograph */
- [0x98ec, 0x98ec], /* CJK Ideograph */
- [0x98ed, 0x98ed], /* CJK Ideograph */
- [0x98ee, 0x98ee], /* CJK Ideograph */
- [0x98ef, 0x98ef], /* CJK Ideograph */
- [0x98f0, 0x98f0], /* CJK Ideograph */
- [0x98f1, 0x98f1], /* CJK Ideograph */
- [0x98f2, 0x98f2], /* CJK Ideograph */
- [0x98f3, 0x98f3], /* CJK Ideograph */
- [0x98f4, 0x98f4], /* CJK Ideograph */
- [0x98f5, 0x98f5], /* CJK Ideograph */
- [0x98f6, 0x98f6], /* CJK Ideograph */
- [0x98f7, 0x98f7], /* CJK Ideograph */
- [0x98f8, 0x98f8], /* CJK Ideograph */
- [0x98f9, 0x98f9], /* CJK Ideograph */
- [0x98fa, 0x98fa], /* CJK Ideograph */
- [0x98fb, 0x98fb], /* CJK Ideograph */
- [0x98fc, 0x98fc], /* CJK Ideograph */
- [0x98fd, 0x98fd], /* CJK Ideograph */
- [0x98fe, 0x98fe], /* CJK Ideograph */
- [0x98ff, 0x98ff], /* CJK Ideograph */
- [0x9900, 0x9900], /* CJK Ideograph */
- [0x9901, 0x9901], /* CJK Ideograph */
- [0x9902, 0x9902], /* CJK Ideograph */
- [0x9903, 0x9903], /* CJK Ideograph */
- [0x9904, 0x9904], /* CJK Ideograph */
- [0x9905, 0x9905], /* CJK Ideograph */
- [0x9906, 0x9906], /* CJK Ideograph */
- [0x9907, 0x9907], /* CJK Ideograph */
- [0x9908, 0x9908], /* CJK Ideograph */
- [0x9909, 0x9909], /* CJK Ideograph */
- [0x990a, 0x990a], /* CJK Ideograph */
- [0x990b, 0x990b], /* CJK Ideograph */
- [0x990c, 0x990c], /* CJK Ideograph */
- [0x990d, 0x990d], /* CJK Ideograph */
- [0x990e, 0x990e], /* CJK Ideograph */
- [0x990f, 0x990f], /* CJK Ideograph */
- [0x9910, 0x9910], /* CJK Ideograph */
- [0x9911, 0x9911], /* CJK Ideograph */
- [0x9912, 0x9912], /* CJK Ideograph */
- [0x9913, 0x9913], /* CJK Ideograph */
- [0x9914, 0x9914], /* CJK Ideograph */
- [0x9915, 0x9915], /* CJK Ideograph */
- [0x9916, 0x9916], /* CJK Ideograph */
- [0x9917, 0x9917], /* CJK Ideograph */
- [0x9918, 0x9918], /* CJK Ideograph */
- [0x9919, 0x9919], /* CJK Ideograph */
- [0x991a, 0x991a], /* CJK Ideograph */
- [0x991b, 0x991b], /* CJK Ideograph */
- [0x991c, 0x991c], /* CJK Ideograph */
- [0x991d, 0x991d], /* CJK Ideograph */
- [0x991e, 0x991e], /* CJK Ideograph */
- [0x991f, 0x991f], /* CJK Ideograph */
- [0x9920, 0x9920], /* CJK Ideograph */
- [0x9921, 0x9921], /* CJK Ideograph */
- [0x9922, 0x9922], /* CJK Ideograph */
- [0x9923, 0x9923], /* CJK Ideograph */
- [0x9924, 0x9924], /* CJK Ideograph */
- [0x9925, 0x9925], /* CJK Ideograph */
- [0x9926, 0x9926], /* CJK Ideograph */
- [0x9927, 0x9927], /* CJK Ideograph */
- [0x9928, 0x9928], /* CJK Ideograph */
- [0x9929, 0x9929], /* CJK Ideograph */
- [0x992a, 0x992a], /* CJK Ideograph */
- [0x992b, 0x992b], /* CJK Ideograph */
- [0x992c, 0x992c], /* CJK Ideograph */
- [0x992d, 0x992d], /* CJK Ideograph */
- [0x992e, 0x992e], /* CJK Ideograph */
- [0x992f, 0x992f], /* CJK Ideograph */
- [0x9930, 0x9930], /* CJK Ideograph */
- [0x9931, 0x9931], /* CJK Ideograph */
- [0x9932, 0x9932], /* CJK Ideograph */
- [0x9933, 0x9933], /* CJK Ideograph */
- [0x9934, 0x9934], /* CJK Ideograph */
- [0x9935, 0x9935], /* CJK Ideograph */
- [0x9936, 0x9936], /* CJK Ideograph */
- [0x9937, 0x9937], /* CJK Ideograph */
- [0x9938, 0x9938], /* CJK Ideograph */
- [0x9939, 0x9939], /* CJK Ideograph */
- [0x993a, 0x993a], /* CJK Ideograph */
- [0x993b, 0x993b], /* CJK Ideograph */
- [0x993c, 0x993c], /* CJK Ideograph */
- [0x993d, 0x993d], /* CJK Ideograph */
- [0x993e, 0x993e], /* CJK Ideograph */
- [0x993f, 0x993f], /* CJK Ideograph */
- [0x9940, 0x9940], /* CJK Ideograph */
- [0x9941, 0x9941], /* CJK Ideograph */
- [0x9942, 0x9942], /* CJK Ideograph */
- [0x9943, 0x9943], /* CJK Ideograph */
- [0x9944, 0x9944], /* CJK Ideograph */
- [0x9945, 0x9945], /* CJK Ideograph */
- [0x9946, 0x9946], /* CJK Ideograph */
- [0x9947, 0x9947], /* CJK Ideograph */
- [0x9948, 0x9948], /* CJK Ideograph */
- [0x9949, 0x9949], /* CJK Ideograph */
- [0x994a, 0x994a], /* CJK Ideograph */
- [0x994b, 0x994b], /* CJK Ideograph */
- [0x994c, 0x994c], /* CJK Ideograph */
- [0x994d, 0x994d], /* CJK Ideograph */
- [0x994e, 0x994e], /* CJK Ideograph */
- [0x994f, 0x994f], /* CJK Ideograph */
- [0x9950, 0x9950], /* CJK Ideograph */
- [0x9951, 0x9951], /* CJK Ideograph */
- [0x9952, 0x9952], /* CJK Ideograph */
- [0x9953, 0x9953], /* CJK Ideograph */
- [0x9954, 0x9954], /* CJK Ideograph */
- [0x9955, 0x9955], /* CJK Ideograph */
- [0x9956, 0x9956], /* CJK Ideograph */
- [0x9957, 0x9957], /* CJK Ideograph */
- [0x9958, 0x9958], /* CJK Ideograph */
- [0x9959, 0x9959], /* CJK Ideograph */
- [0x995a, 0x995a], /* CJK Ideograph */
- [0x995b, 0x995b], /* CJK Ideograph */
- [0x995c, 0x995c], /* CJK Ideograph */
- [0x995d, 0x995d], /* CJK Ideograph */
- [0x995e, 0x995e], /* CJK Ideograph */
- [0x995f, 0x995f], /* CJK Ideograph */
- [0x9960, 0x9960], /* CJK Ideograph */
- [0x9961, 0x9961], /* CJK Ideograph */
- [0x9962, 0x9962], /* CJK Ideograph */
- [0x9963, 0x9963], /* CJK Ideograph */
- [0x9964, 0x9964], /* CJK Ideograph */
- [0x9965, 0x9965], /* CJK Ideograph */
- [0x9966, 0x9966], /* CJK Ideograph */
- [0x9967, 0x9967], /* CJK Ideograph */
- [0x9968, 0x9968], /* CJK Ideograph */
- [0x9969, 0x9969], /* CJK Ideograph */
- [0x996a, 0x996a], /* CJK Ideograph */
- [0x996b, 0x996b], /* CJK Ideograph */
- [0x996c, 0x996c], /* CJK Ideograph */
- [0x996d, 0x996d], /* CJK Ideograph */
- [0x996e, 0x996e], /* CJK Ideograph */
- [0x996f, 0x996f], /* CJK Ideograph */
- [0x9970, 0x9970], /* CJK Ideograph */
- [0x9971, 0x9971], /* CJK Ideograph */
- [0x9972, 0x9972], /* CJK Ideograph */
- [0x9973, 0x9973], /* CJK Ideograph */
- [0x9974, 0x9974], /* CJK Ideograph */
- [0x9975, 0x9975], /* CJK Ideograph */
- [0x9976, 0x9976], /* CJK Ideograph */
- [0x9977, 0x9977], /* CJK Ideograph */
- [0x9978, 0x9978], /* CJK Ideograph */
- [0x9979, 0x9979], /* CJK Ideograph */
- [0x997a, 0x997a], /* CJK Ideograph */
- [0x997b, 0x997b], /* CJK Ideograph */
- [0x997c, 0x997c], /* CJK Ideograph */
- [0x997d, 0x997d], /* CJK Ideograph */
- [0x997e, 0x997e], /* CJK Ideograph */
- [0x997f, 0x997f], /* CJK Ideograph */
- [0x9980, 0x9980], /* CJK Ideograph */
- [0x9981, 0x9981], /* CJK Ideograph */
- [0x9982, 0x9982], /* CJK Ideograph */
- [0x9983, 0x9983], /* CJK Ideograph */
- [0x9984, 0x9984], /* CJK Ideograph */
- [0x9985, 0x9985], /* CJK Ideograph */
- [0x9986, 0x9986], /* CJK Ideograph */
- [0x9987, 0x9987], /* CJK Ideograph */
- [0x9988, 0x9988], /* CJK Ideograph */
- [0x9989, 0x9989], /* CJK Ideograph */
- [0x998a, 0x998a], /* CJK Ideograph */
- [0x998b, 0x998b], /* CJK Ideograph */
- [0x998c, 0x998c], /* CJK Ideograph */
- [0x998d, 0x998d], /* CJK Ideograph */
- [0x998e, 0x998e], /* CJK Ideograph */
- [0x998f, 0x998f], /* CJK Ideograph */
- [0x9990, 0x9990], /* CJK Ideograph */
- [0x9991, 0x9991], /* CJK Ideograph */
- [0x9992, 0x9992], /* CJK Ideograph */
- [0x9993, 0x9993], /* CJK Ideograph */
- [0x9994, 0x9994], /* CJK Ideograph */
- [0x9995, 0x9995], /* CJK Ideograph */
- [0x9996, 0x9996], /* CJK Ideograph */
- [0x9997, 0x9997], /* CJK Ideograph */
- [0x9998, 0x9998], /* CJK Ideograph */
- [0x9999, 0x9999], /* CJK Ideograph */
- [0x999a, 0x999a], /* CJK Ideograph */
- [0x999b, 0x999b], /* CJK Ideograph */
- [0x999c, 0x999c], /* CJK Ideograph */
- [0x999d, 0x999d], /* CJK Ideograph */
- [0x999e, 0x999e], /* CJK Ideograph */
- [0x999f, 0x999f], /* CJK Ideograph */
- [0x99a0, 0x99a0], /* CJK Ideograph */
- [0x99a1, 0x99a1], /* CJK Ideograph */
- [0x99a2, 0x99a2], /* CJK Ideograph */
- [0x99a3, 0x99a3], /* CJK Ideograph */
- [0x99a4, 0x99a4], /* CJK Ideograph */
- [0x99a5, 0x99a5], /* CJK Ideograph */
- [0x99a6, 0x99a6], /* CJK Ideograph */
- [0x99a7, 0x99a7], /* CJK Ideograph */
- [0x99a8, 0x99a8], /* CJK Ideograph */
- [0x99a9, 0x99a9], /* CJK Ideograph */
- [0x99aa, 0x99aa], /* CJK Ideograph */
- [0x99ab, 0x99ab], /* CJK Ideograph */
- [0x99ac, 0x99ac], /* CJK Ideograph */
- [0x99ad, 0x99ad], /* CJK Ideograph */
- [0x99ae, 0x99ae], /* CJK Ideograph */
- [0x99af, 0x99af], /* CJK Ideograph */
- [0x99b0, 0x99b0], /* CJK Ideograph */
- [0x99b1, 0x99b1], /* CJK Ideograph */
- [0x99b2, 0x99b2], /* CJK Ideograph */
- [0x99b3, 0x99b3], /* CJK Ideograph */
- [0x99b4, 0x99b4], /* CJK Ideograph */
- [0x99b5, 0x99b5], /* CJK Ideograph */
- [0x99b6, 0x99b6], /* CJK Ideograph */
- [0x99b7, 0x99b7], /* CJK Ideograph */
- [0x99b8, 0x99b8], /* CJK Ideograph */
- [0x99b9, 0x99b9], /* CJK Ideograph */
- [0x99ba, 0x99ba], /* CJK Ideograph */
- [0x99bb, 0x99bb], /* CJK Ideograph */
- [0x99bc, 0x99bc], /* CJK Ideograph */
- [0x99bd, 0x99bd], /* CJK Ideograph */
- [0x99be, 0x99be], /* CJK Ideograph */
- [0x99bf, 0x99bf], /* CJK Ideograph */
- [0x99c0, 0x99c0], /* CJK Ideograph */
- [0x99c1, 0x99c1], /* CJK Ideograph */
- [0x99c2, 0x99c2], /* CJK Ideograph */
- [0x99c3, 0x99c3], /* CJK Ideograph */
- [0x99c4, 0x99c4], /* CJK Ideograph */
- [0x99c5, 0x99c5], /* CJK Ideograph */
- [0x99c6, 0x99c6], /* CJK Ideograph */
- [0x99c7, 0x99c7], /* CJK Ideograph */
- [0x99c8, 0x99c8], /* CJK Ideograph */
- [0x99c9, 0x99c9], /* CJK Ideograph */
- [0x99ca, 0x99ca], /* CJK Ideograph */
- [0x99cb, 0x99cb], /* CJK Ideograph */
- [0x99cc, 0x99cc], /* CJK Ideograph */
- [0x99cd, 0x99cd], /* CJK Ideograph */
- [0x99ce, 0x99ce], /* CJK Ideograph */
- [0x99cf, 0x99cf], /* CJK Ideograph */
- [0x99d0, 0x99d0], /* CJK Ideograph */
- [0x99d1, 0x99d1], /* CJK Ideograph */
- [0x99d2, 0x99d2], /* CJK Ideograph */
- [0x99d3, 0x99d3], /* CJK Ideograph */
- [0x99d4, 0x99d4], /* CJK Ideograph */
- [0x99d5, 0x99d5], /* CJK Ideograph */
- [0x99d6, 0x99d6], /* CJK Ideograph */
- [0x99d7, 0x99d7], /* CJK Ideograph */
- [0x99d8, 0x99d8], /* CJK Ideograph */
- [0x99d9, 0x99d9], /* CJK Ideograph */
- [0x99da, 0x99da], /* CJK Ideograph */
- [0x99db, 0x99db], /* CJK Ideograph */
- [0x99dc, 0x99dc], /* CJK Ideograph */
- [0x99dd, 0x99dd], /* CJK Ideograph */
- [0x99de, 0x99de], /* CJK Ideograph */
- [0x99df, 0x99df], /* CJK Ideograph */
- [0x99e0, 0x99e0], /* CJK Ideograph */
- [0x99e1, 0x99e1], /* CJK Ideograph */
- [0x99e2, 0x99e2], /* CJK Ideograph */
- [0x99e3, 0x99e3], /* CJK Ideograph */
- [0x99e4, 0x99e4], /* CJK Ideograph */
- [0x99e5, 0x99e5], /* CJK Ideograph */
- [0x99e6, 0x99e6], /* CJK Ideograph */
- [0x99e7, 0x99e7], /* CJK Ideograph */
- [0x99e8, 0x99e8], /* CJK Ideograph */
- [0x99e9, 0x99e9], /* CJK Ideograph */
- [0x99ea, 0x99ea], /* CJK Ideograph */
- [0x99eb, 0x99eb], /* CJK Ideograph */
- [0x99ec, 0x99ec], /* CJK Ideograph */
- [0x99ed, 0x99ed], /* CJK Ideograph */
- [0x99ee, 0x99ee], /* CJK Ideograph */
- [0x99ef, 0x99ef], /* CJK Ideograph */
- [0x99f0, 0x99f0], /* CJK Ideograph */
- [0x99f1, 0x99f1], /* CJK Ideograph */
- [0x99f2, 0x99f2], /* CJK Ideograph */
- [0x99f3, 0x99f3], /* CJK Ideograph */
- [0x99f4, 0x99f4], /* CJK Ideograph */
- [0x99f5, 0x99f5], /* CJK Ideograph */
- [0x99f6, 0x99f6], /* CJK Ideograph */
- [0x99f7, 0x99f7], /* CJK Ideograph */
- [0x99f8, 0x99f8], /* CJK Ideograph */
- [0x99f9, 0x99f9], /* CJK Ideograph */
- [0x99fa, 0x99fa], /* CJK Ideograph */
- [0x99fb, 0x99fb], /* CJK Ideograph */
- [0x99fc, 0x99fc], /* CJK Ideograph */
- [0x99fd, 0x99fd], /* CJK Ideograph */
- [0x99fe, 0x99fe], /* CJK Ideograph */
- [0x99ff, 0x99ff], /* CJK Ideograph */
- [0x9a00, 0x9a00], /* CJK Ideograph */
- [0x9a01, 0x9a01], /* CJK Ideograph */
- [0x9a02, 0x9a02], /* CJK Ideograph */
- [0x9a03, 0x9a03], /* CJK Ideograph */
- [0x9a04, 0x9a04], /* CJK Ideograph */
- [0x9a05, 0x9a05], /* CJK Ideograph */
- [0x9a06, 0x9a06], /* CJK Ideograph */
- [0x9a07, 0x9a07], /* CJK Ideograph */
- [0x9a08, 0x9a08], /* CJK Ideograph */
- [0x9a09, 0x9a09], /* CJK Ideograph */
- [0x9a0a, 0x9a0a], /* CJK Ideograph */
- [0x9a0b, 0x9a0b], /* CJK Ideograph */
- [0x9a0c, 0x9a0c], /* CJK Ideograph */
- [0x9a0d, 0x9a0d], /* CJK Ideograph */
- [0x9a0e, 0x9a0e], /* CJK Ideograph */
- [0x9a0f, 0x9a0f], /* CJK Ideograph */
- [0x9a10, 0x9a10], /* CJK Ideograph */
- [0x9a11, 0x9a11], /* CJK Ideograph */
- [0x9a12, 0x9a12], /* CJK Ideograph */
- [0x9a13, 0x9a13], /* CJK Ideograph */
- [0x9a14, 0x9a14], /* CJK Ideograph */
- [0x9a15, 0x9a15], /* CJK Ideograph */
- [0x9a16, 0x9a16], /* CJK Ideograph */
- [0x9a17, 0x9a17], /* CJK Ideograph */
- [0x9a18, 0x9a18], /* CJK Ideograph */
- [0x9a19, 0x9a19], /* CJK Ideograph */
- [0x9a1a, 0x9a1a], /* CJK Ideograph */
- [0x9a1b, 0x9a1b], /* CJK Ideograph */
- [0x9a1c, 0x9a1c], /* CJK Ideograph */
- [0x9a1d, 0x9a1d], /* CJK Ideograph */
- [0x9a1e, 0x9a1e], /* CJK Ideograph */
- [0x9a1f, 0x9a1f], /* CJK Ideograph */
- [0x9a20, 0x9a20], /* CJK Ideograph */
- [0x9a21, 0x9a21], /* CJK Ideograph */
- [0x9a22, 0x9a22], /* CJK Ideograph */
- [0x9a23, 0x9a23], /* CJK Ideograph */
- [0x9a24, 0x9a24], /* CJK Ideograph */
- [0x9a25, 0x9a25], /* CJK Ideograph */
- [0x9a26, 0x9a26], /* CJK Ideograph */
- [0x9a27, 0x9a27], /* CJK Ideograph */
- [0x9a28, 0x9a28], /* CJK Ideograph */
- [0x9a29, 0x9a29], /* CJK Ideograph */
- [0x9a2a, 0x9a2a], /* CJK Ideograph */
- [0x9a2b, 0x9a2b], /* CJK Ideograph */
- [0x9a2c, 0x9a2c], /* CJK Ideograph */
- [0x9a2d, 0x9a2d], /* CJK Ideograph */
- [0x9a2e, 0x9a2e], /* CJK Ideograph */
- [0x9a2f, 0x9a2f], /* CJK Ideograph */
- [0x9a30, 0x9a30], /* CJK Ideograph */
- [0x9a31, 0x9a31], /* CJK Ideograph */
- [0x9a32, 0x9a32], /* CJK Ideograph */
- [0x9a33, 0x9a33], /* CJK Ideograph */
- [0x9a34, 0x9a34], /* CJK Ideograph */
- [0x9a35, 0x9a35], /* CJK Ideograph */
- [0x9a36, 0x9a36], /* CJK Ideograph */
- [0x9a37, 0x9a37], /* CJK Ideograph */
- [0x9a38, 0x9a38], /* CJK Ideograph */
- [0x9a39, 0x9a39], /* CJK Ideograph */
- [0x9a3a, 0x9a3a], /* CJK Ideograph */
- [0x9a3b, 0x9a3b], /* CJK Ideograph */
- [0x9a3c, 0x9a3c], /* CJK Ideograph */
- [0x9a3d, 0x9a3d], /* CJK Ideograph */
- [0x9a3e, 0x9a3e], /* CJK Ideograph */
- [0x9a3f, 0x9a3f], /* CJK Ideograph */
- [0x9a40, 0x9a40], /* CJK Ideograph */
- [0x9a41, 0x9a41], /* CJK Ideograph */
- [0x9a42, 0x9a42], /* CJK Ideograph */
- [0x9a43, 0x9a43], /* CJK Ideograph */
- [0x9a44, 0x9a44], /* CJK Ideograph */
- [0x9a45, 0x9a45], /* CJK Ideograph */
- [0x9a46, 0x9a46], /* CJK Ideograph */
- [0x9a47, 0x9a47], /* CJK Ideograph */
- [0x9a48, 0x9a48], /* CJK Ideograph */
- [0x9a49, 0x9a49], /* CJK Ideograph */
- [0x9a4a, 0x9a4a], /* CJK Ideograph */
- [0x9a4b, 0x9a4b], /* CJK Ideograph */
- [0x9a4c, 0x9a4c], /* CJK Ideograph */
- [0x9a4d, 0x9a4d], /* CJK Ideograph */
- [0x9a4e, 0x9a4e], /* CJK Ideograph */
- [0x9a4f, 0x9a4f], /* CJK Ideograph */
- [0x9a50, 0x9a50], /* CJK Ideograph */
- [0x9a51, 0x9a51], /* CJK Ideograph */
- [0x9a52, 0x9a52], /* CJK Ideograph */
- [0x9a53, 0x9a53], /* CJK Ideograph */
- [0x9a54, 0x9a54], /* CJK Ideograph */
- [0x9a55, 0x9a55], /* CJK Ideograph */
- [0x9a56, 0x9a56], /* CJK Ideograph */
- [0x9a57, 0x9a57], /* CJK Ideograph */
- [0x9a58, 0x9a58], /* CJK Ideograph */
- [0x9a59, 0x9a59], /* CJK Ideograph */
- [0x9a5a, 0x9a5a], /* CJK Ideograph */
- [0x9a5b, 0x9a5b], /* CJK Ideograph */
- [0x9a5c, 0x9a5c], /* CJK Ideograph */
- [0x9a5d, 0x9a5d], /* CJK Ideograph */
- [0x9a5e, 0x9a5e], /* CJK Ideograph */
- [0x9a5f, 0x9a5f], /* CJK Ideograph */
- [0x9a60, 0x9a60], /* CJK Ideograph */
- [0x9a61, 0x9a61], /* CJK Ideograph */
- [0x9a62, 0x9a62], /* CJK Ideograph */
- [0x9a63, 0x9a63], /* CJK Ideograph */
- [0x9a64, 0x9a64], /* CJK Ideograph */
- [0x9a65, 0x9a65], /* CJK Ideograph */
- [0x9a66, 0x9a66], /* CJK Ideograph */
- [0x9a67, 0x9a67], /* CJK Ideograph */
- [0x9a68, 0x9a68], /* CJK Ideograph */
- [0x9a69, 0x9a69], /* CJK Ideograph */
- [0x9a6a, 0x9a6a], /* CJK Ideograph */
- [0x9a6b, 0x9a6b], /* CJK Ideograph */
- [0x9a6c, 0x9a6c], /* CJK Ideograph */
- [0x9a6d, 0x9a6d], /* CJK Ideograph */
- [0x9a6e, 0x9a6e], /* CJK Ideograph */
- [0x9a6f, 0x9a6f], /* CJK Ideograph */
- [0x9a70, 0x9a70], /* CJK Ideograph */
- [0x9a71, 0x9a71], /* CJK Ideograph */
- [0x9a72, 0x9a72], /* CJK Ideograph */
- [0x9a73, 0x9a73], /* CJK Ideograph */
- [0x9a74, 0x9a74], /* CJK Ideograph */
- [0x9a75, 0x9a75], /* CJK Ideograph */
- [0x9a76, 0x9a76], /* CJK Ideograph */
- [0x9a77, 0x9a77], /* CJK Ideograph */
- [0x9a78, 0x9a78], /* CJK Ideograph */
- [0x9a79, 0x9a79], /* CJK Ideograph */
- [0x9a7a, 0x9a7a], /* CJK Ideograph */
- [0x9a7b, 0x9a7b], /* CJK Ideograph */
- [0x9a7c, 0x9a7c], /* CJK Ideograph */
- [0x9a7d, 0x9a7d], /* CJK Ideograph */
- [0x9a7e, 0x9a7e], /* CJK Ideograph */
- [0x9a7f, 0x9a7f], /* CJK Ideograph */
- [0x9a80, 0x9a80], /* CJK Ideograph */
- [0x9a81, 0x9a81], /* CJK Ideograph */
- [0x9a82, 0x9a82], /* CJK Ideograph */
- [0x9a83, 0x9a83], /* CJK Ideograph */
- [0x9a84, 0x9a84], /* CJK Ideograph */
- [0x9a85, 0x9a85], /* CJK Ideograph */
- [0x9a86, 0x9a86], /* CJK Ideograph */
- [0x9a87, 0x9a87], /* CJK Ideograph */
- [0x9a88, 0x9a88], /* CJK Ideograph */
- [0x9a89, 0x9a89], /* CJK Ideograph */
- [0x9a8a, 0x9a8a], /* CJK Ideograph */
- [0x9a8b, 0x9a8b], /* CJK Ideograph */
- [0x9a8c, 0x9a8c], /* CJK Ideograph */
- [0x9a8d, 0x9a8d], /* CJK Ideograph */
- [0x9a8e, 0x9a8e], /* CJK Ideograph */
- [0x9a8f, 0x9a8f], /* CJK Ideograph */
- [0x9a90, 0x9a90], /* CJK Ideograph */
- [0x9a91, 0x9a91], /* CJK Ideograph */
- [0x9a92, 0x9a92], /* CJK Ideograph */
- [0x9a93, 0x9a93], /* CJK Ideograph */
- [0x9a94, 0x9a94], /* CJK Ideograph */
- [0x9a95, 0x9a95], /* CJK Ideograph */
- [0x9a96, 0x9a96], /* CJK Ideograph */
- [0x9a97, 0x9a97], /* CJK Ideograph */
- [0x9a98, 0x9a98], /* CJK Ideograph */
- [0x9a99, 0x9a99], /* CJK Ideograph */
- [0x9a9a, 0x9a9a], /* CJK Ideograph */
- [0x9a9b, 0x9a9b], /* CJK Ideograph */
- [0x9a9c, 0x9a9c], /* CJK Ideograph */
- [0x9a9d, 0x9a9d], /* CJK Ideograph */
- [0x9a9e, 0x9a9e], /* CJK Ideograph */
- [0x9a9f, 0x9a9f], /* CJK Ideograph */
- [0x9aa0, 0x9aa0], /* CJK Ideograph */
- [0x9aa1, 0x9aa1], /* CJK Ideograph */
- [0x9aa2, 0x9aa2], /* CJK Ideograph */
- [0x9aa3, 0x9aa3], /* CJK Ideograph */
- [0x9aa4, 0x9aa4], /* CJK Ideograph */
- [0x9aa5, 0x9aa5], /* CJK Ideograph */
- [0x9aa6, 0x9aa6], /* CJK Ideograph */
- [0x9aa7, 0x9aa7], /* CJK Ideograph */
- [0x9aa8, 0x9aa8], /* CJK Ideograph */
- [0x9aa9, 0x9aa9], /* CJK Ideograph */
- [0x9aaa, 0x9aaa], /* CJK Ideograph */
- [0x9aab, 0x9aab], /* CJK Ideograph */
- [0x9aac, 0x9aac], /* CJK Ideograph */
- [0x9aad, 0x9aad], /* CJK Ideograph */
- [0x9aae, 0x9aae], /* CJK Ideograph */
- [0x9aaf, 0x9aaf], /* CJK Ideograph */
- [0x9ab0, 0x9ab0], /* CJK Ideograph */
- [0x9ab1, 0x9ab1], /* CJK Ideograph */
- [0x9ab2, 0x9ab2], /* CJK Ideograph */
- [0x9ab3, 0x9ab3], /* CJK Ideograph */
- [0x9ab4, 0x9ab4], /* CJK Ideograph */
- [0x9ab5, 0x9ab5], /* CJK Ideograph */
- [0x9ab6, 0x9ab6], /* CJK Ideograph */
- [0x9ab7, 0x9ab7], /* CJK Ideograph */
- [0x9ab8, 0x9ab8], /* CJK Ideograph */
- [0x9ab9, 0x9ab9], /* CJK Ideograph */
- [0x9aba, 0x9aba], /* CJK Ideograph */
- [0x9abb, 0x9abb], /* CJK Ideograph */
- [0x9abc, 0x9abc], /* CJK Ideograph */
- [0x9abd, 0x9abd], /* CJK Ideograph */
- [0x9abe, 0x9abe], /* CJK Ideograph */
- [0x9abf, 0x9abf], /* CJK Ideograph */
- [0x9ac0, 0x9ac0], /* CJK Ideograph */
- [0x9ac1, 0x9ac1], /* CJK Ideograph */
- [0x9ac2, 0x9ac2], /* CJK Ideograph */
- [0x9ac3, 0x9ac3], /* CJK Ideograph */
- [0x9ac4, 0x9ac4], /* CJK Ideograph */
- [0x9ac5, 0x9ac5], /* CJK Ideograph */
- [0x9ac6, 0x9ac6], /* CJK Ideograph */
- [0x9ac7, 0x9ac7], /* CJK Ideograph */
- [0x9ac8, 0x9ac8], /* CJK Ideograph */
- [0x9ac9, 0x9ac9], /* CJK Ideograph */
- [0x9aca, 0x9aca], /* CJK Ideograph */
- [0x9acb, 0x9acb], /* CJK Ideograph */
- [0x9acc, 0x9acc], /* CJK Ideograph */
- [0x9acd, 0x9acd], /* CJK Ideograph */
- [0x9ace, 0x9ace], /* CJK Ideograph */
- [0x9acf, 0x9acf], /* CJK Ideograph */
- [0x9ad0, 0x9ad0], /* CJK Ideograph */
- [0x9ad1, 0x9ad1], /* CJK Ideograph */
- [0x9ad2, 0x9ad2], /* CJK Ideograph */
- [0x9ad3, 0x9ad3], /* CJK Ideograph */
- [0x9ad4, 0x9ad4], /* CJK Ideograph */
- [0x9ad5, 0x9ad5], /* CJK Ideograph */
- [0x9ad6, 0x9ad6], /* CJK Ideograph */
- [0x9ad7, 0x9ad7], /* CJK Ideograph */
- [0x9ad8, 0x9ad8], /* CJK Ideograph */
- [0x9ad9, 0x9ad9], /* CJK Ideograph */
- [0x9ada, 0x9ada], /* CJK Ideograph */
- [0x9adb, 0x9adb], /* CJK Ideograph */
- [0x9adc, 0x9adc], /* CJK Ideograph */
- [0x9add, 0x9add], /* CJK Ideograph */
- [0x9ade, 0x9ade], /* CJK Ideograph */
- [0x9adf, 0x9adf], /* CJK Ideograph */
- [0x9ae0, 0x9ae0], /* CJK Ideograph */
- [0x9ae1, 0x9ae1], /* CJK Ideograph */
- [0x9ae2, 0x9ae2], /* CJK Ideograph */
- [0x9ae3, 0x9ae3], /* CJK Ideograph */
- [0x9ae4, 0x9ae4], /* CJK Ideograph */
- [0x9ae5, 0x9ae5], /* CJK Ideograph */
- [0x9ae6, 0x9ae6], /* CJK Ideograph */
- [0x9ae7, 0x9ae7], /* CJK Ideograph */
- [0x9ae8, 0x9ae8], /* CJK Ideograph */
- [0x9ae9, 0x9ae9], /* CJK Ideograph */
- [0x9aea, 0x9aea], /* CJK Ideograph */
- [0x9aeb, 0x9aeb], /* CJK Ideograph */
- [0x9aec, 0x9aec], /* CJK Ideograph */
- [0x9aed, 0x9aed], /* CJK Ideograph */
- [0x9aee, 0x9aee], /* CJK Ideograph */
- [0x9aef, 0x9aef], /* CJK Ideograph */
- [0x9af0, 0x9af0], /* CJK Ideograph */
- [0x9af1, 0x9af1], /* CJK Ideograph */
- [0x9af2, 0x9af2], /* CJK Ideograph */
- [0x9af3, 0x9af3], /* CJK Ideograph */
- [0x9af4, 0x9af4], /* CJK Ideograph */
- [0x9af5, 0x9af5], /* CJK Ideograph */
- [0x9af6, 0x9af6], /* CJK Ideograph */
- [0x9af7, 0x9af7], /* CJK Ideograph */
- [0x9af8, 0x9af8], /* CJK Ideograph */
- [0x9af9, 0x9af9], /* CJK Ideograph */
- [0x9afa, 0x9afa], /* CJK Ideograph */
- [0x9afb, 0x9afb], /* CJK Ideograph */
- [0x9afc, 0x9afc], /* CJK Ideograph */
- [0x9afd, 0x9afd], /* CJK Ideograph */
- [0x9afe, 0x9afe], /* CJK Ideograph */
- [0x9aff, 0x9aff], /* CJK Ideograph */
- [0x9b00, 0x9b00], /* CJK Ideograph */
- [0x9b01, 0x9b01], /* CJK Ideograph */
- [0x9b02, 0x9b02], /* CJK Ideograph */
- [0x9b03, 0x9b03], /* CJK Ideograph */
- [0x9b04, 0x9b04], /* CJK Ideograph */
- [0x9b05, 0x9b05], /* CJK Ideograph */
- [0x9b06, 0x9b06], /* CJK Ideograph */
- [0x9b07, 0x9b07], /* CJK Ideograph */
- [0x9b08, 0x9b08], /* CJK Ideograph */
- [0x9b09, 0x9b09], /* CJK Ideograph */
- [0x9b0a, 0x9b0a], /* CJK Ideograph */
- [0x9b0b, 0x9b0b], /* CJK Ideograph */
- [0x9b0c, 0x9b0c], /* CJK Ideograph */
- [0x9b0d, 0x9b0d], /* CJK Ideograph */
- [0x9b0e, 0x9b0e], /* CJK Ideograph */
- [0x9b0f, 0x9b0f], /* CJK Ideograph */
- [0x9b10, 0x9b10], /* CJK Ideograph */
- [0x9b11, 0x9b11], /* CJK Ideograph */
- [0x9b12, 0x9b12], /* CJK Ideograph */
- [0x9b13, 0x9b13], /* CJK Ideograph */
- [0x9b14, 0x9b14], /* CJK Ideograph */
- [0x9b15, 0x9b15], /* CJK Ideograph */
- [0x9b16, 0x9b16], /* CJK Ideograph */
- [0x9b17, 0x9b17], /* CJK Ideograph */
- [0x9b18, 0x9b18], /* CJK Ideograph */
- [0x9b19, 0x9b19], /* CJK Ideograph */
- [0x9b1a, 0x9b1a], /* CJK Ideograph */
- [0x9b1b, 0x9b1b], /* CJK Ideograph */
- [0x9b1c, 0x9b1c], /* CJK Ideograph */
- [0x9b1d, 0x9b1d], /* CJK Ideograph */
- [0x9b1e, 0x9b1e], /* CJK Ideograph */
- [0x9b1f, 0x9b1f], /* CJK Ideograph */
- [0x9b20, 0x9b20], /* CJK Ideograph */
- [0x9b21, 0x9b21], /* CJK Ideograph */
- [0x9b22, 0x9b22], /* CJK Ideograph */
- [0x9b23, 0x9b23], /* CJK Ideograph */
- [0x9b24, 0x9b24], /* CJK Ideograph */
- [0x9b25, 0x9b25], /* CJK Ideograph */
- [0x9b26, 0x9b26], /* CJK Ideograph */
- [0x9b27, 0x9b27], /* CJK Ideograph */
- [0x9b28, 0x9b28], /* CJK Ideograph */
- [0x9b29, 0x9b29], /* CJK Ideograph */
- [0x9b2a, 0x9b2a], /* CJK Ideograph */
- [0x9b2b, 0x9b2b], /* CJK Ideograph */
- [0x9b2c, 0x9b2c], /* CJK Ideograph */
- [0x9b2d, 0x9b2d], /* CJK Ideograph */
- [0x9b2e, 0x9b2e], /* CJK Ideograph */
- [0x9b2f, 0x9b2f], /* CJK Ideograph */
- [0x9b30, 0x9b30], /* CJK Ideograph */
- [0x9b31, 0x9b31], /* CJK Ideograph */
- [0x9b32, 0x9b32], /* CJK Ideograph */
- [0x9b33, 0x9b33], /* CJK Ideograph */
- [0x9b34, 0x9b34], /* CJK Ideograph */
- [0x9b35, 0x9b35], /* CJK Ideograph */
- [0x9b36, 0x9b36], /* CJK Ideograph */
- [0x9b37, 0x9b37], /* CJK Ideograph */
- [0x9b38, 0x9b38], /* CJK Ideograph */
- [0x9b39, 0x9b39], /* CJK Ideograph */
- [0x9b3a, 0x9b3a], /* CJK Ideograph */
- [0x9b3b, 0x9b3b], /* CJK Ideograph */
- [0x9b3c, 0x9b3c], /* CJK Ideograph */
- [0x9b3d, 0x9b3d], /* CJK Ideograph */
- [0x9b3e, 0x9b3e], /* CJK Ideograph */
- [0x9b3f, 0x9b3f], /* CJK Ideograph */
- [0x9b40, 0x9b40], /* CJK Ideograph */
- [0x9b41, 0x9b41], /* CJK Ideograph */
- [0x9b42, 0x9b42], /* CJK Ideograph */
- [0x9b43, 0x9b43], /* CJK Ideograph */
- [0x9b44, 0x9b44], /* CJK Ideograph */
- [0x9b45, 0x9b45], /* CJK Ideograph */
- [0x9b46, 0x9b46], /* CJK Ideograph */
- [0x9b47, 0x9b47], /* CJK Ideograph */
- [0x9b48, 0x9b48], /* CJK Ideograph */
- [0x9b49, 0x9b49], /* CJK Ideograph */
- [0x9b4a, 0x9b4a], /* CJK Ideograph */
- [0x9b4b, 0x9b4b], /* CJK Ideograph */
- [0x9b4c, 0x9b4c], /* CJK Ideograph */
- [0x9b4d, 0x9b4d], /* CJK Ideograph */
- [0x9b4e, 0x9b4e], /* CJK Ideograph */
- [0x9b4f, 0x9b4f], /* CJK Ideograph */
- [0x9b50, 0x9b50], /* CJK Ideograph */
- [0x9b51, 0x9b51], /* CJK Ideograph */
- [0x9b52, 0x9b52], /* CJK Ideograph */
- [0x9b53, 0x9b53], /* CJK Ideograph */
- [0x9b54, 0x9b54], /* CJK Ideograph */
- [0x9b55, 0x9b55], /* CJK Ideograph */
- [0x9b56, 0x9b56], /* CJK Ideograph */
- [0x9b57, 0x9b57], /* CJK Ideograph */
- [0x9b58, 0x9b58], /* CJK Ideograph */
- [0x9b59, 0x9b59], /* CJK Ideograph */
- [0x9b5a, 0x9b5a], /* CJK Ideograph */
- [0x9b5b, 0x9b5b], /* CJK Ideograph */
- [0x9b5c, 0x9b5c], /* CJK Ideograph */
- [0x9b5d, 0x9b5d], /* CJK Ideograph */
- [0x9b5e, 0x9b5e], /* CJK Ideograph */
- [0x9b5f, 0x9b5f], /* CJK Ideograph */
- [0x9b60, 0x9b60], /* CJK Ideograph */
- [0x9b61, 0x9b61], /* CJK Ideograph */
- [0x9b62, 0x9b62], /* CJK Ideograph */
- [0x9b63, 0x9b63], /* CJK Ideograph */
- [0x9b64, 0x9b64], /* CJK Ideograph */
- [0x9b65, 0x9b65], /* CJK Ideograph */
- [0x9b66, 0x9b66], /* CJK Ideograph */
- [0x9b67, 0x9b67], /* CJK Ideograph */
- [0x9b68, 0x9b68], /* CJK Ideograph */
- [0x9b69, 0x9b69], /* CJK Ideograph */
- [0x9b6a, 0x9b6a], /* CJK Ideograph */
- [0x9b6b, 0x9b6b], /* CJK Ideograph */
- [0x9b6c, 0x9b6c], /* CJK Ideograph */
- [0x9b6d, 0x9b6d], /* CJK Ideograph */
- [0x9b6e, 0x9b6e], /* CJK Ideograph */
- [0x9b6f, 0x9b6f], /* CJK Ideograph */
- [0x9b70, 0x9b70], /* CJK Ideograph */
- [0x9b71, 0x9b71], /* CJK Ideograph */
- [0x9b72, 0x9b72], /* CJK Ideograph */
- [0x9b73, 0x9b73], /* CJK Ideograph */
- [0x9b74, 0x9b74], /* CJK Ideograph */
- [0x9b75, 0x9b75], /* CJK Ideograph */
- [0x9b76, 0x9b76], /* CJK Ideograph */
- [0x9b77, 0x9b77], /* CJK Ideograph */
- [0x9b78, 0x9b78], /* CJK Ideograph */
- [0x9b79, 0x9b79], /* CJK Ideograph */
- [0x9b7a, 0x9b7a], /* CJK Ideograph */
- [0x9b7b, 0x9b7b], /* CJK Ideograph */
- [0x9b7c, 0x9b7c], /* CJK Ideograph */
- [0x9b7d, 0x9b7d], /* CJK Ideograph */
- [0x9b7e, 0x9b7e], /* CJK Ideograph */
- [0x9b7f, 0x9b7f], /* CJK Ideograph */
- [0x9b80, 0x9b80], /* CJK Ideograph */
- [0x9b81, 0x9b81], /* CJK Ideograph */
- [0x9b82, 0x9b82], /* CJK Ideograph */
- [0x9b83, 0x9b83], /* CJK Ideograph */
- [0x9b84, 0x9b84], /* CJK Ideograph */
- [0x9b85, 0x9b85], /* CJK Ideograph */
- [0x9b86, 0x9b86], /* CJK Ideograph */
- [0x9b87, 0x9b87], /* CJK Ideograph */
- [0x9b88, 0x9b88], /* CJK Ideograph */
- [0x9b89, 0x9b89], /* CJK Ideograph */
- [0x9b8a, 0x9b8a], /* CJK Ideograph */
- [0x9b8b, 0x9b8b], /* CJK Ideograph */
- [0x9b8c, 0x9b8c], /* CJK Ideograph */
- [0x9b8d, 0x9b8d], /* CJK Ideograph */
- [0x9b8e, 0x9b8e], /* CJK Ideograph */
- [0x9b8f, 0x9b8f], /* CJK Ideograph */
- [0x9b90, 0x9b90], /* CJK Ideograph */
- [0x9b91, 0x9b91], /* CJK Ideograph */
- [0x9b92, 0x9b92], /* CJK Ideograph */
- [0x9b93, 0x9b93], /* CJK Ideograph */
- [0x9b94, 0x9b94], /* CJK Ideograph */
- [0x9b95, 0x9b95], /* CJK Ideograph */
- [0x9b96, 0x9b96], /* CJK Ideograph */
- [0x9b97, 0x9b97], /* CJK Ideograph */
- [0x9b98, 0x9b98], /* CJK Ideograph */
- [0x9b99, 0x9b99], /* CJK Ideograph */
- [0x9b9a, 0x9b9a], /* CJK Ideograph */
- [0x9b9b, 0x9b9b], /* CJK Ideograph */
- [0x9b9c, 0x9b9c], /* CJK Ideograph */
- [0x9b9d, 0x9b9d], /* CJK Ideograph */
- [0x9b9e, 0x9b9e], /* CJK Ideograph */
- [0x9b9f, 0x9b9f], /* CJK Ideograph */
- [0x9ba0, 0x9ba0], /* CJK Ideograph */
- [0x9ba1, 0x9ba1], /* CJK Ideograph */
- [0x9ba2, 0x9ba2], /* CJK Ideograph */
- [0x9ba3, 0x9ba3], /* CJK Ideograph */
- [0x9ba4, 0x9ba4], /* CJK Ideograph */
- [0x9ba5, 0x9ba5], /* CJK Ideograph */
- [0x9ba6, 0x9ba6], /* CJK Ideograph */
- [0x9ba7, 0x9ba7], /* CJK Ideograph */
- [0x9ba8, 0x9ba8], /* CJK Ideograph */
- [0x9ba9, 0x9ba9], /* CJK Ideograph */
- [0x9baa, 0x9baa], /* CJK Ideograph */
- [0x9bab, 0x9bab], /* CJK Ideograph */
- [0x9bac, 0x9bac], /* CJK Ideograph */
- [0x9bad, 0x9bad], /* CJK Ideograph */
- [0x9bae, 0x9bae], /* CJK Ideograph */
- [0x9baf, 0x9baf], /* CJK Ideograph */
- [0x9bb0, 0x9bb0], /* CJK Ideograph */
- [0x9bb1, 0x9bb1], /* CJK Ideograph */
- [0x9bb2, 0x9bb2], /* CJK Ideograph */
- [0x9bb3, 0x9bb3], /* CJK Ideograph */
- [0x9bb4, 0x9bb4], /* CJK Ideograph */
- [0x9bb5, 0x9bb5], /* CJK Ideograph */
- [0x9bb6, 0x9bb6], /* CJK Ideograph */
- [0x9bb7, 0x9bb7], /* CJK Ideograph */
- [0x9bb8, 0x9bb8], /* CJK Ideograph */
- [0x9bb9, 0x9bb9], /* CJK Ideograph */
- [0x9bba, 0x9bba], /* CJK Ideograph */
- [0x9bbb, 0x9bbb], /* CJK Ideograph */
- [0x9bbc, 0x9bbc], /* CJK Ideograph */
- [0x9bbd, 0x9bbd], /* CJK Ideograph */
- [0x9bbe, 0x9bbe], /* CJK Ideograph */
- [0x9bbf, 0x9bbf], /* CJK Ideograph */
- [0x9bc0, 0x9bc0], /* CJK Ideograph */
- [0x9bc1, 0x9bc1], /* CJK Ideograph */
- [0x9bc2, 0x9bc2], /* CJK Ideograph */
- [0x9bc3, 0x9bc3], /* CJK Ideograph */
- [0x9bc4, 0x9bc4], /* CJK Ideograph */
- [0x9bc5, 0x9bc5], /* CJK Ideograph */
- [0x9bc6, 0x9bc6], /* CJK Ideograph */
- [0x9bc7, 0x9bc7], /* CJK Ideograph */
- [0x9bc8, 0x9bc8], /* CJK Ideograph */
- [0x9bc9, 0x9bc9], /* CJK Ideograph */
- [0x9bca, 0x9bca], /* CJK Ideograph */
- [0x9bcb, 0x9bcb], /* CJK Ideograph */
- [0x9bcc, 0x9bcc], /* CJK Ideograph */
- [0x9bcd, 0x9bcd], /* CJK Ideograph */
- [0x9bce, 0x9bce], /* CJK Ideograph */
- [0x9bcf, 0x9bcf], /* CJK Ideograph */
- [0x9bd0, 0x9bd0], /* CJK Ideograph */
- [0x9bd1, 0x9bd1], /* CJK Ideograph */
- [0x9bd2, 0x9bd2], /* CJK Ideograph */
- [0x9bd3, 0x9bd3], /* CJK Ideograph */
- [0x9bd4, 0x9bd4], /* CJK Ideograph */
- [0x9bd5, 0x9bd5], /* CJK Ideograph */
- [0x9bd6, 0x9bd6], /* CJK Ideograph */
- [0x9bd7, 0x9bd7], /* CJK Ideograph */
- [0x9bd8, 0x9bd8], /* CJK Ideograph */
- [0x9bd9, 0x9bd9], /* CJK Ideograph */
- [0x9bda, 0x9bda], /* CJK Ideograph */
- [0x9bdb, 0x9bdb], /* CJK Ideograph */
- [0x9bdc, 0x9bdc], /* CJK Ideograph */
- [0x9bdd, 0x9bdd], /* CJK Ideograph */
- [0x9bde, 0x9bde], /* CJK Ideograph */
- [0x9bdf, 0x9bdf], /* CJK Ideograph */
- [0x9be0, 0x9be0], /* CJK Ideograph */
- [0x9be1, 0x9be1], /* CJK Ideograph */
- [0x9be2, 0x9be2], /* CJK Ideograph */
- [0x9be3, 0x9be3], /* CJK Ideograph */
- [0x9be4, 0x9be4], /* CJK Ideograph */
- [0x9be5, 0x9be5], /* CJK Ideograph */
- [0x9be6, 0x9be6], /* CJK Ideograph */
- [0x9be7, 0x9be7], /* CJK Ideograph */
- [0x9be8, 0x9be8], /* CJK Ideograph */
- [0x9be9, 0x9be9], /* CJK Ideograph */
- [0x9bea, 0x9bea], /* CJK Ideograph */
- [0x9beb, 0x9beb], /* CJK Ideograph */
- [0x9bec, 0x9bec], /* CJK Ideograph */
- [0x9bed, 0x9bed], /* CJK Ideograph */
- [0x9bee, 0x9bee], /* CJK Ideograph */
- [0x9bef, 0x9bef], /* CJK Ideograph */
- [0x9bf0, 0x9bf0], /* CJK Ideograph */
- [0x9bf1, 0x9bf1], /* CJK Ideograph */
- [0x9bf2, 0x9bf2], /* CJK Ideograph */
- [0x9bf3, 0x9bf3], /* CJK Ideograph */
- [0x9bf4, 0x9bf4], /* CJK Ideograph */
- [0x9bf5, 0x9bf5], /* CJK Ideograph */
- [0x9bf6, 0x9bf6], /* CJK Ideograph */
- [0x9bf7, 0x9bf7], /* CJK Ideograph */
- [0x9bf8, 0x9bf8], /* CJK Ideograph */
- [0x9bf9, 0x9bf9], /* CJK Ideograph */
- [0x9bfa, 0x9bfa], /* CJK Ideograph */
- [0x9bfb, 0x9bfb], /* CJK Ideograph */
- [0x9bfc, 0x9bfc], /* CJK Ideograph */
- [0x9bfd, 0x9bfd], /* CJK Ideograph */
- [0x9bfe, 0x9bfe], /* CJK Ideograph */
- [0x9bff, 0x9bff], /* CJK Ideograph */
- [0x9c00, 0x9c00], /* CJK Ideograph */
- [0x9c01, 0x9c01], /* CJK Ideograph */
- [0x9c02, 0x9c02], /* CJK Ideograph */
- [0x9c03, 0x9c03], /* CJK Ideograph */
- [0x9c04, 0x9c04], /* CJK Ideograph */
- [0x9c05, 0x9c05], /* CJK Ideograph */
- [0x9c06, 0x9c06], /* CJK Ideograph */
- [0x9c07, 0x9c07], /* CJK Ideograph */
- [0x9c08, 0x9c08], /* CJK Ideograph */
- [0x9c09, 0x9c09], /* CJK Ideograph */
- [0x9c0a, 0x9c0a], /* CJK Ideograph */
- [0x9c0b, 0x9c0b], /* CJK Ideograph */
- [0x9c0c, 0x9c0c], /* CJK Ideograph */
- [0x9c0d, 0x9c0d], /* CJK Ideograph */
- [0x9c0e, 0x9c0e], /* CJK Ideograph */
- [0x9c0f, 0x9c0f], /* CJK Ideograph */
- [0x9c10, 0x9c10], /* CJK Ideograph */
- [0x9c11, 0x9c11], /* CJK Ideograph */
- [0x9c12, 0x9c12], /* CJK Ideograph */
- [0x9c13, 0x9c13], /* CJK Ideograph */
- [0x9c14, 0x9c14], /* CJK Ideograph */
- [0x9c15, 0x9c15], /* CJK Ideograph */
- [0x9c16, 0x9c16], /* CJK Ideograph */
- [0x9c17, 0x9c17], /* CJK Ideograph */
- [0x9c18, 0x9c18], /* CJK Ideograph */
- [0x9c19, 0x9c19], /* CJK Ideograph */
- [0x9c1a, 0x9c1a], /* CJK Ideograph */
- [0x9c1b, 0x9c1b], /* CJK Ideograph */
- [0x9c1c, 0x9c1c], /* CJK Ideograph */
- [0x9c1d, 0x9c1d], /* CJK Ideograph */
- [0x9c1e, 0x9c1e], /* CJK Ideograph */
- [0x9c1f, 0x9c1f], /* CJK Ideograph */
- [0x9c20, 0x9c20], /* CJK Ideograph */
- [0x9c21, 0x9c21], /* CJK Ideograph */
- [0x9c22, 0x9c22], /* CJK Ideograph */
- [0x9c23, 0x9c23], /* CJK Ideograph */
- [0x9c24, 0x9c24], /* CJK Ideograph */
- [0x9c25, 0x9c25], /* CJK Ideograph */
- [0x9c26, 0x9c26], /* CJK Ideograph */
- [0x9c27, 0x9c27], /* CJK Ideograph */
- [0x9c28, 0x9c28], /* CJK Ideograph */
- [0x9c29, 0x9c29], /* CJK Ideograph */
- [0x9c2a, 0x9c2a], /* CJK Ideograph */
- [0x9c2b, 0x9c2b], /* CJK Ideograph */
- [0x9c2c, 0x9c2c], /* CJK Ideograph */
- [0x9c2d, 0x9c2d], /* CJK Ideograph */
- [0x9c2e, 0x9c2e], /* CJK Ideograph */
- [0x9c2f, 0x9c2f], /* CJK Ideograph */
- [0x9c30, 0x9c30], /* CJK Ideograph */
- [0x9c31, 0x9c31], /* CJK Ideograph */
- [0x9c32, 0x9c32], /* CJK Ideograph */
- [0x9c33, 0x9c33], /* CJK Ideograph */
- [0x9c34, 0x9c34], /* CJK Ideograph */
- [0x9c35, 0x9c35], /* CJK Ideograph */
- [0x9c36, 0x9c36], /* CJK Ideograph */
- [0x9c37, 0x9c37], /* CJK Ideograph */
- [0x9c38, 0x9c38], /* CJK Ideograph */
- [0x9c39, 0x9c39], /* CJK Ideograph */
- [0x9c3a, 0x9c3a], /* CJK Ideograph */
- [0x9c3b, 0x9c3b], /* CJK Ideograph */
- [0x9c3c, 0x9c3c], /* CJK Ideograph */
- [0x9c3d, 0x9c3d], /* CJK Ideograph */
- [0x9c3e, 0x9c3e], /* CJK Ideograph */
- [0x9c3f, 0x9c3f], /* CJK Ideograph */
- [0x9c40, 0x9c40], /* CJK Ideograph */
- [0x9c41, 0x9c41], /* CJK Ideograph */
- [0x9c42, 0x9c42], /* CJK Ideograph */
- [0x9c43, 0x9c43], /* CJK Ideograph */
- [0x9c44, 0x9c44], /* CJK Ideograph */
- [0x9c45, 0x9c45], /* CJK Ideograph */
- [0x9c46, 0x9c46], /* CJK Ideograph */
- [0x9c47, 0x9c47], /* CJK Ideograph */
- [0x9c48, 0x9c48], /* CJK Ideograph */
- [0x9c49, 0x9c49], /* CJK Ideograph */
- [0x9c4a, 0x9c4a], /* CJK Ideograph */
- [0x9c4b, 0x9c4b], /* CJK Ideograph */
- [0x9c4c, 0x9c4c], /* CJK Ideograph */
- [0x9c4d, 0x9c4d], /* CJK Ideograph */
- [0x9c4e, 0x9c4e], /* CJK Ideograph */
- [0x9c4f, 0x9c4f], /* CJK Ideograph */
- [0x9c50, 0x9c50], /* CJK Ideograph */
- [0x9c51, 0x9c51], /* CJK Ideograph */
- [0x9c52, 0x9c52], /* CJK Ideograph */
- [0x9c53, 0x9c53], /* CJK Ideograph */
- [0x9c54, 0x9c54], /* CJK Ideograph */
- [0x9c55, 0x9c55], /* CJK Ideograph */
- [0x9c56, 0x9c56], /* CJK Ideograph */
- [0x9c57, 0x9c57], /* CJK Ideograph */
- [0x9c58, 0x9c58], /* CJK Ideograph */
- [0x9c59, 0x9c59], /* CJK Ideograph */
- [0x9c5a, 0x9c5a], /* CJK Ideograph */
- [0x9c5b, 0x9c5b], /* CJK Ideograph */
- [0x9c5c, 0x9c5c], /* CJK Ideograph */
- [0x9c5d, 0x9c5d], /* CJK Ideograph */
- [0x9c5e, 0x9c5e], /* CJK Ideograph */
- [0x9c5f, 0x9c5f], /* CJK Ideograph */
- [0x9c60, 0x9c60], /* CJK Ideograph */
- [0x9c61, 0x9c61], /* CJK Ideograph */
- [0x9c62, 0x9c62], /* CJK Ideograph */
- [0x9c63, 0x9c63], /* CJK Ideograph */
- [0x9c64, 0x9c64], /* CJK Ideograph */
- [0x9c65, 0x9c65], /* CJK Ideograph */
- [0x9c66, 0x9c66], /* CJK Ideograph */
- [0x9c67, 0x9c67], /* CJK Ideograph */
- [0x9c68, 0x9c68], /* CJK Ideograph */
- [0x9c69, 0x9c69], /* CJK Ideograph */
- [0x9c6a, 0x9c6a], /* CJK Ideograph */
- [0x9c6b, 0x9c6b], /* CJK Ideograph */
- [0x9c6c, 0x9c6c], /* CJK Ideograph */
- [0x9c6d, 0x9c6d], /* CJK Ideograph */
- [0x9c6e, 0x9c6e], /* CJK Ideograph */
- [0x9c6f, 0x9c6f], /* CJK Ideograph */
- [0x9c70, 0x9c70], /* CJK Ideograph */
- [0x9c71, 0x9c71], /* CJK Ideograph */
- [0x9c72, 0x9c72], /* CJK Ideograph */
- [0x9c73, 0x9c73], /* CJK Ideograph */
- [0x9c74, 0x9c74], /* CJK Ideograph */
- [0x9c75, 0x9c75], /* CJK Ideograph */
- [0x9c76, 0x9c76], /* CJK Ideograph */
- [0x9c77, 0x9c77], /* CJK Ideograph */
- [0x9c78, 0x9c78], /* CJK Ideograph */
- [0x9c79, 0x9c79], /* CJK Ideograph */
- [0x9c7a, 0x9c7a], /* CJK Ideograph */
- [0x9c7b, 0x9c7b], /* CJK Ideograph */
- [0x9c7c, 0x9c7c], /* CJK Ideograph */
- [0x9c7d, 0x9c7d], /* CJK Ideograph */
- [0x9c7e, 0x9c7e], /* CJK Ideograph */
- [0x9c7f, 0x9c7f], /* CJK Ideograph */
- [0x9c80, 0x9c80], /* CJK Ideograph */
- [0x9c81, 0x9c81], /* CJK Ideograph */
- [0x9c82, 0x9c82], /* CJK Ideograph */
- [0x9c83, 0x9c83], /* CJK Ideograph */
- [0x9c84, 0x9c84], /* CJK Ideograph */
- [0x9c85, 0x9c85], /* CJK Ideograph */
- [0x9c86, 0x9c86], /* CJK Ideograph */
- [0x9c87, 0x9c87], /* CJK Ideograph */
- [0x9c88, 0x9c88], /* CJK Ideograph */
- [0x9c89, 0x9c89], /* CJK Ideograph */
- [0x9c8a, 0x9c8a], /* CJK Ideograph */
- [0x9c8b, 0x9c8b], /* CJK Ideograph */
- [0x9c8c, 0x9c8c], /* CJK Ideograph */
- [0x9c8d, 0x9c8d], /* CJK Ideograph */
- [0x9c8e, 0x9c8e], /* CJK Ideograph */
- [0x9c8f, 0x9c8f], /* CJK Ideograph */
- [0x9c90, 0x9c90], /* CJK Ideograph */
- [0x9c91, 0x9c91], /* CJK Ideograph */
- [0x9c92, 0x9c92], /* CJK Ideograph */
- [0x9c93, 0x9c93], /* CJK Ideograph */
- [0x9c94, 0x9c94], /* CJK Ideograph */
- [0x9c95, 0x9c95], /* CJK Ideograph */
- [0x9c96, 0x9c96], /* CJK Ideograph */
- [0x9c97, 0x9c97], /* CJK Ideograph */
- [0x9c98, 0x9c98], /* CJK Ideograph */
- [0x9c99, 0x9c99], /* CJK Ideograph */
- [0x9c9a, 0x9c9a], /* CJK Ideograph */
- [0x9c9b, 0x9c9b], /* CJK Ideograph */
- [0x9c9c, 0x9c9c], /* CJK Ideograph */
- [0x9c9d, 0x9c9d], /* CJK Ideograph */
- [0x9c9e, 0x9c9e], /* CJK Ideograph */
- [0x9c9f, 0x9c9f], /* CJK Ideograph */
- [0x9ca0, 0x9ca0], /* CJK Ideograph */
- [0x9ca1, 0x9ca1], /* CJK Ideograph */
- [0x9ca2, 0x9ca2], /* CJK Ideograph */
- [0x9ca3, 0x9ca3], /* CJK Ideograph */
- [0x9ca4, 0x9ca4], /* CJK Ideograph */
- [0x9ca5, 0x9ca5], /* CJK Ideograph */
- [0x9ca6, 0x9ca6], /* CJK Ideograph */
- [0x9ca7, 0x9ca7], /* CJK Ideograph */
- [0x9ca8, 0x9ca8], /* CJK Ideograph */
- [0x9ca9, 0x9ca9], /* CJK Ideograph */
- [0x9caa, 0x9caa], /* CJK Ideograph */
- [0x9cab, 0x9cab], /* CJK Ideograph */
- [0x9cac, 0x9cac], /* CJK Ideograph */
- [0x9cad, 0x9cad], /* CJK Ideograph */
- [0x9cae, 0x9cae], /* CJK Ideograph */
- [0x9caf, 0x9caf], /* CJK Ideograph */
- [0x9cb0, 0x9cb0], /* CJK Ideograph */
- [0x9cb1, 0x9cb1], /* CJK Ideograph */
- [0x9cb2, 0x9cb2], /* CJK Ideograph */
- [0x9cb3, 0x9cb3], /* CJK Ideograph */
- [0x9cb4, 0x9cb4], /* CJK Ideograph */
- [0x9cb5, 0x9cb5], /* CJK Ideograph */
- [0x9cb6, 0x9cb6], /* CJK Ideograph */
- [0x9cb7, 0x9cb7], /* CJK Ideograph */
- [0x9cb8, 0x9cb8], /* CJK Ideograph */
- [0x9cb9, 0x9cb9], /* CJK Ideograph */
- [0x9cba, 0x9cba], /* CJK Ideograph */
- [0x9cbb, 0x9cbb], /* CJK Ideograph */
- [0x9cbc, 0x9cbc], /* CJK Ideograph */
- [0x9cbd, 0x9cbd], /* CJK Ideograph */
- [0x9cbe, 0x9cbe], /* CJK Ideograph */
- [0x9cbf, 0x9cbf], /* CJK Ideograph */
- [0x9cc0, 0x9cc0], /* CJK Ideograph */
- [0x9cc1, 0x9cc1], /* CJK Ideograph */
- [0x9cc2, 0x9cc2], /* CJK Ideograph */
- [0x9cc3, 0x9cc3], /* CJK Ideograph */
- [0x9cc4, 0x9cc4], /* CJK Ideograph */
- [0x9cc5, 0x9cc5], /* CJK Ideograph */
- [0x9cc6, 0x9cc6], /* CJK Ideograph */
- [0x9cc7, 0x9cc7], /* CJK Ideograph */
- [0x9cc8, 0x9cc8], /* CJK Ideograph */
- [0x9cc9, 0x9cc9], /* CJK Ideograph */
- [0x9cca, 0x9cca], /* CJK Ideograph */
- [0x9ccb, 0x9ccb], /* CJK Ideograph */
- [0x9ccc, 0x9ccc], /* CJK Ideograph */
- [0x9ccd, 0x9ccd], /* CJK Ideograph */
- [0x9cce, 0x9cce], /* CJK Ideograph */
- [0x9ccf, 0x9ccf], /* CJK Ideograph */
- [0x9cd0, 0x9cd0], /* CJK Ideograph */
- [0x9cd1, 0x9cd1], /* CJK Ideograph */
- [0x9cd2, 0x9cd2], /* CJK Ideograph */
- [0x9cd3, 0x9cd3], /* CJK Ideograph */
- [0x9cd4, 0x9cd4], /* CJK Ideograph */
- [0x9cd5, 0x9cd5], /* CJK Ideograph */
- [0x9cd6, 0x9cd6], /* CJK Ideograph */
- [0x9cd7, 0x9cd7], /* CJK Ideograph */
- [0x9cd8, 0x9cd8], /* CJK Ideograph */
- [0x9cd9, 0x9cd9], /* CJK Ideograph */
- [0x9cda, 0x9cda], /* CJK Ideograph */
- [0x9cdb, 0x9cdb], /* CJK Ideograph */
- [0x9cdc, 0x9cdc], /* CJK Ideograph */
- [0x9cdd, 0x9cdd], /* CJK Ideograph */
- [0x9cde, 0x9cde], /* CJK Ideograph */
- [0x9cdf, 0x9cdf], /* CJK Ideograph */
- [0x9ce0, 0x9ce0], /* CJK Ideograph */
- [0x9ce1, 0x9ce1], /* CJK Ideograph */
- [0x9ce2, 0x9ce2], /* CJK Ideograph */
- [0x9ce3, 0x9ce3], /* CJK Ideograph */
- [0x9ce4, 0x9ce4], /* CJK Ideograph */
- [0x9ce5, 0x9ce5], /* CJK Ideograph */
- [0x9ce6, 0x9ce6], /* CJK Ideograph */
- [0x9ce7, 0x9ce7], /* CJK Ideograph */
- [0x9ce8, 0x9ce8], /* CJK Ideograph */
- [0x9ce9, 0x9ce9], /* CJK Ideograph */
- [0x9cea, 0x9cea], /* CJK Ideograph */
- [0x9ceb, 0x9ceb], /* CJK Ideograph */
- [0x9cec, 0x9cec], /* CJK Ideograph */
- [0x9ced, 0x9ced], /* CJK Ideograph */
- [0x9cee, 0x9cee], /* CJK Ideograph */
- [0x9cef, 0x9cef], /* CJK Ideograph */
- [0x9cf0, 0x9cf0], /* CJK Ideograph */
- [0x9cf1, 0x9cf1], /* CJK Ideograph */
- [0x9cf2, 0x9cf2], /* CJK Ideograph */
- [0x9cf3, 0x9cf3], /* CJK Ideograph */
- [0x9cf4, 0x9cf4], /* CJK Ideograph */
- [0x9cf5, 0x9cf5], /* CJK Ideograph */
- [0x9cf6, 0x9cf6], /* CJK Ideograph */
- [0x9cf7, 0x9cf7], /* CJK Ideograph */
- [0x9cf8, 0x9cf8], /* CJK Ideograph */
- [0x9cf9, 0x9cf9], /* CJK Ideograph */
- [0x9cfa, 0x9cfa], /* CJK Ideograph */
- [0x9cfb, 0x9cfb], /* CJK Ideograph */
- [0x9cfc, 0x9cfc], /* CJK Ideograph */
- [0x9cfd, 0x9cfd], /* CJK Ideograph */
- [0x9cfe, 0x9cfe], /* CJK Ideograph */
- [0x9cff, 0x9cff], /* CJK Ideograph */
- [0x9d00, 0x9d00], /* CJK Ideograph */
- [0x9d01, 0x9d01], /* CJK Ideograph */
- [0x9d02, 0x9d02], /* CJK Ideograph */
- [0x9d03, 0x9d03], /* CJK Ideograph */
- [0x9d04, 0x9d04], /* CJK Ideograph */
- [0x9d05, 0x9d05], /* CJK Ideograph */
- [0x9d06, 0x9d06], /* CJK Ideograph */
- [0x9d07, 0x9d07], /* CJK Ideograph */
- [0x9d08, 0x9d08], /* CJK Ideograph */
- [0x9d09, 0x9d09], /* CJK Ideograph */
- [0x9d0a, 0x9d0a], /* CJK Ideograph */
- [0x9d0b, 0x9d0b], /* CJK Ideograph */
- [0x9d0c, 0x9d0c], /* CJK Ideograph */
- [0x9d0d, 0x9d0d], /* CJK Ideograph */
- [0x9d0e, 0x9d0e], /* CJK Ideograph */
- [0x9d0f, 0x9d0f], /* CJK Ideograph */
- [0x9d10, 0x9d10], /* CJK Ideograph */
- [0x9d11, 0x9d11], /* CJK Ideograph */
- [0x9d12, 0x9d12], /* CJK Ideograph */
- [0x9d13, 0x9d13], /* CJK Ideograph */
- [0x9d14, 0x9d14], /* CJK Ideograph */
- [0x9d15, 0x9d15], /* CJK Ideograph */
- [0x9d16, 0x9d16], /* CJK Ideograph */
- [0x9d17, 0x9d17], /* CJK Ideograph */
- [0x9d18, 0x9d18], /* CJK Ideograph */
- [0x9d19, 0x9d19], /* CJK Ideograph */
- [0x9d1a, 0x9d1a], /* CJK Ideograph */
- [0x9d1b, 0x9d1b], /* CJK Ideograph */
- [0x9d1c, 0x9d1c], /* CJK Ideograph */
- [0x9d1d, 0x9d1d], /* CJK Ideograph */
- [0x9d1e, 0x9d1e], /* CJK Ideograph */
- [0x9d1f, 0x9d1f], /* CJK Ideograph */
- [0x9d20, 0x9d20], /* CJK Ideograph */
- [0x9d21, 0x9d21], /* CJK Ideograph */
- [0x9d22, 0x9d22], /* CJK Ideograph */
- [0x9d23, 0x9d23], /* CJK Ideograph */
- [0x9d24, 0x9d24], /* CJK Ideograph */
- [0x9d25, 0x9d25], /* CJK Ideograph */
- [0x9d26, 0x9d26], /* CJK Ideograph */
- [0x9d27, 0x9d27], /* CJK Ideograph */
- [0x9d28, 0x9d28], /* CJK Ideograph */
- [0x9d29, 0x9d29], /* CJK Ideograph */
- [0x9d2a, 0x9d2a], /* CJK Ideograph */
- [0x9d2b, 0x9d2b], /* CJK Ideograph */
- [0x9d2c, 0x9d2c], /* CJK Ideograph */
- [0x9d2d, 0x9d2d], /* CJK Ideograph */
- [0x9d2e, 0x9d2e], /* CJK Ideograph */
- [0x9d2f, 0x9d2f], /* CJK Ideograph */
- [0x9d30, 0x9d30], /* CJK Ideograph */
- [0x9d31, 0x9d31], /* CJK Ideograph */
- [0x9d32, 0x9d32], /* CJK Ideograph */
- [0x9d33, 0x9d33], /* CJK Ideograph */
- [0x9d34, 0x9d34], /* CJK Ideograph */
- [0x9d35, 0x9d35], /* CJK Ideograph */
- [0x9d36, 0x9d36], /* CJK Ideograph */
- [0x9d37, 0x9d37], /* CJK Ideograph */
- [0x9d38, 0x9d38], /* CJK Ideograph */
- [0x9d39, 0x9d39], /* CJK Ideograph */
- [0x9d3a, 0x9d3a], /* CJK Ideograph */
- [0x9d3b, 0x9d3b], /* CJK Ideograph */
- [0x9d3c, 0x9d3c], /* CJK Ideograph */
- [0x9d3d, 0x9d3d], /* CJK Ideograph */
- [0x9d3e, 0x9d3e], /* CJK Ideograph */
- [0x9d3f, 0x9d3f], /* CJK Ideograph */
- [0x9d40, 0x9d40], /* CJK Ideograph */
- [0x9d41, 0x9d41], /* CJK Ideograph */
- [0x9d42, 0x9d42], /* CJK Ideograph */
- [0x9d43, 0x9d43], /* CJK Ideograph */
- [0x9d44, 0x9d44], /* CJK Ideograph */
- [0x9d45, 0x9d45], /* CJK Ideograph */
- [0x9d46, 0x9d46], /* CJK Ideograph */
- [0x9d47, 0x9d47], /* CJK Ideograph */
- [0x9d48, 0x9d48], /* CJK Ideograph */
- [0x9d49, 0x9d49], /* CJK Ideograph */
- [0x9d4a, 0x9d4a], /* CJK Ideograph */
- [0x9d4b, 0x9d4b], /* CJK Ideograph */
- [0x9d4c, 0x9d4c], /* CJK Ideograph */
- [0x9d4d, 0x9d4d], /* CJK Ideograph */
- [0x9d4e, 0x9d4e], /* CJK Ideograph */
- [0x9d4f, 0x9d4f], /* CJK Ideograph */
- [0x9d50, 0x9d50], /* CJK Ideograph */
- [0x9d51, 0x9d51], /* CJK Ideograph */
- [0x9d52, 0x9d52], /* CJK Ideograph */
- [0x9d53, 0x9d53], /* CJK Ideograph */
- [0x9d54, 0x9d54], /* CJK Ideograph */
- [0x9d55, 0x9d55], /* CJK Ideograph */
- [0x9d56, 0x9d56], /* CJK Ideograph */
- [0x9d57, 0x9d57], /* CJK Ideograph */
- [0x9d58, 0x9d58], /* CJK Ideograph */
- [0x9d59, 0x9d59], /* CJK Ideograph */
- [0x9d5a, 0x9d5a], /* CJK Ideograph */
- [0x9d5b, 0x9d5b], /* CJK Ideograph */
- [0x9d5c, 0x9d5c], /* CJK Ideograph */
- [0x9d5d, 0x9d5d], /* CJK Ideograph */
- [0x9d5e, 0x9d5e], /* CJK Ideograph */
- [0x9d5f, 0x9d5f], /* CJK Ideograph */
- [0x9d60, 0x9d60], /* CJK Ideograph */
- [0x9d61, 0x9d61], /* CJK Ideograph */
- [0x9d62, 0x9d62], /* CJK Ideograph */
- [0x9d63, 0x9d63], /* CJK Ideograph */
- [0x9d64, 0x9d64], /* CJK Ideograph */
- [0x9d65, 0x9d65], /* CJK Ideograph */
- [0x9d66, 0x9d66], /* CJK Ideograph */
- [0x9d67, 0x9d67], /* CJK Ideograph */
- [0x9d68, 0x9d68], /* CJK Ideograph */
- [0x9d69, 0x9d69], /* CJK Ideograph */
- [0x9d6a, 0x9d6a], /* CJK Ideograph */
- [0x9d6b, 0x9d6b], /* CJK Ideograph */
- [0x9d6c, 0x9d6c], /* CJK Ideograph */
- [0x9d6d, 0x9d6d], /* CJK Ideograph */
- [0x9d6e, 0x9d6e], /* CJK Ideograph */
- [0x9d6f, 0x9d6f], /* CJK Ideograph */
- [0x9d70, 0x9d70], /* CJK Ideograph */
- [0x9d71, 0x9d71], /* CJK Ideograph */
- [0x9d72, 0x9d72], /* CJK Ideograph */
- [0x9d73, 0x9d73], /* CJK Ideograph */
- [0x9d74, 0x9d74], /* CJK Ideograph */
- [0x9d75, 0x9d75], /* CJK Ideograph */
- [0x9d76, 0x9d76], /* CJK Ideograph */
- [0x9d77, 0x9d77], /* CJK Ideograph */
- [0x9d78, 0x9d78], /* CJK Ideograph */
- [0x9d79, 0x9d79], /* CJK Ideograph */
- [0x9d7a, 0x9d7a], /* CJK Ideograph */
- [0x9d7b, 0x9d7b], /* CJK Ideograph */
- [0x9d7c, 0x9d7c], /* CJK Ideograph */
- [0x9d7d, 0x9d7d], /* CJK Ideograph */
- [0x9d7e, 0x9d7e], /* CJK Ideograph */
- [0x9d7f, 0x9d7f], /* CJK Ideograph */
- [0x9d80, 0x9d80], /* CJK Ideograph */
- [0x9d81, 0x9d81], /* CJK Ideograph */
- [0x9d82, 0x9d82], /* CJK Ideograph */
- [0x9d83, 0x9d83], /* CJK Ideograph */
- [0x9d84, 0x9d84], /* CJK Ideograph */
- [0x9d85, 0x9d85], /* CJK Ideograph */
- [0x9d86, 0x9d86], /* CJK Ideograph */
- [0x9d87, 0x9d87], /* CJK Ideograph */
- [0x9d88, 0x9d88], /* CJK Ideograph */
- [0x9d89, 0x9d89], /* CJK Ideograph */
- [0x9d8a, 0x9d8a], /* CJK Ideograph */
- [0x9d8b, 0x9d8b], /* CJK Ideograph */
- [0x9d8c, 0x9d8c], /* CJK Ideograph */
- [0x9d8d, 0x9d8d], /* CJK Ideograph */
- [0x9d8e, 0x9d8e], /* CJK Ideograph */
- [0x9d8f, 0x9d8f], /* CJK Ideograph */
- [0x9d90, 0x9d90], /* CJK Ideograph */
- [0x9d91, 0x9d91], /* CJK Ideograph */
- [0x9d92, 0x9d92], /* CJK Ideograph */
- [0x9d93, 0x9d93], /* CJK Ideograph */
- [0x9d94, 0x9d94], /* CJK Ideograph */
- [0x9d95, 0x9d95], /* CJK Ideograph */
- [0x9d96, 0x9d96], /* CJK Ideograph */
- [0x9d97, 0x9d97], /* CJK Ideograph */
- [0x9d98, 0x9d98], /* CJK Ideograph */
- [0x9d99, 0x9d99], /* CJK Ideograph */
- [0x9d9a, 0x9d9a], /* CJK Ideograph */
- [0x9d9b, 0x9d9b], /* CJK Ideograph */
- [0x9d9c, 0x9d9c], /* CJK Ideograph */
- [0x9d9d, 0x9d9d], /* CJK Ideograph */
- [0x9d9e, 0x9d9e], /* CJK Ideograph */
- [0x9d9f, 0x9d9f], /* CJK Ideograph */
- [0x9da0, 0x9da0], /* CJK Ideograph */
- [0x9da1, 0x9da1], /* CJK Ideograph */
- [0x9da2, 0x9da2], /* CJK Ideograph */
- [0x9da3, 0x9da3], /* CJK Ideograph */
- [0x9da4, 0x9da4], /* CJK Ideograph */
- [0x9da5, 0x9da5], /* CJK Ideograph */
- [0x9da6, 0x9da6], /* CJK Ideograph */
- [0x9da7, 0x9da7], /* CJK Ideograph */
- [0x9da8, 0x9da8], /* CJK Ideograph */
- [0x9da9, 0x9da9], /* CJK Ideograph */
- [0x9daa, 0x9daa], /* CJK Ideograph */
- [0x9dab, 0x9dab], /* CJK Ideograph */
- [0x9dac, 0x9dac], /* CJK Ideograph */
- [0x9dad, 0x9dad], /* CJK Ideograph */
- [0x9dae, 0x9dae], /* CJK Ideograph */
- [0x9daf, 0x9daf], /* CJK Ideograph */
- [0x9db0, 0x9db0], /* CJK Ideograph */
- [0x9db1, 0x9db1], /* CJK Ideograph */
- [0x9db2, 0x9db2], /* CJK Ideograph */
- [0x9db3, 0x9db3], /* CJK Ideograph */
- [0x9db4, 0x9db4], /* CJK Ideograph */
- [0x9db5, 0x9db5], /* CJK Ideograph */
- [0x9db6, 0x9db6], /* CJK Ideograph */
- [0x9db7, 0x9db7], /* CJK Ideograph */
- [0x9db8, 0x9db8], /* CJK Ideograph */
- [0x9db9, 0x9db9], /* CJK Ideograph */
- [0x9dba, 0x9dba], /* CJK Ideograph */
- [0x9dbb, 0x9dbb], /* CJK Ideograph */
- [0x9dbc, 0x9dbc], /* CJK Ideograph */
- [0x9dbd, 0x9dbd], /* CJK Ideograph */
- [0x9dbe, 0x9dbe], /* CJK Ideograph */
- [0x9dbf, 0x9dbf], /* CJK Ideograph */
- [0x9dc0, 0x9dc0], /* CJK Ideograph */
- [0x9dc1, 0x9dc1], /* CJK Ideograph */
- [0x9dc2, 0x9dc2], /* CJK Ideograph */
- [0x9dc3, 0x9dc3], /* CJK Ideograph */
- [0x9dc4, 0x9dc4], /* CJK Ideograph */
- [0x9dc5, 0x9dc5], /* CJK Ideograph */
- [0x9dc6, 0x9dc6], /* CJK Ideograph */
- [0x9dc7, 0x9dc7], /* CJK Ideograph */
- [0x9dc8, 0x9dc8], /* CJK Ideograph */
- [0x9dc9, 0x9dc9], /* CJK Ideograph */
- [0x9dca, 0x9dca], /* CJK Ideograph */
- [0x9dcb, 0x9dcb], /* CJK Ideograph */
- [0x9dcc, 0x9dcc], /* CJK Ideograph */
- [0x9dcd, 0x9dcd], /* CJK Ideograph */
- [0x9dce, 0x9dce], /* CJK Ideograph */
- [0x9dcf, 0x9dcf], /* CJK Ideograph */
- [0x9dd0, 0x9dd0], /* CJK Ideograph */
- [0x9dd1, 0x9dd1], /* CJK Ideograph */
- [0x9dd2, 0x9dd2], /* CJK Ideograph */
- [0x9dd3, 0x9dd3], /* CJK Ideograph */
- [0x9dd4, 0x9dd4], /* CJK Ideograph */
- [0x9dd5, 0x9dd5], /* CJK Ideograph */
- [0x9dd6, 0x9dd6], /* CJK Ideograph */
- [0x9dd7, 0x9dd7], /* CJK Ideograph */
- [0x9dd8, 0x9dd8], /* CJK Ideograph */
- [0x9dd9, 0x9dd9], /* CJK Ideograph */
- [0x9dda, 0x9dda], /* CJK Ideograph */
- [0x9ddb, 0x9ddb], /* CJK Ideograph */
- [0x9ddc, 0x9ddc], /* CJK Ideograph */
- [0x9ddd, 0x9ddd], /* CJK Ideograph */
- [0x9dde, 0x9dde], /* CJK Ideograph */
- [0x9ddf, 0x9ddf], /* CJK Ideograph */
- [0x9de0, 0x9de0], /* CJK Ideograph */
- [0x9de1, 0x9de1], /* CJK Ideograph */
- [0x9de2, 0x9de2], /* CJK Ideograph */
- [0x9de3, 0x9de3], /* CJK Ideograph */
- [0x9de4, 0x9de4], /* CJK Ideograph */
- [0x9de5, 0x9de5], /* CJK Ideograph */
- [0x9de6, 0x9de6], /* CJK Ideograph */
- [0x9de7, 0x9de7], /* CJK Ideograph */
- [0x9de8, 0x9de8], /* CJK Ideograph */
- [0x9de9, 0x9de9], /* CJK Ideograph */
- [0x9dea, 0x9dea], /* CJK Ideograph */
- [0x9deb, 0x9deb], /* CJK Ideograph */
- [0x9dec, 0x9dec], /* CJK Ideograph */
- [0x9ded, 0x9ded], /* CJK Ideograph */
- [0x9dee, 0x9dee], /* CJK Ideograph */
- [0x9def, 0x9def], /* CJK Ideograph */
- [0x9df0, 0x9df0], /* CJK Ideograph */
- [0x9df1, 0x9df1], /* CJK Ideograph */
- [0x9df2, 0x9df2], /* CJK Ideograph */
- [0x9df3, 0x9df3], /* CJK Ideograph */
- [0x9df4, 0x9df4], /* CJK Ideograph */
- [0x9df5, 0x9df5], /* CJK Ideograph */
- [0x9df6, 0x9df6], /* CJK Ideograph */
- [0x9df7, 0x9df7], /* CJK Ideograph */
- [0x9df8, 0x9df8], /* CJK Ideograph */
- [0x9df9, 0x9df9], /* CJK Ideograph */
- [0x9dfa, 0x9dfa], /* CJK Ideograph */
- [0x9dfb, 0x9dfb], /* CJK Ideograph */
- [0x9dfc, 0x9dfc], /* CJK Ideograph */
- [0x9dfd, 0x9dfd], /* CJK Ideograph */
- [0x9dfe, 0x9dfe], /* CJK Ideograph */
- [0x9dff, 0x9dff], /* CJK Ideograph */
- [0x9e00, 0x9e00], /* CJK Ideograph */
- [0x9e01, 0x9e01], /* CJK Ideograph */
- [0x9e02, 0x9e02], /* CJK Ideograph */
- [0x9e03, 0x9e03], /* CJK Ideograph */
- [0x9e04, 0x9e04], /* CJK Ideograph */
- [0x9e05, 0x9e05], /* CJK Ideograph */
- [0x9e06, 0x9e06], /* CJK Ideograph */
- [0x9e07, 0x9e07], /* CJK Ideograph */
- [0x9e08, 0x9e08], /* CJK Ideograph */
- [0x9e09, 0x9e09], /* CJK Ideograph */
- [0x9e0a, 0x9e0a], /* CJK Ideograph */
- [0x9e0b, 0x9e0b], /* CJK Ideograph */
- [0x9e0c, 0x9e0c], /* CJK Ideograph */
- [0x9e0d, 0x9e0d], /* CJK Ideograph */
- [0x9e0e, 0x9e0e], /* CJK Ideograph */
- [0x9e0f, 0x9e0f], /* CJK Ideograph */
- [0x9e10, 0x9e10], /* CJK Ideograph */
- [0x9e11, 0x9e11], /* CJK Ideograph */
- [0x9e12, 0x9e12], /* CJK Ideograph */
- [0x9e13, 0x9e13], /* CJK Ideograph */
- [0x9e14, 0x9e14], /* CJK Ideograph */
- [0x9e15, 0x9e15], /* CJK Ideograph */
- [0x9e16, 0x9e16], /* CJK Ideograph */
- [0x9e17, 0x9e17], /* CJK Ideograph */
- [0x9e18, 0x9e18], /* CJK Ideograph */
- [0x9e19, 0x9e19], /* CJK Ideograph */
- [0x9e1a, 0x9e1a], /* CJK Ideograph */
- [0x9e1b, 0x9e1b], /* CJK Ideograph */
- [0x9e1c, 0x9e1c], /* CJK Ideograph */
- [0x9e1d, 0x9e1d], /* CJK Ideograph */
- [0x9e1e, 0x9e1e], /* CJK Ideograph */
- [0x9e1f, 0x9e1f], /* CJK Ideograph */
- [0x9e20, 0x9e20], /* CJK Ideograph */
- [0x9e21, 0x9e21], /* CJK Ideograph */
- [0x9e22, 0x9e22], /* CJK Ideograph */
- [0x9e23, 0x9e23], /* CJK Ideograph */
- [0x9e24, 0x9e24], /* CJK Ideograph */
- [0x9e25, 0x9e25], /* CJK Ideograph */
- [0x9e26, 0x9e26], /* CJK Ideograph */
- [0x9e27, 0x9e27], /* CJK Ideograph */
- [0x9e28, 0x9e28], /* CJK Ideograph */
- [0x9e29, 0x9e29], /* CJK Ideograph */
- [0x9e2a, 0x9e2a], /* CJK Ideograph */
- [0x9e2b, 0x9e2b], /* CJK Ideograph */
- [0x9e2c, 0x9e2c], /* CJK Ideograph */
- [0x9e2d, 0x9e2d], /* CJK Ideograph */
- [0x9e2e, 0x9e2e], /* CJK Ideograph */
- [0x9e2f, 0x9e2f], /* CJK Ideograph */
- [0x9e30, 0x9e30], /* CJK Ideograph */
- [0x9e31, 0x9e31], /* CJK Ideograph */
- [0x9e32, 0x9e32], /* CJK Ideograph */
- [0x9e33, 0x9e33], /* CJK Ideograph */
- [0x9e34, 0x9e34], /* CJK Ideograph */
- [0x9e35, 0x9e35], /* CJK Ideograph */
- [0x9e36, 0x9e36], /* CJK Ideograph */
- [0x9e37, 0x9e37], /* CJK Ideograph */
- [0x9e38, 0x9e38], /* CJK Ideograph */
- [0x9e39, 0x9e39], /* CJK Ideograph */
- [0x9e3a, 0x9e3a], /* CJK Ideograph */
- [0x9e3b, 0x9e3b], /* CJK Ideograph */
- [0x9e3c, 0x9e3c], /* CJK Ideograph */
- [0x9e3d, 0x9e3d], /* CJK Ideograph */
- [0x9e3e, 0x9e3e], /* CJK Ideograph */
- [0x9e3f, 0x9e3f], /* CJK Ideograph */
- [0x9e40, 0x9e40], /* CJK Ideograph */
- [0x9e41, 0x9e41], /* CJK Ideograph */
- [0x9e42, 0x9e42], /* CJK Ideograph */
- [0x9e43, 0x9e43], /* CJK Ideograph */
- [0x9e44, 0x9e44], /* CJK Ideograph */
- [0x9e45, 0x9e45], /* CJK Ideograph */
- [0x9e46, 0x9e46], /* CJK Ideograph */
- [0x9e47, 0x9e47], /* CJK Ideograph */
- [0x9e48, 0x9e48], /* CJK Ideograph */
- [0x9e49, 0x9e49], /* CJK Ideograph */
- [0x9e4a, 0x9e4a], /* CJK Ideograph */
- [0x9e4b, 0x9e4b], /* CJK Ideograph */
- [0x9e4c, 0x9e4c], /* CJK Ideograph */
- [0x9e4d, 0x9e4d], /* CJK Ideograph */
- [0x9e4e, 0x9e4e], /* CJK Ideograph */
- [0x9e4f, 0x9e4f], /* CJK Ideograph */
- [0x9e50, 0x9e50], /* CJK Ideograph */
- [0x9e51, 0x9e51], /* CJK Ideograph */
- [0x9e52, 0x9e52], /* CJK Ideograph */
- [0x9e53, 0x9e53], /* CJK Ideograph */
- [0x9e54, 0x9e54], /* CJK Ideograph */
- [0x9e55, 0x9e55], /* CJK Ideograph */
- [0x9e56, 0x9e56], /* CJK Ideograph */
- [0x9e57, 0x9e57], /* CJK Ideograph */
- [0x9e58, 0x9e58], /* CJK Ideograph */
- [0x9e59, 0x9e59], /* CJK Ideograph */
- [0x9e5a, 0x9e5a], /* CJK Ideograph */
- [0x9e5b, 0x9e5b], /* CJK Ideograph */
- [0x9e5c, 0x9e5c], /* CJK Ideograph */
- [0x9e5d, 0x9e5d], /* CJK Ideograph */
- [0x9e5e, 0x9e5e], /* CJK Ideograph */
- [0x9e5f, 0x9e5f], /* CJK Ideograph */
- [0x9e60, 0x9e60], /* CJK Ideograph */
- [0x9e61, 0x9e61], /* CJK Ideograph */
- [0x9e62, 0x9e62], /* CJK Ideograph */
- [0x9e63, 0x9e63], /* CJK Ideograph */
- [0x9e64, 0x9e64], /* CJK Ideograph */
- [0x9e65, 0x9e65], /* CJK Ideograph */
- [0x9e66, 0x9e66], /* CJK Ideograph */
- [0x9e67, 0x9e67], /* CJK Ideograph */
- [0x9e68, 0x9e68], /* CJK Ideograph */
- [0x9e69, 0x9e69], /* CJK Ideograph */
- [0x9e6a, 0x9e6a], /* CJK Ideograph */
- [0x9e6b, 0x9e6b], /* CJK Ideograph */
- [0x9e6c, 0x9e6c], /* CJK Ideograph */
- [0x9e6d, 0x9e6d], /* CJK Ideograph */
- [0x9e6e, 0x9e6e], /* CJK Ideograph */
- [0x9e6f, 0x9e6f], /* CJK Ideograph */
- [0x9e70, 0x9e70], /* CJK Ideograph */
- [0x9e71, 0x9e71], /* CJK Ideograph */
- [0x9e72, 0x9e72], /* CJK Ideograph */
- [0x9e73, 0x9e73], /* CJK Ideograph */
- [0x9e74, 0x9e74], /* CJK Ideograph */
- [0x9e75, 0x9e75], /* CJK Ideograph */
- [0x9e76, 0x9e76], /* CJK Ideograph */
- [0x9e77, 0x9e77], /* CJK Ideograph */
- [0x9e78, 0x9e78], /* CJK Ideograph */
- [0x9e79, 0x9e79], /* CJK Ideograph */
- [0x9e7a, 0x9e7a], /* CJK Ideograph */
- [0x9e7b, 0x9e7b], /* CJK Ideograph */
- [0x9e7c, 0x9e7c], /* CJK Ideograph */
- [0x9e7d, 0x9e7d], /* CJK Ideograph */
- [0x9e7e, 0x9e7e], /* CJK Ideograph */
- [0x9e7f, 0x9e7f], /* CJK Ideograph */
- [0x9e80, 0x9e80], /* CJK Ideograph */
- [0x9e81, 0x9e81], /* CJK Ideograph */
- [0x9e82, 0x9e82], /* CJK Ideograph */
- [0x9e83, 0x9e83], /* CJK Ideograph */
- [0x9e84, 0x9e84], /* CJK Ideograph */
- [0x9e85, 0x9e85], /* CJK Ideograph */
- [0x9e86, 0x9e86], /* CJK Ideograph */
- [0x9e87, 0x9e87], /* CJK Ideograph */
- [0x9e88, 0x9e88], /* CJK Ideograph */
- [0x9e89, 0x9e89], /* CJK Ideograph */
- [0x9e8a, 0x9e8a], /* CJK Ideograph */
- [0x9e8b, 0x9e8b], /* CJK Ideograph */
- [0x9e8c, 0x9e8c], /* CJK Ideograph */
- [0x9e8d, 0x9e8d], /* CJK Ideograph */
- [0x9e8e, 0x9e8e], /* CJK Ideograph */
- [0x9e8f, 0x9e8f], /* CJK Ideograph */
- [0x9e90, 0x9e90], /* CJK Ideograph */
- [0x9e91, 0x9e91], /* CJK Ideograph */
- [0x9e92, 0x9e92], /* CJK Ideograph */
- [0x9e93, 0x9e93], /* CJK Ideograph */
- [0x9e94, 0x9e94], /* CJK Ideograph */
- [0x9e95, 0x9e95], /* CJK Ideograph */
- [0x9e96, 0x9e96], /* CJK Ideograph */
- [0x9e97, 0x9e97], /* CJK Ideograph */
- [0x9e98, 0x9e98], /* CJK Ideograph */
- [0x9e99, 0x9e99], /* CJK Ideograph */
- [0x9e9a, 0x9e9a], /* CJK Ideograph */
- [0x9e9b, 0x9e9b], /* CJK Ideograph */
- [0x9e9c, 0x9e9c], /* CJK Ideograph */
- [0x9e9d, 0x9e9d], /* CJK Ideograph */
- [0x9e9e, 0x9e9e], /* CJK Ideograph */
- [0x9e9f, 0x9e9f], /* CJK Ideograph */
- [0x9ea0, 0x9ea0], /* CJK Ideograph */
- [0x9ea1, 0x9ea1], /* CJK Ideograph */
- [0x9ea2, 0x9ea2], /* CJK Ideograph */
- [0x9ea3, 0x9ea3], /* CJK Ideograph */
- [0x9ea4, 0x9ea4], /* CJK Ideograph */
- [0x9ea5, 0x9ea5], /* CJK Ideograph */
- [0x9ea6, 0x9ea6], /* CJK Ideograph */
- [0x9ea7, 0x9ea7], /* CJK Ideograph */
- [0x9ea8, 0x9ea8], /* CJK Ideograph */
- [0x9ea9, 0x9ea9], /* CJK Ideograph */
- [0x9eaa, 0x9eaa], /* CJK Ideograph */
- [0x9eab, 0x9eab], /* CJK Ideograph */
- [0x9eac, 0x9eac], /* CJK Ideograph */
- [0x9ead, 0x9ead], /* CJK Ideograph */
- [0x9eae, 0x9eae], /* CJK Ideograph */
- [0x9eaf, 0x9eaf], /* CJK Ideograph */
- [0x9eb0, 0x9eb0], /* CJK Ideograph */
- [0x9eb1, 0x9eb1], /* CJK Ideograph */
- [0x9eb2, 0x9eb2], /* CJK Ideograph */
- [0x9eb3, 0x9eb3], /* CJK Ideograph */
- [0x9eb4, 0x9eb4], /* CJK Ideograph */
- [0x9eb5, 0x9eb5], /* CJK Ideograph */
- [0x9eb6, 0x9eb6], /* CJK Ideograph */
- [0x9eb7, 0x9eb7], /* CJK Ideograph */
- [0x9eb8, 0x9eb8], /* CJK Ideograph */
- [0x9eb9, 0x9eb9], /* CJK Ideograph */
- [0x9eba, 0x9eba], /* CJK Ideograph */
- [0x9ebb, 0x9ebb], /* CJK Ideograph */
- [0x9ebc, 0x9ebc], /* CJK Ideograph */
- [0x9ebd, 0x9ebd], /* CJK Ideograph */
- [0x9ebe, 0x9ebe], /* CJK Ideograph */
- [0x9ebf, 0x9ebf], /* CJK Ideograph */
- [0x9ec0, 0x9ec0], /* CJK Ideograph */
- [0x9ec1, 0x9ec1], /* CJK Ideograph */
- [0x9ec2, 0x9ec2], /* CJK Ideograph */
- [0x9ec3, 0x9ec3], /* CJK Ideograph */
- [0x9ec4, 0x9ec4], /* CJK Ideograph */
- [0x9ec5, 0x9ec5], /* CJK Ideograph */
- [0x9ec6, 0x9ec6], /* CJK Ideograph */
- [0x9ec7, 0x9ec7], /* CJK Ideograph */
- [0x9ec8, 0x9ec8], /* CJK Ideograph */
- [0x9ec9, 0x9ec9], /* CJK Ideograph */
- [0x9eca, 0x9eca], /* CJK Ideograph */
- [0x9ecb, 0x9ecb], /* CJK Ideograph */
- [0x9ecc, 0x9ecc], /* CJK Ideograph */
- [0x9ecd, 0x9ecd], /* CJK Ideograph */
- [0x9ece, 0x9ece], /* CJK Ideograph */
- [0x9ecf, 0x9ecf], /* CJK Ideograph */
- [0x9ed0, 0x9ed0], /* CJK Ideograph */
- [0x9ed1, 0x9ed1], /* CJK Ideograph */
- [0x9ed2, 0x9ed2], /* CJK Ideograph */
- [0x9ed3, 0x9ed3], /* CJK Ideograph */
- [0x9ed4, 0x9ed4], /* CJK Ideograph */
- [0x9ed5, 0x9ed5], /* CJK Ideograph */
- [0x9ed6, 0x9ed6], /* CJK Ideograph */
- [0x9ed7, 0x9ed7], /* CJK Ideograph */
- [0x9ed8, 0x9ed8], /* CJK Ideograph */
- [0x9ed9, 0x9ed9], /* CJK Ideograph */
- [0x9eda, 0x9eda], /* CJK Ideograph */
- [0x9edb, 0x9edb], /* CJK Ideograph */
- [0x9edc, 0x9edc], /* CJK Ideograph */
- [0x9edd, 0x9edd], /* CJK Ideograph */
- [0x9ede, 0x9ede], /* CJK Ideograph */
- [0x9edf, 0x9edf], /* CJK Ideograph */
- [0x9ee0, 0x9ee0], /* CJK Ideograph */
- [0x9ee1, 0x9ee1], /* CJK Ideograph */
- [0x9ee2, 0x9ee2], /* CJK Ideograph */
- [0x9ee3, 0x9ee3], /* CJK Ideograph */
- [0x9ee4, 0x9ee4], /* CJK Ideograph */
- [0x9ee5, 0x9ee5], /* CJK Ideograph */
- [0x9ee6, 0x9ee6], /* CJK Ideograph */
- [0x9ee7, 0x9ee7], /* CJK Ideograph */
- [0x9ee8, 0x9ee8], /* CJK Ideograph */
- [0x9ee9, 0x9ee9], /* CJK Ideograph */
- [0x9eea, 0x9eea], /* CJK Ideograph */
- [0x9eeb, 0x9eeb], /* CJK Ideograph */
- [0x9eec, 0x9eec], /* CJK Ideograph */
- [0x9eed, 0x9eed], /* CJK Ideograph */
- [0x9eee, 0x9eee], /* CJK Ideograph */
- [0x9eef, 0x9eef], /* CJK Ideograph */
- [0x9ef0, 0x9ef0], /* CJK Ideograph */
- [0x9ef1, 0x9ef1], /* CJK Ideograph */
- [0x9ef2, 0x9ef2], /* CJK Ideograph */
- [0x9ef3, 0x9ef3], /* CJK Ideograph */
- [0x9ef4, 0x9ef4], /* CJK Ideograph */
- [0x9ef5, 0x9ef5], /* CJK Ideograph */
- [0x9ef6, 0x9ef6], /* CJK Ideograph */
- [0x9ef7, 0x9ef7], /* CJK Ideograph */
- [0x9ef8, 0x9ef8], /* CJK Ideograph */
- [0x9ef9, 0x9ef9], /* CJK Ideograph */
- [0x9efa, 0x9efa], /* CJK Ideograph */
- [0x9efb, 0x9efb], /* CJK Ideograph */
- [0x9efc, 0x9efc], /* CJK Ideograph */
- [0x9efd, 0x9efd], /* CJK Ideograph */
- [0x9efe, 0x9efe], /* CJK Ideograph */
- [0x9eff, 0x9eff], /* CJK Ideograph */
- [0x9f00, 0x9f00], /* CJK Ideograph */
- [0x9f01, 0x9f01], /* CJK Ideograph */
- [0x9f02, 0x9f02], /* CJK Ideograph */
- [0x9f03, 0x9f03], /* CJK Ideograph */
- [0x9f04, 0x9f04], /* CJK Ideograph */
- [0x9f05, 0x9f05], /* CJK Ideograph */
- [0x9f06, 0x9f06], /* CJK Ideograph */
- [0x9f07, 0x9f07], /* CJK Ideograph */
- [0x9f08, 0x9f08], /* CJK Ideograph */
- [0x9f09, 0x9f09], /* CJK Ideograph */
- [0x9f0a, 0x9f0a], /* CJK Ideograph */
- [0x9f0b, 0x9f0b], /* CJK Ideograph */
- [0x9f0c, 0x9f0c], /* CJK Ideograph */
- [0x9f0d, 0x9f0d], /* CJK Ideograph */
- [0x9f0e, 0x9f0e], /* CJK Ideograph */
- [0x9f0f, 0x9f0f], /* CJK Ideograph */
- [0x9f10, 0x9f10], /* CJK Ideograph */
- [0x9f11, 0x9f11], /* CJK Ideograph */
- [0x9f12, 0x9f12], /* CJK Ideograph */
- [0x9f13, 0x9f13], /* CJK Ideograph */
- [0x9f14, 0x9f14], /* CJK Ideograph */
- [0x9f15, 0x9f15], /* CJK Ideograph */
- [0x9f16, 0x9f16], /* CJK Ideograph */
- [0x9f17, 0x9f17], /* CJK Ideograph */
- [0x9f18, 0x9f18], /* CJK Ideograph */
- [0x9f19, 0x9f19], /* CJK Ideograph */
- [0x9f1a, 0x9f1a], /* CJK Ideograph */
- [0x9f1b, 0x9f1b], /* CJK Ideograph */
- [0x9f1c, 0x9f1c], /* CJK Ideograph */
- [0x9f1d, 0x9f1d], /* CJK Ideograph */
- [0x9f1e, 0x9f1e], /* CJK Ideograph */
- [0x9f1f, 0x9f1f], /* CJK Ideograph */
- [0x9f20, 0x9f20], /* CJK Ideograph */
- [0x9f21, 0x9f21], /* CJK Ideograph */
- [0x9f22, 0x9f22], /* CJK Ideograph */
- [0x9f23, 0x9f23], /* CJK Ideograph */
- [0x9f24, 0x9f24], /* CJK Ideograph */
- [0x9f25, 0x9f25], /* CJK Ideograph */
- [0x9f26, 0x9f26], /* CJK Ideograph */
- [0x9f27, 0x9f27], /* CJK Ideograph */
- [0x9f28, 0x9f28], /* CJK Ideograph */
- [0x9f29, 0x9f29], /* CJK Ideograph */
- [0x9f2a, 0x9f2a], /* CJK Ideograph */
- [0x9f2b, 0x9f2b], /* CJK Ideograph */
- [0x9f2c, 0x9f2c], /* CJK Ideograph */
- [0x9f2d, 0x9f2d], /* CJK Ideograph */
- [0x9f2e, 0x9f2e], /* CJK Ideograph */
- [0x9f2f, 0x9f2f], /* CJK Ideograph */
- [0x9f30, 0x9f30], /* CJK Ideograph */
- [0x9f31, 0x9f31], /* CJK Ideograph */
- [0x9f32, 0x9f32], /* CJK Ideograph */
- [0x9f33, 0x9f33], /* CJK Ideograph */
- [0x9f34, 0x9f34], /* CJK Ideograph */
- [0x9f35, 0x9f35], /* CJK Ideograph */
- [0x9f36, 0x9f36], /* CJK Ideograph */
- [0x9f37, 0x9f37], /* CJK Ideograph */
- [0x9f38, 0x9f38], /* CJK Ideograph */
- [0x9f39, 0x9f39], /* CJK Ideograph */
- [0x9f3a, 0x9f3a], /* CJK Ideograph */
- [0x9f3b, 0x9f3b], /* CJK Ideograph */
- [0x9f3c, 0x9f3c], /* CJK Ideograph */
- [0x9f3d, 0x9f3d], /* CJK Ideograph */
- [0x9f3e, 0x9f3e], /* CJK Ideograph */
- [0x9f3f, 0x9f3f], /* CJK Ideograph */
- [0x9f40, 0x9f40], /* CJK Ideograph */
- [0x9f41, 0x9f41], /* CJK Ideograph */
- [0x9f42, 0x9f42], /* CJK Ideograph */
- [0x9f43, 0x9f43], /* CJK Ideograph */
- [0x9f44, 0x9f44], /* CJK Ideograph */
- [0x9f45, 0x9f45], /* CJK Ideograph */
- [0x9f46, 0x9f46], /* CJK Ideograph */
- [0x9f47, 0x9f47], /* CJK Ideograph */
- [0x9f48, 0x9f48], /* CJK Ideograph */
- [0x9f49, 0x9f49], /* CJK Ideograph */
- [0x9f4a, 0x9f4a], /* CJK Ideograph */
- [0x9f4b, 0x9f4b], /* CJK Ideograph */
- [0x9f4c, 0x9f4c], /* CJK Ideograph */
- [0x9f4d, 0x9f4d], /* CJK Ideograph */
- [0x9f4e, 0x9f4e], /* CJK Ideograph */
- [0x9f4f, 0x9f4f], /* CJK Ideograph */
- [0x9f50, 0x9f50], /* CJK Ideograph */
- [0x9f51, 0x9f51], /* CJK Ideograph */
- [0x9f52, 0x9f52], /* CJK Ideograph */
- [0x9f53, 0x9f53], /* CJK Ideograph */
- [0x9f54, 0x9f54], /* CJK Ideograph */
- [0x9f55, 0x9f55], /* CJK Ideograph */
- [0x9f56, 0x9f56], /* CJK Ideograph */
- [0x9f57, 0x9f57], /* CJK Ideograph */
- [0x9f58, 0x9f58], /* CJK Ideograph */
- [0x9f59, 0x9f59], /* CJK Ideograph */
- [0x9f5a, 0x9f5a], /* CJK Ideograph */
- [0x9f5b, 0x9f5b], /* CJK Ideograph */
- [0x9f5c, 0x9f5c], /* CJK Ideograph */
- [0x9f5d, 0x9f5d], /* CJK Ideograph */
- [0x9f5e, 0x9f5e], /* CJK Ideograph */
- [0x9f5f, 0x9f5f], /* CJK Ideograph */
- [0x9f60, 0x9f60], /* CJK Ideograph */
- [0x9f61, 0x9f61], /* CJK Ideograph */
- [0x9f62, 0x9f62], /* CJK Ideograph */
- [0x9f63, 0x9f63], /* CJK Ideograph */
- [0x9f64, 0x9f64], /* CJK Ideograph */
- [0x9f65, 0x9f65], /* CJK Ideograph */
- [0x9f66, 0x9f66], /* CJK Ideograph */
- [0x9f67, 0x9f67], /* CJK Ideograph */
- [0x9f68, 0x9f68], /* CJK Ideograph */
- [0x9f69, 0x9f69], /* CJK Ideograph */
- [0x9f6a, 0x9f6a], /* CJK Ideograph */
- [0x9f6b, 0x9f6b], /* CJK Ideograph */
- [0x9f6c, 0x9f6c], /* CJK Ideograph */
- [0x9f6d, 0x9f6d], /* CJK Ideograph */
- [0x9f6e, 0x9f6e], /* CJK Ideograph */
- [0x9f6f, 0x9f6f], /* CJK Ideograph */
- [0x9f70, 0x9f70], /* CJK Ideograph */
- [0x9f71, 0x9f71], /* CJK Ideograph */
- [0x9f72, 0x9f72], /* CJK Ideograph */
- [0x9f73, 0x9f73], /* CJK Ideograph */
- [0x9f74, 0x9f74], /* CJK Ideograph */
- [0x9f75, 0x9f75], /* CJK Ideograph */
- [0x9f76, 0x9f76], /* CJK Ideograph */
- [0x9f77, 0x9f77], /* CJK Ideograph */
- [0x9f78, 0x9f78], /* CJK Ideograph */
- [0x9f79, 0x9f79], /* CJK Ideograph */
- [0x9f7a, 0x9f7a], /* CJK Ideograph */
- [0x9f7b, 0x9f7b], /* CJK Ideograph */
- [0x9f7c, 0x9f7c], /* CJK Ideograph */
- [0x9f7d, 0x9f7d], /* CJK Ideograph */
- [0x9f7e, 0x9f7e], /* CJK Ideograph */
- [0x9f7f, 0x9f7f], /* CJK Ideograph */
- [0x9f80, 0x9f80], /* CJK Ideograph */
- [0x9f81, 0x9f81], /* CJK Ideograph */
- [0x9f82, 0x9f82], /* CJK Ideograph */
- [0x9f83, 0x9f83], /* CJK Ideograph */
- [0x9f84, 0x9f84], /* CJK Ideograph */
- [0x9f85, 0x9f85], /* CJK Ideograph */
- [0x9f86, 0x9f86], /* CJK Ideograph */
- [0x9f87, 0x9f87], /* CJK Ideograph */
- [0x9f88, 0x9f88], /* CJK Ideograph */
- [0x9f89, 0x9f89], /* CJK Ideograph */
- [0x9f8a, 0x9f8a], /* CJK Ideograph */
- [0x9f8b, 0x9f8b], /* CJK Ideograph */
- [0x9f8c, 0x9f8c], /* CJK Ideograph */
- [0x9f8d, 0x9f8d], /* CJK Ideograph */
- [0x9f8e, 0x9f8e], /* CJK Ideograph */
- [0x9f8f, 0x9f8f], /* CJK Ideograph */
- [0x9f90, 0x9f90], /* CJK Ideograph */
- [0x9f91, 0x9f91], /* CJK Ideograph */
- [0x9f92, 0x9f92], /* CJK Ideograph */
- [0x9f93, 0x9f93], /* CJK Ideograph */
- [0x9f94, 0x9f94], /* CJK Ideograph */
- [0x9f95, 0x9f95], /* CJK Ideograph */
- [0x9f96, 0x9f96], /* CJK Ideograph */
- [0x9f97, 0x9f97], /* CJK Ideograph */
- [0x9f98, 0x9f98], /* CJK Ideograph */
- [0x9f99, 0x9f99], /* CJK Ideograph */
- [0x9f9a, 0x9f9a], /* CJK Ideograph */
- [0x9f9b, 0x9f9b], /* CJK Ideograph */
- [0x9f9c, 0x9f9c], /* CJK Ideograph */
- [0x9f9d, 0x9f9d], /* CJK Ideograph */
- [0x9f9e, 0x9f9e], /* CJK Ideograph */
- [0x9f9f, 0x9f9f], /* CJK Ideograph */
- [0x9fa0, 0x9fa0], /* CJK Ideograph */
- [0x9fa1, 0x9fa1], /* CJK Ideograph */
- [0x9fa2, 0x9fa2], /* CJK Ideograph */
- [0x9fa3, 0x9fa3], /* CJK Ideograph */
- [0x9fa4, 0x9fa4], /* CJK Ideograph */
- [0x9fa5, 0x9fa5], /* CJK Ideograph */
- [0x9fa6, 0x9fa6], /* CJK Ideograph */
- [0x9fa7, 0x9fa7], /* CJK Ideograph */
- [0x9fa8, 0x9fa8], /* CJK Ideograph */
- [0x9fa9, 0x9fa9], /* CJK Ideograph */
- [0x9faa, 0x9faa], /* CJK Ideograph */
- [0x9fab, 0x9fab], /* CJK Ideograph */
- [0x9fac, 0x9fac], /* CJK Ideograph */
- [0x9fad, 0x9fad], /* CJK Ideograph */
- [0x9fae, 0x9fae], /* CJK Ideograph */
- [0x9faf, 0x9faf], /* CJK Ideograph */
- [0x9fb0, 0x9fb0], /* CJK Ideograph */
- [0x9fb1, 0x9fb1], /* CJK Ideograph */
- [0x9fb2, 0x9fb2], /* CJK Ideograph */
- [0x9fb3, 0x9fb3], /* CJK Ideograph */
- [0x9fb4, 0x9fb4], /* CJK Ideograph */
- [0x9fb5, 0x9fb5], /* CJK Ideograph */
- [0x9fb6, 0x9fb6], /* CJK Ideograph */
- [0x9fb7, 0x9fb7], /* CJK Ideograph */
- [0x9fb8, 0x9fb8], /* CJK Ideograph */
- [0x9fb9, 0x9fb9], /* CJK Ideograph */
- [0x9fba, 0x9fba], /* CJK Ideograph */
- [0x9fbb, 0x9fbb], /* CJK Ideograph */
- [0x9fbc, 0x9fbc], /* CJK Ideograph */
- [0x9fbd, 0x9fbd], /* CJK Ideograph */
- [0x9fbe, 0x9fbe], /* CJK Ideograph */
- [0x9fbf, 0x9fbf], /* CJK Ideograph */
- [0x9fc0, 0x9fc0], /* CJK Ideograph */
- [0x9fc1, 0x9fc1], /* CJK Ideograph */
- [0x9fc2, 0x9fc2], /* CJK Ideograph */
- [0x9fc3, 0x9fc3], /* CJK Ideograph */
- [0x9fc4, 0x9fc4], /* CJK Ideograph */
- [0x9fc5, 0x9fc5], /* CJK Ideograph */
- [0x9fc6, 0x9fc6], /* CJK Ideograph */
- [0x9fc7, 0x9fc7], /* CJK Ideograph */
- [0x9fc8, 0x9fc8], /* CJK Ideograph */
- [0x9fc9, 0x9fc9], /* CJK Ideograph */
- [0x9fca, 0x9fca], /* CJK Ideograph */
- [0x9fcb, 0x9fcb], /* CJK Ideograph */
- [0x9fcc, 0x9fcc], /* CJK Ideograph */
- [0x9fcd, 0x9fcd], /* CJK Ideograph */
- [0x9fce, 0x9fce], /* CJK Ideograph */
- [0x9fcf, 0x9fcf], /* CJK Ideograph */
- [0x9fd0, 0x9fd0], /* CJK Ideograph */
- [0x9fd1, 0x9fd1], /* CJK Ideograph */
- [0x9fd2, 0x9fd2], /* CJK Ideograph */
- [0x9fd3, 0x9fd3], /* CJK Ideograph */
- [0x9fd4, 0x9fd4], /* CJK Ideograph */
- [0x9fd5, 0x9fd5], /* CJK Ideograph */
- [0x9fd6, 0x9fd6], /* CJK Ideograph */
- [0x9fd7, 0x9fd7], /* CJK Ideograph */
- [0x9fd8, 0x9fd8], /* CJK Ideograph */
- [0x9fd9, 0x9fd9], /* CJK Ideograph */
- [0x9fda, 0x9fda], /* CJK Ideograph */
- [0x9fdb, 0x9fdb], /* CJK Ideograph */
- [0x9fdc, 0x9fdc], /* CJK Ideograph */
- [0x9fdd, 0x9fdd], /* CJK Ideograph */
- [0x9fde, 0x9fde], /* CJK Ideograph */
- [0x9fdf, 0x9fdf], /* CJK Ideograph */
- [0x9fe0, 0x9fe0], /* CJK Ideograph */
- [0x9fe1, 0x9fe1], /* CJK Ideograph */
- [0x9fe2, 0x9fe2], /* CJK Ideograph */
- [0x9fe3, 0x9fe3], /* CJK Ideograph */
- [0x9fe4, 0x9fe4], /* CJK Ideograph */
- [0x9fe5, 0x9fe5], /* CJK Ideograph */
- [0x9fe6, 0x9fe6], /* CJK Ideograph */
- [0x9fe7, 0x9fe7], /* CJK Ideograph */
- [0x9fe8, 0x9fe8], /* CJK Ideograph */
- [0x9fe9, 0x9fe9], /* CJK Ideograph */
- [0x9fea, 0x9fea], /* CJK Ideograph */
- [0x9feb, 0x9feb], /* CJK Ideograph */
- [0x9fec, 0x9fec], /* CJK Ideograph */
- [0x9fed, 0x9fed], /* CJK Ideograph */
- [0x9fee, 0x9fee], /* CJK Ideograph */
- [0x9fef, 0x9fef], /* CJK Ideograph */
- [0x9ff0, 0x9ff0],
- [0x9ff1, 0x9ff1],
- [0x9ff2, 0x9ff2],
- [0x9ff3, 0x9ff3],
- [0x9ff4, 0x9ff4],
- [0x9ff5, 0x9ff5],
- [0x9ff6, 0x9ff6],
- [0x9ff7, 0x9ff7],
- [0x9ff8, 0x9ff8],
- [0x9ff9, 0x9ff9],
- [0x9ffa, 0x9ffa],
- [0x9ffb, 0x9ffb],
- [0x9ffc, 0x9ffc],
- [0x9ffd, 0x9ffd],
- [0x9ffe, 0x9ffe],
- [0x9fff, 0x9fff],
- [0xa000, 0xa000], /* YI SYLLABLE IT */
- [0xa001, 0xa001], /* YI SYLLABLE IX */
- [0xa002, 0xa002], /* YI SYLLABLE I */
- [0xa003, 0xa003], /* YI SYLLABLE IP */
- [0xa004, 0xa004], /* YI SYLLABLE IET */
- [0xa005, 0xa005], /* YI SYLLABLE IEX */
- [0xa006, 0xa006], /* YI SYLLABLE IE */
- [0xa007, 0xa007], /* YI SYLLABLE IEP */
- [0xa008, 0xa008], /* YI SYLLABLE AT */
- [0xa009, 0xa009], /* YI SYLLABLE AX */
- [0xa00a, 0xa00a], /* YI SYLLABLE A */
- [0xa00b, 0xa00b], /* YI SYLLABLE AP */
- [0xa00c, 0xa00c], /* YI SYLLABLE UOX */
- [0xa00d, 0xa00d], /* YI SYLLABLE UO */
- [0xa00e, 0xa00e], /* YI SYLLABLE UOP */
- [0xa00f, 0xa00f], /* YI SYLLABLE OT */
- [0xa010, 0xa010], /* YI SYLLABLE OX */
- [0xa011, 0xa011], /* YI SYLLABLE O */
- [0xa012, 0xa012], /* YI SYLLABLE OP */
- [0xa013, 0xa013], /* YI SYLLABLE EX */
- [0xa014, 0xa014], /* YI SYLLABLE E */
- [0xa015, 0xa015], /* YI SYLLABLE WU */
- [0xa016, 0xa016], /* YI SYLLABLE BIT */
- [0xa017, 0xa017], /* YI SYLLABLE BIX */
- [0xa018, 0xa018], /* YI SYLLABLE BI */
- [0xa019, 0xa019], /* YI SYLLABLE BIP */
- [0xa01a, 0xa01a], /* YI SYLLABLE BIET */
- [0xa01b, 0xa01b], /* YI SYLLABLE BIEX */
- [0xa01c, 0xa01c], /* YI SYLLABLE BIE */
- [0xa01d, 0xa01d], /* YI SYLLABLE BIEP */
- [0xa01e, 0xa01e], /* YI SYLLABLE BAT */
- [0xa01f, 0xa01f], /* YI SYLLABLE BAX */
- [0xa020, 0xa020], /* YI SYLLABLE BA */
- [0xa021, 0xa021], /* YI SYLLABLE BAP */
- [0xa022, 0xa022], /* YI SYLLABLE BUOX */
- [0xa023, 0xa023], /* YI SYLLABLE BUO */
- [0xa024, 0xa024], /* YI SYLLABLE BUOP */
- [0xa025, 0xa025], /* YI SYLLABLE BOT */
- [0xa026, 0xa026], /* YI SYLLABLE BOX */
- [0xa027, 0xa027], /* YI SYLLABLE BO */
- [0xa028, 0xa028], /* YI SYLLABLE BOP */
- [0xa029, 0xa029], /* YI SYLLABLE BEX */
- [0xa02a, 0xa02a], /* YI SYLLABLE BE */
- [0xa02b, 0xa02b], /* YI SYLLABLE BEP */
- [0xa02c, 0xa02c], /* YI SYLLABLE BUT */
- [0xa02d, 0xa02d], /* YI SYLLABLE BUX */
- [0xa02e, 0xa02e], /* YI SYLLABLE BU */
- [0xa02f, 0xa02f], /* YI SYLLABLE BUP */
- [0xa030, 0xa030], /* YI SYLLABLE BURX */
- [0xa031, 0xa031], /* YI SYLLABLE BUR */
- [0xa032, 0xa032], /* YI SYLLABLE BYT */
- [0xa033, 0xa033], /* YI SYLLABLE BYX */
- [0xa034, 0xa034], /* YI SYLLABLE BY */
- [0xa035, 0xa035], /* YI SYLLABLE BYP */
- [0xa036, 0xa036], /* YI SYLLABLE BYRX */
- [0xa037, 0xa037], /* YI SYLLABLE BYR */
- [0xa038, 0xa038], /* YI SYLLABLE PIT */
- [0xa039, 0xa039], /* YI SYLLABLE PIX */
- [0xa03a, 0xa03a], /* YI SYLLABLE PI */
- [0xa03b, 0xa03b], /* YI SYLLABLE PIP */
- [0xa03c, 0xa03c], /* YI SYLLABLE PIEX */
- [0xa03d, 0xa03d], /* YI SYLLABLE PIE */
- [0xa03e, 0xa03e], /* YI SYLLABLE PIEP */
- [0xa03f, 0xa03f], /* YI SYLLABLE PAT */
- [0xa040, 0xa040], /* YI SYLLABLE PAX */
- [0xa041, 0xa041], /* YI SYLLABLE PA */
- [0xa042, 0xa042], /* YI SYLLABLE PAP */
- [0xa043, 0xa043], /* YI SYLLABLE PUOX */
- [0xa044, 0xa044], /* YI SYLLABLE PUO */
- [0xa045, 0xa045], /* YI SYLLABLE PUOP */
- [0xa046, 0xa046], /* YI SYLLABLE POT */
- [0xa047, 0xa047], /* YI SYLLABLE POX */
- [0xa048, 0xa048], /* YI SYLLABLE PO */
- [0xa049, 0xa049], /* YI SYLLABLE POP */
- [0xa04a, 0xa04a], /* YI SYLLABLE PUT */
- [0xa04b, 0xa04b], /* YI SYLLABLE PUX */
- [0xa04c, 0xa04c], /* YI SYLLABLE PU */
- [0xa04d, 0xa04d], /* YI SYLLABLE PUP */
- [0xa04e, 0xa04e], /* YI SYLLABLE PURX */
- [0xa04f, 0xa04f], /* YI SYLLABLE PUR */
- [0xa050, 0xa050], /* YI SYLLABLE PYT */
- [0xa051, 0xa051], /* YI SYLLABLE PYX */
- [0xa052, 0xa052], /* YI SYLLABLE PY */
- [0xa053, 0xa053], /* YI SYLLABLE PYP */
- [0xa054, 0xa054], /* YI SYLLABLE PYRX */
- [0xa055, 0xa055], /* YI SYLLABLE PYR */
- [0xa056, 0xa056], /* YI SYLLABLE BBIT */
- [0xa057, 0xa057], /* YI SYLLABLE BBIX */
- [0xa058, 0xa058], /* YI SYLLABLE BBI */
- [0xa059, 0xa059], /* YI SYLLABLE BBIP */
- [0xa05a, 0xa05a], /* YI SYLLABLE BBIET */
- [0xa05b, 0xa05b], /* YI SYLLABLE BBIEX */
- [0xa05c, 0xa05c], /* YI SYLLABLE BBIE */
- [0xa05d, 0xa05d], /* YI SYLLABLE BBIEP */
- [0xa05e, 0xa05e], /* YI SYLLABLE BBAT */
- [0xa05f, 0xa05f], /* YI SYLLABLE BBAX */
- [0xa060, 0xa060], /* YI SYLLABLE BBA */
- [0xa061, 0xa061], /* YI SYLLABLE BBAP */
- [0xa062, 0xa062], /* YI SYLLABLE BBUOX */
- [0xa063, 0xa063], /* YI SYLLABLE BBUO */
- [0xa064, 0xa064], /* YI SYLLABLE BBUOP */
- [0xa065, 0xa065], /* YI SYLLABLE BBOT */
- [0xa066, 0xa066], /* YI SYLLABLE BBOX */
- [0xa067, 0xa067], /* YI SYLLABLE BBO */
- [0xa068, 0xa068], /* YI SYLLABLE BBOP */
- [0xa069, 0xa069], /* YI SYLLABLE BBEX */
- [0xa06a, 0xa06a], /* YI SYLLABLE BBE */
- [0xa06b, 0xa06b], /* YI SYLLABLE BBEP */
- [0xa06c, 0xa06c], /* YI SYLLABLE BBUT */
- [0xa06d, 0xa06d], /* YI SYLLABLE BBUX */
- [0xa06e, 0xa06e], /* YI SYLLABLE BBU */
- [0xa06f, 0xa06f], /* YI SYLLABLE BBUP */
- [0xa070, 0xa070], /* YI SYLLABLE BBURX */
- [0xa071, 0xa071], /* YI SYLLABLE BBUR */
- [0xa072, 0xa072], /* YI SYLLABLE BBYT */
- [0xa073, 0xa073], /* YI SYLLABLE BBYX */
- [0xa074, 0xa074], /* YI SYLLABLE BBY */
- [0xa075, 0xa075], /* YI SYLLABLE BBYP */
- [0xa076, 0xa076], /* YI SYLLABLE NBIT */
- [0xa077, 0xa077], /* YI SYLLABLE NBIX */
- [0xa078, 0xa078], /* YI SYLLABLE NBI */
- [0xa079, 0xa079], /* YI SYLLABLE NBIP */
- [0xa07a, 0xa07a], /* YI SYLLABLE NBIEX */
- [0xa07b, 0xa07b], /* YI SYLLABLE NBIE */
- [0xa07c, 0xa07c], /* YI SYLLABLE NBIEP */
- [0xa07d, 0xa07d], /* YI SYLLABLE NBAT */
- [0xa07e, 0xa07e], /* YI SYLLABLE NBAX */
- [0xa07f, 0xa07f], /* YI SYLLABLE NBA */
- [0xa080, 0xa080], /* YI SYLLABLE NBAP */
- [0xa081, 0xa081], /* YI SYLLABLE NBOT */
- [0xa082, 0xa082], /* YI SYLLABLE NBOX */
- [0xa083, 0xa083], /* YI SYLLABLE NBO */
- [0xa084, 0xa084], /* YI SYLLABLE NBOP */
- [0xa085, 0xa085], /* YI SYLLABLE NBUT */
- [0xa086, 0xa086], /* YI SYLLABLE NBUX */
- [0xa087, 0xa087], /* YI SYLLABLE NBU */
- [0xa088, 0xa088], /* YI SYLLABLE NBUP */
- [0xa089, 0xa089], /* YI SYLLABLE NBURX */
- [0xa08a, 0xa08a], /* YI SYLLABLE NBUR */
- [0xa08b, 0xa08b], /* YI SYLLABLE NBYT */
- [0xa08c, 0xa08c], /* YI SYLLABLE NBYX */
- [0xa08d, 0xa08d], /* YI SYLLABLE NBY */
- [0xa08e, 0xa08e], /* YI SYLLABLE NBYP */
- [0xa08f, 0xa08f], /* YI SYLLABLE NBYRX */
- [0xa090, 0xa090], /* YI SYLLABLE NBYR */
- [0xa091, 0xa091], /* YI SYLLABLE HMIT */
- [0xa092, 0xa092], /* YI SYLLABLE HMIX */
- [0xa093, 0xa093], /* YI SYLLABLE HMI */
- [0xa094, 0xa094], /* YI SYLLABLE HMIP */
- [0xa095, 0xa095], /* YI SYLLABLE HMIEX */
- [0xa096, 0xa096], /* YI SYLLABLE HMIE */
- [0xa097, 0xa097], /* YI SYLLABLE HMIEP */
- [0xa098, 0xa098], /* YI SYLLABLE HMAT */
- [0xa099, 0xa099], /* YI SYLLABLE HMAX */
- [0xa09a, 0xa09a], /* YI SYLLABLE HMA */
- [0xa09b, 0xa09b], /* YI SYLLABLE HMAP */
- [0xa09c, 0xa09c], /* YI SYLLABLE HMUOX */
- [0xa09d, 0xa09d], /* YI SYLLABLE HMUO */
- [0xa09e, 0xa09e], /* YI SYLLABLE HMUOP */
- [0xa09f, 0xa09f], /* YI SYLLABLE HMOT */
- [0xa0a0, 0xa0a0], /* YI SYLLABLE HMOX */
- [0xa0a1, 0xa0a1], /* YI SYLLABLE HMO */
- [0xa0a2, 0xa0a2], /* YI SYLLABLE HMOP */
- [0xa0a3, 0xa0a3], /* YI SYLLABLE HMUT */
- [0xa0a4, 0xa0a4], /* YI SYLLABLE HMUX */
- [0xa0a5, 0xa0a5], /* YI SYLLABLE HMU */
- [0xa0a6, 0xa0a6], /* YI SYLLABLE HMUP */
- [0xa0a7, 0xa0a7], /* YI SYLLABLE HMURX */
- [0xa0a8, 0xa0a8], /* YI SYLLABLE HMUR */
- [0xa0a9, 0xa0a9], /* YI SYLLABLE HMYX */
- [0xa0aa, 0xa0aa], /* YI SYLLABLE HMY */
- [0xa0ab, 0xa0ab], /* YI SYLLABLE HMYP */
- [0xa0ac, 0xa0ac], /* YI SYLLABLE HMYRX */
- [0xa0ad, 0xa0ad], /* YI SYLLABLE HMYR */
- [0xa0ae, 0xa0ae], /* YI SYLLABLE MIT */
- [0xa0af, 0xa0af], /* YI SYLLABLE MIX */
- [0xa0b0, 0xa0b0], /* YI SYLLABLE MI */
- [0xa0b1, 0xa0b1], /* YI SYLLABLE MIP */
- [0xa0b2, 0xa0b2], /* YI SYLLABLE MIEX */
- [0xa0b3, 0xa0b3], /* YI SYLLABLE MIE */
- [0xa0b4, 0xa0b4], /* YI SYLLABLE MIEP */
- [0xa0b5, 0xa0b5], /* YI SYLLABLE MAT */
- [0xa0b6, 0xa0b6], /* YI SYLLABLE MAX */
- [0xa0b7, 0xa0b7], /* YI SYLLABLE MA */
- [0xa0b8, 0xa0b8], /* YI SYLLABLE MAP */
- [0xa0b9, 0xa0b9], /* YI SYLLABLE MUOT */
- [0xa0ba, 0xa0ba], /* YI SYLLABLE MUOX */
- [0xa0bb, 0xa0bb], /* YI SYLLABLE MUO */
- [0xa0bc, 0xa0bc], /* YI SYLLABLE MUOP */
- [0xa0bd, 0xa0bd], /* YI SYLLABLE MOT */
- [0xa0be, 0xa0be], /* YI SYLLABLE MOX */
- [0xa0bf, 0xa0bf], /* YI SYLLABLE MO */
- [0xa0c0, 0xa0c0], /* YI SYLLABLE MOP */
- [0xa0c1, 0xa0c1], /* YI SYLLABLE MEX */
- [0xa0c2, 0xa0c2], /* YI SYLLABLE ME */
- [0xa0c3, 0xa0c3], /* YI SYLLABLE MUT */
- [0xa0c4, 0xa0c4], /* YI SYLLABLE MUX */
- [0xa0c5, 0xa0c5], /* YI SYLLABLE MU */
- [0xa0c6, 0xa0c6], /* YI SYLLABLE MUP */
- [0xa0c7, 0xa0c7], /* YI SYLLABLE MURX */
- [0xa0c8, 0xa0c8], /* YI SYLLABLE MUR */
- [0xa0c9, 0xa0c9], /* YI SYLLABLE MYT */
- [0xa0ca, 0xa0ca], /* YI SYLLABLE MYX */
- [0xa0cb, 0xa0cb], /* YI SYLLABLE MY */
- [0xa0cc, 0xa0cc], /* YI SYLLABLE MYP */
- [0xa0cd, 0xa0cd], /* YI SYLLABLE FIT */
- [0xa0ce, 0xa0ce], /* YI SYLLABLE FIX */
- [0xa0cf, 0xa0cf], /* YI SYLLABLE FI */
- [0xa0d0, 0xa0d0], /* YI SYLLABLE FIP */
- [0xa0d1, 0xa0d1], /* YI SYLLABLE FAT */
- [0xa0d2, 0xa0d2], /* YI SYLLABLE FAX */
- [0xa0d3, 0xa0d3], /* YI SYLLABLE FA */
- [0xa0d4, 0xa0d4], /* YI SYLLABLE FAP */
- [0xa0d5, 0xa0d5], /* YI SYLLABLE FOX */
- [0xa0d6, 0xa0d6], /* YI SYLLABLE FO */
- [0xa0d7, 0xa0d7], /* YI SYLLABLE FOP */
- [0xa0d8, 0xa0d8], /* YI SYLLABLE FUT */
- [0xa0d9, 0xa0d9], /* YI SYLLABLE FUX */
- [0xa0da, 0xa0da], /* YI SYLLABLE FU */
- [0xa0db, 0xa0db], /* YI SYLLABLE FUP */
- [0xa0dc, 0xa0dc], /* YI SYLLABLE FURX */
- [0xa0dd, 0xa0dd], /* YI SYLLABLE FUR */
- [0xa0de, 0xa0de], /* YI SYLLABLE FYT */
- [0xa0df, 0xa0df], /* YI SYLLABLE FYX */
- [0xa0e0, 0xa0e0], /* YI SYLLABLE FY */
- [0xa0e1, 0xa0e1], /* YI SYLLABLE FYP */
- [0xa0e2, 0xa0e2], /* YI SYLLABLE VIT */
- [0xa0e3, 0xa0e3], /* YI SYLLABLE VIX */
- [0xa0e4, 0xa0e4], /* YI SYLLABLE VI */
- [0xa0e5, 0xa0e5], /* YI SYLLABLE VIP */
- [0xa0e6, 0xa0e6], /* YI SYLLABLE VIET */
- [0xa0e7, 0xa0e7], /* YI SYLLABLE VIEX */
- [0xa0e8, 0xa0e8], /* YI SYLLABLE VIE */
- [0xa0e9, 0xa0e9], /* YI SYLLABLE VIEP */
- [0xa0ea, 0xa0ea], /* YI SYLLABLE VAT */
- [0xa0eb, 0xa0eb], /* YI SYLLABLE VAX */
- [0xa0ec, 0xa0ec], /* YI SYLLABLE VA */
- [0xa0ed, 0xa0ed], /* YI SYLLABLE VAP */
- [0xa0ee, 0xa0ee], /* YI SYLLABLE VOT */
- [0xa0ef, 0xa0ef], /* YI SYLLABLE VOX */
- [0xa0f0, 0xa0f0], /* YI SYLLABLE VO */
- [0xa0f1, 0xa0f1], /* YI SYLLABLE VOP */
- [0xa0f2, 0xa0f2], /* YI SYLLABLE VEX */
- [0xa0f3, 0xa0f3], /* YI SYLLABLE VEP */
- [0xa0f4, 0xa0f4], /* YI SYLLABLE VUT */
- [0xa0f5, 0xa0f5], /* YI SYLLABLE VUX */
- [0xa0f6, 0xa0f6], /* YI SYLLABLE VU */
- [0xa0f7, 0xa0f7], /* YI SYLLABLE VUP */
- [0xa0f8, 0xa0f8], /* YI SYLLABLE VURX */
- [0xa0f9, 0xa0f9], /* YI SYLLABLE VUR */
- [0xa0fa, 0xa0fa], /* YI SYLLABLE VYT */
- [0xa0fb, 0xa0fb], /* YI SYLLABLE VYX */
- [0xa0fc, 0xa0fc], /* YI SYLLABLE VY */
- [0xa0fd, 0xa0fd], /* YI SYLLABLE VYP */
- [0xa0fe, 0xa0fe], /* YI SYLLABLE VYRX */
- [0xa0ff, 0xa0ff], /* YI SYLLABLE VYR */
- [0xa100, 0xa100], /* YI SYLLABLE DIT */
- [0xa101, 0xa101], /* YI SYLLABLE DIX */
- [0xa102, 0xa102], /* YI SYLLABLE DI */
- [0xa103, 0xa103], /* YI SYLLABLE DIP */
- [0xa104, 0xa104], /* YI SYLLABLE DIEX */
- [0xa105, 0xa105], /* YI SYLLABLE DIE */
- [0xa106, 0xa106], /* YI SYLLABLE DIEP */
- [0xa107, 0xa107], /* YI SYLLABLE DAT */
- [0xa108, 0xa108], /* YI SYLLABLE DAX */
- [0xa109, 0xa109], /* YI SYLLABLE DA */
- [0xa10a, 0xa10a], /* YI SYLLABLE DAP */
- [0xa10b, 0xa10b], /* YI SYLLABLE DUOX */
- [0xa10c, 0xa10c], /* YI SYLLABLE DUO */
- [0xa10d, 0xa10d], /* YI SYLLABLE DOT */
- [0xa10e, 0xa10e], /* YI SYLLABLE DOX */
- [0xa10f, 0xa10f], /* YI SYLLABLE DO */
- [0xa110, 0xa110], /* YI SYLLABLE DOP */
- [0xa111, 0xa111], /* YI SYLLABLE DEX */
- [0xa112, 0xa112], /* YI SYLLABLE DE */
- [0xa113, 0xa113], /* YI SYLLABLE DEP */
- [0xa114, 0xa114], /* YI SYLLABLE DUT */
- [0xa115, 0xa115], /* YI SYLLABLE DUX */
- [0xa116, 0xa116], /* YI SYLLABLE DU */
- [0xa117, 0xa117], /* YI SYLLABLE DUP */
- [0xa118, 0xa118], /* YI SYLLABLE DURX */
- [0xa119, 0xa119], /* YI SYLLABLE DUR */
- [0xa11a, 0xa11a], /* YI SYLLABLE TIT */
- [0xa11b, 0xa11b], /* YI SYLLABLE TIX */
- [0xa11c, 0xa11c], /* YI SYLLABLE TI */
- [0xa11d, 0xa11d], /* YI SYLLABLE TIP */
- [0xa11e, 0xa11e], /* YI SYLLABLE TIEX */
- [0xa11f, 0xa11f], /* YI SYLLABLE TIE */
- [0xa120, 0xa120], /* YI SYLLABLE TIEP */
- [0xa121, 0xa121], /* YI SYLLABLE TAT */
- [0xa122, 0xa122], /* YI SYLLABLE TAX */
- [0xa123, 0xa123], /* YI SYLLABLE TA */
- [0xa124, 0xa124], /* YI SYLLABLE TAP */
- [0xa125, 0xa125], /* YI SYLLABLE TUOT */
- [0xa126, 0xa126], /* YI SYLLABLE TUOX */
- [0xa127, 0xa127], /* YI SYLLABLE TUO */
- [0xa128, 0xa128], /* YI SYLLABLE TUOP */
- [0xa129, 0xa129], /* YI SYLLABLE TOT */
- [0xa12a, 0xa12a], /* YI SYLLABLE TOX */
- [0xa12b, 0xa12b], /* YI SYLLABLE TO */
- [0xa12c, 0xa12c], /* YI SYLLABLE TOP */
- [0xa12d, 0xa12d], /* YI SYLLABLE TEX */
- [0xa12e, 0xa12e], /* YI SYLLABLE TE */
- [0xa12f, 0xa12f], /* YI SYLLABLE TEP */
- [0xa130, 0xa130], /* YI SYLLABLE TUT */
- [0xa131, 0xa131], /* YI SYLLABLE TUX */
- [0xa132, 0xa132], /* YI SYLLABLE TU */
- [0xa133, 0xa133], /* YI SYLLABLE TUP */
- [0xa134, 0xa134], /* YI SYLLABLE TURX */
- [0xa135, 0xa135], /* YI SYLLABLE TUR */
- [0xa136, 0xa136], /* YI SYLLABLE DDIT */
- [0xa137, 0xa137], /* YI SYLLABLE DDIX */
- [0xa138, 0xa138], /* YI SYLLABLE DDI */
- [0xa139, 0xa139], /* YI SYLLABLE DDIP */
- [0xa13a, 0xa13a], /* YI SYLLABLE DDIEX */
- [0xa13b, 0xa13b], /* YI SYLLABLE DDIE */
- [0xa13c, 0xa13c], /* YI SYLLABLE DDIEP */
- [0xa13d, 0xa13d], /* YI SYLLABLE DDAT */
- [0xa13e, 0xa13e], /* YI SYLLABLE DDAX */
- [0xa13f, 0xa13f], /* YI SYLLABLE DDA */
- [0xa140, 0xa140], /* YI SYLLABLE DDAP */
- [0xa141, 0xa141], /* YI SYLLABLE DDUOX */
- [0xa142, 0xa142], /* YI SYLLABLE DDUO */
- [0xa143, 0xa143], /* YI SYLLABLE DDUOP */
- [0xa144, 0xa144], /* YI SYLLABLE DDOT */
- [0xa145, 0xa145], /* YI SYLLABLE DDOX */
- [0xa146, 0xa146], /* YI SYLLABLE DDO */
- [0xa147, 0xa147], /* YI SYLLABLE DDOP */
- [0xa148, 0xa148], /* YI SYLLABLE DDEX */
- [0xa149, 0xa149], /* YI SYLLABLE DDE */
- [0xa14a, 0xa14a], /* YI SYLLABLE DDEP */
- [0xa14b, 0xa14b], /* YI SYLLABLE DDUT */
- [0xa14c, 0xa14c], /* YI SYLLABLE DDUX */
- [0xa14d, 0xa14d], /* YI SYLLABLE DDU */
- [0xa14e, 0xa14e], /* YI SYLLABLE DDUP */
- [0xa14f, 0xa14f], /* YI SYLLABLE DDURX */
- [0xa150, 0xa150], /* YI SYLLABLE DDUR */
- [0xa151, 0xa151], /* YI SYLLABLE NDIT */
- [0xa152, 0xa152], /* YI SYLLABLE NDIX */
- [0xa153, 0xa153], /* YI SYLLABLE NDI */
- [0xa154, 0xa154], /* YI SYLLABLE NDIP */
- [0xa155, 0xa155], /* YI SYLLABLE NDIEX */
- [0xa156, 0xa156], /* YI SYLLABLE NDIE */
- [0xa157, 0xa157], /* YI SYLLABLE NDAT */
- [0xa158, 0xa158], /* YI SYLLABLE NDAX */
- [0xa159, 0xa159], /* YI SYLLABLE NDA */
- [0xa15a, 0xa15a], /* YI SYLLABLE NDAP */
- [0xa15b, 0xa15b], /* YI SYLLABLE NDOT */
- [0xa15c, 0xa15c], /* YI SYLLABLE NDOX */
- [0xa15d, 0xa15d], /* YI SYLLABLE NDO */
- [0xa15e, 0xa15e], /* YI SYLLABLE NDOP */
- [0xa15f, 0xa15f], /* YI SYLLABLE NDEX */
- [0xa160, 0xa160], /* YI SYLLABLE NDE */
- [0xa161, 0xa161], /* YI SYLLABLE NDEP */
- [0xa162, 0xa162], /* YI SYLLABLE NDUT */
- [0xa163, 0xa163], /* YI SYLLABLE NDUX */
- [0xa164, 0xa164], /* YI SYLLABLE NDU */
- [0xa165, 0xa165], /* YI SYLLABLE NDUP */
- [0xa166, 0xa166], /* YI SYLLABLE NDURX */
- [0xa167, 0xa167], /* YI SYLLABLE NDUR */
- [0xa168, 0xa168], /* YI SYLLABLE HNIT */
- [0xa169, 0xa169], /* YI SYLLABLE HNIX */
- [0xa16a, 0xa16a], /* YI SYLLABLE HNI */
- [0xa16b, 0xa16b], /* YI SYLLABLE HNIP */
- [0xa16c, 0xa16c], /* YI SYLLABLE HNIET */
- [0xa16d, 0xa16d], /* YI SYLLABLE HNIEX */
- [0xa16e, 0xa16e], /* YI SYLLABLE HNIE */
- [0xa16f, 0xa16f], /* YI SYLLABLE HNIEP */
- [0xa170, 0xa170], /* YI SYLLABLE HNAT */
- [0xa171, 0xa171], /* YI SYLLABLE HNAX */
- [0xa172, 0xa172], /* YI SYLLABLE HNA */
- [0xa173, 0xa173], /* YI SYLLABLE HNAP */
- [0xa174, 0xa174], /* YI SYLLABLE HNUOX */
- [0xa175, 0xa175], /* YI SYLLABLE HNUO */
- [0xa176, 0xa176], /* YI SYLLABLE HNOT */
- [0xa177, 0xa177], /* YI SYLLABLE HNOX */
- [0xa178, 0xa178], /* YI SYLLABLE HNOP */
- [0xa179, 0xa179], /* YI SYLLABLE HNEX */
- [0xa17a, 0xa17a], /* YI SYLLABLE HNE */
- [0xa17b, 0xa17b], /* YI SYLLABLE HNEP */
- [0xa17c, 0xa17c], /* YI SYLLABLE HNUT */
- [0xa17d, 0xa17d], /* YI SYLLABLE NIT */
- [0xa17e, 0xa17e], /* YI SYLLABLE NIX */
- [0xa17f, 0xa17f], /* YI SYLLABLE NI */
- [0xa180, 0xa180], /* YI SYLLABLE NIP */
- [0xa181, 0xa181], /* YI SYLLABLE NIEX */
- [0xa182, 0xa182], /* YI SYLLABLE NIE */
- [0xa183, 0xa183], /* YI SYLLABLE NIEP */
- [0xa184, 0xa184], /* YI SYLLABLE NAX */
- [0xa185, 0xa185], /* YI SYLLABLE NA */
- [0xa186, 0xa186], /* YI SYLLABLE NAP */
- [0xa187, 0xa187], /* YI SYLLABLE NUOX */
- [0xa188, 0xa188], /* YI SYLLABLE NUO */
- [0xa189, 0xa189], /* YI SYLLABLE NUOP */
- [0xa18a, 0xa18a], /* YI SYLLABLE NOT */
- [0xa18b, 0xa18b], /* YI SYLLABLE NOX */
- [0xa18c, 0xa18c], /* YI SYLLABLE NO */
- [0xa18d, 0xa18d], /* YI SYLLABLE NOP */
- [0xa18e, 0xa18e], /* YI SYLLABLE NEX */
- [0xa18f, 0xa18f], /* YI SYLLABLE NE */
- [0xa190, 0xa190], /* YI SYLLABLE NEP */
- [0xa191, 0xa191], /* YI SYLLABLE NUT */
- [0xa192, 0xa192], /* YI SYLLABLE NUX */
- [0xa193, 0xa193], /* YI SYLLABLE NU */
- [0xa194, 0xa194], /* YI SYLLABLE NUP */
- [0xa195, 0xa195], /* YI SYLLABLE NURX */
- [0xa196, 0xa196], /* YI SYLLABLE NUR */
- [0xa197, 0xa197], /* YI SYLLABLE HLIT */
- [0xa198, 0xa198], /* YI SYLLABLE HLIX */
- [0xa199, 0xa199], /* YI SYLLABLE HLI */
- [0xa19a, 0xa19a], /* YI SYLLABLE HLIP */
- [0xa19b, 0xa19b], /* YI SYLLABLE HLIEX */
- [0xa19c, 0xa19c], /* YI SYLLABLE HLIE */
- [0xa19d, 0xa19d], /* YI SYLLABLE HLIEP */
- [0xa19e, 0xa19e], /* YI SYLLABLE HLAT */
- [0xa19f, 0xa19f], /* YI SYLLABLE HLAX */
- [0xa1a0, 0xa1a0], /* YI SYLLABLE HLA */
- [0xa1a1, 0xa1a1], /* YI SYLLABLE HLAP */
- [0xa1a2, 0xa1a2], /* YI SYLLABLE HLUOX */
- [0xa1a3, 0xa1a3], /* YI SYLLABLE HLUO */
- [0xa1a4, 0xa1a4], /* YI SYLLABLE HLUOP */
- [0xa1a5, 0xa1a5], /* YI SYLLABLE HLOX */
- [0xa1a6, 0xa1a6], /* YI SYLLABLE HLO */
- [0xa1a7, 0xa1a7], /* YI SYLLABLE HLOP */
- [0xa1a8, 0xa1a8], /* YI SYLLABLE HLEX */
- [0xa1a9, 0xa1a9], /* YI SYLLABLE HLE */
- [0xa1aa, 0xa1aa], /* YI SYLLABLE HLEP */
- [0xa1ab, 0xa1ab], /* YI SYLLABLE HLUT */
- [0xa1ac, 0xa1ac], /* YI SYLLABLE HLUX */
- [0xa1ad, 0xa1ad], /* YI SYLLABLE HLU */
- [0xa1ae, 0xa1ae], /* YI SYLLABLE HLUP */
- [0xa1af, 0xa1af], /* YI SYLLABLE HLURX */
- [0xa1b0, 0xa1b0], /* YI SYLLABLE HLUR */
- [0xa1b1, 0xa1b1], /* YI SYLLABLE HLYT */
- [0xa1b2, 0xa1b2], /* YI SYLLABLE HLYX */
- [0xa1b3, 0xa1b3], /* YI SYLLABLE HLY */
- [0xa1b4, 0xa1b4], /* YI SYLLABLE HLYP */
- [0xa1b5, 0xa1b5], /* YI SYLLABLE HLYRX */
- [0xa1b6, 0xa1b6], /* YI SYLLABLE HLYR */
- [0xa1b7, 0xa1b7], /* YI SYLLABLE LIT */
- [0xa1b8, 0xa1b8], /* YI SYLLABLE LIX */
- [0xa1b9, 0xa1b9], /* YI SYLLABLE LI */
- [0xa1ba, 0xa1ba], /* YI SYLLABLE LIP */
- [0xa1bb, 0xa1bb], /* YI SYLLABLE LIET */
- [0xa1bc, 0xa1bc], /* YI SYLLABLE LIEX */
- [0xa1bd, 0xa1bd], /* YI SYLLABLE LIE */
- [0xa1be, 0xa1be], /* YI SYLLABLE LIEP */
- [0xa1bf, 0xa1bf], /* YI SYLLABLE LAT */
- [0xa1c0, 0xa1c0], /* YI SYLLABLE LAX */
- [0xa1c1, 0xa1c1], /* YI SYLLABLE LA */
- [0xa1c2, 0xa1c2], /* YI SYLLABLE LAP */
- [0xa1c3, 0xa1c3], /* YI SYLLABLE LUOT */
- [0xa1c4, 0xa1c4], /* YI SYLLABLE LUOX */
- [0xa1c5, 0xa1c5], /* YI SYLLABLE LUO */
- [0xa1c6, 0xa1c6], /* YI SYLLABLE LUOP */
- [0xa1c7, 0xa1c7], /* YI SYLLABLE LOT */
- [0xa1c8, 0xa1c8], /* YI SYLLABLE LOX */
- [0xa1c9, 0xa1c9], /* YI SYLLABLE LO */
- [0xa1ca, 0xa1ca], /* YI SYLLABLE LOP */
- [0xa1cb, 0xa1cb], /* YI SYLLABLE LEX */
- [0xa1cc, 0xa1cc], /* YI SYLLABLE LE */
- [0xa1cd, 0xa1cd], /* YI SYLLABLE LEP */
- [0xa1ce, 0xa1ce], /* YI SYLLABLE LUT */
- [0xa1cf, 0xa1cf], /* YI SYLLABLE LUX */
- [0xa1d0, 0xa1d0], /* YI SYLLABLE LU */
- [0xa1d1, 0xa1d1], /* YI SYLLABLE LUP */
- [0xa1d2, 0xa1d2], /* YI SYLLABLE LURX */
- [0xa1d3, 0xa1d3], /* YI SYLLABLE LUR */
- [0xa1d4, 0xa1d4], /* YI SYLLABLE LYT */
- [0xa1d5, 0xa1d5], /* YI SYLLABLE LYX */
- [0xa1d6, 0xa1d6], /* YI SYLLABLE LY */
- [0xa1d7, 0xa1d7], /* YI SYLLABLE LYP */
- [0xa1d8, 0xa1d8], /* YI SYLLABLE LYRX */
- [0xa1d9, 0xa1d9], /* YI SYLLABLE LYR */
- [0xa1da, 0xa1da], /* YI SYLLABLE GIT */
- [0xa1db, 0xa1db], /* YI SYLLABLE GIX */
- [0xa1dc, 0xa1dc], /* YI SYLLABLE GI */
- [0xa1dd, 0xa1dd], /* YI SYLLABLE GIP */
- [0xa1de, 0xa1de], /* YI SYLLABLE GIET */
- [0xa1df, 0xa1df], /* YI SYLLABLE GIEX */
- [0xa1e0, 0xa1e0], /* YI SYLLABLE GIE */
- [0xa1e1, 0xa1e1], /* YI SYLLABLE GIEP */
- [0xa1e2, 0xa1e2], /* YI SYLLABLE GAT */
- [0xa1e3, 0xa1e3], /* YI SYLLABLE GAX */
- [0xa1e4, 0xa1e4], /* YI SYLLABLE GA */
- [0xa1e5, 0xa1e5], /* YI SYLLABLE GAP */
- [0xa1e6, 0xa1e6], /* YI SYLLABLE GUOT */
- [0xa1e7, 0xa1e7], /* YI SYLLABLE GUOX */
- [0xa1e8, 0xa1e8], /* YI SYLLABLE GUO */
- [0xa1e9, 0xa1e9], /* YI SYLLABLE GUOP */
- [0xa1ea, 0xa1ea], /* YI SYLLABLE GOT */
- [0xa1eb, 0xa1eb], /* YI SYLLABLE GOX */
- [0xa1ec, 0xa1ec], /* YI SYLLABLE GO */
- [0xa1ed, 0xa1ed], /* YI SYLLABLE GOP */
- [0xa1ee, 0xa1ee], /* YI SYLLABLE GET */
- [0xa1ef, 0xa1ef], /* YI SYLLABLE GEX */
- [0xa1f0, 0xa1f0], /* YI SYLLABLE GE */
- [0xa1f1, 0xa1f1], /* YI SYLLABLE GEP */
- [0xa1f2, 0xa1f2], /* YI SYLLABLE GUT */
- [0xa1f3, 0xa1f3], /* YI SYLLABLE GUX */
- [0xa1f4, 0xa1f4], /* YI SYLLABLE GU */
- [0xa1f5, 0xa1f5], /* YI SYLLABLE GUP */
- [0xa1f6, 0xa1f6], /* YI SYLLABLE GURX */
- [0xa1f7, 0xa1f7], /* YI SYLLABLE GUR */
- [0xa1f8, 0xa1f8], /* YI SYLLABLE KIT */
- [0xa1f9, 0xa1f9], /* YI SYLLABLE KIX */
- [0xa1fa, 0xa1fa], /* YI SYLLABLE KI */
- [0xa1fb, 0xa1fb], /* YI SYLLABLE KIP */
- [0xa1fc, 0xa1fc], /* YI SYLLABLE KIEX */
- [0xa1fd, 0xa1fd], /* YI SYLLABLE KIE */
- [0xa1fe, 0xa1fe], /* YI SYLLABLE KIEP */
- [0xa1ff, 0xa1ff], /* YI SYLLABLE KAT */
- [0xa200, 0xa200], /* YI SYLLABLE KAX */
- [0xa201, 0xa201], /* YI SYLLABLE KA */
- [0xa202, 0xa202], /* YI SYLLABLE KAP */
- [0xa203, 0xa203], /* YI SYLLABLE KUOX */
- [0xa204, 0xa204], /* YI SYLLABLE KUO */
- [0xa205, 0xa205], /* YI SYLLABLE KUOP */
- [0xa206, 0xa206], /* YI SYLLABLE KOT */
- [0xa207, 0xa207], /* YI SYLLABLE KOX */
- [0xa208, 0xa208], /* YI SYLLABLE KO */
- [0xa209, 0xa209], /* YI SYLLABLE KOP */
- [0xa20a, 0xa20a], /* YI SYLLABLE KET */
- [0xa20b, 0xa20b], /* YI SYLLABLE KEX */
- [0xa20c, 0xa20c], /* YI SYLLABLE KE */
- [0xa20d, 0xa20d], /* YI SYLLABLE KEP */
- [0xa20e, 0xa20e], /* YI SYLLABLE KUT */
- [0xa20f, 0xa20f], /* YI SYLLABLE KUX */
- [0xa210, 0xa210], /* YI SYLLABLE KU */
- [0xa211, 0xa211], /* YI SYLLABLE KUP */
- [0xa212, 0xa212], /* YI SYLLABLE KURX */
- [0xa213, 0xa213], /* YI SYLLABLE KUR */
- [0xa214, 0xa214], /* YI SYLLABLE GGIT */
- [0xa215, 0xa215], /* YI SYLLABLE GGIX */
- [0xa216, 0xa216], /* YI SYLLABLE GGI */
- [0xa217, 0xa217], /* YI SYLLABLE GGIEX */
- [0xa218, 0xa218], /* YI SYLLABLE GGIE */
- [0xa219, 0xa219], /* YI SYLLABLE GGIEP */
- [0xa21a, 0xa21a], /* YI SYLLABLE GGAT */
- [0xa21b, 0xa21b], /* YI SYLLABLE GGAX */
- [0xa21c, 0xa21c], /* YI SYLLABLE GGA */
- [0xa21d, 0xa21d], /* YI SYLLABLE GGAP */
- [0xa21e, 0xa21e], /* YI SYLLABLE GGUOT */
- [0xa21f, 0xa21f], /* YI SYLLABLE GGUOX */
- [0xa220, 0xa220], /* YI SYLLABLE GGUO */
- [0xa221, 0xa221], /* YI SYLLABLE GGUOP */
- [0xa222, 0xa222], /* YI SYLLABLE GGOT */
- [0xa223, 0xa223], /* YI SYLLABLE GGOX */
- [0xa224, 0xa224], /* YI SYLLABLE GGO */
- [0xa225, 0xa225], /* YI SYLLABLE GGOP */
- [0xa226, 0xa226], /* YI SYLLABLE GGET */
- [0xa227, 0xa227], /* YI SYLLABLE GGEX */
- [0xa228, 0xa228], /* YI SYLLABLE GGE */
- [0xa229, 0xa229], /* YI SYLLABLE GGEP */
- [0xa22a, 0xa22a], /* YI SYLLABLE GGUT */
- [0xa22b, 0xa22b], /* YI SYLLABLE GGUX */
- [0xa22c, 0xa22c], /* YI SYLLABLE GGU */
- [0xa22d, 0xa22d], /* YI SYLLABLE GGUP */
- [0xa22e, 0xa22e], /* YI SYLLABLE GGURX */
- [0xa22f, 0xa22f], /* YI SYLLABLE GGUR */
- [0xa230, 0xa230], /* YI SYLLABLE MGIEX */
- [0xa231, 0xa231], /* YI SYLLABLE MGIE */
- [0xa232, 0xa232], /* YI SYLLABLE MGAT */
- [0xa233, 0xa233], /* YI SYLLABLE MGAX */
- [0xa234, 0xa234], /* YI SYLLABLE MGA */
- [0xa235, 0xa235], /* YI SYLLABLE MGAP */
- [0xa236, 0xa236], /* YI SYLLABLE MGUOX */
- [0xa237, 0xa237], /* YI SYLLABLE MGUO */
- [0xa238, 0xa238], /* YI SYLLABLE MGUOP */
- [0xa239, 0xa239], /* YI SYLLABLE MGOT */
- [0xa23a, 0xa23a], /* YI SYLLABLE MGOX */
- [0xa23b, 0xa23b], /* YI SYLLABLE MGO */
- [0xa23c, 0xa23c], /* YI SYLLABLE MGOP */
- [0xa23d, 0xa23d], /* YI SYLLABLE MGEX */
- [0xa23e, 0xa23e], /* YI SYLLABLE MGE */
- [0xa23f, 0xa23f], /* YI SYLLABLE MGEP */
- [0xa240, 0xa240], /* YI SYLLABLE MGUT */
- [0xa241, 0xa241], /* YI SYLLABLE MGUX */
- [0xa242, 0xa242], /* YI SYLLABLE MGU */
- [0xa243, 0xa243], /* YI SYLLABLE MGUP */
- [0xa244, 0xa244], /* YI SYLLABLE MGURX */
- [0xa245, 0xa245], /* YI SYLLABLE MGUR */
- [0xa246, 0xa246], /* YI SYLLABLE HXIT */
- [0xa247, 0xa247], /* YI SYLLABLE HXIX */
- [0xa248, 0xa248], /* YI SYLLABLE HXI */
- [0xa249, 0xa249], /* YI SYLLABLE HXIP */
- [0xa24a, 0xa24a], /* YI SYLLABLE HXIET */
- [0xa24b, 0xa24b], /* YI SYLLABLE HXIEX */
- [0xa24c, 0xa24c], /* YI SYLLABLE HXIE */
- [0xa24d, 0xa24d], /* YI SYLLABLE HXIEP */
- [0xa24e, 0xa24e], /* YI SYLLABLE HXAT */
- [0xa24f, 0xa24f], /* YI SYLLABLE HXAX */
- [0xa250, 0xa250], /* YI SYLLABLE HXA */
- [0xa251, 0xa251], /* YI SYLLABLE HXAP */
- [0xa252, 0xa252], /* YI SYLLABLE HXUOT */
- [0xa253, 0xa253], /* YI SYLLABLE HXUOX */
- [0xa254, 0xa254], /* YI SYLLABLE HXUO */
- [0xa255, 0xa255], /* YI SYLLABLE HXUOP */
- [0xa256, 0xa256], /* YI SYLLABLE HXOT */
- [0xa257, 0xa257], /* YI SYLLABLE HXOX */
- [0xa258, 0xa258], /* YI SYLLABLE HXO */
- [0xa259, 0xa259], /* YI SYLLABLE HXOP */
- [0xa25a, 0xa25a], /* YI SYLLABLE HXEX */
- [0xa25b, 0xa25b], /* YI SYLLABLE HXE */
- [0xa25c, 0xa25c], /* YI SYLLABLE HXEP */
- [0xa25d, 0xa25d], /* YI SYLLABLE NGIEX */
- [0xa25e, 0xa25e], /* YI SYLLABLE NGIE */
- [0xa25f, 0xa25f], /* YI SYLLABLE NGIEP */
- [0xa260, 0xa260], /* YI SYLLABLE NGAT */
- [0xa261, 0xa261], /* YI SYLLABLE NGAX */
- [0xa262, 0xa262], /* YI SYLLABLE NGA */
- [0xa263, 0xa263], /* YI SYLLABLE NGAP */
- [0xa264, 0xa264], /* YI SYLLABLE NGUOT */
- [0xa265, 0xa265], /* YI SYLLABLE NGUOX */
- [0xa266, 0xa266], /* YI SYLLABLE NGUO */
- [0xa267, 0xa267], /* YI SYLLABLE NGOT */
- [0xa268, 0xa268], /* YI SYLLABLE NGOX */
- [0xa269, 0xa269], /* YI SYLLABLE NGO */
- [0xa26a, 0xa26a], /* YI SYLLABLE NGOP */
- [0xa26b, 0xa26b], /* YI SYLLABLE NGEX */
- [0xa26c, 0xa26c], /* YI SYLLABLE NGE */
- [0xa26d, 0xa26d], /* YI SYLLABLE NGEP */
- [0xa26e, 0xa26e], /* YI SYLLABLE HIT */
- [0xa26f, 0xa26f], /* YI SYLLABLE HIEX */
- [0xa270, 0xa270], /* YI SYLLABLE HIE */
- [0xa271, 0xa271], /* YI SYLLABLE HAT */
- [0xa272, 0xa272], /* YI SYLLABLE HAX */
- [0xa273, 0xa273], /* YI SYLLABLE HA */
- [0xa274, 0xa274], /* YI SYLLABLE HAP */
- [0xa275, 0xa275], /* YI SYLLABLE HUOT */
- [0xa276, 0xa276], /* YI SYLLABLE HUOX */
- [0xa277, 0xa277], /* YI SYLLABLE HUO */
- [0xa278, 0xa278], /* YI SYLLABLE HUOP */
- [0xa279, 0xa279], /* YI SYLLABLE HOT */
- [0xa27a, 0xa27a], /* YI SYLLABLE HOX */
- [0xa27b, 0xa27b], /* YI SYLLABLE HO */
- [0xa27c, 0xa27c], /* YI SYLLABLE HOP */
- [0xa27d, 0xa27d], /* YI SYLLABLE HEX */
- [0xa27e, 0xa27e], /* YI SYLLABLE HE */
- [0xa27f, 0xa27f], /* YI SYLLABLE HEP */
- [0xa280, 0xa280], /* YI SYLLABLE WAT */
- [0xa281, 0xa281], /* YI SYLLABLE WAX */
- [0xa282, 0xa282], /* YI SYLLABLE WA */
- [0xa283, 0xa283], /* YI SYLLABLE WAP */
- [0xa284, 0xa284], /* YI SYLLABLE WUOX */
- [0xa285, 0xa285], /* YI SYLLABLE WUO */
- [0xa286, 0xa286], /* YI SYLLABLE WUOP */
- [0xa287, 0xa287], /* YI SYLLABLE WOX */
- [0xa288, 0xa288], /* YI SYLLABLE WO */
- [0xa289, 0xa289], /* YI SYLLABLE WOP */
- [0xa28a, 0xa28a], /* YI SYLLABLE WEX */
- [0xa28b, 0xa28b], /* YI SYLLABLE WE */
- [0xa28c, 0xa28c], /* YI SYLLABLE WEP */
- [0xa28d, 0xa28d], /* YI SYLLABLE ZIT */
- [0xa28e, 0xa28e], /* YI SYLLABLE ZIX */
- [0xa28f, 0xa28f], /* YI SYLLABLE ZI */
- [0xa290, 0xa290], /* YI SYLLABLE ZIP */
- [0xa291, 0xa291], /* YI SYLLABLE ZIEX */
- [0xa292, 0xa292], /* YI SYLLABLE ZIE */
- [0xa293, 0xa293], /* YI SYLLABLE ZIEP */
- [0xa294, 0xa294], /* YI SYLLABLE ZAT */
- [0xa295, 0xa295], /* YI SYLLABLE ZAX */
- [0xa296, 0xa296], /* YI SYLLABLE ZA */
- [0xa297, 0xa297], /* YI SYLLABLE ZAP */
- [0xa298, 0xa298], /* YI SYLLABLE ZUOX */
- [0xa299, 0xa299], /* YI SYLLABLE ZUO */
- [0xa29a, 0xa29a], /* YI SYLLABLE ZUOP */
- [0xa29b, 0xa29b], /* YI SYLLABLE ZOT */
- [0xa29c, 0xa29c], /* YI SYLLABLE ZOX */
- [0xa29d, 0xa29d], /* YI SYLLABLE ZO */
- [0xa29e, 0xa29e], /* YI SYLLABLE ZOP */
- [0xa29f, 0xa29f], /* YI SYLLABLE ZEX */
- [0xa2a0, 0xa2a0], /* YI SYLLABLE ZE */
- [0xa2a1, 0xa2a1], /* YI SYLLABLE ZEP */
- [0xa2a2, 0xa2a2], /* YI SYLLABLE ZUT */
- [0xa2a3, 0xa2a3], /* YI SYLLABLE ZUX */
- [0xa2a4, 0xa2a4], /* YI SYLLABLE ZU */
- [0xa2a5, 0xa2a5], /* YI SYLLABLE ZUP */
- [0xa2a6, 0xa2a6], /* YI SYLLABLE ZURX */
- [0xa2a7, 0xa2a7], /* YI SYLLABLE ZUR */
- [0xa2a8, 0xa2a8], /* YI SYLLABLE ZYT */
- [0xa2a9, 0xa2a9], /* YI SYLLABLE ZYX */
- [0xa2aa, 0xa2aa], /* YI SYLLABLE ZY */
- [0xa2ab, 0xa2ab], /* YI SYLLABLE ZYP */
- [0xa2ac, 0xa2ac], /* YI SYLLABLE ZYRX */
- [0xa2ad, 0xa2ad], /* YI SYLLABLE ZYR */
- [0xa2ae, 0xa2ae], /* YI SYLLABLE CIT */
- [0xa2af, 0xa2af], /* YI SYLLABLE CIX */
- [0xa2b0, 0xa2b0], /* YI SYLLABLE CI */
- [0xa2b1, 0xa2b1], /* YI SYLLABLE CIP */
- [0xa2b2, 0xa2b2], /* YI SYLLABLE CIET */
- [0xa2b3, 0xa2b3], /* YI SYLLABLE CIEX */
- [0xa2b4, 0xa2b4], /* YI SYLLABLE CIE */
- [0xa2b5, 0xa2b5], /* YI SYLLABLE CIEP */
- [0xa2b6, 0xa2b6], /* YI SYLLABLE CAT */
- [0xa2b7, 0xa2b7], /* YI SYLLABLE CAX */
- [0xa2b8, 0xa2b8], /* YI SYLLABLE CA */
- [0xa2b9, 0xa2b9], /* YI SYLLABLE CAP */
- [0xa2ba, 0xa2ba], /* YI SYLLABLE CUOX */
- [0xa2bb, 0xa2bb], /* YI SYLLABLE CUO */
- [0xa2bc, 0xa2bc], /* YI SYLLABLE CUOP */
- [0xa2bd, 0xa2bd], /* YI SYLLABLE COT */
- [0xa2be, 0xa2be], /* YI SYLLABLE COX */
- [0xa2bf, 0xa2bf], /* YI SYLLABLE CO */
- [0xa2c0, 0xa2c0], /* YI SYLLABLE COP */
- [0xa2c1, 0xa2c1], /* YI SYLLABLE CEX */
- [0xa2c2, 0xa2c2], /* YI SYLLABLE CE */
- [0xa2c3, 0xa2c3], /* YI SYLLABLE CEP */
- [0xa2c4, 0xa2c4], /* YI SYLLABLE CUT */
- [0xa2c5, 0xa2c5], /* YI SYLLABLE CUX */
- [0xa2c6, 0xa2c6], /* YI SYLLABLE CU */
- [0xa2c7, 0xa2c7], /* YI SYLLABLE CUP */
- [0xa2c8, 0xa2c8], /* YI SYLLABLE CURX */
- [0xa2c9, 0xa2c9], /* YI SYLLABLE CUR */
- [0xa2ca, 0xa2ca], /* YI SYLLABLE CYT */
- [0xa2cb, 0xa2cb], /* YI SYLLABLE CYX */
- [0xa2cc, 0xa2cc], /* YI SYLLABLE CY */
- [0xa2cd, 0xa2cd], /* YI SYLLABLE CYP */
- [0xa2ce, 0xa2ce], /* YI SYLLABLE CYRX */
- [0xa2cf, 0xa2cf], /* YI SYLLABLE CYR */
- [0xa2d0, 0xa2d0], /* YI SYLLABLE ZZIT */
- [0xa2d1, 0xa2d1], /* YI SYLLABLE ZZIX */
- [0xa2d2, 0xa2d2], /* YI SYLLABLE ZZI */
- [0xa2d3, 0xa2d3], /* YI SYLLABLE ZZIP */
- [0xa2d4, 0xa2d4], /* YI SYLLABLE ZZIET */
- [0xa2d5, 0xa2d5], /* YI SYLLABLE ZZIEX */
- [0xa2d6, 0xa2d6], /* YI SYLLABLE ZZIE */
- [0xa2d7, 0xa2d7], /* YI SYLLABLE ZZIEP */
- [0xa2d8, 0xa2d8], /* YI SYLLABLE ZZAT */
- [0xa2d9, 0xa2d9], /* YI SYLLABLE ZZAX */
- [0xa2da, 0xa2da], /* YI SYLLABLE ZZA */
- [0xa2db, 0xa2db], /* YI SYLLABLE ZZAP */
- [0xa2dc, 0xa2dc], /* YI SYLLABLE ZZOX */
- [0xa2dd, 0xa2dd], /* YI SYLLABLE ZZO */
- [0xa2de, 0xa2de], /* YI SYLLABLE ZZOP */
- [0xa2df, 0xa2df], /* YI SYLLABLE ZZEX */
- [0xa2e0, 0xa2e0], /* YI SYLLABLE ZZE */
- [0xa2e1, 0xa2e1], /* YI SYLLABLE ZZEP */
- [0xa2e2, 0xa2e2], /* YI SYLLABLE ZZUX */
- [0xa2e3, 0xa2e3], /* YI SYLLABLE ZZU */
- [0xa2e4, 0xa2e4], /* YI SYLLABLE ZZUP */
- [0xa2e5, 0xa2e5], /* YI SYLLABLE ZZURX */
- [0xa2e6, 0xa2e6], /* YI SYLLABLE ZZUR */
- [0xa2e7, 0xa2e7], /* YI SYLLABLE ZZYT */
- [0xa2e8, 0xa2e8], /* YI SYLLABLE ZZYX */
- [0xa2e9, 0xa2e9], /* YI SYLLABLE ZZY */
- [0xa2ea, 0xa2ea], /* YI SYLLABLE ZZYP */
- [0xa2eb, 0xa2eb], /* YI SYLLABLE ZZYRX */
- [0xa2ec, 0xa2ec], /* YI SYLLABLE ZZYR */
- [0xa2ed, 0xa2ed], /* YI SYLLABLE NZIT */
- [0xa2ee, 0xa2ee], /* YI SYLLABLE NZIX */
- [0xa2ef, 0xa2ef], /* YI SYLLABLE NZI */
- [0xa2f0, 0xa2f0], /* YI SYLLABLE NZIP */
- [0xa2f1, 0xa2f1], /* YI SYLLABLE NZIEX */
- [0xa2f2, 0xa2f2], /* YI SYLLABLE NZIE */
- [0xa2f3, 0xa2f3], /* YI SYLLABLE NZIEP */
- [0xa2f4, 0xa2f4], /* YI SYLLABLE NZAT */
- [0xa2f5, 0xa2f5], /* YI SYLLABLE NZAX */
- [0xa2f6, 0xa2f6], /* YI SYLLABLE NZA */
- [0xa2f7, 0xa2f7], /* YI SYLLABLE NZAP */
- [0xa2f8, 0xa2f8], /* YI SYLLABLE NZUOX */
- [0xa2f9, 0xa2f9], /* YI SYLLABLE NZUO */
- [0xa2fa, 0xa2fa], /* YI SYLLABLE NZOX */
- [0xa2fb, 0xa2fb], /* YI SYLLABLE NZOP */
- [0xa2fc, 0xa2fc], /* YI SYLLABLE NZEX */
- [0xa2fd, 0xa2fd], /* YI SYLLABLE NZE */
- [0xa2fe, 0xa2fe], /* YI SYLLABLE NZUX */
- [0xa2ff, 0xa2ff], /* YI SYLLABLE NZU */
- [0xa300, 0xa300], /* YI SYLLABLE NZUP */
- [0xa301, 0xa301], /* YI SYLLABLE NZURX */
- [0xa302, 0xa302], /* YI SYLLABLE NZUR */
- [0xa303, 0xa303], /* YI SYLLABLE NZYT */
- [0xa304, 0xa304], /* YI SYLLABLE NZYX */
- [0xa305, 0xa305], /* YI SYLLABLE NZY */
- [0xa306, 0xa306], /* YI SYLLABLE NZYP */
- [0xa307, 0xa307], /* YI SYLLABLE NZYRX */
- [0xa308, 0xa308], /* YI SYLLABLE NZYR */
- [0xa309, 0xa309], /* YI SYLLABLE SIT */
- [0xa30a, 0xa30a], /* YI SYLLABLE SIX */
- [0xa30b, 0xa30b], /* YI SYLLABLE SI */
- [0xa30c, 0xa30c], /* YI SYLLABLE SIP */
- [0xa30d, 0xa30d], /* YI SYLLABLE SIEX */
- [0xa30e, 0xa30e], /* YI SYLLABLE SIE */
- [0xa30f, 0xa30f], /* YI SYLLABLE SIEP */
- [0xa310, 0xa310], /* YI SYLLABLE SAT */
- [0xa311, 0xa311], /* YI SYLLABLE SAX */
- [0xa312, 0xa312], /* YI SYLLABLE SA */
- [0xa313, 0xa313], /* YI SYLLABLE SAP */
- [0xa314, 0xa314], /* YI SYLLABLE SUOX */
- [0xa315, 0xa315], /* YI SYLLABLE SUO */
- [0xa316, 0xa316], /* YI SYLLABLE SUOP */
- [0xa317, 0xa317], /* YI SYLLABLE SOT */
- [0xa318, 0xa318], /* YI SYLLABLE SOX */
- [0xa319, 0xa319], /* YI SYLLABLE SO */
- [0xa31a, 0xa31a], /* YI SYLLABLE SOP */
- [0xa31b, 0xa31b], /* YI SYLLABLE SEX */
- [0xa31c, 0xa31c], /* YI SYLLABLE SE */
- [0xa31d, 0xa31d], /* YI SYLLABLE SEP */
- [0xa31e, 0xa31e], /* YI SYLLABLE SUT */
- [0xa31f, 0xa31f], /* YI SYLLABLE SUX */
- [0xa320, 0xa320], /* YI SYLLABLE SU */
- [0xa321, 0xa321], /* YI SYLLABLE SUP */
- [0xa322, 0xa322], /* YI SYLLABLE SURX */
- [0xa323, 0xa323], /* YI SYLLABLE SUR */
- [0xa324, 0xa324], /* YI SYLLABLE SYT */
- [0xa325, 0xa325], /* YI SYLLABLE SYX */
- [0xa326, 0xa326], /* YI SYLLABLE SY */
- [0xa327, 0xa327], /* YI SYLLABLE SYP */
- [0xa328, 0xa328], /* YI SYLLABLE SYRX */
- [0xa329, 0xa329], /* YI SYLLABLE SYR */
- [0xa32a, 0xa32a], /* YI SYLLABLE SSIT */
- [0xa32b, 0xa32b], /* YI SYLLABLE SSIX */
- [0xa32c, 0xa32c], /* YI SYLLABLE SSI */
- [0xa32d, 0xa32d], /* YI SYLLABLE SSIP */
- [0xa32e, 0xa32e], /* YI SYLLABLE SSIEX */
- [0xa32f, 0xa32f], /* YI SYLLABLE SSIE */
- [0xa330, 0xa330], /* YI SYLLABLE SSIEP */
- [0xa331, 0xa331], /* YI SYLLABLE SSAT */
- [0xa332, 0xa332], /* YI SYLLABLE SSAX */
- [0xa333, 0xa333], /* YI SYLLABLE SSA */
- [0xa334, 0xa334], /* YI SYLLABLE SSAP */
- [0xa335, 0xa335], /* YI SYLLABLE SSOT */
- [0xa336, 0xa336], /* YI SYLLABLE SSOX */
- [0xa337, 0xa337], /* YI SYLLABLE SSO */
- [0xa338, 0xa338], /* YI SYLLABLE SSOP */
- [0xa339, 0xa339], /* YI SYLLABLE SSEX */
- [0xa33a, 0xa33a], /* YI SYLLABLE SSE */
- [0xa33b, 0xa33b], /* YI SYLLABLE SSEP */
- [0xa33c, 0xa33c], /* YI SYLLABLE SSUT */
- [0xa33d, 0xa33d], /* YI SYLLABLE SSUX */
- [0xa33e, 0xa33e], /* YI SYLLABLE SSU */
- [0xa33f, 0xa33f], /* YI SYLLABLE SSUP */
- [0xa340, 0xa340], /* YI SYLLABLE SSYT */
- [0xa341, 0xa341], /* YI SYLLABLE SSYX */
- [0xa342, 0xa342], /* YI SYLLABLE SSY */
- [0xa343, 0xa343], /* YI SYLLABLE SSYP */
- [0xa344, 0xa344], /* YI SYLLABLE SSYRX */
- [0xa345, 0xa345], /* YI SYLLABLE SSYR */
- [0xa346, 0xa346], /* YI SYLLABLE ZHAT */
- [0xa347, 0xa347], /* YI SYLLABLE ZHAX */
- [0xa348, 0xa348], /* YI SYLLABLE ZHA */
- [0xa349, 0xa349], /* YI SYLLABLE ZHAP */
- [0xa34a, 0xa34a], /* YI SYLLABLE ZHUOX */
- [0xa34b, 0xa34b], /* YI SYLLABLE ZHUO */
- [0xa34c, 0xa34c], /* YI SYLLABLE ZHUOP */
- [0xa34d, 0xa34d], /* YI SYLLABLE ZHOT */
- [0xa34e, 0xa34e], /* YI SYLLABLE ZHOX */
- [0xa34f, 0xa34f], /* YI SYLLABLE ZHO */
- [0xa350, 0xa350], /* YI SYLLABLE ZHOP */
- [0xa351, 0xa351], /* YI SYLLABLE ZHET */
- [0xa352, 0xa352], /* YI SYLLABLE ZHEX */
- [0xa353, 0xa353], /* YI SYLLABLE ZHE */
- [0xa354, 0xa354], /* YI SYLLABLE ZHEP */
- [0xa355, 0xa355], /* YI SYLLABLE ZHUT */
- [0xa356, 0xa356], /* YI SYLLABLE ZHUX */
- [0xa357, 0xa357], /* YI SYLLABLE ZHU */
- [0xa358, 0xa358], /* YI SYLLABLE ZHUP */
- [0xa359, 0xa359], /* YI SYLLABLE ZHURX */
- [0xa35a, 0xa35a], /* YI SYLLABLE ZHUR */
- [0xa35b, 0xa35b], /* YI SYLLABLE ZHYT */
- [0xa35c, 0xa35c], /* YI SYLLABLE ZHYX */
- [0xa35d, 0xa35d], /* YI SYLLABLE ZHY */
- [0xa35e, 0xa35e], /* YI SYLLABLE ZHYP */
- [0xa35f, 0xa35f], /* YI SYLLABLE ZHYRX */
- [0xa360, 0xa360], /* YI SYLLABLE ZHYR */
- [0xa361, 0xa361], /* YI SYLLABLE CHAT */
- [0xa362, 0xa362], /* YI SYLLABLE CHAX */
- [0xa363, 0xa363], /* YI SYLLABLE CHA */
- [0xa364, 0xa364], /* YI SYLLABLE CHAP */
- [0xa365, 0xa365], /* YI SYLLABLE CHUOT */
- [0xa366, 0xa366], /* YI SYLLABLE CHUOX */
- [0xa367, 0xa367], /* YI SYLLABLE CHUO */
- [0xa368, 0xa368], /* YI SYLLABLE CHUOP */
- [0xa369, 0xa369], /* YI SYLLABLE CHOT */
- [0xa36a, 0xa36a], /* YI SYLLABLE CHOX */
- [0xa36b, 0xa36b], /* YI SYLLABLE CHO */
- [0xa36c, 0xa36c], /* YI SYLLABLE CHOP */
- [0xa36d, 0xa36d], /* YI SYLLABLE CHET */
- [0xa36e, 0xa36e], /* YI SYLLABLE CHEX */
- [0xa36f, 0xa36f], /* YI SYLLABLE CHE */
- [0xa370, 0xa370], /* YI SYLLABLE CHEP */
- [0xa371, 0xa371], /* YI SYLLABLE CHUX */
- [0xa372, 0xa372], /* YI SYLLABLE CHU */
- [0xa373, 0xa373], /* YI SYLLABLE CHUP */
- [0xa374, 0xa374], /* YI SYLLABLE CHURX */
- [0xa375, 0xa375], /* YI SYLLABLE CHUR */
- [0xa376, 0xa376], /* YI SYLLABLE CHYT */
- [0xa377, 0xa377], /* YI SYLLABLE CHYX */
- [0xa378, 0xa378], /* YI SYLLABLE CHY */
- [0xa379, 0xa379], /* YI SYLLABLE CHYP */
- [0xa37a, 0xa37a], /* YI SYLLABLE CHYRX */
- [0xa37b, 0xa37b], /* YI SYLLABLE CHYR */
- [0xa37c, 0xa37c], /* YI SYLLABLE RRAX */
- [0xa37d, 0xa37d], /* YI SYLLABLE RRA */
- [0xa37e, 0xa37e], /* YI SYLLABLE RRUOX */
- [0xa37f, 0xa37f], /* YI SYLLABLE RRUO */
- [0xa380, 0xa380], /* YI SYLLABLE RROT */
- [0xa381, 0xa381], /* YI SYLLABLE RROX */
- [0xa382, 0xa382], /* YI SYLLABLE RRO */
- [0xa383, 0xa383], /* YI SYLLABLE RROP */
- [0xa384, 0xa384], /* YI SYLLABLE RRET */
- [0xa385, 0xa385], /* YI SYLLABLE RREX */
- [0xa386, 0xa386], /* YI SYLLABLE RRE */
- [0xa387, 0xa387], /* YI SYLLABLE RREP */
- [0xa388, 0xa388], /* YI SYLLABLE RRUT */
- [0xa389, 0xa389], /* YI SYLLABLE RRUX */
- [0xa38a, 0xa38a], /* YI SYLLABLE RRU */
- [0xa38b, 0xa38b], /* YI SYLLABLE RRUP */
- [0xa38c, 0xa38c], /* YI SYLLABLE RRURX */
- [0xa38d, 0xa38d], /* YI SYLLABLE RRUR */
- [0xa38e, 0xa38e], /* YI SYLLABLE RRYT */
- [0xa38f, 0xa38f], /* YI SYLLABLE RRYX */
- [0xa390, 0xa390], /* YI SYLLABLE RRY */
- [0xa391, 0xa391], /* YI SYLLABLE RRYP */
- [0xa392, 0xa392], /* YI SYLLABLE RRYRX */
- [0xa393, 0xa393], /* YI SYLLABLE RRYR */
- [0xa394, 0xa394], /* YI SYLLABLE NRAT */
- [0xa395, 0xa395], /* YI SYLLABLE NRAX */
- [0xa396, 0xa396], /* YI SYLLABLE NRA */
- [0xa397, 0xa397], /* YI SYLLABLE NRAP */
- [0xa398, 0xa398], /* YI SYLLABLE NROX */
- [0xa399, 0xa399], /* YI SYLLABLE NRO */
- [0xa39a, 0xa39a], /* YI SYLLABLE NROP */
- [0xa39b, 0xa39b], /* YI SYLLABLE NRET */
- [0xa39c, 0xa39c], /* YI SYLLABLE NREX */
- [0xa39d, 0xa39d], /* YI SYLLABLE NRE */
- [0xa39e, 0xa39e], /* YI SYLLABLE NREP */
- [0xa39f, 0xa39f], /* YI SYLLABLE NRUT */
- [0xa3a0, 0xa3a0], /* YI SYLLABLE NRUX */
- [0xa3a1, 0xa3a1], /* YI SYLLABLE NRU */
- [0xa3a2, 0xa3a2], /* YI SYLLABLE NRUP */
- [0xa3a3, 0xa3a3], /* YI SYLLABLE NRURX */
- [0xa3a4, 0xa3a4], /* YI SYLLABLE NRUR */
- [0xa3a5, 0xa3a5], /* YI SYLLABLE NRYT */
- [0xa3a6, 0xa3a6], /* YI SYLLABLE NRYX */
- [0xa3a7, 0xa3a7], /* YI SYLLABLE NRY */
- [0xa3a8, 0xa3a8], /* YI SYLLABLE NRYP */
- [0xa3a9, 0xa3a9], /* YI SYLLABLE NRYRX */
- [0xa3aa, 0xa3aa], /* YI SYLLABLE NRYR */
- [0xa3ab, 0xa3ab], /* YI SYLLABLE SHAT */
- [0xa3ac, 0xa3ac], /* YI SYLLABLE SHAX */
- [0xa3ad, 0xa3ad], /* YI SYLLABLE SHA */
- [0xa3ae, 0xa3ae], /* YI SYLLABLE SHAP */
- [0xa3af, 0xa3af], /* YI SYLLABLE SHUOX */
- [0xa3b0, 0xa3b0], /* YI SYLLABLE SHUO */
- [0xa3b1, 0xa3b1], /* YI SYLLABLE SHUOP */
- [0xa3b2, 0xa3b2], /* YI SYLLABLE SHOT */
- [0xa3b3, 0xa3b3], /* YI SYLLABLE SHOX */
- [0xa3b4, 0xa3b4], /* YI SYLLABLE SHO */
- [0xa3b5, 0xa3b5], /* YI SYLLABLE SHOP */
- [0xa3b6, 0xa3b6], /* YI SYLLABLE SHET */
- [0xa3b7, 0xa3b7], /* YI SYLLABLE SHEX */
- [0xa3b8, 0xa3b8], /* YI SYLLABLE SHE */
- [0xa3b9, 0xa3b9], /* YI SYLLABLE SHEP */
- [0xa3ba, 0xa3ba], /* YI SYLLABLE SHUT */
- [0xa3bb, 0xa3bb], /* YI SYLLABLE SHUX */
- [0xa3bc, 0xa3bc], /* YI SYLLABLE SHU */
- [0xa3bd, 0xa3bd], /* YI SYLLABLE SHUP */
- [0xa3be, 0xa3be], /* YI SYLLABLE SHURX */
- [0xa3bf, 0xa3bf], /* YI SYLLABLE SHUR */
- [0xa3c0, 0xa3c0], /* YI SYLLABLE SHYT */
- [0xa3c1, 0xa3c1], /* YI SYLLABLE SHYX */
- [0xa3c2, 0xa3c2], /* YI SYLLABLE SHY */
- [0xa3c3, 0xa3c3], /* YI SYLLABLE SHYP */
- [0xa3c4, 0xa3c4], /* YI SYLLABLE SHYRX */
- [0xa3c5, 0xa3c5], /* YI SYLLABLE SHYR */
- [0xa3c6, 0xa3c6], /* YI SYLLABLE RAT */
- [0xa3c7, 0xa3c7], /* YI SYLLABLE RAX */
- [0xa3c8, 0xa3c8], /* YI SYLLABLE RA */
- [0xa3c9, 0xa3c9], /* YI SYLLABLE RAP */
- [0xa3ca, 0xa3ca], /* YI SYLLABLE RUOX */
- [0xa3cb, 0xa3cb], /* YI SYLLABLE RUO */
- [0xa3cc, 0xa3cc], /* YI SYLLABLE RUOP */
- [0xa3cd, 0xa3cd], /* YI SYLLABLE ROT */
- [0xa3ce, 0xa3ce], /* YI SYLLABLE ROX */
- [0xa3cf, 0xa3cf], /* YI SYLLABLE RO */
- [0xa3d0, 0xa3d0], /* YI SYLLABLE ROP */
- [0xa3d1, 0xa3d1], /* YI SYLLABLE REX */
- [0xa3d2, 0xa3d2], /* YI SYLLABLE RE */
- [0xa3d3, 0xa3d3], /* YI SYLLABLE REP */
- [0xa3d4, 0xa3d4], /* YI SYLLABLE RUT */
- [0xa3d5, 0xa3d5], /* YI SYLLABLE RUX */
- [0xa3d6, 0xa3d6], /* YI SYLLABLE RU */
- [0xa3d7, 0xa3d7], /* YI SYLLABLE RUP */
- [0xa3d8, 0xa3d8], /* YI SYLLABLE RURX */
- [0xa3d9, 0xa3d9], /* YI SYLLABLE RUR */
- [0xa3da, 0xa3da], /* YI SYLLABLE RYT */
- [0xa3db, 0xa3db], /* YI SYLLABLE RYX */
- [0xa3dc, 0xa3dc], /* YI SYLLABLE RY */
- [0xa3dd, 0xa3dd], /* YI SYLLABLE RYP */
- [0xa3de, 0xa3de], /* YI SYLLABLE RYRX */
- [0xa3df, 0xa3df], /* YI SYLLABLE RYR */
- [0xa3e0, 0xa3e0], /* YI SYLLABLE JIT */
- [0xa3e1, 0xa3e1], /* YI SYLLABLE JIX */
- [0xa3e2, 0xa3e2], /* YI SYLLABLE JI */
- [0xa3e3, 0xa3e3], /* YI SYLLABLE JIP */
- [0xa3e4, 0xa3e4], /* YI SYLLABLE JIET */
- [0xa3e5, 0xa3e5], /* YI SYLLABLE JIEX */
- [0xa3e6, 0xa3e6], /* YI SYLLABLE JIE */
- [0xa3e7, 0xa3e7], /* YI SYLLABLE JIEP */
- [0xa3e8, 0xa3e8], /* YI SYLLABLE JUOT */
- [0xa3e9, 0xa3e9], /* YI SYLLABLE JUOX */
- [0xa3ea, 0xa3ea], /* YI SYLLABLE JUO */
- [0xa3eb, 0xa3eb], /* YI SYLLABLE JUOP */
- [0xa3ec, 0xa3ec], /* YI SYLLABLE JOT */
- [0xa3ed, 0xa3ed], /* YI SYLLABLE JOX */
- [0xa3ee, 0xa3ee], /* YI SYLLABLE JO */
- [0xa3ef, 0xa3ef], /* YI SYLLABLE JOP */
- [0xa3f0, 0xa3f0], /* YI SYLLABLE JUT */
- [0xa3f1, 0xa3f1], /* YI SYLLABLE JUX */
- [0xa3f2, 0xa3f2], /* YI SYLLABLE JU */
- [0xa3f3, 0xa3f3], /* YI SYLLABLE JUP */
- [0xa3f4, 0xa3f4], /* YI SYLLABLE JURX */
- [0xa3f5, 0xa3f5], /* YI SYLLABLE JUR */
- [0xa3f6, 0xa3f6], /* YI SYLLABLE JYT */
- [0xa3f7, 0xa3f7], /* YI SYLLABLE JYX */
- [0xa3f8, 0xa3f8], /* YI SYLLABLE JY */
- [0xa3f9, 0xa3f9], /* YI SYLLABLE JYP */
- [0xa3fa, 0xa3fa], /* YI SYLLABLE JYRX */
- [0xa3fb, 0xa3fb], /* YI SYLLABLE JYR */
- [0xa3fc, 0xa3fc], /* YI SYLLABLE QIT */
- [0xa3fd, 0xa3fd], /* YI SYLLABLE QIX */
- [0xa3fe, 0xa3fe], /* YI SYLLABLE QI */
- [0xa3ff, 0xa3ff], /* YI SYLLABLE QIP */
- [0xa400, 0xa400], /* YI SYLLABLE QIET */
- [0xa401, 0xa401], /* YI SYLLABLE QIEX */
- [0xa402, 0xa402], /* YI SYLLABLE QIE */
- [0xa403, 0xa403], /* YI SYLLABLE QIEP */
- [0xa404, 0xa404], /* YI SYLLABLE QUOT */
- [0xa405, 0xa405], /* YI SYLLABLE QUOX */
- [0xa406, 0xa406], /* YI SYLLABLE QUO */
- [0xa407, 0xa407], /* YI SYLLABLE QUOP */
- [0xa408, 0xa408], /* YI SYLLABLE QOT */
- [0xa409, 0xa409], /* YI SYLLABLE QOX */
- [0xa40a, 0xa40a], /* YI SYLLABLE QO */
- [0xa40b, 0xa40b], /* YI SYLLABLE QOP */
- [0xa40c, 0xa40c], /* YI SYLLABLE QUT */
- [0xa40d, 0xa40d], /* YI SYLLABLE QUX */
- [0xa40e, 0xa40e], /* YI SYLLABLE QU */
- [0xa40f, 0xa40f], /* YI SYLLABLE QUP */
- [0xa410, 0xa410], /* YI SYLLABLE QURX */
- [0xa411, 0xa411], /* YI SYLLABLE QUR */
- [0xa412, 0xa412], /* YI SYLLABLE QYT */
- [0xa413, 0xa413], /* YI SYLLABLE QYX */
- [0xa414, 0xa414], /* YI SYLLABLE QY */
- [0xa415, 0xa415], /* YI SYLLABLE QYP */
- [0xa416, 0xa416], /* YI SYLLABLE QYRX */
- [0xa417, 0xa417], /* YI SYLLABLE QYR */
- [0xa418, 0xa418], /* YI SYLLABLE JJIT */
- [0xa419, 0xa419], /* YI SYLLABLE JJIX */
- [0xa41a, 0xa41a], /* YI SYLLABLE JJI */
- [0xa41b, 0xa41b], /* YI SYLLABLE JJIP */
- [0xa41c, 0xa41c], /* YI SYLLABLE JJIET */
- [0xa41d, 0xa41d], /* YI SYLLABLE JJIEX */
- [0xa41e, 0xa41e], /* YI SYLLABLE JJIE */
- [0xa41f, 0xa41f], /* YI SYLLABLE JJIEP */
- [0xa420, 0xa420], /* YI SYLLABLE JJUOX */
- [0xa421, 0xa421], /* YI SYLLABLE JJUO */
- [0xa422, 0xa422], /* YI SYLLABLE JJUOP */
- [0xa423, 0xa423], /* YI SYLLABLE JJOT */
- [0xa424, 0xa424], /* YI SYLLABLE JJOX */
- [0xa425, 0xa425], /* YI SYLLABLE JJO */
- [0xa426, 0xa426], /* YI SYLLABLE JJOP */
- [0xa427, 0xa427], /* YI SYLLABLE JJUT */
- [0xa428, 0xa428], /* YI SYLLABLE JJUX */
- [0xa429, 0xa429], /* YI SYLLABLE JJU */
- [0xa42a, 0xa42a], /* YI SYLLABLE JJUP */
- [0xa42b, 0xa42b], /* YI SYLLABLE JJURX */
- [0xa42c, 0xa42c], /* YI SYLLABLE JJUR */
- [0xa42d, 0xa42d], /* YI SYLLABLE JJYT */
- [0xa42e, 0xa42e], /* YI SYLLABLE JJYX */
- [0xa42f, 0xa42f], /* YI SYLLABLE JJY */
- [0xa430, 0xa430], /* YI SYLLABLE JJYP */
- [0xa431, 0xa431], /* YI SYLLABLE NJIT */
- [0xa432, 0xa432], /* YI SYLLABLE NJIX */
- [0xa433, 0xa433], /* YI SYLLABLE NJI */
- [0xa434, 0xa434], /* YI SYLLABLE NJIP */
- [0xa435, 0xa435], /* YI SYLLABLE NJIET */
- [0xa436, 0xa436], /* YI SYLLABLE NJIEX */
- [0xa437, 0xa437], /* YI SYLLABLE NJIE */
- [0xa438, 0xa438], /* YI SYLLABLE NJIEP */
- [0xa439, 0xa439], /* YI SYLLABLE NJUOX */
- [0xa43a, 0xa43a], /* YI SYLLABLE NJUO */
- [0xa43b, 0xa43b], /* YI SYLLABLE NJOT */
- [0xa43c, 0xa43c], /* YI SYLLABLE NJOX */
- [0xa43d, 0xa43d], /* YI SYLLABLE NJO */
- [0xa43e, 0xa43e], /* YI SYLLABLE NJOP */
- [0xa43f, 0xa43f], /* YI SYLLABLE NJUX */
- [0xa440, 0xa440], /* YI SYLLABLE NJU */
- [0xa441, 0xa441], /* YI SYLLABLE NJUP */
- [0xa442, 0xa442], /* YI SYLLABLE NJURX */
- [0xa443, 0xa443], /* YI SYLLABLE NJUR */
- [0xa444, 0xa444], /* YI SYLLABLE NJYT */
- [0xa445, 0xa445], /* YI SYLLABLE NJYX */
- [0xa446, 0xa446], /* YI SYLLABLE NJY */
- [0xa447, 0xa447], /* YI SYLLABLE NJYP */
- [0xa448, 0xa448], /* YI SYLLABLE NJYRX */
- [0xa449, 0xa449], /* YI SYLLABLE NJYR */
- [0xa44a, 0xa44a], /* YI SYLLABLE NYIT */
- [0xa44b, 0xa44b], /* YI SYLLABLE NYIX */
- [0xa44c, 0xa44c], /* YI SYLLABLE NYI */
- [0xa44d, 0xa44d], /* YI SYLLABLE NYIP */
- [0xa44e, 0xa44e], /* YI SYLLABLE NYIET */
- [0xa44f, 0xa44f], /* YI SYLLABLE NYIEX */
- [0xa450, 0xa450], /* YI SYLLABLE NYIE */
- [0xa451, 0xa451], /* YI SYLLABLE NYIEP */
- [0xa452, 0xa452], /* YI SYLLABLE NYUOX */
- [0xa453, 0xa453], /* YI SYLLABLE NYUO */
- [0xa454, 0xa454], /* YI SYLLABLE NYUOP */
- [0xa455, 0xa455], /* YI SYLLABLE NYOT */
- [0xa456, 0xa456], /* YI SYLLABLE NYOX */
- [0xa457, 0xa457], /* YI SYLLABLE NYO */
- [0xa458, 0xa458], /* YI SYLLABLE NYOP */
- [0xa459, 0xa459], /* YI SYLLABLE NYUT */
- [0xa45a, 0xa45a], /* YI SYLLABLE NYUX */
- [0xa45b, 0xa45b], /* YI SYLLABLE NYU */
- [0xa45c, 0xa45c], /* YI SYLLABLE NYUP */
- [0xa45d, 0xa45d], /* YI SYLLABLE XIT */
- [0xa45e, 0xa45e], /* YI SYLLABLE XIX */
- [0xa45f, 0xa45f], /* YI SYLLABLE XI */
- [0xa460, 0xa460], /* YI SYLLABLE XIP */
- [0xa461, 0xa461], /* YI SYLLABLE XIET */
- [0xa462, 0xa462], /* YI SYLLABLE XIEX */
- [0xa463, 0xa463], /* YI SYLLABLE XIE */
- [0xa464, 0xa464], /* YI SYLLABLE XIEP */
- [0xa465, 0xa465], /* YI SYLLABLE XUOX */
- [0xa466, 0xa466], /* YI SYLLABLE XUO */
- [0xa467, 0xa467], /* YI SYLLABLE XOT */
- [0xa468, 0xa468], /* YI SYLLABLE XOX */
- [0xa469, 0xa469], /* YI SYLLABLE XO */
- [0xa46a, 0xa46a], /* YI SYLLABLE XOP */
- [0xa46b, 0xa46b], /* YI SYLLABLE XYT */
- [0xa46c, 0xa46c], /* YI SYLLABLE XYX */
- [0xa46d, 0xa46d], /* YI SYLLABLE XY */
- [0xa46e, 0xa46e], /* YI SYLLABLE XYP */
- [0xa46f, 0xa46f], /* YI SYLLABLE XYRX */
- [0xa470, 0xa470], /* YI SYLLABLE XYR */
- [0xa471, 0xa471], /* YI SYLLABLE YIT */
- [0xa472, 0xa472], /* YI SYLLABLE YIX */
- [0xa473, 0xa473], /* YI SYLLABLE YI */
- [0xa474, 0xa474], /* YI SYLLABLE YIP */
- [0xa475, 0xa475], /* YI SYLLABLE YIET */
- [0xa476, 0xa476], /* YI SYLLABLE YIEX */
- [0xa477, 0xa477], /* YI SYLLABLE YIE */
- [0xa478, 0xa478], /* YI SYLLABLE YIEP */
- [0xa479, 0xa479], /* YI SYLLABLE YUOT */
- [0xa47a, 0xa47a], /* YI SYLLABLE YUOX */
- [0xa47b, 0xa47b], /* YI SYLLABLE YUO */
- [0xa47c, 0xa47c], /* YI SYLLABLE YUOP */
- [0xa47d, 0xa47d], /* YI SYLLABLE YOT */
- [0xa47e, 0xa47e], /* YI SYLLABLE YOX */
- [0xa47f, 0xa47f], /* YI SYLLABLE YO */
- [0xa480, 0xa480], /* YI SYLLABLE YOP */
- [0xa481, 0xa481], /* YI SYLLABLE YUT */
- [0xa482, 0xa482], /* YI SYLLABLE YUX */
- [0xa483, 0xa483], /* YI SYLLABLE YU */
- [0xa484, 0xa484], /* YI SYLLABLE YUP */
- [0xa485, 0xa485], /* YI SYLLABLE YURX */
- [0xa486, 0xa486], /* YI SYLLABLE YUR */
- [0xa487, 0xa487], /* YI SYLLABLE YYT */
- [0xa488, 0xa488], /* YI SYLLABLE YYX */
- [0xa489, 0xa489], /* YI SYLLABLE YY */
- [0xa48a, 0xa48a], /* YI SYLLABLE YYP */
- [0xa48b, 0xa48b], /* YI SYLLABLE YYRX */
- [0xa48c, 0xa48c], /* YI SYLLABLE YYR */
- [0xa48d, 0xa48d],
- [0xa48e, 0xa48e],
- [0xa48f, 0xa48f],
- [0xa490, 0xa490], /* YI RADICAL QOT */
- [0xa491, 0xa491], /* YI RADICAL LI */
- [0xa492, 0xa492], /* YI RADICAL KIT */
- [0xa493, 0xa493], /* YI RADICAL NYIP */
- [0xa494, 0xa494], /* YI RADICAL CYP */
- [0xa495, 0xa495], /* YI RADICAL SSI */
- [0xa496, 0xa496], /* YI RADICAL GGOP */
- [0xa497, 0xa497], /* YI RADICAL GEP */
- [0xa498, 0xa498], /* YI RADICAL MI */
- [0xa499, 0xa499], /* YI RADICAL HXIT */
- [0xa49a, 0xa49a], /* YI RADICAL LYR */
- [0xa49b, 0xa49b], /* YI RADICAL BBUT */
- [0xa49c, 0xa49c], /* YI RADICAL MOP */
- [0xa49d, 0xa49d], /* YI RADICAL YO */
- [0xa49e, 0xa49e], /* YI RADICAL PUT */
- [0xa49f, 0xa49f], /* YI RADICAL HXUO */
- [0xa4a0, 0xa4a0], /* YI RADICAL TAT */
- [0xa4a1, 0xa4a1], /* YI RADICAL GA */
- [0xa4a2, 0xa4a2], /* YI RADICAL ZUP */
- [0xa4a3, 0xa4a3], /* YI RADICAL CYT */
- [0xa4a4, 0xa4a4], /* YI RADICAL DDUR */
- [0xa4a5, 0xa4a5], /* YI RADICAL BUR */
- [0xa4a6, 0xa4a6], /* YI RADICAL GGUO */
- [0xa4a7, 0xa4a7], /* YI RADICAL NYOP */
- [0xa4a8, 0xa4a8], /* YI RADICAL TU */
- [0xa4a9, 0xa4a9], /* YI RADICAL OP */
- [0xa4aa, 0xa4aa], /* YI RADICAL JJUT */
- [0xa4ab, 0xa4ab], /* YI RADICAL ZOT */
- [0xa4ac, 0xa4ac], /* YI RADICAL PYT */
- [0xa4ad, 0xa4ad], /* YI RADICAL HMO */
- [0xa4ae, 0xa4ae], /* YI RADICAL YIT */
- [0xa4af, 0xa4af], /* YI RADICAL VUR */
- [0xa4b0, 0xa4b0], /* YI RADICAL SHY */
- [0xa4b1, 0xa4b1], /* YI RADICAL VEP */
- [0xa4b2, 0xa4b2], /* YI RADICAL ZA */
- [0xa4b3, 0xa4b3], /* YI RADICAL JO */
- [0xa4b4, 0xa4b4], /* YI RADICAL NZUP */
- [0xa4b5, 0xa4b5], /* YI RADICAL JJY */
- [0xa4b6, 0xa4b6], /* YI RADICAL GOT */
- [0xa4b7, 0xa4b7], /* YI RADICAL JJIE */
- [0xa4b8, 0xa4b8], /* YI RADICAL WO */
- [0xa4b9, 0xa4b9], /* YI RADICAL DU */
- [0xa4ba, 0xa4ba], /* YI RADICAL SHUR */
- [0xa4bb, 0xa4bb], /* YI RADICAL LIE */
- [0xa4bc, 0xa4bc], /* YI RADICAL CY */
- [0xa4bd, 0xa4bd], /* YI RADICAL CUOP */
- [0xa4be, 0xa4be], /* YI RADICAL CIP */
- [0xa4bf, 0xa4bf], /* YI RADICAL HXOP */
- [0xa4c0, 0xa4c0], /* YI RADICAL SHAT */
- [0xa4c1, 0xa4c1], /* YI RADICAL ZUR */
- [0xa4c2, 0xa4c2], /* YI RADICAL SHOP */
- [0xa4c3, 0xa4c3], /* YI RADICAL CHE */
- [0xa4c4, 0xa4c4], /* YI RADICAL ZZIET */
- [0xa4c5, 0xa4c5], /* YI RADICAL NBIE */
- [0xa4c6, 0xa4c6], /* YI RADICAL KE */
- [0xa4c7, 0xa4c7],
- [0xa4c8, 0xa4c8],
- [0xa4c9, 0xa4c9],
- [0xa4ca, 0xa4ca],
- [0xa4cb, 0xa4cb],
- [0xa4cc, 0xa4cc],
- [0xa4cd, 0xa4cd],
- [0xa4ce, 0xa4ce],
- [0xa4cf, 0xa4cf],
- [0xa4d0, 0xa4d0], /* LISU LETTER BA */
- [0xa4d1, 0xa4d1], /* LISU LETTER PA */
- [0xa4d2, 0xa4d2], /* LISU LETTER PHA */
- [0xa4d3, 0xa4d3], /* LISU LETTER DA */
- [0xa4d4, 0xa4d4], /* LISU LETTER TA */
- [0xa4d5, 0xa4d5], /* LISU LETTER THA */
- [0xa4d6, 0xa4d6], /* LISU LETTER GA */
- [0xa4d7, 0xa4d7], /* LISU LETTER KA */
- [0xa4d8, 0xa4d8], /* LISU LETTER KHA */
- [0xa4d9, 0xa4d9], /* LISU LETTER JA */
- [0xa4da, 0xa4da], /* LISU LETTER CA */
- [0xa4db, 0xa4db], /* LISU LETTER CHA */
- [0xa4dc, 0xa4dc], /* LISU LETTER DZA */
- [0xa4dd, 0xa4dd], /* LISU LETTER TSA */
- [0xa4de, 0xa4de], /* LISU LETTER TSHA */
- [0xa4df, 0xa4df], /* LISU LETTER MA */
- [0xa4e0, 0xa4e0], /* LISU LETTER NA */
- [0xa4e1, 0xa4e1], /* LISU LETTER LA */
- [0xa4e2, 0xa4e2], /* LISU LETTER SA */
- [0xa4e3, 0xa4e3], /* LISU LETTER ZHA */
- [0xa4e4, 0xa4e4], /* LISU LETTER ZA */
- [0xa4e5, 0xa4e5], /* LISU LETTER NGA */
- [0xa4e6, 0xa4e6], /* LISU LETTER HA */
- [0xa4e7, 0xa4e7], /* LISU LETTER XA */
- [0xa4e8, 0xa4e8], /* LISU LETTER HHA */
- [0xa4e9, 0xa4e9], /* LISU LETTER FA */
- [0xa4ea, 0xa4ea], /* LISU LETTER WA */
- [0xa4eb, 0xa4eb], /* LISU LETTER SHA */
- [0xa4ec, 0xa4ec], /* LISU LETTER YA */
- [0xa4ed, 0xa4ed], /* LISU LETTER GHA */
- [0xa4ee, 0xa4ee], /* LISU LETTER A */
- [0xa4ef, 0xa4ef], /* LISU LETTER AE */
- [0xa4f0, 0xa4f0], /* LISU LETTER E */
- [0xa4f1, 0xa4f1], /* LISU LETTER EU */
- [0xa4f2, 0xa4f2], /* LISU LETTER I */
- [0xa4f3, 0xa4f3], /* LISU LETTER O */
- [0xa4f4, 0xa4f4], /* LISU LETTER U */
- [0xa4f5, 0xa4f5], /* LISU LETTER UE */
- [0xa4f6, 0xa4f6], /* LISU LETTER UH */
- [0xa4f7, 0xa4f7], /* LISU LETTER OE */
- [0xa4f8, 0xa4f8], /* LISU LETTER TONE MYA TI */
- [0xa4f9, 0xa4f9], /* LISU LETTER TONE NA PO */
- [0xa4fa, 0xa4fa], /* LISU LETTER TONE MYA CYA */
- [0xa4fb, 0xa4fb], /* LISU LETTER TONE MYA BO */
- [0xa4fc, 0xa4fc], /* LISU LETTER TONE MYA NA */
- [0xa4fd, 0xa4fd], /* LISU LETTER TONE MYA JEU */
- [0xa4fe, 0xa4fe], /* LISU PUNCTUATION COMMA */
- [0xa4ff, 0xa4ff], /* LISU PUNCTUATION FULL STOP */
- [0xa500, 0xa500], /* VAI SYLLABLE EE */
- [0xa501, 0xa501], /* VAI SYLLABLE EEN */
- [0xa502, 0xa502], /* VAI SYLLABLE HEE */
- [0xa503, 0xa503], /* VAI SYLLABLE WEE */
- [0xa504, 0xa504], /* VAI SYLLABLE WEEN */
- [0xa505, 0xa505], /* VAI SYLLABLE PEE */
- [0xa506, 0xa506], /* VAI SYLLABLE BHEE */
- [0xa507, 0xa507], /* VAI SYLLABLE BEE */
- [0xa508, 0xa508], /* VAI SYLLABLE MBEE */
- [0xa509, 0xa509], /* VAI SYLLABLE KPEE */
- [0xa50a, 0xa50a], /* VAI SYLLABLE MGBEE */
- [0xa50b, 0xa50b], /* VAI SYLLABLE GBEE */
- [0xa50c, 0xa50c], /* VAI SYLLABLE FEE */
- [0xa50d, 0xa50d], /* VAI SYLLABLE VEE */
- [0xa50e, 0xa50e], /* VAI SYLLABLE TEE */
- [0xa50f, 0xa50f], /* VAI SYLLABLE THEE */
- [0xa510, 0xa510], /* VAI SYLLABLE DHEE */
- [0xa511, 0xa511], /* VAI SYLLABLE DHHEE */
- [0xa512, 0xa512], /* VAI SYLLABLE LEE */
- [0xa513, 0xa513], /* VAI SYLLABLE REE */
- [0xa514, 0xa514], /* VAI SYLLABLE DEE */
- [0xa515, 0xa515], /* VAI SYLLABLE NDEE */
- [0xa516, 0xa516], /* VAI SYLLABLE SEE */
- [0xa517, 0xa517], /* VAI SYLLABLE SHEE */
- [0xa518, 0xa518], /* VAI SYLLABLE ZEE */
- [0xa519, 0xa519], /* VAI SYLLABLE ZHEE */
- [0xa51a, 0xa51a], /* VAI SYLLABLE CEE */
- [0xa51b, 0xa51b], /* VAI SYLLABLE JEE */
- [0xa51c, 0xa51c], /* VAI SYLLABLE NJEE */
- [0xa51d, 0xa51d], /* VAI SYLLABLE YEE */
- [0xa51e, 0xa51e], /* VAI SYLLABLE KEE */
- [0xa51f, 0xa51f], /* VAI SYLLABLE NGGEE */
- [0xa520, 0xa520], /* VAI SYLLABLE GEE */
- [0xa521, 0xa521], /* VAI SYLLABLE MEE */
- [0xa522, 0xa522], /* VAI SYLLABLE NEE */
- [0xa523, 0xa523], /* VAI SYLLABLE NYEE */
- [0xa524, 0xa524], /* VAI SYLLABLE I */
- [0xa525, 0xa525], /* VAI SYLLABLE IN */
- [0xa526, 0xa526], /* VAI SYLLABLE HI */
- [0xa527, 0xa527], /* VAI SYLLABLE HIN */
- [0xa528, 0xa528], /* VAI SYLLABLE WI */
- [0xa529, 0xa529], /* VAI SYLLABLE WIN */
- [0xa52a, 0xa52a], /* VAI SYLLABLE PI */
- [0xa52b, 0xa52b], /* VAI SYLLABLE BHI */
- [0xa52c, 0xa52c], /* VAI SYLLABLE BI */
- [0xa52d, 0xa52d], /* VAI SYLLABLE MBI */
- [0xa52e, 0xa52e], /* VAI SYLLABLE KPI */
- [0xa52f, 0xa52f], /* VAI SYLLABLE MGBI */
- [0xa530, 0xa530], /* VAI SYLLABLE GBI */
- [0xa531, 0xa531], /* VAI SYLLABLE FI */
- [0xa532, 0xa532], /* VAI SYLLABLE VI */
- [0xa533, 0xa533], /* VAI SYLLABLE TI */
- [0xa534, 0xa534], /* VAI SYLLABLE THI */
- [0xa535, 0xa535], /* VAI SYLLABLE DHI */
- [0xa536, 0xa536], /* VAI SYLLABLE DHHI */
- [0xa537, 0xa537], /* VAI SYLLABLE LI */
- [0xa538, 0xa538], /* VAI SYLLABLE RI */
- [0xa539, 0xa539], /* VAI SYLLABLE DI */
- [0xa53a, 0xa53a], /* VAI SYLLABLE NDI */
- [0xa53b, 0xa53b], /* VAI SYLLABLE SI */
- [0xa53c, 0xa53c], /* VAI SYLLABLE SHI */
- [0xa53d, 0xa53d], /* VAI SYLLABLE ZI */
- [0xa53e, 0xa53e], /* VAI SYLLABLE ZHI */
- [0xa53f, 0xa53f], /* VAI SYLLABLE CI */
- [0xa540, 0xa540], /* VAI SYLLABLE JI */
- [0xa541, 0xa541], /* VAI SYLLABLE NJI */
- [0xa542, 0xa542], /* VAI SYLLABLE YI */
- [0xa543, 0xa543], /* VAI SYLLABLE KI */
- [0xa544, 0xa544], /* VAI SYLLABLE NGGI */
- [0xa545, 0xa545], /* VAI SYLLABLE GI */
- [0xa546, 0xa546], /* VAI SYLLABLE MI */
- [0xa547, 0xa547], /* VAI SYLLABLE NI */
- [0xa548, 0xa548], /* VAI SYLLABLE NYI */
- [0xa549, 0xa549], /* VAI SYLLABLE A */
- [0xa54a, 0xa54a], /* VAI SYLLABLE AN */
- [0xa54b, 0xa54b], /* VAI SYLLABLE NGAN */
- [0xa54c, 0xa54c], /* VAI SYLLABLE HA */
- [0xa54d, 0xa54d], /* VAI SYLLABLE HAN */
- [0xa54e, 0xa54e], /* VAI SYLLABLE WA */
- [0xa54f, 0xa54f], /* VAI SYLLABLE WAN */
- [0xa550, 0xa550], /* VAI SYLLABLE PA */
- [0xa551, 0xa551], /* VAI SYLLABLE BHA */
- [0xa552, 0xa552], /* VAI SYLLABLE BA */
- [0xa553, 0xa553], /* VAI SYLLABLE MBA */
- [0xa554, 0xa554], /* VAI SYLLABLE KPA */
- [0xa555, 0xa555], /* VAI SYLLABLE KPAN */
- [0xa556, 0xa556], /* VAI SYLLABLE MGBA */
- [0xa557, 0xa557], /* VAI SYLLABLE GBA */
- [0xa558, 0xa558], /* VAI SYLLABLE FA */
- [0xa559, 0xa559], /* VAI SYLLABLE VA */
- [0xa55a, 0xa55a], /* VAI SYLLABLE TA */
- [0xa55b, 0xa55b], /* VAI SYLLABLE THA */
- [0xa55c, 0xa55c], /* VAI SYLLABLE DHA */
- [0xa55d, 0xa55d], /* VAI SYLLABLE DHHA */
- [0xa55e, 0xa55e], /* VAI SYLLABLE LA */
- [0xa55f, 0xa55f], /* VAI SYLLABLE RA */
- [0xa560, 0xa560], /* VAI SYLLABLE DA */
- [0xa561, 0xa561], /* VAI SYLLABLE NDA */
- [0xa562, 0xa562], /* VAI SYLLABLE SA */
- [0xa563, 0xa563], /* VAI SYLLABLE SHA */
- [0xa564, 0xa564], /* VAI SYLLABLE ZA */
- [0xa565, 0xa565], /* VAI SYLLABLE ZHA */
- [0xa566, 0xa566], /* VAI SYLLABLE CA */
- [0xa567, 0xa567], /* VAI SYLLABLE JA */
- [0xa568, 0xa568], /* VAI SYLLABLE NJA */
- [0xa569, 0xa569], /* VAI SYLLABLE YA */
- [0xa56a, 0xa56a], /* VAI SYLLABLE KA */
- [0xa56b, 0xa56b], /* VAI SYLLABLE KAN */
- [0xa56c, 0xa56c], /* VAI SYLLABLE NGGA */
- [0xa56d, 0xa56d], /* VAI SYLLABLE GA */
- [0xa56e, 0xa56e], /* VAI SYLLABLE MA */
- [0xa56f, 0xa56f], /* VAI SYLLABLE NA */
- [0xa570, 0xa570], /* VAI SYLLABLE NYA */
- [0xa571, 0xa571], /* VAI SYLLABLE OO */
- [0xa572, 0xa572], /* VAI SYLLABLE OON */
- [0xa573, 0xa573], /* VAI SYLLABLE HOO */
- [0xa574, 0xa574], /* VAI SYLLABLE WOO */
- [0xa575, 0xa575], /* VAI SYLLABLE WOON */
- [0xa576, 0xa576], /* VAI SYLLABLE POO */
- [0xa577, 0xa577], /* VAI SYLLABLE BHOO */
- [0xa578, 0xa578], /* VAI SYLLABLE BOO */
- [0xa579, 0xa579], /* VAI SYLLABLE MBOO */
- [0xa57a, 0xa57a], /* VAI SYLLABLE KPOO */
- [0xa57b, 0xa57b], /* VAI SYLLABLE MGBOO */
- [0xa57c, 0xa57c], /* VAI SYLLABLE GBOO */
- [0xa57d, 0xa57d], /* VAI SYLLABLE FOO */
- [0xa57e, 0xa57e], /* VAI SYLLABLE VOO */
- [0xa57f, 0xa57f], /* VAI SYLLABLE TOO */
- [0xa580, 0xa580], /* VAI SYLLABLE THOO */
- [0xa581, 0xa581], /* VAI SYLLABLE DHOO */
- [0xa582, 0xa582], /* VAI SYLLABLE DHHOO */
- [0xa583, 0xa583], /* VAI SYLLABLE LOO */
- [0xa584, 0xa584], /* VAI SYLLABLE ROO */
- [0xa585, 0xa585], /* VAI SYLLABLE DOO */
- [0xa586, 0xa586], /* VAI SYLLABLE NDOO */
- [0xa587, 0xa587], /* VAI SYLLABLE SOO */
- [0xa588, 0xa588], /* VAI SYLLABLE SHOO */
- [0xa589, 0xa589], /* VAI SYLLABLE ZOO */
- [0xa58a, 0xa58a], /* VAI SYLLABLE ZHOO */
- [0xa58b, 0xa58b], /* VAI SYLLABLE COO */
- [0xa58c, 0xa58c], /* VAI SYLLABLE JOO */
- [0xa58d, 0xa58d], /* VAI SYLLABLE NJOO */
- [0xa58e, 0xa58e], /* VAI SYLLABLE YOO */
- [0xa58f, 0xa58f], /* VAI SYLLABLE KOO */
- [0xa590, 0xa590], /* VAI SYLLABLE NGGOO */
- [0xa591, 0xa591], /* VAI SYLLABLE GOO */
- [0xa592, 0xa592], /* VAI SYLLABLE MOO */
- [0xa593, 0xa593], /* VAI SYLLABLE NOO */
- [0xa594, 0xa594], /* VAI SYLLABLE NYOO */
- [0xa595, 0xa595], /* VAI SYLLABLE U */
- [0xa596, 0xa596], /* VAI SYLLABLE UN */
- [0xa597, 0xa597], /* VAI SYLLABLE HU */
- [0xa598, 0xa598], /* VAI SYLLABLE HUN */
- [0xa599, 0xa599], /* VAI SYLLABLE WU */
- [0xa59a, 0xa59a], /* VAI SYLLABLE WUN */
- [0xa59b, 0xa59b], /* VAI SYLLABLE PU */
- [0xa59c, 0xa59c], /* VAI SYLLABLE BHU */
- [0xa59d, 0xa59d], /* VAI SYLLABLE BU */
- [0xa59e, 0xa59e], /* VAI SYLLABLE MBU */
- [0xa59f, 0xa59f], /* VAI SYLLABLE KPU */
- [0xa5a0, 0xa5a0], /* VAI SYLLABLE MGBU */
- [0xa5a1, 0xa5a1], /* VAI SYLLABLE GBU */
- [0xa5a2, 0xa5a2], /* VAI SYLLABLE FU */
- [0xa5a3, 0xa5a3], /* VAI SYLLABLE VU */
- [0xa5a4, 0xa5a4], /* VAI SYLLABLE TU */
- [0xa5a5, 0xa5a5], /* VAI SYLLABLE THU */
- [0xa5a6, 0xa5a6], /* VAI SYLLABLE DHU */
- [0xa5a7, 0xa5a7], /* VAI SYLLABLE DHHU */
- [0xa5a8, 0xa5a8], /* VAI SYLLABLE LU */
- [0xa5a9, 0xa5a9], /* VAI SYLLABLE RU */
- [0xa5aa, 0xa5aa], /* VAI SYLLABLE DU */
- [0xa5ab, 0xa5ab], /* VAI SYLLABLE NDU */
- [0xa5ac, 0xa5ac], /* VAI SYLLABLE SU */
- [0xa5ad, 0xa5ad], /* VAI SYLLABLE SHU */
- [0xa5ae, 0xa5ae], /* VAI SYLLABLE ZU */
- [0xa5af, 0xa5af], /* VAI SYLLABLE ZHU */
- [0xa5b0, 0xa5b0], /* VAI SYLLABLE CU */
- [0xa5b1, 0xa5b1], /* VAI SYLLABLE JU */
- [0xa5b2, 0xa5b2], /* VAI SYLLABLE NJU */
- [0xa5b3, 0xa5b3], /* VAI SYLLABLE YU */
- [0xa5b4, 0xa5b4], /* VAI SYLLABLE KU */
- [0xa5b5, 0xa5b5], /* VAI SYLLABLE NGGU */
- [0xa5b6, 0xa5b6], /* VAI SYLLABLE GU */
- [0xa5b7, 0xa5b7], /* VAI SYLLABLE MU */
- [0xa5b8, 0xa5b8], /* VAI SYLLABLE NU */
- [0xa5b9, 0xa5b9], /* VAI SYLLABLE NYU */
- [0xa5ba, 0xa5ba], /* VAI SYLLABLE O */
- [0xa5bb, 0xa5bb], /* VAI SYLLABLE ON */
- [0xa5bc, 0xa5bc], /* VAI SYLLABLE NGON */
- [0xa5bd, 0xa5bd], /* VAI SYLLABLE HO */
- [0xa5be, 0xa5be], /* VAI SYLLABLE HON */
- [0xa5bf, 0xa5bf], /* VAI SYLLABLE WO */
- [0xa5c0, 0xa5c0], /* VAI SYLLABLE WON */
- [0xa5c1, 0xa5c1], /* VAI SYLLABLE PO */
- [0xa5c2, 0xa5c2], /* VAI SYLLABLE BHO */
- [0xa5c3, 0xa5c3], /* VAI SYLLABLE BO */
- [0xa5c4, 0xa5c4], /* VAI SYLLABLE MBO */
- [0xa5c5, 0xa5c5], /* VAI SYLLABLE KPO */
- [0xa5c6, 0xa5c6], /* VAI SYLLABLE MGBO */
- [0xa5c7, 0xa5c7], /* VAI SYLLABLE GBO */
- [0xa5c8, 0xa5c8], /* VAI SYLLABLE GBON */
- [0xa5c9, 0xa5c9], /* VAI SYLLABLE FO */
- [0xa5ca, 0xa5ca], /* VAI SYLLABLE VO */
- [0xa5cb, 0xa5cb], /* VAI SYLLABLE TO */
- [0xa5cc, 0xa5cc], /* VAI SYLLABLE THO */
- [0xa5cd, 0xa5cd], /* VAI SYLLABLE DHO */
- [0xa5ce, 0xa5ce], /* VAI SYLLABLE DHHO */
- [0xa5cf, 0xa5cf], /* VAI SYLLABLE LO */
- [0xa5d0, 0xa5d0], /* VAI SYLLABLE RO */
- [0xa5d1, 0xa5d1], /* VAI SYLLABLE DO */
- [0xa5d2, 0xa5d2], /* VAI SYLLABLE NDO */
- [0xa5d3, 0xa5d3], /* VAI SYLLABLE SO */
- [0xa5d4, 0xa5d4], /* VAI SYLLABLE SHO */
- [0xa5d5, 0xa5d5], /* VAI SYLLABLE ZO */
- [0xa5d6, 0xa5d6], /* VAI SYLLABLE ZHO */
- [0xa5d7, 0xa5d7], /* VAI SYLLABLE CO */
- [0xa5d8, 0xa5d8], /* VAI SYLLABLE JO */
- [0xa5d9, 0xa5d9], /* VAI SYLLABLE NJO */
- [0xa5da, 0xa5da], /* VAI SYLLABLE YO */
- [0xa5db, 0xa5db], /* VAI SYLLABLE KO */
- [0xa5dc, 0xa5dc], /* VAI SYLLABLE NGGO */
- [0xa5dd, 0xa5dd], /* VAI SYLLABLE GO */
- [0xa5de, 0xa5de], /* VAI SYLLABLE MO */
- [0xa5df, 0xa5df], /* VAI SYLLABLE NO */
- [0xa5e0, 0xa5e0], /* VAI SYLLABLE NYO */
- [0xa5e1, 0xa5e1], /* VAI SYLLABLE E */
- [0xa5e2, 0xa5e2], /* VAI SYLLABLE EN */
- [0xa5e3, 0xa5e3], /* VAI SYLLABLE NGEN */
- [0xa5e4, 0xa5e4], /* VAI SYLLABLE HE */
- [0xa5e5, 0xa5e5], /* VAI SYLLABLE HEN */
- [0xa5e6, 0xa5e6], /* VAI SYLLABLE WE */
- [0xa5e7, 0xa5e7], /* VAI SYLLABLE WEN */
- [0xa5e8, 0xa5e8], /* VAI SYLLABLE PE */
- [0xa5e9, 0xa5e9], /* VAI SYLLABLE BHE */
- [0xa5ea, 0xa5ea], /* VAI SYLLABLE BE */
- [0xa5eb, 0xa5eb], /* VAI SYLLABLE MBE */
- [0xa5ec, 0xa5ec], /* VAI SYLLABLE KPE */
- [0xa5ed, 0xa5ed], /* VAI SYLLABLE KPEN */
- [0xa5ee, 0xa5ee], /* VAI SYLLABLE MGBE */
- [0xa5ef, 0xa5ef], /* VAI SYLLABLE GBE */
- [0xa5f0, 0xa5f0], /* VAI SYLLABLE GBEN */
- [0xa5f1, 0xa5f1], /* VAI SYLLABLE FE */
- [0xa5f2, 0xa5f2], /* VAI SYLLABLE VE */
- [0xa5f3, 0xa5f3], /* VAI SYLLABLE TE */
- [0xa5f4, 0xa5f4], /* VAI SYLLABLE THE */
- [0xa5f5, 0xa5f5], /* VAI SYLLABLE DHE */
- [0xa5f6, 0xa5f6], /* VAI SYLLABLE DHHE */
- [0xa5f7, 0xa5f7], /* VAI SYLLABLE LE */
- [0xa5f8, 0xa5f8], /* VAI SYLLABLE RE */
- [0xa5f9, 0xa5f9], /* VAI SYLLABLE DE */
- [0xa5fa, 0xa5fa], /* VAI SYLLABLE NDE */
- [0xa5fb, 0xa5fb], /* VAI SYLLABLE SE */
- [0xa5fc, 0xa5fc], /* VAI SYLLABLE SHE */
- [0xa5fd, 0xa5fd], /* VAI SYLLABLE ZE */
- [0xa5fe, 0xa5fe], /* VAI SYLLABLE ZHE */
- [0xa5ff, 0xa5ff], /* VAI SYLLABLE CE */
- [0xa600, 0xa600], /* VAI SYLLABLE JE */
- [0xa601, 0xa601], /* VAI SYLLABLE NJE */
- [0xa602, 0xa602], /* VAI SYLLABLE YE */
- [0xa603, 0xa603], /* VAI SYLLABLE KE */
- [0xa604, 0xa604], /* VAI SYLLABLE NGGE */
- [0xa605, 0xa605], /* VAI SYLLABLE NGGEN */
- [0xa606, 0xa606], /* VAI SYLLABLE GE */
- [0xa607, 0xa607], /* VAI SYLLABLE GEN */
- [0xa608, 0xa608], /* VAI SYLLABLE ME */
- [0xa609, 0xa609], /* VAI SYLLABLE NE */
- [0xa60a, 0xa60a], /* VAI SYLLABLE NYE */
- [0xa60b, 0xa60b], /* VAI SYLLABLE NG */
- [0xa60c, 0xa60c], /* VAI SYLLABLE LENGTHENER */
- [0xa60d, 0xa60d], /* VAI COMMA */
- [0xa60e, 0xa60e], /* VAI FULL STOP */
- [0xa60f, 0xa60f], /* VAI QUESTION MARK */
- [0xa610, 0xa610], /* VAI SYLLABLE NDOLE FA */
- [0xa611, 0xa611], /* VAI SYLLABLE NDOLE KA */
- [0xa612, 0xa612], /* VAI SYLLABLE NDOLE SOO */
- [0xa613, 0xa613], /* VAI SYMBOL FEENG */
- [0xa614, 0xa614], /* VAI SYMBOL KEENG */
- [0xa615, 0xa615], /* VAI SYMBOL TING */
- [0xa616, 0xa616], /* VAI SYMBOL NII */
- [0xa617, 0xa617], /* VAI SYMBOL BANG */
- [0xa618, 0xa618], /* VAI SYMBOL FAA */
- [0xa619, 0xa619], /* VAI SYMBOL TAA */
- [0xa61a, 0xa61a], /* VAI SYMBOL DANG */
- [0xa61b, 0xa61b], /* VAI SYMBOL DOONG */
- [0xa61c, 0xa61c], /* VAI SYMBOL KUNG */
- [0xa61d, 0xa61d], /* VAI SYMBOL TONG */
- [0xa61e, 0xa61e], /* VAI SYMBOL DO-O */
- [0xa61f, 0xa61f], /* VAI SYMBOL JONG */
- [0xa620, 0xa620], /* VAI DIGIT ZERO */
- [0xa621, 0xa621], /* VAI DIGIT ONE */
- [0xa622, 0xa622], /* VAI DIGIT TWO */
- [0xa623, 0xa623], /* VAI DIGIT THREE */
- [0xa624, 0xa624], /* VAI DIGIT FOUR */
- [0xa625, 0xa625], /* VAI DIGIT FIVE */
- [0xa626, 0xa626], /* VAI DIGIT SIX */
- [0xa627, 0xa627], /* VAI DIGIT SEVEN */
- [0xa628, 0xa628], /* VAI DIGIT EIGHT */
- [0xa629, 0xa629], /* VAI DIGIT NINE */
- [0xa62a, 0xa62a], /* VAI SYLLABLE NDOLE MA */
- [0xa62b, 0xa62b], /* VAI SYLLABLE NDOLE DO */
- [0xa62c, 0xa62c],
- [0xa62d, 0xa62d],
- [0xa62e, 0xa62e],
- [0xa62f, 0xa62f],
- [0xa630, 0xa630],
- [0xa631, 0xa631],
- [0xa632, 0xa632],
- [0xa633, 0xa633],
- [0xa634, 0xa634],
- [0xa635, 0xa635],
- [0xa636, 0xa636],
- [0xa637, 0xa637],
- [0xa638, 0xa638],
- [0xa639, 0xa639],
- [0xa63a, 0xa63a],
- [0xa63b, 0xa63b],
- [0xa63c, 0xa63c],
- [0xa63d, 0xa63d],
- [0xa63e, 0xa63e],
- [0xa63f, 0xa63f],
- [0xa640, 0xa641], /* CYRILLIC CAPITAL LETTER ZEMLYA */
- [0xa640, 0xa641], /* CYRILLIC SMALL LETTER ZEMLYA */
- [0xa642, 0xa643], /* CYRILLIC CAPITAL LETTER DZELO */
- [0xa642, 0xa643], /* CYRILLIC SMALL LETTER DZELO */
- [0xa644, 0xa645], /* CYRILLIC CAPITAL LETTER REVERSED DZE */
- [0xa644, 0xa645], /* CYRILLIC SMALL LETTER REVERSED DZE */
- [0xa646, 0xa647], /* CYRILLIC CAPITAL LETTER IOTA */
- [0xa646, 0xa647], /* CYRILLIC SMALL LETTER IOTA */
- [0xa648, 0xa649], /* CYRILLIC CAPITAL LETTER DJERV */
- [0xa648, 0xa649], /* CYRILLIC SMALL LETTER DJERV */
- [0xa64a, 0xa64b], /* CYRILLIC CAPITAL LETTER MONOGRAPH UK */
- [0xa64a, 0xa64b], /* CYRILLIC SMALL LETTER MONOGRAPH UK */
- [0xa64c, 0xa64d], /* CYRILLIC CAPITAL LETTER BROAD OMEGA */
- [0xa64c, 0xa64d], /* CYRILLIC SMALL LETTER BROAD OMEGA */
- [0xa64e, 0xa64f], /* CYRILLIC CAPITAL LETTER NEUTRAL YER */
- [0xa64e, 0xa64f], /* CYRILLIC SMALL LETTER NEUTRAL YER */
- [0xa650, 0xa651], /* CYRILLIC CAPITAL LETTER YERU WITH BACK YER */
- [0xa650, 0xa651], /* CYRILLIC SMALL LETTER YERU WITH BACK YER */
- [0xa652, 0xa653], /* CYRILLIC CAPITAL LETTER IOTIFIED YAT */
- [0xa652, 0xa653], /* CYRILLIC SMALL LETTER IOTIFIED YAT */
- [0xa654, 0xa655], /* CYRILLIC CAPITAL LETTER REVERSED YU */
- [0xa654, 0xa655], /* CYRILLIC SMALL LETTER REVERSED YU */
- [0xa656, 0xa657], /* CYRILLIC CAPITAL LETTER IOTIFIED A */
- [0xa656, 0xa657], /* CYRILLIC SMALL LETTER IOTIFIED A */
- [0xa658, 0xa659], /* CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS */
- [0xa658, 0xa659], /* CYRILLIC SMALL LETTER CLOSED LITTLE YUS */
- [0xa65a, 0xa65b], /* CYRILLIC CAPITAL LETTER BLENDED YUS */
- [0xa65a, 0xa65b], /* CYRILLIC SMALL LETTER BLENDED YUS */
- [0xa65c, 0xa65d], /* CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS */
- [0xa65c, 0xa65d], /* CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS */
- [0xa65e, 0xa65f], /* CYRILLIC CAPITAL LETTER YN */
- [0xa65e, 0xa65f], /* CYRILLIC SMALL LETTER YN */
- [0xa660, 0xa661], /* CYRILLIC CAPITAL LETTER REVERSED TSE */
- [0xa660, 0xa661], /* CYRILLIC SMALL LETTER REVERSED TSE */
- [0xa662, 0xa663], /* CYRILLIC CAPITAL LETTER SOFT DE */
- [0xa662, 0xa663], /* CYRILLIC SMALL LETTER SOFT DE */
- [0xa664, 0xa665], /* CYRILLIC CAPITAL LETTER SOFT EL */
- [0xa664, 0xa665], /* CYRILLIC SMALL LETTER SOFT EL */
- [0xa666, 0xa667], /* CYRILLIC CAPITAL LETTER SOFT EM */
- [0xa666, 0xa667], /* CYRILLIC SMALL LETTER SOFT EM */
- [0xa668, 0xa669], /* CYRILLIC CAPITAL LETTER MONOCULAR O */
- [0xa668, 0xa669], /* CYRILLIC SMALL LETTER MONOCULAR O */
- [0xa66a, 0xa66b], /* CYRILLIC CAPITAL LETTER BINOCULAR O */
- [0xa66a, 0xa66b], /* CYRILLIC SMALL LETTER BINOCULAR O */
- [0xa66c, 0xa66d], /* CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O */
- [0xa66c, 0xa66d], /* CYRILLIC SMALL LETTER DOUBLE MONOCULAR O */
- [0xa66e, 0xa66e], /* CYRILLIC LETTER MULTIOCULAR O */
- [0xa66f, 0xa66f], /* COMBINING CYRILLIC VZMET */
- [0xa670, 0xa670], /* COMBINING CYRILLIC TEN MILLIONS SIGN */
- [0xa671, 0xa671], /* COMBINING CYRILLIC HUNDRED MILLIONS SIGN */
- [0xa672, 0xa672], /* COMBINING CYRILLIC THOUSAND MILLIONS SIGN */
- [0xa673, 0xa673], /* SLAVONIC ASTERISK */
- [0xa674, 0xa674], /* COMBINING CYRILLIC LETTER UKRAINIAN IE */
- [0xa675, 0xa675], /* COMBINING CYRILLIC LETTER I */
- [0xa676, 0xa676], /* COMBINING CYRILLIC LETTER YI */
- [0xa677, 0xa677], /* COMBINING CYRILLIC LETTER U */
- [0xa678, 0xa678], /* COMBINING CYRILLIC LETTER HARD SIGN */
- [0xa679, 0xa679], /* COMBINING CYRILLIC LETTER YERU */
- [0xa67a, 0xa67a], /* COMBINING CYRILLIC LETTER SOFT SIGN */
- [0xa67b, 0xa67b], /* COMBINING CYRILLIC LETTER OMEGA */
- [0xa67c, 0xa67c], /* COMBINING CYRILLIC KAVYKA */
- [0xa67d, 0xa67d], /* COMBINING CYRILLIC PAYEROK */
- [0xa67e, 0xa67e], /* CYRILLIC KAVYKA */
- [0xa67f, 0xa67f], /* CYRILLIC PAYEROK */
- [0xa680, 0xa681], /* CYRILLIC CAPITAL LETTER DWE */
- [0xa680, 0xa681], /* CYRILLIC SMALL LETTER DWE */
- [0xa682, 0xa683], /* CYRILLIC CAPITAL LETTER DZWE */
- [0xa682, 0xa683], /* CYRILLIC SMALL LETTER DZWE */
- [0xa684, 0xa685], /* CYRILLIC CAPITAL LETTER ZHWE */
- [0xa684, 0xa685], /* CYRILLIC SMALL LETTER ZHWE */
- [0xa686, 0xa687], /* CYRILLIC CAPITAL LETTER CCHE */
- [0xa686, 0xa687], /* CYRILLIC SMALL LETTER CCHE */
- [0xa688, 0xa689], /* CYRILLIC CAPITAL LETTER DZZE */
- [0xa688, 0xa689], /* CYRILLIC SMALL LETTER DZZE */
- [0xa68a, 0xa68b], /* CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK */
- [0xa68a, 0xa68b], /* CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK */
- [0xa68c, 0xa68d], /* CYRILLIC CAPITAL LETTER TWE */
- [0xa68c, 0xa68d], /* CYRILLIC SMALL LETTER TWE */
- [0xa68e, 0xa68f], /* CYRILLIC CAPITAL LETTER TSWE */
- [0xa68e, 0xa68f], /* CYRILLIC SMALL LETTER TSWE */
- [0xa690, 0xa691], /* CYRILLIC CAPITAL LETTER TSSE */
- [0xa690, 0xa691], /* CYRILLIC SMALL LETTER TSSE */
- [0xa692, 0xa693], /* CYRILLIC CAPITAL LETTER TCHE */
- [0xa692, 0xa693], /* CYRILLIC SMALL LETTER TCHE */
- [0xa694, 0xa695], /* CYRILLIC CAPITAL LETTER HWE */
- [0xa694, 0xa695], /* CYRILLIC SMALL LETTER HWE */
- [0xa696, 0xa697], /* CYRILLIC CAPITAL LETTER SHWE */
- [0xa696, 0xa697], /* CYRILLIC SMALL LETTER SHWE */
- [0xa698, 0xa699], /* CYRILLIC CAPITAL LETTER DOUBLE O */
- [0xa698, 0xa699], /* CYRILLIC SMALL LETTER DOUBLE O */
- [0xa69a, 0xa69b], /* CYRILLIC CAPITAL LETTER CROSSED O */
- [0xa69a, 0xa69b], /* CYRILLIC SMALL LETTER CROSSED O */
- [0xa69c, 0xa69c], /* MODIFIER LETTER CYRILLIC HARD SIGN */
- [0xa69d, 0xa69d], /* MODIFIER LETTER CYRILLIC SOFT SIGN */
- [0xa69e, 0xa69e], /* COMBINING CYRILLIC LETTER EF */
- [0xa69f, 0xa69f], /* COMBINING CYRILLIC LETTER IOTIFIED E */
- [0xa6a0, 0xa6a0], /* BAMUM LETTER A */
- [0xa6a1, 0xa6a1], /* BAMUM LETTER KA */
- [0xa6a2, 0xa6a2], /* BAMUM LETTER U */
- [0xa6a3, 0xa6a3], /* BAMUM LETTER KU */
- [0xa6a4, 0xa6a4], /* BAMUM LETTER EE */
- [0xa6a5, 0xa6a5], /* BAMUM LETTER REE */
- [0xa6a6, 0xa6a6], /* BAMUM LETTER TAE */
- [0xa6a7, 0xa6a7], /* BAMUM LETTER O */
- [0xa6a8, 0xa6a8], /* BAMUM LETTER NYI */
- [0xa6a9, 0xa6a9], /* BAMUM LETTER I */
- [0xa6aa, 0xa6aa], /* BAMUM LETTER LA */
- [0xa6ab, 0xa6ab], /* BAMUM LETTER PA */
- [0xa6ac, 0xa6ac], /* BAMUM LETTER RII */
- [0xa6ad, 0xa6ad], /* BAMUM LETTER RIEE */
- [0xa6ae, 0xa6ae], /* BAMUM LETTER LEEEE */
- [0xa6af, 0xa6af], /* BAMUM LETTER MEEEE */
- [0xa6b0, 0xa6b0], /* BAMUM LETTER TAA */
- [0xa6b1, 0xa6b1], /* BAMUM LETTER NDAA */
- [0xa6b2, 0xa6b2], /* BAMUM LETTER NJAEM */
- [0xa6b3, 0xa6b3], /* BAMUM LETTER M */
- [0xa6b4, 0xa6b4], /* BAMUM LETTER SUU */
- [0xa6b5, 0xa6b5], /* BAMUM LETTER MU */
- [0xa6b6, 0xa6b6], /* BAMUM LETTER SHII */
- [0xa6b7, 0xa6b7], /* BAMUM LETTER SI */
- [0xa6b8, 0xa6b8], /* BAMUM LETTER SHEUX */
- [0xa6b9, 0xa6b9], /* BAMUM LETTER SEUX */
- [0xa6ba, 0xa6ba], /* BAMUM LETTER KYEE */
- [0xa6bb, 0xa6bb], /* BAMUM LETTER KET */
- [0xa6bc, 0xa6bc], /* BAMUM LETTER NUAE */
- [0xa6bd, 0xa6bd], /* BAMUM LETTER NU */
- [0xa6be, 0xa6be], /* BAMUM LETTER NJUAE */
- [0xa6bf, 0xa6bf], /* BAMUM LETTER YOQ */
- [0xa6c0, 0xa6c0], /* BAMUM LETTER SHU */
- [0xa6c1, 0xa6c1], /* BAMUM LETTER YUQ */
- [0xa6c2, 0xa6c2], /* BAMUM LETTER YA */
- [0xa6c3, 0xa6c3], /* BAMUM LETTER NSHA */
- [0xa6c4, 0xa6c4], /* BAMUM LETTER KEUX */
- [0xa6c5, 0xa6c5], /* BAMUM LETTER PEUX */
- [0xa6c6, 0xa6c6], /* BAMUM LETTER NJEE */
- [0xa6c7, 0xa6c7], /* BAMUM LETTER NTEE */
- [0xa6c8, 0xa6c8], /* BAMUM LETTER PUE */
- [0xa6c9, 0xa6c9], /* BAMUM LETTER WUE */
- [0xa6ca, 0xa6ca], /* BAMUM LETTER PEE */
- [0xa6cb, 0xa6cb], /* BAMUM LETTER FEE */
- [0xa6cc, 0xa6cc], /* BAMUM LETTER RU */
- [0xa6cd, 0xa6cd], /* BAMUM LETTER LU */
- [0xa6ce, 0xa6ce], /* BAMUM LETTER MI */
- [0xa6cf, 0xa6cf], /* BAMUM LETTER NI */
- [0xa6d0, 0xa6d0], /* BAMUM LETTER REUX */
- [0xa6d1, 0xa6d1], /* BAMUM LETTER RAE */
- [0xa6d2, 0xa6d2], /* BAMUM LETTER KEN */
- [0xa6d3, 0xa6d3], /* BAMUM LETTER NGKWAEN */
- [0xa6d4, 0xa6d4], /* BAMUM LETTER NGGA */
- [0xa6d5, 0xa6d5], /* BAMUM LETTER NGA */
- [0xa6d6, 0xa6d6], /* BAMUM LETTER SHO */
- [0xa6d7, 0xa6d7], /* BAMUM LETTER PUAE */
- [0xa6d8, 0xa6d8], /* BAMUM LETTER FU */
- [0xa6d9, 0xa6d9], /* BAMUM LETTER FOM */
- [0xa6da, 0xa6da], /* BAMUM LETTER WA */
- [0xa6db, 0xa6db], /* BAMUM LETTER NA */
- [0xa6dc, 0xa6dc], /* BAMUM LETTER LI */
- [0xa6dd, 0xa6dd], /* BAMUM LETTER PI */
- [0xa6de, 0xa6de], /* BAMUM LETTER LOQ */
- [0xa6df, 0xa6df], /* BAMUM LETTER KO */
- [0xa6e0, 0xa6e0], /* BAMUM LETTER MBEN */
- [0xa6e1, 0xa6e1], /* BAMUM LETTER REN */
- [0xa6e2, 0xa6e2], /* BAMUM LETTER MEN */
- [0xa6e3, 0xa6e3], /* BAMUM LETTER MA */
- [0xa6e4, 0xa6e4], /* BAMUM LETTER TI */
- [0xa6e5, 0xa6e5], /* BAMUM LETTER KI */
- [0xa6e6, 0xa6e6], /* BAMUM LETTER MO */
- [0xa6e7, 0xa6e7], /* BAMUM LETTER MBAA */
- [0xa6e8, 0xa6e8], /* BAMUM LETTER TET */
- [0xa6e9, 0xa6e9], /* BAMUM LETTER KPA */
- [0xa6ea, 0xa6ea], /* BAMUM LETTER TEN */
- [0xa6eb, 0xa6eb], /* BAMUM LETTER NTUU */
- [0xa6ec, 0xa6ec], /* BAMUM LETTER SAMBA */
- [0xa6ed, 0xa6ed], /* BAMUM LETTER FAAMAE */
- [0xa6ee, 0xa6ee], /* BAMUM LETTER KOVUU */
- [0xa6ef, 0xa6ef], /* BAMUM LETTER KOGHOM */
- [0xa6f0, 0xa6f0], /* BAMUM COMBINING MARK KOQNDON */
- [0xa6f1, 0xa6f1], /* BAMUM COMBINING MARK TUKWENTIS */
- [0xa6f2, 0xa6f2], /* BAMUM NJAEMLI */
- [0xa6f3, 0xa6f3], /* BAMUM FULL STOP */
- [0xa6f4, 0xa6f4], /* BAMUM COLON */
- [0xa6f5, 0xa6f5], /* BAMUM COMMA */
- [0xa6f6, 0xa6f6], /* BAMUM SEMICOLON */
- [0xa6f7, 0xa6f7], /* BAMUM QUESTION MARK */
- [0xa6f8, 0xa6f8],
- [0xa6f9, 0xa6f9],
- [0xa6fa, 0xa6fa],
- [0xa6fb, 0xa6fb],
- [0xa6fc, 0xa6fc],
- [0xa6fd, 0xa6fd],
- [0xa6fe, 0xa6fe],
- [0xa6ff, 0xa6ff],
- [0xa700, 0xa700], /* MODIFIER LETTER CHINESE TONE YIN PING */
- [0xa701, 0xa701], /* MODIFIER LETTER CHINESE TONE YANG PING */
- [0xa702, 0xa702], /* MODIFIER LETTER CHINESE TONE YIN SHANG */
- [0xa703, 0xa703], /* MODIFIER LETTER CHINESE TONE YANG SHANG */
- [0xa704, 0xa704], /* MODIFIER LETTER CHINESE TONE YIN QU */
- [0xa705, 0xa705], /* MODIFIER LETTER CHINESE TONE YANG QU */
- [0xa706, 0xa706], /* MODIFIER LETTER CHINESE TONE YIN RU */
- [0xa707, 0xa707], /* MODIFIER LETTER CHINESE TONE YANG RU */
- [0xa708, 0xa708], /* MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR */
- [0xa709, 0xa709], /* MODIFIER LETTER HIGH DOTTED TONE BAR */
- [0xa70a, 0xa70a], /* MODIFIER LETTER MID DOTTED TONE BAR */
- [0xa70b, 0xa70b], /* MODIFIER LETTER LOW DOTTED TONE BAR */
- [0xa70c, 0xa70c], /* MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR */
- [0xa70d, 0xa70d], /* MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR */
- [0xa70e, 0xa70e], /* MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR */
- [0xa70f, 0xa70f], /* MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR */
- [0xa710, 0xa710], /* MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR */
- [0xa711, 0xa711], /* MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR */
- [0xa712, 0xa712], /* MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR */
- [0xa713, 0xa713], /* MODIFIER LETTER HIGH LEFT-STEM TONE BAR */
- [0xa714, 0xa714], /* MODIFIER LETTER MID LEFT-STEM TONE BAR */
- [0xa715, 0xa715], /* MODIFIER LETTER LOW LEFT-STEM TONE BAR */
- [0xa716, 0xa716], /* MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR */
- [0xa717, 0xa717], /* MODIFIER LETTER DOT VERTICAL BAR */
- [0xa718, 0xa718], /* MODIFIER LETTER DOT SLASH */
- [0xa719, 0xa719], /* MODIFIER LETTER DOT HORIZONTAL BAR */
- [0xa71a, 0xa71a], /* MODIFIER LETTER LOWER RIGHT CORNER ANGLE */
- [0xa71b, 0xa71b], /* MODIFIER LETTER RAISED UP ARROW */
- [0xa71c, 0xa71c], /* MODIFIER LETTER RAISED DOWN ARROW */
- [0xa71d, 0xa71d], /* MODIFIER LETTER RAISED EXCLAMATION MARK */
- [0xa71e, 0xa71e], /* MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK */
- [0xa71f, 0xa71f], /* MODIFIER LETTER LOW INVERTED EXCLAMATION MARK */
- [0xa720, 0xa720], /* MODIFIER LETTER STRESS AND HIGH TONE */
- [0xa721, 0xa721], /* MODIFIER LETTER STRESS AND LOW TONE */
- [0xa722, 0xa723], /* LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF */
- [0xa722, 0xa723], /* LATIN SMALL LETTER EGYPTOLOGICAL ALEF */
- [0xa724, 0xa725], /* LATIN CAPITAL LETTER EGYPTOLOGICAL AIN */
- [0xa724, 0xa725], /* LATIN SMALL LETTER EGYPTOLOGICAL AIN */
- [0xa726, 0xa727], /* LATIN CAPITAL LETTER HENG */
- [0xa726, 0xa727], /* LATIN SMALL LETTER HENG */
- [0xa728, 0xa729], /* LATIN CAPITAL LETTER TZ */
- [0xa728, 0xa729], /* LATIN SMALL LETTER TZ */
- [0xa72a, 0xa72b], /* LATIN CAPITAL LETTER TRESILLO */
- [0xa72a, 0xa72b], /* LATIN SMALL LETTER TRESILLO */
- [0xa72c, 0xa72d], /* LATIN CAPITAL LETTER CUATRILLO */
- [0xa72c, 0xa72d], /* LATIN SMALL LETTER CUATRILLO */
- [0xa72e, 0xa72f], /* LATIN CAPITAL LETTER CUATRILLO WITH COMMA */
- [0xa72e, 0xa72f], /* LATIN SMALL LETTER CUATRILLO WITH COMMA */
- [0xa730, 0xa730], /* LATIN LETTER SMALL CAPITAL F */
- [0xa731, 0xa731], /* LATIN LETTER SMALL CAPITAL S */
- [0xa732, 0xa733], /* LATIN CAPITAL LETTER AA */
- [0xa732, 0xa733], /* LATIN SMALL LETTER AA */
- [0xa734, 0xa735], /* LATIN CAPITAL LETTER AO */
- [0xa734, 0xa735], /* LATIN SMALL LETTER AO */
- [0xa736, 0xa737], /* LATIN CAPITAL LETTER AU */
- [0xa736, 0xa737], /* LATIN SMALL LETTER AU */
- [0xa738, 0xa739], /* LATIN CAPITAL LETTER AV */
- [0xa738, 0xa739], /* LATIN SMALL LETTER AV */
- [0xa73a, 0xa73b], /* LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR */
- [0xa73a, 0xa73b], /* LATIN SMALL LETTER AV WITH HORIZONTAL BAR */
- [0xa73c, 0xa73d], /* LATIN CAPITAL LETTER AY */
- [0xa73c, 0xa73d], /* LATIN SMALL LETTER AY */
- [0xa73e, 0xa73f], /* LATIN CAPITAL LETTER REVERSED C WITH DOT */
- [0xa73e, 0xa73f], /* LATIN SMALL LETTER REVERSED C WITH DOT */
- [0xa740, 0xa741], /* LATIN CAPITAL LETTER K WITH STROKE */
- [0xa740, 0xa741], /* LATIN SMALL LETTER K WITH STROKE */
- [0xa742, 0xa743], /* LATIN CAPITAL LETTER K WITH DIAGONAL STROKE */
- [0xa742, 0xa743], /* LATIN SMALL LETTER K WITH DIAGONAL STROKE */
- [0xa744, 0xa745], /* LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE */
- [0xa744, 0xa745], /* LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE */
- [0xa746, 0xa747], /* LATIN CAPITAL LETTER BROKEN L */
- [0xa746, 0xa747], /* LATIN SMALL LETTER BROKEN L */
- [0xa748, 0xa749], /* LATIN CAPITAL LETTER L WITH HIGH STROKE */
- [0xa748, 0xa749], /* LATIN SMALL LETTER L WITH HIGH STROKE */
- [0xa74a, 0xa74b], /* LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY */
- [0xa74a, 0xa74b], /* LATIN SMALL LETTER O WITH LONG STROKE OVERLAY */
- [0xa74c, 0xa74d], /* LATIN CAPITAL LETTER O WITH LOOP */
- [0xa74c, 0xa74d], /* LATIN SMALL LETTER O WITH LOOP */
- [0xa74e, 0xa74f], /* LATIN CAPITAL LETTER OO */
- [0xa74e, 0xa74f], /* LATIN SMALL LETTER OO */
- [0xa750, 0xa751], /* LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER */
- [0xa750, 0xa751], /* LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER */
- [0xa752, 0xa753], /* LATIN CAPITAL LETTER P WITH FLOURISH */
- [0xa752, 0xa753], /* LATIN SMALL LETTER P WITH FLOURISH */
- [0xa754, 0xa755], /* LATIN CAPITAL LETTER P WITH SQUIRREL TAIL */
- [0xa754, 0xa755], /* LATIN SMALL LETTER P WITH SQUIRREL TAIL */
- [0xa756, 0xa757], /* LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER */
- [0xa756, 0xa757], /* LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER */
- [0xa758, 0xa759], /* LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE */
- [0xa758, 0xa759], /* LATIN SMALL LETTER Q WITH DIAGONAL STROKE */
- [0xa75a, 0xa75b], /* LATIN CAPITAL LETTER R ROTUNDA */
- [0xa75a, 0xa75b], /* LATIN SMALL LETTER R ROTUNDA */
- [0xa75c, 0xa75d], /* LATIN CAPITAL LETTER RUM ROTUNDA */
- [0xa75c, 0xa75d], /* LATIN SMALL LETTER RUM ROTUNDA */
- [0xa75e, 0xa75f], /* LATIN CAPITAL LETTER V WITH DIAGONAL STROKE */
- [0xa75e, 0xa75f], /* LATIN SMALL LETTER V WITH DIAGONAL STROKE */
- [0xa760, 0xa761], /* LATIN CAPITAL LETTER VY */
- [0xa760, 0xa761], /* LATIN SMALL LETTER VY */
- [0xa762, 0xa763], /* LATIN CAPITAL LETTER VISIGOTHIC Z */
- [0xa762, 0xa763], /* LATIN SMALL LETTER VISIGOTHIC Z */
- [0xa764, 0xa765], /* LATIN CAPITAL LETTER THORN WITH STROKE */
- [0xa764, 0xa765], /* LATIN SMALL LETTER THORN WITH STROKE */
- [0xa766, 0xa767], /* LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER */
- [0xa766, 0xa767], /* LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER */
- [0xa768, 0xa769], /* LATIN CAPITAL LETTER VEND */
- [0xa768, 0xa769], /* LATIN SMALL LETTER VEND */
- [0xa76a, 0xa76b], /* LATIN CAPITAL LETTER ET */
- [0xa76a, 0xa76b], /* LATIN SMALL LETTER ET */
- [0xa76c, 0xa76d], /* LATIN CAPITAL LETTER IS */
- [0xa76c, 0xa76d], /* LATIN SMALL LETTER IS */
- [0xa76e, 0xa76f], /* LATIN CAPITAL LETTER CON */
- [0xa76e, 0xa76f], /* LATIN SMALL LETTER CON */
- [0xa770, 0xa770], /* MODIFIER LETTER US */
- [0xa771, 0xa771], /* LATIN SMALL LETTER DUM */
- [0xa772, 0xa772], /* LATIN SMALL LETTER LUM */
- [0xa773, 0xa773], /* LATIN SMALL LETTER MUM */
- [0xa774, 0xa774], /* LATIN SMALL LETTER NUM */
- [0xa775, 0xa775], /* LATIN SMALL LETTER RUM */
- [0xa776, 0xa776], /* LATIN LETTER SMALL CAPITAL RUM */
- [0xa777, 0xa777], /* LATIN SMALL LETTER TUM */
- [0xa778, 0xa778], /* LATIN SMALL LETTER UM */
- [0xa779, 0xa77a], /* LATIN CAPITAL LETTER INSULAR D */
- [0xa779, 0xa77a], /* LATIN SMALL LETTER INSULAR D */
- [0xa77b, 0xa77c], /* LATIN CAPITAL LETTER INSULAR F */
- [0xa77b, 0xa77c], /* LATIN SMALL LETTER INSULAR F */
- [0xa77d, 0x1d79], /* LATIN CAPITAL LETTER INSULAR G */
- [0xa77e, 0xa77f], /* LATIN CAPITAL LETTER TURNED INSULAR G */
- [0xa77e, 0xa77f], /* LATIN SMALL LETTER TURNED INSULAR G */
- [0xa780, 0xa781], /* LATIN CAPITAL LETTER TURNED L */
- [0xa780, 0xa781], /* LATIN SMALL LETTER TURNED L */
- [0xa782, 0xa783], /* LATIN CAPITAL LETTER INSULAR R */
- [0xa782, 0xa783], /* LATIN SMALL LETTER INSULAR R */
- [0xa784, 0xa785], /* LATIN CAPITAL LETTER INSULAR S */
- [0xa784, 0xa785], /* LATIN SMALL LETTER INSULAR S */
- [0xa786, 0xa787], /* LATIN CAPITAL LETTER INSULAR T */
- [0xa786, 0xa787], /* LATIN SMALL LETTER INSULAR T */
- [0xa788, 0xa788], /* MODIFIER LETTER LOW CIRCUMFLEX ACCENT */
- [0xa789, 0xa789], /* MODIFIER LETTER COLON */
- [0xa78a, 0xa78a], /* MODIFIER LETTER SHORT EQUALS SIGN */
- [0xa78b, 0xa78c], /* LATIN CAPITAL LETTER SALTILLO */
- [0xa78b, 0xa78c], /* LATIN SMALL LETTER SALTILLO */
- [0xa78d, 0x265], /* LATIN CAPITAL LETTER TURNED H */
- [0xa78e, 0xa78e], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT */
- [0xa78f, 0xa78f], /* LATIN LETTER SINOLOGICAL DOT */
- [0xa790, 0xa791], /* LATIN CAPITAL LETTER N WITH DESCENDER */
- [0xa790, 0xa791], /* LATIN SMALL LETTER N WITH DESCENDER */
- [0xa792, 0xa793], /* LATIN CAPITAL LETTER C WITH BAR */
- [0xa792, 0xa793], /* LATIN SMALL LETTER C WITH BAR */
- [0xa794, 0xa794], /* LATIN SMALL LETTER C WITH PALATAL HOOK */
- [0xa795, 0xa795], /* LATIN SMALL LETTER H WITH PALATAL HOOK */
- [0xa796, 0xa797], /* LATIN CAPITAL LETTER B WITH FLOURISH */
- [0xa796, 0xa797], /* LATIN SMALL LETTER B WITH FLOURISH */
- [0xa798, 0xa799], /* LATIN CAPITAL LETTER F WITH STROKE */
- [0xa798, 0xa799], /* LATIN SMALL LETTER F WITH STROKE */
- [0xa79a, 0xa79b], /* LATIN CAPITAL LETTER VOLAPUK AE */
- [0xa79a, 0xa79b], /* LATIN SMALL LETTER VOLAPUK AE */
- [0xa79c, 0xa79d], /* LATIN CAPITAL LETTER VOLAPUK OE */
- [0xa79c, 0xa79d], /* LATIN SMALL LETTER VOLAPUK OE */
- [0xa79e, 0xa79f], /* LATIN CAPITAL LETTER VOLAPUK UE */
- [0xa79e, 0xa79f], /* LATIN SMALL LETTER VOLAPUK UE */
- [0xa7a0, 0xa7a1], /* LATIN CAPITAL LETTER G WITH OBLIQUE STROKE */
- [0xa7a0, 0xa7a1], /* LATIN SMALL LETTER G WITH OBLIQUE STROKE */
- [0xa7a2, 0xa7a3], /* LATIN CAPITAL LETTER K WITH OBLIQUE STROKE */
- [0xa7a2, 0xa7a3], /* LATIN SMALL LETTER K WITH OBLIQUE STROKE */
- [0xa7a4, 0xa7a5], /* LATIN CAPITAL LETTER N WITH OBLIQUE STROKE */
- [0xa7a4, 0xa7a5], /* LATIN SMALL LETTER N WITH OBLIQUE STROKE */
- [0xa7a6, 0xa7a7], /* LATIN CAPITAL LETTER R WITH OBLIQUE STROKE */
- [0xa7a6, 0xa7a7], /* LATIN SMALL LETTER R WITH OBLIQUE STROKE */
- [0xa7a8, 0xa7a9], /* LATIN CAPITAL LETTER S WITH OBLIQUE STROKE */
- [0xa7a8, 0xa7a9], /* LATIN SMALL LETTER S WITH OBLIQUE STROKE */
- [0xa7aa, 0x266], /* LATIN CAPITAL LETTER H WITH HOOK */
- [0xa7ab, 0x25c], /* LATIN CAPITAL LETTER REVERSED OPEN E */
- [0xa7ac, 0x261], /* LATIN CAPITAL LETTER SCRIPT G */
- [0xa7ad, 0x26c], /* LATIN CAPITAL LETTER L WITH BELT */
- [0xa7ae, 0x26a], /* LATIN CAPITAL LETTER SMALL CAPITAL I */
- [0xa7af, 0xa7af], /* LATIN LETTER SMALL CAPITAL Q */
- [0xa7b0, 0x29e], /* LATIN CAPITAL LETTER TURNED K */
- [0xa7b1, 0x287], /* LATIN CAPITAL LETTER TURNED T */
- [0xa7b2, 0x29d], /* LATIN CAPITAL LETTER J WITH CROSSED-TAIL */
- [0xa7b3, 0xab53], /* LATIN CAPITAL LETTER CHI */
- [0xa7b4, 0xa7b5], /* LATIN CAPITAL LETTER BETA */
- [0xa7b4, 0xa7b5], /* LATIN SMALL LETTER BETA */
- [0xa7b6, 0xa7b7], /* LATIN CAPITAL LETTER OMEGA */
- [0xa7b6, 0xa7b7], /* LATIN SMALL LETTER OMEGA */
- [0xa7b8, 0xa7b9], /* LATIN CAPITAL LETTER U WITH STROKE */
- [0xa7b8, 0xa7b9], /* LATIN SMALL LETTER U WITH STROKE */
- [0xa7ba, 0xa7ba],
- [0xa7bb, 0xa7bb],
- [0xa7bc, 0xa7bc],
- [0xa7bd, 0xa7bd],
- [0xa7be, 0xa7be],
- [0xa7bf, 0xa7bf],
- [0xa7c0, 0xa7c0],
- [0xa7c1, 0xa7c1],
- [0xa7c2, 0xa7c2],
- [0xa7c3, 0xa7c3],
- [0xa7c4, 0xa7c4],
- [0xa7c5, 0xa7c5],
- [0xa7c6, 0xa7c6],
- [0xa7c7, 0xa7c7],
- [0xa7c8, 0xa7c8],
- [0xa7c9, 0xa7c9],
- [0xa7ca, 0xa7ca],
- [0xa7cb, 0xa7cb],
- [0xa7cc, 0xa7cc],
- [0xa7cd, 0xa7cd],
- [0xa7ce, 0xa7ce],
- [0xa7cf, 0xa7cf],
- [0xa7d0, 0xa7d0],
- [0xa7d1, 0xa7d1],
- [0xa7d2, 0xa7d2],
- [0xa7d3, 0xa7d3],
- [0xa7d4, 0xa7d4],
- [0xa7d5, 0xa7d5],
- [0xa7d6, 0xa7d6],
- [0xa7d7, 0xa7d7],
- [0xa7d8, 0xa7d8],
- [0xa7d9, 0xa7d9],
- [0xa7da, 0xa7da],
- [0xa7db, 0xa7db],
- [0xa7dc, 0xa7dc],
- [0xa7dd, 0xa7dd],
- [0xa7de, 0xa7de],
- [0xa7df, 0xa7df],
- [0xa7e0, 0xa7e0],
- [0xa7e1, 0xa7e1],
- [0xa7e2, 0xa7e2],
- [0xa7e3, 0xa7e3],
- [0xa7e4, 0xa7e4],
- [0xa7e5, 0xa7e5],
- [0xa7e6, 0xa7e6],
- [0xa7e7, 0xa7e7],
- [0xa7e8, 0xa7e8],
- [0xa7e9, 0xa7e9],
- [0xa7ea, 0xa7ea],
- [0xa7eb, 0xa7eb],
- [0xa7ec, 0xa7ec],
- [0xa7ed, 0xa7ed],
- [0xa7ee, 0xa7ee],
- [0xa7ef, 0xa7ef],
- [0xa7f0, 0xa7f0],
- [0xa7f1, 0xa7f1],
- [0xa7f2, 0xa7f2],
- [0xa7f3, 0xa7f3],
- [0xa7f4, 0xa7f4],
- [0xa7f5, 0xa7f5],
- [0xa7f6, 0xa7f6],
- [0xa7f7, 0xa7f7], /* LATIN EPIGRAPHIC LETTER SIDEWAYS I */
- [0xa7f8, 0xa7f8], /* MODIFIER LETTER CAPITAL H WITH STROKE */
- [0xa7f9, 0xa7f9], /* MODIFIER LETTER SMALL LIGATURE OE */
- [0xa7fa, 0xa7fa], /* LATIN LETTER SMALL CAPITAL TURNED M */
- [0xa7fb, 0xa7fb], /* LATIN EPIGRAPHIC LETTER REVERSED F */
- [0xa7fc, 0xa7fc], /* LATIN EPIGRAPHIC LETTER REVERSED P */
- [0xa7fd, 0xa7fd], /* LATIN EPIGRAPHIC LETTER INVERTED M */
- [0xa7fe, 0xa7fe], /* LATIN EPIGRAPHIC LETTER I LONGA */
- [0xa7ff, 0xa7ff], /* LATIN EPIGRAPHIC LETTER ARCHAIC M */
- [0xa800, 0xa800], /* SYLOTI NAGRI LETTER A */
- [0xa801, 0xa801], /* SYLOTI NAGRI LETTER I */
- [0xa802, 0xa802], /* SYLOTI NAGRI SIGN DVISVARA */
- [0xa803, 0xa803], /* SYLOTI NAGRI LETTER U */
- [0xa804, 0xa804], /* SYLOTI NAGRI LETTER E */
- [0xa805, 0xa805], /* SYLOTI NAGRI LETTER O */
- [0xa806, 0xa806], /* SYLOTI NAGRI SIGN HASANTA */
- [0xa807, 0xa807], /* SYLOTI NAGRI LETTER KO */
- [0xa808, 0xa808], /* SYLOTI NAGRI LETTER KHO */
- [0xa809, 0xa809], /* SYLOTI NAGRI LETTER GO */
- [0xa80a, 0xa80a], /* SYLOTI NAGRI LETTER GHO */
- [0xa80b, 0xa80b], /* SYLOTI NAGRI SIGN ANUSVARA */
- [0xa80c, 0xa80c], /* SYLOTI NAGRI LETTER CO */
- [0xa80d, 0xa80d], /* SYLOTI NAGRI LETTER CHO */
- [0xa80e, 0xa80e], /* SYLOTI NAGRI LETTER JO */
- [0xa80f, 0xa80f], /* SYLOTI NAGRI LETTER JHO */
- [0xa810, 0xa810], /* SYLOTI NAGRI LETTER TTO */
- [0xa811, 0xa811], /* SYLOTI NAGRI LETTER TTHO */
- [0xa812, 0xa812], /* SYLOTI NAGRI LETTER DDO */
- [0xa813, 0xa813], /* SYLOTI NAGRI LETTER DDHO */
- [0xa814, 0xa814], /* SYLOTI NAGRI LETTER TO */
- [0xa815, 0xa815], /* SYLOTI NAGRI LETTER THO */
- [0xa816, 0xa816], /* SYLOTI NAGRI LETTER DO */
- [0xa817, 0xa817], /* SYLOTI NAGRI LETTER DHO */
- [0xa818, 0xa818], /* SYLOTI NAGRI LETTER NO */
- [0xa819, 0xa819], /* SYLOTI NAGRI LETTER PO */
- [0xa81a, 0xa81a], /* SYLOTI NAGRI LETTER PHO */
- [0xa81b, 0xa81b], /* SYLOTI NAGRI LETTER BO */
- [0xa81c, 0xa81c], /* SYLOTI NAGRI LETTER BHO */
- [0xa81d, 0xa81d], /* SYLOTI NAGRI LETTER MO */
- [0xa81e, 0xa81e], /* SYLOTI NAGRI LETTER RO */
- [0xa81f, 0xa81f], /* SYLOTI NAGRI LETTER LO */
- [0xa820, 0xa820], /* SYLOTI NAGRI LETTER RRO */
- [0xa821, 0xa821], /* SYLOTI NAGRI LETTER SO */
- [0xa822, 0xa822], /* SYLOTI NAGRI LETTER HO */
- [0xa823, 0xa823], /* SYLOTI NAGRI VOWEL SIGN A */
- [0xa824, 0xa824], /* SYLOTI NAGRI VOWEL SIGN I */
- [0xa825, 0xa825], /* SYLOTI NAGRI VOWEL SIGN U */
- [0xa826, 0xa826], /* SYLOTI NAGRI VOWEL SIGN E */
- [0xa827, 0xa827], /* SYLOTI NAGRI VOWEL SIGN OO */
- [0xa828, 0xa828], /* SYLOTI NAGRI POETRY MARK-1 */
- [0xa829, 0xa829], /* SYLOTI NAGRI POETRY MARK-2 */
- [0xa82a, 0xa82a], /* SYLOTI NAGRI POETRY MARK-3 */
- [0xa82b, 0xa82b], /* SYLOTI NAGRI POETRY MARK-4 */
- [0xa82c, 0xa82c],
- [0xa82d, 0xa82d],
- [0xa82e, 0xa82e],
- [0xa82f, 0xa82f],
- [0xa830, 0xa830], /* NORTH INDIC FRACTION ONE QUARTER */
- [0xa831, 0xa831], /* NORTH INDIC FRACTION ONE HALF */
- [0xa832, 0xa832], /* NORTH INDIC FRACTION THREE QUARTERS */
- [0xa833, 0xa833], /* NORTH INDIC FRACTION ONE SIXTEENTH */
- [0xa834, 0xa834], /* NORTH INDIC FRACTION ONE EIGHTH */
- [0xa835, 0xa835], /* NORTH INDIC FRACTION THREE SIXTEENTHS */
- [0xa836, 0xa836], /* NORTH INDIC QUARTER MARK */
- [0xa837, 0xa837], /* NORTH INDIC PLACEHOLDER MARK */
- [0xa838, 0xa838], /* NORTH INDIC RUPEE MARK */
- [0xa839, 0xa839], /* NORTH INDIC QUANTITY MARK */
- [0xa83a, 0xa83a],
- [0xa83b, 0xa83b],
- [0xa83c, 0xa83c],
- [0xa83d, 0xa83d],
- [0xa83e, 0xa83e],
- [0xa83f, 0xa83f],
- [0xa840, 0xa840], /* PHAGS-PA LETTER KA */
- [0xa841, 0xa841], /* PHAGS-PA LETTER KHA */
- [0xa842, 0xa842], /* PHAGS-PA LETTER GA */
- [0xa843, 0xa843], /* PHAGS-PA LETTER NGA */
- [0xa844, 0xa844], /* PHAGS-PA LETTER CA */
- [0xa845, 0xa845], /* PHAGS-PA LETTER CHA */
- [0xa846, 0xa846], /* PHAGS-PA LETTER JA */
- [0xa847, 0xa847], /* PHAGS-PA LETTER NYA */
- [0xa848, 0xa848], /* PHAGS-PA LETTER TA */
- [0xa849, 0xa849], /* PHAGS-PA LETTER THA */
- [0xa84a, 0xa84a], /* PHAGS-PA LETTER DA */
- [0xa84b, 0xa84b], /* PHAGS-PA LETTER NA */
- [0xa84c, 0xa84c], /* PHAGS-PA LETTER PA */
- [0xa84d, 0xa84d], /* PHAGS-PA LETTER PHA */
- [0xa84e, 0xa84e], /* PHAGS-PA LETTER BA */
- [0xa84f, 0xa84f], /* PHAGS-PA LETTER MA */
- [0xa850, 0xa850], /* PHAGS-PA LETTER TSA */
- [0xa851, 0xa851], /* PHAGS-PA LETTER TSHA */
- [0xa852, 0xa852], /* PHAGS-PA LETTER DZA */
- [0xa853, 0xa853], /* PHAGS-PA LETTER WA */
- [0xa854, 0xa854], /* PHAGS-PA LETTER ZHA */
- [0xa855, 0xa855], /* PHAGS-PA LETTER ZA */
- [0xa856, 0xa856], /* PHAGS-PA LETTER SMALL A */
- [0xa857, 0xa857], /* PHAGS-PA LETTER YA */
- [0xa858, 0xa858], /* PHAGS-PA LETTER RA */
- [0xa859, 0xa859], /* PHAGS-PA LETTER LA */
- [0xa85a, 0xa85a], /* PHAGS-PA LETTER SHA */
- [0xa85b, 0xa85b], /* PHAGS-PA LETTER SA */
- [0xa85c, 0xa85c], /* PHAGS-PA LETTER HA */
- [0xa85d, 0xa85d], /* PHAGS-PA LETTER A */
- [0xa85e, 0xa85e], /* PHAGS-PA LETTER I */
- [0xa85f, 0xa85f], /* PHAGS-PA LETTER U */
- [0xa860, 0xa860], /* PHAGS-PA LETTER E */
- [0xa861, 0xa861], /* PHAGS-PA LETTER O */
- [0xa862, 0xa862], /* PHAGS-PA LETTER QA */
- [0xa863, 0xa863], /* PHAGS-PA LETTER XA */
- [0xa864, 0xa864], /* PHAGS-PA LETTER FA */
- [0xa865, 0xa865], /* PHAGS-PA LETTER GGA */
- [0xa866, 0xa866], /* PHAGS-PA LETTER EE */
- [0xa867, 0xa867], /* PHAGS-PA SUBJOINED LETTER WA */
- [0xa868, 0xa868], /* PHAGS-PA SUBJOINED LETTER YA */
- [0xa869, 0xa869], /* PHAGS-PA LETTER TTA */
- [0xa86a, 0xa86a], /* PHAGS-PA LETTER TTHA */
- [0xa86b, 0xa86b], /* PHAGS-PA LETTER DDA */
- [0xa86c, 0xa86c], /* PHAGS-PA LETTER NNA */
- [0xa86d, 0xa86d], /* PHAGS-PA LETTER ALTERNATE YA */
- [0xa86e, 0xa86e], /* PHAGS-PA LETTER VOICELESS SHA */
- [0xa86f, 0xa86f], /* PHAGS-PA LETTER VOICED HA */
- [0xa870, 0xa870], /* PHAGS-PA LETTER ASPIRATED FA */
- [0xa871, 0xa871], /* PHAGS-PA SUBJOINED LETTER RA */
- [0xa872, 0xa872], /* PHAGS-PA SUPERFIXED LETTER RA */
- [0xa873, 0xa873], /* PHAGS-PA LETTER CANDRABINDU */
- [0xa874, 0xa874], /* PHAGS-PA SINGLE HEAD MARK */
- [0xa875, 0xa875], /* PHAGS-PA DOUBLE HEAD MARK */
- [0xa876, 0xa876], /* PHAGS-PA MARK SHAD */
- [0xa877, 0xa877], /* PHAGS-PA MARK DOUBLE SHAD */
- [0xa878, 0xa878],
- [0xa879, 0xa879],
- [0xa87a, 0xa87a],
- [0xa87b, 0xa87b],
- [0xa87c, 0xa87c],
- [0xa87d, 0xa87d],
- [0xa87e, 0xa87e],
- [0xa87f, 0xa87f],
- [0xa880, 0xa880], /* SAURASHTRA SIGN ANUSVARA */
- [0xa881, 0xa881], /* SAURASHTRA SIGN VISARGA */
- [0xa882, 0xa882], /* SAURASHTRA LETTER A */
- [0xa883, 0xa883], /* SAURASHTRA LETTER AA */
- [0xa884, 0xa884], /* SAURASHTRA LETTER I */
- [0xa885, 0xa885], /* SAURASHTRA LETTER II */
- [0xa886, 0xa886], /* SAURASHTRA LETTER U */
- [0xa887, 0xa887], /* SAURASHTRA LETTER UU */
- [0xa888, 0xa888], /* SAURASHTRA LETTER VOCALIC R */
- [0xa889, 0xa889], /* SAURASHTRA LETTER VOCALIC RR */
- [0xa88a, 0xa88a], /* SAURASHTRA LETTER VOCALIC L */
- [0xa88b, 0xa88b], /* SAURASHTRA LETTER VOCALIC LL */
- [0xa88c, 0xa88c], /* SAURASHTRA LETTER E */
- [0xa88d, 0xa88d], /* SAURASHTRA LETTER EE */
- [0xa88e, 0xa88e], /* SAURASHTRA LETTER AI */
- [0xa88f, 0xa88f], /* SAURASHTRA LETTER O */
- [0xa890, 0xa890], /* SAURASHTRA LETTER OO */
- [0xa891, 0xa891], /* SAURASHTRA LETTER AU */
- [0xa892, 0xa892], /* SAURASHTRA LETTER KA */
- [0xa893, 0xa893], /* SAURASHTRA LETTER KHA */
- [0xa894, 0xa894], /* SAURASHTRA LETTER GA */
- [0xa895, 0xa895], /* SAURASHTRA LETTER GHA */
- [0xa896, 0xa896], /* SAURASHTRA LETTER NGA */
- [0xa897, 0xa897], /* SAURASHTRA LETTER CA */
- [0xa898, 0xa898], /* SAURASHTRA LETTER CHA */
- [0xa899, 0xa899], /* SAURASHTRA LETTER JA */
- [0xa89a, 0xa89a], /* SAURASHTRA LETTER JHA */
- [0xa89b, 0xa89b], /* SAURASHTRA LETTER NYA */
- [0xa89c, 0xa89c], /* SAURASHTRA LETTER TTA */
- [0xa89d, 0xa89d], /* SAURASHTRA LETTER TTHA */
- [0xa89e, 0xa89e], /* SAURASHTRA LETTER DDA */
- [0xa89f, 0xa89f], /* SAURASHTRA LETTER DDHA */
- [0xa8a0, 0xa8a0], /* SAURASHTRA LETTER NNA */
- [0xa8a1, 0xa8a1], /* SAURASHTRA LETTER TA */
- [0xa8a2, 0xa8a2], /* SAURASHTRA LETTER THA */
- [0xa8a3, 0xa8a3], /* SAURASHTRA LETTER DA */
- [0xa8a4, 0xa8a4], /* SAURASHTRA LETTER DHA */
- [0xa8a5, 0xa8a5], /* SAURASHTRA LETTER NA */
- [0xa8a6, 0xa8a6], /* SAURASHTRA LETTER PA */
- [0xa8a7, 0xa8a7], /* SAURASHTRA LETTER PHA */
- [0xa8a8, 0xa8a8], /* SAURASHTRA LETTER BA */
- [0xa8a9, 0xa8a9], /* SAURASHTRA LETTER BHA */
- [0xa8aa, 0xa8aa], /* SAURASHTRA LETTER MA */
- [0xa8ab, 0xa8ab], /* SAURASHTRA LETTER YA */
- [0xa8ac, 0xa8ac], /* SAURASHTRA LETTER RA */
- [0xa8ad, 0xa8ad], /* SAURASHTRA LETTER LA */
- [0xa8ae, 0xa8ae], /* SAURASHTRA LETTER VA */
- [0xa8af, 0xa8af], /* SAURASHTRA LETTER SHA */
- [0xa8b0, 0xa8b0], /* SAURASHTRA LETTER SSA */
- [0xa8b1, 0xa8b1], /* SAURASHTRA LETTER SA */
- [0xa8b2, 0xa8b2], /* SAURASHTRA LETTER HA */
- [0xa8b3, 0xa8b3], /* SAURASHTRA LETTER LLA */
- [0xa8b4, 0xa8b4], /* SAURASHTRA CONSONANT SIGN HAARU */
- [0xa8b5, 0xa8b5], /* SAURASHTRA VOWEL SIGN AA */
- [0xa8b6, 0xa8b6], /* SAURASHTRA VOWEL SIGN I */
- [0xa8b7, 0xa8b7], /* SAURASHTRA VOWEL SIGN II */
- [0xa8b8, 0xa8b8], /* SAURASHTRA VOWEL SIGN U */
- [0xa8b9, 0xa8b9], /* SAURASHTRA VOWEL SIGN UU */
- [0xa8ba, 0xa8ba], /* SAURASHTRA VOWEL SIGN VOCALIC R */
- [0xa8bb, 0xa8bb], /* SAURASHTRA VOWEL SIGN VOCALIC RR */
- [0xa8bc, 0xa8bc], /* SAURASHTRA VOWEL SIGN VOCALIC L */
- [0xa8bd, 0xa8bd], /* SAURASHTRA VOWEL SIGN VOCALIC LL */
- [0xa8be, 0xa8be], /* SAURASHTRA VOWEL SIGN E */
- [0xa8bf, 0xa8bf], /* SAURASHTRA VOWEL SIGN EE */
- [0xa8c0, 0xa8c0], /* SAURASHTRA VOWEL SIGN AI */
- [0xa8c1, 0xa8c1], /* SAURASHTRA VOWEL SIGN O */
- [0xa8c2, 0xa8c2], /* SAURASHTRA VOWEL SIGN OO */
- [0xa8c3, 0xa8c3], /* SAURASHTRA VOWEL SIGN AU */
- [0xa8c4, 0xa8c4], /* SAURASHTRA SIGN VIRAMA */
- [0xa8c5, 0xa8c5], /* SAURASHTRA SIGN CANDRABINDU */
- [0xa8c6, 0xa8c6],
- [0xa8c7, 0xa8c7],
- [0xa8c8, 0xa8c8],
- [0xa8c9, 0xa8c9],
- [0xa8ca, 0xa8ca],
- [0xa8cb, 0xa8cb],
- [0xa8cc, 0xa8cc],
- [0xa8cd, 0xa8cd],
- [0xa8ce, 0xa8ce], /* SAURASHTRA DANDA */
- [0xa8cf, 0xa8cf], /* SAURASHTRA DOUBLE DANDA */
- [0xa8d0, 0xa8d0], /* SAURASHTRA DIGIT ZERO */
- [0xa8d1, 0xa8d1], /* SAURASHTRA DIGIT ONE */
- [0xa8d2, 0xa8d2], /* SAURASHTRA DIGIT TWO */
- [0xa8d3, 0xa8d3], /* SAURASHTRA DIGIT THREE */
- [0xa8d4, 0xa8d4], /* SAURASHTRA DIGIT FOUR */
- [0xa8d5, 0xa8d5], /* SAURASHTRA DIGIT FIVE */
- [0xa8d6, 0xa8d6], /* SAURASHTRA DIGIT SIX */
- [0xa8d7, 0xa8d7], /* SAURASHTRA DIGIT SEVEN */
- [0xa8d8, 0xa8d8], /* SAURASHTRA DIGIT EIGHT */
- [0xa8d9, 0xa8d9], /* SAURASHTRA DIGIT NINE */
- [0xa8da, 0xa8da],
- [0xa8db, 0xa8db],
- [0xa8dc, 0xa8dc],
- [0xa8dd, 0xa8dd],
- [0xa8de, 0xa8de],
- [0xa8df, 0xa8df],
- [0xa8e0, 0xa8e0], /* COMBINING DEVANAGARI DIGIT ZERO */
- [0xa8e1, 0xa8e1], /* COMBINING DEVANAGARI DIGIT ONE */
- [0xa8e2, 0xa8e2], /* COMBINING DEVANAGARI DIGIT TWO */
- [0xa8e3, 0xa8e3], /* COMBINING DEVANAGARI DIGIT THREE */
- [0xa8e4, 0xa8e4], /* COMBINING DEVANAGARI DIGIT FOUR */
- [0xa8e5, 0xa8e5], /* COMBINING DEVANAGARI DIGIT FIVE */
- [0xa8e6, 0xa8e6], /* COMBINING DEVANAGARI DIGIT SIX */
- [0xa8e7, 0xa8e7], /* COMBINING DEVANAGARI DIGIT SEVEN */
- [0xa8e8, 0xa8e8], /* COMBINING DEVANAGARI DIGIT EIGHT */
- [0xa8e9, 0xa8e9], /* COMBINING DEVANAGARI DIGIT NINE */
- [0xa8ea, 0xa8ea], /* COMBINING DEVANAGARI LETTER A */
- [0xa8eb, 0xa8eb], /* COMBINING DEVANAGARI LETTER U */
- [0xa8ec, 0xa8ec], /* COMBINING DEVANAGARI LETTER KA */
- [0xa8ed, 0xa8ed], /* COMBINING DEVANAGARI LETTER NA */
- [0xa8ee, 0xa8ee], /* COMBINING DEVANAGARI LETTER PA */
- [0xa8ef, 0xa8ef], /* COMBINING DEVANAGARI LETTER RA */
- [0xa8f0, 0xa8f0], /* COMBINING DEVANAGARI LETTER VI */
- [0xa8f1, 0xa8f1], /* COMBINING DEVANAGARI SIGN AVAGRAHA */
- [0xa8f2, 0xa8f2], /* DEVANAGARI SIGN SPACING CANDRABINDU */
- [0xa8f3, 0xa8f3], /* DEVANAGARI SIGN CANDRABINDU VIRAMA */
- [0xa8f4, 0xa8f4], /* DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA */
- [0xa8f5, 0xa8f5], /* DEVANAGARI SIGN CANDRABINDU TWO */
- [0xa8f6, 0xa8f6], /* DEVANAGARI SIGN CANDRABINDU THREE */
- [0xa8f7, 0xa8f7], /* DEVANAGARI SIGN CANDRABINDU AVAGRAHA */
- [0xa8f8, 0xa8f8], /* DEVANAGARI SIGN PUSHPIKA */
- [0xa8f9, 0xa8f9], /* DEVANAGARI GAP FILLER */
- [0xa8fa, 0xa8fa], /* DEVANAGARI CARET */
- [0xa8fb, 0xa8fb], /* DEVANAGARI HEADSTROKE */
- [0xa8fc, 0xa8fc], /* DEVANAGARI SIGN SIDDHAM */
- [0xa8fd, 0xa8fd], /* DEVANAGARI JAIN OM */
- [0xa8fe, 0xa8fe], /* DEVANAGARI LETTER AY */
- [0xa8ff, 0xa8ff], /* DEVANAGARI VOWEL SIGN AY */
- [0xa900, 0xa900], /* KAYAH LI DIGIT ZERO */
- [0xa901, 0xa901], /* KAYAH LI DIGIT ONE */
- [0xa902, 0xa902], /* KAYAH LI DIGIT TWO */
- [0xa903, 0xa903], /* KAYAH LI DIGIT THREE */
- [0xa904, 0xa904], /* KAYAH LI DIGIT FOUR */
- [0xa905, 0xa905], /* KAYAH LI DIGIT FIVE */
- [0xa906, 0xa906], /* KAYAH LI DIGIT SIX */
- [0xa907, 0xa907], /* KAYAH LI DIGIT SEVEN */
- [0xa908, 0xa908], /* KAYAH LI DIGIT EIGHT */
- [0xa909, 0xa909], /* KAYAH LI DIGIT NINE */
- [0xa90a, 0xa90a], /* KAYAH LI LETTER KA */
- [0xa90b, 0xa90b], /* KAYAH LI LETTER KHA */
- [0xa90c, 0xa90c], /* KAYAH LI LETTER GA */
- [0xa90d, 0xa90d], /* KAYAH LI LETTER NGA */
- [0xa90e, 0xa90e], /* KAYAH LI LETTER SA */
- [0xa90f, 0xa90f], /* KAYAH LI LETTER SHA */
- [0xa910, 0xa910], /* KAYAH LI LETTER ZA */
- [0xa911, 0xa911], /* KAYAH LI LETTER NYA */
- [0xa912, 0xa912], /* KAYAH LI LETTER TA */
- [0xa913, 0xa913], /* KAYAH LI LETTER HTA */
- [0xa914, 0xa914], /* KAYAH LI LETTER NA */
- [0xa915, 0xa915], /* KAYAH LI LETTER PA */
- [0xa916, 0xa916], /* KAYAH LI LETTER PHA */
- [0xa917, 0xa917], /* KAYAH LI LETTER MA */
- [0xa918, 0xa918], /* KAYAH LI LETTER DA */
- [0xa919, 0xa919], /* KAYAH LI LETTER BA */
- [0xa91a, 0xa91a], /* KAYAH LI LETTER RA */
- [0xa91b, 0xa91b], /* KAYAH LI LETTER YA */
- [0xa91c, 0xa91c], /* KAYAH LI LETTER LA */
- [0xa91d, 0xa91d], /* KAYAH LI LETTER WA */
- [0xa91e, 0xa91e], /* KAYAH LI LETTER THA */
- [0xa91f, 0xa91f], /* KAYAH LI LETTER HA */
- [0xa920, 0xa920], /* KAYAH LI LETTER VA */
- [0xa921, 0xa921], /* KAYAH LI LETTER CA */
- [0xa922, 0xa922], /* KAYAH LI LETTER A */
- [0xa923, 0xa923], /* KAYAH LI LETTER OE */
- [0xa924, 0xa924], /* KAYAH LI LETTER I */
- [0xa925, 0xa925], /* KAYAH LI LETTER OO */
- [0xa926, 0xa926], /* KAYAH LI VOWEL UE */
- [0xa927, 0xa927], /* KAYAH LI VOWEL E */
- [0xa928, 0xa928], /* KAYAH LI VOWEL U */
- [0xa929, 0xa929], /* KAYAH LI VOWEL EE */
- [0xa92a, 0xa92a], /* KAYAH LI VOWEL O */
- [0xa92b, 0xa92b], /* KAYAH LI TONE PLOPHU */
- [0xa92c, 0xa92c], /* KAYAH LI TONE CALYA */
- [0xa92d, 0xa92d], /* KAYAH LI TONE CALYA PLOPHU */
- [0xa92e, 0xa92e], /* KAYAH LI SIGN CWI */
- [0xa92f, 0xa92f], /* KAYAH LI SIGN SHYA */
- [0xa930, 0xa930], /* REJANG LETTER KA */
- [0xa931, 0xa931], /* REJANG LETTER GA */
- [0xa932, 0xa932], /* REJANG LETTER NGA */
- [0xa933, 0xa933], /* REJANG LETTER TA */
- [0xa934, 0xa934], /* REJANG LETTER DA */
- [0xa935, 0xa935], /* REJANG LETTER NA */
- [0xa936, 0xa936], /* REJANG LETTER PA */
- [0xa937, 0xa937], /* REJANG LETTER BA */
- [0xa938, 0xa938], /* REJANG LETTER MA */
- [0xa939, 0xa939], /* REJANG LETTER CA */
- [0xa93a, 0xa93a], /* REJANG LETTER JA */
- [0xa93b, 0xa93b], /* REJANG LETTER NYA */
- [0xa93c, 0xa93c], /* REJANG LETTER SA */
- [0xa93d, 0xa93d], /* REJANG LETTER RA */
- [0xa93e, 0xa93e], /* REJANG LETTER LA */
- [0xa93f, 0xa93f], /* REJANG LETTER YA */
- [0xa940, 0xa940], /* REJANG LETTER WA */
- [0xa941, 0xa941], /* REJANG LETTER HA */
- [0xa942, 0xa942], /* REJANG LETTER MBA */
- [0xa943, 0xa943], /* REJANG LETTER NGGA */
- [0xa944, 0xa944], /* REJANG LETTER NDA */
- [0xa945, 0xa945], /* REJANG LETTER NYJA */
- [0xa946, 0xa946], /* REJANG LETTER A */
- [0xa947, 0xa947], /* REJANG VOWEL SIGN I */
- [0xa948, 0xa948], /* REJANG VOWEL SIGN U */
- [0xa949, 0xa949], /* REJANG VOWEL SIGN E */
- [0xa94a, 0xa94a], /* REJANG VOWEL SIGN AI */
- [0xa94b, 0xa94b], /* REJANG VOWEL SIGN O */
- [0xa94c, 0xa94c], /* REJANG VOWEL SIGN AU */
- [0xa94d, 0xa94d], /* REJANG VOWEL SIGN EU */
- [0xa94e, 0xa94e], /* REJANG VOWEL SIGN EA */
- [0xa94f, 0xa94f], /* REJANG CONSONANT SIGN NG */
- [0xa950, 0xa950], /* REJANG CONSONANT SIGN N */
- [0xa951, 0xa951], /* REJANG CONSONANT SIGN R */
- [0xa952, 0xa952], /* REJANG CONSONANT SIGN H */
- [0xa953, 0xa953], /* REJANG VIRAMA */
- [0xa954, 0xa954],
- [0xa955, 0xa955],
- [0xa956, 0xa956],
- [0xa957, 0xa957],
- [0xa958, 0xa958],
- [0xa959, 0xa959],
- [0xa95a, 0xa95a],
- [0xa95b, 0xa95b],
- [0xa95c, 0xa95c],
- [0xa95d, 0xa95d],
- [0xa95e, 0xa95e],
- [0xa95f, 0xa95f], /* REJANG SECTION MARK */
- [0xa960, 0xa960], /* HANGUL CHOSEONG TIKEUT-MIEUM */
- [0xa961, 0xa961], /* HANGUL CHOSEONG TIKEUT-PIEUP */
- [0xa962, 0xa962], /* HANGUL CHOSEONG TIKEUT-SIOS */
- [0xa963, 0xa963], /* HANGUL CHOSEONG TIKEUT-CIEUC */
- [0xa964, 0xa964], /* HANGUL CHOSEONG RIEUL-KIYEOK */
- [0xa965, 0xa965], /* HANGUL CHOSEONG RIEUL-SSANGKIYEOK */
- [0xa966, 0xa966], /* HANGUL CHOSEONG RIEUL-TIKEUT */
- [0xa967, 0xa967], /* HANGUL CHOSEONG RIEUL-SSANGTIKEUT */
- [0xa968, 0xa968], /* HANGUL CHOSEONG RIEUL-MIEUM */
- [0xa969, 0xa969], /* HANGUL CHOSEONG RIEUL-PIEUP */
- [0xa96a, 0xa96a], /* HANGUL CHOSEONG RIEUL-SSANGPIEUP */
- [0xa96b, 0xa96b], /* HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP */
- [0xa96c, 0xa96c], /* HANGUL CHOSEONG RIEUL-SIOS */
- [0xa96d, 0xa96d], /* HANGUL CHOSEONG RIEUL-CIEUC */
- [0xa96e, 0xa96e], /* HANGUL CHOSEONG RIEUL-KHIEUKH */
- [0xa96f, 0xa96f], /* HANGUL CHOSEONG MIEUM-KIYEOK */
- [0xa970, 0xa970], /* HANGUL CHOSEONG MIEUM-TIKEUT */
- [0xa971, 0xa971], /* HANGUL CHOSEONG MIEUM-SIOS */
- [0xa972, 0xa972], /* HANGUL CHOSEONG PIEUP-SIOS-THIEUTH */
- [0xa973, 0xa973], /* HANGUL CHOSEONG PIEUP-KHIEUKH */
- [0xa974, 0xa974], /* HANGUL CHOSEONG PIEUP-HIEUH */
- [0xa975, 0xa975], /* HANGUL CHOSEONG SSANGSIOS-PIEUP */
- [0xa976, 0xa976], /* HANGUL CHOSEONG IEUNG-RIEUL */
- [0xa977, 0xa977], /* HANGUL CHOSEONG IEUNG-HIEUH */
- [0xa978, 0xa978], /* HANGUL CHOSEONG SSANGCIEUC-HIEUH */
- [0xa979, 0xa979], /* HANGUL CHOSEONG SSANGTHIEUTH */
- [0xa97a, 0xa97a], /* HANGUL CHOSEONG PHIEUPH-HIEUH */
- [0xa97b, 0xa97b], /* HANGUL CHOSEONG HIEUH-SIOS */
- [0xa97c, 0xa97c], /* HANGUL CHOSEONG SSANGYEORINHIEUH */
- [0xa97d, 0xa97d],
- [0xa97e, 0xa97e],
- [0xa97f, 0xa97f],
- [0xa980, 0xa980], /* JAVANESE SIGN PANYANGGA */
- [0xa981, 0xa981], /* JAVANESE SIGN CECAK */
- [0xa982, 0xa982], /* JAVANESE SIGN LAYAR */
- [0xa983, 0xa983], /* JAVANESE SIGN WIGNYAN */
- [0xa984, 0xa984], /* JAVANESE LETTER A */
- [0xa985, 0xa985], /* JAVANESE LETTER I KAWI */
- [0xa986, 0xa986], /* JAVANESE LETTER I */
- [0xa987, 0xa987], /* JAVANESE LETTER II */
- [0xa988, 0xa988], /* JAVANESE LETTER U */
- [0xa989, 0xa989], /* JAVANESE LETTER PA CEREK */
- [0xa98a, 0xa98a], /* JAVANESE LETTER NGA LELET */
- [0xa98b, 0xa98b], /* JAVANESE LETTER NGA LELET RASWADI */
- [0xa98c, 0xa98c], /* JAVANESE LETTER E */
- [0xa98d, 0xa98d], /* JAVANESE LETTER AI */
- [0xa98e, 0xa98e], /* JAVANESE LETTER O */
- [0xa98f, 0xa98f], /* JAVANESE LETTER KA */
- [0xa990, 0xa990], /* JAVANESE LETTER KA SASAK */
- [0xa991, 0xa991], /* JAVANESE LETTER KA MURDA */
- [0xa992, 0xa992], /* JAVANESE LETTER GA */
- [0xa993, 0xa993], /* JAVANESE LETTER GA MURDA */
- [0xa994, 0xa994], /* JAVANESE LETTER NGA */
- [0xa995, 0xa995], /* JAVANESE LETTER CA */
- [0xa996, 0xa996], /* JAVANESE LETTER CA MURDA */
- [0xa997, 0xa997], /* JAVANESE LETTER JA */
- [0xa998, 0xa998], /* JAVANESE LETTER NYA MURDA */
- [0xa999, 0xa999], /* JAVANESE LETTER JA MAHAPRANA */
- [0xa99a, 0xa99a], /* JAVANESE LETTER NYA */
- [0xa99b, 0xa99b], /* JAVANESE LETTER TTA */
- [0xa99c, 0xa99c], /* JAVANESE LETTER TTA MAHAPRANA */
- [0xa99d, 0xa99d], /* JAVANESE LETTER DDA */
- [0xa99e, 0xa99e], /* JAVANESE LETTER DDA MAHAPRANA */
- [0xa99f, 0xa99f], /* JAVANESE LETTER NA MURDA */
- [0xa9a0, 0xa9a0], /* JAVANESE LETTER TA */
- [0xa9a1, 0xa9a1], /* JAVANESE LETTER TA MURDA */
- [0xa9a2, 0xa9a2], /* JAVANESE LETTER DA */
- [0xa9a3, 0xa9a3], /* JAVANESE LETTER DA MAHAPRANA */
- [0xa9a4, 0xa9a4], /* JAVANESE LETTER NA */
- [0xa9a5, 0xa9a5], /* JAVANESE LETTER PA */
- [0xa9a6, 0xa9a6], /* JAVANESE LETTER PA MURDA */
- [0xa9a7, 0xa9a7], /* JAVANESE LETTER BA */
- [0xa9a8, 0xa9a8], /* JAVANESE LETTER BA MURDA */
- [0xa9a9, 0xa9a9], /* JAVANESE LETTER MA */
- [0xa9aa, 0xa9aa], /* JAVANESE LETTER YA */
- [0xa9ab, 0xa9ab], /* JAVANESE LETTER RA */
- [0xa9ac, 0xa9ac], /* JAVANESE LETTER RA AGUNG */
- [0xa9ad, 0xa9ad], /* JAVANESE LETTER LA */
- [0xa9ae, 0xa9ae], /* JAVANESE LETTER WA */
- [0xa9af, 0xa9af], /* JAVANESE LETTER SA MURDA */
- [0xa9b0, 0xa9b0], /* JAVANESE LETTER SA MAHAPRANA */
- [0xa9b1, 0xa9b1], /* JAVANESE LETTER SA */
- [0xa9b2, 0xa9b2], /* JAVANESE LETTER HA */
- [0xa9b3, 0xa9b3], /* JAVANESE SIGN CECAK TELU */
- [0xa9b4, 0xa9b4], /* JAVANESE VOWEL SIGN TARUNG */
- [0xa9b5, 0xa9b5], /* JAVANESE VOWEL SIGN TOLONG */
- [0xa9b6, 0xa9b6], /* JAVANESE VOWEL SIGN WULU */
- [0xa9b7, 0xa9b7], /* JAVANESE VOWEL SIGN WULU MELIK */
- [0xa9b8, 0xa9b8], /* JAVANESE VOWEL SIGN SUKU */
- [0xa9b9, 0xa9b9], /* JAVANESE VOWEL SIGN SUKU MENDUT */
- [0xa9ba, 0xa9ba], /* JAVANESE VOWEL SIGN TALING */
- [0xa9bb, 0xa9bb], /* JAVANESE VOWEL SIGN DIRGA MURE */
- [0xa9bc, 0xa9bc], /* JAVANESE VOWEL SIGN PEPET */
- [0xa9bd, 0xa9bd], /* JAVANESE CONSONANT SIGN KERET */
- [0xa9be, 0xa9be], /* JAVANESE CONSONANT SIGN PENGKAL */
- [0xa9bf, 0xa9bf], /* JAVANESE CONSONANT SIGN CAKRA */
- [0xa9c0, 0xa9c0], /* JAVANESE PANGKON */
- [0xa9c1, 0xa9c1], /* JAVANESE LEFT RERENGGAN */
- [0xa9c2, 0xa9c2], /* JAVANESE RIGHT RERENGGAN */
- [0xa9c3, 0xa9c3], /* JAVANESE PADA ANDAP */
- [0xa9c4, 0xa9c4], /* JAVANESE PADA MADYA */
- [0xa9c5, 0xa9c5], /* JAVANESE PADA LUHUR */
- [0xa9c6, 0xa9c6], /* JAVANESE PADA WINDU */
- [0xa9c7, 0xa9c7], /* JAVANESE PADA PANGKAT */
- [0xa9c8, 0xa9c8], /* JAVANESE PADA LINGSA */
- [0xa9c9, 0xa9c9], /* JAVANESE PADA LUNGSI */
- [0xa9ca, 0xa9ca], /* JAVANESE PADA ADEG */
- [0xa9cb, 0xa9cb], /* JAVANESE PADA ADEG ADEG */
- [0xa9cc, 0xa9cc], /* JAVANESE PADA PISELEH */
- [0xa9cd, 0xa9cd], /* JAVANESE TURNED PADA PISELEH */
- [0xa9ce, 0xa9ce],
- [0xa9cf, 0xa9cf], /* JAVANESE PANGRANGKEP */
- [0xa9d0, 0xa9d0], /* JAVANESE DIGIT ZERO */
- [0xa9d1, 0xa9d1], /* JAVANESE DIGIT ONE */
- [0xa9d2, 0xa9d2], /* JAVANESE DIGIT TWO */
- [0xa9d3, 0xa9d3], /* JAVANESE DIGIT THREE */
- [0xa9d4, 0xa9d4], /* JAVANESE DIGIT FOUR */
- [0xa9d5, 0xa9d5], /* JAVANESE DIGIT FIVE */
- [0xa9d6, 0xa9d6], /* JAVANESE DIGIT SIX */
- [0xa9d7, 0xa9d7], /* JAVANESE DIGIT SEVEN */
- [0xa9d8, 0xa9d8], /* JAVANESE DIGIT EIGHT */
- [0xa9d9, 0xa9d9], /* JAVANESE DIGIT NINE */
- [0xa9da, 0xa9da],
- [0xa9db, 0xa9db],
- [0xa9dc, 0xa9dc],
- [0xa9dd, 0xa9dd],
- [0xa9de, 0xa9de], /* JAVANESE PADA TIRTA TUMETES */
- [0xa9df, 0xa9df], /* JAVANESE PADA ISEN-ISEN */
- [0xa9e0, 0xa9e0], /* MYANMAR LETTER SHAN GHA */
- [0xa9e1, 0xa9e1], /* MYANMAR LETTER SHAN CHA */
- [0xa9e2, 0xa9e2], /* MYANMAR LETTER SHAN JHA */
- [0xa9e3, 0xa9e3], /* MYANMAR LETTER SHAN NNA */
- [0xa9e4, 0xa9e4], /* MYANMAR LETTER SHAN BHA */
- [0xa9e5, 0xa9e5], /* MYANMAR SIGN SHAN SAW */
- [0xa9e6, 0xa9e6], /* MYANMAR MODIFIER LETTER SHAN REDUPLICATION */
- [0xa9e7, 0xa9e7], /* MYANMAR LETTER TAI LAING NYA */
- [0xa9e8, 0xa9e8], /* MYANMAR LETTER TAI LAING FA */
- [0xa9e9, 0xa9e9], /* MYANMAR LETTER TAI LAING GA */
- [0xa9ea, 0xa9ea], /* MYANMAR LETTER TAI LAING GHA */
- [0xa9eb, 0xa9eb], /* MYANMAR LETTER TAI LAING JA */
- [0xa9ec, 0xa9ec], /* MYANMAR LETTER TAI LAING JHA */
- [0xa9ed, 0xa9ed], /* MYANMAR LETTER TAI LAING DDA */
- [0xa9ee, 0xa9ee], /* MYANMAR LETTER TAI LAING DDHA */
- [0xa9ef, 0xa9ef], /* MYANMAR LETTER TAI LAING NNA */
- [0xa9f0, 0xa9f0], /* MYANMAR TAI LAING DIGIT ZERO */
- [0xa9f1, 0xa9f1], /* MYANMAR TAI LAING DIGIT ONE */
- [0xa9f2, 0xa9f2], /* MYANMAR TAI LAING DIGIT TWO */
- [0xa9f3, 0xa9f3], /* MYANMAR TAI LAING DIGIT THREE */
- [0xa9f4, 0xa9f4], /* MYANMAR TAI LAING DIGIT FOUR */
- [0xa9f5, 0xa9f5], /* MYANMAR TAI LAING DIGIT FIVE */
- [0xa9f6, 0xa9f6], /* MYANMAR TAI LAING DIGIT SIX */
- [0xa9f7, 0xa9f7], /* MYANMAR TAI LAING DIGIT SEVEN */
- [0xa9f8, 0xa9f8], /* MYANMAR TAI LAING DIGIT EIGHT */
- [0xa9f9, 0xa9f9], /* MYANMAR TAI LAING DIGIT NINE */
- [0xa9fa, 0xa9fa], /* MYANMAR LETTER TAI LAING LLA */
- [0xa9fb, 0xa9fb], /* MYANMAR LETTER TAI LAING DA */
- [0xa9fc, 0xa9fc], /* MYANMAR LETTER TAI LAING DHA */
- [0xa9fd, 0xa9fd], /* MYANMAR LETTER TAI LAING BA */
- [0xa9fe, 0xa9fe], /* MYANMAR LETTER TAI LAING BHA */
- [0xa9ff, 0xa9ff],
- [0xaa00, 0xaa00], /* CHAM LETTER A */
- [0xaa01, 0xaa01], /* CHAM LETTER I */
- [0xaa02, 0xaa02], /* CHAM LETTER U */
- [0xaa03, 0xaa03], /* CHAM LETTER E */
- [0xaa04, 0xaa04], /* CHAM LETTER AI */
- [0xaa05, 0xaa05], /* CHAM LETTER O */
- [0xaa06, 0xaa06], /* CHAM LETTER KA */
- [0xaa07, 0xaa07], /* CHAM LETTER KHA */
- [0xaa08, 0xaa08], /* CHAM LETTER GA */
- [0xaa09, 0xaa09], /* CHAM LETTER GHA */
- [0xaa0a, 0xaa0a], /* CHAM LETTER NGUE */
- [0xaa0b, 0xaa0b], /* CHAM LETTER NGA */
- [0xaa0c, 0xaa0c], /* CHAM LETTER CHA */
- [0xaa0d, 0xaa0d], /* CHAM LETTER CHHA */
- [0xaa0e, 0xaa0e], /* CHAM LETTER JA */
- [0xaa0f, 0xaa0f], /* CHAM LETTER JHA */
- [0xaa10, 0xaa10], /* CHAM LETTER NHUE */
- [0xaa11, 0xaa11], /* CHAM LETTER NHA */
- [0xaa12, 0xaa12], /* CHAM LETTER NHJA */
- [0xaa13, 0xaa13], /* CHAM LETTER TA */
- [0xaa14, 0xaa14], /* CHAM LETTER THA */
- [0xaa15, 0xaa15], /* CHAM LETTER DA */
- [0xaa16, 0xaa16], /* CHAM LETTER DHA */
- [0xaa17, 0xaa17], /* CHAM LETTER NUE */
- [0xaa18, 0xaa18], /* CHAM LETTER NA */
- [0xaa19, 0xaa19], /* CHAM LETTER DDA */
- [0xaa1a, 0xaa1a], /* CHAM LETTER PA */
- [0xaa1b, 0xaa1b], /* CHAM LETTER PPA */
- [0xaa1c, 0xaa1c], /* CHAM LETTER PHA */
- [0xaa1d, 0xaa1d], /* CHAM LETTER BA */
- [0xaa1e, 0xaa1e], /* CHAM LETTER BHA */
- [0xaa1f, 0xaa1f], /* CHAM LETTER MUE */
- [0xaa20, 0xaa20], /* CHAM LETTER MA */
- [0xaa21, 0xaa21], /* CHAM LETTER BBA */
- [0xaa22, 0xaa22], /* CHAM LETTER YA */
- [0xaa23, 0xaa23], /* CHAM LETTER RA */
- [0xaa24, 0xaa24], /* CHAM LETTER LA */
- [0xaa25, 0xaa25], /* CHAM LETTER VA */
- [0xaa26, 0xaa26], /* CHAM LETTER SSA */
- [0xaa27, 0xaa27], /* CHAM LETTER SA */
- [0xaa28, 0xaa28], /* CHAM LETTER HA */
- [0xaa29, 0xaa29], /* CHAM VOWEL SIGN AA */
- [0xaa2a, 0xaa2a], /* CHAM VOWEL SIGN I */
- [0xaa2b, 0xaa2b], /* CHAM VOWEL SIGN II */
- [0xaa2c, 0xaa2c], /* CHAM VOWEL SIGN EI */
- [0xaa2d, 0xaa2d], /* CHAM VOWEL SIGN U */
- [0xaa2e, 0xaa2e], /* CHAM VOWEL SIGN OE */
- [0xaa2f, 0xaa2f], /* CHAM VOWEL SIGN O */
- [0xaa30, 0xaa30], /* CHAM VOWEL SIGN AI */
- [0xaa31, 0xaa31], /* CHAM VOWEL SIGN AU */
- [0xaa32, 0xaa32], /* CHAM VOWEL SIGN UE */
- [0xaa33, 0xaa33], /* CHAM CONSONANT SIGN YA */
- [0xaa34, 0xaa34], /* CHAM CONSONANT SIGN RA */
- [0xaa35, 0xaa35], /* CHAM CONSONANT SIGN LA */
- [0xaa36, 0xaa36], /* CHAM CONSONANT SIGN WA */
- [0xaa37, 0xaa37],
- [0xaa38, 0xaa38],
- [0xaa39, 0xaa39],
- [0xaa3a, 0xaa3a],
- [0xaa3b, 0xaa3b],
- [0xaa3c, 0xaa3c],
- [0xaa3d, 0xaa3d],
- [0xaa3e, 0xaa3e],
- [0xaa3f, 0xaa3f],
- [0xaa40, 0xaa40], /* CHAM LETTER FINAL K */
- [0xaa41, 0xaa41], /* CHAM LETTER FINAL G */
- [0xaa42, 0xaa42], /* CHAM LETTER FINAL NG */
- [0xaa43, 0xaa43], /* CHAM CONSONANT SIGN FINAL NG */
- [0xaa44, 0xaa44], /* CHAM LETTER FINAL CH */
- [0xaa45, 0xaa45], /* CHAM LETTER FINAL T */
- [0xaa46, 0xaa46], /* CHAM LETTER FINAL N */
- [0xaa47, 0xaa47], /* CHAM LETTER FINAL P */
- [0xaa48, 0xaa48], /* CHAM LETTER FINAL Y */
- [0xaa49, 0xaa49], /* CHAM LETTER FINAL R */
- [0xaa4a, 0xaa4a], /* CHAM LETTER FINAL L */
- [0xaa4b, 0xaa4b], /* CHAM LETTER FINAL SS */
- [0xaa4c, 0xaa4c], /* CHAM CONSONANT SIGN FINAL M */
- [0xaa4d, 0xaa4d], /* CHAM CONSONANT SIGN FINAL H */
- [0xaa4e, 0xaa4e],
- [0xaa4f, 0xaa4f],
- [0xaa50, 0xaa50], /* CHAM DIGIT ZERO */
- [0xaa51, 0xaa51], /* CHAM DIGIT ONE */
- [0xaa52, 0xaa52], /* CHAM DIGIT TWO */
- [0xaa53, 0xaa53], /* CHAM DIGIT THREE */
- [0xaa54, 0xaa54], /* CHAM DIGIT FOUR */
- [0xaa55, 0xaa55], /* CHAM DIGIT FIVE */
- [0xaa56, 0xaa56], /* CHAM DIGIT SIX */
- [0xaa57, 0xaa57], /* CHAM DIGIT SEVEN */
- [0xaa58, 0xaa58], /* CHAM DIGIT EIGHT */
- [0xaa59, 0xaa59], /* CHAM DIGIT NINE */
- [0xaa5a, 0xaa5a],
- [0xaa5b, 0xaa5b],
- [0xaa5c, 0xaa5c], /* CHAM PUNCTUATION SPIRAL */
- [0xaa5d, 0xaa5d], /* CHAM PUNCTUATION DANDA */
- [0xaa5e, 0xaa5e], /* CHAM PUNCTUATION DOUBLE DANDA */
- [0xaa5f, 0xaa5f], /* CHAM PUNCTUATION TRIPLE DANDA */
- [0xaa60, 0xaa60], /* MYANMAR LETTER KHAMTI GA */
- [0xaa61, 0xaa61], /* MYANMAR LETTER KHAMTI CA */
- [0xaa62, 0xaa62], /* MYANMAR LETTER KHAMTI CHA */
- [0xaa63, 0xaa63], /* MYANMAR LETTER KHAMTI JA */
- [0xaa64, 0xaa64], /* MYANMAR LETTER KHAMTI JHA */
- [0xaa65, 0xaa65], /* MYANMAR LETTER KHAMTI NYA */
- [0xaa66, 0xaa66], /* MYANMAR LETTER KHAMTI TTA */
- [0xaa67, 0xaa67], /* MYANMAR LETTER KHAMTI TTHA */
- [0xaa68, 0xaa68], /* MYANMAR LETTER KHAMTI DDA */
- [0xaa69, 0xaa69], /* MYANMAR LETTER KHAMTI DDHA */
- [0xaa6a, 0xaa6a], /* MYANMAR LETTER KHAMTI DHA */
- [0xaa6b, 0xaa6b], /* MYANMAR LETTER KHAMTI NA */
- [0xaa6c, 0xaa6c], /* MYANMAR LETTER KHAMTI SA */
- [0xaa6d, 0xaa6d], /* MYANMAR LETTER KHAMTI HA */
- [0xaa6e, 0xaa6e], /* MYANMAR LETTER KHAMTI HHA */
- [0xaa6f, 0xaa6f], /* MYANMAR LETTER KHAMTI FA */
- [0xaa70, 0xaa70], /* MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION */
- [0xaa71, 0xaa71], /* MYANMAR LETTER KHAMTI XA */
- [0xaa72, 0xaa72], /* MYANMAR LETTER KHAMTI ZA */
- [0xaa73, 0xaa73], /* MYANMAR LETTER KHAMTI RA */
- [0xaa74, 0xaa74], /* MYANMAR LOGOGRAM KHAMTI OAY */
- [0xaa75, 0xaa75], /* MYANMAR LOGOGRAM KHAMTI QN */
- [0xaa76, 0xaa76], /* MYANMAR LOGOGRAM KHAMTI HM */
- [0xaa77, 0xaa77], /* MYANMAR SYMBOL AITON EXCLAMATION */
- [0xaa78, 0xaa78], /* MYANMAR SYMBOL AITON ONE */
- [0xaa79, 0xaa79], /* MYANMAR SYMBOL AITON TWO */
- [0xaa7a, 0xaa7a], /* MYANMAR LETTER AITON RA */
- [0xaa7b, 0xaa7b], /* MYANMAR SIGN PAO KAREN TONE */
- [0xaa7c, 0xaa7c], /* MYANMAR SIGN TAI LAING TONE-2 */
- [0xaa7d, 0xaa7d], /* MYANMAR SIGN TAI LAING TONE-5 */
- [0xaa7e, 0xaa7e], /* MYANMAR LETTER SHWE PALAUNG CHA */
- [0xaa7f, 0xaa7f], /* MYANMAR LETTER SHWE PALAUNG SHA */
- [0xaa80, 0xaa80], /* TAI VIET LETTER LOW KO */
- [0xaa81, 0xaa81], /* TAI VIET LETTER HIGH KO */
- [0xaa82, 0xaa82], /* TAI VIET LETTER LOW KHO */
- [0xaa83, 0xaa83], /* TAI VIET LETTER HIGH KHO */
- [0xaa84, 0xaa84], /* TAI VIET LETTER LOW KHHO */
- [0xaa85, 0xaa85], /* TAI VIET LETTER HIGH KHHO */
- [0xaa86, 0xaa86], /* TAI VIET LETTER LOW GO */
- [0xaa87, 0xaa87], /* TAI VIET LETTER HIGH GO */
- [0xaa88, 0xaa88], /* TAI VIET LETTER LOW NGO */
- [0xaa89, 0xaa89], /* TAI VIET LETTER HIGH NGO */
- [0xaa8a, 0xaa8a], /* TAI VIET LETTER LOW CO */
- [0xaa8b, 0xaa8b], /* TAI VIET LETTER HIGH CO */
- [0xaa8c, 0xaa8c], /* TAI VIET LETTER LOW CHO */
- [0xaa8d, 0xaa8d], /* TAI VIET LETTER HIGH CHO */
- [0xaa8e, 0xaa8e], /* TAI VIET LETTER LOW SO */
- [0xaa8f, 0xaa8f], /* TAI VIET LETTER HIGH SO */
- [0xaa90, 0xaa90], /* TAI VIET LETTER LOW NYO */
- [0xaa91, 0xaa91], /* TAI VIET LETTER HIGH NYO */
- [0xaa92, 0xaa92], /* TAI VIET LETTER LOW DO */
- [0xaa93, 0xaa93], /* TAI VIET LETTER HIGH DO */
- [0xaa94, 0xaa94], /* TAI VIET LETTER LOW TO */
- [0xaa95, 0xaa95], /* TAI VIET LETTER HIGH TO */
- [0xaa96, 0xaa96], /* TAI VIET LETTER LOW THO */
- [0xaa97, 0xaa97], /* TAI VIET LETTER HIGH THO */
- [0xaa98, 0xaa98], /* TAI VIET LETTER LOW NO */
- [0xaa99, 0xaa99], /* TAI VIET LETTER HIGH NO */
- [0xaa9a, 0xaa9a], /* TAI VIET LETTER LOW BO */
- [0xaa9b, 0xaa9b], /* TAI VIET LETTER HIGH BO */
- [0xaa9c, 0xaa9c], /* TAI VIET LETTER LOW PO */
- [0xaa9d, 0xaa9d], /* TAI VIET LETTER HIGH PO */
- [0xaa9e, 0xaa9e], /* TAI VIET LETTER LOW PHO */
- [0xaa9f, 0xaa9f], /* TAI VIET LETTER HIGH PHO */
- [0xaaa0, 0xaaa0], /* TAI VIET LETTER LOW FO */
- [0xaaa1, 0xaaa1], /* TAI VIET LETTER HIGH FO */
- [0xaaa2, 0xaaa2], /* TAI VIET LETTER LOW MO */
- [0xaaa3, 0xaaa3], /* TAI VIET LETTER HIGH MO */
- [0xaaa4, 0xaaa4], /* TAI VIET LETTER LOW YO */
- [0xaaa5, 0xaaa5], /* TAI VIET LETTER HIGH YO */
- [0xaaa6, 0xaaa6], /* TAI VIET LETTER LOW RO */
- [0xaaa7, 0xaaa7], /* TAI VIET LETTER HIGH RO */
- [0xaaa8, 0xaaa8], /* TAI VIET LETTER LOW LO */
- [0xaaa9, 0xaaa9], /* TAI VIET LETTER HIGH LO */
- [0xaaaa, 0xaaaa], /* TAI VIET LETTER LOW VO */
- [0xaaab, 0xaaab], /* TAI VIET LETTER HIGH VO */
- [0xaaac, 0xaaac], /* TAI VIET LETTER LOW HO */
- [0xaaad, 0xaaad], /* TAI VIET LETTER HIGH HO */
- [0xaaae, 0xaaae], /* TAI VIET LETTER LOW O */
- [0xaaaf, 0xaaaf], /* TAI VIET LETTER HIGH O */
- [0xaab0, 0xaab0], /* TAI VIET MAI KANG */
- [0xaab1, 0xaab1], /* TAI VIET VOWEL AA */
- [0xaab2, 0xaab2], /* TAI VIET VOWEL I */
- [0xaab3, 0xaab3], /* TAI VIET VOWEL UE */
- [0xaab4, 0xaab4], /* TAI VIET VOWEL U */
- [0xaab5, 0xaab5], /* TAI VIET VOWEL E */
- [0xaab6, 0xaab6], /* TAI VIET VOWEL O */
- [0xaab7, 0xaab7], /* TAI VIET MAI KHIT */
- [0xaab8, 0xaab8], /* TAI VIET VOWEL IA */
- [0xaab9, 0xaab9], /* TAI VIET VOWEL UEA */
- [0xaaba, 0xaaba], /* TAI VIET VOWEL UA */
- [0xaabb, 0xaabb], /* TAI VIET VOWEL AUE */
- [0xaabc, 0xaabc], /* TAI VIET VOWEL AY */
- [0xaabd, 0xaabd], /* TAI VIET VOWEL AN */
- [0xaabe, 0xaabe], /* TAI VIET VOWEL AM */
- [0xaabf, 0xaabf], /* TAI VIET TONE MAI EK */
- [0xaac0, 0xaac0], /* TAI VIET TONE MAI NUENG */
- [0xaac1, 0xaac1], /* TAI VIET TONE MAI THO */
- [0xaac2, 0xaac2], /* TAI VIET TONE MAI SONG */
- [0xaac3, 0xaac3],
- [0xaac4, 0xaac4],
- [0xaac5, 0xaac5],
- [0xaac6, 0xaac6],
- [0xaac7, 0xaac7],
- [0xaac8, 0xaac8],
- [0xaac9, 0xaac9],
- [0xaaca, 0xaaca],
- [0xaacb, 0xaacb],
- [0xaacc, 0xaacc],
- [0xaacd, 0xaacd],
- [0xaace, 0xaace],
- [0xaacf, 0xaacf],
- [0xaad0, 0xaad0],
- [0xaad1, 0xaad1],
- [0xaad2, 0xaad2],
- [0xaad3, 0xaad3],
- [0xaad4, 0xaad4],
- [0xaad5, 0xaad5],
- [0xaad6, 0xaad6],
- [0xaad7, 0xaad7],
- [0xaad8, 0xaad8],
- [0xaad9, 0xaad9],
- [0xaada, 0xaada],
- [0xaadb, 0xaadb], /* TAI VIET SYMBOL KON */
- [0xaadc, 0xaadc], /* TAI VIET SYMBOL NUENG */
- [0xaadd, 0xaadd], /* TAI VIET SYMBOL SAM */
- [0xaade, 0xaade], /* TAI VIET SYMBOL HO HOI */
- [0xaadf, 0xaadf], /* TAI VIET SYMBOL KOI KOI */
- [0xaae0, 0xaae0], /* MEETEI MAYEK LETTER E */
- [0xaae1, 0xaae1], /* MEETEI MAYEK LETTER O */
- [0xaae2, 0xaae2], /* MEETEI MAYEK LETTER CHA */
- [0xaae3, 0xaae3], /* MEETEI MAYEK LETTER NYA */
- [0xaae4, 0xaae4], /* MEETEI MAYEK LETTER TTA */
- [0xaae5, 0xaae5], /* MEETEI MAYEK LETTER TTHA */
- [0xaae6, 0xaae6], /* MEETEI MAYEK LETTER DDA */
- [0xaae7, 0xaae7], /* MEETEI MAYEK LETTER DDHA */
- [0xaae8, 0xaae8], /* MEETEI MAYEK LETTER NNA */
- [0xaae9, 0xaae9], /* MEETEI MAYEK LETTER SHA */
- [0xaaea, 0xaaea], /* MEETEI MAYEK LETTER SSA */
- [0xaaeb, 0xaaeb], /* MEETEI MAYEK VOWEL SIGN II */
- [0xaaec, 0xaaec], /* MEETEI MAYEK VOWEL SIGN UU */
- [0xaaed, 0xaaed], /* MEETEI MAYEK VOWEL SIGN AAI */
- [0xaaee, 0xaaee], /* MEETEI MAYEK VOWEL SIGN AU */
- [0xaaef, 0xaaef], /* MEETEI MAYEK VOWEL SIGN AAU */
- [0xaaf0, 0xaaf0], /* MEETEI MAYEK CHEIKHAN */
- [0xaaf1, 0xaaf1], /* MEETEI MAYEK AHANG KHUDAM */
- [0xaaf2, 0xaaf2], /* MEETEI MAYEK ANJI */
- [0xaaf3, 0xaaf3], /* MEETEI MAYEK SYLLABLE REPETITION MARK */
- [0xaaf4, 0xaaf4], /* MEETEI MAYEK WORD REPETITION MARK */
- [0xaaf5, 0xaaf5], /* MEETEI MAYEK VOWEL SIGN VISARGA */
- [0xaaf6, 0xaaf6], /* MEETEI MAYEK VIRAMA */
- [0xaaf7, 0xaaf7],
- [0xaaf8, 0xaaf8],
- [0xaaf9, 0xaaf9],
- [0xaafa, 0xaafa],
- [0xaafb, 0xaafb],
- [0xaafc, 0xaafc],
- [0xaafd, 0xaafd],
- [0xaafe, 0xaafe],
- [0xaaff, 0xaaff],
- [0xab00, 0xab00],
- [0xab01, 0xab01], /* ETHIOPIC SYLLABLE TTHU */
- [0xab02, 0xab02], /* ETHIOPIC SYLLABLE TTHI */
- [0xab03, 0xab03], /* ETHIOPIC SYLLABLE TTHAA */
- [0xab04, 0xab04], /* ETHIOPIC SYLLABLE TTHEE */
- [0xab05, 0xab05], /* ETHIOPIC SYLLABLE TTHE */
- [0xab06, 0xab06], /* ETHIOPIC SYLLABLE TTHO */
- [0xab07, 0xab07],
- [0xab08, 0xab08],
- [0xab09, 0xab09], /* ETHIOPIC SYLLABLE DDHU */
- [0xab0a, 0xab0a], /* ETHIOPIC SYLLABLE DDHI */
- [0xab0b, 0xab0b], /* ETHIOPIC SYLLABLE DDHAA */
- [0xab0c, 0xab0c], /* ETHIOPIC SYLLABLE DDHEE */
- [0xab0d, 0xab0d], /* ETHIOPIC SYLLABLE DDHE */
- [0xab0e, 0xab0e], /* ETHIOPIC SYLLABLE DDHO */
- [0xab0f, 0xab0f],
- [0xab10, 0xab10],
- [0xab11, 0xab11], /* ETHIOPIC SYLLABLE DZU */
- [0xab12, 0xab12], /* ETHIOPIC SYLLABLE DZI */
- [0xab13, 0xab13], /* ETHIOPIC SYLLABLE DZAA */
- [0xab14, 0xab14], /* ETHIOPIC SYLLABLE DZEE */
- [0xab15, 0xab15], /* ETHIOPIC SYLLABLE DZE */
- [0xab16, 0xab16], /* ETHIOPIC SYLLABLE DZO */
- [0xab17, 0xab17],
- [0xab18, 0xab18],
- [0xab19, 0xab19],
- [0xab1a, 0xab1a],
- [0xab1b, 0xab1b],
- [0xab1c, 0xab1c],
- [0xab1d, 0xab1d],
- [0xab1e, 0xab1e],
- [0xab1f, 0xab1f],
- [0xab20, 0xab20], /* ETHIOPIC SYLLABLE CCHHA */
- [0xab21, 0xab21], /* ETHIOPIC SYLLABLE CCHHU */
- [0xab22, 0xab22], /* ETHIOPIC SYLLABLE CCHHI */
- [0xab23, 0xab23], /* ETHIOPIC SYLLABLE CCHHAA */
- [0xab24, 0xab24], /* ETHIOPIC SYLLABLE CCHHEE */
- [0xab25, 0xab25], /* ETHIOPIC SYLLABLE CCHHE */
- [0xab26, 0xab26], /* ETHIOPIC SYLLABLE CCHHO */
- [0xab27, 0xab27],
- [0xab28, 0xab28], /* ETHIOPIC SYLLABLE BBA */
- [0xab29, 0xab29], /* ETHIOPIC SYLLABLE BBU */
- [0xab2a, 0xab2a], /* ETHIOPIC SYLLABLE BBI */
- [0xab2b, 0xab2b], /* ETHIOPIC SYLLABLE BBAA */
- [0xab2c, 0xab2c], /* ETHIOPIC SYLLABLE BBEE */
- [0xab2d, 0xab2d], /* ETHIOPIC SYLLABLE BBE */
- [0xab2e, 0xab2e], /* ETHIOPIC SYLLABLE BBO */
- [0xab2f, 0xab2f],
- [0xab30, 0xab30], /* LATIN SMALL LETTER BARRED ALPHA */
- [0xab31, 0xab31], /* LATIN SMALL LETTER A REVERSED-SCHWA */
- [0xab32, 0xab32], /* LATIN SMALL LETTER BLACKLETTER E */
- [0xab33, 0xab33], /* LATIN SMALL LETTER BARRED E */
- [0xab34, 0xab34], /* LATIN SMALL LETTER E WITH FLOURISH */
- [0xab35, 0xab35], /* LATIN SMALL LETTER LENIS F */
- [0xab36, 0xab36], /* LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL */
- [0xab37, 0xab37], /* LATIN SMALL LETTER L WITH INVERTED LAZY S */
- [0xab38, 0xab38], /* LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */
- [0xab39, 0xab39], /* LATIN SMALL LETTER L WITH MIDDLE RING */
- [0xab3a, 0xab3a], /* LATIN SMALL LETTER M WITH CROSSED-TAIL */
- [0xab3b, 0xab3b], /* LATIN SMALL LETTER N WITH CROSSED-TAIL */
- [0xab3c, 0xab3c], /* LATIN SMALL LETTER ENG WITH CROSSED-TAIL */
- [0xab3d, 0xab3d], /* LATIN SMALL LETTER BLACKLETTER O */
- [0xab3e, 0xab3e], /* LATIN SMALL LETTER BLACKLETTER O WITH STROKE */
- [0xab3f, 0xab3f], /* LATIN SMALL LETTER OPEN O WITH STROKE */
- [0xab40, 0xab40], /* LATIN SMALL LETTER INVERTED OE */
- [0xab41, 0xab41], /* LATIN SMALL LETTER TURNED OE WITH STROKE */
- [0xab42, 0xab42], /* LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE */
- [0xab43, 0xab43], /* LATIN SMALL LETTER TURNED O OPEN-O */
- [0xab44, 0xab44], /* LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE */
- [0xab45, 0xab45], /* LATIN SMALL LETTER STIRRUP R */
- [0xab46, 0xab46], /* LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG */
- [0xab47, 0xab47], /* LATIN SMALL LETTER R WITHOUT HANDLE */
- [0xab48, 0xab48], /* LATIN SMALL LETTER DOUBLE R */
- [0xab49, 0xab49], /* LATIN SMALL LETTER R WITH CROSSED-TAIL */
- [0xab4a, 0xab4a], /* LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL */
- [0xab4b, 0xab4b], /* LATIN SMALL LETTER SCRIPT R */
- [0xab4c, 0xab4c], /* LATIN SMALL LETTER SCRIPT R WITH RING */
- [0xab4d, 0xab4d], /* LATIN SMALL LETTER BASELINE ESH */
- [0xab4e, 0xab4e], /* LATIN SMALL LETTER U WITH SHORT RIGHT LEG */
- [0xab4f, 0xab4f], /* LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG */
- [0xab50, 0xab50], /* LATIN SMALL LETTER UI */
- [0xab51, 0xab51], /* LATIN SMALL LETTER TURNED UI */
- [0xab52, 0xab52], /* LATIN SMALL LETTER U WITH LEFT HOOK */
- [0xa7b3, 0xab53], /* LATIN SMALL LETTER CHI */
- [0xab54, 0xab54], /* LATIN SMALL LETTER CHI WITH LOW RIGHT RING */
- [0xab55, 0xab55], /* LATIN SMALL LETTER CHI WITH LOW LEFT SERIF */
- [0xab56, 0xab56], /* LATIN SMALL LETTER X WITH LOW RIGHT RING */
- [0xab57, 0xab57], /* LATIN SMALL LETTER X WITH LONG LEFT LEG */
- [0xab58, 0xab58], /* LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING */
- [0xab59, 0xab59], /* LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF */
- [0xab5a, 0xab5a], /* LATIN SMALL LETTER Y WITH SHORT RIGHT LEG */
- [0xab5b, 0xab5b], /* MODIFIER BREVE WITH INVERTED BREVE */
- [0xab5c, 0xab5c], /* MODIFIER LETTER SMALL HENG */
- [0xab5d, 0xab5d], /* MODIFIER LETTER SMALL L WITH INVERTED LAZY S */
- [0xab5e, 0xab5e], /* MODIFIER LETTER SMALL L WITH MIDDLE TILDE */
- [0xab5f, 0xab5f], /* MODIFIER LETTER SMALL U WITH LEFT HOOK */
- [0xab60, 0xab60], /* LATIN SMALL LETTER SAKHA YAT */
- [0xab61, 0xab61], /* LATIN SMALL LETTER IOTIFIED E */
- [0xab62, 0xab62], /* LATIN SMALL LETTER OPEN OE */
- [0xab63, 0xab63], /* LATIN SMALL LETTER UO */
- [0xab64, 0xab64], /* LATIN SMALL LETTER INVERTED ALPHA */
- [0xab65, 0xab65], /* GREEK LETTER SMALL CAPITAL OMEGA */
- [0xab66, 0xab66],
- [0xab67, 0xab67],
- [0xab68, 0xab68],
- [0xab69, 0xab69],
- [0xab6a, 0xab6a],
- [0xab6b, 0xab6b],
- [0xab6c, 0xab6c],
- [0xab6d, 0xab6d],
- [0xab6e, 0xab6e],
- [0xab6f, 0xab6f],
- [0x13a0, 0xab70], /* CHEROKEE SMALL LETTER A */
- [0x13a1, 0xab71], /* CHEROKEE SMALL LETTER E */
- [0x13a2, 0xab72], /* CHEROKEE SMALL LETTER I */
- [0x13a3, 0xab73], /* CHEROKEE SMALL LETTER O */
- [0x13a4, 0xab74], /* CHEROKEE SMALL LETTER U */
- [0x13a5, 0xab75], /* CHEROKEE SMALL LETTER V */
- [0x13a6, 0xab76], /* CHEROKEE SMALL LETTER GA */
- [0x13a7, 0xab77], /* CHEROKEE SMALL LETTER KA */
- [0x13a8, 0xab78], /* CHEROKEE SMALL LETTER GE */
- [0x13a9, 0xab79], /* CHEROKEE SMALL LETTER GI */
- [0x13aa, 0xab7a], /* CHEROKEE SMALL LETTER GO */
- [0x13ab, 0xab7b], /* CHEROKEE SMALL LETTER GU */
- [0x13ac, 0xab7c], /* CHEROKEE SMALL LETTER GV */
- [0x13ad, 0xab7d], /* CHEROKEE SMALL LETTER HA */
- [0x13ae, 0xab7e], /* CHEROKEE SMALL LETTER HE */
- [0x13af, 0xab7f], /* CHEROKEE SMALL LETTER HI */
- [0x13b0, 0xab80], /* CHEROKEE SMALL LETTER HO */
- [0x13b1, 0xab81], /* CHEROKEE SMALL LETTER HU */
- [0x13b2, 0xab82], /* CHEROKEE SMALL LETTER HV */
- [0x13b3, 0xab83], /* CHEROKEE SMALL LETTER LA */
- [0x13b4, 0xab84], /* CHEROKEE SMALL LETTER LE */
- [0x13b5, 0xab85], /* CHEROKEE SMALL LETTER LI */
- [0x13b6, 0xab86], /* CHEROKEE SMALL LETTER LO */
- [0x13b7, 0xab87], /* CHEROKEE SMALL LETTER LU */
- [0x13b8, 0xab88], /* CHEROKEE SMALL LETTER LV */
- [0x13b9, 0xab89], /* CHEROKEE SMALL LETTER MA */
- [0x13ba, 0xab8a], /* CHEROKEE SMALL LETTER ME */
- [0x13bb, 0xab8b], /* CHEROKEE SMALL LETTER MI */
- [0x13bc, 0xab8c], /* CHEROKEE SMALL LETTER MO */
- [0x13bd, 0xab8d], /* CHEROKEE SMALL LETTER MU */
- [0x13be, 0xab8e], /* CHEROKEE SMALL LETTER NA */
- [0x13bf, 0xab8f], /* CHEROKEE SMALL LETTER HNA */
- [0x13c0, 0xab90], /* CHEROKEE SMALL LETTER NAH */
- [0x13c1, 0xab91], /* CHEROKEE SMALL LETTER NE */
- [0x13c2, 0xab92], /* CHEROKEE SMALL LETTER NI */
- [0x13c3, 0xab93], /* CHEROKEE SMALL LETTER NO */
- [0x13c4, 0xab94], /* CHEROKEE SMALL LETTER NU */
- [0x13c5, 0xab95], /* CHEROKEE SMALL LETTER NV */
- [0x13c6, 0xab96], /* CHEROKEE SMALL LETTER QUA */
- [0x13c7, 0xab97], /* CHEROKEE SMALL LETTER QUE */
- [0x13c8, 0xab98], /* CHEROKEE SMALL LETTER QUI */
- [0x13c9, 0xab99], /* CHEROKEE SMALL LETTER QUO */
- [0x13ca, 0xab9a], /* CHEROKEE SMALL LETTER QUU */
- [0x13cb, 0xab9b], /* CHEROKEE SMALL LETTER QUV */
- [0x13cc, 0xab9c], /* CHEROKEE SMALL LETTER SA */
- [0x13cd, 0xab9d], /* CHEROKEE SMALL LETTER S */
- [0x13ce, 0xab9e], /* CHEROKEE SMALL LETTER SE */
- [0x13cf, 0xab9f], /* CHEROKEE SMALL LETTER SI */
- [0x13d0, 0xaba0], /* CHEROKEE SMALL LETTER SO */
- [0x13d1, 0xaba1], /* CHEROKEE SMALL LETTER SU */
- [0x13d2, 0xaba2], /* CHEROKEE SMALL LETTER SV */
- [0x13d3, 0xaba3], /* CHEROKEE SMALL LETTER DA */
- [0x13d4, 0xaba4], /* CHEROKEE SMALL LETTER TA */
- [0x13d5, 0xaba5], /* CHEROKEE SMALL LETTER DE */
- [0x13d6, 0xaba6], /* CHEROKEE SMALL LETTER TE */
- [0x13d7, 0xaba7], /* CHEROKEE SMALL LETTER DI */
- [0x13d8, 0xaba8], /* CHEROKEE SMALL LETTER TI */
- [0x13d9, 0xaba9], /* CHEROKEE SMALL LETTER DO */
- [0x13da, 0xabaa], /* CHEROKEE SMALL LETTER DU */
- [0x13db, 0xabab], /* CHEROKEE SMALL LETTER DV */
- [0x13dc, 0xabac], /* CHEROKEE SMALL LETTER DLA */
- [0x13dd, 0xabad], /* CHEROKEE SMALL LETTER TLA */
- [0x13de, 0xabae], /* CHEROKEE SMALL LETTER TLE */
- [0x13df, 0xabaf], /* CHEROKEE SMALL LETTER TLI */
- [0x13e0, 0xabb0], /* CHEROKEE SMALL LETTER TLO */
- [0x13e1, 0xabb1], /* CHEROKEE SMALL LETTER TLU */
- [0x13e2, 0xabb2], /* CHEROKEE SMALL LETTER TLV */
- [0x13e3, 0xabb3], /* CHEROKEE SMALL LETTER TSA */
- [0x13e4, 0xabb4], /* CHEROKEE SMALL LETTER TSE */
- [0x13e5, 0xabb5], /* CHEROKEE SMALL LETTER TSI */
- [0x13e6, 0xabb6], /* CHEROKEE SMALL LETTER TSO */
- [0x13e7, 0xabb7], /* CHEROKEE SMALL LETTER TSU */
- [0x13e8, 0xabb8], /* CHEROKEE SMALL LETTER TSV */
- [0x13e9, 0xabb9], /* CHEROKEE SMALL LETTER WA */
- [0x13ea, 0xabba], /* CHEROKEE SMALL LETTER WE */
- [0x13eb, 0xabbb], /* CHEROKEE SMALL LETTER WI */
- [0x13ec, 0xabbc], /* CHEROKEE SMALL LETTER WO */
- [0x13ed, 0xabbd], /* CHEROKEE SMALL LETTER WU */
- [0x13ee, 0xabbe], /* CHEROKEE SMALL LETTER WV */
- [0x13ef, 0xabbf], /* CHEROKEE SMALL LETTER YA */
- [0xabc0, 0xabc0], /* MEETEI MAYEK LETTER KOK */
- [0xabc1, 0xabc1], /* MEETEI MAYEK LETTER SAM */
- [0xabc2, 0xabc2], /* MEETEI MAYEK LETTER LAI */
- [0xabc3, 0xabc3], /* MEETEI MAYEK LETTER MIT */
- [0xabc4, 0xabc4], /* MEETEI MAYEK LETTER PA */
- [0xabc5, 0xabc5], /* MEETEI MAYEK LETTER NA */
- [0xabc6, 0xabc6], /* MEETEI MAYEK LETTER CHIL */
- [0xabc7, 0xabc7], /* MEETEI MAYEK LETTER TIL */
- [0xabc8, 0xabc8], /* MEETEI MAYEK LETTER KHOU */
- [0xabc9, 0xabc9], /* MEETEI MAYEK LETTER NGOU */
- [0xabca, 0xabca], /* MEETEI MAYEK LETTER THOU */
- [0xabcb, 0xabcb], /* MEETEI MAYEK LETTER WAI */
- [0xabcc, 0xabcc], /* MEETEI MAYEK LETTER YANG */
- [0xabcd, 0xabcd], /* MEETEI MAYEK LETTER HUK */
- [0xabce, 0xabce], /* MEETEI MAYEK LETTER UN */
- [0xabcf, 0xabcf], /* MEETEI MAYEK LETTER I */
- [0xabd0, 0xabd0], /* MEETEI MAYEK LETTER PHAM */
- [0xabd1, 0xabd1], /* MEETEI MAYEK LETTER ATIYA */
- [0xabd2, 0xabd2], /* MEETEI MAYEK LETTER GOK */
- [0xabd3, 0xabd3], /* MEETEI MAYEK LETTER JHAM */
- [0xabd4, 0xabd4], /* MEETEI MAYEK LETTER RAI */
- [0xabd5, 0xabd5], /* MEETEI MAYEK LETTER BA */
- [0xabd6, 0xabd6], /* MEETEI MAYEK LETTER JIL */
- [0xabd7, 0xabd7], /* MEETEI MAYEK LETTER DIL */
- [0xabd8, 0xabd8], /* MEETEI MAYEK LETTER GHOU */
- [0xabd9, 0xabd9], /* MEETEI MAYEK LETTER DHOU */
- [0xabda, 0xabda], /* MEETEI MAYEK LETTER BHAM */
- [0xabdb, 0xabdb], /* MEETEI MAYEK LETTER KOK LONSUM */
- [0xabdc, 0xabdc], /* MEETEI MAYEK LETTER LAI LONSUM */
- [0xabdd, 0xabdd], /* MEETEI MAYEK LETTER MIT LONSUM */
- [0xabde, 0xabde], /* MEETEI MAYEK LETTER PA LONSUM */
- [0xabdf, 0xabdf], /* MEETEI MAYEK LETTER NA LONSUM */
- [0xabe0, 0xabe0], /* MEETEI MAYEK LETTER TIL LONSUM */
- [0xabe1, 0xabe1], /* MEETEI MAYEK LETTER NGOU LONSUM */
- [0xabe2, 0xabe2], /* MEETEI MAYEK LETTER I LONSUM */
- [0xabe3, 0xabe3], /* MEETEI MAYEK VOWEL SIGN ONAP */
- [0xabe4, 0xabe4], /* MEETEI MAYEK VOWEL SIGN INAP */
- [0xabe5, 0xabe5], /* MEETEI MAYEK VOWEL SIGN ANAP */
- [0xabe6, 0xabe6], /* MEETEI MAYEK VOWEL SIGN YENAP */
- [0xabe7, 0xabe7], /* MEETEI MAYEK VOWEL SIGN SOUNAP */
- [0xabe8, 0xabe8], /* MEETEI MAYEK VOWEL SIGN UNAP */
- [0xabe9, 0xabe9], /* MEETEI MAYEK VOWEL SIGN CHEINAP */
- [0xabea, 0xabea], /* MEETEI MAYEK VOWEL SIGN NUNG */
- [0xabeb, 0xabeb], /* MEETEI MAYEK CHEIKHEI */
- [0xabec, 0xabec], /* MEETEI MAYEK LUM IYEK */
- [0xabed, 0xabed], /* MEETEI MAYEK APUN IYEK */
- [0xabee, 0xabee],
- [0xabef, 0xabef],
- [0xabf0, 0xabf0], /* MEETEI MAYEK DIGIT ZERO */
- [0xabf1, 0xabf1], /* MEETEI MAYEK DIGIT ONE */
- [0xabf2, 0xabf2], /* MEETEI MAYEK DIGIT TWO */
- [0xabf3, 0xabf3], /* MEETEI MAYEK DIGIT THREE */
- [0xabf4, 0xabf4], /* MEETEI MAYEK DIGIT FOUR */
- [0xabf5, 0xabf5], /* MEETEI MAYEK DIGIT FIVE */
- [0xabf6, 0xabf6], /* MEETEI MAYEK DIGIT SIX */
- [0xabf7, 0xabf7], /* MEETEI MAYEK DIGIT SEVEN */
- [0xabf8, 0xabf8], /* MEETEI MAYEK DIGIT EIGHT */
- [0xabf9, 0xabf9], /* MEETEI MAYEK DIGIT NINE */
- [0xabfa, 0xabfa],
- [0xabfb, 0xabfb],
- [0xabfc, 0xabfc],
- [0xabfd, 0xabfd],
- [0xabfe, 0xabfe],
- [0xabff, 0xabff],
- [0xac00, 0xac00], /* Hangul Syllable */
- [0xac01, 0xac01], /* Hangul Syllable */
- [0xac02, 0xac02], /* Hangul Syllable */
- [0xac03, 0xac03], /* Hangul Syllable */
- [0xac04, 0xac04], /* Hangul Syllable */
- [0xac05, 0xac05], /* Hangul Syllable */
- [0xac06, 0xac06], /* Hangul Syllable */
- [0xac07, 0xac07], /* Hangul Syllable */
- [0xac08, 0xac08], /* Hangul Syllable */
- [0xac09, 0xac09], /* Hangul Syllable */
- [0xac0a, 0xac0a], /* Hangul Syllable */
- [0xac0b, 0xac0b], /* Hangul Syllable */
- [0xac0c, 0xac0c], /* Hangul Syllable */
- [0xac0d, 0xac0d], /* Hangul Syllable */
- [0xac0e, 0xac0e], /* Hangul Syllable */
- [0xac0f, 0xac0f], /* Hangul Syllable */
- [0xac10, 0xac10], /* Hangul Syllable */
- [0xac11, 0xac11], /* Hangul Syllable */
- [0xac12, 0xac12], /* Hangul Syllable */
- [0xac13, 0xac13], /* Hangul Syllable */
- [0xac14, 0xac14], /* Hangul Syllable */
- [0xac15, 0xac15], /* Hangul Syllable */
- [0xac16, 0xac16], /* Hangul Syllable */
- [0xac17, 0xac17], /* Hangul Syllable */
- [0xac18, 0xac18], /* Hangul Syllable */
- [0xac19, 0xac19], /* Hangul Syllable */
- [0xac1a, 0xac1a], /* Hangul Syllable */
- [0xac1b, 0xac1b], /* Hangul Syllable */
- [0xac1c, 0xac1c], /* Hangul Syllable */
- [0xac1d, 0xac1d], /* Hangul Syllable */
- [0xac1e, 0xac1e], /* Hangul Syllable */
- [0xac1f, 0xac1f], /* Hangul Syllable */
- [0xac20, 0xac20], /* Hangul Syllable */
- [0xac21, 0xac21], /* Hangul Syllable */
- [0xac22, 0xac22], /* Hangul Syllable */
- [0xac23, 0xac23], /* Hangul Syllable */
- [0xac24, 0xac24], /* Hangul Syllable */
- [0xac25, 0xac25], /* Hangul Syllable */
- [0xac26, 0xac26], /* Hangul Syllable */
- [0xac27, 0xac27], /* Hangul Syllable */
- [0xac28, 0xac28], /* Hangul Syllable */
- [0xac29, 0xac29], /* Hangul Syllable */
- [0xac2a, 0xac2a], /* Hangul Syllable */
- [0xac2b, 0xac2b], /* Hangul Syllable */
- [0xac2c, 0xac2c], /* Hangul Syllable */
- [0xac2d, 0xac2d], /* Hangul Syllable */
- [0xac2e, 0xac2e], /* Hangul Syllable */
- [0xac2f, 0xac2f], /* Hangul Syllable */
- [0xac30, 0xac30], /* Hangul Syllable */
- [0xac31, 0xac31], /* Hangul Syllable */
- [0xac32, 0xac32], /* Hangul Syllable */
- [0xac33, 0xac33], /* Hangul Syllable */
- [0xac34, 0xac34], /* Hangul Syllable */
- [0xac35, 0xac35], /* Hangul Syllable */
- [0xac36, 0xac36], /* Hangul Syllable */
- [0xac37, 0xac37], /* Hangul Syllable */
- [0xac38, 0xac38], /* Hangul Syllable */
- [0xac39, 0xac39], /* Hangul Syllable */
- [0xac3a, 0xac3a], /* Hangul Syllable */
- [0xac3b, 0xac3b], /* Hangul Syllable */
- [0xac3c, 0xac3c], /* Hangul Syllable */
- [0xac3d, 0xac3d], /* Hangul Syllable */
- [0xac3e, 0xac3e], /* Hangul Syllable */
- [0xac3f, 0xac3f], /* Hangul Syllable */
- [0xac40, 0xac40], /* Hangul Syllable */
- [0xac41, 0xac41], /* Hangul Syllable */
- [0xac42, 0xac42], /* Hangul Syllable */
- [0xac43, 0xac43], /* Hangul Syllable */
- [0xac44, 0xac44], /* Hangul Syllable */
- [0xac45, 0xac45], /* Hangul Syllable */
- [0xac46, 0xac46], /* Hangul Syllable */
- [0xac47, 0xac47], /* Hangul Syllable */
- [0xac48, 0xac48], /* Hangul Syllable */
- [0xac49, 0xac49], /* Hangul Syllable */
- [0xac4a, 0xac4a], /* Hangul Syllable */
- [0xac4b, 0xac4b], /* Hangul Syllable */
- [0xac4c, 0xac4c], /* Hangul Syllable */
- [0xac4d, 0xac4d], /* Hangul Syllable */
- [0xac4e, 0xac4e], /* Hangul Syllable */
- [0xac4f, 0xac4f], /* Hangul Syllable */
- [0xac50, 0xac50], /* Hangul Syllable */
- [0xac51, 0xac51], /* Hangul Syllable */
- [0xac52, 0xac52], /* Hangul Syllable */
- [0xac53, 0xac53], /* Hangul Syllable */
- [0xac54, 0xac54], /* Hangul Syllable */
- [0xac55, 0xac55], /* Hangul Syllable */
- [0xac56, 0xac56], /* Hangul Syllable */
- [0xac57, 0xac57], /* Hangul Syllable */
- [0xac58, 0xac58], /* Hangul Syllable */
- [0xac59, 0xac59], /* Hangul Syllable */
- [0xac5a, 0xac5a], /* Hangul Syllable */
- [0xac5b, 0xac5b], /* Hangul Syllable */
- [0xac5c, 0xac5c], /* Hangul Syllable */
- [0xac5d, 0xac5d], /* Hangul Syllable */
- [0xac5e, 0xac5e], /* Hangul Syllable */
- [0xac5f, 0xac5f], /* Hangul Syllable */
- [0xac60, 0xac60], /* Hangul Syllable */
- [0xac61, 0xac61], /* Hangul Syllable */
- [0xac62, 0xac62], /* Hangul Syllable */
- [0xac63, 0xac63], /* Hangul Syllable */
- [0xac64, 0xac64], /* Hangul Syllable */
- [0xac65, 0xac65], /* Hangul Syllable */
- [0xac66, 0xac66], /* Hangul Syllable */
- [0xac67, 0xac67], /* Hangul Syllable */
- [0xac68, 0xac68], /* Hangul Syllable */
- [0xac69, 0xac69], /* Hangul Syllable */
- [0xac6a, 0xac6a], /* Hangul Syllable */
- [0xac6b, 0xac6b], /* Hangul Syllable */
- [0xac6c, 0xac6c], /* Hangul Syllable */
- [0xac6d, 0xac6d], /* Hangul Syllable */
- [0xac6e, 0xac6e], /* Hangul Syllable */
- [0xac6f, 0xac6f], /* Hangul Syllable */
- [0xac70, 0xac70], /* Hangul Syllable */
- [0xac71, 0xac71], /* Hangul Syllable */
- [0xac72, 0xac72], /* Hangul Syllable */
- [0xac73, 0xac73], /* Hangul Syllable */
- [0xac74, 0xac74], /* Hangul Syllable */
- [0xac75, 0xac75], /* Hangul Syllable */
- [0xac76, 0xac76], /* Hangul Syllable */
- [0xac77, 0xac77], /* Hangul Syllable */
- [0xac78, 0xac78], /* Hangul Syllable */
- [0xac79, 0xac79], /* Hangul Syllable */
- [0xac7a, 0xac7a], /* Hangul Syllable */
- [0xac7b, 0xac7b], /* Hangul Syllable */
- [0xac7c, 0xac7c], /* Hangul Syllable */
- [0xac7d, 0xac7d], /* Hangul Syllable */
- [0xac7e, 0xac7e], /* Hangul Syllable */
- [0xac7f, 0xac7f], /* Hangul Syllable */
- [0xac80, 0xac80], /* Hangul Syllable */
- [0xac81, 0xac81], /* Hangul Syllable */
- [0xac82, 0xac82], /* Hangul Syllable */
- [0xac83, 0xac83], /* Hangul Syllable */
- [0xac84, 0xac84], /* Hangul Syllable */
- [0xac85, 0xac85], /* Hangul Syllable */
- [0xac86, 0xac86], /* Hangul Syllable */
- [0xac87, 0xac87], /* Hangul Syllable */
- [0xac88, 0xac88], /* Hangul Syllable */
- [0xac89, 0xac89], /* Hangul Syllable */
- [0xac8a, 0xac8a], /* Hangul Syllable */
- [0xac8b, 0xac8b], /* Hangul Syllable */
- [0xac8c, 0xac8c], /* Hangul Syllable */
- [0xac8d, 0xac8d], /* Hangul Syllable */
- [0xac8e, 0xac8e], /* Hangul Syllable */
- [0xac8f, 0xac8f], /* Hangul Syllable */
- [0xac90, 0xac90], /* Hangul Syllable */
- [0xac91, 0xac91], /* Hangul Syllable */
- [0xac92, 0xac92], /* Hangul Syllable */
- [0xac93, 0xac93], /* Hangul Syllable */
- [0xac94, 0xac94], /* Hangul Syllable */
- [0xac95, 0xac95], /* Hangul Syllable */
- [0xac96, 0xac96], /* Hangul Syllable */
- [0xac97, 0xac97], /* Hangul Syllable */
- [0xac98, 0xac98], /* Hangul Syllable */
- [0xac99, 0xac99], /* Hangul Syllable */
- [0xac9a, 0xac9a], /* Hangul Syllable */
- [0xac9b, 0xac9b], /* Hangul Syllable */
- [0xac9c, 0xac9c], /* Hangul Syllable */
- [0xac9d, 0xac9d], /* Hangul Syllable */
- [0xac9e, 0xac9e], /* Hangul Syllable */
- [0xac9f, 0xac9f], /* Hangul Syllable */
- [0xaca0, 0xaca0], /* Hangul Syllable */
- [0xaca1, 0xaca1], /* Hangul Syllable */
- [0xaca2, 0xaca2], /* Hangul Syllable */
- [0xaca3, 0xaca3], /* Hangul Syllable */
- [0xaca4, 0xaca4], /* Hangul Syllable */
- [0xaca5, 0xaca5], /* Hangul Syllable */
- [0xaca6, 0xaca6], /* Hangul Syllable */
- [0xaca7, 0xaca7], /* Hangul Syllable */
- [0xaca8, 0xaca8], /* Hangul Syllable */
- [0xaca9, 0xaca9], /* Hangul Syllable */
- [0xacaa, 0xacaa], /* Hangul Syllable */
- [0xacab, 0xacab], /* Hangul Syllable */
- [0xacac, 0xacac], /* Hangul Syllable */
- [0xacad, 0xacad], /* Hangul Syllable */
- [0xacae, 0xacae], /* Hangul Syllable */
- [0xacaf, 0xacaf], /* Hangul Syllable */
- [0xacb0, 0xacb0], /* Hangul Syllable */
- [0xacb1, 0xacb1], /* Hangul Syllable */
- [0xacb2, 0xacb2], /* Hangul Syllable */
- [0xacb3, 0xacb3], /* Hangul Syllable */
- [0xacb4, 0xacb4], /* Hangul Syllable */
- [0xacb5, 0xacb5], /* Hangul Syllable */
- [0xacb6, 0xacb6], /* Hangul Syllable */
- [0xacb7, 0xacb7], /* Hangul Syllable */
- [0xacb8, 0xacb8], /* Hangul Syllable */
- [0xacb9, 0xacb9], /* Hangul Syllable */
- [0xacba, 0xacba], /* Hangul Syllable */
- [0xacbb, 0xacbb], /* Hangul Syllable */
- [0xacbc, 0xacbc], /* Hangul Syllable */
- [0xacbd, 0xacbd], /* Hangul Syllable */
- [0xacbe, 0xacbe], /* Hangul Syllable */
- [0xacbf, 0xacbf], /* Hangul Syllable */
- [0xacc0, 0xacc0], /* Hangul Syllable */
- [0xacc1, 0xacc1], /* Hangul Syllable */
- [0xacc2, 0xacc2], /* Hangul Syllable */
- [0xacc3, 0xacc3], /* Hangul Syllable */
- [0xacc4, 0xacc4], /* Hangul Syllable */
- [0xacc5, 0xacc5], /* Hangul Syllable */
- [0xacc6, 0xacc6], /* Hangul Syllable */
- [0xacc7, 0xacc7], /* Hangul Syllable */
- [0xacc8, 0xacc8], /* Hangul Syllable */
- [0xacc9, 0xacc9], /* Hangul Syllable */
- [0xacca, 0xacca], /* Hangul Syllable */
- [0xaccb, 0xaccb], /* Hangul Syllable */
- [0xaccc, 0xaccc], /* Hangul Syllable */
- [0xaccd, 0xaccd], /* Hangul Syllable */
- [0xacce, 0xacce], /* Hangul Syllable */
- [0xaccf, 0xaccf], /* Hangul Syllable */
- [0xacd0, 0xacd0], /* Hangul Syllable */
- [0xacd1, 0xacd1], /* Hangul Syllable */
- [0xacd2, 0xacd2], /* Hangul Syllable */
- [0xacd3, 0xacd3], /* Hangul Syllable */
- [0xacd4, 0xacd4], /* Hangul Syllable */
- [0xacd5, 0xacd5], /* Hangul Syllable */
- [0xacd6, 0xacd6], /* Hangul Syllable */
- [0xacd7, 0xacd7], /* Hangul Syllable */
- [0xacd8, 0xacd8], /* Hangul Syllable */
- [0xacd9, 0xacd9], /* Hangul Syllable */
- [0xacda, 0xacda], /* Hangul Syllable */
- [0xacdb, 0xacdb], /* Hangul Syllable */
- [0xacdc, 0xacdc], /* Hangul Syllable */
- [0xacdd, 0xacdd], /* Hangul Syllable */
- [0xacde, 0xacde], /* Hangul Syllable */
- [0xacdf, 0xacdf], /* Hangul Syllable */
- [0xace0, 0xace0], /* Hangul Syllable */
- [0xace1, 0xace1], /* Hangul Syllable */
- [0xace2, 0xace2], /* Hangul Syllable */
- [0xace3, 0xace3], /* Hangul Syllable */
- [0xace4, 0xace4], /* Hangul Syllable */
- [0xace5, 0xace5], /* Hangul Syllable */
- [0xace6, 0xace6], /* Hangul Syllable */
- [0xace7, 0xace7], /* Hangul Syllable */
- [0xace8, 0xace8], /* Hangul Syllable */
- [0xace9, 0xace9], /* Hangul Syllable */
- [0xacea, 0xacea], /* Hangul Syllable */
- [0xaceb, 0xaceb], /* Hangul Syllable */
- [0xacec, 0xacec], /* Hangul Syllable */
- [0xaced, 0xaced], /* Hangul Syllable */
- [0xacee, 0xacee], /* Hangul Syllable */
- [0xacef, 0xacef], /* Hangul Syllable */
- [0xacf0, 0xacf0], /* Hangul Syllable */
- [0xacf1, 0xacf1], /* Hangul Syllable */
- [0xacf2, 0xacf2], /* Hangul Syllable */
- [0xacf3, 0xacf3], /* Hangul Syllable */
- [0xacf4, 0xacf4], /* Hangul Syllable */
- [0xacf5, 0xacf5], /* Hangul Syllable */
- [0xacf6, 0xacf6], /* Hangul Syllable */
- [0xacf7, 0xacf7], /* Hangul Syllable */
- [0xacf8, 0xacf8], /* Hangul Syllable */
- [0xacf9, 0xacf9], /* Hangul Syllable */
- [0xacfa, 0xacfa], /* Hangul Syllable */
- [0xacfb, 0xacfb], /* Hangul Syllable */
- [0xacfc, 0xacfc], /* Hangul Syllable */
- [0xacfd, 0xacfd], /* Hangul Syllable */
- [0xacfe, 0xacfe], /* Hangul Syllable */
- [0xacff, 0xacff], /* Hangul Syllable */
- [0xad00, 0xad00], /* Hangul Syllable */
- [0xad01, 0xad01], /* Hangul Syllable */
- [0xad02, 0xad02], /* Hangul Syllable */
- [0xad03, 0xad03], /* Hangul Syllable */
- [0xad04, 0xad04], /* Hangul Syllable */
- [0xad05, 0xad05], /* Hangul Syllable */
- [0xad06, 0xad06], /* Hangul Syllable */
- [0xad07, 0xad07], /* Hangul Syllable */
- [0xad08, 0xad08], /* Hangul Syllable */
- [0xad09, 0xad09], /* Hangul Syllable */
- [0xad0a, 0xad0a], /* Hangul Syllable */
- [0xad0b, 0xad0b], /* Hangul Syllable */
- [0xad0c, 0xad0c], /* Hangul Syllable */
- [0xad0d, 0xad0d], /* Hangul Syllable */
- [0xad0e, 0xad0e], /* Hangul Syllable */
- [0xad0f, 0xad0f], /* Hangul Syllable */
- [0xad10, 0xad10], /* Hangul Syllable */
- [0xad11, 0xad11], /* Hangul Syllable */
- [0xad12, 0xad12], /* Hangul Syllable */
- [0xad13, 0xad13], /* Hangul Syllable */
- [0xad14, 0xad14], /* Hangul Syllable */
- [0xad15, 0xad15], /* Hangul Syllable */
- [0xad16, 0xad16], /* Hangul Syllable */
- [0xad17, 0xad17], /* Hangul Syllable */
- [0xad18, 0xad18], /* Hangul Syllable */
- [0xad19, 0xad19], /* Hangul Syllable */
- [0xad1a, 0xad1a], /* Hangul Syllable */
- [0xad1b, 0xad1b], /* Hangul Syllable */
- [0xad1c, 0xad1c], /* Hangul Syllable */
- [0xad1d, 0xad1d], /* Hangul Syllable */
- [0xad1e, 0xad1e], /* Hangul Syllable */
- [0xad1f, 0xad1f], /* Hangul Syllable */
- [0xad20, 0xad20], /* Hangul Syllable */
- [0xad21, 0xad21], /* Hangul Syllable */
- [0xad22, 0xad22], /* Hangul Syllable */
- [0xad23, 0xad23], /* Hangul Syllable */
- [0xad24, 0xad24], /* Hangul Syllable */
- [0xad25, 0xad25], /* Hangul Syllable */
- [0xad26, 0xad26], /* Hangul Syllable */
- [0xad27, 0xad27], /* Hangul Syllable */
- [0xad28, 0xad28], /* Hangul Syllable */
- [0xad29, 0xad29], /* Hangul Syllable */
- [0xad2a, 0xad2a], /* Hangul Syllable */
- [0xad2b, 0xad2b], /* Hangul Syllable */
- [0xad2c, 0xad2c], /* Hangul Syllable */
- [0xad2d, 0xad2d], /* Hangul Syllable */
- [0xad2e, 0xad2e], /* Hangul Syllable */
- [0xad2f, 0xad2f], /* Hangul Syllable */
- [0xad30, 0xad30], /* Hangul Syllable */
- [0xad31, 0xad31], /* Hangul Syllable */
- [0xad32, 0xad32], /* Hangul Syllable */
- [0xad33, 0xad33], /* Hangul Syllable */
- [0xad34, 0xad34], /* Hangul Syllable */
- [0xad35, 0xad35], /* Hangul Syllable */
- [0xad36, 0xad36], /* Hangul Syllable */
- [0xad37, 0xad37], /* Hangul Syllable */
- [0xad38, 0xad38], /* Hangul Syllable */
- [0xad39, 0xad39], /* Hangul Syllable */
- [0xad3a, 0xad3a], /* Hangul Syllable */
- [0xad3b, 0xad3b], /* Hangul Syllable */
- [0xad3c, 0xad3c], /* Hangul Syllable */
- [0xad3d, 0xad3d], /* Hangul Syllable */
- [0xad3e, 0xad3e], /* Hangul Syllable */
- [0xad3f, 0xad3f], /* Hangul Syllable */
- [0xad40, 0xad40], /* Hangul Syllable */
- [0xad41, 0xad41], /* Hangul Syllable */
- [0xad42, 0xad42], /* Hangul Syllable */
- [0xad43, 0xad43], /* Hangul Syllable */
- [0xad44, 0xad44], /* Hangul Syllable */
- [0xad45, 0xad45], /* Hangul Syllable */
- [0xad46, 0xad46], /* Hangul Syllable */
- [0xad47, 0xad47], /* Hangul Syllable */
- [0xad48, 0xad48], /* Hangul Syllable */
- [0xad49, 0xad49], /* Hangul Syllable */
- [0xad4a, 0xad4a], /* Hangul Syllable */
- [0xad4b, 0xad4b], /* Hangul Syllable */
- [0xad4c, 0xad4c], /* Hangul Syllable */
- [0xad4d, 0xad4d], /* Hangul Syllable */
- [0xad4e, 0xad4e], /* Hangul Syllable */
- [0xad4f, 0xad4f], /* Hangul Syllable */
- [0xad50, 0xad50], /* Hangul Syllable */
- [0xad51, 0xad51], /* Hangul Syllable */
- [0xad52, 0xad52], /* Hangul Syllable */
- [0xad53, 0xad53], /* Hangul Syllable */
- [0xad54, 0xad54], /* Hangul Syllable */
- [0xad55, 0xad55], /* Hangul Syllable */
- [0xad56, 0xad56], /* Hangul Syllable */
- [0xad57, 0xad57], /* Hangul Syllable */
- [0xad58, 0xad58], /* Hangul Syllable */
- [0xad59, 0xad59], /* Hangul Syllable */
- [0xad5a, 0xad5a], /* Hangul Syllable */
- [0xad5b, 0xad5b], /* Hangul Syllable */
- [0xad5c, 0xad5c], /* Hangul Syllable */
- [0xad5d, 0xad5d], /* Hangul Syllable */
- [0xad5e, 0xad5e], /* Hangul Syllable */
- [0xad5f, 0xad5f], /* Hangul Syllable */
- [0xad60, 0xad60], /* Hangul Syllable */
- [0xad61, 0xad61], /* Hangul Syllable */
- [0xad62, 0xad62], /* Hangul Syllable */
- [0xad63, 0xad63], /* Hangul Syllable */
- [0xad64, 0xad64], /* Hangul Syllable */
- [0xad65, 0xad65], /* Hangul Syllable */
- [0xad66, 0xad66], /* Hangul Syllable */
- [0xad67, 0xad67], /* Hangul Syllable */
- [0xad68, 0xad68], /* Hangul Syllable */
- [0xad69, 0xad69], /* Hangul Syllable */
- [0xad6a, 0xad6a], /* Hangul Syllable */
- [0xad6b, 0xad6b], /* Hangul Syllable */
- [0xad6c, 0xad6c], /* Hangul Syllable */
- [0xad6d, 0xad6d], /* Hangul Syllable */
- [0xad6e, 0xad6e], /* Hangul Syllable */
- [0xad6f, 0xad6f], /* Hangul Syllable */
- [0xad70, 0xad70], /* Hangul Syllable */
- [0xad71, 0xad71], /* Hangul Syllable */
- [0xad72, 0xad72], /* Hangul Syllable */
- [0xad73, 0xad73], /* Hangul Syllable */
- [0xad74, 0xad74], /* Hangul Syllable */
- [0xad75, 0xad75], /* Hangul Syllable */
- [0xad76, 0xad76], /* Hangul Syllable */
- [0xad77, 0xad77], /* Hangul Syllable */
- [0xad78, 0xad78], /* Hangul Syllable */
- [0xad79, 0xad79], /* Hangul Syllable */
- [0xad7a, 0xad7a], /* Hangul Syllable */
- [0xad7b, 0xad7b], /* Hangul Syllable */
- [0xad7c, 0xad7c], /* Hangul Syllable */
- [0xad7d, 0xad7d], /* Hangul Syllable */
- [0xad7e, 0xad7e], /* Hangul Syllable */
- [0xad7f, 0xad7f], /* Hangul Syllable */
- [0xad80, 0xad80], /* Hangul Syllable */
- [0xad81, 0xad81], /* Hangul Syllable */
- [0xad82, 0xad82], /* Hangul Syllable */
- [0xad83, 0xad83], /* Hangul Syllable */
- [0xad84, 0xad84], /* Hangul Syllable */
- [0xad85, 0xad85], /* Hangul Syllable */
- [0xad86, 0xad86], /* Hangul Syllable */
- [0xad87, 0xad87], /* Hangul Syllable */
- [0xad88, 0xad88], /* Hangul Syllable */
- [0xad89, 0xad89], /* Hangul Syllable */
- [0xad8a, 0xad8a], /* Hangul Syllable */
- [0xad8b, 0xad8b], /* Hangul Syllable */
- [0xad8c, 0xad8c], /* Hangul Syllable */
- [0xad8d, 0xad8d], /* Hangul Syllable */
- [0xad8e, 0xad8e], /* Hangul Syllable */
- [0xad8f, 0xad8f], /* Hangul Syllable */
- [0xad90, 0xad90], /* Hangul Syllable */
- [0xad91, 0xad91], /* Hangul Syllable */
- [0xad92, 0xad92], /* Hangul Syllable */
- [0xad93, 0xad93], /* Hangul Syllable */
- [0xad94, 0xad94], /* Hangul Syllable */
- [0xad95, 0xad95], /* Hangul Syllable */
- [0xad96, 0xad96], /* Hangul Syllable */
- [0xad97, 0xad97], /* Hangul Syllable */
- [0xad98, 0xad98], /* Hangul Syllable */
- [0xad99, 0xad99], /* Hangul Syllable */
- [0xad9a, 0xad9a], /* Hangul Syllable */
- [0xad9b, 0xad9b], /* Hangul Syllable */
- [0xad9c, 0xad9c], /* Hangul Syllable */
- [0xad9d, 0xad9d], /* Hangul Syllable */
- [0xad9e, 0xad9e], /* Hangul Syllable */
- [0xad9f, 0xad9f], /* Hangul Syllable */
- [0xada0, 0xada0], /* Hangul Syllable */
- [0xada1, 0xada1], /* Hangul Syllable */
- [0xada2, 0xada2], /* Hangul Syllable */
- [0xada3, 0xada3], /* Hangul Syllable */
- [0xada4, 0xada4], /* Hangul Syllable */
- [0xada5, 0xada5], /* Hangul Syllable */
- [0xada6, 0xada6], /* Hangul Syllable */
- [0xada7, 0xada7], /* Hangul Syllable */
- [0xada8, 0xada8], /* Hangul Syllable */
- [0xada9, 0xada9], /* Hangul Syllable */
- [0xadaa, 0xadaa], /* Hangul Syllable */
- [0xadab, 0xadab], /* Hangul Syllable */
- [0xadac, 0xadac], /* Hangul Syllable */
- [0xadad, 0xadad], /* Hangul Syllable */
- [0xadae, 0xadae], /* Hangul Syllable */
- [0xadaf, 0xadaf], /* Hangul Syllable */
- [0xadb0, 0xadb0], /* Hangul Syllable */
- [0xadb1, 0xadb1], /* Hangul Syllable */
- [0xadb2, 0xadb2], /* Hangul Syllable */
- [0xadb3, 0xadb3], /* Hangul Syllable */
- [0xadb4, 0xadb4], /* Hangul Syllable */
- [0xadb5, 0xadb5], /* Hangul Syllable */
- [0xadb6, 0xadb6], /* Hangul Syllable */
- [0xadb7, 0xadb7], /* Hangul Syllable */
- [0xadb8, 0xadb8], /* Hangul Syllable */
- [0xadb9, 0xadb9], /* Hangul Syllable */
- [0xadba, 0xadba], /* Hangul Syllable */
- [0xadbb, 0xadbb], /* Hangul Syllable */
- [0xadbc, 0xadbc], /* Hangul Syllable */
- [0xadbd, 0xadbd], /* Hangul Syllable */
- [0xadbe, 0xadbe], /* Hangul Syllable */
- [0xadbf, 0xadbf], /* Hangul Syllable */
- [0xadc0, 0xadc0], /* Hangul Syllable */
- [0xadc1, 0xadc1], /* Hangul Syllable */
- [0xadc2, 0xadc2], /* Hangul Syllable */
- [0xadc3, 0xadc3], /* Hangul Syllable */
- [0xadc4, 0xadc4], /* Hangul Syllable */
- [0xadc5, 0xadc5], /* Hangul Syllable */
- [0xadc6, 0xadc6], /* Hangul Syllable */
- [0xadc7, 0xadc7], /* Hangul Syllable */
- [0xadc8, 0xadc8], /* Hangul Syllable */
- [0xadc9, 0xadc9], /* Hangul Syllable */
- [0xadca, 0xadca], /* Hangul Syllable */
- [0xadcb, 0xadcb], /* Hangul Syllable */
- [0xadcc, 0xadcc], /* Hangul Syllable */
- [0xadcd, 0xadcd], /* Hangul Syllable */
- [0xadce, 0xadce], /* Hangul Syllable */
- [0xadcf, 0xadcf], /* Hangul Syllable */
- [0xadd0, 0xadd0], /* Hangul Syllable */
- [0xadd1, 0xadd1], /* Hangul Syllable */
- [0xadd2, 0xadd2], /* Hangul Syllable */
- [0xadd3, 0xadd3], /* Hangul Syllable */
- [0xadd4, 0xadd4], /* Hangul Syllable */
- [0xadd5, 0xadd5], /* Hangul Syllable */
- [0xadd6, 0xadd6], /* Hangul Syllable */
- [0xadd7, 0xadd7], /* Hangul Syllable */
- [0xadd8, 0xadd8], /* Hangul Syllable */
- [0xadd9, 0xadd9], /* Hangul Syllable */
- [0xadda, 0xadda], /* Hangul Syllable */
- [0xaddb, 0xaddb], /* Hangul Syllable */
- [0xaddc, 0xaddc], /* Hangul Syllable */
- [0xaddd, 0xaddd], /* Hangul Syllable */
- [0xadde, 0xadde], /* Hangul Syllable */
- [0xaddf, 0xaddf], /* Hangul Syllable */
- [0xade0, 0xade0], /* Hangul Syllable */
- [0xade1, 0xade1], /* Hangul Syllable */
- [0xade2, 0xade2], /* Hangul Syllable */
- [0xade3, 0xade3], /* Hangul Syllable */
- [0xade4, 0xade4], /* Hangul Syllable */
- [0xade5, 0xade5], /* Hangul Syllable */
- [0xade6, 0xade6], /* Hangul Syllable */
- [0xade7, 0xade7], /* Hangul Syllable */
- [0xade8, 0xade8], /* Hangul Syllable */
- [0xade9, 0xade9], /* Hangul Syllable */
- [0xadea, 0xadea], /* Hangul Syllable */
- [0xadeb, 0xadeb], /* Hangul Syllable */
- [0xadec, 0xadec], /* Hangul Syllable */
- [0xaded, 0xaded], /* Hangul Syllable */
- [0xadee, 0xadee], /* Hangul Syllable */
- [0xadef, 0xadef], /* Hangul Syllable */
- [0xadf0, 0xadf0], /* Hangul Syllable */
- [0xadf1, 0xadf1], /* Hangul Syllable */
- [0xadf2, 0xadf2], /* Hangul Syllable */
- [0xadf3, 0xadf3], /* Hangul Syllable */
- [0xadf4, 0xadf4], /* Hangul Syllable */
- [0xadf5, 0xadf5], /* Hangul Syllable */
- [0xadf6, 0xadf6], /* Hangul Syllable */
- [0xadf7, 0xadf7], /* Hangul Syllable */
- [0xadf8, 0xadf8], /* Hangul Syllable */
- [0xadf9, 0xadf9], /* Hangul Syllable */
- [0xadfa, 0xadfa], /* Hangul Syllable */
- [0xadfb, 0xadfb], /* Hangul Syllable */
- [0xadfc, 0xadfc], /* Hangul Syllable */
- [0xadfd, 0xadfd], /* Hangul Syllable */
- [0xadfe, 0xadfe], /* Hangul Syllable */
- [0xadff, 0xadff], /* Hangul Syllable */
- [0xae00, 0xae00], /* Hangul Syllable */
- [0xae01, 0xae01], /* Hangul Syllable */
- [0xae02, 0xae02], /* Hangul Syllable */
- [0xae03, 0xae03], /* Hangul Syllable */
- [0xae04, 0xae04], /* Hangul Syllable */
- [0xae05, 0xae05], /* Hangul Syllable */
- [0xae06, 0xae06], /* Hangul Syllable */
- [0xae07, 0xae07], /* Hangul Syllable */
- [0xae08, 0xae08], /* Hangul Syllable */
- [0xae09, 0xae09], /* Hangul Syllable */
- [0xae0a, 0xae0a], /* Hangul Syllable */
- [0xae0b, 0xae0b], /* Hangul Syllable */
- [0xae0c, 0xae0c], /* Hangul Syllable */
- [0xae0d, 0xae0d], /* Hangul Syllable */
- [0xae0e, 0xae0e], /* Hangul Syllable */
- [0xae0f, 0xae0f], /* Hangul Syllable */
- [0xae10, 0xae10], /* Hangul Syllable */
- [0xae11, 0xae11], /* Hangul Syllable */
- [0xae12, 0xae12], /* Hangul Syllable */
- [0xae13, 0xae13], /* Hangul Syllable */
- [0xae14, 0xae14], /* Hangul Syllable */
- [0xae15, 0xae15], /* Hangul Syllable */
- [0xae16, 0xae16], /* Hangul Syllable */
- [0xae17, 0xae17], /* Hangul Syllable */
- [0xae18, 0xae18], /* Hangul Syllable */
- [0xae19, 0xae19], /* Hangul Syllable */
- [0xae1a, 0xae1a], /* Hangul Syllable */
- [0xae1b, 0xae1b], /* Hangul Syllable */
- [0xae1c, 0xae1c], /* Hangul Syllable */
- [0xae1d, 0xae1d], /* Hangul Syllable */
- [0xae1e, 0xae1e], /* Hangul Syllable */
- [0xae1f, 0xae1f], /* Hangul Syllable */
- [0xae20, 0xae20], /* Hangul Syllable */
- [0xae21, 0xae21], /* Hangul Syllable */
- [0xae22, 0xae22], /* Hangul Syllable */
- [0xae23, 0xae23], /* Hangul Syllable */
- [0xae24, 0xae24], /* Hangul Syllable */
- [0xae25, 0xae25], /* Hangul Syllable */
- [0xae26, 0xae26], /* Hangul Syllable */
- [0xae27, 0xae27], /* Hangul Syllable */
- [0xae28, 0xae28], /* Hangul Syllable */
- [0xae29, 0xae29], /* Hangul Syllable */
- [0xae2a, 0xae2a], /* Hangul Syllable */
- [0xae2b, 0xae2b], /* Hangul Syllable */
- [0xae2c, 0xae2c], /* Hangul Syllable */
- [0xae2d, 0xae2d], /* Hangul Syllable */
- [0xae2e, 0xae2e], /* Hangul Syllable */
- [0xae2f, 0xae2f], /* Hangul Syllable */
- [0xae30, 0xae30], /* Hangul Syllable */
- [0xae31, 0xae31], /* Hangul Syllable */
- [0xae32, 0xae32], /* Hangul Syllable */
- [0xae33, 0xae33], /* Hangul Syllable */
- [0xae34, 0xae34], /* Hangul Syllable */
- [0xae35, 0xae35], /* Hangul Syllable */
- [0xae36, 0xae36], /* Hangul Syllable */
- [0xae37, 0xae37], /* Hangul Syllable */
- [0xae38, 0xae38], /* Hangul Syllable */
- [0xae39, 0xae39], /* Hangul Syllable */
- [0xae3a, 0xae3a], /* Hangul Syllable */
- [0xae3b, 0xae3b], /* Hangul Syllable */
- [0xae3c, 0xae3c], /* Hangul Syllable */
- [0xae3d, 0xae3d], /* Hangul Syllable */
- [0xae3e, 0xae3e], /* Hangul Syllable */
- [0xae3f, 0xae3f], /* Hangul Syllable */
- [0xae40, 0xae40], /* Hangul Syllable */
- [0xae41, 0xae41], /* Hangul Syllable */
- [0xae42, 0xae42], /* Hangul Syllable */
- [0xae43, 0xae43], /* Hangul Syllable */
- [0xae44, 0xae44], /* Hangul Syllable */
- [0xae45, 0xae45], /* Hangul Syllable */
- [0xae46, 0xae46], /* Hangul Syllable */
- [0xae47, 0xae47], /* Hangul Syllable */
- [0xae48, 0xae48], /* Hangul Syllable */
- [0xae49, 0xae49], /* Hangul Syllable */
- [0xae4a, 0xae4a], /* Hangul Syllable */
- [0xae4b, 0xae4b], /* Hangul Syllable */
- [0xae4c, 0xae4c], /* Hangul Syllable */
- [0xae4d, 0xae4d], /* Hangul Syllable */
- [0xae4e, 0xae4e], /* Hangul Syllable */
- [0xae4f, 0xae4f], /* Hangul Syllable */
- [0xae50, 0xae50], /* Hangul Syllable */
- [0xae51, 0xae51], /* Hangul Syllable */
- [0xae52, 0xae52], /* Hangul Syllable */
- [0xae53, 0xae53], /* Hangul Syllable */
- [0xae54, 0xae54], /* Hangul Syllable */
- [0xae55, 0xae55], /* Hangul Syllable */
- [0xae56, 0xae56], /* Hangul Syllable */
- [0xae57, 0xae57], /* Hangul Syllable */
- [0xae58, 0xae58], /* Hangul Syllable */
- [0xae59, 0xae59], /* Hangul Syllable */
- [0xae5a, 0xae5a], /* Hangul Syllable */
- [0xae5b, 0xae5b], /* Hangul Syllable */
- [0xae5c, 0xae5c], /* Hangul Syllable */
- [0xae5d, 0xae5d], /* Hangul Syllable */
- [0xae5e, 0xae5e], /* Hangul Syllable */
- [0xae5f, 0xae5f], /* Hangul Syllable */
- [0xae60, 0xae60], /* Hangul Syllable */
- [0xae61, 0xae61], /* Hangul Syllable */
- [0xae62, 0xae62], /* Hangul Syllable */
- [0xae63, 0xae63], /* Hangul Syllable */
- [0xae64, 0xae64], /* Hangul Syllable */
- [0xae65, 0xae65], /* Hangul Syllable */
- [0xae66, 0xae66], /* Hangul Syllable */
- [0xae67, 0xae67], /* Hangul Syllable */
- [0xae68, 0xae68], /* Hangul Syllable */
- [0xae69, 0xae69], /* Hangul Syllable */
- [0xae6a, 0xae6a], /* Hangul Syllable */
- [0xae6b, 0xae6b], /* Hangul Syllable */
- [0xae6c, 0xae6c], /* Hangul Syllable */
- [0xae6d, 0xae6d], /* Hangul Syllable */
- [0xae6e, 0xae6e], /* Hangul Syllable */
- [0xae6f, 0xae6f], /* Hangul Syllable */
- [0xae70, 0xae70], /* Hangul Syllable */
- [0xae71, 0xae71], /* Hangul Syllable */
- [0xae72, 0xae72], /* Hangul Syllable */
- [0xae73, 0xae73], /* Hangul Syllable */
- [0xae74, 0xae74], /* Hangul Syllable */
- [0xae75, 0xae75], /* Hangul Syllable */
- [0xae76, 0xae76], /* Hangul Syllable */
- [0xae77, 0xae77], /* Hangul Syllable */
- [0xae78, 0xae78], /* Hangul Syllable */
- [0xae79, 0xae79], /* Hangul Syllable */
- [0xae7a, 0xae7a], /* Hangul Syllable */
- [0xae7b, 0xae7b], /* Hangul Syllable */
- [0xae7c, 0xae7c], /* Hangul Syllable */
- [0xae7d, 0xae7d], /* Hangul Syllable */
- [0xae7e, 0xae7e], /* Hangul Syllable */
- [0xae7f, 0xae7f], /* Hangul Syllable */
- [0xae80, 0xae80], /* Hangul Syllable */
- [0xae81, 0xae81], /* Hangul Syllable */
- [0xae82, 0xae82], /* Hangul Syllable */
- [0xae83, 0xae83], /* Hangul Syllable */
- [0xae84, 0xae84], /* Hangul Syllable */
- [0xae85, 0xae85], /* Hangul Syllable */
- [0xae86, 0xae86], /* Hangul Syllable */
- [0xae87, 0xae87], /* Hangul Syllable */
- [0xae88, 0xae88], /* Hangul Syllable */
- [0xae89, 0xae89], /* Hangul Syllable */
- [0xae8a, 0xae8a], /* Hangul Syllable */
- [0xae8b, 0xae8b], /* Hangul Syllable */
- [0xae8c, 0xae8c], /* Hangul Syllable */
- [0xae8d, 0xae8d], /* Hangul Syllable */
- [0xae8e, 0xae8e], /* Hangul Syllable */
- [0xae8f, 0xae8f], /* Hangul Syllable */
- [0xae90, 0xae90], /* Hangul Syllable */
- [0xae91, 0xae91], /* Hangul Syllable */
- [0xae92, 0xae92], /* Hangul Syllable */
- [0xae93, 0xae93], /* Hangul Syllable */
- [0xae94, 0xae94], /* Hangul Syllable */
- [0xae95, 0xae95], /* Hangul Syllable */
- [0xae96, 0xae96], /* Hangul Syllable */
- [0xae97, 0xae97], /* Hangul Syllable */
- [0xae98, 0xae98], /* Hangul Syllable */
- [0xae99, 0xae99], /* Hangul Syllable */
- [0xae9a, 0xae9a], /* Hangul Syllable */
- [0xae9b, 0xae9b], /* Hangul Syllable */
- [0xae9c, 0xae9c], /* Hangul Syllable */
- [0xae9d, 0xae9d], /* Hangul Syllable */
- [0xae9e, 0xae9e], /* Hangul Syllable */
- [0xae9f, 0xae9f], /* Hangul Syllable */
- [0xaea0, 0xaea0], /* Hangul Syllable */
- [0xaea1, 0xaea1], /* Hangul Syllable */
- [0xaea2, 0xaea2], /* Hangul Syllable */
- [0xaea3, 0xaea3], /* Hangul Syllable */
- [0xaea4, 0xaea4], /* Hangul Syllable */
- [0xaea5, 0xaea5], /* Hangul Syllable */
- [0xaea6, 0xaea6], /* Hangul Syllable */
- [0xaea7, 0xaea7], /* Hangul Syllable */
- [0xaea8, 0xaea8], /* Hangul Syllable */
- [0xaea9, 0xaea9], /* Hangul Syllable */
- [0xaeaa, 0xaeaa], /* Hangul Syllable */
- [0xaeab, 0xaeab], /* Hangul Syllable */
- [0xaeac, 0xaeac], /* Hangul Syllable */
- [0xaead, 0xaead], /* Hangul Syllable */
- [0xaeae, 0xaeae], /* Hangul Syllable */
- [0xaeaf, 0xaeaf], /* Hangul Syllable */
- [0xaeb0, 0xaeb0], /* Hangul Syllable */
- [0xaeb1, 0xaeb1], /* Hangul Syllable */
- [0xaeb2, 0xaeb2], /* Hangul Syllable */
- [0xaeb3, 0xaeb3], /* Hangul Syllable */
- [0xaeb4, 0xaeb4], /* Hangul Syllable */
- [0xaeb5, 0xaeb5], /* Hangul Syllable */
- [0xaeb6, 0xaeb6], /* Hangul Syllable */
- [0xaeb7, 0xaeb7], /* Hangul Syllable */
- [0xaeb8, 0xaeb8], /* Hangul Syllable */
- [0xaeb9, 0xaeb9], /* Hangul Syllable */
- [0xaeba, 0xaeba], /* Hangul Syllable */
- [0xaebb, 0xaebb], /* Hangul Syllable */
- [0xaebc, 0xaebc], /* Hangul Syllable */
- [0xaebd, 0xaebd], /* Hangul Syllable */
- [0xaebe, 0xaebe], /* Hangul Syllable */
- [0xaebf, 0xaebf], /* Hangul Syllable */
- [0xaec0, 0xaec0], /* Hangul Syllable */
- [0xaec1, 0xaec1], /* Hangul Syllable */
- [0xaec2, 0xaec2], /* Hangul Syllable */
- [0xaec3, 0xaec3], /* Hangul Syllable */
- [0xaec4, 0xaec4], /* Hangul Syllable */
- [0xaec5, 0xaec5], /* Hangul Syllable */
- [0xaec6, 0xaec6], /* Hangul Syllable */
- [0xaec7, 0xaec7], /* Hangul Syllable */
- [0xaec8, 0xaec8], /* Hangul Syllable */
- [0xaec9, 0xaec9], /* Hangul Syllable */
- [0xaeca, 0xaeca], /* Hangul Syllable */
- [0xaecb, 0xaecb], /* Hangul Syllable */
- [0xaecc, 0xaecc], /* Hangul Syllable */
- [0xaecd, 0xaecd], /* Hangul Syllable */
- [0xaece, 0xaece], /* Hangul Syllable */
- [0xaecf, 0xaecf], /* Hangul Syllable */
- [0xaed0, 0xaed0], /* Hangul Syllable */
- [0xaed1, 0xaed1], /* Hangul Syllable */
- [0xaed2, 0xaed2], /* Hangul Syllable */
- [0xaed3, 0xaed3], /* Hangul Syllable */
- [0xaed4, 0xaed4], /* Hangul Syllable */
- [0xaed5, 0xaed5], /* Hangul Syllable */
- [0xaed6, 0xaed6], /* Hangul Syllable */
- [0xaed7, 0xaed7], /* Hangul Syllable */
- [0xaed8, 0xaed8], /* Hangul Syllable */
- [0xaed9, 0xaed9], /* Hangul Syllable */
- [0xaeda, 0xaeda], /* Hangul Syllable */
- [0xaedb, 0xaedb], /* Hangul Syllable */
- [0xaedc, 0xaedc], /* Hangul Syllable */
- [0xaedd, 0xaedd], /* Hangul Syllable */
- [0xaede, 0xaede], /* Hangul Syllable */
- [0xaedf, 0xaedf], /* Hangul Syllable */
- [0xaee0, 0xaee0], /* Hangul Syllable */
- [0xaee1, 0xaee1], /* Hangul Syllable */
- [0xaee2, 0xaee2], /* Hangul Syllable */
- [0xaee3, 0xaee3], /* Hangul Syllable */
- [0xaee4, 0xaee4], /* Hangul Syllable */
- [0xaee5, 0xaee5], /* Hangul Syllable */
- [0xaee6, 0xaee6], /* Hangul Syllable */
- [0xaee7, 0xaee7], /* Hangul Syllable */
- [0xaee8, 0xaee8], /* Hangul Syllable */
- [0xaee9, 0xaee9], /* Hangul Syllable */
- [0xaeea, 0xaeea], /* Hangul Syllable */
- [0xaeeb, 0xaeeb], /* Hangul Syllable */
- [0xaeec, 0xaeec], /* Hangul Syllable */
- [0xaeed, 0xaeed], /* Hangul Syllable */
- [0xaeee, 0xaeee], /* Hangul Syllable */
- [0xaeef, 0xaeef], /* Hangul Syllable */
- [0xaef0, 0xaef0], /* Hangul Syllable */
- [0xaef1, 0xaef1], /* Hangul Syllable */
- [0xaef2, 0xaef2], /* Hangul Syllable */
- [0xaef3, 0xaef3], /* Hangul Syllable */
- [0xaef4, 0xaef4], /* Hangul Syllable */
- [0xaef5, 0xaef5], /* Hangul Syllable */
- [0xaef6, 0xaef6], /* Hangul Syllable */
- [0xaef7, 0xaef7], /* Hangul Syllable */
- [0xaef8, 0xaef8], /* Hangul Syllable */
- [0xaef9, 0xaef9], /* Hangul Syllable */
- [0xaefa, 0xaefa], /* Hangul Syllable */
- [0xaefb, 0xaefb], /* Hangul Syllable */
- [0xaefc, 0xaefc], /* Hangul Syllable */
- [0xaefd, 0xaefd], /* Hangul Syllable */
- [0xaefe, 0xaefe], /* Hangul Syllable */
- [0xaeff, 0xaeff], /* Hangul Syllable */
- [0xaf00, 0xaf00], /* Hangul Syllable */
- [0xaf01, 0xaf01], /* Hangul Syllable */
- [0xaf02, 0xaf02], /* Hangul Syllable */
- [0xaf03, 0xaf03], /* Hangul Syllable */
- [0xaf04, 0xaf04], /* Hangul Syllable */
- [0xaf05, 0xaf05], /* Hangul Syllable */
- [0xaf06, 0xaf06], /* Hangul Syllable */
- [0xaf07, 0xaf07], /* Hangul Syllable */
- [0xaf08, 0xaf08], /* Hangul Syllable */
- [0xaf09, 0xaf09], /* Hangul Syllable */
- [0xaf0a, 0xaf0a], /* Hangul Syllable */
- [0xaf0b, 0xaf0b], /* Hangul Syllable */
- [0xaf0c, 0xaf0c], /* Hangul Syllable */
- [0xaf0d, 0xaf0d], /* Hangul Syllable */
- [0xaf0e, 0xaf0e], /* Hangul Syllable */
- [0xaf0f, 0xaf0f], /* Hangul Syllable */
- [0xaf10, 0xaf10], /* Hangul Syllable */
- [0xaf11, 0xaf11], /* Hangul Syllable */
- [0xaf12, 0xaf12], /* Hangul Syllable */
- [0xaf13, 0xaf13], /* Hangul Syllable */
- [0xaf14, 0xaf14], /* Hangul Syllable */
- [0xaf15, 0xaf15], /* Hangul Syllable */
- [0xaf16, 0xaf16], /* Hangul Syllable */
- [0xaf17, 0xaf17], /* Hangul Syllable */
- [0xaf18, 0xaf18], /* Hangul Syllable */
- [0xaf19, 0xaf19], /* Hangul Syllable */
- [0xaf1a, 0xaf1a], /* Hangul Syllable */
- [0xaf1b, 0xaf1b], /* Hangul Syllable */
- [0xaf1c, 0xaf1c], /* Hangul Syllable */
- [0xaf1d, 0xaf1d], /* Hangul Syllable */
- [0xaf1e, 0xaf1e], /* Hangul Syllable */
- [0xaf1f, 0xaf1f], /* Hangul Syllable */
- [0xaf20, 0xaf20], /* Hangul Syllable */
- [0xaf21, 0xaf21], /* Hangul Syllable */
- [0xaf22, 0xaf22], /* Hangul Syllable */
- [0xaf23, 0xaf23], /* Hangul Syllable */
- [0xaf24, 0xaf24], /* Hangul Syllable */
- [0xaf25, 0xaf25], /* Hangul Syllable */
- [0xaf26, 0xaf26], /* Hangul Syllable */
- [0xaf27, 0xaf27], /* Hangul Syllable */
- [0xaf28, 0xaf28], /* Hangul Syllable */
- [0xaf29, 0xaf29], /* Hangul Syllable */
- [0xaf2a, 0xaf2a], /* Hangul Syllable */
- [0xaf2b, 0xaf2b], /* Hangul Syllable */
- [0xaf2c, 0xaf2c], /* Hangul Syllable */
- [0xaf2d, 0xaf2d], /* Hangul Syllable */
- [0xaf2e, 0xaf2e], /* Hangul Syllable */
- [0xaf2f, 0xaf2f], /* Hangul Syllable */
- [0xaf30, 0xaf30], /* Hangul Syllable */
- [0xaf31, 0xaf31], /* Hangul Syllable */
- [0xaf32, 0xaf32], /* Hangul Syllable */
- [0xaf33, 0xaf33], /* Hangul Syllable */
- [0xaf34, 0xaf34], /* Hangul Syllable */
- [0xaf35, 0xaf35], /* Hangul Syllable */
- [0xaf36, 0xaf36], /* Hangul Syllable */
- [0xaf37, 0xaf37], /* Hangul Syllable */
- [0xaf38, 0xaf38], /* Hangul Syllable */
- [0xaf39, 0xaf39], /* Hangul Syllable */
- [0xaf3a, 0xaf3a], /* Hangul Syllable */
- [0xaf3b, 0xaf3b], /* Hangul Syllable */
- [0xaf3c, 0xaf3c], /* Hangul Syllable */
- [0xaf3d, 0xaf3d], /* Hangul Syllable */
- [0xaf3e, 0xaf3e], /* Hangul Syllable */
- [0xaf3f, 0xaf3f], /* Hangul Syllable */
- [0xaf40, 0xaf40], /* Hangul Syllable */
- [0xaf41, 0xaf41], /* Hangul Syllable */
- [0xaf42, 0xaf42], /* Hangul Syllable */
- [0xaf43, 0xaf43], /* Hangul Syllable */
- [0xaf44, 0xaf44], /* Hangul Syllable */
- [0xaf45, 0xaf45], /* Hangul Syllable */
- [0xaf46, 0xaf46], /* Hangul Syllable */
- [0xaf47, 0xaf47], /* Hangul Syllable */
- [0xaf48, 0xaf48], /* Hangul Syllable */
- [0xaf49, 0xaf49], /* Hangul Syllable */
- [0xaf4a, 0xaf4a], /* Hangul Syllable */
- [0xaf4b, 0xaf4b], /* Hangul Syllable */
- [0xaf4c, 0xaf4c], /* Hangul Syllable */
- [0xaf4d, 0xaf4d], /* Hangul Syllable */
- [0xaf4e, 0xaf4e], /* Hangul Syllable */
- [0xaf4f, 0xaf4f], /* Hangul Syllable */
- [0xaf50, 0xaf50], /* Hangul Syllable */
- [0xaf51, 0xaf51], /* Hangul Syllable */
- [0xaf52, 0xaf52], /* Hangul Syllable */
- [0xaf53, 0xaf53], /* Hangul Syllable */
- [0xaf54, 0xaf54], /* Hangul Syllable */
- [0xaf55, 0xaf55], /* Hangul Syllable */
- [0xaf56, 0xaf56], /* Hangul Syllable */
- [0xaf57, 0xaf57], /* Hangul Syllable */
- [0xaf58, 0xaf58], /* Hangul Syllable */
- [0xaf59, 0xaf59], /* Hangul Syllable */
- [0xaf5a, 0xaf5a], /* Hangul Syllable */
- [0xaf5b, 0xaf5b], /* Hangul Syllable */
- [0xaf5c, 0xaf5c], /* Hangul Syllable */
- [0xaf5d, 0xaf5d], /* Hangul Syllable */
- [0xaf5e, 0xaf5e], /* Hangul Syllable */
- [0xaf5f, 0xaf5f], /* Hangul Syllable */
- [0xaf60, 0xaf60], /* Hangul Syllable */
- [0xaf61, 0xaf61], /* Hangul Syllable */
- [0xaf62, 0xaf62], /* Hangul Syllable */
- [0xaf63, 0xaf63], /* Hangul Syllable */
- [0xaf64, 0xaf64], /* Hangul Syllable */
- [0xaf65, 0xaf65], /* Hangul Syllable */
- [0xaf66, 0xaf66], /* Hangul Syllable */
- [0xaf67, 0xaf67], /* Hangul Syllable */
- [0xaf68, 0xaf68], /* Hangul Syllable */
- [0xaf69, 0xaf69], /* Hangul Syllable */
- [0xaf6a, 0xaf6a], /* Hangul Syllable */
- [0xaf6b, 0xaf6b], /* Hangul Syllable */
- [0xaf6c, 0xaf6c], /* Hangul Syllable */
- [0xaf6d, 0xaf6d], /* Hangul Syllable */
- [0xaf6e, 0xaf6e], /* Hangul Syllable */
- [0xaf6f, 0xaf6f], /* Hangul Syllable */
- [0xaf70, 0xaf70], /* Hangul Syllable */
- [0xaf71, 0xaf71], /* Hangul Syllable */
- [0xaf72, 0xaf72], /* Hangul Syllable */
- [0xaf73, 0xaf73], /* Hangul Syllable */
- [0xaf74, 0xaf74], /* Hangul Syllable */
- [0xaf75, 0xaf75], /* Hangul Syllable */
- [0xaf76, 0xaf76], /* Hangul Syllable */
- [0xaf77, 0xaf77], /* Hangul Syllable */
- [0xaf78, 0xaf78], /* Hangul Syllable */
- [0xaf79, 0xaf79], /* Hangul Syllable */
- [0xaf7a, 0xaf7a], /* Hangul Syllable */
- [0xaf7b, 0xaf7b], /* Hangul Syllable */
- [0xaf7c, 0xaf7c], /* Hangul Syllable */
- [0xaf7d, 0xaf7d], /* Hangul Syllable */
- [0xaf7e, 0xaf7e], /* Hangul Syllable */
- [0xaf7f, 0xaf7f], /* Hangul Syllable */
- [0xaf80, 0xaf80], /* Hangul Syllable */
- [0xaf81, 0xaf81], /* Hangul Syllable */
- [0xaf82, 0xaf82], /* Hangul Syllable */
- [0xaf83, 0xaf83], /* Hangul Syllable */
- [0xaf84, 0xaf84], /* Hangul Syllable */
- [0xaf85, 0xaf85], /* Hangul Syllable */
- [0xaf86, 0xaf86], /* Hangul Syllable */
- [0xaf87, 0xaf87], /* Hangul Syllable */
- [0xaf88, 0xaf88], /* Hangul Syllable */
- [0xaf89, 0xaf89], /* Hangul Syllable */
- [0xaf8a, 0xaf8a], /* Hangul Syllable */
- [0xaf8b, 0xaf8b], /* Hangul Syllable */
- [0xaf8c, 0xaf8c], /* Hangul Syllable */
- [0xaf8d, 0xaf8d], /* Hangul Syllable */
- [0xaf8e, 0xaf8e], /* Hangul Syllable */
- [0xaf8f, 0xaf8f], /* Hangul Syllable */
- [0xaf90, 0xaf90], /* Hangul Syllable */
- [0xaf91, 0xaf91], /* Hangul Syllable */
- [0xaf92, 0xaf92], /* Hangul Syllable */
- [0xaf93, 0xaf93], /* Hangul Syllable */
- [0xaf94, 0xaf94], /* Hangul Syllable */
- [0xaf95, 0xaf95], /* Hangul Syllable */
- [0xaf96, 0xaf96], /* Hangul Syllable */
- [0xaf97, 0xaf97], /* Hangul Syllable */
- [0xaf98, 0xaf98], /* Hangul Syllable */
- [0xaf99, 0xaf99], /* Hangul Syllable */
- [0xaf9a, 0xaf9a], /* Hangul Syllable */
- [0xaf9b, 0xaf9b], /* Hangul Syllable */
- [0xaf9c, 0xaf9c], /* Hangul Syllable */
- [0xaf9d, 0xaf9d], /* Hangul Syllable */
- [0xaf9e, 0xaf9e], /* Hangul Syllable */
- [0xaf9f, 0xaf9f], /* Hangul Syllable */
- [0xafa0, 0xafa0], /* Hangul Syllable */
- [0xafa1, 0xafa1], /* Hangul Syllable */
- [0xafa2, 0xafa2], /* Hangul Syllable */
- [0xafa3, 0xafa3], /* Hangul Syllable */
- [0xafa4, 0xafa4], /* Hangul Syllable */
- [0xafa5, 0xafa5], /* Hangul Syllable */
- [0xafa6, 0xafa6], /* Hangul Syllable */
- [0xafa7, 0xafa7], /* Hangul Syllable */
- [0xafa8, 0xafa8], /* Hangul Syllable */
- [0xafa9, 0xafa9], /* Hangul Syllable */
- [0xafaa, 0xafaa], /* Hangul Syllable */
- [0xafab, 0xafab], /* Hangul Syllable */
- [0xafac, 0xafac], /* Hangul Syllable */
- [0xafad, 0xafad], /* Hangul Syllable */
- [0xafae, 0xafae], /* Hangul Syllable */
- [0xafaf, 0xafaf], /* Hangul Syllable */
- [0xafb0, 0xafb0], /* Hangul Syllable */
- [0xafb1, 0xafb1], /* Hangul Syllable */
- [0xafb2, 0xafb2], /* Hangul Syllable */
- [0xafb3, 0xafb3], /* Hangul Syllable */
- [0xafb4, 0xafb4], /* Hangul Syllable */
- [0xafb5, 0xafb5], /* Hangul Syllable */
- [0xafb6, 0xafb6], /* Hangul Syllable */
- [0xafb7, 0xafb7], /* Hangul Syllable */
- [0xafb8, 0xafb8], /* Hangul Syllable */
- [0xafb9, 0xafb9], /* Hangul Syllable */
- [0xafba, 0xafba], /* Hangul Syllable */
- [0xafbb, 0xafbb], /* Hangul Syllable */
- [0xafbc, 0xafbc], /* Hangul Syllable */
- [0xafbd, 0xafbd], /* Hangul Syllable */
- [0xafbe, 0xafbe], /* Hangul Syllable */
- [0xafbf, 0xafbf], /* Hangul Syllable */
- [0xafc0, 0xafc0], /* Hangul Syllable */
- [0xafc1, 0xafc1], /* Hangul Syllable */
- [0xafc2, 0xafc2], /* Hangul Syllable */
- [0xafc3, 0xafc3], /* Hangul Syllable */
- [0xafc4, 0xafc4], /* Hangul Syllable */
- [0xafc5, 0xafc5], /* Hangul Syllable */
- [0xafc6, 0xafc6], /* Hangul Syllable */
- [0xafc7, 0xafc7], /* Hangul Syllable */
- [0xafc8, 0xafc8], /* Hangul Syllable */
- [0xafc9, 0xafc9], /* Hangul Syllable */
- [0xafca, 0xafca], /* Hangul Syllable */
- [0xafcb, 0xafcb], /* Hangul Syllable */
- [0xafcc, 0xafcc], /* Hangul Syllable */
- [0xafcd, 0xafcd], /* Hangul Syllable */
- [0xafce, 0xafce], /* Hangul Syllable */
- [0xafcf, 0xafcf], /* Hangul Syllable */
- [0xafd0, 0xafd0], /* Hangul Syllable */
- [0xafd1, 0xafd1], /* Hangul Syllable */
- [0xafd2, 0xafd2], /* Hangul Syllable */
- [0xafd3, 0xafd3], /* Hangul Syllable */
- [0xafd4, 0xafd4], /* Hangul Syllable */
- [0xafd5, 0xafd5], /* Hangul Syllable */
- [0xafd6, 0xafd6], /* Hangul Syllable */
- [0xafd7, 0xafd7], /* Hangul Syllable */
- [0xafd8, 0xafd8], /* Hangul Syllable */
- [0xafd9, 0xafd9], /* Hangul Syllable */
- [0xafda, 0xafda], /* Hangul Syllable */
- [0xafdb, 0xafdb], /* Hangul Syllable */
- [0xafdc, 0xafdc], /* Hangul Syllable */
- [0xafdd, 0xafdd], /* Hangul Syllable */
- [0xafde, 0xafde], /* Hangul Syllable */
- [0xafdf, 0xafdf], /* Hangul Syllable */
- [0xafe0, 0xafe0], /* Hangul Syllable */
- [0xafe1, 0xafe1], /* Hangul Syllable */
- [0xafe2, 0xafe2], /* Hangul Syllable */
- [0xafe3, 0xafe3], /* Hangul Syllable */
- [0xafe4, 0xafe4], /* Hangul Syllable */
- [0xafe5, 0xafe5], /* Hangul Syllable */
- [0xafe6, 0xafe6], /* Hangul Syllable */
- [0xafe7, 0xafe7], /* Hangul Syllable */
- [0xafe8, 0xafe8], /* Hangul Syllable */
- [0xafe9, 0xafe9], /* Hangul Syllable */
- [0xafea, 0xafea], /* Hangul Syllable */
- [0xafeb, 0xafeb], /* Hangul Syllable */
- [0xafec, 0xafec], /* Hangul Syllable */
- [0xafed, 0xafed], /* Hangul Syllable */
- [0xafee, 0xafee], /* Hangul Syllable */
- [0xafef, 0xafef], /* Hangul Syllable */
- [0xaff0, 0xaff0], /* Hangul Syllable */
- [0xaff1, 0xaff1], /* Hangul Syllable */
- [0xaff2, 0xaff2], /* Hangul Syllable */
- [0xaff3, 0xaff3], /* Hangul Syllable */
- [0xaff4, 0xaff4], /* Hangul Syllable */
- [0xaff5, 0xaff5], /* Hangul Syllable */
- [0xaff6, 0xaff6], /* Hangul Syllable */
- [0xaff7, 0xaff7], /* Hangul Syllable */
- [0xaff8, 0xaff8], /* Hangul Syllable */
- [0xaff9, 0xaff9], /* Hangul Syllable */
- [0xaffa, 0xaffa], /* Hangul Syllable */
- [0xaffb, 0xaffb], /* Hangul Syllable */
- [0xaffc, 0xaffc], /* Hangul Syllable */
- [0xaffd, 0xaffd], /* Hangul Syllable */
- [0xaffe, 0xaffe], /* Hangul Syllable */
- [0xafff, 0xafff], /* Hangul Syllable */
- [0xb000, 0xb000], /* Hangul Syllable */
- [0xb001, 0xb001], /* Hangul Syllable */
- [0xb002, 0xb002], /* Hangul Syllable */
- [0xb003, 0xb003], /* Hangul Syllable */
- [0xb004, 0xb004], /* Hangul Syllable */
- [0xb005, 0xb005], /* Hangul Syllable */
- [0xb006, 0xb006], /* Hangul Syllable */
- [0xb007, 0xb007], /* Hangul Syllable */
- [0xb008, 0xb008], /* Hangul Syllable */
- [0xb009, 0xb009], /* Hangul Syllable */
- [0xb00a, 0xb00a], /* Hangul Syllable */
- [0xb00b, 0xb00b], /* Hangul Syllable */
- [0xb00c, 0xb00c], /* Hangul Syllable */
- [0xb00d, 0xb00d], /* Hangul Syllable */
- [0xb00e, 0xb00e], /* Hangul Syllable */
- [0xb00f, 0xb00f], /* Hangul Syllable */
- [0xb010, 0xb010], /* Hangul Syllable */
- [0xb011, 0xb011], /* Hangul Syllable */
- [0xb012, 0xb012], /* Hangul Syllable */
- [0xb013, 0xb013], /* Hangul Syllable */
- [0xb014, 0xb014], /* Hangul Syllable */
- [0xb015, 0xb015], /* Hangul Syllable */
- [0xb016, 0xb016], /* Hangul Syllable */
- [0xb017, 0xb017], /* Hangul Syllable */
- [0xb018, 0xb018], /* Hangul Syllable */
- [0xb019, 0xb019], /* Hangul Syllable */
- [0xb01a, 0xb01a], /* Hangul Syllable */
- [0xb01b, 0xb01b], /* Hangul Syllable */
- [0xb01c, 0xb01c], /* Hangul Syllable */
- [0xb01d, 0xb01d], /* Hangul Syllable */
- [0xb01e, 0xb01e], /* Hangul Syllable */
- [0xb01f, 0xb01f], /* Hangul Syllable */
- [0xb020, 0xb020], /* Hangul Syllable */
- [0xb021, 0xb021], /* Hangul Syllable */
- [0xb022, 0xb022], /* Hangul Syllable */
- [0xb023, 0xb023], /* Hangul Syllable */
- [0xb024, 0xb024], /* Hangul Syllable */
- [0xb025, 0xb025], /* Hangul Syllable */
- [0xb026, 0xb026], /* Hangul Syllable */
- [0xb027, 0xb027], /* Hangul Syllable */
- [0xb028, 0xb028], /* Hangul Syllable */
- [0xb029, 0xb029], /* Hangul Syllable */
- [0xb02a, 0xb02a], /* Hangul Syllable */
- [0xb02b, 0xb02b], /* Hangul Syllable */
- [0xb02c, 0xb02c], /* Hangul Syllable */
- [0xb02d, 0xb02d], /* Hangul Syllable */
- [0xb02e, 0xb02e], /* Hangul Syllable */
- [0xb02f, 0xb02f], /* Hangul Syllable */
- [0xb030, 0xb030], /* Hangul Syllable */
- [0xb031, 0xb031], /* Hangul Syllable */
- [0xb032, 0xb032], /* Hangul Syllable */
- [0xb033, 0xb033], /* Hangul Syllable */
- [0xb034, 0xb034], /* Hangul Syllable */
- [0xb035, 0xb035], /* Hangul Syllable */
- [0xb036, 0xb036], /* Hangul Syllable */
- [0xb037, 0xb037], /* Hangul Syllable */
- [0xb038, 0xb038], /* Hangul Syllable */
- [0xb039, 0xb039], /* Hangul Syllable */
- [0xb03a, 0xb03a], /* Hangul Syllable */
- [0xb03b, 0xb03b], /* Hangul Syllable */
- [0xb03c, 0xb03c], /* Hangul Syllable */
- [0xb03d, 0xb03d], /* Hangul Syllable */
- [0xb03e, 0xb03e], /* Hangul Syllable */
- [0xb03f, 0xb03f], /* Hangul Syllable */
- [0xb040, 0xb040], /* Hangul Syllable */
- [0xb041, 0xb041], /* Hangul Syllable */
- [0xb042, 0xb042], /* Hangul Syllable */
- [0xb043, 0xb043], /* Hangul Syllable */
- [0xb044, 0xb044], /* Hangul Syllable */
- [0xb045, 0xb045], /* Hangul Syllable */
- [0xb046, 0xb046], /* Hangul Syllable */
- [0xb047, 0xb047], /* Hangul Syllable */
- [0xb048, 0xb048], /* Hangul Syllable */
- [0xb049, 0xb049], /* Hangul Syllable */
- [0xb04a, 0xb04a], /* Hangul Syllable */
- [0xb04b, 0xb04b], /* Hangul Syllable */
- [0xb04c, 0xb04c], /* Hangul Syllable */
- [0xb04d, 0xb04d], /* Hangul Syllable */
- [0xb04e, 0xb04e], /* Hangul Syllable */
- [0xb04f, 0xb04f], /* Hangul Syllable */
- [0xb050, 0xb050], /* Hangul Syllable */
- [0xb051, 0xb051], /* Hangul Syllable */
- [0xb052, 0xb052], /* Hangul Syllable */
- [0xb053, 0xb053], /* Hangul Syllable */
- [0xb054, 0xb054], /* Hangul Syllable */
- [0xb055, 0xb055], /* Hangul Syllable */
- [0xb056, 0xb056], /* Hangul Syllable */
- [0xb057, 0xb057], /* Hangul Syllable */
- [0xb058, 0xb058], /* Hangul Syllable */
- [0xb059, 0xb059], /* Hangul Syllable */
- [0xb05a, 0xb05a], /* Hangul Syllable */
- [0xb05b, 0xb05b], /* Hangul Syllable */
- [0xb05c, 0xb05c], /* Hangul Syllable */
- [0xb05d, 0xb05d], /* Hangul Syllable */
- [0xb05e, 0xb05e], /* Hangul Syllable */
- [0xb05f, 0xb05f], /* Hangul Syllable */
- [0xb060, 0xb060], /* Hangul Syllable */
- [0xb061, 0xb061], /* Hangul Syllable */
- [0xb062, 0xb062], /* Hangul Syllable */
- [0xb063, 0xb063], /* Hangul Syllable */
- [0xb064, 0xb064], /* Hangul Syllable */
- [0xb065, 0xb065], /* Hangul Syllable */
- [0xb066, 0xb066], /* Hangul Syllable */
- [0xb067, 0xb067], /* Hangul Syllable */
- [0xb068, 0xb068], /* Hangul Syllable */
- [0xb069, 0xb069], /* Hangul Syllable */
- [0xb06a, 0xb06a], /* Hangul Syllable */
- [0xb06b, 0xb06b], /* Hangul Syllable */
- [0xb06c, 0xb06c], /* Hangul Syllable */
- [0xb06d, 0xb06d], /* Hangul Syllable */
- [0xb06e, 0xb06e], /* Hangul Syllable */
- [0xb06f, 0xb06f], /* Hangul Syllable */
- [0xb070, 0xb070], /* Hangul Syllable */
- [0xb071, 0xb071], /* Hangul Syllable */
- [0xb072, 0xb072], /* Hangul Syllable */
- [0xb073, 0xb073], /* Hangul Syllable */
- [0xb074, 0xb074], /* Hangul Syllable */
- [0xb075, 0xb075], /* Hangul Syllable */
- [0xb076, 0xb076], /* Hangul Syllable */
- [0xb077, 0xb077], /* Hangul Syllable */
- [0xb078, 0xb078], /* Hangul Syllable */
- [0xb079, 0xb079], /* Hangul Syllable */
- [0xb07a, 0xb07a], /* Hangul Syllable */
- [0xb07b, 0xb07b], /* Hangul Syllable */
- [0xb07c, 0xb07c], /* Hangul Syllable */
- [0xb07d, 0xb07d], /* Hangul Syllable */
- [0xb07e, 0xb07e], /* Hangul Syllable */
- [0xb07f, 0xb07f], /* Hangul Syllable */
- [0xb080, 0xb080], /* Hangul Syllable */
- [0xb081, 0xb081], /* Hangul Syllable */
- [0xb082, 0xb082], /* Hangul Syllable */
- [0xb083, 0xb083], /* Hangul Syllable */
- [0xb084, 0xb084], /* Hangul Syllable */
- [0xb085, 0xb085], /* Hangul Syllable */
- [0xb086, 0xb086], /* Hangul Syllable */
- [0xb087, 0xb087], /* Hangul Syllable */
- [0xb088, 0xb088], /* Hangul Syllable */
- [0xb089, 0xb089], /* Hangul Syllable */
- [0xb08a, 0xb08a], /* Hangul Syllable */
- [0xb08b, 0xb08b], /* Hangul Syllable */
- [0xb08c, 0xb08c], /* Hangul Syllable */
- [0xb08d, 0xb08d], /* Hangul Syllable */
- [0xb08e, 0xb08e], /* Hangul Syllable */
- [0xb08f, 0xb08f], /* Hangul Syllable */
- [0xb090, 0xb090], /* Hangul Syllable */
- [0xb091, 0xb091], /* Hangul Syllable */
- [0xb092, 0xb092], /* Hangul Syllable */
- [0xb093, 0xb093], /* Hangul Syllable */
- [0xb094, 0xb094], /* Hangul Syllable */
- [0xb095, 0xb095], /* Hangul Syllable */
- [0xb096, 0xb096], /* Hangul Syllable */
- [0xb097, 0xb097], /* Hangul Syllable */
- [0xb098, 0xb098], /* Hangul Syllable */
- [0xb099, 0xb099], /* Hangul Syllable */
- [0xb09a, 0xb09a], /* Hangul Syllable */
- [0xb09b, 0xb09b], /* Hangul Syllable */
- [0xb09c, 0xb09c], /* Hangul Syllable */
- [0xb09d, 0xb09d], /* Hangul Syllable */
- [0xb09e, 0xb09e], /* Hangul Syllable */
- [0xb09f, 0xb09f], /* Hangul Syllable */
- [0xb0a0, 0xb0a0], /* Hangul Syllable */
- [0xb0a1, 0xb0a1], /* Hangul Syllable */
- [0xb0a2, 0xb0a2], /* Hangul Syllable */
- [0xb0a3, 0xb0a3], /* Hangul Syllable */
- [0xb0a4, 0xb0a4], /* Hangul Syllable */
- [0xb0a5, 0xb0a5], /* Hangul Syllable */
- [0xb0a6, 0xb0a6], /* Hangul Syllable */
- [0xb0a7, 0xb0a7], /* Hangul Syllable */
- [0xb0a8, 0xb0a8], /* Hangul Syllable */
- [0xb0a9, 0xb0a9], /* Hangul Syllable */
- [0xb0aa, 0xb0aa], /* Hangul Syllable */
- [0xb0ab, 0xb0ab], /* Hangul Syllable */
- [0xb0ac, 0xb0ac], /* Hangul Syllable */
- [0xb0ad, 0xb0ad], /* Hangul Syllable */
- [0xb0ae, 0xb0ae], /* Hangul Syllable */
- [0xb0af, 0xb0af], /* Hangul Syllable */
- [0xb0b0, 0xb0b0], /* Hangul Syllable */
- [0xb0b1, 0xb0b1], /* Hangul Syllable */
- [0xb0b2, 0xb0b2], /* Hangul Syllable */
- [0xb0b3, 0xb0b3], /* Hangul Syllable */
- [0xb0b4, 0xb0b4], /* Hangul Syllable */
- [0xb0b5, 0xb0b5], /* Hangul Syllable */
- [0xb0b6, 0xb0b6], /* Hangul Syllable */
- [0xb0b7, 0xb0b7], /* Hangul Syllable */
- [0xb0b8, 0xb0b8], /* Hangul Syllable */
- [0xb0b9, 0xb0b9], /* Hangul Syllable */
- [0xb0ba, 0xb0ba], /* Hangul Syllable */
- [0xb0bb, 0xb0bb], /* Hangul Syllable */
- [0xb0bc, 0xb0bc], /* Hangul Syllable */
- [0xb0bd, 0xb0bd], /* Hangul Syllable */
- [0xb0be, 0xb0be], /* Hangul Syllable */
- [0xb0bf, 0xb0bf], /* Hangul Syllable */
- [0xb0c0, 0xb0c0], /* Hangul Syllable */
- [0xb0c1, 0xb0c1], /* Hangul Syllable */
- [0xb0c2, 0xb0c2], /* Hangul Syllable */
- [0xb0c3, 0xb0c3], /* Hangul Syllable */
- [0xb0c4, 0xb0c4], /* Hangul Syllable */
- [0xb0c5, 0xb0c5], /* Hangul Syllable */
- [0xb0c6, 0xb0c6], /* Hangul Syllable */
- [0xb0c7, 0xb0c7], /* Hangul Syllable */
- [0xb0c8, 0xb0c8], /* Hangul Syllable */
- [0xb0c9, 0xb0c9], /* Hangul Syllable */
- [0xb0ca, 0xb0ca], /* Hangul Syllable */
- [0xb0cb, 0xb0cb], /* Hangul Syllable */
- [0xb0cc, 0xb0cc], /* Hangul Syllable */
- [0xb0cd, 0xb0cd], /* Hangul Syllable */
- [0xb0ce, 0xb0ce], /* Hangul Syllable */
- [0xb0cf, 0xb0cf], /* Hangul Syllable */
- [0xb0d0, 0xb0d0], /* Hangul Syllable */
- [0xb0d1, 0xb0d1], /* Hangul Syllable */
- [0xb0d2, 0xb0d2], /* Hangul Syllable */
- [0xb0d3, 0xb0d3], /* Hangul Syllable */
- [0xb0d4, 0xb0d4], /* Hangul Syllable */
- [0xb0d5, 0xb0d5], /* Hangul Syllable */
- [0xb0d6, 0xb0d6], /* Hangul Syllable */
- [0xb0d7, 0xb0d7], /* Hangul Syllable */
- [0xb0d8, 0xb0d8], /* Hangul Syllable */
- [0xb0d9, 0xb0d9], /* Hangul Syllable */
- [0xb0da, 0xb0da], /* Hangul Syllable */
- [0xb0db, 0xb0db], /* Hangul Syllable */
- [0xb0dc, 0xb0dc], /* Hangul Syllable */
- [0xb0dd, 0xb0dd], /* Hangul Syllable */
- [0xb0de, 0xb0de], /* Hangul Syllable */
- [0xb0df, 0xb0df], /* Hangul Syllable */
- [0xb0e0, 0xb0e0], /* Hangul Syllable */
- [0xb0e1, 0xb0e1], /* Hangul Syllable */
- [0xb0e2, 0xb0e2], /* Hangul Syllable */
- [0xb0e3, 0xb0e3], /* Hangul Syllable */
- [0xb0e4, 0xb0e4], /* Hangul Syllable */
- [0xb0e5, 0xb0e5], /* Hangul Syllable */
- [0xb0e6, 0xb0e6], /* Hangul Syllable */
- [0xb0e7, 0xb0e7], /* Hangul Syllable */
- [0xb0e8, 0xb0e8], /* Hangul Syllable */
- [0xb0e9, 0xb0e9], /* Hangul Syllable */
- [0xb0ea, 0xb0ea], /* Hangul Syllable */
- [0xb0eb, 0xb0eb], /* Hangul Syllable */
- [0xb0ec, 0xb0ec], /* Hangul Syllable */
- [0xb0ed, 0xb0ed], /* Hangul Syllable */
- [0xb0ee, 0xb0ee], /* Hangul Syllable */
- [0xb0ef, 0xb0ef], /* Hangul Syllable */
- [0xb0f0, 0xb0f0], /* Hangul Syllable */
- [0xb0f1, 0xb0f1], /* Hangul Syllable */
- [0xb0f2, 0xb0f2], /* Hangul Syllable */
- [0xb0f3, 0xb0f3], /* Hangul Syllable */
- [0xb0f4, 0xb0f4], /* Hangul Syllable */
- [0xb0f5, 0xb0f5], /* Hangul Syllable */
- [0xb0f6, 0xb0f6], /* Hangul Syllable */
- [0xb0f7, 0xb0f7], /* Hangul Syllable */
- [0xb0f8, 0xb0f8], /* Hangul Syllable */
- [0xb0f9, 0xb0f9], /* Hangul Syllable */
- [0xb0fa, 0xb0fa], /* Hangul Syllable */
- [0xb0fb, 0xb0fb], /* Hangul Syllable */
- [0xb0fc, 0xb0fc], /* Hangul Syllable */
- [0xb0fd, 0xb0fd], /* Hangul Syllable */
- [0xb0fe, 0xb0fe], /* Hangul Syllable */
- [0xb0ff, 0xb0ff], /* Hangul Syllable */
- [0xb100, 0xb100], /* Hangul Syllable */
- [0xb101, 0xb101], /* Hangul Syllable */
- [0xb102, 0xb102], /* Hangul Syllable */
- [0xb103, 0xb103], /* Hangul Syllable */
- [0xb104, 0xb104], /* Hangul Syllable */
- [0xb105, 0xb105], /* Hangul Syllable */
- [0xb106, 0xb106], /* Hangul Syllable */
- [0xb107, 0xb107], /* Hangul Syllable */
- [0xb108, 0xb108], /* Hangul Syllable */
- [0xb109, 0xb109], /* Hangul Syllable */
- [0xb10a, 0xb10a], /* Hangul Syllable */
- [0xb10b, 0xb10b], /* Hangul Syllable */
- [0xb10c, 0xb10c], /* Hangul Syllable */
- [0xb10d, 0xb10d], /* Hangul Syllable */
- [0xb10e, 0xb10e], /* Hangul Syllable */
- [0xb10f, 0xb10f], /* Hangul Syllable */
- [0xb110, 0xb110], /* Hangul Syllable */
- [0xb111, 0xb111], /* Hangul Syllable */
- [0xb112, 0xb112], /* Hangul Syllable */
- [0xb113, 0xb113], /* Hangul Syllable */
- [0xb114, 0xb114], /* Hangul Syllable */
- [0xb115, 0xb115], /* Hangul Syllable */
- [0xb116, 0xb116], /* Hangul Syllable */
- [0xb117, 0xb117], /* Hangul Syllable */
- [0xb118, 0xb118], /* Hangul Syllable */
- [0xb119, 0xb119], /* Hangul Syllable */
- [0xb11a, 0xb11a], /* Hangul Syllable */
- [0xb11b, 0xb11b], /* Hangul Syllable */
- [0xb11c, 0xb11c], /* Hangul Syllable */
- [0xb11d, 0xb11d], /* Hangul Syllable */
- [0xb11e, 0xb11e], /* Hangul Syllable */
- [0xb11f, 0xb11f], /* Hangul Syllable */
- [0xb120, 0xb120], /* Hangul Syllable */
- [0xb121, 0xb121], /* Hangul Syllable */
- [0xb122, 0xb122], /* Hangul Syllable */
- [0xb123, 0xb123], /* Hangul Syllable */
- [0xb124, 0xb124], /* Hangul Syllable */
- [0xb125, 0xb125], /* Hangul Syllable */
- [0xb126, 0xb126], /* Hangul Syllable */
- [0xb127, 0xb127], /* Hangul Syllable */
- [0xb128, 0xb128], /* Hangul Syllable */
- [0xb129, 0xb129], /* Hangul Syllable */
- [0xb12a, 0xb12a], /* Hangul Syllable */
- [0xb12b, 0xb12b], /* Hangul Syllable */
- [0xb12c, 0xb12c], /* Hangul Syllable */
- [0xb12d, 0xb12d], /* Hangul Syllable */
- [0xb12e, 0xb12e], /* Hangul Syllable */
- [0xb12f, 0xb12f], /* Hangul Syllable */
- [0xb130, 0xb130], /* Hangul Syllable */
- [0xb131, 0xb131], /* Hangul Syllable */
- [0xb132, 0xb132], /* Hangul Syllable */
- [0xb133, 0xb133], /* Hangul Syllable */
- [0xb134, 0xb134], /* Hangul Syllable */
- [0xb135, 0xb135], /* Hangul Syllable */
- [0xb136, 0xb136], /* Hangul Syllable */
- [0xb137, 0xb137], /* Hangul Syllable */
- [0xb138, 0xb138], /* Hangul Syllable */
- [0xb139, 0xb139], /* Hangul Syllable */
- [0xb13a, 0xb13a], /* Hangul Syllable */
- [0xb13b, 0xb13b], /* Hangul Syllable */
- [0xb13c, 0xb13c], /* Hangul Syllable */
- [0xb13d, 0xb13d], /* Hangul Syllable */
- [0xb13e, 0xb13e], /* Hangul Syllable */
- [0xb13f, 0xb13f], /* Hangul Syllable */
- [0xb140, 0xb140], /* Hangul Syllable */
- [0xb141, 0xb141], /* Hangul Syllable */
- [0xb142, 0xb142], /* Hangul Syllable */
- [0xb143, 0xb143], /* Hangul Syllable */
- [0xb144, 0xb144], /* Hangul Syllable */
- [0xb145, 0xb145], /* Hangul Syllable */
- [0xb146, 0xb146], /* Hangul Syllable */
- [0xb147, 0xb147], /* Hangul Syllable */
- [0xb148, 0xb148], /* Hangul Syllable */
- [0xb149, 0xb149], /* Hangul Syllable */
- [0xb14a, 0xb14a], /* Hangul Syllable */
- [0xb14b, 0xb14b], /* Hangul Syllable */
- [0xb14c, 0xb14c], /* Hangul Syllable */
- [0xb14d, 0xb14d], /* Hangul Syllable */
- [0xb14e, 0xb14e], /* Hangul Syllable */
- [0xb14f, 0xb14f], /* Hangul Syllable */
- [0xb150, 0xb150], /* Hangul Syllable */
- [0xb151, 0xb151], /* Hangul Syllable */
- [0xb152, 0xb152], /* Hangul Syllable */
- [0xb153, 0xb153], /* Hangul Syllable */
- [0xb154, 0xb154], /* Hangul Syllable */
- [0xb155, 0xb155], /* Hangul Syllable */
- [0xb156, 0xb156], /* Hangul Syllable */
- [0xb157, 0xb157], /* Hangul Syllable */
- [0xb158, 0xb158], /* Hangul Syllable */
- [0xb159, 0xb159], /* Hangul Syllable */
- [0xb15a, 0xb15a], /* Hangul Syllable */
- [0xb15b, 0xb15b], /* Hangul Syllable */
- [0xb15c, 0xb15c], /* Hangul Syllable */
- [0xb15d, 0xb15d], /* Hangul Syllable */
- [0xb15e, 0xb15e], /* Hangul Syllable */
- [0xb15f, 0xb15f], /* Hangul Syllable */
- [0xb160, 0xb160], /* Hangul Syllable */
- [0xb161, 0xb161], /* Hangul Syllable */
- [0xb162, 0xb162], /* Hangul Syllable */
- [0xb163, 0xb163], /* Hangul Syllable */
- [0xb164, 0xb164], /* Hangul Syllable */
- [0xb165, 0xb165], /* Hangul Syllable */
- [0xb166, 0xb166], /* Hangul Syllable */
- [0xb167, 0xb167], /* Hangul Syllable */
- [0xb168, 0xb168], /* Hangul Syllable */
- [0xb169, 0xb169], /* Hangul Syllable */
- [0xb16a, 0xb16a], /* Hangul Syllable */
- [0xb16b, 0xb16b], /* Hangul Syllable */
- [0xb16c, 0xb16c], /* Hangul Syllable */
- [0xb16d, 0xb16d], /* Hangul Syllable */
- [0xb16e, 0xb16e], /* Hangul Syllable */
- [0xb16f, 0xb16f], /* Hangul Syllable */
- [0xb170, 0xb170], /* Hangul Syllable */
- [0xb171, 0xb171], /* Hangul Syllable */
- [0xb172, 0xb172], /* Hangul Syllable */
- [0xb173, 0xb173], /* Hangul Syllable */
- [0xb174, 0xb174], /* Hangul Syllable */
- [0xb175, 0xb175], /* Hangul Syllable */
- [0xb176, 0xb176], /* Hangul Syllable */
- [0xb177, 0xb177], /* Hangul Syllable */
- [0xb178, 0xb178], /* Hangul Syllable */
- [0xb179, 0xb179], /* Hangul Syllable */
- [0xb17a, 0xb17a], /* Hangul Syllable */
- [0xb17b, 0xb17b], /* Hangul Syllable */
- [0xb17c, 0xb17c], /* Hangul Syllable */
- [0xb17d, 0xb17d], /* Hangul Syllable */
- [0xb17e, 0xb17e], /* Hangul Syllable */
- [0xb17f, 0xb17f], /* Hangul Syllable */
- [0xb180, 0xb180], /* Hangul Syllable */
- [0xb181, 0xb181], /* Hangul Syllable */
- [0xb182, 0xb182], /* Hangul Syllable */
- [0xb183, 0xb183], /* Hangul Syllable */
- [0xb184, 0xb184], /* Hangul Syllable */
- [0xb185, 0xb185], /* Hangul Syllable */
- [0xb186, 0xb186], /* Hangul Syllable */
- [0xb187, 0xb187], /* Hangul Syllable */
- [0xb188, 0xb188], /* Hangul Syllable */
- [0xb189, 0xb189], /* Hangul Syllable */
- [0xb18a, 0xb18a], /* Hangul Syllable */
- [0xb18b, 0xb18b], /* Hangul Syllable */
- [0xb18c, 0xb18c], /* Hangul Syllable */
- [0xb18d, 0xb18d], /* Hangul Syllable */
- [0xb18e, 0xb18e], /* Hangul Syllable */
- [0xb18f, 0xb18f], /* Hangul Syllable */
- [0xb190, 0xb190], /* Hangul Syllable */
- [0xb191, 0xb191], /* Hangul Syllable */
- [0xb192, 0xb192], /* Hangul Syllable */
- [0xb193, 0xb193], /* Hangul Syllable */
- [0xb194, 0xb194], /* Hangul Syllable */
- [0xb195, 0xb195], /* Hangul Syllable */
- [0xb196, 0xb196], /* Hangul Syllable */
- [0xb197, 0xb197], /* Hangul Syllable */
- [0xb198, 0xb198], /* Hangul Syllable */
- [0xb199, 0xb199], /* Hangul Syllable */
- [0xb19a, 0xb19a], /* Hangul Syllable */
- [0xb19b, 0xb19b], /* Hangul Syllable */
- [0xb19c, 0xb19c], /* Hangul Syllable */
- [0xb19d, 0xb19d], /* Hangul Syllable */
- [0xb19e, 0xb19e], /* Hangul Syllable */
- [0xb19f, 0xb19f], /* Hangul Syllable */
- [0xb1a0, 0xb1a0], /* Hangul Syllable */
- [0xb1a1, 0xb1a1], /* Hangul Syllable */
- [0xb1a2, 0xb1a2], /* Hangul Syllable */
- [0xb1a3, 0xb1a3], /* Hangul Syllable */
- [0xb1a4, 0xb1a4], /* Hangul Syllable */
- [0xb1a5, 0xb1a5], /* Hangul Syllable */
- [0xb1a6, 0xb1a6], /* Hangul Syllable */
- [0xb1a7, 0xb1a7], /* Hangul Syllable */
- [0xb1a8, 0xb1a8], /* Hangul Syllable */
- [0xb1a9, 0xb1a9], /* Hangul Syllable */
- [0xb1aa, 0xb1aa], /* Hangul Syllable */
- [0xb1ab, 0xb1ab], /* Hangul Syllable */
- [0xb1ac, 0xb1ac], /* Hangul Syllable */
- [0xb1ad, 0xb1ad], /* Hangul Syllable */
- [0xb1ae, 0xb1ae], /* Hangul Syllable */
- [0xb1af, 0xb1af], /* Hangul Syllable */
- [0xb1b0, 0xb1b0], /* Hangul Syllable */
- [0xb1b1, 0xb1b1], /* Hangul Syllable */
- [0xb1b2, 0xb1b2], /* Hangul Syllable */
- [0xb1b3, 0xb1b3], /* Hangul Syllable */
- [0xb1b4, 0xb1b4], /* Hangul Syllable */
- [0xb1b5, 0xb1b5], /* Hangul Syllable */
- [0xb1b6, 0xb1b6], /* Hangul Syllable */
- [0xb1b7, 0xb1b7], /* Hangul Syllable */
- [0xb1b8, 0xb1b8], /* Hangul Syllable */
- [0xb1b9, 0xb1b9], /* Hangul Syllable */
- [0xb1ba, 0xb1ba], /* Hangul Syllable */
- [0xb1bb, 0xb1bb], /* Hangul Syllable */
- [0xb1bc, 0xb1bc], /* Hangul Syllable */
- [0xb1bd, 0xb1bd], /* Hangul Syllable */
- [0xb1be, 0xb1be], /* Hangul Syllable */
- [0xb1bf, 0xb1bf], /* Hangul Syllable */
- [0xb1c0, 0xb1c0], /* Hangul Syllable */
- [0xb1c1, 0xb1c1], /* Hangul Syllable */
- [0xb1c2, 0xb1c2], /* Hangul Syllable */
- [0xb1c3, 0xb1c3], /* Hangul Syllable */
- [0xb1c4, 0xb1c4], /* Hangul Syllable */
- [0xb1c5, 0xb1c5], /* Hangul Syllable */
- [0xb1c6, 0xb1c6], /* Hangul Syllable */
- [0xb1c7, 0xb1c7], /* Hangul Syllable */
- [0xb1c8, 0xb1c8], /* Hangul Syllable */
- [0xb1c9, 0xb1c9], /* Hangul Syllable */
- [0xb1ca, 0xb1ca], /* Hangul Syllable */
- [0xb1cb, 0xb1cb], /* Hangul Syllable */
- [0xb1cc, 0xb1cc], /* Hangul Syllable */
- [0xb1cd, 0xb1cd], /* Hangul Syllable */
- [0xb1ce, 0xb1ce], /* Hangul Syllable */
- [0xb1cf, 0xb1cf], /* Hangul Syllable */
- [0xb1d0, 0xb1d0], /* Hangul Syllable */
- [0xb1d1, 0xb1d1], /* Hangul Syllable */
- [0xb1d2, 0xb1d2], /* Hangul Syllable */
- [0xb1d3, 0xb1d3], /* Hangul Syllable */
- [0xb1d4, 0xb1d4], /* Hangul Syllable */
- [0xb1d5, 0xb1d5], /* Hangul Syllable */
- [0xb1d6, 0xb1d6], /* Hangul Syllable */
- [0xb1d7, 0xb1d7], /* Hangul Syllable */
- [0xb1d8, 0xb1d8], /* Hangul Syllable */
- [0xb1d9, 0xb1d9], /* Hangul Syllable */
- [0xb1da, 0xb1da], /* Hangul Syllable */
- [0xb1db, 0xb1db], /* Hangul Syllable */
- [0xb1dc, 0xb1dc], /* Hangul Syllable */
- [0xb1dd, 0xb1dd], /* Hangul Syllable */
- [0xb1de, 0xb1de], /* Hangul Syllable */
- [0xb1df, 0xb1df], /* Hangul Syllable */
- [0xb1e0, 0xb1e0], /* Hangul Syllable */
- [0xb1e1, 0xb1e1], /* Hangul Syllable */
- [0xb1e2, 0xb1e2], /* Hangul Syllable */
- [0xb1e3, 0xb1e3], /* Hangul Syllable */
- [0xb1e4, 0xb1e4], /* Hangul Syllable */
- [0xb1e5, 0xb1e5], /* Hangul Syllable */
- [0xb1e6, 0xb1e6], /* Hangul Syllable */
- [0xb1e7, 0xb1e7], /* Hangul Syllable */
- [0xb1e8, 0xb1e8], /* Hangul Syllable */
- [0xb1e9, 0xb1e9], /* Hangul Syllable */
- [0xb1ea, 0xb1ea], /* Hangul Syllable */
- [0xb1eb, 0xb1eb], /* Hangul Syllable */
- [0xb1ec, 0xb1ec], /* Hangul Syllable */
- [0xb1ed, 0xb1ed], /* Hangul Syllable */
- [0xb1ee, 0xb1ee], /* Hangul Syllable */
- [0xb1ef, 0xb1ef], /* Hangul Syllable */
- [0xb1f0, 0xb1f0], /* Hangul Syllable */
- [0xb1f1, 0xb1f1], /* Hangul Syllable */
- [0xb1f2, 0xb1f2], /* Hangul Syllable */
- [0xb1f3, 0xb1f3], /* Hangul Syllable */
- [0xb1f4, 0xb1f4], /* Hangul Syllable */
- [0xb1f5, 0xb1f5], /* Hangul Syllable */
- [0xb1f6, 0xb1f6], /* Hangul Syllable */
- [0xb1f7, 0xb1f7], /* Hangul Syllable */
- [0xb1f8, 0xb1f8], /* Hangul Syllable */
- [0xb1f9, 0xb1f9], /* Hangul Syllable */
- [0xb1fa, 0xb1fa], /* Hangul Syllable */
- [0xb1fb, 0xb1fb], /* Hangul Syllable */
- [0xb1fc, 0xb1fc], /* Hangul Syllable */
- [0xb1fd, 0xb1fd], /* Hangul Syllable */
- [0xb1fe, 0xb1fe], /* Hangul Syllable */
- [0xb1ff, 0xb1ff], /* Hangul Syllable */
- [0xb200, 0xb200], /* Hangul Syllable */
- [0xb201, 0xb201], /* Hangul Syllable */
- [0xb202, 0xb202], /* Hangul Syllable */
- [0xb203, 0xb203], /* Hangul Syllable */
- [0xb204, 0xb204], /* Hangul Syllable */
- [0xb205, 0xb205], /* Hangul Syllable */
- [0xb206, 0xb206], /* Hangul Syllable */
- [0xb207, 0xb207], /* Hangul Syllable */
- [0xb208, 0xb208], /* Hangul Syllable */
- [0xb209, 0xb209], /* Hangul Syllable */
- [0xb20a, 0xb20a], /* Hangul Syllable */
- [0xb20b, 0xb20b], /* Hangul Syllable */
- [0xb20c, 0xb20c], /* Hangul Syllable */
- [0xb20d, 0xb20d], /* Hangul Syllable */
- [0xb20e, 0xb20e], /* Hangul Syllable */
- [0xb20f, 0xb20f], /* Hangul Syllable */
- [0xb210, 0xb210], /* Hangul Syllable */
- [0xb211, 0xb211], /* Hangul Syllable */
- [0xb212, 0xb212], /* Hangul Syllable */
- [0xb213, 0xb213], /* Hangul Syllable */
- [0xb214, 0xb214], /* Hangul Syllable */
- [0xb215, 0xb215], /* Hangul Syllable */
- [0xb216, 0xb216], /* Hangul Syllable */
- [0xb217, 0xb217], /* Hangul Syllable */
- [0xb218, 0xb218], /* Hangul Syllable */
- [0xb219, 0xb219], /* Hangul Syllable */
- [0xb21a, 0xb21a], /* Hangul Syllable */
- [0xb21b, 0xb21b], /* Hangul Syllable */
- [0xb21c, 0xb21c], /* Hangul Syllable */
- [0xb21d, 0xb21d], /* Hangul Syllable */
- [0xb21e, 0xb21e], /* Hangul Syllable */
- [0xb21f, 0xb21f], /* Hangul Syllable */
- [0xb220, 0xb220], /* Hangul Syllable */
- [0xb221, 0xb221], /* Hangul Syllable */
- [0xb222, 0xb222], /* Hangul Syllable */
- [0xb223, 0xb223], /* Hangul Syllable */
- [0xb224, 0xb224], /* Hangul Syllable */
- [0xb225, 0xb225], /* Hangul Syllable */
- [0xb226, 0xb226], /* Hangul Syllable */
- [0xb227, 0xb227], /* Hangul Syllable */
- [0xb228, 0xb228], /* Hangul Syllable */
- [0xb229, 0xb229], /* Hangul Syllable */
- [0xb22a, 0xb22a], /* Hangul Syllable */
- [0xb22b, 0xb22b], /* Hangul Syllable */
- [0xb22c, 0xb22c], /* Hangul Syllable */
- [0xb22d, 0xb22d], /* Hangul Syllable */
- [0xb22e, 0xb22e], /* Hangul Syllable */
- [0xb22f, 0xb22f], /* Hangul Syllable */
- [0xb230, 0xb230], /* Hangul Syllable */
- [0xb231, 0xb231], /* Hangul Syllable */
- [0xb232, 0xb232], /* Hangul Syllable */
- [0xb233, 0xb233], /* Hangul Syllable */
- [0xb234, 0xb234], /* Hangul Syllable */
- [0xb235, 0xb235], /* Hangul Syllable */
- [0xb236, 0xb236], /* Hangul Syllable */
- [0xb237, 0xb237], /* Hangul Syllable */
- [0xb238, 0xb238], /* Hangul Syllable */
- [0xb239, 0xb239], /* Hangul Syllable */
- [0xb23a, 0xb23a], /* Hangul Syllable */
- [0xb23b, 0xb23b], /* Hangul Syllable */
- [0xb23c, 0xb23c], /* Hangul Syllable */
- [0xb23d, 0xb23d], /* Hangul Syllable */
- [0xb23e, 0xb23e], /* Hangul Syllable */
- [0xb23f, 0xb23f], /* Hangul Syllable */
- [0xb240, 0xb240], /* Hangul Syllable */
- [0xb241, 0xb241], /* Hangul Syllable */
- [0xb242, 0xb242], /* Hangul Syllable */
- [0xb243, 0xb243], /* Hangul Syllable */
- [0xb244, 0xb244], /* Hangul Syllable */
- [0xb245, 0xb245], /* Hangul Syllable */
- [0xb246, 0xb246], /* Hangul Syllable */
- [0xb247, 0xb247], /* Hangul Syllable */
- [0xb248, 0xb248], /* Hangul Syllable */
- [0xb249, 0xb249], /* Hangul Syllable */
- [0xb24a, 0xb24a], /* Hangul Syllable */
- [0xb24b, 0xb24b], /* Hangul Syllable */
- [0xb24c, 0xb24c], /* Hangul Syllable */
- [0xb24d, 0xb24d], /* Hangul Syllable */
- [0xb24e, 0xb24e], /* Hangul Syllable */
- [0xb24f, 0xb24f], /* Hangul Syllable */
- [0xb250, 0xb250], /* Hangul Syllable */
- [0xb251, 0xb251], /* Hangul Syllable */
- [0xb252, 0xb252], /* Hangul Syllable */
- [0xb253, 0xb253], /* Hangul Syllable */
- [0xb254, 0xb254], /* Hangul Syllable */
- [0xb255, 0xb255], /* Hangul Syllable */
- [0xb256, 0xb256], /* Hangul Syllable */
- [0xb257, 0xb257], /* Hangul Syllable */
- [0xb258, 0xb258], /* Hangul Syllable */
- [0xb259, 0xb259], /* Hangul Syllable */
- [0xb25a, 0xb25a], /* Hangul Syllable */
- [0xb25b, 0xb25b], /* Hangul Syllable */
- [0xb25c, 0xb25c], /* Hangul Syllable */
- [0xb25d, 0xb25d], /* Hangul Syllable */
- [0xb25e, 0xb25e], /* Hangul Syllable */
- [0xb25f, 0xb25f], /* Hangul Syllable */
- [0xb260, 0xb260], /* Hangul Syllable */
- [0xb261, 0xb261], /* Hangul Syllable */
- [0xb262, 0xb262], /* Hangul Syllable */
- [0xb263, 0xb263], /* Hangul Syllable */
- [0xb264, 0xb264], /* Hangul Syllable */
- [0xb265, 0xb265], /* Hangul Syllable */
- [0xb266, 0xb266], /* Hangul Syllable */
- [0xb267, 0xb267], /* Hangul Syllable */
- [0xb268, 0xb268], /* Hangul Syllable */
- [0xb269, 0xb269], /* Hangul Syllable */
- [0xb26a, 0xb26a], /* Hangul Syllable */
- [0xb26b, 0xb26b], /* Hangul Syllable */
- [0xb26c, 0xb26c], /* Hangul Syllable */
- [0xb26d, 0xb26d], /* Hangul Syllable */
- [0xb26e, 0xb26e], /* Hangul Syllable */
- [0xb26f, 0xb26f], /* Hangul Syllable */
- [0xb270, 0xb270], /* Hangul Syllable */
- [0xb271, 0xb271], /* Hangul Syllable */
- [0xb272, 0xb272], /* Hangul Syllable */
- [0xb273, 0xb273], /* Hangul Syllable */
- [0xb274, 0xb274], /* Hangul Syllable */
- [0xb275, 0xb275], /* Hangul Syllable */
- [0xb276, 0xb276], /* Hangul Syllable */
- [0xb277, 0xb277], /* Hangul Syllable */
- [0xb278, 0xb278], /* Hangul Syllable */
- [0xb279, 0xb279], /* Hangul Syllable */
- [0xb27a, 0xb27a], /* Hangul Syllable */
- [0xb27b, 0xb27b], /* Hangul Syllable */
- [0xb27c, 0xb27c], /* Hangul Syllable */
- [0xb27d, 0xb27d], /* Hangul Syllable */
- [0xb27e, 0xb27e], /* Hangul Syllable */
- [0xb27f, 0xb27f], /* Hangul Syllable */
- [0xb280, 0xb280], /* Hangul Syllable */
- [0xb281, 0xb281], /* Hangul Syllable */
- [0xb282, 0xb282], /* Hangul Syllable */
- [0xb283, 0xb283], /* Hangul Syllable */
- [0xb284, 0xb284], /* Hangul Syllable */
- [0xb285, 0xb285], /* Hangul Syllable */
- [0xb286, 0xb286], /* Hangul Syllable */
- [0xb287, 0xb287], /* Hangul Syllable */
- [0xb288, 0xb288], /* Hangul Syllable */
- [0xb289, 0xb289], /* Hangul Syllable */
- [0xb28a, 0xb28a], /* Hangul Syllable */
- [0xb28b, 0xb28b], /* Hangul Syllable */
- [0xb28c, 0xb28c], /* Hangul Syllable */
- [0xb28d, 0xb28d], /* Hangul Syllable */
- [0xb28e, 0xb28e], /* Hangul Syllable */
- [0xb28f, 0xb28f], /* Hangul Syllable */
- [0xb290, 0xb290], /* Hangul Syllable */
- [0xb291, 0xb291], /* Hangul Syllable */
- [0xb292, 0xb292], /* Hangul Syllable */
- [0xb293, 0xb293], /* Hangul Syllable */
- [0xb294, 0xb294], /* Hangul Syllable */
- [0xb295, 0xb295], /* Hangul Syllable */
- [0xb296, 0xb296], /* Hangul Syllable */
- [0xb297, 0xb297], /* Hangul Syllable */
- [0xb298, 0xb298], /* Hangul Syllable */
- [0xb299, 0xb299], /* Hangul Syllable */
- [0xb29a, 0xb29a], /* Hangul Syllable */
- [0xb29b, 0xb29b], /* Hangul Syllable */
- [0xb29c, 0xb29c], /* Hangul Syllable */
- [0xb29d, 0xb29d], /* Hangul Syllable */
- [0xb29e, 0xb29e], /* Hangul Syllable */
- [0xb29f, 0xb29f], /* Hangul Syllable */
- [0xb2a0, 0xb2a0], /* Hangul Syllable */
- [0xb2a1, 0xb2a1], /* Hangul Syllable */
- [0xb2a2, 0xb2a2], /* Hangul Syllable */
- [0xb2a3, 0xb2a3], /* Hangul Syllable */
- [0xb2a4, 0xb2a4], /* Hangul Syllable */
- [0xb2a5, 0xb2a5], /* Hangul Syllable */
- [0xb2a6, 0xb2a6], /* Hangul Syllable */
- [0xb2a7, 0xb2a7], /* Hangul Syllable */
- [0xb2a8, 0xb2a8], /* Hangul Syllable */
- [0xb2a9, 0xb2a9], /* Hangul Syllable */
- [0xb2aa, 0xb2aa], /* Hangul Syllable */
- [0xb2ab, 0xb2ab], /* Hangul Syllable */
- [0xb2ac, 0xb2ac], /* Hangul Syllable */
- [0xb2ad, 0xb2ad], /* Hangul Syllable */
- [0xb2ae, 0xb2ae], /* Hangul Syllable */
- [0xb2af, 0xb2af], /* Hangul Syllable */
- [0xb2b0, 0xb2b0], /* Hangul Syllable */
- [0xb2b1, 0xb2b1], /* Hangul Syllable */
- [0xb2b2, 0xb2b2], /* Hangul Syllable */
- [0xb2b3, 0xb2b3], /* Hangul Syllable */
- [0xb2b4, 0xb2b4], /* Hangul Syllable */
- [0xb2b5, 0xb2b5], /* Hangul Syllable */
- [0xb2b6, 0xb2b6], /* Hangul Syllable */
- [0xb2b7, 0xb2b7], /* Hangul Syllable */
- [0xb2b8, 0xb2b8], /* Hangul Syllable */
- [0xb2b9, 0xb2b9], /* Hangul Syllable */
- [0xb2ba, 0xb2ba], /* Hangul Syllable */
- [0xb2bb, 0xb2bb], /* Hangul Syllable */
- [0xb2bc, 0xb2bc], /* Hangul Syllable */
- [0xb2bd, 0xb2bd], /* Hangul Syllable */
- [0xb2be, 0xb2be], /* Hangul Syllable */
- [0xb2bf, 0xb2bf], /* Hangul Syllable */
- [0xb2c0, 0xb2c0], /* Hangul Syllable */
- [0xb2c1, 0xb2c1], /* Hangul Syllable */
- [0xb2c2, 0xb2c2], /* Hangul Syllable */
- [0xb2c3, 0xb2c3], /* Hangul Syllable */
- [0xb2c4, 0xb2c4], /* Hangul Syllable */
- [0xb2c5, 0xb2c5], /* Hangul Syllable */
- [0xb2c6, 0xb2c6], /* Hangul Syllable */
- [0xb2c7, 0xb2c7], /* Hangul Syllable */
- [0xb2c8, 0xb2c8], /* Hangul Syllable */
- [0xb2c9, 0xb2c9], /* Hangul Syllable */
- [0xb2ca, 0xb2ca], /* Hangul Syllable */
- [0xb2cb, 0xb2cb], /* Hangul Syllable */
- [0xb2cc, 0xb2cc], /* Hangul Syllable */
- [0xb2cd, 0xb2cd], /* Hangul Syllable */
- [0xb2ce, 0xb2ce], /* Hangul Syllable */
- [0xb2cf, 0xb2cf], /* Hangul Syllable */
- [0xb2d0, 0xb2d0], /* Hangul Syllable */
- [0xb2d1, 0xb2d1], /* Hangul Syllable */
- [0xb2d2, 0xb2d2], /* Hangul Syllable */
- [0xb2d3, 0xb2d3], /* Hangul Syllable */
- [0xb2d4, 0xb2d4], /* Hangul Syllable */
- [0xb2d5, 0xb2d5], /* Hangul Syllable */
- [0xb2d6, 0xb2d6], /* Hangul Syllable */
- [0xb2d7, 0xb2d7], /* Hangul Syllable */
- [0xb2d8, 0xb2d8], /* Hangul Syllable */
- [0xb2d9, 0xb2d9], /* Hangul Syllable */
- [0xb2da, 0xb2da], /* Hangul Syllable */
- [0xb2db, 0xb2db], /* Hangul Syllable */
- [0xb2dc, 0xb2dc], /* Hangul Syllable */
- [0xb2dd, 0xb2dd], /* Hangul Syllable */
- [0xb2de, 0xb2de], /* Hangul Syllable */
- [0xb2df, 0xb2df], /* Hangul Syllable */
- [0xb2e0, 0xb2e0], /* Hangul Syllable */
- [0xb2e1, 0xb2e1], /* Hangul Syllable */
- [0xb2e2, 0xb2e2], /* Hangul Syllable */
- [0xb2e3, 0xb2e3], /* Hangul Syllable */
- [0xb2e4, 0xb2e4], /* Hangul Syllable */
- [0xb2e5, 0xb2e5], /* Hangul Syllable */
- [0xb2e6, 0xb2e6], /* Hangul Syllable */
- [0xb2e7, 0xb2e7], /* Hangul Syllable */
- [0xb2e8, 0xb2e8], /* Hangul Syllable */
- [0xb2e9, 0xb2e9], /* Hangul Syllable */
- [0xb2ea, 0xb2ea], /* Hangul Syllable */
- [0xb2eb, 0xb2eb], /* Hangul Syllable */
- [0xb2ec, 0xb2ec], /* Hangul Syllable */
- [0xb2ed, 0xb2ed], /* Hangul Syllable */
- [0xb2ee, 0xb2ee], /* Hangul Syllable */
- [0xb2ef, 0xb2ef], /* Hangul Syllable */
- [0xb2f0, 0xb2f0], /* Hangul Syllable */
- [0xb2f1, 0xb2f1], /* Hangul Syllable */
- [0xb2f2, 0xb2f2], /* Hangul Syllable */
- [0xb2f3, 0xb2f3], /* Hangul Syllable */
- [0xb2f4, 0xb2f4], /* Hangul Syllable */
- [0xb2f5, 0xb2f5], /* Hangul Syllable */
- [0xb2f6, 0xb2f6], /* Hangul Syllable */
- [0xb2f7, 0xb2f7], /* Hangul Syllable */
- [0xb2f8, 0xb2f8], /* Hangul Syllable */
- [0xb2f9, 0xb2f9], /* Hangul Syllable */
- [0xb2fa, 0xb2fa], /* Hangul Syllable */
- [0xb2fb, 0xb2fb], /* Hangul Syllable */
- [0xb2fc, 0xb2fc], /* Hangul Syllable */
- [0xb2fd, 0xb2fd], /* Hangul Syllable */
- [0xb2fe, 0xb2fe], /* Hangul Syllable */
- [0xb2ff, 0xb2ff], /* Hangul Syllable */
- [0xb300, 0xb300], /* Hangul Syllable */
- [0xb301, 0xb301], /* Hangul Syllable */
- [0xb302, 0xb302], /* Hangul Syllable */
- [0xb303, 0xb303], /* Hangul Syllable */
- [0xb304, 0xb304], /* Hangul Syllable */
- [0xb305, 0xb305], /* Hangul Syllable */
- [0xb306, 0xb306], /* Hangul Syllable */
- [0xb307, 0xb307], /* Hangul Syllable */
- [0xb308, 0xb308], /* Hangul Syllable */
- [0xb309, 0xb309], /* Hangul Syllable */
- [0xb30a, 0xb30a], /* Hangul Syllable */
- [0xb30b, 0xb30b], /* Hangul Syllable */
- [0xb30c, 0xb30c], /* Hangul Syllable */
- [0xb30d, 0xb30d], /* Hangul Syllable */
- [0xb30e, 0xb30e], /* Hangul Syllable */
- [0xb30f, 0xb30f], /* Hangul Syllable */
- [0xb310, 0xb310], /* Hangul Syllable */
- [0xb311, 0xb311], /* Hangul Syllable */
- [0xb312, 0xb312], /* Hangul Syllable */
- [0xb313, 0xb313], /* Hangul Syllable */
- [0xb314, 0xb314], /* Hangul Syllable */
- [0xb315, 0xb315], /* Hangul Syllable */
- [0xb316, 0xb316], /* Hangul Syllable */
- [0xb317, 0xb317], /* Hangul Syllable */
- [0xb318, 0xb318], /* Hangul Syllable */
- [0xb319, 0xb319], /* Hangul Syllable */
- [0xb31a, 0xb31a], /* Hangul Syllable */
- [0xb31b, 0xb31b], /* Hangul Syllable */
- [0xb31c, 0xb31c], /* Hangul Syllable */
- [0xb31d, 0xb31d], /* Hangul Syllable */
- [0xb31e, 0xb31e], /* Hangul Syllable */
- [0xb31f, 0xb31f], /* Hangul Syllable */
- [0xb320, 0xb320], /* Hangul Syllable */
- [0xb321, 0xb321], /* Hangul Syllable */
- [0xb322, 0xb322], /* Hangul Syllable */
- [0xb323, 0xb323], /* Hangul Syllable */
- [0xb324, 0xb324], /* Hangul Syllable */
- [0xb325, 0xb325], /* Hangul Syllable */
- [0xb326, 0xb326], /* Hangul Syllable */
- [0xb327, 0xb327], /* Hangul Syllable */
- [0xb328, 0xb328], /* Hangul Syllable */
- [0xb329, 0xb329], /* Hangul Syllable */
- [0xb32a, 0xb32a], /* Hangul Syllable */
- [0xb32b, 0xb32b], /* Hangul Syllable */
- [0xb32c, 0xb32c], /* Hangul Syllable */
- [0xb32d, 0xb32d], /* Hangul Syllable */
- [0xb32e, 0xb32e], /* Hangul Syllable */
- [0xb32f, 0xb32f], /* Hangul Syllable */
- [0xb330, 0xb330], /* Hangul Syllable */
- [0xb331, 0xb331], /* Hangul Syllable */
- [0xb332, 0xb332], /* Hangul Syllable */
- [0xb333, 0xb333], /* Hangul Syllable */
- [0xb334, 0xb334], /* Hangul Syllable */
- [0xb335, 0xb335], /* Hangul Syllable */
- [0xb336, 0xb336], /* Hangul Syllable */
- [0xb337, 0xb337], /* Hangul Syllable */
- [0xb338, 0xb338], /* Hangul Syllable */
- [0xb339, 0xb339], /* Hangul Syllable */
- [0xb33a, 0xb33a], /* Hangul Syllable */
- [0xb33b, 0xb33b], /* Hangul Syllable */
- [0xb33c, 0xb33c], /* Hangul Syllable */
- [0xb33d, 0xb33d], /* Hangul Syllable */
- [0xb33e, 0xb33e], /* Hangul Syllable */
- [0xb33f, 0xb33f], /* Hangul Syllable */
- [0xb340, 0xb340], /* Hangul Syllable */
- [0xb341, 0xb341], /* Hangul Syllable */
- [0xb342, 0xb342], /* Hangul Syllable */
- [0xb343, 0xb343], /* Hangul Syllable */
- [0xb344, 0xb344], /* Hangul Syllable */
- [0xb345, 0xb345], /* Hangul Syllable */
- [0xb346, 0xb346], /* Hangul Syllable */
- [0xb347, 0xb347], /* Hangul Syllable */
- [0xb348, 0xb348], /* Hangul Syllable */
- [0xb349, 0xb349], /* Hangul Syllable */
- [0xb34a, 0xb34a], /* Hangul Syllable */
- [0xb34b, 0xb34b], /* Hangul Syllable */
- [0xb34c, 0xb34c], /* Hangul Syllable */
- [0xb34d, 0xb34d], /* Hangul Syllable */
- [0xb34e, 0xb34e], /* Hangul Syllable */
- [0xb34f, 0xb34f], /* Hangul Syllable */
- [0xb350, 0xb350], /* Hangul Syllable */
- [0xb351, 0xb351], /* Hangul Syllable */
- [0xb352, 0xb352], /* Hangul Syllable */
- [0xb353, 0xb353], /* Hangul Syllable */
- [0xb354, 0xb354], /* Hangul Syllable */
- [0xb355, 0xb355], /* Hangul Syllable */
- [0xb356, 0xb356], /* Hangul Syllable */
- [0xb357, 0xb357], /* Hangul Syllable */
- [0xb358, 0xb358], /* Hangul Syllable */
- [0xb359, 0xb359], /* Hangul Syllable */
- [0xb35a, 0xb35a], /* Hangul Syllable */
- [0xb35b, 0xb35b], /* Hangul Syllable */
- [0xb35c, 0xb35c], /* Hangul Syllable */
- [0xb35d, 0xb35d], /* Hangul Syllable */
- [0xb35e, 0xb35e], /* Hangul Syllable */
- [0xb35f, 0xb35f], /* Hangul Syllable */
- [0xb360, 0xb360], /* Hangul Syllable */
- [0xb361, 0xb361], /* Hangul Syllable */
- [0xb362, 0xb362], /* Hangul Syllable */
- [0xb363, 0xb363], /* Hangul Syllable */
- [0xb364, 0xb364], /* Hangul Syllable */
- [0xb365, 0xb365], /* Hangul Syllable */
- [0xb366, 0xb366], /* Hangul Syllable */
- [0xb367, 0xb367], /* Hangul Syllable */
- [0xb368, 0xb368], /* Hangul Syllable */
- [0xb369, 0xb369], /* Hangul Syllable */
- [0xb36a, 0xb36a], /* Hangul Syllable */
- [0xb36b, 0xb36b], /* Hangul Syllable */
- [0xb36c, 0xb36c], /* Hangul Syllable */
- [0xb36d, 0xb36d], /* Hangul Syllable */
- [0xb36e, 0xb36e], /* Hangul Syllable */
- [0xb36f, 0xb36f], /* Hangul Syllable */
- [0xb370, 0xb370], /* Hangul Syllable */
- [0xb371, 0xb371], /* Hangul Syllable */
- [0xb372, 0xb372], /* Hangul Syllable */
- [0xb373, 0xb373], /* Hangul Syllable */
- [0xb374, 0xb374], /* Hangul Syllable */
- [0xb375, 0xb375], /* Hangul Syllable */
- [0xb376, 0xb376], /* Hangul Syllable */
- [0xb377, 0xb377], /* Hangul Syllable */
- [0xb378, 0xb378], /* Hangul Syllable */
- [0xb379, 0xb379], /* Hangul Syllable */
- [0xb37a, 0xb37a], /* Hangul Syllable */
- [0xb37b, 0xb37b], /* Hangul Syllable */
- [0xb37c, 0xb37c], /* Hangul Syllable */
- [0xb37d, 0xb37d], /* Hangul Syllable */
- [0xb37e, 0xb37e], /* Hangul Syllable */
- [0xb37f, 0xb37f], /* Hangul Syllable */
- [0xb380, 0xb380], /* Hangul Syllable */
- [0xb381, 0xb381], /* Hangul Syllable */
- [0xb382, 0xb382], /* Hangul Syllable */
- [0xb383, 0xb383], /* Hangul Syllable */
- [0xb384, 0xb384], /* Hangul Syllable */
- [0xb385, 0xb385], /* Hangul Syllable */
- [0xb386, 0xb386], /* Hangul Syllable */
- [0xb387, 0xb387], /* Hangul Syllable */
- [0xb388, 0xb388], /* Hangul Syllable */
- [0xb389, 0xb389], /* Hangul Syllable */
- [0xb38a, 0xb38a], /* Hangul Syllable */
- [0xb38b, 0xb38b], /* Hangul Syllable */
- [0xb38c, 0xb38c], /* Hangul Syllable */
- [0xb38d, 0xb38d], /* Hangul Syllable */
- [0xb38e, 0xb38e], /* Hangul Syllable */
- [0xb38f, 0xb38f], /* Hangul Syllable */
- [0xb390, 0xb390], /* Hangul Syllable */
- [0xb391, 0xb391], /* Hangul Syllable */
- [0xb392, 0xb392], /* Hangul Syllable */
- [0xb393, 0xb393], /* Hangul Syllable */
- [0xb394, 0xb394], /* Hangul Syllable */
- [0xb395, 0xb395], /* Hangul Syllable */
- [0xb396, 0xb396], /* Hangul Syllable */
- [0xb397, 0xb397], /* Hangul Syllable */
- [0xb398, 0xb398], /* Hangul Syllable */
- [0xb399, 0xb399], /* Hangul Syllable */
- [0xb39a, 0xb39a], /* Hangul Syllable */
- [0xb39b, 0xb39b], /* Hangul Syllable */
- [0xb39c, 0xb39c], /* Hangul Syllable */
- [0xb39d, 0xb39d], /* Hangul Syllable */
- [0xb39e, 0xb39e], /* Hangul Syllable */
- [0xb39f, 0xb39f], /* Hangul Syllable */
- [0xb3a0, 0xb3a0], /* Hangul Syllable */
- [0xb3a1, 0xb3a1], /* Hangul Syllable */
- [0xb3a2, 0xb3a2], /* Hangul Syllable */
- [0xb3a3, 0xb3a3], /* Hangul Syllable */
- [0xb3a4, 0xb3a4], /* Hangul Syllable */
- [0xb3a5, 0xb3a5], /* Hangul Syllable */
- [0xb3a6, 0xb3a6], /* Hangul Syllable */
- [0xb3a7, 0xb3a7], /* Hangul Syllable */
- [0xb3a8, 0xb3a8], /* Hangul Syllable */
- [0xb3a9, 0xb3a9], /* Hangul Syllable */
- [0xb3aa, 0xb3aa], /* Hangul Syllable */
- [0xb3ab, 0xb3ab], /* Hangul Syllable */
- [0xb3ac, 0xb3ac], /* Hangul Syllable */
- [0xb3ad, 0xb3ad], /* Hangul Syllable */
- [0xb3ae, 0xb3ae], /* Hangul Syllable */
- [0xb3af, 0xb3af], /* Hangul Syllable */
- [0xb3b0, 0xb3b0], /* Hangul Syllable */
- [0xb3b1, 0xb3b1], /* Hangul Syllable */
- [0xb3b2, 0xb3b2], /* Hangul Syllable */
- [0xb3b3, 0xb3b3], /* Hangul Syllable */
- [0xb3b4, 0xb3b4], /* Hangul Syllable */
- [0xb3b5, 0xb3b5], /* Hangul Syllable */
- [0xb3b6, 0xb3b6], /* Hangul Syllable */
- [0xb3b7, 0xb3b7], /* Hangul Syllable */
- [0xb3b8, 0xb3b8], /* Hangul Syllable */
- [0xb3b9, 0xb3b9], /* Hangul Syllable */
- [0xb3ba, 0xb3ba], /* Hangul Syllable */
- [0xb3bb, 0xb3bb], /* Hangul Syllable */
- [0xb3bc, 0xb3bc], /* Hangul Syllable */
- [0xb3bd, 0xb3bd], /* Hangul Syllable */
- [0xb3be, 0xb3be], /* Hangul Syllable */
- [0xb3bf, 0xb3bf], /* Hangul Syllable */
- [0xb3c0, 0xb3c0], /* Hangul Syllable */
- [0xb3c1, 0xb3c1], /* Hangul Syllable */
- [0xb3c2, 0xb3c2], /* Hangul Syllable */
- [0xb3c3, 0xb3c3], /* Hangul Syllable */
- [0xb3c4, 0xb3c4], /* Hangul Syllable */
- [0xb3c5, 0xb3c5], /* Hangul Syllable */
- [0xb3c6, 0xb3c6], /* Hangul Syllable */
- [0xb3c7, 0xb3c7], /* Hangul Syllable */
- [0xb3c8, 0xb3c8], /* Hangul Syllable */
- [0xb3c9, 0xb3c9], /* Hangul Syllable */
- [0xb3ca, 0xb3ca], /* Hangul Syllable */
- [0xb3cb, 0xb3cb], /* Hangul Syllable */
- [0xb3cc, 0xb3cc], /* Hangul Syllable */
- [0xb3cd, 0xb3cd], /* Hangul Syllable */
- [0xb3ce, 0xb3ce], /* Hangul Syllable */
- [0xb3cf, 0xb3cf], /* Hangul Syllable */
- [0xb3d0, 0xb3d0], /* Hangul Syllable */
- [0xb3d1, 0xb3d1], /* Hangul Syllable */
- [0xb3d2, 0xb3d2], /* Hangul Syllable */
- [0xb3d3, 0xb3d3], /* Hangul Syllable */
- [0xb3d4, 0xb3d4], /* Hangul Syllable */
- [0xb3d5, 0xb3d5], /* Hangul Syllable */
- [0xb3d6, 0xb3d6], /* Hangul Syllable */
- [0xb3d7, 0xb3d7], /* Hangul Syllable */
- [0xb3d8, 0xb3d8], /* Hangul Syllable */
- [0xb3d9, 0xb3d9], /* Hangul Syllable */
- [0xb3da, 0xb3da], /* Hangul Syllable */
- [0xb3db, 0xb3db], /* Hangul Syllable */
- [0xb3dc, 0xb3dc], /* Hangul Syllable */
- [0xb3dd, 0xb3dd], /* Hangul Syllable */
- [0xb3de, 0xb3de], /* Hangul Syllable */
- [0xb3df, 0xb3df], /* Hangul Syllable */
- [0xb3e0, 0xb3e0], /* Hangul Syllable */
- [0xb3e1, 0xb3e1], /* Hangul Syllable */
- [0xb3e2, 0xb3e2], /* Hangul Syllable */
- [0xb3e3, 0xb3e3], /* Hangul Syllable */
- [0xb3e4, 0xb3e4], /* Hangul Syllable */
- [0xb3e5, 0xb3e5], /* Hangul Syllable */
- [0xb3e6, 0xb3e6], /* Hangul Syllable */
- [0xb3e7, 0xb3e7], /* Hangul Syllable */
- [0xb3e8, 0xb3e8], /* Hangul Syllable */
- [0xb3e9, 0xb3e9], /* Hangul Syllable */
- [0xb3ea, 0xb3ea], /* Hangul Syllable */
- [0xb3eb, 0xb3eb], /* Hangul Syllable */
- [0xb3ec, 0xb3ec], /* Hangul Syllable */
- [0xb3ed, 0xb3ed], /* Hangul Syllable */
- [0xb3ee, 0xb3ee], /* Hangul Syllable */
- [0xb3ef, 0xb3ef], /* Hangul Syllable */
- [0xb3f0, 0xb3f0], /* Hangul Syllable */
- [0xb3f1, 0xb3f1], /* Hangul Syllable */
- [0xb3f2, 0xb3f2], /* Hangul Syllable */
- [0xb3f3, 0xb3f3], /* Hangul Syllable */
- [0xb3f4, 0xb3f4], /* Hangul Syllable */
- [0xb3f5, 0xb3f5], /* Hangul Syllable */
- [0xb3f6, 0xb3f6], /* Hangul Syllable */
- [0xb3f7, 0xb3f7], /* Hangul Syllable */
- [0xb3f8, 0xb3f8], /* Hangul Syllable */
- [0xb3f9, 0xb3f9], /* Hangul Syllable */
- [0xb3fa, 0xb3fa], /* Hangul Syllable */
- [0xb3fb, 0xb3fb], /* Hangul Syllable */
- [0xb3fc, 0xb3fc], /* Hangul Syllable */
- [0xb3fd, 0xb3fd], /* Hangul Syllable */
- [0xb3fe, 0xb3fe], /* Hangul Syllable */
- [0xb3ff, 0xb3ff], /* Hangul Syllable */
- [0xb400, 0xb400], /* Hangul Syllable */
- [0xb401, 0xb401], /* Hangul Syllable */
- [0xb402, 0xb402], /* Hangul Syllable */
- [0xb403, 0xb403], /* Hangul Syllable */
- [0xb404, 0xb404], /* Hangul Syllable */
- [0xb405, 0xb405], /* Hangul Syllable */
- [0xb406, 0xb406], /* Hangul Syllable */
- [0xb407, 0xb407], /* Hangul Syllable */
- [0xb408, 0xb408], /* Hangul Syllable */
- [0xb409, 0xb409], /* Hangul Syllable */
- [0xb40a, 0xb40a], /* Hangul Syllable */
- [0xb40b, 0xb40b], /* Hangul Syllable */
- [0xb40c, 0xb40c], /* Hangul Syllable */
- [0xb40d, 0xb40d], /* Hangul Syllable */
- [0xb40e, 0xb40e], /* Hangul Syllable */
- [0xb40f, 0xb40f], /* Hangul Syllable */
- [0xb410, 0xb410], /* Hangul Syllable */
- [0xb411, 0xb411], /* Hangul Syllable */
- [0xb412, 0xb412], /* Hangul Syllable */
- [0xb413, 0xb413], /* Hangul Syllable */
- [0xb414, 0xb414], /* Hangul Syllable */
- [0xb415, 0xb415], /* Hangul Syllable */
- [0xb416, 0xb416], /* Hangul Syllable */
- [0xb417, 0xb417], /* Hangul Syllable */
- [0xb418, 0xb418], /* Hangul Syllable */
- [0xb419, 0xb419], /* Hangul Syllable */
- [0xb41a, 0xb41a], /* Hangul Syllable */
- [0xb41b, 0xb41b], /* Hangul Syllable */
- [0xb41c, 0xb41c], /* Hangul Syllable */
- [0xb41d, 0xb41d], /* Hangul Syllable */
- [0xb41e, 0xb41e], /* Hangul Syllable */
- [0xb41f, 0xb41f], /* Hangul Syllable */
- [0xb420, 0xb420], /* Hangul Syllable */
- [0xb421, 0xb421], /* Hangul Syllable */
- [0xb422, 0xb422], /* Hangul Syllable */
- [0xb423, 0xb423], /* Hangul Syllable */
- [0xb424, 0xb424], /* Hangul Syllable */
- [0xb425, 0xb425], /* Hangul Syllable */
- [0xb426, 0xb426], /* Hangul Syllable */
- [0xb427, 0xb427], /* Hangul Syllable */
- [0xb428, 0xb428], /* Hangul Syllable */
- [0xb429, 0xb429], /* Hangul Syllable */
- [0xb42a, 0xb42a], /* Hangul Syllable */
- [0xb42b, 0xb42b], /* Hangul Syllable */
- [0xb42c, 0xb42c], /* Hangul Syllable */
- [0xb42d, 0xb42d], /* Hangul Syllable */
- [0xb42e, 0xb42e], /* Hangul Syllable */
- [0xb42f, 0xb42f], /* Hangul Syllable */
- [0xb430, 0xb430], /* Hangul Syllable */
- [0xb431, 0xb431], /* Hangul Syllable */
- [0xb432, 0xb432], /* Hangul Syllable */
- [0xb433, 0xb433], /* Hangul Syllable */
- [0xb434, 0xb434], /* Hangul Syllable */
- [0xb435, 0xb435], /* Hangul Syllable */
- [0xb436, 0xb436], /* Hangul Syllable */
- [0xb437, 0xb437], /* Hangul Syllable */
- [0xb438, 0xb438], /* Hangul Syllable */
- [0xb439, 0xb439], /* Hangul Syllable */
- [0xb43a, 0xb43a], /* Hangul Syllable */
- [0xb43b, 0xb43b], /* Hangul Syllable */
- [0xb43c, 0xb43c], /* Hangul Syllable */
- [0xb43d, 0xb43d], /* Hangul Syllable */
- [0xb43e, 0xb43e], /* Hangul Syllable */
- [0xb43f, 0xb43f], /* Hangul Syllable */
- [0xb440, 0xb440], /* Hangul Syllable */
- [0xb441, 0xb441], /* Hangul Syllable */
- [0xb442, 0xb442], /* Hangul Syllable */
- [0xb443, 0xb443], /* Hangul Syllable */
- [0xb444, 0xb444], /* Hangul Syllable */
- [0xb445, 0xb445], /* Hangul Syllable */
- [0xb446, 0xb446], /* Hangul Syllable */
- [0xb447, 0xb447], /* Hangul Syllable */
- [0xb448, 0xb448], /* Hangul Syllable */
- [0xb449, 0xb449], /* Hangul Syllable */
- [0xb44a, 0xb44a], /* Hangul Syllable */
- [0xb44b, 0xb44b], /* Hangul Syllable */
- [0xb44c, 0xb44c], /* Hangul Syllable */
- [0xb44d, 0xb44d], /* Hangul Syllable */
- [0xb44e, 0xb44e], /* Hangul Syllable */
- [0xb44f, 0xb44f], /* Hangul Syllable */
- [0xb450, 0xb450], /* Hangul Syllable */
- [0xb451, 0xb451], /* Hangul Syllable */
- [0xb452, 0xb452], /* Hangul Syllable */
- [0xb453, 0xb453], /* Hangul Syllable */
- [0xb454, 0xb454], /* Hangul Syllable */
- [0xb455, 0xb455], /* Hangul Syllable */
- [0xb456, 0xb456], /* Hangul Syllable */
- [0xb457, 0xb457], /* Hangul Syllable */
- [0xb458, 0xb458], /* Hangul Syllable */
- [0xb459, 0xb459], /* Hangul Syllable */
- [0xb45a, 0xb45a], /* Hangul Syllable */
- [0xb45b, 0xb45b], /* Hangul Syllable */
- [0xb45c, 0xb45c], /* Hangul Syllable */
- [0xb45d, 0xb45d], /* Hangul Syllable */
- [0xb45e, 0xb45e], /* Hangul Syllable */
- [0xb45f, 0xb45f], /* Hangul Syllable */
- [0xb460, 0xb460], /* Hangul Syllable */
- [0xb461, 0xb461], /* Hangul Syllable */
- [0xb462, 0xb462], /* Hangul Syllable */
- [0xb463, 0xb463], /* Hangul Syllable */
- [0xb464, 0xb464], /* Hangul Syllable */
- [0xb465, 0xb465], /* Hangul Syllable */
- [0xb466, 0xb466], /* Hangul Syllable */
- [0xb467, 0xb467], /* Hangul Syllable */
- [0xb468, 0xb468], /* Hangul Syllable */
- [0xb469, 0xb469], /* Hangul Syllable */
- [0xb46a, 0xb46a], /* Hangul Syllable */
- [0xb46b, 0xb46b], /* Hangul Syllable */
- [0xb46c, 0xb46c], /* Hangul Syllable */
- [0xb46d, 0xb46d], /* Hangul Syllable */
- [0xb46e, 0xb46e], /* Hangul Syllable */
- [0xb46f, 0xb46f], /* Hangul Syllable */
- [0xb470, 0xb470], /* Hangul Syllable */
- [0xb471, 0xb471], /* Hangul Syllable */
- [0xb472, 0xb472], /* Hangul Syllable */
- [0xb473, 0xb473], /* Hangul Syllable */
- [0xb474, 0xb474], /* Hangul Syllable */
- [0xb475, 0xb475], /* Hangul Syllable */
- [0xb476, 0xb476], /* Hangul Syllable */
- [0xb477, 0xb477], /* Hangul Syllable */
- [0xb478, 0xb478], /* Hangul Syllable */
- [0xb479, 0xb479], /* Hangul Syllable */
- [0xb47a, 0xb47a], /* Hangul Syllable */
- [0xb47b, 0xb47b], /* Hangul Syllable */
- [0xb47c, 0xb47c], /* Hangul Syllable */
- [0xb47d, 0xb47d], /* Hangul Syllable */
- [0xb47e, 0xb47e], /* Hangul Syllable */
- [0xb47f, 0xb47f], /* Hangul Syllable */
- [0xb480, 0xb480], /* Hangul Syllable */
- [0xb481, 0xb481], /* Hangul Syllable */
- [0xb482, 0xb482], /* Hangul Syllable */
- [0xb483, 0xb483], /* Hangul Syllable */
- [0xb484, 0xb484], /* Hangul Syllable */
- [0xb485, 0xb485], /* Hangul Syllable */
- [0xb486, 0xb486], /* Hangul Syllable */
- [0xb487, 0xb487], /* Hangul Syllable */
- [0xb488, 0xb488], /* Hangul Syllable */
- [0xb489, 0xb489], /* Hangul Syllable */
- [0xb48a, 0xb48a], /* Hangul Syllable */
- [0xb48b, 0xb48b], /* Hangul Syllable */
- [0xb48c, 0xb48c], /* Hangul Syllable */
- [0xb48d, 0xb48d], /* Hangul Syllable */
- [0xb48e, 0xb48e], /* Hangul Syllable */
- [0xb48f, 0xb48f], /* Hangul Syllable */
- [0xb490, 0xb490], /* Hangul Syllable */
- [0xb491, 0xb491], /* Hangul Syllable */
- [0xb492, 0xb492], /* Hangul Syllable */
- [0xb493, 0xb493], /* Hangul Syllable */
- [0xb494, 0xb494], /* Hangul Syllable */
- [0xb495, 0xb495], /* Hangul Syllable */
- [0xb496, 0xb496], /* Hangul Syllable */
- [0xb497, 0xb497], /* Hangul Syllable */
- [0xb498, 0xb498], /* Hangul Syllable */
- [0xb499, 0xb499], /* Hangul Syllable */
- [0xb49a, 0xb49a], /* Hangul Syllable */
- [0xb49b, 0xb49b], /* Hangul Syllable */
- [0xb49c, 0xb49c], /* Hangul Syllable */
- [0xb49d, 0xb49d], /* Hangul Syllable */
- [0xb49e, 0xb49e], /* Hangul Syllable */
- [0xb49f, 0xb49f], /* Hangul Syllable */
- [0xb4a0, 0xb4a0], /* Hangul Syllable */
- [0xb4a1, 0xb4a1], /* Hangul Syllable */
- [0xb4a2, 0xb4a2], /* Hangul Syllable */
- [0xb4a3, 0xb4a3], /* Hangul Syllable */
- [0xb4a4, 0xb4a4], /* Hangul Syllable */
- [0xb4a5, 0xb4a5], /* Hangul Syllable */
- [0xb4a6, 0xb4a6], /* Hangul Syllable */
- [0xb4a7, 0xb4a7], /* Hangul Syllable */
- [0xb4a8, 0xb4a8], /* Hangul Syllable */
- [0xb4a9, 0xb4a9], /* Hangul Syllable */
- [0xb4aa, 0xb4aa], /* Hangul Syllable */
- [0xb4ab, 0xb4ab], /* Hangul Syllable */
- [0xb4ac, 0xb4ac], /* Hangul Syllable */
- [0xb4ad, 0xb4ad], /* Hangul Syllable */
- [0xb4ae, 0xb4ae], /* Hangul Syllable */
- [0xb4af, 0xb4af], /* Hangul Syllable */
- [0xb4b0, 0xb4b0], /* Hangul Syllable */
- [0xb4b1, 0xb4b1], /* Hangul Syllable */
- [0xb4b2, 0xb4b2], /* Hangul Syllable */
- [0xb4b3, 0xb4b3], /* Hangul Syllable */
- [0xb4b4, 0xb4b4], /* Hangul Syllable */
- [0xb4b5, 0xb4b5], /* Hangul Syllable */
- [0xb4b6, 0xb4b6], /* Hangul Syllable */
- [0xb4b7, 0xb4b7], /* Hangul Syllable */
- [0xb4b8, 0xb4b8], /* Hangul Syllable */
- [0xb4b9, 0xb4b9], /* Hangul Syllable */
- [0xb4ba, 0xb4ba], /* Hangul Syllable */
- [0xb4bb, 0xb4bb], /* Hangul Syllable */
- [0xb4bc, 0xb4bc], /* Hangul Syllable */
- [0xb4bd, 0xb4bd], /* Hangul Syllable */
- [0xb4be, 0xb4be], /* Hangul Syllable */
- [0xb4bf, 0xb4bf], /* Hangul Syllable */
- [0xb4c0, 0xb4c0], /* Hangul Syllable */
- [0xb4c1, 0xb4c1], /* Hangul Syllable */
- [0xb4c2, 0xb4c2], /* Hangul Syllable */
- [0xb4c3, 0xb4c3], /* Hangul Syllable */
- [0xb4c4, 0xb4c4], /* Hangul Syllable */
- [0xb4c5, 0xb4c5], /* Hangul Syllable */
- [0xb4c6, 0xb4c6], /* Hangul Syllable */
- [0xb4c7, 0xb4c7], /* Hangul Syllable */
- [0xb4c8, 0xb4c8], /* Hangul Syllable */
- [0xb4c9, 0xb4c9], /* Hangul Syllable */
- [0xb4ca, 0xb4ca], /* Hangul Syllable */
- [0xb4cb, 0xb4cb], /* Hangul Syllable */
- [0xb4cc, 0xb4cc], /* Hangul Syllable */
- [0xb4cd, 0xb4cd], /* Hangul Syllable */
- [0xb4ce, 0xb4ce], /* Hangul Syllable */
- [0xb4cf, 0xb4cf], /* Hangul Syllable */
- [0xb4d0, 0xb4d0], /* Hangul Syllable */
- [0xb4d1, 0xb4d1], /* Hangul Syllable */
- [0xb4d2, 0xb4d2], /* Hangul Syllable */
- [0xb4d3, 0xb4d3], /* Hangul Syllable */
- [0xb4d4, 0xb4d4], /* Hangul Syllable */
- [0xb4d5, 0xb4d5], /* Hangul Syllable */
- [0xb4d6, 0xb4d6], /* Hangul Syllable */
- [0xb4d7, 0xb4d7], /* Hangul Syllable */
- [0xb4d8, 0xb4d8], /* Hangul Syllable */
- [0xb4d9, 0xb4d9], /* Hangul Syllable */
- [0xb4da, 0xb4da], /* Hangul Syllable */
- [0xb4db, 0xb4db], /* Hangul Syllable */
- [0xb4dc, 0xb4dc], /* Hangul Syllable */
- [0xb4dd, 0xb4dd], /* Hangul Syllable */
- [0xb4de, 0xb4de], /* Hangul Syllable */
- [0xb4df, 0xb4df], /* Hangul Syllable */
- [0xb4e0, 0xb4e0], /* Hangul Syllable */
- [0xb4e1, 0xb4e1], /* Hangul Syllable */
- [0xb4e2, 0xb4e2], /* Hangul Syllable */
- [0xb4e3, 0xb4e3], /* Hangul Syllable */
- [0xb4e4, 0xb4e4], /* Hangul Syllable */
- [0xb4e5, 0xb4e5], /* Hangul Syllable */
- [0xb4e6, 0xb4e6], /* Hangul Syllable */
- [0xb4e7, 0xb4e7], /* Hangul Syllable */
- [0xb4e8, 0xb4e8], /* Hangul Syllable */
- [0xb4e9, 0xb4e9], /* Hangul Syllable */
- [0xb4ea, 0xb4ea], /* Hangul Syllable */
- [0xb4eb, 0xb4eb], /* Hangul Syllable */
- [0xb4ec, 0xb4ec], /* Hangul Syllable */
- [0xb4ed, 0xb4ed], /* Hangul Syllable */
- [0xb4ee, 0xb4ee], /* Hangul Syllable */
- [0xb4ef, 0xb4ef], /* Hangul Syllable */
- [0xb4f0, 0xb4f0], /* Hangul Syllable */
- [0xb4f1, 0xb4f1], /* Hangul Syllable */
- [0xb4f2, 0xb4f2], /* Hangul Syllable */
- [0xb4f3, 0xb4f3], /* Hangul Syllable */
- [0xb4f4, 0xb4f4], /* Hangul Syllable */
- [0xb4f5, 0xb4f5], /* Hangul Syllable */
- [0xb4f6, 0xb4f6], /* Hangul Syllable */
- [0xb4f7, 0xb4f7], /* Hangul Syllable */
- [0xb4f8, 0xb4f8], /* Hangul Syllable */
- [0xb4f9, 0xb4f9], /* Hangul Syllable */
- [0xb4fa, 0xb4fa], /* Hangul Syllable */
- [0xb4fb, 0xb4fb], /* Hangul Syllable */
- [0xb4fc, 0xb4fc], /* Hangul Syllable */
- [0xb4fd, 0xb4fd], /* Hangul Syllable */
- [0xb4fe, 0xb4fe], /* Hangul Syllable */
- [0xb4ff, 0xb4ff], /* Hangul Syllable */
- [0xb500, 0xb500], /* Hangul Syllable */
- [0xb501, 0xb501], /* Hangul Syllable */
- [0xb502, 0xb502], /* Hangul Syllable */
- [0xb503, 0xb503], /* Hangul Syllable */
- [0xb504, 0xb504], /* Hangul Syllable */
- [0xb505, 0xb505], /* Hangul Syllable */
- [0xb506, 0xb506], /* Hangul Syllable */
- [0xb507, 0xb507], /* Hangul Syllable */
- [0xb508, 0xb508], /* Hangul Syllable */
- [0xb509, 0xb509], /* Hangul Syllable */
- [0xb50a, 0xb50a], /* Hangul Syllable */
- [0xb50b, 0xb50b], /* Hangul Syllable */
- [0xb50c, 0xb50c], /* Hangul Syllable */
- [0xb50d, 0xb50d], /* Hangul Syllable */
- [0xb50e, 0xb50e], /* Hangul Syllable */
- [0xb50f, 0xb50f], /* Hangul Syllable */
- [0xb510, 0xb510], /* Hangul Syllable */
- [0xb511, 0xb511], /* Hangul Syllable */
- [0xb512, 0xb512], /* Hangul Syllable */
- [0xb513, 0xb513], /* Hangul Syllable */
- [0xb514, 0xb514], /* Hangul Syllable */
- [0xb515, 0xb515], /* Hangul Syllable */
- [0xb516, 0xb516], /* Hangul Syllable */
- [0xb517, 0xb517], /* Hangul Syllable */
- [0xb518, 0xb518], /* Hangul Syllable */
- [0xb519, 0xb519], /* Hangul Syllable */
- [0xb51a, 0xb51a], /* Hangul Syllable */
- [0xb51b, 0xb51b], /* Hangul Syllable */
- [0xb51c, 0xb51c], /* Hangul Syllable */
- [0xb51d, 0xb51d], /* Hangul Syllable */
- [0xb51e, 0xb51e], /* Hangul Syllable */
- [0xb51f, 0xb51f], /* Hangul Syllable */
- [0xb520, 0xb520], /* Hangul Syllable */
- [0xb521, 0xb521], /* Hangul Syllable */
- [0xb522, 0xb522], /* Hangul Syllable */
- [0xb523, 0xb523], /* Hangul Syllable */
- [0xb524, 0xb524], /* Hangul Syllable */
- [0xb525, 0xb525], /* Hangul Syllable */
- [0xb526, 0xb526], /* Hangul Syllable */
- [0xb527, 0xb527], /* Hangul Syllable */
- [0xb528, 0xb528], /* Hangul Syllable */
- [0xb529, 0xb529], /* Hangul Syllable */
- [0xb52a, 0xb52a], /* Hangul Syllable */
- [0xb52b, 0xb52b], /* Hangul Syllable */
- [0xb52c, 0xb52c], /* Hangul Syllable */
- [0xb52d, 0xb52d], /* Hangul Syllable */
- [0xb52e, 0xb52e], /* Hangul Syllable */
- [0xb52f, 0xb52f], /* Hangul Syllable */
- [0xb530, 0xb530], /* Hangul Syllable */
- [0xb531, 0xb531], /* Hangul Syllable */
- [0xb532, 0xb532], /* Hangul Syllable */
- [0xb533, 0xb533], /* Hangul Syllable */
- [0xb534, 0xb534], /* Hangul Syllable */
- [0xb535, 0xb535], /* Hangul Syllable */
- [0xb536, 0xb536], /* Hangul Syllable */
- [0xb537, 0xb537], /* Hangul Syllable */
- [0xb538, 0xb538], /* Hangul Syllable */
- [0xb539, 0xb539], /* Hangul Syllable */
- [0xb53a, 0xb53a], /* Hangul Syllable */
- [0xb53b, 0xb53b], /* Hangul Syllable */
- [0xb53c, 0xb53c], /* Hangul Syllable */
- [0xb53d, 0xb53d], /* Hangul Syllable */
- [0xb53e, 0xb53e], /* Hangul Syllable */
- [0xb53f, 0xb53f], /* Hangul Syllable */
- [0xb540, 0xb540], /* Hangul Syllable */
- [0xb541, 0xb541], /* Hangul Syllable */
- [0xb542, 0xb542], /* Hangul Syllable */
- [0xb543, 0xb543], /* Hangul Syllable */
- [0xb544, 0xb544], /* Hangul Syllable */
- [0xb545, 0xb545], /* Hangul Syllable */
- [0xb546, 0xb546], /* Hangul Syllable */
- [0xb547, 0xb547], /* Hangul Syllable */
- [0xb548, 0xb548], /* Hangul Syllable */
- [0xb549, 0xb549], /* Hangul Syllable */
- [0xb54a, 0xb54a], /* Hangul Syllable */
- [0xb54b, 0xb54b], /* Hangul Syllable */
- [0xb54c, 0xb54c], /* Hangul Syllable */
- [0xb54d, 0xb54d], /* Hangul Syllable */
- [0xb54e, 0xb54e], /* Hangul Syllable */
- [0xb54f, 0xb54f], /* Hangul Syllable */
- [0xb550, 0xb550], /* Hangul Syllable */
- [0xb551, 0xb551], /* Hangul Syllable */
- [0xb552, 0xb552], /* Hangul Syllable */
- [0xb553, 0xb553], /* Hangul Syllable */
- [0xb554, 0xb554], /* Hangul Syllable */
- [0xb555, 0xb555], /* Hangul Syllable */
- [0xb556, 0xb556], /* Hangul Syllable */
- [0xb557, 0xb557], /* Hangul Syllable */
- [0xb558, 0xb558], /* Hangul Syllable */
- [0xb559, 0xb559], /* Hangul Syllable */
- [0xb55a, 0xb55a], /* Hangul Syllable */
- [0xb55b, 0xb55b], /* Hangul Syllable */
- [0xb55c, 0xb55c], /* Hangul Syllable */
- [0xb55d, 0xb55d], /* Hangul Syllable */
- [0xb55e, 0xb55e], /* Hangul Syllable */
- [0xb55f, 0xb55f], /* Hangul Syllable */
- [0xb560, 0xb560], /* Hangul Syllable */
- [0xb561, 0xb561], /* Hangul Syllable */
- [0xb562, 0xb562], /* Hangul Syllable */
- [0xb563, 0xb563], /* Hangul Syllable */
- [0xb564, 0xb564], /* Hangul Syllable */
- [0xb565, 0xb565], /* Hangul Syllable */
- [0xb566, 0xb566], /* Hangul Syllable */
- [0xb567, 0xb567], /* Hangul Syllable */
- [0xb568, 0xb568], /* Hangul Syllable */
- [0xb569, 0xb569], /* Hangul Syllable */
- [0xb56a, 0xb56a], /* Hangul Syllable */
- [0xb56b, 0xb56b], /* Hangul Syllable */
- [0xb56c, 0xb56c], /* Hangul Syllable */
- [0xb56d, 0xb56d], /* Hangul Syllable */
- [0xb56e, 0xb56e], /* Hangul Syllable */
- [0xb56f, 0xb56f], /* Hangul Syllable */
- [0xb570, 0xb570], /* Hangul Syllable */
- [0xb571, 0xb571], /* Hangul Syllable */
- [0xb572, 0xb572], /* Hangul Syllable */
- [0xb573, 0xb573], /* Hangul Syllable */
- [0xb574, 0xb574], /* Hangul Syllable */
- [0xb575, 0xb575], /* Hangul Syllable */
- [0xb576, 0xb576], /* Hangul Syllable */
- [0xb577, 0xb577], /* Hangul Syllable */
- [0xb578, 0xb578], /* Hangul Syllable */
- [0xb579, 0xb579], /* Hangul Syllable */
- [0xb57a, 0xb57a], /* Hangul Syllable */
- [0xb57b, 0xb57b], /* Hangul Syllable */
- [0xb57c, 0xb57c], /* Hangul Syllable */
- [0xb57d, 0xb57d], /* Hangul Syllable */
- [0xb57e, 0xb57e], /* Hangul Syllable */
- [0xb57f, 0xb57f], /* Hangul Syllable */
- [0xb580, 0xb580], /* Hangul Syllable */
- [0xb581, 0xb581], /* Hangul Syllable */
- [0xb582, 0xb582], /* Hangul Syllable */
- [0xb583, 0xb583], /* Hangul Syllable */
- [0xb584, 0xb584], /* Hangul Syllable */
- [0xb585, 0xb585], /* Hangul Syllable */
- [0xb586, 0xb586], /* Hangul Syllable */
- [0xb587, 0xb587], /* Hangul Syllable */
- [0xb588, 0xb588], /* Hangul Syllable */
- [0xb589, 0xb589], /* Hangul Syllable */
- [0xb58a, 0xb58a], /* Hangul Syllable */
- [0xb58b, 0xb58b], /* Hangul Syllable */
- [0xb58c, 0xb58c], /* Hangul Syllable */
- [0xb58d, 0xb58d], /* Hangul Syllable */
- [0xb58e, 0xb58e], /* Hangul Syllable */
- [0xb58f, 0xb58f], /* Hangul Syllable */
- [0xb590, 0xb590], /* Hangul Syllable */
- [0xb591, 0xb591], /* Hangul Syllable */
- [0xb592, 0xb592], /* Hangul Syllable */
- [0xb593, 0xb593], /* Hangul Syllable */
- [0xb594, 0xb594], /* Hangul Syllable */
- [0xb595, 0xb595], /* Hangul Syllable */
- [0xb596, 0xb596], /* Hangul Syllable */
- [0xb597, 0xb597], /* Hangul Syllable */
- [0xb598, 0xb598], /* Hangul Syllable */
- [0xb599, 0xb599], /* Hangul Syllable */
- [0xb59a, 0xb59a], /* Hangul Syllable */
- [0xb59b, 0xb59b], /* Hangul Syllable */
- [0xb59c, 0xb59c], /* Hangul Syllable */
- [0xb59d, 0xb59d], /* Hangul Syllable */
- [0xb59e, 0xb59e], /* Hangul Syllable */
- [0xb59f, 0xb59f], /* Hangul Syllable */
- [0xb5a0, 0xb5a0], /* Hangul Syllable */
- [0xb5a1, 0xb5a1], /* Hangul Syllable */
- [0xb5a2, 0xb5a2], /* Hangul Syllable */
- [0xb5a3, 0xb5a3], /* Hangul Syllable */
- [0xb5a4, 0xb5a4], /* Hangul Syllable */
- [0xb5a5, 0xb5a5], /* Hangul Syllable */
- [0xb5a6, 0xb5a6], /* Hangul Syllable */
- [0xb5a7, 0xb5a7], /* Hangul Syllable */
- [0xb5a8, 0xb5a8], /* Hangul Syllable */
- [0xb5a9, 0xb5a9], /* Hangul Syllable */
- [0xb5aa, 0xb5aa], /* Hangul Syllable */
- [0xb5ab, 0xb5ab], /* Hangul Syllable */
- [0xb5ac, 0xb5ac], /* Hangul Syllable */
- [0xb5ad, 0xb5ad], /* Hangul Syllable */
- [0xb5ae, 0xb5ae], /* Hangul Syllable */
- [0xb5af, 0xb5af], /* Hangul Syllable */
- [0xb5b0, 0xb5b0], /* Hangul Syllable */
- [0xb5b1, 0xb5b1], /* Hangul Syllable */
- [0xb5b2, 0xb5b2], /* Hangul Syllable */
- [0xb5b3, 0xb5b3], /* Hangul Syllable */
- [0xb5b4, 0xb5b4], /* Hangul Syllable */
- [0xb5b5, 0xb5b5], /* Hangul Syllable */
- [0xb5b6, 0xb5b6], /* Hangul Syllable */
- [0xb5b7, 0xb5b7], /* Hangul Syllable */
- [0xb5b8, 0xb5b8], /* Hangul Syllable */
- [0xb5b9, 0xb5b9], /* Hangul Syllable */
- [0xb5ba, 0xb5ba], /* Hangul Syllable */
- [0xb5bb, 0xb5bb], /* Hangul Syllable */
- [0xb5bc, 0xb5bc], /* Hangul Syllable */
- [0xb5bd, 0xb5bd], /* Hangul Syllable */
- [0xb5be, 0xb5be], /* Hangul Syllable */
- [0xb5bf, 0xb5bf], /* Hangul Syllable */
- [0xb5c0, 0xb5c0], /* Hangul Syllable */
- [0xb5c1, 0xb5c1], /* Hangul Syllable */
- [0xb5c2, 0xb5c2], /* Hangul Syllable */
- [0xb5c3, 0xb5c3], /* Hangul Syllable */
- [0xb5c4, 0xb5c4], /* Hangul Syllable */
- [0xb5c5, 0xb5c5], /* Hangul Syllable */
- [0xb5c6, 0xb5c6], /* Hangul Syllable */
- [0xb5c7, 0xb5c7], /* Hangul Syllable */
- [0xb5c8, 0xb5c8], /* Hangul Syllable */
- [0xb5c9, 0xb5c9], /* Hangul Syllable */
- [0xb5ca, 0xb5ca], /* Hangul Syllable */
- [0xb5cb, 0xb5cb], /* Hangul Syllable */
- [0xb5cc, 0xb5cc], /* Hangul Syllable */
- [0xb5cd, 0xb5cd], /* Hangul Syllable */
- [0xb5ce, 0xb5ce], /* Hangul Syllable */
- [0xb5cf, 0xb5cf], /* Hangul Syllable */
- [0xb5d0, 0xb5d0], /* Hangul Syllable */
- [0xb5d1, 0xb5d1], /* Hangul Syllable */
- [0xb5d2, 0xb5d2], /* Hangul Syllable */
- [0xb5d3, 0xb5d3], /* Hangul Syllable */
- [0xb5d4, 0xb5d4], /* Hangul Syllable */
- [0xb5d5, 0xb5d5], /* Hangul Syllable */
- [0xb5d6, 0xb5d6], /* Hangul Syllable */
- [0xb5d7, 0xb5d7], /* Hangul Syllable */
- [0xb5d8, 0xb5d8], /* Hangul Syllable */
- [0xb5d9, 0xb5d9], /* Hangul Syllable */
- [0xb5da, 0xb5da], /* Hangul Syllable */
- [0xb5db, 0xb5db], /* Hangul Syllable */
- [0xb5dc, 0xb5dc], /* Hangul Syllable */
- [0xb5dd, 0xb5dd], /* Hangul Syllable */
- [0xb5de, 0xb5de], /* Hangul Syllable */
- [0xb5df, 0xb5df], /* Hangul Syllable */
- [0xb5e0, 0xb5e0], /* Hangul Syllable */
- [0xb5e1, 0xb5e1], /* Hangul Syllable */
- [0xb5e2, 0xb5e2], /* Hangul Syllable */
- [0xb5e3, 0xb5e3], /* Hangul Syllable */
- [0xb5e4, 0xb5e4], /* Hangul Syllable */
- [0xb5e5, 0xb5e5], /* Hangul Syllable */
- [0xb5e6, 0xb5e6], /* Hangul Syllable */
- [0xb5e7, 0xb5e7], /* Hangul Syllable */
- [0xb5e8, 0xb5e8], /* Hangul Syllable */
- [0xb5e9, 0xb5e9], /* Hangul Syllable */
- [0xb5ea, 0xb5ea], /* Hangul Syllable */
- [0xb5eb, 0xb5eb], /* Hangul Syllable */
- [0xb5ec, 0xb5ec], /* Hangul Syllable */
- [0xb5ed, 0xb5ed], /* Hangul Syllable */
- [0xb5ee, 0xb5ee], /* Hangul Syllable */
- [0xb5ef, 0xb5ef], /* Hangul Syllable */
- [0xb5f0, 0xb5f0], /* Hangul Syllable */
- [0xb5f1, 0xb5f1], /* Hangul Syllable */
- [0xb5f2, 0xb5f2], /* Hangul Syllable */
- [0xb5f3, 0xb5f3], /* Hangul Syllable */
- [0xb5f4, 0xb5f4], /* Hangul Syllable */
- [0xb5f5, 0xb5f5], /* Hangul Syllable */
- [0xb5f6, 0xb5f6], /* Hangul Syllable */
- [0xb5f7, 0xb5f7], /* Hangul Syllable */
- [0xb5f8, 0xb5f8], /* Hangul Syllable */
- [0xb5f9, 0xb5f9], /* Hangul Syllable */
- [0xb5fa, 0xb5fa], /* Hangul Syllable */
- [0xb5fb, 0xb5fb], /* Hangul Syllable */
- [0xb5fc, 0xb5fc], /* Hangul Syllable */
- [0xb5fd, 0xb5fd], /* Hangul Syllable */
- [0xb5fe, 0xb5fe], /* Hangul Syllable */
- [0xb5ff, 0xb5ff], /* Hangul Syllable */
- [0xb600, 0xb600], /* Hangul Syllable */
- [0xb601, 0xb601], /* Hangul Syllable */
- [0xb602, 0xb602], /* Hangul Syllable */
- [0xb603, 0xb603], /* Hangul Syllable */
- [0xb604, 0xb604], /* Hangul Syllable */
- [0xb605, 0xb605], /* Hangul Syllable */
- [0xb606, 0xb606], /* Hangul Syllable */
- [0xb607, 0xb607], /* Hangul Syllable */
- [0xb608, 0xb608], /* Hangul Syllable */
- [0xb609, 0xb609], /* Hangul Syllable */
- [0xb60a, 0xb60a], /* Hangul Syllable */
- [0xb60b, 0xb60b], /* Hangul Syllable */
- [0xb60c, 0xb60c], /* Hangul Syllable */
- [0xb60d, 0xb60d], /* Hangul Syllable */
- [0xb60e, 0xb60e], /* Hangul Syllable */
- [0xb60f, 0xb60f], /* Hangul Syllable */
- [0xb610, 0xb610], /* Hangul Syllable */
- [0xb611, 0xb611], /* Hangul Syllable */
- [0xb612, 0xb612], /* Hangul Syllable */
- [0xb613, 0xb613], /* Hangul Syllable */
- [0xb614, 0xb614], /* Hangul Syllable */
- [0xb615, 0xb615], /* Hangul Syllable */
- [0xb616, 0xb616], /* Hangul Syllable */
- [0xb617, 0xb617], /* Hangul Syllable */
- [0xb618, 0xb618], /* Hangul Syllable */
- [0xb619, 0xb619], /* Hangul Syllable */
- [0xb61a, 0xb61a], /* Hangul Syllable */
- [0xb61b, 0xb61b], /* Hangul Syllable */
- [0xb61c, 0xb61c], /* Hangul Syllable */
- [0xb61d, 0xb61d], /* Hangul Syllable */
- [0xb61e, 0xb61e], /* Hangul Syllable */
- [0xb61f, 0xb61f], /* Hangul Syllable */
- [0xb620, 0xb620], /* Hangul Syllable */
- [0xb621, 0xb621], /* Hangul Syllable */
- [0xb622, 0xb622], /* Hangul Syllable */
- [0xb623, 0xb623], /* Hangul Syllable */
- [0xb624, 0xb624], /* Hangul Syllable */
- [0xb625, 0xb625], /* Hangul Syllable */
- [0xb626, 0xb626], /* Hangul Syllable */
- [0xb627, 0xb627], /* Hangul Syllable */
- [0xb628, 0xb628], /* Hangul Syllable */
- [0xb629, 0xb629], /* Hangul Syllable */
- [0xb62a, 0xb62a], /* Hangul Syllable */
- [0xb62b, 0xb62b], /* Hangul Syllable */
- [0xb62c, 0xb62c], /* Hangul Syllable */
- [0xb62d, 0xb62d], /* Hangul Syllable */
- [0xb62e, 0xb62e], /* Hangul Syllable */
- [0xb62f, 0xb62f], /* Hangul Syllable */
- [0xb630, 0xb630], /* Hangul Syllable */
- [0xb631, 0xb631], /* Hangul Syllable */
- [0xb632, 0xb632], /* Hangul Syllable */
- [0xb633, 0xb633], /* Hangul Syllable */
- [0xb634, 0xb634], /* Hangul Syllable */
- [0xb635, 0xb635], /* Hangul Syllable */
- [0xb636, 0xb636], /* Hangul Syllable */
- [0xb637, 0xb637], /* Hangul Syllable */
- [0xb638, 0xb638], /* Hangul Syllable */
- [0xb639, 0xb639], /* Hangul Syllable */
- [0xb63a, 0xb63a], /* Hangul Syllable */
- [0xb63b, 0xb63b], /* Hangul Syllable */
- [0xb63c, 0xb63c], /* Hangul Syllable */
- [0xb63d, 0xb63d], /* Hangul Syllable */
- [0xb63e, 0xb63e], /* Hangul Syllable */
- [0xb63f, 0xb63f], /* Hangul Syllable */
- [0xb640, 0xb640], /* Hangul Syllable */
- [0xb641, 0xb641], /* Hangul Syllable */
- [0xb642, 0xb642], /* Hangul Syllable */
- [0xb643, 0xb643], /* Hangul Syllable */
- [0xb644, 0xb644], /* Hangul Syllable */
- [0xb645, 0xb645], /* Hangul Syllable */
- [0xb646, 0xb646], /* Hangul Syllable */
- [0xb647, 0xb647], /* Hangul Syllable */
- [0xb648, 0xb648], /* Hangul Syllable */
- [0xb649, 0xb649], /* Hangul Syllable */
- [0xb64a, 0xb64a], /* Hangul Syllable */
- [0xb64b, 0xb64b], /* Hangul Syllable */
- [0xb64c, 0xb64c], /* Hangul Syllable */
- [0xb64d, 0xb64d], /* Hangul Syllable */
- [0xb64e, 0xb64e], /* Hangul Syllable */
- [0xb64f, 0xb64f], /* Hangul Syllable */
- [0xb650, 0xb650], /* Hangul Syllable */
- [0xb651, 0xb651], /* Hangul Syllable */
- [0xb652, 0xb652], /* Hangul Syllable */
- [0xb653, 0xb653], /* Hangul Syllable */
- [0xb654, 0xb654], /* Hangul Syllable */
- [0xb655, 0xb655], /* Hangul Syllable */
- [0xb656, 0xb656], /* Hangul Syllable */
- [0xb657, 0xb657], /* Hangul Syllable */
- [0xb658, 0xb658], /* Hangul Syllable */
- [0xb659, 0xb659], /* Hangul Syllable */
- [0xb65a, 0xb65a], /* Hangul Syllable */
- [0xb65b, 0xb65b], /* Hangul Syllable */
- [0xb65c, 0xb65c], /* Hangul Syllable */
- [0xb65d, 0xb65d], /* Hangul Syllable */
- [0xb65e, 0xb65e], /* Hangul Syllable */
- [0xb65f, 0xb65f], /* Hangul Syllable */
- [0xb660, 0xb660], /* Hangul Syllable */
- [0xb661, 0xb661], /* Hangul Syllable */
- [0xb662, 0xb662], /* Hangul Syllable */
- [0xb663, 0xb663], /* Hangul Syllable */
- [0xb664, 0xb664], /* Hangul Syllable */
- [0xb665, 0xb665], /* Hangul Syllable */
- [0xb666, 0xb666], /* Hangul Syllable */
- [0xb667, 0xb667], /* Hangul Syllable */
- [0xb668, 0xb668], /* Hangul Syllable */
- [0xb669, 0xb669], /* Hangul Syllable */
- [0xb66a, 0xb66a], /* Hangul Syllable */
- [0xb66b, 0xb66b], /* Hangul Syllable */
- [0xb66c, 0xb66c], /* Hangul Syllable */
- [0xb66d, 0xb66d], /* Hangul Syllable */
- [0xb66e, 0xb66e], /* Hangul Syllable */
- [0xb66f, 0xb66f], /* Hangul Syllable */
- [0xb670, 0xb670], /* Hangul Syllable */
- [0xb671, 0xb671], /* Hangul Syllable */
- [0xb672, 0xb672], /* Hangul Syllable */
- [0xb673, 0xb673], /* Hangul Syllable */
- [0xb674, 0xb674], /* Hangul Syllable */
- [0xb675, 0xb675], /* Hangul Syllable */
- [0xb676, 0xb676], /* Hangul Syllable */
- [0xb677, 0xb677], /* Hangul Syllable */
- [0xb678, 0xb678], /* Hangul Syllable */
- [0xb679, 0xb679], /* Hangul Syllable */
- [0xb67a, 0xb67a], /* Hangul Syllable */
- [0xb67b, 0xb67b], /* Hangul Syllable */
- [0xb67c, 0xb67c], /* Hangul Syllable */
- [0xb67d, 0xb67d], /* Hangul Syllable */
- [0xb67e, 0xb67e], /* Hangul Syllable */
- [0xb67f, 0xb67f], /* Hangul Syllable */
- [0xb680, 0xb680], /* Hangul Syllable */
- [0xb681, 0xb681], /* Hangul Syllable */
- [0xb682, 0xb682], /* Hangul Syllable */
- [0xb683, 0xb683], /* Hangul Syllable */
- [0xb684, 0xb684], /* Hangul Syllable */
- [0xb685, 0xb685], /* Hangul Syllable */
- [0xb686, 0xb686], /* Hangul Syllable */
- [0xb687, 0xb687], /* Hangul Syllable */
- [0xb688, 0xb688], /* Hangul Syllable */
- [0xb689, 0xb689], /* Hangul Syllable */
- [0xb68a, 0xb68a], /* Hangul Syllable */
- [0xb68b, 0xb68b], /* Hangul Syllable */
- [0xb68c, 0xb68c], /* Hangul Syllable */
- [0xb68d, 0xb68d], /* Hangul Syllable */
- [0xb68e, 0xb68e], /* Hangul Syllable */
- [0xb68f, 0xb68f], /* Hangul Syllable */
- [0xb690, 0xb690], /* Hangul Syllable */
- [0xb691, 0xb691], /* Hangul Syllable */
- [0xb692, 0xb692], /* Hangul Syllable */
- [0xb693, 0xb693], /* Hangul Syllable */
- [0xb694, 0xb694], /* Hangul Syllable */
- [0xb695, 0xb695], /* Hangul Syllable */
- [0xb696, 0xb696], /* Hangul Syllable */
- [0xb697, 0xb697], /* Hangul Syllable */
- [0xb698, 0xb698], /* Hangul Syllable */
- [0xb699, 0xb699], /* Hangul Syllable */
- [0xb69a, 0xb69a], /* Hangul Syllable */
- [0xb69b, 0xb69b], /* Hangul Syllable */
- [0xb69c, 0xb69c], /* Hangul Syllable */
- [0xb69d, 0xb69d], /* Hangul Syllable */
- [0xb69e, 0xb69e], /* Hangul Syllable */
- [0xb69f, 0xb69f], /* Hangul Syllable */
- [0xb6a0, 0xb6a0], /* Hangul Syllable */
- [0xb6a1, 0xb6a1], /* Hangul Syllable */
- [0xb6a2, 0xb6a2], /* Hangul Syllable */
- [0xb6a3, 0xb6a3], /* Hangul Syllable */
- [0xb6a4, 0xb6a4], /* Hangul Syllable */
- [0xb6a5, 0xb6a5], /* Hangul Syllable */
- [0xb6a6, 0xb6a6], /* Hangul Syllable */
- [0xb6a7, 0xb6a7], /* Hangul Syllable */
- [0xb6a8, 0xb6a8], /* Hangul Syllable */
- [0xb6a9, 0xb6a9], /* Hangul Syllable */
- [0xb6aa, 0xb6aa], /* Hangul Syllable */
- [0xb6ab, 0xb6ab], /* Hangul Syllable */
- [0xb6ac, 0xb6ac], /* Hangul Syllable */
- [0xb6ad, 0xb6ad], /* Hangul Syllable */
- [0xb6ae, 0xb6ae], /* Hangul Syllable */
- [0xb6af, 0xb6af], /* Hangul Syllable */
- [0xb6b0, 0xb6b0], /* Hangul Syllable */
- [0xb6b1, 0xb6b1], /* Hangul Syllable */
- [0xb6b2, 0xb6b2], /* Hangul Syllable */
- [0xb6b3, 0xb6b3], /* Hangul Syllable */
- [0xb6b4, 0xb6b4], /* Hangul Syllable */
- [0xb6b5, 0xb6b5], /* Hangul Syllable */
- [0xb6b6, 0xb6b6], /* Hangul Syllable */
- [0xb6b7, 0xb6b7], /* Hangul Syllable */
- [0xb6b8, 0xb6b8], /* Hangul Syllable */
- [0xb6b9, 0xb6b9], /* Hangul Syllable */
- [0xb6ba, 0xb6ba], /* Hangul Syllable */
- [0xb6bb, 0xb6bb], /* Hangul Syllable */
- [0xb6bc, 0xb6bc], /* Hangul Syllable */
- [0xb6bd, 0xb6bd], /* Hangul Syllable */
- [0xb6be, 0xb6be], /* Hangul Syllable */
- [0xb6bf, 0xb6bf], /* Hangul Syllable */
- [0xb6c0, 0xb6c0], /* Hangul Syllable */
- [0xb6c1, 0xb6c1], /* Hangul Syllable */
- [0xb6c2, 0xb6c2], /* Hangul Syllable */
- [0xb6c3, 0xb6c3], /* Hangul Syllable */
- [0xb6c4, 0xb6c4], /* Hangul Syllable */
- [0xb6c5, 0xb6c5], /* Hangul Syllable */
- [0xb6c6, 0xb6c6], /* Hangul Syllable */
- [0xb6c7, 0xb6c7], /* Hangul Syllable */
- [0xb6c8, 0xb6c8], /* Hangul Syllable */
- [0xb6c9, 0xb6c9], /* Hangul Syllable */
- [0xb6ca, 0xb6ca], /* Hangul Syllable */
- [0xb6cb, 0xb6cb], /* Hangul Syllable */
- [0xb6cc, 0xb6cc], /* Hangul Syllable */
- [0xb6cd, 0xb6cd], /* Hangul Syllable */
- [0xb6ce, 0xb6ce], /* Hangul Syllable */
- [0xb6cf, 0xb6cf], /* Hangul Syllable */
- [0xb6d0, 0xb6d0], /* Hangul Syllable */
- [0xb6d1, 0xb6d1], /* Hangul Syllable */
- [0xb6d2, 0xb6d2], /* Hangul Syllable */
- [0xb6d3, 0xb6d3], /* Hangul Syllable */
- [0xb6d4, 0xb6d4], /* Hangul Syllable */
- [0xb6d5, 0xb6d5], /* Hangul Syllable */
- [0xb6d6, 0xb6d6], /* Hangul Syllable */
- [0xb6d7, 0xb6d7], /* Hangul Syllable */
- [0xb6d8, 0xb6d8], /* Hangul Syllable */
- [0xb6d9, 0xb6d9], /* Hangul Syllable */
- [0xb6da, 0xb6da], /* Hangul Syllable */
- [0xb6db, 0xb6db], /* Hangul Syllable */
- [0xb6dc, 0xb6dc], /* Hangul Syllable */
- [0xb6dd, 0xb6dd], /* Hangul Syllable */
- [0xb6de, 0xb6de], /* Hangul Syllable */
- [0xb6df, 0xb6df], /* Hangul Syllable */
- [0xb6e0, 0xb6e0], /* Hangul Syllable */
- [0xb6e1, 0xb6e1], /* Hangul Syllable */
- [0xb6e2, 0xb6e2], /* Hangul Syllable */
- [0xb6e3, 0xb6e3], /* Hangul Syllable */
- [0xb6e4, 0xb6e4], /* Hangul Syllable */
- [0xb6e5, 0xb6e5], /* Hangul Syllable */
- [0xb6e6, 0xb6e6], /* Hangul Syllable */
- [0xb6e7, 0xb6e7], /* Hangul Syllable */
- [0xb6e8, 0xb6e8], /* Hangul Syllable */
- [0xb6e9, 0xb6e9], /* Hangul Syllable */
- [0xb6ea, 0xb6ea], /* Hangul Syllable */
- [0xb6eb, 0xb6eb], /* Hangul Syllable */
- [0xb6ec, 0xb6ec], /* Hangul Syllable */
- [0xb6ed, 0xb6ed], /* Hangul Syllable */
- [0xb6ee, 0xb6ee], /* Hangul Syllable */
- [0xb6ef, 0xb6ef], /* Hangul Syllable */
- [0xb6f0, 0xb6f0], /* Hangul Syllable */
- [0xb6f1, 0xb6f1], /* Hangul Syllable */
- [0xb6f2, 0xb6f2], /* Hangul Syllable */
- [0xb6f3, 0xb6f3], /* Hangul Syllable */
- [0xb6f4, 0xb6f4], /* Hangul Syllable */
- [0xb6f5, 0xb6f5], /* Hangul Syllable */
- [0xb6f6, 0xb6f6], /* Hangul Syllable */
- [0xb6f7, 0xb6f7], /* Hangul Syllable */
- [0xb6f8, 0xb6f8], /* Hangul Syllable */
- [0xb6f9, 0xb6f9], /* Hangul Syllable */
- [0xb6fa, 0xb6fa], /* Hangul Syllable */
- [0xb6fb, 0xb6fb], /* Hangul Syllable */
- [0xb6fc, 0xb6fc], /* Hangul Syllable */
- [0xb6fd, 0xb6fd], /* Hangul Syllable */
- [0xb6fe, 0xb6fe], /* Hangul Syllable */
- [0xb6ff, 0xb6ff], /* Hangul Syllable */
- [0xb700, 0xb700], /* Hangul Syllable */
- [0xb701, 0xb701], /* Hangul Syllable */
- [0xb702, 0xb702], /* Hangul Syllable */
- [0xb703, 0xb703], /* Hangul Syllable */
- [0xb704, 0xb704], /* Hangul Syllable */
- [0xb705, 0xb705], /* Hangul Syllable */
- [0xb706, 0xb706], /* Hangul Syllable */
- [0xb707, 0xb707], /* Hangul Syllable */
- [0xb708, 0xb708], /* Hangul Syllable */
- [0xb709, 0xb709], /* Hangul Syllable */
- [0xb70a, 0xb70a], /* Hangul Syllable */
- [0xb70b, 0xb70b], /* Hangul Syllable */
- [0xb70c, 0xb70c], /* Hangul Syllable */
- [0xb70d, 0xb70d], /* Hangul Syllable */
- [0xb70e, 0xb70e], /* Hangul Syllable */
- [0xb70f, 0xb70f], /* Hangul Syllable */
- [0xb710, 0xb710], /* Hangul Syllable */
- [0xb711, 0xb711], /* Hangul Syllable */
- [0xb712, 0xb712], /* Hangul Syllable */
- [0xb713, 0xb713], /* Hangul Syllable */
- [0xb714, 0xb714], /* Hangul Syllable */
- [0xb715, 0xb715], /* Hangul Syllable */
- [0xb716, 0xb716], /* Hangul Syllable */
- [0xb717, 0xb717], /* Hangul Syllable */
- [0xb718, 0xb718], /* Hangul Syllable */
- [0xb719, 0xb719], /* Hangul Syllable */
- [0xb71a, 0xb71a], /* Hangul Syllable */
- [0xb71b, 0xb71b], /* Hangul Syllable */
- [0xb71c, 0xb71c], /* Hangul Syllable */
- [0xb71d, 0xb71d], /* Hangul Syllable */
- [0xb71e, 0xb71e], /* Hangul Syllable */
- [0xb71f, 0xb71f], /* Hangul Syllable */
- [0xb720, 0xb720], /* Hangul Syllable */
- [0xb721, 0xb721], /* Hangul Syllable */
- [0xb722, 0xb722], /* Hangul Syllable */
- [0xb723, 0xb723], /* Hangul Syllable */
- [0xb724, 0xb724], /* Hangul Syllable */
- [0xb725, 0xb725], /* Hangul Syllable */
- [0xb726, 0xb726], /* Hangul Syllable */
- [0xb727, 0xb727], /* Hangul Syllable */
- [0xb728, 0xb728], /* Hangul Syllable */
- [0xb729, 0xb729], /* Hangul Syllable */
- [0xb72a, 0xb72a], /* Hangul Syllable */
- [0xb72b, 0xb72b], /* Hangul Syllable */
- [0xb72c, 0xb72c], /* Hangul Syllable */
- [0xb72d, 0xb72d], /* Hangul Syllable */
- [0xb72e, 0xb72e], /* Hangul Syllable */
- [0xb72f, 0xb72f], /* Hangul Syllable */
- [0xb730, 0xb730], /* Hangul Syllable */
- [0xb731, 0xb731], /* Hangul Syllable */
- [0xb732, 0xb732], /* Hangul Syllable */
- [0xb733, 0xb733], /* Hangul Syllable */
- [0xb734, 0xb734], /* Hangul Syllable */
- [0xb735, 0xb735], /* Hangul Syllable */
- [0xb736, 0xb736], /* Hangul Syllable */
- [0xb737, 0xb737], /* Hangul Syllable */
- [0xb738, 0xb738], /* Hangul Syllable */
- [0xb739, 0xb739], /* Hangul Syllable */
- [0xb73a, 0xb73a], /* Hangul Syllable */
- [0xb73b, 0xb73b], /* Hangul Syllable */
- [0xb73c, 0xb73c], /* Hangul Syllable */
- [0xb73d, 0xb73d], /* Hangul Syllable */
- [0xb73e, 0xb73e], /* Hangul Syllable */
- [0xb73f, 0xb73f], /* Hangul Syllable */
- [0xb740, 0xb740], /* Hangul Syllable */
- [0xb741, 0xb741], /* Hangul Syllable */
- [0xb742, 0xb742], /* Hangul Syllable */
- [0xb743, 0xb743], /* Hangul Syllable */
- [0xb744, 0xb744], /* Hangul Syllable */
- [0xb745, 0xb745], /* Hangul Syllable */
- [0xb746, 0xb746], /* Hangul Syllable */
- [0xb747, 0xb747], /* Hangul Syllable */
- [0xb748, 0xb748], /* Hangul Syllable */
- [0xb749, 0xb749], /* Hangul Syllable */
- [0xb74a, 0xb74a], /* Hangul Syllable */
- [0xb74b, 0xb74b], /* Hangul Syllable */
- [0xb74c, 0xb74c], /* Hangul Syllable */
- [0xb74d, 0xb74d], /* Hangul Syllable */
- [0xb74e, 0xb74e], /* Hangul Syllable */
- [0xb74f, 0xb74f], /* Hangul Syllable */
- [0xb750, 0xb750], /* Hangul Syllable */
- [0xb751, 0xb751], /* Hangul Syllable */
- [0xb752, 0xb752], /* Hangul Syllable */
- [0xb753, 0xb753], /* Hangul Syllable */
- [0xb754, 0xb754], /* Hangul Syllable */
- [0xb755, 0xb755], /* Hangul Syllable */
- [0xb756, 0xb756], /* Hangul Syllable */
- [0xb757, 0xb757], /* Hangul Syllable */
- [0xb758, 0xb758], /* Hangul Syllable */
- [0xb759, 0xb759], /* Hangul Syllable */
- [0xb75a, 0xb75a], /* Hangul Syllable */
- [0xb75b, 0xb75b], /* Hangul Syllable */
- [0xb75c, 0xb75c], /* Hangul Syllable */
- [0xb75d, 0xb75d], /* Hangul Syllable */
- [0xb75e, 0xb75e], /* Hangul Syllable */
- [0xb75f, 0xb75f], /* Hangul Syllable */
- [0xb760, 0xb760], /* Hangul Syllable */
- [0xb761, 0xb761], /* Hangul Syllable */
- [0xb762, 0xb762], /* Hangul Syllable */
- [0xb763, 0xb763], /* Hangul Syllable */
- [0xb764, 0xb764], /* Hangul Syllable */
- [0xb765, 0xb765], /* Hangul Syllable */
- [0xb766, 0xb766], /* Hangul Syllable */
- [0xb767, 0xb767], /* Hangul Syllable */
- [0xb768, 0xb768], /* Hangul Syllable */
- [0xb769, 0xb769], /* Hangul Syllable */
- [0xb76a, 0xb76a], /* Hangul Syllable */
- [0xb76b, 0xb76b], /* Hangul Syllable */
- [0xb76c, 0xb76c], /* Hangul Syllable */
- [0xb76d, 0xb76d], /* Hangul Syllable */
- [0xb76e, 0xb76e], /* Hangul Syllable */
- [0xb76f, 0xb76f], /* Hangul Syllable */
- [0xb770, 0xb770], /* Hangul Syllable */
- [0xb771, 0xb771], /* Hangul Syllable */
- [0xb772, 0xb772], /* Hangul Syllable */
- [0xb773, 0xb773], /* Hangul Syllable */
- [0xb774, 0xb774], /* Hangul Syllable */
- [0xb775, 0xb775], /* Hangul Syllable */
- [0xb776, 0xb776], /* Hangul Syllable */
- [0xb777, 0xb777], /* Hangul Syllable */
- [0xb778, 0xb778], /* Hangul Syllable */
- [0xb779, 0xb779], /* Hangul Syllable */
- [0xb77a, 0xb77a], /* Hangul Syllable */
- [0xb77b, 0xb77b], /* Hangul Syllable */
- [0xb77c, 0xb77c], /* Hangul Syllable */
- [0xb77d, 0xb77d], /* Hangul Syllable */
- [0xb77e, 0xb77e], /* Hangul Syllable */
- [0xb77f, 0xb77f], /* Hangul Syllable */
- [0xb780, 0xb780], /* Hangul Syllable */
- [0xb781, 0xb781], /* Hangul Syllable */
- [0xb782, 0xb782], /* Hangul Syllable */
- [0xb783, 0xb783], /* Hangul Syllable */
- [0xb784, 0xb784], /* Hangul Syllable */
- [0xb785, 0xb785], /* Hangul Syllable */
- [0xb786, 0xb786], /* Hangul Syllable */
- [0xb787, 0xb787], /* Hangul Syllable */
- [0xb788, 0xb788], /* Hangul Syllable */
- [0xb789, 0xb789], /* Hangul Syllable */
- [0xb78a, 0xb78a], /* Hangul Syllable */
- [0xb78b, 0xb78b], /* Hangul Syllable */
- [0xb78c, 0xb78c], /* Hangul Syllable */
- [0xb78d, 0xb78d], /* Hangul Syllable */
- [0xb78e, 0xb78e], /* Hangul Syllable */
- [0xb78f, 0xb78f], /* Hangul Syllable */
- [0xb790, 0xb790], /* Hangul Syllable */
- [0xb791, 0xb791], /* Hangul Syllable */
- [0xb792, 0xb792], /* Hangul Syllable */
- [0xb793, 0xb793], /* Hangul Syllable */
- [0xb794, 0xb794], /* Hangul Syllable */
- [0xb795, 0xb795], /* Hangul Syllable */
- [0xb796, 0xb796], /* Hangul Syllable */
- [0xb797, 0xb797], /* Hangul Syllable */
- [0xb798, 0xb798], /* Hangul Syllable */
- [0xb799, 0xb799], /* Hangul Syllable */
- [0xb79a, 0xb79a], /* Hangul Syllable */
- [0xb79b, 0xb79b], /* Hangul Syllable */
- [0xb79c, 0xb79c], /* Hangul Syllable */
- [0xb79d, 0xb79d], /* Hangul Syllable */
- [0xb79e, 0xb79e], /* Hangul Syllable */
- [0xb79f, 0xb79f], /* Hangul Syllable */
- [0xb7a0, 0xb7a0], /* Hangul Syllable */
- [0xb7a1, 0xb7a1], /* Hangul Syllable */
- [0xb7a2, 0xb7a2], /* Hangul Syllable */
- [0xb7a3, 0xb7a3], /* Hangul Syllable */
- [0xb7a4, 0xb7a4], /* Hangul Syllable */
- [0xb7a5, 0xb7a5], /* Hangul Syllable */
- [0xb7a6, 0xb7a6], /* Hangul Syllable */
- [0xb7a7, 0xb7a7], /* Hangul Syllable */
- [0xb7a8, 0xb7a8], /* Hangul Syllable */
- [0xb7a9, 0xb7a9], /* Hangul Syllable */
- [0xb7aa, 0xb7aa], /* Hangul Syllable */
- [0xb7ab, 0xb7ab], /* Hangul Syllable */
- [0xb7ac, 0xb7ac], /* Hangul Syllable */
- [0xb7ad, 0xb7ad], /* Hangul Syllable */
- [0xb7ae, 0xb7ae], /* Hangul Syllable */
- [0xb7af, 0xb7af], /* Hangul Syllable */
- [0xb7b0, 0xb7b0], /* Hangul Syllable */
- [0xb7b1, 0xb7b1], /* Hangul Syllable */
- [0xb7b2, 0xb7b2], /* Hangul Syllable */
- [0xb7b3, 0xb7b3], /* Hangul Syllable */
- [0xb7b4, 0xb7b4], /* Hangul Syllable */
- [0xb7b5, 0xb7b5], /* Hangul Syllable */
- [0xb7b6, 0xb7b6], /* Hangul Syllable */
- [0xb7b7, 0xb7b7], /* Hangul Syllable */
- [0xb7b8, 0xb7b8], /* Hangul Syllable */
- [0xb7b9, 0xb7b9], /* Hangul Syllable */
- [0xb7ba, 0xb7ba], /* Hangul Syllable */
- [0xb7bb, 0xb7bb], /* Hangul Syllable */
- [0xb7bc, 0xb7bc], /* Hangul Syllable */
- [0xb7bd, 0xb7bd], /* Hangul Syllable */
- [0xb7be, 0xb7be], /* Hangul Syllable */
- [0xb7bf, 0xb7bf], /* Hangul Syllable */
- [0xb7c0, 0xb7c0], /* Hangul Syllable */
- [0xb7c1, 0xb7c1], /* Hangul Syllable */
- [0xb7c2, 0xb7c2], /* Hangul Syllable */
- [0xb7c3, 0xb7c3], /* Hangul Syllable */
- [0xb7c4, 0xb7c4], /* Hangul Syllable */
- [0xb7c5, 0xb7c5], /* Hangul Syllable */
- [0xb7c6, 0xb7c6], /* Hangul Syllable */
- [0xb7c7, 0xb7c7], /* Hangul Syllable */
- [0xb7c8, 0xb7c8], /* Hangul Syllable */
- [0xb7c9, 0xb7c9], /* Hangul Syllable */
- [0xb7ca, 0xb7ca], /* Hangul Syllable */
- [0xb7cb, 0xb7cb], /* Hangul Syllable */
- [0xb7cc, 0xb7cc], /* Hangul Syllable */
- [0xb7cd, 0xb7cd], /* Hangul Syllable */
- [0xb7ce, 0xb7ce], /* Hangul Syllable */
- [0xb7cf, 0xb7cf], /* Hangul Syllable */
- [0xb7d0, 0xb7d0], /* Hangul Syllable */
- [0xb7d1, 0xb7d1], /* Hangul Syllable */
- [0xb7d2, 0xb7d2], /* Hangul Syllable */
- [0xb7d3, 0xb7d3], /* Hangul Syllable */
- [0xb7d4, 0xb7d4], /* Hangul Syllable */
- [0xb7d5, 0xb7d5], /* Hangul Syllable */
- [0xb7d6, 0xb7d6], /* Hangul Syllable */
- [0xb7d7, 0xb7d7], /* Hangul Syllable */
- [0xb7d8, 0xb7d8], /* Hangul Syllable */
- [0xb7d9, 0xb7d9], /* Hangul Syllable */
- [0xb7da, 0xb7da], /* Hangul Syllable */
- [0xb7db, 0xb7db], /* Hangul Syllable */
- [0xb7dc, 0xb7dc], /* Hangul Syllable */
- [0xb7dd, 0xb7dd], /* Hangul Syllable */
- [0xb7de, 0xb7de], /* Hangul Syllable */
- [0xb7df, 0xb7df], /* Hangul Syllable */
- [0xb7e0, 0xb7e0], /* Hangul Syllable */
- [0xb7e1, 0xb7e1], /* Hangul Syllable */
- [0xb7e2, 0xb7e2], /* Hangul Syllable */
- [0xb7e3, 0xb7e3], /* Hangul Syllable */
- [0xb7e4, 0xb7e4], /* Hangul Syllable */
- [0xb7e5, 0xb7e5], /* Hangul Syllable */
- [0xb7e6, 0xb7e6], /* Hangul Syllable */
- [0xb7e7, 0xb7e7], /* Hangul Syllable */
- [0xb7e8, 0xb7e8], /* Hangul Syllable */
- [0xb7e9, 0xb7e9], /* Hangul Syllable */
- [0xb7ea, 0xb7ea], /* Hangul Syllable */
- [0xb7eb, 0xb7eb], /* Hangul Syllable */
- [0xb7ec, 0xb7ec], /* Hangul Syllable */
- [0xb7ed, 0xb7ed], /* Hangul Syllable */
- [0xb7ee, 0xb7ee], /* Hangul Syllable */
- [0xb7ef, 0xb7ef], /* Hangul Syllable */
- [0xb7f0, 0xb7f0], /* Hangul Syllable */
- [0xb7f1, 0xb7f1], /* Hangul Syllable */
- [0xb7f2, 0xb7f2], /* Hangul Syllable */
- [0xb7f3, 0xb7f3], /* Hangul Syllable */
- [0xb7f4, 0xb7f4], /* Hangul Syllable */
- [0xb7f5, 0xb7f5], /* Hangul Syllable */
- [0xb7f6, 0xb7f6], /* Hangul Syllable */
- [0xb7f7, 0xb7f7], /* Hangul Syllable */
- [0xb7f8, 0xb7f8], /* Hangul Syllable */
- [0xb7f9, 0xb7f9], /* Hangul Syllable */
- [0xb7fa, 0xb7fa], /* Hangul Syllable */
- [0xb7fb, 0xb7fb], /* Hangul Syllable */
- [0xb7fc, 0xb7fc], /* Hangul Syllable */
- [0xb7fd, 0xb7fd], /* Hangul Syllable */
- [0xb7fe, 0xb7fe], /* Hangul Syllable */
- [0xb7ff, 0xb7ff], /* Hangul Syllable */
- [0xb800, 0xb800], /* Hangul Syllable */
- [0xb801, 0xb801], /* Hangul Syllable */
- [0xb802, 0xb802], /* Hangul Syllable */
- [0xb803, 0xb803], /* Hangul Syllable */
- [0xb804, 0xb804], /* Hangul Syllable */
- [0xb805, 0xb805], /* Hangul Syllable */
- [0xb806, 0xb806], /* Hangul Syllable */
- [0xb807, 0xb807], /* Hangul Syllable */
- [0xb808, 0xb808], /* Hangul Syllable */
- [0xb809, 0xb809], /* Hangul Syllable */
- [0xb80a, 0xb80a], /* Hangul Syllable */
- [0xb80b, 0xb80b], /* Hangul Syllable */
- [0xb80c, 0xb80c], /* Hangul Syllable */
- [0xb80d, 0xb80d], /* Hangul Syllable */
- [0xb80e, 0xb80e], /* Hangul Syllable */
- [0xb80f, 0xb80f], /* Hangul Syllable */
- [0xb810, 0xb810], /* Hangul Syllable */
- [0xb811, 0xb811], /* Hangul Syllable */
- [0xb812, 0xb812], /* Hangul Syllable */
- [0xb813, 0xb813], /* Hangul Syllable */
- [0xb814, 0xb814], /* Hangul Syllable */
- [0xb815, 0xb815], /* Hangul Syllable */
- [0xb816, 0xb816], /* Hangul Syllable */
- [0xb817, 0xb817], /* Hangul Syllable */
- [0xb818, 0xb818], /* Hangul Syllable */
- [0xb819, 0xb819], /* Hangul Syllable */
- [0xb81a, 0xb81a], /* Hangul Syllable */
- [0xb81b, 0xb81b], /* Hangul Syllable */
- [0xb81c, 0xb81c], /* Hangul Syllable */
- [0xb81d, 0xb81d], /* Hangul Syllable */
- [0xb81e, 0xb81e], /* Hangul Syllable */
- [0xb81f, 0xb81f], /* Hangul Syllable */
- [0xb820, 0xb820], /* Hangul Syllable */
- [0xb821, 0xb821], /* Hangul Syllable */
- [0xb822, 0xb822], /* Hangul Syllable */
- [0xb823, 0xb823], /* Hangul Syllable */
- [0xb824, 0xb824], /* Hangul Syllable */
- [0xb825, 0xb825], /* Hangul Syllable */
- [0xb826, 0xb826], /* Hangul Syllable */
- [0xb827, 0xb827], /* Hangul Syllable */
- [0xb828, 0xb828], /* Hangul Syllable */
- [0xb829, 0xb829], /* Hangul Syllable */
- [0xb82a, 0xb82a], /* Hangul Syllable */
- [0xb82b, 0xb82b], /* Hangul Syllable */
- [0xb82c, 0xb82c], /* Hangul Syllable */
- [0xb82d, 0xb82d], /* Hangul Syllable */
- [0xb82e, 0xb82e], /* Hangul Syllable */
- [0xb82f, 0xb82f], /* Hangul Syllable */
- [0xb830, 0xb830], /* Hangul Syllable */
- [0xb831, 0xb831], /* Hangul Syllable */
- [0xb832, 0xb832], /* Hangul Syllable */
- [0xb833, 0xb833], /* Hangul Syllable */
- [0xb834, 0xb834], /* Hangul Syllable */
- [0xb835, 0xb835], /* Hangul Syllable */
- [0xb836, 0xb836], /* Hangul Syllable */
- [0xb837, 0xb837], /* Hangul Syllable */
- [0xb838, 0xb838], /* Hangul Syllable */
- [0xb839, 0xb839], /* Hangul Syllable */
- [0xb83a, 0xb83a], /* Hangul Syllable */
- [0xb83b, 0xb83b], /* Hangul Syllable */
- [0xb83c, 0xb83c], /* Hangul Syllable */
- [0xb83d, 0xb83d], /* Hangul Syllable */
- [0xb83e, 0xb83e], /* Hangul Syllable */
- [0xb83f, 0xb83f], /* Hangul Syllable */
- [0xb840, 0xb840], /* Hangul Syllable */
- [0xb841, 0xb841], /* Hangul Syllable */
- [0xb842, 0xb842], /* Hangul Syllable */
- [0xb843, 0xb843], /* Hangul Syllable */
- [0xb844, 0xb844], /* Hangul Syllable */
- [0xb845, 0xb845], /* Hangul Syllable */
- [0xb846, 0xb846], /* Hangul Syllable */
- [0xb847, 0xb847], /* Hangul Syllable */
- [0xb848, 0xb848], /* Hangul Syllable */
- [0xb849, 0xb849], /* Hangul Syllable */
- [0xb84a, 0xb84a], /* Hangul Syllable */
- [0xb84b, 0xb84b], /* Hangul Syllable */
- [0xb84c, 0xb84c], /* Hangul Syllable */
- [0xb84d, 0xb84d], /* Hangul Syllable */
- [0xb84e, 0xb84e], /* Hangul Syllable */
- [0xb84f, 0xb84f], /* Hangul Syllable */
- [0xb850, 0xb850], /* Hangul Syllable */
- [0xb851, 0xb851], /* Hangul Syllable */
- [0xb852, 0xb852], /* Hangul Syllable */
- [0xb853, 0xb853], /* Hangul Syllable */
- [0xb854, 0xb854], /* Hangul Syllable */
- [0xb855, 0xb855], /* Hangul Syllable */
- [0xb856, 0xb856], /* Hangul Syllable */
- [0xb857, 0xb857], /* Hangul Syllable */
- [0xb858, 0xb858], /* Hangul Syllable */
- [0xb859, 0xb859], /* Hangul Syllable */
- [0xb85a, 0xb85a], /* Hangul Syllable */
- [0xb85b, 0xb85b], /* Hangul Syllable */
- [0xb85c, 0xb85c], /* Hangul Syllable */
- [0xb85d, 0xb85d], /* Hangul Syllable */
- [0xb85e, 0xb85e], /* Hangul Syllable */
- [0xb85f, 0xb85f], /* Hangul Syllable */
- [0xb860, 0xb860], /* Hangul Syllable */
- [0xb861, 0xb861], /* Hangul Syllable */
- [0xb862, 0xb862], /* Hangul Syllable */
- [0xb863, 0xb863], /* Hangul Syllable */
- [0xb864, 0xb864], /* Hangul Syllable */
- [0xb865, 0xb865], /* Hangul Syllable */
- [0xb866, 0xb866], /* Hangul Syllable */
- [0xb867, 0xb867], /* Hangul Syllable */
- [0xb868, 0xb868], /* Hangul Syllable */
- [0xb869, 0xb869], /* Hangul Syllable */
- [0xb86a, 0xb86a], /* Hangul Syllable */
- [0xb86b, 0xb86b], /* Hangul Syllable */
- [0xb86c, 0xb86c], /* Hangul Syllable */
- [0xb86d, 0xb86d], /* Hangul Syllable */
- [0xb86e, 0xb86e], /* Hangul Syllable */
- [0xb86f, 0xb86f], /* Hangul Syllable */
- [0xb870, 0xb870], /* Hangul Syllable */
- [0xb871, 0xb871], /* Hangul Syllable */
- [0xb872, 0xb872], /* Hangul Syllable */
- [0xb873, 0xb873], /* Hangul Syllable */
- [0xb874, 0xb874], /* Hangul Syllable */
- [0xb875, 0xb875], /* Hangul Syllable */
- [0xb876, 0xb876], /* Hangul Syllable */
- [0xb877, 0xb877], /* Hangul Syllable */
- [0xb878, 0xb878], /* Hangul Syllable */
- [0xb879, 0xb879], /* Hangul Syllable */
- [0xb87a, 0xb87a], /* Hangul Syllable */
- [0xb87b, 0xb87b], /* Hangul Syllable */
- [0xb87c, 0xb87c], /* Hangul Syllable */
- [0xb87d, 0xb87d], /* Hangul Syllable */
- [0xb87e, 0xb87e], /* Hangul Syllable */
- [0xb87f, 0xb87f], /* Hangul Syllable */
- [0xb880, 0xb880], /* Hangul Syllable */
- [0xb881, 0xb881], /* Hangul Syllable */
- [0xb882, 0xb882], /* Hangul Syllable */
- [0xb883, 0xb883], /* Hangul Syllable */
- [0xb884, 0xb884], /* Hangul Syllable */
- [0xb885, 0xb885], /* Hangul Syllable */
- [0xb886, 0xb886], /* Hangul Syllable */
- [0xb887, 0xb887], /* Hangul Syllable */
- [0xb888, 0xb888], /* Hangul Syllable */
- [0xb889, 0xb889], /* Hangul Syllable */
- [0xb88a, 0xb88a], /* Hangul Syllable */
- [0xb88b, 0xb88b], /* Hangul Syllable */
- [0xb88c, 0xb88c], /* Hangul Syllable */
- [0xb88d, 0xb88d], /* Hangul Syllable */
- [0xb88e, 0xb88e], /* Hangul Syllable */
- [0xb88f, 0xb88f], /* Hangul Syllable */
- [0xb890, 0xb890], /* Hangul Syllable */
- [0xb891, 0xb891], /* Hangul Syllable */
- [0xb892, 0xb892], /* Hangul Syllable */
- [0xb893, 0xb893], /* Hangul Syllable */
- [0xb894, 0xb894], /* Hangul Syllable */
- [0xb895, 0xb895], /* Hangul Syllable */
- [0xb896, 0xb896], /* Hangul Syllable */
- [0xb897, 0xb897], /* Hangul Syllable */
- [0xb898, 0xb898], /* Hangul Syllable */
- [0xb899, 0xb899], /* Hangul Syllable */
- [0xb89a, 0xb89a], /* Hangul Syllable */
- [0xb89b, 0xb89b], /* Hangul Syllable */
- [0xb89c, 0xb89c], /* Hangul Syllable */
- [0xb89d, 0xb89d], /* Hangul Syllable */
- [0xb89e, 0xb89e], /* Hangul Syllable */
- [0xb89f, 0xb89f], /* Hangul Syllable */
- [0xb8a0, 0xb8a0], /* Hangul Syllable */
- [0xb8a1, 0xb8a1], /* Hangul Syllable */
- [0xb8a2, 0xb8a2], /* Hangul Syllable */
- [0xb8a3, 0xb8a3], /* Hangul Syllable */
- [0xb8a4, 0xb8a4], /* Hangul Syllable */
- [0xb8a5, 0xb8a5], /* Hangul Syllable */
- [0xb8a6, 0xb8a6], /* Hangul Syllable */
- [0xb8a7, 0xb8a7], /* Hangul Syllable */
- [0xb8a8, 0xb8a8], /* Hangul Syllable */
- [0xb8a9, 0xb8a9], /* Hangul Syllable */
- [0xb8aa, 0xb8aa], /* Hangul Syllable */
- [0xb8ab, 0xb8ab], /* Hangul Syllable */
- [0xb8ac, 0xb8ac], /* Hangul Syllable */
- [0xb8ad, 0xb8ad], /* Hangul Syllable */
- [0xb8ae, 0xb8ae], /* Hangul Syllable */
- [0xb8af, 0xb8af], /* Hangul Syllable */
- [0xb8b0, 0xb8b0], /* Hangul Syllable */
- [0xb8b1, 0xb8b1], /* Hangul Syllable */
- [0xb8b2, 0xb8b2], /* Hangul Syllable */
- [0xb8b3, 0xb8b3], /* Hangul Syllable */
- [0xb8b4, 0xb8b4], /* Hangul Syllable */
- [0xb8b5, 0xb8b5], /* Hangul Syllable */
- [0xb8b6, 0xb8b6], /* Hangul Syllable */
- [0xb8b7, 0xb8b7], /* Hangul Syllable */
- [0xb8b8, 0xb8b8], /* Hangul Syllable */
- [0xb8b9, 0xb8b9], /* Hangul Syllable */
- [0xb8ba, 0xb8ba], /* Hangul Syllable */
- [0xb8bb, 0xb8bb], /* Hangul Syllable */
- [0xb8bc, 0xb8bc], /* Hangul Syllable */
- [0xb8bd, 0xb8bd], /* Hangul Syllable */
- [0xb8be, 0xb8be], /* Hangul Syllable */
- [0xb8bf, 0xb8bf], /* Hangul Syllable */
- [0xb8c0, 0xb8c0], /* Hangul Syllable */
- [0xb8c1, 0xb8c1], /* Hangul Syllable */
- [0xb8c2, 0xb8c2], /* Hangul Syllable */
- [0xb8c3, 0xb8c3], /* Hangul Syllable */
- [0xb8c4, 0xb8c4], /* Hangul Syllable */
- [0xb8c5, 0xb8c5], /* Hangul Syllable */
- [0xb8c6, 0xb8c6], /* Hangul Syllable */
- [0xb8c7, 0xb8c7], /* Hangul Syllable */
- [0xb8c8, 0xb8c8], /* Hangul Syllable */
- [0xb8c9, 0xb8c9], /* Hangul Syllable */
- [0xb8ca, 0xb8ca], /* Hangul Syllable */
- [0xb8cb, 0xb8cb], /* Hangul Syllable */
- [0xb8cc, 0xb8cc], /* Hangul Syllable */
- [0xb8cd, 0xb8cd], /* Hangul Syllable */
- [0xb8ce, 0xb8ce], /* Hangul Syllable */
- [0xb8cf, 0xb8cf], /* Hangul Syllable */
- [0xb8d0, 0xb8d0], /* Hangul Syllable */
- [0xb8d1, 0xb8d1], /* Hangul Syllable */
- [0xb8d2, 0xb8d2], /* Hangul Syllable */
- [0xb8d3, 0xb8d3], /* Hangul Syllable */
- [0xb8d4, 0xb8d4], /* Hangul Syllable */
- [0xb8d5, 0xb8d5], /* Hangul Syllable */
- [0xb8d6, 0xb8d6], /* Hangul Syllable */
- [0xb8d7, 0xb8d7], /* Hangul Syllable */
- [0xb8d8, 0xb8d8], /* Hangul Syllable */
- [0xb8d9, 0xb8d9], /* Hangul Syllable */
- [0xb8da, 0xb8da], /* Hangul Syllable */
- [0xb8db, 0xb8db], /* Hangul Syllable */
- [0xb8dc, 0xb8dc], /* Hangul Syllable */
- [0xb8dd, 0xb8dd], /* Hangul Syllable */
- [0xb8de, 0xb8de], /* Hangul Syllable */
- [0xb8df, 0xb8df], /* Hangul Syllable */
- [0xb8e0, 0xb8e0], /* Hangul Syllable */
- [0xb8e1, 0xb8e1], /* Hangul Syllable */
- [0xb8e2, 0xb8e2], /* Hangul Syllable */
- [0xb8e3, 0xb8e3], /* Hangul Syllable */
- [0xb8e4, 0xb8e4], /* Hangul Syllable */
- [0xb8e5, 0xb8e5], /* Hangul Syllable */
- [0xb8e6, 0xb8e6], /* Hangul Syllable */
- [0xb8e7, 0xb8e7], /* Hangul Syllable */
- [0xb8e8, 0xb8e8], /* Hangul Syllable */
- [0xb8e9, 0xb8e9], /* Hangul Syllable */
- [0xb8ea, 0xb8ea], /* Hangul Syllable */
- [0xb8eb, 0xb8eb], /* Hangul Syllable */
- [0xb8ec, 0xb8ec], /* Hangul Syllable */
- [0xb8ed, 0xb8ed], /* Hangul Syllable */
- [0xb8ee, 0xb8ee], /* Hangul Syllable */
- [0xb8ef, 0xb8ef], /* Hangul Syllable */
- [0xb8f0, 0xb8f0], /* Hangul Syllable */
- [0xb8f1, 0xb8f1], /* Hangul Syllable */
- [0xb8f2, 0xb8f2], /* Hangul Syllable */
- [0xb8f3, 0xb8f3], /* Hangul Syllable */
- [0xb8f4, 0xb8f4], /* Hangul Syllable */
- [0xb8f5, 0xb8f5], /* Hangul Syllable */
- [0xb8f6, 0xb8f6], /* Hangul Syllable */
- [0xb8f7, 0xb8f7], /* Hangul Syllable */
- [0xb8f8, 0xb8f8], /* Hangul Syllable */
- [0xb8f9, 0xb8f9], /* Hangul Syllable */
- [0xb8fa, 0xb8fa], /* Hangul Syllable */
- [0xb8fb, 0xb8fb], /* Hangul Syllable */
- [0xb8fc, 0xb8fc], /* Hangul Syllable */
- [0xb8fd, 0xb8fd], /* Hangul Syllable */
- [0xb8fe, 0xb8fe], /* Hangul Syllable */
- [0xb8ff, 0xb8ff], /* Hangul Syllable */
- [0xb900, 0xb900], /* Hangul Syllable */
- [0xb901, 0xb901], /* Hangul Syllable */
- [0xb902, 0xb902], /* Hangul Syllable */
- [0xb903, 0xb903], /* Hangul Syllable */
- [0xb904, 0xb904], /* Hangul Syllable */
- [0xb905, 0xb905], /* Hangul Syllable */
- [0xb906, 0xb906], /* Hangul Syllable */
- [0xb907, 0xb907], /* Hangul Syllable */
- [0xb908, 0xb908], /* Hangul Syllable */
- [0xb909, 0xb909], /* Hangul Syllable */
- [0xb90a, 0xb90a], /* Hangul Syllable */
- [0xb90b, 0xb90b], /* Hangul Syllable */
- [0xb90c, 0xb90c], /* Hangul Syllable */
- [0xb90d, 0xb90d], /* Hangul Syllable */
- [0xb90e, 0xb90e], /* Hangul Syllable */
- [0xb90f, 0xb90f], /* Hangul Syllable */
- [0xb910, 0xb910], /* Hangul Syllable */
- [0xb911, 0xb911], /* Hangul Syllable */
- [0xb912, 0xb912], /* Hangul Syllable */
- [0xb913, 0xb913], /* Hangul Syllable */
- [0xb914, 0xb914], /* Hangul Syllable */
- [0xb915, 0xb915], /* Hangul Syllable */
- [0xb916, 0xb916], /* Hangul Syllable */
- [0xb917, 0xb917], /* Hangul Syllable */
- [0xb918, 0xb918], /* Hangul Syllable */
- [0xb919, 0xb919], /* Hangul Syllable */
- [0xb91a, 0xb91a], /* Hangul Syllable */
- [0xb91b, 0xb91b], /* Hangul Syllable */
- [0xb91c, 0xb91c], /* Hangul Syllable */
- [0xb91d, 0xb91d], /* Hangul Syllable */
- [0xb91e, 0xb91e], /* Hangul Syllable */
- [0xb91f, 0xb91f], /* Hangul Syllable */
- [0xb920, 0xb920], /* Hangul Syllable */
- [0xb921, 0xb921], /* Hangul Syllable */
- [0xb922, 0xb922], /* Hangul Syllable */
- [0xb923, 0xb923], /* Hangul Syllable */
- [0xb924, 0xb924], /* Hangul Syllable */
- [0xb925, 0xb925], /* Hangul Syllable */
- [0xb926, 0xb926], /* Hangul Syllable */
- [0xb927, 0xb927], /* Hangul Syllable */
- [0xb928, 0xb928], /* Hangul Syllable */
- [0xb929, 0xb929], /* Hangul Syllable */
- [0xb92a, 0xb92a], /* Hangul Syllable */
- [0xb92b, 0xb92b], /* Hangul Syllable */
- [0xb92c, 0xb92c], /* Hangul Syllable */
- [0xb92d, 0xb92d], /* Hangul Syllable */
- [0xb92e, 0xb92e], /* Hangul Syllable */
- [0xb92f, 0xb92f], /* Hangul Syllable */
- [0xb930, 0xb930], /* Hangul Syllable */
- [0xb931, 0xb931], /* Hangul Syllable */
- [0xb932, 0xb932], /* Hangul Syllable */
- [0xb933, 0xb933], /* Hangul Syllable */
- [0xb934, 0xb934], /* Hangul Syllable */
- [0xb935, 0xb935], /* Hangul Syllable */
- [0xb936, 0xb936], /* Hangul Syllable */
- [0xb937, 0xb937], /* Hangul Syllable */
- [0xb938, 0xb938], /* Hangul Syllable */
- [0xb939, 0xb939], /* Hangul Syllable */
- [0xb93a, 0xb93a], /* Hangul Syllable */
- [0xb93b, 0xb93b], /* Hangul Syllable */
- [0xb93c, 0xb93c], /* Hangul Syllable */
- [0xb93d, 0xb93d], /* Hangul Syllable */
- [0xb93e, 0xb93e], /* Hangul Syllable */
- [0xb93f, 0xb93f], /* Hangul Syllable */
- [0xb940, 0xb940], /* Hangul Syllable */
- [0xb941, 0xb941], /* Hangul Syllable */
- [0xb942, 0xb942], /* Hangul Syllable */
- [0xb943, 0xb943], /* Hangul Syllable */
- [0xb944, 0xb944], /* Hangul Syllable */
- [0xb945, 0xb945], /* Hangul Syllable */
- [0xb946, 0xb946], /* Hangul Syllable */
- [0xb947, 0xb947], /* Hangul Syllable */
- [0xb948, 0xb948], /* Hangul Syllable */
- [0xb949, 0xb949], /* Hangul Syllable */
- [0xb94a, 0xb94a], /* Hangul Syllable */
- [0xb94b, 0xb94b], /* Hangul Syllable */
- [0xb94c, 0xb94c], /* Hangul Syllable */
- [0xb94d, 0xb94d], /* Hangul Syllable */
- [0xb94e, 0xb94e], /* Hangul Syllable */
- [0xb94f, 0xb94f], /* Hangul Syllable */
- [0xb950, 0xb950], /* Hangul Syllable */
- [0xb951, 0xb951], /* Hangul Syllable */
- [0xb952, 0xb952], /* Hangul Syllable */
- [0xb953, 0xb953], /* Hangul Syllable */
- [0xb954, 0xb954], /* Hangul Syllable */
- [0xb955, 0xb955], /* Hangul Syllable */
- [0xb956, 0xb956], /* Hangul Syllable */
- [0xb957, 0xb957], /* Hangul Syllable */
- [0xb958, 0xb958], /* Hangul Syllable */
- [0xb959, 0xb959], /* Hangul Syllable */
- [0xb95a, 0xb95a], /* Hangul Syllable */
- [0xb95b, 0xb95b], /* Hangul Syllable */
- [0xb95c, 0xb95c], /* Hangul Syllable */
- [0xb95d, 0xb95d], /* Hangul Syllable */
- [0xb95e, 0xb95e], /* Hangul Syllable */
- [0xb95f, 0xb95f], /* Hangul Syllable */
- [0xb960, 0xb960], /* Hangul Syllable */
- [0xb961, 0xb961], /* Hangul Syllable */
- [0xb962, 0xb962], /* Hangul Syllable */
- [0xb963, 0xb963], /* Hangul Syllable */
- [0xb964, 0xb964], /* Hangul Syllable */
- [0xb965, 0xb965], /* Hangul Syllable */
- [0xb966, 0xb966], /* Hangul Syllable */
- [0xb967, 0xb967], /* Hangul Syllable */
- [0xb968, 0xb968], /* Hangul Syllable */
- [0xb969, 0xb969], /* Hangul Syllable */
- [0xb96a, 0xb96a], /* Hangul Syllable */
- [0xb96b, 0xb96b], /* Hangul Syllable */
- [0xb96c, 0xb96c], /* Hangul Syllable */
- [0xb96d, 0xb96d], /* Hangul Syllable */
- [0xb96e, 0xb96e], /* Hangul Syllable */
- [0xb96f, 0xb96f], /* Hangul Syllable */
- [0xb970, 0xb970], /* Hangul Syllable */
- [0xb971, 0xb971], /* Hangul Syllable */
- [0xb972, 0xb972], /* Hangul Syllable */
- [0xb973, 0xb973], /* Hangul Syllable */
- [0xb974, 0xb974], /* Hangul Syllable */
- [0xb975, 0xb975], /* Hangul Syllable */
- [0xb976, 0xb976], /* Hangul Syllable */
- [0xb977, 0xb977], /* Hangul Syllable */
- [0xb978, 0xb978], /* Hangul Syllable */
- [0xb979, 0xb979], /* Hangul Syllable */
- [0xb97a, 0xb97a], /* Hangul Syllable */
- [0xb97b, 0xb97b], /* Hangul Syllable */
- [0xb97c, 0xb97c], /* Hangul Syllable */
- [0xb97d, 0xb97d], /* Hangul Syllable */
- [0xb97e, 0xb97e], /* Hangul Syllable */
- [0xb97f, 0xb97f], /* Hangul Syllable */
- [0xb980, 0xb980], /* Hangul Syllable */
- [0xb981, 0xb981], /* Hangul Syllable */
- [0xb982, 0xb982], /* Hangul Syllable */
- [0xb983, 0xb983], /* Hangul Syllable */
- [0xb984, 0xb984], /* Hangul Syllable */
- [0xb985, 0xb985], /* Hangul Syllable */
- [0xb986, 0xb986], /* Hangul Syllable */
- [0xb987, 0xb987], /* Hangul Syllable */
- [0xb988, 0xb988], /* Hangul Syllable */
- [0xb989, 0xb989], /* Hangul Syllable */
- [0xb98a, 0xb98a], /* Hangul Syllable */
- [0xb98b, 0xb98b], /* Hangul Syllable */
- [0xb98c, 0xb98c], /* Hangul Syllable */
- [0xb98d, 0xb98d], /* Hangul Syllable */
- [0xb98e, 0xb98e], /* Hangul Syllable */
- [0xb98f, 0xb98f], /* Hangul Syllable */
- [0xb990, 0xb990], /* Hangul Syllable */
- [0xb991, 0xb991], /* Hangul Syllable */
- [0xb992, 0xb992], /* Hangul Syllable */
- [0xb993, 0xb993], /* Hangul Syllable */
- [0xb994, 0xb994], /* Hangul Syllable */
- [0xb995, 0xb995], /* Hangul Syllable */
- [0xb996, 0xb996], /* Hangul Syllable */
- [0xb997, 0xb997], /* Hangul Syllable */
- [0xb998, 0xb998], /* Hangul Syllable */
- [0xb999, 0xb999], /* Hangul Syllable */
- [0xb99a, 0xb99a], /* Hangul Syllable */
- [0xb99b, 0xb99b], /* Hangul Syllable */
- [0xb99c, 0xb99c], /* Hangul Syllable */
- [0xb99d, 0xb99d], /* Hangul Syllable */
- [0xb99e, 0xb99e], /* Hangul Syllable */
- [0xb99f, 0xb99f], /* Hangul Syllable */
- [0xb9a0, 0xb9a0], /* Hangul Syllable */
- [0xb9a1, 0xb9a1], /* Hangul Syllable */
- [0xb9a2, 0xb9a2], /* Hangul Syllable */
- [0xb9a3, 0xb9a3], /* Hangul Syllable */
- [0xb9a4, 0xb9a4], /* Hangul Syllable */
- [0xb9a5, 0xb9a5], /* Hangul Syllable */
- [0xb9a6, 0xb9a6], /* Hangul Syllable */
- [0xb9a7, 0xb9a7], /* Hangul Syllable */
- [0xb9a8, 0xb9a8], /* Hangul Syllable */
- [0xb9a9, 0xb9a9], /* Hangul Syllable */
- [0xb9aa, 0xb9aa], /* Hangul Syllable */
- [0xb9ab, 0xb9ab], /* Hangul Syllable */
- [0xb9ac, 0xb9ac], /* Hangul Syllable */
- [0xb9ad, 0xb9ad], /* Hangul Syllable */
- [0xb9ae, 0xb9ae], /* Hangul Syllable */
- [0xb9af, 0xb9af], /* Hangul Syllable */
- [0xb9b0, 0xb9b0], /* Hangul Syllable */
- [0xb9b1, 0xb9b1], /* Hangul Syllable */
- [0xb9b2, 0xb9b2], /* Hangul Syllable */
- [0xb9b3, 0xb9b3], /* Hangul Syllable */
- [0xb9b4, 0xb9b4], /* Hangul Syllable */
- [0xb9b5, 0xb9b5], /* Hangul Syllable */
- [0xb9b6, 0xb9b6], /* Hangul Syllable */
- [0xb9b7, 0xb9b7], /* Hangul Syllable */
- [0xb9b8, 0xb9b8], /* Hangul Syllable */
- [0xb9b9, 0xb9b9], /* Hangul Syllable */
- [0xb9ba, 0xb9ba], /* Hangul Syllable */
- [0xb9bb, 0xb9bb], /* Hangul Syllable */
- [0xb9bc, 0xb9bc], /* Hangul Syllable */
- [0xb9bd, 0xb9bd], /* Hangul Syllable */
- [0xb9be, 0xb9be], /* Hangul Syllable */
- [0xb9bf, 0xb9bf], /* Hangul Syllable */
- [0xb9c0, 0xb9c0], /* Hangul Syllable */
- [0xb9c1, 0xb9c1], /* Hangul Syllable */
- [0xb9c2, 0xb9c2], /* Hangul Syllable */
- [0xb9c3, 0xb9c3], /* Hangul Syllable */
- [0xb9c4, 0xb9c4], /* Hangul Syllable */
- [0xb9c5, 0xb9c5], /* Hangul Syllable */
- [0xb9c6, 0xb9c6], /* Hangul Syllable */
- [0xb9c7, 0xb9c7], /* Hangul Syllable */
- [0xb9c8, 0xb9c8], /* Hangul Syllable */
- [0xb9c9, 0xb9c9], /* Hangul Syllable */
- [0xb9ca, 0xb9ca], /* Hangul Syllable */
- [0xb9cb, 0xb9cb], /* Hangul Syllable */
- [0xb9cc, 0xb9cc], /* Hangul Syllable */
- [0xb9cd, 0xb9cd], /* Hangul Syllable */
- [0xb9ce, 0xb9ce], /* Hangul Syllable */
- [0xb9cf, 0xb9cf], /* Hangul Syllable */
- [0xb9d0, 0xb9d0], /* Hangul Syllable */
- [0xb9d1, 0xb9d1], /* Hangul Syllable */
- [0xb9d2, 0xb9d2], /* Hangul Syllable */
- [0xb9d3, 0xb9d3], /* Hangul Syllable */
- [0xb9d4, 0xb9d4], /* Hangul Syllable */
- [0xb9d5, 0xb9d5], /* Hangul Syllable */
- [0xb9d6, 0xb9d6], /* Hangul Syllable */
- [0xb9d7, 0xb9d7], /* Hangul Syllable */
- [0xb9d8, 0xb9d8], /* Hangul Syllable */
- [0xb9d9, 0xb9d9], /* Hangul Syllable */
- [0xb9da, 0xb9da], /* Hangul Syllable */
- [0xb9db, 0xb9db], /* Hangul Syllable */
- [0xb9dc, 0xb9dc], /* Hangul Syllable */
- [0xb9dd, 0xb9dd], /* Hangul Syllable */
- [0xb9de, 0xb9de], /* Hangul Syllable */
- [0xb9df, 0xb9df], /* Hangul Syllable */
- [0xb9e0, 0xb9e0], /* Hangul Syllable */
- [0xb9e1, 0xb9e1], /* Hangul Syllable */
- [0xb9e2, 0xb9e2], /* Hangul Syllable */
- [0xb9e3, 0xb9e3], /* Hangul Syllable */
- [0xb9e4, 0xb9e4], /* Hangul Syllable */
- [0xb9e5, 0xb9e5], /* Hangul Syllable */
- [0xb9e6, 0xb9e6], /* Hangul Syllable */
- [0xb9e7, 0xb9e7], /* Hangul Syllable */
- [0xb9e8, 0xb9e8], /* Hangul Syllable */
- [0xb9e9, 0xb9e9], /* Hangul Syllable */
- [0xb9ea, 0xb9ea], /* Hangul Syllable */
- [0xb9eb, 0xb9eb], /* Hangul Syllable */
- [0xb9ec, 0xb9ec], /* Hangul Syllable */
- [0xb9ed, 0xb9ed], /* Hangul Syllable */
- [0xb9ee, 0xb9ee], /* Hangul Syllable */
- [0xb9ef, 0xb9ef], /* Hangul Syllable */
- [0xb9f0, 0xb9f0], /* Hangul Syllable */
- [0xb9f1, 0xb9f1], /* Hangul Syllable */
- [0xb9f2, 0xb9f2], /* Hangul Syllable */
- [0xb9f3, 0xb9f3], /* Hangul Syllable */
- [0xb9f4, 0xb9f4], /* Hangul Syllable */
- [0xb9f5, 0xb9f5], /* Hangul Syllable */
- [0xb9f6, 0xb9f6], /* Hangul Syllable */
- [0xb9f7, 0xb9f7], /* Hangul Syllable */
- [0xb9f8, 0xb9f8], /* Hangul Syllable */
- [0xb9f9, 0xb9f9], /* Hangul Syllable */
- [0xb9fa, 0xb9fa], /* Hangul Syllable */
- [0xb9fb, 0xb9fb], /* Hangul Syllable */
- [0xb9fc, 0xb9fc], /* Hangul Syllable */
- [0xb9fd, 0xb9fd], /* Hangul Syllable */
- [0xb9fe, 0xb9fe], /* Hangul Syllable */
- [0xb9ff, 0xb9ff], /* Hangul Syllable */
- [0xba00, 0xba00], /* Hangul Syllable */
- [0xba01, 0xba01], /* Hangul Syllable */
- [0xba02, 0xba02], /* Hangul Syllable */
- [0xba03, 0xba03], /* Hangul Syllable */
- [0xba04, 0xba04], /* Hangul Syllable */
- [0xba05, 0xba05], /* Hangul Syllable */
- [0xba06, 0xba06], /* Hangul Syllable */
- [0xba07, 0xba07], /* Hangul Syllable */
- [0xba08, 0xba08], /* Hangul Syllable */
- [0xba09, 0xba09], /* Hangul Syllable */
- [0xba0a, 0xba0a], /* Hangul Syllable */
- [0xba0b, 0xba0b], /* Hangul Syllable */
- [0xba0c, 0xba0c], /* Hangul Syllable */
- [0xba0d, 0xba0d], /* Hangul Syllable */
- [0xba0e, 0xba0e], /* Hangul Syllable */
- [0xba0f, 0xba0f], /* Hangul Syllable */
- [0xba10, 0xba10], /* Hangul Syllable */
- [0xba11, 0xba11], /* Hangul Syllable */
- [0xba12, 0xba12], /* Hangul Syllable */
- [0xba13, 0xba13], /* Hangul Syllable */
- [0xba14, 0xba14], /* Hangul Syllable */
- [0xba15, 0xba15], /* Hangul Syllable */
- [0xba16, 0xba16], /* Hangul Syllable */
- [0xba17, 0xba17], /* Hangul Syllable */
- [0xba18, 0xba18], /* Hangul Syllable */
- [0xba19, 0xba19], /* Hangul Syllable */
- [0xba1a, 0xba1a], /* Hangul Syllable */
- [0xba1b, 0xba1b], /* Hangul Syllable */
- [0xba1c, 0xba1c], /* Hangul Syllable */
- [0xba1d, 0xba1d], /* Hangul Syllable */
- [0xba1e, 0xba1e], /* Hangul Syllable */
- [0xba1f, 0xba1f], /* Hangul Syllable */
- [0xba20, 0xba20], /* Hangul Syllable */
- [0xba21, 0xba21], /* Hangul Syllable */
- [0xba22, 0xba22], /* Hangul Syllable */
- [0xba23, 0xba23], /* Hangul Syllable */
- [0xba24, 0xba24], /* Hangul Syllable */
- [0xba25, 0xba25], /* Hangul Syllable */
- [0xba26, 0xba26], /* Hangul Syllable */
- [0xba27, 0xba27], /* Hangul Syllable */
- [0xba28, 0xba28], /* Hangul Syllable */
- [0xba29, 0xba29], /* Hangul Syllable */
- [0xba2a, 0xba2a], /* Hangul Syllable */
- [0xba2b, 0xba2b], /* Hangul Syllable */
- [0xba2c, 0xba2c], /* Hangul Syllable */
- [0xba2d, 0xba2d], /* Hangul Syllable */
- [0xba2e, 0xba2e], /* Hangul Syllable */
- [0xba2f, 0xba2f], /* Hangul Syllable */
- [0xba30, 0xba30], /* Hangul Syllable */
- [0xba31, 0xba31], /* Hangul Syllable */
- [0xba32, 0xba32], /* Hangul Syllable */
- [0xba33, 0xba33], /* Hangul Syllable */
- [0xba34, 0xba34], /* Hangul Syllable */
- [0xba35, 0xba35], /* Hangul Syllable */
- [0xba36, 0xba36], /* Hangul Syllable */
- [0xba37, 0xba37], /* Hangul Syllable */
- [0xba38, 0xba38], /* Hangul Syllable */
- [0xba39, 0xba39], /* Hangul Syllable */
- [0xba3a, 0xba3a], /* Hangul Syllable */
- [0xba3b, 0xba3b], /* Hangul Syllable */
- [0xba3c, 0xba3c], /* Hangul Syllable */
- [0xba3d, 0xba3d], /* Hangul Syllable */
- [0xba3e, 0xba3e], /* Hangul Syllable */
- [0xba3f, 0xba3f], /* Hangul Syllable */
- [0xba40, 0xba40], /* Hangul Syllable */
- [0xba41, 0xba41], /* Hangul Syllable */
- [0xba42, 0xba42], /* Hangul Syllable */
- [0xba43, 0xba43], /* Hangul Syllable */
- [0xba44, 0xba44], /* Hangul Syllable */
- [0xba45, 0xba45], /* Hangul Syllable */
- [0xba46, 0xba46], /* Hangul Syllable */
- [0xba47, 0xba47], /* Hangul Syllable */
- [0xba48, 0xba48], /* Hangul Syllable */
- [0xba49, 0xba49], /* Hangul Syllable */
- [0xba4a, 0xba4a], /* Hangul Syllable */
- [0xba4b, 0xba4b], /* Hangul Syllable */
- [0xba4c, 0xba4c], /* Hangul Syllable */
- [0xba4d, 0xba4d], /* Hangul Syllable */
- [0xba4e, 0xba4e], /* Hangul Syllable */
- [0xba4f, 0xba4f], /* Hangul Syllable */
- [0xba50, 0xba50], /* Hangul Syllable */
- [0xba51, 0xba51], /* Hangul Syllable */
- [0xba52, 0xba52], /* Hangul Syllable */
- [0xba53, 0xba53], /* Hangul Syllable */
- [0xba54, 0xba54], /* Hangul Syllable */
- [0xba55, 0xba55], /* Hangul Syllable */
- [0xba56, 0xba56], /* Hangul Syllable */
- [0xba57, 0xba57], /* Hangul Syllable */
- [0xba58, 0xba58], /* Hangul Syllable */
- [0xba59, 0xba59], /* Hangul Syllable */
- [0xba5a, 0xba5a], /* Hangul Syllable */
- [0xba5b, 0xba5b], /* Hangul Syllable */
- [0xba5c, 0xba5c], /* Hangul Syllable */
- [0xba5d, 0xba5d], /* Hangul Syllable */
- [0xba5e, 0xba5e], /* Hangul Syllable */
- [0xba5f, 0xba5f], /* Hangul Syllable */
- [0xba60, 0xba60], /* Hangul Syllable */
- [0xba61, 0xba61], /* Hangul Syllable */
- [0xba62, 0xba62], /* Hangul Syllable */
- [0xba63, 0xba63], /* Hangul Syllable */
- [0xba64, 0xba64], /* Hangul Syllable */
- [0xba65, 0xba65], /* Hangul Syllable */
- [0xba66, 0xba66], /* Hangul Syllable */
- [0xba67, 0xba67], /* Hangul Syllable */
- [0xba68, 0xba68], /* Hangul Syllable */
- [0xba69, 0xba69], /* Hangul Syllable */
- [0xba6a, 0xba6a], /* Hangul Syllable */
- [0xba6b, 0xba6b], /* Hangul Syllable */
- [0xba6c, 0xba6c], /* Hangul Syllable */
- [0xba6d, 0xba6d], /* Hangul Syllable */
- [0xba6e, 0xba6e], /* Hangul Syllable */
- [0xba6f, 0xba6f], /* Hangul Syllable */
- [0xba70, 0xba70], /* Hangul Syllable */
- [0xba71, 0xba71], /* Hangul Syllable */
- [0xba72, 0xba72], /* Hangul Syllable */
- [0xba73, 0xba73], /* Hangul Syllable */
- [0xba74, 0xba74], /* Hangul Syllable */
- [0xba75, 0xba75], /* Hangul Syllable */
- [0xba76, 0xba76], /* Hangul Syllable */
- [0xba77, 0xba77], /* Hangul Syllable */
- [0xba78, 0xba78], /* Hangul Syllable */
- [0xba79, 0xba79], /* Hangul Syllable */
- [0xba7a, 0xba7a], /* Hangul Syllable */
- [0xba7b, 0xba7b], /* Hangul Syllable */
- [0xba7c, 0xba7c], /* Hangul Syllable */
- [0xba7d, 0xba7d], /* Hangul Syllable */
- [0xba7e, 0xba7e], /* Hangul Syllable */
- [0xba7f, 0xba7f], /* Hangul Syllable */
- [0xba80, 0xba80], /* Hangul Syllable */
- [0xba81, 0xba81], /* Hangul Syllable */
- [0xba82, 0xba82], /* Hangul Syllable */
- [0xba83, 0xba83], /* Hangul Syllable */
- [0xba84, 0xba84], /* Hangul Syllable */
- [0xba85, 0xba85], /* Hangul Syllable */
- [0xba86, 0xba86], /* Hangul Syllable */
- [0xba87, 0xba87], /* Hangul Syllable */
- [0xba88, 0xba88], /* Hangul Syllable */
- [0xba89, 0xba89], /* Hangul Syllable */
- [0xba8a, 0xba8a], /* Hangul Syllable */
- [0xba8b, 0xba8b], /* Hangul Syllable */
- [0xba8c, 0xba8c], /* Hangul Syllable */
- [0xba8d, 0xba8d], /* Hangul Syllable */
- [0xba8e, 0xba8e], /* Hangul Syllable */
- [0xba8f, 0xba8f], /* Hangul Syllable */
- [0xba90, 0xba90], /* Hangul Syllable */
- [0xba91, 0xba91], /* Hangul Syllable */
- [0xba92, 0xba92], /* Hangul Syllable */
- [0xba93, 0xba93], /* Hangul Syllable */
- [0xba94, 0xba94], /* Hangul Syllable */
- [0xba95, 0xba95], /* Hangul Syllable */
- [0xba96, 0xba96], /* Hangul Syllable */
- [0xba97, 0xba97], /* Hangul Syllable */
- [0xba98, 0xba98], /* Hangul Syllable */
- [0xba99, 0xba99], /* Hangul Syllable */
- [0xba9a, 0xba9a], /* Hangul Syllable */
- [0xba9b, 0xba9b], /* Hangul Syllable */
- [0xba9c, 0xba9c], /* Hangul Syllable */
- [0xba9d, 0xba9d], /* Hangul Syllable */
- [0xba9e, 0xba9e], /* Hangul Syllable */
- [0xba9f, 0xba9f], /* Hangul Syllable */
- [0xbaa0, 0xbaa0], /* Hangul Syllable */
- [0xbaa1, 0xbaa1], /* Hangul Syllable */
- [0xbaa2, 0xbaa2], /* Hangul Syllable */
- [0xbaa3, 0xbaa3], /* Hangul Syllable */
- [0xbaa4, 0xbaa4], /* Hangul Syllable */
- [0xbaa5, 0xbaa5], /* Hangul Syllable */
- [0xbaa6, 0xbaa6], /* Hangul Syllable */
- [0xbaa7, 0xbaa7], /* Hangul Syllable */
- [0xbaa8, 0xbaa8], /* Hangul Syllable */
- [0xbaa9, 0xbaa9], /* Hangul Syllable */
- [0xbaaa, 0xbaaa], /* Hangul Syllable */
- [0xbaab, 0xbaab], /* Hangul Syllable */
- [0xbaac, 0xbaac], /* Hangul Syllable */
- [0xbaad, 0xbaad], /* Hangul Syllable */
- [0xbaae, 0xbaae], /* Hangul Syllable */
- [0xbaaf, 0xbaaf], /* Hangul Syllable */
- [0xbab0, 0xbab0], /* Hangul Syllable */
- [0xbab1, 0xbab1], /* Hangul Syllable */
- [0xbab2, 0xbab2], /* Hangul Syllable */
- [0xbab3, 0xbab3], /* Hangul Syllable */
- [0xbab4, 0xbab4], /* Hangul Syllable */
- [0xbab5, 0xbab5], /* Hangul Syllable */
- [0xbab6, 0xbab6], /* Hangul Syllable */
- [0xbab7, 0xbab7], /* Hangul Syllable */
- [0xbab8, 0xbab8], /* Hangul Syllable */
- [0xbab9, 0xbab9], /* Hangul Syllable */
- [0xbaba, 0xbaba], /* Hangul Syllable */
- [0xbabb, 0xbabb], /* Hangul Syllable */
- [0xbabc, 0xbabc], /* Hangul Syllable */
- [0xbabd, 0xbabd], /* Hangul Syllable */
- [0xbabe, 0xbabe], /* Hangul Syllable */
- [0xbabf, 0xbabf], /* Hangul Syllable */
- [0xbac0, 0xbac0], /* Hangul Syllable */
- [0xbac1, 0xbac1], /* Hangul Syllable */
- [0xbac2, 0xbac2], /* Hangul Syllable */
- [0xbac3, 0xbac3], /* Hangul Syllable */
- [0xbac4, 0xbac4], /* Hangul Syllable */
- [0xbac5, 0xbac5], /* Hangul Syllable */
- [0xbac6, 0xbac6], /* Hangul Syllable */
- [0xbac7, 0xbac7], /* Hangul Syllable */
- [0xbac8, 0xbac8], /* Hangul Syllable */
- [0xbac9, 0xbac9], /* Hangul Syllable */
- [0xbaca, 0xbaca], /* Hangul Syllable */
- [0xbacb, 0xbacb], /* Hangul Syllable */
- [0xbacc, 0xbacc], /* Hangul Syllable */
- [0xbacd, 0xbacd], /* Hangul Syllable */
- [0xbace, 0xbace], /* Hangul Syllable */
- [0xbacf, 0xbacf], /* Hangul Syllable */
- [0xbad0, 0xbad0], /* Hangul Syllable */
- [0xbad1, 0xbad1], /* Hangul Syllable */
- [0xbad2, 0xbad2], /* Hangul Syllable */
- [0xbad3, 0xbad3], /* Hangul Syllable */
- [0xbad4, 0xbad4], /* Hangul Syllable */
- [0xbad5, 0xbad5], /* Hangul Syllable */
- [0xbad6, 0xbad6], /* Hangul Syllable */
- [0xbad7, 0xbad7], /* Hangul Syllable */
- [0xbad8, 0xbad8], /* Hangul Syllable */
- [0xbad9, 0xbad9], /* Hangul Syllable */
- [0xbada, 0xbada], /* Hangul Syllable */
- [0xbadb, 0xbadb], /* Hangul Syllable */
- [0xbadc, 0xbadc], /* Hangul Syllable */
- [0xbadd, 0xbadd], /* Hangul Syllable */
- [0xbade, 0xbade], /* Hangul Syllable */
- [0xbadf, 0xbadf], /* Hangul Syllable */
- [0xbae0, 0xbae0], /* Hangul Syllable */
- [0xbae1, 0xbae1], /* Hangul Syllable */
- [0xbae2, 0xbae2], /* Hangul Syllable */
- [0xbae3, 0xbae3], /* Hangul Syllable */
- [0xbae4, 0xbae4], /* Hangul Syllable */
- [0xbae5, 0xbae5], /* Hangul Syllable */
- [0xbae6, 0xbae6], /* Hangul Syllable */
- [0xbae7, 0xbae7], /* Hangul Syllable */
- [0xbae8, 0xbae8], /* Hangul Syllable */
- [0xbae9, 0xbae9], /* Hangul Syllable */
- [0xbaea, 0xbaea], /* Hangul Syllable */
- [0xbaeb, 0xbaeb], /* Hangul Syllable */
- [0xbaec, 0xbaec], /* Hangul Syllable */
- [0xbaed, 0xbaed], /* Hangul Syllable */
- [0xbaee, 0xbaee], /* Hangul Syllable */
- [0xbaef, 0xbaef], /* Hangul Syllable */
- [0xbaf0, 0xbaf0], /* Hangul Syllable */
- [0xbaf1, 0xbaf1], /* Hangul Syllable */
- [0xbaf2, 0xbaf2], /* Hangul Syllable */
- [0xbaf3, 0xbaf3], /* Hangul Syllable */
- [0xbaf4, 0xbaf4], /* Hangul Syllable */
- [0xbaf5, 0xbaf5], /* Hangul Syllable */
- [0xbaf6, 0xbaf6], /* Hangul Syllable */
- [0xbaf7, 0xbaf7], /* Hangul Syllable */
- [0xbaf8, 0xbaf8], /* Hangul Syllable */
- [0xbaf9, 0xbaf9], /* Hangul Syllable */
- [0xbafa, 0xbafa], /* Hangul Syllable */
- [0xbafb, 0xbafb], /* Hangul Syllable */
- [0xbafc, 0xbafc], /* Hangul Syllable */
- [0xbafd, 0xbafd], /* Hangul Syllable */
- [0xbafe, 0xbafe], /* Hangul Syllable */
- [0xbaff, 0xbaff], /* Hangul Syllable */
- [0xbb00, 0xbb00], /* Hangul Syllable */
- [0xbb01, 0xbb01], /* Hangul Syllable */
- [0xbb02, 0xbb02], /* Hangul Syllable */
- [0xbb03, 0xbb03], /* Hangul Syllable */
- [0xbb04, 0xbb04], /* Hangul Syllable */
- [0xbb05, 0xbb05], /* Hangul Syllable */
- [0xbb06, 0xbb06], /* Hangul Syllable */
- [0xbb07, 0xbb07], /* Hangul Syllable */
- [0xbb08, 0xbb08], /* Hangul Syllable */
- [0xbb09, 0xbb09], /* Hangul Syllable */
- [0xbb0a, 0xbb0a], /* Hangul Syllable */
- [0xbb0b, 0xbb0b], /* Hangul Syllable */
- [0xbb0c, 0xbb0c], /* Hangul Syllable */
- [0xbb0d, 0xbb0d], /* Hangul Syllable */
- [0xbb0e, 0xbb0e], /* Hangul Syllable */
- [0xbb0f, 0xbb0f], /* Hangul Syllable */
- [0xbb10, 0xbb10], /* Hangul Syllable */
- [0xbb11, 0xbb11], /* Hangul Syllable */
- [0xbb12, 0xbb12], /* Hangul Syllable */
- [0xbb13, 0xbb13], /* Hangul Syllable */
- [0xbb14, 0xbb14], /* Hangul Syllable */
- [0xbb15, 0xbb15], /* Hangul Syllable */
- [0xbb16, 0xbb16], /* Hangul Syllable */
- [0xbb17, 0xbb17], /* Hangul Syllable */
- [0xbb18, 0xbb18], /* Hangul Syllable */
- [0xbb19, 0xbb19], /* Hangul Syllable */
- [0xbb1a, 0xbb1a], /* Hangul Syllable */
- [0xbb1b, 0xbb1b], /* Hangul Syllable */
- [0xbb1c, 0xbb1c], /* Hangul Syllable */
- [0xbb1d, 0xbb1d], /* Hangul Syllable */
- [0xbb1e, 0xbb1e], /* Hangul Syllable */
- [0xbb1f, 0xbb1f], /* Hangul Syllable */
- [0xbb20, 0xbb20], /* Hangul Syllable */
- [0xbb21, 0xbb21], /* Hangul Syllable */
- [0xbb22, 0xbb22], /* Hangul Syllable */
- [0xbb23, 0xbb23], /* Hangul Syllable */
- [0xbb24, 0xbb24], /* Hangul Syllable */
- [0xbb25, 0xbb25], /* Hangul Syllable */
- [0xbb26, 0xbb26], /* Hangul Syllable */
- [0xbb27, 0xbb27], /* Hangul Syllable */
- [0xbb28, 0xbb28], /* Hangul Syllable */
- [0xbb29, 0xbb29], /* Hangul Syllable */
- [0xbb2a, 0xbb2a], /* Hangul Syllable */
- [0xbb2b, 0xbb2b], /* Hangul Syllable */
- [0xbb2c, 0xbb2c], /* Hangul Syllable */
- [0xbb2d, 0xbb2d], /* Hangul Syllable */
- [0xbb2e, 0xbb2e], /* Hangul Syllable */
- [0xbb2f, 0xbb2f], /* Hangul Syllable */
- [0xbb30, 0xbb30], /* Hangul Syllable */
- [0xbb31, 0xbb31], /* Hangul Syllable */
- [0xbb32, 0xbb32], /* Hangul Syllable */
- [0xbb33, 0xbb33], /* Hangul Syllable */
- [0xbb34, 0xbb34], /* Hangul Syllable */
- [0xbb35, 0xbb35], /* Hangul Syllable */
- [0xbb36, 0xbb36], /* Hangul Syllable */
- [0xbb37, 0xbb37], /* Hangul Syllable */
- [0xbb38, 0xbb38], /* Hangul Syllable */
- [0xbb39, 0xbb39], /* Hangul Syllable */
- [0xbb3a, 0xbb3a], /* Hangul Syllable */
- [0xbb3b, 0xbb3b], /* Hangul Syllable */
- [0xbb3c, 0xbb3c], /* Hangul Syllable */
- [0xbb3d, 0xbb3d], /* Hangul Syllable */
- [0xbb3e, 0xbb3e], /* Hangul Syllable */
- [0xbb3f, 0xbb3f], /* Hangul Syllable */
- [0xbb40, 0xbb40], /* Hangul Syllable */
- [0xbb41, 0xbb41], /* Hangul Syllable */
- [0xbb42, 0xbb42], /* Hangul Syllable */
- [0xbb43, 0xbb43], /* Hangul Syllable */
- [0xbb44, 0xbb44], /* Hangul Syllable */
- [0xbb45, 0xbb45], /* Hangul Syllable */
- [0xbb46, 0xbb46], /* Hangul Syllable */
- [0xbb47, 0xbb47], /* Hangul Syllable */
- [0xbb48, 0xbb48], /* Hangul Syllable */
- [0xbb49, 0xbb49], /* Hangul Syllable */
- [0xbb4a, 0xbb4a], /* Hangul Syllable */
- [0xbb4b, 0xbb4b], /* Hangul Syllable */
- [0xbb4c, 0xbb4c], /* Hangul Syllable */
- [0xbb4d, 0xbb4d], /* Hangul Syllable */
- [0xbb4e, 0xbb4e], /* Hangul Syllable */
- [0xbb4f, 0xbb4f], /* Hangul Syllable */
- [0xbb50, 0xbb50], /* Hangul Syllable */
- [0xbb51, 0xbb51], /* Hangul Syllable */
- [0xbb52, 0xbb52], /* Hangul Syllable */
- [0xbb53, 0xbb53], /* Hangul Syllable */
- [0xbb54, 0xbb54], /* Hangul Syllable */
- [0xbb55, 0xbb55], /* Hangul Syllable */
- [0xbb56, 0xbb56], /* Hangul Syllable */
- [0xbb57, 0xbb57], /* Hangul Syllable */
- [0xbb58, 0xbb58], /* Hangul Syllable */
- [0xbb59, 0xbb59], /* Hangul Syllable */
- [0xbb5a, 0xbb5a], /* Hangul Syllable */
- [0xbb5b, 0xbb5b], /* Hangul Syllable */
- [0xbb5c, 0xbb5c], /* Hangul Syllable */
- [0xbb5d, 0xbb5d], /* Hangul Syllable */
- [0xbb5e, 0xbb5e], /* Hangul Syllable */
- [0xbb5f, 0xbb5f], /* Hangul Syllable */
- [0xbb60, 0xbb60], /* Hangul Syllable */
- [0xbb61, 0xbb61], /* Hangul Syllable */
- [0xbb62, 0xbb62], /* Hangul Syllable */
- [0xbb63, 0xbb63], /* Hangul Syllable */
- [0xbb64, 0xbb64], /* Hangul Syllable */
- [0xbb65, 0xbb65], /* Hangul Syllable */
- [0xbb66, 0xbb66], /* Hangul Syllable */
- [0xbb67, 0xbb67], /* Hangul Syllable */
- [0xbb68, 0xbb68], /* Hangul Syllable */
- [0xbb69, 0xbb69], /* Hangul Syllable */
- [0xbb6a, 0xbb6a], /* Hangul Syllable */
- [0xbb6b, 0xbb6b], /* Hangul Syllable */
- [0xbb6c, 0xbb6c], /* Hangul Syllable */
- [0xbb6d, 0xbb6d], /* Hangul Syllable */
- [0xbb6e, 0xbb6e], /* Hangul Syllable */
- [0xbb6f, 0xbb6f], /* Hangul Syllable */
- [0xbb70, 0xbb70], /* Hangul Syllable */
- [0xbb71, 0xbb71], /* Hangul Syllable */
- [0xbb72, 0xbb72], /* Hangul Syllable */
- [0xbb73, 0xbb73], /* Hangul Syllable */
- [0xbb74, 0xbb74], /* Hangul Syllable */
- [0xbb75, 0xbb75], /* Hangul Syllable */
- [0xbb76, 0xbb76], /* Hangul Syllable */
- [0xbb77, 0xbb77], /* Hangul Syllable */
- [0xbb78, 0xbb78], /* Hangul Syllable */
- [0xbb79, 0xbb79], /* Hangul Syllable */
- [0xbb7a, 0xbb7a], /* Hangul Syllable */
- [0xbb7b, 0xbb7b], /* Hangul Syllable */
- [0xbb7c, 0xbb7c], /* Hangul Syllable */
- [0xbb7d, 0xbb7d], /* Hangul Syllable */
- [0xbb7e, 0xbb7e], /* Hangul Syllable */
- [0xbb7f, 0xbb7f], /* Hangul Syllable */
- [0xbb80, 0xbb80], /* Hangul Syllable */
- [0xbb81, 0xbb81], /* Hangul Syllable */
- [0xbb82, 0xbb82], /* Hangul Syllable */
- [0xbb83, 0xbb83], /* Hangul Syllable */
- [0xbb84, 0xbb84], /* Hangul Syllable */
- [0xbb85, 0xbb85], /* Hangul Syllable */
- [0xbb86, 0xbb86], /* Hangul Syllable */
- [0xbb87, 0xbb87], /* Hangul Syllable */
- [0xbb88, 0xbb88], /* Hangul Syllable */
- [0xbb89, 0xbb89], /* Hangul Syllable */
- [0xbb8a, 0xbb8a], /* Hangul Syllable */
- [0xbb8b, 0xbb8b], /* Hangul Syllable */
- [0xbb8c, 0xbb8c], /* Hangul Syllable */
- [0xbb8d, 0xbb8d], /* Hangul Syllable */
- [0xbb8e, 0xbb8e], /* Hangul Syllable */
- [0xbb8f, 0xbb8f], /* Hangul Syllable */
- [0xbb90, 0xbb90], /* Hangul Syllable */
- [0xbb91, 0xbb91], /* Hangul Syllable */
- [0xbb92, 0xbb92], /* Hangul Syllable */
- [0xbb93, 0xbb93], /* Hangul Syllable */
- [0xbb94, 0xbb94], /* Hangul Syllable */
- [0xbb95, 0xbb95], /* Hangul Syllable */
- [0xbb96, 0xbb96], /* Hangul Syllable */
- [0xbb97, 0xbb97], /* Hangul Syllable */
- [0xbb98, 0xbb98], /* Hangul Syllable */
- [0xbb99, 0xbb99], /* Hangul Syllable */
- [0xbb9a, 0xbb9a], /* Hangul Syllable */
- [0xbb9b, 0xbb9b], /* Hangul Syllable */
- [0xbb9c, 0xbb9c], /* Hangul Syllable */
- [0xbb9d, 0xbb9d], /* Hangul Syllable */
- [0xbb9e, 0xbb9e], /* Hangul Syllable */
- [0xbb9f, 0xbb9f], /* Hangul Syllable */
- [0xbba0, 0xbba0], /* Hangul Syllable */
- [0xbba1, 0xbba1], /* Hangul Syllable */
- [0xbba2, 0xbba2], /* Hangul Syllable */
- [0xbba3, 0xbba3], /* Hangul Syllable */
- [0xbba4, 0xbba4], /* Hangul Syllable */
- [0xbba5, 0xbba5], /* Hangul Syllable */
- [0xbba6, 0xbba6], /* Hangul Syllable */
- [0xbba7, 0xbba7], /* Hangul Syllable */
- [0xbba8, 0xbba8], /* Hangul Syllable */
- [0xbba9, 0xbba9], /* Hangul Syllable */
- [0xbbaa, 0xbbaa], /* Hangul Syllable */
- [0xbbab, 0xbbab], /* Hangul Syllable */
- [0xbbac, 0xbbac], /* Hangul Syllable */
- [0xbbad, 0xbbad], /* Hangul Syllable */
- [0xbbae, 0xbbae], /* Hangul Syllable */
- [0xbbaf, 0xbbaf], /* Hangul Syllable */
- [0xbbb0, 0xbbb0], /* Hangul Syllable */
- [0xbbb1, 0xbbb1], /* Hangul Syllable */
- [0xbbb2, 0xbbb2], /* Hangul Syllable */
- [0xbbb3, 0xbbb3], /* Hangul Syllable */
- [0xbbb4, 0xbbb4], /* Hangul Syllable */
- [0xbbb5, 0xbbb5], /* Hangul Syllable */
- [0xbbb6, 0xbbb6], /* Hangul Syllable */
- [0xbbb7, 0xbbb7], /* Hangul Syllable */
- [0xbbb8, 0xbbb8], /* Hangul Syllable */
- [0xbbb9, 0xbbb9], /* Hangul Syllable */
- [0xbbba, 0xbbba], /* Hangul Syllable */
- [0xbbbb, 0xbbbb], /* Hangul Syllable */
- [0xbbbc, 0xbbbc], /* Hangul Syllable */
- [0xbbbd, 0xbbbd], /* Hangul Syllable */
- [0xbbbe, 0xbbbe], /* Hangul Syllable */
- [0xbbbf, 0xbbbf], /* Hangul Syllable */
- [0xbbc0, 0xbbc0], /* Hangul Syllable */
- [0xbbc1, 0xbbc1], /* Hangul Syllable */
- [0xbbc2, 0xbbc2], /* Hangul Syllable */
- [0xbbc3, 0xbbc3], /* Hangul Syllable */
- [0xbbc4, 0xbbc4], /* Hangul Syllable */
- [0xbbc5, 0xbbc5], /* Hangul Syllable */
- [0xbbc6, 0xbbc6], /* Hangul Syllable */
- [0xbbc7, 0xbbc7], /* Hangul Syllable */
- [0xbbc8, 0xbbc8], /* Hangul Syllable */
- [0xbbc9, 0xbbc9], /* Hangul Syllable */
- [0xbbca, 0xbbca], /* Hangul Syllable */
- [0xbbcb, 0xbbcb], /* Hangul Syllable */
- [0xbbcc, 0xbbcc], /* Hangul Syllable */
- [0xbbcd, 0xbbcd], /* Hangul Syllable */
- [0xbbce, 0xbbce], /* Hangul Syllable */
- [0xbbcf, 0xbbcf], /* Hangul Syllable */
- [0xbbd0, 0xbbd0], /* Hangul Syllable */
- [0xbbd1, 0xbbd1], /* Hangul Syllable */
- [0xbbd2, 0xbbd2], /* Hangul Syllable */
- [0xbbd3, 0xbbd3], /* Hangul Syllable */
- [0xbbd4, 0xbbd4], /* Hangul Syllable */
- [0xbbd5, 0xbbd5], /* Hangul Syllable */
- [0xbbd6, 0xbbd6], /* Hangul Syllable */
- [0xbbd7, 0xbbd7], /* Hangul Syllable */
- [0xbbd8, 0xbbd8], /* Hangul Syllable */
- [0xbbd9, 0xbbd9], /* Hangul Syllable */
- [0xbbda, 0xbbda], /* Hangul Syllable */
- [0xbbdb, 0xbbdb], /* Hangul Syllable */
- [0xbbdc, 0xbbdc], /* Hangul Syllable */
- [0xbbdd, 0xbbdd], /* Hangul Syllable */
- [0xbbde, 0xbbde], /* Hangul Syllable */
- [0xbbdf, 0xbbdf], /* Hangul Syllable */
- [0xbbe0, 0xbbe0], /* Hangul Syllable */
- [0xbbe1, 0xbbe1], /* Hangul Syllable */
- [0xbbe2, 0xbbe2], /* Hangul Syllable */
- [0xbbe3, 0xbbe3], /* Hangul Syllable */
- [0xbbe4, 0xbbe4], /* Hangul Syllable */
- [0xbbe5, 0xbbe5], /* Hangul Syllable */
- [0xbbe6, 0xbbe6], /* Hangul Syllable */
- [0xbbe7, 0xbbe7], /* Hangul Syllable */
- [0xbbe8, 0xbbe8], /* Hangul Syllable */
- [0xbbe9, 0xbbe9], /* Hangul Syllable */
- [0xbbea, 0xbbea], /* Hangul Syllable */
- [0xbbeb, 0xbbeb], /* Hangul Syllable */
- [0xbbec, 0xbbec], /* Hangul Syllable */
- [0xbbed, 0xbbed], /* Hangul Syllable */
- [0xbbee, 0xbbee], /* Hangul Syllable */
- [0xbbef, 0xbbef], /* Hangul Syllable */
- [0xbbf0, 0xbbf0], /* Hangul Syllable */
- [0xbbf1, 0xbbf1], /* Hangul Syllable */
- [0xbbf2, 0xbbf2], /* Hangul Syllable */
- [0xbbf3, 0xbbf3], /* Hangul Syllable */
- [0xbbf4, 0xbbf4], /* Hangul Syllable */
- [0xbbf5, 0xbbf5], /* Hangul Syllable */
- [0xbbf6, 0xbbf6], /* Hangul Syllable */
- [0xbbf7, 0xbbf7], /* Hangul Syllable */
- [0xbbf8, 0xbbf8], /* Hangul Syllable */
- [0xbbf9, 0xbbf9], /* Hangul Syllable */
- [0xbbfa, 0xbbfa], /* Hangul Syllable */
- [0xbbfb, 0xbbfb], /* Hangul Syllable */
- [0xbbfc, 0xbbfc], /* Hangul Syllable */
- [0xbbfd, 0xbbfd], /* Hangul Syllable */
- [0xbbfe, 0xbbfe], /* Hangul Syllable */
- [0xbbff, 0xbbff], /* Hangul Syllable */
- [0xbc00, 0xbc00], /* Hangul Syllable */
- [0xbc01, 0xbc01], /* Hangul Syllable */
- [0xbc02, 0xbc02], /* Hangul Syllable */
- [0xbc03, 0xbc03], /* Hangul Syllable */
- [0xbc04, 0xbc04], /* Hangul Syllable */
- [0xbc05, 0xbc05], /* Hangul Syllable */
- [0xbc06, 0xbc06], /* Hangul Syllable */
- [0xbc07, 0xbc07], /* Hangul Syllable */
- [0xbc08, 0xbc08], /* Hangul Syllable */
- [0xbc09, 0xbc09], /* Hangul Syllable */
- [0xbc0a, 0xbc0a], /* Hangul Syllable */
- [0xbc0b, 0xbc0b], /* Hangul Syllable */
- [0xbc0c, 0xbc0c], /* Hangul Syllable */
- [0xbc0d, 0xbc0d], /* Hangul Syllable */
- [0xbc0e, 0xbc0e], /* Hangul Syllable */
- [0xbc0f, 0xbc0f], /* Hangul Syllable */
- [0xbc10, 0xbc10], /* Hangul Syllable */
- [0xbc11, 0xbc11], /* Hangul Syllable */
- [0xbc12, 0xbc12], /* Hangul Syllable */
- [0xbc13, 0xbc13], /* Hangul Syllable */
- [0xbc14, 0xbc14], /* Hangul Syllable */
- [0xbc15, 0xbc15], /* Hangul Syllable */
- [0xbc16, 0xbc16], /* Hangul Syllable */
- [0xbc17, 0xbc17], /* Hangul Syllable */
- [0xbc18, 0xbc18], /* Hangul Syllable */
- [0xbc19, 0xbc19], /* Hangul Syllable */
- [0xbc1a, 0xbc1a], /* Hangul Syllable */
- [0xbc1b, 0xbc1b], /* Hangul Syllable */
- [0xbc1c, 0xbc1c], /* Hangul Syllable */
- [0xbc1d, 0xbc1d], /* Hangul Syllable */
- [0xbc1e, 0xbc1e], /* Hangul Syllable */
- [0xbc1f, 0xbc1f], /* Hangul Syllable */
- [0xbc20, 0xbc20], /* Hangul Syllable */
- [0xbc21, 0xbc21], /* Hangul Syllable */
- [0xbc22, 0xbc22], /* Hangul Syllable */
- [0xbc23, 0xbc23], /* Hangul Syllable */
- [0xbc24, 0xbc24], /* Hangul Syllable */
- [0xbc25, 0xbc25], /* Hangul Syllable */
- [0xbc26, 0xbc26], /* Hangul Syllable */
- [0xbc27, 0xbc27], /* Hangul Syllable */
- [0xbc28, 0xbc28], /* Hangul Syllable */
- [0xbc29, 0xbc29], /* Hangul Syllable */
- [0xbc2a, 0xbc2a], /* Hangul Syllable */
- [0xbc2b, 0xbc2b], /* Hangul Syllable */
- [0xbc2c, 0xbc2c], /* Hangul Syllable */
- [0xbc2d, 0xbc2d], /* Hangul Syllable */
- [0xbc2e, 0xbc2e], /* Hangul Syllable */
- [0xbc2f, 0xbc2f], /* Hangul Syllable */
- [0xbc30, 0xbc30], /* Hangul Syllable */
- [0xbc31, 0xbc31], /* Hangul Syllable */
- [0xbc32, 0xbc32], /* Hangul Syllable */
- [0xbc33, 0xbc33], /* Hangul Syllable */
- [0xbc34, 0xbc34], /* Hangul Syllable */
- [0xbc35, 0xbc35], /* Hangul Syllable */
- [0xbc36, 0xbc36], /* Hangul Syllable */
- [0xbc37, 0xbc37], /* Hangul Syllable */
- [0xbc38, 0xbc38], /* Hangul Syllable */
- [0xbc39, 0xbc39], /* Hangul Syllable */
- [0xbc3a, 0xbc3a], /* Hangul Syllable */
- [0xbc3b, 0xbc3b], /* Hangul Syllable */
- [0xbc3c, 0xbc3c], /* Hangul Syllable */
- [0xbc3d, 0xbc3d], /* Hangul Syllable */
- [0xbc3e, 0xbc3e], /* Hangul Syllable */
- [0xbc3f, 0xbc3f], /* Hangul Syllable */
- [0xbc40, 0xbc40], /* Hangul Syllable */
- [0xbc41, 0xbc41], /* Hangul Syllable */
- [0xbc42, 0xbc42], /* Hangul Syllable */
- [0xbc43, 0xbc43], /* Hangul Syllable */
- [0xbc44, 0xbc44], /* Hangul Syllable */
- [0xbc45, 0xbc45], /* Hangul Syllable */
- [0xbc46, 0xbc46], /* Hangul Syllable */
- [0xbc47, 0xbc47], /* Hangul Syllable */
- [0xbc48, 0xbc48], /* Hangul Syllable */
- [0xbc49, 0xbc49], /* Hangul Syllable */
- [0xbc4a, 0xbc4a], /* Hangul Syllable */
- [0xbc4b, 0xbc4b], /* Hangul Syllable */
- [0xbc4c, 0xbc4c], /* Hangul Syllable */
- [0xbc4d, 0xbc4d], /* Hangul Syllable */
- [0xbc4e, 0xbc4e], /* Hangul Syllable */
- [0xbc4f, 0xbc4f], /* Hangul Syllable */
- [0xbc50, 0xbc50], /* Hangul Syllable */
- [0xbc51, 0xbc51], /* Hangul Syllable */
- [0xbc52, 0xbc52], /* Hangul Syllable */
- [0xbc53, 0xbc53], /* Hangul Syllable */
- [0xbc54, 0xbc54], /* Hangul Syllable */
- [0xbc55, 0xbc55], /* Hangul Syllable */
- [0xbc56, 0xbc56], /* Hangul Syllable */
- [0xbc57, 0xbc57], /* Hangul Syllable */
- [0xbc58, 0xbc58], /* Hangul Syllable */
- [0xbc59, 0xbc59], /* Hangul Syllable */
- [0xbc5a, 0xbc5a], /* Hangul Syllable */
- [0xbc5b, 0xbc5b], /* Hangul Syllable */
- [0xbc5c, 0xbc5c], /* Hangul Syllable */
- [0xbc5d, 0xbc5d], /* Hangul Syllable */
- [0xbc5e, 0xbc5e], /* Hangul Syllable */
- [0xbc5f, 0xbc5f], /* Hangul Syllable */
- [0xbc60, 0xbc60], /* Hangul Syllable */
- [0xbc61, 0xbc61], /* Hangul Syllable */
- [0xbc62, 0xbc62], /* Hangul Syllable */
- [0xbc63, 0xbc63], /* Hangul Syllable */
- [0xbc64, 0xbc64], /* Hangul Syllable */
- [0xbc65, 0xbc65], /* Hangul Syllable */
- [0xbc66, 0xbc66], /* Hangul Syllable */
- [0xbc67, 0xbc67], /* Hangul Syllable */
- [0xbc68, 0xbc68], /* Hangul Syllable */
- [0xbc69, 0xbc69], /* Hangul Syllable */
- [0xbc6a, 0xbc6a], /* Hangul Syllable */
- [0xbc6b, 0xbc6b], /* Hangul Syllable */
- [0xbc6c, 0xbc6c], /* Hangul Syllable */
- [0xbc6d, 0xbc6d], /* Hangul Syllable */
- [0xbc6e, 0xbc6e], /* Hangul Syllable */
- [0xbc6f, 0xbc6f], /* Hangul Syllable */
- [0xbc70, 0xbc70], /* Hangul Syllable */
- [0xbc71, 0xbc71], /* Hangul Syllable */
- [0xbc72, 0xbc72], /* Hangul Syllable */
- [0xbc73, 0xbc73], /* Hangul Syllable */
- [0xbc74, 0xbc74], /* Hangul Syllable */
- [0xbc75, 0xbc75], /* Hangul Syllable */
- [0xbc76, 0xbc76], /* Hangul Syllable */
- [0xbc77, 0xbc77], /* Hangul Syllable */
- [0xbc78, 0xbc78], /* Hangul Syllable */
- [0xbc79, 0xbc79], /* Hangul Syllable */
- [0xbc7a, 0xbc7a], /* Hangul Syllable */
- [0xbc7b, 0xbc7b], /* Hangul Syllable */
- [0xbc7c, 0xbc7c], /* Hangul Syllable */
- [0xbc7d, 0xbc7d], /* Hangul Syllable */
- [0xbc7e, 0xbc7e], /* Hangul Syllable */
- [0xbc7f, 0xbc7f], /* Hangul Syllable */
- [0xbc80, 0xbc80], /* Hangul Syllable */
- [0xbc81, 0xbc81], /* Hangul Syllable */
- [0xbc82, 0xbc82], /* Hangul Syllable */
- [0xbc83, 0xbc83], /* Hangul Syllable */
- [0xbc84, 0xbc84], /* Hangul Syllable */
- [0xbc85, 0xbc85], /* Hangul Syllable */
- [0xbc86, 0xbc86], /* Hangul Syllable */
- [0xbc87, 0xbc87], /* Hangul Syllable */
- [0xbc88, 0xbc88], /* Hangul Syllable */
- [0xbc89, 0xbc89], /* Hangul Syllable */
- [0xbc8a, 0xbc8a], /* Hangul Syllable */
- [0xbc8b, 0xbc8b], /* Hangul Syllable */
- [0xbc8c, 0xbc8c], /* Hangul Syllable */
- [0xbc8d, 0xbc8d], /* Hangul Syllable */
- [0xbc8e, 0xbc8e], /* Hangul Syllable */
- [0xbc8f, 0xbc8f], /* Hangul Syllable */
- [0xbc90, 0xbc90], /* Hangul Syllable */
- [0xbc91, 0xbc91], /* Hangul Syllable */
- [0xbc92, 0xbc92], /* Hangul Syllable */
- [0xbc93, 0xbc93], /* Hangul Syllable */
- [0xbc94, 0xbc94], /* Hangul Syllable */
- [0xbc95, 0xbc95], /* Hangul Syllable */
- [0xbc96, 0xbc96], /* Hangul Syllable */
- [0xbc97, 0xbc97], /* Hangul Syllable */
- [0xbc98, 0xbc98], /* Hangul Syllable */
- [0xbc99, 0xbc99], /* Hangul Syllable */
- [0xbc9a, 0xbc9a], /* Hangul Syllable */
- [0xbc9b, 0xbc9b], /* Hangul Syllable */
- [0xbc9c, 0xbc9c], /* Hangul Syllable */
- [0xbc9d, 0xbc9d], /* Hangul Syllable */
- [0xbc9e, 0xbc9e], /* Hangul Syllable */
- [0xbc9f, 0xbc9f], /* Hangul Syllable */
- [0xbca0, 0xbca0], /* Hangul Syllable */
- [0xbca1, 0xbca1], /* Hangul Syllable */
- [0xbca2, 0xbca2], /* Hangul Syllable */
- [0xbca3, 0xbca3], /* Hangul Syllable */
- [0xbca4, 0xbca4], /* Hangul Syllable */
- [0xbca5, 0xbca5], /* Hangul Syllable */
- [0xbca6, 0xbca6], /* Hangul Syllable */
- [0xbca7, 0xbca7], /* Hangul Syllable */
- [0xbca8, 0xbca8], /* Hangul Syllable */
- [0xbca9, 0xbca9], /* Hangul Syllable */
- [0xbcaa, 0xbcaa], /* Hangul Syllable */
- [0xbcab, 0xbcab], /* Hangul Syllable */
- [0xbcac, 0xbcac], /* Hangul Syllable */
- [0xbcad, 0xbcad], /* Hangul Syllable */
- [0xbcae, 0xbcae], /* Hangul Syllable */
- [0xbcaf, 0xbcaf], /* Hangul Syllable */
- [0xbcb0, 0xbcb0], /* Hangul Syllable */
- [0xbcb1, 0xbcb1], /* Hangul Syllable */
- [0xbcb2, 0xbcb2], /* Hangul Syllable */
- [0xbcb3, 0xbcb3], /* Hangul Syllable */
- [0xbcb4, 0xbcb4], /* Hangul Syllable */
- [0xbcb5, 0xbcb5], /* Hangul Syllable */
- [0xbcb6, 0xbcb6], /* Hangul Syllable */
- [0xbcb7, 0xbcb7], /* Hangul Syllable */
- [0xbcb8, 0xbcb8], /* Hangul Syllable */
- [0xbcb9, 0xbcb9], /* Hangul Syllable */
- [0xbcba, 0xbcba], /* Hangul Syllable */
- [0xbcbb, 0xbcbb], /* Hangul Syllable */
- [0xbcbc, 0xbcbc], /* Hangul Syllable */
- [0xbcbd, 0xbcbd], /* Hangul Syllable */
- [0xbcbe, 0xbcbe], /* Hangul Syllable */
- [0xbcbf, 0xbcbf], /* Hangul Syllable */
- [0xbcc0, 0xbcc0], /* Hangul Syllable */
- [0xbcc1, 0xbcc1], /* Hangul Syllable */
- [0xbcc2, 0xbcc2], /* Hangul Syllable */
- [0xbcc3, 0xbcc3], /* Hangul Syllable */
- [0xbcc4, 0xbcc4], /* Hangul Syllable */
- [0xbcc5, 0xbcc5], /* Hangul Syllable */
- [0xbcc6, 0xbcc6], /* Hangul Syllable */
- [0xbcc7, 0xbcc7], /* Hangul Syllable */
- [0xbcc8, 0xbcc8], /* Hangul Syllable */
- [0xbcc9, 0xbcc9], /* Hangul Syllable */
- [0xbcca, 0xbcca], /* Hangul Syllable */
- [0xbccb, 0xbccb], /* Hangul Syllable */
- [0xbccc, 0xbccc], /* Hangul Syllable */
- [0xbccd, 0xbccd], /* Hangul Syllable */
- [0xbcce, 0xbcce], /* Hangul Syllable */
- [0xbccf, 0xbccf], /* Hangul Syllable */
- [0xbcd0, 0xbcd0], /* Hangul Syllable */
- [0xbcd1, 0xbcd1], /* Hangul Syllable */
- [0xbcd2, 0xbcd2], /* Hangul Syllable */
- [0xbcd3, 0xbcd3], /* Hangul Syllable */
- [0xbcd4, 0xbcd4], /* Hangul Syllable */
- [0xbcd5, 0xbcd5], /* Hangul Syllable */
- [0xbcd6, 0xbcd6], /* Hangul Syllable */
- [0xbcd7, 0xbcd7], /* Hangul Syllable */
- [0xbcd8, 0xbcd8], /* Hangul Syllable */
- [0xbcd9, 0xbcd9], /* Hangul Syllable */
- [0xbcda, 0xbcda], /* Hangul Syllable */
- [0xbcdb, 0xbcdb], /* Hangul Syllable */
- [0xbcdc, 0xbcdc], /* Hangul Syllable */
- [0xbcdd, 0xbcdd], /* Hangul Syllable */
- [0xbcde, 0xbcde], /* Hangul Syllable */
- [0xbcdf, 0xbcdf], /* Hangul Syllable */
- [0xbce0, 0xbce0], /* Hangul Syllable */
- [0xbce1, 0xbce1], /* Hangul Syllable */
- [0xbce2, 0xbce2], /* Hangul Syllable */
- [0xbce3, 0xbce3], /* Hangul Syllable */
- [0xbce4, 0xbce4], /* Hangul Syllable */
- [0xbce5, 0xbce5], /* Hangul Syllable */
- [0xbce6, 0xbce6], /* Hangul Syllable */
- [0xbce7, 0xbce7], /* Hangul Syllable */
- [0xbce8, 0xbce8], /* Hangul Syllable */
- [0xbce9, 0xbce9], /* Hangul Syllable */
- [0xbcea, 0xbcea], /* Hangul Syllable */
- [0xbceb, 0xbceb], /* Hangul Syllable */
- [0xbcec, 0xbcec], /* Hangul Syllable */
- [0xbced, 0xbced], /* Hangul Syllable */
- [0xbcee, 0xbcee], /* Hangul Syllable */
- [0xbcef, 0xbcef], /* Hangul Syllable */
- [0xbcf0, 0xbcf0], /* Hangul Syllable */
- [0xbcf1, 0xbcf1], /* Hangul Syllable */
- [0xbcf2, 0xbcf2], /* Hangul Syllable */
- [0xbcf3, 0xbcf3], /* Hangul Syllable */
- [0xbcf4, 0xbcf4], /* Hangul Syllable */
- [0xbcf5, 0xbcf5], /* Hangul Syllable */
- [0xbcf6, 0xbcf6], /* Hangul Syllable */
- [0xbcf7, 0xbcf7], /* Hangul Syllable */
- [0xbcf8, 0xbcf8], /* Hangul Syllable */
- [0xbcf9, 0xbcf9], /* Hangul Syllable */
- [0xbcfa, 0xbcfa], /* Hangul Syllable */
- [0xbcfb, 0xbcfb], /* Hangul Syllable */
- [0xbcfc, 0xbcfc], /* Hangul Syllable */
- [0xbcfd, 0xbcfd], /* Hangul Syllable */
- [0xbcfe, 0xbcfe], /* Hangul Syllable */
- [0xbcff, 0xbcff], /* Hangul Syllable */
- [0xbd00, 0xbd00], /* Hangul Syllable */
- [0xbd01, 0xbd01], /* Hangul Syllable */
- [0xbd02, 0xbd02], /* Hangul Syllable */
- [0xbd03, 0xbd03], /* Hangul Syllable */
- [0xbd04, 0xbd04], /* Hangul Syllable */
- [0xbd05, 0xbd05], /* Hangul Syllable */
- [0xbd06, 0xbd06], /* Hangul Syllable */
- [0xbd07, 0xbd07], /* Hangul Syllable */
- [0xbd08, 0xbd08], /* Hangul Syllable */
- [0xbd09, 0xbd09], /* Hangul Syllable */
- [0xbd0a, 0xbd0a], /* Hangul Syllable */
- [0xbd0b, 0xbd0b], /* Hangul Syllable */
- [0xbd0c, 0xbd0c], /* Hangul Syllable */
- [0xbd0d, 0xbd0d], /* Hangul Syllable */
- [0xbd0e, 0xbd0e], /* Hangul Syllable */
- [0xbd0f, 0xbd0f], /* Hangul Syllable */
- [0xbd10, 0xbd10], /* Hangul Syllable */
- [0xbd11, 0xbd11], /* Hangul Syllable */
- [0xbd12, 0xbd12], /* Hangul Syllable */
- [0xbd13, 0xbd13], /* Hangul Syllable */
- [0xbd14, 0xbd14], /* Hangul Syllable */
- [0xbd15, 0xbd15], /* Hangul Syllable */
- [0xbd16, 0xbd16], /* Hangul Syllable */
- [0xbd17, 0xbd17], /* Hangul Syllable */
- [0xbd18, 0xbd18], /* Hangul Syllable */
- [0xbd19, 0xbd19], /* Hangul Syllable */
- [0xbd1a, 0xbd1a], /* Hangul Syllable */
- [0xbd1b, 0xbd1b], /* Hangul Syllable */
- [0xbd1c, 0xbd1c], /* Hangul Syllable */
- [0xbd1d, 0xbd1d], /* Hangul Syllable */
- [0xbd1e, 0xbd1e], /* Hangul Syllable */
- [0xbd1f, 0xbd1f], /* Hangul Syllable */
- [0xbd20, 0xbd20], /* Hangul Syllable */
- [0xbd21, 0xbd21], /* Hangul Syllable */
- [0xbd22, 0xbd22], /* Hangul Syllable */
- [0xbd23, 0xbd23], /* Hangul Syllable */
- [0xbd24, 0xbd24], /* Hangul Syllable */
- [0xbd25, 0xbd25], /* Hangul Syllable */
- [0xbd26, 0xbd26], /* Hangul Syllable */
- [0xbd27, 0xbd27], /* Hangul Syllable */
- [0xbd28, 0xbd28], /* Hangul Syllable */
- [0xbd29, 0xbd29], /* Hangul Syllable */
- [0xbd2a, 0xbd2a], /* Hangul Syllable */
- [0xbd2b, 0xbd2b], /* Hangul Syllable */
- [0xbd2c, 0xbd2c], /* Hangul Syllable */
- [0xbd2d, 0xbd2d], /* Hangul Syllable */
- [0xbd2e, 0xbd2e], /* Hangul Syllable */
- [0xbd2f, 0xbd2f], /* Hangul Syllable */
- [0xbd30, 0xbd30], /* Hangul Syllable */
- [0xbd31, 0xbd31], /* Hangul Syllable */
- [0xbd32, 0xbd32], /* Hangul Syllable */
- [0xbd33, 0xbd33], /* Hangul Syllable */
- [0xbd34, 0xbd34], /* Hangul Syllable */
- [0xbd35, 0xbd35], /* Hangul Syllable */
- [0xbd36, 0xbd36], /* Hangul Syllable */
- [0xbd37, 0xbd37], /* Hangul Syllable */
- [0xbd38, 0xbd38], /* Hangul Syllable */
- [0xbd39, 0xbd39], /* Hangul Syllable */
- [0xbd3a, 0xbd3a], /* Hangul Syllable */
- [0xbd3b, 0xbd3b], /* Hangul Syllable */
- [0xbd3c, 0xbd3c], /* Hangul Syllable */
- [0xbd3d, 0xbd3d], /* Hangul Syllable */
- [0xbd3e, 0xbd3e], /* Hangul Syllable */
- [0xbd3f, 0xbd3f], /* Hangul Syllable */
- [0xbd40, 0xbd40], /* Hangul Syllable */
- [0xbd41, 0xbd41], /* Hangul Syllable */
- [0xbd42, 0xbd42], /* Hangul Syllable */
- [0xbd43, 0xbd43], /* Hangul Syllable */
- [0xbd44, 0xbd44], /* Hangul Syllable */
- [0xbd45, 0xbd45], /* Hangul Syllable */
- [0xbd46, 0xbd46], /* Hangul Syllable */
- [0xbd47, 0xbd47], /* Hangul Syllable */
- [0xbd48, 0xbd48], /* Hangul Syllable */
- [0xbd49, 0xbd49], /* Hangul Syllable */
- [0xbd4a, 0xbd4a], /* Hangul Syllable */
- [0xbd4b, 0xbd4b], /* Hangul Syllable */
- [0xbd4c, 0xbd4c], /* Hangul Syllable */
- [0xbd4d, 0xbd4d], /* Hangul Syllable */
- [0xbd4e, 0xbd4e], /* Hangul Syllable */
- [0xbd4f, 0xbd4f], /* Hangul Syllable */
- [0xbd50, 0xbd50], /* Hangul Syllable */
- [0xbd51, 0xbd51], /* Hangul Syllable */
- [0xbd52, 0xbd52], /* Hangul Syllable */
- [0xbd53, 0xbd53], /* Hangul Syllable */
- [0xbd54, 0xbd54], /* Hangul Syllable */
- [0xbd55, 0xbd55], /* Hangul Syllable */
- [0xbd56, 0xbd56], /* Hangul Syllable */
- [0xbd57, 0xbd57], /* Hangul Syllable */
- [0xbd58, 0xbd58], /* Hangul Syllable */
- [0xbd59, 0xbd59], /* Hangul Syllable */
- [0xbd5a, 0xbd5a], /* Hangul Syllable */
- [0xbd5b, 0xbd5b], /* Hangul Syllable */
- [0xbd5c, 0xbd5c], /* Hangul Syllable */
- [0xbd5d, 0xbd5d], /* Hangul Syllable */
- [0xbd5e, 0xbd5e], /* Hangul Syllable */
- [0xbd5f, 0xbd5f], /* Hangul Syllable */
- [0xbd60, 0xbd60], /* Hangul Syllable */
- [0xbd61, 0xbd61], /* Hangul Syllable */
- [0xbd62, 0xbd62], /* Hangul Syllable */
- [0xbd63, 0xbd63], /* Hangul Syllable */
- [0xbd64, 0xbd64], /* Hangul Syllable */
- [0xbd65, 0xbd65], /* Hangul Syllable */
- [0xbd66, 0xbd66], /* Hangul Syllable */
- [0xbd67, 0xbd67], /* Hangul Syllable */
- [0xbd68, 0xbd68], /* Hangul Syllable */
- [0xbd69, 0xbd69], /* Hangul Syllable */
- [0xbd6a, 0xbd6a], /* Hangul Syllable */
- [0xbd6b, 0xbd6b], /* Hangul Syllable */
- [0xbd6c, 0xbd6c], /* Hangul Syllable */
- [0xbd6d, 0xbd6d], /* Hangul Syllable */
- [0xbd6e, 0xbd6e], /* Hangul Syllable */
- [0xbd6f, 0xbd6f], /* Hangul Syllable */
- [0xbd70, 0xbd70], /* Hangul Syllable */
- [0xbd71, 0xbd71], /* Hangul Syllable */
- [0xbd72, 0xbd72], /* Hangul Syllable */
- [0xbd73, 0xbd73], /* Hangul Syllable */
- [0xbd74, 0xbd74], /* Hangul Syllable */
- [0xbd75, 0xbd75], /* Hangul Syllable */
- [0xbd76, 0xbd76], /* Hangul Syllable */
- [0xbd77, 0xbd77], /* Hangul Syllable */
- [0xbd78, 0xbd78], /* Hangul Syllable */
- [0xbd79, 0xbd79], /* Hangul Syllable */
- [0xbd7a, 0xbd7a], /* Hangul Syllable */
- [0xbd7b, 0xbd7b], /* Hangul Syllable */
- [0xbd7c, 0xbd7c], /* Hangul Syllable */
- [0xbd7d, 0xbd7d], /* Hangul Syllable */
- [0xbd7e, 0xbd7e], /* Hangul Syllable */
- [0xbd7f, 0xbd7f], /* Hangul Syllable */
- [0xbd80, 0xbd80], /* Hangul Syllable */
- [0xbd81, 0xbd81], /* Hangul Syllable */
- [0xbd82, 0xbd82], /* Hangul Syllable */
- [0xbd83, 0xbd83], /* Hangul Syllable */
- [0xbd84, 0xbd84], /* Hangul Syllable */
- [0xbd85, 0xbd85], /* Hangul Syllable */
- [0xbd86, 0xbd86], /* Hangul Syllable */
- [0xbd87, 0xbd87], /* Hangul Syllable */
- [0xbd88, 0xbd88], /* Hangul Syllable */
- [0xbd89, 0xbd89], /* Hangul Syllable */
- [0xbd8a, 0xbd8a], /* Hangul Syllable */
- [0xbd8b, 0xbd8b], /* Hangul Syllable */
- [0xbd8c, 0xbd8c], /* Hangul Syllable */
- [0xbd8d, 0xbd8d], /* Hangul Syllable */
- [0xbd8e, 0xbd8e], /* Hangul Syllable */
- [0xbd8f, 0xbd8f], /* Hangul Syllable */
- [0xbd90, 0xbd90], /* Hangul Syllable */
- [0xbd91, 0xbd91], /* Hangul Syllable */
- [0xbd92, 0xbd92], /* Hangul Syllable */
- [0xbd93, 0xbd93], /* Hangul Syllable */
- [0xbd94, 0xbd94], /* Hangul Syllable */
- [0xbd95, 0xbd95], /* Hangul Syllable */
- [0xbd96, 0xbd96], /* Hangul Syllable */
- [0xbd97, 0xbd97], /* Hangul Syllable */
- [0xbd98, 0xbd98], /* Hangul Syllable */
- [0xbd99, 0xbd99], /* Hangul Syllable */
- [0xbd9a, 0xbd9a], /* Hangul Syllable */
- [0xbd9b, 0xbd9b], /* Hangul Syllable */
- [0xbd9c, 0xbd9c], /* Hangul Syllable */
- [0xbd9d, 0xbd9d], /* Hangul Syllable */
- [0xbd9e, 0xbd9e], /* Hangul Syllable */
- [0xbd9f, 0xbd9f], /* Hangul Syllable */
- [0xbda0, 0xbda0], /* Hangul Syllable */
- [0xbda1, 0xbda1], /* Hangul Syllable */
- [0xbda2, 0xbda2], /* Hangul Syllable */
- [0xbda3, 0xbda3], /* Hangul Syllable */
- [0xbda4, 0xbda4], /* Hangul Syllable */
- [0xbda5, 0xbda5], /* Hangul Syllable */
- [0xbda6, 0xbda6], /* Hangul Syllable */
- [0xbda7, 0xbda7], /* Hangul Syllable */
- [0xbda8, 0xbda8], /* Hangul Syllable */
- [0xbda9, 0xbda9], /* Hangul Syllable */
- [0xbdaa, 0xbdaa], /* Hangul Syllable */
- [0xbdab, 0xbdab], /* Hangul Syllable */
- [0xbdac, 0xbdac], /* Hangul Syllable */
- [0xbdad, 0xbdad], /* Hangul Syllable */
- [0xbdae, 0xbdae], /* Hangul Syllable */
- [0xbdaf, 0xbdaf], /* Hangul Syllable */
- [0xbdb0, 0xbdb0], /* Hangul Syllable */
- [0xbdb1, 0xbdb1], /* Hangul Syllable */
- [0xbdb2, 0xbdb2], /* Hangul Syllable */
- [0xbdb3, 0xbdb3], /* Hangul Syllable */
- [0xbdb4, 0xbdb4], /* Hangul Syllable */
- [0xbdb5, 0xbdb5], /* Hangul Syllable */
- [0xbdb6, 0xbdb6], /* Hangul Syllable */
- [0xbdb7, 0xbdb7], /* Hangul Syllable */
- [0xbdb8, 0xbdb8], /* Hangul Syllable */
- [0xbdb9, 0xbdb9], /* Hangul Syllable */
- [0xbdba, 0xbdba], /* Hangul Syllable */
- [0xbdbb, 0xbdbb], /* Hangul Syllable */
- [0xbdbc, 0xbdbc], /* Hangul Syllable */
- [0xbdbd, 0xbdbd], /* Hangul Syllable */
- [0xbdbe, 0xbdbe], /* Hangul Syllable */
- [0xbdbf, 0xbdbf], /* Hangul Syllable */
- [0xbdc0, 0xbdc0], /* Hangul Syllable */
- [0xbdc1, 0xbdc1], /* Hangul Syllable */
- [0xbdc2, 0xbdc2], /* Hangul Syllable */
- [0xbdc3, 0xbdc3], /* Hangul Syllable */
- [0xbdc4, 0xbdc4], /* Hangul Syllable */
- [0xbdc5, 0xbdc5], /* Hangul Syllable */
- [0xbdc6, 0xbdc6], /* Hangul Syllable */
- [0xbdc7, 0xbdc7], /* Hangul Syllable */
- [0xbdc8, 0xbdc8], /* Hangul Syllable */
- [0xbdc9, 0xbdc9], /* Hangul Syllable */
- [0xbdca, 0xbdca], /* Hangul Syllable */
- [0xbdcb, 0xbdcb], /* Hangul Syllable */
- [0xbdcc, 0xbdcc], /* Hangul Syllable */
- [0xbdcd, 0xbdcd], /* Hangul Syllable */
- [0xbdce, 0xbdce], /* Hangul Syllable */
- [0xbdcf, 0xbdcf], /* Hangul Syllable */
- [0xbdd0, 0xbdd0], /* Hangul Syllable */
- [0xbdd1, 0xbdd1], /* Hangul Syllable */
- [0xbdd2, 0xbdd2], /* Hangul Syllable */
- [0xbdd3, 0xbdd3], /* Hangul Syllable */
- [0xbdd4, 0xbdd4], /* Hangul Syllable */
- [0xbdd5, 0xbdd5], /* Hangul Syllable */
- [0xbdd6, 0xbdd6], /* Hangul Syllable */
- [0xbdd7, 0xbdd7], /* Hangul Syllable */
- [0xbdd8, 0xbdd8], /* Hangul Syllable */
- [0xbdd9, 0xbdd9], /* Hangul Syllable */
- [0xbdda, 0xbdda], /* Hangul Syllable */
- [0xbddb, 0xbddb], /* Hangul Syllable */
- [0xbddc, 0xbddc], /* Hangul Syllable */
- [0xbddd, 0xbddd], /* Hangul Syllable */
- [0xbdde, 0xbdde], /* Hangul Syllable */
- [0xbddf, 0xbddf], /* Hangul Syllable */
- [0xbde0, 0xbde0], /* Hangul Syllable */
- [0xbde1, 0xbde1], /* Hangul Syllable */
- [0xbde2, 0xbde2], /* Hangul Syllable */
- [0xbde3, 0xbde3], /* Hangul Syllable */
- [0xbde4, 0xbde4], /* Hangul Syllable */
- [0xbde5, 0xbde5], /* Hangul Syllable */
- [0xbde6, 0xbde6], /* Hangul Syllable */
- [0xbde7, 0xbde7], /* Hangul Syllable */
- [0xbde8, 0xbde8], /* Hangul Syllable */
- [0xbde9, 0xbde9], /* Hangul Syllable */
- [0xbdea, 0xbdea], /* Hangul Syllable */
- [0xbdeb, 0xbdeb], /* Hangul Syllable */
- [0xbdec, 0xbdec], /* Hangul Syllable */
- [0xbded, 0xbded], /* Hangul Syllable */
- [0xbdee, 0xbdee], /* Hangul Syllable */
- [0xbdef, 0xbdef], /* Hangul Syllable */
- [0xbdf0, 0xbdf0], /* Hangul Syllable */
- [0xbdf1, 0xbdf1], /* Hangul Syllable */
- [0xbdf2, 0xbdf2], /* Hangul Syllable */
- [0xbdf3, 0xbdf3], /* Hangul Syllable */
- [0xbdf4, 0xbdf4], /* Hangul Syllable */
- [0xbdf5, 0xbdf5], /* Hangul Syllable */
- [0xbdf6, 0xbdf6], /* Hangul Syllable */
- [0xbdf7, 0xbdf7], /* Hangul Syllable */
- [0xbdf8, 0xbdf8], /* Hangul Syllable */
- [0xbdf9, 0xbdf9], /* Hangul Syllable */
- [0xbdfa, 0xbdfa], /* Hangul Syllable */
- [0xbdfb, 0xbdfb], /* Hangul Syllable */
- [0xbdfc, 0xbdfc], /* Hangul Syllable */
- [0xbdfd, 0xbdfd], /* Hangul Syllable */
- [0xbdfe, 0xbdfe], /* Hangul Syllable */
- [0xbdff, 0xbdff], /* Hangul Syllable */
- [0xbe00, 0xbe00], /* Hangul Syllable */
- [0xbe01, 0xbe01], /* Hangul Syllable */
- [0xbe02, 0xbe02], /* Hangul Syllable */
- [0xbe03, 0xbe03], /* Hangul Syllable */
- [0xbe04, 0xbe04], /* Hangul Syllable */
- [0xbe05, 0xbe05], /* Hangul Syllable */
- [0xbe06, 0xbe06], /* Hangul Syllable */
- [0xbe07, 0xbe07], /* Hangul Syllable */
- [0xbe08, 0xbe08], /* Hangul Syllable */
- [0xbe09, 0xbe09], /* Hangul Syllable */
- [0xbe0a, 0xbe0a], /* Hangul Syllable */
- [0xbe0b, 0xbe0b], /* Hangul Syllable */
- [0xbe0c, 0xbe0c], /* Hangul Syllable */
- [0xbe0d, 0xbe0d], /* Hangul Syllable */
- [0xbe0e, 0xbe0e], /* Hangul Syllable */
- [0xbe0f, 0xbe0f], /* Hangul Syllable */
- [0xbe10, 0xbe10], /* Hangul Syllable */
- [0xbe11, 0xbe11], /* Hangul Syllable */
- [0xbe12, 0xbe12], /* Hangul Syllable */
- [0xbe13, 0xbe13], /* Hangul Syllable */
- [0xbe14, 0xbe14], /* Hangul Syllable */
- [0xbe15, 0xbe15], /* Hangul Syllable */
- [0xbe16, 0xbe16], /* Hangul Syllable */
- [0xbe17, 0xbe17], /* Hangul Syllable */
- [0xbe18, 0xbe18], /* Hangul Syllable */
- [0xbe19, 0xbe19], /* Hangul Syllable */
- [0xbe1a, 0xbe1a], /* Hangul Syllable */
- [0xbe1b, 0xbe1b], /* Hangul Syllable */
- [0xbe1c, 0xbe1c], /* Hangul Syllable */
- [0xbe1d, 0xbe1d], /* Hangul Syllable */
- [0xbe1e, 0xbe1e], /* Hangul Syllable */
- [0xbe1f, 0xbe1f], /* Hangul Syllable */
- [0xbe20, 0xbe20], /* Hangul Syllable */
- [0xbe21, 0xbe21], /* Hangul Syllable */
- [0xbe22, 0xbe22], /* Hangul Syllable */
- [0xbe23, 0xbe23], /* Hangul Syllable */
- [0xbe24, 0xbe24], /* Hangul Syllable */
- [0xbe25, 0xbe25], /* Hangul Syllable */
- [0xbe26, 0xbe26], /* Hangul Syllable */
- [0xbe27, 0xbe27], /* Hangul Syllable */
- [0xbe28, 0xbe28], /* Hangul Syllable */
- [0xbe29, 0xbe29], /* Hangul Syllable */
- [0xbe2a, 0xbe2a], /* Hangul Syllable */
- [0xbe2b, 0xbe2b], /* Hangul Syllable */
- [0xbe2c, 0xbe2c], /* Hangul Syllable */
- [0xbe2d, 0xbe2d], /* Hangul Syllable */
- [0xbe2e, 0xbe2e], /* Hangul Syllable */
- [0xbe2f, 0xbe2f], /* Hangul Syllable */
- [0xbe30, 0xbe30], /* Hangul Syllable */
- [0xbe31, 0xbe31], /* Hangul Syllable */
- [0xbe32, 0xbe32], /* Hangul Syllable */
- [0xbe33, 0xbe33], /* Hangul Syllable */
- [0xbe34, 0xbe34], /* Hangul Syllable */
- [0xbe35, 0xbe35], /* Hangul Syllable */
- [0xbe36, 0xbe36], /* Hangul Syllable */
- [0xbe37, 0xbe37], /* Hangul Syllable */
- [0xbe38, 0xbe38], /* Hangul Syllable */
- [0xbe39, 0xbe39], /* Hangul Syllable */
- [0xbe3a, 0xbe3a], /* Hangul Syllable */
- [0xbe3b, 0xbe3b], /* Hangul Syllable */
- [0xbe3c, 0xbe3c], /* Hangul Syllable */
- [0xbe3d, 0xbe3d], /* Hangul Syllable */
- [0xbe3e, 0xbe3e], /* Hangul Syllable */
- [0xbe3f, 0xbe3f], /* Hangul Syllable */
- [0xbe40, 0xbe40], /* Hangul Syllable */
- [0xbe41, 0xbe41], /* Hangul Syllable */
- [0xbe42, 0xbe42], /* Hangul Syllable */
- [0xbe43, 0xbe43], /* Hangul Syllable */
- [0xbe44, 0xbe44], /* Hangul Syllable */
- [0xbe45, 0xbe45], /* Hangul Syllable */
- [0xbe46, 0xbe46], /* Hangul Syllable */
- [0xbe47, 0xbe47], /* Hangul Syllable */
- [0xbe48, 0xbe48], /* Hangul Syllable */
- [0xbe49, 0xbe49], /* Hangul Syllable */
- [0xbe4a, 0xbe4a], /* Hangul Syllable */
- [0xbe4b, 0xbe4b], /* Hangul Syllable */
- [0xbe4c, 0xbe4c], /* Hangul Syllable */
- [0xbe4d, 0xbe4d], /* Hangul Syllable */
- [0xbe4e, 0xbe4e], /* Hangul Syllable */
- [0xbe4f, 0xbe4f], /* Hangul Syllable */
- [0xbe50, 0xbe50], /* Hangul Syllable */
- [0xbe51, 0xbe51], /* Hangul Syllable */
- [0xbe52, 0xbe52], /* Hangul Syllable */
- [0xbe53, 0xbe53], /* Hangul Syllable */
- [0xbe54, 0xbe54], /* Hangul Syllable */
- [0xbe55, 0xbe55], /* Hangul Syllable */
- [0xbe56, 0xbe56], /* Hangul Syllable */
- [0xbe57, 0xbe57], /* Hangul Syllable */
- [0xbe58, 0xbe58], /* Hangul Syllable */
- [0xbe59, 0xbe59], /* Hangul Syllable */
- [0xbe5a, 0xbe5a], /* Hangul Syllable */
- [0xbe5b, 0xbe5b], /* Hangul Syllable */
- [0xbe5c, 0xbe5c], /* Hangul Syllable */
- [0xbe5d, 0xbe5d], /* Hangul Syllable */
- [0xbe5e, 0xbe5e], /* Hangul Syllable */
- [0xbe5f, 0xbe5f], /* Hangul Syllable */
- [0xbe60, 0xbe60], /* Hangul Syllable */
- [0xbe61, 0xbe61], /* Hangul Syllable */
- [0xbe62, 0xbe62], /* Hangul Syllable */
- [0xbe63, 0xbe63], /* Hangul Syllable */
- [0xbe64, 0xbe64], /* Hangul Syllable */
- [0xbe65, 0xbe65], /* Hangul Syllable */
- [0xbe66, 0xbe66], /* Hangul Syllable */
- [0xbe67, 0xbe67], /* Hangul Syllable */
- [0xbe68, 0xbe68], /* Hangul Syllable */
- [0xbe69, 0xbe69], /* Hangul Syllable */
- [0xbe6a, 0xbe6a], /* Hangul Syllable */
- [0xbe6b, 0xbe6b], /* Hangul Syllable */
- [0xbe6c, 0xbe6c], /* Hangul Syllable */
- [0xbe6d, 0xbe6d], /* Hangul Syllable */
- [0xbe6e, 0xbe6e], /* Hangul Syllable */
- [0xbe6f, 0xbe6f], /* Hangul Syllable */
- [0xbe70, 0xbe70], /* Hangul Syllable */
- [0xbe71, 0xbe71], /* Hangul Syllable */
- [0xbe72, 0xbe72], /* Hangul Syllable */
- [0xbe73, 0xbe73], /* Hangul Syllable */
- [0xbe74, 0xbe74], /* Hangul Syllable */
- [0xbe75, 0xbe75], /* Hangul Syllable */
- [0xbe76, 0xbe76], /* Hangul Syllable */
- [0xbe77, 0xbe77], /* Hangul Syllable */
- [0xbe78, 0xbe78], /* Hangul Syllable */
- [0xbe79, 0xbe79], /* Hangul Syllable */
- [0xbe7a, 0xbe7a], /* Hangul Syllable */
- [0xbe7b, 0xbe7b], /* Hangul Syllable */
- [0xbe7c, 0xbe7c], /* Hangul Syllable */
- [0xbe7d, 0xbe7d], /* Hangul Syllable */
- [0xbe7e, 0xbe7e], /* Hangul Syllable */
- [0xbe7f, 0xbe7f], /* Hangul Syllable */
- [0xbe80, 0xbe80], /* Hangul Syllable */
- [0xbe81, 0xbe81], /* Hangul Syllable */
- [0xbe82, 0xbe82], /* Hangul Syllable */
- [0xbe83, 0xbe83], /* Hangul Syllable */
- [0xbe84, 0xbe84], /* Hangul Syllable */
- [0xbe85, 0xbe85], /* Hangul Syllable */
- [0xbe86, 0xbe86], /* Hangul Syllable */
- [0xbe87, 0xbe87], /* Hangul Syllable */
- [0xbe88, 0xbe88], /* Hangul Syllable */
- [0xbe89, 0xbe89], /* Hangul Syllable */
- [0xbe8a, 0xbe8a], /* Hangul Syllable */
- [0xbe8b, 0xbe8b], /* Hangul Syllable */
- [0xbe8c, 0xbe8c], /* Hangul Syllable */
- [0xbe8d, 0xbe8d], /* Hangul Syllable */
- [0xbe8e, 0xbe8e], /* Hangul Syllable */
- [0xbe8f, 0xbe8f], /* Hangul Syllable */
- [0xbe90, 0xbe90], /* Hangul Syllable */
- [0xbe91, 0xbe91], /* Hangul Syllable */
- [0xbe92, 0xbe92], /* Hangul Syllable */
- [0xbe93, 0xbe93], /* Hangul Syllable */
- [0xbe94, 0xbe94], /* Hangul Syllable */
- [0xbe95, 0xbe95], /* Hangul Syllable */
- [0xbe96, 0xbe96], /* Hangul Syllable */
- [0xbe97, 0xbe97], /* Hangul Syllable */
- [0xbe98, 0xbe98], /* Hangul Syllable */
- [0xbe99, 0xbe99], /* Hangul Syllable */
- [0xbe9a, 0xbe9a], /* Hangul Syllable */
- [0xbe9b, 0xbe9b], /* Hangul Syllable */
- [0xbe9c, 0xbe9c], /* Hangul Syllable */
- [0xbe9d, 0xbe9d], /* Hangul Syllable */
- [0xbe9e, 0xbe9e], /* Hangul Syllable */
- [0xbe9f, 0xbe9f], /* Hangul Syllable */
- [0xbea0, 0xbea0], /* Hangul Syllable */
- [0xbea1, 0xbea1], /* Hangul Syllable */
- [0xbea2, 0xbea2], /* Hangul Syllable */
- [0xbea3, 0xbea3], /* Hangul Syllable */
- [0xbea4, 0xbea4], /* Hangul Syllable */
- [0xbea5, 0xbea5], /* Hangul Syllable */
- [0xbea6, 0xbea6], /* Hangul Syllable */
- [0xbea7, 0xbea7], /* Hangul Syllable */
- [0xbea8, 0xbea8], /* Hangul Syllable */
- [0xbea9, 0xbea9], /* Hangul Syllable */
- [0xbeaa, 0xbeaa], /* Hangul Syllable */
- [0xbeab, 0xbeab], /* Hangul Syllable */
- [0xbeac, 0xbeac], /* Hangul Syllable */
- [0xbead, 0xbead], /* Hangul Syllable */
- [0xbeae, 0xbeae], /* Hangul Syllable */
- [0xbeaf, 0xbeaf], /* Hangul Syllable */
- [0xbeb0, 0xbeb0], /* Hangul Syllable */
- [0xbeb1, 0xbeb1], /* Hangul Syllable */
- [0xbeb2, 0xbeb2], /* Hangul Syllable */
- [0xbeb3, 0xbeb3], /* Hangul Syllable */
- [0xbeb4, 0xbeb4], /* Hangul Syllable */
- [0xbeb5, 0xbeb5], /* Hangul Syllable */
- [0xbeb6, 0xbeb6], /* Hangul Syllable */
- [0xbeb7, 0xbeb7], /* Hangul Syllable */
- [0xbeb8, 0xbeb8], /* Hangul Syllable */
- [0xbeb9, 0xbeb9], /* Hangul Syllable */
- [0xbeba, 0xbeba], /* Hangul Syllable */
- [0xbebb, 0xbebb], /* Hangul Syllable */
- [0xbebc, 0xbebc], /* Hangul Syllable */
- [0xbebd, 0xbebd], /* Hangul Syllable */
- [0xbebe, 0xbebe], /* Hangul Syllable */
- [0xbebf, 0xbebf], /* Hangul Syllable */
- [0xbec0, 0xbec0], /* Hangul Syllable */
- [0xbec1, 0xbec1], /* Hangul Syllable */
- [0xbec2, 0xbec2], /* Hangul Syllable */
- [0xbec3, 0xbec3], /* Hangul Syllable */
- [0xbec4, 0xbec4], /* Hangul Syllable */
- [0xbec5, 0xbec5], /* Hangul Syllable */
- [0xbec6, 0xbec6], /* Hangul Syllable */
- [0xbec7, 0xbec7], /* Hangul Syllable */
- [0xbec8, 0xbec8], /* Hangul Syllable */
- [0xbec9, 0xbec9], /* Hangul Syllable */
- [0xbeca, 0xbeca], /* Hangul Syllable */
- [0xbecb, 0xbecb], /* Hangul Syllable */
- [0xbecc, 0xbecc], /* Hangul Syllable */
- [0xbecd, 0xbecd], /* Hangul Syllable */
- [0xbece, 0xbece], /* Hangul Syllable */
- [0xbecf, 0xbecf], /* Hangul Syllable */
- [0xbed0, 0xbed0], /* Hangul Syllable */
- [0xbed1, 0xbed1], /* Hangul Syllable */
- [0xbed2, 0xbed2], /* Hangul Syllable */
- [0xbed3, 0xbed3], /* Hangul Syllable */
- [0xbed4, 0xbed4], /* Hangul Syllable */
- [0xbed5, 0xbed5], /* Hangul Syllable */
- [0xbed6, 0xbed6], /* Hangul Syllable */
- [0xbed7, 0xbed7], /* Hangul Syllable */
- [0xbed8, 0xbed8], /* Hangul Syllable */
- [0xbed9, 0xbed9], /* Hangul Syllable */
- [0xbeda, 0xbeda], /* Hangul Syllable */
- [0xbedb, 0xbedb], /* Hangul Syllable */
- [0xbedc, 0xbedc], /* Hangul Syllable */
- [0xbedd, 0xbedd], /* Hangul Syllable */
- [0xbede, 0xbede], /* Hangul Syllable */
- [0xbedf, 0xbedf], /* Hangul Syllable */
- [0xbee0, 0xbee0], /* Hangul Syllable */
- [0xbee1, 0xbee1], /* Hangul Syllable */
- [0xbee2, 0xbee2], /* Hangul Syllable */
- [0xbee3, 0xbee3], /* Hangul Syllable */
- [0xbee4, 0xbee4], /* Hangul Syllable */
- [0xbee5, 0xbee5], /* Hangul Syllable */
- [0xbee6, 0xbee6], /* Hangul Syllable */
- [0xbee7, 0xbee7], /* Hangul Syllable */
- [0xbee8, 0xbee8], /* Hangul Syllable */
- [0xbee9, 0xbee9], /* Hangul Syllable */
- [0xbeea, 0xbeea], /* Hangul Syllable */
- [0xbeeb, 0xbeeb], /* Hangul Syllable */
- [0xbeec, 0xbeec], /* Hangul Syllable */
- [0xbeed, 0xbeed], /* Hangul Syllable */
- [0xbeee, 0xbeee], /* Hangul Syllable */
- [0xbeef, 0xbeef], /* Hangul Syllable */
- [0xbef0, 0xbef0], /* Hangul Syllable */
- [0xbef1, 0xbef1], /* Hangul Syllable */
- [0xbef2, 0xbef2], /* Hangul Syllable */
- [0xbef3, 0xbef3], /* Hangul Syllable */
- [0xbef4, 0xbef4], /* Hangul Syllable */
- [0xbef5, 0xbef5], /* Hangul Syllable */
- [0xbef6, 0xbef6], /* Hangul Syllable */
- [0xbef7, 0xbef7], /* Hangul Syllable */
- [0xbef8, 0xbef8], /* Hangul Syllable */
- [0xbef9, 0xbef9], /* Hangul Syllable */
- [0xbefa, 0xbefa], /* Hangul Syllable */
- [0xbefb, 0xbefb], /* Hangul Syllable */
- [0xbefc, 0xbefc], /* Hangul Syllable */
- [0xbefd, 0xbefd], /* Hangul Syllable */
- [0xbefe, 0xbefe], /* Hangul Syllable */
- [0xbeff, 0xbeff], /* Hangul Syllable */
- [0xbf00, 0xbf00], /* Hangul Syllable */
- [0xbf01, 0xbf01], /* Hangul Syllable */
- [0xbf02, 0xbf02], /* Hangul Syllable */
- [0xbf03, 0xbf03], /* Hangul Syllable */
- [0xbf04, 0xbf04], /* Hangul Syllable */
- [0xbf05, 0xbf05], /* Hangul Syllable */
- [0xbf06, 0xbf06], /* Hangul Syllable */
- [0xbf07, 0xbf07], /* Hangul Syllable */
- [0xbf08, 0xbf08], /* Hangul Syllable */
- [0xbf09, 0xbf09], /* Hangul Syllable */
- [0xbf0a, 0xbf0a], /* Hangul Syllable */
- [0xbf0b, 0xbf0b], /* Hangul Syllable */
- [0xbf0c, 0xbf0c], /* Hangul Syllable */
- [0xbf0d, 0xbf0d], /* Hangul Syllable */
- [0xbf0e, 0xbf0e], /* Hangul Syllable */
- [0xbf0f, 0xbf0f], /* Hangul Syllable */
- [0xbf10, 0xbf10], /* Hangul Syllable */
- [0xbf11, 0xbf11], /* Hangul Syllable */
- [0xbf12, 0xbf12], /* Hangul Syllable */
- [0xbf13, 0xbf13], /* Hangul Syllable */
- [0xbf14, 0xbf14], /* Hangul Syllable */
- [0xbf15, 0xbf15], /* Hangul Syllable */
- [0xbf16, 0xbf16], /* Hangul Syllable */
- [0xbf17, 0xbf17], /* Hangul Syllable */
- [0xbf18, 0xbf18], /* Hangul Syllable */
- [0xbf19, 0xbf19], /* Hangul Syllable */
- [0xbf1a, 0xbf1a], /* Hangul Syllable */
- [0xbf1b, 0xbf1b], /* Hangul Syllable */
- [0xbf1c, 0xbf1c], /* Hangul Syllable */
- [0xbf1d, 0xbf1d], /* Hangul Syllable */
- [0xbf1e, 0xbf1e], /* Hangul Syllable */
- [0xbf1f, 0xbf1f], /* Hangul Syllable */
- [0xbf20, 0xbf20], /* Hangul Syllable */
- [0xbf21, 0xbf21], /* Hangul Syllable */
- [0xbf22, 0xbf22], /* Hangul Syllable */
- [0xbf23, 0xbf23], /* Hangul Syllable */
- [0xbf24, 0xbf24], /* Hangul Syllable */
- [0xbf25, 0xbf25], /* Hangul Syllable */
- [0xbf26, 0xbf26], /* Hangul Syllable */
- [0xbf27, 0xbf27], /* Hangul Syllable */
- [0xbf28, 0xbf28], /* Hangul Syllable */
- [0xbf29, 0xbf29], /* Hangul Syllable */
- [0xbf2a, 0xbf2a], /* Hangul Syllable */
- [0xbf2b, 0xbf2b], /* Hangul Syllable */
- [0xbf2c, 0xbf2c], /* Hangul Syllable */
- [0xbf2d, 0xbf2d], /* Hangul Syllable */
- [0xbf2e, 0xbf2e], /* Hangul Syllable */
- [0xbf2f, 0xbf2f], /* Hangul Syllable */
- [0xbf30, 0xbf30], /* Hangul Syllable */
- [0xbf31, 0xbf31], /* Hangul Syllable */
- [0xbf32, 0xbf32], /* Hangul Syllable */
- [0xbf33, 0xbf33], /* Hangul Syllable */
- [0xbf34, 0xbf34], /* Hangul Syllable */
- [0xbf35, 0xbf35], /* Hangul Syllable */
- [0xbf36, 0xbf36], /* Hangul Syllable */
- [0xbf37, 0xbf37], /* Hangul Syllable */
- [0xbf38, 0xbf38], /* Hangul Syllable */
- [0xbf39, 0xbf39], /* Hangul Syllable */
- [0xbf3a, 0xbf3a], /* Hangul Syllable */
- [0xbf3b, 0xbf3b], /* Hangul Syllable */
- [0xbf3c, 0xbf3c], /* Hangul Syllable */
- [0xbf3d, 0xbf3d], /* Hangul Syllable */
- [0xbf3e, 0xbf3e], /* Hangul Syllable */
- [0xbf3f, 0xbf3f], /* Hangul Syllable */
- [0xbf40, 0xbf40], /* Hangul Syllable */
- [0xbf41, 0xbf41], /* Hangul Syllable */
- [0xbf42, 0xbf42], /* Hangul Syllable */
- [0xbf43, 0xbf43], /* Hangul Syllable */
- [0xbf44, 0xbf44], /* Hangul Syllable */
- [0xbf45, 0xbf45], /* Hangul Syllable */
- [0xbf46, 0xbf46], /* Hangul Syllable */
- [0xbf47, 0xbf47], /* Hangul Syllable */
- [0xbf48, 0xbf48], /* Hangul Syllable */
- [0xbf49, 0xbf49], /* Hangul Syllable */
- [0xbf4a, 0xbf4a], /* Hangul Syllable */
- [0xbf4b, 0xbf4b], /* Hangul Syllable */
- [0xbf4c, 0xbf4c], /* Hangul Syllable */
- [0xbf4d, 0xbf4d], /* Hangul Syllable */
- [0xbf4e, 0xbf4e], /* Hangul Syllable */
- [0xbf4f, 0xbf4f], /* Hangul Syllable */
- [0xbf50, 0xbf50], /* Hangul Syllable */
- [0xbf51, 0xbf51], /* Hangul Syllable */
- [0xbf52, 0xbf52], /* Hangul Syllable */
- [0xbf53, 0xbf53], /* Hangul Syllable */
- [0xbf54, 0xbf54], /* Hangul Syllable */
- [0xbf55, 0xbf55], /* Hangul Syllable */
- [0xbf56, 0xbf56], /* Hangul Syllable */
- [0xbf57, 0xbf57], /* Hangul Syllable */
- [0xbf58, 0xbf58], /* Hangul Syllable */
- [0xbf59, 0xbf59], /* Hangul Syllable */
- [0xbf5a, 0xbf5a], /* Hangul Syllable */
- [0xbf5b, 0xbf5b], /* Hangul Syllable */
- [0xbf5c, 0xbf5c], /* Hangul Syllable */
- [0xbf5d, 0xbf5d], /* Hangul Syllable */
- [0xbf5e, 0xbf5e], /* Hangul Syllable */
- [0xbf5f, 0xbf5f], /* Hangul Syllable */
- [0xbf60, 0xbf60], /* Hangul Syllable */
- [0xbf61, 0xbf61], /* Hangul Syllable */
- [0xbf62, 0xbf62], /* Hangul Syllable */
- [0xbf63, 0xbf63], /* Hangul Syllable */
- [0xbf64, 0xbf64], /* Hangul Syllable */
- [0xbf65, 0xbf65], /* Hangul Syllable */
- [0xbf66, 0xbf66], /* Hangul Syllable */
- [0xbf67, 0xbf67], /* Hangul Syllable */
- [0xbf68, 0xbf68], /* Hangul Syllable */
- [0xbf69, 0xbf69], /* Hangul Syllable */
- [0xbf6a, 0xbf6a], /* Hangul Syllable */
- [0xbf6b, 0xbf6b], /* Hangul Syllable */
- [0xbf6c, 0xbf6c], /* Hangul Syllable */
- [0xbf6d, 0xbf6d], /* Hangul Syllable */
- [0xbf6e, 0xbf6e], /* Hangul Syllable */
- [0xbf6f, 0xbf6f], /* Hangul Syllable */
- [0xbf70, 0xbf70], /* Hangul Syllable */
- [0xbf71, 0xbf71], /* Hangul Syllable */
- [0xbf72, 0xbf72], /* Hangul Syllable */
- [0xbf73, 0xbf73], /* Hangul Syllable */
- [0xbf74, 0xbf74], /* Hangul Syllable */
- [0xbf75, 0xbf75], /* Hangul Syllable */
- [0xbf76, 0xbf76], /* Hangul Syllable */
- [0xbf77, 0xbf77], /* Hangul Syllable */
- [0xbf78, 0xbf78], /* Hangul Syllable */
- [0xbf79, 0xbf79], /* Hangul Syllable */
- [0xbf7a, 0xbf7a], /* Hangul Syllable */
- [0xbf7b, 0xbf7b], /* Hangul Syllable */
- [0xbf7c, 0xbf7c], /* Hangul Syllable */
- [0xbf7d, 0xbf7d], /* Hangul Syllable */
- [0xbf7e, 0xbf7e], /* Hangul Syllable */
- [0xbf7f, 0xbf7f], /* Hangul Syllable */
- [0xbf80, 0xbf80], /* Hangul Syllable */
- [0xbf81, 0xbf81], /* Hangul Syllable */
- [0xbf82, 0xbf82], /* Hangul Syllable */
- [0xbf83, 0xbf83], /* Hangul Syllable */
- [0xbf84, 0xbf84], /* Hangul Syllable */
- [0xbf85, 0xbf85], /* Hangul Syllable */
- [0xbf86, 0xbf86], /* Hangul Syllable */
- [0xbf87, 0xbf87], /* Hangul Syllable */
- [0xbf88, 0xbf88], /* Hangul Syllable */
- [0xbf89, 0xbf89], /* Hangul Syllable */
- [0xbf8a, 0xbf8a], /* Hangul Syllable */
- [0xbf8b, 0xbf8b], /* Hangul Syllable */
- [0xbf8c, 0xbf8c], /* Hangul Syllable */
- [0xbf8d, 0xbf8d], /* Hangul Syllable */
- [0xbf8e, 0xbf8e], /* Hangul Syllable */
- [0xbf8f, 0xbf8f], /* Hangul Syllable */
- [0xbf90, 0xbf90], /* Hangul Syllable */
- [0xbf91, 0xbf91], /* Hangul Syllable */
- [0xbf92, 0xbf92], /* Hangul Syllable */
- [0xbf93, 0xbf93], /* Hangul Syllable */
- [0xbf94, 0xbf94], /* Hangul Syllable */
- [0xbf95, 0xbf95], /* Hangul Syllable */
- [0xbf96, 0xbf96], /* Hangul Syllable */
- [0xbf97, 0xbf97], /* Hangul Syllable */
- [0xbf98, 0xbf98], /* Hangul Syllable */
- [0xbf99, 0xbf99], /* Hangul Syllable */
- [0xbf9a, 0xbf9a], /* Hangul Syllable */
- [0xbf9b, 0xbf9b], /* Hangul Syllable */
- [0xbf9c, 0xbf9c], /* Hangul Syllable */
- [0xbf9d, 0xbf9d], /* Hangul Syllable */
- [0xbf9e, 0xbf9e], /* Hangul Syllable */
- [0xbf9f, 0xbf9f], /* Hangul Syllable */
- [0xbfa0, 0xbfa0], /* Hangul Syllable */
- [0xbfa1, 0xbfa1], /* Hangul Syllable */
- [0xbfa2, 0xbfa2], /* Hangul Syllable */
- [0xbfa3, 0xbfa3], /* Hangul Syllable */
- [0xbfa4, 0xbfa4], /* Hangul Syllable */
- [0xbfa5, 0xbfa5], /* Hangul Syllable */
- [0xbfa6, 0xbfa6], /* Hangul Syllable */
- [0xbfa7, 0xbfa7], /* Hangul Syllable */
- [0xbfa8, 0xbfa8], /* Hangul Syllable */
- [0xbfa9, 0xbfa9], /* Hangul Syllable */
- [0xbfaa, 0xbfaa], /* Hangul Syllable */
- [0xbfab, 0xbfab], /* Hangul Syllable */
- [0xbfac, 0xbfac], /* Hangul Syllable */
- [0xbfad, 0xbfad], /* Hangul Syllable */
- [0xbfae, 0xbfae], /* Hangul Syllable */
- [0xbfaf, 0xbfaf], /* Hangul Syllable */
- [0xbfb0, 0xbfb0], /* Hangul Syllable */
- [0xbfb1, 0xbfb1], /* Hangul Syllable */
- [0xbfb2, 0xbfb2], /* Hangul Syllable */
- [0xbfb3, 0xbfb3], /* Hangul Syllable */
- [0xbfb4, 0xbfb4], /* Hangul Syllable */
- [0xbfb5, 0xbfb5], /* Hangul Syllable */
- [0xbfb6, 0xbfb6], /* Hangul Syllable */
- [0xbfb7, 0xbfb7], /* Hangul Syllable */
- [0xbfb8, 0xbfb8], /* Hangul Syllable */
- [0xbfb9, 0xbfb9], /* Hangul Syllable */
- [0xbfba, 0xbfba], /* Hangul Syllable */
- [0xbfbb, 0xbfbb], /* Hangul Syllable */
- [0xbfbc, 0xbfbc], /* Hangul Syllable */
- [0xbfbd, 0xbfbd], /* Hangul Syllable */
- [0xbfbe, 0xbfbe], /* Hangul Syllable */
- [0xbfbf, 0xbfbf], /* Hangul Syllable */
- [0xbfc0, 0xbfc0], /* Hangul Syllable */
- [0xbfc1, 0xbfc1], /* Hangul Syllable */
- [0xbfc2, 0xbfc2], /* Hangul Syllable */
- [0xbfc3, 0xbfc3], /* Hangul Syllable */
- [0xbfc4, 0xbfc4], /* Hangul Syllable */
- [0xbfc5, 0xbfc5], /* Hangul Syllable */
- [0xbfc6, 0xbfc6], /* Hangul Syllable */
- [0xbfc7, 0xbfc7], /* Hangul Syllable */
- [0xbfc8, 0xbfc8], /* Hangul Syllable */
- [0xbfc9, 0xbfc9], /* Hangul Syllable */
- [0xbfca, 0xbfca], /* Hangul Syllable */
- [0xbfcb, 0xbfcb], /* Hangul Syllable */
- [0xbfcc, 0xbfcc], /* Hangul Syllable */
- [0xbfcd, 0xbfcd], /* Hangul Syllable */
- [0xbfce, 0xbfce], /* Hangul Syllable */
- [0xbfcf, 0xbfcf], /* Hangul Syllable */
- [0xbfd0, 0xbfd0], /* Hangul Syllable */
- [0xbfd1, 0xbfd1], /* Hangul Syllable */
- [0xbfd2, 0xbfd2], /* Hangul Syllable */
- [0xbfd3, 0xbfd3], /* Hangul Syllable */
- [0xbfd4, 0xbfd4], /* Hangul Syllable */
- [0xbfd5, 0xbfd5], /* Hangul Syllable */
- [0xbfd6, 0xbfd6], /* Hangul Syllable */
- [0xbfd7, 0xbfd7], /* Hangul Syllable */
- [0xbfd8, 0xbfd8], /* Hangul Syllable */
- [0xbfd9, 0xbfd9], /* Hangul Syllable */
- [0xbfda, 0xbfda], /* Hangul Syllable */
- [0xbfdb, 0xbfdb], /* Hangul Syllable */
- [0xbfdc, 0xbfdc], /* Hangul Syllable */
- [0xbfdd, 0xbfdd], /* Hangul Syllable */
- [0xbfde, 0xbfde], /* Hangul Syllable */
- [0xbfdf, 0xbfdf], /* Hangul Syllable */
- [0xbfe0, 0xbfe0], /* Hangul Syllable */
- [0xbfe1, 0xbfe1], /* Hangul Syllable */
- [0xbfe2, 0xbfe2], /* Hangul Syllable */
- [0xbfe3, 0xbfe3], /* Hangul Syllable */
- [0xbfe4, 0xbfe4], /* Hangul Syllable */
- [0xbfe5, 0xbfe5], /* Hangul Syllable */
- [0xbfe6, 0xbfe6], /* Hangul Syllable */
- [0xbfe7, 0xbfe7], /* Hangul Syllable */
- [0xbfe8, 0xbfe8], /* Hangul Syllable */
- [0xbfe9, 0xbfe9], /* Hangul Syllable */
- [0xbfea, 0xbfea], /* Hangul Syllable */
- [0xbfeb, 0xbfeb], /* Hangul Syllable */
- [0xbfec, 0xbfec], /* Hangul Syllable */
- [0xbfed, 0xbfed], /* Hangul Syllable */
- [0xbfee, 0xbfee], /* Hangul Syllable */
- [0xbfef, 0xbfef], /* Hangul Syllable */
- [0xbff0, 0xbff0], /* Hangul Syllable */
- [0xbff1, 0xbff1], /* Hangul Syllable */
- [0xbff2, 0xbff2], /* Hangul Syllable */
- [0xbff3, 0xbff3], /* Hangul Syllable */
- [0xbff4, 0xbff4], /* Hangul Syllable */
- [0xbff5, 0xbff5], /* Hangul Syllable */
- [0xbff6, 0xbff6], /* Hangul Syllable */
- [0xbff7, 0xbff7], /* Hangul Syllable */
- [0xbff8, 0xbff8], /* Hangul Syllable */
- [0xbff9, 0xbff9], /* Hangul Syllable */
- [0xbffa, 0xbffa], /* Hangul Syllable */
- [0xbffb, 0xbffb], /* Hangul Syllable */
- [0xbffc, 0xbffc], /* Hangul Syllable */
- [0xbffd, 0xbffd], /* Hangul Syllable */
- [0xbffe, 0xbffe], /* Hangul Syllable */
- [0xbfff, 0xbfff], /* Hangul Syllable */
- [0xc000, 0xc000], /* Hangul Syllable */
- [0xc001, 0xc001], /* Hangul Syllable */
- [0xc002, 0xc002], /* Hangul Syllable */
- [0xc003, 0xc003], /* Hangul Syllable */
- [0xc004, 0xc004], /* Hangul Syllable */
- [0xc005, 0xc005], /* Hangul Syllable */
- [0xc006, 0xc006], /* Hangul Syllable */
- [0xc007, 0xc007], /* Hangul Syllable */
- [0xc008, 0xc008], /* Hangul Syllable */
- [0xc009, 0xc009], /* Hangul Syllable */
- [0xc00a, 0xc00a], /* Hangul Syllable */
- [0xc00b, 0xc00b], /* Hangul Syllable */
- [0xc00c, 0xc00c], /* Hangul Syllable */
- [0xc00d, 0xc00d], /* Hangul Syllable */
- [0xc00e, 0xc00e], /* Hangul Syllable */
- [0xc00f, 0xc00f], /* Hangul Syllable */
- [0xc010, 0xc010], /* Hangul Syllable */
- [0xc011, 0xc011], /* Hangul Syllable */
- [0xc012, 0xc012], /* Hangul Syllable */
- [0xc013, 0xc013], /* Hangul Syllable */
- [0xc014, 0xc014], /* Hangul Syllable */
- [0xc015, 0xc015], /* Hangul Syllable */
- [0xc016, 0xc016], /* Hangul Syllable */
- [0xc017, 0xc017], /* Hangul Syllable */
- [0xc018, 0xc018], /* Hangul Syllable */
- [0xc019, 0xc019], /* Hangul Syllable */
- [0xc01a, 0xc01a], /* Hangul Syllable */
- [0xc01b, 0xc01b], /* Hangul Syllable */
- [0xc01c, 0xc01c], /* Hangul Syllable */
- [0xc01d, 0xc01d], /* Hangul Syllable */
- [0xc01e, 0xc01e], /* Hangul Syllable */
- [0xc01f, 0xc01f], /* Hangul Syllable */
- [0xc020, 0xc020], /* Hangul Syllable */
- [0xc021, 0xc021], /* Hangul Syllable */
- [0xc022, 0xc022], /* Hangul Syllable */
- [0xc023, 0xc023], /* Hangul Syllable */
- [0xc024, 0xc024], /* Hangul Syllable */
- [0xc025, 0xc025], /* Hangul Syllable */
- [0xc026, 0xc026], /* Hangul Syllable */
- [0xc027, 0xc027], /* Hangul Syllable */
- [0xc028, 0xc028], /* Hangul Syllable */
- [0xc029, 0xc029], /* Hangul Syllable */
- [0xc02a, 0xc02a], /* Hangul Syllable */
- [0xc02b, 0xc02b], /* Hangul Syllable */
- [0xc02c, 0xc02c], /* Hangul Syllable */
- [0xc02d, 0xc02d], /* Hangul Syllable */
- [0xc02e, 0xc02e], /* Hangul Syllable */
- [0xc02f, 0xc02f], /* Hangul Syllable */
- [0xc030, 0xc030], /* Hangul Syllable */
- [0xc031, 0xc031], /* Hangul Syllable */
- [0xc032, 0xc032], /* Hangul Syllable */
- [0xc033, 0xc033], /* Hangul Syllable */
- [0xc034, 0xc034], /* Hangul Syllable */
- [0xc035, 0xc035], /* Hangul Syllable */
- [0xc036, 0xc036], /* Hangul Syllable */
- [0xc037, 0xc037], /* Hangul Syllable */
- [0xc038, 0xc038], /* Hangul Syllable */
- [0xc039, 0xc039], /* Hangul Syllable */
- [0xc03a, 0xc03a], /* Hangul Syllable */
- [0xc03b, 0xc03b], /* Hangul Syllable */
- [0xc03c, 0xc03c], /* Hangul Syllable */
- [0xc03d, 0xc03d], /* Hangul Syllable */
- [0xc03e, 0xc03e], /* Hangul Syllable */
- [0xc03f, 0xc03f], /* Hangul Syllable */
- [0xc040, 0xc040], /* Hangul Syllable */
- [0xc041, 0xc041], /* Hangul Syllable */
- [0xc042, 0xc042], /* Hangul Syllable */
- [0xc043, 0xc043], /* Hangul Syllable */
- [0xc044, 0xc044], /* Hangul Syllable */
- [0xc045, 0xc045], /* Hangul Syllable */
- [0xc046, 0xc046], /* Hangul Syllable */
- [0xc047, 0xc047], /* Hangul Syllable */
- [0xc048, 0xc048], /* Hangul Syllable */
- [0xc049, 0xc049], /* Hangul Syllable */
- [0xc04a, 0xc04a], /* Hangul Syllable */
- [0xc04b, 0xc04b], /* Hangul Syllable */
- [0xc04c, 0xc04c], /* Hangul Syllable */
- [0xc04d, 0xc04d], /* Hangul Syllable */
- [0xc04e, 0xc04e], /* Hangul Syllable */
- [0xc04f, 0xc04f], /* Hangul Syllable */
- [0xc050, 0xc050], /* Hangul Syllable */
- [0xc051, 0xc051], /* Hangul Syllable */
- [0xc052, 0xc052], /* Hangul Syllable */
- [0xc053, 0xc053], /* Hangul Syllable */
- [0xc054, 0xc054], /* Hangul Syllable */
- [0xc055, 0xc055], /* Hangul Syllable */
- [0xc056, 0xc056], /* Hangul Syllable */
- [0xc057, 0xc057], /* Hangul Syllable */
- [0xc058, 0xc058], /* Hangul Syllable */
- [0xc059, 0xc059], /* Hangul Syllable */
- [0xc05a, 0xc05a], /* Hangul Syllable */
- [0xc05b, 0xc05b], /* Hangul Syllable */
- [0xc05c, 0xc05c], /* Hangul Syllable */
- [0xc05d, 0xc05d], /* Hangul Syllable */
- [0xc05e, 0xc05e], /* Hangul Syllable */
- [0xc05f, 0xc05f], /* Hangul Syllable */
- [0xc060, 0xc060], /* Hangul Syllable */
- [0xc061, 0xc061], /* Hangul Syllable */
- [0xc062, 0xc062], /* Hangul Syllable */
- [0xc063, 0xc063], /* Hangul Syllable */
- [0xc064, 0xc064], /* Hangul Syllable */
- [0xc065, 0xc065], /* Hangul Syllable */
- [0xc066, 0xc066], /* Hangul Syllable */
- [0xc067, 0xc067], /* Hangul Syllable */
- [0xc068, 0xc068], /* Hangul Syllable */
- [0xc069, 0xc069], /* Hangul Syllable */
- [0xc06a, 0xc06a], /* Hangul Syllable */
- [0xc06b, 0xc06b], /* Hangul Syllable */
- [0xc06c, 0xc06c], /* Hangul Syllable */
- [0xc06d, 0xc06d], /* Hangul Syllable */
- [0xc06e, 0xc06e], /* Hangul Syllable */
- [0xc06f, 0xc06f], /* Hangul Syllable */
- [0xc070, 0xc070], /* Hangul Syllable */
- [0xc071, 0xc071], /* Hangul Syllable */
- [0xc072, 0xc072], /* Hangul Syllable */
- [0xc073, 0xc073], /* Hangul Syllable */
- [0xc074, 0xc074], /* Hangul Syllable */
- [0xc075, 0xc075], /* Hangul Syllable */
- [0xc076, 0xc076], /* Hangul Syllable */
- [0xc077, 0xc077], /* Hangul Syllable */
- [0xc078, 0xc078], /* Hangul Syllable */
- [0xc079, 0xc079], /* Hangul Syllable */
- [0xc07a, 0xc07a], /* Hangul Syllable */
- [0xc07b, 0xc07b], /* Hangul Syllable */
- [0xc07c, 0xc07c], /* Hangul Syllable */
- [0xc07d, 0xc07d], /* Hangul Syllable */
- [0xc07e, 0xc07e], /* Hangul Syllable */
- [0xc07f, 0xc07f], /* Hangul Syllable */
- [0xc080, 0xc080], /* Hangul Syllable */
- [0xc081, 0xc081], /* Hangul Syllable */
- [0xc082, 0xc082], /* Hangul Syllable */
- [0xc083, 0xc083], /* Hangul Syllable */
- [0xc084, 0xc084], /* Hangul Syllable */
- [0xc085, 0xc085], /* Hangul Syllable */
- [0xc086, 0xc086], /* Hangul Syllable */
- [0xc087, 0xc087], /* Hangul Syllable */
- [0xc088, 0xc088], /* Hangul Syllable */
- [0xc089, 0xc089], /* Hangul Syllable */
- [0xc08a, 0xc08a], /* Hangul Syllable */
- [0xc08b, 0xc08b], /* Hangul Syllable */
- [0xc08c, 0xc08c], /* Hangul Syllable */
- [0xc08d, 0xc08d], /* Hangul Syllable */
- [0xc08e, 0xc08e], /* Hangul Syllable */
- [0xc08f, 0xc08f], /* Hangul Syllable */
- [0xc090, 0xc090], /* Hangul Syllable */
- [0xc091, 0xc091], /* Hangul Syllable */
- [0xc092, 0xc092], /* Hangul Syllable */
- [0xc093, 0xc093], /* Hangul Syllable */
- [0xc094, 0xc094], /* Hangul Syllable */
- [0xc095, 0xc095], /* Hangul Syllable */
- [0xc096, 0xc096], /* Hangul Syllable */
- [0xc097, 0xc097], /* Hangul Syllable */
- [0xc098, 0xc098], /* Hangul Syllable */
- [0xc099, 0xc099], /* Hangul Syllable */
- [0xc09a, 0xc09a], /* Hangul Syllable */
- [0xc09b, 0xc09b], /* Hangul Syllable */
- [0xc09c, 0xc09c], /* Hangul Syllable */
- [0xc09d, 0xc09d], /* Hangul Syllable */
- [0xc09e, 0xc09e], /* Hangul Syllable */
- [0xc09f, 0xc09f], /* Hangul Syllable */
- [0xc0a0, 0xc0a0], /* Hangul Syllable */
- [0xc0a1, 0xc0a1], /* Hangul Syllable */
- [0xc0a2, 0xc0a2], /* Hangul Syllable */
- [0xc0a3, 0xc0a3], /* Hangul Syllable */
- [0xc0a4, 0xc0a4], /* Hangul Syllable */
- [0xc0a5, 0xc0a5], /* Hangul Syllable */
- [0xc0a6, 0xc0a6], /* Hangul Syllable */
- [0xc0a7, 0xc0a7], /* Hangul Syllable */
- [0xc0a8, 0xc0a8], /* Hangul Syllable */
- [0xc0a9, 0xc0a9], /* Hangul Syllable */
- [0xc0aa, 0xc0aa], /* Hangul Syllable */
- [0xc0ab, 0xc0ab], /* Hangul Syllable */
- [0xc0ac, 0xc0ac], /* Hangul Syllable */
- [0xc0ad, 0xc0ad], /* Hangul Syllable */
- [0xc0ae, 0xc0ae], /* Hangul Syllable */
- [0xc0af, 0xc0af], /* Hangul Syllable */
- [0xc0b0, 0xc0b0], /* Hangul Syllable */
- [0xc0b1, 0xc0b1], /* Hangul Syllable */
- [0xc0b2, 0xc0b2], /* Hangul Syllable */
- [0xc0b3, 0xc0b3], /* Hangul Syllable */
- [0xc0b4, 0xc0b4], /* Hangul Syllable */
- [0xc0b5, 0xc0b5], /* Hangul Syllable */
- [0xc0b6, 0xc0b6], /* Hangul Syllable */
- [0xc0b7, 0xc0b7], /* Hangul Syllable */
- [0xc0b8, 0xc0b8], /* Hangul Syllable */
- [0xc0b9, 0xc0b9], /* Hangul Syllable */
- [0xc0ba, 0xc0ba], /* Hangul Syllable */
- [0xc0bb, 0xc0bb], /* Hangul Syllable */
- [0xc0bc, 0xc0bc], /* Hangul Syllable */
- [0xc0bd, 0xc0bd], /* Hangul Syllable */
- [0xc0be, 0xc0be], /* Hangul Syllable */
- [0xc0bf, 0xc0bf], /* Hangul Syllable */
- [0xc0c0, 0xc0c0], /* Hangul Syllable */
- [0xc0c1, 0xc0c1], /* Hangul Syllable */
- [0xc0c2, 0xc0c2], /* Hangul Syllable */
- [0xc0c3, 0xc0c3], /* Hangul Syllable */
- [0xc0c4, 0xc0c4], /* Hangul Syllable */
- [0xc0c5, 0xc0c5], /* Hangul Syllable */
- [0xc0c6, 0xc0c6], /* Hangul Syllable */
- [0xc0c7, 0xc0c7], /* Hangul Syllable */
- [0xc0c8, 0xc0c8], /* Hangul Syllable */
- [0xc0c9, 0xc0c9], /* Hangul Syllable */
- [0xc0ca, 0xc0ca], /* Hangul Syllable */
- [0xc0cb, 0xc0cb], /* Hangul Syllable */
- [0xc0cc, 0xc0cc], /* Hangul Syllable */
- [0xc0cd, 0xc0cd], /* Hangul Syllable */
- [0xc0ce, 0xc0ce], /* Hangul Syllable */
- [0xc0cf, 0xc0cf], /* Hangul Syllable */
- [0xc0d0, 0xc0d0], /* Hangul Syllable */
- [0xc0d1, 0xc0d1], /* Hangul Syllable */
- [0xc0d2, 0xc0d2], /* Hangul Syllable */
- [0xc0d3, 0xc0d3], /* Hangul Syllable */
- [0xc0d4, 0xc0d4], /* Hangul Syllable */
- [0xc0d5, 0xc0d5], /* Hangul Syllable */
- [0xc0d6, 0xc0d6], /* Hangul Syllable */
- [0xc0d7, 0xc0d7], /* Hangul Syllable */
- [0xc0d8, 0xc0d8], /* Hangul Syllable */
- [0xc0d9, 0xc0d9], /* Hangul Syllable */
- [0xc0da, 0xc0da], /* Hangul Syllable */
- [0xc0db, 0xc0db], /* Hangul Syllable */
- [0xc0dc, 0xc0dc], /* Hangul Syllable */
- [0xc0dd, 0xc0dd], /* Hangul Syllable */
- [0xc0de, 0xc0de], /* Hangul Syllable */
- [0xc0df, 0xc0df], /* Hangul Syllable */
- [0xc0e0, 0xc0e0], /* Hangul Syllable */
- [0xc0e1, 0xc0e1], /* Hangul Syllable */
- [0xc0e2, 0xc0e2], /* Hangul Syllable */
- [0xc0e3, 0xc0e3], /* Hangul Syllable */
- [0xc0e4, 0xc0e4], /* Hangul Syllable */
- [0xc0e5, 0xc0e5], /* Hangul Syllable */
- [0xc0e6, 0xc0e6], /* Hangul Syllable */
- [0xc0e7, 0xc0e7], /* Hangul Syllable */
- [0xc0e8, 0xc0e8], /* Hangul Syllable */
- [0xc0e9, 0xc0e9], /* Hangul Syllable */
- [0xc0ea, 0xc0ea], /* Hangul Syllable */
- [0xc0eb, 0xc0eb], /* Hangul Syllable */
- [0xc0ec, 0xc0ec], /* Hangul Syllable */
- [0xc0ed, 0xc0ed], /* Hangul Syllable */
- [0xc0ee, 0xc0ee], /* Hangul Syllable */
- [0xc0ef, 0xc0ef], /* Hangul Syllable */
- [0xc0f0, 0xc0f0], /* Hangul Syllable */
- [0xc0f1, 0xc0f1], /* Hangul Syllable */
- [0xc0f2, 0xc0f2], /* Hangul Syllable */
- [0xc0f3, 0xc0f3], /* Hangul Syllable */
- [0xc0f4, 0xc0f4], /* Hangul Syllable */
- [0xc0f5, 0xc0f5], /* Hangul Syllable */
- [0xc0f6, 0xc0f6], /* Hangul Syllable */
- [0xc0f7, 0xc0f7], /* Hangul Syllable */
- [0xc0f8, 0xc0f8], /* Hangul Syllable */
- [0xc0f9, 0xc0f9], /* Hangul Syllable */
- [0xc0fa, 0xc0fa], /* Hangul Syllable */
- [0xc0fb, 0xc0fb], /* Hangul Syllable */
- [0xc0fc, 0xc0fc], /* Hangul Syllable */
- [0xc0fd, 0xc0fd], /* Hangul Syllable */
- [0xc0fe, 0xc0fe], /* Hangul Syllable */
- [0xc0ff, 0xc0ff], /* Hangul Syllable */
- [0xc100, 0xc100], /* Hangul Syllable */
- [0xc101, 0xc101], /* Hangul Syllable */
- [0xc102, 0xc102], /* Hangul Syllable */
- [0xc103, 0xc103], /* Hangul Syllable */
- [0xc104, 0xc104], /* Hangul Syllable */
- [0xc105, 0xc105], /* Hangul Syllable */
- [0xc106, 0xc106], /* Hangul Syllable */
- [0xc107, 0xc107], /* Hangul Syllable */
- [0xc108, 0xc108], /* Hangul Syllable */
- [0xc109, 0xc109], /* Hangul Syllable */
- [0xc10a, 0xc10a], /* Hangul Syllable */
- [0xc10b, 0xc10b], /* Hangul Syllable */
- [0xc10c, 0xc10c], /* Hangul Syllable */
- [0xc10d, 0xc10d], /* Hangul Syllable */
- [0xc10e, 0xc10e], /* Hangul Syllable */
- [0xc10f, 0xc10f], /* Hangul Syllable */
- [0xc110, 0xc110], /* Hangul Syllable */
- [0xc111, 0xc111], /* Hangul Syllable */
- [0xc112, 0xc112], /* Hangul Syllable */
- [0xc113, 0xc113], /* Hangul Syllable */
- [0xc114, 0xc114], /* Hangul Syllable */
- [0xc115, 0xc115], /* Hangul Syllable */
- [0xc116, 0xc116], /* Hangul Syllable */
- [0xc117, 0xc117], /* Hangul Syllable */
- [0xc118, 0xc118], /* Hangul Syllable */
- [0xc119, 0xc119], /* Hangul Syllable */
- [0xc11a, 0xc11a], /* Hangul Syllable */
- [0xc11b, 0xc11b], /* Hangul Syllable */
- [0xc11c, 0xc11c], /* Hangul Syllable */
- [0xc11d, 0xc11d], /* Hangul Syllable */
- [0xc11e, 0xc11e], /* Hangul Syllable */
- [0xc11f, 0xc11f], /* Hangul Syllable */
- [0xc120, 0xc120], /* Hangul Syllable */
- [0xc121, 0xc121], /* Hangul Syllable */
- [0xc122, 0xc122], /* Hangul Syllable */
- [0xc123, 0xc123], /* Hangul Syllable */
- [0xc124, 0xc124], /* Hangul Syllable */
- [0xc125, 0xc125], /* Hangul Syllable */
- [0xc126, 0xc126], /* Hangul Syllable */
- [0xc127, 0xc127], /* Hangul Syllable */
- [0xc128, 0xc128], /* Hangul Syllable */
- [0xc129, 0xc129], /* Hangul Syllable */
- [0xc12a, 0xc12a], /* Hangul Syllable */
- [0xc12b, 0xc12b], /* Hangul Syllable */
- [0xc12c, 0xc12c], /* Hangul Syllable */
- [0xc12d, 0xc12d], /* Hangul Syllable */
- [0xc12e, 0xc12e], /* Hangul Syllable */
- [0xc12f, 0xc12f], /* Hangul Syllable */
- [0xc130, 0xc130], /* Hangul Syllable */
- [0xc131, 0xc131], /* Hangul Syllable */
- [0xc132, 0xc132], /* Hangul Syllable */
- [0xc133, 0xc133], /* Hangul Syllable */
- [0xc134, 0xc134], /* Hangul Syllable */
- [0xc135, 0xc135], /* Hangul Syllable */
- [0xc136, 0xc136], /* Hangul Syllable */
- [0xc137, 0xc137], /* Hangul Syllable */
- [0xc138, 0xc138], /* Hangul Syllable */
- [0xc139, 0xc139], /* Hangul Syllable */
- [0xc13a, 0xc13a], /* Hangul Syllable */
- [0xc13b, 0xc13b], /* Hangul Syllable */
- [0xc13c, 0xc13c], /* Hangul Syllable */
- [0xc13d, 0xc13d], /* Hangul Syllable */
- [0xc13e, 0xc13e], /* Hangul Syllable */
- [0xc13f, 0xc13f], /* Hangul Syllable */
- [0xc140, 0xc140], /* Hangul Syllable */
- [0xc141, 0xc141], /* Hangul Syllable */
- [0xc142, 0xc142], /* Hangul Syllable */
- [0xc143, 0xc143], /* Hangul Syllable */
- [0xc144, 0xc144], /* Hangul Syllable */
- [0xc145, 0xc145], /* Hangul Syllable */
- [0xc146, 0xc146], /* Hangul Syllable */
- [0xc147, 0xc147], /* Hangul Syllable */
- [0xc148, 0xc148], /* Hangul Syllable */
- [0xc149, 0xc149], /* Hangul Syllable */
- [0xc14a, 0xc14a], /* Hangul Syllable */
- [0xc14b, 0xc14b], /* Hangul Syllable */
- [0xc14c, 0xc14c], /* Hangul Syllable */
- [0xc14d, 0xc14d], /* Hangul Syllable */
- [0xc14e, 0xc14e], /* Hangul Syllable */
- [0xc14f, 0xc14f], /* Hangul Syllable */
- [0xc150, 0xc150], /* Hangul Syllable */
- [0xc151, 0xc151], /* Hangul Syllable */
- [0xc152, 0xc152], /* Hangul Syllable */
- [0xc153, 0xc153], /* Hangul Syllable */
- [0xc154, 0xc154], /* Hangul Syllable */
- [0xc155, 0xc155], /* Hangul Syllable */
- [0xc156, 0xc156], /* Hangul Syllable */
- [0xc157, 0xc157], /* Hangul Syllable */
- [0xc158, 0xc158], /* Hangul Syllable */
- [0xc159, 0xc159], /* Hangul Syllable */
- [0xc15a, 0xc15a], /* Hangul Syllable */
- [0xc15b, 0xc15b], /* Hangul Syllable */
- [0xc15c, 0xc15c], /* Hangul Syllable */
- [0xc15d, 0xc15d], /* Hangul Syllable */
- [0xc15e, 0xc15e], /* Hangul Syllable */
- [0xc15f, 0xc15f], /* Hangul Syllable */
- [0xc160, 0xc160], /* Hangul Syllable */
- [0xc161, 0xc161], /* Hangul Syllable */
- [0xc162, 0xc162], /* Hangul Syllable */
- [0xc163, 0xc163], /* Hangul Syllable */
- [0xc164, 0xc164], /* Hangul Syllable */
- [0xc165, 0xc165], /* Hangul Syllable */
- [0xc166, 0xc166], /* Hangul Syllable */
- [0xc167, 0xc167], /* Hangul Syllable */
- [0xc168, 0xc168], /* Hangul Syllable */
- [0xc169, 0xc169], /* Hangul Syllable */
- [0xc16a, 0xc16a], /* Hangul Syllable */
- [0xc16b, 0xc16b], /* Hangul Syllable */
- [0xc16c, 0xc16c], /* Hangul Syllable */
- [0xc16d, 0xc16d], /* Hangul Syllable */
- [0xc16e, 0xc16e], /* Hangul Syllable */
- [0xc16f, 0xc16f], /* Hangul Syllable */
- [0xc170, 0xc170], /* Hangul Syllable */
- [0xc171, 0xc171], /* Hangul Syllable */
- [0xc172, 0xc172], /* Hangul Syllable */
- [0xc173, 0xc173], /* Hangul Syllable */
- [0xc174, 0xc174], /* Hangul Syllable */
- [0xc175, 0xc175], /* Hangul Syllable */
- [0xc176, 0xc176], /* Hangul Syllable */
- [0xc177, 0xc177], /* Hangul Syllable */
- [0xc178, 0xc178], /* Hangul Syllable */
- [0xc179, 0xc179], /* Hangul Syllable */
- [0xc17a, 0xc17a], /* Hangul Syllable */
- [0xc17b, 0xc17b], /* Hangul Syllable */
- [0xc17c, 0xc17c], /* Hangul Syllable */
- [0xc17d, 0xc17d], /* Hangul Syllable */
- [0xc17e, 0xc17e], /* Hangul Syllable */
- [0xc17f, 0xc17f], /* Hangul Syllable */
- [0xc180, 0xc180], /* Hangul Syllable */
- [0xc181, 0xc181], /* Hangul Syllable */
- [0xc182, 0xc182], /* Hangul Syllable */
- [0xc183, 0xc183], /* Hangul Syllable */
- [0xc184, 0xc184], /* Hangul Syllable */
- [0xc185, 0xc185], /* Hangul Syllable */
- [0xc186, 0xc186], /* Hangul Syllable */
- [0xc187, 0xc187], /* Hangul Syllable */
- [0xc188, 0xc188], /* Hangul Syllable */
- [0xc189, 0xc189], /* Hangul Syllable */
- [0xc18a, 0xc18a], /* Hangul Syllable */
- [0xc18b, 0xc18b], /* Hangul Syllable */
- [0xc18c, 0xc18c], /* Hangul Syllable */
- [0xc18d, 0xc18d], /* Hangul Syllable */
- [0xc18e, 0xc18e], /* Hangul Syllable */
- [0xc18f, 0xc18f], /* Hangul Syllable */
- [0xc190, 0xc190], /* Hangul Syllable */
- [0xc191, 0xc191], /* Hangul Syllable */
- [0xc192, 0xc192], /* Hangul Syllable */
- [0xc193, 0xc193], /* Hangul Syllable */
- [0xc194, 0xc194], /* Hangul Syllable */
- [0xc195, 0xc195], /* Hangul Syllable */
- [0xc196, 0xc196], /* Hangul Syllable */
- [0xc197, 0xc197], /* Hangul Syllable */
- [0xc198, 0xc198], /* Hangul Syllable */
- [0xc199, 0xc199], /* Hangul Syllable */
- [0xc19a, 0xc19a], /* Hangul Syllable */
- [0xc19b, 0xc19b], /* Hangul Syllable */
- [0xc19c, 0xc19c], /* Hangul Syllable */
- [0xc19d, 0xc19d], /* Hangul Syllable */
- [0xc19e, 0xc19e], /* Hangul Syllable */
- [0xc19f, 0xc19f], /* Hangul Syllable */
- [0xc1a0, 0xc1a0], /* Hangul Syllable */
- [0xc1a1, 0xc1a1], /* Hangul Syllable */
- [0xc1a2, 0xc1a2], /* Hangul Syllable */
- [0xc1a3, 0xc1a3], /* Hangul Syllable */
- [0xc1a4, 0xc1a4], /* Hangul Syllable */
- [0xc1a5, 0xc1a5], /* Hangul Syllable */
- [0xc1a6, 0xc1a6], /* Hangul Syllable */
- [0xc1a7, 0xc1a7], /* Hangul Syllable */
- [0xc1a8, 0xc1a8], /* Hangul Syllable */
- [0xc1a9, 0xc1a9], /* Hangul Syllable */
- [0xc1aa, 0xc1aa], /* Hangul Syllable */
- [0xc1ab, 0xc1ab], /* Hangul Syllable */
- [0xc1ac, 0xc1ac], /* Hangul Syllable */
- [0xc1ad, 0xc1ad], /* Hangul Syllable */
- [0xc1ae, 0xc1ae], /* Hangul Syllable */
- [0xc1af, 0xc1af], /* Hangul Syllable */
- [0xc1b0, 0xc1b0], /* Hangul Syllable */
- [0xc1b1, 0xc1b1], /* Hangul Syllable */
- [0xc1b2, 0xc1b2], /* Hangul Syllable */
- [0xc1b3, 0xc1b3], /* Hangul Syllable */
- [0xc1b4, 0xc1b4], /* Hangul Syllable */
- [0xc1b5, 0xc1b5], /* Hangul Syllable */
- [0xc1b6, 0xc1b6], /* Hangul Syllable */
- [0xc1b7, 0xc1b7], /* Hangul Syllable */
- [0xc1b8, 0xc1b8], /* Hangul Syllable */
- [0xc1b9, 0xc1b9], /* Hangul Syllable */
- [0xc1ba, 0xc1ba], /* Hangul Syllable */
- [0xc1bb, 0xc1bb], /* Hangul Syllable */
- [0xc1bc, 0xc1bc], /* Hangul Syllable */
- [0xc1bd, 0xc1bd], /* Hangul Syllable */
- [0xc1be, 0xc1be], /* Hangul Syllable */
- [0xc1bf, 0xc1bf], /* Hangul Syllable */
- [0xc1c0, 0xc1c0], /* Hangul Syllable */
- [0xc1c1, 0xc1c1], /* Hangul Syllable */
- [0xc1c2, 0xc1c2], /* Hangul Syllable */
- [0xc1c3, 0xc1c3], /* Hangul Syllable */
- [0xc1c4, 0xc1c4], /* Hangul Syllable */
- [0xc1c5, 0xc1c5], /* Hangul Syllable */
- [0xc1c6, 0xc1c6], /* Hangul Syllable */
- [0xc1c7, 0xc1c7], /* Hangul Syllable */
- [0xc1c8, 0xc1c8], /* Hangul Syllable */
- [0xc1c9, 0xc1c9], /* Hangul Syllable */
- [0xc1ca, 0xc1ca], /* Hangul Syllable */
- [0xc1cb, 0xc1cb], /* Hangul Syllable */
- [0xc1cc, 0xc1cc], /* Hangul Syllable */
- [0xc1cd, 0xc1cd], /* Hangul Syllable */
- [0xc1ce, 0xc1ce], /* Hangul Syllable */
- [0xc1cf, 0xc1cf], /* Hangul Syllable */
- [0xc1d0, 0xc1d0], /* Hangul Syllable */
- [0xc1d1, 0xc1d1], /* Hangul Syllable */
- [0xc1d2, 0xc1d2], /* Hangul Syllable */
- [0xc1d3, 0xc1d3], /* Hangul Syllable */
- [0xc1d4, 0xc1d4], /* Hangul Syllable */
- [0xc1d5, 0xc1d5], /* Hangul Syllable */
- [0xc1d6, 0xc1d6], /* Hangul Syllable */
- [0xc1d7, 0xc1d7], /* Hangul Syllable */
- [0xc1d8, 0xc1d8], /* Hangul Syllable */
- [0xc1d9, 0xc1d9], /* Hangul Syllable */
- [0xc1da, 0xc1da], /* Hangul Syllable */
- [0xc1db, 0xc1db], /* Hangul Syllable */
- [0xc1dc, 0xc1dc], /* Hangul Syllable */
- [0xc1dd, 0xc1dd], /* Hangul Syllable */
- [0xc1de, 0xc1de], /* Hangul Syllable */
- [0xc1df, 0xc1df], /* Hangul Syllable */
- [0xc1e0, 0xc1e0], /* Hangul Syllable */
- [0xc1e1, 0xc1e1], /* Hangul Syllable */
- [0xc1e2, 0xc1e2], /* Hangul Syllable */
- [0xc1e3, 0xc1e3], /* Hangul Syllable */
- [0xc1e4, 0xc1e4], /* Hangul Syllable */
- [0xc1e5, 0xc1e5], /* Hangul Syllable */
- [0xc1e6, 0xc1e6], /* Hangul Syllable */
- [0xc1e7, 0xc1e7], /* Hangul Syllable */
- [0xc1e8, 0xc1e8], /* Hangul Syllable */
- [0xc1e9, 0xc1e9], /* Hangul Syllable */
- [0xc1ea, 0xc1ea], /* Hangul Syllable */
- [0xc1eb, 0xc1eb], /* Hangul Syllable */
- [0xc1ec, 0xc1ec], /* Hangul Syllable */
- [0xc1ed, 0xc1ed], /* Hangul Syllable */
- [0xc1ee, 0xc1ee], /* Hangul Syllable */
- [0xc1ef, 0xc1ef], /* Hangul Syllable */
- [0xc1f0, 0xc1f0], /* Hangul Syllable */
- [0xc1f1, 0xc1f1], /* Hangul Syllable */
- [0xc1f2, 0xc1f2], /* Hangul Syllable */
- [0xc1f3, 0xc1f3], /* Hangul Syllable */
- [0xc1f4, 0xc1f4], /* Hangul Syllable */
- [0xc1f5, 0xc1f5], /* Hangul Syllable */
- [0xc1f6, 0xc1f6], /* Hangul Syllable */
- [0xc1f7, 0xc1f7], /* Hangul Syllable */
- [0xc1f8, 0xc1f8], /* Hangul Syllable */
- [0xc1f9, 0xc1f9], /* Hangul Syllable */
- [0xc1fa, 0xc1fa], /* Hangul Syllable */
- [0xc1fb, 0xc1fb], /* Hangul Syllable */
- [0xc1fc, 0xc1fc], /* Hangul Syllable */
- [0xc1fd, 0xc1fd], /* Hangul Syllable */
- [0xc1fe, 0xc1fe], /* Hangul Syllable */
- [0xc1ff, 0xc1ff], /* Hangul Syllable */
- [0xc200, 0xc200], /* Hangul Syllable */
- [0xc201, 0xc201], /* Hangul Syllable */
- [0xc202, 0xc202], /* Hangul Syllable */
- [0xc203, 0xc203], /* Hangul Syllable */
- [0xc204, 0xc204], /* Hangul Syllable */
- [0xc205, 0xc205], /* Hangul Syllable */
- [0xc206, 0xc206], /* Hangul Syllable */
- [0xc207, 0xc207], /* Hangul Syllable */
- [0xc208, 0xc208], /* Hangul Syllable */
- [0xc209, 0xc209], /* Hangul Syllable */
- [0xc20a, 0xc20a], /* Hangul Syllable */
- [0xc20b, 0xc20b], /* Hangul Syllable */
- [0xc20c, 0xc20c], /* Hangul Syllable */
- [0xc20d, 0xc20d], /* Hangul Syllable */
- [0xc20e, 0xc20e], /* Hangul Syllable */
- [0xc20f, 0xc20f], /* Hangul Syllable */
- [0xc210, 0xc210], /* Hangul Syllable */
- [0xc211, 0xc211], /* Hangul Syllable */
- [0xc212, 0xc212], /* Hangul Syllable */
- [0xc213, 0xc213], /* Hangul Syllable */
- [0xc214, 0xc214], /* Hangul Syllable */
- [0xc215, 0xc215], /* Hangul Syllable */
- [0xc216, 0xc216], /* Hangul Syllable */
- [0xc217, 0xc217], /* Hangul Syllable */
- [0xc218, 0xc218], /* Hangul Syllable */
- [0xc219, 0xc219], /* Hangul Syllable */
- [0xc21a, 0xc21a], /* Hangul Syllable */
- [0xc21b, 0xc21b], /* Hangul Syllable */
- [0xc21c, 0xc21c], /* Hangul Syllable */
- [0xc21d, 0xc21d], /* Hangul Syllable */
- [0xc21e, 0xc21e], /* Hangul Syllable */
- [0xc21f, 0xc21f], /* Hangul Syllable */
- [0xc220, 0xc220], /* Hangul Syllable */
- [0xc221, 0xc221], /* Hangul Syllable */
- [0xc222, 0xc222], /* Hangul Syllable */
- [0xc223, 0xc223], /* Hangul Syllable */
- [0xc224, 0xc224], /* Hangul Syllable */
- [0xc225, 0xc225], /* Hangul Syllable */
- [0xc226, 0xc226], /* Hangul Syllable */
- [0xc227, 0xc227], /* Hangul Syllable */
- [0xc228, 0xc228], /* Hangul Syllable */
- [0xc229, 0xc229], /* Hangul Syllable */
- [0xc22a, 0xc22a], /* Hangul Syllable */
- [0xc22b, 0xc22b], /* Hangul Syllable */
- [0xc22c, 0xc22c], /* Hangul Syllable */
- [0xc22d, 0xc22d], /* Hangul Syllable */
- [0xc22e, 0xc22e], /* Hangul Syllable */
- [0xc22f, 0xc22f], /* Hangul Syllable */
- [0xc230, 0xc230], /* Hangul Syllable */
- [0xc231, 0xc231], /* Hangul Syllable */
- [0xc232, 0xc232], /* Hangul Syllable */
- [0xc233, 0xc233], /* Hangul Syllable */
- [0xc234, 0xc234], /* Hangul Syllable */
- [0xc235, 0xc235], /* Hangul Syllable */
- [0xc236, 0xc236], /* Hangul Syllable */
- [0xc237, 0xc237], /* Hangul Syllable */
- [0xc238, 0xc238], /* Hangul Syllable */
- [0xc239, 0xc239], /* Hangul Syllable */
- [0xc23a, 0xc23a], /* Hangul Syllable */
- [0xc23b, 0xc23b], /* Hangul Syllable */
- [0xc23c, 0xc23c], /* Hangul Syllable */
- [0xc23d, 0xc23d], /* Hangul Syllable */
- [0xc23e, 0xc23e], /* Hangul Syllable */
- [0xc23f, 0xc23f], /* Hangul Syllable */
- [0xc240, 0xc240], /* Hangul Syllable */
- [0xc241, 0xc241], /* Hangul Syllable */
- [0xc242, 0xc242], /* Hangul Syllable */
- [0xc243, 0xc243], /* Hangul Syllable */
- [0xc244, 0xc244], /* Hangul Syllable */
- [0xc245, 0xc245], /* Hangul Syllable */
- [0xc246, 0xc246], /* Hangul Syllable */
- [0xc247, 0xc247], /* Hangul Syllable */
- [0xc248, 0xc248], /* Hangul Syllable */
- [0xc249, 0xc249], /* Hangul Syllable */
- [0xc24a, 0xc24a], /* Hangul Syllable */
- [0xc24b, 0xc24b], /* Hangul Syllable */
- [0xc24c, 0xc24c], /* Hangul Syllable */
- [0xc24d, 0xc24d], /* Hangul Syllable */
- [0xc24e, 0xc24e], /* Hangul Syllable */
- [0xc24f, 0xc24f], /* Hangul Syllable */
- [0xc250, 0xc250], /* Hangul Syllable */
- [0xc251, 0xc251], /* Hangul Syllable */
- [0xc252, 0xc252], /* Hangul Syllable */
- [0xc253, 0xc253], /* Hangul Syllable */
- [0xc254, 0xc254], /* Hangul Syllable */
- [0xc255, 0xc255], /* Hangul Syllable */
- [0xc256, 0xc256], /* Hangul Syllable */
- [0xc257, 0xc257], /* Hangul Syllable */
- [0xc258, 0xc258], /* Hangul Syllable */
- [0xc259, 0xc259], /* Hangul Syllable */
- [0xc25a, 0xc25a], /* Hangul Syllable */
- [0xc25b, 0xc25b], /* Hangul Syllable */
- [0xc25c, 0xc25c], /* Hangul Syllable */
- [0xc25d, 0xc25d], /* Hangul Syllable */
- [0xc25e, 0xc25e], /* Hangul Syllable */
- [0xc25f, 0xc25f], /* Hangul Syllable */
- [0xc260, 0xc260], /* Hangul Syllable */
- [0xc261, 0xc261], /* Hangul Syllable */
- [0xc262, 0xc262], /* Hangul Syllable */
- [0xc263, 0xc263], /* Hangul Syllable */
- [0xc264, 0xc264], /* Hangul Syllable */
- [0xc265, 0xc265], /* Hangul Syllable */
- [0xc266, 0xc266], /* Hangul Syllable */
- [0xc267, 0xc267], /* Hangul Syllable */
- [0xc268, 0xc268], /* Hangul Syllable */
- [0xc269, 0xc269], /* Hangul Syllable */
- [0xc26a, 0xc26a], /* Hangul Syllable */
- [0xc26b, 0xc26b], /* Hangul Syllable */
- [0xc26c, 0xc26c], /* Hangul Syllable */
- [0xc26d, 0xc26d], /* Hangul Syllable */
- [0xc26e, 0xc26e], /* Hangul Syllable */
- [0xc26f, 0xc26f], /* Hangul Syllable */
- [0xc270, 0xc270], /* Hangul Syllable */
- [0xc271, 0xc271], /* Hangul Syllable */
- [0xc272, 0xc272], /* Hangul Syllable */
- [0xc273, 0xc273], /* Hangul Syllable */
- [0xc274, 0xc274], /* Hangul Syllable */
- [0xc275, 0xc275], /* Hangul Syllable */
- [0xc276, 0xc276], /* Hangul Syllable */
- [0xc277, 0xc277], /* Hangul Syllable */
- [0xc278, 0xc278], /* Hangul Syllable */
- [0xc279, 0xc279], /* Hangul Syllable */
- [0xc27a, 0xc27a], /* Hangul Syllable */
- [0xc27b, 0xc27b], /* Hangul Syllable */
- [0xc27c, 0xc27c], /* Hangul Syllable */
- [0xc27d, 0xc27d], /* Hangul Syllable */
- [0xc27e, 0xc27e], /* Hangul Syllable */
- [0xc27f, 0xc27f], /* Hangul Syllable */
- [0xc280, 0xc280], /* Hangul Syllable */
- [0xc281, 0xc281], /* Hangul Syllable */
- [0xc282, 0xc282], /* Hangul Syllable */
- [0xc283, 0xc283], /* Hangul Syllable */
- [0xc284, 0xc284], /* Hangul Syllable */
- [0xc285, 0xc285], /* Hangul Syllable */
- [0xc286, 0xc286], /* Hangul Syllable */
- [0xc287, 0xc287], /* Hangul Syllable */
- [0xc288, 0xc288], /* Hangul Syllable */
- [0xc289, 0xc289], /* Hangul Syllable */
- [0xc28a, 0xc28a], /* Hangul Syllable */
- [0xc28b, 0xc28b], /* Hangul Syllable */
- [0xc28c, 0xc28c], /* Hangul Syllable */
- [0xc28d, 0xc28d], /* Hangul Syllable */
- [0xc28e, 0xc28e], /* Hangul Syllable */
- [0xc28f, 0xc28f], /* Hangul Syllable */
- [0xc290, 0xc290], /* Hangul Syllable */
- [0xc291, 0xc291], /* Hangul Syllable */
- [0xc292, 0xc292], /* Hangul Syllable */
- [0xc293, 0xc293], /* Hangul Syllable */
- [0xc294, 0xc294], /* Hangul Syllable */
- [0xc295, 0xc295], /* Hangul Syllable */
- [0xc296, 0xc296], /* Hangul Syllable */
- [0xc297, 0xc297], /* Hangul Syllable */
- [0xc298, 0xc298], /* Hangul Syllable */
- [0xc299, 0xc299], /* Hangul Syllable */
- [0xc29a, 0xc29a], /* Hangul Syllable */
- [0xc29b, 0xc29b], /* Hangul Syllable */
- [0xc29c, 0xc29c], /* Hangul Syllable */
- [0xc29d, 0xc29d], /* Hangul Syllable */
- [0xc29e, 0xc29e], /* Hangul Syllable */
- [0xc29f, 0xc29f], /* Hangul Syllable */
- [0xc2a0, 0xc2a0], /* Hangul Syllable */
- [0xc2a1, 0xc2a1], /* Hangul Syllable */
- [0xc2a2, 0xc2a2], /* Hangul Syllable */
- [0xc2a3, 0xc2a3], /* Hangul Syllable */
- [0xc2a4, 0xc2a4], /* Hangul Syllable */
- [0xc2a5, 0xc2a5], /* Hangul Syllable */
- [0xc2a6, 0xc2a6], /* Hangul Syllable */
- [0xc2a7, 0xc2a7], /* Hangul Syllable */
- [0xc2a8, 0xc2a8], /* Hangul Syllable */
- [0xc2a9, 0xc2a9], /* Hangul Syllable */
- [0xc2aa, 0xc2aa], /* Hangul Syllable */
- [0xc2ab, 0xc2ab], /* Hangul Syllable */
- [0xc2ac, 0xc2ac], /* Hangul Syllable */
- [0xc2ad, 0xc2ad], /* Hangul Syllable */
- [0xc2ae, 0xc2ae], /* Hangul Syllable */
- [0xc2af, 0xc2af], /* Hangul Syllable */
- [0xc2b0, 0xc2b0], /* Hangul Syllable */
- [0xc2b1, 0xc2b1], /* Hangul Syllable */
- [0xc2b2, 0xc2b2], /* Hangul Syllable */
- [0xc2b3, 0xc2b3], /* Hangul Syllable */
- [0xc2b4, 0xc2b4], /* Hangul Syllable */
- [0xc2b5, 0xc2b5], /* Hangul Syllable */
- [0xc2b6, 0xc2b6], /* Hangul Syllable */
- [0xc2b7, 0xc2b7], /* Hangul Syllable */
- [0xc2b8, 0xc2b8], /* Hangul Syllable */
- [0xc2b9, 0xc2b9], /* Hangul Syllable */
- [0xc2ba, 0xc2ba], /* Hangul Syllable */
- [0xc2bb, 0xc2bb], /* Hangul Syllable */
- [0xc2bc, 0xc2bc], /* Hangul Syllable */
- [0xc2bd, 0xc2bd], /* Hangul Syllable */
- [0xc2be, 0xc2be], /* Hangul Syllable */
- [0xc2bf, 0xc2bf], /* Hangul Syllable */
- [0xc2c0, 0xc2c0], /* Hangul Syllable */
- [0xc2c1, 0xc2c1], /* Hangul Syllable */
- [0xc2c2, 0xc2c2], /* Hangul Syllable */
- [0xc2c3, 0xc2c3], /* Hangul Syllable */
- [0xc2c4, 0xc2c4], /* Hangul Syllable */
- [0xc2c5, 0xc2c5], /* Hangul Syllable */
- [0xc2c6, 0xc2c6], /* Hangul Syllable */
- [0xc2c7, 0xc2c7], /* Hangul Syllable */
- [0xc2c8, 0xc2c8], /* Hangul Syllable */
- [0xc2c9, 0xc2c9], /* Hangul Syllable */
- [0xc2ca, 0xc2ca], /* Hangul Syllable */
- [0xc2cb, 0xc2cb], /* Hangul Syllable */
- [0xc2cc, 0xc2cc], /* Hangul Syllable */
- [0xc2cd, 0xc2cd], /* Hangul Syllable */
- [0xc2ce, 0xc2ce], /* Hangul Syllable */
- [0xc2cf, 0xc2cf], /* Hangul Syllable */
- [0xc2d0, 0xc2d0], /* Hangul Syllable */
- [0xc2d1, 0xc2d1], /* Hangul Syllable */
- [0xc2d2, 0xc2d2], /* Hangul Syllable */
- [0xc2d3, 0xc2d3], /* Hangul Syllable */
- [0xc2d4, 0xc2d4], /* Hangul Syllable */
- [0xc2d5, 0xc2d5], /* Hangul Syllable */
- [0xc2d6, 0xc2d6], /* Hangul Syllable */
- [0xc2d7, 0xc2d7], /* Hangul Syllable */
- [0xc2d8, 0xc2d8], /* Hangul Syllable */
- [0xc2d9, 0xc2d9], /* Hangul Syllable */
- [0xc2da, 0xc2da], /* Hangul Syllable */
- [0xc2db, 0xc2db], /* Hangul Syllable */
- [0xc2dc, 0xc2dc], /* Hangul Syllable */
- [0xc2dd, 0xc2dd], /* Hangul Syllable */
- [0xc2de, 0xc2de], /* Hangul Syllable */
- [0xc2df, 0xc2df], /* Hangul Syllable */
- [0xc2e0, 0xc2e0], /* Hangul Syllable */
- [0xc2e1, 0xc2e1], /* Hangul Syllable */
- [0xc2e2, 0xc2e2], /* Hangul Syllable */
- [0xc2e3, 0xc2e3], /* Hangul Syllable */
- [0xc2e4, 0xc2e4], /* Hangul Syllable */
- [0xc2e5, 0xc2e5], /* Hangul Syllable */
- [0xc2e6, 0xc2e6], /* Hangul Syllable */
- [0xc2e7, 0xc2e7], /* Hangul Syllable */
- [0xc2e8, 0xc2e8], /* Hangul Syllable */
- [0xc2e9, 0xc2e9], /* Hangul Syllable */
- [0xc2ea, 0xc2ea], /* Hangul Syllable */
- [0xc2eb, 0xc2eb], /* Hangul Syllable */
- [0xc2ec, 0xc2ec], /* Hangul Syllable */
- [0xc2ed, 0xc2ed], /* Hangul Syllable */
- [0xc2ee, 0xc2ee], /* Hangul Syllable */
- [0xc2ef, 0xc2ef], /* Hangul Syllable */
- [0xc2f0, 0xc2f0], /* Hangul Syllable */
- [0xc2f1, 0xc2f1], /* Hangul Syllable */
- [0xc2f2, 0xc2f2], /* Hangul Syllable */
- [0xc2f3, 0xc2f3], /* Hangul Syllable */
- [0xc2f4, 0xc2f4], /* Hangul Syllable */
- [0xc2f5, 0xc2f5], /* Hangul Syllable */
- [0xc2f6, 0xc2f6], /* Hangul Syllable */
- [0xc2f7, 0xc2f7], /* Hangul Syllable */
- [0xc2f8, 0xc2f8], /* Hangul Syllable */
- [0xc2f9, 0xc2f9], /* Hangul Syllable */
- [0xc2fa, 0xc2fa], /* Hangul Syllable */
- [0xc2fb, 0xc2fb], /* Hangul Syllable */
- [0xc2fc, 0xc2fc], /* Hangul Syllable */
- [0xc2fd, 0xc2fd], /* Hangul Syllable */
- [0xc2fe, 0xc2fe], /* Hangul Syllable */
- [0xc2ff, 0xc2ff], /* Hangul Syllable */
- [0xc300, 0xc300], /* Hangul Syllable */
- [0xc301, 0xc301], /* Hangul Syllable */
- [0xc302, 0xc302], /* Hangul Syllable */
- [0xc303, 0xc303], /* Hangul Syllable */
- [0xc304, 0xc304], /* Hangul Syllable */
- [0xc305, 0xc305], /* Hangul Syllable */
- [0xc306, 0xc306], /* Hangul Syllable */
- [0xc307, 0xc307], /* Hangul Syllable */
- [0xc308, 0xc308], /* Hangul Syllable */
- [0xc309, 0xc309], /* Hangul Syllable */
- [0xc30a, 0xc30a], /* Hangul Syllable */
- [0xc30b, 0xc30b], /* Hangul Syllable */
- [0xc30c, 0xc30c], /* Hangul Syllable */
- [0xc30d, 0xc30d], /* Hangul Syllable */
- [0xc30e, 0xc30e], /* Hangul Syllable */
- [0xc30f, 0xc30f], /* Hangul Syllable */
- [0xc310, 0xc310], /* Hangul Syllable */
- [0xc311, 0xc311], /* Hangul Syllable */
- [0xc312, 0xc312], /* Hangul Syllable */
- [0xc313, 0xc313], /* Hangul Syllable */
- [0xc314, 0xc314], /* Hangul Syllable */
- [0xc315, 0xc315], /* Hangul Syllable */
- [0xc316, 0xc316], /* Hangul Syllable */
- [0xc317, 0xc317], /* Hangul Syllable */
- [0xc318, 0xc318], /* Hangul Syllable */
- [0xc319, 0xc319], /* Hangul Syllable */
- [0xc31a, 0xc31a], /* Hangul Syllable */
- [0xc31b, 0xc31b], /* Hangul Syllable */
- [0xc31c, 0xc31c], /* Hangul Syllable */
- [0xc31d, 0xc31d], /* Hangul Syllable */
- [0xc31e, 0xc31e], /* Hangul Syllable */
- [0xc31f, 0xc31f], /* Hangul Syllable */
- [0xc320, 0xc320], /* Hangul Syllable */
- [0xc321, 0xc321], /* Hangul Syllable */
- [0xc322, 0xc322], /* Hangul Syllable */
- [0xc323, 0xc323], /* Hangul Syllable */
- [0xc324, 0xc324], /* Hangul Syllable */
- [0xc325, 0xc325], /* Hangul Syllable */
- [0xc326, 0xc326], /* Hangul Syllable */
- [0xc327, 0xc327], /* Hangul Syllable */
- [0xc328, 0xc328], /* Hangul Syllable */
- [0xc329, 0xc329], /* Hangul Syllable */
- [0xc32a, 0xc32a], /* Hangul Syllable */
- [0xc32b, 0xc32b], /* Hangul Syllable */
- [0xc32c, 0xc32c], /* Hangul Syllable */
- [0xc32d, 0xc32d], /* Hangul Syllable */
- [0xc32e, 0xc32e], /* Hangul Syllable */
- [0xc32f, 0xc32f], /* Hangul Syllable */
- [0xc330, 0xc330], /* Hangul Syllable */
- [0xc331, 0xc331], /* Hangul Syllable */
- [0xc332, 0xc332], /* Hangul Syllable */
- [0xc333, 0xc333], /* Hangul Syllable */
- [0xc334, 0xc334], /* Hangul Syllable */
- [0xc335, 0xc335], /* Hangul Syllable */
- [0xc336, 0xc336], /* Hangul Syllable */
- [0xc337, 0xc337], /* Hangul Syllable */
- [0xc338, 0xc338], /* Hangul Syllable */
- [0xc339, 0xc339], /* Hangul Syllable */
- [0xc33a, 0xc33a], /* Hangul Syllable */
- [0xc33b, 0xc33b], /* Hangul Syllable */
- [0xc33c, 0xc33c], /* Hangul Syllable */
- [0xc33d, 0xc33d], /* Hangul Syllable */
- [0xc33e, 0xc33e], /* Hangul Syllable */
- [0xc33f, 0xc33f], /* Hangul Syllable */
- [0xc340, 0xc340], /* Hangul Syllable */
- [0xc341, 0xc341], /* Hangul Syllable */
- [0xc342, 0xc342], /* Hangul Syllable */
- [0xc343, 0xc343], /* Hangul Syllable */
- [0xc344, 0xc344], /* Hangul Syllable */
- [0xc345, 0xc345], /* Hangul Syllable */
- [0xc346, 0xc346], /* Hangul Syllable */
- [0xc347, 0xc347], /* Hangul Syllable */
- [0xc348, 0xc348], /* Hangul Syllable */
- [0xc349, 0xc349], /* Hangul Syllable */
- [0xc34a, 0xc34a], /* Hangul Syllable */
- [0xc34b, 0xc34b], /* Hangul Syllable */
- [0xc34c, 0xc34c], /* Hangul Syllable */
- [0xc34d, 0xc34d], /* Hangul Syllable */
- [0xc34e, 0xc34e], /* Hangul Syllable */
- [0xc34f, 0xc34f], /* Hangul Syllable */
- [0xc350, 0xc350], /* Hangul Syllable */
- [0xc351, 0xc351], /* Hangul Syllable */
- [0xc352, 0xc352], /* Hangul Syllable */
- [0xc353, 0xc353], /* Hangul Syllable */
- [0xc354, 0xc354], /* Hangul Syllable */
- [0xc355, 0xc355], /* Hangul Syllable */
- [0xc356, 0xc356], /* Hangul Syllable */
- [0xc357, 0xc357], /* Hangul Syllable */
- [0xc358, 0xc358], /* Hangul Syllable */
- [0xc359, 0xc359], /* Hangul Syllable */
- [0xc35a, 0xc35a], /* Hangul Syllable */
- [0xc35b, 0xc35b], /* Hangul Syllable */
- [0xc35c, 0xc35c], /* Hangul Syllable */
- [0xc35d, 0xc35d], /* Hangul Syllable */
- [0xc35e, 0xc35e], /* Hangul Syllable */
- [0xc35f, 0xc35f], /* Hangul Syllable */
- [0xc360, 0xc360], /* Hangul Syllable */
- [0xc361, 0xc361], /* Hangul Syllable */
- [0xc362, 0xc362], /* Hangul Syllable */
- [0xc363, 0xc363], /* Hangul Syllable */
- [0xc364, 0xc364], /* Hangul Syllable */
- [0xc365, 0xc365], /* Hangul Syllable */
- [0xc366, 0xc366], /* Hangul Syllable */
- [0xc367, 0xc367], /* Hangul Syllable */
- [0xc368, 0xc368], /* Hangul Syllable */
- [0xc369, 0xc369], /* Hangul Syllable */
- [0xc36a, 0xc36a], /* Hangul Syllable */
- [0xc36b, 0xc36b], /* Hangul Syllable */
- [0xc36c, 0xc36c], /* Hangul Syllable */
- [0xc36d, 0xc36d], /* Hangul Syllable */
- [0xc36e, 0xc36e], /* Hangul Syllable */
- [0xc36f, 0xc36f], /* Hangul Syllable */
- [0xc370, 0xc370], /* Hangul Syllable */
- [0xc371, 0xc371], /* Hangul Syllable */
- [0xc372, 0xc372], /* Hangul Syllable */
- [0xc373, 0xc373], /* Hangul Syllable */
- [0xc374, 0xc374], /* Hangul Syllable */
- [0xc375, 0xc375], /* Hangul Syllable */
- [0xc376, 0xc376], /* Hangul Syllable */
- [0xc377, 0xc377], /* Hangul Syllable */
- [0xc378, 0xc378], /* Hangul Syllable */
- [0xc379, 0xc379], /* Hangul Syllable */
- [0xc37a, 0xc37a], /* Hangul Syllable */
- [0xc37b, 0xc37b], /* Hangul Syllable */
- [0xc37c, 0xc37c], /* Hangul Syllable */
- [0xc37d, 0xc37d], /* Hangul Syllable */
- [0xc37e, 0xc37e], /* Hangul Syllable */
- [0xc37f, 0xc37f], /* Hangul Syllable */
- [0xc380, 0xc380], /* Hangul Syllable */
- [0xc381, 0xc381], /* Hangul Syllable */
- [0xc382, 0xc382], /* Hangul Syllable */
- [0xc383, 0xc383], /* Hangul Syllable */
- [0xc384, 0xc384], /* Hangul Syllable */
- [0xc385, 0xc385], /* Hangul Syllable */
- [0xc386, 0xc386], /* Hangul Syllable */
- [0xc387, 0xc387], /* Hangul Syllable */
- [0xc388, 0xc388], /* Hangul Syllable */
- [0xc389, 0xc389], /* Hangul Syllable */
- [0xc38a, 0xc38a], /* Hangul Syllable */
- [0xc38b, 0xc38b], /* Hangul Syllable */
- [0xc38c, 0xc38c], /* Hangul Syllable */
- [0xc38d, 0xc38d], /* Hangul Syllable */
- [0xc38e, 0xc38e], /* Hangul Syllable */
- [0xc38f, 0xc38f], /* Hangul Syllable */
- [0xc390, 0xc390], /* Hangul Syllable */
- [0xc391, 0xc391], /* Hangul Syllable */
- [0xc392, 0xc392], /* Hangul Syllable */
- [0xc393, 0xc393], /* Hangul Syllable */
- [0xc394, 0xc394], /* Hangul Syllable */
- [0xc395, 0xc395], /* Hangul Syllable */
- [0xc396, 0xc396], /* Hangul Syllable */
- [0xc397, 0xc397], /* Hangul Syllable */
- [0xc398, 0xc398], /* Hangul Syllable */
- [0xc399, 0xc399], /* Hangul Syllable */
- [0xc39a, 0xc39a], /* Hangul Syllable */
- [0xc39b, 0xc39b], /* Hangul Syllable */
- [0xc39c, 0xc39c], /* Hangul Syllable */
- [0xc39d, 0xc39d], /* Hangul Syllable */
- [0xc39e, 0xc39e], /* Hangul Syllable */
- [0xc39f, 0xc39f], /* Hangul Syllable */
- [0xc3a0, 0xc3a0], /* Hangul Syllable */
- [0xc3a1, 0xc3a1], /* Hangul Syllable */
- [0xc3a2, 0xc3a2], /* Hangul Syllable */
- [0xc3a3, 0xc3a3], /* Hangul Syllable */
- [0xc3a4, 0xc3a4], /* Hangul Syllable */
- [0xc3a5, 0xc3a5], /* Hangul Syllable */
- [0xc3a6, 0xc3a6], /* Hangul Syllable */
- [0xc3a7, 0xc3a7], /* Hangul Syllable */
- [0xc3a8, 0xc3a8], /* Hangul Syllable */
- [0xc3a9, 0xc3a9], /* Hangul Syllable */
- [0xc3aa, 0xc3aa], /* Hangul Syllable */
- [0xc3ab, 0xc3ab], /* Hangul Syllable */
- [0xc3ac, 0xc3ac], /* Hangul Syllable */
- [0xc3ad, 0xc3ad], /* Hangul Syllable */
- [0xc3ae, 0xc3ae], /* Hangul Syllable */
- [0xc3af, 0xc3af], /* Hangul Syllable */
- [0xc3b0, 0xc3b0], /* Hangul Syllable */
- [0xc3b1, 0xc3b1], /* Hangul Syllable */
- [0xc3b2, 0xc3b2], /* Hangul Syllable */
- [0xc3b3, 0xc3b3], /* Hangul Syllable */
- [0xc3b4, 0xc3b4], /* Hangul Syllable */
- [0xc3b5, 0xc3b5], /* Hangul Syllable */
- [0xc3b6, 0xc3b6], /* Hangul Syllable */
- [0xc3b7, 0xc3b7], /* Hangul Syllable */
- [0xc3b8, 0xc3b8], /* Hangul Syllable */
- [0xc3b9, 0xc3b9], /* Hangul Syllable */
- [0xc3ba, 0xc3ba], /* Hangul Syllable */
- [0xc3bb, 0xc3bb], /* Hangul Syllable */
- [0xc3bc, 0xc3bc], /* Hangul Syllable */
- [0xc3bd, 0xc3bd], /* Hangul Syllable */
- [0xc3be, 0xc3be], /* Hangul Syllable */
- [0xc3bf, 0xc3bf], /* Hangul Syllable */
- [0xc3c0, 0xc3c0], /* Hangul Syllable */
- [0xc3c1, 0xc3c1], /* Hangul Syllable */
- [0xc3c2, 0xc3c2], /* Hangul Syllable */
- [0xc3c3, 0xc3c3], /* Hangul Syllable */
- [0xc3c4, 0xc3c4], /* Hangul Syllable */
- [0xc3c5, 0xc3c5], /* Hangul Syllable */
- [0xc3c6, 0xc3c6], /* Hangul Syllable */
- [0xc3c7, 0xc3c7], /* Hangul Syllable */
- [0xc3c8, 0xc3c8], /* Hangul Syllable */
- [0xc3c9, 0xc3c9], /* Hangul Syllable */
- [0xc3ca, 0xc3ca], /* Hangul Syllable */
- [0xc3cb, 0xc3cb], /* Hangul Syllable */
- [0xc3cc, 0xc3cc], /* Hangul Syllable */
- [0xc3cd, 0xc3cd], /* Hangul Syllable */
- [0xc3ce, 0xc3ce], /* Hangul Syllable */
- [0xc3cf, 0xc3cf], /* Hangul Syllable */
- [0xc3d0, 0xc3d0], /* Hangul Syllable */
- [0xc3d1, 0xc3d1], /* Hangul Syllable */
- [0xc3d2, 0xc3d2], /* Hangul Syllable */
- [0xc3d3, 0xc3d3], /* Hangul Syllable */
- [0xc3d4, 0xc3d4], /* Hangul Syllable */
- [0xc3d5, 0xc3d5], /* Hangul Syllable */
- [0xc3d6, 0xc3d6], /* Hangul Syllable */
- [0xc3d7, 0xc3d7], /* Hangul Syllable */
- [0xc3d8, 0xc3d8], /* Hangul Syllable */
- [0xc3d9, 0xc3d9], /* Hangul Syllable */
- [0xc3da, 0xc3da], /* Hangul Syllable */
- [0xc3db, 0xc3db], /* Hangul Syllable */
- [0xc3dc, 0xc3dc], /* Hangul Syllable */
- [0xc3dd, 0xc3dd], /* Hangul Syllable */
- [0xc3de, 0xc3de], /* Hangul Syllable */
- [0xc3df, 0xc3df], /* Hangul Syllable */
- [0xc3e0, 0xc3e0], /* Hangul Syllable */
- [0xc3e1, 0xc3e1], /* Hangul Syllable */
- [0xc3e2, 0xc3e2], /* Hangul Syllable */
- [0xc3e3, 0xc3e3], /* Hangul Syllable */
- [0xc3e4, 0xc3e4], /* Hangul Syllable */
- [0xc3e5, 0xc3e5], /* Hangul Syllable */
- [0xc3e6, 0xc3e6], /* Hangul Syllable */
- [0xc3e7, 0xc3e7], /* Hangul Syllable */
- [0xc3e8, 0xc3e8], /* Hangul Syllable */
- [0xc3e9, 0xc3e9], /* Hangul Syllable */
- [0xc3ea, 0xc3ea], /* Hangul Syllable */
- [0xc3eb, 0xc3eb], /* Hangul Syllable */
- [0xc3ec, 0xc3ec], /* Hangul Syllable */
- [0xc3ed, 0xc3ed], /* Hangul Syllable */
- [0xc3ee, 0xc3ee], /* Hangul Syllable */
- [0xc3ef, 0xc3ef], /* Hangul Syllable */
- [0xc3f0, 0xc3f0], /* Hangul Syllable */
- [0xc3f1, 0xc3f1], /* Hangul Syllable */
- [0xc3f2, 0xc3f2], /* Hangul Syllable */
- [0xc3f3, 0xc3f3], /* Hangul Syllable */
- [0xc3f4, 0xc3f4], /* Hangul Syllable */
- [0xc3f5, 0xc3f5], /* Hangul Syllable */
- [0xc3f6, 0xc3f6], /* Hangul Syllable */
- [0xc3f7, 0xc3f7], /* Hangul Syllable */
- [0xc3f8, 0xc3f8], /* Hangul Syllable */
- [0xc3f9, 0xc3f9], /* Hangul Syllable */
- [0xc3fa, 0xc3fa], /* Hangul Syllable */
- [0xc3fb, 0xc3fb], /* Hangul Syllable */
- [0xc3fc, 0xc3fc], /* Hangul Syllable */
- [0xc3fd, 0xc3fd], /* Hangul Syllable */
- [0xc3fe, 0xc3fe], /* Hangul Syllable */
- [0xc3ff, 0xc3ff], /* Hangul Syllable */
- [0xc400, 0xc400], /* Hangul Syllable */
- [0xc401, 0xc401], /* Hangul Syllable */
- [0xc402, 0xc402], /* Hangul Syllable */
- [0xc403, 0xc403], /* Hangul Syllable */
- [0xc404, 0xc404], /* Hangul Syllable */
- [0xc405, 0xc405], /* Hangul Syllable */
- [0xc406, 0xc406], /* Hangul Syllable */
- [0xc407, 0xc407], /* Hangul Syllable */
- [0xc408, 0xc408], /* Hangul Syllable */
- [0xc409, 0xc409], /* Hangul Syllable */
- [0xc40a, 0xc40a], /* Hangul Syllable */
- [0xc40b, 0xc40b], /* Hangul Syllable */
- [0xc40c, 0xc40c], /* Hangul Syllable */
- [0xc40d, 0xc40d], /* Hangul Syllable */
- [0xc40e, 0xc40e], /* Hangul Syllable */
- [0xc40f, 0xc40f], /* Hangul Syllable */
- [0xc410, 0xc410], /* Hangul Syllable */
- [0xc411, 0xc411], /* Hangul Syllable */
- [0xc412, 0xc412], /* Hangul Syllable */
- [0xc413, 0xc413], /* Hangul Syllable */
- [0xc414, 0xc414], /* Hangul Syllable */
- [0xc415, 0xc415], /* Hangul Syllable */
- [0xc416, 0xc416], /* Hangul Syllable */
- [0xc417, 0xc417], /* Hangul Syllable */
- [0xc418, 0xc418], /* Hangul Syllable */
- [0xc419, 0xc419], /* Hangul Syllable */
- [0xc41a, 0xc41a], /* Hangul Syllable */
- [0xc41b, 0xc41b], /* Hangul Syllable */
- [0xc41c, 0xc41c], /* Hangul Syllable */
- [0xc41d, 0xc41d], /* Hangul Syllable */
- [0xc41e, 0xc41e], /* Hangul Syllable */
- [0xc41f, 0xc41f], /* Hangul Syllable */
- [0xc420, 0xc420], /* Hangul Syllable */
- [0xc421, 0xc421], /* Hangul Syllable */
- [0xc422, 0xc422], /* Hangul Syllable */
- [0xc423, 0xc423], /* Hangul Syllable */
- [0xc424, 0xc424], /* Hangul Syllable */
- [0xc425, 0xc425], /* Hangul Syllable */
- [0xc426, 0xc426], /* Hangul Syllable */
- [0xc427, 0xc427], /* Hangul Syllable */
- [0xc428, 0xc428], /* Hangul Syllable */
- [0xc429, 0xc429], /* Hangul Syllable */
- [0xc42a, 0xc42a], /* Hangul Syllable */
- [0xc42b, 0xc42b], /* Hangul Syllable */
- [0xc42c, 0xc42c], /* Hangul Syllable */
- [0xc42d, 0xc42d], /* Hangul Syllable */
- [0xc42e, 0xc42e], /* Hangul Syllable */
- [0xc42f, 0xc42f], /* Hangul Syllable */
- [0xc430, 0xc430], /* Hangul Syllable */
- [0xc431, 0xc431], /* Hangul Syllable */
- [0xc432, 0xc432], /* Hangul Syllable */
- [0xc433, 0xc433], /* Hangul Syllable */
- [0xc434, 0xc434], /* Hangul Syllable */
- [0xc435, 0xc435], /* Hangul Syllable */
- [0xc436, 0xc436], /* Hangul Syllable */
- [0xc437, 0xc437], /* Hangul Syllable */
- [0xc438, 0xc438], /* Hangul Syllable */
- [0xc439, 0xc439], /* Hangul Syllable */
- [0xc43a, 0xc43a], /* Hangul Syllable */
- [0xc43b, 0xc43b], /* Hangul Syllable */
- [0xc43c, 0xc43c], /* Hangul Syllable */
- [0xc43d, 0xc43d], /* Hangul Syllable */
- [0xc43e, 0xc43e], /* Hangul Syllable */
- [0xc43f, 0xc43f], /* Hangul Syllable */
- [0xc440, 0xc440], /* Hangul Syllable */
- [0xc441, 0xc441], /* Hangul Syllable */
- [0xc442, 0xc442], /* Hangul Syllable */
- [0xc443, 0xc443], /* Hangul Syllable */
- [0xc444, 0xc444], /* Hangul Syllable */
- [0xc445, 0xc445], /* Hangul Syllable */
- [0xc446, 0xc446], /* Hangul Syllable */
- [0xc447, 0xc447], /* Hangul Syllable */
- [0xc448, 0xc448], /* Hangul Syllable */
- [0xc449, 0xc449], /* Hangul Syllable */
- [0xc44a, 0xc44a], /* Hangul Syllable */
- [0xc44b, 0xc44b], /* Hangul Syllable */
- [0xc44c, 0xc44c], /* Hangul Syllable */
- [0xc44d, 0xc44d], /* Hangul Syllable */
- [0xc44e, 0xc44e], /* Hangul Syllable */
- [0xc44f, 0xc44f], /* Hangul Syllable */
- [0xc450, 0xc450], /* Hangul Syllable */
- [0xc451, 0xc451], /* Hangul Syllable */
- [0xc452, 0xc452], /* Hangul Syllable */
- [0xc453, 0xc453], /* Hangul Syllable */
- [0xc454, 0xc454], /* Hangul Syllable */
- [0xc455, 0xc455], /* Hangul Syllable */
- [0xc456, 0xc456], /* Hangul Syllable */
- [0xc457, 0xc457], /* Hangul Syllable */
- [0xc458, 0xc458], /* Hangul Syllable */
- [0xc459, 0xc459], /* Hangul Syllable */
- [0xc45a, 0xc45a], /* Hangul Syllable */
- [0xc45b, 0xc45b], /* Hangul Syllable */
- [0xc45c, 0xc45c], /* Hangul Syllable */
- [0xc45d, 0xc45d], /* Hangul Syllable */
- [0xc45e, 0xc45e], /* Hangul Syllable */
- [0xc45f, 0xc45f], /* Hangul Syllable */
- [0xc460, 0xc460], /* Hangul Syllable */
- [0xc461, 0xc461], /* Hangul Syllable */
- [0xc462, 0xc462], /* Hangul Syllable */
- [0xc463, 0xc463], /* Hangul Syllable */
- [0xc464, 0xc464], /* Hangul Syllable */
- [0xc465, 0xc465], /* Hangul Syllable */
- [0xc466, 0xc466], /* Hangul Syllable */
- [0xc467, 0xc467], /* Hangul Syllable */
- [0xc468, 0xc468], /* Hangul Syllable */
- [0xc469, 0xc469], /* Hangul Syllable */
- [0xc46a, 0xc46a], /* Hangul Syllable */
- [0xc46b, 0xc46b], /* Hangul Syllable */
- [0xc46c, 0xc46c], /* Hangul Syllable */
- [0xc46d, 0xc46d], /* Hangul Syllable */
- [0xc46e, 0xc46e], /* Hangul Syllable */
- [0xc46f, 0xc46f], /* Hangul Syllable */
- [0xc470, 0xc470], /* Hangul Syllable */
- [0xc471, 0xc471], /* Hangul Syllable */
- [0xc472, 0xc472], /* Hangul Syllable */
- [0xc473, 0xc473], /* Hangul Syllable */
- [0xc474, 0xc474], /* Hangul Syllable */
- [0xc475, 0xc475], /* Hangul Syllable */
- [0xc476, 0xc476], /* Hangul Syllable */
- [0xc477, 0xc477], /* Hangul Syllable */
- [0xc478, 0xc478], /* Hangul Syllable */
- [0xc479, 0xc479], /* Hangul Syllable */
- [0xc47a, 0xc47a], /* Hangul Syllable */
- [0xc47b, 0xc47b], /* Hangul Syllable */
- [0xc47c, 0xc47c], /* Hangul Syllable */
- [0xc47d, 0xc47d], /* Hangul Syllable */
- [0xc47e, 0xc47e], /* Hangul Syllable */
- [0xc47f, 0xc47f], /* Hangul Syllable */
- [0xc480, 0xc480], /* Hangul Syllable */
- [0xc481, 0xc481], /* Hangul Syllable */
- [0xc482, 0xc482], /* Hangul Syllable */
- [0xc483, 0xc483], /* Hangul Syllable */
- [0xc484, 0xc484], /* Hangul Syllable */
- [0xc485, 0xc485], /* Hangul Syllable */
- [0xc486, 0xc486], /* Hangul Syllable */
- [0xc487, 0xc487], /* Hangul Syllable */
- [0xc488, 0xc488], /* Hangul Syllable */
- [0xc489, 0xc489], /* Hangul Syllable */
- [0xc48a, 0xc48a], /* Hangul Syllable */
- [0xc48b, 0xc48b], /* Hangul Syllable */
- [0xc48c, 0xc48c], /* Hangul Syllable */
- [0xc48d, 0xc48d], /* Hangul Syllable */
- [0xc48e, 0xc48e], /* Hangul Syllable */
- [0xc48f, 0xc48f], /* Hangul Syllable */
- [0xc490, 0xc490], /* Hangul Syllable */
- [0xc491, 0xc491], /* Hangul Syllable */
- [0xc492, 0xc492], /* Hangul Syllable */
- [0xc493, 0xc493], /* Hangul Syllable */
- [0xc494, 0xc494], /* Hangul Syllable */
- [0xc495, 0xc495], /* Hangul Syllable */
- [0xc496, 0xc496], /* Hangul Syllable */
- [0xc497, 0xc497], /* Hangul Syllable */
- [0xc498, 0xc498], /* Hangul Syllable */
- [0xc499, 0xc499], /* Hangul Syllable */
- [0xc49a, 0xc49a], /* Hangul Syllable */
- [0xc49b, 0xc49b], /* Hangul Syllable */
- [0xc49c, 0xc49c], /* Hangul Syllable */
- [0xc49d, 0xc49d], /* Hangul Syllable */
- [0xc49e, 0xc49e], /* Hangul Syllable */
- [0xc49f, 0xc49f], /* Hangul Syllable */
- [0xc4a0, 0xc4a0], /* Hangul Syllable */
- [0xc4a1, 0xc4a1], /* Hangul Syllable */
- [0xc4a2, 0xc4a2], /* Hangul Syllable */
- [0xc4a3, 0xc4a3], /* Hangul Syllable */
- [0xc4a4, 0xc4a4], /* Hangul Syllable */
- [0xc4a5, 0xc4a5], /* Hangul Syllable */
- [0xc4a6, 0xc4a6], /* Hangul Syllable */
- [0xc4a7, 0xc4a7], /* Hangul Syllable */
- [0xc4a8, 0xc4a8], /* Hangul Syllable */
- [0xc4a9, 0xc4a9], /* Hangul Syllable */
- [0xc4aa, 0xc4aa], /* Hangul Syllable */
- [0xc4ab, 0xc4ab], /* Hangul Syllable */
- [0xc4ac, 0xc4ac], /* Hangul Syllable */
- [0xc4ad, 0xc4ad], /* Hangul Syllable */
- [0xc4ae, 0xc4ae], /* Hangul Syllable */
- [0xc4af, 0xc4af], /* Hangul Syllable */
- [0xc4b0, 0xc4b0], /* Hangul Syllable */
- [0xc4b1, 0xc4b1], /* Hangul Syllable */
- [0xc4b2, 0xc4b2], /* Hangul Syllable */
- [0xc4b3, 0xc4b3], /* Hangul Syllable */
- [0xc4b4, 0xc4b4], /* Hangul Syllable */
- [0xc4b5, 0xc4b5], /* Hangul Syllable */
- [0xc4b6, 0xc4b6], /* Hangul Syllable */
- [0xc4b7, 0xc4b7], /* Hangul Syllable */
- [0xc4b8, 0xc4b8], /* Hangul Syllable */
- [0xc4b9, 0xc4b9], /* Hangul Syllable */
- [0xc4ba, 0xc4ba], /* Hangul Syllable */
- [0xc4bb, 0xc4bb], /* Hangul Syllable */
- [0xc4bc, 0xc4bc], /* Hangul Syllable */
- [0xc4bd, 0xc4bd], /* Hangul Syllable */
- [0xc4be, 0xc4be], /* Hangul Syllable */
- [0xc4bf, 0xc4bf], /* Hangul Syllable */
- [0xc4c0, 0xc4c0], /* Hangul Syllable */
- [0xc4c1, 0xc4c1], /* Hangul Syllable */
- [0xc4c2, 0xc4c2], /* Hangul Syllable */
- [0xc4c3, 0xc4c3], /* Hangul Syllable */
- [0xc4c4, 0xc4c4], /* Hangul Syllable */
- [0xc4c5, 0xc4c5], /* Hangul Syllable */
- [0xc4c6, 0xc4c6], /* Hangul Syllable */
- [0xc4c7, 0xc4c7], /* Hangul Syllable */
- [0xc4c8, 0xc4c8], /* Hangul Syllable */
- [0xc4c9, 0xc4c9], /* Hangul Syllable */
- [0xc4ca, 0xc4ca], /* Hangul Syllable */
- [0xc4cb, 0xc4cb], /* Hangul Syllable */
- [0xc4cc, 0xc4cc], /* Hangul Syllable */
- [0xc4cd, 0xc4cd], /* Hangul Syllable */
- [0xc4ce, 0xc4ce], /* Hangul Syllable */
- [0xc4cf, 0xc4cf], /* Hangul Syllable */
- [0xc4d0, 0xc4d0], /* Hangul Syllable */
- [0xc4d1, 0xc4d1], /* Hangul Syllable */
- [0xc4d2, 0xc4d2], /* Hangul Syllable */
- [0xc4d3, 0xc4d3], /* Hangul Syllable */
- [0xc4d4, 0xc4d4], /* Hangul Syllable */
- [0xc4d5, 0xc4d5], /* Hangul Syllable */
- [0xc4d6, 0xc4d6], /* Hangul Syllable */
- [0xc4d7, 0xc4d7], /* Hangul Syllable */
- [0xc4d8, 0xc4d8], /* Hangul Syllable */
- [0xc4d9, 0xc4d9], /* Hangul Syllable */
- [0xc4da, 0xc4da], /* Hangul Syllable */
- [0xc4db, 0xc4db], /* Hangul Syllable */
- [0xc4dc, 0xc4dc], /* Hangul Syllable */
- [0xc4dd, 0xc4dd], /* Hangul Syllable */
- [0xc4de, 0xc4de], /* Hangul Syllable */
- [0xc4df, 0xc4df], /* Hangul Syllable */
- [0xc4e0, 0xc4e0], /* Hangul Syllable */
- [0xc4e1, 0xc4e1], /* Hangul Syllable */
- [0xc4e2, 0xc4e2], /* Hangul Syllable */
- [0xc4e3, 0xc4e3], /* Hangul Syllable */
- [0xc4e4, 0xc4e4], /* Hangul Syllable */
- [0xc4e5, 0xc4e5], /* Hangul Syllable */
- [0xc4e6, 0xc4e6], /* Hangul Syllable */
- [0xc4e7, 0xc4e7], /* Hangul Syllable */
- [0xc4e8, 0xc4e8], /* Hangul Syllable */
- [0xc4e9, 0xc4e9], /* Hangul Syllable */
- [0xc4ea, 0xc4ea], /* Hangul Syllable */
- [0xc4eb, 0xc4eb], /* Hangul Syllable */
- [0xc4ec, 0xc4ec], /* Hangul Syllable */
- [0xc4ed, 0xc4ed], /* Hangul Syllable */
- [0xc4ee, 0xc4ee], /* Hangul Syllable */
- [0xc4ef, 0xc4ef], /* Hangul Syllable */
- [0xc4f0, 0xc4f0], /* Hangul Syllable */
- [0xc4f1, 0xc4f1], /* Hangul Syllable */
- [0xc4f2, 0xc4f2], /* Hangul Syllable */
- [0xc4f3, 0xc4f3], /* Hangul Syllable */
- [0xc4f4, 0xc4f4], /* Hangul Syllable */
- [0xc4f5, 0xc4f5], /* Hangul Syllable */
- [0xc4f6, 0xc4f6], /* Hangul Syllable */
- [0xc4f7, 0xc4f7], /* Hangul Syllable */
- [0xc4f8, 0xc4f8], /* Hangul Syllable */
- [0xc4f9, 0xc4f9], /* Hangul Syllable */
- [0xc4fa, 0xc4fa], /* Hangul Syllable */
- [0xc4fb, 0xc4fb], /* Hangul Syllable */
- [0xc4fc, 0xc4fc], /* Hangul Syllable */
- [0xc4fd, 0xc4fd], /* Hangul Syllable */
- [0xc4fe, 0xc4fe], /* Hangul Syllable */
- [0xc4ff, 0xc4ff], /* Hangul Syllable */
- [0xc500, 0xc500], /* Hangul Syllable */
- [0xc501, 0xc501], /* Hangul Syllable */
- [0xc502, 0xc502], /* Hangul Syllable */
- [0xc503, 0xc503], /* Hangul Syllable */
- [0xc504, 0xc504], /* Hangul Syllable */
- [0xc505, 0xc505], /* Hangul Syllable */
- [0xc506, 0xc506], /* Hangul Syllable */
- [0xc507, 0xc507], /* Hangul Syllable */
- [0xc508, 0xc508], /* Hangul Syllable */
- [0xc509, 0xc509], /* Hangul Syllable */
- [0xc50a, 0xc50a], /* Hangul Syllable */
- [0xc50b, 0xc50b], /* Hangul Syllable */
- [0xc50c, 0xc50c], /* Hangul Syllable */
- [0xc50d, 0xc50d], /* Hangul Syllable */
- [0xc50e, 0xc50e], /* Hangul Syllable */
- [0xc50f, 0xc50f], /* Hangul Syllable */
- [0xc510, 0xc510], /* Hangul Syllable */
- [0xc511, 0xc511], /* Hangul Syllable */
- [0xc512, 0xc512], /* Hangul Syllable */
- [0xc513, 0xc513], /* Hangul Syllable */
- [0xc514, 0xc514], /* Hangul Syllable */
- [0xc515, 0xc515], /* Hangul Syllable */
- [0xc516, 0xc516], /* Hangul Syllable */
- [0xc517, 0xc517], /* Hangul Syllable */
- [0xc518, 0xc518], /* Hangul Syllable */
- [0xc519, 0xc519], /* Hangul Syllable */
- [0xc51a, 0xc51a], /* Hangul Syllable */
- [0xc51b, 0xc51b], /* Hangul Syllable */
- [0xc51c, 0xc51c], /* Hangul Syllable */
- [0xc51d, 0xc51d], /* Hangul Syllable */
- [0xc51e, 0xc51e], /* Hangul Syllable */
- [0xc51f, 0xc51f], /* Hangul Syllable */
- [0xc520, 0xc520], /* Hangul Syllable */
- [0xc521, 0xc521], /* Hangul Syllable */
- [0xc522, 0xc522], /* Hangul Syllable */
- [0xc523, 0xc523], /* Hangul Syllable */
- [0xc524, 0xc524], /* Hangul Syllable */
- [0xc525, 0xc525], /* Hangul Syllable */
- [0xc526, 0xc526], /* Hangul Syllable */
- [0xc527, 0xc527], /* Hangul Syllable */
- [0xc528, 0xc528], /* Hangul Syllable */
- [0xc529, 0xc529], /* Hangul Syllable */
- [0xc52a, 0xc52a], /* Hangul Syllable */
- [0xc52b, 0xc52b], /* Hangul Syllable */
- [0xc52c, 0xc52c], /* Hangul Syllable */
- [0xc52d, 0xc52d], /* Hangul Syllable */
- [0xc52e, 0xc52e], /* Hangul Syllable */
- [0xc52f, 0xc52f], /* Hangul Syllable */
- [0xc530, 0xc530], /* Hangul Syllable */
- [0xc531, 0xc531], /* Hangul Syllable */
- [0xc532, 0xc532], /* Hangul Syllable */
- [0xc533, 0xc533], /* Hangul Syllable */
- [0xc534, 0xc534], /* Hangul Syllable */
- [0xc535, 0xc535], /* Hangul Syllable */
- [0xc536, 0xc536], /* Hangul Syllable */
- [0xc537, 0xc537], /* Hangul Syllable */
- [0xc538, 0xc538], /* Hangul Syllable */
- [0xc539, 0xc539], /* Hangul Syllable */
- [0xc53a, 0xc53a], /* Hangul Syllable */
- [0xc53b, 0xc53b], /* Hangul Syllable */
- [0xc53c, 0xc53c], /* Hangul Syllable */
- [0xc53d, 0xc53d], /* Hangul Syllable */
- [0xc53e, 0xc53e], /* Hangul Syllable */
- [0xc53f, 0xc53f], /* Hangul Syllable */
- [0xc540, 0xc540], /* Hangul Syllable */
- [0xc541, 0xc541], /* Hangul Syllable */
- [0xc542, 0xc542], /* Hangul Syllable */
- [0xc543, 0xc543], /* Hangul Syllable */
- [0xc544, 0xc544], /* Hangul Syllable */
- [0xc545, 0xc545], /* Hangul Syllable */
- [0xc546, 0xc546], /* Hangul Syllable */
- [0xc547, 0xc547], /* Hangul Syllable */
- [0xc548, 0xc548], /* Hangul Syllable */
- [0xc549, 0xc549], /* Hangul Syllable */
- [0xc54a, 0xc54a], /* Hangul Syllable */
- [0xc54b, 0xc54b], /* Hangul Syllable */
- [0xc54c, 0xc54c], /* Hangul Syllable */
- [0xc54d, 0xc54d], /* Hangul Syllable */
- [0xc54e, 0xc54e], /* Hangul Syllable */
- [0xc54f, 0xc54f], /* Hangul Syllable */
- [0xc550, 0xc550], /* Hangul Syllable */
- [0xc551, 0xc551], /* Hangul Syllable */
- [0xc552, 0xc552], /* Hangul Syllable */
- [0xc553, 0xc553], /* Hangul Syllable */
- [0xc554, 0xc554], /* Hangul Syllable */
- [0xc555, 0xc555], /* Hangul Syllable */
- [0xc556, 0xc556], /* Hangul Syllable */
- [0xc557, 0xc557], /* Hangul Syllable */
- [0xc558, 0xc558], /* Hangul Syllable */
- [0xc559, 0xc559], /* Hangul Syllable */
- [0xc55a, 0xc55a], /* Hangul Syllable */
- [0xc55b, 0xc55b], /* Hangul Syllable */
- [0xc55c, 0xc55c], /* Hangul Syllable */
- [0xc55d, 0xc55d], /* Hangul Syllable */
- [0xc55e, 0xc55e], /* Hangul Syllable */
- [0xc55f, 0xc55f], /* Hangul Syllable */
- [0xc560, 0xc560], /* Hangul Syllable */
- [0xc561, 0xc561], /* Hangul Syllable */
- [0xc562, 0xc562], /* Hangul Syllable */
- [0xc563, 0xc563], /* Hangul Syllable */
- [0xc564, 0xc564], /* Hangul Syllable */
- [0xc565, 0xc565], /* Hangul Syllable */
- [0xc566, 0xc566], /* Hangul Syllable */
- [0xc567, 0xc567], /* Hangul Syllable */
- [0xc568, 0xc568], /* Hangul Syllable */
- [0xc569, 0xc569], /* Hangul Syllable */
- [0xc56a, 0xc56a], /* Hangul Syllable */
- [0xc56b, 0xc56b], /* Hangul Syllable */
- [0xc56c, 0xc56c], /* Hangul Syllable */
- [0xc56d, 0xc56d], /* Hangul Syllable */
- [0xc56e, 0xc56e], /* Hangul Syllable */
- [0xc56f, 0xc56f], /* Hangul Syllable */
- [0xc570, 0xc570], /* Hangul Syllable */
- [0xc571, 0xc571], /* Hangul Syllable */
- [0xc572, 0xc572], /* Hangul Syllable */
- [0xc573, 0xc573], /* Hangul Syllable */
- [0xc574, 0xc574], /* Hangul Syllable */
- [0xc575, 0xc575], /* Hangul Syllable */
- [0xc576, 0xc576], /* Hangul Syllable */
- [0xc577, 0xc577], /* Hangul Syllable */
- [0xc578, 0xc578], /* Hangul Syllable */
- [0xc579, 0xc579], /* Hangul Syllable */
- [0xc57a, 0xc57a], /* Hangul Syllable */
- [0xc57b, 0xc57b], /* Hangul Syllable */
- [0xc57c, 0xc57c], /* Hangul Syllable */
- [0xc57d, 0xc57d], /* Hangul Syllable */
- [0xc57e, 0xc57e], /* Hangul Syllable */
- [0xc57f, 0xc57f], /* Hangul Syllable */
- [0xc580, 0xc580], /* Hangul Syllable */
- [0xc581, 0xc581], /* Hangul Syllable */
- [0xc582, 0xc582], /* Hangul Syllable */
- [0xc583, 0xc583], /* Hangul Syllable */
- [0xc584, 0xc584], /* Hangul Syllable */
- [0xc585, 0xc585], /* Hangul Syllable */
- [0xc586, 0xc586], /* Hangul Syllable */
- [0xc587, 0xc587], /* Hangul Syllable */
- [0xc588, 0xc588], /* Hangul Syllable */
- [0xc589, 0xc589], /* Hangul Syllable */
- [0xc58a, 0xc58a], /* Hangul Syllable */
- [0xc58b, 0xc58b], /* Hangul Syllable */
- [0xc58c, 0xc58c], /* Hangul Syllable */
- [0xc58d, 0xc58d], /* Hangul Syllable */
- [0xc58e, 0xc58e], /* Hangul Syllable */
- [0xc58f, 0xc58f], /* Hangul Syllable */
- [0xc590, 0xc590], /* Hangul Syllable */
- [0xc591, 0xc591], /* Hangul Syllable */
- [0xc592, 0xc592], /* Hangul Syllable */
- [0xc593, 0xc593], /* Hangul Syllable */
- [0xc594, 0xc594], /* Hangul Syllable */
- [0xc595, 0xc595], /* Hangul Syllable */
- [0xc596, 0xc596], /* Hangul Syllable */
- [0xc597, 0xc597], /* Hangul Syllable */
- [0xc598, 0xc598], /* Hangul Syllable */
- [0xc599, 0xc599], /* Hangul Syllable */
- [0xc59a, 0xc59a], /* Hangul Syllable */
- [0xc59b, 0xc59b], /* Hangul Syllable */
- [0xc59c, 0xc59c], /* Hangul Syllable */
- [0xc59d, 0xc59d], /* Hangul Syllable */
- [0xc59e, 0xc59e], /* Hangul Syllable */
- [0xc59f, 0xc59f], /* Hangul Syllable */
- [0xc5a0, 0xc5a0], /* Hangul Syllable */
- [0xc5a1, 0xc5a1], /* Hangul Syllable */
- [0xc5a2, 0xc5a2], /* Hangul Syllable */
- [0xc5a3, 0xc5a3], /* Hangul Syllable */
- [0xc5a4, 0xc5a4], /* Hangul Syllable */
- [0xc5a5, 0xc5a5], /* Hangul Syllable */
- [0xc5a6, 0xc5a6], /* Hangul Syllable */
- [0xc5a7, 0xc5a7], /* Hangul Syllable */
- [0xc5a8, 0xc5a8], /* Hangul Syllable */
- [0xc5a9, 0xc5a9], /* Hangul Syllable */
- [0xc5aa, 0xc5aa], /* Hangul Syllable */
- [0xc5ab, 0xc5ab], /* Hangul Syllable */
- [0xc5ac, 0xc5ac], /* Hangul Syllable */
- [0xc5ad, 0xc5ad], /* Hangul Syllable */
- [0xc5ae, 0xc5ae], /* Hangul Syllable */
- [0xc5af, 0xc5af], /* Hangul Syllable */
- [0xc5b0, 0xc5b0], /* Hangul Syllable */
- [0xc5b1, 0xc5b1], /* Hangul Syllable */
- [0xc5b2, 0xc5b2], /* Hangul Syllable */
- [0xc5b3, 0xc5b3], /* Hangul Syllable */
- [0xc5b4, 0xc5b4], /* Hangul Syllable */
- [0xc5b5, 0xc5b5], /* Hangul Syllable */
- [0xc5b6, 0xc5b6], /* Hangul Syllable */
- [0xc5b7, 0xc5b7], /* Hangul Syllable */
- [0xc5b8, 0xc5b8], /* Hangul Syllable */
- [0xc5b9, 0xc5b9], /* Hangul Syllable */
- [0xc5ba, 0xc5ba], /* Hangul Syllable */
- [0xc5bb, 0xc5bb], /* Hangul Syllable */
- [0xc5bc, 0xc5bc], /* Hangul Syllable */
- [0xc5bd, 0xc5bd], /* Hangul Syllable */
- [0xc5be, 0xc5be], /* Hangul Syllable */
- [0xc5bf, 0xc5bf], /* Hangul Syllable */
- [0xc5c0, 0xc5c0], /* Hangul Syllable */
- [0xc5c1, 0xc5c1], /* Hangul Syllable */
- [0xc5c2, 0xc5c2], /* Hangul Syllable */
- [0xc5c3, 0xc5c3], /* Hangul Syllable */
- [0xc5c4, 0xc5c4], /* Hangul Syllable */
- [0xc5c5, 0xc5c5], /* Hangul Syllable */
- [0xc5c6, 0xc5c6], /* Hangul Syllable */
- [0xc5c7, 0xc5c7], /* Hangul Syllable */
- [0xc5c8, 0xc5c8], /* Hangul Syllable */
- [0xc5c9, 0xc5c9], /* Hangul Syllable */
- [0xc5ca, 0xc5ca], /* Hangul Syllable */
- [0xc5cb, 0xc5cb], /* Hangul Syllable */
- [0xc5cc, 0xc5cc], /* Hangul Syllable */
- [0xc5cd, 0xc5cd], /* Hangul Syllable */
- [0xc5ce, 0xc5ce], /* Hangul Syllable */
- [0xc5cf, 0xc5cf], /* Hangul Syllable */
- [0xc5d0, 0xc5d0], /* Hangul Syllable */
- [0xc5d1, 0xc5d1], /* Hangul Syllable */
- [0xc5d2, 0xc5d2], /* Hangul Syllable */
- [0xc5d3, 0xc5d3], /* Hangul Syllable */
- [0xc5d4, 0xc5d4], /* Hangul Syllable */
- [0xc5d5, 0xc5d5], /* Hangul Syllable */
- [0xc5d6, 0xc5d6], /* Hangul Syllable */
- [0xc5d7, 0xc5d7], /* Hangul Syllable */
- [0xc5d8, 0xc5d8], /* Hangul Syllable */
- [0xc5d9, 0xc5d9], /* Hangul Syllable */
- [0xc5da, 0xc5da], /* Hangul Syllable */
- [0xc5db, 0xc5db], /* Hangul Syllable */
- [0xc5dc, 0xc5dc], /* Hangul Syllable */
- [0xc5dd, 0xc5dd], /* Hangul Syllable */
- [0xc5de, 0xc5de], /* Hangul Syllable */
- [0xc5df, 0xc5df], /* Hangul Syllable */
- [0xc5e0, 0xc5e0], /* Hangul Syllable */
- [0xc5e1, 0xc5e1], /* Hangul Syllable */
- [0xc5e2, 0xc5e2], /* Hangul Syllable */
- [0xc5e3, 0xc5e3], /* Hangul Syllable */
- [0xc5e4, 0xc5e4], /* Hangul Syllable */
- [0xc5e5, 0xc5e5], /* Hangul Syllable */
- [0xc5e6, 0xc5e6], /* Hangul Syllable */
- [0xc5e7, 0xc5e7], /* Hangul Syllable */
- [0xc5e8, 0xc5e8], /* Hangul Syllable */
- [0xc5e9, 0xc5e9], /* Hangul Syllable */
- [0xc5ea, 0xc5ea], /* Hangul Syllable */
- [0xc5eb, 0xc5eb], /* Hangul Syllable */
- [0xc5ec, 0xc5ec], /* Hangul Syllable */
- [0xc5ed, 0xc5ed], /* Hangul Syllable */
- [0xc5ee, 0xc5ee], /* Hangul Syllable */
- [0xc5ef, 0xc5ef], /* Hangul Syllable */
- [0xc5f0, 0xc5f0], /* Hangul Syllable */
- [0xc5f1, 0xc5f1], /* Hangul Syllable */
- [0xc5f2, 0xc5f2], /* Hangul Syllable */
- [0xc5f3, 0xc5f3], /* Hangul Syllable */
- [0xc5f4, 0xc5f4], /* Hangul Syllable */
- [0xc5f5, 0xc5f5], /* Hangul Syllable */
- [0xc5f6, 0xc5f6], /* Hangul Syllable */
- [0xc5f7, 0xc5f7], /* Hangul Syllable */
- [0xc5f8, 0xc5f8], /* Hangul Syllable */
- [0xc5f9, 0xc5f9], /* Hangul Syllable */
- [0xc5fa, 0xc5fa], /* Hangul Syllable */
- [0xc5fb, 0xc5fb], /* Hangul Syllable */
- [0xc5fc, 0xc5fc], /* Hangul Syllable */
- [0xc5fd, 0xc5fd], /* Hangul Syllable */
- [0xc5fe, 0xc5fe], /* Hangul Syllable */
- [0xc5ff, 0xc5ff], /* Hangul Syllable */
- [0xc600, 0xc600], /* Hangul Syllable */
- [0xc601, 0xc601], /* Hangul Syllable */
- [0xc602, 0xc602], /* Hangul Syllable */
- [0xc603, 0xc603], /* Hangul Syllable */
- [0xc604, 0xc604], /* Hangul Syllable */
- [0xc605, 0xc605], /* Hangul Syllable */
- [0xc606, 0xc606], /* Hangul Syllable */
- [0xc607, 0xc607], /* Hangul Syllable */
- [0xc608, 0xc608], /* Hangul Syllable */
- [0xc609, 0xc609], /* Hangul Syllable */
- [0xc60a, 0xc60a], /* Hangul Syllable */
- [0xc60b, 0xc60b], /* Hangul Syllable */
- [0xc60c, 0xc60c], /* Hangul Syllable */
- [0xc60d, 0xc60d], /* Hangul Syllable */
- [0xc60e, 0xc60e], /* Hangul Syllable */
- [0xc60f, 0xc60f], /* Hangul Syllable */
- [0xc610, 0xc610], /* Hangul Syllable */
- [0xc611, 0xc611], /* Hangul Syllable */
- [0xc612, 0xc612], /* Hangul Syllable */
- [0xc613, 0xc613], /* Hangul Syllable */
- [0xc614, 0xc614], /* Hangul Syllable */
- [0xc615, 0xc615], /* Hangul Syllable */
- [0xc616, 0xc616], /* Hangul Syllable */
- [0xc617, 0xc617], /* Hangul Syllable */
- [0xc618, 0xc618], /* Hangul Syllable */
- [0xc619, 0xc619], /* Hangul Syllable */
- [0xc61a, 0xc61a], /* Hangul Syllable */
- [0xc61b, 0xc61b], /* Hangul Syllable */
- [0xc61c, 0xc61c], /* Hangul Syllable */
- [0xc61d, 0xc61d], /* Hangul Syllable */
- [0xc61e, 0xc61e], /* Hangul Syllable */
- [0xc61f, 0xc61f], /* Hangul Syllable */
- [0xc620, 0xc620], /* Hangul Syllable */
- [0xc621, 0xc621], /* Hangul Syllable */
- [0xc622, 0xc622], /* Hangul Syllable */
- [0xc623, 0xc623], /* Hangul Syllable */
- [0xc624, 0xc624], /* Hangul Syllable */
- [0xc625, 0xc625], /* Hangul Syllable */
- [0xc626, 0xc626], /* Hangul Syllable */
- [0xc627, 0xc627], /* Hangul Syllable */
- [0xc628, 0xc628], /* Hangul Syllable */
- [0xc629, 0xc629], /* Hangul Syllable */
- [0xc62a, 0xc62a], /* Hangul Syllable */
- [0xc62b, 0xc62b], /* Hangul Syllable */
- [0xc62c, 0xc62c], /* Hangul Syllable */
- [0xc62d, 0xc62d], /* Hangul Syllable */
- [0xc62e, 0xc62e], /* Hangul Syllable */
- [0xc62f, 0xc62f], /* Hangul Syllable */
- [0xc630, 0xc630], /* Hangul Syllable */
- [0xc631, 0xc631], /* Hangul Syllable */
- [0xc632, 0xc632], /* Hangul Syllable */
- [0xc633, 0xc633], /* Hangul Syllable */
- [0xc634, 0xc634], /* Hangul Syllable */
- [0xc635, 0xc635], /* Hangul Syllable */
- [0xc636, 0xc636], /* Hangul Syllable */
- [0xc637, 0xc637], /* Hangul Syllable */
- [0xc638, 0xc638], /* Hangul Syllable */
- [0xc639, 0xc639], /* Hangul Syllable */
- [0xc63a, 0xc63a], /* Hangul Syllable */
- [0xc63b, 0xc63b], /* Hangul Syllable */
- [0xc63c, 0xc63c], /* Hangul Syllable */
- [0xc63d, 0xc63d], /* Hangul Syllable */
- [0xc63e, 0xc63e], /* Hangul Syllable */
- [0xc63f, 0xc63f], /* Hangul Syllable */
- [0xc640, 0xc640], /* Hangul Syllable */
- [0xc641, 0xc641], /* Hangul Syllable */
- [0xc642, 0xc642], /* Hangul Syllable */
- [0xc643, 0xc643], /* Hangul Syllable */
- [0xc644, 0xc644], /* Hangul Syllable */
- [0xc645, 0xc645], /* Hangul Syllable */
- [0xc646, 0xc646], /* Hangul Syllable */
- [0xc647, 0xc647], /* Hangul Syllable */
- [0xc648, 0xc648], /* Hangul Syllable */
- [0xc649, 0xc649], /* Hangul Syllable */
- [0xc64a, 0xc64a], /* Hangul Syllable */
- [0xc64b, 0xc64b], /* Hangul Syllable */
- [0xc64c, 0xc64c], /* Hangul Syllable */
- [0xc64d, 0xc64d], /* Hangul Syllable */
- [0xc64e, 0xc64e], /* Hangul Syllable */
- [0xc64f, 0xc64f], /* Hangul Syllable */
- [0xc650, 0xc650], /* Hangul Syllable */
- [0xc651, 0xc651], /* Hangul Syllable */
- [0xc652, 0xc652], /* Hangul Syllable */
- [0xc653, 0xc653], /* Hangul Syllable */
- [0xc654, 0xc654], /* Hangul Syllable */
- [0xc655, 0xc655], /* Hangul Syllable */
- [0xc656, 0xc656], /* Hangul Syllable */
- [0xc657, 0xc657], /* Hangul Syllable */
- [0xc658, 0xc658], /* Hangul Syllable */
- [0xc659, 0xc659], /* Hangul Syllable */
- [0xc65a, 0xc65a], /* Hangul Syllable */
- [0xc65b, 0xc65b], /* Hangul Syllable */
- [0xc65c, 0xc65c], /* Hangul Syllable */
- [0xc65d, 0xc65d], /* Hangul Syllable */
- [0xc65e, 0xc65e], /* Hangul Syllable */
- [0xc65f, 0xc65f], /* Hangul Syllable */
- [0xc660, 0xc660], /* Hangul Syllable */
- [0xc661, 0xc661], /* Hangul Syllable */
- [0xc662, 0xc662], /* Hangul Syllable */
- [0xc663, 0xc663], /* Hangul Syllable */
- [0xc664, 0xc664], /* Hangul Syllable */
- [0xc665, 0xc665], /* Hangul Syllable */
- [0xc666, 0xc666], /* Hangul Syllable */
- [0xc667, 0xc667], /* Hangul Syllable */
- [0xc668, 0xc668], /* Hangul Syllable */
- [0xc669, 0xc669], /* Hangul Syllable */
- [0xc66a, 0xc66a], /* Hangul Syllable */
- [0xc66b, 0xc66b], /* Hangul Syllable */
- [0xc66c, 0xc66c], /* Hangul Syllable */
- [0xc66d, 0xc66d], /* Hangul Syllable */
- [0xc66e, 0xc66e], /* Hangul Syllable */
- [0xc66f, 0xc66f], /* Hangul Syllable */
- [0xc670, 0xc670], /* Hangul Syllable */
- [0xc671, 0xc671], /* Hangul Syllable */
- [0xc672, 0xc672], /* Hangul Syllable */
- [0xc673, 0xc673], /* Hangul Syllable */
- [0xc674, 0xc674], /* Hangul Syllable */
- [0xc675, 0xc675], /* Hangul Syllable */
- [0xc676, 0xc676], /* Hangul Syllable */
- [0xc677, 0xc677], /* Hangul Syllable */
- [0xc678, 0xc678], /* Hangul Syllable */
- [0xc679, 0xc679], /* Hangul Syllable */
- [0xc67a, 0xc67a], /* Hangul Syllable */
- [0xc67b, 0xc67b], /* Hangul Syllable */
- [0xc67c, 0xc67c], /* Hangul Syllable */
- [0xc67d, 0xc67d], /* Hangul Syllable */
- [0xc67e, 0xc67e], /* Hangul Syllable */
- [0xc67f, 0xc67f], /* Hangul Syllable */
- [0xc680, 0xc680], /* Hangul Syllable */
- [0xc681, 0xc681], /* Hangul Syllable */
- [0xc682, 0xc682], /* Hangul Syllable */
- [0xc683, 0xc683], /* Hangul Syllable */
- [0xc684, 0xc684], /* Hangul Syllable */
- [0xc685, 0xc685], /* Hangul Syllable */
- [0xc686, 0xc686], /* Hangul Syllable */
- [0xc687, 0xc687], /* Hangul Syllable */
- [0xc688, 0xc688], /* Hangul Syllable */
- [0xc689, 0xc689], /* Hangul Syllable */
- [0xc68a, 0xc68a], /* Hangul Syllable */
- [0xc68b, 0xc68b], /* Hangul Syllable */
- [0xc68c, 0xc68c], /* Hangul Syllable */
- [0xc68d, 0xc68d], /* Hangul Syllable */
- [0xc68e, 0xc68e], /* Hangul Syllable */
- [0xc68f, 0xc68f], /* Hangul Syllable */
- [0xc690, 0xc690], /* Hangul Syllable */
- [0xc691, 0xc691], /* Hangul Syllable */
- [0xc692, 0xc692], /* Hangul Syllable */
- [0xc693, 0xc693], /* Hangul Syllable */
- [0xc694, 0xc694], /* Hangul Syllable */
- [0xc695, 0xc695], /* Hangul Syllable */
- [0xc696, 0xc696], /* Hangul Syllable */
- [0xc697, 0xc697], /* Hangul Syllable */
- [0xc698, 0xc698], /* Hangul Syllable */
- [0xc699, 0xc699], /* Hangul Syllable */
- [0xc69a, 0xc69a], /* Hangul Syllable */
- [0xc69b, 0xc69b], /* Hangul Syllable */
- [0xc69c, 0xc69c], /* Hangul Syllable */
- [0xc69d, 0xc69d], /* Hangul Syllable */
- [0xc69e, 0xc69e], /* Hangul Syllable */
- [0xc69f, 0xc69f], /* Hangul Syllable */
- [0xc6a0, 0xc6a0], /* Hangul Syllable */
- [0xc6a1, 0xc6a1], /* Hangul Syllable */
- [0xc6a2, 0xc6a2], /* Hangul Syllable */
- [0xc6a3, 0xc6a3], /* Hangul Syllable */
- [0xc6a4, 0xc6a4], /* Hangul Syllable */
- [0xc6a5, 0xc6a5], /* Hangul Syllable */
- [0xc6a6, 0xc6a6], /* Hangul Syllable */
- [0xc6a7, 0xc6a7], /* Hangul Syllable */
- [0xc6a8, 0xc6a8], /* Hangul Syllable */
- [0xc6a9, 0xc6a9], /* Hangul Syllable */
- [0xc6aa, 0xc6aa], /* Hangul Syllable */
- [0xc6ab, 0xc6ab], /* Hangul Syllable */
- [0xc6ac, 0xc6ac], /* Hangul Syllable */
- [0xc6ad, 0xc6ad], /* Hangul Syllable */
- [0xc6ae, 0xc6ae], /* Hangul Syllable */
- [0xc6af, 0xc6af], /* Hangul Syllable */
- [0xc6b0, 0xc6b0], /* Hangul Syllable */
- [0xc6b1, 0xc6b1], /* Hangul Syllable */
- [0xc6b2, 0xc6b2], /* Hangul Syllable */
- [0xc6b3, 0xc6b3], /* Hangul Syllable */
- [0xc6b4, 0xc6b4], /* Hangul Syllable */
- [0xc6b5, 0xc6b5], /* Hangul Syllable */
- [0xc6b6, 0xc6b6], /* Hangul Syllable */
- [0xc6b7, 0xc6b7], /* Hangul Syllable */
- [0xc6b8, 0xc6b8], /* Hangul Syllable */
- [0xc6b9, 0xc6b9], /* Hangul Syllable */
- [0xc6ba, 0xc6ba], /* Hangul Syllable */
- [0xc6bb, 0xc6bb], /* Hangul Syllable */
- [0xc6bc, 0xc6bc], /* Hangul Syllable */
- [0xc6bd, 0xc6bd], /* Hangul Syllable */
- [0xc6be, 0xc6be], /* Hangul Syllable */
- [0xc6bf, 0xc6bf], /* Hangul Syllable */
- [0xc6c0, 0xc6c0], /* Hangul Syllable */
- [0xc6c1, 0xc6c1], /* Hangul Syllable */
- [0xc6c2, 0xc6c2], /* Hangul Syllable */
- [0xc6c3, 0xc6c3], /* Hangul Syllable */
- [0xc6c4, 0xc6c4], /* Hangul Syllable */
- [0xc6c5, 0xc6c5], /* Hangul Syllable */
- [0xc6c6, 0xc6c6], /* Hangul Syllable */
- [0xc6c7, 0xc6c7], /* Hangul Syllable */
- [0xc6c8, 0xc6c8], /* Hangul Syllable */
- [0xc6c9, 0xc6c9], /* Hangul Syllable */
- [0xc6ca, 0xc6ca], /* Hangul Syllable */
- [0xc6cb, 0xc6cb], /* Hangul Syllable */
- [0xc6cc, 0xc6cc], /* Hangul Syllable */
- [0xc6cd, 0xc6cd], /* Hangul Syllable */
- [0xc6ce, 0xc6ce], /* Hangul Syllable */
- [0xc6cf, 0xc6cf], /* Hangul Syllable */
- [0xc6d0, 0xc6d0], /* Hangul Syllable */
- [0xc6d1, 0xc6d1], /* Hangul Syllable */
- [0xc6d2, 0xc6d2], /* Hangul Syllable */
- [0xc6d3, 0xc6d3], /* Hangul Syllable */
- [0xc6d4, 0xc6d4], /* Hangul Syllable */
- [0xc6d5, 0xc6d5], /* Hangul Syllable */
- [0xc6d6, 0xc6d6], /* Hangul Syllable */
- [0xc6d7, 0xc6d7], /* Hangul Syllable */
- [0xc6d8, 0xc6d8], /* Hangul Syllable */
- [0xc6d9, 0xc6d9], /* Hangul Syllable */
- [0xc6da, 0xc6da], /* Hangul Syllable */
- [0xc6db, 0xc6db], /* Hangul Syllable */
- [0xc6dc, 0xc6dc], /* Hangul Syllable */
- [0xc6dd, 0xc6dd], /* Hangul Syllable */
- [0xc6de, 0xc6de], /* Hangul Syllable */
- [0xc6df, 0xc6df], /* Hangul Syllable */
- [0xc6e0, 0xc6e0], /* Hangul Syllable */
- [0xc6e1, 0xc6e1], /* Hangul Syllable */
- [0xc6e2, 0xc6e2], /* Hangul Syllable */
- [0xc6e3, 0xc6e3], /* Hangul Syllable */
- [0xc6e4, 0xc6e4], /* Hangul Syllable */
- [0xc6e5, 0xc6e5], /* Hangul Syllable */
- [0xc6e6, 0xc6e6], /* Hangul Syllable */
- [0xc6e7, 0xc6e7], /* Hangul Syllable */
- [0xc6e8, 0xc6e8], /* Hangul Syllable */
- [0xc6e9, 0xc6e9], /* Hangul Syllable */
- [0xc6ea, 0xc6ea], /* Hangul Syllable */
- [0xc6eb, 0xc6eb], /* Hangul Syllable */
- [0xc6ec, 0xc6ec], /* Hangul Syllable */
- [0xc6ed, 0xc6ed], /* Hangul Syllable */
- [0xc6ee, 0xc6ee], /* Hangul Syllable */
- [0xc6ef, 0xc6ef], /* Hangul Syllable */
- [0xc6f0, 0xc6f0], /* Hangul Syllable */
- [0xc6f1, 0xc6f1], /* Hangul Syllable */
- [0xc6f2, 0xc6f2], /* Hangul Syllable */
- [0xc6f3, 0xc6f3], /* Hangul Syllable */
- [0xc6f4, 0xc6f4], /* Hangul Syllable */
- [0xc6f5, 0xc6f5], /* Hangul Syllable */
- [0xc6f6, 0xc6f6], /* Hangul Syllable */
- [0xc6f7, 0xc6f7], /* Hangul Syllable */
- [0xc6f8, 0xc6f8], /* Hangul Syllable */
- [0xc6f9, 0xc6f9], /* Hangul Syllable */
- [0xc6fa, 0xc6fa], /* Hangul Syllable */
- [0xc6fb, 0xc6fb], /* Hangul Syllable */
- [0xc6fc, 0xc6fc], /* Hangul Syllable */
- [0xc6fd, 0xc6fd], /* Hangul Syllable */
- [0xc6fe, 0xc6fe], /* Hangul Syllable */
- [0xc6ff, 0xc6ff], /* Hangul Syllable */
- [0xc700, 0xc700], /* Hangul Syllable */
- [0xc701, 0xc701], /* Hangul Syllable */
- [0xc702, 0xc702], /* Hangul Syllable */
- [0xc703, 0xc703], /* Hangul Syllable */
- [0xc704, 0xc704], /* Hangul Syllable */
- [0xc705, 0xc705], /* Hangul Syllable */
- [0xc706, 0xc706], /* Hangul Syllable */
- [0xc707, 0xc707], /* Hangul Syllable */
- [0xc708, 0xc708], /* Hangul Syllable */
- [0xc709, 0xc709], /* Hangul Syllable */
- [0xc70a, 0xc70a], /* Hangul Syllable */
- [0xc70b, 0xc70b], /* Hangul Syllable */
- [0xc70c, 0xc70c], /* Hangul Syllable */
- [0xc70d, 0xc70d], /* Hangul Syllable */
- [0xc70e, 0xc70e], /* Hangul Syllable */
- [0xc70f, 0xc70f], /* Hangul Syllable */
- [0xc710, 0xc710], /* Hangul Syllable */
- [0xc711, 0xc711], /* Hangul Syllable */
- [0xc712, 0xc712], /* Hangul Syllable */
- [0xc713, 0xc713], /* Hangul Syllable */
- [0xc714, 0xc714], /* Hangul Syllable */
- [0xc715, 0xc715], /* Hangul Syllable */
- [0xc716, 0xc716], /* Hangul Syllable */
- [0xc717, 0xc717], /* Hangul Syllable */
- [0xc718, 0xc718], /* Hangul Syllable */
- [0xc719, 0xc719], /* Hangul Syllable */
- [0xc71a, 0xc71a], /* Hangul Syllable */
- [0xc71b, 0xc71b], /* Hangul Syllable */
- [0xc71c, 0xc71c], /* Hangul Syllable */
- [0xc71d, 0xc71d], /* Hangul Syllable */
- [0xc71e, 0xc71e], /* Hangul Syllable */
- [0xc71f, 0xc71f], /* Hangul Syllable */
- [0xc720, 0xc720], /* Hangul Syllable */
- [0xc721, 0xc721], /* Hangul Syllable */
- [0xc722, 0xc722], /* Hangul Syllable */
- [0xc723, 0xc723], /* Hangul Syllable */
- [0xc724, 0xc724], /* Hangul Syllable */
- [0xc725, 0xc725], /* Hangul Syllable */
- [0xc726, 0xc726], /* Hangul Syllable */
- [0xc727, 0xc727], /* Hangul Syllable */
- [0xc728, 0xc728], /* Hangul Syllable */
- [0xc729, 0xc729], /* Hangul Syllable */
- [0xc72a, 0xc72a], /* Hangul Syllable */
- [0xc72b, 0xc72b], /* Hangul Syllable */
- [0xc72c, 0xc72c], /* Hangul Syllable */
- [0xc72d, 0xc72d], /* Hangul Syllable */
- [0xc72e, 0xc72e], /* Hangul Syllable */
- [0xc72f, 0xc72f], /* Hangul Syllable */
- [0xc730, 0xc730], /* Hangul Syllable */
- [0xc731, 0xc731], /* Hangul Syllable */
- [0xc732, 0xc732], /* Hangul Syllable */
- [0xc733, 0xc733], /* Hangul Syllable */
- [0xc734, 0xc734], /* Hangul Syllable */
- [0xc735, 0xc735], /* Hangul Syllable */
- [0xc736, 0xc736], /* Hangul Syllable */
- [0xc737, 0xc737], /* Hangul Syllable */
- [0xc738, 0xc738], /* Hangul Syllable */
- [0xc739, 0xc739], /* Hangul Syllable */
- [0xc73a, 0xc73a], /* Hangul Syllable */
- [0xc73b, 0xc73b], /* Hangul Syllable */
- [0xc73c, 0xc73c], /* Hangul Syllable */
- [0xc73d, 0xc73d], /* Hangul Syllable */
- [0xc73e, 0xc73e], /* Hangul Syllable */
- [0xc73f, 0xc73f], /* Hangul Syllable */
- [0xc740, 0xc740], /* Hangul Syllable */
- [0xc741, 0xc741], /* Hangul Syllable */
- [0xc742, 0xc742], /* Hangul Syllable */
- [0xc743, 0xc743], /* Hangul Syllable */
- [0xc744, 0xc744], /* Hangul Syllable */
- [0xc745, 0xc745], /* Hangul Syllable */
- [0xc746, 0xc746], /* Hangul Syllable */
- [0xc747, 0xc747], /* Hangul Syllable */
- [0xc748, 0xc748], /* Hangul Syllable */
- [0xc749, 0xc749], /* Hangul Syllable */
- [0xc74a, 0xc74a], /* Hangul Syllable */
- [0xc74b, 0xc74b], /* Hangul Syllable */
- [0xc74c, 0xc74c], /* Hangul Syllable */
- [0xc74d, 0xc74d], /* Hangul Syllable */
- [0xc74e, 0xc74e], /* Hangul Syllable */
- [0xc74f, 0xc74f], /* Hangul Syllable */
- [0xc750, 0xc750], /* Hangul Syllable */
- [0xc751, 0xc751], /* Hangul Syllable */
- [0xc752, 0xc752], /* Hangul Syllable */
- [0xc753, 0xc753], /* Hangul Syllable */
- [0xc754, 0xc754], /* Hangul Syllable */
- [0xc755, 0xc755], /* Hangul Syllable */
- [0xc756, 0xc756], /* Hangul Syllable */
- [0xc757, 0xc757], /* Hangul Syllable */
- [0xc758, 0xc758], /* Hangul Syllable */
- [0xc759, 0xc759], /* Hangul Syllable */
- [0xc75a, 0xc75a], /* Hangul Syllable */
- [0xc75b, 0xc75b], /* Hangul Syllable */
- [0xc75c, 0xc75c], /* Hangul Syllable */
- [0xc75d, 0xc75d], /* Hangul Syllable */
- [0xc75e, 0xc75e], /* Hangul Syllable */
- [0xc75f, 0xc75f], /* Hangul Syllable */
- [0xc760, 0xc760], /* Hangul Syllable */
- [0xc761, 0xc761], /* Hangul Syllable */
- [0xc762, 0xc762], /* Hangul Syllable */
- [0xc763, 0xc763], /* Hangul Syllable */
- [0xc764, 0xc764], /* Hangul Syllable */
- [0xc765, 0xc765], /* Hangul Syllable */
- [0xc766, 0xc766], /* Hangul Syllable */
- [0xc767, 0xc767], /* Hangul Syllable */
- [0xc768, 0xc768], /* Hangul Syllable */
- [0xc769, 0xc769], /* Hangul Syllable */
- [0xc76a, 0xc76a], /* Hangul Syllable */
- [0xc76b, 0xc76b], /* Hangul Syllable */
- [0xc76c, 0xc76c], /* Hangul Syllable */
- [0xc76d, 0xc76d], /* Hangul Syllable */
- [0xc76e, 0xc76e], /* Hangul Syllable */
- [0xc76f, 0xc76f], /* Hangul Syllable */
- [0xc770, 0xc770], /* Hangul Syllable */
- [0xc771, 0xc771], /* Hangul Syllable */
- [0xc772, 0xc772], /* Hangul Syllable */
- [0xc773, 0xc773], /* Hangul Syllable */
- [0xc774, 0xc774], /* Hangul Syllable */
- [0xc775, 0xc775], /* Hangul Syllable */
- [0xc776, 0xc776], /* Hangul Syllable */
- [0xc777, 0xc777], /* Hangul Syllable */
- [0xc778, 0xc778], /* Hangul Syllable */
- [0xc779, 0xc779], /* Hangul Syllable */
- [0xc77a, 0xc77a], /* Hangul Syllable */
- [0xc77b, 0xc77b], /* Hangul Syllable */
- [0xc77c, 0xc77c], /* Hangul Syllable */
- [0xc77d, 0xc77d], /* Hangul Syllable */
- [0xc77e, 0xc77e], /* Hangul Syllable */
- [0xc77f, 0xc77f], /* Hangul Syllable */
- [0xc780, 0xc780], /* Hangul Syllable */
- [0xc781, 0xc781], /* Hangul Syllable */
- [0xc782, 0xc782], /* Hangul Syllable */
- [0xc783, 0xc783], /* Hangul Syllable */
- [0xc784, 0xc784], /* Hangul Syllable */
- [0xc785, 0xc785], /* Hangul Syllable */
- [0xc786, 0xc786], /* Hangul Syllable */
- [0xc787, 0xc787], /* Hangul Syllable */
- [0xc788, 0xc788], /* Hangul Syllable */
- [0xc789, 0xc789], /* Hangul Syllable */
- [0xc78a, 0xc78a], /* Hangul Syllable */
- [0xc78b, 0xc78b], /* Hangul Syllable */
- [0xc78c, 0xc78c], /* Hangul Syllable */
- [0xc78d, 0xc78d], /* Hangul Syllable */
- [0xc78e, 0xc78e], /* Hangul Syllable */
- [0xc78f, 0xc78f], /* Hangul Syllable */
- [0xc790, 0xc790], /* Hangul Syllable */
- [0xc791, 0xc791], /* Hangul Syllable */
- [0xc792, 0xc792], /* Hangul Syllable */
- [0xc793, 0xc793], /* Hangul Syllable */
- [0xc794, 0xc794], /* Hangul Syllable */
- [0xc795, 0xc795], /* Hangul Syllable */
- [0xc796, 0xc796], /* Hangul Syllable */
- [0xc797, 0xc797], /* Hangul Syllable */
- [0xc798, 0xc798], /* Hangul Syllable */
- [0xc799, 0xc799], /* Hangul Syllable */
- [0xc79a, 0xc79a], /* Hangul Syllable */
- [0xc79b, 0xc79b], /* Hangul Syllable */
- [0xc79c, 0xc79c], /* Hangul Syllable */
- [0xc79d, 0xc79d], /* Hangul Syllable */
- [0xc79e, 0xc79e], /* Hangul Syllable */
- [0xc79f, 0xc79f], /* Hangul Syllable */
- [0xc7a0, 0xc7a0], /* Hangul Syllable */
- [0xc7a1, 0xc7a1], /* Hangul Syllable */
- [0xc7a2, 0xc7a2], /* Hangul Syllable */
- [0xc7a3, 0xc7a3], /* Hangul Syllable */
- [0xc7a4, 0xc7a4], /* Hangul Syllable */
- [0xc7a5, 0xc7a5], /* Hangul Syllable */
- [0xc7a6, 0xc7a6], /* Hangul Syllable */
- [0xc7a7, 0xc7a7], /* Hangul Syllable */
- [0xc7a8, 0xc7a8], /* Hangul Syllable */
- [0xc7a9, 0xc7a9], /* Hangul Syllable */
- [0xc7aa, 0xc7aa], /* Hangul Syllable */
- [0xc7ab, 0xc7ab], /* Hangul Syllable */
- [0xc7ac, 0xc7ac], /* Hangul Syllable */
- [0xc7ad, 0xc7ad], /* Hangul Syllable */
- [0xc7ae, 0xc7ae], /* Hangul Syllable */
- [0xc7af, 0xc7af], /* Hangul Syllable */
- [0xc7b0, 0xc7b0], /* Hangul Syllable */
- [0xc7b1, 0xc7b1], /* Hangul Syllable */
- [0xc7b2, 0xc7b2], /* Hangul Syllable */
- [0xc7b3, 0xc7b3], /* Hangul Syllable */
- [0xc7b4, 0xc7b4], /* Hangul Syllable */
- [0xc7b5, 0xc7b5], /* Hangul Syllable */
- [0xc7b6, 0xc7b6], /* Hangul Syllable */
- [0xc7b7, 0xc7b7], /* Hangul Syllable */
- [0xc7b8, 0xc7b8], /* Hangul Syllable */
- [0xc7b9, 0xc7b9], /* Hangul Syllable */
- [0xc7ba, 0xc7ba], /* Hangul Syllable */
- [0xc7bb, 0xc7bb], /* Hangul Syllable */
- [0xc7bc, 0xc7bc], /* Hangul Syllable */
- [0xc7bd, 0xc7bd], /* Hangul Syllable */
- [0xc7be, 0xc7be], /* Hangul Syllable */
- [0xc7bf, 0xc7bf], /* Hangul Syllable */
- [0xc7c0, 0xc7c0], /* Hangul Syllable */
- [0xc7c1, 0xc7c1], /* Hangul Syllable */
- [0xc7c2, 0xc7c2], /* Hangul Syllable */
- [0xc7c3, 0xc7c3], /* Hangul Syllable */
- [0xc7c4, 0xc7c4], /* Hangul Syllable */
- [0xc7c5, 0xc7c5], /* Hangul Syllable */
- [0xc7c6, 0xc7c6], /* Hangul Syllable */
- [0xc7c7, 0xc7c7], /* Hangul Syllable */
- [0xc7c8, 0xc7c8], /* Hangul Syllable */
- [0xc7c9, 0xc7c9], /* Hangul Syllable */
- [0xc7ca, 0xc7ca], /* Hangul Syllable */
- [0xc7cb, 0xc7cb], /* Hangul Syllable */
- [0xc7cc, 0xc7cc], /* Hangul Syllable */
- [0xc7cd, 0xc7cd], /* Hangul Syllable */
- [0xc7ce, 0xc7ce], /* Hangul Syllable */
- [0xc7cf, 0xc7cf], /* Hangul Syllable */
- [0xc7d0, 0xc7d0], /* Hangul Syllable */
- [0xc7d1, 0xc7d1], /* Hangul Syllable */
- [0xc7d2, 0xc7d2], /* Hangul Syllable */
- [0xc7d3, 0xc7d3], /* Hangul Syllable */
- [0xc7d4, 0xc7d4], /* Hangul Syllable */
- [0xc7d5, 0xc7d5], /* Hangul Syllable */
- [0xc7d6, 0xc7d6], /* Hangul Syllable */
- [0xc7d7, 0xc7d7], /* Hangul Syllable */
- [0xc7d8, 0xc7d8], /* Hangul Syllable */
- [0xc7d9, 0xc7d9], /* Hangul Syllable */
- [0xc7da, 0xc7da], /* Hangul Syllable */
- [0xc7db, 0xc7db], /* Hangul Syllable */
- [0xc7dc, 0xc7dc], /* Hangul Syllable */
- [0xc7dd, 0xc7dd], /* Hangul Syllable */
- [0xc7de, 0xc7de], /* Hangul Syllable */
- [0xc7df, 0xc7df], /* Hangul Syllable */
- [0xc7e0, 0xc7e0], /* Hangul Syllable */
- [0xc7e1, 0xc7e1], /* Hangul Syllable */
- [0xc7e2, 0xc7e2], /* Hangul Syllable */
- [0xc7e3, 0xc7e3], /* Hangul Syllable */
- [0xc7e4, 0xc7e4], /* Hangul Syllable */
- [0xc7e5, 0xc7e5], /* Hangul Syllable */
- [0xc7e6, 0xc7e6], /* Hangul Syllable */
- [0xc7e7, 0xc7e7], /* Hangul Syllable */
- [0xc7e8, 0xc7e8], /* Hangul Syllable */
- [0xc7e9, 0xc7e9], /* Hangul Syllable */
- [0xc7ea, 0xc7ea], /* Hangul Syllable */
- [0xc7eb, 0xc7eb], /* Hangul Syllable */
- [0xc7ec, 0xc7ec], /* Hangul Syllable */
- [0xc7ed, 0xc7ed], /* Hangul Syllable */
- [0xc7ee, 0xc7ee], /* Hangul Syllable */
- [0xc7ef, 0xc7ef], /* Hangul Syllable */
- [0xc7f0, 0xc7f0], /* Hangul Syllable */
- [0xc7f1, 0xc7f1], /* Hangul Syllable */
- [0xc7f2, 0xc7f2], /* Hangul Syllable */
- [0xc7f3, 0xc7f3], /* Hangul Syllable */
- [0xc7f4, 0xc7f4], /* Hangul Syllable */
- [0xc7f5, 0xc7f5], /* Hangul Syllable */
- [0xc7f6, 0xc7f6], /* Hangul Syllable */
- [0xc7f7, 0xc7f7], /* Hangul Syllable */
- [0xc7f8, 0xc7f8], /* Hangul Syllable */
- [0xc7f9, 0xc7f9], /* Hangul Syllable */
- [0xc7fa, 0xc7fa], /* Hangul Syllable */
- [0xc7fb, 0xc7fb], /* Hangul Syllable */
- [0xc7fc, 0xc7fc], /* Hangul Syllable */
- [0xc7fd, 0xc7fd], /* Hangul Syllable */
- [0xc7fe, 0xc7fe], /* Hangul Syllable */
- [0xc7ff, 0xc7ff], /* Hangul Syllable */
- [0xc800, 0xc800], /* Hangul Syllable */
- [0xc801, 0xc801], /* Hangul Syllable */
- [0xc802, 0xc802], /* Hangul Syllable */
- [0xc803, 0xc803], /* Hangul Syllable */
- [0xc804, 0xc804], /* Hangul Syllable */
- [0xc805, 0xc805], /* Hangul Syllable */
- [0xc806, 0xc806], /* Hangul Syllable */
- [0xc807, 0xc807], /* Hangul Syllable */
- [0xc808, 0xc808], /* Hangul Syllable */
- [0xc809, 0xc809], /* Hangul Syllable */
- [0xc80a, 0xc80a], /* Hangul Syllable */
- [0xc80b, 0xc80b], /* Hangul Syllable */
- [0xc80c, 0xc80c], /* Hangul Syllable */
- [0xc80d, 0xc80d], /* Hangul Syllable */
- [0xc80e, 0xc80e], /* Hangul Syllable */
- [0xc80f, 0xc80f], /* Hangul Syllable */
- [0xc810, 0xc810], /* Hangul Syllable */
- [0xc811, 0xc811], /* Hangul Syllable */
- [0xc812, 0xc812], /* Hangul Syllable */
- [0xc813, 0xc813], /* Hangul Syllable */
- [0xc814, 0xc814], /* Hangul Syllable */
- [0xc815, 0xc815], /* Hangul Syllable */
- [0xc816, 0xc816], /* Hangul Syllable */
- [0xc817, 0xc817], /* Hangul Syllable */
- [0xc818, 0xc818], /* Hangul Syllable */
- [0xc819, 0xc819], /* Hangul Syllable */
- [0xc81a, 0xc81a], /* Hangul Syllable */
- [0xc81b, 0xc81b], /* Hangul Syllable */
- [0xc81c, 0xc81c], /* Hangul Syllable */
- [0xc81d, 0xc81d], /* Hangul Syllable */
- [0xc81e, 0xc81e], /* Hangul Syllable */
- [0xc81f, 0xc81f], /* Hangul Syllable */
- [0xc820, 0xc820], /* Hangul Syllable */
- [0xc821, 0xc821], /* Hangul Syllable */
- [0xc822, 0xc822], /* Hangul Syllable */
- [0xc823, 0xc823], /* Hangul Syllable */
- [0xc824, 0xc824], /* Hangul Syllable */
- [0xc825, 0xc825], /* Hangul Syllable */
- [0xc826, 0xc826], /* Hangul Syllable */
- [0xc827, 0xc827], /* Hangul Syllable */
- [0xc828, 0xc828], /* Hangul Syllable */
- [0xc829, 0xc829], /* Hangul Syllable */
- [0xc82a, 0xc82a], /* Hangul Syllable */
- [0xc82b, 0xc82b], /* Hangul Syllable */
- [0xc82c, 0xc82c], /* Hangul Syllable */
- [0xc82d, 0xc82d], /* Hangul Syllable */
- [0xc82e, 0xc82e], /* Hangul Syllable */
- [0xc82f, 0xc82f], /* Hangul Syllable */
- [0xc830, 0xc830], /* Hangul Syllable */
- [0xc831, 0xc831], /* Hangul Syllable */
- [0xc832, 0xc832], /* Hangul Syllable */
- [0xc833, 0xc833], /* Hangul Syllable */
- [0xc834, 0xc834], /* Hangul Syllable */
- [0xc835, 0xc835], /* Hangul Syllable */
- [0xc836, 0xc836], /* Hangul Syllable */
- [0xc837, 0xc837], /* Hangul Syllable */
- [0xc838, 0xc838], /* Hangul Syllable */
- [0xc839, 0xc839], /* Hangul Syllable */
- [0xc83a, 0xc83a], /* Hangul Syllable */
- [0xc83b, 0xc83b], /* Hangul Syllable */
- [0xc83c, 0xc83c], /* Hangul Syllable */
- [0xc83d, 0xc83d], /* Hangul Syllable */
- [0xc83e, 0xc83e], /* Hangul Syllable */
- [0xc83f, 0xc83f], /* Hangul Syllable */
- [0xc840, 0xc840], /* Hangul Syllable */
- [0xc841, 0xc841], /* Hangul Syllable */
- [0xc842, 0xc842], /* Hangul Syllable */
- [0xc843, 0xc843], /* Hangul Syllable */
- [0xc844, 0xc844], /* Hangul Syllable */
- [0xc845, 0xc845], /* Hangul Syllable */
- [0xc846, 0xc846], /* Hangul Syllable */
- [0xc847, 0xc847], /* Hangul Syllable */
- [0xc848, 0xc848], /* Hangul Syllable */
- [0xc849, 0xc849], /* Hangul Syllable */
- [0xc84a, 0xc84a], /* Hangul Syllable */
- [0xc84b, 0xc84b], /* Hangul Syllable */
- [0xc84c, 0xc84c], /* Hangul Syllable */
- [0xc84d, 0xc84d], /* Hangul Syllable */
- [0xc84e, 0xc84e], /* Hangul Syllable */
- [0xc84f, 0xc84f], /* Hangul Syllable */
- [0xc850, 0xc850], /* Hangul Syllable */
- [0xc851, 0xc851], /* Hangul Syllable */
- [0xc852, 0xc852], /* Hangul Syllable */
- [0xc853, 0xc853], /* Hangul Syllable */
- [0xc854, 0xc854], /* Hangul Syllable */
- [0xc855, 0xc855], /* Hangul Syllable */
- [0xc856, 0xc856], /* Hangul Syllable */
- [0xc857, 0xc857], /* Hangul Syllable */
- [0xc858, 0xc858], /* Hangul Syllable */
- [0xc859, 0xc859], /* Hangul Syllable */
- [0xc85a, 0xc85a], /* Hangul Syllable */
- [0xc85b, 0xc85b], /* Hangul Syllable */
- [0xc85c, 0xc85c], /* Hangul Syllable */
- [0xc85d, 0xc85d], /* Hangul Syllable */
- [0xc85e, 0xc85e], /* Hangul Syllable */
- [0xc85f, 0xc85f], /* Hangul Syllable */
- [0xc860, 0xc860], /* Hangul Syllable */
- [0xc861, 0xc861], /* Hangul Syllable */
- [0xc862, 0xc862], /* Hangul Syllable */
- [0xc863, 0xc863], /* Hangul Syllable */
- [0xc864, 0xc864], /* Hangul Syllable */
- [0xc865, 0xc865], /* Hangul Syllable */
- [0xc866, 0xc866], /* Hangul Syllable */
- [0xc867, 0xc867], /* Hangul Syllable */
- [0xc868, 0xc868], /* Hangul Syllable */
- [0xc869, 0xc869], /* Hangul Syllable */
- [0xc86a, 0xc86a], /* Hangul Syllable */
- [0xc86b, 0xc86b], /* Hangul Syllable */
- [0xc86c, 0xc86c], /* Hangul Syllable */
- [0xc86d, 0xc86d], /* Hangul Syllable */
- [0xc86e, 0xc86e], /* Hangul Syllable */
- [0xc86f, 0xc86f], /* Hangul Syllable */
- [0xc870, 0xc870], /* Hangul Syllable */
- [0xc871, 0xc871], /* Hangul Syllable */
- [0xc872, 0xc872], /* Hangul Syllable */
- [0xc873, 0xc873], /* Hangul Syllable */
- [0xc874, 0xc874], /* Hangul Syllable */
- [0xc875, 0xc875], /* Hangul Syllable */
- [0xc876, 0xc876], /* Hangul Syllable */
- [0xc877, 0xc877], /* Hangul Syllable */
- [0xc878, 0xc878], /* Hangul Syllable */
- [0xc879, 0xc879], /* Hangul Syllable */
- [0xc87a, 0xc87a], /* Hangul Syllable */
- [0xc87b, 0xc87b], /* Hangul Syllable */
- [0xc87c, 0xc87c], /* Hangul Syllable */
- [0xc87d, 0xc87d], /* Hangul Syllable */
- [0xc87e, 0xc87e], /* Hangul Syllable */
- [0xc87f, 0xc87f], /* Hangul Syllable */
- [0xc880, 0xc880], /* Hangul Syllable */
- [0xc881, 0xc881], /* Hangul Syllable */
- [0xc882, 0xc882], /* Hangul Syllable */
- [0xc883, 0xc883], /* Hangul Syllable */
- [0xc884, 0xc884], /* Hangul Syllable */
- [0xc885, 0xc885], /* Hangul Syllable */
- [0xc886, 0xc886], /* Hangul Syllable */
- [0xc887, 0xc887], /* Hangul Syllable */
- [0xc888, 0xc888], /* Hangul Syllable */
- [0xc889, 0xc889], /* Hangul Syllable */
- [0xc88a, 0xc88a], /* Hangul Syllable */
- [0xc88b, 0xc88b], /* Hangul Syllable */
- [0xc88c, 0xc88c], /* Hangul Syllable */
- [0xc88d, 0xc88d], /* Hangul Syllable */
- [0xc88e, 0xc88e], /* Hangul Syllable */
- [0xc88f, 0xc88f], /* Hangul Syllable */
- [0xc890, 0xc890], /* Hangul Syllable */
- [0xc891, 0xc891], /* Hangul Syllable */
- [0xc892, 0xc892], /* Hangul Syllable */
- [0xc893, 0xc893], /* Hangul Syllable */
- [0xc894, 0xc894], /* Hangul Syllable */
- [0xc895, 0xc895], /* Hangul Syllable */
- [0xc896, 0xc896], /* Hangul Syllable */
- [0xc897, 0xc897], /* Hangul Syllable */
- [0xc898, 0xc898], /* Hangul Syllable */
- [0xc899, 0xc899], /* Hangul Syllable */
- [0xc89a, 0xc89a], /* Hangul Syllable */
- [0xc89b, 0xc89b], /* Hangul Syllable */
- [0xc89c, 0xc89c], /* Hangul Syllable */
- [0xc89d, 0xc89d], /* Hangul Syllable */
- [0xc89e, 0xc89e], /* Hangul Syllable */
- [0xc89f, 0xc89f], /* Hangul Syllable */
- [0xc8a0, 0xc8a0], /* Hangul Syllable */
- [0xc8a1, 0xc8a1], /* Hangul Syllable */
- [0xc8a2, 0xc8a2], /* Hangul Syllable */
- [0xc8a3, 0xc8a3], /* Hangul Syllable */
- [0xc8a4, 0xc8a4], /* Hangul Syllable */
- [0xc8a5, 0xc8a5], /* Hangul Syllable */
- [0xc8a6, 0xc8a6], /* Hangul Syllable */
- [0xc8a7, 0xc8a7], /* Hangul Syllable */
- [0xc8a8, 0xc8a8], /* Hangul Syllable */
- [0xc8a9, 0xc8a9], /* Hangul Syllable */
- [0xc8aa, 0xc8aa], /* Hangul Syllable */
- [0xc8ab, 0xc8ab], /* Hangul Syllable */
- [0xc8ac, 0xc8ac], /* Hangul Syllable */
- [0xc8ad, 0xc8ad], /* Hangul Syllable */
- [0xc8ae, 0xc8ae], /* Hangul Syllable */
- [0xc8af, 0xc8af], /* Hangul Syllable */
- [0xc8b0, 0xc8b0], /* Hangul Syllable */
- [0xc8b1, 0xc8b1], /* Hangul Syllable */
- [0xc8b2, 0xc8b2], /* Hangul Syllable */
- [0xc8b3, 0xc8b3], /* Hangul Syllable */
- [0xc8b4, 0xc8b4], /* Hangul Syllable */
- [0xc8b5, 0xc8b5], /* Hangul Syllable */
- [0xc8b6, 0xc8b6], /* Hangul Syllable */
- [0xc8b7, 0xc8b7], /* Hangul Syllable */
- [0xc8b8, 0xc8b8], /* Hangul Syllable */
- [0xc8b9, 0xc8b9], /* Hangul Syllable */
- [0xc8ba, 0xc8ba], /* Hangul Syllable */
- [0xc8bb, 0xc8bb], /* Hangul Syllable */
- [0xc8bc, 0xc8bc], /* Hangul Syllable */
- [0xc8bd, 0xc8bd], /* Hangul Syllable */
- [0xc8be, 0xc8be], /* Hangul Syllable */
- [0xc8bf, 0xc8bf], /* Hangul Syllable */
- [0xc8c0, 0xc8c0], /* Hangul Syllable */
- [0xc8c1, 0xc8c1], /* Hangul Syllable */
- [0xc8c2, 0xc8c2], /* Hangul Syllable */
- [0xc8c3, 0xc8c3], /* Hangul Syllable */
- [0xc8c4, 0xc8c4], /* Hangul Syllable */
- [0xc8c5, 0xc8c5], /* Hangul Syllable */
- [0xc8c6, 0xc8c6], /* Hangul Syllable */
- [0xc8c7, 0xc8c7], /* Hangul Syllable */
- [0xc8c8, 0xc8c8], /* Hangul Syllable */
- [0xc8c9, 0xc8c9], /* Hangul Syllable */
- [0xc8ca, 0xc8ca], /* Hangul Syllable */
- [0xc8cb, 0xc8cb], /* Hangul Syllable */
- [0xc8cc, 0xc8cc], /* Hangul Syllable */
- [0xc8cd, 0xc8cd], /* Hangul Syllable */
- [0xc8ce, 0xc8ce], /* Hangul Syllable */
- [0xc8cf, 0xc8cf], /* Hangul Syllable */
- [0xc8d0, 0xc8d0], /* Hangul Syllable */
- [0xc8d1, 0xc8d1], /* Hangul Syllable */
- [0xc8d2, 0xc8d2], /* Hangul Syllable */
- [0xc8d3, 0xc8d3], /* Hangul Syllable */
- [0xc8d4, 0xc8d4], /* Hangul Syllable */
- [0xc8d5, 0xc8d5], /* Hangul Syllable */
- [0xc8d6, 0xc8d6], /* Hangul Syllable */
- [0xc8d7, 0xc8d7], /* Hangul Syllable */
- [0xc8d8, 0xc8d8], /* Hangul Syllable */
- [0xc8d9, 0xc8d9], /* Hangul Syllable */
- [0xc8da, 0xc8da], /* Hangul Syllable */
- [0xc8db, 0xc8db], /* Hangul Syllable */
- [0xc8dc, 0xc8dc], /* Hangul Syllable */
- [0xc8dd, 0xc8dd], /* Hangul Syllable */
- [0xc8de, 0xc8de], /* Hangul Syllable */
- [0xc8df, 0xc8df], /* Hangul Syllable */
- [0xc8e0, 0xc8e0], /* Hangul Syllable */
- [0xc8e1, 0xc8e1], /* Hangul Syllable */
- [0xc8e2, 0xc8e2], /* Hangul Syllable */
- [0xc8e3, 0xc8e3], /* Hangul Syllable */
- [0xc8e4, 0xc8e4], /* Hangul Syllable */
- [0xc8e5, 0xc8e5], /* Hangul Syllable */
- [0xc8e6, 0xc8e6], /* Hangul Syllable */
- [0xc8e7, 0xc8e7], /* Hangul Syllable */
- [0xc8e8, 0xc8e8], /* Hangul Syllable */
- [0xc8e9, 0xc8e9], /* Hangul Syllable */
- [0xc8ea, 0xc8ea], /* Hangul Syllable */
- [0xc8eb, 0xc8eb], /* Hangul Syllable */
- [0xc8ec, 0xc8ec], /* Hangul Syllable */
- [0xc8ed, 0xc8ed], /* Hangul Syllable */
- [0xc8ee, 0xc8ee], /* Hangul Syllable */
- [0xc8ef, 0xc8ef], /* Hangul Syllable */
- [0xc8f0, 0xc8f0], /* Hangul Syllable */
- [0xc8f1, 0xc8f1], /* Hangul Syllable */
- [0xc8f2, 0xc8f2], /* Hangul Syllable */
- [0xc8f3, 0xc8f3], /* Hangul Syllable */
- [0xc8f4, 0xc8f4], /* Hangul Syllable */
- [0xc8f5, 0xc8f5], /* Hangul Syllable */
- [0xc8f6, 0xc8f6], /* Hangul Syllable */
- [0xc8f7, 0xc8f7], /* Hangul Syllable */
- [0xc8f8, 0xc8f8], /* Hangul Syllable */
- [0xc8f9, 0xc8f9], /* Hangul Syllable */
- [0xc8fa, 0xc8fa], /* Hangul Syllable */
- [0xc8fb, 0xc8fb], /* Hangul Syllable */
- [0xc8fc, 0xc8fc], /* Hangul Syllable */
- [0xc8fd, 0xc8fd], /* Hangul Syllable */
- [0xc8fe, 0xc8fe], /* Hangul Syllable */
- [0xc8ff, 0xc8ff], /* Hangul Syllable */
- [0xc900, 0xc900], /* Hangul Syllable */
- [0xc901, 0xc901], /* Hangul Syllable */
- [0xc902, 0xc902], /* Hangul Syllable */
- [0xc903, 0xc903], /* Hangul Syllable */
- [0xc904, 0xc904], /* Hangul Syllable */
- [0xc905, 0xc905], /* Hangul Syllable */
- [0xc906, 0xc906], /* Hangul Syllable */
- [0xc907, 0xc907], /* Hangul Syllable */
- [0xc908, 0xc908], /* Hangul Syllable */
- [0xc909, 0xc909], /* Hangul Syllable */
- [0xc90a, 0xc90a], /* Hangul Syllable */
- [0xc90b, 0xc90b], /* Hangul Syllable */
- [0xc90c, 0xc90c], /* Hangul Syllable */
- [0xc90d, 0xc90d], /* Hangul Syllable */
- [0xc90e, 0xc90e], /* Hangul Syllable */
- [0xc90f, 0xc90f], /* Hangul Syllable */
- [0xc910, 0xc910], /* Hangul Syllable */
- [0xc911, 0xc911], /* Hangul Syllable */
- [0xc912, 0xc912], /* Hangul Syllable */
- [0xc913, 0xc913], /* Hangul Syllable */
- [0xc914, 0xc914], /* Hangul Syllable */
- [0xc915, 0xc915], /* Hangul Syllable */
- [0xc916, 0xc916], /* Hangul Syllable */
- [0xc917, 0xc917], /* Hangul Syllable */
- [0xc918, 0xc918], /* Hangul Syllable */
- [0xc919, 0xc919], /* Hangul Syllable */
- [0xc91a, 0xc91a], /* Hangul Syllable */
- [0xc91b, 0xc91b], /* Hangul Syllable */
- [0xc91c, 0xc91c], /* Hangul Syllable */
- [0xc91d, 0xc91d], /* Hangul Syllable */
- [0xc91e, 0xc91e], /* Hangul Syllable */
- [0xc91f, 0xc91f], /* Hangul Syllable */
- [0xc920, 0xc920], /* Hangul Syllable */
- [0xc921, 0xc921], /* Hangul Syllable */
- [0xc922, 0xc922], /* Hangul Syllable */
- [0xc923, 0xc923], /* Hangul Syllable */
- [0xc924, 0xc924], /* Hangul Syllable */
- [0xc925, 0xc925], /* Hangul Syllable */
- [0xc926, 0xc926], /* Hangul Syllable */
- [0xc927, 0xc927], /* Hangul Syllable */
- [0xc928, 0xc928], /* Hangul Syllable */
- [0xc929, 0xc929], /* Hangul Syllable */
- [0xc92a, 0xc92a], /* Hangul Syllable */
- [0xc92b, 0xc92b], /* Hangul Syllable */
- [0xc92c, 0xc92c], /* Hangul Syllable */
- [0xc92d, 0xc92d], /* Hangul Syllable */
- [0xc92e, 0xc92e], /* Hangul Syllable */
- [0xc92f, 0xc92f], /* Hangul Syllable */
- [0xc930, 0xc930], /* Hangul Syllable */
- [0xc931, 0xc931], /* Hangul Syllable */
- [0xc932, 0xc932], /* Hangul Syllable */
- [0xc933, 0xc933], /* Hangul Syllable */
- [0xc934, 0xc934], /* Hangul Syllable */
- [0xc935, 0xc935], /* Hangul Syllable */
- [0xc936, 0xc936], /* Hangul Syllable */
- [0xc937, 0xc937], /* Hangul Syllable */
- [0xc938, 0xc938], /* Hangul Syllable */
- [0xc939, 0xc939], /* Hangul Syllable */
- [0xc93a, 0xc93a], /* Hangul Syllable */
- [0xc93b, 0xc93b], /* Hangul Syllable */
- [0xc93c, 0xc93c], /* Hangul Syllable */
- [0xc93d, 0xc93d], /* Hangul Syllable */
- [0xc93e, 0xc93e], /* Hangul Syllable */
- [0xc93f, 0xc93f], /* Hangul Syllable */
- [0xc940, 0xc940], /* Hangul Syllable */
- [0xc941, 0xc941], /* Hangul Syllable */
- [0xc942, 0xc942], /* Hangul Syllable */
- [0xc943, 0xc943], /* Hangul Syllable */
- [0xc944, 0xc944], /* Hangul Syllable */
- [0xc945, 0xc945], /* Hangul Syllable */
- [0xc946, 0xc946], /* Hangul Syllable */
- [0xc947, 0xc947], /* Hangul Syllable */
- [0xc948, 0xc948], /* Hangul Syllable */
- [0xc949, 0xc949], /* Hangul Syllable */
- [0xc94a, 0xc94a], /* Hangul Syllable */
- [0xc94b, 0xc94b], /* Hangul Syllable */
- [0xc94c, 0xc94c], /* Hangul Syllable */
- [0xc94d, 0xc94d], /* Hangul Syllable */
- [0xc94e, 0xc94e], /* Hangul Syllable */
- [0xc94f, 0xc94f], /* Hangul Syllable */
- [0xc950, 0xc950], /* Hangul Syllable */
- [0xc951, 0xc951], /* Hangul Syllable */
- [0xc952, 0xc952], /* Hangul Syllable */
- [0xc953, 0xc953], /* Hangul Syllable */
- [0xc954, 0xc954], /* Hangul Syllable */
- [0xc955, 0xc955], /* Hangul Syllable */
- [0xc956, 0xc956], /* Hangul Syllable */
- [0xc957, 0xc957], /* Hangul Syllable */
- [0xc958, 0xc958], /* Hangul Syllable */
- [0xc959, 0xc959], /* Hangul Syllable */
- [0xc95a, 0xc95a], /* Hangul Syllable */
- [0xc95b, 0xc95b], /* Hangul Syllable */
- [0xc95c, 0xc95c], /* Hangul Syllable */
- [0xc95d, 0xc95d], /* Hangul Syllable */
- [0xc95e, 0xc95e], /* Hangul Syllable */
- [0xc95f, 0xc95f], /* Hangul Syllable */
- [0xc960, 0xc960], /* Hangul Syllable */
- [0xc961, 0xc961], /* Hangul Syllable */
- [0xc962, 0xc962], /* Hangul Syllable */
- [0xc963, 0xc963], /* Hangul Syllable */
- [0xc964, 0xc964], /* Hangul Syllable */
- [0xc965, 0xc965], /* Hangul Syllable */
- [0xc966, 0xc966], /* Hangul Syllable */
- [0xc967, 0xc967], /* Hangul Syllable */
- [0xc968, 0xc968], /* Hangul Syllable */
- [0xc969, 0xc969], /* Hangul Syllable */
- [0xc96a, 0xc96a], /* Hangul Syllable */
- [0xc96b, 0xc96b], /* Hangul Syllable */
- [0xc96c, 0xc96c], /* Hangul Syllable */
- [0xc96d, 0xc96d], /* Hangul Syllable */
- [0xc96e, 0xc96e], /* Hangul Syllable */
- [0xc96f, 0xc96f], /* Hangul Syllable */
- [0xc970, 0xc970], /* Hangul Syllable */
- [0xc971, 0xc971], /* Hangul Syllable */
- [0xc972, 0xc972], /* Hangul Syllable */
- [0xc973, 0xc973], /* Hangul Syllable */
- [0xc974, 0xc974], /* Hangul Syllable */
- [0xc975, 0xc975], /* Hangul Syllable */
- [0xc976, 0xc976], /* Hangul Syllable */
- [0xc977, 0xc977], /* Hangul Syllable */
- [0xc978, 0xc978], /* Hangul Syllable */
- [0xc979, 0xc979], /* Hangul Syllable */
- [0xc97a, 0xc97a], /* Hangul Syllable */
- [0xc97b, 0xc97b], /* Hangul Syllable */
- [0xc97c, 0xc97c], /* Hangul Syllable */
- [0xc97d, 0xc97d], /* Hangul Syllable */
- [0xc97e, 0xc97e], /* Hangul Syllable */
- [0xc97f, 0xc97f], /* Hangul Syllable */
- [0xc980, 0xc980], /* Hangul Syllable */
- [0xc981, 0xc981], /* Hangul Syllable */
- [0xc982, 0xc982], /* Hangul Syllable */
- [0xc983, 0xc983], /* Hangul Syllable */
- [0xc984, 0xc984], /* Hangul Syllable */
- [0xc985, 0xc985], /* Hangul Syllable */
- [0xc986, 0xc986], /* Hangul Syllable */
- [0xc987, 0xc987], /* Hangul Syllable */
- [0xc988, 0xc988], /* Hangul Syllable */
- [0xc989, 0xc989], /* Hangul Syllable */
- [0xc98a, 0xc98a], /* Hangul Syllable */
- [0xc98b, 0xc98b], /* Hangul Syllable */
- [0xc98c, 0xc98c], /* Hangul Syllable */
- [0xc98d, 0xc98d], /* Hangul Syllable */
- [0xc98e, 0xc98e], /* Hangul Syllable */
- [0xc98f, 0xc98f], /* Hangul Syllable */
- [0xc990, 0xc990], /* Hangul Syllable */
- [0xc991, 0xc991], /* Hangul Syllable */
- [0xc992, 0xc992], /* Hangul Syllable */
- [0xc993, 0xc993], /* Hangul Syllable */
- [0xc994, 0xc994], /* Hangul Syllable */
- [0xc995, 0xc995], /* Hangul Syllable */
- [0xc996, 0xc996], /* Hangul Syllable */
- [0xc997, 0xc997], /* Hangul Syllable */
- [0xc998, 0xc998], /* Hangul Syllable */
- [0xc999, 0xc999], /* Hangul Syllable */
- [0xc99a, 0xc99a], /* Hangul Syllable */
- [0xc99b, 0xc99b], /* Hangul Syllable */
- [0xc99c, 0xc99c], /* Hangul Syllable */
- [0xc99d, 0xc99d], /* Hangul Syllable */
- [0xc99e, 0xc99e], /* Hangul Syllable */
- [0xc99f, 0xc99f], /* Hangul Syllable */
- [0xc9a0, 0xc9a0], /* Hangul Syllable */
- [0xc9a1, 0xc9a1], /* Hangul Syllable */
- [0xc9a2, 0xc9a2], /* Hangul Syllable */
- [0xc9a3, 0xc9a3], /* Hangul Syllable */
- [0xc9a4, 0xc9a4], /* Hangul Syllable */
- [0xc9a5, 0xc9a5], /* Hangul Syllable */
- [0xc9a6, 0xc9a6], /* Hangul Syllable */
- [0xc9a7, 0xc9a7], /* Hangul Syllable */
- [0xc9a8, 0xc9a8], /* Hangul Syllable */
- [0xc9a9, 0xc9a9], /* Hangul Syllable */
- [0xc9aa, 0xc9aa], /* Hangul Syllable */
- [0xc9ab, 0xc9ab], /* Hangul Syllable */
- [0xc9ac, 0xc9ac], /* Hangul Syllable */
- [0xc9ad, 0xc9ad], /* Hangul Syllable */
- [0xc9ae, 0xc9ae], /* Hangul Syllable */
- [0xc9af, 0xc9af], /* Hangul Syllable */
- [0xc9b0, 0xc9b0], /* Hangul Syllable */
- [0xc9b1, 0xc9b1], /* Hangul Syllable */
- [0xc9b2, 0xc9b2], /* Hangul Syllable */
- [0xc9b3, 0xc9b3], /* Hangul Syllable */
- [0xc9b4, 0xc9b4], /* Hangul Syllable */
- [0xc9b5, 0xc9b5], /* Hangul Syllable */
- [0xc9b6, 0xc9b6], /* Hangul Syllable */
- [0xc9b7, 0xc9b7], /* Hangul Syllable */
- [0xc9b8, 0xc9b8], /* Hangul Syllable */
- [0xc9b9, 0xc9b9], /* Hangul Syllable */
- [0xc9ba, 0xc9ba], /* Hangul Syllable */
- [0xc9bb, 0xc9bb], /* Hangul Syllable */
- [0xc9bc, 0xc9bc], /* Hangul Syllable */
- [0xc9bd, 0xc9bd], /* Hangul Syllable */
- [0xc9be, 0xc9be], /* Hangul Syllable */
- [0xc9bf, 0xc9bf], /* Hangul Syllable */
- [0xc9c0, 0xc9c0], /* Hangul Syllable */
- [0xc9c1, 0xc9c1], /* Hangul Syllable */
- [0xc9c2, 0xc9c2], /* Hangul Syllable */
- [0xc9c3, 0xc9c3], /* Hangul Syllable */
- [0xc9c4, 0xc9c4], /* Hangul Syllable */
- [0xc9c5, 0xc9c5], /* Hangul Syllable */
- [0xc9c6, 0xc9c6], /* Hangul Syllable */
- [0xc9c7, 0xc9c7], /* Hangul Syllable */
- [0xc9c8, 0xc9c8], /* Hangul Syllable */
- [0xc9c9, 0xc9c9], /* Hangul Syllable */
- [0xc9ca, 0xc9ca], /* Hangul Syllable */
- [0xc9cb, 0xc9cb], /* Hangul Syllable */
- [0xc9cc, 0xc9cc], /* Hangul Syllable */
- [0xc9cd, 0xc9cd], /* Hangul Syllable */
- [0xc9ce, 0xc9ce], /* Hangul Syllable */
- [0xc9cf, 0xc9cf], /* Hangul Syllable */
- [0xc9d0, 0xc9d0], /* Hangul Syllable */
- [0xc9d1, 0xc9d1], /* Hangul Syllable */
- [0xc9d2, 0xc9d2], /* Hangul Syllable */
- [0xc9d3, 0xc9d3], /* Hangul Syllable */
- [0xc9d4, 0xc9d4], /* Hangul Syllable */
- [0xc9d5, 0xc9d5], /* Hangul Syllable */
- [0xc9d6, 0xc9d6], /* Hangul Syllable */
- [0xc9d7, 0xc9d7], /* Hangul Syllable */
- [0xc9d8, 0xc9d8], /* Hangul Syllable */
- [0xc9d9, 0xc9d9], /* Hangul Syllable */
- [0xc9da, 0xc9da], /* Hangul Syllable */
- [0xc9db, 0xc9db], /* Hangul Syllable */
- [0xc9dc, 0xc9dc], /* Hangul Syllable */
- [0xc9dd, 0xc9dd], /* Hangul Syllable */
- [0xc9de, 0xc9de], /* Hangul Syllable */
- [0xc9df, 0xc9df], /* Hangul Syllable */
- [0xc9e0, 0xc9e0], /* Hangul Syllable */
- [0xc9e1, 0xc9e1], /* Hangul Syllable */
- [0xc9e2, 0xc9e2], /* Hangul Syllable */
- [0xc9e3, 0xc9e3], /* Hangul Syllable */
- [0xc9e4, 0xc9e4], /* Hangul Syllable */
- [0xc9e5, 0xc9e5], /* Hangul Syllable */
- [0xc9e6, 0xc9e6], /* Hangul Syllable */
- [0xc9e7, 0xc9e7], /* Hangul Syllable */
- [0xc9e8, 0xc9e8], /* Hangul Syllable */
- [0xc9e9, 0xc9e9], /* Hangul Syllable */
- [0xc9ea, 0xc9ea], /* Hangul Syllable */
- [0xc9eb, 0xc9eb], /* Hangul Syllable */
- [0xc9ec, 0xc9ec], /* Hangul Syllable */
- [0xc9ed, 0xc9ed], /* Hangul Syllable */
- [0xc9ee, 0xc9ee], /* Hangul Syllable */
- [0xc9ef, 0xc9ef], /* Hangul Syllable */
- [0xc9f0, 0xc9f0], /* Hangul Syllable */
- [0xc9f1, 0xc9f1], /* Hangul Syllable */
- [0xc9f2, 0xc9f2], /* Hangul Syllable */
- [0xc9f3, 0xc9f3], /* Hangul Syllable */
- [0xc9f4, 0xc9f4], /* Hangul Syllable */
- [0xc9f5, 0xc9f5], /* Hangul Syllable */
- [0xc9f6, 0xc9f6], /* Hangul Syllable */
- [0xc9f7, 0xc9f7], /* Hangul Syllable */
- [0xc9f8, 0xc9f8], /* Hangul Syllable */
- [0xc9f9, 0xc9f9], /* Hangul Syllable */
- [0xc9fa, 0xc9fa], /* Hangul Syllable */
- [0xc9fb, 0xc9fb], /* Hangul Syllable */
- [0xc9fc, 0xc9fc], /* Hangul Syllable */
- [0xc9fd, 0xc9fd], /* Hangul Syllable */
- [0xc9fe, 0xc9fe], /* Hangul Syllable */
- [0xc9ff, 0xc9ff], /* Hangul Syllable */
- [0xca00, 0xca00], /* Hangul Syllable */
- [0xca01, 0xca01], /* Hangul Syllable */
- [0xca02, 0xca02], /* Hangul Syllable */
- [0xca03, 0xca03], /* Hangul Syllable */
- [0xca04, 0xca04], /* Hangul Syllable */
- [0xca05, 0xca05], /* Hangul Syllable */
- [0xca06, 0xca06], /* Hangul Syllable */
- [0xca07, 0xca07], /* Hangul Syllable */
- [0xca08, 0xca08], /* Hangul Syllable */
- [0xca09, 0xca09], /* Hangul Syllable */
- [0xca0a, 0xca0a], /* Hangul Syllable */
- [0xca0b, 0xca0b], /* Hangul Syllable */
- [0xca0c, 0xca0c], /* Hangul Syllable */
- [0xca0d, 0xca0d], /* Hangul Syllable */
- [0xca0e, 0xca0e], /* Hangul Syllable */
- [0xca0f, 0xca0f], /* Hangul Syllable */
- [0xca10, 0xca10], /* Hangul Syllable */
- [0xca11, 0xca11], /* Hangul Syllable */
- [0xca12, 0xca12], /* Hangul Syllable */
- [0xca13, 0xca13], /* Hangul Syllable */
- [0xca14, 0xca14], /* Hangul Syllable */
- [0xca15, 0xca15], /* Hangul Syllable */
- [0xca16, 0xca16], /* Hangul Syllable */
- [0xca17, 0xca17], /* Hangul Syllable */
- [0xca18, 0xca18], /* Hangul Syllable */
- [0xca19, 0xca19], /* Hangul Syllable */
- [0xca1a, 0xca1a], /* Hangul Syllable */
- [0xca1b, 0xca1b], /* Hangul Syllable */
- [0xca1c, 0xca1c], /* Hangul Syllable */
- [0xca1d, 0xca1d], /* Hangul Syllable */
- [0xca1e, 0xca1e], /* Hangul Syllable */
- [0xca1f, 0xca1f], /* Hangul Syllable */
- [0xca20, 0xca20], /* Hangul Syllable */
- [0xca21, 0xca21], /* Hangul Syllable */
- [0xca22, 0xca22], /* Hangul Syllable */
- [0xca23, 0xca23], /* Hangul Syllable */
- [0xca24, 0xca24], /* Hangul Syllable */
- [0xca25, 0xca25], /* Hangul Syllable */
- [0xca26, 0xca26], /* Hangul Syllable */
- [0xca27, 0xca27], /* Hangul Syllable */
- [0xca28, 0xca28], /* Hangul Syllable */
- [0xca29, 0xca29], /* Hangul Syllable */
- [0xca2a, 0xca2a], /* Hangul Syllable */
- [0xca2b, 0xca2b], /* Hangul Syllable */
- [0xca2c, 0xca2c], /* Hangul Syllable */
- [0xca2d, 0xca2d], /* Hangul Syllable */
- [0xca2e, 0xca2e], /* Hangul Syllable */
- [0xca2f, 0xca2f], /* Hangul Syllable */
- [0xca30, 0xca30], /* Hangul Syllable */
- [0xca31, 0xca31], /* Hangul Syllable */
- [0xca32, 0xca32], /* Hangul Syllable */
- [0xca33, 0xca33], /* Hangul Syllable */
- [0xca34, 0xca34], /* Hangul Syllable */
- [0xca35, 0xca35], /* Hangul Syllable */
- [0xca36, 0xca36], /* Hangul Syllable */
- [0xca37, 0xca37], /* Hangul Syllable */
- [0xca38, 0xca38], /* Hangul Syllable */
- [0xca39, 0xca39], /* Hangul Syllable */
- [0xca3a, 0xca3a], /* Hangul Syllable */
- [0xca3b, 0xca3b], /* Hangul Syllable */
- [0xca3c, 0xca3c], /* Hangul Syllable */
- [0xca3d, 0xca3d], /* Hangul Syllable */
- [0xca3e, 0xca3e], /* Hangul Syllable */
- [0xca3f, 0xca3f], /* Hangul Syllable */
- [0xca40, 0xca40], /* Hangul Syllable */
- [0xca41, 0xca41], /* Hangul Syllable */
- [0xca42, 0xca42], /* Hangul Syllable */
- [0xca43, 0xca43], /* Hangul Syllable */
- [0xca44, 0xca44], /* Hangul Syllable */
- [0xca45, 0xca45], /* Hangul Syllable */
- [0xca46, 0xca46], /* Hangul Syllable */
- [0xca47, 0xca47], /* Hangul Syllable */
- [0xca48, 0xca48], /* Hangul Syllable */
- [0xca49, 0xca49], /* Hangul Syllable */
- [0xca4a, 0xca4a], /* Hangul Syllable */
- [0xca4b, 0xca4b], /* Hangul Syllable */
- [0xca4c, 0xca4c], /* Hangul Syllable */
- [0xca4d, 0xca4d], /* Hangul Syllable */
- [0xca4e, 0xca4e], /* Hangul Syllable */
- [0xca4f, 0xca4f], /* Hangul Syllable */
- [0xca50, 0xca50], /* Hangul Syllable */
- [0xca51, 0xca51], /* Hangul Syllable */
- [0xca52, 0xca52], /* Hangul Syllable */
- [0xca53, 0xca53], /* Hangul Syllable */
- [0xca54, 0xca54], /* Hangul Syllable */
- [0xca55, 0xca55], /* Hangul Syllable */
- [0xca56, 0xca56], /* Hangul Syllable */
- [0xca57, 0xca57], /* Hangul Syllable */
- [0xca58, 0xca58], /* Hangul Syllable */
- [0xca59, 0xca59], /* Hangul Syllable */
- [0xca5a, 0xca5a], /* Hangul Syllable */
- [0xca5b, 0xca5b], /* Hangul Syllable */
- [0xca5c, 0xca5c], /* Hangul Syllable */
- [0xca5d, 0xca5d], /* Hangul Syllable */
- [0xca5e, 0xca5e], /* Hangul Syllable */
- [0xca5f, 0xca5f], /* Hangul Syllable */
- [0xca60, 0xca60], /* Hangul Syllable */
- [0xca61, 0xca61], /* Hangul Syllable */
- [0xca62, 0xca62], /* Hangul Syllable */
- [0xca63, 0xca63], /* Hangul Syllable */
- [0xca64, 0xca64], /* Hangul Syllable */
- [0xca65, 0xca65], /* Hangul Syllable */
- [0xca66, 0xca66], /* Hangul Syllable */
- [0xca67, 0xca67], /* Hangul Syllable */
- [0xca68, 0xca68], /* Hangul Syllable */
- [0xca69, 0xca69], /* Hangul Syllable */
- [0xca6a, 0xca6a], /* Hangul Syllable */
- [0xca6b, 0xca6b], /* Hangul Syllable */
- [0xca6c, 0xca6c], /* Hangul Syllable */
- [0xca6d, 0xca6d], /* Hangul Syllable */
- [0xca6e, 0xca6e], /* Hangul Syllable */
- [0xca6f, 0xca6f], /* Hangul Syllable */
- [0xca70, 0xca70], /* Hangul Syllable */
- [0xca71, 0xca71], /* Hangul Syllable */
- [0xca72, 0xca72], /* Hangul Syllable */
- [0xca73, 0xca73], /* Hangul Syllable */
- [0xca74, 0xca74], /* Hangul Syllable */
- [0xca75, 0xca75], /* Hangul Syllable */
- [0xca76, 0xca76], /* Hangul Syllable */
- [0xca77, 0xca77], /* Hangul Syllable */
- [0xca78, 0xca78], /* Hangul Syllable */
- [0xca79, 0xca79], /* Hangul Syllable */
- [0xca7a, 0xca7a], /* Hangul Syllable */
- [0xca7b, 0xca7b], /* Hangul Syllable */
- [0xca7c, 0xca7c], /* Hangul Syllable */
- [0xca7d, 0xca7d], /* Hangul Syllable */
- [0xca7e, 0xca7e], /* Hangul Syllable */
- [0xca7f, 0xca7f], /* Hangul Syllable */
- [0xca80, 0xca80], /* Hangul Syllable */
- [0xca81, 0xca81], /* Hangul Syllable */
- [0xca82, 0xca82], /* Hangul Syllable */
- [0xca83, 0xca83], /* Hangul Syllable */
- [0xca84, 0xca84], /* Hangul Syllable */
- [0xca85, 0xca85], /* Hangul Syllable */
- [0xca86, 0xca86], /* Hangul Syllable */
- [0xca87, 0xca87], /* Hangul Syllable */
- [0xca88, 0xca88], /* Hangul Syllable */
- [0xca89, 0xca89], /* Hangul Syllable */
- [0xca8a, 0xca8a], /* Hangul Syllable */
- [0xca8b, 0xca8b], /* Hangul Syllable */
- [0xca8c, 0xca8c], /* Hangul Syllable */
- [0xca8d, 0xca8d], /* Hangul Syllable */
- [0xca8e, 0xca8e], /* Hangul Syllable */
- [0xca8f, 0xca8f], /* Hangul Syllable */
- [0xca90, 0xca90], /* Hangul Syllable */
- [0xca91, 0xca91], /* Hangul Syllable */
- [0xca92, 0xca92], /* Hangul Syllable */
- [0xca93, 0xca93], /* Hangul Syllable */
- [0xca94, 0xca94], /* Hangul Syllable */
- [0xca95, 0xca95], /* Hangul Syllable */
- [0xca96, 0xca96], /* Hangul Syllable */
- [0xca97, 0xca97], /* Hangul Syllable */
- [0xca98, 0xca98], /* Hangul Syllable */
- [0xca99, 0xca99], /* Hangul Syllable */
- [0xca9a, 0xca9a], /* Hangul Syllable */
- [0xca9b, 0xca9b], /* Hangul Syllable */
- [0xca9c, 0xca9c], /* Hangul Syllable */
- [0xca9d, 0xca9d], /* Hangul Syllable */
- [0xca9e, 0xca9e], /* Hangul Syllable */
- [0xca9f, 0xca9f], /* Hangul Syllable */
- [0xcaa0, 0xcaa0], /* Hangul Syllable */
- [0xcaa1, 0xcaa1], /* Hangul Syllable */
- [0xcaa2, 0xcaa2], /* Hangul Syllable */
- [0xcaa3, 0xcaa3], /* Hangul Syllable */
- [0xcaa4, 0xcaa4], /* Hangul Syllable */
- [0xcaa5, 0xcaa5], /* Hangul Syllable */
- [0xcaa6, 0xcaa6], /* Hangul Syllable */
- [0xcaa7, 0xcaa7], /* Hangul Syllable */
- [0xcaa8, 0xcaa8], /* Hangul Syllable */
- [0xcaa9, 0xcaa9], /* Hangul Syllable */
- [0xcaaa, 0xcaaa], /* Hangul Syllable */
- [0xcaab, 0xcaab], /* Hangul Syllable */
- [0xcaac, 0xcaac], /* Hangul Syllable */
- [0xcaad, 0xcaad], /* Hangul Syllable */
- [0xcaae, 0xcaae], /* Hangul Syllable */
- [0xcaaf, 0xcaaf], /* Hangul Syllable */
- [0xcab0, 0xcab0], /* Hangul Syllable */
- [0xcab1, 0xcab1], /* Hangul Syllable */
- [0xcab2, 0xcab2], /* Hangul Syllable */
- [0xcab3, 0xcab3], /* Hangul Syllable */
- [0xcab4, 0xcab4], /* Hangul Syllable */
- [0xcab5, 0xcab5], /* Hangul Syllable */
- [0xcab6, 0xcab6], /* Hangul Syllable */
- [0xcab7, 0xcab7], /* Hangul Syllable */
- [0xcab8, 0xcab8], /* Hangul Syllable */
- [0xcab9, 0xcab9], /* Hangul Syllable */
- [0xcaba, 0xcaba], /* Hangul Syllable */
- [0xcabb, 0xcabb], /* Hangul Syllable */
- [0xcabc, 0xcabc], /* Hangul Syllable */
- [0xcabd, 0xcabd], /* Hangul Syllable */
- [0xcabe, 0xcabe], /* Hangul Syllable */
- [0xcabf, 0xcabf], /* Hangul Syllable */
- [0xcac0, 0xcac0], /* Hangul Syllable */
- [0xcac1, 0xcac1], /* Hangul Syllable */
- [0xcac2, 0xcac2], /* Hangul Syllable */
- [0xcac3, 0xcac3], /* Hangul Syllable */
- [0xcac4, 0xcac4], /* Hangul Syllable */
- [0xcac5, 0xcac5], /* Hangul Syllable */
- [0xcac6, 0xcac6], /* Hangul Syllable */
- [0xcac7, 0xcac7], /* Hangul Syllable */
- [0xcac8, 0xcac8], /* Hangul Syllable */
- [0xcac9, 0xcac9], /* Hangul Syllable */
- [0xcaca, 0xcaca], /* Hangul Syllable */
- [0xcacb, 0xcacb], /* Hangul Syllable */
- [0xcacc, 0xcacc], /* Hangul Syllable */
- [0xcacd, 0xcacd], /* Hangul Syllable */
- [0xcace, 0xcace], /* Hangul Syllable */
- [0xcacf, 0xcacf], /* Hangul Syllable */
- [0xcad0, 0xcad0], /* Hangul Syllable */
- [0xcad1, 0xcad1], /* Hangul Syllable */
- [0xcad2, 0xcad2], /* Hangul Syllable */
- [0xcad3, 0xcad3], /* Hangul Syllable */
- [0xcad4, 0xcad4], /* Hangul Syllable */
- [0xcad5, 0xcad5], /* Hangul Syllable */
- [0xcad6, 0xcad6], /* Hangul Syllable */
- [0xcad7, 0xcad7], /* Hangul Syllable */
- [0xcad8, 0xcad8], /* Hangul Syllable */
- [0xcad9, 0xcad9], /* Hangul Syllable */
- [0xcada, 0xcada], /* Hangul Syllable */
- [0xcadb, 0xcadb], /* Hangul Syllable */
- [0xcadc, 0xcadc], /* Hangul Syllable */
- [0xcadd, 0xcadd], /* Hangul Syllable */
- [0xcade, 0xcade], /* Hangul Syllable */
- [0xcadf, 0xcadf], /* Hangul Syllable */
- [0xcae0, 0xcae0], /* Hangul Syllable */
- [0xcae1, 0xcae1], /* Hangul Syllable */
- [0xcae2, 0xcae2], /* Hangul Syllable */
- [0xcae3, 0xcae3], /* Hangul Syllable */
- [0xcae4, 0xcae4], /* Hangul Syllable */
- [0xcae5, 0xcae5], /* Hangul Syllable */
- [0xcae6, 0xcae6], /* Hangul Syllable */
- [0xcae7, 0xcae7], /* Hangul Syllable */
- [0xcae8, 0xcae8], /* Hangul Syllable */
- [0xcae9, 0xcae9], /* Hangul Syllable */
- [0xcaea, 0xcaea], /* Hangul Syllable */
- [0xcaeb, 0xcaeb], /* Hangul Syllable */
- [0xcaec, 0xcaec], /* Hangul Syllable */
- [0xcaed, 0xcaed], /* Hangul Syllable */
- [0xcaee, 0xcaee], /* Hangul Syllable */
- [0xcaef, 0xcaef], /* Hangul Syllable */
- [0xcaf0, 0xcaf0], /* Hangul Syllable */
- [0xcaf1, 0xcaf1], /* Hangul Syllable */
- [0xcaf2, 0xcaf2], /* Hangul Syllable */
- [0xcaf3, 0xcaf3], /* Hangul Syllable */
- [0xcaf4, 0xcaf4], /* Hangul Syllable */
- [0xcaf5, 0xcaf5], /* Hangul Syllable */
- [0xcaf6, 0xcaf6], /* Hangul Syllable */
- [0xcaf7, 0xcaf7], /* Hangul Syllable */
- [0xcaf8, 0xcaf8], /* Hangul Syllable */
- [0xcaf9, 0xcaf9], /* Hangul Syllable */
- [0xcafa, 0xcafa], /* Hangul Syllable */
- [0xcafb, 0xcafb], /* Hangul Syllable */
- [0xcafc, 0xcafc], /* Hangul Syllable */
- [0xcafd, 0xcafd], /* Hangul Syllable */
- [0xcafe, 0xcafe], /* Hangul Syllable */
- [0xcaff, 0xcaff], /* Hangul Syllable */
- [0xcb00, 0xcb00], /* Hangul Syllable */
- [0xcb01, 0xcb01], /* Hangul Syllable */
- [0xcb02, 0xcb02], /* Hangul Syllable */
- [0xcb03, 0xcb03], /* Hangul Syllable */
- [0xcb04, 0xcb04], /* Hangul Syllable */
- [0xcb05, 0xcb05], /* Hangul Syllable */
- [0xcb06, 0xcb06], /* Hangul Syllable */
- [0xcb07, 0xcb07], /* Hangul Syllable */
- [0xcb08, 0xcb08], /* Hangul Syllable */
- [0xcb09, 0xcb09], /* Hangul Syllable */
- [0xcb0a, 0xcb0a], /* Hangul Syllable */
- [0xcb0b, 0xcb0b], /* Hangul Syllable */
- [0xcb0c, 0xcb0c], /* Hangul Syllable */
- [0xcb0d, 0xcb0d], /* Hangul Syllable */
- [0xcb0e, 0xcb0e], /* Hangul Syllable */
- [0xcb0f, 0xcb0f], /* Hangul Syllable */
- [0xcb10, 0xcb10], /* Hangul Syllable */
- [0xcb11, 0xcb11], /* Hangul Syllable */
- [0xcb12, 0xcb12], /* Hangul Syllable */
- [0xcb13, 0xcb13], /* Hangul Syllable */
- [0xcb14, 0xcb14], /* Hangul Syllable */
- [0xcb15, 0xcb15], /* Hangul Syllable */
- [0xcb16, 0xcb16], /* Hangul Syllable */
- [0xcb17, 0xcb17], /* Hangul Syllable */
- [0xcb18, 0xcb18], /* Hangul Syllable */
- [0xcb19, 0xcb19], /* Hangul Syllable */
- [0xcb1a, 0xcb1a], /* Hangul Syllable */
- [0xcb1b, 0xcb1b], /* Hangul Syllable */
- [0xcb1c, 0xcb1c], /* Hangul Syllable */
- [0xcb1d, 0xcb1d], /* Hangul Syllable */
- [0xcb1e, 0xcb1e], /* Hangul Syllable */
- [0xcb1f, 0xcb1f], /* Hangul Syllable */
- [0xcb20, 0xcb20], /* Hangul Syllable */
- [0xcb21, 0xcb21], /* Hangul Syllable */
- [0xcb22, 0xcb22], /* Hangul Syllable */
- [0xcb23, 0xcb23], /* Hangul Syllable */
- [0xcb24, 0xcb24], /* Hangul Syllable */
- [0xcb25, 0xcb25], /* Hangul Syllable */
- [0xcb26, 0xcb26], /* Hangul Syllable */
- [0xcb27, 0xcb27], /* Hangul Syllable */
- [0xcb28, 0xcb28], /* Hangul Syllable */
- [0xcb29, 0xcb29], /* Hangul Syllable */
- [0xcb2a, 0xcb2a], /* Hangul Syllable */
- [0xcb2b, 0xcb2b], /* Hangul Syllable */
- [0xcb2c, 0xcb2c], /* Hangul Syllable */
- [0xcb2d, 0xcb2d], /* Hangul Syllable */
- [0xcb2e, 0xcb2e], /* Hangul Syllable */
- [0xcb2f, 0xcb2f], /* Hangul Syllable */
- [0xcb30, 0xcb30], /* Hangul Syllable */
- [0xcb31, 0xcb31], /* Hangul Syllable */
- [0xcb32, 0xcb32], /* Hangul Syllable */
- [0xcb33, 0xcb33], /* Hangul Syllable */
- [0xcb34, 0xcb34], /* Hangul Syllable */
- [0xcb35, 0xcb35], /* Hangul Syllable */
- [0xcb36, 0xcb36], /* Hangul Syllable */
- [0xcb37, 0xcb37], /* Hangul Syllable */
- [0xcb38, 0xcb38], /* Hangul Syllable */
- [0xcb39, 0xcb39], /* Hangul Syllable */
- [0xcb3a, 0xcb3a], /* Hangul Syllable */
- [0xcb3b, 0xcb3b], /* Hangul Syllable */
- [0xcb3c, 0xcb3c], /* Hangul Syllable */
- [0xcb3d, 0xcb3d], /* Hangul Syllable */
- [0xcb3e, 0xcb3e], /* Hangul Syllable */
- [0xcb3f, 0xcb3f], /* Hangul Syllable */
- [0xcb40, 0xcb40], /* Hangul Syllable */
- [0xcb41, 0xcb41], /* Hangul Syllable */
- [0xcb42, 0xcb42], /* Hangul Syllable */
- [0xcb43, 0xcb43], /* Hangul Syllable */
- [0xcb44, 0xcb44], /* Hangul Syllable */
- [0xcb45, 0xcb45], /* Hangul Syllable */
- [0xcb46, 0xcb46], /* Hangul Syllable */
- [0xcb47, 0xcb47], /* Hangul Syllable */
- [0xcb48, 0xcb48], /* Hangul Syllable */
- [0xcb49, 0xcb49], /* Hangul Syllable */
- [0xcb4a, 0xcb4a], /* Hangul Syllable */
- [0xcb4b, 0xcb4b], /* Hangul Syllable */
- [0xcb4c, 0xcb4c], /* Hangul Syllable */
- [0xcb4d, 0xcb4d], /* Hangul Syllable */
- [0xcb4e, 0xcb4e], /* Hangul Syllable */
- [0xcb4f, 0xcb4f], /* Hangul Syllable */
- [0xcb50, 0xcb50], /* Hangul Syllable */
- [0xcb51, 0xcb51], /* Hangul Syllable */
- [0xcb52, 0xcb52], /* Hangul Syllable */
- [0xcb53, 0xcb53], /* Hangul Syllable */
- [0xcb54, 0xcb54], /* Hangul Syllable */
- [0xcb55, 0xcb55], /* Hangul Syllable */
- [0xcb56, 0xcb56], /* Hangul Syllable */
- [0xcb57, 0xcb57], /* Hangul Syllable */
- [0xcb58, 0xcb58], /* Hangul Syllable */
- [0xcb59, 0xcb59], /* Hangul Syllable */
- [0xcb5a, 0xcb5a], /* Hangul Syllable */
- [0xcb5b, 0xcb5b], /* Hangul Syllable */
- [0xcb5c, 0xcb5c], /* Hangul Syllable */
- [0xcb5d, 0xcb5d], /* Hangul Syllable */
- [0xcb5e, 0xcb5e], /* Hangul Syllable */
- [0xcb5f, 0xcb5f], /* Hangul Syllable */
- [0xcb60, 0xcb60], /* Hangul Syllable */
- [0xcb61, 0xcb61], /* Hangul Syllable */
- [0xcb62, 0xcb62], /* Hangul Syllable */
- [0xcb63, 0xcb63], /* Hangul Syllable */
- [0xcb64, 0xcb64], /* Hangul Syllable */
- [0xcb65, 0xcb65], /* Hangul Syllable */
- [0xcb66, 0xcb66], /* Hangul Syllable */
- [0xcb67, 0xcb67], /* Hangul Syllable */
- [0xcb68, 0xcb68], /* Hangul Syllable */
- [0xcb69, 0xcb69], /* Hangul Syllable */
- [0xcb6a, 0xcb6a], /* Hangul Syllable */
- [0xcb6b, 0xcb6b], /* Hangul Syllable */
- [0xcb6c, 0xcb6c], /* Hangul Syllable */
- [0xcb6d, 0xcb6d], /* Hangul Syllable */
- [0xcb6e, 0xcb6e], /* Hangul Syllable */
- [0xcb6f, 0xcb6f], /* Hangul Syllable */
- [0xcb70, 0xcb70], /* Hangul Syllable */
- [0xcb71, 0xcb71], /* Hangul Syllable */
- [0xcb72, 0xcb72], /* Hangul Syllable */
- [0xcb73, 0xcb73], /* Hangul Syllable */
- [0xcb74, 0xcb74], /* Hangul Syllable */
- [0xcb75, 0xcb75], /* Hangul Syllable */
- [0xcb76, 0xcb76], /* Hangul Syllable */
- [0xcb77, 0xcb77], /* Hangul Syllable */
- [0xcb78, 0xcb78], /* Hangul Syllable */
- [0xcb79, 0xcb79], /* Hangul Syllable */
- [0xcb7a, 0xcb7a], /* Hangul Syllable */
- [0xcb7b, 0xcb7b], /* Hangul Syllable */
- [0xcb7c, 0xcb7c], /* Hangul Syllable */
- [0xcb7d, 0xcb7d], /* Hangul Syllable */
- [0xcb7e, 0xcb7e], /* Hangul Syllable */
- [0xcb7f, 0xcb7f], /* Hangul Syllable */
- [0xcb80, 0xcb80], /* Hangul Syllable */
- [0xcb81, 0xcb81], /* Hangul Syllable */
- [0xcb82, 0xcb82], /* Hangul Syllable */
- [0xcb83, 0xcb83], /* Hangul Syllable */
- [0xcb84, 0xcb84], /* Hangul Syllable */
- [0xcb85, 0xcb85], /* Hangul Syllable */
- [0xcb86, 0xcb86], /* Hangul Syllable */
- [0xcb87, 0xcb87], /* Hangul Syllable */
- [0xcb88, 0xcb88], /* Hangul Syllable */
- [0xcb89, 0xcb89], /* Hangul Syllable */
- [0xcb8a, 0xcb8a], /* Hangul Syllable */
- [0xcb8b, 0xcb8b], /* Hangul Syllable */
- [0xcb8c, 0xcb8c], /* Hangul Syllable */
- [0xcb8d, 0xcb8d], /* Hangul Syllable */
- [0xcb8e, 0xcb8e], /* Hangul Syllable */
- [0xcb8f, 0xcb8f], /* Hangul Syllable */
- [0xcb90, 0xcb90], /* Hangul Syllable */
- [0xcb91, 0xcb91], /* Hangul Syllable */
- [0xcb92, 0xcb92], /* Hangul Syllable */
- [0xcb93, 0xcb93], /* Hangul Syllable */
- [0xcb94, 0xcb94], /* Hangul Syllable */
- [0xcb95, 0xcb95], /* Hangul Syllable */
- [0xcb96, 0xcb96], /* Hangul Syllable */
- [0xcb97, 0xcb97], /* Hangul Syllable */
- [0xcb98, 0xcb98], /* Hangul Syllable */
- [0xcb99, 0xcb99], /* Hangul Syllable */
- [0xcb9a, 0xcb9a], /* Hangul Syllable */
- [0xcb9b, 0xcb9b], /* Hangul Syllable */
- [0xcb9c, 0xcb9c], /* Hangul Syllable */
- [0xcb9d, 0xcb9d], /* Hangul Syllable */
- [0xcb9e, 0xcb9e], /* Hangul Syllable */
- [0xcb9f, 0xcb9f], /* Hangul Syllable */
- [0xcba0, 0xcba0], /* Hangul Syllable */
- [0xcba1, 0xcba1], /* Hangul Syllable */
- [0xcba2, 0xcba2], /* Hangul Syllable */
- [0xcba3, 0xcba3], /* Hangul Syllable */
- [0xcba4, 0xcba4], /* Hangul Syllable */
- [0xcba5, 0xcba5], /* Hangul Syllable */
- [0xcba6, 0xcba6], /* Hangul Syllable */
- [0xcba7, 0xcba7], /* Hangul Syllable */
- [0xcba8, 0xcba8], /* Hangul Syllable */
- [0xcba9, 0xcba9], /* Hangul Syllable */
- [0xcbaa, 0xcbaa], /* Hangul Syllable */
- [0xcbab, 0xcbab], /* Hangul Syllable */
- [0xcbac, 0xcbac], /* Hangul Syllable */
- [0xcbad, 0xcbad], /* Hangul Syllable */
- [0xcbae, 0xcbae], /* Hangul Syllable */
- [0xcbaf, 0xcbaf], /* Hangul Syllable */
- [0xcbb0, 0xcbb0], /* Hangul Syllable */
- [0xcbb1, 0xcbb1], /* Hangul Syllable */
- [0xcbb2, 0xcbb2], /* Hangul Syllable */
- [0xcbb3, 0xcbb3], /* Hangul Syllable */
- [0xcbb4, 0xcbb4], /* Hangul Syllable */
- [0xcbb5, 0xcbb5], /* Hangul Syllable */
- [0xcbb6, 0xcbb6], /* Hangul Syllable */
- [0xcbb7, 0xcbb7], /* Hangul Syllable */
- [0xcbb8, 0xcbb8], /* Hangul Syllable */
- [0xcbb9, 0xcbb9], /* Hangul Syllable */
- [0xcbba, 0xcbba], /* Hangul Syllable */
- [0xcbbb, 0xcbbb], /* Hangul Syllable */
- [0xcbbc, 0xcbbc], /* Hangul Syllable */
- [0xcbbd, 0xcbbd], /* Hangul Syllable */
- [0xcbbe, 0xcbbe], /* Hangul Syllable */
- [0xcbbf, 0xcbbf], /* Hangul Syllable */
- [0xcbc0, 0xcbc0], /* Hangul Syllable */
- [0xcbc1, 0xcbc1], /* Hangul Syllable */
- [0xcbc2, 0xcbc2], /* Hangul Syllable */
- [0xcbc3, 0xcbc3], /* Hangul Syllable */
- [0xcbc4, 0xcbc4], /* Hangul Syllable */
- [0xcbc5, 0xcbc5], /* Hangul Syllable */
- [0xcbc6, 0xcbc6], /* Hangul Syllable */
- [0xcbc7, 0xcbc7], /* Hangul Syllable */
- [0xcbc8, 0xcbc8], /* Hangul Syllable */
- [0xcbc9, 0xcbc9], /* Hangul Syllable */
- [0xcbca, 0xcbca], /* Hangul Syllable */
- [0xcbcb, 0xcbcb], /* Hangul Syllable */
- [0xcbcc, 0xcbcc], /* Hangul Syllable */
- [0xcbcd, 0xcbcd], /* Hangul Syllable */
- [0xcbce, 0xcbce], /* Hangul Syllable */
- [0xcbcf, 0xcbcf], /* Hangul Syllable */
- [0xcbd0, 0xcbd0], /* Hangul Syllable */
- [0xcbd1, 0xcbd1], /* Hangul Syllable */
- [0xcbd2, 0xcbd2], /* Hangul Syllable */
- [0xcbd3, 0xcbd3], /* Hangul Syllable */
- [0xcbd4, 0xcbd4], /* Hangul Syllable */
- [0xcbd5, 0xcbd5], /* Hangul Syllable */
- [0xcbd6, 0xcbd6], /* Hangul Syllable */
- [0xcbd7, 0xcbd7], /* Hangul Syllable */
- [0xcbd8, 0xcbd8], /* Hangul Syllable */
- [0xcbd9, 0xcbd9], /* Hangul Syllable */
- [0xcbda, 0xcbda], /* Hangul Syllable */
- [0xcbdb, 0xcbdb], /* Hangul Syllable */
- [0xcbdc, 0xcbdc], /* Hangul Syllable */
- [0xcbdd, 0xcbdd], /* Hangul Syllable */
- [0xcbde, 0xcbde], /* Hangul Syllable */
- [0xcbdf, 0xcbdf], /* Hangul Syllable */
- [0xcbe0, 0xcbe0], /* Hangul Syllable */
- [0xcbe1, 0xcbe1], /* Hangul Syllable */
- [0xcbe2, 0xcbe2], /* Hangul Syllable */
- [0xcbe3, 0xcbe3], /* Hangul Syllable */
- [0xcbe4, 0xcbe4], /* Hangul Syllable */
- [0xcbe5, 0xcbe5], /* Hangul Syllable */
- [0xcbe6, 0xcbe6], /* Hangul Syllable */
- [0xcbe7, 0xcbe7], /* Hangul Syllable */
- [0xcbe8, 0xcbe8], /* Hangul Syllable */
- [0xcbe9, 0xcbe9], /* Hangul Syllable */
- [0xcbea, 0xcbea], /* Hangul Syllable */
- [0xcbeb, 0xcbeb], /* Hangul Syllable */
- [0xcbec, 0xcbec], /* Hangul Syllable */
- [0xcbed, 0xcbed], /* Hangul Syllable */
- [0xcbee, 0xcbee], /* Hangul Syllable */
- [0xcbef, 0xcbef], /* Hangul Syllable */
- [0xcbf0, 0xcbf0], /* Hangul Syllable */
- [0xcbf1, 0xcbf1], /* Hangul Syllable */
- [0xcbf2, 0xcbf2], /* Hangul Syllable */
- [0xcbf3, 0xcbf3], /* Hangul Syllable */
- [0xcbf4, 0xcbf4], /* Hangul Syllable */
- [0xcbf5, 0xcbf5], /* Hangul Syllable */
- [0xcbf6, 0xcbf6], /* Hangul Syllable */
- [0xcbf7, 0xcbf7], /* Hangul Syllable */
- [0xcbf8, 0xcbf8], /* Hangul Syllable */
- [0xcbf9, 0xcbf9], /* Hangul Syllable */
- [0xcbfa, 0xcbfa], /* Hangul Syllable */
- [0xcbfb, 0xcbfb], /* Hangul Syllable */
- [0xcbfc, 0xcbfc], /* Hangul Syllable */
- [0xcbfd, 0xcbfd], /* Hangul Syllable */
- [0xcbfe, 0xcbfe], /* Hangul Syllable */
- [0xcbff, 0xcbff], /* Hangul Syllable */
- [0xcc00, 0xcc00], /* Hangul Syllable */
- [0xcc01, 0xcc01], /* Hangul Syllable */
- [0xcc02, 0xcc02], /* Hangul Syllable */
- [0xcc03, 0xcc03], /* Hangul Syllable */
- [0xcc04, 0xcc04], /* Hangul Syllable */
- [0xcc05, 0xcc05], /* Hangul Syllable */
- [0xcc06, 0xcc06], /* Hangul Syllable */
- [0xcc07, 0xcc07], /* Hangul Syllable */
- [0xcc08, 0xcc08], /* Hangul Syllable */
- [0xcc09, 0xcc09], /* Hangul Syllable */
- [0xcc0a, 0xcc0a], /* Hangul Syllable */
- [0xcc0b, 0xcc0b], /* Hangul Syllable */
- [0xcc0c, 0xcc0c], /* Hangul Syllable */
- [0xcc0d, 0xcc0d], /* Hangul Syllable */
- [0xcc0e, 0xcc0e], /* Hangul Syllable */
- [0xcc0f, 0xcc0f], /* Hangul Syllable */
- [0xcc10, 0xcc10], /* Hangul Syllable */
- [0xcc11, 0xcc11], /* Hangul Syllable */
- [0xcc12, 0xcc12], /* Hangul Syllable */
- [0xcc13, 0xcc13], /* Hangul Syllable */
- [0xcc14, 0xcc14], /* Hangul Syllable */
- [0xcc15, 0xcc15], /* Hangul Syllable */
- [0xcc16, 0xcc16], /* Hangul Syllable */
- [0xcc17, 0xcc17], /* Hangul Syllable */
- [0xcc18, 0xcc18], /* Hangul Syllable */
- [0xcc19, 0xcc19], /* Hangul Syllable */
- [0xcc1a, 0xcc1a], /* Hangul Syllable */
- [0xcc1b, 0xcc1b], /* Hangul Syllable */
- [0xcc1c, 0xcc1c], /* Hangul Syllable */
- [0xcc1d, 0xcc1d], /* Hangul Syllable */
- [0xcc1e, 0xcc1e], /* Hangul Syllable */
- [0xcc1f, 0xcc1f], /* Hangul Syllable */
- [0xcc20, 0xcc20], /* Hangul Syllable */
- [0xcc21, 0xcc21], /* Hangul Syllable */
- [0xcc22, 0xcc22], /* Hangul Syllable */
- [0xcc23, 0xcc23], /* Hangul Syllable */
- [0xcc24, 0xcc24], /* Hangul Syllable */
- [0xcc25, 0xcc25], /* Hangul Syllable */
- [0xcc26, 0xcc26], /* Hangul Syllable */
- [0xcc27, 0xcc27], /* Hangul Syllable */
- [0xcc28, 0xcc28], /* Hangul Syllable */
- [0xcc29, 0xcc29], /* Hangul Syllable */
- [0xcc2a, 0xcc2a], /* Hangul Syllable */
- [0xcc2b, 0xcc2b], /* Hangul Syllable */
- [0xcc2c, 0xcc2c], /* Hangul Syllable */
- [0xcc2d, 0xcc2d], /* Hangul Syllable */
- [0xcc2e, 0xcc2e], /* Hangul Syllable */
- [0xcc2f, 0xcc2f], /* Hangul Syllable */
- [0xcc30, 0xcc30], /* Hangul Syllable */
- [0xcc31, 0xcc31], /* Hangul Syllable */
- [0xcc32, 0xcc32], /* Hangul Syllable */
- [0xcc33, 0xcc33], /* Hangul Syllable */
- [0xcc34, 0xcc34], /* Hangul Syllable */
- [0xcc35, 0xcc35], /* Hangul Syllable */
- [0xcc36, 0xcc36], /* Hangul Syllable */
- [0xcc37, 0xcc37], /* Hangul Syllable */
- [0xcc38, 0xcc38], /* Hangul Syllable */
- [0xcc39, 0xcc39], /* Hangul Syllable */
- [0xcc3a, 0xcc3a], /* Hangul Syllable */
- [0xcc3b, 0xcc3b], /* Hangul Syllable */
- [0xcc3c, 0xcc3c], /* Hangul Syllable */
- [0xcc3d, 0xcc3d], /* Hangul Syllable */
- [0xcc3e, 0xcc3e], /* Hangul Syllable */
- [0xcc3f, 0xcc3f], /* Hangul Syllable */
- [0xcc40, 0xcc40], /* Hangul Syllable */
- [0xcc41, 0xcc41], /* Hangul Syllable */
- [0xcc42, 0xcc42], /* Hangul Syllable */
- [0xcc43, 0xcc43], /* Hangul Syllable */
- [0xcc44, 0xcc44], /* Hangul Syllable */
- [0xcc45, 0xcc45], /* Hangul Syllable */
- [0xcc46, 0xcc46], /* Hangul Syllable */
- [0xcc47, 0xcc47], /* Hangul Syllable */
- [0xcc48, 0xcc48], /* Hangul Syllable */
- [0xcc49, 0xcc49], /* Hangul Syllable */
- [0xcc4a, 0xcc4a], /* Hangul Syllable */
- [0xcc4b, 0xcc4b], /* Hangul Syllable */
- [0xcc4c, 0xcc4c], /* Hangul Syllable */
- [0xcc4d, 0xcc4d], /* Hangul Syllable */
- [0xcc4e, 0xcc4e], /* Hangul Syllable */
- [0xcc4f, 0xcc4f], /* Hangul Syllable */
- [0xcc50, 0xcc50], /* Hangul Syllable */
- [0xcc51, 0xcc51], /* Hangul Syllable */
- [0xcc52, 0xcc52], /* Hangul Syllable */
- [0xcc53, 0xcc53], /* Hangul Syllable */
- [0xcc54, 0xcc54], /* Hangul Syllable */
- [0xcc55, 0xcc55], /* Hangul Syllable */
- [0xcc56, 0xcc56], /* Hangul Syllable */
- [0xcc57, 0xcc57], /* Hangul Syllable */
- [0xcc58, 0xcc58], /* Hangul Syllable */
- [0xcc59, 0xcc59], /* Hangul Syllable */
- [0xcc5a, 0xcc5a], /* Hangul Syllable */
- [0xcc5b, 0xcc5b], /* Hangul Syllable */
- [0xcc5c, 0xcc5c], /* Hangul Syllable */
- [0xcc5d, 0xcc5d], /* Hangul Syllable */
- [0xcc5e, 0xcc5e], /* Hangul Syllable */
- [0xcc5f, 0xcc5f], /* Hangul Syllable */
- [0xcc60, 0xcc60], /* Hangul Syllable */
- [0xcc61, 0xcc61], /* Hangul Syllable */
- [0xcc62, 0xcc62], /* Hangul Syllable */
- [0xcc63, 0xcc63], /* Hangul Syllable */
- [0xcc64, 0xcc64], /* Hangul Syllable */
- [0xcc65, 0xcc65], /* Hangul Syllable */
- [0xcc66, 0xcc66], /* Hangul Syllable */
- [0xcc67, 0xcc67], /* Hangul Syllable */
- [0xcc68, 0xcc68], /* Hangul Syllable */
- [0xcc69, 0xcc69], /* Hangul Syllable */
- [0xcc6a, 0xcc6a], /* Hangul Syllable */
- [0xcc6b, 0xcc6b], /* Hangul Syllable */
- [0xcc6c, 0xcc6c], /* Hangul Syllable */
- [0xcc6d, 0xcc6d], /* Hangul Syllable */
- [0xcc6e, 0xcc6e], /* Hangul Syllable */
- [0xcc6f, 0xcc6f], /* Hangul Syllable */
- [0xcc70, 0xcc70], /* Hangul Syllable */
- [0xcc71, 0xcc71], /* Hangul Syllable */
- [0xcc72, 0xcc72], /* Hangul Syllable */
- [0xcc73, 0xcc73], /* Hangul Syllable */
- [0xcc74, 0xcc74], /* Hangul Syllable */
- [0xcc75, 0xcc75], /* Hangul Syllable */
- [0xcc76, 0xcc76], /* Hangul Syllable */
- [0xcc77, 0xcc77], /* Hangul Syllable */
- [0xcc78, 0xcc78], /* Hangul Syllable */
- [0xcc79, 0xcc79], /* Hangul Syllable */
- [0xcc7a, 0xcc7a], /* Hangul Syllable */
- [0xcc7b, 0xcc7b], /* Hangul Syllable */
- [0xcc7c, 0xcc7c], /* Hangul Syllable */
- [0xcc7d, 0xcc7d], /* Hangul Syllable */
- [0xcc7e, 0xcc7e], /* Hangul Syllable */
- [0xcc7f, 0xcc7f], /* Hangul Syllable */
- [0xcc80, 0xcc80], /* Hangul Syllable */
- [0xcc81, 0xcc81], /* Hangul Syllable */
- [0xcc82, 0xcc82], /* Hangul Syllable */
- [0xcc83, 0xcc83], /* Hangul Syllable */
- [0xcc84, 0xcc84], /* Hangul Syllable */
- [0xcc85, 0xcc85], /* Hangul Syllable */
- [0xcc86, 0xcc86], /* Hangul Syllable */
- [0xcc87, 0xcc87], /* Hangul Syllable */
- [0xcc88, 0xcc88], /* Hangul Syllable */
- [0xcc89, 0xcc89], /* Hangul Syllable */
- [0xcc8a, 0xcc8a], /* Hangul Syllable */
- [0xcc8b, 0xcc8b], /* Hangul Syllable */
- [0xcc8c, 0xcc8c], /* Hangul Syllable */
- [0xcc8d, 0xcc8d], /* Hangul Syllable */
- [0xcc8e, 0xcc8e], /* Hangul Syllable */
- [0xcc8f, 0xcc8f], /* Hangul Syllable */
- [0xcc90, 0xcc90], /* Hangul Syllable */
- [0xcc91, 0xcc91], /* Hangul Syllable */
- [0xcc92, 0xcc92], /* Hangul Syllable */
- [0xcc93, 0xcc93], /* Hangul Syllable */
- [0xcc94, 0xcc94], /* Hangul Syllable */
- [0xcc95, 0xcc95], /* Hangul Syllable */
- [0xcc96, 0xcc96], /* Hangul Syllable */
- [0xcc97, 0xcc97], /* Hangul Syllable */
- [0xcc98, 0xcc98], /* Hangul Syllable */
- [0xcc99, 0xcc99], /* Hangul Syllable */
- [0xcc9a, 0xcc9a], /* Hangul Syllable */
- [0xcc9b, 0xcc9b], /* Hangul Syllable */
- [0xcc9c, 0xcc9c], /* Hangul Syllable */
- [0xcc9d, 0xcc9d], /* Hangul Syllable */
- [0xcc9e, 0xcc9e], /* Hangul Syllable */
- [0xcc9f, 0xcc9f], /* Hangul Syllable */
- [0xcca0, 0xcca0], /* Hangul Syllable */
- [0xcca1, 0xcca1], /* Hangul Syllable */
- [0xcca2, 0xcca2], /* Hangul Syllable */
- [0xcca3, 0xcca3], /* Hangul Syllable */
- [0xcca4, 0xcca4], /* Hangul Syllable */
- [0xcca5, 0xcca5], /* Hangul Syllable */
- [0xcca6, 0xcca6], /* Hangul Syllable */
- [0xcca7, 0xcca7], /* Hangul Syllable */
- [0xcca8, 0xcca8], /* Hangul Syllable */
- [0xcca9, 0xcca9], /* Hangul Syllable */
- [0xccaa, 0xccaa], /* Hangul Syllable */
- [0xccab, 0xccab], /* Hangul Syllable */
- [0xccac, 0xccac], /* Hangul Syllable */
- [0xccad, 0xccad], /* Hangul Syllable */
- [0xccae, 0xccae], /* Hangul Syllable */
- [0xccaf, 0xccaf], /* Hangul Syllable */
- [0xccb0, 0xccb0], /* Hangul Syllable */
- [0xccb1, 0xccb1], /* Hangul Syllable */
- [0xccb2, 0xccb2], /* Hangul Syllable */
- [0xccb3, 0xccb3], /* Hangul Syllable */
- [0xccb4, 0xccb4], /* Hangul Syllable */
- [0xccb5, 0xccb5], /* Hangul Syllable */
- [0xccb6, 0xccb6], /* Hangul Syllable */
- [0xccb7, 0xccb7], /* Hangul Syllable */
- [0xccb8, 0xccb8], /* Hangul Syllable */
- [0xccb9, 0xccb9], /* Hangul Syllable */
- [0xccba, 0xccba], /* Hangul Syllable */
- [0xccbb, 0xccbb], /* Hangul Syllable */
- [0xccbc, 0xccbc], /* Hangul Syllable */
- [0xccbd, 0xccbd], /* Hangul Syllable */
- [0xccbe, 0xccbe], /* Hangul Syllable */
- [0xccbf, 0xccbf], /* Hangul Syllable */
- [0xccc0, 0xccc0], /* Hangul Syllable */
- [0xccc1, 0xccc1], /* Hangul Syllable */
- [0xccc2, 0xccc2], /* Hangul Syllable */
- [0xccc3, 0xccc3], /* Hangul Syllable */
- [0xccc4, 0xccc4], /* Hangul Syllable */
- [0xccc5, 0xccc5], /* Hangul Syllable */
- [0xccc6, 0xccc6], /* Hangul Syllable */
- [0xccc7, 0xccc7], /* Hangul Syllable */
- [0xccc8, 0xccc8], /* Hangul Syllable */
- [0xccc9, 0xccc9], /* Hangul Syllable */
- [0xccca, 0xccca], /* Hangul Syllable */
- [0xcccb, 0xcccb], /* Hangul Syllable */
- [0xcccc, 0xcccc], /* Hangul Syllable */
- [0xcccd, 0xcccd], /* Hangul Syllable */
- [0xccce, 0xccce], /* Hangul Syllable */
- [0xcccf, 0xcccf], /* Hangul Syllable */
- [0xccd0, 0xccd0], /* Hangul Syllable */
- [0xccd1, 0xccd1], /* Hangul Syllable */
- [0xccd2, 0xccd2], /* Hangul Syllable */
- [0xccd3, 0xccd3], /* Hangul Syllable */
- [0xccd4, 0xccd4], /* Hangul Syllable */
- [0xccd5, 0xccd5], /* Hangul Syllable */
- [0xccd6, 0xccd6], /* Hangul Syllable */
- [0xccd7, 0xccd7], /* Hangul Syllable */
- [0xccd8, 0xccd8], /* Hangul Syllable */
- [0xccd9, 0xccd9], /* Hangul Syllable */
- [0xccda, 0xccda], /* Hangul Syllable */
- [0xccdb, 0xccdb], /* Hangul Syllable */
- [0xccdc, 0xccdc], /* Hangul Syllable */
- [0xccdd, 0xccdd], /* Hangul Syllable */
- [0xccde, 0xccde], /* Hangul Syllable */
- [0xccdf, 0xccdf], /* Hangul Syllable */
- [0xcce0, 0xcce0], /* Hangul Syllable */
- [0xcce1, 0xcce1], /* Hangul Syllable */
- [0xcce2, 0xcce2], /* Hangul Syllable */
- [0xcce3, 0xcce3], /* Hangul Syllable */
- [0xcce4, 0xcce4], /* Hangul Syllable */
- [0xcce5, 0xcce5], /* Hangul Syllable */
- [0xcce6, 0xcce6], /* Hangul Syllable */
- [0xcce7, 0xcce7], /* Hangul Syllable */
- [0xcce8, 0xcce8], /* Hangul Syllable */
- [0xcce9, 0xcce9], /* Hangul Syllable */
- [0xccea, 0xccea], /* Hangul Syllable */
- [0xcceb, 0xcceb], /* Hangul Syllable */
- [0xccec, 0xccec], /* Hangul Syllable */
- [0xcced, 0xcced], /* Hangul Syllable */
- [0xccee, 0xccee], /* Hangul Syllable */
- [0xccef, 0xccef], /* Hangul Syllable */
- [0xccf0, 0xccf0], /* Hangul Syllable */
- [0xccf1, 0xccf1], /* Hangul Syllable */
- [0xccf2, 0xccf2], /* Hangul Syllable */
- [0xccf3, 0xccf3], /* Hangul Syllable */
- [0xccf4, 0xccf4], /* Hangul Syllable */
- [0xccf5, 0xccf5], /* Hangul Syllable */
- [0xccf6, 0xccf6], /* Hangul Syllable */
- [0xccf7, 0xccf7], /* Hangul Syllable */
- [0xccf8, 0xccf8], /* Hangul Syllable */
- [0xccf9, 0xccf9], /* Hangul Syllable */
- [0xccfa, 0xccfa], /* Hangul Syllable */
- [0xccfb, 0xccfb], /* Hangul Syllable */
- [0xccfc, 0xccfc], /* Hangul Syllable */
- [0xccfd, 0xccfd], /* Hangul Syllable */
- [0xccfe, 0xccfe], /* Hangul Syllable */
- [0xccff, 0xccff], /* Hangul Syllable */
- [0xcd00, 0xcd00], /* Hangul Syllable */
- [0xcd01, 0xcd01], /* Hangul Syllable */
- [0xcd02, 0xcd02], /* Hangul Syllable */
- [0xcd03, 0xcd03], /* Hangul Syllable */
- [0xcd04, 0xcd04], /* Hangul Syllable */
- [0xcd05, 0xcd05], /* Hangul Syllable */
- [0xcd06, 0xcd06], /* Hangul Syllable */
- [0xcd07, 0xcd07], /* Hangul Syllable */
- [0xcd08, 0xcd08], /* Hangul Syllable */
- [0xcd09, 0xcd09], /* Hangul Syllable */
- [0xcd0a, 0xcd0a], /* Hangul Syllable */
- [0xcd0b, 0xcd0b], /* Hangul Syllable */
- [0xcd0c, 0xcd0c], /* Hangul Syllable */
- [0xcd0d, 0xcd0d], /* Hangul Syllable */
- [0xcd0e, 0xcd0e], /* Hangul Syllable */
- [0xcd0f, 0xcd0f], /* Hangul Syllable */
- [0xcd10, 0xcd10], /* Hangul Syllable */
- [0xcd11, 0xcd11], /* Hangul Syllable */
- [0xcd12, 0xcd12], /* Hangul Syllable */
- [0xcd13, 0xcd13], /* Hangul Syllable */
- [0xcd14, 0xcd14], /* Hangul Syllable */
- [0xcd15, 0xcd15], /* Hangul Syllable */
- [0xcd16, 0xcd16], /* Hangul Syllable */
- [0xcd17, 0xcd17], /* Hangul Syllable */
- [0xcd18, 0xcd18], /* Hangul Syllable */
- [0xcd19, 0xcd19], /* Hangul Syllable */
- [0xcd1a, 0xcd1a], /* Hangul Syllable */
- [0xcd1b, 0xcd1b], /* Hangul Syllable */
- [0xcd1c, 0xcd1c], /* Hangul Syllable */
- [0xcd1d, 0xcd1d], /* Hangul Syllable */
- [0xcd1e, 0xcd1e], /* Hangul Syllable */
- [0xcd1f, 0xcd1f], /* Hangul Syllable */
- [0xcd20, 0xcd20], /* Hangul Syllable */
- [0xcd21, 0xcd21], /* Hangul Syllable */
- [0xcd22, 0xcd22], /* Hangul Syllable */
- [0xcd23, 0xcd23], /* Hangul Syllable */
- [0xcd24, 0xcd24], /* Hangul Syllable */
- [0xcd25, 0xcd25], /* Hangul Syllable */
- [0xcd26, 0xcd26], /* Hangul Syllable */
- [0xcd27, 0xcd27], /* Hangul Syllable */
- [0xcd28, 0xcd28], /* Hangul Syllable */
- [0xcd29, 0xcd29], /* Hangul Syllable */
- [0xcd2a, 0xcd2a], /* Hangul Syllable */
- [0xcd2b, 0xcd2b], /* Hangul Syllable */
- [0xcd2c, 0xcd2c], /* Hangul Syllable */
- [0xcd2d, 0xcd2d], /* Hangul Syllable */
- [0xcd2e, 0xcd2e], /* Hangul Syllable */
- [0xcd2f, 0xcd2f], /* Hangul Syllable */
- [0xcd30, 0xcd30], /* Hangul Syllable */
- [0xcd31, 0xcd31], /* Hangul Syllable */
- [0xcd32, 0xcd32], /* Hangul Syllable */
- [0xcd33, 0xcd33], /* Hangul Syllable */
- [0xcd34, 0xcd34], /* Hangul Syllable */
- [0xcd35, 0xcd35], /* Hangul Syllable */
- [0xcd36, 0xcd36], /* Hangul Syllable */
- [0xcd37, 0xcd37], /* Hangul Syllable */
- [0xcd38, 0xcd38], /* Hangul Syllable */
- [0xcd39, 0xcd39], /* Hangul Syllable */
- [0xcd3a, 0xcd3a], /* Hangul Syllable */
- [0xcd3b, 0xcd3b], /* Hangul Syllable */
- [0xcd3c, 0xcd3c], /* Hangul Syllable */
- [0xcd3d, 0xcd3d], /* Hangul Syllable */
- [0xcd3e, 0xcd3e], /* Hangul Syllable */
- [0xcd3f, 0xcd3f], /* Hangul Syllable */
- [0xcd40, 0xcd40], /* Hangul Syllable */
- [0xcd41, 0xcd41], /* Hangul Syllable */
- [0xcd42, 0xcd42], /* Hangul Syllable */
- [0xcd43, 0xcd43], /* Hangul Syllable */
- [0xcd44, 0xcd44], /* Hangul Syllable */
- [0xcd45, 0xcd45], /* Hangul Syllable */
- [0xcd46, 0xcd46], /* Hangul Syllable */
- [0xcd47, 0xcd47], /* Hangul Syllable */
- [0xcd48, 0xcd48], /* Hangul Syllable */
- [0xcd49, 0xcd49], /* Hangul Syllable */
- [0xcd4a, 0xcd4a], /* Hangul Syllable */
- [0xcd4b, 0xcd4b], /* Hangul Syllable */
- [0xcd4c, 0xcd4c], /* Hangul Syllable */
- [0xcd4d, 0xcd4d], /* Hangul Syllable */
- [0xcd4e, 0xcd4e], /* Hangul Syllable */
- [0xcd4f, 0xcd4f], /* Hangul Syllable */
- [0xcd50, 0xcd50], /* Hangul Syllable */
- [0xcd51, 0xcd51], /* Hangul Syllable */
- [0xcd52, 0xcd52], /* Hangul Syllable */
- [0xcd53, 0xcd53], /* Hangul Syllable */
- [0xcd54, 0xcd54], /* Hangul Syllable */
- [0xcd55, 0xcd55], /* Hangul Syllable */
- [0xcd56, 0xcd56], /* Hangul Syllable */
- [0xcd57, 0xcd57], /* Hangul Syllable */
- [0xcd58, 0xcd58], /* Hangul Syllable */
- [0xcd59, 0xcd59], /* Hangul Syllable */
- [0xcd5a, 0xcd5a], /* Hangul Syllable */
- [0xcd5b, 0xcd5b], /* Hangul Syllable */
- [0xcd5c, 0xcd5c], /* Hangul Syllable */
- [0xcd5d, 0xcd5d], /* Hangul Syllable */
- [0xcd5e, 0xcd5e], /* Hangul Syllable */
- [0xcd5f, 0xcd5f], /* Hangul Syllable */
- [0xcd60, 0xcd60], /* Hangul Syllable */
- [0xcd61, 0xcd61], /* Hangul Syllable */
- [0xcd62, 0xcd62], /* Hangul Syllable */
- [0xcd63, 0xcd63], /* Hangul Syllable */
- [0xcd64, 0xcd64], /* Hangul Syllable */
- [0xcd65, 0xcd65], /* Hangul Syllable */
- [0xcd66, 0xcd66], /* Hangul Syllable */
- [0xcd67, 0xcd67], /* Hangul Syllable */
- [0xcd68, 0xcd68], /* Hangul Syllable */
- [0xcd69, 0xcd69], /* Hangul Syllable */
- [0xcd6a, 0xcd6a], /* Hangul Syllable */
- [0xcd6b, 0xcd6b], /* Hangul Syllable */
- [0xcd6c, 0xcd6c], /* Hangul Syllable */
- [0xcd6d, 0xcd6d], /* Hangul Syllable */
- [0xcd6e, 0xcd6e], /* Hangul Syllable */
- [0xcd6f, 0xcd6f], /* Hangul Syllable */
- [0xcd70, 0xcd70], /* Hangul Syllable */
- [0xcd71, 0xcd71], /* Hangul Syllable */
- [0xcd72, 0xcd72], /* Hangul Syllable */
- [0xcd73, 0xcd73], /* Hangul Syllable */
- [0xcd74, 0xcd74], /* Hangul Syllable */
- [0xcd75, 0xcd75], /* Hangul Syllable */
- [0xcd76, 0xcd76], /* Hangul Syllable */
- [0xcd77, 0xcd77], /* Hangul Syllable */
- [0xcd78, 0xcd78], /* Hangul Syllable */
- [0xcd79, 0xcd79], /* Hangul Syllable */
- [0xcd7a, 0xcd7a], /* Hangul Syllable */
- [0xcd7b, 0xcd7b], /* Hangul Syllable */
- [0xcd7c, 0xcd7c], /* Hangul Syllable */
- [0xcd7d, 0xcd7d], /* Hangul Syllable */
- [0xcd7e, 0xcd7e], /* Hangul Syllable */
- [0xcd7f, 0xcd7f], /* Hangul Syllable */
- [0xcd80, 0xcd80], /* Hangul Syllable */
- [0xcd81, 0xcd81], /* Hangul Syllable */
- [0xcd82, 0xcd82], /* Hangul Syllable */
- [0xcd83, 0xcd83], /* Hangul Syllable */
- [0xcd84, 0xcd84], /* Hangul Syllable */
- [0xcd85, 0xcd85], /* Hangul Syllable */
- [0xcd86, 0xcd86], /* Hangul Syllable */
- [0xcd87, 0xcd87], /* Hangul Syllable */
- [0xcd88, 0xcd88], /* Hangul Syllable */
- [0xcd89, 0xcd89], /* Hangul Syllable */
- [0xcd8a, 0xcd8a], /* Hangul Syllable */
- [0xcd8b, 0xcd8b], /* Hangul Syllable */
- [0xcd8c, 0xcd8c], /* Hangul Syllable */
- [0xcd8d, 0xcd8d], /* Hangul Syllable */
- [0xcd8e, 0xcd8e], /* Hangul Syllable */
- [0xcd8f, 0xcd8f], /* Hangul Syllable */
- [0xcd90, 0xcd90], /* Hangul Syllable */
- [0xcd91, 0xcd91], /* Hangul Syllable */
- [0xcd92, 0xcd92], /* Hangul Syllable */
- [0xcd93, 0xcd93], /* Hangul Syllable */
- [0xcd94, 0xcd94], /* Hangul Syllable */
- [0xcd95, 0xcd95], /* Hangul Syllable */
- [0xcd96, 0xcd96], /* Hangul Syllable */
- [0xcd97, 0xcd97], /* Hangul Syllable */
- [0xcd98, 0xcd98], /* Hangul Syllable */
- [0xcd99, 0xcd99], /* Hangul Syllable */
- [0xcd9a, 0xcd9a], /* Hangul Syllable */
- [0xcd9b, 0xcd9b], /* Hangul Syllable */
- [0xcd9c, 0xcd9c], /* Hangul Syllable */
- [0xcd9d, 0xcd9d], /* Hangul Syllable */
- [0xcd9e, 0xcd9e], /* Hangul Syllable */
- [0xcd9f, 0xcd9f], /* Hangul Syllable */
- [0xcda0, 0xcda0], /* Hangul Syllable */
- [0xcda1, 0xcda1], /* Hangul Syllable */
- [0xcda2, 0xcda2], /* Hangul Syllable */
- [0xcda3, 0xcda3], /* Hangul Syllable */
- [0xcda4, 0xcda4], /* Hangul Syllable */
- [0xcda5, 0xcda5], /* Hangul Syllable */
- [0xcda6, 0xcda6], /* Hangul Syllable */
- [0xcda7, 0xcda7], /* Hangul Syllable */
- [0xcda8, 0xcda8], /* Hangul Syllable */
- [0xcda9, 0xcda9], /* Hangul Syllable */
- [0xcdaa, 0xcdaa], /* Hangul Syllable */
- [0xcdab, 0xcdab], /* Hangul Syllable */
- [0xcdac, 0xcdac], /* Hangul Syllable */
- [0xcdad, 0xcdad], /* Hangul Syllable */
- [0xcdae, 0xcdae], /* Hangul Syllable */
- [0xcdaf, 0xcdaf], /* Hangul Syllable */
- [0xcdb0, 0xcdb0], /* Hangul Syllable */
- [0xcdb1, 0xcdb1], /* Hangul Syllable */
- [0xcdb2, 0xcdb2], /* Hangul Syllable */
- [0xcdb3, 0xcdb3], /* Hangul Syllable */
- [0xcdb4, 0xcdb4], /* Hangul Syllable */
- [0xcdb5, 0xcdb5], /* Hangul Syllable */
- [0xcdb6, 0xcdb6], /* Hangul Syllable */
- [0xcdb7, 0xcdb7], /* Hangul Syllable */
- [0xcdb8, 0xcdb8], /* Hangul Syllable */
- [0xcdb9, 0xcdb9], /* Hangul Syllable */
- [0xcdba, 0xcdba], /* Hangul Syllable */
- [0xcdbb, 0xcdbb], /* Hangul Syllable */
- [0xcdbc, 0xcdbc], /* Hangul Syllable */
- [0xcdbd, 0xcdbd], /* Hangul Syllable */
- [0xcdbe, 0xcdbe], /* Hangul Syllable */
- [0xcdbf, 0xcdbf], /* Hangul Syllable */
- [0xcdc0, 0xcdc0], /* Hangul Syllable */
- [0xcdc1, 0xcdc1], /* Hangul Syllable */
- [0xcdc2, 0xcdc2], /* Hangul Syllable */
- [0xcdc3, 0xcdc3], /* Hangul Syllable */
- [0xcdc4, 0xcdc4], /* Hangul Syllable */
- [0xcdc5, 0xcdc5], /* Hangul Syllable */
- [0xcdc6, 0xcdc6], /* Hangul Syllable */
- [0xcdc7, 0xcdc7], /* Hangul Syllable */
- [0xcdc8, 0xcdc8], /* Hangul Syllable */
- [0xcdc9, 0xcdc9], /* Hangul Syllable */
- [0xcdca, 0xcdca], /* Hangul Syllable */
- [0xcdcb, 0xcdcb], /* Hangul Syllable */
- [0xcdcc, 0xcdcc], /* Hangul Syllable */
- [0xcdcd, 0xcdcd], /* Hangul Syllable */
- [0xcdce, 0xcdce], /* Hangul Syllable */
- [0xcdcf, 0xcdcf], /* Hangul Syllable */
- [0xcdd0, 0xcdd0], /* Hangul Syllable */
- [0xcdd1, 0xcdd1], /* Hangul Syllable */
- [0xcdd2, 0xcdd2], /* Hangul Syllable */
- [0xcdd3, 0xcdd3], /* Hangul Syllable */
- [0xcdd4, 0xcdd4], /* Hangul Syllable */
- [0xcdd5, 0xcdd5], /* Hangul Syllable */
- [0xcdd6, 0xcdd6], /* Hangul Syllable */
- [0xcdd7, 0xcdd7], /* Hangul Syllable */
- [0xcdd8, 0xcdd8], /* Hangul Syllable */
- [0xcdd9, 0xcdd9], /* Hangul Syllable */
- [0xcdda, 0xcdda], /* Hangul Syllable */
- [0xcddb, 0xcddb], /* Hangul Syllable */
- [0xcddc, 0xcddc], /* Hangul Syllable */
- [0xcddd, 0xcddd], /* Hangul Syllable */
- [0xcdde, 0xcdde], /* Hangul Syllable */
- [0xcddf, 0xcddf], /* Hangul Syllable */
- [0xcde0, 0xcde0], /* Hangul Syllable */
- [0xcde1, 0xcde1], /* Hangul Syllable */
- [0xcde2, 0xcde2], /* Hangul Syllable */
- [0xcde3, 0xcde3], /* Hangul Syllable */
- [0xcde4, 0xcde4], /* Hangul Syllable */
- [0xcde5, 0xcde5], /* Hangul Syllable */
- [0xcde6, 0xcde6], /* Hangul Syllable */
- [0xcde7, 0xcde7], /* Hangul Syllable */
- [0xcde8, 0xcde8], /* Hangul Syllable */
- [0xcde9, 0xcde9], /* Hangul Syllable */
- [0xcdea, 0xcdea], /* Hangul Syllable */
- [0xcdeb, 0xcdeb], /* Hangul Syllable */
- [0xcdec, 0xcdec], /* Hangul Syllable */
- [0xcded, 0xcded], /* Hangul Syllable */
- [0xcdee, 0xcdee], /* Hangul Syllable */
- [0xcdef, 0xcdef], /* Hangul Syllable */
- [0xcdf0, 0xcdf0], /* Hangul Syllable */
- [0xcdf1, 0xcdf1], /* Hangul Syllable */
- [0xcdf2, 0xcdf2], /* Hangul Syllable */
- [0xcdf3, 0xcdf3], /* Hangul Syllable */
- [0xcdf4, 0xcdf4], /* Hangul Syllable */
- [0xcdf5, 0xcdf5], /* Hangul Syllable */
- [0xcdf6, 0xcdf6], /* Hangul Syllable */
- [0xcdf7, 0xcdf7], /* Hangul Syllable */
- [0xcdf8, 0xcdf8], /* Hangul Syllable */
- [0xcdf9, 0xcdf9], /* Hangul Syllable */
- [0xcdfa, 0xcdfa], /* Hangul Syllable */
- [0xcdfb, 0xcdfb], /* Hangul Syllable */
- [0xcdfc, 0xcdfc], /* Hangul Syllable */
- [0xcdfd, 0xcdfd], /* Hangul Syllable */
- [0xcdfe, 0xcdfe], /* Hangul Syllable */
- [0xcdff, 0xcdff], /* Hangul Syllable */
- [0xce00, 0xce00], /* Hangul Syllable */
- [0xce01, 0xce01], /* Hangul Syllable */
- [0xce02, 0xce02], /* Hangul Syllable */
- [0xce03, 0xce03], /* Hangul Syllable */
- [0xce04, 0xce04], /* Hangul Syllable */
- [0xce05, 0xce05], /* Hangul Syllable */
- [0xce06, 0xce06], /* Hangul Syllable */
- [0xce07, 0xce07], /* Hangul Syllable */
- [0xce08, 0xce08], /* Hangul Syllable */
- [0xce09, 0xce09], /* Hangul Syllable */
- [0xce0a, 0xce0a], /* Hangul Syllable */
- [0xce0b, 0xce0b], /* Hangul Syllable */
- [0xce0c, 0xce0c], /* Hangul Syllable */
- [0xce0d, 0xce0d], /* Hangul Syllable */
- [0xce0e, 0xce0e], /* Hangul Syllable */
- [0xce0f, 0xce0f], /* Hangul Syllable */
- [0xce10, 0xce10], /* Hangul Syllable */
- [0xce11, 0xce11], /* Hangul Syllable */
- [0xce12, 0xce12], /* Hangul Syllable */
- [0xce13, 0xce13], /* Hangul Syllable */
- [0xce14, 0xce14], /* Hangul Syllable */
- [0xce15, 0xce15], /* Hangul Syllable */
- [0xce16, 0xce16], /* Hangul Syllable */
- [0xce17, 0xce17], /* Hangul Syllable */
- [0xce18, 0xce18], /* Hangul Syllable */
- [0xce19, 0xce19], /* Hangul Syllable */
- [0xce1a, 0xce1a], /* Hangul Syllable */
- [0xce1b, 0xce1b], /* Hangul Syllable */
- [0xce1c, 0xce1c], /* Hangul Syllable */
- [0xce1d, 0xce1d], /* Hangul Syllable */
- [0xce1e, 0xce1e], /* Hangul Syllable */
- [0xce1f, 0xce1f], /* Hangul Syllable */
- [0xce20, 0xce20], /* Hangul Syllable */
- [0xce21, 0xce21], /* Hangul Syllable */
- [0xce22, 0xce22], /* Hangul Syllable */
- [0xce23, 0xce23], /* Hangul Syllable */
- [0xce24, 0xce24], /* Hangul Syllable */
- [0xce25, 0xce25], /* Hangul Syllable */
- [0xce26, 0xce26], /* Hangul Syllable */
- [0xce27, 0xce27], /* Hangul Syllable */
- [0xce28, 0xce28], /* Hangul Syllable */
- [0xce29, 0xce29], /* Hangul Syllable */
- [0xce2a, 0xce2a], /* Hangul Syllable */
- [0xce2b, 0xce2b], /* Hangul Syllable */
- [0xce2c, 0xce2c], /* Hangul Syllable */
- [0xce2d, 0xce2d], /* Hangul Syllable */
- [0xce2e, 0xce2e], /* Hangul Syllable */
- [0xce2f, 0xce2f], /* Hangul Syllable */
- [0xce30, 0xce30], /* Hangul Syllable */
- [0xce31, 0xce31], /* Hangul Syllable */
- [0xce32, 0xce32], /* Hangul Syllable */
- [0xce33, 0xce33], /* Hangul Syllable */
- [0xce34, 0xce34], /* Hangul Syllable */
- [0xce35, 0xce35], /* Hangul Syllable */
- [0xce36, 0xce36], /* Hangul Syllable */
- [0xce37, 0xce37], /* Hangul Syllable */
- [0xce38, 0xce38], /* Hangul Syllable */
- [0xce39, 0xce39], /* Hangul Syllable */
- [0xce3a, 0xce3a], /* Hangul Syllable */
- [0xce3b, 0xce3b], /* Hangul Syllable */
- [0xce3c, 0xce3c], /* Hangul Syllable */
- [0xce3d, 0xce3d], /* Hangul Syllable */
- [0xce3e, 0xce3e], /* Hangul Syllable */
- [0xce3f, 0xce3f], /* Hangul Syllable */
- [0xce40, 0xce40], /* Hangul Syllable */
- [0xce41, 0xce41], /* Hangul Syllable */
- [0xce42, 0xce42], /* Hangul Syllable */
- [0xce43, 0xce43], /* Hangul Syllable */
- [0xce44, 0xce44], /* Hangul Syllable */
- [0xce45, 0xce45], /* Hangul Syllable */
- [0xce46, 0xce46], /* Hangul Syllable */
- [0xce47, 0xce47], /* Hangul Syllable */
- [0xce48, 0xce48], /* Hangul Syllable */
- [0xce49, 0xce49], /* Hangul Syllable */
- [0xce4a, 0xce4a], /* Hangul Syllable */
- [0xce4b, 0xce4b], /* Hangul Syllable */
- [0xce4c, 0xce4c], /* Hangul Syllable */
- [0xce4d, 0xce4d], /* Hangul Syllable */
- [0xce4e, 0xce4e], /* Hangul Syllable */
- [0xce4f, 0xce4f], /* Hangul Syllable */
- [0xce50, 0xce50], /* Hangul Syllable */
- [0xce51, 0xce51], /* Hangul Syllable */
- [0xce52, 0xce52], /* Hangul Syllable */
- [0xce53, 0xce53], /* Hangul Syllable */
- [0xce54, 0xce54], /* Hangul Syllable */
- [0xce55, 0xce55], /* Hangul Syllable */
- [0xce56, 0xce56], /* Hangul Syllable */
- [0xce57, 0xce57], /* Hangul Syllable */
- [0xce58, 0xce58], /* Hangul Syllable */
- [0xce59, 0xce59], /* Hangul Syllable */
- [0xce5a, 0xce5a], /* Hangul Syllable */
- [0xce5b, 0xce5b], /* Hangul Syllable */
- [0xce5c, 0xce5c], /* Hangul Syllable */
- [0xce5d, 0xce5d], /* Hangul Syllable */
- [0xce5e, 0xce5e], /* Hangul Syllable */
- [0xce5f, 0xce5f], /* Hangul Syllable */
- [0xce60, 0xce60], /* Hangul Syllable */
- [0xce61, 0xce61], /* Hangul Syllable */
- [0xce62, 0xce62], /* Hangul Syllable */
- [0xce63, 0xce63], /* Hangul Syllable */
- [0xce64, 0xce64], /* Hangul Syllable */
- [0xce65, 0xce65], /* Hangul Syllable */
- [0xce66, 0xce66], /* Hangul Syllable */
- [0xce67, 0xce67], /* Hangul Syllable */
- [0xce68, 0xce68], /* Hangul Syllable */
- [0xce69, 0xce69], /* Hangul Syllable */
- [0xce6a, 0xce6a], /* Hangul Syllable */
- [0xce6b, 0xce6b], /* Hangul Syllable */
- [0xce6c, 0xce6c], /* Hangul Syllable */
- [0xce6d, 0xce6d], /* Hangul Syllable */
- [0xce6e, 0xce6e], /* Hangul Syllable */
- [0xce6f, 0xce6f], /* Hangul Syllable */
- [0xce70, 0xce70], /* Hangul Syllable */
- [0xce71, 0xce71], /* Hangul Syllable */
- [0xce72, 0xce72], /* Hangul Syllable */
- [0xce73, 0xce73], /* Hangul Syllable */
- [0xce74, 0xce74], /* Hangul Syllable */
- [0xce75, 0xce75], /* Hangul Syllable */
- [0xce76, 0xce76], /* Hangul Syllable */
- [0xce77, 0xce77], /* Hangul Syllable */
- [0xce78, 0xce78], /* Hangul Syllable */
- [0xce79, 0xce79], /* Hangul Syllable */
- [0xce7a, 0xce7a], /* Hangul Syllable */
- [0xce7b, 0xce7b], /* Hangul Syllable */
- [0xce7c, 0xce7c], /* Hangul Syllable */
- [0xce7d, 0xce7d], /* Hangul Syllable */
- [0xce7e, 0xce7e], /* Hangul Syllable */
- [0xce7f, 0xce7f], /* Hangul Syllable */
- [0xce80, 0xce80], /* Hangul Syllable */
- [0xce81, 0xce81], /* Hangul Syllable */
- [0xce82, 0xce82], /* Hangul Syllable */
- [0xce83, 0xce83], /* Hangul Syllable */
- [0xce84, 0xce84], /* Hangul Syllable */
- [0xce85, 0xce85], /* Hangul Syllable */
- [0xce86, 0xce86], /* Hangul Syllable */
- [0xce87, 0xce87], /* Hangul Syllable */
- [0xce88, 0xce88], /* Hangul Syllable */
- [0xce89, 0xce89], /* Hangul Syllable */
- [0xce8a, 0xce8a], /* Hangul Syllable */
- [0xce8b, 0xce8b], /* Hangul Syllable */
- [0xce8c, 0xce8c], /* Hangul Syllable */
- [0xce8d, 0xce8d], /* Hangul Syllable */
- [0xce8e, 0xce8e], /* Hangul Syllable */
- [0xce8f, 0xce8f], /* Hangul Syllable */
- [0xce90, 0xce90], /* Hangul Syllable */
- [0xce91, 0xce91], /* Hangul Syllable */
- [0xce92, 0xce92], /* Hangul Syllable */
- [0xce93, 0xce93], /* Hangul Syllable */
- [0xce94, 0xce94], /* Hangul Syllable */
- [0xce95, 0xce95], /* Hangul Syllable */
- [0xce96, 0xce96], /* Hangul Syllable */
- [0xce97, 0xce97], /* Hangul Syllable */
- [0xce98, 0xce98], /* Hangul Syllable */
- [0xce99, 0xce99], /* Hangul Syllable */
- [0xce9a, 0xce9a], /* Hangul Syllable */
- [0xce9b, 0xce9b], /* Hangul Syllable */
- [0xce9c, 0xce9c], /* Hangul Syllable */
- [0xce9d, 0xce9d], /* Hangul Syllable */
- [0xce9e, 0xce9e], /* Hangul Syllable */
- [0xce9f, 0xce9f], /* Hangul Syllable */
- [0xcea0, 0xcea0], /* Hangul Syllable */
- [0xcea1, 0xcea1], /* Hangul Syllable */
- [0xcea2, 0xcea2], /* Hangul Syllable */
- [0xcea3, 0xcea3], /* Hangul Syllable */
- [0xcea4, 0xcea4], /* Hangul Syllable */
- [0xcea5, 0xcea5], /* Hangul Syllable */
- [0xcea6, 0xcea6], /* Hangul Syllable */
- [0xcea7, 0xcea7], /* Hangul Syllable */
- [0xcea8, 0xcea8], /* Hangul Syllable */
- [0xcea9, 0xcea9], /* Hangul Syllable */
- [0xceaa, 0xceaa], /* Hangul Syllable */
- [0xceab, 0xceab], /* Hangul Syllable */
- [0xceac, 0xceac], /* Hangul Syllable */
- [0xcead, 0xcead], /* Hangul Syllable */
- [0xceae, 0xceae], /* Hangul Syllable */
- [0xceaf, 0xceaf], /* Hangul Syllable */
- [0xceb0, 0xceb0], /* Hangul Syllable */
- [0xceb1, 0xceb1], /* Hangul Syllable */
- [0xceb2, 0xceb2], /* Hangul Syllable */
- [0xceb3, 0xceb3], /* Hangul Syllable */
- [0xceb4, 0xceb4], /* Hangul Syllable */
- [0xceb5, 0xceb5], /* Hangul Syllable */
- [0xceb6, 0xceb6], /* Hangul Syllable */
- [0xceb7, 0xceb7], /* Hangul Syllable */
- [0xceb8, 0xceb8], /* Hangul Syllable */
- [0xceb9, 0xceb9], /* Hangul Syllable */
- [0xceba, 0xceba], /* Hangul Syllable */
- [0xcebb, 0xcebb], /* Hangul Syllable */
- [0xcebc, 0xcebc], /* Hangul Syllable */
- [0xcebd, 0xcebd], /* Hangul Syllable */
- [0xcebe, 0xcebe], /* Hangul Syllable */
- [0xcebf, 0xcebf], /* Hangul Syllable */
- [0xcec0, 0xcec0], /* Hangul Syllable */
- [0xcec1, 0xcec1], /* Hangul Syllable */
- [0xcec2, 0xcec2], /* Hangul Syllable */
- [0xcec3, 0xcec3], /* Hangul Syllable */
- [0xcec4, 0xcec4], /* Hangul Syllable */
- [0xcec5, 0xcec5], /* Hangul Syllable */
- [0xcec6, 0xcec6], /* Hangul Syllable */
- [0xcec7, 0xcec7], /* Hangul Syllable */
- [0xcec8, 0xcec8], /* Hangul Syllable */
- [0xcec9, 0xcec9], /* Hangul Syllable */
- [0xceca, 0xceca], /* Hangul Syllable */
- [0xcecb, 0xcecb], /* Hangul Syllable */
- [0xcecc, 0xcecc], /* Hangul Syllable */
- [0xcecd, 0xcecd], /* Hangul Syllable */
- [0xcece, 0xcece], /* Hangul Syllable */
- [0xcecf, 0xcecf], /* Hangul Syllable */
- [0xced0, 0xced0], /* Hangul Syllable */
- [0xced1, 0xced1], /* Hangul Syllable */
- [0xced2, 0xced2], /* Hangul Syllable */
- [0xced3, 0xced3], /* Hangul Syllable */
- [0xced4, 0xced4], /* Hangul Syllable */
- [0xced5, 0xced5], /* Hangul Syllable */
- [0xced6, 0xced6], /* Hangul Syllable */
- [0xced7, 0xced7], /* Hangul Syllable */
- [0xced8, 0xced8], /* Hangul Syllable */
- [0xced9, 0xced9], /* Hangul Syllable */
- [0xceda, 0xceda], /* Hangul Syllable */
- [0xcedb, 0xcedb], /* Hangul Syllable */
- [0xcedc, 0xcedc], /* Hangul Syllable */
- [0xcedd, 0xcedd], /* Hangul Syllable */
- [0xcede, 0xcede], /* Hangul Syllable */
- [0xcedf, 0xcedf], /* Hangul Syllable */
- [0xcee0, 0xcee0], /* Hangul Syllable */
- [0xcee1, 0xcee1], /* Hangul Syllable */
- [0xcee2, 0xcee2], /* Hangul Syllable */
- [0xcee3, 0xcee3], /* Hangul Syllable */
- [0xcee4, 0xcee4], /* Hangul Syllable */
- [0xcee5, 0xcee5], /* Hangul Syllable */
- [0xcee6, 0xcee6], /* Hangul Syllable */
- [0xcee7, 0xcee7], /* Hangul Syllable */
- [0xcee8, 0xcee8], /* Hangul Syllable */
- [0xcee9, 0xcee9], /* Hangul Syllable */
- [0xceea, 0xceea], /* Hangul Syllable */
- [0xceeb, 0xceeb], /* Hangul Syllable */
- [0xceec, 0xceec], /* Hangul Syllable */
- [0xceed, 0xceed], /* Hangul Syllable */
- [0xceee, 0xceee], /* Hangul Syllable */
- [0xceef, 0xceef], /* Hangul Syllable */
- [0xcef0, 0xcef0], /* Hangul Syllable */
- [0xcef1, 0xcef1], /* Hangul Syllable */
- [0xcef2, 0xcef2], /* Hangul Syllable */
- [0xcef3, 0xcef3], /* Hangul Syllable */
- [0xcef4, 0xcef4], /* Hangul Syllable */
- [0xcef5, 0xcef5], /* Hangul Syllable */
- [0xcef6, 0xcef6], /* Hangul Syllable */
- [0xcef7, 0xcef7], /* Hangul Syllable */
- [0xcef8, 0xcef8], /* Hangul Syllable */
- [0xcef9, 0xcef9], /* Hangul Syllable */
- [0xcefa, 0xcefa], /* Hangul Syllable */
- [0xcefb, 0xcefb], /* Hangul Syllable */
- [0xcefc, 0xcefc], /* Hangul Syllable */
- [0xcefd, 0xcefd], /* Hangul Syllable */
- [0xcefe, 0xcefe], /* Hangul Syllable */
- [0xceff, 0xceff], /* Hangul Syllable */
- [0xcf00, 0xcf00], /* Hangul Syllable */
- [0xcf01, 0xcf01], /* Hangul Syllable */
- [0xcf02, 0xcf02], /* Hangul Syllable */
- [0xcf03, 0xcf03], /* Hangul Syllable */
- [0xcf04, 0xcf04], /* Hangul Syllable */
- [0xcf05, 0xcf05], /* Hangul Syllable */
- [0xcf06, 0xcf06], /* Hangul Syllable */
- [0xcf07, 0xcf07], /* Hangul Syllable */
- [0xcf08, 0xcf08], /* Hangul Syllable */
- [0xcf09, 0xcf09], /* Hangul Syllable */
- [0xcf0a, 0xcf0a], /* Hangul Syllable */
- [0xcf0b, 0xcf0b], /* Hangul Syllable */
- [0xcf0c, 0xcf0c], /* Hangul Syllable */
- [0xcf0d, 0xcf0d], /* Hangul Syllable */
- [0xcf0e, 0xcf0e], /* Hangul Syllable */
- [0xcf0f, 0xcf0f], /* Hangul Syllable */
- [0xcf10, 0xcf10], /* Hangul Syllable */
- [0xcf11, 0xcf11], /* Hangul Syllable */
- [0xcf12, 0xcf12], /* Hangul Syllable */
- [0xcf13, 0xcf13], /* Hangul Syllable */
- [0xcf14, 0xcf14], /* Hangul Syllable */
- [0xcf15, 0xcf15], /* Hangul Syllable */
- [0xcf16, 0xcf16], /* Hangul Syllable */
- [0xcf17, 0xcf17], /* Hangul Syllable */
- [0xcf18, 0xcf18], /* Hangul Syllable */
- [0xcf19, 0xcf19], /* Hangul Syllable */
- [0xcf1a, 0xcf1a], /* Hangul Syllable */
- [0xcf1b, 0xcf1b], /* Hangul Syllable */
- [0xcf1c, 0xcf1c], /* Hangul Syllable */
- [0xcf1d, 0xcf1d], /* Hangul Syllable */
- [0xcf1e, 0xcf1e], /* Hangul Syllable */
- [0xcf1f, 0xcf1f], /* Hangul Syllable */
- [0xcf20, 0xcf20], /* Hangul Syllable */
- [0xcf21, 0xcf21], /* Hangul Syllable */
- [0xcf22, 0xcf22], /* Hangul Syllable */
- [0xcf23, 0xcf23], /* Hangul Syllable */
- [0xcf24, 0xcf24], /* Hangul Syllable */
- [0xcf25, 0xcf25], /* Hangul Syllable */
- [0xcf26, 0xcf26], /* Hangul Syllable */
- [0xcf27, 0xcf27], /* Hangul Syllable */
- [0xcf28, 0xcf28], /* Hangul Syllable */
- [0xcf29, 0xcf29], /* Hangul Syllable */
- [0xcf2a, 0xcf2a], /* Hangul Syllable */
- [0xcf2b, 0xcf2b], /* Hangul Syllable */
- [0xcf2c, 0xcf2c], /* Hangul Syllable */
- [0xcf2d, 0xcf2d], /* Hangul Syllable */
- [0xcf2e, 0xcf2e], /* Hangul Syllable */
- [0xcf2f, 0xcf2f], /* Hangul Syllable */
- [0xcf30, 0xcf30], /* Hangul Syllable */
- [0xcf31, 0xcf31], /* Hangul Syllable */
- [0xcf32, 0xcf32], /* Hangul Syllable */
- [0xcf33, 0xcf33], /* Hangul Syllable */
- [0xcf34, 0xcf34], /* Hangul Syllable */
- [0xcf35, 0xcf35], /* Hangul Syllable */
- [0xcf36, 0xcf36], /* Hangul Syllable */
- [0xcf37, 0xcf37], /* Hangul Syllable */
- [0xcf38, 0xcf38], /* Hangul Syllable */
- [0xcf39, 0xcf39], /* Hangul Syllable */
- [0xcf3a, 0xcf3a], /* Hangul Syllable */
- [0xcf3b, 0xcf3b], /* Hangul Syllable */
- [0xcf3c, 0xcf3c], /* Hangul Syllable */
- [0xcf3d, 0xcf3d], /* Hangul Syllable */
- [0xcf3e, 0xcf3e], /* Hangul Syllable */
- [0xcf3f, 0xcf3f], /* Hangul Syllable */
- [0xcf40, 0xcf40], /* Hangul Syllable */
- [0xcf41, 0xcf41], /* Hangul Syllable */
- [0xcf42, 0xcf42], /* Hangul Syllable */
- [0xcf43, 0xcf43], /* Hangul Syllable */
- [0xcf44, 0xcf44], /* Hangul Syllable */
- [0xcf45, 0xcf45], /* Hangul Syllable */
- [0xcf46, 0xcf46], /* Hangul Syllable */
- [0xcf47, 0xcf47], /* Hangul Syllable */
- [0xcf48, 0xcf48], /* Hangul Syllable */
- [0xcf49, 0xcf49], /* Hangul Syllable */
- [0xcf4a, 0xcf4a], /* Hangul Syllable */
- [0xcf4b, 0xcf4b], /* Hangul Syllable */
- [0xcf4c, 0xcf4c], /* Hangul Syllable */
- [0xcf4d, 0xcf4d], /* Hangul Syllable */
- [0xcf4e, 0xcf4e], /* Hangul Syllable */
- [0xcf4f, 0xcf4f], /* Hangul Syllable */
- [0xcf50, 0xcf50], /* Hangul Syllable */
- [0xcf51, 0xcf51], /* Hangul Syllable */
- [0xcf52, 0xcf52], /* Hangul Syllable */
- [0xcf53, 0xcf53], /* Hangul Syllable */
- [0xcf54, 0xcf54], /* Hangul Syllable */
- [0xcf55, 0xcf55], /* Hangul Syllable */
- [0xcf56, 0xcf56], /* Hangul Syllable */
- [0xcf57, 0xcf57], /* Hangul Syllable */
- [0xcf58, 0xcf58], /* Hangul Syllable */
- [0xcf59, 0xcf59], /* Hangul Syllable */
- [0xcf5a, 0xcf5a], /* Hangul Syllable */
- [0xcf5b, 0xcf5b], /* Hangul Syllable */
- [0xcf5c, 0xcf5c], /* Hangul Syllable */
- [0xcf5d, 0xcf5d], /* Hangul Syllable */
- [0xcf5e, 0xcf5e], /* Hangul Syllable */
- [0xcf5f, 0xcf5f], /* Hangul Syllable */
- [0xcf60, 0xcf60], /* Hangul Syllable */
- [0xcf61, 0xcf61], /* Hangul Syllable */
- [0xcf62, 0xcf62], /* Hangul Syllable */
- [0xcf63, 0xcf63], /* Hangul Syllable */
- [0xcf64, 0xcf64], /* Hangul Syllable */
- [0xcf65, 0xcf65], /* Hangul Syllable */
- [0xcf66, 0xcf66], /* Hangul Syllable */
- [0xcf67, 0xcf67], /* Hangul Syllable */
- [0xcf68, 0xcf68], /* Hangul Syllable */
- [0xcf69, 0xcf69], /* Hangul Syllable */
- [0xcf6a, 0xcf6a], /* Hangul Syllable */
- [0xcf6b, 0xcf6b], /* Hangul Syllable */
- [0xcf6c, 0xcf6c], /* Hangul Syllable */
- [0xcf6d, 0xcf6d], /* Hangul Syllable */
- [0xcf6e, 0xcf6e], /* Hangul Syllable */
- [0xcf6f, 0xcf6f], /* Hangul Syllable */
- [0xcf70, 0xcf70], /* Hangul Syllable */
- [0xcf71, 0xcf71], /* Hangul Syllable */
- [0xcf72, 0xcf72], /* Hangul Syllable */
- [0xcf73, 0xcf73], /* Hangul Syllable */
- [0xcf74, 0xcf74], /* Hangul Syllable */
- [0xcf75, 0xcf75], /* Hangul Syllable */
- [0xcf76, 0xcf76], /* Hangul Syllable */
- [0xcf77, 0xcf77], /* Hangul Syllable */
- [0xcf78, 0xcf78], /* Hangul Syllable */
- [0xcf79, 0xcf79], /* Hangul Syllable */
- [0xcf7a, 0xcf7a], /* Hangul Syllable */
- [0xcf7b, 0xcf7b], /* Hangul Syllable */
- [0xcf7c, 0xcf7c], /* Hangul Syllable */
- [0xcf7d, 0xcf7d], /* Hangul Syllable */
- [0xcf7e, 0xcf7e], /* Hangul Syllable */
- [0xcf7f, 0xcf7f], /* Hangul Syllable */
- [0xcf80, 0xcf80], /* Hangul Syllable */
- [0xcf81, 0xcf81], /* Hangul Syllable */
- [0xcf82, 0xcf82], /* Hangul Syllable */
- [0xcf83, 0xcf83], /* Hangul Syllable */
- [0xcf84, 0xcf84], /* Hangul Syllable */
- [0xcf85, 0xcf85], /* Hangul Syllable */
- [0xcf86, 0xcf86], /* Hangul Syllable */
- [0xcf87, 0xcf87], /* Hangul Syllable */
- [0xcf88, 0xcf88], /* Hangul Syllable */
- [0xcf89, 0xcf89], /* Hangul Syllable */
- [0xcf8a, 0xcf8a], /* Hangul Syllable */
- [0xcf8b, 0xcf8b], /* Hangul Syllable */
- [0xcf8c, 0xcf8c], /* Hangul Syllable */
- [0xcf8d, 0xcf8d], /* Hangul Syllable */
- [0xcf8e, 0xcf8e], /* Hangul Syllable */
- [0xcf8f, 0xcf8f], /* Hangul Syllable */
- [0xcf90, 0xcf90], /* Hangul Syllable */
- [0xcf91, 0xcf91], /* Hangul Syllable */
- [0xcf92, 0xcf92], /* Hangul Syllable */
- [0xcf93, 0xcf93], /* Hangul Syllable */
- [0xcf94, 0xcf94], /* Hangul Syllable */
- [0xcf95, 0xcf95], /* Hangul Syllable */
- [0xcf96, 0xcf96], /* Hangul Syllable */
- [0xcf97, 0xcf97], /* Hangul Syllable */
- [0xcf98, 0xcf98], /* Hangul Syllable */
- [0xcf99, 0xcf99], /* Hangul Syllable */
- [0xcf9a, 0xcf9a], /* Hangul Syllable */
- [0xcf9b, 0xcf9b], /* Hangul Syllable */
- [0xcf9c, 0xcf9c], /* Hangul Syllable */
- [0xcf9d, 0xcf9d], /* Hangul Syllable */
- [0xcf9e, 0xcf9e], /* Hangul Syllable */
- [0xcf9f, 0xcf9f], /* Hangul Syllable */
- [0xcfa0, 0xcfa0], /* Hangul Syllable */
- [0xcfa1, 0xcfa1], /* Hangul Syllable */
- [0xcfa2, 0xcfa2], /* Hangul Syllable */
- [0xcfa3, 0xcfa3], /* Hangul Syllable */
- [0xcfa4, 0xcfa4], /* Hangul Syllable */
- [0xcfa5, 0xcfa5], /* Hangul Syllable */
- [0xcfa6, 0xcfa6], /* Hangul Syllable */
- [0xcfa7, 0xcfa7], /* Hangul Syllable */
- [0xcfa8, 0xcfa8], /* Hangul Syllable */
- [0xcfa9, 0xcfa9], /* Hangul Syllable */
- [0xcfaa, 0xcfaa], /* Hangul Syllable */
- [0xcfab, 0xcfab], /* Hangul Syllable */
- [0xcfac, 0xcfac], /* Hangul Syllable */
- [0xcfad, 0xcfad], /* Hangul Syllable */
- [0xcfae, 0xcfae], /* Hangul Syllable */
- [0xcfaf, 0xcfaf], /* Hangul Syllable */
- [0xcfb0, 0xcfb0], /* Hangul Syllable */
- [0xcfb1, 0xcfb1], /* Hangul Syllable */
- [0xcfb2, 0xcfb2], /* Hangul Syllable */
- [0xcfb3, 0xcfb3], /* Hangul Syllable */
- [0xcfb4, 0xcfb4], /* Hangul Syllable */
- [0xcfb5, 0xcfb5], /* Hangul Syllable */
- [0xcfb6, 0xcfb6], /* Hangul Syllable */
- [0xcfb7, 0xcfb7], /* Hangul Syllable */
- [0xcfb8, 0xcfb8], /* Hangul Syllable */
- [0xcfb9, 0xcfb9], /* Hangul Syllable */
- [0xcfba, 0xcfba], /* Hangul Syllable */
- [0xcfbb, 0xcfbb], /* Hangul Syllable */
- [0xcfbc, 0xcfbc], /* Hangul Syllable */
- [0xcfbd, 0xcfbd], /* Hangul Syllable */
- [0xcfbe, 0xcfbe], /* Hangul Syllable */
- [0xcfbf, 0xcfbf], /* Hangul Syllable */
- [0xcfc0, 0xcfc0], /* Hangul Syllable */
- [0xcfc1, 0xcfc1], /* Hangul Syllable */
- [0xcfc2, 0xcfc2], /* Hangul Syllable */
- [0xcfc3, 0xcfc3], /* Hangul Syllable */
- [0xcfc4, 0xcfc4], /* Hangul Syllable */
- [0xcfc5, 0xcfc5], /* Hangul Syllable */
- [0xcfc6, 0xcfc6], /* Hangul Syllable */
- [0xcfc7, 0xcfc7], /* Hangul Syllable */
- [0xcfc8, 0xcfc8], /* Hangul Syllable */
- [0xcfc9, 0xcfc9], /* Hangul Syllable */
- [0xcfca, 0xcfca], /* Hangul Syllable */
- [0xcfcb, 0xcfcb], /* Hangul Syllable */
- [0xcfcc, 0xcfcc], /* Hangul Syllable */
- [0xcfcd, 0xcfcd], /* Hangul Syllable */
- [0xcfce, 0xcfce], /* Hangul Syllable */
- [0xcfcf, 0xcfcf], /* Hangul Syllable */
- [0xcfd0, 0xcfd0], /* Hangul Syllable */
- [0xcfd1, 0xcfd1], /* Hangul Syllable */
- [0xcfd2, 0xcfd2], /* Hangul Syllable */
- [0xcfd3, 0xcfd3], /* Hangul Syllable */
- [0xcfd4, 0xcfd4], /* Hangul Syllable */
- [0xcfd5, 0xcfd5], /* Hangul Syllable */
- [0xcfd6, 0xcfd6], /* Hangul Syllable */
- [0xcfd7, 0xcfd7], /* Hangul Syllable */
- [0xcfd8, 0xcfd8], /* Hangul Syllable */
- [0xcfd9, 0xcfd9], /* Hangul Syllable */
- [0xcfda, 0xcfda], /* Hangul Syllable */
- [0xcfdb, 0xcfdb], /* Hangul Syllable */
- [0xcfdc, 0xcfdc], /* Hangul Syllable */
- [0xcfdd, 0xcfdd], /* Hangul Syllable */
- [0xcfde, 0xcfde], /* Hangul Syllable */
- [0xcfdf, 0xcfdf], /* Hangul Syllable */
- [0xcfe0, 0xcfe0], /* Hangul Syllable */
- [0xcfe1, 0xcfe1], /* Hangul Syllable */
- [0xcfe2, 0xcfe2], /* Hangul Syllable */
- [0xcfe3, 0xcfe3], /* Hangul Syllable */
- [0xcfe4, 0xcfe4], /* Hangul Syllable */
- [0xcfe5, 0xcfe5], /* Hangul Syllable */
- [0xcfe6, 0xcfe6], /* Hangul Syllable */
- [0xcfe7, 0xcfe7], /* Hangul Syllable */
- [0xcfe8, 0xcfe8], /* Hangul Syllable */
- [0xcfe9, 0xcfe9], /* Hangul Syllable */
- [0xcfea, 0xcfea], /* Hangul Syllable */
- [0xcfeb, 0xcfeb], /* Hangul Syllable */
- [0xcfec, 0xcfec], /* Hangul Syllable */
- [0xcfed, 0xcfed], /* Hangul Syllable */
- [0xcfee, 0xcfee], /* Hangul Syllable */
- [0xcfef, 0xcfef], /* Hangul Syllable */
- [0xcff0, 0xcff0], /* Hangul Syllable */
- [0xcff1, 0xcff1], /* Hangul Syllable */
- [0xcff2, 0xcff2], /* Hangul Syllable */
- [0xcff3, 0xcff3], /* Hangul Syllable */
- [0xcff4, 0xcff4], /* Hangul Syllable */
- [0xcff5, 0xcff5], /* Hangul Syllable */
- [0xcff6, 0xcff6], /* Hangul Syllable */
- [0xcff7, 0xcff7], /* Hangul Syllable */
- [0xcff8, 0xcff8], /* Hangul Syllable */
- [0xcff9, 0xcff9], /* Hangul Syllable */
- [0xcffa, 0xcffa], /* Hangul Syllable */
- [0xcffb, 0xcffb], /* Hangul Syllable */
- [0xcffc, 0xcffc], /* Hangul Syllable */
- [0xcffd, 0xcffd], /* Hangul Syllable */
- [0xcffe, 0xcffe], /* Hangul Syllable */
- [0xcfff, 0xcfff], /* Hangul Syllable */
- [0xd000, 0xd000], /* Hangul Syllable */
- [0xd001, 0xd001], /* Hangul Syllable */
- [0xd002, 0xd002], /* Hangul Syllable */
- [0xd003, 0xd003], /* Hangul Syllable */
- [0xd004, 0xd004], /* Hangul Syllable */
- [0xd005, 0xd005], /* Hangul Syllable */
- [0xd006, 0xd006], /* Hangul Syllable */
- [0xd007, 0xd007], /* Hangul Syllable */
- [0xd008, 0xd008], /* Hangul Syllable */
- [0xd009, 0xd009], /* Hangul Syllable */
- [0xd00a, 0xd00a], /* Hangul Syllable */
- [0xd00b, 0xd00b], /* Hangul Syllable */
- [0xd00c, 0xd00c], /* Hangul Syllable */
- [0xd00d, 0xd00d], /* Hangul Syllable */
- [0xd00e, 0xd00e], /* Hangul Syllable */
- [0xd00f, 0xd00f], /* Hangul Syllable */
- [0xd010, 0xd010], /* Hangul Syllable */
- [0xd011, 0xd011], /* Hangul Syllable */
- [0xd012, 0xd012], /* Hangul Syllable */
- [0xd013, 0xd013], /* Hangul Syllable */
- [0xd014, 0xd014], /* Hangul Syllable */
- [0xd015, 0xd015], /* Hangul Syllable */
- [0xd016, 0xd016], /* Hangul Syllable */
- [0xd017, 0xd017], /* Hangul Syllable */
- [0xd018, 0xd018], /* Hangul Syllable */
- [0xd019, 0xd019], /* Hangul Syllable */
- [0xd01a, 0xd01a], /* Hangul Syllable */
- [0xd01b, 0xd01b], /* Hangul Syllable */
- [0xd01c, 0xd01c], /* Hangul Syllable */
- [0xd01d, 0xd01d], /* Hangul Syllable */
- [0xd01e, 0xd01e], /* Hangul Syllable */
- [0xd01f, 0xd01f], /* Hangul Syllable */
- [0xd020, 0xd020], /* Hangul Syllable */
- [0xd021, 0xd021], /* Hangul Syllable */
- [0xd022, 0xd022], /* Hangul Syllable */
- [0xd023, 0xd023], /* Hangul Syllable */
- [0xd024, 0xd024], /* Hangul Syllable */
- [0xd025, 0xd025], /* Hangul Syllable */
- [0xd026, 0xd026], /* Hangul Syllable */
- [0xd027, 0xd027], /* Hangul Syllable */
- [0xd028, 0xd028], /* Hangul Syllable */
- [0xd029, 0xd029], /* Hangul Syllable */
- [0xd02a, 0xd02a], /* Hangul Syllable */
- [0xd02b, 0xd02b], /* Hangul Syllable */
- [0xd02c, 0xd02c], /* Hangul Syllable */
- [0xd02d, 0xd02d], /* Hangul Syllable */
- [0xd02e, 0xd02e], /* Hangul Syllable */
- [0xd02f, 0xd02f], /* Hangul Syllable */
- [0xd030, 0xd030], /* Hangul Syllable */
- [0xd031, 0xd031], /* Hangul Syllable */
- [0xd032, 0xd032], /* Hangul Syllable */
- [0xd033, 0xd033], /* Hangul Syllable */
- [0xd034, 0xd034], /* Hangul Syllable */
- [0xd035, 0xd035], /* Hangul Syllable */
- [0xd036, 0xd036], /* Hangul Syllable */
- [0xd037, 0xd037], /* Hangul Syllable */
- [0xd038, 0xd038], /* Hangul Syllable */
- [0xd039, 0xd039], /* Hangul Syllable */
- [0xd03a, 0xd03a], /* Hangul Syllable */
- [0xd03b, 0xd03b], /* Hangul Syllable */
- [0xd03c, 0xd03c], /* Hangul Syllable */
- [0xd03d, 0xd03d], /* Hangul Syllable */
- [0xd03e, 0xd03e], /* Hangul Syllable */
- [0xd03f, 0xd03f], /* Hangul Syllable */
- [0xd040, 0xd040], /* Hangul Syllable */
- [0xd041, 0xd041], /* Hangul Syllable */
- [0xd042, 0xd042], /* Hangul Syllable */
- [0xd043, 0xd043], /* Hangul Syllable */
- [0xd044, 0xd044], /* Hangul Syllable */
- [0xd045, 0xd045], /* Hangul Syllable */
- [0xd046, 0xd046], /* Hangul Syllable */
- [0xd047, 0xd047], /* Hangul Syllable */
- [0xd048, 0xd048], /* Hangul Syllable */
- [0xd049, 0xd049], /* Hangul Syllable */
- [0xd04a, 0xd04a], /* Hangul Syllable */
- [0xd04b, 0xd04b], /* Hangul Syllable */
- [0xd04c, 0xd04c], /* Hangul Syllable */
- [0xd04d, 0xd04d], /* Hangul Syllable */
- [0xd04e, 0xd04e], /* Hangul Syllable */
- [0xd04f, 0xd04f], /* Hangul Syllable */
- [0xd050, 0xd050], /* Hangul Syllable */
- [0xd051, 0xd051], /* Hangul Syllable */
- [0xd052, 0xd052], /* Hangul Syllable */
- [0xd053, 0xd053], /* Hangul Syllable */
- [0xd054, 0xd054], /* Hangul Syllable */
- [0xd055, 0xd055], /* Hangul Syllable */
- [0xd056, 0xd056], /* Hangul Syllable */
- [0xd057, 0xd057], /* Hangul Syllable */
- [0xd058, 0xd058], /* Hangul Syllable */
- [0xd059, 0xd059], /* Hangul Syllable */
- [0xd05a, 0xd05a], /* Hangul Syllable */
- [0xd05b, 0xd05b], /* Hangul Syllable */
- [0xd05c, 0xd05c], /* Hangul Syllable */
- [0xd05d, 0xd05d], /* Hangul Syllable */
- [0xd05e, 0xd05e], /* Hangul Syllable */
- [0xd05f, 0xd05f], /* Hangul Syllable */
- [0xd060, 0xd060], /* Hangul Syllable */
- [0xd061, 0xd061], /* Hangul Syllable */
- [0xd062, 0xd062], /* Hangul Syllable */
- [0xd063, 0xd063], /* Hangul Syllable */
- [0xd064, 0xd064], /* Hangul Syllable */
- [0xd065, 0xd065], /* Hangul Syllable */
- [0xd066, 0xd066], /* Hangul Syllable */
- [0xd067, 0xd067], /* Hangul Syllable */
- [0xd068, 0xd068], /* Hangul Syllable */
- [0xd069, 0xd069], /* Hangul Syllable */
- [0xd06a, 0xd06a], /* Hangul Syllable */
- [0xd06b, 0xd06b], /* Hangul Syllable */
- [0xd06c, 0xd06c], /* Hangul Syllable */
- [0xd06d, 0xd06d], /* Hangul Syllable */
- [0xd06e, 0xd06e], /* Hangul Syllable */
- [0xd06f, 0xd06f], /* Hangul Syllable */
- [0xd070, 0xd070], /* Hangul Syllable */
- [0xd071, 0xd071], /* Hangul Syllable */
- [0xd072, 0xd072], /* Hangul Syllable */
- [0xd073, 0xd073], /* Hangul Syllable */
- [0xd074, 0xd074], /* Hangul Syllable */
- [0xd075, 0xd075], /* Hangul Syllable */
- [0xd076, 0xd076], /* Hangul Syllable */
- [0xd077, 0xd077], /* Hangul Syllable */
- [0xd078, 0xd078], /* Hangul Syllable */
- [0xd079, 0xd079], /* Hangul Syllable */
- [0xd07a, 0xd07a], /* Hangul Syllable */
- [0xd07b, 0xd07b], /* Hangul Syllable */
- [0xd07c, 0xd07c], /* Hangul Syllable */
- [0xd07d, 0xd07d], /* Hangul Syllable */
- [0xd07e, 0xd07e], /* Hangul Syllable */
- [0xd07f, 0xd07f], /* Hangul Syllable */
- [0xd080, 0xd080], /* Hangul Syllable */
- [0xd081, 0xd081], /* Hangul Syllable */
- [0xd082, 0xd082], /* Hangul Syllable */
- [0xd083, 0xd083], /* Hangul Syllable */
- [0xd084, 0xd084], /* Hangul Syllable */
- [0xd085, 0xd085], /* Hangul Syllable */
- [0xd086, 0xd086], /* Hangul Syllable */
- [0xd087, 0xd087], /* Hangul Syllable */
- [0xd088, 0xd088], /* Hangul Syllable */
- [0xd089, 0xd089], /* Hangul Syllable */
- [0xd08a, 0xd08a], /* Hangul Syllable */
- [0xd08b, 0xd08b], /* Hangul Syllable */
- [0xd08c, 0xd08c], /* Hangul Syllable */
- [0xd08d, 0xd08d], /* Hangul Syllable */
- [0xd08e, 0xd08e], /* Hangul Syllable */
- [0xd08f, 0xd08f], /* Hangul Syllable */
- [0xd090, 0xd090], /* Hangul Syllable */
- [0xd091, 0xd091], /* Hangul Syllable */
- [0xd092, 0xd092], /* Hangul Syllable */
- [0xd093, 0xd093], /* Hangul Syllable */
- [0xd094, 0xd094], /* Hangul Syllable */
- [0xd095, 0xd095], /* Hangul Syllable */
- [0xd096, 0xd096], /* Hangul Syllable */
- [0xd097, 0xd097], /* Hangul Syllable */
- [0xd098, 0xd098], /* Hangul Syllable */
- [0xd099, 0xd099], /* Hangul Syllable */
- [0xd09a, 0xd09a], /* Hangul Syllable */
- [0xd09b, 0xd09b], /* Hangul Syllable */
- [0xd09c, 0xd09c], /* Hangul Syllable */
- [0xd09d, 0xd09d], /* Hangul Syllable */
- [0xd09e, 0xd09e], /* Hangul Syllable */
- [0xd09f, 0xd09f], /* Hangul Syllable */
- [0xd0a0, 0xd0a0], /* Hangul Syllable */
- [0xd0a1, 0xd0a1], /* Hangul Syllable */
- [0xd0a2, 0xd0a2], /* Hangul Syllable */
- [0xd0a3, 0xd0a3], /* Hangul Syllable */
- [0xd0a4, 0xd0a4], /* Hangul Syllable */
- [0xd0a5, 0xd0a5], /* Hangul Syllable */
- [0xd0a6, 0xd0a6], /* Hangul Syllable */
- [0xd0a7, 0xd0a7], /* Hangul Syllable */
- [0xd0a8, 0xd0a8], /* Hangul Syllable */
- [0xd0a9, 0xd0a9], /* Hangul Syllable */
- [0xd0aa, 0xd0aa], /* Hangul Syllable */
- [0xd0ab, 0xd0ab], /* Hangul Syllable */
- [0xd0ac, 0xd0ac], /* Hangul Syllable */
- [0xd0ad, 0xd0ad], /* Hangul Syllable */
- [0xd0ae, 0xd0ae], /* Hangul Syllable */
- [0xd0af, 0xd0af], /* Hangul Syllable */
- [0xd0b0, 0xd0b0], /* Hangul Syllable */
- [0xd0b1, 0xd0b1], /* Hangul Syllable */
- [0xd0b2, 0xd0b2], /* Hangul Syllable */
- [0xd0b3, 0xd0b3], /* Hangul Syllable */
- [0xd0b4, 0xd0b4], /* Hangul Syllable */
- [0xd0b5, 0xd0b5], /* Hangul Syllable */
- [0xd0b6, 0xd0b6], /* Hangul Syllable */
- [0xd0b7, 0xd0b7], /* Hangul Syllable */
- [0xd0b8, 0xd0b8], /* Hangul Syllable */
- [0xd0b9, 0xd0b9], /* Hangul Syllable */
- [0xd0ba, 0xd0ba], /* Hangul Syllable */
- [0xd0bb, 0xd0bb], /* Hangul Syllable */
- [0xd0bc, 0xd0bc], /* Hangul Syllable */
- [0xd0bd, 0xd0bd], /* Hangul Syllable */
- [0xd0be, 0xd0be], /* Hangul Syllable */
- [0xd0bf, 0xd0bf], /* Hangul Syllable */
- [0xd0c0, 0xd0c0], /* Hangul Syllable */
- [0xd0c1, 0xd0c1], /* Hangul Syllable */
- [0xd0c2, 0xd0c2], /* Hangul Syllable */
- [0xd0c3, 0xd0c3], /* Hangul Syllable */
- [0xd0c4, 0xd0c4], /* Hangul Syllable */
- [0xd0c5, 0xd0c5], /* Hangul Syllable */
- [0xd0c6, 0xd0c6], /* Hangul Syllable */
- [0xd0c7, 0xd0c7], /* Hangul Syllable */
- [0xd0c8, 0xd0c8], /* Hangul Syllable */
- [0xd0c9, 0xd0c9], /* Hangul Syllable */
- [0xd0ca, 0xd0ca], /* Hangul Syllable */
- [0xd0cb, 0xd0cb], /* Hangul Syllable */
- [0xd0cc, 0xd0cc], /* Hangul Syllable */
- [0xd0cd, 0xd0cd], /* Hangul Syllable */
- [0xd0ce, 0xd0ce], /* Hangul Syllable */
- [0xd0cf, 0xd0cf], /* Hangul Syllable */
- [0xd0d0, 0xd0d0], /* Hangul Syllable */
- [0xd0d1, 0xd0d1], /* Hangul Syllable */
- [0xd0d2, 0xd0d2], /* Hangul Syllable */
- [0xd0d3, 0xd0d3], /* Hangul Syllable */
- [0xd0d4, 0xd0d4], /* Hangul Syllable */
- [0xd0d5, 0xd0d5], /* Hangul Syllable */
- [0xd0d6, 0xd0d6], /* Hangul Syllable */
- [0xd0d7, 0xd0d7], /* Hangul Syllable */
- [0xd0d8, 0xd0d8], /* Hangul Syllable */
- [0xd0d9, 0xd0d9], /* Hangul Syllable */
- [0xd0da, 0xd0da], /* Hangul Syllable */
- [0xd0db, 0xd0db], /* Hangul Syllable */
- [0xd0dc, 0xd0dc], /* Hangul Syllable */
- [0xd0dd, 0xd0dd], /* Hangul Syllable */
- [0xd0de, 0xd0de], /* Hangul Syllable */
- [0xd0df, 0xd0df], /* Hangul Syllable */
- [0xd0e0, 0xd0e0], /* Hangul Syllable */
- [0xd0e1, 0xd0e1], /* Hangul Syllable */
- [0xd0e2, 0xd0e2], /* Hangul Syllable */
- [0xd0e3, 0xd0e3], /* Hangul Syllable */
- [0xd0e4, 0xd0e4], /* Hangul Syllable */
- [0xd0e5, 0xd0e5], /* Hangul Syllable */
- [0xd0e6, 0xd0e6], /* Hangul Syllable */
- [0xd0e7, 0xd0e7], /* Hangul Syllable */
- [0xd0e8, 0xd0e8], /* Hangul Syllable */
- [0xd0e9, 0xd0e9], /* Hangul Syllable */
- [0xd0ea, 0xd0ea], /* Hangul Syllable */
- [0xd0eb, 0xd0eb], /* Hangul Syllable */
- [0xd0ec, 0xd0ec], /* Hangul Syllable */
- [0xd0ed, 0xd0ed], /* Hangul Syllable */
- [0xd0ee, 0xd0ee], /* Hangul Syllable */
- [0xd0ef, 0xd0ef], /* Hangul Syllable */
- [0xd0f0, 0xd0f0], /* Hangul Syllable */
- [0xd0f1, 0xd0f1], /* Hangul Syllable */
- [0xd0f2, 0xd0f2], /* Hangul Syllable */
- [0xd0f3, 0xd0f3], /* Hangul Syllable */
- [0xd0f4, 0xd0f4], /* Hangul Syllable */
- [0xd0f5, 0xd0f5], /* Hangul Syllable */
- [0xd0f6, 0xd0f6], /* Hangul Syllable */
- [0xd0f7, 0xd0f7], /* Hangul Syllable */
- [0xd0f8, 0xd0f8], /* Hangul Syllable */
- [0xd0f9, 0xd0f9], /* Hangul Syllable */
- [0xd0fa, 0xd0fa], /* Hangul Syllable */
- [0xd0fb, 0xd0fb], /* Hangul Syllable */
- [0xd0fc, 0xd0fc], /* Hangul Syllable */
- [0xd0fd, 0xd0fd], /* Hangul Syllable */
- [0xd0fe, 0xd0fe], /* Hangul Syllable */
- [0xd0ff, 0xd0ff], /* Hangul Syllable */
- [0xd100, 0xd100], /* Hangul Syllable */
- [0xd101, 0xd101], /* Hangul Syllable */
- [0xd102, 0xd102], /* Hangul Syllable */
- [0xd103, 0xd103], /* Hangul Syllable */
- [0xd104, 0xd104], /* Hangul Syllable */
- [0xd105, 0xd105], /* Hangul Syllable */
- [0xd106, 0xd106], /* Hangul Syllable */
- [0xd107, 0xd107], /* Hangul Syllable */
- [0xd108, 0xd108], /* Hangul Syllable */
- [0xd109, 0xd109], /* Hangul Syllable */
- [0xd10a, 0xd10a], /* Hangul Syllable */
- [0xd10b, 0xd10b], /* Hangul Syllable */
- [0xd10c, 0xd10c], /* Hangul Syllable */
- [0xd10d, 0xd10d], /* Hangul Syllable */
- [0xd10e, 0xd10e], /* Hangul Syllable */
- [0xd10f, 0xd10f], /* Hangul Syllable */
- [0xd110, 0xd110], /* Hangul Syllable */
- [0xd111, 0xd111], /* Hangul Syllable */
- [0xd112, 0xd112], /* Hangul Syllable */
- [0xd113, 0xd113], /* Hangul Syllable */
- [0xd114, 0xd114], /* Hangul Syllable */
- [0xd115, 0xd115], /* Hangul Syllable */
- [0xd116, 0xd116], /* Hangul Syllable */
- [0xd117, 0xd117], /* Hangul Syllable */
- [0xd118, 0xd118], /* Hangul Syllable */
- [0xd119, 0xd119], /* Hangul Syllable */
- [0xd11a, 0xd11a], /* Hangul Syllable */
- [0xd11b, 0xd11b], /* Hangul Syllable */
- [0xd11c, 0xd11c], /* Hangul Syllable */
- [0xd11d, 0xd11d], /* Hangul Syllable */
- [0xd11e, 0xd11e], /* Hangul Syllable */
- [0xd11f, 0xd11f], /* Hangul Syllable */
- [0xd120, 0xd120], /* Hangul Syllable */
- [0xd121, 0xd121], /* Hangul Syllable */
- [0xd122, 0xd122], /* Hangul Syllable */
- [0xd123, 0xd123], /* Hangul Syllable */
- [0xd124, 0xd124], /* Hangul Syllable */
- [0xd125, 0xd125], /* Hangul Syllable */
- [0xd126, 0xd126], /* Hangul Syllable */
- [0xd127, 0xd127], /* Hangul Syllable */
- [0xd128, 0xd128], /* Hangul Syllable */
- [0xd129, 0xd129], /* Hangul Syllable */
- [0xd12a, 0xd12a], /* Hangul Syllable */
- [0xd12b, 0xd12b], /* Hangul Syllable */
- [0xd12c, 0xd12c], /* Hangul Syllable */
- [0xd12d, 0xd12d], /* Hangul Syllable */
- [0xd12e, 0xd12e], /* Hangul Syllable */
- [0xd12f, 0xd12f], /* Hangul Syllable */
- [0xd130, 0xd130], /* Hangul Syllable */
- [0xd131, 0xd131], /* Hangul Syllable */
- [0xd132, 0xd132], /* Hangul Syllable */
- [0xd133, 0xd133], /* Hangul Syllable */
- [0xd134, 0xd134], /* Hangul Syllable */
- [0xd135, 0xd135], /* Hangul Syllable */
- [0xd136, 0xd136], /* Hangul Syllable */
- [0xd137, 0xd137], /* Hangul Syllable */
- [0xd138, 0xd138], /* Hangul Syllable */
- [0xd139, 0xd139], /* Hangul Syllable */
- [0xd13a, 0xd13a], /* Hangul Syllable */
- [0xd13b, 0xd13b], /* Hangul Syllable */
- [0xd13c, 0xd13c], /* Hangul Syllable */
- [0xd13d, 0xd13d], /* Hangul Syllable */
- [0xd13e, 0xd13e], /* Hangul Syllable */
- [0xd13f, 0xd13f], /* Hangul Syllable */
- [0xd140, 0xd140], /* Hangul Syllable */
- [0xd141, 0xd141], /* Hangul Syllable */
- [0xd142, 0xd142], /* Hangul Syllable */
- [0xd143, 0xd143], /* Hangul Syllable */
- [0xd144, 0xd144], /* Hangul Syllable */
- [0xd145, 0xd145], /* Hangul Syllable */
- [0xd146, 0xd146], /* Hangul Syllable */
- [0xd147, 0xd147], /* Hangul Syllable */
- [0xd148, 0xd148], /* Hangul Syllable */
- [0xd149, 0xd149], /* Hangul Syllable */
- [0xd14a, 0xd14a], /* Hangul Syllable */
- [0xd14b, 0xd14b], /* Hangul Syllable */
- [0xd14c, 0xd14c], /* Hangul Syllable */
- [0xd14d, 0xd14d], /* Hangul Syllable */
- [0xd14e, 0xd14e], /* Hangul Syllable */
- [0xd14f, 0xd14f], /* Hangul Syllable */
- [0xd150, 0xd150], /* Hangul Syllable */
- [0xd151, 0xd151], /* Hangul Syllable */
- [0xd152, 0xd152], /* Hangul Syllable */
- [0xd153, 0xd153], /* Hangul Syllable */
- [0xd154, 0xd154], /* Hangul Syllable */
- [0xd155, 0xd155], /* Hangul Syllable */
- [0xd156, 0xd156], /* Hangul Syllable */
- [0xd157, 0xd157], /* Hangul Syllable */
- [0xd158, 0xd158], /* Hangul Syllable */
- [0xd159, 0xd159], /* Hangul Syllable */
- [0xd15a, 0xd15a], /* Hangul Syllable */
- [0xd15b, 0xd15b], /* Hangul Syllable */
- [0xd15c, 0xd15c], /* Hangul Syllable */
- [0xd15d, 0xd15d], /* Hangul Syllable */
- [0xd15e, 0xd15e], /* Hangul Syllable */
- [0xd15f, 0xd15f], /* Hangul Syllable */
- [0xd160, 0xd160], /* Hangul Syllable */
- [0xd161, 0xd161], /* Hangul Syllable */
- [0xd162, 0xd162], /* Hangul Syllable */
- [0xd163, 0xd163], /* Hangul Syllable */
- [0xd164, 0xd164], /* Hangul Syllable */
- [0xd165, 0xd165], /* Hangul Syllable */
- [0xd166, 0xd166], /* Hangul Syllable */
- [0xd167, 0xd167], /* Hangul Syllable */
- [0xd168, 0xd168], /* Hangul Syllable */
- [0xd169, 0xd169], /* Hangul Syllable */
- [0xd16a, 0xd16a], /* Hangul Syllable */
- [0xd16b, 0xd16b], /* Hangul Syllable */
- [0xd16c, 0xd16c], /* Hangul Syllable */
- [0xd16d, 0xd16d], /* Hangul Syllable */
- [0xd16e, 0xd16e], /* Hangul Syllable */
- [0xd16f, 0xd16f], /* Hangul Syllable */
- [0xd170, 0xd170], /* Hangul Syllable */
- [0xd171, 0xd171], /* Hangul Syllable */
- [0xd172, 0xd172], /* Hangul Syllable */
- [0xd173, 0xd173], /* Hangul Syllable */
- [0xd174, 0xd174], /* Hangul Syllable */
- [0xd175, 0xd175], /* Hangul Syllable */
- [0xd176, 0xd176], /* Hangul Syllable */
- [0xd177, 0xd177], /* Hangul Syllable */
- [0xd178, 0xd178], /* Hangul Syllable */
- [0xd179, 0xd179], /* Hangul Syllable */
- [0xd17a, 0xd17a], /* Hangul Syllable */
- [0xd17b, 0xd17b], /* Hangul Syllable */
- [0xd17c, 0xd17c], /* Hangul Syllable */
- [0xd17d, 0xd17d], /* Hangul Syllable */
- [0xd17e, 0xd17e], /* Hangul Syllable */
- [0xd17f, 0xd17f], /* Hangul Syllable */
- [0xd180, 0xd180], /* Hangul Syllable */
- [0xd181, 0xd181], /* Hangul Syllable */
- [0xd182, 0xd182], /* Hangul Syllable */
- [0xd183, 0xd183], /* Hangul Syllable */
- [0xd184, 0xd184], /* Hangul Syllable */
- [0xd185, 0xd185], /* Hangul Syllable */
- [0xd186, 0xd186], /* Hangul Syllable */
- [0xd187, 0xd187], /* Hangul Syllable */
- [0xd188, 0xd188], /* Hangul Syllable */
- [0xd189, 0xd189], /* Hangul Syllable */
- [0xd18a, 0xd18a], /* Hangul Syllable */
- [0xd18b, 0xd18b], /* Hangul Syllable */
- [0xd18c, 0xd18c], /* Hangul Syllable */
- [0xd18d, 0xd18d], /* Hangul Syllable */
- [0xd18e, 0xd18e], /* Hangul Syllable */
- [0xd18f, 0xd18f], /* Hangul Syllable */
- [0xd190, 0xd190], /* Hangul Syllable */
- [0xd191, 0xd191], /* Hangul Syllable */
- [0xd192, 0xd192], /* Hangul Syllable */
- [0xd193, 0xd193], /* Hangul Syllable */
- [0xd194, 0xd194], /* Hangul Syllable */
- [0xd195, 0xd195], /* Hangul Syllable */
- [0xd196, 0xd196], /* Hangul Syllable */
- [0xd197, 0xd197], /* Hangul Syllable */
- [0xd198, 0xd198], /* Hangul Syllable */
- [0xd199, 0xd199], /* Hangul Syllable */
- [0xd19a, 0xd19a], /* Hangul Syllable */
- [0xd19b, 0xd19b], /* Hangul Syllable */
- [0xd19c, 0xd19c], /* Hangul Syllable */
- [0xd19d, 0xd19d], /* Hangul Syllable */
- [0xd19e, 0xd19e], /* Hangul Syllable */
- [0xd19f, 0xd19f], /* Hangul Syllable */
- [0xd1a0, 0xd1a0], /* Hangul Syllable */
- [0xd1a1, 0xd1a1], /* Hangul Syllable */
- [0xd1a2, 0xd1a2], /* Hangul Syllable */
- [0xd1a3, 0xd1a3], /* Hangul Syllable */
- [0xd1a4, 0xd1a4], /* Hangul Syllable */
- [0xd1a5, 0xd1a5], /* Hangul Syllable */
- [0xd1a6, 0xd1a6], /* Hangul Syllable */
- [0xd1a7, 0xd1a7], /* Hangul Syllable */
- [0xd1a8, 0xd1a8], /* Hangul Syllable */
- [0xd1a9, 0xd1a9], /* Hangul Syllable */
- [0xd1aa, 0xd1aa], /* Hangul Syllable */
- [0xd1ab, 0xd1ab], /* Hangul Syllable */
- [0xd1ac, 0xd1ac], /* Hangul Syllable */
- [0xd1ad, 0xd1ad], /* Hangul Syllable */
- [0xd1ae, 0xd1ae], /* Hangul Syllable */
- [0xd1af, 0xd1af], /* Hangul Syllable */
- [0xd1b0, 0xd1b0], /* Hangul Syllable */
- [0xd1b1, 0xd1b1], /* Hangul Syllable */
- [0xd1b2, 0xd1b2], /* Hangul Syllable */
- [0xd1b3, 0xd1b3], /* Hangul Syllable */
- [0xd1b4, 0xd1b4], /* Hangul Syllable */
- [0xd1b5, 0xd1b5], /* Hangul Syllable */
- [0xd1b6, 0xd1b6], /* Hangul Syllable */
- [0xd1b7, 0xd1b7], /* Hangul Syllable */
- [0xd1b8, 0xd1b8], /* Hangul Syllable */
- [0xd1b9, 0xd1b9], /* Hangul Syllable */
- [0xd1ba, 0xd1ba], /* Hangul Syllable */
- [0xd1bb, 0xd1bb], /* Hangul Syllable */
- [0xd1bc, 0xd1bc], /* Hangul Syllable */
- [0xd1bd, 0xd1bd], /* Hangul Syllable */
- [0xd1be, 0xd1be], /* Hangul Syllable */
- [0xd1bf, 0xd1bf], /* Hangul Syllable */
- [0xd1c0, 0xd1c0], /* Hangul Syllable */
- [0xd1c1, 0xd1c1], /* Hangul Syllable */
- [0xd1c2, 0xd1c2], /* Hangul Syllable */
- [0xd1c3, 0xd1c3], /* Hangul Syllable */
- [0xd1c4, 0xd1c4], /* Hangul Syllable */
- [0xd1c5, 0xd1c5], /* Hangul Syllable */
- [0xd1c6, 0xd1c6], /* Hangul Syllable */
- [0xd1c7, 0xd1c7], /* Hangul Syllable */
- [0xd1c8, 0xd1c8], /* Hangul Syllable */
- [0xd1c9, 0xd1c9], /* Hangul Syllable */
- [0xd1ca, 0xd1ca], /* Hangul Syllable */
- [0xd1cb, 0xd1cb], /* Hangul Syllable */
- [0xd1cc, 0xd1cc], /* Hangul Syllable */
- [0xd1cd, 0xd1cd], /* Hangul Syllable */
- [0xd1ce, 0xd1ce], /* Hangul Syllable */
- [0xd1cf, 0xd1cf], /* Hangul Syllable */
- [0xd1d0, 0xd1d0], /* Hangul Syllable */
- [0xd1d1, 0xd1d1], /* Hangul Syllable */
- [0xd1d2, 0xd1d2], /* Hangul Syllable */
- [0xd1d3, 0xd1d3], /* Hangul Syllable */
- [0xd1d4, 0xd1d4], /* Hangul Syllable */
- [0xd1d5, 0xd1d5], /* Hangul Syllable */
- [0xd1d6, 0xd1d6], /* Hangul Syllable */
- [0xd1d7, 0xd1d7], /* Hangul Syllable */
- [0xd1d8, 0xd1d8], /* Hangul Syllable */
- [0xd1d9, 0xd1d9], /* Hangul Syllable */
- [0xd1da, 0xd1da], /* Hangul Syllable */
- [0xd1db, 0xd1db], /* Hangul Syllable */
- [0xd1dc, 0xd1dc], /* Hangul Syllable */
- [0xd1dd, 0xd1dd], /* Hangul Syllable */
- [0xd1de, 0xd1de], /* Hangul Syllable */
- [0xd1df, 0xd1df], /* Hangul Syllable */
- [0xd1e0, 0xd1e0], /* Hangul Syllable */
- [0xd1e1, 0xd1e1], /* Hangul Syllable */
- [0xd1e2, 0xd1e2], /* Hangul Syllable */
- [0xd1e3, 0xd1e3], /* Hangul Syllable */
- [0xd1e4, 0xd1e4], /* Hangul Syllable */
- [0xd1e5, 0xd1e5], /* Hangul Syllable */
- [0xd1e6, 0xd1e6], /* Hangul Syllable */
- [0xd1e7, 0xd1e7], /* Hangul Syllable */
- [0xd1e8, 0xd1e8], /* Hangul Syllable */
- [0xd1e9, 0xd1e9], /* Hangul Syllable */
- [0xd1ea, 0xd1ea], /* Hangul Syllable */
- [0xd1eb, 0xd1eb], /* Hangul Syllable */
- [0xd1ec, 0xd1ec], /* Hangul Syllable */
- [0xd1ed, 0xd1ed], /* Hangul Syllable */
- [0xd1ee, 0xd1ee], /* Hangul Syllable */
- [0xd1ef, 0xd1ef], /* Hangul Syllable */
- [0xd1f0, 0xd1f0], /* Hangul Syllable */
- [0xd1f1, 0xd1f1], /* Hangul Syllable */
- [0xd1f2, 0xd1f2], /* Hangul Syllable */
- [0xd1f3, 0xd1f3], /* Hangul Syllable */
- [0xd1f4, 0xd1f4], /* Hangul Syllable */
- [0xd1f5, 0xd1f5], /* Hangul Syllable */
- [0xd1f6, 0xd1f6], /* Hangul Syllable */
- [0xd1f7, 0xd1f7], /* Hangul Syllable */
- [0xd1f8, 0xd1f8], /* Hangul Syllable */
- [0xd1f9, 0xd1f9], /* Hangul Syllable */
- [0xd1fa, 0xd1fa], /* Hangul Syllable */
- [0xd1fb, 0xd1fb], /* Hangul Syllable */
- [0xd1fc, 0xd1fc], /* Hangul Syllable */
- [0xd1fd, 0xd1fd], /* Hangul Syllable */
- [0xd1fe, 0xd1fe], /* Hangul Syllable */
- [0xd1ff, 0xd1ff], /* Hangul Syllable */
- [0xd200, 0xd200], /* Hangul Syllable */
- [0xd201, 0xd201], /* Hangul Syllable */
- [0xd202, 0xd202], /* Hangul Syllable */
- [0xd203, 0xd203], /* Hangul Syllable */
- [0xd204, 0xd204], /* Hangul Syllable */
- [0xd205, 0xd205], /* Hangul Syllable */
- [0xd206, 0xd206], /* Hangul Syllable */
- [0xd207, 0xd207], /* Hangul Syllable */
- [0xd208, 0xd208], /* Hangul Syllable */
- [0xd209, 0xd209], /* Hangul Syllable */
- [0xd20a, 0xd20a], /* Hangul Syllable */
- [0xd20b, 0xd20b], /* Hangul Syllable */
- [0xd20c, 0xd20c], /* Hangul Syllable */
- [0xd20d, 0xd20d], /* Hangul Syllable */
- [0xd20e, 0xd20e], /* Hangul Syllable */
- [0xd20f, 0xd20f], /* Hangul Syllable */
- [0xd210, 0xd210], /* Hangul Syllable */
- [0xd211, 0xd211], /* Hangul Syllable */
- [0xd212, 0xd212], /* Hangul Syllable */
- [0xd213, 0xd213], /* Hangul Syllable */
- [0xd214, 0xd214], /* Hangul Syllable */
- [0xd215, 0xd215], /* Hangul Syllable */
- [0xd216, 0xd216], /* Hangul Syllable */
- [0xd217, 0xd217], /* Hangul Syllable */
- [0xd218, 0xd218], /* Hangul Syllable */
- [0xd219, 0xd219], /* Hangul Syllable */
- [0xd21a, 0xd21a], /* Hangul Syllable */
- [0xd21b, 0xd21b], /* Hangul Syllable */
- [0xd21c, 0xd21c], /* Hangul Syllable */
- [0xd21d, 0xd21d], /* Hangul Syllable */
- [0xd21e, 0xd21e], /* Hangul Syllable */
- [0xd21f, 0xd21f], /* Hangul Syllable */
- [0xd220, 0xd220], /* Hangul Syllable */
- [0xd221, 0xd221], /* Hangul Syllable */
- [0xd222, 0xd222], /* Hangul Syllable */
- [0xd223, 0xd223], /* Hangul Syllable */
- [0xd224, 0xd224], /* Hangul Syllable */
- [0xd225, 0xd225], /* Hangul Syllable */
- [0xd226, 0xd226], /* Hangul Syllable */
- [0xd227, 0xd227], /* Hangul Syllable */
- [0xd228, 0xd228], /* Hangul Syllable */
- [0xd229, 0xd229], /* Hangul Syllable */
- [0xd22a, 0xd22a], /* Hangul Syllable */
- [0xd22b, 0xd22b], /* Hangul Syllable */
- [0xd22c, 0xd22c], /* Hangul Syllable */
- [0xd22d, 0xd22d], /* Hangul Syllable */
- [0xd22e, 0xd22e], /* Hangul Syllable */
- [0xd22f, 0xd22f], /* Hangul Syllable */
- [0xd230, 0xd230], /* Hangul Syllable */
- [0xd231, 0xd231], /* Hangul Syllable */
- [0xd232, 0xd232], /* Hangul Syllable */
- [0xd233, 0xd233], /* Hangul Syllable */
- [0xd234, 0xd234], /* Hangul Syllable */
- [0xd235, 0xd235], /* Hangul Syllable */
- [0xd236, 0xd236], /* Hangul Syllable */
- [0xd237, 0xd237], /* Hangul Syllable */
- [0xd238, 0xd238], /* Hangul Syllable */
- [0xd239, 0xd239], /* Hangul Syllable */
- [0xd23a, 0xd23a], /* Hangul Syllable */
- [0xd23b, 0xd23b], /* Hangul Syllable */
- [0xd23c, 0xd23c], /* Hangul Syllable */
- [0xd23d, 0xd23d], /* Hangul Syllable */
- [0xd23e, 0xd23e], /* Hangul Syllable */
- [0xd23f, 0xd23f], /* Hangul Syllable */
- [0xd240, 0xd240], /* Hangul Syllable */
- [0xd241, 0xd241], /* Hangul Syllable */
- [0xd242, 0xd242], /* Hangul Syllable */
- [0xd243, 0xd243], /* Hangul Syllable */
- [0xd244, 0xd244], /* Hangul Syllable */
- [0xd245, 0xd245], /* Hangul Syllable */
- [0xd246, 0xd246], /* Hangul Syllable */
- [0xd247, 0xd247], /* Hangul Syllable */
- [0xd248, 0xd248], /* Hangul Syllable */
- [0xd249, 0xd249], /* Hangul Syllable */
- [0xd24a, 0xd24a], /* Hangul Syllable */
- [0xd24b, 0xd24b], /* Hangul Syllable */
- [0xd24c, 0xd24c], /* Hangul Syllable */
- [0xd24d, 0xd24d], /* Hangul Syllable */
- [0xd24e, 0xd24e], /* Hangul Syllable */
- [0xd24f, 0xd24f], /* Hangul Syllable */
- [0xd250, 0xd250], /* Hangul Syllable */
- [0xd251, 0xd251], /* Hangul Syllable */
- [0xd252, 0xd252], /* Hangul Syllable */
- [0xd253, 0xd253], /* Hangul Syllable */
- [0xd254, 0xd254], /* Hangul Syllable */
- [0xd255, 0xd255], /* Hangul Syllable */
- [0xd256, 0xd256], /* Hangul Syllable */
- [0xd257, 0xd257], /* Hangul Syllable */
- [0xd258, 0xd258], /* Hangul Syllable */
- [0xd259, 0xd259], /* Hangul Syllable */
- [0xd25a, 0xd25a], /* Hangul Syllable */
- [0xd25b, 0xd25b], /* Hangul Syllable */
- [0xd25c, 0xd25c], /* Hangul Syllable */
- [0xd25d, 0xd25d], /* Hangul Syllable */
- [0xd25e, 0xd25e], /* Hangul Syllable */
- [0xd25f, 0xd25f], /* Hangul Syllable */
- [0xd260, 0xd260], /* Hangul Syllable */
- [0xd261, 0xd261], /* Hangul Syllable */
- [0xd262, 0xd262], /* Hangul Syllable */
- [0xd263, 0xd263], /* Hangul Syllable */
- [0xd264, 0xd264], /* Hangul Syllable */
- [0xd265, 0xd265], /* Hangul Syllable */
- [0xd266, 0xd266], /* Hangul Syllable */
- [0xd267, 0xd267], /* Hangul Syllable */
- [0xd268, 0xd268], /* Hangul Syllable */
- [0xd269, 0xd269], /* Hangul Syllable */
- [0xd26a, 0xd26a], /* Hangul Syllable */
- [0xd26b, 0xd26b], /* Hangul Syllable */
- [0xd26c, 0xd26c], /* Hangul Syllable */
- [0xd26d, 0xd26d], /* Hangul Syllable */
- [0xd26e, 0xd26e], /* Hangul Syllable */
- [0xd26f, 0xd26f], /* Hangul Syllable */
- [0xd270, 0xd270], /* Hangul Syllable */
- [0xd271, 0xd271], /* Hangul Syllable */
- [0xd272, 0xd272], /* Hangul Syllable */
- [0xd273, 0xd273], /* Hangul Syllable */
- [0xd274, 0xd274], /* Hangul Syllable */
- [0xd275, 0xd275], /* Hangul Syllable */
- [0xd276, 0xd276], /* Hangul Syllable */
- [0xd277, 0xd277], /* Hangul Syllable */
- [0xd278, 0xd278], /* Hangul Syllable */
- [0xd279, 0xd279], /* Hangul Syllable */
- [0xd27a, 0xd27a], /* Hangul Syllable */
- [0xd27b, 0xd27b], /* Hangul Syllable */
- [0xd27c, 0xd27c], /* Hangul Syllable */
- [0xd27d, 0xd27d], /* Hangul Syllable */
- [0xd27e, 0xd27e], /* Hangul Syllable */
- [0xd27f, 0xd27f], /* Hangul Syllable */
- [0xd280, 0xd280], /* Hangul Syllable */
- [0xd281, 0xd281], /* Hangul Syllable */
- [0xd282, 0xd282], /* Hangul Syllable */
- [0xd283, 0xd283], /* Hangul Syllable */
- [0xd284, 0xd284], /* Hangul Syllable */
- [0xd285, 0xd285], /* Hangul Syllable */
- [0xd286, 0xd286], /* Hangul Syllable */
- [0xd287, 0xd287], /* Hangul Syllable */
- [0xd288, 0xd288], /* Hangul Syllable */
- [0xd289, 0xd289], /* Hangul Syllable */
- [0xd28a, 0xd28a], /* Hangul Syllable */
- [0xd28b, 0xd28b], /* Hangul Syllable */
- [0xd28c, 0xd28c], /* Hangul Syllable */
- [0xd28d, 0xd28d], /* Hangul Syllable */
- [0xd28e, 0xd28e], /* Hangul Syllable */
- [0xd28f, 0xd28f], /* Hangul Syllable */
- [0xd290, 0xd290], /* Hangul Syllable */
- [0xd291, 0xd291], /* Hangul Syllable */
- [0xd292, 0xd292], /* Hangul Syllable */
- [0xd293, 0xd293], /* Hangul Syllable */
- [0xd294, 0xd294], /* Hangul Syllable */
- [0xd295, 0xd295], /* Hangul Syllable */
- [0xd296, 0xd296], /* Hangul Syllable */
- [0xd297, 0xd297], /* Hangul Syllable */
- [0xd298, 0xd298], /* Hangul Syllable */
- [0xd299, 0xd299], /* Hangul Syllable */
- [0xd29a, 0xd29a], /* Hangul Syllable */
- [0xd29b, 0xd29b], /* Hangul Syllable */
- [0xd29c, 0xd29c], /* Hangul Syllable */
- [0xd29d, 0xd29d], /* Hangul Syllable */
- [0xd29e, 0xd29e], /* Hangul Syllable */
- [0xd29f, 0xd29f], /* Hangul Syllable */
- [0xd2a0, 0xd2a0], /* Hangul Syllable */
- [0xd2a1, 0xd2a1], /* Hangul Syllable */
- [0xd2a2, 0xd2a2], /* Hangul Syllable */
- [0xd2a3, 0xd2a3], /* Hangul Syllable */
- [0xd2a4, 0xd2a4], /* Hangul Syllable */
- [0xd2a5, 0xd2a5], /* Hangul Syllable */
- [0xd2a6, 0xd2a6], /* Hangul Syllable */
- [0xd2a7, 0xd2a7], /* Hangul Syllable */
- [0xd2a8, 0xd2a8], /* Hangul Syllable */
- [0xd2a9, 0xd2a9], /* Hangul Syllable */
- [0xd2aa, 0xd2aa], /* Hangul Syllable */
- [0xd2ab, 0xd2ab], /* Hangul Syllable */
- [0xd2ac, 0xd2ac], /* Hangul Syllable */
- [0xd2ad, 0xd2ad], /* Hangul Syllable */
- [0xd2ae, 0xd2ae], /* Hangul Syllable */
- [0xd2af, 0xd2af], /* Hangul Syllable */
- [0xd2b0, 0xd2b0], /* Hangul Syllable */
- [0xd2b1, 0xd2b1], /* Hangul Syllable */
- [0xd2b2, 0xd2b2], /* Hangul Syllable */
- [0xd2b3, 0xd2b3], /* Hangul Syllable */
- [0xd2b4, 0xd2b4], /* Hangul Syllable */
- [0xd2b5, 0xd2b5], /* Hangul Syllable */
- [0xd2b6, 0xd2b6], /* Hangul Syllable */
- [0xd2b7, 0xd2b7], /* Hangul Syllable */
- [0xd2b8, 0xd2b8], /* Hangul Syllable */
- [0xd2b9, 0xd2b9], /* Hangul Syllable */
- [0xd2ba, 0xd2ba], /* Hangul Syllable */
- [0xd2bb, 0xd2bb], /* Hangul Syllable */
- [0xd2bc, 0xd2bc], /* Hangul Syllable */
- [0xd2bd, 0xd2bd], /* Hangul Syllable */
- [0xd2be, 0xd2be], /* Hangul Syllable */
- [0xd2bf, 0xd2bf], /* Hangul Syllable */
- [0xd2c0, 0xd2c0], /* Hangul Syllable */
- [0xd2c1, 0xd2c1], /* Hangul Syllable */
- [0xd2c2, 0xd2c2], /* Hangul Syllable */
- [0xd2c3, 0xd2c3], /* Hangul Syllable */
- [0xd2c4, 0xd2c4], /* Hangul Syllable */
- [0xd2c5, 0xd2c5], /* Hangul Syllable */
- [0xd2c6, 0xd2c6], /* Hangul Syllable */
- [0xd2c7, 0xd2c7], /* Hangul Syllable */
- [0xd2c8, 0xd2c8], /* Hangul Syllable */
- [0xd2c9, 0xd2c9], /* Hangul Syllable */
- [0xd2ca, 0xd2ca], /* Hangul Syllable */
- [0xd2cb, 0xd2cb], /* Hangul Syllable */
- [0xd2cc, 0xd2cc], /* Hangul Syllable */
- [0xd2cd, 0xd2cd], /* Hangul Syllable */
- [0xd2ce, 0xd2ce], /* Hangul Syllable */
- [0xd2cf, 0xd2cf], /* Hangul Syllable */
- [0xd2d0, 0xd2d0], /* Hangul Syllable */
- [0xd2d1, 0xd2d1], /* Hangul Syllable */
- [0xd2d2, 0xd2d2], /* Hangul Syllable */
- [0xd2d3, 0xd2d3], /* Hangul Syllable */
- [0xd2d4, 0xd2d4], /* Hangul Syllable */
- [0xd2d5, 0xd2d5], /* Hangul Syllable */
- [0xd2d6, 0xd2d6], /* Hangul Syllable */
- [0xd2d7, 0xd2d7], /* Hangul Syllable */
- [0xd2d8, 0xd2d8], /* Hangul Syllable */
- [0xd2d9, 0xd2d9], /* Hangul Syllable */
- [0xd2da, 0xd2da], /* Hangul Syllable */
- [0xd2db, 0xd2db], /* Hangul Syllable */
- [0xd2dc, 0xd2dc], /* Hangul Syllable */
- [0xd2dd, 0xd2dd], /* Hangul Syllable */
- [0xd2de, 0xd2de], /* Hangul Syllable */
- [0xd2df, 0xd2df], /* Hangul Syllable */
- [0xd2e0, 0xd2e0], /* Hangul Syllable */
- [0xd2e1, 0xd2e1], /* Hangul Syllable */
- [0xd2e2, 0xd2e2], /* Hangul Syllable */
- [0xd2e3, 0xd2e3], /* Hangul Syllable */
- [0xd2e4, 0xd2e4], /* Hangul Syllable */
- [0xd2e5, 0xd2e5], /* Hangul Syllable */
- [0xd2e6, 0xd2e6], /* Hangul Syllable */
- [0xd2e7, 0xd2e7], /* Hangul Syllable */
- [0xd2e8, 0xd2e8], /* Hangul Syllable */
- [0xd2e9, 0xd2e9], /* Hangul Syllable */
- [0xd2ea, 0xd2ea], /* Hangul Syllable */
- [0xd2eb, 0xd2eb], /* Hangul Syllable */
- [0xd2ec, 0xd2ec], /* Hangul Syllable */
- [0xd2ed, 0xd2ed], /* Hangul Syllable */
- [0xd2ee, 0xd2ee], /* Hangul Syllable */
- [0xd2ef, 0xd2ef], /* Hangul Syllable */
- [0xd2f0, 0xd2f0], /* Hangul Syllable */
- [0xd2f1, 0xd2f1], /* Hangul Syllable */
- [0xd2f2, 0xd2f2], /* Hangul Syllable */
- [0xd2f3, 0xd2f3], /* Hangul Syllable */
- [0xd2f4, 0xd2f4], /* Hangul Syllable */
- [0xd2f5, 0xd2f5], /* Hangul Syllable */
- [0xd2f6, 0xd2f6], /* Hangul Syllable */
- [0xd2f7, 0xd2f7], /* Hangul Syllable */
- [0xd2f8, 0xd2f8], /* Hangul Syllable */
- [0xd2f9, 0xd2f9], /* Hangul Syllable */
- [0xd2fa, 0xd2fa], /* Hangul Syllable */
- [0xd2fb, 0xd2fb], /* Hangul Syllable */
- [0xd2fc, 0xd2fc], /* Hangul Syllable */
- [0xd2fd, 0xd2fd], /* Hangul Syllable */
- [0xd2fe, 0xd2fe], /* Hangul Syllable */
- [0xd2ff, 0xd2ff], /* Hangul Syllable */
- [0xd300, 0xd300], /* Hangul Syllable */
- [0xd301, 0xd301], /* Hangul Syllable */
- [0xd302, 0xd302], /* Hangul Syllable */
- [0xd303, 0xd303], /* Hangul Syllable */
- [0xd304, 0xd304], /* Hangul Syllable */
- [0xd305, 0xd305], /* Hangul Syllable */
- [0xd306, 0xd306], /* Hangul Syllable */
- [0xd307, 0xd307], /* Hangul Syllable */
- [0xd308, 0xd308], /* Hangul Syllable */
- [0xd309, 0xd309], /* Hangul Syllable */
- [0xd30a, 0xd30a], /* Hangul Syllable */
- [0xd30b, 0xd30b], /* Hangul Syllable */
- [0xd30c, 0xd30c], /* Hangul Syllable */
- [0xd30d, 0xd30d], /* Hangul Syllable */
- [0xd30e, 0xd30e], /* Hangul Syllable */
- [0xd30f, 0xd30f], /* Hangul Syllable */
- [0xd310, 0xd310], /* Hangul Syllable */
- [0xd311, 0xd311], /* Hangul Syllable */
- [0xd312, 0xd312], /* Hangul Syllable */
- [0xd313, 0xd313], /* Hangul Syllable */
- [0xd314, 0xd314], /* Hangul Syllable */
- [0xd315, 0xd315], /* Hangul Syllable */
- [0xd316, 0xd316], /* Hangul Syllable */
- [0xd317, 0xd317], /* Hangul Syllable */
- [0xd318, 0xd318], /* Hangul Syllable */
- [0xd319, 0xd319], /* Hangul Syllable */
- [0xd31a, 0xd31a], /* Hangul Syllable */
- [0xd31b, 0xd31b], /* Hangul Syllable */
- [0xd31c, 0xd31c], /* Hangul Syllable */
- [0xd31d, 0xd31d], /* Hangul Syllable */
- [0xd31e, 0xd31e], /* Hangul Syllable */
- [0xd31f, 0xd31f], /* Hangul Syllable */
- [0xd320, 0xd320], /* Hangul Syllable */
- [0xd321, 0xd321], /* Hangul Syllable */
- [0xd322, 0xd322], /* Hangul Syllable */
- [0xd323, 0xd323], /* Hangul Syllable */
- [0xd324, 0xd324], /* Hangul Syllable */
- [0xd325, 0xd325], /* Hangul Syllable */
- [0xd326, 0xd326], /* Hangul Syllable */
- [0xd327, 0xd327], /* Hangul Syllable */
- [0xd328, 0xd328], /* Hangul Syllable */
- [0xd329, 0xd329], /* Hangul Syllable */
- [0xd32a, 0xd32a], /* Hangul Syllable */
- [0xd32b, 0xd32b], /* Hangul Syllable */
- [0xd32c, 0xd32c], /* Hangul Syllable */
- [0xd32d, 0xd32d], /* Hangul Syllable */
- [0xd32e, 0xd32e], /* Hangul Syllable */
- [0xd32f, 0xd32f], /* Hangul Syllable */
- [0xd330, 0xd330], /* Hangul Syllable */
- [0xd331, 0xd331], /* Hangul Syllable */
- [0xd332, 0xd332], /* Hangul Syllable */
- [0xd333, 0xd333], /* Hangul Syllable */
- [0xd334, 0xd334], /* Hangul Syllable */
- [0xd335, 0xd335], /* Hangul Syllable */
- [0xd336, 0xd336], /* Hangul Syllable */
- [0xd337, 0xd337], /* Hangul Syllable */
- [0xd338, 0xd338], /* Hangul Syllable */
- [0xd339, 0xd339], /* Hangul Syllable */
- [0xd33a, 0xd33a], /* Hangul Syllable */
- [0xd33b, 0xd33b], /* Hangul Syllable */
- [0xd33c, 0xd33c], /* Hangul Syllable */
- [0xd33d, 0xd33d], /* Hangul Syllable */
- [0xd33e, 0xd33e], /* Hangul Syllable */
- [0xd33f, 0xd33f], /* Hangul Syllable */
- [0xd340, 0xd340], /* Hangul Syllable */
- [0xd341, 0xd341], /* Hangul Syllable */
- [0xd342, 0xd342], /* Hangul Syllable */
- [0xd343, 0xd343], /* Hangul Syllable */
- [0xd344, 0xd344], /* Hangul Syllable */
- [0xd345, 0xd345], /* Hangul Syllable */
- [0xd346, 0xd346], /* Hangul Syllable */
- [0xd347, 0xd347], /* Hangul Syllable */
- [0xd348, 0xd348], /* Hangul Syllable */
- [0xd349, 0xd349], /* Hangul Syllable */
- [0xd34a, 0xd34a], /* Hangul Syllable */
- [0xd34b, 0xd34b], /* Hangul Syllable */
- [0xd34c, 0xd34c], /* Hangul Syllable */
- [0xd34d, 0xd34d], /* Hangul Syllable */
- [0xd34e, 0xd34e], /* Hangul Syllable */
- [0xd34f, 0xd34f], /* Hangul Syllable */
- [0xd350, 0xd350], /* Hangul Syllable */
- [0xd351, 0xd351], /* Hangul Syllable */
- [0xd352, 0xd352], /* Hangul Syllable */
- [0xd353, 0xd353], /* Hangul Syllable */
- [0xd354, 0xd354], /* Hangul Syllable */
- [0xd355, 0xd355], /* Hangul Syllable */
- [0xd356, 0xd356], /* Hangul Syllable */
- [0xd357, 0xd357], /* Hangul Syllable */
- [0xd358, 0xd358], /* Hangul Syllable */
- [0xd359, 0xd359], /* Hangul Syllable */
- [0xd35a, 0xd35a], /* Hangul Syllable */
- [0xd35b, 0xd35b], /* Hangul Syllable */
- [0xd35c, 0xd35c], /* Hangul Syllable */
- [0xd35d, 0xd35d], /* Hangul Syllable */
- [0xd35e, 0xd35e], /* Hangul Syllable */
- [0xd35f, 0xd35f], /* Hangul Syllable */
- [0xd360, 0xd360], /* Hangul Syllable */
- [0xd361, 0xd361], /* Hangul Syllable */
- [0xd362, 0xd362], /* Hangul Syllable */
- [0xd363, 0xd363], /* Hangul Syllable */
- [0xd364, 0xd364], /* Hangul Syllable */
- [0xd365, 0xd365], /* Hangul Syllable */
- [0xd366, 0xd366], /* Hangul Syllable */
- [0xd367, 0xd367], /* Hangul Syllable */
- [0xd368, 0xd368], /* Hangul Syllable */
- [0xd369, 0xd369], /* Hangul Syllable */
- [0xd36a, 0xd36a], /* Hangul Syllable */
- [0xd36b, 0xd36b], /* Hangul Syllable */
- [0xd36c, 0xd36c], /* Hangul Syllable */
- [0xd36d, 0xd36d], /* Hangul Syllable */
- [0xd36e, 0xd36e], /* Hangul Syllable */
- [0xd36f, 0xd36f], /* Hangul Syllable */
- [0xd370, 0xd370], /* Hangul Syllable */
- [0xd371, 0xd371], /* Hangul Syllable */
- [0xd372, 0xd372], /* Hangul Syllable */
- [0xd373, 0xd373], /* Hangul Syllable */
- [0xd374, 0xd374], /* Hangul Syllable */
- [0xd375, 0xd375], /* Hangul Syllable */
- [0xd376, 0xd376], /* Hangul Syllable */
- [0xd377, 0xd377], /* Hangul Syllable */
- [0xd378, 0xd378], /* Hangul Syllable */
- [0xd379, 0xd379], /* Hangul Syllable */
- [0xd37a, 0xd37a], /* Hangul Syllable */
- [0xd37b, 0xd37b], /* Hangul Syllable */
- [0xd37c, 0xd37c], /* Hangul Syllable */
- [0xd37d, 0xd37d], /* Hangul Syllable */
- [0xd37e, 0xd37e], /* Hangul Syllable */
- [0xd37f, 0xd37f], /* Hangul Syllable */
- [0xd380, 0xd380], /* Hangul Syllable */
- [0xd381, 0xd381], /* Hangul Syllable */
- [0xd382, 0xd382], /* Hangul Syllable */
- [0xd383, 0xd383], /* Hangul Syllable */
- [0xd384, 0xd384], /* Hangul Syllable */
- [0xd385, 0xd385], /* Hangul Syllable */
- [0xd386, 0xd386], /* Hangul Syllable */
- [0xd387, 0xd387], /* Hangul Syllable */
- [0xd388, 0xd388], /* Hangul Syllable */
- [0xd389, 0xd389], /* Hangul Syllable */
- [0xd38a, 0xd38a], /* Hangul Syllable */
- [0xd38b, 0xd38b], /* Hangul Syllable */
- [0xd38c, 0xd38c], /* Hangul Syllable */
- [0xd38d, 0xd38d], /* Hangul Syllable */
- [0xd38e, 0xd38e], /* Hangul Syllable */
- [0xd38f, 0xd38f], /* Hangul Syllable */
- [0xd390, 0xd390], /* Hangul Syllable */
- [0xd391, 0xd391], /* Hangul Syllable */
- [0xd392, 0xd392], /* Hangul Syllable */
- [0xd393, 0xd393], /* Hangul Syllable */
- [0xd394, 0xd394], /* Hangul Syllable */
- [0xd395, 0xd395], /* Hangul Syllable */
- [0xd396, 0xd396], /* Hangul Syllable */
- [0xd397, 0xd397], /* Hangul Syllable */
- [0xd398, 0xd398], /* Hangul Syllable */
- [0xd399, 0xd399], /* Hangul Syllable */
- [0xd39a, 0xd39a], /* Hangul Syllable */
- [0xd39b, 0xd39b], /* Hangul Syllable */
- [0xd39c, 0xd39c], /* Hangul Syllable */
- [0xd39d, 0xd39d], /* Hangul Syllable */
- [0xd39e, 0xd39e], /* Hangul Syllable */
- [0xd39f, 0xd39f], /* Hangul Syllable */
- [0xd3a0, 0xd3a0], /* Hangul Syllable */
- [0xd3a1, 0xd3a1], /* Hangul Syllable */
- [0xd3a2, 0xd3a2], /* Hangul Syllable */
- [0xd3a3, 0xd3a3], /* Hangul Syllable */
- [0xd3a4, 0xd3a4], /* Hangul Syllable */
- [0xd3a5, 0xd3a5], /* Hangul Syllable */
- [0xd3a6, 0xd3a6], /* Hangul Syllable */
- [0xd3a7, 0xd3a7], /* Hangul Syllable */
- [0xd3a8, 0xd3a8], /* Hangul Syllable */
- [0xd3a9, 0xd3a9], /* Hangul Syllable */
- [0xd3aa, 0xd3aa], /* Hangul Syllable */
- [0xd3ab, 0xd3ab], /* Hangul Syllable */
- [0xd3ac, 0xd3ac], /* Hangul Syllable */
- [0xd3ad, 0xd3ad], /* Hangul Syllable */
- [0xd3ae, 0xd3ae], /* Hangul Syllable */
- [0xd3af, 0xd3af], /* Hangul Syllable */
- [0xd3b0, 0xd3b0], /* Hangul Syllable */
- [0xd3b1, 0xd3b1], /* Hangul Syllable */
- [0xd3b2, 0xd3b2], /* Hangul Syllable */
- [0xd3b3, 0xd3b3], /* Hangul Syllable */
- [0xd3b4, 0xd3b4], /* Hangul Syllable */
- [0xd3b5, 0xd3b5], /* Hangul Syllable */
- [0xd3b6, 0xd3b6], /* Hangul Syllable */
- [0xd3b7, 0xd3b7], /* Hangul Syllable */
- [0xd3b8, 0xd3b8], /* Hangul Syllable */
- [0xd3b9, 0xd3b9], /* Hangul Syllable */
- [0xd3ba, 0xd3ba], /* Hangul Syllable */
- [0xd3bb, 0xd3bb], /* Hangul Syllable */
- [0xd3bc, 0xd3bc], /* Hangul Syllable */
- [0xd3bd, 0xd3bd], /* Hangul Syllable */
- [0xd3be, 0xd3be], /* Hangul Syllable */
- [0xd3bf, 0xd3bf], /* Hangul Syllable */
- [0xd3c0, 0xd3c0], /* Hangul Syllable */
- [0xd3c1, 0xd3c1], /* Hangul Syllable */
- [0xd3c2, 0xd3c2], /* Hangul Syllable */
- [0xd3c3, 0xd3c3], /* Hangul Syllable */
- [0xd3c4, 0xd3c4], /* Hangul Syllable */
- [0xd3c5, 0xd3c5], /* Hangul Syllable */
- [0xd3c6, 0xd3c6], /* Hangul Syllable */
- [0xd3c7, 0xd3c7], /* Hangul Syllable */
- [0xd3c8, 0xd3c8], /* Hangul Syllable */
- [0xd3c9, 0xd3c9], /* Hangul Syllable */
- [0xd3ca, 0xd3ca], /* Hangul Syllable */
- [0xd3cb, 0xd3cb], /* Hangul Syllable */
- [0xd3cc, 0xd3cc], /* Hangul Syllable */
- [0xd3cd, 0xd3cd], /* Hangul Syllable */
- [0xd3ce, 0xd3ce], /* Hangul Syllable */
- [0xd3cf, 0xd3cf], /* Hangul Syllable */
- [0xd3d0, 0xd3d0], /* Hangul Syllable */
- [0xd3d1, 0xd3d1], /* Hangul Syllable */
- [0xd3d2, 0xd3d2], /* Hangul Syllable */
- [0xd3d3, 0xd3d3], /* Hangul Syllable */
- [0xd3d4, 0xd3d4], /* Hangul Syllable */
- [0xd3d5, 0xd3d5], /* Hangul Syllable */
- [0xd3d6, 0xd3d6], /* Hangul Syllable */
- [0xd3d7, 0xd3d7], /* Hangul Syllable */
- [0xd3d8, 0xd3d8], /* Hangul Syllable */
- [0xd3d9, 0xd3d9], /* Hangul Syllable */
- [0xd3da, 0xd3da], /* Hangul Syllable */
- [0xd3db, 0xd3db], /* Hangul Syllable */
- [0xd3dc, 0xd3dc], /* Hangul Syllable */
- [0xd3dd, 0xd3dd], /* Hangul Syllable */
- [0xd3de, 0xd3de], /* Hangul Syllable */
- [0xd3df, 0xd3df], /* Hangul Syllable */
- [0xd3e0, 0xd3e0], /* Hangul Syllable */
- [0xd3e1, 0xd3e1], /* Hangul Syllable */
- [0xd3e2, 0xd3e2], /* Hangul Syllable */
- [0xd3e3, 0xd3e3], /* Hangul Syllable */
- [0xd3e4, 0xd3e4], /* Hangul Syllable */
- [0xd3e5, 0xd3e5], /* Hangul Syllable */
- [0xd3e6, 0xd3e6], /* Hangul Syllable */
- [0xd3e7, 0xd3e7], /* Hangul Syllable */
- [0xd3e8, 0xd3e8], /* Hangul Syllable */
- [0xd3e9, 0xd3e9], /* Hangul Syllable */
- [0xd3ea, 0xd3ea], /* Hangul Syllable */
- [0xd3eb, 0xd3eb], /* Hangul Syllable */
- [0xd3ec, 0xd3ec], /* Hangul Syllable */
- [0xd3ed, 0xd3ed], /* Hangul Syllable */
- [0xd3ee, 0xd3ee], /* Hangul Syllable */
- [0xd3ef, 0xd3ef], /* Hangul Syllable */
- [0xd3f0, 0xd3f0], /* Hangul Syllable */
- [0xd3f1, 0xd3f1], /* Hangul Syllable */
- [0xd3f2, 0xd3f2], /* Hangul Syllable */
- [0xd3f3, 0xd3f3], /* Hangul Syllable */
- [0xd3f4, 0xd3f4], /* Hangul Syllable */
- [0xd3f5, 0xd3f5], /* Hangul Syllable */
- [0xd3f6, 0xd3f6], /* Hangul Syllable */
- [0xd3f7, 0xd3f7], /* Hangul Syllable */
- [0xd3f8, 0xd3f8], /* Hangul Syllable */
- [0xd3f9, 0xd3f9], /* Hangul Syllable */
- [0xd3fa, 0xd3fa], /* Hangul Syllable */
- [0xd3fb, 0xd3fb], /* Hangul Syllable */
- [0xd3fc, 0xd3fc], /* Hangul Syllable */
- [0xd3fd, 0xd3fd], /* Hangul Syllable */
- [0xd3fe, 0xd3fe], /* Hangul Syllable */
- [0xd3ff, 0xd3ff], /* Hangul Syllable */
- [0xd400, 0xd400], /* Hangul Syllable */
- [0xd401, 0xd401], /* Hangul Syllable */
- [0xd402, 0xd402], /* Hangul Syllable */
- [0xd403, 0xd403], /* Hangul Syllable */
- [0xd404, 0xd404], /* Hangul Syllable */
- [0xd405, 0xd405], /* Hangul Syllable */
- [0xd406, 0xd406], /* Hangul Syllable */
- [0xd407, 0xd407], /* Hangul Syllable */
- [0xd408, 0xd408], /* Hangul Syllable */
- [0xd409, 0xd409], /* Hangul Syllable */
- [0xd40a, 0xd40a], /* Hangul Syllable */
- [0xd40b, 0xd40b], /* Hangul Syllable */
- [0xd40c, 0xd40c], /* Hangul Syllable */
- [0xd40d, 0xd40d], /* Hangul Syllable */
- [0xd40e, 0xd40e], /* Hangul Syllable */
- [0xd40f, 0xd40f], /* Hangul Syllable */
- [0xd410, 0xd410], /* Hangul Syllable */
- [0xd411, 0xd411], /* Hangul Syllable */
- [0xd412, 0xd412], /* Hangul Syllable */
- [0xd413, 0xd413], /* Hangul Syllable */
- [0xd414, 0xd414], /* Hangul Syllable */
- [0xd415, 0xd415], /* Hangul Syllable */
- [0xd416, 0xd416], /* Hangul Syllable */
- [0xd417, 0xd417], /* Hangul Syllable */
- [0xd418, 0xd418], /* Hangul Syllable */
- [0xd419, 0xd419], /* Hangul Syllable */
- [0xd41a, 0xd41a], /* Hangul Syllable */
- [0xd41b, 0xd41b], /* Hangul Syllable */
- [0xd41c, 0xd41c], /* Hangul Syllable */
- [0xd41d, 0xd41d], /* Hangul Syllable */
- [0xd41e, 0xd41e], /* Hangul Syllable */
- [0xd41f, 0xd41f], /* Hangul Syllable */
- [0xd420, 0xd420], /* Hangul Syllable */
- [0xd421, 0xd421], /* Hangul Syllable */
- [0xd422, 0xd422], /* Hangul Syllable */
- [0xd423, 0xd423], /* Hangul Syllable */
- [0xd424, 0xd424], /* Hangul Syllable */
- [0xd425, 0xd425], /* Hangul Syllable */
- [0xd426, 0xd426], /* Hangul Syllable */
- [0xd427, 0xd427], /* Hangul Syllable */
- [0xd428, 0xd428], /* Hangul Syllable */
- [0xd429, 0xd429], /* Hangul Syllable */
- [0xd42a, 0xd42a], /* Hangul Syllable */
- [0xd42b, 0xd42b], /* Hangul Syllable */
- [0xd42c, 0xd42c], /* Hangul Syllable */
- [0xd42d, 0xd42d], /* Hangul Syllable */
- [0xd42e, 0xd42e], /* Hangul Syllable */
- [0xd42f, 0xd42f], /* Hangul Syllable */
- [0xd430, 0xd430], /* Hangul Syllable */
- [0xd431, 0xd431], /* Hangul Syllable */
- [0xd432, 0xd432], /* Hangul Syllable */
- [0xd433, 0xd433], /* Hangul Syllable */
- [0xd434, 0xd434], /* Hangul Syllable */
- [0xd435, 0xd435], /* Hangul Syllable */
- [0xd436, 0xd436], /* Hangul Syllable */
- [0xd437, 0xd437], /* Hangul Syllable */
- [0xd438, 0xd438], /* Hangul Syllable */
- [0xd439, 0xd439], /* Hangul Syllable */
- [0xd43a, 0xd43a], /* Hangul Syllable */
- [0xd43b, 0xd43b], /* Hangul Syllable */
- [0xd43c, 0xd43c], /* Hangul Syllable */
- [0xd43d, 0xd43d], /* Hangul Syllable */
- [0xd43e, 0xd43e], /* Hangul Syllable */
- [0xd43f, 0xd43f], /* Hangul Syllable */
- [0xd440, 0xd440], /* Hangul Syllable */
- [0xd441, 0xd441], /* Hangul Syllable */
- [0xd442, 0xd442], /* Hangul Syllable */
- [0xd443, 0xd443], /* Hangul Syllable */
- [0xd444, 0xd444], /* Hangul Syllable */
- [0xd445, 0xd445], /* Hangul Syllable */
- [0xd446, 0xd446], /* Hangul Syllable */
- [0xd447, 0xd447], /* Hangul Syllable */
- [0xd448, 0xd448], /* Hangul Syllable */
- [0xd449, 0xd449], /* Hangul Syllable */
- [0xd44a, 0xd44a], /* Hangul Syllable */
- [0xd44b, 0xd44b], /* Hangul Syllable */
- [0xd44c, 0xd44c], /* Hangul Syllable */
- [0xd44d, 0xd44d], /* Hangul Syllable */
- [0xd44e, 0xd44e], /* Hangul Syllable */
- [0xd44f, 0xd44f], /* Hangul Syllable */
- [0xd450, 0xd450], /* Hangul Syllable */
- [0xd451, 0xd451], /* Hangul Syllable */
- [0xd452, 0xd452], /* Hangul Syllable */
- [0xd453, 0xd453], /* Hangul Syllable */
- [0xd454, 0xd454], /* Hangul Syllable */
- [0xd455, 0xd455], /* Hangul Syllable */
- [0xd456, 0xd456], /* Hangul Syllable */
- [0xd457, 0xd457], /* Hangul Syllable */
- [0xd458, 0xd458], /* Hangul Syllable */
- [0xd459, 0xd459], /* Hangul Syllable */
- [0xd45a, 0xd45a], /* Hangul Syllable */
- [0xd45b, 0xd45b], /* Hangul Syllable */
- [0xd45c, 0xd45c], /* Hangul Syllable */
- [0xd45d, 0xd45d], /* Hangul Syllable */
- [0xd45e, 0xd45e], /* Hangul Syllable */
- [0xd45f, 0xd45f], /* Hangul Syllable */
- [0xd460, 0xd460], /* Hangul Syllable */
- [0xd461, 0xd461], /* Hangul Syllable */
- [0xd462, 0xd462], /* Hangul Syllable */
- [0xd463, 0xd463], /* Hangul Syllable */
- [0xd464, 0xd464], /* Hangul Syllable */
- [0xd465, 0xd465], /* Hangul Syllable */
- [0xd466, 0xd466], /* Hangul Syllable */
- [0xd467, 0xd467], /* Hangul Syllable */
- [0xd468, 0xd468], /* Hangul Syllable */
- [0xd469, 0xd469], /* Hangul Syllable */
- [0xd46a, 0xd46a], /* Hangul Syllable */
- [0xd46b, 0xd46b], /* Hangul Syllable */
- [0xd46c, 0xd46c], /* Hangul Syllable */
- [0xd46d, 0xd46d], /* Hangul Syllable */
- [0xd46e, 0xd46e], /* Hangul Syllable */
- [0xd46f, 0xd46f], /* Hangul Syllable */
- [0xd470, 0xd470], /* Hangul Syllable */
- [0xd471, 0xd471], /* Hangul Syllable */
- [0xd472, 0xd472], /* Hangul Syllable */
- [0xd473, 0xd473], /* Hangul Syllable */
- [0xd474, 0xd474], /* Hangul Syllable */
- [0xd475, 0xd475], /* Hangul Syllable */
- [0xd476, 0xd476], /* Hangul Syllable */
- [0xd477, 0xd477], /* Hangul Syllable */
- [0xd478, 0xd478], /* Hangul Syllable */
- [0xd479, 0xd479], /* Hangul Syllable */
- [0xd47a, 0xd47a], /* Hangul Syllable */
- [0xd47b, 0xd47b], /* Hangul Syllable */
- [0xd47c, 0xd47c], /* Hangul Syllable */
- [0xd47d, 0xd47d], /* Hangul Syllable */
- [0xd47e, 0xd47e], /* Hangul Syllable */
- [0xd47f, 0xd47f], /* Hangul Syllable */
- [0xd480, 0xd480], /* Hangul Syllable */
- [0xd481, 0xd481], /* Hangul Syllable */
- [0xd482, 0xd482], /* Hangul Syllable */
- [0xd483, 0xd483], /* Hangul Syllable */
- [0xd484, 0xd484], /* Hangul Syllable */
- [0xd485, 0xd485], /* Hangul Syllable */
- [0xd486, 0xd486], /* Hangul Syllable */
- [0xd487, 0xd487], /* Hangul Syllable */
- [0xd488, 0xd488], /* Hangul Syllable */
- [0xd489, 0xd489], /* Hangul Syllable */
- [0xd48a, 0xd48a], /* Hangul Syllable */
- [0xd48b, 0xd48b], /* Hangul Syllable */
- [0xd48c, 0xd48c], /* Hangul Syllable */
- [0xd48d, 0xd48d], /* Hangul Syllable */
- [0xd48e, 0xd48e], /* Hangul Syllable */
- [0xd48f, 0xd48f], /* Hangul Syllable */
- [0xd490, 0xd490], /* Hangul Syllable */
- [0xd491, 0xd491], /* Hangul Syllable */
- [0xd492, 0xd492], /* Hangul Syllable */
- [0xd493, 0xd493], /* Hangul Syllable */
- [0xd494, 0xd494], /* Hangul Syllable */
- [0xd495, 0xd495], /* Hangul Syllable */
- [0xd496, 0xd496], /* Hangul Syllable */
- [0xd497, 0xd497], /* Hangul Syllable */
- [0xd498, 0xd498], /* Hangul Syllable */
- [0xd499, 0xd499], /* Hangul Syllable */
- [0xd49a, 0xd49a], /* Hangul Syllable */
- [0xd49b, 0xd49b], /* Hangul Syllable */
- [0xd49c, 0xd49c], /* Hangul Syllable */
- [0xd49d, 0xd49d], /* Hangul Syllable */
- [0xd49e, 0xd49e], /* Hangul Syllable */
- [0xd49f, 0xd49f], /* Hangul Syllable */
- [0xd4a0, 0xd4a0], /* Hangul Syllable */
- [0xd4a1, 0xd4a1], /* Hangul Syllable */
- [0xd4a2, 0xd4a2], /* Hangul Syllable */
- [0xd4a3, 0xd4a3], /* Hangul Syllable */
- [0xd4a4, 0xd4a4], /* Hangul Syllable */
- [0xd4a5, 0xd4a5], /* Hangul Syllable */
- [0xd4a6, 0xd4a6], /* Hangul Syllable */
- [0xd4a7, 0xd4a7], /* Hangul Syllable */
- [0xd4a8, 0xd4a8], /* Hangul Syllable */
- [0xd4a9, 0xd4a9], /* Hangul Syllable */
- [0xd4aa, 0xd4aa], /* Hangul Syllable */
- [0xd4ab, 0xd4ab], /* Hangul Syllable */
- [0xd4ac, 0xd4ac], /* Hangul Syllable */
- [0xd4ad, 0xd4ad], /* Hangul Syllable */
- [0xd4ae, 0xd4ae], /* Hangul Syllable */
- [0xd4af, 0xd4af], /* Hangul Syllable */
- [0xd4b0, 0xd4b0], /* Hangul Syllable */
- [0xd4b1, 0xd4b1], /* Hangul Syllable */
- [0xd4b2, 0xd4b2], /* Hangul Syllable */
- [0xd4b3, 0xd4b3], /* Hangul Syllable */
- [0xd4b4, 0xd4b4], /* Hangul Syllable */
- [0xd4b5, 0xd4b5], /* Hangul Syllable */
- [0xd4b6, 0xd4b6], /* Hangul Syllable */
- [0xd4b7, 0xd4b7], /* Hangul Syllable */
- [0xd4b8, 0xd4b8], /* Hangul Syllable */
- [0xd4b9, 0xd4b9], /* Hangul Syllable */
- [0xd4ba, 0xd4ba], /* Hangul Syllable */
- [0xd4bb, 0xd4bb], /* Hangul Syllable */
- [0xd4bc, 0xd4bc], /* Hangul Syllable */
- [0xd4bd, 0xd4bd], /* Hangul Syllable */
- [0xd4be, 0xd4be], /* Hangul Syllable */
- [0xd4bf, 0xd4bf], /* Hangul Syllable */
- [0xd4c0, 0xd4c0], /* Hangul Syllable */
- [0xd4c1, 0xd4c1], /* Hangul Syllable */
- [0xd4c2, 0xd4c2], /* Hangul Syllable */
- [0xd4c3, 0xd4c3], /* Hangul Syllable */
- [0xd4c4, 0xd4c4], /* Hangul Syllable */
- [0xd4c5, 0xd4c5], /* Hangul Syllable */
- [0xd4c6, 0xd4c6], /* Hangul Syllable */
- [0xd4c7, 0xd4c7], /* Hangul Syllable */
- [0xd4c8, 0xd4c8], /* Hangul Syllable */
- [0xd4c9, 0xd4c9], /* Hangul Syllable */
- [0xd4ca, 0xd4ca], /* Hangul Syllable */
- [0xd4cb, 0xd4cb], /* Hangul Syllable */
- [0xd4cc, 0xd4cc], /* Hangul Syllable */
- [0xd4cd, 0xd4cd], /* Hangul Syllable */
- [0xd4ce, 0xd4ce], /* Hangul Syllable */
- [0xd4cf, 0xd4cf], /* Hangul Syllable */
- [0xd4d0, 0xd4d0], /* Hangul Syllable */
- [0xd4d1, 0xd4d1], /* Hangul Syllable */
- [0xd4d2, 0xd4d2], /* Hangul Syllable */
- [0xd4d3, 0xd4d3], /* Hangul Syllable */
- [0xd4d4, 0xd4d4], /* Hangul Syllable */
- [0xd4d5, 0xd4d5], /* Hangul Syllable */
- [0xd4d6, 0xd4d6], /* Hangul Syllable */
- [0xd4d7, 0xd4d7], /* Hangul Syllable */
- [0xd4d8, 0xd4d8], /* Hangul Syllable */
- [0xd4d9, 0xd4d9], /* Hangul Syllable */
- [0xd4da, 0xd4da], /* Hangul Syllable */
- [0xd4db, 0xd4db], /* Hangul Syllable */
- [0xd4dc, 0xd4dc], /* Hangul Syllable */
- [0xd4dd, 0xd4dd], /* Hangul Syllable */
- [0xd4de, 0xd4de], /* Hangul Syllable */
- [0xd4df, 0xd4df], /* Hangul Syllable */
- [0xd4e0, 0xd4e0], /* Hangul Syllable */
- [0xd4e1, 0xd4e1], /* Hangul Syllable */
- [0xd4e2, 0xd4e2], /* Hangul Syllable */
- [0xd4e3, 0xd4e3], /* Hangul Syllable */
- [0xd4e4, 0xd4e4], /* Hangul Syllable */
- [0xd4e5, 0xd4e5], /* Hangul Syllable */
- [0xd4e6, 0xd4e6], /* Hangul Syllable */
- [0xd4e7, 0xd4e7], /* Hangul Syllable */
- [0xd4e8, 0xd4e8], /* Hangul Syllable */
- [0xd4e9, 0xd4e9], /* Hangul Syllable */
- [0xd4ea, 0xd4ea], /* Hangul Syllable */
- [0xd4eb, 0xd4eb], /* Hangul Syllable */
- [0xd4ec, 0xd4ec], /* Hangul Syllable */
- [0xd4ed, 0xd4ed], /* Hangul Syllable */
- [0xd4ee, 0xd4ee], /* Hangul Syllable */
- [0xd4ef, 0xd4ef], /* Hangul Syllable */
- [0xd4f0, 0xd4f0], /* Hangul Syllable */
- [0xd4f1, 0xd4f1], /* Hangul Syllable */
- [0xd4f2, 0xd4f2], /* Hangul Syllable */
- [0xd4f3, 0xd4f3], /* Hangul Syllable */
- [0xd4f4, 0xd4f4], /* Hangul Syllable */
- [0xd4f5, 0xd4f5], /* Hangul Syllable */
- [0xd4f6, 0xd4f6], /* Hangul Syllable */
- [0xd4f7, 0xd4f7], /* Hangul Syllable */
- [0xd4f8, 0xd4f8], /* Hangul Syllable */
- [0xd4f9, 0xd4f9], /* Hangul Syllable */
- [0xd4fa, 0xd4fa], /* Hangul Syllable */
- [0xd4fb, 0xd4fb], /* Hangul Syllable */
- [0xd4fc, 0xd4fc], /* Hangul Syllable */
- [0xd4fd, 0xd4fd], /* Hangul Syllable */
- [0xd4fe, 0xd4fe], /* Hangul Syllable */
- [0xd4ff, 0xd4ff], /* Hangul Syllable */
- [0xd500, 0xd500], /* Hangul Syllable */
- [0xd501, 0xd501], /* Hangul Syllable */
- [0xd502, 0xd502], /* Hangul Syllable */
- [0xd503, 0xd503], /* Hangul Syllable */
- [0xd504, 0xd504], /* Hangul Syllable */
- [0xd505, 0xd505], /* Hangul Syllable */
- [0xd506, 0xd506], /* Hangul Syllable */
- [0xd507, 0xd507], /* Hangul Syllable */
- [0xd508, 0xd508], /* Hangul Syllable */
- [0xd509, 0xd509], /* Hangul Syllable */
- [0xd50a, 0xd50a], /* Hangul Syllable */
- [0xd50b, 0xd50b], /* Hangul Syllable */
- [0xd50c, 0xd50c], /* Hangul Syllable */
- [0xd50d, 0xd50d], /* Hangul Syllable */
- [0xd50e, 0xd50e], /* Hangul Syllable */
- [0xd50f, 0xd50f], /* Hangul Syllable */
- [0xd510, 0xd510], /* Hangul Syllable */
- [0xd511, 0xd511], /* Hangul Syllable */
- [0xd512, 0xd512], /* Hangul Syllable */
- [0xd513, 0xd513], /* Hangul Syllable */
- [0xd514, 0xd514], /* Hangul Syllable */
- [0xd515, 0xd515], /* Hangul Syllable */
- [0xd516, 0xd516], /* Hangul Syllable */
- [0xd517, 0xd517], /* Hangul Syllable */
- [0xd518, 0xd518], /* Hangul Syllable */
- [0xd519, 0xd519], /* Hangul Syllable */
- [0xd51a, 0xd51a], /* Hangul Syllable */
- [0xd51b, 0xd51b], /* Hangul Syllable */
- [0xd51c, 0xd51c], /* Hangul Syllable */
- [0xd51d, 0xd51d], /* Hangul Syllable */
- [0xd51e, 0xd51e], /* Hangul Syllable */
- [0xd51f, 0xd51f], /* Hangul Syllable */
- [0xd520, 0xd520], /* Hangul Syllable */
- [0xd521, 0xd521], /* Hangul Syllable */
- [0xd522, 0xd522], /* Hangul Syllable */
- [0xd523, 0xd523], /* Hangul Syllable */
- [0xd524, 0xd524], /* Hangul Syllable */
- [0xd525, 0xd525], /* Hangul Syllable */
- [0xd526, 0xd526], /* Hangul Syllable */
- [0xd527, 0xd527], /* Hangul Syllable */
- [0xd528, 0xd528], /* Hangul Syllable */
- [0xd529, 0xd529], /* Hangul Syllable */
- [0xd52a, 0xd52a], /* Hangul Syllable */
- [0xd52b, 0xd52b], /* Hangul Syllable */
- [0xd52c, 0xd52c], /* Hangul Syllable */
- [0xd52d, 0xd52d], /* Hangul Syllable */
- [0xd52e, 0xd52e], /* Hangul Syllable */
- [0xd52f, 0xd52f], /* Hangul Syllable */
- [0xd530, 0xd530], /* Hangul Syllable */
- [0xd531, 0xd531], /* Hangul Syllable */
- [0xd532, 0xd532], /* Hangul Syllable */
- [0xd533, 0xd533], /* Hangul Syllable */
- [0xd534, 0xd534], /* Hangul Syllable */
- [0xd535, 0xd535], /* Hangul Syllable */
- [0xd536, 0xd536], /* Hangul Syllable */
- [0xd537, 0xd537], /* Hangul Syllable */
- [0xd538, 0xd538], /* Hangul Syllable */
- [0xd539, 0xd539], /* Hangul Syllable */
- [0xd53a, 0xd53a], /* Hangul Syllable */
- [0xd53b, 0xd53b], /* Hangul Syllable */
- [0xd53c, 0xd53c], /* Hangul Syllable */
- [0xd53d, 0xd53d], /* Hangul Syllable */
- [0xd53e, 0xd53e], /* Hangul Syllable */
- [0xd53f, 0xd53f], /* Hangul Syllable */
- [0xd540, 0xd540], /* Hangul Syllable */
- [0xd541, 0xd541], /* Hangul Syllable */
- [0xd542, 0xd542], /* Hangul Syllable */
- [0xd543, 0xd543], /* Hangul Syllable */
- [0xd544, 0xd544], /* Hangul Syllable */
- [0xd545, 0xd545], /* Hangul Syllable */
- [0xd546, 0xd546], /* Hangul Syllable */
- [0xd547, 0xd547], /* Hangul Syllable */
- [0xd548, 0xd548], /* Hangul Syllable */
- [0xd549, 0xd549], /* Hangul Syllable */
- [0xd54a, 0xd54a], /* Hangul Syllable */
- [0xd54b, 0xd54b], /* Hangul Syllable */
- [0xd54c, 0xd54c], /* Hangul Syllable */
- [0xd54d, 0xd54d], /* Hangul Syllable */
- [0xd54e, 0xd54e], /* Hangul Syllable */
- [0xd54f, 0xd54f], /* Hangul Syllable */
- [0xd550, 0xd550], /* Hangul Syllable */
- [0xd551, 0xd551], /* Hangul Syllable */
- [0xd552, 0xd552], /* Hangul Syllable */
- [0xd553, 0xd553], /* Hangul Syllable */
- [0xd554, 0xd554], /* Hangul Syllable */
- [0xd555, 0xd555], /* Hangul Syllable */
- [0xd556, 0xd556], /* Hangul Syllable */
- [0xd557, 0xd557], /* Hangul Syllable */
- [0xd558, 0xd558], /* Hangul Syllable */
- [0xd559, 0xd559], /* Hangul Syllable */
- [0xd55a, 0xd55a], /* Hangul Syllable */
- [0xd55b, 0xd55b], /* Hangul Syllable */
- [0xd55c, 0xd55c], /* Hangul Syllable */
- [0xd55d, 0xd55d], /* Hangul Syllable */
- [0xd55e, 0xd55e], /* Hangul Syllable */
- [0xd55f, 0xd55f], /* Hangul Syllable */
- [0xd560, 0xd560], /* Hangul Syllable */
- [0xd561, 0xd561], /* Hangul Syllable */
- [0xd562, 0xd562], /* Hangul Syllable */
- [0xd563, 0xd563], /* Hangul Syllable */
- [0xd564, 0xd564], /* Hangul Syllable */
- [0xd565, 0xd565], /* Hangul Syllable */
- [0xd566, 0xd566], /* Hangul Syllable */
- [0xd567, 0xd567], /* Hangul Syllable */
- [0xd568, 0xd568], /* Hangul Syllable */
- [0xd569, 0xd569], /* Hangul Syllable */
- [0xd56a, 0xd56a], /* Hangul Syllable */
- [0xd56b, 0xd56b], /* Hangul Syllable */
- [0xd56c, 0xd56c], /* Hangul Syllable */
- [0xd56d, 0xd56d], /* Hangul Syllable */
- [0xd56e, 0xd56e], /* Hangul Syllable */
- [0xd56f, 0xd56f], /* Hangul Syllable */
- [0xd570, 0xd570], /* Hangul Syllable */
- [0xd571, 0xd571], /* Hangul Syllable */
- [0xd572, 0xd572], /* Hangul Syllable */
- [0xd573, 0xd573], /* Hangul Syllable */
- [0xd574, 0xd574], /* Hangul Syllable */
- [0xd575, 0xd575], /* Hangul Syllable */
- [0xd576, 0xd576], /* Hangul Syllable */
- [0xd577, 0xd577], /* Hangul Syllable */
- [0xd578, 0xd578], /* Hangul Syllable */
- [0xd579, 0xd579], /* Hangul Syllable */
- [0xd57a, 0xd57a], /* Hangul Syllable */
- [0xd57b, 0xd57b], /* Hangul Syllable */
- [0xd57c, 0xd57c], /* Hangul Syllable */
- [0xd57d, 0xd57d], /* Hangul Syllable */
- [0xd57e, 0xd57e], /* Hangul Syllable */
- [0xd57f, 0xd57f], /* Hangul Syllable */
- [0xd580, 0xd580], /* Hangul Syllable */
- [0xd581, 0xd581], /* Hangul Syllable */
- [0xd582, 0xd582], /* Hangul Syllable */
- [0xd583, 0xd583], /* Hangul Syllable */
- [0xd584, 0xd584], /* Hangul Syllable */
- [0xd585, 0xd585], /* Hangul Syllable */
- [0xd586, 0xd586], /* Hangul Syllable */
- [0xd587, 0xd587], /* Hangul Syllable */
- [0xd588, 0xd588], /* Hangul Syllable */
- [0xd589, 0xd589], /* Hangul Syllable */
- [0xd58a, 0xd58a], /* Hangul Syllable */
- [0xd58b, 0xd58b], /* Hangul Syllable */
- [0xd58c, 0xd58c], /* Hangul Syllable */
- [0xd58d, 0xd58d], /* Hangul Syllable */
- [0xd58e, 0xd58e], /* Hangul Syllable */
- [0xd58f, 0xd58f], /* Hangul Syllable */
- [0xd590, 0xd590], /* Hangul Syllable */
- [0xd591, 0xd591], /* Hangul Syllable */
- [0xd592, 0xd592], /* Hangul Syllable */
- [0xd593, 0xd593], /* Hangul Syllable */
- [0xd594, 0xd594], /* Hangul Syllable */
- [0xd595, 0xd595], /* Hangul Syllable */
- [0xd596, 0xd596], /* Hangul Syllable */
- [0xd597, 0xd597], /* Hangul Syllable */
- [0xd598, 0xd598], /* Hangul Syllable */
- [0xd599, 0xd599], /* Hangul Syllable */
- [0xd59a, 0xd59a], /* Hangul Syllable */
- [0xd59b, 0xd59b], /* Hangul Syllable */
- [0xd59c, 0xd59c], /* Hangul Syllable */
- [0xd59d, 0xd59d], /* Hangul Syllable */
- [0xd59e, 0xd59e], /* Hangul Syllable */
- [0xd59f, 0xd59f], /* Hangul Syllable */
- [0xd5a0, 0xd5a0], /* Hangul Syllable */
- [0xd5a1, 0xd5a1], /* Hangul Syllable */
- [0xd5a2, 0xd5a2], /* Hangul Syllable */
- [0xd5a3, 0xd5a3], /* Hangul Syllable */
- [0xd5a4, 0xd5a4], /* Hangul Syllable */
- [0xd5a5, 0xd5a5], /* Hangul Syllable */
- [0xd5a6, 0xd5a6], /* Hangul Syllable */
- [0xd5a7, 0xd5a7], /* Hangul Syllable */
- [0xd5a8, 0xd5a8], /* Hangul Syllable */
- [0xd5a9, 0xd5a9], /* Hangul Syllable */
- [0xd5aa, 0xd5aa], /* Hangul Syllable */
- [0xd5ab, 0xd5ab], /* Hangul Syllable */
- [0xd5ac, 0xd5ac], /* Hangul Syllable */
- [0xd5ad, 0xd5ad], /* Hangul Syllable */
- [0xd5ae, 0xd5ae], /* Hangul Syllable */
- [0xd5af, 0xd5af], /* Hangul Syllable */
- [0xd5b0, 0xd5b0], /* Hangul Syllable */
- [0xd5b1, 0xd5b1], /* Hangul Syllable */
- [0xd5b2, 0xd5b2], /* Hangul Syllable */
- [0xd5b3, 0xd5b3], /* Hangul Syllable */
- [0xd5b4, 0xd5b4], /* Hangul Syllable */
- [0xd5b5, 0xd5b5], /* Hangul Syllable */
- [0xd5b6, 0xd5b6], /* Hangul Syllable */
- [0xd5b7, 0xd5b7], /* Hangul Syllable */
- [0xd5b8, 0xd5b8], /* Hangul Syllable */
- [0xd5b9, 0xd5b9], /* Hangul Syllable */
- [0xd5ba, 0xd5ba], /* Hangul Syllable */
- [0xd5bb, 0xd5bb], /* Hangul Syllable */
- [0xd5bc, 0xd5bc], /* Hangul Syllable */
- [0xd5bd, 0xd5bd], /* Hangul Syllable */
- [0xd5be, 0xd5be], /* Hangul Syllable */
- [0xd5bf, 0xd5bf], /* Hangul Syllable */
- [0xd5c0, 0xd5c0], /* Hangul Syllable */
- [0xd5c1, 0xd5c1], /* Hangul Syllable */
- [0xd5c2, 0xd5c2], /* Hangul Syllable */
- [0xd5c3, 0xd5c3], /* Hangul Syllable */
- [0xd5c4, 0xd5c4], /* Hangul Syllable */
- [0xd5c5, 0xd5c5], /* Hangul Syllable */
- [0xd5c6, 0xd5c6], /* Hangul Syllable */
- [0xd5c7, 0xd5c7], /* Hangul Syllable */
- [0xd5c8, 0xd5c8], /* Hangul Syllable */
- [0xd5c9, 0xd5c9], /* Hangul Syllable */
- [0xd5ca, 0xd5ca], /* Hangul Syllable */
- [0xd5cb, 0xd5cb], /* Hangul Syllable */
- [0xd5cc, 0xd5cc], /* Hangul Syllable */
- [0xd5cd, 0xd5cd], /* Hangul Syllable */
- [0xd5ce, 0xd5ce], /* Hangul Syllable */
- [0xd5cf, 0xd5cf], /* Hangul Syllable */
- [0xd5d0, 0xd5d0], /* Hangul Syllable */
- [0xd5d1, 0xd5d1], /* Hangul Syllable */
- [0xd5d2, 0xd5d2], /* Hangul Syllable */
- [0xd5d3, 0xd5d3], /* Hangul Syllable */
- [0xd5d4, 0xd5d4], /* Hangul Syllable */
- [0xd5d5, 0xd5d5], /* Hangul Syllable */
- [0xd5d6, 0xd5d6], /* Hangul Syllable */
- [0xd5d7, 0xd5d7], /* Hangul Syllable */
- [0xd5d8, 0xd5d8], /* Hangul Syllable */
- [0xd5d9, 0xd5d9], /* Hangul Syllable */
- [0xd5da, 0xd5da], /* Hangul Syllable */
- [0xd5db, 0xd5db], /* Hangul Syllable */
- [0xd5dc, 0xd5dc], /* Hangul Syllable */
- [0xd5dd, 0xd5dd], /* Hangul Syllable */
- [0xd5de, 0xd5de], /* Hangul Syllable */
- [0xd5df, 0xd5df], /* Hangul Syllable */
- [0xd5e0, 0xd5e0], /* Hangul Syllable */
- [0xd5e1, 0xd5e1], /* Hangul Syllable */
- [0xd5e2, 0xd5e2], /* Hangul Syllable */
- [0xd5e3, 0xd5e3], /* Hangul Syllable */
- [0xd5e4, 0xd5e4], /* Hangul Syllable */
- [0xd5e5, 0xd5e5], /* Hangul Syllable */
- [0xd5e6, 0xd5e6], /* Hangul Syllable */
- [0xd5e7, 0xd5e7], /* Hangul Syllable */
- [0xd5e8, 0xd5e8], /* Hangul Syllable */
- [0xd5e9, 0xd5e9], /* Hangul Syllable */
- [0xd5ea, 0xd5ea], /* Hangul Syllable */
- [0xd5eb, 0xd5eb], /* Hangul Syllable */
- [0xd5ec, 0xd5ec], /* Hangul Syllable */
- [0xd5ed, 0xd5ed], /* Hangul Syllable */
- [0xd5ee, 0xd5ee], /* Hangul Syllable */
- [0xd5ef, 0xd5ef], /* Hangul Syllable */
- [0xd5f0, 0xd5f0], /* Hangul Syllable */
- [0xd5f1, 0xd5f1], /* Hangul Syllable */
- [0xd5f2, 0xd5f2], /* Hangul Syllable */
- [0xd5f3, 0xd5f3], /* Hangul Syllable */
- [0xd5f4, 0xd5f4], /* Hangul Syllable */
- [0xd5f5, 0xd5f5], /* Hangul Syllable */
- [0xd5f6, 0xd5f6], /* Hangul Syllable */
- [0xd5f7, 0xd5f7], /* Hangul Syllable */
- [0xd5f8, 0xd5f8], /* Hangul Syllable */
- [0xd5f9, 0xd5f9], /* Hangul Syllable */
- [0xd5fa, 0xd5fa], /* Hangul Syllable */
- [0xd5fb, 0xd5fb], /* Hangul Syllable */
- [0xd5fc, 0xd5fc], /* Hangul Syllable */
- [0xd5fd, 0xd5fd], /* Hangul Syllable */
- [0xd5fe, 0xd5fe], /* Hangul Syllable */
- [0xd5ff, 0xd5ff], /* Hangul Syllable */
- [0xd600, 0xd600], /* Hangul Syllable */
- [0xd601, 0xd601], /* Hangul Syllable */
- [0xd602, 0xd602], /* Hangul Syllable */
- [0xd603, 0xd603], /* Hangul Syllable */
- [0xd604, 0xd604], /* Hangul Syllable */
- [0xd605, 0xd605], /* Hangul Syllable */
- [0xd606, 0xd606], /* Hangul Syllable */
- [0xd607, 0xd607], /* Hangul Syllable */
- [0xd608, 0xd608], /* Hangul Syllable */
- [0xd609, 0xd609], /* Hangul Syllable */
- [0xd60a, 0xd60a], /* Hangul Syllable */
- [0xd60b, 0xd60b], /* Hangul Syllable */
- [0xd60c, 0xd60c], /* Hangul Syllable */
- [0xd60d, 0xd60d], /* Hangul Syllable */
- [0xd60e, 0xd60e], /* Hangul Syllable */
- [0xd60f, 0xd60f], /* Hangul Syllable */
- [0xd610, 0xd610], /* Hangul Syllable */
- [0xd611, 0xd611], /* Hangul Syllable */
- [0xd612, 0xd612], /* Hangul Syllable */
- [0xd613, 0xd613], /* Hangul Syllable */
- [0xd614, 0xd614], /* Hangul Syllable */
- [0xd615, 0xd615], /* Hangul Syllable */
- [0xd616, 0xd616], /* Hangul Syllable */
- [0xd617, 0xd617], /* Hangul Syllable */
- [0xd618, 0xd618], /* Hangul Syllable */
- [0xd619, 0xd619], /* Hangul Syllable */
- [0xd61a, 0xd61a], /* Hangul Syllable */
- [0xd61b, 0xd61b], /* Hangul Syllable */
- [0xd61c, 0xd61c], /* Hangul Syllable */
- [0xd61d, 0xd61d], /* Hangul Syllable */
- [0xd61e, 0xd61e], /* Hangul Syllable */
- [0xd61f, 0xd61f], /* Hangul Syllable */
- [0xd620, 0xd620], /* Hangul Syllable */
- [0xd621, 0xd621], /* Hangul Syllable */
- [0xd622, 0xd622], /* Hangul Syllable */
- [0xd623, 0xd623], /* Hangul Syllable */
- [0xd624, 0xd624], /* Hangul Syllable */
- [0xd625, 0xd625], /* Hangul Syllable */
- [0xd626, 0xd626], /* Hangul Syllable */
- [0xd627, 0xd627], /* Hangul Syllable */
- [0xd628, 0xd628], /* Hangul Syllable */
- [0xd629, 0xd629], /* Hangul Syllable */
- [0xd62a, 0xd62a], /* Hangul Syllable */
- [0xd62b, 0xd62b], /* Hangul Syllable */
- [0xd62c, 0xd62c], /* Hangul Syllable */
- [0xd62d, 0xd62d], /* Hangul Syllable */
- [0xd62e, 0xd62e], /* Hangul Syllable */
- [0xd62f, 0xd62f], /* Hangul Syllable */
- [0xd630, 0xd630], /* Hangul Syllable */
- [0xd631, 0xd631], /* Hangul Syllable */
- [0xd632, 0xd632], /* Hangul Syllable */
- [0xd633, 0xd633], /* Hangul Syllable */
- [0xd634, 0xd634], /* Hangul Syllable */
- [0xd635, 0xd635], /* Hangul Syllable */
- [0xd636, 0xd636], /* Hangul Syllable */
- [0xd637, 0xd637], /* Hangul Syllable */
- [0xd638, 0xd638], /* Hangul Syllable */
- [0xd639, 0xd639], /* Hangul Syllable */
- [0xd63a, 0xd63a], /* Hangul Syllable */
- [0xd63b, 0xd63b], /* Hangul Syllable */
- [0xd63c, 0xd63c], /* Hangul Syllable */
- [0xd63d, 0xd63d], /* Hangul Syllable */
- [0xd63e, 0xd63e], /* Hangul Syllable */
- [0xd63f, 0xd63f], /* Hangul Syllable */
- [0xd640, 0xd640], /* Hangul Syllable */
- [0xd641, 0xd641], /* Hangul Syllable */
- [0xd642, 0xd642], /* Hangul Syllable */
- [0xd643, 0xd643], /* Hangul Syllable */
- [0xd644, 0xd644], /* Hangul Syllable */
- [0xd645, 0xd645], /* Hangul Syllable */
- [0xd646, 0xd646], /* Hangul Syllable */
- [0xd647, 0xd647], /* Hangul Syllable */
- [0xd648, 0xd648], /* Hangul Syllable */
- [0xd649, 0xd649], /* Hangul Syllable */
- [0xd64a, 0xd64a], /* Hangul Syllable */
- [0xd64b, 0xd64b], /* Hangul Syllable */
- [0xd64c, 0xd64c], /* Hangul Syllable */
- [0xd64d, 0xd64d], /* Hangul Syllable */
- [0xd64e, 0xd64e], /* Hangul Syllable */
- [0xd64f, 0xd64f], /* Hangul Syllable */
- [0xd650, 0xd650], /* Hangul Syllable */
- [0xd651, 0xd651], /* Hangul Syllable */
- [0xd652, 0xd652], /* Hangul Syllable */
- [0xd653, 0xd653], /* Hangul Syllable */
- [0xd654, 0xd654], /* Hangul Syllable */
- [0xd655, 0xd655], /* Hangul Syllable */
- [0xd656, 0xd656], /* Hangul Syllable */
- [0xd657, 0xd657], /* Hangul Syllable */
- [0xd658, 0xd658], /* Hangul Syllable */
- [0xd659, 0xd659], /* Hangul Syllable */
- [0xd65a, 0xd65a], /* Hangul Syllable */
- [0xd65b, 0xd65b], /* Hangul Syllable */
- [0xd65c, 0xd65c], /* Hangul Syllable */
- [0xd65d, 0xd65d], /* Hangul Syllable */
- [0xd65e, 0xd65e], /* Hangul Syllable */
- [0xd65f, 0xd65f], /* Hangul Syllable */
- [0xd660, 0xd660], /* Hangul Syllable */
- [0xd661, 0xd661], /* Hangul Syllable */
- [0xd662, 0xd662], /* Hangul Syllable */
- [0xd663, 0xd663], /* Hangul Syllable */
- [0xd664, 0xd664], /* Hangul Syllable */
- [0xd665, 0xd665], /* Hangul Syllable */
- [0xd666, 0xd666], /* Hangul Syllable */
- [0xd667, 0xd667], /* Hangul Syllable */
- [0xd668, 0xd668], /* Hangul Syllable */
- [0xd669, 0xd669], /* Hangul Syllable */
- [0xd66a, 0xd66a], /* Hangul Syllable */
- [0xd66b, 0xd66b], /* Hangul Syllable */
- [0xd66c, 0xd66c], /* Hangul Syllable */
- [0xd66d, 0xd66d], /* Hangul Syllable */
- [0xd66e, 0xd66e], /* Hangul Syllable */
- [0xd66f, 0xd66f], /* Hangul Syllable */
- [0xd670, 0xd670], /* Hangul Syllable */
- [0xd671, 0xd671], /* Hangul Syllable */
- [0xd672, 0xd672], /* Hangul Syllable */
- [0xd673, 0xd673], /* Hangul Syllable */
- [0xd674, 0xd674], /* Hangul Syllable */
- [0xd675, 0xd675], /* Hangul Syllable */
- [0xd676, 0xd676], /* Hangul Syllable */
- [0xd677, 0xd677], /* Hangul Syllable */
- [0xd678, 0xd678], /* Hangul Syllable */
- [0xd679, 0xd679], /* Hangul Syllable */
- [0xd67a, 0xd67a], /* Hangul Syllable */
- [0xd67b, 0xd67b], /* Hangul Syllable */
- [0xd67c, 0xd67c], /* Hangul Syllable */
- [0xd67d, 0xd67d], /* Hangul Syllable */
- [0xd67e, 0xd67e], /* Hangul Syllable */
- [0xd67f, 0xd67f], /* Hangul Syllable */
- [0xd680, 0xd680], /* Hangul Syllable */
- [0xd681, 0xd681], /* Hangul Syllable */
- [0xd682, 0xd682], /* Hangul Syllable */
- [0xd683, 0xd683], /* Hangul Syllable */
- [0xd684, 0xd684], /* Hangul Syllable */
- [0xd685, 0xd685], /* Hangul Syllable */
- [0xd686, 0xd686], /* Hangul Syllable */
- [0xd687, 0xd687], /* Hangul Syllable */
- [0xd688, 0xd688], /* Hangul Syllable */
- [0xd689, 0xd689], /* Hangul Syllable */
- [0xd68a, 0xd68a], /* Hangul Syllable */
- [0xd68b, 0xd68b], /* Hangul Syllable */
- [0xd68c, 0xd68c], /* Hangul Syllable */
- [0xd68d, 0xd68d], /* Hangul Syllable */
- [0xd68e, 0xd68e], /* Hangul Syllable */
- [0xd68f, 0xd68f], /* Hangul Syllable */
- [0xd690, 0xd690], /* Hangul Syllable */
- [0xd691, 0xd691], /* Hangul Syllable */
- [0xd692, 0xd692], /* Hangul Syllable */
- [0xd693, 0xd693], /* Hangul Syllable */
- [0xd694, 0xd694], /* Hangul Syllable */
- [0xd695, 0xd695], /* Hangul Syllable */
- [0xd696, 0xd696], /* Hangul Syllable */
- [0xd697, 0xd697], /* Hangul Syllable */
- [0xd698, 0xd698], /* Hangul Syllable */
- [0xd699, 0xd699], /* Hangul Syllable */
- [0xd69a, 0xd69a], /* Hangul Syllable */
- [0xd69b, 0xd69b], /* Hangul Syllable */
- [0xd69c, 0xd69c], /* Hangul Syllable */
- [0xd69d, 0xd69d], /* Hangul Syllable */
- [0xd69e, 0xd69e], /* Hangul Syllable */
- [0xd69f, 0xd69f], /* Hangul Syllable */
- [0xd6a0, 0xd6a0], /* Hangul Syllable */
- [0xd6a1, 0xd6a1], /* Hangul Syllable */
- [0xd6a2, 0xd6a2], /* Hangul Syllable */
- [0xd6a3, 0xd6a3], /* Hangul Syllable */
- [0xd6a4, 0xd6a4], /* Hangul Syllable */
- [0xd6a5, 0xd6a5], /* Hangul Syllable */
- [0xd6a6, 0xd6a6], /* Hangul Syllable */
- [0xd6a7, 0xd6a7], /* Hangul Syllable */
- [0xd6a8, 0xd6a8], /* Hangul Syllable */
- [0xd6a9, 0xd6a9], /* Hangul Syllable */
- [0xd6aa, 0xd6aa], /* Hangul Syllable */
- [0xd6ab, 0xd6ab], /* Hangul Syllable */
- [0xd6ac, 0xd6ac], /* Hangul Syllable */
- [0xd6ad, 0xd6ad], /* Hangul Syllable */
- [0xd6ae, 0xd6ae], /* Hangul Syllable */
- [0xd6af, 0xd6af], /* Hangul Syllable */
- [0xd6b0, 0xd6b0], /* Hangul Syllable */
- [0xd6b1, 0xd6b1], /* Hangul Syllable */
- [0xd6b2, 0xd6b2], /* Hangul Syllable */
- [0xd6b3, 0xd6b3], /* Hangul Syllable */
- [0xd6b4, 0xd6b4], /* Hangul Syllable */
- [0xd6b5, 0xd6b5], /* Hangul Syllable */
- [0xd6b6, 0xd6b6], /* Hangul Syllable */
- [0xd6b7, 0xd6b7], /* Hangul Syllable */
- [0xd6b8, 0xd6b8], /* Hangul Syllable */
- [0xd6b9, 0xd6b9], /* Hangul Syllable */
- [0xd6ba, 0xd6ba], /* Hangul Syllable */
- [0xd6bb, 0xd6bb], /* Hangul Syllable */
- [0xd6bc, 0xd6bc], /* Hangul Syllable */
- [0xd6bd, 0xd6bd], /* Hangul Syllable */
- [0xd6be, 0xd6be], /* Hangul Syllable */
- [0xd6bf, 0xd6bf], /* Hangul Syllable */
- [0xd6c0, 0xd6c0], /* Hangul Syllable */
- [0xd6c1, 0xd6c1], /* Hangul Syllable */
- [0xd6c2, 0xd6c2], /* Hangul Syllable */
- [0xd6c3, 0xd6c3], /* Hangul Syllable */
- [0xd6c4, 0xd6c4], /* Hangul Syllable */
- [0xd6c5, 0xd6c5], /* Hangul Syllable */
- [0xd6c6, 0xd6c6], /* Hangul Syllable */
- [0xd6c7, 0xd6c7], /* Hangul Syllable */
- [0xd6c8, 0xd6c8], /* Hangul Syllable */
- [0xd6c9, 0xd6c9], /* Hangul Syllable */
- [0xd6ca, 0xd6ca], /* Hangul Syllable */
- [0xd6cb, 0xd6cb], /* Hangul Syllable */
- [0xd6cc, 0xd6cc], /* Hangul Syllable */
- [0xd6cd, 0xd6cd], /* Hangul Syllable */
- [0xd6ce, 0xd6ce], /* Hangul Syllable */
- [0xd6cf, 0xd6cf], /* Hangul Syllable */
- [0xd6d0, 0xd6d0], /* Hangul Syllable */
- [0xd6d1, 0xd6d1], /* Hangul Syllable */
- [0xd6d2, 0xd6d2], /* Hangul Syllable */
- [0xd6d3, 0xd6d3], /* Hangul Syllable */
- [0xd6d4, 0xd6d4], /* Hangul Syllable */
- [0xd6d5, 0xd6d5], /* Hangul Syllable */
- [0xd6d6, 0xd6d6], /* Hangul Syllable */
- [0xd6d7, 0xd6d7], /* Hangul Syllable */
- [0xd6d8, 0xd6d8], /* Hangul Syllable */
- [0xd6d9, 0xd6d9], /* Hangul Syllable */
- [0xd6da, 0xd6da], /* Hangul Syllable */
- [0xd6db, 0xd6db], /* Hangul Syllable */
- [0xd6dc, 0xd6dc], /* Hangul Syllable */
- [0xd6dd, 0xd6dd], /* Hangul Syllable */
- [0xd6de, 0xd6de], /* Hangul Syllable */
- [0xd6df, 0xd6df], /* Hangul Syllable */
- [0xd6e0, 0xd6e0], /* Hangul Syllable */
- [0xd6e1, 0xd6e1], /* Hangul Syllable */
- [0xd6e2, 0xd6e2], /* Hangul Syllable */
- [0xd6e3, 0xd6e3], /* Hangul Syllable */
- [0xd6e4, 0xd6e4], /* Hangul Syllable */
- [0xd6e5, 0xd6e5], /* Hangul Syllable */
- [0xd6e6, 0xd6e6], /* Hangul Syllable */
- [0xd6e7, 0xd6e7], /* Hangul Syllable */
- [0xd6e8, 0xd6e8], /* Hangul Syllable */
- [0xd6e9, 0xd6e9], /* Hangul Syllable */
- [0xd6ea, 0xd6ea], /* Hangul Syllable */
- [0xd6eb, 0xd6eb], /* Hangul Syllable */
- [0xd6ec, 0xd6ec], /* Hangul Syllable */
- [0xd6ed, 0xd6ed], /* Hangul Syllable */
- [0xd6ee, 0xd6ee], /* Hangul Syllable */
- [0xd6ef, 0xd6ef], /* Hangul Syllable */
- [0xd6f0, 0xd6f0], /* Hangul Syllable */
- [0xd6f1, 0xd6f1], /* Hangul Syllable */
- [0xd6f2, 0xd6f2], /* Hangul Syllable */
- [0xd6f3, 0xd6f3], /* Hangul Syllable */
- [0xd6f4, 0xd6f4], /* Hangul Syllable */
- [0xd6f5, 0xd6f5], /* Hangul Syllable */
- [0xd6f6, 0xd6f6], /* Hangul Syllable */
- [0xd6f7, 0xd6f7], /* Hangul Syllable */
- [0xd6f8, 0xd6f8], /* Hangul Syllable */
- [0xd6f9, 0xd6f9], /* Hangul Syllable */
- [0xd6fa, 0xd6fa], /* Hangul Syllable */
- [0xd6fb, 0xd6fb], /* Hangul Syllable */
- [0xd6fc, 0xd6fc], /* Hangul Syllable */
- [0xd6fd, 0xd6fd], /* Hangul Syllable */
- [0xd6fe, 0xd6fe], /* Hangul Syllable */
- [0xd6ff, 0xd6ff], /* Hangul Syllable */
- [0xd700, 0xd700], /* Hangul Syllable */
- [0xd701, 0xd701], /* Hangul Syllable */
- [0xd702, 0xd702], /* Hangul Syllable */
- [0xd703, 0xd703], /* Hangul Syllable */
- [0xd704, 0xd704], /* Hangul Syllable */
- [0xd705, 0xd705], /* Hangul Syllable */
- [0xd706, 0xd706], /* Hangul Syllable */
- [0xd707, 0xd707], /* Hangul Syllable */
- [0xd708, 0xd708], /* Hangul Syllable */
- [0xd709, 0xd709], /* Hangul Syllable */
- [0xd70a, 0xd70a], /* Hangul Syllable */
- [0xd70b, 0xd70b], /* Hangul Syllable */
- [0xd70c, 0xd70c], /* Hangul Syllable */
- [0xd70d, 0xd70d], /* Hangul Syllable */
- [0xd70e, 0xd70e], /* Hangul Syllable */
- [0xd70f, 0xd70f], /* Hangul Syllable */
- [0xd710, 0xd710], /* Hangul Syllable */
- [0xd711, 0xd711], /* Hangul Syllable */
- [0xd712, 0xd712], /* Hangul Syllable */
- [0xd713, 0xd713], /* Hangul Syllable */
- [0xd714, 0xd714], /* Hangul Syllable */
- [0xd715, 0xd715], /* Hangul Syllable */
- [0xd716, 0xd716], /* Hangul Syllable */
- [0xd717, 0xd717], /* Hangul Syllable */
- [0xd718, 0xd718], /* Hangul Syllable */
- [0xd719, 0xd719], /* Hangul Syllable */
- [0xd71a, 0xd71a], /* Hangul Syllable */
- [0xd71b, 0xd71b], /* Hangul Syllable */
- [0xd71c, 0xd71c], /* Hangul Syllable */
- [0xd71d, 0xd71d], /* Hangul Syllable */
- [0xd71e, 0xd71e], /* Hangul Syllable */
- [0xd71f, 0xd71f], /* Hangul Syllable */
- [0xd720, 0xd720], /* Hangul Syllable */
- [0xd721, 0xd721], /* Hangul Syllable */
- [0xd722, 0xd722], /* Hangul Syllable */
- [0xd723, 0xd723], /* Hangul Syllable */
- [0xd724, 0xd724], /* Hangul Syllable */
- [0xd725, 0xd725], /* Hangul Syllable */
- [0xd726, 0xd726], /* Hangul Syllable */
- [0xd727, 0xd727], /* Hangul Syllable */
- [0xd728, 0xd728], /* Hangul Syllable */
- [0xd729, 0xd729], /* Hangul Syllable */
- [0xd72a, 0xd72a], /* Hangul Syllable */
- [0xd72b, 0xd72b], /* Hangul Syllable */
- [0xd72c, 0xd72c], /* Hangul Syllable */
- [0xd72d, 0xd72d], /* Hangul Syllable */
- [0xd72e, 0xd72e], /* Hangul Syllable */
- [0xd72f, 0xd72f], /* Hangul Syllable */
- [0xd730, 0xd730], /* Hangul Syllable */
- [0xd731, 0xd731], /* Hangul Syllable */
- [0xd732, 0xd732], /* Hangul Syllable */
- [0xd733, 0xd733], /* Hangul Syllable */
- [0xd734, 0xd734], /* Hangul Syllable */
- [0xd735, 0xd735], /* Hangul Syllable */
- [0xd736, 0xd736], /* Hangul Syllable */
- [0xd737, 0xd737], /* Hangul Syllable */
- [0xd738, 0xd738], /* Hangul Syllable */
- [0xd739, 0xd739], /* Hangul Syllable */
- [0xd73a, 0xd73a], /* Hangul Syllable */
- [0xd73b, 0xd73b], /* Hangul Syllable */
- [0xd73c, 0xd73c], /* Hangul Syllable */
- [0xd73d, 0xd73d], /* Hangul Syllable */
- [0xd73e, 0xd73e], /* Hangul Syllable */
- [0xd73f, 0xd73f], /* Hangul Syllable */
- [0xd740, 0xd740], /* Hangul Syllable */
- [0xd741, 0xd741], /* Hangul Syllable */
- [0xd742, 0xd742], /* Hangul Syllable */
- [0xd743, 0xd743], /* Hangul Syllable */
- [0xd744, 0xd744], /* Hangul Syllable */
- [0xd745, 0xd745], /* Hangul Syllable */
- [0xd746, 0xd746], /* Hangul Syllable */
- [0xd747, 0xd747], /* Hangul Syllable */
- [0xd748, 0xd748], /* Hangul Syllable */
- [0xd749, 0xd749], /* Hangul Syllable */
- [0xd74a, 0xd74a], /* Hangul Syllable */
- [0xd74b, 0xd74b], /* Hangul Syllable */
- [0xd74c, 0xd74c], /* Hangul Syllable */
- [0xd74d, 0xd74d], /* Hangul Syllable */
- [0xd74e, 0xd74e], /* Hangul Syllable */
- [0xd74f, 0xd74f], /* Hangul Syllable */
- [0xd750, 0xd750], /* Hangul Syllable */
- [0xd751, 0xd751], /* Hangul Syllable */
- [0xd752, 0xd752], /* Hangul Syllable */
- [0xd753, 0xd753], /* Hangul Syllable */
- [0xd754, 0xd754], /* Hangul Syllable */
- [0xd755, 0xd755], /* Hangul Syllable */
- [0xd756, 0xd756], /* Hangul Syllable */
- [0xd757, 0xd757], /* Hangul Syllable */
- [0xd758, 0xd758], /* Hangul Syllable */
- [0xd759, 0xd759], /* Hangul Syllable */
- [0xd75a, 0xd75a], /* Hangul Syllable */
- [0xd75b, 0xd75b], /* Hangul Syllable */
- [0xd75c, 0xd75c], /* Hangul Syllable */
- [0xd75d, 0xd75d], /* Hangul Syllable */
- [0xd75e, 0xd75e], /* Hangul Syllable */
- [0xd75f, 0xd75f], /* Hangul Syllable */
- [0xd760, 0xd760], /* Hangul Syllable */
- [0xd761, 0xd761], /* Hangul Syllable */
- [0xd762, 0xd762], /* Hangul Syllable */
- [0xd763, 0xd763], /* Hangul Syllable */
- [0xd764, 0xd764], /* Hangul Syllable */
- [0xd765, 0xd765], /* Hangul Syllable */
- [0xd766, 0xd766], /* Hangul Syllable */
- [0xd767, 0xd767], /* Hangul Syllable */
- [0xd768, 0xd768], /* Hangul Syllable */
- [0xd769, 0xd769], /* Hangul Syllable */
- [0xd76a, 0xd76a], /* Hangul Syllable */
- [0xd76b, 0xd76b], /* Hangul Syllable */
- [0xd76c, 0xd76c], /* Hangul Syllable */
- [0xd76d, 0xd76d], /* Hangul Syllable */
- [0xd76e, 0xd76e], /* Hangul Syllable */
- [0xd76f, 0xd76f], /* Hangul Syllable */
- [0xd770, 0xd770], /* Hangul Syllable */
- [0xd771, 0xd771], /* Hangul Syllable */
- [0xd772, 0xd772], /* Hangul Syllable */
- [0xd773, 0xd773], /* Hangul Syllable */
- [0xd774, 0xd774], /* Hangul Syllable */
- [0xd775, 0xd775], /* Hangul Syllable */
- [0xd776, 0xd776], /* Hangul Syllable */
- [0xd777, 0xd777], /* Hangul Syllable */
- [0xd778, 0xd778], /* Hangul Syllable */
- [0xd779, 0xd779], /* Hangul Syllable */
- [0xd77a, 0xd77a], /* Hangul Syllable */
- [0xd77b, 0xd77b], /* Hangul Syllable */
- [0xd77c, 0xd77c], /* Hangul Syllable */
- [0xd77d, 0xd77d], /* Hangul Syllable */
- [0xd77e, 0xd77e], /* Hangul Syllable */
- [0xd77f, 0xd77f], /* Hangul Syllable */
- [0xd780, 0xd780], /* Hangul Syllable */
- [0xd781, 0xd781], /* Hangul Syllable */
- [0xd782, 0xd782], /* Hangul Syllable */
- [0xd783, 0xd783], /* Hangul Syllable */
- [0xd784, 0xd784], /* Hangul Syllable */
- [0xd785, 0xd785], /* Hangul Syllable */
- [0xd786, 0xd786], /* Hangul Syllable */
- [0xd787, 0xd787], /* Hangul Syllable */
- [0xd788, 0xd788], /* Hangul Syllable */
- [0xd789, 0xd789], /* Hangul Syllable */
- [0xd78a, 0xd78a], /* Hangul Syllable */
- [0xd78b, 0xd78b], /* Hangul Syllable */
- [0xd78c, 0xd78c], /* Hangul Syllable */
- [0xd78d, 0xd78d], /* Hangul Syllable */
- [0xd78e, 0xd78e], /* Hangul Syllable */
- [0xd78f, 0xd78f], /* Hangul Syllable */
- [0xd790, 0xd790], /* Hangul Syllable */
- [0xd791, 0xd791], /* Hangul Syllable */
- [0xd792, 0xd792], /* Hangul Syllable */
- [0xd793, 0xd793], /* Hangul Syllable */
- [0xd794, 0xd794], /* Hangul Syllable */
- [0xd795, 0xd795], /* Hangul Syllable */
- [0xd796, 0xd796], /* Hangul Syllable */
- [0xd797, 0xd797], /* Hangul Syllable */
- [0xd798, 0xd798], /* Hangul Syllable */
- [0xd799, 0xd799], /* Hangul Syllable */
- [0xd79a, 0xd79a], /* Hangul Syllable */
- [0xd79b, 0xd79b], /* Hangul Syllable */
- [0xd79c, 0xd79c], /* Hangul Syllable */
- [0xd79d, 0xd79d], /* Hangul Syllable */
- [0xd79e, 0xd79e], /* Hangul Syllable */
- [0xd79f, 0xd79f], /* Hangul Syllable */
- [0xd7a0, 0xd7a0], /* Hangul Syllable */
- [0xd7a1, 0xd7a1], /* Hangul Syllable */
- [0xd7a2, 0xd7a2], /* Hangul Syllable */
- [0xd7a3, 0xd7a3], /* Hangul Syllable */
- [0xd7a4, 0xd7a4],
- [0xd7a5, 0xd7a5],
- [0xd7a6, 0xd7a6],
- [0xd7a7, 0xd7a7],
- [0xd7a8, 0xd7a8],
- [0xd7a9, 0xd7a9],
- [0xd7aa, 0xd7aa],
- [0xd7ab, 0xd7ab],
- [0xd7ac, 0xd7ac],
- [0xd7ad, 0xd7ad],
- [0xd7ae, 0xd7ae],
- [0xd7af, 0xd7af],
- [0xd7b0, 0xd7b0], /* HANGUL JUNGSEONG O-YEO */
- [0xd7b1, 0xd7b1], /* HANGUL JUNGSEONG O-O-I */
- [0xd7b2, 0xd7b2], /* HANGUL JUNGSEONG YO-A */
- [0xd7b3, 0xd7b3], /* HANGUL JUNGSEONG YO-AE */
- [0xd7b4, 0xd7b4], /* HANGUL JUNGSEONG YO-EO */
- [0xd7b5, 0xd7b5], /* HANGUL JUNGSEONG U-YEO */
- [0xd7b6, 0xd7b6], /* HANGUL JUNGSEONG U-I-I */
- [0xd7b7, 0xd7b7], /* HANGUL JUNGSEONG YU-AE */
- [0xd7b8, 0xd7b8], /* HANGUL JUNGSEONG YU-O */
- [0xd7b9, 0xd7b9], /* HANGUL JUNGSEONG EU-A */
- [0xd7ba, 0xd7ba], /* HANGUL JUNGSEONG EU-EO */
- [0xd7bb, 0xd7bb], /* HANGUL JUNGSEONG EU-E */
- [0xd7bc, 0xd7bc], /* HANGUL JUNGSEONG EU-O */
- [0xd7bd, 0xd7bd], /* HANGUL JUNGSEONG I-YA-O */
- [0xd7be, 0xd7be], /* HANGUL JUNGSEONG I-YAE */
- [0xd7bf, 0xd7bf], /* HANGUL JUNGSEONG I-YEO */
- [0xd7c0, 0xd7c0], /* HANGUL JUNGSEONG I-YE */
- [0xd7c1, 0xd7c1], /* HANGUL JUNGSEONG I-O-I */
- [0xd7c2, 0xd7c2], /* HANGUL JUNGSEONG I-YO */
- [0xd7c3, 0xd7c3], /* HANGUL JUNGSEONG I-YU */
- [0xd7c4, 0xd7c4], /* HANGUL JUNGSEONG I-I */
- [0xd7c5, 0xd7c5], /* HANGUL JUNGSEONG ARAEA-A */
- [0xd7c6, 0xd7c6], /* HANGUL JUNGSEONG ARAEA-E */
- [0xd7c7, 0xd7c7],
- [0xd7c8, 0xd7c8],
- [0xd7c9, 0xd7c9],
- [0xd7ca, 0xd7ca],
- [0xd7cb, 0xd7cb], /* HANGUL JONGSEONG NIEUN-RIEUL */
- [0xd7cc, 0xd7cc], /* HANGUL JONGSEONG NIEUN-CHIEUCH */
- [0xd7cd, 0xd7cd], /* HANGUL JONGSEONG SSANGTIKEUT */
- [0xd7ce, 0xd7ce], /* HANGUL JONGSEONG SSANGTIKEUT-PIEUP */
- [0xd7cf, 0xd7cf], /* HANGUL JONGSEONG TIKEUT-PIEUP */
- [0xd7d0, 0xd7d0], /* HANGUL JONGSEONG TIKEUT-SIOS */
- [0xd7d1, 0xd7d1], /* HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK */
- [0xd7d2, 0xd7d2], /* HANGUL JONGSEONG TIKEUT-CIEUC */
- [0xd7d3, 0xd7d3], /* HANGUL JONGSEONG TIKEUT-CHIEUCH */
- [0xd7d4, 0xd7d4], /* HANGUL JONGSEONG TIKEUT-THIEUTH */
- [0xd7d5, 0xd7d5], /* HANGUL JONGSEONG RIEUL-SSANGKIYEOK */
- [0xd7d6, 0xd7d6], /* HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH */
- [0xd7d7, 0xd7d7], /* HANGUL JONGSEONG SSANGRIEUL-KHIEUKH */
- [0xd7d8, 0xd7d8], /* HANGUL JONGSEONG RIEUL-MIEUM-HIEUH */
- [0xd7d9, 0xd7d9], /* HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT */
- [0xd7da, 0xd7da], /* HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH */
- [0xd7db, 0xd7db], /* HANGUL JONGSEONG RIEUL-YESIEUNG */
- [0xd7dc, 0xd7dc], /* HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH */
- [0xd7dd, 0xd7dd], /* HANGUL JONGSEONG KAPYEOUNRIEUL */
- [0xd7de, 0xd7de], /* HANGUL JONGSEONG MIEUM-NIEUN */
- [0xd7df, 0xd7df], /* HANGUL JONGSEONG MIEUM-SSANGNIEUN */
- [0xd7e0, 0xd7e0], /* HANGUL JONGSEONG SSANGMIEUM */
- [0xd7e1, 0xd7e1], /* HANGUL JONGSEONG MIEUM-PIEUP-SIOS */
- [0xd7e2, 0xd7e2], /* HANGUL JONGSEONG MIEUM-CIEUC */
- [0xd7e3, 0xd7e3], /* HANGUL JONGSEONG PIEUP-TIKEUT */
- [0xd7e4, 0xd7e4], /* HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH */
- [0xd7e5, 0xd7e5], /* HANGUL JONGSEONG PIEUP-MIEUM */
- [0xd7e6, 0xd7e6], /* HANGUL JONGSEONG SSANGPIEUP */
- [0xd7e7, 0xd7e7], /* HANGUL JONGSEONG PIEUP-SIOS-TIKEUT */
- [0xd7e8, 0xd7e8], /* HANGUL JONGSEONG PIEUP-CIEUC */
- [0xd7e9, 0xd7e9], /* HANGUL JONGSEONG PIEUP-CHIEUCH */
- [0xd7ea, 0xd7ea], /* HANGUL JONGSEONG SIOS-MIEUM */
- [0xd7eb, 0xd7eb], /* HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP */
- [0xd7ec, 0xd7ec], /* HANGUL JONGSEONG SSANGSIOS-KIYEOK */
- [0xd7ed, 0xd7ed], /* HANGUL JONGSEONG SSANGSIOS-TIKEUT */
- [0xd7ee, 0xd7ee], /* HANGUL JONGSEONG SIOS-PANSIOS */
- [0xd7ef, 0xd7ef], /* HANGUL JONGSEONG SIOS-CIEUC */
- [0xd7f0, 0xd7f0], /* HANGUL JONGSEONG SIOS-CHIEUCH */
- [0xd7f1, 0xd7f1], /* HANGUL JONGSEONG SIOS-THIEUTH */
- [0xd7f2, 0xd7f2], /* HANGUL JONGSEONG SIOS-HIEUH */
- [0xd7f3, 0xd7f3], /* HANGUL JONGSEONG PANSIOS-PIEUP */
- [0xd7f4, 0xd7f4], /* HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP */
- [0xd7f5, 0xd7f5], /* HANGUL JONGSEONG YESIEUNG-MIEUM */
- [0xd7f6, 0xd7f6], /* HANGUL JONGSEONG YESIEUNG-HIEUH */
- [0xd7f7, 0xd7f7], /* HANGUL JONGSEONG CIEUC-PIEUP */
- [0xd7f8, 0xd7f8], /* HANGUL JONGSEONG CIEUC-SSANGPIEUP */
- [0xd7f9, 0xd7f9], /* HANGUL JONGSEONG SSANGCIEUC */
- [0xd7fa, 0xd7fa], /* HANGUL JONGSEONG PHIEUPH-SIOS */
- [0xd7fb, 0xd7fb], /* HANGUL JONGSEONG PHIEUPH-THIEUTH */
- [0xd7fc, 0xd7fc],
- [0xd7fd, 0xd7fd],
- [0xd7fe, 0xd7fe],
- [0xd7ff, 0xd7ff],
- [0xd800, 0xd800], /* Non Private Use High Surrogate */
- [0xd801, 0xd801], /* Non Private Use High Surrogate */
- [0xd802, 0xd802], /* Non Private Use High Surrogate */
- [0xd803, 0xd803], /* Non Private Use High Surrogate */
- [0xd804, 0xd804], /* Non Private Use High Surrogate */
- [0xd805, 0xd805], /* Non Private Use High Surrogate */
- [0xd806, 0xd806], /* Non Private Use High Surrogate */
- [0xd807, 0xd807], /* Non Private Use High Surrogate */
- [0xd808, 0xd808], /* Non Private Use High Surrogate */
- [0xd809, 0xd809], /* Non Private Use High Surrogate */
- [0xd80a, 0xd80a], /* Non Private Use High Surrogate */
- [0xd80b, 0xd80b], /* Non Private Use High Surrogate */
- [0xd80c, 0xd80c], /* Non Private Use High Surrogate */
- [0xd80d, 0xd80d], /* Non Private Use High Surrogate */
- [0xd80e, 0xd80e], /* Non Private Use High Surrogate */
- [0xd80f, 0xd80f], /* Non Private Use High Surrogate */
- [0xd810, 0xd810], /* Non Private Use High Surrogate */
- [0xd811, 0xd811], /* Non Private Use High Surrogate */
- [0xd812, 0xd812], /* Non Private Use High Surrogate */
- [0xd813, 0xd813], /* Non Private Use High Surrogate */
- [0xd814, 0xd814], /* Non Private Use High Surrogate */
- [0xd815, 0xd815], /* Non Private Use High Surrogate */
- [0xd816, 0xd816], /* Non Private Use High Surrogate */
- [0xd817, 0xd817], /* Non Private Use High Surrogate */
- [0xd818, 0xd818], /* Non Private Use High Surrogate */
- [0xd819, 0xd819], /* Non Private Use High Surrogate */
- [0xd81a, 0xd81a], /* Non Private Use High Surrogate */
- [0xd81b, 0xd81b], /* Non Private Use High Surrogate */
- [0xd81c, 0xd81c], /* Non Private Use High Surrogate */
- [0xd81d, 0xd81d], /* Non Private Use High Surrogate */
- [0xd81e, 0xd81e], /* Non Private Use High Surrogate */
- [0xd81f, 0xd81f], /* Non Private Use High Surrogate */
- [0xd820, 0xd820], /* Non Private Use High Surrogate */
- [0xd821, 0xd821], /* Non Private Use High Surrogate */
- [0xd822, 0xd822], /* Non Private Use High Surrogate */
- [0xd823, 0xd823], /* Non Private Use High Surrogate */
- [0xd824, 0xd824], /* Non Private Use High Surrogate */
- [0xd825, 0xd825], /* Non Private Use High Surrogate */
- [0xd826, 0xd826], /* Non Private Use High Surrogate */
- [0xd827, 0xd827], /* Non Private Use High Surrogate */
- [0xd828, 0xd828], /* Non Private Use High Surrogate */
- [0xd829, 0xd829], /* Non Private Use High Surrogate */
- [0xd82a, 0xd82a], /* Non Private Use High Surrogate */
- [0xd82b, 0xd82b], /* Non Private Use High Surrogate */
- [0xd82c, 0xd82c], /* Non Private Use High Surrogate */
- [0xd82d, 0xd82d], /* Non Private Use High Surrogate */
- [0xd82e, 0xd82e], /* Non Private Use High Surrogate */
- [0xd82f, 0xd82f], /* Non Private Use High Surrogate */
- [0xd830, 0xd830], /* Non Private Use High Surrogate */
- [0xd831, 0xd831], /* Non Private Use High Surrogate */
- [0xd832, 0xd832], /* Non Private Use High Surrogate */
- [0xd833, 0xd833], /* Non Private Use High Surrogate */
- [0xd834, 0xd834], /* Non Private Use High Surrogate */
- [0xd835, 0xd835], /* Non Private Use High Surrogate */
- [0xd836, 0xd836], /* Non Private Use High Surrogate */
- [0xd837, 0xd837], /* Non Private Use High Surrogate */
- [0xd838, 0xd838], /* Non Private Use High Surrogate */
- [0xd839, 0xd839], /* Non Private Use High Surrogate */
- [0xd83a, 0xd83a], /* Non Private Use High Surrogate */
- [0xd83b, 0xd83b], /* Non Private Use High Surrogate */
- [0xd83c, 0xd83c], /* Non Private Use High Surrogate */
- [0xd83d, 0xd83d], /* Non Private Use High Surrogate */
- [0xd83e, 0xd83e], /* Non Private Use High Surrogate */
- [0xd83f, 0xd83f], /* Non Private Use High Surrogate */
- [0xd840, 0xd840], /* Non Private Use High Surrogate */
- [0xd841, 0xd841], /* Non Private Use High Surrogate */
- [0xd842, 0xd842], /* Non Private Use High Surrogate */
- [0xd843, 0xd843], /* Non Private Use High Surrogate */
- [0xd844, 0xd844], /* Non Private Use High Surrogate */
- [0xd845, 0xd845], /* Non Private Use High Surrogate */
- [0xd846, 0xd846], /* Non Private Use High Surrogate */
- [0xd847, 0xd847], /* Non Private Use High Surrogate */
- [0xd848, 0xd848], /* Non Private Use High Surrogate */
- [0xd849, 0xd849], /* Non Private Use High Surrogate */
- [0xd84a, 0xd84a], /* Non Private Use High Surrogate */
- [0xd84b, 0xd84b], /* Non Private Use High Surrogate */
- [0xd84c, 0xd84c], /* Non Private Use High Surrogate */
- [0xd84d, 0xd84d], /* Non Private Use High Surrogate */
- [0xd84e, 0xd84e], /* Non Private Use High Surrogate */
- [0xd84f, 0xd84f], /* Non Private Use High Surrogate */
- [0xd850, 0xd850], /* Non Private Use High Surrogate */
- [0xd851, 0xd851], /* Non Private Use High Surrogate */
- [0xd852, 0xd852], /* Non Private Use High Surrogate */
- [0xd853, 0xd853], /* Non Private Use High Surrogate */
- [0xd854, 0xd854], /* Non Private Use High Surrogate */
- [0xd855, 0xd855], /* Non Private Use High Surrogate */
- [0xd856, 0xd856], /* Non Private Use High Surrogate */
- [0xd857, 0xd857], /* Non Private Use High Surrogate */
- [0xd858, 0xd858], /* Non Private Use High Surrogate */
- [0xd859, 0xd859], /* Non Private Use High Surrogate */
- [0xd85a, 0xd85a], /* Non Private Use High Surrogate */
- [0xd85b, 0xd85b], /* Non Private Use High Surrogate */
- [0xd85c, 0xd85c], /* Non Private Use High Surrogate */
- [0xd85d, 0xd85d], /* Non Private Use High Surrogate */
- [0xd85e, 0xd85e], /* Non Private Use High Surrogate */
- [0xd85f, 0xd85f], /* Non Private Use High Surrogate */
- [0xd860, 0xd860], /* Non Private Use High Surrogate */
- [0xd861, 0xd861], /* Non Private Use High Surrogate */
- [0xd862, 0xd862], /* Non Private Use High Surrogate */
- [0xd863, 0xd863], /* Non Private Use High Surrogate */
- [0xd864, 0xd864], /* Non Private Use High Surrogate */
- [0xd865, 0xd865], /* Non Private Use High Surrogate */
- [0xd866, 0xd866], /* Non Private Use High Surrogate */
- [0xd867, 0xd867], /* Non Private Use High Surrogate */
- [0xd868, 0xd868], /* Non Private Use High Surrogate */
- [0xd869, 0xd869], /* Non Private Use High Surrogate */
- [0xd86a, 0xd86a], /* Non Private Use High Surrogate */
- [0xd86b, 0xd86b], /* Non Private Use High Surrogate */
- [0xd86c, 0xd86c], /* Non Private Use High Surrogate */
- [0xd86d, 0xd86d], /* Non Private Use High Surrogate */
- [0xd86e, 0xd86e], /* Non Private Use High Surrogate */
- [0xd86f, 0xd86f], /* Non Private Use High Surrogate */
- [0xd870, 0xd870], /* Non Private Use High Surrogate */
- [0xd871, 0xd871], /* Non Private Use High Surrogate */
- [0xd872, 0xd872], /* Non Private Use High Surrogate */
- [0xd873, 0xd873], /* Non Private Use High Surrogate */
- [0xd874, 0xd874], /* Non Private Use High Surrogate */
- [0xd875, 0xd875], /* Non Private Use High Surrogate */
- [0xd876, 0xd876], /* Non Private Use High Surrogate */
- [0xd877, 0xd877], /* Non Private Use High Surrogate */
- [0xd878, 0xd878], /* Non Private Use High Surrogate */
- [0xd879, 0xd879], /* Non Private Use High Surrogate */
- [0xd87a, 0xd87a], /* Non Private Use High Surrogate */
- [0xd87b, 0xd87b], /* Non Private Use High Surrogate */
- [0xd87c, 0xd87c], /* Non Private Use High Surrogate */
- [0xd87d, 0xd87d], /* Non Private Use High Surrogate */
- [0xd87e, 0xd87e], /* Non Private Use High Surrogate */
- [0xd87f, 0xd87f], /* Non Private Use High Surrogate */
- [0xd880, 0xd880], /* Non Private Use High Surrogate */
- [0xd881, 0xd881], /* Non Private Use High Surrogate */
- [0xd882, 0xd882], /* Non Private Use High Surrogate */
- [0xd883, 0xd883], /* Non Private Use High Surrogate */
- [0xd884, 0xd884], /* Non Private Use High Surrogate */
- [0xd885, 0xd885], /* Non Private Use High Surrogate */
- [0xd886, 0xd886], /* Non Private Use High Surrogate */
- [0xd887, 0xd887], /* Non Private Use High Surrogate */
- [0xd888, 0xd888], /* Non Private Use High Surrogate */
- [0xd889, 0xd889], /* Non Private Use High Surrogate */
- [0xd88a, 0xd88a], /* Non Private Use High Surrogate */
- [0xd88b, 0xd88b], /* Non Private Use High Surrogate */
- [0xd88c, 0xd88c], /* Non Private Use High Surrogate */
- [0xd88d, 0xd88d], /* Non Private Use High Surrogate */
- [0xd88e, 0xd88e], /* Non Private Use High Surrogate */
- [0xd88f, 0xd88f], /* Non Private Use High Surrogate */
- [0xd890, 0xd890], /* Non Private Use High Surrogate */
- [0xd891, 0xd891], /* Non Private Use High Surrogate */
- [0xd892, 0xd892], /* Non Private Use High Surrogate */
- [0xd893, 0xd893], /* Non Private Use High Surrogate */
- [0xd894, 0xd894], /* Non Private Use High Surrogate */
- [0xd895, 0xd895], /* Non Private Use High Surrogate */
- [0xd896, 0xd896], /* Non Private Use High Surrogate */
- [0xd897, 0xd897], /* Non Private Use High Surrogate */
- [0xd898, 0xd898], /* Non Private Use High Surrogate */
- [0xd899, 0xd899], /* Non Private Use High Surrogate */
- [0xd89a, 0xd89a], /* Non Private Use High Surrogate */
- [0xd89b, 0xd89b], /* Non Private Use High Surrogate */
- [0xd89c, 0xd89c], /* Non Private Use High Surrogate */
- [0xd89d, 0xd89d], /* Non Private Use High Surrogate */
- [0xd89e, 0xd89e], /* Non Private Use High Surrogate */
- [0xd89f, 0xd89f], /* Non Private Use High Surrogate */
- [0xd8a0, 0xd8a0], /* Non Private Use High Surrogate */
- [0xd8a1, 0xd8a1], /* Non Private Use High Surrogate */
- [0xd8a2, 0xd8a2], /* Non Private Use High Surrogate */
- [0xd8a3, 0xd8a3], /* Non Private Use High Surrogate */
- [0xd8a4, 0xd8a4], /* Non Private Use High Surrogate */
- [0xd8a5, 0xd8a5], /* Non Private Use High Surrogate */
- [0xd8a6, 0xd8a6], /* Non Private Use High Surrogate */
- [0xd8a7, 0xd8a7], /* Non Private Use High Surrogate */
- [0xd8a8, 0xd8a8], /* Non Private Use High Surrogate */
- [0xd8a9, 0xd8a9], /* Non Private Use High Surrogate */
- [0xd8aa, 0xd8aa], /* Non Private Use High Surrogate */
- [0xd8ab, 0xd8ab], /* Non Private Use High Surrogate */
- [0xd8ac, 0xd8ac], /* Non Private Use High Surrogate */
- [0xd8ad, 0xd8ad], /* Non Private Use High Surrogate */
- [0xd8ae, 0xd8ae], /* Non Private Use High Surrogate */
- [0xd8af, 0xd8af], /* Non Private Use High Surrogate */
- [0xd8b0, 0xd8b0], /* Non Private Use High Surrogate */
- [0xd8b1, 0xd8b1], /* Non Private Use High Surrogate */
- [0xd8b2, 0xd8b2], /* Non Private Use High Surrogate */
- [0xd8b3, 0xd8b3], /* Non Private Use High Surrogate */
- [0xd8b4, 0xd8b4], /* Non Private Use High Surrogate */
- [0xd8b5, 0xd8b5], /* Non Private Use High Surrogate */
- [0xd8b6, 0xd8b6], /* Non Private Use High Surrogate */
- [0xd8b7, 0xd8b7], /* Non Private Use High Surrogate */
- [0xd8b8, 0xd8b8], /* Non Private Use High Surrogate */
- [0xd8b9, 0xd8b9], /* Non Private Use High Surrogate */
- [0xd8ba, 0xd8ba], /* Non Private Use High Surrogate */
- [0xd8bb, 0xd8bb], /* Non Private Use High Surrogate */
- [0xd8bc, 0xd8bc], /* Non Private Use High Surrogate */
- [0xd8bd, 0xd8bd], /* Non Private Use High Surrogate */
- [0xd8be, 0xd8be], /* Non Private Use High Surrogate */
- [0xd8bf, 0xd8bf], /* Non Private Use High Surrogate */
- [0xd8c0, 0xd8c0], /* Non Private Use High Surrogate */
- [0xd8c1, 0xd8c1], /* Non Private Use High Surrogate */
- [0xd8c2, 0xd8c2], /* Non Private Use High Surrogate */
- [0xd8c3, 0xd8c3], /* Non Private Use High Surrogate */
- [0xd8c4, 0xd8c4], /* Non Private Use High Surrogate */
- [0xd8c5, 0xd8c5], /* Non Private Use High Surrogate */
- [0xd8c6, 0xd8c6], /* Non Private Use High Surrogate */
- [0xd8c7, 0xd8c7], /* Non Private Use High Surrogate */
- [0xd8c8, 0xd8c8], /* Non Private Use High Surrogate */
- [0xd8c9, 0xd8c9], /* Non Private Use High Surrogate */
- [0xd8ca, 0xd8ca], /* Non Private Use High Surrogate */
- [0xd8cb, 0xd8cb], /* Non Private Use High Surrogate */
- [0xd8cc, 0xd8cc], /* Non Private Use High Surrogate */
- [0xd8cd, 0xd8cd], /* Non Private Use High Surrogate */
- [0xd8ce, 0xd8ce], /* Non Private Use High Surrogate */
- [0xd8cf, 0xd8cf], /* Non Private Use High Surrogate */
- [0xd8d0, 0xd8d0], /* Non Private Use High Surrogate */
- [0xd8d1, 0xd8d1], /* Non Private Use High Surrogate */
- [0xd8d2, 0xd8d2], /* Non Private Use High Surrogate */
- [0xd8d3, 0xd8d3], /* Non Private Use High Surrogate */
- [0xd8d4, 0xd8d4], /* Non Private Use High Surrogate */
- [0xd8d5, 0xd8d5], /* Non Private Use High Surrogate */
- [0xd8d6, 0xd8d6], /* Non Private Use High Surrogate */
- [0xd8d7, 0xd8d7], /* Non Private Use High Surrogate */
- [0xd8d8, 0xd8d8], /* Non Private Use High Surrogate */
- [0xd8d9, 0xd8d9], /* Non Private Use High Surrogate */
- [0xd8da, 0xd8da], /* Non Private Use High Surrogate */
- [0xd8db, 0xd8db], /* Non Private Use High Surrogate */
- [0xd8dc, 0xd8dc], /* Non Private Use High Surrogate */
- [0xd8dd, 0xd8dd], /* Non Private Use High Surrogate */
- [0xd8de, 0xd8de], /* Non Private Use High Surrogate */
- [0xd8df, 0xd8df], /* Non Private Use High Surrogate */
- [0xd8e0, 0xd8e0], /* Non Private Use High Surrogate */
- [0xd8e1, 0xd8e1], /* Non Private Use High Surrogate */
- [0xd8e2, 0xd8e2], /* Non Private Use High Surrogate */
- [0xd8e3, 0xd8e3], /* Non Private Use High Surrogate */
- [0xd8e4, 0xd8e4], /* Non Private Use High Surrogate */
- [0xd8e5, 0xd8e5], /* Non Private Use High Surrogate */
- [0xd8e6, 0xd8e6], /* Non Private Use High Surrogate */
- [0xd8e7, 0xd8e7], /* Non Private Use High Surrogate */
- [0xd8e8, 0xd8e8], /* Non Private Use High Surrogate */
- [0xd8e9, 0xd8e9], /* Non Private Use High Surrogate */
- [0xd8ea, 0xd8ea], /* Non Private Use High Surrogate */
- [0xd8eb, 0xd8eb], /* Non Private Use High Surrogate */
- [0xd8ec, 0xd8ec], /* Non Private Use High Surrogate */
- [0xd8ed, 0xd8ed], /* Non Private Use High Surrogate */
- [0xd8ee, 0xd8ee], /* Non Private Use High Surrogate */
- [0xd8ef, 0xd8ef], /* Non Private Use High Surrogate */
- [0xd8f0, 0xd8f0], /* Non Private Use High Surrogate */
- [0xd8f1, 0xd8f1], /* Non Private Use High Surrogate */
- [0xd8f2, 0xd8f2], /* Non Private Use High Surrogate */
- [0xd8f3, 0xd8f3], /* Non Private Use High Surrogate */
- [0xd8f4, 0xd8f4], /* Non Private Use High Surrogate */
- [0xd8f5, 0xd8f5], /* Non Private Use High Surrogate */
- [0xd8f6, 0xd8f6], /* Non Private Use High Surrogate */
- [0xd8f7, 0xd8f7], /* Non Private Use High Surrogate */
- [0xd8f8, 0xd8f8], /* Non Private Use High Surrogate */
- [0xd8f9, 0xd8f9], /* Non Private Use High Surrogate */
- [0xd8fa, 0xd8fa], /* Non Private Use High Surrogate */
- [0xd8fb, 0xd8fb], /* Non Private Use High Surrogate */
- [0xd8fc, 0xd8fc], /* Non Private Use High Surrogate */
- [0xd8fd, 0xd8fd], /* Non Private Use High Surrogate */
- [0xd8fe, 0xd8fe], /* Non Private Use High Surrogate */
- [0xd8ff, 0xd8ff], /* Non Private Use High Surrogate */
- [0xd900, 0xd900], /* Non Private Use High Surrogate */
- [0xd901, 0xd901], /* Non Private Use High Surrogate */
- [0xd902, 0xd902], /* Non Private Use High Surrogate */
- [0xd903, 0xd903], /* Non Private Use High Surrogate */
- [0xd904, 0xd904], /* Non Private Use High Surrogate */
- [0xd905, 0xd905], /* Non Private Use High Surrogate */
- [0xd906, 0xd906], /* Non Private Use High Surrogate */
- [0xd907, 0xd907], /* Non Private Use High Surrogate */
- [0xd908, 0xd908], /* Non Private Use High Surrogate */
- [0xd909, 0xd909], /* Non Private Use High Surrogate */
- [0xd90a, 0xd90a], /* Non Private Use High Surrogate */
- [0xd90b, 0xd90b], /* Non Private Use High Surrogate */
- [0xd90c, 0xd90c], /* Non Private Use High Surrogate */
- [0xd90d, 0xd90d], /* Non Private Use High Surrogate */
- [0xd90e, 0xd90e], /* Non Private Use High Surrogate */
- [0xd90f, 0xd90f], /* Non Private Use High Surrogate */
- [0xd910, 0xd910], /* Non Private Use High Surrogate */
- [0xd911, 0xd911], /* Non Private Use High Surrogate */
- [0xd912, 0xd912], /* Non Private Use High Surrogate */
- [0xd913, 0xd913], /* Non Private Use High Surrogate */
- [0xd914, 0xd914], /* Non Private Use High Surrogate */
- [0xd915, 0xd915], /* Non Private Use High Surrogate */
- [0xd916, 0xd916], /* Non Private Use High Surrogate */
- [0xd917, 0xd917], /* Non Private Use High Surrogate */
- [0xd918, 0xd918], /* Non Private Use High Surrogate */
- [0xd919, 0xd919], /* Non Private Use High Surrogate */
- [0xd91a, 0xd91a], /* Non Private Use High Surrogate */
- [0xd91b, 0xd91b], /* Non Private Use High Surrogate */
- [0xd91c, 0xd91c], /* Non Private Use High Surrogate */
- [0xd91d, 0xd91d], /* Non Private Use High Surrogate */
- [0xd91e, 0xd91e], /* Non Private Use High Surrogate */
- [0xd91f, 0xd91f], /* Non Private Use High Surrogate */
- [0xd920, 0xd920], /* Non Private Use High Surrogate */
- [0xd921, 0xd921], /* Non Private Use High Surrogate */
- [0xd922, 0xd922], /* Non Private Use High Surrogate */
- [0xd923, 0xd923], /* Non Private Use High Surrogate */
- [0xd924, 0xd924], /* Non Private Use High Surrogate */
- [0xd925, 0xd925], /* Non Private Use High Surrogate */
- [0xd926, 0xd926], /* Non Private Use High Surrogate */
- [0xd927, 0xd927], /* Non Private Use High Surrogate */
- [0xd928, 0xd928], /* Non Private Use High Surrogate */
- [0xd929, 0xd929], /* Non Private Use High Surrogate */
- [0xd92a, 0xd92a], /* Non Private Use High Surrogate */
- [0xd92b, 0xd92b], /* Non Private Use High Surrogate */
- [0xd92c, 0xd92c], /* Non Private Use High Surrogate */
- [0xd92d, 0xd92d], /* Non Private Use High Surrogate */
- [0xd92e, 0xd92e], /* Non Private Use High Surrogate */
- [0xd92f, 0xd92f], /* Non Private Use High Surrogate */
- [0xd930, 0xd930], /* Non Private Use High Surrogate */
- [0xd931, 0xd931], /* Non Private Use High Surrogate */
- [0xd932, 0xd932], /* Non Private Use High Surrogate */
- [0xd933, 0xd933], /* Non Private Use High Surrogate */
- [0xd934, 0xd934], /* Non Private Use High Surrogate */
- [0xd935, 0xd935], /* Non Private Use High Surrogate */
- [0xd936, 0xd936], /* Non Private Use High Surrogate */
- [0xd937, 0xd937], /* Non Private Use High Surrogate */
- [0xd938, 0xd938], /* Non Private Use High Surrogate */
- [0xd939, 0xd939], /* Non Private Use High Surrogate */
- [0xd93a, 0xd93a], /* Non Private Use High Surrogate */
- [0xd93b, 0xd93b], /* Non Private Use High Surrogate */
- [0xd93c, 0xd93c], /* Non Private Use High Surrogate */
- [0xd93d, 0xd93d], /* Non Private Use High Surrogate */
- [0xd93e, 0xd93e], /* Non Private Use High Surrogate */
- [0xd93f, 0xd93f], /* Non Private Use High Surrogate */
- [0xd940, 0xd940], /* Non Private Use High Surrogate */
- [0xd941, 0xd941], /* Non Private Use High Surrogate */
- [0xd942, 0xd942], /* Non Private Use High Surrogate */
- [0xd943, 0xd943], /* Non Private Use High Surrogate */
- [0xd944, 0xd944], /* Non Private Use High Surrogate */
- [0xd945, 0xd945], /* Non Private Use High Surrogate */
- [0xd946, 0xd946], /* Non Private Use High Surrogate */
- [0xd947, 0xd947], /* Non Private Use High Surrogate */
- [0xd948, 0xd948], /* Non Private Use High Surrogate */
- [0xd949, 0xd949], /* Non Private Use High Surrogate */
- [0xd94a, 0xd94a], /* Non Private Use High Surrogate */
- [0xd94b, 0xd94b], /* Non Private Use High Surrogate */
- [0xd94c, 0xd94c], /* Non Private Use High Surrogate */
- [0xd94d, 0xd94d], /* Non Private Use High Surrogate */
- [0xd94e, 0xd94e], /* Non Private Use High Surrogate */
- [0xd94f, 0xd94f], /* Non Private Use High Surrogate */
- [0xd950, 0xd950], /* Non Private Use High Surrogate */
- [0xd951, 0xd951], /* Non Private Use High Surrogate */
- [0xd952, 0xd952], /* Non Private Use High Surrogate */
- [0xd953, 0xd953], /* Non Private Use High Surrogate */
- [0xd954, 0xd954], /* Non Private Use High Surrogate */
- [0xd955, 0xd955], /* Non Private Use High Surrogate */
- [0xd956, 0xd956], /* Non Private Use High Surrogate */
- [0xd957, 0xd957], /* Non Private Use High Surrogate */
- [0xd958, 0xd958], /* Non Private Use High Surrogate */
- [0xd959, 0xd959], /* Non Private Use High Surrogate */
- [0xd95a, 0xd95a], /* Non Private Use High Surrogate */
- [0xd95b, 0xd95b], /* Non Private Use High Surrogate */
- [0xd95c, 0xd95c], /* Non Private Use High Surrogate */
- [0xd95d, 0xd95d], /* Non Private Use High Surrogate */
- [0xd95e, 0xd95e], /* Non Private Use High Surrogate */
- [0xd95f, 0xd95f], /* Non Private Use High Surrogate */
- [0xd960, 0xd960], /* Non Private Use High Surrogate */
- [0xd961, 0xd961], /* Non Private Use High Surrogate */
- [0xd962, 0xd962], /* Non Private Use High Surrogate */
- [0xd963, 0xd963], /* Non Private Use High Surrogate */
- [0xd964, 0xd964], /* Non Private Use High Surrogate */
- [0xd965, 0xd965], /* Non Private Use High Surrogate */
- [0xd966, 0xd966], /* Non Private Use High Surrogate */
- [0xd967, 0xd967], /* Non Private Use High Surrogate */
- [0xd968, 0xd968], /* Non Private Use High Surrogate */
- [0xd969, 0xd969], /* Non Private Use High Surrogate */
- [0xd96a, 0xd96a], /* Non Private Use High Surrogate */
- [0xd96b, 0xd96b], /* Non Private Use High Surrogate */
- [0xd96c, 0xd96c], /* Non Private Use High Surrogate */
- [0xd96d, 0xd96d], /* Non Private Use High Surrogate */
- [0xd96e, 0xd96e], /* Non Private Use High Surrogate */
- [0xd96f, 0xd96f], /* Non Private Use High Surrogate */
- [0xd970, 0xd970], /* Non Private Use High Surrogate */
- [0xd971, 0xd971], /* Non Private Use High Surrogate */
- [0xd972, 0xd972], /* Non Private Use High Surrogate */
- [0xd973, 0xd973], /* Non Private Use High Surrogate */
- [0xd974, 0xd974], /* Non Private Use High Surrogate */
- [0xd975, 0xd975], /* Non Private Use High Surrogate */
- [0xd976, 0xd976], /* Non Private Use High Surrogate */
- [0xd977, 0xd977], /* Non Private Use High Surrogate */
- [0xd978, 0xd978], /* Non Private Use High Surrogate */
- [0xd979, 0xd979], /* Non Private Use High Surrogate */
- [0xd97a, 0xd97a], /* Non Private Use High Surrogate */
- [0xd97b, 0xd97b], /* Non Private Use High Surrogate */
- [0xd97c, 0xd97c], /* Non Private Use High Surrogate */
- [0xd97d, 0xd97d], /* Non Private Use High Surrogate */
- [0xd97e, 0xd97e], /* Non Private Use High Surrogate */
- [0xd97f, 0xd97f], /* Non Private Use High Surrogate */
- [0xd980, 0xd980], /* Non Private Use High Surrogate */
- [0xd981, 0xd981], /* Non Private Use High Surrogate */
- [0xd982, 0xd982], /* Non Private Use High Surrogate */
- [0xd983, 0xd983], /* Non Private Use High Surrogate */
- [0xd984, 0xd984], /* Non Private Use High Surrogate */
- [0xd985, 0xd985], /* Non Private Use High Surrogate */
- [0xd986, 0xd986], /* Non Private Use High Surrogate */
- [0xd987, 0xd987], /* Non Private Use High Surrogate */
- [0xd988, 0xd988], /* Non Private Use High Surrogate */
- [0xd989, 0xd989], /* Non Private Use High Surrogate */
- [0xd98a, 0xd98a], /* Non Private Use High Surrogate */
- [0xd98b, 0xd98b], /* Non Private Use High Surrogate */
- [0xd98c, 0xd98c], /* Non Private Use High Surrogate */
- [0xd98d, 0xd98d], /* Non Private Use High Surrogate */
- [0xd98e, 0xd98e], /* Non Private Use High Surrogate */
- [0xd98f, 0xd98f], /* Non Private Use High Surrogate */
- [0xd990, 0xd990], /* Non Private Use High Surrogate */
- [0xd991, 0xd991], /* Non Private Use High Surrogate */
- [0xd992, 0xd992], /* Non Private Use High Surrogate */
- [0xd993, 0xd993], /* Non Private Use High Surrogate */
- [0xd994, 0xd994], /* Non Private Use High Surrogate */
- [0xd995, 0xd995], /* Non Private Use High Surrogate */
- [0xd996, 0xd996], /* Non Private Use High Surrogate */
- [0xd997, 0xd997], /* Non Private Use High Surrogate */
- [0xd998, 0xd998], /* Non Private Use High Surrogate */
- [0xd999, 0xd999], /* Non Private Use High Surrogate */
- [0xd99a, 0xd99a], /* Non Private Use High Surrogate */
- [0xd99b, 0xd99b], /* Non Private Use High Surrogate */
- [0xd99c, 0xd99c], /* Non Private Use High Surrogate */
- [0xd99d, 0xd99d], /* Non Private Use High Surrogate */
- [0xd99e, 0xd99e], /* Non Private Use High Surrogate */
- [0xd99f, 0xd99f], /* Non Private Use High Surrogate */
- [0xd9a0, 0xd9a0], /* Non Private Use High Surrogate */
- [0xd9a1, 0xd9a1], /* Non Private Use High Surrogate */
- [0xd9a2, 0xd9a2], /* Non Private Use High Surrogate */
- [0xd9a3, 0xd9a3], /* Non Private Use High Surrogate */
- [0xd9a4, 0xd9a4], /* Non Private Use High Surrogate */
- [0xd9a5, 0xd9a5], /* Non Private Use High Surrogate */
- [0xd9a6, 0xd9a6], /* Non Private Use High Surrogate */
- [0xd9a7, 0xd9a7], /* Non Private Use High Surrogate */
- [0xd9a8, 0xd9a8], /* Non Private Use High Surrogate */
- [0xd9a9, 0xd9a9], /* Non Private Use High Surrogate */
- [0xd9aa, 0xd9aa], /* Non Private Use High Surrogate */
- [0xd9ab, 0xd9ab], /* Non Private Use High Surrogate */
- [0xd9ac, 0xd9ac], /* Non Private Use High Surrogate */
- [0xd9ad, 0xd9ad], /* Non Private Use High Surrogate */
- [0xd9ae, 0xd9ae], /* Non Private Use High Surrogate */
- [0xd9af, 0xd9af], /* Non Private Use High Surrogate */
- [0xd9b0, 0xd9b0], /* Non Private Use High Surrogate */
- [0xd9b1, 0xd9b1], /* Non Private Use High Surrogate */
- [0xd9b2, 0xd9b2], /* Non Private Use High Surrogate */
- [0xd9b3, 0xd9b3], /* Non Private Use High Surrogate */
- [0xd9b4, 0xd9b4], /* Non Private Use High Surrogate */
- [0xd9b5, 0xd9b5], /* Non Private Use High Surrogate */
- [0xd9b6, 0xd9b6], /* Non Private Use High Surrogate */
- [0xd9b7, 0xd9b7], /* Non Private Use High Surrogate */
- [0xd9b8, 0xd9b8], /* Non Private Use High Surrogate */
- [0xd9b9, 0xd9b9], /* Non Private Use High Surrogate */
- [0xd9ba, 0xd9ba], /* Non Private Use High Surrogate */
- [0xd9bb, 0xd9bb], /* Non Private Use High Surrogate */
- [0xd9bc, 0xd9bc], /* Non Private Use High Surrogate */
- [0xd9bd, 0xd9bd], /* Non Private Use High Surrogate */
- [0xd9be, 0xd9be], /* Non Private Use High Surrogate */
- [0xd9bf, 0xd9bf], /* Non Private Use High Surrogate */
- [0xd9c0, 0xd9c0], /* Non Private Use High Surrogate */
- [0xd9c1, 0xd9c1], /* Non Private Use High Surrogate */
- [0xd9c2, 0xd9c2], /* Non Private Use High Surrogate */
- [0xd9c3, 0xd9c3], /* Non Private Use High Surrogate */
- [0xd9c4, 0xd9c4], /* Non Private Use High Surrogate */
- [0xd9c5, 0xd9c5], /* Non Private Use High Surrogate */
- [0xd9c6, 0xd9c6], /* Non Private Use High Surrogate */
- [0xd9c7, 0xd9c7], /* Non Private Use High Surrogate */
- [0xd9c8, 0xd9c8], /* Non Private Use High Surrogate */
- [0xd9c9, 0xd9c9], /* Non Private Use High Surrogate */
- [0xd9ca, 0xd9ca], /* Non Private Use High Surrogate */
- [0xd9cb, 0xd9cb], /* Non Private Use High Surrogate */
- [0xd9cc, 0xd9cc], /* Non Private Use High Surrogate */
- [0xd9cd, 0xd9cd], /* Non Private Use High Surrogate */
- [0xd9ce, 0xd9ce], /* Non Private Use High Surrogate */
- [0xd9cf, 0xd9cf], /* Non Private Use High Surrogate */
- [0xd9d0, 0xd9d0], /* Non Private Use High Surrogate */
- [0xd9d1, 0xd9d1], /* Non Private Use High Surrogate */
- [0xd9d2, 0xd9d2], /* Non Private Use High Surrogate */
- [0xd9d3, 0xd9d3], /* Non Private Use High Surrogate */
- [0xd9d4, 0xd9d4], /* Non Private Use High Surrogate */
- [0xd9d5, 0xd9d5], /* Non Private Use High Surrogate */
- [0xd9d6, 0xd9d6], /* Non Private Use High Surrogate */
- [0xd9d7, 0xd9d7], /* Non Private Use High Surrogate */
- [0xd9d8, 0xd9d8], /* Non Private Use High Surrogate */
- [0xd9d9, 0xd9d9], /* Non Private Use High Surrogate */
- [0xd9da, 0xd9da], /* Non Private Use High Surrogate */
- [0xd9db, 0xd9db], /* Non Private Use High Surrogate */
- [0xd9dc, 0xd9dc], /* Non Private Use High Surrogate */
- [0xd9dd, 0xd9dd], /* Non Private Use High Surrogate */
- [0xd9de, 0xd9de], /* Non Private Use High Surrogate */
- [0xd9df, 0xd9df], /* Non Private Use High Surrogate */
- [0xd9e0, 0xd9e0], /* Non Private Use High Surrogate */
- [0xd9e1, 0xd9e1], /* Non Private Use High Surrogate */
- [0xd9e2, 0xd9e2], /* Non Private Use High Surrogate */
- [0xd9e3, 0xd9e3], /* Non Private Use High Surrogate */
- [0xd9e4, 0xd9e4], /* Non Private Use High Surrogate */
- [0xd9e5, 0xd9e5], /* Non Private Use High Surrogate */
- [0xd9e6, 0xd9e6], /* Non Private Use High Surrogate */
- [0xd9e7, 0xd9e7], /* Non Private Use High Surrogate */
- [0xd9e8, 0xd9e8], /* Non Private Use High Surrogate */
- [0xd9e9, 0xd9e9], /* Non Private Use High Surrogate */
- [0xd9ea, 0xd9ea], /* Non Private Use High Surrogate */
- [0xd9eb, 0xd9eb], /* Non Private Use High Surrogate */
- [0xd9ec, 0xd9ec], /* Non Private Use High Surrogate */
- [0xd9ed, 0xd9ed], /* Non Private Use High Surrogate */
- [0xd9ee, 0xd9ee], /* Non Private Use High Surrogate */
- [0xd9ef, 0xd9ef], /* Non Private Use High Surrogate */
- [0xd9f0, 0xd9f0], /* Non Private Use High Surrogate */
- [0xd9f1, 0xd9f1], /* Non Private Use High Surrogate */
- [0xd9f2, 0xd9f2], /* Non Private Use High Surrogate */
- [0xd9f3, 0xd9f3], /* Non Private Use High Surrogate */
- [0xd9f4, 0xd9f4], /* Non Private Use High Surrogate */
- [0xd9f5, 0xd9f5], /* Non Private Use High Surrogate */
- [0xd9f6, 0xd9f6], /* Non Private Use High Surrogate */
- [0xd9f7, 0xd9f7], /* Non Private Use High Surrogate */
- [0xd9f8, 0xd9f8], /* Non Private Use High Surrogate */
- [0xd9f9, 0xd9f9], /* Non Private Use High Surrogate */
- [0xd9fa, 0xd9fa], /* Non Private Use High Surrogate */
- [0xd9fb, 0xd9fb], /* Non Private Use High Surrogate */
- [0xd9fc, 0xd9fc], /* Non Private Use High Surrogate */
- [0xd9fd, 0xd9fd], /* Non Private Use High Surrogate */
- [0xd9fe, 0xd9fe], /* Non Private Use High Surrogate */
- [0xd9ff, 0xd9ff], /* Non Private Use High Surrogate */
- [0xda00, 0xda00], /* Non Private Use High Surrogate */
- [0xda01, 0xda01], /* Non Private Use High Surrogate */
- [0xda02, 0xda02], /* Non Private Use High Surrogate */
- [0xda03, 0xda03], /* Non Private Use High Surrogate */
- [0xda04, 0xda04], /* Non Private Use High Surrogate */
- [0xda05, 0xda05], /* Non Private Use High Surrogate */
- [0xda06, 0xda06], /* Non Private Use High Surrogate */
- [0xda07, 0xda07], /* Non Private Use High Surrogate */
- [0xda08, 0xda08], /* Non Private Use High Surrogate */
- [0xda09, 0xda09], /* Non Private Use High Surrogate */
- [0xda0a, 0xda0a], /* Non Private Use High Surrogate */
- [0xda0b, 0xda0b], /* Non Private Use High Surrogate */
- [0xda0c, 0xda0c], /* Non Private Use High Surrogate */
- [0xda0d, 0xda0d], /* Non Private Use High Surrogate */
- [0xda0e, 0xda0e], /* Non Private Use High Surrogate */
- [0xda0f, 0xda0f], /* Non Private Use High Surrogate */
- [0xda10, 0xda10], /* Non Private Use High Surrogate */
- [0xda11, 0xda11], /* Non Private Use High Surrogate */
- [0xda12, 0xda12], /* Non Private Use High Surrogate */
- [0xda13, 0xda13], /* Non Private Use High Surrogate */
- [0xda14, 0xda14], /* Non Private Use High Surrogate */
- [0xda15, 0xda15], /* Non Private Use High Surrogate */
- [0xda16, 0xda16], /* Non Private Use High Surrogate */
- [0xda17, 0xda17], /* Non Private Use High Surrogate */
- [0xda18, 0xda18], /* Non Private Use High Surrogate */
- [0xda19, 0xda19], /* Non Private Use High Surrogate */
- [0xda1a, 0xda1a], /* Non Private Use High Surrogate */
- [0xda1b, 0xda1b], /* Non Private Use High Surrogate */
- [0xda1c, 0xda1c], /* Non Private Use High Surrogate */
- [0xda1d, 0xda1d], /* Non Private Use High Surrogate */
- [0xda1e, 0xda1e], /* Non Private Use High Surrogate */
- [0xda1f, 0xda1f], /* Non Private Use High Surrogate */
- [0xda20, 0xda20], /* Non Private Use High Surrogate */
- [0xda21, 0xda21], /* Non Private Use High Surrogate */
- [0xda22, 0xda22], /* Non Private Use High Surrogate */
- [0xda23, 0xda23], /* Non Private Use High Surrogate */
- [0xda24, 0xda24], /* Non Private Use High Surrogate */
- [0xda25, 0xda25], /* Non Private Use High Surrogate */
- [0xda26, 0xda26], /* Non Private Use High Surrogate */
- [0xda27, 0xda27], /* Non Private Use High Surrogate */
- [0xda28, 0xda28], /* Non Private Use High Surrogate */
- [0xda29, 0xda29], /* Non Private Use High Surrogate */
- [0xda2a, 0xda2a], /* Non Private Use High Surrogate */
- [0xda2b, 0xda2b], /* Non Private Use High Surrogate */
- [0xda2c, 0xda2c], /* Non Private Use High Surrogate */
- [0xda2d, 0xda2d], /* Non Private Use High Surrogate */
- [0xda2e, 0xda2e], /* Non Private Use High Surrogate */
- [0xda2f, 0xda2f], /* Non Private Use High Surrogate */
- [0xda30, 0xda30], /* Non Private Use High Surrogate */
- [0xda31, 0xda31], /* Non Private Use High Surrogate */
- [0xda32, 0xda32], /* Non Private Use High Surrogate */
- [0xda33, 0xda33], /* Non Private Use High Surrogate */
- [0xda34, 0xda34], /* Non Private Use High Surrogate */
- [0xda35, 0xda35], /* Non Private Use High Surrogate */
- [0xda36, 0xda36], /* Non Private Use High Surrogate */
- [0xda37, 0xda37], /* Non Private Use High Surrogate */
- [0xda38, 0xda38], /* Non Private Use High Surrogate */
- [0xda39, 0xda39], /* Non Private Use High Surrogate */
- [0xda3a, 0xda3a], /* Non Private Use High Surrogate */
- [0xda3b, 0xda3b], /* Non Private Use High Surrogate */
- [0xda3c, 0xda3c], /* Non Private Use High Surrogate */
- [0xda3d, 0xda3d], /* Non Private Use High Surrogate */
- [0xda3e, 0xda3e], /* Non Private Use High Surrogate */
- [0xda3f, 0xda3f], /* Non Private Use High Surrogate */
- [0xda40, 0xda40], /* Non Private Use High Surrogate */
- [0xda41, 0xda41], /* Non Private Use High Surrogate */
- [0xda42, 0xda42], /* Non Private Use High Surrogate */
- [0xda43, 0xda43], /* Non Private Use High Surrogate */
- [0xda44, 0xda44], /* Non Private Use High Surrogate */
- [0xda45, 0xda45], /* Non Private Use High Surrogate */
- [0xda46, 0xda46], /* Non Private Use High Surrogate */
- [0xda47, 0xda47], /* Non Private Use High Surrogate */
- [0xda48, 0xda48], /* Non Private Use High Surrogate */
- [0xda49, 0xda49], /* Non Private Use High Surrogate */
- [0xda4a, 0xda4a], /* Non Private Use High Surrogate */
- [0xda4b, 0xda4b], /* Non Private Use High Surrogate */
- [0xda4c, 0xda4c], /* Non Private Use High Surrogate */
- [0xda4d, 0xda4d], /* Non Private Use High Surrogate */
- [0xda4e, 0xda4e], /* Non Private Use High Surrogate */
- [0xda4f, 0xda4f], /* Non Private Use High Surrogate */
- [0xda50, 0xda50], /* Non Private Use High Surrogate */
- [0xda51, 0xda51], /* Non Private Use High Surrogate */
- [0xda52, 0xda52], /* Non Private Use High Surrogate */
- [0xda53, 0xda53], /* Non Private Use High Surrogate */
- [0xda54, 0xda54], /* Non Private Use High Surrogate */
- [0xda55, 0xda55], /* Non Private Use High Surrogate */
- [0xda56, 0xda56], /* Non Private Use High Surrogate */
- [0xda57, 0xda57], /* Non Private Use High Surrogate */
- [0xda58, 0xda58], /* Non Private Use High Surrogate */
- [0xda59, 0xda59], /* Non Private Use High Surrogate */
- [0xda5a, 0xda5a], /* Non Private Use High Surrogate */
- [0xda5b, 0xda5b], /* Non Private Use High Surrogate */
- [0xda5c, 0xda5c], /* Non Private Use High Surrogate */
- [0xda5d, 0xda5d], /* Non Private Use High Surrogate */
- [0xda5e, 0xda5e], /* Non Private Use High Surrogate */
- [0xda5f, 0xda5f], /* Non Private Use High Surrogate */
- [0xda60, 0xda60], /* Non Private Use High Surrogate */
- [0xda61, 0xda61], /* Non Private Use High Surrogate */
- [0xda62, 0xda62], /* Non Private Use High Surrogate */
- [0xda63, 0xda63], /* Non Private Use High Surrogate */
- [0xda64, 0xda64], /* Non Private Use High Surrogate */
- [0xda65, 0xda65], /* Non Private Use High Surrogate */
- [0xda66, 0xda66], /* Non Private Use High Surrogate */
- [0xda67, 0xda67], /* Non Private Use High Surrogate */
- [0xda68, 0xda68], /* Non Private Use High Surrogate */
- [0xda69, 0xda69], /* Non Private Use High Surrogate */
- [0xda6a, 0xda6a], /* Non Private Use High Surrogate */
- [0xda6b, 0xda6b], /* Non Private Use High Surrogate */
- [0xda6c, 0xda6c], /* Non Private Use High Surrogate */
- [0xda6d, 0xda6d], /* Non Private Use High Surrogate */
- [0xda6e, 0xda6e], /* Non Private Use High Surrogate */
- [0xda6f, 0xda6f], /* Non Private Use High Surrogate */
- [0xda70, 0xda70], /* Non Private Use High Surrogate */
- [0xda71, 0xda71], /* Non Private Use High Surrogate */
- [0xda72, 0xda72], /* Non Private Use High Surrogate */
- [0xda73, 0xda73], /* Non Private Use High Surrogate */
- [0xda74, 0xda74], /* Non Private Use High Surrogate */
- [0xda75, 0xda75], /* Non Private Use High Surrogate */
- [0xda76, 0xda76], /* Non Private Use High Surrogate */
- [0xda77, 0xda77], /* Non Private Use High Surrogate */
- [0xda78, 0xda78], /* Non Private Use High Surrogate */
- [0xda79, 0xda79], /* Non Private Use High Surrogate */
- [0xda7a, 0xda7a], /* Non Private Use High Surrogate */
- [0xda7b, 0xda7b], /* Non Private Use High Surrogate */
- [0xda7c, 0xda7c], /* Non Private Use High Surrogate */
- [0xda7d, 0xda7d], /* Non Private Use High Surrogate */
- [0xda7e, 0xda7e], /* Non Private Use High Surrogate */
- [0xda7f, 0xda7f], /* Non Private Use High Surrogate */
- [0xda80, 0xda80], /* Non Private Use High Surrogate */
- [0xda81, 0xda81], /* Non Private Use High Surrogate */
- [0xda82, 0xda82], /* Non Private Use High Surrogate */
- [0xda83, 0xda83], /* Non Private Use High Surrogate */
- [0xda84, 0xda84], /* Non Private Use High Surrogate */
- [0xda85, 0xda85], /* Non Private Use High Surrogate */
- [0xda86, 0xda86], /* Non Private Use High Surrogate */
- [0xda87, 0xda87], /* Non Private Use High Surrogate */
- [0xda88, 0xda88], /* Non Private Use High Surrogate */
- [0xda89, 0xda89], /* Non Private Use High Surrogate */
- [0xda8a, 0xda8a], /* Non Private Use High Surrogate */
- [0xda8b, 0xda8b], /* Non Private Use High Surrogate */
- [0xda8c, 0xda8c], /* Non Private Use High Surrogate */
- [0xda8d, 0xda8d], /* Non Private Use High Surrogate */
- [0xda8e, 0xda8e], /* Non Private Use High Surrogate */
- [0xda8f, 0xda8f], /* Non Private Use High Surrogate */
- [0xda90, 0xda90], /* Non Private Use High Surrogate */
- [0xda91, 0xda91], /* Non Private Use High Surrogate */
- [0xda92, 0xda92], /* Non Private Use High Surrogate */
- [0xda93, 0xda93], /* Non Private Use High Surrogate */
- [0xda94, 0xda94], /* Non Private Use High Surrogate */
- [0xda95, 0xda95], /* Non Private Use High Surrogate */
- [0xda96, 0xda96], /* Non Private Use High Surrogate */
- [0xda97, 0xda97], /* Non Private Use High Surrogate */
- [0xda98, 0xda98], /* Non Private Use High Surrogate */
- [0xda99, 0xda99], /* Non Private Use High Surrogate */
- [0xda9a, 0xda9a], /* Non Private Use High Surrogate */
- [0xda9b, 0xda9b], /* Non Private Use High Surrogate */
- [0xda9c, 0xda9c], /* Non Private Use High Surrogate */
- [0xda9d, 0xda9d], /* Non Private Use High Surrogate */
- [0xda9e, 0xda9e], /* Non Private Use High Surrogate */
- [0xda9f, 0xda9f], /* Non Private Use High Surrogate */
- [0xdaa0, 0xdaa0], /* Non Private Use High Surrogate */
- [0xdaa1, 0xdaa1], /* Non Private Use High Surrogate */
- [0xdaa2, 0xdaa2], /* Non Private Use High Surrogate */
- [0xdaa3, 0xdaa3], /* Non Private Use High Surrogate */
- [0xdaa4, 0xdaa4], /* Non Private Use High Surrogate */
- [0xdaa5, 0xdaa5], /* Non Private Use High Surrogate */
- [0xdaa6, 0xdaa6], /* Non Private Use High Surrogate */
- [0xdaa7, 0xdaa7], /* Non Private Use High Surrogate */
- [0xdaa8, 0xdaa8], /* Non Private Use High Surrogate */
- [0xdaa9, 0xdaa9], /* Non Private Use High Surrogate */
- [0xdaaa, 0xdaaa], /* Non Private Use High Surrogate */
- [0xdaab, 0xdaab], /* Non Private Use High Surrogate */
- [0xdaac, 0xdaac], /* Non Private Use High Surrogate */
- [0xdaad, 0xdaad], /* Non Private Use High Surrogate */
- [0xdaae, 0xdaae], /* Non Private Use High Surrogate */
- [0xdaaf, 0xdaaf], /* Non Private Use High Surrogate */
- [0xdab0, 0xdab0], /* Non Private Use High Surrogate */
- [0xdab1, 0xdab1], /* Non Private Use High Surrogate */
- [0xdab2, 0xdab2], /* Non Private Use High Surrogate */
- [0xdab3, 0xdab3], /* Non Private Use High Surrogate */
- [0xdab4, 0xdab4], /* Non Private Use High Surrogate */
- [0xdab5, 0xdab5], /* Non Private Use High Surrogate */
- [0xdab6, 0xdab6], /* Non Private Use High Surrogate */
- [0xdab7, 0xdab7], /* Non Private Use High Surrogate */
- [0xdab8, 0xdab8], /* Non Private Use High Surrogate */
- [0xdab9, 0xdab9], /* Non Private Use High Surrogate */
- [0xdaba, 0xdaba], /* Non Private Use High Surrogate */
- [0xdabb, 0xdabb], /* Non Private Use High Surrogate */
- [0xdabc, 0xdabc], /* Non Private Use High Surrogate */
- [0xdabd, 0xdabd], /* Non Private Use High Surrogate */
- [0xdabe, 0xdabe], /* Non Private Use High Surrogate */
- [0xdabf, 0xdabf], /* Non Private Use High Surrogate */
- [0xdac0, 0xdac0], /* Non Private Use High Surrogate */
- [0xdac1, 0xdac1], /* Non Private Use High Surrogate */
- [0xdac2, 0xdac2], /* Non Private Use High Surrogate */
- [0xdac3, 0xdac3], /* Non Private Use High Surrogate */
- [0xdac4, 0xdac4], /* Non Private Use High Surrogate */
- [0xdac5, 0xdac5], /* Non Private Use High Surrogate */
- [0xdac6, 0xdac6], /* Non Private Use High Surrogate */
- [0xdac7, 0xdac7], /* Non Private Use High Surrogate */
- [0xdac8, 0xdac8], /* Non Private Use High Surrogate */
- [0xdac9, 0xdac9], /* Non Private Use High Surrogate */
- [0xdaca, 0xdaca], /* Non Private Use High Surrogate */
- [0xdacb, 0xdacb], /* Non Private Use High Surrogate */
- [0xdacc, 0xdacc], /* Non Private Use High Surrogate */
- [0xdacd, 0xdacd], /* Non Private Use High Surrogate */
- [0xdace, 0xdace], /* Non Private Use High Surrogate */
- [0xdacf, 0xdacf], /* Non Private Use High Surrogate */
- [0xdad0, 0xdad0], /* Non Private Use High Surrogate */
- [0xdad1, 0xdad1], /* Non Private Use High Surrogate */
- [0xdad2, 0xdad2], /* Non Private Use High Surrogate */
- [0xdad3, 0xdad3], /* Non Private Use High Surrogate */
- [0xdad4, 0xdad4], /* Non Private Use High Surrogate */
- [0xdad5, 0xdad5], /* Non Private Use High Surrogate */
- [0xdad6, 0xdad6], /* Non Private Use High Surrogate */
- [0xdad7, 0xdad7], /* Non Private Use High Surrogate */
- [0xdad8, 0xdad8], /* Non Private Use High Surrogate */
- [0xdad9, 0xdad9], /* Non Private Use High Surrogate */
- [0xdada, 0xdada], /* Non Private Use High Surrogate */
- [0xdadb, 0xdadb], /* Non Private Use High Surrogate */
- [0xdadc, 0xdadc], /* Non Private Use High Surrogate */
- [0xdadd, 0xdadd], /* Non Private Use High Surrogate */
- [0xdade, 0xdade], /* Non Private Use High Surrogate */
- [0xdadf, 0xdadf], /* Non Private Use High Surrogate */
- [0xdae0, 0xdae0], /* Non Private Use High Surrogate */
- [0xdae1, 0xdae1], /* Non Private Use High Surrogate */
- [0xdae2, 0xdae2], /* Non Private Use High Surrogate */
- [0xdae3, 0xdae3], /* Non Private Use High Surrogate */
- [0xdae4, 0xdae4], /* Non Private Use High Surrogate */
- [0xdae5, 0xdae5], /* Non Private Use High Surrogate */
- [0xdae6, 0xdae6], /* Non Private Use High Surrogate */
- [0xdae7, 0xdae7], /* Non Private Use High Surrogate */
- [0xdae8, 0xdae8], /* Non Private Use High Surrogate */
- [0xdae9, 0xdae9], /* Non Private Use High Surrogate */
- [0xdaea, 0xdaea], /* Non Private Use High Surrogate */
- [0xdaeb, 0xdaeb], /* Non Private Use High Surrogate */
- [0xdaec, 0xdaec], /* Non Private Use High Surrogate */
- [0xdaed, 0xdaed], /* Non Private Use High Surrogate */
- [0xdaee, 0xdaee], /* Non Private Use High Surrogate */
- [0xdaef, 0xdaef], /* Non Private Use High Surrogate */
- [0xdaf0, 0xdaf0], /* Non Private Use High Surrogate */
- [0xdaf1, 0xdaf1], /* Non Private Use High Surrogate */
- [0xdaf2, 0xdaf2], /* Non Private Use High Surrogate */
- [0xdaf3, 0xdaf3], /* Non Private Use High Surrogate */
- [0xdaf4, 0xdaf4], /* Non Private Use High Surrogate */
- [0xdaf5, 0xdaf5], /* Non Private Use High Surrogate */
- [0xdaf6, 0xdaf6], /* Non Private Use High Surrogate */
- [0xdaf7, 0xdaf7], /* Non Private Use High Surrogate */
- [0xdaf8, 0xdaf8], /* Non Private Use High Surrogate */
- [0xdaf9, 0xdaf9], /* Non Private Use High Surrogate */
- [0xdafa, 0xdafa], /* Non Private Use High Surrogate */
- [0xdafb, 0xdafb], /* Non Private Use High Surrogate */
- [0xdafc, 0xdafc], /* Non Private Use High Surrogate */
- [0xdafd, 0xdafd], /* Non Private Use High Surrogate */
- [0xdafe, 0xdafe], /* Non Private Use High Surrogate */
- [0xdaff, 0xdaff], /* Non Private Use High Surrogate */
- [0xdb00, 0xdb00], /* Non Private Use High Surrogate */
- [0xdb01, 0xdb01], /* Non Private Use High Surrogate */
- [0xdb02, 0xdb02], /* Non Private Use High Surrogate */
- [0xdb03, 0xdb03], /* Non Private Use High Surrogate */
- [0xdb04, 0xdb04], /* Non Private Use High Surrogate */
- [0xdb05, 0xdb05], /* Non Private Use High Surrogate */
- [0xdb06, 0xdb06], /* Non Private Use High Surrogate */
- [0xdb07, 0xdb07], /* Non Private Use High Surrogate */
- [0xdb08, 0xdb08], /* Non Private Use High Surrogate */
- [0xdb09, 0xdb09], /* Non Private Use High Surrogate */
- [0xdb0a, 0xdb0a], /* Non Private Use High Surrogate */
- [0xdb0b, 0xdb0b], /* Non Private Use High Surrogate */
- [0xdb0c, 0xdb0c], /* Non Private Use High Surrogate */
- [0xdb0d, 0xdb0d], /* Non Private Use High Surrogate */
- [0xdb0e, 0xdb0e], /* Non Private Use High Surrogate */
- [0xdb0f, 0xdb0f], /* Non Private Use High Surrogate */
- [0xdb10, 0xdb10], /* Non Private Use High Surrogate */
- [0xdb11, 0xdb11], /* Non Private Use High Surrogate */
- [0xdb12, 0xdb12], /* Non Private Use High Surrogate */
- [0xdb13, 0xdb13], /* Non Private Use High Surrogate */
- [0xdb14, 0xdb14], /* Non Private Use High Surrogate */
- [0xdb15, 0xdb15], /* Non Private Use High Surrogate */
- [0xdb16, 0xdb16], /* Non Private Use High Surrogate */
- [0xdb17, 0xdb17], /* Non Private Use High Surrogate */
- [0xdb18, 0xdb18], /* Non Private Use High Surrogate */
- [0xdb19, 0xdb19], /* Non Private Use High Surrogate */
- [0xdb1a, 0xdb1a], /* Non Private Use High Surrogate */
- [0xdb1b, 0xdb1b], /* Non Private Use High Surrogate */
- [0xdb1c, 0xdb1c], /* Non Private Use High Surrogate */
- [0xdb1d, 0xdb1d], /* Non Private Use High Surrogate */
- [0xdb1e, 0xdb1e], /* Non Private Use High Surrogate */
- [0xdb1f, 0xdb1f], /* Non Private Use High Surrogate */
- [0xdb20, 0xdb20], /* Non Private Use High Surrogate */
- [0xdb21, 0xdb21], /* Non Private Use High Surrogate */
- [0xdb22, 0xdb22], /* Non Private Use High Surrogate */
- [0xdb23, 0xdb23], /* Non Private Use High Surrogate */
- [0xdb24, 0xdb24], /* Non Private Use High Surrogate */
- [0xdb25, 0xdb25], /* Non Private Use High Surrogate */
- [0xdb26, 0xdb26], /* Non Private Use High Surrogate */
- [0xdb27, 0xdb27], /* Non Private Use High Surrogate */
- [0xdb28, 0xdb28], /* Non Private Use High Surrogate */
- [0xdb29, 0xdb29], /* Non Private Use High Surrogate */
- [0xdb2a, 0xdb2a], /* Non Private Use High Surrogate */
- [0xdb2b, 0xdb2b], /* Non Private Use High Surrogate */
- [0xdb2c, 0xdb2c], /* Non Private Use High Surrogate */
- [0xdb2d, 0xdb2d], /* Non Private Use High Surrogate */
- [0xdb2e, 0xdb2e], /* Non Private Use High Surrogate */
- [0xdb2f, 0xdb2f], /* Non Private Use High Surrogate */
- [0xdb30, 0xdb30], /* Non Private Use High Surrogate */
- [0xdb31, 0xdb31], /* Non Private Use High Surrogate */
- [0xdb32, 0xdb32], /* Non Private Use High Surrogate */
- [0xdb33, 0xdb33], /* Non Private Use High Surrogate */
- [0xdb34, 0xdb34], /* Non Private Use High Surrogate */
- [0xdb35, 0xdb35], /* Non Private Use High Surrogate */
- [0xdb36, 0xdb36], /* Non Private Use High Surrogate */
- [0xdb37, 0xdb37], /* Non Private Use High Surrogate */
- [0xdb38, 0xdb38], /* Non Private Use High Surrogate */
- [0xdb39, 0xdb39], /* Non Private Use High Surrogate */
- [0xdb3a, 0xdb3a], /* Non Private Use High Surrogate */
- [0xdb3b, 0xdb3b], /* Non Private Use High Surrogate */
- [0xdb3c, 0xdb3c], /* Non Private Use High Surrogate */
- [0xdb3d, 0xdb3d], /* Non Private Use High Surrogate */
- [0xdb3e, 0xdb3e], /* Non Private Use High Surrogate */
- [0xdb3f, 0xdb3f], /* Non Private Use High Surrogate */
- [0xdb40, 0xdb40], /* Non Private Use High Surrogate */
- [0xdb41, 0xdb41], /* Non Private Use High Surrogate */
- [0xdb42, 0xdb42], /* Non Private Use High Surrogate */
- [0xdb43, 0xdb43], /* Non Private Use High Surrogate */
- [0xdb44, 0xdb44], /* Non Private Use High Surrogate */
- [0xdb45, 0xdb45], /* Non Private Use High Surrogate */
- [0xdb46, 0xdb46], /* Non Private Use High Surrogate */
- [0xdb47, 0xdb47], /* Non Private Use High Surrogate */
- [0xdb48, 0xdb48], /* Non Private Use High Surrogate */
- [0xdb49, 0xdb49], /* Non Private Use High Surrogate */
- [0xdb4a, 0xdb4a], /* Non Private Use High Surrogate */
- [0xdb4b, 0xdb4b], /* Non Private Use High Surrogate */
- [0xdb4c, 0xdb4c], /* Non Private Use High Surrogate */
- [0xdb4d, 0xdb4d], /* Non Private Use High Surrogate */
- [0xdb4e, 0xdb4e], /* Non Private Use High Surrogate */
- [0xdb4f, 0xdb4f], /* Non Private Use High Surrogate */
- [0xdb50, 0xdb50], /* Non Private Use High Surrogate */
- [0xdb51, 0xdb51], /* Non Private Use High Surrogate */
- [0xdb52, 0xdb52], /* Non Private Use High Surrogate */
- [0xdb53, 0xdb53], /* Non Private Use High Surrogate */
- [0xdb54, 0xdb54], /* Non Private Use High Surrogate */
- [0xdb55, 0xdb55], /* Non Private Use High Surrogate */
- [0xdb56, 0xdb56], /* Non Private Use High Surrogate */
- [0xdb57, 0xdb57], /* Non Private Use High Surrogate */
- [0xdb58, 0xdb58], /* Non Private Use High Surrogate */
- [0xdb59, 0xdb59], /* Non Private Use High Surrogate */
- [0xdb5a, 0xdb5a], /* Non Private Use High Surrogate */
- [0xdb5b, 0xdb5b], /* Non Private Use High Surrogate */
- [0xdb5c, 0xdb5c], /* Non Private Use High Surrogate */
- [0xdb5d, 0xdb5d], /* Non Private Use High Surrogate */
- [0xdb5e, 0xdb5e], /* Non Private Use High Surrogate */
- [0xdb5f, 0xdb5f], /* Non Private Use High Surrogate */
- [0xdb60, 0xdb60], /* Non Private Use High Surrogate */
- [0xdb61, 0xdb61], /* Non Private Use High Surrogate */
- [0xdb62, 0xdb62], /* Non Private Use High Surrogate */
- [0xdb63, 0xdb63], /* Non Private Use High Surrogate */
- [0xdb64, 0xdb64], /* Non Private Use High Surrogate */
- [0xdb65, 0xdb65], /* Non Private Use High Surrogate */
- [0xdb66, 0xdb66], /* Non Private Use High Surrogate */
- [0xdb67, 0xdb67], /* Non Private Use High Surrogate */
- [0xdb68, 0xdb68], /* Non Private Use High Surrogate */
- [0xdb69, 0xdb69], /* Non Private Use High Surrogate */
- [0xdb6a, 0xdb6a], /* Non Private Use High Surrogate */
- [0xdb6b, 0xdb6b], /* Non Private Use High Surrogate */
- [0xdb6c, 0xdb6c], /* Non Private Use High Surrogate */
- [0xdb6d, 0xdb6d], /* Non Private Use High Surrogate */
- [0xdb6e, 0xdb6e], /* Non Private Use High Surrogate */
- [0xdb6f, 0xdb6f], /* Non Private Use High Surrogate */
- [0xdb70, 0xdb70], /* Non Private Use High Surrogate */
- [0xdb71, 0xdb71], /* Non Private Use High Surrogate */
- [0xdb72, 0xdb72], /* Non Private Use High Surrogate */
- [0xdb73, 0xdb73], /* Non Private Use High Surrogate */
- [0xdb74, 0xdb74], /* Non Private Use High Surrogate */
- [0xdb75, 0xdb75], /* Non Private Use High Surrogate */
- [0xdb76, 0xdb76], /* Non Private Use High Surrogate */
- [0xdb77, 0xdb77], /* Non Private Use High Surrogate */
- [0xdb78, 0xdb78], /* Non Private Use High Surrogate */
- [0xdb79, 0xdb79], /* Non Private Use High Surrogate */
- [0xdb7a, 0xdb7a], /* Non Private Use High Surrogate */
- [0xdb7b, 0xdb7b], /* Non Private Use High Surrogate */
- [0xdb7c, 0xdb7c], /* Non Private Use High Surrogate */
- [0xdb7d, 0xdb7d], /* Non Private Use High Surrogate */
- [0xdb7e, 0xdb7e], /* Non Private Use High Surrogate */
- [0xdb7f, 0xdb7f], /* Non Private Use High Surrogate */
- [0xdb80, 0xdb80], /* Private Use High Surrogate */
- [0xdb81, 0xdb81], /* Private Use High Surrogate */
- [0xdb82, 0xdb82], /* Private Use High Surrogate */
- [0xdb83, 0xdb83], /* Private Use High Surrogate */
- [0xdb84, 0xdb84], /* Private Use High Surrogate */
- [0xdb85, 0xdb85], /* Private Use High Surrogate */
- [0xdb86, 0xdb86], /* Private Use High Surrogate */
- [0xdb87, 0xdb87], /* Private Use High Surrogate */
- [0xdb88, 0xdb88], /* Private Use High Surrogate */
- [0xdb89, 0xdb89], /* Private Use High Surrogate */
- [0xdb8a, 0xdb8a], /* Private Use High Surrogate */
- [0xdb8b, 0xdb8b], /* Private Use High Surrogate */
- [0xdb8c, 0xdb8c], /* Private Use High Surrogate */
- [0xdb8d, 0xdb8d], /* Private Use High Surrogate */
- [0xdb8e, 0xdb8e], /* Private Use High Surrogate */
- [0xdb8f, 0xdb8f], /* Private Use High Surrogate */
- [0xdb90, 0xdb90], /* Private Use High Surrogate */
- [0xdb91, 0xdb91], /* Private Use High Surrogate */
- [0xdb92, 0xdb92], /* Private Use High Surrogate */
- [0xdb93, 0xdb93], /* Private Use High Surrogate */
- [0xdb94, 0xdb94], /* Private Use High Surrogate */
- [0xdb95, 0xdb95], /* Private Use High Surrogate */
- [0xdb96, 0xdb96], /* Private Use High Surrogate */
- [0xdb97, 0xdb97], /* Private Use High Surrogate */
- [0xdb98, 0xdb98], /* Private Use High Surrogate */
- [0xdb99, 0xdb99], /* Private Use High Surrogate */
- [0xdb9a, 0xdb9a], /* Private Use High Surrogate */
- [0xdb9b, 0xdb9b], /* Private Use High Surrogate */
- [0xdb9c, 0xdb9c], /* Private Use High Surrogate */
- [0xdb9d, 0xdb9d], /* Private Use High Surrogate */
- [0xdb9e, 0xdb9e], /* Private Use High Surrogate */
- [0xdb9f, 0xdb9f], /* Private Use High Surrogate */
- [0xdba0, 0xdba0], /* Private Use High Surrogate */
- [0xdba1, 0xdba1], /* Private Use High Surrogate */
- [0xdba2, 0xdba2], /* Private Use High Surrogate */
- [0xdba3, 0xdba3], /* Private Use High Surrogate */
- [0xdba4, 0xdba4], /* Private Use High Surrogate */
- [0xdba5, 0xdba5], /* Private Use High Surrogate */
- [0xdba6, 0xdba6], /* Private Use High Surrogate */
- [0xdba7, 0xdba7], /* Private Use High Surrogate */
- [0xdba8, 0xdba8], /* Private Use High Surrogate */
- [0xdba9, 0xdba9], /* Private Use High Surrogate */
- [0xdbaa, 0xdbaa], /* Private Use High Surrogate */
- [0xdbab, 0xdbab], /* Private Use High Surrogate */
- [0xdbac, 0xdbac], /* Private Use High Surrogate */
- [0xdbad, 0xdbad], /* Private Use High Surrogate */
- [0xdbae, 0xdbae], /* Private Use High Surrogate */
- [0xdbaf, 0xdbaf], /* Private Use High Surrogate */
- [0xdbb0, 0xdbb0], /* Private Use High Surrogate */
- [0xdbb1, 0xdbb1], /* Private Use High Surrogate */
- [0xdbb2, 0xdbb2], /* Private Use High Surrogate */
- [0xdbb3, 0xdbb3], /* Private Use High Surrogate */
- [0xdbb4, 0xdbb4], /* Private Use High Surrogate */
- [0xdbb5, 0xdbb5], /* Private Use High Surrogate */
- [0xdbb6, 0xdbb6], /* Private Use High Surrogate */
- [0xdbb7, 0xdbb7], /* Private Use High Surrogate */
- [0xdbb8, 0xdbb8], /* Private Use High Surrogate */
- [0xdbb9, 0xdbb9], /* Private Use High Surrogate */
- [0xdbba, 0xdbba], /* Private Use High Surrogate */
- [0xdbbb, 0xdbbb], /* Private Use High Surrogate */
- [0xdbbc, 0xdbbc], /* Private Use High Surrogate */
- [0xdbbd, 0xdbbd], /* Private Use High Surrogate */
- [0xdbbe, 0xdbbe], /* Private Use High Surrogate */
- [0xdbbf, 0xdbbf], /* Private Use High Surrogate */
- [0xdbc0, 0xdbc0], /* Private Use High Surrogate */
- [0xdbc1, 0xdbc1], /* Private Use High Surrogate */
- [0xdbc2, 0xdbc2], /* Private Use High Surrogate */
- [0xdbc3, 0xdbc3], /* Private Use High Surrogate */
- [0xdbc4, 0xdbc4], /* Private Use High Surrogate */
- [0xdbc5, 0xdbc5], /* Private Use High Surrogate */
- [0xdbc6, 0xdbc6], /* Private Use High Surrogate */
- [0xdbc7, 0xdbc7], /* Private Use High Surrogate */
- [0xdbc8, 0xdbc8], /* Private Use High Surrogate */
- [0xdbc9, 0xdbc9], /* Private Use High Surrogate */
- [0xdbca, 0xdbca], /* Private Use High Surrogate */
- [0xdbcb, 0xdbcb], /* Private Use High Surrogate */
- [0xdbcc, 0xdbcc], /* Private Use High Surrogate */
- [0xdbcd, 0xdbcd], /* Private Use High Surrogate */
- [0xdbce, 0xdbce], /* Private Use High Surrogate */
- [0xdbcf, 0xdbcf], /* Private Use High Surrogate */
- [0xdbd0, 0xdbd0], /* Private Use High Surrogate */
- [0xdbd1, 0xdbd1], /* Private Use High Surrogate */
- [0xdbd2, 0xdbd2], /* Private Use High Surrogate */
- [0xdbd3, 0xdbd3], /* Private Use High Surrogate */
- [0xdbd4, 0xdbd4], /* Private Use High Surrogate */
- [0xdbd5, 0xdbd5], /* Private Use High Surrogate */
- [0xdbd6, 0xdbd6], /* Private Use High Surrogate */
- [0xdbd7, 0xdbd7], /* Private Use High Surrogate */
- [0xdbd8, 0xdbd8], /* Private Use High Surrogate */
- [0xdbd9, 0xdbd9], /* Private Use High Surrogate */
- [0xdbda, 0xdbda], /* Private Use High Surrogate */
- [0xdbdb, 0xdbdb], /* Private Use High Surrogate */
- [0xdbdc, 0xdbdc], /* Private Use High Surrogate */
- [0xdbdd, 0xdbdd], /* Private Use High Surrogate */
- [0xdbde, 0xdbde], /* Private Use High Surrogate */
- [0xdbdf, 0xdbdf], /* Private Use High Surrogate */
- [0xdbe0, 0xdbe0], /* Private Use High Surrogate */
- [0xdbe1, 0xdbe1], /* Private Use High Surrogate */
- [0xdbe2, 0xdbe2], /* Private Use High Surrogate */
- [0xdbe3, 0xdbe3], /* Private Use High Surrogate */
- [0xdbe4, 0xdbe4], /* Private Use High Surrogate */
- [0xdbe5, 0xdbe5], /* Private Use High Surrogate */
- [0xdbe6, 0xdbe6], /* Private Use High Surrogate */
- [0xdbe7, 0xdbe7], /* Private Use High Surrogate */
- [0xdbe8, 0xdbe8], /* Private Use High Surrogate */
- [0xdbe9, 0xdbe9], /* Private Use High Surrogate */
- [0xdbea, 0xdbea], /* Private Use High Surrogate */
- [0xdbeb, 0xdbeb], /* Private Use High Surrogate */
- [0xdbec, 0xdbec], /* Private Use High Surrogate */
- [0xdbed, 0xdbed], /* Private Use High Surrogate */
- [0xdbee, 0xdbee], /* Private Use High Surrogate */
- [0xdbef, 0xdbef], /* Private Use High Surrogate */
- [0xdbf0, 0xdbf0], /* Private Use High Surrogate */
- [0xdbf1, 0xdbf1], /* Private Use High Surrogate */
- [0xdbf2, 0xdbf2], /* Private Use High Surrogate */
- [0xdbf3, 0xdbf3], /* Private Use High Surrogate */
- [0xdbf4, 0xdbf4], /* Private Use High Surrogate */
- [0xdbf5, 0xdbf5], /* Private Use High Surrogate */
- [0xdbf6, 0xdbf6], /* Private Use High Surrogate */
- [0xdbf7, 0xdbf7], /* Private Use High Surrogate */
- [0xdbf8, 0xdbf8], /* Private Use High Surrogate */
- [0xdbf9, 0xdbf9], /* Private Use High Surrogate */
- [0xdbfa, 0xdbfa], /* Private Use High Surrogate */
- [0xdbfb, 0xdbfb], /* Private Use High Surrogate */
- [0xdbfc, 0xdbfc], /* Private Use High Surrogate */
- [0xdbfd, 0xdbfd], /* Private Use High Surrogate */
- [0xdbfe, 0xdbfe], /* Private Use High Surrogate */
- [0xdbff, 0xdbff], /* Private Use High Surrogate */
- [0xdc00, 0xdc00], /* Low Surrogate */
- [0xdc01, 0xdc01], /* Low Surrogate */
- [0xdc02, 0xdc02], /* Low Surrogate */
- [0xdc03, 0xdc03], /* Low Surrogate */
- [0xdc04, 0xdc04], /* Low Surrogate */
- [0xdc05, 0xdc05], /* Low Surrogate */
- [0xdc06, 0xdc06], /* Low Surrogate */
- [0xdc07, 0xdc07], /* Low Surrogate */
- [0xdc08, 0xdc08], /* Low Surrogate */
- [0xdc09, 0xdc09], /* Low Surrogate */
- [0xdc0a, 0xdc0a], /* Low Surrogate */
- [0xdc0b, 0xdc0b], /* Low Surrogate */
- [0xdc0c, 0xdc0c], /* Low Surrogate */
- [0xdc0d, 0xdc0d], /* Low Surrogate */
- [0xdc0e, 0xdc0e], /* Low Surrogate */
- [0xdc0f, 0xdc0f], /* Low Surrogate */
- [0xdc10, 0xdc10], /* Low Surrogate */
- [0xdc11, 0xdc11], /* Low Surrogate */
- [0xdc12, 0xdc12], /* Low Surrogate */
- [0xdc13, 0xdc13], /* Low Surrogate */
- [0xdc14, 0xdc14], /* Low Surrogate */
- [0xdc15, 0xdc15], /* Low Surrogate */
- [0xdc16, 0xdc16], /* Low Surrogate */
- [0xdc17, 0xdc17], /* Low Surrogate */
- [0xdc18, 0xdc18], /* Low Surrogate */
- [0xdc19, 0xdc19], /* Low Surrogate */
- [0xdc1a, 0xdc1a], /* Low Surrogate */
- [0xdc1b, 0xdc1b], /* Low Surrogate */
- [0xdc1c, 0xdc1c], /* Low Surrogate */
- [0xdc1d, 0xdc1d], /* Low Surrogate */
- [0xdc1e, 0xdc1e], /* Low Surrogate */
- [0xdc1f, 0xdc1f], /* Low Surrogate */
- [0xdc20, 0xdc20], /* Low Surrogate */
- [0xdc21, 0xdc21], /* Low Surrogate */
- [0xdc22, 0xdc22], /* Low Surrogate */
- [0xdc23, 0xdc23], /* Low Surrogate */
- [0xdc24, 0xdc24], /* Low Surrogate */
- [0xdc25, 0xdc25], /* Low Surrogate */
- [0xdc26, 0xdc26], /* Low Surrogate */
- [0xdc27, 0xdc27], /* Low Surrogate */
- [0xdc28, 0xdc28], /* Low Surrogate */
- [0xdc29, 0xdc29], /* Low Surrogate */
- [0xdc2a, 0xdc2a], /* Low Surrogate */
- [0xdc2b, 0xdc2b], /* Low Surrogate */
- [0xdc2c, 0xdc2c], /* Low Surrogate */
- [0xdc2d, 0xdc2d], /* Low Surrogate */
- [0xdc2e, 0xdc2e], /* Low Surrogate */
- [0xdc2f, 0xdc2f], /* Low Surrogate */
- [0xdc30, 0xdc30], /* Low Surrogate */
- [0xdc31, 0xdc31], /* Low Surrogate */
- [0xdc32, 0xdc32], /* Low Surrogate */
- [0xdc33, 0xdc33], /* Low Surrogate */
- [0xdc34, 0xdc34], /* Low Surrogate */
- [0xdc35, 0xdc35], /* Low Surrogate */
- [0xdc36, 0xdc36], /* Low Surrogate */
- [0xdc37, 0xdc37], /* Low Surrogate */
- [0xdc38, 0xdc38], /* Low Surrogate */
- [0xdc39, 0xdc39], /* Low Surrogate */
- [0xdc3a, 0xdc3a], /* Low Surrogate */
- [0xdc3b, 0xdc3b], /* Low Surrogate */
- [0xdc3c, 0xdc3c], /* Low Surrogate */
- [0xdc3d, 0xdc3d], /* Low Surrogate */
- [0xdc3e, 0xdc3e], /* Low Surrogate */
- [0xdc3f, 0xdc3f], /* Low Surrogate */
- [0xdc40, 0xdc40], /* Low Surrogate */
- [0xdc41, 0xdc41], /* Low Surrogate */
- [0xdc42, 0xdc42], /* Low Surrogate */
- [0xdc43, 0xdc43], /* Low Surrogate */
- [0xdc44, 0xdc44], /* Low Surrogate */
- [0xdc45, 0xdc45], /* Low Surrogate */
- [0xdc46, 0xdc46], /* Low Surrogate */
- [0xdc47, 0xdc47], /* Low Surrogate */
- [0xdc48, 0xdc48], /* Low Surrogate */
- [0xdc49, 0xdc49], /* Low Surrogate */
- [0xdc4a, 0xdc4a], /* Low Surrogate */
- [0xdc4b, 0xdc4b], /* Low Surrogate */
- [0xdc4c, 0xdc4c], /* Low Surrogate */
- [0xdc4d, 0xdc4d], /* Low Surrogate */
- [0xdc4e, 0xdc4e], /* Low Surrogate */
- [0xdc4f, 0xdc4f], /* Low Surrogate */
- [0xdc50, 0xdc50], /* Low Surrogate */
- [0xdc51, 0xdc51], /* Low Surrogate */
- [0xdc52, 0xdc52], /* Low Surrogate */
- [0xdc53, 0xdc53], /* Low Surrogate */
- [0xdc54, 0xdc54], /* Low Surrogate */
- [0xdc55, 0xdc55], /* Low Surrogate */
- [0xdc56, 0xdc56], /* Low Surrogate */
- [0xdc57, 0xdc57], /* Low Surrogate */
- [0xdc58, 0xdc58], /* Low Surrogate */
- [0xdc59, 0xdc59], /* Low Surrogate */
- [0xdc5a, 0xdc5a], /* Low Surrogate */
- [0xdc5b, 0xdc5b], /* Low Surrogate */
- [0xdc5c, 0xdc5c], /* Low Surrogate */
- [0xdc5d, 0xdc5d], /* Low Surrogate */
- [0xdc5e, 0xdc5e], /* Low Surrogate */
- [0xdc5f, 0xdc5f], /* Low Surrogate */
- [0xdc60, 0xdc60], /* Low Surrogate */
- [0xdc61, 0xdc61], /* Low Surrogate */
- [0xdc62, 0xdc62], /* Low Surrogate */
- [0xdc63, 0xdc63], /* Low Surrogate */
- [0xdc64, 0xdc64], /* Low Surrogate */
- [0xdc65, 0xdc65], /* Low Surrogate */
- [0xdc66, 0xdc66], /* Low Surrogate */
- [0xdc67, 0xdc67], /* Low Surrogate */
- [0xdc68, 0xdc68], /* Low Surrogate */
- [0xdc69, 0xdc69], /* Low Surrogate */
- [0xdc6a, 0xdc6a], /* Low Surrogate */
- [0xdc6b, 0xdc6b], /* Low Surrogate */
- [0xdc6c, 0xdc6c], /* Low Surrogate */
- [0xdc6d, 0xdc6d], /* Low Surrogate */
- [0xdc6e, 0xdc6e], /* Low Surrogate */
- [0xdc6f, 0xdc6f], /* Low Surrogate */
- [0xdc70, 0xdc70], /* Low Surrogate */
- [0xdc71, 0xdc71], /* Low Surrogate */
- [0xdc72, 0xdc72], /* Low Surrogate */
- [0xdc73, 0xdc73], /* Low Surrogate */
- [0xdc74, 0xdc74], /* Low Surrogate */
- [0xdc75, 0xdc75], /* Low Surrogate */
- [0xdc76, 0xdc76], /* Low Surrogate */
- [0xdc77, 0xdc77], /* Low Surrogate */
- [0xdc78, 0xdc78], /* Low Surrogate */
- [0xdc79, 0xdc79], /* Low Surrogate */
- [0xdc7a, 0xdc7a], /* Low Surrogate */
- [0xdc7b, 0xdc7b], /* Low Surrogate */
- [0xdc7c, 0xdc7c], /* Low Surrogate */
- [0xdc7d, 0xdc7d], /* Low Surrogate */
- [0xdc7e, 0xdc7e], /* Low Surrogate */
- [0xdc7f, 0xdc7f], /* Low Surrogate */
- [0xdc80, 0xdc80], /* Low Surrogate */
- [0xdc81, 0xdc81], /* Low Surrogate */
- [0xdc82, 0xdc82], /* Low Surrogate */
- [0xdc83, 0xdc83], /* Low Surrogate */
- [0xdc84, 0xdc84], /* Low Surrogate */
- [0xdc85, 0xdc85], /* Low Surrogate */
- [0xdc86, 0xdc86], /* Low Surrogate */
- [0xdc87, 0xdc87], /* Low Surrogate */
- [0xdc88, 0xdc88], /* Low Surrogate */
- [0xdc89, 0xdc89], /* Low Surrogate */
- [0xdc8a, 0xdc8a], /* Low Surrogate */
- [0xdc8b, 0xdc8b], /* Low Surrogate */
- [0xdc8c, 0xdc8c], /* Low Surrogate */
- [0xdc8d, 0xdc8d], /* Low Surrogate */
- [0xdc8e, 0xdc8e], /* Low Surrogate */
- [0xdc8f, 0xdc8f], /* Low Surrogate */
- [0xdc90, 0xdc90], /* Low Surrogate */
- [0xdc91, 0xdc91], /* Low Surrogate */
- [0xdc92, 0xdc92], /* Low Surrogate */
- [0xdc93, 0xdc93], /* Low Surrogate */
- [0xdc94, 0xdc94], /* Low Surrogate */
- [0xdc95, 0xdc95], /* Low Surrogate */
- [0xdc96, 0xdc96], /* Low Surrogate */
- [0xdc97, 0xdc97], /* Low Surrogate */
- [0xdc98, 0xdc98], /* Low Surrogate */
- [0xdc99, 0xdc99], /* Low Surrogate */
- [0xdc9a, 0xdc9a], /* Low Surrogate */
- [0xdc9b, 0xdc9b], /* Low Surrogate */
- [0xdc9c, 0xdc9c], /* Low Surrogate */
- [0xdc9d, 0xdc9d], /* Low Surrogate */
- [0xdc9e, 0xdc9e], /* Low Surrogate */
- [0xdc9f, 0xdc9f], /* Low Surrogate */
- [0xdca0, 0xdca0], /* Low Surrogate */
- [0xdca1, 0xdca1], /* Low Surrogate */
- [0xdca2, 0xdca2], /* Low Surrogate */
- [0xdca3, 0xdca3], /* Low Surrogate */
- [0xdca4, 0xdca4], /* Low Surrogate */
- [0xdca5, 0xdca5], /* Low Surrogate */
- [0xdca6, 0xdca6], /* Low Surrogate */
- [0xdca7, 0xdca7], /* Low Surrogate */
- [0xdca8, 0xdca8], /* Low Surrogate */
- [0xdca9, 0xdca9], /* Low Surrogate */
- [0xdcaa, 0xdcaa], /* Low Surrogate */
- [0xdcab, 0xdcab], /* Low Surrogate */
- [0xdcac, 0xdcac], /* Low Surrogate */
- [0xdcad, 0xdcad], /* Low Surrogate */
- [0xdcae, 0xdcae], /* Low Surrogate */
- [0xdcaf, 0xdcaf], /* Low Surrogate */
- [0xdcb0, 0xdcb0], /* Low Surrogate */
- [0xdcb1, 0xdcb1], /* Low Surrogate */
- [0xdcb2, 0xdcb2], /* Low Surrogate */
- [0xdcb3, 0xdcb3], /* Low Surrogate */
- [0xdcb4, 0xdcb4], /* Low Surrogate */
- [0xdcb5, 0xdcb5], /* Low Surrogate */
- [0xdcb6, 0xdcb6], /* Low Surrogate */
- [0xdcb7, 0xdcb7], /* Low Surrogate */
- [0xdcb8, 0xdcb8], /* Low Surrogate */
- [0xdcb9, 0xdcb9], /* Low Surrogate */
- [0xdcba, 0xdcba], /* Low Surrogate */
- [0xdcbb, 0xdcbb], /* Low Surrogate */
- [0xdcbc, 0xdcbc], /* Low Surrogate */
- [0xdcbd, 0xdcbd], /* Low Surrogate */
- [0xdcbe, 0xdcbe], /* Low Surrogate */
- [0xdcbf, 0xdcbf], /* Low Surrogate */
- [0xdcc0, 0xdcc0], /* Low Surrogate */
- [0xdcc1, 0xdcc1], /* Low Surrogate */
- [0xdcc2, 0xdcc2], /* Low Surrogate */
- [0xdcc3, 0xdcc3], /* Low Surrogate */
- [0xdcc4, 0xdcc4], /* Low Surrogate */
- [0xdcc5, 0xdcc5], /* Low Surrogate */
- [0xdcc6, 0xdcc6], /* Low Surrogate */
- [0xdcc7, 0xdcc7], /* Low Surrogate */
- [0xdcc8, 0xdcc8], /* Low Surrogate */
- [0xdcc9, 0xdcc9], /* Low Surrogate */
- [0xdcca, 0xdcca], /* Low Surrogate */
- [0xdccb, 0xdccb], /* Low Surrogate */
- [0xdccc, 0xdccc], /* Low Surrogate */
- [0xdccd, 0xdccd], /* Low Surrogate */
- [0xdcce, 0xdcce], /* Low Surrogate */
- [0xdccf, 0xdccf], /* Low Surrogate */
- [0xdcd0, 0xdcd0], /* Low Surrogate */
- [0xdcd1, 0xdcd1], /* Low Surrogate */
- [0xdcd2, 0xdcd2], /* Low Surrogate */
- [0xdcd3, 0xdcd3], /* Low Surrogate */
- [0xdcd4, 0xdcd4], /* Low Surrogate */
- [0xdcd5, 0xdcd5], /* Low Surrogate */
- [0xdcd6, 0xdcd6], /* Low Surrogate */
- [0xdcd7, 0xdcd7], /* Low Surrogate */
- [0xdcd8, 0xdcd8], /* Low Surrogate */
- [0xdcd9, 0xdcd9], /* Low Surrogate */
- [0xdcda, 0xdcda], /* Low Surrogate */
- [0xdcdb, 0xdcdb], /* Low Surrogate */
- [0xdcdc, 0xdcdc], /* Low Surrogate */
- [0xdcdd, 0xdcdd], /* Low Surrogate */
- [0xdcde, 0xdcde], /* Low Surrogate */
- [0xdcdf, 0xdcdf], /* Low Surrogate */
- [0xdce0, 0xdce0], /* Low Surrogate */
- [0xdce1, 0xdce1], /* Low Surrogate */
- [0xdce2, 0xdce2], /* Low Surrogate */
- [0xdce3, 0xdce3], /* Low Surrogate */
- [0xdce4, 0xdce4], /* Low Surrogate */
- [0xdce5, 0xdce5], /* Low Surrogate */
- [0xdce6, 0xdce6], /* Low Surrogate */
- [0xdce7, 0xdce7], /* Low Surrogate */
- [0xdce8, 0xdce8], /* Low Surrogate */
- [0xdce9, 0xdce9], /* Low Surrogate */
- [0xdcea, 0xdcea], /* Low Surrogate */
- [0xdceb, 0xdceb], /* Low Surrogate */
- [0xdcec, 0xdcec], /* Low Surrogate */
- [0xdced, 0xdced], /* Low Surrogate */
- [0xdcee, 0xdcee], /* Low Surrogate */
- [0xdcef, 0xdcef], /* Low Surrogate */
- [0xdcf0, 0xdcf0], /* Low Surrogate */
- [0xdcf1, 0xdcf1], /* Low Surrogate */
- [0xdcf2, 0xdcf2], /* Low Surrogate */
- [0xdcf3, 0xdcf3], /* Low Surrogate */
- [0xdcf4, 0xdcf4], /* Low Surrogate */
- [0xdcf5, 0xdcf5], /* Low Surrogate */
- [0xdcf6, 0xdcf6], /* Low Surrogate */
- [0xdcf7, 0xdcf7], /* Low Surrogate */
- [0xdcf8, 0xdcf8], /* Low Surrogate */
- [0xdcf9, 0xdcf9], /* Low Surrogate */
- [0xdcfa, 0xdcfa], /* Low Surrogate */
- [0xdcfb, 0xdcfb], /* Low Surrogate */
- [0xdcfc, 0xdcfc], /* Low Surrogate */
- [0xdcfd, 0xdcfd], /* Low Surrogate */
- [0xdcfe, 0xdcfe], /* Low Surrogate */
- [0xdcff, 0xdcff], /* Low Surrogate */
- [0xdd00, 0xdd00], /* Low Surrogate */
- [0xdd01, 0xdd01], /* Low Surrogate */
- [0xdd02, 0xdd02], /* Low Surrogate */
- [0xdd03, 0xdd03], /* Low Surrogate */
- [0xdd04, 0xdd04], /* Low Surrogate */
- [0xdd05, 0xdd05], /* Low Surrogate */
- [0xdd06, 0xdd06], /* Low Surrogate */
- [0xdd07, 0xdd07], /* Low Surrogate */
- [0xdd08, 0xdd08], /* Low Surrogate */
- [0xdd09, 0xdd09], /* Low Surrogate */
- [0xdd0a, 0xdd0a], /* Low Surrogate */
- [0xdd0b, 0xdd0b], /* Low Surrogate */
- [0xdd0c, 0xdd0c], /* Low Surrogate */
- [0xdd0d, 0xdd0d], /* Low Surrogate */
- [0xdd0e, 0xdd0e], /* Low Surrogate */
- [0xdd0f, 0xdd0f], /* Low Surrogate */
- [0xdd10, 0xdd10], /* Low Surrogate */
- [0xdd11, 0xdd11], /* Low Surrogate */
- [0xdd12, 0xdd12], /* Low Surrogate */
- [0xdd13, 0xdd13], /* Low Surrogate */
- [0xdd14, 0xdd14], /* Low Surrogate */
- [0xdd15, 0xdd15], /* Low Surrogate */
- [0xdd16, 0xdd16], /* Low Surrogate */
- [0xdd17, 0xdd17], /* Low Surrogate */
- [0xdd18, 0xdd18], /* Low Surrogate */
- [0xdd19, 0xdd19], /* Low Surrogate */
- [0xdd1a, 0xdd1a], /* Low Surrogate */
- [0xdd1b, 0xdd1b], /* Low Surrogate */
- [0xdd1c, 0xdd1c], /* Low Surrogate */
- [0xdd1d, 0xdd1d], /* Low Surrogate */
- [0xdd1e, 0xdd1e], /* Low Surrogate */
- [0xdd1f, 0xdd1f], /* Low Surrogate */
- [0xdd20, 0xdd20], /* Low Surrogate */
- [0xdd21, 0xdd21], /* Low Surrogate */
- [0xdd22, 0xdd22], /* Low Surrogate */
- [0xdd23, 0xdd23], /* Low Surrogate */
- [0xdd24, 0xdd24], /* Low Surrogate */
- [0xdd25, 0xdd25], /* Low Surrogate */
- [0xdd26, 0xdd26], /* Low Surrogate */
- [0xdd27, 0xdd27], /* Low Surrogate */
- [0xdd28, 0xdd28], /* Low Surrogate */
- [0xdd29, 0xdd29], /* Low Surrogate */
- [0xdd2a, 0xdd2a], /* Low Surrogate */
- [0xdd2b, 0xdd2b], /* Low Surrogate */
- [0xdd2c, 0xdd2c], /* Low Surrogate */
- [0xdd2d, 0xdd2d], /* Low Surrogate */
- [0xdd2e, 0xdd2e], /* Low Surrogate */
- [0xdd2f, 0xdd2f], /* Low Surrogate */
- [0xdd30, 0xdd30], /* Low Surrogate */
- [0xdd31, 0xdd31], /* Low Surrogate */
- [0xdd32, 0xdd32], /* Low Surrogate */
- [0xdd33, 0xdd33], /* Low Surrogate */
- [0xdd34, 0xdd34], /* Low Surrogate */
- [0xdd35, 0xdd35], /* Low Surrogate */
- [0xdd36, 0xdd36], /* Low Surrogate */
- [0xdd37, 0xdd37], /* Low Surrogate */
- [0xdd38, 0xdd38], /* Low Surrogate */
- [0xdd39, 0xdd39], /* Low Surrogate */
- [0xdd3a, 0xdd3a], /* Low Surrogate */
- [0xdd3b, 0xdd3b], /* Low Surrogate */
- [0xdd3c, 0xdd3c], /* Low Surrogate */
- [0xdd3d, 0xdd3d], /* Low Surrogate */
- [0xdd3e, 0xdd3e], /* Low Surrogate */
- [0xdd3f, 0xdd3f], /* Low Surrogate */
- [0xdd40, 0xdd40], /* Low Surrogate */
- [0xdd41, 0xdd41], /* Low Surrogate */
- [0xdd42, 0xdd42], /* Low Surrogate */
- [0xdd43, 0xdd43], /* Low Surrogate */
- [0xdd44, 0xdd44], /* Low Surrogate */
- [0xdd45, 0xdd45], /* Low Surrogate */
- [0xdd46, 0xdd46], /* Low Surrogate */
- [0xdd47, 0xdd47], /* Low Surrogate */
- [0xdd48, 0xdd48], /* Low Surrogate */
- [0xdd49, 0xdd49], /* Low Surrogate */
- [0xdd4a, 0xdd4a], /* Low Surrogate */
- [0xdd4b, 0xdd4b], /* Low Surrogate */
- [0xdd4c, 0xdd4c], /* Low Surrogate */
- [0xdd4d, 0xdd4d], /* Low Surrogate */
- [0xdd4e, 0xdd4e], /* Low Surrogate */
- [0xdd4f, 0xdd4f], /* Low Surrogate */
- [0xdd50, 0xdd50], /* Low Surrogate */
- [0xdd51, 0xdd51], /* Low Surrogate */
- [0xdd52, 0xdd52], /* Low Surrogate */
- [0xdd53, 0xdd53], /* Low Surrogate */
- [0xdd54, 0xdd54], /* Low Surrogate */
- [0xdd55, 0xdd55], /* Low Surrogate */
- [0xdd56, 0xdd56], /* Low Surrogate */
- [0xdd57, 0xdd57], /* Low Surrogate */
- [0xdd58, 0xdd58], /* Low Surrogate */
- [0xdd59, 0xdd59], /* Low Surrogate */
- [0xdd5a, 0xdd5a], /* Low Surrogate */
- [0xdd5b, 0xdd5b], /* Low Surrogate */
- [0xdd5c, 0xdd5c], /* Low Surrogate */
- [0xdd5d, 0xdd5d], /* Low Surrogate */
- [0xdd5e, 0xdd5e], /* Low Surrogate */
- [0xdd5f, 0xdd5f], /* Low Surrogate */
- [0xdd60, 0xdd60], /* Low Surrogate */
- [0xdd61, 0xdd61], /* Low Surrogate */
- [0xdd62, 0xdd62], /* Low Surrogate */
- [0xdd63, 0xdd63], /* Low Surrogate */
- [0xdd64, 0xdd64], /* Low Surrogate */
- [0xdd65, 0xdd65], /* Low Surrogate */
- [0xdd66, 0xdd66], /* Low Surrogate */
- [0xdd67, 0xdd67], /* Low Surrogate */
- [0xdd68, 0xdd68], /* Low Surrogate */
- [0xdd69, 0xdd69], /* Low Surrogate */
- [0xdd6a, 0xdd6a], /* Low Surrogate */
- [0xdd6b, 0xdd6b], /* Low Surrogate */
- [0xdd6c, 0xdd6c], /* Low Surrogate */
- [0xdd6d, 0xdd6d], /* Low Surrogate */
- [0xdd6e, 0xdd6e], /* Low Surrogate */
- [0xdd6f, 0xdd6f], /* Low Surrogate */
- [0xdd70, 0xdd70], /* Low Surrogate */
- [0xdd71, 0xdd71], /* Low Surrogate */
- [0xdd72, 0xdd72], /* Low Surrogate */
- [0xdd73, 0xdd73], /* Low Surrogate */
- [0xdd74, 0xdd74], /* Low Surrogate */
- [0xdd75, 0xdd75], /* Low Surrogate */
- [0xdd76, 0xdd76], /* Low Surrogate */
- [0xdd77, 0xdd77], /* Low Surrogate */
- [0xdd78, 0xdd78], /* Low Surrogate */
- [0xdd79, 0xdd79], /* Low Surrogate */
- [0xdd7a, 0xdd7a], /* Low Surrogate */
- [0xdd7b, 0xdd7b], /* Low Surrogate */
- [0xdd7c, 0xdd7c], /* Low Surrogate */
- [0xdd7d, 0xdd7d], /* Low Surrogate */
- [0xdd7e, 0xdd7e], /* Low Surrogate */
- [0xdd7f, 0xdd7f], /* Low Surrogate */
- [0xdd80, 0xdd80], /* Low Surrogate */
- [0xdd81, 0xdd81], /* Low Surrogate */
- [0xdd82, 0xdd82], /* Low Surrogate */
- [0xdd83, 0xdd83], /* Low Surrogate */
- [0xdd84, 0xdd84], /* Low Surrogate */
- [0xdd85, 0xdd85], /* Low Surrogate */
- [0xdd86, 0xdd86], /* Low Surrogate */
- [0xdd87, 0xdd87], /* Low Surrogate */
- [0xdd88, 0xdd88], /* Low Surrogate */
- [0xdd89, 0xdd89], /* Low Surrogate */
- [0xdd8a, 0xdd8a], /* Low Surrogate */
- [0xdd8b, 0xdd8b], /* Low Surrogate */
- [0xdd8c, 0xdd8c], /* Low Surrogate */
- [0xdd8d, 0xdd8d], /* Low Surrogate */
- [0xdd8e, 0xdd8e], /* Low Surrogate */
- [0xdd8f, 0xdd8f], /* Low Surrogate */
- [0xdd90, 0xdd90], /* Low Surrogate */
- [0xdd91, 0xdd91], /* Low Surrogate */
- [0xdd92, 0xdd92], /* Low Surrogate */
- [0xdd93, 0xdd93], /* Low Surrogate */
- [0xdd94, 0xdd94], /* Low Surrogate */
- [0xdd95, 0xdd95], /* Low Surrogate */
- [0xdd96, 0xdd96], /* Low Surrogate */
- [0xdd97, 0xdd97], /* Low Surrogate */
- [0xdd98, 0xdd98], /* Low Surrogate */
- [0xdd99, 0xdd99], /* Low Surrogate */
- [0xdd9a, 0xdd9a], /* Low Surrogate */
- [0xdd9b, 0xdd9b], /* Low Surrogate */
- [0xdd9c, 0xdd9c], /* Low Surrogate */
- [0xdd9d, 0xdd9d], /* Low Surrogate */
- [0xdd9e, 0xdd9e], /* Low Surrogate */
- [0xdd9f, 0xdd9f], /* Low Surrogate */
- [0xdda0, 0xdda0], /* Low Surrogate */
- [0xdda1, 0xdda1], /* Low Surrogate */
- [0xdda2, 0xdda2], /* Low Surrogate */
- [0xdda3, 0xdda3], /* Low Surrogate */
- [0xdda4, 0xdda4], /* Low Surrogate */
- [0xdda5, 0xdda5], /* Low Surrogate */
- [0xdda6, 0xdda6], /* Low Surrogate */
- [0xdda7, 0xdda7], /* Low Surrogate */
- [0xdda8, 0xdda8], /* Low Surrogate */
- [0xdda9, 0xdda9], /* Low Surrogate */
- [0xddaa, 0xddaa], /* Low Surrogate */
- [0xddab, 0xddab], /* Low Surrogate */
- [0xddac, 0xddac], /* Low Surrogate */
- [0xddad, 0xddad], /* Low Surrogate */
- [0xddae, 0xddae], /* Low Surrogate */
- [0xddaf, 0xddaf], /* Low Surrogate */
- [0xddb0, 0xddb0], /* Low Surrogate */
- [0xddb1, 0xddb1], /* Low Surrogate */
- [0xddb2, 0xddb2], /* Low Surrogate */
- [0xddb3, 0xddb3], /* Low Surrogate */
- [0xddb4, 0xddb4], /* Low Surrogate */
- [0xddb5, 0xddb5], /* Low Surrogate */
- [0xddb6, 0xddb6], /* Low Surrogate */
- [0xddb7, 0xddb7], /* Low Surrogate */
- [0xddb8, 0xddb8], /* Low Surrogate */
- [0xddb9, 0xddb9], /* Low Surrogate */
- [0xddba, 0xddba], /* Low Surrogate */
- [0xddbb, 0xddbb], /* Low Surrogate */
- [0xddbc, 0xddbc], /* Low Surrogate */
- [0xddbd, 0xddbd], /* Low Surrogate */
- [0xddbe, 0xddbe], /* Low Surrogate */
- [0xddbf, 0xddbf], /* Low Surrogate */
- [0xddc0, 0xddc0], /* Low Surrogate */
- [0xddc1, 0xddc1], /* Low Surrogate */
- [0xddc2, 0xddc2], /* Low Surrogate */
- [0xddc3, 0xddc3], /* Low Surrogate */
- [0xddc4, 0xddc4], /* Low Surrogate */
- [0xddc5, 0xddc5], /* Low Surrogate */
- [0xddc6, 0xddc6], /* Low Surrogate */
- [0xddc7, 0xddc7], /* Low Surrogate */
- [0xddc8, 0xddc8], /* Low Surrogate */
- [0xddc9, 0xddc9], /* Low Surrogate */
- [0xddca, 0xddca], /* Low Surrogate */
- [0xddcb, 0xddcb], /* Low Surrogate */
- [0xddcc, 0xddcc], /* Low Surrogate */
- [0xddcd, 0xddcd], /* Low Surrogate */
- [0xddce, 0xddce], /* Low Surrogate */
- [0xddcf, 0xddcf], /* Low Surrogate */
- [0xddd0, 0xddd0], /* Low Surrogate */
- [0xddd1, 0xddd1], /* Low Surrogate */
- [0xddd2, 0xddd2], /* Low Surrogate */
- [0xddd3, 0xddd3], /* Low Surrogate */
- [0xddd4, 0xddd4], /* Low Surrogate */
- [0xddd5, 0xddd5], /* Low Surrogate */
- [0xddd6, 0xddd6], /* Low Surrogate */
- [0xddd7, 0xddd7], /* Low Surrogate */
- [0xddd8, 0xddd8], /* Low Surrogate */
- [0xddd9, 0xddd9], /* Low Surrogate */
- [0xddda, 0xddda], /* Low Surrogate */
- [0xdddb, 0xdddb], /* Low Surrogate */
- [0xdddc, 0xdddc], /* Low Surrogate */
- [0xdddd, 0xdddd], /* Low Surrogate */
- [0xddde, 0xddde], /* Low Surrogate */
- [0xdddf, 0xdddf], /* Low Surrogate */
- [0xdde0, 0xdde0], /* Low Surrogate */
- [0xdde1, 0xdde1], /* Low Surrogate */
- [0xdde2, 0xdde2], /* Low Surrogate */
- [0xdde3, 0xdde3], /* Low Surrogate */
- [0xdde4, 0xdde4], /* Low Surrogate */
- [0xdde5, 0xdde5], /* Low Surrogate */
- [0xdde6, 0xdde6], /* Low Surrogate */
- [0xdde7, 0xdde7], /* Low Surrogate */
- [0xdde8, 0xdde8], /* Low Surrogate */
- [0xdde9, 0xdde9], /* Low Surrogate */
- [0xddea, 0xddea], /* Low Surrogate */
- [0xddeb, 0xddeb], /* Low Surrogate */
- [0xddec, 0xddec], /* Low Surrogate */
- [0xdded, 0xdded], /* Low Surrogate */
- [0xddee, 0xddee], /* Low Surrogate */
- [0xddef, 0xddef], /* Low Surrogate */
- [0xddf0, 0xddf0], /* Low Surrogate */
- [0xddf1, 0xddf1], /* Low Surrogate */
- [0xddf2, 0xddf2], /* Low Surrogate */
- [0xddf3, 0xddf3], /* Low Surrogate */
- [0xddf4, 0xddf4], /* Low Surrogate */
- [0xddf5, 0xddf5], /* Low Surrogate */
- [0xddf6, 0xddf6], /* Low Surrogate */
- [0xddf7, 0xddf7], /* Low Surrogate */
- [0xddf8, 0xddf8], /* Low Surrogate */
- [0xddf9, 0xddf9], /* Low Surrogate */
- [0xddfa, 0xddfa], /* Low Surrogate */
- [0xddfb, 0xddfb], /* Low Surrogate */
- [0xddfc, 0xddfc], /* Low Surrogate */
- [0xddfd, 0xddfd], /* Low Surrogate */
- [0xddfe, 0xddfe], /* Low Surrogate */
- [0xddff, 0xddff], /* Low Surrogate */
- [0xde00, 0xde00], /* Low Surrogate */
- [0xde01, 0xde01], /* Low Surrogate */
- [0xde02, 0xde02], /* Low Surrogate */
- [0xde03, 0xde03], /* Low Surrogate */
- [0xde04, 0xde04], /* Low Surrogate */
- [0xde05, 0xde05], /* Low Surrogate */
- [0xde06, 0xde06], /* Low Surrogate */
- [0xde07, 0xde07], /* Low Surrogate */
- [0xde08, 0xde08], /* Low Surrogate */
- [0xde09, 0xde09], /* Low Surrogate */
- [0xde0a, 0xde0a], /* Low Surrogate */
- [0xde0b, 0xde0b], /* Low Surrogate */
- [0xde0c, 0xde0c], /* Low Surrogate */
- [0xde0d, 0xde0d], /* Low Surrogate */
- [0xde0e, 0xde0e], /* Low Surrogate */
- [0xde0f, 0xde0f], /* Low Surrogate */
- [0xde10, 0xde10], /* Low Surrogate */
- [0xde11, 0xde11], /* Low Surrogate */
- [0xde12, 0xde12], /* Low Surrogate */
- [0xde13, 0xde13], /* Low Surrogate */
- [0xde14, 0xde14], /* Low Surrogate */
- [0xde15, 0xde15], /* Low Surrogate */
- [0xde16, 0xde16], /* Low Surrogate */
- [0xde17, 0xde17], /* Low Surrogate */
- [0xde18, 0xde18], /* Low Surrogate */
- [0xde19, 0xde19], /* Low Surrogate */
- [0xde1a, 0xde1a], /* Low Surrogate */
- [0xde1b, 0xde1b], /* Low Surrogate */
- [0xde1c, 0xde1c], /* Low Surrogate */
- [0xde1d, 0xde1d], /* Low Surrogate */
- [0xde1e, 0xde1e], /* Low Surrogate */
- [0xde1f, 0xde1f], /* Low Surrogate */
- [0xde20, 0xde20], /* Low Surrogate */
- [0xde21, 0xde21], /* Low Surrogate */
- [0xde22, 0xde22], /* Low Surrogate */
- [0xde23, 0xde23], /* Low Surrogate */
- [0xde24, 0xde24], /* Low Surrogate */
- [0xde25, 0xde25], /* Low Surrogate */
- [0xde26, 0xde26], /* Low Surrogate */
- [0xde27, 0xde27], /* Low Surrogate */
- [0xde28, 0xde28], /* Low Surrogate */
- [0xde29, 0xde29], /* Low Surrogate */
- [0xde2a, 0xde2a], /* Low Surrogate */
- [0xde2b, 0xde2b], /* Low Surrogate */
- [0xde2c, 0xde2c], /* Low Surrogate */
- [0xde2d, 0xde2d], /* Low Surrogate */
- [0xde2e, 0xde2e], /* Low Surrogate */
- [0xde2f, 0xde2f], /* Low Surrogate */
- [0xde30, 0xde30], /* Low Surrogate */
- [0xde31, 0xde31], /* Low Surrogate */
- [0xde32, 0xde32], /* Low Surrogate */
- [0xde33, 0xde33], /* Low Surrogate */
- [0xde34, 0xde34], /* Low Surrogate */
- [0xde35, 0xde35], /* Low Surrogate */
- [0xde36, 0xde36], /* Low Surrogate */
- [0xde37, 0xde37], /* Low Surrogate */
- [0xde38, 0xde38], /* Low Surrogate */
- [0xde39, 0xde39], /* Low Surrogate */
- [0xde3a, 0xde3a], /* Low Surrogate */
- [0xde3b, 0xde3b], /* Low Surrogate */
- [0xde3c, 0xde3c], /* Low Surrogate */
- [0xde3d, 0xde3d], /* Low Surrogate */
- [0xde3e, 0xde3e], /* Low Surrogate */
- [0xde3f, 0xde3f], /* Low Surrogate */
- [0xde40, 0xde40], /* Low Surrogate */
- [0xde41, 0xde41], /* Low Surrogate */
- [0xde42, 0xde42], /* Low Surrogate */
- [0xde43, 0xde43], /* Low Surrogate */
- [0xde44, 0xde44], /* Low Surrogate */
- [0xde45, 0xde45], /* Low Surrogate */
- [0xde46, 0xde46], /* Low Surrogate */
- [0xde47, 0xde47], /* Low Surrogate */
- [0xde48, 0xde48], /* Low Surrogate */
- [0xde49, 0xde49], /* Low Surrogate */
- [0xde4a, 0xde4a], /* Low Surrogate */
- [0xde4b, 0xde4b], /* Low Surrogate */
- [0xde4c, 0xde4c], /* Low Surrogate */
- [0xde4d, 0xde4d], /* Low Surrogate */
- [0xde4e, 0xde4e], /* Low Surrogate */
- [0xde4f, 0xde4f], /* Low Surrogate */
- [0xde50, 0xde50], /* Low Surrogate */
- [0xde51, 0xde51], /* Low Surrogate */
- [0xde52, 0xde52], /* Low Surrogate */
- [0xde53, 0xde53], /* Low Surrogate */
- [0xde54, 0xde54], /* Low Surrogate */
- [0xde55, 0xde55], /* Low Surrogate */
- [0xde56, 0xde56], /* Low Surrogate */
- [0xde57, 0xde57], /* Low Surrogate */
- [0xde58, 0xde58], /* Low Surrogate */
- [0xde59, 0xde59], /* Low Surrogate */
- [0xde5a, 0xde5a], /* Low Surrogate */
- [0xde5b, 0xde5b], /* Low Surrogate */
- [0xde5c, 0xde5c], /* Low Surrogate */
- [0xde5d, 0xde5d], /* Low Surrogate */
- [0xde5e, 0xde5e], /* Low Surrogate */
- [0xde5f, 0xde5f], /* Low Surrogate */
- [0xde60, 0xde60], /* Low Surrogate */
- [0xde61, 0xde61], /* Low Surrogate */
- [0xde62, 0xde62], /* Low Surrogate */
- [0xde63, 0xde63], /* Low Surrogate */
- [0xde64, 0xde64], /* Low Surrogate */
- [0xde65, 0xde65], /* Low Surrogate */
- [0xde66, 0xde66], /* Low Surrogate */
- [0xde67, 0xde67], /* Low Surrogate */
- [0xde68, 0xde68], /* Low Surrogate */
- [0xde69, 0xde69], /* Low Surrogate */
- [0xde6a, 0xde6a], /* Low Surrogate */
- [0xde6b, 0xde6b], /* Low Surrogate */
- [0xde6c, 0xde6c], /* Low Surrogate */
- [0xde6d, 0xde6d], /* Low Surrogate */
- [0xde6e, 0xde6e], /* Low Surrogate */
- [0xde6f, 0xde6f], /* Low Surrogate */
- [0xde70, 0xde70], /* Low Surrogate */
- [0xde71, 0xde71], /* Low Surrogate */
- [0xde72, 0xde72], /* Low Surrogate */
- [0xde73, 0xde73], /* Low Surrogate */
- [0xde74, 0xde74], /* Low Surrogate */
- [0xde75, 0xde75], /* Low Surrogate */
- [0xde76, 0xde76], /* Low Surrogate */
- [0xde77, 0xde77], /* Low Surrogate */
- [0xde78, 0xde78], /* Low Surrogate */
- [0xde79, 0xde79], /* Low Surrogate */
- [0xde7a, 0xde7a], /* Low Surrogate */
- [0xde7b, 0xde7b], /* Low Surrogate */
- [0xde7c, 0xde7c], /* Low Surrogate */
- [0xde7d, 0xde7d], /* Low Surrogate */
- [0xde7e, 0xde7e], /* Low Surrogate */
- [0xde7f, 0xde7f], /* Low Surrogate */
- [0xde80, 0xde80], /* Low Surrogate */
- [0xde81, 0xde81], /* Low Surrogate */
- [0xde82, 0xde82], /* Low Surrogate */
- [0xde83, 0xde83], /* Low Surrogate */
- [0xde84, 0xde84], /* Low Surrogate */
- [0xde85, 0xde85], /* Low Surrogate */
- [0xde86, 0xde86], /* Low Surrogate */
- [0xde87, 0xde87], /* Low Surrogate */
- [0xde88, 0xde88], /* Low Surrogate */
- [0xde89, 0xde89], /* Low Surrogate */
- [0xde8a, 0xde8a], /* Low Surrogate */
- [0xde8b, 0xde8b], /* Low Surrogate */
- [0xde8c, 0xde8c], /* Low Surrogate */
- [0xde8d, 0xde8d], /* Low Surrogate */
- [0xde8e, 0xde8e], /* Low Surrogate */
- [0xde8f, 0xde8f], /* Low Surrogate */
- [0xde90, 0xde90], /* Low Surrogate */
- [0xde91, 0xde91], /* Low Surrogate */
- [0xde92, 0xde92], /* Low Surrogate */
- [0xde93, 0xde93], /* Low Surrogate */
- [0xde94, 0xde94], /* Low Surrogate */
- [0xde95, 0xde95], /* Low Surrogate */
- [0xde96, 0xde96], /* Low Surrogate */
- [0xde97, 0xde97], /* Low Surrogate */
- [0xde98, 0xde98], /* Low Surrogate */
- [0xde99, 0xde99], /* Low Surrogate */
- [0xde9a, 0xde9a], /* Low Surrogate */
- [0xde9b, 0xde9b], /* Low Surrogate */
- [0xde9c, 0xde9c], /* Low Surrogate */
- [0xde9d, 0xde9d], /* Low Surrogate */
- [0xde9e, 0xde9e], /* Low Surrogate */
- [0xde9f, 0xde9f], /* Low Surrogate */
- [0xdea0, 0xdea0], /* Low Surrogate */
- [0xdea1, 0xdea1], /* Low Surrogate */
- [0xdea2, 0xdea2], /* Low Surrogate */
- [0xdea3, 0xdea3], /* Low Surrogate */
- [0xdea4, 0xdea4], /* Low Surrogate */
- [0xdea5, 0xdea5], /* Low Surrogate */
- [0xdea6, 0xdea6], /* Low Surrogate */
- [0xdea7, 0xdea7], /* Low Surrogate */
- [0xdea8, 0xdea8], /* Low Surrogate */
- [0xdea9, 0xdea9], /* Low Surrogate */
- [0xdeaa, 0xdeaa], /* Low Surrogate */
- [0xdeab, 0xdeab], /* Low Surrogate */
- [0xdeac, 0xdeac], /* Low Surrogate */
- [0xdead, 0xdead], /* Low Surrogate */
- [0xdeae, 0xdeae], /* Low Surrogate */
- [0xdeaf, 0xdeaf], /* Low Surrogate */
- [0xdeb0, 0xdeb0], /* Low Surrogate */
- [0xdeb1, 0xdeb1], /* Low Surrogate */
- [0xdeb2, 0xdeb2], /* Low Surrogate */
- [0xdeb3, 0xdeb3], /* Low Surrogate */
- [0xdeb4, 0xdeb4], /* Low Surrogate */
- [0xdeb5, 0xdeb5], /* Low Surrogate */
- [0xdeb6, 0xdeb6], /* Low Surrogate */
- [0xdeb7, 0xdeb7], /* Low Surrogate */
- [0xdeb8, 0xdeb8], /* Low Surrogate */
- [0xdeb9, 0xdeb9], /* Low Surrogate */
- [0xdeba, 0xdeba], /* Low Surrogate */
- [0xdebb, 0xdebb], /* Low Surrogate */
- [0xdebc, 0xdebc], /* Low Surrogate */
- [0xdebd, 0xdebd], /* Low Surrogate */
- [0xdebe, 0xdebe], /* Low Surrogate */
- [0xdebf, 0xdebf], /* Low Surrogate */
- [0xdec0, 0xdec0], /* Low Surrogate */
- [0xdec1, 0xdec1], /* Low Surrogate */
- [0xdec2, 0xdec2], /* Low Surrogate */
- [0xdec3, 0xdec3], /* Low Surrogate */
- [0xdec4, 0xdec4], /* Low Surrogate */
- [0xdec5, 0xdec5], /* Low Surrogate */
- [0xdec6, 0xdec6], /* Low Surrogate */
- [0xdec7, 0xdec7], /* Low Surrogate */
- [0xdec8, 0xdec8], /* Low Surrogate */
- [0xdec9, 0xdec9], /* Low Surrogate */
- [0xdeca, 0xdeca], /* Low Surrogate */
- [0xdecb, 0xdecb], /* Low Surrogate */
- [0xdecc, 0xdecc], /* Low Surrogate */
- [0xdecd, 0xdecd], /* Low Surrogate */
- [0xdece, 0xdece], /* Low Surrogate */
- [0xdecf, 0xdecf], /* Low Surrogate */
- [0xded0, 0xded0], /* Low Surrogate */
- [0xded1, 0xded1], /* Low Surrogate */
- [0xded2, 0xded2], /* Low Surrogate */
- [0xded3, 0xded3], /* Low Surrogate */
- [0xded4, 0xded4], /* Low Surrogate */
- [0xded5, 0xded5], /* Low Surrogate */
- [0xded6, 0xded6], /* Low Surrogate */
- [0xded7, 0xded7], /* Low Surrogate */
- [0xded8, 0xded8], /* Low Surrogate */
- [0xded9, 0xded9], /* Low Surrogate */
- [0xdeda, 0xdeda], /* Low Surrogate */
- [0xdedb, 0xdedb], /* Low Surrogate */
- [0xdedc, 0xdedc], /* Low Surrogate */
- [0xdedd, 0xdedd], /* Low Surrogate */
- [0xdede, 0xdede], /* Low Surrogate */
- [0xdedf, 0xdedf], /* Low Surrogate */
- [0xdee0, 0xdee0], /* Low Surrogate */
- [0xdee1, 0xdee1], /* Low Surrogate */
- [0xdee2, 0xdee2], /* Low Surrogate */
- [0xdee3, 0xdee3], /* Low Surrogate */
- [0xdee4, 0xdee4], /* Low Surrogate */
- [0xdee5, 0xdee5], /* Low Surrogate */
- [0xdee6, 0xdee6], /* Low Surrogate */
- [0xdee7, 0xdee7], /* Low Surrogate */
- [0xdee8, 0xdee8], /* Low Surrogate */
- [0xdee9, 0xdee9], /* Low Surrogate */
- [0xdeea, 0xdeea], /* Low Surrogate */
- [0xdeeb, 0xdeeb], /* Low Surrogate */
- [0xdeec, 0xdeec], /* Low Surrogate */
- [0xdeed, 0xdeed], /* Low Surrogate */
- [0xdeee, 0xdeee], /* Low Surrogate */
- [0xdeef, 0xdeef], /* Low Surrogate */
- [0xdef0, 0xdef0], /* Low Surrogate */
- [0xdef1, 0xdef1], /* Low Surrogate */
- [0xdef2, 0xdef2], /* Low Surrogate */
- [0xdef3, 0xdef3], /* Low Surrogate */
- [0xdef4, 0xdef4], /* Low Surrogate */
- [0xdef5, 0xdef5], /* Low Surrogate */
- [0xdef6, 0xdef6], /* Low Surrogate */
- [0xdef7, 0xdef7], /* Low Surrogate */
- [0xdef8, 0xdef8], /* Low Surrogate */
- [0xdef9, 0xdef9], /* Low Surrogate */
- [0xdefa, 0xdefa], /* Low Surrogate */
- [0xdefb, 0xdefb], /* Low Surrogate */
- [0xdefc, 0xdefc], /* Low Surrogate */
- [0xdefd, 0xdefd], /* Low Surrogate */
- [0xdefe, 0xdefe], /* Low Surrogate */
- [0xdeff, 0xdeff], /* Low Surrogate */
- [0xdf00, 0xdf00], /* Low Surrogate */
- [0xdf01, 0xdf01], /* Low Surrogate */
- [0xdf02, 0xdf02], /* Low Surrogate */
- [0xdf03, 0xdf03], /* Low Surrogate */
- [0xdf04, 0xdf04], /* Low Surrogate */
- [0xdf05, 0xdf05], /* Low Surrogate */
- [0xdf06, 0xdf06], /* Low Surrogate */
- [0xdf07, 0xdf07], /* Low Surrogate */
- [0xdf08, 0xdf08], /* Low Surrogate */
- [0xdf09, 0xdf09], /* Low Surrogate */
- [0xdf0a, 0xdf0a], /* Low Surrogate */
- [0xdf0b, 0xdf0b], /* Low Surrogate */
- [0xdf0c, 0xdf0c], /* Low Surrogate */
- [0xdf0d, 0xdf0d], /* Low Surrogate */
- [0xdf0e, 0xdf0e], /* Low Surrogate */
- [0xdf0f, 0xdf0f], /* Low Surrogate */
- [0xdf10, 0xdf10], /* Low Surrogate */
- [0xdf11, 0xdf11], /* Low Surrogate */
- [0xdf12, 0xdf12], /* Low Surrogate */
- [0xdf13, 0xdf13], /* Low Surrogate */
- [0xdf14, 0xdf14], /* Low Surrogate */
- [0xdf15, 0xdf15], /* Low Surrogate */
- [0xdf16, 0xdf16], /* Low Surrogate */
- [0xdf17, 0xdf17], /* Low Surrogate */
- [0xdf18, 0xdf18], /* Low Surrogate */
- [0xdf19, 0xdf19], /* Low Surrogate */
- [0xdf1a, 0xdf1a], /* Low Surrogate */
- [0xdf1b, 0xdf1b], /* Low Surrogate */
- [0xdf1c, 0xdf1c], /* Low Surrogate */
- [0xdf1d, 0xdf1d], /* Low Surrogate */
- [0xdf1e, 0xdf1e], /* Low Surrogate */
- [0xdf1f, 0xdf1f], /* Low Surrogate */
- [0xdf20, 0xdf20], /* Low Surrogate */
- [0xdf21, 0xdf21], /* Low Surrogate */
- [0xdf22, 0xdf22], /* Low Surrogate */
- [0xdf23, 0xdf23], /* Low Surrogate */
- [0xdf24, 0xdf24], /* Low Surrogate */
- [0xdf25, 0xdf25], /* Low Surrogate */
- [0xdf26, 0xdf26], /* Low Surrogate */
- [0xdf27, 0xdf27], /* Low Surrogate */
- [0xdf28, 0xdf28], /* Low Surrogate */
- [0xdf29, 0xdf29], /* Low Surrogate */
- [0xdf2a, 0xdf2a], /* Low Surrogate */
- [0xdf2b, 0xdf2b], /* Low Surrogate */
- [0xdf2c, 0xdf2c], /* Low Surrogate */
- [0xdf2d, 0xdf2d], /* Low Surrogate */
- [0xdf2e, 0xdf2e], /* Low Surrogate */
- [0xdf2f, 0xdf2f], /* Low Surrogate */
- [0xdf30, 0xdf30], /* Low Surrogate */
- [0xdf31, 0xdf31], /* Low Surrogate */
- [0xdf32, 0xdf32], /* Low Surrogate */
- [0xdf33, 0xdf33], /* Low Surrogate */
- [0xdf34, 0xdf34], /* Low Surrogate */
- [0xdf35, 0xdf35], /* Low Surrogate */
- [0xdf36, 0xdf36], /* Low Surrogate */
- [0xdf37, 0xdf37], /* Low Surrogate */
- [0xdf38, 0xdf38], /* Low Surrogate */
- [0xdf39, 0xdf39], /* Low Surrogate */
- [0xdf3a, 0xdf3a], /* Low Surrogate */
- [0xdf3b, 0xdf3b], /* Low Surrogate */
- [0xdf3c, 0xdf3c], /* Low Surrogate */
- [0xdf3d, 0xdf3d], /* Low Surrogate */
- [0xdf3e, 0xdf3e], /* Low Surrogate */
- [0xdf3f, 0xdf3f], /* Low Surrogate */
- [0xdf40, 0xdf40], /* Low Surrogate */
- [0xdf41, 0xdf41], /* Low Surrogate */
- [0xdf42, 0xdf42], /* Low Surrogate */
- [0xdf43, 0xdf43], /* Low Surrogate */
- [0xdf44, 0xdf44], /* Low Surrogate */
- [0xdf45, 0xdf45], /* Low Surrogate */
- [0xdf46, 0xdf46], /* Low Surrogate */
- [0xdf47, 0xdf47], /* Low Surrogate */
- [0xdf48, 0xdf48], /* Low Surrogate */
- [0xdf49, 0xdf49], /* Low Surrogate */
- [0xdf4a, 0xdf4a], /* Low Surrogate */
- [0xdf4b, 0xdf4b], /* Low Surrogate */
- [0xdf4c, 0xdf4c], /* Low Surrogate */
- [0xdf4d, 0xdf4d], /* Low Surrogate */
- [0xdf4e, 0xdf4e], /* Low Surrogate */
- [0xdf4f, 0xdf4f], /* Low Surrogate */
- [0xdf50, 0xdf50], /* Low Surrogate */
- [0xdf51, 0xdf51], /* Low Surrogate */
- [0xdf52, 0xdf52], /* Low Surrogate */
- [0xdf53, 0xdf53], /* Low Surrogate */
- [0xdf54, 0xdf54], /* Low Surrogate */
- [0xdf55, 0xdf55], /* Low Surrogate */
- [0xdf56, 0xdf56], /* Low Surrogate */
- [0xdf57, 0xdf57], /* Low Surrogate */
- [0xdf58, 0xdf58], /* Low Surrogate */
- [0xdf59, 0xdf59], /* Low Surrogate */
- [0xdf5a, 0xdf5a], /* Low Surrogate */
- [0xdf5b, 0xdf5b], /* Low Surrogate */
- [0xdf5c, 0xdf5c], /* Low Surrogate */
- [0xdf5d, 0xdf5d], /* Low Surrogate */
- [0xdf5e, 0xdf5e], /* Low Surrogate */
- [0xdf5f, 0xdf5f], /* Low Surrogate */
- [0xdf60, 0xdf60], /* Low Surrogate */
- [0xdf61, 0xdf61], /* Low Surrogate */
- [0xdf62, 0xdf62], /* Low Surrogate */
- [0xdf63, 0xdf63], /* Low Surrogate */
- [0xdf64, 0xdf64], /* Low Surrogate */
- [0xdf65, 0xdf65], /* Low Surrogate */
- [0xdf66, 0xdf66], /* Low Surrogate */
- [0xdf67, 0xdf67], /* Low Surrogate */
- [0xdf68, 0xdf68], /* Low Surrogate */
- [0xdf69, 0xdf69], /* Low Surrogate */
- [0xdf6a, 0xdf6a], /* Low Surrogate */
- [0xdf6b, 0xdf6b], /* Low Surrogate */
- [0xdf6c, 0xdf6c], /* Low Surrogate */
- [0xdf6d, 0xdf6d], /* Low Surrogate */
- [0xdf6e, 0xdf6e], /* Low Surrogate */
- [0xdf6f, 0xdf6f], /* Low Surrogate */
- [0xdf70, 0xdf70], /* Low Surrogate */
- [0xdf71, 0xdf71], /* Low Surrogate */
- [0xdf72, 0xdf72], /* Low Surrogate */
- [0xdf73, 0xdf73], /* Low Surrogate */
- [0xdf74, 0xdf74], /* Low Surrogate */
- [0xdf75, 0xdf75], /* Low Surrogate */
- [0xdf76, 0xdf76], /* Low Surrogate */
- [0xdf77, 0xdf77], /* Low Surrogate */
- [0xdf78, 0xdf78], /* Low Surrogate */
- [0xdf79, 0xdf79], /* Low Surrogate */
- [0xdf7a, 0xdf7a], /* Low Surrogate */
- [0xdf7b, 0xdf7b], /* Low Surrogate */
- [0xdf7c, 0xdf7c], /* Low Surrogate */
- [0xdf7d, 0xdf7d], /* Low Surrogate */
- [0xdf7e, 0xdf7e], /* Low Surrogate */
- [0xdf7f, 0xdf7f], /* Low Surrogate */
- [0xdf80, 0xdf80], /* Low Surrogate */
- [0xdf81, 0xdf81], /* Low Surrogate */
- [0xdf82, 0xdf82], /* Low Surrogate */
- [0xdf83, 0xdf83], /* Low Surrogate */
- [0xdf84, 0xdf84], /* Low Surrogate */
- [0xdf85, 0xdf85], /* Low Surrogate */
- [0xdf86, 0xdf86], /* Low Surrogate */
- [0xdf87, 0xdf87], /* Low Surrogate */
- [0xdf88, 0xdf88], /* Low Surrogate */
- [0xdf89, 0xdf89], /* Low Surrogate */
- [0xdf8a, 0xdf8a], /* Low Surrogate */
- [0xdf8b, 0xdf8b], /* Low Surrogate */
- [0xdf8c, 0xdf8c], /* Low Surrogate */
- [0xdf8d, 0xdf8d], /* Low Surrogate */
- [0xdf8e, 0xdf8e], /* Low Surrogate */
- [0xdf8f, 0xdf8f], /* Low Surrogate */
- [0xdf90, 0xdf90], /* Low Surrogate */
- [0xdf91, 0xdf91], /* Low Surrogate */
- [0xdf92, 0xdf92], /* Low Surrogate */
- [0xdf93, 0xdf93], /* Low Surrogate */
- [0xdf94, 0xdf94], /* Low Surrogate */
- [0xdf95, 0xdf95], /* Low Surrogate */
- [0xdf96, 0xdf96], /* Low Surrogate */
- [0xdf97, 0xdf97], /* Low Surrogate */
- [0xdf98, 0xdf98], /* Low Surrogate */
- [0xdf99, 0xdf99], /* Low Surrogate */
- [0xdf9a, 0xdf9a], /* Low Surrogate */
- [0xdf9b, 0xdf9b], /* Low Surrogate */
- [0xdf9c, 0xdf9c], /* Low Surrogate */
- [0xdf9d, 0xdf9d], /* Low Surrogate */
- [0xdf9e, 0xdf9e], /* Low Surrogate */
- [0xdf9f, 0xdf9f], /* Low Surrogate */
- [0xdfa0, 0xdfa0], /* Low Surrogate */
- [0xdfa1, 0xdfa1], /* Low Surrogate */
- [0xdfa2, 0xdfa2], /* Low Surrogate */
- [0xdfa3, 0xdfa3], /* Low Surrogate */
- [0xdfa4, 0xdfa4], /* Low Surrogate */
- [0xdfa5, 0xdfa5], /* Low Surrogate */
- [0xdfa6, 0xdfa6], /* Low Surrogate */
- [0xdfa7, 0xdfa7], /* Low Surrogate */
- [0xdfa8, 0xdfa8], /* Low Surrogate */
- [0xdfa9, 0xdfa9], /* Low Surrogate */
- [0xdfaa, 0xdfaa], /* Low Surrogate */
- [0xdfab, 0xdfab], /* Low Surrogate */
- [0xdfac, 0xdfac], /* Low Surrogate */
- [0xdfad, 0xdfad], /* Low Surrogate */
- [0xdfae, 0xdfae], /* Low Surrogate */
- [0xdfaf, 0xdfaf], /* Low Surrogate */
- [0xdfb0, 0xdfb0], /* Low Surrogate */
- [0xdfb1, 0xdfb1], /* Low Surrogate */
- [0xdfb2, 0xdfb2], /* Low Surrogate */
- [0xdfb3, 0xdfb3], /* Low Surrogate */
- [0xdfb4, 0xdfb4], /* Low Surrogate */
- [0xdfb5, 0xdfb5], /* Low Surrogate */
- [0xdfb6, 0xdfb6], /* Low Surrogate */
- [0xdfb7, 0xdfb7], /* Low Surrogate */
- [0xdfb8, 0xdfb8], /* Low Surrogate */
- [0xdfb9, 0xdfb9], /* Low Surrogate */
- [0xdfba, 0xdfba], /* Low Surrogate */
- [0xdfbb, 0xdfbb], /* Low Surrogate */
- [0xdfbc, 0xdfbc], /* Low Surrogate */
- [0xdfbd, 0xdfbd], /* Low Surrogate */
- [0xdfbe, 0xdfbe], /* Low Surrogate */
- [0xdfbf, 0xdfbf], /* Low Surrogate */
- [0xdfc0, 0xdfc0], /* Low Surrogate */
- [0xdfc1, 0xdfc1], /* Low Surrogate */
- [0xdfc2, 0xdfc2], /* Low Surrogate */
- [0xdfc3, 0xdfc3], /* Low Surrogate */
- [0xdfc4, 0xdfc4], /* Low Surrogate */
- [0xdfc5, 0xdfc5], /* Low Surrogate */
- [0xdfc6, 0xdfc6], /* Low Surrogate */
- [0xdfc7, 0xdfc7], /* Low Surrogate */
- [0xdfc8, 0xdfc8], /* Low Surrogate */
- [0xdfc9, 0xdfc9], /* Low Surrogate */
- [0xdfca, 0xdfca], /* Low Surrogate */
- [0xdfcb, 0xdfcb], /* Low Surrogate */
- [0xdfcc, 0xdfcc], /* Low Surrogate */
- [0xdfcd, 0xdfcd], /* Low Surrogate */
- [0xdfce, 0xdfce], /* Low Surrogate */
- [0xdfcf, 0xdfcf], /* Low Surrogate */
- [0xdfd0, 0xdfd0], /* Low Surrogate */
- [0xdfd1, 0xdfd1], /* Low Surrogate */
- [0xdfd2, 0xdfd2], /* Low Surrogate */
- [0xdfd3, 0xdfd3], /* Low Surrogate */
- [0xdfd4, 0xdfd4], /* Low Surrogate */
- [0xdfd5, 0xdfd5], /* Low Surrogate */
- [0xdfd6, 0xdfd6], /* Low Surrogate */
- [0xdfd7, 0xdfd7], /* Low Surrogate */
- [0xdfd8, 0xdfd8], /* Low Surrogate */
- [0xdfd9, 0xdfd9], /* Low Surrogate */
- [0xdfda, 0xdfda], /* Low Surrogate */
- [0xdfdb, 0xdfdb], /* Low Surrogate */
- [0xdfdc, 0xdfdc], /* Low Surrogate */
- [0xdfdd, 0xdfdd], /* Low Surrogate */
- [0xdfde, 0xdfde], /* Low Surrogate */
- [0xdfdf, 0xdfdf], /* Low Surrogate */
- [0xdfe0, 0xdfe0], /* Low Surrogate */
- [0xdfe1, 0xdfe1], /* Low Surrogate */
- [0xdfe2, 0xdfe2], /* Low Surrogate */
- [0xdfe3, 0xdfe3], /* Low Surrogate */
- [0xdfe4, 0xdfe4], /* Low Surrogate */
- [0xdfe5, 0xdfe5], /* Low Surrogate */
- [0xdfe6, 0xdfe6], /* Low Surrogate */
- [0xdfe7, 0xdfe7], /* Low Surrogate */
- [0xdfe8, 0xdfe8], /* Low Surrogate */
- [0xdfe9, 0xdfe9], /* Low Surrogate */
- [0xdfea, 0xdfea], /* Low Surrogate */
- [0xdfeb, 0xdfeb], /* Low Surrogate */
- [0xdfec, 0xdfec], /* Low Surrogate */
- [0xdfed, 0xdfed], /* Low Surrogate */
- [0xdfee, 0xdfee], /* Low Surrogate */
- [0xdfef, 0xdfef], /* Low Surrogate */
- [0xdff0, 0xdff0], /* Low Surrogate */
- [0xdff1, 0xdff1], /* Low Surrogate */
- [0xdff2, 0xdff2], /* Low Surrogate */
- [0xdff3, 0xdff3], /* Low Surrogate */
- [0xdff4, 0xdff4], /* Low Surrogate */
- [0xdff5, 0xdff5], /* Low Surrogate */
- [0xdff6, 0xdff6], /* Low Surrogate */
- [0xdff7, 0xdff7], /* Low Surrogate */
- [0xdff8, 0xdff8], /* Low Surrogate */
- [0xdff9, 0xdff9], /* Low Surrogate */
- [0xdffa, 0xdffa], /* Low Surrogate */
- [0xdffb, 0xdffb], /* Low Surrogate */
- [0xdffc, 0xdffc], /* Low Surrogate */
- [0xdffd, 0xdffd], /* Low Surrogate */
- [0xdffe, 0xdffe], /* Low Surrogate */
- [0xdfff, 0xdfff], /* Low Surrogate */
- [0xe000, 0xe000], /* Private Use */
- [0xe001, 0xe001], /* Private Use */
- [0xe002, 0xe002], /* Private Use */
- [0xe003, 0xe003], /* Private Use */
- [0xe004, 0xe004], /* Private Use */
- [0xe005, 0xe005], /* Private Use */
- [0xe006, 0xe006], /* Private Use */
- [0xe007, 0xe007], /* Private Use */
- [0xe008, 0xe008], /* Private Use */
- [0xe009, 0xe009], /* Private Use */
- [0xe00a, 0xe00a], /* Private Use */
- [0xe00b, 0xe00b], /* Private Use */
- [0xe00c, 0xe00c], /* Private Use */
- [0xe00d, 0xe00d], /* Private Use */
- [0xe00e, 0xe00e], /* Private Use */
- [0xe00f, 0xe00f], /* Private Use */
- [0xe010, 0xe010], /* Private Use */
- [0xe011, 0xe011], /* Private Use */
- [0xe012, 0xe012], /* Private Use */
- [0xe013, 0xe013], /* Private Use */
- [0xe014, 0xe014], /* Private Use */
- [0xe015, 0xe015], /* Private Use */
- [0xe016, 0xe016], /* Private Use */
- [0xe017, 0xe017], /* Private Use */
- [0xe018, 0xe018], /* Private Use */
- [0xe019, 0xe019], /* Private Use */
- [0xe01a, 0xe01a], /* Private Use */
- [0xe01b, 0xe01b], /* Private Use */
- [0xe01c, 0xe01c], /* Private Use */
- [0xe01d, 0xe01d], /* Private Use */
- [0xe01e, 0xe01e], /* Private Use */
- [0xe01f, 0xe01f], /* Private Use */
- [0xe020, 0xe020], /* Private Use */
- [0xe021, 0xe021], /* Private Use */
- [0xe022, 0xe022], /* Private Use */
- [0xe023, 0xe023], /* Private Use */
- [0xe024, 0xe024], /* Private Use */
- [0xe025, 0xe025], /* Private Use */
- [0xe026, 0xe026], /* Private Use */
- [0xe027, 0xe027], /* Private Use */
- [0xe028, 0xe028], /* Private Use */
- [0xe029, 0xe029], /* Private Use */
- [0xe02a, 0xe02a], /* Private Use */
- [0xe02b, 0xe02b], /* Private Use */
- [0xe02c, 0xe02c], /* Private Use */
- [0xe02d, 0xe02d], /* Private Use */
- [0xe02e, 0xe02e], /* Private Use */
- [0xe02f, 0xe02f], /* Private Use */
- [0xe030, 0xe030], /* Private Use */
- [0xe031, 0xe031], /* Private Use */
- [0xe032, 0xe032], /* Private Use */
- [0xe033, 0xe033], /* Private Use */
- [0xe034, 0xe034], /* Private Use */
- [0xe035, 0xe035], /* Private Use */
- [0xe036, 0xe036], /* Private Use */
- [0xe037, 0xe037], /* Private Use */
- [0xe038, 0xe038], /* Private Use */
- [0xe039, 0xe039], /* Private Use */
- [0xe03a, 0xe03a], /* Private Use */
- [0xe03b, 0xe03b], /* Private Use */
- [0xe03c, 0xe03c], /* Private Use */
- [0xe03d, 0xe03d], /* Private Use */
- [0xe03e, 0xe03e], /* Private Use */
- [0xe03f, 0xe03f], /* Private Use */
- [0xe040, 0xe040], /* Private Use */
- [0xe041, 0xe041], /* Private Use */
- [0xe042, 0xe042], /* Private Use */
- [0xe043, 0xe043], /* Private Use */
- [0xe044, 0xe044], /* Private Use */
- [0xe045, 0xe045], /* Private Use */
- [0xe046, 0xe046], /* Private Use */
- [0xe047, 0xe047], /* Private Use */
- [0xe048, 0xe048], /* Private Use */
- [0xe049, 0xe049], /* Private Use */
- [0xe04a, 0xe04a], /* Private Use */
- [0xe04b, 0xe04b], /* Private Use */
- [0xe04c, 0xe04c], /* Private Use */
- [0xe04d, 0xe04d], /* Private Use */
- [0xe04e, 0xe04e], /* Private Use */
- [0xe04f, 0xe04f], /* Private Use */
- [0xe050, 0xe050], /* Private Use */
- [0xe051, 0xe051], /* Private Use */
- [0xe052, 0xe052], /* Private Use */
- [0xe053, 0xe053], /* Private Use */
- [0xe054, 0xe054], /* Private Use */
- [0xe055, 0xe055], /* Private Use */
- [0xe056, 0xe056], /* Private Use */
- [0xe057, 0xe057], /* Private Use */
- [0xe058, 0xe058], /* Private Use */
- [0xe059, 0xe059], /* Private Use */
- [0xe05a, 0xe05a], /* Private Use */
- [0xe05b, 0xe05b], /* Private Use */
- [0xe05c, 0xe05c], /* Private Use */
- [0xe05d, 0xe05d], /* Private Use */
- [0xe05e, 0xe05e], /* Private Use */
- [0xe05f, 0xe05f], /* Private Use */
- [0xe060, 0xe060], /* Private Use */
- [0xe061, 0xe061], /* Private Use */
- [0xe062, 0xe062], /* Private Use */
- [0xe063, 0xe063], /* Private Use */
- [0xe064, 0xe064], /* Private Use */
- [0xe065, 0xe065], /* Private Use */
- [0xe066, 0xe066], /* Private Use */
- [0xe067, 0xe067], /* Private Use */
- [0xe068, 0xe068], /* Private Use */
- [0xe069, 0xe069], /* Private Use */
- [0xe06a, 0xe06a], /* Private Use */
- [0xe06b, 0xe06b], /* Private Use */
- [0xe06c, 0xe06c], /* Private Use */
- [0xe06d, 0xe06d], /* Private Use */
- [0xe06e, 0xe06e], /* Private Use */
- [0xe06f, 0xe06f], /* Private Use */
- [0xe070, 0xe070], /* Private Use */
- [0xe071, 0xe071], /* Private Use */
- [0xe072, 0xe072], /* Private Use */
- [0xe073, 0xe073], /* Private Use */
- [0xe074, 0xe074], /* Private Use */
- [0xe075, 0xe075], /* Private Use */
- [0xe076, 0xe076], /* Private Use */
- [0xe077, 0xe077], /* Private Use */
- [0xe078, 0xe078], /* Private Use */
- [0xe079, 0xe079], /* Private Use */
- [0xe07a, 0xe07a], /* Private Use */
- [0xe07b, 0xe07b], /* Private Use */
- [0xe07c, 0xe07c], /* Private Use */
- [0xe07d, 0xe07d], /* Private Use */
- [0xe07e, 0xe07e], /* Private Use */
- [0xe07f, 0xe07f], /* Private Use */
- [0xe080, 0xe080], /* Private Use */
- [0xe081, 0xe081], /* Private Use */
- [0xe082, 0xe082], /* Private Use */
- [0xe083, 0xe083], /* Private Use */
- [0xe084, 0xe084], /* Private Use */
- [0xe085, 0xe085], /* Private Use */
- [0xe086, 0xe086], /* Private Use */
- [0xe087, 0xe087], /* Private Use */
- [0xe088, 0xe088], /* Private Use */
- [0xe089, 0xe089], /* Private Use */
- [0xe08a, 0xe08a], /* Private Use */
- [0xe08b, 0xe08b], /* Private Use */
- [0xe08c, 0xe08c], /* Private Use */
- [0xe08d, 0xe08d], /* Private Use */
- [0xe08e, 0xe08e], /* Private Use */
- [0xe08f, 0xe08f], /* Private Use */
- [0xe090, 0xe090], /* Private Use */
- [0xe091, 0xe091], /* Private Use */
- [0xe092, 0xe092], /* Private Use */
- [0xe093, 0xe093], /* Private Use */
- [0xe094, 0xe094], /* Private Use */
- [0xe095, 0xe095], /* Private Use */
- [0xe096, 0xe096], /* Private Use */
- [0xe097, 0xe097], /* Private Use */
- [0xe098, 0xe098], /* Private Use */
- [0xe099, 0xe099], /* Private Use */
- [0xe09a, 0xe09a], /* Private Use */
- [0xe09b, 0xe09b], /* Private Use */
- [0xe09c, 0xe09c], /* Private Use */
- [0xe09d, 0xe09d], /* Private Use */
- [0xe09e, 0xe09e], /* Private Use */
- [0xe09f, 0xe09f], /* Private Use */
- [0xe0a0, 0xe0a0], /* Private Use */
- [0xe0a1, 0xe0a1], /* Private Use */
- [0xe0a2, 0xe0a2], /* Private Use */
- [0xe0a3, 0xe0a3], /* Private Use */
- [0xe0a4, 0xe0a4], /* Private Use */
- [0xe0a5, 0xe0a5], /* Private Use */
- [0xe0a6, 0xe0a6], /* Private Use */
- [0xe0a7, 0xe0a7], /* Private Use */
- [0xe0a8, 0xe0a8], /* Private Use */
- [0xe0a9, 0xe0a9], /* Private Use */
- [0xe0aa, 0xe0aa], /* Private Use */
- [0xe0ab, 0xe0ab], /* Private Use */
- [0xe0ac, 0xe0ac], /* Private Use */
- [0xe0ad, 0xe0ad], /* Private Use */
- [0xe0ae, 0xe0ae], /* Private Use */
- [0xe0af, 0xe0af], /* Private Use */
- [0xe0b0, 0xe0b0], /* Private Use */
- [0xe0b1, 0xe0b1], /* Private Use */
- [0xe0b2, 0xe0b2], /* Private Use */
- [0xe0b3, 0xe0b3], /* Private Use */
- [0xe0b4, 0xe0b4], /* Private Use */
- [0xe0b5, 0xe0b5], /* Private Use */
- [0xe0b6, 0xe0b6], /* Private Use */
- [0xe0b7, 0xe0b7], /* Private Use */
- [0xe0b8, 0xe0b8], /* Private Use */
- [0xe0b9, 0xe0b9], /* Private Use */
- [0xe0ba, 0xe0ba], /* Private Use */
- [0xe0bb, 0xe0bb], /* Private Use */
- [0xe0bc, 0xe0bc], /* Private Use */
- [0xe0bd, 0xe0bd], /* Private Use */
- [0xe0be, 0xe0be], /* Private Use */
- [0xe0bf, 0xe0bf], /* Private Use */
- [0xe0c0, 0xe0c0], /* Private Use */
- [0xe0c1, 0xe0c1], /* Private Use */
- [0xe0c2, 0xe0c2], /* Private Use */
- [0xe0c3, 0xe0c3], /* Private Use */
- [0xe0c4, 0xe0c4], /* Private Use */
- [0xe0c5, 0xe0c5], /* Private Use */
- [0xe0c6, 0xe0c6], /* Private Use */
- [0xe0c7, 0xe0c7], /* Private Use */
- [0xe0c8, 0xe0c8], /* Private Use */
- [0xe0c9, 0xe0c9], /* Private Use */
- [0xe0ca, 0xe0ca], /* Private Use */
- [0xe0cb, 0xe0cb], /* Private Use */
- [0xe0cc, 0xe0cc], /* Private Use */
- [0xe0cd, 0xe0cd], /* Private Use */
- [0xe0ce, 0xe0ce], /* Private Use */
- [0xe0cf, 0xe0cf], /* Private Use */
- [0xe0d0, 0xe0d0], /* Private Use */
- [0xe0d1, 0xe0d1], /* Private Use */
- [0xe0d2, 0xe0d2], /* Private Use */
- [0xe0d3, 0xe0d3], /* Private Use */
- [0xe0d4, 0xe0d4], /* Private Use */
- [0xe0d5, 0xe0d5], /* Private Use */
- [0xe0d6, 0xe0d6], /* Private Use */
- [0xe0d7, 0xe0d7], /* Private Use */
- [0xe0d8, 0xe0d8], /* Private Use */
- [0xe0d9, 0xe0d9], /* Private Use */
- [0xe0da, 0xe0da], /* Private Use */
- [0xe0db, 0xe0db], /* Private Use */
- [0xe0dc, 0xe0dc], /* Private Use */
- [0xe0dd, 0xe0dd], /* Private Use */
- [0xe0de, 0xe0de], /* Private Use */
- [0xe0df, 0xe0df], /* Private Use */
- [0xe0e0, 0xe0e0], /* Private Use */
- [0xe0e1, 0xe0e1], /* Private Use */
- [0xe0e2, 0xe0e2], /* Private Use */
- [0xe0e3, 0xe0e3], /* Private Use */
- [0xe0e4, 0xe0e4], /* Private Use */
- [0xe0e5, 0xe0e5], /* Private Use */
- [0xe0e6, 0xe0e6], /* Private Use */
- [0xe0e7, 0xe0e7], /* Private Use */
- [0xe0e8, 0xe0e8], /* Private Use */
- [0xe0e9, 0xe0e9], /* Private Use */
- [0xe0ea, 0xe0ea], /* Private Use */
- [0xe0eb, 0xe0eb], /* Private Use */
- [0xe0ec, 0xe0ec], /* Private Use */
- [0xe0ed, 0xe0ed], /* Private Use */
- [0xe0ee, 0xe0ee], /* Private Use */
- [0xe0ef, 0xe0ef], /* Private Use */
- [0xe0f0, 0xe0f0], /* Private Use */
- [0xe0f1, 0xe0f1], /* Private Use */
- [0xe0f2, 0xe0f2], /* Private Use */
- [0xe0f3, 0xe0f3], /* Private Use */
- [0xe0f4, 0xe0f4], /* Private Use */
- [0xe0f5, 0xe0f5], /* Private Use */
- [0xe0f6, 0xe0f6], /* Private Use */
- [0xe0f7, 0xe0f7], /* Private Use */
- [0xe0f8, 0xe0f8], /* Private Use */
- [0xe0f9, 0xe0f9], /* Private Use */
- [0xe0fa, 0xe0fa], /* Private Use */
- [0xe0fb, 0xe0fb], /* Private Use */
- [0xe0fc, 0xe0fc], /* Private Use */
- [0xe0fd, 0xe0fd], /* Private Use */
- [0xe0fe, 0xe0fe], /* Private Use */
- [0xe0ff, 0xe0ff], /* Private Use */
- [0xe100, 0xe100], /* Private Use */
- [0xe101, 0xe101], /* Private Use */
- [0xe102, 0xe102], /* Private Use */
- [0xe103, 0xe103], /* Private Use */
- [0xe104, 0xe104], /* Private Use */
- [0xe105, 0xe105], /* Private Use */
- [0xe106, 0xe106], /* Private Use */
- [0xe107, 0xe107], /* Private Use */
- [0xe108, 0xe108], /* Private Use */
- [0xe109, 0xe109], /* Private Use */
- [0xe10a, 0xe10a], /* Private Use */
- [0xe10b, 0xe10b], /* Private Use */
- [0xe10c, 0xe10c], /* Private Use */
- [0xe10d, 0xe10d], /* Private Use */
- [0xe10e, 0xe10e], /* Private Use */
- [0xe10f, 0xe10f], /* Private Use */
- [0xe110, 0xe110], /* Private Use */
- [0xe111, 0xe111], /* Private Use */
- [0xe112, 0xe112], /* Private Use */
- [0xe113, 0xe113], /* Private Use */
- [0xe114, 0xe114], /* Private Use */
- [0xe115, 0xe115], /* Private Use */
- [0xe116, 0xe116], /* Private Use */
- [0xe117, 0xe117], /* Private Use */
- [0xe118, 0xe118], /* Private Use */
- [0xe119, 0xe119], /* Private Use */
- [0xe11a, 0xe11a], /* Private Use */
- [0xe11b, 0xe11b], /* Private Use */
- [0xe11c, 0xe11c], /* Private Use */
- [0xe11d, 0xe11d], /* Private Use */
- [0xe11e, 0xe11e], /* Private Use */
- [0xe11f, 0xe11f], /* Private Use */
- [0xe120, 0xe120], /* Private Use */
- [0xe121, 0xe121], /* Private Use */
- [0xe122, 0xe122], /* Private Use */
- [0xe123, 0xe123], /* Private Use */
- [0xe124, 0xe124], /* Private Use */
- [0xe125, 0xe125], /* Private Use */
- [0xe126, 0xe126], /* Private Use */
- [0xe127, 0xe127], /* Private Use */
- [0xe128, 0xe128], /* Private Use */
- [0xe129, 0xe129], /* Private Use */
- [0xe12a, 0xe12a], /* Private Use */
- [0xe12b, 0xe12b], /* Private Use */
- [0xe12c, 0xe12c], /* Private Use */
- [0xe12d, 0xe12d], /* Private Use */
- [0xe12e, 0xe12e], /* Private Use */
- [0xe12f, 0xe12f], /* Private Use */
- [0xe130, 0xe130], /* Private Use */
- [0xe131, 0xe131], /* Private Use */
- [0xe132, 0xe132], /* Private Use */
- [0xe133, 0xe133], /* Private Use */
- [0xe134, 0xe134], /* Private Use */
- [0xe135, 0xe135], /* Private Use */
- [0xe136, 0xe136], /* Private Use */
- [0xe137, 0xe137], /* Private Use */
- [0xe138, 0xe138], /* Private Use */
- [0xe139, 0xe139], /* Private Use */
- [0xe13a, 0xe13a], /* Private Use */
- [0xe13b, 0xe13b], /* Private Use */
- [0xe13c, 0xe13c], /* Private Use */
- [0xe13d, 0xe13d], /* Private Use */
- [0xe13e, 0xe13e], /* Private Use */
- [0xe13f, 0xe13f], /* Private Use */
- [0xe140, 0xe140], /* Private Use */
- [0xe141, 0xe141], /* Private Use */
- [0xe142, 0xe142], /* Private Use */
- [0xe143, 0xe143], /* Private Use */
- [0xe144, 0xe144], /* Private Use */
- [0xe145, 0xe145], /* Private Use */
- [0xe146, 0xe146], /* Private Use */
- [0xe147, 0xe147], /* Private Use */
- [0xe148, 0xe148], /* Private Use */
- [0xe149, 0xe149], /* Private Use */
- [0xe14a, 0xe14a], /* Private Use */
- [0xe14b, 0xe14b], /* Private Use */
- [0xe14c, 0xe14c], /* Private Use */
- [0xe14d, 0xe14d], /* Private Use */
- [0xe14e, 0xe14e], /* Private Use */
- [0xe14f, 0xe14f], /* Private Use */
- [0xe150, 0xe150], /* Private Use */
- [0xe151, 0xe151], /* Private Use */
- [0xe152, 0xe152], /* Private Use */
- [0xe153, 0xe153], /* Private Use */
- [0xe154, 0xe154], /* Private Use */
- [0xe155, 0xe155], /* Private Use */
- [0xe156, 0xe156], /* Private Use */
- [0xe157, 0xe157], /* Private Use */
- [0xe158, 0xe158], /* Private Use */
- [0xe159, 0xe159], /* Private Use */
- [0xe15a, 0xe15a], /* Private Use */
- [0xe15b, 0xe15b], /* Private Use */
- [0xe15c, 0xe15c], /* Private Use */
- [0xe15d, 0xe15d], /* Private Use */
- [0xe15e, 0xe15e], /* Private Use */
- [0xe15f, 0xe15f], /* Private Use */
- [0xe160, 0xe160], /* Private Use */
- [0xe161, 0xe161], /* Private Use */
- [0xe162, 0xe162], /* Private Use */
- [0xe163, 0xe163], /* Private Use */
- [0xe164, 0xe164], /* Private Use */
- [0xe165, 0xe165], /* Private Use */
- [0xe166, 0xe166], /* Private Use */
- [0xe167, 0xe167], /* Private Use */
- [0xe168, 0xe168], /* Private Use */
- [0xe169, 0xe169], /* Private Use */
- [0xe16a, 0xe16a], /* Private Use */
- [0xe16b, 0xe16b], /* Private Use */
- [0xe16c, 0xe16c], /* Private Use */
- [0xe16d, 0xe16d], /* Private Use */
- [0xe16e, 0xe16e], /* Private Use */
- [0xe16f, 0xe16f], /* Private Use */
- [0xe170, 0xe170], /* Private Use */
- [0xe171, 0xe171], /* Private Use */
- [0xe172, 0xe172], /* Private Use */
- [0xe173, 0xe173], /* Private Use */
- [0xe174, 0xe174], /* Private Use */
- [0xe175, 0xe175], /* Private Use */
- [0xe176, 0xe176], /* Private Use */
- [0xe177, 0xe177], /* Private Use */
- [0xe178, 0xe178], /* Private Use */
- [0xe179, 0xe179], /* Private Use */
- [0xe17a, 0xe17a], /* Private Use */
- [0xe17b, 0xe17b], /* Private Use */
- [0xe17c, 0xe17c], /* Private Use */
- [0xe17d, 0xe17d], /* Private Use */
- [0xe17e, 0xe17e], /* Private Use */
- [0xe17f, 0xe17f], /* Private Use */
- [0xe180, 0xe180], /* Private Use */
- [0xe181, 0xe181], /* Private Use */
- [0xe182, 0xe182], /* Private Use */
- [0xe183, 0xe183], /* Private Use */
- [0xe184, 0xe184], /* Private Use */
- [0xe185, 0xe185], /* Private Use */
- [0xe186, 0xe186], /* Private Use */
- [0xe187, 0xe187], /* Private Use */
- [0xe188, 0xe188], /* Private Use */
- [0xe189, 0xe189], /* Private Use */
- [0xe18a, 0xe18a], /* Private Use */
- [0xe18b, 0xe18b], /* Private Use */
- [0xe18c, 0xe18c], /* Private Use */
- [0xe18d, 0xe18d], /* Private Use */
- [0xe18e, 0xe18e], /* Private Use */
- [0xe18f, 0xe18f], /* Private Use */
- [0xe190, 0xe190], /* Private Use */
- [0xe191, 0xe191], /* Private Use */
- [0xe192, 0xe192], /* Private Use */
- [0xe193, 0xe193], /* Private Use */
- [0xe194, 0xe194], /* Private Use */
- [0xe195, 0xe195], /* Private Use */
- [0xe196, 0xe196], /* Private Use */
- [0xe197, 0xe197], /* Private Use */
- [0xe198, 0xe198], /* Private Use */
- [0xe199, 0xe199], /* Private Use */
- [0xe19a, 0xe19a], /* Private Use */
- [0xe19b, 0xe19b], /* Private Use */
- [0xe19c, 0xe19c], /* Private Use */
- [0xe19d, 0xe19d], /* Private Use */
- [0xe19e, 0xe19e], /* Private Use */
- [0xe19f, 0xe19f], /* Private Use */
- [0xe1a0, 0xe1a0], /* Private Use */
- [0xe1a1, 0xe1a1], /* Private Use */
- [0xe1a2, 0xe1a2], /* Private Use */
- [0xe1a3, 0xe1a3], /* Private Use */
- [0xe1a4, 0xe1a4], /* Private Use */
- [0xe1a5, 0xe1a5], /* Private Use */
- [0xe1a6, 0xe1a6], /* Private Use */
- [0xe1a7, 0xe1a7], /* Private Use */
- [0xe1a8, 0xe1a8], /* Private Use */
- [0xe1a9, 0xe1a9], /* Private Use */
- [0xe1aa, 0xe1aa], /* Private Use */
- [0xe1ab, 0xe1ab], /* Private Use */
- [0xe1ac, 0xe1ac], /* Private Use */
- [0xe1ad, 0xe1ad], /* Private Use */
- [0xe1ae, 0xe1ae], /* Private Use */
- [0xe1af, 0xe1af], /* Private Use */
- [0xe1b0, 0xe1b0], /* Private Use */
- [0xe1b1, 0xe1b1], /* Private Use */
- [0xe1b2, 0xe1b2], /* Private Use */
- [0xe1b3, 0xe1b3], /* Private Use */
- [0xe1b4, 0xe1b4], /* Private Use */
- [0xe1b5, 0xe1b5], /* Private Use */
- [0xe1b6, 0xe1b6], /* Private Use */
- [0xe1b7, 0xe1b7], /* Private Use */
- [0xe1b8, 0xe1b8], /* Private Use */
- [0xe1b9, 0xe1b9], /* Private Use */
- [0xe1ba, 0xe1ba], /* Private Use */
- [0xe1bb, 0xe1bb], /* Private Use */
- [0xe1bc, 0xe1bc], /* Private Use */
- [0xe1bd, 0xe1bd], /* Private Use */
- [0xe1be, 0xe1be], /* Private Use */
- [0xe1bf, 0xe1bf], /* Private Use */
- [0xe1c0, 0xe1c0], /* Private Use */
- [0xe1c1, 0xe1c1], /* Private Use */
- [0xe1c2, 0xe1c2], /* Private Use */
- [0xe1c3, 0xe1c3], /* Private Use */
- [0xe1c4, 0xe1c4], /* Private Use */
- [0xe1c5, 0xe1c5], /* Private Use */
- [0xe1c6, 0xe1c6], /* Private Use */
- [0xe1c7, 0xe1c7], /* Private Use */
- [0xe1c8, 0xe1c8], /* Private Use */
- [0xe1c9, 0xe1c9], /* Private Use */
- [0xe1ca, 0xe1ca], /* Private Use */
- [0xe1cb, 0xe1cb], /* Private Use */
- [0xe1cc, 0xe1cc], /* Private Use */
- [0xe1cd, 0xe1cd], /* Private Use */
- [0xe1ce, 0xe1ce], /* Private Use */
- [0xe1cf, 0xe1cf], /* Private Use */
- [0xe1d0, 0xe1d0], /* Private Use */
- [0xe1d1, 0xe1d1], /* Private Use */
- [0xe1d2, 0xe1d2], /* Private Use */
- [0xe1d3, 0xe1d3], /* Private Use */
- [0xe1d4, 0xe1d4], /* Private Use */
- [0xe1d5, 0xe1d5], /* Private Use */
- [0xe1d6, 0xe1d6], /* Private Use */
- [0xe1d7, 0xe1d7], /* Private Use */
- [0xe1d8, 0xe1d8], /* Private Use */
- [0xe1d9, 0xe1d9], /* Private Use */
- [0xe1da, 0xe1da], /* Private Use */
- [0xe1db, 0xe1db], /* Private Use */
- [0xe1dc, 0xe1dc], /* Private Use */
- [0xe1dd, 0xe1dd], /* Private Use */
- [0xe1de, 0xe1de], /* Private Use */
- [0xe1df, 0xe1df], /* Private Use */
- [0xe1e0, 0xe1e0], /* Private Use */
- [0xe1e1, 0xe1e1], /* Private Use */
- [0xe1e2, 0xe1e2], /* Private Use */
- [0xe1e3, 0xe1e3], /* Private Use */
- [0xe1e4, 0xe1e4], /* Private Use */
- [0xe1e5, 0xe1e5], /* Private Use */
- [0xe1e6, 0xe1e6], /* Private Use */
- [0xe1e7, 0xe1e7], /* Private Use */
- [0xe1e8, 0xe1e8], /* Private Use */
- [0xe1e9, 0xe1e9], /* Private Use */
- [0xe1ea, 0xe1ea], /* Private Use */
- [0xe1eb, 0xe1eb], /* Private Use */
- [0xe1ec, 0xe1ec], /* Private Use */
- [0xe1ed, 0xe1ed], /* Private Use */
- [0xe1ee, 0xe1ee], /* Private Use */
- [0xe1ef, 0xe1ef], /* Private Use */
- [0xe1f0, 0xe1f0], /* Private Use */
- [0xe1f1, 0xe1f1], /* Private Use */
- [0xe1f2, 0xe1f2], /* Private Use */
- [0xe1f3, 0xe1f3], /* Private Use */
- [0xe1f4, 0xe1f4], /* Private Use */
- [0xe1f5, 0xe1f5], /* Private Use */
- [0xe1f6, 0xe1f6], /* Private Use */
- [0xe1f7, 0xe1f7], /* Private Use */
- [0xe1f8, 0xe1f8], /* Private Use */
- [0xe1f9, 0xe1f9], /* Private Use */
- [0xe1fa, 0xe1fa], /* Private Use */
- [0xe1fb, 0xe1fb], /* Private Use */
- [0xe1fc, 0xe1fc], /* Private Use */
- [0xe1fd, 0xe1fd], /* Private Use */
- [0xe1fe, 0xe1fe], /* Private Use */
- [0xe1ff, 0xe1ff], /* Private Use */
- [0xe200, 0xe200], /* Private Use */
- [0xe201, 0xe201], /* Private Use */
- [0xe202, 0xe202], /* Private Use */
- [0xe203, 0xe203], /* Private Use */
- [0xe204, 0xe204], /* Private Use */
- [0xe205, 0xe205], /* Private Use */
- [0xe206, 0xe206], /* Private Use */
- [0xe207, 0xe207], /* Private Use */
- [0xe208, 0xe208], /* Private Use */
- [0xe209, 0xe209], /* Private Use */
- [0xe20a, 0xe20a], /* Private Use */
- [0xe20b, 0xe20b], /* Private Use */
- [0xe20c, 0xe20c], /* Private Use */
- [0xe20d, 0xe20d], /* Private Use */
- [0xe20e, 0xe20e], /* Private Use */
- [0xe20f, 0xe20f], /* Private Use */
- [0xe210, 0xe210], /* Private Use */
- [0xe211, 0xe211], /* Private Use */
- [0xe212, 0xe212], /* Private Use */
- [0xe213, 0xe213], /* Private Use */
- [0xe214, 0xe214], /* Private Use */
- [0xe215, 0xe215], /* Private Use */
- [0xe216, 0xe216], /* Private Use */
- [0xe217, 0xe217], /* Private Use */
- [0xe218, 0xe218], /* Private Use */
- [0xe219, 0xe219], /* Private Use */
- [0xe21a, 0xe21a], /* Private Use */
- [0xe21b, 0xe21b], /* Private Use */
- [0xe21c, 0xe21c], /* Private Use */
- [0xe21d, 0xe21d], /* Private Use */
- [0xe21e, 0xe21e], /* Private Use */
- [0xe21f, 0xe21f], /* Private Use */
- [0xe220, 0xe220], /* Private Use */
- [0xe221, 0xe221], /* Private Use */
- [0xe222, 0xe222], /* Private Use */
- [0xe223, 0xe223], /* Private Use */
- [0xe224, 0xe224], /* Private Use */
- [0xe225, 0xe225], /* Private Use */
- [0xe226, 0xe226], /* Private Use */
- [0xe227, 0xe227], /* Private Use */
- [0xe228, 0xe228], /* Private Use */
- [0xe229, 0xe229], /* Private Use */
- [0xe22a, 0xe22a], /* Private Use */
- [0xe22b, 0xe22b], /* Private Use */
- [0xe22c, 0xe22c], /* Private Use */
- [0xe22d, 0xe22d], /* Private Use */
- [0xe22e, 0xe22e], /* Private Use */
- [0xe22f, 0xe22f], /* Private Use */
- [0xe230, 0xe230], /* Private Use */
- [0xe231, 0xe231], /* Private Use */
- [0xe232, 0xe232], /* Private Use */
- [0xe233, 0xe233], /* Private Use */
- [0xe234, 0xe234], /* Private Use */
- [0xe235, 0xe235], /* Private Use */
- [0xe236, 0xe236], /* Private Use */
- [0xe237, 0xe237], /* Private Use */
- [0xe238, 0xe238], /* Private Use */
- [0xe239, 0xe239], /* Private Use */
- [0xe23a, 0xe23a], /* Private Use */
- [0xe23b, 0xe23b], /* Private Use */
- [0xe23c, 0xe23c], /* Private Use */
- [0xe23d, 0xe23d], /* Private Use */
- [0xe23e, 0xe23e], /* Private Use */
- [0xe23f, 0xe23f], /* Private Use */
- [0xe240, 0xe240], /* Private Use */
- [0xe241, 0xe241], /* Private Use */
- [0xe242, 0xe242], /* Private Use */
- [0xe243, 0xe243], /* Private Use */
- [0xe244, 0xe244], /* Private Use */
- [0xe245, 0xe245], /* Private Use */
- [0xe246, 0xe246], /* Private Use */
- [0xe247, 0xe247], /* Private Use */
- [0xe248, 0xe248], /* Private Use */
- [0xe249, 0xe249], /* Private Use */
- [0xe24a, 0xe24a], /* Private Use */
- [0xe24b, 0xe24b], /* Private Use */
- [0xe24c, 0xe24c], /* Private Use */
- [0xe24d, 0xe24d], /* Private Use */
- [0xe24e, 0xe24e], /* Private Use */
- [0xe24f, 0xe24f], /* Private Use */
- [0xe250, 0xe250], /* Private Use */
- [0xe251, 0xe251], /* Private Use */
- [0xe252, 0xe252], /* Private Use */
- [0xe253, 0xe253], /* Private Use */
- [0xe254, 0xe254], /* Private Use */
- [0xe255, 0xe255], /* Private Use */
- [0xe256, 0xe256], /* Private Use */
- [0xe257, 0xe257], /* Private Use */
- [0xe258, 0xe258], /* Private Use */
- [0xe259, 0xe259], /* Private Use */
- [0xe25a, 0xe25a], /* Private Use */
- [0xe25b, 0xe25b], /* Private Use */
- [0xe25c, 0xe25c], /* Private Use */
- [0xe25d, 0xe25d], /* Private Use */
- [0xe25e, 0xe25e], /* Private Use */
- [0xe25f, 0xe25f], /* Private Use */
- [0xe260, 0xe260], /* Private Use */
- [0xe261, 0xe261], /* Private Use */
- [0xe262, 0xe262], /* Private Use */
- [0xe263, 0xe263], /* Private Use */
- [0xe264, 0xe264], /* Private Use */
- [0xe265, 0xe265], /* Private Use */
- [0xe266, 0xe266], /* Private Use */
- [0xe267, 0xe267], /* Private Use */
- [0xe268, 0xe268], /* Private Use */
- [0xe269, 0xe269], /* Private Use */
- [0xe26a, 0xe26a], /* Private Use */
- [0xe26b, 0xe26b], /* Private Use */
- [0xe26c, 0xe26c], /* Private Use */
- [0xe26d, 0xe26d], /* Private Use */
- [0xe26e, 0xe26e], /* Private Use */
- [0xe26f, 0xe26f], /* Private Use */
- [0xe270, 0xe270], /* Private Use */
- [0xe271, 0xe271], /* Private Use */
- [0xe272, 0xe272], /* Private Use */
- [0xe273, 0xe273], /* Private Use */
- [0xe274, 0xe274], /* Private Use */
- [0xe275, 0xe275], /* Private Use */
- [0xe276, 0xe276], /* Private Use */
- [0xe277, 0xe277], /* Private Use */
- [0xe278, 0xe278], /* Private Use */
- [0xe279, 0xe279], /* Private Use */
- [0xe27a, 0xe27a], /* Private Use */
- [0xe27b, 0xe27b], /* Private Use */
- [0xe27c, 0xe27c], /* Private Use */
- [0xe27d, 0xe27d], /* Private Use */
- [0xe27e, 0xe27e], /* Private Use */
- [0xe27f, 0xe27f], /* Private Use */
- [0xe280, 0xe280], /* Private Use */
- [0xe281, 0xe281], /* Private Use */
- [0xe282, 0xe282], /* Private Use */
- [0xe283, 0xe283], /* Private Use */
- [0xe284, 0xe284], /* Private Use */
- [0xe285, 0xe285], /* Private Use */
- [0xe286, 0xe286], /* Private Use */
- [0xe287, 0xe287], /* Private Use */
- [0xe288, 0xe288], /* Private Use */
- [0xe289, 0xe289], /* Private Use */
- [0xe28a, 0xe28a], /* Private Use */
- [0xe28b, 0xe28b], /* Private Use */
- [0xe28c, 0xe28c], /* Private Use */
- [0xe28d, 0xe28d], /* Private Use */
- [0xe28e, 0xe28e], /* Private Use */
- [0xe28f, 0xe28f], /* Private Use */
- [0xe290, 0xe290], /* Private Use */
- [0xe291, 0xe291], /* Private Use */
- [0xe292, 0xe292], /* Private Use */
- [0xe293, 0xe293], /* Private Use */
- [0xe294, 0xe294], /* Private Use */
- [0xe295, 0xe295], /* Private Use */
- [0xe296, 0xe296], /* Private Use */
- [0xe297, 0xe297], /* Private Use */
- [0xe298, 0xe298], /* Private Use */
- [0xe299, 0xe299], /* Private Use */
- [0xe29a, 0xe29a], /* Private Use */
- [0xe29b, 0xe29b], /* Private Use */
- [0xe29c, 0xe29c], /* Private Use */
- [0xe29d, 0xe29d], /* Private Use */
- [0xe29e, 0xe29e], /* Private Use */
- [0xe29f, 0xe29f], /* Private Use */
- [0xe2a0, 0xe2a0], /* Private Use */
- [0xe2a1, 0xe2a1], /* Private Use */
- [0xe2a2, 0xe2a2], /* Private Use */
- [0xe2a3, 0xe2a3], /* Private Use */
- [0xe2a4, 0xe2a4], /* Private Use */
- [0xe2a5, 0xe2a5], /* Private Use */
- [0xe2a6, 0xe2a6], /* Private Use */
- [0xe2a7, 0xe2a7], /* Private Use */
- [0xe2a8, 0xe2a8], /* Private Use */
- [0xe2a9, 0xe2a9], /* Private Use */
- [0xe2aa, 0xe2aa], /* Private Use */
- [0xe2ab, 0xe2ab], /* Private Use */
- [0xe2ac, 0xe2ac], /* Private Use */
- [0xe2ad, 0xe2ad], /* Private Use */
- [0xe2ae, 0xe2ae], /* Private Use */
- [0xe2af, 0xe2af], /* Private Use */
- [0xe2b0, 0xe2b0], /* Private Use */
- [0xe2b1, 0xe2b1], /* Private Use */
- [0xe2b2, 0xe2b2], /* Private Use */
- [0xe2b3, 0xe2b3], /* Private Use */
- [0xe2b4, 0xe2b4], /* Private Use */
- [0xe2b5, 0xe2b5], /* Private Use */
- [0xe2b6, 0xe2b6], /* Private Use */
- [0xe2b7, 0xe2b7], /* Private Use */
- [0xe2b8, 0xe2b8], /* Private Use */
- [0xe2b9, 0xe2b9], /* Private Use */
- [0xe2ba, 0xe2ba], /* Private Use */
- [0xe2bb, 0xe2bb], /* Private Use */
- [0xe2bc, 0xe2bc], /* Private Use */
- [0xe2bd, 0xe2bd], /* Private Use */
- [0xe2be, 0xe2be], /* Private Use */
- [0xe2bf, 0xe2bf], /* Private Use */
- [0xe2c0, 0xe2c0], /* Private Use */
- [0xe2c1, 0xe2c1], /* Private Use */
- [0xe2c2, 0xe2c2], /* Private Use */
- [0xe2c3, 0xe2c3], /* Private Use */
- [0xe2c4, 0xe2c4], /* Private Use */
- [0xe2c5, 0xe2c5], /* Private Use */
- [0xe2c6, 0xe2c6], /* Private Use */
- [0xe2c7, 0xe2c7], /* Private Use */
- [0xe2c8, 0xe2c8], /* Private Use */
- [0xe2c9, 0xe2c9], /* Private Use */
- [0xe2ca, 0xe2ca], /* Private Use */
- [0xe2cb, 0xe2cb], /* Private Use */
- [0xe2cc, 0xe2cc], /* Private Use */
- [0xe2cd, 0xe2cd], /* Private Use */
- [0xe2ce, 0xe2ce], /* Private Use */
- [0xe2cf, 0xe2cf], /* Private Use */
- [0xe2d0, 0xe2d0], /* Private Use */
- [0xe2d1, 0xe2d1], /* Private Use */
- [0xe2d2, 0xe2d2], /* Private Use */
- [0xe2d3, 0xe2d3], /* Private Use */
- [0xe2d4, 0xe2d4], /* Private Use */
- [0xe2d5, 0xe2d5], /* Private Use */
- [0xe2d6, 0xe2d6], /* Private Use */
- [0xe2d7, 0xe2d7], /* Private Use */
- [0xe2d8, 0xe2d8], /* Private Use */
- [0xe2d9, 0xe2d9], /* Private Use */
- [0xe2da, 0xe2da], /* Private Use */
- [0xe2db, 0xe2db], /* Private Use */
- [0xe2dc, 0xe2dc], /* Private Use */
- [0xe2dd, 0xe2dd], /* Private Use */
- [0xe2de, 0xe2de], /* Private Use */
- [0xe2df, 0xe2df], /* Private Use */
- [0xe2e0, 0xe2e0], /* Private Use */
- [0xe2e1, 0xe2e1], /* Private Use */
- [0xe2e2, 0xe2e2], /* Private Use */
- [0xe2e3, 0xe2e3], /* Private Use */
- [0xe2e4, 0xe2e4], /* Private Use */
- [0xe2e5, 0xe2e5], /* Private Use */
- [0xe2e6, 0xe2e6], /* Private Use */
- [0xe2e7, 0xe2e7], /* Private Use */
- [0xe2e8, 0xe2e8], /* Private Use */
- [0xe2e9, 0xe2e9], /* Private Use */
- [0xe2ea, 0xe2ea], /* Private Use */
- [0xe2eb, 0xe2eb], /* Private Use */
- [0xe2ec, 0xe2ec], /* Private Use */
- [0xe2ed, 0xe2ed], /* Private Use */
- [0xe2ee, 0xe2ee], /* Private Use */
- [0xe2ef, 0xe2ef], /* Private Use */
- [0xe2f0, 0xe2f0], /* Private Use */
- [0xe2f1, 0xe2f1], /* Private Use */
- [0xe2f2, 0xe2f2], /* Private Use */
- [0xe2f3, 0xe2f3], /* Private Use */
- [0xe2f4, 0xe2f4], /* Private Use */
- [0xe2f5, 0xe2f5], /* Private Use */
- [0xe2f6, 0xe2f6], /* Private Use */
- [0xe2f7, 0xe2f7], /* Private Use */
- [0xe2f8, 0xe2f8], /* Private Use */
- [0xe2f9, 0xe2f9], /* Private Use */
- [0xe2fa, 0xe2fa], /* Private Use */
- [0xe2fb, 0xe2fb], /* Private Use */
- [0xe2fc, 0xe2fc], /* Private Use */
- [0xe2fd, 0xe2fd], /* Private Use */
- [0xe2fe, 0xe2fe], /* Private Use */
- [0xe2ff, 0xe2ff], /* Private Use */
- [0xe300, 0xe300], /* Private Use */
- [0xe301, 0xe301], /* Private Use */
- [0xe302, 0xe302], /* Private Use */
- [0xe303, 0xe303], /* Private Use */
- [0xe304, 0xe304], /* Private Use */
- [0xe305, 0xe305], /* Private Use */
- [0xe306, 0xe306], /* Private Use */
- [0xe307, 0xe307], /* Private Use */
- [0xe308, 0xe308], /* Private Use */
- [0xe309, 0xe309], /* Private Use */
- [0xe30a, 0xe30a], /* Private Use */
- [0xe30b, 0xe30b], /* Private Use */
- [0xe30c, 0xe30c], /* Private Use */
- [0xe30d, 0xe30d], /* Private Use */
- [0xe30e, 0xe30e], /* Private Use */
- [0xe30f, 0xe30f], /* Private Use */
- [0xe310, 0xe310], /* Private Use */
- [0xe311, 0xe311], /* Private Use */
- [0xe312, 0xe312], /* Private Use */
- [0xe313, 0xe313], /* Private Use */
- [0xe314, 0xe314], /* Private Use */
- [0xe315, 0xe315], /* Private Use */
- [0xe316, 0xe316], /* Private Use */
- [0xe317, 0xe317], /* Private Use */
- [0xe318, 0xe318], /* Private Use */
- [0xe319, 0xe319], /* Private Use */
- [0xe31a, 0xe31a], /* Private Use */
- [0xe31b, 0xe31b], /* Private Use */
- [0xe31c, 0xe31c], /* Private Use */
- [0xe31d, 0xe31d], /* Private Use */
- [0xe31e, 0xe31e], /* Private Use */
- [0xe31f, 0xe31f], /* Private Use */
- [0xe320, 0xe320], /* Private Use */
- [0xe321, 0xe321], /* Private Use */
- [0xe322, 0xe322], /* Private Use */
- [0xe323, 0xe323], /* Private Use */
- [0xe324, 0xe324], /* Private Use */
- [0xe325, 0xe325], /* Private Use */
- [0xe326, 0xe326], /* Private Use */
- [0xe327, 0xe327], /* Private Use */
- [0xe328, 0xe328], /* Private Use */
- [0xe329, 0xe329], /* Private Use */
- [0xe32a, 0xe32a], /* Private Use */
- [0xe32b, 0xe32b], /* Private Use */
- [0xe32c, 0xe32c], /* Private Use */
- [0xe32d, 0xe32d], /* Private Use */
- [0xe32e, 0xe32e], /* Private Use */
- [0xe32f, 0xe32f], /* Private Use */
- [0xe330, 0xe330], /* Private Use */
- [0xe331, 0xe331], /* Private Use */
- [0xe332, 0xe332], /* Private Use */
- [0xe333, 0xe333], /* Private Use */
- [0xe334, 0xe334], /* Private Use */
- [0xe335, 0xe335], /* Private Use */
- [0xe336, 0xe336], /* Private Use */
- [0xe337, 0xe337], /* Private Use */
- [0xe338, 0xe338], /* Private Use */
- [0xe339, 0xe339], /* Private Use */
- [0xe33a, 0xe33a], /* Private Use */
- [0xe33b, 0xe33b], /* Private Use */
- [0xe33c, 0xe33c], /* Private Use */
- [0xe33d, 0xe33d], /* Private Use */
- [0xe33e, 0xe33e], /* Private Use */
- [0xe33f, 0xe33f], /* Private Use */
- [0xe340, 0xe340], /* Private Use */
- [0xe341, 0xe341], /* Private Use */
- [0xe342, 0xe342], /* Private Use */
- [0xe343, 0xe343], /* Private Use */
- [0xe344, 0xe344], /* Private Use */
- [0xe345, 0xe345], /* Private Use */
- [0xe346, 0xe346], /* Private Use */
- [0xe347, 0xe347], /* Private Use */
- [0xe348, 0xe348], /* Private Use */
- [0xe349, 0xe349], /* Private Use */
- [0xe34a, 0xe34a], /* Private Use */
- [0xe34b, 0xe34b], /* Private Use */
- [0xe34c, 0xe34c], /* Private Use */
- [0xe34d, 0xe34d], /* Private Use */
- [0xe34e, 0xe34e], /* Private Use */
- [0xe34f, 0xe34f], /* Private Use */
- [0xe350, 0xe350], /* Private Use */
- [0xe351, 0xe351], /* Private Use */
- [0xe352, 0xe352], /* Private Use */
- [0xe353, 0xe353], /* Private Use */
- [0xe354, 0xe354], /* Private Use */
- [0xe355, 0xe355], /* Private Use */
- [0xe356, 0xe356], /* Private Use */
- [0xe357, 0xe357], /* Private Use */
- [0xe358, 0xe358], /* Private Use */
- [0xe359, 0xe359], /* Private Use */
- [0xe35a, 0xe35a], /* Private Use */
- [0xe35b, 0xe35b], /* Private Use */
- [0xe35c, 0xe35c], /* Private Use */
- [0xe35d, 0xe35d], /* Private Use */
- [0xe35e, 0xe35e], /* Private Use */
- [0xe35f, 0xe35f], /* Private Use */
- [0xe360, 0xe360], /* Private Use */
- [0xe361, 0xe361], /* Private Use */
- [0xe362, 0xe362], /* Private Use */
- [0xe363, 0xe363], /* Private Use */
- [0xe364, 0xe364], /* Private Use */
- [0xe365, 0xe365], /* Private Use */
- [0xe366, 0xe366], /* Private Use */
- [0xe367, 0xe367], /* Private Use */
- [0xe368, 0xe368], /* Private Use */
- [0xe369, 0xe369], /* Private Use */
- [0xe36a, 0xe36a], /* Private Use */
- [0xe36b, 0xe36b], /* Private Use */
- [0xe36c, 0xe36c], /* Private Use */
- [0xe36d, 0xe36d], /* Private Use */
- [0xe36e, 0xe36e], /* Private Use */
- [0xe36f, 0xe36f], /* Private Use */
- [0xe370, 0xe370], /* Private Use */
- [0xe371, 0xe371], /* Private Use */
- [0xe372, 0xe372], /* Private Use */
- [0xe373, 0xe373], /* Private Use */
- [0xe374, 0xe374], /* Private Use */
- [0xe375, 0xe375], /* Private Use */
- [0xe376, 0xe376], /* Private Use */
- [0xe377, 0xe377], /* Private Use */
- [0xe378, 0xe378], /* Private Use */
- [0xe379, 0xe379], /* Private Use */
- [0xe37a, 0xe37a], /* Private Use */
- [0xe37b, 0xe37b], /* Private Use */
- [0xe37c, 0xe37c], /* Private Use */
- [0xe37d, 0xe37d], /* Private Use */
- [0xe37e, 0xe37e], /* Private Use */
- [0xe37f, 0xe37f], /* Private Use */
- [0xe380, 0xe380], /* Private Use */
- [0xe381, 0xe381], /* Private Use */
- [0xe382, 0xe382], /* Private Use */
- [0xe383, 0xe383], /* Private Use */
- [0xe384, 0xe384], /* Private Use */
- [0xe385, 0xe385], /* Private Use */
- [0xe386, 0xe386], /* Private Use */
- [0xe387, 0xe387], /* Private Use */
- [0xe388, 0xe388], /* Private Use */
- [0xe389, 0xe389], /* Private Use */
- [0xe38a, 0xe38a], /* Private Use */
- [0xe38b, 0xe38b], /* Private Use */
- [0xe38c, 0xe38c], /* Private Use */
- [0xe38d, 0xe38d], /* Private Use */
- [0xe38e, 0xe38e], /* Private Use */
- [0xe38f, 0xe38f], /* Private Use */
- [0xe390, 0xe390], /* Private Use */
- [0xe391, 0xe391], /* Private Use */
- [0xe392, 0xe392], /* Private Use */
- [0xe393, 0xe393], /* Private Use */
- [0xe394, 0xe394], /* Private Use */
- [0xe395, 0xe395], /* Private Use */
- [0xe396, 0xe396], /* Private Use */
- [0xe397, 0xe397], /* Private Use */
- [0xe398, 0xe398], /* Private Use */
- [0xe399, 0xe399], /* Private Use */
- [0xe39a, 0xe39a], /* Private Use */
- [0xe39b, 0xe39b], /* Private Use */
- [0xe39c, 0xe39c], /* Private Use */
- [0xe39d, 0xe39d], /* Private Use */
- [0xe39e, 0xe39e], /* Private Use */
- [0xe39f, 0xe39f], /* Private Use */
- [0xe3a0, 0xe3a0], /* Private Use */
- [0xe3a1, 0xe3a1], /* Private Use */
- [0xe3a2, 0xe3a2], /* Private Use */
- [0xe3a3, 0xe3a3], /* Private Use */
- [0xe3a4, 0xe3a4], /* Private Use */
- [0xe3a5, 0xe3a5], /* Private Use */
- [0xe3a6, 0xe3a6], /* Private Use */
- [0xe3a7, 0xe3a7], /* Private Use */
- [0xe3a8, 0xe3a8], /* Private Use */
- [0xe3a9, 0xe3a9], /* Private Use */
- [0xe3aa, 0xe3aa], /* Private Use */
- [0xe3ab, 0xe3ab], /* Private Use */
- [0xe3ac, 0xe3ac], /* Private Use */
- [0xe3ad, 0xe3ad], /* Private Use */
- [0xe3ae, 0xe3ae], /* Private Use */
- [0xe3af, 0xe3af], /* Private Use */
- [0xe3b0, 0xe3b0], /* Private Use */
- [0xe3b1, 0xe3b1], /* Private Use */
- [0xe3b2, 0xe3b2], /* Private Use */
- [0xe3b3, 0xe3b3], /* Private Use */
- [0xe3b4, 0xe3b4], /* Private Use */
- [0xe3b5, 0xe3b5], /* Private Use */
- [0xe3b6, 0xe3b6], /* Private Use */
- [0xe3b7, 0xe3b7], /* Private Use */
- [0xe3b8, 0xe3b8], /* Private Use */
- [0xe3b9, 0xe3b9], /* Private Use */
- [0xe3ba, 0xe3ba], /* Private Use */
- [0xe3bb, 0xe3bb], /* Private Use */
- [0xe3bc, 0xe3bc], /* Private Use */
- [0xe3bd, 0xe3bd], /* Private Use */
- [0xe3be, 0xe3be], /* Private Use */
- [0xe3bf, 0xe3bf], /* Private Use */
- [0xe3c0, 0xe3c0], /* Private Use */
- [0xe3c1, 0xe3c1], /* Private Use */
- [0xe3c2, 0xe3c2], /* Private Use */
- [0xe3c3, 0xe3c3], /* Private Use */
- [0xe3c4, 0xe3c4], /* Private Use */
- [0xe3c5, 0xe3c5], /* Private Use */
- [0xe3c6, 0xe3c6], /* Private Use */
- [0xe3c7, 0xe3c7], /* Private Use */
- [0xe3c8, 0xe3c8], /* Private Use */
- [0xe3c9, 0xe3c9], /* Private Use */
- [0xe3ca, 0xe3ca], /* Private Use */
- [0xe3cb, 0xe3cb], /* Private Use */
- [0xe3cc, 0xe3cc], /* Private Use */
- [0xe3cd, 0xe3cd], /* Private Use */
- [0xe3ce, 0xe3ce], /* Private Use */
- [0xe3cf, 0xe3cf], /* Private Use */
- [0xe3d0, 0xe3d0], /* Private Use */
- [0xe3d1, 0xe3d1], /* Private Use */
- [0xe3d2, 0xe3d2], /* Private Use */
- [0xe3d3, 0xe3d3], /* Private Use */
- [0xe3d4, 0xe3d4], /* Private Use */
- [0xe3d5, 0xe3d5], /* Private Use */
- [0xe3d6, 0xe3d6], /* Private Use */
- [0xe3d7, 0xe3d7], /* Private Use */
- [0xe3d8, 0xe3d8], /* Private Use */
- [0xe3d9, 0xe3d9], /* Private Use */
- [0xe3da, 0xe3da], /* Private Use */
- [0xe3db, 0xe3db], /* Private Use */
- [0xe3dc, 0xe3dc], /* Private Use */
- [0xe3dd, 0xe3dd], /* Private Use */
- [0xe3de, 0xe3de], /* Private Use */
- [0xe3df, 0xe3df], /* Private Use */
- [0xe3e0, 0xe3e0], /* Private Use */
- [0xe3e1, 0xe3e1], /* Private Use */
- [0xe3e2, 0xe3e2], /* Private Use */
- [0xe3e3, 0xe3e3], /* Private Use */
- [0xe3e4, 0xe3e4], /* Private Use */
- [0xe3e5, 0xe3e5], /* Private Use */
- [0xe3e6, 0xe3e6], /* Private Use */
- [0xe3e7, 0xe3e7], /* Private Use */
- [0xe3e8, 0xe3e8], /* Private Use */
- [0xe3e9, 0xe3e9], /* Private Use */
- [0xe3ea, 0xe3ea], /* Private Use */
- [0xe3eb, 0xe3eb], /* Private Use */
- [0xe3ec, 0xe3ec], /* Private Use */
- [0xe3ed, 0xe3ed], /* Private Use */
- [0xe3ee, 0xe3ee], /* Private Use */
- [0xe3ef, 0xe3ef], /* Private Use */
- [0xe3f0, 0xe3f0], /* Private Use */
- [0xe3f1, 0xe3f1], /* Private Use */
- [0xe3f2, 0xe3f2], /* Private Use */
- [0xe3f3, 0xe3f3], /* Private Use */
- [0xe3f4, 0xe3f4], /* Private Use */
- [0xe3f5, 0xe3f5], /* Private Use */
- [0xe3f6, 0xe3f6], /* Private Use */
- [0xe3f7, 0xe3f7], /* Private Use */
- [0xe3f8, 0xe3f8], /* Private Use */
- [0xe3f9, 0xe3f9], /* Private Use */
- [0xe3fa, 0xe3fa], /* Private Use */
- [0xe3fb, 0xe3fb], /* Private Use */
- [0xe3fc, 0xe3fc], /* Private Use */
- [0xe3fd, 0xe3fd], /* Private Use */
- [0xe3fe, 0xe3fe], /* Private Use */
- [0xe3ff, 0xe3ff], /* Private Use */
- [0xe400, 0xe400], /* Private Use */
- [0xe401, 0xe401], /* Private Use */
- [0xe402, 0xe402], /* Private Use */
- [0xe403, 0xe403], /* Private Use */
- [0xe404, 0xe404], /* Private Use */
- [0xe405, 0xe405], /* Private Use */
- [0xe406, 0xe406], /* Private Use */
- [0xe407, 0xe407], /* Private Use */
- [0xe408, 0xe408], /* Private Use */
- [0xe409, 0xe409], /* Private Use */
- [0xe40a, 0xe40a], /* Private Use */
- [0xe40b, 0xe40b], /* Private Use */
- [0xe40c, 0xe40c], /* Private Use */
- [0xe40d, 0xe40d], /* Private Use */
- [0xe40e, 0xe40e], /* Private Use */
- [0xe40f, 0xe40f], /* Private Use */
- [0xe410, 0xe410], /* Private Use */
- [0xe411, 0xe411], /* Private Use */
- [0xe412, 0xe412], /* Private Use */
- [0xe413, 0xe413], /* Private Use */
- [0xe414, 0xe414], /* Private Use */
- [0xe415, 0xe415], /* Private Use */
- [0xe416, 0xe416], /* Private Use */
- [0xe417, 0xe417], /* Private Use */
- [0xe418, 0xe418], /* Private Use */
- [0xe419, 0xe419], /* Private Use */
- [0xe41a, 0xe41a], /* Private Use */
- [0xe41b, 0xe41b], /* Private Use */
- [0xe41c, 0xe41c], /* Private Use */
- [0xe41d, 0xe41d], /* Private Use */
- [0xe41e, 0xe41e], /* Private Use */
- [0xe41f, 0xe41f], /* Private Use */
- [0xe420, 0xe420], /* Private Use */
- [0xe421, 0xe421], /* Private Use */
- [0xe422, 0xe422], /* Private Use */
- [0xe423, 0xe423], /* Private Use */
- [0xe424, 0xe424], /* Private Use */
- [0xe425, 0xe425], /* Private Use */
- [0xe426, 0xe426], /* Private Use */
- [0xe427, 0xe427], /* Private Use */
- [0xe428, 0xe428], /* Private Use */
- [0xe429, 0xe429], /* Private Use */
- [0xe42a, 0xe42a], /* Private Use */
- [0xe42b, 0xe42b], /* Private Use */
- [0xe42c, 0xe42c], /* Private Use */
- [0xe42d, 0xe42d], /* Private Use */
- [0xe42e, 0xe42e], /* Private Use */
- [0xe42f, 0xe42f], /* Private Use */
- [0xe430, 0xe430], /* Private Use */
- [0xe431, 0xe431], /* Private Use */
- [0xe432, 0xe432], /* Private Use */
- [0xe433, 0xe433], /* Private Use */
- [0xe434, 0xe434], /* Private Use */
- [0xe435, 0xe435], /* Private Use */
- [0xe436, 0xe436], /* Private Use */
- [0xe437, 0xe437], /* Private Use */
- [0xe438, 0xe438], /* Private Use */
- [0xe439, 0xe439], /* Private Use */
- [0xe43a, 0xe43a], /* Private Use */
- [0xe43b, 0xe43b], /* Private Use */
- [0xe43c, 0xe43c], /* Private Use */
- [0xe43d, 0xe43d], /* Private Use */
- [0xe43e, 0xe43e], /* Private Use */
- [0xe43f, 0xe43f], /* Private Use */
- [0xe440, 0xe440], /* Private Use */
- [0xe441, 0xe441], /* Private Use */
- [0xe442, 0xe442], /* Private Use */
- [0xe443, 0xe443], /* Private Use */
- [0xe444, 0xe444], /* Private Use */
- [0xe445, 0xe445], /* Private Use */
- [0xe446, 0xe446], /* Private Use */
- [0xe447, 0xe447], /* Private Use */
- [0xe448, 0xe448], /* Private Use */
- [0xe449, 0xe449], /* Private Use */
- [0xe44a, 0xe44a], /* Private Use */
- [0xe44b, 0xe44b], /* Private Use */
- [0xe44c, 0xe44c], /* Private Use */
- [0xe44d, 0xe44d], /* Private Use */
- [0xe44e, 0xe44e], /* Private Use */
- [0xe44f, 0xe44f], /* Private Use */
- [0xe450, 0xe450], /* Private Use */
- [0xe451, 0xe451], /* Private Use */
- [0xe452, 0xe452], /* Private Use */
- [0xe453, 0xe453], /* Private Use */
- [0xe454, 0xe454], /* Private Use */
- [0xe455, 0xe455], /* Private Use */
- [0xe456, 0xe456], /* Private Use */
- [0xe457, 0xe457], /* Private Use */
- [0xe458, 0xe458], /* Private Use */
- [0xe459, 0xe459], /* Private Use */
- [0xe45a, 0xe45a], /* Private Use */
- [0xe45b, 0xe45b], /* Private Use */
- [0xe45c, 0xe45c], /* Private Use */
- [0xe45d, 0xe45d], /* Private Use */
- [0xe45e, 0xe45e], /* Private Use */
- [0xe45f, 0xe45f], /* Private Use */
- [0xe460, 0xe460], /* Private Use */
- [0xe461, 0xe461], /* Private Use */
- [0xe462, 0xe462], /* Private Use */
- [0xe463, 0xe463], /* Private Use */
- [0xe464, 0xe464], /* Private Use */
- [0xe465, 0xe465], /* Private Use */
- [0xe466, 0xe466], /* Private Use */
- [0xe467, 0xe467], /* Private Use */
- [0xe468, 0xe468], /* Private Use */
- [0xe469, 0xe469], /* Private Use */
- [0xe46a, 0xe46a], /* Private Use */
- [0xe46b, 0xe46b], /* Private Use */
- [0xe46c, 0xe46c], /* Private Use */
- [0xe46d, 0xe46d], /* Private Use */
- [0xe46e, 0xe46e], /* Private Use */
- [0xe46f, 0xe46f], /* Private Use */
- [0xe470, 0xe470], /* Private Use */
- [0xe471, 0xe471], /* Private Use */
- [0xe472, 0xe472], /* Private Use */
- [0xe473, 0xe473], /* Private Use */
- [0xe474, 0xe474], /* Private Use */
- [0xe475, 0xe475], /* Private Use */
- [0xe476, 0xe476], /* Private Use */
- [0xe477, 0xe477], /* Private Use */
- [0xe478, 0xe478], /* Private Use */
- [0xe479, 0xe479], /* Private Use */
- [0xe47a, 0xe47a], /* Private Use */
- [0xe47b, 0xe47b], /* Private Use */
- [0xe47c, 0xe47c], /* Private Use */
- [0xe47d, 0xe47d], /* Private Use */
- [0xe47e, 0xe47e], /* Private Use */
- [0xe47f, 0xe47f], /* Private Use */
- [0xe480, 0xe480], /* Private Use */
- [0xe481, 0xe481], /* Private Use */
- [0xe482, 0xe482], /* Private Use */
- [0xe483, 0xe483], /* Private Use */
- [0xe484, 0xe484], /* Private Use */
- [0xe485, 0xe485], /* Private Use */
- [0xe486, 0xe486], /* Private Use */
- [0xe487, 0xe487], /* Private Use */
- [0xe488, 0xe488], /* Private Use */
- [0xe489, 0xe489], /* Private Use */
- [0xe48a, 0xe48a], /* Private Use */
- [0xe48b, 0xe48b], /* Private Use */
- [0xe48c, 0xe48c], /* Private Use */
- [0xe48d, 0xe48d], /* Private Use */
- [0xe48e, 0xe48e], /* Private Use */
- [0xe48f, 0xe48f], /* Private Use */
- [0xe490, 0xe490], /* Private Use */
- [0xe491, 0xe491], /* Private Use */
- [0xe492, 0xe492], /* Private Use */
- [0xe493, 0xe493], /* Private Use */
- [0xe494, 0xe494], /* Private Use */
- [0xe495, 0xe495], /* Private Use */
- [0xe496, 0xe496], /* Private Use */
- [0xe497, 0xe497], /* Private Use */
- [0xe498, 0xe498], /* Private Use */
- [0xe499, 0xe499], /* Private Use */
- [0xe49a, 0xe49a], /* Private Use */
- [0xe49b, 0xe49b], /* Private Use */
- [0xe49c, 0xe49c], /* Private Use */
- [0xe49d, 0xe49d], /* Private Use */
- [0xe49e, 0xe49e], /* Private Use */
- [0xe49f, 0xe49f], /* Private Use */
- [0xe4a0, 0xe4a0], /* Private Use */
- [0xe4a1, 0xe4a1], /* Private Use */
- [0xe4a2, 0xe4a2], /* Private Use */
- [0xe4a3, 0xe4a3], /* Private Use */
- [0xe4a4, 0xe4a4], /* Private Use */
- [0xe4a5, 0xe4a5], /* Private Use */
- [0xe4a6, 0xe4a6], /* Private Use */
- [0xe4a7, 0xe4a7], /* Private Use */
- [0xe4a8, 0xe4a8], /* Private Use */
- [0xe4a9, 0xe4a9], /* Private Use */
- [0xe4aa, 0xe4aa], /* Private Use */
- [0xe4ab, 0xe4ab], /* Private Use */
- [0xe4ac, 0xe4ac], /* Private Use */
- [0xe4ad, 0xe4ad], /* Private Use */
- [0xe4ae, 0xe4ae], /* Private Use */
- [0xe4af, 0xe4af], /* Private Use */
- [0xe4b0, 0xe4b0], /* Private Use */
- [0xe4b1, 0xe4b1], /* Private Use */
- [0xe4b2, 0xe4b2], /* Private Use */
- [0xe4b3, 0xe4b3], /* Private Use */
- [0xe4b4, 0xe4b4], /* Private Use */
- [0xe4b5, 0xe4b5], /* Private Use */
- [0xe4b6, 0xe4b6], /* Private Use */
- [0xe4b7, 0xe4b7], /* Private Use */
- [0xe4b8, 0xe4b8], /* Private Use */
- [0xe4b9, 0xe4b9], /* Private Use */
- [0xe4ba, 0xe4ba], /* Private Use */
- [0xe4bb, 0xe4bb], /* Private Use */
- [0xe4bc, 0xe4bc], /* Private Use */
- [0xe4bd, 0xe4bd], /* Private Use */
- [0xe4be, 0xe4be], /* Private Use */
- [0xe4bf, 0xe4bf], /* Private Use */
- [0xe4c0, 0xe4c0], /* Private Use */
- [0xe4c1, 0xe4c1], /* Private Use */
- [0xe4c2, 0xe4c2], /* Private Use */
- [0xe4c3, 0xe4c3], /* Private Use */
- [0xe4c4, 0xe4c4], /* Private Use */
- [0xe4c5, 0xe4c5], /* Private Use */
- [0xe4c6, 0xe4c6], /* Private Use */
- [0xe4c7, 0xe4c7], /* Private Use */
- [0xe4c8, 0xe4c8], /* Private Use */
- [0xe4c9, 0xe4c9], /* Private Use */
- [0xe4ca, 0xe4ca], /* Private Use */
- [0xe4cb, 0xe4cb], /* Private Use */
- [0xe4cc, 0xe4cc], /* Private Use */
- [0xe4cd, 0xe4cd], /* Private Use */
- [0xe4ce, 0xe4ce], /* Private Use */
- [0xe4cf, 0xe4cf], /* Private Use */
- [0xe4d0, 0xe4d0], /* Private Use */
- [0xe4d1, 0xe4d1], /* Private Use */
- [0xe4d2, 0xe4d2], /* Private Use */
- [0xe4d3, 0xe4d3], /* Private Use */
- [0xe4d4, 0xe4d4], /* Private Use */
- [0xe4d5, 0xe4d5], /* Private Use */
- [0xe4d6, 0xe4d6], /* Private Use */
- [0xe4d7, 0xe4d7], /* Private Use */
- [0xe4d8, 0xe4d8], /* Private Use */
- [0xe4d9, 0xe4d9], /* Private Use */
- [0xe4da, 0xe4da], /* Private Use */
- [0xe4db, 0xe4db], /* Private Use */
- [0xe4dc, 0xe4dc], /* Private Use */
- [0xe4dd, 0xe4dd], /* Private Use */
- [0xe4de, 0xe4de], /* Private Use */
- [0xe4df, 0xe4df], /* Private Use */
- [0xe4e0, 0xe4e0], /* Private Use */
- [0xe4e1, 0xe4e1], /* Private Use */
- [0xe4e2, 0xe4e2], /* Private Use */
- [0xe4e3, 0xe4e3], /* Private Use */
- [0xe4e4, 0xe4e4], /* Private Use */
- [0xe4e5, 0xe4e5], /* Private Use */
- [0xe4e6, 0xe4e6], /* Private Use */
- [0xe4e7, 0xe4e7], /* Private Use */
- [0xe4e8, 0xe4e8], /* Private Use */
- [0xe4e9, 0xe4e9], /* Private Use */
- [0xe4ea, 0xe4ea], /* Private Use */
- [0xe4eb, 0xe4eb], /* Private Use */
- [0xe4ec, 0xe4ec], /* Private Use */
- [0xe4ed, 0xe4ed], /* Private Use */
- [0xe4ee, 0xe4ee], /* Private Use */
- [0xe4ef, 0xe4ef], /* Private Use */
- [0xe4f0, 0xe4f0], /* Private Use */
- [0xe4f1, 0xe4f1], /* Private Use */
- [0xe4f2, 0xe4f2], /* Private Use */
- [0xe4f3, 0xe4f3], /* Private Use */
- [0xe4f4, 0xe4f4], /* Private Use */
- [0xe4f5, 0xe4f5], /* Private Use */
- [0xe4f6, 0xe4f6], /* Private Use */
- [0xe4f7, 0xe4f7], /* Private Use */
- [0xe4f8, 0xe4f8], /* Private Use */
- [0xe4f9, 0xe4f9], /* Private Use */
- [0xe4fa, 0xe4fa], /* Private Use */
- [0xe4fb, 0xe4fb], /* Private Use */
- [0xe4fc, 0xe4fc], /* Private Use */
- [0xe4fd, 0xe4fd], /* Private Use */
- [0xe4fe, 0xe4fe], /* Private Use */
- [0xe4ff, 0xe4ff], /* Private Use */
- [0xe500, 0xe500], /* Private Use */
- [0xe501, 0xe501], /* Private Use */
- [0xe502, 0xe502], /* Private Use */
- [0xe503, 0xe503], /* Private Use */
- [0xe504, 0xe504], /* Private Use */
- [0xe505, 0xe505], /* Private Use */
- [0xe506, 0xe506], /* Private Use */
- [0xe507, 0xe507], /* Private Use */
- [0xe508, 0xe508], /* Private Use */
- [0xe509, 0xe509], /* Private Use */
- [0xe50a, 0xe50a], /* Private Use */
- [0xe50b, 0xe50b], /* Private Use */
- [0xe50c, 0xe50c], /* Private Use */
- [0xe50d, 0xe50d], /* Private Use */
- [0xe50e, 0xe50e], /* Private Use */
- [0xe50f, 0xe50f], /* Private Use */
- [0xe510, 0xe510], /* Private Use */
- [0xe511, 0xe511], /* Private Use */
- [0xe512, 0xe512], /* Private Use */
- [0xe513, 0xe513], /* Private Use */
- [0xe514, 0xe514], /* Private Use */
- [0xe515, 0xe515], /* Private Use */
- [0xe516, 0xe516], /* Private Use */
- [0xe517, 0xe517], /* Private Use */
- [0xe518, 0xe518], /* Private Use */
- [0xe519, 0xe519], /* Private Use */
- [0xe51a, 0xe51a], /* Private Use */
- [0xe51b, 0xe51b], /* Private Use */
- [0xe51c, 0xe51c], /* Private Use */
- [0xe51d, 0xe51d], /* Private Use */
- [0xe51e, 0xe51e], /* Private Use */
- [0xe51f, 0xe51f], /* Private Use */
- [0xe520, 0xe520], /* Private Use */
- [0xe521, 0xe521], /* Private Use */
- [0xe522, 0xe522], /* Private Use */
- [0xe523, 0xe523], /* Private Use */
- [0xe524, 0xe524], /* Private Use */
- [0xe525, 0xe525], /* Private Use */
- [0xe526, 0xe526], /* Private Use */
- [0xe527, 0xe527], /* Private Use */
- [0xe528, 0xe528], /* Private Use */
- [0xe529, 0xe529], /* Private Use */
- [0xe52a, 0xe52a], /* Private Use */
- [0xe52b, 0xe52b], /* Private Use */
- [0xe52c, 0xe52c], /* Private Use */
- [0xe52d, 0xe52d], /* Private Use */
- [0xe52e, 0xe52e], /* Private Use */
- [0xe52f, 0xe52f], /* Private Use */
- [0xe530, 0xe530], /* Private Use */
- [0xe531, 0xe531], /* Private Use */
- [0xe532, 0xe532], /* Private Use */
- [0xe533, 0xe533], /* Private Use */
- [0xe534, 0xe534], /* Private Use */
- [0xe535, 0xe535], /* Private Use */
- [0xe536, 0xe536], /* Private Use */
- [0xe537, 0xe537], /* Private Use */
- [0xe538, 0xe538], /* Private Use */
- [0xe539, 0xe539], /* Private Use */
- [0xe53a, 0xe53a], /* Private Use */
- [0xe53b, 0xe53b], /* Private Use */
- [0xe53c, 0xe53c], /* Private Use */
- [0xe53d, 0xe53d], /* Private Use */
- [0xe53e, 0xe53e], /* Private Use */
- [0xe53f, 0xe53f], /* Private Use */
- [0xe540, 0xe540], /* Private Use */
- [0xe541, 0xe541], /* Private Use */
- [0xe542, 0xe542], /* Private Use */
- [0xe543, 0xe543], /* Private Use */
- [0xe544, 0xe544], /* Private Use */
- [0xe545, 0xe545], /* Private Use */
- [0xe546, 0xe546], /* Private Use */
- [0xe547, 0xe547], /* Private Use */
- [0xe548, 0xe548], /* Private Use */
- [0xe549, 0xe549], /* Private Use */
- [0xe54a, 0xe54a], /* Private Use */
- [0xe54b, 0xe54b], /* Private Use */
- [0xe54c, 0xe54c], /* Private Use */
- [0xe54d, 0xe54d], /* Private Use */
- [0xe54e, 0xe54e], /* Private Use */
- [0xe54f, 0xe54f], /* Private Use */
- [0xe550, 0xe550], /* Private Use */
- [0xe551, 0xe551], /* Private Use */
- [0xe552, 0xe552], /* Private Use */
- [0xe553, 0xe553], /* Private Use */
- [0xe554, 0xe554], /* Private Use */
- [0xe555, 0xe555], /* Private Use */
- [0xe556, 0xe556], /* Private Use */
- [0xe557, 0xe557], /* Private Use */
- [0xe558, 0xe558], /* Private Use */
- [0xe559, 0xe559], /* Private Use */
- [0xe55a, 0xe55a], /* Private Use */
- [0xe55b, 0xe55b], /* Private Use */
- [0xe55c, 0xe55c], /* Private Use */
- [0xe55d, 0xe55d], /* Private Use */
- [0xe55e, 0xe55e], /* Private Use */
- [0xe55f, 0xe55f], /* Private Use */
- [0xe560, 0xe560], /* Private Use */
- [0xe561, 0xe561], /* Private Use */
- [0xe562, 0xe562], /* Private Use */
- [0xe563, 0xe563], /* Private Use */
- [0xe564, 0xe564], /* Private Use */
- [0xe565, 0xe565], /* Private Use */
- [0xe566, 0xe566], /* Private Use */
- [0xe567, 0xe567], /* Private Use */
- [0xe568, 0xe568], /* Private Use */
- [0xe569, 0xe569], /* Private Use */
- [0xe56a, 0xe56a], /* Private Use */
- [0xe56b, 0xe56b], /* Private Use */
- [0xe56c, 0xe56c], /* Private Use */
- [0xe56d, 0xe56d], /* Private Use */
- [0xe56e, 0xe56e], /* Private Use */
- [0xe56f, 0xe56f], /* Private Use */
- [0xe570, 0xe570], /* Private Use */
- [0xe571, 0xe571], /* Private Use */
- [0xe572, 0xe572], /* Private Use */
- [0xe573, 0xe573], /* Private Use */
- [0xe574, 0xe574], /* Private Use */
- [0xe575, 0xe575], /* Private Use */
- [0xe576, 0xe576], /* Private Use */
- [0xe577, 0xe577], /* Private Use */
- [0xe578, 0xe578], /* Private Use */
- [0xe579, 0xe579], /* Private Use */
- [0xe57a, 0xe57a], /* Private Use */
- [0xe57b, 0xe57b], /* Private Use */
- [0xe57c, 0xe57c], /* Private Use */
- [0xe57d, 0xe57d], /* Private Use */
- [0xe57e, 0xe57e], /* Private Use */
- [0xe57f, 0xe57f], /* Private Use */
- [0xe580, 0xe580], /* Private Use */
- [0xe581, 0xe581], /* Private Use */
- [0xe582, 0xe582], /* Private Use */
- [0xe583, 0xe583], /* Private Use */
- [0xe584, 0xe584], /* Private Use */
- [0xe585, 0xe585], /* Private Use */
- [0xe586, 0xe586], /* Private Use */
- [0xe587, 0xe587], /* Private Use */
- [0xe588, 0xe588], /* Private Use */
- [0xe589, 0xe589], /* Private Use */
- [0xe58a, 0xe58a], /* Private Use */
- [0xe58b, 0xe58b], /* Private Use */
- [0xe58c, 0xe58c], /* Private Use */
- [0xe58d, 0xe58d], /* Private Use */
- [0xe58e, 0xe58e], /* Private Use */
- [0xe58f, 0xe58f], /* Private Use */
- [0xe590, 0xe590], /* Private Use */
- [0xe591, 0xe591], /* Private Use */
- [0xe592, 0xe592], /* Private Use */
- [0xe593, 0xe593], /* Private Use */
- [0xe594, 0xe594], /* Private Use */
- [0xe595, 0xe595], /* Private Use */
- [0xe596, 0xe596], /* Private Use */
- [0xe597, 0xe597], /* Private Use */
- [0xe598, 0xe598], /* Private Use */
- [0xe599, 0xe599], /* Private Use */
- [0xe59a, 0xe59a], /* Private Use */
- [0xe59b, 0xe59b], /* Private Use */
- [0xe59c, 0xe59c], /* Private Use */
- [0xe59d, 0xe59d], /* Private Use */
- [0xe59e, 0xe59e], /* Private Use */
- [0xe59f, 0xe59f], /* Private Use */
- [0xe5a0, 0xe5a0], /* Private Use */
- [0xe5a1, 0xe5a1], /* Private Use */
- [0xe5a2, 0xe5a2], /* Private Use */
- [0xe5a3, 0xe5a3], /* Private Use */
- [0xe5a4, 0xe5a4], /* Private Use */
- [0xe5a5, 0xe5a5], /* Private Use */
- [0xe5a6, 0xe5a6], /* Private Use */
- [0xe5a7, 0xe5a7], /* Private Use */
- [0xe5a8, 0xe5a8], /* Private Use */
- [0xe5a9, 0xe5a9], /* Private Use */
- [0xe5aa, 0xe5aa], /* Private Use */
- [0xe5ab, 0xe5ab], /* Private Use */
- [0xe5ac, 0xe5ac], /* Private Use */
- [0xe5ad, 0xe5ad], /* Private Use */
- [0xe5ae, 0xe5ae], /* Private Use */
- [0xe5af, 0xe5af], /* Private Use */
- [0xe5b0, 0xe5b0], /* Private Use */
- [0xe5b1, 0xe5b1], /* Private Use */
- [0xe5b2, 0xe5b2], /* Private Use */
- [0xe5b3, 0xe5b3], /* Private Use */
- [0xe5b4, 0xe5b4], /* Private Use */
- [0xe5b5, 0xe5b5], /* Private Use */
- [0xe5b6, 0xe5b6], /* Private Use */
- [0xe5b7, 0xe5b7], /* Private Use */
- [0xe5b8, 0xe5b8], /* Private Use */
- [0xe5b9, 0xe5b9], /* Private Use */
- [0xe5ba, 0xe5ba], /* Private Use */
- [0xe5bb, 0xe5bb], /* Private Use */
- [0xe5bc, 0xe5bc], /* Private Use */
- [0xe5bd, 0xe5bd], /* Private Use */
- [0xe5be, 0xe5be], /* Private Use */
- [0xe5bf, 0xe5bf], /* Private Use */
- [0xe5c0, 0xe5c0], /* Private Use */
- [0xe5c1, 0xe5c1], /* Private Use */
- [0xe5c2, 0xe5c2], /* Private Use */
- [0xe5c3, 0xe5c3], /* Private Use */
- [0xe5c4, 0xe5c4], /* Private Use */
- [0xe5c5, 0xe5c5], /* Private Use */
- [0xe5c6, 0xe5c6], /* Private Use */
- [0xe5c7, 0xe5c7], /* Private Use */
- [0xe5c8, 0xe5c8], /* Private Use */
- [0xe5c9, 0xe5c9], /* Private Use */
- [0xe5ca, 0xe5ca], /* Private Use */
- [0xe5cb, 0xe5cb], /* Private Use */
- [0xe5cc, 0xe5cc], /* Private Use */
- [0xe5cd, 0xe5cd], /* Private Use */
- [0xe5ce, 0xe5ce], /* Private Use */
- [0xe5cf, 0xe5cf], /* Private Use */
- [0xe5d0, 0xe5d0], /* Private Use */
- [0xe5d1, 0xe5d1], /* Private Use */
- [0xe5d2, 0xe5d2], /* Private Use */
- [0xe5d3, 0xe5d3], /* Private Use */
- [0xe5d4, 0xe5d4], /* Private Use */
- [0xe5d5, 0xe5d5], /* Private Use */
- [0xe5d6, 0xe5d6], /* Private Use */
- [0xe5d7, 0xe5d7], /* Private Use */
- [0xe5d8, 0xe5d8], /* Private Use */
- [0xe5d9, 0xe5d9], /* Private Use */
- [0xe5da, 0xe5da], /* Private Use */
- [0xe5db, 0xe5db], /* Private Use */
- [0xe5dc, 0xe5dc], /* Private Use */
- [0xe5dd, 0xe5dd], /* Private Use */
- [0xe5de, 0xe5de], /* Private Use */
- [0xe5df, 0xe5df], /* Private Use */
- [0xe5e0, 0xe5e0], /* Private Use */
- [0xe5e1, 0xe5e1], /* Private Use */
- [0xe5e2, 0xe5e2], /* Private Use */
- [0xe5e3, 0xe5e3], /* Private Use */
- [0xe5e4, 0xe5e4], /* Private Use */
- [0xe5e5, 0xe5e5], /* Private Use */
- [0xe5e6, 0xe5e6], /* Private Use */
- [0xe5e7, 0xe5e7], /* Private Use */
- [0xe5e8, 0xe5e8], /* Private Use */
- [0xe5e9, 0xe5e9], /* Private Use */
- [0xe5ea, 0xe5ea], /* Private Use */
- [0xe5eb, 0xe5eb], /* Private Use */
- [0xe5ec, 0xe5ec], /* Private Use */
- [0xe5ed, 0xe5ed], /* Private Use */
- [0xe5ee, 0xe5ee], /* Private Use */
- [0xe5ef, 0xe5ef], /* Private Use */
- [0xe5f0, 0xe5f0], /* Private Use */
- [0xe5f1, 0xe5f1], /* Private Use */
- [0xe5f2, 0xe5f2], /* Private Use */
- [0xe5f3, 0xe5f3], /* Private Use */
- [0xe5f4, 0xe5f4], /* Private Use */
- [0xe5f5, 0xe5f5], /* Private Use */
- [0xe5f6, 0xe5f6], /* Private Use */
- [0xe5f7, 0xe5f7], /* Private Use */
- [0xe5f8, 0xe5f8], /* Private Use */
- [0xe5f9, 0xe5f9], /* Private Use */
- [0xe5fa, 0xe5fa], /* Private Use */
- [0xe5fb, 0xe5fb], /* Private Use */
- [0xe5fc, 0xe5fc], /* Private Use */
- [0xe5fd, 0xe5fd], /* Private Use */
- [0xe5fe, 0xe5fe], /* Private Use */
- [0xe5ff, 0xe5ff], /* Private Use */
- [0xe600, 0xe600], /* Private Use */
- [0xe601, 0xe601], /* Private Use */
- [0xe602, 0xe602], /* Private Use */
- [0xe603, 0xe603], /* Private Use */
- [0xe604, 0xe604], /* Private Use */
- [0xe605, 0xe605], /* Private Use */
- [0xe606, 0xe606], /* Private Use */
- [0xe607, 0xe607], /* Private Use */
- [0xe608, 0xe608], /* Private Use */
- [0xe609, 0xe609], /* Private Use */
- [0xe60a, 0xe60a], /* Private Use */
- [0xe60b, 0xe60b], /* Private Use */
- [0xe60c, 0xe60c], /* Private Use */
- [0xe60d, 0xe60d], /* Private Use */
- [0xe60e, 0xe60e], /* Private Use */
- [0xe60f, 0xe60f], /* Private Use */
- [0xe610, 0xe610], /* Private Use */
- [0xe611, 0xe611], /* Private Use */
- [0xe612, 0xe612], /* Private Use */
- [0xe613, 0xe613], /* Private Use */
- [0xe614, 0xe614], /* Private Use */
- [0xe615, 0xe615], /* Private Use */
- [0xe616, 0xe616], /* Private Use */
- [0xe617, 0xe617], /* Private Use */
- [0xe618, 0xe618], /* Private Use */
- [0xe619, 0xe619], /* Private Use */
- [0xe61a, 0xe61a], /* Private Use */
- [0xe61b, 0xe61b], /* Private Use */
- [0xe61c, 0xe61c], /* Private Use */
- [0xe61d, 0xe61d], /* Private Use */
- [0xe61e, 0xe61e], /* Private Use */
- [0xe61f, 0xe61f], /* Private Use */
- [0xe620, 0xe620], /* Private Use */
- [0xe621, 0xe621], /* Private Use */
- [0xe622, 0xe622], /* Private Use */
- [0xe623, 0xe623], /* Private Use */
- [0xe624, 0xe624], /* Private Use */
- [0xe625, 0xe625], /* Private Use */
- [0xe626, 0xe626], /* Private Use */
- [0xe627, 0xe627], /* Private Use */
- [0xe628, 0xe628], /* Private Use */
- [0xe629, 0xe629], /* Private Use */
- [0xe62a, 0xe62a], /* Private Use */
- [0xe62b, 0xe62b], /* Private Use */
- [0xe62c, 0xe62c], /* Private Use */
- [0xe62d, 0xe62d], /* Private Use */
- [0xe62e, 0xe62e], /* Private Use */
- [0xe62f, 0xe62f], /* Private Use */
- [0xe630, 0xe630], /* Private Use */
- [0xe631, 0xe631], /* Private Use */
- [0xe632, 0xe632], /* Private Use */
- [0xe633, 0xe633], /* Private Use */
- [0xe634, 0xe634], /* Private Use */
- [0xe635, 0xe635], /* Private Use */
- [0xe636, 0xe636], /* Private Use */
- [0xe637, 0xe637], /* Private Use */
- [0xe638, 0xe638], /* Private Use */
- [0xe639, 0xe639], /* Private Use */
- [0xe63a, 0xe63a], /* Private Use */
- [0xe63b, 0xe63b], /* Private Use */
- [0xe63c, 0xe63c], /* Private Use */
- [0xe63d, 0xe63d], /* Private Use */
- [0xe63e, 0xe63e], /* Private Use */
- [0xe63f, 0xe63f], /* Private Use */
- [0xe640, 0xe640], /* Private Use */
- [0xe641, 0xe641], /* Private Use */
- [0xe642, 0xe642], /* Private Use */
- [0xe643, 0xe643], /* Private Use */
- [0xe644, 0xe644], /* Private Use */
- [0xe645, 0xe645], /* Private Use */
- [0xe646, 0xe646], /* Private Use */
- [0xe647, 0xe647], /* Private Use */
- [0xe648, 0xe648], /* Private Use */
- [0xe649, 0xe649], /* Private Use */
- [0xe64a, 0xe64a], /* Private Use */
- [0xe64b, 0xe64b], /* Private Use */
- [0xe64c, 0xe64c], /* Private Use */
- [0xe64d, 0xe64d], /* Private Use */
- [0xe64e, 0xe64e], /* Private Use */
- [0xe64f, 0xe64f], /* Private Use */
- [0xe650, 0xe650], /* Private Use */
- [0xe651, 0xe651], /* Private Use */
- [0xe652, 0xe652], /* Private Use */
- [0xe653, 0xe653], /* Private Use */
- [0xe654, 0xe654], /* Private Use */
- [0xe655, 0xe655], /* Private Use */
- [0xe656, 0xe656], /* Private Use */
- [0xe657, 0xe657], /* Private Use */
- [0xe658, 0xe658], /* Private Use */
- [0xe659, 0xe659], /* Private Use */
- [0xe65a, 0xe65a], /* Private Use */
- [0xe65b, 0xe65b], /* Private Use */
- [0xe65c, 0xe65c], /* Private Use */
- [0xe65d, 0xe65d], /* Private Use */
- [0xe65e, 0xe65e], /* Private Use */
- [0xe65f, 0xe65f], /* Private Use */
- [0xe660, 0xe660], /* Private Use */
- [0xe661, 0xe661], /* Private Use */
- [0xe662, 0xe662], /* Private Use */
- [0xe663, 0xe663], /* Private Use */
- [0xe664, 0xe664], /* Private Use */
- [0xe665, 0xe665], /* Private Use */
- [0xe666, 0xe666], /* Private Use */
- [0xe667, 0xe667], /* Private Use */
- [0xe668, 0xe668], /* Private Use */
- [0xe669, 0xe669], /* Private Use */
- [0xe66a, 0xe66a], /* Private Use */
- [0xe66b, 0xe66b], /* Private Use */
- [0xe66c, 0xe66c], /* Private Use */
- [0xe66d, 0xe66d], /* Private Use */
- [0xe66e, 0xe66e], /* Private Use */
- [0xe66f, 0xe66f], /* Private Use */
- [0xe670, 0xe670], /* Private Use */
- [0xe671, 0xe671], /* Private Use */
- [0xe672, 0xe672], /* Private Use */
- [0xe673, 0xe673], /* Private Use */
- [0xe674, 0xe674], /* Private Use */
- [0xe675, 0xe675], /* Private Use */
- [0xe676, 0xe676], /* Private Use */
- [0xe677, 0xe677], /* Private Use */
- [0xe678, 0xe678], /* Private Use */
- [0xe679, 0xe679], /* Private Use */
- [0xe67a, 0xe67a], /* Private Use */
- [0xe67b, 0xe67b], /* Private Use */
- [0xe67c, 0xe67c], /* Private Use */
- [0xe67d, 0xe67d], /* Private Use */
- [0xe67e, 0xe67e], /* Private Use */
- [0xe67f, 0xe67f], /* Private Use */
- [0xe680, 0xe680], /* Private Use */
- [0xe681, 0xe681], /* Private Use */
- [0xe682, 0xe682], /* Private Use */
- [0xe683, 0xe683], /* Private Use */
- [0xe684, 0xe684], /* Private Use */
- [0xe685, 0xe685], /* Private Use */
- [0xe686, 0xe686], /* Private Use */
- [0xe687, 0xe687], /* Private Use */
- [0xe688, 0xe688], /* Private Use */
- [0xe689, 0xe689], /* Private Use */
- [0xe68a, 0xe68a], /* Private Use */
- [0xe68b, 0xe68b], /* Private Use */
- [0xe68c, 0xe68c], /* Private Use */
- [0xe68d, 0xe68d], /* Private Use */
- [0xe68e, 0xe68e], /* Private Use */
- [0xe68f, 0xe68f], /* Private Use */
- [0xe690, 0xe690], /* Private Use */
- [0xe691, 0xe691], /* Private Use */
- [0xe692, 0xe692], /* Private Use */
- [0xe693, 0xe693], /* Private Use */
- [0xe694, 0xe694], /* Private Use */
- [0xe695, 0xe695], /* Private Use */
- [0xe696, 0xe696], /* Private Use */
- [0xe697, 0xe697], /* Private Use */
- [0xe698, 0xe698], /* Private Use */
- [0xe699, 0xe699], /* Private Use */
- [0xe69a, 0xe69a], /* Private Use */
- [0xe69b, 0xe69b], /* Private Use */
- [0xe69c, 0xe69c], /* Private Use */
- [0xe69d, 0xe69d], /* Private Use */
- [0xe69e, 0xe69e], /* Private Use */
- [0xe69f, 0xe69f], /* Private Use */
- [0xe6a0, 0xe6a0], /* Private Use */
- [0xe6a1, 0xe6a1], /* Private Use */
- [0xe6a2, 0xe6a2], /* Private Use */
- [0xe6a3, 0xe6a3], /* Private Use */
- [0xe6a4, 0xe6a4], /* Private Use */
- [0xe6a5, 0xe6a5], /* Private Use */
- [0xe6a6, 0xe6a6], /* Private Use */
- [0xe6a7, 0xe6a7], /* Private Use */
- [0xe6a8, 0xe6a8], /* Private Use */
- [0xe6a9, 0xe6a9], /* Private Use */
- [0xe6aa, 0xe6aa], /* Private Use */
- [0xe6ab, 0xe6ab], /* Private Use */
- [0xe6ac, 0xe6ac], /* Private Use */
- [0xe6ad, 0xe6ad], /* Private Use */
- [0xe6ae, 0xe6ae], /* Private Use */
- [0xe6af, 0xe6af], /* Private Use */
- [0xe6b0, 0xe6b0], /* Private Use */
- [0xe6b1, 0xe6b1], /* Private Use */
- [0xe6b2, 0xe6b2], /* Private Use */
- [0xe6b3, 0xe6b3], /* Private Use */
- [0xe6b4, 0xe6b4], /* Private Use */
- [0xe6b5, 0xe6b5], /* Private Use */
- [0xe6b6, 0xe6b6], /* Private Use */
- [0xe6b7, 0xe6b7], /* Private Use */
- [0xe6b8, 0xe6b8], /* Private Use */
- [0xe6b9, 0xe6b9], /* Private Use */
- [0xe6ba, 0xe6ba], /* Private Use */
- [0xe6bb, 0xe6bb], /* Private Use */
- [0xe6bc, 0xe6bc], /* Private Use */
- [0xe6bd, 0xe6bd], /* Private Use */
- [0xe6be, 0xe6be], /* Private Use */
- [0xe6bf, 0xe6bf], /* Private Use */
- [0xe6c0, 0xe6c0], /* Private Use */
- [0xe6c1, 0xe6c1], /* Private Use */
- [0xe6c2, 0xe6c2], /* Private Use */
- [0xe6c3, 0xe6c3], /* Private Use */
- [0xe6c4, 0xe6c4], /* Private Use */
- [0xe6c5, 0xe6c5], /* Private Use */
- [0xe6c6, 0xe6c6], /* Private Use */
- [0xe6c7, 0xe6c7], /* Private Use */
- [0xe6c8, 0xe6c8], /* Private Use */
- [0xe6c9, 0xe6c9], /* Private Use */
- [0xe6ca, 0xe6ca], /* Private Use */
- [0xe6cb, 0xe6cb], /* Private Use */
- [0xe6cc, 0xe6cc], /* Private Use */
- [0xe6cd, 0xe6cd], /* Private Use */
- [0xe6ce, 0xe6ce], /* Private Use */
- [0xe6cf, 0xe6cf], /* Private Use */
- [0xe6d0, 0xe6d0], /* Private Use */
- [0xe6d1, 0xe6d1], /* Private Use */
- [0xe6d2, 0xe6d2], /* Private Use */
- [0xe6d3, 0xe6d3], /* Private Use */
- [0xe6d4, 0xe6d4], /* Private Use */
- [0xe6d5, 0xe6d5], /* Private Use */
- [0xe6d6, 0xe6d6], /* Private Use */
- [0xe6d7, 0xe6d7], /* Private Use */
- [0xe6d8, 0xe6d8], /* Private Use */
- [0xe6d9, 0xe6d9], /* Private Use */
- [0xe6da, 0xe6da], /* Private Use */
- [0xe6db, 0xe6db], /* Private Use */
- [0xe6dc, 0xe6dc], /* Private Use */
- [0xe6dd, 0xe6dd], /* Private Use */
- [0xe6de, 0xe6de], /* Private Use */
- [0xe6df, 0xe6df], /* Private Use */
- [0xe6e0, 0xe6e0], /* Private Use */
- [0xe6e1, 0xe6e1], /* Private Use */
- [0xe6e2, 0xe6e2], /* Private Use */
- [0xe6e3, 0xe6e3], /* Private Use */
- [0xe6e4, 0xe6e4], /* Private Use */
- [0xe6e5, 0xe6e5], /* Private Use */
- [0xe6e6, 0xe6e6], /* Private Use */
- [0xe6e7, 0xe6e7], /* Private Use */
- [0xe6e8, 0xe6e8], /* Private Use */
- [0xe6e9, 0xe6e9], /* Private Use */
- [0xe6ea, 0xe6ea], /* Private Use */
- [0xe6eb, 0xe6eb], /* Private Use */
- [0xe6ec, 0xe6ec], /* Private Use */
- [0xe6ed, 0xe6ed], /* Private Use */
- [0xe6ee, 0xe6ee], /* Private Use */
- [0xe6ef, 0xe6ef], /* Private Use */
- [0xe6f0, 0xe6f0], /* Private Use */
- [0xe6f1, 0xe6f1], /* Private Use */
- [0xe6f2, 0xe6f2], /* Private Use */
- [0xe6f3, 0xe6f3], /* Private Use */
- [0xe6f4, 0xe6f4], /* Private Use */
- [0xe6f5, 0xe6f5], /* Private Use */
- [0xe6f6, 0xe6f6], /* Private Use */
- [0xe6f7, 0xe6f7], /* Private Use */
- [0xe6f8, 0xe6f8], /* Private Use */
- [0xe6f9, 0xe6f9], /* Private Use */
- [0xe6fa, 0xe6fa], /* Private Use */
- [0xe6fb, 0xe6fb], /* Private Use */
- [0xe6fc, 0xe6fc], /* Private Use */
- [0xe6fd, 0xe6fd], /* Private Use */
- [0xe6fe, 0xe6fe], /* Private Use */
- [0xe6ff, 0xe6ff], /* Private Use */
- [0xe700, 0xe700], /* Private Use */
- [0xe701, 0xe701], /* Private Use */
- [0xe702, 0xe702], /* Private Use */
- [0xe703, 0xe703], /* Private Use */
- [0xe704, 0xe704], /* Private Use */
- [0xe705, 0xe705], /* Private Use */
- [0xe706, 0xe706], /* Private Use */
- [0xe707, 0xe707], /* Private Use */
- [0xe708, 0xe708], /* Private Use */
- [0xe709, 0xe709], /* Private Use */
- [0xe70a, 0xe70a], /* Private Use */
- [0xe70b, 0xe70b], /* Private Use */
- [0xe70c, 0xe70c], /* Private Use */
- [0xe70d, 0xe70d], /* Private Use */
- [0xe70e, 0xe70e], /* Private Use */
- [0xe70f, 0xe70f], /* Private Use */
- [0xe710, 0xe710], /* Private Use */
- [0xe711, 0xe711], /* Private Use */
- [0xe712, 0xe712], /* Private Use */
- [0xe713, 0xe713], /* Private Use */
- [0xe714, 0xe714], /* Private Use */
- [0xe715, 0xe715], /* Private Use */
- [0xe716, 0xe716], /* Private Use */
- [0xe717, 0xe717], /* Private Use */
- [0xe718, 0xe718], /* Private Use */
- [0xe719, 0xe719], /* Private Use */
- [0xe71a, 0xe71a], /* Private Use */
- [0xe71b, 0xe71b], /* Private Use */
- [0xe71c, 0xe71c], /* Private Use */
- [0xe71d, 0xe71d], /* Private Use */
- [0xe71e, 0xe71e], /* Private Use */
- [0xe71f, 0xe71f], /* Private Use */
- [0xe720, 0xe720], /* Private Use */
- [0xe721, 0xe721], /* Private Use */
- [0xe722, 0xe722], /* Private Use */
- [0xe723, 0xe723], /* Private Use */
- [0xe724, 0xe724], /* Private Use */
- [0xe725, 0xe725], /* Private Use */
- [0xe726, 0xe726], /* Private Use */
- [0xe727, 0xe727], /* Private Use */
- [0xe728, 0xe728], /* Private Use */
- [0xe729, 0xe729], /* Private Use */
- [0xe72a, 0xe72a], /* Private Use */
- [0xe72b, 0xe72b], /* Private Use */
- [0xe72c, 0xe72c], /* Private Use */
- [0xe72d, 0xe72d], /* Private Use */
- [0xe72e, 0xe72e], /* Private Use */
- [0xe72f, 0xe72f], /* Private Use */
- [0xe730, 0xe730], /* Private Use */
- [0xe731, 0xe731], /* Private Use */
- [0xe732, 0xe732], /* Private Use */
- [0xe733, 0xe733], /* Private Use */
- [0xe734, 0xe734], /* Private Use */
- [0xe735, 0xe735], /* Private Use */
- [0xe736, 0xe736], /* Private Use */
- [0xe737, 0xe737], /* Private Use */
- [0xe738, 0xe738], /* Private Use */
- [0xe739, 0xe739], /* Private Use */
- [0xe73a, 0xe73a], /* Private Use */
- [0xe73b, 0xe73b], /* Private Use */
- [0xe73c, 0xe73c], /* Private Use */
- [0xe73d, 0xe73d], /* Private Use */
- [0xe73e, 0xe73e], /* Private Use */
- [0xe73f, 0xe73f], /* Private Use */
- [0xe740, 0xe740], /* Private Use */
- [0xe741, 0xe741], /* Private Use */
- [0xe742, 0xe742], /* Private Use */
- [0xe743, 0xe743], /* Private Use */
- [0xe744, 0xe744], /* Private Use */
- [0xe745, 0xe745], /* Private Use */
- [0xe746, 0xe746], /* Private Use */
- [0xe747, 0xe747], /* Private Use */
- [0xe748, 0xe748], /* Private Use */
- [0xe749, 0xe749], /* Private Use */
- [0xe74a, 0xe74a], /* Private Use */
- [0xe74b, 0xe74b], /* Private Use */
- [0xe74c, 0xe74c], /* Private Use */
- [0xe74d, 0xe74d], /* Private Use */
- [0xe74e, 0xe74e], /* Private Use */
- [0xe74f, 0xe74f], /* Private Use */
- [0xe750, 0xe750], /* Private Use */
- [0xe751, 0xe751], /* Private Use */
- [0xe752, 0xe752], /* Private Use */
- [0xe753, 0xe753], /* Private Use */
- [0xe754, 0xe754], /* Private Use */
- [0xe755, 0xe755], /* Private Use */
- [0xe756, 0xe756], /* Private Use */
- [0xe757, 0xe757], /* Private Use */
- [0xe758, 0xe758], /* Private Use */
- [0xe759, 0xe759], /* Private Use */
- [0xe75a, 0xe75a], /* Private Use */
- [0xe75b, 0xe75b], /* Private Use */
- [0xe75c, 0xe75c], /* Private Use */
- [0xe75d, 0xe75d], /* Private Use */
- [0xe75e, 0xe75e], /* Private Use */
- [0xe75f, 0xe75f], /* Private Use */
- [0xe760, 0xe760], /* Private Use */
- [0xe761, 0xe761], /* Private Use */
- [0xe762, 0xe762], /* Private Use */
- [0xe763, 0xe763], /* Private Use */
- [0xe764, 0xe764], /* Private Use */
- [0xe765, 0xe765], /* Private Use */
- [0xe766, 0xe766], /* Private Use */
- [0xe767, 0xe767], /* Private Use */
- [0xe768, 0xe768], /* Private Use */
- [0xe769, 0xe769], /* Private Use */
- [0xe76a, 0xe76a], /* Private Use */
- [0xe76b, 0xe76b], /* Private Use */
- [0xe76c, 0xe76c], /* Private Use */
- [0xe76d, 0xe76d], /* Private Use */
- [0xe76e, 0xe76e], /* Private Use */
- [0xe76f, 0xe76f], /* Private Use */
- [0xe770, 0xe770], /* Private Use */
- [0xe771, 0xe771], /* Private Use */
- [0xe772, 0xe772], /* Private Use */
- [0xe773, 0xe773], /* Private Use */
- [0xe774, 0xe774], /* Private Use */
- [0xe775, 0xe775], /* Private Use */
- [0xe776, 0xe776], /* Private Use */
- [0xe777, 0xe777], /* Private Use */
- [0xe778, 0xe778], /* Private Use */
- [0xe779, 0xe779], /* Private Use */
- [0xe77a, 0xe77a], /* Private Use */
- [0xe77b, 0xe77b], /* Private Use */
- [0xe77c, 0xe77c], /* Private Use */
- [0xe77d, 0xe77d], /* Private Use */
- [0xe77e, 0xe77e], /* Private Use */
- [0xe77f, 0xe77f], /* Private Use */
- [0xe780, 0xe780], /* Private Use */
- [0xe781, 0xe781], /* Private Use */
- [0xe782, 0xe782], /* Private Use */
- [0xe783, 0xe783], /* Private Use */
- [0xe784, 0xe784], /* Private Use */
- [0xe785, 0xe785], /* Private Use */
- [0xe786, 0xe786], /* Private Use */
- [0xe787, 0xe787], /* Private Use */
- [0xe788, 0xe788], /* Private Use */
- [0xe789, 0xe789], /* Private Use */
- [0xe78a, 0xe78a], /* Private Use */
- [0xe78b, 0xe78b], /* Private Use */
- [0xe78c, 0xe78c], /* Private Use */
- [0xe78d, 0xe78d], /* Private Use */
- [0xe78e, 0xe78e], /* Private Use */
- [0xe78f, 0xe78f], /* Private Use */
- [0xe790, 0xe790], /* Private Use */
- [0xe791, 0xe791], /* Private Use */
- [0xe792, 0xe792], /* Private Use */
- [0xe793, 0xe793], /* Private Use */
- [0xe794, 0xe794], /* Private Use */
- [0xe795, 0xe795], /* Private Use */
- [0xe796, 0xe796], /* Private Use */
- [0xe797, 0xe797], /* Private Use */
- [0xe798, 0xe798], /* Private Use */
- [0xe799, 0xe799], /* Private Use */
- [0xe79a, 0xe79a], /* Private Use */
- [0xe79b, 0xe79b], /* Private Use */
- [0xe79c, 0xe79c], /* Private Use */
- [0xe79d, 0xe79d], /* Private Use */
- [0xe79e, 0xe79e], /* Private Use */
- [0xe79f, 0xe79f], /* Private Use */
- [0xe7a0, 0xe7a0], /* Private Use */
- [0xe7a1, 0xe7a1], /* Private Use */
- [0xe7a2, 0xe7a2], /* Private Use */
- [0xe7a3, 0xe7a3], /* Private Use */
- [0xe7a4, 0xe7a4], /* Private Use */
- [0xe7a5, 0xe7a5], /* Private Use */
- [0xe7a6, 0xe7a6], /* Private Use */
- [0xe7a7, 0xe7a7], /* Private Use */
- [0xe7a8, 0xe7a8], /* Private Use */
- [0xe7a9, 0xe7a9], /* Private Use */
- [0xe7aa, 0xe7aa], /* Private Use */
- [0xe7ab, 0xe7ab], /* Private Use */
- [0xe7ac, 0xe7ac], /* Private Use */
- [0xe7ad, 0xe7ad], /* Private Use */
- [0xe7ae, 0xe7ae], /* Private Use */
- [0xe7af, 0xe7af], /* Private Use */
- [0xe7b0, 0xe7b0], /* Private Use */
- [0xe7b1, 0xe7b1], /* Private Use */
- [0xe7b2, 0xe7b2], /* Private Use */
- [0xe7b3, 0xe7b3], /* Private Use */
- [0xe7b4, 0xe7b4], /* Private Use */
- [0xe7b5, 0xe7b5], /* Private Use */
- [0xe7b6, 0xe7b6], /* Private Use */
- [0xe7b7, 0xe7b7], /* Private Use */
- [0xe7b8, 0xe7b8], /* Private Use */
- [0xe7b9, 0xe7b9], /* Private Use */
- [0xe7ba, 0xe7ba], /* Private Use */
- [0xe7bb, 0xe7bb], /* Private Use */
- [0xe7bc, 0xe7bc], /* Private Use */
- [0xe7bd, 0xe7bd], /* Private Use */
- [0xe7be, 0xe7be], /* Private Use */
- [0xe7bf, 0xe7bf], /* Private Use */
- [0xe7c0, 0xe7c0], /* Private Use */
- [0xe7c1, 0xe7c1], /* Private Use */
- [0xe7c2, 0xe7c2], /* Private Use */
- [0xe7c3, 0xe7c3], /* Private Use */
- [0xe7c4, 0xe7c4], /* Private Use */
- [0xe7c5, 0xe7c5], /* Private Use */
- [0xe7c6, 0xe7c6], /* Private Use */
- [0xe7c7, 0xe7c7], /* Private Use */
- [0xe7c8, 0xe7c8], /* Private Use */
- [0xe7c9, 0xe7c9], /* Private Use */
- [0xe7ca, 0xe7ca], /* Private Use */
- [0xe7cb, 0xe7cb], /* Private Use */
- [0xe7cc, 0xe7cc], /* Private Use */
- [0xe7cd, 0xe7cd], /* Private Use */
- [0xe7ce, 0xe7ce], /* Private Use */
- [0xe7cf, 0xe7cf], /* Private Use */
- [0xe7d0, 0xe7d0], /* Private Use */
- [0xe7d1, 0xe7d1], /* Private Use */
- [0xe7d2, 0xe7d2], /* Private Use */
- [0xe7d3, 0xe7d3], /* Private Use */
- [0xe7d4, 0xe7d4], /* Private Use */
- [0xe7d5, 0xe7d5], /* Private Use */
- [0xe7d6, 0xe7d6], /* Private Use */
- [0xe7d7, 0xe7d7], /* Private Use */
- [0xe7d8, 0xe7d8], /* Private Use */
- [0xe7d9, 0xe7d9], /* Private Use */
- [0xe7da, 0xe7da], /* Private Use */
- [0xe7db, 0xe7db], /* Private Use */
- [0xe7dc, 0xe7dc], /* Private Use */
- [0xe7dd, 0xe7dd], /* Private Use */
- [0xe7de, 0xe7de], /* Private Use */
- [0xe7df, 0xe7df], /* Private Use */
- [0xe7e0, 0xe7e0], /* Private Use */
- [0xe7e1, 0xe7e1], /* Private Use */
- [0xe7e2, 0xe7e2], /* Private Use */
- [0xe7e3, 0xe7e3], /* Private Use */
- [0xe7e4, 0xe7e4], /* Private Use */
- [0xe7e5, 0xe7e5], /* Private Use */
- [0xe7e6, 0xe7e6], /* Private Use */
- [0xe7e7, 0xe7e7], /* Private Use */
- [0xe7e8, 0xe7e8], /* Private Use */
- [0xe7e9, 0xe7e9], /* Private Use */
- [0xe7ea, 0xe7ea], /* Private Use */
- [0xe7eb, 0xe7eb], /* Private Use */
- [0xe7ec, 0xe7ec], /* Private Use */
- [0xe7ed, 0xe7ed], /* Private Use */
- [0xe7ee, 0xe7ee], /* Private Use */
- [0xe7ef, 0xe7ef], /* Private Use */
- [0xe7f0, 0xe7f0], /* Private Use */
- [0xe7f1, 0xe7f1], /* Private Use */
- [0xe7f2, 0xe7f2], /* Private Use */
- [0xe7f3, 0xe7f3], /* Private Use */
- [0xe7f4, 0xe7f4], /* Private Use */
- [0xe7f5, 0xe7f5], /* Private Use */
- [0xe7f6, 0xe7f6], /* Private Use */
- [0xe7f7, 0xe7f7], /* Private Use */
- [0xe7f8, 0xe7f8], /* Private Use */
- [0xe7f9, 0xe7f9], /* Private Use */
- [0xe7fa, 0xe7fa], /* Private Use */
- [0xe7fb, 0xe7fb], /* Private Use */
- [0xe7fc, 0xe7fc], /* Private Use */
- [0xe7fd, 0xe7fd], /* Private Use */
- [0xe7fe, 0xe7fe], /* Private Use */
- [0xe7ff, 0xe7ff], /* Private Use */
- [0xe800, 0xe800], /* Private Use */
- [0xe801, 0xe801], /* Private Use */
- [0xe802, 0xe802], /* Private Use */
- [0xe803, 0xe803], /* Private Use */
- [0xe804, 0xe804], /* Private Use */
- [0xe805, 0xe805], /* Private Use */
- [0xe806, 0xe806], /* Private Use */
- [0xe807, 0xe807], /* Private Use */
- [0xe808, 0xe808], /* Private Use */
- [0xe809, 0xe809], /* Private Use */
- [0xe80a, 0xe80a], /* Private Use */
- [0xe80b, 0xe80b], /* Private Use */
- [0xe80c, 0xe80c], /* Private Use */
- [0xe80d, 0xe80d], /* Private Use */
- [0xe80e, 0xe80e], /* Private Use */
- [0xe80f, 0xe80f], /* Private Use */
- [0xe810, 0xe810], /* Private Use */
- [0xe811, 0xe811], /* Private Use */
- [0xe812, 0xe812], /* Private Use */
- [0xe813, 0xe813], /* Private Use */
- [0xe814, 0xe814], /* Private Use */
- [0xe815, 0xe815], /* Private Use */
- [0xe816, 0xe816], /* Private Use */
- [0xe817, 0xe817], /* Private Use */
- [0xe818, 0xe818], /* Private Use */
- [0xe819, 0xe819], /* Private Use */
- [0xe81a, 0xe81a], /* Private Use */
- [0xe81b, 0xe81b], /* Private Use */
- [0xe81c, 0xe81c], /* Private Use */
- [0xe81d, 0xe81d], /* Private Use */
- [0xe81e, 0xe81e], /* Private Use */
- [0xe81f, 0xe81f], /* Private Use */
- [0xe820, 0xe820], /* Private Use */
- [0xe821, 0xe821], /* Private Use */
- [0xe822, 0xe822], /* Private Use */
- [0xe823, 0xe823], /* Private Use */
- [0xe824, 0xe824], /* Private Use */
- [0xe825, 0xe825], /* Private Use */
- [0xe826, 0xe826], /* Private Use */
- [0xe827, 0xe827], /* Private Use */
- [0xe828, 0xe828], /* Private Use */
- [0xe829, 0xe829], /* Private Use */
- [0xe82a, 0xe82a], /* Private Use */
- [0xe82b, 0xe82b], /* Private Use */
- [0xe82c, 0xe82c], /* Private Use */
- [0xe82d, 0xe82d], /* Private Use */
- [0xe82e, 0xe82e], /* Private Use */
- [0xe82f, 0xe82f], /* Private Use */
- [0xe830, 0xe830], /* Private Use */
- [0xe831, 0xe831], /* Private Use */
- [0xe832, 0xe832], /* Private Use */
- [0xe833, 0xe833], /* Private Use */
- [0xe834, 0xe834], /* Private Use */
- [0xe835, 0xe835], /* Private Use */
- [0xe836, 0xe836], /* Private Use */
- [0xe837, 0xe837], /* Private Use */
- [0xe838, 0xe838], /* Private Use */
- [0xe839, 0xe839], /* Private Use */
- [0xe83a, 0xe83a], /* Private Use */
- [0xe83b, 0xe83b], /* Private Use */
- [0xe83c, 0xe83c], /* Private Use */
- [0xe83d, 0xe83d], /* Private Use */
- [0xe83e, 0xe83e], /* Private Use */
- [0xe83f, 0xe83f], /* Private Use */
- [0xe840, 0xe840], /* Private Use */
- [0xe841, 0xe841], /* Private Use */
- [0xe842, 0xe842], /* Private Use */
- [0xe843, 0xe843], /* Private Use */
- [0xe844, 0xe844], /* Private Use */
- [0xe845, 0xe845], /* Private Use */
- [0xe846, 0xe846], /* Private Use */
- [0xe847, 0xe847], /* Private Use */
- [0xe848, 0xe848], /* Private Use */
- [0xe849, 0xe849], /* Private Use */
- [0xe84a, 0xe84a], /* Private Use */
- [0xe84b, 0xe84b], /* Private Use */
- [0xe84c, 0xe84c], /* Private Use */
- [0xe84d, 0xe84d], /* Private Use */
- [0xe84e, 0xe84e], /* Private Use */
- [0xe84f, 0xe84f], /* Private Use */
- [0xe850, 0xe850], /* Private Use */
- [0xe851, 0xe851], /* Private Use */
- [0xe852, 0xe852], /* Private Use */
- [0xe853, 0xe853], /* Private Use */
- [0xe854, 0xe854], /* Private Use */
- [0xe855, 0xe855], /* Private Use */
- [0xe856, 0xe856], /* Private Use */
- [0xe857, 0xe857], /* Private Use */
- [0xe858, 0xe858], /* Private Use */
- [0xe859, 0xe859], /* Private Use */
- [0xe85a, 0xe85a], /* Private Use */
- [0xe85b, 0xe85b], /* Private Use */
- [0xe85c, 0xe85c], /* Private Use */
- [0xe85d, 0xe85d], /* Private Use */
- [0xe85e, 0xe85e], /* Private Use */
- [0xe85f, 0xe85f], /* Private Use */
- [0xe860, 0xe860], /* Private Use */
- [0xe861, 0xe861], /* Private Use */
- [0xe862, 0xe862], /* Private Use */
- [0xe863, 0xe863], /* Private Use */
- [0xe864, 0xe864], /* Private Use */
- [0xe865, 0xe865], /* Private Use */
- [0xe866, 0xe866], /* Private Use */
- [0xe867, 0xe867], /* Private Use */
- [0xe868, 0xe868], /* Private Use */
- [0xe869, 0xe869], /* Private Use */
- [0xe86a, 0xe86a], /* Private Use */
- [0xe86b, 0xe86b], /* Private Use */
- [0xe86c, 0xe86c], /* Private Use */
- [0xe86d, 0xe86d], /* Private Use */
- [0xe86e, 0xe86e], /* Private Use */
- [0xe86f, 0xe86f], /* Private Use */
- [0xe870, 0xe870], /* Private Use */
- [0xe871, 0xe871], /* Private Use */
- [0xe872, 0xe872], /* Private Use */
- [0xe873, 0xe873], /* Private Use */
- [0xe874, 0xe874], /* Private Use */
- [0xe875, 0xe875], /* Private Use */
- [0xe876, 0xe876], /* Private Use */
- [0xe877, 0xe877], /* Private Use */
- [0xe878, 0xe878], /* Private Use */
- [0xe879, 0xe879], /* Private Use */
- [0xe87a, 0xe87a], /* Private Use */
- [0xe87b, 0xe87b], /* Private Use */
- [0xe87c, 0xe87c], /* Private Use */
- [0xe87d, 0xe87d], /* Private Use */
- [0xe87e, 0xe87e], /* Private Use */
- [0xe87f, 0xe87f], /* Private Use */
- [0xe880, 0xe880], /* Private Use */
- [0xe881, 0xe881], /* Private Use */
- [0xe882, 0xe882], /* Private Use */
- [0xe883, 0xe883], /* Private Use */
- [0xe884, 0xe884], /* Private Use */
- [0xe885, 0xe885], /* Private Use */
- [0xe886, 0xe886], /* Private Use */
- [0xe887, 0xe887], /* Private Use */
- [0xe888, 0xe888], /* Private Use */
- [0xe889, 0xe889], /* Private Use */
- [0xe88a, 0xe88a], /* Private Use */
- [0xe88b, 0xe88b], /* Private Use */
- [0xe88c, 0xe88c], /* Private Use */
- [0xe88d, 0xe88d], /* Private Use */
- [0xe88e, 0xe88e], /* Private Use */
- [0xe88f, 0xe88f], /* Private Use */
- [0xe890, 0xe890], /* Private Use */
- [0xe891, 0xe891], /* Private Use */
- [0xe892, 0xe892], /* Private Use */
- [0xe893, 0xe893], /* Private Use */
- [0xe894, 0xe894], /* Private Use */
- [0xe895, 0xe895], /* Private Use */
- [0xe896, 0xe896], /* Private Use */
- [0xe897, 0xe897], /* Private Use */
- [0xe898, 0xe898], /* Private Use */
- [0xe899, 0xe899], /* Private Use */
- [0xe89a, 0xe89a], /* Private Use */
- [0xe89b, 0xe89b], /* Private Use */
- [0xe89c, 0xe89c], /* Private Use */
- [0xe89d, 0xe89d], /* Private Use */
- [0xe89e, 0xe89e], /* Private Use */
- [0xe89f, 0xe89f], /* Private Use */
- [0xe8a0, 0xe8a0], /* Private Use */
- [0xe8a1, 0xe8a1], /* Private Use */
- [0xe8a2, 0xe8a2], /* Private Use */
- [0xe8a3, 0xe8a3], /* Private Use */
- [0xe8a4, 0xe8a4], /* Private Use */
- [0xe8a5, 0xe8a5], /* Private Use */
- [0xe8a6, 0xe8a6], /* Private Use */
- [0xe8a7, 0xe8a7], /* Private Use */
- [0xe8a8, 0xe8a8], /* Private Use */
- [0xe8a9, 0xe8a9], /* Private Use */
- [0xe8aa, 0xe8aa], /* Private Use */
- [0xe8ab, 0xe8ab], /* Private Use */
- [0xe8ac, 0xe8ac], /* Private Use */
- [0xe8ad, 0xe8ad], /* Private Use */
- [0xe8ae, 0xe8ae], /* Private Use */
- [0xe8af, 0xe8af], /* Private Use */
- [0xe8b0, 0xe8b0], /* Private Use */
- [0xe8b1, 0xe8b1], /* Private Use */
- [0xe8b2, 0xe8b2], /* Private Use */
- [0xe8b3, 0xe8b3], /* Private Use */
- [0xe8b4, 0xe8b4], /* Private Use */
- [0xe8b5, 0xe8b5], /* Private Use */
- [0xe8b6, 0xe8b6], /* Private Use */
- [0xe8b7, 0xe8b7], /* Private Use */
- [0xe8b8, 0xe8b8], /* Private Use */
- [0xe8b9, 0xe8b9], /* Private Use */
- [0xe8ba, 0xe8ba], /* Private Use */
- [0xe8bb, 0xe8bb], /* Private Use */
- [0xe8bc, 0xe8bc], /* Private Use */
- [0xe8bd, 0xe8bd], /* Private Use */
- [0xe8be, 0xe8be], /* Private Use */
- [0xe8bf, 0xe8bf], /* Private Use */
- [0xe8c0, 0xe8c0], /* Private Use */
- [0xe8c1, 0xe8c1], /* Private Use */
- [0xe8c2, 0xe8c2], /* Private Use */
- [0xe8c3, 0xe8c3], /* Private Use */
- [0xe8c4, 0xe8c4], /* Private Use */
- [0xe8c5, 0xe8c5], /* Private Use */
- [0xe8c6, 0xe8c6], /* Private Use */
- [0xe8c7, 0xe8c7], /* Private Use */
- [0xe8c8, 0xe8c8], /* Private Use */
- [0xe8c9, 0xe8c9], /* Private Use */
- [0xe8ca, 0xe8ca], /* Private Use */
- [0xe8cb, 0xe8cb], /* Private Use */
- [0xe8cc, 0xe8cc], /* Private Use */
- [0xe8cd, 0xe8cd], /* Private Use */
- [0xe8ce, 0xe8ce], /* Private Use */
- [0xe8cf, 0xe8cf], /* Private Use */
- [0xe8d0, 0xe8d0], /* Private Use */
- [0xe8d1, 0xe8d1], /* Private Use */
- [0xe8d2, 0xe8d2], /* Private Use */
- [0xe8d3, 0xe8d3], /* Private Use */
- [0xe8d4, 0xe8d4], /* Private Use */
- [0xe8d5, 0xe8d5], /* Private Use */
- [0xe8d6, 0xe8d6], /* Private Use */
- [0xe8d7, 0xe8d7], /* Private Use */
- [0xe8d8, 0xe8d8], /* Private Use */
- [0xe8d9, 0xe8d9], /* Private Use */
- [0xe8da, 0xe8da], /* Private Use */
- [0xe8db, 0xe8db], /* Private Use */
- [0xe8dc, 0xe8dc], /* Private Use */
- [0xe8dd, 0xe8dd], /* Private Use */
- [0xe8de, 0xe8de], /* Private Use */
- [0xe8df, 0xe8df], /* Private Use */
- [0xe8e0, 0xe8e0], /* Private Use */
- [0xe8e1, 0xe8e1], /* Private Use */
- [0xe8e2, 0xe8e2], /* Private Use */
- [0xe8e3, 0xe8e3], /* Private Use */
- [0xe8e4, 0xe8e4], /* Private Use */
- [0xe8e5, 0xe8e5], /* Private Use */
- [0xe8e6, 0xe8e6], /* Private Use */
- [0xe8e7, 0xe8e7], /* Private Use */
- [0xe8e8, 0xe8e8], /* Private Use */
- [0xe8e9, 0xe8e9], /* Private Use */
- [0xe8ea, 0xe8ea], /* Private Use */
- [0xe8eb, 0xe8eb], /* Private Use */
- [0xe8ec, 0xe8ec], /* Private Use */
- [0xe8ed, 0xe8ed], /* Private Use */
- [0xe8ee, 0xe8ee], /* Private Use */
- [0xe8ef, 0xe8ef], /* Private Use */
- [0xe8f0, 0xe8f0], /* Private Use */
- [0xe8f1, 0xe8f1], /* Private Use */
- [0xe8f2, 0xe8f2], /* Private Use */
- [0xe8f3, 0xe8f3], /* Private Use */
- [0xe8f4, 0xe8f4], /* Private Use */
- [0xe8f5, 0xe8f5], /* Private Use */
- [0xe8f6, 0xe8f6], /* Private Use */
- [0xe8f7, 0xe8f7], /* Private Use */
- [0xe8f8, 0xe8f8], /* Private Use */
- [0xe8f9, 0xe8f9], /* Private Use */
- [0xe8fa, 0xe8fa], /* Private Use */
- [0xe8fb, 0xe8fb], /* Private Use */
- [0xe8fc, 0xe8fc], /* Private Use */
- [0xe8fd, 0xe8fd], /* Private Use */
- [0xe8fe, 0xe8fe], /* Private Use */
- [0xe8ff, 0xe8ff], /* Private Use */
- [0xe900, 0xe900], /* Private Use */
- [0xe901, 0xe901], /* Private Use */
- [0xe902, 0xe902], /* Private Use */
- [0xe903, 0xe903], /* Private Use */
- [0xe904, 0xe904], /* Private Use */
- [0xe905, 0xe905], /* Private Use */
- [0xe906, 0xe906], /* Private Use */
- [0xe907, 0xe907], /* Private Use */
- [0xe908, 0xe908], /* Private Use */
- [0xe909, 0xe909], /* Private Use */
- [0xe90a, 0xe90a], /* Private Use */
- [0xe90b, 0xe90b], /* Private Use */
- [0xe90c, 0xe90c], /* Private Use */
- [0xe90d, 0xe90d], /* Private Use */
- [0xe90e, 0xe90e], /* Private Use */
- [0xe90f, 0xe90f], /* Private Use */
- [0xe910, 0xe910], /* Private Use */
- [0xe911, 0xe911], /* Private Use */
- [0xe912, 0xe912], /* Private Use */
- [0xe913, 0xe913], /* Private Use */
- [0xe914, 0xe914], /* Private Use */
- [0xe915, 0xe915], /* Private Use */
- [0xe916, 0xe916], /* Private Use */
- [0xe917, 0xe917], /* Private Use */
- [0xe918, 0xe918], /* Private Use */
- [0xe919, 0xe919], /* Private Use */
- [0xe91a, 0xe91a], /* Private Use */
- [0xe91b, 0xe91b], /* Private Use */
- [0xe91c, 0xe91c], /* Private Use */
- [0xe91d, 0xe91d], /* Private Use */
- [0xe91e, 0xe91e], /* Private Use */
- [0xe91f, 0xe91f], /* Private Use */
- [0xe920, 0xe920], /* Private Use */
- [0xe921, 0xe921], /* Private Use */
- [0xe922, 0xe922], /* Private Use */
- [0xe923, 0xe923], /* Private Use */
- [0xe924, 0xe924], /* Private Use */
- [0xe925, 0xe925], /* Private Use */
- [0xe926, 0xe926], /* Private Use */
- [0xe927, 0xe927], /* Private Use */
- [0xe928, 0xe928], /* Private Use */
- [0xe929, 0xe929], /* Private Use */
- [0xe92a, 0xe92a], /* Private Use */
- [0xe92b, 0xe92b], /* Private Use */
- [0xe92c, 0xe92c], /* Private Use */
- [0xe92d, 0xe92d], /* Private Use */
- [0xe92e, 0xe92e], /* Private Use */
- [0xe92f, 0xe92f], /* Private Use */
- [0xe930, 0xe930], /* Private Use */
- [0xe931, 0xe931], /* Private Use */
- [0xe932, 0xe932], /* Private Use */
- [0xe933, 0xe933], /* Private Use */
- [0xe934, 0xe934], /* Private Use */
- [0xe935, 0xe935], /* Private Use */
- [0xe936, 0xe936], /* Private Use */
- [0xe937, 0xe937], /* Private Use */
- [0xe938, 0xe938], /* Private Use */
- [0xe939, 0xe939], /* Private Use */
- [0xe93a, 0xe93a], /* Private Use */
- [0xe93b, 0xe93b], /* Private Use */
- [0xe93c, 0xe93c], /* Private Use */
- [0xe93d, 0xe93d], /* Private Use */
- [0xe93e, 0xe93e], /* Private Use */
- [0xe93f, 0xe93f], /* Private Use */
- [0xe940, 0xe940], /* Private Use */
- [0xe941, 0xe941], /* Private Use */
- [0xe942, 0xe942], /* Private Use */
- [0xe943, 0xe943], /* Private Use */
- [0xe944, 0xe944], /* Private Use */
- [0xe945, 0xe945], /* Private Use */
- [0xe946, 0xe946], /* Private Use */
- [0xe947, 0xe947], /* Private Use */
- [0xe948, 0xe948], /* Private Use */
- [0xe949, 0xe949], /* Private Use */
- [0xe94a, 0xe94a], /* Private Use */
- [0xe94b, 0xe94b], /* Private Use */
- [0xe94c, 0xe94c], /* Private Use */
- [0xe94d, 0xe94d], /* Private Use */
- [0xe94e, 0xe94e], /* Private Use */
- [0xe94f, 0xe94f], /* Private Use */
- [0xe950, 0xe950], /* Private Use */
- [0xe951, 0xe951], /* Private Use */
- [0xe952, 0xe952], /* Private Use */
- [0xe953, 0xe953], /* Private Use */
- [0xe954, 0xe954], /* Private Use */
- [0xe955, 0xe955], /* Private Use */
- [0xe956, 0xe956], /* Private Use */
- [0xe957, 0xe957], /* Private Use */
- [0xe958, 0xe958], /* Private Use */
- [0xe959, 0xe959], /* Private Use */
- [0xe95a, 0xe95a], /* Private Use */
- [0xe95b, 0xe95b], /* Private Use */
- [0xe95c, 0xe95c], /* Private Use */
- [0xe95d, 0xe95d], /* Private Use */
- [0xe95e, 0xe95e], /* Private Use */
- [0xe95f, 0xe95f], /* Private Use */
- [0xe960, 0xe960], /* Private Use */
- [0xe961, 0xe961], /* Private Use */
- [0xe962, 0xe962], /* Private Use */
- [0xe963, 0xe963], /* Private Use */
- [0xe964, 0xe964], /* Private Use */
- [0xe965, 0xe965], /* Private Use */
- [0xe966, 0xe966], /* Private Use */
- [0xe967, 0xe967], /* Private Use */
- [0xe968, 0xe968], /* Private Use */
- [0xe969, 0xe969], /* Private Use */
- [0xe96a, 0xe96a], /* Private Use */
- [0xe96b, 0xe96b], /* Private Use */
- [0xe96c, 0xe96c], /* Private Use */
- [0xe96d, 0xe96d], /* Private Use */
- [0xe96e, 0xe96e], /* Private Use */
- [0xe96f, 0xe96f], /* Private Use */
- [0xe970, 0xe970], /* Private Use */
- [0xe971, 0xe971], /* Private Use */
- [0xe972, 0xe972], /* Private Use */
- [0xe973, 0xe973], /* Private Use */
- [0xe974, 0xe974], /* Private Use */
- [0xe975, 0xe975], /* Private Use */
- [0xe976, 0xe976], /* Private Use */
- [0xe977, 0xe977], /* Private Use */
- [0xe978, 0xe978], /* Private Use */
- [0xe979, 0xe979], /* Private Use */
- [0xe97a, 0xe97a], /* Private Use */
- [0xe97b, 0xe97b], /* Private Use */
- [0xe97c, 0xe97c], /* Private Use */
- [0xe97d, 0xe97d], /* Private Use */
- [0xe97e, 0xe97e], /* Private Use */
- [0xe97f, 0xe97f], /* Private Use */
- [0xe980, 0xe980], /* Private Use */
- [0xe981, 0xe981], /* Private Use */
- [0xe982, 0xe982], /* Private Use */
- [0xe983, 0xe983], /* Private Use */
- [0xe984, 0xe984], /* Private Use */
- [0xe985, 0xe985], /* Private Use */
- [0xe986, 0xe986], /* Private Use */
- [0xe987, 0xe987], /* Private Use */
- [0xe988, 0xe988], /* Private Use */
- [0xe989, 0xe989], /* Private Use */
- [0xe98a, 0xe98a], /* Private Use */
- [0xe98b, 0xe98b], /* Private Use */
- [0xe98c, 0xe98c], /* Private Use */
- [0xe98d, 0xe98d], /* Private Use */
- [0xe98e, 0xe98e], /* Private Use */
- [0xe98f, 0xe98f], /* Private Use */
- [0xe990, 0xe990], /* Private Use */
- [0xe991, 0xe991], /* Private Use */
- [0xe992, 0xe992], /* Private Use */
- [0xe993, 0xe993], /* Private Use */
- [0xe994, 0xe994], /* Private Use */
- [0xe995, 0xe995], /* Private Use */
- [0xe996, 0xe996], /* Private Use */
- [0xe997, 0xe997], /* Private Use */
- [0xe998, 0xe998], /* Private Use */
- [0xe999, 0xe999], /* Private Use */
- [0xe99a, 0xe99a], /* Private Use */
- [0xe99b, 0xe99b], /* Private Use */
- [0xe99c, 0xe99c], /* Private Use */
- [0xe99d, 0xe99d], /* Private Use */
- [0xe99e, 0xe99e], /* Private Use */
- [0xe99f, 0xe99f], /* Private Use */
- [0xe9a0, 0xe9a0], /* Private Use */
- [0xe9a1, 0xe9a1], /* Private Use */
- [0xe9a2, 0xe9a2], /* Private Use */
- [0xe9a3, 0xe9a3], /* Private Use */
- [0xe9a4, 0xe9a4], /* Private Use */
- [0xe9a5, 0xe9a5], /* Private Use */
- [0xe9a6, 0xe9a6], /* Private Use */
- [0xe9a7, 0xe9a7], /* Private Use */
- [0xe9a8, 0xe9a8], /* Private Use */
- [0xe9a9, 0xe9a9], /* Private Use */
- [0xe9aa, 0xe9aa], /* Private Use */
- [0xe9ab, 0xe9ab], /* Private Use */
- [0xe9ac, 0xe9ac], /* Private Use */
- [0xe9ad, 0xe9ad], /* Private Use */
- [0xe9ae, 0xe9ae], /* Private Use */
- [0xe9af, 0xe9af], /* Private Use */
- [0xe9b0, 0xe9b0], /* Private Use */
- [0xe9b1, 0xe9b1], /* Private Use */
- [0xe9b2, 0xe9b2], /* Private Use */
- [0xe9b3, 0xe9b3], /* Private Use */
- [0xe9b4, 0xe9b4], /* Private Use */
- [0xe9b5, 0xe9b5], /* Private Use */
- [0xe9b6, 0xe9b6], /* Private Use */
- [0xe9b7, 0xe9b7], /* Private Use */
- [0xe9b8, 0xe9b8], /* Private Use */
- [0xe9b9, 0xe9b9], /* Private Use */
- [0xe9ba, 0xe9ba], /* Private Use */
- [0xe9bb, 0xe9bb], /* Private Use */
- [0xe9bc, 0xe9bc], /* Private Use */
- [0xe9bd, 0xe9bd], /* Private Use */
- [0xe9be, 0xe9be], /* Private Use */
- [0xe9bf, 0xe9bf], /* Private Use */
- [0xe9c0, 0xe9c0], /* Private Use */
- [0xe9c1, 0xe9c1], /* Private Use */
- [0xe9c2, 0xe9c2], /* Private Use */
- [0xe9c3, 0xe9c3], /* Private Use */
- [0xe9c4, 0xe9c4], /* Private Use */
- [0xe9c5, 0xe9c5], /* Private Use */
- [0xe9c6, 0xe9c6], /* Private Use */
- [0xe9c7, 0xe9c7], /* Private Use */
- [0xe9c8, 0xe9c8], /* Private Use */
- [0xe9c9, 0xe9c9], /* Private Use */
- [0xe9ca, 0xe9ca], /* Private Use */
- [0xe9cb, 0xe9cb], /* Private Use */
- [0xe9cc, 0xe9cc], /* Private Use */
- [0xe9cd, 0xe9cd], /* Private Use */
- [0xe9ce, 0xe9ce], /* Private Use */
- [0xe9cf, 0xe9cf], /* Private Use */
- [0xe9d0, 0xe9d0], /* Private Use */
- [0xe9d1, 0xe9d1], /* Private Use */
- [0xe9d2, 0xe9d2], /* Private Use */
- [0xe9d3, 0xe9d3], /* Private Use */
- [0xe9d4, 0xe9d4], /* Private Use */
- [0xe9d5, 0xe9d5], /* Private Use */
- [0xe9d6, 0xe9d6], /* Private Use */
- [0xe9d7, 0xe9d7], /* Private Use */
- [0xe9d8, 0xe9d8], /* Private Use */
- [0xe9d9, 0xe9d9], /* Private Use */
- [0xe9da, 0xe9da], /* Private Use */
- [0xe9db, 0xe9db], /* Private Use */
- [0xe9dc, 0xe9dc], /* Private Use */
- [0xe9dd, 0xe9dd], /* Private Use */
- [0xe9de, 0xe9de], /* Private Use */
- [0xe9df, 0xe9df], /* Private Use */
- [0xe9e0, 0xe9e0], /* Private Use */
- [0xe9e1, 0xe9e1], /* Private Use */
- [0xe9e2, 0xe9e2], /* Private Use */
- [0xe9e3, 0xe9e3], /* Private Use */
- [0xe9e4, 0xe9e4], /* Private Use */
- [0xe9e5, 0xe9e5], /* Private Use */
- [0xe9e6, 0xe9e6], /* Private Use */
- [0xe9e7, 0xe9e7], /* Private Use */
- [0xe9e8, 0xe9e8], /* Private Use */
- [0xe9e9, 0xe9e9], /* Private Use */
- [0xe9ea, 0xe9ea], /* Private Use */
- [0xe9eb, 0xe9eb], /* Private Use */
- [0xe9ec, 0xe9ec], /* Private Use */
- [0xe9ed, 0xe9ed], /* Private Use */
- [0xe9ee, 0xe9ee], /* Private Use */
- [0xe9ef, 0xe9ef], /* Private Use */
- [0xe9f0, 0xe9f0], /* Private Use */
- [0xe9f1, 0xe9f1], /* Private Use */
- [0xe9f2, 0xe9f2], /* Private Use */
- [0xe9f3, 0xe9f3], /* Private Use */
- [0xe9f4, 0xe9f4], /* Private Use */
- [0xe9f5, 0xe9f5], /* Private Use */
- [0xe9f6, 0xe9f6], /* Private Use */
- [0xe9f7, 0xe9f7], /* Private Use */
- [0xe9f8, 0xe9f8], /* Private Use */
- [0xe9f9, 0xe9f9], /* Private Use */
- [0xe9fa, 0xe9fa], /* Private Use */
- [0xe9fb, 0xe9fb], /* Private Use */
- [0xe9fc, 0xe9fc], /* Private Use */
- [0xe9fd, 0xe9fd], /* Private Use */
- [0xe9fe, 0xe9fe], /* Private Use */
- [0xe9ff, 0xe9ff], /* Private Use */
- [0xea00, 0xea00], /* Private Use */
- [0xea01, 0xea01], /* Private Use */
- [0xea02, 0xea02], /* Private Use */
- [0xea03, 0xea03], /* Private Use */
- [0xea04, 0xea04], /* Private Use */
- [0xea05, 0xea05], /* Private Use */
- [0xea06, 0xea06], /* Private Use */
- [0xea07, 0xea07], /* Private Use */
- [0xea08, 0xea08], /* Private Use */
- [0xea09, 0xea09], /* Private Use */
- [0xea0a, 0xea0a], /* Private Use */
- [0xea0b, 0xea0b], /* Private Use */
- [0xea0c, 0xea0c], /* Private Use */
- [0xea0d, 0xea0d], /* Private Use */
- [0xea0e, 0xea0e], /* Private Use */
- [0xea0f, 0xea0f], /* Private Use */
- [0xea10, 0xea10], /* Private Use */
- [0xea11, 0xea11], /* Private Use */
- [0xea12, 0xea12], /* Private Use */
- [0xea13, 0xea13], /* Private Use */
- [0xea14, 0xea14], /* Private Use */
- [0xea15, 0xea15], /* Private Use */
- [0xea16, 0xea16], /* Private Use */
- [0xea17, 0xea17], /* Private Use */
- [0xea18, 0xea18], /* Private Use */
- [0xea19, 0xea19], /* Private Use */
- [0xea1a, 0xea1a], /* Private Use */
- [0xea1b, 0xea1b], /* Private Use */
- [0xea1c, 0xea1c], /* Private Use */
- [0xea1d, 0xea1d], /* Private Use */
- [0xea1e, 0xea1e], /* Private Use */
- [0xea1f, 0xea1f], /* Private Use */
- [0xea20, 0xea20], /* Private Use */
- [0xea21, 0xea21], /* Private Use */
- [0xea22, 0xea22], /* Private Use */
- [0xea23, 0xea23], /* Private Use */
- [0xea24, 0xea24], /* Private Use */
- [0xea25, 0xea25], /* Private Use */
- [0xea26, 0xea26], /* Private Use */
- [0xea27, 0xea27], /* Private Use */
- [0xea28, 0xea28], /* Private Use */
- [0xea29, 0xea29], /* Private Use */
- [0xea2a, 0xea2a], /* Private Use */
- [0xea2b, 0xea2b], /* Private Use */
- [0xea2c, 0xea2c], /* Private Use */
- [0xea2d, 0xea2d], /* Private Use */
- [0xea2e, 0xea2e], /* Private Use */
- [0xea2f, 0xea2f], /* Private Use */
- [0xea30, 0xea30], /* Private Use */
- [0xea31, 0xea31], /* Private Use */
- [0xea32, 0xea32], /* Private Use */
- [0xea33, 0xea33], /* Private Use */
- [0xea34, 0xea34], /* Private Use */
- [0xea35, 0xea35], /* Private Use */
- [0xea36, 0xea36], /* Private Use */
- [0xea37, 0xea37], /* Private Use */
- [0xea38, 0xea38], /* Private Use */
- [0xea39, 0xea39], /* Private Use */
- [0xea3a, 0xea3a], /* Private Use */
- [0xea3b, 0xea3b], /* Private Use */
- [0xea3c, 0xea3c], /* Private Use */
- [0xea3d, 0xea3d], /* Private Use */
- [0xea3e, 0xea3e], /* Private Use */
- [0xea3f, 0xea3f], /* Private Use */
- [0xea40, 0xea40], /* Private Use */
- [0xea41, 0xea41], /* Private Use */
- [0xea42, 0xea42], /* Private Use */
- [0xea43, 0xea43], /* Private Use */
- [0xea44, 0xea44], /* Private Use */
- [0xea45, 0xea45], /* Private Use */
- [0xea46, 0xea46], /* Private Use */
- [0xea47, 0xea47], /* Private Use */
- [0xea48, 0xea48], /* Private Use */
- [0xea49, 0xea49], /* Private Use */
- [0xea4a, 0xea4a], /* Private Use */
- [0xea4b, 0xea4b], /* Private Use */
- [0xea4c, 0xea4c], /* Private Use */
- [0xea4d, 0xea4d], /* Private Use */
- [0xea4e, 0xea4e], /* Private Use */
- [0xea4f, 0xea4f], /* Private Use */
- [0xea50, 0xea50], /* Private Use */
- [0xea51, 0xea51], /* Private Use */
- [0xea52, 0xea52], /* Private Use */
- [0xea53, 0xea53], /* Private Use */
- [0xea54, 0xea54], /* Private Use */
- [0xea55, 0xea55], /* Private Use */
- [0xea56, 0xea56], /* Private Use */
- [0xea57, 0xea57], /* Private Use */
- [0xea58, 0xea58], /* Private Use */
- [0xea59, 0xea59], /* Private Use */
- [0xea5a, 0xea5a], /* Private Use */
- [0xea5b, 0xea5b], /* Private Use */
- [0xea5c, 0xea5c], /* Private Use */
- [0xea5d, 0xea5d], /* Private Use */
- [0xea5e, 0xea5e], /* Private Use */
- [0xea5f, 0xea5f], /* Private Use */
- [0xea60, 0xea60], /* Private Use */
- [0xea61, 0xea61], /* Private Use */
- [0xea62, 0xea62], /* Private Use */
- [0xea63, 0xea63], /* Private Use */
- [0xea64, 0xea64], /* Private Use */
- [0xea65, 0xea65], /* Private Use */
- [0xea66, 0xea66], /* Private Use */
- [0xea67, 0xea67], /* Private Use */
- [0xea68, 0xea68], /* Private Use */
- [0xea69, 0xea69], /* Private Use */
- [0xea6a, 0xea6a], /* Private Use */
- [0xea6b, 0xea6b], /* Private Use */
- [0xea6c, 0xea6c], /* Private Use */
- [0xea6d, 0xea6d], /* Private Use */
- [0xea6e, 0xea6e], /* Private Use */
- [0xea6f, 0xea6f], /* Private Use */
- [0xea70, 0xea70], /* Private Use */
- [0xea71, 0xea71], /* Private Use */
- [0xea72, 0xea72], /* Private Use */
- [0xea73, 0xea73], /* Private Use */
- [0xea74, 0xea74], /* Private Use */
- [0xea75, 0xea75], /* Private Use */
- [0xea76, 0xea76], /* Private Use */
- [0xea77, 0xea77], /* Private Use */
- [0xea78, 0xea78], /* Private Use */
- [0xea79, 0xea79], /* Private Use */
- [0xea7a, 0xea7a], /* Private Use */
- [0xea7b, 0xea7b], /* Private Use */
- [0xea7c, 0xea7c], /* Private Use */
- [0xea7d, 0xea7d], /* Private Use */
- [0xea7e, 0xea7e], /* Private Use */
- [0xea7f, 0xea7f], /* Private Use */
- [0xea80, 0xea80], /* Private Use */
- [0xea81, 0xea81], /* Private Use */
- [0xea82, 0xea82], /* Private Use */
- [0xea83, 0xea83], /* Private Use */
- [0xea84, 0xea84], /* Private Use */
- [0xea85, 0xea85], /* Private Use */
- [0xea86, 0xea86], /* Private Use */
- [0xea87, 0xea87], /* Private Use */
- [0xea88, 0xea88], /* Private Use */
- [0xea89, 0xea89], /* Private Use */
- [0xea8a, 0xea8a], /* Private Use */
- [0xea8b, 0xea8b], /* Private Use */
- [0xea8c, 0xea8c], /* Private Use */
- [0xea8d, 0xea8d], /* Private Use */
- [0xea8e, 0xea8e], /* Private Use */
- [0xea8f, 0xea8f], /* Private Use */
- [0xea90, 0xea90], /* Private Use */
- [0xea91, 0xea91], /* Private Use */
- [0xea92, 0xea92], /* Private Use */
- [0xea93, 0xea93], /* Private Use */
- [0xea94, 0xea94], /* Private Use */
- [0xea95, 0xea95], /* Private Use */
- [0xea96, 0xea96], /* Private Use */
- [0xea97, 0xea97], /* Private Use */
- [0xea98, 0xea98], /* Private Use */
- [0xea99, 0xea99], /* Private Use */
- [0xea9a, 0xea9a], /* Private Use */
- [0xea9b, 0xea9b], /* Private Use */
- [0xea9c, 0xea9c], /* Private Use */
- [0xea9d, 0xea9d], /* Private Use */
- [0xea9e, 0xea9e], /* Private Use */
- [0xea9f, 0xea9f], /* Private Use */
- [0xeaa0, 0xeaa0], /* Private Use */
- [0xeaa1, 0xeaa1], /* Private Use */
- [0xeaa2, 0xeaa2], /* Private Use */
- [0xeaa3, 0xeaa3], /* Private Use */
- [0xeaa4, 0xeaa4], /* Private Use */
- [0xeaa5, 0xeaa5], /* Private Use */
- [0xeaa6, 0xeaa6], /* Private Use */
- [0xeaa7, 0xeaa7], /* Private Use */
- [0xeaa8, 0xeaa8], /* Private Use */
- [0xeaa9, 0xeaa9], /* Private Use */
- [0xeaaa, 0xeaaa], /* Private Use */
- [0xeaab, 0xeaab], /* Private Use */
- [0xeaac, 0xeaac], /* Private Use */
- [0xeaad, 0xeaad], /* Private Use */
- [0xeaae, 0xeaae], /* Private Use */
- [0xeaaf, 0xeaaf], /* Private Use */
- [0xeab0, 0xeab0], /* Private Use */
- [0xeab1, 0xeab1], /* Private Use */
- [0xeab2, 0xeab2], /* Private Use */
- [0xeab3, 0xeab3], /* Private Use */
- [0xeab4, 0xeab4], /* Private Use */
- [0xeab5, 0xeab5], /* Private Use */
- [0xeab6, 0xeab6], /* Private Use */
- [0xeab7, 0xeab7], /* Private Use */
- [0xeab8, 0xeab8], /* Private Use */
- [0xeab9, 0xeab9], /* Private Use */
- [0xeaba, 0xeaba], /* Private Use */
- [0xeabb, 0xeabb], /* Private Use */
- [0xeabc, 0xeabc], /* Private Use */
- [0xeabd, 0xeabd], /* Private Use */
- [0xeabe, 0xeabe], /* Private Use */
- [0xeabf, 0xeabf], /* Private Use */
- [0xeac0, 0xeac0], /* Private Use */
- [0xeac1, 0xeac1], /* Private Use */
- [0xeac2, 0xeac2], /* Private Use */
- [0xeac3, 0xeac3], /* Private Use */
- [0xeac4, 0xeac4], /* Private Use */
- [0xeac5, 0xeac5], /* Private Use */
- [0xeac6, 0xeac6], /* Private Use */
- [0xeac7, 0xeac7], /* Private Use */
- [0xeac8, 0xeac8], /* Private Use */
- [0xeac9, 0xeac9], /* Private Use */
- [0xeaca, 0xeaca], /* Private Use */
- [0xeacb, 0xeacb], /* Private Use */
- [0xeacc, 0xeacc], /* Private Use */
- [0xeacd, 0xeacd], /* Private Use */
- [0xeace, 0xeace], /* Private Use */
- [0xeacf, 0xeacf], /* Private Use */
- [0xead0, 0xead0], /* Private Use */
- [0xead1, 0xead1], /* Private Use */
- [0xead2, 0xead2], /* Private Use */
- [0xead3, 0xead3], /* Private Use */
- [0xead4, 0xead4], /* Private Use */
- [0xead5, 0xead5], /* Private Use */
- [0xead6, 0xead6], /* Private Use */
- [0xead7, 0xead7], /* Private Use */
- [0xead8, 0xead8], /* Private Use */
- [0xead9, 0xead9], /* Private Use */
- [0xeada, 0xeada], /* Private Use */
- [0xeadb, 0xeadb], /* Private Use */
- [0xeadc, 0xeadc], /* Private Use */
- [0xeadd, 0xeadd], /* Private Use */
- [0xeade, 0xeade], /* Private Use */
- [0xeadf, 0xeadf], /* Private Use */
- [0xeae0, 0xeae0], /* Private Use */
- [0xeae1, 0xeae1], /* Private Use */
- [0xeae2, 0xeae2], /* Private Use */
- [0xeae3, 0xeae3], /* Private Use */
- [0xeae4, 0xeae4], /* Private Use */
- [0xeae5, 0xeae5], /* Private Use */
- [0xeae6, 0xeae6], /* Private Use */
- [0xeae7, 0xeae7], /* Private Use */
- [0xeae8, 0xeae8], /* Private Use */
- [0xeae9, 0xeae9], /* Private Use */
- [0xeaea, 0xeaea], /* Private Use */
- [0xeaeb, 0xeaeb], /* Private Use */
- [0xeaec, 0xeaec], /* Private Use */
- [0xeaed, 0xeaed], /* Private Use */
- [0xeaee, 0xeaee], /* Private Use */
- [0xeaef, 0xeaef], /* Private Use */
- [0xeaf0, 0xeaf0], /* Private Use */
- [0xeaf1, 0xeaf1], /* Private Use */
- [0xeaf2, 0xeaf2], /* Private Use */
- [0xeaf3, 0xeaf3], /* Private Use */
- [0xeaf4, 0xeaf4], /* Private Use */
- [0xeaf5, 0xeaf5], /* Private Use */
- [0xeaf6, 0xeaf6], /* Private Use */
- [0xeaf7, 0xeaf7], /* Private Use */
- [0xeaf8, 0xeaf8], /* Private Use */
- [0xeaf9, 0xeaf9], /* Private Use */
- [0xeafa, 0xeafa], /* Private Use */
- [0xeafb, 0xeafb], /* Private Use */
- [0xeafc, 0xeafc], /* Private Use */
- [0xeafd, 0xeafd], /* Private Use */
- [0xeafe, 0xeafe], /* Private Use */
- [0xeaff, 0xeaff], /* Private Use */
- [0xeb00, 0xeb00], /* Private Use */
- [0xeb01, 0xeb01], /* Private Use */
- [0xeb02, 0xeb02], /* Private Use */
- [0xeb03, 0xeb03], /* Private Use */
- [0xeb04, 0xeb04], /* Private Use */
- [0xeb05, 0xeb05], /* Private Use */
- [0xeb06, 0xeb06], /* Private Use */
- [0xeb07, 0xeb07], /* Private Use */
- [0xeb08, 0xeb08], /* Private Use */
- [0xeb09, 0xeb09], /* Private Use */
- [0xeb0a, 0xeb0a], /* Private Use */
- [0xeb0b, 0xeb0b], /* Private Use */
- [0xeb0c, 0xeb0c], /* Private Use */
- [0xeb0d, 0xeb0d], /* Private Use */
- [0xeb0e, 0xeb0e], /* Private Use */
- [0xeb0f, 0xeb0f], /* Private Use */
- [0xeb10, 0xeb10], /* Private Use */
- [0xeb11, 0xeb11], /* Private Use */
- [0xeb12, 0xeb12], /* Private Use */
- [0xeb13, 0xeb13], /* Private Use */
- [0xeb14, 0xeb14], /* Private Use */
- [0xeb15, 0xeb15], /* Private Use */
- [0xeb16, 0xeb16], /* Private Use */
- [0xeb17, 0xeb17], /* Private Use */
- [0xeb18, 0xeb18], /* Private Use */
- [0xeb19, 0xeb19], /* Private Use */
- [0xeb1a, 0xeb1a], /* Private Use */
- [0xeb1b, 0xeb1b], /* Private Use */
- [0xeb1c, 0xeb1c], /* Private Use */
- [0xeb1d, 0xeb1d], /* Private Use */
- [0xeb1e, 0xeb1e], /* Private Use */
- [0xeb1f, 0xeb1f], /* Private Use */
- [0xeb20, 0xeb20], /* Private Use */
- [0xeb21, 0xeb21], /* Private Use */
- [0xeb22, 0xeb22], /* Private Use */
- [0xeb23, 0xeb23], /* Private Use */
- [0xeb24, 0xeb24], /* Private Use */
- [0xeb25, 0xeb25], /* Private Use */
- [0xeb26, 0xeb26], /* Private Use */
- [0xeb27, 0xeb27], /* Private Use */
- [0xeb28, 0xeb28], /* Private Use */
- [0xeb29, 0xeb29], /* Private Use */
- [0xeb2a, 0xeb2a], /* Private Use */
- [0xeb2b, 0xeb2b], /* Private Use */
- [0xeb2c, 0xeb2c], /* Private Use */
- [0xeb2d, 0xeb2d], /* Private Use */
- [0xeb2e, 0xeb2e], /* Private Use */
- [0xeb2f, 0xeb2f], /* Private Use */
- [0xeb30, 0xeb30], /* Private Use */
- [0xeb31, 0xeb31], /* Private Use */
- [0xeb32, 0xeb32], /* Private Use */
- [0xeb33, 0xeb33], /* Private Use */
- [0xeb34, 0xeb34], /* Private Use */
- [0xeb35, 0xeb35], /* Private Use */
- [0xeb36, 0xeb36], /* Private Use */
- [0xeb37, 0xeb37], /* Private Use */
- [0xeb38, 0xeb38], /* Private Use */
- [0xeb39, 0xeb39], /* Private Use */
- [0xeb3a, 0xeb3a], /* Private Use */
- [0xeb3b, 0xeb3b], /* Private Use */
- [0xeb3c, 0xeb3c], /* Private Use */
- [0xeb3d, 0xeb3d], /* Private Use */
- [0xeb3e, 0xeb3e], /* Private Use */
- [0xeb3f, 0xeb3f], /* Private Use */
- [0xeb40, 0xeb40], /* Private Use */
- [0xeb41, 0xeb41], /* Private Use */
- [0xeb42, 0xeb42], /* Private Use */
- [0xeb43, 0xeb43], /* Private Use */
- [0xeb44, 0xeb44], /* Private Use */
- [0xeb45, 0xeb45], /* Private Use */
- [0xeb46, 0xeb46], /* Private Use */
- [0xeb47, 0xeb47], /* Private Use */
- [0xeb48, 0xeb48], /* Private Use */
- [0xeb49, 0xeb49], /* Private Use */
- [0xeb4a, 0xeb4a], /* Private Use */
- [0xeb4b, 0xeb4b], /* Private Use */
- [0xeb4c, 0xeb4c], /* Private Use */
- [0xeb4d, 0xeb4d], /* Private Use */
- [0xeb4e, 0xeb4e], /* Private Use */
- [0xeb4f, 0xeb4f], /* Private Use */
- [0xeb50, 0xeb50], /* Private Use */
- [0xeb51, 0xeb51], /* Private Use */
- [0xeb52, 0xeb52], /* Private Use */
- [0xeb53, 0xeb53], /* Private Use */
- [0xeb54, 0xeb54], /* Private Use */
- [0xeb55, 0xeb55], /* Private Use */
- [0xeb56, 0xeb56], /* Private Use */
- [0xeb57, 0xeb57], /* Private Use */
- [0xeb58, 0xeb58], /* Private Use */
- [0xeb59, 0xeb59], /* Private Use */
- [0xeb5a, 0xeb5a], /* Private Use */
- [0xeb5b, 0xeb5b], /* Private Use */
- [0xeb5c, 0xeb5c], /* Private Use */
- [0xeb5d, 0xeb5d], /* Private Use */
- [0xeb5e, 0xeb5e], /* Private Use */
- [0xeb5f, 0xeb5f], /* Private Use */
- [0xeb60, 0xeb60], /* Private Use */
- [0xeb61, 0xeb61], /* Private Use */
- [0xeb62, 0xeb62], /* Private Use */
- [0xeb63, 0xeb63], /* Private Use */
- [0xeb64, 0xeb64], /* Private Use */
- [0xeb65, 0xeb65], /* Private Use */
- [0xeb66, 0xeb66], /* Private Use */
- [0xeb67, 0xeb67], /* Private Use */
- [0xeb68, 0xeb68], /* Private Use */
- [0xeb69, 0xeb69], /* Private Use */
- [0xeb6a, 0xeb6a], /* Private Use */
- [0xeb6b, 0xeb6b], /* Private Use */
- [0xeb6c, 0xeb6c], /* Private Use */
- [0xeb6d, 0xeb6d], /* Private Use */
- [0xeb6e, 0xeb6e], /* Private Use */
- [0xeb6f, 0xeb6f], /* Private Use */
- [0xeb70, 0xeb70], /* Private Use */
- [0xeb71, 0xeb71], /* Private Use */
- [0xeb72, 0xeb72], /* Private Use */
- [0xeb73, 0xeb73], /* Private Use */
- [0xeb74, 0xeb74], /* Private Use */
- [0xeb75, 0xeb75], /* Private Use */
- [0xeb76, 0xeb76], /* Private Use */
- [0xeb77, 0xeb77], /* Private Use */
- [0xeb78, 0xeb78], /* Private Use */
- [0xeb79, 0xeb79], /* Private Use */
- [0xeb7a, 0xeb7a], /* Private Use */
- [0xeb7b, 0xeb7b], /* Private Use */
- [0xeb7c, 0xeb7c], /* Private Use */
- [0xeb7d, 0xeb7d], /* Private Use */
- [0xeb7e, 0xeb7e], /* Private Use */
- [0xeb7f, 0xeb7f], /* Private Use */
- [0xeb80, 0xeb80], /* Private Use */
- [0xeb81, 0xeb81], /* Private Use */
- [0xeb82, 0xeb82], /* Private Use */
- [0xeb83, 0xeb83], /* Private Use */
- [0xeb84, 0xeb84], /* Private Use */
- [0xeb85, 0xeb85], /* Private Use */
- [0xeb86, 0xeb86], /* Private Use */
- [0xeb87, 0xeb87], /* Private Use */
- [0xeb88, 0xeb88], /* Private Use */
- [0xeb89, 0xeb89], /* Private Use */
- [0xeb8a, 0xeb8a], /* Private Use */
- [0xeb8b, 0xeb8b], /* Private Use */
- [0xeb8c, 0xeb8c], /* Private Use */
- [0xeb8d, 0xeb8d], /* Private Use */
- [0xeb8e, 0xeb8e], /* Private Use */
- [0xeb8f, 0xeb8f], /* Private Use */
- [0xeb90, 0xeb90], /* Private Use */
- [0xeb91, 0xeb91], /* Private Use */
- [0xeb92, 0xeb92], /* Private Use */
- [0xeb93, 0xeb93], /* Private Use */
- [0xeb94, 0xeb94], /* Private Use */
- [0xeb95, 0xeb95], /* Private Use */
- [0xeb96, 0xeb96], /* Private Use */
- [0xeb97, 0xeb97], /* Private Use */
- [0xeb98, 0xeb98], /* Private Use */
- [0xeb99, 0xeb99], /* Private Use */
- [0xeb9a, 0xeb9a], /* Private Use */
- [0xeb9b, 0xeb9b], /* Private Use */
- [0xeb9c, 0xeb9c], /* Private Use */
- [0xeb9d, 0xeb9d], /* Private Use */
- [0xeb9e, 0xeb9e], /* Private Use */
- [0xeb9f, 0xeb9f], /* Private Use */
- [0xeba0, 0xeba0], /* Private Use */
- [0xeba1, 0xeba1], /* Private Use */
- [0xeba2, 0xeba2], /* Private Use */
- [0xeba3, 0xeba3], /* Private Use */
- [0xeba4, 0xeba4], /* Private Use */
- [0xeba5, 0xeba5], /* Private Use */
- [0xeba6, 0xeba6], /* Private Use */
- [0xeba7, 0xeba7], /* Private Use */
- [0xeba8, 0xeba8], /* Private Use */
- [0xeba9, 0xeba9], /* Private Use */
- [0xebaa, 0xebaa], /* Private Use */
- [0xebab, 0xebab], /* Private Use */
- [0xebac, 0xebac], /* Private Use */
- [0xebad, 0xebad], /* Private Use */
- [0xebae, 0xebae], /* Private Use */
- [0xebaf, 0xebaf], /* Private Use */
- [0xebb0, 0xebb0], /* Private Use */
- [0xebb1, 0xebb1], /* Private Use */
- [0xebb2, 0xebb2], /* Private Use */
- [0xebb3, 0xebb3], /* Private Use */
- [0xebb4, 0xebb4], /* Private Use */
- [0xebb5, 0xebb5], /* Private Use */
- [0xebb6, 0xebb6], /* Private Use */
- [0xebb7, 0xebb7], /* Private Use */
- [0xebb8, 0xebb8], /* Private Use */
- [0xebb9, 0xebb9], /* Private Use */
- [0xebba, 0xebba], /* Private Use */
- [0xebbb, 0xebbb], /* Private Use */
- [0xebbc, 0xebbc], /* Private Use */
- [0xebbd, 0xebbd], /* Private Use */
- [0xebbe, 0xebbe], /* Private Use */
- [0xebbf, 0xebbf], /* Private Use */
- [0xebc0, 0xebc0], /* Private Use */
- [0xebc1, 0xebc1], /* Private Use */
- [0xebc2, 0xebc2], /* Private Use */
- [0xebc3, 0xebc3], /* Private Use */
- [0xebc4, 0xebc4], /* Private Use */
- [0xebc5, 0xebc5], /* Private Use */
- [0xebc6, 0xebc6], /* Private Use */
- [0xebc7, 0xebc7], /* Private Use */
- [0xebc8, 0xebc8], /* Private Use */
- [0xebc9, 0xebc9], /* Private Use */
- [0xebca, 0xebca], /* Private Use */
- [0xebcb, 0xebcb], /* Private Use */
- [0xebcc, 0xebcc], /* Private Use */
- [0xebcd, 0xebcd], /* Private Use */
- [0xebce, 0xebce], /* Private Use */
- [0xebcf, 0xebcf], /* Private Use */
- [0xebd0, 0xebd0], /* Private Use */
- [0xebd1, 0xebd1], /* Private Use */
- [0xebd2, 0xebd2], /* Private Use */
- [0xebd3, 0xebd3], /* Private Use */
- [0xebd4, 0xebd4], /* Private Use */
- [0xebd5, 0xebd5], /* Private Use */
- [0xebd6, 0xebd6], /* Private Use */
- [0xebd7, 0xebd7], /* Private Use */
- [0xebd8, 0xebd8], /* Private Use */
- [0xebd9, 0xebd9], /* Private Use */
- [0xebda, 0xebda], /* Private Use */
- [0xebdb, 0xebdb], /* Private Use */
- [0xebdc, 0xebdc], /* Private Use */
- [0xebdd, 0xebdd], /* Private Use */
- [0xebde, 0xebde], /* Private Use */
- [0xebdf, 0xebdf], /* Private Use */
- [0xebe0, 0xebe0], /* Private Use */
- [0xebe1, 0xebe1], /* Private Use */
- [0xebe2, 0xebe2], /* Private Use */
- [0xebe3, 0xebe3], /* Private Use */
- [0xebe4, 0xebe4], /* Private Use */
- [0xebe5, 0xebe5], /* Private Use */
- [0xebe6, 0xebe6], /* Private Use */
- [0xebe7, 0xebe7], /* Private Use */
- [0xebe8, 0xebe8], /* Private Use */
- [0xebe9, 0xebe9], /* Private Use */
- [0xebea, 0xebea], /* Private Use */
- [0xebeb, 0xebeb], /* Private Use */
- [0xebec, 0xebec], /* Private Use */
- [0xebed, 0xebed], /* Private Use */
- [0xebee, 0xebee], /* Private Use */
- [0xebef, 0xebef], /* Private Use */
- [0xebf0, 0xebf0], /* Private Use */
- [0xebf1, 0xebf1], /* Private Use */
- [0xebf2, 0xebf2], /* Private Use */
- [0xebf3, 0xebf3], /* Private Use */
- [0xebf4, 0xebf4], /* Private Use */
- [0xebf5, 0xebf5], /* Private Use */
- [0xebf6, 0xebf6], /* Private Use */
- [0xebf7, 0xebf7], /* Private Use */
- [0xebf8, 0xebf8], /* Private Use */
- [0xebf9, 0xebf9], /* Private Use */
- [0xebfa, 0xebfa], /* Private Use */
- [0xebfb, 0xebfb], /* Private Use */
- [0xebfc, 0xebfc], /* Private Use */
- [0xebfd, 0xebfd], /* Private Use */
- [0xebfe, 0xebfe], /* Private Use */
- [0xebff, 0xebff], /* Private Use */
- [0xec00, 0xec00], /* Private Use */
- [0xec01, 0xec01], /* Private Use */
- [0xec02, 0xec02], /* Private Use */
- [0xec03, 0xec03], /* Private Use */
- [0xec04, 0xec04], /* Private Use */
- [0xec05, 0xec05], /* Private Use */
- [0xec06, 0xec06], /* Private Use */
- [0xec07, 0xec07], /* Private Use */
- [0xec08, 0xec08], /* Private Use */
- [0xec09, 0xec09], /* Private Use */
- [0xec0a, 0xec0a], /* Private Use */
- [0xec0b, 0xec0b], /* Private Use */
- [0xec0c, 0xec0c], /* Private Use */
- [0xec0d, 0xec0d], /* Private Use */
- [0xec0e, 0xec0e], /* Private Use */
- [0xec0f, 0xec0f], /* Private Use */
- [0xec10, 0xec10], /* Private Use */
- [0xec11, 0xec11], /* Private Use */
- [0xec12, 0xec12], /* Private Use */
- [0xec13, 0xec13], /* Private Use */
- [0xec14, 0xec14], /* Private Use */
- [0xec15, 0xec15], /* Private Use */
- [0xec16, 0xec16], /* Private Use */
- [0xec17, 0xec17], /* Private Use */
- [0xec18, 0xec18], /* Private Use */
- [0xec19, 0xec19], /* Private Use */
- [0xec1a, 0xec1a], /* Private Use */
- [0xec1b, 0xec1b], /* Private Use */
- [0xec1c, 0xec1c], /* Private Use */
- [0xec1d, 0xec1d], /* Private Use */
- [0xec1e, 0xec1e], /* Private Use */
- [0xec1f, 0xec1f], /* Private Use */
- [0xec20, 0xec20], /* Private Use */
- [0xec21, 0xec21], /* Private Use */
- [0xec22, 0xec22], /* Private Use */
- [0xec23, 0xec23], /* Private Use */
- [0xec24, 0xec24], /* Private Use */
- [0xec25, 0xec25], /* Private Use */
- [0xec26, 0xec26], /* Private Use */
- [0xec27, 0xec27], /* Private Use */
- [0xec28, 0xec28], /* Private Use */
- [0xec29, 0xec29], /* Private Use */
- [0xec2a, 0xec2a], /* Private Use */
- [0xec2b, 0xec2b], /* Private Use */
- [0xec2c, 0xec2c], /* Private Use */
- [0xec2d, 0xec2d], /* Private Use */
- [0xec2e, 0xec2e], /* Private Use */
- [0xec2f, 0xec2f], /* Private Use */
- [0xec30, 0xec30], /* Private Use */
- [0xec31, 0xec31], /* Private Use */
- [0xec32, 0xec32], /* Private Use */
- [0xec33, 0xec33], /* Private Use */
- [0xec34, 0xec34], /* Private Use */
- [0xec35, 0xec35], /* Private Use */
- [0xec36, 0xec36], /* Private Use */
- [0xec37, 0xec37], /* Private Use */
- [0xec38, 0xec38], /* Private Use */
- [0xec39, 0xec39], /* Private Use */
- [0xec3a, 0xec3a], /* Private Use */
- [0xec3b, 0xec3b], /* Private Use */
- [0xec3c, 0xec3c], /* Private Use */
- [0xec3d, 0xec3d], /* Private Use */
- [0xec3e, 0xec3e], /* Private Use */
- [0xec3f, 0xec3f], /* Private Use */
- [0xec40, 0xec40], /* Private Use */
- [0xec41, 0xec41], /* Private Use */
- [0xec42, 0xec42], /* Private Use */
- [0xec43, 0xec43], /* Private Use */
- [0xec44, 0xec44], /* Private Use */
- [0xec45, 0xec45], /* Private Use */
- [0xec46, 0xec46], /* Private Use */
- [0xec47, 0xec47], /* Private Use */
- [0xec48, 0xec48], /* Private Use */
- [0xec49, 0xec49], /* Private Use */
- [0xec4a, 0xec4a], /* Private Use */
- [0xec4b, 0xec4b], /* Private Use */
- [0xec4c, 0xec4c], /* Private Use */
- [0xec4d, 0xec4d], /* Private Use */
- [0xec4e, 0xec4e], /* Private Use */
- [0xec4f, 0xec4f], /* Private Use */
- [0xec50, 0xec50], /* Private Use */
- [0xec51, 0xec51], /* Private Use */
- [0xec52, 0xec52], /* Private Use */
- [0xec53, 0xec53], /* Private Use */
- [0xec54, 0xec54], /* Private Use */
- [0xec55, 0xec55], /* Private Use */
- [0xec56, 0xec56], /* Private Use */
- [0xec57, 0xec57], /* Private Use */
- [0xec58, 0xec58], /* Private Use */
- [0xec59, 0xec59], /* Private Use */
- [0xec5a, 0xec5a], /* Private Use */
- [0xec5b, 0xec5b], /* Private Use */
- [0xec5c, 0xec5c], /* Private Use */
- [0xec5d, 0xec5d], /* Private Use */
- [0xec5e, 0xec5e], /* Private Use */
- [0xec5f, 0xec5f], /* Private Use */
- [0xec60, 0xec60], /* Private Use */
- [0xec61, 0xec61], /* Private Use */
- [0xec62, 0xec62], /* Private Use */
- [0xec63, 0xec63], /* Private Use */
- [0xec64, 0xec64], /* Private Use */
- [0xec65, 0xec65], /* Private Use */
- [0xec66, 0xec66], /* Private Use */
- [0xec67, 0xec67], /* Private Use */
- [0xec68, 0xec68], /* Private Use */
- [0xec69, 0xec69], /* Private Use */
- [0xec6a, 0xec6a], /* Private Use */
- [0xec6b, 0xec6b], /* Private Use */
- [0xec6c, 0xec6c], /* Private Use */
- [0xec6d, 0xec6d], /* Private Use */
- [0xec6e, 0xec6e], /* Private Use */
- [0xec6f, 0xec6f], /* Private Use */
- [0xec70, 0xec70], /* Private Use */
- [0xec71, 0xec71], /* Private Use */
- [0xec72, 0xec72], /* Private Use */
- [0xec73, 0xec73], /* Private Use */
- [0xec74, 0xec74], /* Private Use */
- [0xec75, 0xec75], /* Private Use */
- [0xec76, 0xec76], /* Private Use */
- [0xec77, 0xec77], /* Private Use */
- [0xec78, 0xec78], /* Private Use */
- [0xec79, 0xec79], /* Private Use */
- [0xec7a, 0xec7a], /* Private Use */
- [0xec7b, 0xec7b], /* Private Use */
- [0xec7c, 0xec7c], /* Private Use */
- [0xec7d, 0xec7d], /* Private Use */
- [0xec7e, 0xec7e], /* Private Use */
- [0xec7f, 0xec7f], /* Private Use */
- [0xec80, 0xec80], /* Private Use */
- [0xec81, 0xec81], /* Private Use */
- [0xec82, 0xec82], /* Private Use */
- [0xec83, 0xec83], /* Private Use */
- [0xec84, 0xec84], /* Private Use */
- [0xec85, 0xec85], /* Private Use */
- [0xec86, 0xec86], /* Private Use */
- [0xec87, 0xec87], /* Private Use */
- [0xec88, 0xec88], /* Private Use */
- [0xec89, 0xec89], /* Private Use */
- [0xec8a, 0xec8a], /* Private Use */
- [0xec8b, 0xec8b], /* Private Use */
- [0xec8c, 0xec8c], /* Private Use */
- [0xec8d, 0xec8d], /* Private Use */
- [0xec8e, 0xec8e], /* Private Use */
- [0xec8f, 0xec8f], /* Private Use */
- [0xec90, 0xec90], /* Private Use */
- [0xec91, 0xec91], /* Private Use */
- [0xec92, 0xec92], /* Private Use */
- [0xec93, 0xec93], /* Private Use */
- [0xec94, 0xec94], /* Private Use */
- [0xec95, 0xec95], /* Private Use */
- [0xec96, 0xec96], /* Private Use */
- [0xec97, 0xec97], /* Private Use */
- [0xec98, 0xec98], /* Private Use */
- [0xec99, 0xec99], /* Private Use */
- [0xec9a, 0xec9a], /* Private Use */
- [0xec9b, 0xec9b], /* Private Use */
- [0xec9c, 0xec9c], /* Private Use */
- [0xec9d, 0xec9d], /* Private Use */
- [0xec9e, 0xec9e], /* Private Use */
- [0xec9f, 0xec9f], /* Private Use */
- [0xeca0, 0xeca0], /* Private Use */
- [0xeca1, 0xeca1], /* Private Use */
- [0xeca2, 0xeca2], /* Private Use */
- [0xeca3, 0xeca3], /* Private Use */
- [0xeca4, 0xeca4], /* Private Use */
- [0xeca5, 0xeca5], /* Private Use */
- [0xeca6, 0xeca6], /* Private Use */
- [0xeca7, 0xeca7], /* Private Use */
- [0xeca8, 0xeca8], /* Private Use */
- [0xeca9, 0xeca9], /* Private Use */
- [0xecaa, 0xecaa], /* Private Use */
- [0xecab, 0xecab], /* Private Use */
- [0xecac, 0xecac], /* Private Use */
- [0xecad, 0xecad], /* Private Use */
- [0xecae, 0xecae], /* Private Use */
- [0xecaf, 0xecaf], /* Private Use */
- [0xecb0, 0xecb0], /* Private Use */
- [0xecb1, 0xecb1], /* Private Use */
- [0xecb2, 0xecb2], /* Private Use */
- [0xecb3, 0xecb3], /* Private Use */
- [0xecb4, 0xecb4], /* Private Use */
- [0xecb5, 0xecb5], /* Private Use */
- [0xecb6, 0xecb6], /* Private Use */
- [0xecb7, 0xecb7], /* Private Use */
- [0xecb8, 0xecb8], /* Private Use */
- [0xecb9, 0xecb9], /* Private Use */
- [0xecba, 0xecba], /* Private Use */
- [0xecbb, 0xecbb], /* Private Use */
- [0xecbc, 0xecbc], /* Private Use */
- [0xecbd, 0xecbd], /* Private Use */
- [0xecbe, 0xecbe], /* Private Use */
- [0xecbf, 0xecbf], /* Private Use */
- [0xecc0, 0xecc0], /* Private Use */
- [0xecc1, 0xecc1], /* Private Use */
- [0xecc2, 0xecc2], /* Private Use */
- [0xecc3, 0xecc3], /* Private Use */
- [0xecc4, 0xecc4], /* Private Use */
- [0xecc5, 0xecc5], /* Private Use */
- [0xecc6, 0xecc6], /* Private Use */
- [0xecc7, 0xecc7], /* Private Use */
- [0xecc8, 0xecc8], /* Private Use */
- [0xecc9, 0xecc9], /* Private Use */
- [0xecca, 0xecca], /* Private Use */
- [0xeccb, 0xeccb], /* Private Use */
- [0xeccc, 0xeccc], /* Private Use */
- [0xeccd, 0xeccd], /* Private Use */
- [0xecce, 0xecce], /* Private Use */
- [0xeccf, 0xeccf], /* Private Use */
- [0xecd0, 0xecd0], /* Private Use */
- [0xecd1, 0xecd1], /* Private Use */
- [0xecd2, 0xecd2], /* Private Use */
- [0xecd3, 0xecd3], /* Private Use */
- [0xecd4, 0xecd4], /* Private Use */
- [0xecd5, 0xecd5], /* Private Use */
- [0xecd6, 0xecd6], /* Private Use */
- [0xecd7, 0xecd7], /* Private Use */
- [0xecd8, 0xecd8], /* Private Use */
- [0xecd9, 0xecd9], /* Private Use */
- [0xecda, 0xecda], /* Private Use */
- [0xecdb, 0xecdb], /* Private Use */
- [0xecdc, 0xecdc], /* Private Use */
- [0xecdd, 0xecdd], /* Private Use */
- [0xecde, 0xecde], /* Private Use */
- [0xecdf, 0xecdf], /* Private Use */
- [0xece0, 0xece0], /* Private Use */
- [0xece1, 0xece1], /* Private Use */
- [0xece2, 0xece2], /* Private Use */
- [0xece3, 0xece3], /* Private Use */
- [0xece4, 0xece4], /* Private Use */
- [0xece5, 0xece5], /* Private Use */
- [0xece6, 0xece6], /* Private Use */
- [0xece7, 0xece7], /* Private Use */
- [0xece8, 0xece8], /* Private Use */
- [0xece9, 0xece9], /* Private Use */
- [0xecea, 0xecea], /* Private Use */
- [0xeceb, 0xeceb], /* Private Use */
- [0xecec, 0xecec], /* Private Use */
- [0xeced, 0xeced], /* Private Use */
- [0xecee, 0xecee], /* Private Use */
- [0xecef, 0xecef], /* Private Use */
- [0xecf0, 0xecf0], /* Private Use */
- [0xecf1, 0xecf1], /* Private Use */
- [0xecf2, 0xecf2], /* Private Use */
- [0xecf3, 0xecf3], /* Private Use */
- [0xecf4, 0xecf4], /* Private Use */
- [0xecf5, 0xecf5], /* Private Use */
- [0xecf6, 0xecf6], /* Private Use */
- [0xecf7, 0xecf7], /* Private Use */
- [0xecf8, 0xecf8], /* Private Use */
- [0xecf9, 0xecf9], /* Private Use */
- [0xecfa, 0xecfa], /* Private Use */
- [0xecfb, 0xecfb], /* Private Use */
- [0xecfc, 0xecfc], /* Private Use */
- [0xecfd, 0xecfd], /* Private Use */
- [0xecfe, 0xecfe], /* Private Use */
- [0xecff, 0xecff], /* Private Use */
- [0xed00, 0xed00], /* Private Use */
- [0xed01, 0xed01], /* Private Use */
- [0xed02, 0xed02], /* Private Use */
- [0xed03, 0xed03], /* Private Use */
- [0xed04, 0xed04], /* Private Use */
- [0xed05, 0xed05], /* Private Use */
- [0xed06, 0xed06], /* Private Use */
- [0xed07, 0xed07], /* Private Use */
- [0xed08, 0xed08], /* Private Use */
- [0xed09, 0xed09], /* Private Use */
- [0xed0a, 0xed0a], /* Private Use */
- [0xed0b, 0xed0b], /* Private Use */
- [0xed0c, 0xed0c], /* Private Use */
- [0xed0d, 0xed0d], /* Private Use */
- [0xed0e, 0xed0e], /* Private Use */
- [0xed0f, 0xed0f], /* Private Use */
- [0xed10, 0xed10], /* Private Use */
- [0xed11, 0xed11], /* Private Use */
- [0xed12, 0xed12], /* Private Use */
- [0xed13, 0xed13], /* Private Use */
- [0xed14, 0xed14], /* Private Use */
- [0xed15, 0xed15], /* Private Use */
- [0xed16, 0xed16], /* Private Use */
- [0xed17, 0xed17], /* Private Use */
- [0xed18, 0xed18], /* Private Use */
- [0xed19, 0xed19], /* Private Use */
- [0xed1a, 0xed1a], /* Private Use */
- [0xed1b, 0xed1b], /* Private Use */
- [0xed1c, 0xed1c], /* Private Use */
- [0xed1d, 0xed1d], /* Private Use */
- [0xed1e, 0xed1e], /* Private Use */
- [0xed1f, 0xed1f], /* Private Use */
- [0xed20, 0xed20], /* Private Use */
- [0xed21, 0xed21], /* Private Use */
- [0xed22, 0xed22], /* Private Use */
- [0xed23, 0xed23], /* Private Use */
- [0xed24, 0xed24], /* Private Use */
- [0xed25, 0xed25], /* Private Use */
- [0xed26, 0xed26], /* Private Use */
- [0xed27, 0xed27], /* Private Use */
- [0xed28, 0xed28], /* Private Use */
- [0xed29, 0xed29], /* Private Use */
- [0xed2a, 0xed2a], /* Private Use */
- [0xed2b, 0xed2b], /* Private Use */
- [0xed2c, 0xed2c], /* Private Use */
- [0xed2d, 0xed2d], /* Private Use */
- [0xed2e, 0xed2e], /* Private Use */
- [0xed2f, 0xed2f], /* Private Use */
- [0xed30, 0xed30], /* Private Use */
- [0xed31, 0xed31], /* Private Use */
- [0xed32, 0xed32], /* Private Use */
- [0xed33, 0xed33], /* Private Use */
- [0xed34, 0xed34], /* Private Use */
- [0xed35, 0xed35], /* Private Use */
- [0xed36, 0xed36], /* Private Use */
- [0xed37, 0xed37], /* Private Use */
- [0xed38, 0xed38], /* Private Use */
- [0xed39, 0xed39], /* Private Use */
- [0xed3a, 0xed3a], /* Private Use */
- [0xed3b, 0xed3b], /* Private Use */
- [0xed3c, 0xed3c], /* Private Use */
- [0xed3d, 0xed3d], /* Private Use */
- [0xed3e, 0xed3e], /* Private Use */
- [0xed3f, 0xed3f], /* Private Use */
- [0xed40, 0xed40], /* Private Use */
- [0xed41, 0xed41], /* Private Use */
- [0xed42, 0xed42], /* Private Use */
- [0xed43, 0xed43], /* Private Use */
- [0xed44, 0xed44], /* Private Use */
- [0xed45, 0xed45], /* Private Use */
- [0xed46, 0xed46], /* Private Use */
- [0xed47, 0xed47], /* Private Use */
- [0xed48, 0xed48], /* Private Use */
- [0xed49, 0xed49], /* Private Use */
- [0xed4a, 0xed4a], /* Private Use */
- [0xed4b, 0xed4b], /* Private Use */
- [0xed4c, 0xed4c], /* Private Use */
- [0xed4d, 0xed4d], /* Private Use */
- [0xed4e, 0xed4e], /* Private Use */
- [0xed4f, 0xed4f], /* Private Use */
- [0xed50, 0xed50], /* Private Use */
- [0xed51, 0xed51], /* Private Use */
- [0xed52, 0xed52], /* Private Use */
- [0xed53, 0xed53], /* Private Use */
- [0xed54, 0xed54], /* Private Use */
- [0xed55, 0xed55], /* Private Use */
- [0xed56, 0xed56], /* Private Use */
- [0xed57, 0xed57], /* Private Use */
- [0xed58, 0xed58], /* Private Use */
- [0xed59, 0xed59], /* Private Use */
- [0xed5a, 0xed5a], /* Private Use */
- [0xed5b, 0xed5b], /* Private Use */
- [0xed5c, 0xed5c], /* Private Use */
- [0xed5d, 0xed5d], /* Private Use */
- [0xed5e, 0xed5e], /* Private Use */
- [0xed5f, 0xed5f], /* Private Use */
- [0xed60, 0xed60], /* Private Use */
- [0xed61, 0xed61], /* Private Use */
- [0xed62, 0xed62], /* Private Use */
- [0xed63, 0xed63], /* Private Use */
- [0xed64, 0xed64], /* Private Use */
- [0xed65, 0xed65], /* Private Use */
- [0xed66, 0xed66], /* Private Use */
- [0xed67, 0xed67], /* Private Use */
- [0xed68, 0xed68], /* Private Use */
- [0xed69, 0xed69], /* Private Use */
- [0xed6a, 0xed6a], /* Private Use */
- [0xed6b, 0xed6b], /* Private Use */
- [0xed6c, 0xed6c], /* Private Use */
- [0xed6d, 0xed6d], /* Private Use */
- [0xed6e, 0xed6e], /* Private Use */
- [0xed6f, 0xed6f], /* Private Use */
- [0xed70, 0xed70], /* Private Use */
- [0xed71, 0xed71], /* Private Use */
- [0xed72, 0xed72], /* Private Use */
- [0xed73, 0xed73], /* Private Use */
- [0xed74, 0xed74], /* Private Use */
- [0xed75, 0xed75], /* Private Use */
- [0xed76, 0xed76], /* Private Use */
- [0xed77, 0xed77], /* Private Use */
- [0xed78, 0xed78], /* Private Use */
- [0xed79, 0xed79], /* Private Use */
- [0xed7a, 0xed7a], /* Private Use */
- [0xed7b, 0xed7b], /* Private Use */
- [0xed7c, 0xed7c], /* Private Use */
- [0xed7d, 0xed7d], /* Private Use */
- [0xed7e, 0xed7e], /* Private Use */
- [0xed7f, 0xed7f], /* Private Use */
- [0xed80, 0xed80], /* Private Use */
- [0xed81, 0xed81], /* Private Use */
- [0xed82, 0xed82], /* Private Use */
- [0xed83, 0xed83], /* Private Use */
- [0xed84, 0xed84], /* Private Use */
- [0xed85, 0xed85], /* Private Use */
- [0xed86, 0xed86], /* Private Use */
- [0xed87, 0xed87], /* Private Use */
- [0xed88, 0xed88], /* Private Use */
- [0xed89, 0xed89], /* Private Use */
- [0xed8a, 0xed8a], /* Private Use */
- [0xed8b, 0xed8b], /* Private Use */
- [0xed8c, 0xed8c], /* Private Use */
- [0xed8d, 0xed8d], /* Private Use */
- [0xed8e, 0xed8e], /* Private Use */
- [0xed8f, 0xed8f], /* Private Use */
- [0xed90, 0xed90], /* Private Use */
- [0xed91, 0xed91], /* Private Use */
- [0xed92, 0xed92], /* Private Use */
- [0xed93, 0xed93], /* Private Use */
- [0xed94, 0xed94], /* Private Use */
- [0xed95, 0xed95], /* Private Use */
- [0xed96, 0xed96], /* Private Use */
- [0xed97, 0xed97], /* Private Use */
- [0xed98, 0xed98], /* Private Use */
- [0xed99, 0xed99], /* Private Use */
- [0xed9a, 0xed9a], /* Private Use */
- [0xed9b, 0xed9b], /* Private Use */
- [0xed9c, 0xed9c], /* Private Use */
- [0xed9d, 0xed9d], /* Private Use */
- [0xed9e, 0xed9e], /* Private Use */
- [0xed9f, 0xed9f], /* Private Use */
- [0xeda0, 0xeda0], /* Private Use */
- [0xeda1, 0xeda1], /* Private Use */
- [0xeda2, 0xeda2], /* Private Use */
- [0xeda3, 0xeda3], /* Private Use */
- [0xeda4, 0xeda4], /* Private Use */
- [0xeda5, 0xeda5], /* Private Use */
- [0xeda6, 0xeda6], /* Private Use */
- [0xeda7, 0xeda7], /* Private Use */
- [0xeda8, 0xeda8], /* Private Use */
- [0xeda9, 0xeda9], /* Private Use */
- [0xedaa, 0xedaa], /* Private Use */
- [0xedab, 0xedab], /* Private Use */
- [0xedac, 0xedac], /* Private Use */
- [0xedad, 0xedad], /* Private Use */
- [0xedae, 0xedae], /* Private Use */
- [0xedaf, 0xedaf], /* Private Use */
- [0xedb0, 0xedb0], /* Private Use */
- [0xedb1, 0xedb1], /* Private Use */
- [0xedb2, 0xedb2], /* Private Use */
- [0xedb3, 0xedb3], /* Private Use */
- [0xedb4, 0xedb4], /* Private Use */
- [0xedb5, 0xedb5], /* Private Use */
- [0xedb6, 0xedb6], /* Private Use */
- [0xedb7, 0xedb7], /* Private Use */
- [0xedb8, 0xedb8], /* Private Use */
- [0xedb9, 0xedb9], /* Private Use */
- [0xedba, 0xedba], /* Private Use */
- [0xedbb, 0xedbb], /* Private Use */
- [0xedbc, 0xedbc], /* Private Use */
- [0xedbd, 0xedbd], /* Private Use */
- [0xedbe, 0xedbe], /* Private Use */
- [0xedbf, 0xedbf], /* Private Use */
- [0xedc0, 0xedc0], /* Private Use */
- [0xedc1, 0xedc1], /* Private Use */
- [0xedc2, 0xedc2], /* Private Use */
- [0xedc3, 0xedc3], /* Private Use */
- [0xedc4, 0xedc4], /* Private Use */
- [0xedc5, 0xedc5], /* Private Use */
- [0xedc6, 0xedc6], /* Private Use */
- [0xedc7, 0xedc7], /* Private Use */
- [0xedc8, 0xedc8], /* Private Use */
- [0xedc9, 0xedc9], /* Private Use */
- [0xedca, 0xedca], /* Private Use */
- [0xedcb, 0xedcb], /* Private Use */
- [0xedcc, 0xedcc], /* Private Use */
- [0xedcd, 0xedcd], /* Private Use */
- [0xedce, 0xedce], /* Private Use */
- [0xedcf, 0xedcf], /* Private Use */
- [0xedd0, 0xedd0], /* Private Use */
- [0xedd1, 0xedd1], /* Private Use */
- [0xedd2, 0xedd2], /* Private Use */
- [0xedd3, 0xedd3], /* Private Use */
- [0xedd4, 0xedd4], /* Private Use */
- [0xedd5, 0xedd5], /* Private Use */
- [0xedd6, 0xedd6], /* Private Use */
- [0xedd7, 0xedd7], /* Private Use */
- [0xedd8, 0xedd8], /* Private Use */
- [0xedd9, 0xedd9], /* Private Use */
- [0xedda, 0xedda], /* Private Use */
- [0xeddb, 0xeddb], /* Private Use */
- [0xeddc, 0xeddc], /* Private Use */
- [0xeddd, 0xeddd], /* Private Use */
- [0xedde, 0xedde], /* Private Use */
- [0xeddf, 0xeddf], /* Private Use */
- [0xede0, 0xede0], /* Private Use */
- [0xede1, 0xede1], /* Private Use */
- [0xede2, 0xede2], /* Private Use */
- [0xede3, 0xede3], /* Private Use */
- [0xede4, 0xede4], /* Private Use */
- [0xede5, 0xede5], /* Private Use */
- [0xede6, 0xede6], /* Private Use */
- [0xede7, 0xede7], /* Private Use */
- [0xede8, 0xede8], /* Private Use */
- [0xede9, 0xede9], /* Private Use */
- [0xedea, 0xedea], /* Private Use */
- [0xedeb, 0xedeb], /* Private Use */
- [0xedec, 0xedec], /* Private Use */
- [0xeded, 0xeded], /* Private Use */
- [0xedee, 0xedee], /* Private Use */
- [0xedef, 0xedef], /* Private Use */
- [0xedf0, 0xedf0], /* Private Use */
- [0xedf1, 0xedf1], /* Private Use */
- [0xedf2, 0xedf2], /* Private Use */
- [0xedf3, 0xedf3], /* Private Use */
- [0xedf4, 0xedf4], /* Private Use */
- [0xedf5, 0xedf5], /* Private Use */
- [0xedf6, 0xedf6], /* Private Use */
- [0xedf7, 0xedf7], /* Private Use */
- [0xedf8, 0xedf8], /* Private Use */
- [0xedf9, 0xedf9], /* Private Use */
- [0xedfa, 0xedfa], /* Private Use */
- [0xedfb, 0xedfb], /* Private Use */
- [0xedfc, 0xedfc], /* Private Use */
- [0xedfd, 0xedfd], /* Private Use */
- [0xedfe, 0xedfe], /* Private Use */
- [0xedff, 0xedff], /* Private Use */
- [0xee00, 0xee00], /* Private Use */
- [0xee01, 0xee01], /* Private Use */
- [0xee02, 0xee02], /* Private Use */
- [0xee03, 0xee03], /* Private Use */
- [0xee04, 0xee04], /* Private Use */
- [0xee05, 0xee05], /* Private Use */
- [0xee06, 0xee06], /* Private Use */
- [0xee07, 0xee07], /* Private Use */
- [0xee08, 0xee08], /* Private Use */
- [0xee09, 0xee09], /* Private Use */
- [0xee0a, 0xee0a], /* Private Use */
- [0xee0b, 0xee0b], /* Private Use */
- [0xee0c, 0xee0c], /* Private Use */
- [0xee0d, 0xee0d], /* Private Use */
- [0xee0e, 0xee0e], /* Private Use */
- [0xee0f, 0xee0f], /* Private Use */
- [0xee10, 0xee10], /* Private Use */
- [0xee11, 0xee11], /* Private Use */
- [0xee12, 0xee12], /* Private Use */
- [0xee13, 0xee13], /* Private Use */
- [0xee14, 0xee14], /* Private Use */
- [0xee15, 0xee15], /* Private Use */
- [0xee16, 0xee16], /* Private Use */
- [0xee17, 0xee17], /* Private Use */
- [0xee18, 0xee18], /* Private Use */
- [0xee19, 0xee19], /* Private Use */
- [0xee1a, 0xee1a], /* Private Use */
- [0xee1b, 0xee1b], /* Private Use */
- [0xee1c, 0xee1c], /* Private Use */
- [0xee1d, 0xee1d], /* Private Use */
- [0xee1e, 0xee1e], /* Private Use */
- [0xee1f, 0xee1f], /* Private Use */
- [0xee20, 0xee20], /* Private Use */
- [0xee21, 0xee21], /* Private Use */
- [0xee22, 0xee22], /* Private Use */
- [0xee23, 0xee23], /* Private Use */
- [0xee24, 0xee24], /* Private Use */
- [0xee25, 0xee25], /* Private Use */
- [0xee26, 0xee26], /* Private Use */
- [0xee27, 0xee27], /* Private Use */
- [0xee28, 0xee28], /* Private Use */
- [0xee29, 0xee29], /* Private Use */
- [0xee2a, 0xee2a], /* Private Use */
- [0xee2b, 0xee2b], /* Private Use */
- [0xee2c, 0xee2c], /* Private Use */
- [0xee2d, 0xee2d], /* Private Use */
- [0xee2e, 0xee2e], /* Private Use */
- [0xee2f, 0xee2f], /* Private Use */
- [0xee30, 0xee30], /* Private Use */
- [0xee31, 0xee31], /* Private Use */
- [0xee32, 0xee32], /* Private Use */
- [0xee33, 0xee33], /* Private Use */
- [0xee34, 0xee34], /* Private Use */
- [0xee35, 0xee35], /* Private Use */
- [0xee36, 0xee36], /* Private Use */
- [0xee37, 0xee37], /* Private Use */
- [0xee38, 0xee38], /* Private Use */
- [0xee39, 0xee39], /* Private Use */
- [0xee3a, 0xee3a], /* Private Use */
- [0xee3b, 0xee3b], /* Private Use */
- [0xee3c, 0xee3c], /* Private Use */
- [0xee3d, 0xee3d], /* Private Use */
- [0xee3e, 0xee3e], /* Private Use */
- [0xee3f, 0xee3f], /* Private Use */
- [0xee40, 0xee40], /* Private Use */
- [0xee41, 0xee41], /* Private Use */
- [0xee42, 0xee42], /* Private Use */
- [0xee43, 0xee43], /* Private Use */
- [0xee44, 0xee44], /* Private Use */
- [0xee45, 0xee45], /* Private Use */
- [0xee46, 0xee46], /* Private Use */
- [0xee47, 0xee47], /* Private Use */
- [0xee48, 0xee48], /* Private Use */
- [0xee49, 0xee49], /* Private Use */
- [0xee4a, 0xee4a], /* Private Use */
- [0xee4b, 0xee4b], /* Private Use */
- [0xee4c, 0xee4c], /* Private Use */
- [0xee4d, 0xee4d], /* Private Use */
- [0xee4e, 0xee4e], /* Private Use */
- [0xee4f, 0xee4f], /* Private Use */
- [0xee50, 0xee50], /* Private Use */
- [0xee51, 0xee51], /* Private Use */
- [0xee52, 0xee52], /* Private Use */
- [0xee53, 0xee53], /* Private Use */
- [0xee54, 0xee54], /* Private Use */
- [0xee55, 0xee55], /* Private Use */
- [0xee56, 0xee56], /* Private Use */
- [0xee57, 0xee57], /* Private Use */
- [0xee58, 0xee58], /* Private Use */
- [0xee59, 0xee59], /* Private Use */
- [0xee5a, 0xee5a], /* Private Use */
- [0xee5b, 0xee5b], /* Private Use */
- [0xee5c, 0xee5c], /* Private Use */
- [0xee5d, 0xee5d], /* Private Use */
- [0xee5e, 0xee5e], /* Private Use */
- [0xee5f, 0xee5f], /* Private Use */
- [0xee60, 0xee60], /* Private Use */
- [0xee61, 0xee61], /* Private Use */
- [0xee62, 0xee62], /* Private Use */
- [0xee63, 0xee63], /* Private Use */
- [0xee64, 0xee64], /* Private Use */
- [0xee65, 0xee65], /* Private Use */
- [0xee66, 0xee66], /* Private Use */
- [0xee67, 0xee67], /* Private Use */
- [0xee68, 0xee68], /* Private Use */
- [0xee69, 0xee69], /* Private Use */
- [0xee6a, 0xee6a], /* Private Use */
- [0xee6b, 0xee6b], /* Private Use */
- [0xee6c, 0xee6c], /* Private Use */
- [0xee6d, 0xee6d], /* Private Use */
- [0xee6e, 0xee6e], /* Private Use */
- [0xee6f, 0xee6f], /* Private Use */
- [0xee70, 0xee70], /* Private Use */
- [0xee71, 0xee71], /* Private Use */
- [0xee72, 0xee72], /* Private Use */
- [0xee73, 0xee73], /* Private Use */
- [0xee74, 0xee74], /* Private Use */
- [0xee75, 0xee75], /* Private Use */
- [0xee76, 0xee76], /* Private Use */
- [0xee77, 0xee77], /* Private Use */
- [0xee78, 0xee78], /* Private Use */
- [0xee79, 0xee79], /* Private Use */
- [0xee7a, 0xee7a], /* Private Use */
- [0xee7b, 0xee7b], /* Private Use */
- [0xee7c, 0xee7c], /* Private Use */
- [0xee7d, 0xee7d], /* Private Use */
- [0xee7e, 0xee7e], /* Private Use */
- [0xee7f, 0xee7f], /* Private Use */
- [0xee80, 0xee80], /* Private Use */
- [0xee81, 0xee81], /* Private Use */
- [0xee82, 0xee82], /* Private Use */
- [0xee83, 0xee83], /* Private Use */
- [0xee84, 0xee84], /* Private Use */
- [0xee85, 0xee85], /* Private Use */
- [0xee86, 0xee86], /* Private Use */
- [0xee87, 0xee87], /* Private Use */
- [0xee88, 0xee88], /* Private Use */
- [0xee89, 0xee89], /* Private Use */
- [0xee8a, 0xee8a], /* Private Use */
- [0xee8b, 0xee8b], /* Private Use */
- [0xee8c, 0xee8c], /* Private Use */
- [0xee8d, 0xee8d], /* Private Use */
- [0xee8e, 0xee8e], /* Private Use */
- [0xee8f, 0xee8f], /* Private Use */
- [0xee90, 0xee90], /* Private Use */
- [0xee91, 0xee91], /* Private Use */
- [0xee92, 0xee92], /* Private Use */
- [0xee93, 0xee93], /* Private Use */
- [0xee94, 0xee94], /* Private Use */
- [0xee95, 0xee95], /* Private Use */
- [0xee96, 0xee96], /* Private Use */
- [0xee97, 0xee97], /* Private Use */
- [0xee98, 0xee98], /* Private Use */
- [0xee99, 0xee99], /* Private Use */
- [0xee9a, 0xee9a], /* Private Use */
- [0xee9b, 0xee9b], /* Private Use */
- [0xee9c, 0xee9c], /* Private Use */
- [0xee9d, 0xee9d], /* Private Use */
- [0xee9e, 0xee9e], /* Private Use */
- [0xee9f, 0xee9f], /* Private Use */
- [0xeea0, 0xeea0], /* Private Use */
- [0xeea1, 0xeea1], /* Private Use */
- [0xeea2, 0xeea2], /* Private Use */
- [0xeea3, 0xeea3], /* Private Use */
- [0xeea4, 0xeea4], /* Private Use */
- [0xeea5, 0xeea5], /* Private Use */
- [0xeea6, 0xeea6], /* Private Use */
- [0xeea7, 0xeea7], /* Private Use */
- [0xeea8, 0xeea8], /* Private Use */
- [0xeea9, 0xeea9], /* Private Use */
- [0xeeaa, 0xeeaa], /* Private Use */
- [0xeeab, 0xeeab], /* Private Use */
- [0xeeac, 0xeeac], /* Private Use */
- [0xeead, 0xeead], /* Private Use */
- [0xeeae, 0xeeae], /* Private Use */
- [0xeeaf, 0xeeaf], /* Private Use */
- [0xeeb0, 0xeeb0], /* Private Use */
- [0xeeb1, 0xeeb1], /* Private Use */
- [0xeeb2, 0xeeb2], /* Private Use */
- [0xeeb3, 0xeeb3], /* Private Use */
- [0xeeb4, 0xeeb4], /* Private Use */
- [0xeeb5, 0xeeb5], /* Private Use */
- [0xeeb6, 0xeeb6], /* Private Use */
- [0xeeb7, 0xeeb7], /* Private Use */
- [0xeeb8, 0xeeb8], /* Private Use */
- [0xeeb9, 0xeeb9], /* Private Use */
- [0xeeba, 0xeeba], /* Private Use */
- [0xeebb, 0xeebb], /* Private Use */
- [0xeebc, 0xeebc], /* Private Use */
- [0xeebd, 0xeebd], /* Private Use */
- [0xeebe, 0xeebe], /* Private Use */
- [0xeebf, 0xeebf], /* Private Use */
- [0xeec0, 0xeec0], /* Private Use */
- [0xeec1, 0xeec1], /* Private Use */
- [0xeec2, 0xeec2], /* Private Use */
- [0xeec3, 0xeec3], /* Private Use */
- [0xeec4, 0xeec4], /* Private Use */
- [0xeec5, 0xeec5], /* Private Use */
- [0xeec6, 0xeec6], /* Private Use */
- [0xeec7, 0xeec7], /* Private Use */
- [0xeec8, 0xeec8], /* Private Use */
- [0xeec9, 0xeec9], /* Private Use */
- [0xeeca, 0xeeca], /* Private Use */
- [0xeecb, 0xeecb], /* Private Use */
- [0xeecc, 0xeecc], /* Private Use */
- [0xeecd, 0xeecd], /* Private Use */
- [0xeece, 0xeece], /* Private Use */
- [0xeecf, 0xeecf], /* Private Use */
- [0xeed0, 0xeed0], /* Private Use */
- [0xeed1, 0xeed1], /* Private Use */
- [0xeed2, 0xeed2], /* Private Use */
- [0xeed3, 0xeed3], /* Private Use */
- [0xeed4, 0xeed4], /* Private Use */
- [0xeed5, 0xeed5], /* Private Use */
- [0xeed6, 0xeed6], /* Private Use */
- [0xeed7, 0xeed7], /* Private Use */
- [0xeed8, 0xeed8], /* Private Use */
- [0xeed9, 0xeed9], /* Private Use */
- [0xeeda, 0xeeda], /* Private Use */
- [0xeedb, 0xeedb], /* Private Use */
- [0xeedc, 0xeedc], /* Private Use */
- [0xeedd, 0xeedd], /* Private Use */
- [0xeede, 0xeede], /* Private Use */
- [0xeedf, 0xeedf], /* Private Use */
- [0xeee0, 0xeee0], /* Private Use */
- [0xeee1, 0xeee1], /* Private Use */
- [0xeee2, 0xeee2], /* Private Use */
- [0xeee3, 0xeee3], /* Private Use */
- [0xeee4, 0xeee4], /* Private Use */
- [0xeee5, 0xeee5], /* Private Use */
- [0xeee6, 0xeee6], /* Private Use */
- [0xeee7, 0xeee7], /* Private Use */
- [0xeee8, 0xeee8], /* Private Use */
- [0xeee9, 0xeee9], /* Private Use */
- [0xeeea, 0xeeea], /* Private Use */
- [0xeeeb, 0xeeeb], /* Private Use */
- [0xeeec, 0xeeec], /* Private Use */
- [0xeeed, 0xeeed], /* Private Use */
- [0xeeee, 0xeeee], /* Private Use */
- [0xeeef, 0xeeef], /* Private Use */
- [0xeef0, 0xeef0], /* Private Use */
- [0xeef1, 0xeef1], /* Private Use */
- [0xeef2, 0xeef2], /* Private Use */
- [0xeef3, 0xeef3], /* Private Use */
- [0xeef4, 0xeef4], /* Private Use */
- [0xeef5, 0xeef5], /* Private Use */
- [0xeef6, 0xeef6], /* Private Use */
- [0xeef7, 0xeef7], /* Private Use */
- [0xeef8, 0xeef8], /* Private Use */
- [0xeef9, 0xeef9], /* Private Use */
- [0xeefa, 0xeefa], /* Private Use */
- [0xeefb, 0xeefb], /* Private Use */
- [0xeefc, 0xeefc], /* Private Use */
- [0xeefd, 0xeefd], /* Private Use */
- [0xeefe, 0xeefe], /* Private Use */
- [0xeeff, 0xeeff], /* Private Use */
- [0xef00, 0xef00], /* Private Use */
- [0xef01, 0xef01], /* Private Use */
- [0xef02, 0xef02], /* Private Use */
- [0xef03, 0xef03], /* Private Use */
- [0xef04, 0xef04], /* Private Use */
- [0xef05, 0xef05], /* Private Use */
- [0xef06, 0xef06], /* Private Use */
- [0xef07, 0xef07], /* Private Use */
- [0xef08, 0xef08], /* Private Use */
- [0xef09, 0xef09], /* Private Use */
- [0xef0a, 0xef0a], /* Private Use */
- [0xef0b, 0xef0b], /* Private Use */
- [0xef0c, 0xef0c], /* Private Use */
- [0xef0d, 0xef0d], /* Private Use */
- [0xef0e, 0xef0e], /* Private Use */
- [0xef0f, 0xef0f], /* Private Use */
- [0xef10, 0xef10], /* Private Use */
- [0xef11, 0xef11], /* Private Use */
- [0xef12, 0xef12], /* Private Use */
- [0xef13, 0xef13], /* Private Use */
- [0xef14, 0xef14], /* Private Use */
- [0xef15, 0xef15], /* Private Use */
- [0xef16, 0xef16], /* Private Use */
- [0xef17, 0xef17], /* Private Use */
- [0xef18, 0xef18], /* Private Use */
- [0xef19, 0xef19], /* Private Use */
- [0xef1a, 0xef1a], /* Private Use */
- [0xef1b, 0xef1b], /* Private Use */
- [0xef1c, 0xef1c], /* Private Use */
- [0xef1d, 0xef1d], /* Private Use */
- [0xef1e, 0xef1e], /* Private Use */
- [0xef1f, 0xef1f], /* Private Use */
- [0xef20, 0xef20], /* Private Use */
- [0xef21, 0xef21], /* Private Use */
- [0xef22, 0xef22], /* Private Use */
- [0xef23, 0xef23], /* Private Use */
- [0xef24, 0xef24], /* Private Use */
- [0xef25, 0xef25], /* Private Use */
- [0xef26, 0xef26], /* Private Use */
- [0xef27, 0xef27], /* Private Use */
- [0xef28, 0xef28], /* Private Use */
- [0xef29, 0xef29], /* Private Use */
- [0xef2a, 0xef2a], /* Private Use */
- [0xef2b, 0xef2b], /* Private Use */
- [0xef2c, 0xef2c], /* Private Use */
- [0xef2d, 0xef2d], /* Private Use */
- [0xef2e, 0xef2e], /* Private Use */
- [0xef2f, 0xef2f], /* Private Use */
- [0xef30, 0xef30], /* Private Use */
- [0xef31, 0xef31], /* Private Use */
- [0xef32, 0xef32], /* Private Use */
- [0xef33, 0xef33], /* Private Use */
- [0xef34, 0xef34], /* Private Use */
- [0xef35, 0xef35], /* Private Use */
- [0xef36, 0xef36], /* Private Use */
- [0xef37, 0xef37], /* Private Use */
- [0xef38, 0xef38], /* Private Use */
- [0xef39, 0xef39], /* Private Use */
- [0xef3a, 0xef3a], /* Private Use */
- [0xef3b, 0xef3b], /* Private Use */
- [0xef3c, 0xef3c], /* Private Use */
- [0xef3d, 0xef3d], /* Private Use */
- [0xef3e, 0xef3e], /* Private Use */
- [0xef3f, 0xef3f], /* Private Use */
- [0xef40, 0xef40], /* Private Use */
- [0xef41, 0xef41], /* Private Use */
- [0xef42, 0xef42], /* Private Use */
- [0xef43, 0xef43], /* Private Use */
- [0xef44, 0xef44], /* Private Use */
- [0xef45, 0xef45], /* Private Use */
- [0xef46, 0xef46], /* Private Use */
- [0xef47, 0xef47], /* Private Use */
- [0xef48, 0xef48], /* Private Use */
- [0xef49, 0xef49], /* Private Use */
- [0xef4a, 0xef4a], /* Private Use */
- [0xef4b, 0xef4b], /* Private Use */
- [0xef4c, 0xef4c], /* Private Use */
- [0xef4d, 0xef4d], /* Private Use */
- [0xef4e, 0xef4e], /* Private Use */
- [0xef4f, 0xef4f], /* Private Use */
- [0xef50, 0xef50], /* Private Use */
- [0xef51, 0xef51], /* Private Use */
- [0xef52, 0xef52], /* Private Use */
- [0xef53, 0xef53], /* Private Use */
- [0xef54, 0xef54], /* Private Use */
- [0xef55, 0xef55], /* Private Use */
- [0xef56, 0xef56], /* Private Use */
- [0xef57, 0xef57], /* Private Use */
- [0xef58, 0xef58], /* Private Use */
- [0xef59, 0xef59], /* Private Use */
- [0xef5a, 0xef5a], /* Private Use */
- [0xef5b, 0xef5b], /* Private Use */
- [0xef5c, 0xef5c], /* Private Use */
- [0xef5d, 0xef5d], /* Private Use */
- [0xef5e, 0xef5e], /* Private Use */
- [0xef5f, 0xef5f], /* Private Use */
- [0xef60, 0xef60], /* Private Use */
- [0xef61, 0xef61], /* Private Use */
- [0xef62, 0xef62], /* Private Use */
- [0xef63, 0xef63], /* Private Use */
- [0xef64, 0xef64], /* Private Use */
- [0xef65, 0xef65], /* Private Use */
- [0xef66, 0xef66], /* Private Use */
- [0xef67, 0xef67], /* Private Use */
- [0xef68, 0xef68], /* Private Use */
- [0xef69, 0xef69], /* Private Use */
- [0xef6a, 0xef6a], /* Private Use */
- [0xef6b, 0xef6b], /* Private Use */
- [0xef6c, 0xef6c], /* Private Use */
- [0xef6d, 0xef6d], /* Private Use */
- [0xef6e, 0xef6e], /* Private Use */
- [0xef6f, 0xef6f], /* Private Use */
- [0xef70, 0xef70], /* Private Use */
- [0xef71, 0xef71], /* Private Use */
- [0xef72, 0xef72], /* Private Use */
- [0xef73, 0xef73], /* Private Use */
- [0xef74, 0xef74], /* Private Use */
- [0xef75, 0xef75], /* Private Use */
- [0xef76, 0xef76], /* Private Use */
- [0xef77, 0xef77], /* Private Use */
- [0xef78, 0xef78], /* Private Use */
- [0xef79, 0xef79], /* Private Use */
- [0xef7a, 0xef7a], /* Private Use */
- [0xef7b, 0xef7b], /* Private Use */
- [0xef7c, 0xef7c], /* Private Use */
- [0xef7d, 0xef7d], /* Private Use */
- [0xef7e, 0xef7e], /* Private Use */
- [0xef7f, 0xef7f], /* Private Use */
- [0xef80, 0xef80], /* Private Use */
- [0xef81, 0xef81], /* Private Use */
- [0xef82, 0xef82], /* Private Use */
- [0xef83, 0xef83], /* Private Use */
- [0xef84, 0xef84], /* Private Use */
- [0xef85, 0xef85], /* Private Use */
- [0xef86, 0xef86], /* Private Use */
- [0xef87, 0xef87], /* Private Use */
- [0xef88, 0xef88], /* Private Use */
- [0xef89, 0xef89], /* Private Use */
- [0xef8a, 0xef8a], /* Private Use */
- [0xef8b, 0xef8b], /* Private Use */
- [0xef8c, 0xef8c], /* Private Use */
- [0xef8d, 0xef8d], /* Private Use */
- [0xef8e, 0xef8e], /* Private Use */
- [0xef8f, 0xef8f], /* Private Use */
- [0xef90, 0xef90], /* Private Use */
- [0xef91, 0xef91], /* Private Use */
- [0xef92, 0xef92], /* Private Use */
- [0xef93, 0xef93], /* Private Use */
- [0xef94, 0xef94], /* Private Use */
- [0xef95, 0xef95], /* Private Use */
- [0xef96, 0xef96], /* Private Use */
- [0xef97, 0xef97], /* Private Use */
- [0xef98, 0xef98], /* Private Use */
- [0xef99, 0xef99], /* Private Use */
- [0xef9a, 0xef9a], /* Private Use */
- [0xef9b, 0xef9b], /* Private Use */
- [0xef9c, 0xef9c], /* Private Use */
- [0xef9d, 0xef9d], /* Private Use */
- [0xef9e, 0xef9e], /* Private Use */
- [0xef9f, 0xef9f], /* Private Use */
- [0xefa0, 0xefa0], /* Private Use */
- [0xefa1, 0xefa1], /* Private Use */
- [0xefa2, 0xefa2], /* Private Use */
- [0xefa3, 0xefa3], /* Private Use */
- [0xefa4, 0xefa4], /* Private Use */
- [0xefa5, 0xefa5], /* Private Use */
- [0xefa6, 0xefa6], /* Private Use */
- [0xefa7, 0xefa7], /* Private Use */
- [0xefa8, 0xefa8], /* Private Use */
- [0xefa9, 0xefa9], /* Private Use */
- [0xefaa, 0xefaa], /* Private Use */
- [0xefab, 0xefab], /* Private Use */
- [0xefac, 0xefac], /* Private Use */
- [0xefad, 0xefad], /* Private Use */
- [0xefae, 0xefae], /* Private Use */
- [0xefaf, 0xefaf], /* Private Use */
- [0xefb0, 0xefb0], /* Private Use */
- [0xefb1, 0xefb1], /* Private Use */
- [0xefb2, 0xefb2], /* Private Use */
- [0xefb3, 0xefb3], /* Private Use */
- [0xefb4, 0xefb4], /* Private Use */
- [0xefb5, 0xefb5], /* Private Use */
- [0xefb6, 0xefb6], /* Private Use */
- [0xefb7, 0xefb7], /* Private Use */
- [0xefb8, 0xefb8], /* Private Use */
- [0xefb9, 0xefb9], /* Private Use */
- [0xefba, 0xefba], /* Private Use */
- [0xefbb, 0xefbb], /* Private Use */
- [0xefbc, 0xefbc], /* Private Use */
- [0xefbd, 0xefbd], /* Private Use */
- [0xefbe, 0xefbe], /* Private Use */
- [0xefbf, 0xefbf], /* Private Use */
- [0xefc0, 0xefc0], /* Private Use */
- [0xefc1, 0xefc1], /* Private Use */
- [0xefc2, 0xefc2], /* Private Use */
- [0xefc3, 0xefc3], /* Private Use */
- [0xefc4, 0xefc4], /* Private Use */
- [0xefc5, 0xefc5], /* Private Use */
- [0xefc6, 0xefc6], /* Private Use */
- [0xefc7, 0xefc7], /* Private Use */
- [0xefc8, 0xefc8], /* Private Use */
- [0xefc9, 0xefc9], /* Private Use */
- [0xefca, 0xefca], /* Private Use */
- [0xefcb, 0xefcb], /* Private Use */
- [0xefcc, 0xefcc], /* Private Use */
- [0xefcd, 0xefcd], /* Private Use */
- [0xefce, 0xefce], /* Private Use */
- [0xefcf, 0xefcf], /* Private Use */
- [0xefd0, 0xefd0], /* Private Use */
- [0xefd1, 0xefd1], /* Private Use */
- [0xefd2, 0xefd2], /* Private Use */
- [0xefd3, 0xefd3], /* Private Use */
- [0xefd4, 0xefd4], /* Private Use */
- [0xefd5, 0xefd5], /* Private Use */
- [0xefd6, 0xefd6], /* Private Use */
- [0xefd7, 0xefd7], /* Private Use */
- [0xefd8, 0xefd8], /* Private Use */
- [0xefd9, 0xefd9], /* Private Use */
- [0xefda, 0xefda], /* Private Use */
- [0xefdb, 0xefdb], /* Private Use */
- [0xefdc, 0xefdc], /* Private Use */
- [0xefdd, 0xefdd], /* Private Use */
- [0xefde, 0xefde], /* Private Use */
- [0xefdf, 0xefdf], /* Private Use */
- [0xefe0, 0xefe0], /* Private Use */
- [0xefe1, 0xefe1], /* Private Use */
- [0xefe2, 0xefe2], /* Private Use */
- [0xefe3, 0xefe3], /* Private Use */
- [0xefe4, 0xefe4], /* Private Use */
- [0xefe5, 0xefe5], /* Private Use */
- [0xefe6, 0xefe6], /* Private Use */
- [0xefe7, 0xefe7], /* Private Use */
- [0xefe8, 0xefe8], /* Private Use */
- [0xefe9, 0xefe9], /* Private Use */
- [0xefea, 0xefea], /* Private Use */
- [0xefeb, 0xefeb], /* Private Use */
- [0xefec, 0xefec], /* Private Use */
- [0xefed, 0xefed], /* Private Use */
- [0xefee, 0xefee], /* Private Use */
- [0xefef, 0xefef], /* Private Use */
- [0xeff0, 0xeff0], /* Private Use */
- [0xeff1, 0xeff1], /* Private Use */
- [0xeff2, 0xeff2], /* Private Use */
- [0xeff3, 0xeff3], /* Private Use */
- [0xeff4, 0xeff4], /* Private Use */
- [0xeff5, 0xeff5], /* Private Use */
- [0xeff6, 0xeff6], /* Private Use */
- [0xeff7, 0xeff7], /* Private Use */
- [0xeff8, 0xeff8], /* Private Use */
- [0xeff9, 0xeff9], /* Private Use */
- [0xeffa, 0xeffa], /* Private Use */
- [0xeffb, 0xeffb], /* Private Use */
- [0xeffc, 0xeffc], /* Private Use */
- [0xeffd, 0xeffd], /* Private Use */
- [0xeffe, 0xeffe], /* Private Use */
- [0xefff, 0xefff], /* Private Use */
- [0xf000, 0xf000], /* Private Use */
- [0xf001, 0xf001], /* Private Use */
- [0xf002, 0xf002], /* Private Use */
- [0xf003, 0xf003], /* Private Use */
- [0xf004, 0xf004], /* Private Use */
- [0xf005, 0xf005], /* Private Use */
- [0xf006, 0xf006], /* Private Use */
- [0xf007, 0xf007], /* Private Use */
- [0xf008, 0xf008], /* Private Use */
- [0xf009, 0xf009], /* Private Use */
- [0xf00a, 0xf00a], /* Private Use */
- [0xf00b, 0xf00b], /* Private Use */
- [0xf00c, 0xf00c], /* Private Use */
- [0xf00d, 0xf00d], /* Private Use */
- [0xf00e, 0xf00e], /* Private Use */
- [0xf00f, 0xf00f], /* Private Use */
- [0xf010, 0xf010], /* Private Use */
- [0xf011, 0xf011], /* Private Use */
- [0xf012, 0xf012], /* Private Use */
- [0xf013, 0xf013], /* Private Use */
- [0xf014, 0xf014], /* Private Use */
- [0xf015, 0xf015], /* Private Use */
- [0xf016, 0xf016], /* Private Use */
- [0xf017, 0xf017], /* Private Use */
- [0xf018, 0xf018], /* Private Use */
- [0xf019, 0xf019], /* Private Use */
- [0xf01a, 0xf01a], /* Private Use */
- [0xf01b, 0xf01b], /* Private Use */
- [0xf01c, 0xf01c], /* Private Use */
- [0xf01d, 0xf01d], /* Private Use */
- [0xf01e, 0xf01e], /* Private Use */
- [0xf01f, 0xf01f], /* Private Use */
- [0xf020, 0xf020], /* Private Use */
- [0xf021, 0xf021], /* Private Use */
- [0xf022, 0xf022], /* Private Use */
- [0xf023, 0xf023], /* Private Use */
- [0xf024, 0xf024], /* Private Use */
- [0xf025, 0xf025], /* Private Use */
- [0xf026, 0xf026], /* Private Use */
- [0xf027, 0xf027], /* Private Use */
- [0xf028, 0xf028], /* Private Use */
- [0xf029, 0xf029], /* Private Use */
- [0xf02a, 0xf02a], /* Private Use */
- [0xf02b, 0xf02b], /* Private Use */
- [0xf02c, 0xf02c], /* Private Use */
- [0xf02d, 0xf02d], /* Private Use */
- [0xf02e, 0xf02e], /* Private Use */
- [0xf02f, 0xf02f], /* Private Use */
- [0xf030, 0xf030], /* Private Use */
- [0xf031, 0xf031], /* Private Use */
- [0xf032, 0xf032], /* Private Use */
- [0xf033, 0xf033], /* Private Use */
- [0xf034, 0xf034], /* Private Use */
- [0xf035, 0xf035], /* Private Use */
- [0xf036, 0xf036], /* Private Use */
- [0xf037, 0xf037], /* Private Use */
- [0xf038, 0xf038], /* Private Use */
- [0xf039, 0xf039], /* Private Use */
- [0xf03a, 0xf03a], /* Private Use */
- [0xf03b, 0xf03b], /* Private Use */
- [0xf03c, 0xf03c], /* Private Use */
- [0xf03d, 0xf03d], /* Private Use */
- [0xf03e, 0xf03e], /* Private Use */
- [0xf03f, 0xf03f], /* Private Use */
- [0xf040, 0xf040], /* Private Use */
- [0xf041, 0xf041], /* Private Use */
- [0xf042, 0xf042], /* Private Use */
- [0xf043, 0xf043], /* Private Use */
- [0xf044, 0xf044], /* Private Use */
- [0xf045, 0xf045], /* Private Use */
- [0xf046, 0xf046], /* Private Use */
- [0xf047, 0xf047], /* Private Use */
- [0xf048, 0xf048], /* Private Use */
- [0xf049, 0xf049], /* Private Use */
- [0xf04a, 0xf04a], /* Private Use */
- [0xf04b, 0xf04b], /* Private Use */
- [0xf04c, 0xf04c], /* Private Use */
- [0xf04d, 0xf04d], /* Private Use */
- [0xf04e, 0xf04e], /* Private Use */
- [0xf04f, 0xf04f], /* Private Use */
- [0xf050, 0xf050], /* Private Use */
- [0xf051, 0xf051], /* Private Use */
- [0xf052, 0xf052], /* Private Use */
- [0xf053, 0xf053], /* Private Use */
- [0xf054, 0xf054], /* Private Use */
- [0xf055, 0xf055], /* Private Use */
- [0xf056, 0xf056], /* Private Use */
- [0xf057, 0xf057], /* Private Use */
- [0xf058, 0xf058], /* Private Use */
- [0xf059, 0xf059], /* Private Use */
- [0xf05a, 0xf05a], /* Private Use */
- [0xf05b, 0xf05b], /* Private Use */
- [0xf05c, 0xf05c], /* Private Use */
- [0xf05d, 0xf05d], /* Private Use */
- [0xf05e, 0xf05e], /* Private Use */
- [0xf05f, 0xf05f], /* Private Use */
- [0xf060, 0xf060], /* Private Use */
- [0xf061, 0xf061], /* Private Use */
- [0xf062, 0xf062], /* Private Use */
- [0xf063, 0xf063], /* Private Use */
- [0xf064, 0xf064], /* Private Use */
- [0xf065, 0xf065], /* Private Use */
- [0xf066, 0xf066], /* Private Use */
- [0xf067, 0xf067], /* Private Use */
- [0xf068, 0xf068], /* Private Use */
- [0xf069, 0xf069], /* Private Use */
- [0xf06a, 0xf06a], /* Private Use */
- [0xf06b, 0xf06b], /* Private Use */
- [0xf06c, 0xf06c], /* Private Use */
- [0xf06d, 0xf06d], /* Private Use */
- [0xf06e, 0xf06e], /* Private Use */
- [0xf06f, 0xf06f], /* Private Use */
- [0xf070, 0xf070], /* Private Use */
- [0xf071, 0xf071], /* Private Use */
- [0xf072, 0xf072], /* Private Use */
- [0xf073, 0xf073], /* Private Use */
- [0xf074, 0xf074], /* Private Use */
- [0xf075, 0xf075], /* Private Use */
- [0xf076, 0xf076], /* Private Use */
- [0xf077, 0xf077], /* Private Use */
- [0xf078, 0xf078], /* Private Use */
- [0xf079, 0xf079], /* Private Use */
- [0xf07a, 0xf07a], /* Private Use */
- [0xf07b, 0xf07b], /* Private Use */
- [0xf07c, 0xf07c], /* Private Use */
- [0xf07d, 0xf07d], /* Private Use */
- [0xf07e, 0xf07e], /* Private Use */
- [0xf07f, 0xf07f], /* Private Use */
- [0xf080, 0xf080], /* Private Use */
- [0xf081, 0xf081], /* Private Use */
- [0xf082, 0xf082], /* Private Use */
- [0xf083, 0xf083], /* Private Use */
- [0xf084, 0xf084], /* Private Use */
- [0xf085, 0xf085], /* Private Use */
- [0xf086, 0xf086], /* Private Use */
- [0xf087, 0xf087], /* Private Use */
- [0xf088, 0xf088], /* Private Use */
- [0xf089, 0xf089], /* Private Use */
- [0xf08a, 0xf08a], /* Private Use */
- [0xf08b, 0xf08b], /* Private Use */
- [0xf08c, 0xf08c], /* Private Use */
- [0xf08d, 0xf08d], /* Private Use */
- [0xf08e, 0xf08e], /* Private Use */
- [0xf08f, 0xf08f], /* Private Use */
- [0xf090, 0xf090], /* Private Use */
- [0xf091, 0xf091], /* Private Use */
- [0xf092, 0xf092], /* Private Use */
- [0xf093, 0xf093], /* Private Use */
- [0xf094, 0xf094], /* Private Use */
- [0xf095, 0xf095], /* Private Use */
- [0xf096, 0xf096], /* Private Use */
- [0xf097, 0xf097], /* Private Use */
- [0xf098, 0xf098], /* Private Use */
- [0xf099, 0xf099], /* Private Use */
- [0xf09a, 0xf09a], /* Private Use */
- [0xf09b, 0xf09b], /* Private Use */
- [0xf09c, 0xf09c], /* Private Use */
- [0xf09d, 0xf09d], /* Private Use */
- [0xf09e, 0xf09e], /* Private Use */
- [0xf09f, 0xf09f], /* Private Use */
- [0xf0a0, 0xf0a0], /* Private Use */
- [0xf0a1, 0xf0a1], /* Private Use */
- [0xf0a2, 0xf0a2], /* Private Use */
- [0xf0a3, 0xf0a3], /* Private Use */
- [0xf0a4, 0xf0a4], /* Private Use */
- [0xf0a5, 0xf0a5], /* Private Use */
- [0xf0a6, 0xf0a6], /* Private Use */
- [0xf0a7, 0xf0a7], /* Private Use */
- [0xf0a8, 0xf0a8], /* Private Use */
- [0xf0a9, 0xf0a9], /* Private Use */
- [0xf0aa, 0xf0aa], /* Private Use */
- [0xf0ab, 0xf0ab], /* Private Use */
- [0xf0ac, 0xf0ac], /* Private Use */
- [0xf0ad, 0xf0ad], /* Private Use */
- [0xf0ae, 0xf0ae], /* Private Use */
- [0xf0af, 0xf0af], /* Private Use */
- [0xf0b0, 0xf0b0], /* Private Use */
- [0xf0b1, 0xf0b1], /* Private Use */
- [0xf0b2, 0xf0b2], /* Private Use */
- [0xf0b3, 0xf0b3], /* Private Use */
- [0xf0b4, 0xf0b4], /* Private Use */
- [0xf0b5, 0xf0b5], /* Private Use */
- [0xf0b6, 0xf0b6], /* Private Use */
- [0xf0b7, 0xf0b7], /* Private Use */
- [0xf0b8, 0xf0b8], /* Private Use */
- [0xf0b9, 0xf0b9], /* Private Use */
- [0xf0ba, 0xf0ba], /* Private Use */
- [0xf0bb, 0xf0bb], /* Private Use */
- [0xf0bc, 0xf0bc], /* Private Use */
- [0xf0bd, 0xf0bd], /* Private Use */
- [0xf0be, 0xf0be], /* Private Use */
- [0xf0bf, 0xf0bf], /* Private Use */
- [0xf0c0, 0xf0c0], /* Private Use */
- [0xf0c1, 0xf0c1], /* Private Use */
- [0xf0c2, 0xf0c2], /* Private Use */
- [0xf0c3, 0xf0c3], /* Private Use */
- [0xf0c4, 0xf0c4], /* Private Use */
- [0xf0c5, 0xf0c5], /* Private Use */
- [0xf0c6, 0xf0c6], /* Private Use */
- [0xf0c7, 0xf0c7], /* Private Use */
- [0xf0c8, 0xf0c8], /* Private Use */
- [0xf0c9, 0xf0c9], /* Private Use */
- [0xf0ca, 0xf0ca], /* Private Use */
- [0xf0cb, 0xf0cb], /* Private Use */
- [0xf0cc, 0xf0cc], /* Private Use */
- [0xf0cd, 0xf0cd], /* Private Use */
- [0xf0ce, 0xf0ce], /* Private Use */
- [0xf0cf, 0xf0cf], /* Private Use */
- [0xf0d0, 0xf0d0], /* Private Use */
- [0xf0d1, 0xf0d1], /* Private Use */
- [0xf0d2, 0xf0d2], /* Private Use */
- [0xf0d3, 0xf0d3], /* Private Use */
- [0xf0d4, 0xf0d4], /* Private Use */
- [0xf0d5, 0xf0d5], /* Private Use */
- [0xf0d6, 0xf0d6], /* Private Use */
- [0xf0d7, 0xf0d7], /* Private Use */
- [0xf0d8, 0xf0d8], /* Private Use */
- [0xf0d9, 0xf0d9], /* Private Use */
- [0xf0da, 0xf0da], /* Private Use */
- [0xf0db, 0xf0db], /* Private Use */
- [0xf0dc, 0xf0dc], /* Private Use */
- [0xf0dd, 0xf0dd], /* Private Use */
- [0xf0de, 0xf0de], /* Private Use */
- [0xf0df, 0xf0df], /* Private Use */
- [0xf0e0, 0xf0e0], /* Private Use */
- [0xf0e1, 0xf0e1], /* Private Use */
- [0xf0e2, 0xf0e2], /* Private Use */
- [0xf0e3, 0xf0e3], /* Private Use */
- [0xf0e4, 0xf0e4], /* Private Use */
- [0xf0e5, 0xf0e5], /* Private Use */
- [0xf0e6, 0xf0e6], /* Private Use */
- [0xf0e7, 0xf0e7], /* Private Use */
- [0xf0e8, 0xf0e8], /* Private Use */
- [0xf0e9, 0xf0e9], /* Private Use */
- [0xf0ea, 0xf0ea], /* Private Use */
- [0xf0eb, 0xf0eb], /* Private Use */
- [0xf0ec, 0xf0ec], /* Private Use */
- [0xf0ed, 0xf0ed], /* Private Use */
- [0xf0ee, 0xf0ee], /* Private Use */
- [0xf0ef, 0xf0ef], /* Private Use */
- [0xf0f0, 0xf0f0], /* Private Use */
- [0xf0f1, 0xf0f1], /* Private Use */
- [0xf0f2, 0xf0f2], /* Private Use */
- [0xf0f3, 0xf0f3], /* Private Use */
- [0xf0f4, 0xf0f4], /* Private Use */
- [0xf0f5, 0xf0f5], /* Private Use */
- [0xf0f6, 0xf0f6], /* Private Use */
- [0xf0f7, 0xf0f7], /* Private Use */
- [0xf0f8, 0xf0f8], /* Private Use */
- [0xf0f9, 0xf0f9], /* Private Use */
- [0xf0fa, 0xf0fa], /* Private Use */
- [0xf0fb, 0xf0fb], /* Private Use */
- [0xf0fc, 0xf0fc], /* Private Use */
- [0xf0fd, 0xf0fd], /* Private Use */
- [0xf0fe, 0xf0fe], /* Private Use */
- [0xf0ff, 0xf0ff], /* Private Use */
- [0xf100, 0xf100], /* Private Use */
- [0xf101, 0xf101], /* Private Use */
- [0xf102, 0xf102], /* Private Use */
- [0xf103, 0xf103], /* Private Use */
- [0xf104, 0xf104], /* Private Use */
- [0xf105, 0xf105], /* Private Use */
- [0xf106, 0xf106], /* Private Use */
- [0xf107, 0xf107], /* Private Use */
- [0xf108, 0xf108], /* Private Use */
- [0xf109, 0xf109], /* Private Use */
- [0xf10a, 0xf10a], /* Private Use */
- [0xf10b, 0xf10b], /* Private Use */
- [0xf10c, 0xf10c], /* Private Use */
- [0xf10d, 0xf10d], /* Private Use */
- [0xf10e, 0xf10e], /* Private Use */
- [0xf10f, 0xf10f], /* Private Use */
- [0xf110, 0xf110], /* Private Use */
- [0xf111, 0xf111], /* Private Use */
- [0xf112, 0xf112], /* Private Use */
- [0xf113, 0xf113], /* Private Use */
- [0xf114, 0xf114], /* Private Use */
- [0xf115, 0xf115], /* Private Use */
- [0xf116, 0xf116], /* Private Use */
- [0xf117, 0xf117], /* Private Use */
- [0xf118, 0xf118], /* Private Use */
- [0xf119, 0xf119], /* Private Use */
- [0xf11a, 0xf11a], /* Private Use */
- [0xf11b, 0xf11b], /* Private Use */
- [0xf11c, 0xf11c], /* Private Use */
- [0xf11d, 0xf11d], /* Private Use */
- [0xf11e, 0xf11e], /* Private Use */
- [0xf11f, 0xf11f], /* Private Use */
- [0xf120, 0xf120], /* Private Use */
- [0xf121, 0xf121], /* Private Use */
- [0xf122, 0xf122], /* Private Use */
- [0xf123, 0xf123], /* Private Use */
- [0xf124, 0xf124], /* Private Use */
- [0xf125, 0xf125], /* Private Use */
- [0xf126, 0xf126], /* Private Use */
- [0xf127, 0xf127], /* Private Use */
- [0xf128, 0xf128], /* Private Use */
- [0xf129, 0xf129], /* Private Use */
- [0xf12a, 0xf12a], /* Private Use */
- [0xf12b, 0xf12b], /* Private Use */
- [0xf12c, 0xf12c], /* Private Use */
- [0xf12d, 0xf12d], /* Private Use */
- [0xf12e, 0xf12e], /* Private Use */
- [0xf12f, 0xf12f], /* Private Use */
- [0xf130, 0xf130], /* Private Use */
- [0xf131, 0xf131], /* Private Use */
- [0xf132, 0xf132], /* Private Use */
- [0xf133, 0xf133], /* Private Use */
- [0xf134, 0xf134], /* Private Use */
- [0xf135, 0xf135], /* Private Use */
- [0xf136, 0xf136], /* Private Use */
- [0xf137, 0xf137], /* Private Use */
- [0xf138, 0xf138], /* Private Use */
- [0xf139, 0xf139], /* Private Use */
- [0xf13a, 0xf13a], /* Private Use */
- [0xf13b, 0xf13b], /* Private Use */
- [0xf13c, 0xf13c], /* Private Use */
- [0xf13d, 0xf13d], /* Private Use */
- [0xf13e, 0xf13e], /* Private Use */
- [0xf13f, 0xf13f], /* Private Use */
- [0xf140, 0xf140], /* Private Use */
- [0xf141, 0xf141], /* Private Use */
- [0xf142, 0xf142], /* Private Use */
- [0xf143, 0xf143], /* Private Use */
- [0xf144, 0xf144], /* Private Use */
- [0xf145, 0xf145], /* Private Use */
- [0xf146, 0xf146], /* Private Use */
- [0xf147, 0xf147], /* Private Use */
- [0xf148, 0xf148], /* Private Use */
- [0xf149, 0xf149], /* Private Use */
- [0xf14a, 0xf14a], /* Private Use */
- [0xf14b, 0xf14b], /* Private Use */
- [0xf14c, 0xf14c], /* Private Use */
- [0xf14d, 0xf14d], /* Private Use */
- [0xf14e, 0xf14e], /* Private Use */
- [0xf14f, 0xf14f], /* Private Use */
- [0xf150, 0xf150], /* Private Use */
- [0xf151, 0xf151], /* Private Use */
- [0xf152, 0xf152], /* Private Use */
- [0xf153, 0xf153], /* Private Use */
- [0xf154, 0xf154], /* Private Use */
- [0xf155, 0xf155], /* Private Use */
- [0xf156, 0xf156], /* Private Use */
- [0xf157, 0xf157], /* Private Use */
- [0xf158, 0xf158], /* Private Use */
- [0xf159, 0xf159], /* Private Use */
- [0xf15a, 0xf15a], /* Private Use */
- [0xf15b, 0xf15b], /* Private Use */
- [0xf15c, 0xf15c], /* Private Use */
- [0xf15d, 0xf15d], /* Private Use */
- [0xf15e, 0xf15e], /* Private Use */
- [0xf15f, 0xf15f], /* Private Use */
- [0xf160, 0xf160], /* Private Use */
- [0xf161, 0xf161], /* Private Use */
- [0xf162, 0xf162], /* Private Use */
- [0xf163, 0xf163], /* Private Use */
- [0xf164, 0xf164], /* Private Use */
- [0xf165, 0xf165], /* Private Use */
- [0xf166, 0xf166], /* Private Use */
- [0xf167, 0xf167], /* Private Use */
- [0xf168, 0xf168], /* Private Use */
- [0xf169, 0xf169], /* Private Use */
- [0xf16a, 0xf16a], /* Private Use */
- [0xf16b, 0xf16b], /* Private Use */
- [0xf16c, 0xf16c], /* Private Use */
- [0xf16d, 0xf16d], /* Private Use */
- [0xf16e, 0xf16e], /* Private Use */
- [0xf16f, 0xf16f], /* Private Use */
- [0xf170, 0xf170], /* Private Use */
- [0xf171, 0xf171], /* Private Use */
- [0xf172, 0xf172], /* Private Use */
- [0xf173, 0xf173], /* Private Use */
- [0xf174, 0xf174], /* Private Use */
- [0xf175, 0xf175], /* Private Use */
- [0xf176, 0xf176], /* Private Use */
- [0xf177, 0xf177], /* Private Use */
- [0xf178, 0xf178], /* Private Use */
- [0xf179, 0xf179], /* Private Use */
- [0xf17a, 0xf17a], /* Private Use */
- [0xf17b, 0xf17b], /* Private Use */
- [0xf17c, 0xf17c], /* Private Use */
- [0xf17d, 0xf17d], /* Private Use */
- [0xf17e, 0xf17e], /* Private Use */
- [0xf17f, 0xf17f], /* Private Use */
- [0xf180, 0xf180], /* Private Use */
- [0xf181, 0xf181], /* Private Use */
- [0xf182, 0xf182], /* Private Use */
- [0xf183, 0xf183], /* Private Use */
- [0xf184, 0xf184], /* Private Use */
- [0xf185, 0xf185], /* Private Use */
- [0xf186, 0xf186], /* Private Use */
- [0xf187, 0xf187], /* Private Use */
- [0xf188, 0xf188], /* Private Use */
- [0xf189, 0xf189], /* Private Use */
- [0xf18a, 0xf18a], /* Private Use */
- [0xf18b, 0xf18b], /* Private Use */
- [0xf18c, 0xf18c], /* Private Use */
- [0xf18d, 0xf18d], /* Private Use */
- [0xf18e, 0xf18e], /* Private Use */
- [0xf18f, 0xf18f], /* Private Use */
- [0xf190, 0xf190], /* Private Use */
- [0xf191, 0xf191], /* Private Use */
- [0xf192, 0xf192], /* Private Use */
- [0xf193, 0xf193], /* Private Use */
- [0xf194, 0xf194], /* Private Use */
- [0xf195, 0xf195], /* Private Use */
- [0xf196, 0xf196], /* Private Use */
- [0xf197, 0xf197], /* Private Use */
- [0xf198, 0xf198], /* Private Use */
- [0xf199, 0xf199], /* Private Use */
- [0xf19a, 0xf19a], /* Private Use */
- [0xf19b, 0xf19b], /* Private Use */
- [0xf19c, 0xf19c], /* Private Use */
- [0xf19d, 0xf19d], /* Private Use */
- [0xf19e, 0xf19e], /* Private Use */
- [0xf19f, 0xf19f], /* Private Use */
- [0xf1a0, 0xf1a0], /* Private Use */
- [0xf1a1, 0xf1a1], /* Private Use */
- [0xf1a2, 0xf1a2], /* Private Use */
- [0xf1a3, 0xf1a3], /* Private Use */
- [0xf1a4, 0xf1a4], /* Private Use */
- [0xf1a5, 0xf1a5], /* Private Use */
- [0xf1a6, 0xf1a6], /* Private Use */
- [0xf1a7, 0xf1a7], /* Private Use */
- [0xf1a8, 0xf1a8], /* Private Use */
- [0xf1a9, 0xf1a9], /* Private Use */
- [0xf1aa, 0xf1aa], /* Private Use */
- [0xf1ab, 0xf1ab], /* Private Use */
- [0xf1ac, 0xf1ac], /* Private Use */
- [0xf1ad, 0xf1ad], /* Private Use */
- [0xf1ae, 0xf1ae], /* Private Use */
- [0xf1af, 0xf1af], /* Private Use */
- [0xf1b0, 0xf1b0], /* Private Use */
- [0xf1b1, 0xf1b1], /* Private Use */
- [0xf1b2, 0xf1b2], /* Private Use */
- [0xf1b3, 0xf1b3], /* Private Use */
- [0xf1b4, 0xf1b4], /* Private Use */
- [0xf1b5, 0xf1b5], /* Private Use */
- [0xf1b6, 0xf1b6], /* Private Use */
- [0xf1b7, 0xf1b7], /* Private Use */
- [0xf1b8, 0xf1b8], /* Private Use */
- [0xf1b9, 0xf1b9], /* Private Use */
- [0xf1ba, 0xf1ba], /* Private Use */
- [0xf1bb, 0xf1bb], /* Private Use */
- [0xf1bc, 0xf1bc], /* Private Use */
- [0xf1bd, 0xf1bd], /* Private Use */
- [0xf1be, 0xf1be], /* Private Use */
- [0xf1bf, 0xf1bf], /* Private Use */
- [0xf1c0, 0xf1c0], /* Private Use */
- [0xf1c1, 0xf1c1], /* Private Use */
- [0xf1c2, 0xf1c2], /* Private Use */
- [0xf1c3, 0xf1c3], /* Private Use */
- [0xf1c4, 0xf1c4], /* Private Use */
- [0xf1c5, 0xf1c5], /* Private Use */
- [0xf1c6, 0xf1c6], /* Private Use */
- [0xf1c7, 0xf1c7], /* Private Use */
- [0xf1c8, 0xf1c8], /* Private Use */
- [0xf1c9, 0xf1c9], /* Private Use */
- [0xf1ca, 0xf1ca], /* Private Use */
- [0xf1cb, 0xf1cb], /* Private Use */
- [0xf1cc, 0xf1cc], /* Private Use */
- [0xf1cd, 0xf1cd], /* Private Use */
- [0xf1ce, 0xf1ce], /* Private Use */
- [0xf1cf, 0xf1cf], /* Private Use */
- [0xf1d0, 0xf1d0], /* Private Use */
- [0xf1d1, 0xf1d1], /* Private Use */
- [0xf1d2, 0xf1d2], /* Private Use */
- [0xf1d3, 0xf1d3], /* Private Use */
- [0xf1d4, 0xf1d4], /* Private Use */
- [0xf1d5, 0xf1d5], /* Private Use */
- [0xf1d6, 0xf1d6], /* Private Use */
- [0xf1d7, 0xf1d7], /* Private Use */
- [0xf1d8, 0xf1d8], /* Private Use */
- [0xf1d9, 0xf1d9], /* Private Use */
- [0xf1da, 0xf1da], /* Private Use */
- [0xf1db, 0xf1db], /* Private Use */
- [0xf1dc, 0xf1dc], /* Private Use */
- [0xf1dd, 0xf1dd], /* Private Use */
- [0xf1de, 0xf1de], /* Private Use */
- [0xf1df, 0xf1df], /* Private Use */
- [0xf1e0, 0xf1e0], /* Private Use */
- [0xf1e1, 0xf1e1], /* Private Use */
- [0xf1e2, 0xf1e2], /* Private Use */
- [0xf1e3, 0xf1e3], /* Private Use */
- [0xf1e4, 0xf1e4], /* Private Use */
- [0xf1e5, 0xf1e5], /* Private Use */
- [0xf1e6, 0xf1e6], /* Private Use */
- [0xf1e7, 0xf1e7], /* Private Use */
- [0xf1e8, 0xf1e8], /* Private Use */
- [0xf1e9, 0xf1e9], /* Private Use */
- [0xf1ea, 0xf1ea], /* Private Use */
- [0xf1eb, 0xf1eb], /* Private Use */
- [0xf1ec, 0xf1ec], /* Private Use */
- [0xf1ed, 0xf1ed], /* Private Use */
- [0xf1ee, 0xf1ee], /* Private Use */
- [0xf1ef, 0xf1ef], /* Private Use */
- [0xf1f0, 0xf1f0], /* Private Use */
- [0xf1f1, 0xf1f1], /* Private Use */
- [0xf1f2, 0xf1f2], /* Private Use */
- [0xf1f3, 0xf1f3], /* Private Use */
- [0xf1f4, 0xf1f4], /* Private Use */
- [0xf1f5, 0xf1f5], /* Private Use */
- [0xf1f6, 0xf1f6], /* Private Use */
- [0xf1f7, 0xf1f7], /* Private Use */
- [0xf1f8, 0xf1f8], /* Private Use */
- [0xf1f9, 0xf1f9], /* Private Use */
- [0xf1fa, 0xf1fa], /* Private Use */
- [0xf1fb, 0xf1fb], /* Private Use */
- [0xf1fc, 0xf1fc], /* Private Use */
- [0xf1fd, 0xf1fd], /* Private Use */
- [0xf1fe, 0xf1fe], /* Private Use */
- [0xf1ff, 0xf1ff], /* Private Use */
- [0xf200, 0xf200], /* Private Use */
- [0xf201, 0xf201], /* Private Use */
- [0xf202, 0xf202], /* Private Use */
- [0xf203, 0xf203], /* Private Use */
- [0xf204, 0xf204], /* Private Use */
- [0xf205, 0xf205], /* Private Use */
- [0xf206, 0xf206], /* Private Use */
- [0xf207, 0xf207], /* Private Use */
- [0xf208, 0xf208], /* Private Use */
- [0xf209, 0xf209], /* Private Use */
- [0xf20a, 0xf20a], /* Private Use */
- [0xf20b, 0xf20b], /* Private Use */
- [0xf20c, 0xf20c], /* Private Use */
- [0xf20d, 0xf20d], /* Private Use */
- [0xf20e, 0xf20e], /* Private Use */
- [0xf20f, 0xf20f], /* Private Use */
- [0xf210, 0xf210], /* Private Use */
- [0xf211, 0xf211], /* Private Use */
- [0xf212, 0xf212], /* Private Use */
- [0xf213, 0xf213], /* Private Use */
- [0xf214, 0xf214], /* Private Use */
- [0xf215, 0xf215], /* Private Use */
- [0xf216, 0xf216], /* Private Use */
- [0xf217, 0xf217], /* Private Use */
- [0xf218, 0xf218], /* Private Use */
- [0xf219, 0xf219], /* Private Use */
- [0xf21a, 0xf21a], /* Private Use */
- [0xf21b, 0xf21b], /* Private Use */
- [0xf21c, 0xf21c], /* Private Use */
- [0xf21d, 0xf21d], /* Private Use */
- [0xf21e, 0xf21e], /* Private Use */
- [0xf21f, 0xf21f], /* Private Use */
- [0xf220, 0xf220], /* Private Use */
- [0xf221, 0xf221], /* Private Use */
- [0xf222, 0xf222], /* Private Use */
- [0xf223, 0xf223], /* Private Use */
- [0xf224, 0xf224], /* Private Use */
- [0xf225, 0xf225], /* Private Use */
- [0xf226, 0xf226], /* Private Use */
- [0xf227, 0xf227], /* Private Use */
- [0xf228, 0xf228], /* Private Use */
- [0xf229, 0xf229], /* Private Use */
- [0xf22a, 0xf22a], /* Private Use */
- [0xf22b, 0xf22b], /* Private Use */
- [0xf22c, 0xf22c], /* Private Use */
- [0xf22d, 0xf22d], /* Private Use */
- [0xf22e, 0xf22e], /* Private Use */
- [0xf22f, 0xf22f], /* Private Use */
- [0xf230, 0xf230], /* Private Use */
- [0xf231, 0xf231], /* Private Use */
- [0xf232, 0xf232], /* Private Use */
- [0xf233, 0xf233], /* Private Use */
- [0xf234, 0xf234], /* Private Use */
- [0xf235, 0xf235], /* Private Use */
- [0xf236, 0xf236], /* Private Use */
- [0xf237, 0xf237], /* Private Use */
- [0xf238, 0xf238], /* Private Use */
- [0xf239, 0xf239], /* Private Use */
- [0xf23a, 0xf23a], /* Private Use */
- [0xf23b, 0xf23b], /* Private Use */
- [0xf23c, 0xf23c], /* Private Use */
- [0xf23d, 0xf23d], /* Private Use */
- [0xf23e, 0xf23e], /* Private Use */
- [0xf23f, 0xf23f], /* Private Use */
- [0xf240, 0xf240], /* Private Use */
- [0xf241, 0xf241], /* Private Use */
- [0xf242, 0xf242], /* Private Use */
- [0xf243, 0xf243], /* Private Use */
- [0xf244, 0xf244], /* Private Use */
- [0xf245, 0xf245], /* Private Use */
- [0xf246, 0xf246], /* Private Use */
- [0xf247, 0xf247], /* Private Use */
- [0xf248, 0xf248], /* Private Use */
- [0xf249, 0xf249], /* Private Use */
- [0xf24a, 0xf24a], /* Private Use */
- [0xf24b, 0xf24b], /* Private Use */
- [0xf24c, 0xf24c], /* Private Use */
- [0xf24d, 0xf24d], /* Private Use */
- [0xf24e, 0xf24e], /* Private Use */
- [0xf24f, 0xf24f], /* Private Use */
- [0xf250, 0xf250], /* Private Use */
- [0xf251, 0xf251], /* Private Use */
- [0xf252, 0xf252], /* Private Use */
- [0xf253, 0xf253], /* Private Use */
- [0xf254, 0xf254], /* Private Use */
- [0xf255, 0xf255], /* Private Use */
- [0xf256, 0xf256], /* Private Use */
- [0xf257, 0xf257], /* Private Use */
- [0xf258, 0xf258], /* Private Use */
- [0xf259, 0xf259], /* Private Use */
- [0xf25a, 0xf25a], /* Private Use */
- [0xf25b, 0xf25b], /* Private Use */
- [0xf25c, 0xf25c], /* Private Use */
- [0xf25d, 0xf25d], /* Private Use */
- [0xf25e, 0xf25e], /* Private Use */
- [0xf25f, 0xf25f], /* Private Use */
- [0xf260, 0xf260], /* Private Use */
- [0xf261, 0xf261], /* Private Use */
- [0xf262, 0xf262], /* Private Use */
- [0xf263, 0xf263], /* Private Use */
- [0xf264, 0xf264], /* Private Use */
- [0xf265, 0xf265], /* Private Use */
- [0xf266, 0xf266], /* Private Use */
- [0xf267, 0xf267], /* Private Use */
- [0xf268, 0xf268], /* Private Use */
- [0xf269, 0xf269], /* Private Use */
- [0xf26a, 0xf26a], /* Private Use */
- [0xf26b, 0xf26b], /* Private Use */
- [0xf26c, 0xf26c], /* Private Use */
- [0xf26d, 0xf26d], /* Private Use */
- [0xf26e, 0xf26e], /* Private Use */
- [0xf26f, 0xf26f], /* Private Use */
- [0xf270, 0xf270], /* Private Use */
- [0xf271, 0xf271], /* Private Use */
- [0xf272, 0xf272], /* Private Use */
- [0xf273, 0xf273], /* Private Use */
- [0xf274, 0xf274], /* Private Use */
- [0xf275, 0xf275], /* Private Use */
- [0xf276, 0xf276], /* Private Use */
- [0xf277, 0xf277], /* Private Use */
- [0xf278, 0xf278], /* Private Use */
- [0xf279, 0xf279], /* Private Use */
- [0xf27a, 0xf27a], /* Private Use */
- [0xf27b, 0xf27b], /* Private Use */
- [0xf27c, 0xf27c], /* Private Use */
- [0xf27d, 0xf27d], /* Private Use */
- [0xf27e, 0xf27e], /* Private Use */
- [0xf27f, 0xf27f], /* Private Use */
- [0xf280, 0xf280], /* Private Use */
- [0xf281, 0xf281], /* Private Use */
- [0xf282, 0xf282], /* Private Use */
- [0xf283, 0xf283], /* Private Use */
- [0xf284, 0xf284], /* Private Use */
- [0xf285, 0xf285], /* Private Use */
- [0xf286, 0xf286], /* Private Use */
- [0xf287, 0xf287], /* Private Use */
- [0xf288, 0xf288], /* Private Use */
- [0xf289, 0xf289], /* Private Use */
- [0xf28a, 0xf28a], /* Private Use */
- [0xf28b, 0xf28b], /* Private Use */
- [0xf28c, 0xf28c], /* Private Use */
- [0xf28d, 0xf28d], /* Private Use */
- [0xf28e, 0xf28e], /* Private Use */
- [0xf28f, 0xf28f], /* Private Use */
- [0xf290, 0xf290], /* Private Use */
- [0xf291, 0xf291], /* Private Use */
- [0xf292, 0xf292], /* Private Use */
- [0xf293, 0xf293], /* Private Use */
- [0xf294, 0xf294], /* Private Use */
- [0xf295, 0xf295], /* Private Use */
- [0xf296, 0xf296], /* Private Use */
- [0xf297, 0xf297], /* Private Use */
- [0xf298, 0xf298], /* Private Use */
- [0xf299, 0xf299], /* Private Use */
- [0xf29a, 0xf29a], /* Private Use */
- [0xf29b, 0xf29b], /* Private Use */
- [0xf29c, 0xf29c], /* Private Use */
- [0xf29d, 0xf29d], /* Private Use */
- [0xf29e, 0xf29e], /* Private Use */
- [0xf29f, 0xf29f], /* Private Use */
- [0xf2a0, 0xf2a0], /* Private Use */
- [0xf2a1, 0xf2a1], /* Private Use */
- [0xf2a2, 0xf2a2], /* Private Use */
- [0xf2a3, 0xf2a3], /* Private Use */
- [0xf2a4, 0xf2a4], /* Private Use */
- [0xf2a5, 0xf2a5], /* Private Use */
- [0xf2a6, 0xf2a6], /* Private Use */
- [0xf2a7, 0xf2a7], /* Private Use */
- [0xf2a8, 0xf2a8], /* Private Use */
- [0xf2a9, 0xf2a9], /* Private Use */
- [0xf2aa, 0xf2aa], /* Private Use */
- [0xf2ab, 0xf2ab], /* Private Use */
- [0xf2ac, 0xf2ac], /* Private Use */
- [0xf2ad, 0xf2ad], /* Private Use */
- [0xf2ae, 0xf2ae], /* Private Use */
- [0xf2af, 0xf2af], /* Private Use */
- [0xf2b0, 0xf2b0], /* Private Use */
- [0xf2b1, 0xf2b1], /* Private Use */
- [0xf2b2, 0xf2b2], /* Private Use */
- [0xf2b3, 0xf2b3], /* Private Use */
- [0xf2b4, 0xf2b4], /* Private Use */
- [0xf2b5, 0xf2b5], /* Private Use */
- [0xf2b6, 0xf2b6], /* Private Use */
- [0xf2b7, 0xf2b7], /* Private Use */
- [0xf2b8, 0xf2b8], /* Private Use */
- [0xf2b9, 0xf2b9], /* Private Use */
- [0xf2ba, 0xf2ba], /* Private Use */
- [0xf2bb, 0xf2bb], /* Private Use */
- [0xf2bc, 0xf2bc], /* Private Use */
- [0xf2bd, 0xf2bd], /* Private Use */
- [0xf2be, 0xf2be], /* Private Use */
- [0xf2bf, 0xf2bf], /* Private Use */
- [0xf2c0, 0xf2c0], /* Private Use */
- [0xf2c1, 0xf2c1], /* Private Use */
- [0xf2c2, 0xf2c2], /* Private Use */
- [0xf2c3, 0xf2c3], /* Private Use */
- [0xf2c4, 0xf2c4], /* Private Use */
- [0xf2c5, 0xf2c5], /* Private Use */
- [0xf2c6, 0xf2c6], /* Private Use */
- [0xf2c7, 0xf2c7], /* Private Use */
- [0xf2c8, 0xf2c8], /* Private Use */
- [0xf2c9, 0xf2c9], /* Private Use */
- [0xf2ca, 0xf2ca], /* Private Use */
- [0xf2cb, 0xf2cb], /* Private Use */
- [0xf2cc, 0xf2cc], /* Private Use */
- [0xf2cd, 0xf2cd], /* Private Use */
- [0xf2ce, 0xf2ce], /* Private Use */
- [0xf2cf, 0xf2cf], /* Private Use */
- [0xf2d0, 0xf2d0], /* Private Use */
- [0xf2d1, 0xf2d1], /* Private Use */
- [0xf2d2, 0xf2d2], /* Private Use */
- [0xf2d3, 0xf2d3], /* Private Use */
- [0xf2d4, 0xf2d4], /* Private Use */
- [0xf2d5, 0xf2d5], /* Private Use */
- [0xf2d6, 0xf2d6], /* Private Use */
- [0xf2d7, 0xf2d7], /* Private Use */
- [0xf2d8, 0xf2d8], /* Private Use */
- [0xf2d9, 0xf2d9], /* Private Use */
- [0xf2da, 0xf2da], /* Private Use */
- [0xf2db, 0xf2db], /* Private Use */
- [0xf2dc, 0xf2dc], /* Private Use */
- [0xf2dd, 0xf2dd], /* Private Use */
- [0xf2de, 0xf2de], /* Private Use */
- [0xf2df, 0xf2df], /* Private Use */
- [0xf2e0, 0xf2e0], /* Private Use */
- [0xf2e1, 0xf2e1], /* Private Use */
- [0xf2e2, 0xf2e2], /* Private Use */
- [0xf2e3, 0xf2e3], /* Private Use */
- [0xf2e4, 0xf2e4], /* Private Use */
- [0xf2e5, 0xf2e5], /* Private Use */
- [0xf2e6, 0xf2e6], /* Private Use */
- [0xf2e7, 0xf2e7], /* Private Use */
- [0xf2e8, 0xf2e8], /* Private Use */
- [0xf2e9, 0xf2e9], /* Private Use */
- [0xf2ea, 0xf2ea], /* Private Use */
- [0xf2eb, 0xf2eb], /* Private Use */
- [0xf2ec, 0xf2ec], /* Private Use */
- [0xf2ed, 0xf2ed], /* Private Use */
- [0xf2ee, 0xf2ee], /* Private Use */
- [0xf2ef, 0xf2ef], /* Private Use */
- [0xf2f0, 0xf2f0], /* Private Use */
- [0xf2f1, 0xf2f1], /* Private Use */
- [0xf2f2, 0xf2f2], /* Private Use */
- [0xf2f3, 0xf2f3], /* Private Use */
- [0xf2f4, 0xf2f4], /* Private Use */
- [0xf2f5, 0xf2f5], /* Private Use */
- [0xf2f6, 0xf2f6], /* Private Use */
- [0xf2f7, 0xf2f7], /* Private Use */
- [0xf2f8, 0xf2f8], /* Private Use */
- [0xf2f9, 0xf2f9], /* Private Use */
- [0xf2fa, 0xf2fa], /* Private Use */
- [0xf2fb, 0xf2fb], /* Private Use */
- [0xf2fc, 0xf2fc], /* Private Use */
- [0xf2fd, 0xf2fd], /* Private Use */
- [0xf2fe, 0xf2fe], /* Private Use */
- [0xf2ff, 0xf2ff], /* Private Use */
- [0xf300, 0xf300], /* Private Use */
- [0xf301, 0xf301], /* Private Use */
- [0xf302, 0xf302], /* Private Use */
- [0xf303, 0xf303], /* Private Use */
- [0xf304, 0xf304], /* Private Use */
- [0xf305, 0xf305], /* Private Use */
- [0xf306, 0xf306], /* Private Use */
- [0xf307, 0xf307], /* Private Use */
- [0xf308, 0xf308], /* Private Use */
- [0xf309, 0xf309], /* Private Use */
- [0xf30a, 0xf30a], /* Private Use */
- [0xf30b, 0xf30b], /* Private Use */
- [0xf30c, 0xf30c], /* Private Use */
- [0xf30d, 0xf30d], /* Private Use */
- [0xf30e, 0xf30e], /* Private Use */
- [0xf30f, 0xf30f], /* Private Use */
- [0xf310, 0xf310], /* Private Use */
- [0xf311, 0xf311], /* Private Use */
- [0xf312, 0xf312], /* Private Use */
- [0xf313, 0xf313], /* Private Use */
- [0xf314, 0xf314], /* Private Use */
- [0xf315, 0xf315], /* Private Use */
- [0xf316, 0xf316], /* Private Use */
- [0xf317, 0xf317], /* Private Use */
- [0xf318, 0xf318], /* Private Use */
- [0xf319, 0xf319], /* Private Use */
- [0xf31a, 0xf31a], /* Private Use */
- [0xf31b, 0xf31b], /* Private Use */
- [0xf31c, 0xf31c], /* Private Use */
- [0xf31d, 0xf31d], /* Private Use */
- [0xf31e, 0xf31e], /* Private Use */
- [0xf31f, 0xf31f], /* Private Use */
- [0xf320, 0xf320], /* Private Use */
- [0xf321, 0xf321], /* Private Use */
- [0xf322, 0xf322], /* Private Use */
- [0xf323, 0xf323], /* Private Use */
- [0xf324, 0xf324], /* Private Use */
- [0xf325, 0xf325], /* Private Use */
- [0xf326, 0xf326], /* Private Use */
- [0xf327, 0xf327], /* Private Use */
- [0xf328, 0xf328], /* Private Use */
- [0xf329, 0xf329], /* Private Use */
- [0xf32a, 0xf32a], /* Private Use */
- [0xf32b, 0xf32b], /* Private Use */
- [0xf32c, 0xf32c], /* Private Use */
- [0xf32d, 0xf32d], /* Private Use */
- [0xf32e, 0xf32e], /* Private Use */
- [0xf32f, 0xf32f], /* Private Use */
- [0xf330, 0xf330], /* Private Use */
- [0xf331, 0xf331], /* Private Use */
- [0xf332, 0xf332], /* Private Use */
- [0xf333, 0xf333], /* Private Use */
- [0xf334, 0xf334], /* Private Use */
- [0xf335, 0xf335], /* Private Use */
- [0xf336, 0xf336], /* Private Use */
- [0xf337, 0xf337], /* Private Use */
- [0xf338, 0xf338], /* Private Use */
- [0xf339, 0xf339], /* Private Use */
- [0xf33a, 0xf33a], /* Private Use */
- [0xf33b, 0xf33b], /* Private Use */
- [0xf33c, 0xf33c], /* Private Use */
- [0xf33d, 0xf33d], /* Private Use */
- [0xf33e, 0xf33e], /* Private Use */
- [0xf33f, 0xf33f], /* Private Use */
- [0xf340, 0xf340], /* Private Use */
- [0xf341, 0xf341], /* Private Use */
- [0xf342, 0xf342], /* Private Use */
- [0xf343, 0xf343], /* Private Use */
- [0xf344, 0xf344], /* Private Use */
- [0xf345, 0xf345], /* Private Use */
- [0xf346, 0xf346], /* Private Use */
- [0xf347, 0xf347], /* Private Use */
- [0xf348, 0xf348], /* Private Use */
- [0xf349, 0xf349], /* Private Use */
- [0xf34a, 0xf34a], /* Private Use */
- [0xf34b, 0xf34b], /* Private Use */
- [0xf34c, 0xf34c], /* Private Use */
- [0xf34d, 0xf34d], /* Private Use */
- [0xf34e, 0xf34e], /* Private Use */
- [0xf34f, 0xf34f], /* Private Use */
- [0xf350, 0xf350], /* Private Use */
- [0xf351, 0xf351], /* Private Use */
- [0xf352, 0xf352], /* Private Use */
- [0xf353, 0xf353], /* Private Use */
- [0xf354, 0xf354], /* Private Use */
- [0xf355, 0xf355], /* Private Use */
- [0xf356, 0xf356], /* Private Use */
- [0xf357, 0xf357], /* Private Use */
- [0xf358, 0xf358], /* Private Use */
- [0xf359, 0xf359], /* Private Use */
- [0xf35a, 0xf35a], /* Private Use */
- [0xf35b, 0xf35b], /* Private Use */
- [0xf35c, 0xf35c], /* Private Use */
- [0xf35d, 0xf35d], /* Private Use */
- [0xf35e, 0xf35e], /* Private Use */
- [0xf35f, 0xf35f], /* Private Use */
- [0xf360, 0xf360], /* Private Use */
- [0xf361, 0xf361], /* Private Use */
- [0xf362, 0xf362], /* Private Use */
- [0xf363, 0xf363], /* Private Use */
- [0xf364, 0xf364], /* Private Use */
- [0xf365, 0xf365], /* Private Use */
- [0xf366, 0xf366], /* Private Use */
- [0xf367, 0xf367], /* Private Use */
- [0xf368, 0xf368], /* Private Use */
- [0xf369, 0xf369], /* Private Use */
- [0xf36a, 0xf36a], /* Private Use */
- [0xf36b, 0xf36b], /* Private Use */
- [0xf36c, 0xf36c], /* Private Use */
- [0xf36d, 0xf36d], /* Private Use */
- [0xf36e, 0xf36e], /* Private Use */
- [0xf36f, 0xf36f], /* Private Use */
- [0xf370, 0xf370], /* Private Use */
- [0xf371, 0xf371], /* Private Use */
- [0xf372, 0xf372], /* Private Use */
- [0xf373, 0xf373], /* Private Use */
- [0xf374, 0xf374], /* Private Use */
- [0xf375, 0xf375], /* Private Use */
- [0xf376, 0xf376], /* Private Use */
- [0xf377, 0xf377], /* Private Use */
- [0xf378, 0xf378], /* Private Use */
- [0xf379, 0xf379], /* Private Use */
- [0xf37a, 0xf37a], /* Private Use */
- [0xf37b, 0xf37b], /* Private Use */
- [0xf37c, 0xf37c], /* Private Use */
- [0xf37d, 0xf37d], /* Private Use */
- [0xf37e, 0xf37e], /* Private Use */
- [0xf37f, 0xf37f], /* Private Use */
- [0xf380, 0xf380], /* Private Use */
- [0xf381, 0xf381], /* Private Use */
- [0xf382, 0xf382], /* Private Use */
- [0xf383, 0xf383], /* Private Use */
- [0xf384, 0xf384], /* Private Use */
- [0xf385, 0xf385], /* Private Use */
- [0xf386, 0xf386], /* Private Use */
- [0xf387, 0xf387], /* Private Use */
- [0xf388, 0xf388], /* Private Use */
- [0xf389, 0xf389], /* Private Use */
- [0xf38a, 0xf38a], /* Private Use */
- [0xf38b, 0xf38b], /* Private Use */
- [0xf38c, 0xf38c], /* Private Use */
- [0xf38d, 0xf38d], /* Private Use */
- [0xf38e, 0xf38e], /* Private Use */
- [0xf38f, 0xf38f], /* Private Use */
- [0xf390, 0xf390], /* Private Use */
- [0xf391, 0xf391], /* Private Use */
- [0xf392, 0xf392], /* Private Use */
- [0xf393, 0xf393], /* Private Use */
- [0xf394, 0xf394], /* Private Use */
- [0xf395, 0xf395], /* Private Use */
- [0xf396, 0xf396], /* Private Use */
- [0xf397, 0xf397], /* Private Use */
- [0xf398, 0xf398], /* Private Use */
- [0xf399, 0xf399], /* Private Use */
- [0xf39a, 0xf39a], /* Private Use */
- [0xf39b, 0xf39b], /* Private Use */
- [0xf39c, 0xf39c], /* Private Use */
- [0xf39d, 0xf39d], /* Private Use */
- [0xf39e, 0xf39e], /* Private Use */
- [0xf39f, 0xf39f], /* Private Use */
- [0xf3a0, 0xf3a0], /* Private Use */
- [0xf3a1, 0xf3a1], /* Private Use */
- [0xf3a2, 0xf3a2], /* Private Use */
- [0xf3a3, 0xf3a3], /* Private Use */
- [0xf3a4, 0xf3a4], /* Private Use */
- [0xf3a5, 0xf3a5], /* Private Use */
- [0xf3a6, 0xf3a6], /* Private Use */
- [0xf3a7, 0xf3a7], /* Private Use */
- [0xf3a8, 0xf3a8], /* Private Use */
- [0xf3a9, 0xf3a9], /* Private Use */
- [0xf3aa, 0xf3aa], /* Private Use */
- [0xf3ab, 0xf3ab], /* Private Use */
- [0xf3ac, 0xf3ac], /* Private Use */
- [0xf3ad, 0xf3ad], /* Private Use */
- [0xf3ae, 0xf3ae], /* Private Use */
- [0xf3af, 0xf3af], /* Private Use */
- [0xf3b0, 0xf3b0], /* Private Use */
- [0xf3b1, 0xf3b1], /* Private Use */
- [0xf3b2, 0xf3b2], /* Private Use */
- [0xf3b3, 0xf3b3], /* Private Use */
- [0xf3b4, 0xf3b4], /* Private Use */
- [0xf3b5, 0xf3b5], /* Private Use */
- [0xf3b6, 0xf3b6], /* Private Use */
- [0xf3b7, 0xf3b7], /* Private Use */
- [0xf3b8, 0xf3b8], /* Private Use */
- [0xf3b9, 0xf3b9], /* Private Use */
- [0xf3ba, 0xf3ba], /* Private Use */
- [0xf3bb, 0xf3bb], /* Private Use */
- [0xf3bc, 0xf3bc], /* Private Use */
- [0xf3bd, 0xf3bd], /* Private Use */
- [0xf3be, 0xf3be], /* Private Use */
- [0xf3bf, 0xf3bf], /* Private Use */
- [0xf3c0, 0xf3c0], /* Private Use */
- [0xf3c1, 0xf3c1], /* Private Use */
- [0xf3c2, 0xf3c2], /* Private Use */
- [0xf3c3, 0xf3c3], /* Private Use */
- [0xf3c4, 0xf3c4], /* Private Use */
- [0xf3c5, 0xf3c5], /* Private Use */
- [0xf3c6, 0xf3c6], /* Private Use */
- [0xf3c7, 0xf3c7], /* Private Use */
- [0xf3c8, 0xf3c8], /* Private Use */
- [0xf3c9, 0xf3c9], /* Private Use */
- [0xf3ca, 0xf3ca], /* Private Use */
- [0xf3cb, 0xf3cb], /* Private Use */
- [0xf3cc, 0xf3cc], /* Private Use */
- [0xf3cd, 0xf3cd], /* Private Use */
- [0xf3ce, 0xf3ce], /* Private Use */
- [0xf3cf, 0xf3cf], /* Private Use */
- [0xf3d0, 0xf3d0], /* Private Use */
- [0xf3d1, 0xf3d1], /* Private Use */
- [0xf3d2, 0xf3d2], /* Private Use */
- [0xf3d3, 0xf3d3], /* Private Use */
- [0xf3d4, 0xf3d4], /* Private Use */
- [0xf3d5, 0xf3d5], /* Private Use */
- [0xf3d6, 0xf3d6], /* Private Use */
- [0xf3d7, 0xf3d7], /* Private Use */
- [0xf3d8, 0xf3d8], /* Private Use */
- [0xf3d9, 0xf3d9], /* Private Use */
- [0xf3da, 0xf3da], /* Private Use */
- [0xf3db, 0xf3db], /* Private Use */
- [0xf3dc, 0xf3dc], /* Private Use */
- [0xf3dd, 0xf3dd], /* Private Use */
- [0xf3de, 0xf3de], /* Private Use */
- [0xf3df, 0xf3df], /* Private Use */
- [0xf3e0, 0xf3e0], /* Private Use */
- [0xf3e1, 0xf3e1], /* Private Use */
- [0xf3e2, 0xf3e2], /* Private Use */
- [0xf3e3, 0xf3e3], /* Private Use */
- [0xf3e4, 0xf3e4], /* Private Use */
- [0xf3e5, 0xf3e5], /* Private Use */
- [0xf3e6, 0xf3e6], /* Private Use */
- [0xf3e7, 0xf3e7], /* Private Use */
- [0xf3e8, 0xf3e8], /* Private Use */
- [0xf3e9, 0xf3e9], /* Private Use */
- [0xf3ea, 0xf3ea], /* Private Use */
- [0xf3eb, 0xf3eb], /* Private Use */
- [0xf3ec, 0xf3ec], /* Private Use */
- [0xf3ed, 0xf3ed], /* Private Use */
- [0xf3ee, 0xf3ee], /* Private Use */
- [0xf3ef, 0xf3ef], /* Private Use */
- [0xf3f0, 0xf3f0], /* Private Use */
- [0xf3f1, 0xf3f1], /* Private Use */
- [0xf3f2, 0xf3f2], /* Private Use */
- [0xf3f3, 0xf3f3], /* Private Use */
- [0xf3f4, 0xf3f4], /* Private Use */
- [0xf3f5, 0xf3f5], /* Private Use */
- [0xf3f6, 0xf3f6], /* Private Use */
- [0xf3f7, 0xf3f7], /* Private Use */
- [0xf3f8, 0xf3f8], /* Private Use */
- [0xf3f9, 0xf3f9], /* Private Use */
- [0xf3fa, 0xf3fa], /* Private Use */
- [0xf3fb, 0xf3fb], /* Private Use */
- [0xf3fc, 0xf3fc], /* Private Use */
- [0xf3fd, 0xf3fd], /* Private Use */
- [0xf3fe, 0xf3fe], /* Private Use */
- [0xf3ff, 0xf3ff], /* Private Use */
- [0xf400, 0xf400], /* Private Use */
- [0xf401, 0xf401], /* Private Use */
- [0xf402, 0xf402], /* Private Use */
- [0xf403, 0xf403], /* Private Use */
- [0xf404, 0xf404], /* Private Use */
- [0xf405, 0xf405], /* Private Use */
- [0xf406, 0xf406], /* Private Use */
- [0xf407, 0xf407], /* Private Use */
- [0xf408, 0xf408], /* Private Use */
- [0xf409, 0xf409], /* Private Use */
- [0xf40a, 0xf40a], /* Private Use */
- [0xf40b, 0xf40b], /* Private Use */
- [0xf40c, 0xf40c], /* Private Use */
- [0xf40d, 0xf40d], /* Private Use */
- [0xf40e, 0xf40e], /* Private Use */
- [0xf40f, 0xf40f], /* Private Use */
- [0xf410, 0xf410], /* Private Use */
- [0xf411, 0xf411], /* Private Use */
- [0xf412, 0xf412], /* Private Use */
- [0xf413, 0xf413], /* Private Use */
- [0xf414, 0xf414], /* Private Use */
- [0xf415, 0xf415], /* Private Use */
- [0xf416, 0xf416], /* Private Use */
- [0xf417, 0xf417], /* Private Use */
- [0xf418, 0xf418], /* Private Use */
- [0xf419, 0xf419], /* Private Use */
- [0xf41a, 0xf41a], /* Private Use */
- [0xf41b, 0xf41b], /* Private Use */
- [0xf41c, 0xf41c], /* Private Use */
- [0xf41d, 0xf41d], /* Private Use */
- [0xf41e, 0xf41e], /* Private Use */
- [0xf41f, 0xf41f], /* Private Use */
- [0xf420, 0xf420], /* Private Use */
- [0xf421, 0xf421], /* Private Use */
- [0xf422, 0xf422], /* Private Use */
- [0xf423, 0xf423], /* Private Use */
- [0xf424, 0xf424], /* Private Use */
- [0xf425, 0xf425], /* Private Use */
- [0xf426, 0xf426], /* Private Use */
- [0xf427, 0xf427], /* Private Use */
- [0xf428, 0xf428], /* Private Use */
- [0xf429, 0xf429], /* Private Use */
- [0xf42a, 0xf42a], /* Private Use */
- [0xf42b, 0xf42b], /* Private Use */
- [0xf42c, 0xf42c], /* Private Use */
- [0xf42d, 0xf42d], /* Private Use */
- [0xf42e, 0xf42e], /* Private Use */
- [0xf42f, 0xf42f], /* Private Use */
- [0xf430, 0xf430], /* Private Use */
- [0xf431, 0xf431], /* Private Use */
- [0xf432, 0xf432], /* Private Use */
- [0xf433, 0xf433], /* Private Use */
- [0xf434, 0xf434], /* Private Use */
- [0xf435, 0xf435], /* Private Use */
- [0xf436, 0xf436], /* Private Use */
- [0xf437, 0xf437], /* Private Use */
- [0xf438, 0xf438], /* Private Use */
- [0xf439, 0xf439], /* Private Use */
- [0xf43a, 0xf43a], /* Private Use */
- [0xf43b, 0xf43b], /* Private Use */
- [0xf43c, 0xf43c], /* Private Use */
- [0xf43d, 0xf43d], /* Private Use */
- [0xf43e, 0xf43e], /* Private Use */
- [0xf43f, 0xf43f], /* Private Use */
- [0xf440, 0xf440], /* Private Use */
- [0xf441, 0xf441], /* Private Use */
- [0xf442, 0xf442], /* Private Use */
- [0xf443, 0xf443], /* Private Use */
- [0xf444, 0xf444], /* Private Use */
- [0xf445, 0xf445], /* Private Use */
- [0xf446, 0xf446], /* Private Use */
- [0xf447, 0xf447], /* Private Use */
- [0xf448, 0xf448], /* Private Use */
- [0xf449, 0xf449], /* Private Use */
- [0xf44a, 0xf44a], /* Private Use */
- [0xf44b, 0xf44b], /* Private Use */
- [0xf44c, 0xf44c], /* Private Use */
- [0xf44d, 0xf44d], /* Private Use */
- [0xf44e, 0xf44e], /* Private Use */
- [0xf44f, 0xf44f], /* Private Use */
- [0xf450, 0xf450], /* Private Use */
- [0xf451, 0xf451], /* Private Use */
- [0xf452, 0xf452], /* Private Use */
- [0xf453, 0xf453], /* Private Use */
- [0xf454, 0xf454], /* Private Use */
- [0xf455, 0xf455], /* Private Use */
- [0xf456, 0xf456], /* Private Use */
- [0xf457, 0xf457], /* Private Use */
- [0xf458, 0xf458], /* Private Use */
- [0xf459, 0xf459], /* Private Use */
- [0xf45a, 0xf45a], /* Private Use */
- [0xf45b, 0xf45b], /* Private Use */
- [0xf45c, 0xf45c], /* Private Use */
- [0xf45d, 0xf45d], /* Private Use */
- [0xf45e, 0xf45e], /* Private Use */
- [0xf45f, 0xf45f], /* Private Use */
- [0xf460, 0xf460], /* Private Use */
- [0xf461, 0xf461], /* Private Use */
- [0xf462, 0xf462], /* Private Use */
- [0xf463, 0xf463], /* Private Use */
- [0xf464, 0xf464], /* Private Use */
- [0xf465, 0xf465], /* Private Use */
- [0xf466, 0xf466], /* Private Use */
- [0xf467, 0xf467], /* Private Use */
- [0xf468, 0xf468], /* Private Use */
- [0xf469, 0xf469], /* Private Use */
- [0xf46a, 0xf46a], /* Private Use */
- [0xf46b, 0xf46b], /* Private Use */
- [0xf46c, 0xf46c], /* Private Use */
- [0xf46d, 0xf46d], /* Private Use */
- [0xf46e, 0xf46e], /* Private Use */
- [0xf46f, 0xf46f], /* Private Use */
- [0xf470, 0xf470], /* Private Use */
- [0xf471, 0xf471], /* Private Use */
- [0xf472, 0xf472], /* Private Use */
- [0xf473, 0xf473], /* Private Use */
- [0xf474, 0xf474], /* Private Use */
- [0xf475, 0xf475], /* Private Use */
- [0xf476, 0xf476], /* Private Use */
- [0xf477, 0xf477], /* Private Use */
- [0xf478, 0xf478], /* Private Use */
- [0xf479, 0xf479], /* Private Use */
- [0xf47a, 0xf47a], /* Private Use */
- [0xf47b, 0xf47b], /* Private Use */
- [0xf47c, 0xf47c], /* Private Use */
- [0xf47d, 0xf47d], /* Private Use */
- [0xf47e, 0xf47e], /* Private Use */
- [0xf47f, 0xf47f], /* Private Use */
- [0xf480, 0xf480], /* Private Use */
- [0xf481, 0xf481], /* Private Use */
- [0xf482, 0xf482], /* Private Use */
- [0xf483, 0xf483], /* Private Use */
- [0xf484, 0xf484], /* Private Use */
- [0xf485, 0xf485], /* Private Use */
- [0xf486, 0xf486], /* Private Use */
- [0xf487, 0xf487], /* Private Use */
- [0xf488, 0xf488], /* Private Use */
- [0xf489, 0xf489], /* Private Use */
- [0xf48a, 0xf48a], /* Private Use */
- [0xf48b, 0xf48b], /* Private Use */
- [0xf48c, 0xf48c], /* Private Use */
- [0xf48d, 0xf48d], /* Private Use */
- [0xf48e, 0xf48e], /* Private Use */
- [0xf48f, 0xf48f], /* Private Use */
- [0xf490, 0xf490], /* Private Use */
- [0xf491, 0xf491], /* Private Use */
- [0xf492, 0xf492], /* Private Use */
- [0xf493, 0xf493], /* Private Use */
- [0xf494, 0xf494], /* Private Use */
- [0xf495, 0xf495], /* Private Use */
- [0xf496, 0xf496], /* Private Use */
- [0xf497, 0xf497], /* Private Use */
- [0xf498, 0xf498], /* Private Use */
- [0xf499, 0xf499], /* Private Use */
- [0xf49a, 0xf49a], /* Private Use */
- [0xf49b, 0xf49b], /* Private Use */
- [0xf49c, 0xf49c], /* Private Use */
- [0xf49d, 0xf49d], /* Private Use */
- [0xf49e, 0xf49e], /* Private Use */
- [0xf49f, 0xf49f], /* Private Use */
- [0xf4a0, 0xf4a0], /* Private Use */
- [0xf4a1, 0xf4a1], /* Private Use */
- [0xf4a2, 0xf4a2], /* Private Use */
- [0xf4a3, 0xf4a3], /* Private Use */
- [0xf4a4, 0xf4a4], /* Private Use */
- [0xf4a5, 0xf4a5], /* Private Use */
- [0xf4a6, 0xf4a6], /* Private Use */
- [0xf4a7, 0xf4a7], /* Private Use */
- [0xf4a8, 0xf4a8], /* Private Use */
- [0xf4a9, 0xf4a9], /* Private Use */
- [0xf4aa, 0xf4aa], /* Private Use */
- [0xf4ab, 0xf4ab], /* Private Use */
- [0xf4ac, 0xf4ac], /* Private Use */
- [0xf4ad, 0xf4ad], /* Private Use */
- [0xf4ae, 0xf4ae], /* Private Use */
- [0xf4af, 0xf4af], /* Private Use */
- [0xf4b0, 0xf4b0], /* Private Use */
- [0xf4b1, 0xf4b1], /* Private Use */
- [0xf4b2, 0xf4b2], /* Private Use */
- [0xf4b3, 0xf4b3], /* Private Use */
- [0xf4b4, 0xf4b4], /* Private Use */
- [0xf4b5, 0xf4b5], /* Private Use */
- [0xf4b6, 0xf4b6], /* Private Use */
- [0xf4b7, 0xf4b7], /* Private Use */
- [0xf4b8, 0xf4b8], /* Private Use */
- [0xf4b9, 0xf4b9], /* Private Use */
- [0xf4ba, 0xf4ba], /* Private Use */
- [0xf4bb, 0xf4bb], /* Private Use */
- [0xf4bc, 0xf4bc], /* Private Use */
- [0xf4bd, 0xf4bd], /* Private Use */
- [0xf4be, 0xf4be], /* Private Use */
- [0xf4bf, 0xf4bf], /* Private Use */
- [0xf4c0, 0xf4c0], /* Private Use */
- [0xf4c1, 0xf4c1], /* Private Use */
- [0xf4c2, 0xf4c2], /* Private Use */
- [0xf4c3, 0xf4c3], /* Private Use */
- [0xf4c4, 0xf4c4], /* Private Use */
- [0xf4c5, 0xf4c5], /* Private Use */
- [0xf4c6, 0xf4c6], /* Private Use */
- [0xf4c7, 0xf4c7], /* Private Use */
- [0xf4c8, 0xf4c8], /* Private Use */
- [0xf4c9, 0xf4c9], /* Private Use */
- [0xf4ca, 0xf4ca], /* Private Use */
- [0xf4cb, 0xf4cb], /* Private Use */
- [0xf4cc, 0xf4cc], /* Private Use */
- [0xf4cd, 0xf4cd], /* Private Use */
- [0xf4ce, 0xf4ce], /* Private Use */
- [0xf4cf, 0xf4cf], /* Private Use */
- [0xf4d0, 0xf4d0], /* Private Use */
- [0xf4d1, 0xf4d1], /* Private Use */
- [0xf4d2, 0xf4d2], /* Private Use */
- [0xf4d3, 0xf4d3], /* Private Use */
- [0xf4d4, 0xf4d4], /* Private Use */
- [0xf4d5, 0xf4d5], /* Private Use */
- [0xf4d6, 0xf4d6], /* Private Use */
- [0xf4d7, 0xf4d7], /* Private Use */
- [0xf4d8, 0xf4d8], /* Private Use */
- [0xf4d9, 0xf4d9], /* Private Use */
- [0xf4da, 0xf4da], /* Private Use */
- [0xf4db, 0xf4db], /* Private Use */
- [0xf4dc, 0xf4dc], /* Private Use */
- [0xf4dd, 0xf4dd], /* Private Use */
- [0xf4de, 0xf4de], /* Private Use */
- [0xf4df, 0xf4df], /* Private Use */
- [0xf4e0, 0xf4e0], /* Private Use */
- [0xf4e1, 0xf4e1], /* Private Use */
- [0xf4e2, 0xf4e2], /* Private Use */
- [0xf4e3, 0xf4e3], /* Private Use */
- [0xf4e4, 0xf4e4], /* Private Use */
- [0xf4e5, 0xf4e5], /* Private Use */
- [0xf4e6, 0xf4e6], /* Private Use */
- [0xf4e7, 0xf4e7], /* Private Use */
- [0xf4e8, 0xf4e8], /* Private Use */
- [0xf4e9, 0xf4e9], /* Private Use */
- [0xf4ea, 0xf4ea], /* Private Use */
- [0xf4eb, 0xf4eb], /* Private Use */
- [0xf4ec, 0xf4ec], /* Private Use */
- [0xf4ed, 0xf4ed], /* Private Use */
- [0xf4ee, 0xf4ee], /* Private Use */
- [0xf4ef, 0xf4ef], /* Private Use */
- [0xf4f0, 0xf4f0], /* Private Use */
- [0xf4f1, 0xf4f1], /* Private Use */
- [0xf4f2, 0xf4f2], /* Private Use */
- [0xf4f3, 0xf4f3], /* Private Use */
- [0xf4f4, 0xf4f4], /* Private Use */
- [0xf4f5, 0xf4f5], /* Private Use */
- [0xf4f6, 0xf4f6], /* Private Use */
- [0xf4f7, 0xf4f7], /* Private Use */
- [0xf4f8, 0xf4f8], /* Private Use */
- [0xf4f9, 0xf4f9], /* Private Use */
- [0xf4fa, 0xf4fa], /* Private Use */
- [0xf4fb, 0xf4fb], /* Private Use */
- [0xf4fc, 0xf4fc], /* Private Use */
- [0xf4fd, 0xf4fd], /* Private Use */
- [0xf4fe, 0xf4fe], /* Private Use */
- [0xf4ff, 0xf4ff], /* Private Use */
- [0xf500, 0xf500], /* Private Use */
- [0xf501, 0xf501], /* Private Use */
- [0xf502, 0xf502], /* Private Use */
- [0xf503, 0xf503], /* Private Use */
- [0xf504, 0xf504], /* Private Use */
- [0xf505, 0xf505], /* Private Use */
- [0xf506, 0xf506], /* Private Use */
- [0xf507, 0xf507], /* Private Use */
- [0xf508, 0xf508], /* Private Use */
- [0xf509, 0xf509], /* Private Use */
- [0xf50a, 0xf50a], /* Private Use */
- [0xf50b, 0xf50b], /* Private Use */
- [0xf50c, 0xf50c], /* Private Use */
- [0xf50d, 0xf50d], /* Private Use */
- [0xf50e, 0xf50e], /* Private Use */
- [0xf50f, 0xf50f], /* Private Use */
- [0xf510, 0xf510], /* Private Use */
- [0xf511, 0xf511], /* Private Use */
- [0xf512, 0xf512], /* Private Use */
- [0xf513, 0xf513], /* Private Use */
- [0xf514, 0xf514], /* Private Use */
- [0xf515, 0xf515], /* Private Use */
- [0xf516, 0xf516], /* Private Use */
- [0xf517, 0xf517], /* Private Use */
- [0xf518, 0xf518], /* Private Use */
- [0xf519, 0xf519], /* Private Use */
- [0xf51a, 0xf51a], /* Private Use */
- [0xf51b, 0xf51b], /* Private Use */
- [0xf51c, 0xf51c], /* Private Use */
- [0xf51d, 0xf51d], /* Private Use */
- [0xf51e, 0xf51e], /* Private Use */
- [0xf51f, 0xf51f], /* Private Use */
- [0xf520, 0xf520], /* Private Use */
- [0xf521, 0xf521], /* Private Use */
- [0xf522, 0xf522], /* Private Use */
- [0xf523, 0xf523], /* Private Use */
- [0xf524, 0xf524], /* Private Use */
- [0xf525, 0xf525], /* Private Use */
- [0xf526, 0xf526], /* Private Use */
- [0xf527, 0xf527], /* Private Use */
- [0xf528, 0xf528], /* Private Use */
- [0xf529, 0xf529], /* Private Use */
- [0xf52a, 0xf52a], /* Private Use */
- [0xf52b, 0xf52b], /* Private Use */
- [0xf52c, 0xf52c], /* Private Use */
- [0xf52d, 0xf52d], /* Private Use */
- [0xf52e, 0xf52e], /* Private Use */
- [0xf52f, 0xf52f], /* Private Use */
- [0xf530, 0xf530], /* Private Use */
- [0xf531, 0xf531], /* Private Use */
- [0xf532, 0xf532], /* Private Use */
- [0xf533, 0xf533], /* Private Use */
- [0xf534, 0xf534], /* Private Use */
- [0xf535, 0xf535], /* Private Use */
- [0xf536, 0xf536], /* Private Use */
- [0xf537, 0xf537], /* Private Use */
- [0xf538, 0xf538], /* Private Use */
- [0xf539, 0xf539], /* Private Use */
- [0xf53a, 0xf53a], /* Private Use */
- [0xf53b, 0xf53b], /* Private Use */
- [0xf53c, 0xf53c], /* Private Use */
- [0xf53d, 0xf53d], /* Private Use */
- [0xf53e, 0xf53e], /* Private Use */
- [0xf53f, 0xf53f], /* Private Use */
- [0xf540, 0xf540], /* Private Use */
- [0xf541, 0xf541], /* Private Use */
- [0xf542, 0xf542], /* Private Use */
- [0xf543, 0xf543], /* Private Use */
- [0xf544, 0xf544], /* Private Use */
- [0xf545, 0xf545], /* Private Use */
- [0xf546, 0xf546], /* Private Use */
- [0xf547, 0xf547], /* Private Use */
- [0xf548, 0xf548], /* Private Use */
- [0xf549, 0xf549], /* Private Use */
- [0xf54a, 0xf54a], /* Private Use */
- [0xf54b, 0xf54b], /* Private Use */
- [0xf54c, 0xf54c], /* Private Use */
- [0xf54d, 0xf54d], /* Private Use */
- [0xf54e, 0xf54e], /* Private Use */
- [0xf54f, 0xf54f], /* Private Use */
- [0xf550, 0xf550], /* Private Use */
- [0xf551, 0xf551], /* Private Use */
- [0xf552, 0xf552], /* Private Use */
- [0xf553, 0xf553], /* Private Use */
- [0xf554, 0xf554], /* Private Use */
- [0xf555, 0xf555], /* Private Use */
- [0xf556, 0xf556], /* Private Use */
- [0xf557, 0xf557], /* Private Use */
- [0xf558, 0xf558], /* Private Use */
- [0xf559, 0xf559], /* Private Use */
- [0xf55a, 0xf55a], /* Private Use */
- [0xf55b, 0xf55b], /* Private Use */
- [0xf55c, 0xf55c], /* Private Use */
- [0xf55d, 0xf55d], /* Private Use */
- [0xf55e, 0xf55e], /* Private Use */
- [0xf55f, 0xf55f], /* Private Use */
- [0xf560, 0xf560], /* Private Use */
- [0xf561, 0xf561], /* Private Use */
- [0xf562, 0xf562], /* Private Use */
- [0xf563, 0xf563], /* Private Use */
- [0xf564, 0xf564], /* Private Use */
- [0xf565, 0xf565], /* Private Use */
- [0xf566, 0xf566], /* Private Use */
- [0xf567, 0xf567], /* Private Use */
- [0xf568, 0xf568], /* Private Use */
- [0xf569, 0xf569], /* Private Use */
- [0xf56a, 0xf56a], /* Private Use */
- [0xf56b, 0xf56b], /* Private Use */
- [0xf56c, 0xf56c], /* Private Use */
- [0xf56d, 0xf56d], /* Private Use */
- [0xf56e, 0xf56e], /* Private Use */
- [0xf56f, 0xf56f], /* Private Use */
- [0xf570, 0xf570], /* Private Use */
- [0xf571, 0xf571], /* Private Use */
- [0xf572, 0xf572], /* Private Use */
- [0xf573, 0xf573], /* Private Use */
- [0xf574, 0xf574], /* Private Use */
- [0xf575, 0xf575], /* Private Use */
- [0xf576, 0xf576], /* Private Use */
- [0xf577, 0xf577], /* Private Use */
- [0xf578, 0xf578], /* Private Use */
- [0xf579, 0xf579], /* Private Use */
- [0xf57a, 0xf57a], /* Private Use */
- [0xf57b, 0xf57b], /* Private Use */
- [0xf57c, 0xf57c], /* Private Use */
- [0xf57d, 0xf57d], /* Private Use */
- [0xf57e, 0xf57e], /* Private Use */
- [0xf57f, 0xf57f], /* Private Use */
- [0xf580, 0xf580], /* Private Use */
- [0xf581, 0xf581], /* Private Use */
- [0xf582, 0xf582], /* Private Use */
- [0xf583, 0xf583], /* Private Use */
- [0xf584, 0xf584], /* Private Use */
- [0xf585, 0xf585], /* Private Use */
- [0xf586, 0xf586], /* Private Use */
- [0xf587, 0xf587], /* Private Use */
- [0xf588, 0xf588], /* Private Use */
- [0xf589, 0xf589], /* Private Use */
- [0xf58a, 0xf58a], /* Private Use */
- [0xf58b, 0xf58b], /* Private Use */
- [0xf58c, 0xf58c], /* Private Use */
- [0xf58d, 0xf58d], /* Private Use */
- [0xf58e, 0xf58e], /* Private Use */
- [0xf58f, 0xf58f], /* Private Use */
- [0xf590, 0xf590], /* Private Use */
- [0xf591, 0xf591], /* Private Use */
- [0xf592, 0xf592], /* Private Use */
- [0xf593, 0xf593], /* Private Use */
- [0xf594, 0xf594], /* Private Use */
- [0xf595, 0xf595], /* Private Use */
- [0xf596, 0xf596], /* Private Use */
- [0xf597, 0xf597], /* Private Use */
- [0xf598, 0xf598], /* Private Use */
- [0xf599, 0xf599], /* Private Use */
- [0xf59a, 0xf59a], /* Private Use */
- [0xf59b, 0xf59b], /* Private Use */
- [0xf59c, 0xf59c], /* Private Use */
- [0xf59d, 0xf59d], /* Private Use */
- [0xf59e, 0xf59e], /* Private Use */
- [0xf59f, 0xf59f], /* Private Use */
- [0xf5a0, 0xf5a0], /* Private Use */
- [0xf5a1, 0xf5a1], /* Private Use */
- [0xf5a2, 0xf5a2], /* Private Use */
- [0xf5a3, 0xf5a3], /* Private Use */
- [0xf5a4, 0xf5a4], /* Private Use */
- [0xf5a5, 0xf5a5], /* Private Use */
- [0xf5a6, 0xf5a6], /* Private Use */
- [0xf5a7, 0xf5a7], /* Private Use */
- [0xf5a8, 0xf5a8], /* Private Use */
- [0xf5a9, 0xf5a9], /* Private Use */
- [0xf5aa, 0xf5aa], /* Private Use */
- [0xf5ab, 0xf5ab], /* Private Use */
- [0xf5ac, 0xf5ac], /* Private Use */
- [0xf5ad, 0xf5ad], /* Private Use */
- [0xf5ae, 0xf5ae], /* Private Use */
- [0xf5af, 0xf5af], /* Private Use */
- [0xf5b0, 0xf5b0], /* Private Use */
- [0xf5b1, 0xf5b1], /* Private Use */
- [0xf5b2, 0xf5b2], /* Private Use */
- [0xf5b3, 0xf5b3], /* Private Use */
- [0xf5b4, 0xf5b4], /* Private Use */
- [0xf5b5, 0xf5b5], /* Private Use */
- [0xf5b6, 0xf5b6], /* Private Use */
- [0xf5b7, 0xf5b7], /* Private Use */
- [0xf5b8, 0xf5b8], /* Private Use */
- [0xf5b9, 0xf5b9], /* Private Use */
- [0xf5ba, 0xf5ba], /* Private Use */
- [0xf5bb, 0xf5bb], /* Private Use */
- [0xf5bc, 0xf5bc], /* Private Use */
- [0xf5bd, 0xf5bd], /* Private Use */
- [0xf5be, 0xf5be], /* Private Use */
- [0xf5bf, 0xf5bf], /* Private Use */
- [0xf5c0, 0xf5c0], /* Private Use */
- [0xf5c1, 0xf5c1], /* Private Use */
- [0xf5c2, 0xf5c2], /* Private Use */
- [0xf5c3, 0xf5c3], /* Private Use */
- [0xf5c4, 0xf5c4], /* Private Use */
- [0xf5c5, 0xf5c5], /* Private Use */
- [0xf5c6, 0xf5c6], /* Private Use */
- [0xf5c7, 0xf5c7], /* Private Use */
- [0xf5c8, 0xf5c8], /* Private Use */
- [0xf5c9, 0xf5c9], /* Private Use */
- [0xf5ca, 0xf5ca], /* Private Use */
- [0xf5cb, 0xf5cb], /* Private Use */
- [0xf5cc, 0xf5cc], /* Private Use */
- [0xf5cd, 0xf5cd], /* Private Use */
- [0xf5ce, 0xf5ce], /* Private Use */
- [0xf5cf, 0xf5cf], /* Private Use */
- [0xf5d0, 0xf5d0], /* Private Use */
- [0xf5d1, 0xf5d1], /* Private Use */
- [0xf5d2, 0xf5d2], /* Private Use */
- [0xf5d3, 0xf5d3], /* Private Use */
- [0xf5d4, 0xf5d4], /* Private Use */
- [0xf5d5, 0xf5d5], /* Private Use */
- [0xf5d6, 0xf5d6], /* Private Use */
- [0xf5d7, 0xf5d7], /* Private Use */
- [0xf5d8, 0xf5d8], /* Private Use */
- [0xf5d9, 0xf5d9], /* Private Use */
- [0xf5da, 0xf5da], /* Private Use */
- [0xf5db, 0xf5db], /* Private Use */
- [0xf5dc, 0xf5dc], /* Private Use */
- [0xf5dd, 0xf5dd], /* Private Use */
- [0xf5de, 0xf5de], /* Private Use */
- [0xf5df, 0xf5df], /* Private Use */
- [0xf5e0, 0xf5e0], /* Private Use */
- [0xf5e1, 0xf5e1], /* Private Use */
- [0xf5e2, 0xf5e2], /* Private Use */
- [0xf5e3, 0xf5e3], /* Private Use */
- [0xf5e4, 0xf5e4], /* Private Use */
- [0xf5e5, 0xf5e5], /* Private Use */
- [0xf5e6, 0xf5e6], /* Private Use */
- [0xf5e7, 0xf5e7], /* Private Use */
- [0xf5e8, 0xf5e8], /* Private Use */
- [0xf5e9, 0xf5e9], /* Private Use */
- [0xf5ea, 0xf5ea], /* Private Use */
- [0xf5eb, 0xf5eb], /* Private Use */
- [0xf5ec, 0xf5ec], /* Private Use */
- [0xf5ed, 0xf5ed], /* Private Use */
- [0xf5ee, 0xf5ee], /* Private Use */
- [0xf5ef, 0xf5ef], /* Private Use */
- [0xf5f0, 0xf5f0], /* Private Use */
- [0xf5f1, 0xf5f1], /* Private Use */
- [0xf5f2, 0xf5f2], /* Private Use */
- [0xf5f3, 0xf5f3], /* Private Use */
- [0xf5f4, 0xf5f4], /* Private Use */
- [0xf5f5, 0xf5f5], /* Private Use */
- [0xf5f6, 0xf5f6], /* Private Use */
- [0xf5f7, 0xf5f7], /* Private Use */
- [0xf5f8, 0xf5f8], /* Private Use */
- [0xf5f9, 0xf5f9], /* Private Use */
- [0xf5fa, 0xf5fa], /* Private Use */
- [0xf5fb, 0xf5fb], /* Private Use */
- [0xf5fc, 0xf5fc], /* Private Use */
- [0xf5fd, 0xf5fd], /* Private Use */
- [0xf5fe, 0xf5fe], /* Private Use */
- [0xf5ff, 0xf5ff], /* Private Use */
- [0xf600, 0xf600], /* Private Use */
- [0xf601, 0xf601], /* Private Use */
- [0xf602, 0xf602], /* Private Use */
- [0xf603, 0xf603], /* Private Use */
- [0xf604, 0xf604], /* Private Use */
- [0xf605, 0xf605], /* Private Use */
- [0xf606, 0xf606], /* Private Use */
- [0xf607, 0xf607], /* Private Use */
- [0xf608, 0xf608], /* Private Use */
- [0xf609, 0xf609], /* Private Use */
- [0xf60a, 0xf60a], /* Private Use */
- [0xf60b, 0xf60b], /* Private Use */
- [0xf60c, 0xf60c], /* Private Use */
- [0xf60d, 0xf60d], /* Private Use */
- [0xf60e, 0xf60e], /* Private Use */
- [0xf60f, 0xf60f], /* Private Use */
- [0xf610, 0xf610], /* Private Use */
- [0xf611, 0xf611], /* Private Use */
- [0xf612, 0xf612], /* Private Use */
- [0xf613, 0xf613], /* Private Use */
- [0xf614, 0xf614], /* Private Use */
- [0xf615, 0xf615], /* Private Use */
- [0xf616, 0xf616], /* Private Use */
- [0xf617, 0xf617], /* Private Use */
- [0xf618, 0xf618], /* Private Use */
- [0xf619, 0xf619], /* Private Use */
- [0xf61a, 0xf61a], /* Private Use */
- [0xf61b, 0xf61b], /* Private Use */
- [0xf61c, 0xf61c], /* Private Use */
- [0xf61d, 0xf61d], /* Private Use */
- [0xf61e, 0xf61e], /* Private Use */
- [0xf61f, 0xf61f], /* Private Use */
- [0xf620, 0xf620], /* Private Use */
- [0xf621, 0xf621], /* Private Use */
- [0xf622, 0xf622], /* Private Use */
- [0xf623, 0xf623], /* Private Use */
- [0xf624, 0xf624], /* Private Use */
- [0xf625, 0xf625], /* Private Use */
- [0xf626, 0xf626], /* Private Use */
- [0xf627, 0xf627], /* Private Use */
- [0xf628, 0xf628], /* Private Use */
- [0xf629, 0xf629], /* Private Use */
- [0xf62a, 0xf62a], /* Private Use */
- [0xf62b, 0xf62b], /* Private Use */
- [0xf62c, 0xf62c], /* Private Use */
- [0xf62d, 0xf62d], /* Private Use */
- [0xf62e, 0xf62e], /* Private Use */
- [0xf62f, 0xf62f], /* Private Use */
- [0xf630, 0xf630], /* Private Use */
- [0xf631, 0xf631], /* Private Use */
- [0xf632, 0xf632], /* Private Use */
- [0xf633, 0xf633], /* Private Use */
- [0xf634, 0xf634], /* Private Use */
- [0xf635, 0xf635], /* Private Use */
- [0xf636, 0xf636], /* Private Use */
- [0xf637, 0xf637], /* Private Use */
- [0xf638, 0xf638], /* Private Use */
- [0xf639, 0xf639], /* Private Use */
- [0xf63a, 0xf63a], /* Private Use */
- [0xf63b, 0xf63b], /* Private Use */
- [0xf63c, 0xf63c], /* Private Use */
- [0xf63d, 0xf63d], /* Private Use */
- [0xf63e, 0xf63e], /* Private Use */
- [0xf63f, 0xf63f], /* Private Use */
- [0xf640, 0xf640], /* Private Use */
- [0xf641, 0xf641], /* Private Use */
- [0xf642, 0xf642], /* Private Use */
- [0xf643, 0xf643], /* Private Use */
- [0xf644, 0xf644], /* Private Use */
- [0xf645, 0xf645], /* Private Use */
- [0xf646, 0xf646], /* Private Use */
- [0xf647, 0xf647], /* Private Use */
- [0xf648, 0xf648], /* Private Use */
- [0xf649, 0xf649], /* Private Use */
- [0xf64a, 0xf64a], /* Private Use */
- [0xf64b, 0xf64b], /* Private Use */
- [0xf64c, 0xf64c], /* Private Use */
- [0xf64d, 0xf64d], /* Private Use */
- [0xf64e, 0xf64e], /* Private Use */
- [0xf64f, 0xf64f], /* Private Use */
- [0xf650, 0xf650], /* Private Use */
- [0xf651, 0xf651], /* Private Use */
- [0xf652, 0xf652], /* Private Use */
- [0xf653, 0xf653], /* Private Use */
- [0xf654, 0xf654], /* Private Use */
- [0xf655, 0xf655], /* Private Use */
- [0xf656, 0xf656], /* Private Use */
- [0xf657, 0xf657], /* Private Use */
- [0xf658, 0xf658], /* Private Use */
- [0xf659, 0xf659], /* Private Use */
- [0xf65a, 0xf65a], /* Private Use */
- [0xf65b, 0xf65b], /* Private Use */
- [0xf65c, 0xf65c], /* Private Use */
- [0xf65d, 0xf65d], /* Private Use */
- [0xf65e, 0xf65e], /* Private Use */
- [0xf65f, 0xf65f], /* Private Use */
- [0xf660, 0xf660], /* Private Use */
- [0xf661, 0xf661], /* Private Use */
- [0xf662, 0xf662], /* Private Use */
- [0xf663, 0xf663], /* Private Use */
- [0xf664, 0xf664], /* Private Use */
- [0xf665, 0xf665], /* Private Use */
- [0xf666, 0xf666], /* Private Use */
- [0xf667, 0xf667], /* Private Use */
- [0xf668, 0xf668], /* Private Use */
- [0xf669, 0xf669], /* Private Use */
- [0xf66a, 0xf66a], /* Private Use */
- [0xf66b, 0xf66b], /* Private Use */
- [0xf66c, 0xf66c], /* Private Use */
- [0xf66d, 0xf66d], /* Private Use */
- [0xf66e, 0xf66e], /* Private Use */
- [0xf66f, 0xf66f], /* Private Use */
- [0xf670, 0xf670], /* Private Use */
- [0xf671, 0xf671], /* Private Use */
- [0xf672, 0xf672], /* Private Use */
- [0xf673, 0xf673], /* Private Use */
- [0xf674, 0xf674], /* Private Use */
- [0xf675, 0xf675], /* Private Use */
- [0xf676, 0xf676], /* Private Use */
- [0xf677, 0xf677], /* Private Use */
- [0xf678, 0xf678], /* Private Use */
- [0xf679, 0xf679], /* Private Use */
- [0xf67a, 0xf67a], /* Private Use */
- [0xf67b, 0xf67b], /* Private Use */
- [0xf67c, 0xf67c], /* Private Use */
- [0xf67d, 0xf67d], /* Private Use */
- [0xf67e, 0xf67e], /* Private Use */
- [0xf67f, 0xf67f], /* Private Use */
- [0xf680, 0xf680], /* Private Use */
- [0xf681, 0xf681], /* Private Use */
- [0xf682, 0xf682], /* Private Use */
- [0xf683, 0xf683], /* Private Use */
- [0xf684, 0xf684], /* Private Use */
- [0xf685, 0xf685], /* Private Use */
- [0xf686, 0xf686], /* Private Use */
- [0xf687, 0xf687], /* Private Use */
- [0xf688, 0xf688], /* Private Use */
- [0xf689, 0xf689], /* Private Use */
- [0xf68a, 0xf68a], /* Private Use */
- [0xf68b, 0xf68b], /* Private Use */
- [0xf68c, 0xf68c], /* Private Use */
- [0xf68d, 0xf68d], /* Private Use */
- [0xf68e, 0xf68e], /* Private Use */
- [0xf68f, 0xf68f], /* Private Use */
- [0xf690, 0xf690], /* Private Use */
- [0xf691, 0xf691], /* Private Use */
- [0xf692, 0xf692], /* Private Use */
- [0xf693, 0xf693], /* Private Use */
- [0xf694, 0xf694], /* Private Use */
- [0xf695, 0xf695], /* Private Use */
- [0xf696, 0xf696], /* Private Use */
- [0xf697, 0xf697], /* Private Use */
- [0xf698, 0xf698], /* Private Use */
- [0xf699, 0xf699], /* Private Use */
- [0xf69a, 0xf69a], /* Private Use */
- [0xf69b, 0xf69b], /* Private Use */
- [0xf69c, 0xf69c], /* Private Use */
- [0xf69d, 0xf69d], /* Private Use */
- [0xf69e, 0xf69e], /* Private Use */
- [0xf69f, 0xf69f], /* Private Use */
- [0xf6a0, 0xf6a0], /* Private Use */
- [0xf6a1, 0xf6a1], /* Private Use */
- [0xf6a2, 0xf6a2], /* Private Use */
- [0xf6a3, 0xf6a3], /* Private Use */
- [0xf6a4, 0xf6a4], /* Private Use */
- [0xf6a5, 0xf6a5], /* Private Use */
- [0xf6a6, 0xf6a6], /* Private Use */
- [0xf6a7, 0xf6a7], /* Private Use */
- [0xf6a8, 0xf6a8], /* Private Use */
- [0xf6a9, 0xf6a9], /* Private Use */
- [0xf6aa, 0xf6aa], /* Private Use */
- [0xf6ab, 0xf6ab], /* Private Use */
- [0xf6ac, 0xf6ac], /* Private Use */
- [0xf6ad, 0xf6ad], /* Private Use */
- [0xf6ae, 0xf6ae], /* Private Use */
- [0xf6af, 0xf6af], /* Private Use */
- [0xf6b0, 0xf6b0], /* Private Use */
- [0xf6b1, 0xf6b1], /* Private Use */
- [0xf6b2, 0xf6b2], /* Private Use */
- [0xf6b3, 0xf6b3], /* Private Use */
- [0xf6b4, 0xf6b4], /* Private Use */
- [0xf6b5, 0xf6b5], /* Private Use */
- [0xf6b6, 0xf6b6], /* Private Use */
- [0xf6b7, 0xf6b7], /* Private Use */
- [0xf6b8, 0xf6b8], /* Private Use */
- [0xf6b9, 0xf6b9], /* Private Use */
- [0xf6ba, 0xf6ba], /* Private Use */
- [0xf6bb, 0xf6bb], /* Private Use */
- [0xf6bc, 0xf6bc], /* Private Use */
- [0xf6bd, 0xf6bd], /* Private Use */
- [0xf6be, 0xf6be], /* Private Use */
- [0xf6bf, 0xf6bf], /* Private Use */
- [0xf6c0, 0xf6c0], /* Private Use */
- [0xf6c1, 0xf6c1], /* Private Use */
- [0xf6c2, 0xf6c2], /* Private Use */
- [0xf6c3, 0xf6c3], /* Private Use */
- [0xf6c4, 0xf6c4], /* Private Use */
- [0xf6c5, 0xf6c5], /* Private Use */
- [0xf6c6, 0xf6c6], /* Private Use */
- [0xf6c7, 0xf6c7], /* Private Use */
- [0xf6c8, 0xf6c8], /* Private Use */
- [0xf6c9, 0xf6c9], /* Private Use */
- [0xf6ca, 0xf6ca], /* Private Use */
- [0xf6cb, 0xf6cb], /* Private Use */
- [0xf6cc, 0xf6cc], /* Private Use */
- [0xf6cd, 0xf6cd], /* Private Use */
- [0xf6ce, 0xf6ce], /* Private Use */
- [0xf6cf, 0xf6cf], /* Private Use */
- [0xf6d0, 0xf6d0], /* Private Use */
- [0xf6d1, 0xf6d1], /* Private Use */
- [0xf6d2, 0xf6d2], /* Private Use */
- [0xf6d3, 0xf6d3], /* Private Use */
- [0xf6d4, 0xf6d4], /* Private Use */
- [0xf6d5, 0xf6d5], /* Private Use */
- [0xf6d6, 0xf6d6], /* Private Use */
- [0xf6d7, 0xf6d7], /* Private Use */
- [0xf6d8, 0xf6d8], /* Private Use */
- [0xf6d9, 0xf6d9], /* Private Use */
- [0xf6da, 0xf6da], /* Private Use */
- [0xf6db, 0xf6db], /* Private Use */
- [0xf6dc, 0xf6dc], /* Private Use */
- [0xf6dd, 0xf6dd], /* Private Use */
- [0xf6de, 0xf6de], /* Private Use */
- [0xf6df, 0xf6df], /* Private Use */
- [0xf6e0, 0xf6e0], /* Private Use */
- [0xf6e1, 0xf6e1], /* Private Use */
- [0xf6e2, 0xf6e2], /* Private Use */
- [0xf6e3, 0xf6e3], /* Private Use */
- [0xf6e4, 0xf6e4], /* Private Use */
- [0xf6e5, 0xf6e5], /* Private Use */
- [0xf6e6, 0xf6e6], /* Private Use */
- [0xf6e7, 0xf6e7], /* Private Use */
- [0xf6e8, 0xf6e8], /* Private Use */
- [0xf6e9, 0xf6e9], /* Private Use */
- [0xf6ea, 0xf6ea], /* Private Use */
- [0xf6eb, 0xf6eb], /* Private Use */
- [0xf6ec, 0xf6ec], /* Private Use */
- [0xf6ed, 0xf6ed], /* Private Use */
- [0xf6ee, 0xf6ee], /* Private Use */
- [0xf6ef, 0xf6ef], /* Private Use */
- [0xf6f0, 0xf6f0], /* Private Use */
- [0xf6f1, 0xf6f1], /* Private Use */
- [0xf6f2, 0xf6f2], /* Private Use */
- [0xf6f3, 0xf6f3], /* Private Use */
- [0xf6f4, 0xf6f4], /* Private Use */
- [0xf6f5, 0xf6f5], /* Private Use */
- [0xf6f6, 0xf6f6], /* Private Use */
- [0xf6f7, 0xf6f7], /* Private Use */
- [0xf6f8, 0xf6f8], /* Private Use */
- [0xf6f9, 0xf6f9], /* Private Use */
- [0xf6fa, 0xf6fa], /* Private Use */
- [0xf6fb, 0xf6fb], /* Private Use */
- [0xf6fc, 0xf6fc], /* Private Use */
- [0xf6fd, 0xf6fd], /* Private Use */
- [0xf6fe, 0xf6fe], /* Private Use */
- [0xf6ff, 0xf6ff], /* Private Use */
- [0xf700, 0xf700], /* Private Use */
- [0xf701, 0xf701], /* Private Use */
- [0xf702, 0xf702], /* Private Use */
- [0xf703, 0xf703], /* Private Use */
- [0xf704, 0xf704], /* Private Use */
- [0xf705, 0xf705], /* Private Use */
- [0xf706, 0xf706], /* Private Use */
- [0xf707, 0xf707], /* Private Use */
- [0xf708, 0xf708], /* Private Use */
- [0xf709, 0xf709], /* Private Use */
- [0xf70a, 0xf70a], /* Private Use */
- [0xf70b, 0xf70b], /* Private Use */
- [0xf70c, 0xf70c], /* Private Use */
- [0xf70d, 0xf70d], /* Private Use */
- [0xf70e, 0xf70e], /* Private Use */
- [0xf70f, 0xf70f], /* Private Use */
- [0xf710, 0xf710], /* Private Use */
- [0xf711, 0xf711], /* Private Use */
- [0xf712, 0xf712], /* Private Use */
- [0xf713, 0xf713], /* Private Use */
- [0xf714, 0xf714], /* Private Use */
- [0xf715, 0xf715], /* Private Use */
- [0xf716, 0xf716], /* Private Use */
- [0xf717, 0xf717], /* Private Use */
- [0xf718, 0xf718], /* Private Use */
- [0xf719, 0xf719], /* Private Use */
- [0xf71a, 0xf71a], /* Private Use */
- [0xf71b, 0xf71b], /* Private Use */
- [0xf71c, 0xf71c], /* Private Use */
- [0xf71d, 0xf71d], /* Private Use */
- [0xf71e, 0xf71e], /* Private Use */
- [0xf71f, 0xf71f], /* Private Use */
- [0xf720, 0xf720], /* Private Use */
- [0xf721, 0xf721], /* Private Use */
- [0xf722, 0xf722], /* Private Use */
- [0xf723, 0xf723], /* Private Use */
- [0xf724, 0xf724], /* Private Use */
- [0xf725, 0xf725], /* Private Use */
- [0xf726, 0xf726], /* Private Use */
- [0xf727, 0xf727], /* Private Use */
- [0xf728, 0xf728], /* Private Use */
- [0xf729, 0xf729], /* Private Use */
- [0xf72a, 0xf72a], /* Private Use */
- [0xf72b, 0xf72b], /* Private Use */
- [0xf72c, 0xf72c], /* Private Use */
- [0xf72d, 0xf72d], /* Private Use */
- [0xf72e, 0xf72e], /* Private Use */
- [0xf72f, 0xf72f], /* Private Use */
- [0xf730, 0xf730], /* Private Use */
- [0xf731, 0xf731], /* Private Use */
- [0xf732, 0xf732], /* Private Use */
- [0xf733, 0xf733], /* Private Use */
- [0xf734, 0xf734], /* Private Use */
- [0xf735, 0xf735], /* Private Use */
- [0xf736, 0xf736], /* Private Use */
- [0xf737, 0xf737], /* Private Use */
- [0xf738, 0xf738], /* Private Use */
- [0xf739, 0xf739], /* Private Use */
- [0xf73a, 0xf73a], /* Private Use */
- [0xf73b, 0xf73b], /* Private Use */
- [0xf73c, 0xf73c], /* Private Use */
- [0xf73d, 0xf73d], /* Private Use */
- [0xf73e, 0xf73e], /* Private Use */
- [0xf73f, 0xf73f], /* Private Use */
- [0xf740, 0xf740], /* Private Use */
- [0xf741, 0xf741], /* Private Use */
- [0xf742, 0xf742], /* Private Use */
- [0xf743, 0xf743], /* Private Use */
- [0xf744, 0xf744], /* Private Use */
- [0xf745, 0xf745], /* Private Use */
- [0xf746, 0xf746], /* Private Use */
- [0xf747, 0xf747], /* Private Use */
- [0xf748, 0xf748], /* Private Use */
- [0xf749, 0xf749], /* Private Use */
- [0xf74a, 0xf74a], /* Private Use */
- [0xf74b, 0xf74b], /* Private Use */
- [0xf74c, 0xf74c], /* Private Use */
- [0xf74d, 0xf74d], /* Private Use */
- [0xf74e, 0xf74e], /* Private Use */
- [0xf74f, 0xf74f], /* Private Use */
- [0xf750, 0xf750], /* Private Use */
- [0xf751, 0xf751], /* Private Use */
- [0xf752, 0xf752], /* Private Use */
- [0xf753, 0xf753], /* Private Use */
- [0xf754, 0xf754], /* Private Use */
- [0xf755, 0xf755], /* Private Use */
- [0xf756, 0xf756], /* Private Use */
- [0xf757, 0xf757], /* Private Use */
- [0xf758, 0xf758], /* Private Use */
- [0xf759, 0xf759], /* Private Use */
- [0xf75a, 0xf75a], /* Private Use */
- [0xf75b, 0xf75b], /* Private Use */
- [0xf75c, 0xf75c], /* Private Use */
- [0xf75d, 0xf75d], /* Private Use */
- [0xf75e, 0xf75e], /* Private Use */
- [0xf75f, 0xf75f], /* Private Use */
- [0xf760, 0xf760], /* Private Use */
- [0xf761, 0xf761], /* Private Use */
- [0xf762, 0xf762], /* Private Use */
- [0xf763, 0xf763], /* Private Use */
- [0xf764, 0xf764], /* Private Use */
- [0xf765, 0xf765], /* Private Use */
- [0xf766, 0xf766], /* Private Use */
- [0xf767, 0xf767], /* Private Use */
- [0xf768, 0xf768], /* Private Use */
- [0xf769, 0xf769], /* Private Use */
- [0xf76a, 0xf76a], /* Private Use */
- [0xf76b, 0xf76b], /* Private Use */
- [0xf76c, 0xf76c], /* Private Use */
- [0xf76d, 0xf76d], /* Private Use */
- [0xf76e, 0xf76e], /* Private Use */
- [0xf76f, 0xf76f], /* Private Use */
- [0xf770, 0xf770], /* Private Use */
- [0xf771, 0xf771], /* Private Use */
- [0xf772, 0xf772], /* Private Use */
- [0xf773, 0xf773], /* Private Use */
- [0xf774, 0xf774], /* Private Use */
- [0xf775, 0xf775], /* Private Use */
- [0xf776, 0xf776], /* Private Use */
- [0xf777, 0xf777], /* Private Use */
- [0xf778, 0xf778], /* Private Use */
- [0xf779, 0xf779], /* Private Use */
- [0xf77a, 0xf77a], /* Private Use */
- [0xf77b, 0xf77b], /* Private Use */
- [0xf77c, 0xf77c], /* Private Use */
- [0xf77d, 0xf77d], /* Private Use */
- [0xf77e, 0xf77e], /* Private Use */
- [0xf77f, 0xf77f], /* Private Use */
- [0xf780, 0xf780], /* Private Use */
- [0xf781, 0xf781], /* Private Use */
- [0xf782, 0xf782], /* Private Use */
- [0xf783, 0xf783], /* Private Use */
- [0xf784, 0xf784], /* Private Use */
- [0xf785, 0xf785], /* Private Use */
- [0xf786, 0xf786], /* Private Use */
- [0xf787, 0xf787], /* Private Use */
- [0xf788, 0xf788], /* Private Use */
- [0xf789, 0xf789], /* Private Use */
- [0xf78a, 0xf78a], /* Private Use */
- [0xf78b, 0xf78b], /* Private Use */
- [0xf78c, 0xf78c], /* Private Use */
- [0xf78d, 0xf78d], /* Private Use */
- [0xf78e, 0xf78e], /* Private Use */
- [0xf78f, 0xf78f], /* Private Use */
- [0xf790, 0xf790], /* Private Use */
- [0xf791, 0xf791], /* Private Use */
- [0xf792, 0xf792], /* Private Use */
- [0xf793, 0xf793], /* Private Use */
- [0xf794, 0xf794], /* Private Use */
- [0xf795, 0xf795], /* Private Use */
- [0xf796, 0xf796], /* Private Use */
- [0xf797, 0xf797], /* Private Use */
- [0xf798, 0xf798], /* Private Use */
- [0xf799, 0xf799], /* Private Use */
- [0xf79a, 0xf79a], /* Private Use */
- [0xf79b, 0xf79b], /* Private Use */
- [0xf79c, 0xf79c], /* Private Use */
- [0xf79d, 0xf79d], /* Private Use */
- [0xf79e, 0xf79e], /* Private Use */
- [0xf79f, 0xf79f], /* Private Use */
- [0xf7a0, 0xf7a0], /* Private Use */
- [0xf7a1, 0xf7a1], /* Private Use */
- [0xf7a2, 0xf7a2], /* Private Use */
- [0xf7a3, 0xf7a3], /* Private Use */
- [0xf7a4, 0xf7a4], /* Private Use */
- [0xf7a5, 0xf7a5], /* Private Use */
- [0xf7a6, 0xf7a6], /* Private Use */
- [0xf7a7, 0xf7a7], /* Private Use */
- [0xf7a8, 0xf7a8], /* Private Use */
- [0xf7a9, 0xf7a9], /* Private Use */
- [0xf7aa, 0xf7aa], /* Private Use */
- [0xf7ab, 0xf7ab], /* Private Use */
- [0xf7ac, 0xf7ac], /* Private Use */
- [0xf7ad, 0xf7ad], /* Private Use */
- [0xf7ae, 0xf7ae], /* Private Use */
- [0xf7af, 0xf7af], /* Private Use */
- [0xf7b0, 0xf7b0], /* Private Use */
- [0xf7b1, 0xf7b1], /* Private Use */
- [0xf7b2, 0xf7b2], /* Private Use */
- [0xf7b3, 0xf7b3], /* Private Use */
- [0xf7b4, 0xf7b4], /* Private Use */
- [0xf7b5, 0xf7b5], /* Private Use */
- [0xf7b6, 0xf7b6], /* Private Use */
- [0xf7b7, 0xf7b7], /* Private Use */
- [0xf7b8, 0xf7b8], /* Private Use */
- [0xf7b9, 0xf7b9], /* Private Use */
- [0xf7ba, 0xf7ba], /* Private Use */
- [0xf7bb, 0xf7bb], /* Private Use */
- [0xf7bc, 0xf7bc], /* Private Use */
- [0xf7bd, 0xf7bd], /* Private Use */
- [0xf7be, 0xf7be], /* Private Use */
- [0xf7bf, 0xf7bf], /* Private Use */
- [0xf7c0, 0xf7c0], /* Private Use */
- [0xf7c1, 0xf7c1], /* Private Use */
- [0xf7c2, 0xf7c2], /* Private Use */
- [0xf7c3, 0xf7c3], /* Private Use */
- [0xf7c4, 0xf7c4], /* Private Use */
- [0xf7c5, 0xf7c5], /* Private Use */
- [0xf7c6, 0xf7c6], /* Private Use */
- [0xf7c7, 0xf7c7], /* Private Use */
- [0xf7c8, 0xf7c8], /* Private Use */
- [0xf7c9, 0xf7c9], /* Private Use */
- [0xf7ca, 0xf7ca], /* Private Use */
- [0xf7cb, 0xf7cb], /* Private Use */
- [0xf7cc, 0xf7cc], /* Private Use */
- [0xf7cd, 0xf7cd], /* Private Use */
- [0xf7ce, 0xf7ce], /* Private Use */
- [0xf7cf, 0xf7cf], /* Private Use */
- [0xf7d0, 0xf7d0], /* Private Use */
- [0xf7d1, 0xf7d1], /* Private Use */
- [0xf7d2, 0xf7d2], /* Private Use */
- [0xf7d3, 0xf7d3], /* Private Use */
- [0xf7d4, 0xf7d4], /* Private Use */
- [0xf7d5, 0xf7d5], /* Private Use */
- [0xf7d6, 0xf7d6], /* Private Use */
- [0xf7d7, 0xf7d7], /* Private Use */
- [0xf7d8, 0xf7d8], /* Private Use */
- [0xf7d9, 0xf7d9], /* Private Use */
- [0xf7da, 0xf7da], /* Private Use */
- [0xf7db, 0xf7db], /* Private Use */
- [0xf7dc, 0xf7dc], /* Private Use */
- [0xf7dd, 0xf7dd], /* Private Use */
- [0xf7de, 0xf7de], /* Private Use */
- [0xf7df, 0xf7df], /* Private Use */
- [0xf7e0, 0xf7e0], /* Private Use */
- [0xf7e1, 0xf7e1], /* Private Use */
- [0xf7e2, 0xf7e2], /* Private Use */
- [0xf7e3, 0xf7e3], /* Private Use */
- [0xf7e4, 0xf7e4], /* Private Use */
- [0xf7e5, 0xf7e5], /* Private Use */
- [0xf7e6, 0xf7e6], /* Private Use */
- [0xf7e7, 0xf7e7], /* Private Use */
- [0xf7e8, 0xf7e8], /* Private Use */
- [0xf7e9, 0xf7e9], /* Private Use */
- [0xf7ea, 0xf7ea], /* Private Use */
- [0xf7eb, 0xf7eb], /* Private Use */
- [0xf7ec, 0xf7ec], /* Private Use */
- [0xf7ed, 0xf7ed], /* Private Use */
- [0xf7ee, 0xf7ee], /* Private Use */
- [0xf7ef, 0xf7ef], /* Private Use */
- [0xf7f0, 0xf7f0], /* Private Use */
- [0xf7f1, 0xf7f1], /* Private Use */
- [0xf7f2, 0xf7f2], /* Private Use */
- [0xf7f3, 0xf7f3], /* Private Use */
- [0xf7f4, 0xf7f4], /* Private Use */
- [0xf7f5, 0xf7f5], /* Private Use */
- [0xf7f6, 0xf7f6], /* Private Use */
- [0xf7f7, 0xf7f7], /* Private Use */
- [0xf7f8, 0xf7f8], /* Private Use */
- [0xf7f9, 0xf7f9], /* Private Use */
- [0xf7fa, 0xf7fa], /* Private Use */
- [0xf7fb, 0xf7fb], /* Private Use */
- [0xf7fc, 0xf7fc], /* Private Use */
- [0xf7fd, 0xf7fd], /* Private Use */
- [0xf7fe, 0xf7fe], /* Private Use */
- [0xf7ff, 0xf7ff], /* Private Use */
- [0xf800, 0xf800], /* Private Use */
- [0xf801, 0xf801], /* Private Use */
- [0xf802, 0xf802], /* Private Use */
- [0xf803, 0xf803], /* Private Use */
- [0xf804, 0xf804], /* Private Use */
- [0xf805, 0xf805], /* Private Use */
- [0xf806, 0xf806], /* Private Use */
- [0xf807, 0xf807], /* Private Use */
- [0xf808, 0xf808], /* Private Use */
- [0xf809, 0xf809], /* Private Use */
- [0xf80a, 0xf80a], /* Private Use */
- [0xf80b, 0xf80b], /* Private Use */
- [0xf80c, 0xf80c], /* Private Use */
- [0xf80d, 0xf80d], /* Private Use */
- [0xf80e, 0xf80e], /* Private Use */
- [0xf80f, 0xf80f], /* Private Use */
- [0xf810, 0xf810], /* Private Use */
- [0xf811, 0xf811], /* Private Use */
- [0xf812, 0xf812], /* Private Use */
- [0xf813, 0xf813], /* Private Use */
- [0xf814, 0xf814], /* Private Use */
- [0xf815, 0xf815], /* Private Use */
- [0xf816, 0xf816], /* Private Use */
- [0xf817, 0xf817], /* Private Use */
- [0xf818, 0xf818], /* Private Use */
- [0xf819, 0xf819], /* Private Use */
- [0xf81a, 0xf81a], /* Private Use */
- [0xf81b, 0xf81b], /* Private Use */
- [0xf81c, 0xf81c], /* Private Use */
- [0xf81d, 0xf81d], /* Private Use */
- [0xf81e, 0xf81e], /* Private Use */
- [0xf81f, 0xf81f], /* Private Use */
- [0xf820, 0xf820], /* Private Use */
- [0xf821, 0xf821], /* Private Use */
- [0xf822, 0xf822], /* Private Use */
- [0xf823, 0xf823], /* Private Use */
- [0xf824, 0xf824], /* Private Use */
- [0xf825, 0xf825], /* Private Use */
- [0xf826, 0xf826], /* Private Use */
- [0xf827, 0xf827], /* Private Use */
- [0xf828, 0xf828], /* Private Use */
- [0xf829, 0xf829], /* Private Use */
- [0xf82a, 0xf82a], /* Private Use */
- [0xf82b, 0xf82b], /* Private Use */
- [0xf82c, 0xf82c], /* Private Use */
- [0xf82d, 0xf82d], /* Private Use */
- [0xf82e, 0xf82e], /* Private Use */
- [0xf82f, 0xf82f], /* Private Use */
- [0xf830, 0xf830], /* Private Use */
- [0xf831, 0xf831], /* Private Use */
- [0xf832, 0xf832], /* Private Use */
- [0xf833, 0xf833], /* Private Use */
- [0xf834, 0xf834], /* Private Use */
- [0xf835, 0xf835], /* Private Use */
- [0xf836, 0xf836], /* Private Use */
- [0xf837, 0xf837], /* Private Use */
- [0xf838, 0xf838], /* Private Use */
- [0xf839, 0xf839], /* Private Use */
- [0xf83a, 0xf83a], /* Private Use */
- [0xf83b, 0xf83b], /* Private Use */
- [0xf83c, 0xf83c], /* Private Use */
- [0xf83d, 0xf83d], /* Private Use */
- [0xf83e, 0xf83e], /* Private Use */
- [0xf83f, 0xf83f], /* Private Use */
- [0xf840, 0xf840], /* Private Use */
- [0xf841, 0xf841], /* Private Use */
- [0xf842, 0xf842], /* Private Use */
- [0xf843, 0xf843], /* Private Use */
- [0xf844, 0xf844], /* Private Use */
- [0xf845, 0xf845], /* Private Use */
- [0xf846, 0xf846], /* Private Use */
- [0xf847, 0xf847], /* Private Use */
- [0xf848, 0xf848], /* Private Use */
- [0xf849, 0xf849], /* Private Use */
- [0xf84a, 0xf84a], /* Private Use */
- [0xf84b, 0xf84b], /* Private Use */
- [0xf84c, 0xf84c], /* Private Use */
- [0xf84d, 0xf84d], /* Private Use */
- [0xf84e, 0xf84e], /* Private Use */
- [0xf84f, 0xf84f], /* Private Use */
- [0xf850, 0xf850], /* Private Use */
- [0xf851, 0xf851], /* Private Use */
- [0xf852, 0xf852], /* Private Use */
- [0xf853, 0xf853], /* Private Use */
- [0xf854, 0xf854], /* Private Use */
- [0xf855, 0xf855], /* Private Use */
- [0xf856, 0xf856], /* Private Use */
- [0xf857, 0xf857], /* Private Use */
- [0xf858, 0xf858], /* Private Use */
- [0xf859, 0xf859], /* Private Use */
- [0xf85a, 0xf85a], /* Private Use */
- [0xf85b, 0xf85b], /* Private Use */
- [0xf85c, 0xf85c], /* Private Use */
- [0xf85d, 0xf85d], /* Private Use */
- [0xf85e, 0xf85e], /* Private Use */
- [0xf85f, 0xf85f], /* Private Use */
- [0xf860, 0xf860], /* Private Use */
- [0xf861, 0xf861], /* Private Use */
- [0xf862, 0xf862], /* Private Use */
- [0xf863, 0xf863], /* Private Use */
- [0xf864, 0xf864], /* Private Use */
- [0xf865, 0xf865], /* Private Use */
- [0xf866, 0xf866], /* Private Use */
- [0xf867, 0xf867], /* Private Use */
- [0xf868, 0xf868], /* Private Use */
- [0xf869, 0xf869], /* Private Use */
- [0xf86a, 0xf86a], /* Private Use */
- [0xf86b, 0xf86b], /* Private Use */
- [0xf86c, 0xf86c], /* Private Use */
- [0xf86d, 0xf86d], /* Private Use */
- [0xf86e, 0xf86e], /* Private Use */
- [0xf86f, 0xf86f], /* Private Use */
- [0xf870, 0xf870], /* Private Use */
- [0xf871, 0xf871], /* Private Use */
- [0xf872, 0xf872], /* Private Use */
- [0xf873, 0xf873], /* Private Use */
- [0xf874, 0xf874], /* Private Use */
- [0xf875, 0xf875], /* Private Use */
- [0xf876, 0xf876], /* Private Use */
- [0xf877, 0xf877], /* Private Use */
- [0xf878, 0xf878], /* Private Use */
- [0xf879, 0xf879], /* Private Use */
- [0xf87a, 0xf87a], /* Private Use */
- [0xf87b, 0xf87b], /* Private Use */
- [0xf87c, 0xf87c], /* Private Use */
- [0xf87d, 0xf87d], /* Private Use */
- [0xf87e, 0xf87e], /* Private Use */
- [0xf87f, 0xf87f], /* Private Use */
- [0xf880, 0xf880], /* Private Use */
- [0xf881, 0xf881], /* Private Use */
- [0xf882, 0xf882], /* Private Use */
- [0xf883, 0xf883], /* Private Use */
- [0xf884, 0xf884], /* Private Use */
- [0xf885, 0xf885], /* Private Use */
- [0xf886, 0xf886], /* Private Use */
- [0xf887, 0xf887], /* Private Use */
- [0xf888, 0xf888], /* Private Use */
- [0xf889, 0xf889], /* Private Use */
- [0xf88a, 0xf88a], /* Private Use */
- [0xf88b, 0xf88b], /* Private Use */
- [0xf88c, 0xf88c], /* Private Use */
- [0xf88d, 0xf88d], /* Private Use */
- [0xf88e, 0xf88e], /* Private Use */
- [0xf88f, 0xf88f], /* Private Use */
- [0xf890, 0xf890], /* Private Use */
- [0xf891, 0xf891], /* Private Use */
- [0xf892, 0xf892], /* Private Use */
- [0xf893, 0xf893], /* Private Use */
- [0xf894, 0xf894], /* Private Use */
- [0xf895, 0xf895], /* Private Use */
- [0xf896, 0xf896], /* Private Use */
- [0xf897, 0xf897], /* Private Use */
- [0xf898, 0xf898], /* Private Use */
- [0xf899, 0xf899], /* Private Use */
- [0xf89a, 0xf89a], /* Private Use */
- [0xf89b, 0xf89b], /* Private Use */
- [0xf89c, 0xf89c], /* Private Use */
- [0xf89d, 0xf89d], /* Private Use */
- [0xf89e, 0xf89e], /* Private Use */
- [0xf89f, 0xf89f], /* Private Use */
- [0xf8a0, 0xf8a0], /* Private Use */
- [0xf8a1, 0xf8a1], /* Private Use */
- [0xf8a2, 0xf8a2], /* Private Use */
- [0xf8a3, 0xf8a3], /* Private Use */
- [0xf8a4, 0xf8a4], /* Private Use */
- [0xf8a5, 0xf8a5], /* Private Use */
- [0xf8a6, 0xf8a6], /* Private Use */
- [0xf8a7, 0xf8a7], /* Private Use */
- [0xf8a8, 0xf8a8], /* Private Use */
- [0xf8a9, 0xf8a9], /* Private Use */
- [0xf8aa, 0xf8aa], /* Private Use */
- [0xf8ab, 0xf8ab], /* Private Use */
- [0xf8ac, 0xf8ac], /* Private Use */
- [0xf8ad, 0xf8ad], /* Private Use */
- [0xf8ae, 0xf8ae], /* Private Use */
- [0xf8af, 0xf8af], /* Private Use */
- [0xf8b0, 0xf8b0], /* Private Use */
- [0xf8b1, 0xf8b1], /* Private Use */
- [0xf8b2, 0xf8b2], /* Private Use */
- [0xf8b3, 0xf8b3], /* Private Use */
- [0xf8b4, 0xf8b4], /* Private Use */
- [0xf8b5, 0xf8b5], /* Private Use */
- [0xf8b6, 0xf8b6], /* Private Use */
- [0xf8b7, 0xf8b7], /* Private Use */
- [0xf8b8, 0xf8b8], /* Private Use */
- [0xf8b9, 0xf8b9], /* Private Use */
- [0xf8ba, 0xf8ba], /* Private Use */
- [0xf8bb, 0xf8bb], /* Private Use */
- [0xf8bc, 0xf8bc], /* Private Use */
- [0xf8bd, 0xf8bd], /* Private Use */
- [0xf8be, 0xf8be], /* Private Use */
- [0xf8bf, 0xf8bf], /* Private Use */
- [0xf8c0, 0xf8c0], /* Private Use */
- [0xf8c1, 0xf8c1], /* Private Use */
- [0xf8c2, 0xf8c2], /* Private Use */
- [0xf8c3, 0xf8c3], /* Private Use */
- [0xf8c4, 0xf8c4], /* Private Use */
- [0xf8c5, 0xf8c5], /* Private Use */
- [0xf8c6, 0xf8c6], /* Private Use */
- [0xf8c7, 0xf8c7], /* Private Use */
- [0xf8c8, 0xf8c8], /* Private Use */
- [0xf8c9, 0xf8c9], /* Private Use */
- [0xf8ca, 0xf8ca], /* Private Use */
- [0xf8cb, 0xf8cb], /* Private Use */
- [0xf8cc, 0xf8cc], /* Private Use */
- [0xf8cd, 0xf8cd], /* Private Use */
- [0xf8ce, 0xf8ce], /* Private Use */
- [0xf8cf, 0xf8cf], /* Private Use */
- [0xf8d0, 0xf8d0], /* Private Use */
- [0xf8d1, 0xf8d1], /* Private Use */
- [0xf8d2, 0xf8d2], /* Private Use */
- [0xf8d3, 0xf8d3], /* Private Use */
- [0xf8d4, 0xf8d4], /* Private Use */
- [0xf8d5, 0xf8d5], /* Private Use */
- [0xf8d6, 0xf8d6], /* Private Use */
- [0xf8d7, 0xf8d7], /* Private Use */
- [0xf8d8, 0xf8d8], /* Private Use */
- [0xf8d9, 0xf8d9], /* Private Use */
- [0xf8da, 0xf8da], /* Private Use */
- [0xf8db, 0xf8db], /* Private Use */
- [0xf8dc, 0xf8dc], /* Private Use */
- [0xf8dd, 0xf8dd], /* Private Use */
- [0xf8de, 0xf8de], /* Private Use */
- [0xf8df, 0xf8df], /* Private Use */
- [0xf8e0, 0xf8e0], /* Private Use */
- [0xf8e1, 0xf8e1], /* Private Use */
- [0xf8e2, 0xf8e2], /* Private Use */
- [0xf8e3, 0xf8e3], /* Private Use */
- [0xf8e4, 0xf8e4], /* Private Use */
- [0xf8e5, 0xf8e5], /* Private Use */
- [0xf8e6, 0xf8e6], /* Private Use */
- [0xf8e7, 0xf8e7], /* Private Use */
- [0xf8e8, 0xf8e8], /* Private Use */
- [0xf8e9, 0xf8e9], /* Private Use */
- [0xf8ea, 0xf8ea], /* Private Use */
- [0xf8eb, 0xf8eb], /* Private Use */
- [0xf8ec, 0xf8ec], /* Private Use */
- [0xf8ed, 0xf8ed], /* Private Use */
- [0xf8ee, 0xf8ee], /* Private Use */
- [0xf8ef, 0xf8ef], /* Private Use */
- [0xf8f0, 0xf8f0], /* Private Use */
- [0xf8f1, 0xf8f1], /* Private Use */
- [0xf8f2, 0xf8f2], /* Private Use */
- [0xf8f3, 0xf8f3], /* Private Use */
- [0xf8f4, 0xf8f4], /* Private Use */
- [0xf8f5, 0xf8f5], /* Private Use */
- [0xf8f6, 0xf8f6], /* Private Use */
- [0xf8f7, 0xf8f7], /* Private Use */
- [0xf8f8, 0xf8f8], /* Private Use */
- [0xf8f9, 0xf8f9], /* Private Use */
- [0xf8fa, 0xf8fa], /* Private Use */
- [0xf8fb, 0xf8fb], /* Private Use */
- [0xf8fc, 0xf8fc], /* Private Use */
- [0xf8fd, 0xf8fd], /* Private Use */
- [0xf8fe, 0xf8fe], /* Private Use */
- [0xf8ff, 0xf8ff], /* Private Use */
- [0xf900, 0xf900], /* CJK COMPATIBILITY IDEOGRAPH-F900 */
- [0xf901, 0xf901], /* CJK COMPATIBILITY IDEOGRAPH-F901 */
- [0xf902, 0xf902], /* CJK COMPATIBILITY IDEOGRAPH-F902 */
- [0xf903, 0xf903], /* CJK COMPATIBILITY IDEOGRAPH-F903 */
- [0xf904, 0xf904], /* CJK COMPATIBILITY IDEOGRAPH-F904 */
- [0xf905, 0xf905], /* CJK COMPATIBILITY IDEOGRAPH-F905 */
- [0xf906, 0xf906], /* CJK COMPATIBILITY IDEOGRAPH-F906 */
- [0xf907, 0xf907], /* CJK COMPATIBILITY IDEOGRAPH-F907 */
- [0xf908, 0xf908], /* CJK COMPATIBILITY IDEOGRAPH-F908 */
- [0xf909, 0xf909], /* CJK COMPATIBILITY IDEOGRAPH-F909 */
- [0xf90a, 0xf90a], /* CJK COMPATIBILITY IDEOGRAPH-F90A */
- [0xf90b, 0xf90b], /* CJK COMPATIBILITY IDEOGRAPH-F90B */
- [0xf90c, 0xf90c], /* CJK COMPATIBILITY IDEOGRAPH-F90C */
- [0xf90d, 0xf90d], /* CJK COMPATIBILITY IDEOGRAPH-F90D */
- [0xf90e, 0xf90e], /* CJK COMPATIBILITY IDEOGRAPH-F90E */
- [0xf90f, 0xf90f], /* CJK COMPATIBILITY IDEOGRAPH-F90F */
- [0xf910, 0xf910], /* CJK COMPATIBILITY IDEOGRAPH-F910 */
- [0xf911, 0xf911], /* CJK COMPATIBILITY IDEOGRAPH-F911 */
- [0xf912, 0xf912], /* CJK COMPATIBILITY IDEOGRAPH-F912 */
- [0xf913, 0xf913], /* CJK COMPATIBILITY IDEOGRAPH-F913 */
- [0xf914, 0xf914], /* CJK COMPATIBILITY IDEOGRAPH-F914 */
- [0xf915, 0xf915], /* CJK COMPATIBILITY IDEOGRAPH-F915 */
- [0xf916, 0xf916], /* CJK COMPATIBILITY IDEOGRAPH-F916 */
- [0xf917, 0xf917], /* CJK COMPATIBILITY IDEOGRAPH-F917 */
- [0xf918, 0xf918], /* CJK COMPATIBILITY IDEOGRAPH-F918 */
- [0xf919, 0xf919], /* CJK COMPATIBILITY IDEOGRAPH-F919 */
- [0xf91a, 0xf91a], /* CJK COMPATIBILITY IDEOGRAPH-F91A */
- [0xf91b, 0xf91b], /* CJK COMPATIBILITY IDEOGRAPH-F91B */
- [0xf91c, 0xf91c], /* CJK COMPATIBILITY IDEOGRAPH-F91C */
- [0xf91d, 0xf91d], /* CJK COMPATIBILITY IDEOGRAPH-F91D */
- [0xf91e, 0xf91e], /* CJK COMPATIBILITY IDEOGRAPH-F91E */
- [0xf91f, 0xf91f], /* CJK COMPATIBILITY IDEOGRAPH-F91F */
- [0xf920, 0xf920], /* CJK COMPATIBILITY IDEOGRAPH-F920 */
- [0xf921, 0xf921], /* CJK COMPATIBILITY IDEOGRAPH-F921 */
- [0xf922, 0xf922], /* CJK COMPATIBILITY IDEOGRAPH-F922 */
- [0xf923, 0xf923], /* CJK COMPATIBILITY IDEOGRAPH-F923 */
- [0xf924, 0xf924], /* CJK COMPATIBILITY IDEOGRAPH-F924 */
- [0xf925, 0xf925], /* CJK COMPATIBILITY IDEOGRAPH-F925 */
- [0xf926, 0xf926], /* CJK COMPATIBILITY IDEOGRAPH-F926 */
- [0xf927, 0xf927], /* CJK COMPATIBILITY IDEOGRAPH-F927 */
- [0xf928, 0xf928], /* CJK COMPATIBILITY IDEOGRAPH-F928 */
- [0xf929, 0xf929], /* CJK COMPATIBILITY IDEOGRAPH-F929 */
- [0xf92a, 0xf92a], /* CJK COMPATIBILITY IDEOGRAPH-F92A */
- [0xf92b, 0xf92b], /* CJK COMPATIBILITY IDEOGRAPH-F92B */
- [0xf92c, 0xf92c], /* CJK COMPATIBILITY IDEOGRAPH-F92C */
- [0xf92d, 0xf92d], /* CJK COMPATIBILITY IDEOGRAPH-F92D */
- [0xf92e, 0xf92e], /* CJK COMPATIBILITY IDEOGRAPH-F92E */
- [0xf92f, 0xf92f], /* CJK COMPATIBILITY IDEOGRAPH-F92F */
- [0xf930, 0xf930], /* CJK COMPATIBILITY IDEOGRAPH-F930 */
- [0xf931, 0xf931], /* CJK COMPATIBILITY IDEOGRAPH-F931 */
- [0xf932, 0xf932], /* CJK COMPATIBILITY IDEOGRAPH-F932 */
- [0xf933, 0xf933], /* CJK COMPATIBILITY IDEOGRAPH-F933 */
- [0xf934, 0xf934], /* CJK COMPATIBILITY IDEOGRAPH-F934 */
- [0xf935, 0xf935], /* CJK COMPATIBILITY IDEOGRAPH-F935 */
- [0xf936, 0xf936], /* CJK COMPATIBILITY IDEOGRAPH-F936 */
- [0xf937, 0xf937], /* CJK COMPATIBILITY IDEOGRAPH-F937 */
- [0xf938, 0xf938], /* CJK COMPATIBILITY IDEOGRAPH-F938 */
- [0xf939, 0xf939], /* CJK COMPATIBILITY IDEOGRAPH-F939 */
- [0xf93a, 0xf93a], /* CJK COMPATIBILITY IDEOGRAPH-F93A */
- [0xf93b, 0xf93b], /* CJK COMPATIBILITY IDEOGRAPH-F93B */
- [0xf93c, 0xf93c], /* CJK COMPATIBILITY IDEOGRAPH-F93C */
- [0xf93d, 0xf93d], /* CJK COMPATIBILITY IDEOGRAPH-F93D */
- [0xf93e, 0xf93e], /* CJK COMPATIBILITY IDEOGRAPH-F93E */
- [0xf93f, 0xf93f], /* CJK COMPATIBILITY IDEOGRAPH-F93F */
- [0xf940, 0xf940], /* CJK COMPATIBILITY IDEOGRAPH-F940 */
- [0xf941, 0xf941], /* CJK COMPATIBILITY IDEOGRAPH-F941 */
- [0xf942, 0xf942], /* CJK COMPATIBILITY IDEOGRAPH-F942 */
- [0xf943, 0xf943], /* CJK COMPATIBILITY IDEOGRAPH-F943 */
- [0xf944, 0xf944], /* CJK COMPATIBILITY IDEOGRAPH-F944 */
- [0xf945, 0xf945], /* CJK COMPATIBILITY IDEOGRAPH-F945 */
- [0xf946, 0xf946], /* CJK COMPATIBILITY IDEOGRAPH-F946 */
- [0xf947, 0xf947], /* CJK COMPATIBILITY IDEOGRAPH-F947 */
- [0xf948, 0xf948], /* CJK COMPATIBILITY IDEOGRAPH-F948 */
- [0xf949, 0xf949], /* CJK COMPATIBILITY IDEOGRAPH-F949 */
- [0xf94a, 0xf94a], /* CJK COMPATIBILITY IDEOGRAPH-F94A */
- [0xf94b, 0xf94b], /* CJK COMPATIBILITY IDEOGRAPH-F94B */
- [0xf94c, 0xf94c], /* CJK COMPATIBILITY IDEOGRAPH-F94C */
- [0xf94d, 0xf94d], /* CJK COMPATIBILITY IDEOGRAPH-F94D */
- [0xf94e, 0xf94e], /* CJK COMPATIBILITY IDEOGRAPH-F94E */
- [0xf94f, 0xf94f], /* CJK COMPATIBILITY IDEOGRAPH-F94F */
- [0xf950, 0xf950], /* CJK COMPATIBILITY IDEOGRAPH-F950 */
- [0xf951, 0xf951], /* CJK COMPATIBILITY IDEOGRAPH-F951 */
- [0xf952, 0xf952], /* CJK COMPATIBILITY IDEOGRAPH-F952 */
- [0xf953, 0xf953], /* CJK COMPATIBILITY IDEOGRAPH-F953 */
- [0xf954, 0xf954], /* CJK COMPATIBILITY IDEOGRAPH-F954 */
- [0xf955, 0xf955], /* CJK COMPATIBILITY IDEOGRAPH-F955 */
- [0xf956, 0xf956], /* CJK COMPATIBILITY IDEOGRAPH-F956 */
- [0xf957, 0xf957], /* CJK COMPATIBILITY IDEOGRAPH-F957 */
- [0xf958, 0xf958], /* CJK COMPATIBILITY IDEOGRAPH-F958 */
- [0xf959, 0xf959], /* CJK COMPATIBILITY IDEOGRAPH-F959 */
- [0xf95a, 0xf95a], /* CJK COMPATIBILITY IDEOGRAPH-F95A */
- [0xf95b, 0xf95b], /* CJK COMPATIBILITY IDEOGRAPH-F95B */
- [0xf95c, 0xf95c], /* CJK COMPATIBILITY IDEOGRAPH-F95C */
- [0xf95d, 0xf95d], /* CJK COMPATIBILITY IDEOGRAPH-F95D */
- [0xf95e, 0xf95e], /* CJK COMPATIBILITY IDEOGRAPH-F95E */
- [0xf95f, 0xf95f], /* CJK COMPATIBILITY IDEOGRAPH-F95F */
- [0xf960, 0xf960], /* CJK COMPATIBILITY IDEOGRAPH-F960 */
- [0xf961, 0xf961], /* CJK COMPATIBILITY IDEOGRAPH-F961 */
- [0xf962, 0xf962], /* CJK COMPATIBILITY IDEOGRAPH-F962 */
- [0xf963, 0xf963], /* CJK COMPATIBILITY IDEOGRAPH-F963 */
- [0xf964, 0xf964], /* CJK COMPATIBILITY IDEOGRAPH-F964 */
- [0xf965, 0xf965], /* CJK COMPATIBILITY IDEOGRAPH-F965 */
- [0xf966, 0xf966], /* CJK COMPATIBILITY IDEOGRAPH-F966 */
- [0xf967, 0xf967], /* CJK COMPATIBILITY IDEOGRAPH-F967 */
- [0xf968, 0xf968], /* CJK COMPATIBILITY IDEOGRAPH-F968 */
- [0xf969, 0xf969], /* CJK COMPATIBILITY IDEOGRAPH-F969 */
- [0xf96a, 0xf96a], /* CJK COMPATIBILITY IDEOGRAPH-F96A */
- [0xf96b, 0xf96b], /* CJK COMPATIBILITY IDEOGRAPH-F96B */
- [0xf96c, 0xf96c], /* CJK COMPATIBILITY IDEOGRAPH-F96C */
- [0xf96d, 0xf96d], /* CJK COMPATIBILITY IDEOGRAPH-F96D */
- [0xf96e, 0xf96e], /* CJK COMPATIBILITY IDEOGRAPH-F96E */
- [0xf96f, 0xf96f], /* CJK COMPATIBILITY IDEOGRAPH-F96F */
- [0xf970, 0xf970], /* CJK COMPATIBILITY IDEOGRAPH-F970 */
- [0xf971, 0xf971], /* CJK COMPATIBILITY IDEOGRAPH-F971 */
- [0xf972, 0xf972], /* CJK COMPATIBILITY IDEOGRAPH-F972 */
- [0xf973, 0xf973], /* CJK COMPATIBILITY IDEOGRAPH-F973 */
- [0xf974, 0xf974], /* CJK COMPATIBILITY IDEOGRAPH-F974 */
- [0xf975, 0xf975], /* CJK COMPATIBILITY IDEOGRAPH-F975 */
- [0xf976, 0xf976], /* CJK COMPATIBILITY IDEOGRAPH-F976 */
- [0xf977, 0xf977], /* CJK COMPATIBILITY IDEOGRAPH-F977 */
- [0xf978, 0xf978], /* CJK COMPATIBILITY IDEOGRAPH-F978 */
- [0xf979, 0xf979], /* CJK COMPATIBILITY IDEOGRAPH-F979 */
- [0xf97a, 0xf97a], /* CJK COMPATIBILITY IDEOGRAPH-F97A */
- [0xf97b, 0xf97b], /* CJK COMPATIBILITY IDEOGRAPH-F97B */
- [0xf97c, 0xf97c], /* CJK COMPATIBILITY IDEOGRAPH-F97C */
- [0xf97d, 0xf97d], /* CJK COMPATIBILITY IDEOGRAPH-F97D */
- [0xf97e, 0xf97e], /* CJK COMPATIBILITY IDEOGRAPH-F97E */
- [0xf97f, 0xf97f], /* CJK COMPATIBILITY IDEOGRAPH-F97F */
- [0xf980, 0xf980], /* CJK COMPATIBILITY IDEOGRAPH-F980 */
- [0xf981, 0xf981], /* CJK COMPATIBILITY IDEOGRAPH-F981 */
- [0xf982, 0xf982], /* CJK COMPATIBILITY IDEOGRAPH-F982 */
- [0xf983, 0xf983], /* CJK COMPATIBILITY IDEOGRAPH-F983 */
- [0xf984, 0xf984], /* CJK COMPATIBILITY IDEOGRAPH-F984 */
- [0xf985, 0xf985], /* CJK COMPATIBILITY IDEOGRAPH-F985 */
- [0xf986, 0xf986], /* CJK COMPATIBILITY IDEOGRAPH-F986 */
- [0xf987, 0xf987], /* CJK COMPATIBILITY IDEOGRAPH-F987 */
- [0xf988, 0xf988], /* CJK COMPATIBILITY IDEOGRAPH-F988 */
- [0xf989, 0xf989], /* CJK COMPATIBILITY IDEOGRAPH-F989 */
- [0xf98a, 0xf98a], /* CJK COMPATIBILITY IDEOGRAPH-F98A */
- [0xf98b, 0xf98b], /* CJK COMPATIBILITY IDEOGRAPH-F98B */
- [0xf98c, 0xf98c], /* CJK COMPATIBILITY IDEOGRAPH-F98C */
- [0xf98d, 0xf98d], /* CJK COMPATIBILITY IDEOGRAPH-F98D */
- [0xf98e, 0xf98e], /* CJK COMPATIBILITY IDEOGRAPH-F98E */
- [0xf98f, 0xf98f], /* CJK COMPATIBILITY IDEOGRAPH-F98F */
- [0xf990, 0xf990], /* CJK COMPATIBILITY IDEOGRAPH-F990 */
- [0xf991, 0xf991], /* CJK COMPATIBILITY IDEOGRAPH-F991 */
- [0xf992, 0xf992], /* CJK COMPATIBILITY IDEOGRAPH-F992 */
- [0xf993, 0xf993], /* CJK COMPATIBILITY IDEOGRAPH-F993 */
- [0xf994, 0xf994], /* CJK COMPATIBILITY IDEOGRAPH-F994 */
- [0xf995, 0xf995], /* CJK COMPATIBILITY IDEOGRAPH-F995 */
- [0xf996, 0xf996], /* CJK COMPATIBILITY IDEOGRAPH-F996 */
- [0xf997, 0xf997], /* CJK COMPATIBILITY IDEOGRAPH-F997 */
- [0xf998, 0xf998], /* CJK COMPATIBILITY IDEOGRAPH-F998 */
- [0xf999, 0xf999], /* CJK COMPATIBILITY IDEOGRAPH-F999 */
- [0xf99a, 0xf99a], /* CJK COMPATIBILITY IDEOGRAPH-F99A */
- [0xf99b, 0xf99b], /* CJK COMPATIBILITY IDEOGRAPH-F99B */
- [0xf99c, 0xf99c], /* CJK COMPATIBILITY IDEOGRAPH-F99C */
- [0xf99d, 0xf99d], /* CJK COMPATIBILITY IDEOGRAPH-F99D */
- [0xf99e, 0xf99e], /* CJK COMPATIBILITY IDEOGRAPH-F99E */
- [0xf99f, 0xf99f], /* CJK COMPATIBILITY IDEOGRAPH-F99F */
- [0xf9a0, 0xf9a0], /* CJK COMPATIBILITY IDEOGRAPH-F9A0 */
- [0xf9a1, 0xf9a1], /* CJK COMPATIBILITY IDEOGRAPH-F9A1 */
- [0xf9a2, 0xf9a2], /* CJK COMPATIBILITY IDEOGRAPH-F9A2 */
- [0xf9a3, 0xf9a3], /* CJK COMPATIBILITY IDEOGRAPH-F9A3 */
- [0xf9a4, 0xf9a4], /* CJK COMPATIBILITY IDEOGRAPH-F9A4 */
- [0xf9a5, 0xf9a5], /* CJK COMPATIBILITY IDEOGRAPH-F9A5 */
- [0xf9a6, 0xf9a6], /* CJK COMPATIBILITY IDEOGRAPH-F9A6 */
- [0xf9a7, 0xf9a7], /* CJK COMPATIBILITY IDEOGRAPH-F9A7 */
- [0xf9a8, 0xf9a8], /* CJK COMPATIBILITY IDEOGRAPH-F9A8 */
- [0xf9a9, 0xf9a9], /* CJK COMPATIBILITY IDEOGRAPH-F9A9 */
- [0xf9aa, 0xf9aa], /* CJK COMPATIBILITY IDEOGRAPH-F9AA */
- [0xf9ab, 0xf9ab], /* CJK COMPATIBILITY IDEOGRAPH-F9AB */
- [0xf9ac, 0xf9ac], /* CJK COMPATIBILITY IDEOGRAPH-F9AC */
- [0xf9ad, 0xf9ad], /* CJK COMPATIBILITY IDEOGRAPH-F9AD */
- [0xf9ae, 0xf9ae], /* CJK COMPATIBILITY IDEOGRAPH-F9AE */
- [0xf9af, 0xf9af], /* CJK COMPATIBILITY IDEOGRAPH-F9AF */
- [0xf9b0, 0xf9b0], /* CJK COMPATIBILITY IDEOGRAPH-F9B0 */
- [0xf9b1, 0xf9b1], /* CJK COMPATIBILITY IDEOGRAPH-F9B1 */
- [0xf9b2, 0xf9b2], /* CJK COMPATIBILITY IDEOGRAPH-F9B2 */
- [0xf9b3, 0xf9b3], /* CJK COMPATIBILITY IDEOGRAPH-F9B3 */
- [0xf9b4, 0xf9b4], /* CJK COMPATIBILITY IDEOGRAPH-F9B4 */
- [0xf9b5, 0xf9b5], /* CJK COMPATIBILITY IDEOGRAPH-F9B5 */
- [0xf9b6, 0xf9b6], /* CJK COMPATIBILITY IDEOGRAPH-F9B6 */
- [0xf9b7, 0xf9b7], /* CJK COMPATIBILITY IDEOGRAPH-F9B7 */
- [0xf9b8, 0xf9b8], /* CJK COMPATIBILITY IDEOGRAPH-F9B8 */
- [0xf9b9, 0xf9b9], /* CJK COMPATIBILITY IDEOGRAPH-F9B9 */
- [0xf9ba, 0xf9ba], /* CJK COMPATIBILITY IDEOGRAPH-F9BA */
- [0xf9bb, 0xf9bb], /* CJK COMPATIBILITY IDEOGRAPH-F9BB */
- [0xf9bc, 0xf9bc], /* CJK COMPATIBILITY IDEOGRAPH-F9BC */
- [0xf9bd, 0xf9bd], /* CJK COMPATIBILITY IDEOGRAPH-F9BD */
- [0xf9be, 0xf9be], /* CJK COMPATIBILITY IDEOGRAPH-F9BE */
- [0xf9bf, 0xf9bf], /* CJK COMPATIBILITY IDEOGRAPH-F9BF */
- [0xf9c0, 0xf9c0], /* CJK COMPATIBILITY IDEOGRAPH-F9C0 */
- [0xf9c1, 0xf9c1], /* CJK COMPATIBILITY IDEOGRAPH-F9C1 */
- [0xf9c2, 0xf9c2], /* CJK COMPATIBILITY IDEOGRAPH-F9C2 */
- [0xf9c3, 0xf9c3], /* CJK COMPATIBILITY IDEOGRAPH-F9C3 */
- [0xf9c4, 0xf9c4], /* CJK COMPATIBILITY IDEOGRAPH-F9C4 */
- [0xf9c5, 0xf9c5], /* CJK COMPATIBILITY IDEOGRAPH-F9C5 */
- [0xf9c6, 0xf9c6], /* CJK COMPATIBILITY IDEOGRAPH-F9C6 */
- [0xf9c7, 0xf9c7], /* CJK COMPATIBILITY IDEOGRAPH-F9C7 */
- [0xf9c8, 0xf9c8], /* CJK COMPATIBILITY IDEOGRAPH-F9C8 */
- [0xf9c9, 0xf9c9], /* CJK COMPATIBILITY IDEOGRAPH-F9C9 */
- [0xf9ca, 0xf9ca], /* CJK COMPATIBILITY IDEOGRAPH-F9CA */
- [0xf9cb, 0xf9cb], /* CJK COMPATIBILITY IDEOGRAPH-F9CB */
- [0xf9cc, 0xf9cc], /* CJK COMPATIBILITY IDEOGRAPH-F9CC */
- [0xf9cd, 0xf9cd], /* CJK COMPATIBILITY IDEOGRAPH-F9CD */
- [0xf9ce, 0xf9ce], /* CJK COMPATIBILITY IDEOGRAPH-F9CE */
- [0xf9cf, 0xf9cf], /* CJK COMPATIBILITY IDEOGRAPH-F9CF */
- [0xf9d0, 0xf9d0], /* CJK COMPATIBILITY IDEOGRAPH-F9D0 */
- [0xf9d1, 0xf9d1], /* CJK COMPATIBILITY IDEOGRAPH-F9D1 */
- [0xf9d2, 0xf9d2], /* CJK COMPATIBILITY IDEOGRAPH-F9D2 */
- [0xf9d3, 0xf9d3], /* CJK COMPATIBILITY IDEOGRAPH-F9D3 */
- [0xf9d4, 0xf9d4], /* CJK COMPATIBILITY IDEOGRAPH-F9D4 */
- [0xf9d5, 0xf9d5], /* CJK COMPATIBILITY IDEOGRAPH-F9D5 */
- [0xf9d6, 0xf9d6], /* CJK COMPATIBILITY IDEOGRAPH-F9D6 */
- [0xf9d7, 0xf9d7], /* CJK COMPATIBILITY IDEOGRAPH-F9D7 */
- [0xf9d8, 0xf9d8], /* CJK COMPATIBILITY IDEOGRAPH-F9D8 */
- [0xf9d9, 0xf9d9], /* CJK COMPATIBILITY IDEOGRAPH-F9D9 */
- [0xf9da, 0xf9da], /* CJK COMPATIBILITY IDEOGRAPH-F9DA */
- [0xf9db, 0xf9db], /* CJK COMPATIBILITY IDEOGRAPH-F9DB */
- [0xf9dc, 0xf9dc], /* CJK COMPATIBILITY IDEOGRAPH-F9DC */
- [0xf9dd, 0xf9dd], /* CJK COMPATIBILITY IDEOGRAPH-F9DD */
- [0xf9de, 0xf9de], /* CJK COMPATIBILITY IDEOGRAPH-F9DE */
- [0xf9df, 0xf9df], /* CJK COMPATIBILITY IDEOGRAPH-F9DF */
- [0xf9e0, 0xf9e0], /* CJK COMPATIBILITY IDEOGRAPH-F9E0 */
- [0xf9e1, 0xf9e1], /* CJK COMPATIBILITY IDEOGRAPH-F9E1 */
- [0xf9e2, 0xf9e2], /* CJK COMPATIBILITY IDEOGRAPH-F9E2 */
- [0xf9e3, 0xf9e3], /* CJK COMPATIBILITY IDEOGRAPH-F9E3 */
- [0xf9e4, 0xf9e4], /* CJK COMPATIBILITY IDEOGRAPH-F9E4 */
- [0xf9e5, 0xf9e5], /* CJK COMPATIBILITY IDEOGRAPH-F9E5 */
- [0xf9e6, 0xf9e6], /* CJK COMPATIBILITY IDEOGRAPH-F9E6 */
- [0xf9e7, 0xf9e7], /* CJK COMPATIBILITY IDEOGRAPH-F9E7 */
- [0xf9e8, 0xf9e8], /* CJK COMPATIBILITY IDEOGRAPH-F9E8 */
- [0xf9e9, 0xf9e9], /* CJK COMPATIBILITY IDEOGRAPH-F9E9 */
- [0xf9ea, 0xf9ea], /* CJK COMPATIBILITY IDEOGRAPH-F9EA */
- [0xf9eb, 0xf9eb], /* CJK COMPATIBILITY IDEOGRAPH-F9EB */
- [0xf9ec, 0xf9ec], /* CJK COMPATIBILITY IDEOGRAPH-F9EC */
- [0xf9ed, 0xf9ed], /* CJK COMPATIBILITY IDEOGRAPH-F9ED */
- [0xf9ee, 0xf9ee], /* CJK COMPATIBILITY IDEOGRAPH-F9EE */
- [0xf9ef, 0xf9ef], /* CJK COMPATIBILITY IDEOGRAPH-F9EF */
- [0xf9f0, 0xf9f0], /* CJK COMPATIBILITY IDEOGRAPH-F9F0 */
- [0xf9f1, 0xf9f1], /* CJK COMPATIBILITY IDEOGRAPH-F9F1 */
- [0xf9f2, 0xf9f2], /* CJK COMPATIBILITY IDEOGRAPH-F9F2 */
- [0xf9f3, 0xf9f3], /* CJK COMPATIBILITY IDEOGRAPH-F9F3 */
- [0xf9f4, 0xf9f4], /* CJK COMPATIBILITY IDEOGRAPH-F9F4 */
- [0xf9f5, 0xf9f5], /* CJK COMPATIBILITY IDEOGRAPH-F9F5 */
- [0xf9f6, 0xf9f6], /* CJK COMPATIBILITY IDEOGRAPH-F9F6 */
- [0xf9f7, 0xf9f7], /* CJK COMPATIBILITY IDEOGRAPH-F9F7 */
- [0xf9f8, 0xf9f8], /* CJK COMPATIBILITY IDEOGRAPH-F9F8 */
- [0xf9f9, 0xf9f9], /* CJK COMPATIBILITY IDEOGRAPH-F9F9 */
- [0xf9fa, 0xf9fa], /* CJK COMPATIBILITY IDEOGRAPH-F9FA */
- [0xf9fb, 0xf9fb], /* CJK COMPATIBILITY IDEOGRAPH-F9FB */
- [0xf9fc, 0xf9fc], /* CJK COMPATIBILITY IDEOGRAPH-F9FC */
- [0xf9fd, 0xf9fd], /* CJK COMPATIBILITY IDEOGRAPH-F9FD */
- [0xf9fe, 0xf9fe], /* CJK COMPATIBILITY IDEOGRAPH-F9FE */
- [0xf9ff, 0xf9ff], /* CJK COMPATIBILITY IDEOGRAPH-F9FF */
- [0xfa00, 0xfa00], /* CJK COMPATIBILITY IDEOGRAPH-FA00 */
- [0xfa01, 0xfa01], /* CJK COMPATIBILITY IDEOGRAPH-FA01 */
- [0xfa02, 0xfa02], /* CJK COMPATIBILITY IDEOGRAPH-FA02 */
- [0xfa03, 0xfa03], /* CJK COMPATIBILITY IDEOGRAPH-FA03 */
- [0xfa04, 0xfa04], /* CJK COMPATIBILITY IDEOGRAPH-FA04 */
- [0xfa05, 0xfa05], /* CJK COMPATIBILITY IDEOGRAPH-FA05 */
- [0xfa06, 0xfa06], /* CJK COMPATIBILITY IDEOGRAPH-FA06 */
- [0xfa07, 0xfa07], /* CJK COMPATIBILITY IDEOGRAPH-FA07 */
- [0xfa08, 0xfa08], /* CJK COMPATIBILITY IDEOGRAPH-FA08 */
- [0xfa09, 0xfa09], /* CJK COMPATIBILITY IDEOGRAPH-FA09 */
- [0xfa0a, 0xfa0a], /* CJK COMPATIBILITY IDEOGRAPH-FA0A */
- [0xfa0b, 0xfa0b], /* CJK COMPATIBILITY IDEOGRAPH-FA0B */
- [0xfa0c, 0xfa0c], /* CJK COMPATIBILITY IDEOGRAPH-FA0C */
- [0xfa0d, 0xfa0d], /* CJK COMPATIBILITY IDEOGRAPH-FA0D */
- [0xfa0e, 0xfa0e], /* CJK COMPATIBILITY IDEOGRAPH-FA0E */
- [0xfa0f, 0xfa0f], /* CJK COMPATIBILITY IDEOGRAPH-FA0F */
- [0xfa10, 0xfa10], /* CJK COMPATIBILITY IDEOGRAPH-FA10 */
- [0xfa11, 0xfa11], /* CJK COMPATIBILITY IDEOGRAPH-FA11 */
- [0xfa12, 0xfa12], /* CJK COMPATIBILITY IDEOGRAPH-FA12 */
- [0xfa13, 0xfa13], /* CJK COMPATIBILITY IDEOGRAPH-FA13 */
- [0xfa14, 0xfa14], /* CJK COMPATIBILITY IDEOGRAPH-FA14 */
- [0xfa15, 0xfa15], /* CJK COMPATIBILITY IDEOGRAPH-FA15 */
- [0xfa16, 0xfa16], /* CJK COMPATIBILITY IDEOGRAPH-FA16 */
- [0xfa17, 0xfa17], /* CJK COMPATIBILITY IDEOGRAPH-FA17 */
- [0xfa18, 0xfa18], /* CJK COMPATIBILITY IDEOGRAPH-FA18 */
- [0xfa19, 0xfa19], /* CJK COMPATIBILITY IDEOGRAPH-FA19 */
- [0xfa1a, 0xfa1a], /* CJK COMPATIBILITY IDEOGRAPH-FA1A */
- [0xfa1b, 0xfa1b], /* CJK COMPATIBILITY IDEOGRAPH-FA1B */
- [0xfa1c, 0xfa1c], /* CJK COMPATIBILITY IDEOGRAPH-FA1C */
- [0xfa1d, 0xfa1d], /* CJK COMPATIBILITY IDEOGRAPH-FA1D */
- [0xfa1e, 0xfa1e], /* CJK COMPATIBILITY IDEOGRAPH-FA1E */
- [0xfa1f, 0xfa1f], /* CJK COMPATIBILITY IDEOGRAPH-FA1F */
- [0xfa20, 0xfa20], /* CJK COMPATIBILITY IDEOGRAPH-FA20 */
- [0xfa21, 0xfa21], /* CJK COMPATIBILITY IDEOGRAPH-FA21 */
- [0xfa22, 0xfa22], /* CJK COMPATIBILITY IDEOGRAPH-FA22 */
- [0xfa23, 0xfa23], /* CJK COMPATIBILITY IDEOGRAPH-FA23 */
- [0xfa24, 0xfa24], /* CJK COMPATIBILITY IDEOGRAPH-FA24 */
- [0xfa25, 0xfa25], /* CJK COMPATIBILITY IDEOGRAPH-FA25 */
- [0xfa26, 0xfa26], /* CJK COMPATIBILITY IDEOGRAPH-FA26 */
- [0xfa27, 0xfa27], /* CJK COMPATIBILITY IDEOGRAPH-FA27 */
- [0xfa28, 0xfa28], /* CJK COMPATIBILITY IDEOGRAPH-FA28 */
- [0xfa29, 0xfa29], /* CJK COMPATIBILITY IDEOGRAPH-FA29 */
- [0xfa2a, 0xfa2a], /* CJK COMPATIBILITY IDEOGRAPH-FA2A */
- [0xfa2b, 0xfa2b], /* CJK COMPATIBILITY IDEOGRAPH-FA2B */
- [0xfa2c, 0xfa2c], /* CJK COMPATIBILITY IDEOGRAPH-FA2C */
- [0xfa2d, 0xfa2d], /* CJK COMPATIBILITY IDEOGRAPH-FA2D */
- [0xfa2e, 0xfa2e], /* CJK COMPATIBILITY IDEOGRAPH-FA2E */
- [0xfa2f, 0xfa2f], /* CJK COMPATIBILITY IDEOGRAPH-FA2F */
- [0xfa30, 0xfa30], /* CJK COMPATIBILITY IDEOGRAPH-FA30 */
- [0xfa31, 0xfa31], /* CJK COMPATIBILITY IDEOGRAPH-FA31 */
- [0xfa32, 0xfa32], /* CJK COMPATIBILITY IDEOGRAPH-FA32 */
- [0xfa33, 0xfa33], /* CJK COMPATIBILITY IDEOGRAPH-FA33 */
- [0xfa34, 0xfa34], /* CJK COMPATIBILITY IDEOGRAPH-FA34 */
- [0xfa35, 0xfa35], /* CJK COMPATIBILITY IDEOGRAPH-FA35 */
- [0xfa36, 0xfa36], /* CJK COMPATIBILITY IDEOGRAPH-FA36 */
- [0xfa37, 0xfa37], /* CJK COMPATIBILITY IDEOGRAPH-FA37 */
- [0xfa38, 0xfa38], /* CJK COMPATIBILITY IDEOGRAPH-FA38 */
- [0xfa39, 0xfa39], /* CJK COMPATIBILITY IDEOGRAPH-FA39 */
- [0xfa3a, 0xfa3a], /* CJK COMPATIBILITY IDEOGRAPH-FA3A */
- [0xfa3b, 0xfa3b], /* CJK COMPATIBILITY IDEOGRAPH-FA3B */
- [0xfa3c, 0xfa3c], /* CJK COMPATIBILITY IDEOGRAPH-FA3C */
- [0xfa3d, 0xfa3d], /* CJK COMPATIBILITY IDEOGRAPH-FA3D */
- [0xfa3e, 0xfa3e], /* CJK COMPATIBILITY IDEOGRAPH-FA3E */
- [0xfa3f, 0xfa3f], /* CJK COMPATIBILITY IDEOGRAPH-FA3F */
- [0xfa40, 0xfa40], /* CJK COMPATIBILITY IDEOGRAPH-FA40 */
- [0xfa41, 0xfa41], /* CJK COMPATIBILITY IDEOGRAPH-FA41 */
- [0xfa42, 0xfa42], /* CJK COMPATIBILITY IDEOGRAPH-FA42 */
- [0xfa43, 0xfa43], /* CJK COMPATIBILITY IDEOGRAPH-FA43 */
- [0xfa44, 0xfa44], /* CJK COMPATIBILITY IDEOGRAPH-FA44 */
- [0xfa45, 0xfa45], /* CJK COMPATIBILITY IDEOGRAPH-FA45 */
- [0xfa46, 0xfa46], /* CJK COMPATIBILITY IDEOGRAPH-FA46 */
- [0xfa47, 0xfa47], /* CJK COMPATIBILITY IDEOGRAPH-FA47 */
- [0xfa48, 0xfa48], /* CJK COMPATIBILITY IDEOGRAPH-FA48 */
- [0xfa49, 0xfa49], /* CJK COMPATIBILITY IDEOGRAPH-FA49 */
- [0xfa4a, 0xfa4a], /* CJK COMPATIBILITY IDEOGRAPH-FA4A */
- [0xfa4b, 0xfa4b], /* CJK COMPATIBILITY IDEOGRAPH-FA4B */
- [0xfa4c, 0xfa4c], /* CJK COMPATIBILITY IDEOGRAPH-FA4C */
- [0xfa4d, 0xfa4d], /* CJK COMPATIBILITY IDEOGRAPH-FA4D */
- [0xfa4e, 0xfa4e], /* CJK COMPATIBILITY IDEOGRAPH-FA4E */
- [0xfa4f, 0xfa4f], /* CJK COMPATIBILITY IDEOGRAPH-FA4F */
- [0xfa50, 0xfa50], /* CJK COMPATIBILITY IDEOGRAPH-FA50 */
- [0xfa51, 0xfa51], /* CJK COMPATIBILITY IDEOGRAPH-FA51 */
- [0xfa52, 0xfa52], /* CJK COMPATIBILITY IDEOGRAPH-FA52 */
- [0xfa53, 0xfa53], /* CJK COMPATIBILITY IDEOGRAPH-FA53 */
- [0xfa54, 0xfa54], /* CJK COMPATIBILITY IDEOGRAPH-FA54 */
- [0xfa55, 0xfa55], /* CJK COMPATIBILITY IDEOGRAPH-FA55 */
- [0xfa56, 0xfa56], /* CJK COMPATIBILITY IDEOGRAPH-FA56 */
- [0xfa57, 0xfa57], /* CJK COMPATIBILITY IDEOGRAPH-FA57 */
- [0xfa58, 0xfa58], /* CJK COMPATIBILITY IDEOGRAPH-FA58 */
- [0xfa59, 0xfa59], /* CJK COMPATIBILITY IDEOGRAPH-FA59 */
- [0xfa5a, 0xfa5a], /* CJK COMPATIBILITY IDEOGRAPH-FA5A */
- [0xfa5b, 0xfa5b], /* CJK COMPATIBILITY IDEOGRAPH-FA5B */
- [0xfa5c, 0xfa5c], /* CJK COMPATIBILITY IDEOGRAPH-FA5C */
- [0xfa5d, 0xfa5d], /* CJK COMPATIBILITY IDEOGRAPH-FA5D */
- [0xfa5e, 0xfa5e], /* CJK COMPATIBILITY IDEOGRAPH-FA5E */
- [0xfa5f, 0xfa5f], /* CJK COMPATIBILITY IDEOGRAPH-FA5F */
- [0xfa60, 0xfa60], /* CJK COMPATIBILITY IDEOGRAPH-FA60 */
- [0xfa61, 0xfa61], /* CJK COMPATIBILITY IDEOGRAPH-FA61 */
- [0xfa62, 0xfa62], /* CJK COMPATIBILITY IDEOGRAPH-FA62 */
- [0xfa63, 0xfa63], /* CJK COMPATIBILITY IDEOGRAPH-FA63 */
- [0xfa64, 0xfa64], /* CJK COMPATIBILITY IDEOGRAPH-FA64 */
- [0xfa65, 0xfa65], /* CJK COMPATIBILITY IDEOGRAPH-FA65 */
- [0xfa66, 0xfa66], /* CJK COMPATIBILITY IDEOGRAPH-FA66 */
- [0xfa67, 0xfa67], /* CJK COMPATIBILITY IDEOGRAPH-FA67 */
- [0xfa68, 0xfa68], /* CJK COMPATIBILITY IDEOGRAPH-FA68 */
- [0xfa69, 0xfa69], /* CJK COMPATIBILITY IDEOGRAPH-FA69 */
- [0xfa6a, 0xfa6a], /* CJK COMPATIBILITY IDEOGRAPH-FA6A */
- [0xfa6b, 0xfa6b], /* CJK COMPATIBILITY IDEOGRAPH-FA6B */
- [0xfa6c, 0xfa6c], /* CJK COMPATIBILITY IDEOGRAPH-FA6C */
- [0xfa6d, 0xfa6d], /* CJK COMPATIBILITY IDEOGRAPH-FA6D */
- [0xfa6e, 0xfa6e],
- [0xfa6f, 0xfa6f],
- [0xfa70, 0xfa70], /* CJK COMPATIBILITY IDEOGRAPH-FA70 */
- [0xfa71, 0xfa71], /* CJK COMPATIBILITY IDEOGRAPH-FA71 */
- [0xfa72, 0xfa72], /* CJK COMPATIBILITY IDEOGRAPH-FA72 */
- [0xfa73, 0xfa73], /* CJK COMPATIBILITY IDEOGRAPH-FA73 */
- [0xfa74, 0xfa74], /* CJK COMPATIBILITY IDEOGRAPH-FA74 */
- [0xfa75, 0xfa75], /* CJK COMPATIBILITY IDEOGRAPH-FA75 */
- [0xfa76, 0xfa76], /* CJK COMPATIBILITY IDEOGRAPH-FA76 */
- [0xfa77, 0xfa77], /* CJK COMPATIBILITY IDEOGRAPH-FA77 */
- [0xfa78, 0xfa78], /* CJK COMPATIBILITY IDEOGRAPH-FA78 */
- [0xfa79, 0xfa79], /* CJK COMPATIBILITY IDEOGRAPH-FA79 */
- [0xfa7a, 0xfa7a], /* CJK COMPATIBILITY IDEOGRAPH-FA7A */
- [0xfa7b, 0xfa7b], /* CJK COMPATIBILITY IDEOGRAPH-FA7B */
- [0xfa7c, 0xfa7c], /* CJK COMPATIBILITY IDEOGRAPH-FA7C */
- [0xfa7d, 0xfa7d], /* CJK COMPATIBILITY IDEOGRAPH-FA7D */
- [0xfa7e, 0xfa7e], /* CJK COMPATIBILITY IDEOGRAPH-FA7E */
- [0xfa7f, 0xfa7f], /* CJK COMPATIBILITY IDEOGRAPH-FA7F */
- [0xfa80, 0xfa80], /* CJK COMPATIBILITY IDEOGRAPH-FA80 */
- [0xfa81, 0xfa81], /* CJK COMPATIBILITY IDEOGRAPH-FA81 */
- [0xfa82, 0xfa82], /* CJK COMPATIBILITY IDEOGRAPH-FA82 */
- [0xfa83, 0xfa83], /* CJK COMPATIBILITY IDEOGRAPH-FA83 */
- [0xfa84, 0xfa84], /* CJK COMPATIBILITY IDEOGRAPH-FA84 */
- [0xfa85, 0xfa85], /* CJK COMPATIBILITY IDEOGRAPH-FA85 */
- [0xfa86, 0xfa86], /* CJK COMPATIBILITY IDEOGRAPH-FA86 */
- [0xfa87, 0xfa87], /* CJK COMPATIBILITY IDEOGRAPH-FA87 */
- [0xfa88, 0xfa88], /* CJK COMPATIBILITY IDEOGRAPH-FA88 */
- [0xfa89, 0xfa89], /* CJK COMPATIBILITY IDEOGRAPH-FA89 */
- [0xfa8a, 0xfa8a], /* CJK COMPATIBILITY IDEOGRAPH-FA8A */
- [0xfa8b, 0xfa8b], /* CJK COMPATIBILITY IDEOGRAPH-FA8B */
- [0xfa8c, 0xfa8c], /* CJK COMPATIBILITY IDEOGRAPH-FA8C */
- [0xfa8d, 0xfa8d], /* CJK COMPATIBILITY IDEOGRAPH-FA8D */
- [0xfa8e, 0xfa8e], /* CJK COMPATIBILITY IDEOGRAPH-FA8E */
- [0xfa8f, 0xfa8f], /* CJK COMPATIBILITY IDEOGRAPH-FA8F */
- [0xfa90, 0xfa90], /* CJK COMPATIBILITY IDEOGRAPH-FA90 */
- [0xfa91, 0xfa91], /* CJK COMPATIBILITY IDEOGRAPH-FA91 */
- [0xfa92, 0xfa92], /* CJK COMPATIBILITY IDEOGRAPH-FA92 */
- [0xfa93, 0xfa93], /* CJK COMPATIBILITY IDEOGRAPH-FA93 */
- [0xfa94, 0xfa94], /* CJK COMPATIBILITY IDEOGRAPH-FA94 */
- [0xfa95, 0xfa95], /* CJK COMPATIBILITY IDEOGRAPH-FA95 */
- [0xfa96, 0xfa96], /* CJK COMPATIBILITY IDEOGRAPH-FA96 */
- [0xfa97, 0xfa97], /* CJK COMPATIBILITY IDEOGRAPH-FA97 */
- [0xfa98, 0xfa98], /* CJK COMPATIBILITY IDEOGRAPH-FA98 */
- [0xfa99, 0xfa99], /* CJK COMPATIBILITY IDEOGRAPH-FA99 */
- [0xfa9a, 0xfa9a], /* CJK COMPATIBILITY IDEOGRAPH-FA9A */
- [0xfa9b, 0xfa9b], /* CJK COMPATIBILITY IDEOGRAPH-FA9B */
- [0xfa9c, 0xfa9c], /* CJK COMPATIBILITY IDEOGRAPH-FA9C */
- [0xfa9d, 0xfa9d], /* CJK COMPATIBILITY IDEOGRAPH-FA9D */
- [0xfa9e, 0xfa9e], /* CJK COMPATIBILITY IDEOGRAPH-FA9E */
- [0xfa9f, 0xfa9f], /* CJK COMPATIBILITY IDEOGRAPH-FA9F */
- [0xfaa0, 0xfaa0], /* CJK COMPATIBILITY IDEOGRAPH-FAA0 */
- [0xfaa1, 0xfaa1], /* CJK COMPATIBILITY IDEOGRAPH-FAA1 */
- [0xfaa2, 0xfaa2], /* CJK COMPATIBILITY IDEOGRAPH-FAA2 */
- [0xfaa3, 0xfaa3], /* CJK COMPATIBILITY IDEOGRAPH-FAA3 */
- [0xfaa4, 0xfaa4], /* CJK COMPATIBILITY IDEOGRAPH-FAA4 */
- [0xfaa5, 0xfaa5], /* CJK COMPATIBILITY IDEOGRAPH-FAA5 */
- [0xfaa6, 0xfaa6], /* CJK COMPATIBILITY IDEOGRAPH-FAA6 */
- [0xfaa7, 0xfaa7], /* CJK COMPATIBILITY IDEOGRAPH-FAA7 */
- [0xfaa8, 0xfaa8], /* CJK COMPATIBILITY IDEOGRAPH-FAA8 */
- [0xfaa9, 0xfaa9], /* CJK COMPATIBILITY IDEOGRAPH-FAA9 */
- [0xfaaa, 0xfaaa], /* CJK COMPATIBILITY IDEOGRAPH-FAAA */
- [0xfaab, 0xfaab], /* CJK COMPATIBILITY IDEOGRAPH-FAAB */
- [0xfaac, 0xfaac], /* CJK COMPATIBILITY IDEOGRAPH-FAAC */
- [0xfaad, 0xfaad], /* CJK COMPATIBILITY IDEOGRAPH-FAAD */
- [0xfaae, 0xfaae], /* CJK COMPATIBILITY IDEOGRAPH-FAAE */
- [0xfaaf, 0xfaaf], /* CJK COMPATIBILITY IDEOGRAPH-FAAF */
- [0xfab0, 0xfab0], /* CJK COMPATIBILITY IDEOGRAPH-FAB0 */
- [0xfab1, 0xfab1], /* CJK COMPATIBILITY IDEOGRAPH-FAB1 */
- [0xfab2, 0xfab2], /* CJK COMPATIBILITY IDEOGRAPH-FAB2 */
- [0xfab3, 0xfab3], /* CJK COMPATIBILITY IDEOGRAPH-FAB3 */
- [0xfab4, 0xfab4], /* CJK COMPATIBILITY IDEOGRAPH-FAB4 */
- [0xfab5, 0xfab5], /* CJK COMPATIBILITY IDEOGRAPH-FAB5 */
- [0xfab6, 0xfab6], /* CJK COMPATIBILITY IDEOGRAPH-FAB6 */
- [0xfab7, 0xfab7], /* CJK COMPATIBILITY IDEOGRAPH-FAB7 */
- [0xfab8, 0xfab8], /* CJK COMPATIBILITY IDEOGRAPH-FAB8 */
- [0xfab9, 0xfab9], /* CJK COMPATIBILITY IDEOGRAPH-FAB9 */
- [0xfaba, 0xfaba], /* CJK COMPATIBILITY IDEOGRAPH-FABA */
- [0xfabb, 0xfabb], /* CJK COMPATIBILITY IDEOGRAPH-FABB */
- [0xfabc, 0xfabc], /* CJK COMPATIBILITY IDEOGRAPH-FABC */
- [0xfabd, 0xfabd], /* CJK COMPATIBILITY IDEOGRAPH-FABD */
- [0xfabe, 0xfabe], /* CJK COMPATIBILITY IDEOGRAPH-FABE */
- [0xfabf, 0xfabf], /* CJK COMPATIBILITY IDEOGRAPH-FABF */
- [0xfac0, 0xfac0], /* CJK COMPATIBILITY IDEOGRAPH-FAC0 */
- [0xfac1, 0xfac1], /* CJK COMPATIBILITY IDEOGRAPH-FAC1 */
- [0xfac2, 0xfac2], /* CJK COMPATIBILITY IDEOGRAPH-FAC2 */
- [0xfac3, 0xfac3], /* CJK COMPATIBILITY IDEOGRAPH-FAC3 */
- [0xfac4, 0xfac4], /* CJK COMPATIBILITY IDEOGRAPH-FAC4 */
- [0xfac5, 0xfac5], /* CJK COMPATIBILITY IDEOGRAPH-FAC5 */
- [0xfac6, 0xfac6], /* CJK COMPATIBILITY IDEOGRAPH-FAC6 */
- [0xfac7, 0xfac7], /* CJK COMPATIBILITY IDEOGRAPH-FAC7 */
- [0xfac8, 0xfac8], /* CJK COMPATIBILITY IDEOGRAPH-FAC8 */
- [0xfac9, 0xfac9], /* CJK COMPATIBILITY IDEOGRAPH-FAC9 */
- [0xfaca, 0xfaca], /* CJK COMPATIBILITY IDEOGRAPH-FACA */
- [0xfacb, 0xfacb], /* CJK COMPATIBILITY IDEOGRAPH-FACB */
- [0xfacc, 0xfacc], /* CJK COMPATIBILITY IDEOGRAPH-FACC */
- [0xfacd, 0xfacd], /* CJK COMPATIBILITY IDEOGRAPH-FACD */
- [0xface, 0xface], /* CJK COMPATIBILITY IDEOGRAPH-FACE */
- [0xfacf, 0xfacf], /* CJK COMPATIBILITY IDEOGRAPH-FACF */
- [0xfad0, 0xfad0], /* CJK COMPATIBILITY IDEOGRAPH-FAD0 */
- [0xfad1, 0xfad1], /* CJK COMPATIBILITY IDEOGRAPH-FAD1 */
- [0xfad2, 0xfad2], /* CJK COMPATIBILITY IDEOGRAPH-FAD2 */
- [0xfad3, 0xfad3], /* CJK COMPATIBILITY IDEOGRAPH-FAD3 */
- [0xfad4, 0xfad4], /* CJK COMPATIBILITY IDEOGRAPH-FAD4 */
- [0xfad5, 0xfad5], /* CJK COMPATIBILITY IDEOGRAPH-FAD5 */
- [0xfad6, 0xfad6], /* CJK COMPATIBILITY IDEOGRAPH-FAD6 */
- [0xfad7, 0xfad7], /* CJK COMPATIBILITY IDEOGRAPH-FAD7 */
- [0xfad8, 0xfad8], /* CJK COMPATIBILITY IDEOGRAPH-FAD8 */
- [0xfad9, 0xfad9], /* CJK COMPATIBILITY IDEOGRAPH-FAD9 */
- [0xfada, 0xfada],
- [0xfadb, 0xfadb],
- [0xfadc, 0xfadc],
- [0xfadd, 0xfadd],
- [0xfade, 0xfade],
- [0xfadf, 0xfadf],
- [0xfae0, 0xfae0],
- [0xfae1, 0xfae1],
- [0xfae2, 0xfae2],
- [0xfae3, 0xfae3],
- [0xfae4, 0xfae4],
- [0xfae5, 0xfae5],
- [0xfae6, 0xfae6],
- [0xfae7, 0xfae7],
- [0xfae8, 0xfae8],
- [0xfae9, 0xfae9],
- [0xfaea, 0xfaea],
- [0xfaeb, 0xfaeb],
- [0xfaec, 0xfaec],
- [0xfaed, 0xfaed],
- [0xfaee, 0xfaee],
- [0xfaef, 0xfaef],
- [0xfaf0, 0xfaf0],
- [0xfaf1, 0xfaf1],
- [0xfaf2, 0xfaf2],
- [0xfaf3, 0xfaf3],
- [0xfaf4, 0xfaf4],
- [0xfaf5, 0xfaf5],
- [0xfaf6, 0xfaf6],
- [0xfaf7, 0xfaf7],
- [0xfaf8, 0xfaf8],
- [0xfaf9, 0xfaf9],
- [0xfafa, 0xfafa],
- [0xfafb, 0xfafb],
- [0xfafc, 0xfafc],
- [0xfafd, 0xfafd],
- [0xfafe, 0xfafe],
- [0xfaff, 0xfaff],
- [0xfb00, 0xfb00], /* LATIN SMALL LIGATURE FF */
- [0xfb01, 0xfb01], /* LATIN SMALL LIGATURE FI */
- [0xfb02, 0xfb02], /* LATIN SMALL LIGATURE FL */
- [0xfb03, 0xfb03], /* LATIN SMALL LIGATURE FFI */
- [0xfb04, 0xfb04], /* LATIN SMALL LIGATURE FFL */
- [0xfb05, 0xfb05], /* LATIN SMALL LIGATURE LONG S T */
- [0xfb06, 0xfb06], /* LATIN SMALL LIGATURE ST */
- [0xfb07, 0xfb07],
- [0xfb08, 0xfb08],
- [0xfb09, 0xfb09],
- [0xfb0a, 0xfb0a],
- [0xfb0b, 0xfb0b],
- [0xfb0c, 0xfb0c],
- [0xfb0d, 0xfb0d],
- [0xfb0e, 0xfb0e],
- [0xfb0f, 0xfb0f],
- [0xfb10, 0xfb10],
- [0xfb11, 0xfb11],
- [0xfb12, 0xfb12],
- [0xfb13, 0xfb13], /* ARMENIAN SMALL LIGATURE MEN NOW */
- [0xfb14, 0xfb14], /* ARMENIAN SMALL LIGATURE MEN ECH */
- [0xfb15, 0xfb15], /* ARMENIAN SMALL LIGATURE MEN INI */
- [0xfb16, 0xfb16], /* ARMENIAN SMALL LIGATURE VEW NOW */
- [0xfb17, 0xfb17], /* ARMENIAN SMALL LIGATURE MEN XEH */
- [0xfb18, 0xfb18],
- [0xfb19, 0xfb19],
- [0xfb1a, 0xfb1a],
- [0xfb1b, 0xfb1b],
- [0xfb1c, 0xfb1c],
- [0xfb1d, 0xfb1d], /* HEBREW LETTER YOD WITH HIRIQ */
- [0xfb1e, 0xfb1e], /* HEBREW POINT JUDEO-SPANISH VARIKA (HEBREW POINT VARIKA) */
- [0xfb1f, 0xfb1f], /* HEBREW LIGATURE YIDDISH YOD YOD PATAH */
- [0xfb20, 0xfb20], /* HEBREW LETTER ALTERNATIVE AYIN */
- [0xfb21, 0xfb21], /* HEBREW LETTER WIDE ALEF */
- [0xfb22, 0xfb22], /* HEBREW LETTER WIDE DALET */
- [0xfb23, 0xfb23], /* HEBREW LETTER WIDE HE */
- [0xfb24, 0xfb24], /* HEBREW LETTER WIDE KAF */
- [0xfb25, 0xfb25], /* HEBREW LETTER WIDE LAMED */
- [0xfb26, 0xfb26], /* HEBREW LETTER WIDE FINAL MEM */
- [0xfb27, 0xfb27], /* HEBREW LETTER WIDE RESH */
- [0xfb28, 0xfb28], /* HEBREW LETTER WIDE TAV */
- [0xfb29, 0xfb29], /* HEBREW LETTER ALTERNATIVE PLUS SIGN */
- [0xfb2a, 0xfb2a], /* HEBREW LETTER SHIN WITH SHIN DOT */
- [0xfb2b, 0xfb2b], /* HEBREW LETTER SHIN WITH SIN DOT */
- [0xfb2c, 0xfb2c], /* HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT */
- [0xfb2d, 0xfb2d], /* HEBREW LETTER SHIN WITH DAGESH AND SIN DOT */
- [0xfb2e, 0xfb2e], /* HEBREW LETTER ALEF WITH PATAH */
- [0xfb2f, 0xfb2f], /* HEBREW LETTER ALEF WITH QAMATS */
- [0xfb30, 0xfb30], /* HEBREW LETTER ALEF WITH MAPIQ */
- [0xfb31, 0xfb31], /* HEBREW LETTER BET WITH DAGESH */
- [0xfb32, 0xfb32], /* HEBREW LETTER GIMEL WITH DAGESH */
- [0xfb33, 0xfb33], /* HEBREW LETTER DALET WITH DAGESH */
- [0xfb34, 0xfb34], /* HEBREW LETTER HE WITH MAPIQ */
- [0xfb35, 0xfb35], /* HEBREW LETTER VAV WITH DAGESH */
- [0xfb36, 0xfb36], /* HEBREW LETTER ZAYIN WITH DAGESH */
- [0xfb37, 0xfb37],
- [0xfb38, 0xfb38], /* HEBREW LETTER TET WITH DAGESH */
- [0xfb39, 0xfb39], /* HEBREW LETTER YOD WITH DAGESH */
- [0xfb3a, 0xfb3a], /* HEBREW LETTER FINAL KAF WITH DAGESH */
- [0xfb3b, 0xfb3b], /* HEBREW LETTER KAF WITH DAGESH */
- [0xfb3c, 0xfb3c], /* HEBREW LETTER LAMED WITH DAGESH */
- [0xfb3d, 0xfb3d],
- [0xfb3e, 0xfb3e], /* HEBREW LETTER MEM WITH DAGESH */
- [0xfb3f, 0xfb3f],
- [0xfb40, 0xfb40], /* HEBREW LETTER NUN WITH DAGESH */
- [0xfb41, 0xfb41], /* HEBREW LETTER SAMEKH WITH DAGESH */
- [0xfb42, 0xfb42],
- [0xfb43, 0xfb43], /* HEBREW LETTER FINAL PE WITH DAGESH */
- [0xfb44, 0xfb44], /* HEBREW LETTER PE WITH DAGESH */
- [0xfb45, 0xfb45],
- [0xfb46, 0xfb46], /* HEBREW LETTER TSADI WITH DAGESH */
- [0xfb47, 0xfb47], /* HEBREW LETTER QOF WITH DAGESH */
- [0xfb48, 0xfb48], /* HEBREW LETTER RESH WITH DAGESH */
- [0xfb49, 0xfb49], /* HEBREW LETTER SHIN WITH DAGESH */
- [0xfb4a, 0xfb4a], /* HEBREW LETTER TAV WITH DAGESH */
- [0xfb4b, 0xfb4b], /* HEBREW LETTER VAV WITH HOLAM */
- [0xfb4c, 0xfb4c], /* HEBREW LETTER BET WITH RAFE */
- [0xfb4d, 0xfb4d], /* HEBREW LETTER KAF WITH RAFE */
- [0xfb4e, 0xfb4e], /* HEBREW LETTER PE WITH RAFE */
- [0xfb4f, 0xfb4f], /* HEBREW LIGATURE ALEF LAMED */
- [0xfb50, 0xfb50], /* ARABIC LETTER ALEF WASLA ISOLATED FORM */
- [0xfb51, 0xfb51], /* ARABIC LETTER ALEF WASLA FINAL FORM */
- [0xfb52, 0xfb52], /* ARABIC LETTER BEEH ISOLATED FORM */
- [0xfb53, 0xfb53], /* ARABIC LETTER BEEH FINAL FORM */
- [0xfb54, 0xfb54], /* ARABIC LETTER BEEH INITIAL FORM */
- [0xfb55, 0xfb55], /* ARABIC LETTER BEEH MEDIAL FORM */
- [0xfb56, 0xfb56], /* ARABIC LETTER PEH ISOLATED FORM */
- [0xfb57, 0xfb57], /* ARABIC LETTER PEH FINAL FORM */
- [0xfb58, 0xfb58], /* ARABIC LETTER PEH INITIAL FORM */
- [0xfb59, 0xfb59], /* ARABIC LETTER PEH MEDIAL FORM */
- [0xfb5a, 0xfb5a], /* ARABIC LETTER BEHEH ISOLATED FORM */
- [0xfb5b, 0xfb5b], /* ARABIC LETTER BEHEH FINAL FORM */
- [0xfb5c, 0xfb5c], /* ARABIC LETTER BEHEH INITIAL FORM */
- [0xfb5d, 0xfb5d], /* ARABIC LETTER BEHEH MEDIAL FORM */
- [0xfb5e, 0xfb5e], /* ARABIC LETTER TTEHEH ISOLATED FORM */
- [0xfb5f, 0xfb5f], /* ARABIC LETTER TTEHEH FINAL FORM */
- [0xfb60, 0xfb60], /* ARABIC LETTER TTEHEH INITIAL FORM */
- [0xfb61, 0xfb61], /* ARABIC LETTER TTEHEH MEDIAL FORM */
- [0xfb62, 0xfb62], /* ARABIC LETTER TEHEH ISOLATED FORM */
- [0xfb63, 0xfb63], /* ARABIC LETTER TEHEH FINAL FORM */
- [0xfb64, 0xfb64], /* ARABIC LETTER TEHEH INITIAL FORM */
- [0xfb65, 0xfb65], /* ARABIC LETTER TEHEH MEDIAL FORM */
- [0xfb66, 0xfb66], /* ARABIC LETTER TTEH ISOLATED FORM */
- [0xfb67, 0xfb67], /* ARABIC LETTER TTEH FINAL FORM */
- [0xfb68, 0xfb68], /* ARABIC LETTER TTEH INITIAL FORM */
- [0xfb69, 0xfb69], /* ARABIC LETTER TTEH MEDIAL FORM */
- [0xfb6a, 0xfb6a], /* ARABIC LETTER VEH ISOLATED FORM */
- [0xfb6b, 0xfb6b], /* ARABIC LETTER VEH FINAL FORM */
- [0xfb6c, 0xfb6c], /* ARABIC LETTER VEH INITIAL FORM */
- [0xfb6d, 0xfb6d], /* ARABIC LETTER VEH MEDIAL FORM */
- [0xfb6e, 0xfb6e], /* ARABIC LETTER PEHEH ISOLATED FORM */
- [0xfb6f, 0xfb6f], /* ARABIC LETTER PEHEH FINAL FORM */
- [0xfb70, 0xfb70], /* ARABIC LETTER PEHEH INITIAL FORM */
- [0xfb71, 0xfb71], /* ARABIC LETTER PEHEH MEDIAL FORM */
- [0xfb72, 0xfb72], /* ARABIC LETTER DYEH ISOLATED FORM */
- [0xfb73, 0xfb73], /* ARABIC LETTER DYEH FINAL FORM */
- [0xfb74, 0xfb74], /* ARABIC LETTER DYEH INITIAL FORM */
- [0xfb75, 0xfb75], /* ARABIC LETTER DYEH MEDIAL FORM */
- [0xfb76, 0xfb76], /* ARABIC LETTER NYEH ISOLATED FORM */
- [0xfb77, 0xfb77], /* ARABIC LETTER NYEH FINAL FORM */
- [0xfb78, 0xfb78], /* ARABIC LETTER NYEH INITIAL FORM */
- [0xfb79, 0xfb79], /* ARABIC LETTER NYEH MEDIAL FORM */
- [0xfb7a, 0xfb7a], /* ARABIC LETTER TCHEH ISOLATED FORM */
- [0xfb7b, 0xfb7b], /* ARABIC LETTER TCHEH FINAL FORM */
- [0xfb7c, 0xfb7c], /* ARABIC LETTER TCHEH INITIAL FORM */
- [0xfb7d, 0xfb7d], /* ARABIC LETTER TCHEH MEDIAL FORM */
- [0xfb7e, 0xfb7e], /* ARABIC LETTER TCHEHEH ISOLATED FORM */
- [0xfb7f, 0xfb7f], /* ARABIC LETTER TCHEHEH FINAL FORM */
- [0xfb80, 0xfb80], /* ARABIC LETTER TCHEHEH INITIAL FORM */
- [0xfb81, 0xfb81], /* ARABIC LETTER TCHEHEH MEDIAL FORM */
- [0xfb82, 0xfb82], /* ARABIC LETTER DDAHAL ISOLATED FORM */
- [0xfb83, 0xfb83], /* ARABIC LETTER DDAHAL FINAL FORM */
- [0xfb84, 0xfb84], /* ARABIC LETTER DAHAL ISOLATED FORM */
- [0xfb85, 0xfb85], /* ARABIC LETTER DAHAL FINAL FORM */
- [0xfb86, 0xfb86], /* ARABIC LETTER DUL ISOLATED FORM */
- [0xfb87, 0xfb87], /* ARABIC LETTER DUL FINAL FORM */
- [0xfb88, 0xfb88], /* ARABIC LETTER DDAL ISOLATED FORM */
- [0xfb89, 0xfb89], /* ARABIC LETTER DDAL FINAL FORM */
- [0xfb8a, 0xfb8a], /* ARABIC LETTER JEH ISOLATED FORM */
- [0xfb8b, 0xfb8b], /* ARABIC LETTER JEH FINAL FORM */
- [0xfb8c, 0xfb8c], /* ARABIC LETTER RREH ISOLATED FORM */
- [0xfb8d, 0xfb8d], /* ARABIC LETTER RREH FINAL FORM */
- [0xfb8e, 0xfb8e], /* ARABIC LETTER KEHEH ISOLATED FORM */
- [0xfb8f, 0xfb8f], /* ARABIC LETTER KEHEH FINAL FORM */
- [0xfb90, 0xfb90], /* ARABIC LETTER KEHEH INITIAL FORM */
- [0xfb91, 0xfb91], /* ARABIC LETTER KEHEH MEDIAL FORM */
- [0xfb92, 0xfb92], /* ARABIC LETTER GAF ISOLATED FORM */
- [0xfb93, 0xfb93], /* ARABIC LETTER GAF FINAL FORM */
- [0xfb94, 0xfb94], /* ARABIC LETTER GAF INITIAL FORM */
- [0xfb95, 0xfb95], /* ARABIC LETTER GAF MEDIAL FORM */
- [0xfb96, 0xfb96], /* ARABIC LETTER GUEH ISOLATED FORM */
- [0xfb97, 0xfb97], /* ARABIC LETTER GUEH FINAL FORM */
- [0xfb98, 0xfb98], /* ARABIC LETTER GUEH INITIAL FORM */
- [0xfb99, 0xfb99], /* ARABIC LETTER GUEH MEDIAL FORM */
- [0xfb9a, 0xfb9a], /* ARABIC LETTER NGOEH ISOLATED FORM */
- [0xfb9b, 0xfb9b], /* ARABIC LETTER NGOEH FINAL FORM */
- [0xfb9c, 0xfb9c], /* ARABIC LETTER NGOEH INITIAL FORM */
- [0xfb9d, 0xfb9d], /* ARABIC LETTER NGOEH MEDIAL FORM */
- [0xfb9e, 0xfb9e], /* ARABIC LETTER NOON GHUNNA ISOLATED FORM */
- [0xfb9f, 0xfb9f], /* ARABIC LETTER NOON GHUNNA FINAL FORM */
- [0xfba0, 0xfba0], /* ARABIC LETTER RNOON ISOLATED FORM */
- [0xfba1, 0xfba1], /* ARABIC LETTER RNOON FINAL FORM */
- [0xfba2, 0xfba2], /* ARABIC LETTER RNOON INITIAL FORM */
- [0xfba3, 0xfba3], /* ARABIC LETTER RNOON MEDIAL FORM */
- [0xfba4, 0xfba4], /* ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM */
- [0xfba5, 0xfba5], /* ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM */
- [0xfba6, 0xfba6], /* ARABIC LETTER HEH GOAL ISOLATED FORM */
- [0xfba7, 0xfba7], /* ARABIC LETTER HEH GOAL FINAL FORM */
- [0xfba8, 0xfba8], /* ARABIC LETTER HEH GOAL INITIAL FORM */
- [0xfba9, 0xfba9], /* ARABIC LETTER HEH GOAL MEDIAL FORM */
- [0xfbaa, 0xfbaa], /* ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM */
- [0xfbab, 0xfbab], /* ARABIC LETTER HEH DOACHASHMEE FINAL FORM */
- [0xfbac, 0xfbac], /* ARABIC LETTER HEH DOACHASHMEE INITIAL FORM */
- [0xfbad, 0xfbad], /* ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM */
- [0xfbae, 0xfbae], /* ARABIC LETTER YEH BARREE ISOLATED FORM */
- [0xfbaf, 0xfbaf], /* ARABIC LETTER YEH BARREE FINAL FORM */
- [0xfbb0, 0xfbb0], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM */
- [0xfbb1, 0xfbb1], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM */
- [0xfbb2, 0xfbb2], /* ARABIC SYMBOL DOT ABOVE */
- [0xfbb3, 0xfbb3], /* ARABIC SYMBOL DOT BELOW */
- [0xfbb4, 0xfbb4], /* ARABIC SYMBOL TWO DOTS ABOVE */
- [0xfbb5, 0xfbb5], /* ARABIC SYMBOL TWO DOTS BELOW */
- [0xfbb6, 0xfbb6], /* ARABIC SYMBOL THREE DOTS ABOVE */
- [0xfbb7, 0xfbb7], /* ARABIC SYMBOL THREE DOTS BELOW */
- [0xfbb8, 0xfbb8], /* ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE */
- [0xfbb9, 0xfbb9], /* ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW */
- [0xfbba, 0xfbba], /* ARABIC SYMBOL FOUR DOTS ABOVE */
- [0xfbbb, 0xfbbb], /* ARABIC SYMBOL FOUR DOTS BELOW */
- [0xfbbc, 0xfbbc], /* ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW */
- [0xfbbd, 0xfbbd], /* ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE */
- [0xfbbe, 0xfbbe], /* ARABIC SYMBOL TWO DOTS VERTICALLY BELOW */
- [0xfbbf, 0xfbbf], /* ARABIC SYMBOL RING */
- [0xfbc0, 0xfbc0], /* ARABIC SYMBOL SMALL TAH ABOVE */
- [0xfbc1, 0xfbc1], /* ARABIC SYMBOL SMALL TAH BELOW */
- [0xfbc2, 0xfbc2],
- [0xfbc3, 0xfbc3],
- [0xfbc4, 0xfbc4],
- [0xfbc5, 0xfbc5],
- [0xfbc6, 0xfbc6],
- [0xfbc7, 0xfbc7],
- [0xfbc8, 0xfbc8],
- [0xfbc9, 0xfbc9],
- [0xfbca, 0xfbca],
- [0xfbcb, 0xfbcb],
- [0xfbcc, 0xfbcc],
- [0xfbcd, 0xfbcd],
- [0xfbce, 0xfbce],
- [0xfbcf, 0xfbcf],
- [0xfbd0, 0xfbd0],
- [0xfbd1, 0xfbd1],
- [0xfbd2, 0xfbd2],
- [0xfbd3, 0xfbd3], /* ARABIC LETTER NG ISOLATED FORM */
- [0xfbd4, 0xfbd4], /* ARABIC LETTER NG FINAL FORM */
- [0xfbd5, 0xfbd5], /* ARABIC LETTER NG INITIAL FORM */
- [0xfbd6, 0xfbd6], /* ARABIC LETTER NG MEDIAL FORM */
- [0xfbd7, 0xfbd7], /* ARABIC LETTER U ISOLATED FORM */
- [0xfbd8, 0xfbd8], /* ARABIC LETTER U FINAL FORM */
- [0xfbd9, 0xfbd9], /* ARABIC LETTER OE ISOLATED FORM */
- [0xfbda, 0xfbda], /* ARABIC LETTER OE FINAL FORM */
- [0xfbdb, 0xfbdb], /* ARABIC LETTER YU ISOLATED FORM */
- [0xfbdc, 0xfbdc], /* ARABIC LETTER YU FINAL FORM */
- [0xfbdd, 0xfbdd], /* ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM */
- [0xfbde, 0xfbde], /* ARABIC LETTER VE ISOLATED FORM */
- [0xfbdf, 0xfbdf], /* ARABIC LETTER VE FINAL FORM */
- [0xfbe0, 0xfbe0], /* ARABIC LETTER KIRGHIZ OE ISOLATED FORM */
- [0xfbe1, 0xfbe1], /* ARABIC LETTER KIRGHIZ OE FINAL FORM */
- [0xfbe2, 0xfbe2], /* ARABIC LETTER KIRGHIZ YU ISOLATED FORM */
- [0xfbe3, 0xfbe3], /* ARABIC LETTER KIRGHIZ YU FINAL FORM */
- [0xfbe4, 0xfbe4], /* ARABIC LETTER E ISOLATED FORM */
- [0xfbe5, 0xfbe5], /* ARABIC LETTER E FINAL FORM */
- [0xfbe6, 0xfbe6], /* ARABIC LETTER E INITIAL FORM */
- [0xfbe7, 0xfbe7], /* ARABIC LETTER E MEDIAL FORM */
- [0xfbe8, 0xfbe8], /* ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM */
- [0xfbe9, 0xfbe9], /* ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM */
- [0xfbea, 0xfbea], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM */
- [0xfbeb, 0xfbeb], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM */
- [0xfbec, 0xfbec], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM */
- [0xfbed, 0xfbed], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM */
- [0xfbee, 0xfbee], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM */
- [0xfbef, 0xfbef], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM */
- [0xfbf0, 0xfbf0], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM */
- [0xfbf1, 0xfbf1], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM */
- [0xfbf2, 0xfbf2], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM */
- [0xfbf3, 0xfbf3], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM */
- [0xfbf4, 0xfbf4], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM */
- [0xfbf5, 0xfbf5], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM */
- [0xfbf6, 0xfbf6], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM */
- [0xfbf7, 0xfbf7], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM */
- [0xfbf8, 0xfbf8], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM */
- [0xfbf9, 0xfbf9], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM */
- [0xfbfa, 0xfbfa], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM */
- [0xfbfb, 0xfbfb], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM */
- [0xfbfc, 0xfbfc], /* ARABIC LETTER FARSI YEH ISOLATED FORM */
- [0xfbfd, 0xfbfd], /* ARABIC LETTER FARSI YEH FINAL FORM */
- [0xfbfe, 0xfbfe], /* ARABIC LETTER FARSI YEH INITIAL FORM */
- [0xfbff, 0xfbff], /* ARABIC LETTER FARSI YEH MEDIAL FORM */
- [0xfc00, 0xfc00], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM */
- [0xfc01, 0xfc01], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM */
- [0xfc02, 0xfc02], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM */
- [0xfc03, 0xfc03], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc04, 0xfc04], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM */
- [0xfc05, 0xfc05], /* ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM */
- [0xfc06, 0xfc06], /* ARABIC LIGATURE BEH WITH HAH ISOLATED FORM */
- [0xfc07, 0xfc07], /* ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM */
- [0xfc08, 0xfc08], /* ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM */
- [0xfc09, 0xfc09], /* ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc0a, 0xfc0a], /* ARABIC LIGATURE BEH WITH YEH ISOLATED FORM */
- [0xfc0b, 0xfc0b], /* ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM */
- [0xfc0c, 0xfc0c], /* ARABIC LIGATURE TEH WITH HAH ISOLATED FORM */
- [0xfc0d, 0xfc0d], /* ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM */
- [0xfc0e, 0xfc0e], /* ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM */
- [0xfc0f, 0xfc0f], /* ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc10, 0xfc10], /* ARABIC LIGATURE TEH WITH YEH ISOLATED FORM */
- [0xfc11, 0xfc11], /* ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM */
- [0xfc12, 0xfc12], /* ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM */
- [0xfc13, 0xfc13], /* ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc14, 0xfc14], /* ARABIC LIGATURE THEH WITH YEH ISOLATED FORM */
- [0xfc15, 0xfc15], /* ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM */
- [0xfc16, 0xfc16], /* ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM */
- [0xfc17, 0xfc17], /* ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM */
- [0xfc18, 0xfc18], /* ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM */
- [0xfc19, 0xfc19], /* ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM */
- [0xfc1a, 0xfc1a], /* ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM */
- [0xfc1b, 0xfc1b], /* ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM */
- [0xfc1c, 0xfc1c], /* ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM */
- [0xfc1d, 0xfc1d], /* ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM */
- [0xfc1e, 0xfc1e], /* ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM */
- [0xfc1f, 0xfc1f], /* ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM */
- [0xfc20, 0xfc20], /* ARABIC LIGATURE SAD WITH HAH ISOLATED FORM */
- [0xfc21, 0xfc21], /* ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM */
- [0xfc22, 0xfc22], /* ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM */
- [0xfc23, 0xfc23], /* ARABIC LIGATURE DAD WITH HAH ISOLATED FORM */
- [0xfc24, 0xfc24], /* ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM */
- [0xfc25, 0xfc25], /* ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM */
- [0xfc26, 0xfc26], /* ARABIC LIGATURE TAH WITH HAH ISOLATED FORM */
- [0xfc27, 0xfc27], /* ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM */
- [0xfc28, 0xfc28], /* ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM */
- [0xfc29, 0xfc29], /* ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM */
- [0xfc2a, 0xfc2a], /* ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM */
- [0xfc2b, 0xfc2b], /* ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM */
- [0xfc2c, 0xfc2c], /* ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM */
- [0xfc2d, 0xfc2d], /* ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM */
- [0xfc2e, 0xfc2e], /* ARABIC LIGATURE FEH WITH HAH ISOLATED FORM */
- [0xfc2f, 0xfc2f], /* ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM */
- [0xfc30, 0xfc30], /* ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM */
- [0xfc31, 0xfc31], /* ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc32, 0xfc32], /* ARABIC LIGATURE FEH WITH YEH ISOLATED FORM */
- [0xfc33, 0xfc33], /* ARABIC LIGATURE QAF WITH HAH ISOLATED FORM */
- [0xfc34, 0xfc34], /* ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM */
- [0xfc35, 0xfc35], /* ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc36, 0xfc36], /* ARABIC LIGATURE QAF WITH YEH ISOLATED FORM */
- [0xfc37, 0xfc37], /* ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM */
- [0xfc38, 0xfc38], /* ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM */
- [0xfc39, 0xfc39], /* ARABIC LIGATURE KAF WITH HAH ISOLATED FORM */
- [0xfc3a, 0xfc3a], /* ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM */
- [0xfc3b, 0xfc3b], /* ARABIC LIGATURE KAF WITH LAM ISOLATED FORM */
- [0xfc3c, 0xfc3c], /* ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM */
- [0xfc3d, 0xfc3d], /* ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc3e, 0xfc3e], /* ARABIC LIGATURE KAF WITH YEH ISOLATED FORM */
- [0xfc3f, 0xfc3f], /* ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM */
- [0xfc40, 0xfc40], /* ARABIC LIGATURE LAM WITH HAH ISOLATED FORM */
- [0xfc41, 0xfc41], /* ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM */
- [0xfc42, 0xfc42], /* ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM */
- [0xfc43, 0xfc43], /* ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc44, 0xfc44], /* ARABIC LIGATURE LAM WITH YEH ISOLATED FORM */
- [0xfc45, 0xfc45], /* ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM */
- [0xfc46, 0xfc46], /* ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM */
- [0xfc47, 0xfc47], /* ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM */
- [0xfc48, 0xfc48], /* ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM */
- [0xfc49, 0xfc49], /* ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc4a, 0xfc4a], /* ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM */
- [0xfc4b, 0xfc4b], /* ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM */
- [0xfc4c, 0xfc4c], /* ARABIC LIGATURE NOON WITH HAH ISOLATED FORM */
- [0xfc4d, 0xfc4d], /* ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM */
- [0xfc4e, 0xfc4e], /* ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM */
- [0xfc4f, 0xfc4f], /* ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc50, 0xfc50], /* ARABIC LIGATURE NOON WITH YEH ISOLATED FORM */
- [0xfc51, 0xfc51], /* ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM */
- [0xfc52, 0xfc52], /* ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM */
- [0xfc53, 0xfc53], /* ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc54, 0xfc54], /* ARABIC LIGATURE HEH WITH YEH ISOLATED FORM */
- [0xfc55, 0xfc55], /* ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM */
- [0xfc56, 0xfc56], /* ARABIC LIGATURE YEH WITH HAH ISOLATED FORM */
- [0xfc57, 0xfc57], /* ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM */
- [0xfc58, 0xfc58], /* ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM */
- [0xfc59, 0xfc59], /* ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfc5a, 0xfc5a], /* ARABIC LIGATURE YEH WITH YEH ISOLATED FORM */
- [0xfc5b, 0xfc5b], /* ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM */
- [0xfc5c, 0xfc5c], /* ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM */
- [0xfc5d, 0xfc5d], /* ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM */
- [0xfc5e, 0xfc5e], /* ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM */
- [0xfc5f, 0xfc5f], /* ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM */
- [0xfc60, 0xfc60], /* ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM */
- [0xfc61, 0xfc61], /* ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM */
- [0xfc62, 0xfc62], /* ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM */
- [0xfc63, 0xfc63], /* ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM */
- [0xfc64, 0xfc64], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM */
- [0xfc65, 0xfc65], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM */
- [0xfc66, 0xfc66], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM */
- [0xfc67, 0xfc67], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM */
- [0xfc68, 0xfc68], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM */
- [0xfc69, 0xfc69], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM */
- [0xfc6a, 0xfc6a], /* ARABIC LIGATURE BEH WITH REH FINAL FORM */
- [0xfc6b, 0xfc6b], /* ARABIC LIGATURE BEH WITH ZAIN FINAL FORM */
- [0xfc6c, 0xfc6c], /* ARABIC LIGATURE BEH WITH MEEM FINAL FORM */
- [0xfc6d, 0xfc6d], /* ARABIC LIGATURE BEH WITH NOON FINAL FORM */
- [0xfc6e, 0xfc6e], /* ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM */
- [0xfc6f, 0xfc6f], /* ARABIC LIGATURE BEH WITH YEH FINAL FORM */
- [0xfc70, 0xfc70], /* ARABIC LIGATURE TEH WITH REH FINAL FORM */
- [0xfc71, 0xfc71], /* ARABIC LIGATURE TEH WITH ZAIN FINAL FORM */
- [0xfc72, 0xfc72], /* ARABIC LIGATURE TEH WITH MEEM FINAL FORM */
- [0xfc73, 0xfc73], /* ARABIC LIGATURE TEH WITH NOON FINAL FORM */
- [0xfc74, 0xfc74], /* ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM */
- [0xfc75, 0xfc75], /* ARABIC LIGATURE TEH WITH YEH FINAL FORM */
- [0xfc76, 0xfc76], /* ARABIC LIGATURE THEH WITH REH FINAL FORM */
- [0xfc77, 0xfc77], /* ARABIC LIGATURE THEH WITH ZAIN FINAL FORM */
- [0xfc78, 0xfc78], /* ARABIC LIGATURE THEH WITH MEEM FINAL FORM */
- [0xfc79, 0xfc79], /* ARABIC LIGATURE THEH WITH NOON FINAL FORM */
- [0xfc7a, 0xfc7a], /* ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM */
- [0xfc7b, 0xfc7b], /* ARABIC LIGATURE THEH WITH YEH FINAL FORM */
- [0xfc7c, 0xfc7c], /* ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM */
- [0xfc7d, 0xfc7d], /* ARABIC LIGATURE FEH WITH YEH FINAL FORM */
- [0xfc7e, 0xfc7e], /* ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM */
- [0xfc7f, 0xfc7f], /* ARABIC LIGATURE QAF WITH YEH FINAL FORM */
- [0xfc80, 0xfc80], /* ARABIC LIGATURE KAF WITH ALEF FINAL FORM */
- [0xfc81, 0xfc81], /* ARABIC LIGATURE KAF WITH LAM FINAL FORM */
- [0xfc82, 0xfc82], /* ARABIC LIGATURE KAF WITH MEEM FINAL FORM */
- [0xfc83, 0xfc83], /* ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM */
- [0xfc84, 0xfc84], /* ARABIC LIGATURE KAF WITH YEH FINAL FORM */
- [0xfc85, 0xfc85], /* ARABIC LIGATURE LAM WITH MEEM FINAL FORM */
- [0xfc86, 0xfc86], /* ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM */
- [0xfc87, 0xfc87], /* ARABIC LIGATURE LAM WITH YEH FINAL FORM */
- [0xfc88, 0xfc88], /* ARABIC LIGATURE MEEM WITH ALEF FINAL FORM */
- [0xfc89, 0xfc89], /* ARABIC LIGATURE MEEM WITH MEEM FINAL FORM */
- [0xfc8a, 0xfc8a], /* ARABIC LIGATURE NOON WITH REH FINAL FORM */
- [0xfc8b, 0xfc8b], /* ARABIC LIGATURE NOON WITH ZAIN FINAL FORM */
- [0xfc8c, 0xfc8c], /* ARABIC LIGATURE NOON WITH MEEM FINAL FORM */
- [0xfc8d, 0xfc8d], /* ARABIC LIGATURE NOON WITH NOON FINAL FORM */
- [0xfc8e, 0xfc8e], /* ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM */
- [0xfc8f, 0xfc8f], /* ARABIC LIGATURE NOON WITH YEH FINAL FORM */
- [0xfc90, 0xfc90], /* ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM */
- [0xfc91, 0xfc91], /* ARABIC LIGATURE YEH WITH REH FINAL FORM */
- [0xfc92, 0xfc92], /* ARABIC LIGATURE YEH WITH ZAIN FINAL FORM */
- [0xfc93, 0xfc93], /* ARABIC LIGATURE YEH WITH MEEM FINAL FORM */
- [0xfc94, 0xfc94], /* ARABIC LIGATURE YEH WITH NOON FINAL FORM */
- [0xfc95, 0xfc95], /* ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM */
- [0xfc96, 0xfc96], /* ARABIC LIGATURE YEH WITH YEH FINAL FORM */
- [0xfc97, 0xfc97], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM */
- [0xfc98, 0xfc98], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM */
- [0xfc99, 0xfc99], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM */
- [0xfc9a, 0xfc9a], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM */
- [0xfc9b, 0xfc9b], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM */
- [0xfc9c, 0xfc9c], /* ARABIC LIGATURE BEH WITH JEEM INITIAL FORM */
- [0xfc9d, 0xfc9d], /* ARABIC LIGATURE BEH WITH HAH INITIAL FORM */
- [0xfc9e, 0xfc9e], /* ARABIC LIGATURE BEH WITH KHAH INITIAL FORM */
- [0xfc9f, 0xfc9f], /* ARABIC LIGATURE BEH WITH MEEM INITIAL FORM */
- [0xfca0, 0xfca0], /* ARABIC LIGATURE BEH WITH HEH INITIAL FORM */
- [0xfca1, 0xfca1], /* ARABIC LIGATURE TEH WITH JEEM INITIAL FORM */
- [0xfca2, 0xfca2], /* ARABIC LIGATURE TEH WITH HAH INITIAL FORM */
- [0xfca3, 0xfca3], /* ARABIC LIGATURE TEH WITH KHAH INITIAL FORM */
- [0xfca4, 0xfca4], /* ARABIC LIGATURE TEH WITH MEEM INITIAL FORM */
- [0xfca5, 0xfca5], /* ARABIC LIGATURE TEH WITH HEH INITIAL FORM */
- [0xfca6, 0xfca6], /* ARABIC LIGATURE THEH WITH MEEM INITIAL FORM */
- [0xfca7, 0xfca7], /* ARABIC LIGATURE JEEM WITH HAH INITIAL FORM */
- [0xfca8, 0xfca8], /* ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM */
- [0xfca9, 0xfca9], /* ARABIC LIGATURE HAH WITH JEEM INITIAL FORM */
- [0xfcaa, 0xfcaa], /* ARABIC LIGATURE HAH WITH MEEM INITIAL FORM */
- [0xfcab, 0xfcab], /* ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM */
- [0xfcac, 0xfcac], /* ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM */
- [0xfcad, 0xfcad], /* ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM */
- [0xfcae, 0xfcae], /* ARABIC LIGATURE SEEN WITH HAH INITIAL FORM */
- [0xfcaf, 0xfcaf], /* ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM */
- [0xfcb0, 0xfcb0], /* ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM */
- [0xfcb1, 0xfcb1], /* ARABIC LIGATURE SAD WITH HAH INITIAL FORM */
- [0xfcb2, 0xfcb2], /* ARABIC LIGATURE SAD WITH KHAH INITIAL FORM */
- [0xfcb3, 0xfcb3], /* ARABIC LIGATURE SAD WITH MEEM INITIAL FORM */
- [0xfcb4, 0xfcb4], /* ARABIC LIGATURE DAD WITH JEEM INITIAL FORM */
- [0xfcb5, 0xfcb5], /* ARABIC LIGATURE DAD WITH HAH INITIAL FORM */
- [0xfcb6, 0xfcb6], /* ARABIC LIGATURE DAD WITH KHAH INITIAL FORM */
- [0xfcb7, 0xfcb7], /* ARABIC LIGATURE DAD WITH MEEM INITIAL FORM */
- [0xfcb8, 0xfcb8], /* ARABIC LIGATURE TAH WITH HAH INITIAL FORM */
- [0xfcb9, 0xfcb9], /* ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM */
- [0xfcba, 0xfcba], /* ARABIC LIGATURE AIN WITH JEEM INITIAL FORM */
- [0xfcbb, 0xfcbb], /* ARABIC LIGATURE AIN WITH MEEM INITIAL FORM */
- [0xfcbc, 0xfcbc], /* ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM */
- [0xfcbd, 0xfcbd], /* ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM */
- [0xfcbe, 0xfcbe], /* ARABIC LIGATURE FEH WITH JEEM INITIAL FORM */
- [0xfcbf, 0xfcbf], /* ARABIC LIGATURE FEH WITH HAH INITIAL FORM */
- [0xfcc0, 0xfcc0], /* ARABIC LIGATURE FEH WITH KHAH INITIAL FORM */
- [0xfcc1, 0xfcc1], /* ARABIC LIGATURE FEH WITH MEEM INITIAL FORM */
- [0xfcc2, 0xfcc2], /* ARABIC LIGATURE QAF WITH HAH INITIAL FORM */
- [0xfcc3, 0xfcc3], /* ARABIC LIGATURE QAF WITH MEEM INITIAL FORM */
- [0xfcc4, 0xfcc4], /* ARABIC LIGATURE KAF WITH JEEM INITIAL FORM */
- [0xfcc5, 0xfcc5], /* ARABIC LIGATURE KAF WITH HAH INITIAL FORM */
- [0xfcc6, 0xfcc6], /* ARABIC LIGATURE KAF WITH KHAH INITIAL FORM */
- [0xfcc7, 0xfcc7], /* ARABIC LIGATURE KAF WITH LAM INITIAL FORM */
- [0xfcc8, 0xfcc8], /* ARABIC LIGATURE KAF WITH MEEM INITIAL FORM */
- [0xfcc9, 0xfcc9], /* ARABIC LIGATURE LAM WITH JEEM INITIAL FORM */
- [0xfcca, 0xfcca], /* ARABIC LIGATURE LAM WITH HAH INITIAL FORM */
- [0xfccb, 0xfccb], /* ARABIC LIGATURE LAM WITH KHAH INITIAL FORM */
- [0xfccc, 0xfccc], /* ARABIC LIGATURE LAM WITH MEEM INITIAL FORM */
- [0xfccd, 0xfccd], /* ARABIC LIGATURE LAM WITH HEH INITIAL FORM */
- [0xfcce, 0xfcce], /* ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM */
- [0xfccf, 0xfccf], /* ARABIC LIGATURE MEEM WITH HAH INITIAL FORM */
- [0xfcd0, 0xfcd0], /* ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM */
- [0xfcd1, 0xfcd1], /* ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM */
- [0xfcd2, 0xfcd2], /* ARABIC LIGATURE NOON WITH JEEM INITIAL FORM */
- [0xfcd3, 0xfcd3], /* ARABIC LIGATURE NOON WITH HAH INITIAL FORM */
- [0xfcd4, 0xfcd4], /* ARABIC LIGATURE NOON WITH KHAH INITIAL FORM */
- [0xfcd5, 0xfcd5], /* ARABIC LIGATURE NOON WITH MEEM INITIAL FORM */
- [0xfcd6, 0xfcd6], /* ARABIC LIGATURE NOON WITH HEH INITIAL FORM */
- [0xfcd7, 0xfcd7], /* ARABIC LIGATURE HEH WITH JEEM INITIAL FORM */
- [0xfcd8, 0xfcd8], /* ARABIC LIGATURE HEH WITH MEEM INITIAL FORM */
- [0xfcd9, 0xfcd9], /* ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM */
- [0xfcda, 0xfcda], /* ARABIC LIGATURE YEH WITH JEEM INITIAL FORM */
- [0xfcdb, 0xfcdb], /* ARABIC LIGATURE YEH WITH HAH INITIAL FORM */
- [0xfcdc, 0xfcdc], /* ARABIC LIGATURE YEH WITH KHAH INITIAL FORM */
- [0xfcdd, 0xfcdd], /* ARABIC LIGATURE YEH WITH MEEM INITIAL FORM */
- [0xfcde, 0xfcde], /* ARABIC LIGATURE YEH WITH HEH INITIAL FORM */
- [0xfcdf, 0xfcdf], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM */
- [0xfce0, 0xfce0], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM */
- [0xfce1, 0xfce1], /* ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM */
- [0xfce2, 0xfce2], /* ARABIC LIGATURE BEH WITH HEH MEDIAL FORM */
- [0xfce3, 0xfce3], /* ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM */
- [0xfce4, 0xfce4], /* ARABIC LIGATURE TEH WITH HEH MEDIAL FORM */
- [0xfce5, 0xfce5], /* ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM */
- [0xfce6, 0xfce6], /* ARABIC LIGATURE THEH WITH HEH MEDIAL FORM */
- [0xfce7, 0xfce7], /* ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM */
- [0xfce8, 0xfce8], /* ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM */
- [0xfce9, 0xfce9], /* ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM */
- [0xfcea, 0xfcea], /* ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM */
- [0xfceb, 0xfceb], /* ARABIC LIGATURE KAF WITH LAM MEDIAL FORM */
- [0xfcec, 0xfcec], /* ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM */
- [0xfced, 0xfced], /* ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM */
- [0xfcee, 0xfcee], /* ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM */
- [0xfcef, 0xfcef], /* ARABIC LIGATURE NOON WITH HEH MEDIAL FORM */
- [0xfcf0, 0xfcf0], /* ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM */
- [0xfcf1, 0xfcf1], /* ARABIC LIGATURE YEH WITH HEH MEDIAL FORM */
- [0xfcf2, 0xfcf2], /* ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM */
- [0xfcf3, 0xfcf3], /* ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM */
- [0xfcf4, 0xfcf4], /* ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM */
- [0xfcf5, 0xfcf5], /* ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfcf6, 0xfcf6], /* ARABIC LIGATURE TAH WITH YEH ISOLATED FORM */
- [0xfcf7, 0xfcf7], /* ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM */
- [0xfcf8, 0xfcf8], /* ARABIC LIGATURE AIN WITH YEH ISOLATED FORM */
- [0xfcf9, 0xfcf9], /* ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM */
- [0xfcfa, 0xfcfa], /* ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM */
- [0xfcfb, 0xfcfb], /* ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM */
- [0xfcfc, 0xfcfc], /* ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM */
- [0xfcfd, 0xfcfd], /* ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM */
- [0xfcfe, 0xfcfe], /* ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM */
- [0xfcff, 0xfcff], /* ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfd00, 0xfd00], /* ARABIC LIGATURE HAH WITH YEH ISOLATED FORM */
- [0xfd01, 0xfd01], /* ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM */
- [0xfd02, 0xfd02], /* ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM */
- [0xfd03, 0xfd03], /* ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM */
- [0xfd04, 0xfd04], /* ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM */
- [0xfd05, 0xfd05], /* ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM */
- [0xfd06, 0xfd06], /* ARABIC LIGATURE SAD WITH YEH ISOLATED FORM */
- [0xfd07, 0xfd07], /* ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM */
- [0xfd08, 0xfd08], /* ARABIC LIGATURE DAD WITH YEH ISOLATED FORM */
- [0xfd09, 0xfd09], /* ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM */
- [0xfd0a, 0xfd0a], /* ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM */
- [0xfd0b, 0xfd0b], /* ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM */
- [0xfd0c, 0xfd0c], /* ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM */
- [0xfd0d, 0xfd0d], /* ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM */
- [0xfd0e, 0xfd0e], /* ARABIC LIGATURE SEEN WITH REH ISOLATED FORM */
- [0xfd0f, 0xfd0f], /* ARABIC LIGATURE SAD WITH REH ISOLATED FORM */
- [0xfd10, 0xfd10], /* ARABIC LIGATURE DAD WITH REH ISOLATED FORM */
- [0xfd11, 0xfd11], /* ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM */
- [0xfd12, 0xfd12], /* ARABIC LIGATURE TAH WITH YEH FINAL FORM */
- [0xfd13, 0xfd13], /* ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM */
- [0xfd14, 0xfd14], /* ARABIC LIGATURE AIN WITH YEH FINAL FORM */
- [0xfd15, 0xfd15], /* ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM */
- [0xfd16, 0xfd16], /* ARABIC LIGATURE GHAIN WITH YEH FINAL FORM */
- [0xfd17, 0xfd17], /* ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM */
- [0xfd18, 0xfd18], /* ARABIC LIGATURE SEEN WITH YEH FINAL FORM */
- [0xfd19, 0xfd19], /* ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM */
- [0xfd1a, 0xfd1a], /* ARABIC LIGATURE SHEEN WITH YEH FINAL FORM */
- [0xfd1b, 0xfd1b], /* ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM */
- [0xfd1c, 0xfd1c], /* ARABIC LIGATURE HAH WITH YEH FINAL FORM */
- [0xfd1d, 0xfd1d], /* ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfd1e, 0xfd1e], /* ARABIC LIGATURE JEEM WITH YEH FINAL FORM */
- [0xfd1f, 0xfd1f], /* ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM */
- [0xfd20, 0xfd20], /* ARABIC LIGATURE KHAH WITH YEH FINAL FORM */
- [0xfd21, 0xfd21], /* ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM */
- [0xfd22, 0xfd22], /* ARABIC LIGATURE SAD WITH YEH FINAL FORM */
- [0xfd23, 0xfd23], /* ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM */
- [0xfd24, 0xfd24], /* ARABIC LIGATURE DAD WITH YEH FINAL FORM */
- [0xfd25, 0xfd25], /* ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM */
- [0xfd26, 0xfd26], /* ARABIC LIGATURE SHEEN WITH HAH FINAL FORM */
- [0xfd27, 0xfd27], /* ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM */
- [0xfd28, 0xfd28], /* ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM */
- [0xfd29, 0xfd29], /* ARABIC LIGATURE SHEEN WITH REH FINAL FORM */
- [0xfd2a, 0xfd2a], /* ARABIC LIGATURE SEEN WITH REH FINAL FORM */
- [0xfd2b, 0xfd2b], /* ARABIC LIGATURE SAD WITH REH FINAL FORM */
- [0xfd2c, 0xfd2c], /* ARABIC LIGATURE DAD WITH REH FINAL FORM */
- [0xfd2d, 0xfd2d], /* ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM */
- [0xfd2e, 0xfd2e], /* ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM */
- [0xfd2f, 0xfd2f], /* ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM */
- [0xfd30, 0xfd30], /* ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM */
- [0xfd31, 0xfd31], /* ARABIC LIGATURE SEEN WITH HEH INITIAL FORM */
- [0xfd32, 0xfd32], /* ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM */
- [0xfd33, 0xfd33], /* ARABIC LIGATURE TAH WITH MEEM INITIAL FORM */
- [0xfd34, 0xfd34], /* ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM */
- [0xfd35, 0xfd35], /* ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM */
- [0xfd36, 0xfd36], /* ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM */
- [0xfd37, 0xfd37], /* ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM */
- [0xfd38, 0xfd38], /* ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM */
- [0xfd39, 0xfd39], /* ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM */
- [0xfd3a, 0xfd3a], /* ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM */
- [0xfd3b, 0xfd3b], /* ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM */
- [0xfd3c, 0xfd3c], /* ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM */
- [0xfd3d, 0xfd3d], /* ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM */
- [0xfd3e, 0xfd3e], /* ORNATE LEFT PARENTHESIS */
- [0xfd3f, 0xfd3f], /* ORNATE RIGHT PARENTHESIS */
- [0xfd40, 0xfd40],
- [0xfd41, 0xfd41],
- [0xfd42, 0xfd42],
- [0xfd43, 0xfd43],
- [0xfd44, 0xfd44],
- [0xfd45, 0xfd45],
- [0xfd46, 0xfd46],
- [0xfd47, 0xfd47],
- [0xfd48, 0xfd48],
- [0xfd49, 0xfd49],
- [0xfd4a, 0xfd4a],
- [0xfd4b, 0xfd4b],
- [0xfd4c, 0xfd4c],
- [0xfd4d, 0xfd4d],
- [0xfd4e, 0xfd4e],
- [0xfd4f, 0xfd4f],
- [0xfd50, 0xfd50], /* ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM */
- [0xfd51, 0xfd51], /* ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM */
- [0xfd52, 0xfd52], /* ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM */
- [0xfd53, 0xfd53], /* ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM */
- [0xfd54, 0xfd54], /* ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM */
- [0xfd55, 0xfd55], /* ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM */
- [0xfd56, 0xfd56], /* ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM */
- [0xfd57, 0xfd57], /* ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM */
- [0xfd58, 0xfd58], /* ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM */
- [0xfd59, 0xfd59], /* ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM */
- [0xfd5a, 0xfd5a], /* ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM */
- [0xfd5b, 0xfd5b], /* ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfd5c, 0xfd5c], /* ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM */
- [0xfd5d, 0xfd5d], /* ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM */
- [0xfd5e, 0xfd5e], /* ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfd5f, 0xfd5f], /* ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM */
- [0xfd60, 0xfd60], /* ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM */
- [0xfd61, 0xfd61], /* ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM */
- [0xfd62, 0xfd62], /* ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM */
- [0xfd63, 0xfd63], /* ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM */
- [0xfd64, 0xfd64], /* ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM */
- [0xfd65, 0xfd65], /* ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM */
- [0xfd66, 0xfd66], /* ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM */
- [0xfd67, 0xfd67], /* ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM */
- [0xfd68, 0xfd68], /* ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM */
- [0xfd69, 0xfd69], /* ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM */
- [0xfd6a, 0xfd6a], /* ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM */
- [0xfd6b, 0xfd6b], /* ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM */
- [0xfd6c, 0xfd6c], /* ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM */
- [0xfd6d, 0xfd6d], /* ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM */
- [0xfd6e, 0xfd6e], /* ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM */
- [0xfd6f, 0xfd6f], /* ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM */
- [0xfd70, 0xfd70], /* ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM */
- [0xfd71, 0xfd71], /* ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM */
- [0xfd72, 0xfd72], /* ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM */
- [0xfd73, 0xfd73], /* ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM */
- [0xfd74, 0xfd74], /* ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM */
- [0xfd75, 0xfd75], /* ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM */
- [0xfd76, 0xfd76], /* ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM */
- [0xfd77, 0xfd77], /* ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM */
- [0xfd78, 0xfd78], /* ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfd79, 0xfd79], /* ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM */
- [0xfd7a, 0xfd7a], /* ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM */
- [0xfd7b, 0xfd7b], /* ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfd7c, 0xfd7c], /* ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM */
- [0xfd7d, 0xfd7d], /* ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM */
- [0xfd7e, 0xfd7e], /* ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM */
- [0xfd7f, 0xfd7f], /* ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM */
- [0xfd80, 0xfd80], /* ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM */
- [0xfd81, 0xfd81], /* ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM */
- [0xfd82, 0xfd82], /* ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM */
- [0xfd83, 0xfd83], /* ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM */
- [0xfd84, 0xfd84], /* ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM */
- [0xfd85, 0xfd85], /* ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM */
- [0xfd86, 0xfd86], /* ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM */
- [0xfd87, 0xfd87], /* ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM */
- [0xfd88, 0xfd88], /* ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM */
- [0xfd89, 0xfd89], /* ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM */
- [0xfd8a, 0xfd8a], /* ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM */
- [0xfd8b, 0xfd8b], /* ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM */
- [0xfd8c, 0xfd8c], /* ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM */
- [0xfd8d, 0xfd8d], /* ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM */
- [0xfd8e, 0xfd8e], /* ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM */
- [0xfd8f, 0xfd8f], /* ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM */
- [0xfd90, 0xfd90],
- [0xfd91, 0xfd91],
- [0xfd92, 0xfd92], /* ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM */
- [0xfd93, 0xfd93], /* ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM */
- [0xfd94, 0xfd94], /* ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM */
- [0xfd95, 0xfd95], /* ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM */
- [0xfd96, 0xfd96], /* ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM */
- [0xfd97, 0xfd97], /* ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM */
- [0xfd98, 0xfd98], /* ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM */
- [0xfd99, 0xfd99], /* ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfd9a, 0xfd9a], /* ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM */
- [0xfd9b, 0xfd9b], /* ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfd9c, 0xfd9c], /* ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM */
- [0xfd9d, 0xfd9d], /* ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM */
- [0xfd9e, 0xfd9e], /* ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM */
- [0xfd9f, 0xfd9f], /* ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM */
- [0xfda0, 0xfda0], /* ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfda1, 0xfda1], /* ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM */
- [0xfda2, 0xfda2], /* ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM */
- [0xfda3, 0xfda3], /* ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM */
- [0xfda4, 0xfda4], /* ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfda5, 0xfda5], /* ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM */
- [0xfda6, 0xfda6], /* ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM */
- [0xfda7, 0xfda7], /* ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM */
- [0xfda8, 0xfda8], /* ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM */
- [0xfda9, 0xfda9], /* ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM */
- [0xfdaa, 0xfdaa], /* ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM */
- [0xfdab, 0xfdab], /* ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM */
- [0xfdac, 0xfdac], /* ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM */
- [0xfdad, 0xfdad], /* ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM */
- [0xfdae, 0xfdae], /* ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM */
- [0xfdaf, 0xfdaf], /* ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM */
- [0xfdb0, 0xfdb0], /* ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM */
- [0xfdb1, 0xfdb1], /* ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM */
- [0xfdb2, 0xfdb2], /* ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM */
- [0xfdb3, 0xfdb3], /* ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM */
- [0xfdb4, 0xfdb4], /* ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM */
- [0xfdb5, 0xfdb5], /* ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM */
- [0xfdb6, 0xfdb6], /* ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM */
- [0xfdb7, 0xfdb7], /* ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM */
- [0xfdb8, 0xfdb8], /* ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM */
- [0xfdb9, 0xfdb9], /* ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM */
- [0xfdba, 0xfdba], /* ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM */
- [0xfdbb, 0xfdbb], /* ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM */
- [0xfdbc, 0xfdbc], /* ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM */
- [0xfdbd, 0xfdbd], /* ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM */
- [0xfdbe, 0xfdbe], /* ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM */
- [0xfdbf, 0xfdbf], /* ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM */
- [0xfdc0, 0xfdc0], /* ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM */
- [0xfdc1, 0xfdc1], /* ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM */
- [0xfdc2, 0xfdc2], /* ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM */
- [0xfdc3, 0xfdc3], /* ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM */
- [0xfdc4, 0xfdc4], /* ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM */
- [0xfdc5, 0xfdc5], /* ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM */
- [0xfdc6, 0xfdc6], /* ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM */
- [0xfdc7, 0xfdc7], /* ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM */
- [0xfdc8, 0xfdc8],
- [0xfdc9, 0xfdc9],
- [0xfdca, 0xfdca],
- [0xfdcb, 0xfdcb],
- [0xfdcc, 0xfdcc],
- [0xfdcd, 0xfdcd],
- [0xfdce, 0xfdce],
- [0xfdcf, 0xfdcf],
- [0xfdd0, 0xfdd0],
- [0xfdd1, 0xfdd1],
- [0xfdd2, 0xfdd2],
- [0xfdd3, 0xfdd3],
- [0xfdd4, 0xfdd4],
- [0xfdd5, 0xfdd5],
- [0xfdd6, 0xfdd6],
- [0xfdd7, 0xfdd7],
- [0xfdd8, 0xfdd8],
- [0xfdd9, 0xfdd9],
- [0xfdda, 0xfdda],
- [0xfddb, 0xfddb],
- [0xfddc, 0xfddc],
- [0xfddd, 0xfddd],
- [0xfdde, 0xfdde],
- [0xfddf, 0xfddf],
- [0xfde0, 0xfde0],
- [0xfde1, 0xfde1],
- [0xfde2, 0xfde2],
- [0xfde3, 0xfde3],
- [0xfde4, 0xfde4],
- [0xfde5, 0xfde5],
- [0xfde6, 0xfde6],
- [0xfde7, 0xfde7],
- [0xfde8, 0xfde8],
- [0xfde9, 0xfde9],
- [0xfdea, 0xfdea],
- [0xfdeb, 0xfdeb],
- [0xfdec, 0xfdec],
- [0xfded, 0xfded],
- [0xfdee, 0xfdee],
- [0xfdef, 0xfdef],
- [0xfdf0, 0xfdf0], /* ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM */
- [0xfdf1, 0xfdf1], /* ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM */
- [0xfdf2, 0xfdf2], /* ARABIC LIGATURE ALLAH ISOLATED FORM */
- [0xfdf3, 0xfdf3], /* ARABIC LIGATURE AKBAR ISOLATED FORM */
- [0xfdf4, 0xfdf4], /* ARABIC LIGATURE MOHAMMAD ISOLATED FORM */
- [0xfdf5, 0xfdf5], /* ARABIC LIGATURE SALAM ISOLATED FORM */
- [0xfdf6, 0xfdf6], /* ARABIC LIGATURE RASOUL ISOLATED FORM */
- [0xfdf7, 0xfdf7], /* ARABIC LIGATURE ALAYHE ISOLATED FORM */
- [0xfdf8, 0xfdf8], /* ARABIC LIGATURE WASALLAM ISOLATED FORM */
- [0xfdf9, 0xfdf9], /* ARABIC LIGATURE SALLA ISOLATED FORM */
- [0xfdfa, 0xfdfa], /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM (ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM) */
- [0xfdfb, 0xfdfb], /* ARABIC LIGATURE JALLAJALALOUHOU (ARABIC LETTER JALLAJALALOUHOU) */
- [0xfdfc, 0xfdfc], /* RIAL SIGN */
- [0xfdfd, 0xfdfd], /* ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM */
- [0xfdfe, 0xfdfe],
- [0xfdff, 0xfdff],
- [0xfe00, 0xfe00], /* VARIATION SELECTOR-1 */
- [0xfe01, 0xfe01], /* VARIATION SELECTOR-2 */
- [0xfe02, 0xfe02], /* VARIATION SELECTOR-3 */
- [0xfe03, 0xfe03], /* VARIATION SELECTOR-4 */
- [0xfe04, 0xfe04], /* VARIATION SELECTOR-5 */
- [0xfe05, 0xfe05], /* VARIATION SELECTOR-6 */
- [0xfe06, 0xfe06], /* VARIATION SELECTOR-7 */
- [0xfe07, 0xfe07], /* VARIATION SELECTOR-8 */
- [0xfe08, 0xfe08], /* VARIATION SELECTOR-9 */
- [0xfe09, 0xfe09], /* VARIATION SELECTOR-10 */
- [0xfe0a, 0xfe0a], /* VARIATION SELECTOR-11 */
- [0xfe0b, 0xfe0b], /* VARIATION SELECTOR-12 */
- [0xfe0c, 0xfe0c], /* VARIATION SELECTOR-13 */
- [0xfe0d, 0xfe0d], /* VARIATION SELECTOR-14 */
- [0xfe0e, 0xfe0e], /* VARIATION SELECTOR-15 */
- [0xfe0f, 0xfe0f], /* VARIATION SELECTOR-16 */
- [0xfe10, 0xfe10], /* PRESENTATION FORM FOR VERTICAL COMMA */
- [0xfe11, 0xfe11], /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA */
- [0xfe12, 0xfe12], /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP */
- [0xfe13, 0xfe13], /* PRESENTATION FORM FOR VERTICAL COLON */
- [0xfe14, 0xfe14], /* PRESENTATION FORM FOR VERTICAL SEMICOLON */
- [0xfe15, 0xfe15], /* PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK */
- [0xfe16, 0xfe16], /* PRESENTATION FORM FOR VERTICAL QUESTION MARK */
- [0xfe17, 0xfe17], /* PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET */
- [0xfe18, 0xfe18], /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET */
- [0xfe19, 0xfe19], /* PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS */
- [0xfe1a, 0xfe1a],
- [0xfe1b, 0xfe1b],
- [0xfe1c, 0xfe1c],
- [0xfe1d, 0xfe1d],
- [0xfe1e, 0xfe1e],
- [0xfe1f, 0xfe1f],
- [0xfe20, 0xfe20], /* COMBINING LIGATURE LEFT HALF */
- [0xfe21, 0xfe21], /* COMBINING LIGATURE RIGHT HALF */
- [0xfe22, 0xfe22], /* COMBINING DOUBLE TILDE LEFT HALF */
- [0xfe23, 0xfe23], /* COMBINING DOUBLE TILDE RIGHT HALF */
- [0xfe24, 0xfe24], /* COMBINING MACRON LEFT HALF */
- [0xfe25, 0xfe25], /* COMBINING MACRON RIGHT HALF */
- [0xfe26, 0xfe26], /* COMBINING CONJOINING MACRON */
- [0xfe27, 0xfe27], /* COMBINING LIGATURE LEFT HALF BELOW */
- [0xfe28, 0xfe28], /* COMBINING LIGATURE RIGHT HALF BELOW */
- [0xfe29, 0xfe29], /* COMBINING TILDE LEFT HALF BELOW */
- [0xfe2a, 0xfe2a], /* COMBINING TILDE RIGHT HALF BELOW */
- [0xfe2b, 0xfe2b], /* COMBINING MACRON LEFT HALF BELOW */
- [0xfe2c, 0xfe2c], /* COMBINING MACRON RIGHT HALF BELOW */
- [0xfe2d, 0xfe2d], /* COMBINING CONJOINING MACRON BELOW */
- [0xfe2e, 0xfe2e], /* COMBINING CYRILLIC TITLO LEFT HALF */
- [0xfe2f, 0xfe2f], /* COMBINING CYRILLIC TITLO RIGHT HALF */
- [0xfe30, 0xfe30], /* PRESENTATION FORM FOR VERTICAL TWO DOT LEADER (GLYPH FOR VERTICAL TWO DOT LEADER) */
- [0xfe31, 0xfe31], /* PRESENTATION FORM FOR VERTICAL EM DASH (GLYPH FOR VERTICAL EM DASH) */
- [0xfe32, 0xfe32], /* PRESENTATION FORM FOR VERTICAL EN DASH (GLYPH FOR VERTICAL EN DASH) */
- [0xfe33, 0xfe33], /* PRESENTATION FORM FOR VERTICAL LOW LINE (GLYPH FOR VERTICAL SPACING UNDERSCORE) */
- [0xfe34, 0xfe34], /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE (GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE) */
- [0xfe35, 0xfe35], /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS (GLYPH FOR VERTICAL OPENING PARENTHESIS) */
- [0xfe36, 0xfe36], /* PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS (GLYPH FOR VERTICAL CLOSING PARENTHESIS) */
- [0xfe37, 0xfe37], /* PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET (GLYPH FOR VERTICAL OPENING CURLY BRACKET) */
- [0xfe38, 0xfe38], /* PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET (GLYPH FOR VERTICAL CLOSING CURLY BRACKET) */
- [0xfe39, 0xfe39], /* PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET (GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET) */
- [0xfe3a, 0xfe3a], /* PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET (GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET) */
- [0xfe3b, 0xfe3b], /* PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET (GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET) */
- [0xfe3c, 0xfe3c], /* PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET (GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET) */
- [0xfe3d, 0xfe3d], /* PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET (GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET) */
- [0xfe3e, 0xfe3e], /* PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET (GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET) */
- [0xfe3f, 0xfe3f], /* PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET (GLYPH FOR VERTICAL OPENING ANGLE BRACKET) */
- [0xfe40, 0xfe40], /* PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET (GLYPH FOR VERTICAL CLOSING ANGLE BRACKET) */
- [0xfe41, 0xfe41], /* PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET (GLYPH FOR VERTICAL OPENING CORNER BRACKET) */
- [0xfe42, 0xfe42], /* PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET (GLYPH FOR VERTICAL CLOSING CORNER BRACKET) */
- [0xfe43, 0xfe43], /* PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET (GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET) */
- [0xfe44, 0xfe44], /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET (GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET) */
- [0xfe45, 0xfe45], /* SESAME DOT */
- [0xfe46, 0xfe46], /* WHITE SESAME DOT */
- [0xfe47, 0xfe47], /* PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET */
- [0xfe48, 0xfe48], /* PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET */
- [0xfe49, 0xfe49], /* DASHED OVERLINE (SPACING DASHED OVERSCORE) */
- [0xfe4a, 0xfe4a], /* CENTRELINE OVERLINE (SPACING CENTERLINE OVERSCORE) */
- [0xfe4b, 0xfe4b], /* WAVY OVERLINE (SPACING WAVY OVERSCORE) */
- [0xfe4c, 0xfe4c], /* DOUBLE WAVY OVERLINE (SPACING DOUBLE WAVY OVERSCORE) */
- [0xfe4d, 0xfe4d], /* DASHED LOW LINE (SPACING DASHED UNDERSCORE) */
- [0xfe4e, 0xfe4e], /* CENTRELINE LOW LINE (SPACING CENTERLINE UNDERSCORE) */
- [0xfe4f, 0xfe4f], /* WAVY LOW LINE (SPACING WAVY UNDERSCORE) */
- [0xfe50, 0xfe50], /* SMALL COMMA */
- [0xfe51, 0xfe51], /* SMALL IDEOGRAPHIC COMMA */
- [0xfe52, 0xfe52], /* SMALL FULL STOP (SMALL PERIOD) */
- [0xfe53, 0xfe53],
- [0xfe54, 0xfe54], /* SMALL SEMICOLON */
- [0xfe55, 0xfe55], /* SMALL COLON */
- [0xfe56, 0xfe56], /* SMALL QUESTION MARK */
- [0xfe57, 0xfe57], /* SMALL EXCLAMATION MARK */
- [0xfe58, 0xfe58], /* SMALL EM DASH */
- [0xfe59, 0xfe59], /* SMALL LEFT PARENTHESIS (SMALL OPENING PARENTHESIS) */
- [0xfe5a, 0xfe5a], /* SMALL RIGHT PARENTHESIS (SMALL CLOSING PARENTHESIS) */
- [0xfe5b, 0xfe5b], /* SMALL LEFT CURLY BRACKET (SMALL OPENING CURLY BRACKET) */
- [0xfe5c, 0xfe5c], /* SMALL RIGHT CURLY BRACKET (SMALL CLOSING CURLY BRACKET) */
- [0xfe5d, 0xfe5d], /* SMALL LEFT TORTOISE SHELL BRACKET (SMALL OPENING TORTOISE SHELL BRACKET) */
- [0xfe5e, 0xfe5e], /* SMALL RIGHT TORTOISE SHELL BRACKET (SMALL CLOSING TORTOISE SHELL BRACKET) */
- [0xfe5f, 0xfe5f], /* SMALL NUMBER SIGN */
- [0xfe60, 0xfe60], /* SMALL AMPERSAND */
- [0xfe61, 0xfe61], /* SMALL ASTERISK */
- [0xfe62, 0xfe62], /* SMALL PLUS SIGN */
- [0xfe63, 0xfe63], /* SMALL HYPHEN-MINUS */
- [0xfe64, 0xfe64], /* SMALL LESS-THAN SIGN */
- [0xfe65, 0xfe65], /* SMALL GREATER-THAN SIGN */
- [0xfe66, 0xfe66], /* SMALL EQUALS SIGN */
- [0xfe67, 0xfe67],
- [0xfe68, 0xfe68], /* SMALL REVERSE SOLIDUS (SMALL BACKSLASH) */
- [0xfe69, 0xfe69], /* SMALL DOLLAR SIGN */
- [0xfe6a, 0xfe6a], /* SMALL PERCENT SIGN */
- [0xfe6b, 0xfe6b], /* SMALL COMMERCIAL AT */
- [0xfe6c, 0xfe6c],
- [0xfe6d, 0xfe6d],
- [0xfe6e, 0xfe6e],
- [0xfe6f, 0xfe6f],
- [0xfe70, 0xfe70], /* ARABIC FATHATAN ISOLATED FORM (ARABIC SPACING FATHATAN) */
- [0xfe71, 0xfe71], /* ARABIC TATWEEL WITH FATHATAN ABOVE (ARABIC FATHATAN ON TATWEEL) */
- [0xfe72, 0xfe72], /* ARABIC DAMMATAN ISOLATED FORM (ARABIC SPACING DAMMATAN) */
- [0xfe73, 0xfe73], /* ARABIC TAIL FRAGMENT */
- [0xfe74, 0xfe74], /* ARABIC KASRATAN ISOLATED FORM (ARABIC SPACING KASRATAN) */
- [0xfe75, 0xfe75],
- [0xfe76, 0xfe76], /* ARABIC FATHA ISOLATED FORM (ARABIC SPACING FATHAH) */
- [0xfe77, 0xfe77], /* ARABIC FATHA MEDIAL FORM (ARABIC FATHAH ON TATWEEL) */
- [0xfe78, 0xfe78], /* ARABIC DAMMA ISOLATED FORM (ARABIC SPACING DAMMAH) */
- [0xfe79, 0xfe79], /* ARABIC DAMMA MEDIAL FORM (ARABIC DAMMAH ON TATWEEL) */
- [0xfe7a, 0xfe7a], /* ARABIC KASRA ISOLATED FORM (ARABIC SPACING KASRAH) */
- [0xfe7b, 0xfe7b], /* ARABIC KASRA MEDIAL FORM (ARABIC KASRAH ON TATWEEL) */
- [0xfe7c, 0xfe7c], /* ARABIC SHADDA ISOLATED FORM (ARABIC SPACING SHADDAH) */
- [0xfe7d, 0xfe7d], /* ARABIC SHADDA MEDIAL FORM (ARABIC SHADDAH ON TATWEEL) */
- [0xfe7e, 0xfe7e], /* ARABIC SUKUN ISOLATED FORM (ARABIC SPACING SUKUN) */
- [0xfe7f, 0xfe7f], /* ARABIC SUKUN MEDIAL FORM (ARABIC SUKUN ON TATWEEL) */
- [0xfe80, 0xfe80], /* ARABIC LETTER HAMZA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH) */
- [0xfe81, 0xfe81], /* ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF) */
- [0xfe82, 0xfe82], /* ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC MADDAH ON ALEF) */
- [0xfe83, 0xfe83], /* ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF) */
- [0xfe84, 0xfe84], /* ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON ALEF) */
- [0xfe85, 0xfe85], /* ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW) */
- [0xfe86, 0xfe86], /* ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON WAW) */
- [0xfe87, 0xfe87], /* ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF) */
- [0xfe88, 0xfe88], /* ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF) */
- [0xfe89, 0xfe89], /* ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON YA) */
- [0xfe8a, 0xfe8a], /* ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON YA) */
- [0xfe8b, 0xfe8b], /* ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM (GLYPH FOR INITIAL ARABIC HAMZAH ON YA) */
- [0xfe8c, 0xfe8c], /* ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HAMZAH ON YA) */
- [0xfe8d, 0xfe8d], /* ARABIC LETTER ALEF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ALEF) */
- [0xfe8e, 0xfe8e], /* ARABIC LETTER ALEF FINAL FORM (GLYPH FOR FINAL ARABIC ALEF) */
- [0xfe8f, 0xfe8f], /* ARABIC LETTER BEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC BAA) */
- [0xfe90, 0xfe90], /* ARABIC LETTER BEH FINAL FORM (GLYPH FOR FINAL ARABIC BAA) */
- [0xfe91, 0xfe91], /* ARABIC LETTER BEH INITIAL FORM (GLYPH FOR INITIAL ARABIC BAA) */
- [0xfe92, 0xfe92], /* ARABIC LETTER BEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC BAA) */
- [0xfe93, 0xfe93], /* ARABIC LETTER TEH MARBUTA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAA MARBUTAH) */
- [0xfe94, 0xfe94], /* ARABIC LETTER TEH MARBUTA FINAL FORM (GLYPH FOR FINAL ARABIC TAA MARBUTAH) */
- [0xfe95, 0xfe95], /* ARABIC LETTER TEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAA) */
- [0xfe96, 0xfe96], /* ARABIC LETTER TEH FINAL FORM (GLYPH FOR FINAL ARABIC TAA) */
- [0xfe97, 0xfe97], /* ARABIC LETTER TEH INITIAL FORM (GLYPH FOR INITIAL ARABIC TAA) */
- [0xfe98, 0xfe98], /* ARABIC LETTER TEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC TAA) */
- [0xfe99, 0xfe99], /* ARABIC LETTER THEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC THAA) */
- [0xfe9a, 0xfe9a], /* ARABIC LETTER THEH FINAL FORM (GLYPH FOR FINAL ARABIC THAA) */
- [0xfe9b, 0xfe9b], /* ARABIC LETTER THEH INITIAL FORM (GLYPH FOR INITIAL ARABIC THAA) */
- [0xfe9c, 0xfe9c], /* ARABIC LETTER THEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC THAA) */
- [0xfe9d, 0xfe9d], /* ARABIC LETTER JEEM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC JEEM) */
- [0xfe9e, 0xfe9e], /* ARABIC LETTER JEEM FINAL FORM (GLYPH FOR FINAL ARABIC JEEM) */
- [0xfe9f, 0xfe9f], /* ARABIC LETTER JEEM INITIAL FORM (GLYPH FOR INITIAL ARABIC JEEM) */
- [0xfea0, 0xfea0], /* ARABIC LETTER JEEM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC JEEM) */
- [0xfea1, 0xfea1], /* ARABIC LETTER HAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAA) */
- [0xfea2, 0xfea2], /* ARABIC LETTER HAH FINAL FORM (GLYPH FOR FINAL ARABIC HAA) */
- [0xfea3, 0xfea3], /* ARABIC LETTER HAH INITIAL FORM (GLYPH FOR INITIAL ARABIC HAA) */
- [0xfea4, 0xfea4], /* ARABIC LETTER HAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HAA) */
- [0xfea5, 0xfea5], /* ARABIC LETTER KHAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC KHAA) */
- [0xfea6, 0xfea6], /* ARABIC LETTER KHAH FINAL FORM (GLYPH FOR FINAL ARABIC KHAA) */
- [0xfea7, 0xfea7], /* ARABIC LETTER KHAH INITIAL FORM (GLYPH FOR INITIAL ARABIC KHAA) */
- [0xfea8, 0xfea8], /* ARABIC LETTER KHAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC KHAA) */
- [0xfea9, 0xfea9], /* ARABIC LETTER DAL ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DAL) */
- [0xfeaa, 0xfeaa], /* ARABIC LETTER DAL FINAL FORM (GLYPH FOR FINAL ARABIC DAL) */
- [0xfeab, 0xfeab], /* ARABIC LETTER THAL ISOLATED FORM (GLYPH FOR ISOLATE ARABIC THAL) */
- [0xfeac, 0xfeac], /* ARABIC LETTER THAL FINAL FORM (GLYPH FOR FINAL ARABIC THAL) */
- [0xfead, 0xfead], /* ARABIC LETTER REH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC RA) */
- [0xfeae, 0xfeae], /* ARABIC LETTER REH FINAL FORM (GLYPH FOR FINAL ARABIC RA) */
- [0xfeaf, 0xfeaf], /* ARABIC LETTER ZAIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ZAIN) */
- [0xfeb0, 0xfeb0], /* ARABIC LETTER ZAIN FINAL FORM (GLYPH FOR FINAL ARABIC ZAIN) */
- [0xfeb1, 0xfeb1], /* ARABIC LETTER SEEN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SEEN) */
- [0xfeb2, 0xfeb2], /* ARABIC LETTER SEEN FINAL FORM (GLYPH FOR FINAL ARABIC SEEN) */
- [0xfeb3, 0xfeb3], /* ARABIC LETTER SEEN INITIAL FORM (GLYPH FOR INITIAL ARABIC SEEN) */
- [0xfeb4, 0xfeb4], /* ARABIC LETTER SEEN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SEEN) */
- [0xfeb5, 0xfeb5], /* ARABIC LETTER SHEEN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SHEEN) */
- [0xfeb6, 0xfeb6], /* ARABIC LETTER SHEEN FINAL FORM (GLYPH FOR FINAL ARABIC SHEEN) */
- [0xfeb7, 0xfeb7], /* ARABIC LETTER SHEEN INITIAL FORM (GLYPH FOR INITIAL ARABIC SHEEN) */
- [0xfeb8, 0xfeb8], /* ARABIC LETTER SHEEN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SHEEN) */
- [0xfeb9, 0xfeb9], /* ARABIC LETTER SAD ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SAD) */
- [0xfeba, 0xfeba], /* ARABIC LETTER SAD FINAL FORM (GLYPH FOR FINAL ARABIC SAD) */
- [0xfebb, 0xfebb], /* ARABIC LETTER SAD INITIAL FORM (GLYPH FOR INITIAL ARABIC SAD) */
- [0xfebc, 0xfebc], /* ARABIC LETTER SAD MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SAD) */
- [0xfebd, 0xfebd], /* ARABIC LETTER DAD ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DAD) */
- [0xfebe, 0xfebe], /* ARABIC LETTER DAD FINAL FORM (GLYPH FOR FINAL ARABIC DAD) */
- [0xfebf, 0xfebf], /* ARABIC LETTER DAD INITIAL FORM (GLYPH FOR INITIAL ARABIC DAD) */
- [0xfec0, 0xfec0], /* ARABIC LETTER DAD MEDIAL FORM (GLYPH FOR MEDIAL ARABIC DAD) */
- [0xfec1, 0xfec1], /* ARABIC LETTER TAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAH) */
- [0xfec2, 0xfec2], /* ARABIC LETTER TAH FINAL FORM (GLYPH FOR FINAL ARABIC TAH) */
- [0xfec3, 0xfec3], /* ARABIC LETTER TAH INITIAL FORM (GLYPH FOR INITIAL ARABIC TAH) */
- [0xfec4, 0xfec4], /* ARABIC LETTER TAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC TAH) */
- [0xfec5, 0xfec5], /* ARABIC LETTER ZAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DHAH) */
- [0xfec6, 0xfec6], /* ARABIC LETTER ZAH FINAL FORM (GLYPH FOR FINAL ARABIC DHAH) */
- [0xfec7, 0xfec7], /* ARABIC LETTER ZAH INITIAL FORM (GLYPH FOR INITIAL ARABIC DHAH) */
- [0xfec8, 0xfec8], /* ARABIC LETTER ZAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC DHAH) */
- [0xfec9, 0xfec9], /* ARABIC LETTER AIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC AIN) */
- [0xfeca, 0xfeca], /* ARABIC LETTER AIN FINAL FORM (GLYPH FOR FINAL ARABIC AIN) */
- [0xfecb, 0xfecb], /* ARABIC LETTER AIN INITIAL FORM (GLYPH FOR INITIAL ARABIC AIN) */
- [0xfecc, 0xfecc], /* ARABIC LETTER AIN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC AIN) */
- [0xfecd, 0xfecd], /* ARABIC LETTER GHAIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC GHAIN) */
- [0xfece, 0xfece], /* ARABIC LETTER GHAIN FINAL FORM (GLYPH FOR FINAL ARABIC GHAIN) */
- [0xfecf, 0xfecf], /* ARABIC LETTER GHAIN INITIAL FORM (GLYPH FOR INITIAL ARABIC GHAIN) */
- [0xfed0, 0xfed0], /* ARABIC LETTER GHAIN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC GHAIN) */
- [0xfed1, 0xfed1], /* ARABIC LETTER FEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC FA) */
- [0xfed2, 0xfed2], /* ARABIC LETTER FEH FINAL FORM (GLYPH FOR FINAL ARABIC FA) */
- [0xfed3, 0xfed3], /* ARABIC LETTER FEH INITIAL FORM (GLYPH FOR INITIAL ARABIC FA) */
- [0xfed4, 0xfed4], /* ARABIC LETTER FEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC FA) */
- [0xfed5, 0xfed5], /* ARABIC LETTER QAF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC QAF) */
- [0xfed6, 0xfed6], /* ARABIC LETTER QAF FINAL FORM (GLYPH FOR FINAL ARABIC QAF) */
- [0xfed7, 0xfed7], /* ARABIC LETTER QAF INITIAL FORM (GLYPH FOR INITIAL ARABIC QAF) */
- [0xfed8, 0xfed8], /* ARABIC LETTER QAF MEDIAL FORM (GLYPH FOR MEDIAL ARABIC QAF) */
- [0xfed9, 0xfed9], /* ARABIC LETTER KAF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC CAF) */
- [0xfeda, 0xfeda], /* ARABIC LETTER KAF FINAL FORM (GLYPH FOR FINAL ARABIC CAF) */
- [0xfedb, 0xfedb], /* ARABIC LETTER KAF INITIAL FORM (GLYPH FOR INITIAL ARABIC CAF) */
- [0xfedc, 0xfedc], /* ARABIC LETTER KAF MEDIAL FORM (GLYPH FOR MEDIAL ARABIC CAF) */
- [0xfedd, 0xfedd], /* ARABIC LETTER LAM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC LAM) */
- [0xfede, 0xfede], /* ARABIC LETTER LAM FINAL FORM (GLYPH FOR FINAL ARABIC LAM) */
- [0xfedf, 0xfedf], /* ARABIC LETTER LAM INITIAL FORM (GLYPH FOR INITIAL ARABIC LAM) */
- [0xfee0, 0xfee0], /* ARABIC LETTER LAM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC LAM) */
- [0xfee1, 0xfee1], /* ARABIC LETTER MEEM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MEEM) */
- [0xfee2, 0xfee2], /* ARABIC LETTER MEEM FINAL FORM (GLYPH FOR FINAL ARABIC MEEM) */
- [0xfee3, 0xfee3], /* ARABIC LETTER MEEM INITIAL FORM (GLYPH FOR INITIAL ARABIC MEEM) */
- [0xfee4, 0xfee4], /* ARABIC LETTER MEEM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC MEEM) */
- [0xfee5, 0xfee5], /* ARABIC LETTER NOON ISOLATED FORM (GLYPH FOR ISOLATE ARABIC NOON) */
- [0xfee6, 0xfee6], /* ARABIC LETTER NOON FINAL FORM (GLYPH FOR FINAL ARABIC NOON) */
- [0xfee7, 0xfee7], /* ARABIC LETTER NOON INITIAL FORM (GLYPH FOR INITIAL ARABIC NOON) */
- [0xfee8, 0xfee8], /* ARABIC LETTER NOON MEDIAL FORM (GLYPH FOR MEDIAL ARABIC NOON) */
- [0xfee9, 0xfee9], /* ARABIC LETTER HEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HA) */
- [0xfeea, 0xfeea], /* ARABIC LETTER HEH FINAL FORM (GLYPH FOR FINAL ARABIC HA) */
- [0xfeeb, 0xfeeb], /* ARABIC LETTER HEH INITIAL FORM (GLYPH FOR INITIAL ARABIC HA) */
- [0xfeec, 0xfeec], /* ARABIC LETTER HEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HA) */
- [0xfeed, 0xfeed], /* ARABIC LETTER WAW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC WAW) */
- [0xfeee, 0xfeee], /* ARABIC LETTER WAW FINAL FORM (GLYPH FOR FINAL ARABIC WAW) */
- [0xfeef, 0xfeef], /* ARABIC LETTER ALEF MAKSURA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH) */
- [0xfef0, 0xfef0], /* ARABIC LETTER ALEF MAKSURA FINAL FORM (GLYPH FOR FINAL ARABIC ALEF MAQSURAH) */
- [0xfef1, 0xfef1], /* ARABIC LETTER YEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC YA) */
- [0xfef2, 0xfef2], /* ARABIC LETTER YEH FINAL FORM (GLYPH FOR FINAL ARABIC YA) */
- [0xfef3, 0xfef3], /* ARABIC LETTER YEH INITIAL FORM (GLYPH FOR INITIAL ARABIC YA) */
- [0xfef4, 0xfef4], /* ARABIC LETTER YEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC YA) */
- [0xfef5, 0xfef5], /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF) */
- [0xfef6, 0xfef6], /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF) */
- [0xfef7, 0xfef7], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF) */
- [0xfef8, 0xfef8], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF) */
- [0xfef9, 0xfef9], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF) */
- [0xfefa, 0xfefa], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF) */
- [0xfefb, 0xfefb], /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF) */
- [0xfefc, 0xfefc], /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM (GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF) */
- [0xfefd, 0xfefd],
- [0xfefe, 0xfefe],
- [0xfeff, 0xfeff], /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */
- [0xff00, 0xff00],
- [0xff01, 0xff01], /* FULLWIDTH EXCLAMATION MARK */
- [0xff02, 0xff02], /* FULLWIDTH QUOTATION MARK */
- [0xff03, 0xff03], /* FULLWIDTH NUMBER SIGN */
- [0xff04, 0xff04], /* FULLWIDTH DOLLAR SIGN */
- [0xff05, 0xff05], /* FULLWIDTH PERCENT SIGN */
- [0xff06, 0xff06], /* FULLWIDTH AMPERSAND */
- [0xff07, 0xff07], /* FULLWIDTH APOSTROPHE */
- [0xff08, 0xff08], /* FULLWIDTH LEFT PARENTHESIS (FULLWIDTH OPENING PARENTHESIS) */
- [0xff09, 0xff09], /* FULLWIDTH RIGHT PARENTHESIS (FULLWIDTH CLOSING PARENTHESIS) */
- [0xff0a, 0xff0a], /* FULLWIDTH ASTERISK */
- [0xff0b, 0xff0b], /* FULLWIDTH PLUS SIGN */
- [0xff0c, 0xff0c], /* FULLWIDTH COMMA */
- [0xff0d, 0xff0d], /* FULLWIDTH HYPHEN-MINUS */
- [0xff0e, 0xff0e], /* FULLWIDTH FULL STOP (FULLWIDTH PERIOD) */
- [0xff0f, 0xff0f], /* FULLWIDTH SOLIDUS (FULLWIDTH SLASH) */
- [0xff10, 0xff10], /* FULLWIDTH DIGIT ZERO */
- [0xff11, 0xff11], /* FULLWIDTH DIGIT ONE */
- [0xff12, 0xff12], /* FULLWIDTH DIGIT TWO */
- [0xff13, 0xff13], /* FULLWIDTH DIGIT THREE */
- [0xff14, 0xff14], /* FULLWIDTH DIGIT FOUR */
- [0xff15, 0xff15], /* FULLWIDTH DIGIT FIVE */
- [0xff16, 0xff16], /* FULLWIDTH DIGIT SIX */
- [0xff17, 0xff17], /* FULLWIDTH DIGIT SEVEN */
- [0xff18, 0xff18], /* FULLWIDTH DIGIT EIGHT */
- [0xff19, 0xff19], /* FULLWIDTH DIGIT NINE */
- [0xff1a, 0xff1a], /* FULLWIDTH COLON */
- [0xff1b, 0xff1b], /* FULLWIDTH SEMICOLON */
- [0xff1c, 0xff1c], /* FULLWIDTH LESS-THAN SIGN */
- [0xff1d, 0xff1d], /* FULLWIDTH EQUALS SIGN */
- [0xff1e, 0xff1e], /* FULLWIDTH GREATER-THAN SIGN */
- [0xff1f, 0xff1f], /* FULLWIDTH QUESTION MARK */
- [0xff20, 0xff20], /* FULLWIDTH COMMERCIAL AT */
- [0xff21, 0xff41], /* FULLWIDTH LATIN CAPITAL LETTER A */
- [0xff22, 0xff42], /* FULLWIDTH LATIN CAPITAL LETTER B */
- [0xff23, 0xff43], /* FULLWIDTH LATIN CAPITAL LETTER C */
- [0xff24, 0xff44], /* FULLWIDTH LATIN CAPITAL LETTER D */
- [0xff25, 0xff45], /* FULLWIDTH LATIN CAPITAL LETTER E */
- [0xff26, 0xff46], /* FULLWIDTH LATIN CAPITAL LETTER F */
- [0xff27, 0xff47], /* FULLWIDTH LATIN CAPITAL LETTER G */
- [0xff28, 0xff48], /* FULLWIDTH LATIN CAPITAL LETTER H */
- [0xff29, 0xff49], /* FULLWIDTH LATIN CAPITAL LETTER I */
- [0xff2a, 0xff4a], /* FULLWIDTH LATIN CAPITAL LETTER J */
- [0xff2b, 0xff4b], /* FULLWIDTH LATIN CAPITAL LETTER K */
- [0xff2c, 0xff4c], /* FULLWIDTH LATIN CAPITAL LETTER L */
- [0xff2d, 0xff4d], /* FULLWIDTH LATIN CAPITAL LETTER M */
- [0xff2e, 0xff4e], /* FULLWIDTH LATIN CAPITAL LETTER N */
- [0xff2f, 0xff4f], /* FULLWIDTH LATIN CAPITAL LETTER O */
- [0xff30, 0xff50], /* FULLWIDTH LATIN CAPITAL LETTER P */
- [0xff31, 0xff51], /* FULLWIDTH LATIN CAPITAL LETTER Q */
- [0xff32, 0xff52], /* FULLWIDTH LATIN CAPITAL LETTER R */
- [0xff33, 0xff53], /* FULLWIDTH LATIN CAPITAL LETTER S */
- [0xff34, 0xff54], /* FULLWIDTH LATIN CAPITAL LETTER T */
- [0xff35, 0xff55], /* FULLWIDTH LATIN CAPITAL LETTER U */
- [0xff36, 0xff56], /* FULLWIDTH LATIN CAPITAL LETTER V */
- [0xff37, 0xff57], /* FULLWIDTH LATIN CAPITAL LETTER W */
- [0xff38, 0xff58], /* FULLWIDTH LATIN CAPITAL LETTER X */
- [0xff39, 0xff59], /* FULLWIDTH LATIN CAPITAL LETTER Y */
- [0xff3a, 0xff5a], /* FULLWIDTH LATIN CAPITAL LETTER Z */
- [0xff3b, 0xff3b], /* FULLWIDTH LEFT SQUARE BRACKET (FULLWIDTH OPENING SQUARE BRACKET) */
- [0xff3c, 0xff3c], /* FULLWIDTH REVERSE SOLIDUS (FULLWIDTH BACKSLASH) */
- [0xff3d, 0xff3d], /* FULLWIDTH RIGHT SQUARE BRACKET (FULLWIDTH CLOSING SQUARE BRACKET) */
- [0xff3e, 0xff3e], /* FULLWIDTH CIRCUMFLEX ACCENT (FULLWIDTH SPACING CIRCUMFLEX) */
- [0xff3f, 0xff3f], /* FULLWIDTH LOW LINE (FULLWIDTH SPACING UNDERSCORE) */
- [0xff40, 0xff40], /* FULLWIDTH GRAVE ACCENT (FULLWIDTH SPACING GRAVE) */
- [0xff21, 0xff41], /* FULLWIDTH LATIN SMALL LETTER A */
- [0xff22, 0xff42], /* FULLWIDTH LATIN SMALL LETTER B */
- [0xff23, 0xff43], /* FULLWIDTH LATIN SMALL LETTER C */
- [0xff24, 0xff44], /* FULLWIDTH LATIN SMALL LETTER D */
- [0xff25, 0xff45], /* FULLWIDTH LATIN SMALL LETTER E */
- [0xff26, 0xff46], /* FULLWIDTH LATIN SMALL LETTER F */
- [0xff27, 0xff47], /* FULLWIDTH LATIN SMALL LETTER G */
- [0xff28, 0xff48], /* FULLWIDTH LATIN SMALL LETTER H */
- [0xff29, 0xff49], /* FULLWIDTH LATIN SMALL LETTER I */
- [0xff2a, 0xff4a], /* FULLWIDTH LATIN SMALL LETTER J */
- [0xff2b, 0xff4b], /* FULLWIDTH LATIN SMALL LETTER K */
- [0xff2c, 0xff4c], /* FULLWIDTH LATIN SMALL LETTER L */
- [0xff2d, 0xff4d], /* FULLWIDTH LATIN SMALL LETTER M */
- [0xff2e, 0xff4e], /* FULLWIDTH LATIN SMALL LETTER N */
- [0xff2f, 0xff4f], /* FULLWIDTH LATIN SMALL LETTER O */
- [0xff30, 0xff50], /* FULLWIDTH LATIN SMALL LETTER P */
- [0xff31, 0xff51], /* FULLWIDTH LATIN SMALL LETTER Q */
- [0xff32, 0xff52], /* FULLWIDTH LATIN SMALL LETTER R */
- [0xff33, 0xff53], /* FULLWIDTH LATIN SMALL LETTER S */
- [0xff34, 0xff54], /* FULLWIDTH LATIN SMALL LETTER T */
- [0xff35, 0xff55], /* FULLWIDTH LATIN SMALL LETTER U */
- [0xff36, 0xff56], /* FULLWIDTH LATIN SMALL LETTER V */
- [0xff37, 0xff57], /* FULLWIDTH LATIN SMALL LETTER W */
- [0xff38, 0xff58], /* FULLWIDTH LATIN SMALL LETTER X */
- [0xff39, 0xff59], /* FULLWIDTH LATIN SMALL LETTER Y */
- [0xff3a, 0xff5a], /* FULLWIDTH LATIN SMALL LETTER Z */
- [0xff5b, 0xff5b], /* FULLWIDTH LEFT CURLY BRACKET (FULLWIDTH OPENING CURLY BRACKET) */
- [0xff5c, 0xff5c], /* FULLWIDTH VERTICAL LINE (FULLWIDTH VERTICAL BAR) */
- [0xff5d, 0xff5d], /* FULLWIDTH RIGHT CURLY BRACKET (FULLWIDTH CLOSING CURLY BRACKET) */
- [0xff5e, 0xff5e], /* FULLWIDTH TILDE (FULLWIDTH SPACING TILDE) */
- [0xff5f, 0xff5f], /* FULLWIDTH LEFT WHITE PARENTHESIS */
- [0xff60, 0xff60], /* FULLWIDTH RIGHT WHITE PARENTHESIS */
- [0xff61, 0xff61], /* HALFWIDTH IDEOGRAPHIC FULL STOP (HALFWIDTH IDEOGRAPHIC PERIOD) */
- [0xff62, 0xff62], /* HALFWIDTH LEFT CORNER BRACKET (HALFWIDTH OPENING CORNER BRACKET) */
- [0xff63, 0xff63], /* HALFWIDTH RIGHT CORNER BRACKET (HALFWIDTH CLOSING CORNER BRACKET) */
- [0xff64, 0xff64], /* HALFWIDTH IDEOGRAPHIC COMMA */
- [0xff65, 0xff65], /* HALFWIDTH KATAKANA MIDDLE DOT */
- [0xff66, 0xff66], /* HALFWIDTH KATAKANA LETTER WO */
- [0xff67, 0xff67], /* HALFWIDTH KATAKANA LETTER SMALL A */
- [0xff68, 0xff68], /* HALFWIDTH KATAKANA LETTER SMALL I */
- [0xff69, 0xff69], /* HALFWIDTH KATAKANA LETTER SMALL U */
- [0xff6a, 0xff6a], /* HALFWIDTH KATAKANA LETTER SMALL E */
- [0xff6b, 0xff6b], /* HALFWIDTH KATAKANA LETTER SMALL O */
- [0xff6c, 0xff6c], /* HALFWIDTH KATAKANA LETTER SMALL YA */
- [0xff6d, 0xff6d], /* HALFWIDTH KATAKANA LETTER SMALL YU */
- [0xff6e, 0xff6e], /* HALFWIDTH KATAKANA LETTER SMALL YO */
- [0xff6f, 0xff6f], /* HALFWIDTH KATAKANA LETTER SMALL TU */
- [0xff70, 0xff70], /* HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK */
- [0xff71, 0xff71], /* HALFWIDTH KATAKANA LETTER A */
- [0xff72, 0xff72], /* HALFWIDTH KATAKANA LETTER I */
- [0xff73, 0xff73], /* HALFWIDTH KATAKANA LETTER U */
- [0xff74, 0xff74], /* HALFWIDTH KATAKANA LETTER E */
- [0xff75, 0xff75], /* HALFWIDTH KATAKANA LETTER O */
- [0xff76, 0xff76], /* HALFWIDTH KATAKANA LETTER KA */
- [0xff77, 0xff77], /* HALFWIDTH KATAKANA LETTER KI */
- [0xff78, 0xff78], /* HALFWIDTH KATAKANA LETTER KU */
- [0xff79, 0xff79], /* HALFWIDTH KATAKANA LETTER KE */
- [0xff7a, 0xff7a], /* HALFWIDTH KATAKANA LETTER KO */
- [0xff7b, 0xff7b], /* HALFWIDTH KATAKANA LETTER SA */
- [0xff7c, 0xff7c], /* HALFWIDTH KATAKANA LETTER SI */
- [0xff7d, 0xff7d], /* HALFWIDTH KATAKANA LETTER SU */
- [0xff7e, 0xff7e], /* HALFWIDTH KATAKANA LETTER SE */
- [0xff7f, 0xff7f], /* HALFWIDTH KATAKANA LETTER SO */
- [0xff80, 0xff80], /* HALFWIDTH KATAKANA LETTER TA */
- [0xff81, 0xff81], /* HALFWIDTH KATAKANA LETTER TI */
- [0xff82, 0xff82], /* HALFWIDTH KATAKANA LETTER TU */
- [0xff83, 0xff83], /* HALFWIDTH KATAKANA LETTER TE */
- [0xff84, 0xff84], /* HALFWIDTH KATAKANA LETTER TO */
- [0xff85, 0xff85], /* HALFWIDTH KATAKANA LETTER NA */
- [0xff86, 0xff86], /* HALFWIDTH KATAKANA LETTER NI */
- [0xff87, 0xff87], /* HALFWIDTH KATAKANA LETTER NU */
- [0xff88, 0xff88], /* HALFWIDTH KATAKANA LETTER NE */
- [0xff89, 0xff89], /* HALFWIDTH KATAKANA LETTER NO */
- [0xff8a, 0xff8a], /* HALFWIDTH KATAKANA LETTER HA */
- [0xff8b, 0xff8b], /* HALFWIDTH KATAKANA LETTER HI */
- [0xff8c, 0xff8c], /* HALFWIDTH KATAKANA LETTER HU */
- [0xff8d, 0xff8d], /* HALFWIDTH KATAKANA LETTER HE */
- [0xff8e, 0xff8e], /* HALFWIDTH KATAKANA LETTER HO */
- [0xff8f, 0xff8f], /* HALFWIDTH KATAKANA LETTER MA */
- [0xff90, 0xff90], /* HALFWIDTH KATAKANA LETTER MI */
- [0xff91, 0xff91], /* HALFWIDTH KATAKANA LETTER MU */
- [0xff92, 0xff92], /* HALFWIDTH KATAKANA LETTER ME */
- [0xff93, 0xff93], /* HALFWIDTH KATAKANA LETTER MO */
- [0xff94, 0xff94], /* HALFWIDTH KATAKANA LETTER YA */
- [0xff95, 0xff95], /* HALFWIDTH KATAKANA LETTER YU */
- [0xff96, 0xff96], /* HALFWIDTH KATAKANA LETTER YO */
- [0xff97, 0xff97], /* HALFWIDTH KATAKANA LETTER RA */
- [0xff98, 0xff98], /* HALFWIDTH KATAKANA LETTER RI */
- [0xff99, 0xff99], /* HALFWIDTH KATAKANA LETTER RU */
- [0xff9a, 0xff9a], /* HALFWIDTH KATAKANA LETTER RE */
- [0xff9b, 0xff9b], /* HALFWIDTH KATAKANA LETTER RO */
- [0xff9c, 0xff9c], /* HALFWIDTH KATAKANA LETTER WA */
- [0xff9d, 0xff9d], /* HALFWIDTH KATAKANA LETTER N */
- [0xff9e, 0xff9e], /* HALFWIDTH KATAKANA VOICED SOUND MARK */
- [0xff9f, 0xff9f], /* HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK */
- [0xffa0, 0xffa0], /* HALFWIDTH HANGUL FILLER (HALFWIDTH HANGUL CAE OM) */
- [0xffa1, 0xffa1], /* HALFWIDTH HANGUL LETTER KIYEOK (HALFWIDTH HANGUL LETTER GIYEOG) */
- [0xffa2, 0xffa2], /* HALFWIDTH HANGUL LETTER SSANGKIYEOK (HALFWIDTH HANGUL LETTER SSANG GIYEOG) */
- [0xffa3, 0xffa3], /* HALFWIDTH HANGUL LETTER KIYEOK-SIOS (HALFWIDTH HANGUL LETTER GIYEOG SIOS) */
- [0xffa4, 0xffa4], /* HALFWIDTH HANGUL LETTER NIEUN */
- [0xffa5, 0xffa5], /* HALFWIDTH HANGUL LETTER NIEUN-CIEUC (HALFWIDTH HANGUL LETTER NIEUN JIEUJ) */
- [0xffa6, 0xffa6], /* HALFWIDTH HANGUL LETTER NIEUN-HIEUH (HALFWIDTH HANGUL LETTER NIEUN HIEUH) */
- [0xffa7, 0xffa7], /* HALFWIDTH HANGUL LETTER TIKEUT (HALFWIDTH HANGUL LETTER DIGEUD) */
- [0xffa8, 0xffa8], /* HALFWIDTH HANGUL LETTER SSANGTIKEUT (HALFWIDTH HANGUL LETTER SSANG DIGEUD) */
- [0xffa9, 0xffa9], /* HALFWIDTH HANGUL LETTER RIEUL (HALFWIDTH HANGUL LETTER LIEUL) */
- [0xffaa, 0xffaa], /* HALFWIDTH HANGUL LETTER RIEUL-KIYEOK (HALFWIDTH HANGUL LETTER LIEUL GIYEOG) */
- [0xffab, 0xffab], /* HALFWIDTH HANGUL LETTER RIEUL-MIEUM (HALFWIDTH HANGUL LETTER LIEUL MIEUM) */
- [0xffac, 0xffac], /* HALFWIDTH HANGUL LETTER RIEUL-PIEUP (HALFWIDTH HANGUL LETTER LIEUL BIEUB) */
- [0xffad, 0xffad], /* HALFWIDTH HANGUL LETTER RIEUL-SIOS (HALFWIDTH HANGUL LETTER LIEUL SIOS) */
- [0xffae, 0xffae], /* HALFWIDTH HANGUL LETTER RIEUL-THIEUTH (HALFWIDTH HANGUL LETTER LIEUL TIEUT) */
- [0xffaf, 0xffaf], /* HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH (HALFWIDTH HANGUL LETTER LIEUL PIEUP) */
- [0xffb0, 0xffb0], /* HALFWIDTH HANGUL LETTER RIEUL-HIEUH (HALFWIDTH HANGUL LETTER LIEUL HIEUH) */
- [0xffb1, 0xffb1], /* HALFWIDTH HANGUL LETTER MIEUM */
- [0xffb2, 0xffb2], /* HALFWIDTH HANGUL LETTER PIEUP (HALFWIDTH HANGUL LETTER BIEUB) */
- [0xffb3, 0xffb3], /* HALFWIDTH HANGUL LETTER SSANGPIEUP (HALFWIDTH HANGUL LETTER SSANG BIEUB) */
- [0xffb4, 0xffb4], /* HALFWIDTH HANGUL LETTER PIEUP-SIOS (HALFWIDTH HANGUL LETTER BIEUB SIOS) */
- [0xffb5, 0xffb5], /* HALFWIDTH HANGUL LETTER SIOS */
- [0xffb6, 0xffb6], /* HALFWIDTH HANGUL LETTER SSANGSIOS (HALFWIDTH HANGUL LETTER SSANG SIOS) */
- [0xffb7, 0xffb7], /* HALFWIDTH HANGUL LETTER IEUNG */
- [0xffb8, 0xffb8], /* HALFWIDTH HANGUL LETTER CIEUC (HALFWIDTH HANGUL LETTER JIEUJ) */
- [0xffb9, 0xffb9], /* HALFWIDTH HANGUL LETTER SSANGCIEUC (HALFWIDTH HANGUL LETTER SSANG JIEUJ) */
- [0xffba, 0xffba], /* HALFWIDTH HANGUL LETTER CHIEUCH (HALFWIDTH HANGUL LETTER CIEUC) */
- [0xffbb, 0xffbb], /* HALFWIDTH HANGUL LETTER KHIEUKH (HALFWIDTH HANGUL LETTER KIYEOK) */
- [0xffbc, 0xffbc], /* HALFWIDTH HANGUL LETTER THIEUTH (HALFWIDTH HANGUL LETTER TIEUT) */
- [0xffbd, 0xffbd], /* HALFWIDTH HANGUL LETTER PHIEUPH (HALFWIDTH HANGUL LETTER PIEUP) */
- [0xffbe, 0xffbe], /* HALFWIDTH HANGUL LETTER HIEUH */
- [0xffbf, 0xffbf],
- [0xffc0, 0xffc0],
- [0xffc1, 0xffc1],
- [0xffc2, 0xffc2], /* HALFWIDTH HANGUL LETTER A */
- [0xffc3, 0xffc3], /* HALFWIDTH HANGUL LETTER AE */
- [0xffc4, 0xffc4], /* HALFWIDTH HANGUL LETTER YA */
- [0xffc5, 0xffc5], /* HALFWIDTH HANGUL LETTER YAE */
- [0xffc6, 0xffc6], /* HALFWIDTH HANGUL LETTER EO */
- [0xffc7, 0xffc7], /* HALFWIDTH HANGUL LETTER E */
- [0xffc8, 0xffc8],
- [0xffc9, 0xffc9],
- [0xffca, 0xffca], /* HALFWIDTH HANGUL LETTER YEO */
- [0xffcb, 0xffcb], /* HALFWIDTH HANGUL LETTER YE */
- [0xffcc, 0xffcc], /* HALFWIDTH HANGUL LETTER O */
- [0xffcd, 0xffcd], /* HALFWIDTH HANGUL LETTER WA */
- [0xffce, 0xffce], /* HALFWIDTH HANGUL LETTER WAE */
- [0xffcf, 0xffcf], /* HALFWIDTH HANGUL LETTER OE */
- [0xffd0, 0xffd0],
- [0xffd1, 0xffd1],
- [0xffd2, 0xffd2], /* HALFWIDTH HANGUL LETTER YO */
- [0xffd3, 0xffd3], /* HALFWIDTH HANGUL LETTER U */
- [0xffd4, 0xffd4], /* HALFWIDTH HANGUL LETTER WEO */
- [0xffd5, 0xffd5], /* HALFWIDTH HANGUL LETTER WE */
- [0xffd6, 0xffd6], /* HALFWIDTH HANGUL LETTER WI */
- [0xffd7, 0xffd7], /* HALFWIDTH HANGUL LETTER YU */
- [0xffd8, 0xffd8],
- [0xffd9, 0xffd9],
- [0xffda, 0xffda], /* HALFWIDTH HANGUL LETTER EU */
- [0xffdb, 0xffdb], /* HALFWIDTH HANGUL LETTER YI */
- [0xffdc, 0xffdc], /* HALFWIDTH HANGUL LETTER I */
- [0xffdd, 0xffdd],
- [0xffde, 0xffde],
- [0xffdf, 0xffdf],
- [0xffe0, 0xffe0], /* FULLWIDTH CENT SIGN */
- [0xffe1, 0xffe1], /* FULLWIDTH POUND SIGN */
- [0xffe2, 0xffe2], /* FULLWIDTH NOT SIGN */
- [0xffe3, 0xffe3], /* FULLWIDTH MACRON (FULLWIDTH SPACING MACRON) */
- [0xffe4, 0xffe4], /* FULLWIDTH BROKEN BAR (FULLWIDTH BROKEN VERTICAL BAR) */
- [0xffe5, 0xffe5], /* FULLWIDTH YEN SIGN */
- [0xffe6, 0xffe6], /* FULLWIDTH WON SIGN */
- [0xffe7, 0xffe7],
- [0xffe8, 0xffe8], /* HALFWIDTH FORMS LIGHT VERTICAL */
- [0xffe9, 0xffe9], /* HALFWIDTH LEFTWARDS ARROW */
- [0xffea, 0xffea], /* HALFWIDTH UPWARDS ARROW */
- [0xffeb, 0xffeb], /* HALFWIDTH RIGHTWARDS ARROW */
- [0xffec, 0xffec], /* HALFWIDTH DOWNWARDS ARROW */
- [0xffed, 0xffed], /* HALFWIDTH BLACK SQUARE */
- [0xffee, 0xffee], /* HALFWIDTH WHITE CIRCLE */
- [0xffef, 0xffef],
- [0xfff0, 0xfff0],
- [0xfff1, 0xfff1],
- [0xfff2, 0xfff2],
- [0xfff3, 0xfff3],
- [0xfff4, 0xfff4],
- [0xfff5, 0xfff5],
- [0xfff6, 0xfff6],
- [0xfff7, 0xfff7],
- [0xfff8, 0xfff8],
- [0xfff9, 0xfff9], /* INTERLINEAR ANNOTATION ANCHOR */
- [0xfffa, 0xfffa], /* INTERLINEAR ANNOTATION SEPARATOR */
- [0xfffb, 0xfffb], /* INTERLINEAR ANNOTATION TERMINATOR */
- [0xfffc, 0xfffc], /* OBJECT REPLACEMENT CHARACTER */
- [0xfffd, 0xfffd], /* REPLACEMENT CHARACTER */
- [0xfffe, 0xfffe],
- [0xffff, 0xffff],
+ ["\u0000", "\u0000"], /* <control> (NULL) */
+ ["\u0001", "\u0001"], /* <control> (START OF HEADING) */
+ ["\u0002", "\u0002"], /* <control> (START OF TEXT) */
+ ["\u0003", "\u0003"], /* <control> (END OF TEXT) */
+ ["\u0004", "\u0004"], /* <control> (END OF TRANSMISSION) */
+ ["\u0005", "\u0005"], /* <control> (ENQUIRY) */
+ ["\u0006", "\u0006"], /* <control> (ACKNOWLEDGE) */
+ ["\u0007", "\u0007"], /* <control> (BELL) */
+ ["\u0008", "\u0008"], /* <control> (BACKSPACE) */
+ ["\u0009", "\u0009"], /* <control> (CHARACTER TABULATION) */
+ ["\u000A", "\u000A"], /* <control> (LINE FEED (LF)) */
+ ["\u000B", "\u000B"], /* <control> (LINE TABULATION) */
+ ["\u000C", "\u000C"], /* <control> (FORM FEED (FF)) */
+ ["\u000D", "\u000D"], /* <control> (CARRIAGE RETURN (CR)) */
+ ["\u000E", "\u000E"], /* <control> (SHIFT OUT) */
+ ["\u000F", "\u000F"], /* <control> (SHIFT IN) */
+ ["\u0010", "\u0010"], /* <control> (DATA LINK ESCAPE) */
+ ["\u0011", "\u0011"], /* <control> (DEVICE CONTROL ONE) */
+ ["\u0012", "\u0012"], /* <control> (DEVICE CONTROL TWO) */
+ ["\u0013", "\u0013"], /* <control> (DEVICE CONTROL THREE) */
+ ["\u0014", "\u0014"], /* <control> (DEVICE CONTROL FOUR) */
+ ["\u0015", "\u0015"], /* <control> (NEGATIVE ACKNOWLEDGE) */
+ ["\u0016", "\u0016"], /* <control> (SYNCHRONOUS IDLE) */
+ ["\u0017", "\u0017"], /* <control> (END OF TRANSMISSION BLOCK) */
+ ["\u0018", "\u0018"], /* <control> (CANCEL) */
+ ["\u0019", "\u0019"], /* <control> (END OF MEDIUM) */
+ ["\u001A", "\u001A"], /* <control> (SUBSTITUTE) */
+ ["\u001B", "\u001B"], /* <control> (ESCAPE) */
+ ["\u001C", "\u001C"], /* <control> (INFORMATION SEPARATOR FOUR) */
+ ["\u001D", "\u001D"], /* <control> (INFORMATION SEPARATOR THREE) */
+ ["\u001E", "\u001E"], /* <control> (INFORMATION SEPARATOR TWO) */
+ ["\u001F", "\u001F"], /* <control> (INFORMATION SEPARATOR ONE) */
+ ["\u0020", "\u0020"], /* SPACE */
+ ["\u0021", "\u0021"], /* EXCLAMATION MARK */
+ ["\u0022", "\u0022"], /* QUOTATION MARK */
+ ["\u0023", "\u0023"], /* NUMBER SIGN */
+ ["\u0024", "\u0024"], /* DOLLAR SIGN */
+ ["\u0025", "\u0025"], /* PERCENT SIGN */
+ ["\u0026", "\u0026"], /* AMPERSAND */
+ ["\u0027", "\u0027"], /* APOSTROPHE (APOSTROPHE-QUOTE) */
+ ["\u0028", "\u0028"], /* LEFT PARENTHESIS (OPENING PARENTHESIS) */
+ ["\u0029", "\u0029"], /* RIGHT PARENTHESIS (CLOSING PARENTHESIS) */
+ ["\u002A", "\u002A"], /* ASTERISK */
+ ["\u002B", "\u002B"], /* PLUS SIGN */
+ ["\u002C", "\u002C"], /* COMMA */
+ ["\u002D", "\u002D"], /* HYPHEN-MINUS */
+ ["\u002E", "\u002E"], /* FULL STOP (PERIOD) */
+ ["\u002F", "\u002F"], /* SOLIDUS (SLASH) */
+ ["\u0030", "\u0030"], /* DIGIT ZERO */
+ ["\u0031", "\u0031"], /* DIGIT ONE */
+ ["\u0032", "\u0032"], /* DIGIT TWO */
+ ["\u0033", "\u0033"], /* DIGIT THREE */
+ ["\u0034", "\u0034"], /* DIGIT FOUR */
+ ["\u0035", "\u0035"], /* DIGIT FIVE */
+ ["\u0036", "\u0036"], /* DIGIT SIX */
+ ["\u0037", "\u0037"], /* DIGIT SEVEN */
+ ["\u0038", "\u0038"], /* DIGIT EIGHT */
+ ["\u0039", "\u0039"], /* DIGIT NINE */
+ ["\u003A", "\u003A"], /* COLON */
+ ["\u003B", "\u003B"], /* SEMICOLON */
+ ["\u003C", "\u003C"], /* LESS-THAN SIGN */
+ ["\u003D", "\u003D"], /* EQUALS SIGN */
+ ["\u003E", "\u003E"], /* GREATER-THAN SIGN */
+ ["\u003F", "\u003F"], /* QUESTION MARK */
+ ["\u0040", "\u0040"], /* COMMERCIAL AT */
+ ["\u0041", "\u0061"], /* LATIN CAPITAL LETTER A */
+ ["\u0042", "\u0062"], /* LATIN CAPITAL LETTER B */
+ ["\u0043", "\u0063"], /* LATIN CAPITAL LETTER C */
+ ["\u0044", "\u0064"], /* LATIN CAPITAL LETTER D */
+ ["\u0045", "\u0065"], /* LATIN CAPITAL LETTER E */
+ ["\u0046", "\u0066"], /* LATIN CAPITAL LETTER F */
+ ["\u0047", "\u0067"], /* LATIN CAPITAL LETTER G */
+ ["\u0048", "\u0068"], /* LATIN CAPITAL LETTER H */
+ ["\u0049", "\u0069"], /* LATIN CAPITAL LETTER I */
+ ["\u004A", "\u006A"], /* LATIN CAPITAL LETTER J */
+ ["\u004B", "\u006B"], /* LATIN CAPITAL LETTER K */
+ ["\u004C", "\u006C"], /* LATIN CAPITAL LETTER L */
+ ["\u004D", "\u006D"], /* LATIN CAPITAL LETTER M */
+ ["\u004E", "\u006E"], /* LATIN CAPITAL LETTER N */
+ ["\u004F", "\u006F"], /* LATIN CAPITAL LETTER O */
+ ["\u0050", "\u0070"], /* LATIN CAPITAL LETTER P */
+ ["\u0051", "\u0071"], /* LATIN CAPITAL LETTER Q */
+ ["\u0052", "\u0072"], /* LATIN CAPITAL LETTER R */
+ ["\u0053", "\u0073"], /* LATIN CAPITAL LETTER S */
+ ["\u0054", "\u0074"], /* LATIN CAPITAL LETTER T */
+ ["\u0055", "\u0075"], /* LATIN CAPITAL LETTER U */
+ ["\u0056", "\u0076"], /* LATIN CAPITAL LETTER V */
+ ["\u0057", "\u0077"], /* LATIN CAPITAL LETTER W */
+ ["\u0058", "\u0078"], /* LATIN CAPITAL LETTER X */
+ ["\u0059", "\u0079"], /* LATIN CAPITAL LETTER Y */
+ ["\u005A", "\u007A"], /* LATIN CAPITAL LETTER Z */
+ ["\u005B", "\u005B"], /* LEFT SQUARE BRACKET (OPENING SQUARE BRACKET) */
+ ["\u005C", "\u005C"], /* REVERSE SOLIDUS (BACKSLASH) */
+ ["\u005D", "\u005D"], /* RIGHT SQUARE BRACKET (CLOSING SQUARE BRACKET) */
+ ["\u005E", "\u005E"], /* CIRCUMFLEX ACCENT (SPACING CIRCUMFLEX) */
+ ["\u005F", "\u005F"], /* LOW LINE (SPACING UNDERSCORE) */
+ ["\u0060", "\u0060"], /* GRAVE ACCENT (SPACING GRAVE) */
+ ["\u0041", "\u0061"], /* LATIN SMALL LETTER A */
+ ["\u0042", "\u0062"], /* LATIN SMALL LETTER B */
+ ["\u0043", "\u0063"], /* LATIN SMALL LETTER C */
+ ["\u0044", "\u0064"], /* LATIN SMALL LETTER D */
+ ["\u0045", "\u0065"], /* LATIN SMALL LETTER E */
+ ["\u0046", "\u0066"], /* LATIN SMALL LETTER F */
+ ["\u0047", "\u0067"], /* LATIN SMALL LETTER G */
+ ["\u0048", "\u0068"], /* LATIN SMALL LETTER H */
+ ["\u0049", "\u0069"], /* LATIN SMALL LETTER I */
+ ["\u004A", "\u006A"], /* LATIN SMALL LETTER J */
+ ["\u004B", "\u006B"], /* LATIN SMALL LETTER K */
+ ["\u004C", "\u006C"], /* LATIN SMALL LETTER L */
+ ["\u004D", "\u006D"], /* LATIN SMALL LETTER M */
+ ["\u004E", "\u006E"], /* LATIN SMALL LETTER N */
+ ["\u004F", "\u006F"], /* LATIN SMALL LETTER O */
+ ["\u0050", "\u0070"], /* LATIN SMALL LETTER P */
+ ["\u0051", "\u0071"], /* LATIN SMALL LETTER Q */
+ ["\u0052", "\u0072"], /* LATIN SMALL LETTER R */
+ ["\u0053", "\u0073"], /* LATIN SMALL LETTER S */
+ ["\u0054", "\u0074"], /* LATIN SMALL LETTER T */
+ ["\u0055", "\u0075"], /* LATIN SMALL LETTER U */
+ ["\u0056", "\u0076"], /* LATIN SMALL LETTER V */
+ ["\u0057", "\u0077"], /* LATIN SMALL LETTER W */
+ ["\u0058", "\u0078"], /* LATIN SMALL LETTER X */
+ ["\u0059", "\u0079"], /* LATIN SMALL LETTER Y */
+ ["\u005A", "\u007A"], /* LATIN SMALL LETTER Z */
+ ["\u007B", "\u007B"], /* LEFT CURLY BRACKET (OPENING CURLY BRACKET) */
+ ["\u007C", "\u007C"], /* VERTICAL LINE (VERTICAL BAR) */
+ ["\u007D", "\u007D"], /* RIGHT CURLY BRACKET (CLOSING CURLY BRACKET) */
+ ["\u007E", "\u007E"], /* TILDE */
+ ["\u007F", "\u007F"], /* <control> (DELETE) */
+ ["\u0080", "\u0080"], /* <control> */
+ ["\u0081", "\u0081"], /* <control> */
+ ["\u0082", "\u0082"], /* <control> (BREAK PERMITTED HERE) */
+ ["\u0083", "\u0083"], /* <control> (NO BREAK HERE) */
+ ["\u0084", "\u0084"], /* <control> */
+ ["\u0085", "\u0085"], /* <control> (NEXT LINE (NEL)) */
+ ["\u0086", "\u0086"], /* <control> (START OF SELECTED AREA) */
+ ["\u0087", "\u0087"], /* <control> (END OF SELECTED AREA) */
+ ["\u0088", "\u0088"], /* <control> (CHARACTER TABULATION SET) */
+ ["\u0089", "\u0089"], /* <control> (CHARACTER TABULATION WITH JUSTIFICATION) */
+ ["\u008A", "\u008A"], /* <control> (LINE TABULATION SET) */
+ ["\u008B", "\u008B"], /* <control> (PARTIAL LINE FORWARD) */
+ ["\u008C", "\u008C"], /* <control> (PARTIAL LINE BACKWARD) */
+ ["\u008D", "\u008D"], /* <control> (REVERSE LINE FEED) */
+ ["\u008E", "\u008E"], /* <control> (SINGLE SHIFT TWO) */
+ ["\u008F", "\u008F"], /* <control> (SINGLE SHIFT THREE) */
+ ["\u0090", "\u0090"], /* <control> (DEVICE CONTROL STRING) */
+ ["\u0091", "\u0091"], /* <control> (PRIVATE USE ONE) */
+ ["\u0092", "\u0092"], /* <control> (PRIVATE USE TWO) */
+ ["\u0093", "\u0093"], /* <control> (SET TRANSMIT STATE) */
+ ["\u0094", "\u0094"], /* <control> (CANCEL CHARACTER) */
+ ["\u0095", "\u0095"], /* <control> (MESSAGE WAITING) */
+ ["\u0096", "\u0096"], /* <control> (START OF GUARDED AREA) */
+ ["\u0097", "\u0097"], /* <control> (END OF GUARDED AREA) */
+ ["\u0098", "\u0098"], /* <control> (START OF STRING) */
+ ["\u0099", "\u0099"], /* <control> */
+ ["\u009A", "\u009A"], /* <control> (SINGLE CHARACTER INTRODUCER) */
+ ["\u009B", "\u009B"], /* <control> (CONTROL SEQUENCE INTRODUCER) */
+ ["\u009C", "\u009C"], /* <control> (STRING TERMINATOR) */
+ ["\u009D", "\u009D"], /* <control> (OPERATING SYSTEM COMMAND) */
+ ["\u009E", "\u009E"], /* <control> (PRIVACY MESSAGE) */
+ ["\u009F", "\u009F"], /* <control> (APPLICATION PROGRAM COMMAND) */
+ ["\u00A0", "\u00A0"], /* NO-BREAK SPACE (NON-BREAKING SPACE) */
+ ["\u00A1", "\u00A1"], /* INVERTED EXCLAMATION MARK */
+ ["\u00A2", "\u00A2"], /* CENT SIGN */
+ ["\u00A3", "\u00A3"], /* POUND SIGN */
+ ["\u00A4", "\u00A4"], /* CURRENCY SIGN */
+ ["\u00A5", "\u00A5"], /* YEN SIGN */
+ ["\u00A6", "\u00A6"], /* BROKEN BAR (BROKEN VERTICAL BAR) */
+ ["\u00A7", "\u00A7"], /* SECTION SIGN */
+ ["\u00A8", "\u00A8"], /* DIAERESIS (SPACING DIAERESIS) */
+ ["\u00A9", "\u00A9"], /* COPYRIGHT SIGN */
+ ["\u00AA", "\u00AA"], /* FEMININE ORDINAL INDICATOR */
+ ["\u00AB", "\u00AB"], /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (LEFT POINTING GUILLEMET) */
+ ["\u00AC", "\u00AC"], /* NOT SIGN */
+ ["\u00AD", "\u00AD"], /* SOFT HYPHEN */
+ ["\u00AE", "\u00AE"], /* REGISTERED SIGN (REGISTERED TRADE MARK SIGN) */
+ ["\u00AF", "\u00AF"], /* MACRON (SPACING MACRON) */
+ ["\u00B0", "\u00B0"], /* DEGREE SIGN */
+ ["\u00B1", "\u00B1"], /* PLUS-MINUS SIGN (PLUS-OR-MINUS SIGN) */
+ ["\u00B2", "\u00B2"], /* SUPERSCRIPT TWO (SUPERSCRIPT DIGIT TWO) */
+ ["\u00B3", "\u00B3"], /* SUPERSCRIPT THREE (SUPERSCRIPT DIGIT THREE) */
+ ["\u00B4", "\u00B4"], /* ACUTE ACCENT (SPACING ACUTE) */
+ ["\u039C", "\u00B5"], /* MICRO SIGN */
+ ["\u00B6", "\u00B6"], /* PILCROW SIGN (PARAGRAPH SIGN) */
+ ["\u00B7", "\u00B7"], /* MIDDLE DOT */
+ ["\u00B8", "\u00B8"], /* CEDILLA (SPACING CEDILLA) */
+ ["\u00B9", "\u00B9"], /* SUPERSCRIPT ONE (SUPERSCRIPT DIGIT ONE) */
+ ["\u00BA", "\u00BA"], /* MASCULINE ORDINAL INDICATOR */
+ ["\u00BB", "\u00BB"], /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (RIGHT POINTING GUILLEMET) */
+ ["\u00BC", "\u00BC"], /* VULGAR FRACTION ONE QUARTER (FRACTION ONE QUARTER) */
+ ["\u00BD", "\u00BD"], /* VULGAR FRACTION ONE HALF (FRACTION ONE HALF) */
+ ["\u00BE", "\u00BE"], /* VULGAR FRACTION THREE QUARTERS (FRACTION THREE QUARTERS) */
+ ["\u00BF", "\u00BF"], /* INVERTED QUESTION MARK */
+ ["\u00C0", "\u00E0"], /* LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE) */
+ ["\u00C1", "\u00E1"], /* LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE) */
+ ["\u00C2", "\u00E2"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX) */
+ ["\u00C3", "\u00E3"], /* LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE) */
+ ["\u00C4", "\u00E4"], /* LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS) */
+ ["\u00C5", "\u00E5"], /* LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING) */
+ ["\u00C6", "\u00E6"], /* LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E) */
+ ["\u00C7", "\u00E7"], /* LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA) */
+ ["\u00C8", "\u00E8"], /* LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE) */
+ ["\u00C9", "\u00E9"], /* LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE) */
+ ["\u00CA", "\u00EA"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX) */
+ ["\u00CB", "\u00EB"], /* LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS) */
+ ["\u00CC", "\u00EC"], /* LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE) */
+ ["\u00CD", "\u00ED"], /* LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE) */
+ ["\u00CE", "\u00EE"], /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX) */
+ ["\u00CF", "\u00EF"], /* LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS) */
+ ["\u00D0", "\u00F0"], /* LATIN CAPITAL LETTER ETH */
+ ["\u00D1", "\u00F1"], /* LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE) */
+ ["\u00D2", "\u00F2"], /* LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE) */
+ ["\u00D3", "\u00F3"], /* LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE) */
+ ["\u00D4", "\u00F4"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX) */
+ ["\u00D5", "\u00F5"], /* LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE) */
+ ["\u00D6", "\u00F6"], /* LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS) */
+ ["\u00D7", "\u00D7"], /* MULTIPLICATION SIGN */
+ ["\u00D8", "\u00F8"], /* LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH) */
+ ["\u00D9", "\u00F9"], /* LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE) */
+ ["\u00DA", "\u00FA"], /* LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE) */
+ ["\u00DB", "\u00FB"], /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX) */
+ ["\u00DC", "\u00FC"], /* LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS) */
+ ["\u00DD", "\u00FD"], /* LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE) */
+ ["\u00DE", "\u00FE"], /* LATIN CAPITAL LETTER THORN */
+ ["\u0053\u0053", "\u00DF"], /* LATIN SMALL LETTER SHARP S */
+ ["\u00C0", "\u00E0"], /* LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE) */
+ ["\u00C1", "\u00E1"], /* LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE) */
+ ["\u00C2", "\u00E2"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX) */
+ ["\u00C3", "\u00E3"], /* LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE) */
+ ["\u00C4", "\u00E4"], /* LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS) */
+ ["\u00C5", "\u00E5"], /* LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING) */
+ ["\u00C6", "\u00E6"], /* LATIN SMALL LETTER AE (LATIN SMALL LETTER A E) */
+ ["\u00C7", "\u00E7"], /* LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA) */
+ ["\u00C8", "\u00E8"], /* LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE) */
+ ["\u00C9", "\u00E9"], /* LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE) */
+ ["\u00CA", "\u00EA"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX) */
+ ["\u00CB", "\u00EB"], /* LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS) */
+ ["\u00CC", "\u00EC"], /* LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE) */
+ ["\u00CD", "\u00ED"], /* LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE) */
+ ["\u00CE", "\u00EE"], /* LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX) */
+ ["\u00CF", "\u00EF"], /* LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS) */
+ ["\u00D0", "\u00F0"], /* LATIN SMALL LETTER ETH */
+ ["\u00D1", "\u00F1"], /* LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE) */
+ ["\u00D2", "\u00F2"], /* LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE) */
+ ["\u00D3", "\u00F3"], /* LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE) */
+ ["\u00D4", "\u00F4"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX) */
+ ["\u00D5", "\u00F5"], /* LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE) */
+ ["\u00D6", "\u00F6"], /* LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS) */
+ ["\u00F7", "\u00F7"], /* DIVISION SIGN */
+ ["\u00D8", "\u00F8"], /* LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH) */
+ ["\u00D9", "\u00F9"], /* LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE) */
+ ["\u00DA", "\u00FA"], /* LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE) */
+ ["\u00DB", "\u00FB"], /* LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX) */
+ ["\u00DC", "\u00FC"], /* LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS) */
+ ["\u00DD", "\u00FD"], /* LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE) */
+ ["\u00DE", "\u00FE"], /* LATIN SMALL LETTER THORN */
+ ["\u0178", "\u00FF"], /* LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS) */
+ ["\u0100", "\u0101"], /* LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON) */
+ ["\u0100", "\u0101"], /* LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON) */
+ ["\u0102", "\u0103"], /* LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE) */
+ ["\u0102", "\u0103"], /* LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE) */
+ ["\u0104", "\u0105"], /* LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK) */
+ ["\u0104", "\u0105"], /* LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK) */
+ ["\u0106", "\u0107"], /* LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE) */
+ ["\u0106", "\u0107"], /* LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE) */
+ ["\u0108", "\u0109"], /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX) */
+ ["\u0108", "\u0109"], /* LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX) */
+ ["\u010A", "\u010B"], /* LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT) */
+ ["\u010A", "\u010B"], /* LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT) */
+ ["\u010C", "\u010D"], /* LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK) */
+ ["\u010C", "\u010D"], /* LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK) */
+ ["\u010E", "\u010F"], /* LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK) */
+ ["\u010E", "\u010F"], /* LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK) */
+ ["\u0110", "\u0111"], /* LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR) */
+ ["\u0110", "\u0111"], /* LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR) */
+ ["\u0112", "\u0113"], /* LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON) */
+ ["\u0112", "\u0113"], /* LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON) */
+ ["\u0114", "\u0115"], /* LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE) */
+ ["\u0114", "\u0115"], /* LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE) */
+ ["\u0116", "\u0117"], /* LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT) */
+ ["\u0116", "\u0117"], /* LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT) */
+ ["\u0118", "\u0119"], /* LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK) */
+ ["\u0118", "\u0119"], /* LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK) */
+ ["\u011A", "\u011B"], /* LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK) */
+ ["\u011A", "\u011B"], /* LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK) */
+ ["\u011C", "\u011D"], /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX) */
+ ["\u011C", "\u011D"], /* LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX) */
+ ["\u011E", "\u011F"], /* LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE) */
+ ["\u011E", "\u011F"], /* LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE) */
+ ["\u0120", "\u0121"], /* LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT) */
+ ["\u0120", "\u0121"], /* LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT) */
+ ["\u0122", "\u0123"], /* LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA) */
+ ["\u0122", "\u0123"], /* LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA) */
+ ["\u0124", "\u0125"], /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX) */
+ ["\u0124", "\u0125"], /* LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX) */
+ ["\u0126", "\u0127"], /* LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR) */
+ ["\u0126", "\u0127"], /* LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR) */
+ ["\u0128", "\u0129"], /* LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE) */
+ ["\u0128", "\u0129"], /* LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE) */
+ ["\u012A", "\u012B"], /* LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON) */
+ ["\u012A", "\u012B"], /* LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON) */
+ ["\u012C", "\u012D"], /* LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE) */
+ ["\u012C", "\u012D"], /* LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE) */
+ ["\u012E", "\u012F"], /* LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK) */
+ ["\u012E", "\u012F"], /* LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK) */
+ ["\u0130", "\u0069\u0307"], /* LATIN CAPITAL LETTER I WITH DOT ABOVE (LATIN CAPITAL LETTER I DOT) */
+ ["\u0049", "\u0131"], /* LATIN SMALL LETTER DOTLESS I */
+ ["\u0132", "\u0133"], /* LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J) */
+ ["\u0132", "\u0133"], /* LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J) */
+ ["\u0134", "\u0135"], /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX) */
+ ["\u0134", "\u0135"], /* LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX) */
+ ["\u0136", "\u0137"], /* LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA) */
+ ["\u0136", "\u0137"], /* LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA) */
+ ["\u0138", "\u0138"], /* LATIN SMALL LETTER KRA */
+ ["\u0139", "\u013A"], /* LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE) */
+ ["\u0139", "\u013A"], /* LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE) */
+ ["\u013B", "\u013C"], /* LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA) */
+ ["\u013B", "\u013C"], /* LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA) */
+ ["\u013D", "\u013E"], /* LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK) */
+ ["\u013D", "\u013E"], /* LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK) */
+ ["\u013F", "\u0140"], /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */
+ ["\u013F", "\u0140"], /* LATIN SMALL LETTER L WITH MIDDLE DOT */
+ ["\u0141", "\u0142"], /* LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH) */
+ ["\u0141", "\u0142"], /* LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH) */
+ ["\u0143", "\u0144"], /* LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE) */
+ ["\u0143", "\u0144"], /* LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE) */
+ ["\u0145", "\u0146"], /* LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA) */
+ ["\u0145", "\u0146"], /* LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA) */
+ ["\u0147", "\u0148"], /* LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK) */
+ ["\u0147", "\u0148"], /* LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK) */
+ ["\u02BC\u004E", "\u0149"], /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N) */
+ ["\u014A", "\u014B"], /* LATIN CAPITAL LETTER ENG */
+ ["\u014A", "\u014B"], /* LATIN SMALL LETTER ENG */
+ ["\u014C", "\u014D"], /* LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON) */
+ ["\u014C", "\u014D"], /* LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON) */
+ ["\u014E", "\u014F"], /* LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE) */
+ ["\u014E", "\u014F"], /* LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE) */
+ ["\u0150", "\u0151"], /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE) */
+ ["\u0150", "\u0151"], /* LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE) */
+ ["\u0152", "\u0153"], /* LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E) */
+ ["\u0152", "\u0153"], /* LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E) */
+ ["\u0154", "\u0155"], /* LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE) */
+ ["\u0154", "\u0155"], /* LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE) */
+ ["\u0156", "\u0157"], /* LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA) */
+ ["\u0156", "\u0157"], /* LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA) */
+ ["\u0158", "\u0159"], /* LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK) */
+ ["\u0158", "\u0159"], /* LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK) */
+ ["\u015A", "\u015B"], /* LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE) */
+ ["\u015A", "\u015B"], /* LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE) */
+ ["\u015C", "\u015D"], /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX) */
+ ["\u015C", "\u015D"], /* LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX) */
+ ["\u015E", "\u015F"], /* LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA) */
+ ["\u015E", "\u015F"], /* LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA) */
+ ["\u0160", "\u0161"], /* LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK) */
+ ["\u0160", "\u0161"], /* LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK) */
+ ["\u0162", "\u0163"], /* LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA) */
+ ["\u0162", "\u0163"], /* LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA) */
+ ["\u0164", "\u0165"], /* LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK) */
+ ["\u0164", "\u0165"], /* LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK) */
+ ["\u0166", "\u0167"], /* LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR) */
+ ["\u0166", "\u0167"], /* LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR) */
+ ["\u0168", "\u0169"], /* LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE) */
+ ["\u0168", "\u0169"], /* LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE) */
+ ["\u016A", "\u016B"], /* LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON) */
+ ["\u016A", "\u016B"], /* LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON) */
+ ["\u016C", "\u016D"], /* LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE) */
+ ["\u016C", "\u016D"], /* LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE) */
+ ["\u016E", "\u016F"], /* LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING) */
+ ["\u016E", "\u016F"], /* LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING) */
+ ["\u0170", "\u0171"], /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE) */
+ ["\u0170", "\u0171"], /* LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE) */
+ ["\u0172", "\u0173"], /* LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK) */
+ ["\u0172", "\u0173"], /* LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK) */
+ ["\u0174", "\u0175"], /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX) */
+ ["\u0174", "\u0175"], /* LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX) */
+ ["\u0176", "\u0177"], /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX) */
+ ["\u0176", "\u0177"], /* LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX) */
+ ["\u0178", "\u00FF"], /* LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS) */
+ ["\u0179", "\u017A"], /* LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE) */
+ ["\u0179", "\u017A"], /* LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE) */
+ ["\u017B", "\u017C"], /* LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT) */
+ ["\u017B", "\u017C"], /* LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT) */
+ ["\u017D", "\u017E"], /* LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK) */
+ ["\u017D", "\u017E"], /* LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK) */
+ ["\u0053", "\u017F"], /* LATIN SMALL LETTER LONG S */
+ ["\u0243", "\u0180"], /* LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR) */
+ ["\u0181", "\u0253"], /* LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK) */
+ ["\u0182", "\u0183"], /* LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR) */
+ ["\u0182", "\u0183"], /* LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR) */
+ ["\u0184", "\u0185"], /* LATIN CAPITAL LETTER TONE SIX */
+ ["\u0184", "\u0185"], /* LATIN SMALL LETTER TONE SIX */
+ ["\u0186", "\u0254"], /* LATIN CAPITAL LETTER OPEN O */
+ ["\u0187", "\u0188"], /* LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK) */
+ ["\u0187", "\u0188"], /* LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK) */
+ ["\u0189", "\u0256"], /* LATIN CAPITAL LETTER AFRICAN D */
+ ["\u018A", "\u0257"], /* LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK) */
+ ["\u018B", "\u018C"], /* LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR) */
+ ["\u018B", "\u018C"], /* LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR) */
+ ["\u018D", "\u018D"], /* LATIN SMALL LETTER TURNED DELTA */
+ ["\u018E", "\u01DD"], /* LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E) */
+ ["\u018F", "\u0259"], /* LATIN CAPITAL LETTER SCHWA */
+ ["\u0190", "\u025B"], /* LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON) */
+ ["\u0191", "\u0192"], /* LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK) */
+ ["\u0191", "\u0192"], /* LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F) */
+ ["\u0193", "\u0260"], /* LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK) */
+ ["\u0194", "\u0263"], /* LATIN CAPITAL LETTER GAMMA */
+ ["\u01F6", "\u0195"], /* LATIN SMALL LETTER HV (LATIN SMALL LETTER H V) */
+ ["\u0196", "\u0269"], /* LATIN CAPITAL LETTER IOTA */
+ ["\u0197", "\u0268"], /* LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I) */
+ ["\u0198", "\u0199"], /* LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK) */
+ ["\u0198", "\u0199"], /* LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK) */
+ ["\u023D", "\u019A"], /* LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L) */
+ ["\u019B", "\u019B"], /* LATIN SMALL LETTER LAMBDA WITH STROKE (LATIN SMALL LETTER BARRED LAMBDA) */
+ ["\u019C", "\u026F"], /* LATIN CAPITAL LETTER TURNED M */
+ ["\u019D", "\u0272"], /* LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK) */
+ ["\u0220", "\u019E"], /* LATIN SMALL LETTER N WITH LONG RIGHT LEG */
+ ["\u019F", "\u0275"], /* LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O) */
+ ["\u01A0", "\u01A1"], /* LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN) */
+ ["\u01A0", "\u01A1"], /* LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN) */
+ ["\u01A2", "\u01A3"], /* LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I) */
+ ["\u01A2", "\u01A3"], /* LATIN SMALL LETTER OI (LATIN SMALL LETTER O I) */
+ ["\u01A4", "\u01A5"], /* LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK) */
+ ["\u01A4", "\u01A5"], /* LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK) */
+ ["\u01A6", "\u0280"], /* LATIN LETTER YR (LATIN LETTER Y R) */
+ ["\u01A7", "\u01A8"], /* LATIN CAPITAL LETTER TONE TWO */
+ ["\u01A7", "\u01A8"], /* LATIN SMALL LETTER TONE TWO */
+ ["\u01A9", "\u0283"], /* LATIN CAPITAL LETTER ESH */
+ ["\u01AA", "\u01AA"], /* LATIN LETTER REVERSED ESH LOOP */
+ ["\u01AB", "\u01AB"], /* LATIN SMALL LETTER T WITH PALATAL HOOK (LATIN SMALL LETTER T PALATAL HOOK) */
+ ["\u01AC", "\u01AD"], /* LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK) */
+ ["\u01AC", "\u01AD"], /* LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK) */
+ ["\u01AE", "\u0288"], /* LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK) */
+ ["\u01AF", "\u01B0"], /* LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN) */
+ ["\u01AF", "\u01B0"], /* LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN) */
+ ["\u01B1", "\u028A"], /* LATIN CAPITAL LETTER UPSILON */
+ ["\u01B2", "\u028B"], /* LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V) */
+ ["\u01B3", "\u01B4"], /* LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK) */
+ ["\u01B3", "\u01B4"], /* LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK) */
+ ["\u01B5", "\u01B6"], /* LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR) */
+ ["\u01B5", "\u01B6"], /* LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR) */
+ ["\u01B7", "\u0292"], /* LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH) */
+ ["\u01B8", "\u01B9"], /* LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH) */
+ ["\u01B8", "\u01B9"], /* LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH) */
+ ["\u01BA", "\u01BA"], /* LATIN SMALL LETTER EZH WITH TAIL (LATIN SMALL LETTER YOGH WITH TAIL) */
+ ["\u01BB", "\u01BB"], /* LATIN LETTER TWO WITH STROKE (LATIN LETTER TWO BAR) */
+ ["\u01BC", "\u01BD"], /* LATIN CAPITAL LETTER TONE FIVE */
+ ["\u01BC", "\u01BD"], /* LATIN SMALL LETTER TONE FIVE */
+ ["\u01BE", "\u01BE"], /* LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE (LATIN LETTER INVERTED GLOTTAL STOP BAR) */
+ ["\u01F7", "\u01BF"], /* LATIN LETTER WYNN */
+ ["\u01C0", "\u01C0"], /* LATIN LETTER DENTAL CLICK (LATIN LETTER PIPE) */
+ ["\u01C1", "\u01C1"], /* LATIN LETTER LATERAL CLICK (LATIN LETTER DOUBLE PIPE) */
+ ["\u01C2", "\u01C2"], /* LATIN LETTER ALVEOLAR CLICK (LATIN LETTER PIPE DOUBLE BAR) */
+ ["\u01C3", "\u01C3"], /* LATIN LETTER RETROFLEX CLICK (LATIN LETTER EXCLAMATION MARK) */
+ ["\u01C4", "\u01C6"], /* LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK) */
+ ["\u01C4", "\u01C6"], /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK) */
+ ["\u01C4", "\u01C6"], /* LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK) */
+ ["\u01C7", "\u01C9"], /* LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J) */
+ ["\u01C7", "\u01C9"], /* LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J) */
+ ["\u01C7", "\u01C9"], /* LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J) */
+ ["\u01CA", "\u01CC"], /* LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J) */
+ ["\u01CA", "\u01CC"], /* LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J) */
+ ["\u01CA", "\u01CC"], /* LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J) */
+ ["\u01CD", "\u01CE"], /* LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK) */
+ ["\u01CD", "\u01CE"], /* LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK) */
+ ["\u01CF", "\u01D0"], /* LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK) */
+ ["\u01CF", "\u01D0"], /* LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK) */
+ ["\u01D1", "\u01D2"], /* LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK) */
+ ["\u01D1", "\u01D2"], /* LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK) */
+ ["\u01D3", "\u01D4"], /* LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK) */
+ ["\u01D3", "\u01D4"], /* LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK) */
+ ["\u01D5", "\u01D6"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON) */
+ ["\u01D5", "\u01D6"], /* LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON) */
+ ["\u01D7", "\u01D8"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE) */
+ ["\u01D7", "\u01D8"], /* LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE) */
+ ["\u01D9", "\u01DA"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK) */
+ ["\u01D9", "\u01DA"], /* LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK) */
+ ["\u01DB", "\u01DC"], /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE) */
+ ["\u01DB", "\u01DC"], /* LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE) */
+ ["\u018E", "\u01DD"], /* LATIN SMALL LETTER TURNED E */
+ ["\u01DE", "\u01DF"], /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON) */
+ ["\u01DE", "\u01DF"], /* LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON) */
+ ["\u01E0", "\u01E1"], /* LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON) */
+ ["\u01E0", "\u01E1"], /* LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON) */
+ ["\u01E2", "\u01E3"], /* LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON) */
+ ["\u01E2", "\u01E3"], /* LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON) */
+ ["\u01E4", "\u01E5"], /* LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR) */
+ ["\u01E4", "\u01E5"], /* LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR) */
+ ["\u01E6", "\u01E7"], /* LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK) */
+ ["\u01E6", "\u01E7"], /* LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK) */
+ ["\u01E8", "\u01E9"], /* LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK) */
+ ["\u01E8", "\u01E9"], /* LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK) */
+ ["\u01EA", "\u01EB"], /* LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK) */
+ ["\u01EA", "\u01EB"], /* LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK) */
+ ["\u01EC", "\u01ED"], /* LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON) */
+ ["\u01EC", "\u01ED"], /* LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON) */
+ ["\u01EE", "\u01EF"], /* LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK) */
+ ["\u01EE", "\u01EF"], /* LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK) */
+ ["\u004A\u030C", "\u01F0"], /* LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK) */
+ ["\u01F1", "\u01F3"], /* LATIN CAPITAL LETTER DZ */
+ ["\u01F1", "\u01F3"], /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z */
+ ["\u01F1", "\u01F3"], /* LATIN SMALL LETTER DZ */
+ ["\u01F4", "\u01F5"], /* LATIN CAPITAL LETTER G WITH ACUTE */
+ ["\u01F4", "\u01F5"], /* LATIN SMALL LETTER G WITH ACUTE */
+ ["\u01F6", "\u0195"], /* LATIN CAPITAL LETTER HWAIR */
+ ["\u01F7", "\u01BF"], /* LATIN CAPITAL LETTER WYNN */
+ ["\u01F8", "\u01F9"], /* LATIN CAPITAL LETTER N WITH GRAVE */
+ ["\u01F8", "\u01F9"], /* LATIN SMALL LETTER N WITH GRAVE */
+ ["\u01FA", "\u01FB"], /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */
+ ["\u01FA", "\u01FB"], /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */
+ ["\u01FC", "\u01FD"], /* LATIN CAPITAL LETTER AE WITH ACUTE */
+ ["\u01FC", "\u01FD"], /* LATIN SMALL LETTER AE WITH ACUTE */
+ ["\u01FE", "\u01FF"], /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */
+ ["\u01FE", "\u01FF"], /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */
+ ["\u0200", "\u0201"], /* LATIN CAPITAL LETTER A WITH DOUBLE GRAVE */
+ ["\u0200", "\u0201"], /* LATIN SMALL LETTER A WITH DOUBLE GRAVE */
+ ["\u0202", "\u0203"], /* LATIN CAPITAL LETTER A WITH INVERTED BREVE */
+ ["\u0202", "\u0203"], /* LATIN SMALL LETTER A WITH INVERTED BREVE */
+ ["\u0204", "\u0205"], /* LATIN CAPITAL LETTER E WITH DOUBLE GRAVE */
+ ["\u0204", "\u0205"], /* LATIN SMALL LETTER E WITH DOUBLE GRAVE */
+ ["\u0206", "\u0207"], /* LATIN CAPITAL LETTER E WITH INVERTED BREVE */
+ ["\u0206", "\u0207"], /* LATIN SMALL LETTER E WITH INVERTED BREVE */
+ ["\u0208", "\u0209"], /* LATIN CAPITAL LETTER I WITH DOUBLE GRAVE */
+ ["\u0208", "\u0209"], /* LATIN SMALL LETTER I WITH DOUBLE GRAVE */
+ ["\u020A", "\u020B"], /* LATIN CAPITAL LETTER I WITH INVERTED BREVE */
+ ["\u020A", "\u020B"], /* LATIN SMALL LETTER I WITH INVERTED BREVE */
+ ["\u020C", "\u020D"], /* LATIN CAPITAL LETTER O WITH DOUBLE GRAVE */
+ ["\u020C", "\u020D"], /* LATIN SMALL LETTER O WITH DOUBLE GRAVE */
+ ["\u020E", "\u020F"], /* LATIN CAPITAL LETTER O WITH INVERTED BREVE */
+ ["\u020E", "\u020F"], /* LATIN SMALL LETTER O WITH INVERTED BREVE */
+ ["\u0210", "\u0211"], /* LATIN CAPITAL LETTER R WITH DOUBLE GRAVE */
+ ["\u0210", "\u0211"], /* LATIN SMALL LETTER R WITH DOUBLE GRAVE */
+ ["\u0212", "\u0213"], /* LATIN CAPITAL LETTER R WITH INVERTED BREVE */
+ ["\u0212", "\u0213"], /* LATIN SMALL LETTER R WITH INVERTED BREVE */
+ ["\u0214", "\u0215"], /* LATIN CAPITAL LETTER U WITH DOUBLE GRAVE */
+ ["\u0214", "\u0215"], /* LATIN SMALL LETTER U WITH DOUBLE GRAVE */
+ ["\u0216", "\u0217"], /* LATIN CAPITAL LETTER U WITH INVERTED BREVE */
+ ["\u0216", "\u0217"], /* LATIN SMALL LETTER U WITH INVERTED BREVE */
+ ["\u0218", "\u0219"], /* LATIN CAPITAL LETTER S WITH COMMA BELOW */
+ ["\u0218", "\u0219"], /* LATIN SMALL LETTER S WITH COMMA BELOW */
+ ["\u021A", "\u021B"], /* LATIN CAPITAL LETTER T WITH COMMA BELOW */
+ ["\u021A", "\u021B"], /* LATIN SMALL LETTER T WITH COMMA BELOW */
+ ["\u021C", "\u021D"], /* LATIN CAPITAL LETTER YOGH */
+ ["\u021C", "\u021D"], /* LATIN SMALL LETTER YOGH */
+ ["\u021E", "\u021F"], /* LATIN CAPITAL LETTER H WITH CARON */
+ ["\u021E", "\u021F"], /* LATIN SMALL LETTER H WITH CARON */
+ ["\u0220", "\u019E"], /* LATIN CAPITAL LETTER N WITH LONG RIGHT LEG */
+ ["\u0221", "\u0221"], /* LATIN SMALL LETTER D WITH CURL */
+ ["\u0222", "\u0223"], /* LATIN CAPITAL LETTER OU */
+ ["\u0222", "\u0223"], /* LATIN SMALL LETTER OU */
+ ["\u0224", "\u0225"], /* LATIN CAPITAL LETTER Z WITH HOOK */
+ ["\u0224", "\u0225"], /* LATIN SMALL LETTER Z WITH HOOK */
+ ["\u0226", "\u0227"], /* LATIN CAPITAL LETTER A WITH DOT ABOVE */
+ ["\u0226", "\u0227"], /* LATIN SMALL LETTER A WITH DOT ABOVE */
+ ["\u0228", "\u0229"], /* LATIN CAPITAL LETTER E WITH CEDILLA */
+ ["\u0228", "\u0229"], /* LATIN SMALL LETTER E WITH CEDILLA */
+ ["\u022A", "\u022B"], /* LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON */
+ ["\u022A", "\u022B"], /* LATIN SMALL LETTER O WITH DIAERESIS AND MACRON */
+ ["\u022C", "\u022D"], /* LATIN CAPITAL LETTER O WITH TILDE AND MACRON */
+ ["\u022C", "\u022D"], /* LATIN SMALL LETTER O WITH TILDE AND MACRON */
+ ["\u022E", "\u022F"], /* LATIN CAPITAL LETTER O WITH DOT ABOVE */
+ ["\u022E", "\u022F"], /* LATIN SMALL LETTER O WITH DOT ABOVE */
+ ["\u0230", "\u0231"], /* LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON */
+ ["\u0230", "\u0231"], /* LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON */
+ ["\u0232", "\u0233"], /* LATIN CAPITAL LETTER Y WITH MACRON */
+ ["\u0232", "\u0233"], /* LATIN SMALL LETTER Y WITH MACRON */
+ ["\u0234", "\u0234"], /* LATIN SMALL LETTER L WITH CURL */
+ ["\u0235", "\u0235"], /* LATIN SMALL LETTER N WITH CURL */
+ ["\u0236", "\u0236"], /* LATIN SMALL LETTER T WITH CURL */
+ ["\u0237", "\u0237"], /* LATIN SMALL LETTER DOTLESS J */
+ ["\u0238", "\u0238"], /* LATIN SMALL LETTER DB DIGRAPH */
+ ["\u0239", "\u0239"], /* LATIN SMALL LETTER QP DIGRAPH */
+ ["\u023A", "\u2C65"], /* LATIN CAPITAL LETTER A WITH STROKE */
+ ["\u023B", "\u023C"], /* LATIN CAPITAL LETTER C WITH STROKE */
+ ["\u023B", "\u023C"], /* LATIN SMALL LETTER C WITH STROKE */
+ ["\u023D", "\u019A"], /* LATIN CAPITAL LETTER L WITH BAR */
+ ["\u023E", "\u2C66"], /* LATIN CAPITAL LETTER T WITH DIAGONAL STROKE */
+ ["\u2C7E", "\u023F"], /* LATIN SMALL LETTER S WITH SWASH TAIL */
+ ["\u2C7F", "\u0240"], /* LATIN SMALL LETTER Z WITH SWASH TAIL */
+ ["\u0241", "\u0242"], /* LATIN CAPITAL LETTER GLOTTAL STOP */
+ ["\u0241", "\u0242"], /* LATIN SMALL LETTER GLOTTAL STOP */
+ ["\u0243", "\u0180"], /* LATIN CAPITAL LETTER B WITH STROKE */
+ ["\u0244", "\u0289"], /* LATIN CAPITAL LETTER U BAR */
+ ["\u0245", "\u028C"], /* LATIN CAPITAL LETTER TURNED V */
+ ["\u0246", "\u0247"], /* LATIN CAPITAL LETTER E WITH STROKE */
+ ["\u0246", "\u0247"], /* LATIN SMALL LETTER E WITH STROKE */
+ ["\u0248", "\u0249"], /* LATIN CAPITAL LETTER J WITH STROKE */
+ ["\u0248", "\u0249"], /* LATIN SMALL LETTER J WITH STROKE */
+ ["\u024A", "\u024B"], /* LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL */
+ ["\u024A", "\u024B"], /* LATIN SMALL LETTER Q WITH HOOK TAIL */
+ ["\u024C", "\u024D"], /* LATIN CAPITAL LETTER R WITH STROKE */
+ ["\u024C", "\u024D"], /* LATIN SMALL LETTER R WITH STROKE */
+ ["\u024E", "\u024F"], /* LATIN CAPITAL LETTER Y WITH STROKE */
+ ["\u024E", "\u024F"], /* LATIN SMALL LETTER Y WITH STROKE */
+ ["\u2C6F", "\u0250"], /* LATIN SMALL LETTER TURNED A */
+ ["\u2C6D", "\u0251"], /* LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A) */
+ ["\u2C70", "\u0252"], /* LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A) */
+ ["\u0181", "\u0253"], /* LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK) */
+ ["\u0186", "\u0254"], /* LATIN SMALL LETTER OPEN O */
+ ["\u0255", "\u0255"], /* LATIN SMALL LETTER C WITH CURL (LATIN SMALL LETTER C CURL) */
+ ["\u0189", "\u0256"], /* LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK) */
+ ["\u018A", "\u0257"], /* LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK) */
+ ["\u0258", "\u0258"], /* LATIN SMALL LETTER REVERSED E */
+ ["\u018F", "\u0259"], /* LATIN SMALL LETTER SCHWA */
+ ["\u025A", "\u025A"], /* LATIN SMALL LETTER SCHWA WITH HOOK (LATIN SMALL LETTER SCHWA HOOK) */
+ ["\u0190", "\u025B"], /* LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON) */
+ ["\uA7AB", "\u025C"], /* LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) */
+ ["\u025D", "\u025D"], /* LATIN SMALL LETTER REVERSED OPEN E WITH HOOK (LATIN SMALL LETTER REVERSED EPSILON HOOK) */
+ ["\u025E", "\u025E"], /* LATIN SMALL LETTER CLOSED REVERSED OPEN E (LATIN SMALL LETTER CLOSED REVERSED EPSILON) */
+ ["\u025F", "\u025F"], /* LATIN SMALL LETTER DOTLESS J WITH STROKE (LATIN SMALL LETTER DOTLESS J BAR) */
+ ["\u0193", "\u0260"], /* LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK) */
+ ["\uA7AC", "\u0261"], /* LATIN SMALL LETTER SCRIPT G */
+ ["\u0262", "\u0262"], /* LATIN LETTER SMALL CAPITAL G */
+ ["\u0194", "\u0263"], /* LATIN SMALL LETTER GAMMA */
+ ["\u0264", "\u0264"], /* LATIN SMALL LETTER RAMS HORN (LATIN SMALL LETTER BABY GAMMA) */
+ ["\uA78D", "\u0265"], /* LATIN SMALL LETTER TURNED H */
+ ["\uA7AA", "\u0266"], /* LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK) */
+ ["\u0267", "\u0267"], /* LATIN SMALL LETTER HENG WITH HOOK (LATIN SMALL LETTER HENG HOOK) */
+ ["\u0197", "\u0268"], /* LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I) */
+ ["\u0196", "\u0269"], /* LATIN SMALL LETTER IOTA */
+ ["\uA7AE", "\u026A"], /* LATIN LETTER SMALL CAPITAL I */
+ ["\u2C62", "\u026B"], /* LATIN SMALL LETTER L WITH MIDDLE TILDE */
+ ["\uA7AD", "\u026C"], /* LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) */
+ ["\u026D", "\u026D"], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK (LATIN SMALL LETTER L RETROFLEX HOOK) */
+ ["\u026E", "\u026E"], /* LATIN SMALL LETTER LEZH (LATIN SMALL LETTER L YOGH) */
+ ["\u019C", "\u026F"], /* LATIN SMALL LETTER TURNED M */
+ ["\u0270", "\u0270"], /* LATIN SMALL LETTER TURNED M WITH LONG LEG */
+ ["\u2C6E", "\u0271"], /* LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK) */
+ ["\u019D", "\u0272"], /* LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK) */
+ ["\u0273", "\u0273"], /* LATIN SMALL LETTER N WITH RETROFLEX HOOK (LATIN SMALL LETTER N RETROFLEX HOOK) */
+ ["\u0274", "\u0274"], /* LATIN LETTER SMALL CAPITAL N */
+ ["\u019F", "\u0275"], /* LATIN SMALL LETTER BARRED O */
+ ["\u0276", "\u0276"], /* LATIN LETTER SMALL CAPITAL OE (LATIN LETTER SMALL CAPITAL O E) */
+ ["\u0277", "\u0277"], /* LATIN SMALL LETTER CLOSED OMEGA */
+ ["\u0278", "\u0278"], /* LATIN SMALL LETTER PHI */
+ ["\u0279", "\u0279"], /* LATIN SMALL LETTER TURNED R */
+ ["\u027A", "\u027A"], /* LATIN SMALL LETTER TURNED R WITH LONG LEG */
+ ["\u027B", "\u027B"], /* LATIN SMALL LETTER TURNED R WITH HOOK (LATIN SMALL LETTER TURNED R HOOK) */
+ ["\u027C", "\u027C"], /* LATIN SMALL LETTER R WITH LONG LEG */
+ ["\u2C64", "\u027D"], /* LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK) */
+ ["\u027E", "\u027E"], /* LATIN SMALL LETTER R WITH FISHHOOK (LATIN SMALL LETTER FISHHOOK R) */
+ ["\u027F", "\u027F"], /* LATIN SMALL LETTER REVERSED R WITH FISHHOOK (LATIN SMALL LETTER REVERSED FISHHOOK R) */
+ ["\u01A6", "\u0280"], /* LATIN LETTER SMALL CAPITAL R */
+ ["\u0281", "\u0281"], /* LATIN LETTER SMALL CAPITAL INVERTED R */
+ ["\u0282", "\u0282"], /* LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK) */
+ ["\u01A9", "\u0283"], /* LATIN SMALL LETTER ESH */
+ ["\u0284", "\u0284"], /* LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK (LATIN SMALL LETTER DOTLESS J BAR HOOK) */
+ ["\u0285", "\u0285"], /* LATIN SMALL LETTER SQUAT REVERSED ESH */
+ ["\u0286", "\u0286"], /* LATIN SMALL LETTER ESH WITH CURL (LATIN SMALL LETTER ESH CURL) */
+ ["\uA7B1", "\u0287"], /* LATIN SMALL LETTER TURNED T */
+ ["\u01AE", "\u0288"], /* LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK) */
+ ["\u0244", "\u0289"], /* LATIN SMALL LETTER U BAR */
+ ["\u01B1", "\u028A"], /* LATIN SMALL LETTER UPSILON */
+ ["\u01B2", "\u028B"], /* LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V) */
+ ["\u0245", "\u028C"], /* LATIN SMALL LETTER TURNED V */
+ ["\u028D", "\u028D"], /* LATIN SMALL LETTER TURNED W */
+ ["\u028E", "\u028E"], /* LATIN SMALL LETTER TURNED Y */
+ ["\u028F", "\u028F"], /* LATIN LETTER SMALL CAPITAL Y */
+ ["\u0290", "\u0290"], /* LATIN SMALL LETTER Z WITH RETROFLEX HOOK (LATIN SMALL LETTER Z RETROFLEX HOOK) */
+ ["\u0291", "\u0291"], /* LATIN SMALL LETTER Z WITH CURL (LATIN SMALL LETTER Z CURL) */
+ ["\u01B7", "\u0292"], /* LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH) */
+ ["\u0293", "\u0293"], /* LATIN SMALL LETTER EZH WITH CURL (LATIN SMALL LETTER YOGH CURL) */
+ ["\u0294", "\u0294"], /* LATIN LETTER GLOTTAL STOP */
+ ["\u0295", "\u0295"], /* LATIN LETTER PHARYNGEAL VOICED FRICATIVE (LATIN LETTER REVERSED GLOTTAL STOP) */
+ ["\u0296", "\u0296"], /* LATIN LETTER INVERTED GLOTTAL STOP */
+ ["\u0297", "\u0297"], /* LATIN LETTER STRETCHED C */
+ ["\u0298", "\u0298"], /* LATIN LETTER BILABIAL CLICK (LATIN LETTER BULLSEYE) */
+ ["\u0299", "\u0299"], /* LATIN LETTER SMALL CAPITAL B */
+ ["\u029A", "\u029A"], /* LATIN SMALL LETTER CLOSED OPEN E (LATIN SMALL LETTER CLOSED EPSILON) */
+ ["\u029B", "\u029B"], /* LATIN LETTER SMALL CAPITAL G WITH HOOK (LATIN LETTER SMALL CAPITAL G HOOK) */
+ ["\u029C", "\u029C"], /* LATIN LETTER SMALL CAPITAL H */
+ ["\uA7B2", "\u029D"], /* LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) */
+ ["\uA7B0", "\u029E"], /* LATIN SMALL LETTER TURNED K */
+ ["\u029F", "\u029F"], /* LATIN LETTER SMALL CAPITAL L */
+ ["\u02A0", "\u02A0"], /* LATIN SMALL LETTER Q WITH HOOK (LATIN SMALL LETTER Q HOOK) */
+ ["\u02A1", "\u02A1"], /* LATIN LETTER GLOTTAL STOP WITH STROKE (LATIN LETTER GLOTTAL STOP BAR) */
+ ["\u02A2", "\u02A2"], /* LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE (LATIN LETTER REVERSED GLOTTAL STOP BAR) */
+ ["\u02A3", "\u02A3"], /* LATIN SMALL LETTER DZ DIGRAPH (LATIN SMALL LETTER D Z) */
+ ["\u02A4", "\u02A4"], /* LATIN SMALL LETTER DEZH DIGRAPH (LATIN SMALL LETTER D YOGH) */
+ ["\u02A5", "\u02A5"], /* LATIN SMALL LETTER DZ DIGRAPH WITH CURL (LATIN SMALL LETTER D Z CURL) */
+ ["\u02A6", "\u02A6"], /* LATIN SMALL LETTER TS DIGRAPH (LATIN SMALL LETTER T S) */
+ ["\u02A7", "\u02A7"], /* LATIN SMALL LETTER TESH DIGRAPH (LATIN SMALL LETTER T ESH) */
+ ["\u02A8", "\u02A8"], /* LATIN SMALL LETTER TC DIGRAPH WITH CURL (LATIN SMALL LETTER T C CURL) */
+ ["\u02A9", "\u02A9"], /* LATIN SMALL LETTER FENG DIGRAPH */
+ ["\u02AA", "\u02AA"], /* LATIN SMALL LETTER LS DIGRAPH */
+ ["\u02AB", "\u02AB"], /* LATIN SMALL LETTER LZ DIGRAPH */
+ ["\u02AC", "\u02AC"], /* LATIN LETTER BILABIAL PERCUSSIVE */
+ ["\u02AD", "\u02AD"], /* LATIN LETTER BIDENTAL PERCUSSIVE */
+ ["\u02AE", "\u02AE"], /* LATIN SMALL LETTER TURNED H WITH FISHHOOK */
+ ["\u02AF", "\u02AF"], /* LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL */
+ ["\u02B0", "\u02B0"], /* MODIFIER LETTER SMALL H */
+ ["\u02B1", "\u02B1"], /* MODIFIER LETTER SMALL H WITH HOOK (MODIFIER LETTER SMALL H HOOK) */
+ ["\u02B2", "\u02B2"], /* MODIFIER LETTER SMALL J */
+ ["\u02B3", "\u02B3"], /* MODIFIER LETTER SMALL R */
+ ["\u02B4", "\u02B4"], /* MODIFIER LETTER SMALL TURNED R */
+ ["\u02B5", "\u02B5"], /* MODIFIER LETTER SMALL TURNED R WITH HOOK (MODIFIER LETTER SMALL TURNED R HOOK) */
+ ["\u02B6", "\u02B6"], /* MODIFIER LETTER SMALL CAPITAL INVERTED R */
+ ["\u02B7", "\u02B7"], /* MODIFIER LETTER SMALL W */
+ ["\u02B8", "\u02B8"], /* MODIFIER LETTER SMALL Y */
+ ["\u02B9", "\u02B9"], /* MODIFIER LETTER PRIME */
+ ["\u02BA", "\u02BA"], /* MODIFIER LETTER DOUBLE PRIME */
+ ["\u02BB", "\u02BB"], /* MODIFIER LETTER TURNED COMMA */
+ ["\u02BC", "\u02BC"], /* MODIFIER LETTER APOSTROPHE */
+ ["\u02BD", "\u02BD"], /* MODIFIER LETTER REVERSED COMMA */
+ ["\u02BE", "\u02BE"], /* MODIFIER LETTER RIGHT HALF RING */
+ ["\u02BF", "\u02BF"], /* MODIFIER LETTER LEFT HALF RING */
+ ["\u02C0", "\u02C0"], /* MODIFIER LETTER GLOTTAL STOP */
+ ["\u02C1", "\u02C1"], /* MODIFIER LETTER REVERSED GLOTTAL STOP */
+ ["\u02C2", "\u02C2"], /* MODIFIER LETTER LEFT ARROWHEAD */
+ ["\u02C3", "\u02C3"], /* MODIFIER LETTER RIGHT ARROWHEAD */
+ ["\u02C4", "\u02C4"], /* MODIFIER LETTER UP ARROWHEAD */
+ ["\u02C5", "\u02C5"], /* MODIFIER LETTER DOWN ARROWHEAD */
+ ["\u02C6", "\u02C6"], /* MODIFIER LETTER CIRCUMFLEX ACCENT (MODIFIER LETTER CIRCUMFLEX) */
+ ["\u02C7", "\u02C7"], /* CARON (MODIFIER LETTER HACEK) */
+ ["\u02C8", "\u02C8"], /* MODIFIER LETTER VERTICAL LINE */
+ ["\u02C9", "\u02C9"], /* MODIFIER LETTER MACRON */
+ ["\u02CA", "\u02CA"], /* MODIFIER LETTER ACUTE ACCENT (MODIFIER LETTER ACUTE) */
+ ["\u02CB", "\u02CB"], /* MODIFIER LETTER GRAVE ACCENT (MODIFIER LETTER GRAVE) */
+ ["\u02CC", "\u02CC"], /* MODIFIER LETTER LOW VERTICAL LINE */
+ ["\u02CD", "\u02CD"], /* MODIFIER LETTER LOW MACRON */
+ ["\u02CE", "\u02CE"], /* MODIFIER LETTER LOW GRAVE ACCENT (MODIFIER LETTER LOW GRAVE) */
+ ["\u02CF", "\u02CF"], /* MODIFIER LETTER LOW ACUTE ACCENT (MODIFIER LETTER LOW ACUTE) */
+ ["\u02D0", "\u02D0"], /* MODIFIER LETTER TRIANGULAR COLON */
+ ["\u02D1", "\u02D1"], /* MODIFIER LETTER HALF TRIANGULAR COLON */
+ ["\u02D2", "\u02D2"], /* MODIFIER LETTER CENTRED RIGHT HALF RING (MODIFIER LETTER CENTERED RIGHT HALF RING) */
+ ["\u02D3", "\u02D3"], /* MODIFIER LETTER CENTRED LEFT HALF RING (MODIFIER LETTER CENTERED LEFT HALF RING) */
+ ["\u02D4", "\u02D4"], /* MODIFIER LETTER UP TACK */
+ ["\u02D5", "\u02D5"], /* MODIFIER LETTER DOWN TACK */
+ ["\u02D6", "\u02D6"], /* MODIFIER LETTER PLUS SIGN */
+ ["\u02D7", "\u02D7"], /* MODIFIER LETTER MINUS SIGN */
+ ["\u02D8", "\u02D8"], /* BREVE (SPACING BREVE) */
+ ["\u02D9", "\u02D9"], /* DOT ABOVE (SPACING DOT ABOVE) */
+ ["\u02DA", "\u02DA"], /* RING ABOVE (SPACING RING ABOVE) */
+ ["\u02DB", "\u02DB"], /* OGONEK (SPACING OGONEK) */
+ ["\u02DC", "\u02DC"], /* SMALL TILDE (SPACING TILDE) */
+ ["\u02DD", "\u02DD"], /* DOUBLE ACUTE ACCENT (SPACING DOUBLE ACUTE) */
+ ["\u02DE", "\u02DE"], /* MODIFIER LETTER RHOTIC HOOK */
+ ["\u02DF", "\u02DF"], /* MODIFIER LETTER CROSS ACCENT */
+ ["\u02E0", "\u02E0"], /* MODIFIER LETTER SMALL GAMMA */
+ ["\u02E1", "\u02E1"], /* MODIFIER LETTER SMALL L */
+ ["\u02E2", "\u02E2"], /* MODIFIER LETTER SMALL S */
+ ["\u02E3", "\u02E3"], /* MODIFIER LETTER SMALL X */
+ ["\u02E4", "\u02E4"], /* MODIFIER LETTER SMALL REVERSED GLOTTAL STOP */
+ ["\u02E5", "\u02E5"], /* MODIFIER LETTER EXTRA-HIGH TONE BAR */
+ ["\u02E6", "\u02E6"], /* MODIFIER LETTER HIGH TONE BAR */
+ ["\u02E7", "\u02E7"], /* MODIFIER LETTER MID TONE BAR */
+ ["\u02E8", "\u02E8"], /* MODIFIER LETTER LOW TONE BAR */
+ ["\u02E9", "\u02E9"], /* MODIFIER LETTER EXTRA-LOW TONE BAR */
+ ["\u02EA", "\u02EA"], /* MODIFIER LETTER YIN DEPARTING TONE MARK */
+ ["\u02EB", "\u02EB"], /* MODIFIER LETTER YANG DEPARTING TONE MARK */
+ ["\u02EC", "\u02EC"], /* MODIFIER LETTER VOICING */
+ ["\u02ED", "\u02ED"], /* MODIFIER LETTER UNASPIRATED */
+ ["\u02EE", "\u02EE"], /* MODIFIER LETTER DOUBLE APOSTROPHE */
+ ["\u02EF", "\u02EF"], /* MODIFIER LETTER LOW DOWN ARROWHEAD */
+ ["\u02F0", "\u02F0"], /* MODIFIER LETTER LOW UP ARROWHEAD */
+ ["\u02F1", "\u02F1"], /* MODIFIER LETTER LOW LEFT ARROWHEAD */
+ ["\u02F2", "\u02F2"], /* MODIFIER LETTER LOW RIGHT ARROWHEAD */
+ ["\u02F3", "\u02F3"], /* MODIFIER LETTER LOW RING */
+ ["\u02F4", "\u02F4"], /* MODIFIER LETTER MIDDLE GRAVE ACCENT */
+ ["\u02F5", "\u02F5"], /* MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT */
+ ["\u02F6", "\u02F6"], /* MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT */
+ ["\u02F7", "\u02F7"], /* MODIFIER LETTER LOW TILDE */
+ ["\u02F8", "\u02F8"], /* MODIFIER LETTER RAISED COLON */
+ ["\u02F9", "\u02F9"], /* MODIFIER LETTER BEGIN HIGH TONE */
+ ["\u02FA", "\u02FA"], /* MODIFIER LETTER END HIGH TONE */
+ ["\u02FB", "\u02FB"], /* MODIFIER LETTER BEGIN LOW TONE */
+ ["\u02FC", "\u02FC"], /* MODIFIER LETTER END LOW TONE */
+ ["\u02FD", "\u02FD"], /* MODIFIER LETTER SHELF */
+ ["\u02FE", "\u02FE"], /* MODIFIER LETTER OPEN SHELF */
+ ["\u02FF", "\u02FF"], /* MODIFIER LETTER LOW LEFT ARROW */
+ ["\u0300", "\u0300"], /* COMBINING GRAVE ACCENT (NON-SPACING GRAVE) */
+ ["\u0301", "\u0301"], /* COMBINING ACUTE ACCENT (NON-SPACING ACUTE) */
+ ["\u0302", "\u0302"], /* COMBINING CIRCUMFLEX ACCENT (NON-SPACING CIRCUMFLEX) */
+ ["\u0303", "\u0303"], /* COMBINING TILDE (NON-SPACING TILDE) */
+ ["\u0304", "\u0304"], /* COMBINING MACRON (NON-SPACING MACRON) */
+ ["\u0305", "\u0305"], /* COMBINING OVERLINE (NON-SPACING OVERSCORE) */
+ ["\u0306", "\u0306"], /* COMBINING BREVE (NON-SPACING BREVE) */
+ ["\u0307", "\u0307"], /* COMBINING DOT ABOVE (NON-SPACING DOT ABOVE) */
+ ["\u0308", "\u0308"], /* COMBINING DIAERESIS (NON-SPACING DIAERESIS) */
+ ["\u0309", "\u0309"], /* COMBINING HOOK ABOVE (NON-SPACING HOOK ABOVE) */
+ ["\u030A", "\u030A"], /* COMBINING RING ABOVE (NON-SPACING RING ABOVE) */
+ ["\u030B", "\u030B"], /* COMBINING DOUBLE ACUTE ACCENT (NON-SPACING DOUBLE ACUTE) */
+ ["\u030C", "\u030C"], /* COMBINING CARON (NON-SPACING HACEK) */
+ ["\u030D", "\u030D"], /* COMBINING VERTICAL LINE ABOVE (NON-SPACING VERTICAL LINE ABOVE) */
+ ["\u030E", "\u030E"], /* COMBINING DOUBLE VERTICAL LINE ABOVE (NON-SPACING DOUBLE VERTICAL LINE ABOVE) */
+ ["\u030F", "\u030F"], /* COMBINING DOUBLE GRAVE ACCENT (NON-SPACING DOUBLE GRAVE) */
+ ["\u0310", "\u0310"], /* COMBINING CANDRABINDU (NON-SPACING CANDRABINDU) */
+ ["\u0311", "\u0311"], /* COMBINING INVERTED BREVE (NON-SPACING INVERTED BREVE) */
+ ["\u0312", "\u0312"], /* COMBINING TURNED COMMA ABOVE (NON-SPACING TURNED COMMA ABOVE) */
+ ["\u0313", "\u0313"], /* COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE) */
+ ["\u0314", "\u0314"], /* COMBINING REVERSED COMMA ABOVE (NON-SPACING REVERSED COMMA ABOVE) */
+ ["\u0315", "\u0315"], /* COMBINING COMMA ABOVE RIGHT (NON-SPACING COMMA ABOVE RIGHT) */
+ ["\u0316", "\u0316"], /* COMBINING GRAVE ACCENT BELOW (NON-SPACING GRAVE BELOW) */
+ ["\u0317", "\u0317"], /* COMBINING ACUTE ACCENT BELOW (NON-SPACING ACUTE BELOW) */
+ ["\u0318", "\u0318"], /* COMBINING LEFT TACK BELOW (NON-SPACING LEFT TACK BELOW) */
+ ["\u0319", "\u0319"], /* COMBINING RIGHT TACK BELOW (NON-SPACING RIGHT TACK BELOW) */
+ ["\u031A", "\u031A"], /* COMBINING LEFT ANGLE ABOVE (NON-SPACING LEFT ANGLE ABOVE) */
+ ["\u031B", "\u031B"], /* COMBINING HORN (NON-SPACING HORN) */
+ ["\u031C", "\u031C"], /* COMBINING LEFT HALF RING BELOW (NON-SPACING LEFT HALF RING BELOW) */
+ ["\u031D", "\u031D"], /* COMBINING UP TACK BELOW (NON-SPACING UP TACK BELOW) */
+ ["\u031E", "\u031E"], /* COMBINING DOWN TACK BELOW (NON-SPACING DOWN TACK BELOW) */
+ ["\u031F", "\u031F"], /* COMBINING PLUS SIGN BELOW (NON-SPACING PLUS SIGN BELOW) */
+ ["\u0320", "\u0320"], /* COMBINING MINUS SIGN BELOW (NON-SPACING MINUS SIGN BELOW) */
+ ["\u0321", "\u0321"], /* COMBINING PALATALIZED HOOK BELOW (NON-SPACING PALATALIZED HOOK BELOW) */
+ ["\u0322", "\u0322"], /* COMBINING RETROFLEX HOOK BELOW (NON-SPACING RETROFLEX HOOK BELOW) */
+ ["\u0323", "\u0323"], /* COMBINING DOT BELOW (NON-SPACING DOT BELOW) */
+ ["\u0324", "\u0324"], /* COMBINING DIAERESIS BELOW (NON-SPACING DOUBLE DOT BELOW) */
+ ["\u0325", "\u0325"], /* COMBINING RING BELOW (NON-SPACING RING BELOW) */
+ ["\u0326", "\u0326"], /* COMBINING COMMA BELOW (NON-SPACING COMMA BELOW) */
+ ["\u0327", "\u0327"], /* COMBINING CEDILLA (NON-SPACING CEDILLA) */
+ ["\u0328", "\u0328"], /* COMBINING OGONEK (NON-SPACING OGONEK) */
+ ["\u0329", "\u0329"], /* COMBINING VERTICAL LINE BELOW (NON-SPACING VERTICAL LINE BELOW) */
+ ["\u032A", "\u032A"], /* COMBINING BRIDGE BELOW (NON-SPACING BRIDGE BELOW) */
+ ["\u032B", "\u032B"], /* COMBINING INVERTED DOUBLE ARCH BELOW (NON-SPACING INVERTED DOUBLE ARCH BELOW) */
+ ["\u032C", "\u032C"], /* COMBINING CARON BELOW (NON-SPACING HACEK BELOW) */
+ ["\u032D", "\u032D"], /* COMBINING CIRCUMFLEX ACCENT BELOW (NON-SPACING CIRCUMFLEX BELOW) */
+ ["\u032E", "\u032E"], /* COMBINING BREVE BELOW (NON-SPACING BREVE BELOW) */
+ ["\u032F", "\u032F"], /* COMBINING INVERTED BREVE BELOW (NON-SPACING INVERTED BREVE BELOW) */
+ ["\u0330", "\u0330"], /* COMBINING TILDE BELOW (NON-SPACING TILDE BELOW) */
+ ["\u0331", "\u0331"], /* COMBINING MACRON BELOW (NON-SPACING MACRON BELOW) */
+ ["\u0332", "\u0332"], /* COMBINING LOW LINE (NON-SPACING UNDERSCORE) */
+ ["\u0333", "\u0333"], /* COMBINING DOUBLE LOW LINE (NON-SPACING DOUBLE UNDERSCORE) */
+ ["\u0334", "\u0334"], /* COMBINING TILDE OVERLAY (NON-SPACING TILDE OVERLAY) */
+ ["\u0335", "\u0335"], /* COMBINING SHORT STROKE OVERLAY (NON-SPACING SHORT BAR OVERLAY) */
+ ["\u0336", "\u0336"], /* COMBINING LONG STROKE OVERLAY (NON-SPACING LONG BAR OVERLAY) */
+ ["\u0337", "\u0337"], /* COMBINING SHORT SOLIDUS OVERLAY (NON-SPACING SHORT SLASH OVERLAY) */
+ ["\u0338", "\u0338"], /* COMBINING LONG SOLIDUS OVERLAY (NON-SPACING LONG SLASH OVERLAY) */
+ ["\u0339", "\u0339"], /* COMBINING RIGHT HALF RING BELOW (NON-SPACING RIGHT HALF RING BELOW) */
+ ["\u033A", "\u033A"], /* COMBINING INVERTED BRIDGE BELOW (NON-SPACING INVERTED BRIDGE BELOW) */
+ ["\u033B", "\u033B"], /* COMBINING SQUARE BELOW (NON-SPACING SQUARE BELOW) */
+ ["\u033C", "\u033C"], /* COMBINING SEAGULL BELOW (NON-SPACING SEAGULL BELOW) */
+ ["\u033D", "\u033D"], /* COMBINING X ABOVE (NON-SPACING X ABOVE) */
+ ["\u033E", "\u033E"], /* COMBINING VERTICAL TILDE (NON-SPACING VERTICAL TILDE) */
+ ["\u033F", "\u033F"], /* COMBINING DOUBLE OVERLINE (NON-SPACING DOUBLE OVERSCORE) */
+ ["\u0340", "\u0340"], /* COMBINING GRAVE TONE MARK (NON-SPACING GRAVE TONE MARK) */
+ ["\u0341", "\u0341"], /* COMBINING ACUTE TONE MARK (NON-SPACING ACUTE TONE MARK) */
+ ["\u0342", "\u0342"], /* COMBINING GREEK PERISPOMENI */
+ ["\u0343", "\u0343"], /* COMBINING GREEK KORONIS */
+ ["\u0344", "\u0344"], /* COMBINING GREEK DIALYTIKA TONOS (GREEK NON-SPACING DIAERESIS TONOS) */
+ ["\u0399", "\u0345"], /* COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW) */
+ ["\u0346", "\u0346"], /* COMBINING BRIDGE ABOVE */
+ ["\u0347", "\u0347"], /* COMBINING EQUALS SIGN BELOW */
+ ["\u0348", "\u0348"], /* COMBINING DOUBLE VERTICAL LINE BELOW */
+ ["\u0349", "\u0349"], /* COMBINING LEFT ANGLE BELOW */
+ ["\u034A", "\u034A"], /* COMBINING NOT TILDE ABOVE */
+ ["\u034B", "\u034B"], /* COMBINING HOMOTHETIC ABOVE */
+ ["\u034C", "\u034C"], /* COMBINING ALMOST EQUAL TO ABOVE */
+ ["\u034D", "\u034D"], /* COMBINING LEFT RIGHT ARROW BELOW */
+ ["\u034E", "\u034E"], /* COMBINING UPWARDS ARROW BELOW */
+ ["\u034F", "\u034F"], /* COMBINING GRAPHEME JOINER */
+ ["\u0350", "\u0350"], /* COMBINING RIGHT ARROWHEAD ABOVE */
+ ["\u0351", "\u0351"], /* COMBINING LEFT HALF RING ABOVE */
+ ["\u0352", "\u0352"], /* COMBINING FERMATA */
+ ["\u0353", "\u0353"], /* COMBINING X BELOW */
+ ["\u0354", "\u0354"], /* COMBINING LEFT ARROWHEAD BELOW */
+ ["\u0355", "\u0355"], /* COMBINING RIGHT ARROWHEAD BELOW */
+ ["\u0356", "\u0356"], /* COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW */
+ ["\u0357", "\u0357"], /* COMBINING RIGHT HALF RING ABOVE */
+ ["\u0358", "\u0358"], /* COMBINING DOT ABOVE RIGHT */
+ ["\u0359", "\u0359"], /* COMBINING ASTERISK BELOW */
+ ["\u035A", "\u035A"], /* COMBINING DOUBLE RING BELOW */
+ ["\u035B", "\u035B"], /* COMBINING ZIGZAG ABOVE */
+ ["\u035C", "\u035C"], /* COMBINING DOUBLE BREVE BELOW */
+ ["\u035D", "\u035D"], /* COMBINING DOUBLE BREVE */
+ ["\u035E", "\u035E"], /* COMBINING DOUBLE MACRON */
+ ["\u035F", "\u035F"], /* COMBINING DOUBLE MACRON BELOW */
+ ["\u0360", "\u0360"], /* COMBINING DOUBLE TILDE */
+ ["\u0361", "\u0361"], /* COMBINING DOUBLE INVERTED BREVE */
+ ["\u0362", "\u0362"], /* COMBINING DOUBLE RIGHTWARDS ARROW BELOW */
+ ["\u0363", "\u0363"], /* COMBINING LATIN SMALL LETTER A */
+ ["\u0364", "\u0364"], /* COMBINING LATIN SMALL LETTER E */
+ ["\u0365", "\u0365"], /* COMBINING LATIN SMALL LETTER I */
+ ["\u0366", "\u0366"], /* COMBINING LATIN SMALL LETTER O */
+ ["\u0367", "\u0367"], /* COMBINING LATIN SMALL LETTER U */
+ ["\u0368", "\u0368"], /* COMBINING LATIN SMALL LETTER C */
+ ["\u0369", "\u0369"], /* COMBINING LATIN SMALL LETTER D */
+ ["\u036A", "\u036A"], /* COMBINING LATIN SMALL LETTER H */
+ ["\u036B", "\u036B"], /* COMBINING LATIN SMALL LETTER M */
+ ["\u036C", "\u036C"], /* COMBINING LATIN SMALL LETTER R */
+ ["\u036D", "\u036D"], /* COMBINING LATIN SMALL LETTER T */
+ ["\u036E", "\u036E"], /* COMBINING LATIN SMALL LETTER V */
+ ["\u036F", "\u036F"], /* COMBINING LATIN SMALL LETTER X */
+ ["\u0370", "\u0371"], /* GREEK CAPITAL LETTER HETA */
+ ["\u0370", "\u0371"], /* GREEK SMALL LETTER HETA */
+ ["\u0372", "\u0373"], /* GREEK CAPITAL LETTER ARCHAIC SAMPI */
+ ["\u0372", "\u0373"], /* GREEK SMALL LETTER ARCHAIC SAMPI */
+ ["\u0374", "\u0374"], /* GREEK NUMERAL SIGN (GREEK UPPER NUMERAL SIGN) */
+ ["\u0375", "\u0375"], /* GREEK LOWER NUMERAL SIGN */
+ ["\u0376", "\u0377"], /* GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA */
+ ["\u0376", "\u0377"], /* GREEK SMALL LETTER PAMPHYLIAN DIGAMMA */
+ ["\u0378", "\u0378"],
+ ["\u0379", "\u0379"],
+ ["\u037A", "\u037A"], /* GREEK YPOGEGRAMMENI (GREEK SPACING IOTA BELOW) */
+ ["\u03FD", "\u037B"], /* GREEK SMALL REVERSED LUNATE SIGMA SYMBOL */
+ ["\u03FE", "\u037C"], /* GREEK SMALL DOTTED LUNATE SIGMA SYMBOL */
+ ["\u03FF", "\u037D"], /* GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL */
+ ["\u037E", "\u037E"], /* GREEK QUESTION MARK */
+ ["\u037F", "\u03F3"], /* GREEK CAPITAL LETTER YOT */
+ ["\u0380", "\u0380"],
+ ["\u0381", "\u0381"],
+ ["\u0382", "\u0382"],
+ ["\u0383", "\u0383"],
+ ["\u0384", "\u0384"], /* GREEK TONOS (GREEK SPACING TONOS) */
+ ["\u0385", "\u0385"], /* GREEK DIALYTIKA TONOS (GREEK SPACING DIAERESIS TONOS) */
+ ["\u0386", "\u03AC"], /* GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS) */
+ ["\u0387", "\u0387"], /* GREEK ANO TELEIA */
+ ["\u0388", "\u03AD"], /* GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS) */
+ ["\u0389", "\u03AE"], /* GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS) */
+ ["\u038A", "\u03AF"], /* GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS) */
+ ["\u038B", "\u038B"],
+ ["\u038C", "\u03CC"], /* GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS) */
+ ["\u038D", "\u038D"],
+ ["\u038E", "\u03CD"], /* GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS) */
+ ["\u038F", "\u03CE"], /* GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS) */
+ ["\u0399\u0308\u0301", "\u0390"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS) */
+ ["\u0391", "\u03B1"], /* GREEK CAPITAL LETTER ALPHA */
+ ["\u0392", "\u03B2"], /* GREEK CAPITAL LETTER BETA */
+ ["\u0393", "\u03B3"], /* GREEK CAPITAL LETTER GAMMA */
+ ["\u0394", "\u03B4"], /* GREEK CAPITAL LETTER DELTA */
+ ["\u0395", "\u03B5"], /* GREEK CAPITAL LETTER EPSILON */
+ ["\u0396", "\u03B6"], /* GREEK CAPITAL LETTER ZETA */
+ ["\u0397", "\u03B7"], /* GREEK CAPITAL LETTER ETA */
+ ["\u0398", "\u03B8"], /* GREEK CAPITAL LETTER THETA */
+ ["\u0399", "\u03B9"], /* GREEK CAPITAL LETTER IOTA */
+ ["\u039A", "\u03BA"], /* GREEK CAPITAL LETTER KAPPA */
+ ["\u039B", "\u03BB"], /* GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA) */
+ ["\u039C", "\u03BC"], /* GREEK CAPITAL LETTER MU */
+ ["\u039D", "\u03BD"], /* GREEK CAPITAL LETTER NU */
+ ["\u039E", "\u03BE"], /* GREEK CAPITAL LETTER XI */
+ ["\u039F", "\u03BF"], /* GREEK CAPITAL LETTER OMICRON */
+ ["\u03A0", "\u03C0"], /* GREEK CAPITAL LETTER PI */
+ ["\u03A1", "\u03C1"], /* GREEK CAPITAL LETTER RHO */
+ ["\u03A2", "\u03A2"],
+ ["\u03A3", "\u03C3"], /* GREEK CAPITAL LETTER SIGMA */
+ ["\u03A4", "\u03C4"], /* GREEK CAPITAL LETTER TAU */
+ ["\u03A5", "\u03C5"], /* GREEK CAPITAL LETTER UPSILON */
+ ["\u03A6", "\u03C6"], /* GREEK CAPITAL LETTER PHI */
+ ["\u03A7", "\u03C7"], /* GREEK CAPITAL LETTER CHI */
+ ["\u03A8", "\u03C8"], /* GREEK CAPITAL LETTER PSI */
+ ["\u03A9", "\u03C9"], /* GREEK CAPITAL LETTER OMEGA */
+ ["\u03AA", "\u03CA"], /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS) */
+ ["\u03AB", "\u03CB"], /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS) */
+ ["\u0386", "\u03AC"], /* GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS) */
+ ["\u0388", "\u03AD"], /* GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS) */
+ ["\u0389", "\u03AE"], /* GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS) */
+ ["\u038A", "\u03AF"], /* GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS) */
+ ["\u03A5\u0308\u0301", "\u03B0"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS) */
+ ["\u0391", "\u03B1"], /* GREEK SMALL LETTER ALPHA */
+ ["\u0392", "\u03B2"], /* GREEK SMALL LETTER BETA */
+ ["\u0393", "\u03B3"], /* GREEK SMALL LETTER GAMMA */
+ ["\u0394", "\u03B4"], /* GREEK SMALL LETTER DELTA */
+ ["\u0395", "\u03B5"], /* GREEK SMALL LETTER EPSILON */
+ ["\u0396", "\u03B6"], /* GREEK SMALL LETTER ZETA */
+ ["\u0397", "\u03B7"], /* GREEK SMALL LETTER ETA */
+ ["\u0398", "\u03B8"], /* GREEK SMALL LETTER THETA */
+ ["\u0399", "\u03B9"], /* GREEK SMALL LETTER IOTA */
+ ["\u039A", "\u03BA"], /* GREEK SMALL LETTER KAPPA */
+ ["\u039B", "\u03BB"], /* GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA) */
+ ["\u039C", "\u03BC"], /* GREEK SMALL LETTER MU */
+ ["\u039D", "\u03BD"], /* GREEK SMALL LETTER NU */
+ ["\u039E", "\u03BE"], /* GREEK SMALL LETTER XI */
+ ["\u039F", "\u03BF"], /* GREEK SMALL LETTER OMICRON */
+ ["\u03A0", "\u03C0"], /* GREEK SMALL LETTER PI */
+ ["\u03A1", "\u03C1"], /* GREEK SMALL LETTER RHO */
+ ["\u03A3", "\u03C2"], /* GREEK SMALL LETTER FINAL SIGMA */
+ ["\u03A3", "\u03C3"], /* GREEK SMALL LETTER SIGMA */
+ ["\u03A4", "\u03C4"], /* GREEK SMALL LETTER TAU */
+ ["\u03A5", "\u03C5"], /* GREEK SMALL LETTER UPSILON */
+ ["\u03A6", "\u03C6"], /* GREEK SMALL LETTER PHI */
+ ["\u03A7", "\u03C7"], /* GREEK SMALL LETTER CHI */
+ ["\u03A8", "\u03C8"], /* GREEK SMALL LETTER PSI */
+ ["\u03A9", "\u03C9"], /* GREEK SMALL LETTER OMEGA */
+ ["\u03AA", "\u03CA"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS) */
+ ["\u03AB", "\u03CB"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS) */
+ ["\u038C", "\u03CC"], /* GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS) */
+ ["\u038E", "\u03CD"], /* GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS) */
+ ["\u038F", "\u03CE"], /* GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS) */
+ ["\u03CF", "\u03D7"], /* GREEK CAPITAL KAI SYMBOL */
+ ["\u0392", "\u03D0"], /* GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA) */
+ ["\u0398", "\u03D1"], /* GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA) */
+ ["\u03D2", "\u03D2"], /* GREEK UPSILON WITH HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK) */
+ ["\u03D3", "\u03D3"], /* GREEK UPSILON WITH ACUTE AND HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK TONOS) */
+ ["\u03D4", "\u03D4"], /* GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL (GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS) */
+ ["\u03A6", "\u03D5"], /* GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI) */
+ ["\u03A0", "\u03D6"], /* GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI) */
+ ["\u03CF", "\u03D7"], /* GREEK KAI SYMBOL */
+ ["\u03D8", "\u03D9"], /* GREEK LETTER ARCHAIC KOPPA */
+ ["\u03D8", "\u03D9"], /* GREEK SMALL LETTER ARCHAIC KOPPA */
+ ["\u03DA", "\u03DB"], /* GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA) */
+ ["\u03DA", "\u03DB"], /* GREEK SMALL LETTER STIGMA */
+ ["\u03DC", "\u03DD"], /* GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA) */
+ ["\u03DC", "\u03DD"], /* GREEK SMALL LETTER DIGAMMA */
+ ["\u03DE", "\u03DF"], /* GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA) */
+ ["\u03DE", "\u03DF"], /* GREEK SMALL LETTER KOPPA */
+ ["\u03E0", "\u03E1"], /* GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI) */
+ ["\u03E0", "\u03E1"], /* GREEK SMALL LETTER SAMPI */
+ ["\u03E2", "\u03E3"], /* COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI) */
+ ["\u03E2", "\u03E3"], /* COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI) */
+ ["\u03E4", "\u03E5"], /* COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI) */
+ ["\u03E4", "\u03E5"], /* COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI) */
+ ["\u03E6", "\u03E7"], /* COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI) */
+ ["\u03E6", "\u03E7"], /* COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI) */
+ ["\u03E8", "\u03E9"], /* COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI) */
+ ["\u03E8", "\u03E9"], /* COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI) */
+ ["\u03EA", "\u03EB"], /* COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA) */
+ ["\u03EA", "\u03EB"], /* COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA) */
+ ["\u03EC", "\u03ED"], /* COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA) */
+ ["\u03EC", "\u03ED"], /* COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA) */
+ ["\u03EE", "\u03EF"], /* COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI) */
+ ["\u03EE", "\u03EF"], /* COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI) */
+ ["\u039A", "\u03F0"], /* GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA) */
+ ["\u03A1", "\u03F1"], /* GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO) */
+ ["\u03F9", "\u03F2"], /* GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA) */
+ ["\u037F", "\u03F3"], /* GREEK LETTER YOT */
+ ["\u03F4", "\u03B8"], /* GREEK CAPITAL THETA SYMBOL */
+ ["\u0395", "\u03F5"], /* GREEK LUNATE EPSILON SYMBOL */
+ ["\u03F6", "\u03F6"], /* GREEK REVERSED LUNATE EPSILON SYMBOL */
+ ["\u03F7", "\u03F8"], /* GREEK CAPITAL LETTER SHO */
+ ["\u03F7", "\u03F8"], /* GREEK SMALL LETTER SHO */
+ ["\u03F9", "\u03F2"], /* GREEK CAPITAL LUNATE SIGMA SYMBOL */
+ ["\u03FA", "\u03FB"], /* GREEK CAPITAL LETTER SAN */
+ ["\u03FA", "\u03FB"], /* GREEK SMALL LETTER SAN */
+ ["\u03FC", "\u03FC"], /* GREEK RHO WITH STROKE SYMBOL */
+ ["\u03FD", "\u037B"], /* GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL */
+ ["\u03FE", "\u037C"], /* GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL */
+ ["\u03FF", "\u037D"], /* GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL */
+ ["\u0400", "\u0450"], /* CYRILLIC CAPITAL LETTER IE WITH GRAVE */
+ ["\u0401", "\u0451"], /* CYRILLIC CAPITAL LETTER IO */
+ ["\u0402", "\u0452"], /* CYRILLIC CAPITAL LETTER DJE */
+ ["\u0403", "\u0453"], /* CYRILLIC CAPITAL LETTER GJE */
+ ["\u0404", "\u0454"], /* CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E) */
+ ["\u0405", "\u0455"], /* CYRILLIC CAPITAL LETTER DZE */
+ ["\u0406", "\u0456"], /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I) */
+ ["\u0407", "\u0457"], /* CYRILLIC CAPITAL LETTER YI */
+ ["\u0408", "\u0458"], /* CYRILLIC CAPITAL LETTER JE */
+ ["\u0409", "\u0459"], /* CYRILLIC CAPITAL LETTER LJE */
+ ["\u040A", "\u045A"], /* CYRILLIC CAPITAL LETTER NJE */
+ ["\u040B", "\u045B"], /* CYRILLIC CAPITAL LETTER TSHE */
+ ["\u040C", "\u045C"], /* CYRILLIC CAPITAL LETTER KJE */
+ ["\u040D", "\u045D"], /* CYRILLIC CAPITAL LETTER I WITH GRAVE */
+ ["\u040E", "\u045E"], /* CYRILLIC CAPITAL LETTER SHORT U */
+ ["\u040F", "\u045F"], /* CYRILLIC CAPITAL LETTER DZHE */
+ ["\u0410", "\u0430"], /* CYRILLIC CAPITAL LETTER A */
+ ["\u0411", "\u0431"], /* CYRILLIC CAPITAL LETTER BE */
+ ["\u0412", "\u0432"], /* CYRILLIC CAPITAL LETTER VE */
+ ["\u0413", "\u0433"], /* CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE) */
+ ["\u0414", "\u0434"], /* CYRILLIC CAPITAL LETTER DE */
+ ["\u0415", "\u0435"], /* CYRILLIC CAPITAL LETTER IE */
+ ["\u0416", "\u0436"], /* CYRILLIC CAPITAL LETTER ZHE */
+ ["\u0417", "\u0437"], /* CYRILLIC CAPITAL LETTER ZE */
+ ["\u0418", "\u0438"], /* CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II) */
+ ["\u0419", "\u0439"], /* CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II) */
+ ["\u041A", "\u043A"], /* CYRILLIC CAPITAL LETTER KA */
+ ["\u041B", "\u043B"], /* CYRILLIC CAPITAL LETTER EL */
+ ["\u041C", "\u043C"], /* CYRILLIC CAPITAL LETTER EM */
+ ["\u041D", "\u043D"], /* CYRILLIC CAPITAL LETTER EN */
+ ["\u041E", "\u043E"], /* CYRILLIC CAPITAL LETTER O */
+ ["\u041F", "\u043F"], /* CYRILLIC CAPITAL LETTER PE */
+ ["\u0420", "\u0440"], /* CYRILLIC CAPITAL LETTER ER */
+ ["\u0421", "\u0441"], /* CYRILLIC CAPITAL LETTER ES */
+ ["\u0422", "\u0442"], /* CYRILLIC CAPITAL LETTER TE */
+ ["\u0423", "\u0443"], /* CYRILLIC CAPITAL LETTER U */
+ ["\u0424", "\u0444"], /* CYRILLIC CAPITAL LETTER EF */
+ ["\u0425", "\u0445"], /* CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA) */
+ ["\u0426", "\u0446"], /* CYRILLIC CAPITAL LETTER TSE */
+ ["\u0427", "\u0447"], /* CYRILLIC CAPITAL LETTER CHE */
+ ["\u0428", "\u0448"], /* CYRILLIC CAPITAL LETTER SHA */
+ ["\u0429", "\u0449"], /* CYRILLIC CAPITAL LETTER SHCHA */
+ ["\u042A", "\u044A"], /* CYRILLIC CAPITAL LETTER HARD SIGN */
+ ["\u042B", "\u044B"], /* CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI) */
+ ["\u042C", "\u044C"], /* CYRILLIC CAPITAL LETTER SOFT SIGN */
+ ["\u042D", "\u044D"], /* CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E) */
+ ["\u042E", "\u044E"], /* CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU) */
+ ["\u042F", "\u044F"], /* CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA) */
+ ["\u0410", "\u0430"], /* CYRILLIC SMALL LETTER A */
+ ["\u0411", "\u0431"], /* CYRILLIC SMALL LETTER BE */
+ ["\u0412", "\u0432"], /* CYRILLIC SMALL LETTER VE */
+ ["\u0413", "\u0433"], /* CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE) */
+ ["\u0414", "\u0434"], /* CYRILLIC SMALL LETTER DE */
+ ["\u0415", "\u0435"], /* CYRILLIC SMALL LETTER IE */
+ ["\u0416", "\u0436"], /* CYRILLIC SMALL LETTER ZHE */
+ ["\u0417", "\u0437"], /* CYRILLIC SMALL LETTER ZE */
+ ["\u0418", "\u0438"], /* CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II) */
+ ["\u0419", "\u0439"], /* CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II) */
+ ["\u041A", "\u043A"], /* CYRILLIC SMALL LETTER KA */
+ ["\u041B", "\u043B"], /* CYRILLIC SMALL LETTER EL */
+ ["\u041C", "\u043C"], /* CYRILLIC SMALL LETTER EM */
+ ["\u041D", "\u043D"], /* CYRILLIC SMALL LETTER EN */
+ ["\u041E", "\u043E"], /* CYRILLIC SMALL LETTER O */
+ ["\u041F", "\u043F"], /* CYRILLIC SMALL LETTER PE */
+ ["\u0420", "\u0440"], /* CYRILLIC SMALL LETTER ER */
+ ["\u0421", "\u0441"], /* CYRILLIC SMALL LETTER ES */
+ ["\u0422", "\u0442"], /* CYRILLIC SMALL LETTER TE */
+ ["\u0423", "\u0443"], /* CYRILLIC SMALL LETTER U */
+ ["\u0424", "\u0444"], /* CYRILLIC SMALL LETTER EF */
+ ["\u0425", "\u0445"], /* CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA) */
+ ["\u0426", "\u0446"], /* CYRILLIC SMALL LETTER TSE */
+ ["\u0427", "\u0447"], /* CYRILLIC SMALL LETTER CHE */
+ ["\u0428", "\u0448"], /* CYRILLIC SMALL LETTER SHA */
+ ["\u0429", "\u0449"], /* CYRILLIC SMALL LETTER SHCHA */
+ ["\u042A", "\u044A"], /* CYRILLIC SMALL LETTER HARD SIGN */
+ ["\u042B", "\u044B"], /* CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI) */
+ ["\u042C", "\u044C"], /* CYRILLIC SMALL LETTER SOFT SIGN */
+ ["\u042D", "\u044D"], /* CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E) */
+ ["\u042E", "\u044E"], /* CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU) */
+ ["\u042F", "\u044F"], /* CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA) */
+ ["\u0400", "\u0450"], /* CYRILLIC SMALL LETTER IE WITH GRAVE */
+ ["\u0401", "\u0451"], /* CYRILLIC SMALL LETTER IO */
+ ["\u0402", "\u0452"], /* CYRILLIC SMALL LETTER DJE */
+ ["\u0403", "\u0453"], /* CYRILLIC SMALL LETTER GJE */
+ ["\u0404", "\u0454"], /* CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E) */
+ ["\u0405", "\u0455"], /* CYRILLIC SMALL LETTER DZE */
+ ["\u0406", "\u0456"], /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I) */
+ ["\u0407", "\u0457"], /* CYRILLIC SMALL LETTER YI */
+ ["\u0408", "\u0458"], /* CYRILLIC SMALL LETTER JE */
+ ["\u0409", "\u0459"], /* CYRILLIC SMALL LETTER LJE */
+ ["\u040A", "\u045A"], /* CYRILLIC SMALL LETTER NJE */
+ ["\u040B", "\u045B"], /* CYRILLIC SMALL LETTER TSHE */
+ ["\u040C", "\u045C"], /* CYRILLIC SMALL LETTER KJE */
+ ["\u040D", "\u045D"], /* CYRILLIC SMALL LETTER I WITH GRAVE */
+ ["\u040E", "\u045E"], /* CYRILLIC SMALL LETTER SHORT U */
+ ["\u040F", "\u045F"], /* CYRILLIC SMALL LETTER DZHE */
+ ["\u0460", "\u0461"], /* CYRILLIC CAPITAL LETTER OMEGA */
+ ["\u0460", "\u0461"], /* CYRILLIC SMALL LETTER OMEGA */
+ ["\u0462", "\u0463"], /* CYRILLIC CAPITAL LETTER YAT */
+ ["\u0462", "\u0463"], /* CYRILLIC SMALL LETTER YAT */
+ ["\u0464", "\u0465"], /* CYRILLIC CAPITAL LETTER IOTIFIED E */
+ ["\u0464", "\u0465"], /* CYRILLIC SMALL LETTER IOTIFIED E */
+ ["\u0466", "\u0467"], /* CYRILLIC CAPITAL LETTER LITTLE YUS */
+ ["\u0466", "\u0467"], /* CYRILLIC SMALL LETTER LITTLE YUS */
+ ["\u0468", "\u0469"], /* CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS */
+ ["\u0468", "\u0469"], /* CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS */
+ ["\u046A", "\u046B"], /* CYRILLIC CAPITAL LETTER BIG YUS */
+ ["\u046A", "\u046B"], /* CYRILLIC SMALL LETTER BIG YUS */
+ ["\u046C", "\u046D"], /* CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS */
+ ["\u046C", "\u046D"], /* CYRILLIC SMALL LETTER IOTIFIED BIG YUS */
+ ["\u046E", "\u046F"], /* CYRILLIC CAPITAL LETTER KSI */
+ ["\u046E", "\u046F"], /* CYRILLIC SMALL LETTER KSI */
+ ["\u0470", "\u0471"], /* CYRILLIC CAPITAL LETTER PSI */
+ ["\u0470", "\u0471"], /* CYRILLIC SMALL LETTER PSI */
+ ["\u0472", "\u0473"], /* CYRILLIC CAPITAL LETTER FITA */
+ ["\u0472", "\u0473"], /* CYRILLIC SMALL LETTER FITA */
+ ["\u0474", "\u0475"], /* CYRILLIC CAPITAL LETTER IZHITSA */
+ ["\u0474", "\u0475"], /* CYRILLIC SMALL LETTER IZHITSA */
+ ["\u0476", "\u0477"], /* CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE) */
+ ["\u0476", "\u0477"], /* CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE) */
+ ["\u0478", "\u0479"], /* CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH) */
+ ["\u0478", "\u0479"], /* CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH) */
+ ["\u047A", "\u047B"], /* CYRILLIC CAPITAL LETTER ROUND OMEGA */
+ ["\u047A", "\u047B"], /* CYRILLIC SMALL LETTER ROUND OMEGA */
+ ["\u047C", "\u047D"], /* CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO) */
+ ["\u047C", "\u047D"], /* CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO) */
+ ["\u047E", "\u047F"], /* CYRILLIC CAPITAL LETTER OT */
+ ["\u047E", "\u047F"], /* CYRILLIC SMALL LETTER OT */
+ ["\u0480", "\u0481"], /* CYRILLIC CAPITAL LETTER KOPPA */
+ ["\u0480", "\u0481"], /* CYRILLIC SMALL LETTER KOPPA */
+ ["\u0482", "\u0482"], /* CYRILLIC THOUSANDS SIGN */
+ ["\u0483", "\u0483"], /* COMBINING CYRILLIC TITLO (CYRILLIC NON-SPACING TITLO) */
+ ["\u0484", "\u0484"], /* COMBINING CYRILLIC PALATALIZATION (CYRILLIC NON-SPACING PALATALIZATION) */
+ ["\u0485", "\u0485"], /* COMBINING CYRILLIC DASIA PNEUMATA (CYRILLIC NON-SPACING DASIA PNEUMATA) */
+ ["\u0486", "\u0486"], /* COMBINING CYRILLIC PSILI PNEUMATA (CYRILLIC NON-SPACING PSILI PNEUMATA) */
+ ["\u0487", "\u0487"], /* COMBINING CYRILLIC POKRYTIE */
+ ["\u0488", "\u0488"], /* COMBINING CYRILLIC HUNDRED THOUSANDS SIGN */
+ ["\u0489", "\u0489"], /* COMBINING CYRILLIC MILLIONS SIGN */
+ ["\u048A", "\u048B"], /* CYRILLIC CAPITAL LETTER SHORT I WITH TAIL */
+ ["\u048A", "\u048B"], /* CYRILLIC SMALL LETTER SHORT I WITH TAIL */
+ ["\u048C", "\u048D"], /* CYRILLIC CAPITAL LETTER SEMISOFT SIGN */
+ ["\u048C", "\u048D"], /* CYRILLIC SMALL LETTER SEMISOFT SIGN */
+ ["\u048E", "\u048F"], /* CYRILLIC CAPITAL LETTER ER WITH TICK */
+ ["\u048E", "\u048F"], /* CYRILLIC SMALL LETTER ER WITH TICK */
+ ["\u0490", "\u0491"], /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN) */
+ ["\u0490", "\u0491"], /* CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN) */
+ ["\u0492", "\u0493"], /* CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR) */
+ ["\u0492", "\u0493"], /* CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR) */
+ ["\u0494", "\u0495"], /* CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK) */
+ ["\u0494", "\u0495"], /* CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK) */
+ ["\u0496", "\u0497"], /* CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER) */
+ ["\u0496", "\u0497"], /* CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER) */
+ ["\u0498", "\u0499"], /* CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA) */
+ ["\u0498", "\u0499"], /* CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA) */
+ ["\u049A", "\u049B"], /* CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER) */
+ ["\u049A", "\u049B"], /* CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER) */
+ ["\u049C", "\u049D"], /* CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR) */
+ ["\u049C", "\u049D"], /* CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR) */
+ ["\u049E", "\u049F"], /* CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR) */
+ ["\u049E", "\u049F"], /* CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR) */
+ ["\u04A0", "\u04A1"], /* CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA) */
+ ["\u04A0", "\u04A1"], /* CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA) */
+ ["\u04A2", "\u04A3"], /* CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER) */
+ ["\u04A2", "\u04A3"], /* CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER) */
+ ["\u04A4", "\u04A5"], /* CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE) */
+ ["\u04A4", "\u04A5"], /* CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE) */
+ ["\u04A6", "\u04A7"], /* CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK) */
+ ["\u04A6", "\u04A7"], /* CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK) */
+ ["\u04A8", "\u04A9"], /* CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK) */
+ ["\u04A8", "\u04A9"], /* CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK) */
+ ["\u04AA", "\u04AB"], /* CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA) */
+ ["\u04AA", "\u04AB"], /* CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA) */
+ ["\u04AC", "\u04AD"], /* CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER) */
+ ["\u04AC", "\u04AD"], /* CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER) */
+ ["\u04AE", "\u04AF"], /* CYRILLIC CAPITAL LETTER STRAIGHT U */
+ ["\u04AE", "\u04AF"], /* CYRILLIC SMALL LETTER STRAIGHT U */
+ ["\u04B0", "\u04B1"], /* CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR) */
+ ["\u04B0", "\u04B1"], /* CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR) */
+ ["\u04B2", "\u04B3"], /* CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER) */
+ ["\u04B2", "\u04B3"], /* CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER) */
+ ["\u04B4", "\u04B5"], /* CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE) */
+ ["\u04B4", "\u04B5"], /* CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE) */
+ ["\u04B6", "\u04B7"], /* CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER) */
+ ["\u04B6", "\u04B7"], /* CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER) */
+ ["\u04B8", "\u04B9"], /* CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR) */
+ ["\u04B8", "\u04B9"], /* CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR) */
+ ["\u04BA", "\u04BB"], /* CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H) */
+ ["\u04BA", "\u04BB"], /* CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H) */
+ ["\u04BC", "\u04BD"], /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK) */
+ ["\u04BC", "\u04BD"], /* CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK) */
+ ["\u04BE", "\u04BF"], /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK) */
+ ["\u04BE", "\u04BF"], /* CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK) */
+ ["\u04C0", "\u04CF"], /* CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I) */
+ ["\u04C1", "\u04C2"], /* CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE) */
+ ["\u04C1", "\u04C2"], /* CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE) */
+ ["\u04C3", "\u04C4"], /* CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK) */
+ ["\u04C3", "\u04C4"], /* CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK) */
+ ["\u04C5", "\u04C6"], /* CYRILLIC CAPITAL LETTER EL WITH TAIL */
+ ["\u04C5", "\u04C6"], /* CYRILLIC SMALL LETTER EL WITH TAIL */
+ ["\u04C7", "\u04C8"], /* CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK) */
+ ["\u04C7", "\u04C8"], /* CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK) */
+ ["\u04C9", "\u04CA"], /* CYRILLIC CAPITAL LETTER EN WITH TAIL */
+ ["\u04C9", "\u04CA"], /* CYRILLIC SMALL LETTER EN WITH TAIL */
+ ["\u04CB", "\u04CC"], /* CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER) */
+ ["\u04CB", "\u04CC"], /* CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER) */
+ ["\u04CD", "\u04CE"], /* CYRILLIC CAPITAL LETTER EM WITH TAIL */
+ ["\u04CD", "\u04CE"], /* CYRILLIC SMALL LETTER EM WITH TAIL */
+ ["\u04C0", "\u04CF"], /* CYRILLIC SMALL LETTER PALOCHKA */
+ ["\u04D0", "\u04D1"], /* CYRILLIC CAPITAL LETTER A WITH BREVE */
+ ["\u04D0", "\u04D1"], /* CYRILLIC SMALL LETTER A WITH BREVE */
+ ["\u04D2", "\u04D3"], /* CYRILLIC CAPITAL LETTER A WITH DIAERESIS */
+ ["\u04D2", "\u04D3"], /* CYRILLIC SMALL LETTER A WITH DIAERESIS */
+ ["\u04D4", "\u04D5"], /* CYRILLIC CAPITAL LIGATURE A IE */
+ ["\u04D4", "\u04D5"], /* CYRILLIC SMALL LIGATURE A IE */
+ ["\u04D6", "\u04D7"], /* CYRILLIC CAPITAL LETTER IE WITH BREVE */
+ ["\u04D6", "\u04D7"], /* CYRILLIC SMALL LETTER IE WITH BREVE */
+ ["\u04D8", "\u04D9"], /* CYRILLIC CAPITAL LETTER SCHWA */
+ ["\u04D8", "\u04D9"], /* CYRILLIC SMALL LETTER SCHWA */
+ ["\u04DA", "\u04DB"], /* CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS */
+ ["\u04DA", "\u04DB"], /* CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS */
+ ["\u04DC", "\u04DD"], /* CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS */
+ ["\u04DC", "\u04DD"], /* CYRILLIC SMALL LETTER ZHE WITH DIAERESIS */
+ ["\u04DE", "\u04DF"], /* CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS */
+ ["\u04DE", "\u04DF"], /* CYRILLIC SMALL LETTER ZE WITH DIAERESIS */
+ ["\u04E0", "\u04E1"], /* CYRILLIC CAPITAL LETTER ABKHASIAN DZE */
+ ["\u04E0", "\u04E1"], /* CYRILLIC SMALL LETTER ABKHASIAN DZE */
+ ["\u04E2", "\u04E3"], /* CYRILLIC CAPITAL LETTER I WITH MACRON */
+ ["\u04E2", "\u04E3"], /* CYRILLIC SMALL LETTER I WITH MACRON */
+ ["\u04E4", "\u04E5"], /* CYRILLIC CAPITAL LETTER I WITH DIAERESIS */
+ ["\u04E4", "\u04E5"], /* CYRILLIC SMALL LETTER I WITH DIAERESIS */
+ ["\u04E6", "\u04E7"], /* CYRILLIC CAPITAL LETTER O WITH DIAERESIS */
+ ["\u04E6", "\u04E7"], /* CYRILLIC SMALL LETTER O WITH DIAERESIS */
+ ["\u04E8", "\u04E9"], /* CYRILLIC CAPITAL LETTER BARRED O */
+ ["\u04E8", "\u04E9"], /* CYRILLIC SMALL LETTER BARRED O */
+ ["\u04EA", "\u04EB"], /* CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS */
+ ["\u04EA", "\u04EB"], /* CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS */
+ ["\u04EC", "\u04ED"], /* CYRILLIC CAPITAL LETTER E WITH DIAERESIS */
+ ["\u04EC", "\u04ED"], /* CYRILLIC SMALL LETTER E WITH DIAERESIS */
+ ["\u04EE", "\u04EF"], /* CYRILLIC CAPITAL LETTER U WITH MACRON */
+ ["\u04EE", "\u04EF"], /* CYRILLIC SMALL LETTER U WITH MACRON */
+ ["\u04F0", "\u04F1"], /* CYRILLIC CAPITAL LETTER U WITH DIAERESIS */
+ ["\u04F0", "\u04F1"], /* CYRILLIC SMALL LETTER U WITH DIAERESIS */
+ ["\u04F2", "\u04F3"], /* CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE */
+ ["\u04F2", "\u04F3"], /* CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE */
+ ["\u04F4", "\u04F5"], /* CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS */
+ ["\u04F4", "\u04F5"], /* CYRILLIC SMALL LETTER CHE WITH DIAERESIS */
+ ["\u04F6", "\u04F7"], /* CYRILLIC CAPITAL LETTER GHE WITH DESCENDER */
+ ["\u04F6", "\u04F7"], /* CYRILLIC SMALL LETTER GHE WITH DESCENDER */
+ ["\u04F8", "\u04F9"], /* CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS */
+ ["\u04F8", "\u04F9"], /* CYRILLIC SMALL LETTER YERU WITH DIAERESIS */
+ ["\u04FA", "\u04FB"], /* CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK */
+ ["\u04FA", "\u04FB"], /* CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK */
+ ["\u04FC", "\u04FD"], /* CYRILLIC CAPITAL LETTER HA WITH HOOK */
+ ["\u04FC", "\u04FD"], /* CYRILLIC SMALL LETTER HA WITH HOOK */
+ ["\u04FE", "\u04FF"], /* CYRILLIC CAPITAL LETTER HA WITH STROKE */
+ ["\u04FE", "\u04FF"], /* CYRILLIC SMALL LETTER HA WITH STROKE */
+ ["\u0500", "\u0501"], /* CYRILLIC CAPITAL LETTER KOMI DE */
+ ["\u0500", "\u0501"], /* CYRILLIC SMALL LETTER KOMI DE */
+ ["\u0502", "\u0503"], /* CYRILLIC CAPITAL LETTER KOMI DJE */
+ ["\u0502", "\u0503"], /* CYRILLIC SMALL LETTER KOMI DJE */
+ ["\u0504", "\u0505"], /* CYRILLIC CAPITAL LETTER KOMI ZJE */
+ ["\u0504", "\u0505"], /* CYRILLIC SMALL LETTER KOMI ZJE */
+ ["\u0506", "\u0507"], /* CYRILLIC CAPITAL LETTER KOMI DZJE */
+ ["\u0506", "\u0507"], /* CYRILLIC SMALL LETTER KOMI DZJE */
+ ["\u0508", "\u0509"], /* CYRILLIC CAPITAL LETTER KOMI LJE */
+ ["\u0508", "\u0509"], /* CYRILLIC SMALL LETTER KOMI LJE */
+ ["\u050A", "\u050B"], /* CYRILLIC CAPITAL LETTER KOMI NJE */
+ ["\u050A", "\u050B"], /* CYRILLIC SMALL LETTER KOMI NJE */
+ ["\u050C", "\u050D"], /* CYRILLIC CAPITAL LETTER KOMI SJE */
+ ["\u050C", "\u050D"], /* CYRILLIC SMALL LETTER KOMI SJE */
+ ["\u050E", "\u050F"], /* CYRILLIC CAPITAL LETTER KOMI TJE */
+ ["\u050E", "\u050F"], /* CYRILLIC SMALL LETTER KOMI TJE */
+ ["\u0510", "\u0511"], /* CYRILLIC CAPITAL LETTER REVERSED ZE */
+ ["\u0510", "\u0511"], /* CYRILLIC SMALL LETTER REVERSED ZE */
+ ["\u0512", "\u0513"], /* CYRILLIC CAPITAL LETTER EL WITH HOOK */
+ ["\u0512", "\u0513"], /* CYRILLIC SMALL LETTER EL WITH HOOK */
+ ["\u0514", "\u0515"], /* CYRILLIC CAPITAL LETTER LHA */
+ ["\u0514", "\u0515"], /* CYRILLIC SMALL LETTER LHA */
+ ["\u0516", "\u0517"], /* CYRILLIC CAPITAL LETTER RHA */
+ ["\u0516", "\u0517"], /* CYRILLIC SMALL LETTER RHA */
+ ["\u0518", "\u0519"], /* CYRILLIC CAPITAL LETTER YAE */
+ ["\u0518", "\u0519"], /* CYRILLIC SMALL LETTER YAE */
+ ["\u051A", "\u051B"], /* CYRILLIC CAPITAL LETTER QA */
+ ["\u051A", "\u051B"], /* CYRILLIC SMALL LETTER QA */
+ ["\u051C", "\u051D"], /* CYRILLIC CAPITAL LETTER WE */
+ ["\u051C", "\u051D"], /* CYRILLIC SMALL LETTER WE */
+ ["\u051E", "\u051F"], /* CYRILLIC CAPITAL LETTER ALEUT KA */
+ ["\u051E", "\u051F"], /* CYRILLIC SMALL LETTER ALEUT KA */
+ ["\u0520", "\u0521"], /* CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK */
+ ["\u0520", "\u0521"], /* CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK */
+ ["\u0522", "\u0523"], /* CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK */
+ ["\u0522", "\u0523"], /* CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK */
+ ["\u0524", "\u0525"], /* CYRILLIC CAPITAL LETTER PE WITH DESCENDER */
+ ["\u0524", "\u0525"], /* CYRILLIC SMALL LETTER PE WITH DESCENDER */
+ ["\u0526", "\u0527"], /* CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER */
+ ["\u0526", "\u0527"], /* CYRILLIC SMALL LETTER SHHA WITH DESCENDER */
+ ["\u0528", "\u0529"], /* CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK */
+ ["\u0528", "\u0529"], /* CYRILLIC SMALL LETTER EN WITH LEFT HOOK */
+ ["\u052A", "\u052B"], /* CYRILLIC CAPITAL LETTER DZZHE */
+ ["\u052A", "\u052B"], /* CYRILLIC SMALL LETTER DZZHE */
+ ["\u052C", "\u052D"], /* CYRILLIC CAPITAL LETTER DCHE */
+ ["\u052C", "\u052D"], /* CYRILLIC SMALL LETTER DCHE */
+ ["\u052E", "\u052F"], /* CYRILLIC CAPITAL LETTER EL WITH DESCENDER */
+ ["\u052E", "\u052F"], /* CYRILLIC SMALL LETTER EL WITH DESCENDER */
+ ["\u0530", "\u0530"],
+ ["\u0531", "\u0561"], /* ARMENIAN CAPITAL LETTER AYB */
+ ["\u0532", "\u0562"], /* ARMENIAN CAPITAL LETTER BEN */
+ ["\u0533", "\u0563"], /* ARMENIAN CAPITAL LETTER GIM */
+ ["\u0534", "\u0564"], /* ARMENIAN CAPITAL LETTER DA */
+ ["\u0535", "\u0565"], /* ARMENIAN CAPITAL LETTER ECH */
+ ["\u0536", "\u0566"], /* ARMENIAN CAPITAL LETTER ZA */
+ ["\u0537", "\u0567"], /* ARMENIAN CAPITAL LETTER EH */
+ ["\u0538", "\u0568"], /* ARMENIAN CAPITAL LETTER ET */
+ ["\u0539", "\u0569"], /* ARMENIAN CAPITAL LETTER TO */
+ ["\u053A", "\u056A"], /* ARMENIAN CAPITAL LETTER ZHE */
+ ["\u053B", "\u056B"], /* ARMENIAN CAPITAL LETTER INI */
+ ["\u053C", "\u056C"], /* ARMENIAN CAPITAL LETTER LIWN */
+ ["\u053D", "\u056D"], /* ARMENIAN CAPITAL LETTER XEH */
+ ["\u053E", "\u056E"], /* ARMENIAN CAPITAL LETTER CA */
+ ["\u053F", "\u056F"], /* ARMENIAN CAPITAL LETTER KEN */
+ ["\u0540", "\u0570"], /* ARMENIAN CAPITAL LETTER HO */
+ ["\u0541", "\u0571"], /* ARMENIAN CAPITAL LETTER JA */
+ ["\u0542", "\u0572"], /* ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD) */
+ ["\u0543", "\u0573"], /* ARMENIAN CAPITAL LETTER CHEH */
+ ["\u0544", "\u0574"], /* ARMENIAN CAPITAL LETTER MEN */
+ ["\u0545", "\u0575"], /* ARMENIAN CAPITAL LETTER YI */
+ ["\u0546", "\u0576"], /* ARMENIAN CAPITAL LETTER NOW */
+ ["\u0547", "\u0577"], /* ARMENIAN CAPITAL LETTER SHA */
+ ["\u0548", "\u0578"], /* ARMENIAN CAPITAL LETTER VO */
+ ["\u0549", "\u0579"], /* ARMENIAN CAPITAL LETTER CHA */
+ ["\u054A", "\u057A"], /* ARMENIAN CAPITAL LETTER PEH */
+ ["\u054B", "\u057B"], /* ARMENIAN CAPITAL LETTER JHEH */
+ ["\u054C", "\u057C"], /* ARMENIAN CAPITAL LETTER RA */
+ ["\u054D", "\u057D"], /* ARMENIAN CAPITAL LETTER SEH */
+ ["\u054E", "\u057E"], /* ARMENIAN CAPITAL LETTER VEW */
+ ["\u054F", "\u057F"], /* ARMENIAN CAPITAL LETTER TIWN */
+ ["\u0550", "\u0580"], /* ARMENIAN CAPITAL LETTER REH */
+ ["\u0551", "\u0581"], /* ARMENIAN CAPITAL LETTER CO */
+ ["\u0552", "\u0582"], /* ARMENIAN CAPITAL LETTER YIWN */
+ ["\u0553", "\u0583"], /* ARMENIAN CAPITAL LETTER PIWR */
+ ["\u0554", "\u0584"], /* ARMENIAN CAPITAL LETTER KEH */
+ ["\u0555", "\u0585"], /* ARMENIAN CAPITAL LETTER OH */
+ ["\u0556", "\u0586"], /* ARMENIAN CAPITAL LETTER FEH */
+ ["\u0557", "\u0557"],
+ ["\u0558", "\u0558"],
+ ["\u0559", "\u0559"], /* ARMENIAN MODIFIER LETTER LEFT HALF RING */
+ ["\u055A", "\u055A"], /* ARMENIAN APOSTROPHE (ARMENIAN MODIFIER LETTER RIGHT HALF RING) */
+ ["\u055B", "\u055B"], /* ARMENIAN EMPHASIS MARK */
+ ["\u055C", "\u055C"], /* ARMENIAN EXCLAMATION MARK */
+ ["\u055D", "\u055D"], /* ARMENIAN COMMA */
+ ["\u055E", "\u055E"], /* ARMENIAN QUESTION MARK */
+ ["\u055F", "\u055F"], /* ARMENIAN ABBREVIATION MARK */
+ ["\u0560", "\u0560"], /* ARMENIAN SMALL LETTER TURNED AYB */
+ ["\u0531", "\u0561"], /* ARMENIAN SMALL LETTER AYB */
+ ["\u0532", "\u0562"], /* ARMENIAN SMALL LETTER BEN */
+ ["\u0533", "\u0563"], /* ARMENIAN SMALL LETTER GIM */
+ ["\u0534", "\u0564"], /* ARMENIAN SMALL LETTER DA */
+ ["\u0535", "\u0565"], /* ARMENIAN SMALL LETTER ECH */
+ ["\u0536", "\u0566"], /* ARMENIAN SMALL LETTER ZA */
+ ["\u0537", "\u0567"], /* ARMENIAN SMALL LETTER EH */
+ ["\u0538", "\u0568"], /* ARMENIAN SMALL LETTER ET */
+ ["\u0539", "\u0569"], /* ARMENIAN SMALL LETTER TO */
+ ["\u053A", "\u056A"], /* ARMENIAN SMALL LETTER ZHE */
+ ["\u053B", "\u056B"], /* ARMENIAN SMALL LETTER INI */
+ ["\u053C", "\u056C"], /* ARMENIAN SMALL LETTER LIWN */
+ ["\u053D", "\u056D"], /* ARMENIAN SMALL LETTER XEH */
+ ["\u053E", "\u056E"], /* ARMENIAN SMALL LETTER CA */
+ ["\u053F", "\u056F"], /* ARMENIAN SMALL LETTER KEN */
+ ["\u0540", "\u0570"], /* ARMENIAN SMALL LETTER HO */
+ ["\u0541", "\u0571"], /* ARMENIAN SMALL LETTER JA */
+ ["\u0542", "\u0572"], /* ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD) */
+ ["\u0543", "\u0573"], /* ARMENIAN SMALL LETTER CHEH */
+ ["\u0544", "\u0574"], /* ARMENIAN SMALL LETTER MEN */
+ ["\u0545", "\u0575"], /* ARMENIAN SMALL LETTER YI */
+ ["\u0546", "\u0576"], /* ARMENIAN SMALL LETTER NOW */
+ ["\u0547", "\u0577"], /* ARMENIAN SMALL LETTER SHA */
+ ["\u0548", "\u0578"], /* ARMENIAN SMALL LETTER VO */
+ ["\u0549", "\u0579"], /* ARMENIAN SMALL LETTER CHA */
+ ["\u054A", "\u057A"], /* ARMENIAN SMALL LETTER PEH */
+ ["\u054B", "\u057B"], /* ARMENIAN SMALL LETTER JHEH */
+ ["\u054C", "\u057C"], /* ARMENIAN SMALL LETTER RA */
+ ["\u054D", "\u057D"], /* ARMENIAN SMALL LETTER SEH */
+ ["\u054E", "\u057E"], /* ARMENIAN SMALL LETTER VEW */
+ ["\u054F", "\u057F"], /* ARMENIAN SMALL LETTER TIWN */
+ ["\u0550", "\u0580"], /* ARMENIAN SMALL LETTER REH */
+ ["\u0551", "\u0581"], /* ARMENIAN SMALL LETTER CO */
+ ["\u0552", "\u0582"], /* ARMENIAN SMALL LETTER YIWN */
+ ["\u0553", "\u0583"], /* ARMENIAN SMALL LETTER PIWR */
+ ["\u0554", "\u0584"], /* ARMENIAN SMALL LETTER KEH */
+ ["\u0555", "\u0585"], /* ARMENIAN SMALL LETTER OH */
+ ["\u0556", "\u0586"], /* ARMENIAN SMALL LETTER FEH */
+ ["\u0535\u0552", "\u0587"], /* ARMENIAN SMALL LIGATURE ECH YIWN */
+ ["\u0588", "\u0588"], /* ARMENIAN SMALL LETTER YI WITH STROKE */
+ ["\u0589", "\u0589"], /* ARMENIAN FULL STOP (ARMENIAN PERIOD) */
+ ["\u058A", "\u058A"], /* ARMENIAN HYPHEN */
+ ["\u058B", "\u058B"],
+ ["\u058C", "\u058C"],
+ ["\u058D", "\u058D"], /* RIGHT-FACING ARMENIAN ETERNITY SIGN */
+ ["\u058E", "\u058E"], /* LEFT-FACING ARMENIAN ETERNITY SIGN */
+ ["\u058F", "\u058F"], /* ARMENIAN DRAM SIGN */
+ ["\u0590", "\u0590"],
+ ["\u0591", "\u0591"], /* HEBREW ACCENT ETNAHTA */
+ ["\u0592", "\u0592"], /* HEBREW ACCENT SEGOL */
+ ["\u0593", "\u0593"], /* HEBREW ACCENT SHALSHELET */
+ ["\u0594", "\u0594"], /* HEBREW ACCENT ZAQEF QATAN */
+ ["\u0595", "\u0595"], /* HEBREW ACCENT ZAQEF GADOL */
+ ["\u0596", "\u0596"], /* HEBREW ACCENT TIPEHA */
+ ["\u0597", "\u0597"], /* HEBREW ACCENT REVIA */
+ ["\u0598", "\u0598"], /* HEBREW ACCENT ZARQA */
+ ["\u0599", "\u0599"], /* HEBREW ACCENT PASHTA */
+ ["\u059A", "\u059A"], /* HEBREW ACCENT YETIV */
+ ["\u059B", "\u059B"], /* HEBREW ACCENT TEVIR */
+ ["\u059C", "\u059C"], /* HEBREW ACCENT GERESH */
+ ["\u059D", "\u059D"], /* HEBREW ACCENT GERESH MUQDAM */
+ ["\u059E", "\u059E"], /* HEBREW ACCENT GERSHAYIM */
+ ["\u059F", "\u059F"], /* HEBREW ACCENT QARNEY PARA */
+ ["\u05A0", "\u05A0"], /* HEBREW ACCENT TELISHA GEDOLA */
+ ["\u05A1", "\u05A1"], /* HEBREW ACCENT PAZER */
+ ["\u05A2", "\u05A2"], /* HEBREW ACCENT ATNAH HAFUKH */
+ ["\u05A3", "\u05A3"], /* HEBREW ACCENT MUNAH */
+ ["\u05A4", "\u05A4"], /* HEBREW ACCENT MAHAPAKH */
+ ["\u05A5", "\u05A5"], /* HEBREW ACCENT MERKHA */
+ ["\u05A6", "\u05A6"], /* HEBREW ACCENT MERKHA KEFULA */
+ ["\u05A7", "\u05A7"], /* HEBREW ACCENT DARGA */
+ ["\u05A8", "\u05A8"], /* HEBREW ACCENT QADMA */
+ ["\u05A9", "\u05A9"], /* HEBREW ACCENT TELISHA QETANA */
+ ["\u05AA", "\u05AA"], /* HEBREW ACCENT YERAH BEN YOMO */
+ ["\u05AB", "\u05AB"], /* HEBREW ACCENT OLE */
+ ["\u05AC", "\u05AC"], /* HEBREW ACCENT ILUY */
+ ["\u05AD", "\u05AD"], /* HEBREW ACCENT DEHI */
+ ["\u05AE", "\u05AE"], /* HEBREW ACCENT ZINOR */
+ ["\u05AF", "\u05AF"], /* HEBREW MARK MASORA CIRCLE */
+ ["\u05B0", "\u05B0"], /* HEBREW POINT SHEVA */
+ ["\u05B1", "\u05B1"], /* HEBREW POINT HATAF SEGOL */
+ ["\u05B2", "\u05B2"], /* HEBREW POINT HATAF PATAH */
+ ["\u05B3", "\u05B3"], /* HEBREW POINT HATAF QAMATS */
+ ["\u05B4", "\u05B4"], /* HEBREW POINT HIRIQ */
+ ["\u05B5", "\u05B5"], /* HEBREW POINT TSERE */
+ ["\u05B6", "\u05B6"], /* HEBREW POINT SEGOL */
+ ["\u05B7", "\u05B7"], /* HEBREW POINT PATAH */
+ ["\u05B8", "\u05B8"], /* HEBREW POINT QAMATS */
+ ["\u05B9", "\u05B9"], /* HEBREW POINT HOLAM */
+ ["\u05BA", "\u05BA"], /* HEBREW POINT HOLAM HASER FOR VAV */
+ ["\u05BB", "\u05BB"], /* HEBREW POINT QUBUTS */
+ ["\u05BC", "\u05BC"], /* HEBREW POINT DAGESH OR MAPIQ (HEBREW POINT DAGESH) */
+ ["\u05BD", "\u05BD"], /* HEBREW POINT METEG */
+ ["\u05BE", "\u05BE"], /* HEBREW PUNCTUATION MAQAF */
+ ["\u05BF", "\u05BF"], /* HEBREW POINT RAFE */
+ ["\u05C0", "\u05C0"], /* HEBREW PUNCTUATION PASEQ (HEBREW POINT PASEQ) */
+ ["\u05C1", "\u05C1"], /* HEBREW POINT SHIN DOT */
+ ["\u05C2", "\u05C2"], /* HEBREW POINT SIN DOT */
+ ["\u05C3", "\u05C3"], /* HEBREW PUNCTUATION SOF PASUQ */
+ ["\u05C4", "\u05C4"], /* HEBREW MARK UPPER DOT */
+ ["\u05C5", "\u05C5"], /* HEBREW MARK LOWER DOT */
+ ["\u05C6", "\u05C6"], /* HEBREW PUNCTUATION NUN HAFUKHA */
+ ["\u05C7", "\u05C7"], /* HEBREW POINT QAMATS QATAN */
+ ["\u05C8", "\u05C8"],
+ ["\u05C9", "\u05C9"],
+ ["\u05CA", "\u05CA"],
+ ["\u05CB", "\u05CB"],
+ ["\u05CC", "\u05CC"],
+ ["\u05CD", "\u05CD"],
+ ["\u05CE", "\u05CE"],
+ ["\u05CF", "\u05CF"],
+ ["\u05D0", "\u05D0"], /* HEBREW LETTER ALEF */
+ ["\u05D1", "\u05D1"], /* HEBREW LETTER BET */
+ ["\u05D2", "\u05D2"], /* HEBREW LETTER GIMEL */
+ ["\u05D3", "\u05D3"], /* HEBREW LETTER DALET */
+ ["\u05D4", "\u05D4"], /* HEBREW LETTER HE */
+ ["\u05D5", "\u05D5"], /* HEBREW LETTER VAV */
+ ["\u05D6", "\u05D6"], /* HEBREW LETTER ZAYIN */
+ ["\u05D7", "\u05D7"], /* HEBREW LETTER HET */
+ ["\u05D8", "\u05D8"], /* HEBREW LETTER TET */
+ ["\u05D9", "\u05D9"], /* HEBREW LETTER YOD */
+ ["\u05DA", "\u05DA"], /* HEBREW LETTER FINAL KAF */
+ ["\u05DB", "\u05DB"], /* HEBREW LETTER KAF */
+ ["\u05DC", "\u05DC"], /* HEBREW LETTER LAMED */
+ ["\u05DD", "\u05DD"], /* HEBREW LETTER FINAL MEM */
+ ["\u05DE", "\u05DE"], /* HEBREW LETTER MEM */
+ ["\u05DF", "\u05DF"], /* HEBREW LETTER FINAL NUN */
+ ["\u05E0", "\u05E0"], /* HEBREW LETTER NUN */
+ ["\u05E1", "\u05E1"], /* HEBREW LETTER SAMEKH */
+ ["\u05E2", "\u05E2"], /* HEBREW LETTER AYIN */
+ ["\u05E3", "\u05E3"], /* HEBREW LETTER FINAL PE */
+ ["\u05E4", "\u05E4"], /* HEBREW LETTER PE */
+ ["\u05E5", "\u05E5"], /* HEBREW LETTER FINAL TSADI */
+ ["\u05E6", "\u05E6"], /* HEBREW LETTER TSADI */
+ ["\u05E7", "\u05E7"], /* HEBREW LETTER QOF */
+ ["\u05E8", "\u05E8"], /* HEBREW LETTER RESH */
+ ["\u05E9", "\u05E9"], /* HEBREW LETTER SHIN */
+ ["\u05EA", "\u05EA"], /* HEBREW LETTER TAV */
+ ["\u05EB", "\u05EB"],
+ ["\u05EC", "\u05EC"],
+ ["\u05ED", "\u05ED"],
+ ["\u05EE", "\u05EE"],
+ ["\u05EF", "\u05EF"], /* HEBREW YOD TRIANGLE */
+ ["\u05F0", "\u05F0"], /* HEBREW LIGATURE YIDDISH DOUBLE VAV (HEBREW LETTER DOUBLE VAV) */
+ ["\u05F1", "\u05F1"], /* HEBREW LIGATURE YIDDISH VAV YOD (HEBREW LETTER VAV YOD) */
+ ["\u05F2", "\u05F2"], /* HEBREW LIGATURE YIDDISH DOUBLE YOD (HEBREW LETTER DOUBLE YOD) */
+ ["\u05F3", "\u05F3"], /* HEBREW PUNCTUATION GERESH */
+ ["\u05F4", "\u05F4"], /* HEBREW PUNCTUATION GERSHAYIM */
+ ["\u05F5", "\u05F5"],
+ ["\u05F6", "\u05F6"],
+ ["\u05F7", "\u05F7"],
+ ["\u05F8", "\u05F8"],
+ ["\u05F9", "\u05F9"],
+ ["\u05FA", "\u05FA"],
+ ["\u05FB", "\u05FB"],
+ ["\u05FC", "\u05FC"],
+ ["\u05FD", "\u05FD"],
+ ["\u05FE", "\u05FE"],
+ ["\u05FF", "\u05FF"],
+ ["\u0600", "\u0600"], /* ARABIC NUMBER SIGN */
+ ["\u0601", "\u0601"], /* ARABIC SIGN SANAH */
+ ["\u0602", "\u0602"], /* ARABIC FOOTNOTE MARKER */
+ ["\u0603", "\u0603"], /* ARABIC SIGN SAFHA */
+ ["\u0604", "\u0604"], /* ARABIC SIGN SAMVAT */
+ ["\u0605", "\u0605"], /* ARABIC NUMBER MARK ABOVE */
+ ["\u0606", "\u0606"], /* ARABIC-INDIC CUBE ROOT */
+ ["\u0607", "\u0607"], /* ARABIC-INDIC FOURTH ROOT */
+ ["\u0608", "\u0608"], /* ARABIC RAY */
+ ["\u0609", "\u0609"], /* ARABIC-INDIC PER MILLE SIGN */
+ ["\u060A", "\u060A"], /* ARABIC-INDIC PER TEN THOUSAND SIGN */
+ ["\u060B", "\u060B"], /* AFGHANI SIGN */
+ ["\u060C", "\u060C"], /* ARABIC COMMA */
+ ["\u060D", "\u060D"], /* ARABIC DATE SEPARATOR */
+ ["\u060E", "\u060E"], /* ARABIC POETIC VERSE SIGN */
+ ["\u060F", "\u060F"], /* ARABIC SIGN MISRA */
+ ["\u0610", "\u0610"], /* ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM */
+ ["\u0611", "\u0611"], /* ARABIC SIGN ALAYHE ASSALLAM */
+ ["\u0612", "\u0612"], /* ARABIC SIGN RAHMATULLAH ALAYHE */
+ ["\u0613", "\u0613"], /* ARABIC SIGN RADI ALLAHOU ANHU */
+ ["\u0614", "\u0614"], /* ARABIC SIGN TAKHALLUS */
+ ["\u0615", "\u0615"], /* ARABIC SMALL HIGH TAH */
+ ["\u0616", "\u0616"], /* ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH */
+ ["\u0617", "\u0617"], /* ARABIC SMALL HIGH ZAIN */
+ ["\u0618", "\u0618"], /* ARABIC SMALL FATHA */
+ ["\u0619", "\u0619"], /* ARABIC SMALL DAMMA */
+ ["\u061A", "\u061A"], /* ARABIC SMALL KASRA */
+ ["\u061B", "\u061B"], /* ARABIC SEMICOLON */
+ ["\u061C", "\u061C"], /* ARABIC LETTER MARK */
+ ["\u061D", "\u061D"],
+ ["\u061E", "\u061E"], /* ARABIC TRIPLE DOT PUNCTUATION MARK */
+ ["\u061F", "\u061F"], /* ARABIC QUESTION MARK */
+ ["\u0620", "\u0620"], /* ARABIC LETTER KASHMIRI YEH */
+ ["\u0621", "\u0621"], /* ARABIC LETTER HAMZA (ARABIC LETTER HAMZAH) */
+ ["\u0622", "\u0622"], /* ARABIC LETTER ALEF WITH MADDA ABOVE (ARABIC LETTER MADDAH ON ALEF) */
+ ["\u0623", "\u0623"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON ALEF) */
+ ["\u0624", "\u0624"], /* ARABIC LETTER WAW WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON WAW) */
+ ["\u0625", "\u0625"], /* ARABIC LETTER ALEF WITH HAMZA BELOW (ARABIC LETTER HAMZAH UNDER ALEF) */
+ ["\u0626", "\u0626"], /* ARABIC LETTER YEH WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON YA) */
+ ["\u0627", "\u0627"], /* ARABIC LETTER ALEF */
+ ["\u0628", "\u0628"], /* ARABIC LETTER BEH (ARABIC LETTER BAA) */
+ ["\u0629", "\u0629"], /* ARABIC LETTER TEH MARBUTA (ARABIC LETTER TAA MARBUTAH) */
+ ["\u062A", "\u062A"], /* ARABIC LETTER TEH (ARABIC LETTER TAA) */
+ ["\u062B", "\u062B"], /* ARABIC LETTER THEH (ARABIC LETTER THAA) */
+ ["\u062C", "\u062C"], /* ARABIC LETTER JEEM */
+ ["\u062D", "\u062D"], /* ARABIC LETTER HAH (ARABIC LETTER HAA) */
+ ["\u062E", "\u062E"], /* ARABIC LETTER KHAH (ARABIC LETTER KHAA) */
+ ["\u062F", "\u062F"], /* ARABIC LETTER DAL */
+ ["\u0630", "\u0630"], /* ARABIC LETTER THAL */
+ ["\u0631", "\u0631"], /* ARABIC LETTER REH (ARABIC LETTER RA) */
+ ["\u0632", "\u0632"], /* ARABIC LETTER ZAIN */
+ ["\u0633", "\u0633"], /* ARABIC LETTER SEEN */
+ ["\u0634", "\u0634"], /* ARABIC LETTER SHEEN */
+ ["\u0635", "\u0635"], /* ARABIC LETTER SAD */
+ ["\u0636", "\u0636"], /* ARABIC LETTER DAD */
+ ["\u0637", "\u0637"], /* ARABIC LETTER TAH */
+ ["\u0638", "\u0638"], /* ARABIC LETTER ZAH (ARABIC LETTER DHAH) */
+ ["\u0639", "\u0639"], /* ARABIC LETTER AIN */
+ ["\u063A", "\u063A"], /* ARABIC LETTER GHAIN */
+ ["\u063B", "\u063B"], /* ARABIC LETTER KEHEH WITH TWO DOTS ABOVE */
+ ["\u063C", "\u063C"], /* ARABIC LETTER KEHEH WITH THREE DOTS BELOW */
+ ["\u063D", "\u063D"], /* ARABIC LETTER FARSI YEH WITH INVERTED V */
+ ["\u063E", "\u063E"], /* ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE */
+ ["\u063F", "\u063F"], /* ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE */
+ ["\u0640", "\u0640"], /* ARABIC TATWEEL */
+ ["\u0641", "\u0641"], /* ARABIC LETTER FEH (ARABIC LETTER FA) */
+ ["\u0642", "\u0642"], /* ARABIC LETTER QAF */
+ ["\u0643", "\u0643"], /* ARABIC LETTER KAF (ARABIC LETTER CAF) */
+ ["\u0644", "\u0644"], /* ARABIC LETTER LAM */
+ ["\u0645", "\u0645"], /* ARABIC LETTER MEEM */
+ ["\u0646", "\u0646"], /* ARABIC LETTER NOON */
+ ["\u0647", "\u0647"], /* ARABIC LETTER HEH (ARABIC LETTER HA) */
+ ["\u0648", "\u0648"], /* ARABIC LETTER WAW */
+ ["\u0649", "\u0649"], /* ARABIC LETTER ALEF MAKSURA (ARABIC LETTER ALEF MAQSURAH) */
+ ["\u064A", "\u064A"], /* ARABIC LETTER YEH (ARABIC LETTER YA) */
+ ["\u064B", "\u064B"], /* ARABIC FATHATAN */
+ ["\u064C", "\u064C"], /* ARABIC DAMMATAN */
+ ["\u064D", "\u064D"], /* ARABIC KASRATAN */
+ ["\u064E", "\u064E"], /* ARABIC FATHA (ARABIC FATHAH) */
+ ["\u064F", "\u064F"], /* ARABIC DAMMA (ARABIC DAMMAH) */
+ ["\u0650", "\u0650"], /* ARABIC KASRA (ARABIC KASRAH) */
+ ["\u0651", "\u0651"], /* ARABIC SHADDA (ARABIC SHADDAH) */
+ ["\u0652", "\u0652"], /* ARABIC SUKUN */
+ ["\u0653", "\u0653"], /* ARABIC MADDAH ABOVE */
+ ["\u0654", "\u0654"], /* ARABIC HAMZA ABOVE */
+ ["\u0655", "\u0655"], /* ARABIC HAMZA BELOW */
+ ["\u0656", "\u0656"], /* ARABIC SUBSCRIPT ALEF */
+ ["\u0657", "\u0657"], /* ARABIC INVERTED DAMMA */
+ ["\u0658", "\u0658"], /* ARABIC MARK NOON GHUNNA */
+ ["\u0659", "\u0659"], /* ARABIC ZWARAKAY */
+ ["\u065A", "\u065A"], /* ARABIC VOWEL SIGN SMALL V ABOVE */
+ ["\u065B", "\u065B"], /* ARABIC VOWEL SIGN INVERTED SMALL V ABOVE */
+ ["\u065C", "\u065C"], /* ARABIC VOWEL SIGN DOT BELOW */
+ ["\u065D", "\u065D"], /* ARABIC REVERSED DAMMA */
+ ["\u065E", "\u065E"], /* ARABIC FATHA WITH TWO DOTS */
+ ["\u065F", "\u065F"], /* ARABIC WAVY HAMZA BELOW */
+ ["\u0660", "\u0660"], /* ARABIC-INDIC DIGIT ZERO */
+ ["\u0661", "\u0661"], /* ARABIC-INDIC DIGIT ONE */
+ ["\u0662", "\u0662"], /* ARABIC-INDIC DIGIT TWO */
+ ["\u0663", "\u0663"], /* ARABIC-INDIC DIGIT THREE */
+ ["\u0664", "\u0664"], /* ARABIC-INDIC DIGIT FOUR */
+ ["\u0665", "\u0665"], /* ARABIC-INDIC DIGIT FIVE */
+ ["\u0666", "\u0666"], /* ARABIC-INDIC DIGIT SIX */
+ ["\u0667", "\u0667"], /* ARABIC-INDIC DIGIT SEVEN */
+ ["\u0668", "\u0668"], /* ARABIC-INDIC DIGIT EIGHT */
+ ["\u0669", "\u0669"], /* ARABIC-INDIC DIGIT NINE */
+ ["\u066A", "\u066A"], /* ARABIC PERCENT SIGN */
+ ["\u066B", "\u066B"], /* ARABIC DECIMAL SEPARATOR */
+ ["\u066C", "\u066C"], /* ARABIC THOUSANDS SEPARATOR */
+ ["\u066D", "\u066D"], /* ARABIC FIVE POINTED STAR */
+ ["\u066E", "\u066E"], /* ARABIC LETTER DOTLESS BEH */
+ ["\u066F", "\u066F"], /* ARABIC LETTER DOTLESS QAF */
+ ["\u0670", "\u0670"], /* ARABIC LETTER SUPERSCRIPT ALEF (ARABIC ALEF ABOVE) */
+ ["\u0671", "\u0671"], /* ARABIC LETTER ALEF WASLA (ARABIC LETTER HAMZAT WASL ON ALEF) */
+ ["\u0672", "\u0672"], /* ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE (ARABIC LETTER WAVY HAMZAH ON ALEF) */
+ ["\u0673", "\u0673"], /* ARABIC LETTER ALEF WITH WAVY HAMZA BELOW (ARABIC LETTER WAVY HAMZAH UNDER ALEF) */
+ ["\u0674", "\u0674"], /* ARABIC LETTER HIGH HAMZA (ARABIC LETTER HIGH HAMZAH) */
+ ["\u0675", "\u0675"], /* ARABIC LETTER HIGH HAMZA ALEF (ARABIC LETTER HIGH HAMZAH ALEF) */
+ ["\u0676", "\u0676"], /* ARABIC LETTER HIGH HAMZA WAW (ARABIC LETTER HIGH HAMZAH WAW) */
+ ["\u0677", "\u0677"], /* ARABIC LETTER U WITH HAMZA ABOVE (ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH) */
+ ["\u0678", "\u0678"], /* ARABIC LETTER HIGH HAMZA YEH (ARABIC LETTER HIGH HAMZAH YA) */
+ ["\u0679", "\u0679"], /* ARABIC LETTER TTEH (ARABIC LETTER TAA WITH SMALL TAH) */
+ ["\u067A", "\u067A"], /* ARABIC LETTER TTEHEH (ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE) */
+ ["\u067B", "\u067B"], /* ARABIC LETTER BEEH (ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW) */
+ ["\u067C", "\u067C"], /* ARABIC LETTER TEH WITH RING (ARABIC LETTER TAA WITH RING) */
+ ["\u067D", "\u067D"], /* ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS (ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD) */
+ ["\u067E", "\u067E"], /* ARABIC LETTER PEH (ARABIC LETTER TAA WITH THREE DOTS BELOW) */
+ ["\u067F", "\u067F"], /* ARABIC LETTER TEHEH (ARABIC LETTER TAA WITH FOUR DOTS ABOVE) */
+ ["\u0680", "\u0680"], /* ARABIC LETTER BEHEH (ARABIC LETTER BAA WITH FOUR DOTS BELOW) */
+ ["\u0681", "\u0681"], /* ARABIC LETTER HAH WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON HAA) */
+ ["\u0682", "\u0682"], /* ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE (ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE) */
+ ["\u0683", "\u0683"], /* ARABIC LETTER NYEH (ARABIC LETTER HAA WITH MIDDLE TWO DOTS) */
+ ["\u0684", "\u0684"], /* ARABIC LETTER DYEH (ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL) */
+ ["\u0685", "\u0685"], /* ARABIC LETTER HAH WITH THREE DOTS ABOVE (ARABIC LETTER HAA WITH THREE DOTS ABOVE) */
+ ["\u0686", "\u0686"], /* ARABIC LETTER TCHEH (ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD) */
+ ["\u0687", "\u0687"], /* ARABIC LETTER TCHEHEH (ARABIC LETTER HAA WITH MIDDLE FOUR DOTS) */
+ ["\u0688", "\u0688"], /* ARABIC LETTER DDAL (ARABIC LETTER DAL WITH SMALL TAH) */
+ ["\u0689", "\u0689"], /* ARABIC LETTER DAL WITH RING */
+ ["\u068A", "\u068A"], /* ARABIC LETTER DAL WITH DOT BELOW */
+ ["\u068B", "\u068B"], /* ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH */
+ ["\u068C", "\u068C"], /* ARABIC LETTER DAHAL (ARABIC LETTER DAL WITH TWO DOTS ABOVE) */
+ ["\u068D", "\u068D"], /* ARABIC LETTER DDAHAL (ARABIC LETTER DAL WITH TWO DOTS BELOW) */
+ ["\u068E", "\u068E"], /* ARABIC LETTER DUL (ARABIC LETTER DAL WITH THREE DOTS ABOVE) */
+ ["\u068F", "\u068F"], /* ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS (ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD) */
+ ["\u0690", "\u0690"], /* ARABIC LETTER DAL WITH FOUR DOTS ABOVE */
+ ["\u0691", "\u0691"], /* ARABIC LETTER RREH (ARABIC LETTER RA WITH SMALL TAH) */
+ ["\u0692", "\u0692"], /* ARABIC LETTER REH WITH SMALL V (ARABIC LETTER RA WITH SMALL V) */
+ ["\u0693", "\u0693"], /* ARABIC LETTER REH WITH RING (ARABIC LETTER RA WITH RING) */
+ ["\u0694", "\u0694"], /* ARABIC LETTER REH WITH DOT BELOW (ARABIC LETTER RA WITH DOT BELOW) */
+ ["\u0695", "\u0695"], /* ARABIC LETTER REH WITH SMALL V BELOW (ARABIC LETTER RA WITH SMALL V BELOW) */
+ ["\u0696", "\u0696"], /* ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE (ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE) */
+ ["\u0697", "\u0697"], /* ARABIC LETTER REH WITH TWO DOTS ABOVE (ARABIC LETTER RA WITH TWO DOTS ABOVE) */
+ ["\u0698", "\u0698"], /* ARABIC LETTER JEH (ARABIC LETTER RA WITH THREE DOTS ABOVE) */
+ ["\u0699", "\u0699"], /* ARABIC LETTER REH WITH FOUR DOTS ABOVE (ARABIC LETTER RA WITH FOUR DOTS ABOVE) */
+ ["\u069A", "\u069A"], /* ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE */
+ ["\u069B", "\u069B"], /* ARABIC LETTER SEEN WITH THREE DOTS BELOW */
+ ["\u069C", "\u069C"], /* ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE */
+ ["\u069D", "\u069D"], /* ARABIC LETTER SAD WITH TWO DOTS BELOW */
+ ["\u069E", "\u069E"], /* ARABIC LETTER SAD WITH THREE DOTS ABOVE */
+ ["\u069F", "\u069F"], /* ARABIC LETTER TAH WITH THREE DOTS ABOVE */
+ ["\u06A0", "\u06A0"], /* ARABIC LETTER AIN WITH THREE DOTS ABOVE */
+ ["\u06A1", "\u06A1"], /* ARABIC LETTER DOTLESS FEH (ARABIC LETTER DOTLESS FA) */
+ ["\u06A2", "\u06A2"], /* ARABIC LETTER FEH WITH DOT MOVED BELOW (ARABIC LETTER FA WITH DOT MOVED BELOW) */
+ ["\u06A3", "\u06A3"], /* ARABIC LETTER FEH WITH DOT BELOW (ARABIC LETTER FA WITH DOT BELOW) */
+ ["\u06A4", "\u06A4"], /* ARABIC LETTER VEH (ARABIC LETTER FA WITH THREE DOTS ABOVE) */
+ ["\u06A5", "\u06A5"], /* ARABIC LETTER FEH WITH THREE DOTS BELOW (ARABIC LETTER FA WITH THREE DOTS BELOW) */
+ ["\u06A6", "\u06A6"], /* ARABIC LETTER PEHEH (ARABIC LETTER FA WITH FOUR DOTS ABOVE) */
+ ["\u06A7", "\u06A7"], /* ARABIC LETTER QAF WITH DOT ABOVE */
+ ["\u06A8", "\u06A8"], /* ARABIC LETTER QAF WITH THREE DOTS ABOVE */
+ ["\u06A9", "\u06A9"], /* ARABIC LETTER KEHEH (ARABIC LETTER OPEN CAF) */
+ ["\u06AA", "\u06AA"], /* ARABIC LETTER SWASH KAF (ARABIC LETTER SWASH CAF) */
+ ["\u06AB", "\u06AB"], /* ARABIC LETTER KAF WITH RING (ARABIC LETTER CAF WITH RING) */
+ ["\u06AC", "\u06AC"], /* ARABIC LETTER KAF WITH DOT ABOVE (ARABIC LETTER CAF WITH DOT ABOVE) */
+ ["\u06AD", "\u06AD"], /* ARABIC LETTER NG (ARABIC LETTER CAF WITH THREE DOTS ABOVE) */
+ ["\u06AE", "\u06AE"], /* ARABIC LETTER KAF WITH THREE DOTS BELOW (ARABIC LETTER CAF WITH THREE DOTS BELOW) */
+ ["\u06AF", "\u06AF"], /* ARABIC LETTER GAF */
+ ["\u06B0", "\u06B0"], /* ARABIC LETTER GAF WITH RING */
+ ["\u06B1", "\u06B1"], /* ARABIC LETTER NGOEH (ARABIC LETTER GAF WITH TWO DOTS ABOVE) */
+ ["\u06B2", "\u06B2"], /* ARABIC LETTER GAF WITH TWO DOTS BELOW */
+ ["\u06B3", "\u06B3"], /* ARABIC LETTER GUEH (ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW) */
+ ["\u06B4", "\u06B4"], /* ARABIC LETTER GAF WITH THREE DOTS ABOVE */
+ ["\u06B5", "\u06B5"], /* ARABIC LETTER LAM WITH SMALL V */
+ ["\u06B6", "\u06B6"], /* ARABIC LETTER LAM WITH DOT ABOVE */
+ ["\u06B7", "\u06B7"], /* ARABIC LETTER LAM WITH THREE DOTS ABOVE */
+ ["\u06B8", "\u06B8"], /* ARABIC LETTER LAM WITH THREE DOTS BELOW */
+ ["\u06B9", "\u06B9"], /* ARABIC LETTER NOON WITH DOT BELOW */
+ ["\u06BA", "\u06BA"], /* ARABIC LETTER NOON GHUNNA (ARABIC LETTER DOTLESS NOON) */
+ ["\u06BB", "\u06BB"], /* ARABIC LETTER RNOON (ARABIC LETTER DOTLESS NOON WITH SMALL TAH) */
+ ["\u06BC", "\u06BC"], /* ARABIC LETTER NOON WITH RING */
+ ["\u06BD", "\u06BD"], /* ARABIC LETTER NOON WITH THREE DOTS ABOVE */
+ ["\u06BE", "\u06BE"], /* ARABIC LETTER HEH DOACHASHMEE (ARABIC LETTER KNOTTED HA) */
+ ["\u06BF", "\u06BF"], /* ARABIC LETTER TCHEH WITH DOT ABOVE */
+ ["\u06C0", "\u06C0"], /* ARABIC LETTER HEH WITH YEH ABOVE (ARABIC LETTER HAMZAH ON HA) */
+ ["\u06C1", "\u06C1"], /* ARABIC LETTER HEH GOAL (ARABIC LETTER HA GOAL) */
+ ["\u06C2", "\u06C2"], /* ARABIC LETTER HEH GOAL WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON HA GOAL) */
+ ["\u06C3", "\u06C3"], /* ARABIC LETTER TEH MARBUTA GOAL (ARABIC LETTER TAA MARBUTAH GOAL) */
+ ["\u06C4", "\u06C4"], /* ARABIC LETTER WAW WITH RING */
+ ["\u06C5", "\u06C5"], /* ARABIC LETTER KIRGHIZ OE (ARABIC LETTER WAW WITH BAR) */
+ ["\u06C6", "\u06C6"], /* ARABIC LETTER OE (ARABIC LETTER WAW WITH SMALL V) */
+ ["\u06C7", "\u06C7"], /* ARABIC LETTER U (ARABIC LETTER WAW WITH DAMMAH) */
+ ["\u06C8", "\u06C8"], /* ARABIC LETTER YU (ARABIC LETTER WAW WITH ALEF ABOVE) */
+ ["\u06C9", "\u06C9"], /* ARABIC LETTER KIRGHIZ YU (ARABIC LETTER WAW WITH INVERTED SMALL V) */
+ ["\u06CA", "\u06CA"], /* ARABIC LETTER WAW WITH TWO DOTS ABOVE */
+ ["\u06CB", "\u06CB"], /* ARABIC LETTER VE (ARABIC LETTER WAW WITH THREE DOTS ABOVE) */
+ ["\u06CC", "\u06CC"], /* ARABIC LETTER FARSI YEH (ARABIC LETTER DOTLESS YA) */
+ ["\u06CD", "\u06CD"], /* ARABIC LETTER YEH WITH TAIL (ARABIC LETTER YA WITH TAIL) */
+ ["\u06CE", "\u06CE"], /* ARABIC LETTER YEH WITH SMALL V (ARABIC LETTER YA WITH SMALL V) */
+ ["\u06CF", "\u06CF"], /* ARABIC LETTER WAW WITH DOT ABOVE */
+ ["\u06D0", "\u06D0"], /* ARABIC LETTER E (ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW) */
+ ["\u06D1", "\u06D1"], /* ARABIC LETTER YEH WITH THREE DOTS BELOW (ARABIC LETTER YA WITH THREE DOTS BELOW) */
+ ["\u06D2", "\u06D2"], /* ARABIC LETTER YEH BARREE (ARABIC LETTER YA BARREE) */
+ ["\u06D3", "\u06D3"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON YA BARREE) */
+ ["\u06D4", "\u06D4"], /* ARABIC FULL STOP (ARABIC PERIOD) */
+ ["\u06D5", "\u06D5"], /* ARABIC LETTER AE */
+ ["\u06D6", "\u06D6"], /* ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA */
+ ["\u06D7", "\u06D7"], /* ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA */
+ ["\u06D8", "\u06D8"], /* ARABIC SMALL HIGH MEEM INITIAL FORM */
+ ["\u06D9", "\u06D9"], /* ARABIC SMALL HIGH LAM ALEF */
+ ["\u06DA", "\u06DA"], /* ARABIC SMALL HIGH JEEM */
+ ["\u06DB", "\u06DB"], /* ARABIC SMALL HIGH THREE DOTS */
+ ["\u06DC", "\u06DC"], /* ARABIC SMALL HIGH SEEN */
+ ["\u06DD", "\u06DD"], /* ARABIC END OF AYAH */
+ ["\u06DE", "\u06DE"], /* ARABIC START OF RUB EL HIZB */
+ ["\u06DF", "\u06DF"], /* ARABIC SMALL HIGH ROUNDED ZERO */
+ ["\u06E0", "\u06E0"], /* ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO */
+ ["\u06E1", "\u06E1"], /* ARABIC SMALL HIGH DOTLESS HEAD OF KHAH */
+ ["\u06E2", "\u06E2"], /* ARABIC SMALL HIGH MEEM ISOLATED FORM */
+ ["\u06E3", "\u06E3"], /* ARABIC SMALL LOW SEEN */
+ ["\u06E4", "\u06E4"], /* ARABIC SMALL HIGH MADDA */
+ ["\u06E5", "\u06E5"], /* ARABIC SMALL WAW */
+ ["\u06E6", "\u06E6"], /* ARABIC SMALL YEH */
+ ["\u06E7", "\u06E7"], /* ARABIC SMALL HIGH YEH */
+ ["\u06E8", "\u06E8"], /* ARABIC SMALL HIGH NOON */
+ ["\u06E9", "\u06E9"], /* ARABIC PLACE OF SAJDAH */
+ ["\u06EA", "\u06EA"], /* ARABIC EMPTY CENTRE LOW STOP */
+ ["\u06EB", "\u06EB"], /* ARABIC EMPTY CENTRE HIGH STOP */
+ ["\u06EC", "\u06EC"], /* ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE */
+ ["\u06ED", "\u06ED"], /* ARABIC SMALL LOW MEEM */
+ ["\u06EE", "\u06EE"], /* ARABIC LETTER DAL WITH INVERTED V */
+ ["\u06EF", "\u06EF"], /* ARABIC LETTER REH WITH INVERTED V */
+ ["\u06F0", "\u06F0"], /* EXTENDED ARABIC-INDIC DIGIT ZERO (EASTERN ARABIC-INDIC DIGIT ZERO) */
+ ["\u06F1", "\u06F1"], /* EXTENDED ARABIC-INDIC DIGIT ONE (EASTERN ARABIC-INDIC DIGIT ONE) */
+ ["\u06F2", "\u06F2"], /* EXTENDED ARABIC-INDIC DIGIT TWO (EASTERN ARABIC-INDIC DIGIT TWO) */
+ ["\u06F3", "\u06F3"], /* EXTENDED ARABIC-INDIC DIGIT THREE (EASTERN ARABIC-INDIC DIGIT THREE) */
+ ["\u06F4", "\u06F4"], /* EXTENDED ARABIC-INDIC DIGIT FOUR (EASTERN ARABIC-INDIC DIGIT FOUR) */
+ ["\u06F5", "\u06F5"], /* EXTENDED ARABIC-INDIC DIGIT FIVE (EASTERN ARABIC-INDIC DIGIT FIVE) */
+ ["\u06F6", "\u06F6"], /* EXTENDED ARABIC-INDIC DIGIT SIX (EASTERN ARABIC-INDIC DIGIT SIX) */
+ ["\u06F7", "\u06F7"], /* EXTENDED ARABIC-INDIC DIGIT SEVEN (EASTERN ARABIC-INDIC DIGIT SEVEN) */
+ ["\u06F8", "\u06F8"], /* EXTENDED ARABIC-INDIC DIGIT EIGHT (EASTERN ARABIC-INDIC DIGIT EIGHT) */
+ ["\u06F9", "\u06F9"], /* EXTENDED ARABIC-INDIC DIGIT NINE (EASTERN ARABIC-INDIC DIGIT NINE) */
+ ["\u06FA", "\u06FA"], /* ARABIC LETTER SHEEN WITH DOT BELOW */
+ ["\u06FB", "\u06FB"], /* ARABIC LETTER DAD WITH DOT BELOW */
+ ["\u06FC", "\u06FC"], /* ARABIC LETTER GHAIN WITH DOT BELOW */
+ ["\u06FD", "\u06FD"], /* ARABIC SIGN SINDHI AMPERSAND */
+ ["\u06FE", "\u06FE"], /* ARABIC SIGN SINDHI POSTPOSITION MEN */
+ ["\u06FF", "\u06FF"], /* ARABIC LETTER HEH WITH INVERTED V */
+ ["\u0700", "\u0700"], /* SYRIAC END OF PARAGRAPH */
+ ["\u0701", "\u0701"], /* SYRIAC SUPRALINEAR FULL STOP */
+ ["\u0702", "\u0702"], /* SYRIAC SUBLINEAR FULL STOP */
+ ["\u0703", "\u0703"], /* SYRIAC SUPRALINEAR COLON */
+ ["\u0704", "\u0704"], /* SYRIAC SUBLINEAR COLON */
+ ["\u0705", "\u0705"], /* SYRIAC HORIZONTAL COLON */
+ ["\u0706", "\u0706"], /* SYRIAC COLON SKEWED LEFT */
+ ["\u0707", "\u0707"], /* SYRIAC COLON SKEWED RIGHT */
+ ["\u0708", "\u0708"], /* SYRIAC SUPRALINEAR COLON SKEWED LEFT */
+ ["\u0709", "\u0709"], /* SYRIAC SUBLINEAR COLON SKEWED RIGHT */
+ ["\u070A", "\u070A"], /* SYRIAC CONTRACTION */
+ ["\u070B", "\u070B"], /* SYRIAC HARKLEAN OBELUS */
+ ["\u070C", "\u070C"], /* SYRIAC HARKLEAN METOBELUS */
+ ["\u070D", "\u070D"], /* SYRIAC HARKLEAN ASTERISCUS */
+ ["\u070E", "\u070E"],
+ ["\u070F", "\u070F"], /* SYRIAC ABBREVIATION MARK */
+ ["\u0710", "\u0710"], /* SYRIAC LETTER ALAPH */
+ ["\u0711", "\u0711"], /* SYRIAC LETTER SUPERSCRIPT ALAPH */
+ ["\u0712", "\u0712"], /* SYRIAC LETTER BETH */
+ ["\u0713", "\u0713"], /* SYRIAC LETTER GAMAL */
+ ["\u0714", "\u0714"], /* SYRIAC LETTER GAMAL GARSHUNI */
+ ["\u0715", "\u0715"], /* SYRIAC LETTER DALATH */
+ ["\u0716", "\u0716"], /* SYRIAC LETTER DOTLESS DALATH RISH */
+ ["\u0717", "\u0717"], /* SYRIAC LETTER HE */
+ ["\u0718", "\u0718"], /* SYRIAC LETTER WAW */
+ ["\u0719", "\u0719"], /* SYRIAC LETTER ZAIN */
+ ["\u071A", "\u071A"], /* SYRIAC LETTER HETH */
+ ["\u071B", "\u071B"], /* SYRIAC LETTER TETH */
+ ["\u071C", "\u071C"], /* SYRIAC LETTER TETH GARSHUNI */
+ ["\u071D", "\u071D"], /* SYRIAC LETTER YUDH */
+ ["\u071E", "\u071E"], /* SYRIAC LETTER YUDH HE */
+ ["\u071F", "\u071F"], /* SYRIAC LETTER KAPH */
+ ["\u0720", "\u0720"], /* SYRIAC LETTER LAMADH */
+ ["\u0721", "\u0721"], /* SYRIAC LETTER MIM */
+ ["\u0722", "\u0722"], /* SYRIAC LETTER NUN */
+ ["\u0723", "\u0723"], /* SYRIAC LETTER SEMKATH */
+ ["\u0724", "\u0724"], /* SYRIAC LETTER FINAL SEMKATH */
+ ["\u0725", "\u0725"], /* SYRIAC LETTER E */
+ ["\u0726", "\u0726"], /* SYRIAC LETTER PE */
+ ["\u0727", "\u0727"], /* SYRIAC LETTER REVERSED PE */
+ ["\u0728", "\u0728"], /* SYRIAC LETTER SADHE */
+ ["\u0729", "\u0729"], /* SYRIAC LETTER QAPH */
+ ["\u072A", "\u072A"], /* SYRIAC LETTER RISH */
+ ["\u072B", "\u072B"], /* SYRIAC LETTER SHIN */
+ ["\u072C", "\u072C"], /* SYRIAC LETTER TAW */
+ ["\u072D", "\u072D"], /* SYRIAC LETTER PERSIAN BHETH */
+ ["\u072E", "\u072E"], /* SYRIAC LETTER PERSIAN GHAMAL */
+ ["\u072F", "\u072F"], /* SYRIAC LETTER PERSIAN DHALATH */
+ ["\u0730", "\u0730"], /* SYRIAC PTHAHA ABOVE */
+ ["\u0731", "\u0731"], /* SYRIAC PTHAHA BELOW */
+ ["\u0732", "\u0732"], /* SYRIAC PTHAHA DOTTED */
+ ["\u0733", "\u0733"], /* SYRIAC ZQAPHA ABOVE */
+ ["\u0734", "\u0734"], /* SYRIAC ZQAPHA BELOW */
+ ["\u0735", "\u0735"], /* SYRIAC ZQAPHA DOTTED */
+ ["\u0736", "\u0736"], /* SYRIAC RBASA ABOVE */
+ ["\u0737", "\u0737"], /* SYRIAC RBASA BELOW */
+ ["\u0738", "\u0738"], /* SYRIAC DOTTED ZLAMA HORIZONTAL */
+ ["\u0739", "\u0739"], /* SYRIAC DOTTED ZLAMA ANGULAR */
+ ["\u073A", "\u073A"], /* SYRIAC HBASA ABOVE */
+ ["\u073B", "\u073B"], /* SYRIAC HBASA BELOW */
+ ["\u073C", "\u073C"], /* SYRIAC HBASA-ESASA DOTTED */
+ ["\u073D", "\u073D"], /* SYRIAC ESASA ABOVE */
+ ["\u073E", "\u073E"], /* SYRIAC ESASA BELOW */
+ ["\u073F", "\u073F"], /* SYRIAC RWAHA */
+ ["\u0740", "\u0740"], /* SYRIAC FEMININE DOT */
+ ["\u0741", "\u0741"], /* SYRIAC QUSHSHAYA */
+ ["\u0742", "\u0742"], /* SYRIAC RUKKAKHA */
+ ["\u0743", "\u0743"], /* SYRIAC TWO VERTICAL DOTS ABOVE */
+ ["\u0744", "\u0744"], /* SYRIAC TWO VERTICAL DOTS BELOW */
+ ["\u0745", "\u0745"], /* SYRIAC THREE DOTS ABOVE */
+ ["\u0746", "\u0746"], /* SYRIAC THREE DOTS BELOW */
+ ["\u0747", "\u0747"], /* SYRIAC OBLIQUE LINE ABOVE */
+ ["\u0748", "\u0748"], /* SYRIAC OBLIQUE LINE BELOW */
+ ["\u0749", "\u0749"], /* SYRIAC MUSIC */
+ ["\u074A", "\u074A"], /* SYRIAC BARREKH */
+ ["\u074B", "\u074B"],
+ ["\u074C", "\u074C"],
+ ["\u074D", "\u074D"], /* SYRIAC LETTER SOGDIAN ZHAIN */
+ ["\u074E", "\u074E"], /* SYRIAC LETTER SOGDIAN KHAPH */
+ ["\u074F", "\u074F"], /* SYRIAC LETTER SOGDIAN FE */
+ ["\u0750", "\u0750"], /* ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW */
+ ["\u0751", "\u0751"], /* ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE */
+ ["\u0752", "\u0752"], /* ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW */
+ ["\u0753", "\u0753"], /* ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE */
+ ["\u0754", "\u0754"], /* ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE */
+ ["\u0755", "\u0755"], /* ARABIC LETTER BEH WITH INVERTED SMALL V BELOW */
+ ["\u0756", "\u0756"], /* ARABIC LETTER BEH WITH SMALL V */
+ ["\u0757", "\u0757"], /* ARABIC LETTER HAH WITH TWO DOTS ABOVE */
+ ["\u0758", "\u0758"], /* ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW */
+ ["\u0759", "\u0759"], /* ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH */
+ ["\u075A", "\u075A"], /* ARABIC LETTER DAL WITH INVERTED SMALL V BELOW */
+ ["\u075B", "\u075B"], /* ARABIC LETTER REH WITH STROKE */
+ ["\u075C", "\u075C"], /* ARABIC LETTER SEEN WITH FOUR DOTS ABOVE */
+ ["\u075D", "\u075D"], /* ARABIC LETTER AIN WITH TWO DOTS ABOVE */
+ ["\u075E", "\u075E"], /* ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE */
+ ["\u075F", "\u075F"], /* ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE */
+ ["\u0760", "\u0760"], /* ARABIC LETTER FEH WITH TWO DOTS BELOW */
+ ["\u0761", "\u0761"], /* ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW */
+ ["\u0762", "\u0762"], /* ARABIC LETTER KEHEH WITH DOT ABOVE */
+ ["\u0763", "\u0763"], /* ARABIC LETTER KEHEH WITH THREE DOTS ABOVE */
+ ["\u0764", "\u0764"], /* ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW */
+ ["\u0765", "\u0765"], /* ARABIC LETTER MEEM WITH DOT ABOVE */
+ ["\u0766", "\u0766"], /* ARABIC LETTER MEEM WITH DOT BELOW */
+ ["\u0767", "\u0767"], /* ARABIC LETTER NOON WITH TWO DOTS BELOW */
+ ["\u0768", "\u0768"], /* ARABIC LETTER NOON WITH SMALL TAH */
+ ["\u0769", "\u0769"], /* ARABIC LETTER NOON WITH SMALL V */
+ ["\u076A", "\u076A"], /* ARABIC LETTER LAM WITH BAR */
+ ["\u076B", "\u076B"], /* ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE */
+ ["\u076C", "\u076C"], /* ARABIC LETTER REH WITH HAMZA ABOVE */
+ ["\u076D", "\u076D"], /* ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE */
+ ["\u076E", "\u076E"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW */
+ ["\u076F", "\u076F"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
+ ["\u0770", "\u0770"], /* ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
+ ["\u0771", "\u0771"], /* ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS */
+ ["\u0772", "\u0772"], /* ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE */
+ ["\u0773", "\u0773"], /* ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
+ ["\u0774", "\u0774"], /* ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
+ ["\u0775", "\u0775"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
+ ["\u0776", "\u0776"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
+ ["\u0777", "\u0777"], /* ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW */
+ ["\u0778", "\u0778"], /* ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
+ ["\u0779", "\u0779"], /* ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
+ ["\u077A", "\u077A"], /* ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE */
+ ["\u077B", "\u077B"], /* ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE */
+ ["\u077C", "\u077C"], /* ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW */
+ ["\u077D", "\u077D"], /* ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE */
+ ["\u077E", "\u077E"], /* ARABIC LETTER SEEN WITH INVERTED V */
+ ["\u077F", "\u077F"], /* ARABIC LETTER KAF WITH TWO DOTS ABOVE */
+ ["\u0780", "\u0780"], /* THAANA LETTER HAA */
+ ["\u0781", "\u0781"], /* THAANA LETTER SHAVIYANI */
+ ["\u0782", "\u0782"], /* THAANA LETTER NOONU */
+ ["\u0783", "\u0783"], /* THAANA LETTER RAA */
+ ["\u0784", "\u0784"], /* THAANA LETTER BAA */
+ ["\u0785", "\u0785"], /* THAANA LETTER LHAVIYANI */
+ ["\u0786", "\u0786"], /* THAANA LETTER KAAFU */
+ ["\u0787", "\u0787"], /* THAANA LETTER ALIFU */
+ ["\u0788", "\u0788"], /* THAANA LETTER VAAVU */
+ ["\u0789", "\u0789"], /* THAANA LETTER MEEMU */
+ ["\u078A", "\u078A"], /* THAANA LETTER FAAFU */
+ ["\u078B", "\u078B"], /* THAANA LETTER DHAALU */
+ ["\u078C", "\u078C"], /* THAANA LETTER THAA */
+ ["\u078D", "\u078D"], /* THAANA LETTER LAAMU */
+ ["\u078E", "\u078E"], /* THAANA LETTER GAAFU */
+ ["\u078F", "\u078F"], /* THAANA LETTER GNAVIYANI */
+ ["\u0790", "\u0790"], /* THAANA LETTER SEENU */
+ ["\u0791", "\u0791"], /* THAANA LETTER DAVIYANI */
+ ["\u0792", "\u0792"], /* THAANA LETTER ZAVIYANI */
+ ["\u0793", "\u0793"], /* THAANA LETTER TAVIYANI */
+ ["\u0794", "\u0794"], /* THAANA LETTER YAA */
+ ["\u0795", "\u0795"], /* THAANA LETTER PAVIYANI */
+ ["\u0796", "\u0796"], /* THAANA LETTER JAVIYANI */
+ ["\u0797", "\u0797"], /* THAANA LETTER CHAVIYANI */
+ ["\u0798", "\u0798"], /* THAANA LETTER TTAA */
+ ["\u0799", "\u0799"], /* THAANA LETTER HHAA */
+ ["\u079A", "\u079A"], /* THAANA LETTER KHAA */
+ ["\u079B", "\u079B"], /* THAANA LETTER THAALU */
+ ["\u079C", "\u079C"], /* THAANA LETTER ZAA */
+ ["\u079D", "\u079D"], /* THAANA LETTER SHEENU */
+ ["\u079E", "\u079E"], /* THAANA LETTER SAADHU */
+ ["\u079F", "\u079F"], /* THAANA LETTER DAADHU */
+ ["\u07A0", "\u07A0"], /* THAANA LETTER TO */
+ ["\u07A1", "\u07A1"], /* THAANA LETTER ZO */
+ ["\u07A2", "\u07A2"], /* THAANA LETTER AINU */
+ ["\u07A3", "\u07A3"], /* THAANA LETTER GHAINU */
+ ["\u07A4", "\u07A4"], /* THAANA LETTER QAAFU */
+ ["\u07A5", "\u07A5"], /* THAANA LETTER WAAVU */
+ ["\u07A6", "\u07A6"], /* THAANA ABAFILI */
+ ["\u07A7", "\u07A7"], /* THAANA AABAAFILI */
+ ["\u07A8", "\u07A8"], /* THAANA IBIFILI */
+ ["\u07A9", "\u07A9"], /* THAANA EEBEEFILI */
+ ["\u07AA", "\u07AA"], /* THAANA UBUFILI */
+ ["\u07AB", "\u07AB"], /* THAANA OOBOOFILI */
+ ["\u07AC", "\u07AC"], /* THAANA EBEFILI */
+ ["\u07AD", "\u07AD"], /* THAANA EYBEYFILI */
+ ["\u07AE", "\u07AE"], /* THAANA OBOFILI */
+ ["\u07AF", "\u07AF"], /* THAANA OABOAFILI */
+ ["\u07B0", "\u07B0"], /* THAANA SUKUN */
+ ["\u07B1", "\u07B1"], /* THAANA LETTER NAA */
+ ["\u07B2", "\u07B2"],
+ ["\u07B3", "\u07B3"],
+ ["\u07B4", "\u07B4"],
+ ["\u07B5", "\u07B5"],
+ ["\u07B6", "\u07B6"],
+ ["\u07B7", "\u07B7"],
+ ["\u07B8", "\u07B8"],
+ ["\u07B9", "\u07B9"],
+ ["\u07BA", "\u07BA"],
+ ["\u07BB", "\u07BB"],
+ ["\u07BC", "\u07BC"],
+ ["\u07BD", "\u07BD"],
+ ["\u07BE", "\u07BE"],
+ ["\u07BF", "\u07BF"],
+ ["\u07C0", "\u07C0"], /* NKO DIGIT ZERO */
+ ["\u07C1", "\u07C1"], /* NKO DIGIT ONE */
+ ["\u07C2", "\u07C2"], /* NKO DIGIT TWO */
+ ["\u07C3", "\u07C3"], /* NKO DIGIT THREE */
+ ["\u07C4", "\u07C4"], /* NKO DIGIT FOUR */
+ ["\u07C5", "\u07C5"], /* NKO DIGIT FIVE */
+ ["\u07C6", "\u07C6"], /* NKO DIGIT SIX */
+ ["\u07C7", "\u07C7"], /* NKO DIGIT SEVEN */
+ ["\u07C8", "\u07C8"], /* NKO DIGIT EIGHT */
+ ["\u07C9", "\u07C9"], /* NKO DIGIT NINE */
+ ["\u07CA", "\u07CA"], /* NKO LETTER A */
+ ["\u07CB", "\u07CB"], /* NKO LETTER EE */
+ ["\u07CC", "\u07CC"], /* NKO LETTER I */
+ ["\u07CD", "\u07CD"], /* NKO LETTER E */
+ ["\u07CE", "\u07CE"], /* NKO LETTER U */
+ ["\u07CF", "\u07CF"], /* NKO LETTER OO */
+ ["\u07D0", "\u07D0"], /* NKO LETTER O */
+ ["\u07D1", "\u07D1"], /* NKO LETTER DAGBASINNA */
+ ["\u07D2", "\u07D2"], /* NKO LETTER N */
+ ["\u07D3", "\u07D3"], /* NKO LETTER BA */
+ ["\u07D4", "\u07D4"], /* NKO LETTER PA */
+ ["\u07D5", "\u07D5"], /* NKO LETTER TA */
+ ["\u07D6", "\u07D6"], /* NKO LETTER JA */
+ ["\u07D7", "\u07D7"], /* NKO LETTER CHA */
+ ["\u07D8", "\u07D8"], /* NKO LETTER DA */
+ ["\u07D9", "\u07D9"], /* NKO LETTER RA */
+ ["\u07DA", "\u07DA"], /* NKO LETTER RRA */
+ ["\u07DB", "\u07DB"], /* NKO LETTER SA */
+ ["\u07DC", "\u07DC"], /* NKO LETTER GBA */
+ ["\u07DD", "\u07DD"], /* NKO LETTER FA */
+ ["\u07DE", "\u07DE"], /* NKO LETTER KA */
+ ["\u07DF", "\u07DF"], /* NKO LETTER LA */
+ ["\u07E0", "\u07E0"], /* NKO LETTER NA WOLOSO */
+ ["\u07E1", "\u07E1"], /* NKO LETTER MA */
+ ["\u07E2", "\u07E2"], /* NKO LETTER NYA */
+ ["\u07E3", "\u07E3"], /* NKO LETTER NA */
+ ["\u07E4", "\u07E4"], /* NKO LETTER HA */
+ ["\u07E5", "\u07E5"], /* NKO LETTER WA */
+ ["\u07E6", "\u07E6"], /* NKO LETTER YA */
+ ["\u07E7", "\u07E7"], /* NKO LETTER NYA WOLOSO */
+ ["\u07E8", "\u07E8"], /* NKO LETTER JONA JA */
+ ["\u07E9", "\u07E9"], /* NKO LETTER JONA CHA */
+ ["\u07EA", "\u07EA"], /* NKO LETTER JONA RA */
+ ["\u07EB", "\u07EB"], /* NKO COMBINING SHORT HIGH TONE */
+ ["\u07EC", "\u07EC"], /* NKO COMBINING SHORT LOW TONE */
+ ["\u07ED", "\u07ED"], /* NKO COMBINING SHORT RISING TONE */
+ ["\u07EE", "\u07EE"], /* NKO COMBINING LONG DESCENDING TONE */
+ ["\u07EF", "\u07EF"], /* NKO COMBINING LONG HIGH TONE */
+ ["\u07F0", "\u07F0"], /* NKO COMBINING LONG LOW TONE */
+ ["\u07F1", "\u07F1"], /* NKO COMBINING LONG RISING TONE */
+ ["\u07F2", "\u07F2"], /* NKO COMBINING NASALIZATION MARK */
+ ["\u07F3", "\u07F3"], /* NKO COMBINING DOUBLE DOT ABOVE */
+ ["\u07F4", "\u07F4"], /* NKO HIGH TONE APOSTROPHE */
+ ["\u07F5", "\u07F5"], /* NKO LOW TONE APOSTROPHE */
+ ["\u07F6", "\u07F6"], /* NKO SYMBOL OO DENNEN */
+ ["\u07F7", "\u07F7"], /* NKO SYMBOL GBAKURUNEN */
+ ["\u07F8", "\u07F8"], /* NKO COMMA */
+ ["\u07F9", "\u07F9"], /* NKO EXCLAMATION MARK */
+ ["\u07FA", "\u07FA"], /* NKO LAJANYALAN */
+ ["\u07FB", "\u07FB"],
+ ["\u07FC", "\u07FC"],
+ ["\u07FD", "\u07FD"], /* NKO DANTAYALAN */
+ ["\u07FE", "\u07FE"], /* NKO DOROME SIGN */
+ ["\u07FF", "\u07FF"], /* NKO TAMAN SIGN */
+ ["\u0800", "\u0800"], /* SAMARITAN LETTER ALAF */
+ ["\u0801", "\u0801"], /* SAMARITAN LETTER BIT */
+ ["\u0802", "\u0802"], /* SAMARITAN LETTER GAMAN */
+ ["\u0803", "\u0803"], /* SAMARITAN LETTER DALAT */
+ ["\u0804", "\u0804"], /* SAMARITAN LETTER IY */
+ ["\u0805", "\u0805"], /* SAMARITAN LETTER BAA */
+ ["\u0806", "\u0806"], /* SAMARITAN LETTER ZEN */
+ ["\u0807", "\u0807"], /* SAMARITAN LETTER IT */
+ ["\u0808", "\u0808"], /* SAMARITAN LETTER TIT */
+ ["\u0809", "\u0809"], /* SAMARITAN LETTER YUT */
+ ["\u080A", "\u080A"], /* SAMARITAN LETTER KAAF */
+ ["\u080B", "\u080B"], /* SAMARITAN LETTER LABAT */
+ ["\u080C", "\u080C"], /* SAMARITAN LETTER MIM */
+ ["\u080D", "\u080D"], /* SAMARITAN LETTER NUN */
+ ["\u080E", "\u080E"], /* SAMARITAN LETTER SINGAAT */
+ ["\u080F", "\u080F"], /* SAMARITAN LETTER IN */
+ ["\u0810", "\u0810"], /* SAMARITAN LETTER FI */
+ ["\u0811", "\u0811"], /* SAMARITAN LETTER TSAADIY */
+ ["\u0812", "\u0812"], /* SAMARITAN LETTER QUF */
+ ["\u0813", "\u0813"], /* SAMARITAN LETTER RISH */
+ ["\u0814", "\u0814"], /* SAMARITAN LETTER SHAN */
+ ["\u0815", "\u0815"], /* SAMARITAN LETTER TAAF */
+ ["\u0816", "\u0816"], /* SAMARITAN MARK IN */
+ ["\u0817", "\u0817"], /* SAMARITAN MARK IN-ALAF */
+ ["\u0818", "\u0818"], /* SAMARITAN MARK OCCLUSION */
+ ["\u0819", "\u0819"], /* SAMARITAN MARK DAGESH */
+ ["\u081A", "\u081A"], /* SAMARITAN MODIFIER LETTER EPENTHETIC YUT */
+ ["\u081B", "\u081B"], /* SAMARITAN MARK EPENTHETIC YUT */
+ ["\u081C", "\u081C"], /* SAMARITAN VOWEL SIGN LONG E */
+ ["\u081D", "\u081D"], /* SAMARITAN VOWEL SIGN E */
+ ["\u081E", "\u081E"], /* SAMARITAN VOWEL SIGN OVERLONG AA */
+ ["\u081F", "\u081F"], /* SAMARITAN VOWEL SIGN LONG AA */
+ ["\u0820", "\u0820"], /* SAMARITAN VOWEL SIGN AA */
+ ["\u0821", "\u0821"], /* SAMARITAN VOWEL SIGN OVERLONG A */
+ ["\u0822", "\u0822"], /* SAMARITAN VOWEL SIGN LONG A */
+ ["\u0823", "\u0823"], /* SAMARITAN VOWEL SIGN A */
+ ["\u0824", "\u0824"], /* SAMARITAN MODIFIER LETTER SHORT A */
+ ["\u0825", "\u0825"], /* SAMARITAN VOWEL SIGN SHORT A */
+ ["\u0826", "\u0826"], /* SAMARITAN VOWEL SIGN LONG U */
+ ["\u0827", "\u0827"], /* SAMARITAN VOWEL SIGN U */
+ ["\u0828", "\u0828"], /* SAMARITAN MODIFIER LETTER I */
+ ["\u0829", "\u0829"], /* SAMARITAN VOWEL SIGN LONG I */
+ ["\u082A", "\u082A"], /* SAMARITAN VOWEL SIGN I */
+ ["\u082B", "\u082B"], /* SAMARITAN VOWEL SIGN O */
+ ["\u082C", "\u082C"], /* SAMARITAN VOWEL SIGN SUKUN */
+ ["\u082D", "\u082D"], /* SAMARITAN MARK NEQUDAA */
+ ["\u082E", "\u082E"],
+ ["\u082F", "\u082F"],
+ ["\u0830", "\u0830"], /* SAMARITAN PUNCTUATION NEQUDAA */
+ ["\u0831", "\u0831"], /* SAMARITAN PUNCTUATION AFSAAQ */
+ ["\u0832", "\u0832"], /* SAMARITAN PUNCTUATION ANGED */
+ ["\u0833", "\u0833"], /* SAMARITAN PUNCTUATION BAU */
+ ["\u0834", "\u0834"], /* SAMARITAN PUNCTUATION ATMAAU */
+ ["\u0835", "\u0835"], /* SAMARITAN PUNCTUATION SHIYYAALAA */
+ ["\u0836", "\u0836"], /* SAMARITAN ABBREVIATION MARK */
+ ["\u0837", "\u0837"], /* SAMARITAN PUNCTUATION MELODIC QITSA */
+ ["\u0838", "\u0838"], /* SAMARITAN PUNCTUATION ZIQAA */
+ ["\u0839", "\u0839"], /* SAMARITAN PUNCTUATION QITSA */
+ ["\u083A", "\u083A"], /* SAMARITAN PUNCTUATION ZAEF */
+ ["\u083B", "\u083B"], /* SAMARITAN PUNCTUATION TURU */
+ ["\u083C", "\u083C"], /* SAMARITAN PUNCTUATION ARKAANU */
+ ["\u083D", "\u083D"], /* SAMARITAN PUNCTUATION SOF MASHFAAT */
+ ["\u083E", "\u083E"], /* SAMARITAN PUNCTUATION ANNAAU */
+ ["\u083F", "\u083F"],
+ ["\u0840", "\u0840"], /* MANDAIC LETTER HALQA */
+ ["\u0841", "\u0841"], /* MANDAIC LETTER AB */
+ ["\u0842", "\u0842"], /* MANDAIC LETTER AG */
+ ["\u0843", "\u0843"], /* MANDAIC LETTER AD */
+ ["\u0844", "\u0844"], /* MANDAIC LETTER AH */
+ ["\u0845", "\u0845"], /* MANDAIC LETTER USHENNA */
+ ["\u0846", "\u0846"], /* MANDAIC LETTER AZ */
+ ["\u0847", "\u0847"], /* MANDAIC LETTER IT */
+ ["\u0848", "\u0848"], /* MANDAIC LETTER ATT */
+ ["\u0849", "\u0849"], /* MANDAIC LETTER AKSA */
+ ["\u084A", "\u084A"], /* MANDAIC LETTER AK */
+ ["\u084B", "\u084B"], /* MANDAIC LETTER AL */
+ ["\u084C", "\u084C"], /* MANDAIC LETTER AM */
+ ["\u084D", "\u084D"], /* MANDAIC LETTER AN */
+ ["\u084E", "\u084E"], /* MANDAIC LETTER AS */
+ ["\u084F", "\u084F"], /* MANDAIC LETTER IN */
+ ["\u0850", "\u0850"], /* MANDAIC LETTER AP */
+ ["\u0851", "\u0851"], /* MANDAIC LETTER ASZ */
+ ["\u0852", "\u0852"], /* MANDAIC LETTER AQ */
+ ["\u0853", "\u0853"], /* MANDAIC LETTER AR */
+ ["\u0854", "\u0854"], /* MANDAIC LETTER ASH */
+ ["\u0855", "\u0855"], /* MANDAIC LETTER AT */
+ ["\u0856", "\u0856"], /* MANDAIC LETTER DUSHENNA */
+ ["\u0857", "\u0857"], /* MANDAIC LETTER KAD */
+ ["\u0858", "\u0858"], /* MANDAIC LETTER AIN */
+ ["\u0859", "\u0859"], /* MANDAIC AFFRICATION MARK */
+ ["\u085A", "\u085A"], /* MANDAIC VOCALIZATION MARK */
+ ["\u085B", "\u085B"], /* MANDAIC GEMINATION MARK */
+ ["\u085C", "\u085C"],
+ ["\u085D", "\u085D"],
+ ["\u085E", "\u085E"], /* MANDAIC PUNCTUATION */
+ ["\u085F", "\u085F"],
+ ["\u0860", "\u0860"], /* SYRIAC LETTER MALAYALAM NGA */
+ ["\u0861", "\u0861"], /* SYRIAC LETTER MALAYALAM JA */
+ ["\u0862", "\u0862"], /* SYRIAC LETTER MALAYALAM NYA */
+ ["\u0863", "\u0863"], /* SYRIAC LETTER MALAYALAM TTA */
+ ["\u0864", "\u0864"], /* SYRIAC LETTER MALAYALAM NNA */
+ ["\u0865", "\u0865"], /* SYRIAC LETTER MALAYALAM NNNA */
+ ["\u0866", "\u0866"], /* SYRIAC LETTER MALAYALAM BHA */
+ ["\u0867", "\u0867"], /* SYRIAC LETTER MALAYALAM RA */
+ ["\u0868", "\u0868"], /* SYRIAC LETTER MALAYALAM LLA */
+ ["\u0869", "\u0869"], /* SYRIAC LETTER MALAYALAM LLLA */
+ ["\u086A", "\u086A"], /* SYRIAC LETTER MALAYALAM SSA */
+ ["\u086B", "\u086B"],
+ ["\u086C", "\u086C"],
+ ["\u086D", "\u086D"],
+ ["\u086E", "\u086E"],
+ ["\u086F", "\u086F"],
+ ["\u0870", "\u0870"],
+ ["\u0871", "\u0871"],
+ ["\u0872", "\u0872"],
+ ["\u0873", "\u0873"],
+ ["\u0874", "\u0874"],
+ ["\u0875", "\u0875"],
+ ["\u0876", "\u0876"],
+ ["\u0877", "\u0877"],
+ ["\u0878", "\u0878"],
+ ["\u0879", "\u0879"],
+ ["\u087A", "\u087A"],
+ ["\u087B", "\u087B"],
+ ["\u087C", "\u087C"],
+ ["\u087D", "\u087D"],
+ ["\u087E", "\u087E"],
+ ["\u087F", "\u087F"],
+ ["\u0880", "\u0880"],
+ ["\u0881", "\u0881"],
+ ["\u0882", "\u0882"],
+ ["\u0883", "\u0883"],
+ ["\u0884", "\u0884"],
+ ["\u0885", "\u0885"],
+ ["\u0886", "\u0886"],
+ ["\u0887", "\u0887"],
+ ["\u0888", "\u0888"],
+ ["\u0889", "\u0889"],
+ ["\u088A", "\u088A"],
+ ["\u088B", "\u088B"],
+ ["\u088C", "\u088C"],
+ ["\u088D", "\u088D"],
+ ["\u088E", "\u088E"],
+ ["\u088F", "\u088F"],
+ ["\u0890", "\u0890"],
+ ["\u0891", "\u0891"],
+ ["\u0892", "\u0892"],
+ ["\u0893", "\u0893"],
+ ["\u0894", "\u0894"],
+ ["\u0895", "\u0895"],
+ ["\u0896", "\u0896"],
+ ["\u0897", "\u0897"],
+ ["\u0898", "\u0898"],
+ ["\u0899", "\u0899"],
+ ["\u089A", "\u089A"],
+ ["\u089B", "\u089B"],
+ ["\u089C", "\u089C"],
+ ["\u089D", "\u089D"],
+ ["\u089E", "\u089E"],
+ ["\u089F", "\u089F"],
+ ["\u08A0", "\u08A0"], /* ARABIC LETTER BEH WITH SMALL V BELOW */
+ ["\u08A1", "\u08A1"], /* ARABIC LETTER BEH WITH HAMZA ABOVE */
+ ["\u08A2", "\u08A2"], /* ARABIC LETTER JEEM WITH TWO DOTS ABOVE */
+ ["\u08A3", "\u08A3"], /* ARABIC LETTER TAH WITH TWO DOTS ABOVE */
+ ["\u08A4", "\u08A4"], /* ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE */
+ ["\u08A5", "\u08A5"], /* ARABIC LETTER QAF WITH DOT BELOW */
+ ["\u08A6", "\u08A6"], /* ARABIC LETTER LAM WITH DOUBLE BAR */
+ ["\u08A7", "\u08A7"], /* ARABIC LETTER MEEM WITH THREE DOTS ABOVE */
+ ["\u08A8", "\u08A8"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE */
+ ["\u08A9", "\u08A9"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE */
+ ["\u08AA", "\u08AA"], /* ARABIC LETTER REH WITH LOOP */
+ ["\u08AB", "\u08AB"], /* ARABIC LETTER WAW WITH DOT WITHIN */
+ ["\u08AC", "\u08AC"], /* ARABIC LETTER ROHINGYA YEH */
+ ["\u08AD", "\u08AD"], /* ARABIC LETTER LOW ALEF */
+ ["\u08AE", "\u08AE"], /* ARABIC LETTER DAL WITH THREE DOTS BELOW */
+ ["\u08AF", "\u08AF"], /* ARABIC LETTER SAD WITH THREE DOTS BELOW */
+ ["\u08B0", "\u08B0"], /* ARABIC LETTER GAF WITH INVERTED STROKE */
+ ["\u08B1", "\u08B1"], /* ARABIC LETTER STRAIGHT WAW */
+ ["\u08B2", "\u08B2"], /* ARABIC LETTER ZAIN WITH INVERTED V ABOVE */
+ ["\u08B3", "\u08B3"], /* ARABIC LETTER AIN WITH THREE DOTS BELOW */
+ ["\u08B4", "\u08B4"], /* ARABIC LETTER KAF WITH DOT BELOW */
+ ["\u08B5", "\u08B5"],
+ ["\u08B6", "\u08B6"], /* ARABIC LETTER BEH WITH SMALL MEEM ABOVE */
+ ["\u08B7", "\u08B7"], /* ARABIC LETTER PEH WITH SMALL MEEM ABOVE */
+ ["\u08B8", "\u08B8"], /* ARABIC LETTER TEH WITH SMALL TEH ABOVE */
+ ["\u08B9", "\u08B9"], /* ARABIC LETTER REH WITH SMALL NOON ABOVE */
+ ["\u08BA", "\u08BA"], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE */
+ ["\u08BB", "\u08BB"], /* ARABIC LETTER AFRICAN FEH */
+ ["\u08BC", "\u08BC"], /* ARABIC LETTER AFRICAN QAF */
+ ["\u08BD", "\u08BD"], /* ARABIC LETTER AFRICAN NOON */
+ ["\u08BE", "\u08BE"],
+ ["\u08BF", "\u08BF"],
+ ["\u08C0", "\u08C0"],
+ ["\u08C1", "\u08C1"],
+ ["\u08C2", "\u08C2"],
+ ["\u08C3", "\u08C3"],
+ ["\u08C4", "\u08C4"],
+ ["\u08C5", "\u08C5"],
+ ["\u08C6", "\u08C6"],
+ ["\u08C7", "\u08C7"],
+ ["\u08C8", "\u08C8"],
+ ["\u08C9", "\u08C9"],
+ ["\u08CA", "\u08CA"],
+ ["\u08CB", "\u08CB"],
+ ["\u08CC", "\u08CC"],
+ ["\u08CD", "\u08CD"],
+ ["\u08CE", "\u08CE"],
+ ["\u08CF", "\u08CF"],
+ ["\u08D0", "\u08D0"],
+ ["\u08D1", "\u08D1"],
+ ["\u08D2", "\u08D2"],
+ ["\u08D3", "\u08D3"], /* ARABIC SMALL LOW WAW */
+ ["\u08D4", "\u08D4"], /* ARABIC SMALL HIGH WORD AR-RUB */
+ ["\u08D5", "\u08D5"], /* ARABIC SMALL HIGH SAD */
+ ["\u08D6", "\u08D6"], /* ARABIC SMALL HIGH AIN */
+ ["\u08D7", "\u08D7"], /* ARABIC SMALL HIGH QAF */
+ ["\u08D8", "\u08D8"], /* ARABIC SMALL HIGH NOON WITH KASRA */
+ ["\u08D9", "\u08D9"], /* ARABIC SMALL LOW NOON WITH KASRA */
+ ["\u08DA", "\u08DA"], /* ARABIC SMALL HIGH WORD ATH-THALATHA */
+ ["\u08DB", "\u08DB"], /* ARABIC SMALL HIGH WORD AS-SAJDA */
+ ["\u08DC", "\u08DC"], /* ARABIC SMALL HIGH WORD AN-NISF */
+ ["\u08DD", "\u08DD"], /* ARABIC SMALL HIGH WORD SAKTA */
+ ["\u08DE", "\u08DE"], /* ARABIC SMALL HIGH WORD QIF */
+ ["\u08DF", "\u08DF"], /* ARABIC SMALL HIGH WORD WAQFA */
+ ["\u08E0", "\u08E0"], /* ARABIC SMALL HIGH FOOTNOTE MARKER */
+ ["\u08E1", "\u08E1"], /* ARABIC SMALL HIGH SIGN SAFHA */
+ ["\u08E2", "\u08E2"], /* ARABIC DISPUTED END OF AYAH */
+ ["\u08E3", "\u08E3"], /* ARABIC TURNED DAMMA BELOW */
+ ["\u08E4", "\u08E4"], /* ARABIC CURLY FATHA */
+ ["\u08E5", "\u08E5"], /* ARABIC CURLY DAMMA */
+ ["\u08E6", "\u08E6"], /* ARABIC CURLY KASRA */
+ ["\u08E7", "\u08E7"], /* ARABIC CURLY FATHATAN */
+ ["\u08E8", "\u08E8"], /* ARABIC CURLY DAMMATAN */
+ ["\u08E9", "\u08E9"], /* ARABIC CURLY KASRATAN */
+ ["\u08EA", "\u08EA"], /* ARABIC TONE ONE DOT ABOVE */
+ ["\u08EB", "\u08EB"], /* ARABIC TONE TWO DOTS ABOVE */
+ ["\u08EC", "\u08EC"], /* ARABIC TONE LOOP ABOVE */
+ ["\u08ED", "\u08ED"], /* ARABIC TONE ONE DOT BELOW */
+ ["\u08EE", "\u08EE"], /* ARABIC TONE TWO DOTS BELOW */
+ ["\u08EF", "\u08EF"], /* ARABIC TONE LOOP BELOW */
+ ["\u08F0", "\u08F0"], /* ARABIC OPEN FATHATAN */
+ ["\u08F1", "\u08F1"], /* ARABIC OPEN DAMMATAN */
+ ["\u08F2", "\u08F2"], /* ARABIC OPEN KASRATAN */
+ ["\u08F3", "\u08F3"], /* ARABIC SMALL HIGH WAW */
+ ["\u08F4", "\u08F4"], /* ARABIC FATHA WITH RING */
+ ["\u08F5", "\u08F5"], /* ARABIC FATHA WITH DOT ABOVE */
+ ["\u08F6", "\u08F6"], /* ARABIC KASRA WITH DOT BELOW */
+ ["\u08F7", "\u08F7"], /* ARABIC LEFT ARROWHEAD ABOVE */
+ ["\u08F8", "\u08F8"], /* ARABIC RIGHT ARROWHEAD ABOVE */
+ ["\u08F9", "\u08F9"], /* ARABIC LEFT ARROWHEAD BELOW */
+ ["\u08FA", "\u08FA"], /* ARABIC RIGHT ARROWHEAD BELOW */
+ ["\u08FB", "\u08FB"], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE */
+ ["\u08FC", "\u08FC"], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT */
+ ["\u08FD", "\u08FD"], /* ARABIC RIGHT ARROWHEAD ABOVE WITH DOT */
+ ["\u08FE", "\u08FE"], /* ARABIC DAMMA WITH DOT */
+ ["\u08FF", "\u08FF"], /* ARABIC MARK SIDEWAYS NOON GHUNNA */
+ ["\u0900", "\u0900"], /* DEVANAGARI SIGN INVERTED CANDRABINDU */
+ ["\u0901", "\u0901"], /* DEVANAGARI SIGN CANDRABINDU */
+ ["\u0902", "\u0902"], /* DEVANAGARI SIGN ANUSVARA */
+ ["\u0903", "\u0903"], /* DEVANAGARI SIGN VISARGA */
+ ["\u0904", "\u0904"], /* DEVANAGARI LETTER SHORT A */
+ ["\u0905", "\u0905"], /* DEVANAGARI LETTER A */
+ ["\u0906", "\u0906"], /* DEVANAGARI LETTER AA */
+ ["\u0907", "\u0907"], /* DEVANAGARI LETTER I */
+ ["\u0908", "\u0908"], /* DEVANAGARI LETTER II */
+ ["\u0909", "\u0909"], /* DEVANAGARI LETTER U */
+ ["\u090A", "\u090A"], /* DEVANAGARI LETTER UU */
+ ["\u090B", "\u090B"], /* DEVANAGARI LETTER VOCALIC R */
+ ["\u090C", "\u090C"], /* DEVANAGARI LETTER VOCALIC L */
+ ["\u090D", "\u090D"], /* DEVANAGARI LETTER CANDRA E */
+ ["\u090E", "\u090E"], /* DEVANAGARI LETTER SHORT E */
+ ["\u090F", "\u090F"], /* DEVANAGARI LETTER E */
+ ["\u0910", "\u0910"], /* DEVANAGARI LETTER AI */
+ ["\u0911", "\u0911"], /* DEVANAGARI LETTER CANDRA O */
+ ["\u0912", "\u0912"], /* DEVANAGARI LETTER SHORT O */
+ ["\u0913", "\u0913"], /* DEVANAGARI LETTER O */
+ ["\u0914", "\u0914"], /* DEVANAGARI LETTER AU */
+ ["\u0915", "\u0915"], /* DEVANAGARI LETTER KA */
+ ["\u0916", "\u0916"], /* DEVANAGARI LETTER KHA */
+ ["\u0917", "\u0917"], /* DEVANAGARI LETTER GA */
+ ["\u0918", "\u0918"], /* DEVANAGARI LETTER GHA */
+ ["\u0919", "\u0919"], /* DEVANAGARI LETTER NGA */
+ ["\u091A", "\u091A"], /* DEVANAGARI LETTER CA */
+ ["\u091B", "\u091B"], /* DEVANAGARI LETTER CHA */
+ ["\u091C", "\u091C"], /* DEVANAGARI LETTER JA */
+ ["\u091D", "\u091D"], /* DEVANAGARI LETTER JHA */
+ ["\u091E", "\u091E"], /* DEVANAGARI LETTER NYA */
+ ["\u091F", "\u091F"], /* DEVANAGARI LETTER TTA */
+ ["\u0920", "\u0920"], /* DEVANAGARI LETTER TTHA */
+ ["\u0921", "\u0921"], /* DEVANAGARI LETTER DDA */
+ ["\u0922", "\u0922"], /* DEVANAGARI LETTER DDHA */
+ ["\u0923", "\u0923"], /* DEVANAGARI LETTER NNA */
+ ["\u0924", "\u0924"], /* DEVANAGARI LETTER TA */
+ ["\u0925", "\u0925"], /* DEVANAGARI LETTER THA */
+ ["\u0926", "\u0926"], /* DEVANAGARI LETTER DA */
+ ["\u0927", "\u0927"], /* DEVANAGARI LETTER DHA */
+ ["\u0928", "\u0928"], /* DEVANAGARI LETTER NA */
+ ["\u0929", "\u0929"], /* DEVANAGARI LETTER NNNA */
+ ["\u092A", "\u092A"], /* DEVANAGARI LETTER PA */
+ ["\u092B", "\u092B"], /* DEVANAGARI LETTER PHA */
+ ["\u092C", "\u092C"], /* DEVANAGARI LETTER BA */
+ ["\u092D", "\u092D"], /* DEVANAGARI LETTER BHA */
+ ["\u092E", "\u092E"], /* DEVANAGARI LETTER MA */
+ ["\u092F", "\u092F"], /* DEVANAGARI LETTER YA */
+ ["\u0930", "\u0930"], /* DEVANAGARI LETTER RA */
+ ["\u0931", "\u0931"], /* DEVANAGARI LETTER RRA */
+ ["\u0932", "\u0932"], /* DEVANAGARI LETTER LA */
+ ["\u0933", "\u0933"], /* DEVANAGARI LETTER LLA */
+ ["\u0934", "\u0934"], /* DEVANAGARI LETTER LLLA */
+ ["\u0935", "\u0935"], /* DEVANAGARI LETTER VA */
+ ["\u0936", "\u0936"], /* DEVANAGARI LETTER SHA */
+ ["\u0937", "\u0937"], /* DEVANAGARI LETTER SSA */
+ ["\u0938", "\u0938"], /* DEVANAGARI LETTER SA */
+ ["\u0939", "\u0939"], /* DEVANAGARI LETTER HA */
+ ["\u093A", "\u093A"], /* DEVANAGARI VOWEL SIGN OE */
+ ["\u093B", "\u093B"], /* DEVANAGARI VOWEL SIGN OOE */
+ ["\u093C", "\u093C"], /* DEVANAGARI SIGN NUKTA */
+ ["\u093D", "\u093D"], /* DEVANAGARI SIGN AVAGRAHA */
+ ["\u093E", "\u093E"], /* DEVANAGARI VOWEL SIGN AA */
+ ["\u093F", "\u093F"], /* DEVANAGARI VOWEL SIGN I */
+ ["\u0940", "\u0940"], /* DEVANAGARI VOWEL SIGN II */
+ ["\u0941", "\u0941"], /* DEVANAGARI VOWEL SIGN U */
+ ["\u0942", "\u0942"], /* DEVANAGARI VOWEL SIGN UU */
+ ["\u0943", "\u0943"], /* DEVANAGARI VOWEL SIGN VOCALIC R */
+ ["\u0944", "\u0944"], /* DEVANAGARI VOWEL SIGN VOCALIC RR */
+ ["\u0945", "\u0945"], /* DEVANAGARI VOWEL SIGN CANDRA E */
+ ["\u0946", "\u0946"], /* DEVANAGARI VOWEL SIGN SHORT E */
+ ["\u0947", "\u0947"], /* DEVANAGARI VOWEL SIGN E */
+ ["\u0948", "\u0948"], /* DEVANAGARI VOWEL SIGN AI */
+ ["\u0949", "\u0949"], /* DEVANAGARI VOWEL SIGN CANDRA O */
+ ["\u094A", "\u094A"], /* DEVANAGARI VOWEL SIGN SHORT O */
+ ["\u094B", "\u094B"], /* DEVANAGARI VOWEL SIGN O */
+ ["\u094C", "\u094C"], /* DEVANAGARI VOWEL SIGN AU */
+ ["\u094D", "\u094D"], /* DEVANAGARI SIGN VIRAMA */
+ ["\u094E", "\u094E"], /* DEVANAGARI VOWEL SIGN PRISHTHAMATRA E */
+ ["\u094F", "\u094F"], /* DEVANAGARI VOWEL SIGN AW */
+ ["\u0950", "\u0950"], /* DEVANAGARI OM */
+ ["\u0951", "\u0951"], /* DEVANAGARI STRESS SIGN UDATTA */
+ ["\u0952", "\u0952"], /* DEVANAGARI STRESS SIGN ANUDATTA */
+ ["\u0953", "\u0953"], /* DEVANAGARI GRAVE ACCENT */
+ ["\u0954", "\u0954"], /* DEVANAGARI ACUTE ACCENT */
+ ["\u0955", "\u0955"], /* DEVANAGARI VOWEL SIGN CANDRA LONG E */
+ ["\u0956", "\u0956"], /* DEVANAGARI VOWEL SIGN UE */
+ ["\u0957", "\u0957"], /* DEVANAGARI VOWEL SIGN UUE */
+ ["\u0958", "\u0958"], /* DEVANAGARI LETTER QA */
+ ["\u0959", "\u0959"], /* DEVANAGARI LETTER KHHA */
+ ["\u095A", "\u095A"], /* DEVANAGARI LETTER GHHA */
+ ["\u095B", "\u095B"], /* DEVANAGARI LETTER ZA */
+ ["\u095C", "\u095C"], /* DEVANAGARI LETTER DDDHA */
+ ["\u095D", "\u095D"], /* DEVANAGARI LETTER RHA */
+ ["\u095E", "\u095E"], /* DEVANAGARI LETTER FA */
+ ["\u095F", "\u095F"], /* DEVANAGARI LETTER YYA */
+ ["\u0960", "\u0960"], /* DEVANAGARI LETTER VOCALIC RR */
+ ["\u0961", "\u0961"], /* DEVANAGARI LETTER VOCALIC LL */
+ ["\u0962", "\u0962"], /* DEVANAGARI VOWEL SIGN VOCALIC L */
+ ["\u0963", "\u0963"], /* DEVANAGARI VOWEL SIGN VOCALIC LL */
+ ["\u0964", "\u0964"], /* DEVANAGARI DANDA */
+ ["\u0965", "\u0965"], /* DEVANAGARI DOUBLE DANDA */
+ ["\u0966", "\u0966"], /* DEVANAGARI DIGIT ZERO */
+ ["\u0967", "\u0967"], /* DEVANAGARI DIGIT ONE */
+ ["\u0968", "\u0968"], /* DEVANAGARI DIGIT TWO */
+ ["\u0969", "\u0969"], /* DEVANAGARI DIGIT THREE */
+ ["\u096A", "\u096A"], /* DEVANAGARI DIGIT FOUR */
+ ["\u096B", "\u096B"], /* DEVANAGARI DIGIT FIVE */
+ ["\u096C", "\u096C"], /* DEVANAGARI DIGIT SIX */
+ ["\u096D", "\u096D"], /* DEVANAGARI DIGIT SEVEN */
+ ["\u096E", "\u096E"], /* DEVANAGARI DIGIT EIGHT */
+ ["\u096F", "\u096F"], /* DEVANAGARI DIGIT NINE */
+ ["\u0970", "\u0970"], /* DEVANAGARI ABBREVIATION SIGN */
+ ["\u0971", "\u0971"], /* DEVANAGARI SIGN HIGH SPACING DOT */
+ ["\u0972", "\u0972"], /* DEVANAGARI LETTER CANDRA A */
+ ["\u0973", "\u0973"], /* DEVANAGARI LETTER OE */
+ ["\u0974", "\u0974"], /* DEVANAGARI LETTER OOE */
+ ["\u0975", "\u0975"], /* DEVANAGARI LETTER AW */
+ ["\u0976", "\u0976"], /* DEVANAGARI LETTER UE */
+ ["\u0977", "\u0977"], /* DEVANAGARI LETTER UUE */
+ ["\u0978", "\u0978"], /* DEVANAGARI LETTER MARWARI DDA */
+ ["\u0979", "\u0979"], /* DEVANAGARI LETTER ZHA */
+ ["\u097A", "\u097A"], /* DEVANAGARI LETTER HEAVY YA */
+ ["\u097B", "\u097B"], /* DEVANAGARI LETTER GGA */
+ ["\u097C", "\u097C"], /* DEVANAGARI LETTER JJA */
+ ["\u097D", "\u097D"], /* DEVANAGARI LETTER GLOTTAL STOP */
+ ["\u097E", "\u097E"], /* DEVANAGARI LETTER DDDA */
+ ["\u097F", "\u097F"], /* DEVANAGARI LETTER BBA */
+ ["\u0980", "\u0980"], /* BENGALI ANJI */
+ ["\u0981", "\u0981"], /* BENGALI SIGN CANDRABINDU */
+ ["\u0982", "\u0982"], /* BENGALI SIGN ANUSVARA */
+ ["\u0983", "\u0983"], /* BENGALI SIGN VISARGA */
+ ["\u0984", "\u0984"],
+ ["\u0985", "\u0985"], /* BENGALI LETTER A */
+ ["\u0986", "\u0986"], /* BENGALI LETTER AA */
+ ["\u0987", "\u0987"], /* BENGALI LETTER I */
+ ["\u0988", "\u0988"], /* BENGALI LETTER II */
+ ["\u0989", "\u0989"], /* BENGALI LETTER U */
+ ["\u098A", "\u098A"], /* BENGALI LETTER UU */
+ ["\u098B", "\u098B"], /* BENGALI LETTER VOCALIC R */
+ ["\u098C", "\u098C"], /* BENGALI LETTER VOCALIC L */
+ ["\u098D", "\u098D"],
+ ["\u098E", "\u098E"],
+ ["\u098F", "\u098F"], /* BENGALI LETTER E */
+ ["\u0990", "\u0990"], /* BENGALI LETTER AI */
+ ["\u0991", "\u0991"],
+ ["\u0992", "\u0992"],
+ ["\u0993", "\u0993"], /* BENGALI LETTER O */
+ ["\u0994", "\u0994"], /* BENGALI LETTER AU */
+ ["\u0995", "\u0995"], /* BENGALI LETTER KA */
+ ["\u0996", "\u0996"], /* BENGALI LETTER KHA */
+ ["\u0997", "\u0997"], /* BENGALI LETTER GA */
+ ["\u0998", "\u0998"], /* BENGALI LETTER GHA */
+ ["\u0999", "\u0999"], /* BENGALI LETTER NGA */
+ ["\u099A", "\u099A"], /* BENGALI LETTER CA */
+ ["\u099B", "\u099B"], /* BENGALI LETTER CHA */
+ ["\u099C", "\u099C"], /* BENGALI LETTER JA */
+ ["\u099D", "\u099D"], /* BENGALI LETTER JHA */
+ ["\u099E", "\u099E"], /* BENGALI LETTER NYA */
+ ["\u099F", "\u099F"], /* BENGALI LETTER TTA */
+ ["\u09A0", "\u09A0"], /* BENGALI LETTER TTHA */
+ ["\u09A1", "\u09A1"], /* BENGALI LETTER DDA */
+ ["\u09A2", "\u09A2"], /* BENGALI LETTER DDHA */
+ ["\u09A3", "\u09A3"], /* BENGALI LETTER NNA */
+ ["\u09A4", "\u09A4"], /* BENGALI LETTER TA */
+ ["\u09A5", "\u09A5"], /* BENGALI LETTER THA */
+ ["\u09A6", "\u09A6"], /* BENGALI LETTER DA */
+ ["\u09A7", "\u09A7"], /* BENGALI LETTER DHA */
+ ["\u09A8", "\u09A8"], /* BENGALI LETTER NA */
+ ["\u09A9", "\u09A9"],
+ ["\u09AA", "\u09AA"], /* BENGALI LETTER PA */
+ ["\u09AB", "\u09AB"], /* BENGALI LETTER PHA */
+ ["\u09AC", "\u09AC"], /* BENGALI LETTER BA */
+ ["\u09AD", "\u09AD"], /* BENGALI LETTER BHA */
+ ["\u09AE", "\u09AE"], /* BENGALI LETTER MA */
+ ["\u09AF", "\u09AF"], /* BENGALI LETTER YA */
+ ["\u09B0", "\u09B0"], /* BENGALI LETTER RA */
+ ["\u09B1", "\u09B1"],
+ ["\u09B2", "\u09B2"], /* BENGALI LETTER LA */
+ ["\u09B3", "\u09B3"],
+ ["\u09B4", "\u09B4"],
+ ["\u09B5", "\u09B5"],
+ ["\u09B6", "\u09B6"], /* BENGALI LETTER SHA */
+ ["\u09B7", "\u09B7"], /* BENGALI LETTER SSA */
+ ["\u09B8", "\u09B8"], /* BENGALI LETTER SA */
+ ["\u09B9", "\u09B9"], /* BENGALI LETTER HA */
+ ["\u09BA", "\u09BA"],
+ ["\u09BB", "\u09BB"],
+ ["\u09BC", "\u09BC"], /* BENGALI SIGN NUKTA */
+ ["\u09BD", "\u09BD"], /* BENGALI SIGN AVAGRAHA */
+ ["\u09BE", "\u09BE"], /* BENGALI VOWEL SIGN AA */
+ ["\u09BF", "\u09BF"], /* BENGALI VOWEL SIGN I */
+ ["\u09C0", "\u09C0"], /* BENGALI VOWEL SIGN II */
+ ["\u09C1", "\u09C1"], /* BENGALI VOWEL SIGN U */
+ ["\u09C2", "\u09C2"], /* BENGALI VOWEL SIGN UU */
+ ["\u09C3", "\u09C3"], /* BENGALI VOWEL SIGN VOCALIC R */
+ ["\u09C4", "\u09C4"], /* BENGALI VOWEL SIGN VOCALIC RR */
+ ["\u09C5", "\u09C5"],
+ ["\u09C6", "\u09C6"],
+ ["\u09C7", "\u09C7"], /* BENGALI VOWEL SIGN E */
+ ["\u09C8", "\u09C8"], /* BENGALI VOWEL SIGN AI */
+ ["\u09C9", "\u09C9"],
+ ["\u09CA", "\u09CA"],
+ ["\u09CB", "\u09CB"], /* BENGALI VOWEL SIGN O */
+ ["\u09CC", "\u09CC"], /* BENGALI VOWEL SIGN AU */
+ ["\u09CD", "\u09CD"], /* BENGALI SIGN VIRAMA */
+ ["\u09CE", "\u09CE"], /* BENGALI LETTER KHANDA TA */
+ ["\u09CF", "\u09CF"],
+ ["\u09D0", "\u09D0"],
+ ["\u09D1", "\u09D1"],
+ ["\u09D2", "\u09D2"],
+ ["\u09D3", "\u09D3"],
+ ["\u09D4", "\u09D4"],
+ ["\u09D5", "\u09D5"],
+ ["\u09D6", "\u09D6"],
+ ["\u09D7", "\u09D7"], /* BENGALI AU LENGTH MARK */
+ ["\u09D8", "\u09D8"],
+ ["\u09D9", "\u09D9"],
+ ["\u09DA", "\u09DA"],
+ ["\u09DB", "\u09DB"],
+ ["\u09DC", "\u09DC"], /* BENGALI LETTER RRA */
+ ["\u09DD", "\u09DD"], /* BENGALI LETTER RHA */
+ ["\u09DE", "\u09DE"],
+ ["\u09DF", "\u09DF"], /* BENGALI LETTER YYA */
+ ["\u09E0", "\u09E0"], /* BENGALI LETTER VOCALIC RR */
+ ["\u09E1", "\u09E1"], /* BENGALI LETTER VOCALIC LL */
+ ["\u09E2", "\u09E2"], /* BENGALI VOWEL SIGN VOCALIC L */
+ ["\u09E3", "\u09E3"], /* BENGALI VOWEL SIGN VOCALIC LL */
+ ["\u09E4", "\u09E4"],
+ ["\u09E5", "\u09E5"],
+ ["\u09E6", "\u09E6"], /* BENGALI DIGIT ZERO */
+ ["\u09E7", "\u09E7"], /* BENGALI DIGIT ONE */
+ ["\u09E8", "\u09E8"], /* BENGALI DIGIT TWO */
+ ["\u09E9", "\u09E9"], /* BENGALI DIGIT THREE */
+ ["\u09EA", "\u09EA"], /* BENGALI DIGIT FOUR */
+ ["\u09EB", "\u09EB"], /* BENGALI DIGIT FIVE */
+ ["\u09EC", "\u09EC"], /* BENGALI DIGIT SIX */
+ ["\u09ED", "\u09ED"], /* BENGALI DIGIT SEVEN */
+ ["\u09EE", "\u09EE"], /* BENGALI DIGIT EIGHT */
+ ["\u09EF", "\u09EF"], /* BENGALI DIGIT NINE */
+ ["\u09F0", "\u09F0"], /* BENGALI LETTER RA WITH MIDDLE DIAGONAL */
+ ["\u09F1", "\u09F1"], /* BENGALI LETTER RA WITH LOWER DIAGONAL (BENGALI LETTER VA WITH LOWER DIAGONAL) */
+ ["\u09F2", "\u09F2"], /* BENGALI RUPEE MARK */
+ ["\u09F3", "\u09F3"], /* BENGALI RUPEE SIGN */
+ ["\u09F4", "\u09F4"], /* BENGALI CURRENCY NUMERATOR ONE */
+ ["\u09F5", "\u09F5"], /* BENGALI CURRENCY NUMERATOR TWO */
+ ["\u09F6", "\u09F6"], /* BENGALI CURRENCY NUMERATOR THREE */
+ ["\u09F7", "\u09F7"], /* BENGALI CURRENCY NUMERATOR FOUR */
+ ["\u09F8", "\u09F8"], /* BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR */
+ ["\u09F9", "\u09F9"], /* BENGALI CURRENCY DENOMINATOR SIXTEEN */
+ ["\u09FA", "\u09FA"], /* BENGALI ISSHAR */
+ ["\u09FB", "\u09FB"], /* BENGALI GANDA MARK */
+ ["\u09FC", "\u09FC"], /* BENGALI LETTER VEDIC ANUSVARA */
+ ["\u09FD", "\u09FD"], /* BENGALI ABBREVIATION SIGN */
+ ["\u09FE", "\u09FE"], /* BENGALI SANDHI MARK */
+ ["\u09FF", "\u09FF"],
+ ["\u0A00", "\u0A00"],
+ ["\u0A01", "\u0A01"], /* GURMUKHI SIGN ADAK BINDI */
+ ["\u0A02", "\u0A02"], /* GURMUKHI SIGN BINDI */
+ ["\u0A03", "\u0A03"], /* GURMUKHI SIGN VISARGA */
+ ["\u0A04", "\u0A04"],
+ ["\u0A05", "\u0A05"], /* GURMUKHI LETTER A */
+ ["\u0A06", "\u0A06"], /* GURMUKHI LETTER AA */
+ ["\u0A07", "\u0A07"], /* GURMUKHI LETTER I */
+ ["\u0A08", "\u0A08"], /* GURMUKHI LETTER II */
+ ["\u0A09", "\u0A09"], /* GURMUKHI LETTER U */
+ ["\u0A0A", "\u0A0A"], /* GURMUKHI LETTER UU */
+ ["\u0A0B", "\u0A0B"],
+ ["\u0A0C", "\u0A0C"],
+ ["\u0A0D", "\u0A0D"],
+ ["\u0A0E", "\u0A0E"],
+ ["\u0A0F", "\u0A0F"], /* GURMUKHI LETTER EE */
+ ["\u0A10", "\u0A10"], /* GURMUKHI LETTER AI */
+ ["\u0A11", "\u0A11"],
+ ["\u0A12", "\u0A12"],
+ ["\u0A13", "\u0A13"], /* GURMUKHI LETTER OO */
+ ["\u0A14", "\u0A14"], /* GURMUKHI LETTER AU */
+ ["\u0A15", "\u0A15"], /* GURMUKHI LETTER KA */
+ ["\u0A16", "\u0A16"], /* GURMUKHI LETTER KHA */
+ ["\u0A17", "\u0A17"], /* GURMUKHI LETTER GA */
+ ["\u0A18", "\u0A18"], /* GURMUKHI LETTER GHA */
+ ["\u0A19", "\u0A19"], /* GURMUKHI LETTER NGA */
+ ["\u0A1A", "\u0A1A"], /* GURMUKHI LETTER CA */
+ ["\u0A1B", "\u0A1B"], /* GURMUKHI LETTER CHA */
+ ["\u0A1C", "\u0A1C"], /* GURMUKHI LETTER JA */
+ ["\u0A1D", "\u0A1D"], /* GURMUKHI LETTER JHA */
+ ["\u0A1E", "\u0A1E"], /* GURMUKHI LETTER NYA */
+ ["\u0A1F", "\u0A1F"], /* GURMUKHI LETTER TTA */
+ ["\u0A20", "\u0A20"], /* GURMUKHI LETTER TTHA */
+ ["\u0A21", "\u0A21"], /* GURMUKHI LETTER DDA */
+ ["\u0A22", "\u0A22"], /* GURMUKHI LETTER DDHA */
+ ["\u0A23", "\u0A23"], /* GURMUKHI LETTER NNA */
+ ["\u0A24", "\u0A24"], /* GURMUKHI LETTER TA */
+ ["\u0A25", "\u0A25"], /* GURMUKHI LETTER THA */
+ ["\u0A26", "\u0A26"], /* GURMUKHI LETTER DA */
+ ["\u0A27", "\u0A27"], /* GURMUKHI LETTER DHA */
+ ["\u0A28", "\u0A28"], /* GURMUKHI LETTER NA */
+ ["\u0A29", "\u0A29"],
+ ["\u0A2A", "\u0A2A"], /* GURMUKHI LETTER PA */
+ ["\u0A2B", "\u0A2B"], /* GURMUKHI LETTER PHA */
+ ["\u0A2C", "\u0A2C"], /* GURMUKHI LETTER BA */
+ ["\u0A2D", "\u0A2D"], /* GURMUKHI LETTER BHA */
+ ["\u0A2E", "\u0A2E"], /* GURMUKHI LETTER MA */
+ ["\u0A2F", "\u0A2F"], /* GURMUKHI LETTER YA */
+ ["\u0A30", "\u0A30"], /* GURMUKHI LETTER RA */
+ ["\u0A31", "\u0A31"],
+ ["\u0A32", "\u0A32"], /* GURMUKHI LETTER LA */
+ ["\u0A33", "\u0A33"], /* GURMUKHI LETTER LLA */
+ ["\u0A34", "\u0A34"],
+ ["\u0A35", "\u0A35"], /* GURMUKHI LETTER VA */
+ ["\u0A36", "\u0A36"], /* GURMUKHI LETTER SHA */
+ ["\u0A37", "\u0A37"],
+ ["\u0A38", "\u0A38"], /* GURMUKHI LETTER SA */
+ ["\u0A39", "\u0A39"], /* GURMUKHI LETTER HA */
+ ["\u0A3A", "\u0A3A"],
+ ["\u0A3B", "\u0A3B"],
+ ["\u0A3C", "\u0A3C"], /* GURMUKHI SIGN NUKTA */
+ ["\u0A3D", "\u0A3D"],
+ ["\u0A3E", "\u0A3E"], /* GURMUKHI VOWEL SIGN AA */
+ ["\u0A3F", "\u0A3F"], /* GURMUKHI VOWEL SIGN I */
+ ["\u0A40", "\u0A40"], /* GURMUKHI VOWEL SIGN II */
+ ["\u0A41", "\u0A41"], /* GURMUKHI VOWEL SIGN U */
+ ["\u0A42", "\u0A42"], /* GURMUKHI VOWEL SIGN UU */
+ ["\u0A43", "\u0A43"],
+ ["\u0A44", "\u0A44"],
+ ["\u0A45", "\u0A45"],
+ ["\u0A46", "\u0A46"],
+ ["\u0A47", "\u0A47"], /* GURMUKHI VOWEL SIGN EE */
+ ["\u0A48", "\u0A48"], /* GURMUKHI VOWEL SIGN AI */
+ ["\u0A49", "\u0A49"],
+ ["\u0A4A", "\u0A4A"],
+ ["\u0A4B", "\u0A4B"], /* GURMUKHI VOWEL SIGN OO */
+ ["\u0A4C", "\u0A4C"], /* GURMUKHI VOWEL SIGN AU */
+ ["\u0A4D", "\u0A4D"], /* GURMUKHI SIGN VIRAMA */
+ ["\u0A4E", "\u0A4E"],
+ ["\u0A4F", "\u0A4F"],
+ ["\u0A50", "\u0A50"],
+ ["\u0A51", "\u0A51"], /* GURMUKHI SIGN UDAAT */
+ ["\u0A52", "\u0A52"],
+ ["\u0A53", "\u0A53"],
+ ["\u0A54", "\u0A54"],
+ ["\u0A55", "\u0A55"],
+ ["\u0A56", "\u0A56"],
+ ["\u0A57", "\u0A57"],
+ ["\u0A58", "\u0A58"],
+ ["\u0A59", "\u0A59"], /* GURMUKHI LETTER KHHA */
+ ["\u0A5A", "\u0A5A"], /* GURMUKHI LETTER GHHA */
+ ["\u0A5B", "\u0A5B"], /* GURMUKHI LETTER ZA */
+ ["\u0A5C", "\u0A5C"], /* GURMUKHI LETTER RRA */
+ ["\u0A5D", "\u0A5D"],
+ ["\u0A5E", "\u0A5E"], /* GURMUKHI LETTER FA */
+ ["\u0A5F", "\u0A5F"],
+ ["\u0A60", "\u0A60"],
+ ["\u0A61", "\u0A61"],
+ ["\u0A62", "\u0A62"],
+ ["\u0A63", "\u0A63"],
+ ["\u0A64", "\u0A64"],
+ ["\u0A65", "\u0A65"],
+ ["\u0A66", "\u0A66"], /* GURMUKHI DIGIT ZERO */
+ ["\u0A67", "\u0A67"], /* GURMUKHI DIGIT ONE */
+ ["\u0A68", "\u0A68"], /* GURMUKHI DIGIT TWO */
+ ["\u0A69", "\u0A69"], /* GURMUKHI DIGIT THREE */
+ ["\u0A6A", "\u0A6A"], /* GURMUKHI DIGIT FOUR */
+ ["\u0A6B", "\u0A6B"], /* GURMUKHI DIGIT FIVE */
+ ["\u0A6C", "\u0A6C"], /* GURMUKHI DIGIT SIX */
+ ["\u0A6D", "\u0A6D"], /* GURMUKHI DIGIT SEVEN */
+ ["\u0A6E", "\u0A6E"], /* GURMUKHI DIGIT EIGHT */
+ ["\u0A6F", "\u0A6F"], /* GURMUKHI DIGIT NINE */
+ ["\u0A70", "\u0A70"], /* GURMUKHI TIPPI */
+ ["\u0A71", "\u0A71"], /* GURMUKHI ADDAK */
+ ["\u0A72", "\u0A72"], /* GURMUKHI IRI */
+ ["\u0A73", "\u0A73"], /* GURMUKHI URA */
+ ["\u0A74", "\u0A74"], /* GURMUKHI EK ONKAR */
+ ["\u0A75", "\u0A75"], /* GURMUKHI SIGN YAKASH */
+ ["\u0A76", "\u0A76"], /* GURMUKHI ABBREVIATION SIGN */
+ ["\u0A77", "\u0A77"],
+ ["\u0A78", "\u0A78"],
+ ["\u0A79", "\u0A79"],
+ ["\u0A7A", "\u0A7A"],
+ ["\u0A7B", "\u0A7B"],
+ ["\u0A7C", "\u0A7C"],
+ ["\u0A7D", "\u0A7D"],
+ ["\u0A7E", "\u0A7E"],
+ ["\u0A7F", "\u0A7F"],
+ ["\u0A80", "\u0A80"],
+ ["\u0A81", "\u0A81"], /* GUJARATI SIGN CANDRABINDU */
+ ["\u0A82", "\u0A82"], /* GUJARATI SIGN ANUSVARA */
+ ["\u0A83", "\u0A83"], /* GUJARATI SIGN VISARGA */
+ ["\u0A84", "\u0A84"],
+ ["\u0A85", "\u0A85"], /* GUJARATI LETTER A */
+ ["\u0A86", "\u0A86"], /* GUJARATI LETTER AA */
+ ["\u0A87", "\u0A87"], /* GUJARATI LETTER I */
+ ["\u0A88", "\u0A88"], /* GUJARATI LETTER II */
+ ["\u0A89", "\u0A89"], /* GUJARATI LETTER U */
+ ["\u0A8A", "\u0A8A"], /* GUJARATI LETTER UU */
+ ["\u0A8B", "\u0A8B"], /* GUJARATI LETTER VOCALIC R */
+ ["\u0A8C", "\u0A8C"], /* GUJARATI LETTER VOCALIC L */
+ ["\u0A8D", "\u0A8D"], /* GUJARATI VOWEL CANDRA E */
+ ["\u0A8E", "\u0A8E"],
+ ["\u0A8F", "\u0A8F"], /* GUJARATI LETTER E */
+ ["\u0A90", "\u0A90"], /* GUJARATI LETTER AI */
+ ["\u0A91", "\u0A91"], /* GUJARATI VOWEL CANDRA O */
+ ["\u0A92", "\u0A92"],
+ ["\u0A93", "\u0A93"], /* GUJARATI LETTER O */
+ ["\u0A94", "\u0A94"], /* GUJARATI LETTER AU */
+ ["\u0A95", "\u0A95"], /* GUJARATI LETTER KA */
+ ["\u0A96", "\u0A96"], /* GUJARATI LETTER KHA */
+ ["\u0A97", "\u0A97"], /* GUJARATI LETTER GA */
+ ["\u0A98", "\u0A98"], /* GUJARATI LETTER GHA */
+ ["\u0A99", "\u0A99"], /* GUJARATI LETTER NGA */
+ ["\u0A9A", "\u0A9A"], /* GUJARATI LETTER CA */
+ ["\u0A9B", "\u0A9B"], /* GUJARATI LETTER CHA */
+ ["\u0A9C", "\u0A9C"], /* GUJARATI LETTER JA */
+ ["\u0A9D", "\u0A9D"], /* GUJARATI LETTER JHA */
+ ["\u0A9E", "\u0A9E"], /* GUJARATI LETTER NYA */
+ ["\u0A9F", "\u0A9F"], /* GUJARATI LETTER TTA */
+ ["\u0AA0", "\u0AA0"], /* GUJARATI LETTER TTHA */
+ ["\u0AA1", "\u0AA1"], /* GUJARATI LETTER DDA */
+ ["\u0AA2", "\u0AA2"], /* GUJARATI LETTER DDHA */
+ ["\u0AA3", "\u0AA3"], /* GUJARATI LETTER NNA */
+ ["\u0AA4", "\u0AA4"], /* GUJARATI LETTER TA */
+ ["\u0AA5", "\u0AA5"], /* GUJARATI LETTER THA */
+ ["\u0AA6", "\u0AA6"], /* GUJARATI LETTER DA */
+ ["\u0AA7", "\u0AA7"], /* GUJARATI LETTER DHA */
+ ["\u0AA8", "\u0AA8"], /* GUJARATI LETTER NA */
+ ["\u0AA9", "\u0AA9"],
+ ["\u0AAA", "\u0AAA"], /* GUJARATI LETTER PA */
+ ["\u0AAB", "\u0AAB"], /* GUJARATI LETTER PHA */
+ ["\u0AAC", "\u0AAC"], /* GUJARATI LETTER BA */
+ ["\u0AAD", "\u0AAD"], /* GUJARATI LETTER BHA */
+ ["\u0AAE", "\u0AAE"], /* GUJARATI LETTER MA */
+ ["\u0AAF", "\u0AAF"], /* GUJARATI LETTER YA */
+ ["\u0AB0", "\u0AB0"], /* GUJARATI LETTER RA */
+ ["\u0AB1", "\u0AB1"],
+ ["\u0AB2", "\u0AB2"], /* GUJARATI LETTER LA */
+ ["\u0AB3", "\u0AB3"], /* GUJARATI LETTER LLA */
+ ["\u0AB4", "\u0AB4"],
+ ["\u0AB5", "\u0AB5"], /* GUJARATI LETTER VA */
+ ["\u0AB6", "\u0AB6"], /* GUJARATI LETTER SHA */
+ ["\u0AB7", "\u0AB7"], /* GUJARATI LETTER SSA */
+ ["\u0AB8", "\u0AB8"], /* GUJARATI LETTER SA */
+ ["\u0AB9", "\u0AB9"], /* GUJARATI LETTER HA */
+ ["\u0ABA", "\u0ABA"],
+ ["\u0ABB", "\u0ABB"],
+ ["\u0ABC", "\u0ABC"], /* GUJARATI SIGN NUKTA */
+ ["\u0ABD", "\u0ABD"], /* GUJARATI SIGN AVAGRAHA */
+ ["\u0ABE", "\u0ABE"], /* GUJARATI VOWEL SIGN AA */
+ ["\u0ABF", "\u0ABF"], /* GUJARATI VOWEL SIGN I */
+ ["\u0AC0", "\u0AC0"], /* GUJARATI VOWEL SIGN II */
+ ["\u0AC1", "\u0AC1"], /* GUJARATI VOWEL SIGN U */
+ ["\u0AC2", "\u0AC2"], /* GUJARATI VOWEL SIGN UU */
+ ["\u0AC3", "\u0AC3"], /* GUJARATI VOWEL SIGN VOCALIC R */
+ ["\u0AC4", "\u0AC4"], /* GUJARATI VOWEL SIGN VOCALIC RR */
+ ["\u0AC5", "\u0AC5"], /* GUJARATI VOWEL SIGN CANDRA E */
+ ["\u0AC6", "\u0AC6"],
+ ["\u0AC7", "\u0AC7"], /* GUJARATI VOWEL SIGN E */
+ ["\u0AC8", "\u0AC8"], /* GUJARATI VOWEL SIGN AI */
+ ["\u0AC9", "\u0AC9"], /* GUJARATI VOWEL SIGN CANDRA O */
+ ["\u0ACA", "\u0ACA"],
+ ["\u0ACB", "\u0ACB"], /* GUJARATI VOWEL SIGN O */
+ ["\u0ACC", "\u0ACC"], /* GUJARATI VOWEL SIGN AU */
+ ["\u0ACD", "\u0ACD"], /* GUJARATI SIGN VIRAMA */
+ ["\u0ACE", "\u0ACE"],
+ ["\u0ACF", "\u0ACF"],
+ ["\u0AD0", "\u0AD0"], /* GUJARATI OM */
+ ["\u0AD1", "\u0AD1"],
+ ["\u0AD2", "\u0AD2"],
+ ["\u0AD3", "\u0AD3"],
+ ["\u0AD4", "\u0AD4"],
+ ["\u0AD5", "\u0AD5"],
+ ["\u0AD6", "\u0AD6"],
+ ["\u0AD7", "\u0AD7"],
+ ["\u0AD8", "\u0AD8"],
+ ["\u0AD9", "\u0AD9"],
+ ["\u0ADA", "\u0ADA"],
+ ["\u0ADB", "\u0ADB"],
+ ["\u0ADC", "\u0ADC"],
+ ["\u0ADD", "\u0ADD"],
+ ["\u0ADE", "\u0ADE"],
+ ["\u0ADF", "\u0ADF"],
+ ["\u0AE0", "\u0AE0"], /* GUJARATI LETTER VOCALIC RR */
+ ["\u0AE1", "\u0AE1"], /* GUJARATI LETTER VOCALIC LL */
+ ["\u0AE2", "\u0AE2"], /* GUJARATI VOWEL SIGN VOCALIC L */
+ ["\u0AE3", "\u0AE3"], /* GUJARATI VOWEL SIGN VOCALIC LL */
+ ["\u0AE4", "\u0AE4"],
+ ["\u0AE5", "\u0AE5"],
+ ["\u0AE6", "\u0AE6"], /* GUJARATI DIGIT ZERO */
+ ["\u0AE7", "\u0AE7"], /* GUJARATI DIGIT ONE */
+ ["\u0AE8", "\u0AE8"], /* GUJARATI DIGIT TWO */
+ ["\u0AE9", "\u0AE9"], /* GUJARATI DIGIT THREE */
+ ["\u0AEA", "\u0AEA"], /* GUJARATI DIGIT FOUR */
+ ["\u0AEB", "\u0AEB"], /* GUJARATI DIGIT FIVE */
+ ["\u0AEC", "\u0AEC"], /* GUJARATI DIGIT SIX */
+ ["\u0AED", "\u0AED"], /* GUJARATI DIGIT SEVEN */
+ ["\u0AEE", "\u0AEE"], /* GUJARATI DIGIT EIGHT */
+ ["\u0AEF", "\u0AEF"], /* GUJARATI DIGIT NINE */
+ ["\u0AF0", "\u0AF0"], /* GUJARATI ABBREVIATION SIGN */
+ ["\u0AF1", "\u0AF1"], /* GUJARATI RUPEE SIGN */
+ ["\u0AF2", "\u0AF2"],
+ ["\u0AF3", "\u0AF3"],
+ ["\u0AF4", "\u0AF4"],
+ ["\u0AF5", "\u0AF5"],
+ ["\u0AF6", "\u0AF6"],
+ ["\u0AF7", "\u0AF7"],
+ ["\u0AF8", "\u0AF8"],
+ ["\u0AF9", "\u0AF9"], /* GUJARATI LETTER ZHA */
+ ["\u0AFA", "\u0AFA"], /* GUJARATI SIGN SUKUN */
+ ["\u0AFB", "\u0AFB"], /* GUJARATI SIGN SHADDA */
+ ["\u0AFC", "\u0AFC"], /* GUJARATI SIGN MADDAH */
+ ["\u0AFD", "\u0AFD"], /* GUJARATI SIGN THREE-DOT NUKTA ABOVE */
+ ["\u0AFE", "\u0AFE"], /* GUJARATI SIGN CIRCLE NUKTA ABOVE */
+ ["\u0AFF", "\u0AFF"], /* GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE */
+ ["\u0B00", "\u0B00"],
+ ["\u0B01", "\u0B01"], /* ORIYA SIGN CANDRABINDU */
+ ["\u0B02", "\u0B02"], /* ORIYA SIGN ANUSVARA */
+ ["\u0B03", "\u0B03"], /* ORIYA SIGN VISARGA */
+ ["\u0B04", "\u0B04"],
+ ["\u0B05", "\u0B05"], /* ORIYA LETTER A */
+ ["\u0B06", "\u0B06"], /* ORIYA LETTER AA */
+ ["\u0B07", "\u0B07"], /* ORIYA LETTER I */
+ ["\u0B08", "\u0B08"], /* ORIYA LETTER II */
+ ["\u0B09", "\u0B09"], /* ORIYA LETTER U */
+ ["\u0B0A", "\u0B0A"], /* ORIYA LETTER UU */
+ ["\u0B0B", "\u0B0B"], /* ORIYA LETTER VOCALIC R */
+ ["\u0B0C", "\u0B0C"], /* ORIYA LETTER VOCALIC L */
+ ["\u0B0D", "\u0B0D"],
+ ["\u0B0E", "\u0B0E"],
+ ["\u0B0F", "\u0B0F"], /* ORIYA LETTER E */
+ ["\u0B10", "\u0B10"], /* ORIYA LETTER AI */
+ ["\u0B11", "\u0B11"],
+ ["\u0B12", "\u0B12"],
+ ["\u0B13", "\u0B13"], /* ORIYA LETTER O */
+ ["\u0B14", "\u0B14"], /* ORIYA LETTER AU */
+ ["\u0B15", "\u0B15"], /* ORIYA LETTER KA */
+ ["\u0B16", "\u0B16"], /* ORIYA LETTER KHA */
+ ["\u0B17", "\u0B17"], /* ORIYA LETTER GA */
+ ["\u0B18", "\u0B18"], /* ORIYA LETTER GHA */
+ ["\u0B19", "\u0B19"], /* ORIYA LETTER NGA */
+ ["\u0B1A", "\u0B1A"], /* ORIYA LETTER CA */
+ ["\u0B1B", "\u0B1B"], /* ORIYA LETTER CHA */
+ ["\u0B1C", "\u0B1C"], /* ORIYA LETTER JA */
+ ["\u0B1D", "\u0B1D"], /* ORIYA LETTER JHA */
+ ["\u0B1E", "\u0B1E"], /* ORIYA LETTER NYA */
+ ["\u0B1F", "\u0B1F"], /* ORIYA LETTER TTA */
+ ["\u0B20", "\u0B20"], /* ORIYA LETTER TTHA */
+ ["\u0B21", "\u0B21"], /* ORIYA LETTER DDA */
+ ["\u0B22", "\u0B22"], /* ORIYA LETTER DDHA */
+ ["\u0B23", "\u0B23"], /* ORIYA LETTER NNA */
+ ["\u0B24", "\u0B24"], /* ORIYA LETTER TA */
+ ["\u0B25", "\u0B25"], /* ORIYA LETTER THA */
+ ["\u0B26", "\u0B26"], /* ORIYA LETTER DA */
+ ["\u0B27", "\u0B27"], /* ORIYA LETTER DHA */
+ ["\u0B28", "\u0B28"], /* ORIYA LETTER NA */
+ ["\u0B29", "\u0B29"],
+ ["\u0B2A", "\u0B2A"], /* ORIYA LETTER PA */
+ ["\u0B2B", "\u0B2B"], /* ORIYA LETTER PHA */
+ ["\u0B2C", "\u0B2C"], /* ORIYA LETTER BA */
+ ["\u0B2D", "\u0B2D"], /* ORIYA LETTER BHA */
+ ["\u0B2E", "\u0B2E"], /* ORIYA LETTER MA */
+ ["\u0B2F", "\u0B2F"], /* ORIYA LETTER YA */
+ ["\u0B30", "\u0B30"], /* ORIYA LETTER RA */
+ ["\u0B31", "\u0B31"],
+ ["\u0B32", "\u0B32"], /* ORIYA LETTER LA */
+ ["\u0B33", "\u0B33"], /* ORIYA LETTER LLA */
+ ["\u0B34", "\u0B34"],
+ ["\u0B35", "\u0B35"], /* ORIYA LETTER VA */
+ ["\u0B36", "\u0B36"], /* ORIYA LETTER SHA */
+ ["\u0B37", "\u0B37"], /* ORIYA LETTER SSA */
+ ["\u0B38", "\u0B38"], /* ORIYA LETTER SA */
+ ["\u0B39", "\u0B39"], /* ORIYA LETTER HA */
+ ["\u0B3A", "\u0B3A"],
+ ["\u0B3B", "\u0B3B"],
+ ["\u0B3C", "\u0B3C"], /* ORIYA SIGN NUKTA */
+ ["\u0B3D", "\u0B3D"], /* ORIYA SIGN AVAGRAHA */
+ ["\u0B3E", "\u0B3E"], /* ORIYA VOWEL SIGN AA */
+ ["\u0B3F", "\u0B3F"], /* ORIYA VOWEL SIGN I */
+ ["\u0B40", "\u0B40"], /* ORIYA VOWEL SIGN II */
+ ["\u0B41", "\u0B41"], /* ORIYA VOWEL SIGN U */
+ ["\u0B42", "\u0B42"], /* ORIYA VOWEL SIGN UU */
+ ["\u0B43", "\u0B43"], /* ORIYA VOWEL SIGN VOCALIC R */
+ ["\u0B44", "\u0B44"], /* ORIYA VOWEL SIGN VOCALIC RR */
+ ["\u0B45", "\u0B45"],
+ ["\u0B46", "\u0B46"],
+ ["\u0B47", "\u0B47"], /* ORIYA VOWEL SIGN E */
+ ["\u0B48", "\u0B48"], /* ORIYA VOWEL SIGN AI */
+ ["\u0B49", "\u0B49"],
+ ["\u0B4A", "\u0B4A"],
+ ["\u0B4B", "\u0B4B"], /* ORIYA VOWEL SIGN O */
+ ["\u0B4C", "\u0B4C"], /* ORIYA VOWEL SIGN AU */
+ ["\u0B4D", "\u0B4D"], /* ORIYA SIGN VIRAMA */
+ ["\u0B4E", "\u0B4E"],
+ ["\u0B4F", "\u0B4F"],
+ ["\u0B50", "\u0B50"],
+ ["\u0B51", "\u0B51"],
+ ["\u0B52", "\u0B52"],
+ ["\u0B53", "\u0B53"],
+ ["\u0B54", "\u0B54"],
+ ["\u0B55", "\u0B55"],
+ ["\u0B56", "\u0B56"], /* ORIYA AI LENGTH MARK */
+ ["\u0B57", "\u0B57"], /* ORIYA AU LENGTH MARK */
+ ["\u0B58", "\u0B58"],
+ ["\u0B59", "\u0B59"],
+ ["\u0B5A", "\u0B5A"],
+ ["\u0B5B", "\u0B5B"],
+ ["\u0B5C", "\u0B5C"], /* ORIYA LETTER RRA */
+ ["\u0B5D", "\u0B5D"], /* ORIYA LETTER RHA */
+ ["\u0B5E", "\u0B5E"],
+ ["\u0B5F", "\u0B5F"], /* ORIYA LETTER YYA */
+ ["\u0B60", "\u0B60"], /* ORIYA LETTER VOCALIC RR */
+ ["\u0B61", "\u0B61"], /* ORIYA LETTER VOCALIC LL */
+ ["\u0B62", "\u0B62"], /* ORIYA VOWEL SIGN VOCALIC L */
+ ["\u0B63", "\u0B63"], /* ORIYA VOWEL SIGN VOCALIC LL */
+ ["\u0B64", "\u0B64"],
+ ["\u0B65", "\u0B65"],
+ ["\u0B66", "\u0B66"], /* ORIYA DIGIT ZERO */
+ ["\u0B67", "\u0B67"], /* ORIYA DIGIT ONE */
+ ["\u0B68", "\u0B68"], /* ORIYA DIGIT TWO */
+ ["\u0B69", "\u0B69"], /* ORIYA DIGIT THREE */
+ ["\u0B6A", "\u0B6A"], /* ORIYA DIGIT FOUR */
+ ["\u0B6B", "\u0B6B"], /* ORIYA DIGIT FIVE */
+ ["\u0B6C", "\u0B6C"], /* ORIYA DIGIT SIX */
+ ["\u0B6D", "\u0B6D"], /* ORIYA DIGIT SEVEN */
+ ["\u0B6E", "\u0B6E"], /* ORIYA DIGIT EIGHT */
+ ["\u0B6F", "\u0B6F"], /* ORIYA DIGIT NINE */
+ ["\u0B70", "\u0B70"], /* ORIYA ISSHAR */
+ ["\u0B71", "\u0B71"], /* ORIYA LETTER WA */
+ ["\u0B72", "\u0B72"], /* ORIYA FRACTION ONE QUARTER */
+ ["\u0B73", "\u0B73"], /* ORIYA FRACTION ONE HALF */
+ ["\u0B74", "\u0B74"], /* ORIYA FRACTION THREE QUARTERS */
+ ["\u0B75", "\u0B75"], /* ORIYA FRACTION ONE SIXTEENTH */
+ ["\u0B76", "\u0B76"], /* ORIYA FRACTION ONE EIGHTH */
+ ["\u0B77", "\u0B77"], /* ORIYA FRACTION THREE SIXTEENTHS */
+ ["\u0B78", "\u0B78"],
+ ["\u0B79", "\u0B79"],
+ ["\u0B7A", "\u0B7A"],
+ ["\u0B7B", "\u0B7B"],
+ ["\u0B7C", "\u0B7C"],
+ ["\u0B7D", "\u0B7D"],
+ ["\u0B7E", "\u0B7E"],
+ ["\u0B7F", "\u0B7F"],
+ ["\u0B80", "\u0B80"],
+ ["\u0B81", "\u0B81"],
+ ["\u0B82", "\u0B82"], /* TAMIL SIGN ANUSVARA */
+ ["\u0B83", "\u0B83"], /* TAMIL SIGN VISARGA */
+ ["\u0B84", "\u0B84"],
+ ["\u0B85", "\u0B85"], /* TAMIL LETTER A */
+ ["\u0B86", "\u0B86"], /* TAMIL LETTER AA */
+ ["\u0B87", "\u0B87"], /* TAMIL LETTER I */
+ ["\u0B88", "\u0B88"], /* TAMIL LETTER II */
+ ["\u0B89", "\u0B89"], /* TAMIL LETTER U */
+ ["\u0B8A", "\u0B8A"], /* TAMIL LETTER UU */
+ ["\u0B8B", "\u0B8B"],
+ ["\u0B8C", "\u0B8C"],
+ ["\u0B8D", "\u0B8D"],
+ ["\u0B8E", "\u0B8E"], /* TAMIL LETTER E */
+ ["\u0B8F", "\u0B8F"], /* TAMIL LETTER EE */
+ ["\u0B90", "\u0B90"], /* TAMIL LETTER AI */
+ ["\u0B91", "\u0B91"],
+ ["\u0B92", "\u0B92"], /* TAMIL LETTER O */
+ ["\u0B93", "\u0B93"], /* TAMIL LETTER OO */
+ ["\u0B94", "\u0B94"], /* TAMIL LETTER AU */
+ ["\u0B95", "\u0B95"], /* TAMIL LETTER KA */
+ ["\u0B96", "\u0B96"],
+ ["\u0B97", "\u0B97"],
+ ["\u0B98", "\u0B98"],
+ ["\u0B99", "\u0B99"], /* TAMIL LETTER NGA */
+ ["\u0B9A", "\u0B9A"], /* TAMIL LETTER CA */
+ ["\u0B9B", "\u0B9B"],
+ ["\u0B9C", "\u0B9C"], /* TAMIL LETTER JA */
+ ["\u0B9D", "\u0B9D"],
+ ["\u0B9E", "\u0B9E"], /* TAMIL LETTER NYA */
+ ["\u0B9F", "\u0B9F"], /* TAMIL LETTER TTA */
+ ["\u0BA0", "\u0BA0"],
+ ["\u0BA1", "\u0BA1"],
+ ["\u0BA2", "\u0BA2"],
+ ["\u0BA3", "\u0BA3"], /* TAMIL LETTER NNA */
+ ["\u0BA4", "\u0BA4"], /* TAMIL LETTER TA */
+ ["\u0BA5", "\u0BA5"],
+ ["\u0BA6", "\u0BA6"],
+ ["\u0BA7", "\u0BA7"],
+ ["\u0BA8", "\u0BA8"], /* TAMIL LETTER NA */
+ ["\u0BA9", "\u0BA9"], /* TAMIL LETTER NNNA */
+ ["\u0BAA", "\u0BAA"], /* TAMIL LETTER PA */
+ ["\u0BAB", "\u0BAB"],
+ ["\u0BAC", "\u0BAC"],
+ ["\u0BAD", "\u0BAD"],
+ ["\u0BAE", "\u0BAE"], /* TAMIL LETTER MA */
+ ["\u0BAF", "\u0BAF"], /* TAMIL LETTER YA */
+ ["\u0BB0", "\u0BB0"], /* TAMIL LETTER RA */
+ ["\u0BB1", "\u0BB1"], /* TAMIL LETTER RRA */
+ ["\u0BB2", "\u0BB2"], /* TAMIL LETTER LA */
+ ["\u0BB3", "\u0BB3"], /* TAMIL LETTER LLA */
+ ["\u0BB4", "\u0BB4"], /* TAMIL LETTER LLLA */
+ ["\u0BB5", "\u0BB5"], /* TAMIL LETTER VA */
+ ["\u0BB6", "\u0BB6"], /* TAMIL LETTER SHA */
+ ["\u0BB7", "\u0BB7"], /* TAMIL LETTER SSA */
+ ["\u0BB8", "\u0BB8"], /* TAMIL LETTER SA */
+ ["\u0BB9", "\u0BB9"], /* TAMIL LETTER HA */
+ ["\u0BBA", "\u0BBA"],
+ ["\u0BBB", "\u0BBB"],
+ ["\u0BBC", "\u0BBC"],
+ ["\u0BBD", "\u0BBD"],
+ ["\u0BBE", "\u0BBE"], /* TAMIL VOWEL SIGN AA */
+ ["\u0BBF", "\u0BBF"], /* TAMIL VOWEL SIGN I */
+ ["\u0BC0", "\u0BC0"], /* TAMIL VOWEL SIGN II */
+ ["\u0BC1", "\u0BC1"], /* TAMIL VOWEL SIGN U */
+ ["\u0BC2", "\u0BC2"], /* TAMIL VOWEL SIGN UU */
+ ["\u0BC3", "\u0BC3"],
+ ["\u0BC4", "\u0BC4"],
+ ["\u0BC5", "\u0BC5"],
+ ["\u0BC6", "\u0BC6"], /* TAMIL VOWEL SIGN E */
+ ["\u0BC7", "\u0BC7"], /* TAMIL VOWEL SIGN EE */
+ ["\u0BC8", "\u0BC8"], /* TAMIL VOWEL SIGN AI */
+ ["\u0BC9", "\u0BC9"],
+ ["\u0BCA", "\u0BCA"], /* TAMIL VOWEL SIGN O */
+ ["\u0BCB", "\u0BCB"], /* TAMIL VOWEL SIGN OO */
+ ["\u0BCC", "\u0BCC"], /* TAMIL VOWEL SIGN AU */
+ ["\u0BCD", "\u0BCD"], /* TAMIL SIGN VIRAMA */
+ ["\u0BCE", "\u0BCE"],
+ ["\u0BCF", "\u0BCF"],
+ ["\u0BD0", "\u0BD0"], /* TAMIL OM */
+ ["\u0BD1", "\u0BD1"],
+ ["\u0BD2", "\u0BD2"],
+ ["\u0BD3", "\u0BD3"],
+ ["\u0BD4", "\u0BD4"],
+ ["\u0BD5", "\u0BD5"],
+ ["\u0BD6", "\u0BD6"],
+ ["\u0BD7", "\u0BD7"], /* TAMIL AU LENGTH MARK */
+ ["\u0BD8", "\u0BD8"],
+ ["\u0BD9", "\u0BD9"],
+ ["\u0BDA", "\u0BDA"],
+ ["\u0BDB", "\u0BDB"],
+ ["\u0BDC", "\u0BDC"],
+ ["\u0BDD", "\u0BDD"],
+ ["\u0BDE", "\u0BDE"],
+ ["\u0BDF", "\u0BDF"],
+ ["\u0BE0", "\u0BE0"],
+ ["\u0BE1", "\u0BE1"],
+ ["\u0BE2", "\u0BE2"],
+ ["\u0BE3", "\u0BE3"],
+ ["\u0BE4", "\u0BE4"],
+ ["\u0BE5", "\u0BE5"],
+ ["\u0BE6", "\u0BE6"], /* TAMIL DIGIT ZERO */
+ ["\u0BE7", "\u0BE7"], /* TAMIL DIGIT ONE */
+ ["\u0BE8", "\u0BE8"], /* TAMIL DIGIT TWO */
+ ["\u0BE9", "\u0BE9"], /* TAMIL DIGIT THREE */
+ ["\u0BEA", "\u0BEA"], /* TAMIL DIGIT FOUR */
+ ["\u0BEB", "\u0BEB"], /* TAMIL DIGIT FIVE */
+ ["\u0BEC", "\u0BEC"], /* TAMIL DIGIT SIX */
+ ["\u0BED", "\u0BED"], /* TAMIL DIGIT SEVEN */
+ ["\u0BEE", "\u0BEE"], /* TAMIL DIGIT EIGHT */
+ ["\u0BEF", "\u0BEF"], /* TAMIL DIGIT NINE */
+ ["\u0BF0", "\u0BF0"], /* TAMIL NUMBER TEN */
+ ["\u0BF1", "\u0BF1"], /* TAMIL NUMBER ONE HUNDRED */
+ ["\u0BF2", "\u0BF2"], /* TAMIL NUMBER ONE THOUSAND */
+ ["\u0BF3", "\u0BF3"], /* TAMIL DAY SIGN */
+ ["\u0BF4", "\u0BF4"], /* TAMIL MONTH SIGN */
+ ["\u0BF5", "\u0BF5"], /* TAMIL YEAR SIGN */
+ ["\u0BF6", "\u0BF6"], /* TAMIL DEBIT SIGN */
+ ["\u0BF7", "\u0BF7"], /* TAMIL CREDIT SIGN */
+ ["\u0BF8", "\u0BF8"], /* TAMIL AS ABOVE SIGN */
+ ["\u0BF9", "\u0BF9"], /* TAMIL RUPEE SIGN */
+ ["\u0BFA", "\u0BFA"], /* TAMIL NUMBER SIGN */
+ ["\u0BFB", "\u0BFB"],
+ ["\u0BFC", "\u0BFC"],
+ ["\u0BFD", "\u0BFD"],
+ ["\u0BFE", "\u0BFE"],
+ ["\u0BFF", "\u0BFF"],
+ ["\u0C00", "\u0C00"], /* TELUGU SIGN COMBINING CANDRABINDU ABOVE */
+ ["\u0C01", "\u0C01"], /* TELUGU SIGN CANDRABINDU */
+ ["\u0C02", "\u0C02"], /* TELUGU SIGN ANUSVARA */
+ ["\u0C03", "\u0C03"], /* TELUGU SIGN VISARGA */
+ ["\u0C04", "\u0C04"], /* TELUGU SIGN COMBINING ANUSVARA ABOVE */
+ ["\u0C05", "\u0C05"], /* TELUGU LETTER A */
+ ["\u0C06", "\u0C06"], /* TELUGU LETTER AA */
+ ["\u0C07", "\u0C07"], /* TELUGU LETTER I */
+ ["\u0C08", "\u0C08"], /* TELUGU LETTER II */
+ ["\u0C09", "\u0C09"], /* TELUGU LETTER U */
+ ["\u0C0A", "\u0C0A"], /* TELUGU LETTER UU */
+ ["\u0C0B", "\u0C0B"], /* TELUGU LETTER VOCALIC R */
+ ["\u0C0C", "\u0C0C"], /* TELUGU LETTER VOCALIC L */
+ ["\u0C0D", "\u0C0D"],
+ ["\u0C0E", "\u0C0E"], /* TELUGU LETTER E */
+ ["\u0C0F", "\u0C0F"], /* TELUGU LETTER EE */
+ ["\u0C10", "\u0C10"], /* TELUGU LETTER AI */
+ ["\u0C11", "\u0C11"],
+ ["\u0C12", "\u0C12"], /* TELUGU LETTER O */
+ ["\u0C13", "\u0C13"], /* TELUGU LETTER OO */
+ ["\u0C14", "\u0C14"], /* TELUGU LETTER AU */
+ ["\u0C15", "\u0C15"], /* TELUGU LETTER KA */
+ ["\u0C16", "\u0C16"], /* TELUGU LETTER KHA */
+ ["\u0C17", "\u0C17"], /* TELUGU LETTER GA */
+ ["\u0C18", "\u0C18"], /* TELUGU LETTER GHA */
+ ["\u0C19", "\u0C19"], /* TELUGU LETTER NGA */
+ ["\u0C1A", "\u0C1A"], /* TELUGU LETTER CA */
+ ["\u0C1B", "\u0C1B"], /* TELUGU LETTER CHA */
+ ["\u0C1C", "\u0C1C"], /* TELUGU LETTER JA */
+ ["\u0C1D", "\u0C1D"], /* TELUGU LETTER JHA */
+ ["\u0C1E", "\u0C1E"], /* TELUGU LETTER NYA */
+ ["\u0C1F", "\u0C1F"], /* TELUGU LETTER TTA */
+ ["\u0C20", "\u0C20"], /* TELUGU LETTER TTHA */
+ ["\u0C21", "\u0C21"], /* TELUGU LETTER DDA */
+ ["\u0C22", "\u0C22"], /* TELUGU LETTER DDHA */
+ ["\u0C23", "\u0C23"], /* TELUGU LETTER NNA */
+ ["\u0C24", "\u0C24"], /* TELUGU LETTER TA */
+ ["\u0C25", "\u0C25"], /* TELUGU LETTER THA */
+ ["\u0C26", "\u0C26"], /* TELUGU LETTER DA */
+ ["\u0C27", "\u0C27"], /* TELUGU LETTER DHA */
+ ["\u0C28", "\u0C28"], /* TELUGU LETTER NA */
+ ["\u0C29", "\u0C29"],
+ ["\u0C2A", "\u0C2A"], /* TELUGU LETTER PA */
+ ["\u0C2B", "\u0C2B"], /* TELUGU LETTER PHA */
+ ["\u0C2C", "\u0C2C"], /* TELUGU LETTER BA */
+ ["\u0C2D", "\u0C2D"], /* TELUGU LETTER BHA */
+ ["\u0C2E", "\u0C2E"], /* TELUGU LETTER MA */
+ ["\u0C2F", "\u0C2F"], /* TELUGU LETTER YA */
+ ["\u0C30", "\u0C30"], /* TELUGU LETTER RA */
+ ["\u0C31", "\u0C31"], /* TELUGU LETTER RRA */
+ ["\u0C32", "\u0C32"], /* TELUGU LETTER LA */
+ ["\u0C33", "\u0C33"], /* TELUGU LETTER LLA */
+ ["\u0C34", "\u0C34"], /* TELUGU LETTER LLLA */
+ ["\u0C35", "\u0C35"], /* TELUGU LETTER VA */
+ ["\u0C36", "\u0C36"], /* TELUGU LETTER SHA */
+ ["\u0C37", "\u0C37"], /* TELUGU LETTER SSA */
+ ["\u0C38", "\u0C38"], /* TELUGU LETTER SA */
+ ["\u0C39", "\u0C39"], /* TELUGU LETTER HA */
+ ["\u0C3A", "\u0C3A"],
+ ["\u0C3B", "\u0C3B"],
+ ["\u0C3C", "\u0C3C"],
+ ["\u0C3D", "\u0C3D"], /* TELUGU SIGN AVAGRAHA */
+ ["\u0C3E", "\u0C3E"], /* TELUGU VOWEL SIGN AA */
+ ["\u0C3F", "\u0C3F"], /* TELUGU VOWEL SIGN I */
+ ["\u0C40", "\u0C40"], /* TELUGU VOWEL SIGN II */
+ ["\u0C41", "\u0C41"], /* TELUGU VOWEL SIGN U */
+ ["\u0C42", "\u0C42"], /* TELUGU VOWEL SIGN UU */
+ ["\u0C43", "\u0C43"], /* TELUGU VOWEL SIGN VOCALIC R */
+ ["\u0C44", "\u0C44"], /* TELUGU VOWEL SIGN VOCALIC RR */
+ ["\u0C45", "\u0C45"],
+ ["\u0C46", "\u0C46"], /* TELUGU VOWEL SIGN E */
+ ["\u0C47", "\u0C47"], /* TELUGU VOWEL SIGN EE */
+ ["\u0C48", "\u0C48"], /* TELUGU VOWEL SIGN AI */
+ ["\u0C49", "\u0C49"],
+ ["\u0C4A", "\u0C4A"], /* TELUGU VOWEL SIGN O */
+ ["\u0C4B", "\u0C4B"], /* TELUGU VOWEL SIGN OO */
+ ["\u0C4C", "\u0C4C"], /* TELUGU VOWEL SIGN AU */
+ ["\u0C4D", "\u0C4D"], /* TELUGU SIGN VIRAMA */
+ ["\u0C4E", "\u0C4E"],
+ ["\u0C4F", "\u0C4F"],
+ ["\u0C50", "\u0C50"],
+ ["\u0C51", "\u0C51"],
+ ["\u0C52", "\u0C52"],
+ ["\u0C53", "\u0C53"],
+ ["\u0C54", "\u0C54"],
+ ["\u0C55", "\u0C55"], /* TELUGU LENGTH MARK */
+ ["\u0C56", "\u0C56"], /* TELUGU AI LENGTH MARK */
+ ["\u0C57", "\u0C57"],
+ ["\u0C58", "\u0C58"], /* TELUGU LETTER TSA */
+ ["\u0C59", "\u0C59"], /* TELUGU LETTER DZA */
+ ["\u0C5A", "\u0C5A"], /* TELUGU LETTER RRRA */
+ ["\u0C5B", "\u0C5B"],
+ ["\u0C5C", "\u0C5C"],
+ ["\u0C5D", "\u0C5D"],
+ ["\u0C5E", "\u0C5E"],
+ ["\u0C5F", "\u0C5F"],
+ ["\u0C60", "\u0C60"], /* TELUGU LETTER VOCALIC RR */
+ ["\u0C61", "\u0C61"], /* TELUGU LETTER VOCALIC LL */
+ ["\u0C62", "\u0C62"], /* TELUGU VOWEL SIGN VOCALIC L */
+ ["\u0C63", "\u0C63"], /* TELUGU VOWEL SIGN VOCALIC LL */
+ ["\u0C64", "\u0C64"],
+ ["\u0C65", "\u0C65"],
+ ["\u0C66", "\u0C66"], /* TELUGU DIGIT ZERO */
+ ["\u0C67", "\u0C67"], /* TELUGU DIGIT ONE */
+ ["\u0C68", "\u0C68"], /* TELUGU DIGIT TWO */
+ ["\u0C69", "\u0C69"], /* TELUGU DIGIT THREE */
+ ["\u0C6A", "\u0C6A"], /* TELUGU DIGIT FOUR */
+ ["\u0C6B", "\u0C6B"], /* TELUGU DIGIT FIVE */
+ ["\u0C6C", "\u0C6C"], /* TELUGU DIGIT SIX */
+ ["\u0C6D", "\u0C6D"], /* TELUGU DIGIT SEVEN */
+ ["\u0C6E", "\u0C6E"], /* TELUGU DIGIT EIGHT */
+ ["\u0C6F", "\u0C6F"], /* TELUGU DIGIT NINE */
+ ["\u0C70", "\u0C70"],
+ ["\u0C71", "\u0C71"],
+ ["\u0C72", "\u0C72"],
+ ["\u0C73", "\u0C73"],
+ ["\u0C74", "\u0C74"],
+ ["\u0C75", "\u0C75"],
+ ["\u0C76", "\u0C76"],
+ ["\u0C77", "\u0C77"],
+ ["\u0C78", "\u0C78"], /* TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR */
+ ["\u0C79", "\u0C79"], /* TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR */
+ ["\u0C7A", "\u0C7A"], /* TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR */
+ ["\u0C7B", "\u0C7B"], /* TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR */
+ ["\u0C7C", "\u0C7C"], /* TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR */
+ ["\u0C7D", "\u0C7D"], /* TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR */
+ ["\u0C7E", "\u0C7E"], /* TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR */
+ ["\u0C7F", "\u0C7F"], /* TELUGU SIGN TUUMU */
+ ["\u0C80", "\u0C80"], /* KANNADA SIGN SPACING CANDRABINDU */
+ ["\u0C81", "\u0C81"], /* KANNADA SIGN CANDRABINDU */
+ ["\u0C82", "\u0C82"], /* KANNADA SIGN ANUSVARA */
+ ["\u0C83", "\u0C83"], /* KANNADA SIGN VISARGA */
+ ["\u0C84", "\u0C84"], /* KANNADA SIGN SIDDHAM */
+ ["\u0C85", "\u0C85"], /* KANNADA LETTER A */
+ ["\u0C86", "\u0C86"], /* KANNADA LETTER AA */
+ ["\u0C87", "\u0C87"], /* KANNADA LETTER I */
+ ["\u0C88", "\u0C88"], /* KANNADA LETTER II */
+ ["\u0C89", "\u0C89"], /* KANNADA LETTER U */
+ ["\u0C8A", "\u0C8A"], /* KANNADA LETTER UU */
+ ["\u0C8B", "\u0C8B"], /* KANNADA LETTER VOCALIC R */
+ ["\u0C8C", "\u0C8C"], /* KANNADA LETTER VOCALIC L */
+ ["\u0C8D", "\u0C8D"],
+ ["\u0C8E", "\u0C8E"], /* KANNADA LETTER E */
+ ["\u0C8F", "\u0C8F"], /* KANNADA LETTER EE */
+ ["\u0C90", "\u0C90"], /* KANNADA LETTER AI */
+ ["\u0C91", "\u0C91"],
+ ["\u0C92", "\u0C92"], /* KANNADA LETTER O */
+ ["\u0C93", "\u0C93"], /* KANNADA LETTER OO */
+ ["\u0C94", "\u0C94"], /* KANNADA LETTER AU */
+ ["\u0C95", "\u0C95"], /* KANNADA LETTER KA */
+ ["\u0C96", "\u0C96"], /* KANNADA LETTER KHA */
+ ["\u0C97", "\u0C97"], /* KANNADA LETTER GA */
+ ["\u0C98", "\u0C98"], /* KANNADA LETTER GHA */
+ ["\u0C99", "\u0C99"], /* KANNADA LETTER NGA */
+ ["\u0C9A", "\u0C9A"], /* KANNADA LETTER CA */
+ ["\u0C9B", "\u0C9B"], /* KANNADA LETTER CHA */
+ ["\u0C9C", "\u0C9C"], /* KANNADA LETTER JA */
+ ["\u0C9D", "\u0C9D"], /* KANNADA LETTER JHA */
+ ["\u0C9E", "\u0C9E"], /* KANNADA LETTER NYA */
+ ["\u0C9F", "\u0C9F"], /* KANNADA LETTER TTA */
+ ["\u0CA0", "\u0CA0"], /* KANNADA LETTER TTHA */
+ ["\u0CA1", "\u0CA1"], /* KANNADA LETTER DDA */
+ ["\u0CA2", "\u0CA2"], /* KANNADA LETTER DDHA */
+ ["\u0CA3", "\u0CA3"], /* KANNADA LETTER NNA */
+ ["\u0CA4", "\u0CA4"], /* KANNADA LETTER TA */
+ ["\u0CA5", "\u0CA5"], /* KANNADA LETTER THA */
+ ["\u0CA6", "\u0CA6"], /* KANNADA LETTER DA */
+ ["\u0CA7", "\u0CA7"], /* KANNADA LETTER DHA */
+ ["\u0CA8", "\u0CA8"], /* KANNADA LETTER NA */
+ ["\u0CA9", "\u0CA9"],
+ ["\u0CAA", "\u0CAA"], /* KANNADA LETTER PA */
+ ["\u0CAB", "\u0CAB"], /* KANNADA LETTER PHA */
+ ["\u0CAC", "\u0CAC"], /* KANNADA LETTER BA */
+ ["\u0CAD", "\u0CAD"], /* KANNADA LETTER BHA */
+ ["\u0CAE", "\u0CAE"], /* KANNADA LETTER MA */
+ ["\u0CAF", "\u0CAF"], /* KANNADA LETTER YA */
+ ["\u0CB0", "\u0CB0"], /* KANNADA LETTER RA */
+ ["\u0CB1", "\u0CB1"], /* KANNADA LETTER RRA */
+ ["\u0CB2", "\u0CB2"], /* KANNADA LETTER LA */
+ ["\u0CB3", "\u0CB3"], /* KANNADA LETTER LLA */
+ ["\u0CB4", "\u0CB4"],
+ ["\u0CB5", "\u0CB5"], /* KANNADA LETTER VA */
+ ["\u0CB6", "\u0CB6"], /* KANNADA LETTER SHA */
+ ["\u0CB7", "\u0CB7"], /* KANNADA LETTER SSA */
+ ["\u0CB8", "\u0CB8"], /* KANNADA LETTER SA */
+ ["\u0CB9", "\u0CB9"], /* KANNADA LETTER HA */
+ ["\u0CBA", "\u0CBA"],
+ ["\u0CBB", "\u0CBB"],
+ ["\u0CBC", "\u0CBC"], /* KANNADA SIGN NUKTA */
+ ["\u0CBD", "\u0CBD"], /* KANNADA SIGN AVAGRAHA */
+ ["\u0CBE", "\u0CBE"], /* KANNADA VOWEL SIGN AA */
+ ["\u0CBF", "\u0CBF"], /* KANNADA VOWEL SIGN I */
+ ["\u0CC0", "\u0CC0"], /* KANNADA VOWEL SIGN II */
+ ["\u0CC1", "\u0CC1"], /* KANNADA VOWEL SIGN U */
+ ["\u0CC2", "\u0CC2"], /* KANNADA VOWEL SIGN UU */
+ ["\u0CC3", "\u0CC3"], /* KANNADA VOWEL SIGN VOCALIC R */
+ ["\u0CC4", "\u0CC4"], /* KANNADA VOWEL SIGN VOCALIC RR */
+ ["\u0CC5", "\u0CC5"],
+ ["\u0CC6", "\u0CC6"], /* KANNADA VOWEL SIGN E */
+ ["\u0CC7", "\u0CC7"], /* KANNADA VOWEL SIGN EE */
+ ["\u0CC8", "\u0CC8"], /* KANNADA VOWEL SIGN AI */
+ ["\u0CC9", "\u0CC9"],
+ ["\u0CCA", "\u0CCA"], /* KANNADA VOWEL SIGN O */
+ ["\u0CCB", "\u0CCB"], /* KANNADA VOWEL SIGN OO */
+ ["\u0CCC", "\u0CCC"], /* KANNADA VOWEL SIGN AU */
+ ["\u0CCD", "\u0CCD"], /* KANNADA SIGN VIRAMA */
+ ["\u0CCE", "\u0CCE"],
+ ["\u0CCF", "\u0CCF"],
+ ["\u0CD0", "\u0CD0"],
+ ["\u0CD1", "\u0CD1"],
+ ["\u0CD2", "\u0CD2"],
+ ["\u0CD3", "\u0CD3"],
+ ["\u0CD4", "\u0CD4"],
+ ["\u0CD5", "\u0CD5"], /* KANNADA LENGTH MARK */
+ ["\u0CD6", "\u0CD6"], /* KANNADA AI LENGTH MARK */
+ ["\u0CD7", "\u0CD7"],
+ ["\u0CD8", "\u0CD8"],
+ ["\u0CD9", "\u0CD9"],
+ ["\u0CDA", "\u0CDA"],
+ ["\u0CDB", "\u0CDB"],
+ ["\u0CDC", "\u0CDC"],
+ ["\u0CDD", "\u0CDD"],
+ ["\u0CDE", "\u0CDE"], /* KANNADA LETTER FA */
+ ["\u0CDF", "\u0CDF"],
+ ["\u0CE0", "\u0CE0"], /* KANNADA LETTER VOCALIC RR */
+ ["\u0CE1", "\u0CE1"], /* KANNADA LETTER VOCALIC LL */
+ ["\u0CE2", "\u0CE2"], /* KANNADA VOWEL SIGN VOCALIC L */
+ ["\u0CE3", "\u0CE3"], /* KANNADA VOWEL SIGN VOCALIC LL */
+ ["\u0CE4", "\u0CE4"],
+ ["\u0CE5", "\u0CE5"],
+ ["\u0CE6", "\u0CE6"], /* KANNADA DIGIT ZERO */
+ ["\u0CE7", "\u0CE7"], /* KANNADA DIGIT ONE */
+ ["\u0CE8", "\u0CE8"], /* KANNADA DIGIT TWO */
+ ["\u0CE9", "\u0CE9"], /* KANNADA DIGIT THREE */
+ ["\u0CEA", "\u0CEA"], /* KANNADA DIGIT FOUR */
+ ["\u0CEB", "\u0CEB"], /* KANNADA DIGIT FIVE */
+ ["\u0CEC", "\u0CEC"], /* KANNADA DIGIT SIX */
+ ["\u0CED", "\u0CED"], /* KANNADA DIGIT SEVEN */
+ ["\u0CEE", "\u0CEE"], /* KANNADA DIGIT EIGHT */
+ ["\u0CEF", "\u0CEF"], /* KANNADA DIGIT NINE */
+ ["\u0CF0", "\u0CF0"],
+ ["\u0CF1", "\u0CF1"], /* KANNADA SIGN JIHVAMULIYA */
+ ["\u0CF2", "\u0CF2"], /* KANNADA SIGN UPADHMANIYA */
+ ["\u0CF3", "\u0CF3"],
+ ["\u0CF4", "\u0CF4"],
+ ["\u0CF5", "\u0CF5"],
+ ["\u0CF6", "\u0CF6"],
+ ["\u0CF7", "\u0CF7"],
+ ["\u0CF8", "\u0CF8"],
+ ["\u0CF9", "\u0CF9"],
+ ["\u0CFA", "\u0CFA"],
+ ["\u0CFB", "\u0CFB"],
+ ["\u0CFC", "\u0CFC"],
+ ["\u0CFD", "\u0CFD"],
+ ["\u0CFE", "\u0CFE"],
+ ["\u0CFF", "\u0CFF"],
+ ["\u0D00", "\u0D00"], /* MALAYALAM SIGN COMBINING ANUSVARA ABOVE */
+ ["\u0D01", "\u0D01"], /* MALAYALAM SIGN CANDRABINDU */
+ ["\u0D02", "\u0D02"], /* MALAYALAM SIGN ANUSVARA */
+ ["\u0D03", "\u0D03"], /* MALAYALAM SIGN VISARGA */
+ ["\u0D04", "\u0D04"],
+ ["\u0D05", "\u0D05"], /* MALAYALAM LETTER A */
+ ["\u0D06", "\u0D06"], /* MALAYALAM LETTER AA */
+ ["\u0D07", "\u0D07"], /* MALAYALAM LETTER I */
+ ["\u0D08", "\u0D08"], /* MALAYALAM LETTER II */
+ ["\u0D09", "\u0D09"], /* MALAYALAM LETTER U */
+ ["\u0D0A", "\u0D0A"], /* MALAYALAM LETTER UU */
+ ["\u0D0B", "\u0D0B"], /* MALAYALAM LETTER VOCALIC R */
+ ["\u0D0C", "\u0D0C"], /* MALAYALAM LETTER VOCALIC L */
+ ["\u0D0D", "\u0D0D"],
+ ["\u0D0E", "\u0D0E"], /* MALAYALAM LETTER E */
+ ["\u0D0F", "\u0D0F"], /* MALAYALAM LETTER EE */
+ ["\u0D10", "\u0D10"], /* MALAYALAM LETTER AI */
+ ["\u0D11", "\u0D11"],
+ ["\u0D12", "\u0D12"], /* MALAYALAM LETTER O */
+ ["\u0D13", "\u0D13"], /* MALAYALAM LETTER OO */
+ ["\u0D14", "\u0D14"], /* MALAYALAM LETTER AU */
+ ["\u0D15", "\u0D15"], /* MALAYALAM LETTER KA */
+ ["\u0D16", "\u0D16"], /* MALAYALAM LETTER KHA */
+ ["\u0D17", "\u0D17"], /* MALAYALAM LETTER GA */
+ ["\u0D18", "\u0D18"], /* MALAYALAM LETTER GHA */
+ ["\u0D19", "\u0D19"], /* MALAYALAM LETTER NGA */
+ ["\u0D1A", "\u0D1A"], /* MALAYALAM LETTER CA */
+ ["\u0D1B", "\u0D1B"], /* MALAYALAM LETTER CHA */
+ ["\u0D1C", "\u0D1C"], /* MALAYALAM LETTER JA */
+ ["\u0D1D", "\u0D1D"], /* MALAYALAM LETTER JHA */
+ ["\u0D1E", "\u0D1E"], /* MALAYALAM LETTER NYA */
+ ["\u0D1F", "\u0D1F"], /* MALAYALAM LETTER TTA */
+ ["\u0D20", "\u0D20"], /* MALAYALAM LETTER TTHA */
+ ["\u0D21", "\u0D21"], /* MALAYALAM LETTER DDA */
+ ["\u0D22", "\u0D22"], /* MALAYALAM LETTER DDHA */
+ ["\u0D23", "\u0D23"], /* MALAYALAM LETTER NNA */
+ ["\u0D24", "\u0D24"], /* MALAYALAM LETTER TA */
+ ["\u0D25", "\u0D25"], /* MALAYALAM LETTER THA */
+ ["\u0D26", "\u0D26"], /* MALAYALAM LETTER DA */
+ ["\u0D27", "\u0D27"], /* MALAYALAM LETTER DHA */
+ ["\u0D28", "\u0D28"], /* MALAYALAM LETTER NA */
+ ["\u0D29", "\u0D29"], /* MALAYALAM LETTER NNNA */
+ ["\u0D2A", "\u0D2A"], /* MALAYALAM LETTER PA */
+ ["\u0D2B", "\u0D2B"], /* MALAYALAM LETTER PHA */
+ ["\u0D2C", "\u0D2C"], /* MALAYALAM LETTER BA */
+ ["\u0D2D", "\u0D2D"], /* MALAYALAM LETTER BHA */
+ ["\u0D2E", "\u0D2E"], /* MALAYALAM LETTER MA */
+ ["\u0D2F", "\u0D2F"], /* MALAYALAM LETTER YA */
+ ["\u0D30", "\u0D30"], /* MALAYALAM LETTER RA */
+ ["\u0D31", "\u0D31"], /* MALAYALAM LETTER RRA */
+ ["\u0D32", "\u0D32"], /* MALAYALAM LETTER LA */
+ ["\u0D33", "\u0D33"], /* MALAYALAM LETTER LLA */
+ ["\u0D34", "\u0D34"], /* MALAYALAM LETTER LLLA */
+ ["\u0D35", "\u0D35"], /* MALAYALAM LETTER VA */
+ ["\u0D36", "\u0D36"], /* MALAYALAM LETTER SHA */
+ ["\u0D37", "\u0D37"], /* MALAYALAM LETTER SSA */
+ ["\u0D38", "\u0D38"], /* MALAYALAM LETTER SA */
+ ["\u0D39", "\u0D39"], /* MALAYALAM LETTER HA */
+ ["\u0D3A", "\u0D3A"], /* MALAYALAM LETTER TTTA */
+ ["\u0D3B", "\u0D3B"], /* MALAYALAM SIGN VERTICAL BAR VIRAMA */
+ ["\u0D3C", "\u0D3C"], /* MALAYALAM SIGN CIRCULAR VIRAMA */
+ ["\u0D3D", "\u0D3D"], /* MALAYALAM SIGN AVAGRAHA */
+ ["\u0D3E", "\u0D3E"], /* MALAYALAM VOWEL SIGN AA */
+ ["\u0D3F", "\u0D3F"], /* MALAYALAM VOWEL SIGN I */
+ ["\u0D40", "\u0D40"], /* MALAYALAM VOWEL SIGN II */
+ ["\u0D41", "\u0D41"], /* MALAYALAM VOWEL SIGN U */
+ ["\u0D42", "\u0D42"], /* MALAYALAM VOWEL SIGN UU */
+ ["\u0D43", "\u0D43"], /* MALAYALAM VOWEL SIGN VOCALIC R */
+ ["\u0D44", "\u0D44"], /* MALAYALAM VOWEL SIGN VOCALIC RR */
+ ["\u0D45", "\u0D45"],
+ ["\u0D46", "\u0D46"], /* MALAYALAM VOWEL SIGN E */
+ ["\u0D47", "\u0D47"], /* MALAYALAM VOWEL SIGN EE */
+ ["\u0D48", "\u0D48"], /* MALAYALAM VOWEL SIGN AI */
+ ["\u0D49", "\u0D49"],
+ ["\u0D4A", "\u0D4A"], /* MALAYALAM VOWEL SIGN O */
+ ["\u0D4B", "\u0D4B"], /* MALAYALAM VOWEL SIGN OO */
+ ["\u0D4C", "\u0D4C"], /* MALAYALAM VOWEL SIGN AU */
+ ["\u0D4D", "\u0D4D"], /* MALAYALAM SIGN VIRAMA */
+ ["\u0D4E", "\u0D4E"], /* MALAYALAM LETTER DOT REPH */
+ ["\u0D4F", "\u0D4F"], /* MALAYALAM SIGN PARA */
+ ["\u0D50", "\u0D50"],
+ ["\u0D51", "\u0D51"],
+ ["\u0D52", "\u0D52"],
+ ["\u0D53", "\u0D53"],
+ ["\u0D54", "\u0D54"], /* MALAYALAM LETTER CHILLU M */
+ ["\u0D55", "\u0D55"], /* MALAYALAM LETTER CHILLU Y */
+ ["\u0D56", "\u0D56"], /* MALAYALAM LETTER CHILLU LLL */
+ ["\u0D57", "\u0D57"], /* MALAYALAM AU LENGTH MARK */
+ ["\u0D58", "\u0D58"], /* MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH */
+ ["\u0D59", "\u0D59"], /* MALAYALAM FRACTION ONE FORTIETH */
+ ["\u0D5A", "\u0D5A"], /* MALAYALAM FRACTION THREE EIGHTIETHS */
+ ["\u0D5B", "\u0D5B"], /* MALAYALAM FRACTION ONE TWENTIETH */
+ ["\u0D5C", "\u0D5C"], /* MALAYALAM FRACTION ONE TENTH */
+ ["\u0D5D", "\u0D5D"], /* MALAYALAM FRACTION THREE TWENTIETHS */
+ ["\u0D5E", "\u0D5E"], /* MALAYALAM FRACTION ONE FIFTH */
+ ["\u0D5F", "\u0D5F"], /* MALAYALAM LETTER ARCHAIC II */
+ ["\u0D60", "\u0D60"], /* MALAYALAM LETTER VOCALIC RR */
+ ["\u0D61", "\u0D61"], /* MALAYALAM LETTER VOCALIC LL */
+ ["\u0D62", "\u0D62"], /* MALAYALAM VOWEL SIGN VOCALIC L */
+ ["\u0D63", "\u0D63"], /* MALAYALAM VOWEL SIGN VOCALIC LL */
+ ["\u0D64", "\u0D64"],
+ ["\u0D65", "\u0D65"],
+ ["\u0D66", "\u0D66"], /* MALAYALAM DIGIT ZERO */
+ ["\u0D67", "\u0D67"], /* MALAYALAM DIGIT ONE */
+ ["\u0D68", "\u0D68"], /* MALAYALAM DIGIT TWO */
+ ["\u0D69", "\u0D69"], /* MALAYALAM DIGIT THREE */
+ ["\u0D6A", "\u0D6A"], /* MALAYALAM DIGIT FOUR */
+ ["\u0D6B", "\u0D6B"], /* MALAYALAM DIGIT FIVE */
+ ["\u0D6C", "\u0D6C"], /* MALAYALAM DIGIT SIX */
+ ["\u0D6D", "\u0D6D"], /* MALAYALAM DIGIT SEVEN */
+ ["\u0D6E", "\u0D6E"], /* MALAYALAM DIGIT EIGHT */
+ ["\u0D6F", "\u0D6F"], /* MALAYALAM DIGIT NINE */
+ ["\u0D70", "\u0D70"], /* MALAYALAM NUMBER TEN */
+ ["\u0D71", "\u0D71"], /* MALAYALAM NUMBER ONE HUNDRED */
+ ["\u0D72", "\u0D72"], /* MALAYALAM NUMBER ONE THOUSAND */
+ ["\u0D73", "\u0D73"], /* MALAYALAM FRACTION ONE QUARTER */
+ ["\u0D74", "\u0D74"], /* MALAYALAM FRACTION ONE HALF */
+ ["\u0D75", "\u0D75"], /* MALAYALAM FRACTION THREE QUARTERS */
+ ["\u0D76", "\u0D76"], /* MALAYALAM FRACTION ONE SIXTEENTH */
+ ["\u0D77", "\u0D77"], /* MALAYALAM FRACTION ONE EIGHTH */
+ ["\u0D78", "\u0D78"], /* MALAYALAM FRACTION THREE SIXTEENTHS */
+ ["\u0D79", "\u0D79"], /* MALAYALAM DATE MARK */
+ ["\u0D7A", "\u0D7A"], /* MALAYALAM LETTER CHILLU NN */
+ ["\u0D7B", "\u0D7B"], /* MALAYALAM LETTER CHILLU N */
+ ["\u0D7C", "\u0D7C"], /* MALAYALAM LETTER CHILLU RR */
+ ["\u0D7D", "\u0D7D"], /* MALAYALAM LETTER CHILLU L */
+ ["\u0D7E", "\u0D7E"], /* MALAYALAM LETTER CHILLU LL */
+ ["\u0D7F", "\u0D7F"], /* MALAYALAM LETTER CHILLU K */
+ ["\u0D80", "\u0D80"],
+ ["\u0D81", "\u0D81"],
+ ["\u0D82", "\u0D82"], /* SINHALA SIGN ANUSVARAYA */
+ ["\u0D83", "\u0D83"], /* SINHALA SIGN VISARGAYA */
+ ["\u0D84", "\u0D84"],
+ ["\u0D85", "\u0D85"], /* SINHALA LETTER AYANNA */
+ ["\u0D86", "\u0D86"], /* SINHALA LETTER AAYANNA */
+ ["\u0D87", "\u0D87"], /* SINHALA LETTER AEYANNA */
+ ["\u0D88", "\u0D88"], /* SINHALA LETTER AEEYANNA */
+ ["\u0D89", "\u0D89"], /* SINHALA LETTER IYANNA */
+ ["\u0D8A", "\u0D8A"], /* SINHALA LETTER IIYANNA */
+ ["\u0D8B", "\u0D8B"], /* SINHALA LETTER UYANNA */
+ ["\u0D8C", "\u0D8C"], /* SINHALA LETTER UUYANNA */
+ ["\u0D8D", "\u0D8D"], /* SINHALA LETTER IRUYANNA */
+ ["\u0D8E", "\u0D8E"], /* SINHALA LETTER IRUUYANNA */
+ ["\u0D8F", "\u0D8F"], /* SINHALA LETTER ILUYANNA */
+ ["\u0D90", "\u0D90"], /* SINHALA LETTER ILUUYANNA */
+ ["\u0D91", "\u0D91"], /* SINHALA LETTER EYANNA */
+ ["\u0D92", "\u0D92"], /* SINHALA LETTER EEYANNA */
+ ["\u0D93", "\u0D93"], /* SINHALA LETTER AIYANNA */
+ ["\u0D94", "\u0D94"], /* SINHALA LETTER OYANNA */
+ ["\u0D95", "\u0D95"], /* SINHALA LETTER OOYANNA */
+ ["\u0D96", "\u0D96"], /* SINHALA LETTER AUYANNA */
+ ["\u0D97", "\u0D97"],
+ ["\u0D98", "\u0D98"],
+ ["\u0D99", "\u0D99"],
+ ["\u0D9A", "\u0D9A"], /* SINHALA LETTER ALPAPRAANA KAYANNA */
+ ["\u0D9B", "\u0D9B"], /* SINHALA LETTER MAHAAPRAANA KAYANNA */
+ ["\u0D9C", "\u0D9C"], /* SINHALA LETTER ALPAPRAANA GAYANNA */
+ ["\u0D9D", "\u0D9D"], /* SINHALA LETTER MAHAAPRAANA GAYANNA */
+ ["\u0D9E", "\u0D9E"], /* SINHALA LETTER KANTAJA NAASIKYAYA */
+ ["\u0D9F", "\u0D9F"], /* SINHALA LETTER SANYAKA GAYANNA */
+ ["\u0DA0", "\u0DA0"], /* SINHALA LETTER ALPAPRAANA CAYANNA */
+ ["\u0DA1", "\u0DA1"], /* SINHALA LETTER MAHAAPRAANA CAYANNA */
+ ["\u0DA2", "\u0DA2"], /* SINHALA LETTER ALPAPRAANA JAYANNA */
+ ["\u0DA3", "\u0DA3"], /* SINHALA LETTER MAHAAPRAANA JAYANNA */
+ ["\u0DA4", "\u0DA4"], /* SINHALA LETTER TAALUJA NAASIKYAYA */
+ ["\u0DA5", "\u0DA5"], /* SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA */
+ ["\u0DA6", "\u0DA6"], /* SINHALA LETTER SANYAKA JAYANNA */
+ ["\u0DA7", "\u0DA7"], /* SINHALA LETTER ALPAPRAANA TTAYANNA */
+ ["\u0DA8", "\u0DA8"], /* SINHALA LETTER MAHAAPRAANA TTAYANNA */
+ ["\u0DA9", "\u0DA9"], /* SINHALA LETTER ALPAPRAANA DDAYANNA */
+ ["\u0DAA", "\u0DAA"], /* SINHALA LETTER MAHAAPRAANA DDAYANNA */
+ ["\u0DAB", "\u0DAB"], /* SINHALA LETTER MUURDHAJA NAYANNA */
+ ["\u0DAC", "\u0DAC"], /* SINHALA LETTER SANYAKA DDAYANNA */
+ ["\u0DAD", "\u0DAD"], /* SINHALA LETTER ALPAPRAANA TAYANNA */
+ ["\u0DAE", "\u0DAE"], /* SINHALA LETTER MAHAAPRAANA TAYANNA */
+ ["\u0DAF", "\u0DAF"], /* SINHALA LETTER ALPAPRAANA DAYANNA */
+ ["\u0DB0", "\u0DB0"], /* SINHALA LETTER MAHAAPRAANA DAYANNA */
+ ["\u0DB1", "\u0DB1"], /* SINHALA LETTER DANTAJA NAYANNA */
+ ["\u0DB2", "\u0DB2"],
+ ["\u0DB3", "\u0DB3"], /* SINHALA LETTER SANYAKA DAYANNA */
+ ["\u0DB4", "\u0DB4"], /* SINHALA LETTER ALPAPRAANA PAYANNA */
+ ["\u0DB5", "\u0DB5"], /* SINHALA LETTER MAHAAPRAANA PAYANNA */
+ ["\u0DB6", "\u0DB6"], /* SINHALA LETTER ALPAPRAANA BAYANNA */
+ ["\u0DB7", "\u0DB7"], /* SINHALA LETTER MAHAAPRAANA BAYANNA */
+ ["\u0DB8", "\u0DB8"], /* SINHALA LETTER MAYANNA */
+ ["\u0DB9", "\u0DB9"], /* SINHALA LETTER AMBA BAYANNA */
+ ["\u0DBA", "\u0DBA"], /* SINHALA LETTER YAYANNA */
+ ["\u0DBB", "\u0DBB"], /* SINHALA LETTER RAYANNA */
+ ["\u0DBC", "\u0DBC"],
+ ["\u0DBD", "\u0DBD"], /* SINHALA LETTER DANTAJA LAYANNA */
+ ["\u0DBE", "\u0DBE"],
+ ["\u0DBF", "\u0DBF"],
+ ["\u0DC0", "\u0DC0"], /* SINHALA LETTER VAYANNA */
+ ["\u0DC1", "\u0DC1"], /* SINHALA LETTER TAALUJA SAYANNA */
+ ["\u0DC2", "\u0DC2"], /* SINHALA LETTER MUURDHAJA SAYANNA */
+ ["\u0DC3", "\u0DC3"], /* SINHALA LETTER DANTAJA SAYANNA */
+ ["\u0DC4", "\u0DC4"], /* SINHALA LETTER HAYANNA */
+ ["\u0DC5", "\u0DC5"], /* SINHALA LETTER MUURDHAJA LAYANNA */
+ ["\u0DC6", "\u0DC6"], /* SINHALA LETTER FAYANNA */
+ ["\u0DC7", "\u0DC7"],
+ ["\u0DC8", "\u0DC8"],
+ ["\u0DC9", "\u0DC9"],
+ ["\u0DCA", "\u0DCA"], /* SINHALA SIGN AL-LAKUNA */
+ ["\u0DCB", "\u0DCB"],
+ ["\u0DCC", "\u0DCC"],
+ ["\u0DCD", "\u0DCD"],
+ ["\u0DCE", "\u0DCE"],
+ ["\u0DCF", "\u0DCF"], /* SINHALA VOWEL SIGN AELA-PILLA */
+ ["\u0DD0", "\u0DD0"], /* SINHALA VOWEL SIGN KETTI AEDA-PILLA */
+ ["\u0DD1", "\u0DD1"], /* SINHALA VOWEL SIGN DIGA AEDA-PILLA */
+ ["\u0DD2", "\u0DD2"], /* SINHALA VOWEL SIGN KETTI IS-PILLA */
+ ["\u0DD3", "\u0DD3"], /* SINHALA VOWEL SIGN DIGA IS-PILLA */
+ ["\u0DD4", "\u0DD4"], /* SINHALA VOWEL SIGN KETTI PAA-PILLA */
+ ["\u0DD5", "\u0DD5"],
+ ["\u0DD6", "\u0DD6"], /* SINHALA VOWEL SIGN DIGA PAA-PILLA */
+ ["\u0DD7", "\u0DD7"],
+ ["\u0DD8", "\u0DD8"], /* SINHALA VOWEL SIGN GAETTA-PILLA */
+ ["\u0DD9", "\u0DD9"], /* SINHALA VOWEL SIGN KOMBUVA */
+ ["\u0DDA", "\u0DDA"], /* SINHALA VOWEL SIGN DIGA KOMBUVA */
+ ["\u0DDB", "\u0DDB"], /* SINHALA VOWEL SIGN KOMBU DEKA */
+ ["\u0DDC", "\u0DDC"], /* SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA */
+ ["\u0DDD", "\u0DDD"], /* SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA */
+ ["\u0DDE", "\u0DDE"], /* SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA */
+ ["\u0DDF", "\u0DDF"], /* SINHALA VOWEL SIGN GAYANUKITTA */
+ ["\u0DE0", "\u0DE0"],
+ ["\u0DE1", "\u0DE1"],
+ ["\u0DE2", "\u0DE2"],
+ ["\u0DE3", "\u0DE3"],
+ ["\u0DE4", "\u0DE4"],
+ ["\u0DE5", "\u0DE5"],
+ ["\u0DE6", "\u0DE6"], /* SINHALA LITH DIGIT ZERO */
+ ["\u0DE7", "\u0DE7"], /* SINHALA LITH DIGIT ONE */
+ ["\u0DE8", "\u0DE8"], /* SINHALA LITH DIGIT TWO */
+ ["\u0DE9", "\u0DE9"], /* SINHALA LITH DIGIT THREE */
+ ["\u0DEA", "\u0DEA"], /* SINHALA LITH DIGIT FOUR */
+ ["\u0DEB", "\u0DEB"], /* SINHALA LITH DIGIT FIVE */
+ ["\u0DEC", "\u0DEC"], /* SINHALA LITH DIGIT SIX */
+ ["\u0DED", "\u0DED"], /* SINHALA LITH DIGIT SEVEN */
+ ["\u0DEE", "\u0DEE"], /* SINHALA LITH DIGIT EIGHT */
+ ["\u0DEF", "\u0DEF"], /* SINHALA LITH DIGIT NINE */
+ ["\u0DF0", "\u0DF0"],
+ ["\u0DF1", "\u0DF1"],
+ ["\u0DF2", "\u0DF2"], /* SINHALA VOWEL SIGN DIGA GAETTA-PILLA */
+ ["\u0DF3", "\u0DF3"], /* SINHALA VOWEL SIGN DIGA GAYANUKITTA */
+ ["\u0DF4", "\u0DF4"], /* SINHALA PUNCTUATION KUNDDALIYA */
+ ["\u0DF5", "\u0DF5"],
+ ["\u0DF6", "\u0DF6"],
+ ["\u0DF7", "\u0DF7"],
+ ["\u0DF8", "\u0DF8"],
+ ["\u0DF9", "\u0DF9"],
+ ["\u0DFA", "\u0DFA"],
+ ["\u0DFB", "\u0DFB"],
+ ["\u0DFC", "\u0DFC"],
+ ["\u0DFD", "\u0DFD"],
+ ["\u0DFE", "\u0DFE"],
+ ["\u0DFF", "\u0DFF"],
+ ["\u0E00", "\u0E00"],
+ ["\u0E01", "\u0E01"], /* THAI CHARACTER KO KAI (THAI LETTER KO KAI) */
+ ["\u0E02", "\u0E02"], /* THAI CHARACTER KHO KHAI (THAI LETTER KHO KHAI) */
+ ["\u0E03", "\u0E03"], /* THAI CHARACTER KHO KHUAT (THAI LETTER KHO KHUAT) */
+ ["\u0E04", "\u0E04"], /* THAI CHARACTER KHO KHWAI (THAI LETTER KHO KHWAI) */
+ ["\u0E05", "\u0E05"], /* THAI CHARACTER KHO KHON (THAI LETTER KHO KHON) */
+ ["\u0E06", "\u0E06"], /* THAI CHARACTER KHO RAKHANG (THAI LETTER KHO RAKHANG) */
+ ["\u0E07", "\u0E07"], /* THAI CHARACTER NGO NGU (THAI LETTER NGO NGU) */
+ ["\u0E08", "\u0E08"], /* THAI CHARACTER CHO CHAN (THAI LETTER CHO CHAN) */
+ ["\u0E09", "\u0E09"], /* THAI CHARACTER CHO CHING (THAI LETTER CHO CHING) */
+ ["\u0E0A", "\u0E0A"], /* THAI CHARACTER CHO CHANG (THAI LETTER CHO CHANG) */
+ ["\u0E0B", "\u0E0B"], /* THAI CHARACTER SO SO (THAI LETTER SO SO) */
+ ["\u0E0C", "\u0E0C"], /* THAI CHARACTER CHO CHOE (THAI LETTER CHO CHOE) */
+ ["\u0E0D", "\u0E0D"], /* THAI CHARACTER YO YING (THAI LETTER YO YING) */
+ ["\u0E0E", "\u0E0E"], /* THAI CHARACTER DO CHADA (THAI LETTER DO CHADA) */
+ ["\u0E0F", "\u0E0F"], /* THAI CHARACTER TO PATAK (THAI LETTER TO PATAK) */
+ ["\u0E10", "\u0E10"], /* THAI CHARACTER THO THAN (THAI LETTER THO THAN) */
+ ["\u0E11", "\u0E11"], /* THAI CHARACTER THO NANGMONTHO (THAI LETTER THO NANGMONTHO) */
+ ["\u0E12", "\u0E12"], /* THAI CHARACTER THO PHUTHAO (THAI LETTER THO PHUTHAO) */
+ ["\u0E13", "\u0E13"], /* THAI CHARACTER NO NEN (THAI LETTER NO NEN) */
+ ["\u0E14", "\u0E14"], /* THAI CHARACTER DO DEK (THAI LETTER DO DEK) */
+ ["\u0E15", "\u0E15"], /* THAI CHARACTER TO TAO (THAI LETTER TO TAO) */
+ ["\u0E16", "\u0E16"], /* THAI CHARACTER THO THUNG (THAI LETTER THO THUNG) */
+ ["\u0E17", "\u0E17"], /* THAI CHARACTER THO THAHAN (THAI LETTER THO THAHAN) */
+ ["\u0E18", "\u0E18"], /* THAI CHARACTER THO THONG (THAI LETTER THO THONG) */
+ ["\u0E19", "\u0E19"], /* THAI CHARACTER NO NU (THAI LETTER NO NU) */
+ ["\u0E1A", "\u0E1A"], /* THAI CHARACTER BO BAIMAI (THAI LETTER BO BAIMAI) */
+ ["\u0E1B", "\u0E1B"], /* THAI CHARACTER PO PLA (THAI LETTER PO PLA) */
+ ["\u0E1C", "\u0E1C"], /* THAI CHARACTER PHO PHUNG (THAI LETTER PHO PHUNG) */
+ ["\u0E1D", "\u0E1D"], /* THAI CHARACTER FO FA (THAI LETTER FO FA) */
+ ["\u0E1E", "\u0E1E"], /* THAI CHARACTER PHO PHAN (THAI LETTER PHO PHAN) */
+ ["\u0E1F", "\u0E1F"], /* THAI CHARACTER FO FAN (THAI LETTER FO FAN) */
+ ["\u0E20", "\u0E20"], /* THAI CHARACTER PHO SAMPHAO (THAI LETTER PHO SAMPHAO) */
+ ["\u0E21", "\u0E21"], /* THAI CHARACTER MO MA (THAI LETTER MO MA) */
+ ["\u0E22", "\u0E22"], /* THAI CHARACTER YO YAK (THAI LETTER YO YAK) */
+ ["\u0E23", "\u0E23"], /* THAI CHARACTER RO RUA (THAI LETTER RO RUA) */
+ ["\u0E24", "\u0E24"], /* THAI CHARACTER RU (THAI LETTER RU) */
+ ["\u0E25", "\u0E25"], /* THAI CHARACTER LO LING (THAI LETTER LO LING) */
+ ["\u0E26", "\u0E26"], /* THAI CHARACTER LU (THAI LETTER LU) */
+ ["\u0E27", "\u0E27"], /* THAI CHARACTER WO WAEN (THAI LETTER WO WAEN) */
+ ["\u0E28", "\u0E28"], /* THAI CHARACTER SO SALA (THAI LETTER SO SALA) */
+ ["\u0E29", "\u0E29"], /* THAI CHARACTER SO RUSI (THAI LETTER SO RUSI) */
+ ["\u0E2A", "\u0E2A"], /* THAI CHARACTER SO SUA (THAI LETTER SO SUA) */
+ ["\u0E2B", "\u0E2B"], /* THAI CHARACTER HO HIP (THAI LETTER HO HIP) */
+ ["\u0E2C", "\u0E2C"], /* THAI CHARACTER LO CHULA (THAI LETTER LO CHULA) */
+ ["\u0E2D", "\u0E2D"], /* THAI CHARACTER O ANG (THAI LETTER O ANG) */
+ ["\u0E2E", "\u0E2E"], /* THAI CHARACTER HO NOKHUK (THAI LETTER HO NOK HUK) */
+ ["\u0E2F", "\u0E2F"], /* THAI CHARACTER PAIYANNOI (THAI PAI YAN NOI) */
+ ["\u0E30", "\u0E30"], /* THAI CHARACTER SARA A (THAI VOWEL SIGN SARA A) */
+ ["\u0E31", "\u0E31"], /* THAI CHARACTER MAI HAN-AKAT (THAI VOWEL SIGN MAI HAN-AKAT) */
+ ["\u0E32", "\u0E32"], /* THAI CHARACTER SARA AA (THAI VOWEL SIGN SARA AA) */
+ ["\u0E33", "\u0E33"], /* THAI CHARACTER SARA AM (THAI VOWEL SIGN SARA AM) */
+ ["\u0E34", "\u0E34"], /* THAI CHARACTER SARA I (THAI VOWEL SIGN SARA I) */
+ ["\u0E35", "\u0E35"], /* THAI CHARACTER SARA II (THAI VOWEL SIGN SARA II) */
+ ["\u0E36", "\u0E36"], /* THAI CHARACTER SARA UE (THAI VOWEL SIGN SARA UE) */
+ ["\u0E37", "\u0E37"], /* THAI CHARACTER SARA UEE (THAI VOWEL SIGN SARA UEE) */
+ ["\u0E38", "\u0E38"], /* THAI CHARACTER SARA U (THAI VOWEL SIGN SARA U) */
+ ["\u0E39", "\u0E39"], /* THAI CHARACTER SARA UU (THAI VOWEL SIGN SARA UU) */
+ ["\u0E3A", "\u0E3A"], /* THAI CHARACTER PHINTHU (THAI VOWEL SIGN PHINTHU) */
+ ["\u0E3B", "\u0E3B"],
+ ["\u0E3C", "\u0E3C"],
+ ["\u0E3D", "\u0E3D"],
+ ["\u0E3E", "\u0E3E"],
+ ["\u0E3F", "\u0E3F"], /* THAI CURRENCY SYMBOL BAHT (THAI BAHT SIGN) */
+ ["\u0E40", "\u0E40"], /* THAI CHARACTER SARA E (THAI VOWEL SIGN SARA E) */
+ ["\u0E41", "\u0E41"], /* THAI CHARACTER SARA AE (THAI VOWEL SIGN SARA AE) */
+ ["\u0E42", "\u0E42"], /* THAI CHARACTER SARA O (THAI VOWEL SIGN SARA O) */
+ ["\u0E43", "\u0E43"], /* THAI CHARACTER SARA AI MAIMUAN (THAI VOWEL SIGN SARA MAI MUAN) */
+ ["\u0E44", "\u0E44"], /* THAI CHARACTER SARA AI MAIMALAI (THAI VOWEL SIGN SARA MAI MALAI) */
+ ["\u0E45", "\u0E45"], /* THAI CHARACTER LAKKHANGYAO (THAI LAK KHANG YAO) */
+ ["\u0E46", "\u0E46"], /* THAI CHARACTER MAIYAMOK (THAI MAI YAMOK) */
+ ["\u0E47", "\u0E47"], /* THAI CHARACTER MAITAIKHU (THAI VOWEL SIGN MAI TAI KHU) */
+ ["\u0E48", "\u0E48"], /* THAI CHARACTER MAI EK (THAI TONE MAI EK) */
+ ["\u0E49", "\u0E49"], /* THAI CHARACTER MAI THO (THAI TONE MAI THO) */
+ ["\u0E4A", "\u0E4A"], /* THAI CHARACTER MAI TRI (THAI TONE MAI TRI) */
+ ["\u0E4B", "\u0E4B"], /* THAI CHARACTER MAI CHATTAWA (THAI TONE MAI CHATTAWA) */
+ ["\u0E4C", "\u0E4C"], /* THAI CHARACTER THANTHAKHAT (THAI THANTHAKHAT) */
+ ["\u0E4D", "\u0E4D"], /* THAI CHARACTER NIKHAHIT (THAI NIKKHAHIT) */
+ ["\u0E4E", "\u0E4E"], /* THAI CHARACTER YAMAKKAN (THAI YAMAKKAN) */
+ ["\u0E4F", "\u0E4F"], /* THAI CHARACTER FONGMAN (THAI FONGMAN) */
+ ["\u0E50", "\u0E50"], /* THAI DIGIT ZERO */
+ ["\u0E51", "\u0E51"], /* THAI DIGIT ONE */
+ ["\u0E52", "\u0E52"], /* THAI DIGIT TWO */
+ ["\u0E53", "\u0E53"], /* THAI DIGIT THREE */
+ ["\u0E54", "\u0E54"], /* THAI DIGIT FOUR */
+ ["\u0E55", "\u0E55"], /* THAI DIGIT FIVE */
+ ["\u0E56", "\u0E56"], /* THAI DIGIT SIX */
+ ["\u0E57", "\u0E57"], /* THAI DIGIT SEVEN */
+ ["\u0E58", "\u0E58"], /* THAI DIGIT EIGHT */
+ ["\u0E59", "\u0E59"], /* THAI DIGIT NINE */
+ ["\u0E5A", "\u0E5A"], /* THAI CHARACTER ANGKHANKHU (THAI ANGKHANKHU) */
+ ["\u0E5B", "\u0E5B"], /* THAI CHARACTER KHOMUT (THAI KHOMUT) */
+ ["\u0E5C", "\u0E5C"],
+ ["\u0E5D", "\u0E5D"],
+ ["\u0E5E", "\u0E5E"],
+ ["\u0E5F", "\u0E5F"],
+ ["\u0E60", "\u0E60"],
+ ["\u0E61", "\u0E61"],
+ ["\u0E62", "\u0E62"],
+ ["\u0E63", "\u0E63"],
+ ["\u0E64", "\u0E64"],
+ ["\u0E65", "\u0E65"],
+ ["\u0E66", "\u0E66"],
+ ["\u0E67", "\u0E67"],
+ ["\u0E68", "\u0E68"],
+ ["\u0E69", "\u0E69"],
+ ["\u0E6A", "\u0E6A"],
+ ["\u0E6B", "\u0E6B"],
+ ["\u0E6C", "\u0E6C"],
+ ["\u0E6D", "\u0E6D"],
+ ["\u0E6E", "\u0E6E"],
+ ["\u0E6F", "\u0E6F"],
+ ["\u0E70", "\u0E70"],
+ ["\u0E71", "\u0E71"],
+ ["\u0E72", "\u0E72"],
+ ["\u0E73", "\u0E73"],
+ ["\u0E74", "\u0E74"],
+ ["\u0E75", "\u0E75"],
+ ["\u0E76", "\u0E76"],
+ ["\u0E77", "\u0E77"],
+ ["\u0E78", "\u0E78"],
+ ["\u0E79", "\u0E79"],
+ ["\u0E7A", "\u0E7A"],
+ ["\u0E7B", "\u0E7B"],
+ ["\u0E7C", "\u0E7C"],
+ ["\u0E7D", "\u0E7D"],
+ ["\u0E7E", "\u0E7E"],
+ ["\u0E7F", "\u0E7F"],
+ ["\u0E80", "\u0E80"],
+ ["\u0E81", "\u0E81"], /* LAO LETTER KO */
+ ["\u0E82", "\u0E82"], /* LAO LETTER KHO SUNG */
+ ["\u0E83", "\u0E83"],
+ ["\u0E84", "\u0E84"], /* LAO LETTER KHO TAM */
+ ["\u0E85", "\u0E85"],
+ ["\u0E86", "\u0E86"],
+ ["\u0E87", "\u0E87"], /* LAO LETTER NGO */
+ ["\u0E88", "\u0E88"], /* LAO LETTER CO */
+ ["\u0E89", "\u0E89"],
+ ["\u0E8A", "\u0E8A"], /* LAO LETTER SO TAM */
+ ["\u0E8B", "\u0E8B"],
+ ["\u0E8C", "\u0E8C"],
+ ["\u0E8D", "\u0E8D"], /* LAO LETTER NYO */
+ ["\u0E8E", "\u0E8E"],
+ ["\u0E8F", "\u0E8F"],
+ ["\u0E90", "\u0E90"],
+ ["\u0E91", "\u0E91"],
+ ["\u0E92", "\u0E92"],
+ ["\u0E93", "\u0E93"],
+ ["\u0E94", "\u0E94"], /* LAO LETTER DO */
+ ["\u0E95", "\u0E95"], /* LAO LETTER TO */
+ ["\u0E96", "\u0E96"], /* LAO LETTER THO SUNG */
+ ["\u0E97", "\u0E97"], /* LAO LETTER THO TAM */
+ ["\u0E98", "\u0E98"],
+ ["\u0E99", "\u0E99"], /* LAO LETTER NO */
+ ["\u0E9A", "\u0E9A"], /* LAO LETTER BO */
+ ["\u0E9B", "\u0E9B"], /* LAO LETTER PO */
+ ["\u0E9C", "\u0E9C"], /* LAO LETTER PHO SUNG */
+ ["\u0E9D", "\u0E9D"], /* LAO LETTER FO TAM */
+ ["\u0E9E", "\u0E9E"], /* LAO LETTER PHO TAM */
+ ["\u0E9F", "\u0E9F"], /* LAO LETTER FO SUNG */
+ ["\u0EA0", "\u0EA0"],
+ ["\u0EA1", "\u0EA1"], /* LAO LETTER MO */
+ ["\u0EA2", "\u0EA2"], /* LAO LETTER YO */
+ ["\u0EA3", "\u0EA3"], /* LAO LETTER LO LING */
+ ["\u0EA4", "\u0EA4"],
+ ["\u0EA5", "\u0EA5"], /* LAO LETTER LO LOOT */
+ ["\u0EA6", "\u0EA6"],
+ ["\u0EA7", "\u0EA7"], /* LAO LETTER WO */
+ ["\u0EA8", "\u0EA8"],
+ ["\u0EA9", "\u0EA9"],
+ ["\u0EAA", "\u0EAA"], /* LAO LETTER SO SUNG */
+ ["\u0EAB", "\u0EAB"], /* LAO LETTER HO SUNG */
+ ["\u0EAC", "\u0EAC"],
+ ["\u0EAD", "\u0EAD"], /* LAO LETTER O */
+ ["\u0EAE", "\u0EAE"], /* LAO LETTER HO TAM */
+ ["\u0EAF", "\u0EAF"], /* LAO ELLIPSIS */
+ ["\u0EB0", "\u0EB0"], /* LAO VOWEL SIGN A */
+ ["\u0EB1", "\u0EB1"], /* LAO VOWEL SIGN MAI KAN */
+ ["\u0EB2", "\u0EB2"], /* LAO VOWEL SIGN AA */
+ ["\u0EB3", "\u0EB3"], /* LAO VOWEL SIGN AM */
+ ["\u0EB4", "\u0EB4"], /* LAO VOWEL SIGN I */
+ ["\u0EB5", "\u0EB5"], /* LAO VOWEL SIGN II */
+ ["\u0EB6", "\u0EB6"], /* LAO VOWEL SIGN Y */
+ ["\u0EB7", "\u0EB7"], /* LAO VOWEL SIGN YY */
+ ["\u0EB8", "\u0EB8"], /* LAO VOWEL SIGN U */
+ ["\u0EB9", "\u0EB9"], /* LAO VOWEL SIGN UU */
+ ["\u0EBA", "\u0EBA"],
+ ["\u0EBB", "\u0EBB"], /* LAO VOWEL SIGN MAI KON */
+ ["\u0EBC", "\u0EBC"], /* LAO SEMIVOWEL SIGN LO */
+ ["\u0EBD", "\u0EBD"], /* LAO SEMIVOWEL SIGN NYO */
+ ["\u0EBE", "\u0EBE"],
+ ["\u0EBF", "\u0EBF"],
+ ["\u0EC0", "\u0EC0"], /* LAO VOWEL SIGN E */
+ ["\u0EC1", "\u0EC1"], /* LAO VOWEL SIGN EI */
+ ["\u0EC2", "\u0EC2"], /* LAO VOWEL SIGN O */
+ ["\u0EC3", "\u0EC3"], /* LAO VOWEL SIGN AY */
+ ["\u0EC4", "\u0EC4"], /* LAO VOWEL SIGN AI */
+ ["\u0EC5", "\u0EC5"],
+ ["\u0EC6", "\u0EC6"], /* LAO KO LA */
+ ["\u0EC7", "\u0EC7"],
+ ["\u0EC8", "\u0EC8"], /* LAO TONE MAI EK */
+ ["\u0EC9", "\u0EC9"], /* LAO TONE MAI THO */
+ ["\u0ECA", "\u0ECA"], /* LAO TONE MAI TI */
+ ["\u0ECB", "\u0ECB"], /* LAO TONE MAI CATAWA */
+ ["\u0ECC", "\u0ECC"], /* LAO CANCELLATION MARK */
+ ["\u0ECD", "\u0ECD"], /* LAO NIGGAHITA */
+ ["\u0ECE", "\u0ECE"],
+ ["\u0ECF", "\u0ECF"],
+ ["\u0ED0", "\u0ED0"], /* LAO DIGIT ZERO */
+ ["\u0ED1", "\u0ED1"], /* LAO DIGIT ONE */
+ ["\u0ED2", "\u0ED2"], /* LAO DIGIT TWO */
+ ["\u0ED3", "\u0ED3"], /* LAO DIGIT THREE */
+ ["\u0ED4", "\u0ED4"], /* LAO DIGIT FOUR */
+ ["\u0ED5", "\u0ED5"], /* LAO DIGIT FIVE */
+ ["\u0ED6", "\u0ED6"], /* LAO DIGIT SIX */
+ ["\u0ED7", "\u0ED7"], /* LAO DIGIT SEVEN */
+ ["\u0ED8", "\u0ED8"], /* LAO DIGIT EIGHT */
+ ["\u0ED9", "\u0ED9"], /* LAO DIGIT NINE */
+ ["\u0EDA", "\u0EDA"],
+ ["\u0EDB", "\u0EDB"],
+ ["\u0EDC", "\u0EDC"], /* LAO HO NO */
+ ["\u0EDD", "\u0EDD"], /* LAO HO MO */
+ ["\u0EDE", "\u0EDE"], /* LAO LETTER KHMU GO */
+ ["\u0EDF", "\u0EDF"], /* LAO LETTER KHMU NYO */
+ ["\u0EE0", "\u0EE0"],
+ ["\u0EE1", "\u0EE1"],
+ ["\u0EE2", "\u0EE2"],
+ ["\u0EE3", "\u0EE3"],
+ ["\u0EE4", "\u0EE4"],
+ ["\u0EE5", "\u0EE5"],
+ ["\u0EE6", "\u0EE6"],
+ ["\u0EE7", "\u0EE7"],
+ ["\u0EE8", "\u0EE8"],
+ ["\u0EE9", "\u0EE9"],
+ ["\u0EEA", "\u0EEA"],
+ ["\u0EEB", "\u0EEB"],
+ ["\u0EEC", "\u0EEC"],
+ ["\u0EED", "\u0EED"],
+ ["\u0EEE", "\u0EEE"],
+ ["\u0EEF", "\u0EEF"],
+ ["\u0EF0", "\u0EF0"],
+ ["\u0EF1", "\u0EF1"],
+ ["\u0EF2", "\u0EF2"],
+ ["\u0EF3", "\u0EF3"],
+ ["\u0EF4", "\u0EF4"],
+ ["\u0EF5", "\u0EF5"],
+ ["\u0EF6", "\u0EF6"],
+ ["\u0EF7", "\u0EF7"],
+ ["\u0EF8", "\u0EF8"],
+ ["\u0EF9", "\u0EF9"],
+ ["\u0EFA", "\u0EFA"],
+ ["\u0EFB", "\u0EFB"],
+ ["\u0EFC", "\u0EFC"],
+ ["\u0EFD", "\u0EFD"],
+ ["\u0EFE", "\u0EFE"],
+ ["\u0EFF", "\u0EFF"],
+ ["\u0F00", "\u0F00"], /* TIBETAN SYLLABLE OM */
+ ["\u0F01", "\u0F01"], /* TIBETAN MARK GTER YIG MGO TRUNCATED A */
+ ["\u0F02", "\u0F02"], /* TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA */
+ ["\u0F03", "\u0F03"], /* TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA */
+ ["\u0F04", "\u0F04"], /* TIBETAN MARK INITIAL YIG MGO MDUN MA (TIBETAN SINGLE ORNAMENT) */
+ ["\u0F05", "\u0F05"], /* TIBETAN MARK CLOSING YIG MGO SGAB MA */
+ ["\u0F06", "\u0F06"], /* TIBETAN MARK CARET YIG MGO PHUR SHAD MA */
+ ["\u0F07", "\u0F07"], /* TIBETAN MARK YIG MGO TSHEG SHAD MA */
+ ["\u0F08", "\u0F08"], /* TIBETAN MARK SBRUL SHAD (TIBETAN RGYANSHAD) */
+ ["\u0F09", "\u0F09"], /* TIBETAN MARK BSKUR YIG MGO */
+ ["\u0F0A", "\u0F0A"], /* TIBETAN MARK BKA- SHOG YIG MGO */
+ ["\u0F0B", "\u0F0B"], /* TIBETAN MARK INTERSYLLABIC TSHEG (TIBETAN TSEG) */
+ ["\u0F0C", "\u0F0C"], /* TIBETAN MARK DELIMITER TSHEG BSTAR */
+ ["\u0F0D", "\u0F0D"], /* TIBETAN MARK SHAD (TIBETAN SHAD) */
+ ["\u0F0E", "\u0F0E"], /* TIBETAN MARK NYIS SHAD (TIBETAN DOUBLE SHAD) */
+ ["\u0F0F", "\u0F0F"], /* TIBETAN MARK TSHEG SHAD */
+ ["\u0F10", "\u0F10"], /* TIBETAN MARK NYIS TSHEG SHAD */
+ ["\u0F11", "\u0F11"], /* TIBETAN MARK RIN CHEN SPUNGS SHAD (TIBETAN RINCHANPHUNGSHAD) */
+ ["\u0F12", "\u0F12"], /* TIBETAN MARK RGYA GRAM SHAD */
+ ["\u0F13", "\u0F13"], /* TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN */
+ ["\u0F14", "\u0F14"], /* TIBETAN MARK GTER TSHEG (TIBETAN COMMA) */
+ ["\u0F15", "\u0F15"], /* TIBETAN LOGOTYPE SIGN CHAD RTAGS */
+ ["\u0F16", "\u0F16"], /* TIBETAN LOGOTYPE SIGN LHAG RTAGS */
+ ["\u0F17", "\u0F17"], /* TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS */
+ ["\u0F18", "\u0F18"], /* TIBETAN ASTROLOGICAL SIGN -KHYUD PA */
+ ["\u0F19", "\u0F19"], /* TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS */
+ ["\u0F1A", "\u0F1A"], /* TIBETAN SIGN RDEL DKAR GCIG */
+ ["\u0F1B", "\u0F1B"], /* TIBETAN SIGN RDEL DKAR GNYIS */
+ ["\u0F1C", "\u0F1C"], /* TIBETAN SIGN RDEL DKAR GSUM */
+ ["\u0F1D", "\u0F1D"], /* TIBETAN SIGN RDEL NAG GCIG */
+ ["\u0F1E", "\u0F1E"], /* TIBETAN SIGN RDEL NAG GNYIS */
+ ["\u0F1F", "\u0F1F"], /* TIBETAN SIGN RDEL DKAR RDEL NAG */
+ ["\u0F20", "\u0F20"], /* TIBETAN DIGIT ZERO */
+ ["\u0F21", "\u0F21"], /* TIBETAN DIGIT ONE */
+ ["\u0F22", "\u0F22"], /* TIBETAN DIGIT TWO */
+ ["\u0F23", "\u0F23"], /* TIBETAN DIGIT THREE */
+ ["\u0F24", "\u0F24"], /* TIBETAN DIGIT FOUR */
+ ["\u0F25", "\u0F25"], /* TIBETAN DIGIT FIVE */
+ ["\u0F26", "\u0F26"], /* TIBETAN DIGIT SIX */
+ ["\u0F27", "\u0F27"], /* TIBETAN DIGIT SEVEN */
+ ["\u0F28", "\u0F28"], /* TIBETAN DIGIT EIGHT */
+ ["\u0F29", "\u0F29"], /* TIBETAN DIGIT NINE */
+ ["\u0F2A", "\u0F2A"], /* TIBETAN DIGIT HALF ONE */
+ ["\u0F2B", "\u0F2B"], /* TIBETAN DIGIT HALF TWO */
+ ["\u0F2C", "\u0F2C"], /* TIBETAN DIGIT HALF THREE */
+ ["\u0F2D", "\u0F2D"], /* TIBETAN DIGIT HALF FOUR */
+ ["\u0F2E", "\u0F2E"], /* TIBETAN DIGIT HALF FIVE */
+ ["\u0F2F", "\u0F2F"], /* TIBETAN DIGIT HALF SIX */
+ ["\u0F30", "\u0F30"], /* TIBETAN DIGIT HALF SEVEN */
+ ["\u0F31", "\u0F31"], /* TIBETAN DIGIT HALF EIGHT */
+ ["\u0F32", "\u0F32"], /* TIBETAN DIGIT HALF NINE */
+ ["\u0F33", "\u0F33"], /* TIBETAN DIGIT HALF ZERO */
+ ["\u0F34", "\u0F34"], /* TIBETAN MARK BSDUS RTAGS */
+ ["\u0F35", "\u0F35"], /* TIBETAN MARK NGAS BZUNG NYI ZLA (TIBETAN HONORIFIC UNDER RING) */
+ ["\u0F36", "\u0F36"], /* TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN */
+ ["\u0F37", "\u0F37"], /* TIBETAN MARK NGAS BZUNG SGOR RTAGS (TIBETAN UNDER RING) */
+ ["\u0F38", "\u0F38"], /* TIBETAN MARK CHE MGO */
+ ["\u0F39", "\u0F39"], /* TIBETAN MARK TSA -PHRU (TIBETAN LENITION MARK) */
+ ["\u0F3A", "\u0F3A"], /* TIBETAN MARK GUG RTAGS GYON */
+ ["\u0F3B", "\u0F3B"], /* TIBETAN MARK GUG RTAGS GYAS */
+ ["\u0F3C", "\u0F3C"], /* TIBETAN MARK ANG KHANG GYON (TIBETAN LEFT BRACE) */
+ ["\u0F3D", "\u0F3D"], /* TIBETAN MARK ANG KHANG GYAS (TIBETAN RIGHT BRACE) */
+ ["\u0F3E", "\u0F3E"], /* TIBETAN SIGN YAR TSHES */
+ ["\u0F3F", "\u0F3F"], /* TIBETAN SIGN MAR TSHES */
+ ["\u0F40", "\u0F40"], /* TIBETAN LETTER KA */
+ ["\u0F41", "\u0F41"], /* TIBETAN LETTER KHA */
+ ["\u0F42", "\u0F42"], /* TIBETAN LETTER GA */
+ ["\u0F43", "\u0F43"], /* TIBETAN LETTER GHA */
+ ["\u0F44", "\u0F44"], /* TIBETAN LETTER NGA */
+ ["\u0F45", "\u0F45"], /* TIBETAN LETTER CA */
+ ["\u0F46", "\u0F46"], /* TIBETAN LETTER CHA */
+ ["\u0F47", "\u0F47"], /* TIBETAN LETTER JA */
+ ["\u0F48", "\u0F48"],
+ ["\u0F49", "\u0F49"], /* TIBETAN LETTER NYA */
+ ["\u0F4A", "\u0F4A"], /* TIBETAN LETTER TTA (TIBETAN LETTER REVERSED TA) */
+ ["\u0F4B", "\u0F4B"], /* TIBETAN LETTER TTHA (TIBETAN LETTER REVERSED THA) */
+ ["\u0F4C", "\u0F4C"], /* TIBETAN LETTER DDA (TIBETAN LETTER REVERSED DA) */
+ ["\u0F4D", "\u0F4D"], /* TIBETAN LETTER DDHA */
+ ["\u0F4E", "\u0F4E"], /* TIBETAN LETTER NNA (TIBETAN LETTER REVERSED NA) */
+ ["\u0F4F", "\u0F4F"], /* TIBETAN LETTER TA */
+ ["\u0F50", "\u0F50"], /* TIBETAN LETTER THA */
+ ["\u0F51", "\u0F51"], /* TIBETAN LETTER DA */
+ ["\u0F52", "\u0F52"], /* TIBETAN LETTER DHA */
+ ["\u0F53", "\u0F53"], /* TIBETAN LETTER NA */
+ ["\u0F54", "\u0F54"], /* TIBETAN LETTER PA */
+ ["\u0F55", "\u0F55"], /* TIBETAN LETTER PHA */
+ ["\u0F56", "\u0F56"], /* TIBETAN LETTER BA */
+ ["\u0F57", "\u0F57"], /* TIBETAN LETTER BHA */
+ ["\u0F58", "\u0F58"], /* TIBETAN LETTER MA */
+ ["\u0F59", "\u0F59"], /* TIBETAN LETTER TSA */
+ ["\u0F5A", "\u0F5A"], /* TIBETAN LETTER TSHA */
+ ["\u0F5B", "\u0F5B"], /* TIBETAN LETTER DZA */
+ ["\u0F5C", "\u0F5C"], /* TIBETAN LETTER DZHA */
+ ["\u0F5D", "\u0F5D"], /* TIBETAN LETTER WA */
+ ["\u0F5E", "\u0F5E"], /* TIBETAN LETTER ZHA */
+ ["\u0F5F", "\u0F5F"], /* TIBETAN LETTER ZA */
+ ["\u0F60", "\u0F60"], /* TIBETAN LETTER -A (TIBETAN LETTER AA) */
+ ["\u0F61", "\u0F61"], /* TIBETAN LETTER YA */
+ ["\u0F62", "\u0F62"], /* TIBETAN LETTER RA */
+ ["\u0F63", "\u0F63"], /* TIBETAN LETTER LA */
+ ["\u0F64", "\u0F64"], /* TIBETAN LETTER SHA */
+ ["\u0F65", "\u0F65"], /* TIBETAN LETTER SSA (TIBETAN LETTER REVERSED SHA) */
+ ["\u0F66", "\u0F66"], /* TIBETAN LETTER SA */
+ ["\u0F67", "\u0F67"], /* TIBETAN LETTER HA */
+ ["\u0F68", "\u0F68"], /* TIBETAN LETTER A */
+ ["\u0F69", "\u0F69"], /* TIBETAN LETTER KSSA */
+ ["\u0F6A", "\u0F6A"], /* TIBETAN LETTER FIXED-FORM RA */
+ ["\u0F6B", "\u0F6B"], /* TIBETAN LETTER KKA */
+ ["\u0F6C", "\u0F6C"], /* TIBETAN LETTER RRA */
+ ["\u0F6D", "\u0F6D"],
+ ["\u0F6E", "\u0F6E"],
+ ["\u0F6F", "\u0F6F"],
+ ["\u0F70", "\u0F70"],
+ ["\u0F71", "\u0F71"], /* TIBETAN VOWEL SIGN AA */
+ ["\u0F72", "\u0F72"], /* TIBETAN VOWEL SIGN I */
+ ["\u0F73", "\u0F73"], /* TIBETAN VOWEL SIGN II */
+ ["\u0F74", "\u0F74"], /* TIBETAN VOWEL SIGN U */
+ ["\u0F75", "\u0F75"], /* TIBETAN VOWEL SIGN UU */
+ ["\u0F76", "\u0F76"], /* TIBETAN VOWEL SIGN VOCALIC R */
+ ["\u0F77", "\u0F77"], /* TIBETAN VOWEL SIGN VOCALIC RR */
+ ["\u0F78", "\u0F78"], /* TIBETAN VOWEL SIGN VOCALIC L */
+ ["\u0F79", "\u0F79"], /* TIBETAN VOWEL SIGN VOCALIC LL */
+ ["\u0F7A", "\u0F7A"], /* TIBETAN VOWEL SIGN E */
+ ["\u0F7B", "\u0F7B"], /* TIBETAN VOWEL SIGN EE (TIBETAN VOWEL SIGN AI) */
+ ["\u0F7C", "\u0F7C"], /* TIBETAN VOWEL SIGN O */
+ ["\u0F7D", "\u0F7D"], /* TIBETAN VOWEL SIGN OO (TIBETAN VOWEL SIGN AU) */
+ ["\u0F7E", "\u0F7E"], /* TIBETAN SIGN RJES SU NGA RO (TIBETAN ANUSVARA) */
+ ["\u0F7F", "\u0F7F"], /* TIBETAN SIGN RNAM BCAD (TIBETAN VISARGA) */
+ ["\u0F80", "\u0F80"], /* TIBETAN VOWEL SIGN REVERSED I (TIBETAN VOWEL SIGN SHORT I) */
+ ["\u0F81", "\u0F81"], /* TIBETAN VOWEL SIGN REVERSED II */
+ ["\u0F82", "\u0F82"], /* TIBETAN SIGN NYI ZLA NAA DA (TIBETAN CANDRABINDU WITH ORNAMENT) */
+ ["\u0F83", "\u0F83"], /* TIBETAN SIGN SNA LDAN (TIBETAN CANDRABINDU) */
+ ["\u0F84", "\u0F84"], /* TIBETAN MARK HALANTA (TIBETAN VIRAMA) */
+ ["\u0F85", "\u0F85"], /* TIBETAN MARK PALUTA (TIBETAN CHUCHENYIGE) */
+ ["\u0F86", "\u0F86"], /* TIBETAN SIGN LCI RTAGS */
+ ["\u0F87", "\u0F87"], /* TIBETAN SIGN YANG RTAGS */
+ ["\u0F88", "\u0F88"], /* TIBETAN SIGN LCE TSA CAN */
+ ["\u0F89", "\u0F89"], /* TIBETAN SIGN MCHU CAN */
+ ["\u0F8A", "\u0F8A"], /* TIBETAN SIGN GRU CAN RGYINGS */
+ ["\u0F8B", "\u0F8B"], /* TIBETAN SIGN GRU MED RGYINGS */
+ ["\u0F8C", "\u0F8C"], /* TIBETAN SIGN INVERTED MCHU CAN */
+ ["\u0F8D", "\u0F8D"], /* TIBETAN SUBJOINED SIGN LCE TSA CAN */
+ ["\u0F8E", "\u0F8E"], /* TIBETAN SUBJOINED SIGN MCHU CAN */
+ ["\u0F8F", "\u0F8F"], /* TIBETAN SUBJOINED SIGN INVERTED MCHU CAN */
+ ["\u0F90", "\u0F90"], /* TIBETAN SUBJOINED LETTER KA */
+ ["\u0F91", "\u0F91"], /* TIBETAN SUBJOINED LETTER KHA */
+ ["\u0F92", "\u0F92"], /* TIBETAN SUBJOINED LETTER GA */
+ ["\u0F93", "\u0F93"], /* TIBETAN SUBJOINED LETTER GHA */
+ ["\u0F94", "\u0F94"], /* TIBETAN SUBJOINED LETTER NGA */
+ ["\u0F95", "\u0F95"], /* TIBETAN SUBJOINED LETTER CA */
+ ["\u0F96", "\u0F96"], /* TIBETAN SUBJOINED LETTER CHA */
+ ["\u0F97", "\u0F97"], /* TIBETAN SUBJOINED LETTER JA */
+ ["\u0F98", "\u0F98"],
+ ["\u0F99", "\u0F99"], /* TIBETAN SUBJOINED LETTER NYA */
+ ["\u0F9A", "\u0F9A"], /* TIBETAN SUBJOINED LETTER TTA */
+ ["\u0F9B", "\u0F9B"], /* TIBETAN SUBJOINED LETTER TTHA */
+ ["\u0F9C", "\u0F9C"], /* TIBETAN SUBJOINED LETTER DDA */
+ ["\u0F9D", "\u0F9D"], /* TIBETAN SUBJOINED LETTER DDHA */
+ ["\u0F9E", "\u0F9E"], /* TIBETAN SUBJOINED LETTER NNA */
+ ["\u0F9F", "\u0F9F"], /* TIBETAN SUBJOINED LETTER TA */
+ ["\u0FA0", "\u0FA0"], /* TIBETAN SUBJOINED LETTER THA */
+ ["\u0FA1", "\u0FA1"], /* TIBETAN SUBJOINED LETTER DA */
+ ["\u0FA2", "\u0FA2"], /* TIBETAN SUBJOINED LETTER DHA */
+ ["\u0FA3", "\u0FA3"], /* TIBETAN SUBJOINED LETTER NA */
+ ["\u0FA4", "\u0FA4"], /* TIBETAN SUBJOINED LETTER PA */
+ ["\u0FA5", "\u0FA5"], /* TIBETAN SUBJOINED LETTER PHA */
+ ["\u0FA6", "\u0FA6"], /* TIBETAN SUBJOINED LETTER BA */
+ ["\u0FA7", "\u0FA7"], /* TIBETAN SUBJOINED LETTER BHA */
+ ["\u0FA8", "\u0FA8"], /* TIBETAN SUBJOINED LETTER MA */
+ ["\u0FA9", "\u0FA9"], /* TIBETAN SUBJOINED LETTER TSA */
+ ["\u0FAA", "\u0FAA"], /* TIBETAN SUBJOINED LETTER TSHA */
+ ["\u0FAB", "\u0FAB"], /* TIBETAN SUBJOINED LETTER DZA */
+ ["\u0FAC", "\u0FAC"], /* TIBETAN SUBJOINED LETTER DZHA */
+ ["\u0FAD", "\u0FAD"], /* TIBETAN SUBJOINED LETTER WA */
+ ["\u0FAE", "\u0FAE"], /* TIBETAN SUBJOINED LETTER ZHA */
+ ["\u0FAF", "\u0FAF"], /* TIBETAN SUBJOINED LETTER ZA */
+ ["\u0FB0", "\u0FB0"], /* TIBETAN SUBJOINED LETTER -A */
+ ["\u0FB1", "\u0FB1"], /* TIBETAN SUBJOINED LETTER YA */
+ ["\u0FB2", "\u0FB2"], /* TIBETAN SUBJOINED LETTER RA */
+ ["\u0FB3", "\u0FB3"], /* TIBETAN SUBJOINED LETTER LA */
+ ["\u0FB4", "\u0FB4"], /* TIBETAN SUBJOINED LETTER SHA */
+ ["\u0FB5", "\u0FB5"], /* TIBETAN SUBJOINED LETTER SSA */
+ ["\u0FB6", "\u0FB6"], /* TIBETAN SUBJOINED LETTER SA */
+ ["\u0FB7", "\u0FB7"], /* TIBETAN SUBJOINED LETTER HA */
+ ["\u0FB8", "\u0FB8"], /* TIBETAN SUBJOINED LETTER A */
+ ["\u0FB9", "\u0FB9"], /* TIBETAN SUBJOINED LETTER KSSA */
+ ["\u0FBA", "\u0FBA"], /* TIBETAN SUBJOINED LETTER FIXED-FORM WA */
+ ["\u0FBB", "\u0FBB"], /* TIBETAN SUBJOINED LETTER FIXED-FORM YA */
+ ["\u0FBC", "\u0FBC"], /* TIBETAN SUBJOINED LETTER FIXED-FORM RA */
+ ["\u0FBD", "\u0FBD"],
+ ["\u0FBE", "\u0FBE"], /* TIBETAN KU RU KHA */
+ ["\u0FBF", "\u0FBF"], /* TIBETAN KU RU KHA BZHI MIG CAN */
+ ["\u0FC0", "\u0FC0"], /* TIBETAN CANTILLATION SIGN HEAVY BEAT */
+ ["\u0FC1", "\u0FC1"], /* TIBETAN CANTILLATION SIGN LIGHT BEAT */
+ ["\u0FC2", "\u0FC2"], /* TIBETAN CANTILLATION SIGN CANG TE-U */
+ ["\u0FC3", "\u0FC3"], /* TIBETAN CANTILLATION SIGN SBUB -CHAL */
+ ["\u0FC4", "\u0FC4"], /* TIBETAN SYMBOL DRIL BU */
+ ["\u0FC5", "\u0FC5"], /* TIBETAN SYMBOL RDO RJE */
+ ["\u0FC6", "\u0FC6"], /* TIBETAN SYMBOL PADMA GDAN */
+ ["\u0FC7", "\u0FC7"], /* TIBETAN SYMBOL RDO RJE RGYA GRAM */
+ ["\u0FC8", "\u0FC8"], /* TIBETAN SYMBOL PHUR PA */
+ ["\u0FC9", "\u0FC9"], /* TIBETAN SYMBOL NOR BU */
+ ["\u0FCA", "\u0FCA"], /* TIBETAN SYMBOL NOR BU NYIS -KHYIL */
+ ["\u0FCB", "\u0FCB"], /* TIBETAN SYMBOL NOR BU GSUM -KHYIL */
+ ["\u0FCC", "\u0FCC"], /* TIBETAN SYMBOL NOR BU BZHI -KHYIL */
+ ["\u0FCD", "\u0FCD"],
+ ["\u0FCE", "\u0FCE"], /* TIBETAN SIGN RDEL NAG RDEL DKAR */
+ ["\u0FCF", "\u0FCF"], /* TIBETAN SIGN RDEL NAG GSUM */
+ ["\u0FD0", "\u0FD0"], /* TIBETAN MARK BSKA- SHOG GI MGO RGYAN */
+ ["\u0FD1", "\u0FD1"], /* TIBETAN MARK MNYAM YIG GI MGO RGYAN */
+ ["\u0FD2", "\u0FD2"], /* TIBETAN MARK NYIS TSHEG */
+ ["\u0FD3", "\u0FD3"], /* TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA */
+ ["\u0FD4", "\u0FD4"], /* TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA */
+ ["\u0FD5", "\u0FD5"], /* RIGHT-FACING SVASTI SIGN */
+ ["\u0FD6", "\u0FD6"], /* LEFT-FACING SVASTI SIGN */
+ ["\u0FD7", "\u0FD7"], /* RIGHT-FACING SVASTI SIGN WITH DOTS */
+ ["\u0FD8", "\u0FD8"], /* LEFT-FACING SVASTI SIGN WITH DOTS */
+ ["\u0FD9", "\u0FD9"], /* TIBETAN MARK LEADING MCHAN RTAGS */
+ ["\u0FDA", "\u0FDA"], /* TIBETAN MARK TRAILING MCHAN RTAGS */
+ ["\u0FDB", "\u0FDB"],
+ ["\u0FDC", "\u0FDC"],
+ ["\u0FDD", "\u0FDD"],
+ ["\u0FDE", "\u0FDE"],
+ ["\u0FDF", "\u0FDF"],
+ ["\u0FE0", "\u0FE0"],
+ ["\u0FE1", "\u0FE1"],
+ ["\u0FE2", "\u0FE2"],
+ ["\u0FE3", "\u0FE3"],
+ ["\u0FE4", "\u0FE4"],
+ ["\u0FE5", "\u0FE5"],
+ ["\u0FE6", "\u0FE6"],
+ ["\u0FE7", "\u0FE7"],
+ ["\u0FE8", "\u0FE8"],
+ ["\u0FE9", "\u0FE9"],
+ ["\u0FEA", "\u0FEA"],
+ ["\u0FEB", "\u0FEB"],
+ ["\u0FEC", "\u0FEC"],
+ ["\u0FED", "\u0FED"],
+ ["\u0FEE", "\u0FEE"],
+ ["\u0FEF", "\u0FEF"],
+ ["\u0FF0", "\u0FF0"],
+ ["\u0FF1", "\u0FF1"],
+ ["\u0FF2", "\u0FF2"],
+ ["\u0FF3", "\u0FF3"],
+ ["\u0FF4", "\u0FF4"],
+ ["\u0FF5", "\u0FF5"],
+ ["\u0FF6", "\u0FF6"],
+ ["\u0FF7", "\u0FF7"],
+ ["\u0FF8", "\u0FF8"],
+ ["\u0FF9", "\u0FF9"],
+ ["\u0FFA", "\u0FFA"],
+ ["\u0FFB", "\u0FFB"],
+ ["\u0FFC", "\u0FFC"],
+ ["\u0FFD", "\u0FFD"],
+ ["\u0FFE", "\u0FFE"],
+ ["\u0FFF", "\u0FFF"],
+ ["\u1000", "\u1000"], /* MYANMAR LETTER KA */
+ ["\u1001", "\u1001"], /* MYANMAR LETTER KHA */
+ ["\u1002", "\u1002"], /* MYANMAR LETTER GA */
+ ["\u1003", "\u1003"], /* MYANMAR LETTER GHA */
+ ["\u1004", "\u1004"], /* MYANMAR LETTER NGA */
+ ["\u1005", "\u1005"], /* MYANMAR LETTER CA */
+ ["\u1006", "\u1006"], /* MYANMAR LETTER CHA */
+ ["\u1007", "\u1007"], /* MYANMAR LETTER JA */
+ ["\u1008", "\u1008"], /* MYANMAR LETTER JHA */
+ ["\u1009", "\u1009"], /* MYANMAR LETTER NYA */
+ ["\u100A", "\u100A"], /* MYANMAR LETTER NNYA */
+ ["\u100B", "\u100B"], /* MYANMAR LETTER TTA */
+ ["\u100C", "\u100C"], /* MYANMAR LETTER TTHA */
+ ["\u100D", "\u100D"], /* MYANMAR LETTER DDA */
+ ["\u100E", "\u100E"], /* MYANMAR LETTER DDHA */
+ ["\u100F", "\u100F"], /* MYANMAR LETTER NNA */
+ ["\u1010", "\u1010"], /* MYANMAR LETTER TA */
+ ["\u1011", "\u1011"], /* MYANMAR LETTER THA */
+ ["\u1012", "\u1012"], /* MYANMAR LETTER DA */
+ ["\u1013", "\u1013"], /* MYANMAR LETTER DHA */
+ ["\u1014", "\u1014"], /* MYANMAR LETTER NA */
+ ["\u1015", "\u1015"], /* MYANMAR LETTER PA */
+ ["\u1016", "\u1016"], /* MYANMAR LETTER PHA */
+ ["\u1017", "\u1017"], /* MYANMAR LETTER BA */
+ ["\u1018", "\u1018"], /* MYANMAR LETTER BHA */
+ ["\u1019", "\u1019"], /* MYANMAR LETTER MA */
+ ["\u101A", "\u101A"], /* MYANMAR LETTER YA */
+ ["\u101B", "\u101B"], /* MYANMAR LETTER RA */
+ ["\u101C", "\u101C"], /* MYANMAR LETTER LA */
+ ["\u101D", "\u101D"], /* MYANMAR LETTER WA */
+ ["\u101E", "\u101E"], /* MYANMAR LETTER SA */
+ ["\u101F", "\u101F"], /* MYANMAR LETTER HA */
+ ["\u1020", "\u1020"], /* MYANMAR LETTER LLA */
+ ["\u1021", "\u1021"], /* MYANMAR LETTER A */
+ ["\u1022", "\u1022"], /* MYANMAR LETTER SHAN A */
+ ["\u1023", "\u1023"], /* MYANMAR LETTER I */
+ ["\u1024", "\u1024"], /* MYANMAR LETTER II */
+ ["\u1025", "\u1025"], /* MYANMAR LETTER U */
+ ["\u1026", "\u1026"], /* MYANMAR LETTER UU */
+ ["\u1027", "\u1027"], /* MYANMAR LETTER E */
+ ["\u1028", "\u1028"], /* MYANMAR LETTER MON E */
+ ["\u1029", "\u1029"], /* MYANMAR LETTER O */
+ ["\u102A", "\u102A"], /* MYANMAR LETTER AU */
+ ["\u102B", "\u102B"], /* MYANMAR VOWEL SIGN TALL AA */
+ ["\u102C", "\u102C"], /* MYANMAR VOWEL SIGN AA */
+ ["\u102D", "\u102D"], /* MYANMAR VOWEL SIGN I */
+ ["\u102E", "\u102E"], /* MYANMAR VOWEL SIGN II */
+ ["\u102F", "\u102F"], /* MYANMAR VOWEL SIGN U */
+ ["\u1030", "\u1030"], /* MYANMAR VOWEL SIGN UU */
+ ["\u1031", "\u1031"], /* MYANMAR VOWEL SIGN E */
+ ["\u1032", "\u1032"], /* MYANMAR VOWEL SIGN AI */
+ ["\u1033", "\u1033"], /* MYANMAR VOWEL SIGN MON II */
+ ["\u1034", "\u1034"], /* MYANMAR VOWEL SIGN MON O */
+ ["\u1035", "\u1035"], /* MYANMAR VOWEL SIGN E ABOVE */
+ ["\u1036", "\u1036"], /* MYANMAR SIGN ANUSVARA */
+ ["\u1037", "\u1037"], /* MYANMAR SIGN DOT BELOW */
+ ["\u1038", "\u1038"], /* MYANMAR SIGN VISARGA */
+ ["\u1039", "\u1039"], /* MYANMAR SIGN VIRAMA */
+ ["\u103A", "\u103A"], /* MYANMAR SIGN ASAT */
+ ["\u103B", "\u103B"], /* MYANMAR CONSONANT SIGN MEDIAL YA */
+ ["\u103C", "\u103C"], /* MYANMAR CONSONANT SIGN MEDIAL RA */
+ ["\u103D", "\u103D"], /* MYANMAR CONSONANT SIGN MEDIAL WA */
+ ["\u103E", "\u103E"], /* MYANMAR CONSONANT SIGN MEDIAL HA */
+ ["\u103F", "\u103F"], /* MYANMAR LETTER GREAT SA */
+ ["\u1040", "\u1040"], /* MYANMAR DIGIT ZERO */
+ ["\u1041", "\u1041"], /* MYANMAR DIGIT ONE */
+ ["\u1042", "\u1042"], /* MYANMAR DIGIT TWO */
+ ["\u1043", "\u1043"], /* MYANMAR DIGIT THREE */
+ ["\u1044", "\u1044"], /* MYANMAR DIGIT FOUR */
+ ["\u1045", "\u1045"], /* MYANMAR DIGIT FIVE */
+ ["\u1046", "\u1046"], /* MYANMAR DIGIT SIX */
+ ["\u1047", "\u1047"], /* MYANMAR DIGIT SEVEN */
+ ["\u1048", "\u1048"], /* MYANMAR DIGIT EIGHT */
+ ["\u1049", "\u1049"], /* MYANMAR DIGIT NINE */
+ ["\u104A", "\u104A"], /* MYANMAR SIGN LITTLE SECTION */
+ ["\u104B", "\u104B"], /* MYANMAR SIGN SECTION */
+ ["\u104C", "\u104C"], /* MYANMAR SYMBOL LOCATIVE */
+ ["\u104D", "\u104D"], /* MYANMAR SYMBOL COMPLETED */
+ ["\u104E", "\u104E"], /* MYANMAR SYMBOL AFOREMENTIONED */
+ ["\u104F", "\u104F"], /* MYANMAR SYMBOL GENITIVE */
+ ["\u1050", "\u1050"], /* MYANMAR LETTER SHA */
+ ["\u1051", "\u1051"], /* MYANMAR LETTER SSA */
+ ["\u1052", "\u1052"], /* MYANMAR LETTER VOCALIC R */
+ ["\u1053", "\u1053"], /* MYANMAR LETTER VOCALIC RR */
+ ["\u1054", "\u1054"], /* MYANMAR LETTER VOCALIC L */
+ ["\u1055", "\u1055"], /* MYANMAR LETTER VOCALIC LL */
+ ["\u1056", "\u1056"], /* MYANMAR VOWEL SIGN VOCALIC R */
+ ["\u1057", "\u1057"], /* MYANMAR VOWEL SIGN VOCALIC RR */
+ ["\u1058", "\u1058"], /* MYANMAR VOWEL SIGN VOCALIC L */
+ ["\u1059", "\u1059"], /* MYANMAR VOWEL SIGN VOCALIC LL */
+ ["\u105A", "\u105A"], /* MYANMAR LETTER MON NGA */
+ ["\u105B", "\u105B"], /* MYANMAR LETTER MON JHA */
+ ["\u105C", "\u105C"], /* MYANMAR LETTER MON BBA */
+ ["\u105D", "\u105D"], /* MYANMAR LETTER MON BBE */
+ ["\u105E", "\u105E"], /* MYANMAR CONSONANT SIGN MON MEDIAL NA */
+ ["\u105F", "\u105F"], /* MYANMAR CONSONANT SIGN MON MEDIAL MA */
+ ["\u1060", "\u1060"], /* MYANMAR CONSONANT SIGN MON MEDIAL LA */
+ ["\u1061", "\u1061"], /* MYANMAR LETTER SGAW KAREN SHA */
+ ["\u1062", "\u1062"], /* MYANMAR VOWEL SIGN SGAW KAREN EU */
+ ["\u1063", "\u1063"], /* MYANMAR TONE MARK SGAW KAREN HATHI */
+ ["\u1064", "\u1064"], /* MYANMAR TONE MARK SGAW KAREN KE PHO */
+ ["\u1065", "\u1065"], /* MYANMAR LETTER WESTERN PWO KAREN THA */
+ ["\u1066", "\u1066"], /* MYANMAR LETTER WESTERN PWO KAREN PWA */
+ ["\u1067", "\u1067"], /* MYANMAR VOWEL SIGN WESTERN PWO KAREN EU */
+ ["\u1068", "\u1068"], /* MYANMAR VOWEL SIGN WESTERN PWO KAREN UE */
+ ["\u1069", "\u1069"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-1 */
+ ["\u106A", "\u106A"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-2 */
+ ["\u106B", "\u106B"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-3 */
+ ["\u106C", "\u106C"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-4 */
+ ["\u106D", "\u106D"], /* MYANMAR SIGN WESTERN PWO KAREN TONE-5 */
+ ["\u106E", "\u106E"], /* MYANMAR LETTER EASTERN PWO KAREN NNA */
+ ["\u106F", "\u106F"], /* MYANMAR LETTER EASTERN PWO KAREN YWA */
+ ["\u1070", "\u1070"], /* MYANMAR LETTER EASTERN PWO KAREN GHWA */
+ ["\u1071", "\u1071"], /* MYANMAR VOWEL SIGN GEBA KAREN I */
+ ["\u1072", "\u1072"], /* MYANMAR VOWEL SIGN KAYAH OE */
+ ["\u1073", "\u1073"], /* MYANMAR VOWEL SIGN KAYAH U */
+ ["\u1074", "\u1074"], /* MYANMAR VOWEL SIGN KAYAH EE */
+ ["\u1075", "\u1075"], /* MYANMAR LETTER SHAN KA */
+ ["\u1076", "\u1076"], /* MYANMAR LETTER SHAN KHA */
+ ["\u1077", "\u1077"], /* MYANMAR LETTER SHAN GA */
+ ["\u1078", "\u1078"], /* MYANMAR LETTER SHAN CA */
+ ["\u1079", "\u1079"], /* MYANMAR LETTER SHAN ZA */
+ ["\u107A", "\u107A"], /* MYANMAR LETTER SHAN NYA */
+ ["\u107B", "\u107B"], /* MYANMAR LETTER SHAN DA */
+ ["\u107C", "\u107C"], /* MYANMAR LETTER SHAN NA */
+ ["\u107D", "\u107D"], /* MYANMAR LETTER SHAN PHA */
+ ["\u107E", "\u107E"], /* MYANMAR LETTER SHAN FA */
+ ["\u107F", "\u107F"], /* MYANMAR LETTER SHAN BA */
+ ["\u1080", "\u1080"], /* MYANMAR LETTER SHAN THA */
+ ["\u1081", "\u1081"], /* MYANMAR LETTER SHAN HA */
+ ["\u1082", "\u1082"], /* MYANMAR CONSONANT SIGN SHAN MEDIAL WA */
+ ["\u1083", "\u1083"], /* MYANMAR VOWEL SIGN SHAN AA */
+ ["\u1084", "\u1084"], /* MYANMAR VOWEL SIGN SHAN E */
+ ["\u1085", "\u1085"], /* MYANMAR VOWEL SIGN SHAN E ABOVE */
+ ["\u1086", "\u1086"], /* MYANMAR VOWEL SIGN SHAN FINAL Y */
+ ["\u1087", "\u1087"], /* MYANMAR SIGN SHAN TONE-2 */
+ ["\u1088", "\u1088"], /* MYANMAR SIGN SHAN TONE-3 */
+ ["\u1089", "\u1089"], /* MYANMAR SIGN SHAN TONE-5 */
+ ["\u108A", "\u108A"], /* MYANMAR SIGN SHAN TONE-6 */
+ ["\u108B", "\u108B"], /* MYANMAR SIGN SHAN COUNCIL TONE-2 */
+ ["\u108C", "\u108C"], /* MYANMAR SIGN SHAN COUNCIL TONE-3 */
+ ["\u108D", "\u108D"], /* MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE */
+ ["\u108E", "\u108E"], /* MYANMAR LETTER RUMAI PALAUNG FA */
+ ["\u108F", "\u108F"], /* MYANMAR SIGN RUMAI PALAUNG TONE-5 */
+ ["\u1090", "\u1090"], /* MYANMAR SHAN DIGIT ZERO */
+ ["\u1091", "\u1091"], /* MYANMAR SHAN DIGIT ONE */
+ ["\u1092", "\u1092"], /* MYANMAR SHAN DIGIT TWO */
+ ["\u1093", "\u1093"], /* MYANMAR SHAN DIGIT THREE */
+ ["\u1094", "\u1094"], /* MYANMAR SHAN DIGIT FOUR */
+ ["\u1095", "\u1095"], /* MYANMAR SHAN DIGIT FIVE */
+ ["\u1096", "\u1096"], /* MYANMAR SHAN DIGIT SIX */
+ ["\u1097", "\u1097"], /* MYANMAR SHAN DIGIT SEVEN */
+ ["\u1098", "\u1098"], /* MYANMAR SHAN DIGIT EIGHT */
+ ["\u1099", "\u1099"], /* MYANMAR SHAN DIGIT NINE */
+ ["\u109A", "\u109A"], /* MYANMAR SIGN KHAMTI TONE-1 */
+ ["\u109B", "\u109B"], /* MYANMAR SIGN KHAMTI TONE-3 */
+ ["\u109C", "\u109C"], /* MYANMAR VOWEL SIGN AITON A */
+ ["\u109D", "\u109D"], /* MYANMAR VOWEL SIGN AITON AI */
+ ["\u109E", "\u109E"], /* MYANMAR SYMBOL SHAN ONE */
+ ["\u109F", "\u109F"], /* MYANMAR SYMBOL SHAN EXCLAMATION */
+ ["\u10A0", "\u2D00"], /* GEORGIAN CAPITAL LETTER AN */
+ ["\u10A1", "\u2D01"], /* GEORGIAN CAPITAL LETTER BAN */
+ ["\u10A2", "\u2D02"], /* GEORGIAN CAPITAL LETTER GAN */
+ ["\u10A3", "\u2D03"], /* GEORGIAN CAPITAL LETTER DON */
+ ["\u10A4", "\u2D04"], /* GEORGIAN CAPITAL LETTER EN */
+ ["\u10A5", "\u2D05"], /* GEORGIAN CAPITAL LETTER VIN */
+ ["\u10A6", "\u2D06"], /* GEORGIAN CAPITAL LETTER ZEN */
+ ["\u10A7", "\u2D07"], /* GEORGIAN CAPITAL LETTER TAN */
+ ["\u10A8", "\u2D08"], /* GEORGIAN CAPITAL LETTER IN */
+ ["\u10A9", "\u2D09"], /* GEORGIAN CAPITAL LETTER KAN */
+ ["\u10AA", "\u2D0A"], /* GEORGIAN CAPITAL LETTER LAS */
+ ["\u10AB", "\u2D0B"], /* GEORGIAN CAPITAL LETTER MAN */
+ ["\u10AC", "\u2D0C"], /* GEORGIAN CAPITAL LETTER NAR */
+ ["\u10AD", "\u2D0D"], /* GEORGIAN CAPITAL LETTER ON */
+ ["\u10AE", "\u2D0E"], /* GEORGIAN CAPITAL LETTER PAR */
+ ["\u10AF", "\u2D0F"], /* GEORGIAN CAPITAL LETTER ZHAR */
+ ["\u10B0", "\u2D10"], /* GEORGIAN CAPITAL LETTER RAE */
+ ["\u10B1", "\u2D11"], /* GEORGIAN CAPITAL LETTER SAN */
+ ["\u10B2", "\u2D12"], /* GEORGIAN CAPITAL LETTER TAR */
+ ["\u10B3", "\u2D13"], /* GEORGIAN CAPITAL LETTER UN */
+ ["\u10B4", "\u2D14"], /* GEORGIAN CAPITAL LETTER PHAR */
+ ["\u10B5", "\u2D15"], /* GEORGIAN CAPITAL LETTER KHAR */
+ ["\u10B6", "\u2D16"], /* GEORGIAN CAPITAL LETTER GHAN */
+ ["\u10B7", "\u2D17"], /* GEORGIAN CAPITAL LETTER QAR */
+ ["\u10B8", "\u2D18"], /* GEORGIAN CAPITAL LETTER SHIN */
+ ["\u10B9", "\u2D19"], /* GEORGIAN CAPITAL LETTER CHIN */
+ ["\u10BA", "\u2D1A"], /* GEORGIAN CAPITAL LETTER CAN */
+ ["\u10BB", "\u2D1B"], /* GEORGIAN CAPITAL LETTER JIL */
+ ["\u10BC", "\u2D1C"], /* GEORGIAN CAPITAL LETTER CIL */
+ ["\u10BD", "\u2D1D"], /* GEORGIAN CAPITAL LETTER CHAR */
+ ["\u10BE", "\u2D1E"], /* GEORGIAN CAPITAL LETTER XAN */
+ ["\u10BF", "\u2D1F"], /* GEORGIAN CAPITAL LETTER JHAN */
+ ["\u10C0", "\u2D20"], /* GEORGIAN CAPITAL LETTER HAE */
+ ["\u10C1", "\u2D21"], /* GEORGIAN CAPITAL LETTER HE */
+ ["\u10C2", "\u2D22"], /* GEORGIAN CAPITAL LETTER HIE */
+ ["\u10C3", "\u2D23"], /* GEORGIAN CAPITAL LETTER WE */
+ ["\u10C4", "\u2D24"], /* GEORGIAN CAPITAL LETTER HAR */
+ ["\u10C5", "\u2D25"], /* GEORGIAN CAPITAL LETTER HOE */
+ ["\u10C6", "\u10C6"],
+ ["\u10C7", "\u2D27"], /* GEORGIAN CAPITAL LETTER YN */
+ ["\u10C8", "\u10C8"],
+ ["\u10C9", "\u10C9"],
+ ["\u10CA", "\u10CA"],
+ ["\u10CB", "\u10CB"],
+ ["\u10CC", "\u10CC"],
+ ["\u10CD", "\u2D2D"], /* GEORGIAN CAPITAL LETTER AEN */
+ ["\u10CE", "\u10CE"],
+ ["\u10CF", "\u10CF"],
+ ["\u1C90", "\u10D0"], /* GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN) */
+ ["\u1C91", "\u10D1"], /* GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN) */
+ ["\u1C92", "\u10D2"], /* GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN) */
+ ["\u1C93", "\u10D3"], /* GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON) */
+ ["\u1C94", "\u10D4"], /* GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN) */
+ ["\u1C95", "\u10D5"], /* GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN) */
+ ["\u1C96", "\u10D6"], /* GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN) */
+ ["\u1C97", "\u10D7"], /* GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN) */
+ ["\u1C98", "\u10D8"], /* GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN) */
+ ["\u1C99", "\u10D9"], /* GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN) */
+ ["\u1C9A", "\u10DA"], /* GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS) */
+ ["\u1C9B", "\u10DB"], /* GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN) */
+ ["\u1C9C", "\u10DC"], /* GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR) */
+ ["\u1C9D", "\u10DD"], /* GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON) */
+ ["\u1C9E", "\u10DE"], /* GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR) */
+ ["\u1C9F", "\u10DF"], /* GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR) */
+ ["\u1CA0", "\u10E0"], /* GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE) */
+ ["\u1CA1", "\u10E1"], /* GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN) */
+ ["\u1CA2", "\u10E2"], /* GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR) */
+ ["\u1CA3", "\u10E3"], /* GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN) */
+ ["\u1CA4", "\u10E4"], /* GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR) */
+ ["\u1CA5", "\u10E5"], /* GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR) */
+ ["\u1CA6", "\u10E6"], /* GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN) */
+ ["\u1CA7", "\u10E7"], /* GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR) */
+ ["\u1CA8", "\u10E8"], /* GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN) */
+ ["\u1CA9", "\u10E9"], /* GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN) */
+ ["\u1CAA", "\u10EA"], /* GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN) */
+ ["\u1CAB", "\u10EB"], /* GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL) */
+ ["\u1CAC", "\u10EC"], /* GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL) */
+ ["\u1CAD", "\u10ED"], /* GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR) */
+ ["\u1CAE", "\u10EE"], /* GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN) */
+ ["\u1CAF", "\u10EF"], /* GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN) */
+ ["\u1CB0", "\u10F0"], /* GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE) */
+ ["\u1CB1", "\u10F1"], /* GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE) */
+ ["\u1CB2", "\u10F2"], /* GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE) */
+ ["\u1CB3", "\u10F3"], /* GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE) */
+ ["\u1CB4", "\u10F4"], /* GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR) */
+ ["\u1CB5", "\u10F5"], /* GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE) */
+ ["\u1CB6", "\u10F6"], /* GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI) */
+ ["\u1CB7", "\u10F7"], /* GEORGIAN LETTER YN */
+ ["\u1CB8", "\u10F8"], /* GEORGIAN LETTER ELIFI */
+ ["\u1CB9", "\u10F9"], /* GEORGIAN LETTER TURNED GAN */
+ ["\u1CBA", "\u10FA"], /* GEORGIAN LETTER AIN */
+ ["\u10FB", "\u10FB"], /* GEORGIAN PARAGRAPH SEPARATOR */
+ ["\u10FC", "\u10FC"], /* MODIFIER LETTER GEORGIAN NAR */
+ ["\u1CBD", "\u10FD"], /* GEORGIAN LETTER AEN */
+ ["\u1CBE", "\u10FE"], /* GEORGIAN LETTER HARD SIGN */
+ ["\u1CBF", "\u10FF"], /* GEORGIAN LETTER LABIAL SIGN */
+ ["\u1100", "\u1100"], /* HANGUL CHOSEONG KIYEOK */
+ ["\u1101", "\u1101"], /* HANGUL CHOSEONG SSANGKIYEOK */
+ ["\u1102", "\u1102"], /* HANGUL CHOSEONG NIEUN */
+ ["\u1103", "\u1103"], /* HANGUL CHOSEONG TIKEUT */
+ ["\u1104", "\u1104"], /* HANGUL CHOSEONG SSANGTIKEUT */
+ ["\u1105", "\u1105"], /* HANGUL CHOSEONG RIEUL */
+ ["\u1106", "\u1106"], /* HANGUL CHOSEONG MIEUM */
+ ["\u1107", "\u1107"], /* HANGUL CHOSEONG PIEUP */
+ ["\u1108", "\u1108"], /* HANGUL CHOSEONG SSANGPIEUP */
+ ["\u1109", "\u1109"], /* HANGUL CHOSEONG SIOS */
+ ["\u110A", "\u110A"], /* HANGUL CHOSEONG SSANGSIOS */
+ ["\u110B", "\u110B"], /* HANGUL CHOSEONG IEUNG */
+ ["\u110C", "\u110C"], /* HANGUL CHOSEONG CIEUC */
+ ["\u110D", "\u110D"], /* HANGUL CHOSEONG SSANGCIEUC */
+ ["\u110E", "\u110E"], /* HANGUL CHOSEONG CHIEUCH */
+ ["\u110F", "\u110F"], /* HANGUL CHOSEONG KHIEUKH */
+ ["\u1110", "\u1110"], /* HANGUL CHOSEONG THIEUTH */
+ ["\u1111", "\u1111"], /* HANGUL CHOSEONG PHIEUPH */
+ ["\u1112", "\u1112"], /* HANGUL CHOSEONG HIEUH */
+ ["\u1113", "\u1113"], /* HANGUL CHOSEONG NIEUN-KIYEOK */
+ ["\u1114", "\u1114"], /* HANGUL CHOSEONG SSANGNIEUN */
+ ["\u1115", "\u1115"], /* HANGUL CHOSEONG NIEUN-TIKEUT */
+ ["\u1116", "\u1116"], /* HANGUL CHOSEONG NIEUN-PIEUP */
+ ["\u1117", "\u1117"], /* HANGUL CHOSEONG TIKEUT-KIYEOK */
+ ["\u1118", "\u1118"], /* HANGUL CHOSEONG RIEUL-NIEUN */
+ ["\u1119", "\u1119"], /* HANGUL CHOSEONG SSANGRIEUL */
+ ["\u111A", "\u111A"], /* HANGUL CHOSEONG RIEUL-HIEUH */
+ ["\u111B", "\u111B"], /* HANGUL CHOSEONG KAPYEOUNRIEUL */
+ ["\u111C", "\u111C"], /* HANGUL CHOSEONG MIEUM-PIEUP */
+ ["\u111D", "\u111D"], /* HANGUL CHOSEONG KAPYEOUNMIEUM */
+ ["\u111E", "\u111E"], /* HANGUL CHOSEONG PIEUP-KIYEOK */
+ ["\u111F", "\u111F"], /* HANGUL CHOSEONG PIEUP-NIEUN */
+ ["\u1120", "\u1120"], /* HANGUL CHOSEONG PIEUP-TIKEUT */
+ ["\u1121", "\u1121"], /* HANGUL CHOSEONG PIEUP-SIOS */
+ ["\u1122", "\u1122"], /* HANGUL CHOSEONG PIEUP-SIOS-KIYEOK */
+ ["\u1123", "\u1123"], /* HANGUL CHOSEONG PIEUP-SIOS-TIKEUT */
+ ["\u1124", "\u1124"], /* HANGUL CHOSEONG PIEUP-SIOS-PIEUP */
+ ["\u1125", "\u1125"], /* HANGUL CHOSEONG PIEUP-SSANGSIOS */
+ ["\u1126", "\u1126"], /* HANGUL CHOSEONG PIEUP-SIOS-CIEUC */
+ ["\u1127", "\u1127"], /* HANGUL CHOSEONG PIEUP-CIEUC */
+ ["\u1128", "\u1128"], /* HANGUL CHOSEONG PIEUP-CHIEUCH */
+ ["\u1129", "\u1129"], /* HANGUL CHOSEONG PIEUP-THIEUTH */
+ ["\u112A", "\u112A"], /* HANGUL CHOSEONG PIEUP-PHIEUPH */
+ ["\u112B", "\u112B"], /* HANGUL CHOSEONG KAPYEOUNPIEUP */
+ ["\u112C", "\u112C"], /* HANGUL CHOSEONG KAPYEOUNSSANGPIEUP */
+ ["\u112D", "\u112D"], /* HANGUL CHOSEONG SIOS-KIYEOK */
+ ["\u112E", "\u112E"], /* HANGUL CHOSEONG SIOS-NIEUN */
+ ["\u112F", "\u112F"], /* HANGUL CHOSEONG SIOS-TIKEUT */
+ ["\u1130", "\u1130"], /* HANGUL CHOSEONG SIOS-RIEUL */
+ ["\u1131", "\u1131"], /* HANGUL CHOSEONG SIOS-MIEUM */
+ ["\u1132", "\u1132"], /* HANGUL CHOSEONG SIOS-PIEUP */
+ ["\u1133", "\u1133"], /* HANGUL CHOSEONG SIOS-PIEUP-KIYEOK */
+ ["\u1134", "\u1134"], /* HANGUL CHOSEONG SIOS-SSANGSIOS */
+ ["\u1135", "\u1135"], /* HANGUL CHOSEONG SIOS-IEUNG */
+ ["\u1136", "\u1136"], /* HANGUL CHOSEONG SIOS-CIEUC */
+ ["\u1137", "\u1137"], /* HANGUL CHOSEONG SIOS-CHIEUCH */
+ ["\u1138", "\u1138"], /* HANGUL CHOSEONG SIOS-KHIEUKH */
+ ["\u1139", "\u1139"], /* HANGUL CHOSEONG SIOS-THIEUTH */
+ ["\u113A", "\u113A"], /* HANGUL CHOSEONG SIOS-PHIEUPH */
+ ["\u113B", "\u113B"], /* HANGUL CHOSEONG SIOS-HIEUH */
+ ["\u113C", "\u113C"], /* HANGUL CHOSEONG CHITUEUMSIOS */
+ ["\u113D", "\u113D"], /* HANGUL CHOSEONG CHITUEUMSSANGSIOS */
+ ["\u113E", "\u113E"], /* HANGUL CHOSEONG CEONGCHIEUMSIOS */
+ ["\u113F", "\u113F"], /* HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS */
+ ["\u1140", "\u1140"], /* HANGUL CHOSEONG PANSIOS */
+ ["\u1141", "\u1141"], /* HANGUL CHOSEONG IEUNG-KIYEOK */
+ ["\u1142", "\u1142"], /* HANGUL CHOSEONG IEUNG-TIKEUT */
+ ["\u1143", "\u1143"], /* HANGUL CHOSEONG IEUNG-MIEUM */
+ ["\u1144", "\u1144"], /* HANGUL CHOSEONG IEUNG-PIEUP */
+ ["\u1145", "\u1145"], /* HANGUL CHOSEONG IEUNG-SIOS */
+ ["\u1146", "\u1146"], /* HANGUL CHOSEONG IEUNG-PANSIOS */
+ ["\u1147", "\u1147"], /* HANGUL CHOSEONG SSANGIEUNG */
+ ["\u1148", "\u1148"], /* HANGUL CHOSEONG IEUNG-CIEUC */
+ ["\u1149", "\u1149"], /* HANGUL CHOSEONG IEUNG-CHIEUCH */
+ ["\u114A", "\u114A"], /* HANGUL CHOSEONG IEUNG-THIEUTH */
+ ["\u114B", "\u114B"], /* HANGUL CHOSEONG IEUNG-PHIEUPH */
+ ["\u114C", "\u114C"], /* HANGUL CHOSEONG YESIEUNG */
+ ["\u114D", "\u114D"], /* HANGUL CHOSEONG CIEUC-IEUNG */
+ ["\u114E", "\u114E"], /* HANGUL CHOSEONG CHITUEUMCIEUC */
+ ["\u114F", "\u114F"], /* HANGUL CHOSEONG CHITUEUMSSANGCIEUC */
+ ["\u1150", "\u1150"], /* HANGUL CHOSEONG CEONGCHIEUMCIEUC */
+ ["\u1151", "\u1151"], /* HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC */
+ ["\u1152", "\u1152"], /* HANGUL CHOSEONG CHIEUCH-KHIEUKH */
+ ["\u1153", "\u1153"], /* HANGUL CHOSEONG CHIEUCH-HIEUH */
+ ["\u1154", "\u1154"], /* HANGUL CHOSEONG CHITUEUMCHIEUCH */
+ ["\u1155", "\u1155"], /* HANGUL CHOSEONG CEONGCHIEUMCHIEUCH */
+ ["\u1156", "\u1156"], /* HANGUL CHOSEONG PHIEUPH-PIEUP */
+ ["\u1157", "\u1157"], /* HANGUL CHOSEONG KAPYEOUNPHIEUPH */
+ ["\u1158", "\u1158"], /* HANGUL CHOSEONG SSANGHIEUH */
+ ["\u1159", "\u1159"], /* HANGUL CHOSEONG YEORINHIEUH */
+ ["\u115A", "\u115A"], /* HANGUL CHOSEONG KIYEOK-TIKEUT */
+ ["\u115B", "\u115B"], /* HANGUL CHOSEONG NIEUN-SIOS */
+ ["\u115C", "\u115C"], /* HANGUL CHOSEONG NIEUN-CIEUC */
+ ["\u115D", "\u115D"], /* HANGUL CHOSEONG NIEUN-HIEUH */
+ ["\u115E", "\u115E"], /* HANGUL CHOSEONG TIKEUT-RIEUL */
+ ["\u115F", "\u115F"], /* HANGUL CHOSEONG FILLER */
+ ["\u1160", "\u1160"], /* HANGUL JUNGSEONG FILLER */
+ ["\u1161", "\u1161"], /* HANGUL JUNGSEONG A */
+ ["\u1162", "\u1162"], /* HANGUL JUNGSEONG AE */
+ ["\u1163", "\u1163"], /* HANGUL JUNGSEONG YA */
+ ["\u1164", "\u1164"], /* HANGUL JUNGSEONG YAE */
+ ["\u1165", "\u1165"], /* HANGUL JUNGSEONG EO */
+ ["\u1166", "\u1166"], /* HANGUL JUNGSEONG E */
+ ["\u1167", "\u1167"], /* HANGUL JUNGSEONG YEO */
+ ["\u1168", "\u1168"], /* HANGUL JUNGSEONG YE */
+ ["\u1169", "\u1169"], /* HANGUL JUNGSEONG O */
+ ["\u116A", "\u116A"], /* HANGUL JUNGSEONG WA */
+ ["\u116B", "\u116B"], /* HANGUL JUNGSEONG WAE */
+ ["\u116C", "\u116C"], /* HANGUL JUNGSEONG OE */
+ ["\u116D", "\u116D"], /* HANGUL JUNGSEONG YO */
+ ["\u116E", "\u116E"], /* HANGUL JUNGSEONG U */
+ ["\u116F", "\u116F"], /* HANGUL JUNGSEONG WEO */
+ ["\u1170", "\u1170"], /* HANGUL JUNGSEONG WE */
+ ["\u1171", "\u1171"], /* HANGUL JUNGSEONG WI */
+ ["\u1172", "\u1172"], /* HANGUL JUNGSEONG YU */
+ ["\u1173", "\u1173"], /* HANGUL JUNGSEONG EU */
+ ["\u1174", "\u1174"], /* HANGUL JUNGSEONG YI */
+ ["\u1175", "\u1175"], /* HANGUL JUNGSEONG I */
+ ["\u1176", "\u1176"], /* HANGUL JUNGSEONG A-O */
+ ["\u1177", "\u1177"], /* HANGUL JUNGSEONG A-U */
+ ["\u1178", "\u1178"], /* HANGUL JUNGSEONG YA-O */
+ ["\u1179", "\u1179"], /* HANGUL JUNGSEONG YA-YO */
+ ["\u117A", "\u117A"], /* HANGUL JUNGSEONG EO-O */
+ ["\u117B", "\u117B"], /* HANGUL JUNGSEONG EO-U */
+ ["\u117C", "\u117C"], /* HANGUL JUNGSEONG EO-EU */
+ ["\u117D", "\u117D"], /* HANGUL JUNGSEONG YEO-O */
+ ["\u117E", "\u117E"], /* HANGUL JUNGSEONG YEO-U */
+ ["\u117F", "\u117F"], /* HANGUL JUNGSEONG O-EO */
+ ["\u1180", "\u1180"], /* HANGUL JUNGSEONG O-E */
+ ["\u1181", "\u1181"], /* HANGUL JUNGSEONG O-YE */
+ ["\u1182", "\u1182"], /* HANGUL JUNGSEONG O-O */
+ ["\u1183", "\u1183"], /* HANGUL JUNGSEONG O-U */
+ ["\u1184", "\u1184"], /* HANGUL JUNGSEONG YO-YA */
+ ["\u1185", "\u1185"], /* HANGUL JUNGSEONG YO-YAE */
+ ["\u1186", "\u1186"], /* HANGUL JUNGSEONG YO-YEO */
+ ["\u1187", "\u1187"], /* HANGUL JUNGSEONG YO-O */
+ ["\u1188", "\u1188"], /* HANGUL JUNGSEONG YO-I */
+ ["\u1189", "\u1189"], /* HANGUL JUNGSEONG U-A */
+ ["\u118A", "\u118A"], /* HANGUL JUNGSEONG U-AE */
+ ["\u118B", "\u118B"], /* HANGUL JUNGSEONG U-EO-EU */
+ ["\u118C", "\u118C"], /* HANGUL JUNGSEONG U-YE */
+ ["\u118D", "\u118D"], /* HANGUL JUNGSEONG U-U */
+ ["\u118E", "\u118E"], /* HANGUL JUNGSEONG YU-A */
+ ["\u118F", "\u118F"], /* HANGUL JUNGSEONG YU-EO */
+ ["\u1190", "\u1190"], /* HANGUL JUNGSEONG YU-E */
+ ["\u1191", "\u1191"], /* HANGUL JUNGSEONG YU-YEO */
+ ["\u1192", "\u1192"], /* HANGUL JUNGSEONG YU-YE */
+ ["\u1193", "\u1193"], /* HANGUL JUNGSEONG YU-U */
+ ["\u1194", "\u1194"], /* HANGUL JUNGSEONG YU-I */
+ ["\u1195", "\u1195"], /* HANGUL JUNGSEONG EU-U */
+ ["\u1196", "\u1196"], /* HANGUL JUNGSEONG EU-EU */
+ ["\u1197", "\u1197"], /* HANGUL JUNGSEONG YI-U */
+ ["\u1198", "\u1198"], /* HANGUL JUNGSEONG I-A */
+ ["\u1199", "\u1199"], /* HANGUL JUNGSEONG I-YA */
+ ["\u119A", "\u119A"], /* HANGUL JUNGSEONG I-O */
+ ["\u119B", "\u119B"], /* HANGUL JUNGSEONG I-U */
+ ["\u119C", "\u119C"], /* HANGUL JUNGSEONG I-EU */
+ ["\u119D", "\u119D"], /* HANGUL JUNGSEONG I-ARAEA */
+ ["\u119E", "\u119E"], /* HANGUL JUNGSEONG ARAEA */
+ ["\u119F", "\u119F"], /* HANGUL JUNGSEONG ARAEA-EO */
+ ["\u11A0", "\u11A0"], /* HANGUL JUNGSEONG ARAEA-U */
+ ["\u11A1", "\u11A1"], /* HANGUL JUNGSEONG ARAEA-I */
+ ["\u11A2", "\u11A2"], /* HANGUL JUNGSEONG SSANGARAEA */
+ ["\u11A3", "\u11A3"], /* HANGUL JUNGSEONG A-EU */
+ ["\u11A4", "\u11A4"], /* HANGUL JUNGSEONG YA-U */
+ ["\u11A5", "\u11A5"], /* HANGUL JUNGSEONG YEO-YA */
+ ["\u11A6", "\u11A6"], /* HANGUL JUNGSEONG O-YA */
+ ["\u11A7", "\u11A7"], /* HANGUL JUNGSEONG O-YAE */
+ ["\u11A8", "\u11A8"], /* HANGUL JONGSEONG KIYEOK */
+ ["\u11A9", "\u11A9"], /* HANGUL JONGSEONG SSANGKIYEOK */
+ ["\u11AA", "\u11AA"], /* HANGUL JONGSEONG KIYEOK-SIOS */
+ ["\u11AB", "\u11AB"], /* HANGUL JONGSEONG NIEUN */
+ ["\u11AC", "\u11AC"], /* HANGUL JONGSEONG NIEUN-CIEUC */
+ ["\u11AD", "\u11AD"], /* HANGUL JONGSEONG NIEUN-HIEUH */
+ ["\u11AE", "\u11AE"], /* HANGUL JONGSEONG TIKEUT */
+ ["\u11AF", "\u11AF"], /* HANGUL JONGSEONG RIEUL */
+ ["\u11B0", "\u11B0"], /* HANGUL JONGSEONG RIEUL-KIYEOK */
+ ["\u11B1", "\u11B1"], /* HANGUL JONGSEONG RIEUL-MIEUM */
+ ["\u11B2", "\u11B2"], /* HANGUL JONGSEONG RIEUL-PIEUP */
+ ["\u11B3", "\u11B3"], /* HANGUL JONGSEONG RIEUL-SIOS */
+ ["\u11B4", "\u11B4"], /* HANGUL JONGSEONG RIEUL-THIEUTH */
+ ["\u11B5", "\u11B5"], /* HANGUL JONGSEONG RIEUL-PHIEUPH */
+ ["\u11B6", "\u11B6"], /* HANGUL JONGSEONG RIEUL-HIEUH */
+ ["\u11B7", "\u11B7"], /* HANGUL JONGSEONG MIEUM */
+ ["\u11B8", "\u11B8"], /* HANGUL JONGSEONG PIEUP */
+ ["\u11B9", "\u11B9"], /* HANGUL JONGSEONG PIEUP-SIOS */
+ ["\u11BA", "\u11BA"], /* HANGUL JONGSEONG SIOS */
+ ["\u11BB", "\u11BB"], /* HANGUL JONGSEONG SSANGSIOS */
+ ["\u11BC", "\u11BC"], /* HANGUL JONGSEONG IEUNG */
+ ["\u11BD", "\u11BD"], /* HANGUL JONGSEONG CIEUC */
+ ["\u11BE", "\u11BE"], /* HANGUL JONGSEONG CHIEUCH */
+ ["\u11BF", "\u11BF"], /* HANGUL JONGSEONG KHIEUKH */
+ ["\u11C0", "\u11C0"], /* HANGUL JONGSEONG THIEUTH */
+ ["\u11C1", "\u11C1"], /* HANGUL JONGSEONG PHIEUPH */
+ ["\u11C2", "\u11C2"], /* HANGUL JONGSEONG HIEUH */
+ ["\u11C3", "\u11C3"], /* HANGUL JONGSEONG KIYEOK-RIEUL */
+ ["\u11C4", "\u11C4"], /* HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK */
+ ["\u11C5", "\u11C5"], /* HANGUL JONGSEONG NIEUN-KIYEOK */
+ ["\u11C6", "\u11C6"], /* HANGUL JONGSEONG NIEUN-TIKEUT */
+ ["\u11C7", "\u11C7"], /* HANGUL JONGSEONG NIEUN-SIOS */
+ ["\u11C8", "\u11C8"], /* HANGUL JONGSEONG NIEUN-PANSIOS */
+ ["\u11C9", "\u11C9"], /* HANGUL JONGSEONG NIEUN-THIEUTH */
+ ["\u11CA", "\u11CA"], /* HANGUL JONGSEONG TIKEUT-KIYEOK */
+ ["\u11CB", "\u11CB"], /* HANGUL JONGSEONG TIKEUT-RIEUL */
+ ["\u11CC", "\u11CC"], /* HANGUL JONGSEONG RIEUL-KIYEOK-SIOS */
+ ["\u11CD", "\u11CD"], /* HANGUL JONGSEONG RIEUL-NIEUN */
+ ["\u11CE", "\u11CE"], /* HANGUL JONGSEONG RIEUL-TIKEUT */
+ ["\u11CF", "\u11CF"], /* HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH */
+ ["\u11D0", "\u11D0"], /* HANGUL JONGSEONG SSANGRIEUL */
+ ["\u11D1", "\u11D1"], /* HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK */
+ ["\u11D2", "\u11D2"], /* HANGUL JONGSEONG RIEUL-MIEUM-SIOS */
+ ["\u11D3", "\u11D3"], /* HANGUL JONGSEONG RIEUL-PIEUP-SIOS */
+ ["\u11D4", "\u11D4"], /* HANGUL JONGSEONG RIEUL-PIEUP-HIEUH */
+ ["\u11D5", "\u11D5"], /* HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP */
+ ["\u11D6", "\u11D6"], /* HANGUL JONGSEONG RIEUL-SSANGSIOS */
+ ["\u11D7", "\u11D7"], /* HANGUL JONGSEONG RIEUL-PANSIOS */
+ ["\u11D8", "\u11D8"], /* HANGUL JONGSEONG RIEUL-KHIEUKH */
+ ["\u11D9", "\u11D9"], /* HANGUL JONGSEONG RIEUL-YEORINHIEUH */
+ ["\u11DA", "\u11DA"], /* HANGUL JONGSEONG MIEUM-KIYEOK */
+ ["\u11DB", "\u11DB"], /* HANGUL JONGSEONG MIEUM-RIEUL */
+ ["\u11DC", "\u11DC"], /* HANGUL JONGSEONG MIEUM-PIEUP */
+ ["\u11DD", "\u11DD"], /* HANGUL JONGSEONG MIEUM-SIOS */
+ ["\u11DE", "\u11DE"], /* HANGUL JONGSEONG MIEUM-SSANGSIOS */
+ ["\u11DF", "\u11DF"], /* HANGUL JONGSEONG MIEUM-PANSIOS */
+ ["\u11E0", "\u11E0"], /* HANGUL JONGSEONG MIEUM-CHIEUCH */
+ ["\u11E1", "\u11E1"], /* HANGUL JONGSEONG MIEUM-HIEUH */
+ ["\u11E2", "\u11E2"], /* HANGUL JONGSEONG KAPYEOUNMIEUM */
+ ["\u11E3", "\u11E3"], /* HANGUL JONGSEONG PIEUP-RIEUL */
+ ["\u11E4", "\u11E4"], /* HANGUL JONGSEONG PIEUP-PHIEUPH */
+ ["\u11E5", "\u11E5"], /* HANGUL JONGSEONG PIEUP-HIEUH */
+ ["\u11E6", "\u11E6"], /* HANGUL JONGSEONG KAPYEOUNPIEUP */
+ ["\u11E7", "\u11E7"], /* HANGUL JONGSEONG SIOS-KIYEOK */
+ ["\u11E8", "\u11E8"], /* HANGUL JONGSEONG SIOS-TIKEUT */
+ ["\u11E9", "\u11E9"], /* HANGUL JONGSEONG SIOS-RIEUL */
+ ["\u11EA", "\u11EA"], /* HANGUL JONGSEONG SIOS-PIEUP */
+ ["\u11EB", "\u11EB"], /* HANGUL JONGSEONG PANSIOS */
+ ["\u11EC", "\u11EC"], /* HANGUL JONGSEONG IEUNG-KIYEOK */
+ ["\u11ED", "\u11ED"], /* HANGUL JONGSEONG IEUNG-SSANGKIYEOK */
+ ["\u11EE", "\u11EE"], /* HANGUL JONGSEONG SSANGIEUNG */
+ ["\u11EF", "\u11EF"], /* HANGUL JONGSEONG IEUNG-KHIEUKH */
+ ["\u11F0", "\u11F0"], /* HANGUL JONGSEONG YESIEUNG */
+ ["\u11F1", "\u11F1"], /* HANGUL JONGSEONG YESIEUNG-SIOS */
+ ["\u11F2", "\u11F2"], /* HANGUL JONGSEONG YESIEUNG-PANSIOS */
+ ["\u11F3", "\u11F3"], /* HANGUL JONGSEONG PHIEUPH-PIEUP */
+ ["\u11F4", "\u11F4"], /* HANGUL JONGSEONG KAPYEOUNPHIEUPH */
+ ["\u11F5", "\u11F5"], /* HANGUL JONGSEONG HIEUH-NIEUN */
+ ["\u11F6", "\u11F6"], /* HANGUL JONGSEONG HIEUH-RIEUL */
+ ["\u11F7", "\u11F7"], /* HANGUL JONGSEONG HIEUH-MIEUM */
+ ["\u11F8", "\u11F8"], /* HANGUL JONGSEONG HIEUH-PIEUP */
+ ["\u11F9", "\u11F9"], /* HANGUL JONGSEONG YEORINHIEUH */
+ ["\u11FA", "\u11FA"], /* HANGUL JONGSEONG KIYEOK-NIEUN */
+ ["\u11FB", "\u11FB"], /* HANGUL JONGSEONG KIYEOK-PIEUP */
+ ["\u11FC", "\u11FC"], /* HANGUL JONGSEONG KIYEOK-CHIEUCH */
+ ["\u11FD", "\u11FD"], /* HANGUL JONGSEONG KIYEOK-KHIEUKH */
+ ["\u11FE", "\u11FE"], /* HANGUL JONGSEONG KIYEOK-HIEUH */
+ ["\u11FF", "\u11FF"], /* HANGUL JONGSEONG SSANGNIEUN */
+ ["\u1200", "\u1200"], /* ETHIOPIC SYLLABLE HA */
+ ["\u1201", "\u1201"], /* ETHIOPIC SYLLABLE HU */
+ ["\u1202", "\u1202"], /* ETHIOPIC SYLLABLE HI */
+ ["\u1203", "\u1203"], /* ETHIOPIC SYLLABLE HAA */
+ ["\u1204", "\u1204"], /* ETHIOPIC SYLLABLE HEE */
+ ["\u1205", "\u1205"], /* ETHIOPIC SYLLABLE HE */
+ ["\u1206", "\u1206"], /* ETHIOPIC SYLLABLE HO */
+ ["\u1207", "\u1207"], /* ETHIOPIC SYLLABLE HOA */
+ ["\u1208", "\u1208"], /* ETHIOPIC SYLLABLE LA */
+ ["\u1209", "\u1209"], /* ETHIOPIC SYLLABLE LU */
+ ["\u120A", "\u120A"], /* ETHIOPIC SYLLABLE LI */
+ ["\u120B", "\u120B"], /* ETHIOPIC SYLLABLE LAA */
+ ["\u120C", "\u120C"], /* ETHIOPIC SYLLABLE LEE */
+ ["\u120D", "\u120D"], /* ETHIOPIC SYLLABLE LE */
+ ["\u120E", "\u120E"], /* ETHIOPIC SYLLABLE LO */
+ ["\u120F", "\u120F"], /* ETHIOPIC SYLLABLE LWA */
+ ["\u1210", "\u1210"], /* ETHIOPIC SYLLABLE HHA */
+ ["\u1211", "\u1211"], /* ETHIOPIC SYLLABLE HHU */
+ ["\u1212", "\u1212"], /* ETHIOPIC SYLLABLE HHI */
+ ["\u1213", "\u1213"], /* ETHIOPIC SYLLABLE HHAA */
+ ["\u1214", "\u1214"], /* ETHIOPIC SYLLABLE HHEE */
+ ["\u1215", "\u1215"], /* ETHIOPIC SYLLABLE HHE */
+ ["\u1216", "\u1216"], /* ETHIOPIC SYLLABLE HHO */
+ ["\u1217", "\u1217"], /* ETHIOPIC SYLLABLE HHWA */
+ ["\u1218", "\u1218"], /* ETHIOPIC SYLLABLE MA */
+ ["\u1219", "\u1219"], /* ETHIOPIC SYLLABLE MU */
+ ["\u121A", "\u121A"], /* ETHIOPIC SYLLABLE MI */
+ ["\u121B", "\u121B"], /* ETHIOPIC SYLLABLE MAA */
+ ["\u121C", "\u121C"], /* ETHIOPIC SYLLABLE MEE */
+ ["\u121D", "\u121D"], /* ETHIOPIC SYLLABLE ME */
+ ["\u121E", "\u121E"], /* ETHIOPIC SYLLABLE MO */
+ ["\u121F", "\u121F"], /* ETHIOPIC SYLLABLE MWA */
+ ["\u1220", "\u1220"], /* ETHIOPIC SYLLABLE SZA */
+ ["\u1221", "\u1221"], /* ETHIOPIC SYLLABLE SZU */
+ ["\u1222", "\u1222"], /* ETHIOPIC SYLLABLE SZI */
+ ["\u1223", "\u1223"], /* ETHIOPIC SYLLABLE SZAA */
+ ["\u1224", "\u1224"], /* ETHIOPIC SYLLABLE SZEE */
+ ["\u1225", "\u1225"], /* ETHIOPIC SYLLABLE SZE */
+ ["\u1226", "\u1226"], /* ETHIOPIC SYLLABLE SZO */
+ ["\u1227", "\u1227"], /* ETHIOPIC SYLLABLE SZWA */
+ ["\u1228", "\u1228"], /* ETHIOPIC SYLLABLE RA */
+ ["\u1229", "\u1229"], /* ETHIOPIC SYLLABLE RU */
+ ["\u122A", "\u122A"], /* ETHIOPIC SYLLABLE RI */
+ ["\u122B", "\u122B"], /* ETHIOPIC SYLLABLE RAA */
+ ["\u122C", "\u122C"], /* ETHIOPIC SYLLABLE REE */
+ ["\u122D", "\u122D"], /* ETHIOPIC SYLLABLE RE */
+ ["\u122E", "\u122E"], /* ETHIOPIC SYLLABLE RO */
+ ["\u122F", "\u122F"], /* ETHIOPIC SYLLABLE RWA */
+ ["\u1230", "\u1230"], /* ETHIOPIC SYLLABLE SA */
+ ["\u1231", "\u1231"], /* ETHIOPIC SYLLABLE SU */
+ ["\u1232", "\u1232"], /* ETHIOPIC SYLLABLE SI */
+ ["\u1233", "\u1233"], /* ETHIOPIC SYLLABLE SAA */
+ ["\u1234", "\u1234"], /* ETHIOPIC SYLLABLE SEE */
+ ["\u1235", "\u1235"], /* ETHIOPIC SYLLABLE SE */
+ ["\u1236", "\u1236"], /* ETHIOPIC SYLLABLE SO */
+ ["\u1237", "\u1237"], /* ETHIOPIC SYLLABLE SWA */
+ ["\u1238", "\u1238"], /* ETHIOPIC SYLLABLE SHA */
+ ["\u1239", "\u1239"], /* ETHIOPIC SYLLABLE SHU */
+ ["\u123A", "\u123A"], /* ETHIOPIC SYLLABLE SHI */
+ ["\u123B", "\u123B"], /* ETHIOPIC SYLLABLE SHAA */
+ ["\u123C", "\u123C"], /* ETHIOPIC SYLLABLE SHEE */
+ ["\u123D", "\u123D"], /* ETHIOPIC SYLLABLE SHE */
+ ["\u123E", "\u123E"], /* ETHIOPIC SYLLABLE SHO */
+ ["\u123F", "\u123F"], /* ETHIOPIC SYLLABLE SHWA */
+ ["\u1240", "\u1240"], /* ETHIOPIC SYLLABLE QA */
+ ["\u1241", "\u1241"], /* ETHIOPIC SYLLABLE QU */
+ ["\u1242", "\u1242"], /* ETHIOPIC SYLLABLE QI */
+ ["\u1243", "\u1243"], /* ETHIOPIC SYLLABLE QAA */
+ ["\u1244", "\u1244"], /* ETHIOPIC SYLLABLE QEE */
+ ["\u1245", "\u1245"], /* ETHIOPIC SYLLABLE QE */
+ ["\u1246", "\u1246"], /* ETHIOPIC SYLLABLE QO */
+ ["\u1247", "\u1247"], /* ETHIOPIC SYLLABLE QOA */
+ ["\u1248", "\u1248"], /* ETHIOPIC SYLLABLE QWA */
+ ["\u1249", "\u1249"],
+ ["\u124A", "\u124A"], /* ETHIOPIC SYLLABLE QWI */
+ ["\u124B", "\u124B"], /* ETHIOPIC SYLLABLE QWAA */
+ ["\u124C", "\u124C"], /* ETHIOPIC SYLLABLE QWEE */
+ ["\u124D", "\u124D"], /* ETHIOPIC SYLLABLE QWE */
+ ["\u124E", "\u124E"],
+ ["\u124F", "\u124F"],
+ ["\u1250", "\u1250"], /* ETHIOPIC SYLLABLE QHA */
+ ["\u1251", "\u1251"], /* ETHIOPIC SYLLABLE QHU */
+ ["\u1252", "\u1252"], /* ETHIOPIC SYLLABLE QHI */
+ ["\u1253", "\u1253"], /* ETHIOPIC SYLLABLE QHAA */
+ ["\u1254", "\u1254"], /* ETHIOPIC SYLLABLE QHEE */
+ ["\u1255", "\u1255"], /* ETHIOPIC SYLLABLE QHE */
+ ["\u1256", "\u1256"], /* ETHIOPIC SYLLABLE QHO */
+ ["\u1257", "\u1257"],
+ ["\u1258", "\u1258"], /* ETHIOPIC SYLLABLE QHWA */
+ ["\u1259", "\u1259"],
+ ["\u125A", "\u125A"], /* ETHIOPIC SYLLABLE QHWI */
+ ["\u125B", "\u125B"], /* ETHIOPIC SYLLABLE QHWAA */
+ ["\u125C", "\u125C"], /* ETHIOPIC SYLLABLE QHWEE */
+ ["\u125D", "\u125D"], /* ETHIOPIC SYLLABLE QHWE */
+ ["\u125E", "\u125E"],
+ ["\u125F", "\u125F"],
+ ["\u1260", "\u1260"], /* ETHIOPIC SYLLABLE BA */
+ ["\u1261", "\u1261"], /* ETHIOPIC SYLLABLE BU */
+ ["\u1262", "\u1262"], /* ETHIOPIC SYLLABLE BI */
+ ["\u1263", "\u1263"], /* ETHIOPIC SYLLABLE BAA */
+ ["\u1264", "\u1264"], /* ETHIOPIC SYLLABLE BEE */
+ ["\u1265", "\u1265"], /* ETHIOPIC SYLLABLE BE */
+ ["\u1266", "\u1266"], /* ETHIOPIC SYLLABLE BO */
+ ["\u1267", "\u1267"], /* ETHIOPIC SYLLABLE BWA */
+ ["\u1268", "\u1268"], /* ETHIOPIC SYLLABLE VA */
+ ["\u1269", "\u1269"], /* ETHIOPIC SYLLABLE VU */
+ ["\u126A", "\u126A"], /* ETHIOPIC SYLLABLE VI */
+ ["\u126B", "\u126B"], /* ETHIOPIC SYLLABLE VAA */
+ ["\u126C", "\u126C"], /* ETHIOPIC SYLLABLE VEE */
+ ["\u126D", "\u126D"], /* ETHIOPIC SYLLABLE VE */
+ ["\u126E", "\u126E"], /* ETHIOPIC SYLLABLE VO */
+ ["\u126F", "\u126F"], /* ETHIOPIC SYLLABLE VWA */
+ ["\u1270", "\u1270"], /* ETHIOPIC SYLLABLE TA */
+ ["\u1271", "\u1271"], /* ETHIOPIC SYLLABLE TU */
+ ["\u1272", "\u1272"], /* ETHIOPIC SYLLABLE TI */
+ ["\u1273", "\u1273"], /* ETHIOPIC SYLLABLE TAA */
+ ["\u1274", "\u1274"], /* ETHIOPIC SYLLABLE TEE */
+ ["\u1275", "\u1275"], /* ETHIOPIC SYLLABLE TE */
+ ["\u1276", "\u1276"], /* ETHIOPIC SYLLABLE TO */
+ ["\u1277", "\u1277"], /* ETHIOPIC SYLLABLE TWA */
+ ["\u1278", "\u1278"], /* ETHIOPIC SYLLABLE CA */
+ ["\u1279", "\u1279"], /* ETHIOPIC SYLLABLE CU */
+ ["\u127A", "\u127A"], /* ETHIOPIC SYLLABLE CI */
+ ["\u127B", "\u127B"], /* ETHIOPIC SYLLABLE CAA */
+ ["\u127C", "\u127C"], /* ETHIOPIC SYLLABLE CEE */
+ ["\u127D", "\u127D"], /* ETHIOPIC SYLLABLE CE */
+ ["\u127E", "\u127E"], /* ETHIOPIC SYLLABLE CO */
+ ["\u127F", "\u127F"], /* ETHIOPIC SYLLABLE CWA */
+ ["\u1280", "\u1280"], /* ETHIOPIC SYLLABLE XA */
+ ["\u1281", "\u1281"], /* ETHIOPIC SYLLABLE XU */
+ ["\u1282", "\u1282"], /* ETHIOPIC SYLLABLE XI */
+ ["\u1283", "\u1283"], /* ETHIOPIC SYLLABLE XAA */
+ ["\u1284", "\u1284"], /* ETHIOPIC SYLLABLE XEE */
+ ["\u1285", "\u1285"], /* ETHIOPIC SYLLABLE XE */
+ ["\u1286", "\u1286"], /* ETHIOPIC SYLLABLE XO */
+ ["\u1287", "\u1287"], /* ETHIOPIC SYLLABLE XOA */
+ ["\u1288", "\u1288"], /* ETHIOPIC SYLLABLE XWA */
+ ["\u1289", "\u1289"],
+ ["\u128A", "\u128A"], /* ETHIOPIC SYLLABLE XWI */
+ ["\u128B", "\u128B"], /* ETHIOPIC SYLLABLE XWAA */
+ ["\u128C", "\u128C"], /* ETHIOPIC SYLLABLE XWEE */
+ ["\u128D", "\u128D"], /* ETHIOPIC SYLLABLE XWE */
+ ["\u128E", "\u128E"],
+ ["\u128F", "\u128F"],
+ ["\u1290", "\u1290"], /* ETHIOPIC SYLLABLE NA */
+ ["\u1291", "\u1291"], /* ETHIOPIC SYLLABLE NU */
+ ["\u1292", "\u1292"], /* ETHIOPIC SYLLABLE NI */
+ ["\u1293", "\u1293"], /* ETHIOPIC SYLLABLE NAA */
+ ["\u1294", "\u1294"], /* ETHIOPIC SYLLABLE NEE */
+ ["\u1295", "\u1295"], /* ETHIOPIC SYLLABLE NE */
+ ["\u1296", "\u1296"], /* ETHIOPIC SYLLABLE NO */
+ ["\u1297", "\u1297"], /* ETHIOPIC SYLLABLE NWA */
+ ["\u1298", "\u1298"], /* ETHIOPIC SYLLABLE NYA */
+ ["\u1299", "\u1299"], /* ETHIOPIC SYLLABLE NYU */
+ ["\u129A", "\u129A"], /* ETHIOPIC SYLLABLE NYI */
+ ["\u129B", "\u129B"], /* ETHIOPIC SYLLABLE NYAA */
+ ["\u129C", "\u129C"], /* ETHIOPIC SYLLABLE NYEE */
+ ["\u129D", "\u129D"], /* ETHIOPIC SYLLABLE NYE */
+ ["\u129E", "\u129E"], /* ETHIOPIC SYLLABLE NYO */
+ ["\u129F", "\u129F"], /* ETHIOPIC SYLLABLE NYWA */
+ ["\u12A0", "\u12A0"], /* ETHIOPIC SYLLABLE GLOTTAL A */
+ ["\u12A1", "\u12A1"], /* ETHIOPIC SYLLABLE GLOTTAL U */
+ ["\u12A2", "\u12A2"], /* ETHIOPIC SYLLABLE GLOTTAL I */
+ ["\u12A3", "\u12A3"], /* ETHIOPIC SYLLABLE GLOTTAL AA */
+ ["\u12A4", "\u12A4"], /* ETHIOPIC SYLLABLE GLOTTAL EE */
+ ["\u12A5", "\u12A5"], /* ETHIOPIC SYLLABLE GLOTTAL E */
+ ["\u12A6", "\u12A6"], /* ETHIOPIC SYLLABLE GLOTTAL O */
+ ["\u12A7", "\u12A7"], /* ETHIOPIC SYLLABLE GLOTTAL WA */
+ ["\u12A8", "\u12A8"], /* ETHIOPIC SYLLABLE KA */
+ ["\u12A9", "\u12A9"], /* ETHIOPIC SYLLABLE KU */
+ ["\u12AA", "\u12AA"], /* ETHIOPIC SYLLABLE KI */
+ ["\u12AB", "\u12AB"], /* ETHIOPIC SYLLABLE KAA */
+ ["\u12AC", "\u12AC"], /* ETHIOPIC SYLLABLE KEE */
+ ["\u12AD", "\u12AD"], /* ETHIOPIC SYLLABLE KE */
+ ["\u12AE", "\u12AE"], /* ETHIOPIC SYLLABLE KO */
+ ["\u12AF", "\u12AF"], /* ETHIOPIC SYLLABLE KOA */
+ ["\u12B0", "\u12B0"], /* ETHIOPIC SYLLABLE KWA */
+ ["\u12B1", "\u12B1"],
+ ["\u12B2", "\u12B2"], /* ETHIOPIC SYLLABLE KWI */
+ ["\u12B3", "\u12B3"], /* ETHIOPIC SYLLABLE KWAA */
+ ["\u12B4", "\u12B4"], /* ETHIOPIC SYLLABLE KWEE */
+ ["\u12B5", "\u12B5"], /* ETHIOPIC SYLLABLE KWE */
+ ["\u12B6", "\u12B6"],
+ ["\u12B7", "\u12B7"],
+ ["\u12B8", "\u12B8"], /* ETHIOPIC SYLLABLE KXA */
+ ["\u12B9", "\u12B9"], /* ETHIOPIC SYLLABLE KXU */
+ ["\u12BA", "\u12BA"], /* ETHIOPIC SYLLABLE KXI */
+ ["\u12BB", "\u12BB"], /* ETHIOPIC SYLLABLE KXAA */
+ ["\u12BC", "\u12BC"], /* ETHIOPIC SYLLABLE KXEE */
+ ["\u12BD", "\u12BD"], /* ETHIOPIC SYLLABLE KXE */
+ ["\u12BE", "\u12BE"], /* ETHIOPIC SYLLABLE KXO */
+ ["\u12BF", "\u12BF"],
+ ["\u12C0", "\u12C0"], /* ETHIOPIC SYLLABLE KXWA */
+ ["\u12C1", "\u12C1"],
+ ["\u12C2", "\u12C2"], /* ETHIOPIC SYLLABLE KXWI */
+ ["\u12C3", "\u12C3"], /* ETHIOPIC SYLLABLE KXWAA */
+ ["\u12C4", "\u12C4"], /* ETHIOPIC SYLLABLE KXWEE */
+ ["\u12C5", "\u12C5"], /* ETHIOPIC SYLLABLE KXWE */
+ ["\u12C6", "\u12C6"],
+ ["\u12C7", "\u12C7"],
+ ["\u12C8", "\u12C8"], /* ETHIOPIC SYLLABLE WA */
+ ["\u12C9", "\u12C9"], /* ETHIOPIC SYLLABLE WU */
+ ["\u12CA", "\u12CA"], /* ETHIOPIC SYLLABLE WI */
+ ["\u12CB", "\u12CB"], /* ETHIOPIC SYLLABLE WAA */
+ ["\u12CC", "\u12CC"], /* ETHIOPIC SYLLABLE WEE */
+ ["\u12CD", "\u12CD"], /* ETHIOPIC SYLLABLE WE */
+ ["\u12CE", "\u12CE"], /* ETHIOPIC SYLLABLE WO */
+ ["\u12CF", "\u12CF"], /* ETHIOPIC SYLLABLE WOA */
+ ["\u12D0", "\u12D0"], /* ETHIOPIC SYLLABLE PHARYNGEAL A */
+ ["\u12D1", "\u12D1"], /* ETHIOPIC SYLLABLE PHARYNGEAL U */
+ ["\u12D2", "\u12D2"], /* ETHIOPIC SYLLABLE PHARYNGEAL I */
+ ["\u12D3", "\u12D3"], /* ETHIOPIC SYLLABLE PHARYNGEAL AA */
+ ["\u12D4", "\u12D4"], /* ETHIOPIC SYLLABLE PHARYNGEAL EE */
+ ["\u12D5", "\u12D5"], /* ETHIOPIC SYLLABLE PHARYNGEAL E */
+ ["\u12D6", "\u12D6"], /* ETHIOPIC SYLLABLE PHARYNGEAL O */
+ ["\u12D7", "\u12D7"],
+ ["\u12D8", "\u12D8"], /* ETHIOPIC SYLLABLE ZA */
+ ["\u12D9", "\u12D9"], /* ETHIOPIC SYLLABLE ZU */
+ ["\u12DA", "\u12DA"], /* ETHIOPIC SYLLABLE ZI */
+ ["\u12DB", "\u12DB"], /* ETHIOPIC SYLLABLE ZAA */
+ ["\u12DC", "\u12DC"], /* ETHIOPIC SYLLABLE ZEE */
+ ["\u12DD", "\u12DD"], /* ETHIOPIC SYLLABLE ZE */
+ ["\u12DE", "\u12DE"], /* ETHIOPIC SYLLABLE ZO */
+ ["\u12DF", "\u12DF"], /* ETHIOPIC SYLLABLE ZWA */
+ ["\u12E0", "\u12E0"], /* ETHIOPIC SYLLABLE ZHA */
+ ["\u12E1", "\u12E1"], /* ETHIOPIC SYLLABLE ZHU */
+ ["\u12E2", "\u12E2"], /* ETHIOPIC SYLLABLE ZHI */
+ ["\u12E3", "\u12E3"], /* ETHIOPIC SYLLABLE ZHAA */
+ ["\u12E4", "\u12E4"], /* ETHIOPIC SYLLABLE ZHEE */
+ ["\u12E5", "\u12E5"], /* ETHIOPIC SYLLABLE ZHE */
+ ["\u12E6", "\u12E6"], /* ETHIOPIC SYLLABLE ZHO */
+ ["\u12E7", "\u12E7"], /* ETHIOPIC SYLLABLE ZHWA */
+ ["\u12E8", "\u12E8"], /* ETHIOPIC SYLLABLE YA */
+ ["\u12E9", "\u12E9"], /* ETHIOPIC SYLLABLE YU */
+ ["\u12EA", "\u12EA"], /* ETHIOPIC SYLLABLE YI */
+ ["\u12EB", "\u12EB"], /* ETHIOPIC SYLLABLE YAA */
+ ["\u12EC", "\u12EC"], /* ETHIOPIC SYLLABLE YEE */
+ ["\u12ED", "\u12ED"], /* ETHIOPIC SYLLABLE YE */
+ ["\u12EE", "\u12EE"], /* ETHIOPIC SYLLABLE YO */
+ ["\u12EF", "\u12EF"], /* ETHIOPIC SYLLABLE YOA */
+ ["\u12F0", "\u12F0"], /* ETHIOPIC SYLLABLE DA */
+ ["\u12F1", "\u12F1"], /* ETHIOPIC SYLLABLE DU */
+ ["\u12F2", "\u12F2"], /* ETHIOPIC SYLLABLE DI */
+ ["\u12F3", "\u12F3"], /* ETHIOPIC SYLLABLE DAA */
+ ["\u12F4", "\u12F4"], /* ETHIOPIC SYLLABLE DEE */
+ ["\u12F5", "\u12F5"], /* ETHIOPIC SYLLABLE DE */
+ ["\u12F6", "\u12F6"], /* ETHIOPIC SYLLABLE DO */
+ ["\u12F7", "\u12F7"], /* ETHIOPIC SYLLABLE DWA */
+ ["\u12F8", "\u12F8"], /* ETHIOPIC SYLLABLE DDA */
+ ["\u12F9", "\u12F9"], /* ETHIOPIC SYLLABLE DDU */
+ ["\u12FA", "\u12FA"], /* ETHIOPIC SYLLABLE DDI */
+ ["\u12FB", "\u12FB"], /* ETHIOPIC SYLLABLE DDAA */
+ ["\u12FC", "\u12FC"], /* ETHIOPIC SYLLABLE DDEE */
+ ["\u12FD", "\u12FD"], /* ETHIOPIC SYLLABLE DDE */
+ ["\u12FE", "\u12FE"], /* ETHIOPIC SYLLABLE DDO */
+ ["\u12FF", "\u12FF"], /* ETHIOPIC SYLLABLE DDWA */
+ ["\u1300", "\u1300"], /* ETHIOPIC SYLLABLE JA */
+ ["\u1301", "\u1301"], /* ETHIOPIC SYLLABLE JU */
+ ["\u1302", "\u1302"], /* ETHIOPIC SYLLABLE JI */
+ ["\u1303", "\u1303"], /* ETHIOPIC SYLLABLE JAA */
+ ["\u1304", "\u1304"], /* ETHIOPIC SYLLABLE JEE */
+ ["\u1305", "\u1305"], /* ETHIOPIC SYLLABLE JE */
+ ["\u1306", "\u1306"], /* ETHIOPIC SYLLABLE JO */
+ ["\u1307", "\u1307"], /* ETHIOPIC SYLLABLE JWA */
+ ["\u1308", "\u1308"], /* ETHIOPIC SYLLABLE GA */
+ ["\u1309", "\u1309"], /* ETHIOPIC SYLLABLE GU */
+ ["\u130A", "\u130A"], /* ETHIOPIC SYLLABLE GI */
+ ["\u130B", "\u130B"], /* ETHIOPIC SYLLABLE GAA */
+ ["\u130C", "\u130C"], /* ETHIOPIC SYLLABLE GEE */
+ ["\u130D", "\u130D"], /* ETHIOPIC SYLLABLE GE */
+ ["\u130E", "\u130E"], /* ETHIOPIC SYLLABLE GO */
+ ["\u130F", "\u130F"], /* ETHIOPIC SYLLABLE GOA */
+ ["\u1310", "\u1310"], /* ETHIOPIC SYLLABLE GWA */
+ ["\u1311", "\u1311"],
+ ["\u1312", "\u1312"], /* ETHIOPIC SYLLABLE GWI */
+ ["\u1313", "\u1313"], /* ETHIOPIC SYLLABLE GWAA */
+ ["\u1314", "\u1314"], /* ETHIOPIC SYLLABLE GWEE */
+ ["\u1315", "\u1315"], /* ETHIOPIC SYLLABLE GWE */
+ ["\u1316", "\u1316"],
+ ["\u1317", "\u1317"],
+ ["\u1318", "\u1318"], /* ETHIOPIC SYLLABLE GGA */
+ ["\u1319", "\u1319"], /* ETHIOPIC SYLLABLE GGU */
+ ["\u131A", "\u131A"], /* ETHIOPIC SYLLABLE GGI */
+ ["\u131B", "\u131B"], /* ETHIOPIC SYLLABLE GGAA */
+ ["\u131C", "\u131C"], /* ETHIOPIC SYLLABLE GGEE */
+ ["\u131D", "\u131D"], /* ETHIOPIC SYLLABLE GGE */
+ ["\u131E", "\u131E"], /* ETHIOPIC SYLLABLE GGO */
+ ["\u131F", "\u131F"], /* ETHIOPIC SYLLABLE GGWAA */
+ ["\u1320", "\u1320"], /* ETHIOPIC SYLLABLE THA */
+ ["\u1321", "\u1321"], /* ETHIOPIC SYLLABLE THU */
+ ["\u1322", "\u1322"], /* ETHIOPIC SYLLABLE THI */
+ ["\u1323", "\u1323"], /* ETHIOPIC SYLLABLE THAA */
+ ["\u1324", "\u1324"], /* ETHIOPIC SYLLABLE THEE */
+ ["\u1325", "\u1325"], /* ETHIOPIC SYLLABLE THE */
+ ["\u1326", "\u1326"], /* ETHIOPIC SYLLABLE THO */
+ ["\u1327", "\u1327"], /* ETHIOPIC SYLLABLE THWA */
+ ["\u1328", "\u1328"], /* ETHIOPIC SYLLABLE CHA */
+ ["\u1329", "\u1329"], /* ETHIOPIC SYLLABLE CHU */
+ ["\u132A", "\u132A"], /* ETHIOPIC SYLLABLE CHI */
+ ["\u132B", "\u132B"], /* ETHIOPIC SYLLABLE CHAA */
+ ["\u132C", "\u132C"], /* ETHIOPIC SYLLABLE CHEE */
+ ["\u132D", "\u132D"], /* ETHIOPIC SYLLABLE CHE */
+ ["\u132E", "\u132E"], /* ETHIOPIC SYLLABLE CHO */
+ ["\u132F", "\u132F"], /* ETHIOPIC SYLLABLE CHWA */
+ ["\u1330", "\u1330"], /* ETHIOPIC SYLLABLE PHA */
+ ["\u1331", "\u1331"], /* ETHIOPIC SYLLABLE PHU */
+ ["\u1332", "\u1332"], /* ETHIOPIC SYLLABLE PHI */
+ ["\u1333", "\u1333"], /* ETHIOPIC SYLLABLE PHAA */
+ ["\u1334", "\u1334"], /* ETHIOPIC SYLLABLE PHEE */
+ ["\u1335", "\u1335"], /* ETHIOPIC SYLLABLE PHE */
+ ["\u1336", "\u1336"], /* ETHIOPIC SYLLABLE PHO */
+ ["\u1337", "\u1337"], /* ETHIOPIC SYLLABLE PHWA */
+ ["\u1338", "\u1338"], /* ETHIOPIC SYLLABLE TSA */
+ ["\u1339", "\u1339"], /* ETHIOPIC SYLLABLE TSU */
+ ["\u133A", "\u133A"], /* ETHIOPIC SYLLABLE TSI */
+ ["\u133B", "\u133B"], /* ETHIOPIC SYLLABLE TSAA */
+ ["\u133C", "\u133C"], /* ETHIOPIC SYLLABLE TSEE */
+ ["\u133D", "\u133D"], /* ETHIOPIC SYLLABLE TSE */
+ ["\u133E", "\u133E"], /* ETHIOPIC SYLLABLE TSO */
+ ["\u133F", "\u133F"], /* ETHIOPIC SYLLABLE TSWA */
+ ["\u1340", "\u1340"], /* ETHIOPIC SYLLABLE TZA */
+ ["\u1341", "\u1341"], /* ETHIOPIC SYLLABLE TZU */
+ ["\u1342", "\u1342"], /* ETHIOPIC SYLLABLE TZI */
+ ["\u1343", "\u1343"], /* ETHIOPIC SYLLABLE TZAA */
+ ["\u1344", "\u1344"], /* ETHIOPIC SYLLABLE TZEE */
+ ["\u1345", "\u1345"], /* ETHIOPIC SYLLABLE TZE */
+ ["\u1346", "\u1346"], /* ETHIOPIC SYLLABLE TZO */
+ ["\u1347", "\u1347"], /* ETHIOPIC SYLLABLE TZOA */
+ ["\u1348", "\u1348"], /* ETHIOPIC SYLLABLE FA */
+ ["\u1349", "\u1349"], /* ETHIOPIC SYLLABLE FU */
+ ["\u134A", "\u134A"], /* ETHIOPIC SYLLABLE FI */
+ ["\u134B", "\u134B"], /* ETHIOPIC SYLLABLE FAA */
+ ["\u134C", "\u134C"], /* ETHIOPIC SYLLABLE FEE */
+ ["\u134D", "\u134D"], /* ETHIOPIC SYLLABLE FE */
+ ["\u134E", "\u134E"], /* ETHIOPIC SYLLABLE FO */
+ ["\u134F", "\u134F"], /* ETHIOPIC SYLLABLE FWA */
+ ["\u1350", "\u1350"], /* ETHIOPIC SYLLABLE PA */
+ ["\u1351", "\u1351"], /* ETHIOPIC SYLLABLE PU */
+ ["\u1352", "\u1352"], /* ETHIOPIC SYLLABLE PI */
+ ["\u1353", "\u1353"], /* ETHIOPIC SYLLABLE PAA */
+ ["\u1354", "\u1354"], /* ETHIOPIC SYLLABLE PEE */
+ ["\u1355", "\u1355"], /* ETHIOPIC SYLLABLE PE */
+ ["\u1356", "\u1356"], /* ETHIOPIC SYLLABLE PO */
+ ["\u1357", "\u1357"], /* ETHIOPIC SYLLABLE PWA */
+ ["\u1358", "\u1358"], /* ETHIOPIC SYLLABLE RYA */
+ ["\u1359", "\u1359"], /* ETHIOPIC SYLLABLE MYA */
+ ["\u135A", "\u135A"], /* ETHIOPIC SYLLABLE FYA */
+ ["\u135B", "\u135B"],
+ ["\u135C", "\u135C"],
+ ["\u135D", "\u135D"], /* ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK */
+ ["\u135E", "\u135E"], /* ETHIOPIC COMBINING VOWEL LENGTH MARK */
+ ["\u135F", "\u135F"], /* ETHIOPIC COMBINING GEMINATION MARK */
+ ["\u1360", "\u1360"], /* ETHIOPIC SECTION MARK */
+ ["\u1361", "\u1361"], /* ETHIOPIC WORDSPACE */
+ ["\u1362", "\u1362"], /* ETHIOPIC FULL STOP */
+ ["\u1363", "\u1363"], /* ETHIOPIC COMMA */
+ ["\u1364", "\u1364"], /* ETHIOPIC SEMICOLON */
+ ["\u1365", "\u1365"], /* ETHIOPIC COLON */
+ ["\u1366", "\u1366"], /* ETHIOPIC PREFACE COLON */
+ ["\u1367", "\u1367"], /* ETHIOPIC QUESTION MARK */
+ ["\u1368", "\u1368"], /* ETHIOPIC PARAGRAPH SEPARATOR */
+ ["\u1369", "\u1369"], /* ETHIOPIC DIGIT ONE */
+ ["\u136A", "\u136A"], /* ETHIOPIC DIGIT TWO */
+ ["\u136B", "\u136B"], /* ETHIOPIC DIGIT THREE */
+ ["\u136C", "\u136C"], /* ETHIOPIC DIGIT FOUR */
+ ["\u136D", "\u136D"], /* ETHIOPIC DIGIT FIVE */
+ ["\u136E", "\u136E"], /* ETHIOPIC DIGIT SIX */
+ ["\u136F", "\u136F"], /* ETHIOPIC DIGIT SEVEN */
+ ["\u1370", "\u1370"], /* ETHIOPIC DIGIT EIGHT */
+ ["\u1371", "\u1371"], /* ETHIOPIC DIGIT NINE */
+ ["\u1372", "\u1372"], /* ETHIOPIC NUMBER TEN */
+ ["\u1373", "\u1373"], /* ETHIOPIC NUMBER TWENTY */
+ ["\u1374", "\u1374"], /* ETHIOPIC NUMBER THIRTY */
+ ["\u1375", "\u1375"], /* ETHIOPIC NUMBER FORTY */
+ ["\u1376", "\u1376"], /* ETHIOPIC NUMBER FIFTY */
+ ["\u1377", "\u1377"], /* ETHIOPIC NUMBER SIXTY */
+ ["\u1378", "\u1378"], /* ETHIOPIC NUMBER SEVENTY */
+ ["\u1379", "\u1379"], /* ETHIOPIC NUMBER EIGHTY */
+ ["\u137A", "\u137A"], /* ETHIOPIC NUMBER NINETY */
+ ["\u137B", "\u137B"], /* ETHIOPIC NUMBER HUNDRED */
+ ["\u137C", "\u137C"], /* ETHIOPIC NUMBER TEN THOUSAND */
+ ["\u137D", "\u137D"],
+ ["\u137E", "\u137E"],
+ ["\u137F", "\u137F"],
+ ["\u1380", "\u1380"], /* ETHIOPIC SYLLABLE SEBATBEIT MWA */
+ ["\u1381", "\u1381"], /* ETHIOPIC SYLLABLE MWI */
+ ["\u1382", "\u1382"], /* ETHIOPIC SYLLABLE MWEE */
+ ["\u1383", "\u1383"], /* ETHIOPIC SYLLABLE MWE */
+ ["\u1384", "\u1384"], /* ETHIOPIC SYLLABLE SEBATBEIT BWA */
+ ["\u1385", "\u1385"], /* ETHIOPIC SYLLABLE BWI */
+ ["\u1386", "\u1386"], /* ETHIOPIC SYLLABLE BWEE */
+ ["\u1387", "\u1387"], /* ETHIOPIC SYLLABLE BWE */
+ ["\u1388", "\u1388"], /* ETHIOPIC SYLLABLE SEBATBEIT FWA */
+ ["\u1389", "\u1389"], /* ETHIOPIC SYLLABLE FWI */
+ ["\u138A", "\u138A"], /* ETHIOPIC SYLLABLE FWEE */
+ ["\u138B", "\u138B"], /* ETHIOPIC SYLLABLE FWE */
+ ["\u138C", "\u138C"], /* ETHIOPIC SYLLABLE SEBATBEIT PWA */
+ ["\u138D", "\u138D"], /* ETHIOPIC SYLLABLE PWI */
+ ["\u138E", "\u138E"], /* ETHIOPIC SYLLABLE PWEE */
+ ["\u138F", "\u138F"], /* ETHIOPIC SYLLABLE PWE */
+ ["\u1390", "\u1390"], /* ETHIOPIC TONAL MARK YIZET */
+ ["\u1391", "\u1391"], /* ETHIOPIC TONAL MARK DERET */
+ ["\u1392", "\u1392"], /* ETHIOPIC TONAL MARK RIKRIK */
+ ["\u1393", "\u1393"], /* ETHIOPIC TONAL MARK SHORT RIKRIK */
+ ["\u1394", "\u1394"], /* ETHIOPIC TONAL MARK DIFAT */
+ ["\u1395", "\u1395"], /* ETHIOPIC TONAL MARK KENAT */
+ ["\u1396", "\u1396"], /* ETHIOPIC TONAL MARK CHIRET */
+ ["\u1397", "\u1397"], /* ETHIOPIC TONAL MARK HIDET */
+ ["\u1398", "\u1398"], /* ETHIOPIC TONAL MARK DERET-HIDET */
+ ["\u1399", "\u1399"], /* ETHIOPIC TONAL MARK KURT */
+ ["\u139A", "\u139A"],
+ ["\u139B", "\u139B"],
+ ["\u139C", "\u139C"],
+ ["\u139D", "\u139D"],
+ ["\u139E", "\u139E"],
+ ["\u139F", "\u139F"],
+ ["\u13A0", "\uAB70"], /* CHEROKEE LETTER A */
+ ["\u13A1", "\uAB71"], /* CHEROKEE LETTER E */
+ ["\u13A2", "\uAB72"], /* CHEROKEE LETTER I */
+ ["\u13A3", "\uAB73"], /* CHEROKEE LETTER O */
+ ["\u13A4", "\uAB74"], /* CHEROKEE LETTER U */
+ ["\u13A5", "\uAB75"], /* CHEROKEE LETTER V */
+ ["\u13A6", "\uAB76"], /* CHEROKEE LETTER GA */
+ ["\u13A7", "\uAB77"], /* CHEROKEE LETTER KA */
+ ["\u13A8", "\uAB78"], /* CHEROKEE LETTER GE */
+ ["\u13A9", "\uAB79"], /* CHEROKEE LETTER GI */
+ ["\u13AA", "\uAB7A"], /* CHEROKEE LETTER GO */
+ ["\u13AB", "\uAB7B"], /* CHEROKEE LETTER GU */
+ ["\u13AC", "\uAB7C"], /* CHEROKEE LETTER GV */
+ ["\u13AD", "\uAB7D"], /* CHEROKEE LETTER HA */
+ ["\u13AE", "\uAB7E"], /* CHEROKEE LETTER HE */
+ ["\u13AF", "\uAB7F"], /* CHEROKEE LETTER HI */
+ ["\u13B0", "\uAB80"], /* CHEROKEE LETTER HO */
+ ["\u13B1", "\uAB81"], /* CHEROKEE LETTER HU */
+ ["\u13B2", "\uAB82"], /* CHEROKEE LETTER HV */
+ ["\u13B3", "\uAB83"], /* CHEROKEE LETTER LA */
+ ["\u13B4", "\uAB84"], /* CHEROKEE LETTER LE */
+ ["\u13B5", "\uAB85"], /* CHEROKEE LETTER LI */
+ ["\u13B6", "\uAB86"], /* CHEROKEE LETTER LO */
+ ["\u13B7", "\uAB87"], /* CHEROKEE LETTER LU */
+ ["\u13B8", "\uAB88"], /* CHEROKEE LETTER LV */
+ ["\u13B9", "\uAB89"], /* CHEROKEE LETTER MA */
+ ["\u13BA", "\uAB8A"], /* CHEROKEE LETTER ME */
+ ["\u13BB", "\uAB8B"], /* CHEROKEE LETTER MI */
+ ["\u13BC", "\uAB8C"], /* CHEROKEE LETTER MO */
+ ["\u13BD", "\uAB8D"], /* CHEROKEE LETTER MU */
+ ["\u13BE", "\uAB8E"], /* CHEROKEE LETTER NA */
+ ["\u13BF", "\uAB8F"], /* CHEROKEE LETTER HNA */
+ ["\u13C0", "\uAB90"], /* CHEROKEE LETTER NAH */
+ ["\u13C1", "\uAB91"], /* CHEROKEE LETTER NE */
+ ["\u13C2", "\uAB92"], /* CHEROKEE LETTER NI */
+ ["\u13C3", "\uAB93"], /* CHEROKEE LETTER NO */
+ ["\u13C4", "\uAB94"], /* CHEROKEE LETTER NU */
+ ["\u13C5", "\uAB95"], /* CHEROKEE LETTER NV */
+ ["\u13C6", "\uAB96"], /* CHEROKEE LETTER QUA */
+ ["\u13C7", "\uAB97"], /* CHEROKEE LETTER QUE */
+ ["\u13C8", "\uAB98"], /* CHEROKEE LETTER QUI */
+ ["\u13C9", "\uAB99"], /* CHEROKEE LETTER QUO */
+ ["\u13CA", "\uAB9A"], /* CHEROKEE LETTER QUU */
+ ["\u13CB", "\uAB9B"], /* CHEROKEE LETTER QUV */
+ ["\u13CC", "\uAB9C"], /* CHEROKEE LETTER SA */
+ ["\u13CD", "\uAB9D"], /* CHEROKEE LETTER S */
+ ["\u13CE", "\uAB9E"], /* CHEROKEE LETTER SE */
+ ["\u13CF", "\uAB9F"], /* CHEROKEE LETTER SI */
+ ["\u13D0", "\uABA0"], /* CHEROKEE LETTER SO */
+ ["\u13D1", "\uABA1"], /* CHEROKEE LETTER SU */
+ ["\u13D2", "\uABA2"], /* CHEROKEE LETTER SV */
+ ["\u13D3", "\uABA3"], /* CHEROKEE LETTER DA */
+ ["\u13D4", "\uABA4"], /* CHEROKEE LETTER TA */
+ ["\u13D5", "\uABA5"], /* CHEROKEE LETTER DE */
+ ["\u13D6", "\uABA6"], /* CHEROKEE LETTER TE */
+ ["\u13D7", "\uABA7"], /* CHEROKEE LETTER DI */
+ ["\u13D8", "\uABA8"], /* CHEROKEE LETTER TI */
+ ["\u13D9", "\uABA9"], /* CHEROKEE LETTER DO */
+ ["\u13DA", "\uABAA"], /* CHEROKEE LETTER DU */
+ ["\u13DB", "\uABAB"], /* CHEROKEE LETTER DV */
+ ["\u13DC", "\uABAC"], /* CHEROKEE LETTER DLA */
+ ["\u13DD", "\uABAD"], /* CHEROKEE LETTER TLA */
+ ["\u13DE", "\uABAE"], /* CHEROKEE LETTER TLE */
+ ["\u13DF", "\uABAF"], /* CHEROKEE LETTER TLI */
+ ["\u13E0", "\uABB0"], /* CHEROKEE LETTER TLO */
+ ["\u13E1", "\uABB1"], /* CHEROKEE LETTER TLU */
+ ["\u13E2", "\uABB2"], /* CHEROKEE LETTER TLV */
+ ["\u13E3", "\uABB3"], /* CHEROKEE LETTER TSA */
+ ["\u13E4", "\uABB4"], /* CHEROKEE LETTER TSE */
+ ["\u13E5", "\uABB5"], /* CHEROKEE LETTER TSI */
+ ["\u13E6", "\uABB6"], /* CHEROKEE LETTER TSO */
+ ["\u13E7", "\uABB7"], /* CHEROKEE LETTER TSU */
+ ["\u13E8", "\uABB8"], /* CHEROKEE LETTER TSV */
+ ["\u13E9", "\uABB9"], /* CHEROKEE LETTER WA */
+ ["\u13EA", "\uABBA"], /* CHEROKEE LETTER WE */
+ ["\u13EB", "\uABBB"], /* CHEROKEE LETTER WI */
+ ["\u13EC", "\uABBC"], /* CHEROKEE LETTER WO */
+ ["\u13ED", "\uABBD"], /* CHEROKEE LETTER WU */
+ ["\u13EE", "\uABBE"], /* CHEROKEE LETTER WV */
+ ["\u13EF", "\uABBF"], /* CHEROKEE LETTER YA */
+ ["\u13F0", "\u13F8"], /* CHEROKEE LETTER YE */
+ ["\u13F1", "\u13F9"], /* CHEROKEE LETTER YI */
+ ["\u13F2", "\u13FA"], /* CHEROKEE LETTER YO */
+ ["\u13F3", "\u13FB"], /* CHEROKEE LETTER YU */
+ ["\u13F4", "\u13FC"], /* CHEROKEE LETTER YV */
+ ["\u13F5", "\u13FD"], /* CHEROKEE LETTER MV */
+ ["\u13F6", "\u13F6"],
+ ["\u13F7", "\u13F7"],
+ ["\u13F0", "\u13F8"], /* CHEROKEE SMALL LETTER YE */
+ ["\u13F1", "\u13F9"], /* CHEROKEE SMALL LETTER YI */
+ ["\u13F2", "\u13FA"], /* CHEROKEE SMALL LETTER YO */
+ ["\u13F3", "\u13FB"], /* CHEROKEE SMALL LETTER YU */
+ ["\u13F4", "\u13FC"], /* CHEROKEE SMALL LETTER YV */
+ ["\u13F5", "\u13FD"], /* CHEROKEE SMALL LETTER MV */
+ ["\u13FE", "\u13FE"],
+ ["\u13FF", "\u13FF"],
+ ["\u1400", "\u1400"], /* CANADIAN SYLLABICS HYPHEN */
+ ["\u1401", "\u1401"], /* CANADIAN SYLLABICS E */
+ ["\u1402", "\u1402"], /* CANADIAN SYLLABICS AAI */
+ ["\u1403", "\u1403"], /* CANADIAN SYLLABICS I */
+ ["\u1404", "\u1404"], /* CANADIAN SYLLABICS II */
+ ["\u1405", "\u1405"], /* CANADIAN SYLLABICS O */
+ ["\u1406", "\u1406"], /* CANADIAN SYLLABICS OO */
+ ["\u1407", "\u1407"], /* CANADIAN SYLLABICS Y-CREE OO */
+ ["\u1408", "\u1408"], /* CANADIAN SYLLABICS CARRIER EE */
+ ["\u1409", "\u1409"], /* CANADIAN SYLLABICS CARRIER I */
+ ["\u140A", "\u140A"], /* CANADIAN SYLLABICS A */
+ ["\u140B", "\u140B"], /* CANADIAN SYLLABICS AA */
+ ["\u140C", "\u140C"], /* CANADIAN SYLLABICS WE */
+ ["\u140D", "\u140D"], /* CANADIAN SYLLABICS WEST-CREE WE */
+ ["\u140E", "\u140E"], /* CANADIAN SYLLABICS WI */
+ ["\u140F", "\u140F"], /* CANADIAN SYLLABICS WEST-CREE WI */
+ ["\u1410", "\u1410"], /* CANADIAN SYLLABICS WII */
+ ["\u1411", "\u1411"], /* CANADIAN SYLLABICS WEST-CREE WII */
+ ["\u1412", "\u1412"], /* CANADIAN SYLLABICS WO */
+ ["\u1413", "\u1413"], /* CANADIAN SYLLABICS WEST-CREE WO */
+ ["\u1414", "\u1414"], /* CANADIAN SYLLABICS WOO */
+ ["\u1415", "\u1415"], /* CANADIAN SYLLABICS WEST-CREE WOO */
+ ["\u1416", "\u1416"], /* CANADIAN SYLLABICS NASKAPI WOO */
+ ["\u1417", "\u1417"], /* CANADIAN SYLLABICS WA */
+ ["\u1418", "\u1418"], /* CANADIAN SYLLABICS WEST-CREE WA */
+ ["\u1419", "\u1419"], /* CANADIAN SYLLABICS WAA */
+ ["\u141A", "\u141A"], /* CANADIAN SYLLABICS WEST-CREE WAA */
+ ["\u141B", "\u141B"], /* CANADIAN SYLLABICS NASKAPI WAA */
+ ["\u141C", "\u141C"], /* CANADIAN SYLLABICS AI */
+ ["\u141D", "\u141D"], /* CANADIAN SYLLABICS Y-CREE W */
+ ["\u141E", "\u141E"], /* CANADIAN SYLLABICS GLOTTAL STOP */
+ ["\u141F", "\u141F"], /* CANADIAN SYLLABICS FINAL ACUTE */
+ ["\u1420", "\u1420"], /* CANADIAN SYLLABICS FINAL GRAVE */
+ ["\u1421", "\u1421"], /* CANADIAN SYLLABICS FINAL BOTTOM HALF RING */
+ ["\u1422", "\u1422"], /* CANADIAN SYLLABICS FINAL TOP HALF RING */
+ ["\u1423", "\u1423"], /* CANADIAN SYLLABICS FINAL RIGHT HALF RING */
+ ["\u1424", "\u1424"], /* CANADIAN SYLLABICS FINAL RING */
+ ["\u1425", "\u1425"], /* CANADIAN SYLLABICS FINAL DOUBLE ACUTE */
+ ["\u1426", "\u1426"], /* CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES */
+ ["\u1427", "\u1427"], /* CANADIAN SYLLABICS FINAL MIDDLE DOT */
+ ["\u1428", "\u1428"], /* CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE */
+ ["\u1429", "\u1429"], /* CANADIAN SYLLABICS FINAL PLUS */
+ ["\u142A", "\u142A"], /* CANADIAN SYLLABICS FINAL DOWN TACK */
+ ["\u142B", "\u142B"], /* CANADIAN SYLLABICS EN */
+ ["\u142C", "\u142C"], /* CANADIAN SYLLABICS IN */
+ ["\u142D", "\u142D"], /* CANADIAN SYLLABICS ON */
+ ["\u142E", "\u142E"], /* CANADIAN SYLLABICS AN */
+ ["\u142F", "\u142F"], /* CANADIAN SYLLABICS PE */
+ ["\u1430", "\u1430"], /* CANADIAN SYLLABICS PAAI */
+ ["\u1431", "\u1431"], /* CANADIAN SYLLABICS PI */
+ ["\u1432", "\u1432"], /* CANADIAN SYLLABICS PII */
+ ["\u1433", "\u1433"], /* CANADIAN SYLLABICS PO */
+ ["\u1434", "\u1434"], /* CANADIAN SYLLABICS POO */
+ ["\u1435", "\u1435"], /* CANADIAN SYLLABICS Y-CREE POO */
+ ["\u1436", "\u1436"], /* CANADIAN SYLLABICS CARRIER HEE */
+ ["\u1437", "\u1437"], /* CANADIAN SYLLABICS CARRIER HI */
+ ["\u1438", "\u1438"], /* CANADIAN SYLLABICS PA */
+ ["\u1439", "\u1439"], /* CANADIAN SYLLABICS PAA */
+ ["\u143A", "\u143A"], /* CANADIAN SYLLABICS PWE */
+ ["\u143B", "\u143B"], /* CANADIAN SYLLABICS WEST-CREE PWE */
+ ["\u143C", "\u143C"], /* CANADIAN SYLLABICS PWI */
+ ["\u143D", "\u143D"], /* CANADIAN SYLLABICS WEST-CREE PWI */
+ ["\u143E", "\u143E"], /* CANADIAN SYLLABICS PWII */
+ ["\u143F", "\u143F"], /* CANADIAN SYLLABICS WEST-CREE PWII */
+ ["\u1440", "\u1440"], /* CANADIAN SYLLABICS PWO */
+ ["\u1441", "\u1441"], /* CANADIAN SYLLABICS WEST-CREE PWO */
+ ["\u1442", "\u1442"], /* CANADIAN SYLLABICS PWOO */
+ ["\u1443", "\u1443"], /* CANADIAN SYLLABICS WEST-CREE PWOO */
+ ["\u1444", "\u1444"], /* CANADIAN SYLLABICS PWA */
+ ["\u1445", "\u1445"], /* CANADIAN SYLLABICS WEST-CREE PWA */
+ ["\u1446", "\u1446"], /* CANADIAN SYLLABICS PWAA */
+ ["\u1447", "\u1447"], /* CANADIAN SYLLABICS WEST-CREE PWAA */
+ ["\u1448", "\u1448"], /* CANADIAN SYLLABICS Y-CREE PWAA */
+ ["\u1449", "\u1449"], /* CANADIAN SYLLABICS P */
+ ["\u144A", "\u144A"], /* CANADIAN SYLLABICS WEST-CREE P */
+ ["\u144B", "\u144B"], /* CANADIAN SYLLABICS CARRIER H */
+ ["\u144C", "\u144C"], /* CANADIAN SYLLABICS TE */
+ ["\u144D", "\u144D"], /* CANADIAN SYLLABICS TAAI */
+ ["\u144E", "\u144E"], /* CANADIAN SYLLABICS TI */
+ ["\u144F", "\u144F"], /* CANADIAN SYLLABICS TII */
+ ["\u1450", "\u1450"], /* CANADIAN SYLLABICS TO */
+ ["\u1451", "\u1451"], /* CANADIAN SYLLABICS TOO */
+ ["\u1452", "\u1452"], /* CANADIAN SYLLABICS Y-CREE TOO */
+ ["\u1453", "\u1453"], /* CANADIAN SYLLABICS CARRIER DEE */
+ ["\u1454", "\u1454"], /* CANADIAN SYLLABICS CARRIER DI */
+ ["\u1455", "\u1455"], /* CANADIAN SYLLABICS TA */
+ ["\u1456", "\u1456"], /* CANADIAN SYLLABICS TAA */
+ ["\u1457", "\u1457"], /* CANADIAN SYLLABICS TWE */
+ ["\u1458", "\u1458"], /* CANADIAN SYLLABICS WEST-CREE TWE */
+ ["\u1459", "\u1459"], /* CANADIAN SYLLABICS TWI */
+ ["\u145A", "\u145A"], /* CANADIAN SYLLABICS WEST-CREE TWI */
+ ["\u145B", "\u145B"], /* CANADIAN SYLLABICS TWII */
+ ["\u145C", "\u145C"], /* CANADIAN SYLLABICS WEST-CREE TWII */
+ ["\u145D", "\u145D"], /* CANADIAN SYLLABICS TWO */
+ ["\u145E", "\u145E"], /* CANADIAN SYLLABICS WEST-CREE TWO */
+ ["\u145F", "\u145F"], /* CANADIAN SYLLABICS TWOO */
+ ["\u1460", "\u1460"], /* CANADIAN SYLLABICS WEST-CREE TWOO */
+ ["\u1461", "\u1461"], /* CANADIAN SYLLABICS TWA */
+ ["\u1462", "\u1462"], /* CANADIAN SYLLABICS WEST-CREE TWA */
+ ["\u1463", "\u1463"], /* CANADIAN SYLLABICS TWAA */
+ ["\u1464", "\u1464"], /* CANADIAN SYLLABICS WEST-CREE TWAA */
+ ["\u1465", "\u1465"], /* CANADIAN SYLLABICS NASKAPI TWAA */
+ ["\u1466", "\u1466"], /* CANADIAN SYLLABICS T */
+ ["\u1467", "\u1467"], /* CANADIAN SYLLABICS TTE */
+ ["\u1468", "\u1468"], /* CANADIAN SYLLABICS TTI */
+ ["\u1469", "\u1469"], /* CANADIAN SYLLABICS TTO */
+ ["\u146A", "\u146A"], /* CANADIAN SYLLABICS TTA */
+ ["\u146B", "\u146B"], /* CANADIAN SYLLABICS KE */
+ ["\u146C", "\u146C"], /* CANADIAN SYLLABICS KAAI */
+ ["\u146D", "\u146D"], /* CANADIAN SYLLABICS KI */
+ ["\u146E", "\u146E"], /* CANADIAN SYLLABICS KII */
+ ["\u146F", "\u146F"], /* CANADIAN SYLLABICS KO */
+ ["\u1470", "\u1470"], /* CANADIAN SYLLABICS KOO */
+ ["\u1471", "\u1471"], /* CANADIAN SYLLABICS Y-CREE KOO */
+ ["\u1472", "\u1472"], /* CANADIAN SYLLABICS KA */
+ ["\u1473", "\u1473"], /* CANADIAN SYLLABICS KAA */
+ ["\u1474", "\u1474"], /* CANADIAN SYLLABICS KWE */
+ ["\u1475", "\u1475"], /* CANADIAN SYLLABICS WEST-CREE KWE */
+ ["\u1476", "\u1476"], /* CANADIAN SYLLABICS KWI */
+ ["\u1477", "\u1477"], /* CANADIAN SYLLABICS WEST-CREE KWI */
+ ["\u1478", "\u1478"], /* CANADIAN SYLLABICS KWII */
+ ["\u1479", "\u1479"], /* CANADIAN SYLLABICS WEST-CREE KWII */
+ ["\u147A", "\u147A"], /* CANADIAN SYLLABICS KWO */
+ ["\u147B", "\u147B"], /* CANADIAN SYLLABICS WEST-CREE KWO */
+ ["\u147C", "\u147C"], /* CANADIAN SYLLABICS KWOO */
+ ["\u147D", "\u147D"], /* CANADIAN SYLLABICS WEST-CREE KWOO */
+ ["\u147E", "\u147E"], /* CANADIAN SYLLABICS KWA */
+ ["\u147F", "\u147F"], /* CANADIAN SYLLABICS WEST-CREE KWA */
+ ["\u1480", "\u1480"], /* CANADIAN SYLLABICS KWAA */
+ ["\u1481", "\u1481"], /* CANADIAN SYLLABICS WEST-CREE KWAA */
+ ["\u1482", "\u1482"], /* CANADIAN SYLLABICS NASKAPI KWAA */
+ ["\u1483", "\u1483"], /* CANADIAN SYLLABICS K */
+ ["\u1484", "\u1484"], /* CANADIAN SYLLABICS KW */
+ ["\u1485", "\u1485"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KEH */
+ ["\u1486", "\u1486"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KIH */
+ ["\u1487", "\u1487"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KOH */
+ ["\u1488", "\u1488"], /* CANADIAN SYLLABICS SOUTH-SLAVEY KAH */
+ ["\u1489", "\u1489"], /* CANADIAN SYLLABICS CE */
+ ["\u148A", "\u148A"], /* CANADIAN SYLLABICS CAAI */
+ ["\u148B", "\u148B"], /* CANADIAN SYLLABICS CI */
+ ["\u148C", "\u148C"], /* CANADIAN SYLLABICS CII */
+ ["\u148D", "\u148D"], /* CANADIAN SYLLABICS CO */
+ ["\u148E", "\u148E"], /* CANADIAN SYLLABICS COO */
+ ["\u148F", "\u148F"], /* CANADIAN SYLLABICS Y-CREE COO */
+ ["\u1490", "\u1490"], /* CANADIAN SYLLABICS CA */
+ ["\u1491", "\u1491"], /* CANADIAN SYLLABICS CAA */
+ ["\u1492", "\u1492"], /* CANADIAN SYLLABICS CWE */
+ ["\u1493", "\u1493"], /* CANADIAN SYLLABICS WEST-CREE CWE */
+ ["\u1494", "\u1494"], /* CANADIAN SYLLABICS CWI */
+ ["\u1495", "\u1495"], /* CANADIAN SYLLABICS WEST-CREE CWI */
+ ["\u1496", "\u1496"], /* CANADIAN SYLLABICS CWII */
+ ["\u1497", "\u1497"], /* CANADIAN SYLLABICS WEST-CREE CWII */
+ ["\u1498", "\u1498"], /* CANADIAN SYLLABICS CWO */
+ ["\u1499", "\u1499"], /* CANADIAN SYLLABICS WEST-CREE CWO */
+ ["\u149A", "\u149A"], /* CANADIAN SYLLABICS CWOO */
+ ["\u149B", "\u149B"], /* CANADIAN SYLLABICS WEST-CREE CWOO */
+ ["\u149C", "\u149C"], /* CANADIAN SYLLABICS CWA */
+ ["\u149D", "\u149D"], /* CANADIAN SYLLABICS WEST-CREE CWA */
+ ["\u149E", "\u149E"], /* CANADIAN SYLLABICS CWAA */
+ ["\u149F", "\u149F"], /* CANADIAN SYLLABICS WEST-CREE CWAA */
+ ["\u14A0", "\u14A0"], /* CANADIAN SYLLABICS NASKAPI CWAA */
+ ["\u14A1", "\u14A1"], /* CANADIAN SYLLABICS C */
+ ["\u14A2", "\u14A2"], /* CANADIAN SYLLABICS SAYISI TH */
+ ["\u14A3", "\u14A3"], /* CANADIAN SYLLABICS ME */
+ ["\u14A4", "\u14A4"], /* CANADIAN SYLLABICS MAAI */
+ ["\u14A5", "\u14A5"], /* CANADIAN SYLLABICS MI */
+ ["\u14A6", "\u14A6"], /* CANADIAN SYLLABICS MII */
+ ["\u14A7", "\u14A7"], /* CANADIAN SYLLABICS MO */
+ ["\u14A8", "\u14A8"], /* CANADIAN SYLLABICS MOO */
+ ["\u14A9", "\u14A9"], /* CANADIAN SYLLABICS Y-CREE MOO */
+ ["\u14AA", "\u14AA"], /* CANADIAN SYLLABICS MA */
+ ["\u14AB", "\u14AB"], /* CANADIAN SYLLABICS MAA */
+ ["\u14AC", "\u14AC"], /* CANADIAN SYLLABICS MWE */
+ ["\u14AD", "\u14AD"], /* CANADIAN SYLLABICS WEST-CREE MWE */
+ ["\u14AE", "\u14AE"], /* CANADIAN SYLLABICS MWI */
+ ["\u14AF", "\u14AF"], /* CANADIAN SYLLABICS WEST-CREE MWI */
+ ["\u14B0", "\u14B0"], /* CANADIAN SYLLABICS MWII */
+ ["\u14B1", "\u14B1"], /* CANADIAN SYLLABICS WEST-CREE MWII */
+ ["\u14B2", "\u14B2"], /* CANADIAN SYLLABICS MWO */
+ ["\u14B3", "\u14B3"], /* CANADIAN SYLLABICS WEST-CREE MWO */
+ ["\u14B4", "\u14B4"], /* CANADIAN SYLLABICS MWOO */
+ ["\u14B5", "\u14B5"], /* CANADIAN SYLLABICS WEST-CREE MWOO */
+ ["\u14B6", "\u14B6"], /* CANADIAN SYLLABICS MWA */
+ ["\u14B7", "\u14B7"], /* CANADIAN SYLLABICS WEST-CREE MWA */
+ ["\u14B8", "\u14B8"], /* CANADIAN SYLLABICS MWAA */
+ ["\u14B9", "\u14B9"], /* CANADIAN SYLLABICS WEST-CREE MWAA */
+ ["\u14BA", "\u14BA"], /* CANADIAN SYLLABICS NASKAPI MWAA */
+ ["\u14BB", "\u14BB"], /* CANADIAN SYLLABICS M */
+ ["\u14BC", "\u14BC"], /* CANADIAN SYLLABICS WEST-CREE M */
+ ["\u14BD", "\u14BD"], /* CANADIAN SYLLABICS MH */
+ ["\u14BE", "\u14BE"], /* CANADIAN SYLLABICS ATHAPASCAN M */
+ ["\u14BF", "\u14BF"], /* CANADIAN SYLLABICS SAYISI M */
+ ["\u14C0", "\u14C0"], /* CANADIAN SYLLABICS NE */
+ ["\u14C1", "\u14C1"], /* CANADIAN SYLLABICS NAAI */
+ ["\u14C2", "\u14C2"], /* CANADIAN SYLLABICS NI */
+ ["\u14C3", "\u14C3"], /* CANADIAN SYLLABICS NII */
+ ["\u14C4", "\u14C4"], /* CANADIAN SYLLABICS NO */
+ ["\u14C5", "\u14C5"], /* CANADIAN SYLLABICS NOO */
+ ["\u14C6", "\u14C6"], /* CANADIAN SYLLABICS Y-CREE NOO */
+ ["\u14C7", "\u14C7"], /* CANADIAN SYLLABICS NA */
+ ["\u14C8", "\u14C8"], /* CANADIAN SYLLABICS NAA */
+ ["\u14C9", "\u14C9"], /* CANADIAN SYLLABICS NWE */
+ ["\u14CA", "\u14CA"], /* CANADIAN SYLLABICS WEST-CREE NWE */
+ ["\u14CB", "\u14CB"], /* CANADIAN SYLLABICS NWA */
+ ["\u14CC", "\u14CC"], /* CANADIAN SYLLABICS WEST-CREE NWA */
+ ["\u14CD", "\u14CD"], /* CANADIAN SYLLABICS NWAA */
+ ["\u14CE", "\u14CE"], /* CANADIAN SYLLABICS WEST-CREE NWAA */
+ ["\u14CF", "\u14CF"], /* CANADIAN SYLLABICS NASKAPI NWAA */
+ ["\u14D0", "\u14D0"], /* CANADIAN SYLLABICS N */
+ ["\u14D1", "\u14D1"], /* CANADIAN SYLLABICS CARRIER NG */
+ ["\u14D2", "\u14D2"], /* CANADIAN SYLLABICS NH */
+ ["\u14D3", "\u14D3"], /* CANADIAN SYLLABICS LE */
+ ["\u14D4", "\u14D4"], /* CANADIAN SYLLABICS LAAI */
+ ["\u14D5", "\u14D5"], /* CANADIAN SYLLABICS LI */
+ ["\u14D6", "\u14D6"], /* CANADIAN SYLLABICS LII */
+ ["\u14D7", "\u14D7"], /* CANADIAN SYLLABICS LO */
+ ["\u14D8", "\u14D8"], /* CANADIAN SYLLABICS LOO */
+ ["\u14D9", "\u14D9"], /* CANADIAN SYLLABICS Y-CREE LOO */
+ ["\u14DA", "\u14DA"], /* CANADIAN SYLLABICS LA */
+ ["\u14DB", "\u14DB"], /* CANADIAN SYLLABICS LAA */
+ ["\u14DC", "\u14DC"], /* CANADIAN SYLLABICS LWE */
+ ["\u14DD", "\u14DD"], /* CANADIAN SYLLABICS WEST-CREE LWE */
+ ["\u14DE", "\u14DE"], /* CANADIAN SYLLABICS LWI */
+ ["\u14DF", "\u14DF"], /* CANADIAN SYLLABICS WEST-CREE LWI */
+ ["\u14E0", "\u14E0"], /* CANADIAN SYLLABICS LWII */
+ ["\u14E1", "\u14E1"], /* CANADIAN SYLLABICS WEST-CREE LWII */
+ ["\u14E2", "\u14E2"], /* CANADIAN SYLLABICS LWO */
+ ["\u14E3", "\u14E3"], /* CANADIAN SYLLABICS WEST-CREE LWO */
+ ["\u14E4", "\u14E4"], /* CANADIAN SYLLABICS LWOO */
+ ["\u14E5", "\u14E5"], /* CANADIAN SYLLABICS WEST-CREE LWOO */
+ ["\u14E6", "\u14E6"], /* CANADIAN SYLLABICS LWA */
+ ["\u14E7", "\u14E7"], /* CANADIAN SYLLABICS WEST-CREE LWA */
+ ["\u14E8", "\u14E8"], /* CANADIAN SYLLABICS LWAA */
+ ["\u14E9", "\u14E9"], /* CANADIAN SYLLABICS WEST-CREE LWAA */
+ ["\u14EA", "\u14EA"], /* CANADIAN SYLLABICS L */
+ ["\u14EB", "\u14EB"], /* CANADIAN SYLLABICS WEST-CREE L */
+ ["\u14EC", "\u14EC"], /* CANADIAN SYLLABICS MEDIAL L */
+ ["\u14ED", "\u14ED"], /* CANADIAN SYLLABICS SE */
+ ["\u14EE", "\u14EE"], /* CANADIAN SYLLABICS SAAI */
+ ["\u14EF", "\u14EF"], /* CANADIAN SYLLABICS SI */
+ ["\u14F0", "\u14F0"], /* CANADIAN SYLLABICS SII */
+ ["\u14F1", "\u14F1"], /* CANADIAN SYLLABICS SO */
+ ["\u14F2", "\u14F2"], /* CANADIAN SYLLABICS SOO */
+ ["\u14F3", "\u14F3"], /* CANADIAN SYLLABICS Y-CREE SOO */
+ ["\u14F4", "\u14F4"], /* CANADIAN SYLLABICS SA */
+ ["\u14F5", "\u14F5"], /* CANADIAN SYLLABICS SAA */
+ ["\u14F6", "\u14F6"], /* CANADIAN SYLLABICS SWE */
+ ["\u14F7", "\u14F7"], /* CANADIAN SYLLABICS WEST-CREE SWE */
+ ["\u14F8", "\u14F8"], /* CANADIAN SYLLABICS SWI */
+ ["\u14F9", "\u14F9"], /* CANADIAN SYLLABICS WEST-CREE SWI */
+ ["\u14FA", "\u14FA"], /* CANADIAN SYLLABICS SWII */
+ ["\u14FB", "\u14FB"], /* CANADIAN SYLLABICS WEST-CREE SWII */
+ ["\u14FC", "\u14FC"], /* CANADIAN SYLLABICS SWO */
+ ["\u14FD", "\u14FD"], /* CANADIAN SYLLABICS WEST-CREE SWO */
+ ["\u14FE", "\u14FE"], /* CANADIAN SYLLABICS SWOO */
+ ["\u14FF", "\u14FF"], /* CANADIAN SYLLABICS WEST-CREE SWOO */
+ ["\u1500", "\u1500"], /* CANADIAN SYLLABICS SWA */
+ ["\u1501", "\u1501"], /* CANADIAN SYLLABICS WEST-CREE SWA */
+ ["\u1502", "\u1502"], /* CANADIAN SYLLABICS SWAA */
+ ["\u1503", "\u1503"], /* CANADIAN SYLLABICS WEST-CREE SWAA */
+ ["\u1504", "\u1504"], /* CANADIAN SYLLABICS NASKAPI SWAA */
+ ["\u1505", "\u1505"], /* CANADIAN SYLLABICS S */
+ ["\u1506", "\u1506"], /* CANADIAN SYLLABICS ATHAPASCAN S */
+ ["\u1507", "\u1507"], /* CANADIAN SYLLABICS SW */
+ ["\u1508", "\u1508"], /* CANADIAN SYLLABICS BLACKFOOT S */
+ ["\u1509", "\u1509"], /* CANADIAN SYLLABICS MOOSE-CREE SK */
+ ["\u150A", "\u150A"], /* CANADIAN SYLLABICS NASKAPI SKW */
+ ["\u150B", "\u150B"], /* CANADIAN SYLLABICS NASKAPI S-W */
+ ["\u150C", "\u150C"], /* CANADIAN SYLLABICS NASKAPI SPWA */
+ ["\u150D", "\u150D"], /* CANADIAN SYLLABICS NASKAPI STWA */
+ ["\u150E", "\u150E"], /* CANADIAN SYLLABICS NASKAPI SKWA */
+ ["\u150F", "\u150F"], /* CANADIAN SYLLABICS NASKAPI SCWA */
+ ["\u1510", "\u1510"], /* CANADIAN SYLLABICS SHE */
+ ["\u1511", "\u1511"], /* CANADIAN SYLLABICS SHI */
+ ["\u1512", "\u1512"], /* CANADIAN SYLLABICS SHII */
+ ["\u1513", "\u1513"], /* CANADIAN SYLLABICS SHO */
+ ["\u1514", "\u1514"], /* CANADIAN SYLLABICS SHOO */
+ ["\u1515", "\u1515"], /* CANADIAN SYLLABICS SHA */
+ ["\u1516", "\u1516"], /* CANADIAN SYLLABICS SHAA */
+ ["\u1517", "\u1517"], /* CANADIAN SYLLABICS SHWE */
+ ["\u1518", "\u1518"], /* CANADIAN SYLLABICS WEST-CREE SHWE */
+ ["\u1519", "\u1519"], /* CANADIAN SYLLABICS SHWI */
+ ["\u151A", "\u151A"], /* CANADIAN SYLLABICS WEST-CREE SHWI */
+ ["\u151B", "\u151B"], /* CANADIAN SYLLABICS SHWII */
+ ["\u151C", "\u151C"], /* CANADIAN SYLLABICS WEST-CREE SHWII */
+ ["\u151D", "\u151D"], /* CANADIAN SYLLABICS SHWO */
+ ["\u151E", "\u151E"], /* CANADIAN SYLLABICS WEST-CREE SHWO */
+ ["\u151F", "\u151F"], /* CANADIAN SYLLABICS SHWOO */
+ ["\u1520", "\u1520"], /* CANADIAN SYLLABICS WEST-CREE SHWOO */
+ ["\u1521", "\u1521"], /* CANADIAN SYLLABICS SHWA */
+ ["\u1522", "\u1522"], /* CANADIAN SYLLABICS WEST-CREE SHWA */
+ ["\u1523", "\u1523"], /* CANADIAN SYLLABICS SHWAA */
+ ["\u1524", "\u1524"], /* CANADIAN SYLLABICS WEST-CREE SHWAA */
+ ["\u1525", "\u1525"], /* CANADIAN SYLLABICS SH */
+ ["\u1526", "\u1526"], /* CANADIAN SYLLABICS YE */
+ ["\u1527", "\u1527"], /* CANADIAN SYLLABICS YAAI */
+ ["\u1528", "\u1528"], /* CANADIAN SYLLABICS YI */
+ ["\u1529", "\u1529"], /* CANADIAN SYLLABICS YII */
+ ["\u152A", "\u152A"], /* CANADIAN SYLLABICS YO */
+ ["\u152B", "\u152B"], /* CANADIAN SYLLABICS YOO */
+ ["\u152C", "\u152C"], /* CANADIAN SYLLABICS Y-CREE YOO */
+ ["\u152D", "\u152D"], /* CANADIAN SYLLABICS YA */
+ ["\u152E", "\u152E"], /* CANADIAN SYLLABICS YAA */
+ ["\u152F", "\u152F"], /* CANADIAN SYLLABICS YWE */
+ ["\u1530", "\u1530"], /* CANADIAN SYLLABICS WEST-CREE YWE */
+ ["\u1531", "\u1531"], /* CANADIAN SYLLABICS YWI */
+ ["\u1532", "\u1532"], /* CANADIAN SYLLABICS WEST-CREE YWI */
+ ["\u1533", "\u1533"], /* CANADIAN SYLLABICS YWII */
+ ["\u1534", "\u1534"], /* CANADIAN SYLLABICS WEST-CREE YWII */
+ ["\u1535", "\u1535"], /* CANADIAN SYLLABICS YWO */
+ ["\u1536", "\u1536"], /* CANADIAN SYLLABICS WEST-CREE YWO */
+ ["\u1537", "\u1537"], /* CANADIAN SYLLABICS YWOO */
+ ["\u1538", "\u1538"], /* CANADIAN SYLLABICS WEST-CREE YWOO */
+ ["\u1539", "\u1539"], /* CANADIAN SYLLABICS YWA */
+ ["\u153A", "\u153A"], /* CANADIAN SYLLABICS WEST-CREE YWA */
+ ["\u153B", "\u153B"], /* CANADIAN SYLLABICS YWAA */
+ ["\u153C", "\u153C"], /* CANADIAN SYLLABICS WEST-CREE YWAA */
+ ["\u153D", "\u153D"], /* CANADIAN SYLLABICS NASKAPI YWAA */
+ ["\u153E", "\u153E"], /* CANADIAN SYLLABICS Y */
+ ["\u153F", "\u153F"], /* CANADIAN SYLLABICS BIBLE-CREE Y */
+ ["\u1540", "\u1540"], /* CANADIAN SYLLABICS WEST-CREE Y */
+ ["\u1541", "\u1541"], /* CANADIAN SYLLABICS SAYISI YI */
+ ["\u1542", "\u1542"], /* CANADIAN SYLLABICS RE */
+ ["\u1543", "\u1543"], /* CANADIAN SYLLABICS R-CREE RE */
+ ["\u1544", "\u1544"], /* CANADIAN SYLLABICS WEST-CREE LE */
+ ["\u1545", "\u1545"], /* CANADIAN SYLLABICS RAAI */
+ ["\u1546", "\u1546"], /* CANADIAN SYLLABICS RI */
+ ["\u1547", "\u1547"], /* CANADIAN SYLLABICS RII */
+ ["\u1548", "\u1548"], /* CANADIAN SYLLABICS RO */
+ ["\u1549", "\u1549"], /* CANADIAN SYLLABICS ROO */
+ ["\u154A", "\u154A"], /* CANADIAN SYLLABICS WEST-CREE LO */
+ ["\u154B", "\u154B"], /* CANADIAN SYLLABICS RA */
+ ["\u154C", "\u154C"], /* CANADIAN SYLLABICS RAA */
+ ["\u154D", "\u154D"], /* CANADIAN SYLLABICS WEST-CREE LA */
+ ["\u154E", "\u154E"], /* CANADIAN SYLLABICS RWAA */
+ ["\u154F", "\u154F"], /* CANADIAN SYLLABICS WEST-CREE RWAA */
+ ["\u1550", "\u1550"], /* CANADIAN SYLLABICS R */
+ ["\u1551", "\u1551"], /* CANADIAN SYLLABICS WEST-CREE R */
+ ["\u1552", "\u1552"], /* CANADIAN SYLLABICS MEDIAL R */
+ ["\u1553", "\u1553"], /* CANADIAN SYLLABICS FE */
+ ["\u1554", "\u1554"], /* CANADIAN SYLLABICS FAAI */
+ ["\u1555", "\u1555"], /* CANADIAN SYLLABICS FI */
+ ["\u1556", "\u1556"], /* CANADIAN SYLLABICS FII */
+ ["\u1557", "\u1557"], /* CANADIAN SYLLABICS FO */
+ ["\u1558", "\u1558"], /* CANADIAN SYLLABICS FOO */
+ ["\u1559", "\u1559"], /* CANADIAN SYLLABICS FA */
+ ["\u155A", "\u155A"], /* CANADIAN SYLLABICS FAA */
+ ["\u155B", "\u155B"], /* CANADIAN SYLLABICS FWAA */
+ ["\u155C", "\u155C"], /* CANADIAN SYLLABICS WEST-CREE FWAA */
+ ["\u155D", "\u155D"], /* CANADIAN SYLLABICS F */
+ ["\u155E", "\u155E"], /* CANADIAN SYLLABICS THE */
+ ["\u155F", "\u155F"], /* CANADIAN SYLLABICS N-CREE THE */
+ ["\u1560", "\u1560"], /* CANADIAN SYLLABICS THI */
+ ["\u1561", "\u1561"], /* CANADIAN SYLLABICS N-CREE THI */
+ ["\u1562", "\u1562"], /* CANADIAN SYLLABICS THII */
+ ["\u1563", "\u1563"], /* CANADIAN SYLLABICS N-CREE THII */
+ ["\u1564", "\u1564"], /* CANADIAN SYLLABICS THO */
+ ["\u1565", "\u1565"], /* CANADIAN SYLLABICS THOO */
+ ["\u1566", "\u1566"], /* CANADIAN SYLLABICS THA */
+ ["\u1567", "\u1567"], /* CANADIAN SYLLABICS THAA */
+ ["\u1568", "\u1568"], /* CANADIAN SYLLABICS THWAA */
+ ["\u1569", "\u1569"], /* CANADIAN SYLLABICS WEST-CREE THWAA */
+ ["\u156A", "\u156A"], /* CANADIAN SYLLABICS TH */
+ ["\u156B", "\u156B"], /* CANADIAN SYLLABICS TTHE */
+ ["\u156C", "\u156C"], /* CANADIAN SYLLABICS TTHI */
+ ["\u156D", "\u156D"], /* CANADIAN SYLLABICS TTHO */
+ ["\u156E", "\u156E"], /* CANADIAN SYLLABICS TTHA */
+ ["\u156F", "\u156F"], /* CANADIAN SYLLABICS TTH */
+ ["\u1570", "\u1570"], /* CANADIAN SYLLABICS TYE */
+ ["\u1571", "\u1571"], /* CANADIAN SYLLABICS TYI */
+ ["\u1572", "\u1572"], /* CANADIAN SYLLABICS TYO */
+ ["\u1573", "\u1573"], /* CANADIAN SYLLABICS TYA */
+ ["\u1574", "\u1574"], /* CANADIAN SYLLABICS NUNAVIK HE */
+ ["\u1575", "\u1575"], /* CANADIAN SYLLABICS NUNAVIK HI */
+ ["\u1576", "\u1576"], /* CANADIAN SYLLABICS NUNAVIK HII */
+ ["\u1577", "\u1577"], /* CANADIAN SYLLABICS NUNAVIK HO */
+ ["\u1578", "\u1578"], /* CANADIAN SYLLABICS NUNAVIK HOO */
+ ["\u1579", "\u1579"], /* CANADIAN SYLLABICS NUNAVIK HA */
+ ["\u157A", "\u157A"], /* CANADIAN SYLLABICS NUNAVIK HAA */
+ ["\u157B", "\u157B"], /* CANADIAN SYLLABICS NUNAVIK H */
+ ["\u157C", "\u157C"], /* CANADIAN SYLLABICS NUNAVUT H */
+ ["\u157D", "\u157D"], /* CANADIAN SYLLABICS HK */
+ ["\u157E", "\u157E"], /* CANADIAN SYLLABICS QAAI */
+ ["\u157F", "\u157F"], /* CANADIAN SYLLABICS QI */
+ ["\u1580", "\u1580"], /* CANADIAN SYLLABICS QII */
+ ["\u1581", "\u1581"], /* CANADIAN SYLLABICS QO */
+ ["\u1582", "\u1582"], /* CANADIAN SYLLABICS QOO */
+ ["\u1583", "\u1583"], /* CANADIAN SYLLABICS QA */
+ ["\u1584", "\u1584"], /* CANADIAN SYLLABICS QAA */
+ ["\u1585", "\u1585"], /* CANADIAN SYLLABICS Q */
+ ["\u1586", "\u1586"], /* CANADIAN SYLLABICS TLHE */
+ ["\u1587", "\u1587"], /* CANADIAN SYLLABICS TLHI */
+ ["\u1588", "\u1588"], /* CANADIAN SYLLABICS TLHO */
+ ["\u1589", "\u1589"], /* CANADIAN SYLLABICS TLHA */
+ ["\u158A", "\u158A"], /* CANADIAN SYLLABICS WEST-CREE RE */
+ ["\u158B", "\u158B"], /* CANADIAN SYLLABICS WEST-CREE RI */
+ ["\u158C", "\u158C"], /* CANADIAN SYLLABICS WEST-CREE RO */
+ ["\u158D", "\u158D"], /* CANADIAN SYLLABICS WEST-CREE RA */
+ ["\u158E", "\u158E"], /* CANADIAN SYLLABICS NGAAI */
+ ["\u158F", "\u158F"], /* CANADIAN SYLLABICS NGI */
+ ["\u1590", "\u1590"], /* CANADIAN SYLLABICS NGII */
+ ["\u1591", "\u1591"], /* CANADIAN SYLLABICS NGO */
+ ["\u1592", "\u1592"], /* CANADIAN SYLLABICS NGOO */
+ ["\u1593", "\u1593"], /* CANADIAN SYLLABICS NGA */
+ ["\u1594", "\u1594"], /* CANADIAN SYLLABICS NGAA */
+ ["\u1595", "\u1595"], /* CANADIAN SYLLABICS NG */
+ ["\u1596", "\u1596"], /* CANADIAN SYLLABICS NNG */
+ ["\u1597", "\u1597"], /* CANADIAN SYLLABICS SAYISI SHE */
+ ["\u1598", "\u1598"], /* CANADIAN SYLLABICS SAYISI SHI */
+ ["\u1599", "\u1599"], /* CANADIAN SYLLABICS SAYISI SHO */
+ ["\u159A", "\u159A"], /* CANADIAN SYLLABICS SAYISI SHA */
+ ["\u159B", "\u159B"], /* CANADIAN SYLLABICS WOODS-CREE THE */
+ ["\u159C", "\u159C"], /* CANADIAN SYLLABICS WOODS-CREE THI */
+ ["\u159D", "\u159D"], /* CANADIAN SYLLABICS WOODS-CREE THO */
+ ["\u159E", "\u159E"], /* CANADIAN SYLLABICS WOODS-CREE THA */
+ ["\u159F", "\u159F"], /* CANADIAN SYLLABICS WOODS-CREE TH */
+ ["\u15A0", "\u15A0"], /* CANADIAN SYLLABICS LHI */
+ ["\u15A1", "\u15A1"], /* CANADIAN SYLLABICS LHII */
+ ["\u15A2", "\u15A2"], /* CANADIAN SYLLABICS LHO */
+ ["\u15A3", "\u15A3"], /* CANADIAN SYLLABICS LHOO */
+ ["\u15A4", "\u15A4"], /* CANADIAN SYLLABICS LHA */
+ ["\u15A5", "\u15A5"], /* CANADIAN SYLLABICS LHAA */
+ ["\u15A6", "\u15A6"], /* CANADIAN SYLLABICS LH */
+ ["\u15A7", "\u15A7"], /* CANADIAN SYLLABICS TH-CREE THE */
+ ["\u15A8", "\u15A8"], /* CANADIAN SYLLABICS TH-CREE THI */
+ ["\u15A9", "\u15A9"], /* CANADIAN SYLLABICS TH-CREE THII */
+ ["\u15AA", "\u15AA"], /* CANADIAN SYLLABICS TH-CREE THO */
+ ["\u15AB", "\u15AB"], /* CANADIAN SYLLABICS TH-CREE THOO */
+ ["\u15AC", "\u15AC"], /* CANADIAN SYLLABICS TH-CREE THA */
+ ["\u15AD", "\u15AD"], /* CANADIAN SYLLABICS TH-CREE THAA */
+ ["\u15AE", "\u15AE"], /* CANADIAN SYLLABICS TH-CREE TH */
+ ["\u15AF", "\u15AF"], /* CANADIAN SYLLABICS AIVILIK B */
+ ["\u15B0", "\u15B0"], /* CANADIAN SYLLABICS BLACKFOOT E */
+ ["\u15B1", "\u15B1"], /* CANADIAN SYLLABICS BLACKFOOT I */
+ ["\u15B2", "\u15B2"], /* CANADIAN SYLLABICS BLACKFOOT O */
+ ["\u15B3", "\u15B3"], /* CANADIAN SYLLABICS BLACKFOOT A */
+ ["\u15B4", "\u15B4"], /* CANADIAN SYLLABICS BLACKFOOT WE */
+ ["\u15B5", "\u15B5"], /* CANADIAN SYLLABICS BLACKFOOT WI */
+ ["\u15B6", "\u15B6"], /* CANADIAN SYLLABICS BLACKFOOT WO */
+ ["\u15B7", "\u15B7"], /* CANADIAN SYLLABICS BLACKFOOT WA */
+ ["\u15B8", "\u15B8"], /* CANADIAN SYLLABICS BLACKFOOT NE */
+ ["\u15B9", "\u15B9"], /* CANADIAN SYLLABICS BLACKFOOT NI */
+ ["\u15BA", "\u15BA"], /* CANADIAN SYLLABICS BLACKFOOT NO */
+ ["\u15BB", "\u15BB"], /* CANADIAN SYLLABICS BLACKFOOT NA */
+ ["\u15BC", "\u15BC"], /* CANADIAN SYLLABICS BLACKFOOT KE */
+ ["\u15BD", "\u15BD"], /* CANADIAN SYLLABICS BLACKFOOT KI */
+ ["\u15BE", "\u15BE"], /* CANADIAN SYLLABICS BLACKFOOT KO */
+ ["\u15BF", "\u15BF"], /* CANADIAN SYLLABICS BLACKFOOT KA */
+ ["\u15C0", "\u15C0"], /* CANADIAN SYLLABICS SAYISI HE */
+ ["\u15C1", "\u15C1"], /* CANADIAN SYLLABICS SAYISI HI */
+ ["\u15C2", "\u15C2"], /* CANADIAN SYLLABICS SAYISI HO */
+ ["\u15C3", "\u15C3"], /* CANADIAN SYLLABICS SAYISI HA */
+ ["\u15C4", "\u15C4"], /* CANADIAN SYLLABICS CARRIER GHU */
+ ["\u15C5", "\u15C5"], /* CANADIAN SYLLABICS CARRIER GHO */
+ ["\u15C6", "\u15C6"], /* CANADIAN SYLLABICS CARRIER GHE */
+ ["\u15C7", "\u15C7"], /* CANADIAN SYLLABICS CARRIER GHEE */
+ ["\u15C8", "\u15C8"], /* CANADIAN SYLLABICS CARRIER GHI */
+ ["\u15C9", "\u15C9"], /* CANADIAN SYLLABICS CARRIER GHA */
+ ["\u15CA", "\u15CA"], /* CANADIAN SYLLABICS CARRIER RU */
+ ["\u15CB", "\u15CB"], /* CANADIAN SYLLABICS CARRIER RO */
+ ["\u15CC", "\u15CC"], /* CANADIAN SYLLABICS CARRIER RE */
+ ["\u15CD", "\u15CD"], /* CANADIAN SYLLABICS CARRIER REE */
+ ["\u15CE", "\u15CE"], /* CANADIAN SYLLABICS CARRIER RI */
+ ["\u15CF", "\u15CF"], /* CANADIAN SYLLABICS CARRIER RA */
+ ["\u15D0", "\u15D0"], /* CANADIAN SYLLABICS CARRIER WU */
+ ["\u15D1", "\u15D1"], /* CANADIAN SYLLABICS CARRIER WO */
+ ["\u15D2", "\u15D2"], /* CANADIAN SYLLABICS CARRIER WE */
+ ["\u15D3", "\u15D3"], /* CANADIAN SYLLABICS CARRIER WEE */
+ ["\u15D4", "\u15D4"], /* CANADIAN SYLLABICS CARRIER WI */
+ ["\u15D5", "\u15D5"], /* CANADIAN SYLLABICS CARRIER WA */
+ ["\u15D6", "\u15D6"], /* CANADIAN SYLLABICS CARRIER HWU */
+ ["\u15D7", "\u15D7"], /* CANADIAN SYLLABICS CARRIER HWO */
+ ["\u15D8", "\u15D8"], /* CANADIAN SYLLABICS CARRIER HWE */
+ ["\u15D9", "\u15D9"], /* CANADIAN SYLLABICS CARRIER HWEE */
+ ["\u15DA", "\u15DA"], /* CANADIAN SYLLABICS CARRIER HWI */
+ ["\u15DB", "\u15DB"], /* CANADIAN SYLLABICS CARRIER HWA */
+ ["\u15DC", "\u15DC"], /* CANADIAN SYLLABICS CARRIER THU */
+ ["\u15DD", "\u15DD"], /* CANADIAN SYLLABICS CARRIER THO */
+ ["\u15DE", "\u15DE"], /* CANADIAN SYLLABICS CARRIER THE */
+ ["\u15DF", "\u15DF"], /* CANADIAN SYLLABICS CARRIER THEE */
+ ["\u15E0", "\u15E0"], /* CANADIAN SYLLABICS CARRIER THI */
+ ["\u15E1", "\u15E1"], /* CANADIAN SYLLABICS CARRIER THA */
+ ["\u15E2", "\u15E2"], /* CANADIAN SYLLABICS CARRIER TTU */
+ ["\u15E3", "\u15E3"], /* CANADIAN SYLLABICS CARRIER TTO */
+ ["\u15E4", "\u15E4"], /* CANADIAN SYLLABICS CARRIER TTE */
+ ["\u15E5", "\u15E5"], /* CANADIAN SYLLABICS CARRIER TTEE */
+ ["\u15E6", "\u15E6"], /* CANADIAN SYLLABICS CARRIER TTI */
+ ["\u15E7", "\u15E7"], /* CANADIAN SYLLABICS CARRIER TTA */
+ ["\u15E8", "\u15E8"], /* CANADIAN SYLLABICS CARRIER PU */
+ ["\u15E9", "\u15E9"], /* CANADIAN SYLLABICS CARRIER PO */
+ ["\u15EA", "\u15EA"], /* CANADIAN SYLLABICS CARRIER PE */
+ ["\u15EB", "\u15EB"], /* CANADIAN SYLLABICS CARRIER PEE */
+ ["\u15EC", "\u15EC"], /* CANADIAN SYLLABICS CARRIER PI */
+ ["\u15ED", "\u15ED"], /* CANADIAN SYLLABICS CARRIER PA */
+ ["\u15EE", "\u15EE"], /* CANADIAN SYLLABICS CARRIER P */
+ ["\u15EF", "\u15EF"], /* CANADIAN SYLLABICS CARRIER GU */
+ ["\u15F0", "\u15F0"], /* CANADIAN SYLLABICS CARRIER GO */
+ ["\u15F1", "\u15F1"], /* CANADIAN SYLLABICS CARRIER GE */
+ ["\u15F2", "\u15F2"], /* CANADIAN SYLLABICS CARRIER GEE */
+ ["\u15F3", "\u15F3"], /* CANADIAN SYLLABICS CARRIER GI */
+ ["\u15F4", "\u15F4"], /* CANADIAN SYLLABICS CARRIER GA */
+ ["\u15F5", "\u15F5"], /* CANADIAN SYLLABICS CARRIER KHU */
+ ["\u15F6", "\u15F6"], /* CANADIAN SYLLABICS CARRIER KHO */
+ ["\u15F7", "\u15F7"], /* CANADIAN SYLLABICS CARRIER KHE */
+ ["\u15F8", "\u15F8"], /* CANADIAN SYLLABICS CARRIER KHEE */
+ ["\u15F9", "\u15F9"], /* CANADIAN SYLLABICS CARRIER KHI */
+ ["\u15FA", "\u15FA"], /* CANADIAN SYLLABICS CARRIER KHA */
+ ["\u15FB", "\u15FB"], /* CANADIAN SYLLABICS CARRIER KKU */
+ ["\u15FC", "\u15FC"], /* CANADIAN SYLLABICS CARRIER KKO */
+ ["\u15FD", "\u15FD"], /* CANADIAN SYLLABICS CARRIER KKE */
+ ["\u15FE", "\u15FE"], /* CANADIAN SYLLABICS CARRIER KKEE */
+ ["\u15FF", "\u15FF"], /* CANADIAN SYLLABICS CARRIER KKI */
+ ["\u1600", "\u1600"], /* CANADIAN SYLLABICS CARRIER KKA */
+ ["\u1601", "\u1601"], /* CANADIAN SYLLABICS CARRIER KK */
+ ["\u1602", "\u1602"], /* CANADIAN SYLLABICS CARRIER NU */
+ ["\u1603", "\u1603"], /* CANADIAN SYLLABICS CARRIER NO */
+ ["\u1604", "\u1604"], /* CANADIAN SYLLABICS CARRIER NE */
+ ["\u1605", "\u1605"], /* CANADIAN SYLLABICS CARRIER NEE */
+ ["\u1606", "\u1606"], /* CANADIAN SYLLABICS CARRIER NI */
+ ["\u1607", "\u1607"], /* CANADIAN SYLLABICS CARRIER NA */
+ ["\u1608", "\u1608"], /* CANADIAN SYLLABICS CARRIER MU */
+ ["\u1609", "\u1609"], /* CANADIAN SYLLABICS CARRIER MO */
+ ["\u160A", "\u160A"], /* CANADIAN SYLLABICS CARRIER ME */
+ ["\u160B", "\u160B"], /* CANADIAN SYLLABICS CARRIER MEE */
+ ["\u160C", "\u160C"], /* CANADIAN SYLLABICS CARRIER MI */
+ ["\u160D", "\u160D"], /* CANADIAN SYLLABICS CARRIER MA */
+ ["\u160E", "\u160E"], /* CANADIAN SYLLABICS CARRIER YU */
+ ["\u160F", "\u160F"], /* CANADIAN SYLLABICS CARRIER YO */
+ ["\u1610", "\u1610"], /* CANADIAN SYLLABICS CARRIER YE */
+ ["\u1611", "\u1611"], /* CANADIAN SYLLABICS CARRIER YEE */
+ ["\u1612", "\u1612"], /* CANADIAN SYLLABICS CARRIER YI */
+ ["\u1613", "\u1613"], /* CANADIAN SYLLABICS CARRIER YA */
+ ["\u1614", "\u1614"], /* CANADIAN SYLLABICS CARRIER JU */
+ ["\u1615", "\u1615"], /* CANADIAN SYLLABICS SAYISI JU */
+ ["\u1616", "\u1616"], /* CANADIAN SYLLABICS CARRIER JO */
+ ["\u1617", "\u1617"], /* CANADIAN SYLLABICS CARRIER JE */
+ ["\u1618", "\u1618"], /* CANADIAN SYLLABICS CARRIER JEE */
+ ["\u1619", "\u1619"], /* CANADIAN SYLLABICS CARRIER JI */
+ ["\u161A", "\u161A"], /* CANADIAN SYLLABICS SAYISI JI */
+ ["\u161B", "\u161B"], /* CANADIAN SYLLABICS CARRIER JA */
+ ["\u161C", "\u161C"], /* CANADIAN SYLLABICS CARRIER JJU */
+ ["\u161D", "\u161D"], /* CANADIAN SYLLABICS CARRIER JJO */
+ ["\u161E", "\u161E"], /* CANADIAN SYLLABICS CARRIER JJE */
+ ["\u161F", "\u161F"], /* CANADIAN SYLLABICS CARRIER JJEE */
+ ["\u1620", "\u1620"], /* CANADIAN SYLLABICS CARRIER JJI */
+ ["\u1621", "\u1621"], /* CANADIAN SYLLABICS CARRIER JJA */
+ ["\u1622", "\u1622"], /* CANADIAN SYLLABICS CARRIER LU */
+ ["\u1623", "\u1623"], /* CANADIAN SYLLABICS CARRIER LO */
+ ["\u1624", "\u1624"], /* CANADIAN SYLLABICS CARRIER LE */
+ ["\u1625", "\u1625"], /* CANADIAN SYLLABICS CARRIER LEE */
+ ["\u1626", "\u1626"], /* CANADIAN SYLLABICS CARRIER LI */
+ ["\u1627", "\u1627"], /* CANADIAN SYLLABICS CARRIER LA */
+ ["\u1628", "\u1628"], /* CANADIAN SYLLABICS CARRIER DLU */
+ ["\u1629", "\u1629"], /* CANADIAN SYLLABICS CARRIER DLO */
+ ["\u162A", "\u162A"], /* CANADIAN SYLLABICS CARRIER DLE */
+ ["\u162B", "\u162B"], /* CANADIAN SYLLABICS CARRIER DLEE */
+ ["\u162C", "\u162C"], /* CANADIAN SYLLABICS CARRIER DLI */
+ ["\u162D", "\u162D"], /* CANADIAN SYLLABICS CARRIER DLA */
+ ["\u162E", "\u162E"], /* CANADIAN SYLLABICS CARRIER LHU */
+ ["\u162F", "\u162F"], /* CANADIAN SYLLABICS CARRIER LHO */
+ ["\u1630", "\u1630"], /* CANADIAN SYLLABICS CARRIER LHE */
+ ["\u1631", "\u1631"], /* CANADIAN SYLLABICS CARRIER LHEE */
+ ["\u1632", "\u1632"], /* CANADIAN SYLLABICS CARRIER LHI */
+ ["\u1633", "\u1633"], /* CANADIAN SYLLABICS CARRIER LHA */
+ ["\u1634", "\u1634"], /* CANADIAN SYLLABICS CARRIER TLHU */
+ ["\u1635", "\u1635"], /* CANADIAN SYLLABICS CARRIER TLHO */
+ ["\u1636", "\u1636"], /* CANADIAN SYLLABICS CARRIER TLHE */
+ ["\u1637", "\u1637"], /* CANADIAN SYLLABICS CARRIER TLHEE */
+ ["\u1638", "\u1638"], /* CANADIAN SYLLABICS CARRIER TLHI */
+ ["\u1639", "\u1639"], /* CANADIAN SYLLABICS CARRIER TLHA */
+ ["\u163A", "\u163A"], /* CANADIAN SYLLABICS CARRIER TLU */
+ ["\u163B", "\u163B"], /* CANADIAN SYLLABICS CARRIER TLO */
+ ["\u163C", "\u163C"], /* CANADIAN SYLLABICS CARRIER TLE */
+ ["\u163D", "\u163D"], /* CANADIAN SYLLABICS CARRIER TLEE */
+ ["\u163E", "\u163E"], /* CANADIAN SYLLABICS CARRIER TLI */
+ ["\u163F", "\u163F"], /* CANADIAN SYLLABICS CARRIER TLA */
+ ["\u1640", "\u1640"], /* CANADIAN SYLLABICS CARRIER ZU */
+ ["\u1641", "\u1641"], /* CANADIAN SYLLABICS CARRIER ZO */
+ ["\u1642", "\u1642"], /* CANADIAN SYLLABICS CARRIER ZE */
+ ["\u1643", "\u1643"], /* CANADIAN SYLLABICS CARRIER ZEE */
+ ["\u1644", "\u1644"], /* CANADIAN SYLLABICS CARRIER ZI */
+ ["\u1645", "\u1645"], /* CANADIAN SYLLABICS CARRIER ZA */
+ ["\u1646", "\u1646"], /* CANADIAN SYLLABICS CARRIER Z */
+ ["\u1647", "\u1647"], /* CANADIAN SYLLABICS CARRIER INITIAL Z */
+ ["\u1648", "\u1648"], /* CANADIAN SYLLABICS CARRIER DZU */
+ ["\u1649", "\u1649"], /* CANADIAN SYLLABICS CARRIER DZO */
+ ["\u164A", "\u164A"], /* CANADIAN SYLLABICS CARRIER DZE */
+ ["\u164B", "\u164B"], /* CANADIAN SYLLABICS CARRIER DZEE */
+ ["\u164C", "\u164C"], /* CANADIAN SYLLABICS CARRIER DZI */
+ ["\u164D", "\u164D"], /* CANADIAN SYLLABICS CARRIER DZA */
+ ["\u164E", "\u164E"], /* CANADIAN SYLLABICS CARRIER SU */
+ ["\u164F", "\u164F"], /* CANADIAN SYLLABICS CARRIER SO */
+ ["\u1650", "\u1650"], /* CANADIAN SYLLABICS CARRIER SE */
+ ["\u1651", "\u1651"], /* CANADIAN SYLLABICS CARRIER SEE */
+ ["\u1652", "\u1652"], /* CANADIAN SYLLABICS CARRIER SI */
+ ["\u1653", "\u1653"], /* CANADIAN SYLLABICS CARRIER SA */
+ ["\u1654", "\u1654"], /* CANADIAN SYLLABICS CARRIER SHU */
+ ["\u1655", "\u1655"], /* CANADIAN SYLLABICS CARRIER SHO */
+ ["\u1656", "\u1656"], /* CANADIAN SYLLABICS CARRIER SHE */
+ ["\u1657", "\u1657"], /* CANADIAN SYLLABICS CARRIER SHEE */
+ ["\u1658", "\u1658"], /* CANADIAN SYLLABICS CARRIER SHI */
+ ["\u1659", "\u1659"], /* CANADIAN SYLLABICS CARRIER SHA */
+ ["\u165A", "\u165A"], /* CANADIAN SYLLABICS CARRIER SH */
+ ["\u165B", "\u165B"], /* CANADIAN SYLLABICS CARRIER TSU */
+ ["\u165C", "\u165C"], /* CANADIAN SYLLABICS CARRIER TSO */
+ ["\u165D", "\u165D"], /* CANADIAN SYLLABICS CARRIER TSE */
+ ["\u165E", "\u165E"], /* CANADIAN SYLLABICS CARRIER TSEE */
+ ["\u165F", "\u165F"], /* CANADIAN SYLLABICS CARRIER TSI */
+ ["\u1660", "\u1660"], /* CANADIAN SYLLABICS CARRIER TSA */
+ ["\u1661", "\u1661"], /* CANADIAN SYLLABICS CARRIER CHU */
+ ["\u1662", "\u1662"], /* CANADIAN SYLLABICS CARRIER CHO */
+ ["\u1663", "\u1663"], /* CANADIAN SYLLABICS CARRIER CHE */
+ ["\u1664", "\u1664"], /* CANADIAN SYLLABICS CARRIER CHEE */
+ ["\u1665", "\u1665"], /* CANADIAN SYLLABICS CARRIER CHI */
+ ["\u1666", "\u1666"], /* CANADIAN SYLLABICS CARRIER CHA */
+ ["\u1667", "\u1667"], /* CANADIAN SYLLABICS CARRIER TTSU */
+ ["\u1668", "\u1668"], /* CANADIAN SYLLABICS CARRIER TTSO */
+ ["\u1669", "\u1669"], /* CANADIAN SYLLABICS CARRIER TTSE */
+ ["\u166A", "\u166A"], /* CANADIAN SYLLABICS CARRIER TTSEE */
+ ["\u166B", "\u166B"], /* CANADIAN SYLLABICS CARRIER TTSI */
+ ["\u166C", "\u166C"], /* CANADIAN SYLLABICS CARRIER TTSA */
+ ["\u166D", "\u166D"], /* CANADIAN SYLLABICS CHI SIGN */
+ ["\u166E", "\u166E"], /* CANADIAN SYLLABICS FULL STOP */
+ ["\u166F", "\u166F"], /* CANADIAN SYLLABICS QAI */
+ ["\u1670", "\u1670"], /* CANADIAN SYLLABICS NGAI */
+ ["\u1671", "\u1671"], /* CANADIAN SYLLABICS NNGI */
+ ["\u1672", "\u1672"], /* CANADIAN SYLLABICS NNGII */
+ ["\u1673", "\u1673"], /* CANADIAN SYLLABICS NNGO */
+ ["\u1674", "\u1674"], /* CANADIAN SYLLABICS NNGOO */
+ ["\u1675", "\u1675"], /* CANADIAN SYLLABICS NNGA */
+ ["\u1676", "\u1676"], /* CANADIAN SYLLABICS NNGAA */
+ ["\u1677", "\u1677"], /* CANADIAN SYLLABICS WOODS-CREE THWEE */
+ ["\u1678", "\u1678"], /* CANADIAN SYLLABICS WOODS-CREE THWI */
+ ["\u1679", "\u1679"], /* CANADIAN SYLLABICS WOODS-CREE THWII */
+ ["\u167A", "\u167A"], /* CANADIAN SYLLABICS WOODS-CREE THWO */
+ ["\u167B", "\u167B"], /* CANADIAN SYLLABICS WOODS-CREE THWOO */
+ ["\u167C", "\u167C"], /* CANADIAN SYLLABICS WOODS-CREE THWA */
+ ["\u167D", "\u167D"], /* CANADIAN SYLLABICS WOODS-CREE THWAA */
+ ["\u167E", "\u167E"], /* CANADIAN SYLLABICS WOODS-CREE FINAL TH */
+ ["\u167F", "\u167F"], /* CANADIAN SYLLABICS BLACKFOOT W */
+ ["\u1680", "\u1680"], /* OGHAM SPACE MARK */
+ ["\u1681", "\u1681"], /* OGHAM LETTER BEITH */
+ ["\u1682", "\u1682"], /* OGHAM LETTER LUIS */
+ ["\u1683", "\u1683"], /* OGHAM LETTER FEARN */
+ ["\u1684", "\u1684"], /* OGHAM LETTER SAIL */
+ ["\u1685", "\u1685"], /* OGHAM LETTER NION */
+ ["\u1686", "\u1686"], /* OGHAM LETTER UATH */
+ ["\u1687", "\u1687"], /* OGHAM LETTER DAIR */
+ ["\u1688", "\u1688"], /* OGHAM LETTER TINNE */
+ ["\u1689", "\u1689"], /* OGHAM LETTER COLL */
+ ["\u168A", "\u168A"], /* OGHAM LETTER CEIRT */
+ ["\u168B", "\u168B"], /* OGHAM LETTER MUIN */
+ ["\u168C", "\u168C"], /* OGHAM LETTER GORT */
+ ["\u168D", "\u168D"], /* OGHAM LETTER NGEADAL */
+ ["\u168E", "\u168E"], /* OGHAM LETTER STRAIF */
+ ["\u168F", "\u168F"], /* OGHAM LETTER RUIS */
+ ["\u1690", "\u1690"], /* OGHAM LETTER AILM */
+ ["\u1691", "\u1691"], /* OGHAM LETTER ONN */
+ ["\u1692", "\u1692"], /* OGHAM LETTER UR */
+ ["\u1693", "\u1693"], /* OGHAM LETTER EADHADH */
+ ["\u1694", "\u1694"], /* OGHAM LETTER IODHADH */
+ ["\u1695", "\u1695"], /* OGHAM LETTER EABHADH */
+ ["\u1696", "\u1696"], /* OGHAM LETTER OR */
+ ["\u1697", "\u1697"], /* OGHAM LETTER UILLEANN */
+ ["\u1698", "\u1698"], /* OGHAM LETTER IFIN */
+ ["\u1699", "\u1699"], /* OGHAM LETTER EAMHANCHOLL */
+ ["\u169A", "\u169A"], /* OGHAM LETTER PEITH */
+ ["\u169B", "\u169B"], /* OGHAM FEATHER MARK */
+ ["\u169C", "\u169C"], /* OGHAM REVERSED FEATHER MARK */
+ ["\u169D", "\u169D"],
+ ["\u169E", "\u169E"],
+ ["\u169F", "\u169F"],
+ ["\u16A0", "\u16A0"], /* RUNIC LETTER FEHU FEOH FE F */
+ ["\u16A1", "\u16A1"], /* RUNIC LETTER V */
+ ["\u16A2", "\u16A2"], /* RUNIC LETTER URUZ UR U */
+ ["\u16A3", "\u16A3"], /* RUNIC LETTER YR */
+ ["\u16A4", "\u16A4"], /* RUNIC LETTER Y */
+ ["\u16A5", "\u16A5"], /* RUNIC LETTER W */
+ ["\u16A6", "\u16A6"], /* RUNIC LETTER THURISAZ THURS THORN */
+ ["\u16A7", "\u16A7"], /* RUNIC LETTER ETH */
+ ["\u16A8", "\u16A8"], /* RUNIC LETTER ANSUZ A */
+ ["\u16A9", "\u16A9"], /* RUNIC LETTER OS O */
+ ["\u16AA", "\u16AA"], /* RUNIC LETTER AC A */
+ ["\u16AB", "\u16AB"], /* RUNIC LETTER AESC */
+ ["\u16AC", "\u16AC"], /* RUNIC LETTER LONG-BRANCH-OSS O */
+ ["\u16AD", "\u16AD"], /* RUNIC LETTER SHORT-TWIG-OSS O */
+ ["\u16AE", "\u16AE"], /* RUNIC LETTER O */
+ ["\u16AF", "\u16AF"], /* RUNIC LETTER OE */
+ ["\u16B0", "\u16B0"], /* RUNIC LETTER ON */
+ ["\u16B1", "\u16B1"], /* RUNIC LETTER RAIDO RAD REID R */
+ ["\u16B2", "\u16B2"], /* RUNIC LETTER KAUNA */
+ ["\u16B3", "\u16B3"], /* RUNIC LETTER CEN */
+ ["\u16B4", "\u16B4"], /* RUNIC LETTER KAUN K */
+ ["\u16B5", "\u16B5"], /* RUNIC LETTER G */
+ ["\u16B6", "\u16B6"], /* RUNIC LETTER ENG */
+ ["\u16B7", "\u16B7"], /* RUNIC LETTER GEBO GYFU G */
+ ["\u16B8", "\u16B8"], /* RUNIC LETTER GAR */
+ ["\u16B9", "\u16B9"], /* RUNIC LETTER WUNJO WYNN W */
+ ["\u16BA", "\u16BA"], /* RUNIC LETTER HAGLAZ H */
+ ["\u16BB", "\u16BB"], /* RUNIC LETTER HAEGL H */
+ ["\u16BC", "\u16BC"], /* RUNIC LETTER LONG-BRANCH-HAGALL H */
+ ["\u16BD", "\u16BD"], /* RUNIC LETTER SHORT-TWIG-HAGALL H */
+ ["\u16BE", "\u16BE"], /* RUNIC LETTER NAUDIZ NYD NAUD N */
+ ["\u16BF", "\u16BF"], /* RUNIC LETTER SHORT-TWIG-NAUD N */
+ ["\u16C0", "\u16C0"], /* RUNIC LETTER DOTTED-N */
+ ["\u16C1", "\u16C1"], /* RUNIC LETTER ISAZ IS ISS I */
+ ["\u16C2", "\u16C2"], /* RUNIC LETTER E */
+ ["\u16C3", "\u16C3"], /* RUNIC LETTER JERAN J */
+ ["\u16C4", "\u16C4"], /* RUNIC LETTER GER */
+ ["\u16C5", "\u16C5"], /* RUNIC LETTER LONG-BRANCH-AR AE */
+ ["\u16C6", "\u16C6"], /* RUNIC LETTER SHORT-TWIG-AR A */
+ ["\u16C7", "\u16C7"], /* RUNIC LETTER IWAZ EOH */
+ ["\u16C8", "\u16C8"], /* RUNIC LETTER PERTHO PEORTH P */
+ ["\u16C9", "\u16C9"], /* RUNIC LETTER ALGIZ EOLHX */
+ ["\u16CA", "\u16CA"], /* RUNIC LETTER SOWILO S */
+ ["\u16CB", "\u16CB"], /* RUNIC LETTER SIGEL LONG-BRANCH-SOL S */
+ ["\u16CC", "\u16CC"], /* RUNIC LETTER SHORT-TWIG-SOL S */
+ ["\u16CD", "\u16CD"], /* RUNIC LETTER C */
+ ["\u16CE", "\u16CE"], /* RUNIC LETTER Z */
+ ["\u16CF", "\u16CF"], /* RUNIC LETTER TIWAZ TIR TYR T */
+ ["\u16D0", "\u16D0"], /* RUNIC LETTER SHORT-TWIG-TYR T */
+ ["\u16D1", "\u16D1"], /* RUNIC LETTER D */
+ ["\u16D2", "\u16D2"], /* RUNIC LETTER BERKANAN BEORC BJARKAN B */
+ ["\u16D3", "\u16D3"], /* RUNIC LETTER SHORT-TWIG-BJARKAN B */
+ ["\u16D4", "\u16D4"], /* RUNIC LETTER DOTTED-P */
+ ["\u16D5", "\u16D5"], /* RUNIC LETTER OPEN-P */
+ ["\u16D6", "\u16D6"], /* RUNIC LETTER EHWAZ EH E */
+ ["\u16D7", "\u16D7"], /* RUNIC LETTER MANNAZ MAN M */
+ ["\u16D8", "\u16D8"], /* RUNIC LETTER LONG-BRANCH-MADR M */
+ ["\u16D9", "\u16D9"], /* RUNIC LETTER SHORT-TWIG-MADR M */
+ ["\u16DA", "\u16DA"], /* RUNIC LETTER LAUKAZ LAGU LOGR L */
+ ["\u16DB", "\u16DB"], /* RUNIC LETTER DOTTED-L */
+ ["\u16DC", "\u16DC"], /* RUNIC LETTER INGWAZ */
+ ["\u16DD", "\u16DD"], /* RUNIC LETTER ING */
+ ["\u16DE", "\u16DE"], /* RUNIC LETTER DAGAZ DAEG D */
+ ["\u16DF", "\u16DF"], /* RUNIC LETTER OTHALAN ETHEL O */
+ ["\u16E0", "\u16E0"], /* RUNIC LETTER EAR */
+ ["\u16E1", "\u16E1"], /* RUNIC LETTER IOR */
+ ["\u16E2", "\u16E2"], /* RUNIC LETTER CWEORTH */
+ ["\u16E3", "\u16E3"], /* RUNIC LETTER CALC */
+ ["\u16E4", "\u16E4"], /* RUNIC LETTER CEALC */
+ ["\u16E5", "\u16E5"], /* RUNIC LETTER STAN */
+ ["\u16E6", "\u16E6"], /* RUNIC LETTER LONG-BRANCH-YR */
+ ["\u16E7", "\u16E7"], /* RUNIC LETTER SHORT-TWIG-YR */
+ ["\u16E8", "\u16E8"], /* RUNIC LETTER ICELANDIC-YR */
+ ["\u16E9", "\u16E9"], /* RUNIC LETTER Q */
+ ["\u16EA", "\u16EA"], /* RUNIC LETTER X */
+ ["\u16EB", "\u16EB"], /* RUNIC SINGLE PUNCTUATION */
+ ["\u16EC", "\u16EC"], /* RUNIC MULTIPLE PUNCTUATION */
+ ["\u16ED", "\u16ED"], /* RUNIC CROSS PUNCTUATION */
+ ["\u16EE", "\u16EE"], /* RUNIC ARLAUG SYMBOL */
+ ["\u16EF", "\u16EF"], /* RUNIC TVIMADUR SYMBOL */
+ ["\u16F0", "\u16F0"], /* RUNIC BELGTHOR SYMBOL */
+ ["\u16F1", "\u16F1"], /* RUNIC LETTER K */
+ ["\u16F2", "\u16F2"], /* RUNIC LETTER SH */
+ ["\u16F3", "\u16F3"], /* RUNIC LETTER OO */
+ ["\u16F4", "\u16F4"], /* RUNIC LETTER FRANKS CASKET OS */
+ ["\u16F5", "\u16F5"], /* RUNIC LETTER FRANKS CASKET IS */
+ ["\u16F6", "\u16F6"], /* RUNIC LETTER FRANKS CASKET EH */
+ ["\u16F7", "\u16F7"], /* RUNIC LETTER FRANKS CASKET AC */
+ ["\u16F8", "\u16F8"], /* RUNIC LETTER FRANKS CASKET AESC */
+ ["\u16F9", "\u16F9"],
+ ["\u16FA", "\u16FA"],
+ ["\u16FB", "\u16FB"],
+ ["\u16FC", "\u16FC"],
+ ["\u16FD", "\u16FD"],
+ ["\u16FE", "\u16FE"],
+ ["\u16FF", "\u16FF"],
+ ["\u1700", "\u1700"], /* TAGALOG LETTER A */
+ ["\u1701", "\u1701"], /* TAGALOG LETTER I */
+ ["\u1702", "\u1702"], /* TAGALOG LETTER U */
+ ["\u1703", "\u1703"], /* TAGALOG LETTER KA */
+ ["\u1704", "\u1704"], /* TAGALOG LETTER GA */
+ ["\u1705", "\u1705"], /* TAGALOG LETTER NGA */
+ ["\u1706", "\u1706"], /* TAGALOG LETTER TA */
+ ["\u1707", "\u1707"], /* TAGALOG LETTER DA */
+ ["\u1708", "\u1708"], /* TAGALOG LETTER NA */
+ ["\u1709", "\u1709"], /* TAGALOG LETTER PA */
+ ["\u170A", "\u170A"], /* TAGALOG LETTER BA */
+ ["\u170B", "\u170B"], /* TAGALOG LETTER MA */
+ ["\u170C", "\u170C"], /* TAGALOG LETTER YA */
+ ["\u170D", "\u170D"],
+ ["\u170E", "\u170E"], /* TAGALOG LETTER LA */
+ ["\u170F", "\u170F"], /* TAGALOG LETTER WA */
+ ["\u1710", "\u1710"], /* TAGALOG LETTER SA */
+ ["\u1711", "\u1711"], /* TAGALOG LETTER HA */
+ ["\u1712", "\u1712"], /* TAGALOG VOWEL SIGN I */
+ ["\u1713", "\u1713"], /* TAGALOG VOWEL SIGN U */
+ ["\u1714", "\u1714"], /* TAGALOG SIGN VIRAMA */
+ ["\u1715", "\u1715"],
+ ["\u1716", "\u1716"],
+ ["\u1717", "\u1717"],
+ ["\u1718", "\u1718"],
+ ["\u1719", "\u1719"],
+ ["\u171A", "\u171A"],
+ ["\u171B", "\u171B"],
+ ["\u171C", "\u171C"],
+ ["\u171D", "\u171D"],
+ ["\u171E", "\u171E"],
+ ["\u171F", "\u171F"],
+ ["\u1720", "\u1720"], /* HANUNOO LETTER A */
+ ["\u1721", "\u1721"], /* HANUNOO LETTER I */
+ ["\u1722", "\u1722"], /* HANUNOO LETTER U */
+ ["\u1723", "\u1723"], /* HANUNOO LETTER KA */
+ ["\u1724", "\u1724"], /* HANUNOO LETTER GA */
+ ["\u1725", "\u1725"], /* HANUNOO LETTER NGA */
+ ["\u1726", "\u1726"], /* HANUNOO LETTER TA */
+ ["\u1727", "\u1727"], /* HANUNOO LETTER DA */
+ ["\u1728", "\u1728"], /* HANUNOO LETTER NA */
+ ["\u1729", "\u1729"], /* HANUNOO LETTER PA */
+ ["\u172A", "\u172A"], /* HANUNOO LETTER BA */
+ ["\u172B", "\u172B"], /* HANUNOO LETTER MA */
+ ["\u172C", "\u172C"], /* HANUNOO LETTER YA */
+ ["\u172D", "\u172D"], /* HANUNOO LETTER RA */
+ ["\u172E", "\u172E"], /* HANUNOO LETTER LA */
+ ["\u172F", "\u172F"], /* HANUNOO LETTER WA */
+ ["\u1730", "\u1730"], /* HANUNOO LETTER SA */
+ ["\u1731", "\u1731"], /* HANUNOO LETTER HA */
+ ["\u1732", "\u1732"], /* HANUNOO VOWEL SIGN I */
+ ["\u1733", "\u1733"], /* HANUNOO VOWEL SIGN U */
+ ["\u1734", "\u1734"], /* HANUNOO SIGN PAMUDPOD */
+ ["\u1735", "\u1735"], /* PHILIPPINE SINGLE PUNCTUATION */
+ ["\u1736", "\u1736"], /* PHILIPPINE DOUBLE PUNCTUATION */
+ ["\u1737", "\u1737"],
+ ["\u1738", "\u1738"],
+ ["\u1739", "\u1739"],
+ ["\u173A", "\u173A"],
+ ["\u173B", "\u173B"],
+ ["\u173C", "\u173C"],
+ ["\u173D", "\u173D"],
+ ["\u173E", "\u173E"],
+ ["\u173F", "\u173F"],
+ ["\u1740", "\u1740"], /* BUHID LETTER A */
+ ["\u1741", "\u1741"], /* BUHID LETTER I */
+ ["\u1742", "\u1742"], /* BUHID LETTER U */
+ ["\u1743", "\u1743"], /* BUHID LETTER KA */
+ ["\u1744", "\u1744"], /* BUHID LETTER GA */
+ ["\u1745", "\u1745"], /* BUHID LETTER NGA */
+ ["\u1746", "\u1746"], /* BUHID LETTER TA */
+ ["\u1747", "\u1747"], /* BUHID LETTER DA */
+ ["\u1748", "\u1748"], /* BUHID LETTER NA */
+ ["\u1749", "\u1749"], /* BUHID LETTER PA */
+ ["\u174A", "\u174A"], /* BUHID LETTER BA */
+ ["\u174B", "\u174B"], /* BUHID LETTER MA */
+ ["\u174C", "\u174C"], /* BUHID LETTER YA */
+ ["\u174D", "\u174D"], /* BUHID LETTER RA */
+ ["\u174E", "\u174E"], /* BUHID LETTER LA */
+ ["\u174F", "\u174F"], /* BUHID LETTER WA */
+ ["\u1750", "\u1750"], /* BUHID LETTER SA */
+ ["\u1751", "\u1751"], /* BUHID LETTER HA */
+ ["\u1752", "\u1752"], /* BUHID VOWEL SIGN I */
+ ["\u1753", "\u1753"], /* BUHID VOWEL SIGN U */
+ ["\u1754", "\u1754"],
+ ["\u1755", "\u1755"],
+ ["\u1756", "\u1756"],
+ ["\u1757", "\u1757"],
+ ["\u1758", "\u1758"],
+ ["\u1759", "\u1759"],
+ ["\u175A", "\u175A"],
+ ["\u175B", "\u175B"],
+ ["\u175C", "\u175C"],
+ ["\u175D", "\u175D"],
+ ["\u175E", "\u175E"],
+ ["\u175F", "\u175F"],
+ ["\u1760", "\u1760"], /* TAGBANWA LETTER A */
+ ["\u1761", "\u1761"], /* TAGBANWA LETTER I */
+ ["\u1762", "\u1762"], /* TAGBANWA LETTER U */
+ ["\u1763", "\u1763"], /* TAGBANWA LETTER KA */
+ ["\u1764", "\u1764"], /* TAGBANWA LETTER GA */
+ ["\u1765", "\u1765"], /* TAGBANWA LETTER NGA */
+ ["\u1766", "\u1766"], /* TAGBANWA LETTER TA */
+ ["\u1767", "\u1767"], /* TAGBANWA LETTER DA */
+ ["\u1768", "\u1768"], /* TAGBANWA LETTER NA */
+ ["\u1769", "\u1769"], /* TAGBANWA LETTER PA */
+ ["\u176A", "\u176A"], /* TAGBANWA LETTER BA */
+ ["\u176B", "\u176B"], /* TAGBANWA LETTER MA */
+ ["\u176C", "\u176C"], /* TAGBANWA LETTER YA */
+ ["\u176D", "\u176D"],
+ ["\u176E", "\u176E"], /* TAGBANWA LETTER LA */
+ ["\u176F", "\u176F"], /* TAGBANWA LETTER WA */
+ ["\u1770", "\u1770"], /* TAGBANWA LETTER SA */
+ ["\u1771", "\u1771"],
+ ["\u1772", "\u1772"], /* TAGBANWA VOWEL SIGN I */
+ ["\u1773", "\u1773"], /* TAGBANWA VOWEL SIGN U */
+ ["\u1774", "\u1774"],
+ ["\u1775", "\u1775"],
+ ["\u1776", "\u1776"],
+ ["\u1777", "\u1777"],
+ ["\u1778", "\u1778"],
+ ["\u1779", "\u1779"],
+ ["\u177A", "\u177A"],
+ ["\u177B", "\u177B"],
+ ["\u177C", "\u177C"],
+ ["\u177D", "\u177D"],
+ ["\u177E", "\u177E"],
+ ["\u177F", "\u177F"],
+ ["\u1780", "\u1780"], /* KHMER LETTER KA */
+ ["\u1781", "\u1781"], /* KHMER LETTER KHA */
+ ["\u1782", "\u1782"], /* KHMER LETTER KO */
+ ["\u1783", "\u1783"], /* KHMER LETTER KHO */
+ ["\u1784", "\u1784"], /* KHMER LETTER NGO */
+ ["\u1785", "\u1785"], /* KHMER LETTER CA */
+ ["\u1786", "\u1786"], /* KHMER LETTER CHA */
+ ["\u1787", "\u1787"], /* KHMER LETTER CO */
+ ["\u1788", "\u1788"], /* KHMER LETTER CHO */
+ ["\u1789", "\u1789"], /* KHMER LETTER NYO */
+ ["\u178A", "\u178A"], /* KHMER LETTER DA */
+ ["\u178B", "\u178B"], /* KHMER LETTER TTHA */
+ ["\u178C", "\u178C"], /* KHMER LETTER DO */
+ ["\u178D", "\u178D"], /* KHMER LETTER TTHO */
+ ["\u178E", "\u178E"], /* KHMER LETTER NNO */
+ ["\u178F", "\u178F"], /* KHMER LETTER TA */
+ ["\u1790", "\u1790"], /* KHMER LETTER THA */
+ ["\u1791", "\u1791"], /* KHMER LETTER TO */
+ ["\u1792", "\u1792"], /* KHMER LETTER THO */
+ ["\u1793", "\u1793"], /* KHMER LETTER NO */
+ ["\u1794", "\u1794"], /* KHMER LETTER BA */
+ ["\u1795", "\u1795"], /* KHMER LETTER PHA */
+ ["\u1796", "\u1796"], /* KHMER LETTER PO */
+ ["\u1797", "\u1797"], /* KHMER LETTER PHO */
+ ["\u1798", "\u1798"], /* KHMER LETTER MO */
+ ["\u1799", "\u1799"], /* KHMER LETTER YO */
+ ["\u179A", "\u179A"], /* KHMER LETTER RO */
+ ["\u179B", "\u179B"], /* KHMER LETTER LO */
+ ["\u179C", "\u179C"], /* KHMER LETTER VO */
+ ["\u179D", "\u179D"], /* KHMER LETTER SHA */
+ ["\u179E", "\u179E"], /* KHMER LETTER SSO */
+ ["\u179F", "\u179F"], /* KHMER LETTER SA */
+ ["\u17A0", "\u17A0"], /* KHMER LETTER HA */
+ ["\u17A1", "\u17A1"], /* KHMER LETTER LA */
+ ["\u17A2", "\u17A2"], /* KHMER LETTER QA */
+ ["\u17A3", "\u17A3"], /* KHMER INDEPENDENT VOWEL QAQ */
+ ["\u17A4", "\u17A4"], /* KHMER INDEPENDENT VOWEL QAA */
+ ["\u17A5", "\u17A5"], /* KHMER INDEPENDENT VOWEL QI */
+ ["\u17A6", "\u17A6"], /* KHMER INDEPENDENT VOWEL QII */
+ ["\u17A7", "\u17A7"], /* KHMER INDEPENDENT VOWEL QU */
+ ["\u17A8", "\u17A8"], /* KHMER INDEPENDENT VOWEL QUK */
+ ["\u17A9", "\u17A9"], /* KHMER INDEPENDENT VOWEL QUU */
+ ["\u17AA", "\u17AA"], /* KHMER INDEPENDENT VOWEL QUUV */
+ ["\u17AB", "\u17AB"], /* KHMER INDEPENDENT VOWEL RY */
+ ["\u17AC", "\u17AC"], /* KHMER INDEPENDENT VOWEL RYY */
+ ["\u17AD", "\u17AD"], /* KHMER INDEPENDENT VOWEL LY */
+ ["\u17AE", "\u17AE"], /* KHMER INDEPENDENT VOWEL LYY */
+ ["\u17AF", "\u17AF"], /* KHMER INDEPENDENT VOWEL QE */
+ ["\u17B0", "\u17B0"], /* KHMER INDEPENDENT VOWEL QAI */
+ ["\u17B1", "\u17B1"], /* KHMER INDEPENDENT VOWEL QOO TYPE ONE */
+ ["\u17B2", "\u17B2"], /* KHMER INDEPENDENT VOWEL QOO TYPE TWO */
+ ["\u17B3", "\u17B3"], /* KHMER INDEPENDENT VOWEL QAU */
+ ["\u17B4", "\u17B4"], /* KHMER VOWEL INHERENT AQ */
+ ["\u17B5", "\u17B5"], /* KHMER VOWEL INHERENT AA */
+ ["\u17B6", "\u17B6"], /* KHMER VOWEL SIGN AA */
+ ["\u17B7", "\u17B7"], /* KHMER VOWEL SIGN I */
+ ["\u17B8", "\u17B8"], /* KHMER VOWEL SIGN II */
+ ["\u17B9", "\u17B9"], /* KHMER VOWEL SIGN Y */
+ ["\u17BA", "\u17BA"], /* KHMER VOWEL SIGN YY */
+ ["\u17BB", "\u17BB"], /* KHMER VOWEL SIGN U */
+ ["\u17BC", "\u17BC"], /* KHMER VOWEL SIGN UU */
+ ["\u17BD", "\u17BD"], /* KHMER VOWEL SIGN UA */
+ ["\u17BE", "\u17BE"], /* KHMER VOWEL SIGN OE */
+ ["\u17BF", "\u17BF"], /* KHMER VOWEL SIGN YA */
+ ["\u17C0", "\u17C0"], /* KHMER VOWEL SIGN IE */
+ ["\u17C1", "\u17C1"], /* KHMER VOWEL SIGN E */
+ ["\u17C2", "\u17C2"], /* KHMER VOWEL SIGN AE */
+ ["\u17C3", "\u17C3"], /* KHMER VOWEL SIGN AI */
+ ["\u17C4", "\u17C4"], /* KHMER VOWEL SIGN OO */
+ ["\u17C5", "\u17C5"], /* KHMER VOWEL SIGN AU */
+ ["\u17C6", "\u17C6"], /* KHMER SIGN NIKAHIT */
+ ["\u17C7", "\u17C7"], /* KHMER SIGN REAHMUK */
+ ["\u17C8", "\u17C8"], /* KHMER SIGN YUUKALEAPINTU */
+ ["\u17C9", "\u17C9"], /* KHMER SIGN MUUSIKATOAN */
+ ["\u17CA", "\u17CA"], /* KHMER SIGN TRIISAP */
+ ["\u17CB", "\u17CB"], /* KHMER SIGN BANTOC */
+ ["\u17CC", "\u17CC"], /* KHMER SIGN ROBAT */
+ ["\u17CD", "\u17CD"], /* KHMER SIGN TOANDAKHIAT */
+ ["\u17CE", "\u17CE"], /* KHMER SIGN KAKABAT */
+ ["\u17CF", "\u17CF"], /* KHMER SIGN AHSDA */
+ ["\u17D0", "\u17D0"], /* KHMER SIGN SAMYOK SANNYA */
+ ["\u17D1", "\u17D1"], /* KHMER SIGN VIRIAM */
+ ["\u17D2", "\u17D2"], /* KHMER SIGN COENG */
+ ["\u17D3", "\u17D3"], /* KHMER SIGN BATHAMASAT */
+ ["\u17D4", "\u17D4"], /* KHMER SIGN KHAN */
+ ["\u17D5", "\u17D5"], /* KHMER SIGN BARIYOOSAN */
+ ["\u17D6", "\u17D6"], /* KHMER SIGN CAMNUC PII KUUH */
+ ["\u17D7", "\u17D7"], /* KHMER SIGN LEK TOO */
+ ["\u17D8", "\u17D8"], /* KHMER SIGN BEYYAL */
+ ["\u17D9", "\u17D9"], /* KHMER SIGN PHNAEK MUAN */
+ ["\u17DA", "\u17DA"], /* KHMER SIGN KOOMUUT */
+ ["\u17DB", "\u17DB"], /* KHMER CURRENCY SYMBOL RIEL */
+ ["\u17DC", "\u17DC"], /* KHMER SIGN AVAKRAHASANYA */
+ ["\u17DD", "\u17DD"], /* KHMER SIGN ATTHACAN */
+ ["\u17DE", "\u17DE"],
+ ["\u17DF", "\u17DF"],
+ ["\u17E0", "\u17E0"], /* KHMER DIGIT ZERO */
+ ["\u17E1", "\u17E1"], /* KHMER DIGIT ONE */
+ ["\u17E2", "\u17E2"], /* KHMER DIGIT TWO */
+ ["\u17E3", "\u17E3"], /* KHMER DIGIT THREE */
+ ["\u17E4", "\u17E4"], /* KHMER DIGIT FOUR */
+ ["\u17E5", "\u17E5"], /* KHMER DIGIT FIVE */
+ ["\u17E6", "\u17E6"], /* KHMER DIGIT SIX */
+ ["\u17E7", "\u17E7"], /* KHMER DIGIT SEVEN */
+ ["\u17E8", "\u17E8"], /* KHMER DIGIT EIGHT */
+ ["\u17E9", "\u17E9"], /* KHMER DIGIT NINE */
+ ["\u17EA", "\u17EA"],
+ ["\u17EB", "\u17EB"],
+ ["\u17EC", "\u17EC"],
+ ["\u17ED", "\u17ED"],
+ ["\u17EE", "\u17EE"],
+ ["\u17EF", "\u17EF"],
+ ["\u17F0", "\u17F0"], /* KHMER SYMBOL LEK ATTAK SON */
+ ["\u17F1", "\u17F1"], /* KHMER SYMBOL LEK ATTAK MUOY */
+ ["\u17F2", "\u17F2"], /* KHMER SYMBOL LEK ATTAK PII */
+ ["\u17F3", "\u17F3"], /* KHMER SYMBOL LEK ATTAK BEI */
+ ["\u17F4", "\u17F4"], /* KHMER SYMBOL LEK ATTAK BUON */
+ ["\u17F5", "\u17F5"], /* KHMER SYMBOL LEK ATTAK PRAM */
+ ["\u17F6", "\u17F6"], /* KHMER SYMBOL LEK ATTAK PRAM-MUOY */
+ ["\u17F7", "\u17F7"], /* KHMER SYMBOL LEK ATTAK PRAM-PII */
+ ["\u17F8", "\u17F8"], /* KHMER SYMBOL LEK ATTAK PRAM-BEI */
+ ["\u17F9", "\u17F9"], /* KHMER SYMBOL LEK ATTAK PRAM-BUON */
+ ["\u17FA", "\u17FA"],
+ ["\u17FB", "\u17FB"],
+ ["\u17FC", "\u17FC"],
+ ["\u17FD", "\u17FD"],
+ ["\u17FE", "\u17FE"],
+ ["\u17FF", "\u17FF"],
+ ["\u1800", "\u1800"], /* MONGOLIAN BIRGA */
+ ["\u1801", "\u1801"], /* MONGOLIAN ELLIPSIS */
+ ["\u1802", "\u1802"], /* MONGOLIAN COMMA */
+ ["\u1803", "\u1803"], /* MONGOLIAN FULL STOP */
+ ["\u1804", "\u1804"], /* MONGOLIAN COLON */
+ ["\u1805", "\u1805"], /* MONGOLIAN FOUR DOTS */
+ ["\u1806", "\u1806"], /* MONGOLIAN TODO SOFT HYPHEN */
+ ["\u1807", "\u1807"], /* MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER */
+ ["\u1808", "\u1808"], /* MONGOLIAN MANCHU COMMA */
+ ["\u1809", "\u1809"], /* MONGOLIAN MANCHU FULL STOP */
+ ["\u180A", "\u180A"], /* MONGOLIAN NIRUGU */
+ ["\u180B", "\u180B"], /* MONGOLIAN FREE VARIATION SELECTOR ONE */
+ ["\u180C", "\u180C"], /* MONGOLIAN FREE VARIATION SELECTOR TWO */
+ ["\u180D", "\u180D"], /* MONGOLIAN FREE VARIATION SELECTOR THREE */
+ ["\u180E", "\u180E"], /* MONGOLIAN VOWEL SEPARATOR */
+ ["\u180F", "\u180F"],
+ ["\u1810", "\u1810"], /* MONGOLIAN DIGIT ZERO */
+ ["\u1811", "\u1811"], /* MONGOLIAN DIGIT ONE */
+ ["\u1812", "\u1812"], /* MONGOLIAN DIGIT TWO */
+ ["\u1813", "\u1813"], /* MONGOLIAN DIGIT THREE */
+ ["\u1814", "\u1814"], /* MONGOLIAN DIGIT FOUR */
+ ["\u1815", "\u1815"], /* MONGOLIAN DIGIT FIVE */
+ ["\u1816", "\u1816"], /* MONGOLIAN DIGIT SIX */
+ ["\u1817", "\u1817"], /* MONGOLIAN DIGIT SEVEN */
+ ["\u1818", "\u1818"], /* MONGOLIAN DIGIT EIGHT */
+ ["\u1819", "\u1819"], /* MONGOLIAN DIGIT NINE */
+ ["\u181A", "\u181A"],
+ ["\u181B", "\u181B"],
+ ["\u181C", "\u181C"],
+ ["\u181D", "\u181D"],
+ ["\u181E", "\u181E"],
+ ["\u181F", "\u181F"],
+ ["\u1820", "\u1820"], /* MONGOLIAN LETTER A */
+ ["\u1821", "\u1821"], /* MONGOLIAN LETTER E */
+ ["\u1822", "\u1822"], /* MONGOLIAN LETTER I */
+ ["\u1823", "\u1823"], /* MONGOLIAN LETTER O */
+ ["\u1824", "\u1824"], /* MONGOLIAN LETTER U */
+ ["\u1825", "\u1825"], /* MONGOLIAN LETTER OE */
+ ["\u1826", "\u1826"], /* MONGOLIAN LETTER UE */
+ ["\u1827", "\u1827"], /* MONGOLIAN LETTER EE */
+ ["\u1828", "\u1828"], /* MONGOLIAN LETTER NA */
+ ["\u1829", "\u1829"], /* MONGOLIAN LETTER ANG */
+ ["\u182A", "\u182A"], /* MONGOLIAN LETTER BA */
+ ["\u182B", "\u182B"], /* MONGOLIAN LETTER PA */
+ ["\u182C", "\u182C"], /* MONGOLIAN LETTER QA */
+ ["\u182D", "\u182D"], /* MONGOLIAN LETTER GA */
+ ["\u182E", "\u182E"], /* MONGOLIAN LETTER MA */
+ ["\u182F", "\u182F"], /* MONGOLIAN LETTER LA */
+ ["\u1830", "\u1830"], /* MONGOLIAN LETTER SA */
+ ["\u1831", "\u1831"], /* MONGOLIAN LETTER SHA */
+ ["\u1832", "\u1832"], /* MONGOLIAN LETTER TA */
+ ["\u1833", "\u1833"], /* MONGOLIAN LETTER DA */
+ ["\u1834", "\u1834"], /* MONGOLIAN LETTER CHA */
+ ["\u1835", "\u1835"], /* MONGOLIAN LETTER JA */
+ ["\u1836", "\u1836"], /* MONGOLIAN LETTER YA */
+ ["\u1837", "\u1837"], /* MONGOLIAN LETTER RA */
+ ["\u1838", "\u1838"], /* MONGOLIAN LETTER WA */
+ ["\u1839", "\u1839"], /* MONGOLIAN LETTER FA */
+ ["\u183A", "\u183A"], /* MONGOLIAN LETTER KA */
+ ["\u183B", "\u183B"], /* MONGOLIAN LETTER KHA */
+ ["\u183C", "\u183C"], /* MONGOLIAN LETTER TSA */
+ ["\u183D", "\u183D"], /* MONGOLIAN LETTER ZA */
+ ["\u183E", "\u183E"], /* MONGOLIAN LETTER HAA */
+ ["\u183F", "\u183F"], /* MONGOLIAN LETTER ZRA */
+ ["\u1840", "\u1840"], /* MONGOLIAN LETTER LHA */
+ ["\u1841", "\u1841"], /* MONGOLIAN LETTER ZHI */
+ ["\u1842", "\u1842"], /* MONGOLIAN LETTER CHI */
+ ["\u1843", "\u1843"], /* MONGOLIAN LETTER TODO LONG VOWEL SIGN */
+ ["\u1844", "\u1844"], /* MONGOLIAN LETTER TODO E */
+ ["\u1845", "\u1845"], /* MONGOLIAN LETTER TODO I */
+ ["\u1846", "\u1846"], /* MONGOLIAN LETTER TODO O */
+ ["\u1847", "\u1847"], /* MONGOLIAN LETTER TODO U */
+ ["\u1848", "\u1848"], /* MONGOLIAN LETTER TODO OE */
+ ["\u1849", "\u1849"], /* MONGOLIAN LETTER TODO UE */
+ ["\u184A", "\u184A"], /* MONGOLIAN LETTER TODO ANG */
+ ["\u184B", "\u184B"], /* MONGOLIAN LETTER TODO BA */
+ ["\u184C", "\u184C"], /* MONGOLIAN LETTER TODO PA */
+ ["\u184D", "\u184D"], /* MONGOLIAN LETTER TODO QA */
+ ["\u184E", "\u184E"], /* MONGOLIAN LETTER TODO GA */
+ ["\u184F", "\u184F"], /* MONGOLIAN LETTER TODO MA */
+ ["\u1850", "\u1850"], /* MONGOLIAN LETTER TODO TA */
+ ["\u1851", "\u1851"], /* MONGOLIAN LETTER TODO DA */
+ ["\u1852", "\u1852"], /* MONGOLIAN LETTER TODO CHA */
+ ["\u1853", "\u1853"], /* MONGOLIAN LETTER TODO JA */
+ ["\u1854", "\u1854"], /* MONGOLIAN LETTER TODO TSA */
+ ["\u1855", "\u1855"], /* MONGOLIAN LETTER TODO YA */
+ ["\u1856", "\u1856"], /* MONGOLIAN LETTER TODO WA */
+ ["\u1857", "\u1857"], /* MONGOLIAN LETTER TODO KA */
+ ["\u1858", "\u1858"], /* MONGOLIAN LETTER TODO GAA */
+ ["\u1859", "\u1859"], /* MONGOLIAN LETTER TODO HAA */
+ ["\u185A", "\u185A"], /* MONGOLIAN LETTER TODO JIA */
+ ["\u185B", "\u185B"], /* MONGOLIAN LETTER TODO NIA */
+ ["\u185C", "\u185C"], /* MONGOLIAN LETTER TODO DZA */
+ ["\u185D", "\u185D"], /* MONGOLIAN LETTER SIBE E */
+ ["\u185E", "\u185E"], /* MONGOLIAN LETTER SIBE I */
+ ["\u185F", "\u185F"], /* MONGOLIAN LETTER SIBE IY */
+ ["\u1860", "\u1860"], /* MONGOLIAN LETTER SIBE UE */
+ ["\u1861", "\u1861"], /* MONGOLIAN LETTER SIBE U */
+ ["\u1862", "\u1862"], /* MONGOLIAN LETTER SIBE ANG */
+ ["\u1863", "\u1863"], /* MONGOLIAN LETTER SIBE KA */
+ ["\u1864", "\u1864"], /* MONGOLIAN LETTER SIBE GA */
+ ["\u1865", "\u1865"], /* MONGOLIAN LETTER SIBE HA */
+ ["\u1866", "\u1866"], /* MONGOLIAN LETTER SIBE PA */
+ ["\u1867", "\u1867"], /* MONGOLIAN LETTER SIBE SHA */
+ ["\u1868", "\u1868"], /* MONGOLIAN LETTER SIBE TA */
+ ["\u1869", "\u1869"], /* MONGOLIAN LETTER SIBE DA */
+ ["\u186A", "\u186A"], /* MONGOLIAN LETTER SIBE JA */
+ ["\u186B", "\u186B"], /* MONGOLIAN LETTER SIBE FA */
+ ["\u186C", "\u186C"], /* MONGOLIAN LETTER SIBE GAA */
+ ["\u186D", "\u186D"], /* MONGOLIAN LETTER SIBE HAA */
+ ["\u186E", "\u186E"], /* MONGOLIAN LETTER SIBE TSA */
+ ["\u186F", "\u186F"], /* MONGOLIAN LETTER SIBE ZA */
+ ["\u1870", "\u1870"], /* MONGOLIAN LETTER SIBE RAA */
+ ["\u1871", "\u1871"], /* MONGOLIAN LETTER SIBE CHA */
+ ["\u1872", "\u1872"], /* MONGOLIAN LETTER SIBE ZHA */
+ ["\u1873", "\u1873"], /* MONGOLIAN LETTER MANCHU I */
+ ["\u1874", "\u1874"], /* MONGOLIAN LETTER MANCHU KA */
+ ["\u1875", "\u1875"], /* MONGOLIAN LETTER MANCHU RA */
+ ["\u1876", "\u1876"], /* MONGOLIAN LETTER MANCHU FA */
+ ["\u1877", "\u1877"], /* MONGOLIAN LETTER MANCHU ZHA */
+ ["\u1878", "\u1878"], /* MONGOLIAN LETTER CHA WITH TWO DOTS */
+ ["\u1879", "\u1879"],
+ ["\u187A", "\u187A"],
+ ["\u187B", "\u187B"],
+ ["\u187C", "\u187C"],
+ ["\u187D", "\u187D"],
+ ["\u187E", "\u187E"],
+ ["\u187F", "\u187F"],
+ ["\u1880", "\u1880"], /* MONGOLIAN LETTER ALI GALI ANUSVARA ONE */
+ ["\u1881", "\u1881"], /* MONGOLIAN LETTER ALI GALI VISARGA ONE */
+ ["\u1882", "\u1882"], /* MONGOLIAN LETTER ALI GALI DAMARU */
+ ["\u1883", "\u1883"], /* MONGOLIAN LETTER ALI GALI UBADAMA */
+ ["\u1884", "\u1884"], /* MONGOLIAN LETTER ALI GALI INVERTED UBADAMA */
+ ["\u1885", "\u1885"], /* MONGOLIAN LETTER ALI GALI BALUDA */
+ ["\u1886", "\u1886"], /* MONGOLIAN LETTER ALI GALI THREE BALUDA */
+ ["\u1887", "\u1887"], /* MONGOLIAN LETTER ALI GALI A */
+ ["\u1888", "\u1888"], /* MONGOLIAN LETTER ALI GALI I */
+ ["\u1889", "\u1889"], /* MONGOLIAN LETTER ALI GALI KA */
+ ["\u188A", "\u188A"], /* MONGOLIAN LETTER ALI GALI NGA */
+ ["\u188B", "\u188B"], /* MONGOLIAN LETTER ALI GALI CA */
+ ["\u188C", "\u188C"], /* MONGOLIAN LETTER ALI GALI TTA */
+ ["\u188D", "\u188D"], /* MONGOLIAN LETTER ALI GALI TTHA */
+ ["\u188E", "\u188E"], /* MONGOLIAN LETTER ALI GALI DDA */
+ ["\u188F", "\u188F"], /* MONGOLIAN LETTER ALI GALI NNA */
+ ["\u1890", "\u1890"], /* MONGOLIAN LETTER ALI GALI TA */
+ ["\u1891", "\u1891"], /* MONGOLIAN LETTER ALI GALI DA */
+ ["\u1892", "\u1892"], /* MONGOLIAN LETTER ALI GALI PA */
+ ["\u1893", "\u1893"], /* MONGOLIAN LETTER ALI GALI PHA */
+ ["\u1894", "\u1894"], /* MONGOLIAN LETTER ALI GALI SSA */
+ ["\u1895", "\u1895"], /* MONGOLIAN LETTER ALI GALI ZHA */
+ ["\u1896", "\u1896"], /* MONGOLIAN LETTER ALI GALI ZA */
+ ["\u1897", "\u1897"], /* MONGOLIAN LETTER ALI GALI AH */
+ ["\u1898", "\u1898"], /* MONGOLIAN LETTER TODO ALI GALI TA */
+ ["\u1899", "\u1899"], /* MONGOLIAN LETTER TODO ALI GALI ZHA */
+ ["\u189A", "\u189A"], /* MONGOLIAN LETTER MANCHU ALI GALI GHA */
+ ["\u189B", "\u189B"], /* MONGOLIAN LETTER MANCHU ALI GALI NGA */
+ ["\u189C", "\u189C"], /* MONGOLIAN LETTER MANCHU ALI GALI CA */
+ ["\u189D", "\u189D"], /* MONGOLIAN LETTER MANCHU ALI GALI JHA */
+ ["\u189E", "\u189E"], /* MONGOLIAN LETTER MANCHU ALI GALI TTA */
+ ["\u189F", "\u189F"], /* MONGOLIAN LETTER MANCHU ALI GALI DDHA */
+ ["\u18A0", "\u18A0"], /* MONGOLIAN LETTER MANCHU ALI GALI TA */
+ ["\u18A1", "\u18A1"], /* MONGOLIAN LETTER MANCHU ALI GALI DHA */
+ ["\u18A2", "\u18A2"], /* MONGOLIAN LETTER MANCHU ALI GALI SSA */
+ ["\u18A3", "\u18A3"], /* MONGOLIAN LETTER MANCHU ALI GALI CYA */
+ ["\u18A4", "\u18A4"], /* MONGOLIAN LETTER MANCHU ALI GALI ZHA */
+ ["\u18A5", "\u18A5"], /* MONGOLIAN LETTER MANCHU ALI GALI ZA */
+ ["\u18A6", "\u18A6"], /* MONGOLIAN LETTER ALI GALI HALF U */
+ ["\u18A7", "\u18A7"], /* MONGOLIAN LETTER ALI GALI HALF YA */
+ ["\u18A8", "\u18A8"], /* MONGOLIAN LETTER MANCHU ALI GALI BHA */
+ ["\u18A9", "\u18A9"], /* MONGOLIAN LETTER ALI GALI DAGALGA */
+ ["\u18AA", "\u18AA"], /* MONGOLIAN LETTER MANCHU ALI GALI LHA */
+ ["\u18AB", "\u18AB"],
+ ["\u18AC", "\u18AC"],
+ ["\u18AD", "\u18AD"],
+ ["\u18AE", "\u18AE"],
+ ["\u18AF", "\u18AF"],
+ ["\u18B0", "\u18B0"], /* CANADIAN SYLLABICS OY */
+ ["\u18B1", "\u18B1"], /* CANADIAN SYLLABICS AY */
+ ["\u18B2", "\u18B2"], /* CANADIAN SYLLABICS AAY */
+ ["\u18B3", "\u18B3"], /* CANADIAN SYLLABICS WAY */
+ ["\u18B4", "\u18B4"], /* CANADIAN SYLLABICS POY */
+ ["\u18B5", "\u18B5"], /* CANADIAN SYLLABICS PAY */
+ ["\u18B6", "\u18B6"], /* CANADIAN SYLLABICS PWOY */
+ ["\u18B7", "\u18B7"], /* CANADIAN SYLLABICS TAY */
+ ["\u18B8", "\u18B8"], /* CANADIAN SYLLABICS KAY */
+ ["\u18B9", "\u18B9"], /* CANADIAN SYLLABICS KWAY */
+ ["\u18BA", "\u18BA"], /* CANADIAN SYLLABICS MAY */
+ ["\u18BB", "\u18BB"], /* CANADIAN SYLLABICS NOY */
+ ["\u18BC", "\u18BC"], /* CANADIAN SYLLABICS NAY */
+ ["\u18BD", "\u18BD"], /* CANADIAN SYLLABICS LAY */
+ ["\u18BE", "\u18BE"], /* CANADIAN SYLLABICS SOY */
+ ["\u18BF", "\u18BF"], /* CANADIAN SYLLABICS SAY */
+ ["\u18C0", "\u18C0"], /* CANADIAN SYLLABICS SHOY */
+ ["\u18C1", "\u18C1"], /* CANADIAN SYLLABICS SHAY */
+ ["\u18C2", "\u18C2"], /* CANADIAN SYLLABICS SHWOY */
+ ["\u18C3", "\u18C3"], /* CANADIAN SYLLABICS YOY */
+ ["\u18C4", "\u18C4"], /* CANADIAN SYLLABICS YAY */
+ ["\u18C5", "\u18C5"], /* CANADIAN SYLLABICS RAY */
+ ["\u18C6", "\u18C6"], /* CANADIAN SYLLABICS NWI */
+ ["\u18C7", "\u18C7"], /* CANADIAN SYLLABICS OJIBWAY NWI */
+ ["\u18C8", "\u18C8"], /* CANADIAN SYLLABICS NWII */
+ ["\u18C9", "\u18C9"], /* CANADIAN SYLLABICS OJIBWAY NWII */
+ ["\u18CA", "\u18CA"], /* CANADIAN SYLLABICS NWO */
+ ["\u18CB", "\u18CB"], /* CANADIAN SYLLABICS OJIBWAY NWO */
+ ["\u18CC", "\u18CC"], /* CANADIAN SYLLABICS NWOO */
+ ["\u18CD", "\u18CD"], /* CANADIAN SYLLABICS OJIBWAY NWOO */
+ ["\u18CE", "\u18CE"], /* CANADIAN SYLLABICS RWEE */
+ ["\u18CF", "\u18CF"], /* CANADIAN SYLLABICS RWI */
+ ["\u18D0", "\u18D0"], /* CANADIAN SYLLABICS RWII */
+ ["\u18D1", "\u18D1"], /* CANADIAN SYLLABICS RWO */
+ ["\u18D2", "\u18D2"], /* CANADIAN SYLLABICS RWOO */
+ ["\u18D3", "\u18D3"], /* CANADIAN SYLLABICS RWA */
+ ["\u18D4", "\u18D4"], /* CANADIAN SYLLABICS OJIBWAY P */
+ ["\u18D5", "\u18D5"], /* CANADIAN SYLLABICS OJIBWAY T */
+ ["\u18D6", "\u18D6"], /* CANADIAN SYLLABICS OJIBWAY K */
+ ["\u18D7", "\u18D7"], /* CANADIAN SYLLABICS OJIBWAY C */
+ ["\u18D8", "\u18D8"], /* CANADIAN SYLLABICS OJIBWAY M */
+ ["\u18D9", "\u18D9"], /* CANADIAN SYLLABICS OJIBWAY N */
+ ["\u18DA", "\u18DA"], /* CANADIAN SYLLABICS OJIBWAY S */
+ ["\u18DB", "\u18DB"], /* CANADIAN SYLLABICS OJIBWAY SH */
+ ["\u18DC", "\u18DC"], /* CANADIAN SYLLABICS EASTERN W */
+ ["\u18DD", "\u18DD"], /* CANADIAN SYLLABICS WESTERN W */
+ ["\u18DE", "\u18DE"], /* CANADIAN SYLLABICS FINAL SMALL RING */
+ ["\u18DF", "\u18DF"], /* CANADIAN SYLLABICS FINAL RAISED DOT */
+ ["\u18E0", "\u18E0"], /* CANADIAN SYLLABICS R-CREE RWE */
+ ["\u18E1", "\u18E1"], /* CANADIAN SYLLABICS WEST-CREE LOO */
+ ["\u18E2", "\u18E2"], /* CANADIAN SYLLABICS WEST-CREE LAA */
+ ["\u18E3", "\u18E3"], /* CANADIAN SYLLABICS THWE */
+ ["\u18E4", "\u18E4"], /* CANADIAN SYLLABICS THWA */
+ ["\u18E5", "\u18E5"], /* CANADIAN SYLLABICS TTHWE */
+ ["\u18E6", "\u18E6"], /* CANADIAN SYLLABICS TTHOO */
+ ["\u18E7", "\u18E7"], /* CANADIAN SYLLABICS TTHAA */
+ ["\u18E8", "\u18E8"], /* CANADIAN SYLLABICS TLHWE */
+ ["\u18E9", "\u18E9"], /* CANADIAN SYLLABICS TLHOO */
+ ["\u18EA", "\u18EA"], /* CANADIAN SYLLABICS SAYISI SHWE */
+ ["\u18EB", "\u18EB"], /* CANADIAN SYLLABICS SAYISI SHOO */
+ ["\u18EC", "\u18EC"], /* CANADIAN SYLLABICS SAYISI HOO */
+ ["\u18ED", "\u18ED"], /* CANADIAN SYLLABICS CARRIER GWU */
+ ["\u18EE", "\u18EE"], /* CANADIAN SYLLABICS CARRIER DENE GEE */
+ ["\u18EF", "\u18EF"], /* CANADIAN SYLLABICS CARRIER GAA */
+ ["\u18F0", "\u18F0"], /* CANADIAN SYLLABICS CARRIER GWA */
+ ["\u18F1", "\u18F1"], /* CANADIAN SYLLABICS SAYISI JUU */
+ ["\u18F2", "\u18F2"], /* CANADIAN SYLLABICS CARRIER JWA */
+ ["\u18F3", "\u18F3"], /* CANADIAN SYLLABICS BEAVER DENE L */
+ ["\u18F4", "\u18F4"], /* CANADIAN SYLLABICS BEAVER DENE R */
+ ["\u18F5", "\u18F5"], /* CANADIAN SYLLABICS CARRIER DENTAL S */
+ ["\u18F6", "\u18F6"],
+ ["\u18F7", "\u18F7"],
+ ["\u18F8", "\u18F8"],
+ ["\u18F9", "\u18F9"],
+ ["\u18FA", "\u18FA"],
+ ["\u18FB", "\u18FB"],
+ ["\u18FC", "\u18FC"],
+ ["\u18FD", "\u18FD"],
+ ["\u18FE", "\u18FE"],
+ ["\u18FF", "\u18FF"],
+ ["\u1900", "\u1900"], /* LIMBU VOWEL-CARRIER LETTER */
+ ["\u1901", "\u1901"], /* LIMBU LETTER KA */
+ ["\u1902", "\u1902"], /* LIMBU LETTER KHA */
+ ["\u1903", "\u1903"], /* LIMBU LETTER GA */
+ ["\u1904", "\u1904"], /* LIMBU LETTER GHA */
+ ["\u1905", "\u1905"], /* LIMBU LETTER NGA */
+ ["\u1906", "\u1906"], /* LIMBU LETTER CA */
+ ["\u1907", "\u1907"], /* LIMBU LETTER CHA */
+ ["\u1908", "\u1908"], /* LIMBU LETTER JA */
+ ["\u1909", "\u1909"], /* LIMBU LETTER JHA */
+ ["\u190A", "\u190A"], /* LIMBU LETTER YAN */
+ ["\u190B", "\u190B"], /* LIMBU LETTER TA */
+ ["\u190C", "\u190C"], /* LIMBU LETTER THA */
+ ["\u190D", "\u190D"], /* LIMBU LETTER DA */
+ ["\u190E", "\u190E"], /* LIMBU LETTER DHA */
+ ["\u190F", "\u190F"], /* LIMBU LETTER NA */
+ ["\u1910", "\u1910"], /* LIMBU LETTER PA */
+ ["\u1911", "\u1911"], /* LIMBU LETTER PHA */
+ ["\u1912", "\u1912"], /* LIMBU LETTER BA */
+ ["\u1913", "\u1913"], /* LIMBU LETTER BHA */
+ ["\u1914", "\u1914"], /* LIMBU LETTER MA */
+ ["\u1915", "\u1915"], /* LIMBU LETTER YA */
+ ["\u1916", "\u1916"], /* LIMBU LETTER RA */
+ ["\u1917", "\u1917"], /* LIMBU LETTER LA */
+ ["\u1918", "\u1918"], /* LIMBU LETTER WA */
+ ["\u1919", "\u1919"], /* LIMBU LETTER SHA */
+ ["\u191A", "\u191A"], /* LIMBU LETTER SSA */
+ ["\u191B", "\u191B"], /* LIMBU LETTER SA */
+ ["\u191C", "\u191C"], /* LIMBU LETTER HA */
+ ["\u191D", "\u191D"], /* LIMBU LETTER GYAN */
+ ["\u191E", "\u191E"], /* LIMBU LETTER TRA */
+ ["\u191F", "\u191F"],
+ ["\u1920", "\u1920"], /* LIMBU VOWEL SIGN A */
+ ["\u1921", "\u1921"], /* LIMBU VOWEL SIGN I */
+ ["\u1922", "\u1922"], /* LIMBU VOWEL SIGN U */
+ ["\u1923", "\u1923"], /* LIMBU VOWEL SIGN EE */
+ ["\u1924", "\u1924"], /* LIMBU VOWEL SIGN AI */
+ ["\u1925", "\u1925"], /* LIMBU VOWEL SIGN OO */
+ ["\u1926", "\u1926"], /* LIMBU VOWEL SIGN AU */
+ ["\u1927", "\u1927"], /* LIMBU VOWEL SIGN E */
+ ["\u1928", "\u1928"], /* LIMBU VOWEL SIGN O */
+ ["\u1929", "\u1929"], /* LIMBU SUBJOINED LETTER YA */
+ ["\u192A", "\u192A"], /* LIMBU SUBJOINED LETTER RA */
+ ["\u192B", "\u192B"], /* LIMBU SUBJOINED LETTER WA */
+ ["\u192C", "\u192C"],
+ ["\u192D", "\u192D"],
+ ["\u192E", "\u192E"],
+ ["\u192F", "\u192F"],
+ ["\u1930", "\u1930"], /* LIMBU SMALL LETTER KA */
+ ["\u1931", "\u1931"], /* LIMBU SMALL LETTER NGA */
+ ["\u1932", "\u1932"], /* LIMBU SMALL LETTER ANUSVARA */
+ ["\u1933", "\u1933"], /* LIMBU SMALL LETTER TA */
+ ["\u1934", "\u1934"], /* LIMBU SMALL LETTER NA */
+ ["\u1935", "\u1935"], /* LIMBU SMALL LETTER PA */
+ ["\u1936", "\u1936"], /* LIMBU SMALL LETTER MA */
+ ["\u1937", "\u1937"], /* LIMBU SMALL LETTER RA */
+ ["\u1938", "\u1938"], /* LIMBU SMALL LETTER LA */
+ ["\u1939", "\u1939"], /* LIMBU SIGN MUKPHRENG */
+ ["\u193A", "\u193A"], /* LIMBU SIGN KEMPHRENG */
+ ["\u193B", "\u193B"], /* LIMBU SIGN SA-I */
+ ["\u193C", "\u193C"],
+ ["\u193D", "\u193D"],
+ ["\u193E", "\u193E"],
+ ["\u193F", "\u193F"],
+ ["\u1940", "\u1940"], /* LIMBU SIGN LOO */
+ ["\u1941", "\u1941"],
+ ["\u1942", "\u1942"],
+ ["\u1943", "\u1943"],
+ ["\u1944", "\u1944"], /* LIMBU EXCLAMATION MARK */
+ ["\u1945", "\u1945"], /* LIMBU QUESTION MARK */
+ ["\u1946", "\u1946"], /* LIMBU DIGIT ZERO */
+ ["\u1947", "\u1947"], /* LIMBU DIGIT ONE */
+ ["\u1948", "\u1948"], /* LIMBU DIGIT TWO */
+ ["\u1949", "\u1949"], /* LIMBU DIGIT THREE */
+ ["\u194A", "\u194A"], /* LIMBU DIGIT FOUR */
+ ["\u194B", "\u194B"], /* LIMBU DIGIT FIVE */
+ ["\u194C", "\u194C"], /* LIMBU DIGIT SIX */
+ ["\u194D", "\u194D"], /* LIMBU DIGIT SEVEN */
+ ["\u194E", "\u194E"], /* LIMBU DIGIT EIGHT */
+ ["\u194F", "\u194F"], /* LIMBU DIGIT NINE */
+ ["\u1950", "\u1950"], /* TAI LE LETTER KA */
+ ["\u1951", "\u1951"], /* TAI LE LETTER XA */
+ ["\u1952", "\u1952"], /* TAI LE LETTER NGA */
+ ["\u1953", "\u1953"], /* TAI LE LETTER TSA */
+ ["\u1954", "\u1954"], /* TAI LE LETTER SA */
+ ["\u1955", "\u1955"], /* TAI LE LETTER YA */
+ ["\u1956", "\u1956"], /* TAI LE LETTER TA */
+ ["\u1957", "\u1957"], /* TAI LE LETTER THA */
+ ["\u1958", "\u1958"], /* TAI LE LETTER LA */
+ ["\u1959", "\u1959"], /* TAI LE LETTER PA */
+ ["\u195A", "\u195A"], /* TAI LE LETTER PHA */
+ ["\u195B", "\u195B"], /* TAI LE LETTER MA */
+ ["\u195C", "\u195C"], /* TAI LE LETTER FA */
+ ["\u195D", "\u195D"], /* TAI LE LETTER VA */
+ ["\u195E", "\u195E"], /* TAI LE LETTER HA */
+ ["\u195F", "\u195F"], /* TAI LE LETTER QA */
+ ["\u1960", "\u1960"], /* TAI LE LETTER KHA */
+ ["\u1961", "\u1961"], /* TAI LE LETTER TSHA */
+ ["\u1962", "\u1962"], /* TAI LE LETTER NA */
+ ["\u1963", "\u1963"], /* TAI LE LETTER A */
+ ["\u1964", "\u1964"], /* TAI LE LETTER I */
+ ["\u1965", "\u1965"], /* TAI LE LETTER EE */
+ ["\u1966", "\u1966"], /* TAI LE LETTER EH */
+ ["\u1967", "\u1967"], /* TAI LE LETTER U */
+ ["\u1968", "\u1968"], /* TAI LE LETTER OO */
+ ["\u1969", "\u1969"], /* TAI LE LETTER O */
+ ["\u196A", "\u196A"], /* TAI LE LETTER UE */
+ ["\u196B", "\u196B"], /* TAI LE LETTER E */
+ ["\u196C", "\u196C"], /* TAI LE LETTER AUE */
+ ["\u196D", "\u196D"], /* TAI LE LETTER AI */
+ ["\u196E", "\u196E"],
+ ["\u196F", "\u196F"],
+ ["\u1970", "\u1970"], /* TAI LE LETTER TONE-2 */
+ ["\u1971", "\u1971"], /* TAI LE LETTER TONE-3 */
+ ["\u1972", "\u1972"], /* TAI LE LETTER TONE-4 */
+ ["\u1973", "\u1973"], /* TAI LE LETTER TONE-5 */
+ ["\u1974", "\u1974"], /* TAI LE LETTER TONE-6 */
+ ["\u1975", "\u1975"],
+ ["\u1976", "\u1976"],
+ ["\u1977", "\u1977"],
+ ["\u1978", "\u1978"],
+ ["\u1979", "\u1979"],
+ ["\u197A", "\u197A"],
+ ["\u197B", "\u197B"],
+ ["\u197C", "\u197C"],
+ ["\u197D", "\u197D"],
+ ["\u197E", "\u197E"],
+ ["\u197F", "\u197F"],
+ ["\u1980", "\u1980"], /* NEW TAI LUE LETTER HIGH QA */
+ ["\u1981", "\u1981"], /* NEW TAI LUE LETTER LOW QA */
+ ["\u1982", "\u1982"], /* NEW TAI LUE LETTER HIGH KA */
+ ["\u1983", "\u1983"], /* NEW TAI LUE LETTER HIGH XA */
+ ["\u1984", "\u1984"], /* NEW TAI LUE LETTER HIGH NGA */
+ ["\u1985", "\u1985"], /* NEW TAI LUE LETTER LOW KA */
+ ["\u1986", "\u1986"], /* NEW TAI LUE LETTER LOW XA */
+ ["\u1987", "\u1987"], /* NEW TAI LUE LETTER LOW NGA */
+ ["\u1988", "\u1988"], /* NEW TAI LUE LETTER HIGH TSA */
+ ["\u1989", "\u1989"], /* NEW TAI LUE LETTER HIGH SA */
+ ["\u198A", "\u198A"], /* NEW TAI LUE LETTER HIGH YA */
+ ["\u198B", "\u198B"], /* NEW TAI LUE LETTER LOW TSA */
+ ["\u198C", "\u198C"], /* NEW TAI LUE LETTER LOW SA */
+ ["\u198D", "\u198D"], /* NEW TAI LUE LETTER LOW YA */
+ ["\u198E", "\u198E"], /* NEW TAI LUE LETTER HIGH TA */
+ ["\u198F", "\u198F"], /* NEW TAI LUE LETTER HIGH THA */
+ ["\u1990", "\u1990"], /* NEW TAI LUE LETTER HIGH NA */
+ ["\u1991", "\u1991"], /* NEW TAI LUE LETTER LOW TA */
+ ["\u1992", "\u1992"], /* NEW TAI LUE LETTER LOW THA */
+ ["\u1993", "\u1993"], /* NEW TAI LUE LETTER LOW NA */
+ ["\u1994", "\u1994"], /* NEW TAI LUE LETTER HIGH PA */
+ ["\u1995", "\u1995"], /* NEW TAI LUE LETTER HIGH PHA */
+ ["\u1996", "\u1996"], /* NEW TAI LUE LETTER HIGH MA */
+ ["\u1997", "\u1997"], /* NEW TAI LUE LETTER LOW PA */
+ ["\u1998", "\u1998"], /* NEW TAI LUE LETTER LOW PHA */
+ ["\u1999", "\u1999"], /* NEW TAI LUE LETTER LOW MA */
+ ["\u199A", "\u199A"], /* NEW TAI LUE LETTER HIGH FA */
+ ["\u199B", "\u199B"], /* NEW TAI LUE LETTER HIGH VA */
+ ["\u199C", "\u199C"], /* NEW TAI LUE LETTER HIGH LA */
+ ["\u199D", "\u199D"], /* NEW TAI LUE LETTER LOW FA */
+ ["\u199E", "\u199E"], /* NEW TAI LUE LETTER LOW VA */
+ ["\u199F", "\u199F"], /* NEW TAI LUE LETTER LOW LA */
+ ["\u19A0", "\u19A0"], /* NEW TAI LUE LETTER HIGH HA */
+ ["\u19A1", "\u19A1"], /* NEW TAI LUE LETTER HIGH DA */
+ ["\u19A2", "\u19A2"], /* NEW TAI LUE LETTER HIGH BA */
+ ["\u19A3", "\u19A3"], /* NEW TAI LUE LETTER LOW HA */
+ ["\u19A4", "\u19A4"], /* NEW TAI LUE LETTER LOW DA */
+ ["\u19A5", "\u19A5"], /* NEW TAI LUE LETTER LOW BA */
+ ["\u19A6", "\u19A6"], /* NEW TAI LUE LETTER HIGH KVA */
+ ["\u19A7", "\u19A7"], /* NEW TAI LUE LETTER HIGH XVA */
+ ["\u19A8", "\u19A8"], /* NEW TAI LUE LETTER LOW KVA */
+ ["\u19A9", "\u19A9"], /* NEW TAI LUE LETTER LOW XVA */
+ ["\u19AA", "\u19AA"], /* NEW TAI LUE LETTER HIGH SUA */
+ ["\u19AB", "\u19AB"], /* NEW TAI LUE LETTER LOW SUA */
+ ["\u19AC", "\u19AC"],
+ ["\u19AD", "\u19AD"],
+ ["\u19AE", "\u19AE"],
+ ["\u19AF", "\u19AF"],
+ ["\u19B0", "\u19B0"], /* NEW TAI LUE VOWEL SIGN VOWEL SHORTENER */
+ ["\u19B1", "\u19B1"], /* NEW TAI LUE VOWEL SIGN AA */
+ ["\u19B2", "\u19B2"], /* NEW TAI LUE VOWEL SIGN II */
+ ["\u19B3", "\u19B3"], /* NEW TAI LUE VOWEL SIGN U */
+ ["\u19B4", "\u19B4"], /* NEW TAI LUE VOWEL SIGN UU */
+ ["\u19B5", "\u19B5"], /* NEW TAI LUE VOWEL SIGN E */
+ ["\u19B6", "\u19B6"], /* NEW TAI LUE VOWEL SIGN AE */
+ ["\u19B7", "\u19B7"], /* NEW TAI LUE VOWEL SIGN O */
+ ["\u19B8", "\u19B8"], /* NEW TAI LUE VOWEL SIGN OA */
+ ["\u19B9", "\u19B9"], /* NEW TAI LUE VOWEL SIGN UE */
+ ["\u19BA", "\u19BA"], /* NEW TAI LUE VOWEL SIGN AY */
+ ["\u19BB", "\u19BB"], /* NEW TAI LUE VOWEL SIGN AAY */
+ ["\u19BC", "\u19BC"], /* NEW TAI LUE VOWEL SIGN UY */
+ ["\u19BD", "\u19BD"], /* NEW TAI LUE VOWEL SIGN OY */
+ ["\u19BE", "\u19BE"], /* NEW TAI LUE VOWEL SIGN OAY */
+ ["\u19BF", "\u19BF"], /* NEW TAI LUE VOWEL SIGN UEY */
+ ["\u19C0", "\u19C0"], /* NEW TAI LUE VOWEL SIGN IY */
+ ["\u19C1", "\u19C1"], /* NEW TAI LUE LETTER FINAL V */
+ ["\u19C2", "\u19C2"], /* NEW TAI LUE LETTER FINAL NG */
+ ["\u19C3", "\u19C3"], /* NEW TAI LUE LETTER FINAL N */
+ ["\u19C4", "\u19C4"], /* NEW TAI LUE LETTER FINAL M */
+ ["\u19C5", "\u19C5"], /* NEW TAI LUE LETTER FINAL K */
+ ["\u19C6", "\u19C6"], /* NEW TAI LUE LETTER FINAL D */
+ ["\u19C7", "\u19C7"], /* NEW TAI LUE LETTER FINAL B */
+ ["\u19C8", "\u19C8"], /* NEW TAI LUE TONE MARK-1 */
+ ["\u19C9", "\u19C9"], /* NEW TAI LUE TONE MARK-2 */
+ ["\u19CA", "\u19CA"],
+ ["\u19CB", "\u19CB"],
+ ["\u19CC", "\u19CC"],
+ ["\u19CD", "\u19CD"],
+ ["\u19CE", "\u19CE"],
+ ["\u19CF", "\u19CF"],
+ ["\u19D0", "\u19D0"], /* NEW TAI LUE DIGIT ZERO */
+ ["\u19D1", "\u19D1"], /* NEW TAI LUE DIGIT ONE */
+ ["\u19D2", "\u19D2"], /* NEW TAI LUE DIGIT TWO */
+ ["\u19D3", "\u19D3"], /* NEW TAI LUE DIGIT THREE */
+ ["\u19D4", "\u19D4"], /* NEW TAI LUE DIGIT FOUR */
+ ["\u19D5", "\u19D5"], /* NEW TAI LUE DIGIT FIVE */
+ ["\u19D6", "\u19D6"], /* NEW TAI LUE DIGIT SIX */
+ ["\u19D7", "\u19D7"], /* NEW TAI LUE DIGIT SEVEN */
+ ["\u19D8", "\u19D8"], /* NEW TAI LUE DIGIT EIGHT */
+ ["\u19D9", "\u19D9"], /* NEW TAI LUE DIGIT NINE */
+ ["\u19DA", "\u19DA"], /* NEW TAI LUE THAM DIGIT ONE */
+ ["\u19DB", "\u19DB"],
+ ["\u19DC", "\u19DC"],
+ ["\u19DD", "\u19DD"],
+ ["\u19DE", "\u19DE"], /* NEW TAI LUE SIGN LAE */
+ ["\u19DF", "\u19DF"], /* NEW TAI LUE SIGN LAEV */
+ ["\u19E0", "\u19E0"], /* KHMER SYMBOL PATHAMASAT */
+ ["\u19E1", "\u19E1"], /* KHMER SYMBOL MUOY KOET */
+ ["\u19E2", "\u19E2"], /* KHMER SYMBOL PII KOET */
+ ["\u19E3", "\u19E3"], /* KHMER SYMBOL BEI KOET */
+ ["\u19E4", "\u19E4"], /* KHMER SYMBOL BUON KOET */
+ ["\u19E5", "\u19E5"], /* KHMER SYMBOL PRAM KOET */
+ ["\u19E6", "\u19E6"], /* KHMER SYMBOL PRAM-MUOY KOET */
+ ["\u19E7", "\u19E7"], /* KHMER SYMBOL PRAM-PII KOET */
+ ["\u19E8", "\u19E8"], /* KHMER SYMBOL PRAM-BEI KOET */
+ ["\u19E9", "\u19E9"], /* KHMER SYMBOL PRAM-BUON KOET */
+ ["\u19EA", "\u19EA"], /* KHMER SYMBOL DAP KOET */
+ ["\u19EB", "\u19EB"], /* KHMER SYMBOL DAP-MUOY KOET */
+ ["\u19EC", "\u19EC"], /* KHMER SYMBOL DAP-PII KOET */
+ ["\u19ED", "\u19ED"], /* KHMER SYMBOL DAP-BEI KOET */
+ ["\u19EE", "\u19EE"], /* KHMER SYMBOL DAP-BUON KOET */
+ ["\u19EF", "\u19EF"], /* KHMER SYMBOL DAP-PRAM KOET */
+ ["\u19F0", "\u19F0"], /* KHMER SYMBOL TUTEYASAT */
+ ["\u19F1", "\u19F1"], /* KHMER SYMBOL MUOY ROC */
+ ["\u19F2", "\u19F2"], /* KHMER SYMBOL PII ROC */
+ ["\u19F3", "\u19F3"], /* KHMER SYMBOL BEI ROC */
+ ["\u19F4", "\u19F4"], /* KHMER SYMBOL BUON ROC */
+ ["\u19F5", "\u19F5"], /* KHMER SYMBOL PRAM ROC */
+ ["\u19F6", "\u19F6"], /* KHMER SYMBOL PRAM-MUOY ROC */
+ ["\u19F7", "\u19F7"], /* KHMER SYMBOL PRAM-PII ROC */
+ ["\u19F8", "\u19F8"], /* KHMER SYMBOL PRAM-BEI ROC */
+ ["\u19F9", "\u19F9"], /* KHMER SYMBOL PRAM-BUON ROC */
+ ["\u19FA", "\u19FA"], /* KHMER SYMBOL DAP ROC */
+ ["\u19FB", "\u19FB"], /* KHMER SYMBOL DAP-MUOY ROC */
+ ["\u19FC", "\u19FC"], /* KHMER SYMBOL DAP-PII ROC */
+ ["\u19FD", "\u19FD"], /* KHMER SYMBOL DAP-BEI ROC */
+ ["\u19FE", "\u19FE"], /* KHMER SYMBOL DAP-BUON ROC */
+ ["\u19FF", "\u19FF"], /* KHMER SYMBOL DAP-PRAM ROC */
+ ["\u1A00", "\u1A00"], /* BUGINESE LETTER KA */
+ ["\u1A01", "\u1A01"], /* BUGINESE LETTER GA */
+ ["\u1A02", "\u1A02"], /* BUGINESE LETTER NGA */
+ ["\u1A03", "\u1A03"], /* BUGINESE LETTER NGKA */
+ ["\u1A04", "\u1A04"], /* BUGINESE LETTER PA */
+ ["\u1A05", "\u1A05"], /* BUGINESE LETTER BA */
+ ["\u1A06", "\u1A06"], /* BUGINESE LETTER MA */
+ ["\u1A07", "\u1A07"], /* BUGINESE LETTER MPA */
+ ["\u1A08", "\u1A08"], /* BUGINESE LETTER TA */
+ ["\u1A09", "\u1A09"], /* BUGINESE LETTER DA */
+ ["\u1A0A", "\u1A0A"], /* BUGINESE LETTER NA */
+ ["\u1A0B", "\u1A0B"], /* BUGINESE LETTER NRA */
+ ["\u1A0C", "\u1A0C"], /* BUGINESE LETTER CA */
+ ["\u1A0D", "\u1A0D"], /* BUGINESE LETTER JA */
+ ["\u1A0E", "\u1A0E"], /* BUGINESE LETTER NYA */
+ ["\u1A0F", "\u1A0F"], /* BUGINESE LETTER NYCA */
+ ["\u1A10", "\u1A10"], /* BUGINESE LETTER YA */
+ ["\u1A11", "\u1A11"], /* BUGINESE LETTER RA */
+ ["\u1A12", "\u1A12"], /* BUGINESE LETTER LA */
+ ["\u1A13", "\u1A13"], /* BUGINESE LETTER VA */
+ ["\u1A14", "\u1A14"], /* BUGINESE LETTER SA */
+ ["\u1A15", "\u1A15"], /* BUGINESE LETTER A */
+ ["\u1A16", "\u1A16"], /* BUGINESE LETTER HA */
+ ["\u1A17", "\u1A17"], /* BUGINESE VOWEL SIGN I */
+ ["\u1A18", "\u1A18"], /* BUGINESE VOWEL SIGN U */
+ ["\u1A19", "\u1A19"], /* BUGINESE VOWEL SIGN E */
+ ["\u1A1A", "\u1A1A"], /* BUGINESE VOWEL SIGN O */
+ ["\u1A1B", "\u1A1B"], /* BUGINESE VOWEL SIGN AE */
+ ["\u1A1C", "\u1A1C"],
+ ["\u1A1D", "\u1A1D"],
+ ["\u1A1E", "\u1A1E"], /* BUGINESE PALLAWA */
+ ["\u1A1F", "\u1A1F"], /* BUGINESE END OF SECTION */
+ ["\u1A20", "\u1A20"], /* TAI THAM LETTER HIGH KA */
+ ["\u1A21", "\u1A21"], /* TAI THAM LETTER HIGH KHA */
+ ["\u1A22", "\u1A22"], /* TAI THAM LETTER HIGH KXA */
+ ["\u1A23", "\u1A23"], /* TAI THAM LETTER LOW KA */
+ ["\u1A24", "\u1A24"], /* TAI THAM LETTER LOW KXA */
+ ["\u1A25", "\u1A25"], /* TAI THAM LETTER LOW KHA */
+ ["\u1A26", "\u1A26"], /* TAI THAM LETTER NGA */
+ ["\u1A27", "\u1A27"], /* TAI THAM LETTER HIGH CA */
+ ["\u1A28", "\u1A28"], /* TAI THAM LETTER HIGH CHA */
+ ["\u1A29", "\u1A29"], /* TAI THAM LETTER LOW CA */
+ ["\u1A2A", "\u1A2A"], /* TAI THAM LETTER LOW SA */
+ ["\u1A2B", "\u1A2B"], /* TAI THAM LETTER LOW CHA */
+ ["\u1A2C", "\u1A2C"], /* TAI THAM LETTER NYA */
+ ["\u1A2D", "\u1A2D"], /* TAI THAM LETTER RATA */
+ ["\u1A2E", "\u1A2E"], /* TAI THAM LETTER HIGH RATHA */
+ ["\u1A2F", "\u1A2F"], /* TAI THAM LETTER DA */
+ ["\u1A30", "\u1A30"], /* TAI THAM LETTER LOW RATHA */
+ ["\u1A31", "\u1A31"], /* TAI THAM LETTER RANA */
+ ["\u1A32", "\u1A32"], /* TAI THAM LETTER HIGH TA */
+ ["\u1A33", "\u1A33"], /* TAI THAM LETTER HIGH THA */
+ ["\u1A34", "\u1A34"], /* TAI THAM LETTER LOW TA */
+ ["\u1A35", "\u1A35"], /* TAI THAM LETTER LOW THA */
+ ["\u1A36", "\u1A36"], /* TAI THAM LETTER NA */
+ ["\u1A37", "\u1A37"], /* TAI THAM LETTER BA */
+ ["\u1A38", "\u1A38"], /* TAI THAM LETTER HIGH PA */
+ ["\u1A39", "\u1A39"], /* TAI THAM LETTER HIGH PHA */
+ ["\u1A3A", "\u1A3A"], /* TAI THAM LETTER HIGH FA */
+ ["\u1A3B", "\u1A3B"], /* TAI THAM LETTER LOW PA */
+ ["\u1A3C", "\u1A3C"], /* TAI THAM LETTER LOW FA */
+ ["\u1A3D", "\u1A3D"], /* TAI THAM LETTER LOW PHA */
+ ["\u1A3E", "\u1A3E"], /* TAI THAM LETTER MA */
+ ["\u1A3F", "\u1A3F"], /* TAI THAM LETTER LOW YA */
+ ["\u1A40", "\u1A40"], /* TAI THAM LETTER HIGH YA */
+ ["\u1A41", "\u1A41"], /* TAI THAM LETTER RA */
+ ["\u1A42", "\u1A42"], /* TAI THAM LETTER RUE */
+ ["\u1A43", "\u1A43"], /* TAI THAM LETTER LA */
+ ["\u1A44", "\u1A44"], /* TAI THAM LETTER LUE */
+ ["\u1A45", "\u1A45"], /* TAI THAM LETTER WA */
+ ["\u1A46", "\u1A46"], /* TAI THAM LETTER HIGH SHA */
+ ["\u1A47", "\u1A47"], /* TAI THAM LETTER HIGH SSA */
+ ["\u1A48", "\u1A48"], /* TAI THAM LETTER HIGH SA */
+ ["\u1A49", "\u1A49"], /* TAI THAM LETTER HIGH HA */
+ ["\u1A4A", "\u1A4A"], /* TAI THAM LETTER LLA */
+ ["\u1A4B", "\u1A4B"], /* TAI THAM LETTER A */
+ ["\u1A4C", "\u1A4C"], /* TAI THAM LETTER LOW HA */
+ ["\u1A4D", "\u1A4D"], /* TAI THAM LETTER I */
+ ["\u1A4E", "\u1A4E"], /* TAI THAM LETTER II */
+ ["\u1A4F", "\u1A4F"], /* TAI THAM LETTER U */
+ ["\u1A50", "\u1A50"], /* TAI THAM LETTER UU */
+ ["\u1A51", "\u1A51"], /* TAI THAM LETTER EE */
+ ["\u1A52", "\u1A52"], /* TAI THAM LETTER OO */
+ ["\u1A53", "\u1A53"], /* TAI THAM LETTER LAE */
+ ["\u1A54", "\u1A54"], /* TAI THAM LETTER GREAT SA */
+ ["\u1A55", "\u1A55"], /* TAI THAM CONSONANT SIGN MEDIAL RA */
+ ["\u1A56", "\u1A56"], /* TAI THAM CONSONANT SIGN MEDIAL LA */
+ ["\u1A57", "\u1A57"], /* TAI THAM CONSONANT SIGN LA TANG LAI */
+ ["\u1A58", "\u1A58"], /* TAI THAM SIGN MAI KANG LAI */
+ ["\u1A59", "\u1A59"], /* TAI THAM CONSONANT SIGN FINAL NGA */
+ ["\u1A5A", "\u1A5A"], /* TAI THAM CONSONANT SIGN LOW PA */
+ ["\u1A5B", "\u1A5B"], /* TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA */
+ ["\u1A5C", "\u1A5C"], /* TAI THAM CONSONANT SIGN MA */
+ ["\u1A5D", "\u1A5D"], /* TAI THAM CONSONANT SIGN BA */
+ ["\u1A5E", "\u1A5E"], /* TAI THAM CONSONANT SIGN SA */
+ ["\u1A5F", "\u1A5F"],
+ ["\u1A60", "\u1A60"], /* TAI THAM SIGN SAKOT */
+ ["\u1A61", "\u1A61"], /* TAI THAM VOWEL SIGN A */
+ ["\u1A62", "\u1A62"], /* TAI THAM VOWEL SIGN MAI SAT */
+ ["\u1A63", "\u1A63"], /* TAI THAM VOWEL SIGN AA */
+ ["\u1A64", "\u1A64"], /* TAI THAM VOWEL SIGN TALL AA */
+ ["\u1A65", "\u1A65"], /* TAI THAM VOWEL SIGN I */
+ ["\u1A66", "\u1A66"], /* TAI THAM VOWEL SIGN II */
+ ["\u1A67", "\u1A67"], /* TAI THAM VOWEL SIGN UE */
+ ["\u1A68", "\u1A68"], /* TAI THAM VOWEL SIGN UUE */
+ ["\u1A69", "\u1A69"], /* TAI THAM VOWEL SIGN U */
+ ["\u1A6A", "\u1A6A"], /* TAI THAM VOWEL SIGN UU */
+ ["\u1A6B", "\u1A6B"], /* TAI THAM VOWEL SIGN O */
+ ["\u1A6C", "\u1A6C"], /* TAI THAM VOWEL SIGN OA BELOW */
+ ["\u1A6D", "\u1A6D"], /* TAI THAM VOWEL SIGN OY */
+ ["\u1A6E", "\u1A6E"], /* TAI THAM VOWEL SIGN E */
+ ["\u1A6F", "\u1A6F"], /* TAI THAM VOWEL SIGN AE */
+ ["\u1A70", "\u1A70"], /* TAI THAM VOWEL SIGN OO */
+ ["\u1A71", "\u1A71"], /* TAI THAM VOWEL SIGN AI */
+ ["\u1A72", "\u1A72"], /* TAI THAM VOWEL SIGN THAM AI */
+ ["\u1A73", "\u1A73"], /* TAI THAM VOWEL SIGN OA ABOVE */
+ ["\u1A74", "\u1A74"], /* TAI THAM SIGN MAI KANG */
+ ["\u1A75", "\u1A75"], /* TAI THAM SIGN TONE-1 */
+ ["\u1A76", "\u1A76"], /* TAI THAM SIGN TONE-2 */
+ ["\u1A77", "\u1A77"], /* TAI THAM SIGN KHUEN TONE-3 */
+ ["\u1A78", "\u1A78"], /* TAI THAM SIGN KHUEN TONE-4 */
+ ["\u1A79", "\u1A79"], /* TAI THAM SIGN KHUEN TONE-5 */
+ ["\u1A7A", "\u1A7A"], /* TAI THAM SIGN RA HAAM */
+ ["\u1A7B", "\u1A7B"], /* TAI THAM SIGN MAI SAM */
+ ["\u1A7C", "\u1A7C"], /* TAI THAM SIGN KHUEN-LUE KARAN */
+ ["\u1A7D", "\u1A7D"],
+ ["\u1A7E", "\u1A7E"],
+ ["\u1A7F", "\u1A7F"], /* TAI THAM COMBINING CRYPTOGRAMMIC DOT */
+ ["\u1A80", "\u1A80"], /* TAI THAM HORA DIGIT ZERO */
+ ["\u1A81", "\u1A81"], /* TAI THAM HORA DIGIT ONE */
+ ["\u1A82", "\u1A82"], /* TAI THAM HORA DIGIT TWO */
+ ["\u1A83", "\u1A83"], /* TAI THAM HORA DIGIT THREE */
+ ["\u1A84", "\u1A84"], /* TAI THAM HORA DIGIT FOUR */
+ ["\u1A85", "\u1A85"], /* TAI THAM HORA DIGIT FIVE */
+ ["\u1A86", "\u1A86"], /* TAI THAM HORA DIGIT SIX */
+ ["\u1A87", "\u1A87"], /* TAI THAM HORA DIGIT SEVEN */
+ ["\u1A88", "\u1A88"], /* TAI THAM HORA DIGIT EIGHT */
+ ["\u1A89", "\u1A89"], /* TAI THAM HORA DIGIT NINE */
+ ["\u1A8A", "\u1A8A"],
+ ["\u1A8B", "\u1A8B"],
+ ["\u1A8C", "\u1A8C"],
+ ["\u1A8D", "\u1A8D"],
+ ["\u1A8E", "\u1A8E"],
+ ["\u1A8F", "\u1A8F"],
+ ["\u1A90", "\u1A90"], /* TAI THAM THAM DIGIT ZERO */
+ ["\u1A91", "\u1A91"], /* TAI THAM THAM DIGIT ONE */
+ ["\u1A92", "\u1A92"], /* TAI THAM THAM DIGIT TWO */
+ ["\u1A93", "\u1A93"], /* TAI THAM THAM DIGIT THREE */
+ ["\u1A94", "\u1A94"], /* TAI THAM THAM DIGIT FOUR */
+ ["\u1A95", "\u1A95"], /* TAI THAM THAM DIGIT FIVE */
+ ["\u1A96", "\u1A96"], /* TAI THAM THAM DIGIT SIX */
+ ["\u1A97", "\u1A97"], /* TAI THAM THAM DIGIT SEVEN */
+ ["\u1A98", "\u1A98"], /* TAI THAM THAM DIGIT EIGHT */
+ ["\u1A99", "\u1A99"], /* TAI THAM THAM DIGIT NINE */
+ ["\u1A9A", "\u1A9A"],
+ ["\u1A9B", "\u1A9B"],
+ ["\u1A9C", "\u1A9C"],
+ ["\u1A9D", "\u1A9D"],
+ ["\u1A9E", "\u1A9E"],
+ ["\u1A9F", "\u1A9F"],
+ ["\u1AA0", "\u1AA0"], /* TAI THAM SIGN WIANG */
+ ["\u1AA1", "\u1AA1"], /* TAI THAM SIGN WIANGWAAK */
+ ["\u1AA2", "\u1AA2"], /* TAI THAM SIGN SAWAN */
+ ["\u1AA3", "\u1AA3"], /* TAI THAM SIGN KEOW */
+ ["\u1AA4", "\u1AA4"], /* TAI THAM SIGN HOY */
+ ["\u1AA5", "\u1AA5"], /* TAI THAM SIGN DOKMAI */
+ ["\u1AA6", "\u1AA6"], /* TAI THAM SIGN REVERSED ROTATED RANA */
+ ["\u1AA7", "\u1AA7"], /* TAI THAM SIGN MAI YAMOK */
+ ["\u1AA8", "\u1AA8"], /* TAI THAM SIGN KAAN */
+ ["\u1AA9", "\u1AA9"], /* TAI THAM SIGN KAANKUU */
+ ["\u1AAA", "\u1AAA"], /* TAI THAM SIGN SATKAAN */
+ ["\u1AAB", "\u1AAB"], /* TAI THAM SIGN SATKAANKUU */
+ ["\u1AAC", "\u1AAC"], /* TAI THAM SIGN HANG */
+ ["\u1AAD", "\u1AAD"], /* TAI THAM SIGN CAANG */
+ ["\u1AAE", "\u1AAE"],
+ ["\u1AAF", "\u1AAF"],
+ ["\u1AB0", "\u1AB0"], /* COMBINING DOUBLED CIRCUMFLEX ACCENT */
+ ["\u1AB1", "\u1AB1"], /* COMBINING DIAERESIS-RING */
+ ["\u1AB2", "\u1AB2"], /* COMBINING INFINITY */
+ ["\u1AB3", "\u1AB3"], /* COMBINING DOWNWARDS ARROW */
+ ["\u1AB4", "\u1AB4"], /* COMBINING TRIPLE DOT */
+ ["\u1AB5", "\u1AB5"], /* COMBINING X-X BELOW */
+ ["\u1AB6", "\u1AB6"], /* COMBINING WIGGLY LINE BELOW */
+ ["\u1AB7", "\u1AB7"], /* COMBINING OPEN MARK BELOW */
+ ["\u1AB8", "\u1AB8"], /* COMBINING DOUBLE OPEN MARK BELOW */
+ ["\u1AB9", "\u1AB9"], /* COMBINING LIGHT CENTRALIZATION STROKE BELOW */
+ ["\u1ABA", "\u1ABA"], /* COMBINING STRONG CENTRALIZATION STROKE BELOW */
+ ["\u1ABB", "\u1ABB"], /* COMBINING PARENTHESES ABOVE */
+ ["\u1ABC", "\u1ABC"], /* COMBINING DOUBLE PARENTHESES ABOVE */
+ ["\u1ABD", "\u1ABD"], /* COMBINING PARENTHESES BELOW */
+ ["\u1ABE", "\u1ABE"], /* COMBINING PARENTHESES OVERLAY */
+ ["\u1ABF", "\u1ABF"],
+ ["\u1AC0", "\u1AC0"],
+ ["\u1AC1", "\u1AC1"],
+ ["\u1AC2", "\u1AC2"],
+ ["\u1AC3", "\u1AC3"],
+ ["\u1AC4", "\u1AC4"],
+ ["\u1AC5", "\u1AC5"],
+ ["\u1AC6", "\u1AC6"],
+ ["\u1AC7", "\u1AC7"],
+ ["\u1AC8", "\u1AC8"],
+ ["\u1AC9", "\u1AC9"],
+ ["\u1ACA", "\u1ACA"],
+ ["\u1ACB", "\u1ACB"],
+ ["\u1ACC", "\u1ACC"],
+ ["\u1ACD", "\u1ACD"],
+ ["\u1ACE", "\u1ACE"],
+ ["\u1ACF", "\u1ACF"],
+ ["\u1AD0", "\u1AD0"],
+ ["\u1AD1", "\u1AD1"],
+ ["\u1AD2", "\u1AD2"],
+ ["\u1AD3", "\u1AD3"],
+ ["\u1AD4", "\u1AD4"],
+ ["\u1AD5", "\u1AD5"],
+ ["\u1AD6", "\u1AD6"],
+ ["\u1AD7", "\u1AD7"],
+ ["\u1AD8", "\u1AD8"],
+ ["\u1AD9", "\u1AD9"],
+ ["\u1ADA", "\u1ADA"],
+ ["\u1ADB", "\u1ADB"],
+ ["\u1ADC", "\u1ADC"],
+ ["\u1ADD", "\u1ADD"],
+ ["\u1ADE", "\u1ADE"],
+ ["\u1ADF", "\u1ADF"],
+ ["\u1AE0", "\u1AE0"],
+ ["\u1AE1", "\u1AE1"],
+ ["\u1AE2", "\u1AE2"],
+ ["\u1AE3", "\u1AE3"],
+ ["\u1AE4", "\u1AE4"],
+ ["\u1AE5", "\u1AE5"],
+ ["\u1AE6", "\u1AE6"],
+ ["\u1AE7", "\u1AE7"],
+ ["\u1AE8", "\u1AE8"],
+ ["\u1AE9", "\u1AE9"],
+ ["\u1AEA", "\u1AEA"],
+ ["\u1AEB", "\u1AEB"],
+ ["\u1AEC", "\u1AEC"],
+ ["\u1AED", "\u1AED"],
+ ["\u1AEE", "\u1AEE"],
+ ["\u1AEF", "\u1AEF"],
+ ["\u1AF0", "\u1AF0"],
+ ["\u1AF1", "\u1AF1"],
+ ["\u1AF2", "\u1AF2"],
+ ["\u1AF3", "\u1AF3"],
+ ["\u1AF4", "\u1AF4"],
+ ["\u1AF5", "\u1AF5"],
+ ["\u1AF6", "\u1AF6"],
+ ["\u1AF7", "\u1AF7"],
+ ["\u1AF8", "\u1AF8"],
+ ["\u1AF9", "\u1AF9"],
+ ["\u1AFA", "\u1AFA"],
+ ["\u1AFB", "\u1AFB"],
+ ["\u1AFC", "\u1AFC"],
+ ["\u1AFD", "\u1AFD"],
+ ["\u1AFE", "\u1AFE"],
+ ["\u1AFF", "\u1AFF"],
+ ["\u1B00", "\u1B00"], /* BALINESE SIGN ULU RICEM */
+ ["\u1B01", "\u1B01"], /* BALINESE SIGN ULU CANDRA */
+ ["\u1B02", "\u1B02"], /* BALINESE SIGN CECEK */
+ ["\u1B03", "\u1B03"], /* BALINESE SIGN SURANG */
+ ["\u1B04", "\u1B04"], /* BALINESE SIGN BISAH */
+ ["\u1B05", "\u1B05"], /* BALINESE LETTER AKARA */
+ ["\u1B06", "\u1B06"], /* BALINESE LETTER AKARA TEDUNG */
+ ["\u1B07", "\u1B07"], /* BALINESE LETTER IKARA */
+ ["\u1B08", "\u1B08"], /* BALINESE LETTER IKARA TEDUNG */
+ ["\u1B09", "\u1B09"], /* BALINESE LETTER UKARA */
+ ["\u1B0A", "\u1B0A"], /* BALINESE LETTER UKARA TEDUNG */
+ ["\u1B0B", "\u1B0B"], /* BALINESE LETTER RA REPA */
+ ["\u1B0C", "\u1B0C"], /* BALINESE LETTER RA REPA TEDUNG */
+ ["\u1B0D", "\u1B0D"], /* BALINESE LETTER LA LENGA */
+ ["\u1B0E", "\u1B0E"], /* BALINESE LETTER LA LENGA TEDUNG */
+ ["\u1B0F", "\u1B0F"], /* BALINESE LETTER EKARA */
+ ["\u1B10", "\u1B10"], /* BALINESE LETTER AIKARA */
+ ["\u1B11", "\u1B11"], /* BALINESE LETTER OKARA */
+ ["\u1B12", "\u1B12"], /* BALINESE LETTER OKARA TEDUNG */
+ ["\u1B13", "\u1B13"], /* BALINESE LETTER KA */
+ ["\u1B14", "\u1B14"], /* BALINESE LETTER KA MAHAPRANA */
+ ["\u1B15", "\u1B15"], /* BALINESE LETTER GA */
+ ["\u1B16", "\u1B16"], /* BALINESE LETTER GA GORA */
+ ["\u1B17", "\u1B17"], /* BALINESE LETTER NGA */
+ ["\u1B18", "\u1B18"], /* BALINESE LETTER CA */
+ ["\u1B19", "\u1B19"], /* BALINESE LETTER CA LACA */
+ ["\u1B1A", "\u1B1A"], /* BALINESE LETTER JA */
+ ["\u1B1B", "\u1B1B"], /* BALINESE LETTER JA JERA */
+ ["\u1B1C", "\u1B1C"], /* BALINESE LETTER NYA */
+ ["\u1B1D", "\u1B1D"], /* BALINESE LETTER TA LATIK */
+ ["\u1B1E", "\u1B1E"], /* BALINESE LETTER TA MURDA MAHAPRANA */
+ ["\u1B1F", "\u1B1F"], /* BALINESE LETTER DA MURDA ALPAPRANA */
+ ["\u1B20", "\u1B20"], /* BALINESE LETTER DA MURDA MAHAPRANA */
+ ["\u1B21", "\u1B21"], /* BALINESE LETTER NA RAMBAT */
+ ["\u1B22", "\u1B22"], /* BALINESE LETTER TA */
+ ["\u1B23", "\u1B23"], /* BALINESE LETTER TA TAWA */
+ ["\u1B24", "\u1B24"], /* BALINESE LETTER DA */
+ ["\u1B25", "\u1B25"], /* BALINESE LETTER DA MADU */
+ ["\u1B26", "\u1B26"], /* BALINESE LETTER NA */
+ ["\u1B27", "\u1B27"], /* BALINESE LETTER PA */
+ ["\u1B28", "\u1B28"], /* BALINESE LETTER PA KAPAL */
+ ["\u1B29", "\u1B29"], /* BALINESE LETTER BA */
+ ["\u1B2A", "\u1B2A"], /* BALINESE LETTER BA KEMBANG */
+ ["\u1B2B", "\u1B2B"], /* BALINESE LETTER MA */
+ ["\u1B2C", "\u1B2C"], /* BALINESE LETTER YA */
+ ["\u1B2D", "\u1B2D"], /* BALINESE LETTER RA */
+ ["\u1B2E", "\u1B2E"], /* BALINESE LETTER LA */
+ ["\u1B2F", "\u1B2F"], /* BALINESE LETTER WA */
+ ["\u1B30", "\u1B30"], /* BALINESE LETTER SA SAGA */
+ ["\u1B31", "\u1B31"], /* BALINESE LETTER SA SAPA */
+ ["\u1B32", "\u1B32"], /* BALINESE LETTER SA */
+ ["\u1B33", "\u1B33"], /* BALINESE LETTER HA */
+ ["\u1B34", "\u1B34"], /* BALINESE SIGN REREKAN */
+ ["\u1B35", "\u1B35"], /* BALINESE VOWEL SIGN TEDUNG */
+ ["\u1B36", "\u1B36"], /* BALINESE VOWEL SIGN ULU */
+ ["\u1B37", "\u1B37"], /* BALINESE VOWEL SIGN ULU SARI */
+ ["\u1B38", "\u1B38"], /* BALINESE VOWEL SIGN SUKU */
+ ["\u1B39", "\u1B39"], /* BALINESE VOWEL SIGN SUKU ILUT */
+ ["\u1B3A", "\u1B3A"], /* BALINESE VOWEL SIGN RA REPA */
+ ["\u1B3B", "\u1B3B"], /* BALINESE VOWEL SIGN RA REPA TEDUNG */
+ ["\u1B3C", "\u1B3C"], /* BALINESE VOWEL SIGN LA LENGA */
+ ["\u1B3D", "\u1B3D"], /* BALINESE VOWEL SIGN LA LENGA TEDUNG */
+ ["\u1B3E", "\u1B3E"], /* BALINESE VOWEL SIGN TALING */
+ ["\u1B3F", "\u1B3F"], /* BALINESE VOWEL SIGN TALING REPA */
+ ["\u1B40", "\u1B40"], /* BALINESE VOWEL SIGN TALING TEDUNG */
+ ["\u1B41", "\u1B41"], /* BALINESE VOWEL SIGN TALING REPA TEDUNG */
+ ["\u1B42", "\u1B42"], /* BALINESE VOWEL SIGN PEPET */
+ ["\u1B43", "\u1B43"], /* BALINESE VOWEL SIGN PEPET TEDUNG */
+ ["\u1B44", "\u1B44"], /* BALINESE ADEG ADEG */
+ ["\u1B45", "\u1B45"], /* BALINESE LETTER KAF SASAK */
+ ["\u1B46", "\u1B46"], /* BALINESE LETTER KHOT SASAK */
+ ["\u1B47", "\u1B47"], /* BALINESE LETTER TZIR SASAK */
+ ["\u1B48", "\u1B48"], /* BALINESE LETTER EF SASAK */
+ ["\u1B49", "\u1B49"], /* BALINESE LETTER VE SASAK */
+ ["\u1B4A", "\u1B4A"], /* BALINESE LETTER ZAL SASAK */
+ ["\u1B4B", "\u1B4B"], /* BALINESE LETTER ASYURA SASAK */
+ ["\u1B4C", "\u1B4C"],
+ ["\u1B4D", "\u1B4D"],
+ ["\u1B4E", "\u1B4E"],
+ ["\u1B4F", "\u1B4F"],
+ ["\u1B50", "\u1B50"], /* BALINESE DIGIT ZERO */
+ ["\u1B51", "\u1B51"], /* BALINESE DIGIT ONE */
+ ["\u1B52", "\u1B52"], /* BALINESE DIGIT TWO */
+ ["\u1B53", "\u1B53"], /* BALINESE DIGIT THREE */
+ ["\u1B54", "\u1B54"], /* BALINESE DIGIT FOUR */
+ ["\u1B55", "\u1B55"], /* BALINESE DIGIT FIVE */
+ ["\u1B56", "\u1B56"], /* BALINESE DIGIT SIX */
+ ["\u1B57", "\u1B57"], /* BALINESE DIGIT SEVEN */
+ ["\u1B58", "\u1B58"], /* BALINESE DIGIT EIGHT */
+ ["\u1B59", "\u1B59"], /* BALINESE DIGIT NINE */
+ ["\u1B5A", "\u1B5A"], /* BALINESE PANTI */
+ ["\u1B5B", "\u1B5B"], /* BALINESE PAMADA */
+ ["\u1B5C", "\u1B5C"], /* BALINESE WINDU */
+ ["\u1B5D", "\u1B5D"], /* BALINESE CARIK PAMUNGKAH */
+ ["\u1B5E", "\u1B5E"], /* BALINESE CARIK SIKI */
+ ["\u1B5F", "\u1B5F"], /* BALINESE CARIK PAREREN */
+ ["\u1B60", "\u1B60"], /* BALINESE PAMENENG */
+ ["\u1B61", "\u1B61"], /* BALINESE MUSICAL SYMBOL DONG */
+ ["\u1B62", "\u1B62"], /* BALINESE MUSICAL SYMBOL DENG */
+ ["\u1B63", "\u1B63"], /* BALINESE MUSICAL SYMBOL DUNG */
+ ["\u1B64", "\u1B64"], /* BALINESE MUSICAL SYMBOL DANG */
+ ["\u1B65", "\u1B65"], /* BALINESE MUSICAL SYMBOL DANG SURANG */
+ ["\u1B66", "\u1B66"], /* BALINESE MUSICAL SYMBOL DING */
+ ["\u1B67", "\u1B67"], /* BALINESE MUSICAL SYMBOL DAENG */
+ ["\u1B68", "\u1B68"], /* BALINESE MUSICAL SYMBOL DEUNG */
+ ["\u1B69", "\u1B69"], /* BALINESE MUSICAL SYMBOL DAING */
+ ["\u1B6A", "\u1B6A"], /* BALINESE MUSICAL SYMBOL DANG GEDE */
+ ["\u1B6B", "\u1B6B"], /* BALINESE MUSICAL SYMBOL COMBINING TEGEH */
+ ["\u1B6C", "\u1B6C"], /* BALINESE MUSICAL SYMBOL COMBINING ENDEP */
+ ["\u1B6D", "\u1B6D"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPUL */
+ ["\u1B6E", "\u1B6E"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPLI */
+ ["\u1B6F", "\u1B6F"], /* BALINESE MUSICAL SYMBOL COMBINING JEGOGAN */
+ ["\u1B70", "\u1B70"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN */
+ ["\u1B71", "\u1B71"], /* BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN */
+ ["\u1B72", "\u1B72"], /* BALINESE MUSICAL SYMBOL COMBINING BENDE */
+ ["\u1B73", "\u1B73"], /* BALINESE MUSICAL SYMBOL COMBINING GONG */
+ ["\u1B74", "\u1B74"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG */
+ ["\u1B75", "\u1B75"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG */
+ ["\u1B76", "\u1B76"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK */
+ ["\u1B77", "\u1B77"], /* BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK */
+ ["\u1B78", "\u1B78"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG */
+ ["\u1B79", "\u1B79"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG */
+ ["\u1B7A", "\u1B7A"], /* BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK */
+ ["\u1B7B", "\u1B7B"], /* BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK */
+ ["\u1B7C", "\u1B7C"], /* BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING */
+ ["\u1B7D", "\u1B7D"],
+ ["\u1B7E", "\u1B7E"],
+ ["\u1B7F", "\u1B7F"],
+ ["\u1B80", "\u1B80"], /* SUNDANESE SIGN PANYECEK */
+ ["\u1B81", "\u1B81"], /* SUNDANESE SIGN PANGLAYAR */
+ ["\u1B82", "\u1B82"], /* SUNDANESE SIGN PANGWISAD */
+ ["\u1B83", "\u1B83"], /* SUNDANESE LETTER A */
+ ["\u1B84", "\u1B84"], /* SUNDANESE LETTER I */
+ ["\u1B85", "\u1B85"], /* SUNDANESE LETTER U */
+ ["\u1B86", "\u1B86"], /* SUNDANESE LETTER AE */
+ ["\u1B87", "\u1B87"], /* SUNDANESE LETTER O */
+ ["\u1B88", "\u1B88"], /* SUNDANESE LETTER E */
+ ["\u1B89", "\u1B89"], /* SUNDANESE LETTER EU */
+ ["\u1B8A", "\u1B8A"], /* SUNDANESE LETTER KA */
+ ["\u1B8B", "\u1B8B"], /* SUNDANESE LETTER QA */
+ ["\u1B8C", "\u1B8C"], /* SUNDANESE LETTER GA */
+ ["\u1B8D", "\u1B8D"], /* SUNDANESE LETTER NGA */
+ ["\u1B8E", "\u1B8E"], /* SUNDANESE LETTER CA */
+ ["\u1B8F", "\u1B8F"], /* SUNDANESE LETTER JA */
+ ["\u1B90", "\u1B90"], /* SUNDANESE LETTER ZA */
+ ["\u1B91", "\u1B91"], /* SUNDANESE LETTER NYA */
+ ["\u1B92", "\u1B92"], /* SUNDANESE LETTER TA */
+ ["\u1B93", "\u1B93"], /* SUNDANESE LETTER DA */
+ ["\u1B94", "\u1B94"], /* SUNDANESE LETTER NA */
+ ["\u1B95", "\u1B95"], /* SUNDANESE LETTER PA */
+ ["\u1B96", "\u1B96"], /* SUNDANESE LETTER FA */
+ ["\u1B97", "\u1B97"], /* SUNDANESE LETTER VA */
+ ["\u1B98", "\u1B98"], /* SUNDANESE LETTER BA */
+ ["\u1B99", "\u1B99"], /* SUNDANESE LETTER MA */
+ ["\u1B9A", "\u1B9A"], /* SUNDANESE LETTER YA */
+ ["\u1B9B", "\u1B9B"], /* SUNDANESE LETTER RA */
+ ["\u1B9C", "\u1B9C"], /* SUNDANESE LETTER LA */
+ ["\u1B9D", "\u1B9D"], /* SUNDANESE LETTER WA */
+ ["\u1B9E", "\u1B9E"], /* SUNDANESE LETTER SA */
+ ["\u1B9F", "\u1B9F"], /* SUNDANESE LETTER XA */
+ ["\u1BA0", "\u1BA0"], /* SUNDANESE LETTER HA */
+ ["\u1BA1", "\u1BA1"], /* SUNDANESE CONSONANT SIGN PAMINGKAL */
+ ["\u1BA2", "\u1BA2"], /* SUNDANESE CONSONANT SIGN PANYAKRA */
+ ["\u1BA3", "\u1BA3"], /* SUNDANESE CONSONANT SIGN PANYIKU */
+ ["\u1BA4", "\u1BA4"], /* SUNDANESE VOWEL SIGN PANGHULU */
+ ["\u1BA5", "\u1BA5"], /* SUNDANESE VOWEL SIGN PANYUKU */
+ ["\u1BA6", "\u1BA6"], /* SUNDANESE VOWEL SIGN PANAELAENG */
+ ["\u1BA7", "\u1BA7"], /* SUNDANESE VOWEL SIGN PANOLONG */
+ ["\u1BA8", "\u1BA8"], /* SUNDANESE VOWEL SIGN PAMEPET */
+ ["\u1BA9", "\u1BA9"], /* SUNDANESE VOWEL SIGN PANEULEUNG */
+ ["\u1BAA", "\u1BAA"], /* SUNDANESE SIGN PAMAAEH */
+ ["\u1BAB", "\u1BAB"], /* SUNDANESE SIGN VIRAMA */
+ ["\u1BAC", "\u1BAC"], /* SUNDANESE CONSONANT SIGN PASANGAN MA */
+ ["\u1BAD", "\u1BAD"], /* SUNDANESE CONSONANT SIGN PASANGAN WA */
+ ["\u1BAE", "\u1BAE"], /* SUNDANESE LETTER KHA */
+ ["\u1BAF", "\u1BAF"], /* SUNDANESE LETTER SYA */
+ ["\u1BB0", "\u1BB0"], /* SUNDANESE DIGIT ZERO */
+ ["\u1BB1", "\u1BB1"], /* SUNDANESE DIGIT ONE */
+ ["\u1BB2", "\u1BB2"], /* SUNDANESE DIGIT TWO */
+ ["\u1BB3", "\u1BB3"], /* SUNDANESE DIGIT THREE */
+ ["\u1BB4", "\u1BB4"], /* SUNDANESE DIGIT FOUR */
+ ["\u1BB5", "\u1BB5"], /* SUNDANESE DIGIT FIVE */
+ ["\u1BB6", "\u1BB6"], /* SUNDANESE DIGIT SIX */
+ ["\u1BB7", "\u1BB7"], /* SUNDANESE DIGIT SEVEN */
+ ["\u1BB8", "\u1BB8"], /* SUNDANESE DIGIT EIGHT */
+ ["\u1BB9", "\u1BB9"], /* SUNDANESE DIGIT NINE */
+ ["\u1BBA", "\u1BBA"], /* SUNDANESE AVAGRAHA */
+ ["\u1BBB", "\u1BBB"], /* SUNDANESE LETTER REU */
+ ["\u1BBC", "\u1BBC"], /* SUNDANESE LETTER LEU */
+ ["\u1BBD", "\u1BBD"], /* SUNDANESE LETTER BHA */
+ ["\u1BBE", "\u1BBE"], /* SUNDANESE LETTER FINAL K */
+ ["\u1BBF", "\u1BBF"], /* SUNDANESE LETTER FINAL M */
+ ["\u1BC0", "\u1BC0"], /* BATAK LETTER A */
+ ["\u1BC1", "\u1BC1"], /* BATAK LETTER SIMALUNGUN A */
+ ["\u1BC2", "\u1BC2"], /* BATAK LETTER HA */
+ ["\u1BC3", "\u1BC3"], /* BATAK LETTER SIMALUNGUN HA */
+ ["\u1BC4", "\u1BC4"], /* BATAK LETTER MANDAILING HA */
+ ["\u1BC5", "\u1BC5"], /* BATAK LETTER BA */
+ ["\u1BC6", "\u1BC6"], /* BATAK LETTER KARO BA */
+ ["\u1BC7", "\u1BC7"], /* BATAK LETTER PA */
+ ["\u1BC8", "\u1BC8"], /* BATAK LETTER SIMALUNGUN PA */
+ ["\u1BC9", "\u1BC9"], /* BATAK LETTER NA */
+ ["\u1BCA", "\u1BCA"], /* BATAK LETTER MANDAILING NA */
+ ["\u1BCB", "\u1BCB"], /* BATAK LETTER WA */
+ ["\u1BCC", "\u1BCC"], /* BATAK LETTER SIMALUNGUN WA */
+ ["\u1BCD", "\u1BCD"], /* BATAK LETTER PAKPAK WA */
+ ["\u1BCE", "\u1BCE"], /* BATAK LETTER GA */
+ ["\u1BCF", "\u1BCF"], /* BATAK LETTER SIMALUNGUN GA */
+ ["\u1BD0", "\u1BD0"], /* BATAK LETTER JA */
+ ["\u1BD1", "\u1BD1"], /* BATAK LETTER DA */
+ ["\u1BD2", "\u1BD2"], /* BATAK LETTER RA */
+ ["\u1BD3", "\u1BD3"], /* BATAK LETTER SIMALUNGUN RA */
+ ["\u1BD4", "\u1BD4"], /* BATAK LETTER MA */
+ ["\u1BD5", "\u1BD5"], /* BATAK LETTER SIMALUNGUN MA */
+ ["\u1BD6", "\u1BD6"], /* BATAK LETTER SOUTHERN TA */
+ ["\u1BD7", "\u1BD7"], /* BATAK LETTER NORTHERN TA */
+ ["\u1BD8", "\u1BD8"], /* BATAK LETTER SA */
+ ["\u1BD9", "\u1BD9"], /* BATAK LETTER SIMALUNGUN SA */
+ ["\u1BDA", "\u1BDA"], /* BATAK LETTER MANDAILING SA */
+ ["\u1BDB", "\u1BDB"], /* BATAK LETTER YA */
+ ["\u1BDC", "\u1BDC"], /* BATAK LETTER SIMALUNGUN YA */
+ ["\u1BDD", "\u1BDD"], /* BATAK LETTER NGA */
+ ["\u1BDE", "\u1BDE"], /* BATAK LETTER LA */
+ ["\u1BDF", "\u1BDF"], /* BATAK LETTER SIMALUNGUN LA */
+ ["\u1BE0", "\u1BE0"], /* BATAK LETTER NYA */
+ ["\u1BE1", "\u1BE1"], /* BATAK LETTER CA */
+ ["\u1BE2", "\u1BE2"], /* BATAK LETTER NDA */
+ ["\u1BE3", "\u1BE3"], /* BATAK LETTER MBA */
+ ["\u1BE4", "\u1BE4"], /* BATAK LETTER I */
+ ["\u1BE5", "\u1BE5"], /* BATAK LETTER U */
+ ["\u1BE6", "\u1BE6"], /* BATAK SIGN TOMPI */
+ ["\u1BE7", "\u1BE7"], /* BATAK VOWEL SIGN E */
+ ["\u1BE8", "\u1BE8"], /* BATAK VOWEL SIGN PAKPAK E */
+ ["\u1BE9", "\u1BE9"], /* BATAK VOWEL SIGN EE */
+ ["\u1BEA", "\u1BEA"], /* BATAK VOWEL SIGN I */
+ ["\u1BEB", "\u1BEB"], /* BATAK VOWEL SIGN KARO I */
+ ["\u1BEC", "\u1BEC"], /* BATAK VOWEL SIGN O */
+ ["\u1BED", "\u1BED"], /* BATAK VOWEL SIGN KARO O */
+ ["\u1BEE", "\u1BEE"], /* BATAK VOWEL SIGN U */
+ ["\u1BEF", "\u1BEF"], /* BATAK VOWEL SIGN U FOR SIMALUNGUN SA */
+ ["\u1BF0", "\u1BF0"], /* BATAK CONSONANT SIGN NG */
+ ["\u1BF1", "\u1BF1"], /* BATAK CONSONANT SIGN H */
+ ["\u1BF2", "\u1BF2"], /* BATAK PANGOLAT */
+ ["\u1BF3", "\u1BF3"], /* BATAK PANONGONAN */
+ ["\u1BF4", "\u1BF4"],
+ ["\u1BF5", "\u1BF5"],
+ ["\u1BF6", "\u1BF6"],
+ ["\u1BF7", "\u1BF7"],
+ ["\u1BF8", "\u1BF8"],
+ ["\u1BF9", "\u1BF9"],
+ ["\u1BFA", "\u1BFA"],
+ ["\u1BFB", "\u1BFB"],
+ ["\u1BFC", "\u1BFC"], /* BATAK SYMBOL BINDU NA METEK */
+ ["\u1BFD", "\u1BFD"], /* BATAK SYMBOL BINDU PINARBORAS */
+ ["\u1BFE", "\u1BFE"], /* BATAK SYMBOL BINDU JUDUL */
+ ["\u1BFF", "\u1BFF"], /* BATAK SYMBOL BINDU PANGOLAT */
+ ["\u1C00", "\u1C00"], /* LEPCHA LETTER KA */
+ ["\u1C01", "\u1C01"], /* LEPCHA LETTER KLA */
+ ["\u1C02", "\u1C02"], /* LEPCHA LETTER KHA */
+ ["\u1C03", "\u1C03"], /* LEPCHA LETTER GA */
+ ["\u1C04", "\u1C04"], /* LEPCHA LETTER GLA */
+ ["\u1C05", "\u1C05"], /* LEPCHA LETTER NGA */
+ ["\u1C06", "\u1C06"], /* LEPCHA LETTER CA */
+ ["\u1C07", "\u1C07"], /* LEPCHA LETTER CHA */
+ ["\u1C08", "\u1C08"], /* LEPCHA LETTER JA */
+ ["\u1C09", "\u1C09"], /* LEPCHA LETTER NYA */
+ ["\u1C0A", "\u1C0A"], /* LEPCHA LETTER TA */
+ ["\u1C0B", "\u1C0B"], /* LEPCHA LETTER THA */
+ ["\u1C0C", "\u1C0C"], /* LEPCHA LETTER DA */
+ ["\u1C0D", "\u1C0D"], /* LEPCHA LETTER NA */
+ ["\u1C0E", "\u1C0E"], /* LEPCHA LETTER PA */
+ ["\u1C0F", "\u1C0F"], /* LEPCHA LETTER PLA */
+ ["\u1C10", "\u1C10"], /* LEPCHA LETTER PHA */
+ ["\u1C11", "\u1C11"], /* LEPCHA LETTER FA */
+ ["\u1C12", "\u1C12"], /* LEPCHA LETTER FLA */
+ ["\u1C13", "\u1C13"], /* LEPCHA LETTER BA */
+ ["\u1C14", "\u1C14"], /* LEPCHA LETTER BLA */
+ ["\u1C15", "\u1C15"], /* LEPCHA LETTER MA */
+ ["\u1C16", "\u1C16"], /* LEPCHA LETTER MLA */
+ ["\u1C17", "\u1C17"], /* LEPCHA LETTER TSA */
+ ["\u1C18", "\u1C18"], /* LEPCHA LETTER TSHA */
+ ["\u1C19", "\u1C19"], /* LEPCHA LETTER DZA */
+ ["\u1C1A", "\u1C1A"], /* LEPCHA LETTER YA */
+ ["\u1C1B", "\u1C1B"], /* LEPCHA LETTER RA */
+ ["\u1C1C", "\u1C1C"], /* LEPCHA LETTER LA */
+ ["\u1C1D", "\u1C1D"], /* LEPCHA LETTER HA */
+ ["\u1C1E", "\u1C1E"], /* LEPCHA LETTER HLA */
+ ["\u1C1F", "\u1C1F"], /* LEPCHA LETTER VA */
+ ["\u1C20", "\u1C20"], /* LEPCHA LETTER SA */
+ ["\u1C21", "\u1C21"], /* LEPCHA LETTER SHA */
+ ["\u1C22", "\u1C22"], /* LEPCHA LETTER WA */
+ ["\u1C23", "\u1C23"], /* LEPCHA LETTER A */
+ ["\u1C24", "\u1C24"], /* LEPCHA SUBJOINED LETTER YA */
+ ["\u1C25", "\u1C25"], /* LEPCHA SUBJOINED LETTER RA */
+ ["\u1C26", "\u1C26"], /* LEPCHA VOWEL SIGN AA */
+ ["\u1C27", "\u1C27"], /* LEPCHA VOWEL SIGN I */
+ ["\u1C28", "\u1C28"], /* LEPCHA VOWEL SIGN O */
+ ["\u1C29", "\u1C29"], /* LEPCHA VOWEL SIGN OO */
+ ["\u1C2A", "\u1C2A"], /* LEPCHA VOWEL SIGN U */
+ ["\u1C2B", "\u1C2B"], /* LEPCHA VOWEL SIGN UU */
+ ["\u1C2C", "\u1C2C"], /* LEPCHA VOWEL SIGN E */
+ ["\u1C2D", "\u1C2D"], /* LEPCHA CONSONANT SIGN K */
+ ["\u1C2E", "\u1C2E"], /* LEPCHA CONSONANT SIGN M */
+ ["\u1C2F", "\u1C2F"], /* LEPCHA CONSONANT SIGN L */
+ ["\u1C30", "\u1C30"], /* LEPCHA CONSONANT SIGN N */
+ ["\u1C31", "\u1C31"], /* LEPCHA CONSONANT SIGN P */
+ ["\u1C32", "\u1C32"], /* LEPCHA CONSONANT SIGN R */
+ ["\u1C33", "\u1C33"], /* LEPCHA CONSONANT SIGN T */
+ ["\u1C34", "\u1C34"], /* LEPCHA CONSONANT SIGN NYIN-DO */
+ ["\u1C35", "\u1C35"], /* LEPCHA CONSONANT SIGN KANG */
+ ["\u1C36", "\u1C36"], /* LEPCHA SIGN RAN */
+ ["\u1C37", "\u1C37"], /* LEPCHA SIGN NUKTA */
+ ["\u1C38", "\u1C38"],
+ ["\u1C39", "\u1C39"],
+ ["\u1C3A", "\u1C3A"],
+ ["\u1C3B", "\u1C3B"], /* LEPCHA PUNCTUATION TA-ROL */
+ ["\u1C3C", "\u1C3C"], /* LEPCHA PUNCTUATION NYET THYOOM TA-ROL */
+ ["\u1C3D", "\u1C3D"], /* LEPCHA PUNCTUATION CER-WA */
+ ["\u1C3E", "\u1C3E"], /* LEPCHA PUNCTUATION TSHOOK CER-WA */
+ ["\u1C3F", "\u1C3F"], /* LEPCHA PUNCTUATION TSHOOK */
+ ["\u1C40", "\u1C40"], /* LEPCHA DIGIT ZERO */
+ ["\u1C41", "\u1C41"], /* LEPCHA DIGIT ONE */
+ ["\u1C42", "\u1C42"], /* LEPCHA DIGIT TWO */
+ ["\u1C43", "\u1C43"], /* LEPCHA DIGIT THREE */
+ ["\u1C44", "\u1C44"], /* LEPCHA DIGIT FOUR */
+ ["\u1C45", "\u1C45"], /* LEPCHA DIGIT FIVE */
+ ["\u1C46", "\u1C46"], /* LEPCHA DIGIT SIX */
+ ["\u1C47", "\u1C47"], /* LEPCHA DIGIT SEVEN */
+ ["\u1C48", "\u1C48"], /* LEPCHA DIGIT EIGHT */
+ ["\u1C49", "\u1C49"], /* LEPCHA DIGIT NINE */
+ ["\u1C4A", "\u1C4A"],
+ ["\u1C4B", "\u1C4B"],
+ ["\u1C4C", "\u1C4C"],
+ ["\u1C4D", "\u1C4D"], /* LEPCHA LETTER TTA */
+ ["\u1C4E", "\u1C4E"], /* LEPCHA LETTER TTHA */
+ ["\u1C4F", "\u1C4F"], /* LEPCHA LETTER DDA */
+ ["\u1C50", "\u1C50"], /* OL CHIKI DIGIT ZERO */
+ ["\u1C51", "\u1C51"], /* OL CHIKI DIGIT ONE */
+ ["\u1C52", "\u1C52"], /* OL CHIKI DIGIT TWO */
+ ["\u1C53", "\u1C53"], /* OL CHIKI DIGIT THREE */
+ ["\u1C54", "\u1C54"], /* OL CHIKI DIGIT FOUR */
+ ["\u1C55", "\u1C55"], /* OL CHIKI DIGIT FIVE */
+ ["\u1C56", "\u1C56"], /* OL CHIKI DIGIT SIX */
+ ["\u1C57", "\u1C57"], /* OL CHIKI DIGIT SEVEN */
+ ["\u1C58", "\u1C58"], /* OL CHIKI DIGIT EIGHT */
+ ["\u1C59", "\u1C59"], /* OL CHIKI DIGIT NINE */
+ ["\u1C5A", "\u1C5A"], /* OL CHIKI LETTER LA */
+ ["\u1C5B", "\u1C5B"], /* OL CHIKI LETTER AT */
+ ["\u1C5C", "\u1C5C"], /* OL CHIKI LETTER AG */
+ ["\u1C5D", "\u1C5D"], /* OL CHIKI LETTER ANG */
+ ["\u1C5E", "\u1C5E"], /* OL CHIKI LETTER AL */
+ ["\u1C5F", "\u1C5F"], /* OL CHIKI LETTER LAA */
+ ["\u1C60", "\u1C60"], /* OL CHIKI LETTER AAK */
+ ["\u1C61", "\u1C61"], /* OL CHIKI LETTER AAJ */
+ ["\u1C62", "\u1C62"], /* OL CHIKI LETTER AAM */
+ ["\u1C63", "\u1C63"], /* OL CHIKI LETTER AAW */
+ ["\u1C64", "\u1C64"], /* OL CHIKI LETTER LI */
+ ["\u1C65", "\u1C65"], /* OL CHIKI LETTER IS */
+ ["\u1C66", "\u1C66"], /* OL CHIKI LETTER IH */
+ ["\u1C67", "\u1C67"], /* OL CHIKI LETTER INY */
+ ["\u1C68", "\u1C68"], /* OL CHIKI LETTER IR */
+ ["\u1C69", "\u1C69"], /* OL CHIKI LETTER LU */
+ ["\u1C6A", "\u1C6A"], /* OL CHIKI LETTER UC */
+ ["\u1C6B", "\u1C6B"], /* OL CHIKI LETTER UD */
+ ["\u1C6C", "\u1C6C"], /* OL CHIKI LETTER UNN */
+ ["\u1C6D", "\u1C6D"], /* OL CHIKI LETTER UY */
+ ["\u1C6E", "\u1C6E"], /* OL CHIKI LETTER LE */
+ ["\u1C6F", "\u1C6F"], /* OL CHIKI LETTER EP */
+ ["\u1C70", "\u1C70"], /* OL CHIKI LETTER EDD */
+ ["\u1C71", "\u1C71"], /* OL CHIKI LETTER EN */
+ ["\u1C72", "\u1C72"], /* OL CHIKI LETTER ERR */
+ ["\u1C73", "\u1C73"], /* OL CHIKI LETTER LO */
+ ["\u1C74", "\u1C74"], /* OL CHIKI LETTER OTT */
+ ["\u1C75", "\u1C75"], /* OL CHIKI LETTER OB */
+ ["\u1C76", "\u1C76"], /* OL CHIKI LETTER OV */
+ ["\u1C77", "\u1C77"], /* OL CHIKI LETTER OH */
+ ["\u1C78", "\u1C78"], /* OL CHIKI MU TTUDDAG */
+ ["\u1C79", "\u1C79"], /* OL CHIKI GAAHLAA TTUDDAAG */
+ ["\u1C7A", "\u1C7A"], /* OL CHIKI MU-GAAHLAA TTUDDAAG */
+ ["\u1C7B", "\u1C7B"], /* OL CHIKI RELAA */
+ ["\u1C7C", "\u1C7C"], /* OL CHIKI PHAARKAA */
+ ["\u1C7D", "\u1C7D"], /* OL CHIKI AHAD */
+ ["\u1C7E", "\u1C7E"], /* OL CHIKI PUNCTUATION MUCAAD */
+ ["\u1C7F", "\u1C7F"], /* OL CHIKI PUNCTUATION DOUBLE MUCAAD */
+ ["\u0412", "\u1C80"], /* CYRILLIC SMALL LETTER ROUNDED VE */
+ ["\u0414", "\u1C81"], /* CYRILLIC SMALL LETTER LONG-LEGGED DE */
+ ["\u041E", "\u1C82"], /* CYRILLIC SMALL LETTER NARROW O */
+ ["\u0421", "\u1C83"], /* CYRILLIC SMALL LETTER WIDE ES */
+ ["\u0422", "\u1C84"], /* CYRILLIC SMALL LETTER TALL TE */
+ ["\u0422", "\u1C85"], /* CYRILLIC SMALL LETTER THREE-LEGGED TE */
+ ["\u042A", "\u1C86"], /* CYRILLIC SMALL LETTER TALL HARD SIGN */
+ ["\u0462", "\u1C87"], /* CYRILLIC SMALL LETTER TALL YAT */
+ ["\uA64A", "\u1C88"], /* CYRILLIC SMALL LETTER UNBLENDED UK */
+ ["\u1C89", "\u1C89"],
+ ["\u1C8A", "\u1C8A"],
+ ["\u1C8B", "\u1C8B"],
+ ["\u1C8C", "\u1C8C"],
+ ["\u1C8D", "\u1C8D"],
+ ["\u1C8E", "\u1C8E"],
+ ["\u1C8F", "\u1C8F"],
+ ["\u1C90", "\u10D0"], /* GEORGIAN MTAVRULI CAPITAL LETTER AN */
+ ["\u1C91", "\u10D1"], /* GEORGIAN MTAVRULI CAPITAL LETTER BAN */
+ ["\u1C92", "\u10D2"], /* GEORGIAN MTAVRULI CAPITAL LETTER GAN */
+ ["\u1C93", "\u10D3"], /* GEORGIAN MTAVRULI CAPITAL LETTER DON */
+ ["\u1C94", "\u10D4"], /* GEORGIAN MTAVRULI CAPITAL LETTER EN */
+ ["\u1C95", "\u10D5"], /* GEORGIAN MTAVRULI CAPITAL LETTER VIN */
+ ["\u1C96", "\u10D6"], /* GEORGIAN MTAVRULI CAPITAL LETTER ZEN */
+ ["\u1C97", "\u10D7"], /* GEORGIAN MTAVRULI CAPITAL LETTER TAN */
+ ["\u1C98", "\u10D8"], /* GEORGIAN MTAVRULI CAPITAL LETTER IN */
+ ["\u1C99", "\u10D9"], /* GEORGIAN MTAVRULI CAPITAL LETTER KAN */
+ ["\u1C9A", "\u10DA"], /* GEORGIAN MTAVRULI CAPITAL LETTER LAS */
+ ["\u1C9B", "\u10DB"], /* GEORGIAN MTAVRULI CAPITAL LETTER MAN */
+ ["\u1C9C", "\u10DC"], /* GEORGIAN MTAVRULI CAPITAL LETTER NAR */
+ ["\u1C9D", "\u10DD"], /* GEORGIAN MTAVRULI CAPITAL LETTER ON */
+ ["\u1C9E", "\u10DE"], /* GEORGIAN MTAVRULI CAPITAL LETTER PAR */
+ ["\u1C9F", "\u10DF"], /* GEORGIAN MTAVRULI CAPITAL LETTER ZHAR */
+ ["\u1CA0", "\u10E0"], /* GEORGIAN MTAVRULI CAPITAL LETTER RAE */
+ ["\u1CA1", "\u10E1"], /* GEORGIAN MTAVRULI CAPITAL LETTER SAN */
+ ["\u1CA2", "\u10E2"], /* GEORGIAN MTAVRULI CAPITAL LETTER TAR */
+ ["\u1CA3", "\u10E3"], /* GEORGIAN MTAVRULI CAPITAL LETTER UN */
+ ["\u1CA4", "\u10E4"], /* GEORGIAN MTAVRULI CAPITAL LETTER PHAR */
+ ["\u1CA5", "\u10E5"], /* GEORGIAN MTAVRULI CAPITAL LETTER KHAR */
+ ["\u1CA6", "\u10E6"], /* GEORGIAN MTAVRULI CAPITAL LETTER GHAN */
+ ["\u1CA7", "\u10E7"], /* GEORGIAN MTAVRULI CAPITAL LETTER QAR */
+ ["\u1CA8", "\u10E8"], /* GEORGIAN MTAVRULI CAPITAL LETTER SHIN */
+ ["\u1CA9", "\u10E9"], /* GEORGIAN MTAVRULI CAPITAL LETTER CHIN */
+ ["\u1CAA", "\u10EA"], /* GEORGIAN MTAVRULI CAPITAL LETTER CAN */
+ ["\u1CAB", "\u10EB"], /* GEORGIAN MTAVRULI CAPITAL LETTER JIL */
+ ["\u1CAC", "\u10EC"], /* GEORGIAN MTAVRULI CAPITAL LETTER CIL */
+ ["\u1CAD", "\u10ED"], /* GEORGIAN MTAVRULI CAPITAL LETTER CHAR */
+ ["\u1CAE", "\u10EE"], /* GEORGIAN MTAVRULI CAPITAL LETTER XAN */
+ ["\u1CAF", "\u10EF"], /* GEORGIAN MTAVRULI CAPITAL LETTER JHAN */
+ ["\u1CB0", "\u10F0"], /* GEORGIAN MTAVRULI CAPITAL LETTER HAE */
+ ["\u1CB1", "\u10F1"], /* GEORGIAN MTAVRULI CAPITAL LETTER HE */
+ ["\u1CB2", "\u10F2"], /* GEORGIAN MTAVRULI CAPITAL LETTER HIE */
+ ["\u1CB3", "\u10F3"], /* GEORGIAN MTAVRULI CAPITAL LETTER WE */
+ ["\u1CB4", "\u10F4"], /* GEORGIAN MTAVRULI CAPITAL LETTER HAR */
+ ["\u1CB5", "\u10F5"], /* GEORGIAN MTAVRULI CAPITAL LETTER HOE */
+ ["\u1CB6", "\u10F6"], /* GEORGIAN MTAVRULI CAPITAL LETTER FI */
+ ["\u1CB7", "\u10F7"], /* GEORGIAN MTAVRULI CAPITAL LETTER YN */
+ ["\u1CB8", "\u10F8"], /* GEORGIAN MTAVRULI CAPITAL LETTER ELIFI */
+ ["\u1CB9", "\u10F9"], /* GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN */
+ ["\u1CBA", "\u10FA"], /* GEORGIAN MTAVRULI CAPITAL LETTER AIN */
+ ["\u1CBB", "\u1CBB"],
+ ["\u1CBC", "\u1CBC"],
+ ["\u1CBD", "\u10FD"], /* GEORGIAN MTAVRULI CAPITAL LETTER AEN */
+ ["\u1CBE", "\u10FE"], /* GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN */
+ ["\u1CBF", "\u10FF"], /* GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN */
+ ["\u1CC0", "\u1CC0"], /* SUNDANESE PUNCTUATION BINDU SURYA */
+ ["\u1CC1", "\u1CC1"], /* SUNDANESE PUNCTUATION BINDU PANGLONG */
+ ["\u1CC2", "\u1CC2"], /* SUNDANESE PUNCTUATION BINDU PURNAMA */
+ ["\u1CC3", "\u1CC3"], /* SUNDANESE PUNCTUATION BINDU CAKRA */
+ ["\u1CC4", "\u1CC4"], /* SUNDANESE PUNCTUATION BINDU LEU SATANGA */
+ ["\u1CC5", "\u1CC5"], /* SUNDANESE PUNCTUATION BINDU KA SATANGA */
+ ["\u1CC6", "\u1CC6"], /* SUNDANESE PUNCTUATION BINDU DA SATANGA */
+ ["\u1CC7", "\u1CC7"], /* SUNDANESE PUNCTUATION BINDU BA SATANGA */
+ ["\u1CC8", "\u1CC8"],
+ ["\u1CC9", "\u1CC9"],
+ ["\u1CCA", "\u1CCA"],
+ ["\u1CCB", "\u1CCB"],
+ ["\u1CCC", "\u1CCC"],
+ ["\u1CCD", "\u1CCD"],
+ ["\u1CCE", "\u1CCE"],
+ ["\u1CCF", "\u1CCF"],
+ ["\u1CD0", "\u1CD0"], /* VEDIC TONE KARSHANA */
+ ["\u1CD1", "\u1CD1"], /* VEDIC TONE SHARA */
+ ["\u1CD2", "\u1CD2"], /* VEDIC TONE PRENKHA */
+ ["\u1CD3", "\u1CD3"], /* VEDIC SIGN NIHSHVASA */
+ ["\u1CD4", "\u1CD4"], /* VEDIC SIGN YAJURVEDIC MIDLINE SVARITA */
+ ["\u1CD5", "\u1CD5"], /* VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA */
+ ["\u1CD6", "\u1CD6"], /* VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA */
+ ["\u1CD7", "\u1CD7"], /* VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA */
+ ["\u1CD8", "\u1CD8"], /* VEDIC TONE CANDRA BELOW */
+ ["\u1CD9", "\u1CD9"], /* VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER */
+ ["\u1CDA", "\u1CDA"], /* VEDIC TONE DOUBLE SVARITA */
+ ["\u1CDB", "\u1CDB"], /* VEDIC TONE TRIPLE SVARITA */
+ ["\u1CDC", "\u1CDC"], /* VEDIC TONE KATHAKA ANUDATTA */
+ ["\u1CDD", "\u1CDD"], /* VEDIC TONE DOT BELOW */
+ ["\u1CDE", "\u1CDE"], /* VEDIC TONE TWO DOTS BELOW */
+ ["\u1CDF", "\u1CDF"], /* VEDIC TONE THREE DOTS BELOW */
+ ["\u1CE0", "\u1CE0"], /* VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA */
+ ["\u1CE1", "\u1CE1"], /* VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA */
+ ["\u1CE2", "\u1CE2"], /* VEDIC SIGN VISARGA SVARITA */
+ ["\u1CE3", "\u1CE3"], /* VEDIC SIGN VISARGA UDATTA */
+ ["\u1CE4", "\u1CE4"], /* VEDIC SIGN REVERSED VISARGA UDATTA */
+ ["\u1CE5", "\u1CE5"], /* VEDIC SIGN VISARGA ANUDATTA */
+ ["\u1CE6", "\u1CE6"], /* VEDIC SIGN REVERSED VISARGA ANUDATTA */
+ ["\u1CE7", "\u1CE7"], /* VEDIC SIGN VISARGA UDATTA WITH TAIL */
+ ["\u1CE8", "\u1CE8"], /* VEDIC SIGN VISARGA ANUDATTA WITH TAIL */
+ ["\u1CE9", "\u1CE9"], /* VEDIC SIGN ANUSVARA ANTARGOMUKHA */
+ ["\u1CEA", "\u1CEA"], /* VEDIC SIGN ANUSVARA BAHIRGOMUKHA */
+ ["\u1CEB", "\u1CEB"], /* VEDIC SIGN ANUSVARA VAMAGOMUKHA */
+ ["\u1CEC", "\u1CEC"], /* VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL */
+ ["\u1CED", "\u1CED"], /* VEDIC SIGN TIRYAK */
+ ["\u1CEE", "\u1CEE"], /* VEDIC SIGN HEXIFORM LONG ANUSVARA */
+ ["\u1CEF", "\u1CEF"], /* VEDIC SIGN LONG ANUSVARA */
+ ["\u1CF0", "\u1CF0"], /* VEDIC SIGN RTHANG LONG ANUSVARA */
+ ["\u1CF1", "\u1CF1"], /* VEDIC SIGN ANUSVARA UBHAYATO MUKHA */
+ ["\u1CF2", "\u1CF2"], /* VEDIC SIGN ARDHAVISARGA */
+ ["\u1CF3", "\u1CF3"], /* VEDIC SIGN ROTATED ARDHAVISARGA */
+ ["\u1CF4", "\u1CF4"], /* VEDIC TONE CANDRA ABOVE */
+ ["\u1CF5", "\u1CF5"], /* VEDIC SIGN JIHVAMULIYA */
+ ["\u1CF6", "\u1CF6"], /* VEDIC SIGN UPADHMANIYA */
+ ["\u1CF7", "\u1CF7"], /* VEDIC SIGN ATIKRAMA */
+ ["\u1CF8", "\u1CF8"], /* VEDIC TONE RING ABOVE */
+ ["\u1CF9", "\u1CF9"], /* VEDIC TONE DOUBLE RING ABOVE */
+ ["\u1CFA", "\u1CFA"],
+ ["\u1CFB", "\u1CFB"],
+ ["\u1CFC", "\u1CFC"],
+ ["\u1CFD", "\u1CFD"],
+ ["\u1CFE", "\u1CFE"],
+ ["\u1CFF", "\u1CFF"],
+ ["\u1D00", "\u1D00"], /* LATIN LETTER SMALL CAPITAL A */
+ ["\u1D01", "\u1D01"], /* LATIN LETTER SMALL CAPITAL AE */
+ ["\u1D02", "\u1D02"], /* LATIN SMALL LETTER TURNED AE */
+ ["\u1D03", "\u1D03"], /* LATIN LETTER SMALL CAPITAL BARRED B */
+ ["\u1D04", "\u1D04"], /* LATIN LETTER SMALL CAPITAL C */
+ ["\u1D05", "\u1D05"], /* LATIN LETTER SMALL CAPITAL D */
+ ["\u1D06", "\u1D06"], /* LATIN LETTER SMALL CAPITAL ETH */
+ ["\u1D07", "\u1D07"], /* LATIN LETTER SMALL CAPITAL E */
+ ["\u1D08", "\u1D08"], /* LATIN SMALL LETTER TURNED OPEN E */
+ ["\u1D09", "\u1D09"], /* LATIN SMALL LETTER TURNED I */
+ ["\u1D0A", "\u1D0A"], /* LATIN LETTER SMALL CAPITAL J */
+ ["\u1D0B", "\u1D0B"], /* LATIN LETTER SMALL CAPITAL K */
+ ["\u1D0C", "\u1D0C"], /* LATIN LETTER SMALL CAPITAL L WITH STROKE */
+ ["\u1D0D", "\u1D0D"], /* LATIN LETTER SMALL CAPITAL M */
+ ["\u1D0E", "\u1D0E"], /* LATIN LETTER SMALL CAPITAL REVERSED N */
+ ["\u1D0F", "\u1D0F"], /* LATIN LETTER SMALL CAPITAL O */
+ ["\u1D10", "\u1D10"], /* LATIN LETTER SMALL CAPITAL OPEN O */
+ ["\u1D11", "\u1D11"], /* LATIN SMALL LETTER SIDEWAYS O */
+ ["\u1D12", "\u1D12"], /* LATIN SMALL LETTER SIDEWAYS OPEN O */
+ ["\u1D13", "\u1D13"], /* LATIN SMALL LETTER SIDEWAYS O WITH STROKE */
+ ["\u1D14", "\u1D14"], /* LATIN SMALL LETTER TURNED OE */
+ ["\u1D15", "\u1D15"], /* LATIN LETTER SMALL CAPITAL OU */
+ ["\u1D16", "\u1D16"], /* LATIN SMALL LETTER TOP HALF O */
+ ["\u1D17", "\u1D17"], /* LATIN SMALL LETTER BOTTOM HALF O */
+ ["\u1D18", "\u1D18"], /* LATIN LETTER SMALL CAPITAL P */
+ ["\u1D19", "\u1D19"], /* LATIN LETTER SMALL CAPITAL REVERSED R */
+ ["\u1D1A", "\u1D1A"], /* LATIN LETTER SMALL CAPITAL TURNED R */
+ ["\u1D1B", "\u1D1B"], /* LATIN LETTER SMALL CAPITAL T */
+ ["\u1D1C", "\u1D1C"], /* LATIN LETTER SMALL CAPITAL U */
+ ["\u1D1D", "\u1D1D"], /* LATIN SMALL LETTER SIDEWAYS U */
+ ["\u1D1E", "\u1D1E"], /* LATIN SMALL LETTER SIDEWAYS DIAERESIZED U */
+ ["\u1D1F", "\u1D1F"], /* LATIN SMALL LETTER SIDEWAYS TURNED M */
+ ["\u1D20", "\u1D20"], /* LATIN LETTER SMALL CAPITAL V */
+ ["\u1D21", "\u1D21"], /* LATIN LETTER SMALL CAPITAL W */
+ ["\u1D22", "\u1D22"], /* LATIN LETTER SMALL CAPITAL Z */
+ ["\u1D23", "\u1D23"], /* LATIN LETTER SMALL CAPITAL EZH */
+ ["\u1D24", "\u1D24"], /* LATIN LETTER VOICED LARYNGEAL SPIRANT */
+ ["\u1D25", "\u1D25"], /* LATIN LETTER AIN */
+ ["\u1D26", "\u1D26"], /* GREEK LETTER SMALL CAPITAL GAMMA */
+ ["\u1D27", "\u1D27"], /* GREEK LETTER SMALL CAPITAL LAMDA */
+ ["\u1D28", "\u1D28"], /* GREEK LETTER SMALL CAPITAL PI */
+ ["\u1D29", "\u1D29"], /* GREEK LETTER SMALL CAPITAL RHO */
+ ["\u1D2A", "\u1D2A"], /* GREEK LETTER SMALL CAPITAL PSI */
+ ["\u1D2B", "\u1D2B"], /* CYRILLIC LETTER SMALL CAPITAL EL */
+ ["\u1D2C", "\u1D2C"], /* MODIFIER LETTER CAPITAL A */
+ ["\u1D2D", "\u1D2D"], /* MODIFIER LETTER CAPITAL AE */
+ ["\u1D2E", "\u1D2E"], /* MODIFIER LETTER CAPITAL B */
+ ["\u1D2F", "\u1D2F"], /* MODIFIER LETTER CAPITAL BARRED B */
+ ["\u1D30", "\u1D30"], /* MODIFIER LETTER CAPITAL D */
+ ["\u1D31", "\u1D31"], /* MODIFIER LETTER CAPITAL E */
+ ["\u1D32", "\u1D32"], /* MODIFIER LETTER CAPITAL REVERSED E */
+ ["\u1D33", "\u1D33"], /* MODIFIER LETTER CAPITAL G */
+ ["\u1D34", "\u1D34"], /* MODIFIER LETTER CAPITAL H */
+ ["\u1D35", "\u1D35"], /* MODIFIER LETTER CAPITAL I */
+ ["\u1D36", "\u1D36"], /* MODIFIER LETTER CAPITAL J */
+ ["\u1D37", "\u1D37"], /* MODIFIER LETTER CAPITAL K */
+ ["\u1D38", "\u1D38"], /* MODIFIER LETTER CAPITAL L */
+ ["\u1D39", "\u1D39"], /* MODIFIER LETTER CAPITAL M */
+ ["\u1D3A", "\u1D3A"], /* MODIFIER LETTER CAPITAL N */
+ ["\u1D3B", "\u1D3B"], /* MODIFIER LETTER CAPITAL REVERSED N */
+ ["\u1D3C", "\u1D3C"], /* MODIFIER LETTER CAPITAL O */
+ ["\u1D3D", "\u1D3D"], /* MODIFIER LETTER CAPITAL OU */
+ ["\u1D3E", "\u1D3E"], /* MODIFIER LETTER CAPITAL P */
+ ["\u1D3F", "\u1D3F"], /* MODIFIER LETTER CAPITAL R */
+ ["\u1D40", "\u1D40"], /* MODIFIER LETTER CAPITAL T */
+ ["\u1D41", "\u1D41"], /* MODIFIER LETTER CAPITAL U */
+ ["\u1D42", "\u1D42"], /* MODIFIER LETTER CAPITAL W */
+ ["\u1D43", "\u1D43"], /* MODIFIER LETTER SMALL A */
+ ["\u1D44", "\u1D44"], /* MODIFIER LETTER SMALL TURNED A */
+ ["\u1D45", "\u1D45"], /* MODIFIER LETTER SMALL ALPHA */
+ ["\u1D46", "\u1D46"], /* MODIFIER LETTER SMALL TURNED AE */
+ ["\u1D47", "\u1D47"], /* MODIFIER LETTER SMALL B */
+ ["\u1D48", "\u1D48"], /* MODIFIER LETTER SMALL D */
+ ["\u1D49", "\u1D49"], /* MODIFIER LETTER SMALL E */
+ ["\u1D4A", "\u1D4A"], /* MODIFIER LETTER SMALL SCHWA */
+ ["\u1D4B", "\u1D4B"], /* MODIFIER LETTER SMALL OPEN E */
+ ["\u1D4C", "\u1D4C"], /* MODIFIER LETTER SMALL TURNED OPEN E */
+ ["\u1D4D", "\u1D4D"], /* MODIFIER LETTER SMALL G */
+ ["\u1D4E", "\u1D4E"], /* MODIFIER LETTER SMALL TURNED I */
+ ["\u1D4F", "\u1D4F"], /* MODIFIER LETTER SMALL K */
+ ["\u1D50", "\u1D50"], /* MODIFIER LETTER SMALL M */
+ ["\u1D51", "\u1D51"], /* MODIFIER LETTER SMALL ENG */
+ ["\u1D52", "\u1D52"], /* MODIFIER LETTER SMALL O */
+ ["\u1D53", "\u1D53"], /* MODIFIER LETTER SMALL OPEN O */
+ ["\u1D54", "\u1D54"], /* MODIFIER LETTER SMALL TOP HALF O */
+ ["\u1D55", "\u1D55"], /* MODIFIER LETTER SMALL BOTTOM HALF O */
+ ["\u1D56", "\u1D56"], /* MODIFIER LETTER SMALL P */
+ ["\u1D57", "\u1D57"], /* MODIFIER LETTER SMALL T */
+ ["\u1D58", "\u1D58"], /* MODIFIER LETTER SMALL U */
+ ["\u1D59", "\u1D59"], /* MODIFIER LETTER SMALL SIDEWAYS U */
+ ["\u1D5A", "\u1D5A"], /* MODIFIER LETTER SMALL TURNED M */
+ ["\u1D5B", "\u1D5B"], /* MODIFIER LETTER SMALL V */
+ ["\u1D5C", "\u1D5C"], /* MODIFIER LETTER SMALL AIN */
+ ["\u1D5D", "\u1D5D"], /* MODIFIER LETTER SMALL BETA */
+ ["\u1D5E", "\u1D5E"], /* MODIFIER LETTER SMALL GREEK GAMMA */
+ ["\u1D5F", "\u1D5F"], /* MODIFIER LETTER SMALL DELTA */
+ ["\u1D60", "\u1D60"], /* MODIFIER LETTER SMALL GREEK PHI */
+ ["\u1D61", "\u1D61"], /* MODIFIER LETTER SMALL CHI */
+ ["\u1D62", "\u1D62"], /* LATIN SUBSCRIPT SMALL LETTER I */
+ ["\u1D63", "\u1D63"], /* LATIN SUBSCRIPT SMALL LETTER R */
+ ["\u1D64", "\u1D64"], /* LATIN SUBSCRIPT SMALL LETTER U */
+ ["\u1D65", "\u1D65"], /* LATIN SUBSCRIPT SMALL LETTER V */
+ ["\u1D66", "\u1D66"], /* GREEK SUBSCRIPT SMALL LETTER BETA */
+ ["\u1D67", "\u1D67"], /* GREEK SUBSCRIPT SMALL LETTER GAMMA */
+ ["\u1D68", "\u1D68"], /* GREEK SUBSCRIPT SMALL LETTER RHO */
+ ["\u1D69", "\u1D69"], /* GREEK SUBSCRIPT SMALL LETTER PHI */
+ ["\u1D6A", "\u1D6A"], /* GREEK SUBSCRIPT SMALL LETTER CHI */
+ ["\u1D6B", "\u1D6B"], /* LATIN SMALL LETTER UE */
+ ["\u1D6C", "\u1D6C"], /* LATIN SMALL LETTER B WITH MIDDLE TILDE */
+ ["\u1D6D", "\u1D6D"], /* LATIN SMALL LETTER D WITH MIDDLE TILDE */
+ ["\u1D6E", "\u1D6E"], /* LATIN SMALL LETTER F WITH MIDDLE TILDE */
+ ["\u1D6F", "\u1D6F"], /* LATIN SMALL LETTER M WITH MIDDLE TILDE */
+ ["\u1D70", "\u1D70"], /* LATIN SMALL LETTER N WITH MIDDLE TILDE */
+ ["\u1D71", "\u1D71"], /* LATIN SMALL LETTER P WITH MIDDLE TILDE */
+ ["\u1D72", "\u1D72"], /* LATIN SMALL LETTER R WITH MIDDLE TILDE */
+ ["\u1D73", "\u1D73"], /* LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE */
+ ["\u1D74", "\u1D74"], /* LATIN SMALL LETTER S WITH MIDDLE TILDE */
+ ["\u1D75", "\u1D75"], /* LATIN SMALL LETTER T WITH MIDDLE TILDE */
+ ["\u1D76", "\u1D76"], /* LATIN SMALL LETTER Z WITH MIDDLE TILDE */
+ ["\u1D77", "\u1D77"], /* LATIN SMALL LETTER TURNED G */
+ ["\u1D78", "\u1D78"], /* MODIFIER LETTER CYRILLIC EN */
+ ["\uA77D", "\u1D79"], /* LATIN SMALL LETTER INSULAR G */
+ ["\u1D7A", "\u1D7A"], /* LATIN SMALL LETTER TH WITH STRIKETHROUGH */
+ ["\u1D7B", "\u1D7B"], /* LATIN SMALL CAPITAL LETTER I WITH STROKE */
+ ["\u1D7C", "\u1D7C"], /* LATIN SMALL LETTER IOTA WITH STROKE */
+ ["\u2C63", "\u1D7D"], /* LATIN SMALL LETTER P WITH STROKE */
+ ["\u1D7E", "\u1D7E"], /* LATIN SMALL CAPITAL LETTER U WITH STROKE */
+ ["\u1D7F", "\u1D7F"], /* LATIN SMALL LETTER UPSILON WITH STROKE */
+ ["\u1D80", "\u1D80"], /* LATIN SMALL LETTER B WITH PALATAL HOOK */
+ ["\u1D81", "\u1D81"], /* LATIN SMALL LETTER D WITH PALATAL HOOK */
+ ["\u1D82", "\u1D82"], /* LATIN SMALL LETTER F WITH PALATAL HOOK */
+ ["\u1D83", "\u1D83"], /* LATIN SMALL LETTER G WITH PALATAL HOOK */
+ ["\u1D84", "\u1D84"], /* LATIN SMALL LETTER K WITH PALATAL HOOK */
+ ["\u1D85", "\u1D85"], /* LATIN SMALL LETTER L WITH PALATAL HOOK */
+ ["\u1D86", "\u1D86"], /* LATIN SMALL LETTER M WITH PALATAL HOOK */
+ ["\u1D87", "\u1D87"], /* LATIN SMALL LETTER N WITH PALATAL HOOK */
+ ["\u1D88", "\u1D88"], /* LATIN SMALL LETTER P WITH PALATAL HOOK */
+ ["\u1D89", "\u1D89"], /* LATIN SMALL LETTER R WITH PALATAL HOOK */
+ ["\u1D8A", "\u1D8A"], /* LATIN SMALL LETTER S WITH PALATAL HOOK */
+ ["\u1D8B", "\u1D8B"], /* LATIN SMALL LETTER ESH WITH PALATAL HOOK */
+ ["\u1D8C", "\u1D8C"], /* LATIN SMALL LETTER V WITH PALATAL HOOK */
+ ["\u1D8D", "\u1D8D"], /* LATIN SMALL LETTER X WITH PALATAL HOOK */
+ ["\u1D8E", "\u1D8E"], /* LATIN SMALL LETTER Z WITH PALATAL HOOK */
+ ["\u1D8F", "\u1D8F"], /* LATIN SMALL LETTER A WITH RETROFLEX HOOK */
+ ["\u1D90", "\u1D90"], /* LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK */
+ ["\u1D91", "\u1D91"], /* LATIN SMALL LETTER D WITH HOOK AND TAIL */
+ ["\u1D92", "\u1D92"], /* LATIN SMALL LETTER E WITH RETROFLEX HOOK */
+ ["\u1D93", "\u1D93"], /* LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK */
+ ["\u1D94", "\u1D94"], /* LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK */
+ ["\u1D95", "\u1D95"], /* LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK */
+ ["\u1D96", "\u1D96"], /* LATIN SMALL LETTER I WITH RETROFLEX HOOK */
+ ["\u1D97", "\u1D97"], /* LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK */
+ ["\u1D98", "\u1D98"], /* LATIN SMALL LETTER ESH WITH RETROFLEX HOOK */
+ ["\u1D99", "\u1D99"], /* LATIN SMALL LETTER U WITH RETROFLEX HOOK */
+ ["\u1D9A", "\u1D9A"], /* LATIN SMALL LETTER EZH WITH RETROFLEX HOOK */
+ ["\u1D9B", "\u1D9B"], /* MODIFIER LETTER SMALL TURNED ALPHA */
+ ["\u1D9C", "\u1D9C"], /* MODIFIER LETTER SMALL C */
+ ["\u1D9D", "\u1D9D"], /* MODIFIER LETTER SMALL C WITH CURL */
+ ["\u1D9E", "\u1D9E"], /* MODIFIER LETTER SMALL ETH */
+ ["\u1D9F", "\u1D9F"], /* MODIFIER LETTER SMALL REVERSED OPEN E */
+ ["\u1DA0", "\u1DA0"], /* MODIFIER LETTER SMALL F */
+ ["\u1DA1", "\u1DA1"], /* MODIFIER LETTER SMALL DOTLESS J WITH STROKE */
+ ["\u1DA2", "\u1DA2"], /* MODIFIER LETTER SMALL SCRIPT G */
+ ["\u1DA3", "\u1DA3"], /* MODIFIER LETTER SMALL TURNED H */
+ ["\u1DA4", "\u1DA4"], /* MODIFIER LETTER SMALL I WITH STROKE */
+ ["\u1DA5", "\u1DA5"], /* MODIFIER LETTER SMALL IOTA */
+ ["\u1DA6", "\u1DA6"], /* MODIFIER LETTER SMALL CAPITAL I */
+ ["\u1DA7", "\u1DA7"], /* MODIFIER LETTER SMALL CAPITAL I WITH STROKE */
+ ["\u1DA8", "\u1DA8"], /* MODIFIER LETTER SMALL J WITH CROSSED-TAIL */
+ ["\u1DA9", "\u1DA9"], /* MODIFIER LETTER SMALL L WITH RETROFLEX HOOK */
+ ["\u1DAA", "\u1DAA"], /* MODIFIER LETTER SMALL L WITH PALATAL HOOK */
+ ["\u1DAB", "\u1DAB"], /* MODIFIER LETTER SMALL CAPITAL L */
+ ["\u1DAC", "\u1DAC"], /* MODIFIER LETTER SMALL M WITH HOOK */
+ ["\u1DAD", "\u1DAD"], /* MODIFIER LETTER SMALL TURNED M WITH LONG LEG */
+ ["\u1DAE", "\u1DAE"], /* MODIFIER LETTER SMALL N WITH LEFT HOOK */
+ ["\u1DAF", "\u1DAF"], /* MODIFIER LETTER SMALL N WITH RETROFLEX HOOK */
+ ["\u1DB0", "\u1DB0"], /* MODIFIER LETTER SMALL CAPITAL N */
+ ["\u1DB1", "\u1DB1"], /* MODIFIER LETTER SMALL BARRED O */
+ ["\u1DB2", "\u1DB2"], /* MODIFIER LETTER SMALL PHI */
+ ["\u1DB3", "\u1DB3"], /* MODIFIER LETTER SMALL S WITH HOOK */
+ ["\u1DB4", "\u1DB4"], /* MODIFIER LETTER SMALL ESH */
+ ["\u1DB5", "\u1DB5"], /* MODIFIER LETTER SMALL T WITH PALATAL HOOK */
+ ["\u1DB6", "\u1DB6"], /* MODIFIER LETTER SMALL U BAR */
+ ["\u1DB7", "\u1DB7"], /* MODIFIER LETTER SMALL UPSILON */
+ ["\u1DB8", "\u1DB8"], /* MODIFIER LETTER SMALL CAPITAL U */
+ ["\u1DB9", "\u1DB9"], /* MODIFIER LETTER SMALL V WITH HOOK */
+ ["\u1DBA", "\u1DBA"], /* MODIFIER LETTER SMALL TURNED V */
+ ["\u1DBB", "\u1DBB"], /* MODIFIER LETTER SMALL Z */
+ ["\u1DBC", "\u1DBC"], /* MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK */
+ ["\u1DBD", "\u1DBD"], /* MODIFIER LETTER SMALL Z WITH CURL */
+ ["\u1DBE", "\u1DBE"], /* MODIFIER LETTER SMALL EZH */
+ ["\u1DBF", "\u1DBF"], /* MODIFIER LETTER SMALL THETA */
+ ["\u1DC0", "\u1DC0"], /* COMBINING DOTTED GRAVE ACCENT */
+ ["\u1DC1", "\u1DC1"], /* COMBINING DOTTED ACUTE ACCENT */
+ ["\u1DC2", "\u1DC2"], /* COMBINING SNAKE BELOW */
+ ["\u1DC3", "\u1DC3"], /* COMBINING SUSPENSION MARK */
+ ["\u1DC4", "\u1DC4"], /* COMBINING MACRON-ACUTE */
+ ["\u1DC5", "\u1DC5"], /* COMBINING GRAVE-MACRON */
+ ["\u1DC6", "\u1DC6"], /* COMBINING MACRON-GRAVE */
+ ["\u1DC7", "\u1DC7"], /* COMBINING ACUTE-MACRON */
+ ["\u1DC8", "\u1DC8"], /* COMBINING GRAVE-ACUTE-GRAVE */
+ ["\u1DC9", "\u1DC9"], /* COMBINING ACUTE-GRAVE-ACUTE */
+ ["\u1DCA", "\u1DCA"], /* COMBINING LATIN SMALL LETTER R BELOW */
+ ["\u1DCB", "\u1DCB"], /* COMBINING BREVE-MACRON */
+ ["\u1DCC", "\u1DCC"], /* COMBINING MACRON-BREVE */
+ ["\u1DCD", "\u1DCD"], /* COMBINING DOUBLE CIRCUMFLEX ABOVE */
+ ["\u1DCE", "\u1DCE"], /* COMBINING OGONEK ABOVE */
+ ["\u1DCF", "\u1DCF"], /* COMBINING ZIGZAG BELOW */
+ ["\u1DD0", "\u1DD0"], /* COMBINING IS BELOW */
+ ["\u1DD1", "\u1DD1"], /* COMBINING UR ABOVE */
+ ["\u1DD2", "\u1DD2"], /* COMBINING US ABOVE */
+ ["\u1DD3", "\u1DD3"], /* COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE */
+ ["\u1DD4", "\u1DD4"], /* COMBINING LATIN SMALL LETTER AE */
+ ["\u1DD5", "\u1DD5"], /* COMBINING LATIN SMALL LETTER AO */
+ ["\u1DD6", "\u1DD6"], /* COMBINING LATIN SMALL LETTER AV */
+ ["\u1DD7", "\u1DD7"], /* COMBINING LATIN SMALL LETTER C CEDILLA */
+ ["\u1DD8", "\u1DD8"], /* COMBINING LATIN SMALL LETTER INSULAR D */
+ ["\u1DD9", "\u1DD9"], /* COMBINING LATIN SMALL LETTER ETH */
+ ["\u1DDA", "\u1DDA"], /* COMBINING LATIN SMALL LETTER G */
+ ["\u1DDB", "\u1DDB"], /* COMBINING LATIN LETTER SMALL CAPITAL G */
+ ["\u1DDC", "\u1DDC"], /* COMBINING LATIN SMALL LETTER K */
+ ["\u1DDD", "\u1DDD"], /* COMBINING LATIN SMALL LETTER L */
+ ["\u1DDE", "\u1DDE"], /* COMBINING LATIN LETTER SMALL CAPITAL L */
+ ["\u1DDF", "\u1DDF"], /* COMBINING LATIN LETTER SMALL CAPITAL M */
+ ["\u1DE0", "\u1DE0"], /* COMBINING LATIN SMALL LETTER N */
+ ["\u1DE1", "\u1DE1"], /* COMBINING LATIN LETTER SMALL CAPITAL N */
+ ["\u1DE2", "\u1DE2"], /* COMBINING LATIN LETTER SMALL CAPITAL R */
+ ["\u1DE3", "\u1DE3"], /* COMBINING LATIN SMALL LETTER R ROTUNDA */
+ ["\u1DE4", "\u1DE4"], /* COMBINING LATIN SMALL LETTER S */
+ ["\u1DE5", "\u1DE5"], /* COMBINING LATIN SMALL LETTER LONG S */
+ ["\u1DE6", "\u1DE6"], /* COMBINING LATIN SMALL LETTER Z */
+ ["\u1DE7", "\u1DE7"], /* COMBINING LATIN SMALL LETTER ALPHA */
+ ["\u1DE8", "\u1DE8"], /* COMBINING LATIN SMALL LETTER B */
+ ["\u1DE9", "\u1DE9"], /* COMBINING LATIN SMALL LETTER BETA */
+ ["\u1DEA", "\u1DEA"], /* COMBINING LATIN SMALL LETTER SCHWA */
+ ["\u1DEB", "\u1DEB"], /* COMBINING LATIN SMALL LETTER F */
+ ["\u1DEC", "\u1DEC"], /* COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */
+ ["\u1DED", "\u1DED"], /* COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE */
+ ["\u1DEE", "\u1DEE"], /* COMBINING LATIN SMALL LETTER P */
+ ["\u1DEF", "\u1DEF"], /* COMBINING LATIN SMALL LETTER ESH */
+ ["\u1DF0", "\u1DF0"], /* COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE */
+ ["\u1DF1", "\u1DF1"], /* COMBINING LATIN SMALL LETTER W */
+ ["\u1DF2", "\u1DF2"], /* COMBINING LATIN SMALL LETTER A WITH DIAERESIS */
+ ["\u1DF3", "\u1DF3"], /* COMBINING LATIN SMALL LETTER O WITH DIAERESIS */
+ ["\u1DF4", "\u1DF4"], /* COMBINING LATIN SMALL LETTER U WITH DIAERESIS */
+ ["\u1DF5", "\u1DF5"], /* COMBINING UP TACK ABOVE */
+ ["\u1DF6", "\u1DF6"], /* COMBINING KAVYKA ABOVE RIGHT */
+ ["\u1DF7", "\u1DF7"], /* COMBINING KAVYKA ABOVE LEFT */
+ ["\u1DF8", "\u1DF8"], /* COMBINING DOT ABOVE LEFT */
+ ["\u1DF9", "\u1DF9"], /* COMBINING WIDE INVERTED BRIDGE BELOW */
+ ["\u1DFA", "\u1DFA"],
+ ["\u1DFB", "\u1DFB"], /* COMBINING DELETION MARK */
+ ["\u1DFC", "\u1DFC"], /* COMBINING DOUBLE INVERTED BREVE BELOW */
+ ["\u1DFD", "\u1DFD"], /* COMBINING ALMOST EQUAL TO BELOW */
+ ["\u1DFE", "\u1DFE"], /* COMBINING LEFT ARROWHEAD ABOVE */
+ ["\u1DFF", "\u1DFF"], /* COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW */
+ ["\u1E00", "\u1E01"], /* LATIN CAPITAL LETTER A WITH RING BELOW */
+ ["\u1E00", "\u1E01"], /* LATIN SMALL LETTER A WITH RING BELOW */
+ ["\u1E02", "\u1E03"], /* LATIN CAPITAL LETTER B WITH DOT ABOVE */
+ ["\u1E02", "\u1E03"], /* LATIN SMALL LETTER B WITH DOT ABOVE */
+ ["\u1E04", "\u1E05"], /* LATIN CAPITAL LETTER B WITH DOT BELOW */
+ ["\u1E04", "\u1E05"], /* LATIN SMALL LETTER B WITH DOT BELOW */
+ ["\u1E06", "\u1E07"], /* LATIN CAPITAL LETTER B WITH LINE BELOW */
+ ["\u1E06", "\u1E07"], /* LATIN SMALL LETTER B WITH LINE BELOW */
+ ["\u1E08", "\u1E09"], /* LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */
+ ["\u1E08", "\u1E09"], /* LATIN SMALL LETTER C WITH CEDILLA AND ACUTE */
+ ["\u1E0A", "\u1E0B"], /* LATIN CAPITAL LETTER D WITH DOT ABOVE */
+ ["\u1E0A", "\u1E0B"], /* LATIN SMALL LETTER D WITH DOT ABOVE */
+ ["\u1E0C", "\u1E0D"], /* LATIN CAPITAL LETTER D WITH DOT BELOW */
+ ["\u1E0C", "\u1E0D"], /* LATIN SMALL LETTER D WITH DOT BELOW */
+ ["\u1E0E", "\u1E0F"], /* LATIN CAPITAL LETTER D WITH LINE BELOW */
+ ["\u1E0E", "\u1E0F"], /* LATIN SMALL LETTER D WITH LINE BELOW */
+ ["\u1E10", "\u1E11"], /* LATIN CAPITAL LETTER D WITH CEDILLA */
+ ["\u1E10", "\u1E11"], /* LATIN SMALL LETTER D WITH CEDILLA */
+ ["\u1E12", "\u1E13"], /* LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW */
+ ["\u1E12", "\u1E13"], /* LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW */
+ ["\u1E14", "\u1E15"], /* LATIN CAPITAL LETTER E WITH MACRON AND GRAVE */
+ ["\u1E14", "\u1E15"], /* LATIN SMALL LETTER E WITH MACRON AND GRAVE */
+ ["\u1E16", "\u1E17"], /* LATIN CAPITAL LETTER E WITH MACRON AND ACUTE */
+ ["\u1E16", "\u1E17"], /* LATIN SMALL LETTER E WITH MACRON AND ACUTE */
+ ["\u1E18", "\u1E19"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW */
+ ["\u1E18", "\u1E19"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW */
+ ["\u1E1A", "\u1E1B"], /* LATIN CAPITAL LETTER E WITH TILDE BELOW */
+ ["\u1E1A", "\u1E1B"], /* LATIN SMALL LETTER E WITH TILDE BELOW */
+ ["\u1E1C", "\u1E1D"], /* LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE */
+ ["\u1E1C", "\u1E1D"], /* LATIN SMALL LETTER E WITH CEDILLA AND BREVE */
+ ["\u1E1E", "\u1E1F"], /* LATIN CAPITAL LETTER F WITH DOT ABOVE */
+ ["\u1E1E", "\u1E1F"], /* LATIN SMALL LETTER F WITH DOT ABOVE */
+ ["\u1E20", "\u1E21"], /* LATIN CAPITAL LETTER G WITH MACRON */
+ ["\u1E20", "\u1E21"], /* LATIN SMALL LETTER G WITH MACRON */
+ ["\u1E22", "\u1E23"], /* LATIN CAPITAL LETTER H WITH DOT ABOVE */
+ ["\u1E22", "\u1E23"], /* LATIN SMALL LETTER H WITH DOT ABOVE */
+ ["\u1E24", "\u1E25"], /* LATIN CAPITAL LETTER H WITH DOT BELOW */
+ ["\u1E24", "\u1E25"], /* LATIN SMALL LETTER H WITH DOT BELOW */
+ ["\u1E26", "\u1E27"], /* LATIN CAPITAL LETTER H WITH DIAERESIS */
+ ["\u1E26", "\u1E27"], /* LATIN SMALL LETTER H WITH DIAERESIS */
+ ["\u1E28", "\u1E29"], /* LATIN CAPITAL LETTER H WITH CEDILLA */
+ ["\u1E28", "\u1E29"], /* LATIN SMALL LETTER H WITH CEDILLA */
+ ["\u1E2A", "\u1E2B"], /* LATIN CAPITAL LETTER H WITH BREVE BELOW */
+ ["\u1E2A", "\u1E2B"], /* LATIN SMALL LETTER H WITH BREVE BELOW */
+ ["\u1E2C", "\u1E2D"], /* LATIN CAPITAL LETTER I WITH TILDE BELOW */
+ ["\u1E2C", "\u1E2D"], /* LATIN SMALL LETTER I WITH TILDE BELOW */
+ ["\u1E2E", "\u1E2F"], /* LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE */
+ ["\u1E2E", "\u1E2F"], /* LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE */
+ ["\u1E30", "\u1E31"], /* LATIN CAPITAL LETTER K WITH ACUTE */
+ ["\u1E30", "\u1E31"], /* LATIN SMALL LETTER K WITH ACUTE */
+ ["\u1E32", "\u1E33"], /* LATIN CAPITAL LETTER K WITH DOT BELOW */
+ ["\u1E32", "\u1E33"], /* LATIN SMALL LETTER K WITH DOT BELOW */
+ ["\u1E34", "\u1E35"], /* LATIN CAPITAL LETTER K WITH LINE BELOW */
+ ["\u1E34", "\u1E35"], /* LATIN SMALL LETTER K WITH LINE BELOW */
+ ["\u1E36", "\u1E37"], /* LATIN CAPITAL LETTER L WITH DOT BELOW */
+ ["\u1E36", "\u1E37"], /* LATIN SMALL LETTER L WITH DOT BELOW */
+ ["\u1E38", "\u1E39"], /* LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON */
+ ["\u1E38", "\u1E39"], /* LATIN SMALL LETTER L WITH DOT BELOW AND MACRON */
+ ["\u1E3A", "\u1E3B"], /* LATIN CAPITAL LETTER L WITH LINE BELOW */
+ ["\u1E3A", "\u1E3B"], /* LATIN SMALL LETTER L WITH LINE BELOW */
+ ["\u1E3C", "\u1E3D"], /* LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW */
+ ["\u1E3C", "\u1E3D"], /* LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW */
+ ["\u1E3E", "\u1E3F"], /* LATIN CAPITAL LETTER M WITH ACUTE */
+ ["\u1E3E", "\u1E3F"], /* LATIN SMALL LETTER M WITH ACUTE */
+ ["\u1E40", "\u1E41"], /* LATIN CAPITAL LETTER M WITH DOT ABOVE */
+ ["\u1E40", "\u1E41"], /* LATIN SMALL LETTER M WITH DOT ABOVE */
+ ["\u1E42", "\u1E43"], /* LATIN CAPITAL LETTER M WITH DOT BELOW */
+ ["\u1E42", "\u1E43"], /* LATIN SMALL LETTER M WITH DOT BELOW */
+ ["\u1E44", "\u1E45"], /* LATIN CAPITAL LETTER N WITH DOT ABOVE */
+ ["\u1E44", "\u1E45"], /* LATIN SMALL LETTER N WITH DOT ABOVE */
+ ["\u1E46", "\u1E47"], /* LATIN CAPITAL LETTER N WITH DOT BELOW */
+ ["\u1E46", "\u1E47"], /* LATIN SMALL LETTER N WITH DOT BELOW */
+ ["\u1E48", "\u1E49"], /* LATIN CAPITAL LETTER N WITH LINE BELOW */
+ ["\u1E48", "\u1E49"], /* LATIN SMALL LETTER N WITH LINE BELOW */
+ ["\u1E4A", "\u1E4B"], /* LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW */
+ ["\u1E4A", "\u1E4B"], /* LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW */
+ ["\u1E4C", "\u1E4D"], /* LATIN CAPITAL LETTER O WITH TILDE AND ACUTE */
+ ["\u1E4C", "\u1E4D"], /* LATIN SMALL LETTER O WITH TILDE AND ACUTE */
+ ["\u1E4E", "\u1E4F"], /* LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS */
+ ["\u1E4E", "\u1E4F"], /* LATIN SMALL LETTER O WITH TILDE AND DIAERESIS */
+ ["\u1E50", "\u1E51"], /* LATIN CAPITAL LETTER O WITH MACRON AND GRAVE */
+ ["\u1E50", "\u1E51"], /* LATIN SMALL LETTER O WITH MACRON AND GRAVE */
+ ["\u1E52", "\u1E53"], /* LATIN CAPITAL LETTER O WITH MACRON AND ACUTE */
+ ["\u1E52", "\u1E53"], /* LATIN SMALL LETTER O WITH MACRON AND ACUTE */
+ ["\u1E54", "\u1E55"], /* LATIN CAPITAL LETTER P WITH ACUTE */
+ ["\u1E54", "\u1E55"], /* LATIN SMALL LETTER P WITH ACUTE */
+ ["\u1E56", "\u1E57"], /* LATIN CAPITAL LETTER P WITH DOT ABOVE */
+ ["\u1E56", "\u1E57"], /* LATIN SMALL LETTER P WITH DOT ABOVE */
+ ["\u1E58", "\u1E59"], /* LATIN CAPITAL LETTER R WITH DOT ABOVE */
+ ["\u1E58", "\u1E59"], /* LATIN SMALL LETTER R WITH DOT ABOVE */
+ ["\u1E5A", "\u1E5B"], /* LATIN CAPITAL LETTER R WITH DOT BELOW */
+ ["\u1E5A", "\u1E5B"], /* LATIN SMALL LETTER R WITH DOT BELOW */
+ ["\u1E5C", "\u1E5D"], /* LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON */
+ ["\u1E5C", "\u1E5D"], /* LATIN SMALL LETTER R WITH DOT BELOW AND MACRON */
+ ["\u1E5E", "\u1E5F"], /* LATIN CAPITAL LETTER R WITH LINE BELOW */
+ ["\u1E5E", "\u1E5F"], /* LATIN SMALL LETTER R WITH LINE BELOW */
+ ["\u1E60", "\u1E61"], /* LATIN CAPITAL LETTER S WITH DOT ABOVE */
+ ["\u1E60", "\u1E61"], /* LATIN SMALL LETTER S WITH DOT ABOVE */
+ ["\u1E62", "\u1E63"], /* LATIN CAPITAL LETTER S WITH DOT BELOW */
+ ["\u1E62", "\u1E63"], /* LATIN SMALL LETTER S WITH DOT BELOW */
+ ["\u1E64", "\u1E65"], /* LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE */
+ ["\u1E64", "\u1E65"], /* LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE */
+ ["\u1E66", "\u1E67"], /* LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE */
+ ["\u1E66", "\u1E67"], /* LATIN SMALL LETTER S WITH CARON AND DOT ABOVE */
+ ["\u1E68", "\u1E69"], /* LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE */
+ ["\u1E68", "\u1E69"], /* LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE */
+ ["\u1E6A", "\u1E6B"], /* LATIN CAPITAL LETTER T WITH DOT ABOVE */
+ ["\u1E6A", "\u1E6B"], /* LATIN SMALL LETTER T WITH DOT ABOVE */
+ ["\u1E6C", "\u1E6D"], /* LATIN CAPITAL LETTER T WITH DOT BELOW */
+ ["\u1E6C", "\u1E6D"], /* LATIN SMALL LETTER T WITH DOT BELOW */
+ ["\u1E6E", "\u1E6F"], /* LATIN CAPITAL LETTER T WITH LINE BELOW */
+ ["\u1E6E", "\u1E6F"], /* LATIN SMALL LETTER T WITH LINE BELOW */
+ ["\u1E70", "\u1E71"], /* LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW */
+ ["\u1E70", "\u1E71"], /* LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW */
+ ["\u1E72", "\u1E73"], /* LATIN CAPITAL LETTER U WITH DIAERESIS BELOW */
+ ["\u1E72", "\u1E73"], /* LATIN SMALL LETTER U WITH DIAERESIS BELOW */
+ ["\u1E74", "\u1E75"], /* LATIN CAPITAL LETTER U WITH TILDE BELOW */
+ ["\u1E74", "\u1E75"], /* LATIN SMALL LETTER U WITH TILDE BELOW */
+ ["\u1E76", "\u1E77"], /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW */
+ ["\u1E76", "\u1E77"], /* LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW */
+ ["\u1E78", "\u1E79"], /* LATIN CAPITAL LETTER U WITH TILDE AND ACUTE */
+ ["\u1E78", "\u1E79"], /* LATIN SMALL LETTER U WITH TILDE AND ACUTE */
+ ["\u1E7A", "\u1E7B"], /* LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS */
+ ["\u1E7A", "\u1E7B"], /* LATIN SMALL LETTER U WITH MACRON AND DIAERESIS */
+ ["\u1E7C", "\u1E7D"], /* LATIN CAPITAL LETTER V WITH TILDE */
+ ["\u1E7C", "\u1E7D"], /* LATIN SMALL LETTER V WITH TILDE */
+ ["\u1E7E", "\u1E7F"], /* LATIN CAPITAL LETTER V WITH DOT BELOW */
+ ["\u1E7E", "\u1E7F"], /* LATIN SMALL LETTER V WITH DOT BELOW */
+ ["\u1E80", "\u1E81"], /* LATIN CAPITAL LETTER W WITH GRAVE */
+ ["\u1E80", "\u1E81"], /* LATIN SMALL LETTER W WITH GRAVE */
+ ["\u1E82", "\u1E83"], /* LATIN CAPITAL LETTER W WITH ACUTE */
+ ["\u1E82", "\u1E83"], /* LATIN SMALL LETTER W WITH ACUTE */
+ ["\u1E84", "\u1E85"], /* LATIN CAPITAL LETTER W WITH DIAERESIS */
+ ["\u1E84", "\u1E85"], /* LATIN SMALL LETTER W WITH DIAERESIS */
+ ["\u1E86", "\u1E87"], /* LATIN CAPITAL LETTER W WITH DOT ABOVE */
+ ["\u1E86", "\u1E87"], /* LATIN SMALL LETTER W WITH DOT ABOVE */
+ ["\u1E88", "\u1E89"], /* LATIN CAPITAL LETTER W WITH DOT BELOW */
+ ["\u1E88", "\u1E89"], /* LATIN SMALL LETTER W WITH DOT BELOW */
+ ["\u1E8A", "\u1E8B"], /* LATIN CAPITAL LETTER X WITH DOT ABOVE */
+ ["\u1E8A", "\u1E8B"], /* LATIN SMALL LETTER X WITH DOT ABOVE */
+ ["\u1E8C", "\u1E8D"], /* LATIN CAPITAL LETTER X WITH DIAERESIS */
+ ["\u1E8C", "\u1E8D"], /* LATIN SMALL LETTER X WITH DIAERESIS */
+ ["\u1E8E", "\u1E8F"], /* LATIN CAPITAL LETTER Y WITH DOT ABOVE */
+ ["\u1E8E", "\u1E8F"], /* LATIN SMALL LETTER Y WITH DOT ABOVE */
+ ["\u1E90", "\u1E91"], /* LATIN CAPITAL LETTER Z WITH CIRCUMFLEX */
+ ["\u1E90", "\u1E91"], /* LATIN SMALL LETTER Z WITH CIRCUMFLEX */
+ ["\u1E92", "\u1E93"], /* LATIN CAPITAL LETTER Z WITH DOT BELOW */
+ ["\u1E92", "\u1E93"], /* LATIN SMALL LETTER Z WITH DOT BELOW */
+ ["\u1E94", "\u1E95"], /* LATIN CAPITAL LETTER Z WITH LINE BELOW */
+ ["\u1E94", "\u1E95"], /* LATIN SMALL LETTER Z WITH LINE BELOW */
+ ["\u0048\u0331", "\u1E96"], /* LATIN SMALL LETTER H WITH LINE BELOW */
+ ["\u0054\u0308", "\u1E97"], /* LATIN SMALL LETTER T WITH DIAERESIS */
+ ["\u0057\u030A", "\u1E98"], /* LATIN SMALL LETTER W WITH RING ABOVE */
+ ["\u0059\u030A", "\u1E99"], /* LATIN SMALL LETTER Y WITH RING ABOVE */
+ ["\u0041\u02BE", "\u1E9A"], /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
+ ["\u1E60", "\u1E9B"], /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */
+ ["\u1E9C", "\u1E9C"], /* LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE */
+ ["\u1E9D", "\u1E9D"], /* LATIN SMALL LETTER LONG S WITH HIGH STROKE */
+ ["\u1E9E", "\u00DF"], /* LATIN CAPITAL LETTER SHARP S */
+ ["\u1E9F", "\u1E9F"], /* LATIN SMALL LETTER DELTA */
+ ["\u1EA0", "\u1EA1"], /* LATIN CAPITAL LETTER A WITH DOT BELOW */
+ ["\u1EA0", "\u1EA1"], /* LATIN SMALL LETTER A WITH DOT BELOW */
+ ["\u1EA2", "\u1EA3"], /* LATIN CAPITAL LETTER A WITH HOOK ABOVE */
+ ["\u1EA2", "\u1EA3"], /* LATIN SMALL LETTER A WITH HOOK ABOVE */
+ ["\u1EA4", "\u1EA5"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */
+ ["\u1EA4", "\u1EA5"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */
+ ["\u1EA6", "\u1EA7"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */
+ ["\u1EA6", "\u1EA7"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */
+ ["\u1EA8", "\u1EA9"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1EA8", "\u1EA9"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1EAA", "\u1EAB"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */
+ ["\u1EAA", "\u1EAB"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */
+ ["\u1EAC", "\u1EAD"], /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EAC", "\u1EAD"], /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EAE", "\u1EAF"], /* LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */
+ ["\u1EAE", "\u1EAF"], /* LATIN SMALL LETTER A WITH BREVE AND ACUTE */
+ ["\u1EB0", "\u1EB1"], /* LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */
+ ["\u1EB0", "\u1EB1"], /* LATIN SMALL LETTER A WITH BREVE AND GRAVE */
+ ["\u1EB2", "\u1EB3"], /* LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */
+ ["\u1EB2", "\u1EB3"], /* LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */
+ ["\u1EB4", "\u1EB5"], /* LATIN CAPITAL LETTER A WITH BREVE AND TILDE */
+ ["\u1EB4", "\u1EB5"], /* LATIN SMALL LETTER A WITH BREVE AND TILDE */
+ ["\u1EB6", "\u1EB7"], /* LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */
+ ["\u1EB6", "\u1EB7"], /* LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */
+ ["\u1EB8", "\u1EB9"], /* LATIN CAPITAL LETTER E WITH DOT BELOW */
+ ["\u1EB8", "\u1EB9"], /* LATIN SMALL LETTER E WITH DOT BELOW */
+ ["\u1EBA", "\u1EBB"], /* LATIN CAPITAL LETTER E WITH HOOK ABOVE */
+ ["\u1EBA", "\u1EBB"], /* LATIN SMALL LETTER E WITH HOOK ABOVE */
+ ["\u1EBC", "\u1EBD"], /* LATIN CAPITAL LETTER E WITH TILDE */
+ ["\u1EBC", "\u1EBD"], /* LATIN SMALL LETTER E WITH TILDE */
+ ["\u1EBE", "\u1EBF"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */
+ ["\u1EBE", "\u1EBF"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */
+ ["\u1EC0", "\u1EC1"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */
+ ["\u1EC0", "\u1EC1"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */
+ ["\u1EC2", "\u1EC3"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1EC2", "\u1EC3"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1EC4", "\u1EC5"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */
+ ["\u1EC4", "\u1EC5"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */
+ ["\u1EC6", "\u1EC7"], /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EC6", "\u1EC7"], /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EC8", "\u1EC9"], /* LATIN CAPITAL LETTER I WITH HOOK ABOVE */
+ ["\u1EC8", "\u1EC9"], /* LATIN SMALL LETTER I WITH HOOK ABOVE */
+ ["\u1ECA", "\u1ECB"], /* LATIN CAPITAL LETTER I WITH DOT BELOW */
+ ["\u1ECA", "\u1ECB"], /* LATIN SMALL LETTER I WITH DOT BELOW */
+ ["\u1ECC", "\u1ECD"], /* LATIN CAPITAL LETTER O WITH DOT BELOW */
+ ["\u1ECC", "\u1ECD"], /* LATIN SMALL LETTER O WITH DOT BELOW */
+ ["\u1ECE", "\u1ECF"], /* LATIN CAPITAL LETTER O WITH HOOK ABOVE */
+ ["\u1ECE", "\u1ECF"], /* LATIN SMALL LETTER O WITH HOOK ABOVE */
+ ["\u1ED0", "\u1ED1"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */
+ ["\u1ED0", "\u1ED1"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */
+ ["\u1ED2", "\u1ED3"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */
+ ["\u1ED2", "\u1ED3"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */
+ ["\u1ED4", "\u1ED5"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1ED4", "\u1ED5"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
+ ["\u1ED6", "\u1ED7"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */
+ ["\u1ED6", "\u1ED7"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */
+ ["\u1ED8", "\u1ED9"], /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1ED8", "\u1ED9"], /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
+ ["\u1EDA", "\u1EDB"], /* LATIN CAPITAL LETTER O WITH HORN AND ACUTE */
+ ["\u1EDA", "\u1EDB"], /* LATIN SMALL LETTER O WITH HORN AND ACUTE */
+ ["\u1EDC", "\u1EDD"], /* LATIN CAPITAL LETTER O WITH HORN AND GRAVE */
+ ["\u1EDC", "\u1EDD"], /* LATIN SMALL LETTER O WITH HORN AND GRAVE */
+ ["\u1EDE", "\u1EDF"], /* LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */
+ ["\u1EDE", "\u1EDF"], /* LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */
+ ["\u1EE0", "\u1EE1"], /* LATIN CAPITAL LETTER O WITH HORN AND TILDE */
+ ["\u1EE0", "\u1EE1"], /* LATIN SMALL LETTER O WITH HORN AND TILDE */
+ ["\u1EE2", "\u1EE3"], /* LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */
+ ["\u1EE2", "\u1EE3"], /* LATIN SMALL LETTER O WITH HORN AND DOT BELOW */
+ ["\u1EE4", "\u1EE5"], /* LATIN CAPITAL LETTER U WITH DOT BELOW */
+ ["\u1EE4", "\u1EE5"], /* LATIN SMALL LETTER U WITH DOT BELOW */
+ ["\u1EE6", "\u1EE7"], /* LATIN CAPITAL LETTER U WITH HOOK ABOVE */
+ ["\u1EE6", "\u1EE7"], /* LATIN SMALL LETTER U WITH HOOK ABOVE */
+ ["\u1EE8", "\u1EE9"], /* LATIN CAPITAL LETTER U WITH HORN AND ACUTE */
+ ["\u1EE8", "\u1EE9"], /* LATIN SMALL LETTER U WITH HORN AND ACUTE */
+ ["\u1EEA", "\u1EEB"], /* LATIN CAPITAL LETTER U WITH HORN AND GRAVE */
+ ["\u1EEA", "\u1EEB"], /* LATIN SMALL LETTER U WITH HORN AND GRAVE */
+ ["\u1EEC", "\u1EED"], /* LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */
+ ["\u1EEC", "\u1EED"], /* LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */
+ ["\u1EEE", "\u1EEF"], /* LATIN CAPITAL LETTER U WITH HORN AND TILDE */
+ ["\u1EEE", "\u1EEF"], /* LATIN SMALL LETTER U WITH HORN AND TILDE */
+ ["\u1EF0", "\u1EF1"], /* LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */
+ ["\u1EF0", "\u1EF1"], /* LATIN SMALL LETTER U WITH HORN AND DOT BELOW */
+ ["\u1EF2", "\u1EF3"], /* LATIN CAPITAL LETTER Y WITH GRAVE */
+ ["\u1EF2", "\u1EF3"], /* LATIN SMALL LETTER Y WITH GRAVE */
+ ["\u1EF4", "\u1EF5"], /* LATIN CAPITAL LETTER Y WITH DOT BELOW */
+ ["\u1EF4", "\u1EF5"], /* LATIN SMALL LETTER Y WITH DOT BELOW */
+ ["\u1EF6", "\u1EF7"], /* LATIN CAPITAL LETTER Y WITH HOOK ABOVE */
+ ["\u1EF6", "\u1EF7"], /* LATIN SMALL LETTER Y WITH HOOK ABOVE */
+ ["\u1EF8", "\u1EF9"], /* LATIN CAPITAL LETTER Y WITH TILDE */
+ ["\u1EF8", "\u1EF9"], /* LATIN SMALL LETTER Y WITH TILDE */
+ ["\u1EFA", "\u1EFB"], /* LATIN CAPITAL LETTER MIDDLE-WELSH LL */
+ ["\u1EFA", "\u1EFB"], /* LATIN SMALL LETTER MIDDLE-WELSH LL */
+ ["\u1EFC", "\u1EFD"], /* LATIN CAPITAL LETTER MIDDLE-WELSH V */
+ ["\u1EFC", "\u1EFD"], /* LATIN SMALL LETTER MIDDLE-WELSH V */
+ ["\u1EFE", "\u1EFF"], /* LATIN CAPITAL LETTER Y WITH LOOP */
+ ["\u1EFE", "\u1EFF"], /* LATIN SMALL LETTER Y WITH LOOP */
+ ["\u1F08", "\u1F00"], /* GREEK SMALL LETTER ALPHA WITH PSILI */
+ ["\u1F09", "\u1F01"], /* GREEK SMALL LETTER ALPHA WITH DASIA */
+ ["\u1F0A", "\u1F02"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA */
+ ["\u1F0B", "\u1F03"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA */
+ ["\u1F0C", "\u1F04"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA */
+ ["\u1F0D", "\u1F05"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA */
+ ["\u1F0E", "\u1F06"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI */
+ ["\u1F0F", "\u1F07"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI */
+ ["\u1F08", "\u1F00"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI */
+ ["\u1F09", "\u1F01"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA */
+ ["\u1F0A", "\u1F02"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA */
+ ["\u1F0B", "\u1F03"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA */
+ ["\u1F0C", "\u1F04"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA */
+ ["\u1F0D", "\u1F05"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA */
+ ["\u1F0E", "\u1F06"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI */
+ ["\u1F0F", "\u1F07"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI */
+ ["\u1F18", "\u1F10"], /* GREEK SMALL LETTER EPSILON WITH PSILI */
+ ["\u1F19", "\u1F11"], /* GREEK SMALL LETTER EPSILON WITH DASIA */
+ ["\u1F1A", "\u1F12"], /* GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA */
+ ["\u1F1B", "\u1F13"], /* GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA */
+ ["\u1F1C", "\u1F14"], /* GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA */
+ ["\u1F1D", "\u1F15"], /* GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA */
+ ["\u1F16", "\u1F16"],
+ ["\u1F17", "\u1F17"],
+ ["\u1F18", "\u1F10"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI */
+ ["\u1F19", "\u1F11"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA */
+ ["\u1F1A", "\u1F12"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA */
+ ["\u1F1B", "\u1F13"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA */
+ ["\u1F1C", "\u1F14"], /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA */
+ ["\u1F1D", "\u1F15"], /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA */
+ ["\u1F1E", "\u1F1E"],
+ ["\u1F1F", "\u1F1F"],
+ ["\u1F28", "\u1F20"], /* GREEK SMALL LETTER ETA WITH PSILI */
+ ["\u1F29", "\u1F21"], /* GREEK SMALL LETTER ETA WITH DASIA */
+ ["\u1F2A", "\u1F22"], /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA */
+ ["\u1F2B", "\u1F23"], /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA */
+ ["\u1F2C", "\u1F24"], /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA */
+ ["\u1F2D", "\u1F25"], /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA */
+ ["\u1F2E", "\u1F26"], /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI */
+ ["\u1F2F", "\u1F27"], /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI */
+ ["\u1F28", "\u1F20"], /* GREEK CAPITAL LETTER ETA WITH PSILI */
+ ["\u1F29", "\u1F21"], /* GREEK CAPITAL LETTER ETA WITH DASIA */
+ ["\u1F2A", "\u1F22"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA */
+ ["\u1F2B", "\u1F23"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA */
+ ["\u1F2C", "\u1F24"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA */
+ ["\u1F2D", "\u1F25"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA */
+ ["\u1F2E", "\u1F26"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI */
+ ["\u1F2F", "\u1F27"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI */
+ ["\u1F38", "\u1F30"], /* GREEK SMALL LETTER IOTA WITH PSILI */
+ ["\u1F39", "\u1F31"], /* GREEK SMALL LETTER IOTA WITH DASIA */
+ ["\u1F3A", "\u1F32"], /* GREEK SMALL LETTER IOTA WITH PSILI AND VARIA */
+ ["\u1F3B", "\u1F33"], /* GREEK SMALL LETTER IOTA WITH DASIA AND VARIA */
+ ["\u1F3C", "\u1F34"], /* GREEK SMALL LETTER IOTA WITH PSILI AND OXIA */
+ ["\u1F3D", "\u1F35"], /* GREEK SMALL LETTER IOTA WITH DASIA AND OXIA */
+ ["\u1F3E", "\u1F36"], /* GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI */
+ ["\u1F3F", "\u1F37"], /* GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI */
+ ["\u1F38", "\u1F30"], /* GREEK CAPITAL LETTER IOTA WITH PSILI */
+ ["\u1F39", "\u1F31"], /* GREEK CAPITAL LETTER IOTA WITH DASIA */
+ ["\u1F3A", "\u1F32"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA */
+ ["\u1F3B", "\u1F33"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA */
+ ["\u1F3C", "\u1F34"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA */
+ ["\u1F3D", "\u1F35"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA */
+ ["\u1F3E", "\u1F36"], /* GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI */
+ ["\u1F3F", "\u1F37"], /* GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI */
+ ["\u1F48", "\u1F40"], /* GREEK SMALL LETTER OMICRON WITH PSILI */
+ ["\u1F49", "\u1F41"], /* GREEK SMALL LETTER OMICRON WITH DASIA */
+ ["\u1F4A", "\u1F42"], /* GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA */
+ ["\u1F4B", "\u1F43"], /* GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA */
+ ["\u1F4C", "\u1F44"], /* GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA */
+ ["\u1F4D", "\u1F45"], /* GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA */
+ ["\u1F46", "\u1F46"],
+ ["\u1F47", "\u1F47"],
+ ["\u1F48", "\u1F40"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI */
+ ["\u1F49", "\u1F41"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA */
+ ["\u1F4A", "\u1F42"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA */
+ ["\u1F4B", "\u1F43"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA */
+ ["\u1F4C", "\u1F44"], /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA */
+ ["\u1F4D", "\u1F45"], /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA */
+ ["\u1F4E", "\u1F4E"],
+ ["\u1F4F", "\u1F4F"],
+ ["\u03A5\u0313", "\u1F50"], /* GREEK SMALL LETTER UPSILON WITH PSILI */
+ ["\u1F59", "\u1F51"], /* GREEK SMALL LETTER UPSILON WITH DASIA */
+ ["\u03A5\u0313\u0300", "\u1F52"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
+ ["\u1F5B", "\u1F53"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA */
+ ["\u03A5\u0313\u0301", "\u1F54"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
+ ["\u1F5D", "\u1F55"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA */
+ ["\u03A5\u0313\u0342", "\u1F56"], /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
+ ["\u1F5F", "\u1F57"], /* GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI */
+ ["\u1F58", "\u1F58"],
+ ["\u1F59", "\u1F51"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA */
+ ["\u1F5A", "\u1F5A"],
+ ["\u1F5B", "\u1F53"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA */
+ ["\u1F5C", "\u1F5C"],
+ ["\u1F5D", "\u1F55"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA */
+ ["\u1F5E", "\u1F5E"],
+ ["\u1F5F", "\u1F57"], /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI */
+ ["\u1F68", "\u1F60"], /* GREEK SMALL LETTER OMEGA WITH PSILI */
+ ["\u1F69", "\u1F61"], /* GREEK SMALL LETTER OMEGA WITH DASIA */
+ ["\u1F6A", "\u1F62"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA */
+ ["\u1F6B", "\u1F63"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA */
+ ["\u1F6C", "\u1F64"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA */
+ ["\u1F6D", "\u1F65"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA */
+ ["\u1F6E", "\u1F66"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI */
+ ["\u1F6F", "\u1F67"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI */
+ ["\u1F68", "\u1F60"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI */
+ ["\u1F69", "\u1F61"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA */
+ ["\u1F6A", "\u1F62"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA */
+ ["\u1F6B", "\u1F63"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA */
+ ["\u1F6C", "\u1F64"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA */
+ ["\u1F6D", "\u1F65"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA */
+ ["\u1F6E", "\u1F66"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI */
+ ["\u1F6F", "\u1F67"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI */
+ ["\u1FBA", "\u1F70"], /* GREEK SMALL LETTER ALPHA WITH VARIA */
+ ["\u1FBB", "\u1F71"], /* GREEK SMALL LETTER ALPHA WITH OXIA */
+ ["\u1FC8", "\u1F72"], /* GREEK SMALL LETTER EPSILON WITH VARIA */
+ ["\u1FC9", "\u1F73"], /* GREEK SMALL LETTER EPSILON WITH OXIA */
+ ["\u1FCA", "\u1F74"], /* GREEK SMALL LETTER ETA WITH VARIA */
+ ["\u1FCB", "\u1F75"], /* GREEK SMALL LETTER ETA WITH OXIA */
+ ["\u1FDA", "\u1F76"], /* GREEK SMALL LETTER IOTA WITH VARIA */
+ ["\u1FDB", "\u1F77"], /* GREEK SMALL LETTER IOTA WITH OXIA */
+ ["\u1FF8", "\u1F78"], /* GREEK SMALL LETTER OMICRON WITH VARIA */
+ ["\u1FF9", "\u1F79"], /* GREEK SMALL LETTER OMICRON WITH OXIA */
+ ["\u1FEA", "\u1F7A"], /* GREEK SMALL LETTER UPSILON WITH VARIA */
+ ["\u1FEB", "\u1F7B"], /* GREEK SMALL LETTER UPSILON WITH OXIA */
+ ["\u1FFA", "\u1F7C"], /* GREEK SMALL LETTER OMEGA WITH VARIA */
+ ["\u1FFB", "\u1F7D"], /* GREEK SMALL LETTER OMEGA WITH OXIA */
+ ["\u1F7E", "\u1F7E"],
+ ["\u1F7F", "\u1F7F"],
+ ["\u1F08\u0399", "\u1F80"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
+ ["\u1F09\u0399", "\u1F81"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
+ ["\u1F0A\u0399", "\u1F82"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F0B\u0399", "\u1F83"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F0C\u0399", "\u1F84"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F0D\u0399", "\u1F85"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F0E\u0399", "\u1F86"], /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F0F\u0399", "\u1F87"], /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F08\u0399", "\u1F80"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
+ ["\u1F09\u0399", "\u1F81"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
+ ["\u1F0A\u0399", "\u1F82"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F0B\u0399", "\u1F83"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F0C\u0399", "\u1F84"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F0D\u0399", "\u1F85"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F0E\u0399", "\u1F86"], /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F0F\u0399", "\u1F87"], /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F28\u0399", "\u1F90"], /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
+ ["\u1F29\u0399", "\u1F91"], /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
+ ["\u1F2A\u0399", "\u1F92"], /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F2B\u0399", "\u1F93"], /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F2C\u0399", "\u1F94"], /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F2D\u0399", "\u1F95"], /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F2E\u0399", "\u1F96"], /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F2F\u0399", "\u1F97"], /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F28\u0399", "\u1F90"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
+ ["\u1F29\u0399", "\u1F91"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
+ ["\u1F2A\u0399", "\u1F92"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F2B\u0399", "\u1F93"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F2C\u0399", "\u1F94"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F2D\u0399", "\u1F95"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F2E\u0399", "\u1F96"], /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F2F\u0399", "\u1F97"], /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F68\u0399", "\u1FA0"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
+ ["\u1F69\u0399", "\u1FA1"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
+ ["\u1F6A\u0399", "\u1FA2"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F6B\u0399", "\u1FA3"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
+ ["\u1F6C\u0399", "\u1FA4"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F6D\u0399", "\u1FA5"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
+ ["\u1F6E\u0399", "\u1FA6"], /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F6F\u0399", "\u1FA7"], /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1F68\u0399", "\u1FA0"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
+ ["\u1F69\u0399", "\u1FA1"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
+ ["\u1F6A\u0399", "\u1FA2"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F6B\u0399", "\u1FA3"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ ["\u1F6C\u0399", "\u1FA4"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F6D\u0399", "\u1FA5"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ ["\u1F6E\u0399", "\u1FA6"], /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1F6F\u0399", "\u1FA7"], /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ ["\u1FB8", "\u1FB0"], /* GREEK SMALL LETTER ALPHA WITH VRACHY */
+ ["\u1FB9", "\u1FB1"], /* GREEK SMALL LETTER ALPHA WITH MACRON */
+ ["\u1FBA\u0399", "\u1FB2"], /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
+ ["\u0391\u0399", "\u1FB3"], /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
+ ["\u0386\u0399", "\u1FB4"], /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
+ ["\u1FB5", "\u1FB5"],
+ ["\u0391\u0342", "\u1FB6"], /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
+ ["\u0391\u0342\u0399", "\u1FB7"], /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1FB8", "\u1FB0"], /* GREEK CAPITAL LETTER ALPHA WITH VRACHY */
+ ["\u1FB9", "\u1FB1"], /* GREEK CAPITAL LETTER ALPHA WITH MACRON */
+ ["\u1FBA", "\u1F70"], /* GREEK CAPITAL LETTER ALPHA WITH VARIA */
+ ["\u1FBB", "\u1F71"], /* GREEK CAPITAL LETTER ALPHA WITH OXIA */
+ ["\u0391\u0399", "\u1FB3"], /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
+ ["\u1FBD", "\u1FBD"], /* GREEK KORONIS */
+ ["\u0399", "\u1FBE"], /* GREEK PROSGEGRAMMENI */
+ ["\u1FBF", "\u1FBF"], /* GREEK PSILI */
+ ["\u1FC0", "\u1FC0"], /* GREEK PERISPOMENI */
+ ["\u1FC1", "\u1FC1"], /* GREEK DIALYTIKA AND PERISPOMENI */
+ ["\u1FCA\u0399", "\u1FC2"], /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
+ ["\u0397\u0399", "\u1FC3"], /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
+ ["\u0389\u0399", "\u1FC4"], /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
+ ["\u1FC5", "\u1FC5"],
+ ["\u0397\u0342", "\u1FC6"], /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
+ ["\u0397\u0342\u0399", "\u1FC7"], /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1FC8", "\u1F72"], /* GREEK CAPITAL LETTER EPSILON WITH VARIA */
+ ["\u1FC9", "\u1F73"], /* GREEK CAPITAL LETTER EPSILON WITH OXIA */
+ ["\u1FCA", "\u1F74"], /* GREEK CAPITAL LETTER ETA WITH VARIA */
+ ["\u1FCB", "\u1F75"], /* GREEK CAPITAL LETTER ETA WITH OXIA */
+ ["\u0397\u0399", "\u1FC3"], /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
+ ["\u1FCD", "\u1FCD"], /* GREEK PSILI AND VARIA */
+ ["\u1FCE", "\u1FCE"], /* GREEK PSILI AND OXIA */
+ ["\u1FCF", "\u1FCF"], /* GREEK PSILI AND PERISPOMENI */
+ ["\u1FD8", "\u1FD0"], /* GREEK SMALL LETTER IOTA WITH VRACHY */
+ ["\u1FD9", "\u1FD1"], /* GREEK SMALL LETTER IOTA WITH MACRON */
+ ["\u0399\u0308\u0300", "\u1FD2"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
+ ["\u0399\u0308\u0301", "\u1FD3"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
+ ["\u1FD4", "\u1FD4"],
+ ["\u1FD5", "\u1FD5"],
+ ["\u0399\u0342", "\u1FD6"], /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
+ ["\u0399\u0308\u0342", "\u1FD7"], /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
+ ["\u1FD8", "\u1FD0"], /* GREEK CAPITAL LETTER IOTA WITH VRACHY */
+ ["\u1FD9", "\u1FD1"], /* GREEK CAPITAL LETTER IOTA WITH MACRON */
+ ["\u1FDA", "\u1F76"], /* GREEK CAPITAL LETTER IOTA WITH VARIA */
+ ["\u1FDB", "\u1F77"], /* GREEK CAPITAL LETTER IOTA WITH OXIA */
+ ["\u1FDC", "\u1FDC"],
+ ["\u1FDD", "\u1FDD"], /* GREEK DASIA AND VARIA */
+ ["\u1FDE", "\u1FDE"], /* GREEK DASIA AND OXIA */
+ ["\u1FDF", "\u1FDF"], /* GREEK DASIA AND PERISPOMENI */
+ ["\u1FE8", "\u1FE0"], /* GREEK SMALL LETTER UPSILON WITH VRACHY */
+ ["\u1FE9", "\u1FE1"], /* GREEK SMALL LETTER UPSILON WITH MACRON */
+ ["\u03A5\u0308\u0300", "\u1FE2"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
+ ["\u03A5\u0308\u0301", "\u1FE3"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
+ ["\u03A1\u0313", "\u1FE4"], /* GREEK SMALL LETTER RHO WITH PSILI */
+ ["\u1FEC", "\u1FE5"], /* GREEK SMALL LETTER RHO WITH DASIA */
+ ["\u03A5\u0342", "\u1FE6"], /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
+ ["\u03A5\u0308\u0342", "\u1FE7"], /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
+ ["\u1FE8", "\u1FE0"], /* GREEK CAPITAL LETTER UPSILON WITH VRACHY */
+ ["\u1FE9", "\u1FE1"], /* GREEK CAPITAL LETTER UPSILON WITH MACRON */
+ ["\u1FEA", "\u1F7A"], /* GREEK CAPITAL LETTER UPSILON WITH VARIA */
+ ["\u1FEB", "\u1F7B"], /* GREEK CAPITAL LETTER UPSILON WITH OXIA */
+ ["\u1FEC", "\u1FE5"], /* GREEK CAPITAL LETTER RHO WITH DASIA */
+ ["\u1FED", "\u1FED"], /* GREEK DIALYTIKA AND VARIA */
+ ["\u1FEE", "\u1FEE"], /* GREEK DIALYTIKA AND OXIA */
+ ["\u1FEF", "\u1FEF"], /* GREEK VARIA */
+ ["\u1FF0", "\u1FF0"],
+ ["\u1FF1", "\u1FF1"],
+ ["\u1FFA\u0399", "\u1FF2"], /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
+ ["\u03A9\u0399", "\u1FF3"], /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
+ ["\u038F\u0399", "\u1FF4"], /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
+ ["\u1FF5", "\u1FF5"],
+ ["\u03A9\u0342", "\u1FF6"], /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
+ ["\u03A9\u0342\u0399", "\u1FF7"], /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
+ ["\u1FF8", "\u1F78"], /* GREEK CAPITAL LETTER OMICRON WITH VARIA */
+ ["\u1FF9", "\u1F79"], /* GREEK CAPITAL LETTER OMICRON WITH OXIA */
+ ["\u1FFA", "\u1F7C"], /* GREEK CAPITAL LETTER OMEGA WITH VARIA */
+ ["\u1FFB", "\u1F7D"], /* GREEK CAPITAL LETTER OMEGA WITH OXIA */
+ ["\u03A9\u0399", "\u1FF3"], /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
+ ["\u1FFD", "\u1FFD"], /* GREEK OXIA */
+ ["\u1FFE", "\u1FFE"], /* GREEK DASIA */
+ ["\u1FFF", "\u1FFF"],
+ ["\u2000", "\u2000"], /* EN QUAD */
+ ["\u2001", "\u2001"], /* EM QUAD */
+ ["\u2002", "\u2002"], /* EN SPACE */
+ ["\u2003", "\u2003"], /* EM SPACE */
+ ["\u2004", "\u2004"], /* THREE-PER-EM SPACE */
+ ["\u2005", "\u2005"], /* FOUR-PER-EM SPACE */
+ ["\u2006", "\u2006"], /* SIX-PER-EM SPACE */
+ ["\u2007", "\u2007"], /* FIGURE SPACE */
+ ["\u2008", "\u2008"], /* PUNCTUATION SPACE */
+ ["\u2009", "\u2009"], /* THIN SPACE */
+ ["\u200A", "\u200A"], /* HAIR SPACE */
+ ["\u200B", "\u200B"], /* ZERO WIDTH SPACE */
+ ["\u200C", "\u200C"], /* ZERO WIDTH NON-JOINER */
+ ["\u200D", "\u200D"], /* ZERO WIDTH JOINER */
+ ["\u200E", "\u200E"], /* LEFT-TO-RIGHT MARK */
+ ["\u200F", "\u200F"], /* RIGHT-TO-LEFT MARK */
+ ["\u2010", "\u2010"], /* HYPHEN */
+ ["\u2011", "\u2011"], /* NON-BREAKING HYPHEN */
+ ["\u2012", "\u2012"], /* FIGURE DASH */
+ ["\u2013", "\u2013"], /* EN DASH */
+ ["\u2014", "\u2014"], /* EM DASH */
+ ["\u2015", "\u2015"], /* HORIZONTAL BAR (QUOTATION DASH) */
+ ["\u2016", "\u2016"], /* DOUBLE VERTICAL LINE (DOUBLE VERTICAL BAR) */
+ ["\u2017", "\u2017"], /* DOUBLE LOW LINE (SPACING DOUBLE UNDERSCORE) */
+ ["\u2018", "\u2018"], /* LEFT SINGLE QUOTATION MARK (SINGLE TURNED COMMA QUOTATION MARK) */
+ ["\u2019", "\u2019"], /* RIGHT SINGLE QUOTATION MARK (SINGLE COMMA QUOTATION MARK) */
+ ["\u201A", "\u201A"], /* SINGLE LOW-9 QUOTATION MARK (LOW SINGLE COMMA QUOTATION MARK) */
+ ["\u201B", "\u201B"], /* SINGLE HIGH-REVERSED-9 QUOTATION MARK (SINGLE REVERSED COMMA QUOTATION MARK) */
+ ["\u201C", "\u201C"], /* LEFT DOUBLE QUOTATION MARK (DOUBLE TURNED COMMA QUOTATION MARK) */
+ ["\u201D", "\u201D"], /* RIGHT DOUBLE QUOTATION MARK (DOUBLE COMMA QUOTATION MARK) */
+ ["\u201E", "\u201E"], /* DOUBLE LOW-9 QUOTATION MARK (LOW DOUBLE COMMA QUOTATION MARK) */
+ ["\u201F", "\u201F"], /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK (DOUBLE REVERSED COMMA QUOTATION MARK) */
+ ["\u2020", "\u2020"], /* DAGGER */
+ ["\u2021", "\u2021"], /* DOUBLE DAGGER */
+ ["\u2022", "\u2022"], /* BULLET */
+ ["\u2023", "\u2023"], /* TRIANGULAR BULLET */
+ ["\u2024", "\u2024"], /* ONE DOT LEADER */
+ ["\u2025", "\u2025"], /* TWO DOT LEADER */
+ ["\u2026", "\u2026"], /* HORIZONTAL ELLIPSIS */
+ ["\u2027", "\u2027"], /* HYPHENATION POINT */
+ ["\u2028", "\u2028"], /* LINE SEPARATOR */
+ ["\u2029", "\u2029"], /* PARAGRAPH SEPARATOR */
+ ["\u202A", "\u202A"], /* LEFT-TO-RIGHT EMBEDDING */
+ ["\u202B", "\u202B"], /* RIGHT-TO-LEFT EMBEDDING */
+ ["\u202C", "\u202C"], /* POP DIRECTIONAL FORMATTING */
+ ["\u202D", "\u202D"], /* LEFT-TO-RIGHT OVERRIDE */
+ ["\u202E", "\u202E"], /* RIGHT-TO-LEFT OVERRIDE */
+ ["\u202F", "\u202F"], /* NARROW NO-BREAK SPACE */
+ ["\u2030", "\u2030"], /* PER MILLE SIGN */
+ ["\u2031", "\u2031"], /* PER TEN THOUSAND SIGN */
+ ["\u2032", "\u2032"], /* PRIME */
+ ["\u2033", "\u2033"], /* DOUBLE PRIME */
+ ["\u2034", "\u2034"], /* TRIPLE PRIME */
+ ["\u2035", "\u2035"], /* REVERSED PRIME */
+ ["\u2036", "\u2036"], /* REVERSED DOUBLE PRIME */
+ ["\u2037", "\u2037"], /* REVERSED TRIPLE PRIME */
+ ["\u2038", "\u2038"], /* CARET */
+ ["\u2039", "\u2039"], /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK (LEFT POINTING SINGLE GUILLEMET) */
+ ["\u203A", "\u203A"], /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (RIGHT POINTING SINGLE GUILLEMET) */
+ ["\u203B", "\u203B"], /* REFERENCE MARK */
+ ["\u203C", "\u203C"], /* DOUBLE EXCLAMATION MARK */
+ ["\u203D", "\u203D"], /* INTERROBANG */
+ ["\u203E", "\u203E"], /* OVERLINE (SPACING OVERSCORE) */
+ ["\u203F", "\u203F"], /* UNDERTIE */
+ ["\u2040", "\u2040"], /* CHARACTER TIE */
+ ["\u2041", "\u2041"], /* CARET INSERTION POINT */
+ ["\u2042", "\u2042"], /* ASTERISM */
+ ["\u2043", "\u2043"], /* HYPHEN BULLET */
+ ["\u2044", "\u2044"], /* FRACTION SLASH */
+ ["\u2045", "\u2045"], /* LEFT SQUARE BRACKET WITH QUILL */
+ ["\u2046", "\u2046"], /* RIGHT SQUARE BRACKET WITH QUILL */
+ ["\u2047", "\u2047"], /* DOUBLE QUESTION MARK */
+ ["\u2048", "\u2048"], /* QUESTION EXCLAMATION MARK */
+ ["\u2049", "\u2049"], /* EXCLAMATION QUESTION MARK */
+ ["\u204A", "\u204A"], /* TIRONIAN SIGN ET */
+ ["\u204B", "\u204B"], /* REVERSED PILCROW SIGN */
+ ["\u204C", "\u204C"], /* BLACK LEFTWARDS BULLET */
+ ["\u204D", "\u204D"], /* BLACK RIGHTWARDS BULLET */
+ ["\u204E", "\u204E"], /* LOW ASTERISK */
+ ["\u204F", "\u204F"], /* REVERSED SEMICOLON */
+ ["\u2050", "\u2050"], /* CLOSE UP */
+ ["\u2051", "\u2051"], /* TWO ASTERISKS ALIGNED VERTICALLY */
+ ["\u2052", "\u2052"], /* COMMERCIAL MINUS SIGN */
+ ["\u2053", "\u2053"], /* SWUNG DASH */
+ ["\u2054", "\u2054"], /* INVERTED UNDERTIE */
+ ["\u2055", "\u2055"], /* FLOWER PUNCTUATION MARK */
+ ["\u2056", "\u2056"], /* THREE DOT PUNCTUATION */
+ ["\u2057", "\u2057"], /* QUADRUPLE PRIME */
+ ["\u2058", "\u2058"], /* FOUR DOT PUNCTUATION */
+ ["\u2059", "\u2059"], /* FIVE DOT PUNCTUATION */
+ ["\u205A", "\u205A"], /* TWO DOT PUNCTUATION */
+ ["\u205B", "\u205B"], /* FOUR DOT MARK */
+ ["\u205C", "\u205C"], /* DOTTED CROSS */
+ ["\u205D", "\u205D"], /* TRICOLON */
+ ["\u205E", "\u205E"], /* VERTICAL FOUR DOTS */
+ ["\u205F", "\u205F"], /* MEDIUM MATHEMATICAL SPACE */
+ ["\u2060", "\u2060"], /* WORD JOINER */
+ ["\u2061", "\u2061"], /* FUNCTION APPLICATION */
+ ["\u2062", "\u2062"], /* INVISIBLE TIMES */
+ ["\u2063", "\u2063"], /* INVISIBLE SEPARATOR */
+ ["\u2064", "\u2064"], /* INVISIBLE PLUS */
+ ["\u2065", "\u2065"],
+ ["\u2066", "\u2066"], /* LEFT-TO-RIGHT ISOLATE */
+ ["\u2067", "\u2067"], /* RIGHT-TO-LEFT ISOLATE */
+ ["\u2068", "\u2068"], /* FIRST STRONG ISOLATE */
+ ["\u2069", "\u2069"], /* POP DIRECTIONAL ISOLATE */
+ ["\u206A", "\u206A"], /* INHIBIT SYMMETRIC SWAPPING */
+ ["\u206B", "\u206B"], /* ACTIVATE SYMMETRIC SWAPPING */
+ ["\u206C", "\u206C"], /* INHIBIT ARABIC FORM SHAPING */
+ ["\u206D", "\u206D"], /* ACTIVATE ARABIC FORM SHAPING */
+ ["\u206E", "\u206E"], /* NATIONAL DIGIT SHAPES */
+ ["\u206F", "\u206F"], /* NOMINAL DIGIT SHAPES */
+ ["\u2070", "\u2070"], /* SUPERSCRIPT ZERO (SUPERSCRIPT DIGIT ZERO) */
+ ["\u2071", "\u2071"], /* SUPERSCRIPT LATIN SMALL LETTER I */
+ ["\u2072", "\u2072"],
+ ["\u2073", "\u2073"],
+ ["\u2074", "\u2074"], /* SUPERSCRIPT FOUR (SUPERSCRIPT DIGIT FOUR) */
+ ["\u2075", "\u2075"], /* SUPERSCRIPT FIVE (SUPERSCRIPT DIGIT FIVE) */
+ ["\u2076", "\u2076"], /* SUPERSCRIPT SIX (SUPERSCRIPT DIGIT SIX) */
+ ["\u2077", "\u2077"], /* SUPERSCRIPT SEVEN (SUPERSCRIPT DIGIT SEVEN) */
+ ["\u2078", "\u2078"], /* SUPERSCRIPT EIGHT (SUPERSCRIPT DIGIT EIGHT) */
+ ["\u2079", "\u2079"], /* SUPERSCRIPT NINE (SUPERSCRIPT DIGIT NINE) */
+ ["\u207A", "\u207A"], /* SUPERSCRIPT PLUS SIGN */
+ ["\u207B", "\u207B"], /* SUPERSCRIPT MINUS (SUPERSCRIPT HYPHEN-MINUS) */
+ ["\u207C", "\u207C"], /* SUPERSCRIPT EQUALS SIGN */
+ ["\u207D", "\u207D"], /* SUPERSCRIPT LEFT PARENTHESIS (SUPERSCRIPT OPENING PARENTHESIS) */
+ ["\u207E", "\u207E"], /* SUPERSCRIPT RIGHT PARENTHESIS (SUPERSCRIPT CLOSING PARENTHESIS) */
+ ["\u207F", "\u207F"], /* SUPERSCRIPT LATIN SMALL LETTER N */
+ ["\u2080", "\u2080"], /* SUBSCRIPT ZERO (SUBSCRIPT DIGIT ZERO) */
+ ["\u2081", "\u2081"], /* SUBSCRIPT ONE (SUBSCRIPT DIGIT ONE) */
+ ["\u2082", "\u2082"], /* SUBSCRIPT TWO (SUBSCRIPT DIGIT TWO) */
+ ["\u2083", "\u2083"], /* SUBSCRIPT THREE (SUBSCRIPT DIGIT THREE) */
+ ["\u2084", "\u2084"], /* SUBSCRIPT FOUR (SUBSCRIPT DIGIT FOUR) */
+ ["\u2085", "\u2085"], /* SUBSCRIPT FIVE (SUBSCRIPT DIGIT FIVE) */
+ ["\u2086", "\u2086"], /* SUBSCRIPT SIX (SUBSCRIPT DIGIT SIX) */
+ ["\u2087", "\u2087"], /* SUBSCRIPT SEVEN (SUBSCRIPT DIGIT SEVEN) */
+ ["\u2088", "\u2088"], /* SUBSCRIPT EIGHT (SUBSCRIPT DIGIT EIGHT) */
+ ["\u2089", "\u2089"], /* SUBSCRIPT NINE (SUBSCRIPT DIGIT NINE) */
+ ["\u208A", "\u208A"], /* SUBSCRIPT PLUS SIGN */
+ ["\u208B", "\u208B"], /* SUBSCRIPT MINUS (SUBSCRIPT HYPHEN-MINUS) */
+ ["\u208C", "\u208C"], /* SUBSCRIPT EQUALS SIGN */
+ ["\u208D", "\u208D"], /* SUBSCRIPT LEFT PARENTHESIS (SUBSCRIPT OPENING PARENTHESIS) */
+ ["\u208E", "\u208E"], /* SUBSCRIPT RIGHT PARENTHESIS (SUBSCRIPT CLOSING PARENTHESIS) */
+ ["\u208F", "\u208F"],
+ ["\u2090", "\u2090"], /* LATIN SUBSCRIPT SMALL LETTER A */
+ ["\u2091", "\u2091"], /* LATIN SUBSCRIPT SMALL LETTER E */
+ ["\u2092", "\u2092"], /* LATIN SUBSCRIPT SMALL LETTER O */
+ ["\u2093", "\u2093"], /* LATIN SUBSCRIPT SMALL LETTER X */
+ ["\u2094", "\u2094"], /* LATIN SUBSCRIPT SMALL LETTER SCHWA */
+ ["\u2095", "\u2095"], /* LATIN SUBSCRIPT SMALL LETTER H */
+ ["\u2096", "\u2096"], /* LATIN SUBSCRIPT SMALL LETTER K */
+ ["\u2097", "\u2097"], /* LATIN SUBSCRIPT SMALL LETTER L */
+ ["\u2098", "\u2098"], /* LATIN SUBSCRIPT SMALL LETTER M */
+ ["\u2099", "\u2099"], /* LATIN SUBSCRIPT SMALL LETTER N */
+ ["\u209A", "\u209A"], /* LATIN SUBSCRIPT SMALL LETTER P */
+ ["\u209B", "\u209B"], /* LATIN SUBSCRIPT SMALL LETTER S */
+ ["\u209C", "\u209C"], /* LATIN SUBSCRIPT SMALL LETTER T */
+ ["\u209D", "\u209D"],
+ ["\u209E", "\u209E"],
+ ["\u209F", "\u209F"],
+ ["\u20A0", "\u20A0"], /* EURO-CURRENCY SIGN */
+ ["\u20A1", "\u20A1"], /* COLON SIGN */
+ ["\u20A2", "\u20A2"], /* CRUZEIRO SIGN */
+ ["\u20A3", "\u20A3"], /* FRENCH FRANC SIGN */
+ ["\u20A4", "\u20A4"], /* LIRA SIGN */
+ ["\u20A5", "\u20A5"], /* MILL SIGN */
+ ["\u20A6", "\u20A6"], /* NAIRA SIGN */
+ ["\u20A7", "\u20A7"], /* PESETA SIGN */
+ ["\u20A8", "\u20A8"], /* RUPEE SIGN */
+ ["\u20A9", "\u20A9"], /* WON SIGN */
+ ["\u20AA", "\u20AA"], /* NEW SHEQEL SIGN */
+ ["\u20AB", "\u20AB"], /* DONG SIGN */
+ ["\u20AC", "\u20AC"], /* EURO SIGN */
+ ["\u20AD", "\u20AD"], /* KIP SIGN */
+ ["\u20AE", "\u20AE"], /* TUGRIK SIGN */
+ ["\u20AF", "\u20AF"], /* DRACHMA SIGN */
+ ["\u20B0", "\u20B0"], /* GERMAN PENNY SIGN */
+ ["\u20B1", "\u20B1"], /* PESO SIGN */
+ ["\u20B2", "\u20B2"], /* GUARANI SIGN */
+ ["\u20B3", "\u20B3"], /* AUSTRAL SIGN */
+ ["\u20B4", "\u20B4"], /* HRYVNIA SIGN */
+ ["\u20B5", "\u20B5"], /* CEDI SIGN */
+ ["\u20B6", "\u20B6"], /* LIVRE TOURNOIS SIGN */
+ ["\u20B7", "\u20B7"], /* SPESMILO SIGN */
+ ["\u20B8", "\u20B8"], /* TENGE SIGN */
+ ["\u20B9", "\u20B9"], /* INDIAN RUPEE SIGN */
+ ["\u20BA", "\u20BA"], /* TURKISH LIRA SIGN */
+ ["\u20BB", "\u20BB"], /* NORDIC MARK SIGN */
+ ["\u20BC", "\u20BC"], /* MANAT SIGN */
+ ["\u20BD", "\u20BD"], /* RUBLE SIGN */
+ ["\u20BE", "\u20BE"], /* LARI SIGN */
+ ["\u20BF", "\u20BF"], /* BITCOIN SIGN */
+ ["\u20C0", "\u20C0"],
+ ["\u20C1", "\u20C1"],
+ ["\u20C2", "\u20C2"],
+ ["\u20C3", "\u20C3"],
+ ["\u20C4", "\u20C4"],
+ ["\u20C5", "\u20C5"],
+ ["\u20C6", "\u20C6"],
+ ["\u20C7", "\u20C7"],
+ ["\u20C8", "\u20C8"],
+ ["\u20C9", "\u20C9"],
+ ["\u20CA", "\u20CA"],
+ ["\u20CB", "\u20CB"],
+ ["\u20CC", "\u20CC"],
+ ["\u20CD", "\u20CD"],
+ ["\u20CE", "\u20CE"],
+ ["\u20CF", "\u20CF"],
+ ["\u20D0", "\u20D0"], /* COMBINING LEFT HARPOON ABOVE (NON-SPACING LEFT HARPOON ABOVE) */
+ ["\u20D1", "\u20D1"], /* COMBINING RIGHT HARPOON ABOVE (NON-SPACING RIGHT HARPOON ABOVE) */
+ ["\u20D2", "\u20D2"], /* COMBINING LONG VERTICAL LINE OVERLAY (NON-SPACING LONG VERTICAL BAR OVERLAY) */
+ ["\u20D3", "\u20D3"], /* COMBINING SHORT VERTICAL LINE OVERLAY (NON-SPACING SHORT VERTICAL BAR OVERLAY) */
+ ["\u20D4", "\u20D4"], /* COMBINING ANTICLOCKWISE ARROW ABOVE (NON-SPACING ANTICLOCKWISE ARROW ABOVE) */
+ ["\u20D5", "\u20D5"], /* COMBINING CLOCKWISE ARROW ABOVE (NON-SPACING CLOCKWISE ARROW ABOVE) */
+ ["\u20D6", "\u20D6"], /* COMBINING LEFT ARROW ABOVE (NON-SPACING LEFT ARROW ABOVE) */
+ ["\u20D7", "\u20D7"], /* COMBINING RIGHT ARROW ABOVE (NON-SPACING RIGHT ARROW ABOVE) */
+ ["\u20D8", "\u20D8"], /* COMBINING RING OVERLAY (NON-SPACING RING OVERLAY) */
+ ["\u20D9", "\u20D9"], /* COMBINING CLOCKWISE RING OVERLAY (NON-SPACING CLOCKWISE RING OVERLAY) */
+ ["\u20DA", "\u20DA"], /* COMBINING ANTICLOCKWISE RING OVERLAY (NON-SPACING ANTICLOCKWISE RING OVERLAY) */
+ ["\u20DB", "\u20DB"], /* COMBINING THREE DOTS ABOVE (NON-SPACING THREE DOTS ABOVE) */
+ ["\u20DC", "\u20DC"], /* COMBINING FOUR DOTS ABOVE (NON-SPACING FOUR DOTS ABOVE) */
+ ["\u20DD", "\u20DD"], /* COMBINING ENCLOSING CIRCLE (ENCLOSING CIRCLE) */
+ ["\u20DE", "\u20DE"], /* COMBINING ENCLOSING SQUARE (ENCLOSING SQUARE) */
+ ["\u20DF", "\u20DF"], /* COMBINING ENCLOSING DIAMOND (ENCLOSING DIAMOND) */
+ ["\u20E0", "\u20E0"], /* COMBINING ENCLOSING CIRCLE BACKSLASH (ENCLOSING CIRCLE SLASH) */
+ ["\u20E1", "\u20E1"], /* COMBINING LEFT RIGHT ARROW ABOVE (NON-SPACING LEFT RIGHT ARROW ABOVE) */
+ ["\u20E2", "\u20E2"], /* COMBINING ENCLOSING SCREEN */
+ ["\u20E3", "\u20E3"], /* COMBINING ENCLOSING KEYCAP */
+ ["\u20E4", "\u20E4"], /* COMBINING ENCLOSING UPWARD POINTING TRIANGLE */
+ ["\u20E5", "\u20E5"], /* COMBINING REVERSE SOLIDUS OVERLAY */
+ ["\u20E6", "\u20E6"], /* COMBINING DOUBLE VERTICAL STROKE OVERLAY */
+ ["\u20E7", "\u20E7"], /* COMBINING ANNUITY SYMBOL */
+ ["\u20E8", "\u20E8"], /* COMBINING TRIPLE UNDERDOT */
+ ["\u20E9", "\u20E9"], /* COMBINING WIDE BRIDGE ABOVE */
+ ["\u20EA", "\u20EA"], /* COMBINING LEFTWARDS ARROW OVERLAY */
+ ["\u20EB", "\u20EB"], /* COMBINING LONG DOUBLE SOLIDUS OVERLAY */
+ ["\u20EC", "\u20EC"], /* COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS */
+ ["\u20ED", "\u20ED"], /* COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS */
+ ["\u20EE", "\u20EE"], /* COMBINING LEFT ARROW BELOW */
+ ["\u20EF", "\u20EF"], /* COMBINING RIGHT ARROW BELOW */
+ ["\u20F0", "\u20F0"], /* COMBINING ASTERISK ABOVE */
+ ["\u20F1", "\u20F1"],
+ ["\u20F2", "\u20F2"],
+ ["\u20F3", "\u20F3"],
+ ["\u20F4", "\u20F4"],
+ ["\u20F5", "\u20F5"],
+ ["\u20F6", "\u20F6"],
+ ["\u20F7", "\u20F7"],
+ ["\u20F8", "\u20F8"],
+ ["\u20F9", "\u20F9"],
+ ["\u20FA", "\u20FA"],
+ ["\u20FB", "\u20FB"],
+ ["\u20FC", "\u20FC"],
+ ["\u20FD", "\u20FD"],
+ ["\u20FE", "\u20FE"],
+ ["\u20FF", "\u20FF"],
+ ["\u2100", "\u2100"], /* ACCOUNT OF */
+ ["\u2101", "\u2101"], /* ADDRESSED TO THE SUBJECT */
+ ["\u2102", "\u2102"], /* DOUBLE-STRUCK CAPITAL C (DOUBLE-STRUCK C) */
+ ["\u2103", "\u2103"], /* DEGREE CELSIUS (DEGREES CENTIGRADE) */
+ ["\u2104", "\u2104"], /* CENTRE LINE SYMBOL (C L SYMBOL) */
+ ["\u2105", "\u2105"], /* CARE OF */
+ ["\u2106", "\u2106"], /* CADA UNA */
+ ["\u2107", "\u2107"], /* EULER CONSTANT (EULERS) */
+ ["\u2108", "\u2108"], /* SCRUPLE */
+ ["\u2109", "\u2109"], /* DEGREE FAHRENHEIT (DEGREES FAHRENHEIT) */
+ ["\u210A", "\u210A"], /* SCRIPT SMALL G */
+ ["\u210B", "\u210B"], /* SCRIPT CAPITAL H (SCRIPT H) */
+ ["\u210C", "\u210C"], /* BLACK-LETTER CAPITAL H (BLACK-LETTER H) */
+ ["\u210D", "\u210D"], /* DOUBLE-STRUCK CAPITAL H (DOUBLE-STRUCK H) */
+ ["\u210E", "\u210E"], /* PLANCK CONSTANT */
+ ["\u210F", "\u210F"], /* PLANCK CONSTANT OVER TWO PI (PLANCK CONSTANT OVER 2 PI) */
+ ["\u2110", "\u2110"], /* SCRIPT CAPITAL I (SCRIPT I) */
+ ["\u2111", "\u2111"], /* BLACK-LETTER CAPITAL I (BLACK-LETTER I) */
+ ["\u2112", "\u2112"], /* SCRIPT CAPITAL L (SCRIPT L) */
+ ["\u2113", "\u2113"], /* SCRIPT SMALL L */
+ ["\u2114", "\u2114"], /* L B BAR SYMBOL */
+ ["\u2115", "\u2115"], /* DOUBLE-STRUCK CAPITAL N (DOUBLE-STRUCK N) */
+ ["\u2116", "\u2116"], /* NUMERO SIGN (NUMERO) */
+ ["\u2117", "\u2117"], /* SOUND RECORDING COPYRIGHT */
+ ["\u2118", "\u2118"], /* SCRIPT CAPITAL P (SCRIPT P) */
+ ["\u2119", "\u2119"], /* DOUBLE-STRUCK CAPITAL P (DOUBLE-STRUCK P) */
+ ["\u211A", "\u211A"], /* DOUBLE-STRUCK CAPITAL Q (DOUBLE-STRUCK Q) */
+ ["\u211B", "\u211B"], /* SCRIPT CAPITAL R (SCRIPT R) */
+ ["\u211C", "\u211C"], /* BLACK-LETTER CAPITAL R (BLACK-LETTER R) */
+ ["\u211D", "\u211D"], /* DOUBLE-STRUCK CAPITAL R (DOUBLE-STRUCK R) */
+ ["\u211E", "\u211E"], /* PRESCRIPTION TAKE */
+ ["\u211F", "\u211F"], /* RESPONSE */
+ ["\u2120", "\u2120"], /* SERVICE MARK */
+ ["\u2121", "\u2121"], /* TELEPHONE SIGN (T E L SYMBOL) */
+ ["\u2122", "\u2122"], /* TRADE MARK SIGN (TRADEMARK) */
+ ["\u2123", "\u2123"], /* VERSICLE */
+ ["\u2124", "\u2124"], /* DOUBLE-STRUCK CAPITAL Z (DOUBLE-STRUCK Z) */
+ ["\u2125", "\u2125"], /* OUNCE SIGN (OUNCE) */
+ ["\u2126", "\u03C9"], /* OHM SIGN (OHM) */
+ ["\u2127", "\u2127"], /* INVERTED OHM SIGN (MHO) */
+ ["\u2128", "\u2128"], /* BLACK-LETTER CAPITAL Z (BLACK-LETTER Z) */
+ ["\u2129", "\u2129"], /* TURNED GREEK SMALL LETTER IOTA */
+ ["\u212A", "\u006B"], /* KELVIN SIGN (DEGREES KELVIN) */
+ ["\u212B", "\u00E5"], /* ANGSTROM SIGN (ANGSTROM UNIT) */
+ ["\u212C", "\u212C"], /* SCRIPT CAPITAL B (SCRIPT B) */
+ ["\u212D", "\u212D"], /* BLACK-LETTER CAPITAL C (BLACK-LETTER C) */
+ ["\u212E", "\u212E"], /* ESTIMATED SYMBOL */
+ ["\u212F", "\u212F"], /* SCRIPT SMALL E */
+ ["\u2130", "\u2130"], /* SCRIPT CAPITAL E (SCRIPT E) */
+ ["\u2131", "\u2131"], /* SCRIPT CAPITAL F (SCRIPT F) */
+ ["\u2132", "\u214E"], /* TURNED CAPITAL F (TURNED F) */
+ ["\u2133", "\u2133"], /* SCRIPT CAPITAL M (SCRIPT M) */
+ ["\u2134", "\u2134"], /* SCRIPT SMALL O */
+ ["\u2135", "\u2135"], /* ALEF SYMBOL (FIRST TRANSFINITE CARDINAL) */
+ ["\u2136", "\u2136"], /* BET SYMBOL (SECOND TRANSFINITE CARDINAL) */
+ ["\u2137", "\u2137"], /* GIMEL SYMBOL (THIRD TRANSFINITE CARDINAL) */
+ ["\u2138", "\u2138"], /* DALET SYMBOL (FOURTH TRANSFINITE CARDINAL) */
+ ["\u2139", "\u2139"], /* INFORMATION SOURCE */
+ ["\u213A", "\u213A"], /* ROTATED CAPITAL Q */
+ ["\u213B", "\u213B"], /* FACSIMILE SIGN */
+ ["\u213C", "\u213C"], /* DOUBLE-STRUCK SMALL PI */
+ ["\u213D", "\u213D"], /* DOUBLE-STRUCK SMALL GAMMA */
+ ["\u213E", "\u213E"], /* DOUBLE-STRUCK CAPITAL GAMMA */
+ ["\u213F", "\u213F"], /* DOUBLE-STRUCK CAPITAL PI */
+ ["\u2140", "\u2140"], /* DOUBLE-STRUCK N-ARY SUMMATION */
+ ["\u2141", "\u2141"], /* TURNED SANS-SERIF CAPITAL G */
+ ["\u2142", "\u2142"], /* TURNED SANS-SERIF CAPITAL L */
+ ["\u2143", "\u2143"], /* REVERSED SANS-SERIF CAPITAL L */
+ ["\u2144", "\u2144"], /* TURNED SANS-SERIF CAPITAL Y */
+ ["\u2145", "\u2145"], /* DOUBLE-STRUCK ITALIC CAPITAL D */
+ ["\u2146", "\u2146"], /* DOUBLE-STRUCK ITALIC SMALL D */
+ ["\u2147", "\u2147"], /* DOUBLE-STRUCK ITALIC SMALL E */
+ ["\u2148", "\u2148"], /* DOUBLE-STRUCK ITALIC SMALL I */
+ ["\u2149", "\u2149"], /* DOUBLE-STRUCK ITALIC SMALL J */
+ ["\u214A", "\u214A"], /* PROPERTY LINE */
+ ["\u214B", "\u214B"], /* TURNED AMPERSAND */
+ ["\u214C", "\u214C"], /* PER SIGN */
+ ["\u214D", "\u214D"], /* AKTIESELSKAB */
+ ["\u2132", "\u214E"], /* TURNED SMALL F */
+ ["\u214F", "\u214F"], /* SYMBOL FOR SAMARITAN SOURCE */
+ ["\u2150", "\u2150"], /* VULGAR FRACTION ONE SEVENTH */
+ ["\u2151", "\u2151"], /* VULGAR FRACTION ONE NINTH */
+ ["\u2152", "\u2152"], /* VULGAR FRACTION ONE TENTH */
+ ["\u2153", "\u2153"], /* VULGAR FRACTION ONE THIRD (FRACTION ONE THIRD) */
+ ["\u2154", "\u2154"], /* VULGAR FRACTION TWO THIRDS (FRACTION TWO THIRDS) */
+ ["\u2155", "\u2155"], /* VULGAR FRACTION ONE FIFTH (FRACTION ONE FIFTH) */
+ ["\u2156", "\u2156"], /* VULGAR FRACTION TWO FIFTHS (FRACTION TWO FIFTHS) */
+ ["\u2157", "\u2157"], /* VULGAR FRACTION THREE FIFTHS (FRACTION THREE FIFTHS) */
+ ["\u2158", "\u2158"], /* VULGAR FRACTION FOUR FIFTHS (FRACTION FOUR FIFTHS) */
+ ["\u2159", "\u2159"], /* VULGAR FRACTION ONE SIXTH (FRACTION ONE SIXTH) */
+ ["\u215A", "\u215A"], /* VULGAR FRACTION FIVE SIXTHS (FRACTION FIVE SIXTHS) */
+ ["\u215B", "\u215B"], /* VULGAR FRACTION ONE EIGHTH (FRACTION ONE EIGHTH) */
+ ["\u215C", "\u215C"], /* VULGAR FRACTION THREE EIGHTHS (FRACTION THREE EIGHTHS) */
+ ["\u215D", "\u215D"], /* VULGAR FRACTION FIVE EIGHTHS (FRACTION FIVE EIGHTHS) */
+ ["\u215E", "\u215E"], /* VULGAR FRACTION SEVEN EIGHTHS (FRACTION SEVEN EIGHTHS) */
+ ["\u215F", "\u215F"], /* FRACTION NUMERATOR ONE */
+ ["\u2160", "\u2170"], /* ROMAN NUMERAL ONE */
+ ["\u2161", "\u2171"], /* ROMAN NUMERAL TWO */
+ ["\u2162", "\u2172"], /* ROMAN NUMERAL THREE */
+ ["\u2163", "\u2173"], /* ROMAN NUMERAL FOUR */
+ ["\u2164", "\u2174"], /* ROMAN NUMERAL FIVE */
+ ["\u2165", "\u2175"], /* ROMAN NUMERAL SIX */
+ ["\u2166", "\u2176"], /* ROMAN NUMERAL SEVEN */
+ ["\u2167", "\u2177"], /* ROMAN NUMERAL EIGHT */
+ ["\u2168", "\u2178"], /* ROMAN NUMERAL NINE */
+ ["\u2169", "\u2179"], /* ROMAN NUMERAL TEN */
+ ["\u216A", "\u217A"], /* ROMAN NUMERAL ELEVEN */
+ ["\u216B", "\u217B"], /* ROMAN NUMERAL TWELVE */
+ ["\u216C", "\u217C"], /* ROMAN NUMERAL FIFTY */
+ ["\u216D", "\u217D"], /* ROMAN NUMERAL ONE HUNDRED */
+ ["\u216E", "\u217E"], /* ROMAN NUMERAL FIVE HUNDRED */
+ ["\u216F", "\u217F"], /* ROMAN NUMERAL ONE THOUSAND */
+ ["\u2160", "\u2170"], /* SMALL ROMAN NUMERAL ONE */
+ ["\u2161", "\u2171"], /* SMALL ROMAN NUMERAL TWO */
+ ["\u2162", "\u2172"], /* SMALL ROMAN NUMERAL THREE */
+ ["\u2163", "\u2173"], /* SMALL ROMAN NUMERAL FOUR */
+ ["\u2164", "\u2174"], /* SMALL ROMAN NUMERAL FIVE */
+ ["\u2165", "\u2175"], /* SMALL ROMAN NUMERAL SIX */
+ ["\u2166", "\u2176"], /* SMALL ROMAN NUMERAL SEVEN */
+ ["\u2167", "\u2177"], /* SMALL ROMAN NUMERAL EIGHT */
+ ["\u2168", "\u2178"], /* SMALL ROMAN NUMERAL NINE */
+ ["\u2169", "\u2179"], /* SMALL ROMAN NUMERAL TEN */
+ ["\u216A", "\u217A"], /* SMALL ROMAN NUMERAL ELEVEN */
+ ["\u216B", "\u217B"], /* SMALL ROMAN NUMERAL TWELVE */
+ ["\u216C", "\u217C"], /* SMALL ROMAN NUMERAL FIFTY */
+ ["\u216D", "\u217D"], /* SMALL ROMAN NUMERAL ONE HUNDRED */
+ ["\u216E", "\u217E"], /* SMALL ROMAN NUMERAL FIVE HUNDRED */
+ ["\u216F", "\u217F"], /* SMALL ROMAN NUMERAL ONE THOUSAND */
+ ["\u2180", "\u2180"], /* ROMAN NUMERAL ONE THOUSAND C D */
+ ["\u2181", "\u2181"], /* ROMAN NUMERAL FIVE THOUSAND */
+ ["\u2182", "\u2182"], /* ROMAN NUMERAL TEN THOUSAND */
+ ["\u2183", "\u2184"], /* ROMAN NUMERAL REVERSED ONE HUNDRED */
+ ["\u2183", "\u2184"], /* LATIN SMALL LETTER REVERSED C */
+ ["\u2185", "\u2185"], /* ROMAN NUMERAL SIX LATE FORM */
+ ["\u2186", "\u2186"], /* ROMAN NUMERAL FIFTY EARLY FORM */
+ ["\u2187", "\u2187"], /* ROMAN NUMERAL FIFTY THOUSAND */
+ ["\u2188", "\u2188"], /* ROMAN NUMERAL ONE HUNDRED THOUSAND */
+ ["\u2189", "\u2189"], /* VULGAR FRACTION ZERO THIRDS */
+ ["\u218A", "\u218A"], /* TURNED DIGIT TWO */
+ ["\u218B", "\u218B"], /* TURNED DIGIT THREE */
+ ["\u218C", "\u218C"],
+ ["\u218D", "\u218D"],
+ ["\u218E", "\u218E"],
+ ["\u218F", "\u218F"],
+ ["\u2190", "\u2190"], /* LEFTWARDS ARROW (LEFT ARROW) */
+ ["\u2191", "\u2191"], /* UPWARDS ARROW (UP ARROW) */
+ ["\u2192", "\u2192"], /* RIGHTWARDS ARROW (RIGHT ARROW) */
+ ["\u2193", "\u2193"], /* DOWNWARDS ARROW (DOWN ARROW) */
+ ["\u2194", "\u2194"], /* LEFT RIGHT ARROW */
+ ["\u2195", "\u2195"], /* UP DOWN ARROW */
+ ["\u2196", "\u2196"], /* NORTH WEST ARROW (UPPER LEFT ARROW) */
+ ["\u2197", "\u2197"], /* NORTH EAST ARROW (UPPER RIGHT ARROW) */
+ ["\u2198", "\u2198"], /* SOUTH EAST ARROW (LOWER RIGHT ARROW) */
+ ["\u2199", "\u2199"], /* SOUTH WEST ARROW (LOWER LEFT ARROW) */
+ ["\u219A", "\u219A"], /* LEFTWARDS ARROW WITH STROKE (LEFT ARROW WITH STROKE) */
+ ["\u219B", "\u219B"], /* RIGHTWARDS ARROW WITH STROKE (RIGHT ARROW WITH STROKE) */
+ ["\u219C", "\u219C"], /* LEFTWARDS WAVE ARROW (LEFT WAVE ARROW) */
+ ["\u219D", "\u219D"], /* RIGHTWARDS WAVE ARROW (RIGHT WAVE ARROW) */
+ ["\u219E", "\u219E"], /* LEFTWARDS TWO HEADED ARROW (LEFT TWO HEADED ARROW) */
+ ["\u219F", "\u219F"], /* UPWARDS TWO HEADED ARROW (UP TWO HEADED ARROW) */
+ ["\u21A0", "\u21A0"], /* RIGHTWARDS TWO HEADED ARROW (RIGHT TWO HEADED ARROW) */
+ ["\u21A1", "\u21A1"], /* DOWNWARDS TWO HEADED ARROW (DOWN TWO HEADED ARROW) */
+ ["\u21A2", "\u21A2"], /* LEFTWARDS ARROW WITH TAIL (LEFT ARROW WITH TAIL) */
+ ["\u21A3", "\u21A3"], /* RIGHTWARDS ARROW WITH TAIL (RIGHT ARROW WITH TAIL) */
+ ["\u21A4", "\u21A4"], /* LEFTWARDS ARROW FROM BAR (LEFT ARROW FROM BAR) */
+ ["\u21A5", "\u21A5"], /* UPWARDS ARROW FROM BAR (UP ARROW FROM BAR) */
+ ["\u21A6", "\u21A6"], /* RIGHTWARDS ARROW FROM BAR (RIGHT ARROW FROM BAR) */
+ ["\u21A7", "\u21A7"], /* DOWNWARDS ARROW FROM BAR (DOWN ARROW FROM BAR) */
+ ["\u21A8", "\u21A8"], /* UP DOWN ARROW WITH BASE */
+ ["\u21A9", "\u21A9"], /* LEFTWARDS ARROW WITH HOOK (LEFT ARROW WITH HOOK) */
+ ["\u21AA", "\u21AA"], /* RIGHTWARDS ARROW WITH HOOK (RIGHT ARROW WITH HOOK) */
+ ["\u21AB", "\u21AB"], /* LEFTWARDS ARROW WITH LOOP (LEFT ARROW WITH LOOP) */
+ ["\u21AC", "\u21AC"], /* RIGHTWARDS ARROW WITH LOOP (RIGHT ARROW WITH LOOP) */
+ ["\u21AD", "\u21AD"], /* LEFT RIGHT WAVE ARROW */
+ ["\u21AE", "\u21AE"], /* LEFT RIGHT ARROW WITH STROKE */
+ ["\u21AF", "\u21AF"], /* DOWNWARDS ZIGZAG ARROW (DOWN ZIGZAG ARROW) */
+ ["\u21B0", "\u21B0"], /* UPWARDS ARROW WITH TIP LEFTWARDS (UP ARROW WITH TIP LEFT) */
+ ["\u21B1", "\u21B1"], /* UPWARDS ARROW WITH TIP RIGHTWARDS (UP ARROW WITH TIP RIGHT) */
+ ["\u21B2", "\u21B2"], /* DOWNWARDS ARROW WITH TIP LEFTWARDS (DOWN ARROW WITH TIP LEFT) */
+ ["\u21B3", "\u21B3"], /* DOWNWARDS ARROW WITH TIP RIGHTWARDS (DOWN ARROW WITH TIP RIGHT) */
+ ["\u21B4", "\u21B4"], /* RIGHTWARDS ARROW WITH CORNER DOWNWARDS (RIGHT ARROW WITH CORNER DOWN) */
+ ["\u21B5", "\u21B5"], /* DOWNWARDS ARROW WITH CORNER LEFTWARDS (DOWN ARROW WITH CORNER LEFT) */
+ ["\u21B6", "\u21B6"], /* ANTICLOCKWISE TOP SEMICIRCLE ARROW */
+ ["\u21B7", "\u21B7"], /* CLOCKWISE TOP SEMICIRCLE ARROW */
+ ["\u21B8", "\u21B8"], /* NORTH WEST ARROW TO LONG BAR (UPPER LEFT ARROW TO LONG BAR) */
+ ["\u21B9", "\u21B9"], /* LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR (LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR) */
+ ["\u21BA", "\u21BA"], /* ANTICLOCKWISE OPEN CIRCLE ARROW */
+ ["\u21BB", "\u21BB"], /* CLOCKWISE OPEN CIRCLE ARROW */
+ ["\u21BC", "\u21BC"], /* LEFTWARDS HARPOON WITH BARB UPWARDS (LEFT HARPOON WITH BARB UP) */
+ ["\u21BD", "\u21BD"], /* LEFTWARDS HARPOON WITH BARB DOWNWARDS (LEFT HARPOON WITH BARB DOWN) */
+ ["\u21BE", "\u21BE"], /* UPWARDS HARPOON WITH BARB RIGHTWARDS (UP HARPOON WITH BARB RIGHT) */
+ ["\u21BF", "\u21BF"], /* UPWARDS HARPOON WITH BARB LEFTWARDS (UP HARPOON WITH BARB LEFT) */
+ ["\u21C0", "\u21C0"], /* RIGHTWARDS HARPOON WITH BARB UPWARDS (RIGHT HARPOON WITH BARB UP) */
+ ["\u21C1", "\u21C1"], /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS (RIGHT HARPOON WITH BARB DOWN) */
+ ["\u21C2", "\u21C2"], /* DOWNWARDS HARPOON WITH BARB RIGHTWARDS (DOWN HARPOON WITH BARB RIGHT) */
+ ["\u21C3", "\u21C3"], /* DOWNWARDS HARPOON WITH BARB LEFTWARDS (DOWN HARPOON WITH BARB LEFT) */
+ ["\u21C4", "\u21C4"], /* RIGHTWARDS ARROW OVER LEFTWARDS ARROW (RIGHT ARROW OVER LEFT ARROW) */
+ ["\u21C5", "\u21C5"], /* UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW (UP ARROW LEFT OF DOWN ARROW) */
+ ["\u21C6", "\u21C6"], /* LEFTWARDS ARROW OVER RIGHTWARDS ARROW (LEFT ARROW OVER RIGHT ARROW) */
+ ["\u21C7", "\u21C7"], /* LEFTWARDS PAIRED ARROWS (LEFT PAIRED ARROWS) */
+ ["\u21C8", "\u21C8"], /* UPWARDS PAIRED ARROWS (UP PAIRED ARROWS) */
+ ["\u21C9", "\u21C9"], /* RIGHTWARDS PAIRED ARROWS (RIGHT PAIRED ARROWS) */
+ ["\u21CA", "\u21CA"], /* DOWNWARDS PAIRED ARROWS (DOWN PAIRED ARROWS) */
+ ["\u21CB", "\u21CB"], /* LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON (LEFT HARPOON OVER RIGHT HARPOON) */
+ ["\u21CC", "\u21CC"], /* RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON (RIGHT HARPOON OVER LEFT HARPOON) */
+ ["\u21CD", "\u21CD"], /* LEFTWARDS DOUBLE ARROW WITH STROKE (LEFT DOUBLE ARROW WITH STROKE) */
+ ["\u21CE", "\u21CE"], /* LEFT RIGHT DOUBLE ARROW WITH STROKE */
+ ["\u21CF", "\u21CF"], /* RIGHTWARDS DOUBLE ARROW WITH STROKE (RIGHT DOUBLE ARROW WITH STROKE) */
+ ["\u21D0", "\u21D0"], /* LEFTWARDS DOUBLE ARROW (LEFT DOUBLE ARROW) */
+ ["\u21D1", "\u21D1"], /* UPWARDS DOUBLE ARROW (UP DOUBLE ARROW) */
+ ["\u21D2", "\u21D2"], /* RIGHTWARDS DOUBLE ARROW (RIGHT DOUBLE ARROW) */
+ ["\u21D3", "\u21D3"], /* DOWNWARDS DOUBLE ARROW (DOWN DOUBLE ARROW) */
+ ["\u21D4", "\u21D4"], /* LEFT RIGHT DOUBLE ARROW */
+ ["\u21D5", "\u21D5"], /* UP DOWN DOUBLE ARROW */
+ ["\u21D6", "\u21D6"], /* NORTH WEST DOUBLE ARROW (UPPER LEFT DOUBLE ARROW) */
+ ["\u21D7", "\u21D7"], /* NORTH EAST DOUBLE ARROW (UPPER RIGHT DOUBLE ARROW) */
+ ["\u21D8", "\u21D8"], /* SOUTH EAST DOUBLE ARROW (LOWER RIGHT DOUBLE ARROW) */
+ ["\u21D9", "\u21D9"], /* SOUTH WEST DOUBLE ARROW (LOWER LEFT DOUBLE ARROW) */
+ ["\u21DA", "\u21DA"], /* LEFTWARDS TRIPLE ARROW (LEFT TRIPLE ARROW) */
+ ["\u21DB", "\u21DB"], /* RIGHTWARDS TRIPLE ARROW (RIGHT TRIPLE ARROW) */
+ ["\u21DC", "\u21DC"], /* LEFTWARDS SQUIGGLE ARROW (LEFT SQUIGGLE ARROW) */
+ ["\u21DD", "\u21DD"], /* RIGHTWARDS SQUIGGLE ARROW (RIGHT SQUIGGLE ARROW) */
+ ["\u21DE", "\u21DE"], /* UPWARDS ARROW WITH DOUBLE STROKE (UP ARROW WITH DOUBLE STROKE) */
+ ["\u21DF", "\u21DF"], /* DOWNWARDS ARROW WITH DOUBLE STROKE (DOWN ARROW WITH DOUBLE STROKE) */
+ ["\u21E0", "\u21E0"], /* LEFTWARDS DASHED ARROW (LEFT DASHED ARROW) */
+ ["\u21E1", "\u21E1"], /* UPWARDS DASHED ARROW (UP DASHED ARROW) */
+ ["\u21E2", "\u21E2"], /* RIGHTWARDS DASHED ARROW (RIGHT DASHED ARROW) */
+ ["\u21E3", "\u21E3"], /* DOWNWARDS DASHED ARROW (DOWN DASHED ARROW) */
+ ["\u21E4", "\u21E4"], /* LEFTWARDS ARROW TO BAR (LEFT ARROW TO BAR) */
+ ["\u21E5", "\u21E5"], /* RIGHTWARDS ARROW TO BAR (RIGHT ARROW TO BAR) */
+ ["\u21E6", "\u21E6"], /* LEFTWARDS WHITE ARROW (WHITE LEFT ARROW) */
+ ["\u21E7", "\u21E7"], /* UPWARDS WHITE ARROW (WHITE UP ARROW) */
+ ["\u21E8", "\u21E8"], /* RIGHTWARDS WHITE ARROW (WHITE RIGHT ARROW) */
+ ["\u21E9", "\u21E9"], /* DOWNWARDS WHITE ARROW (WHITE DOWN ARROW) */
+ ["\u21EA", "\u21EA"], /* UPWARDS WHITE ARROW FROM BAR (WHITE UP ARROW FROM BAR) */
+ ["\u21EB", "\u21EB"], /* UPWARDS WHITE ARROW ON PEDESTAL */
+ ["\u21EC", "\u21EC"], /* UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR */
+ ["\u21ED", "\u21ED"], /* UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR */
+ ["\u21EE", "\u21EE"], /* UPWARDS WHITE DOUBLE ARROW */
+ ["\u21EF", "\u21EF"], /* UPWARDS WHITE DOUBLE ARROW ON PEDESTAL */
+ ["\u21F0", "\u21F0"], /* RIGHTWARDS WHITE ARROW FROM WALL */
+ ["\u21F1", "\u21F1"], /* NORTH WEST ARROW TO CORNER */
+ ["\u21F2", "\u21F2"], /* SOUTH EAST ARROW TO CORNER */
+ ["\u21F3", "\u21F3"], /* UP DOWN WHITE ARROW */
+ ["\u21F4", "\u21F4"], /* RIGHT ARROW WITH SMALL CIRCLE */
+ ["\u21F5", "\u21F5"], /* DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW */
+ ["\u21F6", "\u21F6"], /* THREE RIGHTWARDS ARROWS */
+ ["\u21F7", "\u21F7"], /* LEFTWARDS ARROW WITH VERTICAL STROKE */
+ ["\u21F8", "\u21F8"], /* RIGHTWARDS ARROW WITH VERTICAL STROKE */
+ ["\u21F9", "\u21F9"], /* LEFT RIGHT ARROW WITH VERTICAL STROKE */
+ ["\u21FA", "\u21FA"], /* LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u21FB", "\u21FB"], /* RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u21FC", "\u21FC"], /* LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u21FD", "\u21FD"], /* LEFTWARDS OPEN-HEADED ARROW */
+ ["\u21FE", "\u21FE"], /* RIGHTWARDS OPEN-HEADED ARROW */
+ ["\u21FF", "\u21FF"], /* LEFT RIGHT OPEN-HEADED ARROW */
+ ["\u2200", "\u2200"], /* FOR ALL */
+ ["\u2201", "\u2201"], /* COMPLEMENT */
+ ["\u2202", "\u2202"], /* PARTIAL DIFFERENTIAL */
+ ["\u2203", "\u2203"], /* THERE EXISTS */
+ ["\u2204", "\u2204"], /* THERE DOES NOT EXIST */
+ ["\u2205", "\u2205"], /* EMPTY SET */
+ ["\u2206", "\u2206"], /* INCREMENT */
+ ["\u2207", "\u2207"], /* NABLA */
+ ["\u2208", "\u2208"], /* ELEMENT OF */
+ ["\u2209", "\u2209"], /* NOT AN ELEMENT OF */
+ ["\u220A", "\u220A"], /* SMALL ELEMENT OF */
+ ["\u220B", "\u220B"], /* CONTAINS AS MEMBER */
+ ["\u220C", "\u220C"], /* DOES NOT CONTAIN AS MEMBER */
+ ["\u220D", "\u220D"], /* SMALL CONTAINS AS MEMBER */
+ ["\u220E", "\u220E"], /* END OF PROOF */
+ ["\u220F", "\u220F"], /* N-ARY PRODUCT */
+ ["\u2210", "\u2210"], /* N-ARY COPRODUCT */
+ ["\u2211", "\u2211"], /* N-ARY SUMMATION */
+ ["\u2212", "\u2212"], /* MINUS SIGN */
+ ["\u2213", "\u2213"], /* MINUS-OR-PLUS SIGN */
+ ["\u2214", "\u2214"], /* DOT PLUS */
+ ["\u2215", "\u2215"], /* DIVISION SLASH */
+ ["\u2216", "\u2216"], /* SET MINUS */
+ ["\u2217", "\u2217"], /* ASTERISK OPERATOR */
+ ["\u2218", "\u2218"], /* RING OPERATOR */
+ ["\u2219", "\u2219"], /* BULLET OPERATOR */
+ ["\u221A", "\u221A"], /* SQUARE ROOT */
+ ["\u221B", "\u221B"], /* CUBE ROOT */
+ ["\u221C", "\u221C"], /* FOURTH ROOT */
+ ["\u221D", "\u221D"], /* PROPORTIONAL TO */
+ ["\u221E", "\u221E"], /* INFINITY */
+ ["\u221F", "\u221F"], /* RIGHT ANGLE */
+ ["\u2220", "\u2220"], /* ANGLE */
+ ["\u2221", "\u2221"], /* MEASURED ANGLE */
+ ["\u2222", "\u2222"], /* SPHERICAL ANGLE */
+ ["\u2223", "\u2223"], /* DIVIDES */
+ ["\u2224", "\u2224"], /* DOES NOT DIVIDE */
+ ["\u2225", "\u2225"], /* PARALLEL TO */
+ ["\u2226", "\u2226"], /* NOT PARALLEL TO */
+ ["\u2227", "\u2227"], /* LOGICAL AND */
+ ["\u2228", "\u2228"], /* LOGICAL OR */
+ ["\u2229", "\u2229"], /* INTERSECTION */
+ ["\u222A", "\u222A"], /* UNION */
+ ["\u222B", "\u222B"], /* INTEGRAL */
+ ["\u222C", "\u222C"], /* DOUBLE INTEGRAL */
+ ["\u222D", "\u222D"], /* TRIPLE INTEGRAL */
+ ["\u222E", "\u222E"], /* CONTOUR INTEGRAL */
+ ["\u222F", "\u222F"], /* SURFACE INTEGRAL */
+ ["\u2230", "\u2230"], /* VOLUME INTEGRAL */
+ ["\u2231", "\u2231"], /* CLOCKWISE INTEGRAL */
+ ["\u2232", "\u2232"], /* CLOCKWISE CONTOUR INTEGRAL */
+ ["\u2233", "\u2233"], /* ANTICLOCKWISE CONTOUR INTEGRAL */
+ ["\u2234", "\u2234"], /* THEREFORE */
+ ["\u2235", "\u2235"], /* BECAUSE */
+ ["\u2236", "\u2236"], /* RATIO */
+ ["\u2237", "\u2237"], /* PROPORTION */
+ ["\u2238", "\u2238"], /* DOT MINUS */
+ ["\u2239", "\u2239"], /* EXCESS */
+ ["\u223A", "\u223A"], /* GEOMETRIC PROPORTION */
+ ["\u223B", "\u223B"], /* HOMOTHETIC */
+ ["\u223C", "\u223C"], /* TILDE OPERATOR */
+ ["\u223D", "\u223D"], /* REVERSED TILDE */
+ ["\u223E", "\u223E"], /* INVERTED LAZY S */
+ ["\u223F", "\u223F"], /* SINE WAVE */
+ ["\u2240", "\u2240"], /* WREATH PRODUCT */
+ ["\u2241", "\u2241"], /* NOT TILDE */
+ ["\u2242", "\u2242"], /* MINUS TILDE */
+ ["\u2243", "\u2243"], /* ASYMPTOTICALLY EQUAL TO */
+ ["\u2244", "\u2244"], /* NOT ASYMPTOTICALLY EQUAL TO */
+ ["\u2245", "\u2245"], /* APPROXIMATELY EQUAL TO */
+ ["\u2246", "\u2246"], /* APPROXIMATELY BUT NOT ACTUALLY EQUAL TO */
+ ["\u2247", "\u2247"], /* NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO */
+ ["\u2248", "\u2248"], /* ALMOST EQUAL TO */
+ ["\u2249", "\u2249"], /* NOT ALMOST EQUAL TO */
+ ["\u224A", "\u224A"], /* ALMOST EQUAL OR EQUAL TO */
+ ["\u224B", "\u224B"], /* TRIPLE TILDE */
+ ["\u224C", "\u224C"], /* ALL EQUAL TO */
+ ["\u224D", "\u224D"], /* EQUIVALENT TO */
+ ["\u224E", "\u224E"], /* GEOMETRICALLY EQUIVALENT TO */
+ ["\u224F", "\u224F"], /* DIFFERENCE BETWEEN */
+ ["\u2250", "\u2250"], /* APPROACHES THE LIMIT */
+ ["\u2251", "\u2251"], /* GEOMETRICALLY EQUAL TO */
+ ["\u2252", "\u2252"], /* APPROXIMATELY EQUAL TO OR THE IMAGE OF */
+ ["\u2253", "\u2253"], /* IMAGE OF OR APPROXIMATELY EQUAL TO */
+ ["\u2254", "\u2254"], /* COLON EQUALS (COLON EQUAL) */
+ ["\u2255", "\u2255"], /* EQUALS COLON (EQUAL COLON) */
+ ["\u2256", "\u2256"], /* RING IN EQUAL TO */
+ ["\u2257", "\u2257"], /* RING EQUAL TO */
+ ["\u2258", "\u2258"], /* CORRESPONDS TO */
+ ["\u2259", "\u2259"], /* ESTIMATES */
+ ["\u225A", "\u225A"], /* EQUIANGULAR TO */
+ ["\u225B", "\u225B"], /* STAR EQUALS */
+ ["\u225C", "\u225C"], /* DELTA EQUAL TO */
+ ["\u225D", "\u225D"], /* EQUAL TO BY DEFINITION */
+ ["\u225E", "\u225E"], /* MEASURED BY */
+ ["\u225F", "\u225F"], /* QUESTIONED EQUAL TO */
+ ["\u2260", "\u2260"], /* NOT EQUAL TO */
+ ["\u2261", "\u2261"], /* IDENTICAL TO */
+ ["\u2262", "\u2262"], /* NOT IDENTICAL TO */
+ ["\u2263", "\u2263"], /* STRICTLY EQUIVALENT TO */
+ ["\u2264", "\u2264"], /* LESS-THAN OR EQUAL TO (LESS THAN OR EQUAL TO) */
+ ["\u2265", "\u2265"], /* GREATER-THAN OR EQUAL TO (GREATER THAN OR EQUAL TO) */
+ ["\u2266", "\u2266"], /* LESS-THAN OVER EQUAL TO (LESS THAN OVER EQUAL TO) */
+ ["\u2267", "\u2267"], /* GREATER-THAN OVER EQUAL TO (GREATER THAN OVER EQUAL TO) */
+ ["\u2268", "\u2268"], /* LESS-THAN BUT NOT EQUAL TO (LESS THAN BUT NOT EQUAL TO) */
+ ["\u2269", "\u2269"], /* GREATER-THAN BUT NOT EQUAL TO (GREATER THAN BUT NOT EQUAL TO) */
+ ["\u226A", "\u226A"], /* MUCH LESS-THAN (MUCH LESS THAN) */
+ ["\u226B", "\u226B"], /* MUCH GREATER-THAN (MUCH GREATER THAN) */
+ ["\u226C", "\u226C"], /* BETWEEN */
+ ["\u226D", "\u226D"], /* NOT EQUIVALENT TO */
+ ["\u226E", "\u226E"], /* NOT LESS-THAN (NOT LESS THAN) */
+ ["\u226F", "\u226F"], /* NOT GREATER-THAN (NOT GREATER THAN) */
+ ["\u2270", "\u2270"], /* NEITHER LESS-THAN NOR EQUAL TO (NEITHER LESS THAN NOR EQUAL TO) */
+ ["\u2271", "\u2271"], /* NEITHER GREATER-THAN NOR EQUAL TO (NEITHER GREATER THAN NOR EQUAL TO) */
+ ["\u2272", "\u2272"], /* LESS-THAN OR EQUIVALENT TO (LESS THAN OR EQUIVALENT TO) */
+ ["\u2273", "\u2273"], /* GREATER-THAN OR EQUIVALENT TO (GREATER THAN OR EQUIVALENT TO) */
+ ["\u2274", "\u2274"], /* NEITHER LESS-THAN NOR EQUIVALENT TO (NEITHER LESS THAN NOR EQUIVALENT TO) */
+ ["\u2275", "\u2275"], /* NEITHER GREATER-THAN NOR EQUIVALENT TO (NEITHER GREATER THAN NOR EQUIVALENT TO) */
+ ["\u2276", "\u2276"], /* LESS-THAN OR GREATER-THAN (LESS THAN OR GREATER THAN) */
+ ["\u2277", "\u2277"], /* GREATER-THAN OR LESS-THAN (GREATER THAN OR LESS THAN) */
+ ["\u2278", "\u2278"], /* NEITHER LESS-THAN NOR GREATER-THAN (NEITHER LESS THAN NOR GREATER THAN) */
+ ["\u2279", "\u2279"], /* NEITHER GREATER-THAN NOR LESS-THAN (NEITHER GREATER THAN NOR LESS THAN) */
+ ["\u227A", "\u227A"], /* PRECEDES */
+ ["\u227B", "\u227B"], /* SUCCEEDS */
+ ["\u227C", "\u227C"], /* PRECEDES OR EQUAL TO */
+ ["\u227D", "\u227D"], /* SUCCEEDS OR EQUAL TO */
+ ["\u227E", "\u227E"], /* PRECEDES OR EQUIVALENT TO */
+ ["\u227F", "\u227F"], /* SUCCEEDS OR EQUIVALENT TO */
+ ["\u2280", "\u2280"], /* DOES NOT PRECEDE */
+ ["\u2281", "\u2281"], /* DOES NOT SUCCEED */
+ ["\u2282", "\u2282"], /* SUBSET OF */
+ ["\u2283", "\u2283"], /* SUPERSET OF */
+ ["\u2284", "\u2284"], /* NOT A SUBSET OF */
+ ["\u2285", "\u2285"], /* NOT A SUPERSET OF */
+ ["\u2286", "\u2286"], /* SUBSET OF OR EQUAL TO */
+ ["\u2287", "\u2287"], /* SUPERSET OF OR EQUAL TO */
+ ["\u2288", "\u2288"], /* NEITHER A SUBSET OF NOR EQUAL TO */
+ ["\u2289", "\u2289"], /* NEITHER A SUPERSET OF NOR EQUAL TO */
+ ["\u228A", "\u228A"], /* SUBSET OF WITH NOT EQUAL TO (SUBSET OF OR NOT EQUAL TO) */
+ ["\u228B", "\u228B"], /* SUPERSET OF WITH NOT EQUAL TO (SUPERSET OF OR NOT EQUAL TO) */
+ ["\u228C", "\u228C"], /* MULTISET */
+ ["\u228D", "\u228D"], /* MULTISET MULTIPLICATION */
+ ["\u228E", "\u228E"], /* MULTISET UNION */
+ ["\u228F", "\u228F"], /* SQUARE IMAGE OF */
+ ["\u2290", "\u2290"], /* SQUARE ORIGINAL OF */
+ ["\u2291", "\u2291"], /* SQUARE IMAGE OF OR EQUAL TO */
+ ["\u2292", "\u2292"], /* SQUARE ORIGINAL OF OR EQUAL TO */
+ ["\u2293", "\u2293"], /* SQUARE CAP */
+ ["\u2294", "\u2294"], /* SQUARE CUP */
+ ["\u2295", "\u2295"], /* CIRCLED PLUS */
+ ["\u2296", "\u2296"], /* CIRCLED MINUS */
+ ["\u2297", "\u2297"], /* CIRCLED TIMES */
+ ["\u2298", "\u2298"], /* CIRCLED DIVISION SLASH */
+ ["\u2299", "\u2299"], /* CIRCLED DOT OPERATOR */
+ ["\u229A", "\u229A"], /* CIRCLED RING OPERATOR */
+ ["\u229B", "\u229B"], /* CIRCLED ASTERISK OPERATOR */
+ ["\u229C", "\u229C"], /* CIRCLED EQUALS */
+ ["\u229D", "\u229D"], /* CIRCLED DASH */
+ ["\u229E", "\u229E"], /* SQUARED PLUS */
+ ["\u229F", "\u229F"], /* SQUARED MINUS */
+ ["\u22A0", "\u22A0"], /* SQUARED TIMES */
+ ["\u22A1", "\u22A1"], /* SQUARED DOT OPERATOR */
+ ["\u22A2", "\u22A2"], /* RIGHT TACK */
+ ["\u22A3", "\u22A3"], /* LEFT TACK */
+ ["\u22A4", "\u22A4"], /* DOWN TACK */
+ ["\u22A5", "\u22A5"], /* UP TACK */
+ ["\u22A6", "\u22A6"], /* ASSERTION */
+ ["\u22A7", "\u22A7"], /* MODELS */
+ ["\u22A8", "\u22A8"], /* TRUE */
+ ["\u22A9", "\u22A9"], /* FORCES */
+ ["\u22AA", "\u22AA"], /* TRIPLE VERTICAL BAR RIGHT TURNSTILE */
+ ["\u22AB", "\u22AB"], /* DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */
+ ["\u22AC", "\u22AC"], /* DOES NOT PROVE */
+ ["\u22AD", "\u22AD"], /* NOT TRUE */
+ ["\u22AE", "\u22AE"], /* DOES NOT FORCE */
+ ["\u22AF", "\u22AF"], /* NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */
+ ["\u22B0", "\u22B0"], /* PRECEDES UNDER RELATION */
+ ["\u22B1", "\u22B1"], /* SUCCEEDS UNDER RELATION */
+ ["\u22B2", "\u22B2"], /* NORMAL SUBGROUP OF */
+ ["\u22B3", "\u22B3"], /* CONTAINS AS NORMAL SUBGROUP */
+ ["\u22B4", "\u22B4"], /* NORMAL SUBGROUP OF OR EQUAL TO */
+ ["\u22B5", "\u22B5"], /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */
+ ["\u22B6", "\u22B6"], /* ORIGINAL OF */
+ ["\u22B7", "\u22B7"], /* IMAGE OF */
+ ["\u22B8", "\u22B8"], /* MULTIMAP */
+ ["\u22B9", "\u22B9"], /* HERMITIAN CONJUGATE MATRIX */
+ ["\u22BA", "\u22BA"], /* INTERCALATE */
+ ["\u22BB", "\u22BB"], /* XOR */
+ ["\u22BC", "\u22BC"], /* NAND */
+ ["\u22BD", "\u22BD"], /* NOR */
+ ["\u22BE", "\u22BE"], /* RIGHT ANGLE WITH ARC */
+ ["\u22BF", "\u22BF"], /* RIGHT TRIANGLE */
+ ["\u22C0", "\u22C0"], /* N-ARY LOGICAL AND */
+ ["\u22C1", "\u22C1"], /* N-ARY LOGICAL OR */
+ ["\u22C2", "\u22C2"], /* N-ARY INTERSECTION */
+ ["\u22C3", "\u22C3"], /* N-ARY UNION */
+ ["\u22C4", "\u22C4"], /* DIAMOND OPERATOR */
+ ["\u22C5", "\u22C5"], /* DOT OPERATOR */
+ ["\u22C6", "\u22C6"], /* STAR OPERATOR */
+ ["\u22C7", "\u22C7"], /* DIVISION TIMES */
+ ["\u22C8", "\u22C8"], /* BOWTIE */
+ ["\u22C9", "\u22C9"], /* LEFT NORMAL FACTOR SEMIDIRECT PRODUCT */
+ ["\u22CA", "\u22CA"], /* RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT */
+ ["\u22CB", "\u22CB"], /* LEFT SEMIDIRECT PRODUCT */
+ ["\u22CC", "\u22CC"], /* RIGHT SEMIDIRECT PRODUCT */
+ ["\u22CD", "\u22CD"], /* REVERSED TILDE EQUALS */
+ ["\u22CE", "\u22CE"], /* CURLY LOGICAL OR */
+ ["\u22CF", "\u22CF"], /* CURLY LOGICAL AND */
+ ["\u22D0", "\u22D0"], /* DOUBLE SUBSET */
+ ["\u22D1", "\u22D1"], /* DOUBLE SUPERSET */
+ ["\u22D2", "\u22D2"], /* DOUBLE INTERSECTION */
+ ["\u22D3", "\u22D3"], /* DOUBLE UNION */
+ ["\u22D4", "\u22D4"], /* PITCHFORK */
+ ["\u22D5", "\u22D5"], /* EQUAL AND PARALLEL TO */
+ ["\u22D6", "\u22D6"], /* LESS-THAN WITH DOT (LESS THAN WITH DOT) */
+ ["\u22D7", "\u22D7"], /* GREATER-THAN WITH DOT (GREATER THAN WITH DOT) */
+ ["\u22D8", "\u22D8"], /* VERY MUCH LESS-THAN (VERY MUCH LESS THAN) */
+ ["\u22D9", "\u22D9"], /* VERY MUCH GREATER-THAN (VERY MUCH GREATER THAN) */
+ ["\u22DA", "\u22DA"], /* LESS-THAN EQUAL TO OR GREATER-THAN (LESS THAN EQUAL TO OR GREATER THAN) */
+ ["\u22DB", "\u22DB"], /* GREATER-THAN EQUAL TO OR LESS-THAN (GREATER THAN EQUAL TO OR LESS THAN) */
+ ["\u22DC", "\u22DC"], /* EQUAL TO OR LESS-THAN (EQUAL TO OR LESS THAN) */
+ ["\u22DD", "\u22DD"], /* EQUAL TO OR GREATER-THAN (EQUAL TO OR GREATER THAN) */
+ ["\u22DE", "\u22DE"], /* EQUAL TO OR PRECEDES */
+ ["\u22DF", "\u22DF"], /* EQUAL TO OR SUCCEEDS */
+ ["\u22E0", "\u22E0"], /* DOES NOT PRECEDE OR EQUAL */
+ ["\u22E1", "\u22E1"], /* DOES NOT SUCCEED OR EQUAL */
+ ["\u22E2", "\u22E2"], /* NOT SQUARE IMAGE OF OR EQUAL TO */
+ ["\u22E3", "\u22E3"], /* NOT SQUARE ORIGINAL OF OR EQUAL TO */
+ ["\u22E4", "\u22E4"], /* SQUARE IMAGE OF OR NOT EQUAL TO */
+ ["\u22E5", "\u22E5"], /* SQUARE ORIGINAL OF OR NOT EQUAL TO */
+ ["\u22E6", "\u22E6"], /* LESS-THAN BUT NOT EQUIVALENT TO (LESS THAN BUT NOT EQUIVALENT TO) */
+ ["\u22E7", "\u22E7"], /* GREATER-THAN BUT NOT EQUIVALENT TO (GREATER THAN BUT NOT EQUIVALENT TO) */
+ ["\u22E8", "\u22E8"], /* PRECEDES BUT NOT EQUIVALENT TO */
+ ["\u22E9", "\u22E9"], /* SUCCEEDS BUT NOT EQUIVALENT TO */
+ ["\u22EA", "\u22EA"], /* NOT NORMAL SUBGROUP OF */
+ ["\u22EB", "\u22EB"], /* DOES NOT CONTAIN AS NORMAL SUBGROUP */
+ ["\u22EC", "\u22EC"], /* NOT NORMAL SUBGROUP OF OR EQUAL TO */
+ ["\u22ED", "\u22ED"], /* DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL */
+ ["\u22EE", "\u22EE"], /* VERTICAL ELLIPSIS */
+ ["\u22EF", "\u22EF"], /* MIDLINE HORIZONTAL ELLIPSIS */
+ ["\u22F0", "\u22F0"], /* UP RIGHT DIAGONAL ELLIPSIS */
+ ["\u22F1", "\u22F1"], /* DOWN RIGHT DIAGONAL ELLIPSIS */
+ ["\u22F2", "\u22F2"], /* ELEMENT OF WITH LONG HORIZONTAL STROKE */
+ ["\u22F3", "\u22F3"], /* ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
+ ["\u22F4", "\u22F4"], /* SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
+ ["\u22F5", "\u22F5"], /* ELEMENT OF WITH DOT ABOVE */
+ ["\u22F6", "\u22F6"], /* ELEMENT OF WITH OVERBAR */
+ ["\u22F7", "\u22F7"], /* SMALL ELEMENT OF WITH OVERBAR */
+ ["\u22F8", "\u22F8"], /* ELEMENT OF WITH UNDERBAR */
+ ["\u22F9", "\u22F9"], /* ELEMENT OF WITH TWO HORIZONTAL STROKES */
+ ["\u22FA", "\u22FA"], /* CONTAINS WITH LONG HORIZONTAL STROKE */
+ ["\u22FB", "\u22FB"], /* CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
+ ["\u22FC", "\u22FC"], /* SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
+ ["\u22FD", "\u22FD"], /* CONTAINS WITH OVERBAR */
+ ["\u22FE", "\u22FE"], /* SMALL CONTAINS WITH OVERBAR */
+ ["\u22FF", "\u22FF"], /* Z NOTATION BAG MEMBERSHIP */
+ ["\u2300", "\u2300"], /* DIAMETER SIGN */
+ ["\u2301", "\u2301"], /* ELECTRIC ARROW */
+ ["\u2302", "\u2302"], /* HOUSE */
+ ["\u2303", "\u2303"], /* UP ARROWHEAD */
+ ["\u2304", "\u2304"], /* DOWN ARROWHEAD */
+ ["\u2305", "\u2305"], /* PROJECTIVE */
+ ["\u2306", "\u2306"], /* PERSPECTIVE */
+ ["\u2307", "\u2307"], /* WAVY LINE */
+ ["\u2308", "\u2308"], /* LEFT CEILING */
+ ["\u2309", "\u2309"], /* RIGHT CEILING */
+ ["\u230A", "\u230A"], /* LEFT FLOOR */
+ ["\u230B", "\u230B"], /* RIGHT FLOOR */
+ ["\u230C", "\u230C"], /* BOTTOM RIGHT CROP */
+ ["\u230D", "\u230D"], /* BOTTOM LEFT CROP */
+ ["\u230E", "\u230E"], /* TOP RIGHT CROP */
+ ["\u230F", "\u230F"], /* TOP LEFT CROP */
+ ["\u2310", "\u2310"], /* REVERSED NOT SIGN */
+ ["\u2311", "\u2311"], /* SQUARE LOZENGE */
+ ["\u2312", "\u2312"], /* ARC */
+ ["\u2313", "\u2313"], /* SEGMENT */
+ ["\u2314", "\u2314"], /* SECTOR */
+ ["\u2315", "\u2315"], /* TELEPHONE RECORDER */
+ ["\u2316", "\u2316"], /* POSITION INDICATOR */
+ ["\u2317", "\u2317"], /* VIEWDATA SQUARE */
+ ["\u2318", "\u2318"], /* PLACE OF INTEREST SIGN (COMMAND KEY) */
+ ["\u2319", "\u2319"], /* TURNED NOT SIGN */
+ ["\u231A", "\u231A"], /* WATCH */
+ ["\u231B", "\u231B"], /* HOURGLASS */
+ ["\u231C", "\u231C"], /* TOP LEFT CORNER */
+ ["\u231D", "\u231D"], /* TOP RIGHT CORNER */
+ ["\u231E", "\u231E"], /* BOTTOM LEFT CORNER */
+ ["\u231F", "\u231F"], /* BOTTOM RIGHT CORNER */
+ ["\u2320", "\u2320"], /* TOP HALF INTEGRAL */
+ ["\u2321", "\u2321"], /* BOTTOM HALF INTEGRAL */
+ ["\u2322", "\u2322"], /* FROWN */
+ ["\u2323", "\u2323"], /* SMILE */
+ ["\u2324", "\u2324"], /* UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS (ENTER KEY) */
+ ["\u2325", "\u2325"], /* OPTION KEY */
+ ["\u2326", "\u2326"], /* ERASE TO THE RIGHT (DELETE TO THE RIGHT KEY) */
+ ["\u2327", "\u2327"], /* X IN A RECTANGLE BOX (CLEAR KEY) */
+ ["\u2328", "\u2328"], /* KEYBOARD */
+ ["\u2329", "\u2329"], /* LEFT-POINTING ANGLE BRACKET (BRA) */
+ ["\u232A", "\u232A"], /* RIGHT-POINTING ANGLE BRACKET (KET) */
+ ["\u232B", "\u232B"], /* ERASE TO THE LEFT (DELETE TO THE LEFT KEY) */
+ ["\u232C", "\u232C"], /* BENZENE RING */
+ ["\u232D", "\u232D"], /* CYLINDRICITY */
+ ["\u232E", "\u232E"], /* ALL AROUND-PROFILE */
+ ["\u232F", "\u232F"], /* SYMMETRY */
+ ["\u2330", "\u2330"], /* TOTAL RUNOUT */
+ ["\u2331", "\u2331"], /* DIMENSION ORIGIN */
+ ["\u2332", "\u2332"], /* CONICAL TAPER */
+ ["\u2333", "\u2333"], /* SLOPE */
+ ["\u2334", "\u2334"], /* COUNTERBORE */
+ ["\u2335", "\u2335"], /* COUNTERSINK */
+ ["\u2336", "\u2336"], /* APL FUNCTIONAL SYMBOL I-BEAM */
+ ["\u2337", "\u2337"], /* APL FUNCTIONAL SYMBOL SQUISH QUAD */
+ ["\u2338", "\u2338"], /* APL FUNCTIONAL SYMBOL QUAD EQUAL */
+ ["\u2339", "\u2339"], /* APL FUNCTIONAL SYMBOL QUAD DIVIDE */
+ ["\u233A", "\u233A"], /* APL FUNCTIONAL SYMBOL QUAD DIAMOND */
+ ["\u233B", "\u233B"], /* APL FUNCTIONAL SYMBOL QUAD JOT */
+ ["\u233C", "\u233C"], /* APL FUNCTIONAL SYMBOL QUAD CIRCLE */
+ ["\u233D", "\u233D"], /* APL FUNCTIONAL SYMBOL CIRCLE STILE */
+ ["\u233E", "\u233E"], /* APL FUNCTIONAL SYMBOL CIRCLE JOT */
+ ["\u233F", "\u233F"], /* APL FUNCTIONAL SYMBOL SLASH BAR */
+ ["\u2340", "\u2340"], /* APL FUNCTIONAL SYMBOL BACKSLASH BAR */
+ ["\u2341", "\u2341"], /* APL FUNCTIONAL SYMBOL QUAD SLASH */
+ ["\u2342", "\u2342"], /* APL FUNCTIONAL SYMBOL QUAD BACKSLASH */
+ ["\u2343", "\u2343"], /* APL FUNCTIONAL SYMBOL QUAD LESS-THAN */
+ ["\u2344", "\u2344"], /* APL FUNCTIONAL SYMBOL QUAD GREATER-THAN */
+ ["\u2345", "\u2345"], /* APL FUNCTIONAL SYMBOL LEFTWARDS VANE */
+ ["\u2346", "\u2346"], /* APL FUNCTIONAL SYMBOL RIGHTWARDS VANE */
+ ["\u2347", "\u2347"], /* APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW */
+ ["\u2348", "\u2348"], /* APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW */
+ ["\u2349", "\u2349"], /* APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH */
+ ["\u234A", "\u234A"], /* APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR */
+ ["\u234B", "\u234B"], /* APL FUNCTIONAL SYMBOL DELTA STILE */
+ ["\u234C", "\u234C"], /* APL FUNCTIONAL SYMBOL QUAD DOWN CARET */
+ ["\u234D", "\u234D"], /* APL FUNCTIONAL SYMBOL QUAD DELTA */
+ ["\u234E", "\u234E"], /* APL FUNCTIONAL SYMBOL DOWN TACK JOT */
+ ["\u234F", "\u234F"], /* APL FUNCTIONAL SYMBOL UPWARDS VANE */
+ ["\u2350", "\u2350"], /* APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW */
+ ["\u2351", "\u2351"], /* APL FUNCTIONAL SYMBOL UP TACK OVERBAR */
+ ["\u2352", "\u2352"], /* APL FUNCTIONAL SYMBOL DEL STILE */
+ ["\u2353", "\u2353"], /* APL FUNCTIONAL SYMBOL QUAD UP CARET */
+ ["\u2354", "\u2354"], /* APL FUNCTIONAL SYMBOL QUAD DEL */
+ ["\u2355", "\u2355"], /* APL FUNCTIONAL SYMBOL UP TACK JOT */
+ ["\u2356", "\u2356"], /* APL FUNCTIONAL SYMBOL DOWNWARDS VANE */
+ ["\u2357", "\u2357"], /* APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW */
+ ["\u2358", "\u2358"], /* APL FUNCTIONAL SYMBOL QUOTE UNDERBAR */
+ ["\u2359", "\u2359"], /* APL FUNCTIONAL SYMBOL DELTA UNDERBAR */
+ ["\u235A", "\u235A"], /* APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR */
+ ["\u235B", "\u235B"], /* APL FUNCTIONAL SYMBOL JOT UNDERBAR */
+ ["\u235C", "\u235C"], /* APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR */
+ ["\u235D", "\u235D"], /* APL FUNCTIONAL SYMBOL UP SHOE JOT */
+ ["\u235E", "\u235E"], /* APL FUNCTIONAL SYMBOL QUOTE QUAD */
+ ["\u235F", "\u235F"], /* APL FUNCTIONAL SYMBOL CIRCLE STAR */
+ ["\u2360", "\u2360"], /* APL FUNCTIONAL SYMBOL QUAD COLON */
+ ["\u2361", "\u2361"], /* APL FUNCTIONAL SYMBOL UP TACK DIAERESIS */
+ ["\u2362", "\u2362"], /* APL FUNCTIONAL SYMBOL DEL DIAERESIS */
+ ["\u2363", "\u2363"], /* APL FUNCTIONAL SYMBOL STAR DIAERESIS */
+ ["\u2364", "\u2364"], /* APL FUNCTIONAL SYMBOL JOT DIAERESIS */
+ ["\u2365", "\u2365"], /* APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS */
+ ["\u2366", "\u2366"], /* APL FUNCTIONAL SYMBOL DOWN SHOE STILE */
+ ["\u2367", "\u2367"], /* APL FUNCTIONAL SYMBOL LEFT SHOE STILE */
+ ["\u2368", "\u2368"], /* APL FUNCTIONAL SYMBOL TILDE DIAERESIS */
+ ["\u2369", "\u2369"], /* APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS */
+ ["\u236A", "\u236A"], /* APL FUNCTIONAL SYMBOL COMMA BAR */
+ ["\u236B", "\u236B"], /* APL FUNCTIONAL SYMBOL DEL TILDE */
+ ["\u236C", "\u236C"], /* APL FUNCTIONAL SYMBOL ZILDE */
+ ["\u236D", "\u236D"], /* APL FUNCTIONAL SYMBOL STILE TILDE */
+ ["\u236E", "\u236E"], /* APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR */
+ ["\u236F", "\u236F"], /* APL FUNCTIONAL SYMBOL QUAD NOT EQUAL */
+ ["\u2370", "\u2370"], /* APL FUNCTIONAL SYMBOL QUAD QUESTION */
+ ["\u2371", "\u2371"], /* APL FUNCTIONAL SYMBOL DOWN CARET TILDE */
+ ["\u2372", "\u2372"], /* APL FUNCTIONAL SYMBOL UP CARET TILDE */
+ ["\u2373", "\u2373"], /* APL FUNCTIONAL SYMBOL IOTA */
+ ["\u2374", "\u2374"], /* APL FUNCTIONAL SYMBOL RHO */
+ ["\u2375", "\u2375"], /* APL FUNCTIONAL SYMBOL OMEGA */
+ ["\u2376", "\u2376"], /* APL FUNCTIONAL SYMBOL ALPHA UNDERBAR */
+ ["\u2377", "\u2377"], /* APL FUNCTIONAL SYMBOL EPSILON UNDERBAR */
+ ["\u2378", "\u2378"], /* APL FUNCTIONAL SYMBOL IOTA UNDERBAR */
+ ["\u2379", "\u2379"], /* APL FUNCTIONAL SYMBOL OMEGA UNDERBAR */
+ ["\u237A", "\u237A"], /* APL FUNCTIONAL SYMBOL ALPHA */
+ ["\u237B", "\u237B"], /* NOT CHECK MARK */
+ ["\u237C", "\u237C"], /* RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW */
+ ["\u237D", "\u237D"], /* SHOULDERED OPEN BOX */
+ ["\u237E", "\u237E"], /* BELL SYMBOL */
+ ["\u237F", "\u237F"], /* VERTICAL LINE WITH MIDDLE DOT */
+ ["\u2380", "\u2380"], /* INSERTION SYMBOL */
+ ["\u2381", "\u2381"], /* CONTINUOUS UNDERLINE SYMBOL */
+ ["\u2382", "\u2382"], /* DISCONTINUOUS UNDERLINE SYMBOL */
+ ["\u2383", "\u2383"], /* EMPHASIS SYMBOL */
+ ["\u2384", "\u2384"], /* COMPOSITION SYMBOL */
+ ["\u2385", "\u2385"], /* WHITE SQUARE WITH CENTRE VERTICAL LINE */
+ ["\u2386", "\u2386"], /* ENTER SYMBOL */
+ ["\u2387", "\u2387"], /* ALTERNATIVE KEY SYMBOL */
+ ["\u2388", "\u2388"], /* HELM SYMBOL */
+ ["\u2389", "\u2389"], /* CIRCLED HORIZONTAL BAR WITH NOTCH */
+ ["\u238A", "\u238A"], /* CIRCLED TRIANGLE DOWN */
+ ["\u238B", "\u238B"], /* BROKEN CIRCLE WITH NORTHWEST ARROW */
+ ["\u238C", "\u238C"], /* UNDO SYMBOL */
+ ["\u238D", "\u238D"], /* MONOSTABLE SYMBOL */
+ ["\u238E", "\u238E"], /* HYSTERESIS SYMBOL */
+ ["\u238F", "\u238F"], /* OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL */
+ ["\u2390", "\u2390"], /* OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL */
+ ["\u2391", "\u2391"], /* PASSIVE-PULL-DOWN-OUTPUT SYMBOL */
+ ["\u2392", "\u2392"], /* PASSIVE-PULL-UP-OUTPUT SYMBOL */
+ ["\u2393", "\u2393"], /* DIRECT CURRENT SYMBOL FORM TWO */
+ ["\u2394", "\u2394"], /* SOFTWARE-FUNCTION SYMBOL */
+ ["\u2395", "\u2395"], /* APL FUNCTIONAL SYMBOL QUAD */
+ ["\u2396", "\u2396"], /* DECIMAL SEPARATOR KEY SYMBOL */
+ ["\u2397", "\u2397"], /* PREVIOUS PAGE */
+ ["\u2398", "\u2398"], /* NEXT PAGE */
+ ["\u2399", "\u2399"], /* PRINT SCREEN SYMBOL */
+ ["\u239A", "\u239A"], /* CLEAR SCREEN SYMBOL */
+ ["\u239B", "\u239B"], /* LEFT PARENTHESIS UPPER HOOK */
+ ["\u239C", "\u239C"], /* LEFT PARENTHESIS EXTENSION */
+ ["\u239D", "\u239D"], /* LEFT PARENTHESIS LOWER HOOK */
+ ["\u239E", "\u239E"], /* RIGHT PARENTHESIS UPPER HOOK */
+ ["\u239F", "\u239F"], /* RIGHT PARENTHESIS EXTENSION */
+ ["\u23A0", "\u23A0"], /* RIGHT PARENTHESIS LOWER HOOK */
+ ["\u23A1", "\u23A1"], /* LEFT SQUARE BRACKET UPPER CORNER */
+ ["\u23A2", "\u23A2"], /* LEFT SQUARE BRACKET EXTENSION */
+ ["\u23A3", "\u23A3"], /* LEFT SQUARE BRACKET LOWER CORNER */
+ ["\u23A4", "\u23A4"], /* RIGHT SQUARE BRACKET UPPER CORNER */
+ ["\u23A5", "\u23A5"], /* RIGHT SQUARE BRACKET EXTENSION */
+ ["\u23A6", "\u23A6"], /* RIGHT SQUARE BRACKET LOWER CORNER */
+ ["\u23A7", "\u23A7"], /* LEFT CURLY BRACKET UPPER HOOK */
+ ["\u23A8", "\u23A8"], /* LEFT CURLY BRACKET MIDDLE PIECE */
+ ["\u23A9", "\u23A9"], /* LEFT CURLY BRACKET LOWER HOOK */
+ ["\u23AA", "\u23AA"], /* CURLY BRACKET EXTENSION */
+ ["\u23AB", "\u23AB"], /* RIGHT CURLY BRACKET UPPER HOOK */
+ ["\u23AC", "\u23AC"], /* RIGHT CURLY BRACKET MIDDLE PIECE */
+ ["\u23AD", "\u23AD"], /* RIGHT CURLY BRACKET LOWER HOOK */
+ ["\u23AE", "\u23AE"], /* INTEGRAL EXTENSION */
+ ["\u23AF", "\u23AF"], /* HORIZONTAL LINE EXTENSION */
+ ["\u23B0", "\u23B0"], /* UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION */
+ ["\u23B1", "\u23B1"], /* UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION */
+ ["\u23B2", "\u23B2"], /* SUMMATION TOP */
+ ["\u23B3", "\u23B3"], /* SUMMATION BOTTOM */
+ ["\u23B4", "\u23B4"], /* TOP SQUARE BRACKET */
+ ["\u23B5", "\u23B5"], /* BOTTOM SQUARE BRACKET */
+ ["\u23B6", "\u23B6"], /* BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET */
+ ["\u23B7", "\u23B7"], /* RADICAL SYMBOL BOTTOM */
+ ["\u23B8", "\u23B8"], /* LEFT VERTICAL BOX LINE */
+ ["\u23B9", "\u23B9"], /* RIGHT VERTICAL BOX LINE */
+ ["\u23BA", "\u23BA"], /* HORIZONTAL SCAN LINE-1 */
+ ["\u23BB", "\u23BB"], /* HORIZONTAL SCAN LINE-3 */
+ ["\u23BC", "\u23BC"], /* HORIZONTAL SCAN LINE-7 */
+ ["\u23BD", "\u23BD"], /* HORIZONTAL SCAN LINE-9 */
+ ["\u23BE", "\u23BE"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT */
+ ["\u23BF", "\u23BF"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT */
+ ["\u23C0", "\u23C0"], /* DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE */
+ ["\u23C1", "\u23C1"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE */
+ ["\u23C2", "\u23C2"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE */
+ ["\u23C3", "\u23C3"], /* DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE */
+ ["\u23C4", "\u23C4"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE */
+ ["\u23C5", "\u23C5"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE */
+ ["\u23C6", "\u23C6"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE */
+ ["\u23C7", "\u23C7"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE */
+ ["\u23C8", "\u23C8"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE */
+ ["\u23C9", "\u23C9"], /* DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL */
+ ["\u23CA", "\u23CA"], /* DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL */
+ ["\u23CB", "\u23CB"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT */
+ ["\u23CC", "\u23CC"], /* DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT */
+ ["\u23CD", "\u23CD"], /* SQUARE FOOT */
+ ["\u23CE", "\u23CE"], /* RETURN SYMBOL */
+ ["\u23CF", "\u23CF"], /* EJECT SYMBOL */
+ ["\u23D0", "\u23D0"], /* VERTICAL LINE EXTENSION */
+ ["\u23D1", "\u23D1"], /* METRICAL BREVE */
+ ["\u23D2", "\u23D2"], /* METRICAL LONG OVER SHORT */
+ ["\u23D3", "\u23D3"], /* METRICAL SHORT OVER LONG */
+ ["\u23D4", "\u23D4"], /* METRICAL LONG OVER TWO SHORTS */
+ ["\u23D5", "\u23D5"], /* METRICAL TWO SHORTS OVER LONG */
+ ["\u23D6", "\u23D6"], /* METRICAL TWO SHORTS JOINED */
+ ["\u23D7", "\u23D7"], /* METRICAL TRISEME */
+ ["\u23D8", "\u23D8"], /* METRICAL TETRASEME */
+ ["\u23D9", "\u23D9"], /* METRICAL PENTASEME */
+ ["\u23DA", "\u23DA"], /* EARTH GROUND */
+ ["\u23DB", "\u23DB"], /* FUSE */
+ ["\u23DC", "\u23DC"], /* TOP PARENTHESIS */
+ ["\u23DD", "\u23DD"], /* BOTTOM PARENTHESIS */
+ ["\u23DE", "\u23DE"], /* TOP CURLY BRACKET */
+ ["\u23DF", "\u23DF"], /* BOTTOM CURLY BRACKET */
+ ["\u23E0", "\u23E0"], /* TOP TORTOISE SHELL BRACKET */
+ ["\u23E1", "\u23E1"], /* BOTTOM TORTOISE SHELL BRACKET */
+ ["\u23E2", "\u23E2"], /* WHITE TRAPEZIUM */
+ ["\u23E3", "\u23E3"], /* BENZENE RING WITH CIRCLE */
+ ["\u23E4", "\u23E4"], /* STRAIGHTNESS */
+ ["\u23E5", "\u23E5"], /* FLATNESS */
+ ["\u23E6", "\u23E6"], /* AC CURRENT */
+ ["\u23E7", "\u23E7"], /* ELECTRICAL INTERSECTION */
+ ["\u23E8", "\u23E8"], /* DECIMAL EXPONENT SYMBOL */
+ ["\u23E9", "\u23E9"], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE */
+ ["\u23EA", "\u23EA"], /* BLACK LEFT-POINTING DOUBLE TRIANGLE */
+ ["\u23EB", "\u23EB"], /* BLACK UP-POINTING DOUBLE TRIANGLE */
+ ["\u23EC", "\u23EC"], /* BLACK DOWN-POINTING DOUBLE TRIANGLE */
+ ["\u23ED", "\u23ED"], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */
+ ["\u23EE", "\u23EE"], /* BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */
+ ["\u23EF", "\u23EF"], /* BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR */
+ ["\u23F0", "\u23F0"], /* ALARM CLOCK */
+ ["\u23F1", "\u23F1"], /* STOPWATCH */
+ ["\u23F2", "\u23F2"], /* TIMER CLOCK */
+ ["\u23F3", "\u23F3"], /* HOURGLASS WITH FLOWING SAND */
+ ["\u23F4", "\u23F4"], /* BLACK MEDIUM LEFT-POINTING TRIANGLE */
+ ["\u23F5", "\u23F5"], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE */
+ ["\u23F6", "\u23F6"], /* BLACK MEDIUM UP-POINTING TRIANGLE */
+ ["\u23F7", "\u23F7"], /* BLACK MEDIUM DOWN-POINTING TRIANGLE */
+ ["\u23F8", "\u23F8"], /* DOUBLE VERTICAL BAR */
+ ["\u23F9", "\u23F9"], /* BLACK SQUARE FOR STOP */
+ ["\u23FA", "\u23FA"], /* BLACK CIRCLE FOR RECORD */
+ ["\u23FB", "\u23FB"], /* POWER SYMBOL */
+ ["\u23FC", "\u23FC"], /* POWER ON-OFF SYMBOL */
+ ["\u23FD", "\u23FD"], /* POWER ON SYMBOL */
+ ["\u23FE", "\u23FE"], /* POWER SLEEP SYMBOL */
+ ["\u23FF", "\u23FF"], /* OBSERVER EYE SYMBOL */
+ ["\u2400", "\u2400"], /* SYMBOL FOR NULL (GRAPHIC FOR NULL) */
+ ["\u2401", "\u2401"], /* SYMBOL FOR START OF HEADING (GRAPHIC FOR START OF HEADING) */
+ ["\u2402", "\u2402"], /* SYMBOL FOR START OF TEXT (GRAPHIC FOR START OF TEXT) */
+ ["\u2403", "\u2403"], /* SYMBOL FOR END OF TEXT (GRAPHIC FOR END OF TEXT) */
+ ["\u2404", "\u2404"], /* SYMBOL FOR END OF TRANSMISSION (GRAPHIC FOR END OF TRANSMISSION) */
+ ["\u2405", "\u2405"], /* SYMBOL FOR ENQUIRY (GRAPHIC FOR ENQUIRY) */
+ ["\u2406", "\u2406"], /* SYMBOL FOR ACKNOWLEDGE (GRAPHIC FOR ACKNOWLEDGE) */
+ ["\u2407", "\u2407"], /* SYMBOL FOR BELL (GRAPHIC FOR BELL) */
+ ["\u2408", "\u2408"], /* SYMBOL FOR BACKSPACE (GRAPHIC FOR BACKSPACE) */
+ ["\u2409", "\u2409"], /* SYMBOL FOR HORIZONTAL TABULATION (GRAPHIC FOR HORIZONTAL TABULATION) */
+ ["\u240A", "\u240A"], /* SYMBOL FOR LINE FEED (GRAPHIC FOR LINE FEED) */
+ ["\u240B", "\u240B"], /* SYMBOL FOR VERTICAL TABULATION (GRAPHIC FOR VERTICAL TABULATION) */
+ ["\u240C", "\u240C"], /* SYMBOL FOR FORM FEED (GRAPHIC FOR FORM FEED) */
+ ["\u240D", "\u240D"], /* SYMBOL FOR CARRIAGE RETURN (GRAPHIC FOR CARRIAGE RETURN) */
+ ["\u240E", "\u240E"], /* SYMBOL FOR SHIFT OUT (GRAPHIC FOR SHIFT OUT) */
+ ["\u240F", "\u240F"], /* SYMBOL FOR SHIFT IN (GRAPHIC FOR SHIFT IN) */
+ ["\u2410", "\u2410"], /* SYMBOL FOR DATA LINK ESCAPE (GRAPHIC FOR DATA LINK ESCAPE) */
+ ["\u2411", "\u2411"], /* SYMBOL FOR DEVICE CONTROL ONE (GRAPHIC FOR DEVICE CONTROL ONE) */
+ ["\u2412", "\u2412"], /* SYMBOL FOR DEVICE CONTROL TWO (GRAPHIC FOR DEVICE CONTROL TWO) */
+ ["\u2413", "\u2413"], /* SYMBOL FOR DEVICE CONTROL THREE (GRAPHIC FOR DEVICE CONTROL THREE) */
+ ["\u2414", "\u2414"], /* SYMBOL FOR DEVICE CONTROL FOUR (GRAPHIC FOR DEVICE CONTROL FOUR) */
+ ["\u2415", "\u2415"], /* SYMBOL FOR NEGATIVE ACKNOWLEDGE (GRAPHIC FOR NEGATIVE ACKNOWLEDGE) */
+ ["\u2416", "\u2416"], /* SYMBOL FOR SYNCHRONOUS IDLE (GRAPHIC FOR SYNCHRONOUS IDLE) */
+ ["\u2417", "\u2417"], /* SYMBOL FOR END OF TRANSMISSION BLOCK (GRAPHIC FOR END OF TRANSMISSION BLOCK) */
+ ["\u2418", "\u2418"], /* SYMBOL FOR CANCEL (GRAPHIC FOR CANCEL) */
+ ["\u2419", "\u2419"], /* SYMBOL FOR END OF MEDIUM (GRAPHIC FOR END OF MEDIUM) */
+ ["\u241A", "\u241A"], /* SYMBOL FOR SUBSTITUTE (GRAPHIC FOR SUBSTITUTE) */
+ ["\u241B", "\u241B"], /* SYMBOL FOR ESCAPE (GRAPHIC FOR ESCAPE) */
+ ["\u241C", "\u241C"], /* SYMBOL FOR FILE SEPARATOR (GRAPHIC FOR FILE SEPARATOR) */
+ ["\u241D", "\u241D"], /* SYMBOL FOR GROUP SEPARATOR (GRAPHIC FOR GROUP SEPARATOR) */
+ ["\u241E", "\u241E"], /* SYMBOL FOR RECORD SEPARATOR (GRAPHIC FOR RECORD SEPARATOR) */
+ ["\u241F", "\u241F"], /* SYMBOL FOR UNIT SEPARATOR (GRAPHIC FOR UNIT SEPARATOR) */
+ ["\u2420", "\u2420"], /* SYMBOL FOR SPACE (GRAPHIC FOR SPACE) */
+ ["\u2421", "\u2421"], /* SYMBOL FOR DELETE (GRAPHIC FOR DELETE) */
+ ["\u2422", "\u2422"], /* BLANK SYMBOL (BLANK) */
+ ["\u2423", "\u2423"], /* OPEN BOX */
+ ["\u2424", "\u2424"], /* SYMBOL FOR NEWLINE (GRAPHIC FOR NEWLINE) */
+ ["\u2425", "\u2425"], /* SYMBOL FOR DELETE FORM TWO */
+ ["\u2426", "\u2426"], /* SYMBOL FOR SUBSTITUTE FORM TWO */
+ ["\u2427", "\u2427"],
+ ["\u2428", "\u2428"],
+ ["\u2429", "\u2429"],
+ ["\u242A", "\u242A"],
+ ["\u242B", "\u242B"],
+ ["\u242C", "\u242C"],
+ ["\u242D", "\u242D"],
+ ["\u242E", "\u242E"],
+ ["\u242F", "\u242F"],
+ ["\u2430", "\u2430"],
+ ["\u2431", "\u2431"],
+ ["\u2432", "\u2432"],
+ ["\u2433", "\u2433"],
+ ["\u2434", "\u2434"],
+ ["\u2435", "\u2435"],
+ ["\u2436", "\u2436"],
+ ["\u2437", "\u2437"],
+ ["\u2438", "\u2438"],
+ ["\u2439", "\u2439"],
+ ["\u243A", "\u243A"],
+ ["\u243B", "\u243B"],
+ ["\u243C", "\u243C"],
+ ["\u243D", "\u243D"],
+ ["\u243E", "\u243E"],
+ ["\u243F", "\u243F"],
+ ["\u2440", "\u2440"], /* OCR HOOK */
+ ["\u2441", "\u2441"], /* OCR CHAIR */
+ ["\u2442", "\u2442"], /* OCR FORK */
+ ["\u2443", "\u2443"], /* OCR INVERTED FORK */
+ ["\u2444", "\u2444"], /* OCR BELT BUCKLE */
+ ["\u2445", "\u2445"], /* OCR BOW TIE */
+ ["\u2446", "\u2446"], /* OCR BRANCH BANK IDENTIFICATION */
+ ["\u2447", "\u2447"], /* OCR AMOUNT OF CHECK */
+ ["\u2448", "\u2448"], /* OCR DASH */
+ ["\u2449", "\u2449"], /* OCR CUSTOMER ACCOUNT NUMBER */
+ ["\u244A", "\u244A"], /* OCR DOUBLE BACKSLASH */
+ ["\u244B", "\u244B"],
+ ["\u244C", "\u244C"],
+ ["\u244D", "\u244D"],
+ ["\u244E", "\u244E"],
+ ["\u244F", "\u244F"],
+ ["\u2450", "\u2450"],
+ ["\u2451", "\u2451"],
+ ["\u2452", "\u2452"],
+ ["\u2453", "\u2453"],
+ ["\u2454", "\u2454"],
+ ["\u2455", "\u2455"],
+ ["\u2456", "\u2456"],
+ ["\u2457", "\u2457"],
+ ["\u2458", "\u2458"],
+ ["\u2459", "\u2459"],
+ ["\u245A", "\u245A"],
+ ["\u245B", "\u245B"],
+ ["\u245C", "\u245C"],
+ ["\u245D", "\u245D"],
+ ["\u245E", "\u245E"],
+ ["\u245F", "\u245F"],
+ ["\u2460", "\u2460"], /* CIRCLED DIGIT ONE */
+ ["\u2461", "\u2461"], /* CIRCLED DIGIT TWO */
+ ["\u2462", "\u2462"], /* CIRCLED DIGIT THREE */
+ ["\u2463", "\u2463"], /* CIRCLED DIGIT FOUR */
+ ["\u2464", "\u2464"], /* CIRCLED DIGIT FIVE */
+ ["\u2465", "\u2465"], /* CIRCLED DIGIT SIX */
+ ["\u2466", "\u2466"], /* CIRCLED DIGIT SEVEN */
+ ["\u2467", "\u2467"], /* CIRCLED DIGIT EIGHT */
+ ["\u2468", "\u2468"], /* CIRCLED DIGIT NINE */
+ ["\u2469", "\u2469"], /* CIRCLED NUMBER TEN */
+ ["\u246A", "\u246A"], /* CIRCLED NUMBER ELEVEN */
+ ["\u246B", "\u246B"], /* CIRCLED NUMBER TWELVE */
+ ["\u246C", "\u246C"], /* CIRCLED NUMBER THIRTEEN */
+ ["\u246D", "\u246D"], /* CIRCLED NUMBER FOURTEEN */
+ ["\u246E", "\u246E"], /* CIRCLED NUMBER FIFTEEN */
+ ["\u246F", "\u246F"], /* CIRCLED NUMBER SIXTEEN */
+ ["\u2470", "\u2470"], /* CIRCLED NUMBER SEVENTEEN */
+ ["\u2471", "\u2471"], /* CIRCLED NUMBER EIGHTEEN */
+ ["\u2472", "\u2472"], /* CIRCLED NUMBER NINETEEN */
+ ["\u2473", "\u2473"], /* CIRCLED NUMBER TWENTY */
+ ["\u2474", "\u2474"], /* PARENTHESIZED DIGIT ONE */
+ ["\u2475", "\u2475"], /* PARENTHESIZED DIGIT TWO */
+ ["\u2476", "\u2476"], /* PARENTHESIZED DIGIT THREE */
+ ["\u2477", "\u2477"], /* PARENTHESIZED DIGIT FOUR */
+ ["\u2478", "\u2478"], /* PARENTHESIZED DIGIT FIVE */
+ ["\u2479", "\u2479"], /* PARENTHESIZED DIGIT SIX */
+ ["\u247A", "\u247A"], /* PARENTHESIZED DIGIT SEVEN */
+ ["\u247B", "\u247B"], /* PARENTHESIZED DIGIT EIGHT */
+ ["\u247C", "\u247C"], /* PARENTHESIZED DIGIT NINE */
+ ["\u247D", "\u247D"], /* PARENTHESIZED NUMBER TEN */
+ ["\u247E", "\u247E"], /* PARENTHESIZED NUMBER ELEVEN */
+ ["\u247F", "\u247F"], /* PARENTHESIZED NUMBER TWELVE */
+ ["\u2480", "\u2480"], /* PARENTHESIZED NUMBER THIRTEEN */
+ ["\u2481", "\u2481"], /* PARENTHESIZED NUMBER FOURTEEN */
+ ["\u2482", "\u2482"], /* PARENTHESIZED NUMBER FIFTEEN */
+ ["\u2483", "\u2483"], /* PARENTHESIZED NUMBER SIXTEEN */
+ ["\u2484", "\u2484"], /* PARENTHESIZED NUMBER SEVENTEEN */
+ ["\u2485", "\u2485"], /* PARENTHESIZED NUMBER EIGHTEEN */
+ ["\u2486", "\u2486"], /* PARENTHESIZED NUMBER NINETEEN */
+ ["\u2487", "\u2487"], /* PARENTHESIZED NUMBER TWENTY */
+ ["\u2488", "\u2488"], /* DIGIT ONE FULL STOP (DIGIT ONE PERIOD) */
+ ["\u2489", "\u2489"], /* DIGIT TWO FULL STOP (DIGIT TWO PERIOD) */
+ ["\u248A", "\u248A"], /* DIGIT THREE FULL STOP (DIGIT THREE PERIOD) */
+ ["\u248B", "\u248B"], /* DIGIT FOUR FULL STOP (DIGIT FOUR PERIOD) */
+ ["\u248C", "\u248C"], /* DIGIT FIVE FULL STOP (DIGIT FIVE PERIOD) */
+ ["\u248D", "\u248D"], /* DIGIT SIX FULL STOP (DIGIT SIX PERIOD) */
+ ["\u248E", "\u248E"], /* DIGIT SEVEN FULL STOP (DIGIT SEVEN PERIOD) */
+ ["\u248F", "\u248F"], /* DIGIT EIGHT FULL STOP (DIGIT EIGHT PERIOD) */
+ ["\u2490", "\u2490"], /* DIGIT NINE FULL STOP (DIGIT NINE PERIOD) */
+ ["\u2491", "\u2491"], /* NUMBER TEN FULL STOP (NUMBER TEN PERIOD) */
+ ["\u2492", "\u2492"], /* NUMBER ELEVEN FULL STOP (NUMBER ELEVEN PERIOD) */
+ ["\u2493", "\u2493"], /* NUMBER TWELVE FULL STOP (NUMBER TWELVE PERIOD) */
+ ["\u2494", "\u2494"], /* NUMBER THIRTEEN FULL STOP (NUMBER THIRTEEN PERIOD) */
+ ["\u2495", "\u2495"], /* NUMBER FOURTEEN FULL STOP (NUMBER FOURTEEN PERIOD) */
+ ["\u2496", "\u2496"], /* NUMBER FIFTEEN FULL STOP (NUMBER FIFTEEN PERIOD) */
+ ["\u2497", "\u2497"], /* NUMBER SIXTEEN FULL STOP (NUMBER SIXTEEN PERIOD) */
+ ["\u2498", "\u2498"], /* NUMBER SEVENTEEN FULL STOP (NUMBER SEVENTEEN PERIOD) */
+ ["\u2499", "\u2499"], /* NUMBER EIGHTEEN FULL STOP (NUMBER EIGHTEEN PERIOD) */
+ ["\u249A", "\u249A"], /* NUMBER NINETEEN FULL STOP (NUMBER NINETEEN PERIOD) */
+ ["\u249B", "\u249B"], /* NUMBER TWENTY FULL STOP (NUMBER TWENTY PERIOD) */
+ ["\u249C", "\u249C"], /* PARENTHESIZED LATIN SMALL LETTER A */
+ ["\u249D", "\u249D"], /* PARENTHESIZED LATIN SMALL LETTER B */
+ ["\u249E", "\u249E"], /* PARENTHESIZED LATIN SMALL LETTER C */
+ ["\u249F", "\u249F"], /* PARENTHESIZED LATIN SMALL LETTER D */
+ ["\u24A0", "\u24A0"], /* PARENTHESIZED LATIN SMALL LETTER E */
+ ["\u24A1", "\u24A1"], /* PARENTHESIZED LATIN SMALL LETTER F */
+ ["\u24A2", "\u24A2"], /* PARENTHESIZED LATIN SMALL LETTER G */
+ ["\u24A3", "\u24A3"], /* PARENTHESIZED LATIN SMALL LETTER H */
+ ["\u24A4", "\u24A4"], /* PARENTHESIZED LATIN SMALL LETTER I */
+ ["\u24A5", "\u24A5"], /* PARENTHESIZED LATIN SMALL LETTER J */
+ ["\u24A6", "\u24A6"], /* PARENTHESIZED LATIN SMALL LETTER K */
+ ["\u24A7", "\u24A7"], /* PARENTHESIZED LATIN SMALL LETTER L */
+ ["\u24A8", "\u24A8"], /* PARENTHESIZED LATIN SMALL LETTER M */
+ ["\u24A9", "\u24A9"], /* PARENTHESIZED LATIN SMALL LETTER N */
+ ["\u24AA", "\u24AA"], /* PARENTHESIZED LATIN SMALL LETTER O */
+ ["\u24AB", "\u24AB"], /* PARENTHESIZED LATIN SMALL LETTER P */
+ ["\u24AC", "\u24AC"], /* PARENTHESIZED LATIN SMALL LETTER Q */
+ ["\u24AD", "\u24AD"], /* PARENTHESIZED LATIN SMALL LETTER R */
+ ["\u24AE", "\u24AE"], /* PARENTHESIZED LATIN SMALL LETTER S */
+ ["\u24AF", "\u24AF"], /* PARENTHESIZED LATIN SMALL LETTER T */
+ ["\u24B0", "\u24B0"], /* PARENTHESIZED LATIN SMALL LETTER U */
+ ["\u24B1", "\u24B1"], /* PARENTHESIZED LATIN SMALL LETTER V */
+ ["\u24B2", "\u24B2"], /* PARENTHESIZED LATIN SMALL LETTER W */
+ ["\u24B3", "\u24B3"], /* PARENTHESIZED LATIN SMALL LETTER X */
+ ["\u24B4", "\u24B4"], /* PARENTHESIZED LATIN SMALL LETTER Y */
+ ["\u24B5", "\u24B5"], /* PARENTHESIZED LATIN SMALL LETTER Z */
+ ["\u24B6", "\u24D0"], /* CIRCLED LATIN CAPITAL LETTER A */
+ ["\u24B7", "\u24D1"], /* CIRCLED LATIN CAPITAL LETTER B */
+ ["\u24B8", "\u24D2"], /* CIRCLED LATIN CAPITAL LETTER C */
+ ["\u24B9", "\u24D3"], /* CIRCLED LATIN CAPITAL LETTER D */
+ ["\u24BA", "\u24D4"], /* CIRCLED LATIN CAPITAL LETTER E */
+ ["\u24BB", "\u24D5"], /* CIRCLED LATIN CAPITAL LETTER F */
+ ["\u24BC", "\u24D6"], /* CIRCLED LATIN CAPITAL LETTER G */
+ ["\u24BD", "\u24D7"], /* CIRCLED LATIN CAPITAL LETTER H */
+ ["\u24BE", "\u24D8"], /* CIRCLED LATIN CAPITAL LETTER I */
+ ["\u24BF", "\u24D9"], /* CIRCLED LATIN CAPITAL LETTER J */
+ ["\u24C0", "\u24DA"], /* CIRCLED LATIN CAPITAL LETTER K */
+ ["\u24C1", "\u24DB"], /* CIRCLED LATIN CAPITAL LETTER L */
+ ["\u24C2", "\u24DC"], /* CIRCLED LATIN CAPITAL LETTER M */
+ ["\u24C3", "\u24DD"], /* CIRCLED LATIN CAPITAL LETTER N */
+ ["\u24C4", "\u24DE"], /* CIRCLED LATIN CAPITAL LETTER O */
+ ["\u24C5", "\u24DF"], /* CIRCLED LATIN CAPITAL LETTER P */
+ ["\u24C6", "\u24E0"], /* CIRCLED LATIN CAPITAL LETTER Q */
+ ["\u24C7", "\u24E1"], /* CIRCLED LATIN CAPITAL LETTER R */
+ ["\u24C8", "\u24E2"], /* CIRCLED LATIN CAPITAL LETTER S */
+ ["\u24C9", "\u24E3"], /* CIRCLED LATIN CAPITAL LETTER T */
+ ["\u24CA", "\u24E4"], /* CIRCLED LATIN CAPITAL LETTER U */
+ ["\u24CB", "\u24E5"], /* CIRCLED LATIN CAPITAL LETTER V */
+ ["\u24CC", "\u24E6"], /* CIRCLED LATIN CAPITAL LETTER W */
+ ["\u24CD", "\u24E7"], /* CIRCLED LATIN CAPITAL LETTER X */
+ ["\u24CE", "\u24E8"], /* CIRCLED LATIN CAPITAL LETTER Y */
+ ["\u24CF", "\u24E9"], /* CIRCLED LATIN CAPITAL LETTER Z */
+ ["\u24B6", "\u24D0"], /* CIRCLED LATIN SMALL LETTER A */
+ ["\u24B7", "\u24D1"], /* CIRCLED LATIN SMALL LETTER B */
+ ["\u24B8", "\u24D2"], /* CIRCLED LATIN SMALL LETTER C */
+ ["\u24B9", "\u24D3"], /* CIRCLED LATIN SMALL LETTER D */
+ ["\u24BA", "\u24D4"], /* CIRCLED LATIN SMALL LETTER E */
+ ["\u24BB", "\u24D5"], /* CIRCLED LATIN SMALL LETTER F */
+ ["\u24BC", "\u24D6"], /* CIRCLED LATIN SMALL LETTER G */
+ ["\u24BD", "\u24D7"], /* CIRCLED LATIN SMALL LETTER H */
+ ["\u24BE", "\u24D8"], /* CIRCLED LATIN SMALL LETTER I */
+ ["\u24BF", "\u24D9"], /* CIRCLED LATIN SMALL LETTER J */
+ ["\u24C0", "\u24DA"], /* CIRCLED LATIN SMALL LETTER K */
+ ["\u24C1", "\u24DB"], /* CIRCLED LATIN SMALL LETTER L */
+ ["\u24C2", "\u24DC"], /* CIRCLED LATIN SMALL LETTER M */
+ ["\u24C3", "\u24DD"], /* CIRCLED LATIN SMALL LETTER N */
+ ["\u24C4", "\u24DE"], /* CIRCLED LATIN SMALL LETTER O */
+ ["\u24C5", "\u24DF"], /* CIRCLED LATIN SMALL LETTER P */
+ ["\u24C6", "\u24E0"], /* CIRCLED LATIN SMALL LETTER Q */
+ ["\u24C7", "\u24E1"], /* CIRCLED LATIN SMALL LETTER R */
+ ["\u24C8", "\u24E2"], /* CIRCLED LATIN SMALL LETTER S */
+ ["\u24C9", "\u24E3"], /* CIRCLED LATIN SMALL LETTER T */
+ ["\u24CA", "\u24E4"], /* CIRCLED LATIN SMALL LETTER U */
+ ["\u24CB", "\u24E5"], /* CIRCLED LATIN SMALL LETTER V */
+ ["\u24CC", "\u24E6"], /* CIRCLED LATIN SMALL LETTER W */
+ ["\u24CD", "\u24E7"], /* CIRCLED LATIN SMALL LETTER X */
+ ["\u24CE", "\u24E8"], /* CIRCLED LATIN SMALL LETTER Y */
+ ["\u24CF", "\u24E9"], /* CIRCLED LATIN SMALL LETTER Z */
+ ["\u24EA", "\u24EA"], /* CIRCLED DIGIT ZERO */
+ ["\u24EB", "\u24EB"], /* NEGATIVE CIRCLED NUMBER ELEVEN */
+ ["\u24EC", "\u24EC"], /* NEGATIVE CIRCLED NUMBER TWELVE */
+ ["\u24ED", "\u24ED"], /* NEGATIVE CIRCLED NUMBER THIRTEEN */
+ ["\u24EE", "\u24EE"], /* NEGATIVE CIRCLED NUMBER FOURTEEN */
+ ["\u24EF", "\u24EF"], /* NEGATIVE CIRCLED NUMBER FIFTEEN */
+ ["\u24F0", "\u24F0"], /* NEGATIVE CIRCLED NUMBER SIXTEEN */
+ ["\u24F1", "\u24F1"], /* NEGATIVE CIRCLED NUMBER SEVENTEEN */
+ ["\u24F2", "\u24F2"], /* NEGATIVE CIRCLED NUMBER EIGHTEEN */
+ ["\u24F3", "\u24F3"], /* NEGATIVE CIRCLED NUMBER NINETEEN */
+ ["\u24F4", "\u24F4"], /* NEGATIVE CIRCLED NUMBER TWENTY */
+ ["\u24F5", "\u24F5"], /* DOUBLE CIRCLED DIGIT ONE */
+ ["\u24F6", "\u24F6"], /* DOUBLE CIRCLED DIGIT TWO */
+ ["\u24F7", "\u24F7"], /* DOUBLE CIRCLED DIGIT THREE */
+ ["\u24F8", "\u24F8"], /* DOUBLE CIRCLED DIGIT FOUR */
+ ["\u24F9", "\u24F9"], /* DOUBLE CIRCLED DIGIT FIVE */
+ ["\u24FA", "\u24FA"], /* DOUBLE CIRCLED DIGIT SIX */
+ ["\u24FB", "\u24FB"], /* DOUBLE CIRCLED DIGIT SEVEN */
+ ["\u24FC", "\u24FC"], /* DOUBLE CIRCLED DIGIT EIGHT */
+ ["\u24FD", "\u24FD"], /* DOUBLE CIRCLED DIGIT NINE */
+ ["\u24FE", "\u24FE"], /* DOUBLE CIRCLED NUMBER TEN */
+ ["\u24FF", "\u24FF"], /* NEGATIVE CIRCLED DIGIT ZERO */
+ ["\u2500", "\u2500"], /* BOX DRAWINGS LIGHT HORIZONTAL (FORMS LIGHT HORIZONTAL) */
+ ["\u2501", "\u2501"], /* BOX DRAWINGS HEAVY HORIZONTAL (FORMS HEAVY HORIZONTAL) */
+ ["\u2502", "\u2502"], /* BOX DRAWINGS LIGHT VERTICAL (FORMS LIGHT VERTICAL) */
+ ["\u2503", "\u2503"], /* BOX DRAWINGS HEAVY VERTICAL (FORMS HEAVY VERTICAL) */
+ ["\u2504", "\u2504"], /* BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL (FORMS LIGHT TRIPLE DASH HORIZONTAL) */
+ ["\u2505", "\u2505"], /* BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL (FORMS HEAVY TRIPLE DASH HORIZONTAL) */
+ ["\u2506", "\u2506"], /* BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL (FORMS LIGHT TRIPLE DASH VERTICAL) */
+ ["\u2507", "\u2507"], /* BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL (FORMS HEAVY TRIPLE DASH VERTICAL) */
+ ["\u2508", "\u2508"], /* BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL (FORMS LIGHT QUADRUPLE DASH HORIZONTAL) */
+ ["\u2509", "\u2509"], /* BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL (FORMS HEAVY QUADRUPLE DASH HORIZONTAL) */
+ ["\u250A", "\u250A"], /* BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL (FORMS LIGHT QUADRUPLE DASH VERTICAL) */
+ ["\u250B", "\u250B"], /* BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL (FORMS HEAVY QUADRUPLE DASH VERTICAL) */
+ ["\u250C", "\u250C"], /* BOX DRAWINGS LIGHT DOWN AND RIGHT (FORMS LIGHT DOWN AND RIGHT) */
+ ["\u250D", "\u250D"], /* BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY (FORMS DOWN LIGHT AND RIGHT HEAVY) */
+ ["\u250E", "\u250E"], /* BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT (FORMS DOWN HEAVY AND RIGHT LIGHT) */
+ ["\u250F", "\u250F"], /* BOX DRAWINGS HEAVY DOWN AND RIGHT (FORMS HEAVY DOWN AND RIGHT) */
+ ["\u2510", "\u2510"], /* BOX DRAWINGS LIGHT DOWN AND LEFT (FORMS LIGHT DOWN AND LEFT) */
+ ["\u2511", "\u2511"], /* BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY (FORMS DOWN LIGHT AND LEFT HEAVY) */
+ ["\u2512", "\u2512"], /* BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT (FORMS DOWN HEAVY AND LEFT LIGHT) */
+ ["\u2513", "\u2513"], /* BOX DRAWINGS HEAVY DOWN AND LEFT (FORMS HEAVY DOWN AND LEFT) */
+ ["\u2514", "\u2514"], /* BOX DRAWINGS LIGHT UP AND RIGHT (FORMS LIGHT UP AND RIGHT) */
+ ["\u2515", "\u2515"], /* BOX DRAWINGS UP LIGHT AND RIGHT HEAVY (FORMS UP LIGHT AND RIGHT HEAVY) */
+ ["\u2516", "\u2516"], /* BOX DRAWINGS UP HEAVY AND RIGHT LIGHT (FORMS UP HEAVY AND RIGHT LIGHT) */
+ ["\u2517", "\u2517"], /* BOX DRAWINGS HEAVY UP AND RIGHT (FORMS HEAVY UP AND RIGHT) */
+ ["\u2518", "\u2518"], /* BOX DRAWINGS LIGHT UP AND LEFT (FORMS LIGHT UP AND LEFT) */
+ ["\u2519", "\u2519"], /* BOX DRAWINGS UP LIGHT AND LEFT HEAVY (FORMS UP LIGHT AND LEFT HEAVY) */
+ ["\u251A", "\u251A"], /* BOX DRAWINGS UP HEAVY AND LEFT LIGHT (FORMS UP HEAVY AND LEFT LIGHT) */
+ ["\u251B", "\u251B"], /* BOX DRAWINGS HEAVY UP AND LEFT (FORMS HEAVY UP AND LEFT) */
+ ["\u251C", "\u251C"], /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT (FORMS LIGHT VERTICAL AND RIGHT) */
+ ["\u251D", "\u251D"], /* BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY (FORMS VERTICAL LIGHT AND RIGHT HEAVY) */
+ ["\u251E", "\u251E"], /* BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT (FORMS UP HEAVY AND RIGHT DOWN LIGHT) */
+ ["\u251F", "\u251F"], /* BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT (FORMS DOWN HEAVY AND RIGHT UP LIGHT) */
+ ["\u2520", "\u2520"], /* BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT (FORMS VERTICAL HEAVY AND RIGHT LIGHT) */
+ ["\u2521", "\u2521"], /* BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY (FORMS DOWN LIGHT AND RIGHT UP HEAVY) */
+ ["\u2522", "\u2522"], /* BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY (FORMS UP LIGHT AND RIGHT DOWN HEAVY) */
+ ["\u2523", "\u2523"], /* BOX DRAWINGS HEAVY VERTICAL AND RIGHT (FORMS HEAVY VERTICAL AND RIGHT) */
+ ["\u2524", "\u2524"], /* BOX DRAWINGS LIGHT VERTICAL AND LEFT (FORMS LIGHT VERTICAL AND LEFT) */
+ ["\u2525", "\u2525"], /* BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY (FORMS VERTICAL LIGHT AND LEFT HEAVY) */
+ ["\u2526", "\u2526"], /* BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT (FORMS UP HEAVY AND LEFT DOWN LIGHT) */
+ ["\u2527", "\u2527"], /* BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT (FORMS DOWN HEAVY AND LEFT UP LIGHT) */
+ ["\u2528", "\u2528"], /* BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT (FORMS VERTICAL HEAVY AND LEFT LIGHT) */
+ ["\u2529", "\u2529"], /* BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY (FORMS DOWN LIGHT AND LEFT UP HEAVY) */
+ ["\u252A", "\u252A"], /* BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY (FORMS UP LIGHT AND LEFT DOWN HEAVY) */
+ ["\u252B", "\u252B"], /* BOX DRAWINGS HEAVY VERTICAL AND LEFT (FORMS HEAVY VERTICAL AND LEFT) */
+ ["\u252C", "\u252C"], /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL (FORMS LIGHT DOWN AND HORIZONTAL) */
+ ["\u252D", "\u252D"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT (FORMS LEFT HEAVY AND RIGHT DOWN LIGHT) */
+ ["\u252E", "\u252E"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT (FORMS RIGHT HEAVY AND LEFT DOWN LIGHT) */
+ ["\u252F", "\u252F"], /* BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY (FORMS DOWN LIGHT AND HORIZONTAL HEAVY) */
+ ["\u2530", "\u2530"], /* BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT (FORMS DOWN HEAVY AND HORIZONTAL LIGHT) */
+ ["\u2531", "\u2531"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY (FORMS RIGHT LIGHT AND LEFT DOWN HEAVY) */
+ ["\u2532", "\u2532"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY (FORMS LEFT LIGHT AND RIGHT DOWN HEAVY) */
+ ["\u2533", "\u2533"], /* BOX DRAWINGS HEAVY DOWN AND HORIZONTAL (FORMS HEAVY DOWN AND HORIZONTAL) */
+ ["\u2534", "\u2534"], /* BOX DRAWINGS LIGHT UP AND HORIZONTAL (FORMS LIGHT UP AND HORIZONTAL) */
+ ["\u2535", "\u2535"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT (FORMS LEFT HEAVY AND RIGHT UP LIGHT) */
+ ["\u2536", "\u2536"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT (FORMS RIGHT HEAVY AND LEFT UP LIGHT) */
+ ["\u2537", "\u2537"], /* BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY (FORMS UP LIGHT AND HORIZONTAL HEAVY) */
+ ["\u2538", "\u2538"], /* BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT (FORMS UP HEAVY AND HORIZONTAL LIGHT) */
+ ["\u2539", "\u2539"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY (FORMS RIGHT LIGHT AND LEFT UP HEAVY) */
+ ["\u253A", "\u253A"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY (FORMS LEFT LIGHT AND RIGHT UP HEAVY) */
+ ["\u253B", "\u253B"], /* BOX DRAWINGS HEAVY UP AND HORIZONTAL (FORMS HEAVY UP AND HORIZONTAL) */
+ ["\u253C", "\u253C"], /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL (FORMS LIGHT VERTICAL AND HORIZONTAL) */
+ ["\u253D", "\u253D"], /* BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT (FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT) */
+ ["\u253E", "\u253E"], /* BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT (FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT) */
+ ["\u253F", "\u253F"], /* BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY (FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY) */
+ ["\u2540", "\u2540"], /* BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT (FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT) */
+ ["\u2541", "\u2541"], /* BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT (FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT) */
+ ["\u2542", "\u2542"], /* BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT (FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT) */
+ ["\u2543", "\u2543"], /* BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT (FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT) */
+ ["\u2544", "\u2544"], /* BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT (FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT) */
+ ["\u2545", "\u2545"], /* BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT (FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT) */
+ ["\u2546", "\u2546"], /* BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT (FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT) */
+ ["\u2547", "\u2547"], /* BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY (FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY) */
+ ["\u2548", "\u2548"], /* BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY (FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY) */
+ ["\u2549", "\u2549"], /* BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY (FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY) */
+ ["\u254A", "\u254A"], /* BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY (FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY) */
+ ["\u254B", "\u254B"], /* BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL (FORMS HEAVY VERTICAL AND HORIZONTAL) */
+ ["\u254C", "\u254C"], /* BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL (FORMS LIGHT DOUBLE DASH HORIZONTAL) */
+ ["\u254D", "\u254D"], /* BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL (FORMS HEAVY DOUBLE DASH HORIZONTAL) */
+ ["\u254E", "\u254E"], /* BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL (FORMS LIGHT DOUBLE DASH VERTICAL) */
+ ["\u254F", "\u254F"], /* BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL (FORMS HEAVY DOUBLE DASH VERTICAL) */
+ ["\u2550", "\u2550"], /* BOX DRAWINGS DOUBLE HORIZONTAL (FORMS DOUBLE HORIZONTAL) */
+ ["\u2551", "\u2551"], /* BOX DRAWINGS DOUBLE VERTICAL (FORMS DOUBLE VERTICAL) */
+ ["\u2552", "\u2552"], /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE (FORMS DOWN SINGLE AND RIGHT DOUBLE) */
+ ["\u2553", "\u2553"], /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE (FORMS DOWN DOUBLE AND RIGHT SINGLE) */
+ ["\u2554", "\u2554"], /* BOX DRAWINGS DOUBLE DOWN AND RIGHT (FORMS DOUBLE DOWN AND RIGHT) */
+ ["\u2555", "\u2555"], /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE (FORMS DOWN SINGLE AND LEFT DOUBLE) */
+ ["\u2556", "\u2556"], /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE (FORMS DOWN DOUBLE AND LEFT SINGLE) */
+ ["\u2557", "\u2557"], /* BOX DRAWINGS DOUBLE DOWN AND LEFT (FORMS DOUBLE DOWN AND LEFT) */
+ ["\u2558", "\u2558"], /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE (FORMS UP SINGLE AND RIGHT DOUBLE) */
+ ["\u2559", "\u2559"], /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE (FORMS UP DOUBLE AND RIGHT SINGLE) */
+ ["\u255A", "\u255A"], /* BOX DRAWINGS DOUBLE UP AND RIGHT (FORMS DOUBLE UP AND RIGHT) */
+ ["\u255B", "\u255B"], /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE (FORMS UP SINGLE AND LEFT DOUBLE) */
+ ["\u255C", "\u255C"], /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE (FORMS UP DOUBLE AND LEFT SINGLE) */
+ ["\u255D", "\u255D"], /* BOX DRAWINGS DOUBLE UP AND LEFT (FORMS DOUBLE UP AND LEFT) */
+ ["\u255E", "\u255E"], /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE (FORMS VERTICAL SINGLE AND RIGHT DOUBLE) */
+ ["\u255F", "\u255F"], /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE (FORMS VERTICAL DOUBLE AND RIGHT SINGLE) */
+ ["\u2560", "\u2560"], /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT (FORMS DOUBLE VERTICAL AND RIGHT) */
+ ["\u2561", "\u2561"], /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE (FORMS VERTICAL SINGLE AND LEFT DOUBLE) */
+ ["\u2562", "\u2562"], /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE (FORMS VERTICAL DOUBLE AND LEFT SINGLE) */
+ ["\u2563", "\u2563"], /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT (FORMS DOUBLE VERTICAL AND LEFT) */
+ ["\u2564", "\u2564"], /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE (FORMS DOWN SINGLE AND HORIZONTAL DOUBLE) */
+ ["\u2565", "\u2565"], /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE (FORMS DOWN DOUBLE AND HORIZONTAL SINGLE) */
+ ["\u2566", "\u2566"], /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL (FORMS DOUBLE DOWN AND HORIZONTAL) */
+ ["\u2567", "\u2567"], /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE (FORMS UP SINGLE AND HORIZONTAL DOUBLE) */
+ ["\u2568", "\u2568"], /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE (FORMS UP DOUBLE AND HORIZONTAL SINGLE) */
+ ["\u2569", "\u2569"], /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL (FORMS DOUBLE UP AND HORIZONTAL) */
+ ["\u256A", "\u256A"], /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE (FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE) */
+ ["\u256B", "\u256B"], /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE (FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE) */
+ ["\u256C", "\u256C"], /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL (FORMS DOUBLE VERTICAL AND HORIZONTAL) */
+ ["\u256D", "\u256D"], /* BOX DRAWINGS LIGHT ARC DOWN AND RIGHT (FORMS LIGHT ARC DOWN AND RIGHT) */
+ ["\u256E", "\u256E"], /* BOX DRAWINGS LIGHT ARC DOWN AND LEFT (FORMS LIGHT ARC DOWN AND LEFT) */
+ ["\u256F", "\u256F"], /* BOX DRAWINGS LIGHT ARC UP AND LEFT (FORMS LIGHT ARC UP AND LEFT) */
+ ["\u2570", "\u2570"], /* BOX DRAWINGS LIGHT ARC UP AND RIGHT (FORMS LIGHT ARC UP AND RIGHT) */
+ ["\u2571", "\u2571"], /* BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT (FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT) */
+ ["\u2572", "\u2572"], /* BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT (FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT) */
+ ["\u2573", "\u2573"], /* BOX DRAWINGS LIGHT DIAGONAL CROSS (FORMS LIGHT DIAGONAL CROSS) */
+ ["\u2574", "\u2574"], /* BOX DRAWINGS LIGHT LEFT (FORMS LIGHT LEFT) */
+ ["\u2575", "\u2575"], /* BOX DRAWINGS LIGHT UP (FORMS LIGHT UP) */
+ ["\u2576", "\u2576"], /* BOX DRAWINGS LIGHT RIGHT (FORMS LIGHT RIGHT) */
+ ["\u2577", "\u2577"], /* BOX DRAWINGS LIGHT DOWN (FORMS LIGHT DOWN) */
+ ["\u2578", "\u2578"], /* BOX DRAWINGS HEAVY LEFT (FORMS HEAVY LEFT) */
+ ["\u2579", "\u2579"], /* BOX DRAWINGS HEAVY UP (FORMS HEAVY UP) */
+ ["\u257A", "\u257A"], /* BOX DRAWINGS HEAVY RIGHT (FORMS HEAVY RIGHT) */
+ ["\u257B", "\u257B"], /* BOX DRAWINGS HEAVY DOWN (FORMS HEAVY DOWN) */
+ ["\u257C", "\u257C"], /* BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT (FORMS LIGHT LEFT AND HEAVY RIGHT) */
+ ["\u257D", "\u257D"], /* BOX DRAWINGS LIGHT UP AND HEAVY DOWN (FORMS LIGHT UP AND HEAVY DOWN) */
+ ["\u257E", "\u257E"], /* BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT (FORMS HEAVY LEFT AND LIGHT RIGHT) */
+ ["\u257F", "\u257F"], /* BOX DRAWINGS HEAVY UP AND LIGHT DOWN (FORMS HEAVY UP AND LIGHT DOWN) */
+ ["\u2580", "\u2580"], /* UPPER HALF BLOCK */
+ ["\u2581", "\u2581"], /* LOWER ONE EIGHTH BLOCK */
+ ["\u2582", "\u2582"], /* LOWER ONE QUARTER BLOCK */
+ ["\u2583", "\u2583"], /* LOWER THREE EIGHTHS BLOCK */
+ ["\u2584", "\u2584"], /* LOWER HALF BLOCK */
+ ["\u2585", "\u2585"], /* LOWER FIVE EIGHTHS BLOCK */
+ ["\u2586", "\u2586"], /* LOWER THREE QUARTERS BLOCK (LOWER THREE QUARTER BLOCK) */
+ ["\u2587", "\u2587"], /* LOWER SEVEN EIGHTHS BLOCK */
+ ["\u2588", "\u2588"], /* FULL BLOCK */
+ ["\u2589", "\u2589"], /* LEFT SEVEN EIGHTHS BLOCK */
+ ["\u258A", "\u258A"], /* LEFT THREE QUARTERS BLOCK (LEFT THREE QUARTER BLOCK) */
+ ["\u258B", "\u258B"], /* LEFT FIVE EIGHTHS BLOCK */
+ ["\u258C", "\u258C"], /* LEFT HALF BLOCK */
+ ["\u258D", "\u258D"], /* LEFT THREE EIGHTHS BLOCK */
+ ["\u258E", "\u258E"], /* LEFT ONE QUARTER BLOCK */
+ ["\u258F", "\u258F"], /* LEFT ONE EIGHTH BLOCK */
+ ["\u2590", "\u2590"], /* RIGHT HALF BLOCK */
+ ["\u2591", "\u2591"], /* LIGHT SHADE */
+ ["\u2592", "\u2592"], /* MEDIUM SHADE */
+ ["\u2593", "\u2593"], /* DARK SHADE */
+ ["\u2594", "\u2594"], /* UPPER ONE EIGHTH BLOCK */
+ ["\u2595", "\u2595"], /* RIGHT ONE EIGHTH BLOCK */
+ ["\u2596", "\u2596"], /* QUADRANT LOWER LEFT */
+ ["\u2597", "\u2597"], /* QUADRANT LOWER RIGHT */
+ ["\u2598", "\u2598"], /* QUADRANT UPPER LEFT */
+ ["\u2599", "\u2599"], /* QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT */
+ ["\u259A", "\u259A"], /* QUADRANT UPPER LEFT AND LOWER RIGHT */
+ ["\u259B", "\u259B"], /* QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT */
+ ["\u259C", "\u259C"], /* QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT */
+ ["\u259D", "\u259D"], /* QUADRANT UPPER RIGHT */
+ ["\u259E", "\u259E"], /* QUADRANT UPPER RIGHT AND LOWER LEFT */
+ ["\u259F", "\u259F"], /* QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT */
+ ["\u25A0", "\u25A0"], /* BLACK SQUARE */
+ ["\u25A1", "\u25A1"], /* WHITE SQUARE */
+ ["\u25A2", "\u25A2"], /* WHITE SQUARE WITH ROUNDED CORNERS */
+ ["\u25A3", "\u25A3"], /* WHITE SQUARE CONTAINING BLACK SMALL SQUARE */
+ ["\u25A4", "\u25A4"], /* SQUARE WITH HORIZONTAL FILL */
+ ["\u25A5", "\u25A5"], /* SQUARE WITH VERTICAL FILL */
+ ["\u25A6", "\u25A6"], /* SQUARE WITH ORTHOGONAL CROSSHATCH FILL */
+ ["\u25A7", "\u25A7"], /* SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL */
+ ["\u25A8", "\u25A8"], /* SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL */
+ ["\u25A9", "\u25A9"], /* SQUARE WITH DIAGONAL CROSSHATCH FILL */
+ ["\u25AA", "\u25AA"], /* BLACK SMALL SQUARE */
+ ["\u25AB", "\u25AB"], /* WHITE SMALL SQUARE */
+ ["\u25AC", "\u25AC"], /* BLACK RECTANGLE */
+ ["\u25AD", "\u25AD"], /* WHITE RECTANGLE */
+ ["\u25AE", "\u25AE"], /* BLACK VERTICAL RECTANGLE */
+ ["\u25AF", "\u25AF"], /* WHITE VERTICAL RECTANGLE */
+ ["\u25B0", "\u25B0"], /* BLACK PARALLELOGRAM */
+ ["\u25B1", "\u25B1"], /* WHITE PARALLELOGRAM */
+ ["\u25B2", "\u25B2"], /* BLACK UP-POINTING TRIANGLE (BLACK UP POINTING TRIANGLE) */
+ ["\u25B3", "\u25B3"], /* WHITE UP-POINTING TRIANGLE (WHITE UP POINTING TRIANGLE) */
+ ["\u25B4", "\u25B4"], /* BLACK UP-POINTING SMALL TRIANGLE (BLACK UP POINTING SMALL TRIANGLE) */
+ ["\u25B5", "\u25B5"], /* WHITE UP-POINTING SMALL TRIANGLE (WHITE UP POINTING SMALL TRIANGLE) */
+ ["\u25B6", "\u25B6"], /* BLACK RIGHT-POINTING TRIANGLE (BLACK RIGHT POINTING TRIANGLE) */
+ ["\u25B7", "\u25B7"], /* WHITE RIGHT-POINTING TRIANGLE (WHITE RIGHT POINTING TRIANGLE) */
+ ["\u25B8", "\u25B8"], /* BLACK RIGHT-POINTING SMALL TRIANGLE (BLACK RIGHT POINTING SMALL TRIANGLE) */
+ ["\u25B9", "\u25B9"], /* WHITE RIGHT-POINTING SMALL TRIANGLE (WHITE RIGHT POINTING SMALL TRIANGLE) */
+ ["\u25BA", "\u25BA"], /* BLACK RIGHT-POINTING POINTER (BLACK RIGHT POINTING POINTER) */
+ ["\u25BB", "\u25BB"], /* WHITE RIGHT-POINTING POINTER (WHITE RIGHT POINTING POINTER) */
+ ["\u25BC", "\u25BC"], /* BLACK DOWN-POINTING TRIANGLE (BLACK DOWN POINTING TRIANGLE) */
+ ["\u25BD", "\u25BD"], /* WHITE DOWN-POINTING TRIANGLE (WHITE DOWN POINTING TRIANGLE) */
+ ["\u25BE", "\u25BE"], /* BLACK DOWN-POINTING SMALL TRIANGLE (BLACK DOWN POINTING SMALL TRIANGLE) */
+ ["\u25BF", "\u25BF"], /* WHITE DOWN-POINTING SMALL TRIANGLE (WHITE DOWN POINTING SMALL TRIANGLE) */
+ ["\u25C0", "\u25C0"], /* BLACK LEFT-POINTING TRIANGLE (BLACK LEFT POINTING TRIANGLE) */
+ ["\u25C1", "\u25C1"], /* WHITE LEFT-POINTING TRIANGLE (WHITE LEFT POINTING TRIANGLE) */
+ ["\u25C2", "\u25C2"], /* BLACK LEFT-POINTING SMALL TRIANGLE (BLACK LEFT POINTING SMALL TRIANGLE) */
+ ["\u25C3", "\u25C3"], /* WHITE LEFT-POINTING SMALL TRIANGLE (WHITE LEFT POINTING SMALL TRIANGLE) */
+ ["\u25C4", "\u25C4"], /* BLACK LEFT-POINTING POINTER (BLACK LEFT POINTING POINTER) */
+ ["\u25C5", "\u25C5"], /* WHITE LEFT-POINTING POINTER (WHITE LEFT POINTING POINTER) */
+ ["\u25C6", "\u25C6"], /* BLACK DIAMOND */
+ ["\u25C7", "\u25C7"], /* WHITE DIAMOND */
+ ["\u25C8", "\u25C8"], /* WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND */
+ ["\u25C9", "\u25C9"], /* FISHEYE */
+ ["\u25CA", "\u25CA"], /* LOZENGE */
+ ["\u25CB", "\u25CB"], /* WHITE CIRCLE */
+ ["\u25CC", "\u25CC"], /* DOTTED CIRCLE */
+ ["\u25CD", "\u25CD"], /* CIRCLE WITH VERTICAL FILL */
+ ["\u25CE", "\u25CE"], /* BULLSEYE */
+ ["\u25CF", "\u25CF"], /* BLACK CIRCLE */
+ ["\u25D0", "\u25D0"], /* CIRCLE WITH LEFT HALF BLACK */
+ ["\u25D1", "\u25D1"], /* CIRCLE WITH RIGHT HALF BLACK */
+ ["\u25D2", "\u25D2"], /* CIRCLE WITH LOWER HALF BLACK */
+ ["\u25D3", "\u25D3"], /* CIRCLE WITH UPPER HALF BLACK */
+ ["\u25D4", "\u25D4"], /* CIRCLE WITH UPPER RIGHT QUADRANT BLACK */
+ ["\u25D5", "\u25D5"], /* CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK */
+ ["\u25D6", "\u25D6"], /* LEFT HALF BLACK CIRCLE */
+ ["\u25D7", "\u25D7"], /* RIGHT HALF BLACK CIRCLE */
+ ["\u25D8", "\u25D8"], /* INVERSE BULLET */
+ ["\u25D9", "\u25D9"], /* INVERSE WHITE CIRCLE */
+ ["\u25DA", "\u25DA"], /* UPPER HALF INVERSE WHITE CIRCLE */
+ ["\u25DB", "\u25DB"], /* LOWER HALF INVERSE WHITE CIRCLE */
+ ["\u25DC", "\u25DC"], /* UPPER LEFT QUADRANT CIRCULAR ARC */
+ ["\u25DD", "\u25DD"], /* UPPER RIGHT QUADRANT CIRCULAR ARC */
+ ["\u25DE", "\u25DE"], /* LOWER RIGHT QUADRANT CIRCULAR ARC */
+ ["\u25DF", "\u25DF"], /* LOWER LEFT QUADRANT CIRCULAR ARC */
+ ["\u25E0", "\u25E0"], /* UPPER HALF CIRCLE */
+ ["\u25E1", "\u25E1"], /* LOWER HALF CIRCLE */
+ ["\u25E2", "\u25E2"], /* BLACK LOWER RIGHT TRIANGLE */
+ ["\u25E3", "\u25E3"], /* BLACK LOWER LEFT TRIANGLE */
+ ["\u25E4", "\u25E4"], /* BLACK UPPER LEFT TRIANGLE */
+ ["\u25E5", "\u25E5"], /* BLACK UPPER RIGHT TRIANGLE */
+ ["\u25E6", "\u25E6"], /* WHITE BULLET */
+ ["\u25E7", "\u25E7"], /* SQUARE WITH LEFT HALF BLACK */
+ ["\u25E8", "\u25E8"], /* SQUARE WITH RIGHT HALF BLACK */
+ ["\u25E9", "\u25E9"], /* SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK */
+ ["\u25EA", "\u25EA"], /* SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK */
+ ["\u25EB", "\u25EB"], /* WHITE SQUARE WITH VERTICAL BISECTING LINE */
+ ["\u25EC", "\u25EC"], /* WHITE UP-POINTING TRIANGLE WITH DOT (WHITE UP POINTING TRIANGLE WITH DOT) */
+ ["\u25ED", "\u25ED"], /* UP-POINTING TRIANGLE WITH LEFT HALF BLACK (UP POINTING TRIANGLE WITH LEFT HALF BLACK) */
+ ["\u25EE", "\u25EE"], /* UP-POINTING TRIANGLE WITH RIGHT HALF BLACK (UP POINTING TRIANGLE WITH RIGHT HALF BLACK) */
+ ["\u25EF", "\u25EF"], /* LARGE CIRCLE */
+ ["\u25F0", "\u25F0"], /* WHITE SQUARE WITH UPPER LEFT QUADRANT */
+ ["\u25F1", "\u25F1"], /* WHITE SQUARE WITH LOWER LEFT QUADRANT */
+ ["\u25F2", "\u25F2"], /* WHITE SQUARE WITH LOWER RIGHT QUADRANT */
+ ["\u25F3", "\u25F3"], /* WHITE SQUARE WITH UPPER RIGHT QUADRANT */
+ ["\u25F4", "\u25F4"], /* WHITE CIRCLE WITH UPPER LEFT QUADRANT */
+ ["\u25F5", "\u25F5"], /* WHITE CIRCLE WITH LOWER LEFT QUADRANT */
+ ["\u25F6", "\u25F6"], /* WHITE CIRCLE WITH LOWER RIGHT QUADRANT */
+ ["\u25F7", "\u25F7"], /* WHITE CIRCLE WITH UPPER RIGHT QUADRANT */
+ ["\u25F8", "\u25F8"], /* UPPER LEFT TRIANGLE */
+ ["\u25F9", "\u25F9"], /* UPPER RIGHT TRIANGLE */
+ ["\u25FA", "\u25FA"], /* LOWER LEFT TRIANGLE */
+ ["\u25FB", "\u25FB"], /* WHITE MEDIUM SQUARE */
+ ["\u25FC", "\u25FC"], /* BLACK MEDIUM SQUARE */
+ ["\u25FD", "\u25FD"], /* WHITE MEDIUM SMALL SQUARE */
+ ["\u25FE", "\u25FE"], /* BLACK MEDIUM SMALL SQUARE */
+ ["\u25FF", "\u25FF"], /* LOWER RIGHT TRIANGLE */
+ ["\u2600", "\u2600"], /* BLACK SUN WITH RAYS */
+ ["\u2601", "\u2601"], /* CLOUD */
+ ["\u2602", "\u2602"], /* UMBRELLA */
+ ["\u2603", "\u2603"], /* SNOWMAN */
+ ["\u2604", "\u2604"], /* COMET */
+ ["\u2605", "\u2605"], /* BLACK STAR */
+ ["\u2606", "\u2606"], /* WHITE STAR */
+ ["\u2607", "\u2607"], /* LIGHTNING */
+ ["\u2608", "\u2608"], /* THUNDERSTORM */
+ ["\u2609", "\u2609"], /* SUN */
+ ["\u260A", "\u260A"], /* ASCENDING NODE */
+ ["\u260B", "\u260B"], /* DESCENDING NODE */
+ ["\u260C", "\u260C"], /* CONJUNCTION */
+ ["\u260D", "\u260D"], /* OPPOSITION */
+ ["\u260E", "\u260E"], /* BLACK TELEPHONE */
+ ["\u260F", "\u260F"], /* WHITE TELEPHONE */
+ ["\u2610", "\u2610"], /* BALLOT BOX */
+ ["\u2611", "\u2611"], /* BALLOT BOX WITH CHECK */
+ ["\u2612", "\u2612"], /* BALLOT BOX WITH X */
+ ["\u2613", "\u2613"], /* SALTIRE */
+ ["\u2614", "\u2614"], /* UMBRELLA WITH RAIN DROPS */
+ ["\u2615", "\u2615"], /* HOT BEVERAGE */
+ ["\u2616", "\u2616"], /* WHITE SHOGI PIECE */
+ ["\u2617", "\u2617"], /* BLACK SHOGI PIECE */
+ ["\u2618", "\u2618"], /* SHAMROCK */
+ ["\u2619", "\u2619"], /* REVERSED ROTATED FLORAL HEART BULLET */
+ ["\u261A", "\u261A"], /* BLACK LEFT POINTING INDEX */
+ ["\u261B", "\u261B"], /* BLACK RIGHT POINTING INDEX */
+ ["\u261C", "\u261C"], /* WHITE LEFT POINTING INDEX */
+ ["\u261D", "\u261D"], /* WHITE UP POINTING INDEX */
+ ["\u261E", "\u261E"], /* WHITE RIGHT POINTING INDEX */
+ ["\u261F", "\u261F"], /* WHITE DOWN POINTING INDEX */
+ ["\u2620", "\u2620"], /* SKULL AND CROSSBONES */
+ ["\u2621", "\u2621"], /* CAUTION SIGN */
+ ["\u2622", "\u2622"], /* RADIOACTIVE SIGN */
+ ["\u2623", "\u2623"], /* BIOHAZARD SIGN */
+ ["\u2624", "\u2624"], /* CADUCEUS */
+ ["\u2625", "\u2625"], /* ANKH */
+ ["\u2626", "\u2626"], /* ORTHODOX CROSS */
+ ["\u2627", "\u2627"], /* CHI RHO */
+ ["\u2628", "\u2628"], /* CROSS OF LORRAINE */
+ ["\u2629", "\u2629"], /* CROSS OF JERUSALEM */
+ ["\u262A", "\u262A"], /* STAR AND CRESCENT */
+ ["\u262B", "\u262B"], /* FARSI SYMBOL (SYMBOL OF IRAN) */
+ ["\u262C", "\u262C"], /* ADI SHAKTI */
+ ["\u262D", "\u262D"], /* HAMMER AND SICKLE */
+ ["\u262E", "\u262E"], /* PEACE SYMBOL */
+ ["\u262F", "\u262F"], /* YIN YANG */
+ ["\u2630", "\u2630"], /* TRIGRAM FOR HEAVEN */
+ ["\u2631", "\u2631"], /* TRIGRAM FOR LAKE */
+ ["\u2632", "\u2632"], /* TRIGRAM FOR FIRE */
+ ["\u2633", "\u2633"], /* TRIGRAM FOR THUNDER */
+ ["\u2634", "\u2634"], /* TRIGRAM FOR WIND */
+ ["\u2635", "\u2635"], /* TRIGRAM FOR WATER */
+ ["\u2636", "\u2636"], /* TRIGRAM FOR MOUNTAIN */
+ ["\u2637", "\u2637"], /* TRIGRAM FOR EARTH */
+ ["\u2638", "\u2638"], /* WHEEL OF DHARMA */
+ ["\u2639", "\u2639"], /* WHITE FROWNING FACE */
+ ["\u263A", "\u263A"], /* WHITE SMILING FACE */
+ ["\u263B", "\u263B"], /* BLACK SMILING FACE */
+ ["\u263C", "\u263C"], /* WHITE SUN WITH RAYS */
+ ["\u263D", "\u263D"], /* FIRST QUARTER MOON */
+ ["\u263E", "\u263E"], /* LAST QUARTER MOON */
+ ["\u263F", "\u263F"], /* MERCURY */
+ ["\u2640", "\u2640"], /* FEMALE SIGN */
+ ["\u2641", "\u2641"], /* EARTH */
+ ["\u2642", "\u2642"], /* MALE SIGN */
+ ["\u2643", "\u2643"], /* JUPITER */
+ ["\u2644", "\u2644"], /* SATURN */
+ ["\u2645", "\u2645"], /* URANUS */
+ ["\u2646", "\u2646"], /* NEPTUNE */
+ ["\u2647", "\u2647"], /* PLUTO */
+ ["\u2648", "\u2648"], /* ARIES */
+ ["\u2649", "\u2649"], /* TAURUS */
+ ["\u264A", "\u264A"], /* GEMINI */
+ ["\u264B", "\u264B"], /* CANCER */
+ ["\u264C", "\u264C"], /* LEO */
+ ["\u264D", "\u264D"], /* VIRGO */
+ ["\u264E", "\u264E"], /* LIBRA */
+ ["\u264F", "\u264F"], /* SCORPIUS */
+ ["\u2650", "\u2650"], /* SAGITTARIUS */
+ ["\u2651", "\u2651"], /* CAPRICORN */
+ ["\u2652", "\u2652"], /* AQUARIUS */
+ ["\u2653", "\u2653"], /* PISCES */
+ ["\u2654", "\u2654"], /* WHITE CHESS KING */
+ ["\u2655", "\u2655"], /* WHITE CHESS QUEEN */
+ ["\u2656", "\u2656"], /* WHITE CHESS ROOK */
+ ["\u2657", "\u2657"], /* WHITE CHESS BISHOP */
+ ["\u2658", "\u2658"], /* WHITE CHESS KNIGHT */
+ ["\u2659", "\u2659"], /* WHITE CHESS PAWN */
+ ["\u265A", "\u265A"], /* BLACK CHESS KING */
+ ["\u265B", "\u265B"], /* BLACK CHESS QUEEN */
+ ["\u265C", "\u265C"], /* BLACK CHESS ROOK */
+ ["\u265D", "\u265D"], /* BLACK CHESS BISHOP */
+ ["\u265E", "\u265E"], /* BLACK CHESS KNIGHT */
+ ["\u265F", "\u265F"], /* BLACK CHESS PAWN */
+ ["\u2660", "\u2660"], /* BLACK SPADE SUIT */
+ ["\u2661", "\u2661"], /* WHITE HEART SUIT */
+ ["\u2662", "\u2662"], /* WHITE DIAMOND SUIT */
+ ["\u2663", "\u2663"], /* BLACK CLUB SUIT */
+ ["\u2664", "\u2664"], /* WHITE SPADE SUIT */
+ ["\u2665", "\u2665"], /* BLACK HEART SUIT */
+ ["\u2666", "\u2666"], /* BLACK DIAMOND SUIT */
+ ["\u2667", "\u2667"], /* WHITE CLUB SUIT */
+ ["\u2668", "\u2668"], /* HOT SPRINGS */
+ ["\u2669", "\u2669"], /* QUARTER NOTE */
+ ["\u266A", "\u266A"], /* EIGHTH NOTE */
+ ["\u266B", "\u266B"], /* BEAMED EIGHTH NOTES (BARRED EIGHTH NOTES) */
+ ["\u266C", "\u266C"], /* BEAMED SIXTEENTH NOTES (BARRED SIXTEENTH NOTES) */
+ ["\u266D", "\u266D"], /* MUSIC FLAT SIGN (FLAT) */
+ ["\u266E", "\u266E"], /* MUSIC NATURAL SIGN (NATURAL) */
+ ["\u266F", "\u266F"], /* MUSIC SHARP SIGN (SHARP) */
+ ["\u2670", "\u2670"], /* WEST SYRIAC CROSS */
+ ["\u2671", "\u2671"], /* EAST SYRIAC CROSS */
+ ["\u2672", "\u2672"], /* UNIVERSAL RECYCLING SYMBOL */
+ ["\u2673", "\u2673"], /* RECYCLING SYMBOL FOR TYPE-1 PLASTICS */
+ ["\u2674", "\u2674"], /* RECYCLING SYMBOL FOR TYPE-2 PLASTICS */
+ ["\u2675", "\u2675"], /* RECYCLING SYMBOL FOR TYPE-3 PLASTICS */
+ ["\u2676", "\u2676"], /* RECYCLING SYMBOL FOR TYPE-4 PLASTICS */
+ ["\u2677", "\u2677"], /* RECYCLING SYMBOL FOR TYPE-5 PLASTICS */
+ ["\u2678", "\u2678"], /* RECYCLING SYMBOL FOR TYPE-6 PLASTICS */
+ ["\u2679", "\u2679"], /* RECYCLING SYMBOL FOR TYPE-7 PLASTICS */
+ ["\u267A", "\u267A"], /* RECYCLING SYMBOL FOR GENERIC MATERIALS */
+ ["\u267B", "\u267B"], /* BLACK UNIVERSAL RECYCLING SYMBOL */
+ ["\u267C", "\u267C"], /* RECYCLED PAPER SYMBOL */
+ ["\u267D", "\u267D"], /* PARTIALLY-RECYCLED PAPER SYMBOL */
+ ["\u267E", "\u267E"], /* PERMANENT PAPER SIGN */
+ ["\u267F", "\u267F"], /* WHEELCHAIR SYMBOL */
+ ["\u2680", "\u2680"], /* DIE FACE-1 */
+ ["\u2681", "\u2681"], /* DIE FACE-2 */
+ ["\u2682", "\u2682"], /* DIE FACE-3 */
+ ["\u2683", "\u2683"], /* DIE FACE-4 */
+ ["\u2684", "\u2684"], /* DIE FACE-5 */
+ ["\u2685", "\u2685"], /* DIE FACE-6 */
+ ["\u2686", "\u2686"], /* WHITE CIRCLE WITH DOT RIGHT */
+ ["\u2687", "\u2687"], /* WHITE CIRCLE WITH TWO DOTS */
+ ["\u2688", "\u2688"], /* BLACK CIRCLE WITH WHITE DOT RIGHT */
+ ["\u2689", "\u2689"], /* BLACK CIRCLE WITH TWO WHITE DOTS */
+ ["\u268A", "\u268A"], /* MONOGRAM FOR YANG */
+ ["\u268B", "\u268B"], /* MONOGRAM FOR YIN */
+ ["\u268C", "\u268C"], /* DIGRAM FOR GREATER YANG */
+ ["\u268D", "\u268D"], /* DIGRAM FOR LESSER YIN */
+ ["\u268E", "\u268E"], /* DIGRAM FOR LESSER YANG */
+ ["\u268F", "\u268F"], /* DIGRAM FOR GREATER YIN */
+ ["\u2690", "\u2690"], /* WHITE FLAG */
+ ["\u2691", "\u2691"], /* BLACK FLAG */
+ ["\u2692", "\u2692"], /* HAMMER AND PICK */
+ ["\u2693", "\u2693"], /* ANCHOR */
+ ["\u2694", "\u2694"], /* CROSSED SWORDS */
+ ["\u2695", "\u2695"], /* STAFF OF AESCULAPIUS */
+ ["\u2696", "\u2696"], /* SCALES */
+ ["\u2697", "\u2697"], /* ALEMBIC */
+ ["\u2698", "\u2698"], /* FLOWER */
+ ["\u2699", "\u2699"], /* GEAR */
+ ["\u269A", "\u269A"], /* STAFF OF HERMES */
+ ["\u269B", "\u269B"], /* ATOM SYMBOL */
+ ["\u269C", "\u269C"], /* FLEUR-DE-LIS */
+ ["\u269D", "\u269D"], /* OUTLINED WHITE STAR */
+ ["\u269E", "\u269E"], /* THREE LINES CONVERGING RIGHT */
+ ["\u269F", "\u269F"], /* THREE LINES CONVERGING LEFT */
+ ["\u26A0", "\u26A0"], /* WARNING SIGN */
+ ["\u26A1", "\u26A1"], /* HIGH VOLTAGE SIGN */
+ ["\u26A2", "\u26A2"], /* DOUBLED FEMALE SIGN */
+ ["\u26A3", "\u26A3"], /* DOUBLED MALE SIGN */
+ ["\u26A4", "\u26A4"], /* INTERLOCKED FEMALE AND MALE SIGN */
+ ["\u26A5", "\u26A5"], /* MALE AND FEMALE SIGN */
+ ["\u26A6", "\u26A6"], /* MALE WITH STROKE SIGN */
+ ["\u26A7", "\u26A7"], /* MALE WITH STROKE AND MALE AND FEMALE SIGN */
+ ["\u26A8", "\u26A8"], /* VERTICAL MALE WITH STROKE SIGN */
+ ["\u26A9", "\u26A9"], /* HORIZONTAL MALE WITH STROKE SIGN */
+ ["\u26AA", "\u26AA"], /* MEDIUM WHITE CIRCLE */
+ ["\u26AB", "\u26AB"], /* MEDIUM BLACK CIRCLE */
+ ["\u26AC", "\u26AC"], /* MEDIUM SMALL WHITE CIRCLE */
+ ["\u26AD", "\u26AD"], /* MARRIAGE SYMBOL */
+ ["\u26AE", "\u26AE"], /* DIVORCE SYMBOL */
+ ["\u26AF", "\u26AF"], /* UNMARRIED PARTNERSHIP SYMBOL */
+ ["\u26B0", "\u26B0"], /* COFFIN */
+ ["\u26B1", "\u26B1"], /* FUNERAL URN */
+ ["\u26B2", "\u26B2"], /* NEUTER */
+ ["\u26B3", "\u26B3"], /* CERES */
+ ["\u26B4", "\u26B4"], /* PALLAS */
+ ["\u26B5", "\u26B5"], /* JUNO */
+ ["\u26B6", "\u26B6"], /* VESTA */
+ ["\u26B7", "\u26B7"], /* CHIRON */
+ ["\u26B8", "\u26B8"], /* BLACK MOON LILITH */
+ ["\u26B9", "\u26B9"], /* SEXTILE */
+ ["\u26BA", "\u26BA"], /* SEMISEXTILE */
+ ["\u26BB", "\u26BB"], /* QUINCUNX */
+ ["\u26BC", "\u26BC"], /* SESQUIQUADRATE */
+ ["\u26BD", "\u26BD"], /* SOCCER BALL */
+ ["\u26BE", "\u26BE"], /* BASEBALL */
+ ["\u26BF", "\u26BF"], /* SQUARED KEY */
+ ["\u26C0", "\u26C0"], /* WHITE DRAUGHTS MAN */
+ ["\u26C1", "\u26C1"], /* WHITE DRAUGHTS KING */
+ ["\u26C2", "\u26C2"], /* BLACK DRAUGHTS MAN */
+ ["\u26C3", "\u26C3"], /* BLACK DRAUGHTS KING */
+ ["\u26C4", "\u26C4"], /* SNOWMAN WITHOUT SNOW */
+ ["\u26C5", "\u26C5"], /* SUN BEHIND CLOUD */
+ ["\u26C6", "\u26C6"], /* RAIN */
+ ["\u26C7", "\u26C7"], /* BLACK SNOWMAN */
+ ["\u26C8", "\u26C8"], /* THUNDER CLOUD AND RAIN */
+ ["\u26C9", "\u26C9"], /* TURNED WHITE SHOGI PIECE */
+ ["\u26CA", "\u26CA"], /* TURNED BLACK SHOGI PIECE */
+ ["\u26CB", "\u26CB"], /* WHITE DIAMOND IN SQUARE */
+ ["\u26CC", "\u26CC"], /* CROSSING LANES */
+ ["\u26CD", "\u26CD"], /* DISABLED CAR */
+ ["\u26CE", "\u26CE"], /* OPHIUCHUS */
+ ["\u26CF", "\u26CF"], /* PICK */
+ ["\u26D0", "\u26D0"], /* CAR SLIDING */
+ ["\u26D1", "\u26D1"], /* HELMET WITH WHITE CROSS */
+ ["\u26D2", "\u26D2"], /* CIRCLED CROSSING LANES */
+ ["\u26D3", "\u26D3"], /* CHAINS */
+ ["\u26D4", "\u26D4"], /* NO ENTRY */
+ ["\u26D5", "\u26D5"], /* ALTERNATE ONE-WAY LEFT WAY TRAFFIC */
+ ["\u26D6", "\u26D6"], /* BLACK TWO-WAY LEFT WAY TRAFFIC */
+ ["\u26D7", "\u26D7"], /* WHITE TWO-WAY LEFT WAY TRAFFIC */
+ ["\u26D8", "\u26D8"], /* BLACK LEFT LANE MERGE */
+ ["\u26D9", "\u26D9"], /* WHITE LEFT LANE MERGE */
+ ["\u26DA", "\u26DA"], /* DRIVE SLOW SIGN */
+ ["\u26DB", "\u26DB"], /* HEAVY WHITE DOWN-POINTING TRIANGLE */
+ ["\u26DC", "\u26DC"], /* LEFT CLOSED ENTRY */
+ ["\u26DD", "\u26DD"], /* SQUARED SALTIRE */
+ ["\u26DE", "\u26DE"], /* FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE */
+ ["\u26DF", "\u26DF"], /* BLACK TRUCK */
+ ["\u26E0", "\u26E0"], /* RESTRICTED LEFT ENTRY-1 */
+ ["\u26E1", "\u26E1"], /* RESTRICTED LEFT ENTRY-2 */
+ ["\u26E2", "\u26E2"], /* ASTRONOMICAL SYMBOL FOR URANUS */
+ ["\u26E3", "\u26E3"], /* HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE */
+ ["\u26E4", "\u26E4"], /* PENTAGRAM */
+ ["\u26E5", "\u26E5"], /* RIGHT-HANDED INTERLACED PENTAGRAM */
+ ["\u26E6", "\u26E6"], /* LEFT-HANDED INTERLACED PENTAGRAM */
+ ["\u26E7", "\u26E7"], /* INVERTED PENTAGRAM */
+ ["\u26E8", "\u26E8"], /* BLACK CROSS ON SHIELD */
+ ["\u26E9", "\u26E9"], /* SHINTO SHRINE */
+ ["\u26EA", "\u26EA"], /* CHURCH */
+ ["\u26EB", "\u26EB"], /* CASTLE */
+ ["\u26EC", "\u26EC"], /* HISTORIC SITE */
+ ["\u26ED", "\u26ED"], /* GEAR WITHOUT HUB */
+ ["\u26EE", "\u26EE"], /* GEAR WITH HANDLES */
+ ["\u26EF", "\u26EF"], /* MAP SYMBOL FOR LIGHTHOUSE */
+ ["\u26F0", "\u26F0"], /* MOUNTAIN */
+ ["\u26F1", "\u26F1"], /* UMBRELLA ON GROUND */
+ ["\u26F2", "\u26F2"], /* FOUNTAIN */
+ ["\u26F3", "\u26F3"], /* FLAG IN HOLE */
+ ["\u26F4", "\u26F4"], /* FERRY */
+ ["\u26F5", "\u26F5"], /* SAILBOAT */
+ ["\u26F6", "\u26F6"], /* SQUARE FOUR CORNERS */
+ ["\u26F7", "\u26F7"], /* SKIER */
+ ["\u26F8", "\u26F8"], /* ICE SKATE */
+ ["\u26F9", "\u26F9"], /* PERSON WITH BALL */
+ ["\u26FA", "\u26FA"], /* TENT */
+ ["\u26FB", "\u26FB"], /* JAPANESE BANK SYMBOL */
+ ["\u26FC", "\u26FC"], /* HEADSTONE GRAVEYARD SYMBOL */
+ ["\u26FD", "\u26FD"], /* FUEL PUMP */
+ ["\u26FE", "\u26FE"], /* CUP ON BLACK SQUARE */
+ ["\u26FF", "\u26FF"], /* WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE */
+ ["\u2700", "\u2700"], /* BLACK SAFETY SCISSORS */
+ ["\u2701", "\u2701"], /* UPPER BLADE SCISSORS */
+ ["\u2702", "\u2702"], /* BLACK SCISSORS */
+ ["\u2703", "\u2703"], /* LOWER BLADE SCISSORS */
+ ["\u2704", "\u2704"], /* WHITE SCISSORS */
+ ["\u2705", "\u2705"], /* WHITE HEAVY CHECK MARK */
+ ["\u2706", "\u2706"], /* TELEPHONE LOCATION SIGN */
+ ["\u2707", "\u2707"], /* TAPE DRIVE */
+ ["\u2708", "\u2708"], /* AIRPLANE */
+ ["\u2709", "\u2709"], /* ENVELOPE */
+ ["\u270A", "\u270A"], /* RAISED FIST */
+ ["\u270B", "\u270B"], /* RAISED HAND */
+ ["\u270C", "\u270C"], /* VICTORY HAND */
+ ["\u270D", "\u270D"], /* WRITING HAND */
+ ["\u270E", "\u270E"], /* LOWER RIGHT PENCIL */
+ ["\u270F", "\u270F"], /* PENCIL */
+ ["\u2710", "\u2710"], /* UPPER RIGHT PENCIL */
+ ["\u2711", "\u2711"], /* WHITE NIB */
+ ["\u2712", "\u2712"], /* BLACK NIB */
+ ["\u2713", "\u2713"], /* CHECK MARK */
+ ["\u2714", "\u2714"], /* HEAVY CHECK MARK */
+ ["\u2715", "\u2715"], /* MULTIPLICATION X */
+ ["\u2716", "\u2716"], /* HEAVY MULTIPLICATION X */
+ ["\u2717", "\u2717"], /* BALLOT X */
+ ["\u2718", "\u2718"], /* HEAVY BALLOT X */
+ ["\u2719", "\u2719"], /* OUTLINED GREEK CROSS */
+ ["\u271A", "\u271A"], /* HEAVY GREEK CROSS */
+ ["\u271B", "\u271B"], /* OPEN CENTRE CROSS (OPEN CENTER CROSS) */
+ ["\u271C", "\u271C"], /* HEAVY OPEN CENTRE CROSS (HEAVY OPEN CENTER CROSS) */
+ ["\u271D", "\u271D"], /* LATIN CROSS */
+ ["\u271E", "\u271E"], /* SHADOWED WHITE LATIN CROSS */
+ ["\u271F", "\u271F"], /* OUTLINED LATIN CROSS */
+ ["\u2720", "\u2720"], /* MALTESE CROSS */
+ ["\u2721", "\u2721"], /* STAR OF DAVID */
+ ["\u2722", "\u2722"], /* FOUR TEARDROP-SPOKED ASTERISK */
+ ["\u2723", "\u2723"], /* FOUR BALLOON-SPOKED ASTERISK */
+ ["\u2724", "\u2724"], /* HEAVY FOUR BALLOON-SPOKED ASTERISK */
+ ["\u2725", "\u2725"], /* FOUR CLUB-SPOKED ASTERISK */
+ ["\u2726", "\u2726"], /* BLACK FOUR POINTED STAR */
+ ["\u2727", "\u2727"], /* WHITE FOUR POINTED STAR */
+ ["\u2728", "\u2728"], /* SPARKLES */
+ ["\u2729", "\u2729"], /* STRESS OUTLINED WHITE STAR */
+ ["\u272A", "\u272A"], /* CIRCLED WHITE STAR */
+ ["\u272B", "\u272B"], /* OPEN CENTRE BLACK STAR (OPEN CENTER BLACK STAR) */
+ ["\u272C", "\u272C"], /* BLACK CENTRE WHITE STAR (BLACK CENTER WHITE STAR) */
+ ["\u272D", "\u272D"], /* OUTLINED BLACK STAR */
+ ["\u272E", "\u272E"], /* HEAVY OUTLINED BLACK STAR */
+ ["\u272F", "\u272F"], /* PINWHEEL STAR */
+ ["\u2730", "\u2730"], /* SHADOWED WHITE STAR */
+ ["\u2731", "\u2731"], /* HEAVY ASTERISK */
+ ["\u2732", "\u2732"], /* OPEN CENTRE ASTERISK (OPEN CENTER ASTERISK) */
+ ["\u2733", "\u2733"], /* EIGHT SPOKED ASTERISK */
+ ["\u2734", "\u2734"], /* EIGHT POINTED BLACK STAR */
+ ["\u2735", "\u2735"], /* EIGHT POINTED PINWHEEL STAR */
+ ["\u2736", "\u2736"], /* SIX POINTED BLACK STAR */
+ ["\u2737", "\u2737"], /* EIGHT POINTED RECTILINEAR BLACK STAR */
+ ["\u2738", "\u2738"], /* HEAVY EIGHT POINTED RECTILINEAR BLACK STAR */
+ ["\u2739", "\u2739"], /* TWELVE POINTED BLACK STAR */
+ ["\u273A", "\u273A"], /* SIXTEEN POINTED ASTERISK */
+ ["\u273B", "\u273B"], /* TEARDROP-SPOKED ASTERISK */
+ ["\u273C", "\u273C"], /* OPEN CENTRE TEARDROP-SPOKED ASTERISK (OPEN CENTER TEARDROP-SPOKED ASTERISK) */
+ ["\u273D", "\u273D"], /* HEAVY TEARDROP-SPOKED ASTERISK */
+ ["\u273E", "\u273E"], /* SIX PETALLED BLACK AND WHITE FLORETTE */
+ ["\u273F", "\u273F"], /* BLACK FLORETTE */
+ ["\u2740", "\u2740"], /* WHITE FLORETTE */
+ ["\u2741", "\u2741"], /* EIGHT PETALLED OUTLINED BLACK FLORETTE */
+ ["\u2742", "\u2742"], /* CIRCLED OPEN CENTRE EIGHT POINTED STAR (CIRCLED OPEN CENTER EIGHT POINTED STAR) */
+ ["\u2743", "\u2743"], /* HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK */
+ ["\u2744", "\u2744"], /* SNOWFLAKE */
+ ["\u2745", "\u2745"], /* TIGHT TRIFOLIATE SNOWFLAKE */
+ ["\u2746", "\u2746"], /* HEAVY CHEVRON SNOWFLAKE */
+ ["\u2747", "\u2747"], /* SPARKLE */
+ ["\u2748", "\u2748"], /* HEAVY SPARKLE */
+ ["\u2749", "\u2749"], /* BALLOON-SPOKED ASTERISK */
+ ["\u274A", "\u274A"], /* EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */
+ ["\u274B", "\u274B"], /* HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK */
+ ["\u274C", "\u274C"], /* CROSS MARK */
+ ["\u274D", "\u274D"], /* SHADOWED WHITE CIRCLE */
+ ["\u274E", "\u274E"], /* NEGATIVE SQUARED CROSS MARK */
+ ["\u274F", "\u274F"], /* LOWER RIGHT DROP-SHADOWED WHITE SQUARE */
+ ["\u2750", "\u2750"], /* UPPER RIGHT DROP-SHADOWED WHITE SQUARE */
+ ["\u2751", "\u2751"], /* LOWER RIGHT SHADOWED WHITE SQUARE */
+ ["\u2752", "\u2752"], /* UPPER RIGHT SHADOWED WHITE SQUARE */
+ ["\u2753", "\u2753"], /* BLACK QUESTION MARK ORNAMENT */
+ ["\u2754", "\u2754"], /* WHITE QUESTION MARK ORNAMENT */
+ ["\u2755", "\u2755"], /* WHITE EXCLAMATION MARK ORNAMENT */
+ ["\u2756", "\u2756"], /* BLACK DIAMOND MINUS WHITE X */
+ ["\u2757", "\u2757"], /* HEAVY EXCLAMATION MARK SYMBOL */
+ ["\u2758", "\u2758"], /* LIGHT VERTICAL BAR */
+ ["\u2759", "\u2759"], /* MEDIUM VERTICAL BAR */
+ ["\u275A", "\u275A"], /* HEAVY VERTICAL BAR */
+ ["\u275B", "\u275B"], /* HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ ["\u275C", "\u275C"], /* HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT */
+ ["\u275D", "\u275D"], /* HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ ["\u275E", "\u275E"], /* HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT */
+ ["\u275F", "\u275F"], /* HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT */
+ ["\u2760", "\u2760"], /* HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT */
+ ["\u2761", "\u2761"], /* CURVED STEM PARAGRAPH SIGN ORNAMENT */
+ ["\u2762", "\u2762"], /* HEAVY EXCLAMATION MARK ORNAMENT */
+ ["\u2763", "\u2763"], /* HEAVY HEART EXCLAMATION MARK ORNAMENT */
+ ["\u2764", "\u2764"], /* HEAVY BLACK HEART */
+ ["\u2765", "\u2765"], /* ROTATED HEAVY BLACK HEART BULLET */
+ ["\u2766", "\u2766"], /* FLORAL HEART */
+ ["\u2767", "\u2767"], /* ROTATED FLORAL HEART BULLET */
+ ["\u2768", "\u2768"], /* MEDIUM LEFT PARENTHESIS ORNAMENT */
+ ["\u2769", "\u2769"], /* MEDIUM RIGHT PARENTHESIS ORNAMENT */
+ ["\u276A", "\u276A"], /* MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT */
+ ["\u276B", "\u276B"], /* MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT */
+ ["\u276C", "\u276C"], /* MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT */
+ ["\u276D", "\u276D"], /* MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT */
+ ["\u276E", "\u276E"], /* HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT */
+ ["\u276F", "\u276F"], /* HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT */
+ ["\u2770", "\u2770"], /* HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT */
+ ["\u2771", "\u2771"], /* HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT */
+ ["\u2772", "\u2772"], /* LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT */
+ ["\u2773", "\u2773"], /* LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT */
+ ["\u2774", "\u2774"], /* MEDIUM LEFT CURLY BRACKET ORNAMENT */
+ ["\u2775", "\u2775"], /* MEDIUM RIGHT CURLY BRACKET ORNAMENT */
+ ["\u2776", "\u2776"], /* DINGBAT NEGATIVE CIRCLED DIGIT ONE (INVERSE CIRCLED DIGIT ONE) */
+ ["\u2777", "\u2777"], /* DINGBAT NEGATIVE CIRCLED DIGIT TWO (INVERSE CIRCLED DIGIT TWO) */
+ ["\u2778", "\u2778"], /* DINGBAT NEGATIVE CIRCLED DIGIT THREE (INVERSE CIRCLED DIGIT THREE) */
+ ["\u2779", "\u2779"], /* DINGBAT NEGATIVE CIRCLED DIGIT FOUR (INVERSE CIRCLED DIGIT FOUR) */
+ ["\u277A", "\u277A"], /* DINGBAT NEGATIVE CIRCLED DIGIT FIVE (INVERSE CIRCLED DIGIT FIVE) */
+ ["\u277B", "\u277B"], /* DINGBAT NEGATIVE CIRCLED DIGIT SIX (INVERSE CIRCLED DIGIT SIX) */
+ ["\u277C", "\u277C"], /* DINGBAT NEGATIVE CIRCLED DIGIT SEVEN (INVERSE CIRCLED DIGIT SEVEN) */
+ ["\u277D", "\u277D"], /* DINGBAT NEGATIVE CIRCLED DIGIT EIGHT (INVERSE CIRCLED DIGIT EIGHT) */
+ ["\u277E", "\u277E"], /* DINGBAT NEGATIVE CIRCLED DIGIT NINE (INVERSE CIRCLED DIGIT NINE) */
+ ["\u277F", "\u277F"], /* DINGBAT NEGATIVE CIRCLED NUMBER TEN (INVERSE CIRCLED NUMBER TEN) */
+ ["\u2780", "\u2780"], /* DINGBAT CIRCLED SANS-SERIF DIGIT ONE (CIRCLED SANS-SERIF DIGIT ONE) */
+ ["\u2781", "\u2781"], /* DINGBAT CIRCLED SANS-SERIF DIGIT TWO (CIRCLED SANS-SERIF DIGIT TWO) */
+ ["\u2782", "\u2782"], /* DINGBAT CIRCLED SANS-SERIF DIGIT THREE (CIRCLED SANS-SERIF DIGIT THREE) */
+ ["\u2783", "\u2783"], /* DINGBAT CIRCLED SANS-SERIF DIGIT FOUR (CIRCLED SANS-SERIF DIGIT FOUR) */
+ ["\u2784", "\u2784"], /* DINGBAT CIRCLED SANS-SERIF DIGIT FIVE (CIRCLED SANS-SERIF DIGIT FIVE) */
+ ["\u2785", "\u2785"], /* DINGBAT CIRCLED SANS-SERIF DIGIT SIX (CIRCLED SANS-SERIF DIGIT SIX) */
+ ["\u2786", "\u2786"], /* DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN (CIRCLED SANS-SERIF DIGIT SEVEN) */
+ ["\u2787", "\u2787"], /* DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT (CIRCLED SANS-SERIF DIGIT EIGHT) */
+ ["\u2788", "\u2788"], /* DINGBAT CIRCLED SANS-SERIF DIGIT NINE (CIRCLED SANS-SERIF DIGIT NINE) */
+ ["\u2789", "\u2789"], /* DINGBAT CIRCLED SANS-SERIF NUMBER TEN (CIRCLED SANS-SERIF NUMBER TEN) */
+ ["\u278A", "\u278A"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE (INVERSE CIRCLED SANS-SERIF DIGIT ONE) */
+ ["\u278B", "\u278B"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO (INVERSE CIRCLED SANS-SERIF DIGIT TWO) */
+ ["\u278C", "\u278C"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE (INVERSE CIRCLED SANS-SERIF DIGIT THREE) */
+ ["\u278D", "\u278D"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR (INVERSE CIRCLED SANS-SERIF DIGIT FOUR) */
+ ["\u278E", "\u278E"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE (INVERSE CIRCLED SANS-SERIF DIGIT FIVE) */
+ ["\u278F", "\u278F"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX (INVERSE CIRCLED SANS-SERIF DIGIT SIX) */
+ ["\u2790", "\u2790"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN (INVERSE CIRCLED SANS-SERIF DIGIT SEVEN) */
+ ["\u2791", "\u2791"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT (INVERSE CIRCLED SANS-SERIF DIGIT EIGHT) */
+ ["\u2792", "\u2792"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE (INVERSE CIRCLED SANS-SERIF DIGIT NINE) */
+ ["\u2793", "\u2793"], /* DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN (INVERSE CIRCLED SANS-SERIF NUMBER TEN) */
+ ["\u2794", "\u2794"], /* HEAVY WIDE-HEADED RIGHTWARDS ARROW (HEAVY WIDE-HEADED RIGHT ARROW) */
+ ["\u2795", "\u2795"], /* HEAVY PLUS SIGN */
+ ["\u2796", "\u2796"], /* HEAVY MINUS SIGN */
+ ["\u2797", "\u2797"], /* HEAVY DIVISION SIGN */
+ ["\u2798", "\u2798"], /* HEAVY SOUTH EAST ARROW (HEAVY LOWER RIGHT ARROW) */
+ ["\u2799", "\u2799"], /* HEAVY RIGHTWARDS ARROW (HEAVY RIGHT ARROW) */
+ ["\u279A", "\u279A"], /* HEAVY NORTH EAST ARROW (HEAVY UPPER RIGHT ARROW) */
+ ["\u279B", "\u279B"], /* DRAFTING POINT RIGHTWARDS ARROW (DRAFTING POINT RIGHT ARROW) */
+ ["\u279C", "\u279C"], /* HEAVY ROUND-TIPPED RIGHTWARDS ARROW (HEAVY ROUND-TIPPED RIGHT ARROW) */
+ ["\u279D", "\u279D"], /* TRIANGLE-HEADED RIGHTWARDS ARROW (TRIANGLE-HEADED RIGHT ARROW) */
+ ["\u279E", "\u279E"], /* HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW (HEAVY TRIANGLE-HEADED RIGHT ARROW) */
+ ["\u279F", "\u279F"], /* DASHED TRIANGLE-HEADED RIGHTWARDS ARROW (DASHED TRIANGLE-HEADED RIGHT ARROW) */
+ ["\u27A0", "\u27A0"], /* HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW (HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW) */
+ ["\u27A1", "\u27A1"], /* BLACK RIGHTWARDS ARROW (BLACK RIGHT ARROW) */
+ ["\u27A2", "\u27A2"], /* THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD (THREE-D TOP-LIGHTED RIGHT ARROWHEAD) */
+ ["\u27A3", "\u27A3"], /* THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD (THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD) */
+ ["\u27A4", "\u27A4"], /* BLACK RIGHTWARDS ARROWHEAD (BLACK RIGHT ARROWHEAD) */
+ ["\u27A5", "\u27A5"], /* HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW (HEAVY BLACK CURVED DOWN AND RIGHT ARROW) */
+ ["\u27A6", "\u27A6"], /* HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW (HEAVY BLACK CURVED UP AND RIGHT ARROW) */
+ ["\u27A7", "\u27A7"], /* SQUAT BLACK RIGHTWARDS ARROW (SQUAT BLACK RIGHT ARROW) */
+ ["\u27A8", "\u27A8"], /* HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW (HEAVY CONCAVE-POINTED BLACK RIGHT ARROW) */
+ ["\u27A9", "\u27A9"], /* RIGHT-SHADED WHITE RIGHTWARDS ARROW (RIGHT-SHADED WHITE RIGHT ARROW) */
+ ["\u27AA", "\u27AA"], /* LEFT-SHADED WHITE RIGHTWARDS ARROW (LEFT-SHADED WHITE RIGHT ARROW) */
+ ["\u27AB", "\u27AB"], /* BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW (BACK-TILTED SHADOWED WHITE RIGHT ARROW) */
+ ["\u27AC", "\u27AC"], /* FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW (FRONT-TILTED SHADOWED WHITE RIGHT ARROW) */
+ ["\u27AD", "\u27AD"], /* HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW) */
+ ["\u27AE", "\u27AE"], /* HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW) */
+ ["\u27AF", "\u27AF"], /* NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW) */
+ ["\u27B0", "\u27B0"], /* CURLY LOOP */
+ ["\u27B1", "\u27B1"], /* NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW (NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW) */
+ ["\u27B2", "\u27B2"], /* CIRCLED HEAVY WHITE RIGHTWARDS ARROW (CIRCLED HEAVY WHITE RIGHT ARROW) */
+ ["\u27B3", "\u27B3"], /* WHITE-FEATHERED RIGHTWARDS ARROW (WHITE-FEATHERED RIGHT ARROW) */
+ ["\u27B4", "\u27B4"], /* BLACK-FEATHERED SOUTH EAST ARROW (BLACK-FEATHERED LOWER RIGHT ARROW) */
+ ["\u27B5", "\u27B5"], /* BLACK-FEATHERED RIGHTWARDS ARROW (BLACK-FEATHERED RIGHT ARROW) */
+ ["\u27B6", "\u27B6"], /* BLACK-FEATHERED NORTH EAST ARROW (BLACK-FEATHERED UPPER RIGHT ARROW) */
+ ["\u27B7", "\u27B7"], /* HEAVY BLACK-FEATHERED SOUTH EAST ARROW (HEAVY BLACK-FEATHERED LOWER RIGHT ARROW) */
+ ["\u27B8", "\u27B8"], /* HEAVY BLACK-FEATHERED RIGHTWARDS ARROW (HEAVY BLACK-FEATHERED RIGHT ARROW) */
+ ["\u27B9", "\u27B9"], /* HEAVY BLACK-FEATHERED NORTH EAST ARROW (HEAVY BLACK-FEATHERED UPPER RIGHT ARROW) */
+ ["\u27BA", "\u27BA"], /* TEARDROP-BARBED RIGHTWARDS ARROW (TEARDROP-BARBED RIGHT ARROW) */
+ ["\u27BB", "\u27BB"], /* HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW (HEAVY TEARDROP-SHANKED RIGHT ARROW) */
+ ["\u27BC", "\u27BC"], /* WEDGE-TAILED RIGHTWARDS ARROW (WEDGE-TAILED RIGHT ARROW) */
+ ["\u27BD", "\u27BD"], /* HEAVY WEDGE-TAILED RIGHTWARDS ARROW (HEAVY WEDGE-TAILED RIGHT ARROW) */
+ ["\u27BE", "\u27BE"], /* OPEN-OUTLINED RIGHTWARDS ARROW (OPEN-OUTLINED RIGHT ARROW) */
+ ["\u27BF", "\u27BF"], /* DOUBLE CURLY LOOP */
+ ["\u27C0", "\u27C0"], /* THREE DIMENSIONAL ANGLE */
+ ["\u27C1", "\u27C1"], /* WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE */
+ ["\u27C2", "\u27C2"], /* PERPENDICULAR */
+ ["\u27C3", "\u27C3"], /* OPEN SUBSET */
+ ["\u27C4", "\u27C4"], /* OPEN SUPERSET */
+ ["\u27C5", "\u27C5"], /* LEFT S-SHAPED BAG DELIMITER */
+ ["\u27C6", "\u27C6"], /* RIGHT S-SHAPED BAG DELIMITER */
+ ["\u27C7", "\u27C7"], /* OR WITH DOT INSIDE */
+ ["\u27C8", "\u27C8"], /* REVERSE SOLIDUS PRECEDING SUBSET */
+ ["\u27C9", "\u27C9"], /* SUPERSET PRECEDING SOLIDUS */
+ ["\u27CA", "\u27CA"], /* VERTICAL BAR WITH HORIZONTAL STROKE */
+ ["\u27CB", "\u27CB"], /* MATHEMATICAL RISING DIAGONAL */
+ ["\u27CC", "\u27CC"], /* LONG DIVISION */
+ ["\u27CD", "\u27CD"], /* MATHEMATICAL FALLING DIAGONAL */
+ ["\u27CE", "\u27CE"], /* SQUARED LOGICAL AND */
+ ["\u27CF", "\u27CF"], /* SQUARED LOGICAL OR */
+ ["\u27D0", "\u27D0"], /* WHITE DIAMOND WITH CENTRED DOT */
+ ["\u27D1", "\u27D1"], /* AND WITH DOT */
+ ["\u27D2", "\u27D2"], /* ELEMENT OF OPENING UPWARDS */
+ ["\u27D3", "\u27D3"], /* LOWER RIGHT CORNER WITH DOT */
+ ["\u27D4", "\u27D4"], /* UPPER LEFT CORNER WITH DOT */
+ ["\u27D5", "\u27D5"], /* LEFT OUTER JOIN */
+ ["\u27D6", "\u27D6"], /* RIGHT OUTER JOIN */
+ ["\u27D7", "\u27D7"], /* FULL OUTER JOIN */
+ ["\u27D8", "\u27D8"], /* LARGE UP TACK */
+ ["\u27D9", "\u27D9"], /* LARGE DOWN TACK */
+ ["\u27DA", "\u27DA"], /* LEFT AND RIGHT DOUBLE TURNSTILE */
+ ["\u27DB", "\u27DB"], /* LEFT AND RIGHT TACK */
+ ["\u27DC", "\u27DC"], /* LEFT MULTIMAP */
+ ["\u27DD", "\u27DD"], /* LONG RIGHT TACK */
+ ["\u27DE", "\u27DE"], /* LONG LEFT TACK */
+ ["\u27DF", "\u27DF"], /* UP TACK WITH CIRCLE ABOVE */
+ ["\u27E0", "\u27E0"], /* LOZENGE DIVIDED BY HORIZONTAL RULE */
+ ["\u27E1", "\u27E1"], /* WHITE CONCAVE-SIDED DIAMOND */
+ ["\u27E2", "\u27E2"], /* WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK */
+ ["\u27E3", "\u27E3"], /* WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK */
+ ["\u27E4", "\u27E4"], /* WHITE SQUARE WITH LEFTWARDS TICK */
+ ["\u27E5", "\u27E5"], /* WHITE SQUARE WITH RIGHTWARDS TICK */
+ ["\u27E6", "\u27E6"], /* MATHEMATICAL LEFT WHITE SQUARE BRACKET */
+ ["\u27E7", "\u27E7"], /* MATHEMATICAL RIGHT WHITE SQUARE BRACKET */
+ ["\u27E8", "\u27E8"], /* MATHEMATICAL LEFT ANGLE BRACKET */
+ ["\u27E9", "\u27E9"], /* MATHEMATICAL RIGHT ANGLE BRACKET */
+ ["\u27EA", "\u27EA"], /* MATHEMATICAL LEFT DOUBLE ANGLE BRACKET */
+ ["\u27EB", "\u27EB"], /* MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET */
+ ["\u27EC", "\u27EC"], /* MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET */
+ ["\u27ED", "\u27ED"], /* MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET */
+ ["\u27EE", "\u27EE"], /* MATHEMATICAL LEFT FLATTENED PARENTHESIS */
+ ["\u27EF", "\u27EF"], /* MATHEMATICAL RIGHT FLATTENED PARENTHESIS */
+ ["\u27F0", "\u27F0"], /* UPWARDS QUADRUPLE ARROW */
+ ["\u27F1", "\u27F1"], /* DOWNWARDS QUADRUPLE ARROW */
+ ["\u27F2", "\u27F2"], /* ANTICLOCKWISE GAPPED CIRCLE ARROW */
+ ["\u27F3", "\u27F3"], /* CLOCKWISE GAPPED CIRCLE ARROW */
+ ["\u27F4", "\u27F4"], /* RIGHT ARROW WITH CIRCLED PLUS */
+ ["\u27F5", "\u27F5"], /* LONG LEFTWARDS ARROW */
+ ["\u27F6", "\u27F6"], /* LONG RIGHTWARDS ARROW */
+ ["\u27F7", "\u27F7"], /* LONG LEFT RIGHT ARROW */
+ ["\u27F8", "\u27F8"], /* LONG LEFTWARDS DOUBLE ARROW */
+ ["\u27F9", "\u27F9"], /* LONG RIGHTWARDS DOUBLE ARROW */
+ ["\u27FA", "\u27FA"], /* LONG LEFT RIGHT DOUBLE ARROW */
+ ["\u27FB", "\u27FB"], /* LONG LEFTWARDS ARROW FROM BAR */
+ ["\u27FC", "\u27FC"], /* LONG RIGHTWARDS ARROW FROM BAR */
+ ["\u27FD", "\u27FD"], /* LONG LEFTWARDS DOUBLE ARROW FROM BAR */
+ ["\u27FE", "\u27FE"], /* LONG RIGHTWARDS DOUBLE ARROW FROM BAR */
+ ["\u27FF", "\u27FF"], /* LONG RIGHTWARDS SQUIGGLE ARROW */
+ ["\u2800", "\u2800"], /* BRAILLE PATTERN BLANK */
+ ["\u2801", "\u2801"], /* BRAILLE PATTERN DOTS-1 */
+ ["\u2802", "\u2802"], /* BRAILLE PATTERN DOTS-2 */
+ ["\u2803", "\u2803"], /* BRAILLE PATTERN DOTS-12 */
+ ["\u2804", "\u2804"], /* BRAILLE PATTERN DOTS-3 */
+ ["\u2805", "\u2805"], /* BRAILLE PATTERN DOTS-13 */
+ ["\u2806", "\u2806"], /* BRAILLE PATTERN DOTS-23 */
+ ["\u2807", "\u2807"], /* BRAILLE PATTERN DOTS-123 */
+ ["\u2808", "\u2808"], /* BRAILLE PATTERN DOTS-4 */
+ ["\u2809", "\u2809"], /* BRAILLE PATTERN DOTS-14 */
+ ["\u280A", "\u280A"], /* BRAILLE PATTERN DOTS-24 */
+ ["\u280B", "\u280B"], /* BRAILLE PATTERN DOTS-124 */
+ ["\u280C", "\u280C"], /* BRAILLE PATTERN DOTS-34 */
+ ["\u280D", "\u280D"], /* BRAILLE PATTERN DOTS-134 */
+ ["\u280E", "\u280E"], /* BRAILLE PATTERN DOTS-234 */
+ ["\u280F", "\u280F"], /* BRAILLE PATTERN DOTS-1234 */
+ ["\u2810", "\u2810"], /* BRAILLE PATTERN DOTS-5 */
+ ["\u2811", "\u2811"], /* BRAILLE PATTERN DOTS-15 */
+ ["\u2812", "\u2812"], /* BRAILLE PATTERN DOTS-25 */
+ ["\u2813", "\u2813"], /* BRAILLE PATTERN DOTS-125 */
+ ["\u2814", "\u2814"], /* BRAILLE PATTERN DOTS-35 */
+ ["\u2815", "\u2815"], /* BRAILLE PATTERN DOTS-135 */
+ ["\u2816", "\u2816"], /* BRAILLE PATTERN DOTS-235 */
+ ["\u2817", "\u2817"], /* BRAILLE PATTERN DOTS-1235 */
+ ["\u2818", "\u2818"], /* BRAILLE PATTERN DOTS-45 */
+ ["\u2819", "\u2819"], /* BRAILLE PATTERN DOTS-145 */
+ ["\u281A", "\u281A"], /* BRAILLE PATTERN DOTS-245 */
+ ["\u281B", "\u281B"], /* BRAILLE PATTERN DOTS-1245 */
+ ["\u281C", "\u281C"], /* BRAILLE PATTERN DOTS-345 */
+ ["\u281D", "\u281D"], /* BRAILLE PATTERN DOTS-1345 */
+ ["\u281E", "\u281E"], /* BRAILLE PATTERN DOTS-2345 */
+ ["\u281F", "\u281F"], /* BRAILLE PATTERN DOTS-12345 */
+ ["\u2820", "\u2820"], /* BRAILLE PATTERN DOTS-6 */
+ ["\u2821", "\u2821"], /* BRAILLE PATTERN DOTS-16 */
+ ["\u2822", "\u2822"], /* BRAILLE PATTERN DOTS-26 */
+ ["\u2823", "\u2823"], /* BRAILLE PATTERN DOTS-126 */
+ ["\u2824", "\u2824"], /* BRAILLE PATTERN DOTS-36 */
+ ["\u2825", "\u2825"], /* BRAILLE PATTERN DOTS-136 */
+ ["\u2826", "\u2826"], /* BRAILLE PATTERN DOTS-236 */
+ ["\u2827", "\u2827"], /* BRAILLE PATTERN DOTS-1236 */
+ ["\u2828", "\u2828"], /* BRAILLE PATTERN DOTS-46 */
+ ["\u2829", "\u2829"], /* BRAILLE PATTERN DOTS-146 */
+ ["\u282A", "\u282A"], /* BRAILLE PATTERN DOTS-246 */
+ ["\u282B", "\u282B"], /* BRAILLE PATTERN DOTS-1246 */
+ ["\u282C", "\u282C"], /* BRAILLE PATTERN DOTS-346 */
+ ["\u282D", "\u282D"], /* BRAILLE PATTERN DOTS-1346 */
+ ["\u282E", "\u282E"], /* BRAILLE PATTERN DOTS-2346 */
+ ["\u282F", "\u282F"], /* BRAILLE PATTERN DOTS-12346 */
+ ["\u2830", "\u2830"], /* BRAILLE PATTERN DOTS-56 */
+ ["\u2831", "\u2831"], /* BRAILLE PATTERN DOTS-156 */
+ ["\u2832", "\u2832"], /* BRAILLE PATTERN DOTS-256 */
+ ["\u2833", "\u2833"], /* BRAILLE PATTERN DOTS-1256 */
+ ["\u2834", "\u2834"], /* BRAILLE PATTERN DOTS-356 */
+ ["\u2835", "\u2835"], /* BRAILLE PATTERN DOTS-1356 */
+ ["\u2836", "\u2836"], /* BRAILLE PATTERN DOTS-2356 */
+ ["\u2837", "\u2837"], /* BRAILLE PATTERN DOTS-12356 */
+ ["\u2838", "\u2838"], /* BRAILLE PATTERN DOTS-456 */
+ ["\u2839", "\u2839"], /* BRAILLE PATTERN DOTS-1456 */
+ ["\u283A", "\u283A"], /* BRAILLE PATTERN DOTS-2456 */
+ ["\u283B", "\u283B"], /* BRAILLE PATTERN DOTS-12456 */
+ ["\u283C", "\u283C"], /* BRAILLE PATTERN DOTS-3456 */
+ ["\u283D", "\u283D"], /* BRAILLE PATTERN DOTS-13456 */
+ ["\u283E", "\u283E"], /* BRAILLE PATTERN DOTS-23456 */
+ ["\u283F", "\u283F"], /* BRAILLE PATTERN DOTS-123456 */
+ ["\u2840", "\u2840"], /* BRAILLE PATTERN DOTS-7 */
+ ["\u2841", "\u2841"], /* BRAILLE PATTERN DOTS-17 */
+ ["\u2842", "\u2842"], /* BRAILLE PATTERN DOTS-27 */
+ ["\u2843", "\u2843"], /* BRAILLE PATTERN DOTS-127 */
+ ["\u2844", "\u2844"], /* BRAILLE PATTERN DOTS-37 */
+ ["\u2845", "\u2845"], /* BRAILLE PATTERN DOTS-137 */
+ ["\u2846", "\u2846"], /* BRAILLE PATTERN DOTS-237 */
+ ["\u2847", "\u2847"], /* BRAILLE PATTERN DOTS-1237 */
+ ["\u2848", "\u2848"], /* BRAILLE PATTERN DOTS-47 */
+ ["\u2849", "\u2849"], /* BRAILLE PATTERN DOTS-147 */
+ ["\u284A", "\u284A"], /* BRAILLE PATTERN DOTS-247 */
+ ["\u284B", "\u284B"], /* BRAILLE PATTERN DOTS-1247 */
+ ["\u284C", "\u284C"], /* BRAILLE PATTERN DOTS-347 */
+ ["\u284D", "\u284D"], /* BRAILLE PATTERN DOTS-1347 */
+ ["\u284E", "\u284E"], /* BRAILLE PATTERN DOTS-2347 */
+ ["\u284F", "\u284F"], /* BRAILLE PATTERN DOTS-12347 */
+ ["\u2850", "\u2850"], /* BRAILLE PATTERN DOTS-57 */
+ ["\u2851", "\u2851"], /* BRAILLE PATTERN DOTS-157 */
+ ["\u2852", "\u2852"], /* BRAILLE PATTERN DOTS-257 */
+ ["\u2853", "\u2853"], /* BRAILLE PATTERN DOTS-1257 */
+ ["\u2854", "\u2854"], /* BRAILLE PATTERN DOTS-357 */
+ ["\u2855", "\u2855"], /* BRAILLE PATTERN DOTS-1357 */
+ ["\u2856", "\u2856"], /* BRAILLE PATTERN DOTS-2357 */
+ ["\u2857", "\u2857"], /* BRAILLE PATTERN DOTS-12357 */
+ ["\u2858", "\u2858"], /* BRAILLE PATTERN DOTS-457 */
+ ["\u2859", "\u2859"], /* BRAILLE PATTERN DOTS-1457 */
+ ["\u285A", "\u285A"], /* BRAILLE PATTERN DOTS-2457 */
+ ["\u285B", "\u285B"], /* BRAILLE PATTERN DOTS-12457 */
+ ["\u285C", "\u285C"], /* BRAILLE PATTERN DOTS-3457 */
+ ["\u285D", "\u285D"], /* BRAILLE PATTERN DOTS-13457 */
+ ["\u285E", "\u285E"], /* BRAILLE PATTERN DOTS-23457 */
+ ["\u285F", "\u285F"], /* BRAILLE PATTERN DOTS-123457 */
+ ["\u2860", "\u2860"], /* BRAILLE PATTERN DOTS-67 */
+ ["\u2861", "\u2861"], /* BRAILLE PATTERN DOTS-167 */
+ ["\u2862", "\u2862"], /* BRAILLE PATTERN DOTS-267 */
+ ["\u2863", "\u2863"], /* BRAILLE PATTERN DOTS-1267 */
+ ["\u2864", "\u2864"], /* BRAILLE PATTERN DOTS-367 */
+ ["\u2865", "\u2865"], /* BRAILLE PATTERN DOTS-1367 */
+ ["\u2866", "\u2866"], /* BRAILLE PATTERN DOTS-2367 */
+ ["\u2867", "\u2867"], /* BRAILLE PATTERN DOTS-12367 */
+ ["\u2868", "\u2868"], /* BRAILLE PATTERN DOTS-467 */
+ ["\u2869", "\u2869"], /* BRAILLE PATTERN DOTS-1467 */
+ ["\u286A", "\u286A"], /* BRAILLE PATTERN DOTS-2467 */
+ ["\u286B", "\u286B"], /* BRAILLE PATTERN DOTS-12467 */
+ ["\u286C", "\u286C"], /* BRAILLE PATTERN DOTS-3467 */
+ ["\u286D", "\u286D"], /* BRAILLE PATTERN DOTS-13467 */
+ ["\u286E", "\u286E"], /* BRAILLE PATTERN DOTS-23467 */
+ ["\u286F", "\u286F"], /* BRAILLE PATTERN DOTS-123467 */
+ ["\u2870", "\u2870"], /* BRAILLE PATTERN DOTS-567 */
+ ["\u2871", "\u2871"], /* BRAILLE PATTERN DOTS-1567 */
+ ["\u2872", "\u2872"], /* BRAILLE PATTERN DOTS-2567 */
+ ["\u2873", "\u2873"], /* BRAILLE PATTERN DOTS-12567 */
+ ["\u2874", "\u2874"], /* BRAILLE PATTERN DOTS-3567 */
+ ["\u2875", "\u2875"], /* BRAILLE PATTERN DOTS-13567 */
+ ["\u2876", "\u2876"], /* BRAILLE PATTERN DOTS-23567 */
+ ["\u2877", "\u2877"], /* BRAILLE PATTERN DOTS-123567 */
+ ["\u2878", "\u2878"], /* BRAILLE PATTERN DOTS-4567 */
+ ["\u2879", "\u2879"], /* BRAILLE PATTERN DOTS-14567 */
+ ["\u287A", "\u287A"], /* BRAILLE PATTERN DOTS-24567 */
+ ["\u287B", "\u287B"], /* BRAILLE PATTERN DOTS-124567 */
+ ["\u287C", "\u287C"], /* BRAILLE PATTERN DOTS-34567 */
+ ["\u287D", "\u287D"], /* BRAILLE PATTERN DOTS-134567 */
+ ["\u287E", "\u287E"], /* BRAILLE PATTERN DOTS-234567 */
+ ["\u287F", "\u287F"], /* BRAILLE PATTERN DOTS-1234567 */
+ ["\u2880", "\u2880"], /* BRAILLE PATTERN DOTS-8 */
+ ["\u2881", "\u2881"], /* BRAILLE PATTERN DOTS-18 */
+ ["\u2882", "\u2882"], /* BRAILLE PATTERN DOTS-28 */
+ ["\u2883", "\u2883"], /* BRAILLE PATTERN DOTS-128 */
+ ["\u2884", "\u2884"], /* BRAILLE PATTERN DOTS-38 */
+ ["\u2885", "\u2885"], /* BRAILLE PATTERN DOTS-138 */
+ ["\u2886", "\u2886"], /* BRAILLE PATTERN DOTS-238 */
+ ["\u2887", "\u2887"], /* BRAILLE PATTERN DOTS-1238 */
+ ["\u2888", "\u2888"], /* BRAILLE PATTERN DOTS-48 */
+ ["\u2889", "\u2889"], /* BRAILLE PATTERN DOTS-148 */
+ ["\u288A", "\u288A"], /* BRAILLE PATTERN DOTS-248 */
+ ["\u288B", "\u288B"], /* BRAILLE PATTERN DOTS-1248 */
+ ["\u288C", "\u288C"], /* BRAILLE PATTERN DOTS-348 */
+ ["\u288D", "\u288D"], /* BRAILLE PATTERN DOTS-1348 */
+ ["\u288E", "\u288E"], /* BRAILLE PATTERN DOTS-2348 */
+ ["\u288F", "\u288F"], /* BRAILLE PATTERN DOTS-12348 */
+ ["\u2890", "\u2890"], /* BRAILLE PATTERN DOTS-58 */
+ ["\u2891", "\u2891"], /* BRAILLE PATTERN DOTS-158 */
+ ["\u2892", "\u2892"], /* BRAILLE PATTERN DOTS-258 */
+ ["\u2893", "\u2893"], /* BRAILLE PATTERN DOTS-1258 */
+ ["\u2894", "\u2894"], /* BRAILLE PATTERN DOTS-358 */
+ ["\u2895", "\u2895"], /* BRAILLE PATTERN DOTS-1358 */
+ ["\u2896", "\u2896"], /* BRAILLE PATTERN DOTS-2358 */
+ ["\u2897", "\u2897"], /* BRAILLE PATTERN DOTS-12358 */
+ ["\u2898", "\u2898"], /* BRAILLE PATTERN DOTS-458 */
+ ["\u2899", "\u2899"], /* BRAILLE PATTERN DOTS-1458 */
+ ["\u289A", "\u289A"], /* BRAILLE PATTERN DOTS-2458 */
+ ["\u289B", "\u289B"], /* BRAILLE PATTERN DOTS-12458 */
+ ["\u289C", "\u289C"], /* BRAILLE PATTERN DOTS-3458 */
+ ["\u289D", "\u289D"], /* BRAILLE PATTERN DOTS-13458 */
+ ["\u289E", "\u289E"], /* BRAILLE PATTERN DOTS-23458 */
+ ["\u289F", "\u289F"], /* BRAILLE PATTERN DOTS-123458 */
+ ["\u28A0", "\u28A0"], /* BRAILLE PATTERN DOTS-68 */
+ ["\u28A1", "\u28A1"], /* BRAILLE PATTERN DOTS-168 */
+ ["\u28A2", "\u28A2"], /* BRAILLE PATTERN DOTS-268 */
+ ["\u28A3", "\u28A3"], /* BRAILLE PATTERN DOTS-1268 */
+ ["\u28A4", "\u28A4"], /* BRAILLE PATTERN DOTS-368 */
+ ["\u28A5", "\u28A5"], /* BRAILLE PATTERN DOTS-1368 */
+ ["\u28A6", "\u28A6"], /* BRAILLE PATTERN DOTS-2368 */
+ ["\u28A7", "\u28A7"], /* BRAILLE PATTERN DOTS-12368 */
+ ["\u28A8", "\u28A8"], /* BRAILLE PATTERN DOTS-468 */
+ ["\u28A9", "\u28A9"], /* BRAILLE PATTERN DOTS-1468 */
+ ["\u28AA", "\u28AA"], /* BRAILLE PATTERN DOTS-2468 */
+ ["\u28AB", "\u28AB"], /* BRAILLE PATTERN DOTS-12468 */
+ ["\u28AC", "\u28AC"], /* BRAILLE PATTERN DOTS-3468 */
+ ["\u28AD", "\u28AD"], /* BRAILLE PATTERN DOTS-13468 */
+ ["\u28AE", "\u28AE"], /* BRAILLE PATTERN DOTS-23468 */
+ ["\u28AF", "\u28AF"], /* BRAILLE PATTERN DOTS-123468 */
+ ["\u28B0", "\u28B0"], /* BRAILLE PATTERN DOTS-568 */
+ ["\u28B1", "\u28B1"], /* BRAILLE PATTERN DOTS-1568 */
+ ["\u28B2", "\u28B2"], /* BRAILLE PATTERN DOTS-2568 */
+ ["\u28B3", "\u28B3"], /* BRAILLE PATTERN DOTS-12568 */
+ ["\u28B4", "\u28B4"], /* BRAILLE PATTERN DOTS-3568 */
+ ["\u28B5", "\u28B5"], /* BRAILLE PATTERN DOTS-13568 */
+ ["\u28B6", "\u28B6"], /* BRAILLE PATTERN DOTS-23568 */
+ ["\u28B7", "\u28B7"], /* BRAILLE PATTERN DOTS-123568 */
+ ["\u28B8", "\u28B8"], /* BRAILLE PATTERN DOTS-4568 */
+ ["\u28B9", "\u28B9"], /* BRAILLE PATTERN DOTS-14568 */
+ ["\u28BA", "\u28BA"], /* BRAILLE PATTERN DOTS-24568 */
+ ["\u28BB", "\u28BB"], /* BRAILLE PATTERN DOTS-124568 */
+ ["\u28BC", "\u28BC"], /* BRAILLE PATTERN DOTS-34568 */
+ ["\u28BD", "\u28BD"], /* BRAILLE PATTERN DOTS-134568 */
+ ["\u28BE", "\u28BE"], /* BRAILLE PATTERN DOTS-234568 */
+ ["\u28BF", "\u28BF"], /* BRAILLE PATTERN DOTS-1234568 */
+ ["\u28C0", "\u28C0"], /* BRAILLE PATTERN DOTS-78 */
+ ["\u28C1", "\u28C1"], /* BRAILLE PATTERN DOTS-178 */
+ ["\u28C2", "\u28C2"], /* BRAILLE PATTERN DOTS-278 */
+ ["\u28C3", "\u28C3"], /* BRAILLE PATTERN DOTS-1278 */
+ ["\u28C4", "\u28C4"], /* BRAILLE PATTERN DOTS-378 */
+ ["\u28C5", "\u28C5"], /* BRAILLE PATTERN DOTS-1378 */
+ ["\u28C6", "\u28C6"], /* BRAILLE PATTERN DOTS-2378 */
+ ["\u28C7", "\u28C7"], /* BRAILLE PATTERN DOTS-12378 */
+ ["\u28C8", "\u28C8"], /* BRAILLE PATTERN DOTS-478 */
+ ["\u28C9", "\u28C9"], /* BRAILLE PATTERN DOTS-1478 */
+ ["\u28CA", "\u28CA"], /* BRAILLE PATTERN DOTS-2478 */
+ ["\u28CB", "\u28CB"], /* BRAILLE PATTERN DOTS-12478 */
+ ["\u28CC", "\u28CC"], /* BRAILLE PATTERN DOTS-3478 */
+ ["\u28CD", "\u28CD"], /* BRAILLE PATTERN DOTS-13478 */
+ ["\u28CE", "\u28CE"], /* BRAILLE PATTERN DOTS-23478 */
+ ["\u28CF", "\u28CF"], /* BRAILLE PATTERN DOTS-123478 */
+ ["\u28D0", "\u28D0"], /* BRAILLE PATTERN DOTS-578 */
+ ["\u28D1", "\u28D1"], /* BRAILLE PATTERN DOTS-1578 */
+ ["\u28D2", "\u28D2"], /* BRAILLE PATTERN DOTS-2578 */
+ ["\u28D3", "\u28D3"], /* BRAILLE PATTERN DOTS-12578 */
+ ["\u28D4", "\u28D4"], /* BRAILLE PATTERN DOTS-3578 */
+ ["\u28D5", "\u28D5"], /* BRAILLE PATTERN DOTS-13578 */
+ ["\u28D6", "\u28D6"], /* BRAILLE PATTERN DOTS-23578 */
+ ["\u28D7", "\u28D7"], /* BRAILLE PATTERN DOTS-123578 */
+ ["\u28D8", "\u28D8"], /* BRAILLE PATTERN DOTS-4578 */
+ ["\u28D9", "\u28D9"], /* BRAILLE PATTERN DOTS-14578 */
+ ["\u28DA", "\u28DA"], /* BRAILLE PATTERN DOTS-24578 */
+ ["\u28DB", "\u28DB"], /* BRAILLE PATTERN DOTS-124578 */
+ ["\u28DC", "\u28DC"], /* BRAILLE PATTERN DOTS-34578 */
+ ["\u28DD", "\u28DD"], /* BRAILLE PATTERN DOTS-134578 */
+ ["\u28DE", "\u28DE"], /* BRAILLE PATTERN DOTS-234578 */
+ ["\u28DF", "\u28DF"], /* BRAILLE PATTERN DOTS-1234578 */
+ ["\u28E0", "\u28E0"], /* BRAILLE PATTERN DOTS-678 */
+ ["\u28E1", "\u28E1"], /* BRAILLE PATTERN DOTS-1678 */
+ ["\u28E2", "\u28E2"], /* BRAILLE PATTERN DOTS-2678 */
+ ["\u28E3", "\u28E3"], /* BRAILLE PATTERN DOTS-12678 */
+ ["\u28E4", "\u28E4"], /* BRAILLE PATTERN DOTS-3678 */
+ ["\u28E5", "\u28E5"], /* BRAILLE PATTERN DOTS-13678 */
+ ["\u28E6", "\u28E6"], /* BRAILLE PATTERN DOTS-23678 */
+ ["\u28E7", "\u28E7"], /* BRAILLE PATTERN DOTS-123678 */
+ ["\u28E8", "\u28E8"], /* BRAILLE PATTERN DOTS-4678 */
+ ["\u28E9", "\u28E9"], /* BRAILLE PATTERN DOTS-14678 */
+ ["\u28EA", "\u28EA"], /* BRAILLE PATTERN DOTS-24678 */
+ ["\u28EB", "\u28EB"], /* BRAILLE PATTERN DOTS-124678 */
+ ["\u28EC", "\u28EC"], /* BRAILLE PATTERN DOTS-34678 */
+ ["\u28ED", "\u28ED"], /* BRAILLE PATTERN DOTS-134678 */
+ ["\u28EE", "\u28EE"], /* BRAILLE PATTERN DOTS-234678 */
+ ["\u28EF", "\u28EF"], /* BRAILLE PATTERN DOTS-1234678 */
+ ["\u28F0", "\u28F0"], /* BRAILLE PATTERN DOTS-5678 */
+ ["\u28F1", "\u28F1"], /* BRAILLE PATTERN DOTS-15678 */
+ ["\u28F2", "\u28F2"], /* BRAILLE PATTERN DOTS-25678 */
+ ["\u28F3", "\u28F3"], /* BRAILLE PATTERN DOTS-125678 */
+ ["\u28F4", "\u28F4"], /* BRAILLE PATTERN DOTS-35678 */
+ ["\u28F5", "\u28F5"], /* BRAILLE PATTERN DOTS-135678 */
+ ["\u28F6", "\u28F6"], /* BRAILLE PATTERN DOTS-235678 */
+ ["\u28F7", "\u28F7"], /* BRAILLE PATTERN DOTS-1235678 */
+ ["\u28F8", "\u28F8"], /* BRAILLE PATTERN DOTS-45678 */
+ ["\u28F9", "\u28F9"], /* BRAILLE PATTERN DOTS-145678 */
+ ["\u28FA", "\u28FA"], /* BRAILLE PATTERN DOTS-245678 */
+ ["\u28FB", "\u28FB"], /* BRAILLE PATTERN DOTS-1245678 */
+ ["\u28FC", "\u28FC"], /* BRAILLE PATTERN DOTS-345678 */
+ ["\u28FD", "\u28FD"], /* BRAILLE PATTERN DOTS-1345678 */
+ ["\u28FE", "\u28FE"], /* BRAILLE PATTERN DOTS-2345678 */
+ ["\u28FF", "\u28FF"], /* BRAILLE PATTERN DOTS-12345678 */
+ ["\u2900", "\u2900"], /* RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE */
+ ["\u2901", "\u2901"], /* RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u2902", "\u2902"], /* LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE */
+ ["\u2903", "\u2903"], /* RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE */
+ ["\u2904", "\u2904"], /* LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE */
+ ["\u2905", "\u2905"], /* RIGHTWARDS TWO-HEADED ARROW FROM BAR */
+ ["\u2906", "\u2906"], /* LEFTWARDS DOUBLE ARROW FROM BAR */
+ ["\u2907", "\u2907"], /* RIGHTWARDS DOUBLE ARROW FROM BAR */
+ ["\u2908", "\u2908"], /* DOWNWARDS ARROW WITH HORIZONTAL STROKE */
+ ["\u2909", "\u2909"], /* UPWARDS ARROW WITH HORIZONTAL STROKE */
+ ["\u290A", "\u290A"], /* UPWARDS TRIPLE ARROW */
+ ["\u290B", "\u290B"], /* DOWNWARDS TRIPLE ARROW */
+ ["\u290C", "\u290C"], /* LEFTWARDS DOUBLE DASH ARROW */
+ ["\u290D", "\u290D"], /* RIGHTWARDS DOUBLE DASH ARROW */
+ ["\u290E", "\u290E"], /* LEFTWARDS TRIPLE DASH ARROW */
+ ["\u290F", "\u290F"], /* RIGHTWARDS TRIPLE DASH ARROW */
+ ["\u2910", "\u2910"], /* RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW */
+ ["\u2911", "\u2911"], /* RIGHTWARDS ARROW WITH DOTTED STEM */
+ ["\u2912", "\u2912"], /* UPWARDS ARROW TO BAR */
+ ["\u2913", "\u2913"], /* DOWNWARDS ARROW TO BAR */
+ ["\u2914", "\u2914"], /* RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE */
+ ["\u2915", "\u2915"], /* RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
+ ["\u2916", "\u2916"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL */
+ ["\u2917", "\u2917"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE */
+ ["\u2918", "\u2918"], /* RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
+ ["\u2919", "\u2919"], /* LEFTWARDS ARROW-TAIL */
+ ["\u291A", "\u291A"], /* RIGHTWARDS ARROW-TAIL */
+ ["\u291B", "\u291B"], /* LEFTWARDS DOUBLE ARROW-TAIL */
+ ["\u291C", "\u291C"], /* RIGHTWARDS DOUBLE ARROW-TAIL */
+ ["\u291D", "\u291D"], /* LEFTWARDS ARROW TO BLACK DIAMOND */
+ ["\u291E", "\u291E"], /* RIGHTWARDS ARROW TO BLACK DIAMOND */
+ ["\u291F", "\u291F"], /* LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND */
+ ["\u2920", "\u2920"], /* RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND */
+ ["\u2921", "\u2921"], /* NORTH WEST AND SOUTH EAST ARROW */
+ ["\u2922", "\u2922"], /* NORTH EAST AND SOUTH WEST ARROW */
+ ["\u2923", "\u2923"], /* NORTH WEST ARROW WITH HOOK */
+ ["\u2924", "\u2924"], /* NORTH EAST ARROW WITH HOOK */
+ ["\u2925", "\u2925"], /* SOUTH EAST ARROW WITH HOOK */
+ ["\u2926", "\u2926"], /* SOUTH WEST ARROW WITH HOOK */
+ ["\u2927", "\u2927"], /* NORTH WEST ARROW AND NORTH EAST ARROW */
+ ["\u2928", "\u2928"], /* NORTH EAST ARROW AND SOUTH EAST ARROW */
+ ["\u2929", "\u2929"], /* SOUTH EAST ARROW AND SOUTH WEST ARROW */
+ ["\u292A", "\u292A"], /* SOUTH WEST ARROW AND NORTH WEST ARROW */
+ ["\u292B", "\u292B"], /* RISING DIAGONAL CROSSING FALLING DIAGONAL */
+ ["\u292C", "\u292C"], /* FALLING DIAGONAL CROSSING RISING DIAGONAL */
+ ["\u292D", "\u292D"], /* SOUTH EAST ARROW CROSSING NORTH EAST ARROW */
+ ["\u292E", "\u292E"], /* NORTH EAST ARROW CROSSING SOUTH EAST ARROW */
+ ["\u292F", "\u292F"], /* FALLING DIAGONAL CROSSING NORTH EAST ARROW */
+ ["\u2930", "\u2930"], /* RISING DIAGONAL CROSSING SOUTH EAST ARROW */
+ ["\u2931", "\u2931"], /* NORTH EAST ARROW CROSSING NORTH WEST ARROW */
+ ["\u2932", "\u2932"], /* NORTH WEST ARROW CROSSING NORTH EAST ARROW */
+ ["\u2933", "\u2933"], /* WAVE ARROW POINTING DIRECTLY RIGHT */
+ ["\u2934", "\u2934"], /* ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS */
+ ["\u2935", "\u2935"], /* ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS */
+ ["\u2936", "\u2936"], /* ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS */
+ ["\u2937", "\u2937"], /* ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS */
+ ["\u2938", "\u2938"], /* RIGHT-SIDE ARC CLOCKWISE ARROW */
+ ["\u2939", "\u2939"], /* LEFT-SIDE ARC ANTICLOCKWISE ARROW */
+ ["\u293A", "\u293A"], /* TOP ARC ANTICLOCKWISE ARROW */
+ ["\u293B", "\u293B"], /* BOTTOM ARC ANTICLOCKWISE ARROW */
+ ["\u293C", "\u293C"], /* TOP ARC CLOCKWISE ARROW WITH MINUS */
+ ["\u293D", "\u293D"], /* TOP ARC ANTICLOCKWISE ARROW WITH PLUS */
+ ["\u293E", "\u293E"], /* LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW */
+ ["\u293F", "\u293F"], /* LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW */
+ ["\u2940", "\u2940"], /* ANTICLOCKWISE CLOSED CIRCLE ARROW */
+ ["\u2941", "\u2941"], /* CLOCKWISE CLOSED CIRCLE ARROW */
+ ["\u2942", "\u2942"], /* RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW */
+ ["\u2943", "\u2943"], /* LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW */
+ ["\u2944", "\u2944"], /* SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW */
+ ["\u2945", "\u2945"], /* RIGHTWARDS ARROW WITH PLUS BELOW */
+ ["\u2946", "\u2946"], /* LEFTWARDS ARROW WITH PLUS BELOW */
+ ["\u2947", "\u2947"], /* RIGHTWARDS ARROW THROUGH X */
+ ["\u2948", "\u2948"], /* LEFT RIGHT ARROW THROUGH SMALL CIRCLE */
+ ["\u2949", "\u2949"], /* UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE */
+ ["\u294A", "\u294A"], /* LEFT BARB UP RIGHT BARB DOWN HARPOON */
+ ["\u294B", "\u294B"], /* LEFT BARB DOWN RIGHT BARB UP HARPOON */
+ ["\u294C", "\u294C"], /* UP BARB RIGHT DOWN BARB LEFT HARPOON */
+ ["\u294D", "\u294D"], /* UP BARB LEFT DOWN BARB RIGHT HARPOON */
+ ["\u294E", "\u294E"], /* LEFT BARB UP RIGHT BARB UP HARPOON */
+ ["\u294F", "\u294F"], /* UP BARB RIGHT DOWN BARB RIGHT HARPOON */
+ ["\u2950", "\u2950"], /* LEFT BARB DOWN RIGHT BARB DOWN HARPOON */
+ ["\u2951", "\u2951"], /* UP BARB LEFT DOWN BARB LEFT HARPOON */
+ ["\u2952", "\u2952"], /* LEFTWARDS HARPOON WITH BARB UP TO BAR */
+ ["\u2953", "\u2953"], /* RIGHTWARDS HARPOON WITH BARB UP TO BAR */
+ ["\u2954", "\u2954"], /* UPWARDS HARPOON WITH BARB RIGHT TO BAR */
+ ["\u2955", "\u2955"], /* DOWNWARDS HARPOON WITH BARB RIGHT TO BAR */
+ ["\u2956", "\u2956"], /* LEFTWARDS HARPOON WITH BARB DOWN TO BAR */
+ ["\u2957", "\u2957"], /* RIGHTWARDS HARPOON WITH BARB DOWN TO BAR */
+ ["\u2958", "\u2958"], /* UPWARDS HARPOON WITH BARB LEFT TO BAR */
+ ["\u2959", "\u2959"], /* DOWNWARDS HARPOON WITH BARB LEFT TO BAR */
+ ["\u295A", "\u295A"], /* LEFTWARDS HARPOON WITH BARB UP FROM BAR */
+ ["\u295B", "\u295B"], /* RIGHTWARDS HARPOON WITH BARB UP FROM BAR */
+ ["\u295C", "\u295C"], /* UPWARDS HARPOON WITH BARB RIGHT FROM BAR */
+ ["\u295D", "\u295D"], /* DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR */
+ ["\u295E", "\u295E"], /* LEFTWARDS HARPOON WITH BARB DOWN FROM BAR */
+ ["\u295F", "\u295F"], /* RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR */
+ ["\u2960", "\u2960"], /* UPWARDS HARPOON WITH BARB LEFT FROM BAR */
+ ["\u2961", "\u2961"], /* DOWNWARDS HARPOON WITH BARB LEFT FROM BAR */
+ ["\u2962", "\u2962"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN */
+ ["\u2963", "\u2963"], /* UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT */
+ ["\u2964", "\u2964"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN */
+ ["\u2965", "\u2965"], /* DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT */
+ ["\u2966", "\u2966"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP */
+ ["\u2967", "\u2967"], /* LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN */
+ ["\u2968", "\u2968"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP */
+ ["\u2969", "\u2969"], /* RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN */
+ ["\u296A", "\u296A"], /* LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH */
+ ["\u296B", "\u296B"], /* LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH */
+ ["\u296C", "\u296C"], /* RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH */
+ ["\u296D", "\u296D"], /* RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH */
+ ["\u296E", "\u296E"], /* UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT */
+ ["\u296F", "\u296F"], /* DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT */
+ ["\u2970", "\u2970"], /* RIGHT DOUBLE ARROW WITH ROUNDED HEAD */
+ ["\u2971", "\u2971"], /* EQUALS SIGN ABOVE RIGHTWARDS ARROW */
+ ["\u2972", "\u2972"], /* TILDE OPERATOR ABOVE RIGHTWARDS ARROW */
+ ["\u2973", "\u2973"], /* LEFTWARDS ARROW ABOVE TILDE OPERATOR */
+ ["\u2974", "\u2974"], /* RIGHTWARDS ARROW ABOVE TILDE OPERATOR */
+ ["\u2975", "\u2975"], /* RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO */
+ ["\u2976", "\u2976"], /* LESS-THAN ABOVE LEFTWARDS ARROW */
+ ["\u2977", "\u2977"], /* LEFTWARDS ARROW THROUGH LESS-THAN */
+ ["\u2978", "\u2978"], /* GREATER-THAN ABOVE RIGHTWARDS ARROW */
+ ["\u2979", "\u2979"], /* SUBSET ABOVE RIGHTWARDS ARROW */
+ ["\u297A", "\u297A"], /* LEFTWARDS ARROW THROUGH SUBSET */
+ ["\u297B", "\u297B"], /* SUPERSET ABOVE LEFTWARDS ARROW */
+ ["\u297C", "\u297C"], /* LEFT FISH TAIL */
+ ["\u297D", "\u297D"], /* RIGHT FISH TAIL */
+ ["\u297E", "\u297E"], /* UP FISH TAIL */
+ ["\u297F", "\u297F"], /* DOWN FISH TAIL */
+ ["\u2980", "\u2980"], /* TRIPLE VERTICAL BAR DELIMITER */
+ ["\u2981", "\u2981"], /* Z NOTATION SPOT */
+ ["\u2982", "\u2982"], /* Z NOTATION TYPE COLON */
+ ["\u2983", "\u2983"], /* LEFT WHITE CURLY BRACKET */
+ ["\u2984", "\u2984"], /* RIGHT WHITE CURLY BRACKET */
+ ["\u2985", "\u2985"], /* LEFT WHITE PARENTHESIS */
+ ["\u2986", "\u2986"], /* RIGHT WHITE PARENTHESIS */
+ ["\u2987", "\u2987"], /* Z NOTATION LEFT IMAGE BRACKET */
+ ["\u2988", "\u2988"], /* Z NOTATION RIGHT IMAGE BRACKET */
+ ["\u2989", "\u2989"], /* Z NOTATION LEFT BINDING BRACKET */
+ ["\u298A", "\u298A"], /* Z NOTATION RIGHT BINDING BRACKET */
+ ["\u298B", "\u298B"], /* LEFT SQUARE BRACKET WITH UNDERBAR */
+ ["\u298C", "\u298C"], /* RIGHT SQUARE BRACKET WITH UNDERBAR */
+ ["\u298D", "\u298D"], /* LEFT SQUARE BRACKET WITH TICK IN TOP CORNER */
+ ["\u298E", "\u298E"], /* RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */
+ ["\u298F", "\u298F"], /* LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */
+ ["\u2990", "\u2990"], /* RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER */
+ ["\u2991", "\u2991"], /* LEFT ANGLE BRACKET WITH DOT */
+ ["\u2992", "\u2992"], /* RIGHT ANGLE BRACKET WITH DOT */
+ ["\u2993", "\u2993"], /* LEFT ARC LESS-THAN BRACKET */
+ ["\u2994", "\u2994"], /* RIGHT ARC GREATER-THAN BRACKET */
+ ["\u2995", "\u2995"], /* DOUBLE LEFT ARC GREATER-THAN BRACKET */
+ ["\u2996", "\u2996"], /* DOUBLE RIGHT ARC LESS-THAN BRACKET */
+ ["\u2997", "\u2997"], /* LEFT BLACK TORTOISE SHELL BRACKET */
+ ["\u2998", "\u2998"], /* RIGHT BLACK TORTOISE SHELL BRACKET */
+ ["\u2999", "\u2999"], /* DOTTED FENCE */
+ ["\u299A", "\u299A"], /* VERTICAL ZIGZAG LINE */
+ ["\u299B", "\u299B"], /* MEASURED ANGLE OPENING LEFT */
+ ["\u299C", "\u299C"], /* RIGHT ANGLE VARIANT WITH SQUARE */
+ ["\u299D", "\u299D"], /* MEASURED RIGHT ANGLE WITH DOT */
+ ["\u299E", "\u299E"], /* ANGLE WITH S INSIDE */
+ ["\u299F", "\u299F"], /* ACUTE ANGLE */
+ ["\u29A0", "\u29A0"], /* SPHERICAL ANGLE OPENING LEFT */
+ ["\u29A1", "\u29A1"], /* SPHERICAL ANGLE OPENING UP */
+ ["\u29A2", "\u29A2"], /* TURNED ANGLE */
+ ["\u29A3", "\u29A3"], /* REVERSED ANGLE */
+ ["\u29A4", "\u29A4"], /* ANGLE WITH UNDERBAR */
+ ["\u29A5", "\u29A5"], /* REVERSED ANGLE WITH UNDERBAR */
+ ["\u29A6", "\u29A6"], /* OBLIQUE ANGLE OPENING UP */
+ ["\u29A7", "\u29A7"], /* OBLIQUE ANGLE OPENING DOWN */
+ ["\u29A8", "\u29A8"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT */
+ ["\u29A9", "\u29A9"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT */
+ ["\u29AA", "\u29AA"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT */
+ ["\u29AB", "\u29AB"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT */
+ ["\u29AC", "\u29AC"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP */
+ ["\u29AD", "\u29AD"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP */
+ ["\u29AE", "\u29AE"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN */
+ ["\u29AF", "\u29AF"], /* MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN */
+ ["\u29B0", "\u29B0"], /* REVERSED EMPTY SET */
+ ["\u29B1", "\u29B1"], /* EMPTY SET WITH OVERBAR */
+ ["\u29B2", "\u29B2"], /* EMPTY SET WITH SMALL CIRCLE ABOVE */
+ ["\u29B3", "\u29B3"], /* EMPTY SET WITH RIGHT ARROW ABOVE */
+ ["\u29B4", "\u29B4"], /* EMPTY SET WITH LEFT ARROW ABOVE */
+ ["\u29B5", "\u29B5"], /* CIRCLE WITH HORIZONTAL BAR */
+ ["\u29B6", "\u29B6"], /* CIRCLED VERTICAL BAR */
+ ["\u29B7", "\u29B7"], /* CIRCLED PARALLEL */
+ ["\u29B8", "\u29B8"], /* CIRCLED REVERSE SOLIDUS */
+ ["\u29B9", "\u29B9"], /* CIRCLED PERPENDICULAR */
+ ["\u29BA", "\u29BA"], /* CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR */
+ ["\u29BB", "\u29BB"], /* CIRCLE WITH SUPERIMPOSED X */
+ ["\u29BC", "\u29BC"], /* CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN */
+ ["\u29BD", "\u29BD"], /* UP ARROW THROUGH CIRCLE */
+ ["\u29BE", "\u29BE"], /* CIRCLED WHITE BULLET */
+ ["\u29BF", "\u29BF"], /* CIRCLED BULLET */
+ ["\u29C0", "\u29C0"], /* CIRCLED LESS-THAN */
+ ["\u29C1", "\u29C1"], /* CIRCLED GREATER-THAN */
+ ["\u29C2", "\u29C2"], /* CIRCLE WITH SMALL CIRCLE TO THE RIGHT */
+ ["\u29C3", "\u29C3"], /* CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT */
+ ["\u29C4", "\u29C4"], /* SQUARED RISING DIAGONAL SLASH */
+ ["\u29C5", "\u29C5"], /* SQUARED FALLING DIAGONAL SLASH */
+ ["\u29C6", "\u29C6"], /* SQUARED ASTERISK */
+ ["\u29C7", "\u29C7"], /* SQUARED SMALL CIRCLE */
+ ["\u29C8", "\u29C8"], /* SQUARED SQUARE */
+ ["\u29C9", "\u29C9"], /* TWO JOINED SQUARES */
+ ["\u29CA", "\u29CA"], /* TRIANGLE WITH DOT ABOVE */
+ ["\u29CB", "\u29CB"], /* TRIANGLE WITH UNDERBAR */
+ ["\u29CC", "\u29CC"], /* S IN TRIANGLE */
+ ["\u29CD", "\u29CD"], /* TRIANGLE WITH SERIFS AT BOTTOM */
+ ["\u29CE", "\u29CE"], /* RIGHT TRIANGLE ABOVE LEFT TRIANGLE */
+ ["\u29CF", "\u29CF"], /* LEFT TRIANGLE BESIDE VERTICAL BAR */
+ ["\u29D0", "\u29D0"], /* VERTICAL BAR BESIDE RIGHT TRIANGLE */
+ ["\u29D1", "\u29D1"], /* BOWTIE WITH LEFT HALF BLACK */
+ ["\u29D2", "\u29D2"], /* BOWTIE WITH RIGHT HALF BLACK */
+ ["\u29D3", "\u29D3"], /* BLACK BOWTIE */
+ ["\u29D4", "\u29D4"], /* TIMES WITH LEFT HALF BLACK */
+ ["\u29D5", "\u29D5"], /* TIMES WITH RIGHT HALF BLACK */
+ ["\u29D6", "\u29D6"], /* WHITE HOURGLASS */
+ ["\u29D7", "\u29D7"], /* BLACK HOURGLASS */
+ ["\u29D8", "\u29D8"], /* LEFT WIGGLY FENCE */
+ ["\u29D9", "\u29D9"], /* RIGHT WIGGLY FENCE */
+ ["\u29DA", "\u29DA"], /* LEFT DOUBLE WIGGLY FENCE */
+ ["\u29DB", "\u29DB"], /* RIGHT DOUBLE WIGGLY FENCE */
+ ["\u29DC", "\u29DC"], /* INCOMPLETE INFINITY */
+ ["\u29DD", "\u29DD"], /* TIE OVER INFINITY */
+ ["\u29DE", "\u29DE"], /* INFINITY NEGATED WITH VERTICAL BAR */
+ ["\u29DF", "\u29DF"], /* DOUBLE-ENDED MULTIMAP */
+ ["\u29E0", "\u29E0"], /* SQUARE WITH CONTOURED OUTLINE */
+ ["\u29E1", "\u29E1"], /* INCREASES AS */
+ ["\u29E2", "\u29E2"], /* SHUFFLE PRODUCT */
+ ["\u29E3", "\u29E3"], /* EQUALS SIGN AND SLANTED PARALLEL */
+ ["\u29E4", "\u29E4"], /* EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE */
+ ["\u29E5", "\u29E5"], /* IDENTICAL TO AND SLANTED PARALLEL */
+ ["\u29E6", "\u29E6"], /* GLEICH STARK */
+ ["\u29E7", "\u29E7"], /* THERMODYNAMIC */
+ ["\u29E8", "\u29E8"], /* DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK */
+ ["\u29E9", "\u29E9"], /* DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK */
+ ["\u29EA", "\u29EA"], /* BLACK DIAMOND WITH DOWN ARROW */
+ ["\u29EB", "\u29EB"], /* BLACK LOZENGE */
+ ["\u29EC", "\u29EC"], /* WHITE CIRCLE WITH DOWN ARROW */
+ ["\u29ED", "\u29ED"], /* BLACK CIRCLE WITH DOWN ARROW */
+ ["\u29EE", "\u29EE"], /* ERROR-BARRED WHITE SQUARE */
+ ["\u29EF", "\u29EF"], /* ERROR-BARRED BLACK SQUARE */
+ ["\u29F0", "\u29F0"], /* ERROR-BARRED WHITE DIAMOND */
+ ["\u29F1", "\u29F1"], /* ERROR-BARRED BLACK DIAMOND */
+ ["\u29F2", "\u29F2"], /* ERROR-BARRED WHITE CIRCLE */
+ ["\u29F3", "\u29F3"], /* ERROR-BARRED BLACK CIRCLE */
+ ["\u29F4", "\u29F4"], /* RULE-DELAYED */
+ ["\u29F5", "\u29F5"], /* REVERSE SOLIDUS OPERATOR */
+ ["\u29F6", "\u29F6"], /* SOLIDUS WITH OVERBAR */
+ ["\u29F7", "\u29F7"], /* REVERSE SOLIDUS WITH HORIZONTAL STROKE */
+ ["\u29F8", "\u29F8"], /* BIG SOLIDUS */
+ ["\u29F9", "\u29F9"], /* BIG REVERSE SOLIDUS */
+ ["\u29FA", "\u29FA"], /* DOUBLE PLUS */
+ ["\u29FB", "\u29FB"], /* TRIPLE PLUS */
+ ["\u29FC", "\u29FC"], /* LEFT-POINTING CURVED ANGLE BRACKET */
+ ["\u29FD", "\u29FD"], /* RIGHT-POINTING CURVED ANGLE BRACKET */
+ ["\u29FE", "\u29FE"], /* TINY */
+ ["\u29FF", "\u29FF"], /* MINY */
+ ["\u2A00", "\u2A00"], /* N-ARY CIRCLED DOT OPERATOR */
+ ["\u2A01", "\u2A01"], /* N-ARY CIRCLED PLUS OPERATOR */
+ ["\u2A02", "\u2A02"], /* N-ARY CIRCLED TIMES OPERATOR */
+ ["\u2A03", "\u2A03"], /* N-ARY UNION OPERATOR WITH DOT */
+ ["\u2A04", "\u2A04"], /* N-ARY UNION OPERATOR WITH PLUS */
+ ["\u2A05", "\u2A05"], /* N-ARY SQUARE INTERSECTION OPERATOR */
+ ["\u2A06", "\u2A06"], /* N-ARY SQUARE UNION OPERATOR */
+ ["\u2A07", "\u2A07"], /* TWO LOGICAL AND OPERATOR */
+ ["\u2A08", "\u2A08"], /* TWO LOGICAL OR OPERATOR */
+ ["\u2A09", "\u2A09"], /* N-ARY TIMES OPERATOR */
+ ["\u2A0A", "\u2A0A"], /* MODULO TWO SUM */
+ ["\u2A0B", "\u2A0B"], /* SUMMATION WITH INTEGRAL */
+ ["\u2A0C", "\u2A0C"], /* QUADRUPLE INTEGRAL OPERATOR */
+ ["\u2A0D", "\u2A0D"], /* FINITE PART INTEGRAL */
+ ["\u2A0E", "\u2A0E"], /* INTEGRAL WITH DOUBLE STROKE */
+ ["\u2A0F", "\u2A0F"], /* INTEGRAL AVERAGE WITH SLASH */
+ ["\u2A10", "\u2A10"], /* CIRCULATION FUNCTION */
+ ["\u2A11", "\u2A11"], /* ANTICLOCKWISE INTEGRATION */
+ ["\u2A12", "\u2A12"], /* LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE */
+ ["\u2A13", "\u2A13"], /* LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE */
+ ["\u2A14", "\u2A14"], /* LINE INTEGRATION NOT INCLUDING THE POLE */
+ ["\u2A15", "\u2A15"], /* INTEGRAL AROUND A POINT OPERATOR */
+ ["\u2A16", "\u2A16"], /* QUATERNION INTEGRAL OPERATOR */
+ ["\u2A17", "\u2A17"], /* INTEGRAL WITH LEFTWARDS ARROW WITH HOOK */
+ ["\u2A18", "\u2A18"], /* INTEGRAL WITH TIMES SIGN */
+ ["\u2A19", "\u2A19"], /* INTEGRAL WITH INTERSECTION */
+ ["\u2A1A", "\u2A1A"], /* INTEGRAL WITH UNION */
+ ["\u2A1B", "\u2A1B"], /* INTEGRAL WITH OVERBAR */
+ ["\u2A1C", "\u2A1C"], /* INTEGRAL WITH UNDERBAR */
+ ["\u2A1D", "\u2A1D"], /* JOIN */
+ ["\u2A1E", "\u2A1E"], /* LARGE LEFT TRIANGLE OPERATOR */
+ ["\u2A1F", "\u2A1F"], /* Z NOTATION SCHEMA COMPOSITION */
+ ["\u2A20", "\u2A20"], /* Z NOTATION SCHEMA PIPING */
+ ["\u2A21", "\u2A21"], /* Z NOTATION SCHEMA PROJECTION */
+ ["\u2A22", "\u2A22"], /* PLUS SIGN WITH SMALL CIRCLE ABOVE */
+ ["\u2A23", "\u2A23"], /* PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE */
+ ["\u2A24", "\u2A24"], /* PLUS SIGN WITH TILDE ABOVE */
+ ["\u2A25", "\u2A25"], /* PLUS SIGN WITH DOT BELOW */
+ ["\u2A26", "\u2A26"], /* PLUS SIGN WITH TILDE BELOW */
+ ["\u2A27", "\u2A27"], /* PLUS SIGN WITH SUBSCRIPT TWO */
+ ["\u2A28", "\u2A28"], /* PLUS SIGN WITH BLACK TRIANGLE */
+ ["\u2A29", "\u2A29"], /* MINUS SIGN WITH COMMA ABOVE */
+ ["\u2A2A", "\u2A2A"], /* MINUS SIGN WITH DOT BELOW */
+ ["\u2A2B", "\u2A2B"], /* MINUS SIGN WITH FALLING DOTS */
+ ["\u2A2C", "\u2A2C"], /* MINUS SIGN WITH RISING DOTS */
+ ["\u2A2D", "\u2A2D"], /* PLUS SIGN IN LEFT HALF CIRCLE */
+ ["\u2A2E", "\u2A2E"], /* PLUS SIGN IN RIGHT HALF CIRCLE */
+ ["\u2A2F", "\u2A2F"], /* VECTOR OR CROSS PRODUCT */
+ ["\u2A30", "\u2A30"], /* MULTIPLICATION SIGN WITH DOT ABOVE */
+ ["\u2A31", "\u2A31"], /* MULTIPLICATION SIGN WITH UNDERBAR */
+ ["\u2A32", "\u2A32"], /* SEMIDIRECT PRODUCT WITH BOTTOM CLOSED */
+ ["\u2A33", "\u2A33"], /* SMASH PRODUCT */
+ ["\u2A34", "\u2A34"], /* MULTIPLICATION SIGN IN LEFT HALF CIRCLE */
+ ["\u2A35", "\u2A35"], /* MULTIPLICATION SIGN IN RIGHT HALF CIRCLE */
+ ["\u2A36", "\u2A36"], /* CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT */
+ ["\u2A37", "\u2A37"], /* MULTIPLICATION SIGN IN DOUBLE CIRCLE */
+ ["\u2A38", "\u2A38"], /* CIRCLED DIVISION SIGN */
+ ["\u2A39", "\u2A39"], /* PLUS SIGN IN TRIANGLE */
+ ["\u2A3A", "\u2A3A"], /* MINUS SIGN IN TRIANGLE */
+ ["\u2A3B", "\u2A3B"], /* MULTIPLICATION SIGN IN TRIANGLE */
+ ["\u2A3C", "\u2A3C"], /* INTERIOR PRODUCT */
+ ["\u2A3D", "\u2A3D"], /* RIGHTHAND INTERIOR PRODUCT */
+ ["\u2A3E", "\u2A3E"], /* Z NOTATION RELATIONAL COMPOSITION */
+ ["\u2A3F", "\u2A3F"], /* AMALGAMATION OR COPRODUCT */
+ ["\u2A40", "\u2A40"], /* INTERSECTION WITH DOT */
+ ["\u2A41", "\u2A41"], /* UNION WITH MINUS SIGN */
+ ["\u2A42", "\u2A42"], /* UNION WITH OVERBAR */
+ ["\u2A43", "\u2A43"], /* INTERSECTION WITH OVERBAR */
+ ["\u2A44", "\u2A44"], /* INTERSECTION WITH LOGICAL AND */
+ ["\u2A45", "\u2A45"], /* UNION WITH LOGICAL OR */
+ ["\u2A46", "\u2A46"], /* UNION ABOVE INTERSECTION */
+ ["\u2A47", "\u2A47"], /* INTERSECTION ABOVE UNION */
+ ["\u2A48", "\u2A48"], /* UNION ABOVE BAR ABOVE INTERSECTION */
+ ["\u2A49", "\u2A49"], /* INTERSECTION ABOVE BAR ABOVE UNION */
+ ["\u2A4A", "\u2A4A"], /* UNION BESIDE AND JOINED WITH UNION */
+ ["\u2A4B", "\u2A4B"], /* INTERSECTION BESIDE AND JOINED WITH INTERSECTION */
+ ["\u2A4C", "\u2A4C"], /* CLOSED UNION WITH SERIFS */
+ ["\u2A4D", "\u2A4D"], /* CLOSED INTERSECTION WITH SERIFS */
+ ["\u2A4E", "\u2A4E"], /* DOUBLE SQUARE INTERSECTION */
+ ["\u2A4F", "\u2A4F"], /* DOUBLE SQUARE UNION */
+ ["\u2A50", "\u2A50"], /* CLOSED UNION WITH SERIFS AND SMASH PRODUCT */
+ ["\u2A51", "\u2A51"], /* LOGICAL AND WITH DOT ABOVE */
+ ["\u2A52", "\u2A52"], /* LOGICAL OR WITH DOT ABOVE */
+ ["\u2A53", "\u2A53"], /* DOUBLE LOGICAL AND */
+ ["\u2A54", "\u2A54"], /* DOUBLE LOGICAL OR */
+ ["\u2A55", "\u2A55"], /* TWO INTERSECTING LOGICAL AND */
+ ["\u2A56", "\u2A56"], /* TWO INTERSECTING LOGICAL OR */
+ ["\u2A57", "\u2A57"], /* SLOPING LARGE OR */
+ ["\u2A58", "\u2A58"], /* SLOPING LARGE AND */
+ ["\u2A59", "\u2A59"], /* LOGICAL OR OVERLAPPING LOGICAL AND */
+ ["\u2A5A", "\u2A5A"], /* LOGICAL AND WITH MIDDLE STEM */
+ ["\u2A5B", "\u2A5B"], /* LOGICAL OR WITH MIDDLE STEM */
+ ["\u2A5C", "\u2A5C"], /* LOGICAL AND WITH HORIZONTAL DASH */
+ ["\u2A5D", "\u2A5D"], /* LOGICAL OR WITH HORIZONTAL DASH */
+ ["\u2A5E", "\u2A5E"], /* LOGICAL AND WITH DOUBLE OVERBAR */
+ ["\u2A5F", "\u2A5F"], /* LOGICAL AND WITH UNDERBAR */
+ ["\u2A60", "\u2A60"], /* LOGICAL AND WITH DOUBLE UNDERBAR */
+ ["\u2A61", "\u2A61"], /* SMALL VEE WITH UNDERBAR */
+ ["\u2A62", "\u2A62"], /* LOGICAL OR WITH DOUBLE OVERBAR */
+ ["\u2A63", "\u2A63"], /* LOGICAL OR WITH DOUBLE UNDERBAR */
+ ["\u2A64", "\u2A64"], /* Z NOTATION DOMAIN ANTIRESTRICTION */
+ ["\u2A65", "\u2A65"], /* Z NOTATION RANGE ANTIRESTRICTION */
+ ["\u2A66", "\u2A66"], /* EQUALS SIGN WITH DOT BELOW */
+ ["\u2A67", "\u2A67"], /* IDENTICAL WITH DOT ABOVE */
+ ["\u2A68", "\u2A68"], /* TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE */
+ ["\u2A69", "\u2A69"], /* TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE */
+ ["\u2A6A", "\u2A6A"], /* TILDE OPERATOR WITH DOT ABOVE */
+ ["\u2A6B", "\u2A6B"], /* TILDE OPERATOR WITH RISING DOTS */
+ ["\u2A6C", "\u2A6C"], /* SIMILAR MINUS SIMILAR */
+ ["\u2A6D", "\u2A6D"], /* CONGRUENT WITH DOT ABOVE */
+ ["\u2A6E", "\u2A6E"], /* EQUALS WITH ASTERISK */
+ ["\u2A6F", "\u2A6F"], /* ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT */
+ ["\u2A70", "\u2A70"], /* APPROXIMATELY EQUAL OR EQUAL TO */
+ ["\u2A71", "\u2A71"], /* EQUALS SIGN ABOVE PLUS SIGN */
+ ["\u2A72", "\u2A72"], /* PLUS SIGN ABOVE EQUALS SIGN */
+ ["\u2A73", "\u2A73"], /* EQUALS SIGN ABOVE TILDE OPERATOR */
+ ["\u2A74", "\u2A74"], /* DOUBLE COLON EQUAL */
+ ["\u2A75", "\u2A75"], /* TWO CONSECUTIVE EQUALS SIGNS */
+ ["\u2A76", "\u2A76"], /* THREE CONSECUTIVE EQUALS SIGNS */
+ ["\u2A77", "\u2A77"], /* EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW */
+ ["\u2A78", "\u2A78"], /* EQUIVALENT WITH FOUR DOTS ABOVE */
+ ["\u2A79", "\u2A79"], /* LESS-THAN WITH CIRCLE INSIDE */
+ ["\u2A7A", "\u2A7A"], /* GREATER-THAN WITH CIRCLE INSIDE */
+ ["\u2A7B", "\u2A7B"], /* LESS-THAN WITH QUESTION MARK ABOVE */
+ ["\u2A7C", "\u2A7C"], /* GREATER-THAN WITH QUESTION MARK ABOVE */
+ ["\u2A7D", "\u2A7D"], /* LESS-THAN OR SLANTED EQUAL TO */
+ ["\u2A7E", "\u2A7E"], /* GREATER-THAN OR SLANTED EQUAL TO */
+ ["\u2A7F", "\u2A7F"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */
+ ["\u2A80", "\u2A80"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */
+ ["\u2A81", "\u2A81"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */
+ ["\u2A82", "\u2A82"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */
+ ["\u2A83", "\u2A83"], /* LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT */
+ ["\u2A84", "\u2A84"], /* GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT */
+ ["\u2A85", "\u2A85"], /* LESS-THAN OR APPROXIMATE */
+ ["\u2A86", "\u2A86"], /* GREATER-THAN OR APPROXIMATE */
+ ["\u2A87", "\u2A87"], /* LESS-THAN AND SINGLE-LINE NOT EQUAL TO */
+ ["\u2A88", "\u2A88"], /* GREATER-THAN AND SINGLE-LINE NOT EQUAL TO */
+ ["\u2A89", "\u2A89"], /* LESS-THAN AND NOT APPROXIMATE */
+ ["\u2A8A", "\u2A8A"], /* GREATER-THAN AND NOT APPROXIMATE */
+ ["\u2A8B", "\u2A8B"], /* LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN */
+ ["\u2A8C", "\u2A8C"], /* GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN */
+ ["\u2A8D", "\u2A8D"], /* LESS-THAN ABOVE SIMILAR OR EQUAL */
+ ["\u2A8E", "\u2A8E"], /* GREATER-THAN ABOVE SIMILAR OR EQUAL */
+ ["\u2A8F", "\u2A8F"], /* LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN */
+ ["\u2A90", "\u2A90"], /* GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN */
+ ["\u2A91", "\u2A91"], /* LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL */
+ ["\u2A92", "\u2A92"], /* GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL */
+ ["\u2A93", "\u2A93"], /* LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL */
+ ["\u2A94", "\u2A94"], /* GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL */
+ ["\u2A95", "\u2A95"], /* SLANTED EQUAL TO OR LESS-THAN */
+ ["\u2A96", "\u2A96"], /* SLANTED EQUAL TO OR GREATER-THAN */
+ ["\u2A97", "\u2A97"], /* SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE */
+ ["\u2A98", "\u2A98"], /* SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE */
+ ["\u2A99", "\u2A99"], /* DOUBLE-LINE EQUAL TO OR LESS-THAN */
+ ["\u2A9A", "\u2A9A"], /* DOUBLE-LINE EQUAL TO OR GREATER-THAN */
+ ["\u2A9B", "\u2A9B"], /* DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN */
+ ["\u2A9C", "\u2A9C"], /* DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN */
+ ["\u2A9D", "\u2A9D"], /* SIMILAR OR LESS-THAN */
+ ["\u2A9E", "\u2A9E"], /* SIMILAR OR GREATER-THAN */
+ ["\u2A9F", "\u2A9F"], /* SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN */
+ ["\u2AA0", "\u2AA0"], /* SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN */
+ ["\u2AA1", "\u2AA1"], /* DOUBLE NESTED LESS-THAN */
+ ["\u2AA2", "\u2AA2"], /* DOUBLE NESTED GREATER-THAN */
+ ["\u2AA3", "\u2AA3"], /* DOUBLE NESTED LESS-THAN WITH UNDERBAR */
+ ["\u2AA4", "\u2AA4"], /* GREATER-THAN OVERLAPPING LESS-THAN */
+ ["\u2AA5", "\u2AA5"], /* GREATER-THAN BESIDE LESS-THAN */
+ ["\u2AA6", "\u2AA6"], /* LESS-THAN CLOSED BY CURVE */
+ ["\u2AA7", "\u2AA7"], /* GREATER-THAN CLOSED BY CURVE */
+ ["\u2AA8", "\u2AA8"], /* LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */
+ ["\u2AA9", "\u2AA9"], /* GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */
+ ["\u2AAA", "\u2AAA"], /* SMALLER THAN */
+ ["\u2AAB", "\u2AAB"], /* LARGER THAN */
+ ["\u2AAC", "\u2AAC"], /* SMALLER THAN OR EQUAL TO */
+ ["\u2AAD", "\u2AAD"], /* LARGER THAN OR EQUAL TO */
+ ["\u2AAE", "\u2AAE"], /* EQUALS SIGN WITH BUMPY ABOVE */
+ ["\u2AAF", "\u2AAF"], /* PRECEDES ABOVE SINGLE-LINE EQUALS SIGN */
+ ["\u2AB0", "\u2AB0"], /* SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN */
+ ["\u2AB1", "\u2AB1"], /* PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO */
+ ["\u2AB2", "\u2AB2"], /* SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO */
+ ["\u2AB3", "\u2AB3"], /* PRECEDES ABOVE EQUALS SIGN */
+ ["\u2AB4", "\u2AB4"], /* SUCCEEDS ABOVE EQUALS SIGN */
+ ["\u2AB5", "\u2AB5"], /* PRECEDES ABOVE NOT EQUAL TO */
+ ["\u2AB6", "\u2AB6"], /* SUCCEEDS ABOVE NOT EQUAL TO */
+ ["\u2AB7", "\u2AB7"], /* PRECEDES ABOVE ALMOST EQUAL TO */
+ ["\u2AB8", "\u2AB8"], /* SUCCEEDS ABOVE ALMOST EQUAL TO */
+ ["\u2AB9", "\u2AB9"], /* PRECEDES ABOVE NOT ALMOST EQUAL TO */
+ ["\u2ABA", "\u2ABA"], /* SUCCEEDS ABOVE NOT ALMOST EQUAL TO */
+ ["\u2ABB", "\u2ABB"], /* DOUBLE PRECEDES */
+ ["\u2ABC", "\u2ABC"], /* DOUBLE SUCCEEDS */
+ ["\u2ABD", "\u2ABD"], /* SUBSET WITH DOT */
+ ["\u2ABE", "\u2ABE"], /* SUPERSET WITH DOT */
+ ["\u2ABF", "\u2ABF"], /* SUBSET WITH PLUS SIGN BELOW */
+ ["\u2AC0", "\u2AC0"], /* SUPERSET WITH PLUS SIGN BELOW */
+ ["\u2AC1", "\u2AC1"], /* SUBSET WITH MULTIPLICATION SIGN BELOW */
+ ["\u2AC2", "\u2AC2"], /* SUPERSET WITH MULTIPLICATION SIGN BELOW */
+ ["\u2AC3", "\u2AC3"], /* SUBSET OF OR EQUAL TO WITH DOT ABOVE */
+ ["\u2AC4", "\u2AC4"], /* SUPERSET OF OR EQUAL TO WITH DOT ABOVE */
+ ["\u2AC5", "\u2AC5"], /* SUBSET OF ABOVE EQUALS SIGN */
+ ["\u2AC6", "\u2AC6"], /* SUPERSET OF ABOVE EQUALS SIGN */
+ ["\u2AC7", "\u2AC7"], /* SUBSET OF ABOVE TILDE OPERATOR */
+ ["\u2AC8", "\u2AC8"], /* SUPERSET OF ABOVE TILDE OPERATOR */
+ ["\u2AC9", "\u2AC9"], /* SUBSET OF ABOVE ALMOST EQUAL TO */
+ ["\u2ACA", "\u2ACA"], /* SUPERSET OF ABOVE ALMOST EQUAL TO */
+ ["\u2ACB", "\u2ACB"], /* SUBSET OF ABOVE NOT EQUAL TO */
+ ["\u2ACC", "\u2ACC"], /* SUPERSET OF ABOVE NOT EQUAL TO */
+ ["\u2ACD", "\u2ACD"], /* SQUARE LEFT OPEN BOX OPERATOR */
+ ["\u2ACE", "\u2ACE"], /* SQUARE RIGHT OPEN BOX OPERATOR */
+ ["\u2ACF", "\u2ACF"], /* CLOSED SUBSET */
+ ["\u2AD0", "\u2AD0"], /* CLOSED SUPERSET */
+ ["\u2AD1", "\u2AD1"], /* CLOSED SUBSET OR EQUAL TO */
+ ["\u2AD2", "\u2AD2"], /* CLOSED SUPERSET OR EQUAL TO */
+ ["\u2AD3", "\u2AD3"], /* SUBSET ABOVE SUPERSET */
+ ["\u2AD4", "\u2AD4"], /* SUPERSET ABOVE SUBSET */
+ ["\u2AD5", "\u2AD5"], /* SUBSET ABOVE SUBSET */
+ ["\u2AD6", "\u2AD6"], /* SUPERSET ABOVE SUPERSET */
+ ["\u2AD7", "\u2AD7"], /* SUPERSET BESIDE SUBSET */
+ ["\u2AD8", "\u2AD8"], /* SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET */
+ ["\u2AD9", "\u2AD9"], /* ELEMENT OF OPENING DOWNWARDS */
+ ["\u2ADA", "\u2ADA"], /* PITCHFORK WITH TEE TOP */
+ ["\u2ADB", "\u2ADB"], /* TRANSVERSAL INTERSECTION */
+ ["\u2ADC", "\u2ADC"], /* FORKING */
+ ["\u2ADD", "\u2ADD"], /* NONFORKING */
+ ["\u2ADE", "\u2ADE"], /* SHORT LEFT TACK */
+ ["\u2ADF", "\u2ADF"], /* SHORT DOWN TACK */
+ ["\u2AE0", "\u2AE0"], /* SHORT UP TACK */
+ ["\u2AE1", "\u2AE1"], /* PERPENDICULAR WITH S */
+ ["\u2AE2", "\u2AE2"], /* VERTICAL BAR TRIPLE RIGHT TURNSTILE */
+ ["\u2AE3", "\u2AE3"], /* DOUBLE VERTICAL BAR LEFT TURNSTILE */
+ ["\u2AE4", "\u2AE4"], /* VERTICAL BAR DOUBLE LEFT TURNSTILE */
+ ["\u2AE5", "\u2AE5"], /* DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE */
+ ["\u2AE6", "\u2AE6"], /* LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL */
+ ["\u2AE7", "\u2AE7"], /* SHORT DOWN TACK WITH OVERBAR */
+ ["\u2AE8", "\u2AE8"], /* SHORT UP TACK WITH UNDERBAR */
+ ["\u2AE9", "\u2AE9"], /* SHORT UP TACK ABOVE SHORT DOWN TACK */
+ ["\u2AEA", "\u2AEA"], /* DOUBLE DOWN TACK */
+ ["\u2AEB", "\u2AEB"], /* DOUBLE UP TACK */
+ ["\u2AEC", "\u2AEC"], /* DOUBLE STROKE NOT SIGN */
+ ["\u2AED", "\u2AED"], /* REVERSED DOUBLE STROKE NOT SIGN */
+ ["\u2AEE", "\u2AEE"], /* DOES NOT DIVIDE WITH REVERSED NEGATION SLASH */
+ ["\u2AEF", "\u2AEF"], /* VERTICAL LINE WITH CIRCLE ABOVE */
+ ["\u2AF0", "\u2AF0"], /* VERTICAL LINE WITH CIRCLE BELOW */
+ ["\u2AF1", "\u2AF1"], /* DOWN TACK WITH CIRCLE BELOW */
+ ["\u2AF2", "\u2AF2"], /* PARALLEL WITH HORIZONTAL STROKE */
+ ["\u2AF3", "\u2AF3"], /* PARALLEL WITH TILDE OPERATOR */
+ ["\u2AF4", "\u2AF4"], /* TRIPLE VERTICAL BAR BINARY RELATION */
+ ["\u2AF5", "\u2AF5"], /* TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE */
+ ["\u2AF6", "\u2AF6"], /* TRIPLE COLON OPERATOR */
+ ["\u2AF7", "\u2AF7"], /* TRIPLE NESTED LESS-THAN */
+ ["\u2AF8", "\u2AF8"], /* TRIPLE NESTED GREATER-THAN */
+ ["\u2AF9", "\u2AF9"], /* DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO */
+ ["\u2AFA", "\u2AFA"], /* DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO */
+ ["\u2AFB", "\u2AFB"], /* TRIPLE SOLIDUS BINARY RELATION */
+ ["\u2AFC", "\u2AFC"], /* LARGE TRIPLE VERTICAL BAR OPERATOR */
+ ["\u2AFD", "\u2AFD"], /* DOUBLE SOLIDUS OPERATOR */
+ ["\u2AFE", "\u2AFE"], /* WHITE VERTICAL BAR */
+ ["\u2AFF", "\u2AFF"], /* N-ARY WHITE VERTICAL BAR */
+ ["\u2B00", "\u2B00"], /* NORTH EAST WHITE ARROW */
+ ["\u2B01", "\u2B01"], /* NORTH WEST WHITE ARROW */
+ ["\u2B02", "\u2B02"], /* SOUTH EAST WHITE ARROW */
+ ["\u2B03", "\u2B03"], /* SOUTH WEST WHITE ARROW */
+ ["\u2B04", "\u2B04"], /* LEFT RIGHT WHITE ARROW */
+ ["\u2B05", "\u2B05"], /* LEFTWARDS BLACK ARROW */
+ ["\u2B06", "\u2B06"], /* UPWARDS BLACK ARROW */
+ ["\u2B07", "\u2B07"], /* DOWNWARDS BLACK ARROW */
+ ["\u2B08", "\u2B08"], /* NORTH EAST BLACK ARROW */
+ ["\u2B09", "\u2B09"], /* NORTH WEST BLACK ARROW */
+ ["\u2B0A", "\u2B0A"], /* SOUTH EAST BLACK ARROW */
+ ["\u2B0B", "\u2B0B"], /* SOUTH WEST BLACK ARROW */
+ ["\u2B0C", "\u2B0C"], /* LEFT RIGHT BLACK ARROW */
+ ["\u2B0D", "\u2B0D"], /* UP DOWN BLACK ARROW */
+ ["\u2B0E", "\u2B0E"], /* RIGHTWARDS ARROW WITH TIP DOWNWARDS */
+ ["\u2B0F", "\u2B0F"], /* RIGHTWARDS ARROW WITH TIP UPWARDS */
+ ["\u2B10", "\u2B10"], /* LEFTWARDS ARROW WITH TIP DOWNWARDS */
+ ["\u2B11", "\u2B11"], /* LEFTWARDS ARROW WITH TIP UPWARDS */
+ ["\u2B12", "\u2B12"], /* SQUARE WITH TOP HALF BLACK */
+ ["\u2B13", "\u2B13"], /* SQUARE WITH BOTTOM HALF BLACK */
+ ["\u2B14", "\u2B14"], /* SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK */
+ ["\u2B15", "\u2B15"], /* SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK */
+ ["\u2B16", "\u2B16"], /* DIAMOND WITH LEFT HALF BLACK */
+ ["\u2B17", "\u2B17"], /* DIAMOND WITH RIGHT HALF BLACK */
+ ["\u2B18", "\u2B18"], /* DIAMOND WITH TOP HALF BLACK */
+ ["\u2B19", "\u2B19"], /* DIAMOND WITH BOTTOM HALF BLACK */
+ ["\u2B1A", "\u2B1A"], /* DOTTED SQUARE */
+ ["\u2B1B", "\u2B1B"], /* BLACK LARGE SQUARE */
+ ["\u2B1C", "\u2B1C"], /* WHITE LARGE SQUARE */
+ ["\u2B1D", "\u2B1D"], /* BLACK VERY SMALL SQUARE */
+ ["\u2B1E", "\u2B1E"], /* WHITE VERY SMALL SQUARE */
+ ["\u2B1F", "\u2B1F"], /* BLACK PENTAGON */
+ ["\u2B20", "\u2B20"], /* WHITE PENTAGON */
+ ["\u2B21", "\u2B21"], /* WHITE HEXAGON */
+ ["\u2B22", "\u2B22"], /* BLACK HEXAGON */
+ ["\u2B23", "\u2B23"], /* HORIZONTAL BLACK HEXAGON */
+ ["\u2B24", "\u2B24"], /* BLACK LARGE CIRCLE */
+ ["\u2B25", "\u2B25"], /* BLACK MEDIUM DIAMOND */
+ ["\u2B26", "\u2B26"], /* WHITE MEDIUM DIAMOND */
+ ["\u2B27", "\u2B27"], /* BLACK MEDIUM LOZENGE */
+ ["\u2B28", "\u2B28"], /* WHITE MEDIUM LOZENGE */
+ ["\u2B29", "\u2B29"], /* BLACK SMALL DIAMOND */
+ ["\u2B2A", "\u2B2A"], /* BLACK SMALL LOZENGE */
+ ["\u2B2B", "\u2B2B"], /* WHITE SMALL LOZENGE */
+ ["\u2B2C", "\u2B2C"], /* BLACK HORIZONTAL ELLIPSE */
+ ["\u2B2D", "\u2B2D"], /* WHITE HORIZONTAL ELLIPSE */
+ ["\u2B2E", "\u2B2E"], /* BLACK VERTICAL ELLIPSE */
+ ["\u2B2F", "\u2B2F"], /* WHITE VERTICAL ELLIPSE */
+ ["\u2B30", "\u2B30"], /* LEFT ARROW WITH SMALL CIRCLE */
+ ["\u2B31", "\u2B31"], /* THREE LEFTWARDS ARROWS */
+ ["\u2B32", "\u2B32"], /* LEFT ARROW WITH CIRCLED PLUS */
+ ["\u2B33", "\u2B33"], /* LONG LEFTWARDS SQUIGGLE ARROW */
+ ["\u2B34", "\u2B34"], /* LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE */
+ ["\u2B35", "\u2B35"], /* LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE */
+ ["\u2B36", "\u2B36"], /* LEFTWARDS TWO-HEADED ARROW FROM BAR */
+ ["\u2B37", "\u2B37"], /* LEFTWARDS TWO-HEADED TRIPLE DASH ARROW */
+ ["\u2B38", "\u2B38"], /* LEFTWARDS ARROW WITH DOTTED STEM */
+ ["\u2B39", "\u2B39"], /* LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE */
+ ["\u2B3A", "\u2B3A"], /* LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
+ ["\u2B3B", "\u2B3B"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL */
+ ["\u2B3C", "\u2B3C"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE */
+ ["\u2B3D", "\u2B3D"], /* LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE */
+ ["\u2B3E", "\u2B3E"], /* LEFTWARDS ARROW THROUGH X */
+ ["\u2B3F", "\u2B3F"], /* WAVE ARROW POINTING DIRECTLY LEFT */
+ ["\u2B40", "\u2B40"], /* EQUALS SIGN ABOVE LEFTWARDS ARROW */
+ ["\u2B41", "\u2B41"], /* REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW */
+ ["\u2B42", "\u2B42"], /* LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */
+ ["\u2B43", "\u2B43"], /* RIGHTWARDS ARROW THROUGH GREATER-THAN */
+ ["\u2B44", "\u2B44"], /* RIGHTWARDS ARROW THROUGH SUPERSET */
+ ["\u2B45", "\u2B45"], /* LEFTWARDS QUADRUPLE ARROW */
+ ["\u2B46", "\u2B46"], /* RIGHTWARDS QUADRUPLE ARROW */
+ ["\u2B47", "\u2B47"], /* REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW */
+ ["\u2B48", "\u2B48"], /* RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */
+ ["\u2B49", "\u2B49"], /* TILDE OPERATOR ABOVE LEFTWARDS ARROW */
+ ["\u2B4A", "\u2B4A"], /* LEFTWARDS ARROW ABOVE ALMOST EQUAL TO */
+ ["\u2B4B", "\u2B4B"], /* LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */
+ ["\u2B4C", "\u2B4C"], /* RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */
+ ["\u2B4D", "\u2B4D"], /* DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW */
+ ["\u2B4E", "\u2B4E"], /* SHORT SLANTED NORTH ARROW */
+ ["\u2B4F", "\u2B4F"], /* SHORT BACKSLANTED SOUTH ARROW */
+ ["\u2B50", "\u2B50"], /* WHITE MEDIUM STAR */
+ ["\u2B51", "\u2B51"], /* BLACK SMALL STAR */
+ ["\u2B52", "\u2B52"], /* WHITE SMALL STAR */
+ ["\u2B53", "\u2B53"], /* BLACK RIGHT-POINTING PENTAGON */
+ ["\u2B54", "\u2B54"], /* WHITE RIGHT-POINTING PENTAGON */
+ ["\u2B55", "\u2B55"], /* HEAVY LARGE CIRCLE */
+ ["\u2B56", "\u2B56"], /* HEAVY OVAL WITH OVAL INSIDE */
+ ["\u2B57", "\u2B57"], /* HEAVY CIRCLE WITH CIRCLE INSIDE */
+ ["\u2B58", "\u2B58"], /* HEAVY CIRCLE */
+ ["\u2B59", "\u2B59"], /* HEAVY CIRCLED SALTIRE */
+ ["\u2B5A", "\u2B5A"], /* SLANTED NORTH ARROW WITH HOOKED HEAD */
+ ["\u2B5B", "\u2B5B"], /* BACKSLANTED SOUTH ARROW WITH HOOKED TAIL */
+ ["\u2B5C", "\u2B5C"], /* SLANTED NORTH ARROW WITH HORIZONTAL TAIL */
+ ["\u2B5D", "\u2B5D"], /* BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL */
+ ["\u2B5E", "\u2B5E"], /* BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */
+ ["\u2B5F", "\u2B5F"], /* SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */
+ ["\u2B60", "\u2B60"], /* LEFTWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B61", "\u2B61"], /* UPWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B62", "\u2B62"], /* RIGHTWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B63", "\u2B63"], /* DOWNWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B64", "\u2B64"], /* LEFT RIGHT TRIANGLE-HEADED ARROW */
+ ["\u2B65", "\u2B65"], /* UP DOWN TRIANGLE-HEADED ARROW */
+ ["\u2B66", "\u2B66"], /* NORTH WEST TRIANGLE-HEADED ARROW */
+ ["\u2B67", "\u2B67"], /* NORTH EAST TRIANGLE-HEADED ARROW */
+ ["\u2B68", "\u2B68"], /* SOUTH EAST TRIANGLE-HEADED ARROW */
+ ["\u2B69", "\u2B69"], /* SOUTH WEST TRIANGLE-HEADED ARROW */
+ ["\u2B6A", "\u2B6A"], /* LEFTWARDS TRIANGLE-HEADED DASHED ARROW */
+ ["\u2B6B", "\u2B6B"], /* UPWARDS TRIANGLE-HEADED DASHED ARROW */
+ ["\u2B6C", "\u2B6C"], /* RIGHTWARDS TRIANGLE-HEADED DASHED ARROW */
+ ["\u2B6D", "\u2B6D"], /* DOWNWARDS TRIANGLE-HEADED DASHED ARROW */
+ ["\u2B6E", "\u2B6E"], /* CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */
+ ["\u2B6F", "\u2B6F"], /* ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */
+ ["\u2B70", "\u2B70"], /* LEFTWARDS TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B71", "\u2B71"], /* UPWARDS TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B72", "\u2B72"], /* RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B73", "\u2B73"], /* DOWNWARDS TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B74", "\u2B74"],
+ ["\u2B75", "\u2B75"],
+ ["\u2B76", "\u2B76"], /* NORTH WEST TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B77", "\u2B77"], /* NORTH EAST TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B78", "\u2B78"], /* SOUTH EAST TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B79", "\u2B79"], /* SOUTH WEST TRIANGLE-HEADED ARROW TO BAR */
+ ["\u2B7A", "\u2B7A"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+ ["\u2B7B", "\u2B7B"], /* UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+ ["\u2B7C", "\u2B7C"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+ ["\u2B7D", "\u2B7D"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */
+ ["\u2B7E", "\u2B7E"], /* HORIZONTAL TAB KEY */
+ ["\u2B7F", "\u2B7F"], /* VERTICAL TAB KEY */
+ ["\u2B80", "\u2B80"], /* LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B81", "\u2B81"], /* UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B82", "\u2B82"], /* RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B83", "\u2B83"], /* DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW */
+ ["\u2B84", "\u2B84"], /* LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS */
+ ["\u2B85", "\u2B85"], /* UPWARDS TRIANGLE-HEADED PAIRED ARROWS */
+ ["\u2B86", "\u2B86"], /* RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS */
+ ["\u2B87", "\u2B87"], /* DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS */
+ ["\u2B88", "\u2B88"], /* LEFTWARDS BLACK CIRCLED WHITE ARROW */
+ ["\u2B89", "\u2B89"], /* UPWARDS BLACK CIRCLED WHITE ARROW */
+ ["\u2B8A", "\u2B8A"], /* RIGHTWARDS BLACK CIRCLED WHITE ARROW */
+ ["\u2B8B", "\u2B8B"], /* DOWNWARDS BLACK CIRCLED WHITE ARROW */
+ ["\u2B8C", "\u2B8C"], /* ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW */
+ ["\u2B8D", "\u2B8D"], /* ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW */
+ ["\u2B8E", "\u2B8E"], /* ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW */
+ ["\u2B8F", "\u2B8F"], /* ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW */
+ ["\u2B90", "\u2B90"], /* RETURN LEFT */
+ ["\u2B91", "\u2B91"], /* RETURN RIGHT */
+ ["\u2B92", "\u2B92"], /* NEWLINE LEFT */
+ ["\u2B93", "\u2B93"], /* NEWLINE RIGHT */
+ ["\u2B94", "\u2B94"], /* FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE */
+ ["\u2B95", "\u2B95"], /* RIGHTWARDS BLACK ARROW */
+ ["\u2B96", "\u2B96"],
+ ["\u2B97", "\u2B97"],
+ ["\u2B98", "\u2B98"], /* THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B99", "\u2B99"], /* THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9A", "\u2B9A"], /* THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9B", "\u2B9B"], /* THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9C", "\u2B9C"], /* BLACK LEFTWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9D", "\u2B9D"], /* BLACK UPWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9E", "\u2B9E"], /* BLACK RIGHTWARDS EQUILATERAL ARROWHEAD */
+ ["\u2B9F", "\u2B9F"], /* BLACK DOWNWARDS EQUILATERAL ARROWHEAD */
+ ["\u2BA0", "\u2BA0"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */
+ ["\u2BA1", "\u2BA1"], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */
+ ["\u2BA2", "\u2BA2"], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */
+ ["\u2BA3", "\u2BA3"], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */
+ ["\u2BA4", "\u2BA4"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */
+ ["\u2BA5", "\u2BA5"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */
+ ["\u2BA6", "\u2BA6"], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */
+ ["\u2BA7", "\u2BA7"], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */
+ ["\u2BA8", "\u2BA8"], /* BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW */
+ ["\u2BA9", "\u2BA9"], /* BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW */
+ ["\u2BAA", "\u2BAA"], /* BLACK CURVED UPWARDS AND LEFTWARDS ARROW */
+ ["\u2BAB", "\u2BAB"], /* BLACK CURVED UPWARDS AND RIGHTWARDS ARROW */
+ ["\u2BAC", "\u2BAC"], /* BLACK CURVED LEFTWARDS AND UPWARDS ARROW */
+ ["\u2BAD", "\u2BAD"], /* BLACK CURVED RIGHTWARDS AND UPWARDS ARROW */
+ ["\u2BAE", "\u2BAE"], /* BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW */
+ ["\u2BAF", "\u2BAF"], /* BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW */
+ ["\u2BB0", "\u2BB0"], /* RIBBON ARROW DOWN LEFT */
+ ["\u2BB1", "\u2BB1"], /* RIBBON ARROW DOWN RIGHT */
+ ["\u2BB2", "\u2BB2"], /* RIBBON ARROW UP LEFT */
+ ["\u2BB3", "\u2BB3"], /* RIBBON ARROW UP RIGHT */
+ ["\u2BB4", "\u2BB4"], /* RIBBON ARROW LEFT UP */
+ ["\u2BB5", "\u2BB5"], /* RIBBON ARROW RIGHT UP */
+ ["\u2BB6", "\u2BB6"], /* RIBBON ARROW LEFT DOWN */
+ ["\u2BB7", "\u2BB7"], /* RIBBON ARROW RIGHT DOWN */
+ ["\u2BB8", "\u2BB8"], /* UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR */
+ ["\u2BB9", "\u2BB9"], /* UP ARROWHEAD IN A RECTANGLE BOX */
+ ["\u2BBA", "\u2BBA"], /* OVERLAPPING WHITE SQUARES */
+ ["\u2BBB", "\u2BBB"], /* OVERLAPPING WHITE AND BLACK SQUARES */
+ ["\u2BBC", "\u2BBC"], /* OVERLAPPING BLACK SQUARES */
+ ["\u2BBD", "\u2BBD"], /* BALLOT BOX WITH LIGHT X */
+ ["\u2BBE", "\u2BBE"], /* CIRCLED X */
+ ["\u2BBF", "\u2BBF"], /* CIRCLED BOLD X */
+ ["\u2BC0", "\u2BC0"], /* BLACK SQUARE CENTRED */
+ ["\u2BC1", "\u2BC1"], /* BLACK DIAMOND CENTRED */
+ ["\u2BC2", "\u2BC2"], /* TURNED BLACK PENTAGON */
+ ["\u2BC3", "\u2BC3"], /* HORIZONTAL BLACK OCTAGON */
+ ["\u2BC4", "\u2BC4"], /* BLACK OCTAGON */
+ ["\u2BC5", "\u2BC5"], /* BLACK MEDIUM UP-POINTING TRIANGLE CENTRED */
+ ["\u2BC6", "\u2BC6"], /* BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED */
+ ["\u2BC7", "\u2BC7"], /* BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED */
+ ["\u2BC8", "\u2BC8"], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED */
+ ["\u2BC9", "\u2BC9"],
+ ["\u2BCA", "\u2BCA"], /* TOP HALF BLACK CIRCLE */
+ ["\u2BCB", "\u2BCB"], /* BOTTOM HALF BLACK CIRCLE */
+ ["\u2BCC", "\u2BCC"], /* LIGHT FOUR POINTED BLACK CUSP */
+ ["\u2BCD", "\u2BCD"], /* ROTATED LIGHT FOUR POINTED BLACK CUSP */
+ ["\u2BCE", "\u2BCE"], /* WHITE FOUR POINTED CUSP */
+ ["\u2BCF", "\u2BCF"], /* ROTATED WHITE FOUR POINTED CUSP */
+ ["\u2BD0", "\u2BD0"], /* SQUARE POSITION INDICATOR */
+ ["\u2BD1", "\u2BD1"], /* UNCERTAINTY SIGN */
+ ["\u2BD2", "\u2BD2"], /* GROUP MARK */
+ ["\u2BD3", "\u2BD3"], /* PLUTO FORM TWO */
+ ["\u2BD4", "\u2BD4"], /* PLUTO FORM THREE */
+ ["\u2BD5", "\u2BD5"], /* PLUTO FORM FOUR */
+ ["\u2BD6", "\u2BD6"], /* PLUTO FORM FIVE */
+ ["\u2BD7", "\u2BD7"], /* TRANSPLUTO */
+ ["\u2BD8", "\u2BD8"], /* PROSERPINA */
+ ["\u2BD9", "\u2BD9"], /* ASTRAEA */
+ ["\u2BDA", "\u2BDA"], /* HYGIEA */
+ ["\u2BDB", "\u2BDB"], /* PHOLUS */
+ ["\u2BDC", "\u2BDC"], /* NESSUS */
+ ["\u2BDD", "\u2BDD"], /* WHITE MOON SELENA */
+ ["\u2BDE", "\u2BDE"], /* BLACK DIAMOND ON CROSS */
+ ["\u2BDF", "\u2BDF"], /* TRUE LIGHT MOON ARTA */
+ ["\u2BE0", "\u2BE0"], /* CUPIDO */
+ ["\u2BE1", "\u2BE1"], /* HADES */
+ ["\u2BE2", "\u2BE2"], /* ZEUS */
+ ["\u2BE3", "\u2BE3"], /* KRONOS */
+ ["\u2BE4", "\u2BE4"], /* APOLLON */
+ ["\u2BE5", "\u2BE5"], /* ADMETOS */
+ ["\u2BE6", "\u2BE6"], /* VULCANUS */
+ ["\u2BE7", "\u2BE7"], /* POSEIDON */
+ ["\u2BE8", "\u2BE8"], /* LEFT HALF BLACK STAR */
+ ["\u2BE9", "\u2BE9"], /* RIGHT HALF BLACK STAR */
+ ["\u2BEA", "\u2BEA"], /* STAR WITH LEFT HALF BLACK */
+ ["\u2BEB", "\u2BEB"], /* STAR WITH RIGHT HALF BLACK */
+ ["\u2BEC", "\u2BEC"], /* LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+ ["\u2BED", "\u2BED"], /* UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+ ["\u2BEE", "\u2BEE"], /* RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+ ["\u2BEF", "\u2BEF"], /* DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */
+ ["\u2BF0", "\u2BF0"], /* ERIS FORM ONE */
+ ["\u2BF1", "\u2BF1"], /* ERIS FORM TWO */
+ ["\u2BF2", "\u2BF2"], /* SEDNA */
+ ["\u2BF3", "\u2BF3"], /* RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE */
+ ["\u2BF4", "\u2BF4"], /* RUSSIAN ASTROLOGICAL SYMBOL NOVILE */
+ ["\u2BF5", "\u2BF5"], /* RUSSIAN ASTROLOGICAL SYMBOL QUINTILE */
+ ["\u2BF6", "\u2BF6"], /* RUSSIAN ASTROLOGICAL SYMBOL BINOVILE */
+ ["\u2BF7", "\u2BF7"], /* RUSSIAN ASTROLOGICAL SYMBOL SENTAGON */
+ ["\u2BF8", "\u2BF8"], /* RUSSIAN ASTROLOGICAL SYMBOL TREDECILE */
+ ["\u2BF9", "\u2BF9"], /* EQUALS SIGN WITH INFINITY BELOW */
+ ["\u2BFA", "\u2BFA"], /* UNITED SYMBOL */
+ ["\u2BFB", "\u2BFB"], /* SEPARATED SYMBOL */
+ ["\u2BFC", "\u2BFC"], /* DOUBLED SYMBOL */
+ ["\u2BFD", "\u2BFD"], /* PASSED SYMBOL */
+ ["\u2BFE", "\u2BFE"], /* REVERSED RIGHT ANGLE */
+ ["\u2BFF", "\u2BFF"],
+ ["\u2C00", "\u2C30"], /* GLAGOLITIC CAPITAL LETTER AZU */
+ ["\u2C01", "\u2C31"], /* GLAGOLITIC CAPITAL LETTER BUKY */
+ ["\u2C02", "\u2C32"], /* GLAGOLITIC CAPITAL LETTER VEDE */
+ ["\u2C03", "\u2C33"], /* GLAGOLITIC CAPITAL LETTER GLAGOLI */
+ ["\u2C04", "\u2C34"], /* GLAGOLITIC CAPITAL LETTER DOBRO */
+ ["\u2C05", "\u2C35"], /* GLAGOLITIC CAPITAL LETTER YESTU */
+ ["\u2C06", "\u2C36"], /* GLAGOLITIC CAPITAL LETTER ZHIVETE */
+ ["\u2C07", "\u2C37"], /* GLAGOLITIC CAPITAL LETTER DZELO */
+ ["\u2C08", "\u2C38"], /* GLAGOLITIC CAPITAL LETTER ZEMLJA */
+ ["\u2C09", "\u2C39"], /* GLAGOLITIC CAPITAL LETTER IZHE */
+ ["\u2C0A", "\u2C3A"], /* GLAGOLITIC CAPITAL LETTER INITIAL IZHE */
+ ["\u2C0B", "\u2C3B"], /* GLAGOLITIC CAPITAL LETTER I */
+ ["\u2C0C", "\u2C3C"], /* GLAGOLITIC CAPITAL LETTER DJERVI */
+ ["\u2C0D", "\u2C3D"], /* GLAGOLITIC CAPITAL LETTER KAKO */
+ ["\u2C0E", "\u2C3E"], /* GLAGOLITIC CAPITAL LETTER LJUDIJE */
+ ["\u2C0F", "\u2C3F"], /* GLAGOLITIC CAPITAL LETTER MYSLITE */
+ ["\u2C10", "\u2C40"], /* GLAGOLITIC CAPITAL LETTER NASHI */
+ ["\u2C11", "\u2C41"], /* GLAGOLITIC CAPITAL LETTER ONU */
+ ["\u2C12", "\u2C42"], /* GLAGOLITIC CAPITAL LETTER POKOJI */
+ ["\u2C13", "\u2C43"], /* GLAGOLITIC CAPITAL LETTER RITSI */
+ ["\u2C14", "\u2C44"], /* GLAGOLITIC CAPITAL LETTER SLOVO */
+ ["\u2C15", "\u2C45"], /* GLAGOLITIC CAPITAL LETTER TVRIDO */
+ ["\u2C16", "\u2C46"], /* GLAGOLITIC CAPITAL LETTER UKU */
+ ["\u2C17", "\u2C47"], /* GLAGOLITIC CAPITAL LETTER FRITU */
+ ["\u2C18", "\u2C48"], /* GLAGOLITIC CAPITAL LETTER HERU */
+ ["\u2C19", "\u2C49"], /* GLAGOLITIC CAPITAL LETTER OTU */
+ ["\u2C1A", "\u2C4A"], /* GLAGOLITIC CAPITAL LETTER PE */
+ ["\u2C1B", "\u2C4B"], /* GLAGOLITIC CAPITAL LETTER SHTA */
+ ["\u2C1C", "\u2C4C"], /* GLAGOLITIC CAPITAL LETTER TSI */
+ ["\u2C1D", "\u2C4D"], /* GLAGOLITIC CAPITAL LETTER CHRIVI */
+ ["\u2C1E", "\u2C4E"], /* GLAGOLITIC CAPITAL LETTER SHA */
+ ["\u2C1F", "\u2C4F"], /* GLAGOLITIC CAPITAL LETTER YERU */
+ ["\u2C20", "\u2C50"], /* GLAGOLITIC CAPITAL LETTER YERI */
+ ["\u2C21", "\u2C51"], /* GLAGOLITIC CAPITAL LETTER YATI */
+ ["\u2C22", "\u2C52"], /* GLAGOLITIC CAPITAL LETTER SPIDERY HA */
+ ["\u2C23", "\u2C53"], /* GLAGOLITIC CAPITAL LETTER YU */
+ ["\u2C24", "\u2C54"], /* GLAGOLITIC CAPITAL LETTER SMALL YUS */
+ ["\u2C25", "\u2C55"], /* GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL */
+ ["\u2C26", "\u2C56"], /* GLAGOLITIC CAPITAL LETTER YO */
+ ["\u2C27", "\u2C57"], /* GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS */
+ ["\u2C28", "\u2C58"], /* GLAGOLITIC CAPITAL LETTER BIG YUS */
+ ["\u2C29", "\u2C59"], /* GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS */
+ ["\u2C2A", "\u2C5A"], /* GLAGOLITIC CAPITAL LETTER FITA */
+ ["\u2C2B", "\u2C5B"], /* GLAGOLITIC CAPITAL LETTER IZHITSA */
+ ["\u2C2C", "\u2C5C"], /* GLAGOLITIC CAPITAL LETTER SHTAPIC */
+ ["\u2C2D", "\u2C5D"], /* GLAGOLITIC CAPITAL LETTER TROKUTASTI A */
+ ["\u2C2E", "\u2C5E"], /* GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE */
+ ["\u2C2F", "\u2C2F"],
+ ["\u2C00", "\u2C30"], /* GLAGOLITIC SMALL LETTER AZU */
+ ["\u2C01", "\u2C31"], /* GLAGOLITIC SMALL LETTER BUKY */
+ ["\u2C02", "\u2C32"], /* GLAGOLITIC SMALL LETTER VEDE */
+ ["\u2C03", "\u2C33"], /* GLAGOLITIC SMALL LETTER GLAGOLI */
+ ["\u2C04", "\u2C34"], /* GLAGOLITIC SMALL LETTER DOBRO */
+ ["\u2C05", "\u2C35"], /* GLAGOLITIC SMALL LETTER YESTU */
+ ["\u2C06", "\u2C36"], /* GLAGOLITIC SMALL LETTER ZHIVETE */
+ ["\u2C07", "\u2C37"], /* GLAGOLITIC SMALL LETTER DZELO */
+ ["\u2C08", "\u2C38"], /* GLAGOLITIC SMALL LETTER ZEMLJA */
+ ["\u2C09", "\u2C39"], /* GLAGOLITIC SMALL LETTER IZHE */
+ ["\u2C0A", "\u2C3A"], /* GLAGOLITIC SMALL LETTER INITIAL IZHE */
+ ["\u2C0B", "\u2C3B"], /* GLAGOLITIC SMALL LETTER I */
+ ["\u2C0C", "\u2C3C"], /* GLAGOLITIC SMALL LETTER DJERVI */
+ ["\u2C0D", "\u2C3D"], /* GLAGOLITIC SMALL LETTER KAKO */
+ ["\u2C0E", "\u2C3E"], /* GLAGOLITIC SMALL LETTER LJUDIJE */
+ ["\u2C0F", "\u2C3F"], /* GLAGOLITIC SMALL LETTER MYSLITE */
+ ["\u2C10", "\u2C40"], /* GLAGOLITIC SMALL LETTER NASHI */
+ ["\u2C11", "\u2C41"], /* GLAGOLITIC SMALL LETTER ONU */
+ ["\u2C12", "\u2C42"], /* GLAGOLITIC SMALL LETTER POKOJI */
+ ["\u2C13", "\u2C43"], /* GLAGOLITIC SMALL LETTER RITSI */
+ ["\u2C14", "\u2C44"], /* GLAGOLITIC SMALL LETTER SLOVO */
+ ["\u2C15", "\u2C45"], /* GLAGOLITIC SMALL LETTER TVRIDO */
+ ["\u2C16", "\u2C46"], /* GLAGOLITIC SMALL LETTER UKU */
+ ["\u2C17", "\u2C47"], /* GLAGOLITIC SMALL LETTER FRITU */
+ ["\u2C18", "\u2C48"], /* GLAGOLITIC SMALL LETTER HERU */
+ ["\u2C19", "\u2C49"], /* GLAGOLITIC SMALL LETTER OTU */
+ ["\u2C1A", "\u2C4A"], /* GLAGOLITIC SMALL LETTER PE */
+ ["\u2C1B", "\u2C4B"], /* GLAGOLITIC SMALL LETTER SHTA */
+ ["\u2C1C", "\u2C4C"], /* GLAGOLITIC SMALL LETTER TSI */
+ ["\u2C1D", "\u2C4D"], /* GLAGOLITIC SMALL LETTER CHRIVI */
+ ["\u2C1E", "\u2C4E"], /* GLAGOLITIC SMALL LETTER SHA */
+ ["\u2C1F", "\u2C4F"], /* GLAGOLITIC SMALL LETTER YERU */
+ ["\u2C20", "\u2C50"], /* GLAGOLITIC SMALL LETTER YERI */
+ ["\u2C21", "\u2C51"], /* GLAGOLITIC SMALL LETTER YATI */
+ ["\u2C22", "\u2C52"], /* GLAGOLITIC SMALL LETTER SPIDERY HA */
+ ["\u2C23", "\u2C53"], /* GLAGOLITIC SMALL LETTER YU */
+ ["\u2C24", "\u2C54"], /* GLAGOLITIC SMALL LETTER SMALL YUS */
+ ["\u2C25", "\u2C55"], /* GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL */
+ ["\u2C26", "\u2C56"], /* GLAGOLITIC SMALL LETTER YO */
+ ["\u2C27", "\u2C57"], /* GLAGOLITIC SMALL LETTER IOTATED SMALL YUS */
+ ["\u2C28", "\u2C58"], /* GLAGOLITIC SMALL LETTER BIG YUS */
+ ["\u2C29", "\u2C59"], /* GLAGOLITIC SMALL LETTER IOTATED BIG YUS */
+ ["\u2C2A", "\u2C5A"], /* GLAGOLITIC SMALL LETTER FITA */
+ ["\u2C2B", "\u2C5B"], /* GLAGOLITIC SMALL LETTER IZHITSA */
+ ["\u2C2C", "\u2C5C"], /* GLAGOLITIC SMALL LETTER SHTAPIC */
+ ["\u2C2D", "\u2C5D"], /* GLAGOLITIC SMALL LETTER TROKUTASTI A */
+ ["\u2C2E", "\u2C5E"], /* GLAGOLITIC SMALL LETTER LATINATE MYSLITE */
+ ["\u2C5F", "\u2C5F"],
+ ["\u2C60", "\u2C61"], /* LATIN CAPITAL LETTER L WITH DOUBLE BAR */
+ ["\u2C60", "\u2C61"], /* LATIN SMALL LETTER L WITH DOUBLE BAR */
+ ["\u2C62", "\u026B"], /* LATIN CAPITAL LETTER L WITH MIDDLE TILDE */
+ ["\u2C63", "\u1D7D"], /* LATIN CAPITAL LETTER P WITH STROKE */
+ ["\u2C64", "\u027D"], /* LATIN CAPITAL LETTER R WITH TAIL */
+ ["\u023A", "\u2C65"], /* LATIN SMALL LETTER A WITH STROKE */
+ ["\u023E", "\u2C66"], /* LATIN SMALL LETTER T WITH DIAGONAL STROKE */
+ ["\u2C67", "\u2C68"], /* LATIN CAPITAL LETTER H WITH DESCENDER */
+ ["\u2C67", "\u2C68"], /* LATIN SMALL LETTER H WITH DESCENDER */
+ ["\u2C69", "\u2C6A"], /* LATIN CAPITAL LETTER K WITH DESCENDER */
+ ["\u2C69", "\u2C6A"], /* LATIN SMALL LETTER K WITH DESCENDER */
+ ["\u2C6B", "\u2C6C"], /* LATIN CAPITAL LETTER Z WITH DESCENDER */
+ ["\u2C6B", "\u2C6C"], /* LATIN SMALL LETTER Z WITH DESCENDER */
+ ["\u2C6D", "\u0251"], /* LATIN CAPITAL LETTER ALPHA */
+ ["\u2C6E", "\u0271"], /* LATIN CAPITAL LETTER M WITH HOOK */
+ ["\u2C6F", "\u0250"], /* LATIN CAPITAL LETTER TURNED A */
+ ["\u2C70", "\u0252"], /* LATIN CAPITAL LETTER TURNED ALPHA */
+ ["\u2C71", "\u2C71"], /* LATIN SMALL LETTER V WITH RIGHT HOOK */
+ ["\u2C72", "\u2C73"], /* LATIN CAPITAL LETTER W WITH HOOK */
+ ["\u2C72", "\u2C73"], /* LATIN SMALL LETTER W WITH HOOK */
+ ["\u2C74", "\u2C74"], /* LATIN SMALL LETTER V WITH CURL */
+ ["\u2C75", "\u2C76"], /* LATIN CAPITAL LETTER HALF H */
+ ["\u2C75", "\u2C76"], /* LATIN SMALL LETTER HALF H */
+ ["\u2C77", "\u2C77"], /* LATIN SMALL LETTER TAILLESS PHI */
+ ["\u2C78", "\u2C78"], /* LATIN SMALL LETTER E WITH NOTCH */
+ ["\u2C79", "\u2C79"], /* LATIN SMALL LETTER TURNED R WITH TAIL */
+ ["\u2C7A", "\u2C7A"], /* LATIN SMALL LETTER O WITH LOW RING INSIDE */
+ ["\u2C7B", "\u2C7B"], /* LATIN LETTER SMALL CAPITAL TURNED E */
+ ["\u2C7C", "\u2C7C"], /* LATIN SUBSCRIPT SMALL LETTER J */
+ ["\u2C7D", "\u2C7D"], /* MODIFIER LETTER CAPITAL V */
+ ["\u2C7E", "\u023F"], /* LATIN CAPITAL LETTER S WITH SWASH TAIL */
+ ["\u2C7F", "\u0240"], /* LATIN CAPITAL LETTER Z WITH SWASH TAIL */
+ ["\u2C80", "\u2C81"], /* COPTIC CAPITAL LETTER ALFA */
+ ["\u2C80", "\u2C81"], /* COPTIC SMALL LETTER ALFA */
+ ["\u2C82", "\u2C83"], /* COPTIC CAPITAL LETTER VIDA */
+ ["\u2C82", "\u2C83"], /* COPTIC SMALL LETTER VIDA */
+ ["\u2C84", "\u2C85"], /* COPTIC CAPITAL LETTER GAMMA */
+ ["\u2C84", "\u2C85"], /* COPTIC SMALL LETTER GAMMA */
+ ["\u2C86", "\u2C87"], /* COPTIC CAPITAL LETTER DALDA */
+ ["\u2C86", "\u2C87"], /* COPTIC SMALL LETTER DALDA */
+ ["\u2C88", "\u2C89"], /* COPTIC CAPITAL LETTER EIE */
+ ["\u2C88", "\u2C89"], /* COPTIC SMALL LETTER EIE */
+ ["\u2C8A", "\u2C8B"], /* COPTIC CAPITAL LETTER SOU */
+ ["\u2C8A", "\u2C8B"], /* COPTIC SMALL LETTER SOU */
+ ["\u2C8C", "\u2C8D"], /* COPTIC CAPITAL LETTER ZATA */
+ ["\u2C8C", "\u2C8D"], /* COPTIC SMALL LETTER ZATA */
+ ["\u2C8E", "\u2C8F"], /* COPTIC CAPITAL LETTER HATE */
+ ["\u2C8E", "\u2C8F"], /* COPTIC SMALL LETTER HATE */
+ ["\u2C90", "\u2C91"], /* COPTIC CAPITAL LETTER THETHE */
+ ["\u2C90", "\u2C91"], /* COPTIC SMALL LETTER THETHE */
+ ["\u2C92", "\u2C93"], /* COPTIC CAPITAL LETTER IAUDA */
+ ["\u2C92", "\u2C93"], /* COPTIC SMALL LETTER IAUDA */
+ ["\u2C94", "\u2C95"], /* COPTIC CAPITAL LETTER KAPA */
+ ["\u2C94", "\u2C95"], /* COPTIC SMALL LETTER KAPA */
+ ["\u2C96", "\u2C97"], /* COPTIC CAPITAL LETTER LAULA */
+ ["\u2C96", "\u2C97"], /* COPTIC SMALL LETTER LAULA */
+ ["\u2C98", "\u2C99"], /* COPTIC CAPITAL LETTER MI */
+ ["\u2C98", "\u2C99"], /* COPTIC SMALL LETTER MI */
+ ["\u2C9A", "\u2C9B"], /* COPTIC CAPITAL LETTER NI */
+ ["\u2C9A", "\u2C9B"], /* COPTIC SMALL LETTER NI */
+ ["\u2C9C", "\u2C9D"], /* COPTIC CAPITAL LETTER KSI */
+ ["\u2C9C", "\u2C9D"], /* COPTIC SMALL LETTER KSI */
+ ["\u2C9E", "\u2C9F"], /* COPTIC CAPITAL LETTER O */
+ ["\u2C9E", "\u2C9F"], /* COPTIC SMALL LETTER O */
+ ["\u2CA0", "\u2CA1"], /* COPTIC CAPITAL LETTER PI */
+ ["\u2CA0", "\u2CA1"], /* COPTIC SMALL LETTER PI */
+ ["\u2CA2", "\u2CA3"], /* COPTIC CAPITAL LETTER RO */
+ ["\u2CA2", "\u2CA3"], /* COPTIC SMALL LETTER RO */
+ ["\u2CA4", "\u2CA5"], /* COPTIC CAPITAL LETTER SIMA */
+ ["\u2CA4", "\u2CA5"], /* COPTIC SMALL LETTER SIMA */
+ ["\u2CA6", "\u2CA7"], /* COPTIC CAPITAL LETTER TAU */
+ ["\u2CA6", "\u2CA7"], /* COPTIC SMALL LETTER TAU */
+ ["\u2CA8", "\u2CA9"], /* COPTIC CAPITAL LETTER UA */
+ ["\u2CA8", "\u2CA9"], /* COPTIC SMALL LETTER UA */
+ ["\u2CAA", "\u2CAB"], /* COPTIC CAPITAL LETTER FI */
+ ["\u2CAA", "\u2CAB"], /* COPTIC SMALL LETTER FI */
+ ["\u2CAC", "\u2CAD"], /* COPTIC CAPITAL LETTER KHI */
+ ["\u2CAC", "\u2CAD"], /* COPTIC SMALL LETTER KHI */
+ ["\u2CAE", "\u2CAF"], /* COPTIC CAPITAL LETTER PSI */
+ ["\u2CAE", "\u2CAF"], /* COPTIC SMALL LETTER PSI */
+ ["\u2CB0", "\u2CB1"], /* COPTIC CAPITAL LETTER OOU */
+ ["\u2CB0", "\u2CB1"], /* COPTIC SMALL LETTER OOU */
+ ["\u2CB2", "\u2CB3"], /* COPTIC CAPITAL LETTER DIALECT-P ALEF */
+ ["\u2CB2", "\u2CB3"], /* COPTIC SMALL LETTER DIALECT-P ALEF */
+ ["\u2CB4", "\u2CB5"], /* COPTIC CAPITAL LETTER OLD COPTIC AIN */
+ ["\u2CB4", "\u2CB5"], /* COPTIC SMALL LETTER OLD COPTIC AIN */
+ ["\u2CB6", "\u2CB7"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE */
+ ["\u2CB6", "\u2CB7"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC EIE */
+ ["\u2CB8", "\u2CB9"], /* COPTIC CAPITAL LETTER DIALECT-P KAPA */
+ ["\u2CB8", "\u2CB9"], /* COPTIC SMALL LETTER DIALECT-P KAPA */
+ ["\u2CBA", "\u2CBB"], /* COPTIC CAPITAL LETTER DIALECT-P NI */
+ ["\u2CBA", "\u2CBB"], /* COPTIC SMALL LETTER DIALECT-P NI */
+ ["\u2CBC", "\u2CBD"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI */
+ ["\u2CBC", "\u2CBD"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC NI */
+ ["\u2CBE", "\u2CBF"], /* COPTIC CAPITAL LETTER OLD COPTIC OOU */
+ ["\u2CBE", "\u2CBF"], /* COPTIC SMALL LETTER OLD COPTIC OOU */
+ ["\u2CC0", "\u2CC1"], /* COPTIC CAPITAL LETTER SAMPI */
+ ["\u2CC0", "\u2CC1"], /* COPTIC SMALL LETTER SAMPI */
+ ["\u2CC2", "\u2CC3"], /* COPTIC CAPITAL LETTER CROSSED SHEI */
+ ["\u2CC2", "\u2CC3"], /* COPTIC SMALL LETTER CROSSED SHEI */
+ ["\u2CC4", "\u2CC5"], /* COPTIC CAPITAL LETTER OLD COPTIC SHEI */
+ ["\u2CC4", "\u2CC5"], /* COPTIC SMALL LETTER OLD COPTIC SHEI */
+ ["\u2CC6", "\u2CC7"], /* COPTIC CAPITAL LETTER OLD COPTIC ESH */
+ ["\u2CC6", "\u2CC7"], /* COPTIC SMALL LETTER OLD COPTIC ESH */
+ ["\u2CC8", "\u2CC9"], /* COPTIC CAPITAL LETTER AKHMIMIC KHEI */
+ ["\u2CC8", "\u2CC9"], /* COPTIC SMALL LETTER AKHMIMIC KHEI */
+ ["\u2CCA", "\u2CCB"], /* COPTIC CAPITAL LETTER DIALECT-P HORI */
+ ["\u2CCA", "\u2CCB"], /* COPTIC SMALL LETTER DIALECT-P HORI */
+ ["\u2CCC", "\u2CCD"], /* COPTIC CAPITAL LETTER OLD COPTIC HORI */
+ ["\u2CCC", "\u2CCD"], /* COPTIC SMALL LETTER OLD COPTIC HORI */
+ ["\u2CCE", "\u2CCF"], /* COPTIC CAPITAL LETTER OLD COPTIC HA */
+ ["\u2CCE", "\u2CCF"], /* COPTIC SMALL LETTER OLD COPTIC HA */
+ ["\u2CD0", "\u2CD1"], /* COPTIC CAPITAL LETTER L-SHAPED HA */
+ ["\u2CD0", "\u2CD1"], /* COPTIC SMALL LETTER L-SHAPED HA */
+ ["\u2CD2", "\u2CD3"], /* COPTIC CAPITAL LETTER OLD COPTIC HEI */
+ ["\u2CD2", "\u2CD3"], /* COPTIC SMALL LETTER OLD COPTIC HEI */
+ ["\u2CD4", "\u2CD5"], /* COPTIC CAPITAL LETTER OLD COPTIC HAT */
+ ["\u2CD4", "\u2CD5"], /* COPTIC SMALL LETTER OLD COPTIC HAT */
+ ["\u2CD6", "\u2CD7"], /* COPTIC CAPITAL LETTER OLD COPTIC GANGIA */
+ ["\u2CD6", "\u2CD7"], /* COPTIC SMALL LETTER OLD COPTIC GANGIA */
+ ["\u2CD8", "\u2CD9"], /* COPTIC CAPITAL LETTER OLD COPTIC DJA */
+ ["\u2CD8", "\u2CD9"], /* COPTIC SMALL LETTER OLD COPTIC DJA */
+ ["\u2CDA", "\u2CDB"], /* COPTIC CAPITAL LETTER OLD COPTIC SHIMA */
+ ["\u2CDA", "\u2CDB"], /* COPTIC SMALL LETTER OLD COPTIC SHIMA */
+ ["\u2CDC", "\u2CDD"], /* COPTIC CAPITAL LETTER OLD NUBIAN SHIMA */
+ ["\u2CDC", "\u2CDD"], /* COPTIC SMALL LETTER OLD NUBIAN SHIMA */
+ ["\u2CDE", "\u2CDF"], /* COPTIC CAPITAL LETTER OLD NUBIAN NGI */
+ ["\u2CDE", "\u2CDF"], /* COPTIC SMALL LETTER OLD NUBIAN NGI */
+ ["\u2CE0", "\u2CE1"], /* COPTIC CAPITAL LETTER OLD NUBIAN NYI */
+ ["\u2CE0", "\u2CE1"], /* COPTIC SMALL LETTER OLD NUBIAN NYI */
+ ["\u2CE2", "\u2CE3"], /* COPTIC CAPITAL LETTER OLD NUBIAN WAU */
+ ["\u2CE2", "\u2CE3"], /* COPTIC SMALL LETTER OLD NUBIAN WAU */
+ ["\u2CE4", "\u2CE4"], /* COPTIC SYMBOL KAI */
+ ["\u2CE5", "\u2CE5"], /* COPTIC SYMBOL MI RO */
+ ["\u2CE6", "\u2CE6"], /* COPTIC SYMBOL PI RO */
+ ["\u2CE7", "\u2CE7"], /* COPTIC SYMBOL STAUROS */
+ ["\u2CE8", "\u2CE8"], /* COPTIC SYMBOL TAU RO */
+ ["\u2CE9", "\u2CE9"], /* COPTIC SYMBOL KHI RO */
+ ["\u2CEA", "\u2CEA"], /* COPTIC SYMBOL SHIMA SIMA */
+ ["\u2CEB", "\u2CEC"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI */
+ ["\u2CEB", "\u2CEC"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI */
+ ["\u2CED", "\u2CEE"], /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA */
+ ["\u2CED", "\u2CEE"], /* COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA */
+ ["\u2CEF", "\u2CEF"], /* COPTIC COMBINING NI ABOVE */
+ ["\u2CF0", "\u2CF0"], /* COPTIC COMBINING SPIRITUS ASPER */
+ ["\u2CF1", "\u2CF1"], /* COPTIC COMBINING SPIRITUS LENIS */
+ ["\u2CF2", "\u2CF3"], /* COPTIC CAPITAL LETTER BOHAIRIC KHEI */
+ ["\u2CF2", "\u2CF3"], /* COPTIC SMALL LETTER BOHAIRIC KHEI */
+ ["\u2CF4", "\u2CF4"],
+ ["\u2CF5", "\u2CF5"],
+ ["\u2CF6", "\u2CF6"],
+ ["\u2CF7", "\u2CF7"],
+ ["\u2CF8", "\u2CF8"],
+ ["\u2CF9", "\u2CF9"], /* COPTIC OLD NUBIAN FULL STOP */
+ ["\u2CFA", "\u2CFA"], /* COPTIC OLD NUBIAN DIRECT QUESTION MARK */
+ ["\u2CFB", "\u2CFB"], /* COPTIC OLD NUBIAN INDIRECT QUESTION MARK */
+ ["\u2CFC", "\u2CFC"], /* COPTIC OLD NUBIAN VERSE DIVIDER */
+ ["\u2CFD", "\u2CFD"], /* COPTIC FRACTION ONE HALF */
+ ["\u2CFE", "\u2CFE"], /* COPTIC FULL STOP */
+ ["\u2CFF", "\u2CFF"], /* COPTIC MORPHOLOGICAL DIVIDER */
+ ["\u10A0", "\u2D00"], /* GEORGIAN SMALL LETTER AN */
+ ["\u10A1", "\u2D01"], /* GEORGIAN SMALL LETTER BAN */
+ ["\u10A2", "\u2D02"], /* GEORGIAN SMALL LETTER GAN */
+ ["\u10A3", "\u2D03"], /* GEORGIAN SMALL LETTER DON */
+ ["\u10A4", "\u2D04"], /* GEORGIAN SMALL LETTER EN */
+ ["\u10A5", "\u2D05"], /* GEORGIAN SMALL LETTER VIN */
+ ["\u10A6", "\u2D06"], /* GEORGIAN SMALL LETTER ZEN */
+ ["\u10A7", "\u2D07"], /* GEORGIAN SMALL LETTER TAN */
+ ["\u10A8", "\u2D08"], /* GEORGIAN SMALL LETTER IN */
+ ["\u10A9", "\u2D09"], /* GEORGIAN SMALL LETTER KAN */
+ ["\u10AA", "\u2D0A"], /* GEORGIAN SMALL LETTER LAS */
+ ["\u10AB", "\u2D0B"], /* GEORGIAN SMALL LETTER MAN */
+ ["\u10AC", "\u2D0C"], /* GEORGIAN SMALL LETTER NAR */
+ ["\u10AD", "\u2D0D"], /* GEORGIAN SMALL LETTER ON */
+ ["\u10AE", "\u2D0E"], /* GEORGIAN SMALL LETTER PAR */
+ ["\u10AF", "\u2D0F"], /* GEORGIAN SMALL LETTER ZHAR */
+ ["\u10B0", "\u2D10"], /* GEORGIAN SMALL LETTER RAE */
+ ["\u10B1", "\u2D11"], /* GEORGIAN SMALL LETTER SAN */
+ ["\u10B2", "\u2D12"], /* GEORGIAN SMALL LETTER TAR */
+ ["\u10B3", "\u2D13"], /* GEORGIAN SMALL LETTER UN */
+ ["\u10B4", "\u2D14"], /* GEORGIAN SMALL LETTER PHAR */
+ ["\u10B5", "\u2D15"], /* GEORGIAN SMALL LETTER KHAR */
+ ["\u10B6", "\u2D16"], /* GEORGIAN SMALL LETTER GHAN */
+ ["\u10B7", "\u2D17"], /* GEORGIAN SMALL LETTER QAR */
+ ["\u10B8", "\u2D18"], /* GEORGIAN SMALL LETTER SHIN */
+ ["\u10B9", "\u2D19"], /* GEORGIAN SMALL LETTER CHIN */
+ ["\u10BA", "\u2D1A"], /* GEORGIAN SMALL LETTER CAN */
+ ["\u10BB", "\u2D1B"], /* GEORGIAN SMALL LETTER JIL */
+ ["\u10BC", "\u2D1C"], /* GEORGIAN SMALL LETTER CIL */
+ ["\u10BD", "\u2D1D"], /* GEORGIAN SMALL LETTER CHAR */
+ ["\u10BE", "\u2D1E"], /* GEORGIAN SMALL LETTER XAN */
+ ["\u10BF", "\u2D1F"], /* GEORGIAN SMALL LETTER JHAN */
+ ["\u10C0", "\u2D20"], /* GEORGIAN SMALL LETTER HAE */
+ ["\u10C1", "\u2D21"], /* GEORGIAN SMALL LETTER HE */
+ ["\u10C2", "\u2D22"], /* GEORGIAN SMALL LETTER HIE */
+ ["\u10C3", "\u2D23"], /* GEORGIAN SMALL LETTER WE */
+ ["\u10C4", "\u2D24"], /* GEORGIAN SMALL LETTER HAR */
+ ["\u10C5", "\u2D25"], /* GEORGIAN SMALL LETTER HOE */
+ ["\u2D26", "\u2D26"],
+ ["\u10C7", "\u2D27"], /* GEORGIAN SMALL LETTER YN */
+ ["\u2D28", "\u2D28"],
+ ["\u2D29", "\u2D29"],
+ ["\u2D2A", "\u2D2A"],
+ ["\u2D2B", "\u2D2B"],
+ ["\u2D2C", "\u2D2C"],
+ ["\u10CD", "\u2D2D"], /* GEORGIAN SMALL LETTER AEN */
+ ["\u2D2E", "\u2D2E"],
+ ["\u2D2F", "\u2D2F"],
+ ["\u2D30", "\u2D30"], /* TIFINAGH LETTER YA */
+ ["\u2D31", "\u2D31"], /* TIFINAGH LETTER YAB */
+ ["\u2D32", "\u2D32"], /* TIFINAGH LETTER YABH */
+ ["\u2D33", "\u2D33"], /* TIFINAGH LETTER YAG */
+ ["\u2D34", "\u2D34"], /* TIFINAGH LETTER YAGHH */
+ ["\u2D35", "\u2D35"], /* TIFINAGH LETTER BERBER ACADEMY YAJ */
+ ["\u2D36", "\u2D36"], /* TIFINAGH LETTER YAJ */
+ ["\u2D37", "\u2D37"], /* TIFINAGH LETTER YAD */
+ ["\u2D38", "\u2D38"], /* TIFINAGH LETTER YADH */
+ ["\u2D39", "\u2D39"], /* TIFINAGH LETTER YADD */
+ ["\u2D3A", "\u2D3A"], /* TIFINAGH LETTER YADDH */
+ ["\u2D3B", "\u2D3B"], /* TIFINAGH LETTER YEY */
+ ["\u2D3C", "\u2D3C"], /* TIFINAGH LETTER YAF */
+ ["\u2D3D", "\u2D3D"], /* TIFINAGH LETTER YAK */
+ ["\u2D3E", "\u2D3E"], /* TIFINAGH LETTER TUAREG YAK */
+ ["\u2D3F", "\u2D3F"], /* TIFINAGH LETTER YAKHH */
+ ["\u2D40", "\u2D40"], /* TIFINAGH LETTER YAH */
+ ["\u2D41", "\u2D41"], /* TIFINAGH LETTER BERBER ACADEMY YAH */
+ ["\u2D42", "\u2D42"], /* TIFINAGH LETTER TUAREG YAH */
+ ["\u2D43", "\u2D43"], /* TIFINAGH LETTER YAHH */
+ ["\u2D44", "\u2D44"], /* TIFINAGH LETTER YAA */
+ ["\u2D45", "\u2D45"], /* TIFINAGH LETTER YAKH */
+ ["\u2D46", "\u2D46"], /* TIFINAGH LETTER TUAREG YAKH */
+ ["\u2D47", "\u2D47"], /* TIFINAGH LETTER YAQ */
+ ["\u2D48", "\u2D48"], /* TIFINAGH LETTER TUAREG YAQ */
+ ["\u2D49", "\u2D49"], /* TIFINAGH LETTER YI */
+ ["\u2D4A", "\u2D4A"], /* TIFINAGH LETTER YAZH */
+ ["\u2D4B", "\u2D4B"], /* TIFINAGH LETTER AHAGGAR YAZH */
+ ["\u2D4C", "\u2D4C"], /* TIFINAGH LETTER TUAREG YAZH */
+ ["\u2D4D", "\u2D4D"], /* TIFINAGH LETTER YAL */
+ ["\u2D4E", "\u2D4E"], /* TIFINAGH LETTER YAM */
+ ["\u2D4F", "\u2D4F"], /* TIFINAGH LETTER YAN */
+ ["\u2D50", "\u2D50"], /* TIFINAGH LETTER TUAREG YAGN */
+ ["\u2D51", "\u2D51"], /* TIFINAGH LETTER TUAREG YANG */
+ ["\u2D52", "\u2D52"], /* TIFINAGH LETTER YAP */
+ ["\u2D53", "\u2D53"], /* TIFINAGH LETTER YU */
+ ["\u2D54", "\u2D54"], /* TIFINAGH LETTER YAR */
+ ["\u2D55", "\u2D55"], /* TIFINAGH LETTER YARR */
+ ["\u2D56", "\u2D56"], /* TIFINAGH LETTER YAGH */
+ ["\u2D57", "\u2D57"], /* TIFINAGH LETTER TUAREG YAGH */
+ ["\u2D58", "\u2D58"], /* TIFINAGH LETTER AYER YAGH */
+ ["\u2D59", "\u2D59"], /* TIFINAGH LETTER YAS */
+ ["\u2D5A", "\u2D5A"], /* TIFINAGH LETTER YASS */
+ ["\u2D5B", "\u2D5B"], /* TIFINAGH LETTER YASH */
+ ["\u2D5C", "\u2D5C"], /* TIFINAGH LETTER YAT */
+ ["\u2D5D", "\u2D5D"], /* TIFINAGH LETTER YATH */
+ ["\u2D5E", "\u2D5E"], /* TIFINAGH LETTER YACH */
+ ["\u2D5F", "\u2D5F"], /* TIFINAGH LETTER YATT */
+ ["\u2D60", "\u2D60"], /* TIFINAGH LETTER YAV */
+ ["\u2D61", "\u2D61"], /* TIFINAGH LETTER YAW */
+ ["\u2D62", "\u2D62"], /* TIFINAGH LETTER YAY */
+ ["\u2D63", "\u2D63"], /* TIFINAGH LETTER YAZ */
+ ["\u2D64", "\u2D64"], /* TIFINAGH LETTER TAWELLEMET YAZ */
+ ["\u2D65", "\u2D65"], /* TIFINAGH LETTER YAZZ */
+ ["\u2D66", "\u2D66"], /* TIFINAGH LETTER YE */
+ ["\u2D67", "\u2D67"], /* TIFINAGH LETTER YO */
+ ["\u2D68", "\u2D68"],
+ ["\u2D69", "\u2D69"],
+ ["\u2D6A", "\u2D6A"],
+ ["\u2D6B", "\u2D6B"],
+ ["\u2D6C", "\u2D6C"],
+ ["\u2D6D", "\u2D6D"],
+ ["\u2D6E", "\u2D6E"],
+ ["\u2D6F", "\u2D6F"], /* TIFINAGH MODIFIER LETTER LABIALIZATION MARK */
+ ["\u2D70", "\u2D70"], /* TIFINAGH SEPARATOR MARK */
+ ["\u2D71", "\u2D71"],
+ ["\u2D72", "\u2D72"],
+ ["\u2D73", "\u2D73"],
+ ["\u2D74", "\u2D74"],
+ ["\u2D75", "\u2D75"],
+ ["\u2D76", "\u2D76"],
+ ["\u2D77", "\u2D77"],
+ ["\u2D78", "\u2D78"],
+ ["\u2D79", "\u2D79"],
+ ["\u2D7A", "\u2D7A"],
+ ["\u2D7B", "\u2D7B"],
+ ["\u2D7C", "\u2D7C"],
+ ["\u2D7D", "\u2D7D"],
+ ["\u2D7E", "\u2D7E"],
+ ["\u2D7F", "\u2D7F"], /* TIFINAGH CONSONANT JOINER */
+ ["\u2D80", "\u2D80"], /* ETHIOPIC SYLLABLE LOA */
+ ["\u2D81", "\u2D81"], /* ETHIOPIC SYLLABLE MOA */
+ ["\u2D82", "\u2D82"], /* ETHIOPIC SYLLABLE ROA */
+ ["\u2D83", "\u2D83"], /* ETHIOPIC SYLLABLE SOA */
+ ["\u2D84", "\u2D84"], /* ETHIOPIC SYLLABLE SHOA */
+ ["\u2D85", "\u2D85"], /* ETHIOPIC SYLLABLE BOA */
+ ["\u2D86", "\u2D86"], /* ETHIOPIC SYLLABLE TOA */
+ ["\u2D87", "\u2D87"], /* ETHIOPIC SYLLABLE COA */
+ ["\u2D88", "\u2D88"], /* ETHIOPIC SYLLABLE NOA */
+ ["\u2D89", "\u2D89"], /* ETHIOPIC SYLLABLE NYOA */
+ ["\u2D8A", "\u2D8A"], /* ETHIOPIC SYLLABLE GLOTTAL OA */
+ ["\u2D8B", "\u2D8B"], /* ETHIOPIC SYLLABLE ZOA */
+ ["\u2D8C", "\u2D8C"], /* ETHIOPIC SYLLABLE DOA */
+ ["\u2D8D", "\u2D8D"], /* ETHIOPIC SYLLABLE DDOA */
+ ["\u2D8E", "\u2D8E"], /* ETHIOPIC SYLLABLE JOA */
+ ["\u2D8F", "\u2D8F"], /* ETHIOPIC SYLLABLE THOA */
+ ["\u2D90", "\u2D90"], /* ETHIOPIC SYLLABLE CHOA */
+ ["\u2D91", "\u2D91"], /* ETHIOPIC SYLLABLE PHOA */
+ ["\u2D92", "\u2D92"], /* ETHIOPIC SYLLABLE POA */
+ ["\u2D93", "\u2D93"], /* ETHIOPIC SYLLABLE GGWA */
+ ["\u2D94", "\u2D94"], /* ETHIOPIC SYLLABLE GGWI */
+ ["\u2D95", "\u2D95"], /* ETHIOPIC SYLLABLE GGWEE */
+ ["\u2D96", "\u2D96"], /* ETHIOPIC SYLLABLE GGWE */
+ ["\u2D97", "\u2D97"],
+ ["\u2D98", "\u2D98"],
+ ["\u2D99", "\u2D99"],
+ ["\u2D9A", "\u2D9A"],
+ ["\u2D9B", "\u2D9B"],
+ ["\u2D9C", "\u2D9C"],
+ ["\u2D9D", "\u2D9D"],
+ ["\u2D9E", "\u2D9E"],
+ ["\u2D9F", "\u2D9F"],
+ ["\u2DA0", "\u2DA0"], /* ETHIOPIC SYLLABLE SSA */
+ ["\u2DA1", "\u2DA1"], /* ETHIOPIC SYLLABLE SSU */
+ ["\u2DA2", "\u2DA2"], /* ETHIOPIC SYLLABLE SSI */
+ ["\u2DA3", "\u2DA3"], /* ETHIOPIC SYLLABLE SSAA */
+ ["\u2DA4", "\u2DA4"], /* ETHIOPIC SYLLABLE SSEE */
+ ["\u2DA5", "\u2DA5"], /* ETHIOPIC SYLLABLE SSE */
+ ["\u2DA6", "\u2DA6"], /* ETHIOPIC SYLLABLE SSO */
+ ["\u2DA7", "\u2DA7"],
+ ["\u2DA8", "\u2DA8"], /* ETHIOPIC SYLLABLE CCA */
+ ["\u2DA9", "\u2DA9"], /* ETHIOPIC SYLLABLE CCU */
+ ["\u2DAA", "\u2DAA"], /* ETHIOPIC SYLLABLE CCI */
+ ["\u2DAB", "\u2DAB"], /* ETHIOPIC SYLLABLE CCAA */
+ ["\u2DAC", "\u2DAC"], /* ETHIOPIC SYLLABLE CCEE */
+ ["\u2DAD", "\u2DAD"], /* ETHIOPIC SYLLABLE CCE */
+ ["\u2DAE", "\u2DAE"], /* ETHIOPIC SYLLABLE CCO */
+ ["\u2DAF", "\u2DAF"],
+ ["\u2DB0", "\u2DB0"], /* ETHIOPIC SYLLABLE ZZA */
+ ["\u2DB1", "\u2DB1"], /* ETHIOPIC SYLLABLE ZZU */
+ ["\u2DB2", "\u2DB2"], /* ETHIOPIC SYLLABLE ZZI */
+ ["\u2DB3", "\u2DB3"], /* ETHIOPIC SYLLABLE ZZAA */
+ ["\u2DB4", "\u2DB4"], /* ETHIOPIC SYLLABLE ZZEE */
+ ["\u2DB5", "\u2DB5"], /* ETHIOPIC SYLLABLE ZZE */
+ ["\u2DB6", "\u2DB6"], /* ETHIOPIC SYLLABLE ZZO */
+ ["\u2DB7", "\u2DB7"],
+ ["\u2DB8", "\u2DB8"], /* ETHIOPIC SYLLABLE CCHA */
+ ["\u2DB9", "\u2DB9"], /* ETHIOPIC SYLLABLE CCHU */
+ ["\u2DBA", "\u2DBA"], /* ETHIOPIC SYLLABLE CCHI */
+ ["\u2DBB", "\u2DBB"], /* ETHIOPIC SYLLABLE CCHAA */
+ ["\u2DBC", "\u2DBC"], /* ETHIOPIC SYLLABLE CCHEE */
+ ["\u2DBD", "\u2DBD"], /* ETHIOPIC SYLLABLE CCHE */
+ ["\u2DBE", "\u2DBE"], /* ETHIOPIC SYLLABLE CCHO */
+ ["\u2DBF", "\u2DBF"],
+ ["\u2DC0", "\u2DC0"], /* ETHIOPIC SYLLABLE QYA */
+ ["\u2DC1", "\u2DC1"], /* ETHIOPIC SYLLABLE QYU */
+ ["\u2DC2", "\u2DC2"], /* ETHIOPIC SYLLABLE QYI */
+ ["\u2DC3", "\u2DC3"], /* ETHIOPIC SYLLABLE QYAA */
+ ["\u2DC4", "\u2DC4"], /* ETHIOPIC SYLLABLE QYEE */
+ ["\u2DC5", "\u2DC5"], /* ETHIOPIC SYLLABLE QYE */
+ ["\u2DC6", "\u2DC6"], /* ETHIOPIC SYLLABLE QYO */
+ ["\u2DC7", "\u2DC7"],
+ ["\u2DC8", "\u2DC8"], /* ETHIOPIC SYLLABLE KYA */
+ ["\u2DC9", "\u2DC9"], /* ETHIOPIC SYLLABLE KYU */
+ ["\u2DCA", "\u2DCA"], /* ETHIOPIC SYLLABLE KYI */
+ ["\u2DCB", "\u2DCB"], /* ETHIOPIC SYLLABLE KYAA */
+ ["\u2DCC", "\u2DCC"], /* ETHIOPIC SYLLABLE KYEE */
+ ["\u2DCD", "\u2DCD"], /* ETHIOPIC SYLLABLE KYE */
+ ["\u2DCE", "\u2DCE"], /* ETHIOPIC SYLLABLE KYO */
+ ["\u2DCF", "\u2DCF"],
+ ["\u2DD0", "\u2DD0"], /* ETHIOPIC SYLLABLE XYA */
+ ["\u2DD1", "\u2DD1"], /* ETHIOPIC SYLLABLE XYU */
+ ["\u2DD2", "\u2DD2"], /* ETHIOPIC SYLLABLE XYI */
+ ["\u2DD3", "\u2DD3"], /* ETHIOPIC SYLLABLE XYAA */
+ ["\u2DD4", "\u2DD4"], /* ETHIOPIC SYLLABLE XYEE */
+ ["\u2DD5", "\u2DD5"], /* ETHIOPIC SYLLABLE XYE */
+ ["\u2DD6", "\u2DD6"], /* ETHIOPIC SYLLABLE XYO */
+ ["\u2DD7", "\u2DD7"],
+ ["\u2DD8", "\u2DD8"], /* ETHIOPIC SYLLABLE GYA */
+ ["\u2DD9", "\u2DD9"], /* ETHIOPIC SYLLABLE GYU */
+ ["\u2DDA", "\u2DDA"], /* ETHIOPIC SYLLABLE GYI */
+ ["\u2DDB", "\u2DDB"], /* ETHIOPIC SYLLABLE GYAA */
+ ["\u2DDC", "\u2DDC"], /* ETHIOPIC SYLLABLE GYEE */
+ ["\u2DDD", "\u2DDD"], /* ETHIOPIC SYLLABLE GYE */
+ ["\u2DDE", "\u2DDE"], /* ETHIOPIC SYLLABLE GYO */
+ ["\u2DDF", "\u2DDF"],
+ ["\u2DE0", "\u2DE0"], /* COMBINING CYRILLIC LETTER BE */
+ ["\u2DE1", "\u2DE1"], /* COMBINING CYRILLIC LETTER VE */
+ ["\u2DE2", "\u2DE2"], /* COMBINING CYRILLIC LETTER GHE */
+ ["\u2DE3", "\u2DE3"], /* COMBINING CYRILLIC LETTER DE */
+ ["\u2DE4", "\u2DE4"], /* COMBINING CYRILLIC LETTER ZHE */
+ ["\u2DE5", "\u2DE5"], /* COMBINING CYRILLIC LETTER ZE */
+ ["\u2DE6", "\u2DE6"], /* COMBINING CYRILLIC LETTER KA */
+ ["\u2DE7", "\u2DE7"], /* COMBINING CYRILLIC LETTER EL */
+ ["\u2DE8", "\u2DE8"], /* COMBINING CYRILLIC LETTER EM */
+ ["\u2DE9", "\u2DE9"], /* COMBINING CYRILLIC LETTER EN */
+ ["\u2DEA", "\u2DEA"], /* COMBINING CYRILLIC LETTER O */
+ ["\u2DEB", "\u2DEB"], /* COMBINING CYRILLIC LETTER PE */
+ ["\u2DEC", "\u2DEC"], /* COMBINING CYRILLIC LETTER ER */
+ ["\u2DED", "\u2DED"], /* COMBINING CYRILLIC LETTER ES */
+ ["\u2DEE", "\u2DEE"], /* COMBINING CYRILLIC LETTER TE */
+ ["\u2DEF", "\u2DEF"], /* COMBINING CYRILLIC LETTER HA */
+ ["\u2DF0", "\u2DF0"], /* COMBINING CYRILLIC LETTER TSE */
+ ["\u2DF1", "\u2DF1"], /* COMBINING CYRILLIC LETTER CHE */
+ ["\u2DF2", "\u2DF2"], /* COMBINING CYRILLIC LETTER SHA */
+ ["\u2DF3", "\u2DF3"], /* COMBINING CYRILLIC LETTER SHCHA */
+ ["\u2DF4", "\u2DF4"], /* COMBINING CYRILLIC LETTER FITA */
+ ["\u2DF5", "\u2DF5"], /* COMBINING CYRILLIC LETTER ES-TE */
+ ["\u2DF6", "\u2DF6"], /* COMBINING CYRILLIC LETTER A */
+ ["\u2DF7", "\u2DF7"], /* COMBINING CYRILLIC LETTER IE */
+ ["\u2DF8", "\u2DF8"], /* COMBINING CYRILLIC LETTER DJERV */
+ ["\u2DF9", "\u2DF9"], /* COMBINING CYRILLIC LETTER MONOGRAPH UK */
+ ["\u2DFA", "\u2DFA"], /* COMBINING CYRILLIC LETTER YAT */
+ ["\u2DFB", "\u2DFB"], /* COMBINING CYRILLIC LETTER YU */
+ ["\u2DFC", "\u2DFC"], /* COMBINING CYRILLIC LETTER IOTIFIED A */
+ ["\u2DFD", "\u2DFD"], /* COMBINING CYRILLIC LETTER LITTLE YUS */
+ ["\u2DFE", "\u2DFE"], /* COMBINING CYRILLIC LETTER BIG YUS */
+ ["\u2DFF", "\u2DFF"], /* COMBINING CYRILLIC LETTER IOTIFIED BIG YUS */
+ ["\u2E00", "\u2E00"], /* RIGHT ANGLE SUBSTITUTION MARKER */
+ ["\u2E01", "\u2E01"], /* RIGHT ANGLE DOTTED SUBSTITUTION MARKER */
+ ["\u2E02", "\u2E02"], /* LEFT SUBSTITUTION BRACKET */
+ ["\u2E03", "\u2E03"], /* RIGHT SUBSTITUTION BRACKET */
+ ["\u2E04", "\u2E04"], /* LEFT DOTTED SUBSTITUTION BRACKET */
+ ["\u2E05", "\u2E05"], /* RIGHT DOTTED SUBSTITUTION BRACKET */
+ ["\u2E06", "\u2E06"], /* RAISED INTERPOLATION MARKER */
+ ["\u2E07", "\u2E07"], /* RAISED DOTTED INTERPOLATION MARKER */
+ ["\u2E08", "\u2E08"], /* DOTTED TRANSPOSITION MARKER */
+ ["\u2E09", "\u2E09"], /* LEFT TRANSPOSITION BRACKET */
+ ["\u2E0A", "\u2E0A"], /* RIGHT TRANSPOSITION BRACKET */
+ ["\u2E0B", "\u2E0B"], /* RAISED SQUARE */
+ ["\u2E0C", "\u2E0C"], /* LEFT RAISED OMISSION BRACKET */
+ ["\u2E0D", "\u2E0D"], /* RIGHT RAISED OMISSION BRACKET */
+ ["\u2E0E", "\u2E0E"], /* EDITORIAL CORONIS */
+ ["\u2E0F", "\u2E0F"], /* PARAGRAPHOS */
+ ["\u2E10", "\u2E10"], /* FORKED PARAGRAPHOS */
+ ["\u2E11", "\u2E11"], /* REVERSED FORKED PARAGRAPHOS */
+ ["\u2E12", "\u2E12"], /* HYPODIASTOLE */
+ ["\u2E13", "\u2E13"], /* DOTTED OBELOS */
+ ["\u2E14", "\u2E14"], /* DOWNWARDS ANCORA */
+ ["\u2E15", "\u2E15"], /* UPWARDS ANCORA */
+ ["\u2E16", "\u2E16"], /* DOTTED RIGHT-POINTING ANGLE */
+ ["\u2E17", "\u2E17"], /* DOUBLE OBLIQUE HYPHEN */
+ ["\u2E18", "\u2E18"], /* INVERTED INTERROBANG */
+ ["\u2E19", "\u2E19"], /* PALM BRANCH */
+ ["\u2E1A", "\u2E1A"], /* HYPHEN WITH DIAERESIS */
+ ["\u2E1B", "\u2E1B"], /* TILDE WITH RING ABOVE */
+ ["\u2E1C", "\u2E1C"], /* LEFT LOW PARAPHRASE BRACKET */
+ ["\u2E1D", "\u2E1D"], /* RIGHT LOW PARAPHRASE BRACKET */
+ ["\u2E1E", "\u2E1E"], /* TILDE WITH DOT ABOVE */
+ ["\u2E1F", "\u2E1F"], /* TILDE WITH DOT BELOW */
+ ["\u2E20", "\u2E20"], /* LEFT VERTICAL BAR WITH QUILL */
+ ["\u2E21", "\u2E21"], /* RIGHT VERTICAL BAR WITH QUILL */
+ ["\u2E22", "\u2E22"], /* TOP LEFT HALF BRACKET */
+ ["\u2E23", "\u2E23"], /* TOP RIGHT HALF BRACKET */
+ ["\u2E24", "\u2E24"], /* BOTTOM LEFT HALF BRACKET */
+ ["\u2E25", "\u2E25"], /* BOTTOM RIGHT HALF BRACKET */
+ ["\u2E26", "\u2E26"], /* LEFT SIDEWAYS U BRACKET */
+ ["\u2E27", "\u2E27"], /* RIGHT SIDEWAYS U BRACKET */
+ ["\u2E28", "\u2E28"], /* LEFT DOUBLE PARENTHESIS */
+ ["\u2E29", "\u2E29"], /* RIGHT DOUBLE PARENTHESIS */
+ ["\u2E2A", "\u2E2A"], /* TWO DOTS OVER ONE DOT PUNCTUATION */
+ ["\u2E2B", "\u2E2B"], /* ONE DOT OVER TWO DOTS PUNCTUATION */
+ ["\u2E2C", "\u2E2C"], /* SQUARED FOUR DOT PUNCTUATION */
+ ["\u2E2D", "\u2E2D"], /* FIVE DOT MARK */
+ ["\u2E2E", "\u2E2E"], /* REVERSED QUESTION MARK */
+ ["\u2E2F", "\u2E2F"], /* VERTICAL TILDE */
+ ["\u2E30", "\u2E30"], /* RING POINT */
+ ["\u2E31", "\u2E31"], /* WORD SEPARATOR MIDDLE DOT */
+ ["\u2E32", "\u2E32"], /* TURNED COMMA */
+ ["\u2E33", "\u2E33"], /* RAISED DOT */
+ ["\u2E34", "\u2E34"], /* RAISED COMMA */
+ ["\u2E35", "\u2E35"], /* TURNED SEMICOLON */
+ ["\u2E36", "\u2E36"], /* DAGGER WITH LEFT GUARD */
+ ["\u2E37", "\u2E37"], /* DAGGER WITH RIGHT GUARD */
+ ["\u2E38", "\u2E38"], /* TURNED DAGGER */
+ ["\u2E39", "\u2E39"], /* TOP HALF SECTION SIGN */
+ ["\u2E3A", "\u2E3A"], /* TWO-EM DASH */
+ ["\u2E3B", "\u2E3B"], /* THREE-EM DASH */
+ ["\u2E3C", "\u2E3C"], /* STENOGRAPHIC FULL STOP */
+ ["\u2E3D", "\u2E3D"], /* VERTICAL SIX DOTS */
+ ["\u2E3E", "\u2E3E"], /* WIGGLY VERTICAL LINE */
+ ["\u2E3F", "\u2E3F"], /* CAPITULUM */
+ ["\u2E40", "\u2E40"], /* DOUBLE HYPHEN */
+ ["\u2E41", "\u2E41"], /* REVERSED COMMA */
+ ["\u2E42", "\u2E42"], /* DOUBLE LOW-REVERSED-9 QUOTATION MARK */
+ ["\u2E43", "\u2E43"], /* DASH WITH LEFT UPTURN */
+ ["\u2E44", "\u2E44"], /* DOUBLE SUSPENSION MARK */
+ ["\u2E45", "\u2E45"], /* INVERTED LOW KAVYKA */
+ ["\u2E46", "\u2E46"], /* INVERTED LOW KAVYKA WITH KAVYKA ABOVE */
+ ["\u2E47", "\u2E47"], /* LOW KAVYKA */
+ ["\u2E48", "\u2E48"], /* LOW KAVYKA WITH DOT */
+ ["\u2E49", "\u2E49"], /* DOUBLE STACKED COMMA */
+ ["\u2E4A", "\u2E4A"], /* DOTTED SOLIDUS */
+ ["\u2E4B", "\u2E4B"], /* TRIPLE DAGGER */
+ ["\u2E4C", "\u2E4C"], /* MEDIEVAL COMMA */
+ ["\u2E4D", "\u2E4D"], /* PARAGRAPHUS MARK */
+ ["\u2E4E", "\u2E4E"], /* PUNCTUS ELEVATUS MARK */
+ ["\u2E4F", "\u2E4F"],
+ ["\u2E50", "\u2E50"],
+ ["\u2E51", "\u2E51"],
+ ["\u2E52", "\u2E52"],
+ ["\u2E53", "\u2E53"],
+ ["\u2E54", "\u2E54"],
+ ["\u2E55", "\u2E55"],
+ ["\u2E56", "\u2E56"],
+ ["\u2E57", "\u2E57"],
+ ["\u2E58", "\u2E58"],
+ ["\u2E59", "\u2E59"],
+ ["\u2E5A", "\u2E5A"],
+ ["\u2E5B", "\u2E5B"],
+ ["\u2E5C", "\u2E5C"],
+ ["\u2E5D", "\u2E5D"],
+ ["\u2E5E", "\u2E5E"],
+ ["\u2E5F", "\u2E5F"],
+ ["\u2E60", "\u2E60"],
+ ["\u2E61", "\u2E61"],
+ ["\u2E62", "\u2E62"],
+ ["\u2E63", "\u2E63"],
+ ["\u2E64", "\u2E64"],
+ ["\u2E65", "\u2E65"],
+ ["\u2E66", "\u2E66"],
+ ["\u2E67", "\u2E67"],
+ ["\u2E68", "\u2E68"],
+ ["\u2E69", "\u2E69"],
+ ["\u2E6A", "\u2E6A"],
+ ["\u2E6B", "\u2E6B"],
+ ["\u2E6C", "\u2E6C"],
+ ["\u2E6D", "\u2E6D"],
+ ["\u2E6E", "\u2E6E"],
+ ["\u2E6F", "\u2E6F"],
+ ["\u2E70", "\u2E70"],
+ ["\u2E71", "\u2E71"],
+ ["\u2E72", "\u2E72"],
+ ["\u2E73", "\u2E73"],
+ ["\u2E74", "\u2E74"],
+ ["\u2E75", "\u2E75"],
+ ["\u2E76", "\u2E76"],
+ ["\u2E77", "\u2E77"],
+ ["\u2E78", "\u2E78"],
+ ["\u2E79", "\u2E79"],
+ ["\u2E7A", "\u2E7A"],
+ ["\u2E7B", "\u2E7B"],
+ ["\u2E7C", "\u2E7C"],
+ ["\u2E7D", "\u2E7D"],
+ ["\u2E7E", "\u2E7E"],
+ ["\u2E7F", "\u2E7F"],
+ ["\u2E80", "\u2E80"], /* CJK RADICAL REPEAT */
+ ["\u2E81", "\u2E81"], /* CJK RADICAL CLIFF */
+ ["\u2E82", "\u2E82"], /* CJK RADICAL SECOND ONE */
+ ["\u2E83", "\u2E83"], /* CJK RADICAL SECOND TWO */
+ ["\u2E84", "\u2E84"], /* CJK RADICAL SECOND THREE */
+ ["\u2E85", "\u2E85"], /* CJK RADICAL PERSON */
+ ["\u2E86", "\u2E86"], /* CJK RADICAL BOX */
+ ["\u2E87", "\u2E87"], /* CJK RADICAL TABLE */
+ ["\u2E88", "\u2E88"], /* CJK RADICAL KNIFE ONE */
+ ["\u2E89", "\u2E89"], /* CJK RADICAL KNIFE TWO */
+ ["\u2E8A", "\u2E8A"], /* CJK RADICAL DIVINATION */
+ ["\u2E8B", "\u2E8B"], /* CJK RADICAL SEAL */
+ ["\u2E8C", "\u2E8C"], /* CJK RADICAL SMALL ONE */
+ ["\u2E8D", "\u2E8D"], /* CJK RADICAL SMALL TWO */
+ ["\u2E8E", "\u2E8E"], /* CJK RADICAL LAME ONE */
+ ["\u2E8F", "\u2E8F"], /* CJK RADICAL LAME TWO */
+ ["\u2E90", "\u2E90"], /* CJK RADICAL LAME THREE */
+ ["\u2E91", "\u2E91"], /* CJK RADICAL LAME FOUR */
+ ["\u2E92", "\u2E92"], /* CJK RADICAL SNAKE */
+ ["\u2E93", "\u2E93"], /* CJK RADICAL THREAD */
+ ["\u2E94", "\u2E94"], /* CJK RADICAL SNOUT ONE */
+ ["\u2E95", "\u2E95"], /* CJK RADICAL SNOUT TWO */
+ ["\u2E96", "\u2E96"], /* CJK RADICAL HEART ONE */
+ ["\u2E97", "\u2E97"], /* CJK RADICAL HEART TWO */
+ ["\u2E98", "\u2E98"], /* CJK RADICAL HAND */
+ ["\u2E99", "\u2E99"], /* CJK RADICAL RAP */
+ ["\u2E9A", "\u2E9A"],
+ ["\u2E9B", "\u2E9B"], /* CJK RADICAL CHOKE */
+ ["\u2E9C", "\u2E9C"], /* CJK RADICAL SUN */
+ ["\u2E9D", "\u2E9D"], /* CJK RADICAL MOON */
+ ["\u2E9E", "\u2E9E"], /* CJK RADICAL DEATH */
+ ["\u2E9F", "\u2E9F"], /* CJK RADICAL MOTHER */
+ ["\u2EA0", "\u2EA0"], /* CJK RADICAL CIVILIAN */
+ ["\u2EA1", "\u2EA1"], /* CJK RADICAL WATER ONE */
+ ["\u2EA2", "\u2EA2"], /* CJK RADICAL WATER TWO */
+ ["\u2EA3", "\u2EA3"], /* CJK RADICAL FIRE */
+ ["\u2EA4", "\u2EA4"], /* CJK RADICAL PAW ONE */
+ ["\u2EA5", "\u2EA5"], /* CJK RADICAL PAW TWO */
+ ["\u2EA6", "\u2EA6"], /* CJK RADICAL SIMPLIFIED HALF TREE TRUNK */
+ ["\u2EA7", "\u2EA7"], /* CJK RADICAL COW */
+ ["\u2EA8", "\u2EA8"], /* CJK RADICAL DOG */
+ ["\u2EA9", "\u2EA9"], /* CJK RADICAL JADE */
+ ["\u2EAA", "\u2EAA"], /* CJK RADICAL BOLT OF CLOTH */
+ ["\u2EAB", "\u2EAB"], /* CJK RADICAL EYE */
+ ["\u2EAC", "\u2EAC"], /* CJK RADICAL SPIRIT ONE */
+ ["\u2EAD", "\u2EAD"], /* CJK RADICAL SPIRIT TWO */
+ ["\u2EAE", "\u2EAE"], /* CJK RADICAL BAMBOO */
+ ["\u2EAF", "\u2EAF"], /* CJK RADICAL SILK */
+ ["\u2EB0", "\u2EB0"], /* CJK RADICAL C-SIMPLIFIED SILK */
+ ["\u2EB1", "\u2EB1"], /* CJK RADICAL NET ONE */
+ ["\u2EB2", "\u2EB2"], /* CJK RADICAL NET TWO */
+ ["\u2EB3", "\u2EB3"], /* CJK RADICAL NET THREE */
+ ["\u2EB4", "\u2EB4"], /* CJK RADICAL NET FOUR */
+ ["\u2EB5", "\u2EB5"], /* CJK RADICAL MESH */
+ ["\u2EB6", "\u2EB6"], /* CJK RADICAL SHEEP */
+ ["\u2EB7", "\u2EB7"], /* CJK RADICAL RAM */
+ ["\u2EB8", "\u2EB8"], /* CJK RADICAL EWE */
+ ["\u2EB9", "\u2EB9"], /* CJK RADICAL OLD */
+ ["\u2EBA", "\u2EBA"], /* CJK RADICAL BRUSH ONE */
+ ["\u2EBB", "\u2EBB"], /* CJK RADICAL BRUSH TWO */
+ ["\u2EBC", "\u2EBC"], /* CJK RADICAL MEAT */
+ ["\u2EBD", "\u2EBD"], /* CJK RADICAL MORTAR */
+ ["\u2EBE", "\u2EBE"], /* CJK RADICAL GRASS ONE */
+ ["\u2EBF", "\u2EBF"], /* CJK RADICAL GRASS TWO */
+ ["\u2EC0", "\u2EC0"], /* CJK RADICAL GRASS THREE */
+ ["\u2EC1", "\u2EC1"], /* CJK RADICAL TIGER */
+ ["\u2EC2", "\u2EC2"], /* CJK RADICAL CLOTHES */
+ ["\u2EC3", "\u2EC3"], /* CJK RADICAL WEST ONE */
+ ["\u2EC4", "\u2EC4"], /* CJK RADICAL WEST TWO */
+ ["\u2EC5", "\u2EC5"], /* CJK RADICAL C-SIMPLIFIED SEE */
+ ["\u2EC6", "\u2EC6"], /* CJK RADICAL SIMPLIFIED HORN */
+ ["\u2EC7", "\u2EC7"], /* CJK RADICAL HORN */
+ ["\u2EC8", "\u2EC8"], /* CJK RADICAL C-SIMPLIFIED SPEECH */
+ ["\u2EC9", "\u2EC9"], /* CJK RADICAL C-SIMPLIFIED SHELL */
+ ["\u2ECA", "\u2ECA"], /* CJK RADICAL FOOT */
+ ["\u2ECB", "\u2ECB"], /* CJK RADICAL C-SIMPLIFIED CART */
+ ["\u2ECC", "\u2ECC"], /* CJK RADICAL SIMPLIFIED WALK */
+ ["\u2ECD", "\u2ECD"], /* CJK RADICAL WALK ONE */
+ ["\u2ECE", "\u2ECE"], /* CJK RADICAL WALK TWO */
+ ["\u2ECF", "\u2ECF"], /* CJK RADICAL CITY */
+ ["\u2ED0", "\u2ED0"], /* CJK RADICAL C-SIMPLIFIED GOLD */
+ ["\u2ED1", "\u2ED1"], /* CJK RADICAL LONG ONE */
+ ["\u2ED2", "\u2ED2"], /* CJK RADICAL LONG TWO */
+ ["\u2ED3", "\u2ED3"], /* CJK RADICAL C-SIMPLIFIED LONG */
+ ["\u2ED4", "\u2ED4"], /* CJK RADICAL C-SIMPLIFIED GATE */
+ ["\u2ED5", "\u2ED5"], /* CJK RADICAL MOUND ONE */
+ ["\u2ED6", "\u2ED6"], /* CJK RADICAL MOUND TWO */
+ ["\u2ED7", "\u2ED7"], /* CJK RADICAL RAIN */
+ ["\u2ED8", "\u2ED8"], /* CJK RADICAL BLUE */
+ ["\u2ED9", "\u2ED9"], /* CJK RADICAL C-SIMPLIFIED TANNED LEATHER */
+ ["\u2EDA", "\u2EDA"], /* CJK RADICAL C-SIMPLIFIED LEAF */
+ ["\u2EDB", "\u2EDB"], /* CJK RADICAL C-SIMPLIFIED WIND */
+ ["\u2EDC", "\u2EDC"], /* CJK RADICAL C-SIMPLIFIED FLY */
+ ["\u2EDD", "\u2EDD"], /* CJK RADICAL EAT ONE */
+ ["\u2EDE", "\u2EDE"], /* CJK RADICAL EAT TWO */
+ ["\u2EDF", "\u2EDF"], /* CJK RADICAL EAT THREE */
+ ["\u2EE0", "\u2EE0"], /* CJK RADICAL C-SIMPLIFIED EAT */
+ ["\u2EE1", "\u2EE1"], /* CJK RADICAL HEAD */
+ ["\u2EE2", "\u2EE2"], /* CJK RADICAL C-SIMPLIFIED HORSE */
+ ["\u2EE3", "\u2EE3"], /* CJK RADICAL BONE */
+ ["\u2EE4", "\u2EE4"], /* CJK RADICAL GHOST */
+ ["\u2EE5", "\u2EE5"], /* CJK RADICAL C-SIMPLIFIED FISH */
+ ["\u2EE6", "\u2EE6"], /* CJK RADICAL C-SIMPLIFIED BIRD */
+ ["\u2EE7", "\u2EE7"], /* CJK RADICAL C-SIMPLIFIED SALT */
+ ["\u2EE8", "\u2EE8"], /* CJK RADICAL SIMPLIFIED WHEAT */
+ ["\u2EE9", "\u2EE9"], /* CJK RADICAL SIMPLIFIED YELLOW */
+ ["\u2EEA", "\u2EEA"], /* CJK RADICAL C-SIMPLIFIED FROG */
+ ["\u2EEB", "\u2EEB"], /* CJK RADICAL J-SIMPLIFIED EVEN */
+ ["\u2EEC", "\u2EEC"], /* CJK RADICAL C-SIMPLIFIED EVEN */
+ ["\u2EED", "\u2EED"], /* CJK RADICAL J-SIMPLIFIED TOOTH */
+ ["\u2EEE", "\u2EEE"], /* CJK RADICAL C-SIMPLIFIED TOOTH */
+ ["\u2EEF", "\u2EEF"], /* CJK RADICAL J-SIMPLIFIED DRAGON */
+ ["\u2EF0", "\u2EF0"], /* CJK RADICAL C-SIMPLIFIED DRAGON */
+ ["\u2EF1", "\u2EF1"], /* CJK RADICAL TURTLE */
+ ["\u2EF2", "\u2EF2"], /* CJK RADICAL J-SIMPLIFIED TURTLE */
+ ["\u2EF3", "\u2EF3"], /* CJK RADICAL C-SIMPLIFIED TURTLE */
+ ["\u2EF4", "\u2EF4"],
+ ["\u2EF5", "\u2EF5"],
+ ["\u2EF6", "\u2EF6"],
+ ["\u2EF7", "\u2EF7"],
+ ["\u2EF8", "\u2EF8"],
+ ["\u2EF9", "\u2EF9"],
+ ["\u2EFA", "\u2EFA"],
+ ["\u2EFB", "\u2EFB"],
+ ["\u2EFC", "\u2EFC"],
+ ["\u2EFD", "\u2EFD"],
+ ["\u2EFE", "\u2EFE"],
+ ["\u2EFF", "\u2EFF"],
+ ["\u2F00", "\u2F00"], /* KANGXI RADICAL ONE */
+ ["\u2F01", "\u2F01"], /* KANGXI RADICAL LINE */
+ ["\u2F02", "\u2F02"], /* KANGXI RADICAL DOT */
+ ["\u2F03", "\u2F03"], /* KANGXI RADICAL SLASH */
+ ["\u2F04", "\u2F04"], /* KANGXI RADICAL SECOND */
+ ["\u2F05", "\u2F05"], /* KANGXI RADICAL HOOK */
+ ["\u2F06", "\u2F06"], /* KANGXI RADICAL TWO */
+ ["\u2F07", "\u2F07"], /* KANGXI RADICAL LID */
+ ["\u2F08", "\u2F08"], /* KANGXI RADICAL MAN */
+ ["\u2F09", "\u2F09"], /* KANGXI RADICAL LEGS */
+ ["\u2F0A", "\u2F0A"], /* KANGXI RADICAL ENTER */
+ ["\u2F0B", "\u2F0B"], /* KANGXI RADICAL EIGHT */
+ ["\u2F0C", "\u2F0C"], /* KANGXI RADICAL DOWN BOX */
+ ["\u2F0D", "\u2F0D"], /* KANGXI RADICAL COVER */
+ ["\u2F0E", "\u2F0E"], /* KANGXI RADICAL ICE */
+ ["\u2F0F", "\u2F0F"], /* KANGXI RADICAL TABLE */
+ ["\u2F10", "\u2F10"], /* KANGXI RADICAL OPEN BOX */
+ ["\u2F11", "\u2F11"], /* KANGXI RADICAL KNIFE */
+ ["\u2F12", "\u2F12"], /* KANGXI RADICAL POWER */
+ ["\u2F13", "\u2F13"], /* KANGXI RADICAL WRAP */
+ ["\u2F14", "\u2F14"], /* KANGXI RADICAL SPOON */
+ ["\u2F15", "\u2F15"], /* KANGXI RADICAL RIGHT OPEN BOX */
+ ["\u2F16", "\u2F16"], /* KANGXI RADICAL HIDING ENCLOSURE */
+ ["\u2F17", "\u2F17"], /* KANGXI RADICAL TEN */
+ ["\u2F18", "\u2F18"], /* KANGXI RADICAL DIVINATION */
+ ["\u2F19", "\u2F19"], /* KANGXI RADICAL SEAL */
+ ["\u2F1A", "\u2F1A"], /* KANGXI RADICAL CLIFF */
+ ["\u2F1B", "\u2F1B"], /* KANGXI RADICAL PRIVATE */
+ ["\u2F1C", "\u2F1C"], /* KANGXI RADICAL AGAIN */
+ ["\u2F1D", "\u2F1D"], /* KANGXI RADICAL MOUTH */
+ ["\u2F1E", "\u2F1E"], /* KANGXI RADICAL ENCLOSURE */
+ ["\u2F1F", "\u2F1F"], /* KANGXI RADICAL EARTH */
+ ["\u2F20", "\u2F20"], /* KANGXI RADICAL SCHOLAR */
+ ["\u2F21", "\u2F21"], /* KANGXI RADICAL GO */
+ ["\u2F22", "\u2F22"], /* KANGXI RADICAL GO SLOWLY */
+ ["\u2F23", "\u2F23"], /* KANGXI RADICAL EVENING */
+ ["\u2F24", "\u2F24"], /* KANGXI RADICAL BIG */
+ ["\u2F25", "\u2F25"], /* KANGXI RADICAL WOMAN */
+ ["\u2F26", "\u2F26"], /* KANGXI RADICAL CHILD */
+ ["\u2F27", "\u2F27"], /* KANGXI RADICAL ROOF */
+ ["\u2F28", "\u2F28"], /* KANGXI RADICAL INCH */
+ ["\u2F29", "\u2F29"], /* KANGXI RADICAL SMALL */
+ ["\u2F2A", "\u2F2A"], /* KANGXI RADICAL LAME */
+ ["\u2F2B", "\u2F2B"], /* KANGXI RADICAL CORPSE */
+ ["\u2F2C", "\u2F2C"], /* KANGXI RADICAL SPROUT */
+ ["\u2F2D", "\u2F2D"], /* KANGXI RADICAL MOUNTAIN */
+ ["\u2F2E", "\u2F2E"], /* KANGXI RADICAL RIVER */
+ ["\u2F2F", "\u2F2F"], /* KANGXI RADICAL WORK */
+ ["\u2F30", "\u2F30"], /* KANGXI RADICAL ONESELF */
+ ["\u2F31", "\u2F31"], /* KANGXI RADICAL TURBAN */
+ ["\u2F32", "\u2F32"], /* KANGXI RADICAL DRY */
+ ["\u2F33", "\u2F33"], /* KANGXI RADICAL SHORT THREAD */
+ ["\u2F34", "\u2F34"], /* KANGXI RADICAL DOTTED CLIFF */
+ ["\u2F35", "\u2F35"], /* KANGXI RADICAL LONG STRIDE */
+ ["\u2F36", "\u2F36"], /* KANGXI RADICAL TWO HANDS */
+ ["\u2F37", "\u2F37"], /* KANGXI RADICAL SHOOT */
+ ["\u2F38", "\u2F38"], /* KANGXI RADICAL BOW */
+ ["\u2F39", "\u2F39"], /* KANGXI RADICAL SNOUT */
+ ["\u2F3A", "\u2F3A"], /* KANGXI RADICAL BRISTLE */
+ ["\u2F3B", "\u2F3B"], /* KANGXI RADICAL STEP */
+ ["\u2F3C", "\u2F3C"], /* KANGXI RADICAL HEART */
+ ["\u2F3D", "\u2F3D"], /* KANGXI RADICAL HALBERD */
+ ["\u2F3E", "\u2F3E"], /* KANGXI RADICAL DOOR */
+ ["\u2F3F", "\u2F3F"], /* KANGXI RADICAL HAND */
+ ["\u2F40", "\u2F40"], /* KANGXI RADICAL BRANCH */
+ ["\u2F41", "\u2F41"], /* KANGXI RADICAL RAP */
+ ["\u2F42", "\u2F42"], /* KANGXI RADICAL SCRIPT */
+ ["\u2F43", "\u2F43"], /* KANGXI RADICAL DIPPER */
+ ["\u2F44", "\u2F44"], /* KANGXI RADICAL AXE */
+ ["\u2F45", "\u2F45"], /* KANGXI RADICAL SQUARE */
+ ["\u2F46", "\u2F46"], /* KANGXI RADICAL NOT */
+ ["\u2F47", "\u2F47"], /* KANGXI RADICAL SUN */
+ ["\u2F48", "\u2F48"], /* KANGXI RADICAL SAY */
+ ["\u2F49", "\u2F49"], /* KANGXI RADICAL MOON */
+ ["\u2F4A", "\u2F4A"], /* KANGXI RADICAL TREE */
+ ["\u2F4B", "\u2F4B"], /* KANGXI RADICAL LACK */
+ ["\u2F4C", "\u2F4C"], /* KANGXI RADICAL STOP */
+ ["\u2F4D", "\u2F4D"], /* KANGXI RADICAL DEATH */
+ ["\u2F4E", "\u2F4E"], /* KANGXI RADICAL WEAPON */
+ ["\u2F4F", "\u2F4F"], /* KANGXI RADICAL DO NOT */
+ ["\u2F50", "\u2F50"], /* KANGXI RADICAL COMPARE */
+ ["\u2F51", "\u2F51"], /* KANGXI RADICAL FUR */
+ ["\u2F52", "\u2F52"], /* KANGXI RADICAL CLAN */
+ ["\u2F53", "\u2F53"], /* KANGXI RADICAL STEAM */
+ ["\u2F54", "\u2F54"], /* KANGXI RADICAL WATER */
+ ["\u2F55", "\u2F55"], /* KANGXI RADICAL FIRE */
+ ["\u2F56", "\u2F56"], /* KANGXI RADICAL CLAW */
+ ["\u2F57", "\u2F57"], /* KANGXI RADICAL FATHER */
+ ["\u2F58", "\u2F58"], /* KANGXI RADICAL DOUBLE X */
+ ["\u2F59", "\u2F59"], /* KANGXI RADICAL HALF TREE TRUNK */
+ ["\u2F5A", "\u2F5A"], /* KANGXI RADICAL SLICE */
+ ["\u2F5B", "\u2F5B"], /* KANGXI RADICAL FANG */
+ ["\u2F5C", "\u2F5C"], /* KANGXI RADICAL COW */
+ ["\u2F5D", "\u2F5D"], /* KANGXI RADICAL DOG */
+ ["\u2F5E", "\u2F5E"], /* KANGXI RADICAL PROFOUND */
+ ["\u2F5F", "\u2F5F"], /* KANGXI RADICAL JADE */
+ ["\u2F60", "\u2F60"], /* KANGXI RADICAL MELON */
+ ["\u2F61", "\u2F61"], /* KANGXI RADICAL TILE */
+ ["\u2F62", "\u2F62"], /* KANGXI RADICAL SWEET */
+ ["\u2F63", "\u2F63"], /* KANGXI RADICAL LIFE */
+ ["\u2F64", "\u2F64"], /* KANGXI RADICAL USE */
+ ["\u2F65", "\u2F65"], /* KANGXI RADICAL FIELD */
+ ["\u2F66", "\u2F66"], /* KANGXI RADICAL BOLT OF CLOTH */
+ ["\u2F67", "\u2F67"], /* KANGXI RADICAL SICKNESS */
+ ["\u2F68", "\u2F68"], /* KANGXI RADICAL DOTTED TENT */
+ ["\u2F69", "\u2F69"], /* KANGXI RADICAL WHITE */
+ ["\u2F6A", "\u2F6A"], /* KANGXI RADICAL SKIN */
+ ["\u2F6B", "\u2F6B"], /* KANGXI RADICAL DISH */
+ ["\u2F6C", "\u2F6C"], /* KANGXI RADICAL EYE */
+ ["\u2F6D", "\u2F6D"], /* KANGXI RADICAL SPEAR */
+ ["\u2F6E", "\u2F6E"], /* KANGXI RADICAL ARROW */
+ ["\u2F6F", "\u2F6F"], /* KANGXI RADICAL STONE */
+ ["\u2F70", "\u2F70"], /* KANGXI RADICAL SPIRIT */
+ ["\u2F71", "\u2F71"], /* KANGXI RADICAL TRACK */
+ ["\u2F72", "\u2F72"], /* KANGXI RADICAL GRAIN */
+ ["\u2F73", "\u2F73"], /* KANGXI RADICAL CAVE */
+ ["\u2F74", "\u2F74"], /* KANGXI RADICAL STAND */
+ ["\u2F75", "\u2F75"], /* KANGXI RADICAL BAMBOO */
+ ["\u2F76", "\u2F76"], /* KANGXI RADICAL RICE */
+ ["\u2F77", "\u2F77"], /* KANGXI RADICAL SILK */
+ ["\u2F78", "\u2F78"], /* KANGXI RADICAL JAR */
+ ["\u2F79", "\u2F79"], /* KANGXI RADICAL NET */
+ ["\u2F7A", "\u2F7A"], /* KANGXI RADICAL SHEEP */
+ ["\u2F7B", "\u2F7B"], /* KANGXI RADICAL FEATHER */
+ ["\u2F7C", "\u2F7C"], /* KANGXI RADICAL OLD */
+ ["\u2F7D", "\u2F7D"], /* KANGXI RADICAL AND */
+ ["\u2F7E", "\u2F7E"], /* KANGXI RADICAL PLOW */
+ ["\u2F7F", "\u2F7F"], /* KANGXI RADICAL EAR */
+ ["\u2F80", "\u2F80"], /* KANGXI RADICAL BRUSH */
+ ["\u2F81", "\u2F81"], /* KANGXI RADICAL MEAT */
+ ["\u2F82", "\u2F82"], /* KANGXI RADICAL MINISTER */
+ ["\u2F83", "\u2F83"], /* KANGXI RADICAL SELF */
+ ["\u2F84", "\u2F84"], /* KANGXI RADICAL ARRIVE */
+ ["\u2F85", "\u2F85"], /* KANGXI RADICAL MORTAR */
+ ["\u2F86", "\u2F86"], /* KANGXI RADICAL TONGUE */
+ ["\u2F87", "\u2F87"], /* KANGXI RADICAL OPPOSE */
+ ["\u2F88", "\u2F88"], /* KANGXI RADICAL BOAT */
+ ["\u2F89", "\u2F89"], /* KANGXI RADICAL STOPPING */
+ ["\u2F8A", "\u2F8A"], /* KANGXI RADICAL COLOR */
+ ["\u2F8B", "\u2F8B"], /* KANGXI RADICAL GRASS */
+ ["\u2F8C", "\u2F8C"], /* KANGXI RADICAL TIGER */
+ ["\u2F8D", "\u2F8D"], /* KANGXI RADICAL INSECT */
+ ["\u2F8E", "\u2F8E"], /* KANGXI RADICAL BLOOD */
+ ["\u2F8F", "\u2F8F"], /* KANGXI RADICAL WALK ENCLOSURE */
+ ["\u2F90", "\u2F90"], /* KANGXI RADICAL CLOTHES */
+ ["\u2F91", "\u2F91"], /* KANGXI RADICAL WEST */
+ ["\u2F92", "\u2F92"], /* KANGXI RADICAL SEE */
+ ["\u2F93", "\u2F93"], /* KANGXI RADICAL HORN */
+ ["\u2F94", "\u2F94"], /* KANGXI RADICAL SPEECH */
+ ["\u2F95", "\u2F95"], /* KANGXI RADICAL VALLEY */
+ ["\u2F96", "\u2F96"], /* KANGXI RADICAL BEAN */
+ ["\u2F97", "\u2F97"], /* KANGXI RADICAL PIG */
+ ["\u2F98", "\u2F98"], /* KANGXI RADICAL BADGER */
+ ["\u2F99", "\u2F99"], /* KANGXI RADICAL SHELL */
+ ["\u2F9A", "\u2F9A"], /* KANGXI RADICAL RED */
+ ["\u2F9B", "\u2F9B"], /* KANGXI RADICAL RUN */
+ ["\u2F9C", "\u2F9C"], /* KANGXI RADICAL FOOT */
+ ["\u2F9D", "\u2F9D"], /* KANGXI RADICAL BODY */
+ ["\u2F9E", "\u2F9E"], /* KANGXI RADICAL CART */
+ ["\u2F9F", "\u2F9F"], /* KANGXI RADICAL BITTER */
+ ["\u2FA0", "\u2FA0"], /* KANGXI RADICAL MORNING */
+ ["\u2FA1", "\u2FA1"], /* KANGXI RADICAL WALK */
+ ["\u2FA2", "\u2FA2"], /* KANGXI RADICAL CITY */
+ ["\u2FA3", "\u2FA3"], /* KANGXI RADICAL WINE */
+ ["\u2FA4", "\u2FA4"], /* KANGXI RADICAL DISTINGUISH */
+ ["\u2FA5", "\u2FA5"], /* KANGXI RADICAL VILLAGE */
+ ["\u2FA6", "\u2FA6"], /* KANGXI RADICAL GOLD */
+ ["\u2FA7", "\u2FA7"], /* KANGXI RADICAL LONG */
+ ["\u2FA8", "\u2FA8"], /* KANGXI RADICAL GATE */
+ ["\u2FA9", "\u2FA9"], /* KANGXI RADICAL MOUND */
+ ["\u2FAA", "\u2FAA"], /* KANGXI RADICAL SLAVE */
+ ["\u2FAB", "\u2FAB"], /* KANGXI RADICAL SHORT TAILED BIRD */
+ ["\u2FAC", "\u2FAC"], /* KANGXI RADICAL RAIN */
+ ["\u2FAD", "\u2FAD"], /* KANGXI RADICAL BLUE */
+ ["\u2FAE", "\u2FAE"], /* KANGXI RADICAL WRONG */
+ ["\u2FAF", "\u2FAF"], /* KANGXI RADICAL FACE */
+ ["\u2FB0", "\u2FB0"], /* KANGXI RADICAL LEATHER */
+ ["\u2FB1", "\u2FB1"], /* KANGXI RADICAL TANNED LEATHER */
+ ["\u2FB2", "\u2FB2"], /* KANGXI RADICAL LEEK */
+ ["\u2FB3", "\u2FB3"], /* KANGXI RADICAL SOUND */
+ ["\u2FB4", "\u2FB4"], /* KANGXI RADICAL LEAF */
+ ["\u2FB5", "\u2FB5"], /* KANGXI RADICAL WIND */
+ ["\u2FB6", "\u2FB6"], /* KANGXI RADICAL FLY */
+ ["\u2FB7", "\u2FB7"], /* KANGXI RADICAL EAT */
+ ["\u2FB8", "\u2FB8"], /* KANGXI RADICAL HEAD */
+ ["\u2FB9", "\u2FB9"], /* KANGXI RADICAL FRAGRANT */
+ ["\u2FBA", "\u2FBA"], /* KANGXI RADICAL HORSE */
+ ["\u2FBB", "\u2FBB"], /* KANGXI RADICAL BONE */
+ ["\u2FBC", "\u2FBC"], /* KANGXI RADICAL TALL */
+ ["\u2FBD", "\u2FBD"], /* KANGXI RADICAL HAIR */
+ ["\u2FBE", "\u2FBE"], /* KANGXI RADICAL FIGHT */
+ ["\u2FBF", "\u2FBF"], /* KANGXI RADICAL SACRIFICIAL WINE */
+ ["\u2FC0", "\u2FC0"], /* KANGXI RADICAL CAULDRON */
+ ["\u2FC1", "\u2FC1"], /* KANGXI RADICAL GHOST */
+ ["\u2FC2", "\u2FC2"], /* KANGXI RADICAL FISH */
+ ["\u2FC3", "\u2FC3"], /* KANGXI RADICAL BIRD */
+ ["\u2FC4", "\u2FC4"], /* KANGXI RADICAL SALT */
+ ["\u2FC5", "\u2FC5"], /* KANGXI RADICAL DEER */
+ ["\u2FC6", "\u2FC6"], /* KANGXI RADICAL WHEAT */
+ ["\u2FC7", "\u2FC7"], /* KANGXI RADICAL HEMP */
+ ["\u2FC8", "\u2FC8"], /* KANGXI RADICAL YELLOW */
+ ["\u2FC9", "\u2FC9"], /* KANGXI RADICAL MILLET */
+ ["\u2FCA", "\u2FCA"], /* KANGXI RADICAL BLACK */
+ ["\u2FCB", "\u2FCB"], /* KANGXI RADICAL EMBROIDERY */
+ ["\u2FCC", "\u2FCC"], /* KANGXI RADICAL FROG */
+ ["\u2FCD", "\u2FCD"], /* KANGXI RADICAL TRIPOD */
+ ["\u2FCE", "\u2FCE"], /* KANGXI RADICAL DRUM */
+ ["\u2FCF", "\u2FCF"], /* KANGXI RADICAL RAT */
+ ["\u2FD0", "\u2FD0"], /* KANGXI RADICAL NOSE */
+ ["\u2FD1", "\u2FD1"], /* KANGXI RADICAL EVEN */
+ ["\u2FD2", "\u2FD2"], /* KANGXI RADICAL TOOTH */
+ ["\u2FD3", "\u2FD3"], /* KANGXI RADICAL DRAGON */
+ ["\u2FD4", "\u2FD4"], /* KANGXI RADICAL TURTLE */
+ ["\u2FD5", "\u2FD5"], /* KANGXI RADICAL FLUTE */
+ ["\u2FD6", "\u2FD6"],
+ ["\u2FD7", "\u2FD7"],
+ ["\u2FD8", "\u2FD8"],
+ ["\u2FD9", "\u2FD9"],
+ ["\u2FDA", "\u2FDA"],
+ ["\u2FDB", "\u2FDB"],
+ ["\u2FDC", "\u2FDC"],
+ ["\u2FDD", "\u2FDD"],
+ ["\u2FDE", "\u2FDE"],
+ ["\u2FDF", "\u2FDF"],
+ ["\u2FE0", "\u2FE0"],
+ ["\u2FE1", "\u2FE1"],
+ ["\u2FE2", "\u2FE2"],
+ ["\u2FE3", "\u2FE3"],
+ ["\u2FE4", "\u2FE4"],
+ ["\u2FE5", "\u2FE5"],
+ ["\u2FE6", "\u2FE6"],
+ ["\u2FE7", "\u2FE7"],
+ ["\u2FE8", "\u2FE8"],
+ ["\u2FE9", "\u2FE9"],
+ ["\u2FEA", "\u2FEA"],
+ ["\u2FEB", "\u2FEB"],
+ ["\u2FEC", "\u2FEC"],
+ ["\u2FED", "\u2FED"],
+ ["\u2FEE", "\u2FEE"],
+ ["\u2FEF", "\u2FEF"],
+ ["\u2FF0", "\u2FF0"], /* IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT */
+ ["\u2FF1", "\u2FF1"], /* IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW */
+ ["\u2FF2", "\u2FF2"], /* IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT */
+ ["\u2FF3", "\u2FF3"], /* IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW */
+ ["\u2FF4", "\u2FF4"], /* IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND */
+ ["\u2FF5", "\u2FF5"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE */
+ ["\u2FF6", "\u2FF6"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW */
+ ["\u2FF7", "\u2FF7"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT */
+ ["\u2FF8", "\u2FF8"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT */
+ ["\u2FF9", "\u2FF9"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT */
+ ["\u2FFA", "\u2FFA"], /* IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT */
+ ["\u2FFB", "\u2FFB"], /* IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID */
+ ["\u2FFC", "\u2FFC"],
+ ["\u2FFD", "\u2FFD"],
+ ["\u2FFE", "\u2FFE"],
+ ["\u2FFF", "\u2FFF"],
+ ["\u3000", "\u3000"], /* IDEOGRAPHIC SPACE */
+ ["\u3001", "\u3001"], /* IDEOGRAPHIC COMMA */
+ ["\u3002", "\u3002"], /* IDEOGRAPHIC FULL STOP (IDEOGRAPHIC PERIOD) */
+ ["\u3003", "\u3003"], /* DITTO MARK */
+ ["\u3004", "\u3004"], /* JAPANESE INDUSTRIAL STANDARD SYMBOL */
+ ["\u3005", "\u3005"], /* IDEOGRAPHIC ITERATION MARK */
+ ["\u3006", "\u3006"], /* IDEOGRAPHIC CLOSING MARK */
+ ["\u3007", "\u3007"], /* IDEOGRAPHIC NUMBER ZERO */
+ ["\u3008", "\u3008"], /* LEFT ANGLE BRACKET (OPENING ANGLE BRACKET) */
+ ["\u3009", "\u3009"], /* RIGHT ANGLE BRACKET (CLOSING ANGLE BRACKET) */
+ ["\u300A", "\u300A"], /* LEFT DOUBLE ANGLE BRACKET (OPENING DOUBLE ANGLE BRACKET) */
+ ["\u300B", "\u300B"], /* RIGHT DOUBLE ANGLE BRACKET (CLOSING DOUBLE ANGLE BRACKET) */
+ ["\u300C", "\u300C"], /* LEFT CORNER BRACKET (OPENING CORNER BRACKET) */
+ ["\u300D", "\u300D"], /* RIGHT CORNER BRACKET (CLOSING CORNER BRACKET) */
+ ["\u300E", "\u300E"], /* LEFT WHITE CORNER BRACKET (OPENING WHITE CORNER BRACKET) */
+ ["\u300F", "\u300F"], /* RIGHT WHITE CORNER BRACKET (CLOSING WHITE CORNER BRACKET) */
+ ["\u3010", "\u3010"], /* LEFT BLACK LENTICULAR BRACKET (OPENING BLACK LENTICULAR BRACKET) */
+ ["\u3011", "\u3011"], /* RIGHT BLACK LENTICULAR BRACKET (CLOSING BLACK LENTICULAR BRACKET) */
+ ["\u3012", "\u3012"], /* POSTAL MARK */
+ ["\u3013", "\u3013"], /* GETA MARK */
+ ["\u3014", "\u3014"], /* LEFT TORTOISE SHELL BRACKET (OPENING TORTOISE SHELL BRACKET) */
+ ["\u3015", "\u3015"], /* RIGHT TORTOISE SHELL BRACKET (CLOSING TORTOISE SHELL BRACKET) */
+ ["\u3016", "\u3016"], /* LEFT WHITE LENTICULAR BRACKET (OPENING WHITE LENTICULAR BRACKET) */
+ ["\u3017", "\u3017"], /* RIGHT WHITE LENTICULAR BRACKET (CLOSING WHITE LENTICULAR BRACKET) */
+ ["\u3018", "\u3018"], /* LEFT WHITE TORTOISE SHELL BRACKET (OPENING WHITE TORTOISE SHELL BRACKET) */
+ ["\u3019", "\u3019"], /* RIGHT WHITE TORTOISE SHELL BRACKET (CLOSING WHITE TORTOISE SHELL BRACKET) */
+ ["\u301A", "\u301A"], /* LEFT WHITE SQUARE BRACKET (OPENING WHITE SQUARE BRACKET) */
+ ["\u301B", "\u301B"], /* RIGHT WHITE SQUARE BRACKET (CLOSING WHITE SQUARE BRACKET) */
+ ["\u301C", "\u301C"], /* WAVE DASH */
+ ["\u301D", "\u301D"], /* REVERSED DOUBLE PRIME QUOTATION MARK */
+ ["\u301E", "\u301E"], /* DOUBLE PRIME QUOTATION MARK */
+ ["\u301F", "\u301F"], /* LOW DOUBLE PRIME QUOTATION MARK */
+ ["\u3020", "\u3020"], /* POSTAL MARK FACE */
+ ["\u3021", "\u3021"], /* HANGZHOU NUMERAL ONE */
+ ["\u3022", "\u3022"], /* HANGZHOU NUMERAL TWO */
+ ["\u3023", "\u3023"], /* HANGZHOU NUMERAL THREE */
+ ["\u3024", "\u3024"], /* HANGZHOU NUMERAL FOUR */
+ ["\u3025", "\u3025"], /* HANGZHOU NUMERAL FIVE */
+ ["\u3026", "\u3026"], /* HANGZHOU NUMERAL SIX */
+ ["\u3027", "\u3027"], /* HANGZHOU NUMERAL SEVEN */
+ ["\u3028", "\u3028"], /* HANGZHOU NUMERAL EIGHT */
+ ["\u3029", "\u3029"], /* HANGZHOU NUMERAL NINE */
+ ["\u302A", "\u302A"], /* IDEOGRAPHIC LEVEL TONE MARK */
+ ["\u302B", "\u302B"], /* IDEOGRAPHIC RISING TONE MARK */
+ ["\u302C", "\u302C"], /* IDEOGRAPHIC DEPARTING TONE MARK */
+ ["\u302D", "\u302D"], /* IDEOGRAPHIC ENTERING TONE MARK */
+ ["\u302E", "\u302E"], /* HANGUL SINGLE DOT TONE MARK */
+ ["\u302F", "\u302F"], /* HANGUL DOUBLE DOT TONE MARK */
+ ["\u3030", "\u3030"], /* WAVY DASH */
+ ["\u3031", "\u3031"], /* VERTICAL KANA REPEAT MARK */
+ ["\u3032", "\u3032"], /* VERTICAL KANA REPEAT WITH VOICED SOUND MARK */
+ ["\u3033", "\u3033"], /* VERTICAL KANA REPEAT MARK UPPER HALF */
+ ["\u3034", "\u3034"], /* VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF */
+ ["\u3035", "\u3035"], /* VERTICAL KANA REPEAT MARK LOWER HALF */
+ ["\u3036", "\u3036"], /* CIRCLED POSTAL MARK */
+ ["\u3037", "\u3037"], /* IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL */
+ ["\u3038", "\u3038"], /* HANGZHOU NUMERAL TEN */
+ ["\u3039", "\u3039"], /* HANGZHOU NUMERAL TWENTY */
+ ["\u303A", "\u303A"], /* HANGZHOU NUMERAL THIRTY */
+ ["\u303B", "\u303B"], /* VERTICAL IDEOGRAPHIC ITERATION MARK */
+ ["\u303C", "\u303C"], /* MASU MARK */
+ ["\u303D", "\u303D"], /* PART ALTERNATION MARK */
+ ["\u303E", "\u303E"], /* IDEOGRAPHIC VARIATION INDICATOR */
+ ["\u303F", "\u303F"], /* IDEOGRAPHIC HALF FILL SPACE */
+ ["\u3040", "\u3040"],
+ ["\u3041", "\u3041"], /* HIRAGANA LETTER SMALL A */
+ ["\u3042", "\u3042"], /* HIRAGANA LETTER A */
+ ["\u3043", "\u3043"], /* HIRAGANA LETTER SMALL I */
+ ["\u3044", "\u3044"], /* HIRAGANA LETTER I */
+ ["\u3045", "\u3045"], /* HIRAGANA LETTER SMALL U */
+ ["\u3046", "\u3046"], /* HIRAGANA LETTER U */
+ ["\u3047", "\u3047"], /* HIRAGANA LETTER SMALL E */
+ ["\u3048", "\u3048"], /* HIRAGANA LETTER E */
+ ["\u3049", "\u3049"], /* HIRAGANA LETTER SMALL O */
+ ["\u304A", "\u304A"], /* HIRAGANA LETTER O */
+ ["\u304B", "\u304B"], /* HIRAGANA LETTER KA */
+ ["\u304C", "\u304C"], /* HIRAGANA LETTER GA */
+ ["\u304D", "\u304D"], /* HIRAGANA LETTER KI */
+ ["\u304E", "\u304E"], /* HIRAGANA LETTER GI */
+ ["\u304F", "\u304F"], /* HIRAGANA LETTER KU */
+ ["\u3050", "\u3050"], /* HIRAGANA LETTER GU */
+ ["\u3051", "\u3051"], /* HIRAGANA LETTER KE */
+ ["\u3052", "\u3052"], /* HIRAGANA LETTER GE */
+ ["\u3053", "\u3053"], /* HIRAGANA LETTER KO */
+ ["\u3054", "\u3054"], /* HIRAGANA LETTER GO */
+ ["\u3055", "\u3055"], /* HIRAGANA LETTER SA */
+ ["\u3056", "\u3056"], /* HIRAGANA LETTER ZA */
+ ["\u3057", "\u3057"], /* HIRAGANA LETTER SI */
+ ["\u3058", "\u3058"], /* HIRAGANA LETTER ZI */
+ ["\u3059", "\u3059"], /* HIRAGANA LETTER SU */
+ ["\u305A", "\u305A"], /* HIRAGANA LETTER ZU */
+ ["\u305B", "\u305B"], /* HIRAGANA LETTER SE */
+ ["\u305C", "\u305C"], /* HIRAGANA LETTER ZE */
+ ["\u305D", "\u305D"], /* HIRAGANA LETTER SO */
+ ["\u305E", "\u305E"], /* HIRAGANA LETTER ZO */
+ ["\u305F", "\u305F"], /* HIRAGANA LETTER TA */
+ ["\u3060", "\u3060"], /* HIRAGANA LETTER DA */
+ ["\u3061", "\u3061"], /* HIRAGANA LETTER TI */
+ ["\u3062", "\u3062"], /* HIRAGANA LETTER DI */
+ ["\u3063", "\u3063"], /* HIRAGANA LETTER SMALL TU */
+ ["\u3064", "\u3064"], /* HIRAGANA LETTER TU */
+ ["\u3065", "\u3065"], /* HIRAGANA LETTER DU */
+ ["\u3066", "\u3066"], /* HIRAGANA LETTER TE */
+ ["\u3067", "\u3067"], /* HIRAGANA LETTER DE */
+ ["\u3068", "\u3068"], /* HIRAGANA LETTER TO */
+ ["\u3069", "\u3069"], /* HIRAGANA LETTER DO */
+ ["\u306A", "\u306A"], /* HIRAGANA LETTER NA */
+ ["\u306B", "\u306B"], /* HIRAGANA LETTER NI */
+ ["\u306C", "\u306C"], /* HIRAGANA LETTER NU */
+ ["\u306D", "\u306D"], /* HIRAGANA LETTER NE */
+ ["\u306E", "\u306E"], /* HIRAGANA LETTER NO */
+ ["\u306F", "\u306F"], /* HIRAGANA LETTER HA */
+ ["\u3070", "\u3070"], /* HIRAGANA LETTER BA */
+ ["\u3071", "\u3071"], /* HIRAGANA LETTER PA */
+ ["\u3072", "\u3072"], /* HIRAGANA LETTER HI */
+ ["\u3073", "\u3073"], /* HIRAGANA LETTER BI */
+ ["\u3074", "\u3074"], /* HIRAGANA LETTER PI */
+ ["\u3075", "\u3075"], /* HIRAGANA LETTER HU */
+ ["\u3076", "\u3076"], /* HIRAGANA LETTER BU */
+ ["\u3077", "\u3077"], /* HIRAGANA LETTER PU */
+ ["\u3078", "\u3078"], /* HIRAGANA LETTER HE */
+ ["\u3079", "\u3079"], /* HIRAGANA LETTER BE */
+ ["\u307A", "\u307A"], /* HIRAGANA LETTER PE */
+ ["\u307B", "\u307B"], /* HIRAGANA LETTER HO */
+ ["\u307C", "\u307C"], /* HIRAGANA LETTER BO */
+ ["\u307D", "\u307D"], /* HIRAGANA LETTER PO */
+ ["\u307E", "\u307E"], /* HIRAGANA LETTER MA */
+ ["\u307F", "\u307F"], /* HIRAGANA LETTER MI */
+ ["\u3080", "\u3080"], /* HIRAGANA LETTER MU */
+ ["\u3081", "\u3081"], /* HIRAGANA LETTER ME */
+ ["\u3082", "\u3082"], /* HIRAGANA LETTER MO */
+ ["\u3083", "\u3083"], /* HIRAGANA LETTER SMALL YA */
+ ["\u3084", "\u3084"], /* HIRAGANA LETTER YA */
+ ["\u3085", "\u3085"], /* HIRAGANA LETTER SMALL YU */
+ ["\u3086", "\u3086"], /* HIRAGANA LETTER YU */
+ ["\u3087", "\u3087"], /* HIRAGANA LETTER SMALL YO */
+ ["\u3088", "\u3088"], /* HIRAGANA LETTER YO */
+ ["\u3089", "\u3089"], /* HIRAGANA LETTER RA */
+ ["\u308A", "\u308A"], /* HIRAGANA LETTER RI */
+ ["\u308B", "\u308B"], /* HIRAGANA LETTER RU */
+ ["\u308C", "\u308C"], /* HIRAGANA LETTER RE */
+ ["\u308D", "\u308D"], /* HIRAGANA LETTER RO */
+ ["\u308E", "\u308E"], /* HIRAGANA LETTER SMALL WA */
+ ["\u308F", "\u308F"], /* HIRAGANA LETTER WA */
+ ["\u3090", "\u3090"], /* HIRAGANA LETTER WI */
+ ["\u3091", "\u3091"], /* HIRAGANA LETTER WE */
+ ["\u3092", "\u3092"], /* HIRAGANA LETTER WO */
+ ["\u3093", "\u3093"], /* HIRAGANA LETTER N */
+ ["\u3094", "\u3094"], /* HIRAGANA LETTER VU */
+ ["\u3095", "\u3095"], /* HIRAGANA LETTER SMALL KA */
+ ["\u3096", "\u3096"], /* HIRAGANA LETTER SMALL KE */
+ ["\u3097", "\u3097"],
+ ["\u3098", "\u3098"],
+ ["\u3099", "\u3099"], /* COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK (NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK) */
+ ["\u309A", "\u309A"], /* COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK (NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK) */
+ ["\u309B", "\u309B"], /* KATAKANA-HIRAGANA VOICED SOUND MARK */
+ ["\u309C", "\u309C"], /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+ ["\u309D", "\u309D"], /* HIRAGANA ITERATION MARK */
+ ["\u309E", "\u309E"], /* HIRAGANA VOICED ITERATION MARK */
+ ["\u309F", "\u309F"], /* HIRAGANA DIGRAPH YORI */
+ ["\u30A0", "\u30A0"], /* KATAKANA-HIRAGANA DOUBLE HYPHEN */
+ ["\u30A1", "\u30A1"], /* KATAKANA LETTER SMALL A */
+ ["\u30A2", "\u30A2"], /* KATAKANA LETTER A */
+ ["\u30A3", "\u30A3"], /* KATAKANA LETTER SMALL I */
+ ["\u30A4", "\u30A4"], /* KATAKANA LETTER I */
+ ["\u30A5", "\u30A5"], /* KATAKANA LETTER SMALL U */
+ ["\u30A6", "\u30A6"], /* KATAKANA LETTER U */
+ ["\u30A7", "\u30A7"], /* KATAKANA LETTER SMALL E */
+ ["\u30A8", "\u30A8"], /* KATAKANA LETTER E */
+ ["\u30A9", "\u30A9"], /* KATAKANA LETTER SMALL O */
+ ["\u30AA", "\u30AA"], /* KATAKANA LETTER O */
+ ["\u30AB", "\u30AB"], /* KATAKANA LETTER KA */
+ ["\u30AC", "\u30AC"], /* KATAKANA LETTER GA */
+ ["\u30AD", "\u30AD"], /* KATAKANA LETTER KI */
+ ["\u30AE", "\u30AE"], /* KATAKANA LETTER GI */
+ ["\u30AF", "\u30AF"], /* KATAKANA LETTER KU */
+ ["\u30B0", "\u30B0"], /* KATAKANA LETTER GU */
+ ["\u30B1", "\u30B1"], /* KATAKANA LETTER KE */
+ ["\u30B2", "\u30B2"], /* KATAKANA LETTER GE */
+ ["\u30B3", "\u30B3"], /* KATAKANA LETTER KO */
+ ["\u30B4", "\u30B4"], /* KATAKANA LETTER GO */
+ ["\u30B5", "\u30B5"], /* KATAKANA LETTER SA */
+ ["\u30B6", "\u30B6"], /* KATAKANA LETTER ZA */
+ ["\u30B7", "\u30B7"], /* KATAKANA LETTER SI */
+ ["\u30B8", "\u30B8"], /* KATAKANA LETTER ZI */
+ ["\u30B9", "\u30B9"], /* KATAKANA LETTER SU */
+ ["\u30BA", "\u30BA"], /* KATAKANA LETTER ZU */
+ ["\u30BB", "\u30BB"], /* KATAKANA LETTER SE */
+ ["\u30BC", "\u30BC"], /* KATAKANA LETTER ZE */
+ ["\u30BD", "\u30BD"], /* KATAKANA LETTER SO */
+ ["\u30BE", "\u30BE"], /* KATAKANA LETTER ZO */
+ ["\u30BF", "\u30BF"], /* KATAKANA LETTER TA */
+ ["\u30C0", "\u30C0"], /* KATAKANA LETTER DA */
+ ["\u30C1", "\u30C1"], /* KATAKANA LETTER TI */
+ ["\u30C2", "\u30C2"], /* KATAKANA LETTER DI */
+ ["\u30C3", "\u30C3"], /* KATAKANA LETTER SMALL TU */
+ ["\u30C4", "\u30C4"], /* KATAKANA LETTER TU */
+ ["\u30C5", "\u30C5"], /* KATAKANA LETTER DU */
+ ["\u30C6", "\u30C6"], /* KATAKANA LETTER TE */
+ ["\u30C7", "\u30C7"], /* KATAKANA LETTER DE */
+ ["\u30C8", "\u30C8"], /* KATAKANA LETTER TO */
+ ["\u30C9", "\u30C9"], /* KATAKANA LETTER DO */
+ ["\u30CA", "\u30CA"], /* KATAKANA LETTER NA */
+ ["\u30CB", "\u30CB"], /* KATAKANA LETTER NI */
+ ["\u30CC", "\u30CC"], /* KATAKANA LETTER NU */
+ ["\u30CD", "\u30CD"], /* KATAKANA LETTER NE */
+ ["\u30CE", "\u30CE"], /* KATAKANA LETTER NO */
+ ["\u30CF", "\u30CF"], /* KATAKANA LETTER HA */
+ ["\u30D0", "\u30D0"], /* KATAKANA LETTER BA */
+ ["\u30D1", "\u30D1"], /* KATAKANA LETTER PA */
+ ["\u30D2", "\u30D2"], /* KATAKANA LETTER HI */
+ ["\u30D3", "\u30D3"], /* KATAKANA LETTER BI */
+ ["\u30D4", "\u30D4"], /* KATAKANA LETTER PI */
+ ["\u30D5", "\u30D5"], /* KATAKANA LETTER HU */
+ ["\u30D6", "\u30D6"], /* KATAKANA LETTER BU */
+ ["\u30D7", "\u30D7"], /* KATAKANA LETTER PU */
+ ["\u30D8", "\u30D8"], /* KATAKANA LETTER HE */
+ ["\u30D9", "\u30D9"], /* KATAKANA LETTER BE */
+ ["\u30DA", "\u30DA"], /* KATAKANA LETTER PE */
+ ["\u30DB", "\u30DB"], /* KATAKANA LETTER HO */
+ ["\u30DC", "\u30DC"], /* KATAKANA LETTER BO */
+ ["\u30DD", "\u30DD"], /* KATAKANA LETTER PO */
+ ["\u30DE", "\u30DE"], /* KATAKANA LETTER MA */
+ ["\u30DF", "\u30DF"], /* KATAKANA LETTER MI */
+ ["\u30E0", "\u30E0"], /* KATAKANA LETTER MU */
+ ["\u30E1", "\u30E1"], /* KATAKANA LETTER ME */
+ ["\u30E2", "\u30E2"], /* KATAKANA LETTER MO */
+ ["\u30E3", "\u30E3"], /* KATAKANA LETTER SMALL YA */
+ ["\u30E4", "\u30E4"], /* KATAKANA LETTER YA */
+ ["\u30E5", "\u30E5"], /* KATAKANA LETTER SMALL YU */
+ ["\u30E6", "\u30E6"], /* KATAKANA LETTER YU */
+ ["\u30E7", "\u30E7"], /* KATAKANA LETTER SMALL YO */
+ ["\u30E8", "\u30E8"], /* KATAKANA LETTER YO */
+ ["\u30E9", "\u30E9"], /* KATAKANA LETTER RA */
+ ["\u30EA", "\u30EA"], /* KATAKANA LETTER RI */
+ ["\u30EB", "\u30EB"], /* KATAKANA LETTER RU */
+ ["\u30EC", "\u30EC"], /* KATAKANA LETTER RE */
+ ["\u30ED", "\u30ED"], /* KATAKANA LETTER RO */
+ ["\u30EE", "\u30EE"], /* KATAKANA LETTER SMALL WA */
+ ["\u30EF", "\u30EF"], /* KATAKANA LETTER WA */
+ ["\u30F0", "\u30F0"], /* KATAKANA LETTER WI */
+ ["\u30F1", "\u30F1"], /* KATAKANA LETTER WE */
+ ["\u30F2", "\u30F2"], /* KATAKANA LETTER WO */
+ ["\u30F3", "\u30F3"], /* KATAKANA LETTER N */
+ ["\u30F4", "\u30F4"], /* KATAKANA LETTER VU */
+ ["\u30F5", "\u30F5"], /* KATAKANA LETTER SMALL KA */
+ ["\u30F6", "\u30F6"], /* KATAKANA LETTER SMALL KE */
+ ["\u30F7", "\u30F7"], /* KATAKANA LETTER VA */
+ ["\u30F8", "\u30F8"], /* KATAKANA LETTER VI */
+ ["\u30F9", "\u30F9"], /* KATAKANA LETTER VE */
+ ["\u30FA", "\u30FA"], /* KATAKANA LETTER VO */
+ ["\u30FB", "\u30FB"], /* KATAKANA MIDDLE DOT */
+ ["\u30FC", "\u30FC"], /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ ["\u30FD", "\u30FD"], /* KATAKANA ITERATION MARK */
+ ["\u30FE", "\u30FE"], /* KATAKANA VOICED ITERATION MARK */
+ ["\u30FF", "\u30FF"], /* KATAKANA DIGRAPH KOTO */
+ ["\u3100", "\u3100"],
+ ["\u3101", "\u3101"],
+ ["\u3102", "\u3102"],
+ ["\u3103", "\u3103"],
+ ["\u3104", "\u3104"],
+ ["\u3105", "\u3105"], /* BOPOMOFO LETTER B */
+ ["\u3106", "\u3106"], /* BOPOMOFO LETTER P */
+ ["\u3107", "\u3107"], /* BOPOMOFO LETTER M */
+ ["\u3108", "\u3108"], /* BOPOMOFO LETTER F */
+ ["\u3109", "\u3109"], /* BOPOMOFO LETTER D */
+ ["\u310A", "\u310A"], /* BOPOMOFO LETTER T */
+ ["\u310B", "\u310B"], /* BOPOMOFO LETTER N */
+ ["\u310C", "\u310C"], /* BOPOMOFO LETTER L */
+ ["\u310D", "\u310D"], /* BOPOMOFO LETTER G */
+ ["\u310E", "\u310E"], /* BOPOMOFO LETTER K */
+ ["\u310F", "\u310F"], /* BOPOMOFO LETTER H */
+ ["\u3110", "\u3110"], /* BOPOMOFO LETTER J */
+ ["\u3111", "\u3111"], /* BOPOMOFO LETTER Q */
+ ["\u3112", "\u3112"], /* BOPOMOFO LETTER X */
+ ["\u3113", "\u3113"], /* BOPOMOFO LETTER ZH */
+ ["\u3114", "\u3114"], /* BOPOMOFO LETTER CH */
+ ["\u3115", "\u3115"], /* BOPOMOFO LETTER SH */
+ ["\u3116", "\u3116"], /* BOPOMOFO LETTER R */
+ ["\u3117", "\u3117"], /* BOPOMOFO LETTER Z */
+ ["\u3118", "\u3118"], /* BOPOMOFO LETTER C */
+ ["\u3119", "\u3119"], /* BOPOMOFO LETTER S */
+ ["\u311A", "\u311A"], /* BOPOMOFO LETTER A */
+ ["\u311B", "\u311B"], /* BOPOMOFO LETTER O */
+ ["\u311C", "\u311C"], /* BOPOMOFO LETTER E */
+ ["\u311D", "\u311D"], /* BOPOMOFO LETTER EH */
+ ["\u311E", "\u311E"], /* BOPOMOFO LETTER AI */
+ ["\u311F", "\u311F"], /* BOPOMOFO LETTER EI */
+ ["\u3120", "\u3120"], /* BOPOMOFO LETTER AU */
+ ["\u3121", "\u3121"], /* BOPOMOFO LETTER OU */
+ ["\u3122", "\u3122"], /* BOPOMOFO LETTER AN */
+ ["\u3123", "\u3123"], /* BOPOMOFO LETTER EN */
+ ["\u3124", "\u3124"], /* BOPOMOFO LETTER ANG */
+ ["\u3125", "\u3125"], /* BOPOMOFO LETTER ENG */
+ ["\u3126", "\u3126"], /* BOPOMOFO LETTER ER */
+ ["\u3127", "\u3127"], /* BOPOMOFO LETTER I */
+ ["\u3128", "\u3128"], /* BOPOMOFO LETTER U */
+ ["\u3129", "\u3129"], /* BOPOMOFO LETTER IU */
+ ["\u312A", "\u312A"], /* BOPOMOFO LETTER V */
+ ["\u312B", "\u312B"], /* BOPOMOFO LETTER NG */
+ ["\u312C", "\u312C"], /* BOPOMOFO LETTER GN */
+ ["\u312D", "\u312D"], /* BOPOMOFO LETTER IH */
+ ["\u312E", "\u312E"], /* BOPOMOFO LETTER O WITH DOT ABOVE */
+ ["\u312F", "\u312F"], /* BOPOMOFO LETTER NN */
+ ["\u3130", "\u3130"],
+ ["\u3131", "\u3131"], /* HANGUL LETTER KIYEOK (HANGUL LETTER GIYEOG) */
+ ["\u3132", "\u3132"], /* HANGUL LETTER SSANGKIYEOK (HANGUL LETTER SSANG GIYEOG) */
+ ["\u3133", "\u3133"], /* HANGUL LETTER KIYEOK-SIOS (HANGUL LETTER GIYEOG SIOS) */
+ ["\u3134", "\u3134"], /* HANGUL LETTER NIEUN */
+ ["\u3135", "\u3135"], /* HANGUL LETTER NIEUN-CIEUC (HANGUL LETTER NIEUN JIEUJ) */
+ ["\u3136", "\u3136"], /* HANGUL LETTER NIEUN-HIEUH (HANGUL LETTER NIEUN HIEUH) */
+ ["\u3137", "\u3137"], /* HANGUL LETTER TIKEUT (HANGUL LETTER DIGEUD) */
+ ["\u3138", "\u3138"], /* HANGUL LETTER SSANGTIKEUT (HANGUL LETTER SSANG DIGEUD) */
+ ["\u3139", "\u3139"], /* HANGUL LETTER RIEUL (HANGUL LETTER LIEUL) */
+ ["\u313A", "\u313A"], /* HANGUL LETTER RIEUL-KIYEOK (HANGUL LETTER LIEUL GIYEOG) */
+ ["\u313B", "\u313B"], /* HANGUL LETTER RIEUL-MIEUM (HANGUL LETTER LIEUL MIEUM) */
+ ["\u313C", "\u313C"], /* HANGUL LETTER RIEUL-PIEUP (HANGUL LETTER LIEUL BIEUB) */
+ ["\u313D", "\u313D"], /* HANGUL LETTER RIEUL-SIOS (HANGUL LETTER LIEUL SIOS) */
+ ["\u313E", "\u313E"], /* HANGUL LETTER RIEUL-THIEUTH (HANGUL LETTER LIEUL TIEUT) */
+ ["\u313F", "\u313F"], /* HANGUL LETTER RIEUL-PHIEUPH (HANGUL LETTER LIEUL PIEUP) */
+ ["\u3140", "\u3140"], /* HANGUL LETTER RIEUL-HIEUH (HANGUL LETTER LIEUL HIEUH) */
+ ["\u3141", "\u3141"], /* HANGUL LETTER MIEUM */
+ ["\u3142", "\u3142"], /* HANGUL LETTER PIEUP (HANGUL LETTER BIEUB) */
+ ["\u3143", "\u3143"], /* HANGUL LETTER SSANGPIEUP (HANGUL LETTER SSANG BIEUB) */
+ ["\u3144", "\u3144"], /* HANGUL LETTER PIEUP-SIOS (HANGUL LETTER BIEUB SIOS) */
+ ["\u3145", "\u3145"], /* HANGUL LETTER SIOS */
+ ["\u3146", "\u3146"], /* HANGUL LETTER SSANGSIOS (HANGUL LETTER SSANG SIOS) */
+ ["\u3147", "\u3147"], /* HANGUL LETTER IEUNG */
+ ["\u3148", "\u3148"], /* HANGUL LETTER CIEUC (HANGUL LETTER JIEUJ) */
+ ["\u3149", "\u3149"], /* HANGUL LETTER SSANGCIEUC (HANGUL LETTER SSANG JIEUJ) */
+ ["\u314A", "\u314A"], /* HANGUL LETTER CHIEUCH (HANGUL LETTER CIEUC) */
+ ["\u314B", "\u314B"], /* HANGUL LETTER KHIEUKH (HANGUL LETTER KIYEOK) */
+ ["\u314C", "\u314C"], /* HANGUL LETTER THIEUTH (HANGUL LETTER TIEUT) */
+ ["\u314D", "\u314D"], /* HANGUL LETTER PHIEUPH (HANGUL LETTER PIEUP) */
+ ["\u314E", "\u314E"], /* HANGUL LETTER HIEUH */
+ ["\u314F", "\u314F"], /* HANGUL LETTER A */
+ ["\u3150", "\u3150"], /* HANGUL LETTER AE */
+ ["\u3151", "\u3151"], /* HANGUL LETTER YA */
+ ["\u3152", "\u3152"], /* HANGUL LETTER YAE */
+ ["\u3153", "\u3153"], /* HANGUL LETTER EO */
+ ["\u3154", "\u3154"], /* HANGUL LETTER E */
+ ["\u3155", "\u3155"], /* HANGUL LETTER YEO */
+ ["\u3156", "\u3156"], /* HANGUL LETTER YE */
+ ["\u3157", "\u3157"], /* HANGUL LETTER O */
+ ["\u3158", "\u3158"], /* HANGUL LETTER WA */
+ ["\u3159", "\u3159"], /* HANGUL LETTER WAE */
+ ["\u315A", "\u315A"], /* HANGUL LETTER OE */
+ ["\u315B", "\u315B"], /* HANGUL LETTER YO */
+ ["\u315C", "\u315C"], /* HANGUL LETTER U */
+ ["\u315D", "\u315D"], /* HANGUL LETTER WEO */
+ ["\u315E", "\u315E"], /* HANGUL LETTER WE */
+ ["\u315F", "\u315F"], /* HANGUL LETTER WI */
+ ["\u3160", "\u3160"], /* HANGUL LETTER YU */
+ ["\u3161", "\u3161"], /* HANGUL LETTER EU */
+ ["\u3162", "\u3162"], /* HANGUL LETTER YI */
+ ["\u3163", "\u3163"], /* HANGUL LETTER I */
+ ["\u3164", "\u3164"], /* HANGUL FILLER (HANGUL CAE OM) */
+ ["\u3165", "\u3165"], /* HANGUL LETTER SSANGNIEUN (HANGUL LETTER SSANG NIEUN) */
+ ["\u3166", "\u3166"], /* HANGUL LETTER NIEUN-TIKEUT (HANGUL LETTER NIEUN DIGEUD) */
+ ["\u3167", "\u3167"], /* HANGUL LETTER NIEUN-SIOS (HANGUL LETTER NIEUN SIOS) */
+ ["\u3168", "\u3168"], /* HANGUL LETTER NIEUN-PANSIOS (HANGUL LETTER NIEUN BAN CHI EUM) */
+ ["\u3169", "\u3169"], /* HANGUL LETTER RIEUL-KIYEOK-SIOS (HANGUL LETTER LIEUL GIYEOG SIOS) */
+ ["\u316A", "\u316A"], /* HANGUL LETTER RIEUL-TIKEUT (HANGUL LETTER LIEUL DIGEUD) */
+ ["\u316B", "\u316B"], /* HANGUL LETTER RIEUL-PIEUP-SIOS (HANGUL LETTER LIEUL BIEUB SIOS) */
+ ["\u316C", "\u316C"], /* HANGUL LETTER RIEUL-PANSIOS (HANGUL LETTER LIEUL BAN CHI EUM) */
+ ["\u316D", "\u316D"], /* HANGUL LETTER RIEUL-YEORINHIEUH (HANGUL LETTER LIEUL YEOLIN HIEUH) */
+ ["\u316E", "\u316E"], /* HANGUL LETTER MIEUM-PIEUP (HANGUL LETTER MIEUM BIEUB) */
+ ["\u316F", "\u316F"], /* HANGUL LETTER MIEUM-SIOS (HANGUL LETTER MIEUM SIOS) */
+ ["\u3170", "\u3170"], /* HANGUL LETTER MIEUM-PANSIOS (HANGUL LETTER BIEUB BAN CHI EUM) */
+ ["\u3171", "\u3171"], /* HANGUL LETTER KAPYEOUNMIEUM (HANGUL LETTER MIEUM SUN GYEONG EUM) */
+ ["\u3172", "\u3172"], /* HANGUL LETTER PIEUP-KIYEOK (HANGUL LETTER BIEUB GIYEOG) */
+ ["\u3173", "\u3173"], /* HANGUL LETTER PIEUP-TIKEUT (HANGUL LETTER BIEUB DIGEUD) */
+ ["\u3174", "\u3174"], /* HANGUL LETTER PIEUP-SIOS-KIYEOK (HANGUL LETTER BIEUB SIOS GIYEOG) */
+ ["\u3175", "\u3175"], /* HANGUL LETTER PIEUP-SIOS-TIKEUT (HANGUL LETTER BIEUB SIOS DIGEUD) */
+ ["\u3176", "\u3176"], /* HANGUL LETTER PIEUP-CIEUC (HANGUL LETTER BIEUB JIEUJ) */
+ ["\u3177", "\u3177"], /* HANGUL LETTER PIEUP-THIEUTH (HANGUL LETTER BIEUB TIEUT) */
+ ["\u3178", "\u3178"], /* HANGUL LETTER KAPYEOUNPIEUP (HANGUL LETTER BIEUB SUN GYEONG EUM) */
+ ["\u3179", "\u3179"], /* HANGUL LETTER KAPYEOUNSSANGPIEUP (HANGUL LETTER SSANG BIEUB SUN GYEONG EUM) */
+ ["\u317A", "\u317A"], /* HANGUL LETTER SIOS-KIYEOK (HANGUL LETTER SIOS GIYEOG) */
+ ["\u317B", "\u317B"], /* HANGUL LETTER SIOS-NIEUN (HANGUL LETTER SIOS NIEUN) */
+ ["\u317C", "\u317C"], /* HANGUL LETTER SIOS-TIKEUT (HANGUL LETTER SIOS DIGEUD) */
+ ["\u317D", "\u317D"], /* HANGUL LETTER SIOS-PIEUP (HANGUL LETTER SIOS BIEUB) */
+ ["\u317E", "\u317E"], /* HANGUL LETTER SIOS-CIEUC (HANGUL LETTER SIOS JIEUJ) */
+ ["\u317F", "\u317F"], /* HANGUL LETTER PANSIOS (HANGUL LETTER BAN CHI EUM) */
+ ["\u3180", "\u3180"], /* HANGUL LETTER SSANGIEUNG (HANGUL LETTER SSANG IEUNG) */
+ ["\u3181", "\u3181"], /* HANGUL LETTER YESIEUNG (HANGUL LETTER NGIEUNG) */
+ ["\u3182", "\u3182"], /* HANGUL LETTER YESIEUNG-SIOS (HANGUL LETTER NGIEUNG SIOS) */
+ ["\u3183", "\u3183"], /* HANGUL LETTER YESIEUNG-PANSIOS (HANGUL LETTER NGIEUNG BAN CHI EUM) */
+ ["\u3184", "\u3184"], /* HANGUL LETTER KAPYEOUNPHIEUPH (HANGUL LETTER PIEUP SUN GYEONG EUM) */
+ ["\u3185", "\u3185"], /* HANGUL LETTER SSANGHIEUH (HANGUL LETTER SSANG HIEUH) */
+ ["\u3186", "\u3186"], /* HANGUL LETTER YEORINHIEUH (HANGUL LETTER YEOLIN HIEUH) */
+ ["\u3187", "\u3187"], /* HANGUL LETTER YO-YA (HANGUL LETTER YOYA) */
+ ["\u3188", "\u3188"], /* HANGUL LETTER YO-YAE (HANGUL LETTER YOYAE) */
+ ["\u3189", "\u3189"], /* HANGUL LETTER YO-I (HANGUL LETTER YOI) */
+ ["\u318A", "\u318A"], /* HANGUL LETTER YU-YEO (HANGUL LETTER YUYEO) */
+ ["\u318B", "\u318B"], /* HANGUL LETTER YU-YE (HANGUL LETTER YUYE) */
+ ["\u318C", "\u318C"], /* HANGUL LETTER YU-I (HANGUL LETTER YUI) */
+ ["\u318D", "\u318D"], /* HANGUL LETTER ARAEA (HANGUL LETTER ALAE A) */
+ ["\u318E", "\u318E"], /* HANGUL LETTER ARAEAE (HANGUL LETTER ALAE AE) */
+ ["\u318F", "\u318F"],
+ ["\u3190", "\u3190"], /* IDEOGRAPHIC ANNOTATION LINKING MARK (KANBUN TATETEN) */
+ ["\u3191", "\u3191"], /* IDEOGRAPHIC ANNOTATION REVERSE MARK (KAERITEN RE) */
+ ["\u3192", "\u3192"], /* IDEOGRAPHIC ANNOTATION ONE MARK (KAERITEN ITI) */
+ ["\u3193", "\u3193"], /* IDEOGRAPHIC ANNOTATION TWO MARK (KAERITEN NI) */
+ ["\u3194", "\u3194"], /* IDEOGRAPHIC ANNOTATION THREE MARK (KAERITEN SAN) */
+ ["\u3195", "\u3195"], /* IDEOGRAPHIC ANNOTATION FOUR MARK (KAERITEN SI) */
+ ["\u3196", "\u3196"], /* IDEOGRAPHIC ANNOTATION TOP MARK (KAERITEN ZYOU) */
+ ["\u3197", "\u3197"], /* IDEOGRAPHIC ANNOTATION MIDDLE MARK (KAERITEN TYUU) */
+ ["\u3198", "\u3198"], /* IDEOGRAPHIC ANNOTATION BOTTOM MARK (KAERITEN GE) */
+ ["\u3199", "\u3199"], /* IDEOGRAPHIC ANNOTATION FIRST MARK (KAERITEN KOU) */
+ ["\u319A", "\u319A"], /* IDEOGRAPHIC ANNOTATION SECOND MARK (KAERITEN OTU) */
+ ["\u319B", "\u319B"], /* IDEOGRAPHIC ANNOTATION THIRD MARK (KAERITEN HEI) */
+ ["\u319C", "\u319C"], /* IDEOGRAPHIC ANNOTATION FOURTH MARK (KAERITEN TEI) */
+ ["\u319D", "\u319D"], /* IDEOGRAPHIC ANNOTATION HEAVEN MARK (KAERITEN TEN) */
+ ["\u319E", "\u319E"], /* IDEOGRAPHIC ANNOTATION EARTH MARK (KAERITEN TI) */
+ ["\u319F", "\u319F"], /* IDEOGRAPHIC ANNOTATION MAN MARK (KAERITEN ZIN) */
+ ["\u31A0", "\u31A0"], /* BOPOMOFO LETTER BU */
+ ["\u31A1", "\u31A1"], /* BOPOMOFO LETTER ZI */
+ ["\u31A2", "\u31A2"], /* BOPOMOFO LETTER JI */
+ ["\u31A3", "\u31A3"], /* BOPOMOFO LETTER GU */
+ ["\u31A4", "\u31A4"], /* BOPOMOFO LETTER EE */
+ ["\u31A5", "\u31A5"], /* BOPOMOFO LETTER ENN */
+ ["\u31A6", "\u31A6"], /* BOPOMOFO LETTER OO */
+ ["\u31A7", "\u31A7"], /* BOPOMOFO LETTER ONN */
+ ["\u31A8", "\u31A8"], /* BOPOMOFO LETTER IR */
+ ["\u31A9", "\u31A9"], /* BOPOMOFO LETTER ANN */
+ ["\u31AA", "\u31AA"], /* BOPOMOFO LETTER INN */
+ ["\u31AB", "\u31AB"], /* BOPOMOFO LETTER UNN */
+ ["\u31AC", "\u31AC"], /* BOPOMOFO LETTER IM */
+ ["\u31AD", "\u31AD"], /* BOPOMOFO LETTER NGG */
+ ["\u31AE", "\u31AE"], /* BOPOMOFO LETTER AINN */
+ ["\u31AF", "\u31AF"], /* BOPOMOFO LETTER AUNN */
+ ["\u31B0", "\u31B0"], /* BOPOMOFO LETTER AM */
+ ["\u31B1", "\u31B1"], /* BOPOMOFO LETTER OM */
+ ["\u31B2", "\u31B2"], /* BOPOMOFO LETTER ONG */
+ ["\u31B3", "\u31B3"], /* BOPOMOFO LETTER INNN */
+ ["\u31B4", "\u31B4"], /* BOPOMOFO FINAL LETTER P */
+ ["\u31B5", "\u31B5"], /* BOPOMOFO FINAL LETTER T */
+ ["\u31B6", "\u31B6"], /* BOPOMOFO FINAL LETTER K */
+ ["\u31B7", "\u31B7"], /* BOPOMOFO FINAL LETTER H */
+ ["\u31B8", "\u31B8"], /* BOPOMOFO LETTER GH */
+ ["\u31B9", "\u31B9"], /* BOPOMOFO LETTER LH */
+ ["\u31BA", "\u31BA"], /* BOPOMOFO LETTER ZY */
+ ["\u31BB", "\u31BB"],
+ ["\u31BC", "\u31BC"],
+ ["\u31BD", "\u31BD"],
+ ["\u31BE", "\u31BE"],
+ ["\u31BF", "\u31BF"],
+ ["\u31C0", "\u31C0"], /* CJK STROKE T */
+ ["\u31C1", "\u31C1"], /* CJK STROKE WG */
+ ["\u31C2", "\u31C2"], /* CJK STROKE XG */
+ ["\u31C3", "\u31C3"], /* CJK STROKE BXG */
+ ["\u31C4", "\u31C4"], /* CJK STROKE SW */
+ ["\u31C5", "\u31C5"], /* CJK STROKE HZZ */
+ ["\u31C6", "\u31C6"], /* CJK STROKE HZG */
+ ["\u31C7", "\u31C7"], /* CJK STROKE HP */
+ ["\u31C8", "\u31C8"], /* CJK STROKE HZWG */
+ ["\u31C9", "\u31C9"], /* CJK STROKE SZWG */
+ ["\u31CA", "\u31CA"], /* CJK STROKE HZT */
+ ["\u31CB", "\u31CB"], /* CJK STROKE HZZP */
+ ["\u31CC", "\u31CC"], /* CJK STROKE HPWG */
+ ["\u31CD", "\u31CD"], /* CJK STROKE HZW */
+ ["\u31CE", "\u31CE"], /* CJK STROKE HZZZ */
+ ["\u31CF", "\u31CF"], /* CJK STROKE N */
+ ["\u31D0", "\u31D0"], /* CJK STROKE H */
+ ["\u31D1", "\u31D1"], /* CJK STROKE S */
+ ["\u31D2", "\u31D2"], /* CJK STROKE P */
+ ["\u31D3", "\u31D3"], /* CJK STROKE SP */
+ ["\u31D4", "\u31D4"], /* CJK STROKE D */
+ ["\u31D5", "\u31D5"], /* CJK STROKE HZ */
+ ["\u31D6", "\u31D6"], /* CJK STROKE HG */
+ ["\u31D7", "\u31D7"], /* CJK STROKE SZ */
+ ["\u31D8", "\u31D8"], /* CJK STROKE SWZ */
+ ["\u31D9", "\u31D9"], /* CJK STROKE ST */
+ ["\u31DA", "\u31DA"], /* CJK STROKE SG */
+ ["\u31DB", "\u31DB"], /* CJK STROKE PD */
+ ["\u31DC", "\u31DC"], /* CJK STROKE PZ */
+ ["\u31DD", "\u31DD"], /* CJK STROKE TN */
+ ["\u31DE", "\u31DE"], /* CJK STROKE SZZ */
+ ["\u31DF", "\u31DF"], /* CJK STROKE SWG */
+ ["\u31E0", "\u31E0"], /* CJK STROKE HXWG */
+ ["\u31E1", "\u31E1"], /* CJK STROKE HZZZG */
+ ["\u31E2", "\u31E2"], /* CJK STROKE PG */
+ ["\u31E3", "\u31E3"], /* CJK STROKE Q */
+ ["\u31E4", "\u31E4"],
+ ["\u31E5", "\u31E5"],
+ ["\u31E6", "\u31E6"],
+ ["\u31E7", "\u31E7"],
+ ["\u31E8", "\u31E8"],
+ ["\u31E9", "\u31E9"],
+ ["\u31EA", "\u31EA"],
+ ["\u31EB", "\u31EB"],
+ ["\u31EC", "\u31EC"],
+ ["\u31ED", "\u31ED"],
+ ["\u31EE", "\u31EE"],
+ ["\u31EF", "\u31EF"],
+ ["\u31F0", "\u31F0"], /* KATAKANA LETTER SMALL KU */
+ ["\u31F1", "\u31F1"], /* KATAKANA LETTER SMALL SI */
+ ["\u31F2", "\u31F2"], /* KATAKANA LETTER SMALL SU */
+ ["\u31F3", "\u31F3"], /* KATAKANA LETTER SMALL TO */
+ ["\u31F4", "\u31F4"], /* KATAKANA LETTER SMALL NU */
+ ["\u31F5", "\u31F5"], /* KATAKANA LETTER SMALL HA */
+ ["\u31F6", "\u31F6"], /* KATAKANA LETTER SMALL HI */
+ ["\u31F7", "\u31F7"], /* KATAKANA LETTER SMALL HU */
+ ["\u31F8", "\u31F8"], /* KATAKANA LETTER SMALL HE */
+ ["\u31F9", "\u31F9"], /* KATAKANA LETTER SMALL HO */
+ ["\u31FA", "\u31FA"], /* KATAKANA LETTER SMALL MU */
+ ["\u31FB", "\u31FB"], /* KATAKANA LETTER SMALL RA */
+ ["\u31FC", "\u31FC"], /* KATAKANA LETTER SMALL RI */
+ ["\u31FD", "\u31FD"], /* KATAKANA LETTER SMALL RU */
+ ["\u31FE", "\u31FE"], /* KATAKANA LETTER SMALL RE */
+ ["\u31FF", "\u31FF"], /* KATAKANA LETTER SMALL RO */
+ ["\u3200", "\u3200"], /* PARENTHESIZED HANGUL KIYEOK (PARENTHESIZED HANGUL GIYEOG) */
+ ["\u3201", "\u3201"], /* PARENTHESIZED HANGUL NIEUN */
+ ["\u3202", "\u3202"], /* PARENTHESIZED HANGUL TIKEUT (PARENTHESIZED HANGUL DIGEUD) */
+ ["\u3203", "\u3203"], /* PARENTHESIZED HANGUL RIEUL (PARENTHESIZED HANGUL LIEUL) */
+ ["\u3204", "\u3204"], /* PARENTHESIZED HANGUL MIEUM */
+ ["\u3205", "\u3205"], /* PARENTHESIZED HANGUL PIEUP (PARENTHESIZED HANGUL BIEUB) */
+ ["\u3206", "\u3206"], /* PARENTHESIZED HANGUL SIOS */
+ ["\u3207", "\u3207"], /* PARENTHESIZED HANGUL IEUNG */
+ ["\u3208", "\u3208"], /* PARENTHESIZED HANGUL CIEUC (PARENTHESIZED HANGUL JIEUJ) */
+ ["\u3209", "\u3209"], /* PARENTHESIZED HANGUL CHIEUCH (PARENTHESIZED HANGUL CIEUC) */
+ ["\u320A", "\u320A"], /* PARENTHESIZED HANGUL KHIEUKH (PARENTHESIZED HANGUL KIYEOK) */
+ ["\u320B", "\u320B"], /* PARENTHESIZED HANGUL THIEUTH (PARENTHESIZED HANGUL TIEUT) */
+ ["\u320C", "\u320C"], /* PARENTHESIZED HANGUL PHIEUPH (PARENTHESIZED HANGUL PIEUP) */
+ ["\u320D", "\u320D"], /* PARENTHESIZED HANGUL HIEUH */
+ ["\u320E", "\u320E"], /* PARENTHESIZED HANGUL KIYEOK A (PARENTHESIZED HANGUL GA) */
+ ["\u320F", "\u320F"], /* PARENTHESIZED HANGUL NIEUN A (PARENTHESIZED HANGUL NA) */
+ ["\u3210", "\u3210"], /* PARENTHESIZED HANGUL TIKEUT A (PARENTHESIZED HANGUL DA) */
+ ["\u3211", "\u3211"], /* PARENTHESIZED HANGUL RIEUL A (PARENTHESIZED HANGUL LA) */
+ ["\u3212", "\u3212"], /* PARENTHESIZED HANGUL MIEUM A (PARENTHESIZED HANGUL MA) */
+ ["\u3213", "\u3213"], /* PARENTHESIZED HANGUL PIEUP A (PARENTHESIZED HANGUL BA) */
+ ["\u3214", "\u3214"], /* PARENTHESIZED HANGUL SIOS A (PARENTHESIZED HANGUL SA) */
+ ["\u3215", "\u3215"], /* PARENTHESIZED HANGUL IEUNG A (PARENTHESIZED HANGUL A) */
+ ["\u3216", "\u3216"], /* PARENTHESIZED HANGUL CIEUC A (PARENTHESIZED HANGUL JA) */
+ ["\u3217", "\u3217"], /* PARENTHESIZED HANGUL CHIEUCH A (PARENTHESIZED HANGUL CA) */
+ ["\u3218", "\u3218"], /* PARENTHESIZED HANGUL KHIEUKH A (PARENTHESIZED HANGUL KA) */
+ ["\u3219", "\u3219"], /* PARENTHESIZED HANGUL THIEUTH A (PARENTHESIZED HANGUL TA) */
+ ["\u321A", "\u321A"], /* PARENTHESIZED HANGUL PHIEUPH A (PARENTHESIZED HANGUL PA) */
+ ["\u321B", "\u321B"], /* PARENTHESIZED HANGUL HIEUH A (PARENTHESIZED HANGUL HA) */
+ ["\u321C", "\u321C"], /* PARENTHESIZED HANGUL CIEUC U (PARENTHESIZED HANGUL JU) */
+ ["\u321D", "\u321D"], /* PARENTHESIZED KOREAN CHARACTER OJEON */
+ ["\u321E", "\u321E"], /* PARENTHESIZED KOREAN CHARACTER O HU */
+ ["\u321F", "\u321F"],
+ ["\u3220", "\u3220"], /* PARENTHESIZED IDEOGRAPH ONE */
+ ["\u3221", "\u3221"], /* PARENTHESIZED IDEOGRAPH TWO */
+ ["\u3222", "\u3222"], /* PARENTHESIZED IDEOGRAPH THREE */
+ ["\u3223", "\u3223"], /* PARENTHESIZED IDEOGRAPH FOUR */
+ ["\u3224", "\u3224"], /* PARENTHESIZED IDEOGRAPH FIVE */
+ ["\u3225", "\u3225"], /* PARENTHESIZED IDEOGRAPH SIX */
+ ["\u3226", "\u3226"], /* PARENTHESIZED IDEOGRAPH SEVEN */
+ ["\u3227", "\u3227"], /* PARENTHESIZED IDEOGRAPH EIGHT */
+ ["\u3228", "\u3228"], /* PARENTHESIZED IDEOGRAPH NINE */
+ ["\u3229", "\u3229"], /* PARENTHESIZED IDEOGRAPH TEN */
+ ["\u322A", "\u322A"], /* PARENTHESIZED IDEOGRAPH MOON */
+ ["\u322B", "\u322B"], /* PARENTHESIZED IDEOGRAPH FIRE */
+ ["\u322C", "\u322C"], /* PARENTHESIZED IDEOGRAPH WATER */
+ ["\u322D", "\u322D"], /* PARENTHESIZED IDEOGRAPH WOOD */
+ ["\u322E", "\u322E"], /* PARENTHESIZED IDEOGRAPH METAL */
+ ["\u322F", "\u322F"], /* PARENTHESIZED IDEOGRAPH EARTH */
+ ["\u3230", "\u3230"], /* PARENTHESIZED IDEOGRAPH SUN */
+ ["\u3231", "\u3231"], /* PARENTHESIZED IDEOGRAPH STOCK */
+ ["\u3232", "\u3232"], /* PARENTHESIZED IDEOGRAPH HAVE */
+ ["\u3233", "\u3233"], /* PARENTHESIZED IDEOGRAPH SOCIETY */
+ ["\u3234", "\u3234"], /* PARENTHESIZED IDEOGRAPH NAME */
+ ["\u3235", "\u3235"], /* PARENTHESIZED IDEOGRAPH SPECIAL */
+ ["\u3236", "\u3236"], /* PARENTHESIZED IDEOGRAPH FINANCIAL */
+ ["\u3237", "\u3237"], /* PARENTHESIZED IDEOGRAPH CONGRATULATION */
+ ["\u3238", "\u3238"], /* PARENTHESIZED IDEOGRAPH LABOR */
+ ["\u3239", "\u3239"], /* PARENTHESIZED IDEOGRAPH REPRESENT */
+ ["\u323A", "\u323A"], /* PARENTHESIZED IDEOGRAPH CALL */
+ ["\u323B", "\u323B"], /* PARENTHESIZED IDEOGRAPH STUDY */
+ ["\u323C", "\u323C"], /* PARENTHESIZED IDEOGRAPH SUPERVISE */
+ ["\u323D", "\u323D"], /* PARENTHESIZED IDEOGRAPH ENTERPRISE */
+ ["\u323E", "\u323E"], /* PARENTHESIZED IDEOGRAPH RESOURCE */
+ ["\u323F", "\u323F"], /* PARENTHESIZED IDEOGRAPH ALLIANCE */
+ ["\u3240", "\u3240"], /* PARENTHESIZED IDEOGRAPH FESTIVAL */
+ ["\u3241", "\u3241"], /* PARENTHESIZED IDEOGRAPH REST */
+ ["\u3242", "\u3242"], /* PARENTHESIZED IDEOGRAPH SELF */
+ ["\u3243", "\u3243"], /* PARENTHESIZED IDEOGRAPH REACH */
+ ["\u3244", "\u3244"], /* CIRCLED IDEOGRAPH QUESTION */
+ ["\u3245", "\u3245"], /* CIRCLED IDEOGRAPH KINDERGARTEN */
+ ["\u3246", "\u3246"], /* CIRCLED IDEOGRAPH SCHOOL */
+ ["\u3247", "\u3247"], /* CIRCLED IDEOGRAPH KOTO */
+ ["\u3248", "\u3248"], /* CIRCLED NUMBER TEN ON BLACK SQUARE */
+ ["\u3249", "\u3249"], /* CIRCLED NUMBER TWENTY ON BLACK SQUARE */
+ ["\u324A", "\u324A"], /* CIRCLED NUMBER THIRTY ON BLACK SQUARE */
+ ["\u324B", "\u324B"], /* CIRCLED NUMBER FORTY ON BLACK SQUARE */
+ ["\u324C", "\u324C"], /* CIRCLED NUMBER FIFTY ON BLACK SQUARE */
+ ["\u324D", "\u324D"], /* CIRCLED NUMBER SIXTY ON BLACK SQUARE */
+ ["\u324E", "\u324E"], /* CIRCLED NUMBER SEVENTY ON BLACK SQUARE */
+ ["\u324F", "\u324F"], /* CIRCLED NUMBER EIGHTY ON BLACK SQUARE */
+ ["\u3250", "\u3250"], /* PARTNERSHIP SIGN */
+ ["\u3251", "\u3251"], /* CIRCLED NUMBER TWENTY ONE */
+ ["\u3252", "\u3252"], /* CIRCLED NUMBER TWENTY TWO */
+ ["\u3253", "\u3253"], /* CIRCLED NUMBER TWENTY THREE */
+ ["\u3254", "\u3254"], /* CIRCLED NUMBER TWENTY FOUR */
+ ["\u3255", "\u3255"], /* CIRCLED NUMBER TWENTY FIVE */
+ ["\u3256", "\u3256"], /* CIRCLED NUMBER TWENTY SIX */
+ ["\u3257", "\u3257"], /* CIRCLED NUMBER TWENTY SEVEN */
+ ["\u3258", "\u3258"], /* CIRCLED NUMBER TWENTY EIGHT */
+ ["\u3259", "\u3259"], /* CIRCLED NUMBER TWENTY NINE */
+ ["\u325A", "\u325A"], /* CIRCLED NUMBER THIRTY */
+ ["\u325B", "\u325B"], /* CIRCLED NUMBER THIRTY ONE */
+ ["\u325C", "\u325C"], /* CIRCLED NUMBER THIRTY TWO */
+ ["\u325D", "\u325D"], /* CIRCLED NUMBER THIRTY THREE */
+ ["\u325E", "\u325E"], /* CIRCLED NUMBER THIRTY FOUR */
+ ["\u325F", "\u325F"], /* CIRCLED NUMBER THIRTY FIVE */
+ ["\u3260", "\u3260"], /* CIRCLED HANGUL KIYEOK (CIRCLED HANGUL GIYEOG) */
+ ["\u3261", "\u3261"], /* CIRCLED HANGUL NIEUN */
+ ["\u3262", "\u3262"], /* CIRCLED HANGUL TIKEUT (CIRCLED HANGUL DIGEUD) */
+ ["\u3263", "\u3263"], /* CIRCLED HANGUL RIEUL (CIRCLED HANGUL LIEUL) */
+ ["\u3264", "\u3264"], /* CIRCLED HANGUL MIEUM */
+ ["\u3265", "\u3265"], /* CIRCLED HANGUL PIEUP (CIRCLED HANGUL BIEUB) */
+ ["\u3266", "\u3266"], /* CIRCLED HANGUL SIOS */
+ ["\u3267", "\u3267"], /* CIRCLED HANGUL IEUNG */
+ ["\u3268", "\u3268"], /* CIRCLED HANGUL CIEUC (CIRCLED HANGUL JIEUJ) */
+ ["\u3269", "\u3269"], /* CIRCLED HANGUL CHIEUCH (CIRCLED HANGUL CIEUC) */
+ ["\u326A", "\u326A"], /* CIRCLED HANGUL KHIEUKH (CIRCLED HANGUL KIYEOK) */
+ ["\u326B", "\u326B"], /* CIRCLED HANGUL THIEUTH (CIRCLED HANGUL TIEUT) */
+ ["\u326C", "\u326C"], /* CIRCLED HANGUL PHIEUPH (CIRCLED HANGUL PIEUP) */
+ ["\u326D", "\u326D"], /* CIRCLED HANGUL HIEUH */
+ ["\u326E", "\u326E"], /* CIRCLED HANGUL KIYEOK A (CIRCLED HANGUL GA) */
+ ["\u326F", "\u326F"], /* CIRCLED HANGUL NIEUN A (CIRCLED HANGUL NA) */
+ ["\u3270", "\u3270"], /* CIRCLED HANGUL TIKEUT A (CIRCLED HANGUL DA) */
+ ["\u3271", "\u3271"], /* CIRCLED HANGUL RIEUL A (CIRCLED HANGUL LA) */
+ ["\u3272", "\u3272"], /* CIRCLED HANGUL MIEUM A (CIRCLED HANGUL MA) */
+ ["\u3273", "\u3273"], /* CIRCLED HANGUL PIEUP A (CIRCLED HANGUL BA) */
+ ["\u3274", "\u3274"], /* CIRCLED HANGUL SIOS A (CIRCLED HANGUL SA) */
+ ["\u3275", "\u3275"], /* CIRCLED HANGUL IEUNG A (CIRCLED HANGUL A) */
+ ["\u3276", "\u3276"], /* CIRCLED HANGUL CIEUC A (CIRCLED HANGUL JA) */
+ ["\u3277", "\u3277"], /* CIRCLED HANGUL CHIEUCH A (CIRCLED HANGUL CA) */
+ ["\u3278", "\u3278"], /* CIRCLED HANGUL KHIEUKH A (CIRCLED HANGUL KA) */
+ ["\u3279", "\u3279"], /* CIRCLED HANGUL THIEUTH A (CIRCLED HANGUL TA) */
+ ["\u327A", "\u327A"], /* CIRCLED HANGUL PHIEUPH A (CIRCLED HANGUL PA) */
+ ["\u327B", "\u327B"], /* CIRCLED HANGUL HIEUH A (CIRCLED HANGUL HA) */
+ ["\u327C", "\u327C"], /* CIRCLED KOREAN CHARACTER CHAMKO */
+ ["\u327D", "\u327D"], /* CIRCLED KOREAN CHARACTER JUEUI */
+ ["\u327E", "\u327E"], /* CIRCLED HANGUL IEUNG U */
+ ["\u327F", "\u327F"], /* KOREAN STANDARD SYMBOL */
+ ["\u3280", "\u3280"], /* CIRCLED IDEOGRAPH ONE */
+ ["\u3281", "\u3281"], /* CIRCLED IDEOGRAPH TWO */
+ ["\u3282", "\u3282"], /* CIRCLED IDEOGRAPH THREE */
+ ["\u3283", "\u3283"], /* CIRCLED IDEOGRAPH FOUR */
+ ["\u3284", "\u3284"], /* CIRCLED IDEOGRAPH FIVE */
+ ["\u3285", "\u3285"], /* CIRCLED IDEOGRAPH SIX */
+ ["\u3286", "\u3286"], /* CIRCLED IDEOGRAPH SEVEN */
+ ["\u3287", "\u3287"], /* CIRCLED IDEOGRAPH EIGHT */
+ ["\u3288", "\u3288"], /* CIRCLED IDEOGRAPH NINE */
+ ["\u3289", "\u3289"], /* CIRCLED IDEOGRAPH TEN */
+ ["\u328A", "\u328A"], /* CIRCLED IDEOGRAPH MOON */
+ ["\u328B", "\u328B"], /* CIRCLED IDEOGRAPH FIRE */
+ ["\u328C", "\u328C"], /* CIRCLED IDEOGRAPH WATER */
+ ["\u328D", "\u328D"], /* CIRCLED IDEOGRAPH WOOD */
+ ["\u328E", "\u328E"], /* CIRCLED IDEOGRAPH METAL */
+ ["\u328F", "\u328F"], /* CIRCLED IDEOGRAPH EARTH */
+ ["\u3290", "\u3290"], /* CIRCLED IDEOGRAPH SUN */
+ ["\u3291", "\u3291"], /* CIRCLED IDEOGRAPH STOCK */
+ ["\u3292", "\u3292"], /* CIRCLED IDEOGRAPH HAVE */
+ ["\u3293", "\u3293"], /* CIRCLED IDEOGRAPH SOCIETY */
+ ["\u3294", "\u3294"], /* CIRCLED IDEOGRAPH NAME */
+ ["\u3295", "\u3295"], /* CIRCLED IDEOGRAPH SPECIAL */
+ ["\u3296", "\u3296"], /* CIRCLED IDEOGRAPH FINANCIAL */
+ ["\u3297", "\u3297"], /* CIRCLED IDEOGRAPH CONGRATULATION */
+ ["\u3298", "\u3298"], /* CIRCLED IDEOGRAPH LABOR */
+ ["\u3299", "\u3299"], /* CIRCLED IDEOGRAPH SECRET */
+ ["\u329A", "\u329A"], /* CIRCLED IDEOGRAPH MALE */
+ ["\u329B", "\u329B"], /* CIRCLED IDEOGRAPH FEMALE */
+ ["\u329C", "\u329C"], /* CIRCLED IDEOGRAPH SUITABLE */
+ ["\u329D", "\u329D"], /* CIRCLED IDEOGRAPH EXCELLENT */
+ ["\u329E", "\u329E"], /* CIRCLED IDEOGRAPH PRINT */
+ ["\u329F", "\u329F"], /* CIRCLED IDEOGRAPH ATTENTION */
+ ["\u32A0", "\u32A0"], /* CIRCLED IDEOGRAPH ITEM */
+ ["\u32A1", "\u32A1"], /* CIRCLED IDEOGRAPH REST */
+ ["\u32A2", "\u32A2"], /* CIRCLED IDEOGRAPH COPY */
+ ["\u32A3", "\u32A3"], /* CIRCLED IDEOGRAPH CORRECT */
+ ["\u32A4", "\u32A4"], /* CIRCLED IDEOGRAPH HIGH */
+ ["\u32A5", "\u32A5"], /* CIRCLED IDEOGRAPH CENTRE (CIRCLED IDEOGRAPH CENTER) */
+ ["\u32A6", "\u32A6"], /* CIRCLED IDEOGRAPH LOW */
+ ["\u32A7", "\u32A7"], /* CIRCLED IDEOGRAPH LEFT */
+ ["\u32A8", "\u32A8"], /* CIRCLED IDEOGRAPH RIGHT */
+ ["\u32A9", "\u32A9"], /* CIRCLED IDEOGRAPH MEDICINE */
+ ["\u32AA", "\u32AA"], /* CIRCLED IDEOGRAPH RELIGION */
+ ["\u32AB", "\u32AB"], /* CIRCLED IDEOGRAPH STUDY */
+ ["\u32AC", "\u32AC"], /* CIRCLED IDEOGRAPH SUPERVISE */
+ ["\u32AD", "\u32AD"], /* CIRCLED IDEOGRAPH ENTERPRISE */
+ ["\u32AE", "\u32AE"], /* CIRCLED IDEOGRAPH RESOURCE */
+ ["\u32AF", "\u32AF"], /* CIRCLED IDEOGRAPH ALLIANCE */
+ ["\u32B0", "\u32B0"], /* CIRCLED IDEOGRAPH NIGHT */
+ ["\u32B1", "\u32B1"], /* CIRCLED NUMBER THIRTY SIX */
+ ["\u32B2", "\u32B2"], /* CIRCLED NUMBER THIRTY SEVEN */
+ ["\u32B3", "\u32B3"], /* CIRCLED NUMBER THIRTY EIGHT */
+ ["\u32B4", "\u32B4"], /* CIRCLED NUMBER THIRTY NINE */
+ ["\u32B5", "\u32B5"], /* CIRCLED NUMBER FORTY */
+ ["\u32B6", "\u32B6"], /* CIRCLED NUMBER FORTY ONE */
+ ["\u32B7", "\u32B7"], /* CIRCLED NUMBER FORTY TWO */
+ ["\u32B8", "\u32B8"], /* CIRCLED NUMBER FORTY THREE */
+ ["\u32B9", "\u32B9"], /* CIRCLED NUMBER FORTY FOUR */
+ ["\u32BA", "\u32BA"], /* CIRCLED NUMBER FORTY FIVE */
+ ["\u32BB", "\u32BB"], /* CIRCLED NUMBER FORTY SIX */
+ ["\u32BC", "\u32BC"], /* CIRCLED NUMBER FORTY SEVEN */
+ ["\u32BD", "\u32BD"], /* CIRCLED NUMBER FORTY EIGHT */
+ ["\u32BE", "\u32BE"], /* CIRCLED NUMBER FORTY NINE */
+ ["\u32BF", "\u32BF"], /* CIRCLED NUMBER FIFTY */
+ ["\u32C0", "\u32C0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY */
+ ["\u32C1", "\u32C1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY */
+ ["\u32C2", "\u32C2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH */
+ ["\u32C3", "\u32C3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL */
+ ["\u32C4", "\u32C4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY */
+ ["\u32C5", "\u32C5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE */
+ ["\u32C6", "\u32C6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY */
+ ["\u32C7", "\u32C7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST */
+ ["\u32C8", "\u32C8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER */
+ ["\u32C9", "\u32C9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER */
+ ["\u32CA", "\u32CA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER */
+ ["\u32CB", "\u32CB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER */
+ ["\u32CC", "\u32CC"], /* SQUARE HG */
+ ["\u32CD", "\u32CD"], /* SQUARE ERG */
+ ["\u32CE", "\u32CE"], /* SQUARE EV */
+ ["\u32CF", "\u32CF"], /* LIMITED LIABILITY SIGN */
+ ["\u32D0", "\u32D0"], /* CIRCLED KATAKANA A */
+ ["\u32D1", "\u32D1"], /* CIRCLED KATAKANA I */
+ ["\u32D2", "\u32D2"], /* CIRCLED KATAKANA U */
+ ["\u32D3", "\u32D3"], /* CIRCLED KATAKANA E */
+ ["\u32D4", "\u32D4"], /* CIRCLED KATAKANA O */
+ ["\u32D5", "\u32D5"], /* CIRCLED KATAKANA KA */
+ ["\u32D6", "\u32D6"], /* CIRCLED KATAKANA KI */
+ ["\u32D7", "\u32D7"], /* CIRCLED KATAKANA KU */
+ ["\u32D8", "\u32D8"], /* CIRCLED KATAKANA KE */
+ ["\u32D9", "\u32D9"], /* CIRCLED KATAKANA KO */
+ ["\u32DA", "\u32DA"], /* CIRCLED KATAKANA SA */
+ ["\u32DB", "\u32DB"], /* CIRCLED KATAKANA SI */
+ ["\u32DC", "\u32DC"], /* CIRCLED KATAKANA SU */
+ ["\u32DD", "\u32DD"], /* CIRCLED KATAKANA SE */
+ ["\u32DE", "\u32DE"], /* CIRCLED KATAKANA SO */
+ ["\u32DF", "\u32DF"], /* CIRCLED KATAKANA TA */
+ ["\u32E0", "\u32E0"], /* CIRCLED KATAKANA TI */
+ ["\u32E1", "\u32E1"], /* CIRCLED KATAKANA TU */
+ ["\u32E2", "\u32E2"], /* CIRCLED KATAKANA TE */
+ ["\u32E3", "\u32E3"], /* CIRCLED KATAKANA TO */
+ ["\u32E4", "\u32E4"], /* CIRCLED KATAKANA NA */
+ ["\u32E5", "\u32E5"], /* CIRCLED KATAKANA NI */
+ ["\u32E6", "\u32E6"], /* CIRCLED KATAKANA NU */
+ ["\u32E7", "\u32E7"], /* CIRCLED KATAKANA NE */
+ ["\u32E8", "\u32E8"], /* CIRCLED KATAKANA NO */
+ ["\u32E9", "\u32E9"], /* CIRCLED KATAKANA HA */
+ ["\u32EA", "\u32EA"], /* CIRCLED KATAKANA HI */
+ ["\u32EB", "\u32EB"], /* CIRCLED KATAKANA HU */
+ ["\u32EC", "\u32EC"], /* CIRCLED KATAKANA HE */
+ ["\u32ED", "\u32ED"], /* CIRCLED KATAKANA HO */
+ ["\u32EE", "\u32EE"], /* CIRCLED KATAKANA MA */
+ ["\u32EF", "\u32EF"], /* CIRCLED KATAKANA MI */
+ ["\u32F0", "\u32F0"], /* CIRCLED KATAKANA MU */
+ ["\u32F1", "\u32F1"], /* CIRCLED KATAKANA ME */
+ ["\u32F2", "\u32F2"], /* CIRCLED KATAKANA MO */
+ ["\u32F3", "\u32F3"], /* CIRCLED KATAKANA YA */
+ ["\u32F4", "\u32F4"], /* CIRCLED KATAKANA YU */
+ ["\u32F5", "\u32F5"], /* CIRCLED KATAKANA YO */
+ ["\u32F6", "\u32F6"], /* CIRCLED KATAKANA RA */
+ ["\u32F7", "\u32F7"], /* CIRCLED KATAKANA RI */
+ ["\u32F8", "\u32F8"], /* CIRCLED KATAKANA RU */
+ ["\u32F9", "\u32F9"], /* CIRCLED KATAKANA RE */
+ ["\u32FA", "\u32FA"], /* CIRCLED KATAKANA RO */
+ ["\u32FB", "\u32FB"], /* CIRCLED KATAKANA WA */
+ ["\u32FC", "\u32FC"], /* CIRCLED KATAKANA WI */
+ ["\u32FD", "\u32FD"], /* CIRCLED KATAKANA WE */
+ ["\u32FE", "\u32FE"], /* CIRCLED KATAKANA WO */
+ ["\u32FF", "\u32FF"],
+ ["\u3300", "\u3300"], /* SQUARE APAATO (SQUARED APAATO) */
+ ["\u3301", "\u3301"], /* SQUARE ARUHUA (SQUARED ARUHUA) */
+ ["\u3302", "\u3302"], /* SQUARE ANPEA (SQUARED ANPEA) */
+ ["\u3303", "\u3303"], /* SQUARE AARU (SQUARED AARU) */
+ ["\u3304", "\u3304"], /* SQUARE ININGU (SQUARED ININGU) */
+ ["\u3305", "\u3305"], /* SQUARE INTI (SQUARED INTI) */
+ ["\u3306", "\u3306"], /* SQUARE UON (SQUARED UON) */
+ ["\u3307", "\u3307"], /* SQUARE ESUKUUDO (SQUARED ESUKUUDO) */
+ ["\u3308", "\u3308"], /* SQUARE EEKAA (SQUARED EEKAA) */
+ ["\u3309", "\u3309"], /* SQUARE ONSU (SQUARED ONSU) */
+ ["\u330A", "\u330A"], /* SQUARE OOMU (SQUARED OOMU) */
+ ["\u330B", "\u330B"], /* SQUARE KAIRI (SQUARED KAIRI) */
+ ["\u330C", "\u330C"], /* SQUARE KARATTO (SQUARED KARATTO) */
+ ["\u330D", "\u330D"], /* SQUARE KARORII (SQUARED KARORII) */
+ ["\u330E", "\u330E"], /* SQUARE GARON (SQUARED GARON) */
+ ["\u330F", "\u330F"], /* SQUARE GANMA (SQUARED GANMA) */
+ ["\u3310", "\u3310"], /* SQUARE GIGA (SQUARED GIGA) */
+ ["\u3311", "\u3311"], /* SQUARE GINII (SQUARED GINII) */
+ ["\u3312", "\u3312"], /* SQUARE KYURII (SQUARED KYURII) */
+ ["\u3313", "\u3313"], /* SQUARE GIRUDAA (SQUARED GIRUDAA) */
+ ["\u3314", "\u3314"], /* SQUARE KIRO (SQUARED KIRO) */
+ ["\u3315", "\u3315"], /* SQUARE KIROGURAMU (SQUARED KIROGURAMU) */
+ ["\u3316", "\u3316"], /* SQUARE KIROMEETORU (SQUARED KIROMEETORU) */
+ ["\u3317", "\u3317"], /* SQUARE KIROWATTO (SQUARED KIROWATTO) */
+ ["\u3318", "\u3318"], /* SQUARE GURAMU (SQUARED GURAMU) */
+ ["\u3319", "\u3319"], /* SQUARE GURAMUTON (SQUARED GURAMUTON) */
+ ["\u331A", "\u331A"], /* SQUARE KURUZEIRO (SQUARED KURUZEIRO) */
+ ["\u331B", "\u331B"], /* SQUARE KUROONE (SQUARED KUROONE) */
+ ["\u331C", "\u331C"], /* SQUARE KEESU (SQUARED KEESU) */
+ ["\u331D", "\u331D"], /* SQUARE KORUNA (SQUARED KORUNA) */
+ ["\u331E", "\u331E"], /* SQUARE KOOPO (SQUARED KOOPO) */
+ ["\u331F", "\u331F"], /* SQUARE SAIKURU (SQUARED SAIKURU) */
+ ["\u3320", "\u3320"], /* SQUARE SANTIIMU (SQUARED SANTIIMU) */
+ ["\u3321", "\u3321"], /* SQUARE SIRINGU (SQUARED SIRINGU) */
+ ["\u3322", "\u3322"], /* SQUARE SENTI (SQUARED SENTI) */
+ ["\u3323", "\u3323"], /* SQUARE SENTO (SQUARED SENTO) */
+ ["\u3324", "\u3324"], /* SQUARE DAASU (SQUARED DAASU) */
+ ["\u3325", "\u3325"], /* SQUARE DESI (SQUARED DESI) */
+ ["\u3326", "\u3326"], /* SQUARE DORU (SQUARED DORU) */
+ ["\u3327", "\u3327"], /* SQUARE TON (SQUARED TON) */
+ ["\u3328", "\u3328"], /* SQUARE NANO (SQUARED NANO) */
+ ["\u3329", "\u3329"], /* SQUARE NOTTO (SQUARED NOTTO) */
+ ["\u332A", "\u332A"], /* SQUARE HAITU (SQUARED HAITU) */
+ ["\u332B", "\u332B"], /* SQUARE PAASENTO (SQUARED PAASENTO) */
+ ["\u332C", "\u332C"], /* SQUARE PAATU (SQUARED PAATU) */
+ ["\u332D", "\u332D"], /* SQUARE BAARERU (SQUARED BAARERU) */
+ ["\u332E", "\u332E"], /* SQUARE PIASUTORU (SQUARED PIASUTORU) */
+ ["\u332F", "\u332F"], /* SQUARE PIKURU (SQUARED PIKURU) */
+ ["\u3330", "\u3330"], /* SQUARE PIKO (SQUARED PIKO) */
+ ["\u3331", "\u3331"], /* SQUARE BIRU (SQUARED BIRU) */
+ ["\u3332", "\u3332"], /* SQUARE HUARADDO (SQUARED HUARADDO) */
+ ["\u3333", "\u3333"], /* SQUARE HUIITO (SQUARED HUIITO) */
+ ["\u3334", "\u3334"], /* SQUARE BUSSYERU (SQUARED BUSSYERU) */
+ ["\u3335", "\u3335"], /* SQUARE HURAN (SQUARED HURAN) */
+ ["\u3336", "\u3336"], /* SQUARE HEKUTAARU (SQUARED HEKUTAARU) */
+ ["\u3337", "\u3337"], /* SQUARE PESO (SQUARED PESO) */
+ ["\u3338", "\u3338"], /* SQUARE PENIHI (SQUARED PENIHI) */
+ ["\u3339", "\u3339"], /* SQUARE HERUTU (SQUARED HERUTU) */
+ ["\u333A", "\u333A"], /* SQUARE PENSU (SQUARED PENSU) */
+ ["\u333B", "\u333B"], /* SQUARE PEEZI (SQUARED PEEZI) */
+ ["\u333C", "\u333C"], /* SQUARE BEETA (SQUARED BEETA) */
+ ["\u333D", "\u333D"], /* SQUARE POINTO (SQUARED POINTO) */
+ ["\u333E", "\u333E"], /* SQUARE BORUTO (SQUARED BORUTO) */
+ ["\u333F", "\u333F"], /* SQUARE HON (SQUARED HON) */
+ ["\u3340", "\u3340"], /* SQUARE PONDO (SQUARED PONDO) */
+ ["\u3341", "\u3341"], /* SQUARE HOORU (SQUARED HOORU) */
+ ["\u3342", "\u3342"], /* SQUARE HOON (SQUARED HOON) */
+ ["\u3343", "\u3343"], /* SQUARE MAIKURO (SQUARED MAIKURO) */
+ ["\u3344", "\u3344"], /* SQUARE MAIRU (SQUARED MAIRU) */
+ ["\u3345", "\u3345"], /* SQUARE MAHHA (SQUARED MAHHA) */
+ ["\u3346", "\u3346"], /* SQUARE MARUKU (SQUARED MARUKU) */
+ ["\u3347", "\u3347"], /* SQUARE MANSYON (SQUARED MANSYON) */
+ ["\u3348", "\u3348"], /* SQUARE MIKURON (SQUARED MIKURON) */
+ ["\u3349", "\u3349"], /* SQUARE MIRI (SQUARED MIRI) */
+ ["\u334A", "\u334A"], /* SQUARE MIRIBAARU (SQUARED MIRIBAARU) */
+ ["\u334B", "\u334B"], /* SQUARE MEGA (SQUARED MEGA) */
+ ["\u334C", "\u334C"], /* SQUARE MEGATON (SQUARED MEGATON) */
+ ["\u334D", "\u334D"], /* SQUARE MEETORU (SQUARED MEETORU) */
+ ["\u334E", "\u334E"], /* SQUARE YAADO (SQUARED YAADO) */
+ ["\u334F", "\u334F"], /* SQUARE YAARU (SQUARED YAARU) */
+ ["\u3350", "\u3350"], /* SQUARE YUAN (SQUARED YUAN) */
+ ["\u3351", "\u3351"], /* SQUARE RITTORU (SQUARED RITTORU) */
+ ["\u3352", "\u3352"], /* SQUARE RIRA (SQUARED RIRA) */
+ ["\u3353", "\u3353"], /* SQUARE RUPII (SQUARED RUPII) */
+ ["\u3354", "\u3354"], /* SQUARE RUUBURU (SQUARED RUUBURU) */
+ ["\u3355", "\u3355"], /* SQUARE REMU (SQUARED REMU) */
+ ["\u3356", "\u3356"], /* SQUARE RENTOGEN (SQUARED RENTOGEN) */
+ ["\u3357", "\u3357"], /* SQUARE WATTO (SQUARED WATTO) */
+ ["\u3358", "\u3358"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO */
+ ["\u3359", "\u3359"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE */
+ ["\u335A", "\u335A"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO */
+ ["\u335B", "\u335B"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE */
+ ["\u335C", "\u335C"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR */
+ ["\u335D", "\u335D"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE */
+ ["\u335E", "\u335E"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX */
+ ["\u335F", "\u335F"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN */
+ ["\u3360", "\u3360"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT */
+ ["\u3361", "\u3361"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE */
+ ["\u3362", "\u3362"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN */
+ ["\u3363", "\u3363"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN */
+ ["\u3364", "\u3364"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE */
+ ["\u3365", "\u3365"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN */
+ ["\u3366", "\u3366"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN */
+ ["\u3367", "\u3367"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN */
+ ["\u3368", "\u3368"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN */
+ ["\u3369", "\u3369"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN */
+ ["\u336A", "\u336A"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN */
+ ["\u336B", "\u336B"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN */
+ ["\u336C", "\u336C"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY */
+ ["\u336D", "\u336D"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE */
+ ["\u336E", "\u336E"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO */
+ ["\u336F", "\u336F"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE */
+ ["\u3370", "\u3370"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR */
+ ["\u3371", "\u3371"], /* SQUARE HPA */
+ ["\u3372", "\u3372"], /* SQUARE DA */
+ ["\u3373", "\u3373"], /* SQUARE AU */
+ ["\u3374", "\u3374"], /* SQUARE BAR */
+ ["\u3375", "\u3375"], /* SQUARE OV */
+ ["\u3376", "\u3376"], /* SQUARE PC */
+ ["\u3377", "\u3377"], /* SQUARE DM */
+ ["\u3378", "\u3378"], /* SQUARE DM SQUARED */
+ ["\u3379", "\u3379"], /* SQUARE DM CUBED */
+ ["\u337A", "\u337A"], /* SQUARE IU */
+ ["\u337B", "\u337B"], /* SQUARE ERA NAME HEISEI (SQUARED TWO IDEOGRAPHS ERA NAME HEISEI) */
+ ["\u337C", "\u337C"], /* SQUARE ERA NAME SYOUWA (SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA) */
+ ["\u337D", "\u337D"], /* SQUARE ERA NAME TAISYOU (SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU) */
+ ["\u337E", "\u337E"], /* SQUARE ERA NAME MEIZI (SQUARED TWO IDEOGRAPHS ERA NAME MEIZI) */
+ ["\u337F", "\u337F"], /* SQUARE CORPORATION (SQUARED FOUR IDEOGRAPHS CORPORATION) */
+ ["\u3380", "\u3380"], /* SQUARE PA AMPS (SQUARED PA AMPS) */
+ ["\u3381", "\u3381"], /* SQUARE NA (SQUARED NA) */
+ ["\u3382", "\u3382"], /* SQUARE MU A (SQUARED MU A) */
+ ["\u3383", "\u3383"], /* SQUARE MA (SQUARED MA) */
+ ["\u3384", "\u3384"], /* SQUARE KA (SQUARED KA) */
+ ["\u3385", "\u3385"], /* SQUARE KB (SQUARED KB) */
+ ["\u3386", "\u3386"], /* SQUARE MB (SQUARED MB) */
+ ["\u3387", "\u3387"], /* SQUARE GB (SQUARED GB) */
+ ["\u3388", "\u3388"], /* SQUARE CAL (SQUARED CAL) */
+ ["\u3389", "\u3389"], /* SQUARE KCAL (SQUARED KCAL) */
+ ["\u338A", "\u338A"], /* SQUARE PF (SQUARED PF) */
+ ["\u338B", "\u338B"], /* SQUARE NF (SQUARED NF) */
+ ["\u338C", "\u338C"], /* SQUARE MU F (SQUARED MU F) */
+ ["\u338D", "\u338D"], /* SQUARE MU G (SQUARED MU G) */
+ ["\u338E", "\u338E"], /* SQUARE MG (SQUARED MG) */
+ ["\u338F", "\u338F"], /* SQUARE KG (SQUARED KG) */
+ ["\u3390", "\u3390"], /* SQUARE HZ (SQUARED HZ) */
+ ["\u3391", "\u3391"], /* SQUARE KHZ (SQUARED KHZ) */
+ ["\u3392", "\u3392"], /* SQUARE MHZ (SQUARED MHZ) */
+ ["\u3393", "\u3393"], /* SQUARE GHZ (SQUARED GHZ) */
+ ["\u3394", "\u3394"], /* SQUARE THZ (SQUARED THZ) */
+ ["\u3395", "\u3395"], /* SQUARE MU L (SQUARED MU L) */
+ ["\u3396", "\u3396"], /* SQUARE ML (SQUARED ML) */
+ ["\u3397", "\u3397"], /* SQUARE DL (SQUARED DL) */
+ ["\u3398", "\u3398"], /* SQUARE KL (SQUARED KL) */
+ ["\u3399", "\u3399"], /* SQUARE FM (SQUARED FM) */
+ ["\u339A", "\u339A"], /* SQUARE NM (SQUARED NM) */
+ ["\u339B", "\u339B"], /* SQUARE MU M (SQUARED MU M) */
+ ["\u339C", "\u339C"], /* SQUARE MM (SQUARED MM) */
+ ["\u339D", "\u339D"], /* SQUARE CM (SQUARED CM) */
+ ["\u339E", "\u339E"], /* SQUARE KM (SQUARED KM) */
+ ["\u339F", "\u339F"], /* SQUARE MM SQUARED (SQUARED MM SQUARED) */
+ ["\u33A0", "\u33A0"], /* SQUARE CM SQUARED (SQUARED CM SQUARED) */
+ ["\u33A1", "\u33A1"], /* SQUARE M SQUARED (SQUARED M SQUARED) */
+ ["\u33A2", "\u33A2"], /* SQUARE KM SQUARED (SQUARED KM SQUARED) */
+ ["\u33A3", "\u33A3"], /* SQUARE MM CUBED (SQUARED MM CUBED) */
+ ["\u33A4", "\u33A4"], /* SQUARE CM CUBED (SQUARED CM CUBED) */
+ ["\u33A5", "\u33A5"], /* SQUARE M CUBED (SQUARED M CUBED) */
+ ["\u33A6", "\u33A6"], /* SQUARE KM CUBED (SQUARED KM CUBED) */
+ ["\u33A7", "\u33A7"], /* SQUARE M OVER S (SQUARED M OVER S) */
+ ["\u33A8", "\u33A8"], /* SQUARE M OVER S SQUARED (SQUARED M OVER S SQUARED) */
+ ["\u33A9", "\u33A9"], /* SQUARE PA (SQUARED PA) */
+ ["\u33AA", "\u33AA"], /* SQUARE KPA (SQUARED KPA) */
+ ["\u33AB", "\u33AB"], /* SQUARE MPA (SQUARED MPA) */
+ ["\u33AC", "\u33AC"], /* SQUARE GPA (SQUARED GPA) */
+ ["\u33AD", "\u33AD"], /* SQUARE RAD (SQUARED RAD) */
+ ["\u33AE", "\u33AE"], /* SQUARE RAD OVER S (SQUARED RAD OVER S) */
+ ["\u33AF", "\u33AF"], /* SQUARE RAD OVER S SQUARED (SQUARED RAD OVER S SQUARED) */
+ ["\u33B0", "\u33B0"], /* SQUARE PS (SQUARED PS) */
+ ["\u33B1", "\u33B1"], /* SQUARE NS (SQUARED NS) */
+ ["\u33B2", "\u33B2"], /* SQUARE MU S (SQUARED MU S) */
+ ["\u33B3", "\u33B3"], /* SQUARE MS (SQUARED MS) */
+ ["\u33B4", "\u33B4"], /* SQUARE PV (SQUARED PV) */
+ ["\u33B5", "\u33B5"], /* SQUARE NV (SQUARED NV) */
+ ["\u33B6", "\u33B6"], /* SQUARE MU V (SQUARED MU V) */
+ ["\u33B7", "\u33B7"], /* SQUARE MV (SQUARED MV) */
+ ["\u33B8", "\u33B8"], /* SQUARE KV (SQUARED KV) */
+ ["\u33B9", "\u33B9"], /* SQUARE MV MEGA (SQUARED MV MEGA) */
+ ["\u33BA", "\u33BA"], /* SQUARE PW (SQUARED PW) */
+ ["\u33BB", "\u33BB"], /* SQUARE NW (SQUARED NW) */
+ ["\u33BC", "\u33BC"], /* SQUARE MU W (SQUARED MU W) */
+ ["\u33BD", "\u33BD"], /* SQUARE MW (SQUARED MW) */
+ ["\u33BE", "\u33BE"], /* SQUARE KW (SQUARED KW) */
+ ["\u33BF", "\u33BF"], /* SQUARE MW MEGA (SQUARED MW MEGA) */
+ ["\u33C0", "\u33C0"], /* SQUARE K OHM (SQUARED K OHM) */
+ ["\u33C1", "\u33C1"], /* SQUARE M OHM (SQUARED M OHM) */
+ ["\u33C2", "\u33C2"], /* SQUARE AM (SQUARED AM) */
+ ["\u33C3", "\u33C3"], /* SQUARE BQ (SQUARED BQ) */
+ ["\u33C4", "\u33C4"], /* SQUARE CC (SQUARED CC) */
+ ["\u33C5", "\u33C5"], /* SQUARE CD (SQUARED CD) */
+ ["\u33C6", "\u33C6"], /* SQUARE C OVER KG (SQUARED C OVER KG) */
+ ["\u33C7", "\u33C7"], /* SQUARE CO (SQUARED CO) */
+ ["\u33C8", "\u33C8"], /* SQUARE DB (SQUARED DB) */
+ ["\u33C9", "\u33C9"], /* SQUARE GY (SQUARED GY) */
+ ["\u33CA", "\u33CA"], /* SQUARE HA (SQUARED HA) */
+ ["\u33CB", "\u33CB"], /* SQUARE HP (SQUARED HP) */
+ ["\u33CC", "\u33CC"], /* SQUARE IN (SQUARED IN) */
+ ["\u33CD", "\u33CD"], /* SQUARE KK (SQUARED KK) */
+ ["\u33CE", "\u33CE"], /* SQUARE KM CAPITAL (SQUARED KM CAPITAL) */
+ ["\u33CF", "\u33CF"], /* SQUARE KT (SQUARED KT) */
+ ["\u33D0", "\u33D0"], /* SQUARE LM (SQUARED LM) */
+ ["\u33D1", "\u33D1"], /* SQUARE LN (SQUARED LN) */
+ ["\u33D2", "\u33D2"], /* SQUARE LOG (SQUARED LOG) */
+ ["\u33D3", "\u33D3"], /* SQUARE LX (SQUARED LX) */
+ ["\u33D4", "\u33D4"], /* SQUARE MB SMALL (SQUARED MB SMALL) */
+ ["\u33D5", "\u33D5"], /* SQUARE MIL (SQUARED MIL) */
+ ["\u33D6", "\u33D6"], /* SQUARE MOL (SQUARED MOL) */
+ ["\u33D7", "\u33D7"], /* SQUARE PH (SQUARED PH) */
+ ["\u33D8", "\u33D8"], /* SQUARE PM (SQUARED PM) */
+ ["\u33D9", "\u33D9"], /* SQUARE PPM (SQUARED PPM) */
+ ["\u33DA", "\u33DA"], /* SQUARE PR (SQUARED PR) */
+ ["\u33DB", "\u33DB"], /* SQUARE SR (SQUARED SR) */
+ ["\u33DC", "\u33DC"], /* SQUARE SV (SQUARED SV) */
+ ["\u33DD", "\u33DD"], /* SQUARE WB (SQUARED WB) */
+ ["\u33DE", "\u33DE"], /* SQUARE V OVER M */
+ ["\u33DF", "\u33DF"], /* SQUARE A OVER M */
+ ["\u33E0", "\u33E0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE */
+ ["\u33E1", "\u33E1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO */
+ ["\u33E2", "\u33E2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE */
+ ["\u33E3", "\u33E3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR */
+ ["\u33E4", "\u33E4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE */
+ ["\u33E5", "\u33E5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX */
+ ["\u33E6", "\u33E6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN */
+ ["\u33E7", "\u33E7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT */
+ ["\u33E8", "\u33E8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE */
+ ["\u33E9", "\u33E9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN */
+ ["\u33EA", "\u33EA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN */
+ ["\u33EB", "\u33EB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE */
+ ["\u33EC", "\u33EC"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN */
+ ["\u33ED", "\u33ED"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN */
+ ["\u33EE", "\u33EE"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN */
+ ["\u33EF", "\u33EF"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN */
+ ["\u33F0", "\u33F0"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN */
+ ["\u33F1", "\u33F1"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN */
+ ["\u33F2", "\u33F2"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN */
+ ["\u33F3", "\u33F3"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY */
+ ["\u33F4", "\u33F4"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE */
+ ["\u33F5", "\u33F5"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO */
+ ["\u33F6", "\u33F6"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE */
+ ["\u33F7", "\u33F7"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR */
+ ["\u33F8", "\u33F8"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE */
+ ["\u33F9", "\u33F9"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX */
+ ["\u33FA", "\u33FA"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN */
+ ["\u33FB", "\u33FB"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT */
+ ["\u33FC", "\u33FC"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE */
+ ["\u33FD", "\u33FD"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY */
+ ["\u33FE", "\u33FE"], /* IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE */
+ ["\u33FF", "\u33FF"], /* SQUARE GAL */
+ ["\u3400", "\u3400"], /* CJK Ideograph Extension A */
+ ["\u3401", "\u3401"], /* CJK Ideograph Extension A */
+ ["\u3402", "\u3402"], /* CJK Ideograph Extension A */
+ ["\u3403", "\u3403"], /* CJK Ideograph Extension A */
+ ["\u3404", "\u3404"], /* CJK Ideograph Extension A */
+ ["\u3405", "\u3405"], /* CJK Ideograph Extension A */
+ ["\u3406", "\u3406"], /* CJK Ideograph Extension A */
+ ["\u3407", "\u3407"], /* CJK Ideograph Extension A */
+ ["\u3408", "\u3408"], /* CJK Ideograph Extension A */
+ ["\u3409", "\u3409"], /* CJK Ideograph Extension A */
+ ["\u340A", "\u340A"], /* CJK Ideograph Extension A */
+ ["\u340B", "\u340B"], /* CJK Ideograph Extension A */
+ ["\u340C", "\u340C"], /* CJK Ideograph Extension A */
+ ["\u340D", "\u340D"], /* CJK Ideograph Extension A */
+ ["\u340E", "\u340E"], /* CJK Ideograph Extension A */
+ ["\u340F", "\u340F"], /* CJK Ideograph Extension A */
+ ["\u3410", "\u3410"], /* CJK Ideograph Extension A */
+ ["\u3411", "\u3411"], /* CJK Ideograph Extension A */
+ ["\u3412", "\u3412"], /* CJK Ideograph Extension A */
+ ["\u3413", "\u3413"], /* CJK Ideograph Extension A */
+ ["\u3414", "\u3414"], /* CJK Ideograph Extension A */
+ ["\u3415", "\u3415"], /* CJK Ideograph Extension A */
+ ["\u3416", "\u3416"], /* CJK Ideograph Extension A */
+ ["\u3417", "\u3417"], /* CJK Ideograph Extension A */
+ ["\u3418", "\u3418"], /* CJK Ideograph Extension A */
+ ["\u3419", "\u3419"], /* CJK Ideograph Extension A */
+ ["\u341A", "\u341A"], /* CJK Ideograph Extension A */
+ ["\u341B", "\u341B"], /* CJK Ideograph Extension A */
+ ["\u341C", "\u341C"], /* CJK Ideograph Extension A */
+ ["\u341D", "\u341D"], /* CJK Ideograph Extension A */
+ ["\u341E", "\u341E"], /* CJK Ideograph Extension A */
+ ["\u341F", "\u341F"], /* CJK Ideograph Extension A */
+ ["\u3420", "\u3420"], /* CJK Ideograph Extension A */
+ ["\u3421", "\u3421"], /* CJK Ideograph Extension A */
+ ["\u3422", "\u3422"], /* CJK Ideograph Extension A */
+ ["\u3423", "\u3423"], /* CJK Ideograph Extension A */
+ ["\u3424", "\u3424"], /* CJK Ideograph Extension A */
+ ["\u3425", "\u3425"], /* CJK Ideograph Extension A */
+ ["\u3426", "\u3426"], /* CJK Ideograph Extension A */
+ ["\u3427", "\u3427"], /* CJK Ideograph Extension A */
+ ["\u3428", "\u3428"], /* CJK Ideograph Extension A */
+ ["\u3429", "\u3429"], /* CJK Ideograph Extension A */
+ ["\u342A", "\u342A"], /* CJK Ideograph Extension A */
+ ["\u342B", "\u342B"], /* CJK Ideograph Extension A */
+ ["\u342C", "\u342C"], /* CJK Ideograph Extension A */
+ ["\u342D", "\u342D"], /* CJK Ideograph Extension A */
+ ["\u342E", "\u342E"], /* CJK Ideograph Extension A */
+ ["\u342F", "\u342F"], /* CJK Ideograph Extension A */
+ ["\u3430", "\u3430"], /* CJK Ideograph Extension A */
+ ["\u3431", "\u3431"], /* CJK Ideograph Extension A */
+ ["\u3432", "\u3432"], /* CJK Ideograph Extension A */
+ ["\u3433", "\u3433"], /* CJK Ideograph Extension A */
+ ["\u3434", "\u3434"], /* CJK Ideograph Extension A */
+ ["\u3435", "\u3435"], /* CJK Ideograph Extension A */
+ ["\u3436", "\u3436"], /* CJK Ideograph Extension A */
+ ["\u3437", "\u3437"], /* CJK Ideograph Extension A */
+ ["\u3438", "\u3438"], /* CJK Ideograph Extension A */
+ ["\u3439", "\u3439"], /* CJK Ideograph Extension A */
+ ["\u343A", "\u343A"], /* CJK Ideograph Extension A */
+ ["\u343B", "\u343B"], /* CJK Ideograph Extension A */
+ ["\u343C", "\u343C"], /* CJK Ideograph Extension A */
+ ["\u343D", "\u343D"], /* CJK Ideograph Extension A */
+ ["\u343E", "\u343E"], /* CJK Ideograph Extension A */
+ ["\u343F", "\u343F"], /* CJK Ideograph Extension A */
+ ["\u3440", "\u3440"], /* CJK Ideograph Extension A */
+ ["\u3441", "\u3441"], /* CJK Ideograph Extension A */
+ ["\u3442", "\u3442"], /* CJK Ideograph Extension A */
+ ["\u3443", "\u3443"], /* CJK Ideograph Extension A */
+ ["\u3444", "\u3444"], /* CJK Ideograph Extension A */
+ ["\u3445", "\u3445"], /* CJK Ideograph Extension A */
+ ["\u3446", "\u3446"], /* CJK Ideograph Extension A */
+ ["\u3447", "\u3447"], /* CJK Ideograph Extension A */
+ ["\u3448", "\u3448"], /* CJK Ideograph Extension A */
+ ["\u3449", "\u3449"], /* CJK Ideograph Extension A */
+ ["\u344A", "\u344A"], /* CJK Ideograph Extension A */
+ ["\u344B", "\u344B"], /* CJK Ideograph Extension A */
+ ["\u344C", "\u344C"], /* CJK Ideograph Extension A */
+ ["\u344D", "\u344D"], /* CJK Ideograph Extension A */
+ ["\u344E", "\u344E"], /* CJK Ideograph Extension A */
+ ["\u344F", "\u344F"], /* CJK Ideograph Extension A */
+ ["\u3450", "\u3450"], /* CJK Ideograph Extension A */
+ ["\u3451", "\u3451"], /* CJK Ideograph Extension A */
+ ["\u3452", "\u3452"], /* CJK Ideograph Extension A */
+ ["\u3453", "\u3453"], /* CJK Ideograph Extension A */
+ ["\u3454", "\u3454"], /* CJK Ideograph Extension A */
+ ["\u3455", "\u3455"], /* CJK Ideograph Extension A */
+ ["\u3456", "\u3456"], /* CJK Ideograph Extension A */
+ ["\u3457", "\u3457"], /* CJK Ideograph Extension A */
+ ["\u3458", "\u3458"], /* CJK Ideograph Extension A */
+ ["\u3459", "\u3459"], /* CJK Ideograph Extension A */
+ ["\u345A", "\u345A"], /* CJK Ideograph Extension A */
+ ["\u345B", "\u345B"], /* CJK Ideograph Extension A */
+ ["\u345C", "\u345C"], /* CJK Ideograph Extension A */
+ ["\u345D", "\u345D"], /* CJK Ideograph Extension A */
+ ["\u345E", "\u345E"], /* CJK Ideograph Extension A */
+ ["\u345F", "\u345F"], /* CJK Ideograph Extension A */
+ ["\u3460", "\u3460"], /* CJK Ideograph Extension A */
+ ["\u3461", "\u3461"], /* CJK Ideograph Extension A */
+ ["\u3462", "\u3462"], /* CJK Ideograph Extension A */
+ ["\u3463", "\u3463"], /* CJK Ideograph Extension A */
+ ["\u3464", "\u3464"], /* CJK Ideograph Extension A */
+ ["\u3465", "\u3465"], /* CJK Ideograph Extension A */
+ ["\u3466", "\u3466"], /* CJK Ideograph Extension A */
+ ["\u3467", "\u3467"], /* CJK Ideograph Extension A */
+ ["\u3468", "\u3468"], /* CJK Ideograph Extension A */
+ ["\u3469", "\u3469"], /* CJK Ideograph Extension A */
+ ["\u346A", "\u346A"], /* CJK Ideograph Extension A */
+ ["\u346B", "\u346B"], /* CJK Ideograph Extension A */
+ ["\u346C", "\u346C"], /* CJK Ideograph Extension A */
+ ["\u346D", "\u346D"], /* CJK Ideograph Extension A */
+ ["\u346E", "\u346E"], /* CJK Ideograph Extension A */
+ ["\u346F", "\u346F"], /* CJK Ideograph Extension A */
+ ["\u3470", "\u3470"], /* CJK Ideograph Extension A */
+ ["\u3471", "\u3471"], /* CJK Ideograph Extension A */
+ ["\u3472", "\u3472"], /* CJK Ideograph Extension A */
+ ["\u3473", "\u3473"], /* CJK Ideograph Extension A */
+ ["\u3474", "\u3474"], /* CJK Ideograph Extension A */
+ ["\u3475", "\u3475"], /* CJK Ideograph Extension A */
+ ["\u3476", "\u3476"], /* CJK Ideograph Extension A */
+ ["\u3477", "\u3477"], /* CJK Ideograph Extension A */
+ ["\u3478", "\u3478"], /* CJK Ideograph Extension A */
+ ["\u3479", "\u3479"], /* CJK Ideograph Extension A */
+ ["\u347A", "\u347A"], /* CJK Ideograph Extension A */
+ ["\u347B", "\u347B"], /* CJK Ideograph Extension A */
+ ["\u347C", "\u347C"], /* CJK Ideograph Extension A */
+ ["\u347D", "\u347D"], /* CJK Ideograph Extension A */
+ ["\u347E", "\u347E"], /* CJK Ideograph Extension A */
+ ["\u347F", "\u347F"], /* CJK Ideograph Extension A */
+ ["\u3480", "\u3480"], /* CJK Ideograph Extension A */
+ ["\u3481", "\u3481"], /* CJK Ideograph Extension A */
+ ["\u3482", "\u3482"], /* CJK Ideograph Extension A */
+ ["\u3483", "\u3483"], /* CJK Ideograph Extension A */
+ ["\u3484", "\u3484"], /* CJK Ideograph Extension A */
+ ["\u3485", "\u3485"], /* CJK Ideograph Extension A */
+ ["\u3486", "\u3486"], /* CJK Ideograph Extension A */
+ ["\u3487", "\u3487"], /* CJK Ideograph Extension A */
+ ["\u3488", "\u3488"], /* CJK Ideograph Extension A */
+ ["\u3489", "\u3489"], /* CJK Ideograph Extension A */
+ ["\u348A", "\u348A"], /* CJK Ideograph Extension A */
+ ["\u348B", "\u348B"], /* CJK Ideograph Extension A */
+ ["\u348C", "\u348C"], /* CJK Ideograph Extension A */
+ ["\u348D", "\u348D"], /* CJK Ideograph Extension A */
+ ["\u348E", "\u348E"], /* CJK Ideograph Extension A */
+ ["\u348F", "\u348F"], /* CJK Ideograph Extension A */
+ ["\u3490", "\u3490"], /* CJK Ideograph Extension A */
+ ["\u3491", "\u3491"], /* CJK Ideograph Extension A */
+ ["\u3492", "\u3492"], /* CJK Ideograph Extension A */
+ ["\u3493", "\u3493"], /* CJK Ideograph Extension A */
+ ["\u3494", "\u3494"], /* CJK Ideograph Extension A */
+ ["\u3495", "\u3495"], /* CJK Ideograph Extension A */
+ ["\u3496", "\u3496"], /* CJK Ideograph Extension A */
+ ["\u3497", "\u3497"], /* CJK Ideograph Extension A */
+ ["\u3498", "\u3498"], /* CJK Ideograph Extension A */
+ ["\u3499", "\u3499"], /* CJK Ideograph Extension A */
+ ["\u349A", "\u349A"], /* CJK Ideograph Extension A */
+ ["\u349B", "\u349B"], /* CJK Ideograph Extension A */
+ ["\u349C", "\u349C"], /* CJK Ideograph Extension A */
+ ["\u349D", "\u349D"], /* CJK Ideograph Extension A */
+ ["\u349E", "\u349E"], /* CJK Ideograph Extension A */
+ ["\u349F", "\u349F"], /* CJK Ideograph Extension A */
+ ["\u34A0", "\u34A0"], /* CJK Ideograph Extension A */
+ ["\u34A1", "\u34A1"], /* CJK Ideograph Extension A */
+ ["\u34A2", "\u34A2"], /* CJK Ideograph Extension A */
+ ["\u34A3", "\u34A3"], /* CJK Ideograph Extension A */
+ ["\u34A4", "\u34A4"], /* CJK Ideograph Extension A */
+ ["\u34A5", "\u34A5"], /* CJK Ideograph Extension A */
+ ["\u34A6", "\u34A6"], /* CJK Ideograph Extension A */
+ ["\u34A7", "\u34A7"], /* CJK Ideograph Extension A */
+ ["\u34A8", "\u34A8"], /* CJK Ideograph Extension A */
+ ["\u34A9", "\u34A9"], /* CJK Ideograph Extension A */
+ ["\u34AA", "\u34AA"], /* CJK Ideograph Extension A */
+ ["\u34AB", "\u34AB"], /* CJK Ideograph Extension A */
+ ["\u34AC", "\u34AC"], /* CJK Ideograph Extension A */
+ ["\u34AD", "\u34AD"], /* CJK Ideograph Extension A */
+ ["\u34AE", "\u34AE"], /* CJK Ideograph Extension A */
+ ["\u34AF", "\u34AF"], /* CJK Ideograph Extension A */
+ ["\u34B0", "\u34B0"], /* CJK Ideograph Extension A */
+ ["\u34B1", "\u34B1"], /* CJK Ideograph Extension A */
+ ["\u34B2", "\u34B2"], /* CJK Ideograph Extension A */
+ ["\u34B3", "\u34B3"], /* CJK Ideograph Extension A */
+ ["\u34B4", "\u34B4"], /* CJK Ideograph Extension A */
+ ["\u34B5", "\u34B5"], /* CJK Ideograph Extension A */
+ ["\u34B6", "\u34B6"], /* CJK Ideograph Extension A */
+ ["\u34B7", "\u34B7"], /* CJK Ideograph Extension A */
+ ["\u34B8", "\u34B8"], /* CJK Ideograph Extension A */
+ ["\u34B9", "\u34B9"], /* CJK Ideograph Extension A */
+ ["\u34BA", "\u34BA"], /* CJK Ideograph Extension A */
+ ["\u34BB", "\u34BB"], /* CJK Ideograph Extension A */
+ ["\u34BC", "\u34BC"], /* CJK Ideograph Extension A */
+ ["\u34BD", "\u34BD"], /* CJK Ideograph Extension A */
+ ["\u34BE", "\u34BE"], /* CJK Ideograph Extension A */
+ ["\u34BF", "\u34BF"], /* CJK Ideograph Extension A */
+ ["\u34C0", "\u34C0"], /* CJK Ideograph Extension A */
+ ["\u34C1", "\u34C1"], /* CJK Ideograph Extension A */
+ ["\u34C2", "\u34C2"], /* CJK Ideograph Extension A */
+ ["\u34C3", "\u34C3"], /* CJK Ideograph Extension A */
+ ["\u34C4", "\u34C4"], /* CJK Ideograph Extension A */
+ ["\u34C5", "\u34C5"], /* CJK Ideograph Extension A */
+ ["\u34C6", "\u34C6"], /* CJK Ideograph Extension A */
+ ["\u34C7", "\u34C7"], /* CJK Ideograph Extension A */
+ ["\u34C8", "\u34C8"], /* CJK Ideograph Extension A */
+ ["\u34C9", "\u34C9"], /* CJK Ideograph Extension A */
+ ["\u34CA", "\u34CA"], /* CJK Ideograph Extension A */
+ ["\u34CB", "\u34CB"], /* CJK Ideograph Extension A */
+ ["\u34CC", "\u34CC"], /* CJK Ideograph Extension A */
+ ["\u34CD", "\u34CD"], /* CJK Ideograph Extension A */
+ ["\u34CE", "\u34CE"], /* CJK Ideograph Extension A */
+ ["\u34CF", "\u34CF"], /* CJK Ideograph Extension A */
+ ["\u34D0", "\u34D0"], /* CJK Ideograph Extension A */
+ ["\u34D1", "\u34D1"], /* CJK Ideograph Extension A */
+ ["\u34D2", "\u34D2"], /* CJK Ideograph Extension A */
+ ["\u34D3", "\u34D3"], /* CJK Ideograph Extension A */
+ ["\u34D4", "\u34D4"], /* CJK Ideograph Extension A */
+ ["\u34D5", "\u34D5"], /* CJK Ideograph Extension A */
+ ["\u34D6", "\u34D6"], /* CJK Ideograph Extension A */
+ ["\u34D7", "\u34D7"], /* CJK Ideograph Extension A */
+ ["\u34D8", "\u34D8"], /* CJK Ideograph Extension A */
+ ["\u34D9", "\u34D9"], /* CJK Ideograph Extension A */
+ ["\u34DA", "\u34DA"], /* CJK Ideograph Extension A */
+ ["\u34DB", "\u34DB"], /* CJK Ideograph Extension A */
+ ["\u34DC", "\u34DC"], /* CJK Ideograph Extension A */
+ ["\u34DD", "\u34DD"], /* CJK Ideograph Extension A */
+ ["\u34DE", "\u34DE"], /* CJK Ideograph Extension A */
+ ["\u34DF", "\u34DF"], /* CJK Ideograph Extension A */
+ ["\u34E0", "\u34E0"], /* CJK Ideograph Extension A */
+ ["\u34E1", "\u34E1"], /* CJK Ideograph Extension A */
+ ["\u34E2", "\u34E2"], /* CJK Ideograph Extension A */
+ ["\u34E3", "\u34E3"], /* CJK Ideograph Extension A */
+ ["\u34E4", "\u34E4"], /* CJK Ideograph Extension A */
+ ["\u34E5", "\u34E5"], /* CJK Ideograph Extension A */
+ ["\u34E6", "\u34E6"], /* CJK Ideograph Extension A */
+ ["\u34E7", "\u34E7"], /* CJK Ideograph Extension A */
+ ["\u34E8", "\u34E8"], /* CJK Ideograph Extension A */
+ ["\u34E9", "\u34E9"], /* CJK Ideograph Extension A */
+ ["\u34EA", "\u34EA"], /* CJK Ideograph Extension A */
+ ["\u34EB", "\u34EB"], /* CJK Ideograph Extension A */
+ ["\u34EC", "\u34EC"], /* CJK Ideograph Extension A */
+ ["\u34ED", "\u34ED"], /* CJK Ideograph Extension A */
+ ["\u34EE", "\u34EE"], /* CJK Ideograph Extension A */
+ ["\u34EF", "\u34EF"], /* CJK Ideograph Extension A */
+ ["\u34F0", "\u34F0"], /* CJK Ideograph Extension A */
+ ["\u34F1", "\u34F1"], /* CJK Ideograph Extension A */
+ ["\u34F2", "\u34F2"], /* CJK Ideograph Extension A */
+ ["\u34F3", "\u34F3"], /* CJK Ideograph Extension A */
+ ["\u34F4", "\u34F4"], /* CJK Ideograph Extension A */
+ ["\u34F5", "\u34F5"], /* CJK Ideograph Extension A */
+ ["\u34F6", "\u34F6"], /* CJK Ideograph Extension A */
+ ["\u34F7", "\u34F7"], /* CJK Ideograph Extension A */
+ ["\u34F8", "\u34F8"], /* CJK Ideograph Extension A */
+ ["\u34F9", "\u34F9"], /* CJK Ideograph Extension A */
+ ["\u34FA", "\u34FA"], /* CJK Ideograph Extension A */
+ ["\u34FB", "\u34FB"], /* CJK Ideograph Extension A */
+ ["\u34FC", "\u34FC"], /* CJK Ideograph Extension A */
+ ["\u34FD", "\u34FD"], /* CJK Ideograph Extension A */
+ ["\u34FE", "\u34FE"], /* CJK Ideograph Extension A */
+ ["\u34FF", "\u34FF"], /* CJK Ideograph Extension A */
+ ["\u3500", "\u3500"], /* CJK Ideograph Extension A */
+ ["\u3501", "\u3501"], /* CJK Ideograph Extension A */
+ ["\u3502", "\u3502"], /* CJK Ideograph Extension A */
+ ["\u3503", "\u3503"], /* CJK Ideograph Extension A */
+ ["\u3504", "\u3504"], /* CJK Ideograph Extension A */
+ ["\u3505", "\u3505"], /* CJK Ideograph Extension A */
+ ["\u3506", "\u3506"], /* CJK Ideograph Extension A */
+ ["\u3507", "\u3507"], /* CJK Ideograph Extension A */
+ ["\u3508", "\u3508"], /* CJK Ideograph Extension A */
+ ["\u3509", "\u3509"], /* CJK Ideograph Extension A */
+ ["\u350A", "\u350A"], /* CJK Ideograph Extension A */
+ ["\u350B", "\u350B"], /* CJK Ideograph Extension A */
+ ["\u350C", "\u350C"], /* CJK Ideograph Extension A */
+ ["\u350D", "\u350D"], /* CJK Ideograph Extension A */
+ ["\u350E", "\u350E"], /* CJK Ideograph Extension A */
+ ["\u350F", "\u350F"], /* CJK Ideograph Extension A */
+ ["\u3510", "\u3510"], /* CJK Ideograph Extension A */
+ ["\u3511", "\u3511"], /* CJK Ideograph Extension A */
+ ["\u3512", "\u3512"], /* CJK Ideograph Extension A */
+ ["\u3513", "\u3513"], /* CJK Ideograph Extension A */
+ ["\u3514", "\u3514"], /* CJK Ideograph Extension A */
+ ["\u3515", "\u3515"], /* CJK Ideograph Extension A */
+ ["\u3516", "\u3516"], /* CJK Ideograph Extension A */
+ ["\u3517", "\u3517"], /* CJK Ideograph Extension A */
+ ["\u3518", "\u3518"], /* CJK Ideograph Extension A */
+ ["\u3519", "\u3519"], /* CJK Ideograph Extension A */
+ ["\u351A", "\u351A"], /* CJK Ideograph Extension A */
+ ["\u351B", "\u351B"], /* CJK Ideograph Extension A */
+ ["\u351C", "\u351C"], /* CJK Ideograph Extension A */
+ ["\u351D", "\u351D"], /* CJK Ideograph Extension A */
+ ["\u351E", "\u351E"], /* CJK Ideograph Extension A */
+ ["\u351F", "\u351F"], /* CJK Ideograph Extension A */
+ ["\u3520", "\u3520"], /* CJK Ideograph Extension A */
+ ["\u3521", "\u3521"], /* CJK Ideograph Extension A */
+ ["\u3522", "\u3522"], /* CJK Ideograph Extension A */
+ ["\u3523", "\u3523"], /* CJK Ideograph Extension A */
+ ["\u3524", "\u3524"], /* CJK Ideograph Extension A */
+ ["\u3525", "\u3525"], /* CJK Ideograph Extension A */
+ ["\u3526", "\u3526"], /* CJK Ideograph Extension A */
+ ["\u3527", "\u3527"], /* CJK Ideograph Extension A */
+ ["\u3528", "\u3528"], /* CJK Ideograph Extension A */
+ ["\u3529", "\u3529"], /* CJK Ideograph Extension A */
+ ["\u352A", "\u352A"], /* CJK Ideograph Extension A */
+ ["\u352B", "\u352B"], /* CJK Ideograph Extension A */
+ ["\u352C", "\u352C"], /* CJK Ideograph Extension A */
+ ["\u352D", "\u352D"], /* CJK Ideograph Extension A */
+ ["\u352E", "\u352E"], /* CJK Ideograph Extension A */
+ ["\u352F", "\u352F"], /* CJK Ideograph Extension A */
+ ["\u3530", "\u3530"], /* CJK Ideograph Extension A */
+ ["\u3531", "\u3531"], /* CJK Ideograph Extension A */
+ ["\u3532", "\u3532"], /* CJK Ideograph Extension A */
+ ["\u3533", "\u3533"], /* CJK Ideograph Extension A */
+ ["\u3534", "\u3534"], /* CJK Ideograph Extension A */
+ ["\u3535", "\u3535"], /* CJK Ideograph Extension A */
+ ["\u3536", "\u3536"], /* CJK Ideograph Extension A */
+ ["\u3537", "\u3537"], /* CJK Ideograph Extension A */
+ ["\u3538", "\u3538"], /* CJK Ideograph Extension A */
+ ["\u3539", "\u3539"], /* CJK Ideograph Extension A */
+ ["\u353A", "\u353A"], /* CJK Ideograph Extension A */
+ ["\u353B", "\u353B"], /* CJK Ideograph Extension A */
+ ["\u353C", "\u353C"], /* CJK Ideograph Extension A */
+ ["\u353D", "\u353D"], /* CJK Ideograph Extension A */
+ ["\u353E", "\u353E"], /* CJK Ideograph Extension A */
+ ["\u353F", "\u353F"], /* CJK Ideograph Extension A */
+ ["\u3540", "\u3540"], /* CJK Ideograph Extension A */
+ ["\u3541", "\u3541"], /* CJK Ideograph Extension A */
+ ["\u3542", "\u3542"], /* CJK Ideograph Extension A */
+ ["\u3543", "\u3543"], /* CJK Ideograph Extension A */
+ ["\u3544", "\u3544"], /* CJK Ideograph Extension A */
+ ["\u3545", "\u3545"], /* CJK Ideograph Extension A */
+ ["\u3546", "\u3546"], /* CJK Ideograph Extension A */
+ ["\u3547", "\u3547"], /* CJK Ideograph Extension A */
+ ["\u3548", "\u3548"], /* CJK Ideograph Extension A */
+ ["\u3549", "\u3549"], /* CJK Ideograph Extension A */
+ ["\u354A", "\u354A"], /* CJK Ideograph Extension A */
+ ["\u354B", "\u354B"], /* CJK Ideograph Extension A */
+ ["\u354C", "\u354C"], /* CJK Ideograph Extension A */
+ ["\u354D", "\u354D"], /* CJK Ideograph Extension A */
+ ["\u354E", "\u354E"], /* CJK Ideograph Extension A */
+ ["\u354F", "\u354F"], /* CJK Ideograph Extension A */
+ ["\u3550", "\u3550"], /* CJK Ideograph Extension A */
+ ["\u3551", "\u3551"], /* CJK Ideograph Extension A */
+ ["\u3552", "\u3552"], /* CJK Ideograph Extension A */
+ ["\u3553", "\u3553"], /* CJK Ideograph Extension A */
+ ["\u3554", "\u3554"], /* CJK Ideograph Extension A */
+ ["\u3555", "\u3555"], /* CJK Ideograph Extension A */
+ ["\u3556", "\u3556"], /* CJK Ideograph Extension A */
+ ["\u3557", "\u3557"], /* CJK Ideograph Extension A */
+ ["\u3558", "\u3558"], /* CJK Ideograph Extension A */
+ ["\u3559", "\u3559"], /* CJK Ideograph Extension A */
+ ["\u355A", "\u355A"], /* CJK Ideograph Extension A */
+ ["\u355B", "\u355B"], /* CJK Ideograph Extension A */
+ ["\u355C", "\u355C"], /* CJK Ideograph Extension A */
+ ["\u355D", "\u355D"], /* CJK Ideograph Extension A */
+ ["\u355E", "\u355E"], /* CJK Ideograph Extension A */
+ ["\u355F", "\u355F"], /* CJK Ideograph Extension A */
+ ["\u3560", "\u3560"], /* CJK Ideograph Extension A */
+ ["\u3561", "\u3561"], /* CJK Ideograph Extension A */
+ ["\u3562", "\u3562"], /* CJK Ideograph Extension A */
+ ["\u3563", "\u3563"], /* CJK Ideograph Extension A */
+ ["\u3564", "\u3564"], /* CJK Ideograph Extension A */
+ ["\u3565", "\u3565"], /* CJK Ideograph Extension A */
+ ["\u3566", "\u3566"], /* CJK Ideograph Extension A */
+ ["\u3567", "\u3567"], /* CJK Ideograph Extension A */
+ ["\u3568", "\u3568"], /* CJK Ideograph Extension A */
+ ["\u3569", "\u3569"], /* CJK Ideograph Extension A */
+ ["\u356A", "\u356A"], /* CJK Ideograph Extension A */
+ ["\u356B", "\u356B"], /* CJK Ideograph Extension A */
+ ["\u356C", "\u356C"], /* CJK Ideograph Extension A */
+ ["\u356D", "\u356D"], /* CJK Ideograph Extension A */
+ ["\u356E", "\u356E"], /* CJK Ideograph Extension A */
+ ["\u356F", "\u356F"], /* CJK Ideograph Extension A */
+ ["\u3570", "\u3570"], /* CJK Ideograph Extension A */
+ ["\u3571", "\u3571"], /* CJK Ideograph Extension A */
+ ["\u3572", "\u3572"], /* CJK Ideograph Extension A */
+ ["\u3573", "\u3573"], /* CJK Ideograph Extension A */
+ ["\u3574", "\u3574"], /* CJK Ideograph Extension A */
+ ["\u3575", "\u3575"], /* CJK Ideograph Extension A */
+ ["\u3576", "\u3576"], /* CJK Ideograph Extension A */
+ ["\u3577", "\u3577"], /* CJK Ideograph Extension A */
+ ["\u3578", "\u3578"], /* CJK Ideograph Extension A */
+ ["\u3579", "\u3579"], /* CJK Ideograph Extension A */
+ ["\u357A", "\u357A"], /* CJK Ideograph Extension A */
+ ["\u357B", "\u357B"], /* CJK Ideograph Extension A */
+ ["\u357C", "\u357C"], /* CJK Ideograph Extension A */
+ ["\u357D", "\u357D"], /* CJK Ideograph Extension A */
+ ["\u357E", "\u357E"], /* CJK Ideograph Extension A */
+ ["\u357F", "\u357F"], /* CJK Ideograph Extension A */
+ ["\u3580", "\u3580"], /* CJK Ideograph Extension A */
+ ["\u3581", "\u3581"], /* CJK Ideograph Extension A */
+ ["\u3582", "\u3582"], /* CJK Ideograph Extension A */
+ ["\u3583", "\u3583"], /* CJK Ideograph Extension A */
+ ["\u3584", "\u3584"], /* CJK Ideograph Extension A */
+ ["\u3585", "\u3585"], /* CJK Ideograph Extension A */
+ ["\u3586", "\u3586"], /* CJK Ideograph Extension A */
+ ["\u3587", "\u3587"], /* CJK Ideograph Extension A */
+ ["\u3588", "\u3588"], /* CJK Ideograph Extension A */
+ ["\u3589", "\u3589"], /* CJK Ideograph Extension A */
+ ["\u358A", "\u358A"], /* CJK Ideograph Extension A */
+ ["\u358B", "\u358B"], /* CJK Ideograph Extension A */
+ ["\u358C", "\u358C"], /* CJK Ideograph Extension A */
+ ["\u358D", "\u358D"], /* CJK Ideograph Extension A */
+ ["\u358E", "\u358E"], /* CJK Ideograph Extension A */
+ ["\u358F", "\u358F"], /* CJK Ideograph Extension A */
+ ["\u3590", "\u3590"], /* CJK Ideograph Extension A */
+ ["\u3591", "\u3591"], /* CJK Ideograph Extension A */
+ ["\u3592", "\u3592"], /* CJK Ideograph Extension A */
+ ["\u3593", "\u3593"], /* CJK Ideograph Extension A */
+ ["\u3594", "\u3594"], /* CJK Ideograph Extension A */
+ ["\u3595", "\u3595"], /* CJK Ideograph Extension A */
+ ["\u3596", "\u3596"], /* CJK Ideograph Extension A */
+ ["\u3597", "\u3597"], /* CJK Ideograph Extension A */
+ ["\u3598", "\u3598"], /* CJK Ideograph Extension A */
+ ["\u3599", "\u3599"], /* CJK Ideograph Extension A */
+ ["\u359A", "\u359A"], /* CJK Ideograph Extension A */
+ ["\u359B", "\u359B"], /* CJK Ideograph Extension A */
+ ["\u359C", "\u359C"], /* CJK Ideograph Extension A */
+ ["\u359D", "\u359D"], /* CJK Ideograph Extension A */
+ ["\u359E", "\u359E"], /* CJK Ideograph Extension A */
+ ["\u359F", "\u359F"], /* CJK Ideograph Extension A */
+ ["\u35A0", "\u35A0"], /* CJK Ideograph Extension A */
+ ["\u35A1", "\u35A1"], /* CJK Ideograph Extension A */
+ ["\u35A2", "\u35A2"], /* CJK Ideograph Extension A */
+ ["\u35A3", "\u35A3"], /* CJK Ideograph Extension A */
+ ["\u35A4", "\u35A4"], /* CJK Ideograph Extension A */
+ ["\u35A5", "\u35A5"], /* CJK Ideograph Extension A */
+ ["\u35A6", "\u35A6"], /* CJK Ideograph Extension A */
+ ["\u35A7", "\u35A7"], /* CJK Ideograph Extension A */
+ ["\u35A8", "\u35A8"], /* CJK Ideograph Extension A */
+ ["\u35A9", "\u35A9"], /* CJK Ideograph Extension A */
+ ["\u35AA", "\u35AA"], /* CJK Ideograph Extension A */
+ ["\u35AB", "\u35AB"], /* CJK Ideograph Extension A */
+ ["\u35AC", "\u35AC"], /* CJK Ideograph Extension A */
+ ["\u35AD", "\u35AD"], /* CJK Ideograph Extension A */
+ ["\u35AE", "\u35AE"], /* CJK Ideograph Extension A */
+ ["\u35AF", "\u35AF"], /* CJK Ideograph Extension A */
+ ["\u35B0", "\u35B0"], /* CJK Ideograph Extension A */
+ ["\u35B1", "\u35B1"], /* CJK Ideograph Extension A */
+ ["\u35B2", "\u35B2"], /* CJK Ideograph Extension A */
+ ["\u35B3", "\u35B3"], /* CJK Ideograph Extension A */
+ ["\u35B4", "\u35B4"], /* CJK Ideograph Extension A */
+ ["\u35B5", "\u35B5"], /* CJK Ideograph Extension A */
+ ["\u35B6", "\u35B6"], /* CJK Ideograph Extension A */
+ ["\u35B7", "\u35B7"], /* CJK Ideograph Extension A */
+ ["\u35B8", "\u35B8"], /* CJK Ideograph Extension A */
+ ["\u35B9", "\u35B9"], /* CJK Ideograph Extension A */
+ ["\u35BA", "\u35BA"], /* CJK Ideograph Extension A */
+ ["\u35BB", "\u35BB"], /* CJK Ideograph Extension A */
+ ["\u35BC", "\u35BC"], /* CJK Ideograph Extension A */
+ ["\u35BD", "\u35BD"], /* CJK Ideograph Extension A */
+ ["\u35BE", "\u35BE"], /* CJK Ideograph Extension A */
+ ["\u35BF", "\u35BF"], /* CJK Ideograph Extension A */
+ ["\u35C0", "\u35C0"], /* CJK Ideograph Extension A */
+ ["\u35C1", "\u35C1"], /* CJK Ideograph Extension A */
+ ["\u35C2", "\u35C2"], /* CJK Ideograph Extension A */
+ ["\u35C3", "\u35C3"], /* CJK Ideograph Extension A */
+ ["\u35C4", "\u35C4"], /* CJK Ideograph Extension A */
+ ["\u35C5", "\u35C5"], /* CJK Ideograph Extension A */
+ ["\u35C6", "\u35C6"], /* CJK Ideograph Extension A */
+ ["\u35C7", "\u35C7"], /* CJK Ideograph Extension A */
+ ["\u35C8", "\u35C8"], /* CJK Ideograph Extension A */
+ ["\u35C9", "\u35C9"], /* CJK Ideograph Extension A */
+ ["\u35CA", "\u35CA"], /* CJK Ideograph Extension A */
+ ["\u35CB", "\u35CB"], /* CJK Ideograph Extension A */
+ ["\u35CC", "\u35CC"], /* CJK Ideograph Extension A */
+ ["\u35CD", "\u35CD"], /* CJK Ideograph Extension A */
+ ["\u35CE", "\u35CE"], /* CJK Ideograph Extension A */
+ ["\u35CF", "\u35CF"], /* CJK Ideograph Extension A */
+ ["\u35D0", "\u35D0"], /* CJK Ideograph Extension A */
+ ["\u35D1", "\u35D1"], /* CJK Ideograph Extension A */
+ ["\u35D2", "\u35D2"], /* CJK Ideograph Extension A */
+ ["\u35D3", "\u35D3"], /* CJK Ideograph Extension A */
+ ["\u35D4", "\u35D4"], /* CJK Ideograph Extension A */
+ ["\u35D5", "\u35D5"], /* CJK Ideograph Extension A */
+ ["\u35D6", "\u35D6"], /* CJK Ideograph Extension A */
+ ["\u35D7", "\u35D7"], /* CJK Ideograph Extension A */
+ ["\u35D8", "\u35D8"], /* CJK Ideograph Extension A */
+ ["\u35D9", "\u35D9"], /* CJK Ideograph Extension A */
+ ["\u35DA", "\u35DA"], /* CJK Ideograph Extension A */
+ ["\u35DB", "\u35DB"], /* CJK Ideograph Extension A */
+ ["\u35DC", "\u35DC"], /* CJK Ideograph Extension A */
+ ["\u35DD", "\u35DD"], /* CJK Ideograph Extension A */
+ ["\u35DE", "\u35DE"], /* CJK Ideograph Extension A */
+ ["\u35DF", "\u35DF"], /* CJK Ideograph Extension A */
+ ["\u35E0", "\u35E0"], /* CJK Ideograph Extension A */
+ ["\u35E1", "\u35E1"], /* CJK Ideograph Extension A */
+ ["\u35E2", "\u35E2"], /* CJK Ideograph Extension A */
+ ["\u35E3", "\u35E3"], /* CJK Ideograph Extension A */
+ ["\u35E4", "\u35E4"], /* CJK Ideograph Extension A */
+ ["\u35E5", "\u35E5"], /* CJK Ideograph Extension A */
+ ["\u35E6", "\u35E6"], /* CJK Ideograph Extension A */
+ ["\u35E7", "\u35E7"], /* CJK Ideograph Extension A */
+ ["\u35E8", "\u35E8"], /* CJK Ideograph Extension A */
+ ["\u35E9", "\u35E9"], /* CJK Ideograph Extension A */
+ ["\u35EA", "\u35EA"], /* CJK Ideograph Extension A */
+ ["\u35EB", "\u35EB"], /* CJK Ideograph Extension A */
+ ["\u35EC", "\u35EC"], /* CJK Ideograph Extension A */
+ ["\u35ED", "\u35ED"], /* CJK Ideograph Extension A */
+ ["\u35EE", "\u35EE"], /* CJK Ideograph Extension A */
+ ["\u35EF", "\u35EF"], /* CJK Ideograph Extension A */
+ ["\u35F0", "\u35F0"], /* CJK Ideograph Extension A */
+ ["\u35F1", "\u35F1"], /* CJK Ideograph Extension A */
+ ["\u35F2", "\u35F2"], /* CJK Ideograph Extension A */
+ ["\u35F3", "\u35F3"], /* CJK Ideograph Extension A */
+ ["\u35F4", "\u35F4"], /* CJK Ideograph Extension A */
+ ["\u35F5", "\u35F5"], /* CJK Ideograph Extension A */
+ ["\u35F6", "\u35F6"], /* CJK Ideograph Extension A */
+ ["\u35F7", "\u35F7"], /* CJK Ideograph Extension A */
+ ["\u35F8", "\u35F8"], /* CJK Ideograph Extension A */
+ ["\u35F9", "\u35F9"], /* CJK Ideograph Extension A */
+ ["\u35FA", "\u35FA"], /* CJK Ideograph Extension A */
+ ["\u35FB", "\u35FB"], /* CJK Ideograph Extension A */
+ ["\u35FC", "\u35FC"], /* CJK Ideograph Extension A */
+ ["\u35FD", "\u35FD"], /* CJK Ideograph Extension A */
+ ["\u35FE", "\u35FE"], /* CJK Ideograph Extension A */
+ ["\u35FF", "\u35FF"], /* CJK Ideograph Extension A */
+ ["\u3600", "\u3600"], /* CJK Ideograph Extension A */
+ ["\u3601", "\u3601"], /* CJK Ideograph Extension A */
+ ["\u3602", "\u3602"], /* CJK Ideograph Extension A */
+ ["\u3603", "\u3603"], /* CJK Ideograph Extension A */
+ ["\u3604", "\u3604"], /* CJK Ideograph Extension A */
+ ["\u3605", "\u3605"], /* CJK Ideograph Extension A */
+ ["\u3606", "\u3606"], /* CJK Ideograph Extension A */
+ ["\u3607", "\u3607"], /* CJK Ideograph Extension A */
+ ["\u3608", "\u3608"], /* CJK Ideograph Extension A */
+ ["\u3609", "\u3609"], /* CJK Ideograph Extension A */
+ ["\u360A", "\u360A"], /* CJK Ideograph Extension A */
+ ["\u360B", "\u360B"], /* CJK Ideograph Extension A */
+ ["\u360C", "\u360C"], /* CJK Ideograph Extension A */
+ ["\u360D", "\u360D"], /* CJK Ideograph Extension A */
+ ["\u360E", "\u360E"], /* CJK Ideograph Extension A */
+ ["\u360F", "\u360F"], /* CJK Ideograph Extension A */
+ ["\u3610", "\u3610"], /* CJK Ideograph Extension A */
+ ["\u3611", "\u3611"], /* CJK Ideograph Extension A */
+ ["\u3612", "\u3612"], /* CJK Ideograph Extension A */
+ ["\u3613", "\u3613"], /* CJK Ideograph Extension A */
+ ["\u3614", "\u3614"], /* CJK Ideograph Extension A */
+ ["\u3615", "\u3615"], /* CJK Ideograph Extension A */
+ ["\u3616", "\u3616"], /* CJK Ideograph Extension A */
+ ["\u3617", "\u3617"], /* CJK Ideograph Extension A */
+ ["\u3618", "\u3618"], /* CJK Ideograph Extension A */
+ ["\u3619", "\u3619"], /* CJK Ideograph Extension A */
+ ["\u361A", "\u361A"], /* CJK Ideograph Extension A */
+ ["\u361B", "\u361B"], /* CJK Ideograph Extension A */
+ ["\u361C", "\u361C"], /* CJK Ideograph Extension A */
+ ["\u361D", "\u361D"], /* CJK Ideograph Extension A */
+ ["\u361E", "\u361E"], /* CJK Ideograph Extension A */
+ ["\u361F", "\u361F"], /* CJK Ideograph Extension A */
+ ["\u3620", "\u3620"], /* CJK Ideograph Extension A */
+ ["\u3621", "\u3621"], /* CJK Ideograph Extension A */
+ ["\u3622", "\u3622"], /* CJK Ideograph Extension A */
+ ["\u3623", "\u3623"], /* CJK Ideograph Extension A */
+ ["\u3624", "\u3624"], /* CJK Ideograph Extension A */
+ ["\u3625", "\u3625"], /* CJK Ideograph Extension A */
+ ["\u3626", "\u3626"], /* CJK Ideograph Extension A */
+ ["\u3627", "\u3627"], /* CJK Ideograph Extension A */
+ ["\u3628", "\u3628"], /* CJK Ideograph Extension A */
+ ["\u3629", "\u3629"], /* CJK Ideograph Extension A */
+ ["\u362A", "\u362A"], /* CJK Ideograph Extension A */
+ ["\u362B", "\u362B"], /* CJK Ideograph Extension A */
+ ["\u362C", "\u362C"], /* CJK Ideograph Extension A */
+ ["\u362D", "\u362D"], /* CJK Ideograph Extension A */
+ ["\u362E", "\u362E"], /* CJK Ideograph Extension A */
+ ["\u362F", "\u362F"], /* CJK Ideograph Extension A */
+ ["\u3630", "\u3630"], /* CJK Ideograph Extension A */
+ ["\u3631", "\u3631"], /* CJK Ideograph Extension A */
+ ["\u3632", "\u3632"], /* CJK Ideograph Extension A */
+ ["\u3633", "\u3633"], /* CJK Ideograph Extension A */
+ ["\u3634", "\u3634"], /* CJK Ideograph Extension A */
+ ["\u3635", "\u3635"], /* CJK Ideograph Extension A */
+ ["\u3636", "\u3636"], /* CJK Ideograph Extension A */
+ ["\u3637", "\u3637"], /* CJK Ideograph Extension A */
+ ["\u3638", "\u3638"], /* CJK Ideograph Extension A */
+ ["\u3639", "\u3639"], /* CJK Ideograph Extension A */
+ ["\u363A", "\u363A"], /* CJK Ideograph Extension A */
+ ["\u363B", "\u363B"], /* CJK Ideograph Extension A */
+ ["\u363C", "\u363C"], /* CJK Ideograph Extension A */
+ ["\u363D", "\u363D"], /* CJK Ideograph Extension A */
+ ["\u363E", "\u363E"], /* CJK Ideograph Extension A */
+ ["\u363F", "\u363F"], /* CJK Ideograph Extension A */
+ ["\u3640", "\u3640"], /* CJK Ideograph Extension A */
+ ["\u3641", "\u3641"], /* CJK Ideograph Extension A */
+ ["\u3642", "\u3642"], /* CJK Ideograph Extension A */
+ ["\u3643", "\u3643"], /* CJK Ideograph Extension A */
+ ["\u3644", "\u3644"], /* CJK Ideograph Extension A */
+ ["\u3645", "\u3645"], /* CJK Ideograph Extension A */
+ ["\u3646", "\u3646"], /* CJK Ideograph Extension A */
+ ["\u3647", "\u3647"], /* CJK Ideograph Extension A */
+ ["\u3648", "\u3648"], /* CJK Ideograph Extension A */
+ ["\u3649", "\u3649"], /* CJK Ideograph Extension A */
+ ["\u364A", "\u364A"], /* CJK Ideograph Extension A */
+ ["\u364B", "\u364B"], /* CJK Ideograph Extension A */
+ ["\u364C", "\u364C"], /* CJK Ideograph Extension A */
+ ["\u364D", "\u364D"], /* CJK Ideograph Extension A */
+ ["\u364E", "\u364E"], /* CJK Ideograph Extension A */
+ ["\u364F", "\u364F"], /* CJK Ideograph Extension A */
+ ["\u3650", "\u3650"], /* CJK Ideograph Extension A */
+ ["\u3651", "\u3651"], /* CJK Ideograph Extension A */
+ ["\u3652", "\u3652"], /* CJK Ideograph Extension A */
+ ["\u3653", "\u3653"], /* CJK Ideograph Extension A */
+ ["\u3654", "\u3654"], /* CJK Ideograph Extension A */
+ ["\u3655", "\u3655"], /* CJK Ideograph Extension A */
+ ["\u3656", "\u3656"], /* CJK Ideograph Extension A */
+ ["\u3657", "\u3657"], /* CJK Ideograph Extension A */
+ ["\u3658", "\u3658"], /* CJK Ideograph Extension A */
+ ["\u3659", "\u3659"], /* CJK Ideograph Extension A */
+ ["\u365A", "\u365A"], /* CJK Ideograph Extension A */
+ ["\u365B", "\u365B"], /* CJK Ideograph Extension A */
+ ["\u365C", "\u365C"], /* CJK Ideograph Extension A */
+ ["\u365D", "\u365D"], /* CJK Ideograph Extension A */
+ ["\u365E", "\u365E"], /* CJK Ideograph Extension A */
+ ["\u365F", "\u365F"], /* CJK Ideograph Extension A */
+ ["\u3660", "\u3660"], /* CJK Ideograph Extension A */
+ ["\u3661", "\u3661"], /* CJK Ideograph Extension A */
+ ["\u3662", "\u3662"], /* CJK Ideograph Extension A */
+ ["\u3663", "\u3663"], /* CJK Ideograph Extension A */
+ ["\u3664", "\u3664"], /* CJK Ideograph Extension A */
+ ["\u3665", "\u3665"], /* CJK Ideograph Extension A */
+ ["\u3666", "\u3666"], /* CJK Ideograph Extension A */
+ ["\u3667", "\u3667"], /* CJK Ideograph Extension A */
+ ["\u3668", "\u3668"], /* CJK Ideograph Extension A */
+ ["\u3669", "\u3669"], /* CJK Ideograph Extension A */
+ ["\u366A", "\u366A"], /* CJK Ideograph Extension A */
+ ["\u366B", "\u366B"], /* CJK Ideograph Extension A */
+ ["\u366C", "\u366C"], /* CJK Ideograph Extension A */
+ ["\u366D", "\u366D"], /* CJK Ideograph Extension A */
+ ["\u366E", "\u366E"], /* CJK Ideograph Extension A */
+ ["\u366F", "\u366F"], /* CJK Ideograph Extension A */
+ ["\u3670", "\u3670"], /* CJK Ideograph Extension A */
+ ["\u3671", "\u3671"], /* CJK Ideograph Extension A */
+ ["\u3672", "\u3672"], /* CJK Ideograph Extension A */
+ ["\u3673", "\u3673"], /* CJK Ideograph Extension A */
+ ["\u3674", "\u3674"], /* CJK Ideograph Extension A */
+ ["\u3675", "\u3675"], /* CJK Ideograph Extension A */
+ ["\u3676", "\u3676"], /* CJK Ideograph Extension A */
+ ["\u3677", "\u3677"], /* CJK Ideograph Extension A */
+ ["\u3678", "\u3678"], /* CJK Ideograph Extension A */
+ ["\u3679", "\u3679"], /* CJK Ideograph Extension A */
+ ["\u367A", "\u367A"], /* CJK Ideograph Extension A */
+ ["\u367B", "\u367B"], /* CJK Ideograph Extension A */
+ ["\u367C", "\u367C"], /* CJK Ideograph Extension A */
+ ["\u367D", "\u367D"], /* CJK Ideograph Extension A */
+ ["\u367E", "\u367E"], /* CJK Ideograph Extension A */
+ ["\u367F", "\u367F"], /* CJK Ideograph Extension A */
+ ["\u3680", "\u3680"], /* CJK Ideograph Extension A */
+ ["\u3681", "\u3681"], /* CJK Ideograph Extension A */
+ ["\u3682", "\u3682"], /* CJK Ideograph Extension A */
+ ["\u3683", "\u3683"], /* CJK Ideograph Extension A */
+ ["\u3684", "\u3684"], /* CJK Ideograph Extension A */
+ ["\u3685", "\u3685"], /* CJK Ideograph Extension A */
+ ["\u3686", "\u3686"], /* CJK Ideograph Extension A */
+ ["\u3687", "\u3687"], /* CJK Ideograph Extension A */
+ ["\u3688", "\u3688"], /* CJK Ideograph Extension A */
+ ["\u3689", "\u3689"], /* CJK Ideograph Extension A */
+ ["\u368A", "\u368A"], /* CJK Ideograph Extension A */
+ ["\u368B", "\u368B"], /* CJK Ideograph Extension A */
+ ["\u368C", "\u368C"], /* CJK Ideograph Extension A */
+ ["\u368D", "\u368D"], /* CJK Ideograph Extension A */
+ ["\u368E", "\u368E"], /* CJK Ideograph Extension A */
+ ["\u368F", "\u368F"], /* CJK Ideograph Extension A */
+ ["\u3690", "\u3690"], /* CJK Ideograph Extension A */
+ ["\u3691", "\u3691"], /* CJK Ideograph Extension A */
+ ["\u3692", "\u3692"], /* CJK Ideograph Extension A */
+ ["\u3693", "\u3693"], /* CJK Ideograph Extension A */
+ ["\u3694", "\u3694"], /* CJK Ideograph Extension A */
+ ["\u3695", "\u3695"], /* CJK Ideograph Extension A */
+ ["\u3696", "\u3696"], /* CJK Ideograph Extension A */
+ ["\u3697", "\u3697"], /* CJK Ideograph Extension A */
+ ["\u3698", "\u3698"], /* CJK Ideograph Extension A */
+ ["\u3699", "\u3699"], /* CJK Ideograph Extension A */
+ ["\u369A", "\u369A"], /* CJK Ideograph Extension A */
+ ["\u369B", "\u369B"], /* CJK Ideograph Extension A */
+ ["\u369C", "\u369C"], /* CJK Ideograph Extension A */
+ ["\u369D", "\u369D"], /* CJK Ideograph Extension A */
+ ["\u369E", "\u369E"], /* CJK Ideograph Extension A */
+ ["\u369F", "\u369F"], /* CJK Ideograph Extension A */
+ ["\u36A0", "\u36A0"], /* CJK Ideograph Extension A */
+ ["\u36A1", "\u36A1"], /* CJK Ideograph Extension A */
+ ["\u36A2", "\u36A2"], /* CJK Ideograph Extension A */
+ ["\u36A3", "\u36A3"], /* CJK Ideograph Extension A */
+ ["\u36A4", "\u36A4"], /* CJK Ideograph Extension A */
+ ["\u36A5", "\u36A5"], /* CJK Ideograph Extension A */
+ ["\u36A6", "\u36A6"], /* CJK Ideograph Extension A */
+ ["\u36A7", "\u36A7"], /* CJK Ideograph Extension A */
+ ["\u36A8", "\u36A8"], /* CJK Ideograph Extension A */
+ ["\u36A9", "\u36A9"], /* CJK Ideograph Extension A */
+ ["\u36AA", "\u36AA"], /* CJK Ideograph Extension A */
+ ["\u36AB", "\u36AB"], /* CJK Ideograph Extension A */
+ ["\u36AC", "\u36AC"], /* CJK Ideograph Extension A */
+ ["\u36AD", "\u36AD"], /* CJK Ideograph Extension A */
+ ["\u36AE", "\u36AE"], /* CJK Ideograph Extension A */
+ ["\u36AF", "\u36AF"], /* CJK Ideograph Extension A */
+ ["\u36B0", "\u36B0"], /* CJK Ideograph Extension A */
+ ["\u36B1", "\u36B1"], /* CJK Ideograph Extension A */
+ ["\u36B2", "\u36B2"], /* CJK Ideograph Extension A */
+ ["\u36B3", "\u36B3"], /* CJK Ideograph Extension A */
+ ["\u36B4", "\u36B4"], /* CJK Ideograph Extension A */
+ ["\u36B5", "\u36B5"], /* CJK Ideograph Extension A */
+ ["\u36B6", "\u36B6"], /* CJK Ideograph Extension A */
+ ["\u36B7", "\u36B7"], /* CJK Ideograph Extension A */
+ ["\u36B8", "\u36B8"], /* CJK Ideograph Extension A */
+ ["\u36B9", "\u36B9"], /* CJK Ideograph Extension A */
+ ["\u36BA", "\u36BA"], /* CJK Ideograph Extension A */
+ ["\u36BB", "\u36BB"], /* CJK Ideograph Extension A */
+ ["\u36BC", "\u36BC"], /* CJK Ideograph Extension A */
+ ["\u36BD", "\u36BD"], /* CJK Ideograph Extension A */
+ ["\u36BE", "\u36BE"], /* CJK Ideograph Extension A */
+ ["\u36BF", "\u36BF"], /* CJK Ideograph Extension A */
+ ["\u36C0", "\u36C0"], /* CJK Ideograph Extension A */
+ ["\u36C1", "\u36C1"], /* CJK Ideograph Extension A */
+ ["\u36C2", "\u36C2"], /* CJK Ideograph Extension A */
+ ["\u36C3", "\u36C3"], /* CJK Ideograph Extension A */
+ ["\u36C4", "\u36C4"], /* CJK Ideograph Extension A */
+ ["\u36C5", "\u36C5"], /* CJK Ideograph Extension A */
+ ["\u36C6", "\u36C6"], /* CJK Ideograph Extension A */
+ ["\u36C7", "\u36C7"], /* CJK Ideograph Extension A */
+ ["\u36C8", "\u36C8"], /* CJK Ideograph Extension A */
+ ["\u36C9", "\u36C9"], /* CJK Ideograph Extension A */
+ ["\u36CA", "\u36CA"], /* CJK Ideograph Extension A */
+ ["\u36CB", "\u36CB"], /* CJK Ideograph Extension A */
+ ["\u36CC", "\u36CC"], /* CJK Ideograph Extension A */
+ ["\u36CD", "\u36CD"], /* CJK Ideograph Extension A */
+ ["\u36CE", "\u36CE"], /* CJK Ideograph Extension A */
+ ["\u36CF", "\u36CF"], /* CJK Ideograph Extension A */
+ ["\u36D0", "\u36D0"], /* CJK Ideograph Extension A */
+ ["\u36D1", "\u36D1"], /* CJK Ideograph Extension A */
+ ["\u36D2", "\u36D2"], /* CJK Ideograph Extension A */
+ ["\u36D3", "\u36D3"], /* CJK Ideograph Extension A */
+ ["\u36D4", "\u36D4"], /* CJK Ideograph Extension A */
+ ["\u36D5", "\u36D5"], /* CJK Ideograph Extension A */
+ ["\u36D6", "\u36D6"], /* CJK Ideograph Extension A */
+ ["\u36D7", "\u36D7"], /* CJK Ideograph Extension A */
+ ["\u36D8", "\u36D8"], /* CJK Ideograph Extension A */
+ ["\u36D9", "\u36D9"], /* CJK Ideograph Extension A */
+ ["\u36DA", "\u36DA"], /* CJK Ideograph Extension A */
+ ["\u36DB", "\u36DB"], /* CJK Ideograph Extension A */
+ ["\u36DC", "\u36DC"], /* CJK Ideograph Extension A */
+ ["\u36DD", "\u36DD"], /* CJK Ideograph Extension A */
+ ["\u36DE", "\u36DE"], /* CJK Ideograph Extension A */
+ ["\u36DF", "\u36DF"], /* CJK Ideograph Extension A */
+ ["\u36E0", "\u36E0"], /* CJK Ideograph Extension A */
+ ["\u36E1", "\u36E1"], /* CJK Ideograph Extension A */
+ ["\u36E2", "\u36E2"], /* CJK Ideograph Extension A */
+ ["\u36E3", "\u36E3"], /* CJK Ideograph Extension A */
+ ["\u36E4", "\u36E4"], /* CJK Ideograph Extension A */
+ ["\u36E5", "\u36E5"], /* CJK Ideograph Extension A */
+ ["\u36E6", "\u36E6"], /* CJK Ideograph Extension A */
+ ["\u36E7", "\u36E7"], /* CJK Ideograph Extension A */
+ ["\u36E8", "\u36E8"], /* CJK Ideograph Extension A */
+ ["\u36E9", "\u36E9"], /* CJK Ideograph Extension A */
+ ["\u36EA", "\u36EA"], /* CJK Ideograph Extension A */
+ ["\u36EB", "\u36EB"], /* CJK Ideograph Extension A */
+ ["\u36EC", "\u36EC"], /* CJK Ideograph Extension A */
+ ["\u36ED", "\u36ED"], /* CJK Ideograph Extension A */
+ ["\u36EE", "\u36EE"], /* CJK Ideograph Extension A */
+ ["\u36EF", "\u36EF"], /* CJK Ideograph Extension A */
+ ["\u36F0", "\u36F0"], /* CJK Ideograph Extension A */
+ ["\u36F1", "\u36F1"], /* CJK Ideograph Extension A */
+ ["\u36F2", "\u36F2"], /* CJK Ideograph Extension A */
+ ["\u36F3", "\u36F3"], /* CJK Ideograph Extension A */
+ ["\u36F4", "\u36F4"], /* CJK Ideograph Extension A */
+ ["\u36F5", "\u36F5"], /* CJK Ideograph Extension A */
+ ["\u36F6", "\u36F6"], /* CJK Ideograph Extension A */
+ ["\u36F7", "\u36F7"], /* CJK Ideograph Extension A */
+ ["\u36F8", "\u36F8"], /* CJK Ideograph Extension A */
+ ["\u36F9", "\u36F9"], /* CJK Ideograph Extension A */
+ ["\u36FA", "\u36FA"], /* CJK Ideograph Extension A */
+ ["\u36FB", "\u36FB"], /* CJK Ideograph Extension A */
+ ["\u36FC", "\u36FC"], /* CJK Ideograph Extension A */
+ ["\u36FD", "\u36FD"], /* CJK Ideograph Extension A */
+ ["\u36FE", "\u36FE"], /* CJK Ideograph Extension A */
+ ["\u36FF", "\u36FF"], /* CJK Ideograph Extension A */
+ ["\u3700", "\u3700"], /* CJK Ideograph Extension A */
+ ["\u3701", "\u3701"], /* CJK Ideograph Extension A */
+ ["\u3702", "\u3702"], /* CJK Ideograph Extension A */
+ ["\u3703", "\u3703"], /* CJK Ideograph Extension A */
+ ["\u3704", "\u3704"], /* CJK Ideograph Extension A */
+ ["\u3705", "\u3705"], /* CJK Ideograph Extension A */
+ ["\u3706", "\u3706"], /* CJK Ideograph Extension A */
+ ["\u3707", "\u3707"], /* CJK Ideograph Extension A */
+ ["\u3708", "\u3708"], /* CJK Ideograph Extension A */
+ ["\u3709", "\u3709"], /* CJK Ideograph Extension A */
+ ["\u370A", "\u370A"], /* CJK Ideograph Extension A */
+ ["\u370B", "\u370B"], /* CJK Ideograph Extension A */
+ ["\u370C", "\u370C"], /* CJK Ideograph Extension A */
+ ["\u370D", "\u370D"], /* CJK Ideograph Extension A */
+ ["\u370E", "\u370E"], /* CJK Ideograph Extension A */
+ ["\u370F", "\u370F"], /* CJK Ideograph Extension A */
+ ["\u3710", "\u3710"], /* CJK Ideograph Extension A */
+ ["\u3711", "\u3711"], /* CJK Ideograph Extension A */
+ ["\u3712", "\u3712"], /* CJK Ideograph Extension A */
+ ["\u3713", "\u3713"], /* CJK Ideograph Extension A */
+ ["\u3714", "\u3714"], /* CJK Ideograph Extension A */
+ ["\u3715", "\u3715"], /* CJK Ideograph Extension A */
+ ["\u3716", "\u3716"], /* CJK Ideograph Extension A */
+ ["\u3717", "\u3717"], /* CJK Ideograph Extension A */
+ ["\u3718", "\u3718"], /* CJK Ideograph Extension A */
+ ["\u3719", "\u3719"], /* CJK Ideograph Extension A */
+ ["\u371A", "\u371A"], /* CJK Ideograph Extension A */
+ ["\u371B", "\u371B"], /* CJK Ideograph Extension A */
+ ["\u371C", "\u371C"], /* CJK Ideograph Extension A */
+ ["\u371D", "\u371D"], /* CJK Ideograph Extension A */
+ ["\u371E", "\u371E"], /* CJK Ideograph Extension A */
+ ["\u371F", "\u371F"], /* CJK Ideograph Extension A */
+ ["\u3720", "\u3720"], /* CJK Ideograph Extension A */
+ ["\u3721", "\u3721"], /* CJK Ideograph Extension A */
+ ["\u3722", "\u3722"], /* CJK Ideograph Extension A */
+ ["\u3723", "\u3723"], /* CJK Ideograph Extension A */
+ ["\u3724", "\u3724"], /* CJK Ideograph Extension A */
+ ["\u3725", "\u3725"], /* CJK Ideograph Extension A */
+ ["\u3726", "\u3726"], /* CJK Ideograph Extension A */
+ ["\u3727", "\u3727"], /* CJK Ideograph Extension A */
+ ["\u3728", "\u3728"], /* CJK Ideograph Extension A */
+ ["\u3729", "\u3729"], /* CJK Ideograph Extension A */
+ ["\u372A", "\u372A"], /* CJK Ideograph Extension A */
+ ["\u372B", "\u372B"], /* CJK Ideograph Extension A */
+ ["\u372C", "\u372C"], /* CJK Ideograph Extension A */
+ ["\u372D", "\u372D"], /* CJK Ideograph Extension A */
+ ["\u372E", "\u372E"], /* CJK Ideograph Extension A */
+ ["\u372F", "\u372F"], /* CJK Ideograph Extension A */
+ ["\u3730", "\u3730"], /* CJK Ideograph Extension A */
+ ["\u3731", "\u3731"], /* CJK Ideograph Extension A */
+ ["\u3732", "\u3732"], /* CJK Ideograph Extension A */
+ ["\u3733", "\u3733"], /* CJK Ideograph Extension A */
+ ["\u3734", "\u3734"], /* CJK Ideograph Extension A */
+ ["\u3735", "\u3735"], /* CJK Ideograph Extension A */
+ ["\u3736", "\u3736"], /* CJK Ideograph Extension A */
+ ["\u3737", "\u3737"], /* CJK Ideograph Extension A */
+ ["\u3738", "\u3738"], /* CJK Ideograph Extension A */
+ ["\u3739", "\u3739"], /* CJK Ideograph Extension A */
+ ["\u373A", "\u373A"], /* CJK Ideograph Extension A */
+ ["\u373B", "\u373B"], /* CJK Ideograph Extension A */
+ ["\u373C", "\u373C"], /* CJK Ideograph Extension A */
+ ["\u373D", "\u373D"], /* CJK Ideograph Extension A */
+ ["\u373E", "\u373E"], /* CJK Ideograph Extension A */
+ ["\u373F", "\u373F"], /* CJK Ideograph Extension A */
+ ["\u3740", "\u3740"], /* CJK Ideograph Extension A */
+ ["\u3741", "\u3741"], /* CJK Ideograph Extension A */
+ ["\u3742", "\u3742"], /* CJK Ideograph Extension A */
+ ["\u3743", "\u3743"], /* CJK Ideograph Extension A */
+ ["\u3744", "\u3744"], /* CJK Ideograph Extension A */
+ ["\u3745", "\u3745"], /* CJK Ideograph Extension A */
+ ["\u3746", "\u3746"], /* CJK Ideograph Extension A */
+ ["\u3747", "\u3747"], /* CJK Ideograph Extension A */
+ ["\u3748", "\u3748"], /* CJK Ideograph Extension A */
+ ["\u3749", "\u3749"], /* CJK Ideograph Extension A */
+ ["\u374A", "\u374A"], /* CJK Ideograph Extension A */
+ ["\u374B", "\u374B"], /* CJK Ideograph Extension A */
+ ["\u374C", "\u374C"], /* CJK Ideograph Extension A */
+ ["\u374D", "\u374D"], /* CJK Ideograph Extension A */
+ ["\u374E", "\u374E"], /* CJK Ideograph Extension A */
+ ["\u374F", "\u374F"], /* CJK Ideograph Extension A */
+ ["\u3750", "\u3750"], /* CJK Ideograph Extension A */
+ ["\u3751", "\u3751"], /* CJK Ideograph Extension A */
+ ["\u3752", "\u3752"], /* CJK Ideograph Extension A */
+ ["\u3753", "\u3753"], /* CJK Ideograph Extension A */
+ ["\u3754", "\u3754"], /* CJK Ideograph Extension A */
+ ["\u3755", "\u3755"], /* CJK Ideograph Extension A */
+ ["\u3756", "\u3756"], /* CJK Ideograph Extension A */
+ ["\u3757", "\u3757"], /* CJK Ideograph Extension A */
+ ["\u3758", "\u3758"], /* CJK Ideograph Extension A */
+ ["\u3759", "\u3759"], /* CJK Ideograph Extension A */
+ ["\u375A", "\u375A"], /* CJK Ideograph Extension A */
+ ["\u375B", "\u375B"], /* CJK Ideograph Extension A */
+ ["\u375C", "\u375C"], /* CJK Ideograph Extension A */
+ ["\u375D", "\u375D"], /* CJK Ideograph Extension A */
+ ["\u375E", "\u375E"], /* CJK Ideograph Extension A */
+ ["\u375F", "\u375F"], /* CJK Ideograph Extension A */
+ ["\u3760", "\u3760"], /* CJK Ideograph Extension A */
+ ["\u3761", "\u3761"], /* CJK Ideograph Extension A */
+ ["\u3762", "\u3762"], /* CJK Ideograph Extension A */
+ ["\u3763", "\u3763"], /* CJK Ideograph Extension A */
+ ["\u3764", "\u3764"], /* CJK Ideograph Extension A */
+ ["\u3765", "\u3765"], /* CJK Ideograph Extension A */
+ ["\u3766", "\u3766"], /* CJK Ideograph Extension A */
+ ["\u3767", "\u3767"], /* CJK Ideograph Extension A */
+ ["\u3768", "\u3768"], /* CJK Ideograph Extension A */
+ ["\u3769", "\u3769"], /* CJK Ideograph Extension A */
+ ["\u376A", "\u376A"], /* CJK Ideograph Extension A */
+ ["\u376B", "\u376B"], /* CJK Ideograph Extension A */
+ ["\u376C", "\u376C"], /* CJK Ideograph Extension A */
+ ["\u376D", "\u376D"], /* CJK Ideograph Extension A */
+ ["\u376E", "\u376E"], /* CJK Ideograph Extension A */
+ ["\u376F", "\u376F"], /* CJK Ideograph Extension A */
+ ["\u3770", "\u3770"], /* CJK Ideograph Extension A */
+ ["\u3771", "\u3771"], /* CJK Ideograph Extension A */
+ ["\u3772", "\u3772"], /* CJK Ideograph Extension A */
+ ["\u3773", "\u3773"], /* CJK Ideograph Extension A */
+ ["\u3774", "\u3774"], /* CJK Ideograph Extension A */
+ ["\u3775", "\u3775"], /* CJK Ideograph Extension A */
+ ["\u3776", "\u3776"], /* CJK Ideograph Extension A */
+ ["\u3777", "\u3777"], /* CJK Ideograph Extension A */
+ ["\u3778", "\u3778"], /* CJK Ideograph Extension A */
+ ["\u3779", "\u3779"], /* CJK Ideograph Extension A */
+ ["\u377A", "\u377A"], /* CJK Ideograph Extension A */
+ ["\u377B", "\u377B"], /* CJK Ideograph Extension A */
+ ["\u377C", "\u377C"], /* CJK Ideograph Extension A */
+ ["\u377D", "\u377D"], /* CJK Ideograph Extension A */
+ ["\u377E", "\u377E"], /* CJK Ideograph Extension A */
+ ["\u377F", "\u377F"], /* CJK Ideograph Extension A */
+ ["\u3780", "\u3780"], /* CJK Ideograph Extension A */
+ ["\u3781", "\u3781"], /* CJK Ideograph Extension A */
+ ["\u3782", "\u3782"], /* CJK Ideograph Extension A */
+ ["\u3783", "\u3783"], /* CJK Ideograph Extension A */
+ ["\u3784", "\u3784"], /* CJK Ideograph Extension A */
+ ["\u3785", "\u3785"], /* CJK Ideograph Extension A */
+ ["\u3786", "\u3786"], /* CJK Ideograph Extension A */
+ ["\u3787", "\u3787"], /* CJK Ideograph Extension A */
+ ["\u3788", "\u3788"], /* CJK Ideograph Extension A */
+ ["\u3789", "\u3789"], /* CJK Ideograph Extension A */
+ ["\u378A", "\u378A"], /* CJK Ideograph Extension A */
+ ["\u378B", "\u378B"], /* CJK Ideograph Extension A */
+ ["\u378C", "\u378C"], /* CJK Ideograph Extension A */
+ ["\u378D", "\u378D"], /* CJK Ideograph Extension A */
+ ["\u378E", "\u378E"], /* CJK Ideograph Extension A */
+ ["\u378F", "\u378F"], /* CJK Ideograph Extension A */
+ ["\u3790", "\u3790"], /* CJK Ideograph Extension A */
+ ["\u3791", "\u3791"], /* CJK Ideograph Extension A */
+ ["\u3792", "\u3792"], /* CJK Ideograph Extension A */
+ ["\u3793", "\u3793"], /* CJK Ideograph Extension A */
+ ["\u3794", "\u3794"], /* CJK Ideograph Extension A */
+ ["\u3795", "\u3795"], /* CJK Ideograph Extension A */
+ ["\u3796", "\u3796"], /* CJK Ideograph Extension A */
+ ["\u3797", "\u3797"], /* CJK Ideograph Extension A */
+ ["\u3798", "\u3798"], /* CJK Ideograph Extension A */
+ ["\u3799", "\u3799"], /* CJK Ideograph Extension A */
+ ["\u379A", "\u379A"], /* CJK Ideograph Extension A */
+ ["\u379B", "\u379B"], /* CJK Ideograph Extension A */
+ ["\u379C", "\u379C"], /* CJK Ideograph Extension A */
+ ["\u379D", "\u379D"], /* CJK Ideograph Extension A */
+ ["\u379E", "\u379E"], /* CJK Ideograph Extension A */
+ ["\u379F", "\u379F"], /* CJK Ideograph Extension A */
+ ["\u37A0", "\u37A0"], /* CJK Ideograph Extension A */
+ ["\u37A1", "\u37A1"], /* CJK Ideograph Extension A */
+ ["\u37A2", "\u37A2"], /* CJK Ideograph Extension A */
+ ["\u37A3", "\u37A3"], /* CJK Ideograph Extension A */
+ ["\u37A4", "\u37A4"], /* CJK Ideograph Extension A */
+ ["\u37A5", "\u37A5"], /* CJK Ideograph Extension A */
+ ["\u37A6", "\u37A6"], /* CJK Ideograph Extension A */
+ ["\u37A7", "\u37A7"], /* CJK Ideograph Extension A */
+ ["\u37A8", "\u37A8"], /* CJK Ideograph Extension A */
+ ["\u37A9", "\u37A9"], /* CJK Ideograph Extension A */
+ ["\u37AA", "\u37AA"], /* CJK Ideograph Extension A */
+ ["\u37AB", "\u37AB"], /* CJK Ideograph Extension A */
+ ["\u37AC", "\u37AC"], /* CJK Ideograph Extension A */
+ ["\u37AD", "\u37AD"], /* CJK Ideograph Extension A */
+ ["\u37AE", "\u37AE"], /* CJK Ideograph Extension A */
+ ["\u37AF", "\u37AF"], /* CJK Ideograph Extension A */
+ ["\u37B0", "\u37B0"], /* CJK Ideograph Extension A */
+ ["\u37B1", "\u37B1"], /* CJK Ideograph Extension A */
+ ["\u37B2", "\u37B2"], /* CJK Ideograph Extension A */
+ ["\u37B3", "\u37B3"], /* CJK Ideograph Extension A */
+ ["\u37B4", "\u37B4"], /* CJK Ideograph Extension A */
+ ["\u37B5", "\u37B5"], /* CJK Ideograph Extension A */
+ ["\u37B6", "\u37B6"], /* CJK Ideograph Extension A */
+ ["\u37B7", "\u37B7"], /* CJK Ideograph Extension A */
+ ["\u37B8", "\u37B8"], /* CJK Ideograph Extension A */
+ ["\u37B9", "\u37B9"], /* CJK Ideograph Extension A */
+ ["\u37BA", "\u37BA"], /* CJK Ideograph Extension A */
+ ["\u37BB", "\u37BB"], /* CJK Ideograph Extension A */
+ ["\u37BC", "\u37BC"], /* CJK Ideograph Extension A */
+ ["\u37BD", "\u37BD"], /* CJK Ideograph Extension A */
+ ["\u37BE", "\u37BE"], /* CJK Ideograph Extension A */
+ ["\u37BF", "\u37BF"], /* CJK Ideograph Extension A */
+ ["\u37C0", "\u37C0"], /* CJK Ideograph Extension A */
+ ["\u37C1", "\u37C1"], /* CJK Ideograph Extension A */
+ ["\u37C2", "\u37C2"], /* CJK Ideograph Extension A */
+ ["\u37C3", "\u37C3"], /* CJK Ideograph Extension A */
+ ["\u37C4", "\u37C4"], /* CJK Ideograph Extension A */
+ ["\u37C5", "\u37C5"], /* CJK Ideograph Extension A */
+ ["\u37C6", "\u37C6"], /* CJK Ideograph Extension A */
+ ["\u37C7", "\u37C7"], /* CJK Ideograph Extension A */
+ ["\u37C8", "\u37C8"], /* CJK Ideograph Extension A */
+ ["\u37C9", "\u37C9"], /* CJK Ideograph Extension A */
+ ["\u37CA", "\u37CA"], /* CJK Ideograph Extension A */
+ ["\u37CB", "\u37CB"], /* CJK Ideograph Extension A */
+ ["\u37CC", "\u37CC"], /* CJK Ideograph Extension A */
+ ["\u37CD", "\u37CD"], /* CJK Ideograph Extension A */
+ ["\u37CE", "\u37CE"], /* CJK Ideograph Extension A */
+ ["\u37CF", "\u37CF"], /* CJK Ideograph Extension A */
+ ["\u37D0", "\u37D0"], /* CJK Ideograph Extension A */
+ ["\u37D1", "\u37D1"], /* CJK Ideograph Extension A */
+ ["\u37D2", "\u37D2"], /* CJK Ideograph Extension A */
+ ["\u37D3", "\u37D3"], /* CJK Ideograph Extension A */
+ ["\u37D4", "\u37D4"], /* CJK Ideograph Extension A */
+ ["\u37D5", "\u37D5"], /* CJK Ideograph Extension A */
+ ["\u37D6", "\u37D6"], /* CJK Ideograph Extension A */
+ ["\u37D7", "\u37D7"], /* CJK Ideograph Extension A */
+ ["\u37D8", "\u37D8"], /* CJK Ideograph Extension A */
+ ["\u37D9", "\u37D9"], /* CJK Ideograph Extension A */
+ ["\u37DA", "\u37DA"], /* CJK Ideograph Extension A */
+ ["\u37DB", "\u37DB"], /* CJK Ideograph Extension A */
+ ["\u37DC", "\u37DC"], /* CJK Ideograph Extension A */
+ ["\u37DD", "\u37DD"], /* CJK Ideograph Extension A */
+ ["\u37DE", "\u37DE"], /* CJK Ideograph Extension A */
+ ["\u37DF", "\u37DF"], /* CJK Ideograph Extension A */
+ ["\u37E0", "\u37E0"], /* CJK Ideograph Extension A */
+ ["\u37E1", "\u37E1"], /* CJK Ideograph Extension A */
+ ["\u37E2", "\u37E2"], /* CJK Ideograph Extension A */
+ ["\u37E3", "\u37E3"], /* CJK Ideograph Extension A */
+ ["\u37E4", "\u37E4"], /* CJK Ideograph Extension A */
+ ["\u37E5", "\u37E5"], /* CJK Ideograph Extension A */
+ ["\u37E6", "\u37E6"], /* CJK Ideograph Extension A */
+ ["\u37E7", "\u37E7"], /* CJK Ideograph Extension A */
+ ["\u37E8", "\u37E8"], /* CJK Ideograph Extension A */
+ ["\u37E9", "\u37E9"], /* CJK Ideograph Extension A */
+ ["\u37EA", "\u37EA"], /* CJK Ideograph Extension A */
+ ["\u37EB", "\u37EB"], /* CJK Ideograph Extension A */
+ ["\u37EC", "\u37EC"], /* CJK Ideograph Extension A */
+ ["\u37ED", "\u37ED"], /* CJK Ideograph Extension A */
+ ["\u37EE", "\u37EE"], /* CJK Ideograph Extension A */
+ ["\u37EF", "\u37EF"], /* CJK Ideograph Extension A */
+ ["\u37F0", "\u37F0"], /* CJK Ideograph Extension A */
+ ["\u37F1", "\u37F1"], /* CJK Ideograph Extension A */
+ ["\u37F2", "\u37F2"], /* CJK Ideograph Extension A */
+ ["\u37F3", "\u37F3"], /* CJK Ideograph Extension A */
+ ["\u37F4", "\u37F4"], /* CJK Ideograph Extension A */
+ ["\u37F5", "\u37F5"], /* CJK Ideograph Extension A */
+ ["\u37F6", "\u37F6"], /* CJK Ideograph Extension A */
+ ["\u37F7", "\u37F7"], /* CJK Ideograph Extension A */
+ ["\u37F8", "\u37F8"], /* CJK Ideograph Extension A */
+ ["\u37F9", "\u37F9"], /* CJK Ideograph Extension A */
+ ["\u37FA", "\u37FA"], /* CJK Ideograph Extension A */
+ ["\u37FB", "\u37FB"], /* CJK Ideograph Extension A */
+ ["\u37FC", "\u37FC"], /* CJK Ideograph Extension A */
+ ["\u37FD", "\u37FD"], /* CJK Ideograph Extension A */
+ ["\u37FE", "\u37FE"], /* CJK Ideograph Extension A */
+ ["\u37FF", "\u37FF"], /* CJK Ideograph Extension A */
+ ["\u3800", "\u3800"], /* CJK Ideograph Extension A */
+ ["\u3801", "\u3801"], /* CJK Ideograph Extension A */
+ ["\u3802", "\u3802"], /* CJK Ideograph Extension A */
+ ["\u3803", "\u3803"], /* CJK Ideograph Extension A */
+ ["\u3804", "\u3804"], /* CJK Ideograph Extension A */
+ ["\u3805", "\u3805"], /* CJK Ideograph Extension A */
+ ["\u3806", "\u3806"], /* CJK Ideograph Extension A */
+ ["\u3807", "\u3807"], /* CJK Ideograph Extension A */
+ ["\u3808", "\u3808"], /* CJK Ideograph Extension A */
+ ["\u3809", "\u3809"], /* CJK Ideograph Extension A */
+ ["\u380A", "\u380A"], /* CJK Ideograph Extension A */
+ ["\u380B", "\u380B"], /* CJK Ideograph Extension A */
+ ["\u380C", "\u380C"], /* CJK Ideograph Extension A */
+ ["\u380D", "\u380D"], /* CJK Ideograph Extension A */
+ ["\u380E", "\u380E"], /* CJK Ideograph Extension A */
+ ["\u380F", "\u380F"], /* CJK Ideograph Extension A */
+ ["\u3810", "\u3810"], /* CJK Ideograph Extension A */
+ ["\u3811", "\u3811"], /* CJK Ideograph Extension A */
+ ["\u3812", "\u3812"], /* CJK Ideograph Extension A */
+ ["\u3813", "\u3813"], /* CJK Ideograph Extension A */
+ ["\u3814", "\u3814"], /* CJK Ideograph Extension A */
+ ["\u3815", "\u3815"], /* CJK Ideograph Extension A */
+ ["\u3816", "\u3816"], /* CJK Ideograph Extension A */
+ ["\u3817", "\u3817"], /* CJK Ideograph Extension A */
+ ["\u3818", "\u3818"], /* CJK Ideograph Extension A */
+ ["\u3819", "\u3819"], /* CJK Ideograph Extension A */
+ ["\u381A", "\u381A"], /* CJK Ideograph Extension A */
+ ["\u381B", "\u381B"], /* CJK Ideograph Extension A */
+ ["\u381C", "\u381C"], /* CJK Ideograph Extension A */
+ ["\u381D", "\u381D"], /* CJK Ideograph Extension A */
+ ["\u381E", "\u381E"], /* CJK Ideograph Extension A */
+ ["\u381F", "\u381F"], /* CJK Ideograph Extension A */
+ ["\u3820", "\u3820"], /* CJK Ideograph Extension A */
+ ["\u3821", "\u3821"], /* CJK Ideograph Extension A */
+ ["\u3822", "\u3822"], /* CJK Ideograph Extension A */
+ ["\u3823", "\u3823"], /* CJK Ideograph Extension A */
+ ["\u3824", "\u3824"], /* CJK Ideograph Extension A */
+ ["\u3825", "\u3825"], /* CJK Ideograph Extension A */
+ ["\u3826", "\u3826"], /* CJK Ideograph Extension A */
+ ["\u3827", "\u3827"], /* CJK Ideograph Extension A */
+ ["\u3828", "\u3828"], /* CJK Ideograph Extension A */
+ ["\u3829", "\u3829"], /* CJK Ideograph Extension A */
+ ["\u382A", "\u382A"], /* CJK Ideograph Extension A */
+ ["\u382B", "\u382B"], /* CJK Ideograph Extension A */
+ ["\u382C", "\u382C"], /* CJK Ideograph Extension A */
+ ["\u382D", "\u382D"], /* CJK Ideograph Extension A */
+ ["\u382E", "\u382E"], /* CJK Ideograph Extension A */
+ ["\u382F", "\u382F"], /* CJK Ideograph Extension A */
+ ["\u3830", "\u3830"], /* CJK Ideograph Extension A */
+ ["\u3831", "\u3831"], /* CJK Ideograph Extension A */
+ ["\u3832", "\u3832"], /* CJK Ideograph Extension A */
+ ["\u3833", "\u3833"], /* CJK Ideograph Extension A */
+ ["\u3834", "\u3834"], /* CJK Ideograph Extension A */
+ ["\u3835", "\u3835"], /* CJK Ideograph Extension A */
+ ["\u3836", "\u3836"], /* CJK Ideograph Extension A */
+ ["\u3837", "\u3837"], /* CJK Ideograph Extension A */
+ ["\u3838", "\u3838"], /* CJK Ideograph Extension A */
+ ["\u3839", "\u3839"], /* CJK Ideograph Extension A */
+ ["\u383A", "\u383A"], /* CJK Ideograph Extension A */
+ ["\u383B", "\u383B"], /* CJK Ideograph Extension A */
+ ["\u383C", "\u383C"], /* CJK Ideograph Extension A */
+ ["\u383D", "\u383D"], /* CJK Ideograph Extension A */
+ ["\u383E", "\u383E"], /* CJK Ideograph Extension A */
+ ["\u383F", "\u383F"], /* CJK Ideograph Extension A */
+ ["\u3840", "\u3840"], /* CJK Ideograph Extension A */
+ ["\u3841", "\u3841"], /* CJK Ideograph Extension A */
+ ["\u3842", "\u3842"], /* CJK Ideograph Extension A */
+ ["\u3843", "\u3843"], /* CJK Ideograph Extension A */
+ ["\u3844", "\u3844"], /* CJK Ideograph Extension A */
+ ["\u3845", "\u3845"], /* CJK Ideograph Extension A */
+ ["\u3846", "\u3846"], /* CJK Ideograph Extension A */
+ ["\u3847", "\u3847"], /* CJK Ideograph Extension A */
+ ["\u3848", "\u3848"], /* CJK Ideograph Extension A */
+ ["\u3849", "\u3849"], /* CJK Ideograph Extension A */
+ ["\u384A", "\u384A"], /* CJK Ideograph Extension A */
+ ["\u384B", "\u384B"], /* CJK Ideograph Extension A */
+ ["\u384C", "\u384C"], /* CJK Ideograph Extension A */
+ ["\u384D", "\u384D"], /* CJK Ideograph Extension A */
+ ["\u384E", "\u384E"], /* CJK Ideograph Extension A */
+ ["\u384F", "\u384F"], /* CJK Ideograph Extension A */
+ ["\u3850", "\u3850"], /* CJK Ideograph Extension A */
+ ["\u3851", "\u3851"], /* CJK Ideograph Extension A */
+ ["\u3852", "\u3852"], /* CJK Ideograph Extension A */
+ ["\u3853", "\u3853"], /* CJK Ideograph Extension A */
+ ["\u3854", "\u3854"], /* CJK Ideograph Extension A */
+ ["\u3855", "\u3855"], /* CJK Ideograph Extension A */
+ ["\u3856", "\u3856"], /* CJK Ideograph Extension A */
+ ["\u3857", "\u3857"], /* CJK Ideograph Extension A */
+ ["\u3858", "\u3858"], /* CJK Ideograph Extension A */
+ ["\u3859", "\u3859"], /* CJK Ideograph Extension A */
+ ["\u385A", "\u385A"], /* CJK Ideograph Extension A */
+ ["\u385B", "\u385B"], /* CJK Ideograph Extension A */
+ ["\u385C", "\u385C"], /* CJK Ideograph Extension A */
+ ["\u385D", "\u385D"], /* CJK Ideograph Extension A */
+ ["\u385E", "\u385E"], /* CJK Ideograph Extension A */
+ ["\u385F", "\u385F"], /* CJK Ideograph Extension A */
+ ["\u3860", "\u3860"], /* CJK Ideograph Extension A */
+ ["\u3861", "\u3861"], /* CJK Ideograph Extension A */
+ ["\u3862", "\u3862"], /* CJK Ideograph Extension A */
+ ["\u3863", "\u3863"], /* CJK Ideograph Extension A */
+ ["\u3864", "\u3864"], /* CJK Ideograph Extension A */
+ ["\u3865", "\u3865"], /* CJK Ideograph Extension A */
+ ["\u3866", "\u3866"], /* CJK Ideograph Extension A */
+ ["\u3867", "\u3867"], /* CJK Ideograph Extension A */
+ ["\u3868", "\u3868"], /* CJK Ideograph Extension A */
+ ["\u3869", "\u3869"], /* CJK Ideograph Extension A */
+ ["\u386A", "\u386A"], /* CJK Ideograph Extension A */
+ ["\u386B", "\u386B"], /* CJK Ideograph Extension A */
+ ["\u386C", "\u386C"], /* CJK Ideograph Extension A */
+ ["\u386D", "\u386D"], /* CJK Ideograph Extension A */
+ ["\u386E", "\u386E"], /* CJK Ideograph Extension A */
+ ["\u386F", "\u386F"], /* CJK Ideograph Extension A */
+ ["\u3870", "\u3870"], /* CJK Ideograph Extension A */
+ ["\u3871", "\u3871"], /* CJK Ideograph Extension A */
+ ["\u3872", "\u3872"], /* CJK Ideograph Extension A */
+ ["\u3873", "\u3873"], /* CJK Ideograph Extension A */
+ ["\u3874", "\u3874"], /* CJK Ideograph Extension A */
+ ["\u3875", "\u3875"], /* CJK Ideograph Extension A */
+ ["\u3876", "\u3876"], /* CJK Ideograph Extension A */
+ ["\u3877", "\u3877"], /* CJK Ideograph Extension A */
+ ["\u3878", "\u3878"], /* CJK Ideograph Extension A */
+ ["\u3879", "\u3879"], /* CJK Ideograph Extension A */
+ ["\u387A", "\u387A"], /* CJK Ideograph Extension A */
+ ["\u387B", "\u387B"], /* CJK Ideograph Extension A */
+ ["\u387C", "\u387C"], /* CJK Ideograph Extension A */
+ ["\u387D", "\u387D"], /* CJK Ideograph Extension A */
+ ["\u387E", "\u387E"], /* CJK Ideograph Extension A */
+ ["\u387F", "\u387F"], /* CJK Ideograph Extension A */
+ ["\u3880", "\u3880"], /* CJK Ideograph Extension A */
+ ["\u3881", "\u3881"], /* CJK Ideograph Extension A */
+ ["\u3882", "\u3882"], /* CJK Ideograph Extension A */
+ ["\u3883", "\u3883"], /* CJK Ideograph Extension A */
+ ["\u3884", "\u3884"], /* CJK Ideograph Extension A */
+ ["\u3885", "\u3885"], /* CJK Ideograph Extension A */
+ ["\u3886", "\u3886"], /* CJK Ideograph Extension A */
+ ["\u3887", "\u3887"], /* CJK Ideograph Extension A */
+ ["\u3888", "\u3888"], /* CJK Ideograph Extension A */
+ ["\u3889", "\u3889"], /* CJK Ideograph Extension A */
+ ["\u388A", "\u388A"], /* CJK Ideograph Extension A */
+ ["\u388B", "\u388B"], /* CJK Ideograph Extension A */
+ ["\u388C", "\u388C"], /* CJK Ideograph Extension A */
+ ["\u388D", "\u388D"], /* CJK Ideograph Extension A */
+ ["\u388E", "\u388E"], /* CJK Ideograph Extension A */
+ ["\u388F", "\u388F"], /* CJK Ideograph Extension A */
+ ["\u3890", "\u3890"], /* CJK Ideograph Extension A */
+ ["\u3891", "\u3891"], /* CJK Ideograph Extension A */
+ ["\u3892", "\u3892"], /* CJK Ideograph Extension A */
+ ["\u3893", "\u3893"], /* CJK Ideograph Extension A */
+ ["\u3894", "\u3894"], /* CJK Ideograph Extension A */
+ ["\u3895", "\u3895"], /* CJK Ideograph Extension A */
+ ["\u3896", "\u3896"], /* CJK Ideograph Extension A */
+ ["\u3897", "\u3897"], /* CJK Ideograph Extension A */
+ ["\u3898", "\u3898"], /* CJK Ideograph Extension A */
+ ["\u3899", "\u3899"], /* CJK Ideograph Extension A */
+ ["\u389A", "\u389A"], /* CJK Ideograph Extension A */
+ ["\u389B", "\u389B"], /* CJK Ideograph Extension A */
+ ["\u389C", "\u389C"], /* CJK Ideograph Extension A */
+ ["\u389D", "\u389D"], /* CJK Ideograph Extension A */
+ ["\u389E", "\u389E"], /* CJK Ideograph Extension A */
+ ["\u389F", "\u389F"], /* CJK Ideograph Extension A */
+ ["\u38A0", "\u38A0"], /* CJK Ideograph Extension A */
+ ["\u38A1", "\u38A1"], /* CJK Ideograph Extension A */
+ ["\u38A2", "\u38A2"], /* CJK Ideograph Extension A */
+ ["\u38A3", "\u38A3"], /* CJK Ideograph Extension A */
+ ["\u38A4", "\u38A4"], /* CJK Ideograph Extension A */
+ ["\u38A5", "\u38A5"], /* CJK Ideograph Extension A */
+ ["\u38A6", "\u38A6"], /* CJK Ideograph Extension A */
+ ["\u38A7", "\u38A7"], /* CJK Ideograph Extension A */
+ ["\u38A8", "\u38A8"], /* CJK Ideograph Extension A */
+ ["\u38A9", "\u38A9"], /* CJK Ideograph Extension A */
+ ["\u38AA", "\u38AA"], /* CJK Ideograph Extension A */
+ ["\u38AB", "\u38AB"], /* CJK Ideograph Extension A */
+ ["\u38AC", "\u38AC"], /* CJK Ideograph Extension A */
+ ["\u38AD", "\u38AD"], /* CJK Ideograph Extension A */
+ ["\u38AE", "\u38AE"], /* CJK Ideograph Extension A */
+ ["\u38AF", "\u38AF"], /* CJK Ideograph Extension A */
+ ["\u38B0", "\u38B0"], /* CJK Ideograph Extension A */
+ ["\u38B1", "\u38B1"], /* CJK Ideograph Extension A */
+ ["\u38B2", "\u38B2"], /* CJK Ideograph Extension A */
+ ["\u38B3", "\u38B3"], /* CJK Ideograph Extension A */
+ ["\u38B4", "\u38B4"], /* CJK Ideograph Extension A */
+ ["\u38B5", "\u38B5"], /* CJK Ideograph Extension A */
+ ["\u38B6", "\u38B6"], /* CJK Ideograph Extension A */
+ ["\u38B7", "\u38B7"], /* CJK Ideograph Extension A */
+ ["\u38B8", "\u38B8"], /* CJK Ideograph Extension A */
+ ["\u38B9", "\u38B9"], /* CJK Ideograph Extension A */
+ ["\u38BA", "\u38BA"], /* CJK Ideograph Extension A */
+ ["\u38BB", "\u38BB"], /* CJK Ideograph Extension A */
+ ["\u38BC", "\u38BC"], /* CJK Ideograph Extension A */
+ ["\u38BD", "\u38BD"], /* CJK Ideograph Extension A */
+ ["\u38BE", "\u38BE"], /* CJK Ideograph Extension A */
+ ["\u38BF", "\u38BF"], /* CJK Ideograph Extension A */
+ ["\u38C0", "\u38C0"], /* CJK Ideograph Extension A */
+ ["\u38C1", "\u38C1"], /* CJK Ideograph Extension A */
+ ["\u38C2", "\u38C2"], /* CJK Ideograph Extension A */
+ ["\u38C3", "\u38C3"], /* CJK Ideograph Extension A */
+ ["\u38C4", "\u38C4"], /* CJK Ideograph Extension A */
+ ["\u38C5", "\u38C5"], /* CJK Ideograph Extension A */
+ ["\u38C6", "\u38C6"], /* CJK Ideograph Extension A */
+ ["\u38C7", "\u38C7"], /* CJK Ideograph Extension A */
+ ["\u38C8", "\u38C8"], /* CJK Ideograph Extension A */
+ ["\u38C9", "\u38C9"], /* CJK Ideograph Extension A */
+ ["\u38CA", "\u38CA"], /* CJK Ideograph Extension A */
+ ["\u38CB", "\u38CB"], /* CJK Ideograph Extension A */
+ ["\u38CC", "\u38CC"], /* CJK Ideograph Extension A */
+ ["\u38CD", "\u38CD"], /* CJK Ideograph Extension A */
+ ["\u38CE", "\u38CE"], /* CJK Ideograph Extension A */
+ ["\u38CF", "\u38CF"], /* CJK Ideograph Extension A */
+ ["\u38D0", "\u38D0"], /* CJK Ideograph Extension A */
+ ["\u38D1", "\u38D1"], /* CJK Ideograph Extension A */
+ ["\u38D2", "\u38D2"], /* CJK Ideograph Extension A */
+ ["\u38D3", "\u38D3"], /* CJK Ideograph Extension A */
+ ["\u38D4", "\u38D4"], /* CJK Ideograph Extension A */
+ ["\u38D5", "\u38D5"], /* CJK Ideograph Extension A */
+ ["\u38D6", "\u38D6"], /* CJK Ideograph Extension A */
+ ["\u38D7", "\u38D7"], /* CJK Ideograph Extension A */
+ ["\u38D8", "\u38D8"], /* CJK Ideograph Extension A */
+ ["\u38D9", "\u38D9"], /* CJK Ideograph Extension A */
+ ["\u38DA", "\u38DA"], /* CJK Ideograph Extension A */
+ ["\u38DB", "\u38DB"], /* CJK Ideograph Extension A */
+ ["\u38DC", "\u38DC"], /* CJK Ideograph Extension A */
+ ["\u38DD", "\u38DD"], /* CJK Ideograph Extension A */
+ ["\u38DE", "\u38DE"], /* CJK Ideograph Extension A */
+ ["\u38DF", "\u38DF"], /* CJK Ideograph Extension A */
+ ["\u38E0", "\u38E0"], /* CJK Ideograph Extension A */
+ ["\u38E1", "\u38E1"], /* CJK Ideograph Extension A */
+ ["\u38E2", "\u38E2"], /* CJK Ideograph Extension A */
+ ["\u38E3", "\u38E3"], /* CJK Ideograph Extension A */
+ ["\u38E4", "\u38E4"], /* CJK Ideograph Extension A */
+ ["\u38E5", "\u38E5"], /* CJK Ideograph Extension A */
+ ["\u38E6", "\u38E6"], /* CJK Ideograph Extension A */
+ ["\u38E7", "\u38E7"], /* CJK Ideograph Extension A */
+ ["\u38E8", "\u38E8"], /* CJK Ideograph Extension A */
+ ["\u38E9", "\u38E9"], /* CJK Ideograph Extension A */
+ ["\u38EA", "\u38EA"], /* CJK Ideograph Extension A */
+ ["\u38EB", "\u38EB"], /* CJK Ideograph Extension A */
+ ["\u38EC", "\u38EC"], /* CJK Ideograph Extension A */
+ ["\u38ED", "\u38ED"], /* CJK Ideograph Extension A */
+ ["\u38EE", "\u38EE"], /* CJK Ideograph Extension A */
+ ["\u38EF", "\u38EF"], /* CJK Ideograph Extension A */
+ ["\u38F0", "\u38F0"], /* CJK Ideograph Extension A */
+ ["\u38F1", "\u38F1"], /* CJK Ideograph Extension A */
+ ["\u38F2", "\u38F2"], /* CJK Ideograph Extension A */
+ ["\u38F3", "\u38F3"], /* CJK Ideograph Extension A */
+ ["\u38F4", "\u38F4"], /* CJK Ideograph Extension A */
+ ["\u38F5", "\u38F5"], /* CJK Ideograph Extension A */
+ ["\u38F6", "\u38F6"], /* CJK Ideograph Extension A */
+ ["\u38F7", "\u38F7"], /* CJK Ideograph Extension A */
+ ["\u38F8", "\u38F8"], /* CJK Ideograph Extension A */
+ ["\u38F9", "\u38F9"], /* CJK Ideograph Extension A */
+ ["\u38FA", "\u38FA"], /* CJK Ideograph Extension A */
+ ["\u38FB", "\u38FB"], /* CJK Ideograph Extension A */
+ ["\u38FC", "\u38FC"], /* CJK Ideograph Extension A */
+ ["\u38FD", "\u38FD"], /* CJK Ideograph Extension A */
+ ["\u38FE", "\u38FE"], /* CJK Ideograph Extension A */
+ ["\u38FF", "\u38FF"], /* CJK Ideograph Extension A */
+ ["\u3900", "\u3900"], /* CJK Ideograph Extension A */
+ ["\u3901", "\u3901"], /* CJK Ideograph Extension A */
+ ["\u3902", "\u3902"], /* CJK Ideograph Extension A */
+ ["\u3903", "\u3903"], /* CJK Ideograph Extension A */
+ ["\u3904", "\u3904"], /* CJK Ideograph Extension A */
+ ["\u3905", "\u3905"], /* CJK Ideograph Extension A */
+ ["\u3906", "\u3906"], /* CJK Ideograph Extension A */
+ ["\u3907", "\u3907"], /* CJK Ideograph Extension A */
+ ["\u3908", "\u3908"], /* CJK Ideograph Extension A */
+ ["\u3909", "\u3909"], /* CJK Ideograph Extension A */
+ ["\u390A", "\u390A"], /* CJK Ideograph Extension A */
+ ["\u390B", "\u390B"], /* CJK Ideograph Extension A */
+ ["\u390C", "\u390C"], /* CJK Ideograph Extension A */
+ ["\u390D", "\u390D"], /* CJK Ideograph Extension A */
+ ["\u390E", "\u390E"], /* CJK Ideograph Extension A */
+ ["\u390F", "\u390F"], /* CJK Ideograph Extension A */
+ ["\u3910", "\u3910"], /* CJK Ideograph Extension A */
+ ["\u3911", "\u3911"], /* CJK Ideograph Extension A */
+ ["\u3912", "\u3912"], /* CJK Ideograph Extension A */
+ ["\u3913", "\u3913"], /* CJK Ideograph Extension A */
+ ["\u3914", "\u3914"], /* CJK Ideograph Extension A */
+ ["\u3915", "\u3915"], /* CJK Ideograph Extension A */
+ ["\u3916", "\u3916"], /* CJK Ideograph Extension A */
+ ["\u3917", "\u3917"], /* CJK Ideograph Extension A */
+ ["\u3918", "\u3918"], /* CJK Ideograph Extension A */
+ ["\u3919", "\u3919"], /* CJK Ideograph Extension A */
+ ["\u391A", "\u391A"], /* CJK Ideograph Extension A */
+ ["\u391B", "\u391B"], /* CJK Ideograph Extension A */
+ ["\u391C", "\u391C"], /* CJK Ideograph Extension A */
+ ["\u391D", "\u391D"], /* CJK Ideograph Extension A */
+ ["\u391E", "\u391E"], /* CJK Ideograph Extension A */
+ ["\u391F", "\u391F"], /* CJK Ideograph Extension A */
+ ["\u3920", "\u3920"], /* CJK Ideograph Extension A */
+ ["\u3921", "\u3921"], /* CJK Ideograph Extension A */
+ ["\u3922", "\u3922"], /* CJK Ideograph Extension A */
+ ["\u3923", "\u3923"], /* CJK Ideograph Extension A */
+ ["\u3924", "\u3924"], /* CJK Ideograph Extension A */
+ ["\u3925", "\u3925"], /* CJK Ideograph Extension A */
+ ["\u3926", "\u3926"], /* CJK Ideograph Extension A */
+ ["\u3927", "\u3927"], /* CJK Ideograph Extension A */
+ ["\u3928", "\u3928"], /* CJK Ideograph Extension A */
+ ["\u3929", "\u3929"], /* CJK Ideograph Extension A */
+ ["\u392A", "\u392A"], /* CJK Ideograph Extension A */
+ ["\u392B", "\u392B"], /* CJK Ideograph Extension A */
+ ["\u392C", "\u392C"], /* CJK Ideograph Extension A */
+ ["\u392D", "\u392D"], /* CJK Ideograph Extension A */
+ ["\u392E", "\u392E"], /* CJK Ideograph Extension A */
+ ["\u392F", "\u392F"], /* CJK Ideograph Extension A */
+ ["\u3930", "\u3930"], /* CJK Ideograph Extension A */
+ ["\u3931", "\u3931"], /* CJK Ideograph Extension A */
+ ["\u3932", "\u3932"], /* CJK Ideograph Extension A */
+ ["\u3933", "\u3933"], /* CJK Ideograph Extension A */
+ ["\u3934", "\u3934"], /* CJK Ideograph Extension A */
+ ["\u3935", "\u3935"], /* CJK Ideograph Extension A */
+ ["\u3936", "\u3936"], /* CJK Ideograph Extension A */
+ ["\u3937", "\u3937"], /* CJK Ideograph Extension A */
+ ["\u3938", "\u3938"], /* CJK Ideograph Extension A */
+ ["\u3939", "\u3939"], /* CJK Ideograph Extension A */
+ ["\u393A", "\u393A"], /* CJK Ideograph Extension A */
+ ["\u393B", "\u393B"], /* CJK Ideograph Extension A */
+ ["\u393C", "\u393C"], /* CJK Ideograph Extension A */
+ ["\u393D", "\u393D"], /* CJK Ideograph Extension A */
+ ["\u393E", "\u393E"], /* CJK Ideograph Extension A */
+ ["\u393F", "\u393F"], /* CJK Ideograph Extension A */
+ ["\u3940", "\u3940"], /* CJK Ideograph Extension A */
+ ["\u3941", "\u3941"], /* CJK Ideograph Extension A */
+ ["\u3942", "\u3942"], /* CJK Ideograph Extension A */
+ ["\u3943", "\u3943"], /* CJK Ideograph Extension A */
+ ["\u3944", "\u3944"], /* CJK Ideograph Extension A */
+ ["\u3945", "\u3945"], /* CJK Ideograph Extension A */
+ ["\u3946", "\u3946"], /* CJK Ideograph Extension A */
+ ["\u3947", "\u3947"], /* CJK Ideograph Extension A */
+ ["\u3948", "\u3948"], /* CJK Ideograph Extension A */
+ ["\u3949", "\u3949"], /* CJK Ideograph Extension A */
+ ["\u394A", "\u394A"], /* CJK Ideograph Extension A */
+ ["\u394B", "\u394B"], /* CJK Ideograph Extension A */
+ ["\u394C", "\u394C"], /* CJK Ideograph Extension A */
+ ["\u394D", "\u394D"], /* CJK Ideograph Extension A */
+ ["\u394E", "\u394E"], /* CJK Ideograph Extension A */
+ ["\u394F", "\u394F"], /* CJK Ideograph Extension A */
+ ["\u3950", "\u3950"], /* CJK Ideograph Extension A */
+ ["\u3951", "\u3951"], /* CJK Ideograph Extension A */
+ ["\u3952", "\u3952"], /* CJK Ideograph Extension A */
+ ["\u3953", "\u3953"], /* CJK Ideograph Extension A */
+ ["\u3954", "\u3954"], /* CJK Ideograph Extension A */
+ ["\u3955", "\u3955"], /* CJK Ideograph Extension A */
+ ["\u3956", "\u3956"], /* CJK Ideograph Extension A */
+ ["\u3957", "\u3957"], /* CJK Ideograph Extension A */
+ ["\u3958", "\u3958"], /* CJK Ideograph Extension A */
+ ["\u3959", "\u3959"], /* CJK Ideograph Extension A */
+ ["\u395A", "\u395A"], /* CJK Ideograph Extension A */
+ ["\u395B", "\u395B"], /* CJK Ideograph Extension A */
+ ["\u395C", "\u395C"], /* CJK Ideograph Extension A */
+ ["\u395D", "\u395D"], /* CJK Ideograph Extension A */
+ ["\u395E", "\u395E"], /* CJK Ideograph Extension A */
+ ["\u395F", "\u395F"], /* CJK Ideograph Extension A */
+ ["\u3960", "\u3960"], /* CJK Ideograph Extension A */
+ ["\u3961", "\u3961"], /* CJK Ideograph Extension A */
+ ["\u3962", "\u3962"], /* CJK Ideograph Extension A */
+ ["\u3963", "\u3963"], /* CJK Ideograph Extension A */
+ ["\u3964", "\u3964"], /* CJK Ideograph Extension A */
+ ["\u3965", "\u3965"], /* CJK Ideograph Extension A */
+ ["\u3966", "\u3966"], /* CJK Ideograph Extension A */
+ ["\u3967", "\u3967"], /* CJK Ideograph Extension A */
+ ["\u3968", "\u3968"], /* CJK Ideograph Extension A */
+ ["\u3969", "\u3969"], /* CJK Ideograph Extension A */
+ ["\u396A", "\u396A"], /* CJK Ideograph Extension A */
+ ["\u396B", "\u396B"], /* CJK Ideograph Extension A */
+ ["\u396C", "\u396C"], /* CJK Ideograph Extension A */
+ ["\u396D", "\u396D"], /* CJK Ideograph Extension A */
+ ["\u396E", "\u396E"], /* CJK Ideograph Extension A */
+ ["\u396F", "\u396F"], /* CJK Ideograph Extension A */
+ ["\u3970", "\u3970"], /* CJK Ideograph Extension A */
+ ["\u3971", "\u3971"], /* CJK Ideograph Extension A */
+ ["\u3972", "\u3972"], /* CJK Ideograph Extension A */
+ ["\u3973", "\u3973"], /* CJK Ideograph Extension A */
+ ["\u3974", "\u3974"], /* CJK Ideograph Extension A */
+ ["\u3975", "\u3975"], /* CJK Ideograph Extension A */
+ ["\u3976", "\u3976"], /* CJK Ideograph Extension A */
+ ["\u3977", "\u3977"], /* CJK Ideograph Extension A */
+ ["\u3978", "\u3978"], /* CJK Ideograph Extension A */
+ ["\u3979", "\u3979"], /* CJK Ideograph Extension A */
+ ["\u397A", "\u397A"], /* CJK Ideograph Extension A */
+ ["\u397B", "\u397B"], /* CJK Ideograph Extension A */
+ ["\u397C", "\u397C"], /* CJK Ideograph Extension A */
+ ["\u397D", "\u397D"], /* CJK Ideograph Extension A */
+ ["\u397E", "\u397E"], /* CJK Ideograph Extension A */
+ ["\u397F", "\u397F"], /* CJK Ideograph Extension A */
+ ["\u3980", "\u3980"], /* CJK Ideograph Extension A */
+ ["\u3981", "\u3981"], /* CJK Ideograph Extension A */
+ ["\u3982", "\u3982"], /* CJK Ideograph Extension A */
+ ["\u3983", "\u3983"], /* CJK Ideograph Extension A */
+ ["\u3984", "\u3984"], /* CJK Ideograph Extension A */
+ ["\u3985", "\u3985"], /* CJK Ideograph Extension A */
+ ["\u3986", "\u3986"], /* CJK Ideograph Extension A */
+ ["\u3987", "\u3987"], /* CJK Ideograph Extension A */
+ ["\u3988", "\u3988"], /* CJK Ideograph Extension A */
+ ["\u3989", "\u3989"], /* CJK Ideograph Extension A */
+ ["\u398A", "\u398A"], /* CJK Ideograph Extension A */
+ ["\u398B", "\u398B"], /* CJK Ideograph Extension A */
+ ["\u398C", "\u398C"], /* CJK Ideograph Extension A */
+ ["\u398D", "\u398D"], /* CJK Ideograph Extension A */
+ ["\u398E", "\u398E"], /* CJK Ideograph Extension A */
+ ["\u398F", "\u398F"], /* CJK Ideograph Extension A */
+ ["\u3990", "\u3990"], /* CJK Ideograph Extension A */
+ ["\u3991", "\u3991"], /* CJK Ideograph Extension A */
+ ["\u3992", "\u3992"], /* CJK Ideograph Extension A */
+ ["\u3993", "\u3993"], /* CJK Ideograph Extension A */
+ ["\u3994", "\u3994"], /* CJK Ideograph Extension A */
+ ["\u3995", "\u3995"], /* CJK Ideograph Extension A */
+ ["\u3996", "\u3996"], /* CJK Ideograph Extension A */
+ ["\u3997", "\u3997"], /* CJK Ideograph Extension A */
+ ["\u3998", "\u3998"], /* CJK Ideograph Extension A */
+ ["\u3999", "\u3999"], /* CJK Ideograph Extension A */
+ ["\u399A", "\u399A"], /* CJK Ideograph Extension A */
+ ["\u399B", "\u399B"], /* CJK Ideograph Extension A */
+ ["\u399C", "\u399C"], /* CJK Ideograph Extension A */
+ ["\u399D", "\u399D"], /* CJK Ideograph Extension A */
+ ["\u399E", "\u399E"], /* CJK Ideograph Extension A */
+ ["\u399F", "\u399F"], /* CJK Ideograph Extension A */
+ ["\u39A0", "\u39A0"], /* CJK Ideograph Extension A */
+ ["\u39A1", "\u39A1"], /* CJK Ideograph Extension A */
+ ["\u39A2", "\u39A2"], /* CJK Ideograph Extension A */
+ ["\u39A3", "\u39A3"], /* CJK Ideograph Extension A */
+ ["\u39A4", "\u39A4"], /* CJK Ideograph Extension A */
+ ["\u39A5", "\u39A5"], /* CJK Ideograph Extension A */
+ ["\u39A6", "\u39A6"], /* CJK Ideograph Extension A */
+ ["\u39A7", "\u39A7"], /* CJK Ideograph Extension A */
+ ["\u39A8", "\u39A8"], /* CJK Ideograph Extension A */
+ ["\u39A9", "\u39A9"], /* CJK Ideograph Extension A */
+ ["\u39AA", "\u39AA"], /* CJK Ideograph Extension A */
+ ["\u39AB", "\u39AB"], /* CJK Ideograph Extension A */
+ ["\u39AC", "\u39AC"], /* CJK Ideograph Extension A */
+ ["\u39AD", "\u39AD"], /* CJK Ideograph Extension A */
+ ["\u39AE", "\u39AE"], /* CJK Ideograph Extension A */
+ ["\u39AF", "\u39AF"], /* CJK Ideograph Extension A */
+ ["\u39B0", "\u39B0"], /* CJK Ideograph Extension A */
+ ["\u39B1", "\u39B1"], /* CJK Ideograph Extension A */
+ ["\u39B2", "\u39B2"], /* CJK Ideograph Extension A */
+ ["\u39B3", "\u39B3"], /* CJK Ideograph Extension A */
+ ["\u39B4", "\u39B4"], /* CJK Ideograph Extension A */
+ ["\u39B5", "\u39B5"], /* CJK Ideograph Extension A */
+ ["\u39B6", "\u39B6"], /* CJK Ideograph Extension A */
+ ["\u39B7", "\u39B7"], /* CJK Ideograph Extension A */
+ ["\u39B8", "\u39B8"], /* CJK Ideograph Extension A */
+ ["\u39B9", "\u39B9"], /* CJK Ideograph Extension A */
+ ["\u39BA", "\u39BA"], /* CJK Ideograph Extension A */
+ ["\u39BB", "\u39BB"], /* CJK Ideograph Extension A */
+ ["\u39BC", "\u39BC"], /* CJK Ideograph Extension A */
+ ["\u39BD", "\u39BD"], /* CJK Ideograph Extension A */
+ ["\u39BE", "\u39BE"], /* CJK Ideograph Extension A */
+ ["\u39BF", "\u39BF"], /* CJK Ideograph Extension A */
+ ["\u39C0", "\u39C0"], /* CJK Ideograph Extension A */
+ ["\u39C1", "\u39C1"], /* CJK Ideograph Extension A */
+ ["\u39C2", "\u39C2"], /* CJK Ideograph Extension A */
+ ["\u39C3", "\u39C3"], /* CJK Ideograph Extension A */
+ ["\u39C4", "\u39C4"], /* CJK Ideograph Extension A */
+ ["\u39C5", "\u39C5"], /* CJK Ideograph Extension A */
+ ["\u39C6", "\u39C6"], /* CJK Ideograph Extension A */
+ ["\u39C7", "\u39C7"], /* CJK Ideograph Extension A */
+ ["\u39C8", "\u39C8"], /* CJK Ideograph Extension A */
+ ["\u39C9", "\u39C9"], /* CJK Ideograph Extension A */
+ ["\u39CA", "\u39CA"], /* CJK Ideograph Extension A */
+ ["\u39CB", "\u39CB"], /* CJK Ideograph Extension A */
+ ["\u39CC", "\u39CC"], /* CJK Ideograph Extension A */
+ ["\u39CD", "\u39CD"], /* CJK Ideograph Extension A */
+ ["\u39CE", "\u39CE"], /* CJK Ideograph Extension A */
+ ["\u39CF", "\u39CF"], /* CJK Ideograph Extension A */
+ ["\u39D0", "\u39D0"], /* CJK Ideograph Extension A */
+ ["\u39D1", "\u39D1"], /* CJK Ideograph Extension A */
+ ["\u39D2", "\u39D2"], /* CJK Ideograph Extension A */
+ ["\u39D3", "\u39D3"], /* CJK Ideograph Extension A */
+ ["\u39D4", "\u39D4"], /* CJK Ideograph Extension A */
+ ["\u39D5", "\u39D5"], /* CJK Ideograph Extension A */
+ ["\u39D6", "\u39D6"], /* CJK Ideograph Extension A */
+ ["\u39D7", "\u39D7"], /* CJK Ideograph Extension A */
+ ["\u39D8", "\u39D8"], /* CJK Ideograph Extension A */
+ ["\u39D9", "\u39D9"], /* CJK Ideograph Extension A */
+ ["\u39DA", "\u39DA"], /* CJK Ideograph Extension A */
+ ["\u39DB", "\u39DB"], /* CJK Ideograph Extension A */
+ ["\u39DC", "\u39DC"], /* CJK Ideograph Extension A */
+ ["\u39DD", "\u39DD"], /* CJK Ideograph Extension A */
+ ["\u39DE", "\u39DE"], /* CJK Ideograph Extension A */
+ ["\u39DF", "\u39DF"], /* CJK Ideograph Extension A */
+ ["\u39E0", "\u39E0"], /* CJK Ideograph Extension A */
+ ["\u39E1", "\u39E1"], /* CJK Ideograph Extension A */
+ ["\u39E2", "\u39E2"], /* CJK Ideograph Extension A */
+ ["\u39E3", "\u39E3"], /* CJK Ideograph Extension A */
+ ["\u39E4", "\u39E4"], /* CJK Ideograph Extension A */
+ ["\u39E5", "\u39E5"], /* CJK Ideograph Extension A */
+ ["\u39E6", "\u39E6"], /* CJK Ideograph Extension A */
+ ["\u39E7", "\u39E7"], /* CJK Ideograph Extension A */
+ ["\u39E8", "\u39E8"], /* CJK Ideograph Extension A */
+ ["\u39E9", "\u39E9"], /* CJK Ideograph Extension A */
+ ["\u39EA", "\u39EA"], /* CJK Ideograph Extension A */
+ ["\u39EB", "\u39EB"], /* CJK Ideograph Extension A */
+ ["\u39EC", "\u39EC"], /* CJK Ideograph Extension A */
+ ["\u39ED", "\u39ED"], /* CJK Ideograph Extension A */
+ ["\u39EE", "\u39EE"], /* CJK Ideograph Extension A */
+ ["\u39EF", "\u39EF"], /* CJK Ideograph Extension A */
+ ["\u39F0", "\u39F0"], /* CJK Ideograph Extension A */
+ ["\u39F1", "\u39F1"], /* CJK Ideograph Extension A */
+ ["\u39F2", "\u39F2"], /* CJK Ideograph Extension A */
+ ["\u39F3", "\u39F3"], /* CJK Ideograph Extension A */
+ ["\u39F4", "\u39F4"], /* CJK Ideograph Extension A */
+ ["\u39F5", "\u39F5"], /* CJK Ideograph Extension A */
+ ["\u39F6", "\u39F6"], /* CJK Ideograph Extension A */
+ ["\u39F7", "\u39F7"], /* CJK Ideograph Extension A */
+ ["\u39F8", "\u39F8"], /* CJK Ideograph Extension A */
+ ["\u39F9", "\u39F9"], /* CJK Ideograph Extension A */
+ ["\u39FA", "\u39FA"], /* CJK Ideograph Extension A */
+ ["\u39FB", "\u39FB"], /* CJK Ideograph Extension A */
+ ["\u39FC", "\u39FC"], /* CJK Ideograph Extension A */
+ ["\u39FD", "\u39FD"], /* CJK Ideograph Extension A */
+ ["\u39FE", "\u39FE"], /* CJK Ideograph Extension A */
+ ["\u39FF", "\u39FF"], /* CJK Ideograph Extension A */
+ ["\u3A00", "\u3A00"], /* CJK Ideograph Extension A */
+ ["\u3A01", "\u3A01"], /* CJK Ideograph Extension A */
+ ["\u3A02", "\u3A02"], /* CJK Ideograph Extension A */
+ ["\u3A03", "\u3A03"], /* CJK Ideograph Extension A */
+ ["\u3A04", "\u3A04"], /* CJK Ideograph Extension A */
+ ["\u3A05", "\u3A05"], /* CJK Ideograph Extension A */
+ ["\u3A06", "\u3A06"], /* CJK Ideograph Extension A */
+ ["\u3A07", "\u3A07"], /* CJK Ideograph Extension A */
+ ["\u3A08", "\u3A08"], /* CJK Ideograph Extension A */
+ ["\u3A09", "\u3A09"], /* CJK Ideograph Extension A */
+ ["\u3A0A", "\u3A0A"], /* CJK Ideograph Extension A */
+ ["\u3A0B", "\u3A0B"], /* CJK Ideograph Extension A */
+ ["\u3A0C", "\u3A0C"], /* CJK Ideograph Extension A */
+ ["\u3A0D", "\u3A0D"], /* CJK Ideograph Extension A */
+ ["\u3A0E", "\u3A0E"], /* CJK Ideograph Extension A */
+ ["\u3A0F", "\u3A0F"], /* CJK Ideograph Extension A */
+ ["\u3A10", "\u3A10"], /* CJK Ideograph Extension A */
+ ["\u3A11", "\u3A11"], /* CJK Ideograph Extension A */
+ ["\u3A12", "\u3A12"], /* CJK Ideograph Extension A */
+ ["\u3A13", "\u3A13"], /* CJK Ideograph Extension A */
+ ["\u3A14", "\u3A14"], /* CJK Ideograph Extension A */
+ ["\u3A15", "\u3A15"], /* CJK Ideograph Extension A */
+ ["\u3A16", "\u3A16"], /* CJK Ideograph Extension A */
+ ["\u3A17", "\u3A17"], /* CJK Ideograph Extension A */
+ ["\u3A18", "\u3A18"], /* CJK Ideograph Extension A */
+ ["\u3A19", "\u3A19"], /* CJK Ideograph Extension A */
+ ["\u3A1A", "\u3A1A"], /* CJK Ideograph Extension A */
+ ["\u3A1B", "\u3A1B"], /* CJK Ideograph Extension A */
+ ["\u3A1C", "\u3A1C"], /* CJK Ideograph Extension A */
+ ["\u3A1D", "\u3A1D"], /* CJK Ideograph Extension A */
+ ["\u3A1E", "\u3A1E"], /* CJK Ideograph Extension A */
+ ["\u3A1F", "\u3A1F"], /* CJK Ideograph Extension A */
+ ["\u3A20", "\u3A20"], /* CJK Ideograph Extension A */
+ ["\u3A21", "\u3A21"], /* CJK Ideograph Extension A */
+ ["\u3A22", "\u3A22"], /* CJK Ideograph Extension A */
+ ["\u3A23", "\u3A23"], /* CJK Ideograph Extension A */
+ ["\u3A24", "\u3A24"], /* CJK Ideograph Extension A */
+ ["\u3A25", "\u3A25"], /* CJK Ideograph Extension A */
+ ["\u3A26", "\u3A26"], /* CJK Ideograph Extension A */
+ ["\u3A27", "\u3A27"], /* CJK Ideograph Extension A */
+ ["\u3A28", "\u3A28"], /* CJK Ideograph Extension A */
+ ["\u3A29", "\u3A29"], /* CJK Ideograph Extension A */
+ ["\u3A2A", "\u3A2A"], /* CJK Ideograph Extension A */
+ ["\u3A2B", "\u3A2B"], /* CJK Ideograph Extension A */
+ ["\u3A2C", "\u3A2C"], /* CJK Ideograph Extension A */
+ ["\u3A2D", "\u3A2D"], /* CJK Ideograph Extension A */
+ ["\u3A2E", "\u3A2E"], /* CJK Ideograph Extension A */
+ ["\u3A2F", "\u3A2F"], /* CJK Ideograph Extension A */
+ ["\u3A30", "\u3A30"], /* CJK Ideograph Extension A */
+ ["\u3A31", "\u3A31"], /* CJK Ideograph Extension A */
+ ["\u3A32", "\u3A32"], /* CJK Ideograph Extension A */
+ ["\u3A33", "\u3A33"], /* CJK Ideograph Extension A */
+ ["\u3A34", "\u3A34"], /* CJK Ideograph Extension A */
+ ["\u3A35", "\u3A35"], /* CJK Ideograph Extension A */
+ ["\u3A36", "\u3A36"], /* CJK Ideograph Extension A */
+ ["\u3A37", "\u3A37"], /* CJK Ideograph Extension A */
+ ["\u3A38", "\u3A38"], /* CJK Ideograph Extension A */
+ ["\u3A39", "\u3A39"], /* CJK Ideograph Extension A */
+ ["\u3A3A", "\u3A3A"], /* CJK Ideograph Extension A */
+ ["\u3A3B", "\u3A3B"], /* CJK Ideograph Extension A */
+ ["\u3A3C", "\u3A3C"], /* CJK Ideograph Extension A */
+ ["\u3A3D", "\u3A3D"], /* CJK Ideograph Extension A */
+ ["\u3A3E", "\u3A3E"], /* CJK Ideograph Extension A */
+ ["\u3A3F", "\u3A3F"], /* CJK Ideograph Extension A */
+ ["\u3A40", "\u3A40"], /* CJK Ideograph Extension A */
+ ["\u3A41", "\u3A41"], /* CJK Ideograph Extension A */
+ ["\u3A42", "\u3A42"], /* CJK Ideograph Extension A */
+ ["\u3A43", "\u3A43"], /* CJK Ideograph Extension A */
+ ["\u3A44", "\u3A44"], /* CJK Ideograph Extension A */
+ ["\u3A45", "\u3A45"], /* CJK Ideograph Extension A */
+ ["\u3A46", "\u3A46"], /* CJK Ideograph Extension A */
+ ["\u3A47", "\u3A47"], /* CJK Ideograph Extension A */
+ ["\u3A48", "\u3A48"], /* CJK Ideograph Extension A */
+ ["\u3A49", "\u3A49"], /* CJK Ideograph Extension A */
+ ["\u3A4A", "\u3A4A"], /* CJK Ideograph Extension A */
+ ["\u3A4B", "\u3A4B"], /* CJK Ideograph Extension A */
+ ["\u3A4C", "\u3A4C"], /* CJK Ideograph Extension A */
+ ["\u3A4D", "\u3A4D"], /* CJK Ideograph Extension A */
+ ["\u3A4E", "\u3A4E"], /* CJK Ideograph Extension A */
+ ["\u3A4F", "\u3A4F"], /* CJK Ideograph Extension A */
+ ["\u3A50", "\u3A50"], /* CJK Ideograph Extension A */
+ ["\u3A51", "\u3A51"], /* CJK Ideograph Extension A */
+ ["\u3A52", "\u3A52"], /* CJK Ideograph Extension A */
+ ["\u3A53", "\u3A53"], /* CJK Ideograph Extension A */
+ ["\u3A54", "\u3A54"], /* CJK Ideograph Extension A */
+ ["\u3A55", "\u3A55"], /* CJK Ideograph Extension A */
+ ["\u3A56", "\u3A56"], /* CJK Ideograph Extension A */
+ ["\u3A57", "\u3A57"], /* CJK Ideograph Extension A */
+ ["\u3A58", "\u3A58"], /* CJK Ideograph Extension A */
+ ["\u3A59", "\u3A59"], /* CJK Ideograph Extension A */
+ ["\u3A5A", "\u3A5A"], /* CJK Ideograph Extension A */
+ ["\u3A5B", "\u3A5B"], /* CJK Ideograph Extension A */
+ ["\u3A5C", "\u3A5C"], /* CJK Ideograph Extension A */
+ ["\u3A5D", "\u3A5D"], /* CJK Ideograph Extension A */
+ ["\u3A5E", "\u3A5E"], /* CJK Ideograph Extension A */
+ ["\u3A5F", "\u3A5F"], /* CJK Ideograph Extension A */
+ ["\u3A60", "\u3A60"], /* CJK Ideograph Extension A */
+ ["\u3A61", "\u3A61"], /* CJK Ideograph Extension A */
+ ["\u3A62", "\u3A62"], /* CJK Ideograph Extension A */
+ ["\u3A63", "\u3A63"], /* CJK Ideograph Extension A */
+ ["\u3A64", "\u3A64"], /* CJK Ideograph Extension A */
+ ["\u3A65", "\u3A65"], /* CJK Ideograph Extension A */
+ ["\u3A66", "\u3A66"], /* CJK Ideograph Extension A */
+ ["\u3A67", "\u3A67"], /* CJK Ideograph Extension A */
+ ["\u3A68", "\u3A68"], /* CJK Ideograph Extension A */
+ ["\u3A69", "\u3A69"], /* CJK Ideograph Extension A */
+ ["\u3A6A", "\u3A6A"], /* CJK Ideograph Extension A */
+ ["\u3A6B", "\u3A6B"], /* CJK Ideograph Extension A */
+ ["\u3A6C", "\u3A6C"], /* CJK Ideograph Extension A */
+ ["\u3A6D", "\u3A6D"], /* CJK Ideograph Extension A */
+ ["\u3A6E", "\u3A6E"], /* CJK Ideograph Extension A */
+ ["\u3A6F", "\u3A6F"], /* CJK Ideograph Extension A */
+ ["\u3A70", "\u3A70"], /* CJK Ideograph Extension A */
+ ["\u3A71", "\u3A71"], /* CJK Ideograph Extension A */
+ ["\u3A72", "\u3A72"], /* CJK Ideograph Extension A */
+ ["\u3A73", "\u3A73"], /* CJK Ideograph Extension A */
+ ["\u3A74", "\u3A74"], /* CJK Ideograph Extension A */
+ ["\u3A75", "\u3A75"], /* CJK Ideograph Extension A */
+ ["\u3A76", "\u3A76"], /* CJK Ideograph Extension A */
+ ["\u3A77", "\u3A77"], /* CJK Ideograph Extension A */
+ ["\u3A78", "\u3A78"], /* CJK Ideograph Extension A */
+ ["\u3A79", "\u3A79"], /* CJK Ideograph Extension A */
+ ["\u3A7A", "\u3A7A"], /* CJK Ideograph Extension A */
+ ["\u3A7B", "\u3A7B"], /* CJK Ideograph Extension A */
+ ["\u3A7C", "\u3A7C"], /* CJK Ideograph Extension A */
+ ["\u3A7D", "\u3A7D"], /* CJK Ideograph Extension A */
+ ["\u3A7E", "\u3A7E"], /* CJK Ideograph Extension A */
+ ["\u3A7F", "\u3A7F"], /* CJK Ideograph Extension A */
+ ["\u3A80", "\u3A80"], /* CJK Ideograph Extension A */
+ ["\u3A81", "\u3A81"], /* CJK Ideograph Extension A */
+ ["\u3A82", "\u3A82"], /* CJK Ideograph Extension A */
+ ["\u3A83", "\u3A83"], /* CJK Ideograph Extension A */
+ ["\u3A84", "\u3A84"], /* CJK Ideograph Extension A */
+ ["\u3A85", "\u3A85"], /* CJK Ideograph Extension A */
+ ["\u3A86", "\u3A86"], /* CJK Ideograph Extension A */
+ ["\u3A87", "\u3A87"], /* CJK Ideograph Extension A */
+ ["\u3A88", "\u3A88"], /* CJK Ideograph Extension A */
+ ["\u3A89", "\u3A89"], /* CJK Ideograph Extension A */
+ ["\u3A8A", "\u3A8A"], /* CJK Ideograph Extension A */
+ ["\u3A8B", "\u3A8B"], /* CJK Ideograph Extension A */
+ ["\u3A8C", "\u3A8C"], /* CJK Ideograph Extension A */
+ ["\u3A8D", "\u3A8D"], /* CJK Ideograph Extension A */
+ ["\u3A8E", "\u3A8E"], /* CJK Ideograph Extension A */
+ ["\u3A8F", "\u3A8F"], /* CJK Ideograph Extension A */
+ ["\u3A90", "\u3A90"], /* CJK Ideograph Extension A */
+ ["\u3A91", "\u3A91"], /* CJK Ideograph Extension A */
+ ["\u3A92", "\u3A92"], /* CJK Ideograph Extension A */
+ ["\u3A93", "\u3A93"], /* CJK Ideograph Extension A */
+ ["\u3A94", "\u3A94"], /* CJK Ideograph Extension A */
+ ["\u3A95", "\u3A95"], /* CJK Ideograph Extension A */
+ ["\u3A96", "\u3A96"], /* CJK Ideograph Extension A */
+ ["\u3A97", "\u3A97"], /* CJK Ideograph Extension A */
+ ["\u3A98", "\u3A98"], /* CJK Ideograph Extension A */
+ ["\u3A99", "\u3A99"], /* CJK Ideograph Extension A */
+ ["\u3A9A", "\u3A9A"], /* CJK Ideograph Extension A */
+ ["\u3A9B", "\u3A9B"], /* CJK Ideograph Extension A */
+ ["\u3A9C", "\u3A9C"], /* CJK Ideograph Extension A */
+ ["\u3A9D", "\u3A9D"], /* CJK Ideograph Extension A */
+ ["\u3A9E", "\u3A9E"], /* CJK Ideograph Extension A */
+ ["\u3A9F", "\u3A9F"], /* CJK Ideograph Extension A */
+ ["\u3AA0", "\u3AA0"], /* CJK Ideograph Extension A */
+ ["\u3AA1", "\u3AA1"], /* CJK Ideograph Extension A */
+ ["\u3AA2", "\u3AA2"], /* CJK Ideograph Extension A */
+ ["\u3AA3", "\u3AA3"], /* CJK Ideograph Extension A */
+ ["\u3AA4", "\u3AA4"], /* CJK Ideograph Extension A */
+ ["\u3AA5", "\u3AA5"], /* CJK Ideograph Extension A */
+ ["\u3AA6", "\u3AA6"], /* CJK Ideograph Extension A */
+ ["\u3AA7", "\u3AA7"], /* CJK Ideograph Extension A */
+ ["\u3AA8", "\u3AA8"], /* CJK Ideograph Extension A */
+ ["\u3AA9", "\u3AA9"], /* CJK Ideograph Extension A */
+ ["\u3AAA", "\u3AAA"], /* CJK Ideograph Extension A */
+ ["\u3AAB", "\u3AAB"], /* CJK Ideograph Extension A */
+ ["\u3AAC", "\u3AAC"], /* CJK Ideograph Extension A */
+ ["\u3AAD", "\u3AAD"], /* CJK Ideograph Extension A */
+ ["\u3AAE", "\u3AAE"], /* CJK Ideograph Extension A */
+ ["\u3AAF", "\u3AAF"], /* CJK Ideograph Extension A */
+ ["\u3AB0", "\u3AB0"], /* CJK Ideograph Extension A */
+ ["\u3AB1", "\u3AB1"], /* CJK Ideograph Extension A */
+ ["\u3AB2", "\u3AB2"], /* CJK Ideograph Extension A */
+ ["\u3AB3", "\u3AB3"], /* CJK Ideograph Extension A */
+ ["\u3AB4", "\u3AB4"], /* CJK Ideograph Extension A */
+ ["\u3AB5", "\u3AB5"], /* CJK Ideograph Extension A */
+ ["\u3AB6", "\u3AB6"], /* CJK Ideograph Extension A */
+ ["\u3AB7", "\u3AB7"], /* CJK Ideograph Extension A */
+ ["\u3AB8", "\u3AB8"], /* CJK Ideograph Extension A */
+ ["\u3AB9", "\u3AB9"], /* CJK Ideograph Extension A */
+ ["\u3ABA", "\u3ABA"], /* CJK Ideograph Extension A */
+ ["\u3ABB", "\u3ABB"], /* CJK Ideograph Extension A */
+ ["\u3ABC", "\u3ABC"], /* CJK Ideograph Extension A */
+ ["\u3ABD", "\u3ABD"], /* CJK Ideograph Extension A */
+ ["\u3ABE", "\u3ABE"], /* CJK Ideograph Extension A */
+ ["\u3ABF", "\u3ABF"], /* CJK Ideograph Extension A */
+ ["\u3AC0", "\u3AC0"], /* CJK Ideograph Extension A */
+ ["\u3AC1", "\u3AC1"], /* CJK Ideograph Extension A */
+ ["\u3AC2", "\u3AC2"], /* CJK Ideograph Extension A */
+ ["\u3AC3", "\u3AC3"], /* CJK Ideograph Extension A */
+ ["\u3AC4", "\u3AC4"], /* CJK Ideograph Extension A */
+ ["\u3AC5", "\u3AC5"], /* CJK Ideograph Extension A */
+ ["\u3AC6", "\u3AC6"], /* CJK Ideograph Extension A */
+ ["\u3AC7", "\u3AC7"], /* CJK Ideograph Extension A */
+ ["\u3AC8", "\u3AC8"], /* CJK Ideograph Extension A */
+ ["\u3AC9", "\u3AC9"], /* CJK Ideograph Extension A */
+ ["\u3ACA", "\u3ACA"], /* CJK Ideograph Extension A */
+ ["\u3ACB", "\u3ACB"], /* CJK Ideograph Extension A */
+ ["\u3ACC", "\u3ACC"], /* CJK Ideograph Extension A */
+ ["\u3ACD", "\u3ACD"], /* CJK Ideograph Extension A */
+ ["\u3ACE", "\u3ACE"], /* CJK Ideograph Extension A */
+ ["\u3ACF", "\u3ACF"], /* CJK Ideograph Extension A */
+ ["\u3AD0", "\u3AD0"], /* CJK Ideograph Extension A */
+ ["\u3AD1", "\u3AD1"], /* CJK Ideograph Extension A */
+ ["\u3AD2", "\u3AD2"], /* CJK Ideograph Extension A */
+ ["\u3AD3", "\u3AD3"], /* CJK Ideograph Extension A */
+ ["\u3AD4", "\u3AD4"], /* CJK Ideograph Extension A */
+ ["\u3AD5", "\u3AD5"], /* CJK Ideograph Extension A */
+ ["\u3AD6", "\u3AD6"], /* CJK Ideograph Extension A */
+ ["\u3AD7", "\u3AD7"], /* CJK Ideograph Extension A */
+ ["\u3AD8", "\u3AD8"], /* CJK Ideograph Extension A */
+ ["\u3AD9", "\u3AD9"], /* CJK Ideograph Extension A */
+ ["\u3ADA", "\u3ADA"], /* CJK Ideograph Extension A */
+ ["\u3ADB", "\u3ADB"], /* CJK Ideograph Extension A */
+ ["\u3ADC", "\u3ADC"], /* CJK Ideograph Extension A */
+ ["\u3ADD", "\u3ADD"], /* CJK Ideograph Extension A */
+ ["\u3ADE", "\u3ADE"], /* CJK Ideograph Extension A */
+ ["\u3ADF", "\u3ADF"], /* CJK Ideograph Extension A */
+ ["\u3AE0", "\u3AE0"], /* CJK Ideograph Extension A */
+ ["\u3AE1", "\u3AE1"], /* CJK Ideograph Extension A */
+ ["\u3AE2", "\u3AE2"], /* CJK Ideograph Extension A */
+ ["\u3AE3", "\u3AE3"], /* CJK Ideograph Extension A */
+ ["\u3AE4", "\u3AE4"], /* CJK Ideograph Extension A */
+ ["\u3AE5", "\u3AE5"], /* CJK Ideograph Extension A */
+ ["\u3AE6", "\u3AE6"], /* CJK Ideograph Extension A */
+ ["\u3AE7", "\u3AE7"], /* CJK Ideograph Extension A */
+ ["\u3AE8", "\u3AE8"], /* CJK Ideograph Extension A */
+ ["\u3AE9", "\u3AE9"], /* CJK Ideograph Extension A */
+ ["\u3AEA", "\u3AEA"], /* CJK Ideograph Extension A */
+ ["\u3AEB", "\u3AEB"], /* CJK Ideograph Extension A */
+ ["\u3AEC", "\u3AEC"], /* CJK Ideograph Extension A */
+ ["\u3AED", "\u3AED"], /* CJK Ideograph Extension A */
+ ["\u3AEE", "\u3AEE"], /* CJK Ideograph Extension A */
+ ["\u3AEF", "\u3AEF"], /* CJK Ideograph Extension A */
+ ["\u3AF0", "\u3AF0"], /* CJK Ideograph Extension A */
+ ["\u3AF1", "\u3AF1"], /* CJK Ideograph Extension A */
+ ["\u3AF2", "\u3AF2"], /* CJK Ideograph Extension A */
+ ["\u3AF3", "\u3AF3"], /* CJK Ideograph Extension A */
+ ["\u3AF4", "\u3AF4"], /* CJK Ideograph Extension A */
+ ["\u3AF5", "\u3AF5"], /* CJK Ideograph Extension A */
+ ["\u3AF6", "\u3AF6"], /* CJK Ideograph Extension A */
+ ["\u3AF7", "\u3AF7"], /* CJK Ideograph Extension A */
+ ["\u3AF8", "\u3AF8"], /* CJK Ideograph Extension A */
+ ["\u3AF9", "\u3AF9"], /* CJK Ideograph Extension A */
+ ["\u3AFA", "\u3AFA"], /* CJK Ideograph Extension A */
+ ["\u3AFB", "\u3AFB"], /* CJK Ideograph Extension A */
+ ["\u3AFC", "\u3AFC"], /* CJK Ideograph Extension A */
+ ["\u3AFD", "\u3AFD"], /* CJK Ideograph Extension A */
+ ["\u3AFE", "\u3AFE"], /* CJK Ideograph Extension A */
+ ["\u3AFF", "\u3AFF"], /* CJK Ideograph Extension A */
+ ["\u3B00", "\u3B00"], /* CJK Ideograph Extension A */
+ ["\u3B01", "\u3B01"], /* CJK Ideograph Extension A */
+ ["\u3B02", "\u3B02"], /* CJK Ideograph Extension A */
+ ["\u3B03", "\u3B03"], /* CJK Ideograph Extension A */
+ ["\u3B04", "\u3B04"], /* CJK Ideograph Extension A */
+ ["\u3B05", "\u3B05"], /* CJK Ideograph Extension A */
+ ["\u3B06", "\u3B06"], /* CJK Ideograph Extension A */
+ ["\u3B07", "\u3B07"], /* CJK Ideograph Extension A */
+ ["\u3B08", "\u3B08"], /* CJK Ideograph Extension A */
+ ["\u3B09", "\u3B09"], /* CJK Ideograph Extension A */
+ ["\u3B0A", "\u3B0A"], /* CJK Ideograph Extension A */
+ ["\u3B0B", "\u3B0B"], /* CJK Ideograph Extension A */
+ ["\u3B0C", "\u3B0C"], /* CJK Ideograph Extension A */
+ ["\u3B0D", "\u3B0D"], /* CJK Ideograph Extension A */
+ ["\u3B0E", "\u3B0E"], /* CJK Ideograph Extension A */
+ ["\u3B0F", "\u3B0F"], /* CJK Ideograph Extension A */
+ ["\u3B10", "\u3B10"], /* CJK Ideograph Extension A */
+ ["\u3B11", "\u3B11"], /* CJK Ideograph Extension A */
+ ["\u3B12", "\u3B12"], /* CJK Ideograph Extension A */
+ ["\u3B13", "\u3B13"], /* CJK Ideograph Extension A */
+ ["\u3B14", "\u3B14"], /* CJK Ideograph Extension A */
+ ["\u3B15", "\u3B15"], /* CJK Ideograph Extension A */
+ ["\u3B16", "\u3B16"], /* CJK Ideograph Extension A */
+ ["\u3B17", "\u3B17"], /* CJK Ideograph Extension A */
+ ["\u3B18", "\u3B18"], /* CJK Ideograph Extension A */
+ ["\u3B19", "\u3B19"], /* CJK Ideograph Extension A */
+ ["\u3B1A", "\u3B1A"], /* CJK Ideograph Extension A */
+ ["\u3B1B", "\u3B1B"], /* CJK Ideograph Extension A */
+ ["\u3B1C", "\u3B1C"], /* CJK Ideograph Extension A */
+ ["\u3B1D", "\u3B1D"], /* CJK Ideograph Extension A */
+ ["\u3B1E", "\u3B1E"], /* CJK Ideograph Extension A */
+ ["\u3B1F", "\u3B1F"], /* CJK Ideograph Extension A */
+ ["\u3B20", "\u3B20"], /* CJK Ideograph Extension A */
+ ["\u3B21", "\u3B21"], /* CJK Ideograph Extension A */
+ ["\u3B22", "\u3B22"], /* CJK Ideograph Extension A */
+ ["\u3B23", "\u3B23"], /* CJK Ideograph Extension A */
+ ["\u3B24", "\u3B24"], /* CJK Ideograph Extension A */
+ ["\u3B25", "\u3B25"], /* CJK Ideograph Extension A */
+ ["\u3B26", "\u3B26"], /* CJK Ideograph Extension A */
+ ["\u3B27", "\u3B27"], /* CJK Ideograph Extension A */
+ ["\u3B28", "\u3B28"], /* CJK Ideograph Extension A */
+ ["\u3B29", "\u3B29"], /* CJK Ideograph Extension A */
+ ["\u3B2A", "\u3B2A"], /* CJK Ideograph Extension A */
+ ["\u3B2B", "\u3B2B"], /* CJK Ideograph Extension A */
+ ["\u3B2C", "\u3B2C"], /* CJK Ideograph Extension A */
+ ["\u3B2D", "\u3B2D"], /* CJK Ideograph Extension A */
+ ["\u3B2E", "\u3B2E"], /* CJK Ideograph Extension A */
+ ["\u3B2F", "\u3B2F"], /* CJK Ideograph Extension A */
+ ["\u3B30", "\u3B30"], /* CJK Ideograph Extension A */
+ ["\u3B31", "\u3B31"], /* CJK Ideograph Extension A */
+ ["\u3B32", "\u3B32"], /* CJK Ideograph Extension A */
+ ["\u3B33", "\u3B33"], /* CJK Ideograph Extension A */
+ ["\u3B34", "\u3B34"], /* CJK Ideograph Extension A */
+ ["\u3B35", "\u3B35"], /* CJK Ideograph Extension A */
+ ["\u3B36", "\u3B36"], /* CJK Ideograph Extension A */
+ ["\u3B37", "\u3B37"], /* CJK Ideograph Extension A */
+ ["\u3B38", "\u3B38"], /* CJK Ideograph Extension A */
+ ["\u3B39", "\u3B39"], /* CJK Ideograph Extension A */
+ ["\u3B3A", "\u3B3A"], /* CJK Ideograph Extension A */
+ ["\u3B3B", "\u3B3B"], /* CJK Ideograph Extension A */
+ ["\u3B3C", "\u3B3C"], /* CJK Ideograph Extension A */
+ ["\u3B3D", "\u3B3D"], /* CJK Ideograph Extension A */
+ ["\u3B3E", "\u3B3E"], /* CJK Ideograph Extension A */
+ ["\u3B3F", "\u3B3F"], /* CJK Ideograph Extension A */
+ ["\u3B40", "\u3B40"], /* CJK Ideograph Extension A */
+ ["\u3B41", "\u3B41"], /* CJK Ideograph Extension A */
+ ["\u3B42", "\u3B42"], /* CJK Ideograph Extension A */
+ ["\u3B43", "\u3B43"], /* CJK Ideograph Extension A */
+ ["\u3B44", "\u3B44"], /* CJK Ideograph Extension A */
+ ["\u3B45", "\u3B45"], /* CJK Ideograph Extension A */
+ ["\u3B46", "\u3B46"], /* CJK Ideograph Extension A */
+ ["\u3B47", "\u3B47"], /* CJK Ideograph Extension A */
+ ["\u3B48", "\u3B48"], /* CJK Ideograph Extension A */
+ ["\u3B49", "\u3B49"], /* CJK Ideograph Extension A */
+ ["\u3B4A", "\u3B4A"], /* CJK Ideograph Extension A */
+ ["\u3B4B", "\u3B4B"], /* CJK Ideograph Extension A */
+ ["\u3B4C", "\u3B4C"], /* CJK Ideograph Extension A */
+ ["\u3B4D", "\u3B4D"], /* CJK Ideograph Extension A */
+ ["\u3B4E", "\u3B4E"], /* CJK Ideograph Extension A */
+ ["\u3B4F", "\u3B4F"], /* CJK Ideograph Extension A */
+ ["\u3B50", "\u3B50"], /* CJK Ideograph Extension A */
+ ["\u3B51", "\u3B51"], /* CJK Ideograph Extension A */
+ ["\u3B52", "\u3B52"], /* CJK Ideograph Extension A */
+ ["\u3B53", "\u3B53"], /* CJK Ideograph Extension A */
+ ["\u3B54", "\u3B54"], /* CJK Ideograph Extension A */
+ ["\u3B55", "\u3B55"], /* CJK Ideograph Extension A */
+ ["\u3B56", "\u3B56"], /* CJK Ideograph Extension A */
+ ["\u3B57", "\u3B57"], /* CJK Ideograph Extension A */
+ ["\u3B58", "\u3B58"], /* CJK Ideograph Extension A */
+ ["\u3B59", "\u3B59"], /* CJK Ideograph Extension A */
+ ["\u3B5A", "\u3B5A"], /* CJK Ideograph Extension A */
+ ["\u3B5B", "\u3B5B"], /* CJK Ideograph Extension A */
+ ["\u3B5C", "\u3B5C"], /* CJK Ideograph Extension A */
+ ["\u3B5D", "\u3B5D"], /* CJK Ideograph Extension A */
+ ["\u3B5E", "\u3B5E"], /* CJK Ideograph Extension A */
+ ["\u3B5F", "\u3B5F"], /* CJK Ideograph Extension A */
+ ["\u3B60", "\u3B60"], /* CJK Ideograph Extension A */
+ ["\u3B61", "\u3B61"], /* CJK Ideograph Extension A */
+ ["\u3B62", "\u3B62"], /* CJK Ideograph Extension A */
+ ["\u3B63", "\u3B63"], /* CJK Ideograph Extension A */
+ ["\u3B64", "\u3B64"], /* CJK Ideograph Extension A */
+ ["\u3B65", "\u3B65"], /* CJK Ideograph Extension A */
+ ["\u3B66", "\u3B66"], /* CJK Ideograph Extension A */
+ ["\u3B67", "\u3B67"], /* CJK Ideograph Extension A */
+ ["\u3B68", "\u3B68"], /* CJK Ideograph Extension A */
+ ["\u3B69", "\u3B69"], /* CJK Ideograph Extension A */
+ ["\u3B6A", "\u3B6A"], /* CJK Ideograph Extension A */
+ ["\u3B6B", "\u3B6B"], /* CJK Ideograph Extension A */
+ ["\u3B6C", "\u3B6C"], /* CJK Ideograph Extension A */
+ ["\u3B6D", "\u3B6D"], /* CJK Ideograph Extension A */
+ ["\u3B6E", "\u3B6E"], /* CJK Ideograph Extension A */
+ ["\u3B6F", "\u3B6F"], /* CJK Ideograph Extension A */
+ ["\u3B70", "\u3B70"], /* CJK Ideograph Extension A */
+ ["\u3B71", "\u3B71"], /* CJK Ideograph Extension A */
+ ["\u3B72", "\u3B72"], /* CJK Ideograph Extension A */
+ ["\u3B73", "\u3B73"], /* CJK Ideograph Extension A */
+ ["\u3B74", "\u3B74"], /* CJK Ideograph Extension A */
+ ["\u3B75", "\u3B75"], /* CJK Ideograph Extension A */
+ ["\u3B76", "\u3B76"], /* CJK Ideograph Extension A */
+ ["\u3B77", "\u3B77"], /* CJK Ideograph Extension A */
+ ["\u3B78", "\u3B78"], /* CJK Ideograph Extension A */
+ ["\u3B79", "\u3B79"], /* CJK Ideograph Extension A */
+ ["\u3B7A", "\u3B7A"], /* CJK Ideograph Extension A */
+ ["\u3B7B", "\u3B7B"], /* CJK Ideograph Extension A */
+ ["\u3B7C", "\u3B7C"], /* CJK Ideograph Extension A */
+ ["\u3B7D", "\u3B7D"], /* CJK Ideograph Extension A */
+ ["\u3B7E", "\u3B7E"], /* CJK Ideograph Extension A */
+ ["\u3B7F", "\u3B7F"], /* CJK Ideograph Extension A */
+ ["\u3B80", "\u3B80"], /* CJK Ideograph Extension A */
+ ["\u3B81", "\u3B81"], /* CJK Ideograph Extension A */
+ ["\u3B82", "\u3B82"], /* CJK Ideograph Extension A */
+ ["\u3B83", "\u3B83"], /* CJK Ideograph Extension A */
+ ["\u3B84", "\u3B84"], /* CJK Ideograph Extension A */
+ ["\u3B85", "\u3B85"], /* CJK Ideograph Extension A */
+ ["\u3B86", "\u3B86"], /* CJK Ideograph Extension A */
+ ["\u3B87", "\u3B87"], /* CJK Ideograph Extension A */
+ ["\u3B88", "\u3B88"], /* CJK Ideograph Extension A */
+ ["\u3B89", "\u3B89"], /* CJK Ideograph Extension A */
+ ["\u3B8A", "\u3B8A"], /* CJK Ideograph Extension A */
+ ["\u3B8B", "\u3B8B"], /* CJK Ideograph Extension A */
+ ["\u3B8C", "\u3B8C"], /* CJK Ideograph Extension A */
+ ["\u3B8D", "\u3B8D"], /* CJK Ideograph Extension A */
+ ["\u3B8E", "\u3B8E"], /* CJK Ideograph Extension A */
+ ["\u3B8F", "\u3B8F"], /* CJK Ideograph Extension A */
+ ["\u3B90", "\u3B90"], /* CJK Ideograph Extension A */
+ ["\u3B91", "\u3B91"], /* CJK Ideograph Extension A */
+ ["\u3B92", "\u3B92"], /* CJK Ideograph Extension A */
+ ["\u3B93", "\u3B93"], /* CJK Ideograph Extension A */
+ ["\u3B94", "\u3B94"], /* CJK Ideograph Extension A */
+ ["\u3B95", "\u3B95"], /* CJK Ideograph Extension A */
+ ["\u3B96", "\u3B96"], /* CJK Ideograph Extension A */
+ ["\u3B97", "\u3B97"], /* CJK Ideograph Extension A */
+ ["\u3B98", "\u3B98"], /* CJK Ideograph Extension A */
+ ["\u3B99", "\u3B99"], /* CJK Ideograph Extension A */
+ ["\u3B9A", "\u3B9A"], /* CJK Ideograph Extension A */
+ ["\u3B9B", "\u3B9B"], /* CJK Ideograph Extension A */
+ ["\u3B9C", "\u3B9C"], /* CJK Ideograph Extension A */
+ ["\u3B9D", "\u3B9D"], /* CJK Ideograph Extension A */
+ ["\u3B9E", "\u3B9E"], /* CJK Ideograph Extension A */
+ ["\u3B9F", "\u3B9F"], /* CJK Ideograph Extension A */
+ ["\u3BA0", "\u3BA0"], /* CJK Ideograph Extension A */
+ ["\u3BA1", "\u3BA1"], /* CJK Ideograph Extension A */
+ ["\u3BA2", "\u3BA2"], /* CJK Ideograph Extension A */
+ ["\u3BA3", "\u3BA3"], /* CJK Ideograph Extension A */
+ ["\u3BA4", "\u3BA4"], /* CJK Ideograph Extension A */
+ ["\u3BA5", "\u3BA5"], /* CJK Ideograph Extension A */
+ ["\u3BA6", "\u3BA6"], /* CJK Ideograph Extension A */
+ ["\u3BA7", "\u3BA7"], /* CJK Ideograph Extension A */
+ ["\u3BA8", "\u3BA8"], /* CJK Ideograph Extension A */
+ ["\u3BA9", "\u3BA9"], /* CJK Ideograph Extension A */
+ ["\u3BAA", "\u3BAA"], /* CJK Ideograph Extension A */
+ ["\u3BAB", "\u3BAB"], /* CJK Ideograph Extension A */
+ ["\u3BAC", "\u3BAC"], /* CJK Ideograph Extension A */
+ ["\u3BAD", "\u3BAD"], /* CJK Ideograph Extension A */
+ ["\u3BAE", "\u3BAE"], /* CJK Ideograph Extension A */
+ ["\u3BAF", "\u3BAF"], /* CJK Ideograph Extension A */
+ ["\u3BB0", "\u3BB0"], /* CJK Ideograph Extension A */
+ ["\u3BB1", "\u3BB1"], /* CJK Ideograph Extension A */
+ ["\u3BB2", "\u3BB2"], /* CJK Ideograph Extension A */
+ ["\u3BB3", "\u3BB3"], /* CJK Ideograph Extension A */
+ ["\u3BB4", "\u3BB4"], /* CJK Ideograph Extension A */
+ ["\u3BB5", "\u3BB5"], /* CJK Ideograph Extension A */
+ ["\u3BB6", "\u3BB6"], /* CJK Ideograph Extension A */
+ ["\u3BB7", "\u3BB7"], /* CJK Ideograph Extension A */
+ ["\u3BB8", "\u3BB8"], /* CJK Ideograph Extension A */
+ ["\u3BB9", "\u3BB9"], /* CJK Ideograph Extension A */
+ ["\u3BBA", "\u3BBA"], /* CJK Ideograph Extension A */
+ ["\u3BBB", "\u3BBB"], /* CJK Ideograph Extension A */
+ ["\u3BBC", "\u3BBC"], /* CJK Ideograph Extension A */
+ ["\u3BBD", "\u3BBD"], /* CJK Ideograph Extension A */
+ ["\u3BBE", "\u3BBE"], /* CJK Ideograph Extension A */
+ ["\u3BBF", "\u3BBF"], /* CJK Ideograph Extension A */
+ ["\u3BC0", "\u3BC0"], /* CJK Ideograph Extension A */
+ ["\u3BC1", "\u3BC1"], /* CJK Ideograph Extension A */
+ ["\u3BC2", "\u3BC2"], /* CJK Ideograph Extension A */
+ ["\u3BC3", "\u3BC3"], /* CJK Ideograph Extension A */
+ ["\u3BC4", "\u3BC4"], /* CJK Ideograph Extension A */
+ ["\u3BC5", "\u3BC5"], /* CJK Ideograph Extension A */
+ ["\u3BC6", "\u3BC6"], /* CJK Ideograph Extension A */
+ ["\u3BC7", "\u3BC7"], /* CJK Ideograph Extension A */
+ ["\u3BC8", "\u3BC8"], /* CJK Ideograph Extension A */
+ ["\u3BC9", "\u3BC9"], /* CJK Ideograph Extension A */
+ ["\u3BCA", "\u3BCA"], /* CJK Ideograph Extension A */
+ ["\u3BCB", "\u3BCB"], /* CJK Ideograph Extension A */
+ ["\u3BCC", "\u3BCC"], /* CJK Ideograph Extension A */
+ ["\u3BCD", "\u3BCD"], /* CJK Ideograph Extension A */
+ ["\u3BCE", "\u3BCE"], /* CJK Ideograph Extension A */
+ ["\u3BCF", "\u3BCF"], /* CJK Ideograph Extension A */
+ ["\u3BD0", "\u3BD0"], /* CJK Ideograph Extension A */
+ ["\u3BD1", "\u3BD1"], /* CJK Ideograph Extension A */
+ ["\u3BD2", "\u3BD2"], /* CJK Ideograph Extension A */
+ ["\u3BD3", "\u3BD3"], /* CJK Ideograph Extension A */
+ ["\u3BD4", "\u3BD4"], /* CJK Ideograph Extension A */
+ ["\u3BD5", "\u3BD5"], /* CJK Ideograph Extension A */
+ ["\u3BD6", "\u3BD6"], /* CJK Ideograph Extension A */
+ ["\u3BD7", "\u3BD7"], /* CJK Ideograph Extension A */
+ ["\u3BD8", "\u3BD8"], /* CJK Ideograph Extension A */
+ ["\u3BD9", "\u3BD9"], /* CJK Ideograph Extension A */
+ ["\u3BDA", "\u3BDA"], /* CJK Ideograph Extension A */
+ ["\u3BDB", "\u3BDB"], /* CJK Ideograph Extension A */
+ ["\u3BDC", "\u3BDC"], /* CJK Ideograph Extension A */
+ ["\u3BDD", "\u3BDD"], /* CJK Ideograph Extension A */
+ ["\u3BDE", "\u3BDE"], /* CJK Ideograph Extension A */
+ ["\u3BDF", "\u3BDF"], /* CJK Ideograph Extension A */
+ ["\u3BE0", "\u3BE0"], /* CJK Ideograph Extension A */
+ ["\u3BE1", "\u3BE1"], /* CJK Ideograph Extension A */
+ ["\u3BE2", "\u3BE2"], /* CJK Ideograph Extension A */
+ ["\u3BE3", "\u3BE3"], /* CJK Ideograph Extension A */
+ ["\u3BE4", "\u3BE4"], /* CJK Ideograph Extension A */
+ ["\u3BE5", "\u3BE5"], /* CJK Ideograph Extension A */
+ ["\u3BE6", "\u3BE6"], /* CJK Ideograph Extension A */
+ ["\u3BE7", "\u3BE7"], /* CJK Ideograph Extension A */
+ ["\u3BE8", "\u3BE8"], /* CJK Ideograph Extension A */
+ ["\u3BE9", "\u3BE9"], /* CJK Ideograph Extension A */
+ ["\u3BEA", "\u3BEA"], /* CJK Ideograph Extension A */
+ ["\u3BEB", "\u3BEB"], /* CJK Ideograph Extension A */
+ ["\u3BEC", "\u3BEC"], /* CJK Ideograph Extension A */
+ ["\u3BED", "\u3BED"], /* CJK Ideograph Extension A */
+ ["\u3BEE", "\u3BEE"], /* CJK Ideograph Extension A */
+ ["\u3BEF", "\u3BEF"], /* CJK Ideograph Extension A */
+ ["\u3BF0", "\u3BF0"], /* CJK Ideograph Extension A */
+ ["\u3BF1", "\u3BF1"], /* CJK Ideograph Extension A */
+ ["\u3BF2", "\u3BF2"], /* CJK Ideograph Extension A */
+ ["\u3BF3", "\u3BF3"], /* CJK Ideograph Extension A */
+ ["\u3BF4", "\u3BF4"], /* CJK Ideograph Extension A */
+ ["\u3BF5", "\u3BF5"], /* CJK Ideograph Extension A */
+ ["\u3BF6", "\u3BF6"], /* CJK Ideograph Extension A */
+ ["\u3BF7", "\u3BF7"], /* CJK Ideograph Extension A */
+ ["\u3BF8", "\u3BF8"], /* CJK Ideograph Extension A */
+ ["\u3BF9", "\u3BF9"], /* CJK Ideograph Extension A */
+ ["\u3BFA", "\u3BFA"], /* CJK Ideograph Extension A */
+ ["\u3BFB", "\u3BFB"], /* CJK Ideograph Extension A */
+ ["\u3BFC", "\u3BFC"], /* CJK Ideograph Extension A */
+ ["\u3BFD", "\u3BFD"], /* CJK Ideograph Extension A */
+ ["\u3BFE", "\u3BFE"], /* CJK Ideograph Extension A */
+ ["\u3BFF", "\u3BFF"], /* CJK Ideograph Extension A */
+ ["\u3C00", "\u3C00"], /* CJK Ideograph Extension A */
+ ["\u3C01", "\u3C01"], /* CJK Ideograph Extension A */
+ ["\u3C02", "\u3C02"], /* CJK Ideograph Extension A */
+ ["\u3C03", "\u3C03"], /* CJK Ideograph Extension A */
+ ["\u3C04", "\u3C04"], /* CJK Ideograph Extension A */
+ ["\u3C05", "\u3C05"], /* CJK Ideograph Extension A */
+ ["\u3C06", "\u3C06"], /* CJK Ideograph Extension A */
+ ["\u3C07", "\u3C07"], /* CJK Ideograph Extension A */
+ ["\u3C08", "\u3C08"], /* CJK Ideograph Extension A */
+ ["\u3C09", "\u3C09"], /* CJK Ideograph Extension A */
+ ["\u3C0A", "\u3C0A"], /* CJK Ideograph Extension A */
+ ["\u3C0B", "\u3C0B"], /* CJK Ideograph Extension A */
+ ["\u3C0C", "\u3C0C"], /* CJK Ideograph Extension A */
+ ["\u3C0D", "\u3C0D"], /* CJK Ideograph Extension A */
+ ["\u3C0E", "\u3C0E"], /* CJK Ideograph Extension A */
+ ["\u3C0F", "\u3C0F"], /* CJK Ideograph Extension A */
+ ["\u3C10", "\u3C10"], /* CJK Ideograph Extension A */
+ ["\u3C11", "\u3C11"], /* CJK Ideograph Extension A */
+ ["\u3C12", "\u3C12"], /* CJK Ideograph Extension A */
+ ["\u3C13", "\u3C13"], /* CJK Ideograph Extension A */
+ ["\u3C14", "\u3C14"], /* CJK Ideograph Extension A */
+ ["\u3C15", "\u3C15"], /* CJK Ideograph Extension A */
+ ["\u3C16", "\u3C16"], /* CJK Ideograph Extension A */
+ ["\u3C17", "\u3C17"], /* CJK Ideograph Extension A */
+ ["\u3C18", "\u3C18"], /* CJK Ideograph Extension A */
+ ["\u3C19", "\u3C19"], /* CJK Ideograph Extension A */
+ ["\u3C1A", "\u3C1A"], /* CJK Ideograph Extension A */
+ ["\u3C1B", "\u3C1B"], /* CJK Ideograph Extension A */
+ ["\u3C1C", "\u3C1C"], /* CJK Ideograph Extension A */
+ ["\u3C1D", "\u3C1D"], /* CJK Ideograph Extension A */
+ ["\u3C1E", "\u3C1E"], /* CJK Ideograph Extension A */
+ ["\u3C1F", "\u3C1F"], /* CJK Ideograph Extension A */
+ ["\u3C20", "\u3C20"], /* CJK Ideograph Extension A */
+ ["\u3C21", "\u3C21"], /* CJK Ideograph Extension A */
+ ["\u3C22", "\u3C22"], /* CJK Ideograph Extension A */
+ ["\u3C23", "\u3C23"], /* CJK Ideograph Extension A */
+ ["\u3C24", "\u3C24"], /* CJK Ideograph Extension A */
+ ["\u3C25", "\u3C25"], /* CJK Ideograph Extension A */
+ ["\u3C26", "\u3C26"], /* CJK Ideograph Extension A */
+ ["\u3C27", "\u3C27"], /* CJK Ideograph Extension A */
+ ["\u3C28", "\u3C28"], /* CJK Ideograph Extension A */
+ ["\u3C29", "\u3C29"], /* CJK Ideograph Extension A */
+ ["\u3C2A", "\u3C2A"], /* CJK Ideograph Extension A */
+ ["\u3C2B", "\u3C2B"], /* CJK Ideograph Extension A */
+ ["\u3C2C", "\u3C2C"], /* CJK Ideograph Extension A */
+ ["\u3C2D", "\u3C2D"], /* CJK Ideograph Extension A */
+ ["\u3C2E", "\u3C2E"], /* CJK Ideograph Extension A */
+ ["\u3C2F", "\u3C2F"], /* CJK Ideograph Extension A */
+ ["\u3C30", "\u3C30"], /* CJK Ideograph Extension A */
+ ["\u3C31", "\u3C31"], /* CJK Ideograph Extension A */
+ ["\u3C32", "\u3C32"], /* CJK Ideograph Extension A */
+ ["\u3C33", "\u3C33"], /* CJK Ideograph Extension A */
+ ["\u3C34", "\u3C34"], /* CJK Ideograph Extension A */
+ ["\u3C35", "\u3C35"], /* CJK Ideograph Extension A */
+ ["\u3C36", "\u3C36"], /* CJK Ideograph Extension A */
+ ["\u3C37", "\u3C37"], /* CJK Ideograph Extension A */
+ ["\u3C38", "\u3C38"], /* CJK Ideograph Extension A */
+ ["\u3C39", "\u3C39"], /* CJK Ideograph Extension A */
+ ["\u3C3A", "\u3C3A"], /* CJK Ideograph Extension A */
+ ["\u3C3B", "\u3C3B"], /* CJK Ideograph Extension A */
+ ["\u3C3C", "\u3C3C"], /* CJK Ideograph Extension A */
+ ["\u3C3D", "\u3C3D"], /* CJK Ideograph Extension A */
+ ["\u3C3E", "\u3C3E"], /* CJK Ideograph Extension A */
+ ["\u3C3F", "\u3C3F"], /* CJK Ideograph Extension A */
+ ["\u3C40", "\u3C40"], /* CJK Ideograph Extension A */
+ ["\u3C41", "\u3C41"], /* CJK Ideograph Extension A */
+ ["\u3C42", "\u3C42"], /* CJK Ideograph Extension A */
+ ["\u3C43", "\u3C43"], /* CJK Ideograph Extension A */
+ ["\u3C44", "\u3C44"], /* CJK Ideograph Extension A */
+ ["\u3C45", "\u3C45"], /* CJK Ideograph Extension A */
+ ["\u3C46", "\u3C46"], /* CJK Ideograph Extension A */
+ ["\u3C47", "\u3C47"], /* CJK Ideograph Extension A */
+ ["\u3C48", "\u3C48"], /* CJK Ideograph Extension A */
+ ["\u3C49", "\u3C49"], /* CJK Ideograph Extension A */
+ ["\u3C4A", "\u3C4A"], /* CJK Ideograph Extension A */
+ ["\u3C4B", "\u3C4B"], /* CJK Ideograph Extension A */
+ ["\u3C4C", "\u3C4C"], /* CJK Ideograph Extension A */
+ ["\u3C4D", "\u3C4D"], /* CJK Ideograph Extension A */
+ ["\u3C4E", "\u3C4E"], /* CJK Ideograph Extension A */
+ ["\u3C4F", "\u3C4F"], /* CJK Ideograph Extension A */
+ ["\u3C50", "\u3C50"], /* CJK Ideograph Extension A */
+ ["\u3C51", "\u3C51"], /* CJK Ideograph Extension A */
+ ["\u3C52", "\u3C52"], /* CJK Ideograph Extension A */
+ ["\u3C53", "\u3C53"], /* CJK Ideograph Extension A */
+ ["\u3C54", "\u3C54"], /* CJK Ideograph Extension A */
+ ["\u3C55", "\u3C55"], /* CJK Ideograph Extension A */
+ ["\u3C56", "\u3C56"], /* CJK Ideograph Extension A */
+ ["\u3C57", "\u3C57"], /* CJK Ideograph Extension A */
+ ["\u3C58", "\u3C58"], /* CJK Ideograph Extension A */
+ ["\u3C59", "\u3C59"], /* CJK Ideograph Extension A */
+ ["\u3C5A", "\u3C5A"], /* CJK Ideograph Extension A */
+ ["\u3C5B", "\u3C5B"], /* CJK Ideograph Extension A */
+ ["\u3C5C", "\u3C5C"], /* CJK Ideograph Extension A */
+ ["\u3C5D", "\u3C5D"], /* CJK Ideograph Extension A */
+ ["\u3C5E", "\u3C5E"], /* CJK Ideograph Extension A */
+ ["\u3C5F", "\u3C5F"], /* CJK Ideograph Extension A */
+ ["\u3C60", "\u3C60"], /* CJK Ideograph Extension A */
+ ["\u3C61", "\u3C61"], /* CJK Ideograph Extension A */
+ ["\u3C62", "\u3C62"], /* CJK Ideograph Extension A */
+ ["\u3C63", "\u3C63"], /* CJK Ideograph Extension A */
+ ["\u3C64", "\u3C64"], /* CJK Ideograph Extension A */
+ ["\u3C65", "\u3C65"], /* CJK Ideograph Extension A */
+ ["\u3C66", "\u3C66"], /* CJK Ideograph Extension A */
+ ["\u3C67", "\u3C67"], /* CJK Ideograph Extension A */
+ ["\u3C68", "\u3C68"], /* CJK Ideograph Extension A */
+ ["\u3C69", "\u3C69"], /* CJK Ideograph Extension A */
+ ["\u3C6A", "\u3C6A"], /* CJK Ideograph Extension A */
+ ["\u3C6B", "\u3C6B"], /* CJK Ideograph Extension A */
+ ["\u3C6C", "\u3C6C"], /* CJK Ideograph Extension A */
+ ["\u3C6D", "\u3C6D"], /* CJK Ideograph Extension A */
+ ["\u3C6E", "\u3C6E"], /* CJK Ideograph Extension A */
+ ["\u3C6F", "\u3C6F"], /* CJK Ideograph Extension A */
+ ["\u3C70", "\u3C70"], /* CJK Ideograph Extension A */
+ ["\u3C71", "\u3C71"], /* CJK Ideograph Extension A */
+ ["\u3C72", "\u3C72"], /* CJK Ideograph Extension A */
+ ["\u3C73", "\u3C73"], /* CJK Ideograph Extension A */
+ ["\u3C74", "\u3C74"], /* CJK Ideograph Extension A */
+ ["\u3C75", "\u3C75"], /* CJK Ideograph Extension A */
+ ["\u3C76", "\u3C76"], /* CJK Ideograph Extension A */
+ ["\u3C77", "\u3C77"], /* CJK Ideograph Extension A */
+ ["\u3C78", "\u3C78"], /* CJK Ideograph Extension A */
+ ["\u3C79", "\u3C79"], /* CJK Ideograph Extension A */
+ ["\u3C7A", "\u3C7A"], /* CJK Ideograph Extension A */
+ ["\u3C7B", "\u3C7B"], /* CJK Ideograph Extension A */
+ ["\u3C7C", "\u3C7C"], /* CJK Ideograph Extension A */
+ ["\u3C7D", "\u3C7D"], /* CJK Ideograph Extension A */
+ ["\u3C7E", "\u3C7E"], /* CJK Ideograph Extension A */
+ ["\u3C7F", "\u3C7F"], /* CJK Ideograph Extension A */
+ ["\u3C80", "\u3C80"], /* CJK Ideograph Extension A */
+ ["\u3C81", "\u3C81"], /* CJK Ideograph Extension A */
+ ["\u3C82", "\u3C82"], /* CJK Ideograph Extension A */
+ ["\u3C83", "\u3C83"], /* CJK Ideograph Extension A */
+ ["\u3C84", "\u3C84"], /* CJK Ideograph Extension A */
+ ["\u3C85", "\u3C85"], /* CJK Ideograph Extension A */
+ ["\u3C86", "\u3C86"], /* CJK Ideograph Extension A */
+ ["\u3C87", "\u3C87"], /* CJK Ideograph Extension A */
+ ["\u3C88", "\u3C88"], /* CJK Ideograph Extension A */
+ ["\u3C89", "\u3C89"], /* CJK Ideograph Extension A */
+ ["\u3C8A", "\u3C8A"], /* CJK Ideograph Extension A */
+ ["\u3C8B", "\u3C8B"], /* CJK Ideograph Extension A */
+ ["\u3C8C", "\u3C8C"], /* CJK Ideograph Extension A */
+ ["\u3C8D", "\u3C8D"], /* CJK Ideograph Extension A */
+ ["\u3C8E", "\u3C8E"], /* CJK Ideograph Extension A */
+ ["\u3C8F", "\u3C8F"], /* CJK Ideograph Extension A */
+ ["\u3C90", "\u3C90"], /* CJK Ideograph Extension A */
+ ["\u3C91", "\u3C91"], /* CJK Ideograph Extension A */
+ ["\u3C92", "\u3C92"], /* CJK Ideograph Extension A */
+ ["\u3C93", "\u3C93"], /* CJK Ideograph Extension A */
+ ["\u3C94", "\u3C94"], /* CJK Ideograph Extension A */
+ ["\u3C95", "\u3C95"], /* CJK Ideograph Extension A */
+ ["\u3C96", "\u3C96"], /* CJK Ideograph Extension A */
+ ["\u3C97", "\u3C97"], /* CJK Ideograph Extension A */
+ ["\u3C98", "\u3C98"], /* CJK Ideograph Extension A */
+ ["\u3C99", "\u3C99"], /* CJK Ideograph Extension A */
+ ["\u3C9A", "\u3C9A"], /* CJK Ideograph Extension A */
+ ["\u3C9B", "\u3C9B"], /* CJK Ideograph Extension A */
+ ["\u3C9C", "\u3C9C"], /* CJK Ideograph Extension A */
+ ["\u3C9D", "\u3C9D"], /* CJK Ideograph Extension A */
+ ["\u3C9E", "\u3C9E"], /* CJK Ideograph Extension A */
+ ["\u3C9F", "\u3C9F"], /* CJK Ideograph Extension A */
+ ["\u3CA0", "\u3CA0"], /* CJK Ideograph Extension A */
+ ["\u3CA1", "\u3CA1"], /* CJK Ideograph Extension A */
+ ["\u3CA2", "\u3CA2"], /* CJK Ideograph Extension A */
+ ["\u3CA3", "\u3CA3"], /* CJK Ideograph Extension A */
+ ["\u3CA4", "\u3CA4"], /* CJK Ideograph Extension A */
+ ["\u3CA5", "\u3CA5"], /* CJK Ideograph Extension A */
+ ["\u3CA6", "\u3CA6"], /* CJK Ideograph Extension A */
+ ["\u3CA7", "\u3CA7"], /* CJK Ideograph Extension A */
+ ["\u3CA8", "\u3CA8"], /* CJK Ideograph Extension A */
+ ["\u3CA9", "\u3CA9"], /* CJK Ideograph Extension A */
+ ["\u3CAA", "\u3CAA"], /* CJK Ideograph Extension A */
+ ["\u3CAB", "\u3CAB"], /* CJK Ideograph Extension A */
+ ["\u3CAC", "\u3CAC"], /* CJK Ideograph Extension A */
+ ["\u3CAD", "\u3CAD"], /* CJK Ideograph Extension A */
+ ["\u3CAE", "\u3CAE"], /* CJK Ideograph Extension A */
+ ["\u3CAF", "\u3CAF"], /* CJK Ideograph Extension A */
+ ["\u3CB0", "\u3CB0"], /* CJK Ideograph Extension A */
+ ["\u3CB1", "\u3CB1"], /* CJK Ideograph Extension A */
+ ["\u3CB2", "\u3CB2"], /* CJK Ideograph Extension A */
+ ["\u3CB3", "\u3CB3"], /* CJK Ideograph Extension A */
+ ["\u3CB4", "\u3CB4"], /* CJK Ideograph Extension A */
+ ["\u3CB5", "\u3CB5"], /* CJK Ideograph Extension A */
+ ["\u3CB6", "\u3CB6"], /* CJK Ideograph Extension A */
+ ["\u3CB7", "\u3CB7"], /* CJK Ideograph Extension A */
+ ["\u3CB8", "\u3CB8"], /* CJK Ideograph Extension A */
+ ["\u3CB9", "\u3CB9"], /* CJK Ideograph Extension A */
+ ["\u3CBA", "\u3CBA"], /* CJK Ideograph Extension A */
+ ["\u3CBB", "\u3CBB"], /* CJK Ideograph Extension A */
+ ["\u3CBC", "\u3CBC"], /* CJK Ideograph Extension A */
+ ["\u3CBD", "\u3CBD"], /* CJK Ideograph Extension A */
+ ["\u3CBE", "\u3CBE"], /* CJK Ideograph Extension A */
+ ["\u3CBF", "\u3CBF"], /* CJK Ideograph Extension A */
+ ["\u3CC0", "\u3CC0"], /* CJK Ideograph Extension A */
+ ["\u3CC1", "\u3CC1"], /* CJK Ideograph Extension A */
+ ["\u3CC2", "\u3CC2"], /* CJK Ideograph Extension A */
+ ["\u3CC3", "\u3CC3"], /* CJK Ideograph Extension A */
+ ["\u3CC4", "\u3CC4"], /* CJK Ideograph Extension A */
+ ["\u3CC5", "\u3CC5"], /* CJK Ideograph Extension A */
+ ["\u3CC6", "\u3CC6"], /* CJK Ideograph Extension A */
+ ["\u3CC7", "\u3CC7"], /* CJK Ideograph Extension A */
+ ["\u3CC8", "\u3CC8"], /* CJK Ideograph Extension A */
+ ["\u3CC9", "\u3CC9"], /* CJK Ideograph Extension A */
+ ["\u3CCA", "\u3CCA"], /* CJK Ideograph Extension A */
+ ["\u3CCB", "\u3CCB"], /* CJK Ideograph Extension A */
+ ["\u3CCC", "\u3CCC"], /* CJK Ideograph Extension A */
+ ["\u3CCD", "\u3CCD"], /* CJK Ideograph Extension A */
+ ["\u3CCE", "\u3CCE"], /* CJK Ideograph Extension A */
+ ["\u3CCF", "\u3CCF"], /* CJK Ideograph Extension A */
+ ["\u3CD0", "\u3CD0"], /* CJK Ideograph Extension A */
+ ["\u3CD1", "\u3CD1"], /* CJK Ideograph Extension A */
+ ["\u3CD2", "\u3CD2"], /* CJK Ideograph Extension A */
+ ["\u3CD3", "\u3CD3"], /* CJK Ideograph Extension A */
+ ["\u3CD4", "\u3CD4"], /* CJK Ideograph Extension A */
+ ["\u3CD5", "\u3CD5"], /* CJK Ideograph Extension A */
+ ["\u3CD6", "\u3CD6"], /* CJK Ideograph Extension A */
+ ["\u3CD7", "\u3CD7"], /* CJK Ideograph Extension A */
+ ["\u3CD8", "\u3CD8"], /* CJK Ideograph Extension A */
+ ["\u3CD9", "\u3CD9"], /* CJK Ideograph Extension A */
+ ["\u3CDA", "\u3CDA"], /* CJK Ideograph Extension A */
+ ["\u3CDB", "\u3CDB"], /* CJK Ideograph Extension A */
+ ["\u3CDC", "\u3CDC"], /* CJK Ideograph Extension A */
+ ["\u3CDD", "\u3CDD"], /* CJK Ideograph Extension A */
+ ["\u3CDE", "\u3CDE"], /* CJK Ideograph Extension A */
+ ["\u3CDF", "\u3CDF"], /* CJK Ideograph Extension A */
+ ["\u3CE0", "\u3CE0"], /* CJK Ideograph Extension A */
+ ["\u3CE1", "\u3CE1"], /* CJK Ideograph Extension A */
+ ["\u3CE2", "\u3CE2"], /* CJK Ideograph Extension A */
+ ["\u3CE3", "\u3CE3"], /* CJK Ideograph Extension A */
+ ["\u3CE4", "\u3CE4"], /* CJK Ideograph Extension A */
+ ["\u3CE5", "\u3CE5"], /* CJK Ideograph Extension A */
+ ["\u3CE6", "\u3CE6"], /* CJK Ideograph Extension A */
+ ["\u3CE7", "\u3CE7"], /* CJK Ideograph Extension A */
+ ["\u3CE8", "\u3CE8"], /* CJK Ideograph Extension A */
+ ["\u3CE9", "\u3CE9"], /* CJK Ideograph Extension A */
+ ["\u3CEA", "\u3CEA"], /* CJK Ideograph Extension A */
+ ["\u3CEB", "\u3CEB"], /* CJK Ideograph Extension A */
+ ["\u3CEC", "\u3CEC"], /* CJK Ideograph Extension A */
+ ["\u3CED", "\u3CED"], /* CJK Ideograph Extension A */
+ ["\u3CEE", "\u3CEE"], /* CJK Ideograph Extension A */
+ ["\u3CEF", "\u3CEF"], /* CJK Ideograph Extension A */
+ ["\u3CF0", "\u3CF0"], /* CJK Ideograph Extension A */
+ ["\u3CF1", "\u3CF1"], /* CJK Ideograph Extension A */
+ ["\u3CF2", "\u3CF2"], /* CJK Ideograph Extension A */
+ ["\u3CF3", "\u3CF3"], /* CJK Ideograph Extension A */
+ ["\u3CF4", "\u3CF4"], /* CJK Ideograph Extension A */
+ ["\u3CF5", "\u3CF5"], /* CJK Ideograph Extension A */
+ ["\u3CF6", "\u3CF6"], /* CJK Ideograph Extension A */
+ ["\u3CF7", "\u3CF7"], /* CJK Ideograph Extension A */
+ ["\u3CF8", "\u3CF8"], /* CJK Ideograph Extension A */
+ ["\u3CF9", "\u3CF9"], /* CJK Ideograph Extension A */
+ ["\u3CFA", "\u3CFA"], /* CJK Ideograph Extension A */
+ ["\u3CFB", "\u3CFB"], /* CJK Ideograph Extension A */
+ ["\u3CFC", "\u3CFC"], /* CJK Ideograph Extension A */
+ ["\u3CFD", "\u3CFD"], /* CJK Ideograph Extension A */
+ ["\u3CFE", "\u3CFE"], /* CJK Ideograph Extension A */
+ ["\u3CFF", "\u3CFF"], /* CJK Ideograph Extension A */
+ ["\u3D00", "\u3D00"], /* CJK Ideograph Extension A */
+ ["\u3D01", "\u3D01"], /* CJK Ideograph Extension A */
+ ["\u3D02", "\u3D02"], /* CJK Ideograph Extension A */
+ ["\u3D03", "\u3D03"], /* CJK Ideograph Extension A */
+ ["\u3D04", "\u3D04"], /* CJK Ideograph Extension A */
+ ["\u3D05", "\u3D05"], /* CJK Ideograph Extension A */
+ ["\u3D06", "\u3D06"], /* CJK Ideograph Extension A */
+ ["\u3D07", "\u3D07"], /* CJK Ideograph Extension A */
+ ["\u3D08", "\u3D08"], /* CJK Ideograph Extension A */
+ ["\u3D09", "\u3D09"], /* CJK Ideograph Extension A */
+ ["\u3D0A", "\u3D0A"], /* CJK Ideograph Extension A */
+ ["\u3D0B", "\u3D0B"], /* CJK Ideograph Extension A */
+ ["\u3D0C", "\u3D0C"], /* CJK Ideograph Extension A */
+ ["\u3D0D", "\u3D0D"], /* CJK Ideograph Extension A */
+ ["\u3D0E", "\u3D0E"], /* CJK Ideograph Extension A */
+ ["\u3D0F", "\u3D0F"], /* CJK Ideograph Extension A */
+ ["\u3D10", "\u3D10"], /* CJK Ideograph Extension A */
+ ["\u3D11", "\u3D11"], /* CJK Ideograph Extension A */
+ ["\u3D12", "\u3D12"], /* CJK Ideograph Extension A */
+ ["\u3D13", "\u3D13"], /* CJK Ideograph Extension A */
+ ["\u3D14", "\u3D14"], /* CJK Ideograph Extension A */
+ ["\u3D15", "\u3D15"], /* CJK Ideograph Extension A */
+ ["\u3D16", "\u3D16"], /* CJK Ideograph Extension A */
+ ["\u3D17", "\u3D17"], /* CJK Ideograph Extension A */
+ ["\u3D18", "\u3D18"], /* CJK Ideograph Extension A */
+ ["\u3D19", "\u3D19"], /* CJK Ideograph Extension A */
+ ["\u3D1A", "\u3D1A"], /* CJK Ideograph Extension A */
+ ["\u3D1B", "\u3D1B"], /* CJK Ideograph Extension A */
+ ["\u3D1C", "\u3D1C"], /* CJK Ideograph Extension A */
+ ["\u3D1D", "\u3D1D"], /* CJK Ideograph Extension A */
+ ["\u3D1E", "\u3D1E"], /* CJK Ideograph Extension A */
+ ["\u3D1F", "\u3D1F"], /* CJK Ideograph Extension A */
+ ["\u3D20", "\u3D20"], /* CJK Ideograph Extension A */
+ ["\u3D21", "\u3D21"], /* CJK Ideograph Extension A */
+ ["\u3D22", "\u3D22"], /* CJK Ideograph Extension A */
+ ["\u3D23", "\u3D23"], /* CJK Ideograph Extension A */
+ ["\u3D24", "\u3D24"], /* CJK Ideograph Extension A */
+ ["\u3D25", "\u3D25"], /* CJK Ideograph Extension A */
+ ["\u3D26", "\u3D26"], /* CJK Ideograph Extension A */
+ ["\u3D27", "\u3D27"], /* CJK Ideograph Extension A */
+ ["\u3D28", "\u3D28"], /* CJK Ideograph Extension A */
+ ["\u3D29", "\u3D29"], /* CJK Ideograph Extension A */
+ ["\u3D2A", "\u3D2A"], /* CJK Ideograph Extension A */
+ ["\u3D2B", "\u3D2B"], /* CJK Ideograph Extension A */
+ ["\u3D2C", "\u3D2C"], /* CJK Ideograph Extension A */
+ ["\u3D2D", "\u3D2D"], /* CJK Ideograph Extension A */
+ ["\u3D2E", "\u3D2E"], /* CJK Ideograph Extension A */
+ ["\u3D2F", "\u3D2F"], /* CJK Ideograph Extension A */
+ ["\u3D30", "\u3D30"], /* CJK Ideograph Extension A */
+ ["\u3D31", "\u3D31"], /* CJK Ideograph Extension A */
+ ["\u3D32", "\u3D32"], /* CJK Ideograph Extension A */
+ ["\u3D33", "\u3D33"], /* CJK Ideograph Extension A */
+ ["\u3D34", "\u3D34"], /* CJK Ideograph Extension A */
+ ["\u3D35", "\u3D35"], /* CJK Ideograph Extension A */
+ ["\u3D36", "\u3D36"], /* CJK Ideograph Extension A */
+ ["\u3D37", "\u3D37"], /* CJK Ideograph Extension A */
+ ["\u3D38", "\u3D38"], /* CJK Ideograph Extension A */
+ ["\u3D39", "\u3D39"], /* CJK Ideograph Extension A */
+ ["\u3D3A", "\u3D3A"], /* CJK Ideograph Extension A */
+ ["\u3D3B", "\u3D3B"], /* CJK Ideograph Extension A */
+ ["\u3D3C", "\u3D3C"], /* CJK Ideograph Extension A */
+ ["\u3D3D", "\u3D3D"], /* CJK Ideograph Extension A */
+ ["\u3D3E", "\u3D3E"], /* CJK Ideograph Extension A */
+ ["\u3D3F", "\u3D3F"], /* CJK Ideograph Extension A */
+ ["\u3D40", "\u3D40"], /* CJK Ideograph Extension A */
+ ["\u3D41", "\u3D41"], /* CJK Ideograph Extension A */
+ ["\u3D42", "\u3D42"], /* CJK Ideograph Extension A */
+ ["\u3D43", "\u3D43"], /* CJK Ideograph Extension A */
+ ["\u3D44", "\u3D44"], /* CJK Ideograph Extension A */
+ ["\u3D45", "\u3D45"], /* CJK Ideograph Extension A */
+ ["\u3D46", "\u3D46"], /* CJK Ideograph Extension A */
+ ["\u3D47", "\u3D47"], /* CJK Ideograph Extension A */
+ ["\u3D48", "\u3D48"], /* CJK Ideograph Extension A */
+ ["\u3D49", "\u3D49"], /* CJK Ideograph Extension A */
+ ["\u3D4A", "\u3D4A"], /* CJK Ideograph Extension A */
+ ["\u3D4B", "\u3D4B"], /* CJK Ideograph Extension A */
+ ["\u3D4C", "\u3D4C"], /* CJK Ideograph Extension A */
+ ["\u3D4D", "\u3D4D"], /* CJK Ideograph Extension A */
+ ["\u3D4E", "\u3D4E"], /* CJK Ideograph Extension A */
+ ["\u3D4F", "\u3D4F"], /* CJK Ideograph Extension A */
+ ["\u3D50", "\u3D50"], /* CJK Ideograph Extension A */
+ ["\u3D51", "\u3D51"], /* CJK Ideograph Extension A */
+ ["\u3D52", "\u3D52"], /* CJK Ideograph Extension A */
+ ["\u3D53", "\u3D53"], /* CJK Ideograph Extension A */
+ ["\u3D54", "\u3D54"], /* CJK Ideograph Extension A */
+ ["\u3D55", "\u3D55"], /* CJK Ideograph Extension A */
+ ["\u3D56", "\u3D56"], /* CJK Ideograph Extension A */
+ ["\u3D57", "\u3D57"], /* CJK Ideograph Extension A */
+ ["\u3D58", "\u3D58"], /* CJK Ideograph Extension A */
+ ["\u3D59", "\u3D59"], /* CJK Ideograph Extension A */
+ ["\u3D5A", "\u3D5A"], /* CJK Ideograph Extension A */
+ ["\u3D5B", "\u3D5B"], /* CJK Ideograph Extension A */
+ ["\u3D5C", "\u3D5C"], /* CJK Ideograph Extension A */
+ ["\u3D5D", "\u3D5D"], /* CJK Ideograph Extension A */
+ ["\u3D5E", "\u3D5E"], /* CJK Ideograph Extension A */
+ ["\u3D5F", "\u3D5F"], /* CJK Ideograph Extension A */
+ ["\u3D60", "\u3D60"], /* CJK Ideograph Extension A */
+ ["\u3D61", "\u3D61"], /* CJK Ideograph Extension A */
+ ["\u3D62", "\u3D62"], /* CJK Ideograph Extension A */
+ ["\u3D63", "\u3D63"], /* CJK Ideograph Extension A */
+ ["\u3D64", "\u3D64"], /* CJK Ideograph Extension A */
+ ["\u3D65", "\u3D65"], /* CJK Ideograph Extension A */
+ ["\u3D66", "\u3D66"], /* CJK Ideograph Extension A */
+ ["\u3D67", "\u3D67"], /* CJK Ideograph Extension A */
+ ["\u3D68", "\u3D68"], /* CJK Ideograph Extension A */
+ ["\u3D69", "\u3D69"], /* CJK Ideograph Extension A */
+ ["\u3D6A", "\u3D6A"], /* CJK Ideograph Extension A */
+ ["\u3D6B", "\u3D6B"], /* CJK Ideograph Extension A */
+ ["\u3D6C", "\u3D6C"], /* CJK Ideograph Extension A */
+ ["\u3D6D", "\u3D6D"], /* CJK Ideograph Extension A */
+ ["\u3D6E", "\u3D6E"], /* CJK Ideograph Extension A */
+ ["\u3D6F", "\u3D6F"], /* CJK Ideograph Extension A */
+ ["\u3D70", "\u3D70"], /* CJK Ideograph Extension A */
+ ["\u3D71", "\u3D71"], /* CJK Ideograph Extension A */
+ ["\u3D72", "\u3D72"], /* CJK Ideograph Extension A */
+ ["\u3D73", "\u3D73"], /* CJK Ideograph Extension A */
+ ["\u3D74", "\u3D74"], /* CJK Ideograph Extension A */
+ ["\u3D75", "\u3D75"], /* CJK Ideograph Extension A */
+ ["\u3D76", "\u3D76"], /* CJK Ideograph Extension A */
+ ["\u3D77", "\u3D77"], /* CJK Ideograph Extension A */
+ ["\u3D78", "\u3D78"], /* CJK Ideograph Extension A */
+ ["\u3D79", "\u3D79"], /* CJK Ideograph Extension A */
+ ["\u3D7A", "\u3D7A"], /* CJK Ideograph Extension A */
+ ["\u3D7B", "\u3D7B"], /* CJK Ideograph Extension A */
+ ["\u3D7C", "\u3D7C"], /* CJK Ideograph Extension A */
+ ["\u3D7D", "\u3D7D"], /* CJK Ideograph Extension A */
+ ["\u3D7E", "\u3D7E"], /* CJK Ideograph Extension A */
+ ["\u3D7F", "\u3D7F"], /* CJK Ideograph Extension A */
+ ["\u3D80", "\u3D80"], /* CJK Ideograph Extension A */
+ ["\u3D81", "\u3D81"], /* CJK Ideograph Extension A */
+ ["\u3D82", "\u3D82"], /* CJK Ideograph Extension A */
+ ["\u3D83", "\u3D83"], /* CJK Ideograph Extension A */
+ ["\u3D84", "\u3D84"], /* CJK Ideograph Extension A */
+ ["\u3D85", "\u3D85"], /* CJK Ideograph Extension A */
+ ["\u3D86", "\u3D86"], /* CJK Ideograph Extension A */
+ ["\u3D87", "\u3D87"], /* CJK Ideograph Extension A */
+ ["\u3D88", "\u3D88"], /* CJK Ideograph Extension A */
+ ["\u3D89", "\u3D89"], /* CJK Ideograph Extension A */
+ ["\u3D8A", "\u3D8A"], /* CJK Ideograph Extension A */
+ ["\u3D8B", "\u3D8B"], /* CJK Ideograph Extension A */
+ ["\u3D8C", "\u3D8C"], /* CJK Ideograph Extension A */
+ ["\u3D8D", "\u3D8D"], /* CJK Ideograph Extension A */
+ ["\u3D8E", "\u3D8E"], /* CJK Ideograph Extension A */
+ ["\u3D8F", "\u3D8F"], /* CJK Ideograph Extension A */
+ ["\u3D90", "\u3D90"], /* CJK Ideograph Extension A */
+ ["\u3D91", "\u3D91"], /* CJK Ideograph Extension A */
+ ["\u3D92", "\u3D92"], /* CJK Ideograph Extension A */
+ ["\u3D93", "\u3D93"], /* CJK Ideograph Extension A */
+ ["\u3D94", "\u3D94"], /* CJK Ideograph Extension A */
+ ["\u3D95", "\u3D95"], /* CJK Ideograph Extension A */
+ ["\u3D96", "\u3D96"], /* CJK Ideograph Extension A */
+ ["\u3D97", "\u3D97"], /* CJK Ideograph Extension A */
+ ["\u3D98", "\u3D98"], /* CJK Ideograph Extension A */
+ ["\u3D99", "\u3D99"], /* CJK Ideograph Extension A */
+ ["\u3D9A", "\u3D9A"], /* CJK Ideograph Extension A */
+ ["\u3D9B", "\u3D9B"], /* CJK Ideograph Extension A */
+ ["\u3D9C", "\u3D9C"], /* CJK Ideograph Extension A */
+ ["\u3D9D", "\u3D9D"], /* CJK Ideograph Extension A */
+ ["\u3D9E", "\u3D9E"], /* CJK Ideograph Extension A */
+ ["\u3D9F", "\u3D9F"], /* CJK Ideograph Extension A */
+ ["\u3DA0", "\u3DA0"], /* CJK Ideograph Extension A */
+ ["\u3DA1", "\u3DA1"], /* CJK Ideograph Extension A */
+ ["\u3DA2", "\u3DA2"], /* CJK Ideograph Extension A */
+ ["\u3DA3", "\u3DA3"], /* CJK Ideograph Extension A */
+ ["\u3DA4", "\u3DA4"], /* CJK Ideograph Extension A */
+ ["\u3DA5", "\u3DA5"], /* CJK Ideograph Extension A */
+ ["\u3DA6", "\u3DA6"], /* CJK Ideograph Extension A */
+ ["\u3DA7", "\u3DA7"], /* CJK Ideograph Extension A */
+ ["\u3DA8", "\u3DA8"], /* CJK Ideograph Extension A */
+ ["\u3DA9", "\u3DA9"], /* CJK Ideograph Extension A */
+ ["\u3DAA", "\u3DAA"], /* CJK Ideograph Extension A */
+ ["\u3DAB", "\u3DAB"], /* CJK Ideograph Extension A */
+ ["\u3DAC", "\u3DAC"], /* CJK Ideograph Extension A */
+ ["\u3DAD", "\u3DAD"], /* CJK Ideograph Extension A */
+ ["\u3DAE", "\u3DAE"], /* CJK Ideograph Extension A */
+ ["\u3DAF", "\u3DAF"], /* CJK Ideograph Extension A */
+ ["\u3DB0", "\u3DB0"], /* CJK Ideograph Extension A */
+ ["\u3DB1", "\u3DB1"], /* CJK Ideograph Extension A */
+ ["\u3DB2", "\u3DB2"], /* CJK Ideograph Extension A */
+ ["\u3DB3", "\u3DB3"], /* CJK Ideograph Extension A */
+ ["\u3DB4", "\u3DB4"], /* CJK Ideograph Extension A */
+ ["\u3DB5", "\u3DB5"], /* CJK Ideograph Extension A */
+ ["\u3DB6", "\u3DB6"], /* CJK Ideograph Extension A */
+ ["\u3DB7", "\u3DB7"], /* CJK Ideograph Extension A */
+ ["\u3DB8", "\u3DB8"], /* CJK Ideograph Extension A */
+ ["\u3DB9", "\u3DB9"], /* CJK Ideograph Extension A */
+ ["\u3DBA", "\u3DBA"], /* CJK Ideograph Extension A */
+ ["\u3DBB", "\u3DBB"], /* CJK Ideograph Extension A */
+ ["\u3DBC", "\u3DBC"], /* CJK Ideograph Extension A */
+ ["\u3DBD", "\u3DBD"], /* CJK Ideograph Extension A */
+ ["\u3DBE", "\u3DBE"], /* CJK Ideograph Extension A */
+ ["\u3DBF", "\u3DBF"], /* CJK Ideograph Extension A */
+ ["\u3DC0", "\u3DC0"], /* CJK Ideograph Extension A */
+ ["\u3DC1", "\u3DC1"], /* CJK Ideograph Extension A */
+ ["\u3DC2", "\u3DC2"], /* CJK Ideograph Extension A */
+ ["\u3DC3", "\u3DC3"], /* CJK Ideograph Extension A */
+ ["\u3DC4", "\u3DC4"], /* CJK Ideograph Extension A */
+ ["\u3DC5", "\u3DC5"], /* CJK Ideograph Extension A */
+ ["\u3DC6", "\u3DC6"], /* CJK Ideograph Extension A */
+ ["\u3DC7", "\u3DC7"], /* CJK Ideograph Extension A */
+ ["\u3DC8", "\u3DC8"], /* CJK Ideograph Extension A */
+ ["\u3DC9", "\u3DC9"], /* CJK Ideograph Extension A */
+ ["\u3DCA", "\u3DCA"], /* CJK Ideograph Extension A */
+ ["\u3DCB", "\u3DCB"], /* CJK Ideograph Extension A */
+ ["\u3DCC", "\u3DCC"], /* CJK Ideograph Extension A */
+ ["\u3DCD", "\u3DCD"], /* CJK Ideograph Extension A */
+ ["\u3DCE", "\u3DCE"], /* CJK Ideograph Extension A */
+ ["\u3DCF", "\u3DCF"], /* CJK Ideograph Extension A */
+ ["\u3DD0", "\u3DD0"], /* CJK Ideograph Extension A */
+ ["\u3DD1", "\u3DD1"], /* CJK Ideograph Extension A */
+ ["\u3DD2", "\u3DD2"], /* CJK Ideograph Extension A */
+ ["\u3DD3", "\u3DD3"], /* CJK Ideograph Extension A */
+ ["\u3DD4", "\u3DD4"], /* CJK Ideograph Extension A */
+ ["\u3DD5", "\u3DD5"], /* CJK Ideograph Extension A */
+ ["\u3DD6", "\u3DD6"], /* CJK Ideograph Extension A */
+ ["\u3DD7", "\u3DD7"], /* CJK Ideograph Extension A */
+ ["\u3DD8", "\u3DD8"], /* CJK Ideograph Extension A */
+ ["\u3DD9", "\u3DD9"], /* CJK Ideograph Extension A */
+ ["\u3DDA", "\u3DDA"], /* CJK Ideograph Extension A */
+ ["\u3DDB", "\u3DDB"], /* CJK Ideograph Extension A */
+ ["\u3DDC", "\u3DDC"], /* CJK Ideograph Extension A */
+ ["\u3DDD", "\u3DDD"], /* CJK Ideograph Extension A */
+ ["\u3DDE", "\u3DDE"], /* CJK Ideograph Extension A */
+ ["\u3DDF", "\u3DDF"], /* CJK Ideograph Extension A */
+ ["\u3DE0", "\u3DE0"], /* CJK Ideograph Extension A */
+ ["\u3DE1", "\u3DE1"], /* CJK Ideograph Extension A */
+ ["\u3DE2", "\u3DE2"], /* CJK Ideograph Extension A */
+ ["\u3DE3", "\u3DE3"], /* CJK Ideograph Extension A */
+ ["\u3DE4", "\u3DE4"], /* CJK Ideograph Extension A */
+ ["\u3DE5", "\u3DE5"], /* CJK Ideograph Extension A */
+ ["\u3DE6", "\u3DE6"], /* CJK Ideograph Extension A */
+ ["\u3DE7", "\u3DE7"], /* CJK Ideograph Extension A */
+ ["\u3DE8", "\u3DE8"], /* CJK Ideograph Extension A */
+ ["\u3DE9", "\u3DE9"], /* CJK Ideograph Extension A */
+ ["\u3DEA", "\u3DEA"], /* CJK Ideograph Extension A */
+ ["\u3DEB", "\u3DEB"], /* CJK Ideograph Extension A */
+ ["\u3DEC", "\u3DEC"], /* CJK Ideograph Extension A */
+ ["\u3DED", "\u3DED"], /* CJK Ideograph Extension A */
+ ["\u3DEE", "\u3DEE"], /* CJK Ideograph Extension A */
+ ["\u3DEF", "\u3DEF"], /* CJK Ideograph Extension A */
+ ["\u3DF0", "\u3DF0"], /* CJK Ideograph Extension A */
+ ["\u3DF1", "\u3DF1"], /* CJK Ideograph Extension A */
+ ["\u3DF2", "\u3DF2"], /* CJK Ideograph Extension A */
+ ["\u3DF3", "\u3DF3"], /* CJK Ideograph Extension A */
+ ["\u3DF4", "\u3DF4"], /* CJK Ideograph Extension A */
+ ["\u3DF5", "\u3DF5"], /* CJK Ideograph Extension A */
+ ["\u3DF6", "\u3DF6"], /* CJK Ideograph Extension A */
+ ["\u3DF7", "\u3DF7"], /* CJK Ideograph Extension A */
+ ["\u3DF8", "\u3DF8"], /* CJK Ideograph Extension A */
+ ["\u3DF9", "\u3DF9"], /* CJK Ideograph Extension A */
+ ["\u3DFA", "\u3DFA"], /* CJK Ideograph Extension A */
+ ["\u3DFB", "\u3DFB"], /* CJK Ideograph Extension A */
+ ["\u3DFC", "\u3DFC"], /* CJK Ideograph Extension A */
+ ["\u3DFD", "\u3DFD"], /* CJK Ideograph Extension A */
+ ["\u3DFE", "\u3DFE"], /* CJK Ideograph Extension A */
+ ["\u3DFF", "\u3DFF"], /* CJK Ideograph Extension A */
+ ["\u3E00", "\u3E00"], /* CJK Ideograph Extension A */
+ ["\u3E01", "\u3E01"], /* CJK Ideograph Extension A */
+ ["\u3E02", "\u3E02"], /* CJK Ideograph Extension A */
+ ["\u3E03", "\u3E03"], /* CJK Ideograph Extension A */
+ ["\u3E04", "\u3E04"], /* CJK Ideograph Extension A */
+ ["\u3E05", "\u3E05"], /* CJK Ideograph Extension A */
+ ["\u3E06", "\u3E06"], /* CJK Ideograph Extension A */
+ ["\u3E07", "\u3E07"], /* CJK Ideograph Extension A */
+ ["\u3E08", "\u3E08"], /* CJK Ideograph Extension A */
+ ["\u3E09", "\u3E09"], /* CJK Ideograph Extension A */
+ ["\u3E0A", "\u3E0A"], /* CJK Ideograph Extension A */
+ ["\u3E0B", "\u3E0B"], /* CJK Ideograph Extension A */
+ ["\u3E0C", "\u3E0C"], /* CJK Ideograph Extension A */
+ ["\u3E0D", "\u3E0D"], /* CJK Ideograph Extension A */
+ ["\u3E0E", "\u3E0E"], /* CJK Ideograph Extension A */
+ ["\u3E0F", "\u3E0F"], /* CJK Ideograph Extension A */
+ ["\u3E10", "\u3E10"], /* CJK Ideograph Extension A */
+ ["\u3E11", "\u3E11"], /* CJK Ideograph Extension A */
+ ["\u3E12", "\u3E12"], /* CJK Ideograph Extension A */
+ ["\u3E13", "\u3E13"], /* CJK Ideograph Extension A */
+ ["\u3E14", "\u3E14"], /* CJK Ideograph Extension A */
+ ["\u3E15", "\u3E15"], /* CJK Ideograph Extension A */
+ ["\u3E16", "\u3E16"], /* CJK Ideograph Extension A */
+ ["\u3E17", "\u3E17"], /* CJK Ideograph Extension A */
+ ["\u3E18", "\u3E18"], /* CJK Ideograph Extension A */
+ ["\u3E19", "\u3E19"], /* CJK Ideograph Extension A */
+ ["\u3E1A", "\u3E1A"], /* CJK Ideograph Extension A */
+ ["\u3E1B", "\u3E1B"], /* CJK Ideograph Extension A */
+ ["\u3E1C", "\u3E1C"], /* CJK Ideograph Extension A */
+ ["\u3E1D", "\u3E1D"], /* CJK Ideograph Extension A */
+ ["\u3E1E", "\u3E1E"], /* CJK Ideograph Extension A */
+ ["\u3E1F", "\u3E1F"], /* CJK Ideograph Extension A */
+ ["\u3E20", "\u3E20"], /* CJK Ideograph Extension A */
+ ["\u3E21", "\u3E21"], /* CJK Ideograph Extension A */
+ ["\u3E22", "\u3E22"], /* CJK Ideograph Extension A */
+ ["\u3E23", "\u3E23"], /* CJK Ideograph Extension A */
+ ["\u3E24", "\u3E24"], /* CJK Ideograph Extension A */
+ ["\u3E25", "\u3E25"], /* CJK Ideograph Extension A */
+ ["\u3E26", "\u3E26"], /* CJK Ideograph Extension A */
+ ["\u3E27", "\u3E27"], /* CJK Ideograph Extension A */
+ ["\u3E28", "\u3E28"], /* CJK Ideograph Extension A */
+ ["\u3E29", "\u3E29"], /* CJK Ideograph Extension A */
+ ["\u3E2A", "\u3E2A"], /* CJK Ideograph Extension A */
+ ["\u3E2B", "\u3E2B"], /* CJK Ideograph Extension A */
+ ["\u3E2C", "\u3E2C"], /* CJK Ideograph Extension A */
+ ["\u3E2D", "\u3E2D"], /* CJK Ideograph Extension A */
+ ["\u3E2E", "\u3E2E"], /* CJK Ideograph Extension A */
+ ["\u3E2F", "\u3E2F"], /* CJK Ideograph Extension A */
+ ["\u3E30", "\u3E30"], /* CJK Ideograph Extension A */
+ ["\u3E31", "\u3E31"], /* CJK Ideograph Extension A */
+ ["\u3E32", "\u3E32"], /* CJK Ideograph Extension A */
+ ["\u3E33", "\u3E33"], /* CJK Ideograph Extension A */
+ ["\u3E34", "\u3E34"], /* CJK Ideograph Extension A */
+ ["\u3E35", "\u3E35"], /* CJK Ideograph Extension A */
+ ["\u3E36", "\u3E36"], /* CJK Ideograph Extension A */
+ ["\u3E37", "\u3E37"], /* CJK Ideograph Extension A */
+ ["\u3E38", "\u3E38"], /* CJK Ideograph Extension A */
+ ["\u3E39", "\u3E39"], /* CJK Ideograph Extension A */
+ ["\u3E3A", "\u3E3A"], /* CJK Ideograph Extension A */
+ ["\u3E3B", "\u3E3B"], /* CJK Ideograph Extension A */
+ ["\u3E3C", "\u3E3C"], /* CJK Ideograph Extension A */
+ ["\u3E3D", "\u3E3D"], /* CJK Ideograph Extension A */
+ ["\u3E3E", "\u3E3E"], /* CJK Ideograph Extension A */
+ ["\u3E3F", "\u3E3F"], /* CJK Ideograph Extension A */
+ ["\u3E40", "\u3E40"], /* CJK Ideograph Extension A */
+ ["\u3E41", "\u3E41"], /* CJK Ideograph Extension A */
+ ["\u3E42", "\u3E42"], /* CJK Ideograph Extension A */
+ ["\u3E43", "\u3E43"], /* CJK Ideograph Extension A */
+ ["\u3E44", "\u3E44"], /* CJK Ideograph Extension A */
+ ["\u3E45", "\u3E45"], /* CJK Ideograph Extension A */
+ ["\u3E46", "\u3E46"], /* CJK Ideograph Extension A */
+ ["\u3E47", "\u3E47"], /* CJK Ideograph Extension A */
+ ["\u3E48", "\u3E48"], /* CJK Ideograph Extension A */
+ ["\u3E49", "\u3E49"], /* CJK Ideograph Extension A */
+ ["\u3E4A", "\u3E4A"], /* CJK Ideograph Extension A */
+ ["\u3E4B", "\u3E4B"], /* CJK Ideograph Extension A */
+ ["\u3E4C", "\u3E4C"], /* CJK Ideograph Extension A */
+ ["\u3E4D", "\u3E4D"], /* CJK Ideograph Extension A */
+ ["\u3E4E", "\u3E4E"], /* CJK Ideograph Extension A */
+ ["\u3E4F", "\u3E4F"], /* CJK Ideograph Extension A */
+ ["\u3E50", "\u3E50"], /* CJK Ideograph Extension A */
+ ["\u3E51", "\u3E51"], /* CJK Ideograph Extension A */
+ ["\u3E52", "\u3E52"], /* CJK Ideograph Extension A */
+ ["\u3E53", "\u3E53"], /* CJK Ideograph Extension A */
+ ["\u3E54", "\u3E54"], /* CJK Ideograph Extension A */
+ ["\u3E55", "\u3E55"], /* CJK Ideograph Extension A */
+ ["\u3E56", "\u3E56"], /* CJK Ideograph Extension A */
+ ["\u3E57", "\u3E57"], /* CJK Ideograph Extension A */
+ ["\u3E58", "\u3E58"], /* CJK Ideograph Extension A */
+ ["\u3E59", "\u3E59"], /* CJK Ideograph Extension A */
+ ["\u3E5A", "\u3E5A"], /* CJK Ideograph Extension A */
+ ["\u3E5B", "\u3E5B"], /* CJK Ideograph Extension A */
+ ["\u3E5C", "\u3E5C"], /* CJK Ideograph Extension A */
+ ["\u3E5D", "\u3E5D"], /* CJK Ideograph Extension A */
+ ["\u3E5E", "\u3E5E"], /* CJK Ideograph Extension A */
+ ["\u3E5F", "\u3E5F"], /* CJK Ideograph Extension A */
+ ["\u3E60", "\u3E60"], /* CJK Ideograph Extension A */
+ ["\u3E61", "\u3E61"], /* CJK Ideograph Extension A */
+ ["\u3E62", "\u3E62"], /* CJK Ideograph Extension A */
+ ["\u3E63", "\u3E63"], /* CJK Ideograph Extension A */
+ ["\u3E64", "\u3E64"], /* CJK Ideograph Extension A */
+ ["\u3E65", "\u3E65"], /* CJK Ideograph Extension A */
+ ["\u3E66", "\u3E66"], /* CJK Ideograph Extension A */
+ ["\u3E67", "\u3E67"], /* CJK Ideograph Extension A */
+ ["\u3E68", "\u3E68"], /* CJK Ideograph Extension A */
+ ["\u3E69", "\u3E69"], /* CJK Ideograph Extension A */
+ ["\u3E6A", "\u3E6A"], /* CJK Ideograph Extension A */
+ ["\u3E6B", "\u3E6B"], /* CJK Ideograph Extension A */
+ ["\u3E6C", "\u3E6C"], /* CJK Ideograph Extension A */
+ ["\u3E6D", "\u3E6D"], /* CJK Ideograph Extension A */
+ ["\u3E6E", "\u3E6E"], /* CJK Ideograph Extension A */
+ ["\u3E6F", "\u3E6F"], /* CJK Ideograph Extension A */
+ ["\u3E70", "\u3E70"], /* CJK Ideograph Extension A */
+ ["\u3E71", "\u3E71"], /* CJK Ideograph Extension A */
+ ["\u3E72", "\u3E72"], /* CJK Ideograph Extension A */
+ ["\u3E73", "\u3E73"], /* CJK Ideograph Extension A */
+ ["\u3E74", "\u3E74"], /* CJK Ideograph Extension A */
+ ["\u3E75", "\u3E75"], /* CJK Ideograph Extension A */
+ ["\u3E76", "\u3E76"], /* CJK Ideograph Extension A */
+ ["\u3E77", "\u3E77"], /* CJK Ideograph Extension A */
+ ["\u3E78", "\u3E78"], /* CJK Ideograph Extension A */
+ ["\u3E79", "\u3E79"], /* CJK Ideograph Extension A */
+ ["\u3E7A", "\u3E7A"], /* CJK Ideograph Extension A */
+ ["\u3E7B", "\u3E7B"], /* CJK Ideograph Extension A */
+ ["\u3E7C", "\u3E7C"], /* CJK Ideograph Extension A */
+ ["\u3E7D", "\u3E7D"], /* CJK Ideograph Extension A */
+ ["\u3E7E", "\u3E7E"], /* CJK Ideograph Extension A */
+ ["\u3E7F", "\u3E7F"], /* CJK Ideograph Extension A */
+ ["\u3E80", "\u3E80"], /* CJK Ideograph Extension A */
+ ["\u3E81", "\u3E81"], /* CJK Ideograph Extension A */
+ ["\u3E82", "\u3E82"], /* CJK Ideograph Extension A */
+ ["\u3E83", "\u3E83"], /* CJK Ideograph Extension A */
+ ["\u3E84", "\u3E84"], /* CJK Ideograph Extension A */
+ ["\u3E85", "\u3E85"], /* CJK Ideograph Extension A */
+ ["\u3E86", "\u3E86"], /* CJK Ideograph Extension A */
+ ["\u3E87", "\u3E87"], /* CJK Ideograph Extension A */
+ ["\u3E88", "\u3E88"], /* CJK Ideograph Extension A */
+ ["\u3E89", "\u3E89"], /* CJK Ideograph Extension A */
+ ["\u3E8A", "\u3E8A"], /* CJK Ideograph Extension A */
+ ["\u3E8B", "\u3E8B"], /* CJK Ideograph Extension A */
+ ["\u3E8C", "\u3E8C"], /* CJK Ideograph Extension A */
+ ["\u3E8D", "\u3E8D"], /* CJK Ideograph Extension A */
+ ["\u3E8E", "\u3E8E"], /* CJK Ideograph Extension A */
+ ["\u3E8F", "\u3E8F"], /* CJK Ideograph Extension A */
+ ["\u3E90", "\u3E90"], /* CJK Ideograph Extension A */
+ ["\u3E91", "\u3E91"], /* CJK Ideograph Extension A */
+ ["\u3E92", "\u3E92"], /* CJK Ideograph Extension A */
+ ["\u3E93", "\u3E93"], /* CJK Ideograph Extension A */
+ ["\u3E94", "\u3E94"], /* CJK Ideograph Extension A */
+ ["\u3E95", "\u3E95"], /* CJK Ideograph Extension A */
+ ["\u3E96", "\u3E96"], /* CJK Ideograph Extension A */
+ ["\u3E97", "\u3E97"], /* CJK Ideograph Extension A */
+ ["\u3E98", "\u3E98"], /* CJK Ideograph Extension A */
+ ["\u3E99", "\u3E99"], /* CJK Ideograph Extension A */
+ ["\u3E9A", "\u3E9A"], /* CJK Ideograph Extension A */
+ ["\u3E9B", "\u3E9B"], /* CJK Ideograph Extension A */
+ ["\u3E9C", "\u3E9C"], /* CJK Ideograph Extension A */
+ ["\u3E9D", "\u3E9D"], /* CJK Ideograph Extension A */
+ ["\u3E9E", "\u3E9E"], /* CJK Ideograph Extension A */
+ ["\u3E9F", "\u3E9F"], /* CJK Ideograph Extension A */
+ ["\u3EA0", "\u3EA0"], /* CJK Ideograph Extension A */
+ ["\u3EA1", "\u3EA1"], /* CJK Ideograph Extension A */
+ ["\u3EA2", "\u3EA2"], /* CJK Ideograph Extension A */
+ ["\u3EA3", "\u3EA3"], /* CJK Ideograph Extension A */
+ ["\u3EA4", "\u3EA4"], /* CJK Ideograph Extension A */
+ ["\u3EA5", "\u3EA5"], /* CJK Ideograph Extension A */
+ ["\u3EA6", "\u3EA6"], /* CJK Ideograph Extension A */
+ ["\u3EA7", "\u3EA7"], /* CJK Ideograph Extension A */
+ ["\u3EA8", "\u3EA8"], /* CJK Ideograph Extension A */
+ ["\u3EA9", "\u3EA9"], /* CJK Ideograph Extension A */
+ ["\u3EAA", "\u3EAA"], /* CJK Ideograph Extension A */
+ ["\u3EAB", "\u3EAB"], /* CJK Ideograph Extension A */
+ ["\u3EAC", "\u3EAC"], /* CJK Ideograph Extension A */
+ ["\u3EAD", "\u3EAD"], /* CJK Ideograph Extension A */
+ ["\u3EAE", "\u3EAE"], /* CJK Ideograph Extension A */
+ ["\u3EAF", "\u3EAF"], /* CJK Ideograph Extension A */
+ ["\u3EB0", "\u3EB0"], /* CJK Ideograph Extension A */
+ ["\u3EB1", "\u3EB1"], /* CJK Ideograph Extension A */
+ ["\u3EB2", "\u3EB2"], /* CJK Ideograph Extension A */
+ ["\u3EB3", "\u3EB3"], /* CJK Ideograph Extension A */
+ ["\u3EB4", "\u3EB4"], /* CJK Ideograph Extension A */
+ ["\u3EB5", "\u3EB5"], /* CJK Ideograph Extension A */
+ ["\u3EB6", "\u3EB6"], /* CJK Ideograph Extension A */
+ ["\u3EB7", "\u3EB7"], /* CJK Ideograph Extension A */
+ ["\u3EB8", "\u3EB8"], /* CJK Ideograph Extension A */
+ ["\u3EB9", "\u3EB9"], /* CJK Ideograph Extension A */
+ ["\u3EBA", "\u3EBA"], /* CJK Ideograph Extension A */
+ ["\u3EBB", "\u3EBB"], /* CJK Ideograph Extension A */
+ ["\u3EBC", "\u3EBC"], /* CJK Ideograph Extension A */
+ ["\u3EBD", "\u3EBD"], /* CJK Ideograph Extension A */
+ ["\u3EBE", "\u3EBE"], /* CJK Ideograph Extension A */
+ ["\u3EBF", "\u3EBF"], /* CJK Ideograph Extension A */
+ ["\u3EC0", "\u3EC0"], /* CJK Ideograph Extension A */
+ ["\u3EC1", "\u3EC1"], /* CJK Ideograph Extension A */
+ ["\u3EC2", "\u3EC2"], /* CJK Ideograph Extension A */
+ ["\u3EC3", "\u3EC3"], /* CJK Ideograph Extension A */
+ ["\u3EC4", "\u3EC4"], /* CJK Ideograph Extension A */
+ ["\u3EC5", "\u3EC5"], /* CJK Ideograph Extension A */
+ ["\u3EC6", "\u3EC6"], /* CJK Ideograph Extension A */
+ ["\u3EC7", "\u3EC7"], /* CJK Ideograph Extension A */
+ ["\u3EC8", "\u3EC8"], /* CJK Ideograph Extension A */
+ ["\u3EC9", "\u3EC9"], /* CJK Ideograph Extension A */
+ ["\u3ECA", "\u3ECA"], /* CJK Ideograph Extension A */
+ ["\u3ECB", "\u3ECB"], /* CJK Ideograph Extension A */
+ ["\u3ECC", "\u3ECC"], /* CJK Ideograph Extension A */
+ ["\u3ECD", "\u3ECD"], /* CJK Ideograph Extension A */
+ ["\u3ECE", "\u3ECE"], /* CJK Ideograph Extension A */
+ ["\u3ECF", "\u3ECF"], /* CJK Ideograph Extension A */
+ ["\u3ED0", "\u3ED0"], /* CJK Ideograph Extension A */
+ ["\u3ED1", "\u3ED1"], /* CJK Ideograph Extension A */
+ ["\u3ED2", "\u3ED2"], /* CJK Ideograph Extension A */
+ ["\u3ED3", "\u3ED3"], /* CJK Ideograph Extension A */
+ ["\u3ED4", "\u3ED4"], /* CJK Ideograph Extension A */
+ ["\u3ED5", "\u3ED5"], /* CJK Ideograph Extension A */
+ ["\u3ED6", "\u3ED6"], /* CJK Ideograph Extension A */
+ ["\u3ED7", "\u3ED7"], /* CJK Ideograph Extension A */
+ ["\u3ED8", "\u3ED8"], /* CJK Ideograph Extension A */
+ ["\u3ED9", "\u3ED9"], /* CJK Ideograph Extension A */
+ ["\u3EDA", "\u3EDA"], /* CJK Ideograph Extension A */
+ ["\u3EDB", "\u3EDB"], /* CJK Ideograph Extension A */
+ ["\u3EDC", "\u3EDC"], /* CJK Ideograph Extension A */
+ ["\u3EDD", "\u3EDD"], /* CJK Ideograph Extension A */
+ ["\u3EDE", "\u3EDE"], /* CJK Ideograph Extension A */
+ ["\u3EDF", "\u3EDF"], /* CJK Ideograph Extension A */
+ ["\u3EE0", "\u3EE0"], /* CJK Ideograph Extension A */
+ ["\u3EE1", "\u3EE1"], /* CJK Ideograph Extension A */
+ ["\u3EE2", "\u3EE2"], /* CJK Ideograph Extension A */
+ ["\u3EE3", "\u3EE3"], /* CJK Ideograph Extension A */
+ ["\u3EE4", "\u3EE4"], /* CJK Ideograph Extension A */
+ ["\u3EE5", "\u3EE5"], /* CJK Ideograph Extension A */
+ ["\u3EE6", "\u3EE6"], /* CJK Ideograph Extension A */
+ ["\u3EE7", "\u3EE7"], /* CJK Ideograph Extension A */
+ ["\u3EE8", "\u3EE8"], /* CJK Ideograph Extension A */
+ ["\u3EE9", "\u3EE9"], /* CJK Ideograph Extension A */
+ ["\u3EEA", "\u3EEA"], /* CJK Ideograph Extension A */
+ ["\u3EEB", "\u3EEB"], /* CJK Ideograph Extension A */
+ ["\u3EEC", "\u3EEC"], /* CJK Ideograph Extension A */
+ ["\u3EED", "\u3EED"], /* CJK Ideograph Extension A */
+ ["\u3EEE", "\u3EEE"], /* CJK Ideograph Extension A */
+ ["\u3EEF", "\u3EEF"], /* CJK Ideograph Extension A */
+ ["\u3EF0", "\u3EF0"], /* CJK Ideograph Extension A */
+ ["\u3EF1", "\u3EF1"], /* CJK Ideograph Extension A */
+ ["\u3EF2", "\u3EF2"], /* CJK Ideograph Extension A */
+ ["\u3EF3", "\u3EF3"], /* CJK Ideograph Extension A */
+ ["\u3EF4", "\u3EF4"], /* CJK Ideograph Extension A */
+ ["\u3EF5", "\u3EF5"], /* CJK Ideograph Extension A */
+ ["\u3EF6", "\u3EF6"], /* CJK Ideograph Extension A */
+ ["\u3EF7", "\u3EF7"], /* CJK Ideograph Extension A */
+ ["\u3EF8", "\u3EF8"], /* CJK Ideograph Extension A */
+ ["\u3EF9", "\u3EF9"], /* CJK Ideograph Extension A */
+ ["\u3EFA", "\u3EFA"], /* CJK Ideograph Extension A */
+ ["\u3EFB", "\u3EFB"], /* CJK Ideograph Extension A */
+ ["\u3EFC", "\u3EFC"], /* CJK Ideograph Extension A */
+ ["\u3EFD", "\u3EFD"], /* CJK Ideograph Extension A */
+ ["\u3EFE", "\u3EFE"], /* CJK Ideograph Extension A */
+ ["\u3EFF", "\u3EFF"], /* CJK Ideograph Extension A */
+ ["\u3F00", "\u3F00"], /* CJK Ideograph Extension A */
+ ["\u3F01", "\u3F01"], /* CJK Ideograph Extension A */
+ ["\u3F02", "\u3F02"], /* CJK Ideograph Extension A */
+ ["\u3F03", "\u3F03"], /* CJK Ideograph Extension A */
+ ["\u3F04", "\u3F04"], /* CJK Ideograph Extension A */
+ ["\u3F05", "\u3F05"], /* CJK Ideograph Extension A */
+ ["\u3F06", "\u3F06"], /* CJK Ideograph Extension A */
+ ["\u3F07", "\u3F07"], /* CJK Ideograph Extension A */
+ ["\u3F08", "\u3F08"], /* CJK Ideograph Extension A */
+ ["\u3F09", "\u3F09"], /* CJK Ideograph Extension A */
+ ["\u3F0A", "\u3F0A"], /* CJK Ideograph Extension A */
+ ["\u3F0B", "\u3F0B"], /* CJK Ideograph Extension A */
+ ["\u3F0C", "\u3F0C"], /* CJK Ideograph Extension A */
+ ["\u3F0D", "\u3F0D"], /* CJK Ideograph Extension A */
+ ["\u3F0E", "\u3F0E"], /* CJK Ideograph Extension A */
+ ["\u3F0F", "\u3F0F"], /* CJK Ideograph Extension A */
+ ["\u3F10", "\u3F10"], /* CJK Ideograph Extension A */
+ ["\u3F11", "\u3F11"], /* CJK Ideograph Extension A */
+ ["\u3F12", "\u3F12"], /* CJK Ideograph Extension A */
+ ["\u3F13", "\u3F13"], /* CJK Ideograph Extension A */
+ ["\u3F14", "\u3F14"], /* CJK Ideograph Extension A */
+ ["\u3F15", "\u3F15"], /* CJK Ideograph Extension A */
+ ["\u3F16", "\u3F16"], /* CJK Ideograph Extension A */
+ ["\u3F17", "\u3F17"], /* CJK Ideograph Extension A */
+ ["\u3F18", "\u3F18"], /* CJK Ideograph Extension A */
+ ["\u3F19", "\u3F19"], /* CJK Ideograph Extension A */
+ ["\u3F1A", "\u3F1A"], /* CJK Ideograph Extension A */
+ ["\u3F1B", "\u3F1B"], /* CJK Ideograph Extension A */
+ ["\u3F1C", "\u3F1C"], /* CJK Ideograph Extension A */
+ ["\u3F1D", "\u3F1D"], /* CJK Ideograph Extension A */
+ ["\u3F1E", "\u3F1E"], /* CJK Ideograph Extension A */
+ ["\u3F1F", "\u3F1F"], /* CJK Ideograph Extension A */
+ ["\u3F20", "\u3F20"], /* CJK Ideograph Extension A */
+ ["\u3F21", "\u3F21"], /* CJK Ideograph Extension A */
+ ["\u3F22", "\u3F22"], /* CJK Ideograph Extension A */
+ ["\u3F23", "\u3F23"], /* CJK Ideograph Extension A */
+ ["\u3F24", "\u3F24"], /* CJK Ideograph Extension A */
+ ["\u3F25", "\u3F25"], /* CJK Ideograph Extension A */
+ ["\u3F26", "\u3F26"], /* CJK Ideograph Extension A */
+ ["\u3F27", "\u3F27"], /* CJK Ideograph Extension A */
+ ["\u3F28", "\u3F28"], /* CJK Ideograph Extension A */
+ ["\u3F29", "\u3F29"], /* CJK Ideograph Extension A */
+ ["\u3F2A", "\u3F2A"], /* CJK Ideograph Extension A */
+ ["\u3F2B", "\u3F2B"], /* CJK Ideograph Extension A */
+ ["\u3F2C", "\u3F2C"], /* CJK Ideograph Extension A */
+ ["\u3F2D", "\u3F2D"], /* CJK Ideograph Extension A */
+ ["\u3F2E", "\u3F2E"], /* CJK Ideograph Extension A */
+ ["\u3F2F", "\u3F2F"], /* CJK Ideograph Extension A */
+ ["\u3F30", "\u3F30"], /* CJK Ideograph Extension A */
+ ["\u3F31", "\u3F31"], /* CJK Ideograph Extension A */
+ ["\u3F32", "\u3F32"], /* CJK Ideograph Extension A */
+ ["\u3F33", "\u3F33"], /* CJK Ideograph Extension A */
+ ["\u3F34", "\u3F34"], /* CJK Ideograph Extension A */
+ ["\u3F35", "\u3F35"], /* CJK Ideograph Extension A */
+ ["\u3F36", "\u3F36"], /* CJK Ideograph Extension A */
+ ["\u3F37", "\u3F37"], /* CJK Ideograph Extension A */
+ ["\u3F38", "\u3F38"], /* CJK Ideograph Extension A */
+ ["\u3F39", "\u3F39"], /* CJK Ideograph Extension A */
+ ["\u3F3A", "\u3F3A"], /* CJK Ideograph Extension A */
+ ["\u3F3B", "\u3F3B"], /* CJK Ideograph Extension A */
+ ["\u3F3C", "\u3F3C"], /* CJK Ideograph Extension A */
+ ["\u3F3D", "\u3F3D"], /* CJK Ideograph Extension A */
+ ["\u3F3E", "\u3F3E"], /* CJK Ideograph Extension A */
+ ["\u3F3F", "\u3F3F"], /* CJK Ideograph Extension A */
+ ["\u3F40", "\u3F40"], /* CJK Ideograph Extension A */
+ ["\u3F41", "\u3F41"], /* CJK Ideograph Extension A */
+ ["\u3F42", "\u3F42"], /* CJK Ideograph Extension A */
+ ["\u3F43", "\u3F43"], /* CJK Ideograph Extension A */
+ ["\u3F44", "\u3F44"], /* CJK Ideograph Extension A */
+ ["\u3F45", "\u3F45"], /* CJK Ideograph Extension A */
+ ["\u3F46", "\u3F46"], /* CJK Ideograph Extension A */
+ ["\u3F47", "\u3F47"], /* CJK Ideograph Extension A */
+ ["\u3F48", "\u3F48"], /* CJK Ideograph Extension A */
+ ["\u3F49", "\u3F49"], /* CJK Ideograph Extension A */
+ ["\u3F4A", "\u3F4A"], /* CJK Ideograph Extension A */
+ ["\u3F4B", "\u3F4B"], /* CJK Ideograph Extension A */
+ ["\u3F4C", "\u3F4C"], /* CJK Ideograph Extension A */
+ ["\u3F4D", "\u3F4D"], /* CJK Ideograph Extension A */
+ ["\u3F4E", "\u3F4E"], /* CJK Ideograph Extension A */
+ ["\u3F4F", "\u3F4F"], /* CJK Ideograph Extension A */
+ ["\u3F50", "\u3F50"], /* CJK Ideograph Extension A */
+ ["\u3F51", "\u3F51"], /* CJK Ideograph Extension A */
+ ["\u3F52", "\u3F52"], /* CJK Ideograph Extension A */
+ ["\u3F53", "\u3F53"], /* CJK Ideograph Extension A */
+ ["\u3F54", "\u3F54"], /* CJK Ideograph Extension A */
+ ["\u3F55", "\u3F55"], /* CJK Ideograph Extension A */
+ ["\u3F56", "\u3F56"], /* CJK Ideograph Extension A */
+ ["\u3F57", "\u3F57"], /* CJK Ideograph Extension A */
+ ["\u3F58", "\u3F58"], /* CJK Ideograph Extension A */
+ ["\u3F59", "\u3F59"], /* CJK Ideograph Extension A */
+ ["\u3F5A", "\u3F5A"], /* CJK Ideograph Extension A */
+ ["\u3F5B", "\u3F5B"], /* CJK Ideograph Extension A */
+ ["\u3F5C", "\u3F5C"], /* CJK Ideograph Extension A */
+ ["\u3F5D", "\u3F5D"], /* CJK Ideograph Extension A */
+ ["\u3F5E", "\u3F5E"], /* CJK Ideograph Extension A */
+ ["\u3F5F", "\u3F5F"], /* CJK Ideograph Extension A */
+ ["\u3F60", "\u3F60"], /* CJK Ideograph Extension A */
+ ["\u3F61", "\u3F61"], /* CJK Ideograph Extension A */
+ ["\u3F62", "\u3F62"], /* CJK Ideograph Extension A */
+ ["\u3F63", "\u3F63"], /* CJK Ideograph Extension A */
+ ["\u3F64", "\u3F64"], /* CJK Ideograph Extension A */
+ ["\u3F65", "\u3F65"], /* CJK Ideograph Extension A */
+ ["\u3F66", "\u3F66"], /* CJK Ideograph Extension A */
+ ["\u3F67", "\u3F67"], /* CJK Ideograph Extension A */
+ ["\u3F68", "\u3F68"], /* CJK Ideograph Extension A */
+ ["\u3F69", "\u3F69"], /* CJK Ideograph Extension A */
+ ["\u3F6A", "\u3F6A"], /* CJK Ideograph Extension A */
+ ["\u3F6B", "\u3F6B"], /* CJK Ideograph Extension A */
+ ["\u3F6C", "\u3F6C"], /* CJK Ideograph Extension A */
+ ["\u3F6D", "\u3F6D"], /* CJK Ideograph Extension A */
+ ["\u3F6E", "\u3F6E"], /* CJK Ideograph Extension A */
+ ["\u3F6F", "\u3F6F"], /* CJK Ideograph Extension A */
+ ["\u3F70", "\u3F70"], /* CJK Ideograph Extension A */
+ ["\u3F71", "\u3F71"], /* CJK Ideograph Extension A */
+ ["\u3F72", "\u3F72"], /* CJK Ideograph Extension A */
+ ["\u3F73", "\u3F73"], /* CJK Ideograph Extension A */
+ ["\u3F74", "\u3F74"], /* CJK Ideograph Extension A */
+ ["\u3F75", "\u3F75"], /* CJK Ideograph Extension A */
+ ["\u3F76", "\u3F76"], /* CJK Ideograph Extension A */
+ ["\u3F77", "\u3F77"], /* CJK Ideograph Extension A */
+ ["\u3F78", "\u3F78"], /* CJK Ideograph Extension A */
+ ["\u3F79", "\u3F79"], /* CJK Ideograph Extension A */
+ ["\u3F7A", "\u3F7A"], /* CJK Ideograph Extension A */
+ ["\u3F7B", "\u3F7B"], /* CJK Ideograph Extension A */
+ ["\u3F7C", "\u3F7C"], /* CJK Ideograph Extension A */
+ ["\u3F7D", "\u3F7D"], /* CJK Ideograph Extension A */
+ ["\u3F7E", "\u3F7E"], /* CJK Ideograph Extension A */
+ ["\u3F7F", "\u3F7F"], /* CJK Ideograph Extension A */
+ ["\u3F80", "\u3F80"], /* CJK Ideograph Extension A */
+ ["\u3F81", "\u3F81"], /* CJK Ideograph Extension A */
+ ["\u3F82", "\u3F82"], /* CJK Ideograph Extension A */
+ ["\u3F83", "\u3F83"], /* CJK Ideograph Extension A */
+ ["\u3F84", "\u3F84"], /* CJK Ideograph Extension A */
+ ["\u3F85", "\u3F85"], /* CJK Ideograph Extension A */
+ ["\u3F86", "\u3F86"], /* CJK Ideograph Extension A */
+ ["\u3F87", "\u3F87"], /* CJK Ideograph Extension A */
+ ["\u3F88", "\u3F88"], /* CJK Ideograph Extension A */
+ ["\u3F89", "\u3F89"], /* CJK Ideograph Extension A */
+ ["\u3F8A", "\u3F8A"], /* CJK Ideograph Extension A */
+ ["\u3F8B", "\u3F8B"], /* CJK Ideograph Extension A */
+ ["\u3F8C", "\u3F8C"], /* CJK Ideograph Extension A */
+ ["\u3F8D", "\u3F8D"], /* CJK Ideograph Extension A */
+ ["\u3F8E", "\u3F8E"], /* CJK Ideograph Extension A */
+ ["\u3F8F", "\u3F8F"], /* CJK Ideograph Extension A */
+ ["\u3F90", "\u3F90"], /* CJK Ideograph Extension A */
+ ["\u3F91", "\u3F91"], /* CJK Ideograph Extension A */
+ ["\u3F92", "\u3F92"], /* CJK Ideograph Extension A */
+ ["\u3F93", "\u3F93"], /* CJK Ideograph Extension A */
+ ["\u3F94", "\u3F94"], /* CJK Ideograph Extension A */
+ ["\u3F95", "\u3F95"], /* CJK Ideograph Extension A */
+ ["\u3F96", "\u3F96"], /* CJK Ideograph Extension A */
+ ["\u3F97", "\u3F97"], /* CJK Ideograph Extension A */
+ ["\u3F98", "\u3F98"], /* CJK Ideograph Extension A */
+ ["\u3F99", "\u3F99"], /* CJK Ideograph Extension A */
+ ["\u3F9A", "\u3F9A"], /* CJK Ideograph Extension A */
+ ["\u3F9B", "\u3F9B"], /* CJK Ideograph Extension A */
+ ["\u3F9C", "\u3F9C"], /* CJK Ideograph Extension A */
+ ["\u3F9D", "\u3F9D"], /* CJK Ideograph Extension A */
+ ["\u3F9E", "\u3F9E"], /* CJK Ideograph Extension A */
+ ["\u3F9F", "\u3F9F"], /* CJK Ideograph Extension A */
+ ["\u3FA0", "\u3FA0"], /* CJK Ideograph Extension A */
+ ["\u3FA1", "\u3FA1"], /* CJK Ideograph Extension A */
+ ["\u3FA2", "\u3FA2"], /* CJK Ideograph Extension A */
+ ["\u3FA3", "\u3FA3"], /* CJK Ideograph Extension A */
+ ["\u3FA4", "\u3FA4"], /* CJK Ideograph Extension A */
+ ["\u3FA5", "\u3FA5"], /* CJK Ideograph Extension A */
+ ["\u3FA6", "\u3FA6"], /* CJK Ideograph Extension A */
+ ["\u3FA7", "\u3FA7"], /* CJK Ideograph Extension A */
+ ["\u3FA8", "\u3FA8"], /* CJK Ideograph Extension A */
+ ["\u3FA9", "\u3FA9"], /* CJK Ideograph Extension A */
+ ["\u3FAA", "\u3FAA"], /* CJK Ideograph Extension A */
+ ["\u3FAB", "\u3FAB"], /* CJK Ideograph Extension A */
+ ["\u3FAC", "\u3FAC"], /* CJK Ideograph Extension A */
+ ["\u3FAD", "\u3FAD"], /* CJK Ideograph Extension A */
+ ["\u3FAE", "\u3FAE"], /* CJK Ideograph Extension A */
+ ["\u3FAF", "\u3FAF"], /* CJK Ideograph Extension A */
+ ["\u3FB0", "\u3FB0"], /* CJK Ideograph Extension A */
+ ["\u3FB1", "\u3FB1"], /* CJK Ideograph Extension A */
+ ["\u3FB2", "\u3FB2"], /* CJK Ideograph Extension A */
+ ["\u3FB3", "\u3FB3"], /* CJK Ideograph Extension A */
+ ["\u3FB4", "\u3FB4"], /* CJK Ideograph Extension A */
+ ["\u3FB5", "\u3FB5"], /* CJK Ideograph Extension A */
+ ["\u3FB6", "\u3FB6"], /* CJK Ideograph Extension A */
+ ["\u3FB7", "\u3FB7"], /* CJK Ideograph Extension A */
+ ["\u3FB8", "\u3FB8"], /* CJK Ideograph Extension A */
+ ["\u3FB9", "\u3FB9"], /* CJK Ideograph Extension A */
+ ["\u3FBA", "\u3FBA"], /* CJK Ideograph Extension A */
+ ["\u3FBB", "\u3FBB"], /* CJK Ideograph Extension A */
+ ["\u3FBC", "\u3FBC"], /* CJK Ideograph Extension A */
+ ["\u3FBD", "\u3FBD"], /* CJK Ideograph Extension A */
+ ["\u3FBE", "\u3FBE"], /* CJK Ideograph Extension A */
+ ["\u3FBF", "\u3FBF"], /* CJK Ideograph Extension A */
+ ["\u3FC0", "\u3FC0"], /* CJK Ideograph Extension A */
+ ["\u3FC1", "\u3FC1"], /* CJK Ideograph Extension A */
+ ["\u3FC2", "\u3FC2"], /* CJK Ideograph Extension A */
+ ["\u3FC3", "\u3FC3"], /* CJK Ideograph Extension A */
+ ["\u3FC4", "\u3FC4"], /* CJK Ideograph Extension A */
+ ["\u3FC5", "\u3FC5"], /* CJK Ideograph Extension A */
+ ["\u3FC6", "\u3FC6"], /* CJK Ideograph Extension A */
+ ["\u3FC7", "\u3FC7"], /* CJK Ideograph Extension A */
+ ["\u3FC8", "\u3FC8"], /* CJK Ideograph Extension A */
+ ["\u3FC9", "\u3FC9"], /* CJK Ideograph Extension A */
+ ["\u3FCA", "\u3FCA"], /* CJK Ideograph Extension A */
+ ["\u3FCB", "\u3FCB"], /* CJK Ideograph Extension A */
+ ["\u3FCC", "\u3FCC"], /* CJK Ideograph Extension A */
+ ["\u3FCD", "\u3FCD"], /* CJK Ideograph Extension A */
+ ["\u3FCE", "\u3FCE"], /* CJK Ideograph Extension A */
+ ["\u3FCF", "\u3FCF"], /* CJK Ideograph Extension A */
+ ["\u3FD0", "\u3FD0"], /* CJK Ideograph Extension A */
+ ["\u3FD1", "\u3FD1"], /* CJK Ideograph Extension A */
+ ["\u3FD2", "\u3FD2"], /* CJK Ideograph Extension A */
+ ["\u3FD3", "\u3FD3"], /* CJK Ideograph Extension A */
+ ["\u3FD4", "\u3FD4"], /* CJK Ideograph Extension A */
+ ["\u3FD5", "\u3FD5"], /* CJK Ideograph Extension A */
+ ["\u3FD6", "\u3FD6"], /* CJK Ideograph Extension A */
+ ["\u3FD7", "\u3FD7"], /* CJK Ideograph Extension A */
+ ["\u3FD8", "\u3FD8"], /* CJK Ideograph Extension A */
+ ["\u3FD9", "\u3FD9"], /* CJK Ideograph Extension A */
+ ["\u3FDA", "\u3FDA"], /* CJK Ideograph Extension A */
+ ["\u3FDB", "\u3FDB"], /* CJK Ideograph Extension A */
+ ["\u3FDC", "\u3FDC"], /* CJK Ideograph Extension A */
+ ["\u3FDD", "\u3FDD"], /* CJK Ideograph Extension A */
+ ["\u3FDE", "\u3FDE"], /* CJK Ideograph Extension A */
+ ["\u3FDF", "\u3FDF"], /* CJK Ideograph Extension A */
+ ["\u3FE0", "\u3FE0"], /* CJK Ideograph Extension A */
+ ["\u3FE1", "\u3FE1"], /* CJK Ideograph Extension A */
+ ["\u3FE2", "\u3FE2"], /* CJK Ideograph Extension A */
+ ["\u3FE3", "\u3FE3"], /* CJK Ideograph Extension A */
+ ["\u3FE4", "\u3FE4"], /* CJK Ideograph Extension A */
+ ["\u3FE5", "\u3FE5"], /* CJK Ideograph Extension A */
+ ["\u3FE6", "\u3FE6"], /* CJK Ideograph Extension A */
+ ["\u3FE7", "\u3FE7"], /* CJK Ideograph Extension A */
+ ["\u3FE8", "\u3FE8"], /* CJK Ideograph Extension A */
+ ["\u3FE9", "\u3FE9"], /* CJK Ideograph Extension A */
+ ["\u3FEA", "\u3FEA"], /* CJK Ideograph Extension A */
+ ["\u3FEB", "\u3FEB"], /* CJK Ideograph Extension A */
+ ["\u3FEC", "\u3FEC"], /* CJK Ideograph Extension A */
+ ["\u3FED", "\u3FED"], /* CJK Ideograph Extension A */
+ ["\u3FEE", "\u3FEE"], /* CJK Ideograph Extension A */
+ ["\u3FEF", "\u3FEF"], /* CJK Ideograph Extension A */
+ ["\u3FF0", "\u3FF0"], /* CJK Ideograph Extension A */
+ ["\u3FF1", "\u3FF1"], /* CJK Ideograph Extension A */
+ ["\u3FF2", "\u3FF2"], /* CJK Ideograph Extension A */
+ ["\u3FF3", "\u3FF3"], /* CJK Ideograph Extension A */
+ ["\u3FF4", "\u3FF4"], /* CJK Ideograph Extension A */
+ ["\u3FF5", "\u3FF5"], /* CJK Ideograph Extension A */
+ ["\u3FF6", "\u3FF6"], /* CJK Ideograph Extension A */
+ ["\u3FF7", "\u3FF7"], /* CJK Ideograph Extension A */
+ ["\u3FF8", "\u3FF8"], /* CJK Ideograph Extension A */
+ ["\u3FF9", "\u3FF9"], /* CJK Ideograph Extension A */
+ ["\u3FFA", "\u3FFA"], /* CJK Ideograph Extension A */
+ ["\u3FFB", "\u3FFB"], /* CJK Ideograph Extension A */
+ ["\u3FFC", "\u3FFC"], /* CJK Ideograph Extension A */
+ ["\u3FFD", "\u3FFD"], /* CJK Ideograph Extension A */
+ ["\u3FFE", "\u3FFE"], /* CJK Ideograph Extension A */
+ ["\u3FFF", "\u3FFF"], /* CJK Ideograph Extension A */
+ ["\u4000", "\u4000"], /* CJK Ideograph Extension A */
+ ["\u4001", "\u4001"], /* CJK Ideograph Extension A */
+ ["\u4002", "\u4002"], /* CJK Ideograph Extension A */
+ ["\u4003", "\u4003"], /* CJK Ideograph Extension A */
+ ["\u4004", "\u4004"], /* CJK Ideograph Extension A */
+ ["\u4005", "\u4005"], /* CJK Ideograph Extension A */
+ ["\u4006", "\u4006"], /* CJK Ideograph Extension A */
+ ["\u4007", "\u4007"], /* CJK Ideograph Extension A */
+ ["\u4008", "\u4008"], /* CJK Ideograph Extension A */
+ ["\u4009", "\u4009"], /* CJK Ideograph Extension A */
+ ["\u400A", "\u400A"], /* CJK Ideograph Extension A */
+ ["\u400B", "\u400B"], /* CJK Ideograph Extension A */
+ ["\u400C", "\u400C"], /* CJK Ideograph Extension A */
+ ["\u400D", "\u400D"], /* CJK Ideograph Extension A */
+ ["\u400E", "\u400E"], /* CJK Ideograph Extension A */
+ ["\u400F", "\u400F"], /* CJK Ideograph Extension A */
+ ["\u4010", "\u4010"], /* CJK Ideograph Extension A */
+ ["\u4011", "\u4011"], /* CJK Ideograph Extension A */
+ ["\u4012", "\u4012"], /* CJK Ideograph Extension A */
+ ["\u4013", "\u4013"], /* CJK Ideograph Extension A */
+ ["\u4014", "\u4014"], /* CJK Ideograph Extension A */
+ ["\u4015", "\u4015"], /* CJK Ideograph Extension A */
+ ["\u4016", "\u4016"], /* CJK Ideograph Extension A */
+ ["\u4017", "\u4017"], /* CJK Ideograph Extension A */
+ ["\u4018", "\u4018"], /* CJK Ideograph Extension A */
+ ["\u4019", "\u4019"], /* CJK Ideograph Extension A */
+ ["\u401A", "\u401A"], /* CJK Ideograph Extension A */
+ ["\u401B", "\u401B"], /* CJK Ideograph Extension A */
+ ["\u401C", "\u401C"], /* CJK Ideograph Extension A */
+ ["\u401D", "\u401D"], /* CJK Ideograph Extension A */
+ ["\u401E", "\u401E"], /* CJK Ideograph Extension A */
+ ["\u401F", "\u401F"], /* CJK Ideograph Extension A */
+ ["\u4020", "\u4020"], /* CJK Ideograph Extension A */
+ ["\u4021", "\u4021"], /* CJK Ideograph Extension A */
+ ["\u4022", "\u4022"], /* CJK Ideograph Extension A */
+ ["\u4023", "\u4023"], /* CJK Ideograph Extension A */
+ ["\u4024", "\u4024"], /* CJK Ideograph Extension A */
+ ["\u4025", "\u4025"], /* CJK Ideograph Extension A */
+ ["\u4026", "\u4026"], /* CJK Ideograph Extension A */
+ ["\u4027", "\u4027"], /* CJK Ideograph Extension A */
+ ["\u4028", "\u4028"], /* CJK Ideograph Extension A */
+ ["\u4029", "\u4029"], /* CJK Ideograph Extension A */
+ ["\u402A", "\u402A"], /* CJK Ideograph Extension A */
+ ["\u402B", "\u402B"], /* CJK Ideograph Extension A */
+ ["\u402C", "\u402C"], /* CJK Ideograph Extension A */
+ ["\u402D", "\u402D"], /* CJK Ideograph Extension A */
+ ["\u402E", "\u402E"], /* CJK Ideograph Extension A */
+ ["\u402F", "\u402F"], /* CJK Ideograph Extension A */
+ ["\u4030", "\u4030"], /* CJK Ideograph Extension A */
+ ["\u4031", "\u4031"], /* CJK Ideograph Extension A */
+ ["\u4032", "\u4032"], /* CJK Ideograph Extension A */
+ ["\u4033", "\u4033"], /* CJK Ideograph Extension A */
+ ["\u4034", "\u4034"], /* CJK Ideograph Extension A */
+ ["\u4035", "\u4035"], /* CJK Ideograph Extension A */
+ ["\u4036", "\u4036"], /* CJK Ideograph Extension A */
+ ["\u4037", "\u4037"], /* CJK Ideograph Extension A */
+ ["\u4038", "\u4038"], /* CJK Ideograph Extension A */
+ ["\u4039", "\u4039"], /* CJK Ideograph Extension A */
+ ["\u403A", "\u403A"], /* CJK Ideograph Extension A */
+ ["\u403B", "\u403B"], /* CJK Ideograph Extension A */
+ ["\u403C", "\u403C"], /* CJK Ideograph Extension A */
+ ["\u403D", "\u403D"], /* CJK Ideograph Extension A */
+ ["\u403E", "\u403E"], /* CJK Ideograph Extension A */
+ ["\u403F", "\u403F"], /* CJK Ideograph Extension A */
+ ["\u4040", "\u4040"], /* CJK Ideograph Extension A */
+ ["\u4041", "\u4041"], /* CJK Ideograph Extension A */
+ ["\u4042", "\u4042"], /* CJK Ideograph Extension A */
+ ["\u4043", "\u4043"], /* CJK Ideograph Extension A */
+ ["\u4044", "\u4044"], /* CJK Ideograph Extension A */
+ ["\u4045", "\u4045"], /* CJK Ideograph Extension A */
+ ["\u4046", "\u4046"], /* CJK Ideograph Extension A */
+ ["\u4047", "\u4047"], /* CJK Ideograph Extension A */
+ ["\u4048", "\u4048"], /* CJK Ideograph Extension A */
+ ["\u4049", "\u4049"], /* CJK Ideograph Extension A */
+ ["\u404A", "\u404A"], /* CJK Ideograph Extension A */
+ ["\u404B", "\u404B"], /* CJK Ideograph Extension A */
+ ["\u404C", "\u404C"], /* CJK Ideograph Extension A */
+ ["\u404D", "\u404D"], /* CJK Ideograph Extension A */
+ ["\u404E", "\u404E"], /* CJK Ideograph Extension A */
+ ["\u404F", "\u404F"], /* CJK Ideograph Extension A */
+ ["\u4050", "\u4050"], /* CJK Ideograph Extension A */
+ ["\u4051", "\u4051"], /* CJK Ideograph Extension A */
+ ["\u4052", "\u4052"], /* CJK Ideograph Extension A */
+ ["\u4053", "\u4053"], /* CJK Ideograph Extension A */
+ ["\u4054", "\u4054"], /* CJK Ideograph Extension A */
+ ["\u4055", "\u4055"], /* CJK Ideograph Extension A */
+ ["\u4056", "\u4056"], /* CJK Ideograph Extension A */
+ ["\u4057", "\u4057"], /* CJK Ideograph Extension A */
+ ["\u4058", "\u4058"], /* CJK Ideograph Extension A */
+ ["\u4059", "\u4059"], /* CJK Ideograph Extension A */
+ ["\u405A", "\u405A"], /* CJK Ideograph Extension A */
+ ["\u405B", "\u405B"], /* CJK Ideograph Extension A */
+ ["\u405C", "\u405C"], /* CJK Ideograph Extension A */
+ ["\u405D", "\u405D"], /* CJK Ideograph Extension A */
+ ["\u405E", "\u405E"], /* CJK Ideograph Extension A */
+ ["\u405F", "\u405F"], /* CJK Ideograph Extension A */
+ ["\u4060", "\u4060"], /* CJK Ideograph Extension A */
+ ["\u4061", "\u4061"], /* CJK Ideograph Extension A */
+ ["\u4062", "\u4062"], /* CJK Ideograph Extension A */
+ ["\u4063", "\u4063"], /* CJK Ideograph Extension A */
+ ["\u4064", "\u4064"], /* CJK Ideograph Extension A */
+ ["\u4065", "\u4065"], /* CJK Ideograph Extension A */
+ ["\u4066", "\u4066"], /* CJK Ideograph Extension A */
+ ["\u4067", "\u4067"], /* CJK Ideograph Extension A */
+ ["\u4068", "\u4068"], /* CJK Ideograph Extension A */
+ ["\u4069", "\u4069"], /* CJK Ideograph Extension A */
+ ["\u406A", "\u406A"], /* CJK Ideograph Extension A */
+ ["\u406B", "\u406B"], /* CJK Ideograph Extension A */
+ ["\u406C", "\u406C"], /* CJK Ideograph Extension A */
+ ["\u406D", "\u406D"], /* CJK Ideograph Extension A */
+ ["\u406E", "\u406E"], /* CJK Ideograph Extension A */
+ ["\u406F", "\u406F"], /* CJK Ideograph Extension A */
+ ["\u4070", "\u4070"], /* CJK Ideograph Extension A */
+ ["\u4071", "\u4071"], /* CJK Ideograph Extension A */
+ ["\u4072", "\u4072"], /* CJK Ideograph Extension A */
+ ["\u4073", "\u4073"], /* CJK Ideograph Extension A */
+ ["\u4074", "\u4074"], /* CJK Ideograph Extension A */
+ ["\u4075", "\u4075"], /* CJK Ideograph Extension A */
+ ["\u4076", "\u4076"], /* CJK Ideograph Extension A */
+ ["\u4077", "\u4077"], /* CJK Ideograph Extension A */
+ ["\u4078", "\u4078"], /* CJK Ideograph Extension A */
+ ["\u4079", "\u4079"], /* CJK Ideograph Extension A */
+ ["\u407A", "\u407A"], /* CJK Ideograph Extension A */
+ ["\u407B", "\u407B"], /* CJK Ideograph Extension A */
+ ["\u407C", "\u407C"], /* CJK Ideograph Extension A */
+ ["\u407D", "\u407D"], /* CJK Ideograph Extension A */
+ ["\u407E", "\u407E"], /* CJK Ideograph Extension A */
+ ["\u407F", "\u407F"], /* CJK Ideograph Extension A */
+ ["\u4080", "\u4080"], /* CJK Ideograph Extension A */
+ ["\u4081", "\u4081"], /* CJK Ideograph Extension A */
+ ["\u4082", "\u4082"], /* CJK Ideograph Extension A */
+ ["\u4083", "\u4083"], /* CJK Ideograph Extension A */
+ ["\u4084", "\u4084"], /* CJK Ideograph Extension A */
+ ["\u4085", "\u4085"], /* CJK Ideograph Extension A */
+ ["\u4086", "\u4086"], /* CJK Ideograph Extension A */
+ ["\u4087", "\u4087"], /* CJK Ideograph Extension A */
+ ["\u4088", "\u4088"], /* CJK Ideograph Extension A */
+ ["\u4089", "\u4089"], /* CJK Ideograph Extension A */
+ ["\u408A", "\u408A"], /* CJK Ideograph Extension A */
+ ["\u408B", "\u408B"], /* CJK Ideograph Extension A */
+ ["\u408C", "\u408C"], /* CJK Ideograph Extension A */
+ ["\u408D", "\u408D"], /* CJK Ideograph Extension A */
+ ["\u408E", "\u408E"], /* CJK Ideograph Extension A */
+ ["\u408F", "\u408F"], /* CJK Ideograph Extension A */
+ ["\u4090", "\u4090"], /* CJK Ideograph Extension A */
+ ["\u4091", "\u4091"], /* CJK Ideograph Extension A */
+ ["\u4092", "\u4092"], /* CJK Ideograph Extension A */
+ ["\u4093", "\u4093"], /* CJK Ideograph Extension A */
+ ["\u4094", "\u4094"], /* CJK Ideograph Extension A */
+ ["\u4095", "\u4095"], /* CJK Ideograph Extension A */
+ ["\u4096", "\u4096"], /* CJK Ideograph Extension A */
+ ["\u4097", "\u4097"], /* CJK Ideograph Extension A */
+ ["\u4098", "\u4098"], /* CJK Ideograph Extension A */
+ ["\u4099", "\u4099"], /* CJK Ideograph Extension A */
+ ["\u409A", "\u409A"], /* CJK Ideograph Extension A */
+ ["\u409B", "\u409B"], /* CJK Ideograph Extension A */
+ ["\u409C", "\u409C"], /* CJK Ideograph Extension A */
+ ["\u409D", "\u409D"], /* CJK Ideograph Extension A */
+ ["\u409E", "\u409E"], /* CJK Ideograph Extension A */
+ ["\u409F", "\u409F"], /* CJK Ideograph Extension A */
+ ["\u40A0", "\u40A0"], /* CJK Ideograph Extension A */
+ ["\u40A1", "\u40A1"], /* CJK Ideograph Extension A */
+ ["\u40A2", "\u40A2"], /* CJK Ideograph Extension A */
+ ["\u40A3", "\u40A3"], /* CJK Ideograph Extension A */
+ ["\u40A4", "\u40A4"], /* CJK Ideograph Extension A */
+ ["\u40A5", "\u40A5"], /* CJK Ideograph Extension A */
+ ["\u40A6", "\u40A6"], /* CJK Ideograph Extension A */
+ ["\u40A7", "\u40A7"], /* CJK Ideograph Extension A */
+ ["\u40A8", "\u40A8"], /* CJK Ideograph Extension A */
+ ["\u40A9", "\u40A9"], /* CJK Ideograph Extension A */
+ ["\u40AA", "\u40AA"], /* CJK Ideograph Extension A */
+ ["\u40AB", "\u40AB"], /* CJK Ideograph Extension A */
+ ["\u40AC", "\u40AC"], /* CJK Ideograph Extension A */
+ ["\u40AD", "\u40AD"], /* CJK Ideograph Extension A */
+ ["\u40AE", "\u40AE"], /* CJK Ideograph Extension A */
+ ["\u40AF", "\u40AF"], /* CJK Ideograph Extension A */
+ ["\u40B0", "\u40B0"], /* CJK Ideograph Extension A */
+ ["\u40B1", "\u40B1"], /* CJK Ideograph Extension A */
+ ["\u40B2", "\u40B2"], /* CJK Ideograph Extension A */
+ ["\u40B3", "\u40B3"], /* CJK Ideograph Extension A */
+ ["\u40B4", "\u40B4"], /* CJK Ideograph Extension A */
+ ["\u40B5", "\u40B5"], /* CJK Ideograph Extension A */
+ ["\u40B6", "\u40B6"], /* CJK Ideograph Extension A */
+ ["\u40B7", "\u40B7"], /* CJK Ideograph Extension A */
+ ["\u40B8", "\u40B8"], /* CJK Ideograph Extension A */
+ ["\u40B9", "\u40B9"], /* CJK Ideograph Extension A */
+ ["\u40BA", "\u40BA"], /* CJK Ideograph Extension A */
+ ["\u40BB", "\u40BB"], /* CJK Ideograph Extension A */
+ ["\u40BC", "\u40BC"], /* CJK Ideograph Extension A */
+ ["\u40BD", "\u40BD"], /* CJK Ideograph Extension A */
+ ["\u40BE", "\u40BE"], /* CJK Ideograph Extension A */
+ ["\u40BF", "\u40BF"], /* CJK Ideograph Extension A */
+ ["\u40C0", "\u40C0"], /* CJK Ideograph Extension A */
+ ["\u40C1", "\u40C1"], /* CJK Ideograph Extension A */
+ ["\u40C2", "\u40C2"], /* CJK Ideograph Extension A */
+ ["\u40C3", "\u40C3"], /* CJK Ideograph Extension A */
+ ["\u40C4", "\u40C4"], /* CJK Ideograph Extension A */
+ ["\u40C5", "\u40C5"], /* CJK Ideograph Extension A */
+ ["\u40C6", "\u40C6"], /* CJK Ideograph Extension A */
+ ["\u40C7", "\u40C7"], /* CJK Ideograph Extension A */
+ ["\u40C8", "\u40C8"], /* CJK Ideograph Extension A */
+ ["\u40C9", "\u40C9"], /* CJK Ideograph Extension A */
+ ["\u40CA", "\u40CA"], /* CJK Ideograph Extension A */
+ ["\u40CB", "\u40CB"], /* CJK Ideograph Extension A */
+ ["\u40CC", "\u40CC"], /* CJK Ideograph Extension A */
+ ["\u40CD", "\u40CD"], /* CJK Ideograph Extension A */
+ ["\u40CE", "\u40CE"], /* CJK Ideograph Extension A */
+ ["\u40CF", "\u40CF"], /* CJK Ideograph Extension A */
+ ["\u40D0", "\u40D0"], /* CJK Ideograph Extension A */
+ ["\u40D1", "\u40D1"], /* CJK Ideograph Extension A */
+ ["\u40D2", "\u40D2"], /* CJK Ideograph Extension A */
+ ["\u40D3", "\u40D3"], /* CJK Ideograph Extension A */
+ ["\u40D4", "\u40D4"], /* CJK Ideograph Extension A */
+ ["\u40D5", "\u40D5"], /* CJK Ideograph Extension A */
+ ["\u40D6", "\u40D6"], /* CJK Ideograph Extension A */
+ ["\u40D7", "\u40D7"], /* CJK Ideograph Extension A */
+ ["\u40D8", "\u40D8"], /* CJK Ideograph Extension A */
+ ["\u40D9", "\u40D9"], /* CJK Ideograph Extension A */
+ ["\u40DA", "\u40DA"], /* CJK Ideograph Extension A */
+ ["\u40DB", "\u40DB"], /* CJK Ideograph Extension A */
+ ["\u40DC", "\u40DC"], /* CJK Ideograph Extension A */
+ ["\u40DD", "\u40DD"], /* CJK Ideograph Extension A */
+ ["\u40DE", "\u40DE"], /* CJK Ideograph Extension A */
+ ["\u40DF", "\u40DF"], /* CJK Ideograph Extension A */
+ ["\u40E0", "\u40E0"], /* CJK Ideograph Extension A */
+ ["\u40E1", "\u40E1"], /* CJK Ideograph Extension A */
+ ["\u40E2", "\u40E2"], /* CJK Ideograph Extension A */
+ ["\u40E3", "\u40E3"], /* CJK Ideograph Extension A */
+ ["\u40E4", "\u40E4"], /* CJK Ideograph Extension A */
+ ["\u40E5", "\u40E5"], /* CJK Ideograph Extension A */
+ ["\u40E6", "\u40E6"], /* CJK Ideograph Extension A */
+ ["\u40E7", "\u40E7"], /* CJK Ideograph Extension A */
+ ["\u40E8", "\u40E8"], /* CJK Ideograph Extension A */
+ ["\u40E9", "\u40E9"], /* CJK Ideograph Extension A */
+ ["\u40EA", "\u40EA"], /* CJK Ideograph Extension A */
+ ["\u40EB", "\u40EB"], /* CJK Ideograph Extension A */
+ ["\u40EC", "\u40EC"], /* CJK Ideograph Extension A */
+ ["\u40ED", "\u40ED"], /* CJK Ideograph Extension A */
+ ["\u40EE", "\u40EE"], /* CJK Ideograph Extension A */
+ ["\u40EF", "\u40EF"], /* CJK Ideograph Extension A */
+ ["\u40F0", "\u40F0"], /* CJK Ideograph Extension A */
+ ["\u40F1", "\u40F1"], /* CJK Ideograph Extension A */
+ ["\u40F2", "\u40F2"], /* CJK Ideograph Extension A */
+ ["\u40F3", "\u40F3"], /* CJK Ideograph Extension A */
+ ["\u40F4", "\u40F4"], /* CJK Ideograph Extension A */
+ ["\u40F5", "\u40F5"], /* CJK Ideograph Extension A */
+ ["\u40F6", "\u40F6"], /* CJK Ideograph Extension A */
+ ["\u40F7", "\u40F7"], /* CJK Ideograph Extension A */
+ ["\u40F8", "\u40F8"], /* CJK Ideograph Extension A */
+ ["\u40F9", "\u40F9"], /* CJK Ideograph Extension A */
+ ["\u40FA", "\u40FA"], /* CJK Ideograph Extension A */
+ ["\u40FB", "\u40FB"], /* CJK Ideograph Extension A */
+ ["\u40FC", "\u40FC"], /* CJK Ideograph Extension A */
+ ["\u40FD", "\u40FD"], /* CJK Ideograph Extension A */
+ ["\u40FE", "\u40FE"], /* CJK Ideograph Extension A */
+ ["\u40FF", "\u40FF"], /* CJK Ideograph Extension A */
+ ["\u4100", "\u4100"], /* CJK Ideograph Extension A */
+ ["\u4101", "\u4101"], /* CJK Ideograph Extension A */
+ ["\u4102", "\u4102"], /* CJK Ideograph Extension A */
+ ["\u4103", "\u4103"], /* CJK Ideograph Extension A */
+ ["\u4104", "\u4104"], /* CJK Ideograph Extension A */
+ ["\u4105", "\u4105"], /* CJK Ideograph Extension A */
+ ["\u4106", "\u4106"], /* CJK Ideograph Extension A */
+ ["\u4107", "\u4107"], /* CJK Ideograph Extension A */
+ ["\u4108", "\u4108"], /* CJK Ideograph Extension A */
+ ["\u4109", "\u4109"], /* CJK Ideograph Extension A */
+ ["\u410A", "\u410A"], /* CJK Ideograph Extension A */
+ ["\u410B", "\u410B"], /* CJK Ideograph Extension A */
+ ["\u410C", "\u410C"], /* CJK Ideograph Extension A */
+ ["\u410D", "\u410D"], /* CJK Ideograph Extension A */
+ ["\u410E", "\u410E"], /* CJK Ideograph Extension A */
+ ["\u410F", "\u410F"], /* CJK Ideograph Extension A */
+ ["\u4110", "\u4110"], /* CJK Ideograph Extension A */
+ ["\u4111", "\u4111"], /* CJK Ideograph Extension A */
+ ["\u4112", "\u4112"], /* CJK Ideograph Extension A */
+ ["\u4113", "\u4113"], /* CJK Ideograph Extension A */
+ ["\u4114", "\u4114"], /* CJK Ideograph Extension A */
+ ["\u4115", "\u4115"], /* CJK Ideograph Extension A */
+ ["\u4116", "\u4116"], /* CJK Ideograph Extension A */
+ ["\u4117", "\u4117"], /* CJK Ideograph Extension A */
+ ["\u4118", "\u4118"], /* CJK Ideograph Extension A */
+ ["\u4119", "\u4119"], /* CJK Ideograph Extension A */
+ ["\u411A", "\u411A"], /* CJK Ideograph Extension A */
+ ["\u411B", "\u411B"], /* CJK Ideograph Extension A */
+ ["\u411C", "\u411C"], /* CJK Ideograph Extension A */
+ ["\u411D", "\u411D"], /* CJK Ideograph Extension A */
+ ["\u411E", "\u411E"], /* CJK Ideograph Extension A */
+ ["\u411F", "\u411F"], /* CJK Ideograph Extension A */
+ ["\u4120", "\u4120"], /* CJK Ideograph Extension A */
+ ["\u4121", "\u4121"], /* CJK Ideograph Extension A */
+ ["\u4122", "\u4122"], /* CJK Ideograph Extension A */
+ ["\u4123", "\u4123"], /* CJK Ideograph Extension A */
+ ["\u4124", "\u4124"], /* CJK Ideograph Extension A */
+ ["\u4125", "\u4125"], /* CJK Ideograph Extension A */
+ ["\u4126", "\u4126"], /* CJK Ideograph Extension A */
+ ["\u4127", "\u4127"], /* CJK Ideograph Extension A */
+ ["\u4128", "\u4128"], /* CJK Ideograph Extension A */
+ ["\u4129", "\u4129"], /* CJK Ideograph Extension A */
+ ["\u412A", "\u412A"], /* CJK Ideograph Extension A */
+ ["\u412B", "\u412B"], /* CJK Ideograph Extension A */
+ ["\u412C", "\u412C"], /* CJK Ideograph Extension A */
+ ["\u412D", "\u412D"], /* CJK Ideograph Extension A */
+ ["\u412E", "\u412E"], /* CJK Ideograph Extension A */
+ ["\u412F", "\u412F"], /* CJK Ideograph Extension A */
+ ["\u4130", "\u4130"], /* CJK Ideograph Extension A */
+ ["\u4131", "\u4131"], /* CJK Ideograph Extension A */
+ ["\u4132", "\u4132"], /* CJK Ideograph Extension A */
+ ["\u4133", "\u4133"], /* CJK Ideograph Extension A */
+ ["\u4134", "\u4134"], /* CJK Ideograph Extension A */
+ ["\u4135", "\u4135"], /* CJK Ideograph Extension A */
+ ["\u4136", "\u4136"], /* CJK Ideograph Extension A */
+ ["\u4137", "\u4137"], /* CJK Ideograph Extension A */
+ ["\u4138", "\u4138"], /* CJK Ideograph Extension A */
+ ["\u4139", "\u4139"], /* CJK Ideograph Extension A */
+ ["\u413A", "\u413A"], /* CJK Ideograph Extension A */
+ ["\u413B", "\u413B"], /* CJK Ideograph Extension A */
+ ["\u413C", "\u413C"], /* CJK Ideograph Extension A */
+ ["\u413D", "\u413D"], /* CJK Ideograph Extension A */
+ ["\u413E", "\u413E"], /* CJK Ideograph Extension A */
+ ["\u413F", "\u413F"], /* CJK Ideograph Extension A */
+ ["\u4140", "\u4140"], /* CJK Ideograph Extension A */
+ ["\u4141", "\u4141"], /* CJK Ideograph Extension A */
+ ["\u4142", "\u4142"], /* CJK Ideograph Extension A */
+ ["\u4143", "\u4143"], /* CJK Ideograph Extension A */
+ ["\u4144", "\u4144"], /* CJK Ideograph Extension A */
+ ["\u4145", "\u4145"], /* CJK Ideograph Extension A */
+ ["\u4146", "\u4146"], /* CJK Ideograph Extension A */
+ ["\u4147", "\u4147"], /* CJK Ideograph Extension A */
+ ["\u4148", "\u4148"], /* CJK Ideograph Extension A */
+ ["\u4149", "\u4149"], /* CJK Ideograph Extension A */
+ ["\u414A", "\u414A"], /* CJK Ideograph Extension A */
+ ["\u414B", "\u414B"], /* CJK Ideograph Extension A */
+ ["\u414C", "\u414C"], /* CJK Ideograph Extension A */
+ ["\u414D", "\u414D"], /* CJK Ideograph Extension A */
+ ["\u414E", "\u414E"], /* CJK Ideograph Extension A */
+ ["\u414F", "\u414F"], /* CJK Ideograph Extension A */
+ ["\u4150", "\u4150"], /* CJK Ideograph Extension A */
+ ["\u4151", "\u4151"], /* CJK Ideograph Extension A */
+ ["\u4152", "\u4152"], /* CJK Ideograph Extension A */
+ ["\u4153", "\u4153"], /* CJK Ideograph Extension A */
+ ["\u4154", "\u4154"], /* CJK Ideograph Extension A */
+ ["\u4155", "\u4155"], /* CJK Ideograph Extension A */
+ ["\u4156", "\u4156"], /* CJK Ideograph Extension A */
+ ["\u4157", "\u4157"], /* CJK Ideograph Extension A */
+ ["\u4158", "\u4158"], /* CJK Ideograph Extension A */
+ ["\u4159", "\u4159"], /* CJK Ideograph Extension A */
+ ["\u415A", "\u415A"], /* CJK Ideograph Extension A */
+ ["\u415B", "\u415B"], /* CJK Ideograph Extension A */
+ ["\u415C", "\u415C"], /* CJK Ideograph Extension A */
+ ["\u415D", "\u415D"], /* CJK Ideograph Extension A */
+ ["\u415E", "\u415E"], /* CJK Ideograph Extension A */
+ ["\u415F", "\u415F"], /* CJK Ideograph Extension A */
+ ["\u4160", "\u4160"], /* CJK Ideograph Extension A */
+ ["\u4161", "\u4161"], /* CJK Ideograph Extension A */
+ ["\u4162", "\u4162"], /* CJK Ideograph Extension A */
+ ["\u4163", "\u4163"], /* CJK Ideograph Extension A */
+ ["\u4164", "\u4164"], /* CJK Ideograph Extension A */
+ ["\u4165", "\u4165"], /* CJK Ideograph Extension A */
+ ["\u4166", "\u4166"], /* CJK Ideograph Extension A */
+ ["\u4167", "\u4167"], /* CJK Ideograph Extension A */
+ ["\u4168", "\u4168"], /* CJK Ideograph Extension A */
+ ["\u4169", "\u4169"], /* CJK Ideograph Extension A */
+ ["\u416A", "\u416A"], /* CJK Ideograph Extension A */
+ ["\u416B", "\u416B"], /* CJK Ideograph Extension A */
+ ["\u416C", "\u416C"], /* CJK Ideograph Extension A */
+ ["\u416D", "\u416D"], /* CJK Ideograph Extension A */
+ ["\u416E", "\u416E"], /* CJK Ideograph Extension A */
+ ["\u416F", "\u416F"], /* CJK Ideograph Extension A */
+ ["\u4170", "\u4170"], /* CJK Ideograph Extension A */
+ ["\u4171", "\u4171"], /* CJK Ideograph Extension A */
+ ["\u4172", "\u4172"], /* CJK Ideograph Extension A */
+ ["\u4173", "\u4173"], /* CJK Ideograph Extension A */
+ ["\u4174", "\u4174"], /* CJK Ideograph Extension A */
+ ["\u4175", "\u4175"], /* CJK Ideograph Extension A */
+ ["\u4176", "\u4176"], /* CJK Ideograph Extension A */
+ ["\u4177", "\u4177"], /* CJK Ideograph Extension A */
+ ["\u4178", "\u4178"], /* CJK Ideograph Extension A */
+ ["\u4179", "\u4179"], /* CJK Ideograph Extension A */
+ ["\u417A", "\u417A"], /* CJK Ideograph Extension A */
+ ["\u417B", "\u417B"], /* CJK Ideograph Extension A */
+ ["\u417C", "\u417C"], /* CJK Ideograph Extension A */
+ ["\u417D", "\u417D"], /* CJK Ideograph Extension A */
+ ["\u417E", "\u417E"], /* CJK Ideograph Extension A */
+ ["\u417F", "\u417F"], /* CJK Ideograph Extension A */
+ ["\u4180", "\u4180"], /* CJK Ideograph Extension A */
+ ["\u4181", "\u4181"], /* CJK Ideograph Extension A */
+ ["\u4182", "\u4182"], /* CJK Ideograph Extension A */
+ ["\u4183", "\u4183"], /* CJK Ideograph Extension A */
+ ["\u4184", "\u4184"], /* CJK Ideograph Extension A */
+ ["\u4185", "\u4185"], /* CJK Ideograph Extension A */
+ ["\u4186", "\u4186"], /* CJK Ideograph Extension A */
+ ["\u4187", "\u4187"], /* CJK Ideograph Extension A */
+ ["\u4188", "\u4188"], /* CJK Ideograph Extension A */
+ ["\u4189", "\u4189"], /* CJK Ideograph Extension A */
+ ["\u418A", "\u418A"], /* CJK Ideograph Extension A */
+ ["\u418B", "\u418B"], /* CJK Ideograph Extension A */
+ ["\u418C", "\u418C"], /* CJK Ideograph Extension A */
+ ["\u418D", "\u418D"], /* CJK Ideograph Extension A */
+ ["\u418E", "\u418E"], /* CJK Ideograph Extension A */
+ ["\u418F", "\u418F"], /* CJK Ideograph Extension A */
+ ["\u4190", "\u4190"], /* CJK Ideograph Extension A */
+ ["\u4191", "\u4191"], /* CJK Ideograph Extension A */
+ ["\u4192", "\u4192"], /* CJK Ideograph Extension A */
+ ["\u4193", "\u4193"], /* CJK Ideograph Extension A */
+ ["\u4194", "\u4194"], /* CJK Ideograph Extension A */
+ ["\u4195", "\u4195"], /* CJK Ideograph Extension A */
+ ["\u4196", "\u4196"], /* CJK Ideograph Extension A */
+ ["\u4197", "\u4197"], /* CJK Ideograph Extension A */
+ ["\u4198", "\u4198"], /* CJK Ideograph Extension A */
+ ["\u4199", "\u4199"], /* CJK Ideograph Extension A */
+ ["\u419A", "\u419A"], /* CJK Ideograph Extension A */
+ ["\u419B", "\u419B"], /* CJK Ideograph Extension A */
+ ["\u419C", "\u419C"], /* CJK Ideograph Extension A */
+ ["\u419D", "\u419D"], /* CJK Ideograph Extension A */
+ ["\u419E", "\u419E"], /* CJK Ideograph Extension A */
+ ["\u419F", "\u419F"], /* CJK Ideograph Extension A */
+ ["\u41A0", "\u41A0"], /* CJK Ideograph Extension A */
+ ["\u41A1", "\u41A1"], /* CJK Ideograph Extension A */
+ ["\u41A2", "\u41A2"], /* CJK Ideograph Extension A */
+ ["\u41A3", "\u41A3"], /* CJK Ideograph Extension A */
+ ["\u41A4", "\u41A4"], /* CJK Ideograph Extension A */
+ ["\u41A5", "\u41A5"], /* CJK Ideograph Extension A */
+ ["\u41A6", "\u41A6"], /* CJK Ideograph Extension A */
+ ["\u41A7", "\u41A7"], /* CJK Ideograph Extension A */
+ ["\u41A8", "\u41A8"], /* CJK Ideograph Extension A */
+ ["\u41A9", "\u41A9"], /* CJK Ideograph Extension A */
+ ["\u41AA", "\u41AA"], /* CJK Ideograph Extension A */
+ ["\u41AB", "\u41AB"], /* CJK Ideograph Extension A */
+ ["\u41AC", "\u41AC"], /* CJK Ideograph Extension A */
+ ["\u41AD", "\u41AD"], /* CJK Ideograph Extension A */
+ ["\u41AE", "\u41AE"], /* CJK Ideograph Extension A */
+ ["\u41AF", "\u41AF"], /* CJK Ideograph Extension A */
+ ["\u41B0", "\u41B0"], /* CJK Ideograph Extension A */
+ ["\u41B1", "\u41B1"], /* CJK Ideograph Extension A */
+ ["\u41B2", "\u41B2"], /* CJK Ideograph Extension A */
+ ["\u41B3", "\u41B3"], /* CJK Ideograph Extension A */
+ ["\u41B4", "\u41B4"], /* CJK Ideograph Extension A */
+ ["\u41B5", "\u41B5"], /* CJK Ideograph Extension A */
+ ["\u41B6", "\u41B6"], /* CJK Ideograph Extension A */
+ ["\u41B7", "\u41B7"], /* CJK Ideograph Extension A */
+ ["\u41B8", "\u41B8"], /* CJK Ideograph Extension A */
+ ["\u41B9", "\u41B9"], /* CJK Ideograph Extension A */
+ ["\u41BA", "\u41BA"], /* CJK Ideograph Extension A */
+ ["\u41BB", "\u41BB"], /* CJK Ideograph Extension A */
+ ["\u41BC", "\u41BC"], /* CJK Ideograph Extension A */
+ ["\u41BD", "\u41BD"], /* CJK Ideograph Extension A */
+ ["\u41BE", "\u41BE"], /* CJK Ideograph Extension A */
+ ["\u41BF", "\u41BF"], /* CJK Ideograph Extension A */
+ ["\u41C0", "\u41C0"], /* CJK Ideograph Extension A */
+ ["\u41C1", "\u41C1"], /* CJK Ideograph Extension A */
+ ["\u41C2", "\u41C2"], /* CJK Ideograph Extension A */
+ ["\u41C3", "\u41C3"], /* CJK Ideograph Extension A */
+ ["\u41C4", "\u41C4"], /* CJK Ideograph Extension A */
+ ["\u41C5", "\u41C5"], /* CJK Ideograph Extension A */
+ ["\u41C6", "\u41C6"], /* CJK Ideograph Extension A */
+ ["\u41C7", "\u41C7"], /* CJK Ideograph Extension A */
+ ["\u41C8", "\u41C8"], /* CJK Ideograph Extension A */
+ ["\u41C9", "\u41C9"], /* CJK Ideograph Extension A */
+ ["\u41CA", "\u41CA"], /* CJK Ideograph Extension A */
+ ["\u41CB", "\u41CB"], /* CJK Ideograph Extension A */
+ ["\u41CC", "\u41CC"], /* CJK Ideograph Extension A */
+ ["\u41CD", "\u41CD"], /* CJK Ideograph Extension A */
+ ["\u41CE", "\u41CE"], /* CJK Ideograph Extension A */
+ ["\u41CF", "\u41CF"], /* CJK Ideograph Extension A */
+ ["\u41D0", "\u41D0"], /* CJK Ideograph Extension A */
+ ["\u41D1", "\u41D1"], /* CJK Ideograph Extension A */
+ ["\u41D2", "\u41D2"], /* CJK Ideograph Extension A */
+ ["\u41D3", "\u41D3"], /* CJK Ideograph Extension A */
+ ["\u41D4", "\u41D4"], /* CJK Ideograph Extension A */
+ ["\u41D5", "\u41D5"], /* CJK Ideograph Extension A */
+ ["\u41D6", "\u41D6"], /* CJK Ideograph Extension A */
+ ["\u41D7", "\u41D7"], /* CJK Ideograph Extension A */
+ ["\u41D8", "\u41D8"], /* CJK Ideograph Extension A */
+ ["\u41D9", "\u41D9"], /* CJK Ideograph Extension A */
+ ["\u41DA", "\u41DA"], /* CJK Ideograph Extension A */
+ ["\u41DB", "\u41DB"], /* CJK Ideograph Extension A */
+ ["\u41DC", "\u41DC"], /* CJK Ideograph Extension A */
+ ["\u41DD", "\u41DD"], /* CJK Ideograph Extension A */
+ ["\u41DE", "\u41DE"], /* CJK Ideograph Extension A */
+ ["\u41DF", "\u41DF"], /* CJK Ideograph Extension A */
+ ["\u41E0", "\u41E0"], /* CJK Ideograph Extension A */
+ ["\u41E1", "\u41E1"], /* CJK Ideograph Extension A */
+ ["\u41E2", "\u41E2"], /* CJK Ideograph Extension A */
+ ["\u41E3", "\u41E3"], /* CJK Ideograph Extension A */
+ ["\u41E4", "\u41E4"], /* CJK Ideograph Extension A */
+ ["\u41E5", "\u41E5"], /* CJK Ideograph Extension A */
+ ["\u41E6", "\u41E6"], /* CJK Ideograph Extension A */
+ ["\u41E7", "\u41E7"], /* CJK Ideograph Extension A */
+ ["\u41E8", "\u41E8"], /* CJK Ideograph Extension A */
+ ["\u41E9", "\u41E9"], /* CJK Ideograph Extension A */
+ ["\u41EA", "\u41EA"], /* CJK Ideograph Extension A */
+ ["\u41EB", "\u41EB"], /* CJK Ideograph Extension A */
+ ["\u41EC", "\u41EC"], /* CJK Ideograph Extension A */
+ ["\u41ED", "\u41ED"], /* CJK Ideograph Extension A */
+ ["\u41EE", "\u41EE"], /* CJK Ideograph Extension A */
+ ["\u41EF", "\u41EF"], /* CJK Ideograph Extension A */
+ ["\u41F0", "\u41F0"], /* CJK Ideograph Extension A */
+ ["\u41F1", "\u41F1"], /* CJK Ideograph Extension A */
+ ["\u41F2", "\u41F2"], /* CJK Ideograph Extension A */
+ ["\u41F3", "\u41F3"], /* CJK Ideograph Extension A */
+ ["\u41F4", "\u41F4"], /* CJK Ideograph Extension A */
+ ["\u41F5", "\u41F5"], /* CJK Ideograph Extension A */
+ ["\u41F6", "\u41F6"], /* CJK Ideograph Extension A */
+ ["\u41F7", "\u41F7"], /* CJK Ideograph Extension A */
+ ["\u41F8", "\u41F8"], /* CJK Ideograph Extension A */
+ ["\u41F9", "\u41F9"], /* CJK Ideograph Extension A */
+ ["\u41FA", "\u41FA"], /* CJK Ideograph Extension A */
+ ["\u41FB", "\u41FB"], /* CJK Ideograph Extension A */
+ ["\u41FC", "\u41FC"], /* CJK Ideograph Extension A */
+ ["\u41FD", "\u41FD"], /* CJK Ideograph Extension A */
+ ["\u41FE", "\u41FE"], /* CJK Ideograph Extension A */
+ ["\u41FF", "\u41FF"], /* CJK Ideograph Extension A */
+ ["\u4200", "\u4200"], /* CJK Ideograph Extension A */
+ ["\u4201", "\u4201"], /* CJK Ideograph Extension A */
+ ["\u4202", "\u4202"], /* CJK Ideograph Extension A */
+ ["\u4203", "\u4203"], /* CJK Ideograph Extension A */
+ ["\u4204", "\u4204"], /* CJK Ideograph Extension A */
+ ["\u4205", "\u4205"], /* CJK Ideograph Extension A */
+ ["\u4206", "\u4206"], /* CJK Ideograph Extension A */
+ ["\u4207", "\u4207"], /* CJK Ideograph Extension A */
+ ["\u4208", "\u4208"], /* CJK Ideograph Extension A */
+ ["\u4209", "\u4209"], /* CJK Ideograph Extension A */
+ ["\u420A", "\u420A"], /* CJK Ideograph Extension A */
+ ["\u420B", "\u420B"], /* CJK Ideograph Extension A */
+ ["\u420C", "\u420C"], /* CJK Ideograph Extension A */
+ ["\u420D", "\u420D"], /* CJK Ideograph Extension A */
+ ["\u420E", "\u420E"], /* CJK Ideograph Extension A */
+ ["\u420F", "\u420F"], /* CJK Ideograph Extension A */
+ ["\u4210", "\u4210"], /* CJK Ideograph Extension A */
+ ["\u4211", "\u4211"], /* CJK Ideograph Extension A */
+ ["\u4212", "\u4212"], /* CJK Ideograph Extension A */
+ ["\u4213", "\u4213"], /* CJK Ideograph Extension A */
+ ["\u4214", "\u4214"], /* CJK Ideograph Extension A */
+ ["\u4215", "\u4215"], /* CJK Ideograph Extension A */
+ ["\u4216", "\u4216"], /* CJK Ideograph Extension A */
+ ["\u4217", "\u4217"], /* CJK Ideograph Extension A */
+ ["\u4218", "\u4218"], /* CJK Ideograph Extension A */
+ ["\u4219", "\u4219"], /* CJK Ideograph Extension A */
+ ["\u421A", "\u421A"], /* CJK Ideograph Extension A */
+ ["\u421B", "\u421B"], /* CJK Ideograph Extension A */
+ ["\u421C", "\u421C"], /* CJK Ideograph Extension A */
+ ["\u421D", "\u421D"], /* CJK Ideograph Extension A */
+ ["\u421E", "\u421E"], /* CJK Ideograph Extension A */
+ ["\u421F", "\u421F"], /* CJK Ideograph Extension A */
+ ["\u4220", "\u4220"], /* CJK Ideograph Extension A */
+ ["\u4221", "\u4221"], /* CJK Ideograph Extension A */
+ ["\u4222", "\u4222"], /* CJK Ideograph Extension A */
+ ["\u4223", "\u4223"], /* CJK Ideograph Extension A */
+ ["\u4224", "\u4224"], /* CJK Ideograph Extension A */
+ ["\u4225", "\u4225"], /* CJK Ideograph Extension A */
+ ["\u4226", "\u4226"], /* CJK Ideograph Extension A */
+ ["\u4227", "\u4227"], /* CJK Ideograph Extension A */
+ ["\u4228", "\u4228"], /* CJK Ideograph Extension A */
+ ["\u4229", "\u4229"], /* CJK Ideograph Extension A */
+ ["\u422A", "\u422A"], /* CJK Ideograph Extension A */
+ ["\u422B", "\u422B"], /* CJK Ideograph Extension A */
+ ["\u422C", "\u422C"], /* CJK Ideograph Extension A */
+ ["\u422D", "\u422D"], /* CJK Ideograph Extension A */
+ ["\u422E", "\u422E"], /* CJK Ideograph Extension A */
+ ["\u422F", "\u422F"], /* CJK Ideograph Extension A */
+ ["\u4230", "\u4230"], /* CJK Ideograph Extension A */
+ ["\u4231", "\u4231"], /* CJK Ideograph Extension A */
+ ["\u4232", "\u4232"], /* CJK Ideograph Extension A */
+ ["\u4233", "\u4233"], /* CJK Ideograph Extension A */
+ ["\u4234", "\u4234"], /* CJK Ideograph Extension A */
+ ["\u4235", "\u4235"], /* CJK Ideograph Extension A */
+ ["\u4236", "\u4236"], /* CJK Ideograph Extension A */
+ ["\u4237", "\u4237"], /* CJK Ideograph Extension A */
+ ["\u4238", "\u4238"], /* CJK Ideograph Extension A */
+ ["\u4239", "\u4239"], /* CJK Ideograph Extension A */
+ ["\u423A", "\u423A"], /* CJK Ideograph Extension A */
+ ["\u423B", "\u423B"], /* CJK Ideograph Extension A */
+ ["\u423C", "\u423C"], /* CJK Ideograph Extension A */
+ ["\u423D", "\u423D"], /* CJK Ideograph Extension A */
+ ["\u423E", "\u423E"], /* CJK Ideograph Extension A */
+ ["\u423F", "\u423F"], /* CJK Ideograph Extension A */
+ ["\u4240", "\u4240"], /* CJK Ideograph Extension A */
+ ["\u4241", "\u4241"], /* CJK Ideograph Extension A */
+ ["\u4242", "\u4242"], /* CJK Ideograph Extension A */
+ ["\u4243", "\u4243"], /* CJK Ideograph Extension A */
+ ["\u4244", "\u4244"], /* CJK Ideograph Extension A */
+ ["\u4245", "\u4245"], /* CJK Ideograph Extension A */
+ ["\u4246", "\u4246"], /* CJK Ideograph Extension A */
+ ["\u4247", "\u4247"], /* CJK Ideograph Extension A */
+ ["\u4248", "\u4248"], /* CJK Ideograph Extension A */
+ ["\u4249", "\u4249"], /* CJK Ideograph Extension A */
+ ["\u424A", "\u424A"], /* CJK Ideograph Extension A */
+ ["\u424B", "\u424B"], /* CJK Ideograph Extension A */
+ ["\u424C", "\u424C"], /* CJK Ideograph Extension A */
+ ["\u424D", "\u424D"], /* CJK Ideograph Extension A */
+ ["\u424E", "\u424E"], /* CJK Ideograph Extension A */
+ ["\u424F", "\u424F"], /* CJK Ideograph Extension A */
+ ["\u4250", "\u4250"], /* CJK Ideograph Extension A */
+ ["\u4251", "\u4251"], /* CJK Ideograph Extension A */
+ ["\u4252", "\u4252"], /* CJK Ideograph Extension A */
+ ["\u4253", "\u4253"], /* CJK Ideograph Extension A */
+ ["\u4254", "\u4254"], /* CJK Ideograph Extension A */
+ ["\u4255", "\u4255"], /* CJK Ideograph Extension A */
+ ["\u4256", "\u4256"], /* CJK Ideograph Extension A */
+ ["\u4257", "\u4257"], /* CJK Ideograph Extension A */
+ ["\u4258", "\u4258"], /* CJK Ideograph Extension A */
+ ["\u4259", "\u4259"], /* CJK Ideograph Extension A */
+ ["\u425A", "\u425A"], /* CJK Ideograph Extension A */
+ ["\u425B", "\u425B"], /* CJK Ideograph Extension A */
+ ["\u425C", "\u425C"], /* CJK Ideograph Extension A */
+ ["\u425D", "\u425D"], /* CJK Ideograph Extension A */
+ ["\u425E", "\u425E"], /* CJK Ideograph Extension A */
+ ["\u425F", "\u425F"], /* CJK Ideograph Extension A */
+ ["\u4260", "\u4260"], /* CJK Ideograph Extension A */
+ ["\u4261", "\u4261"], /* CJK Ideograph Extension A */
+ ["\u4262", "\u4262"], /* CJK Ideograph Extension A */
+ ["\u4263", "\u4263"], /* CJK Ideograph Extension A */
+ ["\u4264", "\u4264"], /* CJK Ideograph Extension A */
+ ["\u4265", "\u4265"], /* CJK Ideograph Extension A */
+ ["\u4266", "\u4266"], /* CJK Ideograph Extension A */
+ ["\u4267", "\u4267"], /* CJK Ideograph Extension A */
+ ["\u4268", "\u4268"], /* CJK Ideograph Extension A */
+ ["\u4269", "\u4269"], /* CJK Ideograph Extension A */
+ ["\u426A", "\u426A"], /* CJK Ideograph Extension A */
+ ["\u426B", "\u426B"], /* CJK Ideograph Extension A */
+ ["\u426C", "\u426C"], /* CJK Ideograph Extension A */
+ ["\u426D", "\u426D"], /* CJK Ideograph Extension A */
+ ["\u426E", "\u426E"], /* CJK Ideograph Extension A */
+ ["\u426F", "\u426F"], /* CJK Ideograph Extension A */
+ ["\u4270", "\u4270"], /* CJK Ideograph Extension A */
+ ["\u4271", "\u4271"], /* CJK Ideograph Extension A */
+ ["\u4272", "\u4272"], /* CJK Ideograph Extension A */
+ ["\u4273", "\u4273"], /* CJK Ideograph Extension A */
+ ["\u4274", "\u4274"], /* CJK Ideograph Extension A */
+ ["\u4275", "\u4275"], /* CJK Ideograph Extension A */
+ ["\u4276", "\u4276"], /* CJK Ideograph Extension A */
+ ["\u4277", "\u4277"], /* CJK Ideograph Extension A */
+ ["\u4278", "\u4278"], /* CJK Ideograph Extension A */
+ ["\u4279", "\u4279"], /* CJK Ideograph Extension A */
+ ["\u427A", "\u427A"], /* CJK Ideograph Extension A */
+ ["\u427B", "\u427B"], /* CJK Ideograph Extension A */
+ ["\u427C", "\u427C"], /* CJK Ideograph Extension A */
+ ["\u427D", "\u427D"], /* CJK Ideograph Extension A */
+ ["\u427E", "\u427E"], /* CJK Ideograph Extension A */
+ ["\u427F", "\u427F"], /* CJK Ideograph Extension A */
+ ["\u4280", "\u4280"], /* CJK Ideograph Extension A */
+ ["\u4281", "\u4281"], /* CJK Ideograph Extension A */
+ ["\u4282", "\u4282"], /* CJK Ideograph Extension A */
+ ["\u4283", "\u4283"], /* CJK Ideograph Extension A */
+ ["\u4284", "\u4284"], /* CJK Ideograph Extension A */
+ ["\u4285", "\u4285"], /* CJK Ideograph Extension A */
+ ["\u4286", "\u4286"], /* CJK Ideograph Extension A */
+ ["\u4287", "\u4287"], /* CJK Ideograph Extension A */
+ ["\u4288", "\u4288"], /* CJK Ideograph Extension A */
+ ["\u4289", "\u4289"], /* CJK Ideograph Extension A */
+ ["\u428A", "\u428A"], /* CJK Ideograph Extension A */
+ ["\u428B", "\u428B"], /* CJK Ideograph Extension A */
+ ["\u428C", "\u428C"], /* CJK Ideograph Extension A */
+ ["\u428D", "\u428D"], /* CJK Ideograph Extension A */
+ ["\u428E", "\u428E"], /* CJK Ideograph Extension A */
+ ["\u428F", "\u428F"], /* CJK Ideograph Extension A */
+ ["\u4290", "\u4290"], /* CJK Ideograph Extension A */
+ ["\u4291", "\u4291"], /* CJK Ideograph Extension A */
+ ["\u4292", "\u4292"], /* CJK Ideograph Extension A */
+ ["\u4293", "\u4293"], /* CJK Ideograph Extension A */
+ ["\u4294", "\u4294"], /* CJK Ideograph Extension A */
+ ["\u4295", "\u4295"], /* CJK Ideograph Extension A */
+ ["\u4296", "\u4296"], /* CJK Ideograph Extension A */
+ ["\u4297", "\u4297"], /* CJK Ideograph Extension A */
+ ["\u4298", "\u4298"], /* CJK Ideograph Extension A */
+ ["\u4299", "\u4299"], /* CJK Ideograph Extension A */
+ ["\u429A", "\u429A"], /* CJK Ideograph Extension A */
+ ["\u429B", "\u429B"], /* CJK Ideograph Extension A */
+ ["\u429C", "\u429C"], /* CJK Ideograph Extension A */
+ ["\u429D", "\u429D"], /* CJK Ideograph Extension A */
+ ["\u429E", "\u429E"], /* CJK Ideograph Extension A */
+ ["\u429F", "\u429F"], /* CJK Ideograph Extension A */
+ ["\u42A0", "\u42A0"], /* CJK Ideograph Extension A */
+ ["\u42A1", "\u42A1"], /* CJK Ideograph Extension A */
+ ["\u42A2", "\u42A2"], /* CJK Ideograph Extension A */
+ ["\u42A3", "\u42A3"], /* CJK Ideograph Extension A */
+ ["\u42A4", "\u42A4"], /* CJK Ideograph Extension A */
+ ["\u42A5", "\u42A5"], /* CJK Ideograph Extension A */
+ ["\u42A6", "\u42A6"], /* CJK Ideograph Extension A */
+ ["\u42A7", "\u42A7"], /* CJK Ideograph Extension A */
+ ["\u42A8", "\u42A8"], /* CJK Ideograph Extension A */
+ ["\u42A9", "\u42A9"], /* CJK Ideograph Extension A */
+ ["\u42AA", "\u42AA"], /* CJK Ideograph Extension A */
+ ["\u42AB", "\u42AB"], /* CJK Ideograph Extension A */
+ ["\u42AC", "\u42AC"], /* CJK Ideograph Extension A */
+ ["\u42AD", "\u42AD"], /* CJK Ideograph Extension A */
+ ["\u42AE", "\u42AE"], /* CJK Ideograph Extension A */
+ ["\u42AF", "\u42AF"], /* CJK Ideograph Extension A */
+ ["\u42B0", "\u42B0"], /* CJK Ideograph Extension A */
+ ["\u42B1", "\u42B1"], /* CJK Ideograph Extension A */
+ ["\u42B2", "\u42B2"], /* CJK Ideograph Extension A */
+ ["\u42B3", "\u42B3"], /* CJK Ideograph Extension A */
+ ["\u42B4", "\u42B4"], /* CJK Ideograph Extension A */
+ ["\u42B5", "\u42B5"], /* CJK Ideograph Extension A */
+ ["\u42B6", "\u42B6"], /* CJK Ideograph Extension A */
+ ["\u42B7", "\u42B7"], /* CJK Ideograph Extension A */
+ ["\u42B8", "\u42B8"], /* CJK Ideograph Extension A */
+ ["\u42B9", "\u42B9"], /* CJK Ideograph Extension A */
+ ["\u42BA", "\u42BA"], /* CJK Ideograph Extension A */
+ ["\u42BB", "\u42BB"], /* CJK Ideograph Extension A */
+ ["\u42BC", "\u42BC"], /* CJK Ideograph Extension A */
+ ["\u42BD", "\u42BD"], /* CJK Ideograph Extension A */
+ ["\u42BE", "\u42BE"], /* CJK Ideograph Extension A */
+ ["\u42BF", "\u42BF"], /* CJK Ideograph Extension A */
+ ["\u42C0", "\u42C0"], /* CJK Ideograph Extension A */
+ ["\u42C1", "\u42C1"], /* CJK Ideograph Extension A */
+ ["\u42C2", "\u42C2"], /* CJK Ideograph Extension A */
+ ["\u42C3", "\u42C3"], /* CJK Ideograph Extension A */
+ ["\u42C4", "\u42C4"], /* CJK Ideograph Extension A */
+ ["\u42C5", "\u42C5"], /* CJK Ideograph Extension A */
+ ["\u42C6", "\u42C6"], /* CJK Ideograph Extension A */
+ ["\u42C7", "\u42C7"], /* CJK Ideograph Extension A */
+ ["\u42C8", "\u42C8"], /* CJK Ideograph Extension A */
+ ["\u42C9", "\u42C9"], /* CJK Ideograph Extension A */
+ ["\u42CA", "\u42CA"], /* CJK Ideograph Extension A */
+ ["\u42CB", "\u42CB"], /* CJK Ideograph Extension A */
+ ["\u42CC", "\u42CC"], /* CJK Ideograph Extension A */
+ ["\u42CD", "\u42CD"], /* CJK Ideograph Extension A */
+ ["\u42CE", "\u42CE"], /* CJK Ideograph Extension A */
+ ["\u42CF", "\u42CF"], /* CJK Ideograph Extension A */
+ ["\u42D0", "\u42D0"], /* CJK Ideograph Extension A */
+ ["\u42D1", "\u42D1"], /* CJK Ideograph Extension A */
+ ["\u42D2", "\u42D2"], /* CJK Ideograph Extension A */
+ ["\u42D3", "\u42D3"], /* CJK Ideograph Extension A */
+ ["\u42D4", "\u42D4"], /* CJK Ideograph Extension A */
+ ["\u42D5", "\u42D5"], /* CJK Ideograph Extension A */
+ ["\u42D6", "\u42D6"], /* CJK Ideograph Extension A */
+ ["\u42D7", "\u42D7"], /* CJK Ideograph Extension A */
+ ["\u42D8", "\u42D8"], /* CJK Ideograph Extension A */
+ ["\u42D9", "\u42D9"], /* CJK Ideograph Extension A */
+ ["\u42DA", "\u42DA"], /* CJK Ideograph Extension A */
+ ["\u42DB", "\u42DB"], /* CJK Ideograph Extension A */
+ ["\u42DC", "\u42DC"], /* CJK Ideograph Extension A */
+ ["\u42DD", "\u42DD"], /* CJK Ideograph Extension A */
+ ["\u42DE", "\u42DE"], /* CJK Ideograph Extension A */
+ ["\u42DF", "\u42DF"], /* CJK Ideograph Extension A */
+ ["\u42E0", "\u42E0"], /* CJK Ideograph Extension A */
+ ["\u42E1", "\u42E1"], /* CJK Ideograph Extension A */
+ ["\u42E2", "\u42E2"], /* CJK Ideograph Extension A */
+ ["\u42E3", "\u42E3"], /* CJK Ideograph Extension A */
+ ["\u42E4", "\u42E4"], /* CJK Ideograph Extension A */
+ ["\u42E5", "\u42E5"], /* CJK Ideograph Extension A */
+ ["\u42E6", "\u42E6"], /* CJK Ideograph Extension A */
+ ["\u42E7", "\u42E7"], /* CJK Ideograph Extension A */
+ ["\u42E8", "\u42E8"], /* CJK Ideograph Extension A */
+ ["\u42E9", "\u42E9"], /* CJK Ideograph Extension A */
+ ["\u42EA", "\u42EA"], /* CJK Ideograph Extension A */
+ ["\u42EB", "\u42EB"], /* CJK Ideograph Extension A */
+ ["\u42EC", "\u42EC"], /* CJK Ideograph Extension A */
+ ["\u42ED", "\u42ED"], /* CJK Ideograph Extension A */
+ ["\u42EE", "\u42EE"], /* CJK Ideograph Extension A */
+ ["\u42EF", "\u42EF"], /* CJK Ideograph Extension A */
+ ["\u42F0", "\u42F0"], /* CJK Ideograph Extension A */
+ ["\u42F1", "\u42F1"], /* CJK Ideograph Extension A */
+ ["\u42F2", "\u42F2"], /* CJK Ideograph Extension A */
+ ["\u42F3", "\u42F3"], /* CJK Ideograph Extension A */
+ ["\u42F4", "\u42F4"], /* CJK Ideograph Extension A */
+ ["\u42F5", "\u42F5"], /* CJK Ideograph Extension A */
+ ["\u42F6", "\u42F6"], /* CJK Ideograph Extension A */
+ ["\u42F7", "\u42F7"], /* CJK Ideograph Extension A */
+ ["\u42F8", "\u42F8"], /* CJK Ideograph Extension A */
+ ["\u42F9", "\u42F9"], /* CJK Ideograph Extension A */
+ ["\u42FA", "\u42FA"], /* CJK Ideograph Extension A */
+ ["\u42FB", "\u42FB"], /* CJK Ideograph Extension A */
+ ["\u42FC", "\u42FC"], /* CJK Ideograph Extension A */
+ ["\u42FD", "\u42FD"], /* CJK Ideograph Extension A */
+ ["\u42FE", "\u42FE"], /* CJK Ideograph Extension A */
+ ["\u42FF", "\u42FF"], /* CJK Ideograph Extension A */
+ ["\u4300", "\u4300"], /* CJK Ideograph Extension A */
+ ["\u4301", "\u4301"], /* CJK Ideograph Extension A */
+ ["\u4302", "\u4302"], /* CJK Ideograph Extension A */
+ ["\u4303", "\u4303"], /* CJK Ideograph Extension A */
+ ["\u4304", "\u4304"], /* CJK Ideograph Extension A */
+ ["\u4305", "\u4305"], /* CJK Ideograph Extension A */
+ ["\u4306", "\u4306"], /* CJK Ideograph Extension A */
+ ["\u4307", "\u4307"], /* CJK Ideograph Extension A */
+ ["\u4308", "\u4308"], /* CJK Ideograph Extension A */
+ ["\u4309", "\u4309"], /* CJK Ideograph Extension A */
+ ["\u430A", "\u430A"], /* CJK Ideograph Extension A */
+ ["\u430B", "\u430B"], /* CJK Ideograph Extension A */
+ ["\u430C", "\u430C"], /* CJK Ideograph Extension A */
+ ["\u430D", "\u430D"], /* CJK Ideograph Extension A */
+ ["\u430E", "\u430E"], /* CJK Ideograph Extension A */
+ ["\u430F", "\u430F"], /* CJK Ideograph Extension A */
+ ["\u4310", "\u4310"], /* CJK Ideograph Extension A */
+ ["\u4311", "\u4311"], /* CJK Ideograph Extension A */
+ ["\u4312", "\u4312"], /* CJK Ideograph Extension A */
+ ["\u4313", "\u4313"], /* CJK Ideograph Extension A */
+ ["\u4314", "\u4314"], /* CJK Ideograph Extension A */
+ ["\u4315", "\u4315"], /* CJK Ideograph Extension A */
+ ["\u4316", "\u4316"], /* CJK Ideograph Extension A */
+ ["\u4317", "\u4317"], /* CJK Ideograph Extension A */
+ ["\u4318", "\u4318"], /* CJK Ideograph Extension A */
+ ["\u4319", "\u4319"], /* CJK Ideograph Extension A */
+ ["\u431A", "\u431A"], /* CJK Ideograph Extension A */
+ ["\u431B", "\u431B"], /* CJK Ideograph Extension A */
+ ["\u431C", "\u431C"], /* CJK Ideograph Extension A */
+ ["\u431D", "\u431D"], /* CJK Ideograph Extension A */
+ ["\u431E", "\u431E"], /* CJK Ideograph Extension A */
+ ["\u431F", "\u431F"], /* CJK Ideograph Extension A */
+ ["\u4320", "\u4320"], /* CJK Ideograph Extension A */
+ ["\u4321", "\u4321"], /* CJK Ideograph Extension A */
+ ["\u4322", "\u4322"], /* CJK Ideograph Extension A */
+ ["\u4323", "\u4323"], /* CJK Ideograph Extension A */
+ ["\u4324", "\u4324"], /* CJK Ideograph Extension A */
+ ["\u4325", "\u4325"], /* CJK Ideograph Extension A */
+ ["\u4326", "\u4326"], /* CJK Ideograph Extension A */
+ ["\u4327", "\u4327"], /* CJK Ideograph Extension A */
+ ["\u4328", "\u4328"], /* CJK Ideograph Extension A */
+ ["\u4329", "\u4329"], /* CJK Ideograph Extension A */
+ ["\u432A", "\u432A"], /* CJK Ideograph Extension A */
+ ["\u432B", "\u432B"], /* CJK Ideograph Extension A */
+ ["\u432C", "\u432C"], /* CJK Ideograph Extension A */
+ ["\u432D", "\u432D"], /* CJK Ideograph Extension A */
+ ["\u432E", "\u432E"], /* CJK Ideograph Extension A */
+ ["\u432F", "\u432F"], /* CJK Ideograph Extension A */
+ ["\u4330", "\u4330"], /* CJK Ideograph Extension A */
+ ["\u4331", "\u4331"], /* CJK Ideograph Extension A */
+ ["\u4332", "\u4332"], /* CJK Ideograph Extension A */
+ ["\u4333", "\u4333"], /* CJK Ideograph Extension A */
+ ["\u4334", "\u4334"], /* CJK Ideograph Extension A */
+ ["\u4335", "\u4335"], /* CJK Ideograph Extension A */
+ ["\u4336", "\u4336"], /* CJK Ideograph Extension A */
+ ["\u4337", "\u4337"], /* CJK Ideograph Extension A */
+ ["\u4338", "\u4338"], /* CJK Ideograph Extension A */
+ ["\u4339", "\u4339"], /* CJK Ideograph Extension A */
+ ["\u433A", "\u433A"], /* CJK Ideograph Extension A */
+ ["\u433B", "\u433B"], /* CJK Ideograph Extension A */
+ ["\u433C", "\u433C"], /* CJK Ideograph Extension A */
+ ["\u433D", "\u433D"], /* CJK Ideograph Extension A */
+ ["\u433E", "\u433E"], /* CJK Ideograph Extension A */
+ ["\u433F", "\u433F"], /* CJK Ideograph Extension A */
+ ["\u4340", "\u4340"], /* CJK Ideograph Extension A */
+ ["\u4341", "\u4341"], /* CJK Ideograph Extension A */
+ ["\u4342", "\u4342"], /* CJK Ideograph Extension A */
+ ["\u4343", "\u4343"], /* CJK Ideograph Extension A */
+ ["\u4344", "\u4344"], /* CJK Ideograph Extension A */
+ ["\u4345", "\u4345"], /* CJK Ideograph Extension A */
+ ["\u4346", "\u4346"], /* CJK Ideograph Extension A */
+ ["\u4347", "\u4347"], /* CJK Ideograph Extension A */
+ ["\u4348", "\u4348"], /* CJK Ideograph Extension A */
+ ["\u4349", "\u4349"], /* CJK Ideograph Extension A */
+ ["\u434A", "\u434A"], /* CJK Ideograph Extension A */
+ ["\u434B", "\u434B"], /* CJK Ideograph Extension A */
+ ["\u434C", "\u434C"], /* CJK Ideograph Extension A */
+ ["\u434D", "\u434D"], /* CJK Ideograph Extension A */
+ ["\u434E", "\u434E"], /* CJK Ideograph Extension A */
+ ["\u434F", "\u434F"], /* CJK Ideograph Extension A */
+ ["\u4350", "\u4350"], /* CJK Ideograph Extension A */
+ ["\u4351", "\u4351"], /* CJK Ideograph Extension A */
+ ["\u4352", "\u4352"], /* CJK Ideograph Extension A */
+ ["\u4353", "\u4353"], /* CJK Ideograph Extension A */
+ ["\u4354", "\u4354"], /* CJK Ideograph Extension A */
+ ["\u4355", "\u4355"], /* CJK Ideograph Extension A */
+ ["\u4356", "\u4356"], /* CJK Ideograph Extension A */
+ ["\u4357", "\u4357"], /* CJK Ideograph Extension A */
+ ["\u4358", "\u4358"], /* CJK Ideograph Extension A */
+ ["\u4359", "\u4359"], /* CJK Ideograph Extension A */
+ ["\u435A", "\u435A"], /* CJK Ideograph Extension A */
+ ["\u435B", "\u435B"], /* CJK Ideograph Extension A */
+ ["\u435C", "\u435C"], /* CJK Ideograph Extension A */
+ ["\u435D", "\u435D"], /* CJK Ideograph Extension A */
+ ["\u435E", "\u435E"], /* CJK Ideograph Extension A */
+ ["\u435F", "\u435F"], /* CJK Ideograph Extension A */
+ ["\u4360", "\u4360"], /* CJK Ideograph Extension A */
+ ["\u4361", "\u4361"], /* CJK Ideograph Extension A */
+ ["\u4362", "\u4362"], /* CJK Ideograph Extension A */
+ ["\u4363", "\u4363"], /* CJK Ideograph Extension A */
+ ["\u4364", "\u4364"], /* CJK Ideograph Extension A */
+ ["\u4365", "\u4365"], /* CJK Ideograph Extension A */
+ ["\u4366", "\u4366"], /* CJK Ideograph Extension A */
+ ["\u4367", "\u4367"], /* CJK Ideograph Extension A */
+ ["\u4368", "\u4368"], /* CJK Ideograph Extension A */
+ ["\u4369", "\u4369"], /* CJK Ideograph Extension A */
+ ["\u436A", "\u436A"], /* CJK Ideograph Extension A */
+ ["\u436B", "\u436B"], /* CJK Ideograph Extension A */
+ ["\u436C", "\u436C"], /* CJK Ideograph Extension A */
+ ["\u436D", "\u436D"], /* CJK Ideograph Extension A */
+ ["\u436E", "\u436E"], /* CJK Ideograph Extension A */
+ ["\u436F", "\u436F"], /* CJK Ideograph Extension A */
+ ["\u4370", "\u4370"], /* CJK Ideograph Extension A */
+ ["\u4371", "\u4371"], /* CJK Ideograph Extension A */
+ ["\u4372", "\u4372"], /* CJK Ideograph Extension A */
+ ["\u4373", "\u4373"], /* CJK Ideograph Extension A */
+ ["\u4374", "\u4374"], /* CJK Ideograph Extension A */
+ ["\u4375", "\u4375"], /* CJK Ideograph Extension A */
+ ["\u4376", "\u4376"], /* CJK Ideograph Extension A */
+ ["\u4377", "\u4377"], /* CJK Ideograph Extension A */
+ ["\u4378", "\u4378"], /* CJK Ideograph Extension A */
+ ["\u4379", "\u4379"], /* CJK Ideograph Extension A */
+ ["\u437A", "\u437A"], /* CJK Ideograph Extension A */
+ ["\u437B", "\u437B"], /* CJK Ideograph Extension A */
+ ["\u437C", "\u437C"], /* CJK Ideograph Extension A */
+ ["\u437D", "\u437D"], /* CJK Ideograph Extension A */
+ ["\u437E", "\u437E"], /* CJK Ideograph Extension A */
+ ["\u437F", "\u437F"], /* CJK Ideograph Extension A */
+ ["\u4380", "\u4380"], /* CJK Ideograph Extension A */
+ ["\u4381", "\u4381"], /* CJK Ideograph Extension A */
+ ["\u4382", "\u4382"], /* CJK Ideograph Extension A */
+ ["\u4383", "\u4383"], /* CJK Ideograph Extension A */
+ ["\u4384", "\u4384"], /* CJK Ideograph Extension A */
+ ["\u4385", "\u4385"], /* CJK Ideograph Extension A */
+ ["\u4386", "\u4386"], /* CJK Ideograph Extension A */
+ ["\u4387", "\u4387"], /* CJK Ideograph Extension A */
+ ["\u4388", "\u4388"], /* CJK Ideograph Extension A */
+ ["\u4389", "\u4389"], /* CJK Ideograph Extension A */
+ ["\u438A", "\u438A"], /* CJK Ideograph Extension A */
+ ["\u438B", "\u438B"], /* CJK Ideograph Extension A */
+ ["\u438C", "\u438C"], /* CJK Ideograph Extension A */
+ ["\u438D", "\u438D"], /* CJK Ideograph Extension A */
+ ["\u438E", "\u438E"], /* CJK Ideograph Extension A */
+ ["\u438F", "\u438F"], /* CJK Ideograph Extension A */
+ ["\u4390", "\u4390"], /* CJK Ideograph Extension A */
+ ["\u4391", "\u4391"], /* CJK Ideograph Extension A */
+ ["\u4392", "\u4392"], /* CJK Ideograph Extension A */
+ ["\u4393", "\u4393"], /* CJK Ideograph Extension A */
+ ["\u4394", "\u4394"], /* CJK Ideograph Extension A */
+ ["\u4395", "\u4395"], /* CJK Ideograph Extension A */
+ ["\u4396", "\u4396"], /* CJK Ideograph Extension A */
+ ["\u4397", "\u4397"], /* CJK Ideograph Extension A */
+ ["\u4398", "\u4398"], /* CJK Ideograph Extension A */
+ ["\u4399", "\u4399"], /* CJK Ideograph Extension A */
+ ["\u439A", "\u439A"], /* CJK Ideograph Extension A */
+ ["\u439B", "\u439B"], /* CJK Ideograph Extension A */
+ ["\u439C", "\u439C"], /* CJK Ideograph Extension A */
+ ["\u439D", "\u439D"], /* CJK Ideograph Extension A */
+ ["\u439E", "\u439E"], /* CJK Ideograph Extension A */
+ ["\u439F", "\u439F"], /* CJK Ideograph Extension A */
+ ["\u43A0", "\u43A0"], /* CJK Ideograph Extension A */
+ ["\u43A1", "\u43A1"], /* CJK Ideograph Extension A */
+ ["\u43A2", "\u43A2"], /* CJK Ideograph Extension A */
+ ["\u43A3", "\u43A3"], /* CJK Ideograph Extension A */
+ ["\u43A4", "\u43A4"], /* CJK Ideograph Extension A */
+ ["\u43A5", "\u43A5"], /* CJK Ideograph Extension A */
+ ["\u43A6", "\u43A6"], /* CJK Ideograph Extension A */
+ ["\u43A7", "\u43A7"], /* CJK Ideograph Extension A */
+ ["\u43A8", "\u43A8"], /* CJK Ideograph Extension A */
+ ["\u43A9", "\u43A9"], /* CJK Ideograph Extension A */
+ ["\u43AA", "\u43AA"], /* CJK Ideograph Extension A */
+ ["\u43AB", "\u43AB"], /* CJK Ideograph Extension A */
+ ["\u43AC", "\u43AC"], /* CJK Ideograph Extension A */
+ ["\u43AD", "\u43AD"], /* CJK Ideograph Extension A */
+ ["\u43AE", "\u43AE"], /* CJK Ideograph Extension A */
+ ["\u43AF", "\u43AF"], /* CJK Ideograph Extension A */
+ ["\u43B0", "\u43B0"], /* CJK Ideograph Extension A */
+ ["\u43B1", "\u43B1"], /* CJK Ideograph Extension A */
+ ["\u43B2", "\u43B2"], /* CJK Ideograph Extension A */
+ ["\u43B3", "\u43B3"], /* CJK Ideograph Extension A */
+ ["\u43B4", "\u43B4"], /* CJK Ideograph Extension A */
+ ["\u43B5", "\u43B5"], /* CJK Ideograph Extension A */
+ ["\u43B6", "\u43B6"], /* CJK Ideograph Extension A */
+ ["\u43B7", "\u43B7"], /* CJK Ideograph Extension A */
+ ["\u43B8", "\u43B8"], /* CJK Ideograph Extension A */
+ ["\u43B9", "\u43B9"], /* CJK Ideograph Extension A */
+ ["\u43BA", "\u43BA"], /* CJK Ideograph Extension A */
+ ["\u43BB", "\u43BB"], /* CJK Ideograph Extension A */
+ ["\u43BC", "\u43BC"], /* CJK Ideograph Extension A */
+ ["\u43BD", "\u43BD"], /* CJK Ideograph Extension A */
+ ["\u43BE", "\u43BE"], /* CJK Ideograph Extension A */
+ ["\u43BF", "\u43BF"], /* CJK Ideograph Extension A */
+ ["\u43C0", "\u43C0"], /* CJK Ideograph Extension A */
+ ["\u43C1", "\u43C1"], /* CJK Ideograph Extension A */
+ ["\u43C2", "\u43C2"], /* CJK Ideograph Extension A */
+ ["\u43C3", "\u43C3"], /* CJK Ideograph Extension A */
+ ["\u43C4", "\u43C4"], /* CJK Ideograph Extension A */
+ ["\u43C5", "\u43C5"], /* CJK Ideograph Extension A */
+ ["\u43C6", "\u43C6"], /* CJK Ideograph Extension A */
+ ["\u43C7", "\u43C7"], /* CJK Ideograph Extension A */
+ ["\u43C8", "\u43C8"], /* CJK Ideograph Extension A */
+ ["\u43C9", "\u43C9"], /* CJK Ideograph Extension A */
+ ["\u43CA", "\u43CA"], /* CJK Ideograph Extension A */
+ ["\u43CB", "\u43CB"], /* CJK Ideograph Extension A */
+ ["\u43CC", "\u43CC"], /* CJK Ideograph Extension A */
+ ["\u43CD", "\u43CD"], /* CJK Ideograph Extension A */
+ ["\u43CE", "\u43CE"], /* CJK Ideograph Extension A */
+ ["\u43CF", "\u43CF"], /* CJK Ideograph Extension A */
+ ["\u43D0", "\u43D0"], /* CJK Ideograph Extension A */
+ ["\u43D1", "\u43D1"], /* CJK Ideograph Extension A */
+ ["\u43D2", "\u43D2"], /* CJK Ideograph Extension A */
+ ["\u43D3", "\u43D3"], /* CJK Ideograph Extension A */
+ ["\u43D4", "\u43D4"], /* CJK Ideograph Extension A */
+ ["\u43D5", "\u43D5"], /* CJK Ideograph Extension A */
+ ["\u43D6", "\u43D6"], /* CJK Ideograph Extension A */
+ ["\u43D7", "\u43D7"], /* CJK Ideograph Extension A */
+ ["\u43D8", "\u43D8"], /* CJK Ideograph Extension A */
+ ["\u43D9", "\u43D9"], /* CJK Ideograph Extension A */
+ ["\u43DA", "\u43DA"], /* CJK Ideograph Extension A */
+ ["\u43DB", "\u43DB"], /* CJK Ideograph Extension A */
+ ["\u43DC", "\u43DC"], /* CJK Ideograph Extension A */
+ ["\u43DD", "\u43DD"], /* CJK Ideograph Extension A */
+ ["\u43DE", "\u43DE"], /* CJK Ideograph Extension A */
+ ["\u43DF", "\u43DF"], /* CJK Ideograph Extension A */
+ ["\u43E0", "\u43E0"], /* CJK Ideograph Extension A */
+ ["\u43E1", "\u43E1"], /* CJK Ideograph Extension A */
+ ["\u43E2", "\u43E2"], /* CJK Ideograph Extension A */
+ ["\u43E3", "\u43E3"], /* CJK Ideograph Extension A */
+ ["\u43E4", "\u43E4"], /* CJK Ideograph Extension A */
+ ["\u43E5", "\u43E5"], /* CJK Ideograph Extension A */
+ ["\u43E6", "\u43E6"], /* CJK Ideograph Extension A */
+ ["\u43E7", "\u43E7"], /* CJK Ideograph Extension A */
+ ["\u43E8", "\u43E8"], /* CJK Ideograph Extension A */
+ ["\u43E9", "\u43E9"], /* CJK Ideograph Extension A */
+ ["\u43EA", "\u43EA"], /* CJK Ideograph Extension A */
+ ["\u43EB", "\u43EB"], /* CJK Ideograph Extension A */
+ ["\u43EC", "\u43EC"], /* CJK Ideograph Extension A */
+ ["\u43ED", "\u43ED"], /* CJK Ideograph Extension A */
+ ["\u43EE", "\u43EE"], /* CJK Ideograph Extension A */
+ ["\u43EF", "\u43EF"], /* CJK Ideograph Extension A */
+ ["\u43F0", "\u43F0"], /* CJK Ideograph Extension A */
+ ["\u43F1", "\u43F1"], /* CJK Ideograph Extension A */
+ ["\u43F2", "\u43F2"], /* CJK Ideograph Extension A */
+ ["\u43F3", "\u43F3"], /* CJK Ideograph Extension A */
+ ["\u43F4", "\u43F4"], /* CJK Ideograph Extension A */
+ ["\u43F5", "\u43F5"], /* CJK Ideograph Extension A */
+ ["\u43F6", "\u43F6"], /* CJK Ideograph Extension A */
+ ["\u43F7", "\u43F7"], /* CJK Ideograph Extension A */
+ ["\u43F8", "\u43F8"], /* CJK Ideograph Extension A */
+ ["\u43F9", "\u43F9"], /* CJK Ideograph Extension A */
+ ["\u43FA", "\u43FA"], /* CJK Ideograph Extension A */
+ ["\u43FB", "\u43FB"], /* CJK Ideograph Extension A */
+ ["\u43FC", "\u43FC"], /* CJK Ideograph Extension A */
+ ["\u43FD", "\u43FD"], /* CJK Ideograph Extension A */
+ ["\u43FE", "\u43FE"], /* CJK Ideograph Extension A */
+ ["\u43FF", "\u43FF"], /* CJK Ideograph Extension A */
+ ["\u4400", "\u4400"], /* CJK Ideograph Extension A */
+ ["\u4401", "\u4401"], /* CJK Ideograph Extension A */
+ ["\u4402", "\u4402"], /* CJK Ideograph Extension A */
+ ["\u4403", "\u4403"], /* CJK Ideograph Extension A */
+ ["\u4404", "\u4404"], /* CJK Ideograph Extension A */
+ ["\u4405", "\u4405"], /* CJK Ideograph Extension A */
+ ["\u4406", "\u4406"], /* CJK Ideograph Extension A */
+ ["\u4407", "\u4407"], /* CJK Ideograph Extension A */
+ ["\u4408", "\u4408"], /* CJK Ideograph Extension A */
+ ["\u4409", "\u4409"], /* CJK Ideograph Extension A */
+ ["\u440A", "\u440A"], /* CJK Ideograph Extension A */
+ ["\u440B", "\u440B"], /* CJK Ideograph Extension A */
+ ["\u440C", "\u440C"], /* CJK Ideograph Extension A */
+ ["\u440D", "\u440D"], /* CJK Ideograph Extension A */
+ ["\u440E", "\u440E"], /* CJK Ideograph Extension A */
+ ["\u440F", "\u440F"], /* CJK Ideograph Extension A */
+ ["\u4410", "\u4410"], /* CJK Ideograph Extension A */
+ ["\u4411", "\u4411"], /* CJK Ideograph Extension A */
+ ["\u4412", "\u4412"], /* CJK Ideograph Extension A */
+ ["\u4413", "\u4413"], /* CJK Ideograph Extension A */
+ ["\u4414", "\u4414"], /* CJK Ideograph Extension A */
+ ["\u4415", "\u4415"], /* CJK Ideograph Extension A */
+ ["\u4416", "\u4416"], /* CJK Ideograph Extension A */
+ ["\u4417", "\u4417"], /* CJK Ideograph Extension A */
+ ["\u4418", "\u4418"], /* CJK Ideograph Extension A */
+ ["\u4419", "\u4419"], /* CJK Ideograph Extension A */
+ ["\u441A", "\u441A"], /* CJK Ideograph Extension A */
+ ["\u441B", "\u441B"], /* CJK Ideograph Extension A */
+ ["\u441C", "\u441C"], /* CJK Ideograph Extension A */
+ ["\u441D", "\u441D"], /* CJK Ideograph Extension A */
+ ["\u441E", "\u441E"], /* CJK Ideograph Extension A */
+ ["\u441F", "\u441F"], /* CJK Ideograph Extension A */
+ ["\u4420", "\u4420"], /* CJK Ideograph Extension A */
+ ["\u4421", "\u4421"], /* CJK Ideograph Extension A */
+ ["\u4422", "\u4422"], /* CJK Ideograph Extension A */
+ ["\u4423", "\u4423"], /* CJK Ideograph Extension A */
+ ["\u4424", "\u4424"], /* CJK Ideograph Extension A */
+ ["\u4425", "\u4425"], /* CJK Ideograph Extension A */
+ ["\u4426", "\u4426"], /* CJK Ideograph Extension A */
+ ["\u4427", "\u4427"], /* CJK Ideograph Extension A */
+ ["\u4428", "\u4428"], /* CJK Ideograph Extension A */
+ ["\u4429", "\u4429"], /* CJK Ideograph Extension A */
+ ["\u442A", "\u442A"], /* CJK Ideograph Extension A */
+ ["\u442B", "\u442B"], /* CJK Ideograph Extension A */
+ ["\u442C", "\u442C"], /* CJK Ideograph Extension A */
+ ["\u442D", "\u442D"], /* CJK Ideograph Extension A */
+ ["\u442E", "\u442E"], /* CJK Ideograph Extension A */
+ ["\u442F", "\u442F"], /* CJK Ideograph Extension A */
+ ["\u4430", "\u4430"], /* CJK Ideograph Extension A */
+ ["\u4431", "\u4431"], /* CJK Ideograph Extension A */
+ ["\u4432", "\u4432"], /* CJK Ideograph Extension A */
+ ["\u4433", "\u4433"], /* CJK Ideograph Extension A */
+ ["\u4434", "\u4434"], /* CJK Ideograph Extension A */
+ ["\u4435", "\u4435"], /* CJK Ideograph Extension A */
+ ["\u4436", "\u4436"], /* CJK Ideograph Extension A */
+ ["\u4437", "\u4437"], /* CJK Ideograph Extension A */
+ ["\u4438", "\u4438"], /* CJK Ideograph Extension A */
+ ["\u4439", "\u4439"], /* CJK Ideograph Extension A */
+ ["\u443A", "\u443A"], /* CJK Ideograph Extension A */
+ ["\u443B", "\u443B"], /* CJK Ideograph Extension A */
+ ["\u443C", "\u443C"], /* CJK Ideograph Extension A */
+ ["\u443D", "\u443D"], /* CJK Ideograph Extension A */
+ ["\u443E", "\u443E"], /* CJK Ideograph Extension A */
+ ["\u443F", "\u443F"], /* CJK Ideograph Extension A */
+ ["\u4440", "\u4440"], /* CJK Ideograph Extension A */
+ ["\u4441", "\u4441"], /* CJK Ideograph Extension A */
+ ["\u4442", "\u4442"], /* CJK Ideograph Extension A */
+ ["\u4443", "\u4443"], /* CJK Ideograph Extension A */
+ ["\u4444", "\u4444"], /* CJK Ideograph Extension A */
+ ["\u4445", "\u4445"], /* CJK Ideograph Extension A */
+ ["\u4446", "\u4446"], /* CJK Ideograph Extension A */
+ ["\u4447", "\u4447"], /* CJK Ideograph Extension A */
+ ["\u4448", "\u4448"], /* CJK Ideograph Extension A */
+ ["\u4449", "\u4449"], /* CJK Ideograph Extension A */
+ ["\u444A", "\u444A"], /* CJK Ideograph Extension A */
+ ["\u444B", "\u444B"], /* CJK Ideograph Extension A */
+ ["\u444C", "\u444C"], /* CJK Ideograph Extension A */
+ ["\u444D", "\u444D"], /* CJK Ideograph Extension A */
+ ["\u444E", "\u444E"], /* CJK Ideograph Extension A */
+ ["\u444F", "\u444F"], /* CJK Ideograph Extension A */
+ ["\u4450", "\u4450"], /* CJK Ideograph Extension A */
+ ["\u4451", "\u4451"], /* CJK Ideograph Extension A */
+ ["\u4452", "\u4452"], /* CJK Ideograph Extension A */
+ ["\u4453", "\u4453"], /* CJK Ideograph Extension A */
+ ["\u4454", "\u4454"], /* CJK Ideograph Extension A */
+ ["\u4455", "\u4455"], /* CJK Ideograph Extension A */
+ ["\u4456", "\u4456"], /* CJK Ideograph Extension A */
+ ["\u4457", "\u4457"], /* CJK Ideograph Extension A */
+ ["\u4458", "\u4458"], /* CJK Ideograph Extension A */
+ ["\u4459", "\u4459"], /* CJK Ideograph Extension A */
+ ["\u445A", "\u445A"], /* CJK Ideograph Extension A */
+ ["\u445B", "\u445B"], /* CJK Ideograph Extension A */
+ ["\u445C", "\u445C"], /* CJK Ideograph Extension A */
+ ["\u445D", "\u445D"], /* CJK Ideograph Extension A */
+ ["\u445E", "\u445E"], /* CJK Ideograph Extension A */
+ ["\u445F", "\u445F"], /* CJK Ideograph Extension A */
+ ["\u4460", "\u4460"], /* CJK Ideograph Extension A */
+ ["\u4461", "\u4461"], /* CJK Ideograph Extension A */
+ ["\u4462", "\u4462"], /* CJK Ideograph Extension A */
+ ["\u4463", "\u4463"], /* CJK Ideograph Extension A */
+ ["\u4464", "\u4464"], /* CJK Ideograph Extension A */
+ ["\u4465", "\u4465"], /* CJK Ideograph Extension A */
+ ["\u4466", "\u4466"], /* CJK Ideograph Extension A */
+ ["\u4467", "\u4467"], /* CJK Ideograph Extension A */
+ ["\u4468", "\u4468"], /* CJK Ideograph Extension A */
+ ["\u4469", "\u4469"], /* CJK Ideograph Extension A */
+ ["\u446A", "\u446A"], /* CJK Ideograph Extension A */
+ ["\u446B", "\u446B"], /* CJK Ideograph Extension A */
+ ["\u446C", "\u446C"], /* CJK Ideograph Extension A */
+ ["\u446D", "\u446D"], /* CJK Ideograph Extension A */
+ ["\u446E", "\u446E"], /* CJK Ideograph Extension A */
+ ["\u446F", "\u446F"], /* CJK Ideograph Extension A */
+ ["\u4470", "\u4470"], /* CJK Ideograph Extension A */
+ ["\u4471", "\u4471"], /* CJK Ideograph Extension A */
+ ["\u4472", "\u4472"], /* CJK Ideograph Extension A */
+ ["\u4473", "\u4473"], /* CJK Ideograph Extension A */
+ ["\u4474", "\u4474"], /* CJK Ideograph Extension A */
+ ["\u4475", "\u4475"], /* CJK Ideograph Extension A */
+ ["\u4476", "\u4476"], /* CJK Ideograph Extension A */
+ ["\u4477", "\u4477"], /* CJK Ideograph Extension A */
+ ["\u4478", "\u4478"], /* CJK Ideograph Extension A */
+ ["\u4479", "\u4479"], /* CJK Ideograph Extension A */
+ ["\u447A", "\u447A"], /* CJK Ideograph Extension A */
+ ["\u447B", "\u447B"], /* CJK Ideograph Extension A */
+ ["\u447C", "\u447C"], /* CJK Ideograph Extension A */
+ ["\u447D", "\u447D"], /* CJK Ideograph Extension A */
+ ["\u447E", "\u447E"], /* CJK Ideograph Extension A */
+ ["\u447F", "\u447F"], /* CJK Ideograph Extension A */
+ ["\u4480", "\u4480"], /* CJK Ideograph Extension A */
+ ["\u4481", "\u4481"], /* CJK Ideograph Extension A */
+ ["\u4482", "\u4482"], /* CJK Ideograph Extension A */
+ ["\u4483", "\u4483"], /* CJK Ideograph Extension A */
+ ["\u4484", "\u4484"], /* CJK Ideograph Extension A */
+ ["\u4485", "\u4485"], /* CJK Ideograph Extension A */
+ ["\u4486", "\u4486"], /* CJK Ideograph Extension A */
+ ["\u4487", "\u4487"], /* CJK Ideograph Extension A */
+ ["\u4488", "\u4488"], /* CJK Ideograph Extension A */
+ ["\u4489", "\u4489"], /* CJK Ideograph Extension A */
+ ["\u448A", "\u448A"], /* CJK Ideograph Extension A */
+ ["\u448B", "\u448B"], /* CJK Ideograph Extension A */
+ ["\u448C", "\u448C"], /* CJK Ideograph Extension A */
+ ["\u448D", "\u448D"], /* CJK Ideograph Extension A */
+ ["\u448E", "\u448E"], /* CJK Ideograph Extension A */
+ ["\u448F", "\u448F"], /* CJK Ideograph Extension A */
+ ["\u4490", "\u4490"], /* CJK Ideograph Extension A */
+ ["\u4491", "\u4491"], /* CJK Ideograph Extension A */
+ ["\u4492", "\u4492"], /* CJK Ideograph Extension A */
+ ["\u4493", "\u4493"], /* CJK Ideograph Extension A */
+ ["\u4494", "\u4494"], /* CJK Ideograph Extension A */
+ ["\u4495", "\u4495"], /* CJK Ideograph Extension A */
+ ["\u4496", "\u4496"], /* CJK Ideograph Extension A */
+ ["\u4497", "\u4497"], /* CJK Ideograph Extension A */
+ ["\u4498", "\u4498"], /* CJK Ideograph Extension A */
+ ["\u4499", "\u4499"], /* CJK Ideograph Extension A */
+ ["\u449A", "\u449A"], /* CJK Ideograph Extension A */
+ ["\u449B", "\u449B"], /* CJK Ideograph Extension A */
+ ["\u449C", "\u449C"], /* CJK Ideograph Extension A */
+ ["\u449D", "\u449D"], /* CJK Ideograph Extension A */
+ ["\u449E", "\u449E"], /* CJK Ideograph Extension A */
+ ["\u449F", "\u449F"], /* CJK Ideograph Extension A */
+ ["\u44A0", "\u44A0"], /* CJK Ideograph Extension A */
+ ["\u44A1", "\u44A1"], /* CJK Ideograph Extension A */
+ ["\u44A2", "\u44A2"], /* CJK Ideograph Extension A */
+ ["\u44A3", "\u44A3"], /* CJK Ideograph Extension A */
+ ["\u44A4", "\u44A4"], /* CJK Ideograph Extension A */
+ ["\u44A5", "\u44A5"], /* CJK Ideograph Extension A */
+ ["\u44A6", "\u44A6"], /* CJK Ideograph Extension A */
+ ["\u44A7", "\u44A7"], /* CJK Ideograph Extension A */
+ ["\u44A8", "\u44A8"], /* CJK Ideograph Extension A */
+ ["\u44A9", "\u44A9"], /* CJK Ideograph Extension A */
+ ["\u44AA", "\u44AA"], /* CJK Ideograph Extension A */
+ ["\u44AB", "\u44AB"], /* CJK Ideograph Extension A */
+ ["\u44AC", "\u44AC"], /* CJK Ideograph Extension A */
+ ["\u44AD", "\u44AD"], /* CJK Ideograph Extension A */
+ ["\u44AE", "\u44AE"], /* CJK Ideograph Extension A */
+ ["\u44AF", "\u44AF"], /* CJK Ideograph Extension A */
+ ["\u44B0", "\u44B0"], /* CJK Ideograph Extension A */
+ ["\u44B1", "\u44B1"], /* CJK Ideograph Extension A */
+ ["\u44B2", "\u44B2"], /* CJK Ideograph Extension A */
+ ["\u44B3", "\u44B3"], /* CJK Ideograph Extension A */
+ ["\u44B4", "\u44B4"], /* CJK Ideograph Extension A */
+ ["\u44B5", "\u44B5"], /* CJK Ideograph Extension A */
+ ["\u44B6", "\u44B6"], /* CJK Ideograph Extension A */
+ ["\u44B7", "\u44B7"], /* CJK Ideograph Extension A */
+ ["\u44B8", "\u44B8"], /* CJK Ideograph Extension A */
+ ["\u44B9", "\u44B9"], /* CJK Ideograph Extension A */
+ ["\u44BA", "\u44BA"], /* CJK Ideograph Extension A */
+ ["\u44BB", "\u44BB"], /* CJK Ideograph Extension A */
+ ["\u44BC", "\u44BC"], /* CJK Ideograph Extension A */
+ ["\u44BD", "\u44BD"], /* CJK Ideograph Extension A */
+ ["\u44BE", "\u44BE"], /* CJK Ideograph Extension A */
+ ["\u44BF", "\u44BF"], /* CJK Ideograph Extension A */
+ ["\u44C0", "\u44C0"], /* CJK Ideograph Extension A */
+ ["\u44C1", "\u44C1"], /* CJK Ideograph Extension A */
+ ["\u44C2", "\u44C2"], /* CJK Ideograph Extension A */
+ ["\u44C3", "\u44C3"], /* CJK Ideograph Extension A */
+ ["\u44C4", "\u44C4"], /* CJK Ideograph Extension A */
+ ["\u44C5", "\u44C5"], /* CJK Ideograph Extension A */
+ ["\u44C6", "\u44C6"], /* CJK Ideograph Extension A */
+ ["\u44C7", "\u44C7"], /* CJK Ideograph Extension A */
+ ["\u44C8", "\u44C8"], /* CJK Ideograph Extension A */
+ ["\u44C9", "\u44C9"], /* CJK Ideograph Extension A */
+ ["\u44CA", "\u44CA"], /* CJK Ideograph Extension A */
+ ["\u44CB", "\u44CB"], /* CJK Ideograph Extension A */
+ ["\u44CC", "\u44CC"], /* CJK Ideograph Extension A */
+ ["\u44CD", "\u44CD"], /* CJK Ideograph Extension A */
+ ["\u44CE", "\u44CE"], /* CJK Ideograph Extension A */
+ ["\u44CF", "\u44CF"], /* CJK Ideograph Extension A */
+ ["\u44D0", "\u44D0"], /* CJK Ideograph Extension A */
+ ["\u44D1", "\u44D1"], /* CJK Ideograph Extension A */
+ ["\u44D2", "\u44D2"], /* CJK Ideograph Extension A */
+ ["\u44D3", "\u44D3"], /* CJK Ideograph Extension A */
+ ["\u44D4", "\u44D4"], /* CJK Ideograph Extension A */
+ ["\u44D5", "\u44D5"], /* CJK Ideograph Extension A */
+ ["\u44D6", "\u44D6"], /* CJK Ideograph Extension A */
+ ["\u44D7", "\u44D7"], /* CJK Ideograph Extension A */
+ ["\u44D8", "\u44D8"], /* CJK Ideograph Extension A */
+ ["\u44D9", "\u44D9"], /* CJK Ideograph Extension A */
+ ["\u44DA", "\u44DA"], /* CJK Ideograph Extension A */
+ ["\u44DB", "\u44DB"], /* CJK Ideograph Extension A */
+ ["\u44DC", "\u44DC"], /* CJK Ideograph Extension A */
+ ["\u44DD", "\u44DD"], /* CJK Ideograph Extension A */
+ ["\u44DE", "\u44DE"], /* CJK Ideograph Extension A */
+ ["\u44DF", "\u44DF"], /* CJK Ideograph Extension A */
+ ["\u44E0", "\u44E0"], /* CJK Ideograph Extension A */
+ ["\u44E1", "\u44E1"], /* CJK Ideograph Extension A */
+ ["\u44E2", "\u44E2"], /* CJK Ideograph Extension A */
+ ["\u44E3", "\u44E3"], /* CJK Ideograph Extension A */
+ ["\u44E4", "\u44E4"], /* CJK Ideograph Extension A */
+ ["\u44E5", "\u44E5"], /* CJK Ideograph Extension A */
+ ["\u44E6", "\u44E6"], /* CJK Ideograph Extension A */
+ ["\u44E7", "\u44E7"], /* CJK Ideograph Extension A */
+ ["\u44E8", "\u44E8"], /* CJK Ideograph Extension A */
+ ["\u44E9", "\u44E9"], /* CJK Ideograph Extension A */
+ ["\u44EA", "\u44EA"], /* CJK Ideograph Extension A */
+ ["\u44EB", "\u44EB"], /* CJK Ideograph Extension A */
+ ["\u44EC", "\u44EC"], /* CJK Ideograph Extension A */
+ ["\u44ED", "\u44ED"], /* CJK Ideograph Extension A */
+ ["\u44EE", "\u44EE"], /* CJK Ideograph Extension A */
+ ["\u44EF", "\u44EF"], /* CJK Ideograph Extension A */
+ ["\u44F0", "\u44F0"], /* CJK Ideograph Extension A */
+ ["\u44F1", "\u44F1"], /* CJK Ideograph Extension A */
+ ["\u44F2", "\u44F2"], /* CJK Ideograph Extension A */
+ ["\u44F3", "\u44F3"], /* CJK Ideograph Extension A */
+ ["\u44F4", "\u44F4"], /* CJK Ideograph Extension A */
+ ["\u44F5", "\u44F5"], /* CJK Ideograph Extension A */
+ ["\u44F6", "\u44F6"], /* CJK Ideograph Extension A */
+ ["\u44F7", "\u44F7"], /* CJK Ideograph Extension A */
+ ["\u44F8", "\u44F8"], /* CJK Ideograph Extension A */
+ ["\u44F9", "\u44F9"], /* CJK Ideograph Extension A */
+ ["\u44FA", "\u44FA"], /* CJK Ideograph Extension A */
+ ["\u44FB", "\u44FB"], /* CJK Ideograph Extension A */
+ ["\u44FC", "\u44FC"], /* CJK Ideograph Extension A */
+ ["\u44FD", "\u44FD"], /* CJK Ideograph Extension A */
+ ["\u44FE", "\u44FE"], /* CJK Ideograph Extension A */
+ ["\u44FF", "\u44FF"], /* CJK Ideograph Extension A */
+ ["\u4500", "\u4500"], /* CJK Ideograph Extension A */
+ ["\u4501", "\u4501"], /* CJK Ideograph Extension A */
+ ["\u4502", "\u4502"], /* CJK Ideograph Extension A */
+ ["\u4503", "\u4503"], /* CJK Ideograph Extension A */
+ ["\u4504", "\u4504"], /* CJK Ideograph Extension A */
+ ["\u4505", "\u4505"], /* CJK Ideograph Extension A */
+ ["\u4506", "\u4506"], /* CJK Ideograph Extension A */
+ ["\u4507", "\u4507"], /* CJK Ideograph Extension A */
+ ["\u4508", "\u4508"], /* CJK Ideograph Extension A */
+ ["\u4509", "\u4509"], /* CJK Ideograph Extension A */
+ ["\u450A", "\u450A"], /* CJK Ideograph Extension A */
+ ["\u450B", "\u450B"], /* CJK Ideograph Extension A */
+ ["\u450C", "\u450C"], /* CJK Ideograph Extension A */
+ ["\u450D", "\u450D"], /* CJK Ideograph Extension A */
+ ["\u450E", "\u450E"], /* CJK Ideograph Extension A */
+ ["\u450F", "\u450F"], /* CJK Ideograph Extension A */
+ ["\u4510", "\u4510"], /* CJK Ideograph Extension A */
+ ["\u4511", "\u4511"], /* CJK Ideograph Extension A */
+ ["\u4512", "\u4512"], /* CJK Ideograph Extension A */
+ ["\u4513", "\u4513"], /* CJK Ideograph Extension A */
+ ["\u4514", "\u4514"], /* CJK Ideograph Extension A */
+ ["\u4515", "\u4515"], /* CJK Ideograph Extension A */
+ ["\u4516", "\u4516"], /* CJK Ideograph Extension A */
+ ["\u4517", "\u4517"], /* CJK Ideograph Extension A */
+ ["\u4518", "\u4518"], /* CJK Ideograph Extension A */
+ ["\u4519", "\u4519"], /* CJK Ideograph Extension A */
+ ["\u451A", "\u451A"], /* CJK Ideograph Extension A */
+ ["\u451B", "\u451B"], /* CJK Ideograph Extension A */
+ ["\u451C", "\u451C"], /* CJK Ideograph Extension A */
+ ["\u451D", "\u451D"], /* CJK Ideograph Extension A */
+ ["\u451E", "\u451E"], /* CJK Ideograph Extension A */
+ ["\u451F", "\u451F"], /* CJK Ideograph Extension A */
+ ["\u4520", "\u4520"], /* CJK Ideograph Extension A */
+ ["\u4521", "\u4521"], /* CJK Ideograph Extension A */
+ ["\u4522", "\u4522"], /* CJK Ideograph Extension A */
+ ["\u4523", "\u4523"], /* CJK Ideograph Extension A */
+ ["\u4524", "\u4524"], /* CJK Ideograph Extension A */
+ ["\u4525", "\u4525"], /* CJK Ideograph Extension A */
+ ["\u4526", "\u4526"], /* CJK Ideograph Extension A */
+ ["\u4527", "\u4527"], /* CJK Ideograph Extension A */
+ ["\u4528", "\u4528"], /* CJK Ideograph Extension A */
+ ["\u4529", "\u4529"], /* CJK Ideograph Extension A */
+ ["\u452A", "\u452A"], /* CJK Ideograph Extension A */
+ ["\u452B", "\u452B"], /* CJK Ideograph Extension A */
+ ["\u452C", "\u452C"], /* CJK Ideograph Extension A */
+ ["\u452D", "\u452D"], /* CJK Ideograph Extension A */
+ ["\u452E", "\u452E"], /* CJK Ideograph Extension A */
+ ["\u452F", "\u452F"], /* CJK Ideograph Extension A */
+ ["\u4530", "\u4530"], /* CJK Ideograph Extension A */
+ ["\u4531", "\u4531"], /* CJK Ideograph Extension A */
+ ["\u4532", "\u4532"], /* CJK Ideograph Extension A */
+ ["\u4533", "\u4533"], /* CJK Ideograph Extension A */
+ ["\u4534", "\u4534"], /* CJK Ideograph Extension A */
+ ["\u4535", "\u4535"], /* CJK Ideograph Extension A */
+ ["\u4536", "\u4536"], /* CJK Ideograph Extension A */
+ ["\u4537", "\u4537"], /* CJK Ideograph Extension A */
+ ["\u4538", "\u4538"], /* CJK Ideograph Extension A */
+ ["\u4539", "\u4539"], /* CJK Ideograph Extension A */
+ ["\u453A", "\u453A"], /* CJK Ideograph Extension A */
+ ["\u453B", "\u453B"], /* CJK Ideograph Extension A */
+ ["\u453C", "\u453C"], /* CJK Ideograph Extension A */
+ ["\u453D", "\u453D"], /* CJK Ideograph Extension A */
+ ["\u453E", "\u453E"], /* CJK Ideograph Extension A */
+ ["\u453F", "\u453F"], /* CJK Ideograph Extension A */
+ ["\u4540", "\u4540"], /* CJK Ideograph Extension A */
+ ["\u4541", "\u4541"], /* CJK Ideograph Extension A */
+ ["\u4542", "\u4542"], /* CJK Ideograph Extension A */
+ ["\u4543", "\u4543"], /* CJK Ideograph Extension A */
+ ["\u4544", "\u4544"], /* CJK Ideograph Extension A */
+ ["\u4545", "\u4545"], /* CJK Ideograph Extension A */
+ ["\u4546", "\u4546"], /* CJK Ideograph Extension A */
+ ["\u4547", "\u4547"], /* CJK Ideograph Extension A */
+ ["\u4548", "\u4548"], /* CJK Ideograph Extension A */
+ ["\u4549", "\u4549"], /* CJK Ideograph Extension A */
+ ["\u454A", "\u454A"], /* CJK Ideograph Extension A */
+ ["\u454B", "\u454B"], /* CJK Ideograph Extension A */
+ ["\u454C", "\u454C"], /* CJK Ideograph Extension A */
+ ["\u454D", "\u454D"], /* CJK Ideograph Extension A */
+ ["\u454E", "\u454E"], /* CJK Ideograph Extension A */
+ ["\u454F", "\u454F"], /* CJK Ideograph Extension A */
+ ["\u4550", "\u4550"], /* CJK Ideograph Extension A */
+ ["\u4551", "\u4551"], /* CJK Ideograph Extension A */
+ ["\u4552", "\u4552"], /* CJK Ideograph Extension A */
+ ["\u4553", "\u4553"], /* CJK Ideograph Extension A */
+ ["\u4554", "\u4554"], /* CJK Ideograph Extension A */
+ ["\u4555", "\u4555"], /* CJK Ideograph Extension A */
+ ["\u4556", "\u4556"], /* CJK Ideograph Extension A */
+ ["\u4557", "\u4557"], /* CJK Ideograph Extension A */
+ ["\u4558", "\u4558"], /* CJK Ideograph Extension A */
+ ["\u4559", "\u4559"], /* CJK Ideograph Extension A */
+ ["\u455A", "\u455A"], /* CJK Ideograph Extension A */
+ ["\u455B", "\u455B"], /* CJK Ideograph Extension A */
+ ["\u455C", "\u455C"], /* CJK Ideograph Extension A */
+ ["\u455D", "\u455D"], /* CJK Ideograph Extension A */
+ ["\u455E", "\u455E"], /* CJK Ideograph Extension A */
+ ["\u455F", "\u455F"], /* CJK Ideograph Extension A */
+ ["\u4560", "\u4560"], /* CJK Ideograph Extension A */
+ ["\u4561", "\u4561"], /* CJK Ideograph Extension A */
+ ["\u4562", "\u4562"], /* CJK Ideograph Extension A */
+ ["\u4563", "\u4563"], /* CJK Ideograph Extension A */
+ ["\u4564", "\u4564"], /* CJK Ideograph Extension A */
+ ["\u4565", "\u4565"], /* CJK Ideograph Extension A */
+ ["\u4566", "\u4566"], /* CJK Ideograph Extension A */
+ ["\u4567", "\u4567"], /* CJK Ideograph Extension A */
+ ["\u4568", "\u4568"], /* CJK Ideograph Extension A */
+ ["\u4569", "\u4569"], /* CJK Ideograph Extension A */
+ ["\u456A", "\u456A"], /* CJK Ideograph Extension A */
+ ["\u456B", "\u456B"], /* CJK Ideograph Extension A */
+ ["\u456C", "\u456C"], /* CJK Ideograph Extension A */
+ ["\u456D", "\u456D"], /* CJK Ideograph Extension A */
+ ["\u456E", "\u456E"], /* CJK Ideograph Extension A */
+ ["\u456F", "\u456F"], /* CJK Ideograph Extension A */
+ ["\u4570", "\u4570"], /* CJK Ideograph Extension A */
+ ["\u4571", "\u4571"], /* CJK Ideograph Extension A */
+ ["\u4572", "\u4572"], /* CJK Ideograph Extension A */
+ ["\u4573", "\u4573"], /* CJK Ideograph Extension A */
+ ["\u4574", "\u4574"], /* CJK Ideograph Extension A */
+ ["\u4575", "\u4575"], /* CJK Ideograph Extension A */
+ ["\u4576", "\u4576"], /* CJK Ideograph Extension A */
+ ["\u4577", "\u4577"], /* CJK Ideograph Extension A */
+ ["\u4578", "\u4578"], /* CJK Ideograph Extension A */
+ ["\u4579", "\u4579"], /* CJK Ideograph Extension A */
+ ["\u457A", "\u457A"], /* CJK Ideograph Extension A */
+ ["\u457B", "\u457B"], /* CJK Ideograph Extension A */
+ ["\u457C", "\u457C"], /* CJK Ideograph Extension A */
+ ["\u457D", "\u457D"], /* CJK Ideograph Extension A */
+ ["\u457E", "\u457E"], /* CJK Ideograph Extension A */
+ ["\u457F", "\u457F"], /* CJK Ideograph Extension A */
+ ["\u4580", "\u4580"], /* CJK Ideograph Extension A */
+ ["\u4581", "\u4581"], /* CJK Ideograph Extension A */
+ ["\u4582", "\u4582"], /* CJK Ideograph Extension A */
+ ["\u4583", "\u4583"], /* CJK Ideograph Extension A */
+ ["\u4584", "\u4584"], /* CJK Ideograph Extension A */
+ ["\u4585", "\u4585"], /* CJK Ideograph Extension A */
+ ["\u4586", "\u4586"], /* CJK Ideograph Extension A */
+ ["\u4587", "\u4587"], /* CJK Ideograph Extension A */
+ ["\u4588", "\u4588"], /* CJK Ideograph Extension A */
+ ["\u4589", "\u4589"], /* CJK Ideograph Extension A */
+ ["\u458A", "\u458A"], /* CJK Ideograph Extension A */
+ ["\u458B", "\u458B"], /* CJK Ideograph Extension A */
+ ["\u458C", "\u458C"], /* CJK Ideograph Extension A */
+ ["\u458D", "\u458D"], /* CJK Ideograph Extension A */
+ ["\u458E", "\u458E"], /* CJK Ideograph Extension A */
+ ["\u458F", "\u458F"], /* CJK Ideograph Extension A */
+ ["\u4590", "\u4590"], /* CJK Ideograph Extension A */
+ ["\u4591", "\u4591"], /* CJK Ideograph Extension A */
+ ["\u4592", "\u4592"], /* CJK Ideograph Extension A */
+ ["\u4593", "\u4593"], /* CJK Ideograph Extension A */
+ ["\u4594", "\u4594"], /* CJK Ideograph Extension A */
+ ["\u4595", "\u4595"], /* CJK Ideograph Extension A */
+ ["\u4596", "\u4596"], /* CJK Ideograph Extension A */
+ ["\u4597", "\u4597"], /* CJK Ideograph Extension A */
+ ["\u4598", "\u4598"], /* CJK Ideograph Extension A */
+ ["\u4599", "\u4599"], /* CJK Ideograph Extension A */
+ ["\u459A", "\u459A"], /* CJK Ideograph Extension A */
+ ["\u459B", "\u459B"], /* CJK Ideograph Extension A */
+ ["\u459C", "\u459C"], /* CJK Ideograph Extension A */
+ ["\u459D", "\u459D"], /* CJK Ideograph Extension A */
+ ["\u459E", "\u459E"], /* CJK Ideograph Extension A */
+ ["\u459F", "\u459F"], /* CJK Ideograph Extension A */
+ ["\u45A0", "\u45A0"], /* CJK Ideograph Extension A */
+ ["\u45A1", "\u45A1"], /* CJK Ideograph Extension A */
+ ["\u45A2", "\u45A2"], /* CJK Ideograph Extension A */
+ ["\u45A3", "\u45A3"], /* CJK Ideograph Extension A */
+ ["\u45A4", "\u45A4"], /* CJK Ideograph Extension A */
+ ["\u45A5", "\u45A5"], /* CJK Ideograph Extension A */
+ ["\u45A6", "\u45A6"], /* CJK Ideograph Extension A */
+ ["\u45A7", "\u45A7"], /* CJK Ideograph Extension A */
+ ["\u45A8", "\u45A8"], /* CJK Ideograph Extension A */
+ ["\u45A9", "\u45A9"], /* CJK Ideograph Extension A */
+ ["\u45AA", "\u45AA"], /* CJK Ideograph Extension A */
+ ["\u45AB", "\u45AB"], /* CJK Ideograph Extension A */
+ ["\u45AC", "\u45AC"], /* CJK Ideograph Extension A */
+ ["\u45AD", "\u45AD"], /* CJK Ideograph Extension A */
+ ["\u45AE", "\u45AE"], /* CJK Ideograph Extension A */
+ ["\u45AF", "\u45AF"], /* CJK Ideograph Extension A */
+ ["\u45B0", "\u45B0"], /* CJK Ideograph Extension A */
+ ["\u45B1", "\u45B1"], /* CJK Ideograph Extension A */
+ ["\u45B2", "\u45B2"], /* CJK Ideograph Extension A */
+ ["\u45B3", "\u45B3"], /* CJK Ideograph Extension A */
+ ["\u45B4", "\u45B4"], /* CJK Ideograph Extension A */
+ ["\u45B5", "\u45B5"], /* CJK Ideograph Extension A */
+ ["\u45B6", "\u45B6"], /* CJK Ideograph Extension A */
+ ["\u45B7", "\u45B7"], /* CJK Ideograph Extension A */
+ ["\u45B8", "\u45B8"], /* CJK Ideograph Extension A */
+ ["\u45B9", "\u45B9"], /* CJK Ideograph Extension A */
+ ["\u45BA", "\u45BA"], /* CJK Ideograph Extension A */
+ ["\u45BB", "\u45BB"], /* CJK Ideograph Extension A */
+ ["\u45BC", "\u45BC"], /* CJK Ideograph Extension A */
+ ["\u45BD", "\u45BD"], /* CJK Ideograph Extension A */
+ ["\u45BE", "\u45BE"], /* CJK Ideograph Extension A */
+ ["\u45BF", "\u45BF"], /* CJK Ideograph Extension A */
+ ["\u45C0", "\u45C0"], /* CJK Ideograph Extension A */
+ ["\u45C1", "\u45C1"], /* CJK Ideograph Extension A */
+ ["\u45C2", "\u45C2"], /* CJK Ideograph Extension A */
+ ["\u45C3", "\u45C3"], /* CJK Ideograph Extension A */
+ ["\u45C4", "\u45C4"], /* CJK Ideograph Extension A */
+ ["\u45C5", "\u45C5"], /* CJK Ideograph Extension A */
+ ["\u45C6", "\u45C6"], /* CJK Ideograph Extension A */
+ ["\u45C7", "\u45C7"], /* CJK Ideograph Extension A */
+ ["\u45C8", "\u45C8"], /* CJK Ideograph Extension A */
+ ["\u45C9", "\u45C9"], /* CJK Ideograph Extension A */
+ ["\u45CA", "\u45CA"], /* CJK Ideograph Extension A */
+ ["\u45CB", "\u45CB"], /* CJK Ideograph Extension A */
+ ["\u45CC", "\u45CC"], /* CJK Ideograph Extension A */
+ ["\u45CD", "\u45CD"], /* CJK Ideograph Extension A */
+ ["\u45CE", "\u45CE"], /* CJK Ideograph Extension A */
+ ["\u45CF", "\u45CF"], /* CJK Ideograph Extension A */
+ ["\u45D0", "\u45D0"], /* CJK Ideograph Extension A */
+ ["\u45D1", "\u45D1"], /* CJK Ideograph Extension A */
+ ["\u45D2", "\u45D2"], /* CJK Ideograph Extension A */
+ ["\u45D3", "\u45D3"], /* CJK Ideograph Extension A */
+ ["\u45D4", "\u45D4"], /* CJK Ideograph Extension A */
+ ["\u45D5", "\u45D5"], /* CJK Ideograph Extension A */
+ ["\u45D6", "\u45D6"], /* CJK Ideograph Extension A */
+ ["\u45D7", "\u45D7"], /* CJK Ideograph Extension A */
+ ["\u45D8", "\u45D8"], /* CJK Ideograph Extension A */
+ ["\u45D9", "\u45D9"], /* CJK Ideograph Extension A */
+ ["\u45DA", "\u45DA"], /* CJK Ideograph Extension A */
+ ["\u45DB", "\u45DB"], /* CJK Ideograph Extension A */
+ ["\u45DC", "\u45DC"], /* CJK Ideograph Extension A */
+ ["\u45DD", "\u45DD"], /* CJK Ideograph Extension A */
+ ["\u45DE", "\u45DE"], /* CJK Ideograph Extension A */
+ ["\u45DF", "\u45DF"], /* CJK Ideograph Extension A */
+ ["\u45E0", "\u45E0"], /* CJK Ideograph Extension A */
+ ["\u45E1", "\u45E1"], /* CJK Ideograph Extension A */
+ ["\u45E2", "\u45E2"], /* CJK Ideograph Extension A */
+ ["\u45E3", "\u45E3"], /* CJK Ideograph Extension A */
+ ["\u45E4", "\u45E4"], /* CJK Ideograph Extension A */
+ ["\u45E5", "\u45E5"], /* CJK Ideograph Extension A */
+ ["\u45E6", "\u45E6"], /* CJK Ideograph Extension A */
+ ["\u45E7", "\u45E7"], /* CJK Ideograph Extension A */
+ ["\u45E8", "\u45E8"], /* CJK Ideograph Extension A */
+ ["\u45E9", "\u45E9"], /* CJK Ideograph Extension A */
+ ["\u45EA", "\u45EA"], /* CJK Ideograph Extension A */
+ ["\u45EB", "\u45EB"], /* CJK Ideograph Extension A */
+ ["\u45EC", "\u45EC"], /* CJK Ideograph Extension A */
+ ["\u45ED", "\u45ED"], /* CJK Ideograph Extension A */
+ ["\u45EE", "\u45EE"], /* CJK Ideograph Extension A */
+ ["\u45EF", "\u45EF"], /* CJK Ideograph Extension A */
+ ["\u45F0", "\u45F0"], /* CJK Ideograph Extension A */
+ ["\u45F1", "\u45F1"], /* CJK Ideograph Extension A */
+ ["\u45F2", "\u45F2"], /* CJK Ideograph Extension A */
+ ["\u45F3", "\u45F3"], /* CJK Ideograph Extension A */
+ ["\u45F4", "\u45F4"], /* CJK Ideograph Extension A */
+ ["\u45F5", "\u45F5"], /* CJK Ideograph Extension A */
+ ["\u45F6", "\u45F6"], /* CJK Ideograph Extension A */
+ ["\u45F7", "\u45F7"], /* CJK Ideograph Extension A */
+ ["\u45F8", "\u45F8"], /* CJK Ideograph Extension A */
+ ["\u45F9", "\u45F9"], /* CJK Ideograph Extension A */
+ ["\u45FA", "\u45FA"], /* CJK Ideograph Extension A */
+ ["\u45FB", "\u45FB"], /* CJK Ideograph Extension A */
+ ["\u45FC", "\u45FC"], /* CJK Ideograph Extension A */
+ ["\u45FD", "\u45FD"], /* CJK Ideograph Extension A */
+ ["\u45FE", "\u45FE"], /* CJK Ideograph Extension A */
+ ["\u45FF", "\u45FF"], /* CJK Ideograph Extension A */
+ ["\u4600", "\u4600"], /* CJK Ideograph Extension A */
+ ["\u4601", "\u4601"], /* CJK Ideograph Extension A */
+ ["\u4602", "\u4602"], /* CJK Ideograph Extension A */
+ ["\u4603", "\u4603"], /* CJK Ideograph Extension A */
+ ["\u4604", "\u4604"], /* CJK Ideograph Extension A */
+ ["\u4605", "\u4605"], /* CJK Ideograph Extension A */
+ ["\u4606", "\u4606"], /* CJK Ideograph Extension A */
+ ["\u4607", "\u4607"], /* CJK Ideograph Extension A */
+ ["\u4608", "\u4608"], /* CJK Ideograph Extension A */
+ ["\u4609", "\u4609"], /* CJK Ideograph Extension A */
+ ["\u460A", "\u460A"], /* CJK Ideograph Extension A */
+ ["\u460B", "\u460B"], /* CJK Ideograph Extension A */
+ ["\u460C", "\u460C"], /* CJK Ideograph Extension A */
+ ["\u460D", "\u460D"], /* CJK Ideograph Extension A */
+ ["\u460E", "\u460E"], /* CJK Ideograph Extension A */
+ ["\u460F", "\u460F"], /* CJK Ideograph Extension A */
+ ["\u4610", "\u4610"], /* CJK Ideograph Extension A */
+ ["\u4611", "\u4611"], /* CJK Ideograph Extension A */
+ ["\u4612", "\u4612"], /* CJK Ideograph Extension A */
+ ["\u4613", "\u4613"], /* CJK Ideograph Extension A */
+ ["\u4614", "\u4614"], /* CJK Ideograph Extension A */
+ ["\u4615", "\u4615"], /* CJK Ideograph Extension A */
+ ["\u4616", "\u4616"], /* CJK Ideograph Extension A */
+ ["\u4617", "\u4617"], /* CJK Ideograph Extension A */
+ ["\u4618", "\u4618"], /* CJK Ideograph Extension A */
+ ["\u4619", "\u4619"], /* CJK Ideograph Extension A */
+ ["\u461A", "\u461A"], /* CJK Ideograph Extension A */
+ ["\u461B", "\u461B"], /* CJK Ideograph Extension A */
+ ["\u461C", "\u461C"], /* CJK Ideograph Extension A */
+ ["\u461D", "\u461D"], /* CJK Ideograph Extension A */
+ ["\u461E", "\u461E"], /* CJK Ideograph Extension A */
+ ["\u461F", "\u461F"], /* CJK Ideograph Extension A */
+ ["\u4620", "\u4620"], /* CJK Ideograph Extension A */
+ ["\u4621", "\u4621"], /* CJK Ideograph Extension A */
+ ["\u4622", "\u4622"], /* CJK Ideograph Extension A */
+ ["\u4623", "\u4623"], /* CJK Ideograph Extension A */
+ ["\u4624", "\u4624"], /* CJK Ideograph Extension A */
+ ["\u4625", "\u4625"], /* CJK Ideograph Extension A */
+ ["\u4626", "\u4626"], /* CJK Ideograph Extension A */
+ ["\u4627", "\u4627"], /* CJK Ideograph Extension A */
+ ["\u4628", "\u4628"], /* CJK Ideograph Extension A */
+ ["\u4629", "\u4629"], /* CJK Ideograph Extension A */
+ ["\u462A", "\u462A"], /* CJK Ideograph Extension A */
+ ["\u462B", "\u462B"], /* CJK Ideograph Extension A */
+ ["\u462C", "\u462C"], /* CJK Ideograph Extension A */
+ ["\u462D", "\u462D"], /* CJK Ideograph Extension A */
+ ["\u462E", "\u462E"], /* CJK Ideograph Extension A */
+ ["\u462F", "\u462F"], /* CJK Ideograph Extension A */
+ ["\u4630", "\u4630"], /* CJK Ideograph Extension A */
+ ["\u4631", "\u4631"], /* CJK Ideograph Extension A */
+ ["\u4632", "\u4632"], /* CJK Ideograph Extension A */
+ ["\u4633", "\u4633"], /* CJK Ideograph Extension A */
+ ["\u4634", "\u4634"], /* CJK Ideograph Extension A */
+ ["\u4635", "\u4635"], /* CJK Ideograph Extension A */
+ ["\u4636", "\u4636"], /* CJK Ideograph Extension A */
+ ["\u4637", "\u4637"], /* CJK Ideograph Extension A */
+ ["\u4638", "\u4638"], /* CJK Ideograph Extension A */
+ ["\u4639", "\u4639"], /* CJK Ideograph Extension A */
+ ["\u463A", "\u463A"], /* CJK Ideograph Extension A */
+ ["\u463B", "\u463B"], /* CJK Ideograph Extension A */
+ ["\u463C", "\u463C"], /* CJK Ideograph Extension A */
+ ["\u463D", "\u463D"], /* CJK Ideograph Extension A */
+ ["\u463E", "\u463E"], /* CJK Ideograph Extension A */
+ ["\u463F", "\u463F"], /* CJK Ideograph Extension A */
+ ["\u4640", "\u4640"], /* CJK Ideograph Extension A */
+ ["\u4641", "\u4641"], /* CJK Ideograph Extension A */
+ ["\u4642", "\u4642"], /* CJK Ideograph Extension A */
+ ["\u4643", "\u4643"], /* CJK Ideograph Extension A */
+ ["\u4644", "\u4644"], /* CJK Ideograph Extension A */
+ ["\u4645", "\u4645"], /* CJK Ideograph Extension A */
+ ["\u4646", "\u4646"], /* CJK Ideograph Extension A */
+ ["\u4647", "\u4647"], /* CJK Ideograph Extension A */
+ ["\u4648", "\u4648"], /* CJK Ideograph Extension A */
+ ["\u4649", "\u4649"], /* CJK Ideograph Extension A */
+ ["\u464A", "\u464A"], /* CJK Ideograph Extension A */
+ ["\u464B", "\u464B"], /* CJK Ideograph Extension A */
+ ["\u464C", "\u464C"], /* CJK Ideograph Extension A */
+ ["\u464D", "\u464D"], /* CJK Ideograph Extension A */
+ ["\u464E", "\u464E"], /* CJK Ideograph Extension A */
+ ["\u464F", "\u464F"], /* CJK Ideograph Extension A */
+ ["\u4650", "\u4650"], /* CJK Ideograph Extension A */
+ ["\u4651", "\u4651"], /* CJK Ideograph Extension A */
+ ["\u4652", "\u4652"], /* CJK Ideograph Extension A */
+ ["\u4653", "\u4653"], /* CJK Ideograph Extension A */
+ ["\u4654", "\u4654"], /* CJK Ideograph Extension A */
+ ["\u4655", "\u4655"], /* CJK Ideograph Extension A */
+ ["\u4656", "\u4656"], /* CJK Ideograph Extension A */
+ ["\u4657", "\u4657"], /* CJK Ideograph Extension A */
+ ["\u4658", "\u4658"], /* CJK Ideograph Extension A */
+ ["\u4659", "\u4659"], /* CJK Ideograph Extension A */
+ ["\u465A", "\u465A"], /* CJK Ideograph Extension A */
+ ["\u465B", "\u465B"], /* CJK Ideograph Extension A */
+ ["\u465C", "\u465C"], /* CJK Ideograph Extension A */
+ ["\u465D", "\u465D"], /* CJK Ideograph Extension A */
+ ["\u465E", "\u465E"], /* CJK Ideograph Extension A */
+ ["\u465F", "\u465F"], /* CJK Ideograph Extension A */
+ ["\u4660", "\u4660"], /* CJK Ideograph Extension A */
+ ["\u4661", "\u4661"], /* CJK Ideograph Extension A */
+ ["\u4662", "\u4662"], /* CJK Ideograph Extension A */
+ ["\u4663", "\u4663"], /* CJK Ideograph Extension A */
+ ["\u4664", "\u4664"], /* CJK Ideograph Extension A */
+ ["\u4665", "\u4665"], /* CJK Ideograph Extension A */
+ ["\u4666", "\u4666"], /* CJK Ideograph Extension A */
+ ["\u4667", "\u4667"], /* CJK Ideograph Extension A */
+ ["\u4668", "\u4668"], /* CJK Ideograph Extension A */
+ ["\u4669", "\u4669"], /* CJK Ideograph Extension A */
+ ["\u466A", "\u466A"], /* CJK Ideograph Extension A */
+ ["\u466B", "\u466B"], /* CJK Ideograph Extension A */
+ ["\u466C", "\u466C"], /* CJK Ideograph Extension A */
+ ["\u466D", "\u466D"], /* CJK Ideograph Extension A */
+ ["\u466E", "\u466E"], /* CJK Ideograph Extension A */
+ ["\u466F", "\u466F"], /* CJK Ideograph Extension A */
+ ["\u4670", "\u4670"], /* CJK Ideograph Extension A */
+ ["\u4671", "\u4671"], /* CJK Ideograph Extension A */
+ ["\u4672", "\u4672"], /* CJK Ideograph Extension A */
+ ["\u4673", "\u4673"], /* CJK Ideograph Extension A */
+ ["\u4674", "\u4674"], /* CJK Ideograph Extension A */
+ ["\u4675", "\u4675"], /* CJK Ideograph Extension A */
+ ["\u4676", "\u4676"], /* CJK Ideograph Extension A */
+ ["\u4677", "\u4677"], /* CJK Ideograph Extension A */
+ ["\u4678", "\u4678"], /* CJK Ideograph Extension A */
+ ["\u4679", "\u4679"], /* CJK Ideograph Extension A */
+ ["\u467A", "\u467A"], /* CJK Ideograph Extension A */
+ ["\u467B", "\u467B"], /* CJK Ideograph Extension A */
+ ["\u467C", "\u467C"], /* CJK Ideograph Extension A */
+ ["\u467D", "\u467D"], /* CJK Ideograph Extension A */
+ ["\u467E", "\u467E"], /* CJK Ideograph Extension A */
+ ["\u467F", "\u467F"], /* CJK Ideograph Extension A */
+ ["\u4680", "\u4680"], /* CJK Ideograph Extension A */
+ ["\u4681", "\u4681"], /* CJK Ideograph Extension A */
+ ["\u4682", "\u4682"], /* CJK Ideograph Extension A */
+ ["\u4683", "\u4683"], /* CJK Ideograph Extension A */
+ ["\u4684", "\u4684"], /* CJK Ideograph Extension A */
+ ["\u4685", "\u4685"], /* CJK Ideograph Extension A */
+ ["\u4686", "\u4686"], /* CJK Ideograph Extension A */
+ ["\u4687", "\u4687"], /* CJK Ideograph Extension A */
+ ["\u4688", "\u4688"], /* CJK Ideograph Extension A */
+ ["\u4689", "\u4689"], /* CJK Ideograph Extension A */
+ ["\u468A", "\u468A"], /* CJK Ideograph Extension A */
+ ["\u468B", "\u468B"], /* CJK Ideograph Extension A */
+ ["\u468C", "\u468C"], /* CJK Ideograph Extension A */
+ ["\u468D", "\u468D"], /* CJK Ideograph Extension A */
+ ["\u468E", "\u468E"], /* CJK Ideograph Extension A */
+ ["\u468F", "\u468F"], /* CJK Ideograph Extension A */
+ ["\u4690", "\u4690"], /* CJK Ideograph Extension A */
+ ["\u4691", "\u4691"], /* CJK Ideograph Extension A */
+ ["\u4692", "\u4692"], /* CJK Ideograph Extension A */
+ ["\u4693", "\u4693"], /* CJK Ideograph Extension A */
+ ["\u4694", "\u4694"], /* CJK Ideograph Extension A */
+ ["\u4695", "\u4695"], /* CJK Ideograph Extension A */
+ ["\u4696", "\u4696"], /* CJK Ideograph Extension A */
+ ["\u4697", "\u4697"], /* CJK Ideograph Extension A */
+ ["\u4698", "\u4698"], /* CJK Ideograph Extension A */
+ ["\u4699", "\u4699"], /* CJK Ideograph Extension A */
+ ["\u469A", "\u469A"], /* CJK Ideograph Extension A */
+ ["\u469B", "\u469B"], /* CJK Ideograph Extension A */
+ ["\u469C", "\u469C"], /* CJK Ideograph Extension A */
+ ["\u469D", "\u469D"], /* CJK Ideograph Extension A */
+ ["\u469E", "\u469E"], /* CJK Ideograph Extension A */
+ ["\u469F", "\u469F"], /* CJK Ideograph Extension A */
+ ["\u46A0", "\u46A0"], /* CJK Ideograph Extension A */
+ ["\u46A1", "\u46A1"], /* CJK Ideograph Extension A */
+ ["\u46A2", "\u46A2"], /* CJK Ideograph Extension A */
+ ["\u46A3", "\u46A3"], /* CJK Ideograph Extension A */
+ ["\u46A4", "\u46A4"], /* CJK Ideograph Extension A */
+ ["\u46A5", "\u46A5"], /* CJK Ideograph Extension A */
+ ["\u46A6", "\u46A6"], /* CJK Ideograph Extension A */
+ ["\u46A7", "\u46A7"], /* CJK Ideograph Extension A */
+ ["\u46A8", "\u46A8"], /* CJK Ideograph Extension A */
+ ["\u46A9", "\u46A9"], /* CJK Ideograph Extension A */
+ ["\u46AA", "\u46AA"], /* CJK Ideograph Extension A */
+ ["\u46AB", "\u46AB"], /* CJK Ideograph Extension A */
+ ["\u46AC", "\u46AC"], /* CJK Ideograph Extension A */
+ ["\u46AD", "\u46AD"], /* CJK Ideograph Extension A */
+ ["\u46AE", "\u46AE"], /* CJK Ideograph Extension A */
+ ["\u46AF", "\u46AF"], /* CJK Ideograph Extension A */
+ ["\u46B0", "\u46B0"], /* CJK Ideograph Extension A */
+ ["\u46B1", "\u46B1"], /* CJK Ideograph Extension A */
+ ["\u46B2", "\u46B2"], /* CJK Ideograph Extension A */
+ ["\u46B3", "\u46B3"], /* CJK Ideograph Extension A */
+ ["\u46B4", "\u46B4"], /* CJK Ideograph Extension A */
+ ["\u46B5", "\u46B5"], /* CJK Ideograph Extension A */
+ ["\u46B6", "\u46B6"], /* CJK Ideograph Extension A */
+ ["\u46B7", "\u46B7"], /* CJK Ideograph Extension A */
+ ["\u46B8", "\u46B8"], /* CJK Ideograph Extension A */
+ ["\u46B9", "\u46B9"], /* CJK Ideograph Extension A */
+ ["\u46BA", "\u46BA"], /* CJK Ideograph Extension A */
+ ["\u46BB", "\u46BB"], /* CJK Ideograph Extension A */
+ ["\u46BC", "\u46BC"], /* CJK Ideograph Extension A */
+ ["\u46BD", "\u46BD"], /* CJK Ideograph Extension A */
+ ["\u46BE", "\u46BE"], /* CJK Ideograph Extension A */
+ ["\u46BF", "\u46BF"], /* CJK Ideograph Extension A */
+ ["\u46C0", "\u46C0"], /* CJK Ideograph Extension A */
+ ["\u46C1", "\u46C1"], /* CJK Ideograph Extension A */
+ ["\u46C2", "\u46C2"], /* CJK Ideograph Extension A */
+ ["\u46C3", "\u46C3"], /* CJK Ideograph Extension A */
+ ["\u46C4", "\u46C4"], /* CJK Ideograph Extension A */
+ ["\u46C5", "\u46C5"], /* CJK Ideograph Extension A */
+ ["\u46C6", "\u46C6"], /* CJK Ideograph Extension A */
+ ["\u46C7", "\u46C7"], /* CJK Ideograph Extension A */
+ ["\u46C8", "\u46C8"], /* CJK Ideograph Extension A */
+ ["\u46C9", "\u46C9"], /* CJK Ideograph Extension A */
+ ["\u46CA", "\u46CA"], /* CJK Ideograph Extension A */
+ ["\u46CB", "\u46CB"], /* CJK Ideograph Extension A */
+ ["\u46CC", "\u46CC"], /* CJK Ideograph Extension A */
+ ["\u46CD", "\u46CD"], /* CJK Ideograph Extension A */
+ ["\u46CE", "\u46CE"], /* CJK Ideograph Extension A */
+ ["\u46CF", "\u46CF"], /* CJK Ideograph Extension A */
+ ["\u46D0", "\u46D0"], /* CJK Ideograph Extension A */
+ ["\u46D1", "\u46D1"], /* CJK Ideograph Extension A */
+ ["\u46D2", "\u46D2"], /* CJK Ideograph Extension A */
+ ["\u46D3", "\u46D3"], /* CJK Ideograph Extension A */
+ ["\u46D4", "\u46D4"], /* CJK Ideograph Extension A */
+ ["\u46D5", "\u46D5"], /* CJK Ideograph Extension A */
+ ["\u46D6", "\u46D6"], /* CJK Ideograph Extension A */
+ ["\u46D7", "\u46D7"], /* CJK Ideograph Extension A */
+ ["\u46D8", "\u46D8"], /* CJK Ideograph Extension A */
+ ["\u46D9", "\u46D9"], /* CJK Ideograph Extension A */
+ ["\u46DA", "\u46DA"], /* CJK Ideograph Extension A */
+ ["\u46DB", "\u46DB"], /* CJK Ideograph Extension A */
+ ["\u46DC", "\u46DC"], /* CJK Ideograph Extension A */
+ ["\u46DD", "\u46DD"], /* CJK Ideograph Extension A */
+ ["\u46DE", "\u46DE"], /* CJK Ideograph Extension A */
+ ["\u46DF", "\u46DF"], /* CJK Ideograph Extension A */
+ ["\u46E0", "\u46E0"], /* CJK Ideograph Extension A */
+ ["\u46E1", "\u46E1"], /* CJK Ideograph Extension A */
+ ["\u46E2", "\u46E2"], /* CJK Ideograph Extension A */
+ ["\u46E3", "\u46E3"], /* CJK Ideograph Extension A */
+ ["\u46E4", "\u46E4"], /* CJK Ideograph Extension A */
+ ["\u46E5", "\u46E5"], /* CJK Ideograph Extension A */
+ ["\u46E6", "\u46E6"], /* CJK Ideograph Extension A */
+ ["\u46E7", "\u46E7"], /* CJK Ideograph Extension A */
+ ["\u46E8", "\u46E8"], /* CJK Ideograph Extension A */
+ ["\u46E9", "\u46E9"], /* CJK Ideograph Extension A */
+ ["\u46EA", "\u46EA"], /* CJK Ideograph Extension A */
+ ["\u46EB", "\u46EB"], /* CJK Ideograph Extension A */
+ ["\u46EC", "\u46EC"], /* CJK Ideograph Extension A */
+ ["\u46ED", "\u46ED"], /* CJK Ideograph Extension A */
+ ["\u46EE", "\u46EE"], /* CJK Ideograph Extension A */
+ ["\u46EF", "\u46EF"], /* CJK Ideograph Extension A */
+ ["\u46F0", "\u46F0"], /* CJK Ideograph Extension A */
+ ["\u46F1", "\u46F1"], /* CJK Ideograph Extension A */
+ ["\u46F2", "\u46F2"], /* CJK Ideograph Extension A */
+ ["\u46F3", "\u46F3"], /* CJK Ideograph Extension A */
+ ["\u46F4", "\u46F4"], /* CJK Ideograph Extension A */
+ ["\u46F5", "\u46F5"], /* CJK Ideograph Extension A */
+ ["\u46F6", "\u46F6"], /* CJK Ideograph Extension A */
+ ["\u46F7", "\u46F7"], /* CJK Ideograph Extension A */
+ ["\u46F8", "\u46F8"], /* CJK Ideograph Extension A */
+ ["\u46F9", "\u46F9"], /* CJK Ideograph Extension A */
+ ["\u46FA", "\u46FA"], /* CJK Ideograph Extension A */
+ ["\u46FB", "\u46FB"], /* CJK Ideograph Extension A */
+ ["\u46FC", "\u46FC"], /* CJK Ideograph Extension A */
+ ["\u46FD", "\u46FD"], /* CJK Ideograph Extension A */
+ ["\u46FE", "\u46FE"], /* CJK Ideograph Extension A */
+ ["\u46FF", "\u46FF"], /* CJK Ideograph Extension A */
+ ["\u4700", "\u4700"], /* CJK Ideograph Extension A */
+ ["\u4701", "\u4701"], /* CJK Ideograph Extension A */
+ ["\u4702", "\u4702"], /* CJK Ideograph Extension A */
+ ["\u4703", "\u4703"], /* CJK Ideograph Extension A */
+ ["\u4704", "\u4704"], /* CJK Ideograph Extension A */
+ ["\u4705", "\u4705"], /* CJK Ideograph Extension A */
+ ["\u4706", "\u4706"], /* CJK Ideograph Extension A */
+ ["\u4707", "\u4707"], /* CJK Ideograph Extension A */
+ ["\u4708", "\u4708"], /* CJK Ideograph Extension A */
+ ["\u4709", "\u4709"], /* CJK Ideograph Extension A */
+ ["\u470A", "\u470A"], /* CJK Ideograph Extension A */
+ ["\u470B", "\u470B"], /* CJK Ideograph Extension A */
+ ["\u470C", "\u470C"], /* CJK Ideograph Extension A */
+ ["\u470D", "\u470D"], /* CJK Ideograph Extension A */
+ ["\u470E", "\u470E"], /* CJK Ideograph Extension A */
+ ["\u470F", "\u470F"], /* CJK Ideograph Extension A */
+ ["\u4710", "\u4710"], /* CJK Ideograph Extension A */
+ ["\u4711", "\u4711"], /* CJK Ideograph Extension A */
+ ["\u4712", "\u4712"], /* CJK Ideograph Extension A */
+ ["\u4713", "\u4713"], /* CJK Ideograph Extension A */
+ ["\u4714", "\u4714"], /* CJK Ideograph Extension A */
+ ["\u4715", "\u4715"], /* CJK Ideograph Extension A */
+ ["\u4716", "\u4716"], /* CJK Ideograph Extension A */
+ ["\u4717", "\u4717"], /* CJK Ideograph Extension A */
+ ["\u4718", "\u4718"], /* CJK Ideograph Extension A */
+ ["\u4719", "\u4719"], /* CJK Ideograph Extension A */
+ ["\u471A", "\u471A"], /* CJK Ideograph Extension A */
+ ["\u471B", "\u471B"], /* CJK Ideograph Extension A */
+ ["\u471C", "\u471C"], /* CJK Ideograph Extension A */
+ ["\u471D", "\u471D"], /* CJK Ideograph Extension A */
+ ["\u471E", "\u471E"], /* CJK Ideograph Extension A */
+ ["\u471F", "\u471F"], /* CJK Ideograph Extension A */
+ ["\u4720", "\u4720"], /* CJK Ideograph Extension A */
+ ["\u4721", "\u4721"], /* CJK Ideograph Extension A */
+ ["\u4722", "\u4722"], /* CJK Ideograph Extension A */
+ ["\u4723", "\u4723"], /* CJK Ideograph Extension A */
+ ["\u4724", "\u4724"], /* CJK Ideograph Extension A */
+ ["\u4725", "\u4725"], /* CJK Ideograph Extension A */
+ ["\u4726", "\u4726"], /* CJK Ideograph Extension A */
+ ["\u4727", "\u4727"], /* CJK Ideograph Extension A */
+ ["\u4728", "\u4728"], /* CJK Ideograph Extension A */
+ ["\u4729", "\u4729"], /* CJK Ideograph Extension A */
+ ["\u472A", "\u472A"], /* CJK Ideograph Extension A */
+ ["\u472B", "\u472B"], /* CJK Ideograph Extension A */
+ ["\u472C", "\u472C"], /* CJK Ideograph Extension A */
+ ["\u472D", "\u472D"], /* CJK Ideograph Extension A */
+ ["\u472E", "\u472E"], /* CJK Ideograph Extension A */
+ ["\u472F", "\u472F"], /* CJK Ideograph Extension A */
+ ["\u4730", "\u4730"], /* CJK Ideograph Extension A */
+ ["\u4731", "\u4731"], /* CJK Ideograph Extension A */
+ ["\u4732", "\u4732"], /* CJK Ideograph Extension A */
+ ["\u4733", "\u4733"], /* CJK Ideograph Extension A */
+ ["\u4734", "\u4734"], /* CJK Ideograph Extension A */
+ ["\u4735", "\u4735"], /* CJK Ideograph Extension A */
+ ["\u4736", "\u4736"], /* CJK Ideograph Extension A */
+ ["\u4737", "\u4737"], /* CJK Ideograph Extension A */
+ ["\u4738", "\u4738"], /* CJK Ideograph Extension A */
+ ["\u4739", "\u4739"], /* CJK Ideograph Extension A */
+ ["\u473A", "\u473A"], /* CJK Ideograph Extension A */
+ ["\u473B", "\u473B"], /* CJK Ideograph Extension A */
+ ["\u473C", "\u473C"], /* CJK Ideograph Extension A */
+ ["\u473D", "\u473D"], /* CJK Ideograph Extension A */
+ ["\u473E", "\u473E"], /* CJK Ideograph Extension A */
+ ["\u473F", "\u473F"], /* CJK Ideograph Extension A */
+ ["\u4740", "\u4740"], /* CJK Ideograph Extension A */
+ ["\u4741", "\u4741"], /* CJK Ideograph Extension A */
+ ["\u4742", "\u4742"], /* CJK Ideograph Extension A */
+ ["\u4743", "\u4743"], /* CJK Ideograph Extension A */
+ ["\u4744", "\u4744"], /* CJK Ideograph Extension A */
+ ["\u4745", "\u4745"], /* CJK Ideograph Extension A */
+ ["\u4746", "\u4746"], /* CJK Ideograph Extension A */
+ ["\u4747", "\u4747"], /* CJK Ideograph Extension A */
+ ["\u4748", "\u4748"], /* CJK Ideograph Extension A */
+ ["\u4749", "\u4749"], /* CJK Ideograph Extension A */
+ ["\u474A", "\u474A"], /* CJK Ideograph Extension A */
+ ["\u474B", "\u474B"], /* CJK Ideograph Extension A */
+ ["\u474C", "\u474C"], /* CJK Ideograph Extension A */
+ ["\u474D", "\u474D"], /* CJK Ideograph Extension A */
+ ["\u474E", "\u474E"], /* CJK Ideograph Extension A */
+ ["\u474F", "\u474F"], /* CJK Ideograph Extension A */
+ ["\u4750", "\u4750"], /* CJK Ideograph Extension A */
+ ["\u4751", "\u4751"], /* CJK Ideograph Extension A */
+ ["\u4752", "\u4752"], /* CJK Ideograph Extension A */
+ ["\u4753", "\u4753"], /* CJK Ideograph Extension A */
+ ["\u4754", "\u4754"], /* CJK Ideograph Extension A */
+ ["\u4755", "\u4755"], /* CJK Ideograph Extension A */
+ ["\u4756", "\u4756"], /* CJK Ideograph Extension A */
+ ["\u4757", "\u4757"], /* CJK Ideograph Extension A */
+ ["\u4758", "\u4758"], /* CJK Ideograph Extension A */
+ ["\u4759", "\u4759"], /* CJK Ideograph Extension A */
+ ["\u475A", "\u475A"], /* CJK Ideograph Extension A */
+ ["\u475B", "\u475B"], /* CJK Ideograph Extension A */
+ ["\u475C", "\u475C"], /* CJK Ideograph Extension A */
+ ["\u475D", "\u475D"], /* CJK Ideograph Extension A */
+ ["\u475E", "\u475E"], /* CJK Ideograph Extension A */
+ ["\u475F", "\u475F"], /* CJK Ideograph Extension A */
+ ["\u4760", "\u4760"], /* CJK Ideograph Extension A */
+ ["\u4761", "\u4761"], /* CJK Ideograph Extension A */
+ ["\u4762", "\u4762"], /* CJK Ideograph Extension A */
+ ["\u4763", "\u4763"], /* CJK Ideograph Extension A */
+ ["\u4764", "\u4764"], /* CJK Ideograph Extension A */
+ ["\u4765", "\u4765"], /* CJK Ideograph Extension A */
+ ["\u4766", "\u4766"], /* CJK Ideograph Extension A */
+ ["\u4767", "\u4767"], /* CJK Ideograph Extension A */
+ ["\u4768", "\u4768"], /* CJK Ideograph Extension A */
+ ["\u4769", "\u4769"], /* CJK Ideograph Extension A */
+ ["\u476A", "\u476A"], /* CJK Ideograph Extension A */
+ ["\u476B", "\u476B"], /* CJK Ideograph Extension A */
+ ["\u476C", "\u476C"], /* CJK Ideograph Extension A */
+ ["\u476D", "\u476D"], /* CJK Ideograph Extension A */
+ ["\u476E", "\u476E"], /* CJK Ideograph Extension A */
+ ["\u476F", "\u476F"], /* CJK Ideograph Extension A */
+ ["\u4770", "\u4770"], /* CJK Ideograph Extension A */
+ ["\u4771", "\u4771"], /* CJK Ideograph Extension A */
+ ["\u4772", "\u4772"], /* CJK Ideograph Extension A */
+ ["\u4773", "\u4773"], /* CJK Ideograph Extension A */
+ ["\u4774", "\u4774"], /* CJK Ideograph Extension A */
+ ["\u4775", "\u4775"], /* CJK Ideograph Extension A */
+ ["\u4776", "\u4776"], /* CJK Ideograph Extension A */
+ ["\u4777", "\u4777"], /* CJK Ideograph Extension A */
+ ["\u4778", "\u4778"], /* CJK Ideograph Extension A */
+ ["\u4779", "\u4779"], /* CJK Ideograph Extension A */
+ ["\u477A", "\u477A"], /* CJK Ideograph Extension A */
+ ["\u477B", "\u477B"], /* CJK Ideograph Extension A */
+ ["\u477C", "\u477C"], /* CJK Ideograph Extension A */
+ ["\u477D", "\u477D"], /* CJK Ideograph Extension A */
+ ["\u477E", "\u477E"], /* CJK Ideograph Extension A */
+ ["\u477F", "\u477F"], /* CJK Ideograph Extension A */
+ ["\u4780", "\u4780"], /* CJK Ideograph Extension A */
+ ["\u4781", "\u4781"], /* CJK Ideograph Extension A */
+ ["\u4782", "\u4782"], /* CJK Ideograph Extension A */
+ ["\u4783", "\u4783"], /* CJK Ideograph Extension A */
+ ["\u4784", "\u4784"], /* CJK Ideograph Extension A */
+ ["\u4785", "\u4785"], /* CJK Ideograph Extension A */
+ ["\u4786", "\u4786"], /* CJK Ideograph Extension A */
+ ["\u4787", "\u4787"], /* CJK Ideograph Extension A */
+ ["\u4788", "\u4788"], /* CJK Ideograph Extension A */
+ ["\u4789", "\u4789"], /* CJK Ideograph Extension A */
+ ["\u478A", "\u478A"], /* CJK Ideograph Extension A */
+ ["\u478B", "\u478B"], /* CJK Ideograph Extension A */
+ ["\u478C", "\u478C"], /* CJK Ideograph Extension A */
+ ["\u478D", "\u478D"], /* CJK Ideograph Extension A */
+ ["\u478E", "\u478E"], /* CJK Ideograph Extension A */
+ ["\u478F", "\u478F"], /* CJK Ideograph Extension A */
+ ["\u4790", "\u4790"], /* CJK Ideograph Extension A */
+ ["\u4791", "\u4791"], /* CJK Ideograph Extension A */
+ ["\u4792", "\u4792"], /* CJK Ideograph Extension A */
+ ["\u4793", "\u4793"], /* CJK Ideograph Extension A */
+ ["\u4794", "\u4794"], /* CJK Ideograph Extension A */
+ ["\u4795", "\u4795"], /* CJK Ideograph Extension A */
+ ["\u4796", "\u4796"], /* CJK Ideograph Extension A */
+ ["\u4797", "\u4797"], /* CJK Ideograph Extension A */
+ ["\u4798", "\u4798"], /* CJK Ideograph Extension A */
+ ["\u4799", "\u4799"], /* CJK Ideograph Extension A */
+ ["\u479A", "\u479A"], /* CJK Ideograph Extension A */
+ ["\u479B", "\u479B"], /* CJK Ideograph Extension A */
+ ["\u479C", "\u479C"], /* CJK Ideograph Extension A */
+ ["\u479D", "\u479D"], /* CJK Ideograph Extension A */
+ ["\u479E", "\u479E"], /* CJK Ideograph Extension A */
+ ["\u479F", "\u479F"], /* CJK Ideograph Extension A */
+ ["\u47A0", "\u47A0"], /* CJK Ideograph Extension A */
+ ["\u47A1", "\u47A1"], /* CJK Ideograph Extension A */
+ ["\u47A2", "\u47A2"], /* CJK Ideograph Extension A */
+ ["\u47A3", "\u47A3"], /* CJK Ideograph Extension A */
+ ["\u47A4", "\u47A4"], /* CJK Ideograph Extension A */
+ ["\u47A5", "\u47A5"], /* CJK Ideograph Extension A */
+ ["\u47A6", "\u47A6"], /* CJK Ideograph Extension A */
+ ["\u47A7", "\u47A7"], /* CJK Ideograph Extension A */
+ ["\u47A8", "\u47A8"], /* CJK Ideograph Extension A */
+ ["\u47A9", "\u47A9"], /* CJK Ideograph Extension A */
+ ["\u47AA", "\u47AA"], /* CJK Ideograph Extension A */
+ ["\u47AB", "\u47AB"], /* CJK Ideograph Extension A */
+ ["\u47AC", "\u47AC"], /* CJK Ideograph Extension A */
+ ["\u47AD", "\u47AD"], /* CJK Ideograph Extension A */
+ ["\u47AE", "\u47AE"], /* CJK Ideograph Extension A */
+ ["\u47AF", "\u47AF"], /* CJK Ideograph Extension A */
+ ["\u47B0", "\u47B0"], /* CJK Ideograph Extension A */
+ ["\u47B1", "\u47B1"], /* CJK Ideograph Extension A */
+ ["\u47B2", "\u47B2"], /* CJK Ideograph Extension A */
+ ["\u47B3", "\u47B3"], /* CJK Ideograph Extension A */
+ ["\u47B4", "\u47B4"], /* CJK Ideograph Extension A */
+ ["\u47B5", "\u47B5"], /* CJK Ideograph Extension A */
+ ["\u47B6", "\u47B6"], /* CJK Ideograph Extension A */
+ ["\u47B7", "\u47B7"], /* CJK Ideograph Extension A */
+ ["\u47B8", "\u47B8"], /* CJK Ideograph Extension A */
+ ["\u47B9", "\u47B9"], /* CJK Ideograph Extension A */
+ ["\u47BA", "\u47BA"], /* CJK Ideograph Extension A */
+ ["\u47BB", "\u47BB"], /* CJK Ideograph Extension A */
+ ["\u47BC", "\u47BC"], /* CJK Ideograph Extension A */
+ ["\u47BD", "\u47BD"], /* CJK Ideograph Extension A */
+ ["\u47BE", "\u47BE"], /* CJK Ideograph Extension A */
+ ["\u47BF", "\u47BF"], /* CJK Ideograph Extension A */
+ ["\u47C0", "\u47C0"], /* CJK Ideograph Extension A */
+ ["\u47C1", "\u47C1"], /* CJK Ideograph Extension A */
+ ["\u47C2", "\u47C2"], /* CJK Ideograph Extension A */
+ ["\u47C3", "\u47C3"], /* CJK Ideograph Extension A */
+ ["\u47C4", "\u47C4"], /* CJK Ideograph Extension A */
+ ["\u47C5", "\u47C5"], /* CJK Ideograph Extension A */
+ ["\u47C6", "\u47C6"], /* CJK Ideograph Extension A */
+ ["\u47C7", "\u47C7"], /* CJK Ideograph Extension A */
+ ["\u47C8", "\u47C8"], /* CJK Ideograph Extension A */
+ ["\u47C9", "\u47C9"], /* CJK Ideograph Extension A */
+ ["\u47CA", "\u47CA"], /* CJK Ideograph Extension A */
+ ["\u47CB", "\u47CB"], /* CJK Ideograph Extension A */
+ ["\u47CC", "\u47CC"], /* CJK Ideograph Extension A */
+ ["\u47CD", "\u47CD"], /* CJK Ideograph Extension A */
+ ["\u47CE", "\u47CE"], /* CJK Ideograph Extension A */
+ ["\u47CF", "\u47CF"], /* CJK Ideograph Extension A */
+ ["\u47D0", "\u47D0"], /* CJK Ideograph Extension A */
+ ["\u47D1", "\u47D1"], /* CJK Ideograph Extension A */
+ ["\u47D2", "\u47D2"], /* CJK Ideograph Extension A */
+ ["\u47D3", "\u47D3"], /* CJK Ideograph Extension A */
+ ["\u47D4", "\u47D4"], /* CJK Ideograph Extension A */
+ ["\u47D5", "\u47D5"], /* CJK Ideograph Extension A */
+ ["\u47D6", "\u47D6"], /* CJK Ideograph Extension A */
+ ["\u47D7", "\u47D7"], /* CJK Ideograph Extension A */
+ ["\u47D8", "\u47D8"], /* CJK Ideograph Extension A */
+ ["\u47D9", "\u47D9"], /* CJK Ideograph Extension A */
+ ["\u47DA", "\u47DA"], /* CJK Ideograph Extension A */
+ ["\u47DB", "\u47DB"], /* CJK Ideograph Extension A */
+ ["\u47DC", "\u47DC"], /* CJK Ideograph Extension A */
+ ["\u47DD", "\u47DD"], /* CJK Ideograph Extension A */
+ ["\u47DE", "\u47DE"], /* CJK Ideograph Extension A */
+ ["\u47DF", "\u47DF"], /* CJK Ideograph Extension A */
+ ["\u47E0", "\u47E0"], /* CJK Ideograph Extension A */
+ ["\u47E1", "\u47E1"], /* CJK Ideograph Extension A */
+ ["\u47E2", "\u47E2"], /* CJK Ideograph Extension A */
+ ["\u47E3", "\u47E3"], /* CJK Ideograph Extension A */
+ ["\u47E4", "\u47E4"], /* CJK Ideograph Extension A */
+ ["\u47E5", "\u47E5"], /* CJK Ideograph Extension A */
+ ["\u47E6", "\u47E6"], /* CJK Ideograph Extension A */
+ ["\u47E7", "\u47E7"], /* CJK Ideograph Extension A */
+ ["\u47E8", "\u47E8"], /* CJK Ideograph Extension A */
+ ["\u47E9", "\u47E9"], /* CJK Ideograph Extension A */
+ ["\u47EA", "\u47EA"], /* CJK Ideograph Extension A */
+ ["\u47EB", "\u47EB"], /* CJK Ideograph Extension A */
+ ["\u47EC", "\u47EC"], /* CJK Ideograph Extension A */
+ ["\u47ED", "\u47ED"], /* CJK Ideograph Extension A */
+ ["\u47EE", "\u47EE"], /* CJK Ideograph Extension A */
+ ["\u47EF", "\u47EF"], /* CJK Ideograph Extension A */
+ ["\u47F0", "\u47F0"], /* CJK Ideograph Extension A */
+ ["\u47F1", "\u47F1"], /* CJK Ideograph Extension A */
+ ["\u47F2", "\u47F2"], /* CJK Ideograph Extension A */
+ ["\u47F3", "\u47F3"], /* CJK Ideograph Extension A */
+ ["\u47F4", "\u47F4"], /* CJK Ideograph Extension A */
+ ["\u47F5", "\u47F5"], /* CJK Ideograph Extension A */
+ ["\u47F6", "\u47F6"], /* CJK Ideograph Extension A */
+ ["\u47F7", "\u47F7"], /* CJK Ideograph Extension A */
+ ["\u47F8", "\u47F8"], /* CJK Ideograph Extension A */
+ ["\u47F9", "\u47F9"], /* CJK Ideograph Extension A */
+ ["\u47FA", "\u47FA"], /* CJK Ideograph Extension A */
+ ["\u47FB", "\u47FB"], /* CJK Ideograph Extension A */
+ ["\u47FC", "\u47FC"], /* CJK Ideograph Extension A */
+ ["\u47FD", "\u47FD"], /* CJK Ideograph Extension A */
+ ["\u47FE", "\u47FE"], /* CJK Ideograph Extension A */
+ ["\u47FF", "\u47FF"], /* CJK Ideograph Extension A */
+ ["\u4800", "\u4800"], /* CJK Ideograph Extension A */
+ ["\u4801", "\u4801"], /* CJK Ideograph Extension A */
+ ["\u4802", "\u4802"], /* CJK Ideograph Extension A */
+ ["\u4803", "\u4803"], /* CJK Ideograph Extension A */
+ ["\u4804", "\u4804"], /* CJK Ideograph Extension A */
+ ["\u4805", "\u4805"], /* CJK Ideograph Extension A */
+ ["\u4806", "\u4806"], /* CJK Ideograph Extension A */
+ ["\u4807", "\u4807"], /* CJK Ideograph Extension A */
+ ["\u4808", "\u4808"], /* CJK Ideograph Extension A */
+ ["\u4809", "\u4809"], /* CJK Ideograph Extension A */
+ ["\u480A", "\u480A"], /* CJK Ideograph Extension A */
+ ["\u480B", "\u480B"], /* CJK Ideograph Extension A */
+ ["\u480C", "\u480C"], /* CJK Ideograph Extension A */
+ ["\u480D", "\u480D"], /* CJK Ideograph Extension A */
+ ["\u480E", "\u480E"], /* CJK Ideograph Extension A */
+ ["\u480F", "\u480F"], /* CJK Ideograph Extension A */
+ ["\u4810", "\u4810"], /* CJK Ideograph Extension A */
+ ["\u4811", "\u4811"], /* CJK Ideograph Extension A */
+ ["\u4812", "\u4812"], /* CJK Ideograph Extension A */
+ ["\u4813", "\u4813"], /* CJK Ideograph Extension A */
+ ["\u4814", "\u4814"], /* CJK Ideograph Extension A */
+ ["\u4815", "\u4815"], /* CJK Ideograph Extension A */
+ ["\u4816", "\u4816"], /* CJK Ideograph Extension A */
+ ["\u4817", "\u4817"], /* CJK Ideograph Extension A */
+ ["\u4818", "\u4818"], /* CJK Ideograph Extension A */
+ ["\u4819", "\u4819"], /* CJK Ideograph Extension A */
+ ["\u481A", "\u481A"], /* CJK Ideograph Extension A */
+ ["\u481B", "\u481B"], /* CJK Ideograph Extension A */
+ ["\u481C", "\u481C"], /* CJK Ideograph Extension A */
+ ["\u481D", "\u481D"], /* CJK Ideograph Extension A */
+ ["\u481E", "\u481E"], /* CJK Ideograph Extension A */
+ ["\u481F", "\u481F"], /* CJK Ideograph Extension A */
+ ["\u4820", "\u4820"], /* CJK Ideograph Extension A */
+ ["\u4821", "\u4821"], /* CJK Ideograph Extension A */
+ ["\u4822", "\u4822"], /* CJK Ideograph Extension A */
+ ["\u4823", "\u4823"], /* CJK Ideograph Extension A */
+ ["\u4824", "\u4824"], /* CJK Ideograph Extension A */
+ ["\u4825", "\u4825"], /* CJK Ideograph Extension A */
+ ["\u4826", "\u4826"], /* CJK Ideograph Extension A */
+ ["\u4827", "\u4827"], /* CJK Ideograph Extension A */
+ ["\u4828", "\u4828"], /* CJK Ideograph Extension A */
+ ["\u4829", "\u4829"], /* CJK Ideograph Extension A */
+ ["\u482A", "\u482A"], /* CJK Ideograph Extension A */
+ ["\u482B", "\u482B"], /* CJK Ideograph Extension A */
+ ["\u482C", "\u482C"], /* CJK Ideograph Extension A */
+ ["\u482D", "\u482D"], /* CJK Ideograph Extension A */
+ ["\u482E", "\u482E"], /* CJK Ideograph Extension A */
+ ["\u482F", "\u482F"], /* CJK Ideograph Extension A */
+ ["\u4830", "\u4830"], /* CJK Ideograph Extension A */
+ ["\u4831", "\u4831"], /* CJK Ideograph Extension A */
+ ["\u4832", "\u4832"], /* CJK Ideograph Extension A */
+ ["\u4833", "\u4833"], /* CJK Ideograph Extension A */
+ ["\u4834", "\u4834"], /* CJK Ideograph Extension A */
+ ["\u4835", "\u4835"], /* CJK Ideograph Extension A */
+ ["\u4836", "\u4836"], /* CJK Ideograph Extension A */
+ ["\u4837", "\u4837"], /* CJK Ideograph Extension A */
+ ["\u4838", "\u4838"], /* CJK Ideograph Extension A */
+ ["\u4839", "\u4839"], /* CJK Ideograph Extension A */
+ ["\u483A", "\u483A"], /* CJK Ideograph Extension A */
+ ["\u483B", "\u483B"], /* CJK Ideograph Extension A */
+ ["\u483C", "\u483C"], /* CJK Ideograph Extension A */
+ ["\u483D", "\u483D"], /* CJK Ideograph Extension A */
+ ["\u483E", "\u483E"], /* CJK Ideograph Extension A */
+ ["\u483F", "\u483F"], /* CJK Ideograph Extension A */
+ ["\u4840", "\u4840"], /* CJK Ideograph Extension A */
+ ["\u4841", "\u4841"], /* CJK Ideograph Extension A */
+ ["\u4842", "\u4842"], /* CJK Ideograph Extension A */
+ ["\u4843", "\u4843"], /* CJK Ideograph Extension A */
+ ["\u4844", "\u4844"], /* CJK Ideograph Extension A */
+ ["\u4845", "\u4845"], /* CJK Ideograph Extension A */
+ ["\u4846", "\u4846"], /* CJK Ideograph Extension A */
+ ["\u4847", "\u4847"], /* CJK Ideograph Extension A */
+ ["\u4848", "\u4848"], /* CJK Ideograph Extension A */
+ ["\u4849", "\u4849"], /* CJK Ideograph Extension A */
+ ["\u484A", "\u484A"], /* CJK Ideograph Extension A */
+ ["\u484B", "\u484B"], /* CJK Ideograph Extension A */
+ ["\u484C", "\u484C"], /* CJK Ideograph Extension A */
+ ["\u484D", "\u484D"], /* CJK Ideograph Extension A */
+ ["\u484E", "\u484E"], /* CJK Ideograph Extension A */
+ ["\u484F", "\u484F"], /* CJK Ideograph Extension A */
+ ["\u4850", "\u4850"], /* CJK Ideograph Extension A */
+ ["\u4851", "\u4851"], /* CJK Ideograph Extension A */
+ ["\u4852", "\u4852"], /* CJK Ideograph Extension A */
+ ["\u4853", "\u4853"], /* CJK Ideograph Extension A */
+ ["\u4854", "\u4854"], /* CJK Ideograph Extension A */
+ ["\u4855", "\u4855"], /* CJK Ideograph Extension A */
+ ["\u4856", "\u4856"], /* CJK Ideograph Extension A */
+ ["\u4857", "\u4857"], /* CJK Ideograph Extension A */
+ ["\u4858", "\u4858"], /* CJK Ideograph Extension A */
+ ["\u4859", "\u4859"], /* CJK Ideograph Extension A */
+ ["\u485A", "\u485A"], /* CJK Ideograph Extension A */
+ ["\u485B", "\u485B"], /* CJK Ideograph Extension A */
+ ["\u485C", "\u485C"], /* CJK Ideograph Extension A */
+ ["\u485D", "\u485D"], /* CJK Ideograph Extension A */
+ ["\u485E", "\u485E"], /* CJK Ideograph Extension A */
+ ["\u485F", "\u485F"], /* CJK Ideograph Extension A */
+ ["\u4860", "\u4860"], /* CJK Ideograph Extension A */
+ ["\u4861", "\u4861"], /* CJK Ideograph Extension A */
+ ["\u4862", "\u4862"], /* CJK Ideograph Extension A */
+ ["\u4863", "\u4863"], /* CJK Ideograph Extension A */
+ ["\u4864", "\u4864"], /* CJK Ideograph Extension A */
+ ["\u4865", "\u4865"], /* CJK Ideograph Extension A */
+ ["\u4866", "\u4866"], /* CJK Ideograph Extension A */
+ ["\u4867", "\u4867"], /* CJK Ideograph Extension A */
+ ["\u4868", "\u4868"], /* CJK Ideograph Extension A */
+ ["\u4869", "\u4869"], /* CJK Ideograph Extension A */
+ ["\u486A", "\u486A"], /* CJK Ideograph Extension A */
+ ["\u486B", "\u486B"], /* CJK Ideograph Extension A */
+ ["\u486C", "\u486C"], /* CJK Ideograph Extension A */
+ ["\u486D", "\u486D"], /* CJK Ideograph Extension A */
+ ["\u486E", "\u486E"], /* CJK Ideograph Extension A */
+ ["\u486F", "\u486F"], /* CJK Ideograph Extension A */
+ ["\u4870", "\u4870"], /* CJK Ideograph Extension A */
+ ["\u4871", "\u4871"], /* CJK Ideograph Extension A */
+ ["\u4872", "\u4872"], /* CJK Ideograph Extension A */
+ ["\u4873", "\u4873"], /* CJK Ideograph Extension A */
+ ["\u4874", "\u4874"], /* CJK Ideograph Extension A */
+ ["\u4875", "\u4875"], /* CJK Ideograph Extension A */
+ ["\u4876", "\u4876"], /* CJK Ideograph Extension A */
+ ["\u4877", "\u4877"], /* CJK Ideograph Extension A */
+ ["\u4878", "\u4878"], /* CJK Ideograph Extension A */
+ ["\u4879", "\u4879"], /* CJK Ideograph Extension A */
+ ["\u487A", "\u487A"], /* CJK Ideograph Extension A */
+ ["\u487B", "\u487B"], /* CJK Ideograph Extension A */
+ ["\u487C", "\u487C"], /* CJK Ideograph Extension A */
+ ["\u487D", "\u487D"], /* CJK Ideograph Extension A */
+ ["\u487E", "\u487E"], /* CJK Ideograph Extension A */
+ ["\u487F", "\u487F"], /* CJK Ideograph Extension A */
+ ["\u4880", "\u4880"], /* CJK Ideograph Extension A */
+ ["\u4881", "\u4881"], /* CJK Ideograph Extension A */
+ ["\u4882", "\u4882"], /* CJK Ideograph Extension A */
+ ["\u4883", "\u4883"], /* CJK Ideograph Extension A */
+ ["\u4884", "\u4884"], /* CJK Ideograph Extension A */
+ ["\u4885", "\u4885"], /* CJK Ideograph Extension A */
+ ["\u4886", "\u4886"], /* CJK Ideograph Extension A */
+ ["\u4887", "\u4887"], /* CJK Ideograph Extension A */
+ ["\u4888", "\u4888"], /* CJK Ideograph Extension A */
+ ["\u4889", "\u4889"], /* CJK Ideograph Extension A */
+ ["\u488A", "\u488A"], /* CJK Ideograph Extension A */
+ ["\u488B", "\u488B"], /* CJK Ideograph Extension A */
+ ["\u488C", "\u488C"], /* CJK Ideograph Extension A */
+ ["\u488D", "\u488D"], /* CJK Ideograph Extension A */
+ ["\u488E", "\u488E"], /* CJK Ideograph Extension A */
+ ["\u488F", "\u488F"], /* CJK Ideograph Extension A */
+ ["\u4890", "\u4890"], /* CJK Ideograph Extension A */
+ ["\u4891", "\u4891"], /* CJK Ideograph Extension A */
+ ["\u4892", "\u4892"], /* CJK Ideograph Extension A */
+ ["\u4893", "\u4893"], /* CJK Ideograph Extension A */
+ ["\u4894", "\u4894"], /* CJK Ideograph Extension A */
+ ["\u4895", "\u4895"], /* CJK Ideograph Extension A */
+ ["\u4896", "\u4896"], /* CJK Ideograph Extension A */
+ ["\u4897", "\u4897"], /* CJK Ideograph Extension A */
+ ["\u4898", "\u4898"], /* CJK Ideograph Extension A */
+ ["\u4899", "\u4899"], /* CJK Ideograph Extension A */
+ ["\u489A", "\u489A"], /* CJK Ideograph Extension A */
+ ["\u489B", "\u489B"], /* CJK Ideograph Extension A */
+ ["\u489C", "\u489C"], /* CJK Ideograph Extension A */
+ ["\u489D", "\u489D"], /* CJK Ideograph Extension A */
+ ["\u489E", "\u489E"], /* CJK Ideograph Extension A */
+ ["\u489F", "\u489F"], /* CJK Ideograph Extension A */
+ ["\u48A0", "\u48A0"], /* CJK Ideograph Extension A */
+ ["\u48A1", "\u48A1"], /* CJK Ideograph Extension A */
+ ["\u48A2", "\u48A2"], /* CJK Ideograph Extension A */
+ ["\u48A3", "\u48A3"], /* CJK Ideograph Extension A */
+ ["\u48A4", "\u48A4"], /* CJK Ideograph Extension A */
+ ["\u48A5", "\u48A5"], /* CJK Ideograph Extension A */
+ ["\u48A6", "\u48A6"], /* CJK Ideograph Extension A */
+ ["\u48A7", "\u48A7"], /* CJK Ideograph Extension A */
+ ["\u48A8", "\u48A8"], /* CJK Ideograph Extension A */
+ ["\u48A9", "\u48A9"], /* CJK Ideograph Extension A */
+ ["\u48AA", "\u48AA"], /* CJK Ideograph Extension A */
+ ["\u48AB", "\u48AB"], /* CJK Ideograph Extension A */
+ ["\u48AC", "\u48AC"], /* CJK Ideograph Extension A */
+ ["\u48AD", "\u48AD"], /* CJK Ideograph Extension A */
+ ["\u48AE", "\u48AE"], /* CJK Ideograph Extension A */
+ ["\u48AF", "\u48AF"], /* CJK Ideograph Extension A */
+ ["\u48B0", "\u48B0"], /* CJK Ideograph Extension A */
+ ["\u48B1", "\u48B1"], /* CJK Ideograph Extension A */
+ ["\u48B2", "\u48B2"], /* CJK Ideograph Extension A */
+ ["\u48B3", "\u48B3"], /* CJK Ideograph Extension A */
+ ["\u48B4", "\u48B4"], /* CJK Ideograph Extension A */
+ ["\u48B5", "\u48B5"], /* CJK Ideograph Extension A */
+ ["\u48B6", "\u48B6"], /* CJK Ideograph Extension A */
+ ["\u48B7", "\u48B7"], /* CJK Ideograph Extension A */
+ ["\u48B8", "\u48B8"], /* CJK Ideograph Extension A */
+ ["\u48B9", "\u48B9"], /* CJK Ideograph Extension A */
+ ["\u48BA", "\u48BA"], /* CJK Ideograph Extension A */
+ ["\u48BB", "\u48BB"], /* CJK Ideograph Extension A */
+ ["\u48BC", "\u48BC"], /* CJK Ideograph Extension A */
+ ["\u48BD", "\u48BD"], /* CJK Ideograph Extension A */
+ ["\u48BE", "\u48BE"], /* CJK Ideograph Extension A */
+ ["\u48BF", "\u48BF"], /* CJK Ideograph Extension A */
+ ["\u48C0", "\u48C0"], /* CJK Ideograph Extension A */
+ ["\u48C1", "\u48C1"], /* CJK Ideograph Extension A */
+ ["\u48C2", "\u48C2"], /* CJK Ideograph Extension A */
+ ["\u48C3", "\u48C3"], /* CJK Ideograph Extension A */
+ ["\u48C4", "\u48C4"], /* CJK Ideograph Extension A */
+ ["\u48C5", "\u48C5"], /* CJK Ideograph Extension A */
+ ["\u48C6", "\u48C6"], /* CJK Ideograph Extension A */
+ ["\u48C7", "\u48C7"], /* CJK Ideograph Extension A */
+ ["\u48C8", "\u48C8"], /* CJK Ideograph Extension A */
+ ["\u48C9", "\u48C9"], /* CJK Ideograph Extension A */
+ ["\u48CA", "\u48CA"], /* CJK Ideograph Extension A */
+ ["\u48CB", "\u48CB"], /* CJK Ideograph Extension A */
+ ["\u48CC", "\u48CC"], /* CJK Ideograph Extension A */
+ ["\u48CD", "\u48CD"], /* CJK Ideograph Extension A */
+ ["\u48CE", "\u48CE"], /* CJK Ideograph Extension A */
+ ["\u48CF", "\u48CF"], /* CJK Ideograph Extension A */
+ ["\u48D0", "\u48D0"], /* CJK Ideograph Extension A */
+ ["\u48D1", "\u48D1"], /* CJK Ideograph Extension A */
+ ["\u48D2", "\u48D2"], /* CJK Ideograph Extension A */
+ ["\u48D3", "\u48D3"], /* CJK Ideograph Extension A */
+ ["\u48D4", "\u48D4"], /* CJK Ideograph Extension A */
+ ["\u48D5", "\u48D5"], /* CJK Ideograph Extension A */
+ ["\u48D6", "\u48D6"], /* CJK Ideograph Extension A */
+ ["\u48D7", "\u48D7"], /* CJK Ideograph Extension A */
+ ["\u48D8", "\u48D8"], /* CJK Ideograph Extension A */
+ ["\u48D9", "\u48D9"], /* CJK Ideograph Extension A */
+ ["\u48DA", "\u48DA"], /* CJK Ideograph Extension A */
+ ["\u48DB", "\u48DB"], /* CJK Ideograph Extension A */
+ ["\u48DC", "\u48DC"], /* CJK Ideograph Extension A */
+ ["\u48DD", "\u48DD"], /* CJK Ideograph Extension A */
+ ["\u48DE", "\u48DE"], /* CJK Ideograph Extension A */
+ ["\u48DF", "\u48DF"], /* CJK Ideograph Extension A */
+ ["\u48E0", "\u48E0"], /* CJK Ideograph Extension A */
+ ["\u48E1", "\u48E1"], /* CJK Ideograph Extension A */
+ ["\u48E2", "\u48E2"], /* CJK Ideograph Extension A */
+ ["\u48E3", "\u48E3"], /* CJK Ideograph Extension A */
+ ["\u48E4", "\u48E4"], /* CJK Ideograph Extension A */
+ ["\u48E5", "\u48E5"], /* CJK Ideograph Extension A */
+ ["\u48E6", "\u48E6"], /* CJK Ideograph Extension A */
+ ["\u48E7", "\u48E7"], /* CJK Ideograph Extension A */
+ ["\u48E8", "\u48E8"], /* CJK Ideograph Extension A */
+ ["\u48E9", "\u48E9"], /* CJK Ideograph Extension A */
+ ["\u48EA", "\u48EA"], /* CJK Ideograph Extension A */
+ ["\u48EB", "\u48EB"], /* CJK Ideograph Extension A */
+ ["\u48EC", "\u48EC"], /* CJK Ideograph Extension A */
+ ["\u48ED", "\u48ED"], /* CJK Ideograph Extension A */
+ ["\u48EE", "\u48EE"], /* CJK Ideograph Extension A */
+ ["\u48EF", "\u48EF"], /* CJK Ideograph Extension A */
+ ["\u48F0", "\u48F0"], /* CJK Ideograph Extension A */
+ ["\u48F1", "\u48F1"], /* CJK Ideograph Extension A */
+ ["\u48F2", "\u48F2"], /* CJK Ideograph Extension A */
+ ["\u48F3", "\u48F3"], /* CJK Ideograph Extension A */
+ ["\u48F4", "\u48F4"], /* CJK Ideograph Extension A */
+ ["\u48F5", "\u48F5"], /* CJK Ideograph Extension A */
+ ["\u48F6", "\u48F6"], /* CJK Ideograph Extension A */
+ ["\u48F7", "\u48F7"], /* CJK Ideograph Extension A */
+ ["\u48F8", "\u48F8"], /* CJK Ideograph Extension A */
+ ["\u48F9", "\u48F9"], /* CJK Ideograph Extension A */
+ ["\u48FA", "\u48FA"], /* CJK Ideograph Extension A */
+ ["\u48FB", "\u48FB"], /* CJK Ideograph Extension A */
+ ["\u48FC", "\u48FC"], /* CJK Ideograph Extension A */
+ ["\u48FD", "\u48FD"], /* CJK Ideograph Extension A */
+ ["\u48FE", "\u48FE"], /* CJK Ideograph Extension A */
+ ["\u48FF", "\u48FF"], /* CJK Ideograph Extension A */
+ ["\u4900", "\u4900"], /* CJK Ideograph Extension A */
+ ["\u4901", "\u4901"], /* CJK Ideograph Extension A */
+ ["\u4902", "\u4902"], /* CJK Ideograph Extension A */
+ ["\u4903", "\u4903"], /* CJK Ideograph Extension A */
+ ["\u4904", "\u4904"], /* CJK Ideograph Extension A */
+ ["\u4905", "\u4905"], /* CJK Ideograph Extension A */
+ ["\u4906", "\u4906"], /* CJK Ideograph Extension A */
+ ["\u4907", "\u4907"], /* CJK Ideograph Extension A */
+ ["\u4908", "\u4908"], /* CJK Ideograph Extension A */
+ ["\u4909", "\u4909"], /* CJK Ideograph Extension A */
+ ["\u490A", "\u490A"], /* CJK Ideograph Extension A */
+ ["\u490B", "\u490B"], /* CJK Ideograph Extension A */
+ ["\u490C", "\u490C"], /* CJK Ideograph Extension A */
+ ["\u490D", "\u490D"], /* CJK Ideograph Extension A */
+ ["\u490E", "\u490E"], /* CJK Ideograph Extension A */
+ ["\u490F", "\u490F"], /* CJK Ideograph Extension A */
+ ["\u4910", "\u4910"], /* CJK Ideograph Extension A */
+ ["\u4911", "\u4911"], /* CJK Ideograph Extension A */
+ ["\u4912", "\u4912"], /* CJK Ideograph Extension A */
+ ["\u4913", "\u4913"], /* CJK Ideograph Extension A */
+ ["\u4914", "\u4914"], /* CJK Ideograph Extension A */
+ ["\u4915", "\u4915"], /* CJK Ideograph Extension A */
+ ["\u4916", "\u4916"], /* CJK Ideograph Extension A */
+ ["\u4917", "\u4917"], /* CJK Ideograph Extension A */
+ ["\u4918", "\u4918"], /* CJK Ideograph Extension A */
+ ["\u4919", "\u4919"], /* CJK Ideograph Extension A */
+ ["\u491A", "\u491A"], /* CJK Ideograph Extension A */
+ ["\u491B", "\u491B"], /* CJK Ideograph Extension A */
+ ["\u491C", "\u491C"], /* CJK Ideograph Extension A */
+ ["\u491D", "\u491D"], /* CJK Ideograph Extension A */
+ ["\u491E", "\u491E"], /* CJK Ideograph Extension A */
+ ["\u491F", "\u491F"], /* CJK Ideograph Extension A */
+ ["\u4920", "\u4920"], /* CJK Ideograph Extension A */
+ ["\u4921", "\u4921"], /* CJK Ideograph Extension A */
+ ["\u4922", "\u4922"], /* CJK Ideograph Extension A */
+ ["\u4923", "\u4923"], /* CJK Ideograph Extension A */
+ ["\u4924", "\u4924"], /* CJK Ideograph Extension A */
+ ["\u4925", "\u4925"], /* CJK Ideograph Extension A */
+ ["\u4926", "\u4926"], /* CJK Ideograph Extension A */
+ ["\u4927", "\u4927"], /* CJK Ideograph Extension A */
+ ["\u4928", "\u4928"], /* CJK Ideograph Extension A */
+ ["\u4929", "\u4929"], /* CJK Ideograph Extension A */
+ ["\u492A", "\u492A"], /* CJK Ideograph Extension A */
+ ["\u492B", "\u492B"], /* CJK Ideograph Extension A */
+ ["\u492C", "\u492C"], /* CJK Ideograph Extension A */
+ ["\u492D", "\u492D"], /* CJK Ideograph Extension A */
+ ["\u492E", "\u492E"], /* CJK Ideograph Extension A */
+ ["\u492F", "\u492F"], /* CJK Ideograph Extension A */
+ ["\u4930", "\u4930"], /* CJK Ideograph Extension A */
+ ["\u4931", "\u4931"], /* CJK Ideograph Extension A */
+ ["\u4932", "\u4932"], /* CJK Ideograph Extension A */
+ ["\u4933", "\u4933"], /* CJK Ideograph Extension A */
+ ["\u4934", "\u4934"], /* CJK Ideograph Extension A */
+ ["\u4935", "\u4935"], /* CJK Ideograph Extension A */
+ ["\u4936", "\u4936"], /* CJK Ideograph Extension A */
+ ["\u4937", "\u4937"], /* CJK Ideograph Extension A */
+ ["\u4938", "\u4938"], /* CJK Ideograph Extension A */
+ ["\u4939", "\u4939"], /* CJK Ideograph Extension A */
+ ["\u493A", "\u493A"], /* CJK Ideograph Extension A */
+ ["\u493B", "\u493B"], /* CJK Ideograph Extension A */
+ ["\u493C", "\u493C"], /* CJK Ideograph Extension A */
+ ["\u493D", "\u493D"], /* CJK Ideograph Extension A */
+ ["\u493E", "\u493E"], /* CJK Ideograph Extension A */
+ ["\u493F", "\u493F"], /* CJK Ideograph Extension A */
+ ["\u4940", "\u4940"], /* CJK Ideograph Extension A */
+ ["\u4941", "\u4941"], /* CJK Ideograph Extension A */
+ ["\u4942", "\u4942"], /* CJK Ideograph Extension A */
+ ["\u4943", "\u4943"], /* CJK Ideograph Extension A */
+ ["\u4944", "\u4944"], /* CJK Ideograph Extension A */
+ ["\u4945", "\u4945"], /* CJK Ideograph Extension A */
+ ["\u4946", "\u4946"], /* CJK Ideograph Extension A */
+ ["\u4947", "\u4947"], /* CJK Ideograph Extension A */
+ ["\u4948", "\u4948"], /* CJK Ideograph Extension A */
+ ["\u4949", "\u4949"], /* CJK Ideograph Extension A */
+ ["\u494A", "\u494A"], /* CJK Ideograph Extension A */
+ ["\u494B", "\u494B"], /* CJK Ideograph Extension A */
+ ["\u494C", "\u494C"], /* CJK Ideograph Extension A */
+ ["\u494D", "\u494D"], /* CJK Ideograph Extension A */
+ ["\u494E", "\u494E"], /* CJK Ideograph Extension A */
+ ["\u494F", "\u494F"], /* CJK Ideograph Extension A */
+ ["\u4950", "\u4950"], /* CJK Ideograph Extension A */
+ ["\u4951", "\u4951"], /* CJK Ideograph Extension A */
+ ["\u4952", "\u4952"], /* CJK Ideograph Extension A */
+ ["\u4953", "\u4953"], /* CJK Ideograph Extension A */
+ ["\u4954", "\u4954"], /* CJK Ideograph Extension A */
+ ["\u4955", "\u4955"], /* CJK Ideograph Extension A */
+ ["\u4956", "\u4956"], /* CJK Ideograph Extension A */
+ ["\u4957", "\u4957"], /* CJK Ideograph Extension A */
+ ["\u4958", "\u4958"], /* CJK Ideograph Extension A */
+ ["\u4959", "\u4959"], /* CJK Ideograph Extension A */
+ ["\u495A", "\u495A"], /* CJK Ideograph Extension A */
+ ["\u495B", "\u495B"], /* CJK Ideograph Extension A */
+ ["\u495C", "\u495C"], /* CJK Ideograph Extension A */
+ ["\u495D", "\u495D"], /* CJK Ideograph Extension A */
+ ["\u495E", "\u495E"], /* CJK Ideograph Extension A */
+ ["\u495F", "\u495F"], /* CJK Ideograph Extension A */
+ ["\u4960", "\u4960"], /* CJK Ideograph Extension A */
+ ["\u4961", "\u4961"], /* CJK Ideograph Extension A */
+ ["\u4962", "\u4962"], /* CJK Ideograph Extension A */
+ ["\u4963", "\u4963"], /* CJK Ideograph Extension A */
+ ["\u4964", "\u4964"], /* CJK Ideograph Extension A */
+ ["\u4965", "\u4965"], /* CJK Ideograph Extension A */
+ ["\u4966", "\u4966"], /* CJK Ideograph Extension A */
+ ["\u4967", "\u4967"], /* CJK Ideograph Extension A */
+ ["\u4968", "\u4968"], /* CJK Ideograph Extension A */
+ ["\u4969", "\u4969"], /* CJK Ideograph Extension A */
+ ["\u496A", "\u496A"], /* CJK Ideograph Extension A */
+ ["\u496B", "\u496B"], /* CJK Ideograph Extension A */
+ ["\u496C", "\u496C"], /* CJK Ideograph Extension A */
+ ["\u496D", "\u496D"], /* CJK Ideograph Extension A */
+ ["\u496E", "\u496E"], /* CJK Ideograph Extension A */
+ ["\u496F", "\u496F"], /* CJK Ideograph Extension A */
+ ["\u4970", "\u4970"], /* CJK Ideograph Extension A */
+ ["\u4971", "\u4971"], /* CJK Ideograph Extension A */
+ ["\u4972", "\u4972"], /* CJK Ideograph Extension A */
+ ["\u4973", "\u4973"], /* CJK Ideograph Extension A */
+ ["\u4974", "\u4974"], /* CJK Ideograph Extension A */
+ ["\u4975", "\u4975"], /* CJK Ideograph Extension A */
+ ["\u4976", "\u4976"], /* CJK Ideograph Extension A */
+ ["\u4977", "\u4977"], /* CJK Ideograph Extension A */
+ ["\u4978", "\u4978"], /* CJK Ideograph Extension A */
+ ["\u4979", "\u4979"], /* CJK Ideograph Extension A */
+ ["\u497A", "\u497A"], /* CJK Ideograph Extension A */
+ ["\u497B", "\u497B"], /* CJK Ideograph Extension A */
+ ["\u497C", "\u497C"], /* CJK Ideograph Extension A */
+ ["\u497D", "\u497D"], /* CJK Ideograph Extension A */
+ ["\u497E", "\u497E"], /* CJK Ideograph Extension A */
+ ["\u497F", "\u497F"], /* CJK Ideograph Extension A */
+ ["\u4980", "\u4980"], /* CJK Ideograph Extension A */
+ ["\u4981", "\u4981"], /* CJK Ideograph Extension A */
+ ["\u4982", "\u4982"], /* CJK Ideograph Extension A */
+ ["\u4983", "\u4983"], /* CJK Ideograph Extension A */
+ ["\u4984", "\u4984"], /* CJK Ideograph Extension A */
+ ["\u4985", "\u4985"], /* CJK Ideograph Extension A */
+ ["\u4986", "\u4986"], /* CJK Ideograph Extension A */
+ ["\u4987", "\u4987"], /* CJK Ideograph Extension A */
+ ["\u4988", "\u4988"], /* CJK Ideograph Extension A */
+ ["\u4989", "\u4989"], /* CJK Ideograph Extension A */
+ ["\u498A", "\u498A"], /* CJK Ideograph Extension A */
+ ["\u498B", "\u498B"], /* CJK Ideograph Extension A */
+ ["\u498C", "\u498C"], /* CJK Ideograph Extension A */
+ ["\u498D", "\u498D"], /* CJK Ideograph Extension A */
+ ["\u498E", "\u498E"], /* CJK Ideograph Extension A */
+ ["\u498F", "\u498F"], /* CJK Ideograph Extension A */
+ ["\u4990", "\u4990"], /* CJK Ideograph Extension A */
+ ["\u4991", "\u4991"], /* CJK Ideograph Extension A */
+ ["\u4992", "\u4992"], /* CJK Ideograph Extension A */
+ ["\u4993", "\u4993"], /* CJK Ideograph Extension A */
+ ["\u4994", "\u4994"], /* CJK Ideograph Extension A */
+ ["\u4995", "\u4995"], /* CJK Ideograph Extension A */
+ ["\u4996", "\u4996"], /* CJK Ideograph Extension A */
+ ["\u4997", "\u4997"], /* CJK Ideograph Extension A */
+ ["\u4998", "\u4998"], /* CJK Ideograph Extension A */
+ ["\u4999", "\u4999"], /* CJK Ideograph Extension A */
+ ["\u499A", "\u499A"], /* CJK Ideograph Extension A */
+ ["\u499B", "\u499B"], /* CJK Ideograph Extension A */
+ ["\u499C", "\u499C"], /* CJK Ideograph Extension A */
+ ["\u499D", "\u499D"], /* CJK Ideograph Extension A */
+ ["\u499E", "\u499E"], /* CJK Ideograph Extension A */
+ ["\u499F", "\u499F"], /* CJK Ideograph Extension A */
+ ["\u49A0", "\u49A0"], /* CJK Ideograph Extension A */
+ ["\u49A1", "\u49A1"], /* CJK Ideograph Extension A */
+ ["\u49A2", "\u49A2"], /* CJK Ideograph Extension A */
+ ["\u49A3", "\u49A3"], /* CJK Ideograph Extension A */
+ ["\u49A4", "\u49A4"], /* CJK Ideograph Extension A */
+ ["\u49A5", "\u49A5"], /* CJK Ideograph Extension A */
+ ["\u49A6", "\u49A6"], /* CJK Ideograph Extension A */
+ ["\u49A7", "\u49A7"], /* CJK Ideograph Extension A */
+ ["\u49A8", "\u49A8"], /* CJK Ideograph Extension A */
+ ["\u49A9", "\u49A9"], /* CJK Ideograph Extension A */
+ ["\u49AA", "\u49AA"], /* CJK Ideograph Extension A */
+ ["\u49AB", "\u49AB"], /* CJK Ideograph Extension A */
+ ["\u49AC", "\u49AC"], /* CJK Ideograph Extension A */
+ ["\u49AD", "\u49AD"], /* CJK Ideograph Extension A */
+ ["\u49AE", "\u49AE"], /* CJK Ideograph Extension A */
+ ["\u49AF", "\u49AF"], /* CJK Ideograph Extension A */
+ ["\u49B0", "\u49B0"], /* CJK Ideograph Extension A */
+ ["\u49B1", "\u49B1"], /* CJK Ideograph Extension A */
+ ["\u49B2", "\u49B2"], /* CJK Ideograph Extension A */
+ ["\u49B3", "\u49B3"], /* CJK Ideograph Extension A */
+ ["\u49B4", "\u49B4"], /* CJK Ideograph Extension A */
+ ["\u49B5", "\u49B5"], /* CJK Ideograph Extension A */
+ ["\u49B6", "\u49B6"], /* CJK Ideograph Extension A */
+ ["\u49B7", "\u49B7"], /* CJK Ideograph Extension A */
+ ["\u49B8", "\u49B8"], /* CJK Ideograph Extension A */
+ ["\u49B9", "\u49B9"], /* CJK Ideograph Extension A */
+ ["\u49BA", "\u49BA"], /* CJK Ideograph Extension A */
+ ["\u49BB", "\u49BB"], /* CJK Ideograph Extension A */
+ ["\u49BC", "\u49BC"], /* CJK Ideograph Extension A */
+ ["\u49BD", "\u49BD"], /* CJK Ideograph Extension A */
+ ["\u49BE", "\u49BE"], /* CJK Ideograph Extension A */
+ ["\u49BF", "\u49BF"], /* CJK Ideograph Extension A */
+ ["\u49C0", "\u49C0"], /* CJK Ideograph Extension A */
+ ["\u49C1", "\u49C1"], /* CJK Ideograph Extension A */
+ ["\u49C2", "\u49C2"], /* CJK Ideograph Extension A */
+ ["\u49C3", "\u49C3"], /* CJK Ideograph Extension A */
+ ["\u49C4", "\u49C4"], /* CJK Ideograph Extension A */
+ ["\u49C5", "\u49C5"], /* CJK Ideograph Extension A */
+ ["\u49C6", "\u49C6"], /* CJK Ideograph Extension A */
+ ["\u49C7", "\u49C7"], /* CJK Ideograph Extension A */
+ ["\u49C8", "\u49C8"], /* CJK Ideograph Extension A */
+ ["\u49C9", "\u49C9"], /* CJK Ideograph Extension A */
+ ["\u49CA", "\u49CA"], /* CJK Ideograph Extension A */
+ ["\u49CB", "\u49CB"], /* CJK Ideograph Extension A */
+ ["\u49CC", "\u49CC"], /* CJK Ideograph Extension A */
+ ["\u49CD", "\u49CD"], /* CJK Ideograph Extension A */
+ ["\u49CE", "\u49CE"], /* CJK Ideograph Extension A */
+ ["\u49CF", "\u49CF"], /* CJK Ideograph Extension A */
+ ["\u49D0", "\u49D0"], /* CJK Ideograph Extension A */
+ ["\u49D1", "\u49D1"], /* CJK Ideograph Extension A */
+ ["\u49D2", "\u49D2"], /* CJK Ideograph Extension A */
+ ["\u49D3", "\u49D3"], /* CJK Ideograph Extension A */
+ ["\u49D4", "\u49D4"], /* CJK Ideograph Extension A */
+ ["\u49D5", "\u49D5"], /* CJK Ideograph Extension A */
+ ["\u49D6", "\u49D6"], /* CJK Ideograph Extension A */
+ ["\u49D7", "\u49D7"], /* CJK Ideograph Extension A */
+ ["\u49D8", "\u49D8"], /* CJK Ideograph Extension A */
+ ["\u49D9", "\u49D9"], /* CJK Ideograph Extension A */
+ ["\u49DA", "\u49DA"], /* CJK Ideograph Extension A */
+ ["\u49DB", "\u49DB"], /* CJK Ideograph Extension A */
+ ["\u49DC", "\u49DC"], /* CJK Ideograph Extension A */
+ ["\u49DD", "\u49DD"], /* CJK Ideograph Extension A */
+ ["\u49DE", "\u49DE"], /* CJK Ideograph Extension A */
+ ["\u49DF", "\u49DF"], /* CJK Ideograph Extension A */
+ ["\u49E0", "\u49E0"], /* CJK Ideograph Extension A */
+ ["\u49E1", "\u49E1"], /* CJK Ideograph Extension A */
+ ["\u49E2", "\u49E2"], /* CJK Ideograph Extension A */
+ ["\u49E3", "\u49E3"], /* CJK Ideograph Extension A */
+ ["\u49E4", "\u49E4"], /* CJK Ideograph Extension A */
+ ["\u49E5", "\u49E5"], /* CJK Ideograph Extension A */
+ ["\u49E6", "\u49E6"], /* CJK Ideograph Extension A */
+ ["\u49E7", "\u49E7"], /* CJK Ideograph Extension A */
+ ["\u49E8", "\u49E8"], /* CJK Ideograph Extension A */
+ ["\u49E9", "\u49E9"], /* CJK Ideograph Extension A */
+ ["\u49EA", "\u49EA"], /* CJK Ideograph Extension A */
+ ["\u49EB", "\u49EB"], /* CJK Ideograph Extension A */
+ ["\u49EC", "\u49EC"], /* CJK Ideograph Extension A */
+ ["\u49ED", "\u49ED"], /* CJK Ideograph Extension A */
+ ["\u49EE", "\u49EE"], /* CJK Ideograph Extension A */
+ ["\u49EF", "\u49EF"], /* CJK Ideograph Extension A */
+ ["\u49F0", "\u49F0"], /* CJK Ideograph Extension A */
+ ["\u49F1", "\u49F1"], /* CJK Ideograph Extension A */
+ ["\u49F2", "\u49F2"], /* CJK Ideograph Extension A */
+ ["\u49F3", "\u49F3"], /* CJK Ideograph Extension A */
+ ["\u49F4", "\u49F4"], /* CJK Ideograph Extension A */
+ ["\u49F5", "\u49F5"], /* CJK Ideograph Extension A */
+ ["\u49F6", "\u49F6"], /* CJK Ideograph Extension A */
+ ["\u49F7", "\u49F7"], /* CJK Ideograph Extension A */
+ ["\u49F8", "\u49F8"], /* CJK Ideograph Extension A */
+ ["\u49F9", "\u49F9"], /* CJK Ideograph Extension A */
+ ["\u49FA", "\u49FA"], /* CJK Ideograph Extension A */
+ ["\u49FB", "\u49FB"], /* CJK Ideograph Extension A */
+ ["\u49FC", "\u49FC"], /* CJK Ideograph Extension A */
+ ["\u49FD", "\u49FD"], /* CJK Ideograph Extension A */
+ ["\u49FE", "\u49FE"], /* CJK Ideograph Extension A */
+ ["\u49FF", "\u49FF"], /* CJK Ideograph Extension A */
+ ["\u4A00", "\u4A00"], /* CJK Ideograph Extension A */
+ ["\u4A01", "\u4A01"], /* CJK Ideograph Extension A */
+ ["\u4A02", "\u4A02"], /* CJK Ideograph Extension A */
+ ["\u4A03", "\u4A03"], /* CJK Ideograph Extension A */
+ ["\u4A04", "\u4A04"], /* CJK Ideograph Extension A */
+ ["\u4A05", "\u4A05"], /* CJK Ideograph Extension A */
+ ["\u4A06", "\u4A06"], /* CJK Ideograph Extension A */
+ ["\u4A07", "\u4A07"], /* CJK Ideograph Extension A */
+ ["\u4A08", "\u4A08"], /* CJK Ideograph Extension A */
+ ["\u4A09", "\u4A09"], /* CJK Ideograph Extension A */
+ ["\u4A0A", "\u4A0A"], /* CJK Ideograph Extension A */
+ ["\u4A0B", "\u4A0B"], /* CJK Ideograph Extension A */
+ ["\u4A0C", "\u4A0C"], /* CJK Ideograph Extension A */
+ ["\u4A0D", "\u4A0D"], /* CJK Ideograph Extension A */
+ ["\u4A0E", "\u4A0E"], /* CJK Ideograph Extension A */
+ ["\u4A0F", "\u4A0F"], /* CJK Ideograph Extension A */
+ ["\u4A10", "\u4A10"], /* CJK Ideograph Extension A */
+ ["\u4A11", "\u4A11"], /* CJK Ideograph Extension A */
+ ["\u4A12", "\u4A12"], /* CJK Ideograph Extension A */
+ ["\u4A13", "\u4A13"], /* CJK Ideograph Extension A */
+ ["\u4A14", "\u4A14"], /* CJK Ideograph Extension A */
+ ["\u4A15", "\u4A15"], /* CJK Ideograph Extension A */
+ ["\u4A16", "\u4A16"], /* CJK Ideograph Extension A */
+ ["\u4A17", "\u4A17"], /* CJK Ideograph Extension A */
+ ["\u4A18", "\u4A18"], /* CJK Ideograph Extension A */
+ ["\u4A19", "\u4A19"], /* CJK Ideograph Extension A */
+ ["\u4A1A", "\u4A1A"], /* CJK Ideograph Extension A */
+ ["\u4A1B", "\u4A1B"], /* CJK Ideograph Extension A */
+ ["\u4A1C", "\u4A1C"], /* CJK Ideograph Extension A */
+ ["\u4A1D", "\u4A1D"], /* CJK Ideograph Extension A */
+ ["\u4A1E", "\u4A1E"], /* CJK Ideograph Extension A */
+ ["\u4A1F", "\u4A1F"], /* CJK Ideograph Extension A */
+ ["\u4A20", "\u4A20"], /* CJK Ideograph Extension A */
+ ["\u4A21", "\u4A21"], /* CJK Ideograph Extension A */
+ ["\u4A22", "\u4A22"], /* CJK Ideograph Extension A */
+ ["\u4A23", "\u4A23"], /* CJK Ideograph Extension A */
+ ["\u4A24", "\u4A24"], /* CJK Ideograph Extension A */
+ ["\u4A25", "\u4A25"], /* CJK Ideograph Extension A */
+ ["\u4A26", "\u4A26"], /* CJK Ideograph Extension A */
+ ["\u4A27", "\u4A27"], /* CJK Ideograph Extension A */
+ ["\u4A28", "\u4A28"], /* CJK Ideograph Extension A */
+ ["\u4A29", "\u4A29"], /* CJK Ideograph Extension A */
+ ["\u4A2A", "\u4A2A"], /* CJK Ideograph Extension A */
+ ["\u4A2B", "\u4A2B"], /* CJK Ideograph Extension A */
+ ["\u4A2C", "\u4A2C"], /* CJK Ideograph Extension A */
+ ["\u4A2D", "\u4A2D"], /* CJK Ideograph Extension A */
+ ["\u4A2E", "\u4A2E"], /* CJK Ideograph Extension A */
+ ["\u4A2F", "\u4A2F"], /* CJK Ideograph Extension A */
+ ["\u4A30", "\u4A30"], /* CJK Ideograph Extension A */
+ ["\u4A31", "\u4A31"], /* CJK Ideograph Extension A */
+ ["\u4A32", "\u4A32"], /* CJK Ideograph Extension A */
+ ["\u4A33", "\u4A33"], /* CJK Ideograph Extension A */
+ ["\u4A34", "\u4A34"], /* CJK Ideograph Extension A */
+ ["\u4A35", "\u4A35"], /* CJK Ideograph Extension A */
+ ["\u4A36", "\u4A36"], /* CJK Ideograph Extension A */
+ ["\u4A37", "\u4A37"], /* CJK Ideograph Extension A */
+ ["\u4A38", "\u4A38"], /* CJK Ideograph Extension A */
+ ["\u4A39", "\u4A39"], /* CJK Ideograph Extension A */
+ ["\u4A3A", "\u4A3A"], /* CJK Ideograph Extension A */
+ ["\u4A3B", "\u4A3B"], /* CJK Ideograph Extension A */
+ ["\u4A3C", "\u4A3C"], /* CJK Ideograph Extension A */
+ ["\u4A3D", "\u4A3D"], /* CJK Ideograph Extension A */
+ ["\u4A3E", "\u4A3E"], /* CJK Ideograph Extension A */
+ ["\u4A3F", "\u4A3F"], /* CJK Ideograph Extension A */
+ ["\u4A40", "\u4A40"], /* CJK Ideograph Extension A */
+ ["\u4A41", "\u4A41"], /* CJK Ideograph Extension A */
+ ["\u4A42", "\u4A42"], /* CJK Ideograph Extension A */
+ ["\u4A43", "\u4A43"], /* CJK Ideograph Extension A */
+ ["\u4A44", "\u4A44"], /* CJK Ideograph Extension A */
+ ["\u4A45", "\u4A45"], /* CJK Ideograph Extension A */
+ ["\u4A46", "\u4A46"], /* CJK Ideograph Extension A */
+ ["\u4A47", "\u4A47"], /* CJK Ideograph Extension A */
+ ["\u4A48", "\u4A48"], /* CJK Ideograph Extension A */
+ ["\u4A49", "\u4A49"], /* CJK Ideograph Extension A */
+ ["\u4A4A", "\u4A4A"], /* CJK Ideograph Extension A */
+ ["\u4A4B", "\u4A4B"], /* CJK Ideograph Extension A */
+ ["\u4A4C", "\u4A4C"], /* CJK Ideograph Extension A */
+ ["\u4A4D", "\u4A4D"], /* CJK Ideograph Extension A */
+ ["\u4A4E", "\u4A4E"], /* CJK Ideograph Extension A */
+ ["\u4A4F", "\u4A4F"], /* CJK Ideograph Extension A */
+ ["\u4A50", "\u4A50"], /* CJK Ideograph Extension A */
+ ["\u4A51", "\u4A51"], /* CJK Ideograph Extension A */
+ ["\u4A52", "\u4A52"], /* CJK Ideograph Extension A */
+ ["\u4A53", "\u4A53"], /* CJK Ideograph Extension A */
+ ["\u4A54", "\u4A54"], /* CJK Ideograph Extension A */
+ ["\u4A55", "\u4A55"], /* CJK Ideograph Extension A */
+ ["\u4A56", "\u4A56"], /* CJK Ideograph Extension A */
+ ["\u4A57", "\u4A57"], /* CJK Ideograph Extension A */
+ ["\u4A58", "\u4A58"], /* CJK Ideograph Extension A */
+ ["\u4A59", "\u4A59"], /* CJK Ideograph Extension A */
+ ["\u4A5A", "\u4A5A"], /* CJK Ideograph Extension A */
+ ["\u4A5B", "\u4A5B"], /* CJK Ideograph Extension A */
+ ["\u4A5C", "\u4A5C"], /* CJK Ideograph Extension A */
+ ["\u4A5D", "\u4A5D"], /* CJK Ideograph Extension A */
+ ["\u4A5E", "\u4A5E"], /* CJK Ideograph Extension A */
+ ["\u4A5F", "\u4A5F"], /* CJK Ideograph Extension A */
+ ["\u4A60", "\u4A60"], /* CJK Ideograph Extension A */
+ ["\u4A61", "\u4A61"], /* CJK Ideograph Extension A */
+ ["\u4A62", "\u4A62"], /* CJK Ideograph Extension A */
+ ["\u4A63", "\u4A63"], /* CJK Ideograph Extension A */
+ ["\u4A64", "\u4A64"], /* CJK Ideograph Extension A */
+ ["\u4A65", "\u4A65"], /* CJK Ideograph Extension A */
+ ["\u4A66", "\u4A66"], /* CJK Ideograph Extension A */
+ ["\u4A67", "\u4A67"], /* CJK Ideograph Extension A */
+ ["\u4A68", "\u4A68"], /* CJK Ideograph Extension A */
+ ["\u4A69", "\u4A69"], /* CJK Ideograph Extension A */
+ ["\u4A6A", "\u4A6A"], /* CJK Ideograph Extension A */
+ ["\u4A6B", "\u4A6B"], /* CJK Ideograph Extension A */
+ ["\u4A6C", "\u4A6C"], /* CJK Ideograph Extension A */
+ ["\u4A6D", "\u4A6D"], /* CJK Ideograph Extension A */
+ ["\u4A6E", "\u4A6E"], /* CJK Ideograph Extension A */
+ ["\u4A6F", "\u4A6F"], /* CJK Ideograph Extension A */
+ ["\u4A70", "\u4A70"], /* CJK Ideograph Extension A */
+ ["\u4A71", "\u4A71"], /* CJK Ideograph Extension A */
+ ["\u4A72", "\u4A72"], /* CJK Ideograph Extension A */
+ ["\u4A73", "\u4A73"], /* CJK Ideograph Extension A */
+ ["\u4A74", "\u4A74"], /* CJK Ideograph Extension A */
+ ["\u4A75", "\u4A75"], /* CJK Ideograph Extension A */
+ ["\u4A76", "\u4A76"], /* CJK Ideograph Extension A */
+ ["\u4A77", "\u4A77"], /* CJK Ideograph Extension A */
+ ["\u4A78", "\u4A78"], /* CJK Ideograph Extension A */
+ ["\u4A79", "\u4A79"], /* CJK Ideograph Extension A */
+ ["\u4A7A", "\u4A7A"], /* CJK Ideograph Extension A */
+ ["\u4A7B", "\u4A7B"], /* CJK Ideograph Extension A */
+ ["\u4A7C", "\u4A7C"], /* CJK Ideograph Extension A */
+ ["\u4A7D", "\u4A7D"], /* CJK Ideograph Extension A */
+ ["\u4A7E", "\u4A7E"], /* CJK Ideograph Extension A */
+ ["\u4A7F", "\u4A7F"], /* CJK Ideograph Extension A */
+ ["\u4A80", "\u4A80"], /* CJK Ideograph Extension A */
+ ["\u4A81", "\u4A81"], /* CJK Ideograph Extension A */
+ ["\u4A82", "\u4A82"], /* CJK Ideograph Extension A */
+ ["\u4A83", "\u4A83"], /* CJK Ideograph Extension A */
+ ["\u4A84", "\u4A84"], /* CJK Ideograph Extension A */
+ ["\u4A85", "\u4A85"], /* CJK Ideograph Extension A */
+ ["\u4A86", "\u4A86"], /* CJK Ideograph Extension A */
+ ["\u4A87", "\u4A87"], /* CJK Ideograph Extension A */
+ ["\u4A88", "\u4A88"], /* CJK Ideograph Extension A */
+ ["\u4A89", "\u4A89"], /* CJK Ideograph Extension A */
+ ["\u4A8A", "\u4A8A"], /* CJK Ideograph Extension A */
+ ["\u4A8B", "\u4A8B"], /* CJK Ideograph Extension A */
+ ["\u4A8C", "\u4A8C"], /* CJK Ideograph Extension A */
+ ["\u4A8D", "\u4A8D"], /* CJK Ideograph Extension A */
+ ["\u4A8E", "\u4A8E"], /* CJK Ideograph Extension A */
+ ["\u4A8F", "\u4A8F"], /* CJK Ideograph Extension A */
+ ["\u4A90", "\u4A90"], /* CJK Ideograph Extension A */
+ ["\u4A91", "\u4A91"], /* CJK Ideograph Extension A */
+ ["\u4A92", "\u4A92"], /* CJK Ideograph Extension A */
+ ["\u4A93", "\u4A93"], /* CJK Ideograph Extension A */
+ ["\u4A94", "\u4A94"], /* CJK Ideograph Extension A */
+ ["\u4A95", "\u4A95"], /* CJK Ideograph Extension A */
+ ["\u4A96", "\u4A96"], /* CJK Ideograph Extension A */
+ ["\u4A97", "\u4A97"], /* CJK Ideograph Extension A */
+ ["\u4A98", "\u4A98"], /* CJK Ideograph Extension A */
+ ["\u4A99", "\u4A99"], /* CJK Ideograph Extension A */
+ ["\u4A9A", "\u4A9A"], /* CJK Ideograph Extension A */
+ ["\u4A9B", "\u4A9B"], /* CJK Ideograph Extension A */
+ ["\u4A9C", "\u4A9C"], /* CJK Ideograph Extension A */
+ ["\u4A9D", "\u4A9D"], /* CJK Ideograph Extension A */
+ ["\u4A9E", "\u4A9E"], /* CJK Ideograph Extension A */
+ ["\u4A9F", "\u4A9F"], /* CJK Ideograph Extension A */
+ ["\u4AA0", "\u4AA0"], /* CJK Ideograph Extension A */
+ ["\u4AA1", "\u4AA1"], /* CJK Ideograph Extension A */
+ ["\u4AA2", "\u4AA2"], /* CJK Ideograph Extension A */
+ ["\u4AA3", "\u4AA3"], /* CJK Ideograph Extension A */
+ ["\u4AA4", "\u4AA4"], /* CJK Ideograph Extension A */
+ ["\u4AA5", "\u4AA5"], /* CJK Ideograph Extension A */
+ ["\u4AA6", "\u4AA6"], /* CJK Ideograph Extension A */
+ ["\u4AA7", "\u4AA7"], /* CJK Ideograph Extension A */
+ ["\u4AA8", "\u4AA8"], /* CJK Ideograph Extension A */
+ ["\u4AA9", "\u4AA9"], /* CJK Ideograph Extension A */
+ ["\u4AAA", "\u4AAA"], /* CJK Ideograph Extension A */
+ ["\u4AAB", "\u4AAB"], /* CJK Ideograph Extension A */
+ ["\u4AAC", "\u4AAC"], /* CJK Ideograph Extension A */
+ ["\u4AAD", "\u4AAD"], /* CJK Ideograph Extension A */
+ ["\u4AAE", "\u4AAE"], /* CJK Ideograph Extension A */
+ ["\u4AAF", "\u4AAF"], /* CJK Ideograph Extension A */
+ ["\u4AB0", "\u4AB0"], /* CJK Ideograph Extension A */
+ ["\u4AB1", "\u4AB1"], /* CJK Ideograph Extension A */
+ ["\u4AB2", "\u4AB2"], /* CJK Ideograph Extension A */
+ ["\u4AB3", "\u4AB3"], /* CJK Ideograph Extension A */
+ ["\u4AB4", "\u4AB4"], /* CJK Ideograph Extension A */
+ ["\u4AB5", "\u4AB5"], /* CJK Ideograph Extension A */
+ ["\u4AB6", "\u4AB6"], /* CJK Ideograph Extension A */
+ ["\u4AB7", "\u4AB7"], /* CJK Ideograph Extension A */
+ ["\u4AB8", "\u4AB8"], /* CJK Ideograph Extension A */
+ ["\u4AB9", "\u4AB9"], /* CJK Ideograph Extension A */
+ ["\u4ABA", "\u4ABA"], /* CJK Ideograph Extension A */
+ ["\u4ABB", "\u4ABB"], /* CJK Ideograph Extension A */
+ ["\u4ABC", "\u4ABC"], /* CJK Ideograph Extension A */
+ ["\u4ABD", "\u4ABD"], /* CJK Ideograph Extension A */
+ ["\u4ABE", "\u4ABE"], /* CJK Ideograph Extension A */
+ ["\u4ABF", "\u4ABF"], /* CJK Ideograph Extension A */
+ ["\u4AC0", "\u4AC0"], /* CJK Ideograph Extension A */
+ ["\u4AC1", "\u4AC1"], /* CJK Ideograph Extension A */
+ ["\u4AC2", "\u4AC2"], /* CJK Ideograph Extension A */
+ ["\u4AC3", "\u4AC3"], /* CJK Ideograph Extension A */
+ ["\u4AC4", "\u4AC4"], /* CJK Ideograph Extension A */
+ ["\u4AC5", "\u4AC5"], /* CJK Ideograph Extension A */
+ ["\u4AC6", "\u4AC6"], /* CJK Ideograph Extension A */
+ ["\u4AC7", "\u4AC7"], /* CJK Ideograph Extension A */
+ ["\u4AC8", "\u4AC8"], /* CJK Ideograph Extension A */
+ ["\u4AC9", "\u4AC9"], /* CJK Ideograph Extension A */
+ ["\u4ACA", "\u4ACA"], /* CJK Ideograph Extension A */
+ ["\u4ACB", "\u4ACB"], /* CJK Ideograph Extension A */
+ ["\u4ACC", "\u4ACC"], /* CJK Ideograph Extension A */
+ ["\u4ACD", "\u4ACD"], /* CJK Ideograph Extension A */
+ ["\u4ACE", "\u4ACE"], /* CJK Ideograph Extension A */
+ ["\u4ACF", "\u4ACF"], /* CJK Ideograph Extension A */
+ ["\u4AD0", "\u4AD0"], /* CJK Ideograph Extension A */
+ ["\u4AD1", "\u4AD1"], /* CJK Ideograph Extension A */
+ ["\u4AD2", "\u4AD2"], /* CJK Ideograph Extension A */
+ ["\u4AD3", "\u4AD3"], /* CJK Ideograph Extension A */
+ ["\u4AD4", "\u4AD4"], /* CJK Ideograph Extension A */
+ ["\u4AD5", "\u4AD5"], /* CJK Ideograph Extension A */
+ ["\u4AD6", "\u4AD6"], /* CJK Ideograph Extension A */
+ ["\u4AD7", "\u4AD7"], /* CJK Ideograph Extension A */
+ ["\u4AD8", "\u4AD8"], /* CJK Ideograph Extension A */
+ ["\u4AD9", "\u4AD9"], /* CJK Ideograph Extension A */
+ ["\u4ADA", "\u4ADA"], /* CJK Ideograph Extension A */
+ ["\u4ADB", "\u4ADB"], /* CJK Ideograph Extension A */
+ ["\u4ADC", "\u4ADC"], /* CJK Ideograph Extension A */
+ ["\u4ADD", "\u4ADD"], /* CJK Ideograph Extension A */
+ ["\u4ADE", "\u4ADE"], /* CJK Ideograph Extension A */
+ ["\u4ADF", "\u4ADF"], /* CJK Ideograph Extension A */
+ ["\u4AE0", "\u4AE0"], /* CJK Ideograph Extension A */
+ ["\u4AE1", "\u4AE1"], /* CJK Ideograph Extension A */
+ ["\u4AE2", "\u4AE2"], /* CJK Ideograph Extension A */
+ ["\u4AE3", "\u4AE3"], /* CJK Ideograph Extension A */
+ ["\u4AE4", "\u4AE4"], /* CJK Ideograph Extension A */
+ ["\u4AE5", "\u4AE5"], /* CJK Ideograph Extension A */
+ ["\u4AE6", "\u4AE6"], /* CJK Ideograph Extension A */
+ ["\u4AE7", "\u4AE7"], /* CJK Ideograph Extension A */
+ ["\u4AE8", "\u4AE8"], /* CJK Ideograph Extension A */
+ ["\u4AE9", "\u4AE9"], /* CJK Ideograph Extension A */
+ ["\u4AEA", "\u4AEA"], /* CJK Ideograph Extension A */
+ ["\u4AEB", "\u4AEB"], /* CJK Ideograph Extension A */
+ ["\u4AEC", "\u4AEC"], /* CJK Ideograph Extension A */
+ ["\u4AED", "\u4AED"], /* CJK Ideograph Extension A */
+ ["\u4AEE", "\u4AEE"], /* CJK Ideograph Extension A */
+ ["\u4AEF", "\u4AEF"], /* CJK Ideograph Extension A */
+ ["\u4AF0", "\u4AF0"], /* CJK Ideograph Extension A */
+ ["\u4AF1", "\u4AF1"], /* CJK Ideograph Extension A */
+ ["\u4AF2", "\u4AF2"], /* CJK Ideograph Extension A */
+ ["\u4AF3", "\u4AF3"], /* CJK Ideograph Extension A */
+ ["\u4AF4", "\u4AF4"], /* CJK Ideograph Extension A */
+ ["\u4AF5", "\u4AF5"], /* CJK Ideograph Extension A */
+ ["\u4AF6", "\u4AF6"], /* CJK Ideograph Extension A */
+ ["\u4AF7", "\u4AF7"], /* CJK Ideograph Extension A */
+ ["\u4AF8", "\u4AF8"], /* CJK Ideograph Extension A */
+ ["\u4AF9", "\u4AF9"], /* CJK Ideograph Extension A */
+ ["\u4AFA", "\u4AFA"], /* CJK Ideograph Extension A */
+ ["\u4AFB", "\u4AFB"], /* CJK Ideograph Extension A */
+ ["\u4AFC", "\u4AFC"], /* CJK Ideograph Extension A */
+ ["\u4AFD", "\u4AFD"], /* CJK Ideograph Extension A */
+ ["\u4AFE", "\u4AFE"], /* CJK Ideograph Extension A */
+ ["\u4AFF", "\u4AFF"], /* CJK Ideograph Extension A */
+ ["\u4B00", "\u4B00"], /* CJK Ideograph Extension A */
+ ["\u4B01", "\u4B01"], /* CJK Ideograph Extension A */
+ ["\u4B02", "\u4B02"], /* CJK Ideograph Extension A */
+ ["\u4B03", "\u4B03"], /* CJK Ideograph Extension A */
+ ["\u4B04", "\u4B04"], /* CJK Ideograph Extension A */
+ ["\u4B05", "\u4B05"], /* CJK Ideograph Extension A */
+ ["\u4B06", "\u4B06"], /* CJK Ideograph Extension A */
+ ["\u4B07", "\u4B07"], /* CJK Ideograph Extension A */
+ ["\u4B08", "\u4B08"], /* CJK Ideograph Extension A */
+ ["\u4B09", "\u4B09"], /* CJK Ideograph Extension A */
+ ["\u4B0A", "\u4B0A"], /* CJK Ideograph Extension A */
+ ["\u4B0B", "\u4B0B"], /* CJK Ideograph Extension A */
+ ["\u4B0C", "\u4B0C"], /* CJK Ideograph Extension A */
+ ["\u4B0D", "\u4B0D"], /* CJK Ideograph Extension A */
+ ["\u4B0E", "\u4B0E"], /* CJK Ideograph Extension A */
+ ["\u4B0F", "\u4B0F"], /* CJK Ideograph Extension A */
+ ["\u4B10", "\u4B10"], /* CJK Ideograph Extension A */
+ ["\u4B11", "\u4B11"], /* CJK Ideograph Extension A */
+ ["\u4B12", "\u4B12"], /* CJK Ideograph Extension A */
+ ["\u4B13", "\u4B13"], /* CJK Ideograph Extension A */
+ ["\u4B14", "\u4B14"], /* CJK Ideograph Extension A */
+ ["\u4B15", "\u4B15"], /* CJK Ideograph Extension A */
+ ["\u4B16", "\u4B16"], /* CJK Ideograph Extension A */
+ ["\u4B17", "\u4B17"], /* CJK Ideograph Extension A */
+ ["\u4B18", "\u4B18"], /* CJK Ideograph Extension A */
+ ["\u4B19", "\u4B19"], /* CJK Ideograph Extension A */
+ ["\u4B1A", "\u4B1A"], /* CJK Ideograph Extension A */
+ ["\u4B1B", "\u4B1B"], /* CJK Ideograph Extension A */
+ ["\u4B1C", "\u4B1C"], /* CJK Ideograph Extension A */
+ ["\u4B1D", "\u4B1D"], /* CJK Ideograph Extension A */
+ ["\u4B1E", "\u4B1E"], /* CJK Ideograph Extension A */
+ ["\u4B1F", "\u4B1F"], /* CJK Ideograph Extension A */
+ ["\u4B20", "\u4B20"], /* CJK Ideograph Extension A */
+ ["\u4B21", "\u4B21"], /* CJK Ideograph Extension A */
+ ["\u4B22", "\u4B22"], /* CJK Ideograph Extension A */
+ ["\u4B23", "\u4B23"], /* CJK Ideograph Extension A */
+ ["\u4B24", "\u4B24"], /* CJK Ideograph Extension A */
+ ["\u4B25", "\u4B25"], /* CJK Ideograph Extension A */
+ ["\u4B26", "\u4B26"], /* CJK Ideograph Extension A */
+ ["\u4B27", "\u4B27"], /* CJK Ideograph Extension A */
+ ["\u4B28", "\u4B28"], /* CJK Ideograph Extension A */
+ ["\u4B29", "\u4B29"], /* CJK Ideograph Extension A */
+ ["\u4B2A", "\u4B2A"], /* CJK Ideograph Extension A */
+ ["\u4B2B", "\u4B2B"], /* CJK Ideograph Extension A */
+ ["\u4B2C", "\u4B2C"], /* CJK Ideograph Extension A */
+ ["\u4B2D", "\u4B2D"], /* CJK Ideograph Extension A */
+ ["\u4B2E", "\u4B2E"], /* CJK Ideograph Extension A */
+ ["\u4B2F", "\u4B2F"], /* CJK Ideograph Extension A */
+ ["\u4B30", "\u4B30"], /* CJK Ideograph Extension A */
+ ["\u4B31", "\u4B31"], /* CJK Ideograph Extension A */
+ ["\u4B32", "\u4B32"], /* CJK Ideograph Extension A */
+ ["\u4B33", "\u4B33"], /* CJK Ideograph Extension A */
+ ["\u4B34", "\u4B34"], /* CJK Ideograph Extension A */
+ ["\u4B35", "\u4B35"], /* CJK Ideograph Extension A */
+ ["\u4B36", "\u4B36"], /* CJK Ideograph Extension A */
+ ["\u4B37", "\u4B37"], /* CJK Ideograph Extension A */
+ ["\u4B38", "\u4B38"], /* CJK Ideograph Extension A */
+ ["\u4B39", "\u4B39"], /* CJK Ideograph Extension A */
+ ["\u4B3A", "\u4B3A"], /* CJK Ideograph Extension A */
+ ["\u4B3B", "\u4B3B"], /* CJK Ideograph Extension A */
+ ["\u4B3C", "\u4B3C"], /* CJK Ideograph Extension A */
+ ["\u4B3D", "\u4B3D"], /* CJK Ideograph Extension A */
+ ["\u4B3E", "\u4B3E"], /* CJK Ideograph Extension A */
+ ["\u4B3F", "\u4B3F"], /* CJK Ideograph Extension A */
+ ["\u4B40", "\u4B40"], /* CJK Ideograph Extension A */
+ ["\u4B41", "\u4B41"], /* CJK Ideograph Extension A */
+ ["\u4B42", "\u4B42"], /* CJK Ideograph Extension A */
+ ["\u4B43", "\u4B43"], /* CJK Ideograph Extension A */
+ ["\u4B44", "\u4B44"], /* CJK Ideograph Extension A */
+ ["\u4B45", "\u4B45"], /* CJK Ideograph Extension A */
+ ["\u4B46", "\u4B46"], /* CJK Ideograph Extension A */
+ ["\u4B47", "\u4B47"], /* CJK Ideograph Extension A */
+ ["\u4B48", "\u4B48"], /* CJK Ideograph Extension A */
+ ["\u4B49", "\u4B49"], /* CJK Ideograph Extension A */
+ ["\u4B4A", "\u4B4A"], /* CJK Ideograph Extension A */
+ ["\u4B4B", "\u4B4B"], /* CJK Ideograph Extension A */
+ ["\u4B4C", "\u4B4C"], /* CJK Ideograph Extension A */
+ ["\u4B4D", "\u4B4D"], /* CJK Ideograph Extension A */
+ ["\u4B4E", "\u4B4E"], /* CJK Ideograph Extension A */
+ ["\u4B4F", "\u4B4F"], /* CJK Ideograph Extension A */
+ ["\u4B50", "\u4B50"], /* CJK Ideograph Extension A */
+ ["\u4B51", "\u4B51"], /* CJK Ideograph Extension A */
+ ["\u4B52", "\u4B52"], /* CJK Ideograph Extension A */
+ ["\u4B53", "\u4B53"], /* CJK Ideograph Extension A */
+ ["\u4B54", "\u4B54"], /* CJK Ideograph Extension A */
+ ["\u4B55", "\u4B55"], /* CJK Ideograph Extension A */
+ ["\u4B56", "\u4B56"], /* CJK Ideograph Extension A */
+ ["\u4B57", "\u4B57"], /* CJK Ideograph Extension A */
+ ["\u4B58", "\u4B58"], /* CJK Ideograph Extension A */
+ ["\u4B59", "\u4B59"], /* CJK Ideograph Extension A */
+ ["\u4B5A", "\u4B5A"], /* CJK Ideograph Extension A */
+ ["\u4B5B", "\u4B5B"], /* CJK Ideograph Extension A */
+ ["\u4B5C", "\u4B5C"], /* CJK Ideograph Extension A */
+ ["\u4B5D", "\u4B5D"], /* CJK Ideograph Extension A */
+ ["\u4B5E", "\u4B5E"], /* CJK Ideograph Extension A */
+ ["\u4B5F", "\u4B5F"], /* CJK Ideograph Extension A */
+ ["\u4B60", "\u4B60"], /* CJK Ideograph Extension A */
+ ["\u4B61", "\u4B61"], /* CJK Ideograph Extension A */
+ ["\u4B62", "\u4B62"], /* CJK Ideograph Extension A */
+ ["\u4B63", "\u4B63"], /* CJK Ideograph Extension A */
+ ["\u4B64", "\u4B64"], /* CJK Ideograph Extension A */
+ ["\u4B65", "\u4B65"], /* CJK Ideograph Extension A */
+ ["\u4B66", "\u4B66"], /* CJK Ideograph Extension A */
+ ["\u4B67", "\u4B67"], /* CJK Ideograph Extension A */
+ ["\u4B68", "\u4B68"], /* CJK Ideograph Extension A */
+ ["\u4B69", "\u4B69"], /* CJK Ideograph Extension A */
+ ["\u4B6A", "\u4B6A"], /* CJK Ideograph Extension A */
+ ["\u4B6B", "\u4B6B"], /* CJK Ideograph Extension A */
+ ["\u4B6C", "\u4B6C"], /* CJK Ideograph Extension A */
+ ["\u4B6D", "\u4B6D"], /* CJK Ideograph Extension A */
+ ["\u4B6E", "\u4B6E"], /* CJK Ideograph Extension A */
+ ["\u4B6F", "\u4B6F"], /* CJK Ideograph Extension A */
+ ["\u4B70", "\u4B70"], /* CJK Ideograph Extension A */
+ ["\u4B71", "\u4B71"], /* CJK Ideograph Extension A */
+ ["\u4B72", "\u4B72"], /* CJK Ideograph Extension A */
+ ["\u4B73", "\u4B73"], /* CJK Ideograph Extension A */
+ ["\u4B74", "\u4B74"], /* CJK Ideograph Extension A */
+ ["\u4B75", "\u4B75"], /* CJK Ideograph Extension A */
+ ["\u4B76", "\u4B76"], /* CJK Ideograph Extension A */
+ ["\u4B77", "\u4B77"], /* CJK Ideograph Extension A */
+ ["\u4B78", "\u4B78"], /* CJK Ideograph Extension A */
+ ["\u4B79", "\u4B79"], /* CJK Ideograph Extension A */
+ ["\u4B7A", "\u4B7A"], /* CJK Ideograph Extension A */
+ ["\u4B7B", "\u4B7B"], /* CJK Ideograph Extension A */
+ ["\u4B7C", "\u4B7C"], /* CJK Ideograph Extension A */
+ ["\u4B7D", "\u4B7D"], /* CJK Ideograph Extension A */
+ ["\u4B7E", "\u4B7E"], /* CJK Ideograph Extension A */
+ ["\u4B7F", "\u4B7F"], /* CJK Ideograph Extension A */
+ ["\u4B80", "\u4B80"], /* CJK Ideograph Extension A */
+ ["\u4B81", "\u4B81"], /* CJK Ideograph Extension A */
+ ["\u4B82", "\u4B82"], /* CJK Ideograph Extension A */
+ ["\u4B83", "\u4B83"], /* CJK Ideograph Extension A */
+ ["\u4B84", "\u4B84"], /* CJK Ideograph Extension A */
+ ["\u4B85", "\u4B85"], /* CJK Ideograph Extension A */
+ ["\u4B86", "\u4B86"], /* CJK Ideograph Extension A */
+ ["\u4B87", "\u4B87"], /* CJK Ideograph Extension A */
+ ["\u4B88", "\u4B88"], /* CJK Ideograph Extension A */
+ ["\u4B89", "\u4B89"], /* CJK Ideograph Extension A */
+ ["\u4B8A", "\u4B8A"], /* CJK Ideograph Extension A */
+ ["\u4B8B", "\u4B8B"], /* CJK Ideograph Extension A */
+ ["\u4B8C", "\u4B8C"], /* CJK Ideograph Extension A */
+ ["\u4B8D", "\u4B8D"], /* CJK Ideograph Extension A */
+ ["\u4B8E", "\u4B8E"], /* CJK Ideograph Extension A */
+ ["\u4B8F", "\u4B8F"], /* CJK Ideograph Extension A */
+ ["\u4B90", "\u4B90"], /* CJK Ideograph Extension A */
+ ["\u4B91", "\u4B91"], /* CJK Ideograph Extension A */
+ ["\u4B92", "\u4B92"], /* CJK Ideograph Extension A */
+ ["\u4B93", "\u4B93"], /* CJK Ideograph Extension A */
+ ["\u4B94", "\u4B94"], /* CJK Ideograph Extension A */
+ ["\u4B95", "\u4B95"], /* CJK Ideograph Extension A */
+ ["\u4B96", "\u4B96"], /* CJK Ideograph Extension A */
+ ["\u4B97", "\u4B97"], /* CJK Ideograph Extension A */
+ ["\u4B98", "\u4B98"], /* CJK Ideograph Extension A */
+ ["\u4B99", "\u4B99"], /* CJK Ideograph Extension A */
+ ["\u4B9A", "\u4B9A"], /* CJK Ideograph Extension A */
+ ["\u4B9B", "\u4B9B"], /* CJK Ideograph Extension A */
+ ["\u4B9C", "\u4B9C"], /* CJK Ideograph Extension A */
+ ["\u4B9D", "\u4B9D"], /* CJK Ideograph Extension A */
+ ["\u4B9E", "\u4B9E"], /* CJK Ideograph Extension A */
+ ["\u4B9F", "\u4B9F"], /* CJK Ideograph Extension A */
+ ["\u4BA0", "\u4BA0"], /* CJK Ideograph Extension A */
+ ["\u4BA1", "\u4BA1"], /* CJK Ideograph Extension A */
+ ["\u4BA2", "\u4BA2"], /* CJK Ideograph Extension A */
+ ["\u4BA3", "\u4BA3"], /* CJK Ideograph Extension A */
+ ["\u4BA4", "\u4BA4"], /* CJK Ideograph Extension A */
+ ["\u4BA5", "\u4BA5"], /* CJK Ideograph Extension A */
+ ["\u4BA6", "\u4BA6"], /* CJK Ideograph Extension A */
+ ["\u4BA7", "\u4BA7"], /* CJK Ideograph Extension A */
+ ["\u4BA8", "\u4BA8"], /* CJK Ideograph Extension A */
+ ["\u4BA9", "\u4BA9"], /* CJK Ideograph Extension A */
+ ["\u4BAA", "\u4BAA"], /* CJK Ideograph Extension A */
+ ["\u4BAB", "\u4BAB"], /* CJK Ideograph Extension A */
+ ["\u4BAC", "\u4BAC"], /* CJK Ideograph Extension A */
+ ["\u4BAD", "\u4BAD"], /* CJK Ideograph Extension A */
+ ["\u4BAE", "\u4BAE"], /* CJK Ideograph Extension A */
+ ["\u4BAF", "\u4BAF"], /* CJK Ideograph Extension A */
+ ["\u4BB0", "\u4BB0"], /* CJK Ideograph Extension A */
+ ["\u4BB1", "\u4BB1"], /* CJK Ideograph Extension A */
+ ["\u4BB2", "\u4BB2"], /* CJK Ideograph Extension A */
+ ["\u4BB3", "\u4BB3"], /* CJK Ideograph Extension A */
+ ["\u4BB4", "\u4BB4"], /* CJK Ideograph Extension A */
+ ["\u4BB5", "\u4BB5"], /* CJK Ideograph Extension A */
+ ["\u4BB6", "\u4BB6"], /* CJK Ideograph Extension A */
+ ["\u4BB7", "\u4BB7"], /* CJK Ideograph Extension A */
+ ["\u4BB8", "\u4BB8"], /* CJK Ideograph Extension A */
+ ["\u4BB9", "\u4BB9"], /* CJK Ideograph Extension A */
+ ["\u4BBA", "\u4BBA"], /* CJK Ideograph Extension A */
+ ["\u4BBB", "\u4BBB"], /* CJK Ideograph Extension A */
+ ["\u4BBC", "\u4BBC"], /* CJK Ideograph Extension A */
+ ["\u4BBD", "\u4BBD"], /* CJK Ideograph Extension A */
+ ["\u4BBE", "\u4BBE"], /* CJK Ideograph Extension A */
+ ["\u4BBF", "\u4BBF"], /* CJK Ideograph Extension A */
+ ["\u4BC0", "\u4BC0"], /* CJK Ideograph Extension A */
+ ["\u4BC1", "\u4BC1"], /* CJK Ideograph Extension A */
+ ["\u4BC2", "\u4BC2"], /* CJK Ideograph Extension A */
+ ["\u4BC3", "\u4BC3"], /* CJK Ideograph Extension A */
+ ["\u4BC4", "\u4BC4"], /* CJK Ideograph Extension A */
+ ["\u4BC5", "\u4BC5"], /* CJK Ideograph Extension A */
+ ["\u4BC6", "\u4BC6"], /* CJK Ideograph Extension A */
+ ["\u4BC7", "\u4BC7"], /* CJK Ideograph Extension A */
+ ["\u4BC8", "\u4BC8"], /* CJK Ideograph Extension A */
+ ["\u4BC9", "\u4BC9"], /* CJK Ideograph Extension A */
+ ["\u4BCA", "\u4BCA"], /* CJK Ideograph Extension A */
+ ["\u4BCB", "\u4BCB"], /* CJK Ideograph Extension A */
+ ["\u4BCC", "\u4BCC"], /* CJK Ideograph Extension A */
+ ["\u4BCD", "\u4BCD"], /* CJK Ideograph Extension A */
+ ["\u4BCE", "\u4BCE"], /* CJK Ideograph Extension A */
+ ["\u4BCF", "\u4BCF"], /* CJK Ideograph Extension A */
+ ["\u4BD0", "\u4BD0"], /* CJK Ideograph Extension A */
+ ["\u4BD1", "\u4BD1"], /* CJK Ideograph Extension A */
+ ["\u4BD2", "\u4BD2"], /* CJK Ideograph Extension A */
+ ["\u4BD3", "\u4BD3"], /* CJK Ideograph Extension A */
+ ["\u4BD4", "\u4BD4"], /* CJK Ideograph Extension A */
+ ["\u4BD5", "\u4BD5"], /* CJK Ideograph Extension A */
+ ["\u4BD6", "\u4BD6"], /* CJK Ideograph Extension A */
+ ["\u4BD7", "\u4BD7"], /* CJK Ideograph Extension A */
+ ["\u4BD8", "\u4BD8"], /* CJK Ideograph Extension A */
+ ["\u4BD9", "\u4BD9"], /* CJK Ideograph Extension A */
+ ["\u4BDA", "\u4BDA"], /* CJK Ideograph Extension A */
+ ["\u4BDB", "\u4BDB"], /* CJK Ideograph Extension A */
+ ["\u4BDC", "\u4BDC"], /* CJK Ideograph Extension A */
+ ["\u4BDD", "\u4BDD"], /* CJK Ideograph Extension A */
+ ["\u4BDE", "\u4BDE"], /* CJK Ideograph Extension A */
+ ["\u4BDF", "\u4BDF"], /* CJK Ideograph Extension A */
+ ["\u4BE0", "\u4BE0"], /* CJK Ideograph Extension A */
+ ["\u4BE1", "\u4BE1"], /* CJK Ideograph Extension A */
+ ["\u4BE2", "\u4BE2"], /* CJK Ideograph Extension A */
+ ["\u4BE3", "\u4BE3"], /* CJK Ideograph Extension A */
+ ["\u4BE4", "\u4BE4"], /* CJK Ideograph Extension A */
+ ["\u4BE5", "\u4BE5"], /* CJK Ideograph Extension A */
+ ["\u4BE6", "\u4BE6"], /* CJK Ideograph Extension A */
+ ["\u4BE7", "\u4BE7"], /* CJK Ideograph Extension A */
+ ["\u4BE8", "\u4BE8"], /* CJK Ideograph Extension A */
+ ["\u4BE9", "\u4BE9"], /* CJK Ideograph Extension A */
+ ["\u4BEA", "\u4BEA"], /* CJK Ideograph Extension A */
+ ["\u4BEB", "\u4BEB"], /* CJK Ideograph Extension A */
+ ["\u4BEC", "\u4BEC"], /* CJK Ideograph Extension A */
+ ["\u4BED", "\u4BED"], /* CJK Ideograph Extension A */
+ ["\u4BEE", "\u4BEE"], /* CJK Ideograph Extension A */
+ ["\u4BEF", "\u4BEF"], /* CJK Ideograph Extension A */
+ ["\u4BF0", "\u4BF0"], /* CJK Ideograph Extension A */
+ ["\u4BF1", "\u4BF1"], /* CJK Ideograph Extension A */
+ ["\u4BF2", "\u4BF2"], /* CJK Ideograph Extension A */
+ ["\u4BF3", "\u4BF3"], /* CJK Ideograph Extension A */
+ ["\u4BF4", "\u4BF4"], /* CJK Ideograph Extension A */
+ ["\u4BF5", "\u4BF5"], /* CJK Ideograph Extension A */
+ ["\u4BF6", "\u4BF6"], /* CJK Ideograph Extension A */
+ ["\u4BF7", "\u4BF7"], /* CJK Ideograph Extension A */
+ ["\u4BF8", "\u4BF8"], /* CJK Ideograph Extension A */
+ ["\u4BF9", "\u4BF9"], /* CJK Ideograph Extension A */
+ ["\u4BFA", "\u4BFA"], /* CJK Ideograph Extension A */
+ ["\u4BFB", "\u4BFB"], /* CJK Ideograph Extension A */
+ ["\u4BFC", "\u4BFC"], /* CJK Ideograph Extension A */
+ ["\u4BFD", "\u4BFD"], /* CJK Ideograph Extension A */
+ ["\u4BFE", "\u4BFE"], /* CJK Ideograph Extension A */
+ ["\u4BFF", "\u4BFF"], /* CJK Ideograph Extension A */
+ ["\u4C00", "\u4C00"], /* CJK Ideograph Extension A */
+ ["\u4C01", "\u4C01"], /* CJK Ideograph Extension A */
+ ["\u4C02", "\u4C02"], /* CJK Ideograph Extension A */
+ ["\u4C03", "\u4C03"], /* CJK Ideograph Extension A */
+ ["\u4C04", "\u4C04"], /* CJK Ideograph Extension A */
+ ["\u4C05", "\u4C05"], /* CJK Ideograph Extension A */
+ ["\u4C06", "\u4C06"], /* CJK Ideograph Extension A */
+ ["\u4C07", "\u4C07"], /* CJK Ideograph Extension A */
+ ["\u4C08", "\u4C08"], /* CJK Ideograph Extension A */
+ ["\u4C09", "\u4C09"], /* CJK Ideograph Extension A */
+ ["\u4C0A", "\u4C0A"], /* CJK Ideograph Extension A */
+ ["\u4C0B", "\u4C0B"], /* CJK Ideograph Extension A */
+ ["\u4C0C", "\u4C0C"], /* CJK Ideograph Extension A */
+ ["\u4C0D", "\u4C0D"], /* CJK Ideograph Extension A */
+ ["\u4C0E", "\u4C0E"], /* CJK Ideograph Extension A */
+ ["\u4C0F", "\u4C0F"], /* CJK Ideograph Extension A */
+ ["\u4C10", "\u4C10"], /* CJK Ideograph Extension A */
+ ["\u4C11", "\u4C11"], /* CJK Ideograph Extension A */
+ ["\u4C12", "\u4C12"], /* CJK Ideograph Extension A */
+ ["\u4C13", "\u4C13"], /* CJK Ideograph Extension A */
+ ["\u4C14", "\u4C14"], /* CJK Ideograph Extension A */
+ ["\u4C15", "\u4C15"], /* CJK Ideograph Extension A */
+ ["\u4C16", "\u4C16"], /* CJK Ideograph Extension A */
+ ["\u4C17", "\u4C17"], /* CJK Ideograph Extension A */
+ ["\u4C18", "\u4C18"], /* CJK Ideograph Extension A */
+ ["\u4C19", "\u4C19"], /* CJK Ideograph Extension A */
+ ["\u4C1A", "\u4C1A"], /* CJK Ideograph Extension A */
+ ["\u4C1B", "\u4C1B"], /* CJK Ideograph Extension A */
+ ["\u4C1C", "\u4C1C"], /* CJK Ideograph Extension A */
+ ["\u4C1D", "\u4C1D"], /* CJK Ideograph Extension A */
+ ["\u4C1E", "\u4C1E"], /* CJK Ideograph Extension A */
+ ["\u4C1F", "\u4C1F"], /* CJK Ideograph Extension A */
+ ["\u4C20", "\u4C20"], /* CJK Ideograph Extension A */
+ ["\u4C21", "\u4C21"], /* CJK Ideograph Extension A */
+ ["\u4C22", "\u4C22"], /* CJK Ideograph Extension A */
+ ["\u4C23", "\u4C23"], /* CJK Ideograph Extension A */
+ ["\u4C24", "\u4C24"], /* CJK Ideograph Extension A */
+ ["\u4C25", "\u4C25"], /* CJK Ideograph Extension A */
+ ["\u4C26", "\u4C26"], /* CJK Ideograph Extension A */
+ ["\u4C27", "\u4C27"], /* CJK Ideograph Extension A */
+ ["\u4C28", "\u4C28"], /* CJK Ideograph Extension A */
+ ["\u4C29", "\u4C29"], /* CJK Ideograph Extension A */
+ ["\u4C2A", "\u4C2A"], /* CJK Ideograph Extension A */
+ ["\u4C2B", "\u4C2B"], /* CJK Ideograph Extension A */
+ ["\u4C2C", "\u4C2C"], /* CJK Ideograph Extension A */
+ ["\u4C2D", "\u4C2D"], /* CJK Ideograph Extension A */
+ ["\u4C2E", "\u4C2E"], /* CJK Ideograph Extension A */
+ ["\u4C2F", "\u4C2F"], /* CJK Ideograph Extension A */
+ ["\u4C30", "\u4C30"], /* CJK Ideograph Extension A */
+ ["\u4C31", "\u4C31"], /* CJK Ideograph Extension A */
+ ["\u4C32", "\u4C32"], /* CJK Ideograph Extension A */
+ ["\u4C33", "\u4C33"], /* CJK Ideograph Extension A */
+ ["\u4C34", "\u4C34"], /* CJK Ideograph Extension A */
+ ["\u4C35", "\u4C35"], /* CJK Ideograph Extension A */
+ ["\u4C36", "\u4C36"], /* CJK Ideograph Extension A */
+ ["\u4C37", "\u4C37"], /* CJK Ideograph Extension A */
+ ["\u4C38", "\u4C38"], /* CJK Ideograph Extension A */
+ ["\u4C39", "\u4C39"], /* CJK Ideograph Extension A */
+ ["\u4C3A", "\u4C3A"], /* CJK Ideograph Extension A */
+ ["\u4C3B", "\u4C3B"], /* CJK Ideograph Extension A */
+ ["\u4C3C", "\u4C3C"], /* CJK Ideograph Extension A */
+ ["\u4C3D", "\u4C3D"], /* CJK Ideograph Extension A */
+ ["\u4C3E", "\u4C3E"], /* CJK Ideograph Extension A */
+ ["\u4C3F", "\u4C3F"], /* CJK Ideograph Extension A */
+ ["\u4C40", "\u4C40"], /* CJK Ideograph Extension A */
+ ["\u4C41", "\u4C41"], /* CJK Ideograph Extension A */
+ ["\u4C42", "\u4C42"], /* CJK Ideograph Extension A */
+ ["\u4C43", "\u4C43"], /* CJK Ideograph Extension A */
+ ["\u4C44", "\u4C44"], /* CJK Ideograph Extension A */
+ ["\u4C45", "\u4C45"], /* CJK Ideograph Extension A */
+ ["\u4C46", "\u4C46"], /* CJK Ideograph Extension A */
+ ["\u4C47", "\u4C47"], /* CJK Ideograph Extension A */
+ ["\u4C48", "\u4C48"], /* CJK Ideograph Extension A */
+ ["\u4C49", "\u4C49"], /* CJK Ideograph Extension A */
+ ["\u4C4A", "\u4C4A"], /* CJK Ideograph Extension A */
+ ["\u4C4B", "\u4C4B"], /* CJK Ideograph Extension A */
+ ["\u4C4C", "\u4C4C"], /* CJK Ideograph Extension A */
+ ["\u4C4D", "\u4C4D"], /* CJK Ideograph Extension A */
+ ["\u4C4E", "\u4C4E"], /* CJK Ideograph Extension A */
+ ["\u4C4F", "\u4C4F"], /* CJK Ideograph Extension A */
+ ["\u4C50", "\u4C50"], /* CJK Ideograph Extension A */
+ ["\u4C51", "\u4C51"], /* CJK Ideograph Extension A */
+ ["\u4C52", "\u4C52"], /* CJK Ideograph Extension A */
+ ["\u4C53", "\u4C53"], /* CJK Ideograph Extension A */
+ ["\u4C54", "\u4C54"], /* CJK Ideograph Extension A */
+ ["\u4C55", "\u4C55"], /* CJK Ideograph Extension A */
+ ["\u4C56", "\u4C56"], /* CJK Ideograph Extension A */
+ ["\u4C57", "\u4C57"], /* CJK Ideograph Extension A */
+ ["\u4C58", "\u4C58"], /* CJK Ideograph Extension A */
+ ["\u4C59", "\u4C59"], /* CJK Ideograph Extension A */
+ ["\u4C5A", "\u4C5A"], /* CJK Ideograph Extension A */
+ ["\u4C5B", "\u4C5B"], /* CJK Ideograph Extension A */
+ ["\u4C5C", "\u4C5C"], /* CJK Ideograph Extension A */
+ ["\u4C5D", "\u4C5D"], /* CJK Ideograph Extension A */
+ ["\u4C5E", "\u4C5E"], /* CJK Ideograph Extension A */
+ ["\u4C5F", "\u4C5F"], /* CJK Ideograph Extension A */
+ ["\u4C60", "\u4C60"], /* CJK Ideograph Extension A */
+ ["\u4C61", "\u4C61"], /* CJK Ideograph Extension A */
+ ["\u4C62", "\u4C62"], /* CJK Ideograph Extension A */
+ ["\u4C63", "\u4C63"], /* CJK Ideograph Extension A */
+ ["\u4C64", "\u4C64"], /* CJK Ideograph Extension A */
+ ["\u4C65", "\u4C65"], /* CJK Ideograph Extension A */
+ ["\u4C66", "\u4C66"], /* CJK Ideograph Extension A */
+ ["\u4C67", "\u4C67"], /* CJK Ideograph Extension A */
+ ["\u4C68", "\u4C68"], /* CJK Ideograph Extension A */
+ ["\u4C69", "\u4C69"], /* CJK Ideograph Extension A */
+ ["\u4C6A", "\u4C6A"], /* CJK Ideograph Extension A */
+ ["\u4C6B", "\u4C6B"], /* CJK Ideograph Extension A */
+ ["\u4C6C", "\u4C6C"], /* CJK Ideograph Extension A */
+ ["\u4C6D", "\u4C6D"], /* CJK Ideograph Extension A */
+ ["\u4C6E", "\u4C6E"], /* CJK Ideograph Extension A */
+ ["\u4C6F", "\u4C6F"], /* CJK Ideograph Extension A */
+ ["\u4C70", "\u4C70"], /* CJK Ideograph Extension A */
+ ["\u4C71", "\u4C71"], /* CJK Ideograph Extension A */
+ ["\u4C72", "\u4C72"], /* CJK Ideograph Extension A */
+ ["\u4C73", "\u4C73"], /* CJK Ideograph Extension A */
+ ["\u4C74", "\u4C74"], /* CJK Ideograph Extension A */
+ ["\u4C75", "\u4C75"], /* CJK Ideograph Extension A */
+ ["\u4C76", "\u4C76"], /* CJK Ideograph Extension A */
+ ["\u4C77", "\u4C77"], /* CJK Ideograph Extension A */
+ ["\u4C78", "\u4C78"], /* CJK Ideograph Extension A */
+ ["\u4C79", "\u4C79"], /* CJK Ideograph Extension A */
+ ["\u4C7A", "\u4C7A"], /* CJK Ideograph Extension A */
+ ["\u4C7B", "\u4C7B"], /* CJK Ideograph Extension A */
+ ["\u4C7C", "\u4C7C"], /* CJK Ideograph Extension A */
+ ["\u4C7D", "\u4C7D"], /* CJK Ideograph Extension A */
+ ["\u4C7E", "\u4C7E"], /* CJK Ideograph Extension A */
+ ["\u4C7F", "\u4C7F"], /* CJK Ideograph Extension A */
+ ["\u4C80", "\u4C80"], /* CJK Ideograph Extension A */
+ ["\u4C81", "\u4C81"], /* CJK Ideograph Extension A */
+ ["\u4C82", "\u4C82"], /* CJK Ideograph Extension A */
+ ["\u4C83", "\u4C83"], /* CJK Ideograph Extension A */
+ ["\u4C84", "\u4C84"], /* CJK Ideograph Extension A */
+ ["\u4C85", "\u4C85"], /* CJK Ideograph Extension A */
+ ["\u4C86", "\u4C86"], /* CJK Ideograph Extension A */
+ ["\u4C87", "\u4C87"], /* CJK Ideograph Extension A */
+ ["\u4C88", "\u4C88"], /* CJK Ideograph Extension A */
+ ["\u4C89", "\u4C89"], /* CJK Ideograph Extension A */
+ ["\u4C8A", "\u4C8A"], /* CJK Ideograph Extension A */
+ ["\u4C8B", "\u4C8B"], /* CJK Ideograph Extension A */
+ ["\u4C8C", "\u4C8C"], /* CJK Ideograph Extension A */
+ ["\u4C8D", "\u4C8D"], /* CJK Ideograph Extension A */
+ ["\u4C8E", "\u4C8E"], /* CJK Ideograph Extension A */
+ ["\u4C8F", "\u4C8F"], /* CJK Ideograph Extension A */
+ ["\u4C90", "\u4C90"], /* CJK Ideograph Extension A */
+ ["\u4C91", "\u4C91"], /* CJK Ideograph Extension A */
+ ["\u4C92", "\u4C92"], /* CJK Ideograph Extension A */
+ ["\u4C93", "\u4C93"], /* CJK Ideograph Extension A */
+ ["\u4C94", "\u4C94"], /* CJK Ideograph Extension A */
+ ["\u4C95", "\u4C95"], /* CJK Ideograph Extension A */
+ ["\u4C96", "\u4C96"], /* CJK Ideograph Extension A */
+ ["\u4C97", "\u4C97"], /* CJK Ideograph Extension A */
+ ["\u4C98", "\u4C98"], /* CJK Ideograph Extension A */
+ ["\u4C99", "\u4C99"], /* CJK Ideograph Extension A */
+ ["\u4C9A", "\u4C9A"], /* CJK Ideograph Extension A */
+ ["\u4C9B", "\u4C9B"], /* CJK Ideograph Extension A */
+ ["\u4C9C", "\u4C9C"], /* CJK Ideograph Extension A */
+ ["\u4C9D", "\u4C9D"], /* CJK Ideograph Extension A */
+ ["\u4C9E", "\u4C9E"], /* CJK Ideograph Extension A */
+ ["\u4C9F", "\u4C9F"], /* CJK Ideograph Extension A */
+ ["\u4CA0", "\u4CA0"], /* CJK Ideograph Extension A */
+ ["\u4CA1", "\u4CA1"], /* CJK Ideograph Extension A */
+ ["\u4CA2", "\u4CA2"], /* CJK Ideograph Extension A */
+ ["\u4CA3", "\u4CA3"], /* CJK Ideograph Extension A */
+ ["\u4CA4", "\u4CA4"], /* CJK Ideograph Extension A */
+ ["\u4CA5", "\u4CA5"], /* CJK Ideograph Extension A */
+ ["\u4CA6", "\u4CA6"], /* CJK Ideograph Extension A */
+ ["\u4CA7", "\u4CA7"], /* CJK Ideograph Extension A */
+ ["\u4CA8", "\u4CA8"], /* CJK Ideograph Extension A */
+ ["\u4CA9", "\u4CA9"], /* CJK Ideograph Extension A */
+ ["\u4CAA", "\u4CAA"], /* CJK Ideograph Extension A */
+ ["\u4CAB", "\u4CAB"], /* CJK Ideograph Extension A */
+ ["\u4CAC", "\u4CAC"], /* CJK Ideograph Extension A */
+ ["\u4CAD", "\u4CAD"], /* CJK Ideograph Extension A */
+ ["\u4CAE", "\u4CAE"], /* CJK Ideograph Extension A */
+ ["\u4CAF", "\u4CAF"], /* CJK Ideograph Extension A */
+ ["\u4CB0", "\u4CB0"], /* CJK Ideograph Extension A */
+ ["\u4CB1", "\u4CB1"], /* CJK Ideograph Extension A */
+ ["\u4CB2", "\u4CB2"], /* CJK Ideograph Extension A */
+ ["\u4CB3", "\u4CB3"], /* CJK Ideograph Extension A */
+ ["\u4CB4", "\u4CB4"], /* CJK Ideograph Extension A */
+ ["\u4CB5", "\u4CB5"], /* CJK Ideograph Extension A */
+ ["\u4CB6", "\u4CB6"], /* CJK Ideograph Extension A */
+ ["\u4CB7", "\u4CB7"], /* CJK Ideograph Extension A */
+ ["\u4CB8", "\u4CB8"], /* CJK Ideograph Extension A */
+ ["\u4CB9", "\u4CB9"], /* CJK Ideograph Extension A */
+ ["\u4CBA", "\u4CBA"], /* CJK Ideograph Extension A */
+ ["\u4CBB", "\u4CBB"], /* CJK Ideograph Extension A */
+ ["\u4CBC", "\u4CBC"], /* CJK Ideograph Extension A */
+ ["\u4CBD", "\u4CBD"], /* CJK Ideograph Extension A */
+ ["\u4CBE", "\u4CBE"], /* CJK Ideograph Extension A */
+ ["\u4CBF", "\u4CBF"], /* CJK Ideograph Extension A */
+ ["\u4CC0", "\u4CC0"], /* CJK Ideograph Extension A */
+ ["\u4CC1", "\u4CC1"], /* CJK Ideograph Extension A */
+ ["\u4CC2", "\u4CC2"], /* CJK Ideograph Extension A */
+ ["\u4CC3", "\u4CC3"], /* CJK Ideograph Extension A */
+ ["\u4CC4", "\u4CC4"], /* CJK Ideograph Extension A */
+ ["\u4CC5", "\u4CC5"], /* CJK Ideograph Extension A */
+ ["\u4CC6", "\u4CC6"], /* CJK Ideograph Extension A */
+ ["\u4CC7", "\u4CC7"], /* CJK Ideograph Extension A */
+ ["\u4CC8", "\u4CC8"], /* CJK Ideograph Extension A */
+ ["\u4CC9", "\u4CC9"], /* CJK Ideograph Extension A */
+ ["\u4CCA", "\u4CCA"], /* CJK Ideograph Extension A */
+ ["\u4CCB", "\u4CCB"], /* CJK Ideograph Extension A */
+ ["\u4CCC", "\u4CCC"], /* CJK Ideograph Extension A */
+ ["\u4CCD", "\u4CCD"], /* CJK Ideograph Extension A */
+ ["\u4CCE", "\u4CCE"], /* CJK Ideograph Extension A */
+ ["\u4CCF", "\u4CCF"], /* CJK Ideograph Extension A */
+ ["\u4CD0", "\u4CD0"], /* CJK Ideograph Extension A */
+ ["\u4CD1", "\u4CD1"], /* CJK Ideograph Extension A */
+ ["\u4CD2", "\u4CD2"], /* CJK Ideograph Extension A */
+ ["\u4CD3", "\u4CD3"], /* CJK Ideograph Extension A */
+ ["\u4CD4", "\u4CD4"], /* CJK Ideograph Extension A */
+ ["\u4CD5", "\u4CD5"], /* CJK Ideograph Extension A */
+ ["\u4CD6", "\u4CD6"], /* CJK Ideograph Extension A */
+ ["\u4CD7", "\u4CD7"], /* CJK Ideograph Extension A */
+ ["\u4CD8", "\u4CD8"], /* CJK Ideograph Extension A */
+ ["\u4CD9", "\u4CD9"], /* CJK Ideograph Extension A */
+ ["\u4CDA", "\u4CDA"], /* CJK Ideograph Extension A */
+ ["\u4CDB", "\u4CDB"], /* CJK Ideograph Extension A */
+ ["\u4CDC", "\u4CDC"], /* CJK Ideograph Extension A */
+ ["\u4CDD", "\u4CDD"], /* CJK Ideograph Extension A */
+ ["\u4CDE", "\u4CDE"], /* CJK Ideograph Extension A */
+ ["\u4CDF", "\u4CDF"], /* CJK Ideograph Extension A */
+ ["\u4CE0", "\u4CE0"], /* CJK Ideograph Extension A */
+ ["\u4CE1", "\u4CE1"], /* CJK Ideograph Extension A */
+ ["\u4CE2", "\u4CE2"], /* CJK Ideograph Extension A */
+ ["\u4CE3", "\u4CE3"], /* CJK Ideograph Extension A */
+ ["\u4CE4", "\u4CE4"], /* CJK Ideograph Extension A */
+ ["\u4CE5", "\u4CE5"], /* CJK Ideograph Extension A */
+ ["\u4CE6", "\u4CE6"], /* CJK Ideograph Extension A */
+ ["\u4CE7", "\u4CE7"], /* CJK Ideograph Extension A */
+ ["\u4CE8", "\u4CE8"], /* CJK Ideograph Extension A */
+ ["\u4CE9", "\u4CE9"], /* CJK Ideograph Extension A */
+ ["\u4CEA", "\u4CEA"], /* CJK Ideograph Extension A */
+ ["\u4CEB", "\u4CEB"], /* CJK Ideograph Extension A */
+ ["\u4CEC", "\u4CEC"], /* CJK Ideograph Extension A */
+ ["\u4CED", "\u4CED"], /* CJK Ideograph Extension A */
+ ["\u4CEE", "\u4CEE"], /* CJK Ideograph Extension A */
+ ["\u4CEF", "\u4CEF"], /* CJK Ideograph Extension A */
+ ["\u4CF0", "\u4CF0"], /* CJK Ideograph Extension A */
+ ["\u4CF1", "\u4CF1"], /* CJK Ideograph Extension A */
+ ["\u4CF2", "\u4CF2"], /* CJK Ideograph Extension A */
+ ["\u4CF3", "\u4CF3"], /* CJK Ideograph Extension A */
+ ["\u4CF4", "\u4CF4"], /* CJK Ideograph Extension A */
+ ["\u4CF5", "\u4CF5"], /* CJK Ideograph Extension A */
+ ["\u4CF6", "\u4CF6"], /* CJK Ideograph Extension A */
+ ["\u4CF7", "\u4CF7"], /* CJK Ideograph Extension A */
+ ["\u4CF8", "\u4CF8"], /* CJK Ideograph Extension A */
+ ["\u4CF9", "\u4CF9"], /* CJK Ideograph Extension A */
+ ["\u4CFA", "\u4CFA"], /* CJK Ideograph Extension A */
+ ["\u4CFB", "\u4CFB"], /* CJK Ideograph Extension A */
+ ["\u4CFC", "\u4CFC"], /* CJK Ideograph Extension A */
+ ["\u4CFD", "\u4CFD"], /* CJK Ideograph Extension A */
+ ["\u4CFE", "\u4CFE"], /* CJK Ideograph Extension A */
+ ["\u4CFF", "\u4CFF"], /* CJK Ideograph Extension A */
+ ["\u4D00", "\u4D00"], /* CJK Ideograph Extension A */
+ ["\u4D01", "\u4D01"], /* CJK Ideograph Extension A */
+ ["\u4D02", "\u4D02"], /* CJK Ideograph Extension A */
+ ["\u4D03", "\u4D03"], /* CJK Ideograph Extension A */
+ ["\u4D04", "\u4D04"], /* CJK Ideograph Extension A */
+ ["\u4D05", "\u4D05"], /* CJK Ideograph Extension A */
+ ["\u4D06", "\u4D06"], /* CJK Ideograph Extension A */
+ ["\u4D07", "\u4D07"], /* CJK Ideograph Extension A */
+ ["\u4D08", "\u4D08"], /* CJK Ideograph Extension A */
+ ["\u4D09", "\u4D09"], /* CJK Ideograph Extension A */
+ ["\u4D0A", "\u4D0A"], /* CJK Ideograph Extension A */
+ ["\u4D0B", "\u4D0B"], /* CJK Ideograph Extension A */
+ ["\u4D0C", "\u4D0C"], /* CJK Ideograph Extension A */
+ ["\u4D0D", "\u4D0D"], /* CJK Ideograph Extension A */
+ ["\u4D0E", "\u4D0E"], /* CJK Ideograph Extension A */
+ ["\u4D0F", "\u4D0F"], /* CJK Ideograph Extension A */
+ ["\u4D10", "\u4D10"], /* CJK Ideograph Extension A */
+ ["\u4D11", "\u4D11"], /* CJK Ideograph Extension A */
+ ["\u4D12", "\u4D12"], /* CJK Ideograph Extension A */
+ ["\u4D13", "\u4D13"], /* CJK Ideograph Extension A */
+ ["\u4D14", "\u4D14"], /* CJK Ideograph Extension A */
+ ["\u4D15", "\u4D15"], /* CJK Ideograph Extension A */
+ ["\u4D16", "\u4D16"], /* CJK Ideograph Extension A */
+ ["\u4D17", "\u4D17"], /* CJK Ideograph Extension A */
+ ["\u4D18", "\u4D18"], /* CJK Ideograph Extension A */
+ ["\u4D19", "\u4D19"], /* CJK Ideograph Extension A */
+ ["\u4D1A", "\u4D1A"], /* CJK Ideograph Extension A */
+ ["\u4D1B", "\u4D1B"], /* CJK Ideograph Extension A */
+ ["\u4D1C", "\u4D1C"], /* CJK Ideograph Extension A */
+ ["\u4D1D", "\u4D1D"], /* CJK Ideograph Extension A */
+ ["\u4D1E", "\u4D1E"], /* CJK Ideograph Extension A */
+ ["\u4D1F", "\u4D1F"], /* CJK Ideograph Extension A */
+ ["\u4D20", "\u4D20"], /* CJK Ideograph Extension A */
+ ["\u4D21", "\u4D21"], /* CJK Ideograph Extension A */
+ ["\u4D22", "\u4D22"], /* CJK Ideograph Extension A */
+ ["\u4D23", "\u4D23"], /* CJK Ideograph Extension A */
+ ["\u4D24", "\u4D24"], /* CJK Ideograph Extension A */
+ ["\u4D25", "\u4D25"], /* CJK Ideograph Extension A */
+ ["\u4D26", "\u4D26"], /* CJK Ideograph Extension A */
+ ["\u4D27", "\u4D27"], /* CJK Ideograph Extension A */
+ ["\u4D28", "\u4D28"], /* CJK Ideograph Extension A */
+ ["\u4D29", "\u4D29"], /* CJK Ideograph Extension A */
+ ["\u4D2A", "\u4D2A"], /* CJK Ideograph Extension A */
+ ["\u4D2B", "\u4D2B"], /* CJK Ideograph Extension A */
+ ["\u4D2C", "\u4D2C"], /* CJK Ideograph Extension A */
+ ["\u4D2D", "\u4D2D"], /* CJK Ideograph Extension A */
+ ["\u4D2E", "\u4D2E"], /* CJK Ideograph Extension A */
+ ["\u4D2F", "\u4D2F"], /* CJK Ideograph Extension A */
+ ["\u4D30", "\u4D30"], /* CJK Ideograph Extension A */
+ ["\u4D31", "\u4D31"], /* CJK Ideograph Extension A */
+ ["\u4D32", "\u4D32"], /* CJK Ideograph Extension A */
+ ["\u4D33", "\u4D33"], /* CJK Ideograph Extension A */
+ ["\u4D34", "\u4D34"], /* CJK Ideograph Extension A */
+ ["\u4D35", "\u4D35"], /* CJK Ideograph Extension A */
+ ["\u4D36", "\u4D36"], /* CJK Ideograph Extension A */
+ ["\u4D37", "\u4D37"], /* CJK Ideograph Extension A */
+ ["\u4D38", "\u4D38"], /* CJK Ideograph Extension A */
+ ["\u4D39", "\u4D39"], /* CJK Ideograph Extension A */
+ ["\u4D3A", "\u4D3A"], /* CJK Ideograph Extension A */
+ ["\u4D3B", "\u4D3B"], /* CJK Ideograph Extension A */
+ ["\u4D3C", "\u4D3C"], /* CJK Ideograph Extension A */
+ ["\u4D3D", "\u4D3D"], /* CJK Ideograph Extension A */
+ ["\u4D3E", "\u4D3E"], /* CJK Ideograph Extension A */
+ ["\u4D3F", "\u4D3F"], /* CJK Ideograph Extension A */
+ ["\u4D40", "\u4D40"], /* CJK Ideograph Extension A */
+ ["\u4D41", "\u4D41"], /* CJK Ideograph Extension A */
+ ["\u4D42", "\u4D42"], /* CJK Ideograph Extension A */
+ ["\u4D43", "\u4D43"], /* CJK Ideograph Extension A */
+ ["\u4D44", "\u4D44"], /* CJK Ideograph Extension A */
+ ["\u4D45", "\u4D45"], /* CJK Ideograph Extension A */
+ ["\u4D46", "\u4D46"], /* CJK Ideograph Extension A */
+ ["\u4D47", "\u4D47"], /* CJK Ideograph Extension A */
+ ["\u4D48", "\u4D48"], /* CJK Ideograph Extension A */
+ ["\u4D49", "\u4D49"], /* CJK Ideograph Extension A */
+ ["\u4D4A", "\u4D4A"], /* CJK Ideograph Extension A */
+ ["\u4D4B", "\u4D4B"], /* CJK Ideograph Extension A */
+ ["\u4D4C", "\u4D4C"], /* CJK Ideograph Extension A */
+ ["\u4D4D", "\u4D4D"], /* CJK Ideograph Extension A */
+ ["\u4D4E", "\u4D4E"], /* CJK Ideograph Extension A */
+ ["\u4D4F", "\u4D4F"], /* CJK Ideograph Extension A */
+ ["\u4D50", "\u4D50"], /* CJK Ideograph Extension A */
+ ["\u4D51", "\u4D51"], /* CJK Ideograph Extension A */
+ ["\u4D52", "\u4D52"], /* CJK Ideograph Extension A */
+ ["\u4D53", "\u4D53"], /* CJK Ideograph Extension A */
+ ["\u4D54", "\u4D54"], /* CJK Ideograph Extension A */
+ ["\u4D55", "\u4D55"], /* CJK Ideograph Extension A */
+ ["\u4D56", "\u4D56"], /* CJK Ideograph Extension A */
+ ["\u4D57", "\u4D57"], /* CJK Ideograph Extension A */
+ ["\u4D58", "\u4D58"], /* CJK Ideograph Extension A */
+ ["\u4D59", "\u4D59"], /* CJK Ideograph Extension A */
+ ["\u4D5A", "\u4D5A"], /* CJK Ideograph Extension A */
+ ["\u4D5B", "\u4D5B"], /* CJK Ideograph Extension A */
+ ["\u4D5C", "\u4D5C"], /* CJK Ideograph Extension A */
+ ["\u4D5D", "\u4D5D"], /* CJK Ideograph Extension A */
+ ["\u4D5E", "\u4D5E"], /* CJK Ideograph Extension A */
+ ["\u4D5F", "\u4D5F"], /* CJK Ideograph Extension A */
+ ["\u4D60", "\u4D60"], /* CJK Ideograph Extension A */
+ ["\u4D61", "\u4D61"], /* CJK Ideograph Extension A */
+ ["\u4D62", "\u4D62"], /* CJK Ideograph Extension A */
+ ["\u4D63", "\u4D63"], /* CJK Ideograph Extension A */
+ ["\u4D64", "\u4D64"], /* CJK Ideograph Extension A */
+ ["\u4D65", "\u4D65"], /* CJK Ideograph Extension A */
+ ["\u4D66", "\u4D66"], /* CJK Ideograph Extension A */
+ ["\u4D67", "\u4D67"], /* CJK Ideograph Extension A */
+ ["\u4D68", "\u4D68"], /* CJK Ideograph Extension A */
+ ["\u4D69", "\u4D69"], /* CJK Ideograph Extension A */
+ ["\u4D6A", "\u4D6A"], /* CJK Ideograph Extension A */
+ ["\u4D6B", "\u4D6B"], /* CJK Ideograph Extension A */
+ ["\u4D6C", "\u4D6C"], /* CJK Ideograph Extension A */
+ ["\u4D6D", "\u4D6D"], /* CJK Ideograph Extension A */
+ ["\u4D6E", "\u4D6E"], /* CJK Ideograph Extension A */
+ ["\u4D6F", "\u4D6F"], /* CJK Ideograph Extension A */
+ ["\u4D70", "\u4D70"], /* CJK Ideograph Extension A */
+ ["\u4D71", "\u4D71"], /* CJK Ideograph Extension A */
+ ["\u4D72", "\u4D72"], /* CJK Ideograph Extension A */
+ ["\u4D73", "\u4D73"], /* CJK Ideograph Extension A */
+ ["\u4D74", "\u4D74"], /* CJK Ideograph Extension A */
+ ["\u4D75", "\u4D75"], /* CJK Ideograph Extension A */
+ ["\u4D76", "\u4D76"], /* CJK Ideograph Extension A */
+ ["\u4D77", "\u4D77"], /* CJK Ideograph Extension A */
+ ["\u4D78", "\u4D78"], /* CJK Ideograph Extension A */
+ ["\u4D79", "\u4D79"], /* CJK Ideograph Extension A */
+ ["\u4D7A", "\u4D7A"], /* CJK Ideograph Extension A */
+ ["\u4D7B", "\u4D7B"], /* CJK Ideograph Extension A */
+ ["\u4D7C", "\u4D7C"], /* CJK Ideograph Extension A */
+ ["\u4D7D", "\u4D7D"], /* CJK Ideograph Extension A */
+ ["\u4D7E", "\u4D7E"], /* CJK Ideograph Extension A */
+ ["\u4D7F", "\u4D7F"], /* CJK Ideograph Extension A */
+ ["\u4D80", "\u4D80"], /* CJK Ideograph Extension A */
+ ["\u4D81", "\u4D81"], /* CJK Ideograph Extension A */
+ ["\u4D82", "\u4D82"], /* CJK Ideograph Extension A */
+ ["\u4D83", "\u4D83"], /* CJK Ideograph Extension A */
+ ["\u4D84", "\u4D84"], /* CJK Ideograph Extension A */
+ ["\u4D85", "\u4D85"], /* CJK Ideograph Extension A */
+ ["\u4D86", "\u4D86"], /* CJK Ideograph Extension A */
+ ["\u4D87", "\u4D87"], /* CJK Ideograph Extension A */
+ ["\u4D88", "\u4D88"], /* CJK Ideograph Extension A */
+ ["\u4D89", "\u4D89"], /* CJK Ideograph Extension A */
+ ["\u4D8A", "\u4D8A"], /* CJK Ideograph Extension A */
+ ["\u4D8B", "\u4D8B"], /* CJK Ideograph Extension A */
+ ["\u4D8C", "\u4D8C"], /* CJK Ideograph Extension A */
+ ["\u4D8D", "\u4D8D"], /* CJK Ideograph Extension A */
+ ["\u4D8E", "\u4D8E"], /* CJK Ideograph Extension A */
+ ["\u4D8F", "\u4D8F"], /* CJK Ideograph Extension A */
+ ["\u4D90", "\u4D90"], /* CJK Ideograph Extension A */
+ ["\u4D91", "\u4D91"], /* CJK Ideograph Extension A */
+ ["\u4D92", "\u4D92"], /* CJK Ideograph Extension A */
+ ["\u4D93", "\u4D93"], /* CJK Ideograph Extension A */
+ ["\u4D94", "\u4D94"], /* CJK Ideograph Extension A */
+ ["\u4D95", "\u4D95"], /* CJK Ideograph Extension A */
+ ["\u4D96", "\u4D96"], /* CJK Ideograph Extension A */
+ ["\u4D97", "\u4D97"], /* CJK Ideograph Extension A */
+ ["\u4D98", "\u4D98"], /* CJK Ideograph Extension A */
+ ["\u4D99", "\u4D99"], /* CJK Ideograph Extension A */
+ ["\u4D9A", "\u4D9A"], /* CJK Ideograph Extension A */
+ ["\u4D9B", "\u4D9B"], /* CJK Ideograph Extension A */
+ ["\u4D9C", "\u4D9C"], /* CJK Ideograph Extension A */
+ ["\u4D9D", "\u4D9D"], /* CJK Ideograph Extension A */
+ ["\u4D9E", "\u4D9E"], /* CJK Ideograph Extension A */
+ ["\u4D9F", "\u4D9F"], /* CJK Ideograph Extension A */
+ ["\u4DA0", "\u4DA0"], /* CJK Ideograph Extension A */
+ ["\u4DA1", "\u4DA1"], /* CJK Ideograph Extension A */
+ ["\u4DA2", "\u4DA2"], /* CJK Ideograph Extension A */
+ ["\u4DA3", "\u4DA3"], /* CJK Ideograph Extension A */
+ ["\u4DA4", "\u4DA4"], /* CJK Ideograph Extension A */
+ ["\u4DA5", "\u4DA5"], /* CJK Ideograph Extension A */
+ ["\u4DA6", "\u4DA6"], /* CJK Ideograph Extension A */
+ ["\u4DA7", "\u4DA7"], /* CJK Ideograph Extension A */
+ ["\u4DA8", "\u4DA8"], /* CJK Ideograph Extension A */
+ ["\u4DA9", "\u4DA9"], /* CJK Ideograph Extension A */
+ ["\u4DAA", "\u4DAA"], /* CJK Ideograph Extension A */
+ ["\u4DAB", "\u4DAB"], /* CJK Ideograph Extension A */
+ ["\u4DAC", "\u4DAC"], /* CJK Ideograph Extension A */
+ ["\u4DAD", "\u4DAD"], /* CJK Ideograph Extension A */
+ ["\u4DAE", "\u4DAE"], /* CJK Ideograph Extension A */
+ ["\u4DAF", "\u4DAF"], /* CJK Ideograph Extension A */
+ ["\u4DB0", "\u4DB0"], /* CJK Ideograph Extension A */
+ ["\u4DB1", "\u4DB1"], /* CJK Ideograph Extension A */
+ ["\u4DB2", "\u4DB2"], /* CJK Ideograph Extension A */
+ ["\u4DB3", "\u4DB3"], /* CJK Ideograph Extension A */
+ ["\u4DB4", "\u4DB4"], /* CJK Ideograph Extension A */
+ ["\u4DB5", "\u4DB5"], /* CJK Ideograph Extension A */
+ ["\u4DB6", "\u4DB6"],
+ ["\u4DB7", "\u4DB7"],
+ ["\u4DB8", "\u4DB8"],
+ ["\u4DB9", "\u4DB9"],
+ ["\u4DBA", "\u4DBA"],
+ ["\u4DBB", "\u4DBB"],
+ ["\u4DBC", "\u4DBC"],
+ ["\u4DBD", "\u4DBD"],
+ ["\u4DBE", "\u4DBE"],
+ ["\u4DBF", "\u4DBF"],
+ ["\u4DC0", "\u4DC0"], /* HEXAGRAM FOR THE CREATIVE HEAVEN */
+ ["\u4DC1", "\u4DC1"], /* HEXAGRAM FOR THE RECEPTIVE EARTH */
+ ["\u4DC2", "\u4DC2"], /* HEXAGRAM FOR DIFFICULTY AT THE BEGINNING */
+ ["\u4DC3", "\u4DC3"], /* HEXAGRAM FOR YOUTHFUL FOLLY */
+ ["\u4DC4", "\u4DC4"], /* HEXAGRAM FOR WAITING */
+ ["\u4DC5", "\u4DC5"], /* HEXAGRAM FOR CONFLICT */
+ ["\u4DC6", "\u4DC6"], /* HEXAGRAM FOR THE ARMY */
+ ["\u4DC7", "\u4DC7"], /* HEXAGRAM FOR HOLDING TOGETHER */
+ ["\u4DC8", "\u4DC8"], /* HEXAGRAM FOR SMALL TAMING */
+ ["\u4DC9", "\u4DC9"], /* HEXAGRAM FOR TREADING */
+ ["\u4DCA", "\u4DCA"], /* HEXAGRAM FOR PEACE */
+ ["\u4DCB", "\u4DCB"], /* HEXAGRAM FOR STANDSTILL */
+ ["\u4DCC", "\u4DCC"], /* HEXAGRAM FOR FELLOWSHIP */
+ ["\u4DCD", "\u4DCD"], /* HEXAGRAM FOR GREAT POSSESSION */
+ ["\u4DCE", "\u4DCE"], /* HEXAGRAM FOR MODESTY */
+ ["\u4DCF", "\u4DCF"], /* HEXAGRAM FOR ENTHUSIASM */
+ ["\u4DD0", "\u4DD0"], /* HEXAGRAM FOR FOLLOWING */
+ ["\u4DD1", "\u4DD1"], /* HEXAGRAM FOR WORK ON THE DECAYED */
+ ["\u4DD2", "\u4DD2"], /* HEXAGRAM FOR APPROACH */
+ ["\u4DD3", "\u4DD3"], /* HEXAGRAM FOR CONTEMPLATION */
+ ["\u4DD4", "\u4DD4"], /* HEXAGRAM FOR BITING THROUGH */
+ ["\u4DD5", "\u4DD5"], /* HEXAGRAM FOR GRACE */
+ ["\u4DD6", "\u4DD6"], /* HEXAGRAM FOR SPLITTING APART */
+ ["\u4DD7", "\u4DD7"], /* HEXAGRAM FOR RETURN */
+ ["\u4DD8", "\u4DD8"], /* HEXAGRAM FOR INNOCENCE */
+ ["\u4DD9", "\u4DD9"], /* HEXAGRAM FOR GREAT TAMING */
+ ["\u4DDA", "\u4DDA"], /* HEXAGRAM FOR MOUTH CORNERS */
+ ["\u4DDB", "\u4DDB"], /* HEXAGRAM FOR GREAT PREPONDERANCE */
+ ["\u4DDC", "\u4DDC"], /* HEXAGRAM FOR THE ABYSMAL WATER */
+ ["\u4DDD", "\u4DDD"], /* HEXAGRAM FOR THE CLINGING FIRE */
+ ["\u4DDE", "\u4DDE"], /* HEXAGRAM FOR INFLUENCE */
+ ["\u4DDF", "\u4DDF"], /* HEXAGRAM FOR DURATION */
+ ["\u4DE0", "\u4DE0"], /* HEXAGRAM FOR RETREAT */
+ ["\u4DE1", "\u4DE1"], /* HEXAGRAM FOR GREAT POWER */
+ ["\u4DE2", "\u4DE2"], /* HEXAGRAM FOR PROGRESS */
+ ["\u4DE3", "\u4DE3"], /* HEXAGRAM FOR DARKENING OF THE LIGHT */
+ ["\u4DE4", "\u4DE4"], /* HEXAGRAM FOR THE FAMILY */
+ ["\u4DE5", "\u4DE5"], /* HEXAGRAM FOR OPPOSITION */
+ ["\u4DE6", "\u4DE6"], /* HEXAGRAM FOR OBSTRUCTION */
+ ["\u4DE7", "\u4DE7"], /* HEXAGRAM FOR DELIVERANCE */
+ ["\u4DE8", "\u4DE8"], /* HEXAGRAM FOR DECREASE */
+ ["\u4DE9", "\u4DE9"], /* HEXAGRAM FOR INCREASE */
+ ["\u4DEA", "\u4DEA"], /* HEXAGRAM FOR BREAKTHROUGH */
+ ["\u4DEB", "\u4DEB"], /* HEXAGRAM FOR COMING TO MEET */
+ ["\u4DEC", "\u4DEC"], /* HEXAGRAM FOR GATHERING TOGETHER */
+ ["\u4DED", "\u4DED"], /* HEXAGRAM FOR PUSHING UPWARD */
+ ["\u4DEE", "\u4DEE"], /* HEXAGRAM FOR OPPRESSION */
+ ["\u4DEF", "\u4DEF"], /* HEXAGRAM FOR THE WELL */
+ ["\u4DF0", "\u4DF0"], /* HEXAGRAM FOR REVOLUTION */
+ ["\u4DF1", "\u4DF1"], /* HEXAGRAM FOR THE CAULDRON */
+ ["\u4DF2", "\u4DF2"], /* HEXAGRAM FOR THE AROUSING THUNDER */
+ ["\u4DF3", "\u4DF3"], /* HEXAGRAM FOR THE KEEPING STILL MOUNTAIN */
+ ["\u4DF4", "\u4DF4"], /* HEXAGRAM FOR DEVELOPMENT */
+ ["\u4DF5", "\u4DF5"], /* HEXAGRAM FOR THE MARRYING MAIDEN */
+ ["\u4DF6", "\u4DF6"], /* HEXAGRAM FOR ABUNDANCE */
+ ["\u4DF7", "\u4DF7"], /* HEXAGRAM FOR THE WANDERER */
+ ["\u4DF8", "\u4DF8"], /* HEXAGRAM FOR THE GENTLE WIND */
+ ["\u4DF9", "\u4DF9"], /* HEXAGRAM FOR THE JOYOUS LAKE */
+ ["\u4DFA", "\u4DFA"], /* HEXAGRAM FOR DISPERSION */
+ ["\u4DFB", "\u4DFB"], /* HEXAGRAM FOR LIMITATION */
+ ["\u4DFC", "\u4DFC"], /* HEXAGRAM FOR INNER TRUTH */
+ ["\u4DFD", "\u4DFD"], /* HEXAGRAM FOR SMALL PREPONDERANCE */
+ ["\u4DFE", "\u4DFE"], /* HEXAGRAM FOR AFTER COMPLETION */
+ ["\u4DFF", "\u4DFF"], /* HEXAGRAM FOR BEFORE COMPLETION */
+ ["\u4E00", "\u4E00"], /* CJK Ideograph */
+ ["\u4E01", "\u4E01"], /* CJK Ideograph */
+ ["\u4E02", "\u4E02"], /* CJK Ideograph */
+ ["\u4E03", "\u4E03"], /* CJK Ideograph */
+ ["\u4E04", "\u4E04"], /* CJK Ideograph */
+ ["\u4E05", "\u4E05"], /* CJK Ideograph */
+ ["\u4E06", "\u4E06"], /* CJK Ideograph */
+ ["\u4E07", "\u4E07"], /* CJK Ideograph */
+ ["\u4E08", "\u4E08"], /* CJK Ideograph */
+ ["\u4E09", "\u4E09"], /* CJK Ideograph */
+ ["\u4E0A", "\u4E0A"], /* CJK Ideograph */
+ ["\u4E0B", "\u4E0B"], /* CJK Ideograph */
+ ["\u4E0C", "\u4E0C"], /* CJK Ideograph */
+ ["\u4E0D", "\u4E0D"], /* CJK Ideograph */
+ ["\u4E0E", "\u4E0E"], /* CJK Ideograph */
+ ["\u4E0F", "\u4E0F"], /* CJK Ideograph */
+ ["\u4E10", "\u4E10"], /* CJK Ideograph */
+ ["\u4E11", "\u4E11"], /* CJK Ideograph */
+ ["\u4E12", "\u4E12"], /* CJK Ideograph */
+ ["\u4E13", "\u4E13"], /* CJK Ideograph */
+ ["\u4E14", "\u4E14"], /* CJK Ideograph */
+ ["\u4E15", "\u4E15"], /* CJK Ideograph */
+ ["\u4E16", "\u4E16"], /* CJK Ideograph */
+ ["\u4E17", "\u4E17"], /* CJK Ideograph */
+ ["\u4E18", "\u4E18"], /* CJK Ideograph */
+ ["\u4E19", "\u4E19"], /* CJK Ideograph */
+ ["\u4E1A", "\u4E1A"], /* CJK Ideograph */
+ ["\u4E1B", "\u4E1B"], /* CJK Ideograph */
+ ["\u4E1C", "\u4E1C"], /* CJK Ideograph */
+ ["\u4E1D", "\u4E1D"], /* CJK Ideograph */
+ ["\u4E1E", "\u4E1E"], /* CJK Ideograph */
+ ["\u4E1F", "\u4E1F"], /* CJK Ideograph */
+ ["\u4E20", "\u4E20"], /* CJK Ideograph */
+ ["\u4E21", "\u4E21"], /* CJK Ideograph */
+ ["\u4E22", "\u4E22"], /* CJK Ideograph */
+ ["\u4E23", "\u4E23"], /* CJK Ideograph */
+ ["\u4E24", "\u4E24"], /* CJK Ideograph */
+ ["\u4E25", "\u4E25"], /* CJK Ideograph */
+ ["\u4E26", "\u4E26"], /* CJK Ideograph */
+ ["\u4E27", "\u4E27"], /* CJK Ideograph */
+ ["\u4E28", "\u4E28"], /* CJK Ideograph */
+ ["\u4E29", "\u4E29"], /* CJK Ideograph */
+ ["\u4E2A", "\u4E2A"], /* CJK Ideograph */
+ ["\u4E2B", "\u4E2B"], /* CJK Ideograph */
+ ["\u4E2C", "\u4E2C"], /* CJK Ideograph */
+ ["\u4E2D", "\u4E2D"], /* CJK Ideograph */
+ ["\u4E2E", "\u4E2E"], /* CJK Ideograph */
+ ["\u4E2F", "\u4E2F"], /* CJK Ideograph */
+ ["\u4E30", "\u4E30"], /* CJK Ideograph */
+ ["\u4E31", "\u4E31"], /* CJK Ideograph */
+ ["\u4E32", "\u4E32"], /* CJK Ideograph */
+ ["\u4E33", "\u4E33"], /* CJK Ideograph */
+ ["\u4E34", "\u4E34"], /* CJK Ideograph */
+ ["\u4E35", "\u4E35"], /* CJK Ideograph */
+ ["\u4E36", "\u4E36"], /* CJK Ideograph */
+ ["\u4E37", "\u4E37"], /* CJK Ideograph */
+ ["\u4E38", "\u4E38"], /* CJK Ideograph */
+ ["\u4E39", "\u4E39"], /* CJK Ideograph */
+ ["\u4E3A", "\u4E3A"], /* CJK Ideograph */
+ ["\u4E3B", "\u4E3B"], /* CJK Ideograph */
+ ["\u4E3C", "\u4E3C"], /* CJK Ideograph */
+ ["\u4E3D", "\u4E3D"], /* CJK Ideograph */
+ ["\u4E3E", "\u4E3E"], /* CJK Ideograph */
+ ["\u4E3F", "\u4E3F"], /* CJK Ideograph */
+ ["\u4E40", "\u4E40"], /* CJK Ideograph */
+ ["\u4E41", "\u4E41"], /* CJK Ideograph */
+ ["\u4E42", "\u4E42"], /* CJK Ideograph */
+ ["\u4E43", "\u4E43"], /* CJK Ideograph */
+ ["\u4E44", "\u4E44"], /* CJK Ideograph */
+ ["\u4E45", "\u4E45"], /* CJK Ideograph */
+ ["\u4E46", "\u4E46"], /* CJK Ideograph */
+ ["\u4E47", "\u4E47"], /* CJK Ideograph */
+ ["\u4E48", "\u4E48"], /* CJK Ideograph */
+ ["\u4E49", "\u4E49"], /* CJK Ideograph */
+ ["\u4E4A", "\u4E4A"], /* CJK Ideograph */
+ ["\u4E4B", "\u4E4B"], /* CJK Ideograph */
+ ["\u4E4C", "\u4E4C"], /* CJK Ideograph */
+ ["\u4E4D", "\u4E4D"], /* CJK Ideograph */
+ ["\u4E4E", "\u4E4E"], /* CJK Ideograph */
+ ["\u4E4F", "\u4E4F"], /* CJK Ideograph */
+ ["\u4E50", "\u4E50"], /* CJK Ideograph */
+ ["\u4E51", "\u4E51"], /* CJK Ideograph */
+ ["\u4E52", "\u4E52"], /* CJK Ideograph */
+ ["\u4E53", "\u4E53"], /* CJK Ideograph */
+ ["\u4E54", "\u4E54"], /* CJK Ideograph */
+ ["\u4E55", "\u4E55"], /* CJK Ideograph */
+ ["\u4E56", "\u4E56"], /* CJK Ideograph */
+ ["\u4E57", "\u4E57"], /* CJK Ideograph */
+ ["\u4E58", "\u4E58"], /* CJK Ideograph */
+ ["\u4E59", "\u4E59"], /* CJK Ideograph */
+ ["\u4E5A", "\u4E5A"], /* CJK Ideograph */
+ ["\u4E5B", "\u4E5B"], /* CJK Ideograph */
+ ["\u4E5C", "\u4E5C"], /* CJK Ideograph */
+ ["\u4E5D", "\u4E5D"], /* CJK Ideograph */
+ ["\u4E5E", "\u4E5E"], /* CJK Ideograph */
+ ["\u4E5F", "\u4E5F"], /* CJK Ideograph */
+ ["\u4E60", "\u4E60"], /* CJK Ideograph */
+ ["\u4E61", "\u4E61"], /* CJK Ideograph */
+ ["\u4E62", "\u4E62"], /* CJK Ideograph */
+ ["\u4E63", "\u4E63"], /* CJK Ideograph */
+ ["\u4E64", "\u4E64"], /* CJK Ideograph */
+ ["\u4E65", "\u4E65"], /* CJK Ideograph */
+ ["\u4E66", "\u4E66"], /* CJK Ideograph */
+ ["\u4E67", "\u4E67"], /* CJK Ideograph */
+ ["\u4E68", "\u4E68"], /* CJK Ideograph */
+ ["\u4E69", "\u4E69"], /* CJK Ideograph */
+ ["\u4E6A", "\u4E6A"], /* CJK Ideograph */
+ ["\u4E6B", "\u4E6B"], /* CJK Ideograph */
+ ["\u4E6C", "\u4E6C"], /* CJK Ideograph */
+ ["\u4E6D", "\u4E6D"], /* CJK Ideograph */
+ ["\u4E6E", "\u4E6E"], /* CJK Ideograph */
+ ["\u4E6F", "\u4E6F"], /* CJK Ideograph */
+ ["\u4E70", "\u4E70"], /* CJK Ideograph */
+ ["\u4E71", "\u4E71"], /* CJK Ideograph */
+ ["\u4E72", "\u4E72"], /* CJK Ideograph */
+ ["\u4E73", "\u4E73"], /* CJK Ideograph */
+ ["\u4E74", "\u4E74"], /* CJK Ideograph */
+ ["\u4E75", "\u4E75"], /* CJK Ideograph */
+ ["\u4E76", "\u4E76"], /* CJK Ideograph */
+ ["\u4E77", "\u4E77"], /* CJK Ideograph */
+ ["\u4E78", "\u4E78"], /* CJK Ideograph */
+ ["\u4E79", "\u4E79"], /* CJK Ideograph */
+ ["\u4E7A", "\u4E7A"], /* CJK Ideograph */
+ ["\u4E7B", "\u4E7B"], /* CJK Ideograph */
+ ["\u4E7C", "\u4E7C"], /* CJK Ideograph */
+ ["\u4E7D", "\u4E7D"], /* CJK Ideograph */
+ ["\u4E7E", "\u4E7E"], /* CJK Ideograph */
+ ["\u4E7F", "\u4E7F"], /* CJK Ideograph */
+ ["\u4E80", "\u4E80"], /* CJK Ideograph */
+ ["\u4E81", "\u4E81"], /* CJK Ideograph */
+ ["\u4E82", "\u4E82"], /* CJK Ideograph */
+ ["\u4E83", "\u4E83"], /* CJK Ideograph */
+ ["\u4E84", "\u4E84"], /* CJK Ideograph */
+ ["\u4E85", "\u4E85"], /* CJK Ideograph */
+ ["\u4E86", "\u4E86"], /* CJK Ideograph */
+ ["\u4E87", "\u4E87"], /* CJK Ideograph */
+ ["\u4E88", "\u4E88"], /* CJK Ideograph */
+ ["\u4E89", "\u4E89"], /* CJK Ideograph */
+ ["\u4E8A", "\u4E8A"], /* CJK Ideograph */
+ ["\u4E8B", "\u4E8B"], /* CJK Ideograph */
+ ["\u4E8C", "\u4E8C"], /* CJK Ideograph */
+ ["\u4E8D", "\u4E8D"], /* CJK Ideograph */
+ ["\u4E8E", "\u4E8E"], /* CJK Ideograph */
+ ["\u4E8F", "\u4E8F"], /* CJK Ideograph */
+ ["\u4E90", "\u4E90"], /* CJK Ideograph */
+ ["\u4E91", "\u4E91"], /* CJK Ideograph */
+ ["\u4E92", "\u4E92"], /* CJK Ideograph */
+ ["\u4E93", "\u4E93"], /* CJK Ideograph */
+ ["\u4E94", "\u4E94"], /* CJK Ideograph */
+ ["\u4E95", "\u4E95"], /* CJK Ideograph */
+ ["\u4E96", "\u4E96"], /* CJK Ideograph */
+ ["\u4E97", "\u4E97"], /* CJK Ideograph */
+ ["\u4E98", "\u4E98"], /* CJK Ideograph */
+ ["\u4E99", "\u4E99"], /* CJK Ideograph */
+ ["\u4E9A", "\u4E9A"], /* CJK Ideograph */
+ ["\u4E9B", "\u4E9B"], /* CJK Ideograph */
+ ["\u4E9C", "\u4E9C"], /* CJK Ideograph */
+ ["\u4E9D", "\u4E9D"], /* CJK Ideograph */
+ ["\u4E9E", "\u4E9E"], /* CJK Ideograph */
+ ["\u4E9F", "\u4E9F"], /* CJK Ideograph */
+ ["\u4EA0", "\u4EA0"], /* CJK Ideograph */
+ ["\u4EA1", "\u4EA1"], /* CJK Ideograph */
+ ["\u4EA2", "\u4EA2"], /* CJK Ideograph */
+ ["\u4EA3", "\u4EA3"], /* CJK Ideograph */
+ ["\u4EA4", "\u4EA4"], /* CJK Ideograph */
+ ["\u4EA5", "\u4EA5"], /* CJK Ideograph */
+ ["\u4EA6", "\u4EA6"], /* CJK Ideograph */
+ ["\u4EA7", "\u4EA7"], /* CJK Ideograph */
+ ["\u4EA8", "\u4EA8"], /* CJK Ideograph */
+ ["\u4EA9", "\u4EA9"], /* CJK Ideograph */
+ ["\u4EAA", "\u4EAA"], /* CJK Ideograph */
+ ["\u4EAB", "\u4EAB"], /* CJK Ideograph */
+ ["\u4EAC", "\u4EAC"], /* CJK Ideograph */
+ ["\u4EAD", "\u4EAD"], /* CJK Ideograph */
+ ["\u4EAE", "\u4EAE"], /* CJK Ideograph */
+ ["\u4EAF", "\u4EAF"], /* CJK Ideograph */
+ ["\u4EB0", "\u4EB0"], /* CJK Ideograph */
+ ["\u4EB1", "\u4EB1"], /* CJK Ideograph */
+ ["\u4EB2", "\u4EB2"], /* CJK Ideograph */
+ ["\u4EB3", "\u4EB3"], /* CJK Ideograph */
+ ["\u4EB4", "\u4EB4"], /* CJK Ideograph */
+ ["\u4EB5", "\u4EB5"], /* CJK Ideograph */
+ ["\u4EB6", "\u4EB6"], /* CJK Ideograph */
+ ["\u4EB7", "\u4EB7"], /* CJK Ideograph */
+ ["\u4EB8", "\u4EB8"], /* CJK Ideograph */
+ ["\u4EB9", "\u4EB9"], /* CJK Ideograph */
+ ["\u4EBA", "\u4EBA"], /* CJK Ideograph */
+ ["\u4EBB", "\u4EBB"], /* CJK Ideograph */
+ ["\u4EBC", "\u4EBC"], /* CJK Ideograph */
+ ["\u4EBD", "\u4EBD"], /* CJK Ideograph */
+ ["\u4EBE", "\u4EBE"], /* CJK Ideograph */
+ ["\u4EBF", "\u4EBF"], /* CJK Ideograph */
+ ["\u4EC0", "\u4EC0"], /* CJK Ideograph */
+ ["\u4EC1", "\u4EC1"], /* CJK Ideograph */
+ ["\u4EC2", "\u4EC2"], /* CJK Ideograph */
+ ["\u4EC3", "\u4EC3"], /* CJK Ideograph */
+ ["\u4EC4", "\u4EC4"], /* CJK Ideograph */
+ ["\u4EC5", "\u4EC5"], /* CJK Ideograph */
+ ["\u4EC6", "\u4EC6"], /* CJK Ideograph */
+ ["\u4EC7", "\u4EC7"], /* CJK Ideograph */
+ ["\u4EC8", "\u4EC8"], /* CJK Ideograph */
+ ["\u4EC9", "\u4EC9"], /* CJK Ideograph */
+ ["\u4ECA", "\u4ECA"], /* CJK Ideograph */
+ ["\u4ECB", "\u4ECB"], /* CJK Ideograph */
+ ["\u4ECC", "\u4ECC"], /* CJK Ideograph */
+ ["\u4ECD", "\u4ECD"], /* CJK Ideograph */
+ ["\u4ECE", "\u4ECE"], /* CJK Ideograph */
+ ["\u4ECF", "\u4ECF"], /* CJK Ideograph */
+ ["\u4ED0", "\u4ED0"], /* CJK Ideograph */
+ ["\u4ED1", "\u4ED1"], /* CJK Ideograph */
+ ["\u4ED2", "\u4ED2"], /* CJK Ideograph */
+ ["\u4ED3", "\u4ED3"], /* CJK Ideograph */
+ ["\u4ED4", "\u4ED4"], /* CJK Ideograph */
+ ["\u4ED5", "\u4ED5"], /* CJK Ideograph */
+ ["\u4ED6", "\u4ED6"], /* CJK Ideograph */
+ ["\u4ED7", "\u4ED7"], /* CJK Ideograph */
+ ["\u4ED8", "\u4ED8"], /* CJK Ideograph */
+ ["\u4ED9", "\u4ED9"], /* CJK Ideograph */
+ ["\u4EDA", "\u4EDA"], /* CJK Ideograph */
+ ["\u4EDB", "\u4EDB"], /* CJK Ideograph */
+ ["\u4EDC", "\u4EDC"], /* CJK Ideograph */
+ ["\u4EDD", "\u4EDD"], /* CJK Ideograph */
+ ["\u4EDE", "\u4EDE"], /* CJK Ideograph */
+ ["\u4EDF", "\u4EDF"], /* CJK Ideograph */
+ ["\u4EE0", "\u4EE0"], /* CJK Ideograph */
+ ["\u4EE1", "\u4EE1"], /* CJK Ideograph */
+ ["\u4EE2", "\u4EE2"], /* CJK Ideograph */
+ ["\u4EE3", "\u4EE3"], /* CJK Ideograph */
+ ["\u4EE4", "\u4EE4"], /* CJK Ideograph */
+ ["\u4EE5", "\u4EE5"], /* CJK Ideograph */
+ ["\u4EE6", "\u4EE6"], /* CJK Ideograph */
+ ["\u4EE7", "\u4EE7"], /* CJK Ideograph */
+ ["\u4EE8", "\u4EE8"], /* CJK Ideograph */
+ ["\u4EE9", "\u4EE9"], /* CJK Ideograph */
+ ["\u4EEA", "\u4EEA"], /* CJK Ideograph */
+ ["\u4EEB", "\u4EEB"], /* CJK Ideograph */
+ ["\u4EEC", "\u4EEC"], /* CJK Ideograph */
+ ["\u4EED", "\u4EED"], /* CJK Ideograph */
+ ["\u4EEE", "\u4EEE"], /* CJK Ideograph */
+ ["\u4EEF", "\u4EEF"], /* CJK Ideograph */
+ ["\u4EF0", "\u4EF0"], /* CJK Ideograph */
+ ["\u4EF1", "\u4EF1"], /* CJK Ideograph */
+ ["\u4EF2", "\u4EF2"], /* CJK Ideograph */
+ ["\u4EF3", "\u4EF3"], /* CJK Ideograph */
+ ["\u4EF4", "\u4EF4"], /* CJK Ideograph */
+ ["\u4EF5", "\u4EF5"], /* CJK Ideograph */
+ ["\u4EF6", "\u4EF6"], /* CJK Ideograph */
+ ["\u4EF7", "\u4EF7"], /* CJK Ideograph */
+ ["\u4EF8", "\u4EF8"], /* CJK Ideograph */
+ ["\u4EF9", "\u4EF9"], /* CJK Ideograph */
+ ["\u4EFA", "\u4EFA"], /* CJK Ideograph */
+ ["\u4EFB", "\u4EFB"], /* CJK Ideograph */
+ ["\u4EFC", "\u4EFC"], /* CJK Ideograph */
+ ["\u4EFD", "\u4EFD"], /* CJK Ideograph */
+ ["\u4EFE", "\u4EFE"], /* CJK Ideograph */
+ ["\u4EFF", "\u4EFF"], /* CJK Ideograph */
+ ["\u4F00", "\u4F00"], /* CJK Ideograph */
+ ["\u4F01", "\u4F01"], /* CJK Ideograph */
+ ["\u4F02", "\u4F02"], /* CJK Ideograph */
+ ["\u4F03", "\u4F03"], /* CJK Ideograph */
+ ["\u4F04", "\u4F04"], /* CJK Ideograph */
+ ["\u4F05", "\u4F05"], /* CJK Ideograph */
+ ["\u4F06", "\u4F06"], /* CJK Ideograph */
+ ["\u4F07", "\u4F07"], /* CJK Ideograph */
+ ["\u4F08", "\u4F08"], /* CJK Ideograph */
+ ["\u4F09", "\u4F09"], /* CJK Ideograph */
+ ["\u4F0A", "\u4F0A"], /* CJK Ideograph */
+ ["\u4F0B", "\u4F0B"], /* CJK Ideograph */
+ ["\u4F0C", "\u4F0C"], /* CJK Ideograph */
+ ["\u4F0D", "\u4F0D"], /* CJK Ideograph */
+ ["\u4F0E", "\u4F0E"], /* CJK Ideograph */
+ ["\u4F0F", "\u4F0F"], /* CJK Ideograph */
+ ["\u4F10", "\u4F10"], /* CJK Ideograph */
+ ["\u4F11", "\u4F11"], /* CJK Ideograph */
+ ["\u4F12", "\u4F12"], /* CJK Ideograph */
+ ["\u4F13", "\u4F13"], /* CJK Ideograph */
+ ["\u4F14", "\u4F14"], /* CJK Ideograph */
+ ["\u4F15", "\u4F15"], /* CJK Ideograph */
+ ["\u4F16", "\u4F16"], /* CJK Ideograph */
+ ["\u4F17", "\u4F17"], /* CJK Ideograph */
+ ["\u4F18", "\u4F18"], /* CJK Ideograph */
+ ["\u4F19", "\u4F19"], /* CJK Ideograph */
+ ["\u4F1A", "\u4F1A"], /* CJK Ideograph */
+ ["\u4F1B", "\u4F1B"], /* CJK Ideograph */
+ ["\u4F1C", "\u4F1C"], /* CJK Ideograph */
+ ["\u4F1D", "\u4F1D"], /* CJK Ideograph */
+ ["\u4F1E", "\u4F1E"], /* CJK Ideograph */
+ ["\u4F1F", "\u4F1F"], /* CJK Ideograph */
+ ["\u4F20", "\u4F20"], /* CJK Ideograph */
+ ["\u4F21", "\u4F21"], /* CJK Ideograph */
+ ["\u4F22", "\u4F22"], /* CJK Ideograph */
+ ["\u4F23", "\u4F23"], /* CJK Ideograph */
+ ["\u4F24", "\u4F24"], /* CJK Ideograph */
+ ["\u4F25", "\u4F25"], /* CJK Ideograph */
+ ["\u4F26", "\u4F26"], /* CJK Ideograph */
+ ["\u4F27", "\u4F27"], /* CJK Ideograph */
+ ["\u4F28", "\u4F28"], /* CJK Ideograph */
+ ["\u4F29", "\u4F29"], /* CJK Ideograph */
+ ["\u4F2A", "\u4F2A"], /* CJK Ideograph */
+ ["\u4F2B", "\u4F2B"], /* CJK Ideograph */
+ ["\u4F2C", "\u4F2C"], /* CJK Ideograph */
+ ["\u4F2D", "\u4F2D"], /* CJK Ideograph */
+ ["\u4F2E", "\u4F2E"], /* CJK Ideograph */
+ ["\u4F2F", "\u4F2F"], /* CJK Ideograph */
+ ["\u4F30", "\u4F30"], /* CJK Ideograph */
+ ["\u4F31", "\u4F31"], /* CJK Ideograph */
+ ["\u4F32", "\u4F32"], /* CJK Ideograph */
+ ["\u4F33", "\u4F33"], /* CJK Ideograph */
+ ["\u4F34", "\u4F34"], /* CJK Ideograph */
+ ["\u4F35", "\u4F35"], /* CJK Ideograph */
+ ["\u4F36", "\u4F36"], /* CJK Ideograph */
+ ["\u4F37", "\u4F37"], /* CJK Ideograph */
+ ["\u4F38", "\u4F38"], /* CJK Ideograph */
+ ["\u4F39", "\u4F39"], /* CJK Ideograph */
+ ["\u4F3A", "\u4F3A"], /* CJK Ideograph */
+ ["\u4F3B", "\u4F3B"], /* CJK Ideograph */
+ ["\u4F3C", "\u4F3C"], /* CJK Ideograph */
+ ["\u4F3D", "\u4F3D"], /* CJK Ideograph */
+ ["\u4F3E", "\u4F3E"], /* CJK Ideograph */
+ ["\u4F3F", "\u4F3F"], /* CJK Ideograph */
+ ["\u4F40", "\u4F40"], /* CJK Ideograph */
+ ["\u4F41", "\u4F41"], /* CJK Ideograph */
+ ["\u4F42", "\u4F42"], /* CJK Ideograph */
+ ["\u4F43", "\u4F43"], /* CJK Ideograph */
+ ["\u4F44", "\u4F44"], /* CJK Ideograph */
+ ["\u4F45", "\u4F45"], /* CJK Ideograph */
+ ["\u4F46", "\u4F46"], /* CJK Ideograph */
+ ["\u4F47", "\u4F47"], /* CJK Ideograph */
+ ["\u4F48", "\u4F48"], /* CJK Ideograph */
+ ["\u4F49", "\u4F49"], /* CJK Ideograph */
+ ["\u4F4A", "\u4F4A"], /* CJK Ideograph */
+ ["\u4F4B", "\u4F4B"], /* CJK Ideograph */
+ ["\u4F4C", "\u4F4C"], /* CJK Ideograph */
+ ["\u4F4D", "\u4F4D"], /* CJK Ideograph */
+ ["\u4F4E", "\u4F4E"], /* CJK Ideograph */
+ ["\u4F4F", "\u4F4F"], /* CJK Ideograph */
+ ["\u4F50", "\u4F50"], /* CJK Ideograph */
+ ["\u4F51", "\u4F51"], /* CJK Ideograph */
+ ["\u4F52", "\u4F52"], /* CJK Ideograph */
+ ["\u4F53", "\u4F53"], /* CJK Ideograph */
+ ["\u4F54", "\u4F54"], /* CJK Ideograph */
+ ["\u4F55", "\u4F55"], /* CJK Ideograph */
+ ["\u4F56", "\u4F56"], /* CJK Ideograph */
+ ["\u4F57", "\u4F57"], /* CJK Ideograph */
+ ["\u4F58", "\u4F58"], /* CJK Ideograph */
+ ["\u4F59", "\u4F59"], /* CJK Ideograph */
+ ["\u4F5A", "\u4F5A"], /* CJK Ideograph */
+ ["\u4F5B", "\u4F5B"], /* CJK Ideograph */
+ ["\u4F5C", "\u4F5C"], /* CJK Ideograph */
+ ["\u4F5D", "\u4F5D"], /* CJK Ideograph */
+ ["\u4F5E", "\u4F5E"], /* CJK Ideograph */
+ ["\u4F5F", "\u4F5F"], /* CJK Ideograph */
+ ["\u4F60", "\u4F60"], /* CJK Ideograph */
+ ["\u4F61", "\u4F61"], /* CJK Ideograph */
+ ["\u4F62", "\u4F62"], /* CJK Ideograph */
+ ["\u4F63", "\u4F63"], /* CJK Ideograph */
+ ["\u4F64", "\u4F64"], /* CJK Ideograph */
+ ["\u4F65", "\u4F65"], /* CJK Ideograph */
+ ["\u4F66", "\u4F66"], /* CJK Ideograph */
+ ["\u4F67", "\u4F67"], /* CJK Ideograph */
+ ["\u4F68", "\u4F68"], /* CJK Ideograph */
+ ["\u4F69", "\u4F69"], /* CJK Ideograph */
+ ["\u4F6A", "\u4F6A"], /* CJK Ideograph */
+ ["\u4F6B", "\u4F6B"], /* CJK Ideograph */
+ ["\u4F6C", "\u4F6C"], /* CJK Ideograph */
+ ["\u4F6D", "\u4F6D"], /* CJK Ideograph */
+ ["\u4F6E", "\u4F6E"], /* CJK Ideograph */
+ ["\u4F6F", "\u4F6F"], /* CJK Ideograph */
+ ["\u4F70", "\u4F70"], /* CJK Ideograph */
+ ["\u4F71", "\u4F71"], /* CJK Ideograph */
+ ["\u4F72", "\u4F72"], /* CJK Ideograph */
+ ["\u4F73", "\u4F73"], /* CJK Ideograph */
+ ["\u4F74", "\u4F74"], /* CJK Ideograph */
+ ["\u4F75", "\u4F75"], /* CJK Ideograph */
+ ["\u4F76", "\u4F76"], /* CJK Ideograph */
+ ["\u4F77", "\u4F77"], /* CJK Ideograph */
+ ["\u4F78", "\u4F78"], /* CJK Ideograph */
+ ["\u4F79", "\u4F79"], /* CJK Ideograph */
+ ["\u4F7A", "\u4F7A"], /* CJK Ideograph */
+ ["\u4F7B", "\u4F7B"], /* CJK Ideograph */
+ ["\u4F7C", "\u4F7C"], /* CJK Ideograph */
+ ["\u4F7D", "\u4F7D"], /* CJK Ideograph */
+ ["\u4F7E", "\u4F7E"], /* CJK Ideograph */
+ ["\u4F7F", "\u4F7F"], /* CJK Ideograph */
+ ["\u4F80", "\u4F80"], /* CJK Ideograph */
+ ["\u4F81", "\u4F81"], /* CJK Ideograph */
+ ["\u4F82", "\u4F82"], /* CJK Ideograph */
+ ["\u4F83", "\u4F83"], /* CJK Ideograph */
+ ["\u4F84", "\u4F84"], /* CJK Ideograph */
+ ["\u4F85", "\u4F85"], /* CJK Ideograph */
+ ["\u4F86", "\u4F86"], /* CJK Ideograph */
+ ["\u4F87", "\u4F87"], /* CJK Ideograph */
+ ["\u4F88", "\u4F88"], /* CJK Ideograph */
+ ["\u4F89", "\u4F89"], /* CJK Ideograph */
+ ["\u4F8A", "\u4F8A"], /* CJK Ideograph */
+ ["\u4F8B", "\u4F8B"], /* CJK Ideograph */
+ ["\u4F8C", "\u4F8C"], /* CJK Ideograph */
+ ["\u4F8D", "\u4F8D"], /* CJK Ideograph */
+ ["\u4F8E", "\u4F8E"], /* CJK Ideograph */
+ ["\u4F8F", "\u4F8F"], /* CJK Ideograph */
+ ["\u4F90", "\u4F90"], /* CJK Ideograph */
+ ["\u4F91", "\u4F91"], /* CJK Ideograph */
+ ["\u4F92", "\u4F92"], /* CJK Ideograph */
+ ["\u4F93", "\u4F93"], /* CJK Ideograph */
+ ["\u4F94", "\u4F94"], /* CJK Ideograph */
+ ["\u4F95", "\u4F95"], /* CJK Ideograph */
+ ["\u4F96", "\u4F96"], /* CJK Ideograph */
+ ["\u4F97", "\u4F97"], /* CJK Ideograph */
+ ["\u4F98", "\u4F98"], /* CJK Ideograph */
+ ["\u4F99", "\u4F99"], /* CJK Ideograph */
+ ["\u4F9A", "\u4F9A"], /* CJK Ideograph */
+ ["\u4F9B", "\u4F9B"], /* CJK Ideograph */
+ ["\u4F9C", "\u4F9C"], /* CJK Ideograph */
+ ["\u4F9D", "\u4F9D"], /* CJK Ideograph */
+ ["\u4F9E", "\u4F9E"], /* CJK Ideograph */
+ ["\u4F9F", "\u4F9F"], /* CJK Ideograph */
+ ["\u4FA0", "\u4FA0"], /* CJK Ideograph */
+ ["\u4FA1", "\u4FA1"], /* CJK Ideograph */
+ ["\u4FA2", "\u4FA2"], /* CJK Ideograph */
+ ["\u4FA3", "\u4FA3"], /* CJK Ideograph */
+ ["\u4FA4", "\u4FA4"], /* CJK Ideograph */
+ ["\u4FA5", "\u4FA5"], /* CJK Ideograph */
+ ["\u4FA6", "\u4FA6"], /* CJK Ideograph */
+ ["\u4FA7", "\u4FA7"], /* CJK Ideograph */
+ ["\u4FA8", "\u4FA8"], /* CJK Ideograph */
+ ["\u4FA9", "\u4FA9"], /* CJK Ideograph */
+ ["\u4FAA", "\u4FAA"], /* CJK Ideograph */
+ ["\u4FAB", "\u4FAB"], /* CJK Ideograph */
+ ["\u4FAC", "\u4FAC"], /* CJK Ideograph */
+ ["\u4FAD", "\u4FAD"], /* CJK Ideograph */
+ ["\u4FAE", "\u4FAE"], /* CJK Ideograph */
+ ["\u4FAF", "\u4FAF"], /* CJK Ideograph */
+ ["\u4FB0", "\u4FB0"], /* CJK Ideograph */
+ ["\u4FB1", "\u4FB1"], /* CJK Ideograph */
+ ["\u4FB2", "\u4FB2"], /* CJK Ideograph */
+ ["\u4FB3", "\u4FB3"], /* CJK Ideograph */
+ ["\u4FB4", "\u4FB4"], /* CJK Ideograph */
+ ["\u4FB5", "\u4FB5"], /* CJK Ideograph */
+ ["\u4FB6", "\u4FB6"], /* CJK Ideograph */
+ ["\u4FB7", "\u4FB7"], /* CJK Ideograph */
+ ["\u4FB8", "\u4FB8"], /* CJK Ideograph */
+ ["\u4FB9", "\u4FB9"], /* CJK Ideograph */
+ ["\u4FBA", "\u4FBA"], /* CJK Ideograph */
+ ["\u4FBB", "\u4FBB"], /* CJK Ideograph */
+ ["\u4FBC", "\u4FBC"], /* CJK Ideograph */
+ ["\u4FBD", "\u4FBD"], /* CJK Ideograph */
+ ["\u4FBE", "\u4FBE"], /* CJK Ideograph */
+ ["\u4FBF", "\u4FBF"], /* CJK Ideograph */
+ ["\u4FC0", "\u4FC0"], /* CJK Ideograph */
+ ["\u4FC1", "\u4FC1"], /* CJK Ideograph */
+ ["\u4FC2", "\u4FC2"], /* CJK Ideograph */
+ ["\u4FC3", "\u4FC3"], /* CJK Ideograph */
+ ["\u4FC4", "\u4FC4"], /* CJK Ideograph */
+ ["\u4FC5", "\u4FC5"], /* CJK Ideograph */
+ ["\u4FC6", "\u4FC6"], /* CJK Ideograph */
+ ["\u4FC7", "\u4FC7"], /* CJK Ideograph */
+ ["\u4FC8", "\u4FC8"], /* CJK Ideograph */
+ ["\u4FC9", "\u4FC9"], /* CJK Ideograph */
+ ["\u4FCA", "\u4FCA"], /* CJK Ideograph */
+ ["\u4FCB", "\u4FCB"], /* CJK Ideograph */
+ ["\u4FCC", "\u4FCC"], /* CJK Ideograph */
+ ["\u4FCD", "\u4FCD"], /* CJK Ideograph */
+ ["\u4FCE", "\u4FCE"], /* CJK Ideograph */
+ ["\u4FCF", "\u4FCF"], /* CJK Ideograph */
+ ["\u4FD0", "\u4FD0"], /* CJK Ideograph */
+ ["\u4FD1", "\u4FD1"], /* CJK Ideograph */
+ ["\u4FD2", "\u4FD2"], /* CJK Ideograph */
+ ["\u4FD3", "\u4FD3"], /* CJK Ideograph */
+ ["\u4FD4", "\u4FD4"], /* CJK Ideograph */
+ ["\u4FD5", "\u4FD5"], /* CJK Ideograph */
+ ["\u4FD6", "\u4FD6"], /* CJK Ideograph */
+ ["\u4FD7", "\u4FD7"], /* CJK Ideograph */
+ ["\u4FD8", "\u4FD8"], /* CJK Ideograph */
+ ["\u4FD9", "\u4FD9"], /* CJK Ideograph */
+ ["\u4FDA", "\u4FDA"], /* CJK Ideograph */
+ ["\u4FDB", "\u4FDB"], /* CJK Ideograph */
+ ["\u4FDC", "\u4FDC"], /* CJK Ideograph */
+ ["\u4FDD", "\u4FDD"], /* CJK Ideograph */
+ ["\u4FDE", "\u4FDE"], /* CJK Ideograph */
+ ["\u4FDF", "\u4FDF"], /* CJK Ideograph */
+ ["\u4FE0", "\u4FE0"], /* CJK Ideograph */
+ ["\u4FE1", "\u4FE1"], /* CJK Ideograph */
+ ["\u4FE2", "\u4FE2"], /* CJK Ideograph */
+ ["\u4FE3", "\u4FE3"], /* CJK Ideograph */
+ ["\u4FE4", "\u4FE4"], /* CJK Ideograph */
+ ["\u4FE5", "\u4FE5"], /* CJK Ideograph */
+ ["\u4FE6", "\u4FE6"], /* CJK Ideograph */
+ ["\u4FE7", "\u4FE7"], /* CJK Ideograph */
+ ["\u4FE8", "\u4FE8"], /* CJK Ideograph */
+ ["\u4FE9", "\u4FE9"], /* CJK Ideograph */
+ ["\u4FEA", "\u4FEA"], /* CJK Ideograph */
+ ["\u4FEB", "\u4FEB"], /* CJK Ideograph */
+ ["\u4FEC", "\u4FEC"], /* CJK Ideograph */
+ ["\u4FED", "\u4FED"], /* CJK Ideograph */
+ ["\u4FEE", "\u4FEE"], /* CJK Ideograph */
+ ["\u4FEF", "\u4FEF"], /* CJK Ideograph */
+ ["\u4FF0", "\u4FF0"], /* CJK Ideograph */
+ ["\u4FF1", "\u4FF1"], /* CJK Ideograph */
+ ["\u4FF2", "\u4FF2"], /* CJK Ideograph */
+ ["\u4FF3", "\u4FF3"], /* CJK Ideograph */
+ ["\u4FF4", "\u4FF4"], /* CJK Ideograph */
+ ["\u4FF5", "\u4FF5"], /* CJK Ideograph */
+ ["\u4FF6", "\u4FF6"], /* CJK Ideograph */
+ ["\u4FF7", "\u4FF7"], /* CJK Ideograph */
+ ["\u4FF8", "\u4FF8"], /* CJK Ideograph */
+ ["\u4FF9", "\u4FF9"], /* CJK Ideograph */
+ ["\u4FFA", "\u4FFA"], /* CJK Ideograph */
+ ["\u4FFB", "\u4FFB"], /* CJK Ideograph */
+ ["\u4FFC", "\u4FFC"], /* CJK Ideograph */
+ ["\u4FFD", "\u4FFD"], /* CJK Ideograph */
+ ["\u4FFE", "\u4FFE"], /* CJK Ideograph */
+ ["\u4FFF", "\u4FFF"], /* CJK Ideograph */
+ ["\u5000", "\u5000"], /* CJK Ideograph */
+ ["\u5001", "\u5001"], /* CJK Ideograph */
+ ["\u5002", "\u5002"], /* CJK Ideograph */
+ ["\u5003", "\u5003"], /* CJK Ideograph */
+ ["\u5004", "\u5004"], /* CJK Ideograph */
+ ["\u5005", "\u5005"], /* CJK Ideograph */
+ ["\u5006", "\u5006"], /* CJK Ideograph */
+ ["\u5007", "\u5007"], /* CJK Ideograph */
+ ["\u5008", "\u5008"], /* CJK Ideograph */
+ ["\u5009", "\u5009"], /* CJK Ideograph */
+ ["\u500A", "\u500A"], /* CJK Ideograph */
+ ["\u500B", "\u500B"], /* CJK Ideograph */
+ ["\u500C", "\u500C"], /* CJK Ideograph */
+ ["\u500D", "\u500D"], /* CJK Ideograph */
+ ["\u500E", "\u500E"], /* CJK Ideograph */
+ ["\u500F", "\u500F"], /* CJK Ideograph */
+ ["\u5010", "\u5010"], /* CJK Ideograph */
+ ["\u5011", "\u5011"], /* CJK Ideograph */
+ ["\u5012", "\u5012"], /* CJK Ideograph */
+ ["\u5013", "\u5013"], /* CJK Ideograph */
+ ["\u5014", "\u5014"], /* CJK Ideograph */
+ ["\u5015", "\u5015"], /* CJK Ideograph */
+ ["\u5016", "\u5016"], /* CJK Ideograph */
+ ["\u5017", "\u5017"], /* CJK Ideograph */
+ ["\u5018", "\u5018"], /* CJK Ideograph */
+ ["\u5019", "\u5019"], /* CJK Ideograph */
+ ["\u501A", "\u501A"], /* CJK Ideograph */
+ ["\u501B", "\u501B"], /* CJK Ideograph */
+ ["\u501C", "\u501C"], /* CJK Ideograph */
+ ["\u501D", "\u501D"], /* CJK Ideograph */
+ ["\u501E", "\u501E"], /* CJK Ideograph */
+ ["\u501F", "\u501F"], /* CJK Ideograph */
+ ["\u5020", "\u5020"], /* CJK Ideograph */
+ ["\u5021", "\u5021"], /* CJK Ideograph */
+ ["\u5022", "\u5022"], /* CJK Ideograph */
+ ["\u5023", "\u5023"], /* CJK Ideograph */
+ ["\u5024", "\u5024"], /* CJK Ideograph */
+ ["\u5025", "\u5025"], /* CJK Ideograph */
+ ["\u5026", "\u5026"], /* CJK Ideograph */
+ ["\u5027", "\u5027"], /* CJK Ideograph */
+ ["\u5028", "\u5028"], /* CJK Ideograph */
+ ["\u5029", "\u5029"], /* CJK Ideograph */
+ ["\u502A", "\u502A"], /* CJK Ideograph */
+ ["\u502B", "\u502B"], /* CJK Ideograph */
+ ["\u502C", "\u502C"], /* CJK Ideograph */
+ ["\u502D", "\u502D"], /* CJK Ideograph */
+ ["\u502E", "\u502E"], /* CJK Ideograph */
+ ["\u502F", "\u502F"], /* CJK Ideograph */
+ ["\u5030", "\u5030"], /* CJK Ideograph */
+ ["\u5031", "\u5031"], /* CJK Ideograph */
+ ["\u5032", "\u5032"], /* CJK Ideograph */
+ ["\u5033", "\u5033"], /* CJK Ideograph */
+ ["\u5034", "\u5034"], /* CJK Ideograph */
+ ["\u5035", "\u5035"], /* CJK Ideograph */
+ ["\u5036", "\u5036"], /* CJK Ideograph */
+ ["\u5037", "\u5037"], /* CJK Ideograph */
+ ["\u5038", "\u5038"], /* CJK Ideograph */
+ ["\u5039", "\u5039"], /* CJK Ideograph */
+ ["\u503A", "\u503A"], /* CJK Ideograph */
+ ["\u503B", "\u503B"], /* CJK Ideograph */
+ ["\u503C", "\u503C"], /* CJK Ideograph */
+ ["\u503D", "\u503D"], /* CJK Ideograph */
+ ["\u503E", "\u503E"], /* CJK Ideograph */
+ ["\u503F", "\u503F"], /* CJK Ideograph */
+ ["\u5040", "\u5040"], /* CJK Ideograph */
+ ["\u5041", "\u5041"], /* CJK Ideograph */
+ ["\u5042", "\u5042"], /* CJK Ideograph */
+ ["\u5043", "\u5043"], /* CJK Ideograph */
+ ["\u5044", "\u5044"], /* CJK Ideograph */
+ ["\u5045", "\u5045"], /* CJK Ideograph */
+ ["\u5046", "\u5046"], /* CJK Ideograph */
+ ["\u5047", "\u5047"], /* CJK Ideograph */
+ ["\u5048", "\u5048"], /* CJK Ideograph */
+ ["\u5049", "\u5049"], /* CJK Ideograph */
+ ["\u504A", "\u504A"], /* CJK Ideograph */
+ ["\u504B", "\u504B"], /* CJK Ideograph */
+ ["\u504C", "\u504C"], /* CJK Ideograph */
+ ["\u504D", "\u504D"], /* CJK Ideograph */
+ ["\u504E", "\u504E"], /* CJK Ideograph */
+ ["\u504F", "\u504F"], /* CJK Ideograph */
+ ["\u5050", "\u5050"], /* CJK Ideograph */
+ ["\u5051", "\u5051"], /* CJK Ideograph */
+ ["\u5052", "\u5052"], /* CJK Ideograph */
+ ["\u5053", "\u5053"], /* CJK Ideograph */
+ ["\u5054", "\u5054"], /* CJK Ideograph */
+ ["\u5055", "\u5055"], /* CJK Ideograph */
+ ["\u5056", "\u5056"], /* CJK Ideograph */
+ ["\u5057", "\u5057"], /* CJK Ideograph */
+ ["\u5058", "\u5058"], /* CJK Ideograph */
+ ["\u5059", "\u5059"], /* CJK Ideograph */
+ ["\u505A", "\u505A"], /* CJK Ideograph */
+ ["\u505B", "\u505B"], /* CJK Ideograph */
+ ["\u505C", "\u505C"], /* CJK Ideograph */
+ ["\u505D", "\u505D"], /* CJK Ideograph */
+ ["\u505E", "\u505E"], /* CJK Ideograph */
+ ["\u505F", "\u505F"], /* CJK Ideograph */
+ ["\u5060", "\u5060"], /* CJK Ideograph */
+ ["\u5061", "\u5061"], /* CJK Ideograph */
+ ["\u5062", "\u5062"], /* CJK Ideograph */
+ ["\u5063", "\u5063"], /* CJK Ideograph */
+ ["\u5064", "\u5064"], /* CJK Ideograph */
+ ["\u5065", "\u5065"], /* CJK Ideograph */
+ ["\u5066", "\u5066"], /* CJK Ideograph */
+ ["\u5067", "\u5067"], /* CJK Ideograph */
+ ["\u5068", "\u5068"], /* CJK Ideograph */
+ ["\u5069", "\u5069"], /* CJK Ideograph */
+ ["\u506A", "\u506A"], /* CJK Ideograph */
+ ["\u506B", "\u506B"], /* CJK Ideograph */
+ ["\u506C", "\u506C"], /* CJK Ideograph */
+ ["\u506D", "\u506D"], /* CJK Ideograph */
+ ["\u506E", "\u506E"], /* CJK Ideograph */
+ ["\u506F", "\u506F"], /* CJK Ideograph */
+ ["\u5070", "\u5070"], /* CJK Ideograph */
+ ["\u5071", "\u5071"], /* CJK Ideograph */
+ ["\u5072", "\u5072"], /* CJK Ideograph */
+ ["\u5073", "\u5073"], /* CJK Ideograph */
+ ["\u5074", "\u5074"], /* CJK Ideograph */
+ ["\u5075", "\u5075"], /* CJK Ideograph */
+ ["\u5076", "\u5076"], /* CJK Ideograph */
+ ["\u5077", "\u5077"], /* CJK Ideograph */
+ ["\u5078", "\u5078"], /* CJK Ideograph */
+ ["\u5079", "\u5079"], /* CJK Ideograph */
+ ["\u507A", "\u507A"], /* CJK Ideograph */
+ ["\u507B", "\u507B"], /* CJK Ideograph */
+ ["\u507C", "\u507C"], /* CJK Ideograph */
+ ["\u507D", "\u507D"], /* CJK Ideograph */
+ ["\u507E", "\u507E"], /* CJK Ideograph */
+ ["\u507F", "\u507F"], /* CJK Ideograph */
+ ["\u5080", "\u5080"], /* CJK Ideograph */
+ ["\u5081", "\u5081"], /* CJK Ideograph */
+ ["\u5082", "\u5082"], /* CJK Ideograph */
+ ["\u5083", "\u5083"], /* CJK Ideograph */
+ ["\u5084", "\u5084"], /* CJK Ideograph */
+ ["\u5085", "\u5085"], /* CJK Ideograph */
+ ["\u5086", "\u5086"], /* CJK Ideograph */
+ ["\u5087", "\u5087"], /* CJK Ideograph */
+ ["\u5088", "\u5088"], /* CJK Ideograph */
+ ["\u5089", "\u5089"], /* CJK Ideograph */
+ ["\u508A", "\u508A"], /* CJK Ideograph */
+ ["\u508B", "\u508B"], /* CJK Ideograph */
+ ["\u508C", "\u508C"], /* CJK Ideograph */
+ ["\u508D", "\u508D"], /* CJK Ideograph */
+ ["\u508E", "\u508E"], /* CJK Ideograph */
+ ["\u508F", "\u508F"], /* CJK Ideograph */
+ ["\u5090", "\u5090"], /* CJK Ideograph */
+ ["\u5091", "\u5091"], /* CJK Ideograph */
+ ["\u5092", "\u5092"], /* CJK Ideograph */
+ ["\u5093", "\u5093"], /* CJK Ideograph */
+ ["\u5094", "\u5094"], /* CJK Ideograph */
+ ["\u5095", "\u5095"], /* CJK Ideograph */
+ ["\u5096", "\u5096"], /* CJK Ideograph */
+ ["\u5097", "\u5097"], /* CJK Ideograph */
+ ["\u5098", "\u5098"], /* CJK Ideograph */
+ ["\u5099", "\u5099"], /* CJK Ideograph */
+ ["\u509A", "\u509A"], /* CJK Ideograph */
+ ["\u509B", "\u509B"], /* CJK Ideograph */
+ ["\u509C", "\u509C"], /* CJK Ideograph */
+ ["\u509D", "\u509D"], /* CJK Ideograph */
+ ["\u509E", "\u509E"], /* CJK Ideograph */
+ ["\u509F", "\u509F"], /* CJK Ideograph */
+ ["\u50A0", "\u50A0"], /* CJK Ideograph */
+ ["\u50A1", "\u50A1"], /* CJK Ideograph */
+ ["\u50A2", "\u50A2"], /* CJK Ideograph */
+ ["\u50A3", "\u50A3"], /* CJK Ideograph */
+ ["\u50A4", "\u50A4"], /* CJK Ideograph */
+ ["\u50A5", "\u50A5"], /* CJK Ideograph */
+ ["\u50A6", "\u50A6"], /* CJK Ideograph */
+ ["\u50A7", "\u50A7"], /* CJK Ideograph */
+ ["\u50A8", "\u50A8"], /* CJK Ideograph */
+ ["\u50A9", "\u50A9"], /* CJK Ideograph */
+ ["\u50AA", "\u50AA"], /* CJK Ideograph */
+ ["\u50AB", "\u50AB"], /* CJK Ideograph */
+ ["\u50AC", "\u50AC"], /* CJK Ideograph */
+ ["\u50AD", "\u50AD"], /* CJK Ideograph */
+ ["\u50AE", "\u50AE"], /* CJK Ideograph */
+ ["\u50AF", "\u50AF"], /* CJK Ideograph */
+ ["\u50B0", "\u50B0"], /* CJK Ideograph */
+ ["\u50B1", "\u50B1"], /* CJK Ideograph */
+ ["\u50B2", "\u50B2"], /* CJK Ideograph */
+ ["\u50B3", "\u50B3"], /* CJK Ideograph */
+ ["\u50B4", "\u50B4"], /* CJK Ideograph */
+ ["\u50B5", "\u50B5"], /* CJK Ideograph */
+ ["\u50B6", "\u50B6"], /* CJK Ideograph */
+ ["\u50B7", "\u50B7"], /* CJK Ideograph */
+ ["\u50B8", "\u50B8"], /* CJK Ideograph */
+ ["\u50B9", "\u50B9"], /* CJK Ideograph */
+ ["\u50BA", "\u50BA"], /* CJK Ideograph */
+ ["\u50BB", "\u50BB"], /* CJK Ideograph */
+ ["\u50BC", "\u50BC"], /* CJK Ideograph */
+ ["\u50BD", "\u50BD"], /* CJK Ideograph */
+ ["\u50BE", "\u50BE"], /* CJK Ideograph */
+ ["\u50BF", "\u50BF"], /* CJK Ideograph */
+ ["\u50C0", "\u50C0"], /* CJK Ideograph */
+ ["\u50C1", "\u50C1"], /* CJK Ideograph */
+ ["\u50C2", "\u50C2"], /* CJK Ideograph */
+ ["\u50C3", "\u50C3"], /* CJK Ideograph */
+ ["\u50C4", "\u50C4"], /* CJK Ideograph */
+ ["\u50C5", "\u50C5"], /* CJK Ideograph */
+ ["\u50C6", "\u50C6"], /* CJK Ideograph */
+ ["\u50C7", "\u50C7"], /* CJK Ideograph */
+ ["\u50C8", "\u50C8"], /* CJK Ideograph */
+ ["\u50C9", "\u50C9"], /* CJK Ideograph */
+ ["\u50CA", "\u50CA"], /* CJK Ideograph */
+ ["\u50CB", "\u50CB"], /* CJK Ideograph */
+ ["\u50CC", "\u50CC"], /* CJK Ideograph */
+ ["\u50CD", "\u50CD"], /* CJK Ideograph */
+ ["\u50CE", "\u50CE"], /* CJK Ideograph */
+ ["\u50CF", "\u50CF"], /* CJK Ideograph */
+ ["\u50D0", "\u50D0"], /* CJK Ideograph */
+ ["\u50D1", "\u50D1"], /* CJK Ideograph */
+ ["\u50D2", "\u50D2"], /* CJK Ideograph */
+ ["\u50D3", "\u50D3"], /* CJK Ideograph */
+ ["\u50D4", "\u50D4"], /* CJK Ideograph */
+ ["\u50D5", "\u50D5"], /* CJK Ideograph */
+ ["\u50D6", "\u50D6"], /* CJK Ideograph */
+ ["\u50D7", "\u50D7"], /* CJK Ideograph */
+ ["\u50D8", "\u50D8"], /* CJK Ideograph */
+ ["\u50D9", "\u50D9"], /* CJK Ideograph */
+ ["\u50DA", "\u50DA"], /* CJK Ideograph */
+ ["\u50DB", "\u50DB"], /* CJK Ideograph */
+ ["\u50DC", "\u50DC"], /* CJK Ideograph */
+ ["\u50DD", "\u50DD"], /* CJK Ideograph */
+ ["\u50DE", "\u50DE"], /* CJK Ideograph */
+ ["\u50DF", "\u50DF"], /* CJK Ideograph */
+ ["\u50E0", "\u50E0"], /* CJK Ideograph */
+ ["\u50E1", "\u50E1"], /* CJK Ideograph */
+ ["\u50E2", "\u50E2"], /* CJK Ideograph */
+ ["\u50E3", "\u50E3"], /* CJK Ideograph */
+ ["\u50E4", "\u50E4"], /* CJK Ideograph */
+ ["\u50E5", "\u50E5"], /* CJK Ideograph */
+ ["\u50E6", "\u50E6"], /* CJK Ideograph */
+ ["\u50E7", "\u50E7"], /* CJK Ideograph */
+ ["\u50E8", "\u50E8"], /* CJK Ideograph */
+ ["\u50E9", "\u50E9"], /* CJK Ideograph */
+ ["\u50EA", "\u50EA"], /* CJK Ideograph */
+ ["\u50EB", "\u50EB"], /* CJK Ideograph */
+ ["\u50EC", "\u50EC"], /* CJK Ideograph */
+ ["\u50ED", "\u50ED"], /* CJK Ideograph */
+ ["\u50EE", "\u50EE"], /* CJK Ideograph */
+ ["\u50EF", "\u50EF"], /* CJK Ideograph */
+ ["\u50F0", "\u50F0"], /* CJK Ideograph */
+ ["\u50F1", "\u50F1"], /* CJK Ideograph */
+ ["\u50F2", "\u50F2"], /* CJK Ideograph */
+ ["\u50F3", "\u50F3"], /* CJK Ideograph */
+ ["\u50F4", "\u50F4"], /* CJK Ideograph */
+ ["\u50F5", "\u50F5"], /* CJK Ideograph */
+ ["\u50F6", "\u50F6"], /* CJK Ideograph */
+ ["\u50F7", "\u50F7"], /* CJK Ideograph */
+ ["\u50F8", "\u50F8"], /* CJK Ideograph */
+ ["\u50F9", "\u50F9"], /* CJK Ideograph */
+ ["\u50FA", "\u50FA"], /* CJK Ideograph */
+ ["\u50FB", "\u50FB"], /* CJK Ideograph */
+ ["\u50FC", "\u50FC"], /* CJK Ideograph */
+ ["\u50FD", "\u50FD"], /* CJK Ideograph */
+ ["\u50FE", "\u50FE"], /* CJK Ideograph */
+ ["\u50FF", "\u50FF"], /* CJK Ideograph */
+ ["\u5100", "\u5100"], /* CJK Ideograph */
+ ["\u5101", "\u5101"], /* CJK Ideograph */
+ ["\u5102", "\u5102"], /* CJK Ideograph */
+ ["\u5103", "\u5103"], /* CJK Ideograph */
+ ["\u5104", "\u5104"], /* CJK Ideograph */
+ ["\u5105", "\u5105"], /* CJK Ideograph */
+ ["\u5106", "\u5106"], /* CJK Ideograph */
+ ["\u5107", "\u5107"], /* CJK Ideograph */
+ ["\u5108", "\u5108"], /* CJK Ideograph */
+ ["\u5109", "\u5109"], /* CJK Ideograph */
+ ["\u510A", "\u510A"], /* CJK Ideograph */
+ ["\u510B", "\u510B"], /* CJK Ideograph */
+ ["\u510C", "\u510C"], /* CJK Ideograph */
+ ["\u510D", "\u510D"], /* CJK Ideograph */
+ ["\u510E", "\u510E"], /* CJK Ideograph */
+ ["\u510F", "\u510F"], /* CJK Ideograph */
+ ["\u5110", "\u5110"], /* CJK Ideograph */
+ ["\u5111", "\u5111"], /* CJK Ideograph */
+ ["\u5112", "\u5112"], /* CJK Ideograph */
+ ["\u5113", "\u5113"], /* CJK Ideograph */
+ ["\u5114", "\u5114"], /* CJK Ideograph */
+ ["\u5115", "\u5115"], /* CJK Ideograph */
+ ["\u5116", "\u5116"], /* CJK Ideograph */
+ ["\u5117", "\u5117"], /* CJK Ideograph */
+ ["\u5118", "\u5118"], /* CJK Ideograph */
+ ["\u5119", "\u5119"], /* CJK Ideograph */
+ ["\u511A", "\u511A"], /* CJK Ideograph */
+ ["\u511B", "\u511B"], /* CJK Ideograph */
+ ["\u511C", "\u511C"], /* CJK Ideograph */
+ ["\u511D", "\u511D"], /* CJK Ideograph */
+ ["\u511E", "\u511E"], /* CJK Ideograph */
+ ["\u511F", "\u511F"], /* CJK Ideograph */
+ ["\u5120", "\u5120"], /* CJK Ideograph */
+ ["\u5121", "\u5121"], /* CJK Ideograph */
+ ["\u5122", "\u5122"], /* CJK Ideograph */
+ ["\u5123", "\u5123"], /* CJK Ideograph */
+ ["\u5124", "\u5124"], /* CJK Ideograph */
+ ["\u5125", "\u5125"], /* CJK Ideograph */
+ ["\u5126", "\u5126"], /* CJK Ideograph */
+ ["\u5127", "\u5127"], /* CJK Ideograph */
+ ["\u5128", "\u5128"], /* CJK Ideograph */
+ ["\u5129", "\u5129"], /* CJK Ideograph */
+ ["\u512A", "\u512A"], /* CJK Ideograph */
+ ["\u512B", "\u512B"], /* CJK Ideograph */
+ ["\u512C", "\u512C"], /* CJK Ideograph */
+ ["\u512D", "\u512D"], /* CJK Ideograph */
+ ["\u512E", "\u512E"], /* CJK Ideograph */
+ ["\u512F", "\u512F"], /* CJK Ideograph */
+ ["\u5130", "\u5130"], /* CJK Ideograph */
+ ["\u5131", "\u5131"], /* CJK Ideograph */
+ ["\u5132", "\u5132"], /* CJK Ideograph */
+ ["\u5133", "\u5133"], /* CJK Ideograph */
+ ["\u5134", "\u5134"], /* CJK Ideograph */
+ ["\u5135", "\u5135"], /* CJK Ideograph */
+ ["\u5136", "\u5136"], /* CJK Ideograph */
+ ["\u5137", "\u5137"], /* CJK Ideograph */
+ ["\u5138", "\u5138"], /* CJK Ideograph */
+ ["\u5139", "\u5139"], /* CJK Ideograph */
+ ["\u513A", "\u513A"], /* CJK Ideograph */
+ ["\u513B", "\u513B"], /* CJK Ideograph */
+ ["\u513C", "\u513C"], /* CJK Ideograph */
+ ["\u513D", "\u513D"], /* CJK Ideograph */
+ ["\u513E", "\u513E"], /* CJK Ideograph */
+ ["\u513F", "\u513F"], /* CJK Ideograph */
+ ["\u5140", "\u5140"], /* CJK Ideograph */
+ ["\u5141", "\u5141"], /* CJK Ideograph */
+ ["\u5142", "\u5142"], /* CJK Ideograph */
+ ["\u5143", "\u5143"], /* CJK Ideograph */
+ ["\u5144", "\u5144"], /* CJK Ideograph */
+ ["\u5145", "\u5145"], /* CJK Ideograph */
+ ["\u5146", "\u5146"], /* CJK Ideograph */
+ ["\u5147", "\u5147"], /* CJK Ideograph */
+ ["\u5148", "\u5148"], /* CJK Ideograph */
+ ["\u5149", "\u5149"], /* CJK Ideograph */
+ ["\u514A", "\u514A"], /* CJK Ideograph */
+ ["\u514B", "\u514B"], /* CJK Ideograph */
+ ["\u514C", "\u514C"], /* CJK Ideograph */
+ ["\u514D", "\u514D"], /* CJK Ideograph */
+ ["\u514E", "\u514E"], /* CJK Ideograph */
+ ["\u514F", "\u514F"], /* CJK Ideograph */
+ ["\u5150", "\u5150"], /* CJK Ideograph */
+ ["\u5151", "\u5151"], /* CJK Ideograph */
+ ["\u5152", "\u5152"], /* CJK Ideograph */
+ ["\u5153", "\u5153"], /* CJK Ideograph */
+ ["\u5154", "\u5154"], /* CJK Ideograph */
+ ["\u5155", "\u5155"], /* CJK Ideograph */
+ ["\u5156", "\u5156"], /* CJK Ideograph */
+ ["\u5157", "\u5157"], /* CJK Ideograph */
+ ["\u5158", "\u5158"], /* CJK Ideograph */
+ ["\u5159", "\u5159"], /* CJK Ideograph */
+ ["\u515A", "\u515A"], /* CJK Ideograph */
+ ["\u515B", "\u515B"], /* CJK Ideograph */
+ ["\u515C", "\u515C"], /* CJK Ideograph */
+ ["\u515D", "\u515D"], /* CJK Ideograph */
+ ["\u515E", "\u515E"], /* CJK Ideograph */
+ ["\u515F", "\u515F"], /* CJK Ideograph */
+ ["\u5160", "\u5160"], /* CJK Ideograph */
+ ["\u5161", "\u5161"], /* CJK Ideograph */
+ ["\u5162", "\u5162"], /* CJK Ideograph */
+ ["\u5163", "\u5163"], /* CJK Ideograph */
+ ["\u5164", "\u5164"], /* CJK Ideograph */
+ ["\u5165", "\u5165"], /* CJK Ideograph */
+ ["\u5166", "\u5166"], /* CJK Ideograph */
+ ["\u5167", "\u5167"], /* CJK Ideograph */
+ ["\u5168", "\u5168"], /* CJK Ideograph */
+ ["\u5169", "\u5169"], /* CJK Ideograph */
+ ["\u516A", "\u516A"], /* CJK Ideograph */
+ ["\u516B", "\u516B"], /* CJK Ideograph */
+ ["\u516C", "\u516C"], /* CJK Ideograph */
+ ["\u516D", "\u516D"], /* CJK Ideograph */
+ ["\u516E", "\u516E"], /* CJK Ideograph */
+ ["\u516F", "\u516F"], /* CJK Ideograph */
+ ["\u5170", "\u5170"], /* CJK Ideograph */
+ ["\u5171", "\u5171"], /* CJK Ideograph */
+ ["\u5172", "\u5172"], /* CJK Ideograph */
+ ["\u5173", "\u5173"], /* CJK Ideograph */
+ ["\u5174", "\u5174"], /* CJK Ideograph */
+ ["\u5175", "\u5175"], /* CJK Ideograph */
+ ["\u5176", "\u5176"], /* CJK Ideograph */
+ ["\u5177", "\u5177"], /* CJK Ideograph */
+ ["\u5178", "\u5178"], /* CJK Ideograph */
+ ["\u5179", "\u5179"], /* CJK Ideograph */
+ ["\u517A", "\u517A"], /* CJK Ideograph */
+ ["\u517B", "\u517B"], /* CJK Ideograph */
+ ["\u517C", "\u517C"], /* CJK Ideograph */
+ ["\u517D", "\u517D"], /* CJK Ideograph */
+ ["\u517E", "\u517E"], /* CJK Ideograph */
+ ["\u517F", "\u517F"], /* CJK Ideograph */
+ ["\u5180", "\u5180"], /* CJK Ideograph */
+ ["\u5181", "\u5181"], /* CJK Ideograph */
+ ["\u5182", "\u5182"], /* CJK Ideograph */
+ ["\u5183", "\u5183"], /* CJK Ideograph */
+ ["\u5184", "\u5184"], /* CJK Ideograph */
+ ["\u5185", "\u5185"], /* CJK Ideograph */
+ ["\u5186", "\u5186"], /* CJK Ideograph */
+ ["\u5187", "\u5187"], /* CJK Ideograph */
+ ["\u5188", "\u5188"], /* CJK Ideograph */
+ ["\u5189", "\u5189"], /* CJK Ideograph */
+ ["\u518A", "\u518A"], /* CJK Ideograph */
+ ["\u518B", "\u518B"], /* CJK Ideograph */
+ ["\u518C", "\u518C"], /* CJK Ideograph */
+ ["\u518D", "\u518D"], /* CJK Ideograph */
+ ["\u518E", "\u518E"], /* CJK Ideograph */
+ ["\u518F", "\u518F"], /* CJK Ideograph */
+ ["\u5190", "\u5190"], /* CJK Ideograph */
+ ["\u5191", "\u5191"], /* CJK Ideograph */
+ ["\u5192", "\u5192"], /* CJK Ideograph */
+ ["\u5193", "\u5193"], /* CJK Ideograph */
+ ["\u5194", "\u5194"], /* CJK Ideograph */
+ ["\u5195", "\u5195"], /* CJK Ideograph */
+ ["\u5196", "\u5196"], /* CJK Ideograph */
+ ["\u5197", "\u5197"], /* CJK Ideograph */
+ ["\u5198", "\u5198"], /* CJK Ideograph */
+ ["\u5199", "\u5199"], /* CJK Ideograph */
+ ["\u519A", "\u519A"], /* CJK Ideograph */
+ ["\u519B", "\u519B"], /* CJK Ideograph */
+ ["\u519C", "\u519C"], /* CJK Ideograph */
+ ["\u519D", "\u519D"], /* CJK Ideograph */
+ ["\u519E", "\u519E"], /* CJK Ideograph */
+ ["\u519F", "\u519F"], /* CJK Ideograph */
+ ["\u51A0", "\u51A0"], /* CJK Ideograph */
+ ["\u51A1", "\u51A1"], /* CJK Ideograph */
+ ["\u51A2", "\u51A2"], /* CJK Ideograph */
+ ["\u51A3", "\u51A3"], /* CJK Ideograph */
+ ["\u51A4", "\u51A4"], /* CJK Ideograph */
+ ["\u51A5", "\u51A5"], /* CJK Ideograph */
+ ["\u51A6", "\u51A6"], /* CJK Ideograph */
+ ["\u51A7", "\u51A7"], /* CJK Ideograph */
+ ["\u51A8", "\u51A8"], /* CJK Ideograph */
+ ["\u51A9", "\u51A9"], /* CJK Ideograph */
+ ["\u51AA", "\u51AA"], /* CJK Ideograph */
+ ["\u51AB", "\u51AB"], /* CJK Ideograph */
+ ["\u51AC", "\u51AC"], /* CJK Ideograph */
+ ["\u51AD", "\u51AD"], /* CJK Ideograph */
+ ["\u51AE", "\u51AE"], /* CJK Ideograph */
+ ["\u51AF", "\u51AF"], /* CJK Ideograph */
+ ["\u51B0", "\u51B0"], /* CJK Ideograph */
+ ["\u51B1", "\u51B1"], /* CJK Ideograph */
+ ["\u51B2", "\u51B2"], /* CJK Ideograph */
+ ["\u51B3", "\u51B3"], /* CJK Ideograph */
+ ["\u51B4", "\u51B4"], /* CJK Ideograph */
+ ["\u51B5", "\u51B5"], /* CJK Ideograph */
+ ["\u51B6", "\u51B6"], /* CJK Ideograph */
+ ["\u51B7", "\u51B7"], /* CJK Ideograph */
+ ["\u51B8", "\u51B8"], /* CJK Ideograph */
+ ["\u51B9", "\u51B9"], /* CJK Ideograph */
+ ["\u51BA", "\u51BA"], /* CJK Ideograph */
+ ["\u51BB", "\u51BB"], /* CJK Ideograph */
+ ["\u51BC", "\u51BC"], /* CJK Ideograph */
+ ["\u51BD", "\u51BD"], /* CJK Ideograph */
+ ["\u51BE", "\u51BE"], /* CJK Ideograph */
+ ["\u51BF", "\u51BF"], /* CJK Ideograph */
+ ["\u51C0", "\u51C0"], /* CJK Ideograph */
+ ["\u51C1", "\u51C1"], /* CJK Ideograph */
+ ["\u51C2", "\u51C2"], /* CJK Ideograph */
+ ["\u51C3", "\u51C3"], /* CJK Ideograph */
+ ["\u51C4", "\u51C4"], /* CJK Ideograph */
+ ["\u51C5", "\u51C5"], /* CJK Ideograph */
+ ["\u51C6", "\u51C6"], /* CJK Ideograph */
+ ["\u51C7", "\u51C7"], /* CJK Ideograph */
+ ["\u51C8", "\u51C8"], /* CJK Ideograph */
+ ["\u51C9", "\u51C9"], /* CJK Ideograph */
+ ["\u51CA", "\u51CA"], /* CJK Ideograph */
+ ["\u51CB", "\u51CB"], /* CJK Ideograph */
+ ["\u51CC", "\u51CC"], /* CJK Ideograph */
+ ["\u51CD", "\u51CD"], /* CJK Ideograph */
+ ["\u51CE", "\u51CE"], /* CJK Ideograph */
+ ["\u51CF", "\u51CF"], /* CJK Ideograph */
+ ["\u51D0", "\u51D0"], /* CJK Ideograph */
+ ["\u51D1", "\u51D1"], /* CJK Ideograph */
+ ["\u51D2", "\u51D2"], /* CJK Ideograph */
+ ["\u51D3", "\u51D3"], /* CJK Ideograph */
+ ["\u51D4", "\u51D4"], /* CJK Ideograph */
+ ["\u51D5", "\u51D5"], /* CJK Ideograph */
+ ["\u51D6", "\u51D6"], /* CJK Ideograph */
+ ["\u51D7", "\u51D7"], /* CJK Ideograph */
+ ["\u51D8", "\u51D8"], /* CJK Ideograph */
+ ["\u51D9", "\u51D9"], /* CJK Ideograph */
+ ["\u51DA", "\u51DA"], /* CJK Ideograph */
+ ["\u51DB", "\u51DB"], /* CJK Ideograph */
+ ["\u51DC", "\u51DC"], /* CJK Ideograph */
+ ["\u51DD", "\u51DD"], /* CJK Ideograph */
+ ["\u51DE", "\u51DE"], /* CJK Ideograph */
+ ["\u51DF", "\u51DF"], /* CJK Ideograph */
+ ["\u51E0", "\u51E0"], /* CJK Ideograph */
+ ["\u51E1", "\u51E1"], /* CJK Ideograph */
+ ["\u51E2", "\u51E2"], /* CJK Ideograph */
+ ["\u51E3", "\u51E3"], /* CJK Ideograph */
+ ["\u51E4", "\u51E4"], /* CJK Ideograph */
+ ["\u51E5", "\u51E5"], /* CJK Ideograph */
+ ["\u51E6", "\u51E6"], /* CJK Ideograph */
+ ["\u51E7", "\u51E7"], /* CJK Ideograph */
+ ["\u51E8", "\u51E8"], /* CJK Ideograph */
+ ["\u51E9", "\u51E9"], /* CJK Ideograph */
+ ["\u51EA", "\u51EA"], /* CJK Ideograph */
+ ["\u51EB", "\u51EB"], /* CJK Ideograph */
+ ["\u51EC", "\u51EC"], /* CJK Ideograph */
+ ["\u51ED", "\u51ED"], /* CJK Ideograph */
+ ["\u51EE", "\u51EE"], /* CJK Ideograph */
+ ["\u51EF", "\u51EF"], /* CJK Ideograph */
+ ["\u51F0", "\u51F0"], /* CJK Ideograph */
+ ["\u51F1", "\u51F1"], /* CJK Ideograph */
+ ["\u51F2", "\u51F2"], /* CJK Ideograph */
+ ["\u51F3", "\u51F3"], /* CJK Ideograph */
+ ["\u51F4", "\u51F4"], /* CJK Ideograph */
+ ["\u51F5", "\u51F5"], /* CJK Ideograph */
+ ["\u51F6", "\u51F6"], /* CJK Ideograph */
+ ["\u51F7", "\u51F7"], /* CJK Ideograph */
+ ["\u51F8", "\u51F8"], /* CJK Ideograph */
+ ["\u51F9", "\u51F9"], /* CJK Ideograph */
+ ["\u51FA", "\u51FA"], /* CJK Ideograph */
+ ["\u51FB", "\u51FB"], /* CJK Ideograph */
+ ["\u51FC", "\u51FC"], /* CJK Ideograph */
+ ["\u51FD", "\u51FD"], /* CJK Ideograph */
+ ["\u51FE", "\u51FE"], /* CJK Ideograph */
+ ["\u51FF", "\u51FF"], /* CJK Ideograph */
+ ["\u5200", "\u5200"], /* CJK Ideograph */
+ ["\u5201", "\u5201"], /* CJK Ideograph */
+ ["\u5202", "\u5202"], /* CJK Ideograph */
+ ["\u5203", "\u5203"], /* CJK Ideograph */
+ ["\u5204", "\u5204"], /* CJK Ideograph */
+ ["\u5205", "\u5205"], /* CJK Ideograph */
+ ["\u5206", "\u5206"], /* CJK Ideograph */
+ ["\u5207", "\u5207"], /* CJK Ideograph */
+ ["\u5208", "\u5208"], /* CJK Ideograph */
+ ["\u5209", "\u5209"], /* CJK Ideograph */
+ ["\u520A", "\u520A"], /* CJK Ideograph */
+ ["\u520B", "\u520B"], /* CJK Ideograph */
+ ["\u520C", "\u520C"], /* CJK Ideograph */
+ ["\u520D", "\u520D"], /* CJK Ideograph */
+ ["\u520E", "\u520E"], /* CJK Ideograph */
+ ["\u520F", "\u520F"], /* CJK Ideograph */
+ ["\u5210", "\u5210"], /* CJK Ideograph */
+ ["\u5211", "\u5211"], /* CJK Ideograph */
+ ["\u5212", "\u5212"], /* CJK Ideograph */
+ ["\u5213", "\u5213"], /* CJK Ideograph */
+ ["\u5214", "\u5214"], /* CJK Ideograph */
+ ["\u5215", "\u5215"], /* CJK Ideograph */
+ ["\u5216", "\u5216"], /* CJK Ideograph */
+ ["\u5217", "\u5217"], /* CJK Ideograph */
+ ["\u5218", "\u5218"], /* CJK Ideograph */
+ ["\u5219", "\u5219"], /* CJK Ideograph */
+ ["\u521A", "\u521A"], /* CJK Ideograph */
+ ["\u521B", "\u521B"], /* CJK Ideograph */
+ ["\u521C", "\u521C"], /* CJK Ideograph */
+ ["\u521D", "\u521D"], /* CJK Ideograph */
+ ["\u521E", "\u521E"], /* CJK Ideograph */
+ ["\u521F", "\u521F"], /* CJK Ideograph */
+ ["\u5220", "\u5220"], /* CJK Ideograph */
+ ["\u5221", "\u5221"], /* CJK Ideograph */
+ ["\u5222", "\u5222"], /* CJK Ideograph */
+ ["\u5223", "\u5223"], /* CJK Ideograph */
+ ["\u5224", "\u5224"], /* CJK Ideograph */
+ ["\u5225", "\u5225"], /* CJK Ideograph */
+ ["\u5226", "\u5226"], /* CJK Ideograph */
+ ["\u5227", "\u5227"], /* CJK Ideograph */
+ ["\u5228", "\u5228"], /* CJK Ideograph */
+ ["\u5229", "\u5229"], /* CJK Ideograph */
+ ["\u522A", "\u522A"], /* CJK Ideograph */
+ ["\u522B", "\u522B"], /* CJK Ideograph */
+ ["\u522C", "\u522C"], /* CJK Ideograph */
+ ["\u522D", "\u522D"], /* CJK Ideograph */
+ ["\u522E", "\u522E"], /* CJK Ideograph */
+ ["\u522F", "\u522F"], /* CJK Ideograph */
+ ["\u5230", "\u5230"], /* CJK Ideograph */
+ ["\u5231", "\u5231"], /* CJK Ideograph */
+ ["\u5232", "\u5232"], /* CJK Ideograph */
+ ["\u5233", "\u5233"], /* CJK Ideograph */
+ ["\u5234", "\u5234"], /* CJK Ideograph */
+ ["\u5235", "\u5235"], /* CJK Ideograph */
+ ["\u5236", "\u5236"], /* CJK Ideograph */
+ ["\u5237", "\u5237"], /* CJK Ideograph */
+ ["\u5238", "\u5238"], /* CJK Ideograph */
+ ["\u5239", "\u5239"], /* CJK Ideograph */
+ ["\u523A", "\u523A"], /* CJK Ideograph */
+ ["\u523B", "\u523B"], /* CJK Ideograph */
+ ["\u523C", "\u523C"], /* CJK Ideograph */
+ ["\u523D", "\u523D"], /* CJK Ideograph */
+ ["\u523E", "\u523E"], /* CJK Ideograph */
+ ["\u523F", "\u523F"], /* CJK Ideograph */
+ ["\u5240", "\u5240"], /* CJK Ideograph */
+ ["\u5241", "\u5241"], /* CJK Ideograph */
+ ["\u5242", "\u5242"], /* CJK Ideograph */
+ ["\u5243", "\u5243"], /* CJK Ideograph */
+ ["\u5244", "\u5244"], /* CJK Ideograph */
+ ["\u5245", "\u5245"], /* CJK Ideograph */
+ ["\u5246", "\u5246"], /* CJK Ideograph */
+ ["\u5247", "\u5247"], /* CJK Ideograph */
+ ["\u5248", "\u5248"], /* CJK Ideograph */
+ ["\u5249", "\u5249"], /* CJK Ideograph */
+ ["\u524A", "\u524A"], /* CJK Ideograph */
+ ["\u524B", "\u524B"], /* CJK Ideograph */
+ ["\u524C", "\u524C"], /* CJK Ideograph */
+ ["\u524D", "\u524D"], /* CJK Ideograph */
+ ["\u524E", "\u524E"], /* CJK Ideograph */
+ ["\u524F", "\u524F"], /* CJK Ideograph */
+ ["\u5250", "\u5250"], /* CJK Ideograph */
+ ["\u5251", "\u5251"], /* CJK Ideograph */
+ ["\u5252", "\u5252"], /* CJK Ideograph */
+ ["\u5253", "\u5253"], /* CJK Ideograph */
+ ["\u5254", "\u5254"], /* CJK Ideograph */
+ ["\u5255", "\u5255"], /* CJK Ideograph */
+ ["\u5256", "\u5256"], /* CJK Ideograph */
+ ["\u5257", "\u5257"], /* CJK Ideograph */
+ ["\u5258", "\u5258"], /* CJK Ideograph */
+ ["\u5259", "\u5259"], /* CJK Ideograph */
+ ["\u525A", "\u525A"], /* CJK Ideograph */
+ ["\u525B", "\u525B"], /* CJK Ideograph */
+ ["\u525C", "\u525C"], /* CJK Ideograph */
+ ["\u525D", "\u525D"], /* CJK Ideograph */
+ ["\u525E", "\u525E"], /* CJK Ideograph */
+ ["\u525F", "\u525F"], /* CJK Ideograph */
+ ["\u5260", "\u5260"], /* CJK Ideograph */
+ ["\u5261", "\u5261"], /* CJK Ideograph */
+ ["\u5262", "\u5262"], /* CJK Ideograph */
+ ["\u5263", "\u5263"], /* CJK Ideograph */
+ ["\u5264", "\u5264"], /* CJK Ideograph */
+ ["\u5265", "\u5265"], /* CJK Ideograph */
+ ["\u5266", "\u5266"], /* CJK Ideograph */
+ ["\u5267", "\u5267"], /* CJK Ideograph */
+ ["\u5268", "\u5268"], /* CJK Ideograph */
+ ["\u5269", "\u5269"], /* CJK Ideograph */
+ ["\u526A", "\u526A"], /* CJK Ideograph */
+ ["\u526B", "\u526B"], /* CJK Ideograph */
+ ["\u526C", "\u526C"], /* CJK Ideograph */
+ ["\u526D", "\u526D"], /* CJK Ideograph */
+ ["\u526E", "\u526E"], /* CJK Ideograph */
+ ["\u526F", "\u526F"], /* CJK Ideograph */
+ ["\u5270", "\u5270"], /* CJK Ideograph */
+ ["\u5271", "\u5271"], /* CJK Ideograph */
+ ["\u5272", "\u5272"], /* CJK Ideograph */
+ ["\u5273", "\u5273"], /* CJK Ideograph */
+ ["\u5274", "\u5274"], /* CJK Ideograph */
+ ["\u5275", "\u5275"], /* CJK Ideograph */
+ ["\u5276", "\u5276"], /* CJK Ideograph */
+ ["\u5277", "\u5277"], /* CJK Ideograph */
+ ["\u5278", "\u5278"], /* CJK Ideograph */
+ ["\u5279", "\u5279"], /* CJK Ideograph */
+ ["\u527A", "\u527A"], /* CJK Ideograph */
+ ["\u527B", "\u527B"], /* CJK Ideograph */
+ ["\u527C", "\u527C"], /* CJK Ideograph */
+ ["\u527D", "\u527D"], /* CJK Ideograph */
+ ["\u527E", "\u527E"], /* CJK Ideograph */
+ ["\u527F", "\u527F"], /* CJK Ideograph */
+ ["\u5280", "\u5280"], /* CJK Ideograph */
+ ["\u5281", "\u5281"], /* CJK Ideograph */
+ ["\u5282", "\u5282"], /* CJK Ideograph */
+ ["\u5283", "\u5283"], /* CJK Ideograph */
+ ["\u5284", "\u5284"], /* CJK Ideograph */
+ ["\u5285", "\u5285"], /* CJK Ideograph */
+ ["\u5286", "\u5286"], /* CJK Ideograph */
+ ["\u5287", "\u5287"], /* CJK Ideograph */
+ ["\u5288", "\u5288"], /* CJK Ideograph */
+ ["\u5289", "\u5289"], /* CJK Ideograph */
+ ["\u528A", "\u528A"], /* CJK Ideograph */
+ ["\u528B", "\u528B"], /* CJK Ideograph */
+ ["\u528C", "\u528C"], /* CJK Ideograph */
+ ["\u528D", "\u528D"], /* CJK Ideograph */
+ ["\u528E", "\u528E"], /* CJK Ideograph */
+ ["\u528F", "\u528F"], /* CJK Ideograph */
+ ["\u5290", "\u5290"], /* CJK Ideograph */
+ ["\u5291", "\u5291"], /* CJK Ideograph */
+ ["\u5292", "\u5292"], /* CJK Ideograph */
+ ["\u5293", "\u5293"], /* CJK Ideograph */
+ ["\u5294", "\u5294"], /* CJK Ideograph */
+ ["\u5295", "\u5295"], /* CJK Ideograph */
+ ["\u5296", "\u5296"], /* CJK Ideograph */
+ ["\u5297", "\u5297"], /* CJK Ideograph */
+ ["\u5298", "\u5298"], /* CJK Ideograph */
+ ["\u5299", "\u5299"], /* CJK Ideograph */
+ ["\u529A", "\u529A"], /* CJK Ideograph */
+ ["\u529B", "\u529B"], /* CJK Ideograph */
+ ["\u529C", "\u529C"], /* CJK Ideograph */
+ ["\u529D", "\u529D"], /* CJK Ideograph */
+ ["\u529E", "\u529E"], /* CJK Ideograph */
+ ["\u529F", "\u529F"], /* CJK Ideograph */
+ ["\u52A0", "\u52A0"], /* CJK Ideograph */
+ ["\u52A1", "\u52A1"], /* CJK Ideograph */
+ ["\u52A2", "\u52A2"], /* CJK Ideograph */
+ ["\u52A3", "\u52A3"], /* CJK Ideograph */
+ ["\u52A4", "\u52A4"], /* CJK Ideograph */
+ ["\u52A5", "\u52A5"], /* CJK Ideograph */
+ ["\u52A6", "\u52A6"], /* CJK Ideograph */
+ ["\u52A7", "\u52A7"], /* CJK Ideograph */
+ ["\u52A8", "\u52A8"], /* CJK Ideograph */
+ ["\u52A9", "\u52A9"], /* CJK Ideograph */
+ ["\u52AA", "\u52AA"], /* CJK Ideograph */
+ ["\u52AB", "\u52AB"], /* CJK Ideograph */
+ ["\u52AC", "\u52AC"], /* CJK Ideograph */
+ ["\u52AD", "\u52AD"], /* CJK Ideograph */
+ ["\u52AE", "\u52AE"], /* CJK Ideograph */
+ ["\u52AF", "\u52AF"], /* CJK Ideograph */
+ ["\u52B0", "\u52B0"], /* CJK Ideograph */
+ ["\u52B1", "\u52B1"], /* CJK Ideograph */
+ ["\u52B2", "\u52B2"], /* CJK Ideograph */
+ ["\u52B3", "\u52B3"], /* CJK Ideograph */
+ ["\u52B4", "\u52B4"], /* CJK Ideograph */
+ ["\u52B5", "\u52B5"], /* CJK Ideograph */
+ ["\u52B6", "\u52B6"], /* CJK Ideograph */
+ ["\u52B7", "\u52B7"], /* CJK Ideograph */
+ ["\u52B8", "\u52B8"], /* CJK Ideograph */
+ ["\u52B9", "\u52B9"], /* CJK Ideograph */
+ ["\u52BA", "\u52BA"], /* CJK Ideograph */
+ ["\u52BB", "\u52BB"], /* CJK Ideograph */
+ ["\u52BC", "\u52BC"], /* CJK Ideograph */
+ ["\u52BD", "\u52BD"], /* CJK Ideograph */
+ ["\u52BE", "\u52BE"], /* CJK Ideograph */
+ ["\u52BF", "\u52BF"], /* CJK Ideograph */
+ ["\u52C0", "\u52C0"], /* CJK Ideograph */
+ ["\u52C1", "\u52C1"], /* CJK Ideograph */
+ ["\u52C2", "\u52C2"], /* CJK Ideograph */
+ ["\u52C3", "\u52C3"], /* CJK Ideograph */
+ ["\u52C4", "\u52C4"], /* CJK Ideograph */
+ ["\u52C5", "\u52C5"], /* CJK Ideograph */
+ ["\u52C6", "\u52C6"], /* CJK Ideograph */
+ ["\u52C7", "\u52C7"], /* CJK Ideograph */
+ ["\u52C8", "\u52C8"], /* CJK Ideograph */
+ ["\u52C9", "\u52C9"], /* CJK Ideograph */
+ ["\u52CA", "\u52CA"], /* CJK Ideograph */
+ ["\u52CB", "\u52CB"], /* CJK Ideograph */
+ ["\u52CC", "\u52CC"], /* CJK Ideograph */
+ ["\u52CD", "\u52CD"], /* CJK Ideograph */
+ ["\u52CE", "\u52CE"], /* CJK Ideograph */
+ ["\u52CF", "\u52CF"], /* CJK Ideograph */
+ ["\u52D0", "\u52D0"], /* CJK Ideograph */
+ ["\u52D1", "\u52D1"], /* CJK Ideograph */
+ ["\u52D2", "\u52D2"], /* CJK Ideograph */
+ ["\u52D3", "\u52D3"], /* CJK Ideograph */
+ ["\u52D4", "\u52D4"], /* CJK Ideograph */
+ ["\u52D5", "\u52D5"], /* CJK Ideograph */
+ ["\u52D6", "\u52D6"], /* CJK Ideograph */
+ ["\u52D7", "\u52D7"], /* CJK Ideograph */
+ ["\u52D8", "\u52D8"], /* CJK Ideograph */
+ ["\u52D9", "\u52D9"], /* CJK Ideograph */
+ ["\u52DA", "\u52DA"], /* CJK Ideograph */
+ ["\u52DB", "\u52DB"], /* CJK Ideograph */
+ ["\u52DC", "\u52DC"], /* CJK Ideograph */
+ ["\u52DD", "\u52DD"], /* CJK Ideograph */
+ ["\u52DE", "\u52DE"], /* CJK Ideograph */
+ ["\u52DF", "\u52DF"], /* CJK Ideograph */
+ ["\u52E0", "\u52E0"], /* CJK Ideograph */
+ ["\u52E1", "\u52E1"], /* CJK Ideograph */
+ ["\u52E2", "\u52E2"], /* CJK Ideograph */
+ ["\u52E3", "\u52E3"], /* CJK Ideograph */
+ ["\u52E4", "\u52E4"], /* CJK Ideograph */
+ ["\u52E5", "\u52E5"], /* CJK Ideograph */
+ ["\u52E6", "\u52E6"], /* CJK Ideograph */
+ ["\u52E7", "\u52E7"], /* CJK Ideograph */
+ ["\u52E8", "\u52E8"], /* CJK Ideograph */
+ ["\u52E9", "\u52E9"], /* CJK Ideograph */
+ ["\u52EA", "\u52EA"], /* CJK Ideograph */
+ ["\u52EB", "\u52EB"], /* CJK Ideograph */
+ ["\u52EC", "\u52EC"], /* CJK Ideograph */
+ ["\u52ED", "\u52ED"], /* CJK Ideograph */
+ ["\u52EE", "\u52EE"], /* CJK Ideograph */
+ ["\u52EF", "\u52EF"], /* CJK Ideograph */
+ ["\u52F0", "\u52F0"], /* CJK Ideograph */
+ ["\u52F1", "\u52F1"], /* CJK Ideograph */
+ ["\u52F2", "\u52F2"], /* CJK Ideograph */
+ ["\u52F3", "\u52F3"], /* CJK Ideograph */
+ ["\u52F4", "\u52F4"], /* CJK Ideograph */
+ ["\u52F5", "\u52F5"], /* CJK Ideograph */
+ ["\u52F6", "\u52F6"], /* CJK Ideograph */
+ ["\u52F7", "\u52F7"], /* CJK Ideograph */
+ ["\u52F8", "\u52F8"], /* CJK Ideograph */
+ ["\u52F9", "\u52F9"], /* CJK Ideograph */
+ ["\u52FA", "\u52FA"], /* CJK Ideograph */
+ ["\u52FB", "\u52FB"], /* CJK Ideograph */
+ ["\u52FC", "\u52FC"], /* CJK Ideograph */
+ ["\u52FD", "\u52FD"], /* CJK Ideograph */
+ ["\u52FE", "\u52FE"], /* CJK Ideograph */
+ ["\u52FF", "\u52FF"], /* CJK Ideograph */
+ ["\u5300", "\u5300"], /* CJK Ideograph */
+ ["\u5301", "\u5301"], /* CJK Ideograph */
+ ["\u5302", "\u5302"], /* CJK Ideograph */
+ ["\u5303", "\u5303"], /* CJK Ideograph */
+ ["\u5304", "\u5304"], /* CJK Ideograph */
+ ["\u5305", "\u5305"], /* CJK Ideograph */
+ ["\u5306", "\u5306"], /* CJK Ideograph */
+ ["\u5307", "\u5307"], /* CJK Ideograph */
+ ["\u5308", "\u5308"], /* CJK Ideograph */
+ ["\u5309", "\u5309"], /* CJK Ideograph */
+ ["\u530A", "\u530A"], /* CJK Ideograph */
+ ["\u530B", "\u530B"], /* CJK Ideograph */
+ ["\u530C", "\u530C"], /* CJK Ideograph */
+ ["\u530D", "\u530D"], /* CJK Ideograph */
+ ["\u530E", "\u530E"], /* CJK Ideograph */
+ ["\u530F", "\u530F"], /* CJK Ideograph */
+ ["\u5310", "\u5310"], /* CJK Ideograph */
+ ["\u5311", "\u5311"], /* CJK Ideograph */
+ ["\u5312", "\u5312"], /* CJK Ideograph */
+ ["\u5313", "\u5313"], /* CJK Ideograph */
+ ["\u5314", "\u5314"], /* CJK Ideograph */
+ ["\u5315", "\u5315"], /* CJK Ideograph */
+ ["\u5316", "\u5316"], /* CJK Ideograph */
+ ["\u5317", "\u5317"], /* CJK Ideograph */
+ ["\u5318", "\u5318"], /* CJK Ideograph */
+ ["\u5319", "\u5319"], /* CJK Ideograph */
+ ["\u531A", "\u531A"], /* CJK Ideograph */
+ ["\u531B", "\u531B"], /* CJK Ideograph */
+ ["\u531C", "\u531C"], /* CJK Ideograph */
+ ["\u531D", "\u531D"], /* CJK Ideograph */
+ ["\u531E", "\u531E"], /* CJK Ideograph */
+ ["\u531F", "\u531F"], /* CJK Ideograph */
+ ["\u5320", "\u5320"], /* CJK Ideograph */
+ ["\u5321", "\u5321"], /* CJK Ideograph */
+ ["\u5322", "\u5322"], /* CJK Ideograph */
+ ["\u5323", "\u5323"], /* CJK Ideograph */
+ ["\u5324", "\u5324"], /* CJK Ideograph */
+ ["\u5325", "\u5325"], /* CJK Ideograph */
+ ["\u5326", "\u5326"], /* CJK Ideograph */
+ ["\u5327", "\u5327"], /* CJK Ideograph */
+ ["\u5328", "\u5328"], /* CJK Ideograph */
+ ["\u5329", "\u5329"], /* CJK Ideograph */
+ ["\u532A", "\u532A"], /* CJK Ideograph */
+ ["\u532B", "\u532B"], /* CJK Ideograph */
+ ["\u532C", "\u532C"], /* CJK Ideograph */
+ ["\u532D", "\u532D"], /* CJK Ideograph */
+ ["\u532E", "\u532E"], /* CJK Ideograph */
+ ["\u532F", "\u532F"], /* CJK Ideograph */
+ ["\u5330", "\u5330"], /* CJK Ideograph */
+ ["\u5331", "\u5331"], /* CJK Ideograph */
+ ["\u5332", "\u5332"], /* CJK Ideograph */
+ ["\u5333", "\u5333"], /* CJK Ideograph */
+ ["\u5334", "\u5334"], /* CJK Ideograph */
+ ["\u5335", "\u5335"], /* CJK Ideograph */
+ ["\u5336", "\u5336"], /* CJK Ideograph */
+ ["\u5337", "\u5337"], /* CJK Ideograph */
+ ["\u5338", "\u5338"], /* CJK Ideograph */
+ ["\u5339", "\u5339"], /* CJK Ideograph */
+ ["\u533A", "\u533A"], /* CJK Ideograph */
+ ["\u533B", "\u533B"], /* CJK Ideograph */
+ ["\u533C", "\u533C"], /* CJK Ideograph */
+ ["\u533D", "\u533D"], /* CJK Ideograph */
+ ["\u533E", "\u533E"], /* CJK Ideograph */
+ ["\u533F", "\u533F"], /* CJK Ideograph */
+ ["\u5340", "\u5340"], /* CJK Ideograph */
+ ["\u5341", "\u5341"], /* CJK Ideograph */
+ ["\u5342", "\u5342"], /* CJK Ideograph */
+ ["\u5343", "\u5343"], /* CJK Ideograph */
+ ["\u5344", "\u5344"], /* CJK Ideograph */
+ ["\u5345", "\u5345"], /* CJK Ideograph */
+ ["\u5346", "\u5346"], /* CJK Ideograph */
+ ["\u5347", "\u5347"], /* CJK Ideograph */
+ ["\u5348", "\u5348"], /* CJK Ideograph */
+ ["\u5349", "\u5349"], /* CJK Ideograph */
+ ["\u534A", "\u534A"], /* CJK Ideograph */
+ ["\u534B", "\u534B"], /* CJK Ideograph */
+ ["\u534C", "\u534C"], /* CJK Ideograph */
+ ["\u534D", "\u534D"], /* CJK Ideograph */
+ ["\u534E", "\u534E"], /* CJK Ideograph */
+ ["\u534F", "\u534F"], /* CJK Ideograph */
+ ["\u5350", "\u5350"], /* CJK Ideograph */
+ ["\u5351", "\u5351"], /* CJK Ideograph */
+ ["\u5352", "\u5352"], /* CJK Ideograph */
+ ["\u5353", "\u5353"], /* CJK Ideograph */
+ ["\u5354", "\u5354"], /* CJK Ideograph */
+ ["\u5355", "\u5355"], /* CJK Ideograph */
+ ["\u5356", "\u5356"], /* CJK Ideograph */
+ ["\u5357", "\u5357"], /* CJK Ideograph */
+ ["\u5358", "\u5358"], /* CJK Ideograph */
+ ["\u5359", "\u5359"], /* CJK Ideograph */
+ ["\u535A", "\u535A"], /* CJK Ideograph */
+ ["\u535B", "\u535B"], /* CJK Ideograph */
+ ["\u535C", "\u535C"], /* CJK Ideograph */
+ ["\u535D", "\u535D"], /* CJK Ideograph */
+ ["\u535E", "\u535E"], /* CJK Ideograph */
+ ["\u535F", "\u535F"], /* CJK Ideograph */
+ ["\u5360", "\u5360"], /* CJK Ideograph */
+ ["\u5361", "\u5361"], /* CJK Ideograph */
+ ["\u5362", "\u5362"], /* CJK Ideograph */
+ ["\u5363", "\u5363"], /* CJK Ideograph */
+ ["\u5364", "\u5364"], /* CJK Ideograph */
+ ["\u5365", "\u5365"], /* CJK Ideograph */
+ ["\u5366", "\u5366"], /* CJK Ideograph */
+ ["\u5367", "\u5367"], /* CJK Ideograph */
+ ["\u5368", "\u5368"], /* CJK Ideograph */
+ ["\u5369", "\u5369"], /* CJK Ideograph */
+ ["\u536A", "\u536A"], /* CJK Ideograph */
+ ["\u536B", "\u536B"], /* CJK Ideograph */
+ ["\u536C", "\u536C"], /* CJK Ideograph */
+ ["\u536D", "\u536D"], /* CJK Ideograph */
+ ["\u536E", "\u536E"], /* CJK Ideograph */
+ ["\u536F", "\u536F"], /* CJK Ideograph */
+ ["\u5370", "\u5370"], /* CJK Ideograph */
+ ["\u5371", "\u5371"], /* CJK Ideograph */
+ ["\u5372", "\u5372"], /* CJK Ideograph */
+ ["\u5373", "\u5373"], /* CJK Ideograph */
+ ["\u5374", "\u5374"], /* CJK Ideograph */
+ ["\u5375", "\u5375"], /* CJK Ideograph */
+ ["\u5376", "\u5376"], /* CJK Ideograph */
+ ["\u5377", "\u5377"], /* CJK Ideograph */
+ ["\u5378", "\u5378"], /* CJK Ideograph */
+ ["\u5379", "\u5379"], /* CJK Ideograph */
+ ["\u537A", "\u537A"], /* CJK Ideograph */
+ ["\u537B", "\u537B"], /* CJK Ideograph */
+ ["\u537C", "\u537C"], /* CJK Ideograph */
+ ["\u537D", "\u537D"], /* CJK Ideograph */
+ ["\u537E", "\u537E"], /* CJK Ideograph */
+ ["\u537F", "\u537F"], /* CJK Ideograph */
+ ["\u5380", "\u5380"], /* CJK Ideograph */
+ ["\u5381", "\u5381"], /* CJK Ideograph */
+ ["\u5382", "\u5382"], /* CJK Ideograph */
+ ["\u5383", "\u5383"], /* CJK Ideograph */
+ ["\u5384", "\u5384"], /* CJK Ideograph */
+ ["\u5385", "\u5385"], /* CJK Ideograph */
+ ["\u5386", "\u5386"], /* CJK Ideograph */
+ ["\u5387", "\u5387"], /* CJK Ideograph */
+ ["\u5388", "\u5388"], /* CJK Ideograph */
+ ["\u5389", "\u5389"], /* CJK Ideograph */
+ ["\u538A", "\u538A"], /* CJK Ideograph */
+ ["\u538B", "\u538B"], /* CJK Ideograph */
+ ["\u538C", "\u538C"], /* CJK Ideograph */
+ ["\u538D", "\u538D"], /* CJK Ideograph */
+ ["\u538E", "\u538E"], /* CJK Ideograph */
+ ["\u538F", "\u538F"], /* CJK Ideograph */
+ ["\u5390", "\u5390"], /* CJK Ideograph */
+ ["\u5391", "\u5391"], /* CJK Ideograph */
+ ["\u5392", "\u5392"], /* CJK Ideograph */
+ ["\u5393", "\u5393"], /* CJK Ideograph */
+ ["\u5394", "\u5394"], /* CJK Ideograph */
+ ["\u5395", "\u5395"], /* CJK Ideograph */
+ ["\u5396", "\u5396"], /* CJK Ideograph */
+ ["\u5397", "\u5397"], /* CJK Ideograph */
+ ["\u5398", "\u5398"], /* CJK Ideograph */
+ ["\u5399", "\u5399"], /* CJK Ideograph */
+ ["\u539A", "\u539A"], /* CJK Ideograph */
+ ["\u539B", "\u539B"], /* CJK Ideograph */
+ ["\u539C", "\u539C"], /* CJK Ideograph */
+ ["\u539D", "\u539D"], /* CJK Ideograph */
+ ["\u539E", "\u539E"], /* CJK Ideograph */
+ ["\u539F", "\u539F"], /* CJK Ideograph */
+ ["\u53A0", "\u53A0"], /* CJK Ideograph */
+ ["\u53A1", "\u53A1"], /* CJK Ideograph */
+ ["\u53A2", "\u53A2"], /* CJK Ideograph */
+ ["\u53A3", "\u53A3"], /* CJK Ideograph */
+ ["\u53A4", "\u53A4"], /* CJK Ideograph */
+ ["\u53A5", "\u53A5"], /* CJK Ideograph */
+ ["\u53A6", "\u53A6"], /* CJK Ideograph */
+ ["\u53A7", "\u53A7"], /* CJK Ideograph */
+ ["\u53A8", "\u53A8"], /* CJK Ideograph */
+ ["\u53A9", "\u53A9"], /* CJK Ideograph */
+ ["\u53AA", "\u53AA"], /* CJK Ideograph */
+ ["\u53AB", "\u53AB"], /* CJK Ideograph */
+ ["\u53AC", "\u53AC"], /* CJK Ideograph */
+ ["\u53AD", "\u53AD"], /* CJK Ideograph */
+ ["\u53AE", "\u53AE"], /* CJK Ideograph */
+ ["\u53AF", "\u53AF"], /* CJK Ideograph */
+ ["\u53B0", "\u53B0"], /* CJK Ideograph */
+ ["\u53B1", "\u53B1"], /* CJK Ideograph */
+ ["\u53B2", "\u53B2"], /* CJK Ideograph */
+ ["\u53B3", "\u53B3"], /* CJK Ideograph */
+ ["\u53B4", "\u53B4"], /* CJK Ideograph */
+ ["\u53B5", "\u53B5"], /* CJK Ideograph */
+ ["\u53B6", "\u53B6"], /* CJK Ideograph */
+ ["\u53B7", "\u53B7"], /* CJK Ideograph */
+ ["\u53B8", "\u53B8"], /* CJK Ideograph */
+ ["\u53B9", "\u53B9"], /* CJK Ideograph */
+ ["\u53BA", "\u53BA"], /* CJK Ideograph */
+ ["\u53BB", "\u53BB"], /* CJK Ideograph */
+ ["\u53BC", "\u53BC"], /* CJK Ideograph */
+ ["\u53BD", "\u53BD"], /* CJK Ideograph */
+ ["\u53BE", "\u53BE"], /* CJK Ideograph */
+ ["\u53BF", "\u53BF"], /* CJK Ideograph */
+ ["\u53C0", "\u53C0"], /* CJK Ideograph */
+ ["\u53C1", "\u53C1"], /* CJK Ideograph */
+ ["\u53C2", "\u53C2"], /* CJK Ideograph */
+ ["\u53C3", "\u53C3"], /* CJK Ideograph */
+ ["\u53C4", "\u53C4"], /* CJK Ideograph */
+ ["\u53C5", "\u53C5"], /* CJK Ideograph */
+ ["\u53C6", "\u53C6"], /* CJK Ideograph */
+ ["\u53C7", "\u53C7"], /* CJK Ideograph */
+ ["\u53C8", "\u53C8"], /* CJK Ideograph */
+ ["\u53C9", "\u53C9"], /* CJK Ideograph */
+ ["\u53CA", "\u53CA"], /* CJK Ideograph */
+ ["\u53CB", "\u53CB"], /* CJK Ideograph */
+ ["\u53CC", "\u53CC"], /* CJK Ideograph */
+ ["\u53CD", "\u53CD"], /* CJK Ideograph */
+ ["\u53CE", "\u53CE"], /* CJK Ideograph */
+ ["\u53CF", "\u53CF"], /* CJK Ideograph */
+ ["\u53D0", "\u53D0"], /* CJK Ideograph */
+ ["\u53D1", "\u53D1"], /* CJK Ideograph */
+ ["\u53D2", "\u53D2"], /* CJK Ideograph */
+ ["\u53D3", "\u53D3"], /* CJK Ideograph */
+ ["\u53D4", "\u53D4"], /* CJK Ideograph */
+ ["\u53D5", "\u53D5"], /* CJK Ideograph */
+ ["\u53D6", "\u53D6"], /* CJK Ideograph */
+ ["\u53D7", "\u53D7"], /* CJK Ideograph */
+ ["\u53D8", "\u53D8"], /* CJK Ideograph */
+ ["\u53D9", "\u53D9"], /* CJK Ideograph */
+ ["\u53DA", "\u53DA"], /* CJK Ideograph */
+ ["\u53DB", "\u53DB"], /* CJK Ideograph */
+ ["\u53DC", "\u53DC"], /* CJK Ideograph */
+ ["\u53DD", "\u53DD"], /* CJK Ideograph */
+ ["\u53DE", "\u53DE"], /* CJK Ideograph */
+ ["\u53DF", "\u53DF"], /* CJK Ideograph */
+ ["\u53E0", "\u53E0"], /* CJK Ideograph */
+ ["\u53E1", "\u53E1"], /* CJK Ideograph */
+ ["\u53E2", "\u53E2"], /* CJK Ideograph */
+ ["\u53E3", "\u53E3"], /* CJK Ideograph */
+ ["\u53E4", "\u53E4"], /* CJK Ideograph */
+ ["\u53E5", "\u53E5"], /* CJK Ideograph */
+ ["\u53E6", "\u53E6"], /* CJK Ideograph */
+ ["\u53E7", "\u53E7"], /* CJK Ideograph */
+ ["\u53E8", "\u53E8"], /* CJK Ideograph */
+ ["\u53E9", "\u53E9"], /* CJK Ideograph */
+ ["\u53EA", "\u53EA"], /* CJK Ideograph */
+ ["\u53EB", "\u53EB"], /* CJK Ideograph */
+ ["\u53EC", "\u53EC"], /* CJK Ideograph */
+ ["\u53ED", "\u53ED"], /* CJK Ideograph */
+ ["\u53EE", "\u53EE"], /* CJK Ideograph */
+ ["\u53EF", "\u53EF"], /* CJK Ideograph */
+ ["\u53F0", "\u53F0"], /* CJK Ideograph */
+ ["\u53F1", "\u53F1"], /* CJK Ideograph */
+ ["\u53F2", "\u53F2"], /* CJK Ideograph */
+ ["\u53F3", "\u53F3"], /* CJK Ideograph */
+ ["\u53F4", "\u53F4"], /* CJK Ideograph */
+ ["\u53F5", "\u53F5"], /* CJK Ideograph */
+ ["\u53F6", "\u53F6"], /* CJK Ideograph */
+ ["\u53F7", "\u53F7"], /* CJK Ideograph */
+ ["\u53F8", "\u53F8"], /* CJK Ideograph */
+ ["\u53F9", "\u53F9"], /* CJK Ideograph */
+ ["\u53FA", "\u53FA"], /* CJK Ideograph */
+ ["\u53FB", "\u53FB"], /* CJK Ideograph */
+ ["\u53FC", "\u53FC"], /* CJK Ideograph */
+ ["\u53FD", "\u53FD"], /* CJK Ideograph */
+ ["\u53FE", "\u53FE"], /* CJK Ideograph */
+ ["\u53FF", "\u53FF"], /* CJK Ideograph */
+ ["\u5400", "\u5400"], /* CJK Ideograph */
+ ["\u5401", "\u5401"], /* CJK Ideograph */
+ ["\u5402", "\u5402"], /* CJK Ideograph */
+ ["\u5403", "\u5403"], /* CJK Ideograph */
+ ["\u5404", "\u5404"], /* CJK Ideograph */
+ ["\u5405", "\u5405"], /* CJK Ideograph */
+ ["\u5406", "\u5406"], /* CJK Ideograph */
+ ["\u5407", "\u5407"], /* CJK Ideograph */
+ ["\u5408", "\u5408"], /* CJK Ideograph */
+ ["\u5409", "\u5409"], /* CJK Ideograph */
+ ["\u540A", "\u540A"], /* CJK Ideograph */
+ ["\u540B", "\u540B"], /* CJK Ideograph */
+ ["\u540C", "\u540C"], /* CJK Ideograph */
+ ["\u540D", "\u540D"], /* CJK Ideograph */
+ ["\u540E", "\u540E"], /* CJK Ideograph */
+ ["\u540F", "\u540F"], /* CJK Ideograph */
+ ["\u5410", "\u5410"], /* CJK Ideograph */
+ ["\u5411", "\u5411"], /* CJK Ideograph */
+ ["\u5412", "\u5412"], /* CJK Ideograph */
+ ["\u5413", "\u5413"], /* CJK Ideograph */
+ ["\u5414", "\u5414"], /* CJK Ideograph */
+ ["\u5415", "\u5415"], /* CJK Ideograph */
+ ["\u5416", "\u5416"], /* CJK Ideograph */
+ ["\u5417", "\u5417"], /* CJK Ideograph */
+ ["\u5418", "\u5418"], /* CJK Ideograph */
+ ["\u5419", "\u5419"], /* CJK Ideograph */
+ ["\u541A", "\u541A"], /* CJK Ideograph */
+ ["\u541B", "\u541B"], /* CJK Ideograph */
+ ["\u541C", "\u541C"], /* CJK Ideograph */
+ ["\u541D", "\u541D"], /* CJK Ideograph */
+ ["\u541E", "\u541E"], /* CJK Ideograph */
+ ["\u541F", "\u541F"], /* CJK Ideograph */
+ ["\u5420", "\u5420"], /* CJK Ideograph */
+ ["\u5421", "\u5421"], /* CJK Ideograph */
+ ["\u5422", "\u5422"], /* CJK Ideograph */
+ ["\u5423", "\u5423"], /* CJK Ideograph */
+ ["\u5424", "\u5424"], /* CJK Ideograph */
+ ["\u5425", "\u5425"], /* CJK Ideograph */
+ ["\u5426", "\u5426"], /* CJK Ideograph */
+ ["\u5427", "\u5427"], /* CJK Ideograph */
+ ["\u5428", "\u5428"], /* CJK Ideograph */
+ ["\u5429", "\u5429"], /* CJK Ideograph */
+ ["\u542A", "\u542A"], /* CJK Ideograph */
+ ["\u542B", "\u542B"], /* CJK Ideograph */
+ ["\u542C", "\u542C"], /* CJK Ideograph */
+ ["\u542D", "\u542D"], /* CJK Ideograph */
+ ["\u542E", "\u542E"], /* CJK Ideograph */
+ ["\u542F", "\u542F"], /* CJK Ideograph */
+ ["\u5430", "\u5430"], /* CJK Ideograph */
+ ["\u5431", "\u5431"], /* CJK Ideograph */
+ ["\u5432", "\u5432"], /* CJK Ideograph */
+ ["\u5433", "\u5433"], /* CJK Ideograph */
+ ["\u5434", "\u5434"], /* CJK Ideograph */
+ ["\u5435", "\u5435"], /* CJK Ideograph */
+ ["\u5436", "\u5436"], /* CJK Ideograph */
+ ["\u5437", "\u5437"], /* CJK Ideograph */
+ ["\u5438", "\u5438"], /* CJK Ideograph */
+ ["\u5439", "\u5439"], /* CJK Ideograph */
+ ["\u543A", "\u543A"], /* CJK Ideograph */
+ ["\u543B", "\u543B"], /* CJK Ideograph */
+ ["\u543C", "\u543C"], /* CJK Ideograph */
+ ["\u543D", "\u543D"], /* CJK Ideograph */
+ ["\u543E", "\u543E"], /* CJK Ideograph */
+ ["\u543F", "\u543F"], /* CJK Ideograph */
+ ["\u5440", "\u5440"], /* CJK Ideograph */
+ ["\u5441", "\u5441"], /* CJK Ideograph */
+ ["\u5442", "\u5442"], /* CJK Ideograph */
+ ["\u5443", "\u5443"], /* CJK Ideograph */
+ ["\u5444", "\u5444"], /* CJK Ideograph */
+ ["\u5445", "\u5445"], /* CJK Ideograph */
+ ["\u5446", "\u5446"], /* CJK Ideograph */
+ ["\u5447", "\u5447"], /* CJK Ideograph */
+ ["\u5448", "\u5448"], /* CJK Ideograph */
+ ["\u5449", "\u5449"], /* CJK Ideograph */
+ ["\u544A", "\u544A"], /* CJK Ideograph */
+ ["\u544B", "\u544B"], /* CJK Ideograph */
+ ["\u544C", "\u544C"], /* CJK Ideograph */
+ ["\u544D", "\u544D"], /* CJK Ideograph */
+ ["\u544E", "\u544E"], /* CJK Ideograph */
+ ["\u544F", "\u544F"], /* CJK Ideograph */
+ ["\u5450", "\u5450"], /* CJK Ideograph */
+ ["\u5451", "\u5451"], /* CJK Ideograph */
+ ["\u5452", "\u5452"], /* CJK Ideograph */
+ ["\u5453", "\u5453"], /* CJK Ideograph */
+ ["\u5454", "\u5454"], /* CJK Ideograph */
+ ["\u5455", "\u5455"], /* CJK Ideograph */
+ ["\u5456", "\u5456"], /* CJK Ideograph */
+ ["\u5457", "\u5457"], /* CJK Ideograph */
+ ["\u5458", "\u5458"], /* CJK Ideograph */
+ ["\u5459", "\u5459"], /* CJK Ideograph */
+ ["\u545A", "\u545A"], /* CJK Ideograph */
+ ["\u545B", "\u545B"], /* CJK Ideograph */
+ ["\u545C", "\u545C"], /* CJK Ideograph */
+ ["\u545D", "\u545D"], /* CJK Ideograph */
+ ["\u545E", "\u545E"], /* CJK Ideograph */
+ ["\u545F", "\u545F"], /* CJK Ideograph */
+ ["\u5460", "\u5460"], /* CJK Ideograph */
+ ["\u5461", "\u5461"], /* CJK Ideograph */
+ ["\u5462", "\u5462"], /* CJK Ideograph */
+ ["\u5463", "\u5463"], /* CJK Ideograph */
+ ["\u5464", "\u5464"], /* CJK Ideograph */
+ ["\u5465", "\u5465"], /* CJK Ideograph */
+ ["\u5466", "\u5466"], /* CJK Ideograph */
+ ["\u5467", "\u5467"], /* CJK Ideograph */
+ ["\u5468", "\u5468"], /* CJK Ideograph */
+ ["\u5469", "\u5469"], /* CJK Ideograph */
+ ["\u546A", "\u546A"], /* CJK Ideograph */
+ ["\u546B", "\u546B"], /* CJK Ideograph */
+ ["\u546C", "\u546C"], /* CJK Ideograph */
+ ["\u546D", "\u546D"], /* CJK Ideograph */
+ ["\u546E", "\u546E"], /* CJK Ideograph */
+ ["\u546F", "\u546F"], /* CJK Ideograph */
+ ["\u5470", "\u5470"], /* CJK Ideograph */
+ ["\u5471", "\u5471"], /* CJK Ideograph */
+ ["\u5472", "\u5472"], /* CJK Ideograph */
+ ["\u5473", "\u5473"], /* CJK Ideograph */
+ ["\u5474", "\u5474"], /* CJK Ideograph */
+ ["\u5475", "\u5475"], /* CJK Ideograph */
+ ["\u5476", "\u5476"], /* CJK Ideograph */
+ ["\u5477", "\u5477"], /* CJK Ideograph */
+ ["\u5478", "\u5478"], /* CJK Ideograph */
+ ["\u5479", "\u5479"], /* CJK Ideograph */
+ ["\u547A", "\u547A"], /* CJK Ideograph */
+ ["\u547B", "\u547B"], /* CJK Ideograph */
+ ["\u547C", "\u547C"], /* CJK Ideograph */
+ ["\u547D", "\u547D"], /* CJK Ideograph */
+ ["\u547E", "\u547E"], /* CJK Ideograph */
+ ["\u547F", "\u547F"], /* CJK Ideograph */
+ ["\u5480", "\u5480"], /* CJK Ideograph */
+ ["\u5481", "\u5481"], /* CJK Ideograph */
+ ["\u5482", "\u5482"], /* CJK Ideograph */
+ ["\u5483", "\u5483"], /* CJK Ideograph */
+ ["\u5484", "\u5484"], /* CJK Ideograph */
+ ["\u5485", "\u5485"], /* CJK Ideograph */
+ ["\u5486", "\u5486"], /* CJK Ideograph */
+ ["\u5487", "\u5487"], /* CJK Ideograph */
+ ["\u5488", "\u5488"], /* CJK Ideograph */
+ ["\u5489", "\u5489"], /* CJK Ideograph */
+ ["\u548A", "\u548A"], /* CJK Ideograph */
+ ["\u548B", "\u548B"], /* CJK Ideograph */
+ ["\u548C", "\u548C"], /* CJK Ideograph */
+ ["\u548D", "\u548D"], /* CJK Ideograph */
+ ["\u548E", "\u548E"], /* CJK Ideograph */
+ ["\u548F", "\u548F"], /* CJK Ideograph */
+ ["\u5490", "\u5490"], /* CJK Ideograph */
+ ["\u5491", "\u5491"], /* CJK Ideograph */
+ ["\u5492", "\u5492"], /* CJK Ideograph */
+ ["\u5493", "\u5493"], /* CJK Ideograph */
+ ["\u5494", "\u5494"], /* CJK Ideograph */
+ ["\u5495", "\u5495"], /* CJK Ideograph */
+ ["\u5496", "\u5496"], /* CJK Ideograph */
+ ["\u5497", "\u5497"], /* CJK Ideograph */
+ ["\u5498", "\u5498"], /* CJK Ideograph */
+ ["\u5499", "\u5499"], /* CJK Ideograph */
+ ["\u549A", "\u549A"], /* CJK Ideograph */
+ ["\u549B", "\u549B"], /* CJK Ideograph */
+ ["\u549C", "\u549C"], /* CJK Ideograph */
+ ["\u549D", "\u549D"], /* CJK Ideograph */
+ ["\u549E", "\u549E"], /* CJK Ideograph */
+ ["\u549F", "\u549F"], /* CJK Ideograph */
+ ["\u54A0", "\u54A0"], /* CJK Ideograph */
+ ["\u54A1", "\u54A1"], /* CJK Ideograph */
+ ["\u54A2", "\u54A2"], /* CJK Ideograph */
+ ["\u54A3", "\u54A3"], /* CJK Ideograph */
+ ["\u54A4", "\u54A4"], /* CJK Ideograph */
+ ["\u54A5", "\u54A5"], /* CJK Ideograph */
+ ["\u54A6", "\u54A6"], /* CJK Ideograph */
+ ["\u54A7", "\u54A7"], /* CJK Ideograph */
+ ["\u54A8", "\u54A8"], /* CJK Ideograph */
+ ["\u54A9", "\u54A9"], /* CJK Ideograph */
+ ["\u54AA", "\u54AA"], /* CJK Ideograph */
+ ["\u54AB", "\u54AB"], /* CJK Ideograph */
+ ["\u54AC", "\u54AC"], /* CJK Ideograph */
+ ["\u54AD", "\u54AD"], /* CJK Ideograph */
+ ["\u54AE", "\u54AE"], /* CJK Ideograph */
+ ["\u54AF", "\u54AF"], /* CJK Ideograph */
+ ["\u54B0", "\u54B0"], /* CJK Ideograph */
+ ["\u54B1", "\u54B1"], /* CJK Ideograph */
+ ["\u54B2", "\u54B2"], /* CJK Ideograph */
+ ["\u54B3", "\u54B3"], /* CJK Ideograph */
+ ["\u54B4", "\u54B4"], /* CJK Ideograph */
+ ["\u54B5", "\u54B5"], /* CJK Ideograph */
+ ["\u54B6", "\u54B6"], /* CJK Ideograph */
+ ["\u54B7", "\u54B7"], /* CJK Ideograph */
+ ["\u54B8", "\u54B8"], /* CJK Ideograph */
+ ["\u54B9", "\u54B9"], /* CJK Ideograph */
+ ["\u54BA", "\u54BA"], /* CJK Ideograph */
+ ["\u54BB", "\u54BB"], /* CJK Ideograph */
+ ["\u54BC", "\u54BC"], /* CJK Ideograph */
+ ["\u54BD", "\u54BD"], /* CJK Ideograph */
+ ["\u54BE", "\u54BE"], /* CJK Ideograph */
+ ["\u54BF", "\u54BF"], /* CJK Ideograph */
+ ["\u54C0", "\u54C0"], /* CJK Ideograph */
+ ["\u54C1", "\u54C1"], /* CJK Ideograph */
+ ["\u54C2", "\u54C2"], /* CJK Ideograph */
+ ["\u54C3", "\u54C3"], /* CJK Ideograph */
+ ["\u54C4", "\u54C4"], /* CJK Ideograph */
+ ["\u54C5", "\u54C5"], /* CJK Ideograph */
+ ["\u54C6", "\u54C6"], /* CJK Ideograph */
+ ["\u54C7", "\u54C7"], /* CJK Ideograph */
+ ["\u54C8", "\u54C8"], /* CJK Ideograph */
+ ["\u54C9", "\u54C9"], /* CJK Ideograph */
+ ["\u54CA", "\u54CA"], /* CJK Ideograph */
+ ["\u54CB", "\u54CB"], /* CJK Ideograph */
+ ["\u54CC", "\u54CC"], /* CJK Ideograph */
+ ["\u54CD", "\u54CD"], /* CJK Ideograph */
+ ["\u54CE", "\u54CE"], /* CJK Ideograph */
+ ["\u54CF", "\u54CF"], /* CJK Ideograph */
+ ["\u54D0", "\u54D0"], /* CJK Ideograph */
+ ["\u54D1", "\u54D1"], /* CJK Ideograph */
+ ["\u54D2", "\u54D2"], /* CJK Ideograph */
+ ["\u54D3", "\u54D3"], /* CJK Ideograph */
+ ["\u54D4", "\u54D4"], /* CJK Ideograph */
+ ["\u54D5", "\u54D5"], /* CJK Ideograph */
+ ["\u54D6", "\u54D6"], /* CJK Ideograph */
+ ["\u54D7", "\u54D7"], /* CJK Ideograph */
+ ["\u54D8", "\u54D8"], /* CJK Ideograph */
+ ["\u54D9", "\u54D9"], /* CJK Ideograph */
+ ["\u54DA", "\u54DA"], /* CJK Ideograph */
+ ["\u54DB", "\u54DB"], /* CJK Ideograph */
+ ["\u54DC", "\u54DC"], /* CJK Ideograph */
+ ["\u54DD", "\u54DD"], /* CJK Ideograph */
+ ["\u54DE", "\u54DE"], /* CJK Ideograph */
+ ["\u54DF", "\u54DF"], /* CJK Ideograph */
+ ["\u54E0", "\u54E0"], /* CJK Ideograph */
+ ["\u54E1", "\u54E1"], /* CJK Ideograph */
+ ["\u54E2", "\u54E2"], /* CJK Ideograph */
+ ["\u54E3", "\u54E3"], /* CJK Ideograph */
+ ["\u54E4", "\u54E4"], /* CJK Ideograph */
+ ["\u54E5", "\u54E5"], /* CJK Ideograph */
+ ["\u54E6", "\u54E6"], /* CJK Ideograph */
+ ["\u54E7", "\u54E7"], /* CJK Ideograph */
+ ["\u54E8", "\u54E8"], /* CJK Ideograph */
+ ["\u54E9", "\u54E9"], /* CJK Ideograph */
+ ["\u54EA", "\u54EA"], /* CJK Ideograph */
+ ["\u54EB", "\u54EB"], /* CJK Ideograph */
+ ["\u54EC", "\u54EC"], /* CJK Ideograph */
+ ["\u54ED", "\u54ED"], /* CJK Ideograph */
+ ["\u54EE", "\u54EE"], /* CJK Ideograph */
+ ["\u54EF", "\u54EF"], /* CJK Ideograph */
+ ["\u54F0", "\u54F0"], /* CJK Ideograph */
+ ["\u54F1", "\u54F1"], /* CJK Ideograph */
+ ["\u54F2", "\u54F2"], /* CJK Ideograph */
+ ["\u54F3", "\u54F3"], /* CJK Ideograph */
+ ["\u54F4", "\u54F4"], /* CJK Ideograph */
+ ["\u54F5", "\u54F5"], /* CJK Ideograph */
+ ["\u54F6", "\u54F6"], /* CJK Ideograph */
+ ["\u54F7", "\u54F7"], /* CJK Ideograph */
+ ["\u54F8", "\u54F8"], /* CJK Ideograph */
+ ["\u54F9", "\u54F9"], /* CJK Ideograph */
+ ["\u54FA", "\u54FA"], /* CJK Ideograph */
+ ["\u54FB", "\u54FB"], /* CJK Ideograph */
+ ["\u54FC", "\u54FC"], /* CJK Ideograph */
+ ["\u54FD", "\u54FD"], /* CJK Ideograph */
+ ["\u54FE", "\u54FE"], /* CJK Ideograph */
+ ["\u54FF", "\u54FF"], /* CJK Ideograph */
+ ["\u5500", "\u5500"], /* CJK Ideograph */
+ ["\u5501", "\u5501"], /* CJK Ideograph */
+ ["\u5502", "\u5502"], /* CJK Ideograph */
+ ["\u5503", "\u5503"], /* CJK Ideograph */
+ ["\u5504", "\u5504"], /* CJK Ideograph */
+ ["\u5505", "\u5505"], /* CJK Ideograph */
+ ["\u5506", "\u5506"], /* CJK Ideograph */
+ ["\u5507", "\u5507"], /* CJK Ideograph */
+ ["\u5508", "\u5508"], /* CJK Ideograph */
+ ["\u5509", "\u5509"], /* CJK Ideograph */
+ ["\u550A", "\u550A"], /* CJK Ideograph */
+ ["\u550B", "\u550B"], /* CJK Ideograph */
+ ["\u550C", "\u550C"], /* CJK Ideograph */
+ ["\u550D", "\u550D"], /* CJK Ideograph */
+ ["\u550E", "\u550E"], /* CJK Ideograph */
+ ["\u550F", "\u550F"], /* CJK Ideograph */
+ ["\u5510", "\u5510"], /* CJK Ideograph */
+ ["\u5511", "\u5511"], /* CJK Ideograph */
+ ["\u5512", "\u5512"], /* CJK Ideograph */
+ ["\u5513", "\u5513"], /* CJK Ideograph */
+ ["\u5514", "\u5514"], /* CJK Ideograph */
+ ["\u5515", "\u5515"], /* CJK Ideograph */
+ ["\u5516", "\u5516"], /* CJK Ideograph */
+ ["\u5517", "\u5517"], /* CJK Ideograph */
+ ["\u5518", "\u5518"], /* CJK Ideograph */
+ ["\u5519", "\u5519"], /* CJK Ideograph */
+ ["\u551A", "\u551A"], /* CJK Ideograph */
+ ["\u551B", "\u551B"], /* CJK Ideograph */
+ ["\u551C", "\u551C"], /* CJK Ideograph */
+ ["\u551D", "\u551D"], /* CJK Ideograph */
+ ["\u551E", "\u551E"], /* CJK Ideograph */
+ ["\u551F", "\u551F"], /* CJK Ideograph */
+ ["\u5520", "\u5520"], /* CJK Ideograph */
+ ["\u5521", "\u5521"], /* CJK Ideograph */
+ ["\u5522", "\u5522"], /* CJK Ideograph */
+ ["\u5523", "\u5523"], /* CJK Ideograph */
+ ["\u5524", "\u5524"], /* CJK Ideograph */
+ ["\u5525", "\u5525"], /* CJK Ideograph */
+ ["\u5526", "\u5526"], /* CJK Ideograph */
+ ["\u5527", "\u5527"], /* CJK Ideograph */
+ ["\u5528", "\u5528"], /* CJK Ideograph */
+ ["\u5529", "\u5529"], /* CJK Ideograph */
+ ["\u552A", "\u552A"], /* CJK Ideograph */
+ ["\u552B", "\u552B"], /* CJK Ideograph */
+ ["\u552C", "\u552C"], /* CJK Ideograph */
+ ["\u552D", "\u552D"], /* CJK Ideograph */
+ ["\u552E", "\u552E"], /* CJK Ideograph */
+ ["\u552F", "\u552F"], /* CJK Ideograph */
+ ["\u5530", "\u5530"], /* CJK Ideograph */
+ ["\u5531", "\u5531"], /* CJK Ideograph */
+ ["\u5532", "\u5532"], /* CJK Ideograph */
+ ["\u5533", "\u5533"], /* CJK Ideograph */
+ ["\u5534", "\u5534"], /* CJK Ideograph */
+ ["\u5535", "\u5535"], /* CJK Ideograph */
+ ["\u5536", "\u5536"], /* CJK Ideograph */
+ ["\u5537", "\u5537"], /* CJK Ideograph */
+ ["\u5538", "\u5538"], /* CJK Ideograph */
+ ["\u5539", "\u5539"], /* CJK Ideograph */
+ ["\u553A", "\u553A"], /* CJK Ideograph */
+ ["\u553B", "\u553B"], /* CJK Ideograph */
+ ["\u553C", "\u553C"], /* CJK Ideograph */
+ ["\u553D", "\u553D"], /* CJK Ideograph */
+ ["\u553E", "\u553E"], /* CJK Ideograph */
+ ["\u553F", "\u553F"], /* CJK Ideograph */
+ ["\u5540", "\u5540"], /* CJK Ideograph */
+ ["\u5541", "\u5541"], /* CJK Ideograph */
+ ["\u5542", "\u5542"], /* CJK Ideograph */
+ ["\u5543", "\u5543"], /* CJK Ideograph */
+ ["\u5544", "\u5544"], /* CJK Ideograph */
+ ["\u5545", "\u5545"], /* CJK Ideograph */
+ ["\u5546", "\u5546"], /* CJK Ideograph */
+ ["\u5547", "\u5547"], /* CJK Ideograph */
+ ["\u5548", "\u5548"], /* CJK Ideograph */
+ ["\u5549", "\u5549"], /* CJK Ideograph */
+ ["\u554A", "\u554A"], /* CJK Ideograph */
+ ["\u554B", "\u554B"], /* CJK Ideograph */
+ ["\u554C", "\u554C"], /* CJK Ideograph */
+ ["\u554D", "\u554D"], /* CJK Ideograph */
+ ["\u554E", "\u554E"], /* CJK Ideograph */
+ ["\u554F", "\u554F"], /* CJK Ideograph */
+ ["\u5550", "\u5550"], /* CJK Ideograph */
+ ["\u5551", "\u5551"], /* CJK Ideograph */
+ ["\u5552", "\u5552"], /* CJK Ideograph */
+ ["\u5553", "\u5553"], /* CJK Ideograph */
+ ["\u5554", "\u5554"], /* CJK Ideograph */
+ ["\u5555", "\u5555"], /* CJK Ideograph */
+ ["\u5556", "\u5556"], /* CJK Ideograph */
+ ["\u5557", "\u5557"], /* CJK Ideograph */
+ ["\u5558", "\u5558"], /* CJK Ideograph */
+ ["\u5559", "\u5559"], /* CJK Ideograph */
+ ["\u555A", "\u555A"], /* CJK Ideograph */
+ ["\u555B", "\u555B"], /* CJK Ideograph */
+ ["\u555C", "\u555C"], /* CJK Ideograph */
+ ["\u555D", "\u555D"], /* CJK Ideograph */
+ ["\u555E", "\u555E"], /* CJK Ideograph */
+ ["\u555F", "\u555F"], /* CJK Ideograph */
+ ["\u5560", "\u5560"], /* CJK Ideograph */
+ ["\u5561", "\u5561"], /* CJK Ideograph */
+ ["\u5562", "\u5562"], /* CJK Ideograph */
+ ["\u5563", "\u5563"], /* CJK Ideograph */
+ ["\u5564", "\u5564"], /* CJK Ideograph */
+ ["\u5565", "\u5565"], /* CJK Ideograph */
+ ["\u5566", "\u5566"], /* CJK Ideograph */
+ ["\u5567", "\u5567"], /* CJK Ideograph */
+ ["\u5568", "\u5568"], /* CJK Ideograph */
+ ["\u5569", "\u5569"], /* CJK Ideograph */
+ ["\u556A", "\u556A"], /* CJK Ideograph */
+ ["\u556B", "\u556B"], /* CJK Ideograph */
+ ["\u556C", "\u556C"], /* CJK Ideograph */
+ ["\u556D", "\u556D"], /* CJK Ideograph */
+ ["\u556E", "\u556E"], /* CJK Ideograph */
+ ["\u556F", "\u556F"], /* CJK Ideograph */
+ ["\u5570", "\u5570"], /* CJK Ideograph */
+ ["\u5571", "\u5571"], /* CJK Ideograph */
+ ["\u5572", "\u5572"], /* CJK Ideograph */
+ ["\u5573", "\u5573"], /* CJK Ideograph */
+ ["\u5574", "\u5574"], /* CJK Ideograph */
+ ["\u5575", "\u5575"], /* CJK Ideograph */
+ ["\u5576", "\u5576"], /* CJK Ideograph */
+ ["\u5577", "\u5577"], /* CJK Ideograph */
+ ["\u5578", "\u5578"], /* CJK Ideograph */
+ ["\u5579", "\u5579"], /* CJK Ideograph */
+ ["\u557A", "\u557A"], /* CJK Ideograph */
+ ["\u557B", "\u557B"], /* CJK Ideograph */
+ ["\u557C", "\u557C"], /* CJK Ideograph */
+ ["\u557D", "\u557D"], /* CJK Ideograph */
+ ["\u557E", "\u557E"], /* CJK Ideograph */
+ ["\u557F", "\u557F"], /* CJK Ideograph */
+ ["\u5580", "\u5580"], /* CJK Ideograph */
+ ["\u5581", "\u5581"], /* CJK Ideograph */
+ ["\u5582", "\u5582"], /* CJK Ideograph */
+ ["\u5583", "\u5583"], /* CJK Ideograph */
+ ["\u5584", "\u5584"], /* CJK Ideograph */
+ ["\u5585", "\u5585"], /* CJK Ideograph */
+ ["\u5586", "\u5586"], /* CJK Ideograph */
+ ["\u5587", "\u5587"], /* CJK Ideograph */
+ ["\u5588", "\u5588"], /* CJK Ideograph */
+ ["\u5589", "\u5589"], /* CJK Ideograph */
+ ["\u558A", "\u558A"], /* CJK Ideograph */
+ ["\u558B", "\u558B"], /* CJK Ideograph */
+ ["\u558C", "\u558C"], /* CJK Ideograph */
+ ["\u558D", "\u558D"], /* CJK Ideograph */
+ ["\u558E", "\u558E"], /* CJK Ideograph */
+ ["\u558F", "\u558F"], /* CJK Ideograph */
+ ["\u5590", "\u5590"], /* CJK Ideograph */
+ ["\u5591", "\u5591"], /* CJK Ideograph */
+ ["\u5592", "\u5592"], /* CJK Ideograph */
+ ["\u5593", "\u5593"], /* CJK Ideograph */
+ ["\u5594", "\u5594"], /* CJK Ideograph */
+ ["\u5595", "\u5595"], /* CJK Ideograph */
+ ["\u5596", "\u5596"], /* CJK Ideograph */
+ ["\u5597", "\u5597"], /* CJK Ideograph */
+ ["\u5598", "\u5598"], /* CJK Ideograph */
+ ["\u5599", "\u5599"], /* CJK Ideograph */
+ ["\u559A", "\u559A"], /* CJK Ideograph */
+ ["\u559B", "\u559B"], /* CJK Ideograph */
+ ["\u559C", "\u559C"], /* CJK Ideograph */
+ ["\u559D", "\u559D"], /* CJK Ideograph */
+ ["\u559E", "\u559E"], /* CJK Ideograph */
+ ["\u559F", "\u559F"], /* CJK Ideograph */
+ ["\u55A0", "\u55A0"], /* CJK Ideograph */
+ ["\u55A1", "\u55A1"], /* CJK Ideograph */
+ ["\u55A2", "\u55A2"], /* CJK Ideograph */
+ ["\u55A3", "\u55A3"], /* CJK Ideograph */
+ ["\u55A4", "\u55A4"], /* CJK Ideograph */
+ ["\u55A5", "\u55A5"], /* CJK Ideograph */
+ ["\u55A6", "\u55A6"], /* CJK Ideograph */
+ ["\u55A7", "\u55A7"], /* CJK Ideograph */
+ ["\u55A8", "\u55A8"], /* CJK Ideograph */
+ ["\u55A9", "\u55A9"], /* CJK Ideograph */
+ ["\u55AA", "\u55AA"], /* CJK Ideograph */
+ ["\u55AB", "\u55AB"], /* CJK Ideograph */
+ ["\u55AC", "\u55AC"], /* CJK Ideograph */
+ ["\u55AD", "\u55AD"], /* CJK Ideograph */
+ ["\u55AE", "\u55AE"], /* CJK Ideograph */
+ ["\u55AF", "\u55AF"], /* CJK Ideograph */
+ ["\u55B0", "\u55B0"], /* CJK Ideograph */
+ ["\u55B1", "\u55B1"], /* CJK Ideograph */
+ ["\u55B2", "\u55B2"], /* CJK Ideograph */
+ ["\u55B3", "\u55B3"], /* CJK Ideograph */
+ ["\u55B4", "\u55B4"], /* CJK Ideograph */
+ ["\u55B5", "\u55B5"], /* CJK Ideograph */
+ ["\u55B6", "\u55B6"], /* CJK Ideograph */
+ ["\u55B7", "\u55B7"], /* CJK Ideograph */
+ ["\u55B8", "\u55B8"], /* CJK Ideograph */
+ ["\u55B9", "\u55B9"], /* CJK Ideograph */
+ ["\u55BA", "\u55BA"], /* CJK Ideograph */
+ ["\u55BB", "\u55BB"], /* CJK Ideograph */
+ ["\u55BC", "\u55BC"], /* CJK Ideograph */
+ ["\u55BD", "\u55BD"], /* CJK Ideograph */
+ ["\u55BE", "\u55BE"], /* CJK Ideograph */
+ ["\u55BF", "\u55BF"], /* CJK Ideograph */
+ ["\u55C0", "\u55C0"], /* CJK Ideograph */
+ ["\u55C1", "\u55C1"], /* CJK Ideograph */
+ ["\u55C2", "\u55C2"], /* CJK Ideograph */
+ ["\u55C3", "\u55C3"], /* CJK Ideograph */
+ ["\u55C4", "\u55C4"], /* CJK Ideograph */
+ ["\u55C5", "\u55C5"], /* CJK Ideograph */
+ ["\u55C6", "\u55C6"], /* CJK Ideograph */
+ ["\u55C7", "\u55C7"], /* CJK Ideograph */
+ ["\u55C8", "\u55C8"], /* CJK Ideograph */
+ ["\u55C9", "\u55C9"], /* CJK Ideograph */
+ ["\u55CA", "\u55CA"], /* CJK Ideograph */
+ ["\u55CB", "\u55CB"], /* CJK Ideograph */
+ ["\u55CC", "\u55CC"], /* CJK Ideograph */
+ ["\u55CD", "\u55CD"], /* CJK Ideograph */
+ ["\u55CE", "\u55CE"], /* CJK Ideograph */
+ ["\u55CF", "\u55CF"], /* CJK Ideograph */
+ ["\u55D0", "\u55D0"], /* CJK Ideograph */
+ ["\u55D1", "\u55D1"], /* CJK Ideograph */
+ ["\u55D2", "\u55D2"], /* CJK Ideograph */
+ ["\u55D3", "\u55D3"], /* CJK Ideograph */
+ ["\u55D4", "\u55D4"], /* CJK Ideograph */
+ ["\u55D5", "\u55D5"], /* CJK Ideograph */
+ ["\u55D6", "\u55D6"], /* CJK Ideograph */
+ ["\u55D7", "\u55D7"], /* CJK Ideograph */
+ ["\u55D8", "\u55D8"], /* CJK Ideograph */
+ ["\u55D9", "\u55D9"], /* CJK Ideograph */
+ ["\u55DA", "\u55DA"], /* CJK Ideograph */
+ ["\u55DB", "\u55DB"], /* CJK Ideograph */
+ ["\u55DC", "\u55DC"], /* CJK Ideograph */
+ ["\u55DD", "\u55DD"], /* CJK Ideograph */
+ ["\u55DE", "\u55DE"], /* CJK Ideograph */
+ ["\u55DF", "\u55DF"], /* CJK Ideograph */
+ ["\u55E0", "\u55E0"], /* CJK Ideograph */
+ ["\u55E1", "\u55E1"], /* CJK Ideograph */
+ ["\u55E2", "\u55E2"], /* CJK Ideograph */
+ ["\u55E3", "\u55E3"], /* CJK Ideograph */
+ ["\u55E4", "\u55E4"], /* CJK Ideograph */
+ ["\u55E5", "\u55E5"], /* CJK Ideograph */
+ ["\u55E6", "\u55E6"], /* CJK Ideograph */
+ ["\u55E7", "\u55E7"], /* CJK Ideograph */
+ ["\u55E8", "\u55E8"], /* CJK Ideograph */
+ ["\u55E9", "\u55E9"], /* CJK Ideograph */
+ ["\u55EA", "\u55EA"], /* CJK Ideograph */
+ ["\u55EB", "\u55EB"], /* CJK Ideograph */
+ ["\u55EC", "\u55EC"], /* CJK Ideograph */
+ ["\u55ED", "\u55ED"], /* CJK Ideograph */
+ ["\u55EE", "\u55EE"], /* CJK Ideograph */
+ ["\u55EF", "\u55EF"], /* CJK Ideograph */
+ ["\u55F0", "\u55F0"], /* CJK Ideograph */
+ ["\u55F1", "\u55F1"], /* CJK Ideograph */
+ ["\u55F2", "\u55F2"], /* CJK Ideograph */
+ ["\u55F3", "\u55F3"], /* CJK Ideograph */
+ ["\u55F4", "\u55F4"], /* CJK Ideograph */
+ ["\u55F5", "\u55F5"], /* CJK Ideograph */
+ ["\u55F6", "\u55F6"], /* CJK Ideograph */
+ ["\u55F7", "\u55F7"], /* CJK Ideograph */
+ ["\u55F8", "\u55F8"], /* CJK Ideograph */
+ ["\u55F9", "\u55F9"], /* CJK Ideograph */
+ ["\u55FA", "\u55FA"], /* CJK Ideograph */
+ ["\u55FB", "\u55FB"], /* CJK Ideograph */
+ ["\u55FC", "\u55FC"], /* CJK Ideograph */
+ ["\u55FD", "\u55FD"], /* CJK Ideograph */
+ ["\u55FE", "\u55FE"], /* CJK Ideograph */
+ ["\u55FF", "\u55FF"], /* CJK Ideograph */
+ ["\u5600", "\u5600"], /* CJK Ideograph */
+ ["\u5601", "\u5601"], /* CJK Ideograph */
+ ["\u5602", "\u5602"], /* CJK Ideograph */
+ ["\u5603", "\u5603"], /* CJK Ideograph */
+ ["\u5604", "\u5604"], /* CJK Ideograph */
+ ["\u5605", "\u5605"], /* CJK Ideograph */
+ ["\u5606", "\u5606"], /* CJK Ideograph */
+ ["\u5607", "\u5607"], /* CJK Ideograph */
+ ["\u5608", "\u5608"], /* CJK Ideograph */
+ ["\u5609", "\u5609"], /* CJK Ideograph */
+ ["\u560A", "\u560A"], /* CJK Ideograph */
+ ["\u560B", "\u560B"], /* CJK Ideograph */
+ ["\u560C", "\u560C"], /* CJK Ideograph */
+ ["\u560D", "\u560D"], /* CJK Ideograph */
+ ["\u560E", "\u560E"], /* CJK Ideograph */
+ ["\u560F", "\u560F"], /* CJK Ideograph */
+ ["\u5610", "\u5610"], /* CJK Ideograph */
+ ["\u5611", "\u5611"], /* CJK Ideograph */
+ ["\u5612", "\u5612"], /* CJK Ideograph */
+ ["\u5613", "\u5613"], /* CJK Ideograph */
+ ["\u5614", "\u5614"], /* CJK Ideograph */
+ ["\u5615", "\u5615"], /* CJK Ideograph */
+ ["\u5616", "\u5616"], /* CJK Ideograph */
+ ["\u5617", "\u5617"], /* CJK Ideograph */
+ ["\u5618", "\u5618"], /* CJK Ideograph */
+ ["\u5619", "\u5619"], /* CJK Ideograph */
+ ["\u561A", "\u561A"], /* CJK Ideograph */
+ ["\u561B", "\u561B"], /* CJK Ideograph */
+ ["\u561C", "\u561C"], /* CJK Ideograph */
+ ["\u561D", "\u561D"], /* CJK Ideograph */
+ ["\u561E", "\u561E"], /* CJK Ideograph */
+ ["\u561F", "\u561F"], /* CJK Ideograph */
+ ["\u5620", "\u5620"], /* CJK Ideograph */
+ ["\u5621", "\u5621"], /* CJK Ideograph */
+ ["\u5622", "\u5622"], /* CJK Ideograph */
+ ["\u5623", "\u5623"], /* CJK Ideograph */
+ ["\u5624", "\u5624"], /* CJK Ideograph */
+ ["\u5625", "\u5625"], /* CJK Ideograph */
+ ["\u5626", "\u5626"], /* CJK Ideograph */
+ ["\u5627", "\u5627"], /* CJK Ideograph */
+ ["\u5628", "\u5628"], /* CJK Ideograph */
+ ["\u5629", "\u5629"], /* CJK Ideograph */
+ ["\u562A", "\u562A"], /* CJK Ideograph */
+ ["\u562B", "\u562B"], /* CJK Ideograph */
+ ["\u562C", "\u562C"], /* CJK Ideograph */
+ ["\u562D", "\u562D"], /* CJK Ideograph */
+ ["\u562E", "\u562E"], /* CJK Ideograph */
+ ["\u562F", "\u562F"], /* CJK Ideograph */
+ ["\u5630", "\u5630"], /* CJK Ideograph */
+ ["\u5631", "\u5631"], /* CJK Ideograph */
+ ["\u5632", "\u5632"], /* CJK Ideograph */
+ ["\u5633", "\u5633"], /* CJK Ideograph */
+ ["\u5634", "\u5634"], /* CJK Ideograph */
+ ["\u5635", "\u5635"], /* CJK Ideograph */
+ ["\u5636", "\u5636"], /* CJK Ideograph */
+ ["\u5637", "\u5637"], /* CJK Ideograph */
+ ["\u5638", "\u5638"], /* CJK Ideograph */
+ ["\u5639", "\u5639"], /* CJK Ideograph */
+ ["\u563A", "\u563A"], /* CJK Ideograph */
+ ["\u563B", "\u563B"], /* CJK Ideograph */
+ ["\u563C", "\u563C"], /* CJK Ideograph */
+ ["\u563D", "\u563D"], /* CJK Ideograph */
+ ["\u563E", "\u563E"], /* CJK Ideograph */
+ ["\u563F", "\u563F"], /* CJK Ideograph */
+ ["\u5640", "\u5640"], /* CJK Ideograph */
+ ["\u5641", "\u5641"], /* CJK Ideograph */
+ ["\u5642", "\u5642"], /* CJK Ideograph */
+ ["\u5643", "\u5643"], /* CJK Ideograph */
+ ["\u5644", "\u5644"], /* CJK Ideograph */
+ ["\u5645", "\u5645"], /* CJK Ideograph */
+ ["\u5646", "\u5646"], /* CJK Ideograph */
+ ["\u5647", "\u5647"], /* CJK Ideograph */
+ ["\u5648", "\u5648"], /* CJK Ideograph */
+ ["\u5649", "\u5649"], /* CJK Ideograph */
+ ["\u564A", "\u564A"], /* CJK Ideograph */
+ ["\u564B", "\u564B"], /* CJK Ideograph */
+ ["\u564C", "\u564C"], /* CJK Ideograph */
+ ["\u564D", "\u564D"], /* CJK Ideograph */
+ ["\u564E", "\u564E"], /* CJK Ideograph */
+ ["\u564F", "\u564F"], /* CJK Ideograph */
+ ["\u5650", "\u5650"], /* CJK Ideograph */
+ ["\u5651", "\u5651"], /* CJK Ideograph */
+ ["\u5652", "\u5652"], /* CJK Ideograph */
+ ["\u5653", "\u5653"], /* CJK Ideograph */
+ ["\u5654", "\u5654"], /* CJK Ideograph */
+ ["\u5655", "\u5655"], /* CJK Ideograph */
+ ["\u5656", "\u5656"], /* CJK Ideograph */
+ ["\u5657", "\u5657"], /* CJK Ideograph */
+ ["\u5658", "\u5658"], /* CJK Ideograph */
+ ["\u5659", "\u5659"], /* CJK Ideograph */
+ ["\u565A", "\u565A"], /* CJK Ideograph */
+ ["\u565B", "\u565B"], /* CJK Ideograph */
+ ["\u565C", "\u565C"], /* CJK Ideograph */
+ ["\u565D", "\u565D"], /* CJK Ideograph */
+ ["\u565E", "\u565E"], /* CJK Ideograph */
+ ["\u565F", "\u565F"], /* CJK Ideograph */
+ ["\u5660", "\u5660"], /* CJK Ideograph */
+ ["\u5661", "\u5661"], /* CJK Ideograph */
+ ["\u5662", "\u5662"], /* CJK Ideograph */
+ ["\u5663", "\u5663"], /* CJK Ideograph */
+ ["\u5664", "\u5664"], /* CJK Ideograph */
+ ["\u5665", "\u5665"], /* CJK Ideograph */
+ ["\u5666", "\u5666"], /* CJK Ideograph */
+ ["\u5667", "\u5667"], /* CJK Ideograph */
+ ["\u5668", "\u5668"], /* CJK Ideograph */
+ ["\u5669", "\u5669"], /* CJK Ideograph */
+ ["\u566A", "\u566A"], /* CJK Ideograph */
+ ["\u566B", "\u566B"], /* CJK Ideograph */
+ ["\u566C", "\u566C"], /* CJK Ideograph */
+ ["\u566D", "\u566D"], /* CJK Ideograph */
+ ["\u566E", "\u566E"], /* CJK Ideograph */
+ ["\u566F", "\u566F"], /* CJK Ideograph */
+ ["\u5670", "\u5670"], /* CJK Ideograph */
+ ["\u5671", "\u5671"], /* CJK Ideograph */
+ ["\u5672", "\u5672"], /* CJK Ideograph */
+ ["\u5673", "\u5673"], /* CJK Ideograph */
+ ["\u5674", "\u5674"], /* CJK Ideograph */
+ ["\u5675", "\u5675"], /* CJK Ideograph */
+ ["\u5676", "\u5676"], /* CJK Ideograph */
+ ["\u5677", "\u5677"], /* CJK Ideograph */
+ ["\u5678", "\u5678"], /* CJK Ideograph */
+ ["\u5679", "\u5679"], /* CJK Ideograph */
+ ["\u567A", "\u567A"], /* CJK Ideograph */
+ ["\u567B", "\u567B"], /* CJK Ideograph */
+ ["\u567C", "\u567C"], /* CJK Ideograph */
+ ["\u567D", "\u567D"], /* CJK Ideograph */
+ ["\u567E", "\u567E"], /* CJK Ideograph */
+ ["\u567F", "\u567F"], /* CJK Ideograph */
+ ["\u5680", "\u5680"], /* CJK Ideograph */
+ ["\u5681", "\u5681"], /* CJK Ideograph */
+ ["\u5682", "\u5682"], /* CJK Ideograph */
+ ["\u5683", "\u5683"], /* CJK Ideograph */
+ ["\u5684", "\u5684"], /* CJK Ideograph */
+ ["\u5685", "\u5685"], /* CJK Ideograph */
+ ["\u5686", "\u5686"], /* CJK Ideograph */
+ ["\u5687", "\u5687"], /* CJK Ideograph */
+ ["\u5688", "\u5688"], /* CJK Ideograph */
+ ["\u5689", "\u5689"], /* CJK Ideograph */
+ ["\u568A", "\u568A"], /* CJK Ideograph */
+ ["\u568B", "\u568B"], /* CJK Ideograph */
+ ["\u568C", "\u568C"], /* CJK Ideograph */
+ ["\u568D", "\u568D"], /* CJK Ideograph */
+ ["\u568E", "\u568E"], /* CJK Ideograph */
+ ["\u568F", "\u568F"], /* CJK Ideograph */
+ ["\u5690", "\u5690"], /* CJK Ideograph */
+ ["\u5691", "\u5691"], /* CJK Ideograph */
+ ["\u5692", "\u5692"], /* CJK Ideograph */
+ ["\u5693", "\u5693"], /* CJK Ideograph */
+ ["\u5694", "\u5694"], /* CJK Ideograph */
+ ["\u5695", "\u5695"], /* CJK Ideograph */
+ ["\u5696", "\u5696"], /* CJK Ideograph */
+ ["\u5697", "\u5697"], /* CJK Ideograph */
+ ["\u5698", "\u5698"], /* CJK Ideograph */
+ ["\u5699", "\u5699"], /* CJK Ideograph */
+ ["\u569A", "\u569A"], /* CJK Ideograph */
+ ["\u569B", "\u569B"], /* CJK Ideograph */
+ ["\u569C", "\u569C"], /* CJK Ideograph */
+ ["\u569D", "\u569D"], /* CJK Ideograph */
+ ["\u569E", "\u569E"], /* CJK Ideograph */
+ ["\u569F", "\u569F"], /* CJK Ideograph */
+ ["\u56A0", "\u56A0"], /* CJK Ideograph */
+ ["\u56A1", "\u56A1"], /* CJK Ideograph */
+ ["\u56A2", "\u56A2"], /* CJK Ideograph */
+ ["\u56A3", "\u56A3"], /* CJK Ideograph */
+ ["\u56A4", "\u56A4"], /* CJK Ideograph */
+ ["\u56A5", "\u56A5"], /* CJK Ideograph */
+ ["\u56A6", "\u56A6"], /* CJK Ideograph */
+ ["\u56A7", "\u56A7"], /* CJK Ideograph */
+ ["\u56A8", "\u56A8"], /* CJK Ideograph */
+ ["\u56A9", "\u56A9"], /* CJK Ideograph */
+ ["\u56AA", "\u56AA"], /* CJK Ideograph */
+ ["\u56AB", "\u56AB"], /* CJK Ideograph */
+ ["\u56AC", "\u56AC"], /* CJK Ideograph */
+ ["\u56AD", "\u56AD"], /* CJK Ideograph */
+ ["\u56AE", "\u56AE"], /* CJK Ideograph */
+ ["\u56AF", "\u56AF"], /* CJK Ideograph */
+ ["\u56B0", "\u56B0"], /* CJK Ideograph */
+ ["\u56B1", "\u56B1"], /* CJK Ideograph */
+ ["\u56B2", "\u56B2"], /* CJK Ideograph */
+ ["\u56B3", "\u56B3"], /* CJK Ideograph */
+ ["\u56B4", "\u56B4"], /* CJK Ideograph */
+ ["\u56B5", "\u56B5"], /* CJK Ideograph */
+ ["\u56B6", "\u56B6"], /* CJK Ideograph */
+ ["\u56B7", "\u56B7"], /* CJK Ideograph */
+ ["\u56B8", "\u56B8"], /* CJK Ideograph */
+ ["\u56B9", "\u56B9"], /* CJK Ideograph */
+ ["\u56BA", "\u56BA"], /* CJK Ideograph */
+ ["\u56BB", "\u56BB"], /* CJK Ideograph */
+ ["\u56BC", "\u56BC"], /* CJK Ideograph */
+ ["\u56BD", "\u56BD"], /* CJK Ideograph */
+ ["\u56BE", "\u56BE"], /* CJK Ideograph */
+ ["\u56BF", "\u56BF"], /* CJK Ideograph */
+ ["\u56C0", "\u56C0"], /* CJK Ideograph */
+ ["\u56C1", "\u56C1"], /* CJK Ideograph */
+ ["\u56C2", "\u56C2"], /* CJK Ideograph */
+ ["\u56C3", "\u56C3"], /* CJK Ideograph */
+ ["\u56C4", "\u56C4"], /* CJK Ideograph */
+ ["\u56C5", "\u56C5"], /* CJK Ideograph */
+ ["\u56C6", "\u56C6"], /* CJK Ideograph */
+ ["\u56C7", "\u56C7"], /* CJK Ideograph */
+ ["\u56C8", "\u56C8"], /* CJK Ideograph */
+ ["\u56C9", "\u56C9"], /* CJK Ideograph */
+ ["\u56CA", "\u56CA"], /* CJK Ideograph */
+ ["\u56CB", "\u56CB"], /* CJK Ideograph */
+ ["\u56CC", "\u56CC"], /* CJK Ideograph */
+ ["\u56CD", "\u56CD"], /* CJK Ideograph */
+ ["\u56CE", "\u56CE"], /* CJK Ideograph */
+ ["\u56CF", "\u56CF"], /* CJK Ideograph */
+ ["\u56D0", "\u56D0"], /* CJK Ideograph */
+ ["\u56D1", "\u56D1"], /* CJK Ideograph */
+ ["\u56D2", "\u56D2"], /* CJK Ideograph */
+ ["\u56D3", "\u56D3"], /* CJK Ideograph */
+ ["\u56D4", "\u56D4"], /* CJK Ideograph */
+ ["\u56D5", "\u56D5"], /* CJK Ideograph */
+ ["\u56D6", "\u56D6"], /* CJK Ideograph */
+ ["\u56D7", "\u56D7"], /* CJK Ideograph */
+ ["\u56D8", "\u56D8"], /* CJK Ideograph */
+ ["\u56D9", "\u56D9"], /* CJK Ideograph */
+ ["\u56DA", "\u56DA"], /* CJK Ideograph */
+ ["\u56DB", "\u56DB"], /* CJK Ideograph */
+ ["\u56DC", "\u56DC"], /* CJK Ideograph */
+ ["\u56DD", "\u56DD"], /* CJK Ideograph */
+ ["\u56DE", "\u56DE"], /* CJK Ideograph */
+ ["\u56DF", "\u56DF"], /* CJK Ideograph */
+ ["\u56E0", "\u56E0"], /* CJK Ideograph */
+ ["\u56E1", "\u56E1"], /* CJK Ideograph */
+ ["\u56E2", "\u56E2"], /* CJK Ideograph */
+ ["\u56E3", "\u56E3"], /* CJK Ideograph */
+ ["\u56E4", "\u56E4"], /* CJK Ideograph */
+ ["\u56E5", "\u56E5"], /* CJK Ideograph */
+ ["\u56E6", "\u56E6"], /* CJK Ideograph */
+ ["\u56E7", "\u56E7"], /* CJK Ideograph */
+ ["\u56E8", "\u56E8"], /* CJK Ideograph */
+ ["\u56E9", "\u56E9"], /* CJK Ideograph */
+ ["\u56EA", "\u56EA"], /* CJK Ideograph */
+ ["\u56EB", "\u56EB"], /* CJK Ideograph */
+ ["\u56EC", "\u56EC"], /* CJK Ideograph */
+ ["\u56ED", "\u56ED"], /* CJK Ideograph */
+ ["\u56EE", "\u56EE"], /* CJK Ideograph */
+ ["\u56EF", "\u56EF"], /* CJK Ideograph */
+ ["\u56F0", "\u56F0"], /* CJK Ideograph */
+ ["\u56F1", "\u56F1"], /* CJK Ideograph */
+ ["\u56F2", "\u56F2"], /* CJK Ideograph */
+ ["\u56F3", "\u56F3"], /* CJK Ideograph */
+ ["\u56F4", "\u56F4"], /* CJK Ideograph */
+ ["\u56F5", "\u56F5"], /* CJK Ideograph */
+ ["\u56F6", "\u56F6"], /* CJK Ideograph */
+ ["\u56F7", "\u56F7"], /* CJK Ideograph */
+ ["\u56F8", "\u56F8"], /* CJK Ideograph */
+ ["\u56F9", "\u56F9"], /* CJK Ideograph */
+ ["\u56FA", "\u56FA"], /* CJK Ideograph */
+ ["\u56FB", "\u56FB"], /* CJK Ideograph */
+ ["\u56FC", "\u56FC"], /* CJK Ideograph */
+ ["\u56FD", "\u56FD"], /* CJK Ideograph */
+ ["\u56FE", "\u56FE"], /* CJK Ideograph */
+ ["\u56FF", "\u56FF"], /* CJK Ideograph */
+ ["\u5700", "\u5700"], /* CJK Ideograph */
+ ["\u5701", "\u5701"], /* CJK Ideograph */
+ ["\u5702", "\u5702"], /* CJK Ideograph */
+ ["\u5703", "\u5703"], /* CJK Ideograph */
+ ["\u5704", "\u5704"], /* CJK Ideograph */
+ ["\u5705", "\u5705"], /* CJK Ideograph */
+ ["\u5706", "\u5706"], /* CJK Ideograph */
+ ["\u5707", "\u5707"], /* CJK Ideograph */
+ ["\u5708", "\u5708"], /* CJK Ideograph */
+ ["\u5709", "\u5709"], /* CJK Ideograph */
+ ["\u570A", "\u570A"], /* CJK Ideograph */
+ ["\u570B", "\u570B"], /* CJK Ideograph */
+ ["\u570C", "\u570C"], /* CJK Ideograph */
+ ["\u570D", "\u570D"], /* CJK Ideograph */
+ ["\u570E", "\u570E"], /* CJK Ideograph */
+ ["\u570F", "\u570F"], /* CJK Ideograph */
+ ["\u5710", "\u5710"], /* CJK Ideograph */
+ ["\u5711", "\u5711"], /* CJK Ideograph */
+ ["\u5712", "\u5712"], /* CJK Ideograph */
+ ["\u5713", "\u5713"], /* CJK Ideograph */
+ ["\u5714", "\u5714"], /* CJK Ideograph */
+ ["\u5715", "\u5715"], /* CJK Ideograph */
+ ["\u5716", "\u5716"], /* CJK Ideograph */
+ ["\u5717", "\u5717"], /* CJK Ideograph */
+ ["\u5718", "\u5718"], /* CJK Ideograph */
+ ["\u5719", "\u5719"], /* CJK Ideograph */
+ ["\u571A", "\u571A"], /* CJK Ideograph */
+ ["\u571B", "\u571B"], /* CJK Ideograph */
+ ["\u571C", "\u571C"], /* CJK Ideograph */
+ ["\u571D", "\u571D"], /* CJK Ideograph */
+ ["\u571E", "\u571E"], /* CJK Ideograph */
+ ["\u571F", "\u571F"], /* CJK Ideograph */
+ ["\u5720", "\u5720"], /* CJK Ideograph */
+ ["\u5721", "\u5721"], /* CJK Ideograph */
+ ["\u5722", "\u5722"], /* CJK Ideograph */
+ ["\u5723", "\u5723"], /* CJK Ideograph */
+ ["\u5724", "\u5724"], /* CJK Ideograph */
+ ["\u5725", "\u5725"], /* CJK Ideograph */
+ ["\u5726", "\u5726"], /* CJK Ideograph */
+ ["\u5727", "\u5727"], /* CJK Ideograph */
+ ["\u5728", "\u5728"], /* CJK Ideograph */
+ ["\u5729", "\u5729"], /* CJK Ideograph */
+ ["\u572A", "\u572A"], /* CJK Ideograph */
+ ["\u572B", "\u572B"], /* CJK Ideograph */
+ ["\u572C", "\u572C"], /* CJK Ideograph */
+ ["\u572D", "\u572D"], /* CJK Ideograph */
+ ["\u572E", "\u572E"], /* CJK Ideograph */
+ ["\u572F", "\u572F"], /* CJK Ideograph */
+ ["\u5730", "\u5730"], /* CJK Ideograph */
+ ["\u5731", "\u5731"], /* CJK Ideograph */
+ ["\u5732", "\u5732"], /* CJK Ideograph */
+ ["\u5733", "\u5733"], /* CJK Ideograph */
+ ["\u5734", "\u5734"], /* CJK Ideograph */
+ ["\u5735", "\u5735"], /* CJK Ideograph */
+ ["\u5736", "\u5736"], /* CJK Ideograph */
+ ["\u5737", "\u5737"], /* CJK Ideograph */
+ ["\u5738", "\u5738"], /* CJK Ideograph */
+ ["\u5739", "\u5739"], /* CJK Ideograph */
+ ["\u573A", "\u573A"], /* CJK Ideograph */
+ ["\u573B", "\u573B"], /* CJK Ideograph */
+ ["\u573C", "\u573C"], /* CJK Ideograph */
+ ["\u573D", "\u573D"], /* CJK Ideograph */
+ ["\u573E", "\u573E"], /* CJK Ideograph */
+ ["\u573F", "\u573F"], /* CJK Ideograph */
+ ["\u5740", "\u5740"], /* CJK Ideograph */
+ ["\u5741", "\u5741"], /* CJK Ideograph */
+ ["\u5742", "\u5742"], /* CJK Ideograph */
+ ["\u5743", "\u5743"], /* CJK Ideograph */
+ ["\u5744", "\u5744"], /* CJK Ideograph */
+ ["\u5745", "\u5745"], /* CJK Ideograph */
+ ["\u5746", "\u5746"], /* CJK Ideograph */
+ ["\u5747", "\u5747"], /* CJK Ideograph */
+ ["\u5748", "\u5748"], /* CJK Ideograph */
+ ["\u5749", "\u5749"], /* CJK Ideograph */
+ ["\u574A", "\u574A"], /* CJK Ideograph */
+ ["\u574B", "\u574B"], /* CJK Ideograph */
+ ["\u574C", "\u574C"], /* CJK Ideograph */
+ ["\u574D", "\u574D"], /* CJK Ideograph */
+ ["\u574E", "\u574E"], /* CJK Ideograph */
+ ["\u574F", "\u574F"], /* CJK Ideograph */
+ ["\u5750", "\u5750"], /* CJK Ideograph */
+ ["\u5751", "\u5751"], /* CJK Ideograph */
+ ["\u5752", "\u5752"], /* CJK Ideograph */
+ ["\u5753", "\u5753"], /* CJK Ideograph */
+ ["\u5754", "\u5754"], /* CJK Ideograph */
+ ["\u5755", "\u5755"], /* CJK Ideograph */
+ ["\u5756", "\u5756"], /* CJK Ideograph */
+ ["\u5757", "\u5757"], /* CJK Ideograph */
+ ["\u5758", "\u5758"], /* CJK Ideograph */
+ ["\u5759", "\u5759"], /* CJK Ideograph */
+ ["\u575A", "\u575A"], /* CJK Ideograph */
+ ["\u575B", "\u575B"], /* CJK Ideograph */
+ ["\u575C", "\u575C"], /* CJK Ideograph */
+ ["\u575D", "\u575D"], /* CJK Ideograph */
+ ["\u575E", "\u575E"], /* CJK Ideograph */
+ ["\u575F", "\u575F"], /* CJK Ideograph */
+ ["\u5760", "\u5760"], /* CJK Ideograph */
+ ["\u5761", "\u5761"], /* CJK Ideograph */
+ ["\u5762", "\u5762"], /* CJK Ideograph */
+ ["\u5763", "\u5763"], /* CJK Ideograph */
+ ["\u5764", "\u5764"], /* CJK Ideograph */
+ ["\u5765", "\u5765"], /* CJK Ideograph */
+ ["\u5766", "\u5766"], /* CJK Ideograph */
+ ["\u5767", "\u5767"], /* CJK Ideograph */
+ ["\u5768", "\u5768"], /* CJK Ideograph */
+ ["\u5769", "\u5769"], /* CJK Ideograph */
+ ["\u576A", "\u576A"], /* CJK Ideograph */
+ ["\u576B", "\u576B"], /* CJK Ideograph */
+ ["\u576C", "\u576C"], /* CJK Ideograph */
+ ["\u576D", "\u576D"], /* CJK Ideograph */
+ ["\u576E", "\u576E"], /* CJK Ideograph */
+ ["\u576F", "\u576F"], /* CJK Ideograph */
+ ["\u5770", "\u5770"], /* CJK Ideograph */
+ ["\u5771", "\u5771"], /* CJK Ideograph */
+ ["\u5772", "\u5772"], /* CJK Ideograph */
+ ["\u5773", "\u5773"], /* CJK Ideograph */
+ ["\u5774", "\u5774"], /* CJK Ideograph */
+ ["\u5775", "\u5775"], /* CJK Ideograph */
+ ["\u5776", "\u5776"], /* CJK Ideograph */
+ ["\u5777", "\u5777"], /* CJK Ideograph */
+ ["\u5778", "\u5778"], /* CJK Ideograph */
+ ["\u5779", "\u5779"], /* CJK Ideograph */
+ ["\u577A", "\u577A"], /* CJK Ideograph */
+ ["\u577B", "\u577B"], /* CJK Ideograph */
+ ["\u577C", "\u577C"], /* CJK Ideograph */
+ ["\u577D", "\u577D"], /* CJK Ideograph */
+ ["\u577E", "\u577E"], /* CJK Ideograph */
+ ["\u577F", "\u577F"], /* CJK Ideograph */
+ ["\u5780", "\u5780"], /* CJK Ideograph */
+ ["\u5781", "\u5781"], /* CJK Ideograph */
+ ["\u5782", "\u5782"], /* CJK Ideograph */
+ ["\u5783", "\u5783"], /* CJK Ideograph */
+ ["\u5784", "\u5784"], /* CJK Ideograph */
+ ["\u5785", "\u5785"], /* CJK Ideograph */
+ ["\u5786", "\u5786"], /* CJK Ideograph */
+ ["\u5787", "\u5787"], /* CJK Ideograph */
+ ["\u5788", "\u5788"], /* CJK Ideograph */
+ ["\u5789", "\u5789"], /* CJK Ideograph */
+ ["\u578A", "\u578A"], /* CJK Ideograph */
+ ["\u578B", "\u578B"], /* CJK Ideograph */
+ ["\u578C", "\u578C"], /* CJK Ideograph */
+ ["\u578D", "\u578D"], /* CJK Ideograph */
+ ["\u578E", "\u578E"], /* CJK Ideograph */
+ ["\u578F", "\u578F"], /* CJK Ideograph */
+ ["\u5790", "\u5790"], /* CJK Ideograph */
+ ["\u5791", "\u5791"], /* CJK Ideograph */
+ ["\u5792", "\u5792"], /* CJK Ideograph */
+ ["\u5793", "\u5793"], /* CJK Ideograph */
+ ["\u5794", "\u5794"], /* CJK Ideograph */
+ ["\u5795", "\u5795"], /* CJK Ideograph */
+ ["\u5796", "\u5796"], /* CJK Ideograph */
+ ["\u5797", "\u5797"], /* CJK Ideograph */
+ ["\u5798", "\u5798"], /* CJK Ideograph */
+ ["\u5799", "\u5799"], /* CJK Ideograph */
+ ["\u579A", "\u579A"], /* CJK Ideograph */
+ ["\u579B", "\u579B"], /* CJK Ideograph */
+ ["\u579C", "\u579C"], /* CJK Ideograph */
+ ["\u579D", "\u579D"], /* CJK Ideograph */
+ ["\u579E", "\u579E"], /* CJK Ideograph */
+ ["\u579F", "\u579F"], /* CJK Ideograph */
+ ["\u57A0", "\u57A0"], /* CJK Ideograph */
+ ["\u57A1", "\u57A1"], /* CJK Ideograph */
+ ["\u57A2", "\u57A2"], /* CJK Ideograph */
+ ["\u57A3", "\u57A3"], /* CJK Ideograph */
+ ["\u57A4", "\u57A4"], /* CJK Ideograph */
+ ["\u57A5", "\u57A5"], /* CJK Ideograph */
+ ["\u57A6", "\u57A6"], /* CJK Ideograph */
+ ["\u57A7", "\u57A7"], /* CJK Ideograph */
+ ["\u57A8", "\u57A8"], /* CJK Ideograph */
+ ["\u57A9", "\u57A9"], /* CJK Ideograph */
+ ["\u57AA", "\u57AA"], /* CJK Ideograph */
+ ["\u57AB", "\u57AB"], /* CJK Ideograph */
+ ["\u57AC", "\u57AC"], /* CJK Ideograph */
+ ["\u57AD", "\u57AD"], /* CJK Ideograph */
+ ["\u57AE", "\u57AE"], /* CJK Ideograph */
+ ["\u57AF", "\u57AF"], /* CJK Ideograph */
+ ["\u57B0", "\u57B0"], /* CJK Ideograph */
+ ["\u57B1", "\u57B1"], /* CJK Ideograph */
+ ["\u57B2", "\u57B2"], /* CJK Ideograph */
+ ["\u57B3", "\u57B3"], /* CJK Ideograph */
+ ["\u57B4", "\u57B4"], /* CJK Ideograph */
+ ["\u57B5", "\u57B5"], /* CJK Ideograph */
+ ["\u57B6", "\u57B6"], /* CJK Ideograph */
+ ["\u57B7", "\u57B7"], /* CJK Ideograph */
+ ["\u57B8", "\u57B8"], /* CJK Ideograph */
+ ["\u57B9", "\u57B9"], /* CJK Ideograph */
+ ["\u57BA", "\u57BA"], /* CJK Ideograph */
+ ["\u57BB", "\u57BB"], /* CJK Ideograph */
+ ["\u57BC", "\u57BC"], /* CJK Ideograph */
+ ["\u57BD", "\u57BD"], /* CJK Ideograph */
+ ["\u57BE", "\u57BE"], /* CJK Ideograph */
+ ["\u57BF", "\u57BF"], /* CJK Ideograph */
+ ["\u57C0", "\u57C0"], /* CJK Ideograph */
+ ["\u57C1", "\u57C1"], /* CJK Ideograph */
+ ["\u57C2", "\u57C2"], /* CJK Ideograph */
+ ["\u57C3", "\u57C3"], /* CJK Ideograph */
+ ["\u57C4", "\u57C4"], /* CJK Ideograph */
+ ["\u57C5", "\u57C5"], /* CJK Ideograph */
+ ["\u57C6", "\u57C6"], /* CJK Ideograph */
+ ["\u57C7", "\u57C7"], /* CJK Ideograph */
+ ["\u57C8", "\u57C8"], /* CJK Ideograph */
+ ["\u57C9", "\u57C9"], /* CJK Ideograph */
+ ["\u57CA", "\u57CA"], /* CJK Ideograph */
+ ["\u57CB", "\u57CB"], /* CJK Ideograph */
+ ["\u57CC", "\u57CC"], /* CJK Ideograph */
+ ["\u57CD", "\u57CD"], /* CJK Ideograph */
+ ["\u57CE", "\u57CE"], /* CJK Ideograph */
+ ["\u57CF", "\u57CF"], /* CJK Ideograph */
+ ["\u57D0", "\u57D0"], /* CJK Ideograph */
+ ["\u57D1", "\u57D1"], /* CJK Ideograph */
+ ["\u57D2", "\u57D2"], /* CJK Ideograph */
+ ["\u57D3", "\u57D3"], /* CJK Ideograph */
+ ["\u57D4", "\u57D4"], /* CJK Ideograph */
+ ["\u57D5", "\u57D5"], /* CJK Ideograph */
+ ["\u57D6", "\u57D6"], /* CJK Ideograph */
+ ["\u57D7", "\u57D7"], /* CJK Ideograph */
+ ["\u57D8", "\u57D8"], /* CJK Ideograph */
+ ["\u57D9", "\u57D9"], /* CJK Ideograph */
+ ["\u57DA", "\u57DA"], /* CJK Ideograph */
+ ["\u57DB", "\u57DB"], /* CJK Ideograph */
+ ["\u57DC", "\u57DC"], /* CJK Ideograph */
+ ["\u57DD", "\u57DD"], /* CJK Ideograph */
+ ["\u57DE", "\u57DE"], /* CJK Ideograph */
+ ["\u57DF", "\u57DF"], /* CJK Ideograph */
+ ["\u57E0", "\u57E0"], /* CJK Ideograph */
+ ["\u57E1", "\u57E1"], /* CJK Ideograph */
+ ["\u57E2", "\u57E2"], /* CJK Ideograph */
+ ["\u57E3", "\u57E3"], /* CJK Ideograph */
+ ["\u57E4", "\u57E4"], /* CJK Ideograph */
+ ["\u57E5", "\u57E5"], /* CJK Ideograph */
+ ["\u57E6", "\u57E6"], /* CJK Ideograph */
+ ["\u57E7", "\u57E7"], /* CJK Ideograph */
+ ["\u57E8", "\u57E8"], /* CJK Ideograph */
+ ["\u57E9", "\u57E9"], /* CJK Ideograph */
+ ["\u57EA", "\u57EA"], /* CJK Ideograph */
+ ["\u57EB", "\u57EB"], /* CJK Ideograph */
+ ["\u57EC", "\u57EC"], /* CJK Ideograph */
+ ["\u57ED", "\u57ED"], /* CJK Ideograph */
+ ["\u57EE", "\u57EE"], /* CJK Ideograph */
+ ["\u57EF", "\u57EF"], /* CJK Ideograph */
+ ["\u57F0", "\u57F0"], /* CJK Ideograph */
+ ["\u57F1", "\u57F1"], /* CJK Ideograph */
+ ["\u57F2", "\u57F2"], /* CJK Ideograph */
+ ["\u57F3", "\u57F3"], /* CJK Ideograph */
+ ["\u57F4", "\u57F4"], /* CJK Ideograph */
+ ["\u57F5", "\u57F5"], /* CJK Ideograph */
+ ["\u57F6", "\u57F6"], /* CJK Ideograph */
+ ["\u57F7", "\u57F7"], /* CJK Ideograph */
+ ["\u57F8", "\u57F8"], /* CJK Ideograph */
+ ["\u57F9", "\u57F9"], /* CJK Ideograph */
+ ["\u57FA", "\u57FA"], /* CJK Ideograph */
+ ["\u57FB", "\u57FB"], /* CJK Ideograph */
+ ["\u57FC", "\u57FC"], /* CJK Ideograph */
+ ["\u57FD", "\u57FD"], /* CJK Ideograph */
+ ["\u57FE", "\u57FE"], /* CJK Ideograph */
+ ["\u57FF", "\u57FF"], /* CJK Ideograph */
+ ["\u5800", "\u5800"], /* CJK Ideograph */
+ ["\u5801", "\u5801"], /* CJK Ideograph */
+ ["\u5802", "\u5802"], /* CJK Ideograph */
+ ["\u5803", "\u5803"], /* CJK Ideograph */
+ ["\u5804", "\u5804"], /* CJK Ideograph */
+ ["\u5805", "\u5805"], /* CJK Ideograph */
+ ["\u5806", "\u5806"], /* CJK Ideograph */
+ ["\u5807", "\u5807"], /* CJK Ideograph */
+ ["\u5808", "\u5808"], /* CJK Ideograph */
+ ["\u5809", "\u5809"], /* CJK Ideograph */
+ ["\u580A", "\u580A"], /* CJK Ideograph */
+ ["\u580B", "\u580B"], /* CJK Ideograph */
+ ["\u580C", "\u580C"], /* CJK Ideograph */
+ ["\u580D", "\u580D"], /* CJK Ideograph */
+ ["\u580E", "\u580E"], /* CJK Ideograph */
+ ["\u580F", "\u580F"], /* CJK Ideograph */
+ ["\u5810", "\u5810"], /* CJK Ideograph */
+ ["\u5811", "\u5811"], /* CJK Ideograph */
+ ["\u5812", "\u5812"], /* CJK Ideograph */
+ ["\u5813", "\u5813"], /* CJK Ideograph */
+ ["\u5814", "\u5814"], /* CJK Ideograph */
+ ["\u5815", "\u5815"], /* CJK Ideograph */
+ ["\u5816", "\u5816"], /* CJK Ideograph */
+ ["\u5817", "\u5817"], /* CJK Ideograph */
+ ["\u5818", "\u5818"], /* CJK Ideograph */
+ ["\u5819", "\u5819"], /* CJK Ideograph */
+ ["\u581A", "\u581A"], /* CJK Ideograph */
+ ["\u581B", "\u581B"], /* CJK Ideograph */
+ ["\u581C", "\u581C"], /* CJK Ideograph */
+ ["\u581D", "\u581D"], /* CJK Ideograph */
+ ["\u581E", "\u581E"], /* CJK Ideograph */
+ ["\u581F", "\u581F"], /* CJK Ideograph */
+ ["\u5820", "\u5820"], /* CJK Ideograph */
+ ["\u5821", "\u5821"], /* CJK Ideograph */
+ ["\u5822", "\u5822"], /* CJK Ideograph */
+ ["\u5823", "\u5823"], /* CJK Ideograph */
+ ["\u5824", "\u5824"], /* CJK Ideograph */
+ ["\u5825", "\u5825"], /* CJK Ideograph */
+ ["\u5826", "\u5826"], /* CJK Ideograph */
+ ["\u5827", "\u5827"], /* CJK Ideograph */
+ ["\u5828", "\u5828"], /* CJK Ideograph */
+ ["\u5829", "\u5829"], /* CJK Ideograph */
+ ["\u582A", "\u582A"], /* CJK Ideograph */
+ ["\u582B", "\u582B"], /* CJK Ideograph */
+ ["\u582C", "\u582C"], /* CJK Ideograph */
+ ["\u582D", "\u582D"], /* CJK Ideograph */
+ ["\u582E", "\u582E"], /* CJK Ideograph */
+ ["\u582F", "\u582F"], /* CJK Ideograph */
+ ["\u5830", "\u5830"], /* CJK Ideograph */
+ ["\u5831", "\u5831"], /* CJK Ideograph */
+ ["\u5832", "\u5832"], /* CJK Ideograph */
+ ["\u5833", "\u5833"], /* CJK Ideograph */
+ ["\u5834", "\u5834"], /* CJK Ideograph */
+ ["\u5835", "\u5835"], /* CJK Ideograph */
+ ["\u5836", "\u5836"], /* CJK Ideograph */
+ ["\u5837", "\u5837"], /* CJK Ideograph */
+ ["\u5838", "\u5838"], /* CJK Ideograph */
+ ["\u5839", "\u5839"], /* CJK Ideograph */
+ ["\u583A", "\u583A"], /* CJK Ideograph */
+ ["\u583B", "\u583B"], /* CJK Ideograph */
+ ["\u583C", "\u583C"], /* CJK Ideograph */
+ ["\u583D", "\u583D"], /* CJK Ideograph */
+ ["\u583E", "\u583E"], /* CJK Ideograph */
+ ["\u583F", "\u583F"], /* CJK Ideograph */
+ ["\u5840", "\u5840"], /* CJK Ideograph */
+ ["\u5841", "\u5841"], /* CJK Ideograph */
+ ["\u5842", "\u5842"], /* CJK Ideograph */
+ ["\u5843", "\u5843"], /* CJK Ideograph */
+ ["\u5844", "\u5844"], /* CJK Ideograph */
+ ["\u5845", "\u5845"], /* CJK Ideograph */
+ ["\u5846", "\u5846"], /* CJK Ideograph */
+ ["\u5847", "\u5847"], /* CJK Ideograph */
+ ["\u5848", "\u5848"], /* CJK Ideograph */
+ ["\u5849", "\u5849"], /* CJK Ideograph */
+ ["\u584A", "\u584A"], /* CJK Ideograph */
+ ["\u584B", "\u584B"], /* CJK Ideograph */
+ ["\u584C", "\u584C"], /* CJK Ideograph */
+ ["\u584D", "\u584D"], /* CJK Ideograph */
+ ["\u584E", "\u584E"], /* CJK Ideograph */
+ ["\u584F", "\u584F"], /* CJK Ideograph */
+ ["\u5850", "\u5850"], /* CJK Ideograph */
+ ["\u5851", "\u5851"], /* CJK Ideograph */
+ ["\u5852", "\u5852"], /* CJK Ideograph */
+ ["\u5853", "\u5853"], /* CJK Ideograph */
+ ["\u5854", "\u5854"], /* CJK Ideograph */
+ ["\u5855", "\u5855"], /* CJK Ideograph */
+ ["\u5856", "\u5856"], /* CJK Ideograph */
+ ["\u5857", "\u5857"], /* CJK Ideograph */
+ ["\u5858", "\u5858"], /* CJK Ideograph */
+ ["\u5859", "\u5859"], /* CJK Ideograph */
+ ["\u585A", "\u585A"], /* CJK Ideograph */
+ ["\u585B", "\u585B"], /* CJK Ideograph */
+ ["\u585C", "\u585C"], /* CJK Ideograph */
+ ["\u585D", "\u585D"], /* CJK Ideograph */
+ ["\u585E", "\u585E"], /* CJK Ideograph */
+ ["\u585F", "\u585F"], /* CJK Ideograph */
+ ["\u5860", "\u5860"], /* CJK Ideograph */
+ ["\u5861", "\u5861"], /* CJK Ideograph */
+ ["\u5862", "\u5862"], /* CJK Ideograph */
+ ["\u5863", "\u5863"], /* CJK Ideograph */
+ ["\u5864", "\u5864"], /* CJK Ideograph */
+ ["\u5865", "\u5865"], /* CJK Ideograph */
+ ["\u5866", "\u5866"], /* CJK Ideograph */
+ ["\u5867", "\u5867"], /* CJK Ideograph */
+ ["\u5868", "\u5868"], /* CJK Ideograph */
+ ["\u5869", "\u5869"], /* CJK Ideograph */
+ ["\u586A", "\u586A"], /* CJK Ideograph */
+ ["\u586B", "\u586B"], /* CJK Ideograph */
+ ["\u586C", "\u586C"], /* CJK Ideograph */
+ ["\u586D", "\u586D"], /* CJK Ideograph */
+ ["\u586E", "\u586E"], /* CJK Ideograph */
+ ["\u586F", "\u586F"], /* CJK Ideograph */
+ ["\u5870", "\u5870"], /* CJK Ideograph */
+ ["\u5871", "\u5871"], /* CJK Ideograph */
+ ["\u5872", "\u5872"], /* CJK Ideograph */
+ ["\u5873", "\u5873"], /* CJK Ideograph */
+ ["\u5874", "\u5874"], /* CJK Ideograph */
+ ["\u5875", "\u5875"], /* CJK Ideograph */
+ ["\u5876", "\u5876"], /* CJK Ideograph */
+ ["\u5877", "\u5877"], /* CJK Ideograph */
+ ["\u5878", "\u5878"], /* CJK Ideograph */
+ ["\u5879", "\u5879"], /* CJK Ideograph */
+ ["\u587A", "\u587A"], /* CJK Ideograph */
+ ["\u587B", "\u587B"], /* CJK Ideograph */
+ ["\u587C", "\u587C"], /* CJK Ideograph */
+ ["\u587D", "\u587D"], /* CJK Ideograph */
+ ["\u587E", "\u587E"], /* CJK Ideograph */
+ ["\u587F", "\u587F"], /* CJK Ideograph */
+ ["\u5880", "\u5880"], /* CJK Ideograph */
+ ["\u5881", "\u5881"], /* CJK Ideograph */
+ ["\u5882", "\u5882"], /* CJK Ideograph */
+ ["\u5883", "\u5883"], /* CJK Ideograph */
+ ["\u5884", "\u5884"], /* CJK Ideograph */
+ ["\u5885", "\u5885"], /* CJK Ideograph */
+ ["\u5886", "\u5886"], /* CJK Ideograph */
+ ["\u5887", "\u5887"], /* CJK Ideograph */
+ ["\u5888", "\u5888"], /* CJK Ideograph */
+ ["\u5889", "\u5889"], /* CJK Ideograph */
+ ["\u588A", "\u588A"], /* CJK Ideograph */
+ ["\u588B", "\u588B"], /* CJK Ideograph */
+ ["\u588C", "\u588C"], /* CJK Ideograph */
+ ["\u588D", "\u588D"], /* CJK Ideograph */
+ ["\u588E", "\u588E"], /* CJK Ideograph */
+ ["\u588F", "\u588F"], /* CJK Ideograph */
+ ["\u5890", "\u5890"], /* CJK Ideograph */
+ ["\u5891", "\u5891"], /* CJK Ideograph */
+ ["\u5892", "\u5892"], /* CJK Ideograph */
+ ["\u5893", "\u5893"], /* CJK Ideograph */
+ ["\u5894", "\u5894"], /* CJK Ideograph */
+ ["\u5895", "\u5895"], /* CJK Ideograph */
+ ["\u5896", "\u5896"], /* CJK Ideograph */
+ ["\u5897", "\u5897"], /* CJK Ideograph */
+ ["\u5898", "\u5898"], /* CJK Ideograph */
+ ["\u5899", "\u5899"], /* CJK Ideograph */
+ ["\u589A", "\u589A"], /* CJK Ideograph */
+ ["\u589B", "\u589B"], /* CJK Ideograph */
+ ["\u589C", "\u589C"], /* CJK Ideograph */
+ ["\u589D", "\u589D"], /* CJK Ideograph */
+ ["\u589E", "\u589E"], /* CJK Ideograph */
+ ["\u589F", "\u589F"], /* CJK Ideograph */
+ ["\u58A0", "\u58A0"], /* CJK Ideograph */
+ ["\u58A1", "\u58A1"], /* CJK Ideograph */
+ ["\u58A2", "\u58A2"], /* CJK Ideograph */
+ ["\u58A3", "\u58A3"], /* CJK Ideograph */
+ ["\u58A4", "\u58A4"], /* CJK Ideograph */
+ ["\u58A5", "\u58A5"], /* CJK Ideograph */
+ ["\u58A6", "\u58A6"], /* CJK Ideograph */
+ ["\u58A7", "\u58A7"], /* CJK Ideograph */
+ ["\u58A8", "\u58A8"], /* CJK Ideograph */
+ ["\u58A9", "\u58A9"], /* CJK Ideograph */
+ ["\u58AA", "\u58AA"], /* CJK Ideograph */
+ ["\u58AB", "\u58AB"], /* CJK Ideograph */
+ ["\u58AC", "\u58AC"], /* CJK Ideograph */
+ ["\u58AD", "\u58AD"], /* CJK Ideograph */
+ ["\u58AE", "\u58AE"], /* CJK Ideograph */
+ ["\u58AF", "\u58AF"], /* CJK Ideograph */
+ ["\u58B0", "\u58B0"], /* CJK Ideograph */
+ ["\u58B1", "\u58B1"], /* CJK Ideograph */
+ ["\u58B2", "\u58B2"], /* CJK Ideograph */
+ ["\u58B3", "\u58B3"], /* CJK Ideograph */
+ ["\u58B4", "\u58B4"], /* CJK Ideograph */
+ ["\u58B5", "\u58B5"], /* CJK Ideograph */
+ ["\u58B6", "\u58B6"], /* CJK Ideograph */
+ ["\u58B7", "\u58B7"], /* CJK Ideograph */
+ ["\u58B8", "\u58B8"], /* CJK Ideograph */
+ ["\u58B9", "\u58B9"], /* CJK Ideograph */
+ ["\u58BA", "\u58BA"], /* CJK Ideograph */
+ ["\u58BB", "\u58BB"], /* CJK Ideograph */
+ ["\u58BC", "\u58BC"], /* CJK Ideograph */
+ ["\u58BD", "\u58BD"], /* CJK Ideograph */
+ ["\u58BE", "\u58BE"], /* CJK Ideograph */
+ ["\u58BF", "\u58BF"], /* CJK Ideograph */
+ ["\u58C0", "\u58C0"], /* CJK Ideograph */
+ ["\u58C1", "\u58C1"], /* CJK Ideograph */
+ ["\u58C2", "\u58C2"], /* CJK Ideograph */
+ ["\u58C3", "\u58C3"], /* CJK Ideograph */
+ ["\u58C4", "\u58C4"], /* CJK Ideograph */
+ ["\u58C5", "\u58C5"], /* CJK Ideograph */
+ ["\u58C6", "\u58C6"], /* CJK Ideograph */
+ ["\u58C7", "\u58C7"], /* CJK Ideograph */
+ ["\u58C8", "\u58C8"], /* CJK Ideograph */
+ ["\u58C9", "\u58C9"], /* CJK Ideograph */
+ ["\u58CA", "\u58CA"], /* CJK Ideograph */
+ ["\u58CB", "\u58CB"], /* CJK Ideograph */
+ ["\u58CC", "\u58CC"], /* CJK Ideograph */
+ ["\u58CD", "\u58CD"], /* CJK Ideograph */
+ ["\u58CE", "\u58CE"], /* CJK Ideograph */
+ ["\u58CF", "\u58CF"], /* CJK Ideograph */
+ ["\u58D0", "\u58D0"], /* CJK Ideograph */
+ ["\u58D1", "\u58D1"], /* CJK Ideograph */
+ ["\u58D2", "\u58D2"], /* CJK Ideograph */
+ ["\u58D3", "\u58D3"], /* CJK Ideograph */
+ ["\u58D4", "\u58D4"], /* CJK Ideograph */
+ ["\u58D5", "\u58D5"], /* CJK Ideograph */
+ ["\u58D6", "\u58D6"], /* CJK Ideograph */
+ ["\u58D7", "\u58D7"], /* CJK Ideograph */
+ ["\u58D8", "\u58D8"], /* CJK Ideograph */
+ ["\u58D9", "\u58D9"], /* CJK Ideograph */
+ ["\u58DA", "\u58DA"], /* CJK Ideograph */
+ ["\u58DB", "\u58DB"], /* CJK Ideograph */
+ ["\u58DC", "\u58DC"], /* CJK Ideograph */
+ ["\u58DD", "\u58DD"], /* CJK Ideograph */
+ ["\u58DE", "\u58DE"], /* CJK Ideograph */
+ ["\u58DF", "\u58DF"], /* CJK Ideograph */
+ ["\u58E0", "\u58E0"], /* CJK Ideograph */
+ ["\u58E1", "\u58E1"], /* CJK Ideograph */
+ ["\u58E2", "\u58E2"], /* CJK Ideograph */
+ ["\u58E3", "\u58E3"], /* CJK Ideograph */
+ ["\u58E4", "\u58E4"], /* CJK Ideograph */
+ ["\u58E5", "\u58E5"], /* CJK Ideograph */
+ ["\u58E6", "\u58E6"], /* CJK Ideograph */
+ ["\u58E7", "\u58E7"], /* CJK Ideograph */
+ ["\u58E8", "\u58E8"], /* CJK Ideograph */
+ ["\u58E9", "\u58E9"], /* CJK Ideograph */
+ ["\u58EA", "\u58EA"], /* CJK Ideograph */
+ ["\u58EB", "\u58EB"], /* CJK Ideograph */
+ ["\u58EC", "\u58EC"], /* CJK Ideograph */
+ ["\u58ED", "\u58ED"], /* CJK Ideograph */
+ ["\u58EE", "\u58EE"], /* CJK Ideograph */
+ ["\u58EF", "\u58EF"], /* CJK Ideograph */
+ ["\u58F0", "\u58F0"], /* CJK Ideograph */
+ ["\u58F1", "\u58F1"], /* CJK Ideograph */
+ ["\u58F2", "\u58F2"], /* CJK Ideograph */
+ ["\u58F3", "\u58F3"], /* CJK Ideograph */
+ ["\u58F4", "\u58F4"], /* CJK Ideograph */
+ ["\u58F5", "\u58F5"], /* CJK Ideograph */
+ ["\u58F6", "\u58F6"], /* CJK Ideograph */
+ ["\u58F7", "\u58F7"], /* CJK Ideograph */
+ ["\u58F8", "\u58F8"], /* CJK Ideograph */
+ ["\u58F9", "\u58F9"], /* CJK Ideograph */
+ ["\u58FA", "\u58FA"], /* CJK Ideograph */
+ ["\u58FB", "\u58FB"], /* CJK Ideograph */
+ ["\u58FC", "\u58FC"], /* CJK Ideograph */
+ ["\u58FD", "\u58FD"], /* CJK Ideograph */
+ ["\u58FE", "\u58FE"], /* CJK Ideograph */
+ ["\u58FF", "\u58FF"], /* CJK Ideograph */
+ ["\u5900", "\u5900"], /* CJK Ideograph */
+ ["\u5901", "\u5901"], /* CJK Ideograph */
+ ["\u5902", "\u5902"], /* CJK Ideograph */
+ ["\u5903", "\u5903"], /* CJK Ideograph */
+ ["\u5904", "\u5904"], /* CJK Ideograph */
+ ["\u5905", "\u5905"], /* CJK Ideograph */
+ ["\u5906", "\u5906"], /* CJK Ideograph */
+ ["\u5907", "\u5907"], /* CJK Ideograph */
+ ["\u5908", "\u5908"], /* CJK Ideograph */
+ ["\u5909", "\u5909"], /* CJK Ideograph */
+ ["\u590A", "\u590A"], /* CJK Ideograph */
+ ["\u590B", "\u590B"], /* CJK Ideograph */
+ ["\u590C", "\u590C"], /* CJK Ideograph */
+ ["\u590D", "\u590D"], /* CJK Ideograph */
+ ["\u590E", "\u590E"], /* CJK Ideograph */
+ ["\u590F", "\u590F"], /* CJK Ideograph */
+ ["\u5910", "\u5910"], /* CJK Ideograph */
+ ["\u5911", "\u5911"], /* CJK Ideograph */
+ ["\u5912", "\u5912"], /* CJK Ideograph */
+ ["\u5913", "\u5913"], /* CJK Ideograph */
+ ["\u5914", "\u5914"], /* CJK Ideograph */
+ ["\u5915", "\u5915"], /* CJK Ideograph */
+ ["\u5916", "\u5916"], /* CJK Ideograph */
+ ["\u5917", "\u5917"], /* CJK Ideograph */
+ ["\u5918", "\u5918"], /* CJK Ideograph */
+ ["\u5919", "\u5919"], /* CJK Ideograph */
+ ["\u591A", "\u591A"], /* CJK Ideograph */
+ ["\u591B", "\u591B"], /* CJK Ideograph */
+ ["\u591C", "\u591C"], /* CJK Ideograph */
+ ["\u591D", "\u591D"], /* CJK Ideograph */
+ ["\u591E", "\u591E"], /* CJK Ideograph */
+ ["\u591F", "\u591F"], /* CJK Ideograph */
+ ["\u5920", "\u5920"], /* CJK Ideograph */
+ ["\u5921", "\u5921"], /* CJK Ideograph */
+ ["\u5922", "\u5922"], /* CJK Ideograph */
+ ["\u5923", "\u5923"], /* CJK Ideograph */
+ ["\u5924", "\u5924"], /* CJK Ideograph */
+ ["\u5925", "\u5925"], /* CJK Ideograph */
+ ["\u5926", "\u5926"], /* CJK Ideograph */
+ ["\u5927", "\u5927"], /* CJK Ideograph */
+ ["\u5928", "\u5928"], /* CJK Ideograph */
+ ["\u5929", "\u5929"], /* CJK Ideograph */
+ ["\u592A", "\u592A"], /* CJK Ideograph */
+ ["\u592B", "\u592B"], /* CJK Ideograph */
+ ["\u592C", "\u592C"], /* CJK Ideograph */
+ ["\u592D", "\u592D"], /* CJK Ideograph */
+ ["\u592E", "\u592E"], /* CJK Ideograph */
+ ["\u592F", "\u592F"], /* CJK Ideograph */
+ ["\u5930", "\u5930"], /* CJK Ideograph */
+ ["\u5931", "\u5931"], /* CJK Ideograph */
+ ["\u5932", "\u5932"], /* CJK Ideograph */
+ ["\u5933", "\u5933"], /* CJK Ideograph */
+ ["\u5934", "\u5934"], /* CJK Ideograph */
+ ["\u5935", "\u5935"], /* CJK Ideograph */
+ ["\u5936", "\u5936"], /* CJK Ideograph */
+ ["\u5937", "\u5937"], /* CJK Ideograph */
+ ["\u5938", "\u5938"], /* CJK Ideograph */
+ ["\u5939", "\u5939"], /* CJK Ideograph */
+ ["\u593A", "\u593A"], /* CJK Ideograph */
+ ["\u593B", "\u593B"], /* CJK Ideograph */
+ ["\u593C", "\u593C"], /* CJK Ideograph */
+ ["\u593D", "\u593D"], /* CJK Ideograph */
+ ["\u593E", "\u593E"], /* CJK Ideograph */
+ ["\u593F", "\u593F"], /* CJK Ideograph */
+ ["\u5940", "\u5940"], /* CJK Ideograph */
+ ["\u5941", "\u5941"], /* CJK Ideograph */
+ ["\u5942", "\u5942"], /* CJK Ideograph */
+ ["\u5943", "\u5943"], /* CJK Ideograph */
+ ["\u5944", "\u5944"], /* CJK Ideograph */
+ ["\u5945", "\u5945"], /* CJK Ideograph */
+ ["\u5946", "\u5946"], /* CJK Ideograph */
+ ["\u5947", "\u5947"], /* CJK Ideograph */
+ ["\u5948", "\u5948"], /* CJK Ideograph */
+ ["\u5949", "\u5949"], /* CJK Ideograph */
+ ["\u594A", "\u594A"], /* CJK Ideograph */
+ ["\u594B", "\u594B"], /* CJK Ideograph */
+ ["\u594C", "\u594C"], /* CJK Ideograph */
+ ["\u594D", "\u594D"], /* CJK Ideograph */
+ ["\u594E", "\u594E"], /* CJK Ideograph */
+ ["\u594F", "\u594F"], /* CJK Ideograph */
+ ["\u5950", "\u5950"], /* CJK Ideograph */
+ ["\u5951", "\u5951"], /* CJK Ideograph */
+ ["\u5952", "\u5952"], /* CJK Ideograph */
+ ["\u5953", "\u5953"], /* CJK Ideograph */
+ ["\u5954", "\u5954"], /* CJK Ideograph */
+ ["\u5955", "\u5955"], /* CJK Ideograph */
+ ["\u5956", "\u5956"], /* CJK Ideograph */
+ ["\u5957", "\u5957"], /* CJK Ideograph */
+ ["\u5958", "\u5958"], /* CJK Ideograph */
+ ["\u5959", "\u5959"], /* CJK Ideograph */
+ ["\u595A", "\u595A"], /* CJK Ideograph */
+ ["\u595B", "\u595B"], /* CJK Ideograph */
+ ["\u595C", "\u595C"], /* CJK Ideograph */
+ ["\u595D", "\u595D"], /* CJK Ideograph */
+ ["\u595E", "\u595E"], /* CJK Ideograph */
+ ["\u595F", "\u595F"], /* CJK Ideograph */
+ ["\u5960", "\u5960"], /* CJK Ideograph */
+ ["\u5961", "\u5961"], /* CJK Ideograph */
+ ["\u5962", "\u5962"], /* CJK Ideograph */
+ ["\u5963", "\u5963"], /* CJK Ideograph */
+ ["\u5964", "\u5964"], /* CJK Ideograph */
+ ["\u5965", "\u5965"], /* CJK Ideograph */
+ ["\u5966", "\u5966"], /* CJK Ideograph */
+ ["\u5967", "\u5967"], /* CJK Ideograph */
+ ["\u5968", "\u5968"], /* CJK Ideograph */
+ ["\u5969", "\u5969"], /* CJK Ideograph */
+ ["\u596A", "\u596A"], /* CJK Ideograph */
+ ["\u596B", "\u596B"], /* CJK Ideograph */
+ ["\u596C", "\u596C"], /* CJK Ideograph */
+ ["\u596D", "\u596D"], /* CJK Ideograph */
+ ["\u596E", "\u596E"], /* CJK Ideograph */
+ ["\u596F", "\u596F"], /* CJK Ideograph */
+ ["\u5970", "\u5970"], /* CJK Ideograph */
+ ["\u5971", "\u5971"], /* CJK Ideograph */
+ ["\u5972", "\u5972"], /* CJK Ideograph */
+ ["\u5973", "\u5973"], /* CJK Ideograph */
+ ["\u5974", "\u5974"], /* CJK Ideograph */
+ ["\u5975", "\u5975"], /* CJK Ideograph */
+ ["\u5976", "\u5976"], /* CJK Ideograph */
+ ["\u5977", "\u5977"], /* CJK Ideograph */
+ ["\u5978", "\u5978"], /* CJK Ideograph */
+ ["\u5979", "\u5979"], /* CJK Ideograph */
+ ["\u597A", "\u597A"], /* CJK Ideograph */
+ ["\u597B", "\u597B"], /* CJK Ideograph */
+ ["\u597C", "\u597C"], /* CJK Ideograph */
+ ["\u597D", "\u597D"], /* CJK Ideograph */
+ ["\u597E", "\u597E"], /* CJK Ideograph */
+ ["\u597F", "\u597F"], /* CJK Ideograph */
+ ["\u5980", "\u5980"], /* CJK Ideograph */
+ ["\u5981", "\u5981"], /* CJK Ideograph */
+ ["\u5982", "\u5982"], /* CJK Ideograph */
+ ["\u5983", "\u5983"], /* CJK Ideograph */
+ ["\u5984", "\u5984"], /* CJK Ideograph */
+ ["\u5985", "\u5985"], /* CJK Ideograph */
+ ["\u5986", "\u5986"], /* CJK Ideograph */
+ ["\u5987", "\u5987"], /* CJK Ideograph */
+ ["\u5988", "\u5988"], /* CJK Ideograph */
+ ["\u5989", "\u5989"], /* CJK Ideograph */
+ ["\u598A", "\u598A"], /* CJK Ideograph */
+ ["\u598B", "\u598B"], /* CJK Ideograph */
+ ["\u598C", "\u598C"], /* CJK Ideograph */
+ ["\u598D", "\u598D"], /* CJK Ideograph */
+ ["\u598E", "\u598E"], /* CJK Ideograph */
+ ["\u598F", "\u598F"], /* CJK Ideograph */
+ ["\u5990", "\u5990"], /* CJK Ideograph */
+ ["\u5991", "\u5991"], /* CJK Ideograph */
+ ["\u5992", "\u5992"], /* CJK Ideograph */
+ ["\u5993", "\u5993"], /* CJK Ideograph */
+ ["\u5994", "\u5994"], /* CJK Ideograph */
+ ["\u5995", "\u5995"], /* CJK Ideograph */
+ ["\u5996", "\u5996"], /* CJK Ideograph */
+ ["\u5997", "\u5997"], /* CJK Ideograph */
+ ["\u5998", "\u5998"], /* CJK Ideograph */
+ ["\u5999", "\u5999"], /* CJK Ideograph */
+ ["\u599A", "\u599A"], /* CJK Ideograph */
+ ["\u599B", "\u599B"], /* CJK Ideograph */
+ ["\u599C", "\u599C"], /* CJK Ideograph */
+ ["\u599D", "\u599D"], /* CJK Ideograph */
+ ["\u599E", "\u599E"], /* CJK Ideograph */
+ ["\u599F", "\u599F"], /* CJK Ideograph */
+ ["\u59A0", "\u59A0"], /* CJK Ideograph */
+ ["\u59A1", "\u59A1"], /* CJK Ideograph */
+ ["\u59A2", "\u59A2"], /* CJK Ideograph */
+ ["\u59A3", "\u59A3"], /* CJK Ideograph */
+ ["\u59A4", "\u59A4"], /* CJK Ideograph */
+ ["\u59A5", "\u59A5"], /* CJK Ideograph */
+ ["\u59A6", "\u59A6"], /* CJK Ideograph */
+ ["\u59A7", "\u59A7"], /* CJK Ideograph */
+ ["\u59A8", "\u59A8"], /* CJK Ideograph */
+ ["\u59A9", "\u59A9"], /* CJK Ideograph */
+ ["\u59AA", "\u59AA"], /* CJK Ideograph */
+ ["\u59AB", "\u59AB"], /* CJK Ideograph */
+ ["\u59AC", "\u59AC"], /* CJK Ideograph */
+ ["\u59AD", "\u59AD"], /* CJK Ideograph */
+ ["\u59AE", "\u59AE"], /* CJK Ideograph */
+ ["\u59AF", "\u59AF"], /* CJK Ideograph */
+ ["\u59B0", "\u59B0"], /* CJK Ideograph */
+ ["\u59B1", "\u59B1"], /* CJK Ideograph */
+ ["\u59B2", "\u59B2"], /* CJK Ideograph */
+ ["\u59B3", "\u59B3"], /* CJK Ideograph */
+ ["\u59B4", "\u59B4"], /* CJK Ideograph */
+ ["\u59B5", "\u59B5"], /* CJK Ideograph */
+ ["\u59B6", "\u59B6"], /* CJK Ideograph */
+ ["\u59B7", "\u59B7"], /* CJK Ideograph */
+ ["\u59B8", "\u59B8"], /* CJK Ideograph */
+ ["\u59B9", "\u59B9"], /* CJK Ideograph */
+ ["\u59BA", "\u59BA"], /* CJK Ideograph */
+ ["\u59BB", "\u59BB"], /* CJK Ideograph */
+ ["\u59BC", "\u59BC"], /* CJK Ideograph */
+ ["\u59BD", "\u59BD"], /* CJK Ideograph */
+ ["\u59BE", "\u59BE"], /* CJK Ideograph */
+ ["\u59BF", "\u59BF"], /* CJK Ideograph */
+ ["\u59C0", "\u59C0"], /* CJK Ideograph */
+ ["\u59C1", "\u59C1"], /* CJK Ideograph */
+ ["\u59C2", "\u59C2"], /* CJK Ideograph */
+ ["\u59C3", "\u59C3"], /* CJK Ideograph */
+ ["\u59C4", "\u59C4"], /* CJK Ideograph */
+ ["\u59C5", "\u59C5"], /* CJK Ideograph */
+ ["\u59C6", "\u59C6"], /* CJK Ideograph */
+ ["\u59C7", "\u59C7"], /* CJK Ideograph */
+ ["\u59C8", "\u59C8"], /* CJK Ideograph */
+ ["\u59C9", "\u59C9"], /* CJK Ideograph */
+ ["\u59CA", "\u59CA"], /* CJK Ideograph */
+ ["\u59CB", "\u59CB"], /* CJK Ideograph */
+ ["\u59CC", "\u59CC"], /* CJK Ideograph */
+ ["\u59CD", "\u59CD"], /* CJK Ideograph */
+ ["\u59CE", "\u59CE"], /* CJK Ideograph */
+ ["\u59CF", "\u59CF"], /* CJK Ideograph */
+ ["\u59D0", "\u59D0"], /* CJK Ideograph */
+ ["\u59D1", "\u59D1"], /* CJK Ideograph */
+ ["\u59D2", "\u59D2"], /* CJK Ideograph */
+ ["\u59D3", "\u59D3"], /* CJK Ideograph */
+ ["\u59D4", "\u59D4"], /* CJK Ideograph */
+ ["\u59D5", "\u59D5"], /* CJK Ideograph */
+ ["\u59D6", "\u59D6"], /* CJK Ideograph */
+ ["\u59D7", "\u59D7"], /* CJK Ideograph */
+ ["\u59D8", "\u59D8"], /* CJK Ideograph */
+ ["\u59D9", "\u59D9"], /* CJK Ideograph */
+ ["\u59DA", "\u59DA"], /* CJK Ideograph */
+ ["\u59DB", "\u59DB"], /* CJK Ideograph */
+ ["\u59DC", "\u59DC"], /* CJK Ideograph */
+ ["\u59DD", "\u59DD"], /* CJK Ideograph */
+ ["\u59DE", "\u59DE"], /* CJK Ideograph */
+ ["\u59DF", "\u59DF"], /* CJK Ideograph */
+ ["\u59E0", "\u59E0"], /* CJK Ideograph */
+ ["\u59E1", "\u59E1"], /* CJK Ideograph */
+ ["\u59E2", "\u59E2"], /* CJK Ideograph */
+ ["\u59E3", "\u59E3"], /* CJK Ideograph */
+ ["\u59E4", "\u59E4"], /* CJK Ideograph */
+ ["\u59E5", "\u59E5"], /* CJK Ideograph */
+ ["\u59E6", "\u59E6"], /* CJK Ideograph */
+ ["\u59E7", "\u59E7"], /* CJK Ideograph */
+ ["\u59E8", "\u59E8"], /* CJK Ideograph */
+ ["\u59E9", "\u59E9"], /* CJK Ideograph */
+ ["\u59EA", "\u59EA"], /* CJK Ideograph */
+ ["\u59EB", "\u59EB"], /* CJK Ideograph */
+ ["\u59EC", "\u59EC"], /* CJK Ideograph */
+ ["\u59ED", "\u59ED"], /* CJK Ideograph */
+ ["\u59EE", "\u59EE"], /* CJK Ideograph */
+ ["\u59EF", "\u59EF"], /* CJK Ideograph */
+ ["\u59F0", "\u59F0"], /* CJK Ideograph */
+ ["\u59F1", "\u59F1"], /* CJK Ideograph */
+ ["\u59F2", "\u59F2"], /* CJK Ideograph */
+ ["\u59F3", "\u59F3"], /* CJK Ideograph */
+ ["\u59F4", "\u59F4"], /* CJK Ideograph */
+ ["\u59F5", "\u59F5"], /* CJK Ideograph */
+ ["\u59F6", "\u59F6"], /* CJK Ideograph */
+ ["\u59F7", "\u59F7"], /* CJK Ideograph */
+ ["\u59F8", "\u59F8"], /* CJK Ideograph */
+ ["\u59F9", "\u59F9"], /* CJK Ideograph */
+ ["\u59FA", "\u59FA"], /* CJK Ideograph */
+ ["\u59FB", "\u59FB"], /* CJK Ideograph */
+ ["\u59FC", "\u59FC"], /* CJK Ideograph */
+ ["\u59FD", "\u59FD"], /* CJK Ideograph */
+ ["\u59FE", "\u59FE"], /* CJK Ideograph */
+ ["\u59FF", "\u59FF"], /* CJK Ideograph */
+ ["\u5A00", "\u5A00"], /* CJK Ideograph */
+ ["\u5A01", "\u5A01"], /* CJK Ideograph */
+ ["\u5A02", "\u5A02"], /* CJK Ideograph */
+ ["\u5A03", "\u5A03"], /* CJK Ideograph */
+ ["\u5A04", "\u5A04"], /* CJK Ideograph */
+ ["\u5A05", "\u5A05"], /* CJK Ideograph */
+ ["\u5A06", "\u5A06"], /* CJK Ideograph */
+ ["\u5A07", "\u5A07"], /* CJK Ideograph */
+ ["\u5A08", "\u5A08"], /* CJK Ideograph */
+ ["\u5A09", "\u5A09"], /* CJK Ideograph */
+ ["\u5A0A", "\u5A0A"], /* CJK Ideograph */
+ ["\u5A0B", "\u5A0B"], /* CJK Ideograph */
+ ["\u5A0C", "\u5A0C"], /* CJK Ideograph */
+ ["\u5A0D", "\u5A0D"], /* CJK Ideograph */
+ ["\u5A0E", "\u5A0E"], /* CJK Ideograph */
+ ["\u5A0F", "\u5A0F"], /* CJK Ideograph */
+ ["\u5A10", "\u5A10"], /* CJK Ideograph */
+ ["\u5A11", "\u5A11"], /* CJK Ideograph */
+ ["\u5A12", "\u5A12"], /* CJK Ideograph */
+ ["\u5A13", "\u5A13"], /* CJK Ideograph */
+ ["\u5A14", "\u5A14"], /* CJK Ideograph */
+ ["\u5A15", "\u5A15"], /* CJK Ideograph */
+ ["\u5A16", "\u5A16"], /* CJK Ideograph */
+ ["\u5A17", "\u5A17"], /* CJK Ideograph */
+ ["\u5A18", "\u5A18"], /* CJK Ideograph */
+ ["\u5A19", "\u5A19"], /* CJK Ideograph */
+ ["\u5A1A", "\u5A1A"], /* CJK Ideograph */
+ ["\u5A1B", "\u5A1B"], /* CJK Ideograph */
+ ["\u5A1C", "\u5A1C"], /* CJK Ideograph */
+ ["\u5A1D", "\u5A1D"], /* CJK Ideograph */
+ ["\u5A1E", "\u5A1E"], /* CJK Ideograph */
+ ["\u5A1F", "\u5A1F"], /* CJK Ideograph */
+ ["\u5A20", "\u5A20"], /* CJK Ideograph */
+ ["\u5A21", "\u5A21"], /* CJK Ideograph */
+ ["\u5A22", "\u5A22"], /* CJK Ideograph */
+ ["\u5A23", "\u5A23"], /* CJK Ideograph */
+ ["\u5A24", "\u5A24"], /* CJK Ideograph */
+ ["\u5A25", "\u5A25"], /* CJK Ideograph */
+ ["\u5A26", "\u5A26"], /* CJK Ideograph */
+ ["\u5A27", "\u5A27"], /* CJK Ideograph */
+ ["\u5A28", "\u5A28"], /* CJK Ideograph */
+ ["\u5A29", "\u5A29"], /* CJK Ideograph */
+ ["\u5A2A", "\u5A2A"], /* CJK Ideograph */
+ ["\u5A2B", "\u5A2B"], /* CJK Ideograph */
+ ["\u5A2C", "\u5A2C"], /* CJK Ideograph */
+ ["\u5A2D", "\u5A2D"], /* CJK Ideograph */
+ ["\u5A2E", "\u5A2E"], /* CJK Ideograph */
+ ["\u5A2F", "\u5A2F"], /* CJK Ideograph */
+ ["\u5A30", "\u5A30"], /* CJK Ideograph */
+ ["\u5A31", "\u5A31"], /* CJK Ideograph */
+ ["\u5A32", "\u5A32"], /* CJK Ideograph */
+ ["\u5A33", "\u5A33"], /* CJK Ideograph */
+ ["\u5A34", "\u5A34"], /* CJK Ideograph */
+ ["\u5A35", "\u5A35"], /* CJK Ideograph */
+ ["\u5A36", "\u5A36"], /* CJK Ideograph */
+ ["\u5A37", "\u5A37"], /* CJK Ideograph */
+ ["\u5A38", "\u5A38"], /* CJK Ideograph */
+ ["\u5A39", "\u5A39"], /* CJK Ideograph */
+ ["\u5A3A", "\u5A3A"], /* CJK Ideograph */
+ ["\u5A3B", "\u5A3B"], /* CJK Ideograph */
+ ["\u5A3C", "\u5A3C"], /* CJK Ideograph */
+ ["\u5A3D", "\u5A3D"], /* CJK Ideograph */
+ ["\u5A3E", "\u5A3E"], /* CJK Ideograph */
+ ["\u5A3F", "\u5A3F"], /* CJK Ideograph */
+ ["\u5A40", "\u5A40"], /* CJK Ideograph */
+ ["\u5A41", "\u5A41"], /* CJK Ideograph */
+ ["\u5A42", "\u5A42"], /* CJK Ideograph */
+ ["\u5A43", "\u5A43"], /* CJK Ideograph */
+ ["\u5A44", "\u5A44"], /* CJK Ideograph */
+ ["\u5A45", "\u5A45"], /* CJK Ideograph */
+ ["\u5A46", "\u5A46"], /* CJK Ideograph */
+ ["\u5A47", "\u5A47"], /* CJK Ideograph */
+ ["\u5A48", "\u5A48"], /* CJK Ideograph */
+ ["\u5A49", "\u5A49"], /* CJK Ideograph */
+ ["\u5A4A", "\u5A4A"], /* CJK Ideograph */
+ ["\u5A4B", "\u5A4B"], /* CJK Ideograph */
+ ["\u5A4C", "\u5A4C"], /* CJK Ideograph */
+ ["\u5A4D", "\u5A4D"], /* CJK Ideograph */
+ ["\u5A4E", "\u5A4E"], /* CJK Ideograph */
+ ["\u5A4F", "\u5A4F"], /* CJK Ideograph */
+ ["\u5A50", "\u5A50"], /* CJK Ideograph */
+ ["\u5A51", "\u5A51"], /* CJK Ideograph */
+ ["\u5A52", "\u5A52"], /* CJK Ideograph */
+ ["\u5A53", "\u5A53"], /* CJK Ideograph */
+ ["\u5A54", "\u5A54"], /* CJK Ideograph */
+ ["\u5A55", "\u5A55"], /* CJK Ideograph */
+ ["\u5A56", "\u5A56"], /* CJK Ideograph */
+ ["\u5A57", "\u5A57"], /* CJK Ideograph */
+ ["\u5A58", "\u5A58"], /* CJK Ideograph */
+ ["\u5A59", "\u5A59"], /* CJK Ideograph */
+ ["\u5A5A", "\u5A5A"], /* CJK Ideograph */
+ ["\u5A5B", "\u5A5B"], /* CJK Ideograph */
+ ["\u5A5C", "\u5A5C"], /* CJK Ideograph */
+ ["\u5A5D", "\u5A5D"], /* CJK Ideograph */
+ ["\u5A5E", "\u5A5E"], /* CJK Ideograph */
+ ["\u5A5F", "\u5A5F"], /* CJK Ideograph */
+ ["\u5A60", "\u5A60"], /* CJK Ideograph */
+ ["\u5A61", "\u5A61"], /* CJK Ideograph */
+ ["\u5A62", "\u5A62"], /* CJK Ideograph */
+ ["\u5A63", "\u5A63"], /* CJK Ideograph */
+ ["\u5A64", "\u5A64"], /* CJK Ideograph */
+ ["\u5A65", "\u5A65"], /* CJK Ideograph */
+ ["\u5A66", "\u5A66"], /* CJK Ideograph */
+ ["\u5A67", "\u5A67"], /* CJK Ideograph */
+ ["\u5A68", "\u5A68"], /* CJK Ideograph */
+ ["\u5A69", "\u5A69"], /* CJK Ideograph */
+ ["\u5A6A", "\u5A6A"], /* CJK Ideograph */
+ ["\u5A6B", "\u5A6B"], /* CJK Ideograph */
+ ["\u5A6C", "\u5A6C"], /* CJK Ideograph */
+ ["\u5A6D", "\u5A6D"], /* CJK Ideograph */
+ ["\u5A6E", "\u5A6E"], /* CJK Ideograph */
+ ["\u5A6F", "\u5A6F"], /* CJK Ideograph */
+ ["\u5A70", "\u5A70"], /* CJK Ideograph */
+ ["\u5A71", "\u5A71"], /* CJK Ideograph */
+ ["\u5A72", "\u5A72"], /* CJK Ideograph */
+ ["\u5A73", "\u5A73"], /* CJK Ideograph */
+ ["\u5A74", "\u5A74"], /* CJK Ideograph */
+ ["\u5A75", "\u5A75"], /* CJK Ideograph */
+ ["\u5A76", "\u5A76"], /* CJK Ideograph */
+ ["\u5A77", "\u5A77"], /* CJK Ideograph */
+ ["\u5A78", "\u5A78"], /* CJK Ideograph */
+ ["\u5A79", "\u5A79"], /* CJK Ideograph */
+ ["\u5A7A", "\u5A7A"], /* CJK Ideograph */
+ ["\u5A7B", "\u5A7B"], /* CJK Ideograph */
+ ["\u5A7C", "\u5A7C"], /* CJK Ideograph */
+ ["\u5A7D", "\u5A7D"], /* CJK Ideograph */
+ ["\u5A7E", "\u5A7E"], /* CJK Ideograph */
+ ["\u5A7F", "\u5A7F"], /* CJK Ideograph */
+ ["\u5A80", "\u5A80"], /* CJK Ideograph */
+ ["\u5A81", "\u5A81"], /* CJK Ideograph */
+ ["\u5A82", "\u5A82"], /* CJK Ideograph */
+ ["\u5A83", "\u5A83"], /* CJK Ideograph */
+ ["\u5A84", "\u5A84"], /* CJK Ideograph */
+ ["\u5A85", "\u5A85"], /* CJK Ideograph */
+ ["\u5A86", "\u5A86"], /* CJK Ideograph */
+ ["\u5A87", "\u5A87"], /* CJK Ideograph */
+ ["\u5A88", "\u5A88"], /* CJK Ideograph */
+ ["\u5A89", "\u5A89"], /* CJK Ideograph */
+ ["\u5A8A", "\u5A8A"], /* CJK Ideograph */
+ ["\u5A8B", "\u5A8B"], /* CJK Ideograph */
+ ["\u5A8C", "\u5A8C"], /* CJK Ideograph */
+ ["\u5A8D", "\u5A8D"], /* CJK Ideograph */
+ ["\u5A8E", "\u5A8E"], /* CJK Ideograph */
+ ["\u5A8F", "\u5A8F"], /* CJK Ideograph */
+ ["\u5A90", "\u5A90"], /* CJK Ideograph */
+ ["\u5A91", "\u5A91"], /* CJK Ideograph */
+ ["\u5A92", "\u5A92"], /* CJK Ideograph */
+ ["\u5A93", "\u5A93"], /* CJK Ideograph */
+ ["\u5A94", "\u5A94"], /* CJK Ideograph */
+ ["\u5A95", "\u5A95"], /* CJK Ideograph */
+ ["\u5A96", "\u5A96"], /* CJK Ideograph */
+ ["\u5A97", "\u5A97"], /* CJK Ideograph */
+ ["\u5A98", "\u5A98"], /* CJK Ideograph */
+ ["\u5A99", "\u5A99"], /* CJK Ideograph */
+ ["\u5A9A", "\u5A9A"], /* CJK Ideograph */
+ ["\u5A9B", "\u5A9B"], /* CJK Ideograph */
+ ["\u5A9C", "\u5A9C"], /* CJK Ideograph */
+ ["\u5A9D", "\u5A9D"], /* CJK Ideograph */
+ ["\u5A9E", "\u5A9E"], /* CJK Ideograph */
+ ["\u5A9F", "\u5A9F"], /* CJK Ideograph */
+ ["\u5AA0", "\u5AA0"], /* CJK Ideograph */
+ ["\u5AA1", "\u5AA1"], /* CJK Ideograph */
+ ["\u5AA2", "\u5AA2"], /* CJK Ideograph */
+ ["\u5AA3", "\u5AA3"], /* CJK Ideograph */
+ ["\u5AA4", "\u5AA4"], /* CJK Ideograph */
+ ["\u5AA5", "\u5AA5"], /* CJK Ideograph */
+ ["\u5AA6", "\u5AA6"], /* CJK Ideograph */
+ ["\u5AA7", "\u5AA7"], /* CJK Ideograph */
+ ["\u5AA8", "\u5AA8"], /* CJK Ideograph */
+ ["\u5AA9", "\u5AA9"], /* CJK Ideograph */
+ ["\u5AAA", "\u5AAA"], /* CJK Ideograph */
+ ["\u5AAB", "\u5AAB"], /* CJK Ideograph */
+ ["\u5AAC", "\u5AAC"], /* CJK Ideograph */
+ ["\u5AAD", "\u5AAD"], /* CJK Ideograph */
+ ["\u5AAE", "\u5AAE"], /* CJK Ideograph */
+ ["\u5AAF", "\u5AAF"], /* CJK Ideograph */
+ ["\u5AB0", "\u5AB0"], /* CJK Ideograph */
+ ["\u5AB1", "\u5AB1"], /* CJK Ideograph */
+ ["\u5AB2", "\u5AB2"], /* CJK Ideograph */
+ ["\u5AB3", "\u5AB3"], /* CJK Ideograph */
+ ["\u5AB4", "\u5AB4"], /* CJK Ideograph */
+ ["\u5AB5", "\u5AB5"], /* CJK Ideograph */
+ ["\u5AB6", "\u5AB6"], /* CJK Ideograph */
+ ["\u5AB7", "\u5AB7"], /* CJK Ideograph */
+ ["\u5AB8", "\u5AB8"], /* CJK Ideograph */
+ ["\u5AB9", "\u5AB9"], /* CJK Ideograph */
+ ["\u5ABA", "\u5ABA"], /* CJK Ideograph */
+ ["\u5ABB", "\u5ABB"], /* CJK Ideograph */
+ ["\u5ABC", "\u5ABC"], /* CJK Ideograph */
+ ["\u5ABD", "\u5ABD"], /* CJK Ideograph */
+ ["\u5ABE", "\u5ABE"], /* CJK Ideograph */
+ ["\u5ABF", "\u5ABF"], /* CJK Ideograph */
+ ["\u5AC0", "\u5AC0"], /* CJK Ideograph */
+ ["\u5AC1", "\u5AC1"], /* CJK Ideograph */
+ ["\u5AC2", "\u5AC2"], /* CJK Ideograph */
+ ["\u5AC3", "\u5AC3"], /* CJK Ideograph */
+ ["\u5AC4", "\u5AC4"], /* CJK Ideograph */
+ ["\u5AC5", "\u5AC5"], /* CJK Ideograph */
+ ["\u5AC6", "\u5AC6"], /* CJK Ideograph */
+ ["\u5AC7", "\u5AC7"], /* CJK Ideograph */
+ ["\u5AC8", "\u5AC8"], /* CJK Ideograph */
+ ["\u5AC9", "\u5AC9"], /* CJK Ideograph */
+ ["\u5ACA", "\u5ACA"], /* CJK Ideograph */
+ ["\u5ACB", "\u5ACB"], /* CJK Ideograph */
+ ["\u5ACC", "\u5ACC"], /* CJK Ideograph */
+ ["\u5ACD", "\u5ACD"], /* CJK Ideograph */
+ ["\u5ACE", "\u5ACE"], /* CJK Ideograph */
+ ["\u5ACF", "\u5ACF"], /* CJK Ideograph */
+ ["\u5AD0", "\u5AD0"], /* CJK Ideograph */
+ ["\u5AD1", "\u5AD1"], /* CJK Ideograph */
+ ["\u5AD2", "\u5AD2"], /* CJK Ideograph */
+ ["\u5AD3", "\u5AD3"], /* CJK Ideograph */
+ ["\u5AD4", "\u5AD4"], /* CJK Ideograph */
+ ["\u5AD5", "\u5AD5"], /* CJK Ideograph */
+ ["\u5AD6", "\u5AD6"], /* CJK Ideograph */
+ ["\u5AD7", "\u5AD7"], /* CJK Ideograph */
+ ["\u5AD8", "\u5AD8"], /* CJK Ideograph */
+ ["\u5AD9", "\u5AD9"], /* CJK Ideograph */
+ ["\u5ADA", "\u5ADA"], /* CJK Ideograph */
+ ["\u5ADB", "\u5ADB"], /* CJK Ideograph */
+ ["\u5ADC", "\u5ADC"], /* CJK Ideograph */
+ ["\u5ADD", "\u5ADD"], /* CJK Ideograph */
+ ["\u5ADE", "\u5ADE"], /* CJK Ideograph */
+ ["\u5ADF", "\u5ADF"], /* CJK Ideograph */
+ ["\u5AE0", "\u5AE0"], /* CJK Ideograph */
+ ["\u5AE1", "\u5AE1"], /* CJK Ideograph */
+ ["\u5AE2", "\u5AE2"], /* CJK Ideograph */
+ ["\u5AE3", "\u5AE3"], /* CJK Ideograph */
+ ["\u5AE4", "\u5AE4"], /* CJK Ideograph */
+ ["\u5AE5", "\u5AE5"], /* CJK Ideograph */
+ ["\u5AE6", "\u5AE6"], /* CJK Ideograph */
+ ["\u5AE7", "\u5AE7"], /* CJK Ideograph */
+ ["\u5AE8", "\u5AE8"], /* CJK Ideograph */
+ ["\u5AE9", "\u5AE9"], /* CJK Ideograph */
+ ["\u5AEA", "\u5AEA"], /* CJK Ideograph */
+ ["\u5AEB", "\u5AEB"], /* CJK Ideograph */
+ ["\u5AEC", "\u5AEC"], /* CJK Ideograph */
+ ["\u5AED", "\u5AED"], /* CJK Ideograph */
+ ["\u5AEE", "\u5AEE"], /* CJK Ideograph */
+ ["\u5AEF", "\u5AEF"], /* CJK Ideograph */
+ ["\u5AF0", "\u5AF0"], /* CJK Ideograph */
+ ["\u5AF1", "\u5AF1"], /* CJK Ideograph */
+ ["\u5AF2", "\u5AF2"], /* CJK Ideograph */
+ ["\u5AF3", "\u5AF3"], /* CJK Ideograph */
+ ["\u5AF4", "\u5AF4"], /* CJK Ideograph */
+ ["\u5AF5", "\u5AF5"], /* CJK Ideograph */
+ ["\u5AF6", "\u5AF6"], /* CJK Ideograph */
+ ["\u5AF7", "\u5AF7"], /* CJK Ideograph */
+ ["\u5AF8", "\u5AF8"], /* CJK Ideograph */
+ ["\u5AF9", "\u5AF9"], /* CJK Ideograph */
+ ["\u5AFA", "\u5AFA"], /* CJK Ideograph */
+ ["\u5AFB", "\u5AFB"], /* CJK Ideograph */
+ ["\u5AFC", "\u5AFC"], /* CJK Ideograph */
+ ["\u5AFD", "\u5AFD"], /* CJK Ideograph */
+ ["\u5AFE", "\u5AFE"], /* CJK Ideograph */
+ ["\u5AFF", "\u5AFF"], /* CJK Ideograph */
+ ["\u5B00", "\u5B00"], /* CJK Ideograph */
+ ["\u5B01", "\u5B01"], /* CJK Ideograph */
+ ["\u5B02", "\u5B02"], /* CJK Ideograph */
+ ["\u5B03", "\u5B03"], /* CJK Ideograph */
+ ["\u5B04", "\u5B04"], /* CJK Ideograph */
+ ["\u5B05", "\u5B05"], /* CJK Ideograph */
+ ["\u5B06", "\u5B06"], /* CJK Ideograph */
+ ["\u5B07", "\u5B07"], /* CJK Ideograph */
+ ["\u5B08", "\u5B08"], /* CJK Ideograph */
+ ["\u5B09", "\u5B09"], /* CJK Ideograph */
+ ["\u5B0A", "\u5B0A"], /* CJK Ideograph */
+ ["\u5B0B", "\u5B0B"], /* CJK Ideograph */
+ ["\u5B0C", "\u5B0C"], /* CJK Ideograph */
+ ["\u5B0D", "\u5B0D"], /* CJK Ideograph */
+ ["\u5B0E", "\u5B0E"], /* CJK Ideograph */
+ ["\u5B0F", "\u5B0F"], /* CJK Ideograph */
+ ["\u5B10", "\u5B10"], /* CJK Ideograph */
+ ["\u5B11", "\u5B11"], /* CJK Ideograph */
+ ["\u5B12", "\u5B12"], /* CJK Ideograph */
+ ["\u5B13", "\u5B13"], /* CJK Ideograph */
+ ["\u5B14", "\u5B14"], /* CJK Ideograph */
+ ["\u5B15", "\u5B15"], /* CJK Ideograph */
+ ["\u5B16", "\u5B16"], /* CJK Ideograph */
+ ["\u5B17", "\u5B17"], /* CJK Ideograph */
+ ["\u5B18", "\u5B18"], /* CJK Ideograph */
+ ["\u5B19", "\u5B19"], /* CJK Ideograph */
+ ["\u5B1A", "\u5B1A"], /* CJK Ideograph */
+ ["\u5B1B", "\u5B1B"], /* CJK Ideograph */
+ ["\u5B1C", "\u5B1C"], /* CJK Ideograph */
+ ["\u5B1D", "\u5B1D"], /* CJK Ideograph */
+ ["\u5B1E", "\u5B1E"], /* CJK Ideograph */
+ ["\u5B1F", "\u5B1F"], /* CJK Ideograph */
+ ["\u5B20", "\u5B20"], /* CJK Ideograph */
+ ["\u5B21", "\u5B21"], /* CJK Ideograph */
+ ["\u5B22", "\u5B22"], /* CJK Ideograph */
+ ["\u5B23", "\u5B23"], /* CJK Ideograph */
+ ["\u5B24", "\u5B24"], /* CJK Ideograph */
+ ["\u5B25", "\u5B25"], /* CJK Ideograph */
+ ["\u5B26", "\u5B26"], /* CJK Ideograph */
+ ["\u5B27", "\u5B27"], /* CJK Ideograph */
+ ["\u5B28", "\u5B28"], /* CJK Ideograph */
+ ["\u5B29", "\u5B29"], /* CJK Ideograph */
+ ["\u5B2A", "\u5B2A"], /* CJK Ideograph */
+ ["\u5B2B", "\u5B2B"], /* CJK Ideograph */
+ ["\u5B2C", "\u5B2C"], /* CJK Ideograph */
+ ["\u5B2D", "\u5B2D"], /* CJK Ideograph */
+ ["\u5B2E", "\u5B2E"], /* CJK Ideograph */
+ ["\u5B2F", "\u5B2F"], /* CJK Ideograph */
+ ["\u5B30", "\u5B30"], /* CJK Ideograph */
+ ["\u5B31", "\u5B31"], /* CJK Ideograph */
+ ["\u5B32", "\u5B32"], /* CJK Ideograph */
+ ["\u5B33", "\u5B33"], /* CJK Ideograph */
+ ["\u5B34", "\u5B34"], /* CJK Ideograph */
+ ["\u5B35", "\u5B35"], /* CJK Ideograph */
+ ["\u5B36", "\u5B36"], /* CJK Ideograph */
+ ["\u5B37", "\u5B37"], /* CJK Ideograph */
+ ["\u5B38", "\u5B38"], /* CJK Ideograph */
+ ["\u5B39", "\u5B39"], /* CJK Ideograph */
+ ["\u5B3A", "\u5B3A"], /* CJK Ideograph */
+ ["\u5B3B", "\u5B3B"], /* CJK Ideograph */
+ ["\u5B3C", "\u5B3C"], /* CJK Ideograph */
+ ["\u5B3D", "\u5B3D"], /* CJK Ideograph */
+ ["\u5B3E", "\u5B3E"], /* CJK Ideograph */
+ ["\u5B3F", "\u5B3F"], /* CJK Ideograph */
+ ["\u5B40", "\u5B40"], /* CJK Ideograph */
+ ["\u5B41", "\u5B41"], /* CJK Ideograph */
+ ["\u5B42", "\u5B42"], /* CJK Ideograph */
+ ["\u5B43", "\u5B43"], /* CJK Ideograph */
+ ["\u5B44", "\u5B44"], /* CJK Ideograph */
+ ["\u5B45", "\u5B45"], /* CJK Ideograph */
+ ["\u5B46", "\u5B46"], /* CJK Ideograph */
+ ["\u5B47", "\u5B47"], /* CJK Ideograph */
+ ["\u5B48", "\u5B48"], /* CJK Ideograph */
+ ["\u5B49", "\u5B49"], /* CJK Ideograph */
+ ["\u5B4A", "\u5B4A"], /* CJK Ideograph */
+ ["\u5B4B", "\u5B4B"], /* CJK Ideograph */
+ ["\u5B4C", "\u5B4C"], /* CJK Ideograph */
+ ["\u5B4D", "\u5B4D"], /* CJK Ideograph */
+ ["\u5B4E", "\u5B4E"], /* CJK Ideograph */
+ ["\u5B4F", "\u5B4F"], /* CJK Ideograph */
+ ["\u5B50", "\u5B50"], /* CJK Ideograph */
+ ["\u5B51", "\u5B51"], /* CJK Ideograph */
+ ["\u5B52", "\u5B52"], /* CJK Ideograph */
+ ["\u5B53", "\u5B53"], /* CJK Ideograph */
+ ["\u5B54", "\u5B54"], /* CJK Ideograph */
+ ["\u5B55", "\u5B55"], /* CJK Ideograph */
+ ["\u5B56", "\u5B56"], /* CJK Ideograph */
+ ["\u5B57", "\u5B57"], /* CJK Ideograph */
+ ["\u5B58", "\u5B58"], /* CJK Ideograph */
+ ["\u5B59", "\u5B59"], /* CJK Ideograph */
+ ["\u5B5A", "\u5B5A"], /* CJK Ideograph */
+ ["\u5B5B", "\u5B5B"], /* CJK Ideograph */
+ ["\u5B5C", "\u5B5C"], /* CJK Ideograph */
+ ["\u5B5D", "\u5B5D"], /* CJK Ideograph */
+ ["\u5B5E", "\u5B5E"], /* CJK Ideograph */
+ ["\u5B5F", "\u5B5F"], /* CJK Ideograph */
+ ["\u5B60", "\u5B60"], /* CJK Ideograph */
+ ["\u5B61", "\u5B61"], /* CJK Ideograph */
+ ["\u5B62", "\u5B62"], /* CJK Ideograph */
+ ["\u5B63", "\u5B63"], /* CJK Ideograph */
+ ["\u5B64", "\u5B64"], /* CJK Ideograph */
+ ["\u5B65", "\u5B65"], /* CJK Ideograph */
+ ["\u5B66", "\u5B66"], /* CJK Ideograph */
+ ["\u5B67", "\u5B67"], /* CJK Ideograph */
+ ["\u5B68", "\u5B68"], /* CJK Ideograph */
+ ["\u5B69", "\u5B69"], /* CJK Ideograph */
+ ["\u5B6A", "\u5B6A"], /* CJK Ideograph */
+ ["\u5B6B", "\u5B6B"], /* CJK Ideograph */
+ ["\u5B6C", "\u5B6C"], /* CJK Ideograph */
+ ["\u5B6D", "\u5B6D"], /* CJK Ideograph */
+ ["\u5B6E", "\u5B6E"], /* CJK Ideograph */
+ ["\u5B6F", "\u5B6F"], /* CJK Ideograph */
+ ["\u5B70", "\u5B70"], /* CJK Ideograph */
+ ["\u5B71", "\u5B71"], /* CJK Ideograph */
+ ["\u5B72", "\u5B72"], /* CJK Ideograph */
+ ["\u5B73", "\u5B73"], /* CJK Ideograph */
+ ["\u5B74", "\u5B74"], /* CJK Ideograph */
+ ["\u5B75", "\u5B75"], /* CJK Ideograph */
+ ["\u5B76", "\u5B76"], /* CJK Ideograph */
+ ["\u5B77", "\u5B77"], /* CJK Ideograph */
+ ["\u5B78", "\u5B78"], /* CJK Ideograph */
+ ["\u5B79", "\u5B79"], /* CJK Ideograph */
+ ["\u5B7A", "\u5B7A"], /* CJK Ideograph */
+ ["\u5B7B", "\u5B7B"], /* CJK Ideograph */
+ ["\u5B7C", "\u5B7C"], /* CJK Ideograph */
+ ["\u5B7D", "\u5B7D"], /* CJK Ideograph */
+ ["\u5B7E", "\u5B7E"], /* CJK Ideograph */
+ ["\u5B7F", "\u5B7F"], /* CJK Ideograph */
+ ["\u5B80", "\u5B80"], /* CJK Ideograph */
+ ["\u5B81", "\u5B81"], /* CJK Ideograph */
+ ["\u5B82", "\u5B82"], /* CJK Ideograph */
+ ["\u5B83", "\u5B83"], /* CJK Ideograph */
+ ["\u5B84", "\u5B84"], /* CJK Ideograph */
+ ["\u5B85", "\u5B85"], /* CJK Ideograph */
+ ["\u5B86", "\u5B86"], /* CJK Ideograph */
+ ["\u5B87", "\u5B87"], /* CJK Ideograph */
+ ["\u5B88", "\u5B88"], /* CJK Ideograph */
+ ["\u5B89", "\u5B89"], /* CJK Ideograph */
+ ["\u5B8A", "\u5B8A"], /* CJK Ideograph */
+ ["\u5B8B", "\u5B8B"], /* CJK Ideograph */
+ ["\u5B8C", "\u5B8C"], /* CJK Ideograph */
+ ["\u5B8D", "\u5B8D"], /* CJK Ideograph */
+ ["\u5B8E", "\u5B8E"], /* CJK Ideograph */
+ ["\u5B8F", "\u5B8F"], /* CJK Ideograph */
+ ["\u5B90", "\u5B90"], /* CJK Ideograph */
+ ["\u5B91", "\u5B91"], /* CJK Ideograph */
+ ["\u5B92", "\u5B92"], /* CJK Ideograph */
+ ["\u5B93", "\u5B93"], /* CJK Ideograph */
+ ["\u5B94", "\u5B94"], /* CJK Ideograph */
+ ["\u5B95", "\u5B95"], /* CJK Ideograph */
+ ["\u5B96", "\u5B96"], /* CJK Ideograph */
+ ["\u5B97", "\u5B97"], /* CJK Ideograph */
+ ["\u5B98", "\u5B98"], /* CJK Ideograph */
+ ["\u5B99", "\u5B99"], /* CJK Ideograph */
+ ["\u5B9A", "\u5B9A"], /* CJK Ideograph */
+ ["\u5B9B", "\u5B9B"], /* CJK Ideograph */
+ ["\u5B9C", "\u5B9C"], /* CJK Ideograph */
+ ["\u5B9D", "\u5B9D"], /* CJK Ideograph */
+ ["\u5B9E", "\u5B9E"], /* CJK Ideograph */
+ ["\u5B9F", "\u5B9F"], /* CJK Ideograph */
+ ["\u5BA0", "\u5BA0"], /* CJK Ideograph */
+ ["\u5BA1", "\u5BA1"], /* CJK Ideograph */
+ ["\u5BA2", "\u5BA2"], /* CJK Ideograph */
+ ["\u5BA3", "\u5BA3"], /* CJK Ideograph */
+ ["\u5BA4", "\u5BA4"], /* CJK Ideograph */
+ ["\u5BA5", "\u5BA5"], /* CJK Ideograph */
+ ["\u5BA6", "\u5BA6"], /* CJK Ideograph */
+ ["\u5BA7", "\u5BA7"], /* CJK Ideograph */
+ ["\u5BA8", "\u5BA8"], /* CJK Ideograph */
+ ["\u5BA9", "\u5BA9"], /* CJK Ideograph */
+ ["\u5BAA", "\u5BAA"], /* CJK Ideograph */
+ ["\u5BAB", "\u5BAB"], /* CJK Ideograph */
+ ["\u5BAC", "\u5BAC"], /* CJK Ideograph */
+ ["\u5BAD", "\u5BAD"], /* CJK Ideograph */
+ ["\u5BAE", "\u5BAE"], /* CJK Ideograph */
+ ["\u5BAF", "\u5BAF"], /* CJK Ideograph */
+ ["\u5BB0", "\u5BB0"], /* CJK Ideograph */
+ ["\u5BB1", "\u5BB1"], /* CJK Ideograph */
+ ["\u5BB2", "\u5BB2"], /* CJK Ideograph */
+ ["\u5BB3", "\u5BB3"], /* CJK Ideograph */
+ ["\u5BB4", "\u5BB4"], /* CJK Ideograph */
+ ["\u5BB5", "\u5BB5"], /* CJK Ideograph */
+ ["\u5BB6", "\u5BB6"], /* CJK Ideograph */
+ ["\u5BB7", "\u5BB7"], /* CJK Ideograph */
+ ["\u5BB8", "\u5BB8"], /* CJK Ideograph */
+ ["\u5BB9", "\u5BB9"], /* CJK Ideograph */
+ ["\u5BBA", "\u5BBA"], /* CJK Ideograph */
+ ["\u5BBB", "\u5BBB"], /* CJK Ideograph */
+ ["\u5BBC", "\u5BBC"], /* CJK Ideograph */
+ ["\u5BBD", "\u5BBD"], /* CJK Ideograph */
+ ["\u5BBE", "\u5BBE"], /* CJK Ideograph */
+ ["\u5BBF", "\u5BBF"], /* CJK Ideograph */
+ ["\u5BC0", "\u5BC0"], /* CJK Ideograph */
+ ["\u5BC1", "\u5BC1"], /* CJK Ideograph */
+ ["\u5BC2", "\u5BC2"], /* CJK Ideograph */
+ ["\u5BC3", "\u5BC3"], /* CJK Ideograph */
+ ["\u5BC4", "\u5BC4"], /* CJK Ideograph */
+ ["\u5BC5", "\u5BC5"], /* CJK Ideograph */
+ ["\u5BC6", "\u5BC6"], /* CJK Ideograph */
+ ["\u5BC7", "\u5BC7"], /* CJK Ideograph */
+ ["\u5BC8", "\u5BC8"], /* CJK Ideograph */
+ ["\u5BC9", "\u5BC9"], /* CJK Ideograph */
+ ["\u5BCA", "\u5BCA"], /* CJK Ideograph */
+ ["\u5BCB", "\u5BCB"], /* CJK Ideograph */
+ ["\u5BCC", "\u5BCC"], /* CJK Ideograph */
+ ["\u5BCD", "\u5BCD"], /* CJK Ideograph */
+ ["\u5BCE", "\u5BCE"], /* CJK Ideograph */
+ ["\u5BCF", "\u5BCF"], /* CJK Ideograph */
+ ["\u5BD0", "\u5BD0"], /* CJK Ideograph */
+ ["\u5BD1", "\u5BD1"], /* CJK Ideograph */
+ ["\u5BD2", "\u5BD2"], /* CJK Ideograph */
+ ["\u5BD3", "\u5BD3"], /* CJK Ideograph */
+ ["\u5BD4", "\u5BD4"], /* CJK Ideograph */
+ ["\u5BD5", "\u5BD5"], /* CJK Ideograph */
+ ["\u5BD6", "\u5BD6"], /* CJK Ideograph */
+ ["\u5BD7", "\u5BD7"], /* CJK Ideograph */
+ ["\u5BD8", "\u5BD8"], /* CJK Ideograph */
+ ["\u5BD9", "\u5BD9"], /* CJK Ideograph */
+ ["\u5BDA", "\u5BDA"], /* CJK Ideograph */
+ ["\u5BDB", "\u5BDB"], /* CJK Ideograph */
+ ["\u5BDC", "\u5BDC"], /* CJK Ideograph */
+ ["\u5BDD", "\u5BDD"], /* CJK Ideograph */
+ ["\u5BDE", "\u5BDE"], /* CJK Ideograph */
+ ["\u5BDF", "\u5BDF"], /* CJK Ideograph */
+ ["\u5BE0", "\u5BE0"], /* CJK Ideograph */
+ ["\u5BE1", "\u5BE1"], /* CJK Ideograph */
+ ["\u5BE2", "\u5BE2"], /* CJK Ideograph */
+ ["\u5BE3", "\u5BE3"], /* CJK Ideograph */
+ ["\u5BE4", "\u5BE4"], /* CJK Ideograph */
+ ["\u5BE5", "\u5BE5"], /* CJK Ideograph */
+ ["\u5BE6", "\u5BE6"], /* CJK Ideograph */
+ ["\u5BE7", "\u5BE7"], /* CJK Ideograph */
+ ["\u5BE8", "\u5BE8"], /* CJK Ideograph */
+ ["\u5BE9", "\u5BE9"], /* CJK Ideograph */
+ ["\u5BEA", "\u5BEA"], /* CJK Ideograph */
+ ["\u5BEB", "\u5BEB"], /* CJK Ideograph */
+ ["\u5BEC", "\u5BEC"], /* CJK Ideograph */
+ ["\u5BED", "\u5BED"], /* CJK Ideograph */
+ ["\u5BEE", "\u5BEE"], /* CJK Ideograph */
+ ["\u5BEF", "\u5BEF"], /* CJK Ideograph */
+ ["\u5BF0", "\u5BF0"], /* CJK Ideograph */
+ ["\u5BF1", "\u5BF1"], /* CJK Ideograph */
+ ["\u5BF2", "\u5BF2"], /* CJK Ideograph */
+ ["\u5BF3", "\u5BF3"], /* CJK Ideograph */
+ ["\u5BF4", "\u5BF4"], /* CJK Ideograph */
+ ["\u5BF5", "\u5BF5"], /* CJK Ideograph */
+ ["\u5BF6", "\u5BF6"], /* CJK Ideograph */
+ ["\u5BF7", "\u5BF7"], /* CJK Ideograph */
+ ["\u5BF8", "\u5BF8"], /* CJK Ideograph */
+ ["\u5BF9", "\u5BF9"], /* CJK Ideograph */
+ ["\u5BFA", "\u5BFA"], /* CJK Ideograph */
+ ["\u5BFB", "\u5BFB"], /* CJK Ideograph */
+ ["\u5BFC", "\u5BFC"], /* CJK Ideograph */
+ ["\u5BFD", "\u5BFD"], /* CJK Ideograph */
+ ["\u5BFE", "\u5BFE"], /* CJK Ideograph */
+ ["\u5BFF", "\u5BFF"], /* CJK Ideograph */
+ ["\u5C00", "\u5C00"], /* CJK Ideograph */
+ ["\u5C01", "\u5C01"], /* CJK Ideograph */
+ ["\u5C02", "\u5C02"], /* CJK Ideograph */
+ ["\u5C03", "\u5C03"], /* CJK Ideograph */
+ ["\u5C04", "\u5C04"], /* CJK Ideograph */
+ ["\u5C05", "\u5C05"], /* CJK Ideograph */
+ ["\u5C06", "\u5C06"], /* CJK Ideograph */
+ ["\u5C07", "\u5C07"], /* CJK Ideograph */
+ ["\u5C08", "\u5C08"], /* CJK Ideograph */
+ ["\u5C09", "\u5C09"], /* CJK Ideograph */
+ ["\u5C0A", "\u5C0A"], /* CJK Ideograph */
+ ["\u5C0B", "\u5C0B"], /* CJK Ideograph */
+ ["\u5C0C", "\u5C0C"], /* CJK Ideograph */
+ ["\u5C0D", "\u5C0D"], /* CJK Ideograph */
+ ["\u5C0E", "\u5C0E"], /* CJK Ideograph */
+ ["\u5C0F", "\u5C0F"], /* CJK Ideograph */
+ ["\u5C10", "\u5C10"], /* CJK Ideograph */
+ ["\u5C11", "\u5C11"], /* CJK Ideograph */
+ ["\u5C12", "\u5C12"], /* CJK Ideograph */
+ ["\u5C13", "\u5C13"], /* CJK Ideograph */
+ ["\u5C14", "\u5C14"], /* CJK Ideograph */
+ ["\u5C15", "\u5C15"], /* CJK Ideograph */
+ ["\u5C16", "\u5C16"], /* CJK Ideograph */
+ ["\u5C17", "\u5C17"], /* CJK Ideograph */
+ ["\u5C18", "\u5C18"], /* CJK Ideograph */
+ ["\u5C19", "\u5C19"], /* CJK Ideograph */
+ ["\u5C1A", "\u5C1A"], /* CJK Ideograph */
+ ["\u5C1B", "\u5C1B"], /* CJK Ideograph */
+ ["\u5C1C", "\u5C1C"], /* CJK Ideograph */
+ ["\u5C1D", "\u5C1D"], /* CJK Ideograph */
+ ["\u5C1E", "\u5C1E"], /* CJK Ideograph */
+ ["\u5C1F", "\u5C1F"], /* CJK Ideograph */
+ ["\u5C20", "\u5C20"], /* CJK Ideograph */
+ ["\u5C21", "\u5C21"], /* CJK Ideograph */
+ ["\u5C22", "\u5C22"], /* CJK Ideograph */
+ ["\u5C23", "\u5C23"], /* CJK Ideograph */
+ ["\u5C24", "\u5C24"], /* CJK Ideograph */
+ ["\u5C25", "\u5C25"], /* CJK Ideograph */
+ ["\u5C26", "\u5C26"], /* CJK Ideograph */
+ ["\u5C27", "\u5C27"], /* CJK Ideograph */
+ ["\u5C28", "\u5C28"], /* CJK Ideograph */
+ ["\u5C29", "\u5C29"], /* CJK Ideograph */
+ ["\u5C2A", "\u5C2A"], /* CJK Ideograph */
+ ["\u5C2B", "\u5C2B"], /* CJK Ideograph */
+ ["\u5C2C", "\u5C2C"], /* CJK Ideograph */
+ ["\u5C2D", "\u5C2D"], /* CJK Ideograph */
+ ["\u5C2E", "\u5C2E"], /* CJK Ideograph */
+ ["\u5C2F", "\u5C2F"], /* CJK Ideograph */
+ ["\u5C30", "\u5C30"], /* CJK Ideograph */
+ ["\u5C31", "\u5C31"], /* CJK Ideograph */
+ ["\u5C32", "\u5C32"], /* CJK Ideograph */
+ ["\u5C33", "\u5C33"], /* CJK Ideograph */
+ ["\u5C34", "\u5C34"], /* CJK Ideograph */
+ ["\u5C35", "\u5C35"], /* CJK Ideograph */
+ ["\u5C36", "\u5C36"], /* CJK Ideograph */
+ ["\u5C37", "\u5C37"], /* CJK Ideograph */
+ ["\u5C38", "\u5C38"], /* CJK Ideograph */
+ ["\u5C39", "\u5C39"], /* CJK Ideograph */
+ ["\u5C3A", "\u5C3A"], /* CJK Ideograph */
+ ["\u5C3B", "\u5C3B"], /* CJK Ideograph */
+ ["\u5C3C", "\u5C3C"], /* CJK Ideograph */
+ ["\u5C3D", "\u5C3D"], /* CJK Ideograph */
+ ["\u5C3E", "\u5C3E"], /* CJK Ideograph */
+ ["\u5C3F", "\u5C3F"], /* CJK Ideograph */
+ ["\u5C40", "\u5C40"], /* CJK Ideograph */
+ ["\u5C41", "\u5C41"], /* CJK Ideograph */
+ ["\u5C42", "\u5C42"], /* CJK Ideograph */
+ ["\u5C43", "\u5C43"], /* CJK Ideograph */
+ ["\u5C44", "\u5C44"], /* CJK Ideograph */
+ ["\u5C45", "\u5C45"], /* CJK Ideograph */
+ ["\u5C46", "\u5C46"], /* CJK Ideograph */
+ ["\u5C47", "\u5C47"], /* CJK Ideograph */
+ ["\u5C48", "\u5C48"], /* CJK Ideograph */
+ ["\u5C49", "\u5C49"], /* CJK Ideograph */
+ ["\u5C4A", "\u5C4A"], /* CJK Ideograph */
+ ["\u5C4B", "\u5C4B"], /* CJK Ideograph */
+ ["\u5C4C", "\u5C4C"], /* CJK Ideograph */
+ ["\u5C4D", "\u5C4D"], /* CJK Ideograph */
+ ["\u5C4E", "\u5C4E"], /* CJK Ideograph */
+ ["\u5C4F", "\u5C4F"], /* CJK Ideograph */
+ ["\u5C50", "\u5C50"], /* CJK Ideograph */
+ ["\u5C51", "\u5C51"], /* CJK Ideograph */
+ ["\u5C52", "\u5C52"], /* CJK Ideograph */
+ ["\u5C53", "\u5C53"], /* CJK Ideograph */
+ ["\u5C54", "\u5C54"], /* CJK Ideograph */
+ ["\u5C55", "\u5C55"], /* CJK Ideograph */
+ ["\u5C56", "\u5C56"], /* CJK Ideograph */
+ ["\u5C57", "\u5C57"], /* CJK Ideograph */
+ ["\u5C58", "\u5C58"], /* CJK Ideograph */
+ ["\u5C59", "\u5C59"], /* CJK Ideograph */
+ ["\u5C5A", "\u5C5A"], /* CJK Ideograph */
+ ["\u5C5B", "\u5C5B"], /* CJK Ideograph */
+ ["\u5C5C", "\u5C5C"], /* CJK Ideograph */
+ ["\u5C5D", "\u5C5D"], /* CJK Ideograph */
+ ["\u5C5E", "\u5C5E"], /* CJK Ideograph */
+ ["\u5C5F", "\u5C5F"], /* CJK Ideograph */
+ ["\u5C60", "\u5C60"], /* CJK Ideograph */
+ ["\u5C61", "\u5C61"], /* CJK Ideograph */
+ ["\u5C62", "\u5C62"], /* CJK Ideograph */
+ ["\u5C63", "\u5C63"], /* CJK Ideograph */
+ ["\u5C64", "\u5C64"], /* CJK Ideograph */
+ ["\u5C65", "\u5C65"], /* CJK Ideograph */
+ ["\u5C66", "\u5C66"], /* CJK Ideograph */
+ ["\u5C67", "\u5C67"], /* CJK Ideograph */
+ ["\u5C68", "\u5C68"], /* CJK Ideograph */
+ ["\u5C69", "\u5C69"], /* CJK Ideograph */
+ ["\u5C6A", "\u5C6A"], /* CJK Ideograph */
+ ["\u5C6B", "\u5C6B"], /* CJK Ideograph */
+ ["\u5C6C", "\u5C6C"], /* CJK Ideograph */
+ ["\u5C6D", "\u5C6D"], /* CJK Ideograph */
+ ["\u5C6E", "\u5C6E"], /* CJK Ideograph */
+ ["\u5C6F", "\u5C6F"], /* CJK Ideograph */
+ ["\u5C70", "\u5C70"], /* CJK Ideograph */
+ ["\u5C71", "\u5C71"], /* CJK Ideograph */
+ ["\u5C72", "\u5C72"], /* CJK Ideograph */
+ ["\u5C73", "\u5C73"], /* CJK Ideograph */
+ ["\u5C74", "\u5C74"], /* CJK Ideograph */
+ ["\u5C75", "\u5C75"], /* CJK Ideograph */
+ ["\u5C76", "\u5C76"], /* CJK Ideograph */
+ ["\u5C77", "\u5C77"], /* CJK Ideograph */
+ ["\u5C78", "\u5C78"], /* CJK Ideograph */
+ ["\u5C79", "\u5C79"], /* CJK Ideograph */
+ ["\u5C7A", "\u5C7A"], /* CJK Ideograph */
+ ["\u5C7B", "\u5C7B"], /* CJK Ideograph */
+ ["\u5C7C", "\u5C7C"], /* CJK Ideograph */
+ ["\u5C7D", "\u5C7D"], /* CJK Ideograph */
+ ["\u5C7E", "\u5C7E"], /* CJK Ideograph */
+ ["\u5C7F", "\u5C7F"], /* CJK Ideograph */
+ ["\u5C80", "\u5C80"], /* CJK Ideograph */
+ ["\u5C81", "\u5C81"], /* CJK Ideograph */
+ ["\u5C82", "\u5C82"], /* CJK Ideograph */
+ ["\u5C83", "\u5C83"], /* CJK Ideograph */
+ ["\u5C84", "\u5C84"], /* CJK Ideograph */
+ ["\u5C85", "\u5C85"], /* CJK Ideograph */
+ ["\u5C86", "\u5C86"], /* CJK Ideograph */
+ ["\u5C87", "\u5C87"], /* CJK Ideograph */
+ ["\u5C88", "\u5C88"], /* CJK Ideograph */
+ ["\u5C89", "\u5C89"], /* CJK Ideograph */
+ ["\u5C8A", "\u5C8A"], /* CJK Ideograph */
+ ["\u5C8B", "\u5C8B"], /* CJK Ideograph */
+ ["\u5C8C", "\u5C8C"], /* CJK Ideograph */
+ ["\u5C8D", "\u5C8D"], /* CJK Ideograph */
+ ["\u5C8E", "\u5C8E"], /* CJK Ideograph */
+ ["\u5C8F", "\u5C8F"], /* CJK Ideograph */
+ ["\u5C90", "\u5C90"], /* CJK Ideograph */
+ ["\u5C91", "\u5C91"], /* CJK Ideograph */
+ ["\u5C92", "\u5C92"], /* CJK Ideograph */
+ ["\u5C93", "\u5C93"], /* CJK Ideograph */
+ ["\u5C94", "\u5C94"], /* CJK Ideograph */
+ ["\u5C95", "\u5C95"], /* CJK Ideograph */
+ ["\u5C96", "\u5C96"], /* CJK Ideograph */
+ ["\u5C97", "\u5C97"], /* CJK Ideograph */
+ ["\u5C98", "\u5C98"], /* CJK Ideograph */
+ ["\u5C99", "\u5C99"], /* CJK Ideograph */
+ ["\u5C9A", "\u5C9A"], /* CJK Ideograph */
+ ["\u5C9B", "\u5C9B"], /* CJK Ideograph */
+ ["\u5C9C", "\u5C9C"], /* CJK Ideograph */
+ ["\u5C9D", "\u5C9D"], /* CJK Ideograph */
+ ["\u5C9E", "\u5C9E"], /* CJK Ideograph */
+ ["\u5C9F", "\u5C9F"], /* CJK Ideograph */
+ ["\u5CA0", "\u5CA0"], /* CJK Ideograph */
+ ["\u5CA1", "\u5CA1"], /* CJK Ideograph */
+ ["\u5CA2", "\u5CA2"], /* CJK Ideograph */
+ ["\u5CA3", "\u5CA3"], /* CJK Ideograph */
+ ["\u5CA4", "\u5CA4"], /* CJK Ideograph */
+ ["\u5CA5", "\u5CA5"], /* CJK Ideograph */
+ ["\u5CA6", "\u5CA6"], /* CJK Ideograph */
+ ["\u5CA7", "\u5CA7"], /* CJK Ideograph */
+ ["\u5CA8", "\u5CA8"], /* CJK Ideograph */
+ ["\u5CA9", "\u5CA9"], /* CJK Ideograph */
+ ["\u5CAA", "\u5CAA"], /* CJK Ideograph */
+ ["\u5CAB", "\u5CAB"], /* CJK Ideograph */
+ ["\u5CAC", "\u5CAC"], /* CJK Ideograph */
+ ["\u5CAD", "\u5CAD"], /* CJK Ideograph */
+ ["\u5CAE", "\u5CAE"], /* CJK Ideograph */
+ ["\u5CAF", "\u5CAF"], /* CJK Ideograph */
+ ["\u5CB0", "\u5CB0"], /* CJK Ideograph */
+ ["\u5CB1", "\u5CB1"], /* CJK Ideograph */
+ ["\u5CB2", "\u5CB2"], /* CJK Ideograph */
+ ["\u5CB3", "\u5CB3"], /* CJK Ideograph */
+ ["\u5CB4", "\u5CB4"], /* CJK Ideograph */
+ ["\u5CB5", "\u5CB5"], /* CJK Ideograph */
+ ["\u5CB6", "\u5CB6"], /* CJK Ideograph */
+ ["\u5CB7", "\u5CB7"], /* CJK Ideograph */
+ ["\u5CB8", "\u5CB8"], /* CJK Ideograph */
+ ["\u5CB9", "\u5CB9"], /* CJK Ideograph */
+ ["\u5CBA", "\u5CBA"], /* CJK Ideograph */
+ ["\u5CBB", "\u5CBB"], /* CJK Ideograph */
+ ["\u5CBC", "\u5CBC"], /* CJK Ideograph */
+ ["\u5CBD", "\u5CBD"], /* CJK Ideograph */
+ ["\u5CBE", "\u5CBE"], /* CJK Ideograph */
+ ["\u5CBF", "\u5CBF"], /* CJK Ideograph */
+ ["\u5CC0", "\u5CC0"], /* CJK Ideograph */
+ ["\u5CC1", "\u5CC1"], /* CJK Ideograph */
+ ["\u5CC2", "\u5CC2"], /* CJK Ideograph */
+ ["\u5CC3", "\u5CC3"], /* CJK Ideograph */
+ ["\u5CC4", "\u5CC4"], /* CJK Ideograph */
+ ["\u5CC5", "\u5CC5"], /* CJK Ideograph */
+ ["\u5CC6", "\u5CC6"], /* CJK Ideograph */
+ ["\u5CC7", "\u5CC7"], /* CJK Ideograph */
+ ["\u5CC8", "\u5CC8"], /* CJK Ideograph */
+ ["\u5CC9", "\u5CC9"], /* CJK Ideograph */
+ ["\u5CCA", "\u5CCA"], /* CJK Ideograph */
+ ["\u5CCB", "\u5CCB"], /* CJK Ideograph */
+ ["\u5CCC", "\u5CCC"], /* CJK Ideograph */
+ ["\u5CCD", "\u5CCD"], /* CJK Ideograph */
+ ["\u5CCE", "\u5CCE"], /* CJK Ideograph */
+ ["\u5CCF", "\u5CCF"], /* CJK Ideograph */
+ ["\u5CD0", "\u5CD0"], /* CJK Ideograph */
+ ["\u5CD1", "\u5CD1"], /* CJK Ideograph */
+ ["\u5CD2", "\u5CD2"], /* CJK Ideograph */
+ ["\u5CD3", "\u5CD3"], /* CJK Ideograph */
+ ["\u5CD4", "\u5CD4"], /* CJK Ideograph */
+ ["\u5CD5", "\u5CD5"], /* CJK Ideograph */
+ ["\u5CD6", "\u5CD6"], /* CJK Ideograph */
+ ["\u5CD7", "\u5CD7"], /* CJK Ideograph */
+ ["\u5CD8", "\u5CD8"], /* CJK Ideograph */
+ ["\u5CD9", "\u5CD9"], /* CJK Ideograph */
+ ["\u5CDA", "\u5CDA"], /* CJK Ideograph */
+ ["\u5CDB", "\u5CDB"], /* CJK Ideograph */
+ ["\u5CDC", "\u5CDC"], /* CJK Ideograph */
+ ["\u5CDD", "\u5CDD"], /* CJK Ideograph */
+ ["\u5CDE", "\u5CDE"], /* CJK Ideograph */
+ ["\u5CDF", "\u5CDF"], /* CJK Ideograph */
+ ["\u5CE0", "\u5CE0"], /* CJK Ideograph */
+ ["\u5CE1", "\u5CE1"], /* CJK Ideograph */
+ ["\u5CE2", "\u5CE2"], /* CJK Ideograph */
+ ["\u5CE3", "\u5CE3"], /* CJK Ideograph */
+ ["\u5CE4", "\u5CE4"], /* CJK Ideograph */
+ ["\u5CE5", "\u5CE5"], /* CJK Ideograph */
+ ["\u5CE6", "\u5CE6"], /* CJK Ideograph */
+ ["\u5CE7", "\u5CE7"], /* CJK Ideograph */
+ ["\u5CE8", "\u5CE8"], /* CJK Ideograph */
+ ["\u5CE9", "\u5CE9"], /* CJK Ideograph */
+ ["\u5CEA", "\u5CEA"], /* CJK Ideograph */
+ ["\u5CEB", "\u5CEB"], /* CJK Ideograph */
+ ["\u5CEC", "\u5CEC"], /* CJK Ideograph */
+ ["\u5CED", "\u5CED"], /* CJK Ideograph */
+ ["\u5CEE", "\u5CEE"], /* CJK Ideograph */
+ ["\u5CEF", "\u5CEF"], /* CJK Ideograph */
+ ["\u5CF0", "\u5CF0"], /* CJK Ideograph */
+ ["\u5CF1", "\u5CF1"], /* CJK Ideograph */
+ ["\u5CF2", "\u5CF2"], /* CJK Ideograph */
+ ["\u5CF3", "\u5CF3"], /* CJK Ideograph */
+ ["\u5CF4", "\u5CF4"], /* CJK Ideograph */
+ ["\u5CF5", "\u5CF5"], /* CJK Ideograph */
+ ["\u5CF6", "\u5CF6"], /* CJK Ideograph */
+ ["\u5CF7", "\u5CF7"], /* CJK Ideograph */
+ ["\u5CF8", "\u5CF8"], /* CJK Ideograph */
+ ["\u5CF9", "\u5CF9"], /* CJK Ideograph */
+ ["\u5CFA", "\u5CFA"], /* CJK Ideograph */
+ ["\u5CFB", "\u5CFB"], /* CJK Ideograph */
+ ["\u5CFC", "\u5CFC"], /* CJK Ideograph */
+ ["\u5CFD", "\u5CFD"], /* CJK Ideograph */
+ ["\u5CFE", "\u5CFE"], /* CJK Ideograph */
+ ["\u5CFF", "\u5CFF"], /* CJK Ideograph */
+ ["\u5D00", "\u5D00"], /* CJK Ideograph */
+ ["\u5D01", "\u5D01"], /* CJK Ideograph */
+ ["\u5D02", "\u5D02"], /* CJK Ideograph */
+ ["\u5D03", "\u5D03"], /* CJK Ideograph */
+ ["\u5D04", "\u5D04"], /* CJK Ideograph */
+ ["\u5D05", "\u5D05"], /* CJK Ideograph */
+ ["\u5D06", "\u5D06"], /* CJK Ideograph */
+ ["\u5D07", "\u5D07"], /* CJK Ideograph */
+ ["\u5D08", "\u5D08"], /* CJK Ideograph */
+ ["\u5D09", "\u5D09"], /* CJK Ideograph */
+ ["\u5D0A", "\u5D0A"], /* CJK Ideograph */
+ ["\u5D0B", "\u5D0B"], /* CJK Ideograph */
+ ["\u5D0C", "\u5D0C"], /* CJK Ideograph */
+ ["\u5D0D", "\u5D0D"], /* CJK Ideograph */
+ ["\u5D0E", "\u5D0E"], /* CJK Ideograph */
+ ["\u5D0F", "\u5D0F"], /* CJK Ideograph */
+ ["\u5D10", "\u5D10"], /* CJK Ideograph */
+ ["\u5D11", "\u5D11"], /* CJK Ideograph */
+ ["\u5D12", "\u5D12"], /* CJK Ideograph */
+ ["\u5D13", "\u5D13"], /* CJK Ideograph */
+ ["\u5D14", "\u5D14"], /* CJK Ideograph */
+ ["\u5D15", "\u5D15"], /* CJK Ideograph */
+ ["\u5D16", "\u5D16"], /* CJK Ideograph */
+ ["\u5D17", "\u5D17"], /* CJK Ideograph */
+ ["\u5D18", "\u5D18"], /* CJK Ideograph */
+ ["\u5D19", "\u5D19"], /* CJK Ideograph */
+ ["\u5D1A", "\u5D1A"], /* CJK Ideograph */
+ ["\u5D1B", "\u5D1B"], /* CJK Ideograph */
+ ["\u5D1C", "\u5D1C"], /* CJK Ideograph */
+ ["\u5D1D", "\u5D1D"], /* CJK Ideograph */
+ ["\u5D1E", "\u5D1E"], /* CJK Ideograph */
+ ["\u5D1F", "\u5D1F"], /* CJK Ideograph */
+ ["\u5D20", "\u5D20"], /* CJK Ideograph */
+ ["\u5D21", "\u5D21"], /* CJK Ideograph */
+ ["\u5D22", "\u5D22"], /* CJK Ideograph */
+ ["\u5D23", "\u5D23"], /* CJK Ideograph */
+ ["\u5D24", "\u5D24"], /* CJK Ideograph */
+ ["\u5D25", "\u5D25"], /* CJK Ideograph */
+ ["\u5D26", "\u5D26"], /* CJK Ideograph */
+ ["\u5D27", "\u5D27"], /* CJK Ideograph */
+ ["\u5D28", "\u5D28"], /* CJK Ideograph */
+ ["\u5D29", "\u5D29"], /* CJK Ideograph */
+ ["\u5D2A", "\u5D2A"], /* CJK Ideograph */
+ ["\u5D2B", "\u5D2B"], /* CJK Ideograph */
+ ["\u5D2C", "\u5D2C"], /* CJK Ideograph */
+ ["\u5D2D", "\u5D2D"], /* CJK Ideograph */
+ ["\u5D2E", "\u5D2E"], /* CJK Ideograph */
+ ["\u5D2F", "\u5D2F"], /* CJK Ideograph */
+ ["\u5D30", "\u5D30"], /* CJK Ideograph */
+ ["\u5D31", "\u5D31"], /* CJK Ideograph */
+ ["\u5D32", "\u5D32"], /* CJK Ideograph */
+ ["\u5D33", "\u5D33"], /* CJK Ideograph */
+ ["\u5D34", "\u5D34"], /* CJK Ideograph */
+ ["\u5D35", "\u5D35"], /* CJK Ideograph */
+ ["\u5D36", "\u5D36"], /* CJK Ideograph */
+ ["\u5D37", "\u5D37"], /* CJK Ideograph */
+ ["\u5D38", "\u5D38"], /* CJK Ideograph */
+ ["\u5D39", "\u5D39"], /* CJK Ideograph */
+ ["\u5D3A", "\u5D3A"], /* CJK Ideograph */
+ ["\u5D3B", "\u5D3B"], /* CJK Ideograph */
+ ["\u5D3C", "\u5D3C"], /* CJK Ideograph */
+ ["\u5D3D", "\u5D3D"], /* CJK Ideograph */
+ ["\u5D3E", "\u5D3E"], /* CJK Ideograph */
+ ["\u5D3F", "\u5D3F"], /* CJK Ideograph */
+ ["\u5D40", "\u5D40"], /* CJK Ideograph */
+ ["\u5D41", "\u5D41"], /* CJK Ideograph */
+ ["\u5D42", "\u5D42"], /* CJK Ideograph */
+ ["\u5D43", "\u5D43"], /* CJK Ideograph */
+ ["\u5D44", "\u5D44"], /* CJK Ideograph */
+ ["\u5D45", "\u5D45"], /* CJK Ideograph */
+ ["\u5D46", "\u5D46"], /* CJK Ideograph */
+ ["\u5D47", "\u5D47"], /* CJK Ideograph */
+ ["\u5D48", "\u5D48"], /* CJK Ideograph */
+ ["\u5D49", "\u5D49"], /* CJK Ideograph */
+ ["\u5D4A", "\u5D4A"], /* CJK Ideograph */
+ ["\u5D4B", "\u5D4B"], /* CJK Ideograph */
+ ["\u5D4C", "\u5D4C"], /* CJK Ideograph */
+ ["\u5D4D", "\u5D4D"], /* CJK Ideograph */
+ ["\u5D4E", "\u5D4E"], /* CJK Ideograph */
+ ["\u5D4F", "\u5D4F"], /* CJK Ideograph */
+ ["\u5D50", "\u5D50"], /* CJK Ideograph */
+ ["\u5D51", "\u5D51"], /* CJK Ideograph */
+ ["\u5D52", "\u5D52"], /* CJK Ideograph */
+ ["\u5D53", "\u5D53"], /* CJK Ideograph */
+ ["\u5D54", "\u5D54"], /* CJK Ideograph */
+ ["\u5D55", "\u5D55"], /* CJK Ideograph */
+ ["\u5D56", "\u5D56"], /* CJK Ideograph */
+ ["\u5D57", "\u5D57"], /* CJK Ideograph */
+ ["\u5D58", "\u5D58"], /* CJK Ideograph */
+ ["\u5D59", "\u5D59"], /* CJK Ideograph */
+ ["\u5D5A", "\u5D5A"], /* CJK Ideograph */
+ ["\u5D5B", "\u5D5B"], /* CJK Ideograph */
+ ["\u5D5C", "\u5D5C"], /* CJK Ideograph */
+ ["\u5D5D", "\u5D5D"], /* CJK Ideograph */
+ ["\u5D5E", "\u5D5E"], /* CJK Ideograph */
+ ["\u5D5F", "\u5D5F"], /* CJK Ideograph */
+ ["\u5D60", "\u5D60"], /* CJK Ideograph */
+ ["\u5D61", "\u5D61"], /* CJK Ideograph */
+ ["\u5D62", "\u5D62"], /* CJK Ideograph */
+ ["\u5D63", "\u5D63"], /* CJK Ideograph */
+ ["\u5D64", "\u5D64"], /* CJK Ideograph */
+ ["\u5D65", "\u5D65"], /* CJK Ideograph */
+ ["\u5D66", "\u5D66"], /* CJK Ideograph */
+ ["\u5D67", "\u5D67"], /* CJK Ideograph */
+ ["\u5D68", "\u5D68"], /* CJK Ideograph */
+ ["\u5D69", "\u5D69"], /* CJK Ideograph */
+ ["\u5D6A", "\u5D6A"], /* CJK Ideograph */
+ ["\u5D6B", "\u5D6B"], /* CJK Ideograph */
+ ["\u5D6C", "\u5D6C"], /* CJK Ideograph */
+ ["\u5D6D", "\u5D6D"], /* CJK Ideograph */
+ ["\u5D6E", "\u5D6E"], /* CJK Ideograph */
+ ["\u5D6F", "\u5D6F"], /* CJK Ideograph */
+ ["\u5D70", "\u5D70"], /* CJK Ideograph */
+ ["\u5D71", "\u5D71"], /* CJK Ideograph */
+ ["\u5D72", "\u5D72"], /* CJK Ideograph */
+ ["\u5D73", "\u5D73"], /* CJK Ideograph */
+ ["\u5D74", "\u5D74"], /* CJK Ideograph */
+ ["\u5D75", "\u5D75"], /* CJK Ideograph */
+ ["\u5D76", "\u5D76"], /* CJK Ideograph */
+ ["\u5D77", "\u5D77"], /* CJK Ideograph */
+ ["\u5D78", "\u5D78"], /* CJK Ideograph */
+ ["\u5D79", "\u5D79"], /* CJK Ideograph */
+ ["\u5D7A", "\u5D7A"], /* CJK Ideograph */
+ ["\u5D7B", "\u5D7B"], /* CJK Ideograph */
+ ["\u5D7C", "\u5D7C"], /* CJK Ideograph */
+ ["\u5D7D", "\u5D7D"], /* CJK Ideograph */
+ ["\u5D7E", "\u5D7E"], /* CJK Ideograph */
+ ["\u5D7F", "\u5D7F"], /* CJK Ideograph */
+ ["\u5D80", "\u5D80"], /* CJK Ideograph */
+ ["\u5D81", "\u5D81"], /* CJK Ideograph */
+ ["\u5D82", "\u5D82"], /* CJK Ideograph */
+ ["\u5D83", "\u5D83"], /* CJK Ideograph */
+ ["\u5D84", "\u5D84"], /* CJK Ideograph */
+ ["\u5D85", "\u5D85"], /* CJK Ideograph */
+ ["\u5D86", "\u5D86"], /* CJK Ideograph */
+ ["\u5D87", "\u5D87"], /* CJK Ideograph */
+ ["\u5D88", "\u5D88"], /* CJK Ideograph */
+ ["\u5D89", "\u5D89"], /* CJK Ideograph */
+ ["\u5D8A", "\u5D8A"], /* CJK Ideograph */
+ ["\u5D8B", "\u5D8B"], /* CJK Ideograph */
+ ["\u5D8C", "\u5D8C"], /* CJK Ideograph */
+ ["\u5D8D", "\u5D8D"], /* CJK Ideograph */
+ ["\u5D8E", "\u5D8E"], /* CJK Ideograph */
+ ["\u5D8F", "\u5D8F"], /* CJK Ideograph */
+ ["\u5D90", "\u5D90"], /* CJK Ideograph */
+ ["\u5D91", "\u5D91"], /* CJK Ideograph */
+ ["\u5D92", "\u5D92"], /* CJK Ideograph */
+ ["\u5D93", "\u5D93"], /* CJK Ideograph */
+ ["\u5D94", "\u5D94"], /* CJK Ideograph */
+ ["\u5D95", "\u5D95"], /* CJK Ideograph */
+ ["\u5D96", "\u5D96"], /* CJK Ideograph */
+ ["\u5D97", "\u5D97"], /* CJK Ideograph */
+ ["\u5D98", "\u5D98"], /* CJK Ideograph */
+ ["\u5D99", "\u5D99"], /* CJK Ideograph */
+ ["\u5D9A", "\u5D9A"], /* CJK Ideograph */
+ ["\u5D9B", "\u5D9B"], /* CJK Ideograph */
+ ["\u5D9C", "\u5D9C"], /* CJK Ideograph */
+ ["\u5D9D", "\u5D9D"], /* CJK Ideograph */
+ ["\u5D9E", "\u5D9E"], /* CJK Ideograph */
+ ["\u5D9F", "\u5D9F"], /* CJK Ideograph */
+ ["\u5DA0", "\u5DA0"], /* CJK Ideograph */
+ ["\u5DA1", "\u5DA1"], /* CJK Ideograph */
+ ["\u5DA2", "\u5DA2"], /* CJK Ideograph */
+ ["\u5DA3", "\u5DA3"], /* CJK Ideograph */
+ ["\u5DA4", "\u5DA4"], /* CJK Ideograph */
+ ["\u5DA5", "\u5DA5"], /* CJK Ideograph */
+ ["\u5DA6", "\u5DA6"], /* CJK Ideograph */
+ ["\u5DA7", "\u5DA7"], /* CJK Ideograph */
+ ["\u5DA8", "\u5DA8"], /* CJK Ideograph */
+ ["\u5DA9", "\u5DA9"], /* CJK Ideograph */
+ ["\u5DAA", "\u5DAA"], /* CJK Ideograph */
+ ["\u5DAB", "\u5DAB"], /* CJK Ideograph */
+ ["\u5DAC", "\u5DAC"], /* CJK Ideograph */
+ ["\u5DAD", "\u5DAD"], /* CJK Ideograph */
+ ["\u5DAE", "\u5DAE"], /* CJK Ideograph */
+ ["\u5DAF", "\u5DAF"], /* CJK Ideograph */
+ ["\u5DB0", "\u5DB0"], /* CJK Ideograph */
+ ["\u5DB1", "\u5DB1"], /* CJK Ideograph */
+ ["\u5DB2", "\u5DB2"], /* CJK Ideograph */
+ ["\u5DB3", "\u5DB3"], /* CJK Ideograph */
+ ["\u5DB4", "\u5DB4"], /* CJK Ideograph */
+ ["\u5DB5", "\u5DB5"], /* CJK Ideograph */
+ ["\u5DB6", "\u5DB6"], /* CJK Ideograph */
+ ["\u5DB7", "\u5DB7"], /* CJK Ideograph */
+ ["\u5DB8", "\u5DB8"], /* CJK Ideograph */
+ ["\u5DB9", "\u5DB9"], /* CJK Ideograph */
+ ["\u5DBA", "\u5DBA"], /* CJK Ideograph */
+ ["\u5DBB", "\u5DBB"], /* CJK Ideograph */
+ ["\u5DBC", "\u5DBC"], /* CJK Ideograph */
+ ["\u5DBD", "\u5DBD"], /* CJK Ideograph */
+ ["\u5DBE", "\u5DBE"], /* CJK Ideograph */
+ ["\u5DBF", "\u5DBF"], /* CJK Ideograph */
+ ["\u5DC0", "\u5DC0"], /* CJK Ideograph */
+ ["\u5DC1", "\u5DC1"], /* CJK Ideograph */
+ ["\u5DC2", "\u5DC2"], /* CJK Ideograph */
+ ["\u5DC3", "\u5DC3"], /* CJK Ideograph */
+ ["\u5DC4", "\u5DC4"], /* CJK Ideograph */
+ ["\u5DC5", "\u5DC5"], /* CJK Ideograph */
+ ["\u5DC6", "\u5DC6"], /* CJK Ideograph */
+ ["\u5DC7", "\u5DC7"], /* CJK Ideograph */
+ ["\u5DC8", "\u5DC8"], /* CJK Ideograph */
+ ["\u5DC9", "\u5DC9"], /* CJK Ideograph */
+ ["\u5DCA", "\u5DCA"], /* CJK Ideograph */
+ ["\u5DCB", "\u5DCB"], /* CJK Ideograph */
+ ["\u5DCC", "\u5DCC"], /* CJK Ideograph */
+ ["\u5DCD", "\u5DCD"], /* CJK Ideograph */
+ ["\u5DCE", "\u5DCE"], /* CJK Ideograph */
+ ["\u5DCF", "\u5DCF"], /* CJK Ideograph */
+ ["\u5DD0", "\u5DD0"], /* CJK Ideograph */
+ ["\u5DD1", "\u5DD1"], /* CJK Ideograph */
+ ["\u5DD2", "\u5DD2"], /* CJK Ideograph */
+ ["\u5DD3", "\u5DD3"], /* CJK Ideograph */
+ ["\u5DD4", "\u5DD4"], /* CJK Ideograph */
+ ["\u5DD5", "\u5DD5"], /* CJK Ideograph */
+ ["\u5DD6", "\u5DD6"], /* CJK Ideograph */
+ ["\u5DD7", "\u5DD7"], /* CJK Ideograph */
+ ["\u5DD8", "\u5DD8"], /* CJK Ideograph */
+ ["\u5DD9", "\u5DD9"], /* CJK Ideograph */
+ ["\u5DDA", "\u5DDA"], /* CJK Ideograph */
+ ["\u5DDB", "\u5DDB"], /* CJK Ideograph */
+ ["\u5DDC", "\u5DDC"], /* CJK Ideograph */
+ ["\u5DDD", "\u5DDD"], /* CJK Ideograph */
+ ["\u5DDE", "\u5DDE"], /* CJK Ideograph */
+ ["\u5DDF", "\u5DDF"], /* CJK Ideograph */
+ ["\u5DE0", "\u5DE0"], /* CJK Ideograph */
+ ["\u5DE1", "\u5DE1"], /* CJK Ideograph */
+ ["\u5DE2", "\u5DE2"], /* CJK Ideograph */
+ ["\u5DE3", "\u5DE3"], /* CJK Ideograph */
+ ["\u5DE4", "\u5DE4"], /* CJK Ideograph */
+ ["\u5DE5", "\u5DE5"], /* CJK Ideograph */
+ ["\u5DE6", "\u5DE6"], /* CJK Ideograph */
+ ["\u5DE7", "\u5DE7"], /* CJK Ideograph */
+ ["\u5DE8", "\u5DE8"], /* CJK Ideograph */
+ ["\u5DE9", "\u5DE9"], /* CJK Ideograph */
+ ["\u5DEA", "\u5DEA"], /* CJK Ideograph */
+ ["\u5DEB", "\u5DEB"], /* CJK Ideograph */
+ ["\u5DEC", "\u5DEC"], /* CJK Ideograph */
+ ["\u5DED", "\u5DED"], /* CJK Ideograph */
+ ["\u5DEE", "\u5DEE"], /* CJK Ideograph */
+ ["\u5DEF", "\u5DEF"], /* CJK Ideograph */
+ ["\u5DF0", "\u5DF0"], /* CJK Ideograph */
+ ["\u5DF1", "\u5DF1"], /* CJK Ideograph */
+ ["\u5DF2", "\u5DF2"], /* CJK Ideograph */
+ ["\u5DF3", "\u5DF3"], /* CJK Ideograph */
+ ["\u5DF4", "\u5DF4"], /* CJK Ideograph */
+ ["\u5DF5", "\u5DF5"], /* CJK Ideograph */
+ ["\u5DF6", "\u5DF6"], /* CJK Ideograph */
+ ["\u5DF7", "\u5DF7"], /* CJK Ideograph */
+ ["\u5DF8", "\u5DF8"], /* CJK Ideograph */
+ ["\u5DF9", "\u5DF9"], /* CJK Ideograph */
+ ["\u5DFA", "\u5DFA"], /* CJK Ideograph */
+ ["\u5DFB", "\u5DFB"], /* CJK Ideograph */
+ ["\u5DFC", "\u5DFC"], /* CJK Ideograph */
+ ["\u5DFD", "\u5DFD"], /* CJK Ideograph */
+ ["\u5DFE", "\u5DFE"], /* CJK Ideograph */
+ ["\u5DFF", "\u5DFF"], /* CJK Ideograph */
+ ["\u5E00", "\u5E00"], /* CJK Ideograph */
+ ["\u5E01", "\u5E01"], /* CJK Ideograph */
+ ["\u5E02", "\u5E02"], /* CJK Ideograph */
+ ["\u5E03", "\u5E03"], /* CJK Ideograph */
+ ["\u5E04", "\u5E04"], /* CJK Ideograph */
+ ["\u5E05", "\u5E05"], /* CJK Ideograph */
+ ["\u5E06", "\u5E06"], /* CJK Ideograph */
+ ["\u5E07", "\u5E07"], /* CJK Ideograph */
+ ["\u5E08", "\u5E08"], /* CJK Ideograph */
+ ["\u5E09", "\u5E09"], /* CJK Ideograph */
+ ["\u5E0A", "\u5E0A"], /* CJK Ideograph */
+ ["\u5E0B", "\u5E0B"], /* CJK Ideograph */
+ ["\u5E0C", "\u5E0C"], /* CJK Ideograph */
+ ["\u5E0D", "\u5E0D"], /* CJK Ideograph */
+ ["\u5E0E", "\u5E0E"], /* CJK Ideograph */
+ ["\u5E0F", "\u5E0F"], /* CJK Ideograph */
+ ["\u5E10", "\u5E10"], /* CJK Ideograph */
+ ["\u5E11", "\u5E11"], /* CJK Ideograph */
+ ["\u5E12", "\u5E12"], /* CJK Ideograph */
+ ["\u5E13", "\u5E13"], /* CJK Ideograph */
+ ["\u5E14", "\u5E14"], /* CJK Ideograph */
+ ["\u5E15", "\u5E15"], /* CJK Ideograph */
+ ["\u5E16", "\u5E16"], /* CJK Ideograph */
+ ["\u5E17", "\u5E17"], /* CJK Ideograph */
+ ["\u5E18", "\u5E18"], /* CJK Ideograph */
+ ["\u5E19", "\u5E19"], /* CJK Ideograph */
+ ["\u5E1A", "\u5E1A"], /* CJK Ideograph */
+ ["\u5E1B", "\u5E1B"], /* CJK Ideograph */
+ ["\u5E1C", "\u5E1C"], /* CJK Ideograph */
+ ["\u5E1D", "\u5E1D"], /* CJK Ideograph */
+ ["\u5E1E", "\u5E1E"], /* CJK Ideograph */
+ ["\u5E1F", "\u5E1F"], /* CJK Ideograph */
+ ["\u5E20", "\u5E20"], /* CJK Ideograph */
+ ["\u5E21", "\u5E21"], /* CJK Ideograph */
+ ["\u5E22", "\u5E22"], /* CJK Ideograph */
+ ["\u5E23", "\u5E23"], /* CJK Ideograph */
+ ["\u5E24", "\u5E24"], /* CJK Ideograph */
+ ["\u5E25", "\u5E25"], /* CJK Ideograph */
+ ["\u5E26", "\u5E26"], /* CJK Ideograph */
+ ["\u5E27", "\u5E27"], /* CJK Ideograph */
+ ["\u5E28", "\u5E28"], /* CJK Ideograph */
+ ["\u5E29", "\u5E29"], /* CJK Ideograph */
+ ["\u5E2A", "\u5E2A"], /* CJK Ideograph */
+ ["\u5E2B", "\u5E2B"], /* CJK Ideograph */
+ ["\u5E2C", "\u5E2C"], /* CJK Ideograph */
+ ["\u5E2D", "\u5E2D"], /* CJK Ideograph */
+ ["\u5E2E", "\u5E2E"], /* CJK Ideograph */
+ ["\u5E2F", "\u5E2F"], /* CJK Ideograph */
+ ["\u5E30", "\u5E30"], /* CJK Ideograph */
+ ["\u5E31", "\u5E31"], /* CJK Ideograph */
+ ["\u5E32", "\u5E32"], /* CJK Ideograph */
+ ["\u5E33", "\u5E33"], /* CJK Ideograph */
+ ["\u5E34", "\u5E34"], /* CJK Ideograph */
+ ["\u5E35", "\u5E35"], /* CJK Ideograph */
+ ["\u5E36", "\u5E36"], /* CJK Ideograph */
+ ["\u5E37", "\u5E37"], /* CJK Ideograph */
+ ["\u5E38", "\u5E38"], /* CJK Ideograph */
+ ["\u5E39", "\u5E39"], /* CJK Ideograph */
+ ["\u5E3A", "\u5E3A"], /* CJK Ideograph */
+ ["\u5E3B", "\u5E3B"], /* CJK Ideograph */
+ ["\u5E3C", "\u5E3C"], /* CJK Ideograph */
+ ["\u5E3D", "\u5E3D"], /* CJK Ideograph */
+ ["\u5E3E", "\u5E3E"], /* CJK Ideograph */
+ ["\u5E3F", "\u5E3F"], /* CJK Ideograph */
+ ["\u5E40", "\u5E40"], /* CJK Ideograph */
+ ["\u5E41", "\u5E41"], /* CJK Ideograph */
+ ["\u5E42", "\u5E42"], /* CJK Ideograph */
+ ["\u5E43", "\u5E43"], /* CJK Ideograph */
+ ["\u5E44", "\u5E44"], /* CJK Ideograph */
+ ["\u5E45", "\u5E45"], /* CJK Ideograph */
+ ["\u5E46", "\u5E46"], /* CJK Ideograph */
+ ["\u5E47", "\u5E47"], /* CJK Ideograph */
+ ["\u5E48", "\u5E48"], /* CJK Ideograph */
+ ["\u5E49", "\u5E49"], /* CJK Ideograph */
+ ["\u5E4A", "\u5E4A"], /* CJK Ideograph */
+ ["\u5E4B", "\u5E4B"], /* CJK Ideograph */
+ ["\u5E4C", "\u5E4C"], /* CJK Ideograph */
+ ["\u5E4D", "\u5E4D"], /* CJK Ideograph */
+ ["\u5E4E", "\u5E4E"], /* CJK Ideograph */
+ ["\u5E4F", "\u5E4F"], /* CJK Ideograph */
+ ["\u5E50", "\u5E50"], /* CJK Ideograph */
+ ["\u5E51", "\u5E51"], /* CJK Ideograph */
+ ["\u5E52", "\u5E52"], /* CJK Ideograph */
+ ["\u5E53", "\u5E53"], /* CJK Ideograph */
+ ["\u5E54", "\u5E54"], /* CJK Ideograph */
+ ["\u5E55", "\u5E55"], /* CJK Ideograph */
+ ["\u5E56", "\u5E56"], /* CJK Ideograph */
+ ["\u5E57", "\u5E57"], /* CJK Ideograph */
+ ["\u5E58", "\u5E58"], /* CJK Ideograph */
+ ["\u5E59", "\u5E59"], /* CJK Ideograph */
+ ["\u5E5A", "\u5E5A"], /* CJK Ideograph */
+ ["\u5E5B", "\u5E5B"], /* CJK Ideograph */
+ ["\u5E5C", "\u5E5C"], /* CJK Ideograph */
+ ["\u5E5D", "\u5E5D"], /* CJK Ideograph */
+ ["\u5E5E", "\u5E5E"], /* CJK Ideograph */
+ ["\u5E5F", "\u5E5F"], /* CJK Ideograph */
+ ["\u5E60", "\u5E60"], /* CJK Ideograph */
+ ["\u5E61", "\u5E61"], /* CJK Ideograph */
+ ["\u5E62", "\u5E62"], /* CJK Ideograph */
+ ["\u5E63", "\u5E63"], /* CJK Ideograph */
+ ["\u5E64", "\u5E64"], /* CJK Ideograph */
+ ["\u5E65", "\u5E65"], /* CJK Ideograph */
+ ["\u5E66", "\u5E66"], /* CJK Ideograph */
+ ["\u5E67", "\u5E67"], /* CJK Ideograph */
+ ["\u5E68", "\u5E68"], /* CJK Ideograph */
+ ["\u5E69", "\u5E69"], /* CJK Ideograph */
+ ["\u5E6A", "\u5E6A"], /* CJK Ideograph */
+ ["\u5E6B", "\u5E6B"], /* CJK Ideograph */
+ ["\u5E6C", "\u5E6C"], /* CJK Ideograph */
+ ["\u5E6D", "\u5E6D"], /* CJK Ideograph */
+ ["\u5E6E", "\u5E6E"], /* CJK Ideograph */
+ ["\u5E6F", "\u5E6F"], /* CJK Ideograph */
+ ["\u5E70", "\u5E70"], /* CJK Ideograph */
+ ["\u5E71", "\u5E71"], /* CJK Ideograph */
+ ["\u5E72", "\u5E72"], /* CJK Ideograph */
+ ["\u5E73", "\u5E73"], /* CJK Ideograph */
+ ["\u5E74", "\u5E74"], /* CJK Ideograph */
+ ["\u5E75", "\u5E75"], /* CJK Ideograph */
+ ["\u5E76", "\u5E76"], /* CJK Ideograph */
+ ["\u5E77", "\u5E77"], /* CJK Ideograph */
+ ["\u5E78", "\u5E78"], /* CJK Ideograph */
+ ["\u5E79", "\u5E79"], /* CJK Ideograph */
+ ["\u5E7A", "\u5E7A"], /* CJK Ideograph */
+ ["\u5E7B", "\u5E7B"], /* CJK Ideograph */
+ ["\u5E7C", "\u5E7C"], /* CJK Ideograph */
+ ["\u5E7D", "\u5E7D"], /* CJK Ideograph */
+ ["\u5E7E", "\u5E7E"], /* CJK Ideograph */
+ ["\u5E7F", "\u5E7F"], /* CJK Ideograph */
+ ["\u5E80", "\u5E80"], /* CJK Ideograph */
+ ["\u5E81", "\u5E81"], /* CJK Ideograph */
+ ["\u5E82", "\u5E82"], /* CJK Ideograph */
+ ["\u5E83", "\u5E83"], /* CJK Ideograph */
+ ["\u5E84", "\u5E84"], /* CJK Ideograph */
+ ["\u5E85", "\u5E85"], /* CJK Ideograph */
+ ["\u5E86", "\u5E86"], /* CJK Ideograph */
+ ["\u5E87", "\u5E87"], /* CJK Ideograph */
+ ["\u5E88", "\u5E88"], /* CJK Ideograph */
+ ["\u5E89", "\u5E89"], /* CJK Ideograph */
+ ["\u5E8A", "\u5E8A"], /* CJK Ideograph */
+ ["\u5E8B", "\u5E8B"], /* CJK Ideograph */
+ ["\u5E8C", "\u5E8C"], /* CJK Ideograph */
+ ["\u5E8D", "\u5E8D"], /* CJK Ideograph */
+ ["\u5E8E", "\u5E8E"], /* CJK Ideograph */
+ ["\u5E8F", "\u5E8F"], /* CJK Ideograph */
+ ["\u5E90", "\u5E90"], /* CJK Ideograph */
+ ["\u5E91", "\u5E91"], /* CJK Ideograph */
+ ["\u5E92", "\u5E92"], /* CJK Ideograph */
+ ["\u5E93", "\u5E93"], /* CJK Ideograph */
+ ["\u5E94", "\u5E94"], /* CJK Ideograph */
+ ["\u5E95", "\u5E95"], /* CJK Ideograph */
+ ["\u5E96", "\u5E96"], /* CJK Ideograph */
+ ["\u5E97", "\u5E97"], /* CJK Ideograph */
+ ["\u5E98", "\u5E98"], /* CJK Ideograph */
+ ["\u5E99", "\u5E99"], /* CJK Ideograph */
+ ["\u5E9A", "\u5E9A"], /* CJK Ideograph */
+ ["\u5E9B", "\u5E9B"], /* CJK Ideograph */
+ ["\u5E9C", "\u5E9C"], /* CJK Ideograph */
+ ["\u5E9D", "\u5E9D"], /* CJK Ideograph */
+ ["\u5E9E", "\u5E9E"], /* CJK Ideograph */
+ ["\u5E9F", "\u5E9F"], /* CJK Ideograph */
+ ["\u5EA0", "\u5EA0"], /* CJK Ideograph */
+ ["\u5EA1", "\u5EA1"], /* CJK Ideograph */
+ ["\u5EA2", "\u5EA2"], /* CJK Ideograph */
+ ["\u5EA3", "\u5EA3"], /* CJK Ideograph */
+ ["\u5EA4", "\u5EA4"], /* CJK Ideograph */
+ ["\u5EA5", "\u5EA5"], /* CJK Ideograph */
+ ["\u5EA6", "\u5EA6"], /* CJK Ideograph */
+ ["\u5EA7", "\u5EA7"], /* CJK Ideograph */
+ ["\u5EA8", "\u5EA8"], /* CJK Ideograph */
+ ["\u5EA9", "\u5EA9"], /* CJK Ideograph */
+ ["\u5EAA", "\u5EAA"], /* CJK Ideograph */
+ ["\u5EAB", "\u5EAB"], /* CJK Ideograph */
+ ["\u5EAC", "\u5EAC"], /* CJK Ideograph */
+ ["\u5EAD", "\u5EAD"], /* CJK Ideograph */
+ ["\u5EAE", "\u5EAE"], /* CJK Ideograph */
+ ["\u5EAF", "\u5EAF"], /* CJK Ideograph */
+ ["\u5EB0", "\u5EB0"], /* CJK Ideograph */
+ ["\u5EB1", "\u5EB1"], /* CJK Ideograph */
+ ["\u5EB2", "\u5EB2"], /* CJK Ideograph */
+ ["\u5EB3", "\u5EB3"], /* CJK Ideograph */
+ ["\u5EB4", "\u5EB4"], /* CJK Ideograph */
+ ["\u5EB5", "\u5EB5"], /* CJK Ideograph */
+ ["\u5EB6", "\u5EB6"], /* CJK Ideograph */
+ ["\u5EB7", "\u5EB7"], /* CJK Ideograph */
+ ["\u5EB8", "\u5EB8"], /* CJK Ideograph */
+ ["\u5EB9", "\u5EB9"], /* CJK Ideograph */
+ ["\u5EBA", "\u5EBA"], /* CJK Ideograph */
+ ["\u5EBB", "\u5EBB"], /* CJK Ideograph */
+ ["\u5EBC", "\u5EBC"], /* CJK Ideograph */
+ ["\u5EBD", "\u5EBD"], /* CJK Ideograph */
+ ["\u5EBE", "\u5EBE"], /* CJK Ideograph */
+ ["\u5EBF", "\u5EBF"], /* CJK Ideograph */
+ ["\u5EC0", "\u5EC0"], /* CJK Ideograph */
+ ["\u5EC1", "\u5EC1"], /* CJK Ideograph */
+ ["\u5EC2", "\u5EC2"], /* CJK Ideograph */
+ ["\u5EC3", "\u5EC3"], /* CJK Ideograph */
+ ["\u5EC4", "\u5EC4"], /* CJK Ideograph */
+ ["\u5EC5", "\u5EC5"], /* CJK Ideograph */
+ ["\u5EC6", "\u5EC6"], /* CJK Ideograph */
+ ["\u5EC7", "\u5EC7"], /* CJK Ideograph */
+ ["\u5EC8", "\u5EC8"], /* CJK Ideograph */
+ ["\u5EC9", "\u5EC9"], /* CJK Ideograph */
+ ["\u5ECA", "\u5ECA"], /* CJK Ideograph */
+ ["\u5ECB", "\u5ECB"], /* CJK Ideograph */
+ ["\u5ECC", "\u5ECC"], /* CJK Ideograph */
+ ["\u5ECD", "\u5ECD"], /* CJK Ideograph */
+ ["\u5ECE", "\u5ECE"], /* CJK Ideograph */
+ ["\u5ECF", "\u5ECF"], /* CJK Ideograph */
+ ["\u5ED0", "\u5ED0"], /* CJK Ideograph */
+ ["\u5ED1", "\u5ED1"], /* CJK Ideograph */
+ ["\u5ED2", "\u5ED2"], /* CJK Ideograph */
+ ["\u5ED3", "\u5ED3"], /* CJK Ideograph */
+ ["\u5ED4", "\u5ED4"], /* CJK Ideograph */
+ ["\u5ED5", "\u5ED5"], /* CJK Ideograph */
+ ["\u5ED6", "\u5ED6"], /* CJK Ideograph */
+ ["\u5ED7", "\u5ED7"], /* CJK Ideograph */
+ ["\u5ED8", "\u5ED8"], /* CJK Ideograph */
+ ["\u5ED9", "\u5ED9"], /* CJK Ideograph */
+ ["\u5EDA", "\u5EDA"], /* CJK Ideograph */
+ ["\u5EDB", "\u5EDB"], /* CJK Ideograph */
+ ["\u5EDC", "\u5EDC"], /* CJK Ideograph */
+ ["\u5EDD", "\u5EDD"], /* CJK Ideograph */
+ ["\u5EDE", "\u5EDE"], /* CJK Ideograph */
+ ["\u5EDF", "\u5EDF"], /* CJK Ideograph */
+ ["\u5EE0", "\u5EE0"], /* CJK Ideograph */
+ ["\u5EE1", "\u5EE1"], /* CJK Ideograph */
+ ["\u5EE2", "\u5EE2"], /* CJK Ideograph */
+ ["\u5EE3", "\u5EE3"], /* CJK Ideograph */
+ ["\u5EE4", "\u5EE4"], /* CJK Ideograph */
+ ["\u5EE5", "\u5EE5"], /* CJK Ideograph */
+ ["\u5EE6", "\u5EE6"], /* CJK Ideograph */
+ ["\u5EE7", "\u5EE7"], /* CJK Ideograph */
+ ["\u5EE8", "\u5EE8"], /* CJK Ideograph */
+ ["\u5EE9", "\u5EE9"], /* CJK Ideograph */
+ ["\u5EEA", "\u5EEA"], /* CJK Ideograph */
+ ["\u5EEB", "\u5EEB"], /* CJK Ideograph */
+ ["\u5EEC", "\u5EEC"], /* CJK Ideograph */
+ ["\u5EED", "\u5EED"], /* CJK Ideograph */
+ ["\u5EEE", "\u5EEE"], /* CJK Ideograph */
+ ["\u5EEF", "\u5EEF"], /* CJK Ideograph */
+ ["\u5EF0", "\u5EF0"], /* CJK Ideograph */
+ ["\u5EF1", "\u5EF1"], /* CJK Ideograph */
+ ["\u5EF2", "\u5EF2"], /* CJK Ideograph */
+ ["\u5EF3", "\u5EF3"], /* CJK Ideograph */
+ ["\u5EF4", "\u5EF4"], /* CJK Ideograph */
+ ["\u5EF5", "\u5EF5"], /* CJK Ideograph */
+ ["\u5EF6", "\u5EF6"], /* CJK Ideograph */
+ ["\u5EF7", "\u5EF7"], /* CJK Ideograph */
+ ["\u5EF8", "\u5EF8"], /* CJK Ideograph */
+ ["\u5EF9", "\u5EF9"], /* CJK Ideograph */
+ ["\u5EFA", "\u5EFA"], /* CJK Ideograph */
+ ["\u5EFB", "\u5EFB"], /* CJK Ideograph */
+ ["\u5EFC", "\u5EFC"], /* CJK Ideograph */
+ ["\u5EFD", "\u5EFD"], /* CJK Ideograph */
+ ["\u5EFE", "\u5EFE"], /* CJK Ideograph */
+ ["\u5EFF", "\u5EFF"], /* CJK Ideograph */
+ ["\u5F00", "\u5F00"], /* CJK Ideograph */
+ ["\u5F01", "\u5F01"], /* CJK Ideograph */
+ ["\u5F02", "\u5F02"], /* CJK Ideograph */
+ ["\u5F03", "\u5F03"], /* CJK Ideograph */
+ ["\u5F04", "\u5F04"], /* CJK Ideograph */
+ ["\u5F05", "\u5F05"], /* CJK Ideograph */
+ ["\u5F06", "\u5F06"], /* CJK Ideograph */
+ ["\u5F07", "\u5F07"], /* CJK Ideograph */
+ ["\u5F08", "\u5F08"], /* CJK Ideograph */
+ ["\u5F09", "\u5F09"], /* CJK Ideograph */
+ ["\u5F0A", "\u5F0A"], /* CJK Ideograph */
+ ["\u5F0B", "\u5F0B"], /* CJK Ideograph */
+ ["\u5F0C", "\u5F0C"], /* CJK Ideograph */
+ ["\u5F0D", "\u5F0D"], /* CJK Ideograph */
+ ["\u5F0E", "\u5F0E"], /* CJK Ideograph */
+ ["\u5F0F", "\u5F0F"], /* CJK Ideograph */
+ ["\u5F10", "\u5F10"], /* CJK Ideograph */
+ ["\u5F11", "\u5F11"], /* CJK Ideograph */
+ ["\u5F12", "\u5F12"], /* CJK Ideograph */
+ ["\u5F13", "\u5F13"], /* CJK Ideograph */
+ ["\u5F14", "\u5F14"], /* CJK Ideograph */
+ ["\u5F15", "\u5F15"], /* CJK Ideograph */
+ ["\u5F16", "\u5F16"], /* CJK Ideograph */
+ ["\u5F17", "\u5F17"], /* CJK Ideograph */
+ ["\u5F18", "\u5F18"], /* CJK Ideograph */
+ ["\u5F19", "\u5F19"], /* CJK Ideograph */
+ ["\u5F1A", "\u5F1A"], /* CJK Ideograph */
+ ["\u5F1B", "\u5F1B"], /* CJK Ideograph */
+ ["\u5F1C", "\u5F1C"], /* CJK Ideograph */
+ ["\u5F1D", "\u5F1D"], /* CJK Ideograph */
+ ["\u5F1E", "\u5F1E"], /* CJK Ideograph */
+ ["\u5F1F", "\u5F1F"], /* CJK Ideograph */
+ ["\u5F20", "\u5F20"], /* CJK Ideograph */
+ ["\u5F21", "\u5F21"], /* CJK Ideograph */
+ ["\u5F22", "\u5F22"], /* CJK Ideograph */
+ ["\u5F23", "\u5F23"], /* CJK Ideograph */
+ ["\u5F24", "\u5F24"], /* CJK Ideograph */
+ ["\u5F25", "\u5F25"], /* CJK Ideograph */
+ ["\u5F26", "\u5F26"], /* CJK Ideograph */
+ ["\u5F27", "\u5F27"], /* CJK Ideograph */
+ ["\u5F28", "\u5F28"], /* CJK Ideograph */
+ ["\u5F29", "\u5F29"], /* CJK Ideograph */
+ ["\u5F2A", "\u5F2A"], /* CJK Ideograph */
+ ["\u5F2B", "\u5F2B"], /* CJK Ideograph */
+ ["\u5F2C", "\u5F2C"], /* CJK Ideograph */
+ ["\u5F2D", "\u5F2D"], /* CJK Ideograph */
+ ["\u5F2E", "\u5F2E"], /* CJK Ideograph */
+ ["\u5F2F", "\u5F2F"], /* CJK Ideograph */
+ ["\u5F30", "\u5F30"], /* CJK Ideograph */
+ ["\u5F31", "\u5F31"], /* CJK Ideograph */
+ ["\u5F32", "\u5F32"], /* CJK Ideograph */
+ ["\u5F33", "\u5F33"], /* CJK Ideograph */
+ ["\u5F34", "\u5F34"], /* CJK Ideograph */
+ ["\u5F35", "\u5F35"], /* CJK Ideograph */
+ ["\u5F36", "\u5F36"], /* CJK Ideograph */
+ ["\u5F37", "\u5F37"], /* CJK Ideograph */
+ ["\u5F38", "\u5F38"], /* CJK Ideograph */
+ ["\u5F39", "\u5F39"], /* CJK Ideograph */
+ ["\u5F3A", "\u5F3A"], /* CJK Ideograph */
+ ["\u5F3B", "\u5F3B"], /* CJK Ideograph */
+ ["\u5F3C", "\u5F3C"], /* CJK Ideograph */
+ ["\u5F3D", "\u5F3D"], /* CJK Ideograph */
+ ["\u5F3E", "\u5F3E"], /* CJK Ideograph */
+ ["\u5F3F", "\u5F3F"], /* CJK Ideograph */
+ ["\u5F40", "\u5F40"], /* CJK Ideograph */
+ ["\u5F41", "\u5F41"], /* CJK Ideograph */
+ ["\u5F42", "\u5F42"], /* CJK Ideograph */
+ ["\u5F43", "\u5F43"], /* CJK Ideograph */
+ ["\u5F44", "\u5F44"], /* CJK Ideograph */
+ ["\u5F45", "\u5F45"], /* CJK Ideograph */
+ ["\u5F46", "\u5F46"], /* CJK Ideograph */
+ ["\u5F47", "\u5F47"], /* CJK Ideograph */
+ ["\u5F48", "\u5F48"], /* CJK Ideograph */
+ ["\u5F49", "\u5F49"], /* CJK Ideograph */
+ ["\u5F4A", "\u5F4A"], /* CJK Ideograph */
+ ["\u5F4B", "\u5F4B"], /* CJK Ideograph */
+ ["\u5F4C", "\u5F4C"], /* CJK Ideograph */
+ ["\u5F4D", "\u5F4D"], /* CJK Ideograph */
+ ["\u5F4E", "\u5F4E"], /* CJK Ideograph */
+ ["\u5F4F", "\u5F4F"], /* CJK Ideograph */
+ ["\u5F50", "\u5F50"], /* CJK Ideograph */
+ ["\u5F51", "\u5F51"], /* CJK Ideograph */
+ ["\u5F52", "\u5F52"], /* CJK Ideograph */
+ ["\u5F53", "\u5F53"], /* CJK Ideograph */
+ ["\u5F54", "\u5F54"], /* CJK Ideograph */
+ ["\u5F55", "\u5F55"], /* CJK Ideograph */
+ ["\u5F56", "\u5F56"], /* CJK Ideograph */
+ ["\u5F57", "\u5F57"], /* CJK Ideograph */
+ ["\u5F58", "\u5F58"], /* CJK Ideograph */
+ ["\u5F59", "\u5F59"], /* CJK Ideograph */
+ ["\u5F5A", "\u5F5A"], /* CJK Ideograph */
+ ["\u5F5B", "\u5F5B"], /* CJK Ideograph */
+ ["\u5F5C", "\u5F5C"], /* CJK Ideograph */
+ ["\u5F5D", "\u5F5D"], /* CJK Ideograph */
+ ["\u5F5E", "\u5F5E"], /* CJK Ideograph */
+ ["\u5F5F", "\u5F5F"], /* CJK Ideograph */
+ ["\u5F60", "\u5F60"], /* CJK Ideograph */
+ ["\u5F61", "\u5F61"], /* CJK Ideograph */
+ ["\u5F62", "\u5F62"], /* CJK Ideograph */
+ ["\u5F63", "\u5F63"], /* CJK Ideograph */
+ ["\u5F64", "\u5F64"], /* CJK Ideograph */
+ ["\u5F65", "\u5F65"], /* CJK Ideograph */
+ ["\u5F66", "\u5F66"], /* CJK Ideograph */
+ ["\u5F67", "\u5F67"], /* CJK Ideograph */
+ ["\u5F68", "\u5F68"], /* CJK Ideograph */
+ ["\u5F69", "\u5F69"], /* CJK Ideograph */
+ ["\u5F6A", "\u5F6A"], /* CJK Ideograph */
+ ["\u5F6B", "\u5F6B"], /* CJK Ideograph */
+ ["\u5F6C", "\u5F6C"], /* CJK Ideograph */
+ ["\u5F6D", "\u5F6D"], /* CJK Ideograph */
+ ["\u5F6E", "\u5F6E"], /* CJK Ideograph */
+ ["\u5F6F", "\u5F6F"], /* CJK Ideograph */
+ ["\u5F70", "\u5F70"], /* CJK Ideograph */
+ ["\u5F71", "\u5F71"], /* CJK Ideograph */
+ ["\u5F72", "\u5F72"], /* CJK Ideograph */
+ ["\u5F73", "\u5F73"], /* CJK Ideograph */
+ ["\u5F74", "\u5F74"], /* CJK Ideograph */
+ ["\u5F75", "\u5F75"], /* CJK Ideograph */
+ ["\u5F76", "\u5F76"], /* CJK Ideograph */
+ ["\u5F77", "\u5F77"], /* CJK Ideograph */
+ ["\u5F78", "\u5F78"], /* CJK Ideograph */
+ ["\u5F79", "\u5F79"], /* CJK Ideograph */
+ ["\u5F7A", "\u5F7A"], /* CJK Ideograph */
+ ["\u5F7B", "\u5F7B"], /* CJK Ideograph */
+ ["\u5F7C", "\u5F7C"], /* CJK Ideograph */
+ ["\u5F7D", "\u5F7D"], /* CJK Ideograph */
+ ["\u5F7E", "\u5F7E"], /* CJK Ideograph */
+ ["\u5F7F", "\u5F7F"], /* CJK Ideograph */
+ ["\u5F80", "\u5F80"], /* CJK Ideograph */
+ ["\u5F81", "\u5F81"], /* CJK Ideograph */
+ ["\u5F82", "\u5F82"], /* CJK Ideograph */
+ ["\u5F83", "\u5F83"], /* CJK Ideograph */
+ ["\u5F84", "\u5F84"], /* CJK Ideograph */
+ ["\u5F85", "\u5F85"], /* CJK Ideograph */
+ ["\u5F86", "\u5F86"], /* CJK Ideograph */
+ ["\u5F87", "\u5F87"], /* CJK Ideograph */
+ ["\u5F88", "\u5F88"], /* CJK Ideograph */
+ ["\u5F89", "\u5F89"], /* CJK Ideograph */
+ ["\u5F8A", "\u5F8A"], /* CJK Ideograph */
+ ["\u5F8B", "\u5F8B"], /* CJK Ideograph */
+ ["\u5F8C", "\u5F8C"], /* CJK Ideograph */
+ ["\u5F8D", "\u5F8D"], /* CJK Ideograph */
+ ["\u5F8E", "\u5F8E"], /* CJK Ideograph */
+ ["\u5F8F", "\u5F8F"], /* CJK Ideograph */
+ ["\u5F90", "\u5F90"], /* CJK Ideograph */
+ ["\u5F91", "\u5F91"], /* CJK Ideograph */
+ ["\u5F92", "\u5F92"], /* CJK Ideograph */
+ ["\u5F93", "\u5F93"], /* CJK Ideograph */
+ ["\u5F94", "\u5F94"], /* CJK Ideograph */
+ ["\u5F95", "\u5F95"], /* CJK Ideograph */
+ ["\u5F96", "\u5F96"], /* CJK Ideograph */
+ ["\u5F97", "\u5F97"], /* CJK Ideograph */
+ ["\u5F98", "\u5F98"], /* CJK Ideograph */
+ ["\u5F99", "\u5F99"], /* CJK Ideograph */
+ ["\u5F9A", "\u5F9A"], /* CJK Ideograph */
+ ["\u5F9B", "\u5F9B"], /* CJK Ideograph */
+ ["\u5F9C", "\u5F9C"], /* CJK Ideograph */
+ ["\u5F9D", "\u5F9D"], /* CJK Ideograph */
+ ["\u5F9E", "\u5F9E"], /* CJK Ideograph */
+ ["\u5F9F", "\u5F9F"], /* CJK Ideograph */
+ ["\u5FA0", "\u5FA0"], /* CJK Ideograph */
+ ["\u5FA1", "\u5FA1"], /* CJK Ideograph */
+ ["\u5FA2", "\u5FA2"], /* CJK Ideograph */
+ ["\u5FA3", "\u5FA3"], /* CJK Ideograph */
+ ["\u5FA4", "\u5FA4"], /* CJK Ideograph */
+ ["\u5FA5", "\u5FA5"], /* CJK Ideograph */
+ ["\u5FA6", "\u5FA6"], /* CJK Ideograph */
+ ["\u5FA7", "\u5FA7"], /* CJK Ideograph */
+ ["\u5FA8", "\u5FA8"], /* CJK Ideograph */
+ ["\u5FA9", "\u5FA9"], /* CJK Ideograph */
+ ["\u5FAA", "\u5FAA"], /* CJK Ideograph */
+ ["\u5FAB", "\u5FAB"], /* CJK Ideograph */
+ ["\u5FAC", "\u5FAC"], /* CJK Ideograph */
+ ["\u5FAD", "\u5FAD"], /* CJK Ideograph */
+ ["\u5FAE", "\u5FAE"], /* CJK Ideograph */
+ ["\u5FAF", "\u5FAF"], /* CJK Ideograph */
+ ["\u5FB0", "\u5FB0"], /* CJK Ideograph */
+ ["\u5FB1", "\u5FB1"], /* CJK Ideograph */
+ ["\u5FB2", "\u5FB2"], /* CJK Ideograph */
+ ["\u5FB3", "\u5FB3"], /* CJK Ideograph */
+ ["\u5FB4", "\u5FB4"], /* CJK Ideograph */
+ ["\u5FB5", "\u5FB5"], /* CJK Ideograph */
+ ["\u5FB6", "\u5FB6"], /* CJK Ideograph */
+ ["\u5FB7", "\u5FB7"], /* CJK Ideograph */
+ ["\u5FB8", "\u5FB8"], /* CJK Ideograph */
+ ["\u5FB9", "\u5FB9"], /* CJK Ideograph */
+ ["\u5FBA", "\u5FBA"], /* CJK Ideograph */
+ ["\u5FBB", "\u5FBB"], /* CJK Ideograph */
+ ["\u5FBC", "\u5FBC"], /* CJK Ideograph */
+ ["\u5FBD", "\u5FBD"], /* CJK Ideograph */
+ ["\u5FBE", "\u5FBE"], /* CJK Ideograph */
+ ["\u5FBF", "\u5FBF"], /* CJK Ideograph */
+ ["\u5FC0", "\u5FC0"], /* CJK Ideograph */
+ ["\u5FC1", "\u5FC1"], /* CJK Ideograph */
+ ["\u5FC2", "\u5FC2"], /* CJK Ideograph */
+ ["\u5FC3", "\u5FC3"], /* CJK Ideograph */
+ ["\u5FC4", "\u5FC4"], /* CJK Ideograph */
+ ["\u5FC5", "\u5FC5"], /* CJK Ideograph */
+ ["\u5FC6", "\u5FC6"], /* CJK Ideograph */
+ ["\u5FC7", "\u5FC7"], /* CJK Ideograph */
+ ["\u5FC8", "\u5FC8"], /* CJK Ideograph */
+ ["\u5FC9", "\u5FC9"], /* CJK Ideograph */
+ ["\u5FCA", "\u5FCA"], /* CJK Ideograph */
+ ["\u5FCB", "\u5FCB"], /* CJK Ideograph */
+ ["\u5FCC", "\u5FCC"], /* CJK Ideograph */
+ ["\u5FCD", "\u5FCD"], /* CJK Ideograph */
+ ["\u5FCE", "\u5FCE"], /* CJK Ideograph */
+ ["\u5FCF", "\u5FCF"], /* CJK Ideograph */
+ ["\u5FD0", "\u5FD0"], /* CJK Ideograph */
+ ["\u5FD1", "\u5FD1"], /* CJK Ideograph */
+ ["\u5FD2", "\u5FD2"], /* CJK Ideograph */
+ ["\u5FD3", "\u5FD3"], /* CJK Ideograph */
+ ["\u5FD4", "\u5FD4"], /* CJK Ideograph */
+ ["\u5FD5", "\u5FD5"], /* CJK Ideograph */
+ ["\u5FD6", "\u5FD6"], /* CJK Ideograph */
+ ["\u5FD7", "\u5FD7"], /* CJK Ideograph */
+ ["\u5FD8", "\u5FD8"], /* CJK Ideograph */
+ ["\u5FD9", "\u5FD9"], /* CJK Ideograph */
+ ["\u5FDA", "\u5FDA"], /* CJK Ideograph */
+ ["\u5FDB", "\u5FDB"], /* CJK Ideograph */
+ ["\u5FDC", "\u5FDC"], /* CJK Ideograph */
+ ["\u5FDD", "\u5FDD"], /* CJK Ideograph */
+ ["\u5FDE", "\u5FDE"], /* CJK Ideograph */
+ ["\u5FDF", "\u5FDF"], /* CJK Ideograph */
+ ["\u5FE0", "\u5FE0"], /* CJK Ideograph */
+ ["\u5FE1", "\u5FE1"], /* CJK Ideograph */
+ ["\u5FE2", "\u5FE2"], /* CJK Ideograph */
+ ["\u5FE3", "\u5FE3"], /* CJK Ideograph */
+ ["\u5FE4", "\u5FE4"], /* CJK Ideograph */
+ ["\u5FE5", "\u5FE5"], /* CJK Ideograph */
+ ["\u5FE6", "\u5FE6"], /* CJK Ideograph */
+ ["\u5FE7", "\u5FE7"], /* CJK Ideograph */
+ ["\u5FE8", "\u5FE8"], /* CJK Ideograph */
+ ["\u5FE9", "\u5FE9"], /* CJK Ideograph */
+ ["\u5FEA", "\u5FEA"], /* CJK Ideograph */
+ ["\u5FEB", "\u5FEB"], /* CJK Ideograph */
+ ["\u5FEC", "\u5FEC"], /* CJK Ideograph */
+ ["\u5FED", "\u5FED"], /* CJK Ideograph */
+ ["\u5FEE", "\u5FEE"], /* CJK Ideograph */
+ ["\u5FEF", "\u5FEF"], /* CJK Ideograph */
+ ["\u5FF0", "\u5FF0"], /* CJK Ideograph */
+ ["\u5FF1", "\u5FF1"], /* CJK Ideograph */
+ ["\u5FF2", "\u5FF2"], /* CJK Ideograph */
+ ["\u5FF3", "\u5FF3"], /* CJK Ideograph */
+ ["\u5FF4", "\u5FF4"], /* CJK Ideograph */
+ ["\u5FF5", "\u5FF5"], /* CJK Ideograph */
+ ["\u5FF6", "\u5FF6"], /* CJK Ideograph */
+ ["\u5FF7", "\u5FF7"], /* CJK Ideograph */
+ ["\u5FF8", "\u5FF8"], /* CJK Ideograph */
+ ["\u5FF9", "\u5FF9"], /* CJK Ideograph */
+ ["\u5FFA", "\u5FFA"], /* CJK Ideograph */
+ ["\u5FFB", "\u5FFB"], /* CJK Ideograph */
+ ["\u5FFC", "\u5FFC"], /* CJK Ideograph */
+ ["\u5FFD", "\u5FFD"], /* CJK Ideograph */
+ ["\u5FFE", "\u5FFE"], /* CJK Ideograph */
+ ["\u5FFF", "\u5FFF"], /* CJK Ideograph */
+ ["\u6000", "\u6000"], /* CJK Ideograph */
+ ["\u6001", "\u6001"], /* CJK Ideograph */
+ ["\u6002", "\u6002"], /* CJK Ideograph */
+ ["\u6003", "\u6003"], /* CJK Ideograph */
+ ["\u6004", "\u6004"], /* CJK Ideograph */
+ ["\u6005", "\u6005"], /* CJK Ideograph */
+ ["\u6006", "\u6006"], /* CJK Ideograph */
+ ["\u6007", "\u6007"], /* CJK Ideograph */
+ ["\u6008", "\u6008"], /* CJK Ideograph */
+ ["\u6009", "\u6009"], /* CJK Ideograph */
+ ["\u600A", "\u600A"], /* CJK Ideograph */
+ ["\u600B", "\u600B"], /* CJK Ideograph */
+ ["\u600C", "\u600C"], /* CJK Ideograph */
+ ["\u600D", "\u600D"], /* CJK Ideograph */
+ ["\u600E", "\u600E"], /* CJK Ideograph */
+ ["\u600F", "\u600F"], /* CJK Ideograph */
+ ["\u6010", "\u6010"], /* CJK Ideograph */
+ ["\u6011", "\u6011"], /* CJK Ideograph */
+ ["\u6012", "\u6012"], /* CJK Ideograph */
+ ["\u6013", "\u6013"], /* CJK Ideograph */
+ ["\u6014", "\u6014"], /* CJK Ideograph */
+ ["\u6015", "\u6015"], /* CJK Ideograph */
+ ["\u6016", "\u6016"], /* CJK Ideograph */
+ ["\u6017", "\u6017"], /* CJK Ideograph */
+ ["\u6018", "\u6018"], /* CJK Ideograph */
+ ["\u6019", "\u6019"], /* CJK Ideograph */
+ ["\u601A", "\u601A"], /* CJK Ideograph */
+ ["\u601B", "\u601B"], /* CJK Ideograph */
+ ["\u601C", "\u601C"], /* CJK Ideograph */
+ ["\u601D", "\u601D"], /* CJK Ideograph */
+ ["\u601E", "\u601E"], /* CJK Ideograph */
+ ["\u601F", "\u601F"], /* CJK Ideograph */
+ ["\u6020", "\u6020"], /* CJK Ideograph */
+ ["\u6021", "\u6021"], /* CJK Ideograph */
+ ["\u6022", "\u6022"], /* CJK Ideograph */
+ ["\u6023", "\u6023"], /* CJK Ideograph */
+ ["\u6024", "\u6024"], /* CJK Ideograph */
+ ["\u6025", "\u6025"], /* CJK Ideograph */
+ ["\u6026", "\u6026"], /* CJK Ideograph */
+ ["\u6027", "\u6027"], /* CJK Ideograph */
+ ["\u6028", "\u6028"], /* CJK Ideograph */
+ ["\u6029", "\u6029"], /* CJK Ideograph */
+ ["\u602A", "\u602A"], /* CJK Ideograph */
+ ["\u602B", "\u602B"], /* CJK Ideograph */
+ ["\u602C", "\u602C"], /* CJK Ideograph */
+ ["\u602D", "\u602D"], /* CJK Ideograph */
+ ["\u602E", "\u602E"], /* CJK Ideograph */
+ ["\u602F", "\u602F"], /* CJK Ideograph */
+ ["\u6030", "\u6030"], /* CJK Ideograph */
+ ["\u6031", "\u6031"], /* CJK Ideograph */
+ ["\u6032", "\u6032"], /* CJK Ideograph */
+ ["\u6033", "\u6033"], /* CJK Ideograph */
+ ["\u6034", "\u6034"], /* CJK Ideograph */
+ ["\u6035", "\u6035"], /* CJK Ideograph */
+ ["\u6036", "\u6036"], /* CJK Ideograph */
+ ["\u6037", "\u6037"], /* CJK Ideograph */
+ ["\u6038", "\u6038"], /* CJK Ideograph */
+ ["\u6039", "\u6039"], /* CJK Ideograph */
+ ["\u603A", "\u603A"], /* CJK Ideograph */
+ ["\u603B", "\u603B"], /* CJK Ideograph */
+ ["\u603C", "\u603C"], /* CJK Ideograph */
+ ["\u603D", "\u603D"], /* CJK Ideograph */
+ ["\u603E", "\u603E"], /* CJK Ideograph */
+ ["\u603F", "\u603F"], /* CJK Ideograph */
+ ["\u6040", "\u6040"], /* CJK Ideograph */
+ ["\u6041", "\u6041"], /* CJK Ideograph */
+ ["\u6042", "\u6042"], /* CJK Ideograph */
+ ["\u6043", "\u6043"], /* CJK Ideograph */
+ ["\u6044", "\u6044"], /* CJK Ideograph */
+ ["\u6045", "\u6045"], /* CJK Ideograph */
+ ["\u6046", "\u6046"], /* CJK Ideograph */
+ ["\u6047", "\u6047"], /* CJK Ideograph */
+ ["\u6048", "\u6048"], /* CJK Ideograph */
+ ["\u6049", "\u6049"], /* CJK Ideograph */
+ ["\u604A", "\u604A"], /* CJK Ideograph */
+ ["\u604B", "\u604B"], /* CJK Ideograph */
+ ["\u604C", "\u604C"], /* CJK Ideograph */
+ ["\u604D", "\u604D"], /* CJK Ideograph */
+ ["\u604E", "\u604E"], /* CJK Ideograph */
+ ["\u604F", "\u604F"], /* CJK Ideograph */
+ ["\u6050", "\u6050"], /* CJK Ideograph */
+ ["\u6051", "\u6051"], /* CJK Ideograph */
+ ["\u6052", "\u6052"], /* CJK Ideograph */
+ ["\u6053", "\u6053"], /* CJK Ideograph */
+ ["\u6054", "\u6054"], /* CJK Ideograph */
+ ["\u6055", "\u6055"], /* CJK Ideograph */
+ ["\u6056", "\u6056"], /* CJK Ideograph */
+ ["\u6057", "\u6057"], /* CJK Ideograph */
+ ["\u6058", "\u6058"], /* CJK Ideograph */
+ ["\u6059", "\u6059"], /* CJK Ideograph */
+ ["\u605A", "\u605A"], /* CJK Ideograph */
+ ["\u605B", "\u605B"], /* CJK Ideograph */
+ ["\u605C", "\u605C"], /* CJK Ideograph */
+ ["\u605D", "\u605D"], /* CJK Ideograph */
+ ["\u605E", "\u605E"], /* CJK Ideograph */
+ ["\u605F", "\u605F"], /* CJK Ideograph */
+ ["\u6060", "\u6060"], /* CJK Ideograph */
+ ["\u6061", "\u6061"], /* CJK Ideograph */
+ ["\u6062", "\u6062"], /* CJK Ideograph */
+ ["\u6063", "\u6063"], /* CJK Ideograph */
+ ["\u6064", "\u6064"], /* CJK Ideograph */
+ ["\u6065", "\u6065"], /* CJK Ideograph */
+ ["\u6066", "\u6066"], /* CJK Ideograph */
+ ["\u6067", "\u6067"], /* CJK Ideograph */
+ ["\u6068", "\u6068"], /* CJK Ideograph */
+ ["\u6069", "\u6069"], /* CJK Ideograph */
+ ["\u606A", "\u606A"], /* CJK Ideograph */
+ ["\u606B", "\u606B"], /* CJK Ideograph */
+ ["\u606C", "\u606C"], /* CJK Ideograph */
+ ["\u606D", "\u606D"], /* CJK Ideograph */
+ ["\u606E", "\u606E"], /* CJK Ideograph */
+ ["\u606F", "\u606F"], /* CJK Ideograph */
+ ["\u6070", "\u6070"], /* CJK Ideograph */
+ ["\u6071", "\u6071"], /* CJK Ideograph */
+ ["\u6072", "\u6072"], /* CJK Ideograph */
+ ["\u6073", "\u6073"], /* CJK Ideograph */
+ ["\u6074", "\u6074"], /* CJK Ideograph */
+ ["\u6075", "\u6075"], /* CJK Ideograph */
+ ["\u6076", "\u6076"], /* CJK Ideograph */
+ ["\u6077", "\u6077"], /* CJK Ideograph */
+ ["\u6078", "\u6078"], /* CJK Ideograph */
+ ["\u6079", "\u6079"], /* CJK Ideograph */
+ ["\u607A", "\u607A"], /* CJK Ideograph */
+ ["\u607B", "\u607B"], /* CJK Ideograph */
+ ["\u607C", "\u607C"], /* CJK Ideograph */
+ ["\u607D", "\u607D"], /* CJK Ideograph */
+ ["\u607E", "\u607E"], /* CJK Ideograph */
+ ["\u607F", "\u607F"], /* CJK Ideograph */
+ ["\u6080", "\u6080"], /* CJK Ideograph */
+ ["\u6081", "\u6081"], /* CJK Ideograph */
+ ["\u6082", "\u6082"], /* CJK Ideograph */
+ ["\u6083", "\u6083"], /* CJK Ideograph */
+ ["\u6084", "\u6084"], /* CJK Ideograph */
+ ["\u6085", "\u6085"], /* CJK Ideograph */
+ ["\u6086", "\u6086"], /* CJK Ideograph */
+ ["\u6087", "\u6087"], /* CJK Ideograph */
+ ["\u6088", "\u6088"], /* CJK Ideograph */
+ ["\u6089", "\u6089"], /* CJK Ideograph */
+ ["\u608A", "\u608A"], /* CJK Ideograph */
+ ["\u608B", "\u608B"], /* CJK Ideograph */
+ ["\u608C", "\u608C"], /* CJK Ideograph */
+ ["\u608D", "\u608D"], /* CJK Ideograph */
+ ["\u608E", "\u608E"], /* CJK Ideograph */
+ ["\u608F", "\u608F"], /* CJK Ideograph */
+ ["\u6090", "\u6090"], /* CJK Ideograph */
+ ["\u6091", "\u6091"], /* CJK Ideograph */
+ ["\u6092", "\u6092"], /* CJK Ideograph */
+ ["\u6093", "\u6093"], /* CJK Ideograph */
+ ["\u6094", "\u6094"], /* CJK Ideograph */
+ ["\u6095", "\u6095"], /* CJK Ideograph */
+ ["\u6096", "\u6096"], /* CJK Ideograph */
+ ["\u6097", "\u6097"], /* CJK Ideograph */
+ ["\u6098", "\u6098"], /* CJK Ideograph */
+ ["\u6099", "\u6099"], /* CJK Ideograph */
+ ["\u609A", "\u609A"], /* CJK Ideograph */
+ ["\u609B", "\u609B"], /* CJK Ideograph */
+ ["\u609C", "\u609C"], /* CJK Ideograph */
+ ["\u609D", "\u609D"], /* CJK Ideograph */
+ ["\u609E", "\u609E"], /* CJK Ideograph */
+ ["\u609F", "\u609F"], /* CJK Ideograph */
+ ["\u60A0", "\u60A0"], /* CJK Ideograph */
+ ["\u60A1", "\u60A1"], /* CJK Ideograph */
+ ["\u60A2", "\u60A2"], /* CJK Ideograph */
+ ["\u60A3", "\u60A3"], /* CJK Ideograph */
+ ["\u60A4", "\u60A4"], /* CJK Ideograph */
+ ["\u60A5", "\u60A5"], /* CJK Ideograph */
+ ["\u60A6", "\u60A6"], /* CJK Ideograph */
+ ["\u60A7", "\u60A7"], /* CJK Ideograph */
+ ["\u60A8", "\u60A8"], /* CJK Ideograph */
+ ["\u60A9", "\u60A9"], /* CJK Ideograph */
+ ["\u60AA", "\u60AA"], /* CJK Ideograph */
+ ["\u60AB", "\u60AB"], /* CJK Ideograph */
+ ["\u60AC", "\u60AC"], /* CJK Ideograph */
+ ["\u60AD", "\u60AD"], /* CJK Ideograph */
+ ["\u60AE", "\u60AE"], /* CJK Ideograph */
+ ["\u60AF", "\u60AF"], /* CJK Ideograph */
+ ["\u60B0", "\u60B0"], /* CJK Ideograph */
+ ["\u60B1", "\u60B1"], /* CJK Ideograph */
+ ["\u60B2", "\u60B2"], /* CJK Ideograph */
+ ["\u60B3", "\u60B3"], /* CJK Ideograph */
+ ["\u60B4", "\u60B4"], /* CJK Ideograph */
+ ["\u60B5", "\u60B5"], /* CJK Ideograph */
+ ["\u60B6", "\u60B6"], /* CJK Ideograph */
+ ["\u60B7", "\u60B7"], /* CJK Ideograph */
+ ["\u60B8", "\u60B8"], /* CJK Ideograph */
+ ["\u60B9", "\u60B9"], /* CJK Ideograph */
+ ["\u60BA", "\u60BA"], /* CJK Ideograph */
+ ["\u60BB", "\u60BB"], /* CJK Ideograph */
+ ["\u60BC", "\u60BC"], /* CJK Ideograph */
+ ["\u60BD", "\u60BD"], /* CJK Ideograph */
+ ["\u60BE", "\u60BE"], /* CJK Ideograph */
+ ["\u60BF", "\u60BF"], /* CJK Ideograph */
+ ["\u60C0", "\u60C0"], /* CJK Ideograph */
+ ["\u60C1", "\u60C1"], /* CJK Ideograph */
+ ["\u60C2", "\u60C2"], /* CJK Ideograph */
+ ["\u60C3", "\u60C3"], /* CJK Ideograph */
+ ["\u60C4", "\u60C4"], /* CJK Ideograph */
+ ["\u60C5", "\u60C5"], /* CJK Ideograph */
+ ["\u60C6", "\u60C6"], /* CJK Ideograph */
+ ["\u60C7", "\u60C7"], /* CJK Ideograph */
+ ["\u60C8", "\u60C8"], /* CJK Ideograph */
+ ["\u60C9", "\u60C9"], /* CJK Ideograph */
+ ["\u60CA", "\u60CA"], /* CJK Ideograph */
+ ["\u60CB", "\u60CB"], /* CJK Ideograph */
+ ["\u60CC", "\u60CC"], /* CJK Ideograph */
+ ["\u60CD", "\u60CD"], /* CJK Ideograph */
+ ["\u60CE", "\u60CE"], /* CJK Ideograph */
+ ["\u60CF", "\u60CF"], /* CJK Ideograph */
+ ["\u60D0", "\u60D0"], /* CJK Ideograph */
+ ["\u60D1", "\u60D1"], /* CJK Ideograph */
+ ["\u60D2", "\u60D2"], /* CJK Ideograph */
+ ["\u60D3", "\u60D3"], /* CJK Ideograph */
+ ["\u60D4", "\u60D4"], /* CJK Ideograph */
+ ["\u60D5", "\u60D5"], /* CJK Ideograph */
+ ["\u60D6", "\u60D6"], /* CJK Ideograph */
+ ["\u60D7", "\u60D7"], /* CJK Ideograph */
+ ["\u60D8", "\u60D8"], /* CJK Ideograph */
+ ["\u60D9", "\u60D9"], /* CJK Ideograph */
+ ["\u60DA", "\u60DA"], /* CJK Ideograph */
+ ["\u60DB", "\u60DB"], /* CJK Ideograph */
+ ["\u60DC", "\u60DC"], /* CJK Ideograph */
+ ["\u60DD", "\u60DD"], /* CJK Ideograph */
+ ["\u60DE", "\u60DE"], /* CJK Ideograph */
+ ["\u60DF", "\u60DF"], /* CJK Ideograph */
+ ["\u60E0", "\u60E0"], /* CJK Ideograph */
+ ["\u60E1", "\u60E1"], /* CJK Ideograph */
+ ["\u60E2", "\u60E2"], /* CJK Ideograph */
+ ["\u60E3", "\u60E3"], /* CJK Ideograph */
+ ["\u60E4", "\u60E4"], /* CJK Ideograph */
+ ["\u60E5", "\u60E5"], /* CJK Ideograph */
+ ["\u60E6", "\u60E6"], /* CJK Ideograph */
+ ["\u60E7", "\u60E7"], /* CJK Ideograph */
+ ["\u60E8", "\u60E8"], /* CJK Ideograph */
+ ["\u60E9", "\u60E9"], /* CJK Ideograph */
+ ["\u60EA", "\u60EA"], /* CJK Ideograph */
+ ["\u60EB", "\u60EB"], /* CJK Ideograph */
+ ["\u60EC", "\u60EC"], /* CJK Ideograph */
+ ["\u60ED", "\u60ED"], /* CJK Ideograph */
+ ["\u60EE", "\u60EE"], /* CJK Ideograph */
+ ["\u60EF", "\u60EF"], /* CJK Ideograph */
+ ["\u60F0", "\u60F0"], /* CJK Ideograph */
+ ["\u60F1", "\u60F1"], /* CJK Ideograph */
+ ["\u60F2", "\u60F2"], /* CJK Ideograph */
+ ["\u60F3", "\u60F3"], /* CJK Ideograph */
+ ["\u60F4", "\u60F4"], /* CJK Ideograph */
+ ["\u60F5", "\u60F5"], /* CJK Ideograph */
+ ["\u60F6", "\u60F6"], /* CJK Ideograph */
+ ["\u60F7", "\u60F7"], /* CJK Ideograph */
+ ["\u60F8", "\u60F8"], /* CJK Ideograph */
+ ["\u60F9", "\u60F9"], /* CJK Ideograph */
+ ["\u60FA", "\u60FA"], /* CJK Ideograph */
+ ["\u60FB", "\u60FB"], /* CJK Ideograph */
+ ["\u60FC", "\u60FC"], /* CJK Ideograph */
+ ["\u60FD", "\u60FD"], /* CJK Ideograph */
+ ["\u60FE", "\u60FE"], /* CJK Ideograph */
+ ["\u60FF", "\u60FF"], /* CJK Ideograph */
+ ["\u6100", "\u6100"], /* CJK Ideograph */
+ ["\u6101", "\u6101"], /* CJK Ideograph */
+ ["\u6102", "\u6102"], /* CJK Ideograph */
+ ["\u6103", "\u6103"], /* CJK Ideograph */
+ ["\u6104", "\u6104"], /* CJK Ideograph */
+ ["\u6105", "\u6105"], /* CJK Ideograph */
+ ["\u6106", "\u6106"], /* CJK Ideograph */
+ ["\u6107", "\u6107"], /* CJK Ideograph */
+ ["\u6108", "\u6108"], /* CJK Ideograph */
+ ["\u6109", "\u6109"], /* CJK Ideograph */
+ ["\u610A", "\u610A"], /* CJK Ideograph */
+ ["\u610B", "\u610B"], /* CJK Ideograph */
+ ["\u610C", "\u610C"], /* CJK Ideograph */
+ ["\u610D", "\u610D"], /* CJK Ideograph */
+ ["\u610E", "\u610E"], /* CJK Ideograph */
+ ["\u610F", "\u610F"], /* CJK Ideograph */
+ ["\u6110", "\u6110"], /* CJK Ideograph */
+ ["\u6111", "\u6111"], /* CJK Ideograph */
+ ["\u6112", "\u6112"], /* CJK Ideograph */
+ ["\u6113", "\u6113"], /* CJK Ideograph */
+ ["\u6114", "\u6114"], /* CJK Ideograph */
+ ["\u6115", "\u6115"], /* CJK Ideograph */
+ ["\u6116", "\u6116"], /* CJK Ideograph */
+ ["\u6117", "\u6117"], /* CJK Ideograph */
+ ["\u6118", "\u6118"], /* CJK Ideograph */
+ ["\u6119", "\u6119"], /* CJK Ideograph */
+ ["\u611A", "\u611A"], /* CJK Ideograph */
+ ["\u611B", "\u611B"], /* CJK Ideograph */
+ ["\u611C", "\u611C"], /* CJK Ideograph */
+ ["\u611D", "\u611D"], /* CJK Ideograph */
+ ["\u611E", "\u611E"], /* CJK Ideograph */
+ ["\u611F", "\u611F"], /* CJK Ideograph */
+ ["\u6120", "\u6120"], /* CJK Ideograph */
+ ["\u6121", "\u6121"], /* CJK Ideograph */
+ ["\u6122", "\u6122"], /* CJK Ideograph */
+ ["\u6123", "\u6123"], /* CJK Ideograph */
+ ["\u6124", "\u6124"], /* CJK Ideograph */
+ ["\u6125", "\u6125"], /* CJK Ideograph */
+ ["\u6126", "\u6126"], /* CJK Ideograph */
+ ["\u6127", "\u6127"], /* CJK Ideograph */
+ ["\u6128", "\u6128"], /* CJK Ideograph */
+ ["\u6129", "\u6129"], /* CJK Ideograph */
+ ["\u612A", "\u612A"], /* CJK Ideograph */
+ ["\u612B", "\u612B"], /* CJK Ideograph */
+ ["\u612C", "\u612C"], /* CJK Ideograph */
+ ["\u612D", "\u612D"], /* CJK Ideograph */
+ ["\u612E", "\u612E"], /* CJK Ideograph */
+ ["\u612F", "\u612F"], /* CJK Ideograph */
+ ["\u6130", "\u6130"], /* CJK Ideograph */
+ ["\u6131", "\u6131"], /* CJK Ideograph */
+ ["\u6132", "\u6132"], /* CJK Ideograph */
+ ["\u6133", "\u6133"], /* CJK Ideograph */
+ ["\u6134", "\u6134"], /* CJK Ideograph */
+ ["\u6135", "\u6135"], /* CJK Ideograph */
+ ["\u6136", "\u6136"], /* CJK Ideograph */
+ ["\u6137", "\u6137"], /* CJK Ideograph */
+ ["\u6138", "\u6138"], /* CJK Ideograph */
+ ["\u6139", "\u6139"], /* CJK Ideograph */
+ ["\u613A", "\u613A"], /* CJK Ideograph */
+ ["\u613B", "\u613B"], /* CJK Ideograph */
+ ["\u613C", "\u613C"], /* CJK Ideograph */
+ ["\u613D", "\u613D"], /* CJK Ideograph */
+ ["\u613E", "\u613E"], /* CJK Ideograph */
+ ["\u613F", "\u613F"], /* CJK Ideograph */
+ ["\u6140", "\u6140"], /* CJK Ideograph */
+ ["\u6141", "\u6141"], /* CJK Ideograph */
+ ["\u6142", "\u6142"], /* CJK Ideograph */
+ ["\u6143", "\u6143"], /* CJK Ideograph */
+ ["\u6144", "\u6144"], /* CJK Ideograph */
+ ["\u6145", "\u6145"], /* CJK Ideograph */
+ ["\u6146", "\u6146"], /* CJK Ideograph */
+ ["\u6147", "\u6147"], /* CJK Ideograph */
+ ["\u6148", "\u6148"], /* CJK Ideograph */
+ ["\u6149", "\u6149"], /* CJK Ideograph */
+ ["\u614A", "\u614A"], /* CJK Ideograph */
+ ["\u614B", "\u614B"], /* CJK Ideograph */
+ ["\u614C", "\u614C"], /* CJK Ideograph */
+ ["\u614D", "\u614D"], /* CJK Ideograph */
+ ["\u614E", "\u614E"], /* CJK Ideograph */
+ ["\u614F", "\u614F"], /* CJK Ideograph */
+ ["\u6150", "\u6150"], /* CJK Ideograph */
+ ["\u6151", "\u6151"], /* CJK Ideograph */
+ ["\u6152", "\u6152"], /* CJK Ideograph */
+ ["\u6153", "\u6153"], /* CJK Ideograph */
+ ["\u6154", "\u6154"], /* CJK Ideograph */
+ ["\u6155", "\u6155"], /* CJK Ideograph */
+ ["\u6156", "\u6156"], /* CJK Ideograph */
+ ["\u6157", "\u6157"], /* CJK Ideograph */
+ ["\u6158", "\u6158"], /* CJK Ideograph */
+ ["\u6159", "\u6159"], /* CJK Ideograph */
+ ["\u615A", "\u615A"], /* CJK Ideograph */
+ ["\u615B", "\u615B"], /* CJK Ideograph */
+ ["\u615C", "\u615C"], /* CJK Ideograph */
+ ["\u615D", "\u615D"], /* CJK Ideograph */
+ ["\u615E", "\u615E"], /* CJK Ideograph */
+ ["\u615F", "\u615F"], /* CJK Ideograph */
+ ["\u6160", "\u6160"], /* CJK Ideograph */
+ ["\u6161", "\u6161"], /* CJK Ideograph */
+ ["\u6162", "\u6162"], /* CJK Ideograph */
+ ["\u6163", "\u6163"], /* CJK Ideograph */
+ ["\u6164", "\u6164"], /* CJK Ideograph */
+ ["\u6165", "\u6165"], /* CJK Ideograph */
+ ["\u6166", "\u6166"], /* CJK Ideograph */
+ ["\u6167", "\u6167"], /* CJK Ideograph */
+ ["\u6168", "\u6168"], /* CJK Ideograph */
+ ["\u6169", "\u6169"], /* CJK Ideograph */
+ ["\u616A", "\u616A"], /* CJK Ideograph */
+ ["\u616B", "\u616B"], /* CJK Ideograph */
+ ["\u616C", "\u616C"], /* CJK Ideograph */
+ ["\u616D", "\u616D"], /* CJK Ideograph */
+ ["\u616E", "\u616E"], /* CJK Ideograph */
+ ["\u616F", "\u616F"], /* CJK Ideograph */
+ ["\u6170", "\u6170"], /* CJK Ideograph */
+ ["\u6171", "\u6171"], /* CJK Ideograph */
+ ["\u6172", "\u6172"], /* CJK Ideograph */
+ ["\u6173", "\u6173"], /* CJK Ideograph */
+ ["\u6174", "\u6174"], /* CJK Ideograph */
+ ["\u6175", "\u6175"], /* CJK Ideograph */
+ ["\u6176", "\u6176"], /* CJK Ideograph */
+ ["\u6177", "\u6177"], /* CJK Ideograph */
+ ["\u6178", "\u6178"], /* CJK Ideograph */
+ ["\u6179", "\u6179"], /* CJK Ideograph */
+ ["\u617A", "\u617A"], /* CJK Ideograph */
+ ["\u617B", "\u617B"], /* CJK Ideograph */
+ ["\u617C", "\u617C"], /* CJK Ideograph */
+ ["\u617D", "\u617D"], /* CJK Ideograph */
+ ["\u617E", "\u617E"], /* CJK Ideograph */
+ ["\u617F", "\u617F"], /* CJK Ideograph */
+ ["\u6180", "\u6180"], /* CJK Ideograph */
+ ["\u6181", "\u6181"], /* CJK Ideograph */
+ ["\u6182", "\u6182"], /* CJK Ideograph */
+ ["\u6183", "\u6183"], /* CJK Ideograph */
+ ["\u6184", "\u6184"], /* CJK Ideograph */
+ ["\u6185", "\u6185"], /* CJK Ideograph */
+ ["\u6186", "\u6186"], /* CJK Ideograph */
+ ["\u6187", "\u6187"], /* CJK Ideograph */
+ ["\u6188", "\u6188"], /* CJK Ideograph */
+ ["\u6189", "\u6189"], /* CJK Ideograph */
+ ["\u618A", "\u618A"], /* CJK Ideograph */
+ ["\u618B", "\u618B"], /* CJK Ideograph */
+ ["\u618C", "\u618C"], /* CJK Ideograph */
+ ["\u618D", "\u618D"], /* CJK Ideograph */
+ ["\u618E", "\u618E"], /* CJK Ideograph */
+ ["\u618F", "\u618F"], /* CJK Ideograph */
+ ["\u6190", "\u6190"], /* CJK Ideograph */
+ ["\u6191", "\u6191"], /* CJK Ideograph */
+ ["\u6192", "\u6192"], /* CJK Ideograph */
+ ["\u6193", "\u6193"], /* CJK Ideograph */
+ ["\u6194", "\u6194"], /* CJK Ideograph */
+ ["\u6195", "\u6195"], /* CJK Ideograph */
+ ["\u6196", "\u6196"], /* CJK Ideograph */
+ ["\u6197", "\u6197"], /* CJK Ideograph */
+ ["\u6198", "\u6198"], /* CJK Ideograph */
+ ["\u6199", "\u6199"], /* CJK Ideograph */
+ ["\u619A", "\u619A"], /* CJK Ideograph */
+ ["\u619B", "\u619B"], /* CJK Ideograph */
+ ["\u619C", "\u619C"], /* CJK Ideograph */
+ ["\u619D", "\u619D"], /* CJK Ideograph */
+ ["\u619E", "\u619E"], /* CJK Ideograph */
+ ["\u619F", "\u619F"], /* CJK Ideograph */
+ ["\u61A0", "\u61A0"], /* CJK Ideograph */
+ ["\u61A1", "\u61A1"], /* CJK Ideograph */
+ ["\u61A2", "\u61A2"], /* CJK Ideograph */
+ ["\u61A3", "\u61A3"], /* CJK Ideograph */
+ ["\u61A4", "\u61A4"], /* CJK Ideograph */
+ ["\u61A5", "\u61A5"], /* CJK Ideograph */
+ ["\u61A6", "\u61A6"], /* CJK Ideograph */
+ ["\u61A7", "\u61A7"], /* CJK Ideograph */
+ ["\u61A8", "\u61A8"], /* CJK Ideograph */
+ ["\u61A9", "\u61A9"], /* CJK Ideograph */
+ ["\u61AA", "\u61AA"], /* CJK Ideograph */
+ ["\u61AB", "\u61AB"], /* CJK Ideograph */
+ ["\u61AC", "\u61AC"], /* CJK Ideograph */
+ ["\u61AD", "\u61AD"], /* CJK Ideograph */
+ ["\u61AE", "\u61AE"], /* CJK Ideograph */
+ ["\u61AF", "\u61AF"], /* CJK Ideograph */
+ ["\u61B0", "\u61B0"], /* CJK Ideograph */
+ ["\u61B1", "\u61B1"], /* CJK Ideograph */
+ ["\u61B2", "\u61B2"], /* CJK Ideograph */
+ ["\u61B3", "\u61B3"], /* CJK Ideograph */
+ ["\u61B4", "\u61B4"], /* CJK Ideograph */
+ ["\u61B5", "\u61B5"], /* CJK Ideograph */
+ ["\u61B6", "\u61B6"], /* CJK Ideograph */
+ ["\u61B7", "\u61B7"], /* CJK Ideograph */
+ ["\u61B8", "\u61B8"], /* CJK Ideograph */
+ ["\u61B9", "\u61B9"], /* CJK Ideograph */
+ ["\u61BA", "\u61BA"], /* CJK Ideograph */
+ ["\u61BB", "\u61BB"], /* CJK Ideograph */
+ ["\u61BC", "\u61BC"], /* CJK Ideograph */
+ ["\u61BD", "\u61BD"], /* CJK Ideograph */
+ ["\u61BE", "\u61BE"], /* CJK Ideograph */
+ ["\u61BF", "\u61BF"], /* CJK Ideograph */
+ ["\u61C0", "\u61C0"], /* CJK Ideograph */
+ ["\u61C1", "\u61C1"], /* CJK Ideograph */
+ ["\u61C2", "\u61C2"], /* CJK Ideograph */
+ ["\u61C3", "\u61C3"], /* CJK Ideograph */
+ ["\u61C4", "\u61C4"], /* CJK Ideograph */
+ ["\u61C5", "\u61C5"], /* CJK Ideograph */
+ ["\u61C6", "\u61C6"], /* CJK Ideograph */
+ ["\u61C7", "\u61C7"], /* CJK Ideograph */
+ ["\u61C8", "\u61C8"], /* CJK Ideograph */
+ ["\u61C9", "\u61C9"], /* CJK Ideograph */
+ ["\u61CA", "\u61CA"], /* CJK Ideograph */
+ ["\u61CB", "\u61CB"], /* CJK Ideograph */
+ ["\u61CC", "\u61CC"], /* CJK Ideograph */
+ ["\u61CD", "\u61CD"], /* CJK Ideograph */
+ ["\u61CE", "\u61CE"], /* CJK Ideograph */
+ ["\u61CF", "\u61CF"], /* CJK Ideograph */
+ ["\u61D0", "\u61D0"], /* CJK Ideograph */
+ ["\u61D1", "\u61D1"], /* CJK Ideograph */
+ ["\u61D2", "\u61D2"], /* CJK Ideograph */
+ ["\u61D3", "\u61D3"], /* CJK Ideograph */
+ ["\u61D4", "\u61D4"], /* CJK Ideograph */
+ ["\u61D5", "\u61D5"], /* CJK Ideograph */
+ ["\u61D6", "\u61D6"], /* CJK Ideograph */
+ ["\u61D7", "\u61D7"], /* CJK Ideograph */
+ ["\u61D8", "\u61D8"], /* CJK Ideograph */
+ ["\u61D9", "\u61D9"], /* CJK Ideograph */
+ ["\u61DA", "\u61DA"], /* CJK Ideograph */
+ ["\u61DB", "\u61DB"], /* CJK Ideograph */
+ ["\u61DC", "\u61DC"], /* CJK Ideograph */
+ ["\u61DD", "\u61DD"], /* CJK Ideograph */
+ ["\u61DE", "\u61DE"], /* CJK Ideograph */
+ ["\u61DF", "\u61DF"], /* CJK Ideograph */
+ ["\u61E0", "\u61E0"], /* CJK Ideograph */
+ ["\u61E1", "\u61E1"], /* CJK Ideograph */
+ ["\u61E2", "\u61E2"], /* CJK Ideograph */
+ ["\u61E3", "\u61E3"], /* CJK Ideograph */
+ ["\u61E4", "\u61E4"], /* CJK Ideograph */
+ ["\u61E5", "\u61E5"], /* CJK Ideograph */
+ ["\u61E6", "\u61E6"], /* CJK Ideograph */
+ ["\u61E7", "\u61E7"], /* CJK Ideograph */
+ ["\u61E8", "\u61E8"], /* CJK Ideograph */
+ ["\u61E9", "\u61E9"], /* CJK Ideograph */
+ ["\u61EA", "\u61EA"], /* CJK Ideograph */
+ ["\u61EB", "\u61EB"], /* CJK Ideograph */
+ ["\u61EC", "\u61EC"], /* CJK Ideograph */
+ ["\u61ED", "\u61ED"], /* CJK Ideograph */
+ ["\u61EE", "\u61EE"], /* CJK Ideograph */
+ ["\u61EF", "\u61EF"], /* CJK Ideograph */
+ ["\u61F0", "\u61F0"], /* CJK Ideograph */
+ ["\u61F1", "\u61F1"], /* CJK Ideograph */
+ ["\u61F2", "\u61F2"], /* CJK Ideograph */
+ ["\u61F3", "\u61F3"], /* CJK Ideograph */
+ ["\u61F4", "\u61F4"], /* CJK Ideograph */
+ ["\u61F5", "\u61F5"], /* CJK Ideograph */
+ ["\u61F6", "\u61F6"], /* CJK Ideograph */
+ ["\u61F7", "\u61F7"], /* CJK Ideograph */
+ ["\u61F8", "\u61F8"], /* CJK Ideograph */
+ ["\u61F9", "\u61F9"], /* CJK Ideograph */
+ ["\u61FA", "\u61FA"], /* CJK Ideograph */
+ ["\u61FB", "\u61FB"], /* CJK Ideograph */
+ ["\u61FC", "\u61FC"], /* CJK Ideograph */
+ ["\u61FD", "\u61FD"], /* CJK Ideograph */
+ ["\u61FE", "\u61FE"], /* CJK Ideograph */
+ ["\u61FF", "\u61FF"], /* CJK Ideograph */
+ ["\u6200", "\u6200"], /* CJK Ideograph */
+ ["\u6201", "\u6201"], /* CJK Ideograph */
+ ["\u6202", "\u6202"], /* CJK Ideograph */
+ ["\u6203", "\u6203"], /* CJK Ideograph */
+ ["\u6204", "\u6204"], /* CJK Ideograph */
+ ["\u6205", "\u6205"], /* CJK Ideograph */
+ ["\u6206", "\u6206"], /* CJK Ideograph */
+ ["\u6207", "\u6207"], /* CJK Ideograph */
+ ["\u6208", "\u6208"], /* CJK Ideograph */
+ ["\u6209", "\u6209"], /* CJK Ideograph */
+ ["\u620A", "\u620A"], /* CJK Ideograph */
+ ["\u620B", "\u620B"], /* CJK Ideograph */
+ ["\u620C", "\u620C"], /* CJK Ideograph */
+ ["\u620D", "\u620D"], /* CJK Ideograph */
+ ["\u620E", "\u620E"], /* CJK Ideograph */
+ ["\u620F", "\u620F"], /* CJK Ideograph */
+ ["\u6210", "\u6210"], /* CJK Ideograph */
+ ["\u6211", "\u6211"], /* CJK Ideograph */
+ ["\u6212", "\u6212"], /* CJK Ideograph */
+ ["\u6213", "\u6213"], /* CJK Ideograph */
+ ["\u6214", "\u6214"], /* CJK Ideograph */
+ ["\u6215", "\u6215"], /* CJK Ideograph */
+ ["\u6216", "\u6216"], /* CJK Ideograph */
+ ["\u6217", "\u6217"], /* CJK Ideograph */
+ ["\u6218", "\u6218"], /* CJK Ideograph */
+ ["\u6219", "\u6219"], /* CJK Ideograph */
+ ["\u621A", "\u621A"], /* CJK Ideograph */
+ ["\u621B", "\u621B"], /* CJK Ideograph */
+ ["\u621C", "\u621C"], /* CJK Ideograph */
+ ["\u621D", "\u621D"], /* CJK Ideograph */
+ ["\u621E", "\u621E"], /* CJK Ideograph */
+ ["\u621F", "\u621F"], /* CJK Ideograph */
+ ["\u6220", "\u6220"], /* CJK Ideograph */
+ ["\u6221", "\u6221"], /* CJK Ideograph */
+ ["\u6222", "\u6222"], /* CJK Ideograph */
+ ["\u6223", "\u6223"], /* CJK Ideograph */
+ ["\u6224", "\u6224"], /* CJK Ideograph */
+ ["\u6225", "\u6225"], /* CJK Ideograph */
+ ["\u6226", "\u6226"], /* CJK Ideograph */
+ ["\u6227", "\u6227"], /* CJK Ideograph */
+ ["\u6228", "\u6228"], /* CJK Ideograph */
+ ["\u6229", "\u6229"], /* CJK Ideograph */
+ ["\u622A", "\u622A"], /* CJK Ideograph */
+ ["\u622B", "\u622B"], /* CJK Ideograph */
+ ["\u622C", "\u622C"], /* CJK Ideograph */
+ ["\u622D", "\u622D"], /* CJK Ideograph */
+ ["\u622E", "\u622E"], /* CJK Ideograph */
+ ["\u622F", "\u622F"], /* CJK Ideograph */
+ ["\u6230", "\u6230"], /* CJK Ideograph */
+ ["\u6231", "\u6231"], /* CJK Ideograph */
+ ["\u6232", "\u6232"], /* CJK Ideograph */
+ ["\u6233", "\u6233"], /* CJK Ideograph */
+ ["\u6234", "\u6234"], /* CJK Ideograph */
+ ["\u6235", "\u6235"], /* CJK Ideograph */
+ ["\u6236", "\u6236"], /* CJK Ideograph */
+ ["\u6237", "\u6237"], /* CJK Ideograph */
+ ["\u6238", "\u6238"], /* CJK Ideograph */
+ ["\u6239", "\u6239"], /* CJK Ideograph */
+ ["\u623A", "\u623A"], /* CJK Ideograph */
+ ["\u623B", "\u623B"], /* CJK Ideograph */
+ ["\u623C", "\u623C"], /* CJK Ideograph */
+ ["\u623D", "\u623D"], /* CJK Ideograph */
+ ["\u623E", "\u623E"], /* CJK Ideograph */
+ ["\u623F", "\u623F"], /* CJK Ideograph */
+ ["\u6240", "\u6240"], /* CJK Ideograph */
+ ["\u6241", "\u6241"], /* CJK Ideograph */
+ ["\u6242", "\u6242"], /* CJK Ideograph */
+ ["\u6243", "\u6243"], /* CJK Ideograph */
+ ["\u6244", "\u6244"], /* CJK Ideograph */
+ ["\u6245", "\u6245"], /* CJK Ideograph */
+ ["\u6246", "\u6246"], /* CJK Ideograph */
+ ["\u6247", "\u6247"], /* CJK Ideograph */
+ ["\u6248", "\u6248"], /* CJK Ideograph */
+ ["\u6249", "\u6249"], /* CJK Ideograph */
+ ["\u624A", "\u624A"], /* CJK Ideograph */
+ ["\u624B", "\u624B"], /* CJK Ideograph */
+ ["\u624C", "\u624C"], /* CJK Ideograph */
+ ["\u624D", "\u624D"], /* CJK Ideograph */
+ ["\u624E", "\u624E"], /* CJK Ideograph */
+ ["\u624F", "\u624F"], /* CJK Ideograph */
+ ["\u6250", "\u6250"], /* CJK Ideograph */
+ ["\u6251", "\u6251"], /* CJK Ideograph */
+ ["\u6252", "\u6252"], /* CJK Ideograph */
+ ["\u6253", "\u6253"], /* CJK Ideograph */
+ ["\u6254", "\u6254"], /* CJK Ideograph */
+ ["\u6255", "\u6255"], /* CJK Ideograph */
+ ["\u6256", "\u6256"], /* CJK Ideograph */
+ ["\u6257", "\u6257"], /* CJK Ideograph */
+ ["\u6258", "\u6258"], /* CJK Ideograph */
+ ["\u6259", "\u6259"], /* CJK Ideograph */
+ ["\u625A", "\u625A"], /* CJK Ideograph */
+ ["\u625B", "\u625B"], /* CJK Ideograph */
+ ["\u625C", "\u625C"], /* CJK Ideograph */
+ ["\u625D", "\u625D"], /* CJK Ideograph */
+ ["\u625E", "\u625E"], /* CJK Ideograph */
+ ["\u625F", "\u625F"], /* CJK Ideograph */
+ ["\u6260", "\u6260"], /* CJK Ideograph */
+ ["\u6261", "\u6261"], /* CJK Ideograph */
+ ["\u6262", "\u6262"], /* CJK Ideograph */
+ ["\u6263", "\u6263"], /* CJK Ideograph */
+ ["\u6264", "\u6264"], /* CJK Ideograph */
+ ["\u6265", "\u6265"], /* CJK Ideograph */
+ ["\u6266", "\u6266"], /* CJK Ideograph */
+ ["\u6267", "\u6267"], /* CJK Ideograph */
+ ["\u6268", "\u6268"], /* CJK Ideograph */
+ ["\u6269", "\u6269"], /* CJK Ideograph */
+ ["\u626A", "\u626A"], /* CJK Ideograph */
+ ["\u626B", "\u626B"], /* CJK Ideograph */
+ ["\u626C", "\u626C"], /* CJK Ideograph */
+ ["\u626D", "\u626D"], /* CJK Ideograph */
+ ["\u626E", "\u626E"], /* CJK Ideograph */
+ ["\u626F", "\u626F"], /* CJK Ideograph */
+ ["\u6270", "\u6270"], /* CJK Ideograph */
+ ["\u6271", "\u6271"], /* CJK Ideograph */
+ ["\u6272", "\u6272"], /* CJK Ideograph */
+ ["\u6273", "\u6273"], /* CJK Ideograph */
+ ["\u6274", "\u6274"], /* CJK Ideograph */
+ ["\u6275", "\u6275"], /* CJK Ideograph */
+ ["\u6276", "\u6276"], /* CJK Ideograph */
+ ["\u6277", "\u6277"], /* CJK Ideograph */
+ ["\u6278", "\u6278"], /* CJK Ideograph */
+ ["\u6279", "\u6279"], /* CJK Ideograph */
+ ["\u627A", "\u627A"], /* CJK Ideograph */
+ ["\u627B", "\u627B"], /* CJK Ideograph */
+ ["\u627C", "\u627C"], /* CJK Ideograph */
+ ["\u627D", "\u627D"], /* CJK Ideograph */
+ ["\u627E", "\u627E"], /* CJK Ideograph */
+ ["\u627F", "\u627F"], /* CJK Ideograph */
+ ["\u6280", "\u6280"], /* CJK Ideograph */
+ ["\u6281", "\u6281"], /* CJK Ideograph */
+ ["\u6282", "\u6282"], /* CJK Ideograph */
+ ["\u6283", "\u6283"], /* CJK Ideograph */
+ ["\u6284", "\u6284"], /* CJK Ideograph */
+ ["\u6285", "\u6285"], /* CJK Ideograph */
+ ["\u6286", "\u6286"], /* CJK Ideograph */
+ ["\u6287", "\u6287"], /* CJK Ideograph */
+ ["\u6288", "\u6288"], /* CJK Ideograph */
+ ["\u6289", "\u6289"], /* CJK Ideograph */
+ ["\u628A", "\u628A"], /* CJK Ideograph */
+ ["\u628B", "\u628B"], /* CJK Ideograph */
+ ["\u628C", "\u628C"], /* CJK Ideograph */
+ ["\u628D", "\u628D"], /* CJK Ideograph */
+ ["\u628E", "\u628E"], /* CJK Ideograph */
+ ["\u628F", "\u628F"], /* CJK Ideograph */
+ ["\u6290", "\u6290"], /* CJK Ideograph */
+ ["\u6291", "\u6291"], /* CJK Ideograph */
+ ["\u6292", "\u6292"], /* CJK Ideograph */
+ ["\u6293", "\u6293"], /* CJK Ideograph */
+ ["\u6294", "\u6294"], /* CJK Ideograph */
+ ["\u6295", "\u6295"], /* CJK Ideograph */
+ ["\u6296", "\u6296"], /* CJK Ideograph */
+ ["\u6297", "\u6297"], /* CJK Ideograph */
+ ["\u6298", "\u6298"], /* CJK Ideograph */
+ ["\u6299", "\u6299"], /* CJK Ideograph */
+ ["\u629A", "\u629A"], /* CJK Ideograph */
+ ["\u629B", "\u629B"], /* CJK Ideograph */
+ ["\u629C", "\u629C"], /* CJK Ideograph */
+ ["\u629D", "\u629D"], /* CJK Ideograph */
+ ["\u629E", "\u629E"], /* CJK Ideograph */
+ ["\u629F", "\u629F"], /* CJK Ideograph */
+ ["\u62A0", "\u62A0"], /* CJK Ideograph */
+ ["\u62A1", "\u62A1"], /* CJK Ideograph */
+ ["\u62A2", "\u62A2"], /* CJK Ideograph */
+ ["\u62A3", "\u62A3"], /* CJK Ideograph */
+ ["\u62A4", "\u62A4"], /* CJK Ideograph */
+ ["\u62A5", "\u62A5"], /* CJK Ideograph */
+ ["\u62A6", "\u62A6"], /* CJK Ideograph */
+ ["\u62A7", "\u62A7"], /* CJK Ideograph */
+ ["\u62A8", "\u62A8"], /* CJK Ideograph */
+ ["\u62A9", "\u62A9"], /* CJK Ideograph */
+ ["\u62AA", "\u62AA"], /* CJK Ideograph */
+ ["\u62AB", "\u62AB"], /* CJK Ideograph */
+ ["\u62AC", "\u62AC"], /* CJK Ideograph */
+ ["\u62AD", "\u62AD"], /* CJK Ideograph */
+ ["\u62AE", "\u62AE"], /* CJK Ideograph */
+ ["\u62AF", "\u62AF"], /* CJK Ideograph */
+ ["\u62B0", "\u62B0"], /* CJK Ideograph */
+ ["\u62B1", "\u62B1"], /* CJK Ideograph */
+ ["\u62B2", "\u62B2"], /* CJK Ideograph */
+ ["\u62B3", "\u62B3"], /* CJK Ideograph */
+ ["\u62B4", "\u62B4"], /* CJK Ideograph */
+ ["\u62B5", "\u62B5"], /* CJK Ideograph */
+ ["\u62B6", "\u62B6"], /* CJK Ideograph */
+ ["\u62B7", "\u62B7"], /* CJK Ideograph */
+ ["\u62B8", "\u62B8"], /* CJK Ideograph */
+ ["\u62B9", "\u62B9"], /* CJK Ideograph */
+ ["\u62BA", "\u62BA"], /* CJK Ideograph */
+ ["\u62BB", "\u62BB"], /* CJK Ideograph */
+ ["\u62BC", "\u62BC"], /* CJK Ideograph */
+ ["\u62BD", "\u62BD"], /* CJK Ideograph */
+ ["\u62BE", "\u62BE"], /* CJK Ideograph */
+ ["\u62BF", "\u62BF"], /* CJK Ideograph */
+ ["\u62C0", "\u62C0"], /* CJK Ideograph */
+ ["\u62C1", "\u62C1"], /* CJK Ideograph */
+ ["\u62C2", "\u62C2"], /* CJK Ideograph */
+ ["\u62C3", "\u62C3"], /* CJK Ideograph */
+ ["\u62C4", "\u62C4"], /* CJK Ideograph */
+ ["\u62C5", "\u62C5"], /* CJK Ideograph */
+ ["\u62C6", "\u62C6"], /* CJK Ideograph */
+ ["\u62C7", "\u62C7"], /* CJK Ideograph */
+ ["\u62C8", "\u62C8"], /* CJK Ideograph */
+ ["\u62C9", "\u62C9"], /* CJK Ideograph */
+ ["\u62CA", "\u62CA"], /* CJK Ideograph */
+ ["\u62CB", "\u62CB"], /* CJK Ideograph */
+ ["\u62CC", "\u62CC"], /* CJK Ideograph */
+ ["\u62CD", "\u62CD"], /* CJK Ideograph */
+ ["\u62CE", "\u62CE"], /* CJK Ideograph */
+ ["\u62CF", "\u62CF"], /* CJK Ideograph */
+ ["\u62D0", "\u62D0"], /* CJK Ideograph */
+ ["\u62D1", "\u62D1"], /* CJK Ideograph */
+ ["\u62D2", "\u62D2"], /* CJK Ideograph */
+ ["\u62D3", "\u62D3"], /* CJK Ideograph */
+ ["\u62D4", "\u62D4"], /* CJK Ideograph */
+ ["\u62D5", "\u62D5"], /* CJK Ideograph */
+ ["\u62D6", "\u62D6"], /* CJK Ideograph */
+ ["\u62D7", "\u62D7"], /* CJK Ideograph */
+ ["\u62D8", "\u62D8"], /* CJK Ideograph */
+ ["\u62D9", "\u62D9"], /* CJK Ideograph */
+ ["\u62DA", "\u62DA"], /* CJK Ideograph */
+ ["\u62DB", "\u62DB"], /* CJK Ideograph */
+ ["\u62DC", "\u62DC"], /* CJK Ideograph */
+ ["\u62DD", "\u62DD"], /* CJK Ideograph */
+ ["\u62DE", "\u62DE"], /* CJK Ideograph */
+ ["\u62DF", "\u62DF"], /* CJK Ideograph */
+ ["\u62E0", "\u62E0"], /* CJK Ideograph */
+ ["\u62E1", "\u62E1"], /* CJK Ideograph */
+ ["\u62E2", "\u62E2"], /* CJK Ideograph */
+ ["\u62E3", "\u62E3"], /* CJK Ideograph */
+ ["\u62E4", "\u62E4"], /* CJK Ideograph */
+ ["\u62E5", "\u62E5"], /* CJK Ideograph */
+ ["\u62E6", "\u62E6"], /* CJK Ideograph */
+ ["\u62E7", "\u62E7"], /* CJK Ideograph */
+ ["\u62E8", "\u62E8"], /* CJK Ideograph */
+ ["\u62E9", "\u62E9"], /* CJK Ideograph */
+ ["\u62EA", "\u62EA"], /* CJK Ideograph */
+ ["\u62EB", "\u62EB"], /* CJK Ideograph */
+ ["\u62EC", "\u62EC"], /* CJK Ideograph */
+ ["\u62ED", "\u62ED"], /* CJK Ideograph */
+ ["\u62EE", "\u62EE"], /* CJK Ideograph */
+ ["\u62EF", "\u62EF"], /* CJK Ideograph */
+ ["\u62F0", "\u62F0"], /* CJK Ideograph */
+ ["\u62F1", "\u62F1"], /* CJK Ideograph */
+ ["\u62F2", "\u62F2"], /* CJK Ideograph */
+ ["\u62F3", "\u62F3"], /* CJK Ideograph */
+ ["\u62F4", "\u62F4"], /* CJK Ideograph */
+ ["\u62F5", "\u62F5"], /* CJK Ideograph */
+ ["\u62F6", "\u62F6"], /* CJK Ideograph */
+ ["\u62F7", "\u62F7"], /* CJK Ideograph */
+ ["\u62F8", "\u62F8"], /* CJK Ideograph */
+ ["\u62F9", "\u62F9"], /* CJK Ideograph */
+ ["\u62FA", "\u62FA"], /* CJK Ideograph */
+ ["\u62FB", "\u62FB"], /* CJK Ideograph */
+ ["\u62FC", "\u62FC"], /* CJK Ideograph */
+ ["\u62FD", "\u62FD"], /* CJK Ideograph */
+ ["\u62FE", "\u62FE"], /* CJK Ideograph */
+ ["\u62FF", "\u62FF"], /* CJK Ideograph */
+ ["\u6300", "\u6300"], /* CJK Ideograph */
+ ["\u6301", "\u6301"], /* CJK Ideograph */
+ ["\u6302", "\u6302"], /* CJK Ideograph */
+ ["\u6303", "\u6303"], /* CJK Ideograph */
+ ["\u6304", "\u6304"], /* CJK Ideograph */
+ ["\u6305", "\u6305"], /* CJK Ideograph */
+ ["\u6306", "\u6306"], /* CJK Ideograph */
+ ["\u6307", "\u6307"], /* CJK Ideograph */
+ ["\u6308", "\u6308"], /* CJK Ideograph */
+ ["\u6309", "\u6309"], /* CJK Ideograph */
+ ["\u630A", "\u630A"], /* CJK Ideograph */
+ ["\u630B", "\u630B"], /* CJK Ideograph */
+ ["\u630C", "\u630C"], /* CJK Ideograph */
+ ["\u630D", "\u630D"], /* CJK Ideograph */
+ ["\u630E", "\u630E"], /* CJK Ideograph */
+ ["\u630F", "\u630F"], /* CJK Ideograph */
+ ["\u6310", "\u6310"], /* CJK Ideograph */
+ ["\u6311", "\u6311"], /* CJK Ideograph */
+ ["\u6312", "\u6312"], /* CJK Ideograph */
+ ["\u6313", "\u6313"], /* CJK Ideograph */
+ ["\u6314", "\u6314"], /* CJK Ideograph */
+ ["\u6315", "\u6315"], /* CJK Ideograph */
+ ["\u6316", "\u6316"], /* CJK Ideograph */
+ ["\u6317", "\u6317"], /* CJK Ideograph */
+ ["\u6318", "\u6318"], /* CJK Ideograph */
+ ["\u6319", "\u6319"], /* CJK Ideograph */
+ ["\u631A", "\u631A"], /* CJK Ideograph */
+ ["\u631B", "\u631B"], /* CJK Ideograph */
+ ["\u631C", "\u631C"], /* CJK Ideograph */
+ ["\u631D", "\u631D"], /* CJK Ideograph */
+ ["\u631E", "\u631E"], /* CJK Ideograph */
+ ["\u631F", "\u631F"], /* CJK Ideograph */
+ ["\u6320", "\u6320"], /* CJK Ideograph */
+ ["\u6321", "\u6321"], /* CJK Ideograph */
+ ["\u6322", "\u6322"], /* CJK Ideograph */
+ ["\u6323", "\u6323"], /* CJK Ideograph */
+ ["\u6324", "\u6324"], /* CJK Ideograph */
+ ["\u6325", "\u6325"], /* CJK Ideograph */
+ ["\u6326", "\u6326"], /* CJK Ideograph */
+ ["\u6327", "\u6327"], /* CJK Ideograph */
+ ["\u6328", "\u6328"], /* CJK Ideograph */
+ ["\u6329", "\u6329"], /* CJK Ideograph */
+ ["\u632A", "\u632A"], /* CJK Ideograph */
+ ["\u632B", "\u632B"], /* CJK Ideograph */
+ ["\u632C", "\u632C"], /* CJK Ideograph */
+ ["\u632D", "\u632D"], /* CJK Ideograph */
+ ["\u632E", "\u632E"], /* CJK Ideograph */
+ ["\u632F", "\u632F"], /* CJK Ideograph */
+ ["\u6330", "\u6330"], /* CJK Ideograph */
+ ["\u6331", "\u6331"], /* CJK Ideograph */
+ ["\u6332", "\u6332"], /* CJK Ideograph */
+ ["\u6333", "\u6333"], /* CJK Ideograph */
+ ["\u6334", "\u6334"], /* CJK Ideograph */
+ ["\u6335", "\u6335"], /* CJK Ideograph */
+ ["\u6336", "\u6336"], /* CJK Ideograph */
+ ["\u6337", "\u6337"], /* CJK Ideograph */
+ ["\u6338", "\u6338"], /* CJK Ideograph */
+ ["\u6339", "\u6339"], /* CJK Ideograph */
+ ["\u633A", "\u633A"], /* CJK Ideograph */
+ ["\u633B", "\u633B"], /* CJK Ideograph */
+ ["\u633C", "\u633C"], /* CJK Ideograph */
+ ["\u633D", "\u633D"], /* CJK Ideograph */
+ ["\u633E", "\u633E"], /* CJK Ideograph */
+ ["\u633F", "\u633F"], /* CJK Ideograph */
+ ["\u6340", "\u6340"], /* CJK Ideograph */
+ ["\u6341", "\u6341"], /* CJK Ideograph */
+ ["\u6342", "\u6342"], /* CJK Ideograph */
+ ["\u6343", "\u6343"], /* CJK Ideograph */
+ ["\u6344", "\u6344"], /* CJK Ideograph */
+ ["\u6345", "\u6345"], /* CJK Ideograph */
+ ["\u6346", "\u6346"], /* CJK Ideograph */
+ ["\u6347", "\u6347"], /* CJK Ideograph */
+ ["\u6348", "\u6348"], /* CJK Ideograph */
+ ["\u6349", "\u6349"], /* CJK Ideograph */
+ ["\u634A", "\u634A"], /* CJK Ideograph */
+ ["\u634B", "\u634B"], /* CJK Ideograph */
+ ["\u634C", "\u634C"], /* CJK Ideograph */
+ ["\u634D", "\u634D"], /* CJK Ideograph */
+ ["\u634E", "\u634E"], /* CJK Ideograph */
+ ["\u634F", "\u634F"], /* CJK Ideograph */
+ ["\u6350", "\u6350"], /* CJK Ideograph */
+ ["\u6351", "\u6351"], /* CJK Ideograph */
+ ["\u6352", "\u6352"], /* CJK Ideograph */
+ ["\u6353", "\u6353"], /* CJK Ideograph */
+ ["\u6354", "\u6354"], /* CJK Ideograph */
+ ["\u6355", "\u6355"], /* CJK Ideograph */
+ ["\u6356", "\u6356"], /* CJK Ideograph */
+ ["\u6357", "\u6357"], /* CJK Ideograph */
+ ["\u6358", "\u6358"], /* CJK Ideograph */
+ ["\u6359", "\u6359"], /* CJK Ideograph */
+ ["\u635A", "\u635A"], /* CJK Ideograph */
+ ["\u635B", "\u635B"], /* CJK Ideograph */
+ ["\u635C", "\u635C"], /* CJK Ideograph */
+ ["\u635D", "\u635D"], /* CJK Ideograph */
+ ["\u635E", "\u635E"], /* CJK Ideograph */
+ ["\u635F", "\u635F"], /* CJK Ideograph */
+ ["\u6360", "\u6360"], /* CJK Ideograph */
+ ["\u6361", "\u6361"], /* CJK Ideograph */
+ ["\u6362", "\u6362"], /* CJK Ideograph */
+ ["\u6363", "\u6363"], /* CJK Ideograph */
+ ["\u6364", "\u6364"], /* CJK Ideograph */
+ ["\u6365", "\u6365"], /* CJK Ideograph */
+ ["\u6366", "\u6366"], /* CJK Ideograph */
+ ["\u6367", "\u6367"], /* CJK Ideograph */
+ ["\u6368", "\u6368"], /* CJK Ideograph */
+ ["\u6369", "\u6369"], /* CJK Ideograph */
+ ["\u636A", "\u636A"], /* CJK Ideograph */
+ ["\u636B", "\u636B"], /* CJK Ideograph */
+ ["\u636C", "\u636C"], /* CJK Ideograph */
+ ["\u636D", "\u636D"], /* CJK Ideograph */
+ ["\u636E", "\u636E"], /* CJK Ideograph */
+ ["\u636F", "\u636F"], /* CJK Ideograph */
+ ["\u6370", "\u6370"], /* CJK Ideograph */
+ ["\u6371", "\u6371"], /* CJK Ideograph */
+ ["\u6372", "\u6372"], /* CJK Ideograph */
+ ["\u6373", "\u6373"], /* CJK Ideograph */
+ ["\u6374", "\u6374"], /* CJK Ideograph */
+ ["\u6375", "\u6375"], /* CJK Ideograph */
+ ["\u6376", "\u6376"], /* CJK Ideograph */
+ ["\u6377", "\u6377"], /* CJK Ideograph */
+ ["\u6378", "\u6378"], /* CJK Ideograph */
+ ["\u6379", "\u6379"], /* CJK Ideograph */
+ ["\u637A", "\u637A"], /* CJK Ideograph */
+ ["\u637B", "\u637B"], /* CJK Ideograph */
+ ["\u637C", "\u637C"], /* CJK Ideograph */
+ ["\u637D", "\u637D"], /* CJK Ideograph */
+ ["\u637E", "\u637E"], /* CJK Ideograph */
+ ["\u637F", "\u637F"], /* CJK Ideograph */
+ ["\u6380", "\u6380"], /* CJK Ideograph */
+ ["\u6381", "\u6381"], /* CJK Ideograph */
+ ["\u6382", "\u6382"], /* CJK Ideograph */
+ ["\u6383", "\u6383"], /* CJK Ideograph */
+ ["\u6384", "\u6384"], /* CJK Ideograph */
+ ["\u6385", "\u6385"], /* CJK Ideograph */
+ ["\u6386", "\u6386"], /* CJK Ideograph */
+ ["\u6387", "\u6387"], /* CJK Ideograph */
+ ["\u6388", "\u6388"], /* CJK Ideograph */
+ ["\u6389", "\u6389"], /* CJK Ideograph */
+ ["\u638A", "\u638A"], /* CJK Ideograph */
+ ["\u638B", "\u638B"], /* CJK Ideograph */
+ ["\u638C", "\u638C"], /* CJK Ideograph */
+ ["\u638D", "\u638D"], /* CJK Ideograph */
+ ["\u638E", "\u638E"], /* CJK Ideograph */
+ ["\u638F", "\u638F"], /* CJK Ideograph */
+ ["\u6390", "\u6390"], /* CJK Ideograph */
+ ["\u6391", "\u6391"], /* CJK Ideograph */
+ ["\u6392", "\u6392"], /* CJK Ideograph */
+ ["\u6393", "\u6393"], /* CJK Ideograph */
+ ["\u6394", "\u6394"], /* CJK Ideograph */
+ ["\u6395", "\u6395"], /* CJK Ideograph */
+ ["\u6396", "\u6396"], /* CJK Ideograph */
+ ["\u6397", "\u6397"], /* CJK Ideograph */
+ ["\u6398", "\u6398"], /* CJK Ideograph */
+ ["\u6399", "\u6399"], /* CJK Ideograph */
+ ["\u639A", "\u639A"], /* CJK Ideograph */
+ ["\u639B", "\u639B"], /* CJK Ideograph */
+ ["\u639C", "\u639C"], /* CJK Ideograph */
+ ["\u639D", "\u639D"], /* CJK Ideograph */
+ ["\u639E", "\u639E"], /* CJK Ideograph */
+ ["\u639F", "\u639F"], /* CJK Ideograph */
+ ["\u63A0", "\u63A0"], /* CJK Ideograph */
+ ["\u63A1", "\u63A1"], /* CJK Ideograph */
+ ["\u63A2", "\u63A2"], /* CJK Ideograph */
+ ["\u63A3", "\u63A3"], /* CJK Ideograph */
+ ["\u63A4", "\u63A4"], /* CJK Ideograph */
+ ["\u63A5", "\u63A5"], /* CJK Ideograph */
+ ["\u63A6", "\u63A6"], /* CJK Ideograph */
+ ["\u63A7", "\u63A7"], /* CJK Ideograph */
+ ["\u63A8", "\u63A8"], /* CJK Ideograph */
+ ["\u63A9", "\u63A9"], /* CJK Ideograph */
+ ["\u63AA", "\u63AA"], /* CJK Ideograph */
+ ["\u63AB", "\u63AB"], /* CJK Ideograph */
+ ["\u63AC", "\u63AC"], /* CJK Ideograph */
+ ["\u63AD", "\u63AD"], /* CJK Ideograph */
+ ["\u63AE", "\u63AE"], /* CJK Ideograph */
+ ["\u63AF", "\u63AF"], /* CJK Ideograph */
+ ["\u63B0", "\u63B0"], /* CJK Ideograph */
+ ["\u63B1", "\u63B1"], /* CJK Ideograph */
+ ["\u63B2", "\u63B2"], /* CJK Ideograph */
+ ["\u63B3", "\u63B3"], /* CJK Ideograph */
+ ["\u63B4", "\u63B4"], /* CJK Ideograph */
+ ["\u63B5", "\u63B5"], /* CJK Ideograph */
+ ["\u63B6", "\u63B6"], /* CJK Ideograph */
+ ["\u63B7", "\u63B7"], /* CJK Ideograph */
+ ["\u63B8", "\u63B8"], /* CJK Ideograph */
+ ["\u63B9", "\u63B9"], /* CJK Ideograph */
+ ["\u63BA", "\u63BA"], /* CJK Ideograph */
+ ["\u63BB", "\u63BB"], /* CJK Ideograph */
+ ["\u63BC", "\u63BC"], /* CJK Ideograph */
+ ["\u63BD", "\u63BD"], /* CJK Ideograph */
+ ["\u63BE", "\u63BE"], /* CJK Ideograph */
+ ["\u63BF", "\u63BF"], /* CJK Ideograph */
+ ["\u63C0", "\u63C0"], /* CJK Ideograph */
+ ["\u63C1", "\u63C1"], /* CJK Ideograph */
+ ["\u63C2", "\u63C2"], /* CJK Ideograph */
+ ["\u63C3", "\u63C3"], /* CJK Ideograph */
+ ["\u63C4", "\u63C4"], /* CJK Ideograph */
+ ["\u63C5", "\u63C5"], /* CJK Ideograph */
+ ["\u63C6", "\u63C6"], /* CJK Ideograph */
+ ["\u63C7", "\u63C7"], /* CJK Ideograph */
+ ["\u63C8", "\u63C8"], /* CJK Ideograph */
+ ["\u63C9", "\u63C9"], /* CJK Ideograph */
+ ["\u63CA", "\u63CA"], /* CJK Ideograph */
+ ["\u63CB", "\u63CB"], /* CJK Ideograph */
+ ["\u63CC", "\u63CC"], /* CJK Ideograph */
+ ["\u63CD", "\u63CD"], /* CJK Ideograph */
+ ["\u63CE", "\u63CE"], /* CJK Ideograph */
+ ["\u63CF", "\u63CF"], /* CJK Ideograph */
+ ["\u63D0", "\u63D0"], /* CJK Ideograph */
+ ["\u63D1", "\u63D1"], /* CJK Ideograph */
+ ["\u63D2", "\u63D2"], /* CJK Ideograph */
+ ["\u63D3", "\u63D3"], /* CJK Ideograph */
+ ["\u63D4", "\u63D4"], /* CJK Ideograph */
+ ["\u63D5", "\u63D5"], /* CJK Ideograph */
+ ["\u63D6", "\u63D6"], /* CJK Ideograph */
+ ["\u63D7", "\u63D7"], /* CJK Ideograph */
+ ["\u63D8", "\u63D8"], /* CJK Ideograph */
+ ["\u63D9", "\u63D9"], /* CJK Ideograph */
+ ["\u63DA", "\u63DA"], /* CJK Ideograph */
+ ["\u63DB", "\u63DB"], /* CJK Ideograph */
+ ["\u63DC", "\u63DC"], /* CJK Ideograph */
+ ["\u63DD", "\u63DD"], /* CJK Ideograph */
+ ["\u63DE", "\u63DE"], /* CJK Ideograph */
+ ["\u63DF", "\u63DF"], /* CJK Ideograph */
+ ["\u63E0", "\u63E0"], /* CJK Ideograph */
+ ["\u63E1", "\u63E1"], /* CJK Ideograph */
+ ["\u63E2", "\u63E2"], /* CJK Ideograph */
+ ["\u63E3", "\u63E3"], /* CJK Ideograph */
+ ["\u63E4", "\u63E4"], /* CJK Ideograph */
+ ["\u63E5", "\u63E5"], /* CJK Ideograph */
+ ["\u63E6", "\u63E6"], /* CJK Ideograph */
+ ["\u63E7", "\u63E7"], /* CJK Ideograph */
+ ["\u63E8", "\u63E8"], /* CJK Ideograph */
+ ["\u63E9", "\u63E9"], /* CJK Ideograph */
+ ["\u63EA", "\u63EA"], /* CJK Ideograph */
+ ["\u63EB", "\u63EB"], /* CJK Ideograph */
+ ["\u63EC", "\u63EC"], /* CJK Ideograph */
+ ["\u63ED", "\u63ED"], /* CJK Ideograph */
+ ["\u63EE", "\u63EE"], /* CJK Ideograph */
+ ["\u63EF", "\u63EF"], /* CJK Ideograph */
+ ["\u63F0", "\u63F0"], /* CJK Ideograph */
+ ["\u63F1", "\u63F1"], /* CJK Ideograph */
+ ["\u63F2", "\u63F2"], /* CJK Ideograph */
+ ["\u63F3", "\u63F3"], /* CJK Ideograph */
+ ["\u63F4", "\u63F4"], /* CJK Ideograph */
+ ["\u63F5", "\u63F5"], /* CJK Ideograph */
+ ["\u63F6", "\u63F6"], /* CJK Ideograph */
+ ["\u63F7", "\u63F7"], /* CJK Ideograph */
+ ["\u63F8", "\u63F8"], /* CJK Ideograph */
+ ["\u63F9", "\u63F9"], /* CJK Ideograph */
+ ["\u63FA", "\u63FA"], /* CJK Ideograph */
+ ["\u63FB", "\u63FB"], /* CJK Ideograph */
+ ["\u63FC", "\u63FC"], /* CJK Ideograph */
+ ["\u63FD", "\u63FD"], /* CJK Ideograph */
+ ["\u63FE", "\u63FE"], /* CJK Ideograph */
+ ["\u63FF", "\u63FF"], /* CJK Ideograph */
+ ["\u6400", "\u6400"], /* CJK Ideograph */
+ ["\u6401", "\u6401"], /* CJK Ideograph */
+ ["\u6402", "\u6402"], /* CJK Ideograph */
+ ["\u6403", "\u6403"], /* CJK Ideograph */
+ ["\u6404", "\u6404"], /* CJK Ideograph */
+ ["\u6405", "\u6405"], /* CJK Ideograph */
+ ["\u6406", "\u6406"], /* CJK Ideograph */
+ ["\u6407", "\u6407"], /* CJK Ideograph */
+ ["\u6408", "\u6408"], /* CJK Ideograph */
+ ["\u6409", "\u6409"], /* CJK Ideograph */
+ ["\u640A", "\u640A"], /* CJK Ideograph */
+ ["\u640B", "\u640B"], /* CJK Ideograph */
+ ["\u640C", "\u640C"], /* CJK Ideograph */
+ ["\u640D", "\u640D"], /* CJK Ideograph */
+ ["\u640E", "\u640E"], /* CJK Ideograph */
+ ["\u640F", "\u640F"], /* CJK Ideograph */
+ ["\u6410", "\u6410"], /* CJK Ideograph */
+ ["\u6411", "\u6411"], /* CJK Ideograph */
+ ["\u6412", "\u6412"], /* CJK Ideograph */
+ ["\u6413", "\u6413"], /* CJK Ideograph */
+ ["\u6414", "\u6414"], /* CJK Ideograph */
+ ["\u6415", "\u6415"], /* CJK Ideograph */
+ ["\u6416", "\u6416"], /* CJK Ideograph */
+ ["\u6417", "\u6417"], /* CJK Ideograph */
+ ["\u6418", "\u6418"], /* CJK Ideograph */
+ ["\u6419", "\u6419"], /* CJK Ideograph */
+ ["\u641A", "\u641A"], /* CJK Ideograph */
+ ["\u641B", "\u641B"], /* CJK Ideograph */
+ ["\u641C", "\u641C"], /* CJK Ideograph */
+ ["\u641D", "\u641D"], /* CJK Ideograph */
+ ["\u641E", "\u641E"], /* CJK Ideograph */
+ ["\u641F", "\u641F"], /* CJK Ideograph */
+ ["\u6420", "\u6420"], /* CJK Ideograph */
+ ["\u6421", "\u6421"], /* CJK Ideograph */
+ ["\u6422", "\u6422"], /* CJK Ideograph */
+ ["\u6423", "\u6423"], /* CJK Ideograph */
+ ["\u6424", "\u6424"], /* CJK Ideograph */
+ ["\u6425", "\u6425"], /* CJK Ideograph */
+ ["\u6426", "\u6426"], /* CJK Ideograph */
+ ["\u6427", "\u6427"], /* CJK Ideograph */
+ ["\u6428", "\u6428"], /* CJK Ideograph */
+ ["\u6429", "\u6429"], /* CJK Ideograph */
+ ["\u642A", "\u642A"], /* CJK Ideograph */
+ ["\u642B", "\u642B"], /* CJK Ideograph */
+ ["\u642C", "\u642C"], /* CJK Ideograph */
+ ["\u642D", "\u642D"], /* CJK Ideograph */
+ ["\u642E", "\u642E"], /* CJK Ideograph */
+ ["\u642F", "\u642F"], /* CJK Ideograph */
+ ["\u6430", "\u6430"], /* CJK Ideograph */
+ ["\u6431", "\u6431"], /* CJK Ideograph */
+ ["\u6432", "\u6432"], /* CJK Ideograph */
+ ["\u6433", "\u6433"], /* CJK Ideograph */
+ ["\u6434", "\u6434"], /* CJK Ideograph */
+ ["\u6435", "\u6435"], /* CJK Ideograph */
+ ["\u6436", "\u6436"], /* CJK Ideograph */
+ ["\u6437", "\u6437"], /* CJK Ideograph */
+ ["\u6438", "\u6438"], /* CJK Ideograph */
+ ["\u6439", "\u6439"], /* CJK Ideograph */
+ ["\u643A", "\u643A"], /* CJK Ideograph */
+ ["\u643B", "\u643B"], /* CJK Ideograph */
+ ["\u643C", "\u643C"], /* CJK Ideograph */
+ ["\u643D", "\u643D"], /* CJK Ideograph */
+ ["\u643E", "\u643E"], /* CJK Ideograph */
+ ["\u643F", "\u643F"], /* CJK Ideograph */
+ ["\u6440", "\u6440"], /* CJK Ideograph */
+ ["\u6441", "\u6441"], /* CJK Ideograph */
+ ["\u6442", "\u6442"], /* CJK Ideograph */
+ ["\u6443", "\u6443"], /* CJK Ideograph */
+ ["\u6444", "\u6444"], /* CJK Ideograph */
+ ["\u6445", "\u6445"], /* CJK Ideograph */
+ ["\u6446", "\u6446"], /* CJK Ideograph */
+ ["\u6447", "\u6447"], /* CJK Ideograph */
+ ["\u6448", "\u6448"], /* CJK Ideograph */
+ ["\u6449", "\u6449"], /* CJK Ideograph */
+ ["\u644A", "\u644A"], /* CJK Ideograph */
+ ["\u644B", "\u644B"], /* CJK Ideograph */
+ ["\u644C", "\u644C"], /* CJK Ideograph */
+ ["\u644D", "\u644D"], /* CJK Ideograph */
+ ["\u644E", "\u644E"], /* CJK Ideograph */
+ ["\u644F", "\u644F"], /* CJK Ideograph */
+ ["\u6450", "\u6450"], /* CJK Ideograph */
+ ["\u6451", "\u6451"], /* CJK Ideograph */
+ ["\u6452", "\u6452"], /* CJK Ideograph */
+ ["\u6453", "\u6453"], /* CJK Ideograph */
+ ["\u6454", "\u6454"], /* CJK Ideograph */
+ ["\u6455", "\u6455"], /* CJK Ideograph */
+ ["\u6456", "\u6456"], /* CJK Ideograph */
+ ["\u6457", "\u6457"], /* CJK Ideograph */
+ ["\u6458", "\u6458"], /* CJK Ideograph */
+ ["\u6459", "\u6459"], /* CJK Ideograph */
+ ["\u645A", "\u645A"], /* CJK Ideograph */
+ ["\u645B", "\u645B"], /* CJK Ideograph */
+ ["\u645C", "\u645C"], /* CJK Ideograph */
+ ["\u645D", "\u645D"], /* CJK Ideograph */
+ ["\u645E", "\u645E"], /* CJK Ideograph */
+ ["\u645F", "\u645F"], /* CJK Ideograph */
+ ["\u6460", "\u6460"], /* CJK Ideograph */
+ ["\u6461", "\u6461"], /* CJK Ideograph */
+ ["\u6462", "\u6462"], /* CJK Ideograph */
+ ["\u6463", "\u6463"], /* CJK Ideograph */
+ ["\u6464", "\u6464"], /* CJK Ideograph */
+ ["\u6465", "\u6465"], /* CJK Ideograph */
+ ["\u6466", "\u6466"], /* CJK Ideograph */
+ ["\u6467", "\u6467"], /* CJK Ideograph */
+ ["\u6468", "\u6468"], /* CJK Ideograph */
+ ["\u6469", "\u6469"], /* CJK Ideograph */
+ ["\u646A", "\u646A"], /* CJK Ideograph */
+ ["\u646B", "\u646B"], /* CJK Ideograph */
+ ["\u646C", "\u646C"], /* CJK Ideograph */
+ ["\u646D", "\u646D"], /* CJK Ideograph */
+ ["\u646E", "\u646E"], /* CJK Ideograph */
+ ["\u646F", "\u646F"], /* CJK Ideograph */
+ ["\u6470", "\u6470"], /* CJK Ideograph */
+ ["\u6471", "\u6471"], /* CJK Ideograph */
+ ["\u6472", "\u6472"], /* CJK Ideograph */
+ ["\u6473", "\u6473"], /* CJK Ideograph */
+ ["\u6474", "\u6474"], /* CJK Ideograph */
+ ["\u6475", "\u6475"], /* CJK Ideograph */
+ ["\u6476", "\u6476"], /* CJK Ideograph */
+ ["\u6477", "\u6477"], /* CJK Ideograph */
+ ["\u6478", "\u6478"], /* CJK Ideograph */
+ ["\u6479", "\u6479"], /* CJK Ideograph */
+ ["\u647A", "\u647A"], /* CJK Ideograph */
+ ["\u647B", "\u647B"], /* CJK Ideograph */
+ ["\u647C", "\u647C"], /* CJK Ideograph */
+ ["\u647D", "\u647D"], /* CJK Ideograph */
+ ["\u647E", "\u647E"], /* CJK Ideograph */
+ ["\u647F", "\u647F"], /* CJK Ideograph */
+ ["\u6480", "\u6480"], /* CJK Ideograph */
+ ["\u6481", "\u6481"], /* CJK Ideograph */
+ ["\u6482", "\u6482"], /* CJK Ideograph */
+ ["\u6483", "\u6483"], /* CJK Ideograph */
+ ["\u6484", "\u6484"], /* CJK Ideograph */
+ ["\u6485", "\u6485"], /* CJK Ideograph */
+ ["\u6486", "\u6486"], /* CJK Ideograph */
+ ["\u6487", "\u6487"], /* CJK Ideograph */
+ ["\u6488", "\u6488"], /* CJK Ideograph */
+ ["\u6489", "\u6489"], /* CJK Ideograph */
+ ["\u648A", "\u648A"], /* CJK Ideograph */
+ ["\u648B", "\u648B"], /* CJK Ideograph */
+ ["\u648C", "\u648C"], /* CJK Ideograph */
+ ["\u648D", "\u648D"], /* CJK Ideograph */
+ ["\u648E", "\u648E"], /* CJK Ideograph */
+ ["\u648F", "\u648F"], /* CJK Ideograph */
+ ["\u6490", "\u6490"], /* CJK Ideograph */
+ ["\u6491", "\u6491"], /* CJK Ideograph */
+ ["\u6492", "\u6492"], /* CJK Ideograph */
+ ["\u6493", "\u6493"], /* CJK Ideograph */
+ ["\u6494", "\u6494"], /* CJK Ideograph */
+ ["\u6495", "\u6495"], /* CJK Ideograph */
+ ["\u6496", "\u6496"], /* CJK Ideograph */
+ ["\u6497", "\u6497"], /* CJK Ideograph */
+ ["\u6498", "\u6498"], /* CJK Ideograph */
+ ["\u6499", "\u6499"], /* CJK Ideograph */
+ ["\u649A", "\u649A"], /* CJK Ideograph */
+ ["\u649B", "\u649B"], /* CJK Ideograph */
+ ["\u649C", "\u649C"], /* CJK Ideograph */
+ ["\u649D", "\u649D"], /* CJK Ideograph */
+ ["\u649E", "\u649E"], /* CJK Ideograph */
+ ["\u649F", "\u649F"], /* CJK Ideograph */
+ ["\u64A0", "\u64A0"], /* CJK Ideograph */
+ ["\u64A1", "\u64A1"], /* CJK Ideograph */
+ ["\u64A2", "\u64A2"], /* CJK Ideograph */
+ ["\u64A3", "\u64A3"], /* CJK Ideograph */
+ ["\u64A4", "\u64A4"], /* CJK Ideograph */
+ ["\u64A5", "\u64A5"], /* CJK Ideograph */
+ ["\u64A6", "\u64A6"], /* CJK Ideograph */
+ ["\u64A7", "\u64A7"], /* CJK Ideograph */
+ ["\u64A8", "\u64A8"], /* CJK Ideograph */
+ ["\u64A9", "\u64A9"], /* CJK Ideograph */
+ ["\u64AA", "\u64AA"], /* CJK Ideograph */
+ ["\u64AB", "\u64AB"], /* CJK Ideograph */
+ ["\u64AC", "\u64AC"], /* CJK Ideograph */
+ ["\u64AD", "\u64AD"], /* CJK Ideograph */
+ ["\u64AE", "\u64AE"], /* CJK Ideograph */
+ ["\u64AF", "\u64AF"], /* CJK Ideograph */
+ ["\u64B0", "\u64B0"], /* CJK Ideograph */
+ ["\u64B1", "\u64B1"], /* CJK Ideograph */
+ ["\u64B2", "\u64B2"], /* CJK Ideograph */
+ ["\u64B3", "\u64B3"], /* CJK Ideograph */
+ ["\u64B4", "\u64B4"], /* CJK Ideograph */
+ ["\u64B5", "\u64B5"], /* CJK Ideograph */
+ ["\u64B6", "\u64B6"], /* CJK Ideograph */
+ ["\u64B7", "\u64B7"], /* CJK Ideograph */
+ ["\u64B8", "\u64B8"], /* CJK Ideograph */
+ ["\u64B9", "\u64B9"], /* CJK Ideograph */
+ ["\u64BA", "\u64BA"], /* CJK Ideograph */
+ ["\u64BB", "\u64BB"], /* CJK Ideograph */
+ ["\u64BC", "\u64BC"], /* CJK Ideograph */
+ ["\u64BD", "\u64BD"], /* CJK Ideograph */
+ ["\u64BE", "\u64BE"], /* CJK Ideograph */
+ ["\u64BF", "\u64BF"], /* CJK Ideograph */
+ ["\u64C0", "\u64C0"], /* CJK Ideograph */
+ ["\u64C1", "\u64C1"], /* CJK Ideograph */
+ ["\u64C2", "\u64C2"], /* CJK Ideograph */
+ ["\u64C3", "\u64C3"], /* CJK Ideograph */
+ ["\u64C4", "\u64C4"], /* CJK Ideograph */
+ ["\u64C5", "\u64C5"], /* CJK Ideograph */
+ ["\u64C6", "\u64C6"], /* CJK Ideograph */
+ ["\u64C7", "\u64C7"], /* CJK Ideograph */
+ ["\u64C8", "\u64C8"], /* CJK Ideograph */
+ ["\u64C9", "\u64C9"], /* CJK Ideograph */
+ ["\u64CA", "\u64CA"], /* CJK Ideograph */
+ ["\u64CB", "\u64CB"], /* CJK Ideograph */
+ ["\u64CC", "\u64CC"], /* CJK Ideograph */
+ ["\u64CD", "\u64CD"], /* CJK Ideograph */
+ ["\u64CE", "\u64CE"], /* CJK Ideograph */
+ ["\u64CF", "\u64CF"], /* CJK Ideograph */
+ ["\u64D0", "\u64D0"], /* CJK Ideograph */
+ ["\u64D1", "\u64D1"], /* CJK Ideograph */
+ ["\u64D2", "\u64D2"], /* CJK Ideograph */
+ ["\u64D3", "\u64D3"], /* CJK Ideograph */
+ ["\u64D4", "\u64D4"], /* CJK Ideograph */
+ ["\u64D5", "\u64D5"], /* CJK Ideograph */
+ ["\u64D6", "\u64D6"], /* CJK Ideograph */
+ ["\u64D7", "\u64D7"], /* CJK Ideograph */
+ ["\u64D8", "\u64D8"], /* CJK Ideograph */
+ ["\u64D9", "\u64D9"], /* CJK Ideograph */
+ ["\u64DA", "\u64DA"], /* CJK Ideograph */
+ ["\u64DB", "\u64DB"], /* CJK Ideograph */
+ ["\u64DC", "\u64DC"], /* CJK Ideograph */
+ ["\u64DD", "\u64DD"], /* CJK Ideograph */
+ ["\u64DE", "\u64DE"], /* CJK Ideograph */
+ ["\u64DF", "\u64DF"], /* CJK Ideograph */
+ ["\u64E0", "\u64E0"], /* CJK Ideograph */
+ ["\u64E1", "\u64E1"], /* CJK Ideograph */
+ ["\u64E2", "\u64E2"], /* CJK Ideograph */
+ ["\u64E3", "\u64E3"], /* CJK Ideograph */
+ ["\u64E4", "\u64E4"], /* CJK Ideograph */
+ ["\u64E5", "\u64E5"], /* CJK Ideograph */
+ ["\u64E6", "\u64E6"], /* CJK Ideograph */
+ ["\u64E7", "\u64E7"], /* CJK Ideograph */
+ ["\u64E8", "\u64E8"], /* CJK Ideograph */
+ ["\u64E9", "\u64E9"], /* CJK Ideograph */
+ ["\u64EA", "\u64EA"], /* CJK Ideograph */
+ ["\u64EB", "\u64EB"], /* CJK Ideograph */
+ ["\u64EC", "\u64EC"], /* CJK Ideograph */
+ ["\u64ED", "\u64ED"], /* CJK Ideograph */
+ ["\u64EE", "\u64EE"], /* CJK Ideograph */
+ ["\u64EF", "\u64EF"], /* CJK Ideograph */
+ ["\u64F0", "\u64F0"], /* CJK Ideograph */
+ ["\u64F1", "\u64F1"], /* CJK Ideograph */
+ ["\u64F2", "\u64F2"], /* CJK Ideograph */
+ ["\u64F3", "\u64F3"], /* CJK Ideograph */
+ ["\u64F4", "\u64F4"], /* CJK Ideograph */
+ ["\u64F5", "\u64F5"], /* CJK Ideograph */
+ ["\u64F6", "\u64F6"], /* CJK Ideograph */
+ ["\u64F7", "\u64F7"], /* CJK Ideograph */
+ ["\u64F8", "\u64F8"], /* CJK Ideograph */
+ ["\u64F9", "\u64F9"], /* CJK Ideograph */
+ ["\u64FA", "\u64FA"], /* CJK Ideograph */
+ ["\u64FB", "\u64FB"], /* CJK Ideograph */
+ ["\u64FC", "\u64FC"], /* CJK Ideograph */
+ ["\u64FD", "\u64FD"], /* CJK Ideograph */
+ ["\u64FE", "\u64FE"], /* CJK Ideograph */
+ ["\u64FF", "\u64FF"], /* CJK Ideograph */
+ ["\u6500", "\u6500"], /* CJK Ideograph */
+ ["\u6501", "\u6501"], /* CJK Ideograph */
+ ["\u6502", "\u6502"], /* CJK Ideograph */
+ ["\u6503", "\u6503"], /* CJK Ideograph */
+ ["\u6504", "\u6504"], /* CJK Ideograph */
+ ["\u6505", "\u6505"], /* CJK Ideograph */
+ ["\u6506", "\u6506"], /* CJK Ideograph */
+ ["\u6507", "\u6507"], /* CJK Ideograph */
+ ["\u6508", "\u6508"], /* CJK Ideograph */
+ ["\u6509", "\u6509"], /* CJK Ideograph */
+ ["\u650A", "\u650A"], /* CJK Ideograph */
+ ["\u650B", "\u650B"], /* CJK Ideograph */
+ ["\u650C", "\u650C"], /* CJK Ideograph */
+ ["\u650D", "\u650D"], /* CJK Ideograph */
+ ["\u650E", "\u650E"], /* CJK Ideograph */
+ ["\u650F", "\u650F"], /* CJK Ideograph */
+ ["\u6510", "\u6510"], /* CJK Ideograph */
+ ["\u6511", "\u6511"], /* CJK Ideograph */
+ ["\u6512", "\u6512"], /* CJK Ideograph */
+ ["\u6513", "\u6513"], /* CJK Ideograph */
+ ["\u6514", "\u6514"], /* CJK Ideograph */
+ ["\u6515", "\u6515"], /* CJK Ideograph */
+ ["\u6516", "\u6516"], /* CJK Ideograph */
+ ["\u6517", "\u6517"], /* CJK Ideograph */
+ ["\u6518", "\u6518"], /* CJK Ideograph */
+ ["\u6519", "\u6519"], /* CJK Ideograph */
+ ["\u651A", "\u651A"], /* CJK Ideograph */
+ ["\u651B", "\u651B"], /* CJK Ideograph */
+ ["\u651C", "\u651C"], /* CJK Ideograph */
+ ["\u651D", "\u651D"], /* CJK Ideograph */
+ ["\u651E", "\u651E"], /* CJK Ideograph */
+ ["\u651F", "\u651F"], /* CJK Ideograph */
+ ["\u6520", "\u6520"], /* CJK Ideograph */
+ ["\u6521", "\u6521"], /* CJK Ideograph */
+ ["\u6522", "\u6522"], /* CJK Ideograph */
+ ["\u6523", "\u6523"], /* CJK Ideograph */
+ ["\u6524", "\u6524"], /* CJK Ideograph */
+ ["\u6525", "\u6525"], /* CJK Ideograph */
+ ["\u6526", "\u6526"], /* CJK Ideograph */
+ ["\u6527", "\u6527"], /* CJK Ideograph */
+ ["\u6528", "\u6528"], /* CJK Ideograph */
+ ["\u6529", "\u6529"], /* CJK Ideograph */
+ ["\u652A", "\u652A"], /* CJK Ideograph */
+ ["\u652B", "\u652B"], /* CJK Ideograph */
+ ["\u652C", "\u652C"], /* CJK Ideograph */
+ ["\u652D", "\u652D"], /* CJK Ideograph */
+ ["\u652E", "\u652E"], /* CJK Ideograph */
+ ["\u652F", "\u652F"], /* CJK Ideograph */
+ ["\u6530", "\u6530"], /* CJK Ideograph */
+ ["\u6531", "\u6531"], /* CJK Ideograph */
+ ["\u6532", "\u6532"], /* CJK Ideograph */
+ ["\u6533", "\u6533"], /* CJK Ideograph */
+ ["\u6534", "\u6534"], /* CJK Ideograph */
+ ["\u6535", "\u6535"], /* CJK Ideograph */
+ ["\u6536", "\u6536"], /* CJK Ideograph */
+ ["\u6537", "\u6537"], /* CJK Ideograph */
+ ["\u6538", "\u6538"], /* CJK Ideograph */
+ ["\u6539", "\u6539"], /* CJK Ideograph */
+ ["\u653A", "\u653A"], /* CJK Ideograph */
+ ["\u653B", "\u653B"], /* CJK Ideograph */
+ ["\u653C", "\u653C"], /* CJK Ideograph */
+ ["\u653D", "\u653D"], /* CJK Ideograph */
+ ["\u653E", "\u653E"], /* CJK Ideograph */
+ ["\u653F", "\u653F"], /* CJK Ideograph */
+ ["\u6540", "\u6540"], /* CJK Ideograph */
+ ["\u6541", "\u6541"], /* CJK Ideograph */
+ ["\u6542", "\u6542"], /* CJK Ideograph */
+ ["\u6543", "\u6543"], /* CJK Ideograph */
+ ["\u6544", "\u6544"], /* CJK Ideograph */
+ ["\u6545", "\u6545"], /* CJK Ideograph */
+ ["\u6546", "\u6546"], /* CJK Ideograph */
+ ["\u6547", "\u6547"], /* CJK Ideograph */
+ ["\u6548", "\u6548"], /* CJK Ideograph */
+ ["\u6549", "\u6549"], /* CJK Ideograph */
+ ["\u654A", "\u654A"], /* CJK Ideograph */
+ ["\u654B", "\u654B"], /* CJK Ideograph */
+ ["\u654C", "\u654C"], /* CJK Ideograph */
+ ["\u654D", "\u654D"], /* CJK Ideograph */
+ ["\u654E", "\u654E"], /* CJK Ideograph */
+ ["\u654F", "\u654F"], /* CJK Ideograph */
+ ["\u6550", "\u6550"], /* CJK Ideograph */
+ ["\u6551", "\u6551"], /* CJK Ideograph */
+ ["\u6552", "\u6552"], /* CJK Ideograph */
+ ["\u6553", "\u6553"], /* CJK Ideograph */
+ ["\u6554", "\u6554"], /* CJK Ideograph */
+ ["\u6555", "\u6555"], /* CJK Ideograph */
+ ["\u6556", "\u6556"], /* CJK Ideograph */
+ ["\u6557", "\u6557"], /* CJK Ideograph */
+ ["\u6558", "\u6558"], /* CJK Ideograph */
+ ["\u6559", "\u6559"], /* CJK Ideograph */
+ ["\u655A", "\u655A"], /* CJK Ideograph */
+ ["\u655B", "\u655B"], /* CJK Ideograph */
+ ["\u655C", "\u655C"], /* CJK Ideograph */
+ ["\u655D", "\u655D"], /* CJK Ideograph */
+ ["\u655E", "\u655E"], /* CJK Ideograph */
+ ["\u655F", "\u655F"], /* CJK Ideograph */
+ ["\u6560", "\u6560"], /* CJK Ideograph */
+ ["\u6561", "\u6561"], /* CJK Ideograph */
+ ["\u6562", "\u6562"], /* CJK Ideograph */
+ ["\u6563", "\u6563"], /* CJK Ideograph */
+ ["\u6564", "\u6564"], /* CJK Ideograph */
+ ["\u6565", "\u6565"], /* CJK Ideograph */
+ ["\u6566", "\u6566"], /* CJK Ideograph */
+ ["\u6567", "\u6567"], /* CJK Ideograph */
+ ["\u6568", "\u6568"], /* CJK Ideograph */
+ ["\u6569", "\u6569"], /* CJK Ideograph */
+ ["\u656A", "\u656A"], /* CJK Ideograph */
+ ["\u656B", "\u656B"], /* CJK Ideograph */
+ ["\u656C", "\u656C"], /* CJK Ideograph */
+ ["\u656D", "\u656D"], /* CJK Ideograph */
+ ["\u656E", "\u656E"], /* CJK Ideograph */
+ ["\u656F", "\u656F"], /* CJK Ideograph */
+ ["\u6570", "\u6570"], /* CJK Ideograph */
+ ["\u6571", "\u6571"], /* CJK Ideograph */
+ ["\u6572", "\u6572"], /* CJK Ideograph */
+ ["\u6573", "\u6573"], /* CJK Ideograph */
+ ["\u6574", "\u6574"], /* CJK Ideograph */
+ ["\u6575", "\u6575"], /* CJK Ideograph */
+ ["\u6576", "\u6576"], /* CJK Ideograph */
+ ["\u6577", "\u6577"], /* CJK Ideograph */
+ ["\u6578", "\u6578"], /* CJK Ideograph */
+ ["\u6579", "\u6579"], /* CJK Ideograph */
+ ["\u657A", "\u657A"], /* CJK Ideograph */
+ ["\u657B", "\u657B"], /* CJK Ideograph */
+ ["\u657C", "\u657C"], /* CJK Ideograph */
+ ["\u657D", "\u657D"], /* CJK Ideograph */
+ ["\u657E", "\u657E"], /* CJK Ideograph */
+ ["\u657F", "\u657F"], /* CJK Ideograph */
+ ["\u6580", "\u6580"], /* CJK Ideograph */
+ ["\u6581", "\u6581"], /* CJK Ideograph */
+ ["\u6582", "\u6582"], /* CJK Ideograph */
+ ["\u6583", "\u6583"], /* CJK Ideograph */
+ ["\u6584", "\u6584"], /* CJK Ideograph */
+ ["\u6585", "\u6585"], /* CJK Ideograph */
+ ["\u6586", "\u6586"], /* CJK Ideograph */
+ ["\u6587", "\u6587"], /* CJK Ideograph */
+ ["\u6588", "\u6588"], /* CJK Ideograph */
+ ["\u6589", "\u6589"], /* CJK Ideograph */
+ ["\u658A", "\u658A"], /* CJK Ideograph */
+ ["\u658B", "\u658B"], /* CJK Ideograph */
+ ["\u658C", "\u658C"], /* CJK Ideograph */
+ ["\u658D", "\u658D"], /* CJK Ideograph */
+ ["\u658E", "\u658E"], /* CJK Ideograph */
+ ["\u658F", "\u658F"], /* CJK Ideograph */
+ ["\u6590", "\u6590"], /* CJK Ideograph */
+ ["\u6591", "\u6591"], /* CJK Ideograph */
+ ["\u6592", "\u6592"], /* CJK Ideograph */
+ ["\u6593", "\u6593"], /* CJK Ideograph */
+ ["\u6594", "\u6594"], /* CJK Ideograph */
+ ["\u6595", "\u6595"], /* CJK Ideograph */
+ ["\u6596", "\u6596"], /* CJK Ideograph */
+ ["\u6597", "\u6597"], /* CJK Ideograph */
+ ["\u6598", "\u6598"], /* CJK Ideograph */
+ ["\u6599", "\u6599"], /* CJK Ideograph */
+ ["\u659A", "\u659A"], /* CJK Ideograph */
+ ["\u659B", "\u659B"], /* CJK Ideograph */
+ ["\u659C", "\u659C"], /* CJK Ideograph */
+ ["\u659D", "\u659D"], /* CJK Ideograph */
+ ["\u659E", "\u659E"], /* CJK Ideograph */
+ ["\u659F", "\u659F"], /* CJK Ideograph */
+ ["\u65A0", "\u65A0"], /* CJK Ideograph */
+ ["\u65A1", "\u65A1"], /* CJK Ideograph */
+ ["\u65A2", "\u65A2"], /* CJK Ideograph */
+ ["\u65A3", "\u65A3"], /* CJK Ideograph */
+ ["\u65A4", "\u65A4"], /* CJK Ideograph */
+ ["\u65A5", "\u65A5"], /* CJK Ideograph */
+ ["\u65A6", "\u65A6"], /* CJK Ideograph */
+ ["\u65A7", "\u65A7"], /* CJK Ideograph */
+ ["\u65A8", "\u65A8"], /* CJK Ideograph */
+ ["\u65A9", "\u65A9"], /* CJK Ideograph */
+ ["\u65AA", "\u65AA"], /* CJK Ideograph */
+ ["\u65AB", "\u65AB"], /* CJK Ideograph */
+ ["\u65AC", "\u65AC"], /* CJK Ideograph */
+ ["\u65AD", "\u65AD"], /* CJK Ideograph */
+ ["\u65AE", "\u65AE"], /* CJK Ideograph */
+ ["\u65AF", "\u65AF"], /* CJK Ideograph */
+ ["\u65B0", "\u65B0"], /* CJK Ideograph */
+ ["\u65B1", "\u65B1"], /* CJK Ideograph */
+ ["\u65B2", "\u65B2"], /* CJK Ideograph */
+ ["\u65B3", "\u65B3"], /* CJK Ideograph */
+ ["\u65B4", "\u65B4"], /* CJK Ideograph */
+ ["\u65B5", "\u65B5"], /* CJK Ideograph */
+ ["\u65B6", "\u65B6"], /* CJK Ideograph */
+ ["\u65B7", "\u65B7"], /* CJK Ideograph */
+ ["\u65B8", "\u65B8"], /* CJK Ideograph */
+ ["\u65B9", "\u65B9"], /* CJK Ideograph */
+ ["\u65BA", "\u65BA"], /* CJK Ideograph */
+ ["\u65BB", "\u65BB"], /* CJK Ideograph */
+ ["\u65BC", "\u65BC"], /* CJK Ideograph */
+ ["\u65BD", "\u65BD"], /* CJK Ideograph */
+ ["\u65BE", "\u65BE"], /* CJK Ideograph */
+ ["\u65BF", "\u65BF"], /* CJK Ideograph */
+ ["\u65C0", "\u65C0"], /* CJK Ideograph */
+ ["\u65C1", "\u65C1"], /* CJK Ideograph */
+ ["\u65C2", "\u65C2"], /* CJK Ideograph */
+ ["\u65C3", "\u65C3"], /* CJK Ideograph */
+ ["\u65C4", "\u65C4"], /* CJK Ideograph */
+ ["\u65C5", "\u65C5"], /* CJK Ideograph */
+ ["\u65C6", "\u65C6"], /* CJK Ideograph */
+ ["\u65C7", "\u65C7"], /* CJK Ideograph */
+ ["\u65C8", "\u65C8"], /* CJK Ideograph */
+ ["\u65C9", "\u65C9"], /* CJK Ideograph */
+ ["\u65CA", "\u65CA"], /* CJK Ideograph */
+ ["\u65CB", "\u65CB"], /* CJK Ideograph */
+ ["\u65CC", "\u65CC"], /* CJK Ideograph */
+ ["\u65CD", "\u65CD"], /* CJK Ideograph */
+ ["\u65CE", "\u65CE"], /* CJK Ideograph */
+ ["\u65CF", "\u65CF"], /* CJK Ideograph */
+ ["\u65D0", "\u65D0"], /* CJK Ideograph */
+ ["\u65D1", "\u65D1"], /* CJK Ideograph */
+ ["\u65D2", "\u65D2"], /* CJK Ideograph */
+ ["\u65D3", "\u65D3"], /* CJK Ideograph */
+ ["\u65D4", "\u65D4"], /* CJK Ideograph */
+ ["\u65D5", "\u65D5"], /* CJK Ideograph */
+ ["\u65D6", "\u65D6"], /* CJK Ideograph */
+ ["\u65D7", "\u65D7"], /* CJK Ideograph */
+ ["\u65D8", "\u65D8"], /* CJK Ideograph */
+ ["\u65D9", "\u65D9"], /* CJK Ideograph */
+ ["\u65DA", "\u65DA"], /* CJK Ideograph */
+ ["\u65DB", "\u65DB"], /* CJK Ideograph */
+ ["\u65DC", "\u65DC"], /* CJK Ideograph */
+ ["\u65DD", "\u65DD"], /* CJK Ideograph */
+ ["\u65DE", "\u65DE"], /* CJK Ideograph */
+ ["\u65DF", "\u65DF"], /* CJK Ideograph */
+ ["\u65E0", "\u65E0"], /* CJK Ideograph */
+ ["\u65E1", "\u65E1"], /* CJK Ideograph */
+ ["\u65E2", "\u65E2"], /* CJK Ideograph */
+ ["\u65E3", "\u65E3"], /* CJK Ideograph */
+ ["\u65E4", "\u65E4"], /* CJK Ideograph */
+ ["\u65E5", "\u65E5"], /* CJK Ideograph */
+ ["\u65E6", "\u65E6"], /* CJK Ideograph */
+ ["\u65E7", "\u65E7"], /* CJK Ideograph */
+ ["\u65E8", "\u65E8"], /* CJK Ideograph */
+ ["\u65E9", "\u65E9"], /* CJK Ideograph */
+ ["\u65EA", "\u65EA"], /* CJK Ideograph */
+ ["\u65EB", "\u65EB"], /* CJK Ideograph */
+ ["\u65EC", "\u65EC"], /* CJK Ideograph */
+ ["\u65ED", "\u65ED"], /* CJK Ideograph */
+ ["\u65EE", "\u65EE"], /* CJK Ideograph */
+ ["\u65EF", "\u65EF"], /* CJK Ideograph */
+ ["\u65F0", "\u65F0"], /* CJK Ideograph */
+ ["\u65F1", "\u65F1"], /* CJK Ideograph */
+ ["\u65F2", "\u65F2"], /* CJK Ideograph */
+ ["\u65F3", "\u65F3"], /* CJK Ideograph */
+ ["\u65F4", "\u65F4"], /* CJK Ideograph */
+ ["\u65F5", "\u65F5"], /* CJK Ideograph */
+ ["\u65F6", "\u65F6"], /* CJK Ideograph */
+ ["\u65F7", "\u65F7"], /* CJK Ideograph */
+ ["\u65F8", "\u65F8"], /* CJK Ideograph */
+ ["\u65F9", "\u65F9"], /* CJK Ideograph */
+ ["\u65FA", "\u65FA"], /* CJK Ideograph */
+ ["\u65FB", "\u65FB"], /* CJK Ideograph */
+ ["\u65FC", "\u65FC"], /* CJK Ideograph */
+ ["\u65FD", "\u65FD"], /* CJK Ideograph */
+ ["\u65FE", "\u65FE"], /* CJK Ideograph */
+ ["\u65FF", "\u65FF"], /* CJK Ideograph */
+ ["\u6600", "\u6600"], /* CJK Ideograph */
+ ["\u6601", "\u6601"], /* CJK Ideograph */
+ ["\u6602", "\u6602"], /* CJK Ideograph */
+ ["\u6603", "\u6603"], /* CJK Ideograph */
+ ["\u6604", "\u6604"], /* CJK Ideograph */
+ ["\u6605", "\u6605"], /* CJK Ideograph */
+ ["\u6606", "\u6606"], /* CJK Ideograph */
+ ["\u6607", "\u6607"], /* CJK Ideograph */
+ ["\u6608", "\u6608"], /* CJK Ideograph */
+ ["\u6609", "\u6609"], /* CJK Ideograph */
+ ["\u660A", "\u660A"], /* CJK Ideograph */
+ ["\u660B", "\u660B"], /* CJK Ideograph */
+ ["\u660C", "\u660C"], /* CJK Ideograph */
+ ["\u660D", "\u660D"], /* CJK Ideograph */
+ ["\u660E", "\u660E"], /* CJK Ideograph */
+ ["\u660F", "\u660F"], /* CJK Ideograph */
+ ["\u6610", "\u6610"], /* CJK Ideograph */
+ ["\u6611", "\u6611"], /* CJK Ideograph */
+ ["\u6612", "\u6612"], /* CJK Ideograph */
+ ["\u6613", "\u6613"], /* CJK Ideograph */
+ ["\u6614", "\u6614"], /* CJK Ideograph */
+ ["\u6615", "\u6615"], /* CJK Ideograph */
+ ["\u6616", "\u6616"], /* CJK Ideograph */
+ ["\u6617", "\u6617"], /* CJK Ideograph */
+ ["\u6618", "\u6618"], /* CJK Ideograph */
+ ["\u6619", "\u6619"], /* CJK Ideograph */
+ ["\u661A", "\u661A"], /* CJK Ideograph */
+ ["\u661B", "\u661B"], /* CJK Ideograph */
+ ["\u661C", "\u661C"], /* CJK Ideograph */
+ ["\u661D", "\u661D"], /* CJK Ideograph */
+ ["\u661E", "\u661E"], /* CJK Ideograph */
+ ["\u661F", "\u661F"], /* CJK Ideograph */
+ ["\u6620", "\u6620"], /* CJK Ideograph */
+ ["\u6621", "\u6621"], /* CJK Ideograph */
+ ["\u6622", "\u6622"], /* CJK Ideograph */
+ ["\u6623", "\u6623"], /* CJK Ideograph */
+ ["\u6624", "\u6624"], /* CJK Ideograph */
+ ["\u6625", "\u6625"], /* CJK Ideograph */
+ ["\u6626", "\u6626"], /* CJK Ideograph */
+ ["\u6627", "\u6627"], /* CJK Ideograph */
+ ["\u6628", "\u6628"], /* CJK Ideograph */
+ ["\u6629", "\u6629"], /* CJK Ideograph */
+ ["\u662A", "\u662A"], /* CJK Ideograph */
+ ["\u662B", "\u662B"], /* CJK Ideograph */
+ ["\u662C", "\u662C"], /* CJK Ideograph */
+ ["\u662D", "\u662D"], /* CJK Ideograph */
+ ["\u662E", "\u662E"], /* CJK Ideograph */
+ ["\u662F", "\u662F"], /* CJK Ideograph */
+ ["\u6630", "\u6630"], /* CJK Ideograph */
+ ["\u6631", "\u6631"], /* CJK Ideograph */
+ ["\u6632", "\u6632"], /* CJK Ideograph */
+ ["\u6633", "\u6633"], /* CJK Ideograph */
+ ["\u6634", "\u6634"], /* CJK Ideograph */
+ ["\u6635", "\u6635"], /* CJK Ideograph */
+ ["\u6636", "\u6636"], /* CJK Ideograph */
+ ["\u6637", "\u6637"], /* CJK Ideograph */
+ ["\u6638", "\u6638"], /* CJK Ideograph */
+ ["\u6639", "\u6639"], /* CJK Ideograph */
+ ["\u663A", "\u663A"], /* CJK Ideograph */
+ ["\u663B", "\u663B"], /* CJK Ideograph */
+ ["\u663C", "\u663C"], /* CJK Ideograph */
+ ["\u663D", "\u663D"], /* CJK Ideograph */
+ ["\u663E", "\u663E"], /* CJK Ideograph */
+ ["\u663F", "\u663F"], /* CJK Ideograph */
+ ["\u6640", "\u6640"], /* CJK Ideograph */
+ ["\u6641", "\u6641"], /* CJK Ideograph */
+ ["\u6642", "\u6642"], /* CJK Ideograph */
+ ["\u6643", "\u6643"], /* CJK Ideograph */
+ ["\u6644", "\u6644"], /* CJK Ideograph */
+ ["\u6645", "\u6645"], /* CJK Ideograph */
+ ["\u6646", "\u6646"], /* CJK Ideograph */
+ ["\u6647", "\u6647"], /* CJK Ideograph */
+ ["\u6648", "\u6648"], /* CJK Ideograph */
+ ["\u6649", "\u6649"], /* CJK Ideograph */
+ ["\u664A", "\u664A"], /* CJK Ideograph */
+ ["\u664B", "\u664B"], /* CJK Ideograph */
+ ["\u664C", "\u664C"], /* CJK Ideograph */
+ ["\u664D", "\u664D"], /* CJK Ideograph */
+ ["\u664E", "\u664E"], /* CJK Ideograph */
+ ["\u664F", "\u664F"], /* CJK Ideograph */
+ ["\u6650", "\u6650"], /* CJK Ideograph */
+ ["\u6651", "\u6651"], /* CJK Ideograph */
+ ["\u6652", "\u6652"], /* CJK Ideograph */
+ ["\u6653", "\u6653"], /* CJK Ideograph */
+ ["\u6654", "\u6654"], /* CJK Ideograph */
+ ["\u6655", "\u6655"], /* CJK Ideograph */
+ ["\u6656", "\u6656"], /* CJK Ideograph */
+ ["\u6657", "\u6657"], /* CJK Ideograph */
+ ["\u6658", "\u6658"], /* CJK Ideograph */
+ ["\u6659", "\u6659"], /* CJK Ideograph */
+ ["\u665A", "\u665A"], /* CJK Ideograph */
+ ["\u665B", "\u665B"], /* CJK Ideograph */
+ ["\u665C", "\u665C"], /* CJK Ideograph */
+ ["\u665D", "\u665D"], /* CJK Ideograph */
+ ["\u665E", "\u665E"], /* CJK Ideograph */
+ ["\u665F", "\u665F"], /* CJK Ideograph */
+ ["\u6660", "\u6660"], /* CJK Ideograph */
+ ["\u6661", "\u6661"], /* CJK Ideograph */
+ ["\u6662", "\u6662"], /* CJK Ideograph */
+ ["\u6663", "\u6663"], /* CJK Ideograph */
+ ["\u6664", "\u6664"], /* CJK Ideograph */
+ ["\u6665", "\u6665"], /* CJK Ideograph */
+ ["\u6666", "\u6666"], /* CJK Ideograph */
+ ["\u6667", "\u6667"], /* CJK Ideograph */
+ ["\u6668", "\u6668"], /* CJK Ideograph */
+ ["\u6669", "\u6669"], /* CJK Ideograph */
+ ["\u666A", "\u666A"], /* CJK Ideograph */
+ ["\u666B", "\u666B"], /* CJK Ideograph */
+ ["\u666C", "\u666C"], /* CJK Ideograph */
+ ["\u666D", "\u666D"], /* CJK Ideograph */
+ ["\u666E", "\u666E"], /* CJK Ideograph */
+ ["\u666F", "\u666F"], /* CJK Ideograph */
+ ["\u6670", "\u6670"], /* CJK Ideograph */
+ ["\u6671", "\u6671"], /* CJK Ideograph */
+ ["\u6672", "\u6672"], /* CJK Ideograph */
+ ["\u6673", "\u6673"], /* CJK Ideograph */
+ ["\u6674", "\u6674"], /* CJK Ideograph */
+ ["\u6675", "\u6675"], /* CJK Ideograph */
+ ["\u6676", "\u6676"], /* CJK Ideograph */
+ ["\u6677", "\u6677"], /* CJK Ideograph */
+ ["\u6678", "\u6678"], /* CJK Ideograph */
+ ["\u6679", "\u6679"], /* CJK Ideograph */
+ ["\u667A", "\u667A"], /* CJK Ideograph */
+ ["\u667B", "\u667B"], /* CJK Ideograph */
+ ["\u667C", "\u667C"], /* CJK Ideograph */
+ ["\u667D", "\u667D"], /* CJK Ideograph */
+ ["\u667E", "\u667E"], /* CJK Ideograph */
+ ["\u667F", "\u667F"], /* CJK Ideograph */
+ ["\u6680", "\u6680"], /* CJK Ideograph */
+ ["\u6681", "\u6681"], /* CJK Ideograph */
+ ["\u6682", "\u6682"], /* CJK Ideograph */
+ ["\u6683", "\u6683"], /* CJK Ideograph */
+ ["\u6684", "\u6684"], /* CJK Ideograph */
+ ["\u6685", "\u6685"], /* CJK Ideograph */
+ ["\u6686", "\u6686"], /* CJK Ideograph */
+ ["\u6687", "\u6687"], /* CJK Ideograph */
+ ["\u6688", "\u6688"], /* CJK Ideograph */
+ ["\u6689", "\u6689"], /* CJK Ideograph */
+ ["\u668A", "\u668A"], /* CJK Ideograph */
+ ["\u668B", "\u668B"], /* CJK Ideograph */
+ ["\u668C", "\u668C"], /* CJK Ideograph */
+ ["\u668D", "\u668D"], /* CJK Ideograph */
+ ["\u668E", "\u668E"], /* CJK Ideograph */
+ ["\u668F", "\u668F"], /* CJK Ideograph */
+ ["\u6690", "\u6690"], /* CJK Ideograph */
+ ["\u6691", "\u6691"], /* CJK Ideograph */
+ ["\u6692", "\u6692"], /* CJK Ideograph */
+ ["\u6693", "\u6693"], /* CJK Ideograph */
+ ["\u6694", "\u6694"], /* CJK Ideograph */
+ ["\u6695", "\u6695"], /* CJK Ideograph */
+ ["\u6696", "\u6696"], /* CJK Ideograph */
+ ["\u6697", "\u6697"], /* CJK Ideograph */
+ ["\u6698", "\u6698"], /* CJK Ideograph */
+ ["\u6699", "\u6699"], /* CJK Ideograph */
+ ["\u669A", "\u669A"], /* CJK Ideograph */
+ ["\u669B", "\u669B"], /* CJK Ideograph */
+ ["\u669C", "\u669C"], /* CJK Ideograph */
+ ["\u669D", "\u669D"], /* CJK Ideograph */
+ ["\u669E", "\u669E"], /* CJK Ideograph */
+ ["\u669F", "\u669F"], /* CJK Ideograph */
+ ["\u66A0", "\u66A0"], /* CJK Ideograph */
+ ["\u66A1", "\u66A1"], /* CJK Ideograph */
+ ["\u66A2", "\u66A2"], /* CJK Ideograph */
+ ["\u66A3", "\u66A3"], /* CJK Ideograph */
+ ["\u66A4", "\u66A4"], /* CJK Ideograph */
+ ["\u66A5", "\u66A5"], /* CJK Ideograph */
+ ["\u66A6", "\u66A6"], /* CJK Ideograph */
+ ["\u66A7", "\u66A7"], /* CJK Ideograph */
+ ["\u66A8", "\u66A8"], /* CJK Ideograph */
+ ["\u66A9", "\u66A9"], /* CJK Ideograph */
+ ["\u66AA", "\u66AA"], /* CJK Ideograph */
+ ["\u66AB", "\u66AB"], /* CJK Ideograph */
+ ["\u66AC", "\u66AC"], /* CJK Ideograph */
+ ["\u66AD", "\u66AD"], /* CJK Ideograph */
+ ["\u66AE", "\u66AE"], /* CJK Ideograph */
+ ["\u66AF", "\u66AF"], /* CJK Ideograph */
+ ["\u66B0", "\u66B0"], /* CJK Ideograph */
+ ["\u66B1", "\u66B1"], /* CJK Ideograph */
+ ["\u66B2", "\u66B2"], /* CJK Ideograph */
+ ["\u66B3", "\u66B3"], /* CJK Ideograph */
+ ["\u66B4", "\u66B4"], /* CJK Ideograph */
+ ["\u66B5", "\u66B5"], /* CJK Ideograph */
+ ["\u66B6", "\u66B6"], /* CJK Ideograph */
+ ["\u66B7", "\u66B7"], /* CJK Ideograph */
+ ["\u66B8", "\u66B8"], /* CJK Ideograph */
+ ["\u66B9", "\u66B9"], /* CJK Ideograph */
+ ["\u66BA", "\u66BA"], /* CJK Ideograph */
+ ["\u66BB", "\u66BB"], /* CJK Ideograph */
+ ["\u66BC", "\u66BC"], /* CJK Ideograph */
+ ["\u66BD", "\u66BD"], /* CJK Ideograph */
+ ["\u66BE", "\u66BE"], /* CJK Ideograph */
+ ["\u66BF", "\u66BF"], /* CJK Ideograph */
+ ["\u66C0", "\u66C0"], /* CJK Ideograph */
+ ["\u66C1", "\u66C1"], /* CJK Ideograph */
+ ["\u66C2", "\u66C2"], /* CJK Ideograph */
+ ["\u66C3", "\u66C3"], /* CJK Ideograph */
+ ["\u66C4", "\u66C4"], /* CJK Ideograph */
+ ["\u66C5", "\u66C5"], /* CJK Ideograph */
+ ["\u66C6", "\u66C6"], /* CJK Ideograph */
+ ["\u66C7", "\u66C7"], /* CJK Ideograph */
+ ["\u66C8", "\u66C8"], /* CJK Ideograph */
+ ["\u66C9", "\u66C9"], /* CJK Ideograph */
+ ["\u66CA", "\u66CA"], /* CJK Ideograph */
+ ["\u66CB", "\u66CB"], /* CJK Ideograph */
+ ["\u66CC", "\u66CC"], /* CJK Ideograph */
+ ["\u66CD", "\u66CD"], /* CJK Ideograph */
+ ["\u66CE", "\u66CE"], /* CJK Ideograph */
+ ["\u66CF", "\u66CF"], /* CJK Ideograph */
+ ["\u66D0", "\u66D0"], /* CJK Ideograph */
+ ["\u66D1", "\u66D1"], /* CJK Ideograph */
+ ["\u66D2", "\u66D2"], /* CJK Ideograph */
+ ["\u66D3", "\u66D3"], /* CJK Ideograph */
+ ["\u66D4", "\u66D4"], /* CJK Ideograph */
+ ["\u66D5", "\u66D5"], /* CJK Ideograph */
+ ["\u66D6", "\u66D6"], /* CJK Ideograph */
+ ["\u66D7", "\u66D7"], /* CJK Ideograph */
+ ["\u66D8", "\u66D8"], /* CJK Ideograph */
+ ["\u66D9", "\u66D9"], /* CJK Ideograph */
+ ["\u66DA", "\u66DA"], /* CJK Ideograph */
+ ["\u66DB", "\u66DB"], /* CJK Ideograph */
+ ["\u66DC", "\u66DC"], /* CJK Ideograph */
+ ["\u66DD", "\u66DD"], /* CJK Ideograph */
+ ["\u66DE", "\u66DE"], /* CJK Ideograph */
+ ["\u66DF", "\u66DF"], /* CJK Ideograph */
+ ["\u66E0", "\u66E0"], /* CJK Ideograph */
+ ["\u66E1", "\u66E1"], /* CJK Ideograph */
+ ["\u66E2", "\u66E2"], /* CJK Ideograph */
+ ["\u66E3", "\u66E3"], /* CJK Ideograph */
+ ["\u66E4", "\u66E4"], /* CJK Ideograph */
+ ["\u66E5", "\u66E5"], /* CJK Ideograph */
+ ["\u66E6", "\u66E6"], /* CJK Ideograph */
+ ["\u66E7", "\u66E7"], /* CJK Ideograph */
+ ["\u66E8", "\u66E8"], /* CJK Ideograph */
+ ["\u66E9", "\u66E9"], /* CJK Ideograph */
+ ["\u66EA", "\u66EA"], /* CJK Ideograph */
+ ["\u66EB", "\u66EB"], /* CJK Ideograph */
+ ["\u66EC", "\u66EC"], /* CJK Ideograph */
+ ["\u66ED", "\u66ED"], /* CJK Ideograph */
+ ["\u66EE", "\u66EE"], /* CJK Ideograph */
+ ["\u66EF", "\u66EF"], /* CJK Ideograph */
+ ["\u66F0", "\u66F0"], /* CJK Ideograph */
+ ["\u66F1", "\u66F1"], /* CJK Ideograph */
+ ["\u66F2", "\u66F2"], /* CJK Ideograph */
+ ["\u66F3", "\u66F3"], /* CJK Ideograph */
+ ["\u66F4", "\u66F4"], /* CJK Ideograph */
+ ["\u66F5", "\u66F5"], /* CJK Ideograph */
+ ["\u66F6", "\u66F6"], /* CJK Ideograph */
+ ["\u66F7", "\u66F7"], /* CJK Ideograph */
+ ["\u66F8", "\u66F8"], /* CJK Ideograph */
+ ["\u66F9", "\u66F9"], /* CJK Ideograph */
+ ["\u66FA", "\u66FA"], /* CJK Ideograph */
+ ["\u66FB", "\u66FB"], /* CJK Ideograph */
+ ["\u66FC", "\u66FC"], /* CJK Ideograph */
+ ["\u66FD", "\u66FD"], /* CJK Ideograph */
+ ["\u66FE", "\u66FE"], /* CJK Ideograph */
+ ["\u66FF", "\u66FF"], /* CJK Ideograph */
+ ["\u6700", "\u6700"], /* CJK Ideograph */
+ ["\u6701", "\u6701"], /* CJK Ideograph */
+ ["\u6702", "\u6702"], /* CJK Ideograph */
+ ["\u6703", "\u6703"], /* CJK Ideograph */
+ ["\u6704", "\u6704"], /* CJK Ideograph */
+ ["\u6705", "\u6705"], /* CJK Ideograph */
+ ["\u6706", "\u6706"], /* CJK Ideograph */
+ ["\u6707", "\u6707"], /* CJK Ideograph */
+ ["\u6708", "\u6708"], /* CJK Ideograph */
+ ["\u6709", "\u6709"], /* CJK Ideograph */
+ ["\u670A", "\u670A"], /* CJK Ideograph */
+ ["\u670B", "\u670B"], /* CJK Ideograph */
+ ["\u670C", "\u670C"], /* CJK Ideograph */
+ ["\u670D", "\u670D"], /* CJK Ideograph */
+ ["\u670E", "\u670E"], /* CJK Ideograph */
+ ["\u670F", "\u670F"], /* CJK Ideograph */
+ ["\u6710", "\u6710"], /* CJK Ideograph */
+ ["\u6711", "\u6711"], /* CJK Ideograph */
+ ["\u6712", "\u6712"], /* CJK Ideograph */
+ ["\u6713", "\u6713"], /* CJK Ideograph */
+ ["\u6714", "\u6714"], /* CJK Ideograph */
+ ["\u6715", "\u6715"], /* CJK Ideograph */
+ ["\u6716", "\u6716"], /* CJK Ideograph */
+ ["\u6717", "\u6717"], /* CJK Ideograph */
+ ["\u6718", "\u6718"], /* CJK Ideograph */
+ ["\u6719", "\u6719"], /* CJK Ideograph */
+ ["\u671A", "\u671A"], /* CJK Ideograph */
+ ["\u671B", "\u671B"], /* CJK Ideograph */
+ ["\u671C", "\u671C"], /* CJK Ideograph */
+ ["\u671D", "\u671D"], /* CJK Ideograph */
+ ["\u671E", "\u671E"], /* CJK Ideograph */
+ ["\u671F", "\u671F"], /* CJK Ideograph */
+ ["\u6720", "\u6720"], /* CJK Ideograph */
+ ["\u6721", "\u6721"], /* CJK Ideograph */
+ ["\u6722", "\u6722"], /* CJK Ideograph */
+ ["\u6723", "\u6723"], /* CJK Ideograph */
+ ["\u6724", "\u6724"], /* CJK Ideograph */
+ ["\u6725", "\u6725"], /* CJK Ideograph */
+ ["\u6726", "\u6726"], /* CJK Ideograph */
+ ["\u6727", "\u6727"], /* CJK Ideograph */
+ ["\u6728", "\u6728"], /* CJK Ideograph */
+ ["\u6729", "\u6729"], /* CJK Ideograph */
+ ["\u672A", "\u672A"], /* CJK Ideograph */
+ ["\u672B", "\u672B"], /* CJK Ideograph */
+ ["\u672C", "\u672C"], /* CJK Ideograph */
+ ["\u672D", "\u672D"], /* CJK Ideograph */
+ ["\u672E", "\u672E"], /* CJK Ideograph */
+ ["\u672F", "\u672F"], /* CJK Ideograph */
+ ["\u6730", "\u6730"], /* CJK Ideograph */
+ ["\u6731", "\u6731"], /* CJK Ideograph */
+ ["\u6732", "\u6732"], /* CJK Ideograph */
+ ["\u6733", "\u6733"], /* CJK Ideograph */
+ ["\u6734", "\u6734"], /* CJK Ideograph */
+ ["\u6735", "\u6735"], /* CJK Ideograph */
+ ["\u6736", "\u6736"], /* CJK Ideograph */
+ ["\u6737", "\u6737"], /* CJK Ideograph */
+ ["\u6738", "\u6738"], /* CJK Ideograph */
+ ["\u6739", "\u6739"], /* CJK Ideograph */
+ ["\u673A", "\u673A"], /* CJK Ideograph */
+ ["\u673B", "\u673B"], /* CJK Ideograph */
+ ["\u673C", "\u673C"], /* CJK Ideograph */
+ ["\u673D", "\u673D"], /* CJK Ideograph */
+ ["\u673E", "\u673E"], /* CJK Ideograph */
+ ["\u673F", "\u673F"], /* CJK Ideograph */
+ ["\u6740", "\u6740"], /* CJK Ideograph */
+ ["\u6741", "\u6741"], /* CJK Ideograph */
+ ["\u6742", "\u6742"], /* CJK Ideograph */
+ ["\u6743", "\u6743"], /* CJK Ideograph */
+ ["\u6744", "\u6744"], /* CJK Ideograph */
+ ["\u6745", "\u6745"], /* CJK Ideograph */
+ ["\u6746", "\u6746"], /* CJK Ideograph */
+ ["\u6747", "\u6747"], /* CJK Ideograph */
+ ["\u6748", "\u6748"], /* CJK Ideograph */
+ ["\u6749", "\u6749"], /* CJK Ideograph */
+ ["\u674A", "\u674A"], /* CJK Ideograph */
+ ["\u674B", "\u674B"], /* CJK Ideograph */
+ ["\u674C", "\u674C"], /* CJK Ideograph */
+ ["\u674D", "\u674D"], /* CJK Ideograph */
+ ["\u674E", "\u674E"], /* CJK Ideograph */
+ ["\u674F", "\u674F"], /* CJK Ideograph */
+ ["\u6750", "\u6750"], /* CJK Ideograph */
+ ["\u6751", "\u6751"], /* CJK Ideograph */
+ ["\u6752", "\u6752"], /* CJK Ideograph */
+ ["\u6753", "\u6753"], /* CJK Ideograph */
+ ["\u6754", "\u6754"], /* CJK Ideograph */
+ ["\u6755", "\u6755"], /* CJK Ideograph */
+ ["\u6756", "\u6756"], /* CJK Ideograph */
+ ["\u6757", "\u6757"], /* CJK Ideograph */
+ ["\u6758", "\u6758"], /* CJK Ideograph */
+ ["\u6759", "\u6759"], /* CJK Ideograph */
+ ["\u675A", "\u675A"], /* CJK Ideograph */
+ ["\u675B", "\u675B"], /* CJK Ideograph */
+ ["\u675C", "\u675C"], /* CJK Ideograph */
+ ["\u675D", "\u675D"], /* CJK Ideograph */
+ ["\u675E", "\u675E"], /* CJK Ideograph */
+ ["\u675F", "\u675F"], /* CJK Ideograph */
+ ["\u6760", "\u6760"], /* CJK Ideograph */
+ ["\u6761", "\u6761"], /* CJK Ideograph */
+ ["\u6762", "\u6762"], /* CJK Ideograph */
+ ["\u6763", "\u6763"], /* CJK Ideograph */
+ ["\u6764", "\u6764"], /* CJK Ideograph */
+ ["\u6765", "\u6765"], /* CJK Ideograph */
+ ["\u6766", "\u6766"], /* CJK Ideograph */
+ ["\u6767", "\u6767"], /* CJK Ideograph */
+ ["\u6768", "\u6768"], /* CJK Ideograph */
+ ["\u6769", "\u6769"], /* CJK Ideograph */
+ ["\u676A", "\u676A"], /* CJK Ideograph */
+ ["\u676B", "\u676B"], /* CJK Ideograph */
+ ["\u676C", "\u676C"], /* CJK Ideograph */
+ ["\u676D", "\u676D"], /* CJK Ideograph */
+ ["\u676E", "\u676E"], /* CJK Ideograph */
+ ["\u676F", "\u676F"], /* CJK Ideograph */
+ ["\u6770", "\u6770"], /* CJK Ideograph */
+ ["\u6771", "\u6771"], /* CJK Ideograph */
+ ["\u6772", "\u6772"], /* CJK Ideograph */
+ ["\u6773", "\u6773"], /* CJK Ideograph */
+ ["\u6774", "\u6774"], /* CJK Ideograph */
+ ["\u6775", "\u6775"], /* CJK Ideograph */
+ ["\u6776", "\u6776"], /* CJK Ideograph */
+ ["\u6777", "\u6777"], /* CJK Ideograph */
+ ["\u6778", "\u6778"], /* CJK Ideograph */
+ ["\u6779", "\u6779"], /* CJK Ideograph */
+ ["\u677A", "\u677A"], /* CJK Ideograph */
+ ["\u677B", "\u677B"], /* CJK Ideograph */
+ ["\u677C", "\u677C"], /* CJK Ideograph */
+ ["\u677D", "\u677D"], /* CJK Ideograph */
+ ["\u677E", "\u677E"], /* CJK Ideograph */
+ ["\u677F", "\u677F"], /* CJK Ideograph */
+ ["\u6780", "\u6780"], /* CJK Ideograph */
+ ["\u6781", "\u6781"], /* CJK Ideograph */
+ ["\u6782", "\u6782"], /* CJK Ideograph */
+ ["\u6783", "\u6783"], /* CJK Ideograph */
+ ["\u6784", "\u6784"], /* CJK Ideograph */
+ ["\u6785", "\u6785"], /* CJK Ideograph */
+ ["\u6786", "\u6786"], /* CJK Ideograph */
+ ["\u6787", "\u6787"], /* CJK Ideograph */
+ ["\u6788", "\u6788"], /* CJK Ideograph */
+ ["\u6789", "\u6789"], /* CJK Ideograph */
+ ["\u678A", "\u678A"], /* CJK Ideograph */
+ ["\u678B", "\u678B"], /* CJK Ideograph */
+ ["\u678C", "\u678C"], /* CJK Ideograph */
+ ["\u678D", "\u678D"], /* CJK Ideograph */
+ ["\u678E", "\u678E"], /* CJK Ideograph */
+ ["\u678F", "\u678F"], /* CJK Ideograph */
+ ["\u6790", "\u6790"], /* CJK Ideograph */
+ ["\u6791", "\u6791"], /* CJK Ideograph */
+ ["\u6792", "\u6792"], /* CJK Ideograph */
+ ["\u6793", "\u6793"], /* CJK Ideograph */
+ ["\u6794", "\u6794"], /* CJK Ideograph */
+ ["\u6795", "\u6795"], /* CJK Ideograph */
+ ["\u6796", "\u6796"], /* CJK Ideograph */
+ ["\u6797", "\u6797"], /* CJK Ideograph */
+ ["\u6798", "\u6798"], /* CJK Ideograph */
+ ["\u6799", "\u6799"], /* CJK Ideograph */
+ ["\u679A", "\u679A"], /* CJK Ideograph */
+ ["\u679B", "\u679B"], /* CJK Ideograph */
+ ["\u679C", "\u679C"], /* CJK Ideograph */
+ ["\u679D", "\u679D"], /* CJK Ideograph */
+ ["\u679E", "\u679E"], /* CJK Ideograph */
+ ["\u679F", "\u679F"], /* CJK Ideograph */
+ ["\u67A0", "\u67A0"], /* CJK Ideograph */
+ ["\u67A1", "\u67A1"], /* CJK Ideograph */
+ ["\u67A2", "\u67A2"], /* CJK Ideograph */
+ ["\u67A3", "\u67A3"], /* CJK Ideograph */
+ ["\u67A4", "\u67A4"], /* CJK Ideograph */
+ ["\u67A5", "\u67A5"], /* CJK Ideograph */
+ ["\u67A6", "\u67A6"], /* CJK Ideograph */
+ ["\u67A7", "\u67A7"], /* CJK Ideograph */
+ ["\u67A8", "\u67A8"], /* CJK Ideograph */
+ ["\u67A9", "\u67A9"], /* CJK Ideograph */
+ ["\u67AA", "\u67AA"], /* CJK Ideograph */
+ ["\u67AB", "\u67AB"], /* CJK Ideograph */
+ ["\u67AC", "\u67AC"], /* CJK Ideograph */
+ ["\u67AD", "\u67AD"], /* CJK Ideograph */
+ ["\u67AE", "\u67AE"], /* CJK Ideograph */
+ ["\u67AF", "\u67AF"], /* CJK Ideograph */
+ ["\u67B0", "\u67B0"], /* CJK Ideograph */
+ ["\u67B1", "\u67B1"], /* CJK Ideograph */
+ ["\u67B2", "\u67B2"], /* CJK Ideograph */
+ ["\u67B3", "\u67B3"], /* CJK Ideograph */
+ ["\u67B4", "\u67B4"], /* CJK Ideograph */
+ ["\u67B5", "\u67B5"], /* CJK Ideograph */
+ ["\u67B6", "\u67B6"], /* CJK Ideograph */
+ ["\u67B7", "\u67B7"], /* CJK Ideograph */
+ ["\u67B8", "\u67B8"], /* CJK Ideograph */
+ ["\u67B9", "\u67B9"], /* CJK Ideograph */
+ ["\u67BA", "\u67BA"], /* CJK Ideograph */
+ ["\u67BB", "\u67BB"], /* CJK Ideograph */
+ ["\u67BC", "\u67BC"], /* CJK Ideograph */
+ ["\u67BD", "\u67BD"], /* CJK Ideograph */
+ ["\u67BE", "\u67BE"], /* CJK Ideograph */
+ ["\u67BF", "\u67BF"], /* CJK Ideograph */
+ ["\u67C0", "\u67C0"], /* CJK Ideograph */
+ ["\u67C1", "\u67C1"], /* CJK Ideograph */
+ ["\u67C2", "\u67C2"], /* CJK Ideograph */
+ ["\u67C3", "\u67C3"], /* CJK Ideograph */
+ ["\u67C4", "\u67C4"], /* CJK Ideograph */
+ ["\u67C5", "\u67C5"], /* CJK Ideograph */
+ ["\u67C6", "\u67C6"], /* CJK Ideograph */
+ ["\u67C7", "\u67C7"], /* CJK Ideograph */
+ ["\u67C8", "\u67C8"], /* CJK Ideograph */
+ ["\u67C9", "\u67C9"], /* CJK Ideograph */
+ ["\u67CA", "\u67CA"], /* CJK Ideograph */
+ ["\u67CB", "\u67CB"], /* CJK Ideograph */
+ ["\u67CC", "\u67CC"], /* CJK Ideograph */
+ ["\u67CD", "\u67CD"], /* CJK Ideograph */
+ ["\u67CE", "\u67CE"], /* CJK Ideograph */
+ ["\u67CF", "\u67CF"], /* CJK Ideograph */
+ ["\u67D0", "\u67D0"], /* CJK Ideograph */
+ ["\u67D1", "\u67D1"], /* CJK Ideograph */
+ ["\u67D2", "\u67D2"], /* CJK Ideograph */
+ ["\u67D3", "\u67D3"], /* CJK Ideograph */
+ ["\u67D4", "\u67D4"], /* CJK Ideograph */
+ ["\u67D5", "\u67D5"], /* CJK Ideograph */
+ ["\u67D6", "\u67D6"], /* CJK Ideograph */
+ ["\u67D7", "\u67D7"], /* CJK Ideograph */
+ ["\u67D8", "\u67D8"], /* CJK Ideograph */
+ ["\u67D9", "\u67D9"], /* CJK Ideograph */
+ ["\u67DA", "\u67DA"], /* CJK Ideograph */
+ ["\u67DB", "\u67DB"], /* CJK Ideograph */
+ ["\u67DC", "\u67DC"], /* CJK Ideograph */
+ ["\u67DD", "\u67DD"], /* CJK Ideograph */
+ ["\u67DE", "\u67DE"], /* CJK Ideograph */
+ ["\u67DF", "\u67DF"], /* CJK Ideograph */
+ ["\u67E0", "\u67E0"], /* CJK Ideograph */
+ ["\u67E1", "\u67E1"], /* CJK Ideograph */
+ ["\u67E2", "\u67E2"], /* CJK Ideograph */
+ ["\u67E3", "\u67E3"], /* CJK Ideograph */
+ ["\u67E4", "\u67E4"], /* CJK Ideograph */
+ ["\u67E5", "\u67E5"], /* CJK Ideograph */
+ ["\u67E6", "\u67E6"], /* CJK Ideograph */
+ ["\u67E7", "\u67E7"], /* CJK Ideograph */
+ ["\u67E8", "\u67E8"], /* CJK Ideograph */
+ ["\u67E9", "\u67E9"], /* CJK Ideograph */
+ ["\u67EA", "\u67EA"], /* CJK Ideograph */
+ ["\u67EB", "\u67EB"], /* CJK Ideograph */
+ ["\u67EC", "\u67EC"], /* CJK Ideograph */
+ ["\u67ED", "\u67ED"], /* CJK Ideograph */
+ ["\u67EE", "\u67EE"], /* CJK Ideograph */
+ ["\u67EF", "\u67EF"], /* CJK Ideograph */
+ ["\u67F0", "\u67F0"], /* CJK Ideograph */
+ ["\u67F1", "\u67F1"], /* CJK Ideograph */
+ ["\u67F2", "\u67F2"], /* CJK Ideograph */
+ ["\u67F3", "\u67F3"], /* CJK Ideograph */
+ ["\u67F4", "\u67F4"], /* CJK Ideograph */
+ ["\u67F5", "\u67F5"], /* CJK Ideograph */
+ ["\u67F6", "\u67F6"], /* CJK Ideograph */
+ ["\u67F7", "\u67F7"], /* CJK Ideograph */
+ ["\u67F8", "\u67F8"], /* CJK Ideograph */
+ ["\u67F9", "\u67F9"], /* CJK Ideograph */
+ ["\u67FA", "\u67FA"], /* CJK Ideograph */
+ ["\u67FB", "\u67FB"], /* CJK Ideograph */
+ ["\u67FC", "\u67FC"], /* CJK Ideograph */
+ ["\u67FD", "\u67FD"], /* CJK Ideograph */
+ ["\u67FE", "\u67FE"], /* CJK Ideograph */
+ ["\u67FF", "\u67FF"], /* CJK Ideograph */
+ ["\u6800", "\u6800"], /* CJK Ideograph */
+ ["\u6801", "\u6801"], /* CJK Ideograph */
+ ["\u6802", "\u6802"], /* CJK Ideograph */
+ ["\u6803", "\u6803"], /* CJK Ideograph */
+ ["\u6804", "\u6804"], /* CJK Ideograph */
+ ["\u6805", "\u6805"], /* CJK Ideograph */
+ ["\u6806", "\u6806"], /* CJK Ideograph */
+ ["\u6807", "\u6807"], /* CJK Ideograph */
+ ["\u6808", "\u6808"], /* CJK Ideograph */
+ ["\u6809", "\u6809"], /* CJK Ideograph */
+ ["\u680A", "\u680A"], /* CJK Ideograph */
+ ["\u680B", "\u680B"], /* CJK Ideograph */
+ ["\u680C", "\u680C"], /* CJK Ideograph */
+ ["\u680D", "\u680D"], /* CJK Ideograph */
+ ["\u680E", "\u680E"], /* CJK Ideograph */
+ ["\u680F", "\u680F"], /* CJK Ideograph */
+ ["\u6810", "\u6810"], /* CJK Ideograph */
+ ["\u6811", "\u6811"], /* CJK Ideograph */
+ ["\u6812", "\u6812"], /* CJK Ideograph */
+ ["\u6813", "\u6813"], /* CJK Ideograph */
+ ["\u6814", "\u6814"], /* CJK Ideograph */
+ ["\u6815", "\u6815"], /* CJK Ideograph */
+ ["\u6816", "\u6816"], /* CJK Ideograph */
+ ["\u6817", "\u6817"], /* CJK Ideograph */
+ ["\u6818", "\u6818"], /* CJK Ideograph */
+ ["\u6819", "\u6819"], /* CJK Ideograph */
+ ["\u681A", "\u681A"], /* CJK Ideograph */
+ ["\u681B", "\u681B"], /* CJK Ideograph */
+ ["\u681C", "\u681C"], /* CJK Ideograph */
+ ["\u681D", "\u681D"], /* CJK Ideograph */
+ ["\u681E", "\u681E"], /* CJK Ideograph */
+ ["\u681F", "\u681F"], /* CJK Ideograph */
+ ["\u6820", "\u6820"], /* CJK Ideograph */
+ ["\u6821", "\u6821"], /* CJK Ideograph */
+ ["\u6822", "\u6822"], /* CJK Ideograph */
+ ["\u6823", "\u6823"], /* CJK Ideograph */
+ ["\u6824", "\u6824"], /* CJK Ideograph */
+ ["\u6825", "\u6825"], /* CJK Ideograph */
+ ["\u6826", "\u6826"], /* CJK Ideograph */
+ ["\u6827", "\u6827"], /* CJK Ideograph */
+ ["\u6828", "\u6828"], /* CJK Ideograph */
+ ["\u6829", "\u6829"], /* CJK Ideograph */
+ ["\u682A", "\u682A"], /* CJK Ideograph */
+ ["\u682B", "\u682B"], /* CJK Ideograph */
+ ["\u682C", "\u682C"], /* CJK Ideograph */
+ ["\u682D", "\u682D"], /* CJK Ideograph */
+ ["\u682E", "\u682E"], /* CJK Ideograph */
+ ["\u682F", "\u682F"], /* CJK Ideograph */
+ ["\u6830", "\u6830"], /* CJK Ideograph */
+ ["\u6831", "\u6831"], /* CJK Ideograph */
+ ["\u6832", "\u6832"], /* CJK Ideograph */
+ ["\u6833", "\u6833"], /* CJK Ideograph */
+ ["\u6834", "\u6834"], /* CJK Ideograph */
+ ["\u6835", "\u6835"], /* CJK Ideograph */
+ ["\u6836", "\u6836"], /* CJK Ideograph */
+ ["\u6837", "\u6837"], /* CJK Ideograph */
+ ["\u6838", "\u6838"], /* CJK Ideograph */
+ ["\u6839", "\u6839"], /* CJK Ideograph */
+ ["\u683A", "\u683A"], /* CJK Ideograph */
+ ["\u683B", "\u683B"], /* CJK Ideograph */
+ ["\u683C", "\u683C"], /* CJK Ideograph */
+ ["\u683D", "\u683D"], /* CJK Ideograph */
+ ["\u683E", "\u683E"], /* CJK Ideograph */
+ ["\u683F", "\u683F"], /* CJK Ideograph */
+ ["\u6840", "\u6840"], /* CJK Ideograph */
+ ["\u6841", "\u6841"], /* CJK Ideograph */
+ ["\u6842", "\u6842"], /* CJK Ideograph */
+ ["\u6843", "\u6843"], /* CJK Ideograph */
+ ["\u6844", "\u6844"], /* CJK Ideograph */
+ ["\u6845", "\u6845"], /* CJK Ideograph */
+ ["\u6846", "\u6846"], /* CJK Ideograph */
+ ["\u6847", "\u6847"], /* CJK Ideograph */
+ ["\u6848", "\u6848"], /* CJK Ideograph */
+ ["\u6849", "\u6849"], /* CJK Ideograph */
+ ["\u684A", "\u684A"], /* CJK Ideograph */
+ ["\u684B", "\u684B"], /* CJK Ideograph */
+ ["\u684C", "\u684C"], /* CJK Ideograph */
+ ["\u684D", "\u684D"], /* CJK Ideograph */
+ ["\u684E", "\u684E"], /* CJK Ideograph */
+ ["\u684F", "\u684F"], /* CJK Ideograph */
+ ["\u6850", "\u6850"], /* CJK Ideograph */
+ ["\u6851", "\u6851"], /* CJK Ideograph */
+ ["\u6852", "\u6852"], /* CJK Ideograph */
+ ["\u6853", "\u6853"], /* CJK Ideograph */
+ ["\u6854", "\u6854"], /* CJK Ideograph */
+ ["\u6855", "\u6855"], /* CJK Ideograph */
+ ["\u6856", "\u6856"], /* CJK Ideograph */
+ ["\u6857", "\u6857"], /* CJK Ideograph */
+ ["\u6858", "\u6858"], /* CJK Ideograph */
+ ["\u6859", "\u6859"], /* CJK Ideograph */
+ ["\u685A", "\u685A"], /* CJK Ideograph */
+ ["\u685B", "\u685B"], /* CJK Ideograph */
+ ["\u685C", "\u685C"], /* CJK Ideograph */
+ ["\u685D", "\u685D"], /* CJK Ideograph */
+ ["\u685E", "\u685E"], /* CJK Ideograph */
+ ["\u685F", "\u685F"], /* CJK Ideograph */
+ ["\u6860", "\u6860"], /* CJK Ideograph */
+ ["\u6861", "\u6861"], /* CJK Ideograph */
+ ["\u6862", "\u6862"], /* CJK Ideograph */
+ ["\u6863", "\u6863"], /* CJK Ideograph */
+ ["\u6864", "\u6864"], /* CJK Ideograph */
+ ["\u6865", "\u6865"], /* CJK Ideograph */
+ ["\u6866", "\u6866"], /* CJK Ideograph */
+ ["\u6867", "\u6867"], /* CJK Ideograph */
+ ["\u6868", "\u6868"], /* CJK Ideograph */
+ ["\u6869", "\u6869"], /* CJK Ideograph */
+ ["\u686A", "\u686A"], /* CJK Ideograph */
+ ["\u686B", "\u686B"], /* CJK Ideograph */
+ ["\u686C", "\u686C"], /* CJK Ideograph */
+ ["\u686D", "\u686D"], /* CJK Ideograph */
+ ["\u686E", "\u686E"], /* CJK Ideograph */
+ ["\u686F", "\u686F"], /* CJK Ideograph */
+ ["\u6870", "\u6870"], /* CJK Ideograph */
+ ["\u6871", "\u6871"], /* CJK Ideograph */
+ ["\u6872", "\u6872"], /* CJK Ideograph */
+ ["\u6873", "\u6873"], /* CJK Ideograph */
+ ["\u6874", "\u6874"], /* CJK Ideograph */
+ ["\u6875", "\u6875"], /* CJK Ideograph */
+ ["\u6876", "\u6876"], /* CJK Ideograph */
+ ["\u6877", "\u6877"], /* CJK Ideograph */
+ ["\u6878", "\u6878"], /* CJK Ideograph */
+ ["\u6879", "\u6879"], /* CJK Ideograph */
+ ["\u687A", "\u687A"], /* CJK Ideograph */
+ ["\u687B", "\u687B"], /* CJK Ideograph */
+ ["\u687C", "\u687C"], /* CJK Ideograph */
+ ["\u687D", "\u687D"], /* CJK Ideograph */
+ ["\u687E", "\u687E"], /* CJK Ideograph */
+ ["\u687F", "\u687F"], /* CJK Ideograph */
+ ["\u6880", "\u6880"], /* CJK Ideograph */
+ ["\u6881", "\u6881"], /* CJK Ideograph */
+ ["\u6882", "\u6882"], /* CJK Ideograph */
+ ["\u6883", "\u6883"], /* CJK Ideograph */
+ ["\u6884", "\u6884"], /* CJK Ideograph */
+ ["\u6885", "\u6885"], /* CJK Ideograph */
+ ["\u6886", "\u6886"], /* CJK Ideograph */
+ ["\u6887", "\u6887"], /* CJK Ideograph */
+ ["\u6888", "\u6888"], /* CJK Ideograph */
+ ["\u6889", "\u6889"], /* CJK Ideograph */
+ ["\u688A", "\u688A"], /* CJK Ideograph */
+ ["\u688B", "\u688B"], /* CJK Ideograph */
+ ["\u688C", "\u688C"], /* CJK Ideograph */
+ ["\u688D", "\u688D"], /* CJK Ideograph */
+ ["\u688E", "\u688E"], /* CJK Ideograph */
+ ["\u688F", "\u688F"], /* CJK Ideograph */
+ ["\u6890", "\u6890"], /* CJK Ideograph */
+ ["\u6891", "\u6891"], /* CJK Ideograph */
+ ["\u6892", "\u6892"], /* CJK Ideograph */
+ ["\u6893", "\u6893"], /* CJK Ideograph */
+ ["\u6894", "\u6894"], /* CJK Ideograph */
+ ["\u6895", "\u6895"], /* CJK Ideograph */
+ ["\u6896", "\u6896"], /* CJK Ideograph */
+ ["\u6897", "\u6897"], /* CJK Ideograph */
+ ["\u6898", "\u6898"], /* CJK Ideograph */
+ ["\u6899", "\u6899"], /* CJK Ideograph */
+ ["\u689A", "\u689A"], /* CJK Ideograph */
+ ["\u689B", "\u689B"], /* CJK Ideograph */
+ ["\u689C", "\u689C"], /* CJK Ideograph */
+ ["\u689D", "\u689D"], /* CJK Ideograph */
+ ["\u689E", "\u689E"], /* CJK Ideograph */
+ ["\u689F", "\u689F"], /* CJK Ideograph */
+ ["\u68A0", "\u68A0"], /* CJK Ideograph */
+ ["\u68A1", "\u68A1"], /* CJK Ideograph */
+ ["\u68A2", "\u68A2"], /* CJK Ideograph */
+ ["\u68A3", "\u68A3"], /* CJK Ideograph */
+ ["\u68A4", "\u68A4"], /* CJK Ideograph */
+ ["\u68A5", "\u68A5"], /* CJK Ideograph */
+ ["\u68A6", "\u68A6"], /* CJK Ideograph */
+ ["\u68A7", "\u68A7"], /* CJK Ideograph */
+ ["\u68A8", "\u68A8"], /* CJK Ideograph */
+ ["\u68A9", "\u68A9"], /* CJK Ideograph */
+ ["\u68AA", "\u68AA"], /* CJK Ideograph */
+ ["\u68AB", "\u68AB"], /* CJK Ideograph */
+ ["\u68AC", "\u68AC"], /* CJK Ideograph */
+ ["\u68AD", "\u68AD"], /* CJK Ideograph */
+ ["\u68AE", "\u68AE"], /* CJK Ideograph */
+ ["\u68AF", "\u68AF"], /* CJK Ideograph */
+ ["\u68B0", "\u68B0"], /* CJK Ideograph */
+ ["\u68B1", "\u68B1"], /* CJK Ideograph */
+ ["\u68B2", "\u68B2"], /* CJK Ideograph */
+ ["\u68B3", "\u68B3"], /* CJK Ideograph */
+ ["\u68B4", "\u68B4"], /* CJK Ideograph */
+ ["\u68B5", "\u68B5"], /* CJK Ideograph */
+ ["\u68B6", "\u68B6"], /* CJK Ideograph */
+ ["\u68B7", "\u68B7"], /* CJK Ideograph */
+ ["\u68B8", "\u68B8"], /* CJK Ideograph */
+ ["\u68B9", "\u68B9"], /* CJK Ideograph */
+ ["\u68BA", "\u68BA"], /* CJK Ideograph */
+ ["\u68BB", "\u68BB"], /* CJK Ideograph */
+ ["\u68BC", "\u68BC"], /* CJK Ideograph */
+ ["\u68BD", "\u68BD"], /* CJK Ideograph */
+ ["\u68BE", "\u68BE"], /* CJK Ideograph */
+ ["\u68BF", "\u68BF"], /* CJK Ideograph */
+ ["\u68C0", "\u68C0"], /* CJK Ideograph */
+ ["\u68C1", "\u68C1"], /* CJK Ideograph */
+ ["\u68C2", "\u68C2"], /* CJK Ideograph */
+ ["\u68C3", "\u68C3"], /* CJK Ideograph */
+ ["\u68C4", "\u68C4"], /* CJK Ideograph */
+ ["\u68C5", "\u68C5"], /* CJK Ideograph */
+ ["\u68C6", "\u68C6"], /* CJK Ideograph */
+ ["\u68C7", "\u68C7"], /* CJK Ideograph */
+ ["\u68C8", "\u68C8"], /* CJK Ideograph */
+ ["\u68C9", "\u68C9"], /* CJK Ideograph */
+ ["\u68CA", "\u68CA"], /* CJK Ideograph */
+ ["\u68CB", "\u68CB"], /* CJK Ideograph */
+ ["\u68CC", "\u68CC"], /* CJK Ideograph */
+ ["\u68CD", "\u68CD"], /* CJK Ideograph */
+ ["\u68CE", "\u68CE"], /* CJK Ideograph */
+ ["\u68CF", "\u68CF"], /* CJK Ideograph */
+ ["\u68D0", "\u68D0"], /* CJK Ideograph */
+ ["\u68D1", "\u68D1"], /* CJK Ideograph */
+ ["\u68D2", "\u68D2"], /* CJK Ideograph */
+ ["\u68D3", "\u68D3"], /* CJK Ideograph */
+ ["\u68D4", "\u68D4"], /* CJK Ideograph */
+ ["\u68D5", "\u68D5"], /* CJK Ideograph */
+ ["\u68D6", "\u68D6"], /* CJK Ideograph */
+ ["\u68D7", "\u68D7"], /* CJK Ideograph */
+ ["\u68D8", "\u68D8"], /* CJK Ideograph */
+ ["\u68D9", "\u68D9"], /* CJK Ideograph */
+ ["\u68DA", "\u68DA"], /* CJK Ideograph */
+ ["\u68DB", "\u68DB"], /* CJK Ideograph */
+ ["\u68DC", "\u68DC"], /* CJK Ideograph */
+ ["\u68DD", "\u68DD"], /* CJK Ideograph */
+ ["\u68DE", "\u68DE"], /* CJK Ideograph */
+ ["\u68DF", "\u68DF"], /* CJK Ideograph */
+ ["\u68E0", "\u68E0"], /* CJK Ideograph */
+ ["\u68E1", "\u68E1"], /* CJK Ideograph */
+ ["\u68E2", "\u68E2"], /* CJK Ideograph */
+ ["\u68E3", "\u68E3"], /* CJK Ideograph */
+ ["\u68E4", "\u68E4"], /* CJK Ideograph */
+ ["\u68E5", "\u68E5"], /* CJK Ideograph */
+ ["\u68E6", "\u68E6"], /* CJK Ideograph */
+ ["\u68E7", "\u68E7"], /* CJK Ideograph */
+ ["\u68E8", "\u68E8"], /* CJK Ideograph */
+ ["\u68E9", "\u68E9"], /* CJK Ideograph */
+ ["\u68EA", "\u68EA"], /* CJK Ideograph */
+ ["\u68EB", "\u68EB"], /* CJK Ideograph */
+ ["\u68EC", "\u68EC"], /* CJK Ideograph */
+ ["\u68ED", "\u68ED"], /* CJK Ideograph */
+ ["\u68EE", "\u68EE"], /* CJK Ideograph */
+ ["\u68EF", "\u68EF"], /* CJK Ideograph */
+ ["\u68F0", "\u68F0"], /* CJK Ideograph */
+ ["\u68F1", "\u68F1"], /* CJK Ideograph */
+ ["\u68F2", "\u68F2"], /* CJK Ideograph */
+ ["\u68F3", "\u68F3"], /* CJK Ideograph */
+ ["\u68F4", "\u68F4"], /* CJK Ideograph */
+ ["\u68F5", "\u68F5"], /* CJK Ideograph */
+ ["\u68F6", "\u68F6"], /* CJK Ideograph */
+ ["\u68F7", "\u68F7"], /* CJK Ideograph */
+ ["\u68F8", "\u68F8"], /* CJK Ideograph */
+ ["\u68F9", "\u68F9"], /* CJK Ideograph */
+ ["\u68FA", "\u68FA"], /* CJK Ideograph */
+ ["\u68FB", "\u68FB"], /* CJK Ideograph */
+ ["\u68FC", "\u68FC"], /* CJK Ideograph */
+ ["\u68FD", "\u68FD"], /* CJK Ideograph */
+ ["\u68FE", "\u68FE"], /* CJK Ideograph */
+ ["\u68FF", "\u68FF"], /* CJK Ideograph */
+ ["\u6900", "\u6900"], /* CJK Ideograph */
+ ["\u6901", "\u6901"], /* CJK Ideograph */
+ ["\u6902", "\u6902"], /* CJK Ideograph */
+ ["\u6903", "\u6903"], /* CJK Ideograph */
+ ["\u6904", "\u6904"], /* CJK Ideograph */
+ ["\u6905", "\u6905"], /* CJK Ideograph */
+ ["\u6906", "\u6906"], /* CJK Ideograph */
+ ["\u6907", "\u6907"], /* CJK Ideograph */
+ ["\u6908", "\u6908"], /* CJK Ideograph */
+ ["\u6909", "\u6909"], /* CJK Ideograph */
+ ["\u690A", "\u690A"], /* CJK Ideograph */
+ ["\u690B", "\u690B"], /* CJK Ideograph */
+ ["\u690C", "\u690C"], /* CJK Ideograph */
+ ["\u690D", "\u690D"], /* CJK Ideograph */
+ ["\u690E", "\u690E"], /* CJK Ideograph */
+ ["\u690F", "\u690F"], /* CJK Ideograph */
+ ["\u6910", "\u6910"], /* CJK Ideograph */
+ ["\u6911", "\u6911"], /* CJK Ideograph */
+ ["\u6912", "\u6912"], /* CJK Ideograph */
+ ["\u6913", "\u6913"], /* CJK Ideograph */
+ ["\u6914", "\u6914"], /* CJK Ideograph */
+ ["\u6915", "\u6915"], /* CJK Ideograph */
+ ["\u6916", "\u6916"], /* CJK Ideograph */
+ ["\u6917", "\u6917"], /* CJK Ideograph */
+ ["\u6918", "\u6918"], /* CJK Ideograph */
+ ["\u6919", "\u6919"], /* CJK Ideograph */
+ ["\u691A", "\u691A"], /* CJK Ideograph */
+ ["\u691B", "\u691B"], /* CJK Ideograph */
+ ["\u691C", "\u691C"], /* CJK Ideograph */
+ ["\u691D", "\u691D"], /* CJK Ideograph */
+ ["\u691E", "\u691E"], /* CJK Ideograph */
+ ["\u691F", "\u691F"], /* CJK Ideograph */
+ ["\u6920", "\u6920"], /* CJK Ideograph */
+ ["\u6921", "\u6921"], /* CJK Ideograph */
+ ["\u6922", "\u6922"], /* CJK Ideograph */
+ ["\u6923", "\u6923"], /* CJK Ideograph */
+ ["\u6924", "\u6924"], /* CJK Ideograph */
+ ["\u6925", "\u6925"], /* CJK Ideograph */
+ ["\u6926", "\u6926"], /* CJK Ideograph */
+ ["\u6927", "\u6927"], /* CJK Ideograph */
+ ["\u6928", "\u6928"], /* CJK Ideograph */
+ ["\u6929", "\u6929"], /* CJK Ideograph */
+ ["\u692A", "\u692A"], /* CJK Ideograph */
+ ["\u692B", "\u692B"], /* CJK Ideograph */
+ ["\u692C", "\u692C"], /* CJK Ideograph */
+ ["\u692D", "\u692D"], /* CJK Ideograph */
+ ["\u692E", "\u692E"], /* CJK Ideograph */
+ ["\u692F", "\u692F"], /* CJK Ideograph */
+ ["\u6930", "\u6930"], /* CJK Ideograph */
+ ["\u6931", "\u6931"], /* CJK Ideograph */
+ ["\u6932", "\u6932"], /* CJK Ideograph */
+ ["\u6933", "\u6933"], /* CJK Ideograph */
+ ["\u6934", "\u6934"], /* CJK Ideograph */
+ ["\u6935", "\u6935"], /* CJK Ideograph */
+ ["\u6936", "\u6936"], /* CJK Ideograph */
+ ["\u6937", "\u6937"], /* CJK Ideograph */
+ ["\u6938", "\u6938"], /* CJK Ideograph */
+ ["\u6939", "\u6939"], /* CJK Ideograph */
+ ["\u693A", "\u693A"], /* CJK Ideograph */
+ ["\u693B", "\u693B"], /* CJK Ideograph */
+ ["\u693C", "\u693C"], /* CJK Ideograph */
+ ["\u693D", "\u693D"], /* CJK Ideograph */
+ ["\u693E", "\u693E"], /* CJK Ideograph */
+ ["\u693F", "\u693F"], /* CJK Ideograph */
+ ["\u6940", "\u6940"], /* CJK Ideograph */
+ ["\u6941", "\u6941"], /* CJK Ideograph */
+ ["\u6942", "\u6942"], /* CJK Ideograph */
+ ["\u6943", "\u6943"], /* CJK Ideograph */
+ ["\u6944", "\u6944"], /* CJK Ideograph */
+ ["\u6945", "\u6945"], /* CJK Ideograph */
+ ["\u6946", "\u6946"], /* CJK Ideograph */
+ ["\u6947", "\u6947"], /* CJK Ideograph */
+ ["\u6948", "\u6948"], /* CJK Ideograph */
+ ["\u6949", "\u6949"], /* CJK Ideograph */
+ ["\u694A", "\u694A"], /* CJK Ideograph */
+ ["\u694B", "\u694B"], /* CJK Ideograph */
+ ["\u694C", "\u694C"], /* CJK Ideograph */
+ ["\u694D", "\u694D"], /* CJK Ideograph */
+ ["\u694E", "\u694E"], /* CJK Ideograph */
+ ["\u694F", "\u694F"], /* CJK Ideograph */
+ ["\u6950", "\u6950"], /* CJK Ideograph */
+ ["\u6951", "\u6951"], /* CJK Ideograph */
+ ["\u6952", "\u6952"], /* CJK Ideograph */
+ ["\u6953", "\u6953"], /* CJK Ideograph */
+ ["\u6954", "\u6954"], /* CJK Ideograph */
+ ["\u6955", "\u6955"], /* CJK Ideograph */
+ ["\u6956", "\u6956"], /* CJK Ideograph */
+ ["\u6957", "\u6957"], /* CJK Ideograph */
+ ["\u6958", "\u6958"], /* CJK Ideograph */
+ ["\u6959", "\u6959"], /* CJK Ideograph */
+ ["\u695A", "\u695A"], /* CJK Ideograph */
+ ["\u695B", "\u695B"], /* CJK Ideograph */
+ ["\u695C", "\u695C"], /* CJK Ideograph */
+ ["\u695D", "\u695D"], /* CJK Ideograph */
+ ["\u695E", "\u695E"], /* CJK Ideograph */
+ ["\u695F", "\u695F"], /* CJK Ideograph */
+ ["\u6960", "\u6960"], /* CJK Ideograph */
+ ["\u6961", "\u6961"], /* CJK Ideograph */
+ ["\u6962", "\u6962"], /* CJK Ideograph */
+ ["\u6963", "\u6963"], /* CJK Ideograph */
+ ["\u6964", "\u6964"], /* CJK Ideograph */
+ ["\u6965", "\u6965"], /* CJK Ideograph */
+ ["\u6966", "\u6966"], /* CJK Ideograph */
+ ["\u6967", "\u6967"], /* CJK Ideograph */
+ ["\u6968", "\u6968"], /* CJK Ideograph */
+ ["\u6969", "\u6969"], /* CJK Ideograph */
+ ["\u696A", "\u696A"], /* CJK Ideograph */
+ ["\u696B", "\u696B"], /* CJK Ideograph */
+ ["\u696C", "\u696C"], /* CJK Ideograph */
+ ["\u696D", "\u696D"], /* CJK Ideograph */
+ ["\u696E", "\u696E"], /* CJK Ideograph */
+ ["\u696F", "\u696F"], /* CJK Ideograph */
+ ["\u6970", "\u6970"], /* CJK Ideograph */
+ ["\u6971", "\u6971"], /* CJK Ideograph */
+ ["\u6972", "\u6972"], /* CJK Ideograph */
+ ["\u6973", "\u6973"], /* CJK Ideograph */
+ ["\u6974", "\u6974"], /* CJK Ideograph */
+ ["\u6975", "\u6975"], /* CJK Ideograph */
+ ["\u6976", "\u6976"], /* CJK Ideograph */
+ ["\u6977", "\u6977"], /* CJK Ideograph */
+ ["\u6978", "\u6978"], /* CJK Ideograph */
+ ["\u6979", "\u6979"], /* CJK Ideograph */
+ ["\u697A", "\u697A"], /* CJK Ideograph */
+ ["\u697B", "\u697B"], /* CJK Ideograph */
+ ["\u697C", "\u697C"], /* CJK Ideograph */
+ ["\u697D", "\u697D"], /* CJK Ideograph */
+ ["\u697E", "\u697E"], /* CJK Ideograph */
+ ["\u697F", "\u697F"], /* CJK Ideograph */
+ ["\u6980", "\u6980"], /* CJK Ideograph */
+ ["\u6981", "\u6981"], /* CJK Ideograph */
+ ["\u6982", "\u6982"], /* CJK Ideograph */
+ ["\u6983", "\u6983"], /* CJK Ideograph */
+ ["\u6984", "\u6984"], /* CJK Ideograph */
+ ["\u6985", "\u6985"], /* CJK Ideograph */
+ ["\u6986", "\u6986"], /* CJK Ideograph */
+ ["\u6987", "\u6987"], /* CJK Ideograph */
+ ["\u6988", "\u6988"], /* CJK Ideograph */
+ ["\u6989", "\u6989"], /* CJK Ideograph */
+ ["\u698A", "\u698A"], /* CJK Ideograph */
+ ["\u698B", "\u698B"], /* CJK Ideograph */
+ ["\u698C", "\u698C"], /* CJK Ideograph */
+ ["\u698D", "\u698D"], /* CJK Ideograph */
+ ["\u698E", "\u698E"], /* CJK Ideograph */
+ ["\u698F", "\u698F"], /* CJK Ideograph */
+ ["\u6990", "\u6990"], /* CJK Ideograph */
+ ["\u6991", "\u6991"], /* CJK Ideograph */
+ ["\u6992", "\u6992"], /* CJK Ideograph */
+ ["\u6993", "\u6993"], /* CJK Ideograph */
+ ["\u6994", "\u6994"], /* CJK Ideograph */
+ ["\u6995", "\u6995"], /* CJK Ideograph */
+ ["\u6996", "\u6996"], /* CJK Ideograph */
+ ["\u6997", "\u6997"], /* CJK Ideograph */
+ ["\u6998", "\u6998"], /* CJK Ideograph */
+ ["\u6999", "\u6999"], /* CJK Ideograph */
+ ["\u699A", "\u699A"], /* CJK Ideograph */
+ ["\u699B", "\u699B"], /* CJK Ideograph */
+ ["\u699C", "\u699C"], /* CJK Ideograph */
+ ["\u699D", "\u699D"], /* CJK Ideograph */
+ ["\u699E", "\u699E"], /* CJK Ideograph */
+ ["\u699F", "\u699F"], /* CJK Ideograph */
+ ["\u69A0", "\u69A0"], /* CJK Ideograph */
+ ["\u69A1", "\u69A1"], /* CJK Ideograph */
+ ["\u69A2", "\u69A2"], /* CJK Ideograph */
+ ["\u69A3", "\u69A3"], /* CJK Ideograph */
+ ["\u69A4", "\u69A4"], /* CJK Ideograph */
+ ["\u69A5", "\u69A5"], /* CJK Ideograph */
+ ["\u69A6", "\u69A6"], /* CJK Ideograph */
+ ["\u69A7", "\u69A7"], /* CJK Ideograph */
+ ["\u69A8", "\u69A8"], /* CJK Ideograph */
+ ["\u69A9", "\u69A9"], /* CJK Ideograph */
+ ["\u69AA", "\u69AA"], /* CJK Ideograph */
+ ["\u69AB", "\u69AB"], /* CJK Ideograph */
+ ["\u69AC", "\u69AC"], /* CJK Ideograph */
+ ["\u69AD", "\u69AD"], /* CJK Ideograph */
+ ["\u69AE", "\u69AE"], /* CJK Ideograph */
+ ["\u69AF", "\u69AF"], /* CJK Ideograph */
+ ["\u69B0", "\u69B0"], /* CJK Ideograph */
+ ["\u69B1", "\u69B1"], /* CJK Ideograph */
+ ["\u69B2", "\u69B2"], /* CJK Ideograph */
+ ["\u69B3", "\u69B3"], /* CJK Ideograph */
+ ["\u69B4", "\u69B4"], /* CJK Ideograph */
+ ["\u69B5", "\u69B5"], /* CJK Ideograph */
+ ["\u69B6", "\u69B6"], /* CJK Ideograph */
+ ["\u69B7", "\u69B7"], /* CJK Ideograph */
+ ["\u69B8", "\u69B8"], /* CJK Ideograph */
+ ["\u69B9", "\u69B9"], /* CJK Ideograph */
+ ["\u69BA", "\u69BA"], /* CJK Ideograph */
+ ["\u69BB", "\u69BB"], /* CJK Ideograph */
+ ["\u69BC", "\u69BC"], /* CJK Ideograph */
+ ["\u69BD", "\u69BD"], /* CJK Ideograph */
+ ["\u69BE", "\u69BE"], /* CJK Ideograph */
+ ["\u69BF", "\u69BF"], /* CJK Ideograph */
+ ["\u69C0", "\u69C0"], /* CJK Ideograph */
+ ["\u69C1", "\u69C1"], /* CJK Ideograph */
+ ["\u69C2", "\u69C2"], /* CJK Ideograph */
+ ["\u69C3", "\u69C3"], /* CJK Ideograph */
+ ["\u69C4", "\u69C4"], /* CJK Ideograph */
+ ["\u69C5", "\u69C5"], /* CJK Ideograph */
+ ["\u69C6", "\u69C6"], /* CJK Ideograph */
+ ["\u69C7", "\u69C7"], /* CJK Ideograph */
+ ["\u69C8", "\u69C8"], /* CJK Ideograph */
+ ["\u69C9", "\u69C9"], /* CJK Ideograph */
+ ["\u69CA", "\u69CA"], /* CJK Ideograph */
+ ["\u69CB", "\u69CB"], /* CJK Ideograph */
+ ["\u69CC", "\u69CC"], /* CJK Ideograph */
+ ["\u69CD", "\u69CD"], /* CJK Ideograph */
+ ["\u69CE", "\u69CE"], /* CJK Ideograph */
+ ["\u69CF", "\u69CF"], /* CJK Ideograph */
+ ["\u69D0", "\u69D0"], /* CJK Ideograph */
+ ["\u69D1", "\u69D1"], /* CJK Ideograph */
+ ["\u69D2", "\u69D2"], /* CJK Ideograph */
+ ["\u69D3", "\u69D3"], /* CJK Ideograph */
+ ["\u69D4", "\u69D4"], /* CJK Ideograph */
+ ["\u69D5", "\u69D5"], /* CJK Ideograph */
+ ["\u69D6", "\u69D6"], /* CJK Ideograph */
+ ["\u69D7", "\u69D7"], /* CJK Ideograph */
+ ["\u69D8", "\u69D8"], /* CJK Ideograph */
+ ["\u69D9", "\u69D9"], /* CJK Ideograph */
+ ["\u69DA", "\u69DA"], /* CJK Ideograph */
+ ["\u69DB", "\u69DB"], /* CJK Ideograph */
+ ["\u69DC", "\u69DC"], /* CJK Ideograph */
+ ["\u69DD", "\u69DD"], /* CJK Ideograph */
+ ["\u69DE", "\u69DE"], /* CJK Ideograph */
+ ["\u69DF", "\u69DF"], /* CJK Ideograph */
+ ["\u69E0", "\u69E0"], /* CJK Ideograph */
+ ["\u69E1", "\u69E1"], /* CJK Ideograph */
+ ["\u69E2", "\u69E2"], /* CJK Ideograph */
+ ["\u69E3", "\u69E3"], /* CJK Ideograph */
+ ["\u69E4", "\u69E4"], /* CJK Ideograph */
+ ["\u69E5", "\u69E5"], /* CJK Ideograph */
+ ["\u69E6", "\u69E6"], /* CJK Ideograph */
+ ["\u69E7", "\u69E7"], /* CJK Ideograph */
+ ["\u69E8", "\u69E8"], /* CJK Ideograph */
+ ["\u69E9", "\u69E9"], /* CJK Ideograph */
+ ["\u69EA", "\u69EA"], /* CJK Ideograph */
+ ["\u69EB", "\u69EB"], /* CJK Ideograph */
+ ["\u69EC", "\u69EC"], /* CJK Ideograph */
+ ["\u69ED", "\u69ED"], /* CJK Ideograph */
+ ["\u69EE", "\u69EE"], /* CJK Ideograph */
+ ["\u69EF", "\u69EF"], /* CJK Ideograph */
+ ["\u69F0", "\u69F0"], /* CJK Ideograph */
+ ["\u69F1", "\u69F1"], /* CJK Ideograph */
+ ["\u69F2", "\u69F2"], /* CJK Ideograph */
+ ["\u69F3", "\u69F3"], /* CJK Ideograph */
+ ["\u69F4", "\u69F4"], /* CJK Ideograph */
+ ["\u69F5", "\u69F5"], /* CJK Ideograph */
+ ["\u69F6", "\u69F6"], /* CJK Ideograph */
+ ["\u69F7", "\u69F7"], /* CJK Ideograph */
+ ["\u69F8", "\u69F8"], /* CJK Ideograph */
+ ["\u69F9", "\u69F9"], /* CJK Ideograph */
+ ["\u69FA", "\u69FA"], /* CJK Ideograph */
+ ["\u69FB", "\u69FB"], /* CJK Ideograph */
+ ["\u69FC", "\u69FC"], /* CJK Ideograph */
+ ["\u69FD", "\u69FD"], /* CJK Ideograph */
+ ["\u69FE", "\u69FE"], /* CJK Ideograph */
+ ["\u69FF", "\u69FF"], /* CJK Ideograph */
+ ["\u6A00", "\u6A00"], /* CJK Ideograph */
+ ["\u6A01", "\u6A01"], /* CJK Ideograph */
+ ["\u6A02", "\u6A02"], /* CJK Ideograph */
+ ["\u6A03", "\u6A03"], /* CJK Ideograph */
+ ["\u6A04", "\u6A04"], /* CJK Ideograph */
+ ["\u6A05", "\u6A05"], /* CJK Ideograph */
+ ["\u6A06", "\u6A06"], /* CJK Ideograph */
+ ["\u6A07", "\u6A07"], /* CJK Ideograph */
+ ["\u6A08", "\u6A08"], /* CJK Ideograph */
+ ["\u6A09", "\u6A09"], /* CJK Ideograph */
+ ["\u6A0A", "\u6A0A"], /* CJK Ideograph */
+ ["\u6A0B", "\u6A0B"], /* CJK Ideograph */
+ ["\u6A0C", "\u6A0C"], /* CJK Ideograph */
+ ["\u6A0D", "\u6A0D"], /* CJK Ideograph */
+ ["\u6A0E", "\u6A0E"], /* CJK Ideograph */
+ ["\u6A0F", "\u6A0F"], /* CJK Ideograph */
+ ["\u6A10", "\u6A10"], /* CJK Ideograph */
+ ["\u6A11", "\u6A11"], /* CJK Ideograph */
+ ["\u6A12", "\u6A12"], /* CJK Ideograph */
+ ["\u6A13", "\u6A13"], /* CJK Ideograph */
+ ["\u6A14", "\u6A14"], /* CJK Ideograph */
+ ["\u6A15", "\u6A15"], /* CJK Ideograph */
+ ["\u6A16", "\u6A16"], /* CJK Ideograph */
+ ["\u6A17", "\u6A17"], /* CJK Ideograph */
+ ["\u6A18", "\u6A18"], /* CJK Ideograph */
+ ["\u6A19", "\u6A19"], /* CJK Ideograph */
+ ["\u6A1A", "\u6A1A"], /* CJK Ideograph */
+ ["\u6A1B", "\u6A1B"], /* CJK Ideograph */
+ ["\u6A1C", "\u6A1C"], /* CJK Ideograph */
+ ["\u6A1D", "\u6A1D"], /* CJK Ideograph */
+ ["\u6A1E", "\u6A1E"], /* CJK Ideograph */
+ ["\u6A1F", "\u6A1F"], /* CJK Ideograph */
+ ["\u6A20", "\u6A20"], /* CJK Ideograph */
+ ["\u6A21", "\u6A21"], /* CJK Ideograph */
+ ["\u6A22", "\u6A22"], /* CJK Ideograph */
+ ["\u6A23", "\u6A23"], /* CJK Ideograph */
+ ["\u6A24", "\u6A24"], /* CJK Ideograph */
+ ["\u6A25", "\u6A25"], /* CJK Ideograph */
+ ["\u6A26", "\u6A26"], /* CJK Ideograph */
+ ["\u6A27", "\u6A27"], /* CJK Ideograph */
+ ["\u6A28", "\u6A28"], /* CJK Ideograph */
+ ["\u6A29", "\u6A29"], /* CJK Ideograph */
+ ["\u6A2A", "\u6A2A"], /* CJK Ideograph */
+ ["\u6A2B", "\u6A2B"], /* CJK Ideograph */
+ ["\u6A2C", "\u6A2C"], /* CJK Ideograph */
+ ["\u6A2D", "\u6A2D"], /* CJK Ideograph */
+ ["\u6A2E", "\u6A2E"], /* CJK Ideograph */
+ ["\u6A2F", "\u6A2F"], /* CJK Ideograph */
+ ["\u6A30", "\u6A30"], /* CJK Ideograph */
+ ["\u6A31", "\u6A31"], /* CJK Ideograph */
+ ["\u6A32", "\u6A32"], /* CJK Ideograph */
+ ["\u6A33", "\u6A33"], /* CJK Ideograph */
+ ["\u6A34", "\u6A34"], /* CJK Ideograph */
+ ["\u6A35", "\u6A35"], /* CJK Ideograph */
+ ["\u6A36", "\u6A36"], /* CJK Ideograph */
+ ["\u6A37", "\u6A37"], /* CJK Ideograph */
+ ["\u6A38", "\u6A38"], /* CJK Ideograph */
+ ["\u6A39", "\u6A39"], /* CJK Ideograph */
+ ["\u6A3A", "\u6A3A"], /* CJK Ideograph */
+ ["\u6A3B", "\u6A3B"], /* CJK Ideograph */
+ ["\u6A3C", "\u6A3C"], /* CJK Ideograph */
+ ["\u6A3D", "\u6A3D"], /* CJK Ideograph */
+ ["\u6A3E", "\u6A3E"], /* CJK Ideograph */
+ ["\u6A3F", "\u6A3F"], /* CJK Ideograph */
+ ["\u6A40", "\u6A40"], /* CJK Ideograph */
+ ["\u6A41", "\u6A41"], /* CJK Ideograph */
+ ["\u6A42", "\u6A42"], /* CJK Ideograph */
+ ["\u6A43", "\u6A43"], /* CJK Ideograph */
+ ["\u6A44", "\u6A44"], /* CJK Ideograph */
+ ["\u6A45", "\u6A45"], /* CJK Ideograph */
+ ["\u6A46", "\u6A46"], /* CJK Ideograph */
+ ["\u6A47", "\u6A47"], /* CJK Ideograph */
+ ["\u6A48", "\u6A48"], /* CJK Ideograph */
+ ["\u6A49", "\u6A49"], /* CJK Ideograph */
+ ["\u6A4A", "\u6A4A"], /* CJK Ideograph */
+ ["\u6A4B", "\u6A4B"], /* CJK Ideograph */
+ ["\u6A4C", "\u6A4C"], /* CJK Ideograph */
+ ["\u6A4D", "\u6A4D"], /* CJK Ideograph */
+ ["\u6A4E", "\u6A4E"], /* CJK Ideograph */
+ ["\u6A4F", "\u6A4F"], /* CJK Ideograph */
+ ["\u6A50", "\u6A50"], /* CJK Ideograph */
+ ["\u6A51", "\u6A51"], /* CJK Ideograph */
+ ["\u6A52", "\u6A52"], /* CJK Ideograph */
+ ["\u6A53", "\u6A53"], /* CJK Ideograph */
+ ["\u6A54", "\u6A54"], /* CJK Ideograph */
+ ["\u6A55", "\u6A55"], /* CJK Ideograph */
+ ["\u6A56", "\u6A56"], /* CJK Ideograph */
+ ["\u6A57", "\u6A57"], /* CJK Ideograph */
+ ["\u6A58", "\u6A58"], /* CJK Ideograph */
+ ["\u6A59", "\u6A59"], /* CJK Ideograph */
+ ["\u6A5A", "\u6A5A"], /* CJK Ideograph */
+ ["\u6A5B", "\u6A5B"], /* CJK Ideograph */
+ ["\u6A5C", "\u6A5C"], /* CJK Ideograph */
+ ["\u6A5D", "\u6A5D"], /* CJK Ideograph */
+ ["\u6A5E", "\u6A5E"], /* CJK Ideograph */
+ ["\u6A5F", "\u6A5F"], /* CJK Ideograph */
+ ["\u6A60", "\u6A60"], /* CJK Ideograph */
+ ["\u6A61", "\u6A61"], /* CJK Ideograph */
+ ["\u6A62", "\u6A62"], /* CJK Ideograph */
+ ["\u6A63", "\u6A63"], /* CJK Ideograph */
+ ["\u6A64", "\u6A64"], /* CJK Ideograph */
+ ["\u6A65", "\u6A65"], /* CJK Ideograph */
+ ["\u6A66", "\u6A66"], /* CJK Ideograph */
+ ["\u6A67", "\u6A67"], /* CJK Ideograph */
+ ["\u6A68", "\u6A68"], /* CJK Ideograph */
+ ["\u6A69", "\u6A69"], /* CJK Ideograph */
+ ["\u6A6A", "\u6A6A"], /* CJK Ideograph */
+ ["\u6A6B", "\u6A6B"], /* CJK Ideograph */
+ ["\u6A6C", "\u6A6C"], /* CJK Ideograph */
+ ["\u6A6D", "\u6A6D"], /* CJK Ideograph */
+ ["\u6A6E", "\u6A6E"], /* CJK Ideograph */
+ ["\u6A6F", "\u6A6F"], /* CJK Ideograph */
+ ["\u6A70", "\u6A70"], /* CJK Ideograph */
+ ["\u6A71", "\u6A71"], /* CJK Ideograph */
+ ["\u6A72", "\u6A72"], /* CJK Ideograph */
+ ["\u6A73", "\u6A73"], /* CJK Ideograph */
+ ["\u6A74", "\u6A74"], /* CJK Ideograph */
+ ["\u6A75", "\u6A75"], /* CJK Ideograph */
+ ["\u6A76", "\u6A76"], /* CJK Ideograph */
+ ["\u6A77", "\u6A77"], /* CJK Ideograph */
+ ["\u6A78", "\u6A78"], /* CJK Ideograph */
+ ["\u6A79", "\u6A79"], /* CJK Ideograph */
+ ["\u6A7A", "\u6A7A"], /* CJK Ideograph */
+ ["\u6A7B", "\u6A7B"], /* CJK Ideograph */
+ ["\u6A7C", "\u6A7C"], /* CJK Ideograph */
+ ["\u6A7D", "\u6A7D"], /* CJK Ideograph */
+ ["\u6A7E", "\u6A7E"], /* CJK Ideograph */
+ ["\u6A7F", "\u6A7F"], /* CJK Ideograph */
+ ["\u6A80", "\u6A80"], /* CJK Ideograph */
+ ["\u6A81", "\u6A81"], /* CJK Ideograph */
+ ["\u6A82", "\u6A82"], /* CJK Ideograph */
+ ["\u6A83", "\u6A83"], /* CJK Ideograph */
+ ["\u6A84", "\u6A84"], /* CJK Ideograph */
+ ["\u6A85", "\u6A85"], /* CJK Ideograph */
+ ["\u6A86", "\u6A86"], /* CJK Ideograph */
+ ["\u6A87", "\u6A87"], /* CJK Ideograph */
+ ["\u6A88", "\u6A88"], /* CJK Ideograph */
+ ["\u6A89", "\u6A89"], /* CJK Ideograph */
+ ["\u6A8A", "\u6A8A"], /* CJK Ideograph */
+ ["\u6A8B", "\u6A8B"], /* CJK Ideograph */
+ ["\u6A8C", "\u6A8C"], /* CJK Ideograph */
+ ["\u6A8D", "\u6A8D"], /* CJK Ideograph */
+ ["\u6A8E", "\u6A8E"], /* CJK Ideograph */
+ ["\u6A8F", "\u6A8F"], /* CJK Ideograph */
+ ["\u6A90", "\u6A90"], /* CJK Ideograph */
+ ["\u6A91", "\u6A91"], /* CJK Ideograph */
+ ["\u6A92", "\u6A92"], /* CJK Ideograph */
+ ["\u6A93", "\u6A93"], /* CJK Ideograph */
+ ["\u6A94", "\u6A94"], /* CJK Ideograph */
+ ["\u6A95", "\u6A95"], /* CJK Ideograph */
+ ["\u6A96", "\u6A96"], /* CJK Ideograph */
+ ["\u6A97", "\u6A97"], /* CJK Ideograph */
+ ["\u6A98", "\u6A98"], /* CJK Ideograph */
+ ["\u6A99", "\u6A99"], /* CJK Ideograph */
+ ["\u6A9A", "\u6A9A"], /* CJK Ideograph */
+ ["\u6A9B", "\u6A9B"], /* CJK Ideograph */
+ ["\u6A9C", "\u6A9C"], /* CJK Ideograph */
+ ["\u6A9D", "\u6A9D"], /* CJK Ideograph */
+ ["\u6A9E", "\u6A9E"], /* CJK Ideograph */
+ ["\u6A9F", "\u6A9F"], /* CJK Ideograph */
+ ["\u6AA0", "\u6AA0"], /* CJK Ideograph */
+ ["\u6AA1", "\u6AA1"], /* CJK Ideograph */
+ ["\u6AA2", "\u6AA2"], /* CJK Ideograph */
+ ["\u6AA3", "\u6AA3"], /* CJK Ideograph */
+ ["\u6AA4", "\u6AA4"], /* CJK Ideograph */
+ ["\u6AA5", "\u6AA5"], /* CJK Ideograph */
+ ["\u6AA6", "\u6AA6"], /* CJK Ideograph */
+ ["\u6AA7", "\u6AA7"], /* CJK Ideograph */
+ ["\u6AA8", "\u6AA8"], /* CJK Ideograph */
+ ["\u6AA9", "\u6AA9"], /* CJK Ideograph */
+ ["\u6AAA", "\u6AAA"], /* CJK Ideograph */
+ ["\u6AAB", "\u6AAB"], /* CJK Ideograph */
+ ["\u6AAC", "\u6AAC"], /* CJK Ideograph */
+ ["\u6AAD", "\u6AAD"], /* CJK Ideograph */
+ ["\u6AAE", "\u6AAE"], /* CJK Ideograph */
+ ["\u6AAF", "\u6AAF"], /* CJK Ideograph */
+ ["\u6AB0", "\u6AB0"], /* CJK Ideograph */
+ ["\u6AB1", "\u6AB1"], /* CJK Ideograph */
+ ["\u6AB2", "\u6AB2"], /* CJK Ideograph */
+ ["\u6AB3", "\u6AB3"], /* CJK Ideograph */
+ ["\u6AB4", "\u6AB4"], /* CJK Ideograph */
+ ["\u6AB5", "\u6AB5"], /* CJK Ideograph */
+ ["\u6AB6", "\u6AB6"], /* CJK Ideograph */
+ ["\u6AB7", "\u6AB7"], /* CJK Ideograph */
+ ["\u6AB8", "\u6AB8"], /* CJK Ideograph */
+ ["\u6AB9", "\u6AB9"], /* CJK Ideograph */
+ ["\u6ABA", "\u6ABA"], /* CJK Ideograph */
+ ["\u6ABB", "\u6ABB"], /* CJK Ideograph */
+ ["\u6ABC", "\u6ABC"], /* CJK Ideograph */
+ ["\u6ABD", "\u6ABD"], /* CJK Ideograph */
+ ["\u6ABE", "\u6ABE"], /* CJK Ideograph */
+ ["\u6ABF", "\u6ABF"], /* CJK Ideograph */
+ ["\u6AC0", "\u6AC0"], /* CJK Ideograph */
+ ["\u6AC1", "\u6AC1"], /* CJK Ideograph */
+ ["\u6AC2", "\u6AC2"], /* CJK Ideograph */
+ ["\u6AC3", "\u6AC3"], /* CJK Ideograph */
+ ["\u6AC4", "\u6AC4"], /* CJK Ideograph */
+ ["\u6AC5", "\u6AC5"], /* CJK Ideograph */
+ ["\u6AC6", "\u6AC6"], /* CJK Ideograph */
+ ["\u6AC7", "\u6AC7"], /* CJK Ideograph */
+ ["\u6AC8", "\u6AC8"], /* CJK Ideograph */
+ ["\u6AC9", "\u6AC9"], /* CJK Ideograph */
+ ["\u6ACA", "\u6ACA"], /* CJK Ideograph */
+ ["\u6ACB", "\u6ACB"], /* CJK Ideograph */
+ ["\u6ACC", "\u6ACC"], /* CJK Ideograph */
+ ["\u6ACD", "\u6ACD"], /* CJK Ideograph */
+ ["\u6ACE", "\u6ACE"], /* CJK Ideograph */
+ ["\u6ACF", "\u6ACF"], /* CJK Ideograph */
+ ["\u6AD0", "\u6AD0"], /* CJK Ideograph */
+ ["\u6AD1", "\u6AD1"], /* CJK Ideograph */
+ ["\u6AD2", "\u6AD2"], /* CJK Ideograph */
+ ["\u6AD3", "\u6AD3"], /* CJK Ideograph */
+ ["\u6AD4", "\u6AD4"], /* CJK Ideograph */
+ ["\u6AD5", "\u6AD5"], /* CJK Ideograph */
+ ["\u6AD6", "\u6AD6"], /* CJK Ideograph */
+ ["\u6AD7", "\u6AD7"], /* CJK Ideograph */
+ ["\u6AD8", "\u6AD8"], /* CJK Ideograph */
+ ["\u6AD9", "\u6AD9"], /* CJK Ideograph */
+ ["\u6ADA", "\u6ADA"], /* CJK Ideograph */
+ ["\u6ADB", "\u6ADB"], /* CJK Ideograph */
+ ["\u6ADC", "\u6ADC"], /* CJK Ideograph */
+ ["\u6ADD", "\u6ADD"], /* CJK Ideograph */
+ ["\u6ADE", "\u6ADE"], /* CJK Ideograph */
+ ["\u6ADF", "\u6ADF"], /* CJK Ideograph */
+ ["\u6AE0", "\u6AE0"], /* CJK Ideograph */
+ ["\u6AE1", "\u6AE1"], /* CJK Ideograph */
+ ["\u6AE2", "\u6AE2"], /* CJK Ideograph */
+ ["\u6AE3", "\u6AE3"], /* CJK Ideograph */
+ ["\u6AE4", "\u6AE4"], /* CJK Ideograph */
+ ["\u6AE5", "\u6AE5"], /* CJK Ideograph */
+ ["\u6AE6", "\u6AE6"], /* CJK Ideograph */
+ ["\u6AE7", "\u6AE7"], /* CJK Ideograph */
+ ["\u6AE8", "\u6AE8"], /* CJK Ideograph */
+ ["\u6AE9", "\u6AE9"], /* CJK Ideograph */
+ ["\u6AEA", "\u6AEA"], /* CJK Ideograph */
+ ["\u6AEB", "\u6AEB"], /* CJK Ideograph */
+ ["\u6AEC", "\u6AEC"], /* CJK Ideograph */
+ ["\u6AED", "\u6AED"], /* CJK Ideograph */
+ ["\u6AEE", "\u6AEE"], /* CJK Ideograph */
+ ["\u6AEF", "\u6AEF"], /* CJK Ideograph */
+ ["\u6AF0", "\u6AF0"], /* CJK Ideograph */
+ ["\u6AF1", "\u6AF1"], /* CJK Ideograph */
+ ["\u6AF2", "\u6AF2"], /* CJK Ideograph */
+ ["\u6AF3", "\u6AF3"], /* CJK Ideograph */
+ ["\u6AF4", "\u6AF4"], /* CJK Ideograph */
+ ["\u6AF5", "\u6AF5"], /* CJK Ideograph */
+ ["\u6AF6", "\u6AF6"], /* CJK Ideograph */
+ ["\u6AF7", "\u6AF7"], /* CJK Ideograph */
+ ["\u6AF8", "\u6AF8"], /* CJK Ideograph */
+ ["\u6AF9", "\u6AF9"], /* CJK Ideograph */
+ ["\u6AFA", "\u6AFA"], /* CJK Ideograph */
+ ["\u6AFB", "\u6AFB"], /* CJK Ideograph */
+ ["\u6AFC", "\u6AFC"], /* CJK Ideograph */
+ ["\u6AFD", "\u6AFD"], /* CJK Ideograph */
+ ["\u6AFE", "\u6AFE"], /* CJK Ideograph */
+ ["\u6AFF", "\u6AFF"], /* CJK Ideograph */
+ ["\u6B00", "\u6B00"], /* CJK Ideograph */
+ ["\u6B01", "\u6B01"], /* CJK Ideograph */
+ ["\u6B02", "\u6B02"], /* CJK Ideograph */
+ ["\u6B03", "\u6B03"], /* CJK Ideograph */
+ ["\u6B04", "\u6B04"], /* CJK Ideograph */
+ ["\u6B05", "\u6B05"], /* CJK Ideograph */
+ ["\u6B06", "\u6B06"], /* CJK Ideograph */
+ ["\u6B07", "\u6B07"], /* CJK Ideograph */
+ ["\u6B08", "\u6B08"], /* CJK Ideograph */
+ ["\u6B09", "\u6B09"], /* CJK Ideograph */
+ ["\u6B0A", "\u6B0A"], /* CJK Ideograph */
+ ["\u6B0B", "\u6B0B"], /* CJK Ideograph */
+ ["\u6B0C", "\u6B0C"], /* CJK Ideograph */
+ ["\u6B0D", "\u6B0D"], /* CJK Ideograph */
+ ["\u6B0E", "\u6B0E"], /* CJK Ideograph */
+ ["\u6B0F", "\u6B0F"], /* CJK Ideograph */
+ ["\u6B10", "\u6B10"], /* CJK Ideograph */
+ ["\u6B11", "\u6B11"], /* CJK Ideograph */
+ ["\u6B12", "\u6B12"], /* CJK Ideograph */
+ ["\u6B13", "\u6B13"], /* CJK Ideograph */
+ ["\u6B14", "\u6B14"], /* CJK Ideograph */
+ ["\u6B15", "\u6B15"], /* CJK Ideograph */
+ ["\u6B16", "\u6B16"], /* CJK Ideograph */
+ ["\u6B17", "\u6B17"], /* CJK Ideograph */
+ ["\u6B18", "\u6B18"], /* CJK Ideograph */
+ ["\u6B19", "\u6B19"], /* CJK Ideograph */
+ ["\u6B1A", "\u6B1A"], /* CJK Ideograph */
+ ["\u6B1B", "\u6B1B"], /* CJK Ideograph */
+ ["\u6B1C", "\u6B1C"], /* CJK Ideograph */
+ ["\u6B1D", "\u6B1D"], /* CJK Ideograph */
+ ["\u6B1E", "\u6B1E"], /* CJK Ideograph */
+ ["\u6B1F", "\u6B1F"], /* CJK Ideograph */
+ ["\u6B20", "\u6B20"], /* CJK Ideograph */
+ ["\u6B21", "\u6B21"], /* CJK Ideograph */
+ ["\u6B22", "\u6B22"], /* CJK Ideograph */
+ ["\u6B23", "\u6B23"], /* CJK Ideograph */
+ ["\u6B24", "\u6B24"], /* CJK Ideograph */
+ ["\u6B25", "\u6B25"], /* CJK Ideograph */
+ ["\u6B26", "\u6B26"], /* CJK Ideograph */
+ ["\u6B27", "\u6B27"], /* CJK Ideograph */
+ ["\u6B28", "\u6B28"], /* CJK Ideograph */
+ ["\u6B29", "\u6B29"], /* CJK Ideograph */
+ ["\u6B2A", "\u6B2A"], /* CJK Ideograph */
+ ["\u6B2B", "\u6B2B"], /* CJK Ideograph */
+ ["\u6B2C", "\u6B2C"], /* CJK Ideograph */
+ ["\u6B2D", "\u6B2D"], /* CJK Ideograph */
+ ["\u6B2E", "\u6B2E"], /* CJK Ideograph */
+ ["\u6B2F", "\u6B2F"], /* CJK Ideograph */
+ ["\u6B30", "\u6B30"], /* CJK Ideograph */
+ ["\u6B31", "\u6B31"], /* CJK Ideograph */
+ ["\u6B32", "\u6B32"], /* CJK Ideograph */
+ ["\u6B33", "\u6B33"], /* CJK Ideograph */
+ ["\u6B34", "\u6B34"], /* CJK Ideograph */
+ ["\u6B35", "\u6B35"], /* CJK Ideograph */
+ ["\u6B36", "\u6B36"], /* CJK Ideograph */
+ ["\u6B37", "\u6B37"], /* CJK Ideograph */
+ ["\u6B38", "\u6B38"], /* CJK Ideograph */
+ ["\u6B39", "\u6B39"], /* CJK Ideograph */
+ ["\u6B3A", "\u6B3A"], /* CJK Ideograph */
+ ["\u6B3B", "\u6B3B"], /* CJK Ideograph */
+ ["\u6B3C", "\u6B3C"], /* CJK Ideograph */
+ ["\u6B3D", "\u6B3D"], /* CJK Ideograph */
+ ["\u6B3E", "\u6B3E"], /* CJK Ideograph */
+ ["\u6B3F", "\u6B3F"], /* CJK Ideograph */
+ ["\u6B40", "\u6B40"], /* CJK Ideograph */
+ ["\u6B41", "\u6B41"], /* CJK Ideograph */
+ ["\u6B42", "\u6B42"], /* CJK Ideograph */
+ ["\u6B43", "\u6B43"], /* CJK Ideograph */
+ ["\u6B44", "\u6B44"], /* CJK Ideograph */
+ ["\u6B45", "\u6B45"], /* CJK Ideograph */
+ ["\u6B46", "\u6B46"], /* CJK Ideograph */
+ ["\u6B47", "\u6B47"], /* CJK Ideograph */
+ ["\u6B48", "\u6B48"], /* CJK Ideograph */
+ ["\u6B49", "\u6B49"], /* CJK Ideograph */
+ ["\u6B4A", "\u6B4A"], /* CJK Ideograph */
+ ["\u6B4B", "\u6B4B"], /* CJK Ideograph */
+ ["\u6B4C", "\u6B4C"], /* CJK Ideograph */
+ ["\u6B4D", "\u6B4D"], /* CJK Ideograph */
+ ["\u6B4E", "\u6B4E"], /* CJK Ideograph */
+ ["\u6B4F", "\u6B4F"], /* CJK Ideograph */
+ ["\u6B50", "\u6B50"], /* CJK Ideograph */
+ ["\u6B51", "\u6B51"], /* CJK Ideograph */
+ ["\u6B52", "\u6B52"], /* CJK Ideograph */
+ ["\u6B53", "\u6B53"], /* CJK Ideograph */
+ ["\u6B54", "\u6B54"], /* CJK Ideograph */
+ ["\u6B55", "\u6B55"], /* CJK Ideograph */
+ ["\u6B56", "\u6B56"], /* CJK Ideograph */
+ ["\u6B57", "\u6B57"], /* CJK Ideograph */
+ ["\u6B58", "\u6B58"], /* CJK Ideograph */
+ ["\u6B59", "\u6B59"], /* CJK Ideograph */
+ ["\u6B5A", "\u6B5A"], /* CJK Ideograph */
+ ["\u6B5B", "\u6B5B"], /* CJK Ideograph */
+ ["\u6B5C", "\u6B5C"], /* CJK Ideograph */
+ ["\u6B5D", "\u6B5D"], /* CJK Ideograph */
+ ["\u6B5E", "\u6B5E"], /* CJK Ideograph */
+ ["\u6B5F", "\u6B5F"], /* CJK Ideograph */
+ ["\u6B60", "\u6B60"], /* CJK Ideograph */
+ ["\u6B61", "\u6B61"], /* CJK Ideograph */
+ ["\u6B62", "\u6B62"], /* CJK Ideograph */
+ ["\u6B63", "\u6B63"], /* CJK Ideograph */
+ ["\u6B64", "\u6B64"], /* CJK Ideograph */
+ ["\u6B65", "\u6B65"], /* CJK Ideograph */
+ ["\u6B66", "\u6B66"], /* CJK Ideograph */
+ ["\u6B67", "\u6B67"], /* CJK Ideograph */
+ ["\u6B68", "\u6B68"], /* CJK Ideograph */
+ ["\u6B69", "\u6B69"], /* CJK Ideograph */
+ ["\u6B6A", "\u6B6A"], /* CJK Ideograph */
+ ["\u6B6B", "\u6B6B"], /* CJK Ideograph */
+ ["\u6B6C", "\u6B6C"], /* CJK Ideograph */
+ ["\u6B6D", "\u6B6D"], /* CJK Ideograph */
+ ["\u6B6E", "\u6B6E"], /* CJK Ideograph */
+ ["\u6B6F", "\u6B6F"], /* CJK Ideograph */
+ ["\u6B70", "\u6B70"], /* CJK Ideograph */
+ ["\u6B71", "\u6B71"], /* CJK Ideograph */
+ ["\u6B72", "\u6B72"], /* CJK Ideograph */
+ ["\u6B73", "\u6B73"], /* CJK Ideograph */
+ ["\u6B74", "\u6B74"], /* CJK Ideograph */
+ ["\u6B75", "\u6B75"], /* CJK Ideograph */
+ ["\u6B76", "\u6B76"], /* CJK Ideograph */
+ ["\u6B77", "\u6B77"], /* CJK Ideograph */
+ ["\u6B78", "\u6B78"], /* CJK Ideograph */
+ ["\u6B79", "\u6B79"], /* CJK Ideograph */
+ ["\u6B7A", "\u6B7A"], /* CJK Ideograph */
+ ["\u6B7B", "\u6B7B"], /* CJK Ideograph */
+ ["\u6B7C", "\u6B7C"], /* CJK Ideograph */
+ ["\u6B7D", "\u6B7D"], /* CJK Ideograph */
+ ["\u6B7E", "\u6B7E"], /* CJK Ideograph */
+ ["\u6B7F", "\u6B7F"], /* CJK Ideograph */
+ ["\u6B80", "\u6B80"], /* CJK Ideograph */
+ ["\u6B81", "\u6B81"], /* CJK Ideograph */
+ ["\u6B82", "\u6B82"], /* CJK Ideograph */
+ ["\u6B83", "\u6B83"], /* CJK Ideograph */
+ ["\u6B84", "\u6B84"], /* CJK Ideograph */
+ ["\u6B85", "\u6B85"], /* CJK Ideograph */
+ ["\u6B86", "\u6B86"], /* CJK Ideograph */
+ ["\u6B87", "\u6B87"], /* CJK Ideograph */
+ ["\u6B88", "\u6B88"], /* CJK Ideograph */
+ ["\u6B89", "\u6B89"], /* CJK Ideograph */
+ ["\u6B8A", "\u6B8A"], /* CJK Ideograph */
+ ["\u6B8B", "\u6B8B"], /* CJK Ideograph */
+ ["\u6B8C", "\u6B8C"], /* CJK Ideograph */
+ ["\u6B8D", "\u6B8D"], /* CJK Ideograph */
+ ["\u6B8E", "\u6B8E"], /* CJK Ideograph */
+ ["\u6B8F", "\u6B8F"], /* CJK Ideograph */
+ ["\u6B90", "\u6B90"], /* CJK Ideograph */
+ ["\u6B91", "\u6B91"], /* CJK Ideograph */
+ ["\u6B92", "\u6B92"], /* CJK Ideograph */
+ ["\u6B93", "\u6B93"], /* CJK Ideograph */
+ ["\u6B94", "\u6B94"], /* CJK Ideograph */
+ ["\u6B95", "\u6B95"], /* CJK Ideograph */
+ ["\u6B96", "\u6B96"], /* CJK Ideograph */
+ ["\u6B97", "\u6B97"], /* CJK Ideograph */
+ ["\u6B98", "\u6B98"], /* CJK Ideograph */
+ ["\u6B99", "\u6B99"], /* CJK Ideograph */
+ ["\u6B9A", "\u6B9A"], /* CJK Ideograph */
+ ["\u6B9B", "\u6B9B"], /* CJK Ideograph */
+ ["\u6B9C", "\u6B9C"], /* CJK Ideograph */
+ ["\u6B9D", "\u6B9D"], /* CJK Ideograph */
+ ["\u6B9E", "\u6B9E"], /* CJK Ideograph */
+ ["\u6B9F", "\u6B9F"], /* CJK Ideograph */
+ ["\u6BA0", "\u6BA0"], /* CJK Ideograph */
+ ["\u6BA1", "\u6BA1"], /* CJK Ideograph */
+ ["\u6BA2", "\u6BA2"], /* CJK Ideograph */
+ ["\u6BA3", "\u6BA3"], /* CJK Ideograph */
+ ["\u6BA4", "\u6BA4"], /* CJK Ideograph */
+ ["\u6BA5", "\u6BA5"], /* CJK Ideograph */
+ ["\u6BA6", "\u6BA6"], /* CJK Ideograph */
+ ["\u6BA7", "\u6BA7"], /* CJK Ideograph */
+ ["\u6BA8", "\u6BA8"], /* CJK Ideograph */
+ ["\u6BA9", "\u6BA9"], /* CJK Ideograph */
+ ["\u6BAA", "\u6BAA"], /* CJK Ideograph */
+ ["\u6BAB", "\u6BAB"], /* CJK Ideograph */
+ ["\u6BAC", "\u6BAC"], /* CJK Ideograph */
+ ["\u6BAD", "\u6BAD"], /* CJK Ideograph */
+ ["\u6BAE", "\u6BAE"], /* CJK Ideograph */
+ ["\u6BAF", "\u6BAF"], /* CJK Ideograph */
+ ["\u6BB0", "\u6BB0"], /* CJK Ideograph */
+ ["\u6BB1", "\u6BB1"], /* CJK Ideograph */
+ ["\u6BB2", "\u6BB2"], /* CJK Ideograph */
+ ["\u6BB3", "\u6BB3"], /* CJK Ideograph */
+ ["\u6BB4", "\u6BB4"], /* CJK Ideograph */
+ ["\u6BB5", "\u6BB5"], /* CJK Ideograph */
+ ["\u6BB6", "\u6BB6"], /* CJK Ideograph */
+ ["\u6BB7", "\u6BB7"], /* CJK Ideograph */
+ ["\u6BB8", "\u6BB8"], /* CJK Ideograph */
+ ["\u6BB9", "\u6BB9"], /* CJK Ideograph */
+ ["\u6BBA", "\u6BBA"], /* CJK Ideograph */
+ ["\u6BBB", "\u6BBB"], /* CJK Ideograph */
+ ["\u6BBC", "\u6BBC"], /* CJK Ideograph */
+ ["\u6BBD", "\u6BBD"], /* CJK Ideograph */
+ ["\u6BBE", "\u6BBE"], /* CJK Ideograph */
+ ["\u6BBF", "\u6BBF"], /* CJK Ideograph */
+ ["\u6BC0", "\u6BC0"], /* CJK Ideograph */
+ ["\u6BC1", "\u6BC1"], /* CJK Ideograph */
+ ["\u6BC2", "\u6BC2"], /* CJK Ideograph */
+ ["\u6BC3", "\u6BC3"], /* CJK Ideograph */
+ ["\u6BC4", "\u6BC4"], /* CJK Ideograph */
+ ["\u6BC5", "\u6BC5"], /* CJK Ideograph */
+ ["\u6BC6", "\u6BC6"], /* CJK Ideograph */
+ ["\u6BC7", "\u6BC7"], /* CJK Ideograph */
+ ["\u6BC8", "\u6BC8"], /* CJK Ideograph */
+ ["\u6BC9", "\u6BC9"], /* CJK Ideograph */
+ ["\u6BCA", "\u6BCA"], /* CJK Ideograph */
+ ["\u6BCB", "\u6BCB"], /* CJK Ideograph */
+ ["\u6BCC", "\u6BCC"], /* CJK Ideograph */
+ ["\u6BCD", "\u6BCD"], /* CJK Ideograph */
+ ["\u6BCE", "\u6BCE"], /* CJK Ideograph */
+ ["\u6BCF", "\u6BCF"], /* CJK Ideograph */
+ ["\u6BD0", "\u6BD0"], /* CJK Ideograph */
+ ["\u6BD1", "\u6BD1"], /* CJK Ideograph */
+ ["\u6BD2", "\u6BD2"], /* CJK Ideograph */
+ ["\u6BD3", "\u6BD3"], /* CJK Ideograph */
+ ["\u6BD4", "\u6BD4"], /* CJK Ideograph */
+ ["\u6BD5", "\u6BD5"], /* CJK Ideograph */
+ ["\u6BD6", "\u6BD6"], /* CJK Ideograph */
+ ["\u6BD7", "\u6BD7"], /* CJK Ideograph */
+ ["\u6BD8", "\u6BD8"], /* CJK Ideograph */
+ ["\u6BD9", "\u6BD9"], /* CJK Ideograph */
+ ["\u6BDA", "\u6BDA"], /* CJK Ideograph */
+ ["\u6BDB", "\u6BDB"], /* CJK Ideograph */
+ ["\u6BDC", "\u6BDC"], /* CJK Ideograph */
+ ["\u6BDD", "\u6BDD"], /* CJK Ideograph */
+ ["\u6BDE", "\u6BDE"], /* CJK Ideograph */
+ ["\u6BDF", "\u6BDF"], /* CJK Ideograph */
+ ["\u6BE0", "\u6BE0"], /* CJK Ideograph */
+ ["\u6BE1", "\u6BE1"], /* CJK Ideograph */
+ ["\u6BE2", "\u6BE2"], /* CJK Ideograph */
+ ["\u6BE3", "\u6BE3"], /* CJK Ideograph */
+ ["\u6BE4", "\u6BE4"], /* CJK Ideograph */
+ ["\u6BE5", "\u6BE5"], /* CJK Ideograph */
+ ["\u6BE6", "\u6BE6"], /* CJK Ideograph */
+ ["\u6BE7", "\u6BE7"], /* CJK Ideograph */
+ ["\u6BE8", "\u6BE8"], /* CJK Ideograph */
+ ["\u6BE9", "\u6BE9"], /* CJK Ideograph */
+ ["\u6BEA", "\u6BEA"], /* CJK Ideograph */
+ ["\u6BEB", "\u6BEB"], /* CJK Ideograph */
+ ["\u6BEC", "\u6BEC"], /* CJK Ideograph */
+ ["\u6BED", "\u6BED"], /* CJK Ideograph */
+ ["\u6BEE", "\u6BEE"], /* CJK Ideograph */
+ ["\u6BEF", "\u6BEF"], /* CJK Ideograph */
+ ["\u6BF0", "\u6BF0"], /* CJK Ideograph */
+ ["\u6BF1", "\u6BF1"], /* CJK Ideograph */
+ ["\u6BF2", "\u6BF2"], /* CJK Ideograph */
+ ["\u6BF3", "\u6BF3"], /* CJK Ideograph */
+ ["\u6BF4", "\u6BF4"], /* CJK Ideograph */
+ ["\u6BF5", "\u6BF5"], /* CJK Ideograph */
+ ["\u6BF6", "\u6BF6"], /* CJK Ideograph */
+ ["\u6BF7", "\u6BF7"], /* CJK Ideograph */
+ ["\u6BF8", "\u6BF8"], /* CJK Ideograph */
+ ["\u6BF9", "\u6BF9"], /* CJK Ideograph */
+ ["\u6BFA", "\u6BFA"], /* CJK Ideograph */
+ ["\u6BFB", "\u6BFB"], /* CJK Ideograph */
+ ["\u6BFC", "\u6BFC"], /* CJK Ideograph */
+ ["\u6BFD", "\u6BFD"], /* CJK Ideograph */
+ ["\u6BFE", "\u6BFE"], /* CJK Ideograph */
+ ["\u6BFF", "\u6BFF"], /* CJK Ideograph */
+ ["\u6C00", "\u6C00"], /* CJK Ideograph */
+ ["\u6C01", "\u6C01"], /* CJK Ideograph */
+ ["\u6C02", "\u6C02"], /* CJK Ideograph */
+ ["\u6C03", "\u6C03"], /* CJK Ideograph */
+ ["\u6C04", "\u6C04"], /* CJK Ideograph */
+ ["\u6C05", "\u6C05"], /* CJK Ideograph */
+ ["\u6C06", "\u6C06"], /* CJK Ideograph */
+ ["\u6C07", "\u6C07"], /* CJK Ideograph */
+ ["\u6C08", "\u6C08"], /* CJK Ideograph */
+ ["\u6C09", "\u6C09"], /* CJK Ideograph */
+ ["\u6C0A", "\u6C0A"], /* CJK Ideograph */
+ ["\u6C0B", "\u6C0B"], /* CJK Ideograph */
+ ["\u6C0C", "\u6C0C"], /* CJK Ideograph */
+ ["\u6C0D", "\u6C0D"], /* CJK Ideograph */
+ ["\u6C0E", "\u6C0E"], /* CJK Ideograph */
+ ["\u6C0F", "\u6C0F"], /* CJK Ideograph */
+ ["\u6C10", "\u6C10"], /* CJK Ideograph */
+ ["\u6C11", "\u6C11"], /* CJK Ideograph */
+ ["\u6C12", "\u6C12"], /* CJK Ideograph */
+ ["\u6C13", "\u6C13"], /* CJK Ideograph */
+ ["\u6C14", "\u6C14"], /* CJK Ideograph */
+ ["\u6C15", "\u6C15"], /* CJK Ideograph */
+ ["\u6C16", "\u6C16"], /* CJK Ideograph */
+ ["\u6C17", "\u6C17"], /* CJK Ideograph */
+ ["\u6C18", "\u6C18"], /* CJK Ideograph */
+ ["\u6C19", "\u6C19"], /* CJK Ideograph */
+ ["\u6C1A", "\u6C1A"], /* CJK Ideograph */
+ ["\u6C1B", "\u6C1B"], /* CJK Ideograph */
+ ["\u6C1C", "\u6C1C"], /* CJK Ideograph */
+ ["\u6C1D", "\u6C1D"], /* CJK Ideograph */
+ ["\u6C1E", "\u6C1E"], /* CJK Ideograph */
+ ["\u6C1F", "\u6C1F"], /* CJK Ideograph */
+ ["\u6C20", "\u6C20"], /* CJK Ideograph */
+ ["\u6C21", "\u6C21"], /* CJK Ideograph */
+ ["\u6C22", "\u6C22"], /* CJK Ideograph */
+ ["\u6C23", "\u6C23"], /* CJK Ideograph */
+ ["\u6C24", "\u6C24"], /* CJK Ideograph */
+ ["\u6C25", "\u6C25"], /* CJK Ideograph */
+ ["\u6C26", "\u6C26"], /* CJK Ideograph */
+ ["\u6C27", "\u6C27"], /* CJK Ideograph */
+ ["\u6C28", "\u6C28"], /* CJK Ideograph */
+ ["\u6C29", "\u6C29"], /* CJK Ideograph */
+ ["\u6C2A", "\u6C2A"], /* CJK Ideograph */
+ ["\u6C2B", "\u6C2B"], /* CJK Ideograph */
+ ["\u6C2C", "\u6C2C"], /* CJK Ideograph */
+ ["\u6C2D", "\u6C2D"], /* CJK Ideograph */
+ ["\u6C2E", "\u6C2E"], /* CJK Ideograph */
+ ["\u6C2F", "\u6C2F"], /* CJK Ideograph */
+ ["\u6C30", "\u6C30"], /* CJK Ideograph */
+ ["\u6C31", "\u6C31"], /* CJK Ideograph */
+ ["\u6C32", "\u6C32"], /* CJK Ideograph */
+ ["\u6C33", "\u6C33"], /* CJK Ideograph */
+ ["\u6C34", "\u6C34"], /* CJK Ideograph */
+ ["\u6C35", "\u6C35"], /* CJK Ideograph */
+ ["\u6C36", "\u6C36"], /* CJK Ideograph */
+ ["\u6C37", "\u6C37"], /* CJK Ideograph */
+ ["\u6C38", "\u6C38"], /* CJK Ideograph */
+ ["\u6C39", "\u6C39"], /* CJK Ideograph */
+ ["\u6C3A", "\u6C3A"], /* CJK Ideograph */
+ ["\u6C3B", "\u6C3B"], /* CJK Ideograph */
+ ["\u6C3C", "\u6C3C"], /* CJK Ideograph */
+ ["\u6C3D", "\u6C3D"], /* CJK Ideograph */
+ ["\u6C3E", "\u6C3E"], /* CJK Ideograph */
+ ["\u6C3F", "\u6C3F"], /* CJK Ideograph */
+ ["\u6C40", "\u6C40"], /* CJK Ideograph */
+ ["\u6C41", "\u6C41"], /* CJK Ideograph */
+ ["\u6C42", "\u6C42"], /* CJK Ideograph */
+ ["\u6C43", "\u6C43"], /* CJK Ideograph */
+ ["\u6C44", "\u6C44"], /* CJK Ideograph */
+ ["\u6C45", "\u6C45"], /* CJK Ideograph */
+ ["\u6C46", "\u6C46"], /* CJK Ideograph */
+ ["\u6C47", "\u6C47"], /* CJK Ideograph */
+ ["\u6C48", "\u6C48"], /* CJK Ideograph */
+ ["\u6C49", "\u6C49"], /* CJK Ideograph */
+ ["\u6C4A", "\u6C4A"], /* CJK Ideograph */
+ ["\u6C4B", "\u6C4B"], /* CJK Ideograph */
+ ["\u6C4C", "\u6C4C"], /* CJK Ideograph */
+ ["\u6C4D", "\u6C4D"], /* CJK Ideograph */
+ ["\u6C4E", "\u6C4E"], /* CJK Ideograph */
+ ["\u6C4F", "\u6C4F"], /* CJK Ideograph */
+ ["\u6C50", "\u6C50"], /* CJK Ideograph */
+ ["\u6C51", "\u6C51"], /* CJK Ideograph */
+ ["\u6C52", "\u6C52"], /* CJK Ideograph */
+ ["\u6C53", "\u6C53"], /* CJK Ideograph */
+ ["\u6C54", "\u6C54"], /* CJK Ideograph */
+ ["\u6C55", "\u6C55"], /* CJK Ideograph */
+ ["\u6C56", "\u6C56"], /* CJK Ideograph */
+ ["\u6C57", "\u6C57"], /* CJK Ideograph */
+ ["\u6C58", "\u6C58"], /* CJK Ideograph */
+ ["\u6C59", "\u6C59"], /* CJK Ideograph */
+ ["\u6C5A", "\u6C5A"], /* CJK Ideograph */
+ ["\u6C5B", "\u6C5B"], /* CJK Ideograph */
+ ["\u6C5C", "\u6C5C"], /* CJK Ideograph */
+ ["\u6C5D", "\u6C5D"], /* CJK Ideograph */
+ ["\u6C5E", "\u6C5E"], /* CJK Ideograph */
+ ["\u6C5F", "\u6C5F"], /* CJK Ideograph */
+ ["\u6C60", "\u6C60"], /* CJK Ideograph */
+ ["\u6C61", "\u6C61"], /* CJK Ideograph */
+ ["\u6C62", "\u6C62"], /* CJK Ideograph */
+ ["\u6C63", "\u6C63"], /* CJK Ideograph */
+ ["\u6C64", "\u6C64"], /* CJK Ideograph */
+ ["\u6C65", "\u6C65"], /* CJK Ideograph */
+ ["\u6C66", "\u6C66"], /* CJK Ideograph */
+ ["\u6C67", "\u6C67"], /* CJK Ideograph */
+ ["\u6C68", "\u6C68"], /* CJK Ideograph */
+ ["\u6C69", "\u6C69"], /* CJK Ideograph */
+ ["\u6C6A", "\u6C6A"], /* CJK Ideograph */
+ ["\u6C6B", "\u6C6B"], /* CJK Ideograph */
+ ["\u6C6C", "\u6C6C"], /* CJK Ideograph */
+ ["\u6C6D", "\u6C6D"], /* CJK Ideograph */
+ ["\u6C6E", "\u6C6E"], /* CJK Ideograph */
+ ["\u6C6F", "\u6C6F"], /* CJK Ideograph */
+ ["\u6C70", "\u6C70"], /* CJK Ideograph */
+ ["\u6C71", "\u6C71"], /* CJK Ideograph */
+ ["\u6C72", "\u6C72"], /* CJK Ideograph */
+ ["\u6C73", "\u6C73"], /* CJK Ideograph */
+ ["\u6C74", "\u6C74"], /* CJK Ideograph */
+ ["\u6C75", "\u6C75"], /* CJK Ideograph */
+ ["\u6C76", "\u6C76"], /* CJK Ideograph */
+ ["\u6C77", "\u6C77"], /* CJK Ideograph */
+ ["\u6C78", "\u6C78"], /* CJK Ideograph */
+ ["\u6C79", "\u6C79"], /* CJK Ideograph */
+ ["\u6C7A", "\u6C7A"], /* CJK Ideograph */
+ ["\u6C7B", "\u6C7B"], /* CJK Ideograph */
+ ["\u6C7C", "\u6C7C"], /* CJK Ideograph */
+ ["\u6C7D", "\u6C7D"], /* CJK Ideograph */
+ ["\u6C7E", "\u6C7E"], /* CJK Ideograph */
+ ["\u6C7F", "\u6C7F"], /* CJK Ideograph */
+ ["\u6C80", "\u6C80"], /* CJK Ideograph */
+ ["\u6C81", "\u6C81"], /* CJK Ideograph */
+ ["\u6C82", "\u6C82"], /* CJK Ideograph */
+ ["\u6C83", "\u6C83"], /* CJK Ideograph */
+ ["\u6C84", "\u6C84"], /* CJK Ideograph */
+ ["\u6C85", "\u6C85"], /* CJK Ideograph */
+ ["\u6C86", "\u6C86"], /* CJK Ideograph */
+ ["\u6C87", "\u6C87"], /* CJK Ideograph */
+ ["\u6C88", "\u6C88"], /* CJK Ideograph */
+ ["\u6C89", "\u6C89"], /* CJK Ideograph */
+ ["\u6C8A", "\u6C8A"], /* CJK Ideograph */
+ ["\u6C8B", "\u6C8B"], /* CJK Ideograph */
+ ["\u6C8C", "\u6C8C"], /* CJK Ideograph */
+ ["\u6C8D", "\u6C8D"], /* CJK Ideograph */
+ ["\u6C8E", "\u6C8E"], /* CJK Ideograph */
+ ["\u6C8F", "\u6C8F"], /* CJK Ideograph */
+ ["\u6C90", "\u6C90"], /* CJK Ideograph */
+ ["\u6C91", "\u6C91"], /* CJK Ideograph */
+ ["\u6C92", "\u6C92"], /* CJK Ideograph */
+ ["\u6C93", "\u6C93"], /* CJK Ideograph */
+ ["\u6C94", "\u6C94"], /* CJK Ideograph */
+ ["\u6C95", "\u6C95"], /* CJK Ideograph */
+ ["\u6C96", "\u6C96"], /* CJK Ideograph */
+ ["\u6C97", "\u6C97"], /* CJK Ideograph */
+ ["\u6C98", "\u6C98"], /* CJK Ideograph */
+ ["\u6C99", "\u6C99"], /* CJK Ideograph */
+ ["\u6C9A", "\u6C9A"], /* CJK Ideograph */
+ ["\u6C9B", "\u6C9B"], /* CJK Ideograph */
+ ["\u6C9C", "\u6C9C"], /* CJK Ideograph */
+ ["\u6C9D", "\u6C9D"], /* CJK Ideograph */
+ ["\u6C9E", "\u6C9E"], /* CJK Ideograph */
+ ["\u6C9F", "\u6C9F"], /* CJK Ideograph */
+ ["\u6CA0", "\u6CA0"], /* CJK Ideograph */
+ ["\u6CA1", "\u6CA1"], /* CJK Ideograph */
+ ["\u6CA2", "\u6CA2"], /* CJK Ideograph */
+ ["\u6CA3", "\u6CA3"], /* CJK Ideograph */
+ ["\u6CA4", "\u6CA4"], /* CJK Ideograph */
+ ["\u6CA5", "\u6CA5"], /* CJK Ideograph */
+ ["\u6CA6", "\u6CA6"], /* CJK Ideograph */
+ ["\u6CA7", "\u6CA7"], /* CJK Ideograph */
+ ["\u6CA8", "\u6CA8"], /* CJK Ideograph */
+ ["\u6CA9", "\u6CA9"], /* CJK Ideograph */
+ ["\u6CAA", "\u6CAA"], /* CJK Ideograph */
+ ["\u6CAB", "\u6CAB"], /* CJK Ideograph */
+ ["\u6CAC", "\u6CAC"], /* CJK Ideograph */
+ ["\u6CAD", "\u6CAD"], /* CJK Ideograph */
+ ["\u6CAE", "\u6CAE"], /* CJK Ideograph */
+ ["\u6CAF", "\u6CAF"], /* CJK Ideograph */
+ ["\u6CB0", "\u6CB0"], /* CJK Ideograph */
+ ["\u6CB1", "\u6CB1"], /* CJK Ideograph */
+ ["\u6CB2", "\u6CB2"], /* CJK Ideograph */
+ ["\u6CB3", "\u6CB3"], /* CJK Ideograph */
+ ["\u6CB4", "\u6CB4"], /* CJK Ideograph */
+ ["\u6CB5", "\u6CB5"], /* CJK Ideograph */
+ ["\u6CB6", "\u6CB6"], /* CJK Ideograph */
+ ["\u6CB7", "\u6CB7"], /* CJK Ideograph */
+ ["\u6CB8", "\u6CB8"], /* CJK Ideograph */
+ ["\u6CB9", "\u6CB9"], /* CJK Ideograph */
+ ["\u6CBA", "\u6CBA"], /* CJK Ideograph */
+ ["\u6CBB", "\u6CBB"], /* CJK Ideograph */
+ ["\u6CBC", "\u6CBC"], /* CJK Ideograph */
+ ["\u6CBD", "\u6CBD"], /* CJK Ideograph */
+ ["\u6CBE", "\u6CBE"], /* CJK Ideograph */
+ ["\u6CBF", "\u6CBF"], /* CJK Ideograph */
+ ["\u6CC0", "\u6CC0"], /* CJK Ideograph */
+ ["\u6CC1", "\u6CC1"], /* CJK Ideograph */
+ ["\u6CC2", "\u6CC2"], /* CJK Ideograph */
+ ["\u6CC3", "\u6CC3"], /* CJK Ideograph */
+ ["\u6CC4", "\u6CC4"], /* CJK Ideograph */
+ ["\u6CC5", "\u6CC5"], /* CJK Ideograph */
+ ["\u6CC6", "\u6CC6"], /* CJK Ideograph */
+ ["\u6CC7", "\u6CC7"], /* CJK Ideograph */
+ ["\u6CC8", "\u6CC8"], /* CJK Ideograph */
+ ["\u6CC9", "\u6CC9"], /* CJK Ideograph */
+ ["\u6CCA", "\u6CCA"], /* CJK Ideograph */
+ ["\u6CCB", "\u6CCB"], /* CJK Ideograph */
+ ["\u6CCC", "\u6CCC"], /* CJK Ideograph */
+ ["\u6CCD", "\u6CCD"], /* CJK Ideograph */
+ ["\u6CCE", "\u6CCE"], /* CJK Ideograph */
+ ["\u6CCF", "\u6CCF"], /* CJK Ideograph */
+ ["\u6CD0", "\u6CD0"], /* CJK Ideograph */
+ ["\u6CD1", "\u6CD1"], /* CJK Ideograph */
+ ["\u6CD2", "\u6CD2"], /* CJK Ideograph */
+ ["\u6CD3", "\u6CD3"], /* CJK Ideograph */
+ ["\u6CD4", "\u6CD4"], /* CJK Ideograph */
+ ["\u6CD5", "\u6CD5"], /* CJK Ideograph */
+ ["\u6CD6", "\u6CD6"], /* CJK Ideograph */
+ ["\u6CD7", "\u6CD7"], /* CJK Ideograph */
+ ["\u6CD8", "\u6CD8"], /* CJK Ideograph */
+ ["\u6CD9", "\u6CD9"], /* CJK Ideograph */
+ ["\u6CDA", "\u6CDA"], /* CJK Ideograph */
+ ["\u6CDB", "\u6CDB"], /* CJK Ideograph */
+ ["\u6CDC", "\u6CDC"], /* CJK Ideograph */
+ ["\u6CDD", "\u6CDD"], /* CJK Ideograph */
+ ["\u6CDE", "\u6CDE"], /* CJK Ideograph */
+ ["\u6CDF", "\u6CDF"], /* CJK Ideograph */
+ ["\u6CE0", "\u6CE0"], /* CJK Ideograph */
+ ["\u6CE1", "\u6CE1"], /* CJK Ideograph */
+ ["\u6CE2", "\u6CE2"], /* CJK Ideograph */
+ ["\u6CE3", "\u6CE3"], /* CJK Ideograph */
+ ["\u6CE4", "\u6CE4"], /* CJK Ideograph */
+ ["\u6CE5", "\u6CE5"], /* CJK Ideograph */
+ ["\u6CE6", "\u6CE6"], /* CJK Ideograph */
+ ["\u6CE7", "\u6CE7"], /* CJK Ideograph */
+ ["\u6CE8", "\u6CE8"], /* CJK Ideograph */
+ ["\u6CE9", "\u6CE9"], /* CJK Ideograph */
+ ["\u6CEA", "\u6CEA"], /* CJK Ideograph */
+ ["\u6CEB", "\u6CEB"], /* CJK Ideograph */
+ ["\u6CEC", "\u6CEC"], /* CJK Ideograph */
+ ["\u6CED", "\u6CED"], /* CJK Ideograph */
+ ["\u6CEE", "\u6CEE"], /* CJK Ideograph */
+ ["\u6CEF", "\u6CEF"], /* CJK Ideograph */
+ ["\u6CF0", "\u6CF0"], /* CJK Ideograph */
+ ["\u6CF1", "\u6CF1"], /* CJK Ideograph */
+ ["\u6CF2", "\u6CF2"], /* CJK Ideograph */
+ ["\u6CF3", "\u6CF3"], /* CJK Ideograph */
+ ["\u6CF4", "\u6CF4"], /* CJK Ideograph */
+ ["\u6CF5", "\u6CF5"], /* CJK Ideograph */
+ ["\u6CF6", "\u6CF6"], /* CJK Ideograph */
+ ["\u6CF7", "\u6CF7"], /* CJK Ideograph */
+ ["\u6CF8", "\u6CF8"], /* CJK Ideograph */
+ ["\u6CF9", "\u6CF9"], /* CJK Ideograph */
+ ["\u6CFA", "\u6CFA"], /* CJK Ideograph */
+ ["\u6CFB", "\u6CFB"], /* CJK Ideograph */
+ ["\u6CFC", "\u6CFC"], /* CJK Ideograph */
+ ["\u6CFD", "\u6CFD"], /* CJK Ideograph */
+ ["\u6CFE", "\u6CFE"], /* CJK Ideograph */
+ ["\u6CFF", "\u6CFF"], /* CJK Ideograph */
+ ["\u6D00", "\u6D00"], /* CJK Ideograph */
+ ["\u6D01", "\u6D01"], /* CJK Ideograph */
+ ["\u6D02", "\u6D02"], /* CJK Ideograph */
+ ["\u6D03", "\u6D03"], /* CJK Ideograph */
+ ["\u6D04", "\u6D04"], /* CJK Ideograph */
+ ["\u6D05", "\u6D05"], /* CJK Ideograph */
+ ["\u6D06", "\u6D06"], /* CJK Ideograph */
+ ["\u6D07", "\u6D07"], /* CJK Ideograph */
+ ["\u6D08", "\u6D08"], /* CJK Ideograph */
+ ["\u6D09", "\u6D09"], /* CJK Ideograph */
+ ["\u6D0A", "\u6D0A"], /* CJK Ideograph */
+ ["\u6D0B", "\u6D0B"], /* CJK Ideograph */
+ ["\u6D0C", "\u6D0C"], /* CJK Ideograph */
+ ["\u6D0D", "\u6D0D"], /* CJK Ideograph */
+ ["\u6D0E", "\u6D0E"], /* CJK Ideograph */
+ ["\u6D0F", "\u6D0F"], /* CJK Ideograph */
+ ["\u6D10", "\u6D10"], /* CJK Ideograph */
+ ["\u6D11", "\u6D11"], /* CJK Ideograph */
+ ["\u6D12", "\u6D12"], /* CJK Ideograph */
+ ["\u6D13", "\u6D13"], /* CJK Ideograph */
+ ["\u6D14", "\u6D14"], /* CJK Ideograph */
+ ["\u6D15", "\u6D15"], /* CJK Ideograph */
+ ["\u6D16", "\u6D16"], /* CJK Ideograph */
+ ["\u6D17", "\u6D17"], /* CJK Ideograph */
+ ["\u6D18", "\u6D18"], /* CJK Ideograph */
+ ["\u6D19", "\u6D19"], /* CJK Ideograph */
+ ["\u6D1A", "\u6D1A"], /* CJK Ideograph */
+ ["\u6D1B", "\u6D1B"], /* CJK Ideograph */
+ ["\u6D1C", "\u6D1C"], /* CJK Ideograph */
+ ["\u6D1D", "\u6D1D"], /* CJK Ideograph */
+ ["\u6D1E", "\u6D1E"], /* CJK Ideograph */
+ ["\u6D1F", "\u6D1F"], /* CJK Ideograph */
+ ["\u6D20", "\u6D20"], /* CJK Ideograph */
+ ["\u6D21", "\u6D21"], /* CJK Ideograph */
+ ["\u6D22", "\u6D22"], /* CJK Ideograph */
+ ["\u6D23", "\u6D23"], /* CJK Ideograph */
+ ["\u6D24", "\u6D24"], /* CJK Ideograph */
+ ["\u6D25", "\u6D25"], /* CJK Ideograph */
+ ["\u6D26", "\u6D26"], /* CJK Ideograph */
+ ["\u6D27", "\u6D27"], /* CJK Ideograph */
+ ["\u6D28", "\u6D28"], /* CJK Ideograph */
+ ["\u6D29", "\u6D29"], /* CJK Ideograph */
+ ["\u6D2A", "\u6D2A"], /* CJK Ideograph */
+ ["\u6D2B", "\u6D2B"], /* CJK Ideograph */
+ ["\u6D2C", "\u6D2C"], /* CJK Ideograph */
+ ["\u6D2D", "\u6D2D"], /* CJK Ideograph */
+ ["\u6D2E", "\u6D2E"], /* CJK Ideograph */
+ ["\u6D2F", "\u6D2F"], /* CJK Ideograph */
+ ["\u6D30", "\u6D30"], /* CJK Ideograph */
+ ["\u6D31", "\u6D31"], /* CJK Ideograph */
+ ["\u6D32", "\u6D32"], /* CJK Ideograph */
+ ["\u6D33", "\u6D33"], /* CJK Ideograph */
+ ["\u6D34", "\u6D34"], /* CJK Ideograph */
+ ["\u6D35", "\u6D35"], /* CJK Ideograph */
+ ["\u6D36", "\u6D36"], /* CJK Ideograph */
+ ["\u6D37", "\u6D37"], /* CJK Ideograph */
+ ["\u6D38", "\u6D38"], /* CJK Ideograph */
+ ["\u6D39", "\u6D39"], /* CJK Ideograph */
+ ["\u6D3A", "\u6D3A"], /* CJK Ideograph */
+ ["\u6D3B", "\u6D3B"], /* CJK Ideograph */
+ ["\u6D3C", "\u6D3C"], /* CJK Ideograph */
+ ["\u6D3D", "\u6D3D"], /* CJK Ideograph */
+ ["\u6D3E", "\u6D3E"], /* CJK Ideograph */
+ ["\u6D3F", "\u6D3F"], /* CJK Ideograph */
+ ["\u6D40", "\u6D40"], /* CJK Ideograph */
+ ["\u6D41", "\u6D41"], /* CJK Ideograph */
+ ["\u6D42", "\u6D42"], /* CJK Ideograph */
+ ["\u6D43", "\u6D43"], /* CJK Ideograph */
+ ["\u6D44", "\u6D44"], /* CJK Ideograph */
+ ["\u6D45", "\u6D45"], /* CJK Ideograph */
+ ["\u6D46", "\u6D46"], /* CJK Ideograph */
+ ["\u6D47", "\u6D47"], /* CJK Ideograph */
+ ["\u6D48", "\u6D48"], /* CJK Ideograph */
+ ["\u6D49", "\u6D49"], /* CJK Ideograph */
+ ["\u6D4A", "\u6D4A"], /* CJK Ideograph */
+ ["\u6D4B", "\u6D4B"], /* CJK Ideograph */
+ ["\u6D4C", "\u6D4C"], /* CJK Ideograph */
+ ["\u6D4D", "\u6D4D"], /* CJK Ideograph */
+ ["\u6D4E", "\u6D4E"], /* CJK Ideograph */
+ ["\u6D4F", "\u6D4F"], /* CJK Ideograph */
+ ["\u6D50", "\u6D50"], /* CJK Ideograph */
+ ["\u6D51", "\u6D51"], /* CJK Ideograph */
+ ["\u6D52", "\u6D52"], /* CJK Ideograph */
+ ["\u6D53", "\u6D53"], /* CJK Ideograph */
+ ["\u6D54", "\u6D54"], /* CJK Ideograph */
+ ["\u6D55", "\u6D55"], /* CJK Ideograph */
+ ["\u6D56", "\u6D56"], /* CJK Ideograph */
+ ["\u6D57", "\u6D57"], /* CJK Ideograph */
+ ["\u6D58", "\u6D58"], /* CJK Ideograph */
+ ["\u6D59", "\u6D59"], /* CJK Ideograph */
+ ["\u6D5A", "\u6D5A"], /* CJK Ideograph */
+ ["\u6D5B", "\u6D5B"], /* CJK Ideograph */
+ ["\u6D5C", "\u6D5C"], /* CJK Ideograph */
+ ["\u6D5D", "\u6D5D"], /* CJK Ideograph */
+ ["\u6D5E", "\u6D5E"], /* CJK Ideograph */
+ ["\u6D5F", "\u6D5F"], /* CJK Ideograph */
+ ["\u6D60", "\u6D60"], /* CJK Ideograph */
+ ["\u6D61", "\u6D61"], /* CJK Ideograph */
+ ["\u6D62", "\u6D62"], /* CJK Ideograph */
+ ["\u6D63", "\u6D63"], /* CJK Ideograph */
+ ["\u6D64", "\u6D64"], /* CJK Ideograph */
+ ["\u6D65", "\u6D65"], /* CJK Ideograph */
+ ["\u6D66", "\u6D66"], /* CJK Ideograph */
+ ["\u6D67", "\u6D67"], /* CJK Ideograph */
+ ["\u6D68", "\u6D68"], /* CJK Ideograph */
+ ["\u6D69", "\u6D69"], /* CJK Ideograph */
+ ["\u6D6A", "\u6D6A"], /* CJK Ideograph */
+ ["\u6D6B", "\u6D6B"], /* CJK Ideograph */
+ ["\u6D6C", "\u6D6C"], /* CJK Ideograph */
+ ["\u6D6D", "\u6D6D"], /* CJK Ideograph */
+ ["\u6D6E", "\u6D6E"], /* CJK Ideograph */
+ ["\u6D6F", "\u6D6F"], /* CJK Ideograph */
+ ["\u6D70", "\u6D70"], /* CJK Ideograph */
+ ["\u6D71", "\u6D71"], /* CJK Ideograph */
+ ["\u6D72", "\u6D72"], /* CJK Ideograph */
+ ["\u6D73", "\u6D73"], /* CJK Ideograph */
+ ["\u6D74", "\u6D74"], /* CJK Ideograph */
+ ["\u6D75", "\u6D75"], /* CJK Ideograph */
+ ["\u6D76", "\u6D76"], /* CJK Ideograph */
+ ["\u6D77", "\u6D77"], /* CJK Ideograph */
+ ["\u6D78", "\u6D78"], /* CJK Ideograph */
+ ["\u6D79", "\u6D79"], /* CJK Ideograph */
+ ["\u6D7A", "\u6D7A"], /* CJK Ideograph */
+ ["\u6D7B", "\u6D7B"], /* CJK Ideograph */
+ ["\u6D7C", "\u6D7C"], /* CJK Ideograph */
+ ["\u6D7D", "\u6D7D"], /* CJK Ideograph */
+ ["\u6D7E", "\u6D7E"], /* CJK Ideograph */
+ ["\u6D7F", "\u6D7F"], /* CJK Ideograph */
+ ["\u6D80", "\u6D80"], /* CJK Ideograph */
+ ["\u6D81", "\u6D81"], /* CJK Ideograph */
+ ["\u6D82", "\u6D82"], /* CJK Ideograph */
+ ["\u6D83", "\u6D83"], /* CJK Ideograph */
+ ["\u6D84", "\u6D84"], /* CJK Ideograph */
+ ["\u6D85", "\u6D85"], /* CJK Ideograph */
+ ["\u6D86", "\u6D86"], /* CJK Ideograph */
+ ["\u6D87", "\u6D87"], /* CJK Ideograph */
+ ["\u6D88", "\u6D88"], /* CJK Ideograph */
+ ["\u6D89", "\u6D89"], /* CJK Ideograph */
+ ["\u6D8A", "\u6D8A"], /* CJK Ideograph */
+ ["\u6D8B", "\u6D8B"], /* CJK Ideograph */
+ ["\u6D8C", "\u6D8C"], /* CJK Ideograph */
+ ["\u6D8D", "\u6D8D"], /* CJK Ideograph */
+ ["\u6D8E", "\u6D8E"], /* CJK Ideograph */
+ ["\u6D8F", "\u6D8F"], /* CJK Ideograph */
+ ["\u6D90", "\u6D90"], /* CJK Ideograph */
+ ["\u6D91", "\u6D91"], /* CJK Ideograph */
+ ["\u6D92", "\u6D92"], /* CJK Ideograph */
+ ["\u6D93", "\u6D93"], /* CJK Ideograph */
+ ["\u6D94", "\u6D94"], /* CJK Ideograph */
+ ["\u6D95", "\u6D95"], /* CJK Ideograph */
+ ["\u6D96", "\u6D96"], /* CJK Ideograph */
+ ["\u6D97", "\u6D97"], /* CJK Ideograph */
+ ["\u6D98", "\u6D98"], /* CJK Ideograph */
+ ["\u6D99", "\u6D99"], /* CJK Ideograph */
+ ["\u6D9A", "\u6D9A"], /* CJK Ideograph */
+ ["\u6D9B", "\u6D9B"], /* CJK Ideograph */
+ ["\u6D9C", "\u6D9C"], /* CJK Ideograph */
+ ["\u6D9D", "\u6D9D"], /* CJK Ideograph */
+ ["\u6D9E", "\u6D9E"], /* CJK Ideograph */
+ ["\u6D9F", "\u6D9F"], /* CJK Ideograph */
+ ["\u6DA0", "\u6DA0"], /* CJK Ideograph */
+ ["\u6DA1", "\u6DA1"], /* CJK Ideograph */
+ ["\u6DA2", "\u6DA2"], /* CJK Ideograph */
+ ["\u6DA3", "\u6DA3"], /* CJK Ideograph */
+ ["\u6DA4", "\u6DA4"], /* CJK Ideograph */
+ ["\u6DA5", "\u6DA5"], /* CJK Ideograph */
+ ["\u6DA6", "\u6DA6"], /* CJK Ideograph */
+ ["\u6DA7", "\u6DA7"], /* CJK Ideograph */
+ ["\u6DA8", "\u6DA8"], /* CJK Ideograph */
+ ["\u6DA9", "\u6DA9"], /* CJK Ideograph */
+ ["\u6DAA", "\u6DAA"], /* CJK Ideograph */
+ ["\u6DAB", "\u6DAB"], /* CJK Ideograph */
+ ["\u6DAC", "\u6DAC"], /* CJK Ideograph */
+ ["\u6DAD", "\u6DAD"], /* CJK Ideograph */
+ ["\u6DAE", "\u6DAE"], /* CJK Ideograph */
+ ["\u6DAF", "\u6DAF"], /* CJK Ideograph */
+ ["\u6DB0", "\u6DB0"], /* CJK Ideograph */
+ ["\u6DB1", "\u6DB1"], /* CJK Ideograph */
+ ["\u6DB2", "\u6DB2"], /* CJK Ideograph */
+ ["\u6DB3", "\u6DB3"], /* CJK Ideograph */
+ ["\u6DB4", "\u6DB4"], /* CJK Ideograph */
+ ["\u6DB5", "\u6DB5"], /* CJK Ideograph */
+ ["\u6DB6", "\u6DB6"], /* CJK Ideograph */
+ ["\u6DB7", "\u6DB7"], /* CJK Ideograph */
+ ["\u6DB8", "\u6DB8"], /* CJK Ideograph */
+ ["\u6DB9", "\u6DB9"], /* CJK Ideograph */
+ ["\u6DBA", "\u6DBA"], /* CJK Ideograph */
+ ["\u6DBB", "\u6DBB"], /* CJK Ideograph */
+ ["\u6DBC", "\u6DBC"], /* CJK Ideograph */
+ ["\u6DBD", "\u6DBD"], /* CJK Ideograph */
+ ["\u6DBE", "\u6DBE"], /* CJK Ideograph */
+ ["\u6DBF", "\u6DBF"], /* CJK Ideograph */
+ ["\u6DC0", "\u6DC0"], /* CJK Ideograph */
+ ["\u6DC1", "\u6DC1"], /* CJK Ideograph */
+ ["\u6DC2", "\u6DC2"], /* CJK Ideograph */
+ ["\u6DC3", "\u6DC3"], /* CJK Ideograph */
+ ["\u6DC4", "\u6DC4"], /* CJK Ideograph */
+ ["\u6DC5", "\u6DC5"], /* CJK Ideograph */
+ ["\u6DC6", "\u6DC6"], /* CJK Ideograph */
+ ["\u6DC7", "\u6DC7"], /* CJK Ideograph */
+ ["\u6DC8", "\u6DC8"], /* CJK Ideograph */
+ ["\u6DC9", "\u6DC9"], /* CJK Ideograph */
+ ["\u6DCA", "\u6DCA"], /* CJK Ideograph */
+ ["\u6DCB", "\u6DCB"], /* CJK Ideograph */
+ ["\u6DCC", "\u6DCC"], /* CJK Ideograph */
+ ["\u6DCD", "\u6DCD"], /* CJK Ideograph */
+ ["\u6DCE", "\u6DCE"], /* CJK Ideograph */
+ ["\u6DCF", "\u6DCF"], /* CJK Ideograph */
+ ["\u6DD0", "\u6DD0"], /* CJK Ideograph */
+ ["\u6DD1", "\u6DD1"], /* CJK Ideograph */
+ ["\u6DD2", "\u6DD2"], /* CJK Ideograph */
+ ["\u6DD3", "\u6DD3"], /* CJK Ideograph */
+ ["\u6DD4", "\u6DD4"], /* CJK Ideograph */
+ ["\u6DD5", "\u6DD5"], /* CJK Ideograph */
+ ["\u6DD6", "\u6DD6"], /* CJK Ideograph */
+ ["\u6DD7", "\u6DD7"], /* CJK Ideograph */
+ ["\u6DD8", "\u6DD8"], /* CJK Ideograph */
+ ["\u6DD9", "\u6DD9"], /* CJK Ideograph */
+ ["\u6DDA", "\u6DDA"], /* CJK Ideograph */
+ ["\u6DDB", "\u6DDB"], /* CJK Ideograph */
+ ["\u6DDC", "\u6DDC"], /* CJK Ideograph */
+ ["\u6DDD", "\u6DDD"], /* CJK Ideograph */
+ ["\u6DDE", "\u6DDE"], /* CJK Ideograph */
+ ["\u6DDF", "\u6DDF"], /* CJK Ideograph */
+ ["\u6DE0", "\u6DE0"], /* CJK Ideograph */
+ ["\u6DE1", "\u6DE1"], /* CJK Ideograph */
+ ["\u6DE2", "\u6DE2"], /* CJK Ideograph */
+ ["\u6DE3", "\u6DE3"], /* CJK Ideograph */
+ ["\u6DE4", "\u6DE4"], /* CJK Ideograph */
+ ["\u6DE5", "\u6DE5"], /* CJK Ideograph */
+ ["\u6DE6", "\u6DE6"], /* CJK Ideograph */
+ ["\u6DE7", "\u6DE7"], /* CJK Ideograph */
+ ["\u6DE8", "\u6DE8"], /* CJK Ideograph */
+ ["\u6DE9", "\u6DE9"], /* CJK Ideograph */
+ ["\u6DEA", "\u6DEA"], /* CJK Ideograph */
+ ["\u6DEB", "\u6DEB"], /* CJK Ideograph */
+ ["\u6DEC", "\u6DEC"], /* CJK Ideograph */
+ ["\u6DED", "\u6DED"], /* CJK Ideograph */
+ ["\u6DEE", "\u6DEE"], /* CJK Ideograph */
+ ["\u6DEF", "\u6DEF"], /* CJK Ideograph */
+ ["\u6DF0", "\u6DF0"], /* CJK Ideograph */
+ ["\u6DF1", "\u6DF1"], /* CJK Ideograph */
+ ["\u6DF2", "\u6DF2"], /* CJK Ideograph */
+ ["\u6DF3", "\u6DF3"], /* CJK Ideograph */
+ ["\u6DF4", "\u6DF4"], /* CJK Ideograph */
+ ["\u6DF5", "\u6DF5"], /* CJK Ideograph */
+ ["\u6DF6", "\u6DF6"], /* CJK Ideograph */
+ ["\u6DF7", "\u6DF7"], /* CJK Ideograph */
+ ["\u6DF8", "\u6DF8"], /* CJK Ideograph */
+ ["\u6DF9", "\u6DF9"], /* CJK Ideograph */
+ ["\u6DFA", "\u6DFA"], /* CJK Ideograph */
+ ["\u6DFB", "\u6DFB"], /* CJK Ideograph */
+ ["\u6DFC", "\u6DFC"], /* CJK Ideograph */
+ ["\u6DFD", "\u6DFD"], /* CJK Ideograph */
+ ["\u6DFE", "\u6DFE"], /* CJK Ideograph */
+ ["\u6DFF", "\u6DFF"], /* CJK Ideograph */
+ ["\u6E00", "\u6E00"], /* CJK Ideograph */
+ ["\u6E01", "\u6E01"], /* CJK Ideograph */
+ ["\u6E02", "\u6E02"], /* CJK Ideograph */
+ ["\u6E03", "\u6E03"], /* CJK Ideograph */
+ ["\u6E04", "\u6E04"], /* CJK Ideograph */
+ ["\u6E05", "\u6E05"], /* CJK Ideograph */
+ ["\u6E06", "\u6E06"], /* CJK Ideograph */
+ ["\u6E07", "\u6E07"], /* CJK Ideograph */
+ ["\u6E08", "\u6E08"], /* CJK Ideograph */
+ ["\u6E09", "\u6E09"], /* CJK Ideograph */
+ ["\u6E0A", "\u6E0A"], /* CJK Ideograph */
+ ["\u6E0B", "\u6E0B"], /* CJK Ideograph */
+ ["\u6E0C", "\u6E0C"], /* CJK Ideograph */
+ ["\u6E0D", "\u6E0D"], /* CJK Ideograph */
+ ["\u6E0E", "\u6E0E"], /* CJK Ideograph */
+ ["\u6E0F", "\u6E0F"], /* CJK Ideograph */
+ ["\u6E10", "\u6E10"], /* CJK Ideograph */
+ ["\u6E11", "\u6E11"], /* CJK Ideograph */
+ ["\u6E12", "\u6E12"], /* CJK Ideograph */
+ ["\u6E13", "\u6E13"], /* CJK Ideograph */
+ ["\u6E14", "\u6E14"], /* CJK Ideograph */
+ ["\u6E15", "\u6E15"], /* CJK Ideograph */
+ ["\u6E16", "\u6E16"], /* CJK Ideograph */
+ ["\u6E17", "\u6E17"], /* CJK Ideograph */
+ ["\u6E18", "\u6E18"], /* CJK Ideograph */
+ ["\u6E19", "\u6E19"], /* CJK Ideograph */
+ ["\u6E1A", "\u6E1A"], /* CJK Ideograph */
+ ["\u6E1B", "\u6E1B"], /* CJK Ideograph */
+ ["\u6E1C", "\u6E1C"], /* CJK Ideograph */
+ ["\u6E1D", "\u6E1D"], /* CJK Ideograph */
+ ["\u6E1E", "\u6E1E"], /* CJK Ideograph */
+ ["\u6E1F", "\u6E1F"], /* CJK Ideograph */
+ ["\u6E20", "\u6E20"], /* CJK Ideograph */
+ ["\u6E21", "\u6E21"], /* CJK Ideograph */
+ ["\u6E22", "\u6E22"], /* CJK Ideograph */
+ ["\u6E23", "\u6E23"], /* CJK Ideograph */
+ ["\u6E24", "\u6E24"], /* CJK Ideograph */
+ ["\u6E25", "\u6E25"], /* CJK Ideograph */
+ ["\u6E26", "\u6E26"], /* CJK Ideograph */
+ ["\u6E27", "\u6E27"], /* CJK Ideograph */
+ ["\u6E28", "\u6E28"], /* CJK Ideograph */
+ ["\u6E29", "\u6E29"], /* CJK Ideograph */
+ ["\u6E2A", "\u6E2A"], /* CJK Ideograph */
+ ["\u6E2B", "\u6E2B"], /* CJK Ideograph */
+ ["\u6E2C", "\u6E2C"], /* CJK Ideograph */
+ ["\u6E2D", "\u6E2D"], /* CJK Ideograph */
+ ["\u6E2E", "\u6E2E"], /* CJK Ideograph */
+ ["\u6E2F", "\u6E2F"], /* CJK Ideograph */
+ ["\u6E30", "\u6E30"], /* CJK Ideograph */
+ ["\u6E31", "\u6E31"], /* CJK Ideograph */
+ ["\u6E32", "\u6E32"], /* CJK Ideograph */
+ ["\u6E33", "\u6E33"], /* CJK Ideograph */
+ ["\u6E34", "\u6E34"], /* CJK Ideograph */
+ ["\u6E35", "\u6E35"], /* CJK Ideograph */
+ ["\u6E36", "\u6E36"], /* CJK Ideograph */
+ ["\u6E37", "\u6E37"], /* CJK Ideograph */
+ ["\u6E38", "\u6E38"], /* CJK Ideograph */
+ ["\u6E39", "\u6E39"], /* CJK Ideograph */
+ ["\u6E3A", "\u6E3A"], /* CJK Ideograph */
+ ["\u6E3B", "\u6E3B"], /* CJK Ideograph */
+ ["\u6E3C", "\u6E3C"], /* CJK Ideograph */
+ ["\u6E3D", "\u6E3D"], /* CJK Ideograph */
+ ["\u6E3E", "\u6E3E"], /* CJK Ideograph */
+ ["\u6E3F", "\u6E3F"], /* CJK Ideograph */
+ ["\u6E40", "\u6E40"], /* CJK Ideograph */
+ ["\u6E41", "\u6E41"], /* CJK Ideograph */
+ ["\u6E42", "\u6E42"], /* CJK Ideograph */
+ ["\u6E43", "\u6E43"], /* CJK Ideograph */
+ ["\u6E44", "\u6E44"], /* CJK Ideograph */
+ ["\u6E45", "\u6E45"], /* CJK Ideograph */
+ ["\u6E46", "\u6E46"], /* CJK Ideograph */
+ ["\u6E47", "\u6E47"], /* CJK Ideograph */
+ ["\u6E48", "\u6E48"], /* CJK Ideograph */
+ ["\u6E49", "\u6E49"], /* CJK Ideograph */
+ ["\u6E4A", "\u6E4A"], /* CJK Ideograph */
+ ["\u6E4B", "\u6E4B"], /* CJK Ideograph */
+ ["\u6E4C", "\u6E4C"], /* CJK Ideograph */
+ ["\u6E4D", "\u6E4D"], /* CJK Ideograph */
+ ["\u6E4E", "\u6E4E"], /* CJK Ideograph */
+ ["\u6E4F", "\u6E4F"], /* CJK Ideograph */
+ ["\u6E50", "\u6E50"], /* CJK Ideograph */
+ ["\u6E51", "\u6E51"], /* CJK Ideograph */
+ ["\u6E52", "\u6E52"], /* CJK Ideograph */
+ ["\u6E53", "\u6E53"], /* CJK Ideograph */
+ ["\u6E54", "\u6E54"], /* CJK Ideograph */
+ ["\u6E55", "\u6E55"], /* CJK Ideograph */
+ ["\u6E56", "\u6E56"], /* CJK Ideograph */
+ ["\u6E57", "\u6E57"], /* CJK Ideograph */
+ ["\u6E58", "\u6E58"], /* CJK Ideograph */
+ ["\u6E59", "\u6E59"], /* CJK Ideograph */
+ ["\u6E5A", "\u6E5A"], /* CJK Ideograph */
+ ["\u6E5B", "\u6E5B"], /* CJK Ideograph */
+ ["\u6E5C", "\u6E5C"], /* CJK Ideograph */
+ ["\u6E5D", "\u6E5D"], /* CJK Ideograph */
+ ["\u6E5E", "\u6E5E"], /* CJK Ideograph */
+ ["\u6E5F", "\u6E5F"], /* CJK Ideograph */
+ ["\u6E60", "\u6E60"], /* CJK Ideograph */
+ ["\u6E61", "\u6E61"], /* CJK Ideograph */
+ ["\u6E62", "\u6E62"], /* CJK Ideograph */
+ ["\u6E63", "\u6E63"], /* CJK Ideograph */
+ ["\u6E64", "\u6E64"], /* CJK Ideograph */
+ ["\u6E65", "\u6E65"], /* CJK Ideograph */
+ ["\u6E66", "\u6E66"], /* CJK Ideograph */
+ ["\u6E67", "\u6E67"], /* CJK Ideograph */
+ ["\u6E68", "\u6E68"], /* CJK Ideograph */
+ ["\u6E69", "\u6E69"], /* CJK Ideograph */
+ ["\u6E6A", "\u6E6A"], /* CJK Ideograph */
+ ["\u6E6B", "\u6E6B"], /* CJK Ideograph */
+ ["\u6E6C", "\u6E6C"], /* CJK Ideograph */
+ ["\u6E6D", "\u6E6D"], /* CJK Ideograph */
+ ["\u6E6E", "\u6E6E"], /* CJK Ideograph */
+ ["\u6E6F", "\u6E6F"], /* CJK Ideograph */
+ ["\u6E70", "\u6E70"], /* CJK Ideograph */
+ ["\u6E71", "\u6E71"], /* CJK Ideograph */
+ ["\u6E72", "\u6E72"], /* CJK Ideograph */
+ ["\u6E73", "\u6E73"], /* CJK Ideograph */
+ ["\u6E74", "\u6E74"], /* CJK Ideograph */
+ ["\u6E75", "\u6E75"], /* CJK Ideograph */
+ ["\u6E76", "\u6E76"], /* CJK Ideograph */
+ ["\u6E77", "\u6E77"], /* CJK Ideograph */
+ ["\u6E78", "\u6E78"], /* CJK Ideograph */
+ ["\u6E79", "\u6E79"], /* CJK Ideograph */
+ ["\u6E7A", "\u6E7A"], /* CJK Ideograph */
+ ["\u6E7B", "\u6E7B"], /* CJK Ideograph */
+ ["\u6E7C", "\u6E7C"], /* CJK Ideograph */
+ ["\u6E7D", "\u6E7D"], /* CJK Ideograph */
+ ["\u6E7E", "\u6E7E"], /* CJK Ideograph */
+ ["\u6E7F", "\u6E7F"], /* CJK Ideograph */
+ ["\u6E80", "\u6E80"], /* CJK Ideograph */
+ ["\u6E81", "\u6E81"], /* CJK Ideograph */
+ ["\u6E82", "\u6E82"], /* CJK Ideograph */
+ ["\u6E83", "\u6E83"], /* CJK Ideograph */
+ ["\u6E84", "\u6E84"], /* CJK Ideograph */
+ ["\u6E85", "\u6E85"], /* CJK Ideograph */
+ ["\u6E86", "\u6E86"], /* CJK Ideograph */
+ ["\u6E87", "\u6E87"], /* CJK Ideograph */
+ ["\u6E88", "\u6E88"], /* CJK Ideograph */
+ ["\u6E89", "\u6E89"], /* CJK Ideograph */
+ ["\u6E8A", "\u6E8A"], /* CJK Ideograph */
+ ["\u6E8B", "\u6E8B"], /* CJK Ideograph */
+ ["\u6E8C", "\u6E8C"], /* CJK Ideograph */
+ ["\u6E8D", "\u6E8D"], /* CJK Ideograph */
+ ["\u6E8E", "\u6E8E"], /* CJK Ideograph */
+ ["\u6E8F", "\u6E8F"], /* CJK Ideograph */
+ ["\u6E90", "\u6E90"], /* CJK Ideograph */
+ ["\u6E91", "\u6E91"], /* CJK Ideograph */
+ ["\u6E92", "\u6E92"], /* CJK Ideograph */
+ ["\u6E93", "\u6E93"], /* CJK Ideograph */
+ ["\u6E94", "\u6E94"], /* CJK Ideograph */
+ ["\u6E95", "\u6E95"], /* CJK Ideograph */
+ ["\u6E96", "\u6E96"], /* CJK Ideograph */
+ ["\u6E97", "\u6E97"], /* CJK Ideograph */
+ ["\u6E98", "\u6E98"], /* CJK Ideograph */
+ ["\u6E99", "\u6E99"], /* CJK Ideograph */
+ ["\u6E9A", "\u6E9A"], /* CJK Ideograph */
+ ["\u6E9B", "\u6E9B"], /* CJK Ideograph */
+ ["\u6E9C", "\u6E9C"], /* CJK Ideograph */
+ ["\u6E9D", "\u6E9D"], /* CJK Ideograph */
+ ["\u6E9E", "\u6E9E"], /* CJK Ideograph */
+ ["\u6E9F", "\u6E9F"], /* CJK Ideograph */
+ ["\u6EA0", "\u6EA0"], /* CJK Ideograph */
+ ["\u6EA1", "\u6EA1"], /* CJK Ideograph */
+ ["\u6EA2", "\u6EA2"], /* CJK Ideograph */
+ ["\u6EA3", "\u6EA3"], /* CJK Ideograph */
+ ["\u6EA4", "\u6EA4"], /* CJK Ideograph */
+ ["\u6EA5", "\u6EA5"], /* CJK Ideograph */
+ ["\u6EA6", "\u6EA6"], /* CJK Ideograph */
+ ["\u6EA7", "\u6EA7"], /* CJK Ideograph */
+ ["\u6EA8", "\u6EA8"], /* CJK Ideograph */
+ ["\u6EA9", "\u6EA9"], /* CJK Ideograph */
+ ["\u6EAA", "\u6EAA"], /* CJK Ideograph */
+ ["\u6EAB", "\u6EAB"], /* CJK Ideograph */
+ ["\u6EAC", "\u6EAC"], /* CJK Ideograph */
+ ["\u6EAD", "\u6EAD"], /* CJK Ideograph */
+ ["\u6EAE", "\u6EAE"], /* CJK Ideograph */
+ ["\u6EAF", "\u6EAF"], /* CJK Ideograph */
+ ["\u6EB0", "\u6EB0"], /* CJK Ideograph */
+ ["\u6EB1", "\u6EB1"], /* CJK Ideograph */
+ ["\u6EB2", "\u6EB2"], /* CJK Ideograph */
+ ["\u6EB3", "\u6EB3"], /* CJK Ideograph */
+ ["\u6EB4", "\u6EB4"], /* CJK Ideograph */
+ ["\u6EB5", "\u6EB5"], /* CJK Ideograph */
+ ["\u6EB6", "\u6EB6"], /* CJK Ideograph */
+ ["\u6EB7", "\u6EB7"], /* CJK Ideograph */
+ ["\u6EB8", "\u6EB8"], /* CJK Ideograph */
+ ["\u6EB9", "\u6EB9"], /* CJK Ideograph */
+ ["\u6EBA", "\u6EBA"], /* CJK Ideograph */
+ ["\u6EBB", "\u6EBB"], /* CJK Ideograph */
+ ["\u6EBC", "\u6EBC"], /* CJK Ideograph */
+ ["\u6EBD", "\u6EBD"], /* CJK Ideograph */
+ ["\u6EBE", "\u6EBE"], /* CJK Ideograph */
+ ["\u6EBF", "\u6EBF"], /* CJK Ideograph */
+ ["\u6EC0", "\u6EC0"], /* CJK Ideograph */
+ ["\u6EC1", "\u6EC1"], /* CJK Ideograph */
+ ["\u6EC2", "\u6EC2"], /* CJK Ideograph */
+ ["\u6EC3", "\u6EC3"], /* CJK Ideograph */
+ ["\u6EC4", "\u6EC4"], /* CJK Ideograph */
+ ["\u6EC5", "\u6EC5"], /* CJK Ideograph */
+ ["\u6EC6", "\u6EC6"], /* CJK Ideograph */
+ ["\u6EC7", "\u6EC7"], /* CJK Ideograph */
+ ["\u6EC8", "\u6EC8"], /* CJK Ideograph */
+ ["\u6EC9", "\u6EC9"], /* CJK Ideograph */
+ ["\u6ECA", "\u6ECA"], /* CJK Ideograph */
+ ["\u6ECB", "\u6ECB"], /* CJK Ideograph */
+ ["\u6ECC", "\u6ECC"], /* CJK Ideograph */
+ ["\u6ECD", "\u6ECD"], /* CJK Ideograph */
+ ["\u6ECE", "\u6ECE"], /* CJK Ideograph */
+ ["\u6ECF", "\u6ECF"], /* CJK Ideograph */
+ ["\u6ED0", "\u6ED0"], /* CJK Ideograph */
+ ["\u6ED1", "\u6ED1"], /* CJK Ideograph */
+ ["\u6ED2", "\u6ED2"], /* CJK Ideograph */
+ ["\u6ED3", "\u6ED3"], /* CJK Ideograph */
+ ["\u6ED4", "\u6ED4"], /* CJK Ideograph */
+ ["\u6ED5", "\u6ED5"], /* CJK Ideograph */
+ ["\u6ED6", "\u6ED6"], /* CJK Ideograph */
+ ["\u6ED7", "\u6ED7"], /* CJK Ideograph */
+ ["\u6ED8", "\u6ED8"], /* CJK Ideograph */
+ ["\u6ED9", "\u6ED9"], /* CJK Ideograph */
+ ["\u6EDA", "\u6EDA"], /* CJK Ideograph */
+ ["\u6EDB", "\u6EDB"], /* CJK Ideograph */
+ ["\u6EDC", "\u6EDC"], /* CJK Ideograph */
+ ["\u6EDD", "\u6EDD"], /* CJK Ideograph */
+ ["\u6EDE", "\u6EDE"], /* CJK Ideograph */
+ ["\u6EDF", "\u6EDF"], /* CJK Ideograph */
+ ["\u6EE0", "\u6EE0"], /* CJK Ideograph */
+ ["\u6EE1", "\u6EE1"], /* CJK Ideograph */
+ ["\u6EE2", "\u6EE2"], /* CJK Ideograph */
+ ["\u6EE3", "\u6EE3"], /* CJK Ideograph */
+ ["\u6EE4", "\u6EE4"], /* CJK Ideograph */
+ ["\u6EE5", "\u6EE5"], /* CJK Ideograph */
+ ["\u6EE6", "\u6EE6"], /* CJK Ideograph */
+ ["\u6EE7", "\u6EE7"], /* CJK Ideograph */
+ ["\u6EE8", "\u6EE8"], /* CJK Ideograph */
+ ["\u6EE9", "\u6EE9"], /* CJK Ideograph */
+ ["\u6EEA", "\u6EEA"], /* CJK Ideograph */
+ ["\u6EEB", "\u6EEB"], /* CJK Ideograph */
+ ["\u6EEC", "\u6EEC"], /* CJK Ideograph */
+ ["\u6EED", "\u6EED"], /* CJK Ideograph */
+ ["\u6EEE", "\u6EEE"], /* CJK Ideograph */
+ ["\u6EEF", "\u6EEF"], /* CJK Ideograph */
+ ["\u6EF0", "\u6EF0"], /* CJK Ideograph */
+ ["\u6EF1", "\u6EF1"], /* CJK Ideograph */
+ ["\u6EF2", "\u6EF2"], /* CJK Ideograph */
+ ["\u6EF3", "\u6EF3"], /* CJK Ideograph */
+ ["\u6EF4", "\u6EF4"], /* CJK Ideograph */
+ ["\u6EF5", "\u6EF5"], /* CJK Ideograph */
+ ["\u6EF6", "\u6EF6"], /* CJK Ideograph */
+ ["\u6EF7", "\u6EF7"], /* CJK Ideograph */
+ ["\u6EF8", "\u6EF8"], /* CJK Ideograph */
+ ["\u6EF9", "\u6EF9"], /* CJK Ideograph */
+ ["\u6EFA", "\u6EFA"], /* CJK Ideograph */
+ ["\u6EFB", "\u6EFB"], /* CJK Ideograph */
+ ["\u6EFC", "\u6EFC"], /* CJK Ideograph */
+ ["\u6EFD", "\u6EFD"], /* CJK Ideograph */
+ ["\u6EFE", "\u6EFE"], /* CJK Ideograph */
+ ["\u6EFF", "\u6EFF"], /* CJK Ideograph */
+ ["\u6F00", "\u6F00"], /* CJK Ideograph */
+ ["\u6F01", "\u6F01"], /* CJK Ideograph */
+ ["\u6F02", "\u6F02"], /* CJK Ideograph */
+ ["\u6F03", "\u6F03"], /* CJK Ideograph */
+ ["\u6F04", "\u6F04"], /* CJK Ideograph */
+ ["\u6F05", "\u6F05"], /* CJK Ideograph */
+ ["\u6F06", "\u6F06"], /* CJK Ideograph */
+ ["\u6F07", "\u6F07"], /* CJK Ideograph */
+ ["\u6F08", "\u6F08"], /* CJK Ideograph */
+ ["\u6F09", "\u6F09"], /* CJK Ideograph */
+ ["\u6F0A", "\u6F0A"], /* CJK Ideograph */
+ ["\u6F0B", "\u6F0B"], /* CJK Ideograph */
+ ["\u6F0C", "\u6F0C"], /* CJK Ideograph */
+ ["\u6F0D", "\u6F0D"], /* CJK Ideograph */
+ ["\u6F0E", "\u6F0E"], /* CJK Ideograph */
+ ["\u6F0F", "\u6F0F"], /* CJK Ideograph */
+ ["\u6F10", "\u6F10"], /* CJK Ideograph */
+ ["\u6F11", "\u6F11"], /* CJK Ideograph */
+ ["\u6F12", "\u6F12"], /* CJK Ideograph */
+ ["\u6F13", "\u6F13"], /* CJK Ideograph */
+ ["\u6F14", "\u6F14"], /* CJK Ideograph */
+ ["\u6F15", "\u6F15"], /* CJK Ideograph */
+ ["\u6F16", "\u6F16"], /* CJK Ideograph */
+ ["\u6F17", "\u6F17"], /* CJK Ideograph */
+ ["\u6F18", "\u6F18"], /* CJK Ideograph */
+ ["\u6F19", "\u6F19"], /* CJK Ideograph */
+ ["\u6F1A", "\u6F1A"], /* CJK Ideograph */
+ ["\u6F1B", "\u6F1B"], /* CJK Ideograph */
+ ["\u6F1C", "\u6F1C"], /* CJK Ideograph */
+ ["\u6F1D", "\u6F1D"], /* CJK Ideograph */
+ ["\u6F1E", "\u6F1E"], /* CJK Ideograph */
+ ["\u6F1F", "\u6F1F"], /* CJK Ideograph */
+ ["\u6F20", "\u6F20"], /* CJK Ideograph */
+ ["\u6F21", "\u6F21"], /* CJK Ideograph */
+ ["\u6F22", "\u6F22"], /* CJK Ideograph */
+ ["\u6F23", "\u6F23"], /* CJK Ideograph */
+ ["\u6F24", "\u6F24"], /* CJK Ideograph */
+ ["\u6F25", "\u6F25"], /* CJK Ideograph */
+ ["\u6F26", "\u6F26"], /* CJK Ideograph */
+ ["\u6F27", "\u6F27"], /* CJK Ideograph */
+ ["\u6F28", "\u6F28"], /* CJK Ideograph */
+ ["\u6F29", "\u6F29"], /* CJK Ideograph */
+ ["\u6F2A", "\u6F2A"], /* CJK Ideograph */
+ ["\u6F2B", "\u6F2B"], /* CJK Ideograph */
+ ["\u6F2C", "\u6F2C"], /* CJK Ideograph */
+ ["\u6F2D", "\u6F2D"], /* CJK Ideograph */
+ ["\u6F2E", "\u6F2E"], /* CJK Ideograph */
+ ["\u6F2F", "\u6F2F"], /* CJK Ideograph */
+ ["\u6F30", "\u6F30"], /* CJK Ideograph */
+ ["\u6F31", "\u6F31"], /* CJK Ideograph */
+ ["\u6F32", "\u6F32"], /* CJK Ideograph */
+ ["\u6F33", "\u6F33"], /* CJK Ideograph */
+ ["\u6F34", "\u6F34"], /* CJK Ideograph */
+ ["\u6F35", "\u6F35"], /* CJK Ideograph */
+ ["\u6F36", "\u6F36"], /* CJK Ideograph */
+ ["\u6F37", "\u6F37"], /* CJK Ideograph */
+ ["\u6F38", "\u6F38"], /* CJK Ideograph */
+ ["\u6F39", "\u6F39"], /* CJK Ideograph */
+ ["\u6F3A", "\u6F3A"], /* CJK Ideograph */
+ ["\u6F3B", "\u6F3B"], /* CJK Ideograph */
+ ["\u6F3C", "\u6F3C"], /* CJK Ideograph */
+ ["\u6F3D", "\u6F3D"], /* CJK Ideograph */
+ ["\u6F3E", "\u6F3E"], /* CJK Ideograph */
+ ["\u6F3F", "\u6F3F"], /* CJK Ideograph */
+ ["\u6F40", "\u6F40"], /* CJK Ideograph */
+ ["\u6F41", "\u6F41"], /* CJK Ideograph */
+ ["\u6F42", "\u6F42"], /* CJK Ideograph */
+ ["\u6F43", "\u6F43"], /* CJK Ideograph */
+ ["\u6F44", "\u6F44"], /* CJK Ideograph */
+ ["\u6F45", "\u6F45"], /* CJK Ideograph */
+ ["\u6F46", "\u6F46"], /* CJK Ideograph */
+ ["\u6F47", "\u6F47"], /* CJK Ideograph */
+ ["\u6F48", "\u6F48"], /* CJK Ideograph */
+ ["\u6F49", "\u6F49"], /* CJK Ideograph */
+ ["\u6F4A", "\u6F4A"], /* CJK Ideograph */
+ ["\u6F4B", "\u6F4B"], /* CJK Ideograph */
+ ["\u6F4C", "\u6F4C"], /* CJK Ideograph */
+ ["\u6F4D", "\u6F4D"], /* CJK Ideograph */
+ ["\u6F4E", "\u6F4E"], /* CJK Ideograph */
+ ["\u6F4F", "\u6F4F"], /* CJK Ideograph */
+ ["\u6F50", "\u6F50"], /* CJK Ideograph */
+ ["\u6F51", "\u6F51"], /* CJK Ideograph */
+ ["\u6F52", "\u6F52"], /* CJK Ideograph */
+ ["\u6F53", "\u6F53"], /* CJK Ideograph */
+ ["\u6F54", "\u6F54"], /* CJK Ideograph */
+ ["\u6F55", "\u6F55"], /* CJK Ideograph */
+ ["\u6F56", "\u6F56"], /* CJK Ideograph */
+ ["\u6F57", "\u6F57"], /* CJK Ideograph */
+ ["\u6F58", "\u6F58"], /* CJK Ideograph */
+ ["\u6F59", "\u6F59"], /* CJK Ideograph */
+ ["\u6F5A", "\u6F5A"], /* CJK Ideograph */
+ ["\u6F5B", "\u6F5B"], /* CJK Ideograph */
+ ["\u6F5C", "\u6F5C"], /* CJK Ideograph */
+ ["\u6F5D", "\u6F5D"], /* CJK Ideograph */
+ ["\u6F5E", "\u6F5E"], /* CJK Ideograph */
+ ["\u6F5F", "\u6F5F"], /* CJK Ideograph */
+ ["\u6F60", "\u6F60"], /* CJK Ideograph */
+ ["\u6F61", "\u6F61"], /* CJK Ideograph */
+ ["\u6F62", "\u6F62"], /* CJK Ideograph */
+ ["\u6F63", "\u6F63"], /* CJK Ideograph */
+ ["\u6F64", "\u6F64"], /* CJK Ideograph */
+ ["\u6F65", "\u6F65"], /* CJK Ideograph */
+ ["\u6F66", "\u6F66"], /* CJK Ideograph */
+ ["\u6F67", "\u6F67"], /* CJK Ideograph */
+ ["\u6F68", "\u6F68"], /* CJK Ideograph */
+ ["\u6F69", "\u6F69"], /* CJK Ideograph */
+ ["\u6F6A", "\u6F6A"], /* CJK Ideograph */
+ ["\u6F6B", "\u6F6B"], /* CJK Ideograph */
+ ["\u6F6C", "\u6F6C"], /* CJK Ideograph */
+ ["\u6F6D", "\u6F6D"], /* CJK Ideograph */
+ ["\u6F6E", "\u6F6E"], /* CJK Ideograph */
+ ["\u6F6F", "\u6F6F"], /* CJK Ideograph */
+ ["\u6F70", "\u6F70"], /* CJK Ideograph */
+ ["\u6F71", "\u6F71"], /* CJK Ideograph */
+ ["\u6F72", "\u6F72"], /* CJK Ideograph */
+ ["\u6F73", "\u6F73"], /* CJK Ideograph */
+ ["\u6F74", "\u6F74"], /* CJK Ideograph */
+ ["\u6F75", "\u6F75"], /* CJK Ideograph */
+ ["\u6F76", "\u6F76"], /* CJK Ideograph */
+ ["\u6F77", "\u6F77"], /* CJK Ideograph */
+ ["\u6F78", "\u6F78"], /* CJK Ideograph */
+ ["\u6F79", "\u6F79"], /* CJK Ideograph */
+ ["\u6F7A", "\u6F7A"], /* CJK Ideograph */
+ ["\u6F7B", "\u6F7B"], /* CJK Ideograph */
+ ["\u6F7C", "\u6F7C"], /* CJK Ideograph */
+ ["\u6F7D", "\u6F7D"], /* CJK Ideograph */
+ ["\u6F7E", "\u6F7E"], /* CJK Ideograph */
+ ["\u6F7F", "\u6F7F"], /* CJK Ideograph */
+ ["\u6F80", "\u6F80"], /* CJK Ideograph */
+ ["\u6F81", "\u6F81"], /* CJK Ideograph */
+ ["\u6F82", "\u6F82"], /* CJK Ideograph */
+ ["\u6F83", "\u6F83"], /* CJK Ideograph */
+ ["\u6F84", "\u6F84"], /* CJK Ideograph */
+ ["\u6F85", "\u6F85"], /* CJK Ideograph */
+ ["\u6F86", "\u6F86"], /* CJK Ideograph */
+ ["\u6F87", "\u6F87"], /* CJK Ideograph */
+ ["\u6F88", "\u6F88"], /* CJK Ideograph */
+ ["\u6F89", "\u6F89"], /* CJK Ideograph */
+ ["\u6F8A", "\u6F8A"], /* CJK Ideograph */
+ ["\u6F8B", "\u6F8B"], /* CJK Ideograph */
+ ["\u6F8C", "\u6F8C"], /* CJK Ideograph */
+ ["\u6F8D", "\u6F8D"], /* CJK Ideograph */
+ ["\u6F8E", "\u6F8E"], /* CJK Ideograph */
+ ["\u6F8F", "\u6F8F"], /* CJK Ideograph */
+ ["\u6F90", "\u6F90"], /* CJK Ideograph */
+ ["\u6F91", "\u6F91"], /* CJK Ideograph */
+ ["\u6F92", "\u6F92"], /* CJK Ideograph */
+ ["\u6F93", "\u6F93"], /* CJK Ideograph */
+ ["\u6F94", "\u6F94"], /* CJK Ideograph */
+ ["\u6F95", "\u6F95"], /* CJK Ideograph */
+ ["\u6F96", "\u6F96"], /* CJK Ideograph */
+ ["\u6F97", "\u6F97"], /* CJK Ideograph */
+ ["\u6F98", "\u6F98"], /* CJK Ideograph */
+ ["\u6F99", "\u6F99"], /* CJK Ideograph */
+ ["\u6F9A", "\u6F9A"], /* CJK Ideograph */
+ ["\u6F9B", "\u6F9B"], /* CJK Ideograph */
+ ["\u6F9C", "\u6F9C"], /* CJK Ideograph */
+ ["\u6F9D", "\u6F9D"], /* CJK Ideograph */
+ ["\u6F9E", "\u6F9E"], /* CJK Ideograph */
+ ["\u6F9F", "\u6F9F"], /* CJK Ideograph */
+ ["\u6FA0", "\u6FA0"], /* CJK Ideograph */
+ ["\u6FA1", "\u6FA1"], /* CJK Ideograph */
+ ["\u6FA2", "\u6FA2"], /* CJK Ideograph */
+ ["\u6FA3", "\u6FA3"], /* CJK Ideograph */
+ ["\u6FA4", "\u6FA4"], /* CJK Ideograph */
+ ["\u6FA5", "\u6FA5"], /* CJK Ideograph */
+ ["\u6FA6", "\u6FA6"], /* CJK Ideograph */
+ ["\u6FA7", "\u6FA7"], /* CJK Ideograph */
+ ["\u6FA8", "\u6FA8"], /* CJK Ideograph */
+ ["\u6FA9", "\u6FA9"], /* CJK Ideograph */
+ ["\u6FAA", "\u6FAA"], /* CJK Ideograph */
+ ["\u6FAB", "\u6FAB"], /* CJK Ideograph */
+ ["\u6FAC", "\u6FAC"], /* CJK Ideograph */
+ ["\u6FAD", "\u6FAD"], /* CJK Ideograph */
+ ["\u6FAE", "\u6FAE"], /* CJK Ideograph */
+ ["\u6FAF", "\u6FAF"], /* CJK Ideograph */
+ ["\u6FB0", "\u6FB0"], /* CJK Ideograph */
+ ["\u6FB1", "\u6FB1"], /* CJK Ideograph */
+ ["\u6FB2", "\u6FB2"], /* CJK Ideograph */
+ ["\u6FB3", "\u6FB3"], /* CJK Ideograph */
+ ["\u6FB4", "\u6FB4"], /* CJK Ideograph */
+ ["\u6FB5", "\u6FB5"], /* CJK Ideograph */
+ ["\u6FB6", "\u6FB6"], /* CJK Ideograph */
+ ["\u6FB7", "\u6FB7"], /* CJK Ideograph */
+ ["\u6FB8", "\u6FB8"], /* CJK Ideograph */
+ ["\u6FB9", "\u6FB9"], /* CJK Ideograph */
+ ["\u6FBA", "\u6FBA"], /* CJK Ideograph */
+ ["\u6FBB", "\u6FBB"], /* CJK Ideograph */
+ ["\u6FBC", "\u6FBC"], /* CJK Ideograph */
+ ["\u6FBD", "\u6FBD"], /* CJK Ideograph */
+ ["\u6FBE", "\u6FBE"], /* CJK Ideograph */
+ ["\u6FBF", "\u6FBF"], /* CJK Ideograph */
+ ["\u6FC0", "\u6FC0"], /* CJK Ideograph */
+ ["\u6FC1", "\u6FC1"], /* CJK Ideograph */
+ ["\u6FC2", "\u6FC2"], /* CJK Ideograph */
+ ["\u6FC3", "\u6FC3"], /* CJK Ideograph */
+ ["\u6FC4", "\u6FC4"], /* CJK Ideograph */
+ ["\u6FC5", "\u6FC5"], /* CJK Ideograph */
+ ["\u6FC6", "\u6FC6"], /* CJK Ideograph */
+ ["\u6FC7", "\u6FC7"], /* CJK Ideograph */
+ ["\u6FC8", "\u6FC8"], /* CJK Ideograph */
+ ["\u6FC9", "\u6FC9"], /* CJK Ideograph */
+ ["\u6FCA", "\u6FCA"], /* CJK Ideograph */
+ ["\u6FCB", "\u6FCB"], /* CJK Ideograph */
+ ["\u6FCC", "\u6FCC"], /* CJK Ideograph */
+ ["\u6FCD", "\u6FCD"], /* CJK Ideograph */
+ ["\u6FCE", "\u6FCE"], /* CJK Ideograph */
+ ["\u6FCF", "\u6FCF"], /* CJK Ideograph */
+ ["\u6FD0", "\u6FD0"], /* CJK Ideograph */
+ ["\u6FD1", "\u6FD1"], /* CJK Ideograph */
+ ["\u6FD2", "\u6FD2"], /* CJK Ideograph */
+ ["\u6FD3", "\u6FD3"], /* CJK Ideograph */
+ ["\u6FD4", "\u6FD4"], /* CJK Ideograph */
+ ["\u6FD5", "\u6FD5"], /* CJK Ideograph */
+ ["\u6FD6", "\u6FD6"], /* CJK Ideograph */
+ ["\u6FD7", "\u6FD7"], /* CJK Ideograph */
+ ["\u6FD8", "\u6FD8"], /* CJK Ideograph */
+ ["\u6FD9", "\u6FD9"], /* CJK Ideograph */
+ ["\u6FDA", "\u6FDA"], /* CJK Ideograph */
+ ["\u6FDB", "\u6FDB"], /* CJK Ideograph */
+ ["\u6FDC", "\u6FDC"], /* CJK Ideograph */
+ ["\u6FDD", "\u6FDD"], /* CJK Ideograph */
+ ["\u6FDE", "\u6FDE"], /* CJK Ideograph */
+ ["\u6FDF", "\u6FDF"], /* CJK Ideograph */
+ ["\u6FE0", "\u6FE0"], /* CJK Ideograph */
+ ["\u6FE1", "\u6FE1"], /* CJK Ideograph */
+ ["\u6FE2", "\u6FE2"], /* CJK Ideograph */
+ ["\u6FE3", "\u6FE3"], /* CJK Ideograph */
+ ["\u6FE4", "\u6FE4"], /* CJK Ideograph */
+ ["\u6FE5", "\u6FE5"], /* CJK Ideograph */
+ ["\u6FE6", "\u6FE6"], /* CJK Ideograph */
+ ["\u6FE7", "\u6FE7"], /* CJK Ideograph */
+ ["\u6FE8", "\u6FE8"], /* CJK Ideograph */
+ ["\u6FE9", "\u6FE9"], /* CJK Ideograph */
+ ["\u6FEA", "\u6FEA"], /* CJK Ideograph */
+ ["\u6FEB", "\u6FEB"], /* CJK Ideograph */
+ ["\u6FEC", "\u6FEC"], /* CJK Ideograph */
+ ["\u6FED", "\u6FED"], /* CJK Ideograph */
+ ["\u6FEE", "\u6FEE"], /* CJK Ideograph */
+ ["\u6FEF", "\u6FEF"], /* CJK Ideograph */
+ ["\u6FF0", "\u6FF0"], /* CJK Ideograph */
+ ["\u6FF1", "\u6FF1"], /* CJK Ideograph */
+ ["\u6FF2", "\u6FF2"], /* CJK Ideograph */
+ ["\u6FF3", "\u6FF3"], /* CJK Ideograph */
+ ["\u6FF4", "\u6FF4"], /* CJK Ideograph */
+ ["\u6FF5", "\u6FF5"], /* CJK Ideograph */
+ ["\u6FF6", "\u6FF6"], /* CJK Ideograph */
+ ["\u6FF7", "\u6FF7"], /* CJK Ideograph */
+ ["\u6FF8", "\u6FF8"], /* CJK Ideograph */
+ ["\u6FF9", "\u6FF9"], /* CJK Ideograph */
+ ["\u6FFA", "\u6FFA"], /* CJK Ideograph */
+ ["\u6FFB", "\u6FFB"], /* CJK Ideograph */
+ ["\u6FFC", "\u6FFC"], /* CJK Ideograph */
+ ["\u6FFD", "\u6FFD"], /* CJK Ideograph */
+ ["\u6FFE", "\u6FFE"], /* CJK Ideograph */
+ ["\u6FFF", "\u6FFF"], /* CJK Ideograph */
+ ["\u7000", "\u7000"], /* CJK Ideograph */
+ ["\u7001", "\u7001"], /* CJK Ideograph */
+ ["\u7002", "\u7002"], /* CJK Ideograph */
+ ["\u7003", "\u7003"], /* CJK Ideograph */
+ ["\u7004", "\u7004"], /* CJK Ideograph */
+ ["\u7005", "\u7005"], /* CJK Ideograph */
+ ["\u7006", "\u7006"], /* CJK Ideograph */
+ ["\u7007", "\u7007"], /* CJK Ideograph */
+ ["\u7008", "\u7008"], /* CJK Ideograph */
+ ["\u7009", "\u7009"], /* CJK Ideograph */
+ ["\u700A", "\u700A"], /* CJK Ideograph */
+ ["\u700B", "\u700B"], /* CJK Ideograph */
+ ["\u700C", "\u700C"], /* CJK Ideograph */
+ ["\u700D", "\u700D"], /* CJK Ideograph */
+ ["\u700E", "\u700E"], /* CJK Ideograph */
+ ["\u700F", "\u700F"], /* CJK Ideograph */
+ ["\u7010", "\u7010"], /* CJK Ideograph */
+ ["\u7011", "\u7011"], /* CJK Ideograph */
+ ["\u7012", "\u7012"], /* CJK Ideograph */
+ ["\u7013", "\u7013"], /* CJK Ideograph */
+ ["\u7014", "\u7014"], /* CJK Ideograph */
+ ["\u7015", "\u7015"], /* CJK Ideograph */
+ ["\u7016", "\u7016"], /* CJK Ideograph */
+ ["\u7017", "\u7017"], /* CJK Ideograph */
+ ["\u7018", "\u7018"], /* CJK Ideograph */
+ ["\u7019", "\u7019"], /* CJK Ideograph */
+ ["\u701A", "\u701A"], /* CJK Ideograph */
+ ["\u701B", "\u701B"], /* CJK Ideograph */
+ ["\u701C", "\u701C"], /* CJK Ideograph */
+ ["\u701D", "\u701D"], /* CJK Ideograph */
+ ["\u701E", "\u701E"], /* CJK Ideograph */
+ ["\u701F", "\u701F"], /* CJK Ideograph */
+ ["\u7020", "\u7020"], /* CJK Ideograph */
+ ["\u7021", "\u7021"], /* CJK Ideograph */
+ ["\u7022", "\u7022"], /* CJK Ideograph */
+ ["\u7023", "\u7023"], /* CJK Ideograph */
+ ["\u7024", "\u7024"], /* CJK Ideograph */
+ ["\u7025", "\u7025"], /* CJK Ideograph */
+ ["\u7026", "\u7026"], /* CJK Ideograph */
+ ["\u7027", "\u7027"], /* CJK Ideograph */
+ ["\u7028", "\u7028"], /* CJK Ideograph */
+ ["\u7029", "\u7029"], /* CJK Ideograph */
+ ["\u702A", "\u702A"], /* CJK Ideograph */
+ ["\u702B", "\u702B"], /* CJK Ideograph */
+ ["\u702C", "\u702C"], /* CJK Ideograph */
+ ["\u702D", "\u702D"], /* CJK Ideograph */
+ ["\u702E", "\u702E"], /* CJK Ideograph */
+ ["\u702F", "\u702F"], /* CJK Ideograph */
+ ["\u7030", "\u7030"], /* CJK Ideograph */
+ ["\u7031", "\u7031"], /* CJK Ideograph */
+ ["\u7032", "\u7032"], /* CJK Ideograph */
+ ["\u7033", "\u7033"], /* CJK Ideograph */
+ ["\u7034", "\u7034"], /* CJK Ideograph */
+ ["\u7035", "\u7035"], /* CJK Ideograph */
+ ["\u7036", "\u7036"], /* CJK Ideograph */
+ ["\u7037", "\u7037"], /* CJK Ideograph */
+ ["\u7038", "\u7038"], /* CJK Ideograph */
+ ["\u7039", "\u7039"], /* CJK Ideograph */
+ ["\u703A", "\u703A"], /* CJK Ideograph */
+ ["\u703B", "\u703B"], /* CJK Ideograph */
+ ["\u703C", "\u703C"], /* CJK Ideograph */
+ ["\u703D", "\u703D"], /* CJK Ideograph */
+ ["\u703E", "\u703E"], /* CJK Ideograph */
+ ["\u703F", "\u703F"], /* CJK Ideograph */
+ ["\u7040", "\u7040"], /* CJK Ideograph */
+ ["\u7041", "\u7041"], /* CJK Ideograph */
+ ["\u7042", "\u7042"], /* CJK Ideograph */
+ ["\u7043", "\u7043"], /* CJK Ideograph */
+ ["\u7044", "\u7044"], /* CJK Ideograph */
+ ["\u7045", "\u7045"], /* CJK Ideograph */
+ ["\u7046", "\u7046"], /* CJK Ideograph */
+ ["\u7047", "\u7047"], /* CJK Ideograph */
+ ["\u7048", "\u7048"], /* CJK Ideograph */
+ ["\u7049", "\u7049"], /* CJK Ideograph */
+ ["\u704A", "\u704A"], /* CJK Ideograph */
+ ["\u704B", "\u704B"], /* CJK Ideograph */
+ ["\u704C", "\u704C"], /* CJK Ideograph */
+ ["\u704D", "\u704D"], /* CJK Ideograph */
+ ["\u704E", "\u704E"], /* CJK Ideograph */
+ ["\u704F", "\u704F"], /* CJK Ideograph */
+ ["\u7050", "\u7050"], /* CJK Ideograph */
+ ["\u7051", "\u7051"], /* CJK Ideograph */
+ ["\u7052", "\u7052"], /* CJK Ideograph */
+ ["\u7053", "\u7053"], /* CJK Ideograph */
+ ["\u7054", "\u7054"], /* CJK Ideograph */
+ ["\u7055", "\u7055"], /* CJK Ideograph */
+ ["\u7056", "\u7056"], /* CJK Ideograph */
+ ["\u7057", "\u7057"], /* CJK Ideograph */
+ ["\u7058", "\u7058"], /* CJK Ideograph */
+ ["\u7059", "\u7059"], /* CJK Ideograph */
+ ["\u705A", "\u705A"], /* CJK Ideograph */
+ ["\u705B", "\u705B"], /* CJK Ideograph */
+ ["\u705C", "\u705C"], /* CJK Ideograph */
+ ["\u705D", "\u705D"], /* CJK Ideograph */
+ ["\u705E", "\u705E"], /* CJK Ideograph */
+ ["\u705F", "\u705F"], /* CJK Ideograph */
+ ["\u7060", "\u7060"], /* CJK Ideograph */
+ ["\u7061", "\u7061"], /* CJK Ideograph */
+ ["\u7062", "\u7062"], /* CJK Ideograph */
+ ["\u7063", "\u7063"], /* CJK Ideograph */
+ ["\u7064", "\u7064"], /* CJK Ideograph */
+ ["\u7065", "\u7065"], /* CJK Ideograph */
+ ["\u7066", "\u7066"], /* CJK Ideograph */
+ ["\u7067", "\u7067"], /* CJK Ideograph */
+ ["\u7068", "\u7068"], /* CJK Ideograph */
+ ["\u7069", "\u7069"], /* CJK Ideograph */
+ ["\u706A", "\u706A"], /* CJK Ideograph */
+ ["\u706B", "\u706B"], /* CJK Ideograph */
+ ["\u706C", "\u706C"], /* CJK Ideograph */
+ ["\u706D", "\u706D"], /* CJK Ideograph */
+ ["\u706E", "\u706E"], /* CJK Ideograph */
+ ["\u706F", "\u706F"], /* CJK Ideograph */
+ ["\u7070", "\u7070"], /* CJK Ideograph */
+ ["\u7071", "\u7071"], /* CJK Ideograph */
+ ["\u7072", "\u7072"], /* CJK Ideograph */
+ ["\u7073", "\u7073"], /* CJK Ideograph */
+ ["\u7074", "\u7074"], /* CJK Ideograph */
+ ["\u7075", "\u7075"], /* CJK Ideograph */
+ ["\u7076", "\u7076"], /* CJK Ideograph */
+ ["\u7077", "\u7077"], /* CJK Ideograph */
+ ["\u7078", "\u7078"], /* CJK Ideograph */
+ ["\u7079", "\u7079"], /* CJK Ideograph */
+ ["\u707A", "\u707A"], /* CJK Ideograph */
+ ["\u707B", "\u707B"], /* CJK Ideograph */
+ ["\u707C", "\u707C"], /* CJK Ideograph */
+ ["\u707D", "\u707D"], /* CJK Ideograph */
+ ["\u707E", "\u707E"], /* CJK Ideograph */
+ ["\u707F", "\u707F"], /* CJK Ideograph */
+ ["\u7080", "\u7080"], /* CJK Ideograph */
+ ["\u7081", "\u7081"], /* CJK Ideograph */
+ ["\u7082", "\u7082"], /* CJK Ideograph */
+ ["\u7083", "\u7083"], /* CJK Ideograph */
+ ["\u7084", "\u7084"], /* CJK Ideograph */
+ ["\u7085", "\u7085"], /* CJK Ideograph */
+ ["\u7086", "\u7086"], /* CJK Ideograph */
+ ["\u7087", "\u7087"], /* CJK Ideograph */
+ ["\u7088", "\u7088"], /* CJK Ideograph */
+ ["\u7089", "\u7089"], /* CJK Ideograph */
+ ["\u708A", "\u708A"], /* CJK Ideograph */
+ ["\u708B", "\u708B"], /* CJK Ideograph */
+ ["\u708C", "\u708C"], /* CJK Ideograph */
+ ["\u708D", "\u708D"], /* CJK Ideograph */
+ ["\u708E", "\u708E"], /* CJK Ideograph */
+ ["\u708F", "\u708F"], /* CJK Ideograph */
+ ["\u7090", "\u7090"], /* CJK Ideograph */
+ ["\u7091", "\u7091"], /* CJK Ideograph */
+ ["\u7092", "\u7092"], /* CJK Ideograph */
+ ["\u7093", "\u7093"], /* CJK Ideograph */
+ ["\u7094", "\u7094"], /* CJK Ideograph */
+ ["\u7095", "\u7095"], /* CJK Ideograph */
+ ["\u7096", "\u7096"], /* CJK Ideograph */
+ ["\u7097", "\u7097"], /* CJK Ideograph */
+ ["\u7098", "\u7098"], /* CJK Ideograph */
+ ["\u7099", "\u7099"], /* CJK Ideograph */
+ ["\u709A", "\u709A"], /* CJK Ideograph */
+ ["\u709B", "\u709B"], /* CJK Ideograph */
+ ["\u709C", "\u709C"], /* CJK Ideograph */
+ ["\u709D", "\u709D"], /* CJK Ideograph */
+ ["\u709E", "\u709E"], /* CJK Ideograph */
+ ["\u709F", "\u709F"], /* CJK Ideograph */
+ ["\u70A0", "\u70A0"], /* CJK Ideograph */
+ ["\u70A1", "\u70A1"], /* CJK Ideograph */
+ ["\u70A2", "\u70A2"], /* CJK Ideograph */
+ ["\u70A3", "\u70A3"], /* CJK Ideograph */
+ ["\u70A4", "\u70A4"], /* CJK Ideograph */
+ ["\u70A5", "\u70A5"], /* CJK Ideograph */
+ ["\u70A6", "\u70A6"], /* CJK Ideograph */
+ ["\u70A7", "\u70A7"], /* CJK Ideograph */
+ ["\u70A8", "\u70A8"], /* CJK Ideograph */
+ ["\u70A9", "\u70A9"], /* CJK Ideograph */
+ ["\u70AA", "\u70AA"], /* CJK Ideograph */
+ ["\u70AB", "\u70AB"], /* CJK Ideograph */
+ ["\u70AC", "\u70AC"], /* CJK Ideograph */
+ ["\u70AD", "\u70AD"], /* CJK Ideograph */
+ ["\u70AE", "\u70AE"], /* CJK Ideograph */
+ ["\u70AF", "\u70AF"], /* CJK Ideograph */
+ ["\u70B0", "\u70B0"], /* CJK Ideograph */
+ ["\u70B1", "\u70B1"], /* CJK Ideograph */
+ ["\u70B2", "\u70B2"], /* CJK Ideograph */
+ ["\u70B3", "\u70B3"], /* CJK Ideograph */
+ ["\u70B4", "\u70B4"], /* CJK Ideograph */
+ ["\u70B5", "\u70B5"], /* CJK Ideograph */
+ ["\u70B6", "\u70B6"], /* CJK Ideograph */
+ ["\u70B7", "\u70B7"], /* CJK Ideograph */
+ ["\u70B8", "\u70B8"], /* CJK Ideograph */
+ ["\u70B9", "\u70B9"], /* CJK Ideograph */
+ ["\u70BA", "\u70BA"], /* CJK Ideograph */
+ ["\u70BB", "\u70BB"], /* CJK Ideograph */
+ ["\u70BC", "\u70BC"], /* CJK Ideograph */
+ ["\u70BD", "\u70BD"], /* CJK Ideograph */
+ ["\u70BE", "\u70BE"], /* CJK Ideograph */
+ ["\u70BF", "\u70BF"], /* CJK Ideograph */
+ ["\u70C0", "\u70C0"], /* CJK Ideograph */
+ ["\u70C1", "\u70C1"], /* CJK Ideograph */
+ ["\u70C2", "\u70C2"], /* CJK Ideograph */
+ ["\u70C3", "\u70C3"], /* CJK Ideograph */
+ ["\u70C4", "\u70C4"], /* CJK Ideograph */
+ ["\u70C5", "\u70C5"], /* CJK Ideograph */
+ ["\u70C6", "\u70C6"], /* CJK Ideograph */
+ ["\u70C7", "\u70C7"], /* CJK Ideograph */
+ ["\u70C8", "\u70C8"], /* CJK Ideograph */
+ ["\u70C9", "\u70C9"], /* CJK Ideograph */
+ ["\u70CA", "\u70CA"], /* CJK Ideograph */
+ ["\u70CB", "\u70CB"], /* CJK Ideograph */
+ ["\u70CC", "\u70CC"], /* CJK Ideograph */
+ ["\u70CD", "\u70CD"], /* CJK Ideograph */
+ ["\u70CE", "\u70CE"], /* CJK Ideograph */
+ ["\u70CF", "\u70CF"], /* CJK Ideograph */
+ ["\u70D0", "\u70D0"], /* CJK Ideograph */
+ ["\u70D1", "\u70D1"], /* CJK Ideograph */
+ ["\u70D2", "\u70D2"], /* CJK Ideograph */
+ ["\u70D3", "\u70D3"], /* CJK Ideograph */
+ ["\u70D4", "\u70D4"], /* CJK Ideograph */
+ ["\u70D5", "\u70D5"], /* CJK Ideograph */
+ ["\u70D6", "\u70D6"], /* CJK Ideograph */
+ ["\u70D7", "\u70D7"], /* CJK Ideograph */
+ ["\u70D8", "\u70D8"], /* CJK Ideograph */
+ ["\u70D9", "\u70D9"], /* CJK Ideograph */
+ ["\u70DA", "\u70DA"], /* CJK Ideograph */
+ ["\u70DB", "\u70DB"], /* CJK Ideograph */
+ ["\u70DC", "\u70DC"], /* CJK Ideograph */
+ ["\u70DD", "\u70DD"], /* CJK Ideograph */
+ ["\u70DE", "\u70DE"], /* CJK Ideograph */
+ ["\u70DF", "\u70DF"], /* CJK Ideograph */
+ ["\u70E0", "\u70E0"], /* CJK Ideograph */
+ ["\u70E1", "\u70E1"], /* CJK Ideograph */
+ ["\u70E2", "\u70E2"], /* CJK Ideograph */
+ ["\u70E3", "\u70E3"], /* CJK Ideograph */
+ ["\u70E4", "\u70E4"], /* CJK Ideograph */
+ ["\u70E5", "\u70E5"], /* CJK Ideograph */
+ ["\u70E6", "\u70E6"], /* CJK Ideograph */
+ ["\u70E7", "\u70E7"], /* CJK Ideograph */
+ ["\u70E8", "\u70E8"], /* CJK Ideograph */
+ ["\u70E9", "\u70E9"], /* CJK Ideograph */
+ ["\u70EA", "\u70EA"], /* CJK Ideograph */
+ ["\u70EB", "\u70EB"], /* CJK Ideograph */
+ ["\u70EC", "\u70EC"], /* CJK Ideograph */
+ ["\u70ED", "\u70ED"], /* CJK Ideograph */
+ ["\u70EE", "\u70EE"], /* CJK Ideograph */
+ ["\u70EF", "\u70EF"], /* CJK Ideograph */
+ ["\u70F0", "\u70F0"], /* CJK Ideograph */
+ ["\u70F1", "\u70F1"], /* CJK Ideograph */
+ ["\u70F2", "\u70F2"], /* CJK Ideograph */
+ ["\u70F3", "\u70F3"], /* CJK Ideograph */
+ ["\u70F4", "\u70F4"], /* CJK Ideograph */
+ ["\u70F5", "\u70F5"], /* CJK Ideograph */
+ ["\u70F6", "\u70F6"], /* CJK Ideograph */
+ ["\u70F7", "\u70F7"], /* CJK Ideograph */
+ ["\u70F8", "\u70F8"], /* CJK Ideograph */
+ ["\u70F9", "\u70F9"], /* CJK Ideograph */
+ ["\u70FA", "\u70FA"], /* CJK Ideograph */
+ ["\u70FB", "\u70FB"], /* CJK Ideograph */
+ ["\u70FC", "\u70FC"], /* CJK Ideograph */
+ ["\u70FD", "\u70FD"], /* CJK Ideograph */
+ ["\u70FE", "\u70FE"], /* CJK Ideograph */
+ ["\u70FF", "\u70FF"], /* CJK Ideograph */
+ ["\u7100", "\u7100"], /* CJK Ideograph */
+ ["\u7101", "\u7101"], /* CJK Ideograph */
+ ["\u7102", "\u7102"], /* CJK Ideograph */
+ ["\u7103", "\u7103"], /* CJK Ideograph */
+ ["\u7104", "\u7104"], /* CJK Ideograph */
+ ["\u7105", "\u7105"], /* CJK Ideograph */
+ ["\u7106", "\u7106"], /* CJK Ideograph */
+ ["\u7107", "\u7107"], /* CJK Ideograph */
+ ["\u7108", "\u7108"], /* CJK Ideograph */
+ ["\u7109", "\u7109"], /* CJK Ideograph */
+ ["\u710A", "\u710A"], /* CJK Ideograph */
+ ["\u710B", "\u710B"], /* CJK Ideograph */
+ ["\u710C", "\u710C"], /* CJK Ideograph */
+ ["\u710D", "\u710D"], /* CJK Ideograph */
+ ["\u710E", "\u710E"], /* CJK Ideograph */
+ ["\u710F", "\u710F"], /* CJK Ideograph */
+ ["\u7110", "\u7110"], /* CJK Ideograph */
+ ["\u7111", "\u7111"], /* CJK Ideograph */
+ ["\u7112", "\u7112"], /* CJK Ideograph */
+ ["\u7113", "\u7113"], /* CJK Ideograph */
+ ["\u7114", "\u7114"], /* CJK Ideograph */
+ ["\u7115", "\u7115"], /* CJK Ideograph */
+ ["\u7116", "\u7116"], /* CJK Ideograph */
+ ["\u7117", "\u7117"], /* CJK Ideograph */
+ ["\u7118", "\u7118"], /* CJK Ideograph */
+ ["\u7119", "\u7119"], /* CJK Ideograph */
+ ["\u711A", "\u711A"], /* CJK Ideograph */
+ ["\u711B", "\u711B"], /* CJK Ideograph */
+ ["\u711C", "\u711C"], /* CJK Ideograph */
+ ["\u711D", "\u711D"], /* CJK Ideograph */
+ ["\u711E", "\u711E"], /* CJK Ideograph */
+ ["\u711F", "\u711F"], /* CJK Ideograph */
+ ["\u7120", "\u7120"], /* CJK Ideograph */
+ ["\u7121", "\u7121"], /* CJK Ideograph */
+ ["\u7122", "\u7122"], /* CJK Ideograph */
+ ["\u7123", "\u7123"], /* CJK Ideograph */
+ ["\u7124", "\u7124"], /* CJK Ideograph */
+ ["\u7125", "\u7125"], /* CJK Ideograph */
+ ["\u7126", "\u7126"], /* CJK Ideograph */
+ ["\u7127", "\u7127"], /* CJK Ideograph */
+ ["\u7128", "\u7128"], /* CJK Ideograph */
+ ["\u7129", "\u7129"], /* CJK Ideograph */
+ ["\u712A", "\u712A"], /* CJK Ideograph */
+ ["\u712B", "\u712B"], /* CJK Ideograph */
+ ["\u712C", "\u712C"], /* CJK Ideograph */
+ ["\u712D", "\u712D"], /* CJK Ideograph */
+ ["\u712E", "\u712E"], /* CJK Ideograph */
+ ["\u712F", "\u712F"], /* CJK Ideograph */
+ ["\u7130", "\u7130"], /* CJK Ideograph */
+ ["\u7131", "\u7131"], /* CJK Ideograph */
+ ["\u7132", "\u7132"], /* CJK Ideograph */
+ ["\u7133", "\u7133"], /* CJK Ideograph */
+ ["\u7134", "\u7134"], /* CJK Ideograph */
+ ["\u7135", "\u7135"], /* CJK Ideograph */
+ ["\u7136", "\u7136"], /* CJK Ideograph */
+ ["\u7137", "\u7137"], /* CJK Ideograph */
+ ["\u7138", "\u7138"], /* CJK Ideograph */
+ ["\u7139", "\u7139"], /* CJK Ideograph */
+ ["\u713A", "\u713A"], /* CJK Ideograph */
+ ["\u713B", "\u713B"], /* CJK Ideograph */
+ ["\u713C", "\u713C"], /* CJK Ideograph */
+ ["\u713D", "\u713D"], /* CJK Ideograph */
+ ["\u713E", "\u713E"], /* CJK Ideograph */
+ ["\u713F", "\u713F"], /* CJK Ideograph */
+ ["\u7140", "\u7140"], /* CJK Ideograph */
+ ["\u7141", "\u7141"], /* CJK Ideograph */
+ ["\u7142", "\u7142"], /* CJK Ideograph */
+ ["\u7143", "\u7143"], /* CJK Ideograph */
+ ["\u7144", "\u7144"], /* CJK Ideograph */
+ ["\u7145", "\u7145"], /* CJK Ideograph */
+ ["\u7146", "\u7146"], /* CJK Ideograph */
+ ["\u7147", "\u7147"], /* CJK Ideograph */
+ ["\u7148", "\u7148"], /* CJK Ideograph */
+ ["\u7149", "\u7149"], /* CJK Ideograph */
+ ["\u714A", "\u714A"], /* CJK Ideograph */
+ ["\u714B", "\u714B"], /* CJK Ideograph */
+ ["\u714C", "\u714C"], /* CJK Ideograph */
+ ["\u714D", "\u714D"], /* CJK Ideograph */
+ ["\u714E", "\u714E"], /* CJK Ideograph */
+ ["\u714F", "\u714F"], /* CJK Ideograph */
+ ["\u7150", "\u7150"], /* CJK Ideograph */
+ ["\u7151", "\u7151"], /* CJK Ideograph */
+ ["\u7152", "\u7152"], /* CJK Ideograph */
+ ["\u7153", "\u7153"], /* CJK Ideograph */
+ ["\u7154", "\u7154"], /* CJK Ideograph */
+ ["\u7155", "\u7155"], /* CJK Ideograph */
+ ["\u7156", "\u7156"], /* CJK Ideograph */
+ ["\u7157", "\u7157"], /* CJK Ideograph */
+ ["\u7158", "\u7158"], /* CJK Ideograph */
+ ["\u7159", "\u7159"], /* CJK Ideograph */
+ ["\u715A", "\u715A"], /* CJK Ideograph */
+ ["\u715B", "\u715B"], /* CJK Ideograph */
+ ["\u715C", "\u715C"], /* CJK Ideograph */
+ ["\u715D", "\u715D"], /* CJK Ideograph */
+ ["\u715E", "\u715E"], /* CJK Ideograph */
+ ["\u715F", "\u715F"], /* CJK Ideograph */
+ ["\u7160", "\u7160"], /* CJK Ideograph */
+ ["\u7161", "\u7161"], /* CJK Ideograph */
+ ["\u7162", "\u7162"], /* CJK Ideograph */
+ ["\u7163", "\u7163"], /* CJK Ideograph */
+ ["\u7164", "\u7164"], /* CJK Ideograph */
+ ["\u7165", "\u7165"], /* CJK Ideograph */
+ ["\u7166", "\u7166"], /* CJK Ideograph */
+ ["\u7167", "\u7167"], /* CJK Ideograph */
+ ["\u7168", "\u7168"], /* CJK Ideograph */
+ ["\u7169", "\u7169"], /* CJK Ideograph */
+ ["\u716A", "\u716A"], /* CJK Ideograph */
+ ["\u716B", "\u716B"], /* CJK Ideograph */
+ ["\u716C", "\u716C"], /* CJK Ideograph */
+ ["\u716D", "\u716D"], /* CJK Ideograph */
+ ["\u716E", "\u716E"], /* CJK Ideograph */
+ ["\u716F", "\u716F"], /* CJK Ideograph */
+ ["\u7170", "\u7170"], /* CJK Ideograph */
+ ["\u7171", "\u7171"], /* CJK Ideograph */
+ ["\u7172", "\u7172"], /* CJK Ideograph */
+ ["\u7173", "\u7173"], /* CJK Ideograph */
+ ["\u7174", "\u7174"], /* CJK Ideograph */
+ ["\u7175", "\u7175"], /* CJK Ideograph */
+ ["\u7176", "\u7176"], /* CJK Ideograph */
+ ["\u7177", "\u7177"], /* CJK Ideograph */
+ ["\u7178", "\u7178"], /* CJK Ideograph */
+ ["\u7179", "\u7179"], /* CJK Ideograph */
+ ["\u717A", "\u717A"], /* CJK Ideograph */
+ ["\u717B", "\u717B"], /* CJK Ideograph */
+ ["\u717C", "\u717C"], /* CJK Ideograph */
+ ["\u717D", "\u717D"], /* CJK Ideograph */
+ ["\u717E", "\u717E"], /* CJK Ideograph */
+ ["\u717F", "\u717F"], /* CJK Ideograph */
+ ["\u7180", "\u7180"], /* CJK Ideograph */
+ ["\u7181", "\u7181"], /* CJK Ideograph */
+ ["\u7182", "\u7182"], /* CJK Ideograph */
+ ["\u7183", "\u7183"], /* CJK Ideograph */
+ ["\u7184", "\u7184"], /* CJK Ideograph */
+ ["\u7185", "\u7185"], /* CJK Ideograph */
+ ["\u7186", "\u7186"], /* CJK Ideograph */
+ ["\u7187", "\u7187"], /* CJK Ideograph */
+ ["\u7188", "\u7188"], /* CJK Ideograph */
+ ["\u7189", "\u7189"], /* CJK Ideograph */
+ ["\u718A", "\u718A"], /* CJK Ideograph */
+ ["\u718B", "\u718B"], /* CJK Ideograph */
+ ["\u718C", "\u718C"], /* CJK Ideograph */
+ ["\u718D", "\u718D"], /* CJK Ideograph */
+ ["\u718E", "\u718E"], /* CJK Ideograph */
+ ["\u718F", "\u718F"], /* CJK Ideograph */
+ ["\u7190", "\u7190"], /* CJK Ideograph */
+ ["\u7191", "\u7191"], /* CJK Ideograph */
+ ["\u7192", "\u7192"], /* CJK Ideograph */
+ ["\u7193", "\u7193"], /* CJK Ideograph */
+ ["\u7194", "\u7194"], /* CJK Ideograph */
+ ["\u7195", "\u7195"], /* CJK Ideograph */
+ ["\u7196", "\u7196"], /* CJK Ideograph */
+ ["\u7197", "\u7197"], /* CJK Ideograph */
+ ["\u7198", "\u7198"], /* CJK Ideograph */
+ ["\u7199", "\u7199"], /* CJK Ideograph */
+ ["\u719A", "\u719A"], /* CJK Ideograph */
+ ["\u719B", "\u719B"], /* CJK Ideograph */
+ ["\u719C", "\u719C"], /* CJK Ideograph */
+ ["\u719D", "\u719D"], /* CJK Ideograph */
+ ["\u719E", "\u719E"], /* CJK Ideograph */
+ ["\u719F", "\u719F"], /* CJK Ideograph */
+ ["\u71A0", "\u71A0"], /* CJK Ideograph */
+ ["\u71A1", "\u71A1"], /* CJK Ideograph */
+ ["\u71A2", "\u71A2"], /* CJK Ideograph */
+ ["\u71A3", "\u71A3"], /* CJK Ideograph */
+ ["\u71A4", "\u71A4"], /* CJK Ideograph */
+ ["\u71A5", "\u71A5"], /* CJK Ideograph */
+ ["\u71A6", "\u71A6"], /* CJK Ideograph */
+ ["\u71A7", "\u71A7"], /* CJK Ideograph */
+ ["\u71A8", "\u71A8"], /* CJK Ideograph */
+ ["\u71A9", "\u71A9"], /* CJK Ideograph */
+ ["\u71AA", "\u71AA"], /* CJK Ideograph */
+ ["\u71AB", "\u71AB"], /* CJK Ideograph */
+ ["\u71AC", "\u71AC"], /* CJK Ideograph */
+ ["\u71AD", "\u71AD"], /* CJK Ideograph */
+ ["\u71AE", "\u71AE"], /* CJK Ideograph */
+ ["\u71AF", "\u71AF"], /* CJK Ideograph */
+ ["\u71B0", "\u71B0"], /* CJK Ideograph */
+ ["\u71B1", "\u71B1"], /* CJK Ideograph */
+ ["\u71B2", "\u71B2"], /* CJK Ideograph */
+ ["\u71B3", "\u71B3"], /* CJK Ideograph */
+ ["\u71B4", "\u71B4"], /* CJK Ideograph */
+ ["\u71B5", "\u71B5"], /* CJK Ideograph */
+ ["\u71B6", "\u71B6"], /* CJK Ideograph */
+ ["\u71B7", "\u71B7"], /* CJK Ideograph */
+ ["\u71B8", "\u71B8"], /* CJK Ideograph */
+ ["\u71B9", "\u71B9"], /* CJK Ideograph */
+ ["\u71BA", "\u71BA"], /* CJK Ideograph */
+ ["\u71BB", "\u71BB"], /* CJK Ideograph */
+ ["\u71BC", "\u71BC"], /* CJK Ideograph */
+ ["\u71BD", "\u71BD"], /* CJK Ideograph */
+ ["\u71BE", "\u71BE"], /* CJK Ideograph */
+ ["\u71BF", "\u71BF"], /* CJK Ideograph */
+ ["\u71C0", "\u71C0"], /* CJK Ideograph */
+ ["\u71C1", "\u71C1"], /* CJK Ideograph */
+ ["\u71C2", "\u71C2"], /* CJK Ideograph */
+ ["\u71C3", "\u71C3"], /* CJK Ideograph */
+ ["\u71C4", "\u71C4"], /* CJK Ideograph */
+ ["\u71C5", "\u71C5"], /* CJK Ideograph */
+ ["\u71C6", "\u71C6"], /* CJK Ideograph */
+ ["\u71C7", "\u71C7"], /* CJK Ideograph */
+ ["\u71C8", "\u71C8"], /* CJK Ideograph */
+ ["\u71C9", "\u71C9"], /* CJK Ideograph */
+ ["\u71CA", "\u71CA"], /* CJK Ideograph */
+ ["\u71CB", "\u71CB"], /* CJK Ideograph */
+ ["\u71CC", "\u71CC"], /* CJK Ideograph */
+ ["\u71CD", "\u71CD"], /* CJK Ideograph */
+ ["\u71CE", "\u71CE"], /* CJK Ideograph */
+ ["\u71CF", "\u71CF"], /* CJK Ideograph */
+ ["\u71D0", "\u71D0"], /* CJK Ideograph */
+ ["\u71D1", "\u71D1"], /* CJK Ideograph */
+ ["\u71D2", "\u71D2"], /* CJK Ideograph */
+ ["\u71D3", "\u71D3"], /* CJK Ideograph */
+ ["\u71D4", "\u71D4"], /* CJK Ideograph */
+ ["\u71D5", "\u71D5"], /* CJK Ideograph */
+ ["\u71D6", "\u71D6"], /* CJK Ideograph */
+ ["\u71D7", "\u71D7"], /* CJK Ideograph */
+ ["\u71D8", "\u71D8"], /* CJK Ideograph */
+ ["\u71D9", "\u71D9"], /* CJK Ideograph */
+ ["\u71DA", "\u71DA"], /* CJK Ideograph */
+ ["\u71DB", "\u71DB"], /* CJK Ideograph */
+ ["\u71DC", "\u71DC"], /* CJK Ideograph */
+ ["\u71DD", "\u71DD"], /* CJK Ideograph */
+ ["\u71DE", "\u71DE"], /* CJK Ideograph */
+ ["\u71DF", "\u71DF"], /* CJK Ideograph */
+ ["\u71E0", "\u71E0"], /* CJK Ideograph */
+ ["\u71E1", "\u71E1"], /* CJK Ideograph */
+ ["\u71E2", "\u71E2"], /* CJK Ideograph */
+ ["\u71E3", "\u71E3"], /* CJK Ideograph */
+ ["\u71E4", "\u71E4"], /* CJK Ideograph */
+ ["\u71E5", "\u71E5"], /* CJK Ideograph */
+ ["\u71E6", "\u71E6"], /* CJK Ideograph */
+ ["\u71E7", "\u71E7"], /* CJK Ideograph */
+ ["\u71E8", "\u71E8"], /* CJK Ideograph */
+ ["\u71E9", "\u71E9"], /* CJK Ideograph */
+ ["\u71EA", "\u71EA"], /* CJK Ideograph */
+ ["\u71EB", "\u71EB"], /* CJK Ideograph */
+ ["\u71EC", "\u71EC"], /* CJK Ideograph */
+ ["\u71ED", "\u71ED"], /* CJK Ideograph */
+ ["\u71EE", "\u71EE"], /* CJK Ideograph */
+ ["\u71EF", "\u71EF"], /* CJK Ideograph */
+ ["\u71F0", "\u71F0"], /* CJK Ideograph */
+ ["\u71F1", "\u71F1"], /* CJK Ideograph */
+ ["\u71F2", "\u71F2"], /* CJK Ideograph */
+ ["\u71F3", "\u71F3"], /* CJK Ideograph */
+ ["\u71F4", "\u71F4"], /* CJK Ideograph */
+ ["\u71F5", "\u71F5"], /* CJK Ideograph */
+ ["\u71F6", "\u71F6"], /* CJK Ideograph */
+ ["\u71F7", "\u71F7"], /* CJK Ideograph */
+ ["\u71F8", "\u71F8"], /* CJK Ideograph */
+ ["\u71F9", "\u71F9"], /* CJK Ideograph */
+ ["\u71FA", "\u71FA"], /* CJK Ideograph */
+ ["\u71FB", "\u71FB"], /* CJK Ideograph */
+ ["\u71FC", "\u71FC"], /* CJK Ideograph */
+ ["\u71FD", "\u71FD"], /* CJK Ideograph */
+ ["\u71FE", "\u71FE"], /* CJK Ideograph */
+ ["\u71FF", "\u71FF"], /* CJK Ideograph */
+ ["\u7200", "\u7200"], /* CJK Ideograph */
+ ["\u7201", "\u7201"], /* CJK Ideograph */
+ ["\u7202", "\u7202"], /* CJK Ideograph */
+ ["\u7203", "\u7203"], /* CJK Ideograph */
+ ["\u7204", "\u7204"], /* CJK Ideograph */
+ ["\u7205", "\u7205"], /* CJK Ideograph */
+ ["\u7206", "\u7206"], /* CJK Ideograph */
+ ["\u7207", "\u7207"], /* CJK Ideograph */
+ ["\u7208", "\u7208"], /* CJK Ideograph */
+ ["\u7209", "\u7209"], /* CJK Ideograph */
+ ["\u720A", "\u720A"], /* CJK Ideograph */
+ ["\u720B", "\u720B"], /* CJK Ideograph */
+ ["\u720C", "\u720C"], /* CJK Ideograph */
+ ["\u720D", "\u720D"], /* CJK Ideograph */
+ ["\u720E", "\u720E"], /* CJK Ideograph */
+ ["\u720F", "\u720F"], /* CJK Ideograph */
+ ["\u7210", "\u7210"], /* CJK Ideograph */
+ ["\u7211", "\u7211"], /* CJK Ideograph */
+ ["\u7212", "\u7212"], /* CJK Ideograph */
+ ["\u7213", "\u7213"], /* CJK Ideograph */
+ ["\u7214", "\u7214"], /* CJK Ideograph */
+ ["\u7215", "\u7215"], /* CJK Ideograph */
+ ["\u7216", "\u7216"], /* CJK Ideograph */
+ ["\u7217", "\u7217"], /* CJK Ideograph */
+ ["\u7218", "\u7218"], /* CJK Ideograph */
+ ["\u7219", "\u7219"], /* CJK Ideograph */
+ ["\u721A", "\u721A"], /* CJK Ideograph */
+ ["\u721B", "\u721B"], /* CJK Ideograph */
+ ["\u721C", "\u721C"], /* CJK Ideograph */
+ ["\u721D", "\u721D"], /* CJK Ideograph */
+ ["\u721E", "\u721E"], /* CJK Ideograph */
+ ["\u721F", "\u721F"], /* CJK Ideograph */
+ ["\u7220", "\u7220"], /* CJK Ideograph */
+ ["\u7221", "\u7221"], /* CJK Ideograph */
+ ["\u7222", "\u7222"], /* CJK Ideograph */
+ ["\u7223", "\u7223"], /* CJK Ideograph */
+ ["\u7224", "\u7224"], /* CJK Ideograph */
+ ["\u7225", "\u7225"], /* CJK Ideograph */
+ ["\u7226", "\u7226"], /* CJK Ideograph */
+ ["\u7227", "\u7227"], /* CJK Ideograph */
+ ["\u7228", "\u7228"], /* CJK Ideograph */
+ ["\u7229", "\u7229"], /* CJK Ideograph */
+ ["\u722A", "\u722A"], /* CJK Ideograph */
+ ["\u722B", "\u722B"], /* CJK Ideograph */
+ ["\u722C", "\u722C"], /* CJK Ideograph */
+ ["\u722D", "\u722D"], /* CJK Ideograph */
+ ["\u722E", "\u722E"], /* CJK Ideograph */
+ ["\u722F", "\u722F"], /* CJK Ideograph */
+ ["\u7230", "\u7230"], /* CJK Ideograph */
+ ["\u7231", "\u7231"], /* CJK Ideograph */
+ ["\u7232", "\u7232"], /* CJK Ideograph */
+ ["\u7233", "\u7233"], /* CJK Ideograph */
+ ["\u7234", "\u7234"], /* CJK Ideograph */
+ ["\u7235", "\u7235"], /* CJK Ideograph */
+ ["\u7236", "\u7236"], /* CJK Ideograph */
+ ["\u7237", "\u7237"], /* CJK Ideograph */
+ ["\u7238", "\u7238"], /* CJK Ideograph */
+ ["\u7239", "\u7239"], /* CJK Ideograph */
+ ["\u723A", "\u723A"], /* CJK Ideograph */
+ ["\u723B", "\u723B"], /* CJK Ideograph */
+ ["\u723C", "\u723C"], /* CJK Ideograph */
+ ["\u723D", "\u723D"], /* CJK Ideograph */
+ ["\u723E", "\u723E"], /* CJK Ideograph */
+ ["\u723F", "\u723F"], /* CJK Ideograph */
+ ["\u7240", "\u7240"], /* CJK Ideograph */
+ ["\u7241", "\u7241"], /* CJK Ideograph */
+ ["\u7242", "\u7242"], /* CJK Ideograph */
+ ["\u7243", "\u7243"], /* CJK Ideograph */
+ ["\u7244", "\u7244"], /* CJK Ideograph */
+ ["\u7245", "\u7245"], /* CJK Ideograph */
+ ["\u7246", "\u7246"], /* CJK Ideograph */
+ ["\u7247", "\u7247"], /* CJK Ideograph */
+ ["\u7248", "\u7248"], /* CJK Ideograph */
+ ["\u7249", "\u7249"], /* CJK Ideograph */
+ ["\u724A", "\u724A"], /* CJK Ideograph */
+ ["\u724B", "\u724B"], /* CJK Ideograph */
+ ["\u724C", "\u724C"], /* CJK Ideograph */
+ ["\u724D", "\u724D"], /* CJK Ideograph */
+ ["\u724E", "\u724E"], /* CJK Ideograph */
+ ["\u724F", "\u724F"], /* CJK Ideograph */
+ ["\u7250", "\u7250"], /* CJK Ideograph */
+ ["\u7251", "\u7251"], /* CJK Ideograph */
+ ["\u7252", "\u7252"], /* CJK Ideograph */
+ ["\u7253", "\u7253"], /* CJK Ideograph */
+ ["\u7254", "\u7254"], /* CJK Ideograph */
+ ["\u7255", "\u7255"], /* CJK Ideograph */
+ ["\u7256", "\u7256"], /* CJK Ideograph */
+ ["\u7257", "\u7257"], /* CJK Ideograph */
+ ["\u7258", "\u7258"], /* CJK Ideograph */
+ ["\u7259", "\u7259"], /* CJK Ideograph */
+ ["\u725A", "\u725A"], /* CJK Ideograph */
+ ["\u725B", "\u725B"], /* CJK Ideograph */
+ ["\u725C", "\u725C"], /* CJK Ideograph */
+ ["\u725D", "\u725D"], /* CJK Ideograph */
+ ["\u725E", "\u725E"], /* CJK Ideograph */
+ ["\u725F", "\u725F"], /* CJK Ideograph */
+ ["\u7260", "\u7260"], /* CJK Ideograph */
+ ["\u7261", "\u7261"], /* CJK Ideograph */
+ ["\u7262", "\u7262"], /* CJK Ideograph */
+ ["\u7263", "\u7263"], /* CJK Ideograph */
+ ["\u7264", "\u7264"], /* CJK Ideograph */
+ ["\u7265", "\u7265"], /* CJK Ideograph */
+ ["\u7266", "\u7266"], /* CJK Ideograph */
+ ["\u7267", "\u7267"], /* CJK Ideograph */
+ ["\u7268", "\u7268"], /* CJK Ideograph */
+ ["\u7269", "\u7269"], /* CJK Ideograph */
+ ["\u726A", "\u726A"], /* CJK Ideograph */
+ ["\u726B", "\u726B"], /* CJK Ideograph */
+ ["\u726C", "\u726C"], /* CJK Ideograph */
+ ["\u726D", "\u726D"], /* CJK Ideograph */
+ ["\u726E", "\u726E"], /* CJK Ideograph */
+ ["\u726F", "\u726F"], /* CJK Ideograph */
+ ["\u7270", "\u7270"], /* CJK Ideograph */
+ ["\u7271", "\u7271"], /* CJK Ideograph */
+ ["\u7272", "\u7272"], /* CJK Ideograph */
+ ["\u7273", "\u7273"], /* CJK Ideograph */
+ ["\u7274", "\u7274"], /* CJK Ideograph */
+ ["\u7275", "\u7275"], /* CJK Ideograph */
+ ["\u7276", "\u7276"], /* CJK Ideograph */
+ ["\u7277", "\u7277"], /* CJK Ideograph */
+ ["\u7278", "\u7278"], /* CJK Ideograph */
+ ["\u7279", "\u7279"], /* CJK Ideograph */
+ ["\u727A", "\u727A"], /* CJK Ideograph */
+ ["\u727B", "\u727B"], /* CJK Ideograph */
+ ["\u727C", "\u727C"], /* CJK Ideograph */
+ ["\u727D", "\u727D"], /* CJK Ideograph */
+ ["\u727E", "\u727E"], /* CJK Ideograph */
+ ["\u727F", "\u727F"], /* CJK Ideograph */
+ ["\u7280", "\u7280"], /* CJK Ideograph */
+ ["\u7281", "\u7281"], /* CJK Ideograph */
+ ["\u7282", "\u7282"], /* CJK Ideograph */
+ ["\u7283", "\u7283"], /* CJK Ideograph */
+ ["\u7284", "\u7284"], /* CJK Ideograph */
+ ["\u7285", "\u7285"], /* CJK Ideograph */
+ ["\u7286", "\u7286"], /* CJK Ideograph */
+ ["\u7287", "\u7287"], /* CJK Ideograph */
+ ["\u7288", "\u7288"], /* CJK Ideograph */
+ ["\u7289", "\u7289"], /* CJK Ideograph */
+ ["\u728A", "\u728A"], /* CJK Ideograph */
+ ["\u728B", "\u728B"], /* CJK Ideograph */
+ ["\u728C", "\u728C"], /* CJK Ideograph */
+ ["\u728D", "\u728D"], /* CJK Ideograph */
+ ["\u728E", "\u728E"], /* CJK Ideograph */
+ ["\u728F", "\u728F"], /* CJK Ideograph */
+ ["\u7290", "\u7290"], /* CJK Ideograph */
+ ["\u7291", "\u7291"], /* CJK Ideograph */
+ ["\u7292", "\u7292"], /* CJK Ideograph */
+ ["\u7293", "\u7293"], /* CJK Ideograph */
+ ["\u7294", "\u7294"], /* CJK Ideograph */
+ ["\u7295", "\u7295"], /* CJK Ideograph */
+ ["\u7296", "\u7296"], /* CJK Ideograph */
+ ["\u7297", "\u7297"], /* CJK Ideograph */
+ ["\u7298", "\u7298"], /* CJK Ideograph */
+ ["\u7299", "\u7299"], /* CJK Ideograph */
+ ["\u729A", "\u729A"], /* CJK Ideograph */
+ ["\u729B", "\u729B"], /* CJK Ideograph */
+ ["\u729C", "\u729C"], /* CJK Ideograph */
+ ["\u729D", "\u729D"], /* CJK Ideograph */
+ ["\u729E", "\u729E"], /* CJK Ideograph */
+ ["\u729F", "\u729F"], /* CJK Ideograph */
+ ["\u72A0", "\u72A0"], /* CJK Ideograph */
+ ["\u72A1", "\u72A1"], /* CJK Ideograph */
+ ["\u72A2", "\u72A2"], /* CJK Ideograph */
+ ["\u72A3", "\u72A3"], /* CJK Ideograph */
+ ["\u72A4", "\u72A4"], /* CJK Ideograph */
+ ["\u72A5", "\u72A5"], /* CJK Ideograph */
+ ["\u72A6", "\u72A6"], /* CJK Ideograph */
+ ["\u72A7", "\u72A7"], /* CJK Ideograph */
+ ["\u72A8", "\u72A8"], /* CJK Ideograph */
+ ["\u72A9", "\u72A9"], /* CJK Ideograph */
+ ["\u72AA", "\u72AA"], /* CJK Ideograph */
+ ["\u72AB", "\u72AB"], /* CJK Ideograph */
+ ["\u72AC", "\u72AC"], /* CJK Ideograph */
+ ["\u72AD", "\u72AD"], /* CJK Ideograph */
+ ["\u72AE", "\u72AE"], /* CJK Ideograph */
+ ["\u72AF", "\u72AF"], /* CJK Ideograph */
+ ["\u72B0", "\u72B0"], /* CJK Ideograph */
+ ["\u72B1", "\u72B1"], /* CJK Ideograph */
+ ["\u72B2", "\u72B2"], /* CJK Ideograph */
+ ["\u72B3", "\u72B3"], /* CJK Ideograph */
+ ["\u72B4", "\u72B4"], /* CJK Ideograph */
+ ["\u72B5", "\u72B5"], /* CJK Ideograph */
+ ["\u72B6", "\u72B6"], /* CJK Ideograph */
+ ["\u72B7", "\u72B7"], /* CJK Ideograph */
+ ["\u72B8", "\u72B8"], /* CJK Ideograph */
+ ["\u72B9", "\u72B9"], /* CJK Ideograph */
+ ["\u72BA", "\u72BA"], /* CJK Ideograph */
+ ["\u72BB", "\u72BB"], /* CJK Ideograph */
+ ["\u72BC", "\u72BC"], /* CJK Ideograph */
+ ["\u72BD", "\u72BD"], /* CJK Ideograph */
+ ["\u72BE", "\u72BE"], /* CJK Ideograph */
+ ["\u72BF", "\u72BF"], /* CJK Ideograph */
+ ["\u72C0", "\u72C0"], /* CJK Ideograph */
+ ["\u72C1", "\u72C1"], /* CJK Ideograph */
+ ["\u72C2", "\u72C2"], /* CJK Ideograph */
+ ["\u72C3", "\u72C3"], /* CJK Ideograph */
+ ["\u72C4", "\u72C4"], /* CJK Ideograph */
+ ["\u72C5", "\u72C5"], /* CJK Ideograph */
+ ["\u72C6", "\u72C6"], /* CJK Ideograph */
+ ["\u72C7", "\u72C7"], /* CJK Ideograph */
+ ["\u72C8", "\u72C8"], /* CJK Ideograph */
+ ["\u72C9", "\u72C9"], /* CJK Ideograph */
+ ["\u72CA", "\u72CA"], /* CJK Ideograph */
+ ["\u72CB", "\u72CB"], /* CJK Ideograph */
+ ["\u72CC", "\u72CC"], /* CJK Ideograph */
+ ["\u72CD", "\u72CD"], /* CJK Ideograph */
+ ["\u72CE", "\u72CE"], /* CJK Ideograph */
+ ["\u72CF", "\u72CF"], /* CJK Ideograph */
+ ["\u72D0", "\u72D0"], /* CJK Ideograph */
+ ["\u72D1", "\u72D1"], /* CJK Ideograph */
+ ["\u72D2", "\u72D2"], /* CJK Ideograph */
+ ["\u72D3", "\u72D3"], /* CJK Ideograph */
+ ["\u72D4", "\u72D4"], /* CJK Ideograph */
+ ["\u72D5", "\u72D5"], /* CJK Ideograph */
+ ["\u72D6", "\u72D6"], /* CJK Ideograph */
+ ["\u72D7", "\u72D7"], /* CJK Ideograph */
+ ["\u72D8", "\u72D8"], /* CJK Ideograph */
+ ["\u72D9", "\u72D9"], /* CJK Ideograph */
+ ["\u72DA", "\u72DA"], /* CJK Ideograph */
+ ["\u72DB", "\u72DB"], /* CJK Ideograph */
+ ["\u72DC", "\u72DC"], /* CJK Ideograph */
+ ["\u72DD", "\u72DD"], /* CJK Ideograph */
+ ["\u72DE", "\u72DE"], /* CJK Ideograph */
+ ["\u72DF", "\u72DF"], /* CJK Ideograph */
+ ["\u72E0", "\u72E0"], /* CJK Ideograph */
+ ["\u72E1", "\u72E1"], /* CJK Ideograph */
+ ["\u72E2", "\u72E2"], /* CJK Ideograph */
+ ["\u72E3", "\u72E3"], /* CJK Ideograph */
+ ["\u72E4", "\u72E4"], /* CJK Ideograph */
+ ["\u72E5", "\u72E5"], /* CJK Ideograph */
+ ["\u72E6", "\u72E6"], /* CJK Ideograph */
+ ["\u72E7", "\u72E7"], /* CJK Ideograph */
+ ["\u72E8", "\u72E8"], /* CJK Ideograph */
+ ["\u72E9", "\u72E9"], /* CJK Ideograph */
+ ["\u72EA", "\u72EA"], /* CJK Ideograph */
+ ["\u72EB", "\u72EB"], /* CJK Ideograph */
+ ["\u72EC", "\u72EC"], /* CJK Ideograph */
+ ["\u72ED", "\u72ED"], /* CJK Ideograph */
+ ["\u72EE", "\u72EE"], /* CJK Ideograph */
+ ["\u72EF", "\u72EF"], /* CJK Ideograph */
+ ["\u72F0", "\u72F0"], /* CJK Ideograph */
+ ["\u72F1", "\u72F1"], /* CJK Ideograph */
+ ["\u72F2", "\u72F2"], /* CJK Ideograph */
+ ["\u72F3", "\u72F3"], /* CJK Ideograph */
+ ["\u72F4", "\u72F4"], /* CJK Ideograph */
+ ["\u72F5", "\u72F5"], /* CJK Ideograph */
+ ["\u72F6", "\u72F6"], /* CJK Ideograph */
+ ["\u72F7", "\u72F7"], /* CJK Ideograph */
+ ["\u72F8", "\u72F8"], /* CJK Ideograph */
+ ["\u72F9", "\u72F9"], /* CJK Ideograph */
+ ["\u72FA", "\u72FA"], /* CJK Ideograph */
+ ["\u72FB", "\u72FB"], /* CJK Ideograph */
+ ["\u72FC", "\u72FC"], /* CJK Ideograph */
+ ["\u72FD", "\u72FD"], /* CJK Ideograph */
+ ["\u72FE", "\u72FE"], /* CJK Ideograph */
+ ["\u72FF", "\u72FF"], /* CJK Ideograph */
+ ["\u7300", "\u7300"], /* CJK Ideograph */
+ ["\u7301", "\u7301"], /* CJK Ideograph */
+ ["\u7302", "\u7302"], /* CJK Ideograph */
+ ["\u7303", "\u7303"], /* CJK Ideograph */
+ ["\u7304", "\u7304"], /* CJK Ideograph */
+ ["\u7305", "\u7305"], /* CJK Ideograph */
+ ["\u7306", "\u7306"], /* CJK Ideograph */
+ ["\u7307", "\u7307"], /* CJK Ideograph */
+ ["\u7308", "\u7308"], /* CJK Ideograph */
+ ["\u7309", "\u7309"], /* CJK Ideograph */
+ ["\u730A", "\u730A"], /* CJK Ideograph */
+ ["\u730B", "\u730B"], /* CJK Ideograph */
+ ["\u730C", "\u730C"], /* CJK Ideograph */
+ ["\u730D", "\u730D"], /* CJK Ideograph */
+ ["\u730E", "\u730E"], /* CJK Ideograph */
+ ["\u730F", "\u730F"], /* CJK Ideograph */
+ ["\u7310", "\u7310"], /* CJK Ideograph */
+ ["\u7311", "\u7311"], /* CJK Ideograph */
+ ["\u7312", "\u7312"], /* CJK Ideograph */
+ ["\u7313", "\u7313"], /* CJK Ideograph */
+ ["\u7314", "\u7314"], /* CJK Ideograph */
+ ["\u7315", "\u7315"], /* CJK Ideograph */
+ ["\u7316", "\u7316"], /* CJK Ideograph */
+ ["\u7317", "\u7317"], /* CJK Ideograph */
+ ["\u7318", "\u7318"], /* CJK Ideograph */
+ ["\u7319", "\u7319"], /* CJK Ideograph */
+ ["\u731A", "\u731A"], /* CJK Ideograph */
+ ["\u731B", "\u731B"], /* CJK Ideograph */
+ ["\u731C", "\u731C"], /* CJK Ideograph */
+ ["\u731D", "\u731D"], /* CJK Ideograph */
+ ["\u731E", "\u731E"], /* CJK Ideograph */
+ ["\u731F", "\u731F"], /* CJK Ideograph */
+ ["\u7320", "\u7320"], /* CJK Ideograph */
+ ["\u7321", "\u7321"], /* CJK Ideograph */
+ ["\u7322", "\u7322"], /* CJK Ideograph */
+ ["\u7323", "\u7323"], /* CJK Ideograph */
+ ["\u7324", "\u7324"], /* CJK Ideograph */
+ ["\u7325", "\u7325"], /* CJK Ideograph */
+ ["\u7326", "\u7326"], /* CJK Ideograph */
+ ["\u7327", "\u7327"], /* CJK Ideograph */
+ ["\u7328", "\u7328"], /* CJK Ideograph */
+ ["\u7329", "\u7329"], /* CJK Ideograph */
+ ["\u732A", "\u732A"], /* CJK Ideograph */
+ ["\u732B", "\u732B"], /* CJK Ideograph */
+ ["\u732C", "\u732C"], /* CJK Ideograph */
+ ["\u732D", "\u732D"], /* CJK Ideograph */
+ ["\u732E", "\u732E"], /* CJK Ideograph */
+ ["\u732F", "\u732F"], /* CJK Ideograph */
+ ["\u7330", "\u7330"], /* CJK Ideograph */
+ ["\u7331", "\u7331"], /* CJK Ideograph */
+ ["\u7332", "\u7332"], /* CJK Ideograph */
+ ["\u7333", "\u7333"], /* CJK Ideograph */
+ ["\u7334", "\u7334"], /* CJK Ideograph */
+ ["\u7335", "\u7335"], /* CJK Ideograph */
+ ["\u7336", "\u7336"], /* CJK Ideograph */
+ ["\u7337", "\u7337"], /* CJK Ideograph */
+ ["\u7338", "\u7338"], /* CJK Ideograph */
+ ["\u7339", "\u7339"], /* CJK Ideograph */
+ ["\u733A", "\u733A"], /* CJK Ideograph */
+ ["\u733B", "\u733B"], /* CJK Ideograph */
+ ["\u733C", "\u733C"], /* CJK Ideograph */
+ ["\u733D", "\u733D"], /* CJK Ideograph */
+ ["\u733E", "\u733E"], /* CJK Ideograph */
+ ["\u733F", "\u733F"], /* CJK Ideograph */
+ ["\u7340", "\u7340"], /* CJK Ideograph */
+ ["\u7341", "\u7341"], /* CJK Ideograph */
+ ["\u7342", "\u7342"], /* CJK Ideograph */
+ ["\u7343", "\u7343"], /* CJK Ideograph */
+ ["\u7344", "\u7344"], /* CJK Ideograph */
+ ["\u7345", "\u7345"], /* CJK Ideograph */
+ ["\u7346", "\u7346"], /* CJK Ideograph */
+ ["\u7347", "\u7347"], /* CJK Ideograph */
+ ["\u7348", "\u7348"], /* CJK Ideograph */
+ ["\u7349", "\u7349"], /* CJK Ideograph */
+ ["\u734A", "\u734A"], /* CJK Ideograph */
+ ["\u734B", "\u734B"], /* CJK Ideograph */
+ ["\u734C", "\u734C"], /* CJK Ideograph */
+ ["\u734D", "\u734D"], /* CJK Ideograph */
+ ["\u734E", "\u734E"], /* CJK Ideograph */
+ ["\u734F", "\u734F"], /* CJK Ideograph */
+ ["\u7350", "\u7350"], /* CJK Ideograph */
+ ["\u7351", "\u7351"], /* CJK Ideograph */
+ ["\u7352", "\u7352"], /* CJK Ideograph */
+ ["\u7353", "\u7353"], /* CJK Ideograph */
+ ["\u7354", "\u7354"], /* CJK Ideograph */
+ ["\u7355", "\u7355"], /* CJK Ideograph */
+ ["\u7356", "\u7356"], /* CJK Ideograph */
+ ["\u7357", "\u7357"], /* CJK Ideograph */
+ ["\u7358", "\u7358"], /* CJK Ideograph */
+ ["\u7359", "\u7359"], /* CJK Ideograph */
+ ["\u735A", "\u735A"], /* CJK Ideograph */
+ ["\u735B", "\u735B"], /* CJK Ideograph */
+ ["\u735C", "\u735C"], /* CJK Ideograph */
+ ["\u735D", "\u735D"], /* CJK Ideograph */
+ ["\u735E", "\u735E"], /* CJK Ideograph */
+ ["\u735F", "\u735F"], /* CJK Ideograph */
+ ["\u7360", "\u7360"], /* CJK Ideograph */
+ ["\u7361", "\u7361"], /* CJK Ideograph */
+ ["\u7362", "\u7362"], /* CJK Ideograph */
+ ["\u7363", "\u7363"], /* CJK Ideograph */
+ ["\u7364", "\u7364"], /* CJK Ideograph */
+ ["\u7365", "\u7365"], /* CJK Ideograph */
+ ["\u7366", "\u7366"], /* CJK Ideograph */
+ ["\u7367", "\u7367"], /* CJK Ideograph */
+ ["\u7368", "\u7368"], /* CJK Ideograph */
+ ["\u7369", "\u7369"], /* CJK Ideograph */
+ ["\u736A", "\u736A"], /* CJK Ideograph */
+ ["\u736B", "\u736B"], /* CJK Ideograph */
+ ["\u736C", "\u736C"], /* CJK Ideograph */
+ ["\u736D", "\u736D"], /* CJK Ideograph */
+ ["\u736E", "\u736E"], /* CJK Ideograph */
+ ["\u736F", "\u736F"], /* CJK Ideograph */
+ ["\u7370", "\u7370"], /* CJK Ideograph */
+ ["\u7371", "\u7371"], /* CJK Ideograph */
+ ["\u7372", "\u7372"], /* CJK Ideograph */
+ ["\u7373", "\u7373"], /* CJK Ideograph */
+ ["\u7374", "\u7374"], /* CJK Ideograph */
+ ["\u7375", "\u7375"], /* CJK Ideograph */
+ ["\u7376", "\u7376"], /* CJK Ideograph */
+ ["\u7377", "\u7377"], /* CJK Ideograph */
+ ["\u7378", "\u7378"], /* CJK Ideograph */
+ ["\u7379", "\u7379"], /* CJK Ideograph */
+ ["\u737A", "\u737A"], /* CJK Ideograph */
+ ["\u737B", "\u737B"], /* CJK Ideograph */
+ ["\u737C", "\u737C"], /* CJK Ideograph */
+ ["\u737D", "\u737D"], /* CJK Ideograph */
+ ["\u737E", "\u737E"], /* CJK Ideograph */
+ ["\u737F", "\u737F"], /* CJK Ideograph */
+ ["\u7380", "\u7380"], /* CJK Ideograph */
+ ["\u7381", "\u7381"], /* CJK Ideograph */
+ ["\u7382", "\u7382"], /* CJK Ideograph */
+ ["\u7383", "\u7383"], /* CJK Ideograph */
+ ["\u7384", "\u7384"], /* CJK Ideograph */
+ ["\u7385", "\u7385"], /* CJK Ideograph */
+ ["\u7386", "\u7386"], /* CJK Ideograph */
+ ["\u7387", "\u7387"], /* CJK Ideograph */
+ ["\u7388", "\u7388"], /* CJK Ideograph */
+ ["\u7389", "\u7389"], /* CJK Ideograph */
+ ["\u738A", "\u738A"], /* CJK Ideograph */
+ ["\u738B", "\u738B"], /* CJK Ideograph */
+ ["\u738C", "\u738C"], /* CJK Ideograph */
+ ["\u738D", "\u738D"], /* CJK Ideograph */
+ ["\u738E", "\u738E"], /* CJK Ideograph */
+ ["\u738F", "\u738F"], /* CJK Ideograph */
+ ["\u7390", "\u7390"], /* CJK Ideograph */
+ ["\u7391", "\u7391"], /* CJK Ideograph */
+ ["\u7392", "\u7392"], /* CJK Ideograph */
+ ["\u7393", "\u7393"], /* CJK Ideograph */
+ ["\u7394", "\u7394"], /* CJK Ideograph */
+ ["\u7395", "\u7395"], /* CJK Ideograph */
+ ["\u7396", "\u7396"], /* CJK Ideograph */
+ ["\u7397", "\u7397"], /* CJK Ideograph */
+ ["\u7398", "\u7398"], /* CJK Ideograph */
+ ["\u7399", "\u7399"], /* CJK Ideograph */
+ ["\u739A", "\u739A"], /* CJK Ideograph */
+ ["\u739B", "\u739B"], /* CJK Ideograph */
+ ["\u739C", "\u739C"], /* CJK Ideograph */
+ ["\u739D", "\u739D"], /* CJK Ideograph */
+ ["\u739E", "\u739E"], /* CJK Ideograph */
+ ["\u739F", "\u739F"], /* CJK Ideograph */
+ ["\u73A0", "\u73A0"], /* CJK Ideograph */
+ ["\u73A1", "\u73A1"], /* CJK Ideograph */
+ ["\u73A2", "\u73A2"], /* CJK Ideograph */
+ ["\u73A3", "\u73A3"], /* CJK Ideograph */
+ ["\u73A4", "\u73A4"], /* CJK Ideograph */
+ ["\u73A5", "\u73A5"], /* CJK Ideograph */
+ ["\u73A6", "\u73A6"], /* CJK Ideograph */
+ ["\u73A7", "\u73A7"], /* CJK Ideograph */
+ ["\u73A8", "\u73A8"], /* CJK Ideograph */
+ ["\u73A9", "\u73A9"], /* CJK Ideograph */
+ ["\u73AA", "\u73AA"], /* CJK Ideograph */
+ ["\u73AB", "\u73AB"], /* CJK Ideograph */
+ ["\u73AC", "\u73AC"], /* CJK Ideograph */
+ ["\u73AD", "\u73AD"], /* CJK Ideograph */
+ ["\u73AE", "\u73AE"], /* CJK Ideograph */
+ ["\u73AF", "\u73AF"], /* CJK Ideograph */
+ ["\u73B0", "\u73B0"], /* CJK Ideograph */
+ ["\u73B1", "\u73B1"], /* CJK Ideograph */
+ ["\u73B2", "\u73B2"], /* CJK Ideograph */
+ ["\u73B3", "\u73B3"], /* CJK Ideograph */
+ ["\u73B4", "\u73B4"], /* CJK Ideograph */
+ ["\u73B5", "\u73B5"], /* CJK Ideograph */
+ ["\u73B6", "\u73B6"], /* CJK Ideograph */
+ ["\u73B7", "\u73B7"], /* CJK Ideograph */
+ ["\u73B8", "\u73B8"], /* CJK Ideograph */
+ ["\u73B9", "\u73B9"], /* CJK Ideograph */
+ ["\u73BA", "\u73BA"], /* CJK Ideograph */
+ ["\u73BB", "\u73BB"], /* CJK Ideograph */
+ ["\u73BC", "\u73BC"], /* CJK Ideograph */
+ ["\u73BD", "\u73BD"], /* CJK Ideograph */
+ ["\u73BE", "\u73BE"], /* CJK Ideograph */
+ ["\u73BF", "\u73BF"], /* CJK Ideograph */
+ ["\u73C0", "\u73C0"], /* CJK Ideograph */
+ ["\u73C1", "\u73C1"], /* CJK Ideograph */
+ ["\u73C2", "\u73C2"], /* CJK Ideograph */
+ ["\u73C3", "\u73C3"], /* CJK Ideograph */
+ ["\u73C4", "\u73C4"], /* CJK Ideograph */
+ ["\u73C5", "\u73C5"], /* CJK Ideograph */
+ ["\u73C6", "\u73C6"], /* CJK Ideograph */
+ ["\u73C7", "\u73C7"], /* CJK Ideograph */
+ ["\u73C8", "\u73C8"], /* CJK Ideograph */
+ ["\u73C9", "\u73C9"], /* CJK Ideograph */
+ ["\u73CA", "\u73CA"], /* CJK Ideograph */
+ ["\u73CB", "\u73CB"], /* CJK Ideograph */
+ ["\u73CC", "\u73CC"], /* CJK Ideograph */
+ ["\u73CD", "\u73CD"], /* CJK Ideograph */
+ ["\u73CE", "\u73CE"], /* CJK Ideograph */
+ ["\u73CF", "\u73CF"], /* CJK Ideograph */
+ ["\u73D0", "\u73D0"], /* CJK Ideograph */
+ ["\u73D1", "\u73D1"], /* CJK Ideograph */
+ ["\u73D2", "\u73D2"], /* CJK Ideograph */
+ ["\u73D3", "\u73D3"], /* CJK Ideograph */
+ ["\u73D4", "\u73D4"], /* CJK Ideograph */
+ ["\u73D5", "\u73D5"], /* CJK Ideograph */
+ ["\u73D6", "\u73D6"], /* CJK Ideograph */
+ ["\u73D7", "\u73D7"], /* CJK Ideograph */
+ ["\u73D8", "\u73D8"], /* CJK Ideograph */
+ ["\u73D9", "\u73D9"], /* CJK Ideograph */
+ ["\u73DA", "\u73DA"], /* CJK Ideograph */
+ ["\u73DB", "\u73DB"], /* CJK Ideograph */
+ ["\u73DC", "\u73DC"], /* CJK Ideograph */
+ ["\u73DD", "\u73DD"], /* CJK Ideograph */
+ ["\u73DE", "\u73DE"], /* CJK Ideograph */
+ ["\u73DF", "\u73DF"], /* CJK Ideograph */
+ ["\u73E0", "\u73E0"], /* CJK Ideograph */
+ ["\u73E1", "\u73E1"], /* CJK Ideograph */
+ ["\u73E2", "\u73E2"], /* CJK Ideograph */
+ ["\u73E3", "\u73E3"], /* CJK Ideograph */
+ ["\u73E4", "\u73E4"], /* CJK Ideograph */
+ ["\u73E5", "\u73E5"], /* CJK Ideograph */
+ ["\u73E6", "\u73E6"], /* CJK Ideograph */
+ ["\u73E7", "\u73E7"], /* CJK Ideograph */
+ ["\u73E8", "\u73E8"], /* CJK Ideograph */
+ ["\u73E9", "\u73E9"], /* CJK Ideograph */
+ ["\u73EA", "\u73EA"], /* CJK Ideograph */
+ ["\u73EB", "\u73EB"], /* CJK Ideograph */
+ ["\u73EC", "\u73EC"], /* CJK Ideograph */
+ ["\u73ED", "\u73ED"], /* CJK Ideograph */
+ ["\u73EE", "\u73EE"], /* CJK Ideograph */
+ ["\u73EF", "\u73EF"], /* CJK Ideograph */
+ ["\u73F0", "\u73F0"], /* CJK Ideograph */
+ ["\u73F1", "\u73F1"], /* CJK Ideograph */
+ ["\u73F2", "\u73F2"], /* CJK Ideograph */
+ ["\u73F3", "\u73F3"], /* CJK Ideograph */
+ ["\u73F4", "\u73F4"], /* CJK Ideograph */
+ ["\u73F5", "\u73F5"], /* CJK Ideograph */
+ ["\u73F6", "\u73F6"], /* CJK Ideograph */
+ ["\u73F7", "\u73F7"], /* CJK Ideograph */
+ ["\u73F8", "\u73F8"], /* CJK Ideograph */
+ ["\u73F9", "\u73F9"], /* CJK Ideograph */
+ ["\u73FA", "\u73FA"], /* CJK Ideograph */
+ ["\u73FB", "\u73FB"], /* CJK Ideograph */
+ ["\u73FC", "\u73FC"], /* CJK Ideograph */
+ ["\u73FD", "\u73FD"], /* CJK Ideograph */
+ ["\u73FE", "\u73FE"], /* CJK Ideograph */
+ ["\u73FF", "\u73FF"], /* CJK Ideograph */
+ ["\u7400", "\u7400"], /* CJK Ideograph */
+ ["\u7401", "\u7401"], /* CJK Ideograph */
+ ["\u7402", "\u7402"], /* CJK Ideograph */
+ ["\u7403", "\u7403"], /* CJK Ideograph */
+ ["\u7404", "\u7404"], /* CJK Ideograph */
+ ["\u7405", "\u7405"], /* CJK Ideograph */
+ ["\u7406", "\u7406"], /* CJK Ideograph */
+ ["\u7407", "\u7407"], /* CJK Ideograph */
+ ["\u7408", "\u7408"], /* CJK Ideograph */
+ ["\u7409", "\u7409"], /* CJK Ideograph */
+ ["\u740A", "\u740A"], /* CJK Ideograph */
+ ["\u740B", "\u740B"], /* CJK Ideograph */
+ ["\u740C", "\u740C"], /* CJK Ideograph */
+ ["\u740D", "\u740D"], /* CJK Ideograph */
+ ["\u740E", "\u740E"], /* CJK Ideograph */
+ ["\u740F", "\u740F"], /* CJK Ideograph */
+ ["\u7410", "\u7410"], /* CJK Ideograph */
+ ["\u7411", "\u7411"], /* CJK Ideograph */
+ ["\u7412", "\u7412"], /* CJK Ideograph */
+ ["\u7413", "\u7413"], /* CJK Ideograph */
+ ["\u7414", "\u7414"], /* CJK Ideograph */
+ ["\u7415", "\u7415"], /* CJK Ideograph */
+ ["\u7416", "\u7416"], /* CJK Ideograph */
+ ["\u7417", "\u7417"], /* CJK Ideograph */
+ ["\u7418", "\u7418"], /* CJK Ideograph */
+ ["\u7419", "\u7419"], /* CJK Ideograph */
+ ["\u741A", "\u741A"], /* CJK Ideograph */
+ ["\u741B", "\u741B"], /* CJK Ideograph */
+ ["\u741C", "\u741C"], /* CJK Ideograph */
+ ["\u741D", "\u741D"], /* CJK Ideograph */
+ ["\u741E", "\u741E"], /* CJK Ideograph */
+ ["\u741F", "\u741F"], /* CJK Ideograph */
+ ["\u7420", "\u7420"], /* CJK Ideograph */
+ ["\u7421", "\u7421"], /* CJK Ideograph */
+ ["\u7422", "\u7422"], /* CJK Ideograph */
+ ["\u7423", "\u7423"], /* CJK Ideograph */
+ ["\u7424", "\u7424"], /* CJK Ideograph */
+ ["\u7425", "\u7425"], /* CJK Ideograph */
+ ["\u7426", "\u7426"], /* CJK Ideograph */
+ ["\u7427", "\u7427"], /* CJK Ideograph */
+ ["\u7428", "\u7428"], /* CJK Ideograph */
+ ["\u7429", "\u7429"], /* CJK Ideograph */
+ ["\u742A", "\u742A"], /* CJK Ideograph */
+ ["\u742B", "\u742B"], /* CJK Ideograph */
+ ["\u742C", "\u742C"], /* CJK Ideograph */
+ ["\u742D", "\u742D"], /* CJK Ideograph */
+ ["\u742E", "\u742E"], /* CJK Ideograph */
+ ["\u742F", "\u742F"], /* CJK Ideograph */
+ ["\u7430", "\u7430"], /* CJK Ideograph */
+ ["\u7431", "\u7431"], /* CJK Ideograph */
+ ["\u7432", "\u7432"], /* CJK Ideograph */
+ ["\u7433", "\u7433"], /* CJK Ideograph */
+ ["\u7434", "\u7434"], /* CJK Ideograph */
+ ["\u7435", "\u7435"], /* CJK Ideograph */
+ ["\u7436", "\u7436"], /* CJK Ideograph */
+ ["\u7437", "\u7437"], /* CJK Ideograph */
+ ["\u7438", "\u7438"], /* CJK Ideograph */
+ ["\u7439", "\u7439"], /* CJK Ideograph */
+ ["\u743A", "\u743A"], /* CJK Ideograph */
+ ["\u743B", "\u743B"], /* CJK Ideograph */
+ ["\u743C", "\u743C"], /* CJK Ideograph */
+ ["\u743D", "\u743D"], /* CJK Ideograph */
+ ["\u743E", "\u743E"], /* CJK Ideograph */
+ ["\u743F", "\u743F"], /* CJK Ideograph */
+ ["\u7440", "\u7440"], /* CJK Ideograph */
+ ["\u7441", "\u7441"], /* CJK Ideograph */
+ ["\u7442", "\u7442"], /* CJK Ideograph */
+ ["\u7443", "\u7443"], /* CJK Ideograph */
+ ["\u7444", "\u7444"], /* CJK Ideograph */
+ ["\u7445", "\u7445"], /* CJK Ideograph */
+ ["\u7446", "\u7446"], /* CJK Ideograph */
+ ["\u7447", "\u7447"], /* CJK Ideograph */
+ ["\u7448", "\u7448"], /* CJK Ideograph */
+ ["\u7449", "\u7449"], /* CJK Ideograph */
+ ["\u744A", "\u744A"], /* CJK Ideograph */
+ ["\u744B", "\u744B"], /* CJK Ideograph */
+ ["\u744C", "\u744C"], /* CJK Ideograph */
+ ["\u744D", "\u744D"], /* CJK Ideograph */
+ ["\u744E", "\u744E"], /* CJK Ideograph */
+ ["\u744F", "\u744F"], /* CJK Ideograph */
+ ["\u7450", "\u7450"], /* CJK Ideograph */
+ ["\u7451", "\u7451"], /* CJK Ideograph */
+ ["\u7452", "\u7452"], /* CJK Ideograph */
+ ["\u7453", "\u7453"], /* CJK Ideograph */
+ ["\u7454", "\u7454"], /* CJK Ideograph */
+ ["\u7455", "\u7455"], /* CJK Ideograph */
+ ["\u7456", "\u7456"], /* CJK Ideograph */
+ ["\u7457", "\u7457"], /* CJK Ideograph */
+ ["\u7458", "\u7458"], /* CJK Ideograph */
+ ["\u7459", "\u7459"], /* CJK Ideograph */
+ ["\u745A", "\u745A"], /* CJK Ideograph */
+ ["\u745B", "\u745B"], /* CJK Ideograph */
+ ["\u745C", "\u745C"], /* CJK Ideograph */
+ ["\u745D", "\u745D"], /* CJK Ideograph */
+ ["\u745E", "\u745E"], /* CJK Ideograph */
+ ["\u745F", "\u745F"], /* CJK Ideograph */
+ ["\u7460", "\u7460"], /* CJK Ideograph */
+ ["\u7461", "\u7461"], /* CJK Ideograph */
+ ["\u7462", "\u7462"], /* CJK Ideograph */
+ ["\u7463", "\u7463"], /* CJK Ideograph */
+ ["\u7464", "\u7464"], /* CJK Ideograph */
+ ["\u7465", "\u7465"], /* CJK Ideograph */
+ ["\u7466", "\u7466"], /* CJK Ideograph */
+ ["\u7467", "\u7467"], /* CJK Ideograph */
+ ["\u7468", "\u7468"], /* CJK Ideograph */
+ ["\u7469", "\u7469"], /* CJK Ideograph */
+ ["\u746A", "\u746A"], /* CJK Ideograph */
+ ["\u746B", "\u746B"], /* CJK Ideograph */
+ ["\u746C", "\u746C"], /* CJK Ideograph */
+ ["\u746D", "\u746D"], /* CJK Ideograph */
+ ["\u746E", "\u746E"], /* CJK Ideograph */
+ ["\u746F", "\u746F"], /* CJK Ideograph */
+ ["\u7470", "\u7470"], /* CJK Ideograph */
+ ["\u7471", "\u7471"], /* CJK Ideograph */
+ ["\u7472", "\u7472"], /* CJK Ideograph */
+ ["\u7473", "\u7473"], /* CJK Ideograph */
+ ["\u7474", "\u7474"], /* CJK Ideograph */
+ ["\u7475", "\u7475"], /* CJK Ideograph */
+ ["\u7476", "\u7476"], /* CJK Ideograph */
+ ["\u7477", "\u7477"], /* CJK Ideograph */
+ ["\u7478", "\u7478"], /* CJK Ideograph */
+ ["\u7479", "\u7479"], /* CJK Ideograph */
+ ["\u747A", "\u747A"], /* CJK Ideograph */
+ ["\u747B", "\u747B"], /* CJK Ideograph */
+ ["\u747C", "\u747C"], /* CJK Ideograph */
+ ["\u747D", "\u747D"], /* CJK Ideograph */
+ ["\u747E", "\u747E"], /* CJK Ideograph */
+ ["\u747F", "\u747F"], /* CJK Ideograph */
+ ["\u7480", "\u7480"], /* CJK Ideograph */
+ ["\u7481", "\u7481"], /* CJK Ideograph */
+ ["\u7482", "\u7482"], /* CJK Ideograph */
+ ["\u7483", "\u7483"], /* CJK Ideograph */
+ ["\u7484", "\u7484"], /* CJK Ideograph */
+ ["\u7485", "\u7485"], /* CJK Ideograph */
+ ["\u7486", "\u7486"], /* CJK Ideograph */
+ ["\u7487", "\u7487"], /* CJK Ideograph */
+ ["\u7488", "\u7488"], /* CJK Ideograph */
+ ["\u7489", "\u7489"], /* CJK Ideograph */
+ ["\u748A", "\u748A"], /* CJK Ideograph */
+ ["\u748B", "\u748B"], /* CJK Ideograph */
+ ["\u748C", "\u748C"], /* CJK Ideograph */
+ ["\u748D", "\u748D"], /* CJK Ideograph */
+ ["\u748E", "\u748E"], /* CJK Ideograph */
+ ["\u748F", "\u748F"], /* CJK Ideograph */
+ ["\u7490", "\u7490"], /* CJK Ideograph */
+ ["\u7491", "\u7491"], /* CJK Ideograph */
+ ["\u7492", "\u7492"], /* CJK Ideograph */
+ ["\u7493", "\u7493"], /* CJK Ideograph */
+ ["\u7494", "\u7494"], /* CJK Ideograph */
+ ["\u7495", "\u7495"], /* CJK Ideograph */
+ ["\u7496", "\u7496"], /* CJK Ideograph */
+ ["\u7497", "\u7497"], /* CJK Ideograph */
+ ["\u7498", "\u7498"], /* CJK Ideograph */
+ ["\u7499", "\u7499"], /* CJK Ideograph */
+ ["\u749A", "\u749A"], /* CJK Ideograph */
+ ["\u749B", "\u749B"], /* CJK Ideograph */
+ ["\u749C", "\u749C"], /* CJK Ideograph */
+ ["\u749D", "\u749D"], /* CJK Ideograph */
+ ["\u749E", "\u749E"], /* CJK Ideograph */
+ ["\u749F", "\u749F"], /* CJK Ideograph */
+ ["\u74A0", "\u74A0"], /* CJK Ideograph */
+ ["\u74A1", "\u74A1"], /* CJK Ideograph */
+ ["\u74A2", "\u74A2"], /* CJK Ideograph */
+ ["\u74A3", "\u74A3"], /* CJK Ideograph */
+ ["\u74A4", "\u74A4"], /* CJK Ideograph */
+ ["\u74A5", "\u74A5"], /* CJK Ideograph */
+ ["\u74A6", "\u74A6"], /* CJK Ideograph */
+ ["\u74A7", "\u74A7"], /* CJK Ideograph */
+ ["\u74A8", "\u74A8"], /* CJK Ideograph */
+ ["\u74A9", "\u74A9"], /* CJK Ideograph */
+ ["\u74AA", "\u74AA"], /* CJK Ideograph */
+ ["\u74AB", "\u74AB"], /* CJK Ideograph */
+ ["\u74AC", "\u74AC"], /* CJK Ideograph */
+ ["\u74AD", "\u74AD"], /* CJK Ideograph */
+ ["\u74AE", "\u74AE"], /* CJK Ideograph */
+ ["\u74AF", "\u74AF"], /* CJK Ideograph */
+ ["\u74B0", "\u74B0"], /* CJK Ideograph */
+ ["\u74B1", "\u74B1"], /* CJK Ideograph */
+ ["\u74B2", "\u74B2"], /* CJK Ideograph */
+ ["\u74B3", "\u74B3"], /* CJK Ideograph */
+ ["\u74B4", "\u74B4"], /* CJK Ideograph */
+ ["\u74B5", "\u74B5"], /* CJK Ideograph */
+ ["\u74B6", "\u74B6"], /* CJK Ideograph */
+ ["\u74B7", "\u74B7"], /* CJK Ideograph */
+ ["\u74B8", "\u74B8"], /* CJK Ideograph */
+ ["\u74B9", "\u74B9"], /* CJK Ideograph */
+ ["\u74BA", "\u74BA"], /* CJK Ideograph */
+ ["\u74BB", "\u74BB"], /* CJK Ideograph */
+ ["\u74BC", "\u74BC"], /* CJK Ideograph */
+ ["\u74BD", "\u74BD"], /* CJK Ideograph */
+ ["\u74BE", "\u74BE"], /* CJK Ideograph */
+ ["\u74BF", "\u74BF"], /* CJK Ideograph */
+ ["\u74C0", "\u74C0"], /* CJK Ideograph */
+ ["\u74C1", "\u74C1"], /* CJK Ideograph */
+ ["\u74C2", "\u74C2"], /* CJK Ideograph */
+ ["\u74C3", "\u74C3"], /* CJK Ideograph */
+ ["\u74C4", "\u74C4"], /* CJK Ideograph */
+ ["\u74C5", "\u74C5"], /* CJK Ideograph */
+ ["\u74C6", "\u74C6"], /* CJK Ideograph */
+ ["\u74C7", "\u74C7"], /* CJK Ideograph */
+ ["\u74C8", "\u74C8"], /* CJK Ideograph */
+ ["\u74C9", "\u74C9"], /* CJK Ideograph */
+ ["\u74CA", "\u74CA"], /* CJK Ideograph */
+ ["\u74CB", "\u74CB"], /* CJK Ideograph */
+ ["\u74CC", "\u74CC"], /* CJK Ideograph */
+ ["\u74CD", "\u74CD"], /* CJK Ideograph */
+ ["\u74CE", "\u74CE"], /* CJK Ideograph */
+ ["\u74CF", "\u74CF"], /* CJK Ideograph */
+ ["\u74D0", "\u74D0"], /* CJK Ideograph */
+ ["\u74D1", "\u74D1"], /* CJK Ideograph */
+ ["\u74D2", "\u74D2"], /* CJK Ideograph */
+ ["\u74D3", "\u74D3"], /* CJK Ideograph */
+ ["\u74D4", "\u74D4"], /* CJK Ideograph */
+ ["\u74D5", "\u74D5"], /* CJK Ideograph */
+ ["\u74D6", "\u74D6"], /* CJK Ideograph */
+ ["\u74D7", "\u74D7"], /* CJK Ideograph */
+ ["\u74D8", "\u74D8"], /* CJK Ideograph */
+ ["\u74D9", "\u74D9"], /* CJK Ideograph */
+ ["\u74DA", "\u74DA"], /* CJK Ideograph */
+ ["\u74DB", "\u74DB"], /* CJK Ideograph */
+ ["\u74DC", "\u74DC"], /* CJK Ideograph */
+ ["\u74DD", "\u74DD"], /* CJK Ideograph */
+ ["\u74DE", "\u74DE"], /* CJK Ideograph */
+ ["\u74DF", "\u74DF"], /* CJK Ideograph */
+ ["\u74E0", "\u74E0"], /* CJK Ideograph */
+ ["\u74E1", "\u74E1"], /* CJK Ideograph */
+ ["\u74E2", "\u74E2"], /* CJK Ideograph */
+ ["\u74E3", "\u74E3"], /* CJK Ideograph */
+ ["\u74E4", "\u74E4"], /* CJK Ideograph */
+ ["\u74E5", "\u74E5"], /* CJK Ideograph */
+ ["\u74E6", "\u74E6"], /* CJK Ideograph */
+ ["\u74E7", "\u74E7"], /* CJK Ideograph */
+ ["\u74E8", "\u74E8"], /* CJK Ideograph */
+ ["\u74E9", "\u74E9"], /* CJK Ideograph */
+ ["\u74EA", "\u74EA"], /* CJK Ideograph */
+ ["\u74EB", "\u74EB"], /* CJK Ideograph */
+ ["\u74EC", "\u74EC"], /* CJK Ideograph */
+ ["\u74ED", "\u74ED"], /* CJK Ideograph */
+ ["\u74EE", "\u74EE"], /* CJK Ideograph */
+ ["\u74EF", "\u74EF"], /* CJK Ideograph */
+ ["\u74F0", "\u74F0"], /* CJK Ideograph */
+ ["\u74F1", "\u74F1"], /* CJK Ideograph */
+ ["\u74F2", "\u74F2"], /* CJK Ideograph */
+ ["\u74F3", "\u74F3"], /* CJK Ideograph */
+ ["\u74F4", "\u74F4"], /* CJK Ideograph */
+ ["\u74F5", "\u74F5"], /* CJK Ideograph */
+ ["\u74F6", "\u74F6"], /* CJK Ideograph */
+ ["\u74F7", "\u74F7"], /* CJK Ideograph */
+ ["\u74F8", "\u74F8"], /* CJK Ideograph */
+ ["\u74F9", "\u74F9"], /* CJK Ideograph */
+ ["\u74FA", "\u74FA"], /* CJK Ideograph */
+ ["\u74FB", "\u74FB"], /* CJK Ideograph */
+ ["\u74FC", "\u74FC"], /* CJK Ideograph */
+ ["\u74FD", "\u74FD"], /* CJK Ideograph */
+ ["\u74FE", "\u74FE"], /* CJK Ideograph */
+ ["\u74FF", "\u74FF"], /* CJK Ideograph */
+ ["\u7500", "\u7500"], /* CJK Ideograph */
+ ["\u7501", "\u7501"], /* CJK Ideograph */
+ ["\u7502", "\u7502"], /* CJK Ideograph */
+ ["\u7503", "\u7503"], /* CJK Ideograph */
+ ["\u7504", "\u7504"], /* CJK Ideograph */
+ ["\u7505", "\u7505"], /* CJK Ideograph */
+ ["\u7506", "\u7506"], /* CJK Ideograph */
+ ["\u7507", "\u7507"], /* CJK Ideograph */
+ ["\u7508", "\u7508"], /* CJK Ideograph */
+ ["\u7509", "\u7509"], /* CJK Ideograph */
+ ["\u750A", "\u750A"], /* CJK Ideograph */
+ ["\u750B", "\u750B"], /* CJK Ideograph */
+ ["\u750C", "\u750C"], /* CJK Ideograph */
+ ["\u750D", "\u750D"], /* CJK Ideograph */
+ ["\u750E", "\u750E"], /* CJK Ideograph */
+ ["\u750F", "\u750F"], /* CJK Ideograph */
+ ["\u7510", "\u7510"], /* CJK Ideograph */
+ ["\u7511", "\u7511"], /* CJK Ideograph */
+ ["\u7512", "\u7512"], /* CJK Ideograph */
+ ["\u7513", "\u7513"], /* CJK Ideograph */
+ ["\u7514", "\u7514"], /* CJK Ideograph */
+ ["\u7515", "\u7515"], /* CJK Ideograph */
+ ["\u7516", "\u7516"], /* CJK Ideograph */
+ ["\u7517", "\u7517"], /* CJK Ideograph */
+ ["\u7518", "\u7518"], /* CJK Ideograph */
+ ["\u7519", "\u7519"], /* CJK Ideograph */
+ ["\u751A", "\u751A"], /* CJK Ideograph */
+ ["\u751B", "\u751B"], /* CJK Ideograph */
+ ["\u751C", "\u751C"], /* CJK Ideograph */
+ ["\u751D", "\u751D"], /* CJK Ideograph */
+ ["\u751E", "\u751E"], /* CJK Ideograph */
+ ["\u751F", "\u751F"], /* CJK Ideograph */
+ ["\u7520", "\u7520"], /* CJK Ideograph */
+ ["\u7521", "\u7521"], /* CJK Ideograph */
+ ["\u7522", "\u7522"], /* CJK Ideograph */
+ ["\u7523", "\u7523"], /* CJK Ideograph */
+ ["\u7524", "\u7524"], /* CJK Ideograph */
+ ["\u7525", "\u7525"], /* CJK Ideograph */
+ ["\u7526", "\u7526"], /* CJK Ideograph */
+ ["\u7527", "\u7527"], /* CJK Ideograph */
+ ["\u7528", "\u7528"], /* CJK Ideograph */
+ ["\u7529", "\u7529"], /* CJK Ideograph */
+ ["\u752A", "\u752A"], /* CJK Ideograph */
+ ["\u752B", "\u752B"], /* CJK Ideograph */
+ ["\u752C", "\u752C"], /* CJK Ideograph */
+ ["\u752D", "\u752D"], /* CJK Ideograph */
+ ["\u752E", "\u752E"], /* CJK Ideograph */
+ ["\u752F", "\u752F"], /* CJK Ideograph */
+ ["\u7530", "\u7530"], /* CJK Ideograph */
+ ["\u7531", "\u7531"], /* CJK Ideograph */
+ ["\u7532", "\u7532"], /* CJK Ideograph */
+ ["\u7533", "\u7533"], /* CJK Ideograph */
+ ["\u7534", "\u7534"], /* CJK Ideograph */
+ ["\u7535", "\u7535"], /* CJK Ideograph */
+ ["\u7536", "\u7536"], /* CJK Ideograph */
+ ["\u7537", "\u7537"], /* CJK Ideograph */
+ ["\u7538", "\u7538"], /* CJK Ideograph */
+ ["\u7539", "\u7539"], /* CJK Ideograph */
+ ["\u753A", "\u753A"], /* CJK Ideograph */
+ ["\u753B", "\u753B"], /* CJK Ideograph */
+ ["\u753C", "\u753C"], /* CJK Ideograph */
+ ["\u753D", "\u753D"], /* CJK Ideograph */
+ ["\u753E", "\u753E"], /* CJK Ideograph */
+ ["\u753F", "\u753F"], /* CJK Ideograph */
+ ["\u7540", "\u7540"], /* CJK Ideograph */
+ ["\u7541", "\u7541"], /* CJK Ideograph */
+ ["\u7542", "\u7542"], /* CJK Ideograph */
+ ["\u7543", "\u7543"], /* CJK Ideograph */
+ ["\u7544", "\u7544"], /* CJK Ideograph */
+ ["\u7545", "\u7545"], /* CJK Ideograph */
+ ["\u7546", "\u7546"], /* CJK Ideograph */
+ ["\u7547", "\u7547"], /* CJK Ideograph */
+ ["\u7548", "\u7548"], /* CJK Ideograph */
+ ["\u7549", "\u7549"], /* CJK Ideograph */
+ ["\u754A", "\u754A"], /* CJK Ideograph */
+ ["\u754B", "\u754B"], /* CJK Ideograph */
+ ["\u754C", "\u754C"], /* CJK Ideograph */
+ ["\u754D", "\u754D"], /* CJK Ideograph */
+ ["\u754E", "\u754E"], /* CJK Ideograph */
+ ["\u754F", "\u754F"], /* CJK Ideograph */
+ ["\u7550", "\u7550"], /* CJK Ideograph */
+ ["\u7551", "\u7551"], /* CJK Ideograph */
+ ["\u7552", "\u7552"], /* CJK Ideograph */
+ ["\u7553", "\u7553"], /* CJK Ideograph */
+ ["\u7554", "\u7554"], /* CJK Ideograph */
+ ["\u7555", "\u7555"], /* CJK Ideograph */
+ ["\u7556", "\u7556"], /* CJK Ideograph */
+ ["\u7557", "\u7557"], /* CJK Ideograph */
+ ["\u7558", "\u7558"], /* CJK Ideograph */
+ ["\u7559", "\u7559"], /* CJK Ideograph */
+ ["\u755A", "\u755A"], /* CJK Ideograph */
+ ["\u755B", "\u755B"], /* CJK Ideograph */
+ ["\u755C", "\u755C"], /* CJK Ideograph */
+ ["\u755D", "\u755D"], /* CJK Ideograph */
+ ["\u755E", "\u755E"], /* CJK Ideograph */
+ ["\u755F", "\u755F"], /* CJK Ideograph */
+ ["\u7560", "\u7560"], /* CJK Ideograph */
+ ["\u7561", "\u7561"], /* CJK Ideograph */
+ ["\u7562", "\u7562"], /* CJK Ideograph */
+ ["\u7563", "\u7563"], /* CJK Ideograph */
+ ["\u7564", "\u7564"], /* CJK Ideograph */
+ ["\u7565", "\u7565"], /* CJK Ideograph */
+ ["\u7566", "\u7566"], /* CJK Ideograph */
+ ["\u7567", "\u7567"], /* CJK Ideograph */
+ ["\u7568", "\u7568"], /* CJK Ideograph */
+ ["\u7569", "\u7569"], /* CJK Ideograph */
+ ["\u756A", "\u756A"], /* CJK Ideograph */
+ ["\u756B", "\u756B"], /* CJK Ideograph */
+ ["\u756C", "\u756C"], /* CJK Ideograph */
+ ["\u756D", "\u756D"], /* CJK Ideograph */
+ ["\u756E", "\u756E"], /* CJK Ideograph */
+ ["\u756F", "\u756F"], /* CJK Ideograph */
+ ["\u7570", "\u7570"], /* CJK Ideograph */
+ ["\u7571", "\u7571"], /* CJK Ideograph */
+ ["\u7572", "\u7572"], /* CJK Ideograph */
+ ["\u7573", "\u7573"], /* CJK Ideograph */
+ ["\u7574", "\u7574"], /* CJK Ideograph */
+ ["\u7575", "\u7575"], /* CJK Ideograph */
+ ["\u7576", "\u7576"], /* CJK Ideograph */
+ ["\u7577", "\u7577"], /* CJK Ideograph */
+ ["\u7578", "\u7578"], /* CJK Ideograph */
+ ["\u7579", "\u7579"], /* CJK Ideograph */
+ ["\u757A", "\u757A"], /* CJK Ideograph */
+ ["\u757B", "\u757B"], /* CJK Ideograph */
+ ["\u757C", "\u757C"], /* CJK Ideograph */
+ ["\u757D", "\u757D"], /* CJK Ideograph */
+ ["\u757E", "\u757E"], /* CJK Ideograph */
+ ["\u757F", "\u757F"], /* CJK Ideograph */
+ ["\u7580", "\u7580"], /* CJK Ideograph */
+ ["\u7581", "\u7581"], /* CJK Ideograph */
+ ["\u7582", "\u7582"], /* CJK Ideograph */
+ ["\u7583", "\u7583"], /* CJK Ideograph */
+ ["\u7584", "\u7584"], /* CJK Ideograph */
+ ["\u7585", "\u7585"], /* CJK Ideograph */
+ ["\u7586", "\u7586"], /* CJK Ideograph */
+ ["\u7587", "\u7587"], /* CJK Ideograph */
+ ["\u7588", "\u7588"], /* CJK Ideograph */
+ ["\u7589", "\u7589"], /* CJK Ideograph */
+ ["\u758A", "\u758A"], /* CJK Ideograph */
+ ["\u758B", "\u758B"], /* CJK Ideograph */
+ ["\u758C", "\u758C"], /* CJK Ideograph */
+ ["\u758D", "\u758D"], /* CJK Ideograph */
+ ["\u758E", "\u758E"], /* CJK Ideograph */
+ ["\u758F", "\u758F"], /* CJK Ideograph */
+ ["\u7590", "\u7590"], /* CJK Ideograph */
+ ["\u7591", "\u7591"], /* CJK Ideograph */
+ ["\u7592", "\u7592"], /* CJK Ideograph */
+ ["\u7593", "\u7593"], /* CJK Ideograph */
+ ["\u7594", "\u7594"], /* CJK Ideograph */
+ ["\u7595", "\u7595"], /* CJK Ideograph */
+ ["\u7596", "\u7596"], /* CJK Ideograph */
+ ["\u7597", "\u7597"], /* CJK Ideograph */
+ ["\u7598", "\u7598"], /* CJK Ideograph */
+ ["\u7599", "\u7599"], /* CJK Ideograph */
+ ["\u759A", "\u759A"], /* CJK Ideograph */
+ ["\u759B", "\u759B"], /* CJK Ideograph */
+ ["\u759C", "\u759C"], /* CJK Ideograph */
+ ["\u759D", "\u759D"], /* CJK Ideograph */
+ ["\u759E", "\u759E"], /* CJK Ideograph */
+ ["\u759F", "\u759F"], /* CJK Ideograph */
+ ["\u75A0", "\u75A0"], /* CJK Ideograph */
+ ["\u75A1", "\u75A1"], /* CJK Ideograph */
+ ["\u75A2", "\u75A2"], /* CJK Ideograph */
+ ["\u75A3", "\u75A3"], /* CJK Ideograph */
+ ["\u75A4", "\u75A4"], /* CJK Ideograph */
+ ["\u75A5", "\u75A5"], /* CJK Ideograph */
+ ["\u75A6", "\u75A6"], /* CJK Ideograph */
+ ["\u75A7", "\u75A7"], /* CJK Ideograph */
+ ["\u75A8", "\u75A8"], /* CJK Ideograph */
+ ["\u75A9", "\u75A9"], /* CJK Ideograph */
+ ["\u75AA", "\u75AA"], /* CJK Ideograph */
+ ["\u75AB", "\u75AB"], /* CJK Ideograph */
+ ["\u75AC", "\u75AC"], /* CJK Ideograph */
+ ["\u75AD", "\u75AD"], /* CJK Ideograph */
+ ["\u75AE", "\u75AE"], /* CJK Ideograph */
+ ["\u75AF", "\u75AF"], /* CJK Ideograph */
+ ["\u75B0", "\u75B0"], /* CJK Ideograph */
+ ["\u75B1", "\u75B1"], /* CJK Ideograph */
+ ["\u75B2", "\u75B2"], /* CJK Ideograph */
+ ["\u75B3", "\u75B3"], /* CJK Ideograph */
+ ["\u75B4", "\u75B4"], /* CJK Ideograph */
+ ["\u75B5", "\u75B5"], /* CJK Ideograph */
+ ["\u75B6", "\u75B6"], /* CJK Ideograph */
+ ["\u75B7", "\u75B7"], /* CJK Ideograph */
+ ["\u75B8", "\u75B8"], /* CJK Ideograph */
+ ["\u75B9", "\u75B9"], /* CJK Ideograph */
+ ["\u75BA", "\u75BA"], /* CJK Ideograph */
+ ["\u75BB", "\u75BB"], /* CJK Ideograph */
+ ["\u75BC", "\u75BC"], /* CJK Ideograph */
+ ["\u75BD", "\u75BD"], /* CJK Ideograph */
+ ["\u75BE", "\u75BE"], /* CJK Ideograph */
+ ["\u75BF", "\u75BF"], /* CJK Ideograph */
+ ["\u75C0", "\u75C0"], /* CJK Ideograph */
+ ["\u75C1", "\u75C1"], /* CJK Ideograph */
+ ["\u75C2", "\u75C2"], /* CJK Ideograph */
+ ["\u75C3", "\u75C3"], /* CJK Ideograph */
+ ["\u75C4", "\u75C4"], /* CJK Ideograph */
+ ["\u75C5", "\u75C5"], /* CJK Ideograph */
+ ["\u75C6", "\u75C6"], /* CJK Ideograph */
+ ["\u75C7", "\u75C7"], /* CJK Ideograph */
+ ["\u75C8", "\u75C8"], /* CJK Ideograph */
+ ["\u75C9", "\u75C9"], /* CJK Ideograph */
+ ["\u75CA", "\u75CA"], /* CJK Ideograph */
+ ["\u75CB", "\u75CB"], /* CJK Ideograph */
+ ["\u75CC", "\u75CC"], /* CJK Ideograph */
+ ["\u75CD", "\u75CD"], /* CJK Ideograph */
+ ["\u75CE", "\u75CE"], /* CJK Ideograph */
+ ["\u75CF", "\u75CF"], /* CJK Ideograph */
+ ["\u75D0", "\u75D0"], /* CJK Ideograph */
+ ["\u75D1", "\u75D1"], /* CJK Ideograph */
+ ["\u75D2", "\u75D2"], /* CJK Ideograph */
+ ["\u75D3", "\u75D3"], /* CJK Ideograph */
+ ["\u75D4", "\u75D4"], /* CJK Ideograph */
+ ["\u75D5", "\u75D5"], /* CJK Ideograph */
+ ["\u75D6", "\u75D6"], /* CJK Ideograph */
+ ["\u75D7", "\u75D7"], /* CJK Ideograph */
+ ["\u75D8", "\u75D8"], /* CJK Ideograph */
+ ["\u75D9", "\u75D9"], /* CJK Ideograph */
+ ["\u75DA", "\u75DA"], /* CJK Ideograph */
+ ["\u75DB", "\u75DB"], /* CJK Ideograph */
+ ["\u75DC", "\u75DC"], /* CJK Ideograph */
+ ["\u75DD", "\u75DD"], /* CJK Ideograph */
+ ["\u75DE", "\u75DE"], /* CJK Ideograph */
+ ["\u75DF", "\u75DF"], /* CJK Ideograph */
+ ["\u75E0", "\u75E0"], /* CJK Ideograph */
+ ["\u75E1", "\u75E1"], /* CJK Ideograph */
+ ["\u75E2", "\u75E2"], /* CJK Ideograph */
+ ["\u75E3", "\u75E3"], /* CJK Ideograph */
+ ["\u75E4", "\u75E4"], /* CJK Ideograph */
+ ["\u75E5", "\u75E5"], /* CJK Ideograph */
+ ["\u75E6", "\u75E6"], /* CJK Ideograph */
+ ["\u75E7", "\u75E7"], /* CJK Ideograph */
+ ["\u75E8", "\u75E8"], /* CJK Ideograph */
+ ["\u75E9", "\u75E9"], /* CJK Ideograph */
+ ["\u75EA", "\u75EA"], /* CJK Ideograph */
+ ["\u75EB", "\u75EB"], /* CJK Ideograph */
+ ["\u75EC", "\u75EC"], /* CJK Ideograph */
+ ["\u75ED", "\u75ED"], /* CJK Ideograph */
+ ["\u75EE", "\u75EE"], /* CJK Ideograph */
+ ["\u75EF", "\u75EF"], /* CJK Ideograph */
+ ["\u75F0", "\u75F0"], /* CJK Ideograph */
+ ["\u75F1", "\u75F1"], /* CJK Ideograph */
+ ["\u75F2", "\u75F2"], /* CJK Ideograph */
+ ["\u75F3", "\u75F3"], /* CJK Ideograph */
+ ["\u75F4", "\u75F4"], /* CJK Ideograph */
+ ["\u75F5", "\u75F5"], /* CJK Ideograph */
+ ["\u75F6", "\u75F6"], /* CJK Ideograph */
+ ["\u75F7", "\u75F7"], /* CJK Ideograph */
+ ["\u75F8", "\u75F8"], /* CJK Ideograph */
+ ["\u75F9", "\u75F9"], /* CJK Ideograph */
+ ["\u75FA", "\u75FA"], /* CJK Ideograph */
+ ["\u75FB", "\u75FB"], /* CJK Ideograph */
+ ["\u75FC", "\u75FC"], /* CJK Ideograph */
+ ["\u75FD", "\u75FD"], /* CJK Ideograph */
+ ["\u75FE", "\u75FE"], /* CJK Ideograph */
+ ["\u75FF", "\u75FF"], /* CJK Ideograph */
+ ["\u7600", "\u7600"], /* CJK Ideograph */
+ ["\u7601", "\u7601"], /* CJK Ideograph */
+ ["\u7602", "\u7602"], /* CJK Ideograph */
+ ["\u7603", "\u7603"], /* CJK Ideograph */
+ ["\u7604", "\u7604"], /* CJK Ideograph */
+ ["\u7605", "\u7605"], /* CJK Ideograph */
+ ["\u7606", "\u7606"], /* CJK Ideograph */
+ ["\u7607", "\u7607"], /* CJK Ideograph */
+ ["\u7608", "\u7608"], /* CJK Ideograph */
+ ["\u7609", "\u7609"], /* CJK Ideograph */
+ ["\u760A", "\u760A"], /* CJK Ideograph */
+ ["\u760B", "\u760B"], /* CJK Ideograph */
+ ["\u760C", "\u760C"], /* CJK Ideograph */
+ ["\u760D", "\u760D"], /* CJK Ideograph */
+ ["\u760E", "\u760E"], /* CJK Ideograph */
+ ["\u760F", "\u760F"], /* CJK Ideograph */
+ ["\u7610", "\u7610"], /* CJK Ideograph */
+ ["\u7611", "\u7611"], /* CJK Ideograph */
+ ["\u7612", "\u7612"], /* CJK Ideograph */
+ ["\u7613", "\u7613"], /* CJK Ideograph */
+ ["\u7614", "\u7614"], /* CJK Ideograph */
+ ["\u7615", "\u7615"], /* CJK Ideograph */
+ ["\u7616", "\u7616"], /* CJK Ideograph */
+ ["\u7617", "\u7617"], /* CJK Ideograph */
+ ["\u7618", "\u7618"], /* CJK Ideograph */
+ ["\u7619", "\u7619"], /* CJK Ideograph */
+ ["\u761A", "\u761A"], /* CJK Ideograph */
+ ["\u761B", "\u761B"], /* CJK Ideograph */
+ ["\u761C", "\u761C"], /* CJK Ideograph */
+ ["\u761D", "\u761D"], /* CJK Ideograph */
+ ["\u761E", "\u761E"], /* CJK Ideograph */
+ ["\u761F", "\u761F"], /* CJK Ideograph */
+ ["\u7620", "\u7620"], /* CJK Ideograph */
+ ["\u7621", "\u7621"], /* CJK Ideograph */
+ ["\u7622", "\u7622"], /* CJK Ideograph */
+ ["\u7623", "\u7623"], /* CJK Ideograph */
+ ["\u7624", "\u7624"], /* CJK Ideograph */
+ ["\u7625", "\u7625"], /* CJK Ideograph */
+ ["\u7626", "\u7626"], /* CJK Ideograph */
+ ["\u7627", "\u7627"], /* CJK Ideograph */
+ ["\u7628", "\u7628"], /* CJK Ideograph */
+ ["\u7629", "\u7629"], /* CJK Ideograph */
+ ["\u762A", "\u762A"], /* CJK Ideograph */
+ ["\u762B", "\u762B"], /* CJK Ideograph */
+ ["\u762C", "\u762C"], /* CJK Ideograph */
+ ["\u762D", "\u762D"], /* CJK Ideograph */
+ ["\u762E", "\u762E"], /* CJK Ideograph */
+ ["\u762F", "\u762F"], /* CJK Ideograph */
+ ["\u7630", "\u7630"], /* CJK Ideograph */
+ ["\u7631", "\u7631"], /* CJK Ideograph */
+ ["\u7632", "\u7632"], /* CJK Ideograph */
+ ["\u7633", "\u7633"], /* CJK Ideograph */
+ ["\u7634", "\u7634"], /* CJK Ideograph */
+ ["\u7635", "\u7635"], /* CJK Ideograph */
+ ["\u7636", "\u7636"], /* CJK Ideograph */
+ ["\u7637", "\u7637"], /* CJK Ideograph */
+ ["\u7638", "\u7638"], /* CJK Ideograph */
+ ["\u7639", "\u7639"], /* CJK Ideograph */
+ ["\u763A", "\u763A"], /* CJK Ideograph */
+ ["\u763B", "\u763B"], /* CJK Ideograph */
+ ["\u763C", "\u763C"], /* CJK Ideograph */
+ ["\u763D", "\u763D"], /* CJK Ideograph */
+ ["\u763E", "\u763E"], /* CJK Ideograph */
+ ["\u763F", "\u763F"], /* CJK Ideograph */
+ ["\u7640", "\u7640"], /* CJK Ideograph */
+ ["\u7641", "\u7641"], /* CJK Ideograph */
+ ["\u7642", "\u7642"], /* CJK Ideograph */
+ ["\u7643", "\u7643"], /* CJK Ideograph */
+ ["\u7644", "\u7644"], /* CJK Ideograph */
+ ["\u7645", "\u7645"], /* CJK Ideograph */
+ ["\u7646", "\u7646"], /* CJK Ideograph */
+ ["\u7647", "\u7647"], /* CJK Ideograph */
+ ["\u7648", "\u7648"], /* CJK Ideograph */
+ ["\u7649", "\u7649"], /* CJK Ideograph */
+ ["\u764A", "\u764A"], /* CJK Ideograph */
+ ["\u764B", "\u764B"], /* CJK Ideograph */
+ ["\u764C", "\u764C"], /* CJK Ideograph */
+ ["\u764D", "\u764D"], /* CJK Ideograph */
+ ["\u764E", "\u764E"], /* CJK Ideograph */
+ ["\u764F", "\u764F"], /* CJK Ideograph */
+ ["\u7650", "\u7650"], /* CJK Ideograph */
+ ["\u7651", "\u7651"], /* CJK Ideograph */
+ ["\u7652", "\u7652"], /* CJK Ideograph */
+ ["\u7653", "\u7653"], /* CJK Ideograph */
+ ["\u7654", "\u7654"], /* CJK Ideograph */
+ ["\u7655", "\u7655"], /* CJK Ideograph */
+ ["\u7656", "\u7656"], /* CJK Ideograph */
+ ["\u7657", "\u7657"], /* CJK Ideograph */
+ ["\u7658", "\u7658"], /* CJK Ideograph */
+ ["\u7659", "\u7659"], /* CJK Ideograph */
+ ["\u765A", "\u765A"], /* CJK Ideograph */
+ ["\u765B", "\u765B"], /* CJK Ideograph */
+ ["\u765C", "\u765C"], /* CJK Ideograph */
+ ["\u765D", "\u765D"], /* CJK Ideograph */
+ ["\u765E", "\u765E"], /* CJK Ideograph */
+ ["\u765F", "\u765F"], /* CJK Ideograph */
+ ["\u7660", "\u7660"], /* CJK Ideograph */
+ ["\u7661", "\u7661"], /* CJK Ideograph */
+ ["\u7662", "\u7662"], /* CJK Ideograph */
+ ["\u7663", "\u7663"], /* CJK Ideograph */
+ ["\u7664", "\u7664"], /* CJK Ideograph */
+ ["\u7665", "\u7665"], /* CJK Ideograph */
+ ["\u7666", "\u7666"], /* CJK Ideograph */
+ ["\u7667", "\u7667"], /* CJK Ideograph */
+ ["\u7668", "\u7668"], /* CJK Ideograph */
+ ["\u7669", "\u7669"], /* CJK Ideograph */
+ ["\u766A", "\u766A"], /* CJK Ideograph */
+ ["\u766B", "\u766B"], /* CJK Ideograph */
+ ["\u766C", "\u766C"], /* CJK Ideograph */
+ ["\u766D", "\u766D"], /* CJK Ideograph */
+ ["\u766E", "\u766E"], /* CJK Ideograph */
+ ["\u766F", "\u766F"], /* CJK Ideograph */
+ ["\u7670", "\u7670"], /* CJK Ideograph */
+ ["\u7671", "\u7671"], /* CJK Ideograph */
+ ["\u7672", "\u7672"], /* CJK Ideograph */
+ ["\u7673", "\u7673"], /* CJK Ideograph */
+ ["\u7674", "\u7674"], /* CJK Ideograph */
+ ["\u7675", "\u7675"], /* CJK Ideograph */
+ ["\u7676", "\u7676"], /* CJK Ideograph */
+ ["\u7677", "\u7677"], /* CJK Ideograph */
+ ["\u7678", "\u7678"], /* CJK Ideograph */
+ ["\u7679", "\u7679"], /* CJK Ideograph */
+ ["\u767A", "\u767A"], /* CJK Ideograph */
+ ["\u767B", "\u767B"], /* CJK Ideograph */
+ ["\u767C", "\u767C"], /* CJK Ideograph */
+ ["\u767D", "\u767D"], /* CJK Ideograph */
+ ["\u767E", "\u767E"], /* CJK Ideograph */
+ ["\u767F", "\u767F"], /* CJK Ideograph */
+ ["\u7680", "\u7680"], /* CJK Ideograph */
+ ["\u7681", "\u7681"], /* CJK Ideograph */
+ ["\u7682", "\u7682"], /* CJK Ideograph */
+ ["\u7683", "\u7683"], /* CJK Ideograph */
+ ["\u7684", "\u7684"], /* CJK Ideograph */
+ ["\u7685", "\u7685"], /* CJK Ideograph */
+ ["\u7686", "\u7686"], /* CJK Ideograph */
+ ["\u7687", "\u7687"], /* CJK Ideograph */
+ ["\u7688", "\u7688"], /* CJK Ideograph */
+ ["\u7689", "\u7689"], /* CJK Ideograph */
+ ["\u768A", "\u768A"], /* CJK Ideograph */
+ ["\u768B", "\u768B"], /* CJK Ideograph */
+ ["\u768C", "\u768C"], /* CJK Ideograph */
+ ["\u768D", "\u768D"], /* CJK Ideograph */
+ ["\u768E", "\u768E"], /* CJK Ideograph */
+ ["\u768F", "\u768F"], /* CJK Ideograph */
+ ["\u7690", "\u7690"], /* CJK Ideograph */
+ ["\u7691", "\u7691"], /* CJK Ideograph */
+ ["\u7692", "\u7692"], /* CJK Ideograph */
+ ["\u7693", "\u7693"], /* CJK Ideograph */
+ ["\u7694", "\u7694"], /* CJK Ideograph */
+ ["\u7695", "\u7695"], /* CJK Ideograph */
+ ["\u7696", "\u7696"], /* CJK Ideograph */
+ ["\u7697", "\u7697"], /* CJK Ideograph */
+ ["\u7698", "\u7698"], /* CJK Ideograph */
+ ["\u7699", "\u7699"], /* CJK Ideograph */
+ ["\u769A", "\u769A"], /* CJK Ideograph */
+ ["\u769B", "\u769B"], /* CJK Ideograph */
+ ["\u769C", "\u769C"], /* CJK Ideograph */
+ ["\u769D", "\u769D"], /* CJK Ideograph */
+ ["\u769E", "\u769E"], /* CJK Ideograph */
+ ["\u769F", "\u769F"], /* CJK Ideograph */
+ ["\u76A0", "\u76A0"], /* CJK Ideograph */
+ ["\u76A1", "\u76A1"], /* CJK Ideograph */
+ ["\u76A2", "\u76A2"], /* CJK Ideograph */
+ ["\u76A3", "\u76A3"], /* CJK Ideograph */
+ ["\u76A4", "\u76A4"], /* CJK Ideograph */
+ ["\u76A5", "\u76A5"], /* CJK Ideograph */
+ ["\u76A6", "\u76A6"], /* CJK Ideograph */
+ ["\u76A7", "\u76A7"], /* CJK Ideograph */
+ ["\u76A8", "\u76A8"], /* CJK Ideograph */
+ ["\u76A9", "\u76A9"], /* CJK Ideograph */
+ ["\u76AA", "\u76AA"], /* CJK Ideograph */
+ ["\u76AB", "\u76AB"], /* CJK Ideograph */
+ ["\u76AC", "\u76AC"], /* CJK Ideograph */
+ ["\u76AD", "\u76AD"], /* CJK Ideograph */
+ ["\u76AE", "\u76AE"], /* CJK Ideograph */
+ ["\u76AF", "\u76AF"], /* CJK Ideograph */
+ ["\u76B0", "\u76B0"], /* CJK Ideograph */
+ ["\u76B1", "\u76B1"], /* CJK Ideograph */
+ ["\u76B2", "\u76B2"], /* CJK Ideograph */
+ ["\u76B3", "\u76B3"], /* CJK Ideograph */
+ ["\u76B4", "\u76B4"], /* CJK Ideograph */
+ ["\u76B5", "\u76B5"], /* CJK Ideograph */
+ ["\u76B6", "\u76B6"], /* CJK Ideograph */
+ ["\u76B7", "\u76B7"], /* CJK Ideograph */
+ ["\u76B8", "\u76B8"], /* CJK Ideograph */
+ ["\u76B9", "\u76B9"], /* CJK Ideograph */
+ ["\u76BA", "\u76BA"], /* CJK Ideograph */
+ ["\u76BB", "\u76BB"], /* CJK Ideograph */
+ ["\u76BC", "\u76BC"], /* CJK Ideograph */
+ ["\u76BD", "\u76BD"], /* CJK Ideograph */
+ ["\u76BE", "\u76BE"], /* CJK Ideograph */
+ ["\u76BF", "\u76BF"], /* CJK Ideograph */
+ ["\u76C0", "\u76C0"], /* CJK Ideograph */
+ ["\u76C1", "\u76C1"], /* CJK Ideograph */
+ ["\u76C2", "\u76C2"], /* CJK Ideograph */
+ ["\u76C3", "\u76C3"], /* CJK Ideograph */
+ ["\u76C4", "\u76C4"], /* CJK Ideograph */
+ ["\u76C5", "\u76C5"], /* CJK Ideograph */
+ ["\u76C6", "\u76C6"], /* CJK Ideograph */
+ ["\u76C7", "\u76C7"], /* CJK Ideograph */
+ ["\u76C8", "\u76C8"], /* CJK Ideograph */
+ ["\u76C9", "\u76C9"], /* CJK Ideograph */
+ ["\u76CA", "\u76CA"], /* CJK Ideograph */
+ ["\u76CB", "\u76CB"], /* CJK Ideograph */
+ ["\u76CC", "\u76CC"], /* CJK Ideograph */
+ ["\u76CD", "\u76CD"], /* CJK Ideograph */
+ ["\u76CE", "\u76CE"], /* CJK Ideograph */
+ ["\u76CF", "\u76CF"], /* CJK Ideograph */
+ ["\u76D0", "\u76D0"], /* CJK Ideograph */
+ ["\u76D1", "\u76D1"], /* CJK Ideograph */
+ ["\u76D2", "\u76D2"], /* CJK Ideograph */
+ ["\u76D3", "\u76D3"], /* CJK Ideograph */
+ ["\u76D4", "\u76D4"], /* CJK Ideograph */
+ ["\u76D5", "\u76D5"], /* CJK Ideograph */
+ ["\u76D6", "\u76D6"], /* CJK Ideograph */
+ ["\u76D7", "\u76D7"], /* CJK Ideograph */
+ ["\u76D8", "\u76D8"], /* CJK Ideograph */
+ ["\u76D9", "\u76D9"], /* CJK Ideograph */
+ ["\u76DA", "\u76DA"], /* CJK Ideograph */
+ ["\u76DB", "\u76DB"], /* CJK Ideograph */
+ ["\u76DC", "\u76DC"], /* CJK Ideograph */
+ ["\u76DD", "\u76DD"], /* CJK Ideograph */
+ ["\u76DE", "\u76DE"], /* CJK Ideograph */
+ ["\u76DF", "\u76DF"], /* CJK Ideograph */
+ ["\u76E0", "\u76E0"], /* CJK Ideograph */
+ ["\u76E1", "\u76E1"], /* CJK Ideograph */
+ ["\u76E2", "\u76E2"], /* CJK Ideograph */
+ ["\u76E3", "\u76E3"], /* CJK Ideograph */
+ ["\u76E4", "\u76E4"], /* CJK Ideograph */
+ ["\u76E5", "\u76E5"], /* CJK Ideograph */
+ ["\u76E6", "\u76E6"], /* CJK Ideograph */
+ ["\u76E7", "\u76E7"], /* CJK Ideograph */
+ ["\u76E8", "\u76E8"], /* CJK Ideograph */
+ ["\u76E9", "\u76E9"], /* CJK Ideograph */
+ ["\u76EA", "\u76EA"], /* CJK Ideograph */
+ ["\u76EB", "\u76EB"], /* CJK Ideograph */
+ ["\u76EC", "\u76EC"], /* CJK Ideograph */
+ ["\u76ED", "\u76ED"], /* CJK Ideograph */
+ ["\u76EE", "\u76EE"], /* CJK Ideograph */
+ ["\u76EF", "\u76EF"], /* CJK Ideograph */
+ ["\u76F0", "\u76F0"], /* CJK Ideograph */
+ ["\u76F1", "\u76F1"], /* CJK Ideograph */
+ ["\u76F2", "\u76F2"], /* CJK Ideograph */
+ ["\u76F3", "\u76F3"], /* CJK Ideograph */
+ ["\u76F4", "\u76F4"], /* CJK Ideograph */
+ ["\u76F5", "\u76F5"], /* CJK Ideograph */
+ ["\u76F6", "\u76F6"], /* CJK Ideograph */
+ ["\u76F7", "\u76F7"], /* CJK Ideograph */
+ ["\u76F8", "\u76F8"], /* CJK Ideograph */
+ ["\u76F9", "\u76F9"], /* CJK Ideograph */
+ ["\u76FA", "\u76FA"], /* CJK Ideograph */
+ ["\u76FB", "\u76FB"], /* CJK Ideograph */
+ ["\u76FC", "\u76FC"], /* CJK Ideograph */
+ ["\u76FD", "\u76FD"], /* CJK Ideograph */
+ ["\u76FE", "\u76FE"], /* CJK Ideograph */
+ ["\u76FF", "\u76FF"], /* CJK Ideograph */
+ ["\u7700", "\u7700"], /* CJK Ideograph */
+ ["\u7701", "\u7701"], /* CJK Ideograph */
+ ["\u7702", "\u7702"], /* CJK Ideograph */
+ ["\u7703", "\u7703"], /* CJK Ideograph */
+ ["\u7704", "\u7704"], /* CJK Ideograph */
+ ["\u7705", "\u7705"], /* CJK Ideograph */
+ ["\u7706", "\u7706"], /* CJK Ideograph */
+ ["\u7707", "\u7707"], /* CJK Ideograph */
+ ["\u7708", "\u7708"], /* CJK Ideograph */
+ ["\u7709", "\u7709"], /* CJK Ideograph */
+ ["\u770A", "\u770A"], /* CJK Ideograph */
+ ["\u770B", "\u770B"], /* CJK Ideograph */
+ ["\u770C", "\u770C"], /* CJK Ideograph */
+ ["\u770D", "\u770D"], /* CJK Ideograph */
+ ["\u770E", "\u770E"], /* CJK Ideograph */
+ ["\u770F", "\u770F"], /* CJK Ideograph */
+ ["\u7710", "\u7710"], /* CJK Ideograph */
+ ["\u7711", "\u7711"], /* CJK Ideograph */
+ ["\u7712", "\u7712"], /* CJK Ideograph */
+ ["\u7713", "\u7713"], /* CJK Ideograph */
+ ["\u7714", "\u7714"], /* CJK Ideograph */
+ ["\u7715", "\u7715"], /* CJK Ideograph */
+ ["\u7716", "\u7716"], /* CJK Ideograph */
+ ["\u7717", "\u7717"], /* CJK Ideograph */
+ ["\u7718", "\u7718"], /* CJK Ideograph */
+ ["\u7719", "\u7719"], /* CJK Ideograph */
+ ["\u771A", "\u771A"], /* CJK Ideograph */
+ ["\u771B", "\u771B"], /* CJK Ideograph */
+ ["\u771C", "\u771C"], /* CJK Ideograph */
+ ["\u771D", "\u771D"], /* CJK Ideograph */
+ ["\u771E", "\u771E"], /* CJK Ideograph */
+ ["\u771F", "\u771F"], /* CJK Ideograph */
+ ["\u7720", "\u7720"], /* CJK Ideograph */
+ ["\u7721", "\u7721"], /* CJK Ideograph */
+ ["\u7722", "\u7722"], /* CJK Ideograph */
+ ["\u7723", "\u7723"], /* CJK Ideograph */
+ ["\u7724", "\u7724"], /* CJK Ideograph */
+ ["\u7725", "\u7725"], /* CJK Ideograph */
+ ["\u7726", "\u7726"], /* CJK Ideograph */
+ ["\u7727", "\u7727"], /* CJK Ideograph */
+ ["\u7728", "\u7728"], /* CJK Ideograph */
+ ["\u7729", "\u7729"], /* CJK Ideograph */
+ ["\u772A", "\u772A"], /* CJK Ideograph */
+ ["\u772B", "\u772B"], /* CJK Ideograph */
+ ["\u772C", "\u772C"], /* CJK Ideograph */
+ ["\u772D", "\u772D"], /* CJK Ideograph */
+ ["\u772E", "\u772E"], /* CJK Ideograph */
+ ["\u772F", "\u772F"], /* CJK Ideograph */
+ ["\u7730", "\u7730"], /* CJK Ideograph */
+ ["\u7731", "\u7731"], /* CJK Ideograph */
+ ["\u7732", "\u7732"], /* CJK Ideograph */
+ ["\u7733", "\u7733"], /* CJK Ideograph */
+ ["\u7734", "\u7734"], /* CJK Ideograph */
+ ["\u7735", "\u7735"], /* CJK Ideograph */
+ ["\u7736", "\u7736"], /* CJK Ideograph */
+ ["\u7737", "\u7737"], /* CJK Ideograph */
+ ["\u7738", "\u7738"], /* CJK Ideograph */
+ ["\u7739", "\u7739"], /* CJK Ideograph */
+ ["\u773A", "\u773A"], /* CJK Ideograph */
+ ["\u773B", "\u773B"], /* CJK Ideograph */
+ ["\u773C", "\u773C"], /* CJK Ideograph */
+ ["\u773D", "\u773D"], /* CJK Ideograph */
+ ["\u773E", "\u773E"], /* CJK Ideograph */
+ ["\u773F", "\u773F"], /* CJK Ideograph */
+ ["\u7740", "\u7740"], /* CJK Ideograph */
+ ["\u7741", "\u7741"], /* CJK Ideograph */
+ ["\u7742", "\u7742"], /* CJK Ideograph */
+ ["\u7743", "\u7743"], /* CJK Ideograph */
+ ["\u7744", "\u7744"], /* CJK Ideograph */
+ ["\u7745", "\u7745"], /* CJK Ideograph */
+ ["\u7746", "\u7746"], /* CJK Ideograph */
+ ["\u7747", "\u7747"], /* CJK Ideograph */
+ ["\u7748", "\u7748"], /* CJK Ideograph */
+ ["\u7749", "\u7749"], /* CJK Ideograph */
+ ["\u774A", "\u774A"], /* CJK Ideograph */
+ ["\u774B", "\u774B"], /* CJK Ideograph */
+ ["\u774C", "\u774C"], /* CJK Ideograph */
+ ["\u774D", "\u774D"], /* CJK Ideograph */
+ ["\u774E", "\u774E"], /* CJK Ideograph */
+ ["\u774F", "\u774F"], /* CJK Ideograph */
+ ["\u7750", "\u7750"], /* CJK Ideograph */
+ ["\u7751", "\u7751"], /* CJK Ideograph */
+ ["\u7752", "\u7752"], /* CJK Ideograph */
+ ["\u7753", "\u7753"], /* CJK Ideograph */
+ ["\u7754", "\u7754"], /* CJK Ideograph */
+ ["\u7755", "\u7755"], /* CJK Ideograph */
+ ["\u7756", "\u7756"], /* CJK Ideograph */
+ ["\u7757", "\u7757"], /* CJK Ideograph */
+ ["\u7758", "\u7758"], /* CJK Ideograph */
+ ["\u7759", "\u7759"], /* CJK Ideograph */
+ ["\u775A", "\u775A"], /* CJK Ideograph */
+ ["\u775B", "\u775B"], /* CJK Ideograph */
+ ["\u775C", "\u775C"], /* CJK Ideograph */
+ ["\u775D", "\u775D"], /* CJK Ideograph */
+ ["\u775E", "\u775E"], /* CJK Ideograph */
+ ["\u775F", "\u775F"], /* CJK Ideograph */
+ ["\u7760", "\u7760"], /* CJK Ideograph */
+ ["\u7761", "\u7761"], /* CJK Ideograph */
+ ["\u7762", "\u7762"], /* CJK Ideograph */
+ ["\u7763", "\u7763"], /* CJK Ideograph */
+ ["\u7764", "\u7764"], /* CJK Ideograph */
+ ["\u7765", "\u7765"], /* CJK Ideograph */
+ ["\u7766", "\u7766"], /* CJK Ideograph */
+ ["\u7767", "\u7767"], /* CJK Ideograph */
+ ["\u7768", "\u7768"], /* CJK Ideograph */
+ ["\u7769", "\u7769"], /* CJK Ideograph */
+ ["\u776A", "\u776A"], /* CJK Ideograph */
+ ["\u776B", "\u776B"], /* CJK Ideograph */
+ ["\u776C", "\u776C"], /* CJK Ideograph */
+ ["\u776D", "\u776D"], /* CJK Ideograph */
+ ["\u776E", "\u776E"], /* CJK Ideograph */
+ ["\u776F", "\u776F"], /* CJK Ideograph */
+ ["\u7770", "\u7770"], /* CJK Ideograph */
+ ["\u7771", "\u7771"], /* CJK Ideograph */
+ ["\u7772", "\u7772"], /* CJK Ideograph */
+ ["\u7773", "\u7773"], /* CJK Ideograph */
+ ["\u7774", "\u7774"], /* CJK Ideograph */
+ ["\u7775", "\u7775"], /* CJK Ideograph */
+ ["\u7776", "\u7776"], /* CJK Ideograph */
+ ["\u7777", "\u7777"], /* CJK Ideograph */
+ ["\u7778", "\u7778"], /* CJK Ideograph */
+ ["\u7779", "\u7779"], /* CJK Ideograph */
+ ["\u777A", "\u777A"], /* CJK Ideograph */
+ ["\u777B", "\u777B"], /* CJK Ideograph */
+ ["\u777C", "\u777C"], /* CJK Ideograph */
+ ["\u777D", "\u777D"], /* CJK Ideograph */
+ ["\u777E", "\u777E"], /* CJK Ideograph */
+ ["\u777F", "\u777F"], /* CJK Ideograph */
+ ["\u7780", "\u7780"], /* CJK Ideograph */
+ ["\u7781", "\u7781"], /* CJK Ideograph */
+ ["\u7782", "\u7782"], /* CJK Ideograph */
+ ["\u7783", "\u7783"], /* CJK Ideograph */
+ ["\u7784", "\u7784"], /* CJK Ideograph */
+ ["\u7785", "\u7785"], /* CJK Ideograph */
+ ["\u7786", "\u7786"], /* CJK Ideograph */
+ ["\u7787", "\u7787"], /* CJK Ideograph */
+ ["\u7788", "\u7788"], /* CJK Ideograph */
+ ["\u7789", "\u7789"], /* CJK Ideograph */
+ ["\u778A", "\u778A"], /* CJK Ideograph */
+ ["\u778B", "\u778B"], /* CJK Ideograph */
+ ["\u778C", "\u778C"], /* CJK Ideograph */
+ ["\u778D", "\u778D"], /* CJK Ideograph */
+ ["\u778E", "\u778E"], /* CJK Ideograph */
+ ["\u778F", "\u778F"], /* CJK Ideograph */
+ ["\u7790", "\u7790"], /* CJK Ideograph */
+ ["\u7791", "\u7791"], /* CJK Ideograph */
+ ["\u7792", "\u7792"], /* CJK Ideograph */
+ ["\u7793", "\u7793"], /* CJK Ideograph */
+ ["\u7794", "\u7794"], /* CJK Ideograph */
+ ["\u7795", "\u7795"], /* CJK Ideograph */
+ ["\u7796", "\u7796"], /* CJK Ideograph */
+ ["\u7797", "\u7797"], /* CJK Ideograph */
+ ["\u7798", "\u7798"], /* CJK Ideograph */
+ ["\u7799", "\u7799"], /* CJK Ideograph */
+ ["\u779A", "\u779A"], /* CJK Ideograph */
+ ["\u779B", "\u779B"], /* CJK Ideograph */
+ ["\u779C", "\u779C"], /* CJK Ideograph */
+ ["\u779D", "\u779D"], /* CJK Ideograph */
+ ["\u779E", "\u779E"], /* CJK Ideograph */
+ ["\u779F", "\u779F"], /* CJK Ideograph */
+ ["\u77A0", "\u77A0"], /* CJK Ideograph */
+ ["\u77A1", "\u77A1"], /* CJK Ideograph */
+ ["\u77A2", "\u77A2"], /* CJK Ideograph */
+ ["\u77A3", "\u77A3"], /* CJK Ideograph */
+ ["\u77A4", "\u77A4"], /* CJK Ideograph */
+ ["\u77A5", "\u77A5"], /* CJK Ideograph */
+ ["\u77A6", "\u77A6"], /* CJK Ideograph */
+ ["\u77A7", "\u77A7"], /* CJK Ideograph */
+ ["\u77A8", "\u77A8"], /* CJK Ideograph */
+ ["\u77A9", "\u77A9"], /* CJK Ideograph */
+ ["\u77AA", "\u77AA"], /* CJK Ideograph */
+ ["\u77AB", "\u77AB"], /* CJK Ideograph */
+ ["\u77AC", "\u77AC"], /* CJK Ideograph */
+ ["\u77AD", "\u77AD"], /* CJK Ideograph */
+ ["\u77AE", "\u77AE"], /* CJK Ideograph */
+ ["\u77AF", "\u77AF"], /* CJK Ideograph */
+ ["\u77B0", "\u77B0"], /* CJK Ideograph */
+ ["\u77B1", "\u77B1"], /* CJK Ideograph */
+ ["\u77B2", "\u77B2"], /* CJK Ideograph */
+ ["\u77B3", "\u77B3"], /* CJK Ideograph */
+ ["\u77B4", "\u77B4"], /* CJK Ideograph */
+ ["\u77B5", "\u77B5"], /* CJK Ideograph */
+ ["\u77B6", "\u77B6"], /* CJK Ideograph */
+ ["\u77B7", "\u77B7"], /* CJK Ideograph */
+ ["\u77B8", "\u77B8"], /* CJK Ideograph */
+ ["\u77B9", "\u77B9"], /* CJK Ideograph */
+ ["\u77BA", "\u77BA"], /* CJK Ideograph */
+ ["\u77BB", "\u77BB"], /* CJK Ideograph */
+ ["\u77BC", "\u77BC"], /* CJK Ideograph */
+ ["\u77BD", "\u77BD"], /* CJK Ideograph */
+ ["\u77BE", "\u77BE"], /* CJK Ideograph */
+ ["\u77BF", "\u77BF"], /* CJK Ideograph */
+ ["\u77C0", "\u77C0"], /* CJK Ideograph */
+ ["\u77C1", "\u77C1"], /* CJK Ideograph */
+ ["\u77C2", "\u77C2"], /* CJK Ideograph */
+ ["\u77C3", "\u77C3"], /* CJK Ideograph */
+ ["\u77C4", "\u77C4"], /* CJK Ideograph */
+ ["\u77C5", "\u77C5"], /* CJK Ideograph */
+ ["\u77C6", "\u77C6"], /* CJK Ideograph */
+ ["\u77C7", "\u77C7"], /* CJK Ideograph */
+ ["\u77C8", "\u77C8"], /* CJK Ideograph */
+ ["\u77C9", "\u77C9"], /* CJK Ideograph */
+ ["\u77CA", "\u77CA"], /* CJK Ideograph */
+ ["\u77CB", "\u77CB"], /* CJK Ideograph */
+ ["\u77CC", "\u77CC"], /* CJK Ideograph */
+ ["\u77CD", "\u77CD"], /* CJK Ideograph */
+ ["\u77CE", "\u77CE"], /* CJK Ideograph */
+ ["\u77CF", "\u77CF"], /* CJK Ideograph */
+ ["\u77D0", "\u77D0"], /* CJK Ideograph */
+ ["\u77D1", "\u77D1"], /* CJK Ideograph */
+ ["\u77D2", "\u77D2"], /* CJK Ideograph */
+ ["\u77D3", "\u77D3"], /* CJK Ideograph */
+ ["\u77D4", "\u77D4"], /* CJK Ideograph */
+ ["\u77D5", "\u77D5"], /* CJK Ideograph */
+ ["\u77D6", "\u77D6"], /* CJK Ideograph */
+ ["\u77D7", "\u77D7"], /* CJK Ideograph */
+ ["\u77D8", "\u77D8"], /* CJK Ideograph */
+ ["\u77D9", "\u77D9"], /* CJK Ideograph */
+ ["\u77DA", "\u77DA"], /* CJK Ideograph */
+ ["\u77DB", "\u77DB"], /* CJK Ideograph */
+ ["\u77DC", "\u77DC"], /* CJK Ideograph */
+ ["\u77DD", "\u77DD"], /* CJK Ideograph */
+ ["\u77DE", "\u77DE"], /* CJK Ideograph */
+ ["\u77DF", "\u77DF"], /* CJK Ideograph */
+ ["\u77E0", "\u77E0"], /* CJK Ideograph */
+ ["\u77E1", "\u77E1"], /* CJK Ideograph */
+ ["\u77E2", "\u77E2"], /* CJK Ideograph */
+ ["\u77E3", "\u77E3"], /* CJK Ideograph */
+ ["\u77E4", "\u77E4"], /* CJK Ideograph */
+ ["\u77E5", "\u77E5"], /* CJK Ideograph */
+ ["\u77E6", "\u77E6"], /* CJK Ideograph */
+ ["\u77E7", "\u77E7"], /* CJK Ideograph */
+ ["\u77E8", "\u77E8"], /* CJK Ideograph */
+ ["\u77E9", "\u77E9"], /* CJK Ideograph */
+ ["\u77EA", "\u77EA"], /* CJK Ideograph */
+ ["\u77EB", "\u77EB"], /* CJK Ideograph */
+ ["\u77EC", "\u77EC"], /* CJK Ideograph */
+ ["\u77ED", "\u77ED"], /* CJK Ideograph */
+ ["\u77EE", "\u77EE"], /* CJK Ideograph */
+ ["\u77EF", "\u77EF"], /* CJK Ideograph */
+ ["\u77F0", "\u77F0"], /* CJK Ideograph */
+ ["\u77F1", "\u77F1"], /* CJK Ideograph */
+ ["\u77F2", "\u77F2"], /* CJK Ideograph */
+ ["\u77F3", "\u77F3"], /* CJK Ideograph */
+ ["\u77F4", "\u77F4"], /* CJK Ideograph */
+ ["\u77F5", "\u77F5"], /* CJK Ideograph */
+ ["\u77F6", "\u77F6"], /* CJK Ideograph */
+ ["\u77F7", "\u77F7"], /* CJK Ideograph */
+ ["\u77F8", "\u77F8"], /* CJK Ideograph */
+ ["\u77F9", "\u77F9"], /* CJK Ideograph */
+ ["\u77FA", "\u77FA"], /* CJK Ideograph */
+ ["\u77FB", "\u77FB"], /* CJK Ideograph */
+ ["\u77FC", "\u77FC"], /* CJK Ideograph */
+ ["\u77FD", "\u77FD"], /* CJK Ideograph */
+ ["\u77FE", "\u77FE"], /* CJK Ideograph */
+ ["\u77FF", "\u77FF"], /* CJK Ideograph */
+ ["\u7800", "\u7800"], /* CJK Ideograph */
+ ["\u7801", "\u7801"], /* CJK Ideograph */
+ ["\u7802", "\u7802"], /* CJK Ideograph */
+ ["\u7803", "\u7803"], /* CJK Ideograph */
+ ["\u7804", "\u7804"], /* CJK Ideograph */
+ ["\u7805", "\u7805"], /* CJK Ideograph */
+ ["\u7806", "\u7806"], /* CJK Ideograph */
+ ["\u7807", "\u7807"], /* CJK Ideograph */
+ ["\u7808", "\u7808"], /* CJK Ideograph */
+ ["\u7809", "\u7809"], /* CJK Ideograph */
+ ["\u780A", "\u780A"], /* CJK Ideograph */
+ ["\u780B", "\u780B"], /* CJK Ideograph */
+ ["\u780C", "\u780C"], /* CJK Ideograph */
+ ["\u780D", "\u780D"], /* CJK Ideograph */
+ ["\u780E", "\u780E"], /* CJK Ideograph */
+ ["\u780F", "\u780F"], /* CJK Ideograph */
+ ["\u7810", "\u7810"], /* CJK Ideograph */
+ ["\u7811", "\u7811"], /* CJK Ideograph */
+ ["\u7812", "\u7812"], /* CJK Ideograph */
+ ["\u7813", "\u7813"], /* CJK Ideograph */
+ ["\u7814", "\u7814"], /* CJK Ideograph */
+ ["\u7815", "\u7815"], /* CJK Ideograph */
+ ["\u7816", "\u7816"], /* CJK Ideograph */
+ ["\u7817", "\u7817"], /* CJK Ideograph */
+ ["\u7818", "\u7818"], /* CJK Ideograph */
+ ["\u7819", "\u7819"], /* CJK Ideograph */
+ ["\u781A", "\u781A"], /* CJK Ideograph */
+ ["\u781B", "\u781B"], /* CJK Ideograph */
+ ["\u781C", "\u781C"], /* CJK Ideograph */
+ ["\u781D", "\u781D"], /* CJK Ideograph */
+ ["\u781E", "\u781E"], /* CJK Ideograph */
+ ["\u781F", "\u781F"], /* CJK Ideograph */
+ ["\u7820", "\u7820"], /* CJK Ideograph */
+ ["\u7821", "\u7821"], /* CJK Ideograph */
+ ["\u7822", "\u7822"], /* CJK Ideograph */
+ ["\u7823", "\u7823"], /* CJK Ideograph */
+ ["\u7824", "\u7824"], /* CJK Ideograph */
+ ["\u7825", "\u7825"], /* CJK Ideograph */
+ ["\u7826", "\u7826"], /* CJK Ideograph */
+ ["\u7827", "\u7827"], /* CJK Ideograph */
+ ["\u7828", "\u7828"], /* CJK Ideograph */
+ ["\u7829", "\u7829"], /* CJK Ideograph */
+ ["\u782A", "\u782A"], /* CJK Ideograph */
+ ["\u782B", "\u782B"], /* CJK Ideograph */
+ ["\u782C", "\u782C"], /* CJK Ideograph */
+ ["\u782D", "\u782D"], /* CJK Ideograph */
+ ["\u782E", "\u782E"], /* CJK Ideograph */
+ ["\u782F", "\u782F"], /* CJK Ideograph */
+ ["\u7830", "\u7830"], /* CJK Ideograph */
+ ["\u7831", "\u7831"], /* CJK Ideograph */
+ ["\u7832", "\u7832"], /* CJK Ideograph */
+ ["\u7833", "\u7833"], /* CJK Ideograph */
+ ["\u7834", "\u7834"], /* CJK Ideograph */
+ ["\u7835", "\u7835"], /* CJK Ideograph */
+ ["\u7836", "\u7836"], /* CJK Ideograph */
+ ["\u7837", "\u7837"], /* CJK Ideograph */
+ ["\u7838", "\u7838"], /* CJK Ideograph */
+ ["\u7839", "\u7839"], /* CJK Ideograph */
+ ["\u783A", "\u783A"], /* CJK Ideograph */
+ ["\u783B", "\u783B"], /* CJK Ideograph */
+ ["\u783C", "\u783C"], /* CJK Ideograph */
+ ["\u783D", "\u783D"], /* CJK Ideograph */
+ ["\u783E", "\u783E"], /* CJK Ideograph */
+ ["\u783F", "\u783F"], /* CJK Ideograph */
+ ["\u7840", "\u7840"], /* CJK Ideograph */
+ ["\u7841", "\u7841"], /* CJK Ideograph */
+ ["\u7842", "\u7842"], /* CJK Ideograph */
+ ["\u7843", "\u7843"], /* CJK Ideograph */
+ ["\u7844", "\u7844"], /* CJK Ideograph */
+ ["\u7845", "\u7845"], /* CJK Ideograph */
+ ["\u7846", "\u7846"], /* CJK Ideograph */
+ ["\u7847", "\u7847"], /* CJK Ideograph */
+ ["\u7848", "\u7848"], /* CJK Ideograph */
+ ["\u7849", "\u7849"], /* CJK Ideograph */
+ ["\u784A", "\u784A"], /* CJK Ideograph */
+ ["\u784B", "\u784B"], /* CJK Ideograph */
+ ["\u784C", "\u784C"], /* CJK Ideograph */
+ ["\u784D", "\u784D"], /* CJK Ideograph */
+ ["\u784E", "\u784E"], /* CJK Ideograph */
+ ["\u784F", "\u784F"], /* CJK Ideograph */
+ ["\u7850", "\u7850"], /* CJK Ideograph */
+ ["\u7851", "\u7851"], /* CJK Ideograph */
+ ["\u7852", "\u7852"], /* CJK Ideograph */
+ ["\u7853", "\u7853"], /* CJK Ideograph */
+ ["\u7854", "\u7854"], /* CJK Ideograph */
+ ["\u7855", "\u7855"], /* CJK Ideograph */
+ ["\u7856", "\u7856"], /* CJK Ideograph */
+ ["\u7857", "\u7857"], /* CJK Ideograph */
+ ["\u7858", "\u7858"], /* CJK Ideograph */
+ ["\u7859", "\u7859"], /* CJK Ideograph */
+ ["\u785A", "\u785A"], /* CJK Ideograph */
+ ["\u785B", "\u785B"], /* CJK Ideograph */
+ ["\u785C", "\u785C"], /* CJK Ideograph */
+ ["\u785D", "\u785D"], /* CJK Ideograph */
+ ["\u785E", "\u785E"], /* CJK Ideograph */
+ ["\u785F", "\u785F"], /* CJK Ideograph */
+ ["\u7860", "\u7860"], /* CJK Ideograph */
+ ["\u7861", "\u7861"], /* CJK Ideograph */
+ ["\u7862", "\u7862"], /* CJK Ideograph */
+ ["\u7863", "\u7863"], /* CJK Ideograph */
+ ["\u7864", "\u7864"], /* CJK Ideograph */
+ ["\u7865", "\u7865"], /* CJK Ideograph */
+ ["\u7866", "\u7866"], /* CJK Ideograph */
+ ["\u7867", "\u7867"], /* CJK Ideograph */
+ ["\u7868", "\u7868"], /* CJK Ideograph */
+ ["\u7869", "\u7869"], /* CJK Ideograph */
+ ["\u786A", "\u786A"], /* CJK Ideograph */
+ ["\u786B", "\u786B"], /* CJK Ideograph */
+ ["\u786C", "\u786C"], /* CJK Ideograph */
+ ["\u786D", "\u786D"], /* CJK Ideograph */
+ ["\u786E", "\u786E"], /* CJK Ideograph */
+ ["\u786F", "\u786F"], /* CJK Ideograph */
+ ["\u7870", "\u7870"], /* CJK Ideograph */
+ ["\u7871", "\u7871"], /* CJK Ideograph */
+ ["\u7872", "\u7872"], /* CJK Ideograph */
+ ["\u7873", "\u7873"], /* CJK Ideograph */
+ ["\u7874", "\u7874"], /* CJK Ideograph */
+ ["\u7875", "\u7875"], /* CJK Ideograph */
+ ["\u7876", "\u7876"], /* CJK Ideograph */
+ ["\u7877", "\u7877"], /* CJK Ideograph */
+ ["\u7878", "\u7878"], /* CJK Ideograph */
+ ["\u7879", "\u7879"], /* CJK Ideograph */
+ ["\u787A", "\u787A"], /* CJK Ideograph */
+ ["\u787B", "\u787B"], /* CJK Ideograph */
+ ["\u787C", "\u787C"], /* CJK Ideograph */
+ ["\u787D", "\u787D"], /* CJK Ideograph */
+ ["\u787E", "\u787E"], /* CJK Ideograph */
+ ["\u787F", "\u787F"], /* CJK Ideograph */
+ ["\u7880", "\u7880"], /* CJK Ideograph */
+ ["\u7881", "\u7881"], /* CJK Ideograph */
+ ["\u7882", "\u7882"], /* CJK Ideograph */
+ ["\u7883", "\u7883"], /* CJK Ideograph */
+ ["\u7884", "\u7884"], /* CJK Ideograph */
+ ["\u7885", "\u7885"], /* CJK Ideograph */
+ ["\u7886", "\u7886"], /* CJK Ideograph */
+ ["\u7887", "\u7887"], /* CJK Ideograph */
+ ["\u7888", "\u7888"], /* CJK Ideograph */
+ ["\u7889", "\u7889"], /* CJK Ideograph */
+ ["\u788A", "\u788A"], /* CJK Ideograph */
+ ["\u788B", "\u788B"], /* CJK Ideograph */
+ ["\u788C", "\u788C"], /* CJK Ideograph */
+ ["\u788D", "\u788D"], /* CJK Ideograph */
+ ["\u788E", "\u788E"], /* CJK Ideograph */
+ ["\u788F", "\u788F"], /* CJK Ideograph */
+ ["\u7890", "\u7890"], /* CJK Ideograph */
+ ["\u7891", "\u7891"], /* CJK Ideograph */
+ ["\u7892", "\u7892"], /* CJK Ideograph */
+ ["\u7893", "\u7893"], /* CJK Ideograph */
+ ["\u7894", "\u7894"], /* CJK Ideograph */
+ ["\u7895", "\u7895"], /* CJK Ideograph */
+ ["\u7896", "\u7896"], /* CJK Ideograph */
+ ["\u7897", "\u7897"], /* CJK Ideograph */
+ ["\u7898", "\u7898"], /* CJK Ideograph */
+ ["\u7899", "\u7899"], /* CJK Ideograph */
+ ["\u789A", "\u789A"], /* CJK Ideograph */
+ ["\u789B", "\u789B"], /* CJK Ideograph */
+ ["\u789C", "\u789C"], /* CJK Ideograph */
+ ["\u789D", "\u789D"], /* CJK Ideograph */
+ ["\u789E", "\u789E"], /* CJK Ideograph */
+ ["\u789F", "\u789F"], /* CJK Ideograph */
+ ["\u78A0", "\u78A0"], /* CJK Ideograph */
+ ["\u78A1", "\u78A1"], /* CJK Ideograph */
+ ["\u78A2", "\u78A2"], /* CJK Ideograph */
+ ["\u78A3", "\u78A3"], /* CJK Ideograph */
+ ["\u78A4", "\u78A4"], /* CJK Ideograph */
+ ["\u78A5", "\u78A5"], /* CJK Ideograph */
+ ["\u78A6", "\u78A6"], /* CJK Ideograph */
+ ["\u78A7", "\u78A7"], /* CJK Ideograph */
+ ["\u78A8", "\u78A8"], /* CJK Ideograph */
+ ["\u78A9", "\u78A9"], /* CJK Ideograph */
+ ["\u78AA", "\u78AA"], /* CJK Ideograph */
+ ["\u78AB", "\u78AB"], /* CJK Ideograph */
+ ["\u78AC", "\u78AC"], /* CJK Ideograph */
+ ["\u78AD", "\u78AD"], /* CJK Ideograph */
+ ["\u78AE", "\u78AE"], /* CJK Ideograph */
+ ["\u78AF", "\u78AF"], /* CJK Ideograph */
+ ["\u78B0", "\u78B0"], /* CJK Ideograph */
+ ["\u78B1", "\u78B1"], /* CJK Ideograph */
+ ["\u78B2", "\u78B2"], /* CJK Ideograph */
+ ["\u78B3", "\u78B3"], /* CJK Ideograph */
+ ["\u78B4", "\u78B4"], /* CJK Ideograph */
+ ["\u78B5", "\u78B5"], /* CJK Ideograph */
+ ["\u78B6", "\u78B6"], /* CJK Ideograph */
+ ["\u78B7", "\u78B7"], /* CJK Ideograph */
+ ["\u78B8", "\u78B8"], /* CJK Ideograph */
+ ["\u78B9", "\u78B9"], /* CJK Ideograph */
+ ["\u78BA", "\u78BA"], /* CJK Ideograph */
+ ["\u78BB", "\u78BB"], /* CJK Ideograph */
+ ["\u78BC", "\u78BC"], /* CJK Ideograph */
+ ["\u78BD", "\u78BD"], /* CJK Ideograph */
+ ["\u78BE", "\u78BE"], /* CJK Ideograph */
+ ["\u78BF", "\u78BF"], /* CJK Ideograph */
+ ["\u78C0", "\u78C0"], /* CJK Ideograph */
+ ["\u78C1", "\u78C1"], /* CJK Ideograph */
+ ["\u78C2", "\u78C2"], /* CJK Ideograph */
+ ["\u78C3", "\u78C3"], /* CJK Ideograph */
+ ["\u78C4", "\u78C4"], /* CJK Ideograph */
+ ["\u78C5", "\u78C5"], /* CJK Ideograph */
+ ["\u78C6", "\u78C6"], /* CJK Ideograph */
+ ["\u78C7", "\u78C7"], /* CJK Ideograph */
+ ["\u78C8", "\u78C8"], /* CJK Ideograph */
+ ["\u78C9", "\u78C9"], /* CJK Ideograph */
+ ["\u78CA", "\u78CA"], /* CJK Ideograph */
+ ["\u78CB", "\u78CB"], /* CJK Ideograph */
+ ["\u78CC", "\u78CC"], /* CJK Ideograph */
+ ["\u78CD", "\u78CD"], /* CJK Ideograph */
+ ["\u78CE", "\u78CE"], /* CJK Ideograph */
+ ["\u78CF", "\u78CF"], /* CJK Ideograph */
+ ["\u78D0", "\u78D0"], /* CJK Ideograph */
+ ["\u78D1", "\u78D1"], /* CJK Ideograph */
+ ["\u78D2", "\u78D2"], /* CJK Ideograph */
+ ["\u78D3", "\u78D3"], /* CJK Ideograph */
+ ["\u78D4", "\u78D4"], /* CJK Ideograph */
+ ["\u78D5", "\u78D5"], /* CJK Ideograph */
+ ["\u78D6", "\u78D6"], /* CJK Ideograph */
+ ["\u78D7", "\u78D7"], /* CJK Ideograph */
+ ["\u78D8", "\u78D8"], /* CJK Ideograph */
+ ["\u78D9", "\u78D9"], /* CJK Ideograph */
+ ["\u78DA", "\u78DA"], /* CJK Ideograph */
+ ["\u78DB", "\u78DB"], /* CJK Ideograph */
+ ["\u78DC", "\u78DC"], /* CJK Ideograph */
+ ["\u78DD", "\u78DD"], /* CJK Ideograph */
+ ["\u78DE", "\u78DE"], /* CJK Ideograph */
+ ["\u78DF", "\u78DF"], /* CJK Ideograph */
+ ["\u78E0", "\u78E0"], /* CJK Ideograph */
+ ["\u78E1", "\u78E1"], /* CJK Ideograph */
+ ["\u78E2", "\u78E2"], /* CJK Ideograph */
+ ["\u78E3", "\u78E3"], /* CJK Ideograph */
+ ["\u78E4", "\u78E4"], /* CJK Ideograph */
+ ["\u78E5", "\u78E5"], /* CJK Ideograph */
+ ["\u78E6", "\u78E6"], /* CJK Ideograph */
+ ["\u78E7", "\u78E7"], /* CJK Ideograph */
+ ["\u78E8", "\u78E8"], /* CJK Ideograph */
+ ["\u78E9", "\u78E9"], /* CJK Ideograph */
+ ["\u78EA", "\u78EA"], /* CJK Ideograph */
+ ["\u78EB", "\u78EB"], /* CJK Ideograph */
+ ["\u78EC", "\u78EC"], /* CJK Ideograph */
+ ["\u78ED", "\u78ED"], /* CJK Ideograph */
+ ["\u78EE", "\u78EE"], /* CJK Ideograph */
+ ["\u78EF", "\u78EF"], /* CJK Ideograph */
+ ["\u78F0", "\u78F0"], /* CJK Ideograph */
+ ["\u78F1", "\u78F1"], /* CJK Ideograph */
+ ["\u78F2", "\u78F2"], /* CJK Ideograph */
+ ["\u78F3", "\u78F3"], /* CJK Ideograph */
+ ["\u78F4", "\u78F4"], /* CJK Ideograph */
+ ["\u78F5", "\u78F5"], /* CJK Ideograph */
+ ["\u78F6", "\u78F6"], /* CJK Ideograph */
+ ["\u78F7", "\u78F7"], /* CJK Ideograph */
+ ["\u78F8", "\u78F8"], /* CJK Ideograph */
+ ["\u78F9", "\u78F9"], /* CJK Ideograph */
+ ["\u78FA", "\u78FA"], /* CJK Ideograph */
+ ["\u78FB", "\u78FB"], /* CJK Ideograph */
+ ["\u78FC", "\u78FC"], /* CJK Ideograph */
+ ["\u78FD", "\u78FD"], /* CJK Ideograph */
+ ["\u78FE", "\u78FE"], /* CJK Ideograph */
+ ["\u78FF", "\u78FF"], /* CJK Ideograph */
+ ["\u7900", "\u7900"], /* CJK Ideograph */
+ ["\u7901", "\u7901"], /* CJK Ideograph */
+ ["\u7902", "\u7902"], /* CJK Ideograph */
+ ["\u7903", "\u7903"], /* CJK Ideograph */
+ ["\u7904", "\u7904"], /* CJK Ideograph */
+ ["\u7905", "\u7905"], /* CJK Ideograph */
+ ["\u7906", "\u7906"], /* CJK Ideograph */
+ ["\u7907", "\u7907"], /* CJK Ideograph */
+ ["\u7908", "\u7908"], /* CJK Ideograph */
+ ["\u7909", "\u7909"], /* CJK Ideograph */
+ ["\u790A", "\u790A"], /* CJK Ideograph */
+ ["\u790B", "\u790B"], /* CJK Ideograph */
+ ["\u790C", "\u790C"], /* CJK Ideograph */
+ ["\u790D", "\u790D"], /* CJK Ideograph */
+ ["\u790E", "\u790E"], /* CJK Ideograph */
+ ["\u790F", "\u790F"], /* CJK Ideograph */
+ ["\u7910", "\u7910"], /* CJK Ideograph */
+ ["\u7911", "\u7911"], /* CJK Ideograph */
+ ["\u7912", "\u7912"], /* CJK Ideograph */
+ ["\u7913", "\u7913"], /* CJK Ideograph */
+ ["\u7914", "\u7914"], /* CJK Ideograph */
+ ["\u7915", "\u7915"], /* CJK Ideograph */
+ ["\u7916", "\u7916"], /* CJK Ideograph */
+ ["\u7917", "\u7917"], /* CJK Ideograph */
+ ["\u7918", "\u7918"], /* CJK Ideograph */
+ ["\u7919", "\u7919"], /* CJK Ideograph */
+ ["\u791A", "\u791A"], /* CJK Ideograph */
+ ["\u791B", "\u791B"], /* CJK Ideograph */
+ ["\u791C", "\u791C"], /* CJK Ideograph */
+ ["\u791D", "\u791D"], /* CJK Ideograph */
+ ["\u791E", "\u791E"], /* CJK Ideograph */
+ ["\u791F", "\u791F"], /* CJK Ideograph */
+ ["\u7920", "\u7920"], /* CJK Ideograph */
+ ["\u7921", "\u7921"], /* CJK Ideograph */
+ ["\u7922", "\u7922"], /* CJK Ideograph */
+ ["\u7923", "\u7923"], /* CJK Ideograph */
+ ["\u7924", "\u7924"], /* CJK Ideograph */
+ ["\u7925", "\u7925"], /* CJK Ideograph */
+ ["\u7926", "\u7926"], /* CJK Ideograph */
+ ["\u7927", "\u7927"], /* CJK Ideograph */
+ ["\u7928", "\u7928"], /* CJK Ideograph */
+ ["\u7929", "\u7929"], /* CJK Ideograph */
+ ["\u792A", "\u792A"], /* CJK Ideograph */
+ ["\u792B", "\u792B"], /* CJK Ideograph */
+ ["\u792C", "\u792C"], /* CJK Ideograph */
+ ["\u792D", "\u792D"], /* CJK Ideograph */
+ ["\u792E", "\u792E"], /* CJK Ideograph */
+ ["\u792F", "\u792F"], /* CJK Ideograph */
+ ["\u7930", "\u7930"], /* CJK Ideograph */
+ ["\u7931", "\u7931"], /* CJK Ideograph */
+ ["\u7932", "\u7932"], /* CJK Ideograph */
+ ["\u7933", "\u7933"], /* CJK Ideograph */
+ ["\u7934", "\u7934"], /* CJK Ideograph */
+ ["\u7935", "\u7935"], /* CJK Ideograph */
+ ["\u7936", "\u7936"], /* CJK Ideograph */
+ ["\u7937", "\u7937"], /* CJK Ideograph */
+ ["\u7938", "\u7938"], /* CJK Ideograph */
+ ["\u7939", "\u7939"], /* CJK Ideograph */
+ ["\u793A", "\u793A"], /* CJK Ideograph */
+ ["\u793B", "\u793B"], /* CJK Ideograph */
+ ["\u793C", "\u793C"], /* CJK Ideograph */
+ ["\u793D", "\u793D"], /* CJK Ideograph */
+ ["\u793E", "\u793E"], /* CJK Ideograph */
+ ["\u793F", "\u793F"], /* CJK Ideograph */
+ ["\u7940", "\u7940"], /* CJK Ideograph */
+ ["\u7941", "\u7941"], /* CJK Ideograph */
+ ["\u7942", "\u7942"], /* CJK Ideograph */
+ ["\u7943", "\u7943"], /* CJK Ideograph */
+ ["\u7944", "\u7944"], /* CJK Ideograph */
+ ["\u7945", "\u7945"], /* CJK Ideograph */
+ ["\u7946", "\u7946"], /* CJK Ideograph */
+ ["\u7947", "\u7947"], /* CJK Ideograph */
+ ["\u7948", "\u7948"], /* CJK Ideograph */
+ ["\u7949", "\u7949"], /* CJK Ideograph */
+ ["\u794A", "\u794A"], /* CJK Ideograph */
+ ["\u794B", "\u794B"], /* CJK Ideograph */
+ ["\u794C", "\u794C"], /* CJK Ideograph */
+ ["\u794D", "\u794D"], /* CJK Ideograph */
+ ["\u794E", "\u794E"], /* CJK Ideograph */
+ ["\u794F", "\u794F"], /* CJK Ideograph */
+ ["\u7950", "\u7950"], /* CJK Ideograph */
+ ["\u7951", "\u7951"], /* CJK Ideograph */
+ ["\u7952", "\u7952"], /* CJK Ideograph */
+ ["\u7953", "\u7953"], /* CJK Ideograph */
+ ["\u7954", "\u7954"], /* CJK Ideograph */
+ ["\u7955", "\u7955"], /* CJK Ideograph */
+ ["\u7956", "\u7956"], /* CJK Ideograph */
+ ["\u7957", "\u7957"], /* CJK Ideograph */
+ ["\u7958", "\u7958"], /* CJK Ideograph */
+ ["\u7959", "\u7959"], /* CJK Ideograph */
+ ["\u795A", "\u795A"], /* CJK Ideograph */
+ ["\u795B", "\u795B"], /* CJK Ideograph */
+ ["\u795C", "\u795C"], /* CJK Ideograph */
+ ["\u795D", "\u795D"], /* CJK Ideograph */
+ ["\u795E", "\u795E"], /* CJK Ideograph */
+ ["\u795F", "\u795F"], /* CJK Ideograph */
+ ["\u7960", "\u7960"], /* CJK Ideograph */
+ ["\u7961", "\u7961"], /* CJK Ideograph */
+ ["\u7962", "\u7962"], /* CJK Ideograph */
+ ["\u7963", "\u7963"], /* CJK Ideograph */
+ ["\u7964", "\u7964"], /* CJK Ideograph */
+ ["\u7965", "\u7965"], /* CJK Ideograph */
+ ["\u7966", "\u7966"], /* CJK Ideograph */
+ ["\u7967", "\u7967"], /* CJK Ideograph */
+ ["\u7968", "\u7968"], /* CJK Ideograph */
+ ["\u7969", "\u7969"], /* CJK Ideograph */
+ ["\u796A", "\u796A"], /* CJK Ideograph */
+ ["\u796B", "\u796B"], /* CJK Ideograph */
+ ["\u796C", "\u796C"], /* CJK Ideograph */
+ ["\u796D", "\u796D"], /* CJK Ideograph */
+ ["\u796E", "\u796E"], /* CJK Ideograph */
+ ["\u796F", "\u796F"], /* CJK Ideograph */
+ ["\u7970", "\u7970"], /* CJK Ideograph */
+ ["\u7971", "\u7971"], /* CJK Ideograph */
+ ["\u7972", "\u7972"], /* CJK Ideograph */
+ ["\u7973", "\u7973"], /* CJK Ideograph */
+ ["\u7974", "\u7974"], /* CJK Ideograph */
+ ["\u7975", "\u7975"], /* CJK Ideograph */
+ ["\u7976", "\u7976"], /* CJK Ideograph */
+ ["\u7977", "\u7977"], /* CJK Ideograph */
+ ["\u7978", "\u7978"], /* CJK Ideograph */
+ ["\u7979", "\u7979"], /* CJK Ideograph */
+ ["\u797A", "\u797A"], /* CJK Ideograph */
+ ["\u797B", "\u797B"], /* CJK Ideograph */
+ ["\u797C", "\u797C"], /* CJK Ideograph */
+ ["\u797D", "\u797D"], /* CJK Ideograph */
+ ["\u797E", "\u797E"], /* CJK Ideograph */
+ ["\u797F", "\u797F"], /* CJK Ideograph */
+ ["\u7980", "\u7980"], /* CJK Ideograph */
+ ["\u7981", "\u7981"], /* CJK Ideograph */
+ ["\u7982", "\u7982"], /* CJK Ideograph */
+ ["\u7983", "\u7983"], /* CJK Ideograph */
+ ["\u7984", "\u7984"], /* CJK Ideograph */
+ ["\u7985", "\u7985"], /* CJK Ideograph */
+ ["\u7986", "\u7986"], /* CJK Ideograph */
+ ["\u7987", "\u7987"], /* CJK Ideograph */
+ ["\u7988", "\u7988"], /* CJK Ideograph */
+ ["\u7989", "\u7989"], /* CJK Ideograph */
+ ["\u798A", "\u798A"], /* CJK Ideograph */
+ ["\u798B", "\u798B"], /* CJK Ideograph */
+ ["\u798C", "\u798C"], /* CJK Ideograph */
+ ["\u798D", "\u798D"], /* CJK Ideograph */
+ ["\u798E", "\u798E"], /* CJK Ideograph */
+ ["\u798F", "\u798F"], /* CJK Ideograph */
+ ["\u7990", "\u7990"], /* CJK Ideograph */
+ ["\u7991", "\u7991"], /* CJK Ideograph */
+ ["\u7992", "\u7992"], /* CJK Ideograph */
+ ["\u7993", "\u7993"], /* CJK Ideograph */
+ ["\u7994", "\u7994"], /* CJK Ideograph */
+ ["\u7995", "\u7995"], /* CJK Ideograph */
+ ["\u7996", "\u7996"], /* CJK Ideograph */
+ ["\u7997", "\u7997"], /* CJK Ideograph */
+ ["\u7998", "\u7998"], /* CJK Ideograph */
+ ["\u7999", "\u7999"], /* CJK Ideograph */
+ ["\u799A", "\u799A"], /* CJK Ideograph */
+ ["\u799B", "\u799B"], /* CJK Ideograph */
+ ["\u799C", "\u799C"], /* CJK Ideograph */
+ ["\u799D", "\u799D"], /* CJK Ideograph */
+ ["\u799E", "\u799E"], /* CJK Ideograph */
+ ["\u799F", "\u799F"], /* CJK Ideograph */
+ ["\u79A0", "\u79A0"], /* CJK Ideograph */
+ ["\u79A1", "\u79A1"], /* CJK Ideograph */
+ ["\u79A2", "\u79A2"], /* CJK Ideograph */
+ ["\u79A3", "\u79A3"], /* CJK Ideograph */
+ ["\u79A4", "\u79A4"], /* CJK Ideograph */
+ ["\u79A5", "\u79A5"], /* CJK Ideograph */
+ ["\u79A6", "\u79A6"], /* CJK Ideograph */
+ ["\u79A7", "\u79A7"], /* CJK Ideograph */
+ ["\u79A8", "\u79A8"], /* CJK Ideograph */
+ ["\u79A9", "\u79A9"], /* CJK Ideograph */
+ ["\u79AA", "\u79AA"], /* CJK Ideograph */
+ ["\u79AB", "\u79AB"], /* CJK Ideograph */
+ ["\u79AC", "\u79AC"], /* CJK Ideograph */
+ ["\u79AD", "\u79AD"], /* CJK Ideograph */
+ ["\u79AE", "\u79AE"], /* CJK Ideograph */
+ ["\u79AF", "\u79AF"], /* CJK Ideograph */
+ ["\u79B0", "\u79B0"], /* CJK Ideograph */
+ ["\u79B1", "\u79B1"], /* CJK Ideograph */
+ ["\u79B2", "\u79B2"], /* CJK Ideograph */
+ ["\u79B3", "\u79B3"], /* CJK Ideograph */
+ ["\u79B4", "\u79B4"], /* CJK Ideograph */
+ ["\u79B5", "\u79B5"], /* CJK Ideograph */
+ ["\u79B6", "\u79B6"], /* CJK Ideograph */
+ ["\u79B7", "\u79B7"], /* CJK Ideograph */
+ ["\u79B8", "\u79B8"], /* CJK Ideograph */
+ ["\u79B9", "\u79B9"], /* CJK Ideograph */
+ ["\u79BA", "\u79BA"], /* CJK Ideograph */
+ ["\u79BB", "\u79BB"], /* CJK Ideograph */
+ ["\u79BC", "\u79BC"], /* CJK Ideograph */
+ ["\u79BD", "\u79BD"], /* CJK Ideograph */
+ ["\u79BE", "\u79BE"], /* CJK Ideograph */
+ ["\u79BF", "\u79BF"], /* CJK Ideograph */
+ ["\u79C0", "\u79C0"], /* CJK Ideograph */
+ ["\u79C1", "\u79C1"], /* CJK Ideograph */
+ ["\u79C2", "\u79C2"], /* CJK Ideograph */
+ ["\u79C3", "\u79C3"], /* CJK Ideograph */
+ ["\u79C4", "\u79C4"], /* CJK Ideograph */
+ ["\u79C5", "\u79C5"], /* CJK Ideograph */
+ ["\u79C6", "\u79C6"], /* CJK Ideograph */
+ ["\u79C7", "\u79C7"], /* CJK Ideograph */
+ ["\u79C8", "\u79C8"], /* CJK Ideograph */
+ ["\u79C9", "\u79C9"], /* CJK Ideograph */
+ ["\u79CA", "\u79CA"], /* CJK Ideograph */
+ ["\u79CB", "\u79CB"], /* CJK Ideograph */
+ ["\u79CC", "\u79CC"], /* CJK Ideograph */
+ ["\u79CD", "\u79CD"], /* CJK Ideograph */
+ ["\u79CE", "\u79CE"], /* CJK Ideograph */
+ ["\u79CF", "\u79CF"], /* CJK Ideograph */
+ ["\u79D0", "\u79D0"], /* CJK Ideograph */
+ ["\u79D1", "\u79D1"], /* CJK Ideograph */
+ ["\u79D2", "\u79D2"], /* CJK Ideograph */
+ ["\u79D3", "\u79D3"], /* CJK Ideograph */
+ ["\u79D4", "\u79D4"], /* CJK Ideograph */
+ ["\u79D5", "\u79D5"], /* CJK Ideograph */
+ ["\u79D6", "\u79D6"], /* CJK Ideograph */
+ ["\u79D7", "\u79D7"], /* CJK Ideograph */
+ ["\u79D8", "\u79D8"], /* CJK Ideograph */
+ ["\u79D9", "\u79D9"], /* CJK Ideograph */
+ ["\u79DA", "\u79DA"], /* CJK Ideograph */
+ ["\u79DB", "\u79DB"], /* CJK Ideograph */
+ ["\u79DC", "\u79DC"], /* CJK Ideograph */
+ ["\u79DD", "\u79DD"], /* CJK Ideograph */
+ ["\u79DE", "\u79DE"], /* CJK Ideograph */
+ ["\u79DF", "\u79DF"], /* CJK Ideograph */
+ ["\u79E0", "\u79E0"], /* CJK Ideograph */
+ ["\u79E1", "\u79E1"], /* CJK Ideograph */
+ ["\u79E2", "\u79E2"], /* CJK Ideograph */
+ ["\u79E3", "\u79E3"], /* CJK Ideograph */
+ ["\u79E4", "\u79E4"], /* CJK Ideograph */
+ ["\u79E5", "\u79E5"], /* CJK Ideograph */
+ ["\u79E6", "\u79E6"], /* CJK Ideograph */
+ ["\u79E7", "\u79E7"], /* CJK Ideograph */
+ ["\u79E8", "\u79E8"], /* CJK Ideograph */
+ ["\u79E9", "\u79E9"], /* CJK Ideograph */
+ ["\u79EA", "\u79EA"], /* CJK Ideograph */
+ ["\u79EB", "\u79EB"], /* CJK Ideograph */
+ ["\u79EC", "\u79EC"], /* CJK Ideograph */
+ ["\u79ED", "\u79ED"], /* CJK Ideograph */
+ ["\u79EE", "\u79EE"], /* CJK Ideograph */
+ ["\u79EF", "\u79EF"], /* CJK Ideograph */
+ ["\u79F0", "\u79F0"], /* CJK Ideograph */
+ ["\u79F1", "\u79F1"], /* CJK Ideograph */
+ ["\u79F2", "\u79F2"], /* CJK Ideograph */
+ ["\u79F3", "\u79F3"], /* CJK Ideograph */
+ ["\u79F4", "\u79F4"], /* CJK Ideograph */
+ ["\u79F5", "\u79F5"], /* CJK Ideograph */
+ ["\u79F6", "\u79F6"], /* CJK Ideograph */
+ ["\u79F7", "\u79F7"], /* CJK Ideograph */
+ ["\u79F8", "\u79F8"], /* CJK Ideograph */
+ ["\u79F9", "\u79F9"], /* CJK Ideograph */
+ ["\u79FA", "\u79FA"], /* CJK Ideograph */
+ ["\u79FB", "\u79FB"], /* CJK Ideograph */
+ ["\u79FC", "\u79FC"], /* CJK Ideograph */
+ ["\u79FD", "\u79FD"], /* CJK Ideograph */
+ ["\u79FE", "\u79FE"], /* CJK Ideograph */
+ ["\u79FF", "\u79FF"], /* CJK Ideograph */
+ ["\u7A00", "\u7A00"], /* CJK Ideograph */
+ ["\u7A01", "\u7A01"], /* CJK Ideograph */
+ ["\u7A02", "\u7A02"], /* CJK Ideograph */
+ ["\u7A03", "\u7A03"], /* CJK Ideograph */
+ ["\u7A04", "\u7A04"], /* CJK Ideograph */
+ ["\u7A05", "\u7A05"], /* CJK Ideograph */
+ ["\u7A06", "\u7A06"], /* CJK Ideograph */
+ ["\u7A07", "\u7A07"], /* CJK Ideograph */
+ ["\u7A08", "\u7A08"], /* CJK Ideograph */
+ ["\u7A09", "\u7A09"], /* CJK Ideograph */
+ ["\u7A0A", "\u7A0A"], /* CJK Ideograph */
+ ["\u7A0B", "\u7A0B"], /* CJK Ideograph */
+ ["\u7A0C", "\u7A0C"], /* CJK Ideograph */
+ ["\u7A0D", "\u7A0D"], /* CJK Ideograph */
+ ["\u7A0E", "\u7A0E"], /* CJK Ideograph */
+ ["\u7A0F", "\u7A0F"], /* CJK Ideograph */
+ ["\u7A10", "\u7A10"], /* CJK Ideograph */
+ ["\u7A11", "\u7A11"], /* CJK Ideograph */
+ ["\u7A12", "\u7A12"], /* CJK Ideograph */
+ ["\u7A13", "\u7A13"], /* CJK Ideograph */
+ ["\u7A14", "\u7A14"], /* CJK Ideograph */
+ ["\u7A15", "\u7A15"], /* CJK Ideograph */
+ ["\u7A16", "\u7A16"], /* CJK Ideograph */
+ ["\u7A17", "\u7A17"], /* CJK Ideograph */
+ ["\u7A18", "\u7A18"], /* CJK Ideograph */
+ ["\u7A19", "\u7A19"], /* CJK Ideograph */
+ ["\u7A1A", "\u7A1A"], /* CJK Ideograph */
+ ["\u7A1B", "\u7A1B"], /* CJK Ideograph */
+ ["\u7A1C", "\u7A1C"], /* CJK Ideograph */
+ ["\u7A1D", "\u7A1D"], /* CJK Ideograph */
+ ["\u7A1E", "\u7A1E"], /* CJK Ideograph */
+ ["\u7A1F", "\u7A1F"], /* CJK Ideograph */
+ ["\u7A20", "\u7A20"], /* CJK Ideograph */
+ ["\u7A21", "\u7A21"], /* CJK Ideograph */
+ ["\u7A22", "\u7A22"], /* CJK Ideograph */
+ ["\u7A23", "\u7A23"], /* CJK Ideograph */
+ ["\u7A24", "\u7A24"], /* CJK Ideograph */
+ ["\u7A25", "\u7A25"], /* CJK Ideograph */
+ ["\u7A26", "\u7A26"], /* CJK Ideograph */
+ ["\u7A27", "\u7A27"], /* CJK Ideograph */
+ ["\u7A28", "\u7A28"], /* CJK Ideograph */
+ ["\u7A29", "\u7A29"], /* CJK Ideograph */
+ ["\u7A2A", "\u7A2A"], /* CJK Ideograph */
+ ["\u7A2B", "\u7A2B"], /* CJK Ideograph */
+ ["\u7A2C", "\u7A2C"], /* CJK Ideograph */
+ ["\u7A2D", "\u7A2D"], /* CJK Ideograph */
+ ["\u7A2E", "\u7A2E"], /* CJK Ideograph */
+ ["\u7A2F", "\u7A2F"], /* CJK Ideograph */
+ ["\u7A30", "\u7A30"], /* CJK Ideograph */
+ ["\u7A31", "\u7A31"], /* CJK Ideograph */
+ ["\u7A32", "\u7A32"], /* CJK Ideograph */
+ ["\u7A33", "\u7A33"], /* CJK Ideograph */
+ ["\u7A34", "\u7A34"], /* CJK Ideograph */
+ ["\u7A35", "\u7A35"], /* CJK Ideograph */
+ ["\u7A36", "\u7A36"], /* CJK Ideograph */
+ ["\u7A37", "\u7A37"], /* CJK Ideograph */
+ ["\u7A38", "\u7A38"], /* CJK Ideograph */
+ ["\u7A39", "\u7A39"], /* CJK Ideograph */
+ ["\u7A3A", "\u7A3A"], /* CJK Ideograph */
+ ["\u7A3B", "\u7A3B"], /* CJK Ideograph */
+ ["\u7A3C", "\u7A3C"], /* CJK Ideograph */
+ ["\u7A3D", "\u7A3D"], /* CJK Ideograph */
+ ["\u7A3E", "\u7A3E"], /* CJK Ideograph */
+ ["\u7A3F", "\u7A3F"], /* CJK Ideograph */
+ ["\u7A40", "\u7A40"], /* CJK Ideograph */
+ ["\u7A41", "\u7A41"], /* CJK Ideograph */
+ ["\u7A42", "\u7A42"], /* CJK Ideograph */
+ ["\u7A43", "\u7A43"], /* CJK Ideograph */
+ ["\u7A44", "\u7A44"], /* CJK Ideograph */
+ ["\u7A45", "\u7A45"], /* CJK Ideograph */
+ ["\u7A46", "\u7A46"], /* CJK Ideograph */
+ ["\u7A47", "\u7A47"], /* CJK Ideograph */
+ ["\u7A48", "\u7A48"], /* CJK Ideograph */
+ ["\u7A49", "\u7A49"], /* CJK Ideograph */
+ ["\u7A4A", "\u7A4A"], /* CJK Ideograph */
+ ["\u7A4B", "\u7A4B"], /* CJK Ideograph */
+ ["\u7A4C", "\u7A4C"], /* CJK Ideograph */
+ ["\u7A4D", "\u7A4D"], /* CJK Ideograph */
+ ["\u7A4E", "\u7A4E"], /* CJK Ideograph */
+ ["\u7A4F", "\u7A4F"], /* CJK Ideograph */
+ ["\u7A50", "\u7A50"], /* CJK Ideograph */
+ ["\u7A51", "\u7A51"], /* CJK Ideograph */
+ ["\u7A52", "\u7A52"], /* CJK Ideograph */
+ ["\u7A53", "\u7A53"], /* CJK Ideograph */
+ ["\u7A54", "\u7A54"], /* CJK Ideograph */
+ ["\u7A55", "\u7A55"], /* CJK Ideograph */
+ ["\u7A56", "\u7A56"], /* CJK Ideograph */
+ ["\u7A57", "\u7A57"], /* CJK Ideograph */
+ ["\u7A58", "\u7A58"], /* CJK Ideograph */
+ ["\u7A59", "\u7A59"], /* CJK Ideograph */
+ ["\u7A5A", "\u7A5A"], /* CJK Ideograph */
+ ["\u7A5B", "\u7A5B"], /* CJK Ideograph */
+ ["\u7A5C", "\u7A5C"], /* CJK Ideograph */
+ ["\u7A5D", "\u7A5D"], /* CJK Ideograph */
+ ["\u7A5E", "\u7A5E"], /* CJK Ideograph */
+ ["\u7A5F", "\u7A5F"], /* CJK Ideograph */
+ ["\u7A60", "\u7A60"], /* CJK Ideograph */
+ ["\u7A61", "\u7A61"], /* CJK Ideograph */
+ ["\u7A62", "\u7A62"], /* CJK Ideograph */
+ ["\u7A63", "\u7A63"], /* CJK Ideograph */
+ ["\u7A64", "\u7A64"], /* CJK Ideograph */
+ ["\u7A65", "\u7A65"], /* CJK Ideograph */
+ ["\u7A66", "\u7A66"], /* CJK Ideograph */
+ ["\u7A67", "\u7A67"], /* CJK Ideograph */
+ ["\u7A68", "\u7A68"], /* CJK Ideograph */
+ ["\u7A69", "\u7A69"], /* CJK Ideograph */
+ ["\u7A6A", "\u7A6A"], /* CJK Ideograph */
+ ["\u7A6B", "\u7A6B"], /* CJK Ideograph */
+ ["\u7A6C", "\u7A6C"], /* CJK Ideograph */
+ ["\u7A6D", "\u7A6D"], /* CJK Ideograph */
+ ["\u7A6E", "\u7A6E"], /* CJK Ideograph */
+ ["\u7A6F", "\u7A6F"], /* CJK Ideograph */
+ ["\u7A70", "\u7A70"], /* CJK Ideograph */
+ ["\u7A71", "\u7A71"], /* CJK Ideograph */
+ ["\u7A72", "\u7A72"], /* CJK Ideograph */
+ ["\u7A73", "\u7A73"], /* CJK Ideograph */
+ ["\u7A74", "\u7A74"], /* CJK Ideograph */
+ ["\u7A75", "\u7A75"], /* CJK Ideograph */
+ ["\u7A76", "\u7A76"], /* CJK Ideograph */
+ ["\u7A77", "\u7A77"], /* CJK Ideograph */
+ ["\u7A78", "\u7A78"], /* CJK Ideograph */
+ ["\u7A79", "\u7A79"], /* CJK Ideograph */
+ ["\u7A7A", "\u7A7A"], /* CJK Ideograph */
+ ["\u7A7B", "\u7A7B"], /* CJK Ideograph */
+ ["\u7A7C", "\u7A7C"], /* CJK Ideograph */
+ ["\u7A7D", "\u7A7D"], /* CJK Ideograph */
+ ["\u7A7E", "\u7A7E"], /* CJK Ideograph */
+ ["\u7A7F", "\u7A7F"], /* CJK Ideograph */
+ ["\u7A80", "\u7A80"], /* CJK Ideograph */
+ ["\u7A81", "\u7A81"], /* CJK Ideograph */
+ ["\u7A82", "\u7A82"], /* CJK Ideograph */
+ ["\u7A83", "\u7A83"], /* CJK Ideograph */
+ ["\u7A84", "\u7A84"], /* CJK Ideograph */
+ ["\u7A85", "\u7A85"], /* CJK Ideograph */
+ ["\u7A86", "\u7A86"], /* CJK Ideograph */
+ ["\u7A87", "\u7A87"], /* CJK Ideograph */
+ ["\u7A88", "\u7A88"], /* CJK Ideograph */
+ ["\u7A89", "\u7A89"], /* CJK Ideograph */
+ ["\u7A8A", "\u7A8A"], /* CJK Ideograph */
+ ["\u7A8B", "\u7A8B"], /* CJK Ideograph */
+ ["\u7A8C", "\u7A8C"], /* CJK Ideograph */
+ ["\u7A8D", "\u7A8D"], /* CJK Ideograph */
+ ["\u7A8E", "\u7A8E"], /* CJK Ideograph */
+ ["\u7A8F", "\u7A8F"], /* CJK Ideograph */
+ ["\u7A90", "\u7A90"], /* CJK Ideograph */
+ ["\u7A91", "\u7A91"], /* CJK Ideograph */
+ ["\u7A92", "\u7A92"], /* CJK Ideograph */
+ ["\u7A93", "\u7A93"], /* CJK Ideograph */
+ ["\u7A94", "\u7A94"], /* CJK Ideograph */
+ ["\u7A95", "\u7A95"], /* CJK Ideograph */
+ ["\u7A96", "\u7A96"], /* CJK Ideograph */
+ ["\u7A97", "\u7A97"], /* CJK Ideograph */
+ ["\u7A98", "\u7A98"], /* CJK Ideograph */
+ ["\u7A99", "\u7A99"], /* CJK Ideograph */
+ ["\u7A9A", "\u7A9A"], /* CJK Ideograph */
+ ["\u7A9B", "\u7A9B"], /* CJK Ideograph */
+ ["\u7A9C", "\u7A9C"], /* CJK Ideograph */
+ ["\u7A9D", "\u7A9D"], /* CJK Ideograph */
+ ["\u7A9E", "\u7A9E"], /* CJK Ideograph */
+ ["\u7A9F", "\u7A9F"], /* CJK Ideograph */
+ ["\u7AA0", "\u7AA0"], /* CJK Ideograph */
+ ["\u7AA1", "\u7AA1"], /* CJK Ideograph */
+ ["\u7AA2", "\u7AA2"], /* CJK Ideograph */
+ ["\u7AA3", "\u7AA3"], /* CJK Ideograph */
+ ["\u7AA4", "\u7AA4"], /* CJK Ideograph */
+ ["\u7AA5", "\u7AA5"], /* CJK Ideograph */
+ ["\u7AA6", "\u7AA6"], /* CJK Ideograph */
+ ["\u7AA7", "\u7AA7"], /* CJK Ideograph */
+ ["\u7AA8", "\u7AA8"], /* CJK Ideograph */
+ ["\u7AA9", "\u7AA9"], /* CJK Ideograph */
+ ["\u7AAA", "\u7AAA"], /* CJK Ideograph */
+ ["\u7AAB", "\u7AAB"], /* CJK Ideograph */
+ ["\u7AAC", "\u7AAC"], /* CJK Ideograph */
+ ["\u7AAD", "\u7AAD"], /* CJK Ideograph */
+ ["\u7AAE", "\u7AAE"], /* CJK Ideograph */
+ ["\u7AAF", "\u7AAF"], /* CJK Ideograph */
+ ["\u7AB0", "\u7AB0"], /* CJK Ideograph */
+ ["\u7AB1", "\u7AB1"], /* CJK Ideograph */
+ ["\u7AB2", "\u7AB2"], /* CJK Ideograph */
+ ["\u7AB3", "\u7AB3"], /* CJK Ideograph */
+ ["\u7AB4", "\u7AB4"], /* CJK Ideograph */
+ ["\u7AB5", "\u7AB5"], /* CJK Ideograph */
+ ["\u7AB6", "\u7AB6"], /* CJK Ideograph */
+ ["\u7AB7", "\u7AB7"], /* CJK Ideograph */
+ ["\u7AB8", "\u7AB8"], /* CJK Ideograph */
+ ["\u7AB9", "\u7AB9"], /* CJK Ideograph */
+ ["\u7ABA", "\u7ABA"], /* CJK Ideograph */
+ ["\u7ABB", "\u7ABB"], /* CJK Ideograph */
+ ["\u7ABC", "\u7ABC"], /* CJK Ideograph */
+ ["\u7ABD", "\u7ABD"], /* CJK Ideograph */
+ ["\u7ABE", "\u7ABE"], /* CJK Ideograph */
+ ["\u7ABF", "\u7ABF"], /* CJK Ideograph */
+ ["\u7AC0", "\u7AC0"], /* CJK Ideograph */
+ ["\u7AC1", "\u7AC1"], /* CJK Ideograph */
+ ["\u7AC2", "\u7AC2"], /* CJK Ideograph */
+ ["\u7AC3", "\u7AC3"], /* CJK Ideograph */
+ ["\u7AC4", "\u7AC4"], /* CJK Ideograph */
+ ["\u7AC5", "\u7AC5"], /* CJK Ideograph */
+ ["\u7AC6", "\u7AC6"], /* CJK Ideograph */
+ ["\u7AC7", "\u7AC7"], /* CJK Ideograph */
+ ["\u7AC8", "\u7AC8"], /* CJK Ideograph */
+ ["\u7AC9", "\u7AC9"], /* CJK Ideograph */
+ ["\u7ACA", "\u7ACA"], /* CJK Ideograph */
+ ["\u7ACB", "\u7ACB"], /* CJK Ideograph */
+ ["\u7ACC", "\u7ACC"], /* CJK Ideograph */
+ ["\u7ACD", "\u7ACD"], /* CJK Ideograph */
+ ["\u7ACE", "\u7ACE"], /* CJK Ideograph */
+ ["\u7ACF", "\u7ACF"], /* CJK Ideograph */
+ ["\u7AD0", "\u7AD0"], /* CJK Ideograph */
+ ["\u7AD1", "\u7AD1"], /* CJK Ideograph */
+ ["\u7AD2", "\u7AD2"], /* CJK Ideograph */
+ ["\u7AD3", "\u7AD3"], /* CJK Ideograph */
+ ["\u7AD4", "\u7AD4"], /* CJK Ideograph */
+ ["\u7AD5", "\u7AD5"], /* CJK Ideograph */
+ ["\u7AD6", "\u7AD6"], /* CJK Ideograph */
+ ["\u7AD7", "\u7AD7"], /* CJK Ideograph */
+ ["\u7AD8", "\u7AD8"], /* CJK Ideograph */
+ ["\u7AD9", "\u7AD9"], /* CJK Ideograph */
+ ["\u7ADA", "\u7ADA"], /* CJK Ideograph */
+ ["\u7ADB", "\u7ADB"], /* CJK Ideograph */
+ ["\u7ADC", "\u7ADC"], /* CJK Ideograph */
+ ["\u7ADD", "\u7ADD"], /* CJK Ideograph */
+ ["\u7ADE", "\u7ADE"], /* CJK Ideograph */
+ ["\u7ADF", "\u7ADF"], /* CJK Ideograph */
+ ["\u7AE0", "\u7AE0"], /* CJK Ideograph */
+ ["\u7AE1", "\u7AE1"], /* CJK Ideograph */
+ ["\u7AE2", "\u7AE2"], /* CJK Ideograph */
+ ["\u7AE3", "\u7AE3"], /* CJK Ideograph */
+ ["\u7AE4", "\u7AE4"], /* CJK Ideograph */
+ ["\u7AE5", "\u7AE5"], /* CJK Ideograph */
+ ["\u7AE6", "\u7AE6"], /* CJK Ideograph */
+ ["\u7AE7", "\u7AE7"], /* CJK Ideograph */
+ ["\u7AE8", "\u7AE8"], /* CJK Ideograph */
+ ["\u7AE9", "\u7AE9"], /* CJK Ideograph */
+ ["\u7AEA", "\u7AEA"], /* CJK Ideograph */
+ ["\u7AEB", "\u7AEB"], /* CJK Ideograph */
+ ["\u7AEC", "\u7AEC"], /* CJK Ideograph */
+ ["\u7AED", "\u7AED"], /* CJK Ideograph */
+ ["\u7AEE", "\u7AEE"], /* CJK Ideograph */
+ ["\u7AEF", "\u7AEF"], /* CJK Ideograph */
+ ["\u7AF0", "\u7AF0"], /* CJK Ideograph */
+ ["\u7AF1", "\u7AF1"], /* CJK Ideograph */
+ ["\u7AF2", "\u7AF2"], /* CJK Ideograph */
+ ["\u7AF3", "\u7AF3"], /* CJK Ideograph */
+ ["\u7AF4", "\u7AF4"], /* CJK Ideograph */
+ ["\u7AF5", "\u7AF5"], /* CJK Ideograph */
+ ["\u7AF6", "\u7AF6"], /* CJK Ideograph */
+ ["\u7AF7", "\u7AF7"], /* CJK Ideograph */
+ ["\u7AF8", "\u7AF8"], /* CJK Ideograph */
+ ["\u7AF9", "\u7AF9"], /* CJK Ideograph */
+ ["\u7AFA", "\u7AFA"], /* CJK Ideograph */
+ ["\u7AFB", "\u7AFB"], /* CJK Ideograph */
+ ["\u7AFC", "\u7AFC"], /* CJK Ideograph */
+ ["\u7AFD", "\u7AFD"], /* CJK Ideograph */
+ ["\u7AFE", "\u7AFE"], /* CJK Ideograph */
+ ["\u7AFF", "\u7AFF"], /* CJK Ideograph */
+ ["\u7B00", "\u7B00"], /* CJK Ideograph */
+ ["\u7B01", "\u7B01"], /* CJK Ideograph */
+ ["\u7B02", "\u7B02"], /* CJK Ideograph */
+ ["\u7B03", "\u7B03"], /* CJK Ideograph */
+ ["\u7B04", "\u7B04"], /* CJK Ideograph */
+ ["\u7B05", "\u7B05"], /* CJK Ideograph */
+ ["\u7B06", "\u7B06"], /* CJK Ideograph */
+ ["\u7B07", "\u7B07"], /* CJK Ideograph */
+ ["\u7B08", "\u7B08"], /* CJK Ideograph */
+ ["\u7B09", "\u7B09"], /* CJK Ideograph */
+ ["\u7B0A", "\u7B0A"], /* CJK Ideograph */
+ ["\u7B0B", "\u7B0B"], /* CJK Ideograph */
+ ["\u7B0C", "\u7B0C"], /* CJK Ideograph */
+ ["\u7B0D", "\u7B0D"], /* CJK Ideograph */
+ ["\u7B0E", "\u7B0E"], /* CJK Ideograph */
+ ["\u7B0F", "\u7B0F"], /* CJK Ideograph */
+ ["\u7B10", "\u7B10"], /* CJK Ideograph */
+ ["\u7B11", "\u7B11"], /* CJK Ideograph */
+ ["\u7B12", "\u7B12"], /* CJK Ideograph */
+ ["\u7B13", "\u7B13"], /* CJK Ideograph */
+ ["\u7B14", "\u7B14"], /* CJK Ideograph */
+ ["\u7B15", "\u7B15"], /* CJK Ideograph */
+ ["\u7B16", "\u7B16"], /* CJK Ideograph */
+ ["\u7B17", "\u7B17"], /* CJK Ideograph */
+ ["\u7B18", "\u7B18"], /* CJK Ideograph */
+ ["\u7B19", "\u7B19"], /* CJK Ideograph */
+ ["\u7B1A", "\u7B1A"], /* CJK Ideograph */
+ ["\u7B1B", "\u7B1B"], /* CJK Ideograph */
+ ["\u7B1C", "\u7B1C"], /* CJK Ideograph */
+ ["\u7B1D", "\u7B1D"], /* CJK Ideograph */
+ ["\u7B1E", "\u7B1E"], /* CJK Ideograph */
+ ["\u7B1F", "\u7B1F"], /* CJK Ideograph */
+ ["\u7B20", "\u7B20"], /* CJK Ideograph */
+ ["\u7B21", "\u7B21"], /* CJK Ideograph */
+ ["\u7B22", "\u7B22"], /* CJK Ideograph */
+ ["\u7B23", "\u7B23"], /* CJK Ideograph */
+ ["\u7B24", "\u7B24"], /* CJK Ideograph */
+ ["\u7B25", "\u7B25"], /* CJK Ideograph */
+ ["\u7B26", "\u7B26"], /* CJK Ideograph */
+ ["\u7B27", "\u7B27"], /* CJK Ideograph */
+ ["\u7B28", "\u7B28"], /* CJK Ideograph */
+ ["\u7B29", "\u7B29"], /* CJK Ideograph */
+ ["\u7B2A", "\u7B2A"], /* CJK Ideograph */
+ ["\u7B2B", "\u7B2B"], /* CJK Ideograph */
+ ["\u7B2C", "\u7B2C"], /* CJK Ideograph */
+ ["\u7B2D", "\u7B2D"], /* CJK Ideograph */
+ ["\u7B2E", "\u7B2E"], /* CJK Ideograph */
+ ["\u7B2F", "\u7B2F"], /* CJK Ideograph */
+ ["\u7B30", "\u7B30"], /* CJK Ideograph */
+ ["\u7B31", "\u7B31"], /* CJK Ideograph */
+ ["\u7B32", "\u7B32"], /* CJK Ideograph */
+ ["\u7B33", "\u7B33"], /* CJK Ideograph */
+ ["\u7B34", "\u7B34"], /* CJK Ideograph */
+ ["\u7B35", "\u7B35"], /* CJK Ideograph */
+ ["\u7B36", "\u7B36"], /* CJK Ideograph */
+ ["\u7B37", "\u7B37"], /* CJK Ideograph */
+ ["\u7B38", "\u7B38"], /* CJK Ideograph */
+ ["\u7B39", "\u7B39"], /* CJK Ideograph */
+ ["\u7B3A", "\u7B3A"], /* CJK Ideograph */
+ ["\u7B3B", "\u7B3B"], /* CJK Ideograph */
+ ["\u7B3C", "\u7B3C"], /* CJK Ideograph */
+ ["\u7B3D", "\u7B3D"], /* CJK Ideograph */
+ ["\u7B3E", "\u7B3E"], /* CJK Ideograph */
+ ["\u7B3F", "\u7B3F"], /* CJK Ideograph */
+ ["\u7B40", "\u7B40"], /* CJK Ideograph */
+ ["\u7B41", "\u7B41"], /* CJK Ideograph */
+ ["\u7B42", "\u7B42"], /* CJK Ideograph */
+ ["\u7B43", "\u7B43"], /* CJK Ideograph */
+ ["\u7B44", "\u7B44"], /* CJK Ideograph */
+ ["\u7B45", "\u7B45"], /* CJK Ideograph */
+ ["\u7B46", "\u7B46"], /* CJK Ideograph */
+ ["\u7B47", "\u7B47"], /* CJK Ideograph */
+ ["\u7B48", "\u7B48"], /* CJK Ideograph */
+ ["\u7B49", "\u7B49"], /* CJK Ideograph */
+ ["\u7B4A", "\u7B4A"], /* CJK Ideograph */
+ ["\u7B4B", "\u7B4B"], /* CJK Ideograph */
+ ["\u7B4C", "\u7B4C"], /* CJK Ideograph */
+ ["\u7B4D", "\u7B4D"], /* CJK Ideograph */
+ ["\u7B4E", "\u7B4E"], /* CJK Ideograph */
+ ["\u7B4F", "\u7B4F"], /* CJK Ideograph */
+ ["\u7B50", "\u7B50"], /* CJK Ideograph */
+ ["\u7B51", "\u7B51"], /* CJK Ideograph */
+ ["\u7B52", "\u7B52"], /* CJK Ideograph */
+ ["\u7B53", "\u7B53"], /* CJK Ideograph */
+ ["\u7B54", "\u7B54"], /* CJK Ideograph */
+ ["\u7B55", "\u7B55"], /* CJK Ideograph */
+ ["\u7B56", "\u7B56"], /* CJK Ideograph */
+ ["\u7B57", "\u7B57"], /* CJK Ideograph */
+ ["\u7B58", "\u7B58"], /* CJK Ideograph */
+ ["\u7B59", "\u7B59"], /* CJK Ideograph */
+ ["\u7B5A", "\u7B5A"], /* CJK Ideograph */
+ ["\u7B5B", "\u7B5B"], /* CJK Ideograph */
+ ["\u7B5C", "\u7B5C"], /* CJK Ideograph */
+ ["\u7B5D", "\u7B5D"], /* CJK Ideograph */
+ ["\u7B5E", "\u7B5E"], /* CJK Ideograph */
+ ["\u7B5F", "\u7B5F"], /* CJK Ideograph */
+ ["\u7B60", "\u7B60"], /* CJK Ideograph */
+ ["\u7B61", "\u7B61"], /* CJK Ideograph */
+ ["\u7B62", "\u7B62"], /* CJK Ideograph */
+ ["\u7B63", "\u7B63"], /* CJK Ideograph */
+ ["\u7B64", "\u7B64"], /* CJK Ideograph */
+ ["\u7B65", "\u7B65"], /* CJK Ideograph */
+ ["\u7B66", "\u7B66"], /* CJK Ideograph */
+ ["\u7B67", "\u7B67"], /* CJK Ideograph */
+ ["\u7B68", "\u7B68"], /* CJK Ideograph */
+ ["\u7B69", "\u7B69"], /* CJK Ideograph */
+ ["\u7B6A", "\u7B6A"], /* CJK Ideograph */
+ ["\u7B6B", "\u7B6B"], /* CJK Ideograph */
+ ["\u7B6C", "\u7B6C"], /* CJK Ideograph */
+ ["\u7B6D", "\u7B6D"], /* CJK Ideograph */
+ ["\u7B6E", "\u7B6E"], /* CJK Ideograph */
+ ["\u7B6F", "\u7B6F"], /* CJK Ideograph */
+ ["\u7B70", "\u7B70"], /* CJK Ideograph */
+ ["\u7B71", "\u7B71"], /* CJK Ideograph */
+ ["\u7B72", "\u7B72"], /* CJK Ideograph */
+ ["\u7B73", "\u7B73"], /* CJK Ideograph */
+ ["\u7B74", "\u7B74"], /* CJK Ideograph */
+ ["\u7B75", "\u7B75"], /* CJK Ideograph */
+ ["\u7B76", "\u7B76"], /* CJK Ideograph */
+ ["\u7B77", "\u7B77"], /* CJK Ideograph */
+ ["\u7B78", "\u7B78"], /* CJK Ideograph */
+ ["\u7B79", "\u7B79"], /* CJK Ideograph */
+ ["\u7B7A", "\u7B7A"], /* CJK Ideograph */
+ ["\u7B7B", "\u7B7B"], /* CJK Ideograph */
+ ["\u7B7C", "\u7B7C"], /* CJK Ideograph */
+ ["\u7B7D", "\u7B7D"], /* CJK Ideograph */
+ ["\u7B7E", "\u7B7E"], /* CJK Ideograph */
+ ["\u7B7F", "\u7B7F"], /* CJK Ideograph */
+ ["\u7B80", "\u7B80"], /* CJK Ideograph */
+ ["\u7B81", "\u7B81"], /* CJK Ideograph */
+ ["\u7B82", "\u7B82"], /* CJK Ideograph */
+ ["\u7B83", "\u7B83"], /* CJK Ideograph */
+ ["\u7B84", "\u7B84"], /* CJK Ideograph */
+ ["\u7B85", "\u7B85"], /* CJK Ideograph */
+ ["\u7B86", "\u7B86"], /* CJK Ideograph */
+ ["\u7B87", "\u7B87"], /* CJK Ideograph */
+ ["\u7B88", "\u7B88"], /* CJK Ideograph */
+ ["\u7B89", "\u7B89"], /* CJK Ideograph */
+ ["\u7B8A", "\u7B8A"], /* CJK Ideograph */
+ ["\u7B8B", "\u7B8B"], /* CJK Ideograph */
+ ["\u7B8C", "\u7B8C"], /* CJK Ideograph */
+ ["\u7B8D", "\u7B8D"], /* CJK Ideograph */
+ ["\u7B8E", "\u7B8E"], /* CJK Ideograph */
+ ["\u7B8F", "\u7B8F"], /* CJK Ideograph */
+ ["\u7B90", "\u7B90"], /* CJK Ideograph */
+ ["\u7B91", "\u7B91"], /* CJK Ideograph */
+ ["\u7B92", "\u7B92"], /* CJK Ideograph */
+ ["\u7B93", "\u7B93"], /* CJK Ideograph */
+ ["\u7B94", "\u7B94"], /* CJK Ideograph */
+ ["\u7B95", "\u7B95"], /* CJK Ideograph */
+ ["\u7B96", "\u7B96"], /* CJK Ideograph */
+ ["\u7B97", "\u7B97"], /* CJK Ideograph */
+ ["\u7B98", "\u7B98"], /* CJK Ideograph */
+ ["\u7B99", "\u7B99"], /* CJK Ideograph */
+ ["\u7B9A", "\u7B9A"], /* CJK Ideograph */
+ ["\u7B9B", "\u7B9B"], /* CJK Ideograph */
+ ["\u7B9C", "\u7B9C"], /* CJK Ideograph */
+ ["\u7B9D", "\u7B9D"], /* CJK Ideograph */
+ ["\u7B9E", "\u7B9E"], /* CJK Ideograph */
+ ["\u7B9F", "\u7B9F"], /* CJK Ideograph */
+ ["\u7BA0", "\u7BA0"], /* CJK Ideograph */
+ ["\u7BA1", "\u7BA1"], /* CJK Ideograph */
+ ["\u7BA2", "\u7BA2"], /* CJK Ideograph */
+ ["\u7BA3", "\u7BA3"], /* CJK Ideograph */
+ ["\u7BA4", "\u7BA4"], /* CJK Ideograph */
+ ["\u7BA5", "\u7BA5"], /* CJK Ideograph */
+ ["\u7BA6", "\u7BA6"], /* CJK Ideograph */
+ ["\u7BA7", "\u7BA7"], /* CJK Ideograph */
+ ["\u7BA8", "\u7BA8"], /* CJK Ideograph */
+ ["\u7BA9", "\u7BA9"], /* CJK Ideograph */
+ ["\u7BAA", "\u7BAA"], /* CJK Ideograph */
+ ["\u7BAB", "\u7BAB"], /* CJK Ideograph */
+ ["\u7BAC", "\u7BAC"], /* CJK Ideograph */
+ ["\u7BAD", "\u7BAD"], /* CJK Ideograph */
+ ["\u7BAE", "\u7BAE"], /* CJK Ideograph */
+ ["\u7BAF", "\u7BAF"], /* CJK Ideograph */
+ ["\u7BB0", "\u7BB0"], /* CJK Ideograph */
+ ["\u7BB1", "\u7BB1"], /* CJK Ideograph */
+ ["\u7BB2", "\u7BB2"], /* CJK Ideograph */
+ ["\u7BB3", "\u7BB3"], /* CJK Ideograph */
+ ["\u7BB4", "\u7BB4"], /* CJK Ideograph */
+ ["\u7BB5", "\u7BB5"], /* CJK Ideograph */
+ ["\u7BB6", "\u7BB6"], /* CJK Ideograph */
+ ["\u7BB7", "\u7BB7"], /* CJK Ideograph */
+ ["\u7BB8", "\u7BB8"], /* CJK Ideograph */
+ ["\u7BB9", "\u7BB9"], /* CJK Ideograph */
+ ["\u7BBA", "\u7BBA"], /* CJK Ideograph */
+ ["\u7BBB", "\u7BBB"], /* CJK Ideograph */
+ ["\u7BBC", "\u7BBC"], /* CJK Ideograph */
+ ["\u7BBD", "\u7BBD"], /* CJK Ideograph */
+ ["\u7BBE", "\u7BBE"], /* CJK Ideograph */
+ ["\u7BBF", "\u7BBF"], /* CJK Ideograph */
+ ["\u7BC0", "\u7BC0"], /* CJK Ideograph */
+ ["\u7BC1", "\u7BC1"], /* CJK Ideograph */
+ ["\u7BC2", "\u7BC2"], /* CJK Ideograph */
+ ["\u7BC3", "\u7BC3"], /* CJK Ideograph */
+ ["\u7BC4", "\u7BC4"], /* CJK Ideograph */
+ ["\u7BC5", "\u7BC5"], /* CJK Ideograph */
+ ["\u7BC6", "\u7BC6"], /* CJK Ideograph */
+ ["\u7BC7", "\u7BC7"], /* CJK Ideograph */
+ ["\u7BC8", "\u7BC8"], /* CJK Ideograph */
+ ["\u7BC9", "\u7BC9"], /* CJK Ideograph */
+ ["\u7BCA", "\u7BCA"], /* CJK Ideograph */
+ ["\u7BCB", "\u7BCB"], /* CJK Ideograph */
+ ["\u7BCC", "\u7BCC"], /* CJK Ideograph */
+ ["\u7BCD", "\u7BCD"], /* CJK Ideograph */
+ ["\u7BCE", "\u7BCE"], /* CJK Ideograph */
+ ["\u7BCF", "\u7BCF"], /* CJK Ideograph */
+ ["\u7BD0", "\u7BD0"], /* CJK Ideograph */
+ ["\u7BD1", "\u7BD1"], /* CJK Ideograph */
+ ["\u7BD2", "\u7BD2"], /* CJK Ideograph */
+ ["\u7BD3", "\u7BD3"], /* CJK Ideograph */
+ ["\u7BD4", "\u7BD4"], /* CJK Ideograph */
+ ["\u7BD5", "\u7BD5"], /* CJK Ideograph */
+ ["\u7BD6", "\u7BD6"], /* CJK Ideograph */
+ ["\u7BD7", "\u7BD7"], /* CJK Ideograph */
+ ["\u7BD8", "\u7BD8"], /* CJK Ideograph */
+ ["\u7BD9", "\u7BD9"], /* CJK Ideograph */
+ ["\u7BDA", "\u7BDA"], /* CJK Ideograph */
+ ["\u7BDB", "\u7BDB"], /* CJK Ideograph */
+ ["\u7BDC", "\u7BDC"], /* CJK Ideograph */
+ ["\u7BDD", "\u7BDD"], /* CJK Ideograph */
+ ["\u7BDE", "\u7BDE"], /* CJK Ideograph */
+ ["\u7BDF", "\u7BDF"], /* CJK Ideograph */
+ ["\u7BE0", "\u7BE0"], /* CJK Ideograph */
+ ["\u7BE1", "\u7BE1"], /* CJK Ideograph */
+ ["\u7BE2", "\u7BE2"], /* CJK Ideograph */
+ ["\u7BE3", "\u7BE3"], /* CJK Ideograph */
+ ["\u7BE4", "\u7BE4"], /* CJK Ideograph */
+ ["\u7BE5", "\u7BE5"], /* CJK Ideograph */
+ ["\u7BE6", "\u7BE6"], /* CJK Ideograph */
+ ["\u7BE7", "\u7BE7"], /* CJK Ideograph */
+ ["\u7BE8", "\u7BE8"], /* CJK Ideograph */
+ ["\u7BE9", "\u7BE9"], /* CJK Ideograph */
+ ["\u7BEA", "\u7BEA"], /* CJK Ideograph */
+ ["\u7BEB", "\u7BEB"], /* CJK Ideograph */
+ ["\u7BEC", "\u7BEC"], /* CJK Ideograph */
+ ["\u7BED", "\u7BED"], /* CJK Ideograph */
+ ["\u7BEE", "\u7BEE"], /* CJK Ideograph */
+ ["\u7BEF", "\u7BEF"], /* CJK Ideograph */
+ ["\u7BF0", "\u7BF0"], /* CJK Ideograph */
+ ["\u7BF1", "\u7BF1"], /* CJK Ideograph */
+ ["\u7BF2", "\u7BF2"], /* CJK Ideograph */
+ ["\u7BF3", "\u7BF3"], /* CJK Ideograph */
+ ["\u7BF4", "\u7BF4"], /* CJK Ideograph */
+ ["\u7BF5", "\u7BF5"], /* CJK Ideograph */
+ ["\u7BF6", "\u7BF6"], /* CJK Ideograph */
+ ["\u7BF7", "\u7BF7"], /* CJK Ideograph */
+ ["\u7BF8", "\u7BF8"], /* CJK Ideograph */
+ ["\u7BF9", "\u7BF9"], /* CJK Ideograph */
+ ["\u7BFA", "\u7BFA"], /* CJK Ideograph */
+ ["\u7BFB", "\u7BFB"], /* CJK Ideograph */
+ ["\u7BFC", "\u7BFC"], /* CJK Ideograph */
+ ["\u7BFD", "\u7BFD"], /* CJK Ideograph */
+ ["\u7BFE", "\u7BFE"], /* CJK Ideograph */
+ ["\u7BFF", "\u7BFF"], /* CJK Ideograph */
+ ["\u7C00", "\u7C00"], /* CJK Ideograph */
+ ["\u7C01", "\u7C01"], /* CJK Ideograph */
+ ["\u7C02", "\u7C02"], /* CJK Ideograph */
+ ["\u7C03", "\u7C03"], /* CJK Ideograph */
+ ["\u7C04", "\u7C04"], /* CJK Ideograph */
+ ["\u7C05", "\u7C05"], /* CJK Ideograph */
+ ["\u7C06", "\u7C06"], /* CJK Ideograph */
+ ["\u7C07", "\u7C07"], /* CJK Ideograph */
+ ["\u7C08", "\u7C08"], /* CJK Ideograph */
+ ["\u7C09", "\u7C09"], /* CJK Ideograph */
+ ["\u7C0A", "\u7C0A"], /* CJK Ideograph */
+ ["\u7C0B", "\u7C0B"], /* CJK Ideograph */
+ ["\u7C0C", "\u7C0C"], /* CJK Ideograph */
+ ["\u7C0D", "\u7C0D"], /* CJK Ideograph */
+ ["\u7C0E", "\u7C0E"], /* CJK Ideograph */
+ ["\u7C0F", "\u7C0F"], /* CJK Ideograph */
+ ["\u7C10", "\u7C10"], /* CJK Ideograph */
+ ["\u7C11", "\u7C11"], /* CJK Ideograph */
+ ["\u7C12", "\u7C12"], /* CJK Ideograph */
+ ["\u7C13", "\u7C13"], /* CJK Ideograph */
+ ["\u7C14", "\u7C14"], /* CJK Ideograph */
+ ["\u7C15", "\u7C15"], /* CJK Ideograph */
+ ["\u7C16", "\u7C16"], /* CJK Ideograph */
+ ["\u7C17", "\u7C17"], /* CJK Ideograph */
+ ["\u7C18", "\u7C18"], /* CJK Ideograph */
+ ["\u7C19", "\u7C19"], /* CJK Ideograph */
+ ["\u7C1A", "\u7C1A"], /* CJK Ideograph */
+ ["\u7C1B", "\u7C1B"], /* CJK Ideograph */
+ ["\u7C1C", "\u7C1C"], /* CJK Ideograph */
+ ["\u7C1D", "\u7C1D"], /* CJK Ideograph */
+ ["\u7C1E", "\u7C1E"], /* CJK Ideograph */
+ ["\u7C1F", "\u7C1F"], /* CJK Ideograph */
+ ["\u7C20", "\u7C20"], /* CJK Ideograph */
+ ["\u7C21", "\u7C21"], /* CJK Ideograph */
+ ["\u7C22", "\u7C22"], /* CJK Ideograph */
+ ["\u7C23", "\u7C23"], /* CJK Ideograph */
+ ["\u7C24", "\u7C24"], /* CJK Ideograph */
+ ["\u7C25", "\u7C25"], /* CJK Ideograph */
+ ["\u7C26", "\u7C26"], /* CJK Ideograph */
+ ["\u7C27", "\u7C27"], /* CJK Ideograph */
+ ["\u7C28", "\u7C28"], /* CJK Ideograph */
+ ["\u7C29", "\u7C29"], /* CJK Ideograph */
+ ["\u7C2A", "\u7C2A"], /* CJK Ideograph */
+ ["\u7C2B", "\u7C2B"], /* CJK Ideograph */
+ ["\u7C2C", "\u7C2C"], /* CJK Ideograph */
+ ["\u7C2D", "\u7C2D"], /* CJK Ideograph */
+ ["\u7C2E", "\u7C2E"], /* CJK Ideograph */
+ ["\u7C2F", "\u7C2F"], /* CJK Ideograph */
+ ["\u7C30", "\u7C30"], /* CJK Ideograph */
+ ["\u7C31", "\u7C31"], /* CJK Ideograph */
+ ["\u7C32", "\u7C32"], /* CJK Ideograph */
+ ["\u7C33", "\u7C33"], /* CJK Ideograph */
+ ["\u7C34", "\u7C34"], /* CJK Ideograph */
+ ["\u7C35", "\u7C35"], /* CJK Ideograph */
+ ["\u7C36", "\u7C36"], /* CJK Ideograph */
+ ["\u7C37", "\u7C37"], /* CJK Ideograph */
+ ["\u7C38", "\u7C38"], /* CJK Ideograph */
+ ["\u7C39", "\u7C39"], /* CJK Ideograph */
+ ["\u7C3A", "\u7C3A"], /* CJK Ideograph */
+ ["\u7C3B", "\u7C3B"], /* CJK Ideograph */
+ ["\u7C3C", "\u7C3C"], /* CJK Ideograph */
+ ["\u7C3D", "\u7C3D"], /* CJK Ideograph */
+ ["\u7C3E", "\u7C3E"], /* CJK Ideograph */
+ ["\u7C3F", "\u7C3F"], /* CJK Ideograph */
+ ["\u7C40", "\u7C40"], /* CJK Ideograph */
+ ["\u7C41", "\u7C41"], /* CJK Ideograph */
+ ["\u7C42", "\u7C42"], /* CJK Ideograph */
+ ["\u7C43", "\u7C43"], /* CJK Ideograph */
+ ["\u7C44", "\u7C44"], /* CJK Ideograph */
+ ["\u7C45", "\u7C45"], /* CJK Ideograph */
+ ["\u7C46", "\u7C46"], /* CJK Ideograph */
+ ["\u7C47", "\u7C47"], /* CJK Ideograph */
+ ["\u7C48", "\u7C48"], /* CJK Ideograph */
+ ["\u7C49", "\u7C49"], /* CJK Ideograph */
+ ["\u7C4A", "\u7C4A"], /* CJK Ideograph */
+ ["\u7C4B", "\u7C4B"], /* CJK Ideograph */
+ ["\u7C4C", "\u7C4C"], /* CJK Ideograph */
+ ["\u7C4D", "\u7C4D"], /* CJK Ideograph */
+ ["\u7C4E", "\u7C4E"], /* CJK Ideograph */
+ ["\u7C4F", "\u7C4F"], /* CJK Ideograph */
+ ["\u7C50", "\u7C50"], /* CJK Ideograph */
+ ["\u7C51", "\u7C51"], /* CJK Ideograph */
+ ["\u7C52", "\u7C52"], /* CJK Ideograph */
+ ["\u7C53", "\u7C53"], /* CJK Ideograph */
+ ["\u7C54", "\u7C54"], /* CJK Ideograph */
+ ["\u7C55", "\u7C55"], /* CJK Ideograph */
+ ["\u7C56", "\u7C56"], /* CJK Ideograph */
+ ["\u7C57", "\u7C57"], /* CJK Ideograph */
+ ["\u7C58", "\u7C58"], /* CJK Ideograph */
+ ["\u7C59", "\u7C59"], /* CJK Ideograph */
+ ["\u7C5A", "\u7C5A"], /* CJK Ideograph */
+ ["\u7C5B", "\u7C5B"], /* CJK Ideograph */
+ ["\u7C5C", "\u7C5C"], /* CJK Ideograph */
+ ["\u7C5D", "\u7C5D"], /* CJK Ideograph */
+ ["\u7C5E", "\u7C5E"], /* CJK Ideograph */
+ ["\u7C5F", "\u7C5F"], /* CJK Ideograph */
+ ["\u7C60", "\u7C60"], /* CJK Ideograph */
+ ["\u7C61", "\u7C61"], /* CJK Ideograph */
+ ["\u7C62", "\u7C62"], /* CJK Ideograph */
+ ["\u7C63", "\u7C63"], /* CJK Ideograph */
+ ["\u7C64", "\u7C64"], /* CJK Ideograph */
+ ["\u7C65", "\u7C65"], /* CJK Ideograph */
+ ["\u7C66", "\u7C66"], /* CJK Ideograph */
+ ["\u7C67", "\u7C67"], /* CJK Ideograph */
+ ["\u7C68", "\u7C68"], /* CJK Ideograph */
+ ["\u7C69", "\u7C69"], /* CJK Ideograph */
+ ["\u7C6A", "\u7C6A"], /* CJK Ideograph */
+ ["\u7C6B", "\u7C6B"], /* CJK Ideograph */
+ ["\u7C6C", "\u7C6C"], /* CJK Ideograph */
+ ["\u7C6D", "\u7C6D"], /* CJK Ideograph */
+ ["\u7C6E", "\u7C6E"], /* CJK Ideograph */
+ ["\u7C6F", "\u7C6F"], /* CJK Ideograph */
+ ["\u7C70", "\u7C70"], /* CJK Ideograph */
+ ["\u7C71", "\u7C71"], /* CJK Ideograph */
+ ["\u7C72", "\u7C72"], /* CJK Ideograph */
+ ["\u7C73", "\u7C73"], /* CJK Ideograph */
+ ["\u7C74", "\u7C74"], /* CJK Ideograph */
+ ["\u7C75", "\u7C75"], /* CJK Ideograph */
+ ["\u7C76", "\u7C76"], /* CJK Ideograph */
+ ["\u7C77", "\u7C77"], /* CJK Ideograph */
+ ["\u7C78", "\u7C78"], /* CJK Ideograph */
+ ["\u7C79", "\u7C79"], /* CJK Ideograph */
+ ["\u7C7A", "\u7C7A"], /* CJK Ideograph */
+ ["\u7C7B", "\u7C7B"], /* CJK Ideograph */
+ ["\u7C7C", "\u7C7C"], /* CJK Ideograph */
+ ["\u7C7D", "\u7C7D"], /* CJK Ideograph */
+ ["\u7C7E", "\u7C7E"], /* CJK Ideograph */
+ ["\u7C7F", "\u7C7F"], /* CJK Ideograph */
+ ["\u7C80", "\u7C80"], /* CJK Ideograph */
+ ["\u7C81", "\u7C81"], /* CJK Ideograph */
+ ["\u7C82", "\u7C82"], /* CJK Ideograph */
+ ["\u7C83", "\u7C83"], /* CJK Ideograph */
+ ["\u7C84", "\u7C84"], /* CJK Ideograph */
+ ["\u7C85", "\u7C85"], /* CJK Ideograph */
+ ["\u7C86", "\u7C86"], /* CJK Ideograph */
+ ["\u7C87", "\u7C87"], /* CJK Ideograph */
+ ["\u7C88", "\u7C88"], /* CJK Ideograph */
+ ["\u7C89", "\u7C89"], /* CJK Ideograph */
+ ["\u7C8A", "\u7C8A"], /* CJK Ideograph */
+ ["\u7C8B", "\u7C8B"], /* CJK Ideograph */
+ ["\u7C8C", "\u7C8C"], /* CJK Ideograph */
+ ["\u7C8D", "\u7C8D"], /* CJK Ideograph */
+ ["\u7C8E", "\u7C8E"], /* CJK Ideograph */
+ ["\u7C8F", "\u7C8F"], /* CJK Ideograph */
+ ["\u7C90", "\u7C90"], /* CJK Ideograph */
+ ["\u7C91", "\u7C91"], /* CJK Ideograph */
+ ["\u7C92", "\u7C92"], /* CJK Ideograph */
+ ["\u7C93", "\u7C93"], /* CJK Ideograph */
+ ["\u7C94", "\u7C94"], /* CJK Ideograph */
+ ["\u7C95", "\u7C95"], /* CJK Ideograph */
+ ["\u7C96", "\u7C96"], /* CJK Ideograph */
+ ["\u7C97", "\u7C97"], /* CJK Ideograph */
+ ["\u7C98", "\u7C98"], /* CJK Ideograph */
+ ["\u7C99", "\u7C99"], /* CJK Ideograph */
+ ["\u7C9A", "\u7C9A"], /* CJK Ideograph */
+ ["\u7C9B", "\u7C9B"], /* CJK Ideograph */
+ ["\u7C9C", "\u7C9C"], /* CJK Ideograph */
+ ["\u7C9D", "\u7C9D"], /* CJK Ideograph */
+ ["\u7C9E", "\u7C9E"], /* CJK Ideograph */
+ ["\u7C9F", "\u7C9F"], /* CJK Ideograph */
+ ["\u7CA0", "\u7CA0"], /* CJK Ideograph */
+ ["\u7CA1", "\u7CA1"], /* CJK Ideograph */
+ ["\u7CA2", "\u7CA2"], /* CJK Ideograph */
+ ["\u7CA3", "\u7CA3"], /* CJK Ideograph */
+ ["\u7CA4", "\u7CA4"], /* CJK Ideograph */
+ ["\u7CA5", "\u7CA5"], /* CJK Ideograph */
+ ["\u7CA6", "\u7CA6"], /* CJK Ideograph */
+ ["\u7CA7", "\u7CA7"], /* CJK Ideograph */
+ ["\u7CA8", "\u7CA8"], /* CJK Ideograph */
+ ["\u7CA9", "\u7CA9"], /* CJK Ideograph */
+ ["\u7CAA", "\u7CAA"], /* CJK Ideograph */
+ ["\u7CAB", "\u7CAB"], /* CJK Ideograph */
+ ["\u7CAC", "\u7CAC"], /* CJK Ideograph */
+ ["\u7CAD", "\u7CAD"], /* CJK Ideograph */
+ ["\u7CAE", "\u7CAE"], /* CJK Ideograph */
+ ["\u7CAF", "\u7CAF"], /* CJK Ideograph */
+ ["\u7CB0", "\u7CB0"], /* CJK Ideograph */
+ ["\u7CB1", "\u7CB1"], /* CJK Ideograph */
+ ["\u7CB2", "\u7CB2"], /* CJK Ideograph */
+ ["\u7CB3", "\u7CB3"], /* CJK Ideograph */
+ ["\u7CB4", "\u7CB4"], /* CJK Ideograph */
+ ["\u7CB5", "\u7CB5"], /* CJK Ideograph */
+ ["\u7CB6", "\u7CB6"], /* CJK Ideograph */
+ ["\u7CB7", "\u7CB7"], /* CJK Ideograph */
+ ["\u7CB8", "\u7CB8"], /* CJK Ideograph */
+ ["\u7CB9", "\u7CB9"], /* CJK Ideograph */
+ ["\u7CBA", "\u7CBA"], /* CJK Ideograph */
+ ["\u7CBB", "\u7CBB"], /* CJK Ideograph */
+ ["\u7CBC", "\u7CBC"], /* CJK Ideograph */
+ ["\u7CBD", "\u7CBD"], /* CJK Ideograph */
+ ["\u7CBE", "\u7CBE"], /* CJK Ideograph */
+ ["\u7CBF", "\u7CBF"], /* CJK Ideograph */
+ ["\u7CC0", "\u7CC0"], /* CJK Ideograph */
+ ["\u7CC1", "\u7CC1"], /* CJK Ideograph */
+ ["\u7CC2", "\u7CC2"], /* CJK Ideograph */
+ ["\u7CC3", "\u7CC3"], /* CJK Ideograph */
+ ["\u7CC4", "\u7CC4"], /* CJK Ideograph */
+ ["\u7CC5", "\u7CC5"], /* CJK Ideograph */
+ ["\u7CC6", "\u7CC6"], /* CJK Ideograph */
+ ["\u7CC7", "\u7CC7"], /* CJK Ideograph */
+ ["\u7CC8", "\u7CC8"], /* CJK Ideograph */
+ ["\u7CC9", "\u7CC9"], /* CJK Ideograph */
+ ["\u7CCA", "\u7CCA"], /* CJK Ideograph */
+ ["\u7CCB", "\u7CCB"], /* CJK Ideograph */
+ ["\u7CCC", "\u7CCC"], /* CJK Ideograph */
+ ["\u7CCD", "\u7CCD"], /* CJK Ideograph */
+ ["\u7CCE", "\u7CCE"], /* CJK Ideograph */
+ ["\u7CCF", "\u7CCF"], /* CJK Ideograph */
+ ["\u7CD0", "\u7CD0"], /* CJK Ideograph */
+ ["\u7CD1", "\u7CD1"], /* CJK Ideograph */
+ ["\u7CD2", "\u7CD2"], /* CJK Ideograph */
+ ["\u7CD3", "\u7CD3"], /* CJK Ideograph */
+ ["\u7CD4", "\u7CD4"], /* CJK Ideograph */
+ ["\u7CD5", "\u7CD5"], /* CJK Ideograph */
+ ["\u7CD6", "\u7CD6"], /* CJK Ideograph */
+ ["\u7CD7", "\u7CD7"], /* CJK Ideograph */
+ ["\u7CD8", "\u7CD8"], /* CJK Ideograph */
+ ["\u7CD9", "\u7CD9"], /* CJK Ideograph */
+ ["\u7CDA", "\u7CDA"], /* CJK Ideograph */
+ ["\u7CDB", "\u7CDB"], /* CJK Ideograph */
+ ["\u7CDC", "\u7CDC"], /* CJK Ideograph */
+ ["\u7CDD", "\u7CDD"], /* CJK Ideograph */
+ ["\u7CDE", "\u7CDE"], /* CJK Ideograph */
+ ["\u7CDF", "\u7CDF"], /* CJK Ideograph */
+ ["\u7CE0", "\u7CE0"], /* CJK Ideograph */
+ ["\u7CE1", "\u7CE1"], /* CJK Ideograph */
+ ["\u7CE2", "\u7CE2"], /* CJK Ideograph */
+ ["\u7CE3", "\u7CE3"], /* CJK Ideograph */
+ ["\u7CE4", "\u7CE4"], /* CJK Ideograph */
+ ["\u7CE5", "\u7CE5"], /* CJK Ideograph */
+ ["\u7CE6", "\u7CE6"], /* CJK Ideograph */
+ ["\u7CE7", "\u7CE7"], /* CJK Ideograph */
+ ["\u7CE8", "\u7CE8"], /* CJK Ideograph */
+ ["\u7CE9", "\u7CE9"], /* CJK Ideograph */
+ ["\u7CEA", "\u7CEA"], /* CJK Ideograph */
+ ["\u7CEB", "\u7CEB"], /* CJK Ideograph */
+ ["\u7CEC", "\u7CEC"], /* CJK Ideograph */
+ ["\u7CED", "\u7CED"], /* CJK Ideograph */
+ ["\u7CEE", "\u7CEE"], /* CJK Ideograph */
+ ["\u7CEF", "\u7CEF"], /* CJK Ideograph */
+ ["\u7CF0", "\u7CF0"], /* CJK Ideograph */
+ ["\u7CF1", "\u7CF1"], /* CJK Ideograph */
+ ["\u7CF2", "\u7CF2"], /* CJK Ideograph */
+ ["\u7CF3", "\u7CF3"], /* CJK Ideograph */
+ ["\u7CF4", "\u7CF4"], /* CJK Ideograph */
+ ["\u7CF5", "\u7CF5"], /* CJK Ideograph */
+ ["\u7CF6", "\u7CF6"], /* CJK Ideograph */
+ ["\u7CF7", "\u7CF7"], /* CJK Ideograph */
+ ["\u7CF8", "\u7CF8"], /* CJK Ideograph */
+ ["\u7CF9", "\u7CF9"], /* CJK Ideograph */
+ ["\u7CFA", "\u7CFA"], /* CJK Ideograph */
+ ["\u7CFB", "\u7CFB"], /* CJK Ideograph */
+ ["\u7CFC", "\u7CFC"], /* CJK Ideograph */
+ ["\u7CFD", "\u7CFD"], /* CJK Ideograph */
+ ["\u7CFE", "\u7CFE"], /* CJK Ideograph */
+ ["\u7CFF", "\u7CFF"], /* CJK Ideograph */
+ ["\u7D00", "\u7D00"], /* CJK Ideograph */
+ ["\u7D01", "\u7D01"], /* CJK Ideograph */
+ ["\u7D02", "\u7D02"], /* CJK Ideograph */
+ ["\u7D03", "\u7D03"], /* CJK Ideograph */
+ ["\u7D04", "\u7D04"], /* CJK Ideograph */
+ ["\u7D05", "\u7D05"], /* CJK Ideograph */
+ ["\u7D06", "\u7D06"], /* CJK Ideograph */
+ ["\u7D07", "\u7D07"], /* CJK Ideograph */
+ ["\u7D08", "\u7D08"], /* CJK Ideograph */
+ ["\u7D09", "\u7D09"], /* CJK Ideograph */
+ ["\u7D0A", "\u7D0A"], /* CJK Ideograph */
+ ["\u7D0B", "\u7D0B"], /* CJK Ideograph */
+ ["\u7D0C", "\u7D0C"], /* CJK Ideograph */
+ ["\u7D0D", "\u7D0D"], /* CJK Ideograph */
+ ["\u7D0E", "\u7D0E"], /* CJK Ideograph */
+ ["\u7D0F", "\u7D0F"], /* CJK Ideograph */
+ ["\u7D10", "\u7D10"], /* CJK Ideograph */
+ ["\u7D11", "\u7D11"], /* CJK Ideograph */
+ ["\u7D12", "\u7D12"], /* CJK Ideograph */
+ ["\u7D13", "\u7D13"], /* CJK Ideograph */
+ ["\u7D14", "\u7D14"], /* CJK Ideograph */
+ ["\u7D15", "\u7D15"], /* CJK Ideograph */
+ ["\u7D16", "\u7D16"], /* CJK Ideograph */
+ ["\u7D17", "\u7D17"], /* CJK Ideograph */
+ ["\u7D18", "\u7D18"], /* CJK Ideograph */
+ ["\u7D19", "\u7D19"], /* CJK Ideograph */
+ ["\u7D1A", "\u7D1A"], /* CJK Ideograph */
+ ["\u7D1B", "\u7D1B"], /* CJK Ideograph */
+ ["\u7D1C", "\u7D1C"], /* CJK Ideograph */
+ ["\u7D1D", "\u7D1D"], /* CJK Ideograph */
+ ["\u7D1E", "\u7D1E"], /* CJK Ideograph */
+ ["\u7D1F", "\u7D1F"], /* CJK Ideograph */
+ ["\u7D20", "\u7D20"], /* CJK Ideograph */
+ ["\u7D21", "\u7D21"], /* CJK Ideograph */
+ ["\u7D22", "\u7D22"], /* CJK Ideograph */
+ ["\u7D23", "\u7D23"], /* CJK Ideograph */
+ ["\u7D24", "\u7D24"], /* CJK Ideograph */
+ ["\u7D25", "\u7D25"], /* CJK Ideograph */
+ ["\u7D26", "\u7D26"], /* CJK Ideograph */
+ ["\u7D27", "\u7D27"], /* CJK Ideograph */
+ ["\u7D28", "\u7D28"], /* CJK Ideograph */
+ ["\u7D29", "\u7D29"], /* CJK Ideograph */
+ ["\u7D2A", "\u7D2A"], /* CJK Ideograph */
+ ["\u7D2B", "\u7D2B"], /* CJK Ideograph */
+ ["\u7D2C", "\u7D2C"], /* CJK Ideograph */
+ ["\u7D2D", "\u7D2D"], /* CJK Ideograph */
+ ["\u7D2E", "\u7D2E"], /* CJK Ideograph */
+ ["\u7D2F", "\u7D2F"], /* CJK Ideograph */
+ ["\u7D30", "\u7D30"], /* CJK Ideograph */
+ ["\u7D31", "\u7D31"], /* CJK Ideograph */
+ ["\u7D32", "\u7D32"], /* CJK Ideograph */
+ ["\u7D33", "\u7D33"], /* CJK Ideograph */
+ ["\u7D34", "\u7D34"], /* CJK Ideograph */
+ ["\u7D35", "\u7D35"], /* CJK Ideograph */
+ ["\u7D36", "\u7D36"], /* CJK Ideograph */
+ ["\u7D37", "\u7D37"], /* CJK Ideograph */
+ ["\u7D38", "\u7D38"], /* CJK Ideograph */
+ ["\u7D39", "\u7D39"], /* CJK Ideograph */
+ ["\u7D3A", "\u7D3A"], /* CJK Ideograph */
+ ["\u7D3B", "\u7D3B"], /* CJK Ideograph */
+ ["\u7D3C", "\u7D3C"], /* CJK Ideograph */
+ ["\u7D3D", "\u7D3D"], /* CJK Ideograph */
+ ["\u7D3E", "\u7D3E"], /* CJK Ideograph */
+ ["\u7D3F", "\u7D3F"], /* CJK Ideograph */
+ ["\u7D40", "\u7D40"], /* CJK Ideograph */
+ ["\u7D41", "\u7D41"], /* CJK Ideograph */
+ ["\u7D42", "\u7D42"], /* CJK Ideograph */
+ ["\u7D43", "\u7D43"], /* CJK Ideograph */
+ ["\u7D44", "\u7D44"], /* CJK Ideograph */
+ ["\u7D45", "\u7D45"], /* CJK Ideograph */
+ ["\u7D46", "\u7D46"], /* CJK Ideograph */
+ ["\u7D47", "\u7D47"], /* CJK Ideograph */
+ ["\u7D48", "\u7D48"], /* CJK Ideograph */
+ ["\u7D49", "\u7D49"], /* CJK Ideograph */
+ ["\u7D4A", "\u7D4A"], /* CJK Ideograph */
+ ["\u7D4B", "\u7D4B"], /* CJK Ideograph */
+ ["\u7D4C", "\u7D4C"], /* CJK Ideograph */
+ ["\u7D4D", "\u7D4D"], /* CJK Ideograph */
+ ["\u7D4E", "\u7D4E"], /* CJK Ideograph */
+ ["\u7D4F", "\u7D4F"], /* CJK Ideograph */
+ ["\u7D50", "\u7D50"], /* CJK Ideograph */
+ ["\u7D51", "\u7D51"], /* CJK Ideograph */
+ ["\u7D52", "\u7D52"], /* CJK Ideograph */
+ ["\u7D53", "\u7D53"], /* CJK Ideograph */
+ ["\u7D54", "\u7D54"], /* CJK Ideograph */
+ ["\u7D55", "\u7D55"], /* CJK Ideograph */
+ ["\u7D56", "\u7D56"], /* CJK Ideograph */
+ ["\u7D57", "\u7D57"], /* CJK Ideograph */
+ ["\u7D58", "\u7D58"], /* CJK Ideograph */
+ ["\u7D59", "\u7D59"], /* CJK Ideograph */
+ ["\u7D5A", "\u7D5A"], /* CJK Ideograph */
+ ["\u7D5B", "\u7D5B"], /* CJK Ideograph */
+ ["\u7D5C", "\u7D5C"], /* CJK Ideograph */
+ ["\u7D5D", "\u7D5D"], /* CJK Ideograph */
+ ["\u7D5E", "\u7D5E"], /* CJK Ideograph */
+ ["\u7D5F", "\u7D5F"], /* CJK Ideograph */
+ ["\u7D60", "\u7D60"], /* CJK Ideograph */
+ ["\u7D61", "\u7D61"], /* CJK Ideograph */
+ ["\u7D62", "\u7D62"], /* CJK Ideograph */
+ ["\u7D63", "\u7D63"], /* CJK Ideograph */
+ ["\u7D64", "\u7D64"], /* CJK Ideograph */
+ ["\u7D65", "\u7D65"], /* CJK Ideograph */
+ ["\u7D66", "\u7D66"], /* CJK Ideograph */
+ ["\u7D67", "\u7D67"], /* CJK Ideograph */
+ ["\u7D68", "\u7D68"], /* CJK Ideograph */
+ ["\u7D69", "\u7D69"], /* CJK Ideograph */
+ ["\u7D6A", "\u7D6A"], /* CJK Ideograph */
+ ["\u7D6B", "\u7D6B"], /* CJK Ideograph */
+ ["\u7D6C", "\u7D6C"], /* CJK Ideograph */
+ ["\u7D6D", "\u7D6D"], /* CJK Ideograph */
+ ["\u7D6E", "\u7D6E"], /* CJK Ideograph */
+ ["\u7D6F", "\u7D6F"], /* CJK Ideograph */
+ ["\u7D70", "\u7D70"], /* CJK Ideograph */
+ ["\u7D71", "\u7D71"], /* CJK Ideograph */
+ ["\u7D72", "\u7D72"], /* CJK Ideograph */
+ ["\u7D73", "\u7D73"], /* CJK Ideograph */
+ ["\u7D74", "\u7D74"], /* CJK Ideograph */
+ ["\u7D75", "\u7D75"], /* CJK Ideograph */
+ ["\u7D76", "\u7D76"], /* CJK Ideograph */
+ ["\u7D77", "\u7D77"], /* CJK Ideograph */
+ ["\u7D78", "\u7D78"], /* CJK Ideograph */
+ ["\u7D79", "\u7D79"], /* CJK Ideograph */
+ ["\u7D7A", "\u7D7A"], /* CJK Ideograph */
+ ["\u7D7B", "\u7D7B"], /* CJK Ideograph */
+ ["\u7D7C", "\u7D7C"], /* CJK Ideograph */
+ ["\u7D7D", "\u7D7D"], /* CJK Ideograph */
+ ["\u7D7E", "\u7D7E"], /* CJK Ideograph */
+ ["\u7D7F", "\u7D7F"], /* CJK Ideograph */
+ ["\u7D80", "\u7D80"], /* CJK Ideograph */
+ ["\u7D81", "\u7D81"], /* CJK Ideograph */
+ ["\u7D82", "\u7D82"], /* CJK Ideograph */
+ ["\u7D83", "\u7D83"], /* CJK Ideograph */
+ ["\u7D84", "\u7D84"], /* CJK Ideograph */
+ ["\u7D85", "\u7D85"], /* CJK Ideograph */
+ ["\u7D86", "\u7D86"], /* CJK Ideograph */
+ ["\u7D87", "\u7D87"], /* CJK Ideograph */
+ ["\u7D88", "\u7D88"], /* CJK Ideograph */
+ ["\u7D89", "\u7D89"], /* CJK Ideograph */
+ ["\u7D8A", "\u7D8A"], /* CJK Ideograph */
+ ["\u7D8B", "\u7D8B"], /* CJK Ideograph */
+ ["\u7D8C", "\u7D8C"], /* CJK Ideograph */
+ ["\u7D8D", "\u7D8D"], /* CJK Ideograph */
+ ["\u7D8E", "\u7D8E"], /* CJK Ideograph */
+ ["\u7D8F", "\u7D8F"], /* CJK Ideograph */
+ ["\u7D90", "\u7D90"], /* CJK Ideograph */
+ ["\u7D91", "\u7D91"], /* CJK Ideograph */
+ ["\u7D92", "\u7D92"], /* CJK Ideograph */
+ ["\u7D93", "\u7D93"], /* CJK Ideograph */
+ ["\u7D94", "\u7D94"], /* CJK Ideograph */
+ ["\u7D95", "\u7D95"], /* CJK Ideograph */
+ ["\u7D96", "\u7D96"], /* CJK Ideograph */
+ ["\u7D97", "\u7D97"], /* CJK Ideograph */
+ ["\u7D98", "\u7D98"], /* CJK Ideograph */
+ ["\u7D99", "\u7D99"], /* CJK Ideograph */
+ ["\u7D9A", "\u7D9A"], /* CJK Ideograph */
+ ["\u7D9B", "\u7D9B"], /* CJK Ideograph */
+ ["\u7D9C", "\u7D9C"], /* CJK Ideograph */
+ ["\u7D9D", "\u7D9D"], /* CJK Ideograph */
+ ["\u7D9E", "\u7D9E"], /* CJK Ideograph */
+ ["\u7D9F", "\u7D9F"], /* CJK Ideograph */
+ ["\u7DA0", "\u7DA0"], /* CJK Ideograph */
+ ["\u7DA1", "\u7DA1"], /* CJK Ideograph */
+ ["\u7DA2", "\u7DA2"], /* CJK Ideograph */
+ ["\u7DA3", "\u7DA3"], /* CJK Ideograph */
+ ["\u7DA4", "\u7DA4"], /* CJK Ideograph */
+ ["\u7DA5", "\u7DA5"], /* CJK Ideograph */
+ ["\u7DA6", "\u7DA6"], /* CJK Ideograph */
+ ["\u7DA7", "\u7DA7"], /* CJK Ideograph */
+ ["\u7DA8", "\u7DA8"], /* CJK Ideograph */
+ ["\u7DA9", "\u7DA9"], /* CJK Ideograph */
+ ["\u7DAA", "\u7DAA"], /* CJK Ideograph */
+ ["\u7DAB", "\u7DAB"], /* CJK Ideograph */
+ ["\u7DAC", "\u7DAC"], /* CJK Ideograph */
+ ["\u7DAD", "\u7DAD"], /* CJK Ideograph */
+ ["\u7DAE", "\u7DAE"], /* CJK Ideograph */
+ ["\u7DAF", "\u7DAF"], /* CJK Ideograph */
+ ["\u7DB0", "\u7DB0"], /* CJK Ideograph */
+ ["\u7DB1", "\u7DB1"], /* CJK Ideograph */
+ ["\u7DB2", "\u7DB2"], /* CJK Ideograph */
+ ["\u7DB3", "\u7DB3"], /* CJK Ideograph */
+ ["\u7DB4", "\u7DB4"], /* CJK Ideograph */
+ ["\u7DB5", "\u7DB5"], /* CJK Ideograph */
+ ["\u7DB6", "\u7DB6"], /* CJK Ideograph */
+ ["\u7DB7", "\u7DB7"], /* CJK Ideograph */
+ ["\u7DB8", "\u7DB8"], /* CJK Ideograph */
+ ["\u7DB9", "\u7DB9"], /* CJK Ideograph */
+ ["\u7DBA", "\u7DBA"], /* CJK Ideograph */
+ ["\u7DBB", "\u7DBB"], /* CJK Ideograph */
+ ["\u7DBC", "\u7DBC"], /* CJK Ideograph */
+ ["\u7DBD", "\u7DBD"], /* CJK Ideograph */
+ ["\u7DBE", "\u7DBE"], /* CJK Ideograph */
+ ["\u7DBF", "\u7DBF"], /* CJK Ideograph */
+ ["\u7DC0", "\u7DC0"], /* CJK Ideograph */
+ ["\u7DC1", "\u7DC1"], /* CJK Ideograph */
+ ["\u7DC2", "\u7DC2"], /* CJK Ideograph */
+ ["\u7DC3", "\u7DC3"], /* CJK Ideograph */
+ ["\u7DC4", "\u7DC4"], /* CJK Ideograph */
+ ["\u7DC5", "\u7DC5"], /* CJK Ideograph */
+ ["\u7DC6", "\u7DC6"], /* CJK Ideograph */
+ ["\u7DC7", "\u7DC7"], /* CJK Ideograph */
+ ["\u7DC8", "\u7DC8"], /* CJK Ideograph */
+ ["\u7DC9", "\u7DC9"], /* CJK Ideograph */
+ ["\u7DCA", "\u7DCA"], /* CJK Ideograph */
+ ["\u7DCB", "\u7DCB"], /* CJK Ideograph */
+ ["\u7DCC", "\u7DCC"], /* CJK Ideograph */
+ ["\u7DCD", "\u7DCD"], /* CJK Ideograph */
+ ["\u7DCE", "\u7DCE"], /* CJK Ideograph */
+ ["\u7DCF", "\u7DCF"], /* CJK Ideograph */
+ ["\u7DD0", "\u7DD0"], /* CJK Ideograph */
+ ["\u7DD1", "\u7DD1"], /* CJK Ideograph */
+ ["\u7DD2", "\u7DD2"], /* CJK Ideograph */
+ ["\u7DD3", "\u7DD3"], /* CJK Ideograph */
+ ["\u7DD4", "\u7DD4"], /* CJK Ideograph */
+ ["\u7DD5", "\u7DD5"], /* CJK Ideograph */
+ ["\u7DD6", "\u7DD6"], /* CJK Ideograph */
+ ["\u7DD7", "\u7DD7"], /* CJK Ideograph */
+ ["\u7DD8", "\u7DD8"], /* CJK Ideograph */
+ ["\u7DD9", "\u7DD9"], /* CJK Ideograph */
+ ["\u7DDA", "\u7DDA"], /* CJK Ideograph */
+ ["\u7DDB", "\u7DDB"], /* CJK Ideograph */
+ ["\u7DDC", "\u7DDC"], /* CJK Ideograph */
+ ["\u7DDD", "\u7DDD"], /* CJK Ideograph */
+ ["\u7DDE", "\u7DDE"], /* CJK Ideograph */
+ ["\u7DDF", "\u7DDF"], /* CJK Ideograph */
+ ["\u7DE0", "\u7DE0"], /* CJK Ideograph */
+ ["\u7DE1", "\u7DE1"], /* CJK Ideograph */
+ ["\u7DE2", "\u7DE2"], /* CJK Ideograph */
+ ["\u7DE3", "\u7DE3"], /* CJK Ideograph */
+ ["\u7DE4", "\u7DE4"], /* CJK Ideograph */
+ ["\u7DE5", "\u7DE5"], /* CJK Ideograph */
+ ["\u7DE6", "\u7DE6"], /* CJK Ideograph */
+ ["\u7DE7", "\u7DE7"], /* CJK Ideograph */
+ ["\u7DE8", "\u7DE8"], /* CJK Ideograph */
+ ["\u7DE9", "\u7DE9"], /* CJK Ideograph */
+ ["\u7DEA", "\u7DEA"], /* CJK Ideograph */
+ ["\u7DEB", "\u7DEB"], /* CJK Ideograph */
+ ["\u7DEC", "\u7DEC"], /* CJK Ideograph */
+ ["\u7DED", "\u7DED"], /* CJK Ideograph */
+ ["\u7DEE", "\u7DEE"], /* CJK Ideograph */
+ ["\u7DEF", "\u7DEF"], /* CJK Ideograph */
+ ["\u7DF0", "\u7DF0"], /* CJK Ideograph */
+ ["\u7DF1", "\u7DF1"], /* CJK Ideograph */
+ ["\u7DF2", "\u7DF2"], /* CJK Ideograph */
+ ["\u7DF3", "\u7DF3"], /* CJK Ideograph */
+ ["\u7DF4", "\u7DF4"], /* CJK Ideograph */
+ ["\u7DF5", "\u7DF5"], /* CJK Ideograph */
+ ["\u7DF6", "\u7DF6"], /* CJK Ideograph */
+ ["\u7DF7", "\u7DF7"], /* CJK Ideograph */
+ ["\u7DF8", "\u7DF8"], /* CJK Ideograph */
+ ["\u7DF9", "\u7DF9"], /* CJK Ideograph */
+ ["\u7DFA", "\u7DFA"], /* CJK Ideograph */
+ ["\u7DFB", "\u7DFB"], /* CJK Ideograph */
+ ["\u7DFC", "\u7DFC"], /* CJK Ideograph */
+ ["\u7DFD", "\u7DFD"], /* CJK Ideograph */
+ ["\u7DFE", "\u7DFE"], /* CJK Ideograph */
+ ["\u7DFF", "\u7DFF"], /* CJK Ideograph */
+ ["\u7E00", "\u7E00"], /* CJK Ideograph */
+ ["\u7E01", "\u7E01"], /* CJK Ideograph */
+ ["\u7E02", "\u7E02"], /* CJK Ideograph */
+ ["\u7E03", "\u7E03"], /* CJK Ideograph */
+ ["\u7E04", "\u7E04"], /* CJK Ideograph */
+ ["\u7E05", "\u7E05"], /* CJK Ideograph */
+ ["\u7E06", "\u7E06"], /* CJK Ideograph */
+ ["\u7E07", "\u7E07"], /* CJK Ideograph */
+ ["\u7E08", "\u7E08"], /* CJK Ideograph */
+ ["\u7E09", "\u7E09"], /* CJK Ideograph */
+ ["\u7E0A", "\u7E0A"], /* CJK Ideograph */
+ ["\u7E0B", "\u7E0B"], /* CJK Ideograph */
+ ["\u7E0C", "\u7E0C"], /* CJK Ideograph */
+ ["\u7E0D", "\u7E0D"], /* CJK Ideograph */
+ ["\u7E0E", "\u7E0E"], /* CJK Ideograph */
+ ["\u7E0F", "\u7E0F"], /* CJK Ideograph */
+ ["\u7E10", "\u7E10"], /* CJK Ideograph */
+ ["\u7E11", "\u7E11"], /* CJK Ideograph */
+ ["\u7E12", "\u7E12"], /* CJK Ideograph */
+ ["\u7E13", "\u7E13"], /* CJK Ideograph */
+ ["\u7E14", "\u7E14"], /* CJK Ideograph */
+ ["\u7E15", "\u7E15"], /* CJK Ideograph */
+ ["\u7E16", "\u7E16"], /* CJK Ideograph */
+ ["\u7E17", "\u7E17"], /* CJK Ideograph */
+ ["\u7E18", "\u7E18"], /* CJK Ideograph */
+ ["\u7E19", "\u7E19"], /* CJK Ideograph */
+ ["\u7E1A", "\u7E1A"], /* CJK Ideograph */
+ ["\u7E1B", "\u7E1B"], /* CJK Ideograph */
+ ["\u7E1C", "\u7E1C"], /* CJK Ideograph */
+ ["\u7E1D", "\u7E1D"], /* CJK Ideograph */
+ ["\u7E1E", "\u7E1E"], /* CJK Ideograph */
+ ["\u7E1F", "\u7E1F"], /* CJK Ideograph */
+ ["\u7E20", "\u7E20"], /* CJK Ideograph */
+ ["\u7E21", "\u7E21"], /* CJK Ideograph */
+ ["\u7E22", "\u7E22"], /* CJK Ideograph */
+ ["\u7E23", "\u7E23"], /* CJK Ideograph */
+ ["\u7E24", "\u7E24"], /* CJK Ideograph */
+ ["\u7E25", "\u7E25"], /* CJK Ideograph */
+ ["\u7E26", "\u7E26"], /* CJK Ideograph */
+ ["\u7E27", "\u7E27"], /* CJK Ideograph */
+ ["\u7E28", "\u7E28"], /* CJK Ideograph */
+ ["\u7E29", "\u7E29"], /* CJK Ideograph */
+ ["\u7E2A", "\u7E2A"], /* CJK Ideograph */
+ ["\u7E2B", "\u7E2B"], /* CJK Ideograph */
+ ["\u7E2C", "\u7E2C"], /* CJK Ideograph */
+ ["\u7E2D", "\u7E2D"], /* CJK Ideograph */
+ ["\u7E2E", "\u7E2E"], /* CJK Ideograph */
+ ["\u7E2F", "\u7E2F"], /* CJK Ideograph */
+ ["\u7E30", "\u7E30"], /* CJK Ideograph */
+ ["\u7E31", "\u7E31"], /* CJK Ideograph */
+ ["\u7E32", "\u7E32"], /* CJK Ideograph */
+ ["\u7E33", "\u7E33"], /* CJK Ideograph */
+ ["\u7E34", "\u7E34"], /* CJK Ideograph */
+ ["\u7E35", "\u7E35"], /* CJK Ideograph */
+ ["\u7E36", "\u7E36"], /* CJK Ideograph */
+ ["\u7E37", "\u7E37"], /* CJK Ideograph */
+ ["\u7E38", "\u7E38"], /* CJK Ideograph */
+ ["\u7E39", "\u7E39"], /* CJK Ideograph */
+ ["\u7E3A", "\u7E3A"], /* CJK Ideograph */
+ ["\u7E3B", "\u7E3B"], /* CJK Ideograph */
+ ["\u7E3C", "\u7E3C"], /* CJK Ideograph */
+ ["\u7E3D", "\u7E3D"], /* CJK Ideograph */
+ ["\u7E3E", "\u7E3E"], /* CJK Ideograph */
+ ["\u7E3F", "\u7E3F"], /* CJK Ideograph */
+ ["\u7E40", "\u7E40"], /* CJK Ideograph */
+ ["\u7E41", "\u7E41"], /* CJK Ideograph */
+ ["\u7E42", "\u7E42"], /* CJK Ideograph */
+ ["\u7E43", "\u7E43"], /* CJK Ideograph */
+ ["\u7E44", "\u7E44"], /* CJK Ideograph */
+ ["\u7E45", "\u7E45"], /* CJK Ideograph */
+ ["\u7E46", "\u7E46"], /* CJK Ideograph */
+ ["\u7E47", "\u7E47"], /* CJK Ideograph */
+ ["\u7E48", "\u7E48"], /* CJK Ideograph */
+ ["\u7E49", "\u7E49"], /* CJK Ideograph */
+ ["\u7E4A", "\u7E4A"], /* CJK Ideograph */
+ ["\u7E4B", "\u7E4B"], /* CJK Ideograph */
+ ["\u7E4C", "\u7E4C"], /* CJK Ideograph */
+ ["\u7E4D", "\u7E4D"], /* CJK Ideograph */
+ ["\u7E4E", "\u7E4E"], /* CJK Ideograph */
+ ["\u7E4F", "\u7E4F"], /* CJK Ideograph */
+ ["\u7E50", "\u7E50"], /* CJK Ideograph */
+ ["\u7E51", "\u7E51"], /* CJK Ideograph */
+ ["\u7E52", "\u7E52"], /* CJK Ideograph */
+ ["\u7E53", "\u7E53"], /* CJK Ideograph */
+ ["\u7E54", "\u7E54"], /* CJK Ideograph */
+ ["\u7E55", "\u7E55"], /* CJK Ideograph */
+ ["\u7E56", "\u7E56"], /* CJK Ideograph */
+ ["\u7E57", "\u7E57"], /* CJK Ideograph */
+ ["\u7E58", "\u7E58"], /* CJK Ideograph */
+ ["\u7E59", "\u7E59"], /* CJK Ideograph */
+ ["\u7E5A", "\u7E5A"], /* CJK Ideograph */
+ ["\u7E5B", "\u7E5B"], /* CJK Ideograph */
+ ["\u7E5C", "\u7E5C"], /* CJK Ideograph */
+ ["\u7E5D", "\u7E5D"], /* CJK Ideograph */
+ ["\u7E5E", "\u7E5E"], /* CJK Ideograph */
+ ["\u7E5F", "\u7E5F"], /* CJK Ideograph */
+ ["\u7E60", "\u7E60"], /* CJK Ideograph */
+ ["\u7E61", "\u7E61"], /* CJK Ideograph */
+ ["\u7E62", "\u7E62"], /* CJK Ideograph */
+ ["\u7E63", "\u7E63"], /* CJK Ideograph */
+ ["\u7E64", "\u7E64"], /* CJK Ideograph */
+ ["\u7E65", "\u7E65"], /* CJK Ideograph */
+ ["\u7E66", "\u7E66"], /* CJK Ideograph */
+ ["\u7E67", "\u7E67"], /* CJK Ideograph */
+ ["\u7E68", "\u7E68"], /* CJK Ideograph */
+ ["\u7E69", "\u7E69"], /* CJK Ideograph */
+ ["\u7E6A", "\u7E6A"], /* CJK Ideograph */
+ ["\u7E6B", "\u7E6B"], /* CJK Ideograph */
+ ["\u7E6C", "\u7E6C"], /* CJK Ideograph */
+ ["\u7E6D", "\u7E6D"], /* CJK Ideograph */
+ ["\u7E6E", "\u7E6E"], /* CJK Ideograph */
+ ["\u7E6F", "\u7E6F"], /* CJK Ideograph */
+ ["\u7E70", "\u7E70"], /* CJK Ideograph */
+ ["\u7E71", "\u7E71"], /* CJK Ideograph */
+ ["\u7E72", "\u7E72"], /* CJK Ideograph */
+ ["\u7E73", "\u7E73"], /* CJK Ideograph */
+ ["\u7E74", "\u7E74"], /* CJK Ideograph */
+ ["\u7E75", "\u7E75"], /* CJK Ideograph */
+ ["\u7E76", "\u7E76"], /* CJK Ideograph */
+ ["\u7E77", "\u7E77"], /* CJK Ideograph */
+ ["\u7E78", "\u7E78"], /* CJK Ideograph */
+ ["\u7E79", "\u7E79"], /* CJK Ideograph */
+ ["\u7E7A", "\u7E7A"], /* CJK Ideograph */
+ ["\u7E7B", "\u7E7B"], /* CJK Ideograph */
+ ["\u7E7C", "\u7E7C"], /* CJK Ideograph */
+ ["\u7E7D", "\u7E7D"], /* CJK Ideograph */
+ ["\u7E7E", "\u7E7E"], /* CJK Ideograph */
+ ["\u7E7F", "\u7E7F"], /* CJK Ideograph */
+ ["\u7E80", "\u7E80"], /* CJK Ideograph */
+ ["\u7E81", "\u7E81"], /* CJK Ideograph */
+ ["\u7E82", "\u7E82"], /* CJK Ideograph */
+ ["\u7E83", "\u7E83"], /* CJK Ideograph */
+ ["\u7E84", "\u7E84"], /* CJK Ideograph */
+ ["\u7E85", "\u7E85"], /* CJK Ideograph */
+ ["\u7E86", "\u7E86"], /* CJK Ideograph */
+ ["\u7E87", "\u7E87"], /* CJK Ideograph */
+ ["\u7E88", "\u7E88"], /* CJK Ideograph */
+ ["\u7E89", "\u7E89"], /* CJK Ideograph */
+ ["\u7E8A", "\u7E8A"], /* CJK Ideograph */
+ ["\u7E8B", "\u7E8B"], /* CJK Ideograph */
+ ["\u7E8C", "\u7E8C"], /* CJK Ideograph */
+ ["\u7E8D", "\u7E8D"], /* CJK Ideograph */
+ ["\u7E8E", "\u7E8E"], /* CJK Ideograph */
+ ["\u7E8F", "\u7E8F"], /* CJK Ideograph */
+ ["\u7E90", "\u7E90"], /* CJK Ideograph */
+ ["\u7E91", "\u7E91"], /* CJK Ideograph */
+ ["\u7E92", "\u7E92"], /* CJK Ideograph */
+ ["\u7E93", "\u7E93"], /* CJK Ideograph */
+ ["\u7E94", "\u7E94"], /* CJK Ideograph */
+ ["\u7E95", "\u7E95"], /* CJK Ideograph */
+ ["\u7E96", "\u7E96"], /* CJK Ideograph */
+ ["\u7E97", "\u7E97"], /* CJK Ideograph */
+ ["\u7E98", "\u7E98"], /* CJK Ideograph */
+ ["\u7E99", "\u7E99"], /* CJK Ideograph */
+ ["\u7E9A", "\u7E9A"], /* CJK Ideograph */
+ ["\u7E9B", "\u7E9B"], /* CJK Ideograph */
+ ["\u7E9C", "\u7E9C"], /* CJK Ideograph */
+ ["\u7E9D", "\u7E9D"], /* CJK Ideograph */
+ ["\u7E9E", "\u7E9E"], /* CJK Ideograph */
+ ["\u7E9F", "\u7E9F"], /* CJK Ideograph */
+ ["\u7EA0", "\u7EA0"], /* CJK Ideograph */
+ ["\u7EA1", "\u7EA1"], /* CJK Ideograph */
+ ["\u7EA2", "\u7EA2"], /* CJK Ideograph */
+ ["\u7EA3", "\u7EA3"], /* CJK Ideograph */
+ ["\u7EA4", "\u7EA4"], /* CJK Ideograph */
+ ["\u7EA5", "\u7EA5"], /* CJK Ideograph */
+ ["\u7EA6", "\u7EA6"], /* CJK Ideograph */
+ ["\u7EA7", "\u7EA7"], /* CJK Ideograph */
+ ["\u7EA8", "\u7EA8"], /* CJK Ideograph */
+ ["\u7EA9", "\u7EA9"], /* CJK Ideograph */
+ ["\u7EAA", "\u7EAA"], /* CJK Ideograph */
+ ["\u7EAB", "\u7EAB"], /* CJK Ideograph */
+ ["\u7EAC", "\u7EAC"], /* CJK Ideograph */
+ ["\u7EAD", "\u7EAD"], /* CJK Ideograph */
+ ["\u7EAE", "\u7EAE"], /* CJK Ideograph */
+ ["\u7EAF", "\u7EAF"], /* CJK Ideograph */
+ ["\u7EB0", "\u7EB0"], /* CJK Ideograph */
+ ["\u7EB1", "\u7EB1"], /* CJK Ideograph */
+ ["\u7EB2", "\u7EB2"], /* CJK Ideograph */
+ ["\u7EB3", "\u7EB3"], /* CJK Ideograph */
+ ["\u7EB4", "\u7EB4"], /* CJK Ideograph */
+ ["\u7EB5", "\u7EB5"], /* CJK Ideograph */
+ ["\u7EB6", "\u7EB6"], /* CJK Ideograph */
+ ["\u7EB7", "\u7EB7"], /* CJK Ideograph */
+ ["\u7EB8", "\u7EB8"], /* CJK Ideograph */
+ ["\u7EB9", "\u7EB9"], /* CJK Ideograph */
+ ["\u7EBA", "\u7EBA"], /* CJK Ideograph */
+ ["\u7EBB", "\u7EBB"], /* CJK Ideograph */
+ ["\u7EBC", "\u7EBC"], /* CJK Ideograph */
+ ["\u7EBD", "\u7EBD"], /* CJK Ideograph */
+ ["\u7EBE", "\u7EBE"], /* CJK Ideograph */
+ ["\u7EBF", "\u7EBF"], /* CJK Ideograph */
+ ["\u7EC0", "\u7EC0"], /* CJK Ideograph */
+ ["\u7EC1", "\u7EC1"], /* CJK Ideograph */
+ ["\u7EC2", "\u7EC2"], /* CJK Ideograph */
+ ["\u7EC3", "\u7EC3"], /* CJK Ideograph */
+ ["\u7EC4", "\u7EC4"], /* CJK Ideograph */
+ ["\u7EC5", "\u7EC5"], /* CJK Ideograph */
+ ["\u7EC6", "\u7EC6"], /* CJK Ideograph */
+ ["\u7EC7", "\u7EC7"], /* CJK Ideograph */
+ ["\u7EC8", "\u7EC8"], /* CJK Ideograph */
+ ["\u7EC9", "\u7EC9"], /* CJK Ideograph */
+ ["\u7ECA", "\u7ECA"], /* CJK Ideograph */
+ ["\u7ECB", "\u7ECB"], /* CJK Ideograph */
+ ["\u7ECC", "\u7ECC"], /* CJK Ideograph */
+ ["\u7ECD", "\u7ECD"], /* CJK Ideograph */
+ ["\u7ECE", "\u7ECE"], /* CJK Ideograph */
+ ["\u7ECF", "\u7ECF"], /* CJK Ideograph */
+ ["\u7ED0", "\u7ED0"], /* CJK Ideograph */
+ ["\u7ED1", "\u7ED1"], /* CJK Ideograph */
+ ["\u7ED2", "\u7ED2"], /* CJK Ideograph */
+ ["\u7ED3", "\u7ED3"], /* CJK Ideograph */
+ ["\u7ED4", "\u7ED4"], /* CJK Ideograph */
+ ["\u7ED5", "\u7ED5"], /* CJK Ideograph */
+ ["\u7ED6", "\u7ED6"], /* CJK Ideograph */
+ ["\u7ED7", "\u7ED7"], /* CJK Ideograph */
+ ["\u7ED8", "\u7ED8"], /* CJK Ideograph */
+ ["\u7ED9", "\u7ED9"], /* CJK Ideograph */
+ ["\u7EDA", "\u7EDA"], /* CJK Ideograph */
+ ["\u7EDB", "\u7EDB"], /* CJK Ideograph */
+ ["\u7EDC", "\u7EDC"], /* CJK Ideograph */
+ ["\u7EDD", "\u7EDD"], /* CJK Ideograph */
+ ["\u7EDE", "\u7EDE"], /* CJK Ideograph */
+ ["\u7EDF", "\u7EDF"], /* CJK Ideograph */
+ ["\u7EE0", "\u7EE0"], /* CJK Ideograph */
+ ["\u7EE1", "\u7EE1"], /* CJK Ideograph */
+ ["\u7EE2", "\u7EE2"], /* CJK Ideograph */
+ ["\u7EE3", "\u7EE3"], /* CJK Ideograph */
+ ["\u7EE4", "\u7EE4"], /* CJK Ideograph */
+ ["\u7EE5", "\u7EE5"], /* CJK Ideograph */
+ ["\u7EE6", "\u7EE6"], /* CJK Ideograph */
+ ["\u7EE7", "\u7EE7"], /* CJK Ideograph */
+ ["\u7EE8", "\u7EE8"], /* CJK Ideograph */
+ ["\u7EE9", "\u7EE9"], /* CJK Ideograph */
+ ["\u7EEA", "\u7EEA"], /* CJK Ideograph */
+ ["\u7EEB", "\u7EEB"], /* CJK Ideograph */
+ ["\u7EEC", "\u7EEC"], /* CJK Ideograph */
+ ["\u7EED", "\u7EED"], /* CJK Ideograph */
+ ["\u7EEE", "\u7EEE"], /* CJK Ideograph */
+ ["\u7EEF", "\u7EEF"], /* CJK Ideograph */
+ ["\u7EF0", "\u7EF0"], /* CJK Ideograph */
+ ["\u7EF1", "\u7EF1"], /* CJK Ideograph */
+ ["\u7EF2", "\u7EF2"], /* CJK Ideograph */
+ ["\u7EF3", "\u7EF3"], /* CJK Ideograph */
+ ["\u7EF4", "\u7EF4"], /* CJK Ideograph */
+ ["\u7EF5", "\u7EF5"], /* CJK Ideograph */
+ ["\u7EF6", "\u7EF6"], /* CJK Ideograph */
+ ["\u7EF7", "\u7EF7"], /* CJK Ideograph */
+ ["\u7EF8", "\u7EF8"], /* CJK Ideograph */
+ ["\u7EF9", "\u7EF9"], /* CJK Ideograph */
+ ["\u7EFA", "\u7EFA"], /* CJK Ideograph */
+ ["\u7EFB", "\u7EFB"], /* CJK Ideograph */
+ ["\u7EFC", "\u7EFC"], /* CJK Ideograph */
+ ["\u7EFD", "\u7EFD"], /* CJK Ideograph */
+ ["\u7EFE", "\u7EFE"], /* CJK Ideograph */
+ ["\u7EFF", "\u7EFF"], /* CJK Ideograph */
+ ["\u7F00", "\u7F00"], /* CJK Ideograph */
+ ["\u7F01", "\u7F01"], /* CJK Ideograph */
+ ["\u7F02", "\u7F02"], /* CJK Ideograph */
+ ["\u7F03", "\u7F03"], /* CJK Ideograph */
+ ["\u7F04", "\u7F04"], /* CJK Ideograph */
+ ["\u7F05", "\u7F05"], /* CJK Ideograph */
+ ["\u7F06", "\u7F06"], /* CJK Ideograph */
+ ["\u7F07", "\u7F07"], /* CJK Ideograph */
+ ["\u7F08", "\u7F08"], /* CJK Ideograph */
+ ["\u7F09", "\u7F09"], /* CJK Ideograph */
+ ["\u7F0A", "\u7F0A"], /* CJK Ideograph */
+ ["\u7F0B", "\u7F0B"], /* CJK Ideograph */
+ ["\u7F0C", "\u7F0C"], /* CJK Ideograph */
+ ["\u7F0D", "\u7F0D"], /* CJK Ideograph */
+ ["\u7F0E", "\u7F0E"], /* CJK Ideograph */
+ ["\u7F0F", "\u7F0F"], /* CJK Ideograph */
+ ["\u7F10", "\u7F10"], /* CJK Ideograph */
+ ["\u7F11", "\u7F11"], /* CJK Ideograph */
+ ["\u7F12", "\u7F12"], /* CJK Ideograph */
+ ["\u7F13", "\u7F13"], /* CJK Ideograph */
+ ["\u7F14", "\u7F14"], /* CJK Ideograph */
+ ["\u7F15", "\u7F15"], /* CJK Ideograph */
+ ["\u7F16", "\u7F16"], /* CJK Ideograph */
+ ["\u7F17", "\u7F17"], /* CJK Ideograph */
+ ["\u7F18", "\u7F18"], /* CJK Ideograph */
+ ["\u7F19", "\u7F19"], /* CJK Ideograph */
+ ["\u7F1A", "\u7F1A"], /* CJK Ideograph */
+ ["\u7F1B", "\u7F1B"], /* CJK Ideograph */
+ ["\u7F1C", "\u7F1C"], /* CJK Ideograph */
+ ["\u7F1D", "\u7F1D"], /* CJK Ideograph */
+ ["\u7F1E", "\u7F1E"], /* CJK Ideograph */
+ ["\u7F1F", "\u7F1F"], /* CJK Ideograph */
+ ["\u7F20", "\u7F20"], /* CJK Ideograph */
+ ["\u7F21", "\u7F21"], /* CJK Ideograph */
+ ["\u7F22", "\u7F22"], /* CJK Ideograph */
+ ["\u7F23", "\u7F23"], /* CJK Ideograph */
+ ["\u7F24", "\u7F24"], /* CJK Ideograph */
+ ["\u7F25", "\u7F25"], /* CJK Ideograph */
+ ["\u7F26", "\u7F26"], /* CJK Ideograph */
+ ["\u7F27", "\u7F27"], /* CJK Ideograph */
+ ["\u7F28", "\u7F28"], /* CJK Ideograph */
+ ["\u7F29", "\u7F29"], /* CJK Ideograph */
+ ["\u7F2A", "\u7F2A"], /* CJK Ideograph */
+ ["\u7F2B", "\u7F2B"], /* CJK Ideograph */
+ ["\u7F2C", "\u7F2C"], /* CJK Ideograph */
+ ["\u7F2D", "\u7F2D"], /* CJK Ideograph */
+ ["\u7F2E", "\u7F2E"], /* CJK Ideograph */
+ ["\u7F2F", "\u7F2F"], /* CJK Ideograph */
+ ["\u7F30", "\u7F30"], /* CJK Ideograph */
+ ["\u7F31", "\u7F31"], /* CJK Ideograph */
+ ["\u7F32", "\u7F32"], /* CJK Ideograph */
+ ["\u7F33", "\u7F33"], /* CJK Ideograph */
+ ["\u7F34", "\u7F34"], /* CJK Ideograph */
+ ["\u7F35", "\u7F35"], /* CJK Ideograph */
+ ["\u7F36", "\u7F36"], /* CJK Ideograph */
+ ["\u7F37", "\u7F37"], /* CJK Ideograph */
+ ["\u7F38", "\u7F38"], /* CJK Ideograph */
+ ["\u7F39", "\u7F39"], /* CJK Ideograph */
+ ["\u7F3A", "\u7F3A"], /* CJK Ideograph */
+ ["\u7F3B", "\u7F3B"], /* CJK Ideograph */
+ ["\u7F3C", "\u7F3C"], /* CJK Ideograph */
+ ["\u7F3D", "\u7F3D"], /* CJK Ideograph */
+ ["\u7F3E", "\u7F3E"], /* CJK Ideograph */
+ ["\u7F3F", "\u7F3F"], /* CJK Ideograph */
+ ["\u7F40", "\u7F40"], /* CJK Ideograph */
+ ["\u7F41", "\u7F41"], /* CJK Ideograph */
+ ["\u7F42", "\u7F42"], /* CJK Ideograph */
+ ["\u7F43", "\u7F43"], /* CJK Ideograph */
+ ["\u7F44", "\u7F44"], /* CJK Ideograph */
+ ["\u7F45", "\u7F45"], /* CJK Ideograph */
+ ["\u7F46", "\u7F46"], /* CJK Ideograph */
+ ["\u7F47", "\u7F47"], /* CJK Ideograph */
+ ["\u7F48", "\u7F48"], /* CJK Ideograph */
+ ["\u7F49", "\u7F49"], /* CJK Ideograph */
+ ["\u7F4A", "\u7F4A"], /* CJK Ideograph */
+ ["\u7F4B", "\u7F4B"], /* CJK Ideograph */
+ ["\u7F4C", "\u7F4C"], /* CJK Ideograph */
+ ["\u7F4D", "\u7F4D"], /* CJK Ideograph */
+ ["\u7F4E", "\u7F4E"], /* CJK Ideograph */
+ ["\u7F4F", "\u7F4F"], /* CJK Ideograph */
+ ["\u7F50", "\u7F50"], /* CJK Ideograph */
+ ["\u7F51", "\u7F51"], /* CJK Ideograph */
+ ["\u7F52", "\u7F52"], /* CJK Ideograph */
+ ["\u7F53", "\u7F53"], /* CJK Ideograph */
+ ["\u7F54", "\u7F54"], /* CJK Ideograph */
+ ["\u7F55", "\u7F55"], /* CJK Ideograph */
+ ["\u7F56", "\u7F56"], /* CJK Ideograph */
+ ["\u7F57", "\u7F57"], /* CJK Ideograph */
+ ["\u7F58", "\u7F58"], /* CJK Ideograph */
+ ["\u7F59", "\u7F59"], /* CJK Ideograph */
+ ["\u7F5A", "\u7F5A"], /* CJK Ideograph */
+ ["\u7F5B", "\u7F5B"], /* CJK Ideograph */
+ ["\u7F5C", "\u7F5C"], /* CJK Ideograph */
+ ["\u7F5D", "\u7F5D"], /* CJK Ideograph */
+ ["\u7F5E", "\u7F5E"], /* CJK Ideograph */
+ ["\u7F5F", "\u7F5F"], /* CJK Ideograph */
+ ["\u7F60", "\u7F60"], /* CJK Ideograph */
+ ["\u7F61", "\u7F61"], /* CJK Ideograph */
+ ["\u7F62", "\u7F62"], /* CJK Ideograph */
+ ["\u7F63", "\u7F63"], /* CJK Ideograph */
+ ["\u7F64", "\u7F64"], /* CJK Ideograph */
+ ["\u7F65", "\u7F65"], /* CJK Ideograph */
+ ["\u7F66", "\u7F66"], /* CJK Ideograph */
+ ["\u7F67", "\u7F67"], /* CJK Ideograph */
+ ["\u7F68", "\u7F68"], /* CJK Ideograph */
+ ["\u7F69", "\u7F69"], /* CJK Ideograph */
+ ["\u7F6A", "\u7F6A"], /* CJK Ideograph */
+ ["\u7F6B", "\u7F6B"], /* CJK Ideograph */
+ ["\u7F6C", "\u7F6C"], /* CJK Ideograph */
+ ["\u7F6D", "\u7F6D"], /* CJK Ideograph */
+ ["\u7F6E", "\u7F6E"], /* CJK Ideograph */
+ ["\u7F6F", "\u7F6F"], /* CJK Ideograph */
+ ["\u7F70", "\u7F70"], /* CJK Ideograph */
+ ["\u7F71", "\u7F71"], /* CJK Ideograph */
+ ["\u7F72", "\u7F72"], /* CJK Ideograph */
+ ["\u7F73", "\u7F73"], /* CJK Ideograph */
+ ["\u7F74", "\u7F74"], /* CJK Ideograph */
+ ["\u7F75", "\u7F75"], /* CJK Ideograph */
+ ["\u7F76", "\u7F76"], /* CJK Ideograph */
+ ["\u7F77", "\u7F77"], /* CJK Ideograph */
+ ["\u7F78", "\u7F78"], /* CJK Ideograph */
+ ["\u7F79", "\u7F79"], /* CJK Ideograph */
+ ["\u7F7A", "\u7F7A"], /* CJK Ideograph */
+ ["\u7F7B", "\u7F7B"], /* CJK Ideograph */
+ ["\u7F7C", "\u7F7C"], /* CJK Ideograph */
+ ["\u7F7D", "\u7F7D"], /* CJK Ideograph */
+ ["\u7F7E", "\u7F7E"], /* CJK Ideograph */
+ ["\u7F7F", "\u7F7F"], /* CJK Ideograph */
+ ["\u7F80", "\u7F80"], /* CJK Ideograph */
+ ["\u7F81", "\u7F81"], /* CJK Ideograph */
+ ["\u7F82", "\u7F82"], /* CJK Ideograph */
+ ["\u7F83", "\u7F83"], /* CJK Ideograph */
+ ["\u7F84", "\u7F84"], /* CJK Ideograph */
+ ["\u7F85", "\u7F85"], /* CJK Ideograph */
+ ["\u7F86", "\u7F86"], /* CJK Ideograph */
+ ["\u7F87", "\u7F87"], /* CJK Ideograph */
+ ["\u7F88", "\u7F88"], /* CJK Ideograph */
+ ["\u7F89", "\u7F89"], /* CJK Ideograph */
+ ["\u7F8A", "\u7F8A"], /* CJK Ideograph */
+ ["\u7F8B", "\u7F8B"], /* CJK Ideograph */
+ ["\u7F8C", "\u7F8C"], /* CJK Ideograph */
+ ["\u7F8D", "\u7F8D"], /* CJK Ideograph */
+ ["\u7F8E", "\u7F8E"], /* CJK Ideograph */
+ ["\u7F8F", "\u7F8F"], /* CJK Ideograph */
+ ["\u7F90", "\u7F90"], /* CJK Ideograph */
+ ["\u7F91", "\u7F91"], /* CJK Ideograph */
+ ["\u7F92", "\u7F92"], /* CJK Ideograph */
+ ["\u7F93", "\u7F93"], /* CJK Ideograph */
+ ["\u7F94", "\u7F94"], /* CJK Ideograph */
+ ["\u7F95", "\u7F95"], /* CJK Ideograph */
+ ["\u7F96", "\u7F96"], /* CJK Ideograph */
+ ["\u7F97", "\u7F97"], /* CJK Ideograph */
+ ["\u7F98", "\u7F98"], /* CJK Ideograph */
+ ["\u7F99", "\u7F99"], /* CJK Ideograph */
+ ["\u7F9A", "\u7F9A"], /* CJK Ideograph */
+ ["\u7F9B", "\u7F9B"], /* CJK Ideograph */
+ ["\u7F9C", "\u7F9C"], /* CJK Ideograph */
+ ["\u7F9D", "\u7F9D"], /* CJK Ideograph */
+ ["\u7F9E", "\u7F9E"], /* CJK Ideograph */
+ ["\u7F9F", "\u7F9F"], /* CJK Ideograph */
+ ["\u7FA0", "\u7FA0"], /* CJK Ideograph */
+ ["\u7FA1", "\u7FA1"], /* CJK Ideograph */
+ ["\u7FA2", "\u7FA2"], /* CJK Ideograph */
+ ["\u7FA3", "\u7FA3"], /* CJK Ideograph */
+ ["\u7FA4", "\u7FA4"], /* CJK Ideograph */
+ ["\u7FA5", "\u7FA5"], /* CJK Ideograph */
+ ["\u7FA6", "\u7FA6"], /* CJK Ideograph */
+ ["\u7FA7", "\u7FA7"], /* CJK Ideograph */
+ ["\u7FA8", "\u7FA8"], /* CJK Ideograph */
+ ["\u7FA9", "\u7FA9"], /* CJK Ideograph */
+ ["\u7FAA", "\u7FAA"], /* CJK Ideograph */
+ ["\u7FAB", "\u7FAB"], /* CJK Ideograph */
+ ["\u7FAC", "\u7FAC"], /* CJK Ideograph */
+ ["\u7FAD", "\u7FAD"], /* CJK Ideograph */
+ ["\u7FAE", "\u7FAE"], /* CJK Ideograph */
+ ["\u7FAF", "\u7FAF"], /* CJK Ideograph */
+ ["\u7FB0", "\u7FB0"], /* CJK Ideograph */
+ ["\u7FB1", "\u7FB1"], /* CJK Ideograph */
+ ["\u7FB2", "\u7FB2"], /* CJK Ideograph */
+ ["\u7FB3", "\u7FB3"], /* CJK Ideograph */
+ ["\u7FB4", "\u7FB4"], /* CJK Ideograph */
+ ["\u7FB5", "\u7FB5"], /* CJK Ideograph */
+ ["\u7FB6", "\u7FB6"], /* CJK Ideograph */
+ ["\u7FB7", "\u7FB7"], /* CJK Ideograph */
+ ["\u7FB8", "\u7FB8"], /* CJK Ideograph */
+ ["\u7FB9", "\u7FB9"], /* CJK Ideograph */
+ ["\u7FBA", "\u7FBA"], /* CJK Ideograph */
+ ["\u7FBB", "\u7FBB"], /* CJK Ideograph */
+ ["\u7FBC", "\u7FBC"], /* CJK Ideograph */
+ ["\u7FBD", "\u7FBD"], /* CJK Ideograph */
+ ["\u7FBE", "\u7FBE"], /* CJK Ideograph */
+ ["\u7FBF", "\u7FBF"], /* CJK Ideograph */
+ ["\u7FC0", "\u7FC0"], /* CJK Ideograph */
+ ["\u7FC1", "\u7FC1"], /* CJK Ideograph */
+ ["\u7FC2", "\u7FC2"], /* CJK Ideograph */
+ ["\u7FC3", "\u7FC3"], /* CJK Ideograph */
+ ["\u7FC4", "\u7FC4"], /* CJK Ideograph */
+ ["\u7FC5", "\u7FC5"], /* CJK Ideograph */
+ ["\u7FC6", "\u7FC6"], /* CJK Ideograph */
+ ["\u7FC7", "\u7FC7"], /* CJK Ideograph */
+ ["\u7FC8", "\u7FC8"], /* CJK Ideograph */
+ ["\u7FC9", "\u7FC9"], /* CJK Ideograph */
+ ["\u7FCA", "\u7FCA"], /* CJK Ideograph */
+ ["\u7FCB", "\u7FCB"], /* CJK Ideograph */
+ ["\u7FCC", "\u7FCC"], /* CJK Ideograph */
+ ["\u7FCD", "\u7FCD"], /* CJK Ideograph */
+ ["\u7FCE", "\u7FCE"], /* CJK Ideograph */
+ ["\u7FCF", "\u7FCF"], /* CJK Ideograph */
+ ["\u7FD0", "\u7FD0"], /* CJK Ideograph */
+ ["\u7FD1", "\u7FD1"], /* CJK Ideograph */
+ ["\u7FD2", "\u7FD2"], /* CJK Ideograph */
+ ["\u7FD3", "\u7FD3"], /* CJK Ideograph */
+ ["\u7FD4", "\u7FD4"], /* CJK Ideograph */
+ ["\u7FD5", "\u7FD5"], /* CJK Ideograph */
+ ["\u7FD6", "\u7FD6"], /* CJK Ideograph */
+ ["\u7FD7", "\u7FD7"], /* CJK Ideograph */
+ ["\u7FD8", "\u7FD8"], /* CJK Ideograph */
+ ["\u7FD9", "\u7FD9"], /* CJK Ideograph */
+ ["\u7FDA", "\u7FDA"], /* CJK Ideograph */
+ ["\u7FDB", "\u7FDB"], /* CJK Ideograph */
+ ["\u7FDC", "\u7FDC"], /* CJK Ideograph */
+ ["\u7FDD", "\u7FDD"], /* CJK Ideograph */
+ ["\u7FDE", "\u7FDE"], /* CJK Ideograph */
+ ["\u7FDF", "\u7FDF"], /* CJK Ideograph */
+ ["\u7FE0", "\u7FE0"], /* CJK Ideograph */
+ ["\u7FE1", "\u7FE1"], /* CJK Ideograph */
+ ["\u7FE2", "\u7FE2"], /* CJK Ideograph */
+ ["\u7FE3", "\u7FE3"], /* CJK Ideograph */
+ ["\u7FE4", "\u7FE4"], /* CJK Ideograph */
+ ["\u7FE5", "\u7FE5"], /* CJK Ideograph */
+ ["\u7FE6", "\u7FE6"], /* CJK Ideograph */
+ ["\u7FE7", "\u7FE7"], /* CJK Ideograph */
+ ["\u7FE8", "\u7FE8"], /* CJK Ideograph */
+ ["\u7FE9", "\u7FE9"], /* CJK Ideograph */
+ ["\u7FEA", "\u7FEA"], /* CJK Ideograph */
+ ["\u7FEB", "\u7FEB"], /* CJK Ideograph */
+ ["\u7FEC", "\u7FEC"], /* CJK Ideograph */
+ ["\u7FED", "\u7FED"], /* CJK Ideograph */
+ ["\u7FEE", "\u7FEE"], /* CJK Ideograph */
+ ["\u7FEF", "\u7FEF"], /* CJK Ideograph */
+ ["\u7FF0", "\u7FF0"], /* CJK Ideograph */
+ ["\u7FF1", "\u7FF1"], /* CJK Ideograph */
+ ["\u7FF2", "\u7FF2"], /* CJK Ideograph */
+ ["\u7FF3", "\u7FF3"], /* CJK Ideograph */
+ ["\u7FF4", "\u7FF4"], /* CJK Ideograph */
+ ["\u7FF5", "\u7FF5"], /* CJK Ideograph */
+ ["\u7FF6", "\u7FF6"], /* CJK Ideograph */
+ ["\u7FF7", "\u7FF7"], /* CJK Ideograph */
+ ["\u7FF8", "\u7FF8"], /* CJK Ideograph */
+ ["\u7FF9", "\u7FF9"], /* CJK Ideograph */
+ ["\u7FFA", "\u7FFA"], /* CJK Ideograph */
+ ["\u7FFB", "\u7FFB"], /* CJK Ideograph */
+ ["\u7FFC", "\u7FFC"], /* CJK Ideograph */
+ ["\u7FFD", "\u7FFD"], /* CJK Ideograph */
+ ["\u7FFE", "\u7FFE"], /* CJK Ideograph */
+ ["\u7FFF", "\u7FFF"], /* CJK Ideograph */
+ ["\u8000", "\u8000"], /* CJK Ideograph */
+ ["\u8001", "\u8001"], /* CJK Ideograph */
+ ["\u8002", "\u8002"], /* CJK Ideograph */
+ ["\u8003", "\u8003"], /* CJK Ideograph */
+ ["\u8004", "\u8004"], /* CJK Ideograph */
+ ["\u8005", "\u8005"], /* CJK Ideograph */
+ ["\u8006", "\u8006"], /* CJK Ideograph */
+ ["\u8007", "\u8007"], /* CJK Ideograph */
+ ["\u8008", "\u8008"], /* CJK Ideograph */
+ ["\u8009", "\u8009"], /* CJK Ideograph */
+ ["\u800A", "\u800A"], /* CJK Ideograph */
+ ["\u800B", "\u800B"], /* CJK Ideograph */
+ ["\u800C", "\u800C"], /* CJK Ideograph */
+ ["\u800D", "\u800D"], /* CJK Ideograph */
+ ["\u800E", "\u800E"], /* CJK Ideograph */
+ ["\u800F", "\u800F"], /* CJK Ideograph */
+ ["\u8010", "\u8010"], /* CJK Ideograph */
+ ["\u8011", "\u8011"], /* CJK Ideograph */
+ ["\u8012", "\u8012"], /* CJK Ideograph */
+ ["\u8013", "\u8013"], /* CJK Ideograph */
+ ["\u8014", "\u8014"], /* CJK Ideograph */
+ ["\u8015", "\u8015"], /* CJK Ideograph */
+ ["\u8016", "\u8016"], /* CJK Ideograph */
+ ["\u8017", "\u8017"], /* CJK Ideograph */
+ ["\u8018", "\u8018"], /* CJK Ideograph */
+ ["\u8019", "\u8019"], /* CJK Ideograph */
+ ["\u801A", "\u801A"], /* CJK Ideograph */
+ ["\u801B", "\u801B"], /* CJK Ideograph */
+ ["\u801C", "\u801C"], /* CJK Ideograph */
+ ["\u801D", "\u801D"], /* CJK Ideograph */
+ ["\u801E", "\u801E"], /* CJK Ideograph */
+ ["\u801F", "\u801F"], /* CJK Ideograph */
+ ["\u8020", "\u8020"], /* CJK Ideograph */
+ ["\u8021", "\u8021"], /* CJK Ideograph */
+ ["\u8022", "\u8022"], /* CJK Ideograph */
+ ["\u8023", "\u8023"], /* CJK Ideograph */
+ ["\u8024", "\u8024"], /* CJK Ideograph */
+ ["\u8025", "\u8025"], /* CJK Ideograph */
+ ["\u8026", "\u8026"], /* CJK Ideograph */
+ ["\u8027", "\u8027"], /* CJK Ideograph */
+ ["\u8028", "\u8028"], /* CJK Ideograph */
+ ["\u8029", "\u8029"], /* CJK Ideograph */
+ ["\u802A", "\u802A"], /* CJK Ideograph */
+ ["\u802B", "\u802B"], /* CJK Ideograph */
+ ["\u802C", "\u802C"], /* CJK Ideograph */
+ ["\u802D", "\u802D"], /* CJK Ideograph */
+ ["\u802E", "\u802E"], /* CJK Ideograph */
+ ["\u802F", "\u802F"], /* CJK Ideograph */
+ ["\u8030", "\u8030"], /* CJK Ideograph */
+ ["\u8031", "\u8031"], /* CJK Ideograph */
+ ["\u8032", "\u8032"], /* CJK Ideograph */
+ ["\u8033", "\u8033"], /* CJK Ideograph */
+ ["\u8034", "\u8034"], /* CJK Ideograph */
+ ["\u8035", "\u8035"], /* CJK Ideograph */
+ ["\u8036", "\u8036"], /* CJK Ideograph */
+ ["\u8037", "\u8037"], /* CJK Ideograph */
+ ["\u8038", "\u8038"], /* CJK Ideograph */
+ ["\u8039", "\u8039"], /* CJK Ideograph */
+ ["\u803A", "\u803A"], /* CJK Ideograph */
+ ["\u803B", "\u803B"], /* CJK Ideograph */
+ ["\u803C", "\u803C"], /* CJK Ideograph */
+ ["\u803D", "\u803D"], /* CJK Ideograph */
+ ["\u803E", "\u803E"], /* CJK Ideograph */
+ ["\u803F", "\u803F"], /* CJK Ideograph */
+ ["\u8040", "\u8040"], /* CJK Ideograph */
+ ["\u8041", "\u8041"], /* CJK Ideograph */
+ ["\u8042", "\u8042"], /* CJK Ideograph */
+ ["\u8043", "\u8043"], /* CJK Ideograph */
+ ["\u8044", "\u8044"], /* CJK Ideograph */
+ ["\u8045", "\u8045"], /* CJK Ideograph */
+ ["\u8046", "\u8046"], /* CJK Ideograph */
+ ["\u8047", "\u8047"], /* CJK Ideograph */
+ ["\u8048", "\u8048"], /* CJK Ideograph */
+ ["\u8049", "\u8049"], /* CJK Ideograph */
+ ["\u804A", "\u804A"], /* CJK Ideograph */
+ ["\u804B", "\u804B"], /* CJK Ideograph */
+ ["\u804C", "\u804C"], /* CJK Ideograph */
+ ["\u804D", "\u804D"], /* CJK Ideograph */
+ ["\u804E", "\u804E"], /* CJK Ideograph */
+ ["\u804F", "\u804F"], /* CJK Ideograph */
+ ["\u8050", "\u8050"], /* CJK Ideograph */
+ ["\u8051", "\u8051"], /* CJK Ideograph */
+ ["\u8052", "\u8052"], /* CJK Ideograph */
+ ["\u8053", "\u8053"], /* CJK Ideograph */
+ ["\u8054", "\u8054"], /* CJK Ideograph */
+ ["\u8055", "\u8055"], /* CJK Ideograph */
+ ["\u8056", "\u8056"], /* CJK Ideograph */
+ ["\u8057", "\u8057"], /* CJK Ideograph */
+ ["\u8058", "\u8058"], /* CJK Ideograph */
+ ["\u8059", "\u8059"], /* CJK Ideograph */
+ ["\u805A", "\u805A"], /* CJK Ideograph */
+ ["\u805B", "\u805B"], /* CJK Ideograph */
+ ["\u805C", "\u805C"], /* CJK Ideograph */
+ ["\u805D", "\u805D"], /* CJK Ideograph */
+ ["\u805E", "\u805E"], /* CJK Ideograph */
+ ["\u805F", "\u805F"], /* CJK Ideograph */
+ ["\u8060", "\u8060"], /* CJK Ideograph */
+ ["\u8061", "\u8061"], /* CJK Ideograph */
+ ["\u8062", "\u8062"], /* CJK Ideograph */
+ ["\u8063", "\u8063"], /* CJK Ideograph */
+ ["\u8064", "\u8064"], /* CJK Ideograph */
+ ["\u8065", "\u8065"], /* CJK Ideograph */
+ ["\u8066", "\u8066"], /* CJK Ideograph */
+ ["\u8067", "\u8067"], /* CJK Ideograph */
+ ["\u8068", "\u8068"], /* CJK Ideograph */
+ ["\u8069", "\u8069"], /* CJK Ideograph */
+ ["\u806A", "\u806A"], /* CJK Ideograph */
+ ["\u806B", "\u806B"], /* CJK Ideograph */
+ ["\u806C", "\u806C"], /* CJK Ideograph */
+ ["\u806D", "\u806D"], /* CJK Ideograph */
+ ["\u806E", "\u806E"], /* CJK Ideograph */
+ ["\u806F", "\u806F"], /* CJK Ideograph */
+ ["\u8070", "\u8070"], /* CJK Ideograph */
+ ["\u8071", "\u8071"], /* CJK Ideograph */
+ ["\u8072", "\u8072"], /* CJK Ideograph */
+ ["\u8073", "\u8073"], /* CJK Ideograph */
+ ["\u8074", "\u8074"], /* CJK Ideograph */
+ ["\u8075", "\u8075"], /* CJK Ideograph */
+ ["\u8076", "\u8076"], /* CJK Ideograph */
+ ["\u8077", "\u8077"], /* CJK Ideograph */
+ ["\u8078", "\u8078"], /* CJK Ideograph */
+ ["\u8079", "\u8079"], /* CJK Ideograph */
+ ["\u807A", "\u807A"], /* CJK Ideograph */
+ ["\u807B", "\u807B"], /* CJK Ideograph */
+ ["\u807C", "\u807C"], /* CJK Ideograph */
+ ["\u807D", "\u807D"], /* CJK Ideograph */
+ ["\u807E", "\u807E"], /* CJK Ideograph */
+ ["\u807F", "\u807F"], /* CJK Ideograph */
+ ["\u8080", "\u8080"], /* CJK Ideograph */
+ ["\u8081", "\u8081"], /* CJK Ideograph */
+ ["\u8082", "\u8082"], /* CJK Ideograph */
+ ["\u8083", "\u8083"], /* CJK Ideograph */
+ ["\u8084", "\u8084"], /* CJK Ideograph */
+ ["\u8085", "\u8085"], /* CJK Ideograph */
+ ["\u8086", "\u8086"], /* CJK Ideograph */
+ ["\u8087", "\u8087"], /* CJK Ideograph */
+ ["\u8088", "\u8088"], /* CJK Ideograph */
+ ["\u8089", "\u8089"], /* CJK Ideograph */
+ ["\u808A", "\u808A"], /* CJK Ideograph */
+ ["\u808B", "\u808B"], /* CJK Ideograph */
+ ["\u808C", "\u808C"], /* CJK Ideograph */
+ ["\u808D", "\u808D"], /* CJK Ideograph */
+ ["\u808E", "\u808E"], /* CJK Ideograph */
+ ["\u808F", "\u808F"], /* CJK Ideograph */
+ ["\u8090", "\u8090"], /* CJK Ideograph */
+ ["\u8091", "\u8091"], /* CJK Ideograph */
+ ["\u8092", "\u8092"], /* CJK Ideograph */
+ ["\u8093", "\u8093"], /* CJK Ideograph */
+ ["\u8094", "\u8094"], /* CJK Ideograph */
+ ["\u8095", "\u8095"], /* CJK Ideograph */
+ ["\u8096", "\u8096"], /* CJK Ideograph */
+ ["\u8097", "\u8097"], /* CJK Ideograph */
+ ["\u8098", "\u8098"], /* CJK Ideograph */
+ ["\u8099", "\u8099"], /* CJK Ideograph */
+ ["\u809A", "\u809A"], /* CJK Ideograph */
+ ["\u809B", "\u809B"], /* CJK Ideograph */
+ ["\u809C", "\u809C"], /* CJK Ideograph */
+ ["\u809D", "\u809D"], /* CJK Ideograph */
+ ["\u809E", "\u809E"], /* CJK Ideograph */
+ ["\u809F", "\u809F"], /* CJK Ideograph */
+ ["\u80A0", "\u80A0"], /* CJK Ideograph */
+ ["\u80A1", "\u80A1"], /* CJK Ideograph */
+ ["\u80A2", "\u80A2"], /* CJK Ideograph */
+ ["\u80A3", "\u80A3"], /* CJK Ideograph */
+ ["\u80A4", "\u80A4"], /* CJK Ideograph */
+ ["\u80A5", "\u80A5"], /* CJK Ideograph */
+ ["\u80A6", "\u80A6"], /* CJK Ideograph */
+ ["\u80A7", "\u80A7"], /* CJK Ideograph */
+ ["\u80A8", "\u80A8"], /* CJK Ideograph */
+ ["\u80A9", "\u80A9"], /* CJK Ideograph */
+ ["\u80AA", "\u80AA"], /* CJK Ideograph */
+ ["\u80AB", "\u80AB"], /* CJK Ideograph */
+ ["\u80AC", "\u80AC"], /* CJK Ideograph */
+ ["\u80AD", "\u80AD"], /* CJK Ideograph */
+ ["\u80AE", "\u80AE"], /* CJK Ideograph */
+ ["\u80AF", "\u80AF"], /* CJK Ideograph */
+ ["\u80B0", "\u80B0"], /* CJK Ideograph */
+ ["\u80B1", "\u80B1"], /* CJK Ideograph */
+ ["\u80B2", "\u80B2"], /* CJK Ideograph */
+ ["\u80B3", "\u80B3"], /* CJK Ideograph */
+ ["\u80B4", "\u80B4"], /* CJK Ideograph */
+ ["\u80B5", "\u80B5"], /* CJK Ideograph */
+ ["\u80B6", "\u80B6"], /* CJK Ideograph */
+ ["\u80B7", "\u80B7"], /* CJK Ideograph */
+ ["\u80B8", "\u80B8"], /* CJK Ideograph */
+ ["\u80B9", "\u80B9"], /* CJK Ideograph */
+ ["\u80BA", "\u80BA"], /* CJK Ideograph */
+ ["\u80BB", "\u80BB"], /* CJK Ideograph */
+ ["\u80BC", "\u80BC"], /* CJK Ideograph */
+ ["\u80BD", "\u80BD"], /* CJK Ideograph */
+ ["\u80BE", "\u80BE"], /* CJK Ideograph */
+ ["\u80BF", "\u80BF"], /* CJK Ideograph */
+ ["\u80C0", "\u80C0"], /* CJK Ideograph */
+ ["\u80C1", "\u80C1"], /* CJK Ideograph */
+ ["\u80C2", "\u80C2"], /* CJK Ideograph */
+ ["\u80C3", "\u80C3"], /* CJK Ideograph */
+ ["\u80C4", "\u80C4"], /* CJK Ideograph */
+ ["\u80C5", "\u80C5"], /* CJK Ideograph */
+ ["\u80C6", "\u80C6"], /* CJK Ideograph */
+ ["\u80C7", "\u80C7"], /* CJK Ideograph */
+ ["\u80C8", "\u80C8"], /* CJK Ideograph */
+ ["\u80C9", "\u80C9"], /* CJK Ideograph */
+ ["\u80CA", "\u80CA"], /* CJK Ideograph */
+ ["\u80CB", "\u80CB"], /* CJK Ideograph */
+ ["\u80CC", "\u80CC"], /* CJK Ideograph */
+ ["\u80CD", "\u80CD"], /* CJK Ideograph */
+ ["\u80CE", "\u80CE"], /* CJK Ideograph */
+ ["\u80CF", "\u80CF"], /* CJK Ideograph */
+ ["\u80D0", "\u80D0"], /* CJK Ideograph */
+ ["\u80D1", "\u80D1"], /* CJK Ideograph */
+ ["\u80D2", "\u80D2"], /* CJK Ideograph */
+ ["\u80D3", "\u80D3"], /* CJK Ideograph */
+ ["\u80D4", "\u80D4"], /* CJK Ideograph */
+ ["\u80D5", "\u80D5"], /* CJK Ideograph */
+ ["\u80D6", "\u80D6"], /* CJK Ideograph */
+ ["\u80D7", "\u80D7"], /* CJK Ideograph */
+ ["\u80D8", "\u80D8"], /* CJK Ideograph */
+ ["\u80D9", "\u80D9"], /* CJK Ideograph */
+ ["\u80DA", "\u80DA"], /* CJK Ideograph */
+ ["\u80DB", "\u80DB"], /* CJK Ideograph */
+ ["\u80DC", "\u80DC"], /* CJK Ideograph */
+ ["\u80DD", "\u80DD"], /* CJK Ideograph */
+ ["\u80DE", "\u80DE"], /* CJK Ideograph */
+ ["\u80DF", "\u80DF"], /* CJK Ideograph */
+ ["\u80E0", "\u80E0"], /* CJK Ideograph */
+ ["\u80E1", "\u80E1"], /* CJK Ideograph */
+ ["\u80E2", "\u80E2"], /* CJK Ideograph */
+ ["\u80E3", "\u80E3"], /* CJK Ideograph */
+ ["\u80E4", "\u80E4"], /* CJK Ideograph */
+ ["\u80E5", "\u80E5"], /* CJK Ideograph */
+ ["\u80E6", "\u80E6"], /* CJK Ideograph */
+ ["\u80E7", "\u80E7"], /* CJK Ideograph */
+ ["\u80E8", "\u80E8"], /* CJK Ideograph */
+ ["\u80E9", "\u80E9"], /* CJK Ideograph */
+ ["\u80EA", "\u80EA"], /* CJK Ideograph */
+ ["\u80EB", "\u80EB"], /* CJK Ideograph */
+ ["\u80EC", "\u80EC"], /* CJK Ideograph */
+ ["\u80ED", "\u80ED"], /* CJK Ideograph */
+ ["\u80EE", "\u80EE"], /* CJK Ideograph */
+ ["\u80EF", "\u80EF"], /* CJK Ideograph */
+ ["\u80F0", "\u80F0"], /* CJK Ideograph */
+ ["\u80F1", "\u80F1"], /* CJK Ideograph */
+ ["\u80F2", "\u80F2"], /* CJK Ideograph */
+ ["\u80F3", "\u80F3"], /* CJK Ideograph */
+ ["\u80F4", "\u80F4"], /* CJK Ideograph */
+ ["\u80F5", "\u80F5"], /* CJK Ideograph */
+ ["\u80F6", "\u80F6"], /* CJK Ideograph */
+ ["\u80F7", "\u80F7"], /* CJK Ideograph */
+ ["\u80F8", "\u80F8"], /* CJK Ideograph */
+ ["\u80F9", "\u80F9"], /* CJK Ideograph */
+ ["\u80FA", "\u80FA"], /* CJK Ideograph */
+ ["\u80FB", "\u80FB"], /* CJK Ideograph */
+ ["\u80FC", "\u80FC"], /* CJK Ideograph */
+ ["\u80FD", "\u80FD"], /* CJK Ideograph */
+ ["\u80FE", "\u80FE"], /* CJK Ideograph */
+ ["\u80FF", "\u80FF"], /* CJK Ideograph */
+ ["\u8100", "\u8100"], /* CJK Ideograph */
+ ["\u8101", "\u8101"], /* CJK Ideograph */
+ ["\u8102", "\u8102"], /* CJK Ideograph */
+ ["\u8103", "\u8103"], /* CJK Ideograph */
+ ["\u8104", "\u8104"], /* CJK Ideograph */
+ ["\u8105", "\u8105"], /* CJK Ideograph */
+ ["\u8106", "\u8106"], /* CJK Ideograph */
+ ["\u8107", "\u8107"], /* CJK Ideograph */
+ ["\u8108", "\u8108"], /* CJK Ideograph */
+ ["\u8109", "\u8109"], /* CJK Ideograph */
+ ["\u810A", "\u810A"], /* CJK Ideograph */
+ ["\u810B", "\u810B"], /* CJK Ideograph */
+ ["\u810C", "\u810C"], /* CJK Ideograph */
+ ["\u810D", "\u810D"], /* CJK Ideograph */
+ ["\u810E", "\u810E"], /* CJK Ideograph */
+ ["\u810F", "\u810F"], /* CJK Ideograph */
+ ["\u8110", "\u8110"], /* CJK Ideograph */
+ ["\u8111", "\u8111"], /* CJK Ideograph */
+ ["\u8112", "\u8112"], /* CJK Ideograph */
+ ["\u8113", "\u8113"], /* CJK Ideograph */
+ ["\u8114", "\u8114"], /* CJK Ideograph */
+ ["\u8115", "\u8115"], /* CJK Ideograph */
+ ["\u8116", "\u8116"], /* CJK Ideograph */
+ ["\u8117", "\u8117"], /* CJK Ideograph */
+ ["\u8118", "\u8118"], /* CJK Ideograph */
+ ["\u8119", "\u8119"], /* CJK Ideograph */
+ ["\u811A", "\u811A"], /* CJK Ideograph */
+ ["\u811B", "\u811B"], /* CJK Ideograph */
+ ["\u811C", "\u811C"], /* CJK Ideograph */
+ ["\u811D", "\u811D"], /* CJK Ideograph */
+ ["\u811E", "\u811E"], /* CJK Ideograph */
+ ["\u811F", "\u811F"], /* CJK Ideograph */
+ ["\u8120", "\u8120"], /* CJK Ideograph */
+ ["\u8121", "\u8121"], /* CJK Ideograph */
+ ["\u8122", "\u8122"], /* CJK Ideograph */
+ ["\u8123", "\u8123"], /* CJK Ideograph */
+ ["\u8124", "\u8124"], /* CJK Ideograph */
+ ["\u8125", "\u8125"], /* CJK Ideograph */
+ ["\u8126", "\u8126"], /* CJK Ideograph */
+ ["\u8127", "\u8127"], /* CJK Ideograph */
+ ["\u8128", "\u8128"], /* CJK Ideograph */
+ ["\u8129", "\u8129"], /* CJK Ideograph */
+ ["\u812A", "\u812A"], /* CJK Ideograph */
+ ["\u812B", "\u812B"], /* CJK Ideograph */
+ ["\u812C", "\u812C"], /* CJK Ideograph */
+ ["\u812D", "\u812D"], /* CJK Ideograph */
+ ["\u812E", "\u812E"], /* CJK Ideograph */
+ ["\u812F", "\u812F"], /* CJK Ideograph */
+ ["\u8130", "\u8130"], /* CJK Ideograph */
+ ["\u8131", "\u8131"], /* CJK Ideograph */
+ ["\u8132", "\u8132"], /* CJK Ideograph */
+ ["\u8133", "\u8133"], /* CJK Ideograph */
+ ["\u8134", "\u8134"], /* CJK Ideograph */
+ ["\u8135", "\u8135"], /* CJK Ideograph */
+ ["\u8136", "\u8136"], /* CJK Ideograph */
+ ["\u8137", "\u8137"], /* CJK Ideograph */
+ ["\u8138", "\u8138"], /* CJK Ideograph */
+ ["\u8139", "\u8139"], /* CJK Ideograph */
+ ["\u813A", "\u813A"], /* CJK Ideograph */
+ ["\u813B", "\u813B"], /* CJK Ideograph */
+ ["\u813C", "\u813C"], /* CJK Ideograph */
+ ["\u813D", "\u813D"], /* CJK Ideograph */
+ ["\u813E", "\u813E"], /* CJK Ideograph */
+ ["\u813F", "\u813F"], /* CJK Ideograph */
+ ["\u8140", "\u8140"], /* CJK Ideograph */
+ ["\u8141", "\u8141"], /* CJK Ideograph */
+ ["\u8142", "\u8142"], /* CJK Ideograph */
+ ["\u8143", "\u8143"], /* CJK Ideograph */
+ ["\u8144", "\u8144"], /* CJK Ideograph */
+ ["\u8145", "\u8145"], /* CJK Ideograph */
+ ["\u8146", "\u8146"], /* CJK Ideograph */
+ ["\u8147", "\u8147"], /* CJK Ideograph */
+ ["\u8148", "\u8148"], /* CJK Ideograph */
+ ["\u8149", "\u8149"], /* CJK Ideograph */
+ ["\u814A", "\u814A"], /* CJK Ideograph */
+ ["\u814B", "\u814B"], /* CJK Ideograph */
+ ["\u814C", "\u814C"], /* CJK Ideograph */
+ ["\u814D", "\u814D"], /* CJK Ideograph */
+ ["\u814E", "\u814E"], /* CJK Ideograph */
+ ["\u814F", "\u814F"], /* CJK Ideograph */
+ ["\u8150", "\u8150"], /* CJK Ideograph */
+ ["\u8151", "\u8151"], /* CJK Ideograph */
+ ["\u8152", "\u8152"], /* CJK Ideograph */
+ ["\u8153", "\u8153"], /* CJK Ideograph */
+ ["\u8154", "\u8154"], /* CJK Ideograph */
+ ["\u8155", "\u8155"], /* CJK Ideograph */
+ ["\u8156", "\u8156"], /* CJK Ideograph */
+ ["\u8157", "\u8157"], /* CJK Ideograph */
+ ["\u8158", "\u8158"], /* CJK Ideograph */
+ ["\u8159", "\u8159"], /* CJK Ideograph */
+ ["\u815A", "\u815A"], /* CJK Ideograph */
+ ["\u815B", "\u815B"], /* CJK Ideograph */
+ ["\u815C", "\u815C"], /* CJK Ideograph */
+ ["\u815D", "\u815D"], /* CJK Ideograph */
+ ["\u815E", "\u815E"], /* CJK Ideograph */
+ ["\u815F", "\u815F"], /* CJK Ideograph */
+ ["\u8160", "\u8160"], /* CJK Ideograph */
+ ["\u8161", "\u8161"], /* CJK Ideograph */
+ ["\u8162", "\u8162"], /* CJK Ideograph */
+ ["\u8163", "\u8163"], /* CJK Ideograph */
+ ["\u8164", "\u8164"], /* CJK Ideograph */
+ ["\u8165", "\u8165"], /* CJK Ideograph */
+ ["\u8166", "\u8166"], /* CJK Ideograph */
+ ["\u8167", "\u8167"], /* CJK Ideograph */
+ ["\u8168", "\u8168"], /* CJK Ideograph */
+ ["\u8169", "\u8169"], /* CJK Ideograph */
+ ["\u816A", "\u816A"], /* CJK Ideograph */
+ ["\u816B", "\u816B"], /* CJK Ideograph */
+ ["\u816C", "\u816C"], /* CJK Ideograph */
+ ["\u816D", "\u816D"], /* CJK Ideograph */
+ ["\u816E", "\u816E"], /* CJK Ideograph */
+ ["\u816F", "\u816F"], /* CJK Ideograph */
+ ["\u8170", "\u8170"], /* CJK Ideograph */
+ ["\u8171", "\u8171"], /* CJK Ideograph */
+ ["\u8172", "\u8172"], /* CJK Ideograph */
+ ["\u8173", "\u8173"], /* CJK Ideograph */
+ ["\u8174", "\u8174"], /* CJK Ideograph */
+ ["\u8175", "\u8175"], /* CJK Ideograph */
+ ["\u8176", "\u8176"], /* CJK Ideograph */
+ ["\u8177", "\u8177"], /* CJK Ideograph */
+ ["\u8178", "\u8178"], /* CJK Ideograph */
+ ["\u8179", "\u8179"], /* CJK Ideograph */
+ ["\u817A", "\u817A"], /* CJK Ideograph */
+ ["\u817B", "\u817B"], /* CJK Ideograph */
+ ["\u817C", "\u817C"], /* CJK Ideograph */
+ ["\u817D", "\u817D"], /* CJK Ideograph */
+ ["\u817E", "\u817E"], /* CJK Ideograph */
+ ["\u817F", "\u817F"], /* CJK Ideograph */
+ ["\u8180", "\u8180"], /* CJK Ideograph */
+ ["\u8181", "\u8181"], /* CJK Ideograph */
+ ["\u8182", "\u8182"], /* CJK Ideograph */
+ ["\u8183", "\u8183"], /* CJK Ideograph */
+ ["\u8184", "\u8184"], /* CJK Ideograph */
+ ["\u8185", "\u8185"], /* CJK Ideograph */
+ ["\u8186", "\u8186"], /* CJK Ideograph */
+ ["\u8187", "\u8187"], /* CJK Ideograph */
+ ["\u8188", "\u8188"], /* CJK Ideograph */
+ ["\u8189", "\u8189"], /* CJK Ideograph */
+ ["\u818A", "\u818A"], /* CJK Ideograph */
+ ["\u818B", "\u818B"], /* CJK Ideograph */
+ ["\u818C", "\u818C"], /* CJK Ideograph */
+ ["\u818D", "\u818D"], /* CJK Ideograph */
+ ["\u818E", "\u818E"], /* CJK Ideograph */
+ ["\u818F", "\u818F"], /* CJK Ideograph */
+ ["\u8190", "\u8190"], /* CJK Ideograph */
+ ["\u8191", "\u8191"], /* CJK Ideograph */
+ ["\u8192", "\u8192"], /* CJK Ideograph */
+ ["\u8193", "\u8193"], /* CJK Ideograph */
+ ["\u8194", "\u8194"], /* CJK Ideograph */
+ ["\u8195", "\u8195"], /* CJK Ideograph */
+ ["\u8196", "\u8196"], /* CJK Ideograph */
+ ["\u8197", "\u8197"], /* CJK Ideograph */
+ ["\u8198", "\u8198"], /* CJK Ideograph */
+ ["\u8199", "\u8199"], /* CJK Ideograph */
+ ["\u819A", "\u819A"], /* CJK Ideograph */
+ ["\u819B", "\u819B"], /* CJK Ideograph */
+ ["\u819C", "\u819C"], /* CJK Ideograph */
+ ["\u819D", "\u819D"], /* CJK Ideograph */
+ ["\u819E", "\u819E"], /* CJK Ideograph */
+ ["\u819F", "\u819F"], /* CJK Ideograph */
+ ["\u81A0", "\u81A0"], /* CJK Ideograph */
+ ["\u81A1", "\u81A1"], /* CJK Ideograph */
+ ["\u81A2", "\u81A2"], /* CJK Ideograph */
+ ["\u81A3", "\u81A3"], /* CJK Ideograph */
+ ["\u81A4", "\u81A4"], /* CJK Ideograph */
+ ["\u81A5", "\u81A5"], /* CJK Ideograph */
+ ["\u81A6", "\u81A6"], /* CJK Ideograph */
+ ["\u81A7", "\u81A7"], /* CJK Ideograph */
+ ["\u81A8", "\u81A8"], /* CJK Ideograph */
+ ["\u81A9", "\u81A9"], /* CJK Ideograph */
+ ["\u81AA", "\u81AA"], /* CJK Ideograph */
+ ["\u81AB", "\u81AB"], /* CJK Ideograph */
+ ["\u81AC", "\u81AC"], /* CJK Ideograph */
+ ["\u81AD", "\u81AD"], /* CJK Ideograph */
+ ["\u81AE", "\u81AE"], /* CJK Ideograph */
+ ["\u81AF", "\u81AF"], /* CJK Ideograph */
+ ["\u81B0", "\u81B0"], /* CJK Ideograph */
+ ["\u81B1", "\u81B1"], /* CJK Ideograph */
+ ["\u81B2", "\u81B2"], /* CJK Ideograph */
+ ["\u81B3", "\u81B3"], /* CJK Ideograph */
+ ["\u81B4", "\u81B4"], /* CJK Ideograph */
+ ["\u81B5", "\u81B5"], /* CJK Ideograph */
+ ["\u81B6", "\u81B6"], /* CJK Ideograph */
+ ["\u81B7", "\u81B7"], /* CJK Ideograph */
+ ["\u81B8", "\u81B8"], /* CJK Ideograph */
+ ["\u81B9", "\u81B9"], /* CJK Ideograph */
+ ["\u81BA", "\u81BA"], /* CJK Ideograph */
+ ["\u81BB", "\u81BB"], /* CJK Ideograph */
+ ["\u81BC", "\u81BC"], /* CJK Ideograph */
+ ["\u81BD", "\u81BD"], /* CJK Ideograph */
+ ["\u81BE", "\u81BE"], /* CJK Ideograph */
+ ["\u81BF", "\u81BF"], /* CJK Ideograph */
+ ["\u81C0", "\u81C0"], /* CJK Ideograph */
+ ["\u81C1", "\u81C1"], /* CJK Ideograph */
+ ["\u81C2", "\u81C2"], /* CJK Ideograph */
+ ["\u81C3", "\u81C3"], /* CJK Ideograph */
+ ["\u81C4", "\u81C4"], /* CJK Ideograph */
+ ["\u81C5", "\u81C5"], /* CJK Ideograph */
+ ["\u81C6", "\u81C6"], /* CJK Ideograph */
+ ["\u81C7", "\u81C7"], /* CJK Ideograph */
+ ["\u81C8", "\u81C8"], /* CJK Ideograph */
+ ["\u81C9", "\u81C9"], /* CJK Ideograph */
+ ["\u81CA", "\u81CA"], /* CJK Ideograph */
+ ["\u81CB", "\u81CB"], /* CJK Ideograph */
+ ["\u81CC", "\u81CC"], /* CJK Ideograph */
+ ["\u81CD", "\u81CD"], /* CJK Ideograph */
+ ["\u81CE", "\u81CE"], /* CJK Ideograph */
+ ["\u81CF", "\u81CF"], /* CJK Ideograph */
+ ["\u81D0", "\u81D0"], /* CJK Ideograph */
+ ["\u81D1", "\u81D1"], /* CJK Ideograph */
+ ["\u81D2", "\u81D2"], /* CJK Ideograph */
+ ["\u81D3", "\u81D3"], /* CJK Ideograph */
+ ["\u81D4", "\u81D4"], /* CJK Ideograph */
+ ["\u81D5", "\u81D5"], /* CJK Ideograph */
+ ["\u81D6", "\u81D6"], /* CJK Ideograph */
+ ["\u81D7", "\u81D7"], /* CJK Ideograph */
+ ["\u81D8", "\u81D8"], /* CJK Ideograph */
+ ["\u81D9", "\u81D9"], /* CJK Ideograph */
+ ["\u81DA", "\u81DA"], /* CJK Ideograph */
+ ["\u81DB", "\u81DB"], /* CJK Ideograph */
+ ["\u81DC", "\u81DC"], /* CJK Ideograph */
+ ["\u81DD", "\u81DD"], /* CJK Ideograph */
+ ["\u81DE", "\u81DE"], /* CJK Ideograph */
+ ["\u81DF", "\u81DF"], /* CJK Ideograph */
+ ["\u81E0", "\u81E0"], /* CJK Ideograph */
+ ["\u81E1", "\u81E1"], /* CJK Ideograph */
+ ["\u81E2", "\u81E2"], /* CJK Ideograph */
+ ["\u81E3", "\u81E3"], /* CJK Ideograph */
+ ["\u81E4", "\u81E4"], /* CJK Ideograph */
+ ["\u81E5", "\u81E5"], /* CJK Ideograph */
+ ["\u81E6", "\u81E6"], /* CJK Ideograph */
+ ["\u81E7", "\u81E7"], /* CJK Ideograph */
+ ["\u81E8", "\u81E8"], /* CJK Ideograph */
+ ["\u81E9", "\u81E9"], /* CJK Ideograph */
+ ["\u81EA", "\u81EA"], /* CJK Ideograph */
+ ["\u81EB", "\u81EB"], /* CJK Ideograph */
+ ["\u81EC", "\u81EC"], /* CJK Ideograph */
+ ["\u81ED", "\u81ED"], /* CJK Ideograph */
+ ["\u81EE", "\u81EE"], /* CJK Ideograph */
+ ["\u81EF", "\u81EF"], /* CJK Ideograph */
+ ["\u81F0", "\u81F0"], /* CJK Ideograph */
+ ["\u81F1", "\u81F1"], /* CJK Ideograph */
+ ["\u81F2", "\u81F2"], /* CJK Ideograph */
+ ["\u81F3", "\u81F3"], /* CJK Ideograph */
+ ["\u81F4", "\u81F4"], /* CJK Ideograph */
+ ["\u81F5", "\u81F5"], /* CJK Ideograph */
+ ["\u81F6", "\u81F6"], /* CJK Ideograph */
+ ["\u81F7", "\u81F7"], /* CJK Ideograph */
+ ["\u81F8", "\u81F8"], /* CJK Ideograph */
+ ["\u81F9", "\u81F9"], /* CJK Ideograph */
+ ["\u81FA", "\u81FA"], /* CJK Ideograph */
+ ["\u81FB", "\u81FB"], /* CJK Ideograph */
+ ["\u81FC", "\u81FC"], /* CJK Ideograph */
+ ["\u81FD", "\u81FD"], /* CJK Ideograph */
+ ["\u81FE", "\u81FE"], /* CJK Ideograph */
+ ["\u81FF", "\u81FF"], /* CJK Ideograph */
+ ["\u8200", "\u8200"], /* CJK Ideograph */
+ ["\u8201", "\u8201"], /* CJK Ideograph */
+ ["\u8202", "\u8202"], /* CJK Ideograph */
+ ["\u8203", "\u8203"], /* CJK Ideograph */
+ ["\u8204", "\u8204"], /* CJK Ideograph */
+ ["\u8205", "\u8205"], /* CJK Ideograph */
+ ["\u8206", "\u8206"], /* CJK Ideograph */
+ ["\u8207", "\u8207"], /* CJK Ideograph */
+ ["\u8208", "\u8208"], /* CJK Ideograph */
+ ["\u8209", "\u8209"], /* CJK Ideograph */
+ ["\u820A", "\u820A"], /* CJK Ideograph */
+ ["\u820B", "\u820B"], /* CJK Ideograph */
+ ["\u820C", "\u820C"], /* CJK Ideograph */
+ ["\u820D", "\u820D"], /* CJK Ideograph */
+ ["\u820E", "\u820E"], /* CJK Ideograph */
+ ["\u820F", "\u820F"], /* CJK Ideograph */
+ ["\u8210", "\u8210"], /* CJK Ideograph */
+ ["\u8211", "\u8211"], /* CJK Ideograph */
+ ["\u8212", "\u8212"], /* CJK Ideograph */
+ ["\u8213", "\u8213"], /* CJK Ideograph */
+ ["\u8214", "\u8214"], /* CJK Ideograph */
+ ["\u8215", "\u8215"], /* CJK Ideograph */
+ ["\u8216", "\u8216"], /* CJK Ideograph */
+ ["\u8217", "\u8217"], /* CJK Ideograph */
+ ["\u8218", "\u8218"], /* CJK Ideograph */
+ ["\u8219", "\u8219"], /* CJK Ideograph */
+ ["\u821A", "\u821A"], /* CJK Ideograph */
+ ["\u821B", "\u821B"], /* CJK Ideograph */
+ ["\u821C", "\u821C"], /* CJK Ideograph */
+ ["\u821D", "\u821D"], /* CJK Ideograph */
+ ["\u821E", "\u821E"], /* CJK Ideograph */
+ ["\u821F", "\u821F"], /* CJK Ideograph */
+ ["\u8220", "\u8220"], /* CJK Ideograph */
+ ["\u8221", "\u8221"], /* CJK Ideograph */
+ ["\u8222", "\u8222"], /* CJK Ideograph */
+ ["\u8223", "\u8223"], /* CJK Ideograph */
+ ["\u8224", "\u8224"], /* CJK Ideograph */
+ ["\u8225", "\u8225"], /* CJK Ideograph */
+ ["\u8226", "\u8226"], /* CJK Ideograph */
+ ["\u8227", "\u8227"], /* CJK Ideograph */
+ ["\u8228", "\u8228"], /* CJK Ideograph */
+ ["\u8229", "\u8229"], /* CJK Ideograph */
+ ["\u822A", "\u822A"], /* CJK Ideograph */
+ ["\u822B", "\u822B"], /* CJK Ideograph */
+ ["\u822C", "\u822C"], /* CJK Ideograph */
+ ["\u822D", "\u822D"], /* CJK Ideograph */
+ ["\u822E", "\u822E"], /* CJK Ideograph */
+ ["\u822F", "\u822F"], /* CJK Ideograph */
+ ["\u8230", "\u8230"], /* CJK Ideograph */
+ ["\u8231", "\u8231"], /* CJK Ideograph */
+ ["\u8232", "\u8232"], /* CJK Ideograph */
+ ["\u8233", "\u8233"], /* CJK Ideograph */
+ ["\u8234", "\u8234"], /* CJK Ideograph */
+ ["\u8235", "\u8235"], /* CJK Ideograph */
+ ["\u8236", "\u8236"], /* CJK Ideograph */
+ ["\u8237", "\u8237"], /* CJK Ideograph */
+ ["\u8238", "\u8238"], /* CJK Ideograph */
+ ["\u8239", "\u8239"], /* CJK Ideograph */
+ ["\u823A", "\u823A"], /* CJK Ideograph */
+ ["\u823B", "\u823B"], /* CJK Ideograph */
+ ["\u823C", "\u823C"], /* CJK Ideograph */
+ ["\u823D", "\u823D"], /* CJK Ideograph */
+ ["\u823E", "\u823E"], /* CJK Ideograph */
+ ["\u823F", "\u823F"], /* CJK Ideograph */
+ ["\u8240", "\u8240"], /* CJK Ideograph */
+ ["\u8241", "\u8241"], /* CJK Ideograph */
+ ["\u8242", "\u8242"], /* CJK Ideograph */
+ ["\u8243", "\u8243"], /* CJK Ideograph */
+ ["\u8244", "\u8244"], /* CJK Ideograph */
+ ["\u8245", "\u8245"], /* CJK Ideograph */
+ ["\u8246", "\u8246"], /* CJK Ideograph */
+ ["\u8247", "\u8247"], /* CJK Ideograph */
+ ["\u8248", "\u8248"], /* CJK Ideograph */
+ ["\u8249", "\u8249"], /* CJK Ideograph */
+ ["\u824A", "\u824A"], /* CJK Ideograph */
+ ["\u824B", "\u824B"], /* CJK Ideograph */
+ ["\u824C", "\u824C"], /* CJK Ideograph */
+ ["\u824D", "\u824D"], /* CJK Ideograph */
+ ["\u824E", "\u824E"], /* CJK Ideograph */
+ ["\u824F", "\u824F"], /* CJK Ideograph */
+ ["\u8250", "\u8250"], /* CJK Ideograph */
+ ["\u8251", "\u8251"], /* CJK Ideograph */
+ ["\u8252", "\u8252"], /* CJK Ideograph */
+ ["\u8253", "\u8253"], /* CJK Ideograph */
+ ["\u8254", "\u8254"], /* CJK Ideograph */
+ ["\u8255", "\u8255"], /* CJK Ideograph */
+ ["\u8256", "\u8256"], /* CJK Ideograph */
+ ["\u8257", "\u8257"], /* CJK Ideograph */
+ ["\u8258", "\u8258"], /* CJK Ideograph */
+ ["\u8259", "\u8259"], /* CJK Ideograph */
+ ["\u825A", "\u825A"], /* CJK Ideograph */
+ ["\u825B", "\u825B"], /* CJK Ideograph */
+ ["\u825C", "\u825C"], /* CJK Ideograph */
+ ["\u825D", "\u825D"], /* CJK Ideograph */
+ ["\u825E", "\u825E"], /* CJK Ideograph */
+ ["\u825F", "\u825F"], /* CJK Ideograph */
+ ["\u8260", "\u8260"], /* CJK Ideograph */
+ ["\u8261", "\u8261"], /* CJK Ideograph */
+ ["\u8262", "\u8262"], /* CJK Ideograph */
+ ["\u8263", "\u8263"], /* CJK Ideograph */
+ ["\u8264", "\u8264"], /* CJK Ideograph */
+ ["\u8265", "\u8265"], /* CJK Ideograph */
+ ["\u8266", "\u8266"], /* CJK Ideograph */
+ ["\u8267", "\u8267"], /* CJK Ideograph */
+ ["\u8268", "\u8268"], /* CJK Ideograph */
+ ["\u8269", "\u8269"], /* CJK Ideograph */
+ ["\u826A", "\u826A"], /* CJK Ideograph */
+ ["\u826B", "\u826B"], /* CJK Ideograph */
+ ["\u826C", "\u826C"], /* CJK Ideograph */
+ ["\u826D", "\u826D"], /* CJK Ideograph */
+ ["\u826E", "\u826E"], /* CJK Ideograph */
+ ["\u826F", "\u826F"], /* CJK Ideograph */
+ ["\u8270", "\u8270"], /* CJK Ideograph */
+ ["\u8271", "\u8271"], /* CJK Ideograph */
+ ["\u8272", "\u8272"], /* CJK Ideograph */
+ ["\u8273", "\u8273"], /* CJK Ideograph */
+ ["\u8274", "\u8274"], /* CJK Ideograph */
+ ["\u8275", "\u8275"], /* CJK Ideograph */
+ ["\u8276", "\u8276"], /* CJK Ideograph */
+ ["\u8277", "\u8277"], /* CJK Ideograph */
+ ["\u8278", "\u8278"], /* CJK Ideograph */
+ ["\u8279", "\u8279"], /* CJK Ideograph */
+ ["\u827A", "\u827A"], /* CJK Ideograph */
+ ["\u827B", "\u827B"], /* CJK Ideograph */
+ ["\u827C", "\u827C"], /* CJK Ideograph */
+ ["\u827D", "\u827D"], /* CJK Ideograph */
+ ["\u827E", "\u827E"], /* CJK Ideograph */
+ ["\u827F", "\u827F"], /* CJK Ideograph */
+ ["\u8280", "\u8280"], /* CJK Ideograph */
+ ["\u8281", "\u8281"], /* CJK Ideograph */
+ ["\u8282", "\u8282"], /* CJK Ideograph */
+ ["\u8283", "\u8283"], /* CJK Ideograph */
+ ["\u8284", "\u8284"], /* CJK Ideograph */
+ ["\u8285", "\u8285"], /* CJK Ideograph */
+ ["\u8286", "\u8286"], /* CJK Ideograph */
+ ["\u8287", "\u8287"], /* CJK Ideograph */
+ ["\u8288", "\u8288"], /* CJK Ideograph */
+ ["\u8289", "\u8289"], /* CJK Ideograph */
+ ["\u828A", "\u828A"], /* CJK Ideograph */
+ ["\u828B", "\u828B"], /* CJK Ideograph */
+ ["\u828C", "\u828C"], /* CJK Ideograph */
+ ["\u828D", "\u828D"], /* CJK Ideograph */
+ ["\u828E", "\u828E"], /* CJK Ideograph */
+ ["\u828F", "\u828F"], /* CJK Ideograph */
+ ["\u8290", "\u8290"], /* CJK Ideograph */
+ ["\u8291", "\u8291"], /* CJK Ideograph */
+ ["\u8292", "\u8292"], /* CJK Ideograph */
+ ["\u8293", "\u8293"], /* CJK Ideograph */
+ ["\u8294", "\u8294"], /* CJK Ideograph */
+ ["\u8295", "\u8295"], /* CJK Ideograph */
+ ["\u8296", "\u8296"], /* CJK Ideograph */
+ ["\u8297", "\u8297"], /* CJK Ideograph */
+ ["\u8298", "\u8298"], /* CJK Ideograph */
+ ["\u8299", "\u8299"], /* CJK Ideograph */
+ ["\u829A", "\u829A"], /* CJK Ideograph */
+ ["\u829B", "\u829B"], /* CJK Ideograph */
+ ["\u829C", "\u829C"], /* CJK Ideograph */
+ ["\u829D", "\u829D"], /* CJK Ideograph */
+ ["\u829E", "\u829E"], /* CJK Ideograph */
+ ["\u829F", "\u829F"], /* CJK Ideograph */
+ ["\u82A0", "\u82A0"], /* CJK Ideograph */
+ ["\u82A1", "\u82A1"], /* CJK Ideograph */
+ ["\u82A2", "\u82A2"], /* CJK Ideograph */
+ ["\u82A3", "\u82A3"], /* CJK Ideograph */
+ ["\u82A4", "\u82A4"], /* CJK Ideograph */
+ ["\u82A5", "\u82A5"], /* CJK Ideograph */
+ ["\u82A6", "\u82A6"], /* CJK Ideograph */
+ ["\u82A7", "\u82A7"], /* CJK Ideograph */
+ ["\u82A8", "\u82A8"], /* CJK Ideograph */
+ ["\u82A9", "\u82A9"], /* CJK Ideograph */
+ ["\u82AA", "\u82AA"], /* CJK Ideograph */
+ ["\u82AB", "\u82AB"], /* CJK Ideograph */
+ ["\u82AC", "\u82AC"], /* CJK Ideograph */
+ ["\u82AD", "\u82AD"], /* CJK Ideograph */
+ ["\u82AE", "\u82AE"], /* CJK Ideograph */
+ ["\u82AF", "\u82AF"], /* CJK Ideograph */
+ ["\u82B0", "\u82B0"], /* CJK Ideograph */
+ ["\u82B1", "\u82B1"], /* CJK Ideograph */
+ ["\u82B2", "\u82B2"], /* CJK Ideograph */
+ ["\u82B3", "\u82B3"], /* CJK Ideograph */
+ ["\u82B4", "\u82B4"], /* CJK Ideograph */
+ ["\u82B5", "\u82B5"], /* CJK Ideograph */
+ ["\u82B6", "\u82B6"], /* CJK Ideograph */
+ ["\u82B7", "\u82B7"], /* CJK Ideograph */
+ ["\u82B8", "\u82B8"], /* CJK Ideograph */
+ ["\u82B9", "\u82B9"], /* CJK Ideograph */
+ ["\u82BA", "\u82BA"], /* CJK Ideograph */
+ ["\u82BB", "\u82BB"], /* CJK Ideograph */
+ ["\u82BC", "\u82BC"], /* CJK Ideograph */
+ ["\u82BD", "\u82BD"], /* CJK Ideograph */
+ ["\u82BE", "\u82BE"], /* CJK Ideograph */
+ ["\u82BF", "\u82BF"], /* CJK Ideograph */
+ ["\u82C0", "\u82C0"], /* CJK Ideograph */
+ ["\u82C1", "\u82C1"], /* CJK Ideograph */
+ ["\u82C2", "\u82C2"], /* CJK Ideograph */
+ ["\u82C3", "\u82C3"], /* CJK Ideograph */
+ ["\u82C4", "\u82C4"], /* CJK Ideograph */
+ ["\u82C5", "\u82C5"], /* CJK Ideograph */
+ ["\u82C6", "\u82C6"], /* CJK Ideograph */
+ ["\u82C7", "\u82C7"], /* CJK Ideograph */
+ ["\u82C8", "\u82C8"], /* CJK Ideograph */
+ ["\u82C9", "\u82C9"], /* CJK Ideograph */
+ ["\u82CA", "\u82CA"], /* CJK Ideograph */
+ ["\u82CB", "\u82CB"], /* CJK Ideograph */
+ ["\u82CC", "\u82CC"], /* CJK Ideograph */
+ ["\u82CD", "\u82CD"], /* CJK Ideograph */
+ ["\u82CE", "\u82CE"], /* CJK Ideograph */
+ ["\u82CF", "\u82CF"], /* CJK Ideograph */
+ ["\u82D0", "\u82D0"], /* CJK Ideograph */
+ ["\u82D1", "\u82D1"], /* CJK Ideograph */
+ ["\u82D2", "\u82D2"], /* CJK Ideograph */
+ ["\u82D3", "\u82D3"], /* CJK Ideograph */
+ ["\u82D4", "\u82D4"], /* CJK Ideograph */
+ ["\u82D5", "\u82D5"], /* CJK Ideograph */
+ ["\u82D6", "\u82D6"], /* CJK Ideograph */
+ ["\u82D7", "\u82D7"], /* CJK Ideograph */
+ ["\u82D8", "\u82D8"], /* CJK Ideograph */
+ ["\u82D9", "\u82D9"], /* CJK Ideograph */
+ ["\u82DA", "\u82DA"], /* CJK Ideograph */
+ ["\u82DB", "\u82DB"], /* CJK Ideograph */
+ ["\u82DC", "\u82DC"], /* CJK Ideograph */
+ ["\u82DD", "\u82DD"], /* CJK Ideograph */
+ ["\u82DE", "\u82DE"], /* CJK Ideograph */
+ ["\u82DF", "\u82DF"], /* CJK Ideograph */
+ ["\u82E0", "\u82E0"], /* CJK Ideograph */
+ ["\u82E1", "\u82E1"], /* CJK Ideograph */
+ ["\u82E2", "\u82E2"], /* CJK Ideograph */
+ ["\u82E3", "\u82E3"], /* CJK Ideograph */
+ ["\u82E4", "\u82E4"], /* CJK Ideograph */
+ ["\u82E5", "\u82E5"], /* CJK Ideograph */
+ ["\u82E6", "\u82E6"], /* CJK Ideograph */
+ ["\u82E7", "\u82E7"], /* CJK Ideograph */
+ ["\u82E8", "\u82E8"], /* CJK Ideograph */
+ ["\u82E9", "\u82E9"], /* CJK Ideograph */
+ ["\u82EA", "\u82EA"], /* CJK Ideograph */
+ ["\u82EB", "\u82EB"], /* CJK Ideograph */
+ ["\u82EC", "\u82EC"], /* CJK Ideograph */
+ ["\u82ED", "\u82ED"], /* CJK Ideograph */
+ ["\u82EE", "\u82EE"], /* CJK Ideograph */
+ ["\u82EF", "\u82EF"], /* CJK Ideograph */
+ ["\u82F0", "\u82F0"], /* CJK Ideograph */
+ ["\u82F1", "\u82F1"], /* CJK Ideograph */
+ ["\u82F2", "\u82F2"], /* CJK Ideograph */
+ ["\u82F3", "\u82F3"], /* CJK Ideograph */
+ ["\u82F4", "\u82F4"], /* CJK Ideograph */
+ ["\u82F5", "\u82F5"], /* CJK Ideograph */
+ ["\u82F6", "\u82F6"], /* CJK Ideograph */
+ ["\u82F7", "\u82F7"], /* CJK Ideograph */
+ ["\u82F8", "\u82F8"], /* CJK Ideograph */
+ ["\u82F9", "\u82F9"], /* CJK Ideograph */
+ ["\u82FA", "\u82FA"], /* CJK Ideograph */
+ ["\u82FB", "\u82FB"], /* CJK Ideograph */
+ ["\u82FC", "\u82FC"], /* CJK Ideograph */
+ ["\u82FD", "\u82FD"], /* CJK Ideograph */
+ ["\u82FE", "\u82FE"], /* CJK Ideograph */
+ ["\u82FF", "\u82FF"], /* CJK Ideograph */
+ ["\u8300", "\u8300"], /* CJK Ideograph */
+ ["\u8301", "\u8301"], /* CJK Ideograph */
+ ["\u8302", "\u8302"], /* CJK Ideograph */
+ ["\u8303", "\u8303"], /* CJK Ideograph */
+ ["\u8304", "\u8304"], /* CJK Ideograph */
+ ["\u8305", "\u8305"], /* CJK Ideograph */
+ ["\u8306", "\u8306"], /* CJK Ideograph */
+ ["\u8307", "\u8307"], /* CJK Ideograph */
+ ["\u8308", "\u8308"], /* CJK Ideograph */
+ ["\u8309", "\u8309"], /* CJK Ideograph */
+ ["\u830A", "\u830A"], /* CJK Ideograph */
+ ["\u830B", "\u830B"], /* CJK Ideograph */
+ ["\u830C", "\u830C"], /* CJK Ideograph */
+ ["\u830D", "\u830D"], /* CJK Ideograph */
+ ["\u830E", "\u830E"], /* CJK Ideograph */
+ ["\u830F", "\u830F"], /* CJK Ideograph */
+ ["\u8310", "\u8310"], /* CJK Ideograph */
+ ["\u8311", "\u8311"], /* CJK Ideograph */
+ ["\u8312", "\u8312"], /* CJK Ideograph */
+ ["\u8313", "\u8313"], /* CJK Ideograph */
+ ["\u8314", "\u8314"], /* CJK Ideograph */
+ ["\u8315", "\u8315"], /* CJK Ideograph */
+ ["\u8316", "\u8316"], /* CJK Ideograph */
+ ["\u8317", "\u8317"], /* CJK Ideograph */
+ ["\u8318", "\u8318"], /* CJK Ideograph */
+ ["\u8319", "\u8319"], /* CJK Ideograph */
+ ["\u831A", "\u831A"], /* CJK Ideograph */
+ ["\u831B", "\u831B"], /* CJK Ideograph */
+ ["\u831C", "\u831C"], /* CJK Ideograph */
+ ["\u831D", "\u831D"], /* CJK Ideograph */
+ ["\u831E", "\u831E"], /* CJK Ideograph */
+ ["\u831F", "\u831F"], /* CJK Ideograph */
+ ["\u8320", "\u8320"], /* CJK Ideograph */
+ ["\u8321", "\u8321"], /* CJK Ideograph */
+ ["\u8322", "\u8322"], /* CJK Ideograph */
+ ["\u8323", "\u8323"], /* CJK Ideograph */
+ ["\u8324", "\u8324"], /* CJK Ideograph */
+ ["\u8325", "\u8325"], /* CJK Ideograph */
+ ["\u8326", "\u8326"], /* CJK Ideograph */
+ ["\u8327", "\u8327"], /* CJK Ideograph */
+ ["\u8328", "\u8328"], /* CJK Ideograph */
+ ["\u8329", "\u8329"], /* CJK Ideograph */
+ ["\u832A", "\u832A"], /* CJK Ideograph */
+ ["\u832B", "\u832B"], /* CJK Ideograph */
+ ["\u832C", "\u832C"], /* CJK Ideograph */
+ ["\u832D", "\u832D"], /* CJK Ideograph */
+ ["\u832E", "\u832E"], /* CJK Ideograph */
+ ["\u832F", "\u832F"], /* CJK Ideograph */
+ ["\u8330", "\u8330"], /* CJK Ideograph */
+ ["\u8331", "\u8331"], /* CJK Ideograph */
+ ["\u8332", "\u8332"], /* CJK Ideograph */
+ ["\u8333", "\u8333"], /* CJK Ideograph */
+ ["\u8334", "\u8334"], /* CJK Ideograph */
+ ["\u8335", "\u8335"], /* CJK Ideograph */
+ ["\u8336", "\u8336"], /* CJK Ideograph */
+ ["\u8337", "\u8337"], /* CJK Ideograph */
+ ["\u8338", "\u8338"], /* CJK Ideograph */
+ ["\u8339", "\u8339"], /* CJK Ideograph */
+ ["\u833A", "\u833A"], /* CJK Ideograph */
+ ["\u833B", "\u833B"], /* CJK Ideograph */
+ ["\u833C", "\u833C"], /* CJK Ideograph */
+ ["\u833D", "\u833D"], /* CJK Ideograph */
+ ["\u833E", "\u833E"], /* CJK Ideograph */
+ ["\u833F", "\u833F"], /* CJK Ideograph */
+ ["\u8340", "\u8340"], /* CJK Ideograph */
+ ["\u8341", "\u8341"], /* CJK Ideograph */
+ ["\u8342", "\u8342"], /* CJK Ideograph */
+ ["\u8343", "\u8343"], /* CJK Ideograph */
+ ["\u8344", "\u8344"], /* CJK Ideograph */
+ ["\u8345", "\u8345"], /* CJK Ideograph */
+ ["\u8346", "\u8346"], /* CJK Ideograph */
+ ["\u8347", "\u8347"], /* CJK Ideograph */
+ ["\u8348", "\u8348"], /* CJK Ideograph */
+ ["\u8349", "\u8349"], /* CJK Ideograph */
+ ["\u834A", "\u834A"], /* CJK Ideograph */
+ ["\u834B", "\u834B"], /* CJK Ideograph */
+ ["\u834C", "\u834C"], /* CJK Ideograph */
+ ["\u834D", "\u834D"], /* CJK Ideograph */
+ ["\u834E", "\u834E"], /* CJK Ideograph */
+ ["\u834F", "\u834F"], /* CJK Ideograph */
+ ["\u8350", "\u8350"], /* CJK Ideograph */
+ ["\u8351", "\u8351"], /* CJK Ideograph */
+ ["\u8352", "\u8352"], /* CJK Ideograph */
+ ["\u8353", "\u8353"], /* CJK Ideograph */
+ ["\u8354", "\u8354"], /* CJK Ideograph */
+ ["\u8355", "\u8355"], /* CJK Ideograph */
+ ["\u8356", "\u8356"], /* CJK Ideograph */
+ ["\u8357", "\u8357"], /* CJK Ideograph */
+ ["\u8358", "\u8358"], /* CJK Ideograph */
+ ["\u8359", "\u8359"], /* CJK Ideograph */
+ ["\u835A", "\u835A"], /* CJK Ideograph */
+ ["\u835B", "\u835B"], /* CJK Ideograph */
+ ["\u835C", "\u835C"], /* CJK Ideograph */
+ ["\u835D", "\u835D"], /* CJK Ideograph */
+ ["\u835E", "\u835E"], /* CJK Ideograph */
+ ["\u835F", "\u835F"], /* CJK Ideograph */
+ ["\u8360", "\u8360"], /* CJK Ideograph */
+ ["\u8361", "\u8361"], /* CJK Ideograph */
+ ["\u8362", "\u8362"], /* CJK Ideograph */
+ ["\u8363", "\u8363"], /* CJK Ideograph */
+ ["\u8364", "\u8364"], /* CJK Ideograph */
+ ["\u8365", "\u8365"], /* CJK Ideograph */
+ ["\u8366", "\u8366"], /* CJK Ideograph */
+ ["\u8367", "\u8367"], /* CJK Ideograph */
+ ["\u8368", "\u8368"], /* CJK Ideograph */
+ ["\u8369", "\u8369"], /* CJK Ideograph */
+ ["\u836A", "\u836A"], /* CJK Ideograph */
+ ["\u836B", "\u836B"], /* CJK Ideograph */
+ ["\u836C", "\u836C"], /* CJK Ideograph */
+ ["\u836D", "\u836D"], /* CJK Ideograph */
+ ["\u836E", "\u836E"], /* CJK Ideograph */
+ ["\u836F", "\u836F"], /* CJK Ideograph */
+ ["\u8370", "\u8370"], /* CJK Ideograph */
+ ["\u8371", "\u8371"], /* CJK Ideograph */
+ ["\u8372", "\u8372"], /* CJK Ideograph */
+ ["\u8373", "\u8373"], /* CJK Ideograph */
+ ["\u8374", "\u8374"], /* CJK Ideograph */
+ ["\u8375", "\u8375"], /* CJK Ideograph */
+ ["\u8376", "\u8376"], /* CJK Ideograph */
+ ["\u8377", "\u8377"], /* CJK Ideograph */
+ ["\u8378", "\u8378"], /* CJK Ideograph */
+ ["\u8379", "\u8379"], /* CJK Ideograph */
+ ["\u837A", "\u837A"], /* CJK Ideograph */
+ ["\u837B", "\u837B"], /* CJK Ideograph */
+ ["\u837C", "\u837C"], /* CJK Ideograph */
+ ["\u837D", "\u837D"], /* CJK Ideograph */
+ ["\u837E", "\u837E"], /* CJK Ideograph */
+ ["\u837F", "\u837F"], /* CJK Ideograph */
+ ["\u8380", "\u8380"], /* CJK Ideograph */
+ ["\u8381", "\u8381"], /* CJK Ideograph */
+ ["\u8382", "\u8382"], /* CJK Ideograph */
+ ["\u8383", "\u8383"], /* CJK Ideograph */
+ ["\u8384", "\u8384"], /* CJK Ideograph */
+ ["\u8385", "\u8385"], /* CJK Ideograph */
+ ["\u8386", "\u8386"], /* CJK Ideograph */
+ ["\u8387", "\u8387"], /* CJK Ideograph */
+ ["\u8388", "\u8388"], /* CJK Ideograph */
+ ["\u8389", "\u8389"], /* CJK Ideograph */
+ ["\u838A", "\u838A"], /* CJK Ideograph */
+ ["\u838B", "\u838B"], /* CJK Ideograph */
+ ["\u838C", "\u838C"], /* CJK Ideograph */
+ ["\u838D", "\u838D"], /* CJK Ideograph */
+ ["\u838E", "\u838E"], /* CJK Ideograph */
+ ["\u838F", "\u838F"], /* CJK Ideograph */
+ ["\u8390", "\u8390"], /* CJK Ideograph */
+ ["\u8391", "\u8391"], /* CJK Ideograph */
+ ["\u8392", "\u8392"], /* CJK Ideograph */
+ ["\u8393", "\u8393"], /* CJK Ideograph */
+ ["\u8394", "\u8394"], /* CJK Ideograph */
+ ["\u8395", "\u8395"], /* CJK Ideograph */
+ ["\u8396", "\u8396"], /* CJK Ideograph */
+ ["\u8397", "\u8397"], /* CJK Ideograph */
+ ["\u8398", "\u8398"], /* CJK Ideograph */
+ ["\u8399", "\u8399"], /* CJK Ideograph */
+ ["\u839A", "\u839A"], /* CJK Ideograph */
+ ["\u839B", "\u839B"], /* CJK Ideograph */
+ ["\u839C", "\u839C"], /* CJK Ideograph */
+ ["\u839D", "\u839D"], /* CJK Ideograph */
+ ["\u839E", "\u839E"], /* CJK Ideograph */
+ ["\u839F", "\u839F"], /* CJK Ideograph */
+ ["\u83A0", "\u83A0"], /* CJK Ideograph */
+ ["\u83A1", "\u83A1"], /* CJK Ideograph */
+ ["\u83A2", "\u83A2"], /* CJK Ideograph */
+ ["\u83A3", "\u83A3"], /* CJK Ideograph */
+ ["\u83A4", "\u83A4"], /* CJK Ideograph */
+ ["\u83A5", "\u83A5"], /* CJK Ideograph */
+ ["\u83A6", "\u83A6"], /* CJK Ideograph */
+ ["\u83A7", "\u83A7"], /* CJK Ideograph */
+ ["\u83A8", "\u83A8"], /* CJK Ideograph */
+ ["\u83A9", "\u83A9"], /* CJK Ideograph */
+ ["\u83AA", "\u83AA"], /* CJK Ideograph */
+ ["\u83AB", "\u83AB"], /* CJK Ideograph */
+ ["\u83AC", "\u83AC"], /* CJK Ideograph */
+ ["\u83AD", "\u83AD"], /* CJK Ideograph */
+ ["\u83AE", "\u83AE"], /* CJK Ideograph */
+ ["\u83AF", "\u83AF"], /* CJK Ideograph */
+ ["\u83B0", "\u83B0"], /* CJK Ideograph */
+ ["\u83B1", "\u83B1"], /* CJK Ideograph */
+ ["\u83B2", "\u83B2"], /* CJK Ideograph */
+ ["\u83B3", "\u83B3"], /* CJK Ideograph */
+ ["\u83B4", "\u83B4"], /* CJK Ideograph */
+ ["\u83B5", "\u83B5"], /* CJK Ideograph */
+ ["\u83B6", "\u83B6"], /* CJK Ideograph */
+ ["\u83B7", "\u83B7"], /* CJK Ideograph */
+ ["\u83B8", "\u83B8"], /* CJK Ideograph */
+ ["\u83B9", "\u83B9"], /* CJK Ideograph */
+ ["\u83BA", "\u83BA"], /* CJK Ideograph */
+ ["\u83BB", "\u83BB"], /* CJK Ideograph */
+ ["\u83BC", "\u83BC"], /* CJK Ideograph */
+ ["\u83BD", "\u83BD"], /* CJK Ideograph */
+ ["\u83BE", "\u83BE"], /* CJK Ideograph */
+ ["\u83BF", "\u83BF"], /* CJK Ideograph */
+ ["\u83C0", "\u83C0"], /* CJK Ideograph */
+ ["\u83C1", "\u83C1"], /* CJK Ideograph */
+ ["\u83C2", "\u83C2"], /* CJK Ideograph */
+ ["\u83C3", "\u83C3"], /* CJK Ideograph */
+ ["\u83C4", "\u83C4"], /* CJK Ideograph */
+ ["\u83C5", "\u83C5"], /* CJK Ideograph */
+ ["\u83C6", "\u83C6"], /* CJK Ideograph */
+ ["\u83C7", "\u83C7"], /* CJK Ideograph */
+ ["\u83C8", "\u83C8"], /* CJK Ideograph */
+ ["\u83C9", "\u83C9"], /* CJK Ideograph */
+ ["\u83CA", "\u83CA"], /* CJK Ideograph */
+ ["\u83CB", "\u83CB"], /* CJK Ideograph */
+ ["\u83CC", "\u83CC"], /* CJK Ideograph */
+ ["\u83CD", "\u83CD"], /* CJK Ideograph */
+ ["\u83CE", "\u83CE"], /* CJK Ideograph */
+ ["\u83CF", "\u83CF"], /* CJK Ideograph */
+ ["\u83D0", "\u83D0"], /* CJK Ideograph */
+ ["\u83D1", "\u83D1"], /* CJK Ideograph */
+ ["\u83D2", "\u83D2"], /* CJK Ideograph */
+ ["\u83D3", "\u83D3"], /* CJK Ideograph */
+ ["\u83D4", "\u83D4"], /* CJK Ideograph */
+ ["\u83D5", "\u83D5"], /* CJK Ideograph */
+ ["\u83D6", "\u83D6"], /* CJK Ideograph */
+ ["\u83D7", "\u83D7"], /* CJK Ideograph */
+ ["\u83D8", "\u83D8"], /* CJK Ideograph */
+ ["\u83D9", "\u83D9"], /* CJK Ideograph */
+ ["\u83DA", "\u83DA"], /* CJK Ideograph */
+ ["\u83DB", "\u83DB"], /* CJK Ideograph */
+ ["\u83DC", "\u83DC"], /* CJK Ideograph */
+ ["\u83DD", "\u83DD"], /* CJK Ideograph */
+ ["\u83DE", "\u83DE"], /* CJK Ideograph */
+ ["\u83DF", "\u83DF"], /* CJK Ideograph */
+ ["\u83E0", "\u83E0"], /* CJK Ideograph */
+ ["\u83E1", "\u83E1"], /* CJK Ideograph */
+ ["\u83E2", "\u83E2"], /* CJK Ideograph */
+ ["\u83E3", "\u83E3"], /* CJK Ideograph */
+ ["\u83E4", "\u83E4"], /* CJK Ideograph */
+ ["\u83E5", "\u83E5"], /* CJK Ideograph */
+ ["\u83E6", "\u83E6"], /* CJK Ideograph */
+ ["\u83E7", "\u83E7"], /* CJK Ideograph */
+ ["\u83E8", "\u83E8"], /* CJK Ideograph */
+ ["\u83E9", "\u83E9"], /* CJK Ideograph */
+ ["\u83EA", "\u83EA"], /* CJK Ideograph */
+ ["\u83EB", "\u83EB"], /* CJK Ideograph */
+ ["\u83EC", "\u83EC"], /* CJK Ideograph */
+ ["\u83ED", "\u83ED"], /* CJK Ideograph */
+ ["\u83EE", "\u83EE"], /* CJK Ideograph */
+ ["\u83EF", "\u83EF"], /* CJK Ideograph */
+ ["\u83F0", "\u83F0"], /* CJK Ideograph */
+ ["\u83F1", "\u83F1"], /* CJK Ideograph */
+ ["\u83F2", "\u83F2"], /* CJK Ideograph */
+ ["\u83F3", "\u83F3"], /* CJK Ideograph */
+ ["\u83F4", "\u83F4"], /* CJK Ideograph */
+ ["\u83F5", "\u83F5"], /* CJK Ideograph */
+ ["\u83F6", "\u83F6"], /* CJK Ideograph */
+ ["\u83F7", "\u83F7"], /* CJK Ideograph */
+ ["\u83F8", "\u83F8"], /* CJK Ideograph */
+ ["\u83F9", "\u83F9"], /* CJK Ideograph */
+ ["\u83FA", "\u83FA"], /* CJK Ideograph */
+ ["\u83FB", "\u83FB"], /* CJK Ideograph */
+ ["\u83FC", "\u83FC"], /* CJK Ideograph */
+ ["\u83FD", "\u83FD"], /* CJK Ideograph */
+ ["\u83FE", "\u83FE"], /* CJK Ideograph */
+ ["\u83FF", "\u83FF"], /* CJK Ideograph */
+ ["\u8400", "\u8400"], /* CJK Ideograph */
+ ["\u8401", "\u8401"], /* CJK Ideograph */
+ ["\u8402", "\u8402"], /* CJK Ideograph */
+ ["\u8403", "\u8403"], /* CJK Ideograph */
+ ["\u8404", "\u8404"], /* CJK Ideograph */
+ ["\u8405", "\u8405"], /* CJK Ideograph */
+ ["\u8406", "\u8406"], /* CJK Ideograph */
+ ["\u8407", "\u8407"], /* CJK Ideograph */
+ ["\u8408", "\u8408"], /* CJK Ideograph */
+ ["\u8409", "\u8409"], /* CJK Ideograph */
+ ["\u840A", "\u840A"], /* CJK Ideograph */
+ ["\u840B", "\u840B"], /* CJK Ideograph */
+ ["\u840C", "\u840C"], /* CJK Ideograph */
+ ["\u840D", "\u840D"], /* CJK Ideograph */
+ ["\u840E", "\u840E"], /* CJK Ideograph */
+ ["\u840F", "\u840F"], /* CJK Ideograph */
+ ["\u8410", "\u8410"], /* CJK Ideograph */
+ ["\u8411", "\u8411"], /* CJK Ideograph */
+ ["\u8412", "\u8412"], /* CJK Ideograph */
+ ["\u8413", "\u8413"], /* CJK Ideograph */
+ ["\u8414", "\u8414"], /* CJK Ideograph */
+ ["\u8415", "\u8415"], /* CJK Ideograph */
+ ["\u8416", "\u8416"], /* CJK Ideograph */
+ ["\u8417", "\u8417"], /* CJK Ideograph */
+ ["\u8418", "\u8418"], /* CJK Ideograph */
+ ["\u8419", "\u8419"], /* CJK Ideograph */
+ ["\u841A", "\u841A"], /* CJK Ideograph */
+ ["\u841B", "\u841B"], /* CJK Ideograph */
+ ["\u841C", "\u841C"], /* CJK Ideograph */
+ ["\u841D", "\u841D"], /* CJK Ideograph */
+ ["\u841E", "\u841E"], /* CJK Ideograph */
+ ["\u841F", "\u841F"], /* CJK Ideograph */
+ ["\u8420", "\u8420"], /* CJK Ideograph */
+ ["\u8421", "\u8421"], /* CJK Ideograph */
+ ["\u8422", "\u8422"], /* CJK Ideograph */
+ ["\u8423", "\u8423"], /* CJK Ideograph */
+ ["\u8424", "\u8424"], /* CJK Ideograph */
+ ["\u8425", "\u8425"], /* CJK Ideograph */
+ ["\u8426", "\u8426"], /* CJK Ideograph */
+ ["\u8427", "\u8427"], /* CJK Ideograph */
+ ["\u8428", "\u8428"], /* CJK Ideograph */
+ ["\u8429", "\u8429"], /* CJK Ideograph */
+ ["\u842A", "\u842A"], /* CJK Ideograph */
+ ["\u842B", "\u842B"], /* CJK Ideograph */
+ ["\u842C", "\u842C"], /* CJK Ideograph */
+ ["\u842D", "\u842D"], /* CJK Ideograph */
+ ["\u842E", "\u842E"], /* CJK Ideograph */
+ ["\u842F", "\u842F"], /* CJK Ideograph */
+ ["\u8430", "\u8430"], /* CJK Ideograph */
+ ["\u8431", "\u8431"], /* CJK Ideograph */
+ ["\u8432", "\u8432"], /* CJK Ideograph */
+ ["\u8433", "\u8433"], /* CJK Ideograph */
+ ["\u8434", "\u8434"], /* CJK Ideograph */
+ ["\u8435", "\u8435"], /* CJK Ideograph */
+ ["\u8436", "\u8436"], /* CJK Ideograph */
+ ["\u8437", "\u8437"], /* CJK Ideograph */
+ ["\u8438", "\u8438"], /* CJK Ideograph */
+ ["\u8439", "\u8439"], /* CJK Ideograph */
+ ["\u843A", "\u843A"], /* CJK Ideograph */
+ ["\u843B", "\u843B"], /* CJK Ideograph */
+ ["\u843C", "\u843C"], /* CJK Ideograph */
+ ["\u843D", "\u843D"], /* CJK Ideograph */
+ ["\u843E", "\u843E"], /* CJK Ideograph */
+ ["\u843F", "\u843F"], /* CJK Ideograph */
+ ["\u8440", "\u8440"], /* CJK Ideograph */
+ ["\u8441", "\u8441"], /* CJK Ideograph */
+ ["\u8442", "\u8442"], /* CJK Ideograph */
+ ["\u8443", "\u8443"], /* CJK Ideograph */
+ ["\u8444", "\u8444"], /* CJK Ideograph */
+ ["\u8445", "\u8445"], /* CJK Ideograph */
+ ["\u8446", "\u8446"], /* CJK Ideograph */
+ ["\u8447", "\u8447"], /* CJK Ideograph */
+ ["\u8448", "\u8448"], /* CJK Ideograph */
+ ["\u8449", "\u8449"], /* CJK Ideograph */
+ ["\u844A", "\u844A"], /* CJK Ideograph */
+ ["\u844B", "\u844B"], /* CJK Ideograph */
+ ["\u844C", "\u844C"], /* CJK Ideograph */
+ ["\u844D", "\u844D"], /* CJK Ideograph */
+ ["\u844E", "\u844E"], /* CJK Ideograph */
+ ["\u844F", "\u844F"], /* CJK Ideograph */
+ ["\u8450", "\u8450"], /* CJK Ideograph */
+ ["\u8451", "\u8451"], /* CJK Ideograph */
+ ["\u8452", "\u8452"], /* CJK Ideograph */
+ ["\u8453", "\u8453"], /* CJK Ideograph */
+ ["\u8454", "\u8454"], /* CJK Ideograph */
+ ["\u8455", "\u8455"], /* CJK Ideograph */
+ ["\u8456", "\u8456"], /* CJK Ideograph */
+ ["\u8457", "\u8457"], /* CJK Ideograph */
+ ["\u8458", "\u8458"], /* CJK Ideograph */
+ ["\u8459", "\u8459"], /* CJK Ideograph */
+ ["\u845A", "\u845A"], /* CJK Ideograph */
+ ["\u845B", "\u845B"], /* CJK Ideograph */
+ ["\u845C", "\u845C"], /* CJK Ideograph */
+ ["\u845D", "\u845D"], /* CJK Ideograph */
+ ["\u845E", "\u845E"], /* CJK Ideograph */
+ ["\u845F", "\u845F"], /* CJK Ideograph */
+ ["\u8460", "\u8460"], /* CJK Ideograph */
+ ["\u8461", "\u8461"], /* CJK Ideograph */
+ ["\u8462", "\u8462"], /* CJK Ideograph */
+ ["\u8463", "\u8463"], /* CJK Ideograph */
+ ["\u8464", "\u8464"], /* CJK Ideograph */
+ ["\u8465", "\u8465"], /* CJK Ideograph */
+ ["\u8466", "\u8466"], /* CJK Ideograph */
+ ["\u8467", "\u8467"], /* CJK Ideograph */
+ ["\u8468", "\u8468"], /* CJK Ideograph */
+ ["\u8469", "\u8469"], /* CJK Ideograph */
+ ["\u846A", "\u846A"], /* CJK Ideograph */
+ ["\u846B", "\u846B"], /* CJK Ideograph */
+ ["\u846C", "\u846C"], /* CJK Ideograph */
+ ["\u846D", "\u846D"], /* CJK Ideograph */
+ ["\u846E", "\u846E"], /* CJK Ideograph */
+ ["\u846F", "\u846F"], /* CJK Ideograph */
+ ["\u8470", "\u8470"], /* CJK Ideograph */
+ ["\u8471", "\u8471"], /* CJK Ideograph */
+ ["\u8472", "\u8472"], /* CJK Ideograph */
+ ["\u8473", "\u8473"], /* CJK Ideograph */
+ ["\u8474", "\u8474"], /* CJK Ideograph */
+ ["\u8475", "\u8475"], /* CJK Ideograph */
+ ["\u8476", "\u8476"], /* CJK Ideograph */
+ ["\u8477", "\u8477"], /* CJK Ideograph */
+ ["\u8478", "\u8478"], /* CJK Ideograph */
+ ["\u8479", "\u8479"], /* CJK Ideograph */
+ ["\u847A", "\u847A"], /* CJK Ideograph */
+ ["\u847B", "\u847B"], /* CJK Ideograph */
+ ["\u847C", "\u847C"], /* CJK Ideograph */
+ ["\u847D", "\u847D"], /* CJK Ideograph */
+ ["\u847E", "\u847E"], /* CJK Ideograph */
+ ["\u847F", "\u847F"], /* CJK Ideograph */
+ ["\u8480", "\u8480"], /* CJK Ideograph */
+ ["\u8481", "\u8481"], /* CJK Ideograph */
+ ["\u8482", "\u8482"], /* CJK Ideograph */
+ ["\u8483", "\u8483"], /* CJK Ideograph */
+ ["\u8484", "\u8484"], /* CJK Ideograph */
+ ["\u8485", "\u8485"], /* CJK Ideograph */
+ ["\u8486", "\u8486"], /* CJK Ideograph */
+ ["\u8487", "\u8487"], /* CJK Ideograph */
+ ["\u8488", "\u8488"], /* CJK Ideograph */
+ ["\u8489", "\u8489"], /* CJK Ideograph */
+ ["\u848A", "\u848A"], /* CJK Ideograph */
+ ["\u848B", "\u848B"], /* CJK Ideograph */
+ ["\u848C", "\u848C"], /* CJK Ideograph */
+ ["\u848D", "\u848D"], /* CJK Ideograph */
+ ["\u848E", "\u848E"], /* CJK Ideograph */
+ ["\u848F", "\u848F"], /* CJK Ideograph */
+ ["\u8490", "\u8490"], /* CJK Ideograph */
+ ["\u8491", "\u8491"], /* CJK Ideograph */
+ ["\u8492", "\u8492"], /* CJK Ideograph */
+ ["\u8493", "\u8493"], /* CJK Ideograph */
+ ["\u8494", "\u8494"], /* CJK Ideograph */
+ ["\u8495", "\u8495"], /* CJK Ideograph */
+ ["\u8496", "\u8496"], /* CJK Ideograph */
+ ["\u8497", "\u8497"], /* CJK Ideograph */
+ ["\u8498", "\u8498"], /* CJK Ideograph */
+ ["\u8499", "\u8499"], /* CJK Ideograph */
+ ["\u849A", "\u849A"], /* CJK Ideograph */
+ ["\u849B", "\u849B"], /* CJK Ideograph */
+ ["\u849C", "\u849C"], /* CJK Ideograph */
+ ["\u849D", "\u849D"], /* CJK Ideograph */
+ ["\u849E", "\u849E"], /* CJK Ideograph */
+ ["\u849F", "\u849F"], /* CJK Ideograph */
+ ["\u84A0", "\u84A0"], /* CJK Ideograph */
+ ["\u84A1", "\u84A1"], /* CJK Ideograph */
+ ["\u84A2", "\u84A2"], /* CJK Ideograph */
+ ["\u84A3", "\u84A3"], /* CJK Ideograph */
+ ["\u84A4", "\u84A4"], /* CJK Ideograph */
+ ["\u84A5", "\u84A5"], /* CJK Ideograph */
+ ["\u84A6", "\u84A6"], /* CJK Ideograph */
+ ["\u84A7", "\u84A7"], /* CJK Ideograph */
+ ["\u84A8", "\u84A8"], /* CJK Ideograph */
+ ["\u84A9", "\u84A9"], /* CJK Ideograph */
+ ["\u84AA", "\u84AA"], /* CJK Ideograph */
+ ["\u84AB", "\u84AB"], /* CJK Ideograph */
+ ["\u84AC", "\u84AC"], /* CJK Ideograph */
+ ["\u84AD", "\u84AD"], /* CJK Ideograph */
+ ["\u84AE", "\u84AE"], /* CJK Ideograph */
+ ["\u84AF", "\u84AF"], /* CJK Ideograph */
+ ["\u84B0", "\u84B0"], /* CJK Ideograph */
+ ["\u84B1", "\u84B1"], /* CJK Ideograph */
+ ["\u84B2", "\u84B2"], /* CJK Ideograph */
+ ["\u84B3", "\u84B3"], /* CJK Ideograph */
+ ["\u84B4", "\u84B4"], /* CJK Ideograph */
+ ["\u84B5", "\u84B5"], /* CJK Ideograph */
+ ["\u84B6", "\u84B6"], /* CJK Ideograph */
+ ["\u84B7", "\u84B7"], /* CJK Ideograph */
+ ["\u84B8", "\u84B8"], /* CJK Ideograph */
+ ["\u84B9", "\u84B9"], /* CJK Ideograph */
+ ["\u84BA", "\u84BA"], /* CJK Ideograph */
+ ["\u84BB", "\u84BB"], /* CJK Ideograph */
+ ["\u84BC", "\u84BC"], /* CJK Ideograph */
+ ["\u84BD", "\u84BD"], /* CJK Ideograph */
+ ["\u84BE", "\u84BE"], /* CJK Ideograph */
+ ["\u84BF", "\u84BF"], /* CJK Ideograph */
+ ["\u84C0", "\u84C0"], /* CJK Ideograph */
+ ["\u84C1", "\u84C1"], /* CJK Ideograph */
+ ["\u84C2", "\u84C2"], /* CJK Ideograph */
+ ["\u84C3", "\u84C3"], /* CJK Ideograph */
+ ["\u84C4", "\u84C4"], /* CJK Ideograph */
+ ["\u84C5", "\u84C5"], /* CJK Ideograph */
+ ["\u84C6", "\u84C6"], /* CJK Ideograph */
+ ["\u84C7", "\u84C7"], /* CJK Ideograph */
+ ["\u84C8", "\u84C8"], /* CJK Ideograph */
+ ["\u84C9", "\u84C9"], /* CJK Ideograph */
+ ["\u84CA", "\u84CA"], /* CJK Ideograph */
+ ["\u84CB", "\u84CB"], /* CJK Ideograph */
+ ["\u84CC", "\u84CC"], /* CJK Ideograph */
+ ["\u84CD", "\u84CD"], /* CJK Ideograph */
+ ["\u84CE", "\u84CE"], /* CJK Ideograph */
+ ["\u84CF", "\u84CF"], /* CJK Ideograph */
+ ["\u84D0", "\u84D0"], /* CJK Ideograph */
+ ["\u84D1", "\u84D1"], /* CJK Ideograph */
+ ["\u84D2", "\u84D2"], /* CJK Ideograph */
+ ["\u84D3", "\u84D3"], /* CJK Ideograph */
+ ["\u84D4", "\u84D4"], /* CJK Ideograph */
+ ["\u84D5", "\u84D5"], /* CJK Ideograph */
+ ["\u84D6", "\u84D6"], /* CJK Ideograph */
+ ["\u84D7", "\u84D7"], /* CJK Ideograph */
+ ["\u84D8", "\u84D8"], /* CJK Ideograph */
+ ["\u84D9", "\u84D9"], /* CJK Ideograph */
+ ["\u84DA", "\u84DA"], /* CJK Ideograph */
+ ["\u84DB", "\u84DB"], /* CJK Ideograph */
+ ["\u84DC", "\u84DC"], /* CJK Ideograph */
+ ["\u84DD", "\u84DD"], /* CJK Ideograph */
+ ["\u84DE", "\u84DE"], /* CJK Ideograph */
+ ["\u84DF", "\u84DF"], /* CJK Ideograph */
+ ["\u84E0", "\u84E0"], /* CJK Ideograph */
+ ["\u84E1", "\u84E1"], /* CJK Ideograph */
+ ["\u84E2", "\u84E2"], /* CJK Ideograph */
+ ["\u84E3", "\u84E3"], /* CJK Ideograph */
+ ["\u84E4", "\u84E4"], /* CJK Ideograph */
+ ["\u84E5", "\u84E5"], /* CJK Ideograph */
+ ["\u84E6", "\u84E6"], /* CJK Ideograph */
+ ["\u84E7", "\u84E7"], /* CJK Ideograph */
+ ["\u84E8", "\u84E8"], /* CJK Ideograph */
+ ["\u84E9", "\u84E9"], /* CJK Ideograph */
+ ["\u84EA", "\u84EA"], /* CJK Ideograph */
+ ["\u84EB", "\u84EB"], /* CJK Ideograph */
+ ["\u84EC", "\u84EC"], /* CJK Ideograph */
+ ["\u84ED", "\u84ED"], /* CJK Ideograph */
+ ["\u84EE", "\u84EE"], /* CJK Ideograph */
+ ["\u84EF", "\u84EF"], /* CJK Ideograph */
+ ["\u84F0", "\u84F0"], /* CJK Ideograph */
+ ["\u84F1", "\u84F1"], /* CJK Ideograph */
+ ["\u84F2", "\u84F2"], /* CJK Ideograph */
+ ["\u84F3", "\u84F3"], /* CJK Ideograph */
+ ["\u84F4", "\u84F4"], /* CJK Ideograph */
+ ["\u84F5", "\u84F5"], /* CJK Ideograph */
+ ["\u84F6", "\u84F6"], /* CJK Ideograph */
+ ["\u84F7", "\u84F7"], /* CJK Ideograph */
+ ["\u84F8", "\u84F8"], /* CJK Ideograph */
+ ["\u84F9", "\u84F9"], /* CJK Ideograph */
+ ["\u84FA", "\u84FA"], /* CJK Ideograph */
+ ["\u84FB", "\u84FB"], /* CJK Ideograph */
+ ["\u84FC", "\u84FC"], /* CJK Ideograph */
+ ["\u84FD", "\u84FD"], /* CJK Ideograph */
+ ["\u84FE", "\u84FE"], /* CJK Ideograph */
+ ["\u84FF", "\u84FF"], /* CJK Ideograph */
+ ["\u8500", "\u8500"], /* CJK Ideograph */
+ ["\u8501", "\u8501"], /* CJK Ideograph */
+ ["\u8502", "\u8502"], /* CJK Ideograph */
+ ["\u8503", "\u8503"], /* CJK Ideograph */
+ ["\u8504", "\u8504"], /* CJK Ideograph */
+ ["\u8505", "\u8505"], /* CJK Ideograph */
+ ["\u8506", "\u8506"], /* CJK Ideograph */
+ ["\u8507", "\u8507"], /* CJK Ideograph */
+ ["\u8508", "\u8508"], /* CJK Ideograph */
+ ["\u8509", "\u8509"], /* CJK Ideograph */
+ ["\u850A", "\u850A"], /* CJK Ideograph */
+ ["\u850B", "\u850B"], /* CJK Ideograph */
+ ["\u850C", "\u850C"], /* CJK Ideograph */
+ ["\u850D", "\u850D"], /* CJK Ideograph */
+ ["\u850E", "\u850E"], /* CJK Ideograph */
+ ["\u850F", "\u850F"], /* CJK Ideograph */
+ ["\u8510", "\u8510"], /* CJK Ideograph */
+ ["\u8511", "\u8511"], /* CJK Ideograph */
+ ["\u8512", "\u8512"], /* CJK Ideograph */
+ ["\u8513", "\u8513"], /* CJK Ideograph */
+ ["\u8514", "\u8514"], /* CJK Ideograph */
+ ["\u8515", "\u8515"], /* CJK Ideograph */
+ ["\u8516", "\u8516"], /* CJK Ideograph */
+ ["\u8517", "\u8517"], /* CJK Ideograph */
+ ["\u8518", "\u8518"], /* CJK Ideograph */
+ ["\u8519", "\u8519"], /* CJK Ideograph */
+ ["\u851A", "\u851A"], /* CJK Ideograph */
+ ["\u851B", "\u851B"], /* CJK Ideograph */
+ ["\u851C", "\u851C"], /* CJK Ideograph */
+ ["\u851D", "\u851D"], /* CJK Ideograph */
+ ["\u851E", "\u851E"], /* CJK Ideograph */
+ ["\u851F", "\u851F"], /* CJK Ideograph */
+ ["\u8520", "\u8520"], /* CJK Ideograph */
+ ["\u8521", "\u8521"], /* CJK Ideograph */
+ ["\u8522", "\u8522"], /* CJK Ideograph */
+ ["\u8523", "\u8523"], /* CJK Ideograph */
+ ["\u8524", "\u8524"], /* CJK Ideograph */
+ ["\u8525", "\u8525"], /* CJK Ideograph */
+ ["\u8526", "\u8526"], /* CJK Ideograph */
+ ["\u8527", "\u8527"], /* CJK Ideograph */
+ ["\u8528", "\u8528"], /* CJK Ideograph */
+ ["\u8529", "\u8529"], /* CJK Ideograph */
+ ["\u852A", "\u852A"], /* CJK Ideograph */
+ ["\u852B", "\u852B"], /* CJK Ideograph */
+ ["\u852C", "\u852C"], /* CJK Ideograph */
+ ["\u852D", "\u852D"], /* CJK Ideograph */
+ ["\u852E", "\u852E"], /* CJK Ideograph */
+ ["\u852F", "\u852F"], /* CJK Ideograph */
+ ["\u8530", "\u8530"], /* CJK Ideograph */
+ ["\u8531", "\u8531"], /* CJK Ideograph */
+ ["\u8532", "\u8532"], /* CJK Ideograph */
+ ["\u8533", "\u8533"], /* CJK Ideograph */
+ ["\u8534", "\u8534"], /* CJK Ideograph */
+ ["\u8535", "\u8535"], /* CJK Ideograph */
+ ["\u8536", "\u8536"], /* CJK Ideograph */
+ ["\u8537", "\u8537"], /* CJK Ideograph */
+ ["\u8538", "\u8538"], /* CJK Ideograph */
+ ["\u8539", "\u8539"], /* CJK Ideograph */
+ ["\u853A", "\u853A"], /* CJK Ideograph */
+ ["\u853B", "\u853B"], /* CJK Ideograph */
+ ["\u853C", "\u853C"], /* CJK Ideograph */
+ ["\u853D", "\u853D"], /* CJK Ideograph */
+ ["\u853E", "\u853E"], /* CJK Ideograph */
+ ["\u853F", "\u853F"], /* CJK Ideograph */
+ ["\u8540", "\u8540"], /* CJK Ideograph */
+ ["\u8541", "\u8541"], /* CJK Ideograph */
+ ["\u8542", "\u8542"], /* CJK Ideograph */
+ ["\u8543", "\u8543"], /* CJK Ideograph */
+ ["\u8544", "\u8544"], /* CJK Ideograph */
+ ["\u8545", "\u8545"], /* CJK Ideograph */
+ ["\u8546", "\u8546"], /* CJK Ideograph */
+ ["\u8547", "\u8547"], /* CJK Ideograph */
+ ["\u8548", "\u8548"], /* CJK Ideograph */
+ ["\u8549", "\u8549"], /* CJK Ideograph */
+ ["\u854A", "\u854A"], /* CJK Ideograph */
+ ["\u854B", "\u854B"], /* CJK Ideograph */
+ ["\u854C", "\u854C"], /* CJK Ideograph */
+ ["\u854D", "\u854D"], /* CJK Ideograph */
+ ["\u854E", "\u854E"], /* CJK Ideograph */
+ ["\u854F", "\u854F"], /* CJK Ideograph */
+ ["\u8550", "\u8550"], /* CJK Ideograph */
+ ["\u8551", "\u8551"], /* CJK Ideograph */
+ ["\u8552", "\u8552"], /* CJK Ideograph */
+ ["\u8553", "\u8553"], /* CJK Ideograph */
+ ["\u8554", "\u8554"], /* CJK Ideograph */
+ ["\u8555", "\u8555"], /* CJK Ideograph */
+ ["\u8556", "\u8556"], /* CJK Ideograph */
+ ["\u8557", "\u8557"], /* CJK Ideograph */
+ ["\u8558", "\u8558"], /* CJK Ideograph */
+ ["\u8559", "\u8559"], /* CJK Ideograph */
+ ["\u855A", "\u855A"], /* CJK Ideograph */
+ ["\u855B", "\u855B"], /* CJK Ideograph */
+ ["\u855C", "\u855C"], /* CJK Ideograph */
+ ["\u855D", "\u855D"], /* CJK Ideograph */
+ ["\u855E", "\u855E"], /* CJK Ideograph */
+ ["\u855F", "\u855F"], /* CJK Ideograph */
+ ["\u8560", "\u8560"], /* CJK Ideograph */
+ ["\u8561", "\u8561"], /* CJK Ideograph */
+ ["\u8562", "\u8562"], /* CJK Ideograph */
+ ["\u8563", "\u8563"], /* CJK Ideograph */
+ ["\u8564", "\u8564"], /* CJK Ideograph */
+ ["\u8565", "\u8565"], /* CJK Ideograph */
+ ["\u8566", "\u8566"], /* CJK Ideograph */
+ ["\u8567", "\u8567"], /* CJK Ideograph */
+ ["\u8568", "\u8568"], /* CJK Ideograph */
+ ["\u8569", "\u8569"], /* CJK Ideograph */
+ ["\u856A", "\u856A"], /* CJK Ideograph */
+ ["\u856B", "\u856B"], /* CJK Ideograph */
+ ["\u856C", "\u856C"], /* CJK Ideograph */
+ ["\u856D", "\u856D"], /* CJK Ideograph */
+ ["\u856E", "\u856E"], /* CJK Ideograph */
+ ["\u856F", "\u856F"], /* CJK Ideograph */
+ ["\u8570", "\u8570"], /* CJK Ideograph */
+ ["\u8571", "\u8571"], /* CJK Ideograph */
+ ["\u8572", "\u8572"], /* CJK Ideograph */
+ ["\u8573", "\u8573"], /* CJK Ideograph */
+ ["\u8574", "\u8574"], /* CJK Ideograph */
+ ["\u8575", "\u8575"], /* CJK Ideograph */
+ ["\u8576", "\u8576"], /* CJK Ideograph */
+ ["\u8577", "\u8577"], /* CJK Ideograph */
+ ["\u8578", "\u8578"], /* CJK Ideograph */
+ ["\u8579", "\u8579"], /* CJK Ideograph */
+ ["\u857A", "\u857A"], /* CJK Ideograph */
+ ["\u857B", "\u857B"], /* CJK Ideograph */
+ ["\u857C", "\u857C"], /* CJK Ideograph */
+ ["\u857D", "\u857D"], /* CJK Ideograph */
+ ["\u857E", "\u857E"], /* CJK Ideograph */
+ ["\u857F", "\u857F"], /* CJK Ideograph */
+ ["\u8580", "\u8580"], /* CJK Ideograph */
+ ["\u8581", "\u8581"], /* CJK Ideograph */
+ ["\u8582", "\u8582"], /* CJK Ideograph */
+ ["\u8583", "\u8583"], /* CJK Ideograph */
+ ["\u8584", "\u8584"], /* CJK Ideograph */
+ ["\u8585", "\u8585"], /* CJK Ideograph */
+ ["\u8586", "\u8586"], /* CJK Ideograph */
+ ["\u8587", "\u8587"], /* CJK Ideograph */
+ ["\u8588", "\u8588"], /* CJK Ideograph */
+ ["\u8589", "\u8589"], /* CJK Ideograph */
+ ["\u858A", "\u858A"], /* CJK Ideograph */
+ ["\u858B", "\u858B"], /* CJK Ideograph */
+ ["\u858C", "\u858C"], /* CJK Ideograph */
+ ["\u858D", "\u858D"], /* CJK Ideograph */
+ ["\u858E", "\u858E"], /* CJK Ideograph */
+ ["\u858F", "\u858F"], /* CJK Ideograph */
+ ["\u8590", "\u8590"], /* CJK Ideograph */
+ ["\u8591", "\u8591"], /* CJK Ideograph */
+ ["\u8592", "\u8592"], /* CJK Ideograph */
+ ["\u8593", "\u8593"], /* CJK Ideograph */
+ ["\u8594", "\u8594"], /* CJK Ideograph */
+ ["\u8595", "\u8595"], /* CJK Ideograph */
+ ["\u8596", "\u8596"], /* CJK Ideograph */
+ ["\u8597", "\u8597"], /* CJK Ideograph */
+ ["\u8598", "\u8598"], /* CJK Ideograph */
+ ["\u8599", "\u8599"], /* CJK Ideograph */
+ ["\u859A", "\u859A"], /* CJK Ideograph */
+ ["\u859B", "\u859B"], /* CJK Ideograph */
+ ["\u859C", "\u859C"], /* CJK Ideograph */
+ ["\u859D", "\u859D"], /* CJK Ideograph */
+ ["\u859E", "\u859E"], /* CJK Ideograph */
+ ["\u859F", "\u859F"], /* CJK Ideograph */
+ ["\u85A0", "\u85A0"], /* CJK Ideograph */
+ ["\u85A1", "\u85A1"], /* CJK Ideograph */
+ ["\u85A2", "\u85A2"], /* CJK Ideograph */
+ ["\u85A3", "\u85A3"], /* CJK Ideograph */
+ ["\u85A4", "\u85A4"], /* CJK Ideograph */
+ ["\u85A5", "\u85A5"], /* CJK Ideograph */
+ ["\u85A6", "\u85A6"], /* CJK Ideograph */
+ ["\u85A7", "\u85A7"], /* CJK Ideograph */
+ ["\u85A8", "\u85A8"], /* CJK Ideograph */
+ ["\u85A9", "\u85A9"], /* CJK Ideograph */
+ ["\u85AA", "\u85AA"], /* CJK Ideograph */
+ ["\u85AB", "\u85AB"], /* CJK Ideograph */
+ ["\u85AC", "\u85AC"], /* CJK Ideograph */
+ ["\u85AD", "\u85AD"], /* CJK Ideograph */
+ ["\u85AE", "\u85AE"], /* CJK Ideograph */
+ ["\u85AF", "\u85AF"], /* CJK Ideograph */
+ ["\u85B0", "\u85B0"], /* CJK Ideograph */
+ ["\u85B1", "\u85B1"], /* CJK Ideograph */
+ ["\u85B2", "\u85B2"], /* CJK Ideograph */
+ ["\u85B3", "\u85B3"], /* CJK Ideograph */
+ ["\u85B4", "\u85B4"], /* CJK Ideograph */
+ ["\u85B5", "\u85B5"], /* CJK Ideograph */
+ ["\u85B6", "\u85B6"], /* CJK Ideograph */
+ ["\u85B7", "\u85B7"], /* CJK Ideograph */
+ ["\u85B8", "\u85B8"], /* CJK Ideograph */
+ ["\u85B9", "\u85B9"], /* CJK Ideograph */
+ ["\u85BA", "\u85BA"], /* CJK Ideograph */
+ ["\u85BB", "\u85BB"], /* CJK Ideograph */
+ ["\u85BC", "\u85BC"], /* CJK Ideograph */
+ ["\u85BD", "\u85BD"], /* CJK Ideograph */
+ ["\u85BE", "\u85BE"], /* CJK Ideograph */
+ ["\u85BF", "\u85BF"], /* CJK Ideograph */
+ ["\u85C0", "\u85C0"], /* CJK Ideograph */
+ ["\u85C1", "\u85C1"], /* CJK Ideograph */
+ ["\u85C2", "\u85C2"], /* CJK Ideograph */
+ ["\u85C3", "\u85C3"], /* CJK Ideograph */
+ ["\u85C4", "\u85C4"], /* CJK Ideograph */
+ ["\u85C5", "\u85C5"], /* CJK Ideograph */
+ ["\u85C6", "\u85C6"], /* CJK Ideograph */
+ ["\u85C7", "\u85C7"], /* CJK Ideograph */
+ ["\u85C8", "\u85C8"], /* CJK Ideograph */
+ ["\u85C9", "\u85C9"], /* CJK Ideograph */
+ ["\u85CA", "\u85CA"], /* CJK Ideograph */
+ ["\u85CB", "\u85CB"], /* CJK Ideograph */
+ ["\u85CC", "\u85CC"], /* CJK Ideograph */
+ ["\u85CD", "\u85CD"], /* CJK Ideograph */
+ ["\u85CE", "\u85CE"], /* CJK Ideograph */
+ ["\u85CF", "\u85CF"], /* CJK Ideograph */
+ ["\u85D0", "\u85D0"], /* CJK Ideograph */
+ ["\u85D1", "\u85D1"], /* CJK Ideograph */
+ ["\u85D2", "\u85D2"], /* CJK Ideograph */
+ ["\u85D3", "\u85D3"], /* CJK Ideograph */
+ ["\u85D4", "\u85D4"], /* CJK Ideograph */
+ ["\u85D5", "\u85D5"], /* CJK Ideograph */
+ ["\u85D6", "\u85D6"], /* CJK Ideograph */
+ ["\u85D7", "\u85D7"], /* CJK Ideograph */
+ ["\u85D8", "\u85D8"], /* CJK Ideograph */
+ ["\u85D9", "\u85D9"], /* CJK Ideograph */
+ ["\u85DA", "\u85DA"], /* CJK Ideograph */
+ ["\u85DB", "\u85DB"], /* CJK Ideograph */
+ ["\u85DC", "\u85DC"], /* CJK Ideograph */
+ ["\u85DD", "\u85DD"], /* CJK Ideograph */
+ ["\u85DE", "\u85DE"], /* CJK Ideograph */
+ ["\u85DF", "\u85DF"], /* CJK Ideograph */
+ ["\u85E0", "\u85E0"], /* CJK Ideograph */
+ ["\u85E1", "\u85E1"], /* CJK Ideograph */
+ ["\u85E2", "\u85E2"], /* CJK Ideograph */
+ ["\u85E3", "\u85E3"], /* CJK Ideograph */
+ ["\u85E4", "\u85E4"], /* CJK Ideograph */
+ ["\u85E5", "\u85E5"], /* CJK Ideograph */
+ ["\u85E6", "\u85E6"], /* CJK Ideograph */
+ ["\u85E7", "\u85E7"], /* CJK Ideograph */
+ ["\u85E8", "\u85E8"], /* CJK Ideograph */
+ ["\u85E9", "\u85E9"], /* CJK Ideograph */
+ ["\u85EA", "\u85EA"], /* CJK Ideograph */
+ ["\u85EB", "\u85EB"], /* CJK Ideograph */
+ ["\u85EC", "\u85EC"], /* CJK Ideograph */
+ ["\u85ED", "\u85ED"], /* CJK Ideograph */
+ ["\u85EE", "\u85EE"], /* CJK Ideograph */
+ ["\u85EF", "\u85EF"], /* CJK Ideograph */
+ ["\u85F0", "\u85F0"], /* CJK Ideograph */
+ ["\u85F1", "\u85F1"], /* CJK Ideograph */
+ ["\u85F2", "\u85F2"], /* CJK Ideograph */
+ ["\u85F3", "\u85F3"], /* CJK Ideograph */
+ ["\u85F4", "\u85F4"], /* CJK Ideograph */
+ ["\u85F5", "\u85F5"], /* CJK Ideograph */
+ ["\u85F6", "\u85F6"], /* CJK Ideograph */
+ ["\u85F7", "\u85F7"], /* CJK Ideograph */
+ ["\u85F8", "\u85F8"], /* CJK Ideograph */
+ ["\u85F9", "\u85F9"], /* CJK Ideograph */
+ ["\u85FA", "\u85FA"], /* CJK Ideograph */
+ ["\u85FB", "\u85FB"], /* CJK Ideograph */
+ ["\u85FC", "\u85FC"], /* CJK Ideograph */
+ ["\u85FD", "\u85FD"], /* CJK Ideograph */
+ ["\u85FE", "\u85FE"], /* CJK Ideograph */
+ ["\u85FF", "\u85FF"], /* CJK Ideograph */
+ ["\u8600", "\u8600"], /* CJK Ideograph */
+ ["\u8601", "\u8601"], /* CJK Ideograph */
+ ["\u8602", "\u8602"], /* CJK Ideograph */
+ ["\u8603", "\u8603"], /* CJK Ideograph */
+ ["\u8604", "\u8604"], /* CJK Ideograph */
+ ["\u8605", "\u8605"], /* CJK Ideograph */
+ ["\u8606", "\u8606"], /* CJK Ideograph */
+ ["\u8607", "\u8607"], /* CJK Ideograph */
+ ["\u8608", "\u8608"], /* CJK Ideograph */
+ ["\u8609", "\u8609"], /* CJK Ideograph */
+ ["\u860A", "\u860A"], /* CJK Ideograph */
+ ["\u860B", "\u860B"], /* CJK Ideograph */
+ ["\u860C", "\u860C"], /* CJK Ideograph */
+ ["\u860D", "\u860D"], /* CJK Ideograph */
+ ["\u860E", "\u860E"], /* CJK Ideograph */
+ ["\u860F", "\u860F"], /* CJK Ideograph */
+ ["\u8610", "\u8610"], /* CJK Ideograph */
+ ["\u8611", "\u8611"], /* CJK Ideograph */
+ ["\u8612", "\u8612"], /* CJK Ideograph */
+ ["\u8613", "\u8613"], /* CJK Ideograph */
+ ["\u8614", "\u8614"], /* CJK Ideograph */
+ ["\u8615", "\u8615"], /* CJK Ideograph */
+ ["\u8616", "\u8616"], /* CJK Ideograph */
+ ["\u8617", "\u8617"], /* CJK Ideograph */
+ ["\u8618", "\u8618"], /* CJK Ideograph */
+ ["\u8619", "\u8619"], /* CJK Ideograph */
+ ["\u861A", "\u861A"], /* CJK Ideograph */
+ ["\u861B", "\u861B"], /* CJK Ideograph */
+ ["\u861C", "\u861C"], /* CJK Ideograph */
+ ["\u861D", "\u861D"], /* CJK Ideograph */
+ ["\u861E", "\u861E"], /* CJK Ideograph */
+ ["\u861F", "\u861F"], /* CJK Ideograph */
+ ["\u8620", "\u8620"], /* CJK Ideograph */
+ ["\u8621", "\u8621"], /* CJK Ideograph */
+ ["\u8622", "\u8622"], /* CJK Ideograph */
+ ["\u8623", "\u8623"], /* CJK Ideograph */
+ ["\u8624", "\u8624"], /* CJK Ideograph */
+ ["\u8625", "\u8625"], /* CJK Ideograph */
+ ["\u8626", "\u8626"], /* CJK Ideograph */
+ ["\u8627", "\u8627"], /* CJK Ideograph */
+ ["\u8628", "\u8628"], /* CJK Ideograph */
+ ["\u8629", "\u8629"], /* CJK Ideograph */
+ ["\u862A", "\u862A"], /* CJK Ideograph */
+ ["\u862B", "\u862B"], /* CJK Ideograph */
+ ["\u862C", "\u862C"], /* CJK Ideograph */
+ ["\u862D", "\u862D"], /* CJK Ideograph */
+ ["\u862E", "\u862E"], /* CJK Ideograph */
+ ["\u862F", "\u862F"], /* CJK Ideograph */
+ ["\u8630", "\u8630"], /* CJK Ideograph */
+ ["\u8631", "\u8631"], /* CJK Ideograph */
+ ["\u8632", "\u8632"], /* CJK Ideograph */
+ ["\u8633", "\u8633"], /* CJK Ideograph */
+ ["\u8634", "\u8634"], /* CJK Ideograph */
+ ["\u8635", "\u8635"], /* CJK Ideograph */
+ ["\u8636", "\u8636"], /* CJK Ideograph */
+ ["\u8637", "\u8637"], /* CJK Ideograph */
+ ["\u8638", "\u8638"], /* CJK Ideograph */
+ ["\u8639", "\u8639"], /* CJK Ideograph */
+ ["\u863A", "\u863A"], /* CJK Ideograph */
+ ["\u863B", "\u863B"], /* CJK Ideograph */
+ ["\u863C", "\u863C"], /* CJK Ideograph */
+ ["\u863D", "\u863D"], /* CJK Ideograph */
+ ["\u863E", "\u863E"], /* CJK Ideograph */
+ ["\u863F", "\u863F"], /* CJK Ideograph */
+ ["\u8640", "\u8640"], /* CJK Ideograph */
+ ["\u8641", "\u8641"], /* CJK Ideograph */
+ ["\u8642", "\u8642"], /* CJK Ideograph */
+ ["\u8643", "\u8643"], /* CJK Ideograph */
+ ["\u8644", "\u8644"], /* CJK Ideograph */
+ ["\u8645", "\u8645"], /* CJK Ideograph */
+ ["\u8646", "\u8646"], /* CJK Ideograph */
+ ["\u8647", "\u8647"], /* CJK Ideograph */
+ ["\u8648", "\u8648"], /* CJK Ideograph */
+ ["\u8649", "\u8649"], /* CJK Ideograph */
+ ["\u864A", "\u864A"], /* CJK Ideograph */
+ ["\u864B", "\u864B"], /* CJK Ideograph */
+ ["\u864C", "\u864C"], /* CJK Ideograph */
+ ["\u864D", "\u864D"], /* CJK Ideograph */
+ ["\u864E", "\u864E"], /* CJK Ideograph */
+ ["\u864F", "\u864F"], /* CJK Ideograph */
+ ["\u8650", "\u8650"], /* CJK Ideograph */
+ ["\u8651", "\u8651"], /* CJK Ideograph */
+ ["\u8652", "\u8652"], /* CJK Ideograph */
+ ["\u8653", "\u8653"], /* CJK Ideograph */
+ ["\u8654", "\u8654"], /* CJK Ideograph */
+ ["\u8655", "\u8655"], /* CJK Ideograph */
+ ["\u8656", "\u8656"], /* CJK Ideograph */
+ ["\u8657", "\u8657"], /* CJK Ideograph */
+ ["\u8658", "\u8658"], /* CJK Ideograph */
+ ["\u8659", "\u8659"], /* CJK Ideograph */
+ ["\u865A", "\u865A"], /* CJK Ideograph */
+ ["\u865B", "\u865B"], /* CJK Ideograph */
+ ["\u865C", "\u865C"], /* CJK Ideograph */
+ ["\u865D", "\u865D"], /* CJK Ideograph */
+ ["\u865E", "\u865E"], /* CJK Ideograph */
+ ["\u865F", "\u865F"], /* CJK Ideograph */
+ ["\u8660", "\u8660"], /* CJK Ideograph */
+ ["\u8661", "\u8661"], /* CJK Ideograph */
+ ["\u8662", "\u8662"], /* CJK Ideograph */
+ ["\u8663", "\u8663"], /* CJK Ideograph */
+ ["\u8664", "\u8664"], /* CJK Ideograph */
+ ["\u8665", "\u8665"], /* CJK Ideograph */
+ ["\u8666", "\u8666"], /* CJK Ideograph */
+ ["\u8667", "\u8667"], /* CJK Ideograph */
+ ["\u8668", "\u8668"], /* CJK Ideograph */
+ ["\u8669", "\u8669"], /* CJK Ideograph */
+ ["\u866A", "\u866A"], /* CJK Ideograph */
+ ["\u866B", "\u866B"], /* CJK Ideograph */
+ ["\u866C", "\u866C"], /* CJK Ideograph */
+ ["\u866D", "\u866D"], /* CJK Ideograph */
+ ["\u866E", "\u866E"], /* CJK Ideograph */
+ ["\u866F", "\u866F"], /* CJK Ideograph */
+ ["\u8670", "\u8670"], /* CJK Ideograph */
+ ["\u8671", "\u8671"], /* CJK Ideograph */
+ ["\u8672", "\u8672"], /* CJK Ideograph */
+ ["\u8673", "\u8673"], /* CJK Ideograph */
+ ["\u8674", "\u8674"], /* CJK Ideograph */
+ ["\u8675", "\u8675"], /* CJK Ideograph */
+ ["\u8676", "\u8676"], /* CJK Ideograph */
+ ["\u8677", "\u8677"], /* CJK Ideograph */
+ ["\u8678", "\u8678"], /* CJK Ideograph */
+ ["\u8679", "\u8679"], /* CJK Ideograph */
+ ["\u867A", "\u867A"], /* CJK Ideograph */
+ ["\u867B", "\u867B"], /* CJK Ideograph */
+ ["\u867C", "\u867C"], /* CJK Ideograph */
+ ["\u867D", "\u867D"], /* CJK Ideograph */
+ ["\u867E", "\u867E"], /* CJK Ideograph */
+ ["\u867F", "\u867F"], /* CJK Ideograph */
+ ["\u8680", "\u8680"], /* CJK Ideograph */
+ ["\u8681", "\u8681"], /* CJK Ideograph */
+ ["\u8682", "\u8682"], /* CJK Ideograph */
+ ["\u8683", "\u8683"], /* CJK Ideograph */
+ ["\u8684", "\u8684"], /* CJK Ideograph */
+ ["\u8685", "\u8685"], /* CJK Ideograph */
+ ["\u8686", "\u8686"], /* CJK Ideograph */
+ ["\u8687", "\u8687"], /* CJK Ideograph */
+ ["\u8688", "\u8688"], /* CJK Ideograph */
+ ["\u8689", "\u8689"], /* CJK Ideograph */
+ ["\u868A", "\u868A"], /* CJK Ideograph */
+ ["\u868B", "\u868B"], /* CJK Ideograph */
+ ["\u868C", "\u868C"], /* CJK Ideograph */
+ ["\u868D", "\u868D"], /* CJK Ideograph */
+ ["\u868E", "\u868E"], /* CJK Ideograph */
+ ["\u868F", "\u868F"], /* CJK Ideograph */
+ ["\u8690", "\u8690"], /* CJK Ideograph */
+ ["\u8691", "\u8691"], /* CJK Ideograph */
+ ["\u8692", "\u8692"], /* CJK Ideograph */
+ ["\u8693", "\u8693"], /* CJK Ideograph */
+ ["\u8694", "\u8694"], /* CJK Ideograph */
+ ["\u8695", "\u8695"], /* CJK Ideograph */
+ ["\u8696", "\u8696"], /* CJK Ideograph */
+ ["\u8697", "\u8697"], /* CJK Ideograph */
+ ["\u8698", "\u8698"], /* CJK Ideograph */
+ ["\u8699", "\u8699"], /* CJK Ideograph */
+ ["\u869A", "\u869A"], /* CJK Ideograph */
+ ["\u869B", "\u869B"], /* CJK Ideograph */
+ ["\u869C", "\u869C"], /* CJK Ideograph */
+ ["\u869D", "\u869D"], /* CJK Ideograph */
+ ["\u869E", "\u869E"], /* CJK Ideograph */
+ ["\u869F", "\u869F"], /* CJK Ideograph */
+ ["\u86A0", "\u86A0"], /* CJK Ideograph */
+ ["\u86A1", "\u86A1"], /* CJK Ideograph */
+ ["\u86A2", "\u86A2"], /* CJK Ideograph */
+ ["\u86A3", "\u86A3"], /* CJK Ideograph */
+ ["\u86A4", "\u86A4"], /* CJK Ideograph */
+ ["\u86A5", "\u86A5"], /* CJK Ideograph */
+ ["\u86A6", "\u86A6"], /* CJK Ideograph */
+ ["\u86A7", "\u86A7"], /* CJK Ideograph */
+ ["\u86A8", "\u86A8"], /* CJK Ideograph */
+ ["\u86A9", "\u86A9"], /* CJK Ideograph */
+ ["\u86AA", "\u86AA"], /* CJK Ideograph */
+ ["\u86AB", "\u86AB"], /* CJK Ideograph */
+ ["\u86AC", "\u86AC"], /* CJK Ideograph */
+ ["\u86AD", "\u86AD"], /* CJK Ideograph */
+ ["\u86AE", "\u86AE"], /* CJK Ideograph */
+ ["\u86AF", "\u86AF"], /* CJK Ideograph */
+ ["\u86B0", "\u86B0"], /* CJK Ideograph */
+ ["\u86B1", "\u86B1"], /* CJK Ideograph */
+ ["\u86B2", "\u86B2"], /* CJK Ideograph */
+ ["\u86B3", "\u86B3"], /* CJK Ideograph */
+ ["\u86B4", "\u86B4"], /* CJK Ideograph */
+ ["\u86B5", "\u86B5"], /* CJK Ideograph */
+ ["\u86B6", "\u86B6"], /* CJK Ideograph */
+ ["\u86B7", "\u86B7"], /* CJK Ideograph */
+ ["\u86B8", "\u86B8"], /* CJK Ideograph */
+ ["\u86B9", "\u86B9"], /* CJK Ideograph */
+ ["\u86BA", "\u86BA"], /* CJK Ideograph */
+ ["\u86BB", "\u86BB"], /* CJK Ideograph */
+ ["\u86BC", "\u86BC"], /* CJK Ideograph */
+ ["\u86BD", "\u86BD"], /* CJK Ideograph */
+ ["\u86BE", "\u86BE"], /* CJK Ideograph */
+ ["\u86BF", "\u86BF"], /* CJK Ideograph */
+ ["\u86C0", "\u86C0"], /* CJK Ideograph */
+ ["\u86C1", "\u86C1"], /* CJK Ideograph */
+ ["\u86C2", "\u86C2"], /* CJK Ideograph */
+ ["\u86C3", "\u86C3"], /* CJK Ideograph */
+ ["\u86C4", "\u86C4"], /* CJK Ideograph */
+ ["\u86C5", "\u86C5"], /* CJK Ideograph */
+ ["\u86C6", "\u86C6"], /* CJK Ideograph */
+ ["\u86C7", "\u86C7"], /* CJK Ideograph */
+ ["\u86C8", "\u86C8"], /* CJK Ideograph */
+ ["\u86C9", "\u86C9"], /* CJK Ideograph */
+ ["\u86CA", "\u86CA"], /* CJK Ideograph */
+ ["\u86CB", "\u86CB"], /* CJK Ideograph */
+ ["\u86CC", "\u86CC"], /* CJK Ideograph */
+ ["\u86CD", "\u86CD"], /* CJK Ideograph */
+ ["\u86CE", "\u86CE"], /* CJK Ideograph */
+ ["\u86CF", "\u86CF"], /* CJK Ideograph */
+ ["\u86D0", "\u86D0"], /* CJK Ideograph */
+ ["\u86D1", "\u86D1"], /* CJK Ideograph */
+ ["\u86D2", "\u86D2"], /* CJK Ideograph */
+ ["\u86D3", "\u86D3"], /* CJK Ideograph */
+ ["\u86D4", "\u86D4"], /* CJK Ideograph */
+ ["\u86D5", "\u86D5"], /* CJK Ideograph */
+ ["\u86D6", "\u86D6"], /* CJK Ideograph */
+ ["\u86D7", "\u86D7"], /* CJK Ideograph */
+ ["\u86D8", "\u86D8"], /* CJK Ideograph */
+ ["\u86D9", "\u86D9"], /* CJK Ideograph */
+ ["\u86DA", "\u86DA"], /* CJK Ideograph */
+ ["\u86DB", "\u86DB"], /* CJK Ideograph */
+ ["\u86DC", "\u86DC"], /* CJK Ideograph */
+ ["\u86DD", "\u86DD"], /* CJK Ideograph */
+ ["\u86DE", "\u86DE"], /* CJK Ideograph */
+ ["\u86DF", "\u86DF"], /* CJK Ideograph */
+ ["\u86E0", "\u86E0"], /* CJK Ideograph */
+ ["\u86E1", "\u86E1"], /* CJK Ideograph */
+ ["\u86E2", "\u86E2"], /* CJK Ideograph */
+ ["\u86E3", "\u86E3"], /* CJK Ideograph */
+ ["\u86E4", "\u86E4"], /* CJK Ideograph */
+ ["\u86E5", "\u86E5"], /* CJK Ideograph */
+ ["\u86E6", "\u86E6"], /* CJK Ideograph */
+ ["\u86E7", "\u86E7"], /* CJK Ideograph */
+ ["\u86E8", "\u86E8"], /* CJK Ideograph */
+ ["\u86E9", "\u86E9"], /* CJK Ideograph */
+ ["\u86EA", "\u86EA"], /* CJK Ideograph */
+ ["\u86EB", "\u86EB"], /* CJK Ideograph */
+ ["\u86EC", "\u86EC"], /* CJK Ideograph */
+ ["\u86ED", "\u86ED"], /* CJK Ideograph */
+ ["\u86EE", "\u86EE"], /* CJK Ideograph */
+ ["\u86EF", "\u86EF"], /* CJK Ideograph */
+ ["\u86F0", "\u86F0"], /* CJK Ideograph */
+ ["\u86F1", "\u86F1"], /* CJK Ideograph */
+ ["\u86F2", "\u86F2"], /* CJK Ideograph */
+ ["\u86F3", "\u86F3"], /* CJK Ideograph */
+ ["\u86F4", "\u86F4"], /* CJK Ideograph */
+ ["\u86F5", "\u86F5"], /* CJK Ideograph */
+ ["\u86F6", "\u86F6"], /* CJK Ideograph */
+ ["\u86F7", "\u86F7"], /* CJK Ideograph */
+ ["\u86F8", "\u86F8"], /* CJK Ideograph */
+ ["\u86F9", "\u86F9"], /* CJK Ideograph */
+ ["\u86FA", "\u86FA"], /* CJK Ideograph */
+ ["\u86FB", "\u86FB"], /* CJK Ideograph */
+ ["\u86FC", "\u86FC"], /* CJK Ideograph */
+ ["\u86FD", "\u86FD"], /* CJK Ideograph */
+ ["\u86FE", "\u86FE"], /* CJK Ideograph */
+ ["\u86FF", "\u86FF"], /* CJK Ideograph */
+ ["\u8700", "\u8700"], /* CJK Ideograph */
+ ["\u8701", "\u8701"], /* CJK Ideograph */
+ ["\u8702", "\u8702"], /* CJK Ideograph */
+ ["\u8703", "\u8703"], /* CJK Ideograph */
+ ["\u8704", "\u8704"], /* CJK Ideograph */
+ ["\u8705", "\u8705"], /* CJK Ideograph */
+ ["\u8706", "\u8706"], /* CJK Ideograph */
+ ["\u8707", "\u8707"], /* CJK Ideograph */
+ ["\u8708", "\u8708"], /* CJK Ideograph */
+ ["\u8709", "\u8709"], /* CJK Ideograph */
+ ["\u870A", "\u870A"], /* CJK Ideograph */
+ ["\u870B", "\u870B"], /* CJK Ideograph */
+ ["\u870C", "\u870C"], /* CJK Ideograph */
+ ["\u870D", "\u870D"], /* CJK Ideograph */
+ ["\u870E", "\u870E"], /* CJK Ideograph */
+ ["\u870F", "\u870F"], /* CJK Ideograph */
+ ["\u8710", "\u8710"], /* CJK Ideograph */
+ ["\u8711", "\u8711"], /* CJK Ideograph */
+ ["\u8712", "\u8712"], /* CJK Ideograph */
+ ["\u8713", "\u8713"], /* CJK Ideograph */
+ ["\u8714", "\u8714"], /* CJK Ideograph */
+ ["\u8715", "\u8715"], /* CJK Ideograph */
+ ["\u8716", "\u8716"], /* CJK Ideograph */
+ ["\u8717", "\u8717"], /* CJK Ideograph */
+ ["\u8718", "\u8718"], /* CJK Ideograph */
+ ["\u8719", "\u8719"], /* CJK Ideograph */
+ ["\u871A", "\u871A"], /* CJK Ideograph */
+ ["\u871B", "\u871B"], /* CJK Ideograph */
+ ["\u871C", "\u871C"], /* CJK Ideograph */
+ ["\u871D", "\u871D"], /* CJK Ideograph */
+ ["\u871E", "\u871E"], /* CJK Ideograph */
+ ["\u871F", "\u871F"], /* CJK Ideograph */
+ ["\u8720", "\u8720"], /* CJK Ideograph */
+ ["\u8721", "\u8721"], /* CJK Ideograph */
+ ["\u8722", "\u8722"], /* CJK Ideograph */
+ ["\u8723", "\u8723"], /* CJK Ideograph */
+ ["\u8724", "\u8724"], /* CJK Ideograph */
+ ["\u8725", "\u8725"], /* CJK Ideograph */
+ ["\u8726", "\u8726"], /* CJK Ideograph */
+ ["\u8727", "\u8727"], /* CJK Ideograph */
+ ["\u8728", "\u8728"], /* CJK Ideograph */
+ ["\u8729", "\u8729"], /* CJK Ideograph */
+ ["\u872A", "\u872A"], /* CJK Ideograph */
+ ["\u872B", "\u872B"], /* CJK Ideograph */
+ ["\u872C", "\u872C"], /* CJK Ideograph */
+ ["\u872D", "\u872D"], /* CJK Ideograph */
+ ["\u872E", "\u872E"], /* CJK Ideograph */
+ ["\u872F", "\u872F"], /* CJK Ideograph */
+ ["\u8730", "\u8730"], /* CJK Ideograph */
+ ["\u8731", "\u8731"], /* CJK Ideograph */
+ ["\u8732", "\u8732"], /* CJK Ideograph */
+ ["\u8733", "\u8733"], /* CJK Ideograph */
+ ["\u8734", "\u8734"], /* CJK Ideograph */
+ ["\u8735", "\u8735"], /* CJK Ideograph */
+ ["\u8736", "\u8736"], /* CJK Ideograph */
+ ["\u8737", "\u8737"], /* CJK Ideograph */
+ ["\u8738", "\u8738"], /* CJK Ideograph */
+ ["\u8739", "\u8739"], /* CJK Ideograph */
+ ["\u873A", "\u873A"], /* CJK Ideograph */
+ ["\u873B", "\u873B"], /* CJK Ideograph */
+ ["\u873C", "\u873C"], /* CJK Ideograph */
+ ["\u873D", "\u873D"], /* CJK Ideograph */
+ ["\u873E", "\u873E"], /* CJK Ideograph */
+ ["\u873F", "\u873F"], /* CJK Ideograph */
+ ["\u8740", "\u8740"], /* CJK Ideograph */
+ ["\u8741", "\u8741"], /* CJK Ideograph */
+ ["\u8742", "\u8742"], /* CJK Ideograph */
+ ["\u8743", "\u8743"], /* CJK Ideograph */
+ ["\u8744", "\u8744"], /* CJK Ideograph */
+ ["\u8745", "\u8745"], /* CJK Ideograph */
+ ["\u8746", "\u8746"], /* CJK Ideograph */
+ ["\u8747", "\u8747"], /* CJK Ideograph */
+ ["\u8748", "\u8748"], /* CJK Ideograph */
+ ["\u8749", "\u8749"], /* CJK Ideograph */
+ ["\u874A", "\u874A"], /* CJK Ideograph */
+ ["\u874B", "\u874B"], /* CJK Ideograph */
+ ["\u874C", "\u874C"], /* CJK Ideograph */
+ ["\u874D", "\u874D"], /* CJK Ideograph */
+ ["\u874E", "\u874E"], /* CJK Ideograph */
+ ["\u874F", "\u874F"], /* CJK Ideograph */
+ ["\u8750", "\u8750"], /* CJK Ideograph */
+ ["\u8751", "\u8751"], /* CJK Ideograph */
+ ["\u8752", "\u8752"], /* CJK Ideograph */
+ ["\u8753", "\u8753"], /* CJK Ideograph */
+ ["\u8754", "\u8754"], /* CJK Ideograph */
+ ["\u8755", "\u8755"], /* CJK Ideograph */
+ ["\u8756", "\u8756"], /* CJK Ideograph */
+ ["\u8757", "\u8757"], /* CJK Ideograph */
+ ["\u8758", "\u8758"], /* CJK Ideograph */
+ ["\u8759", "\u8759"], /* CJK Ideograph */
+ ["\u875A", "\u875A"], /* CJK Ideograph */
+ ["\u875B", "\u875B"], /* CJK Ideograph */
+ ["\u875C", "\u875C"], /* CJK Ideograph */
+ ["\u875D", "\u875D"], /* CJK Ideograph */
+ ["\u875E", "\u875E"], /* CJK Ideograph */
+ ["\u875F", "\u875F"], /* CJK Ideograph */
+ ["\u8760", "\u8760"], /* CJK Ideograph */
+ ["\u8761", "\u8761"], /* CJK Ideograph */
+ ["\u8762", "\u8762"], /* CJK Ideograph */
+ ["\u8763", "\u8763"], /* CJK Ideograph */
+ ["\u8764", "\u8764"], /* CJK Ideograph */
+ ["\u8765", "\u8765"], /* CJK Ideograph */
+ ["\u8766", "\u8766"], /* CJK Ideograph */
+ ["\u8767", "\u8767"], /* CJK Ideograph */
+ ["\u8768", "\u8768"], /* CJK Ideograph */
+ ["\u8769", "\u8769"], /* CJK Ideograph */
+ ["\u876A", "\u876A"], /* CJK Ideograph */
+ ["\u876B", "\u876B"], /* CJK Ideograph */
+ ["\u876C", "\u876C"], /* CJK Ideograph */
+ ["\u876D", "\u876D"], /* CJK Ideograph */
+ ["\u876E", "\u876E"], /* CJK Ideograph */
+ ["\u876F", "\u876F"], /* CJK Ideograph */
+ ["\u8770", "\u8770"], /* CJK Ideograph */
+ ["\u8771", "\u8771"], /* CJK Ideograph */
+ ["\u8772", "\u8772"], /* CJK Ideograph */
+ ["\u8773", "\u8773"], /* CJK Ideograph */
+ ["\u8774", "\u8774"], /* CJK Ideograph */
+ ["\u8775", "\u8775"], /* CJK Ideograph */
+ ["\u8776", "\u8776"], /* CJK Ideograph */
+ ["\u8777", "\u8777"], /* CJK Ideograph */
+ ["\u8778", "\u8778"], /* CJK Ideograph */
+ ["\u8779", "\u8779"], /* CJK Ideograph */
+ ["\u877A", "\u877A"], /* CJK Ideograph */
+ ["\u877B", "\u877B"], /* CJK Ideograph */
+ ["\u877C", "\u877C"], /* CJK Ideograph */
+ ["\u877D", "\u877D"], /* CJK Ideograph */
+ ["\u877E", "\u877E"], /* CJK Ideograph */
+ ["\u877F", "\u877F"], /* CJK Ideograph */
+ ["\u8780", "\u8780"], /* CJK Ideograph */
+ ["\u8781", "\u8781"], /* CJK Ideograph */
+ ["\u8782", "\u8782"], /* CJK Ideograph */
+ ["\u8783", "\u8783"], /* CJK Ideograph */
+ ["\u8784", "\u8784"], /* CJK Ideograph */
+ ["\u8785", "\u8785"], /* CJK Ideograph */
+ ["\u8786", "\u8786"], /* CJK Ideograph */
+ ["\u8787", "\u8787"], /* CJK Ideograph */
+ ["\u8788", "\u8788"], /* CJK Ideograph */
+ ["\u8789", "\u8789"], /* CJK Ideograph */
+ ["\u878A", "\u878A"], /* CJK Ideograph */
+ ["\u878B", "\u878B"], /* CJK Ideograph */
+ ["\u878C", "\u878C"], /* CJK Ideograph */
+ ["\u878D", "\u878D"], /* CJK Ideograph */
+ ["\u878E", "\u878E"], /* CJK Ideograph */
+ ["\u878F", "\u878F"], /* CJK Ideograph */
+ ["\u8790", "\u8790"], /* CJK Ideograph */
+ ["\u8791", "\u8791"], /* CJK Ideograph */
+ ["\u8792", "\u8792"], /* CJK Ideograph */
+ ["\u8793", "\u8793"], /* CJK Ideograph */
+ ["\u8794", "\u8794"], /* CJK Ideograph */
+ ["\u8795", "\u8795"], /* CJK Ideograph */
+ ["\u8796", "\u8796"], /* CJK Ideograph */
+ ["\u8797", "\u8797"], /* CJK Ideograph */
+ ["\u8798", "\u8798"], /* CJK Ideograph */
+ ["\u8799", "\u8799"], /* CJK Ideograph */
+ ["\u879A", "\u879A"], /* CJK Ideograph */
+ ["\u879B", "\u879B"], /* CJK Ideograph */
+ ["\u879C", "\u879C"], /* CJK Ideograph */
+ ["\u879D", "\u879D"], /* CJK Ideograph */
+ ["\u879E", "\u879E"], /* CJK Ideograph */
+ ["\u879F", "\u879F"], /* CJK Ideograph */
+ ["\u87A0", "\u87A0"], /* CJK Ideograph */
+ ["\u87A1", "\u87A1"], /* CJK Ideograph */
+ ["\u87A2", "\u87A2"], /* CJK Ideograph */
+ ["\u87A3", "\u87A3"], /* CJK Ideograph */
+ ["\u87A4", "\u87A4"], /* CJK Ideograph */
+ ["\u87A5", "\u87A5"], /* CJK Ideograph */
+ ["\u87A6", "\u87A6"], /* CJK Ideograph */
+ ["\u87A7", "\u87A7"], /* CJK Ideograph */
+ ["\u87A8", "\u87A8"], /* CJK Ideograph */
+ ["\u87A9", "\u87A9"], /* CJK Ideograph */
+ ["\u87AA", "\u87AA"], /* CJK Ideograph */
+ ["\u87AB", "\u87AB"], /* CJK Ideograph */
+ ["\u87AC", "\u87AC"], /* CJK Ideograph */
+ ["\u87AD", "\u87AD"], /* CJK Ideograph */
+ ["\u87AE", "\u87AE"], /* CJK Ideograph */
+ ["\u87AF", "\u87AF"], /* CJK Ideograph */
+ ["\u87B0", "\u87B0"], /* CJK Ideograph */
+ ["\u87B1", "\u87B1"], /* CJK Ideograph */
+ ["\u87B2", "\u87B2"], /* CJK Ideograph */
+ ["\u87B3", "\u87B3"], /* CJK Ideograph */
+ ["\u87B4", "\u87B4"], /* CJK Ideograph */
+ ["\u87B5", "\u87B5"], /* CJK Ideograph */
+ ["\u87B6", "\u87B6"], /* CJK Ideograph */
+ ["\u87B7", "\u87B7"], /* CJK Ideograph */
+ ["\u87B8", "\u87B8"], /* CJK Ideograph */
+ ["\u87B9", "\u87B9"], /* CJK Ideograph */
+ ["\u87BA", "\u87BA"], /* CJK Ideograph */
+ ["\u87BB", "\u87BB"], /* CJK Ideograph */
+ ["\u87BC", "\u87BC"], /* CJK Ideograph */
+ ["\u87BD", "\u87BD"], /* CJK Ideograph */
+ ["\u87BE", "\u87BE"], /* CJK Ideograph */
+ ["\u87BF", "\u87BF"], /* CJK Ideograph */
+ ["\u87C0", "\u87C0"], /* CJK Ideograph */
+ ["\u87C1", "\u87C1"], /* CJK Ideograph */
+ ["\u87C2", "\u87C2"], /* CJK Ideograph */
+ ["\u87C3", "\u87C3"], /* CJK Ideograph */
+ ["\u87C4", "\u87C4"], /* CJK Ideograph */
+ ["\u87C5", "\u87C5"], /* CJK Ideograph */
+ ["\u87C6", "\u87C6"], /* CJK Ideograph */
+ ["\u87C7", "\u87C7"], /* CJK Ideograph */
+ ["\u87C8", "\u87C8"], /* CJK Ideograph */
+ ["\u87C9", "\u87C9"], /* CJK Ideograph */
+ ["\u87CA", "\u87CA"], /* CJK Ideograph */
+ ["\u87CB", "\u87CB"], /* CJK Ideograph */
+ ["\u87CC", "\u87CC"], /* CJK Ideograph */
+ ["\u87CD", "\u87CD"], /* CJK Ideograph */
+ ["\u87CE", "\u87CE"], /* CJK Ideograph */
+ ["\u87CF", "\u87CF"], /* CJK Ideograph */
+ ["\u87D0", "\u87D0"], /* CJK Ideograph */
+ ["\u87D1", "\u87D1"], /* CJK Ideograph */
+ ["\u87D2", "\u87D2"], /* CJK Ideograph */
+ ["\u87D3", "\u87D3"], /* CJK Ideograph */
+ ["\u87D4", "\u87D4"], /* CJK Ideograph */
+ ["\u87D5", "\u87D5"], /* CJK Ideograph */
+ ["\u87D6", "\u87D6"], /* CJK Ideograph */
+ ["\u87D7", "\u87D7"], /* CJK Ideograph */
+ ["\u87D8", "\u87D8"], /* CJK Ideograph */
+ ["\u87D9", "\u87D9"], /* CJK Ideograph */
+ ["\u87DA", "\u87DA"], /* CJK Ideograph */
+ ["\u87DB", "\u87DB"], /* CJK Ideograph */
+ ["\u87DC", "\u87DC"], /* CJK Ideograph */
+ ["\u87DD", "\u87DD"], /* CJK Ideograph */
+ ["\u87DE", "\u87DE"], /* CJK Ideograph */
+ ["\u87DF", "\u87DF"], /* CJK Ideograph */
+ ["\u87E0", "\u87E0"], /* CJK Ideograph */
+ ["\u87E1", "\u87E1"], /* CJK Ideograph */
+ ["\u87E2", "\u87E2"], /* CJK Ideograph */
+ ["\u87E3", "\u87E3"], /* CJK Ideograph */
+ ["\u87E4", "\u87E4"], /* CJK Ideograph */
+ ["\u87E5", "\u87E5"], /* CJK Ideograph */
+ ["\u87E6", "\u87E6"], /* CJK Ideograph */
+ ["\u87E7", "\u87E7"], /* CJK Ideograph */
+ ["\u87E8", "\u87E8"], /* CJK Ideograph */
+ ["\u87E9", "\u87E9"], /* CJK Ideograph */
+ ["\u87EA", "\u87EA"], /* CJK Ideograph */
+ ["\u87EB", "\u87EB"], /* CJK Ideograph */
+ ["\u87EC", "\u87EC"], /* CJK Ideograph */
+ ["\u87ED", "\u87ED"], /* CJK Ideograph */
+ ["\u87EE", "\u87EE"], /* CJK Ideograph */
+ ["\u87EF", "\u87EF"], /* CJK Ideograph */
+ ["\u87F0", "\u87F0"], /* CJK Ideograph */
+ ["\u87F1", "\u87F1"], /* CJK Ideograph */
+ ["\u87F2", "\u87F2"], /* CJK Ideograph */
+ ["\u87F3", "\u87F3"], /* CJK Ideograph */
+ ["\u87F4", "\u87F4"], /* CJK Ideograph */
+ ["\u87F5", "\u87F5"], /* CJK Ideograph */
+ ["\u87F6", "\u87F6"], /* CJK Ideograph */
+ ["\u87F7", "\u87F7"], /* CJK Ideograph */
+ ["\u87F8", "\u87F8"], /* CJK Ideograph */
+ ["\u87F9", "\u87F9"], /* CJK Ideograph */
+ ["\u87FA", "\u87FA"], /* CJK Ideograph */
+ ["\u87FB", "\u87FB"], /* CJK Ideograph */
+ ["\u87FC", "\u87FC"], /* CJK Ideograph */
+ ["\u87FD", "\u87FD"], /* CJK Ideograph */
+ ["\u87FE", "\u87FE"], /* CJK Ideograph */
+ ["\u87FF", "\u87FF"], /* CJK Ideograph */
+ ["\u8800", "\u8800"], /* CJK Ideograph */
+ ["\u8801", "\u8801"], /* CJK Ideograph */
+ ["\u8802", "\u8802"], /* CJK Ideograph */
+ ["\u8803", "\u8803"], /* CJK Ideograph */
+ ["\u8804", "\u8804"], /* CJK Ideograph */
+ ["\u8805", "\u8805"], /* CJK Ideograph */
+ ["\u8806", "\u8806"], /* CJK Ideograph */
+ ["\u8807", "\u8807"], /* CJK Ideograph */
+ ["\u8808", "\u8808"], /* CJK Ideograph */
+ ["\u8809", "\u8809"], /* CJK Ideograph */
+ ["\u880A", "\u880A"], /* CJK Ideograph */
+ ["\u880B", "\u880B"], /* CJK Ideograph */
+ ["\u880C", "\u880C"], /* CJK Ideograph */
+ ["\u880D", "\u880D"], /* CJK Ideograph */
+ ["\u880E", "\u880E"], /* CJK Ideograph */
+ ["\u880F", "\u880F"], /* CJK Ideograph */
+ ["\u8810", "\u8810"], /* CJK Ideograph */
+ ["\u8811", "\u8811"], /* CJK Ideograph */
+ ["\u8812", "\u8812"], /* CJK Ideograph */
+ ["\u8813", "\u8813"], /* CJK Ideograph */
+ ["\u8814", "\u8814"], /* CJK Ideograph */
+ ["\u8815", "\u8815"], /* CJK Ideograph */
+ ["\u8816", "\u8816"], /* CJK Ideograph */
+ ["\u8817", "\u8817"], /* CJK Ideograph */
+ ["\u8818", "\u8818"], /* CJK Ideograph */
+ ["\u8819", "\u8819"], /* CJK Ideograph */
+ ["\u881A", "\u881A"], /* CJK Ideograph */
+ ["\u881B", "\u881B"], /* CJK Ideograph */
+ ["\u881C", "\u881C"], /* CJK Ideograph */
+ ["\u881D", "\u881D"], /* CJK Ideograph */
+ ["\u881E", "\u881E"], /* CJK Ideograph */
+ ["\u881F", "\u881F"], /* CJK Ideograph */
+ ["\u8820", "\u8820"], /* CJK Ideograph */
+ ["\u8821", "\u8821"], /* CJK Ideograph */
+ ["\u8822", "\u8822"], /* CJK Ideograph */
+ ["\u8823", "\u8823"], /* CJK Ideograph */
+ ["\u8824", "\u8824"], /* CJK Ideograph */
+ ["\u8825", "\u8825"], /* CJK Ideograph */
+ ["\u8826", "\u8826"], /* CJK Ideograph */
+ ["\u8827", "\u8827"], /* CJK Ideograph */
+ ["\u8828", "\u8828"], /* CJK Ideograph */
+ ["\u8829", "\u8829"], /* CJK Ideograph */
+ ["\u882A", "\u882A"], /* CJK Ideograph */
+ ["\u882B", "\u882B"], /* CJK Ideograph */
+ ["\u882C", "\u882C"], /* CJK Ideograph */
+ ["\u882D", "\u882D"], /* CJK Ideograph */
+ ["\u882E", "\u882E"], /* CJK Ideograph */
+ ["\u882F", "\u882F"], /* CJK Ideograph */
+ ["\u8830", "\u8830"], /* CJK Ideograph */
+ ["\u8831", "\u8831"], /* CJK Ideograph */
+ ["\u8832", "\u8832"], /* CJK Ideograph */
+ ["\u8833", "\u8833"], /* CJK Ideograph */
+ ["\u8834", "\u8834"], /* CJK Ideograph */
+ ["\u8835", "\u8835"], /* CJK Ideograph */
+ ["\u8836", "\u8836"], /* CJK Ideograph */
+ ["\u8837", "\u8837"], /* CJK Ideograph */
+ ["\u8838", "\u8838"], /* CJK Ideograph */
+ ["\u8839", "\u8839"], /* CJK Ideograph */
+ ["\u883A", "\u883A"], /* CJK Ideograph */
+ ["\u883B", "\u883B"], /* CJK Ideograph */
+ ["\u883C", "\u883C"], /* CJK Ideograph */
+ ["\u883D", "\u883D"], /* CJK Ideograph */
+ ["\u883E", "\u883E"], /* CJK Ideograph */
+ ["\u883F", "\u883F"], /* CJK Ideograph */
+ ["\u8840", "\u8840"], /* CJK Ideograph */
+ ["\u8841", "\u8841"], /* CJK Ideograph */
+ ["\u8842", "\u8842"], /* CJK Ideograph */
+ ["\u8843", "\u8843"], /* CJK Ideograph */
+ ["\u8844", "\u8844"], /* CJK Ideograph */
+ ["\u8845", "\u8845"], /* CJK Ideograph */
+ ["\u8846", "\u8846"], /* CJK Ideograph */
+ ["\u8847", "\u8847"], /* CJK Ideograph */
+ ["\u8848", "\u8848"], /* CJK Ideograph */
+ ["\u8849", "\u8849"], /* CJK Ideograph */
+ ["\u884A", "\u884A"], /* CJK Ideograph */
+ ["\u884B", "\u884B"], /* CJK Ideograph */
+ ["\u884C", "\u884C"], /* CJK Ideograph */
+ ["\u884D", "\u884D"], /* CJK Ideograph */
+ ["\u884E", "\u884E"], /* CJK Ideograph */
+ ["\u884F", "\u884F"], /* CJK Ideograph */
+ ["\u8850", "\u8850"], /* CJK Ideograph */
+ ["\u8851", "\u8851"], /* CJK Ideograph */
+ ["\u8852", "\u8852"], /* CJK Ideograph */
+ ["\u8853", "\u8853"], /* CJK Ideograph */
+ ["\u8854", "\u8854"], /* CJK Ideograph */
+ ["\u8855", "\u8855"], /* CJK Ideograph */
+ ["\u8856", "\u8856"], /* CJK Ideograph */
+ ["\u8857", "\u8857"], /* CJK Ideograph */
+ ["\u8858", "\u8858"], /* CJK Ideograph */
+ ["\u8859", "\u8859"], /* CJK Ideograph */
+ ["\u885A", "\u885A"], /* CJK Ideograph */
+ ["\u885B", "\u885B"], /* CJK Ideograph */
+ ["\u885C", "\u885C"], /* CJK Ideograph */
+ ["\u885D", "\u885D"], /* CJK Ideograph */
+ ["\u885E", "\u885E"], /* CJK Ideograph */
+ ["\u885F", "\u885F"], /* CJK Ideograph */
+ ["\u8860", "\u8860"], /* CJK Ideograph */
+ ["\u8861", "\u8861"], /* CJK Ideograph */
+ ["\u8862", "\u8862"], /* CJK Ideograph */
+ ["\u8863", "\u8863"], /* CJK Ideograph */
+ ["\u8864", "\u8864"], /* CJK Ideograph */
+ ["\u8865", "\u8865"], /* CJK Ideograph */
+ ["\u8866", "\u8866"], /* CJK Ideograph */
+ ["\u8867", "\u8867"], /* CJK Ideograph */
+ ["\u8868", "\u8868"], /* CJK Ideograph */
+ ["\u8869", "\u8869"], /* CJK Ideograph */
+ ["\u886A", "\u886A"], /* CJK Ideograph */
+ ["\u886B", "\u886B"], /* CJK Ideograph */
+ ["\u886C", "\u886C"], /* CJK Ideograph */
+ ["\u886D", "\u886D"], /* CJK Ideograph */
+ ["\u886E", "\u886E"], /* CJK Ideograph */
+ ["\u886F", "\u886F"], /* CJK Ideograph */
+ ["\u8870", "\u8870"], /* CJK Ideograph */
+ ["\u8871", "\u8871"], /* CJK Ideograph */
+ ["\u8872", "\u8872"], /* CJK Ideograph */
+ ["\u8873", "\u8873"], /* CJK Ideograph */
+ ["\u8874", "\u8874"], /* CJK Ideograph */
+ ["\u8875", "\u8875"], /* CJK Ideograph */
+ ["\u8876", "\u8876"], /* CJK Ideograph */
+ ["\u8877", "\u8877"], /* CJK Ideograph */
+ ["\u8878", "\u8878"], /* CJK Ideograph */
+ ["\u8879", "\u8879"], /* CJK Ideograph */
+ ["\u887A", "\u887A"], /* CJK Ideograph */
+ ["\u887B", "\u887B"], /* CJK Ideograph */
+ ["\u887C", "\u887C"], /* CJK Ideograph */
+ ["\u887D", "\u887D"], /* CJK Ideograph */
+ ["\u887E", "\u887E"], /* CJK Ideograph */
+ ["\u887F", "\u887F"], /* CJK Ideograph */
+ ["\u8880", "\u8880"], /* CJK Ideograph */
+ ["\u8881", "\u8881"], /* CJK Ideograph */
+ ["\u8882", "\u8882"], /* CJK Ideograph */
+ ["\u8883", "\u8883"], /* CJK Ideograph */
+ ["\u8884", "\u8884"], /* CJK Ideograph */
+ ["\u8885", "\u8885"], /* CJK Ideograph */
+ ["\u8886", "\u8886"], /* CJK Ideograph */
+ ["\u8887", "\u8887"], /* CJK Ideograph */
+ ["\u8888", "\u8888"], /* CJK Ideograph */
+ ["\u8889", "\u8889"], /* CJK Ideograph */
+ ["\u888A", "\u888A"], /* CJK Ideograph */
+ ["\u888B", "\u888B"], /* CJK Ideograph */
+ ["\u888C", "\u888C"], /* CJK Ideograph */
+ ["\u888D", "\u888D"], /* CJK Ideograph */
+ ["\u888E", "\u888E"], /* CJK Ideograph */
+ ["\u888F", "\u888F"], /* CJK Ideograph */
+ ["\u8890", "\u8890"], /* CJK Ideograph */
+ ["\u8891", "\u8891"], /* CJK Ideograph */
+ ["\u8892", "\u8892"], /* CJK Ideograph */
+ ["\u8893", "\u8893"], /* CJK Ideograph */
+ ["\u8894", "\u8894"], /* CJK Ideograph */
+ ["\u8895", "\u8895"], /* CJK Ideograph */
+ ["\u8896", "\u8896"], /* CJK Ideograph */
+ ["\u8897", "\u8897"], /* CJK Ideograph */
+ ["\u8898", "\u8898"], /* CJK Ideograph */
+ ["\u8899", "\u8899"], /* CJK Ideograph */
+ ["\u889A", "\u889A"], /* CJK Ideograph */
+ ["\u889B", "\u889B"], /* CJK Ideograph */
+ ["\u889C", "\u889C"], /* CJK Ideograph */
+ ["\u889D", "\u889D"], /* CJK Ideograph */
+ ["\u889E", "\u889E"], /* CJK Ideograph */
+ ["\u889F", "\u889F"], /* CJK Ideograph */
+ ["\u88A0", "\u88A0"], /* CJK Ideograph */
+ ["\u88A1", "\u88A1"], /* CJK Ideograph */
+ ["\u88A2", "\u88A2"], /* CJK Ideograph */
+ ["\u88A3", "\u88A3"], /* CJK Ideograph */
+ ["\u88A4", "\u88A4"], /* CJK Ideograph */
+ ["\u88A5", "\u88A5"], /* CJK Ideograph */
+ ["\u88A6", "\u88A6"], /* CJK Ideograph */
+ ["\u88A7", "\u88A7"], /* CJK Ideograph */
+ ["\u88A8", "\u88A8"], /* CJK Ideograph */
+ ["\u88A9", "\u88A9"], /* CJK Ideograph */
+ ["\u88AA", "\u88AA"], /* CJK Ideograph */
+ ["\u88AB", "\u88AB"], /* CJK Ideograph */
+ ["\u88AC", "\u88AC"], /* CJK Ideograph */
+ ["\u88AD", "\u88AD"], /* CJK Ideograph */
+ ["\u88AE", "\u88AE"], /* CJK Ideograph */
+ ["\u88AF", "\u88AF"], /* CJK Ideograph */
+ ["\u88B0", "\u88B0"], /* CJK Ideograph */
+ ["\u88B1", "\u88B1"], /* CJK Ideograph */
+ ["\u88B2", "\u88B2"], /* CJK Ideograph */
+ ["\u88B3", "\u88B3"], /* CJK Ideograph */
+ ["\u88B4", "\u88B4"], /* CJK Ideograph */
+ ["\u88B5", "\u88B5"], /* CJK Ideograph */
+ ["\u88B6", "\u88B6"], /* CJK Ideograph */
+ ["\u88B7", "\u88B7"], /* CJK Ideograph */
+ ["\u88B8", "\u88B8"], /* CJK Ideograph */
+ ["\u88B9", "\u88B9"], /* CJK Ideograph */
+ ["\u88BA", "\u88BA"], /* CJK Ideograph */
+ ["\u88BB", "\u88BB"], /* CJK Ideograph */
+ ["\u88BC", "\u88BC"], /* CJK Ideograph */
+ ["\u88BD", "\u88BD"], /* CJK Ideograph */
+ ["\u88BE", "\u88BE"], /* CJK Ideograph */
+ ["\u88BF", "\u88BF"], /* CJK Ideograph */
+ ["\u88C0", "\u88C0"], /* CJK Ideograph */
+ ["\u88C1", "\u88C1"], /* CJK Ideograph */
+ ["\u88C2", "\u88C2"], /* CJK Ideograph */
+ ["\u88C3", "\u88C3"], /* CJK Ideograph */
+ ["\u88C4", "\u88C4"], /* CJK Ideograph */
+ ["\u88C5", "\u88C5"], /* CJK Ideograph */
+ ["\u88C6", "\u88C6"], /* CJK Ideograph */
+ ["\u88C7", "\u88C7"], /* CJK Ideograph */
+ ["\u88C8", "\u88C8"], /* CJK Ideograph */
+ ["\u88C9", "\u88C9"], /* CJK Ideograph */
+ ["\u88CA", "\u88CA"], /* CJK Ideograph */
+ ["\u88CB", "\u88CB"], /* CJK Ideograph */
+ ["\u88CC", "\u88CC"], /* CJK Ideograph */
+ ["\u88CD", "\u88CD"], /* CJK Ideograph */
+ ["\u88CE", "\u88CE"], /* CJK Ideograph */
+ ["\u88CF", "\u88CF"], /* CJK Ideograph */
+ ["\u88D0", "\u88D0"], /* CJK Ideograph */
+ ["\u88D1", "\u88D1"], /* CJK Ideograph */
+ ["\u88D2", "\u88D2"], /* CJK Ideograph */
+ ["\u88D3", "\u88D3"], /* CJK Ideograph */
+ ["\u88D4", "\u88D4"], /* CJK Ideograph */
+ ["\u88D5", "\u88D5"], /* CJK Ideograph */
+ ["\u88D6", "\u88D6"], /* CJK Ideograph */
+ ["\u88D7", "\u88D7"], /* CJK Ideograph */
+ ["\u88D8", "\u88D8"], /* CJK Ideograph */
+ ["\u88D9", "\u88D9"], /* CJK Ideograph */
+ ["\u88DA", "\u88DA"], /* CJK Ideograph */
+ ["\u88DB", "\u88DB"], /* CJK Ideograph */
+ ["\u88DC", "\u88DC"], /* CJK Ideograph */
+ ["\u88DD", "\u88DD"], /* CJK Ideograph */
+ ["\u88DE", "\u88DE"], /* CJK Ideograph */
+ ["\u88DF", "\u88DF"], /* CJK Ideograph */
+ ["\u88E0", "\u88E0"], /* CJK Ideograph */
+ ["\u88E1", "\u88E1"], /* CJK Ideograph */
+ ["\u88E2", "\u88E2"], /* CJK Ideograph */
+ ["\u88E3", "\u88E3"], /* CJK Ideograph */
+ ["\u88E4", "\u88E4"], /* CJK Ideograph */
+ ["\u88E5", "\u88E5"], /* CJK Ideograph */
+ ["\u88E6", "\u88E6"], /* CJK Ideograph */
+ ["\u88E7", "\u88E7"], /* CJK Ideograph */
+ ["\u88E8", "\u88E8"], /* CJK Ideograph */
+ ["\u88E9", "\u88E9"], /* CJK Ideograph */
+ ["\u88EA", "\u88EA"], /* CJK Ideograph */
+ ["\u88EB", "\u88EB"], /* CJK Ideograph */
+ ["\u88EC", "\u88EC"], /* CJK Ideograph */
+ ["\u88ED", "\u88ED"], /* CJK Ideograph */
+ ["\u88EE", "\u88EE"], /* CJK Ideograph */
+ ["\u88EF", "\u88EF"], /* CJK Ideograph */
+ ["\u88F0", "\u88F0"], /* CJK Ideograph */
+ ["\u88F1", "\u88F1"], /* CJK Ideograph */
+ ["\u88F2", "\u88F2"], /* CJK Ideograph */
+ ["\u88F3", "\u88F3"], /* CJK Ideograph */
+ ["\u88F4", "\u88F4"], /* CJK Ideograph */
+ ["\u88F5", "\u88F5"], /* CJK Ideograph */
+ ["\u88F6", "\u88F6"], /* CJK Ideograph */
+ ["\u88F7", "\u88F7"], /* CJK Ideograph */
+ ["\u88F8", "\u88F8"], /* CJK Ideograph */
+ ["\u88F9", "\u88F9"], /* CJK Ideograph */
+ ["\u88FA", "\u88FA"], /* CJK Ideograph */
+ ["\u88FB", "\u88FB"], /* CJK Ideograph */
+ ["\u88FC", "\u88FC"], /* CJK Ideograph */
+ ["\u88FD", "\u88FD"], /* CJK Ideograph */
+ ["\u88FE", "\u88FE"], /* CJK Ideograph */
+ ["\u88FF", "\u88FF"], /* CJK Ideograph */
+ ["\u8900", "\u8900"], /* CJK Ideograph */
+ ["\u8901", "\u8901"], /* CJK Ideograph */
+ ["\u8902", "\u8902"], /* CJK Ideograph */
+ ["\u8903", "\u8903"], /* CJK Ideograph */
+ ["\u8904", "\u8904"], /* CJK Ideograph */
+ ["\u8905", "\u8905"], /* CJK Ideograph */
+ ["\u8906", "\u8906"], /* CJK Ideograph */
+ ["\u8907", "\u8907"], /* CJK Ideograph */
+ ["\u8908", "\u8908"], /* CJK Ideograph */
+ ["\u8909", "\u8909"], /* CJK Ideograph */
+ ["\u890A", "\u890A"], /* CJK Ideograph */
+ ["\u890B", "\u890B"], /* CJK Ideograph */
+ ["\u890C", "\u890C"], /* CJK Ideograph */
+ ["\u890D", "\u890D"], /* CJK Ideograph */
+ ["\u890E", "\u890E"], /* CJK Ideograph */
+ ["\u890F", "\u890F"], /* CJK Ideograph */
+ ["\u8910", "\u8910"], /* CJK Ideograph */
+ ["\u8911", "\u8911"], /* CJK Ideograph */
+ ["\u8912", "\u8912"], /* CJK Ideograph */
+ ["\u8913", "\u8913"], /* CJK Ideograph */
+ ["\u8914", "\u8914"], /* CJK Ideograph */
+ ["\u8915", "\u8915"], /* CJK Ideograph */
+ ["\u8916", "\u8916"], /* CJK Ideograph */
+ ["\u8917", "\u8917"], /* CJK Ideograph */
+ ["\u8918", "\u8918"], /* CJK Ideograph */
+ ["\u8919", "\u8919"], /* CJK Ideograph */
+ ["\u891A", "\u891A"], /* CJK Ideograph */
+ ["\u891B", "\u891B"], /* CJK Ideograph */
+ ["\u891C", "\u891C"], /* CJK Ideograph */
+ ["\u891D", "\u891D"], /* CJK Ideograph */
+ ["\u891E", "\u891E"], /* CJK Ideograph */
+ ["\u891F", "\u891F"], /* CJK Ideograph */
+ ["\u8920", "\u8920"], /* CJK Ideograph */
+ ["\u8921", "\u8921"], /* CJK Ideograph */
+ ["\u8922", "\u8922"], /* CJK Ideograph */
+ ["\u8923", "\u8923"], /* CJK Ideograph */
+ ["\u8924", "\u8924"], /* CJK Ideograph */
+ ["\u8925", "\u8925"], /* CJK Ideograph */
+ ["\u8926", "\u8926"], /* CJK Ideograph */
+ ["\u8927", "\u8927"], /* CJK Ideograph */
+ ["\u8928", "\u8928"], /* CJK Ideograph */
+ ["\u8929", "\u8929"], /* CJK Ideograph */
+ ["\u892A", "\u892A"], /* CJK Ideograph */
+ ["\u892B", "\u892B"], /* CJK Ideograph */
+ ["\u892C", "\u892C"], /* CJK Ideograph */
+ ["\u892D", "\u892D"], /* CJK Ideograph */
+ ["\u892E", "\u892E"], /* CJK Ideograph */
+ ["\u892F", "\u892F"], /* CJK Ideograph */
+ ["\u8930", "\u8930"], /* CJK Ideograph */
+ ["\u8931", "\u8931"], /* CJK Ideograph */
+ ["\u8932", "\u8932"], /* CJK Ideograph */
+ ["\u8933", "\u8933"], /* CJK Ideograph */
+ ["\u8934", "\u8934"], /* CJK Ideograph */
+ ["\u8935", "\u8935"], /* CJK Ideograph */
+ ["\u8936", "\u8936"], /* CJK Ideograph */
+ ["\u8937", "\u8937"], /* CJK Ideograph */
+ ["\u8938", "\u8938"], /* CJK Ideograph */
+ ["\u8939", "\u8939"], /* CJK Ideograph */
+ ["\u893A", "\u893A"], /* CJK Ideograph */
+ ["\u893B", "\u893B"], /* CJK Ideograph */
+ ["\u893C", "\u893C"], /* CJK Ideograph */
+ ["\u893D", "\u893D"], /* CJK Ideograph */
+ ["\u893E", "\u893E"], /* CJK Ideograph */
+ ["\u893F", "\u893F"], /* CJK Ideograph */
+ ["\u8940", "\u8940"], /* CJK Ideograph */
+ ["\u8941", "\u8941"], /* CJK Ideograph */
+ ["\u8942", "\u8942"], /* CJK Ideograph */
+ ["\u8943", "\u8943"], /* CJK Ideograph */
+ ["\u8944", "\u8944"], /* CJK Ideograph */
+ ["\u8945", "\u8945"], /* CJK Ideograph */
+ ["\u8946", "\u8946"], /* CJK Ideograph */
+ ["\u8947", "\u8947"], /* CJK Ideograph */
+ ["\u8948", "\u8948"], /* CJK Ideograph */
+ ["\u8949", "\u8949"], /* CJK Ideograph */
+ ["\u894A", "\u894A"], /* CJK Ideograph */
+ ["\u894B", "\u894B"], /* CJK Ideograph */
+ ["\u894C", "\u894C"], /* CJK Ideograph */
+ ["\u894D", "\u894D"], /* CJK Ideograph */
+ ["\u894E", "\u894E"], /* CJK Ideograph */
+ ["\u894F", "\u894F"], /* CJK Ideograph */
+ ["\u8950", "\u8950"], /* CJK Ideograph */
+ ["\u8951", "\u8951"], /* CJK Ideograph */
+ ["\u8952", "\u8952"], /* CJK Ideograph */
+ ["\u8953", "\u8953"], /* CJK Ideograph */
+ ["\u8954", "\u8954"], /* CJK Ideograph */
+ ["\u8955", "\u8955"], /* CJK Ideograph */
+ ["\u8956", "\u8956"], /* CJK Ideograph */
+ ["\u8957", "\u8957"], /* CJK Ideograph */
+ ["\u8958", "\u8958"], /* CJK Ideograph */
+ ["\u8959", "\u8959"], /* CJK Ideograph */
+ ["\u895A", "\u895A"], /* CJK Ideograph */
+ ["\u895B", "\u895B"], /* CJK Ideograph */
+ ["\u895C", "\u895C"], /* CJK Ideograph */
+ ["\u895D", "\u895D"], /* CJK Ideograph */
+ ["\u895E", "\u895E"], /* CJK Ideograph */
+ ["\u895F", "\u895F"], /* CJK Ideograph */
+ ["\u8960", "\u8960"], /* CJK Ideograph */
+ ["\u8961", "\u8961"], /* CJK Ideograph */
+ ["\u8962", "\u8962"], /* CJK Ideograph */
+ ["\u8963", "\u8963"], /* CJK Ideograph */
+ ["\u8964", "\u8964"], /* CJK Ideograph */
+ ["\u8965", "\u8965"], /* CJK Ideograph */
+ ["\u8966", "\u8966"], /* CJK Ideograph */
+ ["\u8967", "\u8967"], /* CJK Ideograph */
+ ["\u8968", "\u8968"], /* CJK Ideograph */
+ ["\u8969", "\u8969"], /* CJK Ideograph */
+ ["\u896A", "\u896A"], /* CJK Ideograph */
+ ["\u896B", "\u896B"], /* CJK Ideograph */
+ ["\u896C", "\u896C"], /* CJK Ideograph */
+ ["\u896D", "\u896D"], /* CJK Ideograph */
+ ["\u896E", "\u896E"], /* CJK Ideograph */
+ ["\u896F", "\u896F"], /* CJK Ideograph */
+ ["\u8970", "\u8970"], /* CJK Ideograph */
+ ["\u8971", "\u8971"], /* CJK Ideograph */
+ ["\u8972", "\u8972"], /* CJK Ideograph */
+ ["\u8973", "\u8973"], /* CJK Ideograph */
+ ["\u8974", "\u8974"], /* CJK Ideograph */
+ ["\u8975", "\u8975"], /* CJK Ideograph */
+ ["\u8976", "\u8976"], /* CJK Ideograph */
+ ["\u8977", "\u8977"], /* CJK Ideograph */
+ ["\u8978", "\u8978"], /* CJK Ideograph */
+ ["\u8979", "\u8979"], /* CJK Ideograph */
+ ["\u897A", "\u897A"], /* CJK Ideograph */
+ ["\u897B", "\u897B"], /* CJK Ideograph */
+ ["\u897C", "\u897C"], /* CJK Ideograph */
+ ["\u897D", "\u897D"], /* CJK Ideograph */
+ ["\u897E", "\u897E"], /* CJK Ideograph */
+ ["\u897F", "\u897F"], /* CJK Ideograph */
+ ["\u8980", "\u8980"], /* CJK Ideograph */
+ ["\u8981", "\u8981"], /* CJK Ideograph */
+ ["\u8982", "\u8982"], /* CJK Ideograph */
+ ["\u8983", "\u8983"], /* CJK Ideograph */
+ ["\u8984", "\u8984"], /* CJK Ideograph */
+ ["\u8985", "\u8985"], /* CJK Ideograph */
+ ["\u8986", "\u8986"], /* CJK Ideograph */
+ ["\u8987", "\u8987"], /* CJK Ideograph */
+ ["\u8988", "\u8988"], /* CJK Ideograph */
+ ["\u8989", "\u8989"], /* CJK Ideograph */
+ ["\u898A", "\u898A"], /* CJK Ideograph */
+ ["\u898B", "\u898B"], /* CJK Ideograph */
+ ["\u898C", "\u898C"], /* CJK Ideograph */
+ ["\u898D", "\u898D"], /* CJK Ideograph */
+ ["\u898E", "\u898E"], /* CJK Ideograph */
+ ["\u898F", "\u898F"], /* CJK Ideograph */
+ ["\u8990", "\u8990"], /* CJK Ideograph */
+ ["\u8991", "\u8991"], /* CJK Ideograph */
+ ["\u8992", "\u8992"], /* CJK Ideograph */
+ ["\u8993", "\u8993"], /* CJK Ideograph */
+ ["\u8994", "\u8994"], /* CJK Ideograph */
+ ["\u8995", "\u8995"], /* CJK Ideograph */
+ ["\u8996", "\u8996"], /* CJK Ideograph */
+ ["\u8997", "\u8997"], /* CJK Ideograph */
+ ["\u8998", "\u8998"], /* CJK Ideograph */
+ ["\u8999", "\u8999"], /* CJK Ideograph */
+ ["\u899A", "\u899A"], /* CJK Ideograph */
+ ["\u899B", "\u899B"], /* CJK Ideograph */
+ ["\u899C", "\u899C"], /* CJK Ideograph */
+ ["\u899D", "\u899D"], /* CJK Ideograph */
+ ["\u899E", "\u899E"], /* CJK Ideograph */
+ ["\u899F", "\u899F"], /* CJK Ideograph */
+ ["\u89A0", "\u89A0"], /* CJK Ideograph */
+ ["\u89A1", "\u89A1"], /* CJK Ideograph */
+ ["\u89A2", "\u89A2"], /* CJK Ideograph */
+ ["\u89A3", "\u89A3"], /* CJK Ideograph */
+ ["\u89A4", "\u89A4"], /* CJK Ideograph */
+ ["\u89A5", "\u89A5"], /* CJK Ideograph */
+ ["\u89A6", "\u89A6"], /* CJK Ideograph */
+ ["\u89A7", "\u89A7"], /* CJK Ideograph */
+ ["\u89A8", "\u89A8"], /* CJK Ideograph */
+ ["\u89A9", "\u89A9"], /* CJK Ideograph */
+ ["\u89AA", "\u89AA"], /* CJK Ideograph */
+ ["\u89AB", "\u89AB"], /* CJK Ideograph */
+ ["\u89AC", "\u89AC"], /* CJK Ideograph */
+ ["\u89AD", "\u89AD"], /* CJK Ideograph */
+ ["\u89AE", "\u89AE"], /* CJK Ideograph */
+ ["\u89AF", "\u89AF"], /* CJK Ideograph */
+ ["\u89B0", "\u89B0"], /* CJK Ideograph */
+ ["\u89B1", "\u89B1"], /* CJK Ideograph */
+ ["\u89B2", "\u89B2"], /* CJK Ideograph */
+ ["\u89B3", "\u89B3"], /* CJK Ideograph */
+ ["\u89B4", "\u89B4"], /* CJK Ideograph */
+ ["\u89B5", "\u89B5"], /* CJK Ideograph */
+ ["\u89B6", "\u89B6"], /* CJK Ideograph */
+ ["\u89B7", "\u89B7"], /* CJK Ideograph */
+ ["\u89B8", "\u89B8"], /* CJK Ideograph */
+ ["\u89B9", "\u89B9"], /* CJK Ideograph */
+ ["\u89BA", "\u89BA"], /* CJK Ideograph */
+ ["\u89BB", "\u89BB"], /* CJK Ideograph */
+ ["\u89BC", "\u89BC"], /* CJK Ideograph */
+ ["\u89BD", "\u89BD"], /* CJK Ideograph */
+ ["\u89BE", "\u89BE"], /* CJK Ideograph */
+ ["\u89BF", "\u89BF"], /* CJK Ideograph */
+ ["\u89C0", "\u89C0"], /* CJK Ideograph */
+ ["\u89C1", "\u89C1"], /* CJK Ideograph */
+ ["\u89C2", "\u89C2"], /* CJK Ideograph */
+ ["\u89C3", "\u89C3"], /* CJK Ideograph */
+ ["\u89C4", "\u89C4"], /* CJK Ideograph */
+ ["\u89C5", "\u89C5"], /* CJK Ideograph */
+ ["\u89C6", "\u89C6"], /* CJK Ideograph */
+ ["\u89C7", "\u89C7"], /* CJK Ideograph */
+ ["\u89C8", "\u89C8"], /* CJK Ideograph */
+ ["\u89C9", "\u89C9"], /* CJK Ideograph */
+ ["\u89CA", "\u89CA"], /* CJK Ideograph */
+ ["\u89CB", "\u89CB"], /* CJK Ideograph */
+ ["\u89CC", "\u89CC"], /* CJK Ideograph */
+ ["\u89CD", "\u89CD"], /* CJK Ideograph */
+ ["\u89CE", "\u89CE"], /* CJK Ideograph */
+ ["\u89CF", "\u89CF"], /* CJK Ideograph */
+ ["\u89D0", "\u89D0"], /* CJK Ideograph */
+ ["\u89D1", "\u89D1"], /* CJK Ideograph */
+ ["\u89D2", "\u89D2"], /* CJK Ideograph */
+ ["\u89D3", "\u89D3"], /* CJK Ideograph */
+ ["\u89D4", "\u89D4"], /* CJK Ideograph */
+ ["\u89D5", "\u89D5"], /* CJK Ideograph */
+ ["\u89D6", "\u89D6"], /* CJK Ideograph */
+ ["\u89D7", "\u89D7"], /* CJK Ideograph */
+ ["\u89D8", "\u89D8"], /* CJK Ideograph */
+ ["\u89D9", "\u89D9"], /* CJK Ideograph */
+ ["\u89DA", "\u89DA"], /* CJK Ideograph */
+ ["\u89DB", "\u89DB"], /* CJK Ideograph */
+ ["\u89DC", "\u89DC"], /* CJK Ideograph */
+ ["\u89DD", "\u89DD"], /* CJK Ideograph */
+ ["\u89DE", "\u89DE"], /* CJK Ideograph */
+ ["\u89DF", "\u89DF"], /* CJK Ideograph */
+ ["\u89E0", "\u89E0"], /* CJK Ideograph */
+ ["\u89E1", "\u89E1"], /* CJK Ideograph */
+ ["\u89E2", "\u89E2"], /* CJK Ideograph */
+ ["\u89E3", "\u89E3"], /* CJK Ideograph */
+ ["\u89E4", "\u89E4"], /* CJK Ideograph */
+ ["\u89E5", "\u89E5"], /* CJK Ideograph */
+ ["\u89E6", "\u89E6"], /* CJK Ideograph */
+ ["\u89E7", "\u89E7"], /* CJK Ideograph */
+ ["\u89E8", "\u89E8"], /* CJK Ideograph */
+ ["\u89E9", "\u89E9"], /* CJK Ideograph */
+ ["\u89EA", "\u89EA"], /* CJK Ideograph */
+ ["\u89EB", "\u89EB"], /* CJK Ideograph */
+ ["\u89EC", "\u89EC"], /* CJK Ideograph */
+ ["\u89ED", "\u89ED"], /* CJK Ideograph */
+ ["\u89EE", "\u89EE"], /* CJK Ideograph */
+ ["\u89EF", "\u89EF"], /* CJK Ideograph */
+ ["\u89F0", "\u89F0"], /* CJK Ideograph */
+ ["\u89F1", "\u89F1"], /* CJK Ideograph */
+ ["\u89F2", "\u89F2"], /* CJK Ideograph */
+ ["\u89F3", "\u89F3"], /* CJK Ideograph */
+ ["\u89F4", "\u89F4"], /* CJK Ideograph */
+ ["\u89F5", "\u89F5"], /* CJK Ideograph */
+ ["\u89F6", "\u89F6"], /* CJK Ideograph */
+ ["\u89F7", "\u89F7"], /* CJK Ideograph */
+ ["\u89F8", "\u89F8"], /* CJK Ideograph */
+ ["\u89F9", "\u89F9"], /* CJK Ideograph */
+ ["\u89FA", "\u89FA"], /* CJK Ideograph */
+ ["\u89FB", "\u89FB"], /* CJK Ideograph */
+ ["\u89FC", "\u89FC"], /* CJK Ideograph */
+ ["\u89FD", "\u89FD"], /* CJK Ideograph */
+ ["\u89FE", "\u89FE"], /* CJK Ideograph */
+ ["\u89FF", "\u89FF"], /* CJK Ideograph */
+ ["\u8A00", "\u8A00"], /* CJK Ideograph */
+ ["\u8A01", "\u8A01"], /* CJK Ideograph */
+ ["\u8A02", "\u8A02"], /* CJK Ideograph */
+ ["\u8A03", "\u8A03"], /* CJK Ideograph */
+ ["\u8A04", "\u8A04"], /* CJK Ideograph */
+ ["\u8A05", "\u8A05"], /* CJK Ideograph */
+ ["\u8A06", "\u8A06"], /* CJK Ideograph */
+ ["\u8A07", "\u8A07"], /* CJK Ideograph */
+ ["\u8A08", "\u8A08"], /* CJK Ideograph */
+ ["\u8A09", "\u8A09"], /* CJK Ideograph */
+ ["\u8A0A", "\u8A0A"], /* CJK Ideograph */
+ ["\u8A0B", "\u8A0B"], /* CJK Ideograph */
+ ["\u8A0C", "\u8A0C"], /* CJK Ideograph */
+ ["\u8A0D", "\u8A0D"], /* CJK Ideograph */
+ ["\u8A0E", "\u8A0E"], /* CJK Ideograph */
+ ["\u8A0F", "\u8A0F"], /* CJK Ideograph */
+ ["\u8A10", "\u8A10"], /* CJK Ideograph */
+ ["\u8A11", "\u8A11"], /* CJK Ideograph */
+ ["\u8A12", "\u8A12"], /* CJK Ideograph */
+ ["\u8A13", "\u8A13"], /* CJK Ideograph */
+ ["\u8A14", "\u8A14"], /* CJK Ideograph */
+ ["\u8A15", "\u8A15"], /* CJK Ideograph */
+ ["\u8A16", "\u8A16"], /* CJK Ideograph */
+ ["\u8A17", "\u8A17"], /* CJK Ideograph */
+ ["\u8A18", "\u8A18"], /* CJK Ideograph */
+ ["\u8A19", "\u8A19"], /* CJK Ideograph */
+ ["\u8A1A", "\u8A1A"], /* CJK Ideograph */
+ ["\u8A1B", "\u8A1B"], /* CJK Ideograph */
+ ["\u8A1C", "\u8A1C"], /* CJK Ideograph */
+ ["\u8A1D", "\u8A1D"], /* CJK Ideograph */
+ ["\u8A1E", "\u8A1E"], /* CJK Ideograph */
+ ["\u8A1F", "\u8A1F"], /* CJK Ideograph */
+ ["\u8A20", "\u8A20"], /* CJK Ideograph */
+ ["\u8A21", "\u8A21"], /* CJK Ideograph */
+ ["\u8A22", "\u8A22"], /* CJK Ideograph */
+ ["\u8A23", "\u8A23"], /* CJK Ideograph */
+ ["\u8A24", "\u8A24"], /* CJK Ideograph */
+ ["\u8A25", "\u8A25"], /* CJK Ideograph */
+ ["\u8A26", "\u8A26"], /* CJK Ideograph */
+ ["\u8A27", "\u8A27"], /* CJK Ideograph */
+ ["\u8A28", "\u8A28"], /* CJK Ideograph */
+ ["\u8A29", "\u8A29"], /* CJK Ideograph */
+ ["\u8A2A", "\u8A2A"], /* CJK Ideograph */
+ ["\u8A2B", "\u8A2B"], /* CJK Ideograph */
+ ["\u8A2C", "\u8A2C"], /* CJK Ideograph */
+ ["\u8A2D", "\u8A2D"], /* CJK Ideograph */
+ ["\u8A2E", "\u8A2E"], /* CJK Ideograph */
+ ["\u8A2F", "\u8A2F"], /* CJK Ideograph */
+ ["\u8A30", "\u8A30"], /* CJK Ideograph */
+ ["\u8A31", "\u8A31"], /* CJK Ideograph */
+ ["\u8A32", "\u8A32"], /* CJK Ideograph */
+ ["\u8A33", "\u8A33"], /* CJK Ideograph */
+ ["\u8A34", "\u8A34"], /* CJK Ideograph */
+ ["\u8A35", "\u8A35"], /* CJK Ideograph */
+ ["\u8A36", "\u8A36"], /* CJK Ideograph */
+ ["\u8A37", "\u8A37"], /* CJK Ideograph */
+ ["\u8A38", "\u8A38"], /* CJK Ideograph */
+ ["\u8A39", "\u8A39"], /* CJK Ideograph */
+ ["\u8A3A", "\u8A3A"], /* CJK Ideograph */
+ ["\u8A3B", "\u8A3B"], /* CJK Ideograph */
+ ["\u8A3C", "\u8A3C"], /* CJK Ideograph */
+ ["\u8A3D", "\u8A3D"], /* CJK Ideograph */
+ ["\u8A3E", "\u8A3E"], /* CJK Ideograph */
+ ["\u8A3F", "\u8A3F"], /* CJK Ideograph */
+ ["\u8A40", "\u8A40"], /* CJK Ideograph */
+ ["\u8A41", "\u8A41"], /* CJK Ideograph */
+ ["\u8A42", "\u8A42"], /* CJK Ideograph */
+ ["\u8A43", "\u8A43"], /* CJK Ideograph */
+ ["\u8A44", "\u8A44"], /* CJK Ideograph */
+ ["\u8A45", "\u8A45"], /* CJK Ideograph */
+ ["\u8A46", "\u8A46"], /* CJK Ideograph */
+ ["\u8A47", "\u8A47"], /* CJK Ideograph */
+ ["\u8A48", "\u8A48"], /* CJK Ideograph */
+ ["\u8A49", "\u8A49"], /* CJK Ideograph */
+ ["\u8A4A", "\u8A4A"], /* CJK Ideograph */
+ ["\u8A4B", "\u8A4B"], /* CJK Ideograph */
+ ["\u8A4C", "\u8A4C"], /* CJK Ideograph */
+ ["\u8A4D", "\u8A4D"], /* CJK Ideograph */
+ ["\u8A4E", "\u8A4E"], /* CJK Ideograph */
+ ["\u8A4F", "\u8A4F"], /* CJK Ideograph */
+ ["\u8A50", "\u8A50"], /* CJK Ideograph */
+ ["\u8A51", "\u8A51"], /* CJK Ideograph */
+ ["\u8A52", "\u8A52"], /* CJK Ideograph */
+ ["\u8A53", "\u8A53"], /* CJK Ideograph */
+ ["\u8A54", "\u8A54"], /* CJK Ideograph */
+ ["\u8A55", "\u8A55"], /* CJK Ideograph */
+ ["\u8A56", "\u8A56"], /* CJK Ideograph */
+ ["\u8A57", "\u8A57"], /* CJK Ideograph */
+ ["\u8A58", "\u8A58"], /* CJK Ideograph */
+ ["\u8A59", "\u8A59"], /* CJK Ideograph */
+ ["\u8A5A", "\u8A5A"], /* CJK Ideograph */
+ ["\u8A5B", "\u8A5B"], /* CJK Ideograph */
+ ["\u8A5C", "\u8A5C"], /* CJK Ideograph */
+ ["\u8A5D", "\u8A5D"], /* CJK Ideograph */
+ ["\u8A5E", "\u8A5E"], /* CJK Ideograph */
+ ["\u8A5F", "\u8A5F"], /* CJK Ideograph */
+ ["\u8A60", "\u8A60"], /* CJK Ideograph */
+ ["\u8A61", "\u8A61"], /* CJK Ideograph */
+ ["\u8A62", "\u8A62"], /* CJK Ideograph */
+ ["\u8A63", "\u8A63"], /* CJK Ideograph */
+ ["\u8A64", "\u8A64"], /* CJK Ideograph */
+ ["\u8A65", "\u8A65"], /* CJK Ideograph */
+ ["\u8A66", "\u8A66"], /* CJK Ideograph */
+ ["\u8A67", "\u8A67"], /* CJK Ideograph */
+ ["\u8A68", "\u8A68"], /* CJK Ideograph */
+ ["\u8A69", "\u8A69"], /* CJK Ideograph */
+ ["\u8A6A", "\u8A6A"], /* CJK Ideograph */
+ ["\u8A6B", "\u8A6B"], /* CJK Ideograph */
+ ["\u8A6C", "\u8A6C"], /* CJK Ideograph */
+ ["\u8A6D", "\u8A6D"], /* CJK Ideograph */
+ ["\u8A6E", "\u8A6E"], /* CJK Ideograph */
+ ["\u8A6F", "\u8A6F"], /* CJK Ideograph */
+ ["\u8A70", "\u8A70"], /* CJK Ideograph */
+ ["\u8A71", "\u8A71"], /* CJK Ideograph */
+ ["\u8A72", "\u8A72"], /* CJK Ideograph */
+ ["\u8A73", "\u8A73"], /* CJK Ideograph */
+ ["\u8A74", "\u8A74"], /* CJK Ideograph */
+ ["\u8A75", "\u8A75"], /* CJK Ideograph */
+ ["\u8A76", "\u8A76"], /* CJK Ideograph */
+ ["\u8A77", "\u8A77"], /* CJK Ideograph */
+ ["\u8A78", "\u8A78"], /* CJK Ideograph */
+ ["\u8A79", "\u8A79"], /* CJK Ideograph */
+ ["\u8A7A", "\u8A7A"], /* CJK Ideograph */
+ ["\u8A7B", "\u8A7B"], /* CJK Ideograph */
+ ["\u8A7C", "\u8A7C"], /* CJK Ideograph */
+ ["\u8A7D", "\u8A7D"], /* CJK Ideograph */
+ ["\u8A7E", "\u8A7E"], /* CJK Ideograph */
+ ["\u8A7F", "\u8A7F"], /* CJK Ideograph */
+ ["\u8A80", "\u8A80"], /* CJK Ideograph */
+ ["\u8A81", "\u8A81"], /* CJK Ideograph */
+ ["\u8A82", "\u8A82"], /* CJK Ideograph */
+ ["\u8A83", "\u8A83"], /* CJK Ideograph */
+ ["\u8A84", "\u8A84"], /* CJK Ideograph */
+ ["\u8A85", "\u8A85"], /* CJK Ideograph */
+ ["\u8A86", "\u8A86"], /* CJK Ideograph */
+ ["\u8A87", "\u8A87"], /* CJK Ideograph */
+ ["\u8A88", "\u8A88"], /* CJK Ideograph */
+ ["\u8A89", "\u8A89"], /* CJK Ideograph */
+ ["\u8A8A", "\u8A8A"], /* CJK Ideograph */
+ ["\u8A8B", "\u8A8B"], /* CJK Ideograph */
+ ["\u8A8C", "\u8A8C"], /* CJK Ideograph */
+ ["\u8A8D", "\u8A8D"], /* CJK Ideograph */
+ ["\u8A8E", "\u8A8E"], /* CJK Ideograph */
+ ["\u8A8F", "\u8A8F"], /* CJK Ideograph */
+ ["\u8A90", "\u8A90"], /* CJK Ideograph */
+ ["\u8A91", "\u8A91"], /* CJK Ideograph */
+ ["\u8A92", "\u8A92"], /* CJK Ideograph */
+ ["\u8A93", "\u8A93"], /* CJK Ideograph */
+ ["\u8A94", "\u8A94"], /* CJK Ideograph */
+ ["\u8A95", "\u8A95"], /* CJK Ideograph */
+ ["\u8A96", "\u8A96"], /* CJK Ideograph */
+ ["\u8A97", "\u8A97"], /* CJK Ideograph */
+ ["\u8A98", "\u8A98"], /* CJK Ideograph */
+ ["\u8A99", "\u8A99"], /* CJK Ideograph */
+ ["\u8A9A", "\u8A9A"], /* CJK Ideograph */
+ ["\u8A9B", "\u8A9B"], /* CJK Ideograph */
+ ["\u8A9C", "\u8A9C"], /* CJK Ideograph */
+ ["\u8A9D", "\u8A9D"], /* CJK Ideograph */
+ ["\u8A9E", "\u8A9E"], /* CJK Ideograph */
+ ["\u8A9F", "\u8A9F"], /* CJK Ideograph */
+ ["\u8AA0", "\u8AA0"], /* CJK Ideograph */
+ ["\u8AA1", "\u8AA1"], /* CJK Ideograph */
+ ["\u8AA2", "\u8AA2"], /* CJK Ideograph */
+ ["\u8AA3", "\u8AA3"], /* CJK Ideograph */
+ ["\u8AA4", "\u8AA4"], /* CJK Ideograph */
+ ["\u8AA5", "\u8AA5"], /* CJK Ideograph */
+ ["\u8AA6", "\u8AA6"], /* CJK Ideograph */
+ ["\u8AA7", "\u8AA7"], /* CJK Ideograph */
+ ["\u8AA8", "\u8AA8"], /* CJK Ideograph */
+ ["\u8AA9", "\u8AA9"], /* CJK Ideograph */
+ ["\u8AAA", "\u8AAA"], /* CJK Ideograph */
+ ["\u8AAB", "\u8AAB"], /* CJK Ideograph */
+ ["\u8AAC", "\u8AAC"], /* CJK Ideograph */
+ ["\u8AAD", "\u8AAD"], /* CJK Ideograph */
+ ["\u8AAE", "\u8AAE"], /* CJK Ideograph */
+ ["\u8AAF", "\u8AAF"], /* CJK Ideograph */
+ ["\u8AB0", "\u8AB0"], /* CJK Ideograph */
+ ["\u8AB1", "\u8AB1"], /* CJK Ideograph */
+ ["\u8AB2", "\u8AB2"], /* CJK Ideograph */
+ ["\u8AB3", "\u8AB3"], /* CJK Ideograph */
+ ["\u8AB4", "\u8AB4"], /* CJK Ideograph */
+ ["\u8AB5", "\u8AB5"], /* CJK Ideograph */
+ ["\u8AB6", "\u8AB6"], /* CJK Ideograph */
+ ["\u8AB7", "\u8AB7"], /* CJK Ideograph */
+ ["\u8AB8", "\u8AB8"], /* CJK Ideograph */
+ ["\u8AB9", "\u8AB9"], /* CJK Ideograph */
+ ["\u8ABA", "\u8ABA"], /* CJK Ideograph */
+ ["\u8ABB", "\u8ABB"], /* CJK Ideograph */
+ ["\u8ABC", "\u8ABC"], /* CJK Ideograph */
+ ["\u8ABD", "\u8ABD"], /* CJK Ideograph */
+ ["\u8ABE", "\u8ABE"], /* CJK Ideograph */
+ ["\u8ABF", "\u8ABF"], /* CJK Ideograph */
+ ["\u8AC0", "\u8AC0"], /* CJK Ideograph */
+ ["\u8AC1", "\u8AC1"], /* CJK Ideograph */
+ ["\u8AC2", "\u8AC2"], /* CJK Ideograph */
+ ["\u8AC3", "\u8AC3"], /* CJK Ideograph */
+ ["\u8AC4", "\u8AC4"], /* CJK Ideograph */
+ ["\u8AC5", "\u8AC5"], /* CJK Ideograph */
+ ["\u8AC6", "\u8AC6"], /* CJK Ideograph */
+ ["\u8AC7", "\u8AC7"], /* CJK Ideograph */
+ ["\u8AC8", "\u8AC8"], /* CJK Ideograph */
+ ["\u8AC9", "\u8AC9"], /* CJK Ideograph */
+ ["\u8ACA", "\u8ACA"], /* CJK Ideograph */
+ ["\u8ACB", "\u8ACB"], /* CJK Ideograph */
+ ["\u8ACC", "\u8ACC"], /* CJK Ideograph */
+ ["\u8ACD", "\u8ACD"], /* CJK Ideograph */
+ ["\u8ACE", "\u8ACE"], /* CJK Ideograph */
+ ["\u8ACF", "\u8ACF"], /* CJK Ideograph */
+ ["\u8AD0", "\u8AD0"], /* CJK Ideograph */
+ ["\u8AD1", "\u8AD1"], /* CJK Ideograph */
+ ["\u8AD2", "\u8AD2"], /* CJK Ideograph */
+ ["\u8AD3", "\u8AD3"], /* CJK Ideograph */
+ ["\u8AD4", "\u8AD4"], /* CJK Ideograph */
+ ["\u8AD5", "\u8AD5"], /* CJK Ideograph */
+ ["\u8AD6", "\u8AD6"], /* CJK Ideograph */
+ ["\u8AD7", "\u8AD7"], /* CJK Ideograph */
+ ["\u8AD8", "\u8AD8"], /* CJK Ideograph */
+ ["\u8AD9", "\u8AD9"], /* CJK Ideograph */
+ ["\u8ADA", "\u8ADA"], /* CJK Ideograph */
+ ["\u8ADB", "\u8ADB"], /* CJK Ideograph */
+ ["\u8ADC", "\u8ADC"], /* CJK Ideograph */
+ ["\u8ADD", "\u8ADD"], /* CJK Ideograph */
+ ["\u8ADE", "\u8ADE"], /* CJK Ideograph */
+ ["\u8ADF", "\u8ADF"], /* CJK Ideograph */
+ ["\u8AE0", "\u8AE0"], /* CJK Ideograph */
+ ["\u8AE1", "\u8AE1"], /* CJK Ideograph */
+ ["\u8AE2", "\u8AE2"], /* CJK Ideograph */
+ ["\u8AE3", "\u8AE3"], /* CJK Ideograph */
+ ["\u8AE4", "\u8AE4"], /* CJK Ideograph */
+ ["\u8AE5", "\u8AE5"], /* CJK Ideograph */
+ ["\u8AE6", "\u8AE6"], /* CJK Ideograph */
+ ["\u8AE7", "\u8AE7"], /* CJK Ideograph */
+ ["\u8AE8", "\u8AE8"], /* CJK Ideograph */
+ ["\u8AE9", "\u8AE9"], /* CJK Ideograph */
+ ["\u8AEA", "\u8AEA"], /* CJK Ideograph */
+ ["\u8AEB", "\u8AEB"], /* CJK Ideograph */
+ ["\u8AEC", "\u8AEC"], /* CJK Ideograph */
+ ["\u8AED", "\u8AED"], /* CJK Ideograph */
+ ["\u8AEE", "\u8AEE"], /* CJK Ideograph */
+ ["\u8AEF", "\u8AEF"], /* CJK Ideograph */
+ ["\u8AF0", "\u8AF0"], /* CJK Ideograph */
+ ["\u8AF1", "\u8AF1"], /* CJK Ideograph */
+ ["\u8AF2", "\u8AF2"], /* CJK Ideograph */
+ ["\u8AF3", "\u8AF3"], /* CJK Ideograph */
+ ["\u8AF4", "\u8AF4"], /* CJK Ideograph */
+ ["\u8AF5", "\u8AF5"], /* CJK Ideograph */
+ ["\u8AF6", "\u8AF6"], /* CJK Ideograph */
+ ["\u8AF7", "\u8AF7"], /* CJK Ideograph */
+ ["\u8AF8", "\u8AF8"], /* CJK Ideograph */
+ ["\u8AF9", "\u8AF9"], /* CJK Ideograph */
+ ["\u8AFA", "\u8AFA"], /* CJK Ideograph */
+ ["\u8AFB", "\u8AFB"], /* CJK Ideograph */
+ ["\u8AFC", "\u8AFC"], /* CJK Ideograph */
+ ["\u8AFD", "\u8AFD"], /* CJK Ideograph */
+ ["\u8AFE", "\u8AFE"], /* CJK Ideograph */
+ ["\u8AFF", "\u8AFF"], /* CJK Ideograph */
+ ["\u8B00", "\u8B00"], /* CJK Ideograph */
+ ["\u8B01", "\u8B01"], /* CJK Ideograph */
+ ["\u8B02", "\u8B02"], /* CJK Ideograph */
+ ["\u8B03", "\u8B03"], /* CJK Ideograph */
+ ["\u8B04", "\u8B04"], /* CJK Ideograph */
+ ["\u8B05", "\u8B05"], /* CJK Ideograph */
+ ["\u8B06", "\u8B06"], /* CJK Ideograph */
+ ["\u8B07", "\u8B07"], /* CJK Ideograph */
+ ["\u8B08", "\u8B08"], /* CJK Ideograph */
+ ["\u8B09", "\u8B09"], /* CJK Ideograph */
+ ["\u8B0A", "\u8B0A"], /* CJK Ideograph */
+ ["\u8B0B", "\u8B0B"], /* CJK Ideograph */
+ ["\u8B0C", "\u8B0C"], /* CJK Ideograph */
+ ["\u8B0D", "\u8B0D"], /* CJK Ideograph */
+ ["\u8B0E", "\u8B0E"], /* CJK Ideograph */
+ ["\u8B0F", "\u8B0F"], /* CJK Ideograph */
+ ["\u8B10", "\u8B10"], /* CJK Ideograph */
+ ["\u8B11", "\u8B11"], /* CJK Ideograph */
+ ["\u8B12", "\u8B12"], /* CJK Ideograph */
+ ["\u8B13", "\u8B13"], /* CJK Ideograph */
+ ["\u8B14", "\u8B14"], /* CJK Ideograph */
+ ["\u8B15", "\u8B15"], /* CJK Ideograph */
+ ["\u8B16", "\u8B16"], /* CJK Ideograph */
+ ["\u8B17", "\u8B17"], /* CJK Ideograph */
+ ["\u8B18", "\u8B18"], /* CJK Ideograph */
+ ["\u8B19", "\u8B19"], /* CJK Ideograph */
+ ["\u8B1A", "\u8B1A"], /* CJK Ideograph */
+ ["\u8B1B", "\u8B1B"], /* CJK Ideograph */
+ ["\u8B1C", "\u8B1C"], /* CJK Ideograph */
+ ["\u8B1D", "\u8B1D"], /* CJK Ideograph */
+ ["\u8B1E", "\u8B1E"], /* CJK Ideograph */
+ ["\u8B1F", "\u8B1F"], /* CJK Ideograph */
+ ["\u8B20", "\u8B20"], /* CJK Ideograph */
+ ["\u8B21", "\u8B21"], /* CJK Ideograph */
+ ["\u8B22", "\u8B22"], /* CJK Ideograph */
+ ["\u8B23", "\u8B23"], /* CJK Ideograph */
+ ["\u8B24", "\u8B24"], /* CJK Ideograph */
+ ["\u8B25", "\u8B25"], /* CJK Ideograph */
+ ["\u8B26", "\u8B26"], /* CJK Ideograph */
+ ["\u8B27", "\u8B27"], /* CJK Ideograph */
+ ["\u8B28", "\u8B28"], /* CJK Ideograph */
+ ["\u8B29", "\u8B29"], /* CJK Ideograph */
+ ["\u8B2A", "\u8B2A"], /* CJK Ideograph */
+ ["\u8B2B", "\u8B2B"], /* CJK Ideograph */
+ ["\u8B2C", "\u8B2C"], /* CJK Ideograph */
+ ["\u8B2D", "\u8B2D"], /* CJK Ideograph */
+ ["\u8B2E", "\u8B2E"], /* CJK Ideograph */
+ ["\u8B2F", "\u8B2F"], /* CJK Ideograph */
+ ["\u8B30", "\u8B30"], /* CJK Ideograph */
+ ["\u8B31", "\u8B31"], /* CJK Ideograph */
+ ["\u8B32", "\u8B32"], /* CJK Ideograph */
+ ["\u8B33", "\u8B33"], /* CJK Ideograph */
+ ["\u8B34", "\u8B34"], /* CJK Ideograph */
+ ["\u8B35", "\u8B35"], /* CJK Ideograph */
+ ["\u8B36", "\u8B36"], /* CJK Ideograph */
+ ["\u8B37", "\u8B37"], /* CJK Ideograph */
+ ["\u8B38", "\u8B38"], /* CJK Ideograph */
+ ["\u8B39", "\u8B39"], /* CJK Ideograph */
+ ["\u8B3A", "\u8B3A"], /* CJK Ideograph */
+ ["\u8B3B", "\u8B3B"], /* CJK Ideograph */
+ ["\u8B3C", "\u8B3C"], /* CJK Ideograph */
+ ["\u8B3D", "\u8B3D"], /* CJK Ideograph */
+ ["\u8B3E", "\u8B3E"], /* CJK Ideograph */
+ ["\u8B3F", "\u8B3F"], /* CJK Ideograph */
+ ["\u8B40", "\u8B40"], /* CJK Ideograph */
+ ["\u8B41", "\u8B41"], /* CJK Ideograph */
+ ["\u8B42", "\u8B42"], /* CJK Ideograph */
+ ["\u8B43", "\u8B43"], /* CJK Ideograph */
+ ["\u8B44", "\u8B44"], /* CJK Ideograph */
+ ["\u8B45", "\u8B45"], /* CJK Ideograph */
+ ["\u8B46", "\u8B46"], /* CJK Ideograph */
+ ["\u8B47", "\u8B47"], /* CJK Ideograph */
+ ["\u8B48", "\u8B48"], /* CJK Ideograph */
+ ["\u8B49", "\u8B49"], /* CJK Ideograph */
+ ["\u8B4A", "\u8B4A"], /* CJK Ideograph */
+ ["\u8B4B", "\u8B4B"], /* CJK Ideograph */
+ ["\u8B4C", "\u8B4C"], /* CJK Ideograph */
+ ["\u8B4D", "\u8B4D"], /* CJK Ideograph */
+ ["\u8B4E", "\u8B4E"], /* CJK Ideograph */
+ ["\u8B4F", "\u8B4F"], /* CJK Ideograph */
+ ["\u8B50", "\u8B50"], /* CJK Ideograph */
+ ["\u8B51", "\u8B51"], /* CJK Ideograph */
+ ["\u8B52", "\u8B52"], /* CJK Ideograph */
+ ["\u8B53", "\u8B53"], /* CJK Ideograph */
+ ["\u8B54", "\u8B54"], /* CJK Ideograph */
+ ["\u8B55", "\u8B55"], /* CJK Ideograph */
+ ["\u8B56", "\u8B56"], /* CJK Ideograph */
+ ["\u8B57", "\u8B57"], /* CJK Ideograph */
+ ["\u8B58", "\u8B58"], /* CJK Ideograph */
+ ["\u8B59", "\u8B59"], /* CJK Ideograph */
+ ["\u8B5A", "\u8B5A"], /* CJK Ideograph */
+ ["\u8B5B", "\u8B5B"], /* CJK Ideograph */
+ ["\u8B5C", "\u8B5C"], /* CJK Ideograph */
+ ["\u8B5D", "\u8B5D"], /* CJK Ideograph */
+ ["\u8B5E", "\u8B5E"], /* CJK Ideograph */
+ ["\u8B5F", "\u8B5F"], /* CJK Ideograph */
+ ["\u8B60", "\u8B60"], /* CJK Ideograph */
+ ["\u8B61", "\u8B61"], /* CJK Ideograph */
+ ["\u8B62", "\u8B62"], /* CJK Ideograph */
+ ["\u8B63", "\u8B63"], /* CJK Ideograph */
+ ["\u8B64", "\u8B64"], /* CJK Ideograph */
+ ["\u8B65", "\u8B65"], /* CJK Ideograph */
+ ["\u8B66", "\u8B66"], /* CJK Ideograph */
+ ["\u8B67", "\u8B67"], /* CJK Ideograph */
+ ["\u8B68", "\u8B68"], /* CJK Ideograph */
+ ["\u8B69", "\u8B69"], /* CJK Ideograph */
+ ["\u8B6A", "\u8B6A"], /* CJK Ideograph */
+ ["\u8B6B", "\u8B6B"], /* CJK Ideograph */
+ ["\u8B6C", "\u8B6C"], /* CJK Ideograph */
+ ["\u8B6D", "\u8B6D"], /* CJK Ideograph */
+ ["\u8B6E", "\u8B6E"], /* CJK Ideograph */
+ ["\u8B6F", "\u8B6F"], /* CJK Ideograph */
+ ["\u8B70", "\u8B70"], /* CJK Ideograph */
+ ["\u8B71", "\u8B71"], /* CJK Ideograph */
+ ["\u8B72", "\u8B72"], /* CJK Ideograph */
+ ["\u8B73", "\u8B73"], /* CJK Ideograph */
+ ["\u8B74", "\u8B74"], /* CJK Ideograph */
+ ["\u8B75", "\u8B75"], /* CJK Ideograph */
+ ["\u8B76", "\u8B76"], /* CJK Ideograph */
+ ["\u8B77", "\u8B77"], /* CJK Ideograph */
+ ["\u8B78", "\u8B78"], /* CJK Ideograph */
+ ["\u8B79", "\u8B79"], /* CJK Ideograph */
+ ["\u8B7A", "\u8B7A"], /* CJK Ideograph */
+ ["\u8B7B", "\u8B7B"], /* CJK Ideograph */
+ ["\u8B7C", "\u8B7C"], /* CJK Ideograph */
+ ["\u8B7D", "\u8B7D"], /* CJK Ideograph */
+ ["\u8B7E", "\u8B7E"], /* CJK Ideograph */
+ ["\u8B7F", "\u8B7F"], /* CJK Ideograph */
+ ["\u8B80", "\u8B80"], /* CJK Ideograph */
+ ["\u8B81", "\u8B81"], /* CJK Ideograph */
+ ["\u8B82", "\u8B82"], /* CJK Ideograph */
+ ["\u8B83", "\u8B83"], /* CJK Ideograph */
+ ["\u8B84", "\u8B84"], /* CJK Ideograph */
+ ["\u8B85", "\u8B85"], /* CJK Ideograph */
+ ["\u8B86", "\u8B86"], /* CJK Ideograph */
+ ["\u8B87", "\u8B87"], /* CJK Ideograph */
+ ["\u8B88", "\u8B88"], /* CJK Ideograph */
+ ["\u8B89", "\u8B89"], /* CJK Ideograph */
+ ["\u8B8A", "\u8B8A"], /* CJK Ideograph */
+ ["\u8B8B", "\u8B8B"], /* CJK Ideograph */
+ ["\u8B8C", "\u8B8C"], /* CJK Ideograph */
+ ["\u8B8D", "\u8B8D"], /* CJK Ideograph */
+ ["\u8B8E", "\u8B8E"], /* CJK Ideograph */
+ ["\u8B8F", "\u8B8F"], /* CJK Ideograph */
+ ["\u8B90", "\u8B90"], /* CJK Ideograph */
+ ["\u8B91", "\u8B91"], /* CJK Ideograph */
+ ["\u8B92", "\u8B92"], /* CJK Ideograph */
+ ["\u8B93", "\u8B93"], /* CJK Ideograph */
+ ["\u8B94", "\u8B94"], /* CJK Ideograph */
+ ["\u8B95", "\u8B95"], /* CJK Ideograph */
+ ["\u8B96", "\u8B96"], /* CJK Ideograph */
+ ["\u8B97", "\u8B97"], /* CJK Ideograph */
+ ["\u8B98", "\u8B98"], /* CJK Ideograph */
+ ["\u8B99", "\u8B99"], /* CJK Ideograph */
+ ["\u8B9A", "\u8B9A"], /* CJK Ideograph */
+ ["\u8B9B", "\u8B9B"], /* CJK Ideograph */
+ ["\u8B9C", "\u8B9C"], /* CJK Ideograph */
+ ["\u8B9D", "\u8B9D"], /* CJK Ideograph */
+ ["\u8B9E", "\u8B9E"], /* CJK Ideograph */
+ ["\u8B9F", "\u8B9F"], /* CJK Ideograph */
+ ["\u8BA0", "\u8BA0"], /* CJK Ideograph */
+ ["\u8BA1", "\u8BA1"], /* CJK Ideograph */
+ ["\u8BA2", "\u8BA2"], /* CJK Ideograph */
+ ["\u8BA3", "\u8BA3"], /* CJK Ideograph */
+ ["\u8BA4", "\u8BA4"], /* CJK Ideograph */
+ ["\u8BA5", "\u8BA5"], /* CJK Ideograph */
+ ["\u8BA6", "\u8BA6"], /* CJK Ideograph */
+ ["\u8BA7", "\u8BA7"], /* CJK Ideograph */
+ ["\u8BA8", "\u8BA8"], /* CJK Ideograph */
+ ["\u8BA9", "\u8BA9"], /* CJK Ideograph */
+ ["\u8BAA", "\u8BAA"], /* CJK Ideograph */
+ ["\u8BAB", "\u8BAB"], /* CJK Ideograph */
+ ["\u8BAC", "\u8BAC"], /* CJK Ideograph */
+ ["\u8BAD", "\u8BAD"], /* CJK Ideograph */
+ ["\u8BAE", "\u8BAE"], /* CJK Ideograph */
+ ["\u8BAF", "\u8BAF"], /* CJK Ideograph */
+ ["\u8BB0", "\u8BB0"], /* CJK Ideograph */
+ ["\u8BB1", "\u8BB1"], /* CJK Ideograph */
+ ["\u8BB2", "\u8BB2"], /* CJK Ideograph */
+ ["\u8BB3", "\u8BB3"], /* CJK Ideograph */
+ ["\u8BB4", "\u8BB4"], /* CJK Ideograph */
+ ["\u8BB5", "\u8BB5"], /* CJK Ideograph */
+ ["\u8BB6", "\u8BB6"], /* CJK Ideograph */
+ ["\u8BB7", "\u8BB7"], /* CJK Ideograph */
+ ["\u8BB8", "\u8BB8"], /* CJK Ideograph */
+ ["\u8BB9", "\u8BB9"], /* CJK Ideograph */
+ ["\u8BBA", "\u8BBA"], /* CJK Ideograph */
+ ["\u8BBB", "\u8BBB"], /* CJK Ideograph */
+ ["\u8BBC", "\u8BBC"], /* CJK Ideograph */
+ ["\u8BBD", "\u8BBD"], /* CJK Ideograph */
+ ["\u8BBE", "\u8BBE"], /* CJK Ideograph */
+ ["\u8BBF", "\u8BBF"], /* CJK Ideograph */
+ ["\u8BC0", "\u8BC0"], /* CJK Ideograph */
+ ["\u8BC1", "\u8BC1"], /* CJK Ideograph */
+ ["\u8BC2", "\u8BC2"], /* CJK Ideograph */
+ ["\u8BC3", "\u8BC3"], /* CJK Ideograph */
+ ["\u8BC4", "\u8BC4"], /* CJK Ideograph */
+ ["\u8BC5", "\u8BC5"], /* CJK Ideograph */
+ ["\u8BC6", "\u8BC6"], /* CJK Ideograph */
+ ["\u8BC7", "\u8BC7"], /* CJK Ideograph */
+ ["\u8BC8", "\u8BC8"], /* CJK Ideograph */
+ ["\u8BC9", "\u8BC9"], /* CJK Ideograph */
+ ["\u8BCA", "\u8BCA"], /* CJK Ideograph */
+ ["\u8BCB", "\u8BCB"], /* CJK Ideograph */
+ ["\u8BCC", "\u8BCC"], /* CJK Ideograph */
+ ["\u8BCD", "\u8BCD"], /* CJK Ideograph */
+ ["\u8BCE", "\u8BCE"], /* CJK Ideograph */
+ ["\u8BCF", "\u8BCF"], /* CJK Ideograph */
+ ["\u8BD0", "\u8BD0"], /* CJK Ideograph */
+ ["\u8BD1", "\u8BD1"], /* CJK Ideograph */
+ ["\u8BD2", "\u8BD2"], /* CJK Ideograph */
+ ["\u8BD3", "\u8BD3"], /* CJK Ideograph */
+ ["\u8BD4", "\u8BD4"], /* CJK Ideograph */
+ ["\u8BD5", "\u8BD5"], /* CJK Ideograph */
+ ["\u8BD6", "\u8BD6"], /* CJK Ideograph */
+ ["\u8BD7", "\u8BD7"], /* CJK Ideograph */
+ ["\u8BD8", "\u8BD8"], /* CJK Ideograph */
+ ["\u8BD9", "\u8BD9"], /* CJK Ideograph */
+ ["\u8BDA", "\u8BDA"], /* CJK Ideograph */
+ ["\u8BDB", "\u8BDB"], /* CJK Ideograph */
+ ["\u8BDC", "\u8BDC"], /* CJK Ideograph */
+ ["\u8BDD", "\u8BDD"], /* CJK Ideograph */
+ ["\u8BDE", "\u8BDE"], /* CJK Ideograph */
+ ["\u8BDF", "\u8BDF"], /* CJK Ideograph */
+ ["\u8BE0", "\u8BE0"], /* CJK Ideograph */
+ ["\u8BE1", "\u8BE1"], /* CJK Ideograph */
+ ["\u8BE2", "\u8BE2"], /* CJK Ideograph */
+ ["\u8BE3", "\u8BE3"], /* CJK Ideograph */
+ ["\u8BE4", "\u8BE4"], /* CJK Ideograph */
+ ["\u8BE5", "\u8BE5"], /* CJK Ideograph */
+ ["\u8BE6", "\u8BE6"], /* CJK Ideograph */
+ ["\u8BE7", "\u8BE7"], /* CJK Ideograph */
+ ["\u8BE8", "\u8BE8"], /* CJK Ideograph */
+ ["\u8BE9", "\u8BE9"], /* CJK Ideograph */
+ ["\u8BEA", "\u8BEA"], /* CJK Ideograph */
+ ["\u8BEB", "\u8BEB"], /* CJK Ideograph */
+ ["\u8BEC", "\u8BEC"], /* CJK Ideograph */
+ ["\u8BED", "\u8BED"], /* CJK Ideograph */
+ ["\u8BEE", "\u8BEE"], /* CJK Ideograph */
+ ["\u8BEF", "\u8BEF"], /* CJK Ideograph */
+ ["\u8BF0", "\u8BF0"], /* CJK Ideograph */
+ ["\u8BF1", "\u8BF1"], /* CJK Ideograph */
+ ["\u8BF2", "\u8BF2"], /* CJK Ideograph */
+ ["\u8BF3", "\u8BF3"], /* CJK Ideograph */
+ ["\u8BF4", "\u8BF4"], /* CJK Ideograph */
+ ["\u8BF5", "\u8BF5"], /* CJK Ideograph */
+ ["\u8BF6", "\u8BF6"], /* CJK Ideograph */
+ ["\u8BF7", "\u8BF7"], /* CJK Ideograph */
+ ["\u8BF8", "\u8BF8"], /* CJK Ideograph */
+ ["\u8BF9", "\u8BF9"], /* CJK Ideograph */
+ ["\u8BFA", "\u8BFA"], /* CJK Ideograph */
+ ["\u8BFB", "\u8BFB"], /* CJK Ideograph */
+ ["\u8BFC", "\u8BFC"], /* CJK Ideograph */
+ ["\u8BFD", "\u8BFD"], /* CJK Ideograph */
+ ["\u8BFE", "\u8BFE"], /* CJK Ideograph */
+ ["\u8BFF", "\u8BFF"], /* CJK Ideograph */
+ ["\u8C00", "\u8C00"], /* CJK Ideograph */
+ ["\u8C01", "\u8C01"], /* CJK Ideograph */
+ ["\u8C02", "\u8C02"], /* CJK Ideograph */
+ ["\u8C03", "\u8C03"], /* CJK Ideograph */
+ ["\u8C04", "\u8C04"], /* CJK Ideograph */
+ ["\u8C05", "\u8C05"], /* CJK Ideograph */
+ ["\u8C06", "\u8C06"], /* CJK Ideograph */
+ ["\u8C07", "\u8C07"], /* CJK Ideograph */
+ ["\u8C08", "\u8C08"], /* CJK Ideograph */
+ ["\u8C09", "\u8C09"], /* CJK Ideograph */
+ ["\u8C0A", "\u8C0A"], /* CJK Ideograph */
+ ["\u8C0B", "\u8C0B"], /* CJK Ideograph */
+ ["\u8C0C", "\u8C0C"], /* CJK Ideograph */
+ ["\u8C0D", "\u8C0D"], /* CJK Ideograph */
+ ["\u8C0E", "\u8C0E"], /* CJK Ideograph */
+ ["\u8C0F", "\u8C0F"], /* CJK Ideograph */
+ ["\u8C10", "\u8C10"], /* CJK Ideograph */
+ ["\u8C11", "\u8C11"], /* CJK Ideograph */
+ ["\u8C12", "\u8C12"], /* CJK Ideograph */
+ ["\u8C13", "\u8C13"], /* CJK Ideograph */
+ ["\u8C14", "\u8C14"], /* CJK Ideograph */
+ ["\u8C15", "\u8C15"], /* CJK Ideograph */
+ ["\u8C16", "\u8C16"], /* CJK Ideograph */
+ ["\u8C17", "\u8C17"], /* CJK Ideograph */
+ ["\u8C18", "\u8C18"], /* CJK Ideograph */
+ ["\u8C19", "\u8C19"], /* CJK Ideograph */
+ ["\u8C1A", "\u8C1A"], /* CJK Ideograph */
+ ["\u8C1B", "\u8C1B"], /* CJK Ideograph */
+ ["\u8C1C", "\u8C1C"], /* CJK Ideograph */
+ ["\u8C1D", "\u8C1D"], /* CJK Ideograph */
+ ["\u8C1E", "\u8C1E"], /* CJK Ideograph */
+ ["\u8C1F", "\u8C1F"], /* CJK Ideograph */
+ ["\u8C20", "\u8C20"], /* CJK Ideograph */
+ ["\u8C21", "\u8C21"], /* CJK Ideograph */
+ ["\u8C22", "\u8C22"], /* CJK Ideograph */
+ ["\u8C23", "\u8C23"], /* CJK Ideograph */
+ ["\u8C24", "\u8C24"], /* CJK Ideograph */
+ ["\u8C25", "\u8C25"], /* CJK Ideograph */
+ ["\u8C26", "\u8C26"], /* CJK Ideograph */
+ ["\u8C27", "\u8C27"], /* CJK Ideograph */
+ ["\u8C28", "\u8C28"], /* CJK Ideograph */
+ ["\u8C29", "\u8C29"], /* CJK Ideograph */
+ ["\u8C2A", "\u8C2A"], /* CJK Ideograph */
+ ["\u8C2B", "\u8C2B"], /* CJK Ideograph */
+ ["\u8C2C", "\u8C2C"], /* CJK Ideograph */
+ ["\u8C2D", "\u8C2D"], /* CJK Ideograph */
+ ["\u8C2E", "\u8C2E"], /* CJK Ideograph */
+ ["\u8C2F", "\u8C2F"], /* CJK Ideograph */
+ ["\u8C30", "\u8C30"], /* CJK Ideograph */
+ ["\u8C31", "\u8C31"], /* CJK Ideograph */
+ ["\u8C32", "\u8C32"], /* CJK Ideograph */
+ ["\u8C33", "\u8C33"], /* CJK Ideograph */
+ ["\u8C34", "\u8C34"], /* CJK Ideograph */
+ ["\u8C35", "\u8C35"], /* CJK Ideograph */
+ ["\u8C36", "\u8C36"], /* CJK Ideograph */
+ ["\u8C37", "\u8C37"], /* CJK Ideograph */
+ ["\u8C38", "\u8C38"], /* CJK Ideograph */
+ ["\u8C39", "\u8C39"], /* CJK Ideograph */
+ ["\u8C3A", "\u8C3A"], /* CJK Ideograph */
+ ["\u8C3B", "\u8C3B"], /* CJK Ideograph */
+ ["\u8C3C", "\u8C3C"], /* CJK Ideograph */
+ ["\u8C3D", "\u8C3D"], /* CJK Ideograph */
+ ["\u8C3E", "\u8C3E"], /* CJK Ideograph */
+ ["\u8C3F", "\u8C3F"], /* CJK Ideograph */
+ ["\u8C40", "\u8C40"], /* CJK Ideograph */
+ ["\u8C41", "\u8C41"], /* CJK Ideograph */
+ ["\u8C42", "\u8C42"], /* CJK Ideograph */
+ ["\u8C43", "\u8C43"], /* CJK Ideograph */
+ ["\u8C44", "\u8C44"], /* CJK Ideograph */
+ ["\u8C45", "\u8C45"], /* CJK Ideograph */
+ ["\u8C46", "\u8C46"], /* CJK Ideograph */
+ ["\u8C47", "\u8C47"], /* CJK Ideograph */
+ ["\u8C48", "\u8C48"], /* CJK Ideograph */
+ ["\u8C49", "\u8C49"], /* CJK Ideograph */
+ ["\u8C4A", "\u8C4A"], /* CJK Ideograph */
+ ["\u8C4B", "\u8C4B"], /* CJK Ideograph */
+ ["\u8C4C", "\u8C4C"], /* CJK Ideograph */
+ ["\u8C4D", "\u8C4D"], /* CJK Ideograph */
+ ["\u8C4E", "\u8C4E"], /* CJK Ideograph */
+ ["\u8C4F", "\u8C4F"], /* CJK Ideograph */
+ ["\u8C50", "\u8C50"], /* CJK Ideograph */
+ ["\u8C51", "\u8C51"], /* CJK Ideograph */
+ ["\u8C52", "\u8C52"], /* CJK Ideograph */
+ ["\u8C53", "\u8C53"], /* CJK Ideograph */
+ ["\u8C54", "\u8C54"], /* CJK Ideograph */
+ ["\u8C55", "\u8C55"], /* CJK Ideograph */
+ ["\u8C56", "\u8C56"], /* CJK Ideograph */
+ ["\u8C57", "\u8C57"], /* CJK Ideograph */
+ ["\u8C58", "\u8C58"], /* CJK Ideograph */
+ ["\u8C59", "\u8C59"], /* CJK Ideograph */
+ ["\u8C5A", "\u8C5A"], /* CJK Ideograph */
+ ["\u8C5B", "\u8C5B"], /* CJK Ideograph */
+ ["\u8C5C", "\u8C5C"], /* CJK Ideograph */
+ ["\u8C5D", "\u8C5D"], /* CJK Ideograph */
+ ["\u8C5E", "\u8C5E"], /* CJK Ideograph */
+ ["\u8C5F", "\u8C5F"], /* CJK Ideograph */
+ ["\u8C60", "\u8C60"], /* CJK Ideograph */
+ ["\u8C61", "\u8C61"], /* CJK Ideograph */
+ ["\u8C62", "\u8C62"], /* CJK Ideograph */
+ ["\u8C63", "\u8C63"], /* CJK Ideograph */
+ ["\u8C64", "\u8C64"], /* CJK Ideograph */
+ ["\u8C65", "\u8C65"], /* CJK Ideograph */
+ ["\u8C66", "\u8C66"], /* CJK Ideograph */
+ ["\u8C67", "\u8C67"], /* CJK Ideograph */
+ ["\u8C68", "\u8C68"], /* CJK Ideograph */
+ ["\u8C69", "\u8C69"], /* CJK Ideograph */
+ ["\u8C6A", "\u8C6A"], /* CJK Ideograph */
+ ["\u8C6B", "\u8C6B"], /* CJK Ideograph */
+ ["\u8C6C", "\u8C6C"], /* CJK Ideograph */
+ ["\u8C6D", "\u8C6D"], /* CJK Ideograph */
+ ["\u8C6E", "\u8C6E"], /* CJK Ideograph */
+ ["\u8C6F", "\u8C6F"], /* CJK Ideograph */
+ ["\u8C70", "\u8C70"], /* CJK Ideograph */
+ ["\u8C71", "\u8C71"], /* CJK Ideograph */
+ ["\u8C72", "\u8C72"], /* CJK Ideograph */
+ ["\u8C73", "\u8C73"], /* CJK Ideograph */
+ ["\u8C74", "\u8C74"], /* CJK Ideograph */
+ ["\u8C75", "\u8C75"], /* CJK Ideograph */
+ ["\u8C76", "\u8C76"], /* CJK Ideograph */
+ ["\u8C77", "\u8C77"], /* CJK Ideograph */
+ ["\u8C78", "\u8C78"], /* CJK Ideograph */
+ ["\u8C79", "\u8C79"], /* CJK Ideograph */
+ ["\u8C7A", "\u8C7A"], /* CJK Ideograph */
+ ["\u8C7B", "\u8C7B"], /* CJK Ideograph */
+ ["\u8C7C", "\u8C7C"], /* CJK Ideograph */
+ ["\u8C7D", "\u8C7D"], /* CJK Ideograph */
+ ["\u8C7E", "\u8C7E"], /* CJK Ideograph */
+ ["\u8C7F", "\u8C7F"], /* CJK Ideograph */
+ ["\u8C80", "\u8C80"], /* CJK Ideograph */
+ ["\u8C81", "\u8C81"], /* CJK Ideograph */
+ ["\u8C82", "\u8C82"], /* CJK Ideograph */
+ ["\u8C83", "\u8C83"], /* CJK Ideograph */
+ ["\u8C84", "\u8C84"], /* CJK Ideograph */
+ ["\u8C85", "\u8C85"], /* CJK Ideograph */
+ ["\u8C86", "\u8C86"], /* CJK Ideograph */
+ ["\u8C87", "\u8C87"], /* CJK Ideograph */
+ ["\u8C88", "\u8C88"], /* CJK Ideograph */
+ ["\u8C89", "\u8C89"], /* CJK Ideograph */
+ ["\u8C8A", "\u8C8A"], /* CJK Ideograph */
+ ["\u8C8B", "\u8C8B"], /* CJK Ideograph */
+ ["\u8C8C", "\u8C8C"], /* CJK Ideograph */
+ ["\u8C8D", "\u8C8D"], /* CJK Ideograph */
+ ["\u8C8E", "\u8C8E"], /* CJK Ideograph */
+ ["\u8C8F", "\u8C8F"], /* CJK Ideograph */
+ ["\u8C90", "\u8C90"], /* CJK Ideograph */
+ ["\u8C91", "\u8C91"], /* CJK Ideograph */
+ ["\u8C92", "\u8C92"], /* CJK Ideograph */
+ ["\u8C93", "\u8C93"], /* CJK Ideograph */
+ ["\u8C94", "\u8C94"], /* CJK Ideograph */
+ ["\u8C95", "\u8C95"], /* CJK Ideograph */
+ ["\u8C96", "\u8C96"], /* CJK Ideograph */
+ ["\u8C97", "\u8C97"], /* CJK Ideograph */
+ ["\u8C98", "\u8C98"], /* CJK Ideograph */
+ ["\u8C99", "\u8C99"], /* CJK Ideograph */
+ ["\u8C9A", "\u8C9A"], /* CJK Ideograph */
+ ["\u8C9B", "\u8C9B"], /* CJK Ideograph */
+ ["\u8C9C", "\u8C9C"], /* CJK Ideograph */
+ ["\u8C9D", "\u8C9D"], /* CJK Ideograph */
+ ["\u8C9E", "\u8C9E"], /* CJK Ideograph */
+ ["\u8C9F", "\u8C9F"], /* CJK Ideograph */
+ ["\u8CA0", "\u8CA0"], /* CJK Ideograph */
+ ["\u8CA1", "\u8CA1"], /* CJK Ideograph */
+ ["\u8CA2", "\u8CA2"], /* CJK Ideograph */
+ ["\u8CA3", "\u8CA3"], /* CJK Ideograph */
+ ["\u8CA4", "\u8CA4"], /* CJK Ideograph */
+ ["\u8CA5", "\u8CA5"], /* CJK Ideograph */
+ ["\u8CA6", "\u8CA6"], /* CJK Ideograph */
+ ["\u8CA7", "\u8CA7"], /* CJK Ideograph */
+ ["\u8CA8", "\u8CA8"], /* CJK Ideograph */
+ ["\u8CA9", "\u8CA9"], /* CJK Ideograph */
+ ["\u8CAA", "\u8CAA"], /* CJK Ideograph */
+ ["\u8CAB", "\u8CAB"], /* CJK Ideograph */
+ ["\u8CAC", "\u8CAC"], /* CJK Ideograph */
+ ["\u8CAD", "\u8CAD"], /* CJK Ideograph */
+ ["\u8CAE", "\u8CAE"], /* CJK Ideograph */
+ ["\u8CAF", "\u8CAF"], /* CJK Ideograph */
+ ["\u8CB0", "\u8CB0"], /* CJK Ideograph */
+ ["\u8CB1", "\u8CB1"], /* CJK Ideograph */
+ ["\u8CB2", "\u8CB2"], /* CJK Ideograph */
+ ["\u8CB3", "\u8CB3"], /* CJK Ideograph */
+ ["\u8CB4", "\u8CB4"], /* CJK Ideograph */
+ ["\u8CB5", "\u8CB5"], /* CJK Ideograph */
+ ["\u8CB6", "\u8CB6"], /* CJK Ideograph */
+ ["\u8CB7", "\u8CB7"], /* CJK Ideograph */
+ ["\u8CB8", "\u8CB8"], /* CJK Ideograph */
+ ["\u8CB9", "\u8CB9"], /* CJK Ideograph */
+ ["\u8CBA", "\u8CBA"], /* CJK Ideograph */
+ ["\u8CBB", "\u8CBB"], /* CJK Ideograph */
+ ["\u8CBC", "\u8CBC"], /* CJK Ideograph */
+ ["\u8CBD", "\u8CBD"], /* CJK Ideograph */
+ ["\u8CBE", "\u8CBE"], /* CJK Ideograph */
+ ["\u8CBF", "\u8CBF"], /* CJK Ideograph */
+ ["\u8CC0", "\u8CC0"], /* CJK Ideograph */
+ ["\u8CC1", "\u8CC1"], /* CJK Ideograph */
+ ["\u8CC2", "\u8CC2"], /* CJK Ideograph */
+ ["\u8CC3", "\u8CC3"], /* CJK Ideograph */
+ ["\u8CC4", "\u8CC4"], /* CJK Ideograph */
+ ["\u8CC5", "\u8CC5"], /* CJK Ideograph */
+ ["\u8CC6", "\u8CC6"], /* CJK Ideograph */
+ ["\u8CC7", "\u8CC7"], /* CJK Ideograph */
+ ["\u8CC8", "\u8CC8"], /* CJK Ideograph */
+ ["\u8CC9", "\u8CC9"], /* CJK Ideograph */
+ ["\u8CCA", "\u8CCA"], /* CJK Ideograph */
+ ["\u8CCB", "\u8CCB"], /* CJK Ideograph */
+ ["\u8CCC", "\u8CCC"], /* CJK Ideograph */
+ ["\u8CCD", "\u8CCD"], /* CJK Ideograph */
+ ["\u8CCE", "\u8CCE"], /* CJK Ideograph */
+ ["\u8CCF", "\u8CCF"], /* CJK Ideograph */
+ ["\u8CD0", "\u8CD0"], /* CJK Ideograph */
+ ["\u8CD1", "\u8CD1"], /* CJK Ideograph */
+ ["\u8CD2", "\u8CD2"], /* CJK Ideograph */
+ ["\u8CD3", "\u8CD3"], /* CJK Ideograph */
+ ["\u8CD4", "\u8CD4"], /* CJK Ideograph */
+ ["\u8CD5", "\u8CD5"], /* CJK Ideograph */
+ ["\u8CD6", "\u8CD6"], /* CJK Ideograph */
+ ["\u8CD7", "\u8CD7"], /* CJK Ideograph */
+ ["\u8CD8", "\u8CD8"], /* CJK Ideograph */
+ ["\u8CD9", "\u8CD9"], /* CJK Ideograph */
+ ["\u8CDA", "\u8CDA"], /* CJK Ideograph */
+ ["\u8CDB", "\u8CDB"], /* CJK Ideograph */
+ ["\u8CDC", "\u8CDC"], /* CJK Ideograph */
+ ["\u8CDD", "\u8CDD"], /* CJK Ideograph */
+ ["\u8CDE", "\u8CDE"], /* CJK Ideograph */
+ ["\u8CDF", "\u8CDF"], /* CJK Ideograph */
+ ["\u8CE0", "\u8CE0"], /* CJK Ideograph */
+ ["\u8CE1", "\u8CE1"], /* CJK Ideograph */
+ ["\u8CE2", "\u8CE2"], /* CJK Ideograph */
+ ["\u8CE3", "\u8CE3"], /* CJK Ideograph */
+ ["\u8CE4", "\u8CE4"], /* CJK Ideograph */
+ ["\u8CE5", "\u8CE5"], /* CJK Ideograph */
+ ["\u8CE6", "\u8CE6"], /* CJK Ideograph */
+ ["\u8CE7", "\u8CE7"], /* CJK Ideograph */
+ ["\u8CE8", "\u8CE8"], /* CJK Ideograph */
+ ["\u8CE9", "\u8CE9"], /* CJK Ideograph */
+ ["\u8CEA", "\u8CEA"], /* CJK Ideograph */
+ ["\u8CEB", "\u8CEB"], /* CJK Ideograph */
+ ["\u8CEC", "\u8CEC"], /* CJK Ideograph */
+ ["\u8CED", "\u8CED"], /* CJK Ideograph */
+ ["\u8CEE", "\u8CEE"], /* CJK Ideograph */
+ ["\u8CEF", "\u8CEF"], /* CJK Ideograph */
+ ["\u8CF0", "\u8CF0"], /* CJK Ideograph */
+ ["\u8CF1", "\u8CF1"], /* CJK Ideograph */
+ ["\u8CF2", "\u8CF2"], /* CJK Ideograph */
+ ["\u8CF3", "\u8CF3"], /* CJK Ideograph */
+ ["\u8CF4", "\u8CF4"], /* CJK Ideograph */
+ ["\u8CF5", "\u8CF5"], /* CJK Ideograph */
+ ["\u8CF6", "\u8CF6"], /* CJK Ideograph */
+ ["\u8CF7", "\u8CF7"], /* CJK Ideograph */
+ ["\u8CF8", "\u8CF8"], /* CJK Ideograph */
+ ["\u8CF9", "\u8CF9"], /* CJK Ideograph */
+ ["\u8CFA", "\u8CFA"], /* CJK Ideograph */
+ ["\u8CFB", "\u8CFB"], /* CJK Ideograph */
+ ["\u8CFC", "\u8CFC"], /* CJK Ideograph */
+ ["\u8CFD", "\u8CFD"], /* CJK Ideograph */
+ ["\u8CFE", "\u8CFE"], /* CJK Ideograph */
+ ["\u8CFF", "\u8CFF"], /* CJK Ideograph */
+ ["\u8D00", "\u8D00"], /* CJK Ideograph */
+ ["\u8D01", "\u8D01"], /* CJK Ideograph */
+ ["\u8D02", "\u8D02"], /* CJK Ideograph */
+ ["\u8D03", "\u8D03"], /* CJK Ideograph */
+ ["\u8D04", "\u8D04"], /* CJK Ideograph */
+ ["\u8D05", "\u8D05"], /* CJK Ideograph */
+ ["\u8D06", "\u8D06"], /* CJK Ideograph */
+ ["\u8D07", "\u8D07"], /* CJK Ideograph */
+ ["\u8D08", "\u8D08"], /* CJK Ideograph */
+ ["\u8D09", "\u8D09"], /* CJK Ideograph */
+ ["\u8D0A", "\u8D0A"], /* CJK Ideograph */
+ ["\u8D0B", "\u8D0B"], /* CJK Ideograph */
+ ["\u8D0C", "\u8D0C"], /* CJK Ideograph */
+ ["\u8D0D", "\u8D0D"], /* CJK Ideograph */
+ ["\u8D0E", "\u8D0E"], /* CJK Ideograph */
+ ["\u8D0F", "\u8D0F"], /* CJK Ideograph */
+ ["\u8D10", "\u8D10"], /* CJK Ideograph */
+ ["\u8D11", "\u8D11"], /* CJK Ideograph */
+ ["\u8D12", "\u8D12"], /* CJK Ideograph */
+ ["\u8D13", "\u8D13"], /* CJK Ideograph */
+ ["\u8D14", "\u8D14"], /* CJK Ideograph */
+ ["\u8D15", "\u8D15"], /* CJK Ideograph */
+ ["\u8D16", "\u8D16"], /* CJK Ideograph */
+ ["\u8D17", "\u8D17"], /* CJK Ideograph */
+ ["\u8D18", "\u8D18"], /* CJK Ideograph */
+ ["\u8D19", "\u8D19"], /* CJK Ideograph */
+ ["\u8D1A", "\u8D1A"], /* CJK Ideograph */
+ ["\u8D1B", "\u8D1B"], /* CJK Ideograph */
+ ["\u8D1C", "\u8D1C"], /* CJK Ideograph */
+ ["\u8D1D", "\u8D1D"], /* CJK Ideograph */
+ ["\u8D1E", "\u8D1E"], /* CJK Ideograph */
+ ["\u8D1F", "\u8D1F"], /* CJK Ideograph */
+ ["\u8D20", "\u8D20"], /* CJK Ideograph */
+ ["\u8D21", "\u8D21"], /* CJK Ideograph */
+ ["\u8D22", "\u8D22"], /* CJK Ideograph */
+ ["\u8D23", "\u8D23"], /* CJK Ideograph */
+ ["\u8D24", "\u8D24"], /* CJK Ideograph */
+ ["\u8D25", "\u8D25"], /* CJK Ideograph */
+ ["\u8D26", "\u8D26"], /* CJK Ideograph */
+ ["\u8D27", "\u8D27"], /* CJK Ideograph */
+ ["\u8D28", "\u8D28"], /* CJK Ideograph */
+ ["\u8D29", "\u8D29"], /* CJK Ideograph */
+ ["\u8D2A", "\u8D2A"], /* CJK Ideograph */
+ ["\u8D2B", "\u8D2B"], /* CJK Ideograph */
+ ["\u8D2C", "\u8D2C"], /* CJK Ideograph */
+ ["\u8D2D", "\u8D2D"], /* CJK Ideograph */
+ ["\u8D2E", "\u8D2E"], /* CJK Ideograph */
+ ["\u8D2F", "\u8D2F"], /* CJK Ideograph */
+ ["\u8D30", "\u8D30"], /* CJK Ideograph */
+ ["\u8D31", "\u8D31"], /* CJK Ideograph */
+ ["\u8D32", "\u8D32"], /* CJK Ideograph */
+ ["\u8D33", "\u8D33"], /* CJK Ideograph */
+ ["\u8D34", "\u8D34"], /* CJK Ideograph */
+ ["\u8D35", "\u8D35"], /* CJK Ideograph */
+ ["\u8D36", "\u8D36"], /* CJK Ideograph */
+ ["\u8D37", "\u8D37"], /* CJK Ideograph */
+ ["\u8D38", "\u8D38"], /* CJK Ideograph */
+ ["\u8D39", "\u8D39"], /* CJK Ideograph */
+ ["\u8D3A", "\u8D3A"], /* CJK Ideograph */
+ ["\u8D3B", "\u8D3B"], /* CJK Ideograph */
+ ["\u8D3C", "\u8D3C"], /* CJK Ideograph */
+ ["\u8D3D", "\u8D3D"], /* CJK Ideograph */
+ ["\u8D3E", "\u8D3E"], /* CJK Ideograph */
+ ["\u8D3F", "\u8D3F"], /* CJK Ideograph */
+ ["\u8D40", "\u8D40"], /* CJK Ideograph */
+ ["\u8D41", "\u8D41"], /* CJK Ideograph */
+ ["\u8D42", "\u8D42"], /* CJK Ideograph */
+ ["\u8D43", "\u8D43"], /* CJK Ideograph */
+ ["\u8D44", "\u8D44"], /* CJK Ideograph */
+ ["\u8D45", "\u8D45"], /* CJK Ideograph */
+ ["\u8D46", "\u8D46"], /* CJK Ideograph */
+ ["\u8D47", "\u8D47"], /* CJK Ideograph */
+ ["\u8D48", "\u8D48"], /* CJK Ideograph */
+ ["\u8D49", "\u8D49"], /* CJK Ideograph */
+ ["\u8D4A", "\u8D4A"], /* CJK Ideograph */
+ ["\u8D4B", "\u8D4B"], /* CJK Ideograph */
+ ["\u8D4C", "\u8D4C"], /* CJK Ideograph */
+ ["\u8D4D", "\u8D4D"], /* CJK Ideograph */
+ ["\u8D4E", "\u8D4E"], /* CJK Ideograph */
+ ["\u8D4F", "\u8D4F"], /* CJK Ideograph */
+ ["\u8D50", "\u8D50"], /* CJK Ideograph */
+ ["\u8D51", "\u8D51"], /* CJK Ideograph */
+ ["\u8D52", "\u8D52"], /* CJK Ideograph */
+ ["\u8D53", "\u8D53"], /* CJK Ideograph */
+ ["\u8D54", "\u8D54"], /* CJK Ideograph */
+ ["\u8D55", "\u8D55"], /* CJK Ideograph */
+ ["\u8D56", "\u8D56"], /* CJK Ideograph */
+ ["\u8D57", "\u8D57"], /* CJK Ideograph */
+ ["\u8D58", "\u8D58"], /* CJK Ideograph */
+ ["\u8D59", "\u8D59"], /* CJK Ideograph */
+ ["\u8D5A", "\u8D5A"], /* CJK Ideograph */
+ ["\u8D5B", "\u8D5B"], /* CJK Ideograph */
+ ["\u8D5C", "\u8D5C"], /* CJK Ideograph */
+ ["\u8D5D", "\u8D5D"], /* CJK Ideograph */
+ ["\u8D5E", "\u8D5E"], /* CJK Ideograph */
+ ["\u8D5F", "\u8D5F"], /* CJK Ideograph */
+ ["\u8D60", "\u8D60"], /* CJK Ideograph */
+ ["\u8D61", "\u8D61"], /* CJK Ideograph */
+ ["\u8D62", "\u8D62"], /* CJK Ideograph */
+ ["\u8D63", "\u8D63"], /* CJK Ideograph */
+ ["\u8D64", "\u8D64"], /* CJK Ideograph */
+ ["\u8D65", "\u8D65"], /* CJK Ideograph */
+ ["\u8D66", "\u8D66"], /* CJK Ideograph */
+ ["\u8D67", "\u8D67"], /* CJK Ideograph */
+ ["\u8D68", "\u8D68"], /* CJK Ideograph */
+ ["\u8D69", "\u8D69"], /* CJK Ideograph */
+ ["\u8D6A", "\u8D6A"], /* CJK Ideograph */
+ ["\u8D6B", "\u8D6B"], /* CJK Ideograph */
+ ["\u8D6C", "\u8D6C"], /* CJK Ideograph */
+ ["\u8D6D", "\u8D6D"], /* CJK Ideograph */
+ ["\u8D6E", "\u8D6E"], /* CJK Ideograph */
+ ["\u8D6F", "\u8D6F"], /* CJK Ideograph */
+ ["\u8D70", "\u8D70"], /* CJK Ideograph */
+ ["\u8D71", "\u8D71"], /* CJK Ideograph */
+ ["\u8D72", "\u8D72"], /* CJK Ideograph */
+ ["\u8D73", "\u8D73"], /* CJK Ideograph */
+ ["\u8D74", "\u8D74"], /* CJK Ideograph */
+ ["\u8D75", "\u8D75"], /* CJK Ideograph */
+ ["\u8D76", "\u8D76"], /* CJK Ideograph */
+ ["\u8D77", "\u8D77"], /* CJK Ideograph */
+ ["\u8D78", "\u8D78"], /* CJK Ideograph */
+ ["\u8D79", "\u8D79"], /* CJK Ideograph */
+ ["\u8D7A", "\u8D7A"], /* CJK Ideograph */
+ ["\u8D7B", "\u8D7B"], /* CJK Ideograph */
+ ["\u8D7C", "\u8D7C"], /* CJK Ideograph */
+ ["\u8D7D", "\u8D7D"], /* CJK Ideograph */
+ ["\u8D7E", "\u8D7E"], /* CJK Ideograph */
+ ["\u8D7F", "\u8D7F"], /* CJK Ideograph */
+ ["\u8D80", "\u8D80"], /* CJK Ideograph */
+ ["\u8D81", "\u8D81"], /* CJK Ideograph */
+ ["\u8D82", "\u8D82"], /* CJK Ideograph */
+ ["\u8D83", "\u8D83"], /* CJK Ideograph */
+ ["\u8D84", "\u8D84"], /* CJK Ideograph */
+ ["\u8D85", "\u8D85"], /* CJK Ideograph */
+ ["\u8D86", "\u8D86"], /* CJK Ideograph */
+ ["\u8D87", "\u8D87"], /* CJK Ideograph */
+ ["\u8D88", "\u8D88"], /* CJK Ideograph */
+ ["\u8D89", "\u8D89"], /* CJK Ideograph */
+ ["\u8D8A", "\u8D8A"], /* CJK Ideograph */
+ ["\u8D8B", "\u8D8B"], /* CJK Ideograph */
+ ["\u8D8C", "\u8D8C"], /* CJK Ideograph */
+ ["\u8D8D", "\u8D8D"], /* CJK Ideograph */
+ ["\u8D8E", "\u8D8E"], /* CJK Ideograph */
+ ["\u8D8F", "\u8D8F"], /* CJK Ideograph */
+ ["\u8D90", "\u8D90"], /* CJK Ideograph */
+ ["\u8D91", "\u8D91"], /* CJK Ideograph */
+ ["\u8D92", "\u8D92"], /* CJK Ideograph */
+ ["\u8D93", "\u8D93"], /* CJK Ideograph */
+ ["\u8D94", "\u8D94"], /* CJK Ideograph */
+ ["\u8D95", "\u8D95"], /* CJK Ideograph */
+ ["\u8D96", "\u8D96"], /* CJK Ideograph */
+ ["\u8D97", "\u8D97"], /* CJK Ideograph */
+ ["\u8D98", "\u8D98"], /* CJK Ideograph */
+ ["\u8D99", "\u8D99"], /* CJK Ideograph */
+ ["\u8D9A", "\u8D9A"], /* CJK Ideograph */
+ ["\u8D9B", "\u8D9B"], /* CJK Ideograph */
+ ["\u8D9C", "\u8D9C"], /* CJK Ideograph */
+ ["\u8D9D", "\u8D9D"], /* CJK Ideograph */
+ ["\u8D9E", "\u8D9E"], /* CJK Ideograph */
+ ["\u8D9F", "\u8D9F"], /* CJK Ideograph */
+ ["\u8DA0", "\u8DA0"], /* CJK Ideograph */
+ ["\u8DA1", "\u8DA1"], /* CJK Ideograph */
+ ["\u8DA2", "\u8DA2"], /* CJK Ideograph */
+ ["\u8DA3", "\u8DA3"], /* CJK Ideograph */
+ ["\u8DA4", "\u8DA4"], /* CJK Ideograph */
+ ["\u8DA5", "\u8DA5"], /* CJK Ideograph */
+ ["\u8DA6", "\u8DA6"], /* CJK Ideograph */
+ ["\u8DA7", "\u8DA7"], /* CJK Ideograph */
+ ["\u8DA8", "\u8DA8"], /* CJK Ideograph */
+ ["\u8DA9", "\u8DA9"], /* CJK Ideograph */
+ ["\u8DAA", "\u8DAA"], /* CJK Ideograph */
+ ["\u8DAB", "\u8DAB"], /* CJK Ideograph */
+ ["\u8DAC", "\u8DAC"], /* CJK Ideograph */
+ ["\u8DAD", "\u8DAD"], /* CJK Ideograph */
+ ["\u8DAE", "\u8DAE"], /* CJK Ideograph */
+ ["\u8DAF", "\u8DAF"], /* CJK Ideograph */
+ ["\u8DB0", "\u8DB0"], /* CJK Ideograph */
+ ["\u8DB1", "\u8DB1"], /* CJK Ideograph */
+ ["\u8DB2", "\u8DB2"], /* CJK Ideograph */
+ ["\u8DB3", "\u8DB3"], /* CJK Ideograph */
+ ["\u8DB4", "\u8DB4"], /* CJK Ideograph */
+ ["\u8DB5", "\u8DB5"], /* CJK Ideograph */
+ ["\u8DB6", "\u8DB6"], /* CJK Ideograph */
+ ["\u8DB7", "\u8DB7"], /* CJK Ideograph */
+ ["\u8DB8", "\u8DB8"], /* CJK Ideograph */
+ ["\u8DB9", "\u8DB9"], /* CJK Ideograph */
+ ["\u8DBA", "\u8DBA"], /* CJK Ideograph */
+ ["\u8DBB", "\u8DBB"], /* CJK Ideograph */
+ ["\u8DBC", "\u8DBC"], /* CJK Ideograph */
+ ["\u8DBD", "\u8DBD"], /* CJK Ideograph */
+ ["\u8DBE", "\u8DBE"], /* CJK Ideograph */
+ ["\u8DBF", "\u8DBF"], /* CJK Ideograph */
+ ["\u8DC0", "\u8DC0"], /* CJK Ideograph */
+ ["\u8DC1", "\u8DC1"], /* CJK Ideograph */
+ ["\u8DC2", "\u8DC2"], /* CJK Ideograph */
+ ["\u8DC3", "\u8DC3"], /* CJK Ideograph */
+ ["\u8DC4", "\u8DC4"], /* CJK Ideograph */
+ ["\u8DC5", "\u8DC5"], /* CJK Ideograph */
+ ["\u8DC6", "\u8DC6"], /* CJK Ideograph */
+ ["\u8DC7", "\u8DC7"], /* CJK Ideograph */
+ ["\u8DC8", "\u8DC8"], /* CJK Ideograph */
+ ["\u8DC9", "\u8DC9"], /* CJK Ideograph */
+ ["\u8DCA", "\u8DCA"], /* CJK Ideograph */
+ ["\u8DCB", "\u8DCB"], /* CJK Ideograph */
+ ["\u8DCC", "\u8DCC"], /* CJK Ideograph */
+ ["\u8DCD", "\u8DCD"], /* CJK Ideograph */
+ ["\u8DCE", "\u8DCE"], /* CJK Ideograph */
+ ["\u8DCF", "\u8DCF"], /* CJK Ideograph */
+ ["\u8DD0", "\u8DD0"], /* CJK Ideograph */
+ ["\u8DD1", "\u8DD1"], /* CJK Ideograph */
+ ["\u8DD2", "\u8DD2"], /* CJK Ideograph */
+ ["\u8DD3", "\u8DD3"], /* CJK Ideograph */
+ ["\u8DD4", "\u8DD4"], /* CJK Ideograph */
+ ["\u8DD5", "\u8DD5"], /* CJK Ideograph */
+ ["\u8DD6", "\u8DD6"], /* CJK Ideograph */
+ ["\u8DD7", "\u8DD7"], /* CJK Ideograph */
+ ["\u8DD8", "\u8DD8"], /* CJK Ideograph */
+ ["\u8DD9", "\u8DD9"], /* CJK Ideograph */
+ ["\u8DDA", "\u8DDA"], /* CJK Ideograph */
+ ["\u8DDB", "\u8DDB"], /* CJK Ideograph */
+ ["\u8DDC", "\u8DDC"], /* CJK Ideograph */
+ ["\u8DDD", "\u8DDD"], /* CJK Ideograph */
+ ["\u8DDE", "\u8DDE"], /* CJK Ideograph */
+ ["\u8DDF", "\u8DDF"], /* CJK Ideograph */
+ ["\u8DE0", "\u8DE0"], /* CJK Ideograph */
+ ["\u8DE1", "\u8DE1"], /* CJK Ideograph */
+ ["\u8DE2", "\u8DE2"], /* CJK Ideograph */
+ ["\u8DE3", "\u8DE3"], /* CJK Ideograph */
+ ["\u8DE4", "\u8DE4"], /* CJK Ideograph */
+ ["\u8DE5", "\u8DE5"], /* CJK Ideograph */
+ ["\u8DE6", "\u8DE6"], /* CJK Ideograph */
+ ["\u8DE7", "\u8DE7"], /* CJK Ideograph */
+ ["\u8DE8", "\u8DE8"], /* CJK Ideograph */
+ ["\u8DE9", "\u8DE9"], /* CJK Ideograph */
+ ["\u8DEA", "\u8DEA"], /* CJK Ideograph */
+ ["\u8DEB", "\u8DEB"], /* CJK Ideograph */
+ ["\u8DEC", "\u8DEC"], /* CJK Ideograph */
+ ["\u8DED", "\u8DED"], /* CJK Ideograph */
+ ["\u8DEE", "\u8DEE"], /* CJK Ideograph */
+ ["\u8DEF", "\u8DEF"], /* CJK Ideograph */
+ ["\u8DF0", "\u8DF0"], /* CJK Ideograph */
+ ["\u8DF1", "\u8DF1"], /* CJK Ideograph */
+ ["\u8DF2", "\u8DF2"], /* CJK Ideograph */
+ ["\u8DF3", "\u8DF3"], /* CJK Ideograph */
+ ["\u8DF4", "\u8DF4"], /* CJK Ideograph */
+ ["\u8DF5", "\u8DF5"], /* CJK Ideograph */
+ ["\u8DF6", "\u8DF6"], /* CJK Ideograph */
+ ["\u8DF7", "\u8DF7"], /* CJK Ideograph */
+ ["\u8DF8", "\u8DF8"], /* CJK Ideograph */
+ ["\u8DF9", "\u8DF9"], /* CJK Ideograph */
+ ["\u8DFA", "\u8DFA"], /* CJK Ideograph */
+ ["\u8DFB", "\u8DFB"], /* CJK Ideograph */
+ ["\u8DFC", "\u8DFC"], /* CJK Ideograph */
+ ["\u8DFD", "\u8DFD"], /* CJK Ideograph */
+ ["\u8DFE", "\u8DFE"], /* CJK Ideograph */
+ ["\u8DFF", "\u8DFF"], /* CJK Ideograph */
+ ["\u8E00", "\u8E00"], /* CJK Ideograph */
+ ["\u8E01", "\u8E01"], /* CJK Ideograph */
+ ["\u8E02", "\u8E02"], /* CJK Ideograph */
+ ["\u8E03", "\u8E03"], /* CJK Ideograph */
+ ["\u8E04", "\u8E04"], /* CJK Ideograph */
+ ["\u8E05", "\u8E05"], /* CJK Ideograph */
+ ["\u8E06", "\u8E06"], /* CJK Ideograph */
+ ["\u8E07", "\u8E07"], /* CJK Ideograph */
+ ["\u8E08", "\u8E08"], /* CJK Ideograph */
+ ["\u8E09", "\u8E09"], /* CJK Ideograph */
+ ["\u8E0A", "\u8E0A"], /* CJK Ideograph */
+ ["\u8E0B", "\u8E0B"], /* CJK Ideograph */
+ ["\u8E0C", "\u8E0C"], /* CJK Ideograph */
+ ["\u8E0D", "\u8E0D"], /* CJK Ideograph */
+ ["\u8E0E", "\u8E0E"], /* CJK Ideograph */
+ ["\u8E0F", "\u8E0F"], /* CJK Ideograph */
+ ["\u8E10", "\u8E10"], /* CJK Ideograph */
+ ["\u8E11", "\u8E11"], /* CJK Ideograph */
+ ["\u8E12", "\u8E12"], /* CJK Ideograph */
+ ["\u8E13", "\u8E13"], /* CJK Ideograph */
+ ["\u8E14", "\u8E14"], /* CJK Ideograph */
+ ["\u8E15", "\u8E15"], /* CJK Ideograph */
+ ["\u8E16", "\u8E16"], /* CJK Ideograph */
+ ["\u8E17", "\u8E17"], /* CJK Ideograph */
+ ["\u8E18", "\u8E18"], /* CJK Ideograph */
+ ["\u8E19", "\u8E19"], /* CJK Ideograph */
+ ["\u8E1A", "\u8E1A"], /* CJK Ideograph */
+ ["\u8E1B", "\u8E1B"], /* CJK Ideograph */
+ ["\u8E1C", "\u8E1C"], /* CJK Ideograph */
+ ["\u8E1D", "\u8E1D"], /* CJK Ideograph */
+ ["\u8E1E", "\u8E1E"], /* CJK Ideograph */
+ ["\u8E1F", "\u8E1F"], /* CJK Ideograph */
+ ["\u8E20", "\u8E20"], /* CJK Ideograph */
+ ["\u8E21", "\u8E21"], /* CJK Ideograph */
+ ["\u8E22", "\u8E22"], /* CJK Ideograph */
+ ["\u8E23", "\u8E23"], /* CJK Ideograph */
+ ["\u8E24", "\u8E24"], /* CJK Ideograph */
+ ["\u8E25", "\u8E25"], /* CJK Ideograph */
+ ["\u8E26", "\u8E26"], /* CJK Ideograph */
+ ["\u8E27", "\u8E27"], /* CJK Ideograph */
+ ["\u8E28", "\u8E28"], /* CJK Ideograph */
+ ["\u8E29", "\u8E29"], /* CJK Ideograph */
+ ["\u8E2A", "\u8E2A"], /* CJK Ideograph */
+ ["\u8E2B", "\u8E2B"], /* CJK Ideograph */
+ ["\u8E2C", "\u8E2C"], /* CJK Ideograph */
+ ["\u8E2D", "\u8E2D"], /* CJK Ideograph */
+ ["\u8E2E", "\u8E2E"], /* CJK Ideograph */
+ ["\u8E2F", "\u8E2F"], /* CJK Ideograph */
+ ["\u8E30", "\u8E30"], /* CJK Ideograph */
+ ["\u8E31", "\u8E31"], /* CJK Ideograph */
+ ["\u8E32", "\u8E32"], /* CJK Ideograph */
+ ["\u8E33", "\u8E33"], /* CJK Ideograph */
+ ["\u8E34", "\u8E34"], /* CJK Ideograph */
+ ["\u8E35", "\u8E35"], /* CJK Ideograph */
+ ["\u8E36", "\u8E36"], /* CJK Ideograph */
+ ["\u8E37", "\u8E37"], /* CJK Ideograph */
+ ["\u8E38", "\u8E38"], /* CJK Ideograph */
+ ["\u8E39", "\u8E39"], /* CJK Ideograph */
+ ["\u8E3A", "\u8E3A"], /* CJK Ideograph */
+ ["\u8E3B", "\u8E3B"], /* CJK Ideograph */
+ ["\u8E3C", "\u8E3C"], /* CJK Ideograph */
+ ["\u8E3D", "\u8E3D"], /* CJK Ideograph */
+ ["\u8E3E", "\u8E3E"], /* CJK Ideograph */
+ ["\u8E3F", "\u8E3F"], /* CJK Ideograph */
+ ["\u8E40", "\u8E40"], /* CJK Ideograph */
+ ["\u8E41", "\u8E41"], /* CJK Ideograph */
+ ["\u8E42", "\u8E42"], /* CJK Ideograph */
+ ["\u8E43", "\u8E43"], /* CJK Ideograph */
+ ["\u8E44", "\u8E44"], /* CJK Ideograph */
+ ["\u8E45", "\u8E45"], /* CJK Ideograph */
+ ["\u8E46", "\u8E46"], /* CJK Ideograph */
+ ["\u8E47", "\u8E47"], /* CJK Ideograph */
+ ["\u8E48", "\u8E48"], /* CJK Ideograph */
+ ["\u8E49", "\u8E49"], /* CJK Ideograph */
+ ["\u8E4A", "\u8E4A"], /* CJK Ideograph */
+ ["\u8E4B", "\u8E4B"], /* CJK Ideograph */
+ ["\u8E4C", "\u8E4C"], /* CJK Ideograph */
+ ["\u8E4D", "\u8E4D"], /* CJK Ideograph */
+ ["\u8E4E", "\u8E4E"], /* CJK Ideograph */
+ ["\u8E4F", "\u8E4F"], /* CJK Ideograph */
+ ["\u8E50", "\u8E50"], /* CJK Ideograph */
+ ["\u8E51", "\u8E51"], /* CJK Ideograph */
+ ["\u8E52", "\u8E52"], /* CJK Ideograph */
+ ["\u8E53", "\u8E53"], /* CJK Ideograph */
+ ["\u8E54", "\u8E54"], /* CJK Ideograph */
+ ["\u8E55", "\u8E55"], /* CJK Ideograph */
+ ["\u8E56", "\u8E56"], /* CJK Ideograph */
+ ["\u8E57", "\u8E57"], /* CJK Ideograph */
+ ["\u8E58", "\u8E58"], /* CJK Ideograph */
+ ["\u8E59", "\u8E59"], /* CJK Ideograph */
+ ["\u8E5A", "\u8E5A"], /* CJK Ideograph */
+ ["\u8E5B", "\u8E5B"], /* CJK Ideograph */
+ ["\u8E5C", "\u8E5C"], /* CJK Ideograph */
+ ["\u8E5D", "\u8E5D"], /* CJK Ideograph */
+ ["\u8E5E", "\u8E5E"], /* CJK Ideograph */
+ ["\u8E5F", "\u8E5F"], /* CJK Ideograph */
+ ["\u8E60", "\u8E60"], /* CJK Ideograph */
+ ["\u8E61", "\u8E61"], /* CJK Ideograph */
+ ["\u8E62", "\u8E62"], /* CJK Ideograph */
+ ["\u8E63", "\u8E63"], /* CJK Ideograph */
+ ["\u8E64", "\u8E64"], /* CJK Ideograph */
+ ["\u8E65", "\u8E65"], /* CJK Ideograph */
+ ["\u8E66", "\u8E66"], /* CJK Ideograph */
+ ["\u8E67", "\u8E67"], /* CJK Ideograph */
+ ["\u8E68", "\u8E68"], /* CJK Ideograph */
+ ["\u8E69", "\u8E69"], /* CJK Ideograph */
+ ["\u8E6A", "\u8E6A"], /* CJK Ideograph */
+ ["\u8E6B", "\u8E6B"], /* CJK Ideograph */
+ ["\u8E6C", "\u8E6C"], /* CJK Ideograph */
+ ["\u8E6D", "\u8E6D"], /* CJK Ideograph */
+ ["\u8E6E", "\u8E6E"], /* CJK Ideograph */
+ ["\u8E6F", "\u8E6F"], /* CJK Ideograph */
+ ["\u8E70", "\u8E70"], /* CJK Ideograph */
+ ["\u8E71", "\u8E71"], /* CJK Ideograph */
+ ["\u8E72", "\u8E72"], /* CJK Ideograph */
+ ["\u8E73", "\u8E73"], /* CJK Ideograph */
+ ["\u8E74", "\u8E74"], /* CJK Ideograph */
+ ["\u8E75", "\u8E75"], /* CJK Ideograph */
+ ["\u8E76", "\u8E76"], /* CJK Ideograph */
+ ["\u8E77", "\u8E77"], /* CJK Ideograph */
+ ["\u8E78", "\u8E78"], /* CJK Ideograph */
+ ["\u8E79", "\u8E79"], /* CJK Ideograph */
+ ["\u8E7A", "\u8E7A"], /* CJK Ideograph */
+ ["\u8E7B", "\u8E7B"], /* CJK Ideograph */
+ ["\u8E7C", "\u8E7C"], /* CJK Ideograph */
+ ["\u8E7D", "\u8E7D"], /* CJK Ideograph */
+ ["\u8E7E", "\u8E7E"], /* CJK Ideograph */
+ ["\u8E7F", "\u8E7F"], /* CJK Ideograph */
+ ["\u8E80", "\u8E80"], /* CJK Ideograph */
+ ["\u8E81", "\u8E81"], /* CJK Ideograph */
+ ["\u8E82", "\u8E82"], /* CJK Ideograph */
+ ["\u8E83", "\u8E83"], /* CJK Ideograph */
+ ["\u8E84", "\u8E84"], /* CJK Ideograph */
+ ["\u8E85", "\u8E85"], /* CJK Ideograph */
+ ["\u8E86", "\u8E86"], /* CJK Ideograph */
+ ["\u8E87", "\u8E87"], /* CJK Ideograph */
+ ["\u8E88", "\u8E88"], /* CJK Ideograph */
+ ["\u8E89", "\u8E89"], /* CJK Ideograph */
+ ["\u8E8A", "\u8E8A"], /* CJK Ideograph */
+ ["\u8E8B", "\u8E8B"], /* CJK Ideograph */
+ ["\u8E8C", "\u8E8C"], /* CJK Ideograph */
+ ["\u8E8D", "\u8E8D"], /* CJK Ideograph */
+ ["\u8E8E", "\u8E8E"], /* CJK Ideograph */
+ ["\u8E8F", "\u8E8F"], /* CJK Ideograph */
+ ["\u8E90", "\u8E90"], /* CJK Ideograph */
+ ["\u8E91", "\u8E91"], /* CJK Ideograph */
+ ["\u8E92", "\u8E92"], /* CJK Ideograph */
+ ["\u8E93", "\u8E93"], /* CJK Ideograph */
+ ["\u8E94", "\u8E94"], /* CJK Ideograph */
+ ["\u8E95", "\u8E95"], /* CJK Ideograph */
+ ["\u8E96", "\u8E96"], /* CJK Ideograph */
+ ["\u8E97", "\u8E97"], /* CJK Ideograph */
+ ["\u8E98", "\u8E98"], /* CJK Ideograph */
+ ["\u8E99", "\u8E99"], /* CJK Ideograph */
+ ["\u8E9A", "\u8E9A"], /* CJK Ideograph */
+ ["\u8E9B", "\u8E9B"], /* CJK Ideograph */
+ ["\u8E9C", "\u8E9C"], /* CJK Ideograph */
+ ["\u8E9D", "\u8E9D"], /* CJK Ideograph */
+ ["\u8E9E", "\u8E9E"], /* CJK Ideograph */
+ ["\u8E9F", "\u8E9F"], /* CJK Ideograph */
+ ["\u8EA0", "\u8EA0"], /* CJK Ideograph */
+ ["\u8EA1", "\u8EA1"], /* CJK Ideograph */
+ ["\u8EA2", "\u8EA2"], /* CJK Ideograph */
+ ["\u8EA3", "\u8EA3"], /* CJK Ideograph */
+ ["\u8EA4", "\u8EA4"], /* CJK Ideograph */
+ ["\u8EA5", "\u8EA5"], /* CJK Ideograph */
+ ["\u8EA6", "\u8EA6"], /* CJK Ideograph */
+ ["\u8EA7", "\u8EA7"], /* CJK Ideograph */
+ ["\u8EA8", "\u8EA8"], /* CJK Ideograph */
+ ["\u8EA9", "\u8EA9"], /* CJK Ideograph */
+ ["\u8EAA", "\u8EAA"], /* CJK Ideograph */
+ ["\u8EAB", "\u8EAB"], /* CJK Ideograph */
+ ["\u8EAC", "\u8EAC"], /* CJK Ideograph */
+ ["\u8EAD", "\u8EAD"], /* CJK Ideograph */
+ ["\u8EAE", "\u8EAE"], /* CJK Ideograph */
+ ["\u8EAF", "\u8EAF"], /* CJK Ideograph */
+ ["\u8EB0", "\u8EB0"], /* CJK Ideograph */
+ ["\u8EB1", "\u8EB1"], /* CJK Ideograph */
+ ["\u8EB2", "\u8EB2"], /* CJK Ideograph */
+ ["\u8EB3", "\u8EB3"], /* CJK Ideograph */
+ ["\u8EB4", "\u8EB4"], /* CJK Ideograph */
+ ["\u8EB5", "\u8EB5"], /* CJK Ideograph */
+ ["\u8EB6", "\u8EB6"], /* CJK Ideograph */
+ ["\u8EB7", "\u8EB7"], /* CJK Ideograph */
+ ["\u8EB8", "\u8EB8"], /* CJK Ideograph */
+ ["\u8EB9", "\u8EB9"], /* CJK Ideograph */
+ ["\u8EBA", "\u8EBA"], /* CJK Ideograph */
+ ["\u8EBB", "\u8EBB"], /* CJK Ideograph */
+ ["\u8EBC", "\u8EBC"], /* CJK Ideograph */
+ ["\u8EBD", "\u8EBD"], /* CJK Ideograph */
+ ["\u8EBE", "\u8EBE"], /* CJK Ideograph */
+ ["\u8EBF", "\u8EBF"], /* CJK Ideograph */
+ ["\u8EC0", "\u8EC0"], /* CJK Ideograph */
+ ["\u8EC1", "\u8EC1"], /* CJK Ideograph */
+ ["\u8EC2", "\u8EC2"], /* CJK Ideograph */
+ ["\u8EC3", "\u8EC3"], /* CJK Ideograph */
+ ["\u8EC4", "\u8EC4"], /* CJK Ideograph */
+ ["\u8EC5", "\u8EC5"], /* CJK Ideograph */
+ ["\u8EC6", "\u8EC6"], /* CJK Ideograph */
+ ["\u8EC7", "\u8EC7"], /* CJK Ideograph */
+ ["\u8EC8", "\u8EC8"], /* CJK Ideograph */
+ ["\u8EC9", "\u8EC9"], /* CJK Ideograph */
+ ["\u8ECA", "\u8ECA"], /* CJK Ideograph */
+ ["\u8ECB", "\u8ECB"], /* CJK Ideograph */
+ ["\u8ECC", "\u8ECC"], /* CJK Ideograph */
+ ["\u8ECD", "\u8ECD"], /* CJK Ideograph */
+ ["\u8ECE", "\u8ECE"], /* CJK Ideograph */
+ ["\u8ECF", "\u8ECF"], /* CJK Ideograph */
+ ["\u8ED0", "\u8ED0"], /* CJK Ideograph */
+ ["\u8ED1", "\u8ED1"], /* CJK Ideograph */
+ ["\u8ED2", "\u8ED2"], /* CJK Ideograph */
+ ["\u8ED3", "\u8ED3"], /* CJK Ideograph */
+ ["\u8ED4", "\u8ED4"], /* CJK Ideograph */
+ ["\u8ED5", "\u8ED5"], /* CJK Ideograph */
+ ["\u8ED6", "\u8ED6"], /* CJK Ideograph */
+ ["\u8ED7", "\u8ED7"], /* CJK Ideograph */
+ ["\u8ED8", "\u8ED8"], /* CJK Ideograph */
+ ["\u8ED9", "\u8ED9"], /* CJK Ideograph */
+ ["\u8EDA", "\u8EDA"], /* CJK Ideograph */
+ ["\u8EDB", "\u8EDB"], /* CJK Ideograph */
+ ["\u8EDC", "\u8EDC"], /* CJK Ideograph */
+ ["\u8EDD", "\u8EDD"], /* CJK Ideograph */
+ ["\u8EDE", "\u8EDE"], /* CJK Ideograph */
+ ["\u8EDF", "\u8EDF"], /* CJK Ideograph */
+ ["\u8EE0", "\u8EE0"], /* CJK Ideograph */
+ ["\u8EE1", "\u8EE1"], /* CJK Ideograph */
+ ["\u8EE2", "\u8EE2"], /* CJK Ideograph */
+ ["\u8EE3", "\u8EE3"], /* CJK Ideograph */
+ ["\u8EE4", "\u8EE4"], /* CJK Ideograph */
+ ["\u8EE5", "\u8EE5"], /* CJK Ideograph */
+ ["\u8EE6", "\u8EE6"], /* CJK Ideograph */
+ ["\u8EE7", "\u8EE7"], /* CJK Ideograph */
+ ["\u8EE8", "\u8EE8"], /* CJK Ideograph */
+ ["\u8EE9", "\u8EE9"], /* CJK Ideograph */
+ ["\u8EEA", "\u8EEA"], /* CJK Ideograph */
+ ["\u8EEB", "\u8EEB"], /* CJK Ideograph */
+ ["\u8EEC", "\u8EEC"], /* CJK Ideograph */
+ ["\u8EED", "\u8EED"], /* CJK Ideograph */
+ ["\u8EEE", "\u8EEE"], /* CJK Ideograph */
+ ["\u8EEF", "\u8EEF"], /* CJK Ideograph */
+ ["\u8EF0", "\u8EF0"], /* CJK Ideograph */
+ ["\u8EF1", "\u8EF1"], /* CJK Ideograph */
+ ["\u8EF2", "\u8EF2"], /* CJK Ideograph */
+ ["\u8EF3", "\u8EF3"], /* CJK Ideograph */
+ ["\u8EF4", "\u8EF4"], /* CJK Ideograph */
+ ["\u8EF5", "\u8EF5"], /* CJK Ideograph */
+ ["\u8EF6", "\u8EF6"], /* CJK Ideograph */
+ ["\u8EF7", "\u8EF7"], /* CJK Ideograph */
+ ["\u8EF8", "\u8EF8"], /* CJK Ideograph */
+ ["\u8EF9", "\u8EF9"], /* CJK Ideograph */
+ ["\u8EFA", "\u8EFA"], /* CJK Ideograph */
+ ["\u8EFB", "\u8EFB"], /* CJK Ideograph */
+ ["\u8EFC", "\u8EFC"], /* CJK Ideograph */
+ ["\u8EFD", "\u8EFD"], /* CJK Ideograph */
+ ["\u8EFE", "\u8EFE"], /* CJK Ideograph */
+ ["\u8EFF", "\u8EFF"], /* CJK Ideograph */
+ ["\u8F00", "\u8F00"], /* CJK Ideograph */
+ ["\u8F01", "\u8F01"], /* CJK Ideograph */
+ ["\u8F02", "\u8F02"], /* CJK Ideograph */
+ ["\u8F03", "\u8F03"], /* CJK Ideograph */
+ ["\u8F04", "\u8F04"], /* CJK Ideograph */
+ ["\u8F05", "\u8F05"], /* CJK Ideograph */
+ ["\u8F06", "\u8F06"], /* CJK Ideograph */
+ ["\u8F07", "\u8F07"], /* CJK Ideograph */
+ ["\u8F08", "\u8F08"], /* CJK Ideograph */
+ ["\u8F09", "\u8F09"], /* CJK Ideograph */
+ ["\u8F0A", "\u8F0A"], /* CJK Ideograph */
+ ["\u8F0B", "\u8F0B"], /* CJK Ideograph */
+ ["\u8F0C", "\u8F0C"], /* CJK Ideograph */
+ ["\u8F0D", "\u8F0D"], /* CJK Ideograph */
+ ["\u8F0E", "\u8F0E"], /* CJK Ideograph */
+ ["\u8F0F", "\u8F0F"], /* CJK Ideograph */
+ ["\u8F10", "\u8F10"], /* CJK Ideograph */
+ ["\u8F11", "\u8F11"], /* CJK Ideograph */
+ ["\u8F12", "\u8F12"], /* CJK Ideograph */
+ ["\u8F13", "\u8F13"], /* CJK Ideograph */
+ ["\u8F14", "\u8F14"], /* CJK Ideograph */
+ ["\u8F15", "\u8F15"], /* CJK Ideograph */
+ ["\u8F16", "\u8F16"], /* CJK Ideograph */
+ ["\u8F17", "\u8F17"], /* CJK Ideograph */
+ ["\u8F18", "\u8F18"], /* CJK Ideograph */
+ ["\u8F19", "\u8F19"], /* CJK Ideograph */
+ ["\u8F1A", "\u8F1A"], /* CJK Ideograph */
+ ["\u8F1B", "\u8F1B"], /* CJK Ideograph */
+ ["\u8F1C", "\u8F1C"], /* CJK Ideograph */
+ ["\u8F1D", "\u8F1D"], /* CJK Ideograph */
+ ["\u8F1E", "\u8F1E"], /* CJK Ideograph */
+ ["\u8F1F", "\u8F1F"], /* CJK Ideograph */
+ ["\u8F20", "\u8F20"], /* CJK Ideograph */
+ ["\u8F21", "\u8F21"], /* CJK Ideograph */
+ ["\u8F22", "\u8F22"], /* CJK Ideograph */
+ ["\u8F23", "\u8F23"], /* CJK Ideograph */
+ ["\u8F24", "\u8F24"], /* CJK Ideograph */
+ ["\u8F25", "\u8F25"], /* CJK Ideograph */
+ ["\u8F26", "\u8F26"], /* CJK Ideograph */
+ ["\u8F27", "\u8F27"], /* CJK Ideograph */
+ ["\u8F28", "\u8F28"], /* CJK Ideograph */
+ ["\u8F29", "\u8F29"], /* CJK Ideograph */
+ ["\u8F2A", "\u8F2A"], /* CJK Ideograph */
+ ["\u8F2B", "\u8F2B"], /* CJK Ideograph */
+ ["\u8F2C", "\u8F2C"], /* CJK Ideograph */
+ ["\u8F2D", "\u8F2D"], /* CJK Ideograph */
+ ["\u8F2E", "\u8F2E"], /* CJK Ideograph */
+ ["\u8F2F", "\u8F2F"], /* CJK Ideograph */
+ ["\u8F30", "\u8F30"], /* CJK Ideograph */
+ ["\u8F31", "\u8F31"], /* CJK Ideograph */
+ ["\u8F32", "\u8F32"], /* CJK Ideograph */
+ ["\u8F33", "\u8F33"], /* CJK Ideograph */
+ ["\u8F34", "\u8F34"], /* CJK Ideograph */
+ ["\u8F35", "\u8F35"], /* CJK Ideograph */
+ ["\u8F36", "\u8F36"], /* CJK Ideograph */
+ ["\u8F37", "\u8F37"], /* CJK Ideograph */
+ ["\u8F38", "\u8F38"], /* CJK Ideograph */
+ ["\u8F39", "\u8F39"], /* CJK Ideograph */
+ ["\u8F3A", "\u8F3A"], /* CJK Ideograph */
+ ["\u8F3B", "\u8F3B"], /* CJK Ideograph */
+ ["\u8F3C", "\u8F3C"], /* CJK Ideograph */
+ ["\u8F3D", "\u8F3D"], /* CJK Ideograph */
+ ["\u8F3E", "\u8F3E"], /* CJK Ideograph */
+ ["\u8F3F", "\u8F3F"], /* CJK Ideograph */
+ ["\u8F40", "\u8F40"], /* CJK Ideograph */
+ ["\u8F41", "\u8F41"], /* CJK Ideograph */
+ ["\u8F42", "\u8F42"], /* CJK Ideograph */
+ ["\u8F43", "\u8F43"], /* CJK Ideograph */
+ ["\u8F44", "\u8F44"], /* CJK Ideograph */
+ ["\u8F45", "\u8F45"], /* CJK Ideograph */
+ ["\u8F46", "\u8F46"], /* CJK Ideograph */
+ ["\u8F47", "\u8F47"], /* CJK Ideograph */
+ ["\u8F48", "\u8F48"], /* CJK Ideograph */
+ ["\u8F49", "\u8F49"], /* CJK Ideograph */
+ ["\u8F4A", "\u8F4A"], /* CJK Ideograph */
+ ["\u8F4B", "\u8F4B"], /* CJK Ideograph */
+ ["\u8F4C", "\u8F4C"], /* CJK Ideograph */
+ ["\u8F4D", "\u8F4D"], /* CJK Ideograph */
+ ["\u8F4E", "\u8F4E"], /* CJK Ideograph */
+ ["\u8F4F", "\u8F4F"], /* CJK Ideograph */
+ ["\u8F50", "\u8F50"], /* CJK Ideograph */
+ ["\u8F51", "\u8F51"], /* CJK Ideograph */
+ ["\u8F52", "\u8F52"], /* CJK Ideograph */
+ ["\u8F53", "\u8F53"], /* CJK Ideograph */
+ ["\u8F54", "\u8F54"], /* CJK Ideograph */
+ ["\u8F55", "\u8F55"], /* CJK Ideograph */
+ ["\u8F56", "\u8F56"], /* CJK Ideograph */
+ ["\u8F57", "\u8F57"], /* CJK Ideograph */
+ ["\u8F58", "\u8F58"], /* CJK Ideograph */
+ ["\u8F59", "\u8F59"], /* CJK Ideograph */
+ ["\u8F5A", "\u8F5A"], /* CJK Ideograph */
+ ["\u8F5B", "\u8F5B"], /* CJK Ideograph */
+ ["\u8F5C", "\u8F5C"], /* CJK Ideograph */
+ ["\u8F5D", "\u8F5D"], /* CJK Ideograph */
+ ["\u8F5E", "\u8F5E"], /* CJK Ideograph */
+ ["\u8F5F", "\u8F5F"], /* CJK Ideograph */
+ ["\u8F60", "\u8F60"], /* CJK Ideograph */
+ ["\u8F61", "\u8F61"], /* CJK Ideograph */
+ ["\u8F62", "\u8F62"], /* CJK Ideograph */
+ ["\u8F63", "\u8F63"], /* CJK Ideograph */
+ ["\u8F64", "\u8F64"], /* CJK Ideograph */
+ ["\u8F65", "\u8F65"], /* CJK Ideograph */
+ ["\u8F66", "\u8F66"], /* CJK Ideograph */
+ ["\u8F67", "\u8F67"], /* CJK Ideograph */
+ ["\u8F68", "\u8F68"], /* CJK Ideograph */
+ ["\u8F69", "\u8F69"], /* CJK Ideograph */
+ ["\u8F6A", "\u8F6A"], /* CJK Ideograph */
+ ["\u8F6B", "\u8F6B"], /* CJK Ideograph */
+ ["\u8F6C", "\u8F6C"], /* CJK Ideograph */
+ ["\u8F6D", "\u8F6D"], /* CJK Ideograph */
+ ["\u8F6E", "\u8F6E"], /* CJK Ideograph */
+ ["\u8F6F", "\u8F6F"], /* CJK Ideograph */
+ ["\u8F70", "\u8F70"], /* CJK Ideograph */
+ ["\u8F71", "\u8F71"], /* CJK Ideograph */
+ ["\u8F72", "\u8F72"], /* CJK Ideograph */
+ ["\u8F73", "\u8F73"], /* CJK Ideograph */
+ ["\u8F74", "\u8F74"], /* CJK Ideograph */
+ ["\u8F75", "\u8F75"], /* CJK Ideograph */
+ ["\u8F76", "\u8F76"], /* CJK Ideograph */
+ ["\u8F77", "\u8F77"], /* CJK Ideograph */
+ ["\u8F78", "\u8F78"], /* CJK Ideograph */
+ ["\u8F79", "\u8F79"], /* CJK Ideograph */
+ ["\u8F7A", "\u8F7A"], /* CJK Ideograph */
+ ["\u8F7B", "\u8F7B"], /* CJK Ideograph */
+ ["\u8F7C", "\u8F7C"], /* CJK Ideograph */
+ ["\u8F7D", "\u8F7D"], /* CJK Ideograph */
+ ["\u8F7E", "\u8F7E"], /* CJK Ideograph */
+ ["\u8F7F", "\u8F7F"], /* CJK Ideograph */
+ ["\u8F80", "\u8F80"], /* CJK Ideograph */
+ ["\u8F81", "\u8F81"], /* CJK Ideograph */
+ ["\u8F82", "\u8F82"], /* CJK Ideograph */
+ ["\u8F83", "\u8F83"], /* CJK Ideograph */
+ ["\u8F84", "\u8F84"], /* CJK Ideograph */
+ ["\u8F85", "\u8F85"], /* CJK Ideograph */
+ ["\u8F86", "\u8F86"], /* CJK Ideograph */
+ ["\u8F87", "\u8F87"], /* CJK Ideograph */
+ ["\u8F88", "\u8F88"], /* CJK Ideograph */
+ ["\u8F89", "\u8F89"], /* CJK Ideograph */
+ ["\u8F8A", "\u8F8A"], /* CJK Ideograph */
+ ["\u8F8B", "\u8F8B"], /* CJK Ideograph */
+ ["\u8F8C", "\u8F8C"], /* CJK Ideograph */
+ ["\u8F8D", "\u8F8D"], /* CJK Ideograph */
+ ["\u8F8E", "\u8F8E"], /* CJK Ideograph */
+ ["\u8F8F", "\u8F8F"], /* CJK Ideograph */
+ ["\u8F90", "\u8F90"], /* CJK Ideograph */
+ ["\u8F91", "\u8F91"], /* CJK Ideograph */
+ ["\u8F92", "\u8F92"], /* CJK Ideograph */
+ ["\u8F93", "\u8F93"], /* CJK Ideograph */
+ ["\u8F94", "\u8F94"], /* CJK Ideograph */
+ ["\u8F95", "\u8F95"], /* CJK Ideograph */
+ ["\u8F96", "\u8F96"], /* CJK Ideograph */
+ ["\u8F97", "\u8F97"], /* CJK Ideograph */
+ ["\u8F98", "\u8F98"], /* CJK Ideograph */
+ ["\u8F99", "\u8F99"], /* CJK Ideograph */
+ ["\u8F9A", "\u8F9A"], /* CJK Ideograph */
+ ["\u8F9B", "\u8F9B"], /* CJK Ideograph */
+ ["\u8F9C", "\u8F9C"], /* CJK Ideograph */
+ ["\u8F9D", "\u8F9D"], /* CJK Ideograph */
+ ["\u8F9E", "\u8F9E"], /* CJK Ideograph */
+ ["\u8F9F", "\u8F9F"], /* CJK Ideograph */
+ ["\u8FA0", "\u8FA0"], /* CJK Ideograph */
+ ["\u8FA1", "\u8FA1"], /* CJK Ideograph */
+ ["\u8FA2", "\u8FA2"], /* CJK Ideograph */
+ ["\u8FA3", "\u8FA3"], /* CJK Ideograph */
+ ["\u8FA4", "\u8FA4"], /* CJK Ideograph */
+ ["\u8FA5", "\u8FA5"], /* CJK Ideograph */
+ ["\u8FA6", "\u8FA6"], /* CJK Ideograph */
+ ["\u8FA7", "\u8FA7"], /* CJK Ideograph */
+ ["\u8FA8", "\u8FA8"], /* CJK Ideograph */
+ ["\u8FA9", "\u8FA9"], /* CJK Ideograph */
+ ["\u8FAA", "\u8FAA"], /* CJK Ideograph */
+ ["\u8FAB", "\u8FAB"], /* CJK Ideograph */
+ ["\u8FAC", "\u8FAC"], /* CJK Ideograph */
+ ["\u8FAD", "\u8FAD"], /* CJK Ideograph */
+ ["\u8FAE", "\u8FAE"], /* CJK Ideograph */
+ ["\u8FAF", "\u8FAF"], /* CJK Ideograph */
+ ["\u8FB0", "\u8FB0"], /* CJK Ideograph */
+ ["\u8FB1", "\u8FB1"], /* CJK Ideograph */
+ ["\u8FB2", "\u8FB2"], /* CJK Ideograph */
+ ["\u8FB3", "\u8FB3"], /* CJK Ideograph */
+ ["\u8FB4", "\u8FB4"], /* CJK Ideograph */
+ ["\u8FB5", "\u8FB5"], /* CJK Ideograph */
+ ["\u8FB6", "\u8FB6"], /* CJK Ideograph */
+ ["\u8FB7", "\u8FB7"], /* CJK Ideograph */
+ ["\u8FB8", "\u8FB8"], /* CJK Ideograph */
+ ["\u8FB9", "\u8FB9"], /* CJK Ideograph */
+ ["\u8FBA", "\u8FBA"], /* CJK Ideograph */
+ ["\u8FBB", "\u8FBB"], /* CJK Ideograph */
+ ["\u8FBC", "\u8FBC"], /* CJK Ideograph */
+ ["\u8FBD", "\u8FBD"], /* CJK Ideograph */
+ ["\u8FBE", "\u8FBE"], /* CJK Ideograph */
+ ["\u8FBF", "\u8FBF"], /* CJK Ideograph */
+ ["\u8FC0", "\u8FC0"], /* CJK Ideograph */
+ ["\u8FC1", "\u8FC1"], /* CJK Ideograph */
+ ["\u8FC2", "\u8FC2"], /* CJK Ideograph */
+ ["\u8FC3", "\u8FC3"], /* CJK Ideograph */
+ ["\u8FC4", "\u8FC4"], /* CJK Ideograph */
+ ["\u8FC5", "\u8FC5"], /* CJK Ideograph */
+ ["\u8FC6", "\u8FC6"], /* CJK Ideograph */
+ ["\u8FC7", "\u8FC7"], /* CJK Ideograph */
+ ["\u8FC8", "\u8FC8"], /* CJK Ideograph */
+ ["\u8FC9", "\u8FC9"], /* CJK Ideograph */
+ ["\u8FCA", "\u8FCA"], /* CJK Ideograph */
+ ["\u8FCB", "\u8FCB"], /* CJK Ideograph */
+ ["\u8FCC", "\u8FCC"], /* CJK Ideograph */
+ ["\u8FCD", "\u8FCD"], /* CJK Ideograph */
+ ["\u8FCE", "\u8FCE"], /* CJK Ideograph */
+ ["\u8FCF", "\u8FCF"], /* CJK Ideograph */
+ ["\u8FD0", "\u8FD0"], /* CJK Ideograph */
+ ["\u8FD1", "\u8FD1"], /* CJK Ideograph */
+ ["\u8FD2", "\u8FD2"], /* CJK Ideograph */
+ ["\u8FD3", "\u8FD3"], /* CJK Ideograph */
+ ["\u8FD4", "\u8FD4"], /* CJK Ideograph */
+ ["\u8FD5", "\u8FD5"], /* CJK Ideograph */
+ ["\u8FD6", "\u8FD6"], /* CJK Ideograph */
+ ["\u8FD7", "\u8FD7"], /* CJK Ideograph */
+ ["\u8FD8", "\u8FD8"], /* CJK Ideograph */
+ ["\u8FD9", "\u8FD9"], /* CJK Ideograph */
+ ["\u8FDA", "\u8FDA"], /* CJK Ideograph */
+ ["\u8FDB", "\u8FDB"], /* CJK Ideograph */
+ ["\u8FDC", "\u8FDC"], /* CJK Ideograph */
+ ["\u8FDD", "\u8FDD"], /* CJK Ideograph */
+ ["\u8FDE", "\u8FDE"], /* CJK Ideograph */
+ ["\u8FDF", "\u8FDF"], /* CJK Ideograph */
+ ["\u8FE0", "\u8FE0"], /* CJK Ideograph */
+ ["\u8FE1", "\u8FE1"], /* CJK Ideograph */
+ ["\u8FE2", "\u8FE2"], /* CJK Ideograph */
+ ["\u8FE3", "\u8FE3"], /* CJK Ideograph */
+ ["\u8FE4", "\u8FE4"], /* CJK Ideograph */
+ ["\u8FE5", "\u8FE5"], /* CJK Ideograph */
+ ["\u8FE6", "\u8FE6"], /* CJK Ideograph */
+ ["\u8FE7", "\u8FE7"], /* CJK Ideograph */
+ ["\u8FE8", "\u8FE8"], /* CJK Ideograph */
+ ["\u8FE9", "\u8FE9"], /* CJK Ideograph */
+ ["\u8FEA", "\u8FEA"], /* CJK Ideograph */
+ ["\u8FEB", "\u8FEB"], /* CJK Ideograph */
+ ["\u8FEC", "\u8FEC"], /* CJK Ideograph */
+ ["\u8FED", "\u8FED"], /* CJK Ideograph */
+ ["\u8FEE", "\u8FEE"], /* CJK Ideograph */
+ ["\u8FEF", "\u8FEF"], /* CJK Ideograph */
+ ["\u8FF0", "\u8FF0"], /* CJK Ideograph */
+ ["\u8FF1", "\u8FF1"], /* CJK Ideograph */
+ ["\u8FF2", "\u8FF2"], /* CJK Ideograph */
+ ["\u8FF3", "\u8FF3"], /* CJK Ideograph */
+ ["\u8FF4", "\u8FF4"], /* CJK Ideograph */
+ ["\u8FF5", "\u8FF5"], /* CJK Ideograph */
+ ["\u8FF6", "\u8FF6"], /* CJK Ideograph */
+ ["\u8FF7", "\u8FF7"], /* CJK Ideograph */
+ ["\u8FF8", "\u8FF8"], /* CJK Ideograph */
+ ["\u8FF9", "\u8FF9"], /* CJK Ideograph */
+ ["\u8FFA", "\u8FFA"], /* CJK Ideograph */
+ ["\u8FFB", "\u8FFB"], /* CJK Ideograph */
+ ["\u8FFC", "\u8FFC"], /* CJK Ideograph */
+ ["\u8FFD", "\u8FFD"], /* CJK Ideograph */
+ ["\u8FFE", "\u8FFE"], /* CJK Ideograph */
+ ["\u8FFF", "\u8FFF"], /* CJK Ideograph */
+ ["\u9000", "\u9000"], /* CJK Ideograph */
+ ["\u9001", "\u9001"], /* CJK Ideograph */
+ ["\u9002", "\u9002"], /* CJK Ideograph */
+ ["\u9003", "\u9003"], /* CJK Ideograph */
+ ["\u9004", "\u9004"], /* CJK Ideograph */
+ ["\u9005", "\u9005"], /* CJK Ideograph */
+ ["\u9006", "\u9006"], /* CJK Ideograph */
+ ["\u9007", "\u9007"], /* CJK Ideograph */
+ ["\u9008", "\u9008"], /* CJK Ideograph */
+ ["\u9009", "\u9009"], /* CJK Ideograph */
+ ["\u900A", "\u900A"], /* CJK Ideograph */
+ ["\u900B", "\u900B"], /* CJK Ideograph */
+ ["\u900C", "\u900C"], /* CJK Ideograph */
+ ["\u900D", "\u900D"], /* CJK Ideograph */
+ ["\u900E", "\u900E"], /* CJK Ideograph */
+ ["\u900F", "\u900F"], /* CJK Ideograph */
+ ["\u9010", "\u9010"], /* CJK Ideograph */
+ ["\u9011", "\u9011"], /* CJK Ideograph */
+ ["\u9012", "\u9012"], /* CJK Ideograph */
+ ["\u9013", "\u9013"], /* CJK Ideograph */
+ ["\u9014", "\u9014"], /* CJK Ideograph */
+ ["\u9015", "\u9015"], /* CJK Ideograph */
+ ["\u9016", "\u9016"], /* CJK Ideograph */
+ ["\u9017", "\u9017"], /* CJK Ideograph */
+ ["\u9018", "\u9018"], /* CJK Ideograph */
+ ["\u9019", "\u9019"], /* CJK Ideograph */
+ ["\u901A", "\u901A"], /* CJK Ideograph */
+ ["\u901B", "\u901B"], /* CJK Ideograph */
+ ["\u901C", "\u901C"], /* CJK Ideograph */
+ ["\u901D", "\u901D"], /* CJK Ideograph */
+ ["\u901E", "\u901E"], /* CJK Ideograph */
+ ["\u901F", "\u901F"], /* CJK Ideograph */
+ ["\u9020", "\u9020"], /* CJK Ideograph */
+ ["\u9021", "\u9021"], /* CJK Ideograph */
+ ["\u9022", "\u9022"], /* CJK Ideograph */
+ ["\u9023", "\u9023"], /* CJK Ideograph */
+ ["\u9024", "\u9024"], /* CJK Ideograph */
+ ["\u9025", "\u9025"], /* CJK Ideograph */
+ ["\u9026", "\u9026"], /* CJK Ideograph */
+ ["\u9027", "\u9027"], /* CJK Ideograph */
+ ["\u9028", "\u9028"], /* CJK Ideograph */
+ ["\u9029", "\u9029"], /* CJK Ideograph */
+ ["\u902A", "\u902A"], /* CJK Ideograph */
+ ["\u902B", "\u902B"], /* CJK Ideograph */
+ ["\u902C", "\u902C"], /* CJK Ideograph */
+ ["\u902D", "\u902D"], /* CJK Ideograph */
+ ["\u902E", "\u902E"], /* CJK Ideograph */
+ ["\u902F", "\u902F"], /* CJK Ideograph */
+ ["\u9030", "\u9030"], /* CJK Ideograph */
+ ["\u9031", "\u9031"], /* CJK Ideograph */
+ ["\u9032", "\u9032"], /* CJK Ideograph */
+ ["\u9033", "\u9033"], /* CJK Ideograph */
+ ["\u9034", "\u9034"], /* CJK Ideograph */
+ ["\u9035", "\u9035"], /* CJK Ideograph */
+ ["\u9036", "\u9036"], /* CJK Ideograph */
+ ["\u9037", "\u9037"], /* CJK Ideograph */
+ ["\u9038", "\u9038"], /* CJK Ideograph */
+ ["\u9039", "\u9039"], /* CJK Ideograph */
+ ["\u903A", "\u903A"], /* CJK Ideograph */
+ ["\u903B", "\u903B"], /* CJK Ideograph */
+ ["\u903C", "\u903C"], /* CJK Ideograph */
+ ["\u903D", "\u903D"], /* CJK Ideograph */
+ ["\u903E", "\u903E"], /* CJK Ideograph */
+ ["\u903F", "\u903F"], /* CJK Ideograph */
+ ["\u9040", "\u9040"], /* CJK Ideograph */
+ ["\u9041", "\u9041"], /* CJK Ideograph */
+ ["\u9042", "\u9042"], /* CJK Ideograph */
+ ["\u9043", "\u9043"], /* CJK Ideograph */
+ ["\u9044", "\u9044"], /* CJK Ideograph */
+ ["\u9045", "\u9045"], /* CJK Ideograph */
+ ["\u9046", "\u9046"], /* CJK Ideograph */
+ ["\u9047", "\u9047"], /* CJK Ideograph */
+ ["\u9048", "\u9048"], /* CJK Ideograph */
+ ["\u9049", "\u9049"], /* CJK Ideograph */
+ ["\u904A", "\u904A"], /* CJK Ideograph */
+ ["\u904B", "\u904B"], /* CJK Ideograph */
+ ["\u904C", "\u904C"], /* CJK Ideograph */
+ ["\u904D", "\u904D"], /* CJK Ideograph */
+ ["\u904E", "\u904E"], /* CJK Ideograph */
+ ["\u904F", "\u904F"], /* CJK Ideograph */
+ ["\u9050", "\u9050"], /* CJK Ideograph */
+ ["\u9051", "\u9051"], /* CJK Ideograph */
+ ["\u9052", "\u9052"], /* CJK Ideograph */
+ ["\u9053", "\u9053"], /* CJK Ideograph */
+ ["\u9054", "\u9054"], /* CJK Ideograph */
+ ["\u9055", "\u9055"], /* CJK Ideograph */
+ ["\u9056", "\u9056"], /* CJK Ideograph */
+ ["\u9057", "\u9057"], /* CJK Ideograph */
+ ["\u9058", "\u9058"], /* CJK Ideograph */
+ ["\u9059", "\u9059"], /* CJK Ideograph */
+ ["\u905A", "\u905A"], /* CJK Ideograph */
+ ["\u905B", "\u905B"], /* CJK Ideograph */
+ ["\u905C", "\u905C"], /* CJK Ideograph */
+ ["\u905D", "\u905D"], /* CJK Ideograph */
+ ["\u905E", "\u905E"], /* CJK Ideograph */
+ ["\u905F", "\u905F"], /* CJK Ideograph */
+ ["\u9060", "\u9060"], /* CJK Ideograph */
+ ["\u9061", "\u9061"], /* CJK Ideograph */
+ ["\u9062", "\u9062"], /* CJK Ideograph */
+ ["\u9063", "\u9063"], /* CJK Ideograph */
+ ["\u9064", "\u9064"], /* CJK Ideograph */
+ ["\u9065", "\u9065"], /* CJK Ideograph */
+ ["\u9066", "\u9066"], /* CJK Ideograph */
+ ["\u9067", "\u9067"], /* CJK Ideograph */
+ ["\u9068", "\u9068"], /* CJK Ideograph */
+ ["\u9069", "\u9069"], /* CJK Ideograph */
+ ["\u906A", "\u906A"], /* CJK Ideograph */
+ ["\u906B", "\u906B"], /* CJK Ideograph */
+ ["\u906C", "\u906C"], /* CJK Ideograph */
+ ["\u906D", "\u906D"], /* CJK Ideograph */
+ ["\u906E", "\u906E"], /* CJK Ideograph */
+ ["\u906F", "\u906F"], /* CJK Ideograph */
+ ["\u9070", "\u9070"], /* CJK Ideograph */
+ ["\u9071", "\u9071"], /* CJK Ideograph */
+ ["\u9072", "\u9072"], /* CJK Ideograph */
+ ["\u9073", "\u9073"], /* CJK Ideograph */
+ ["\u9074", "\u9074"], /* CJK Ideograph */
+ ["\u9075", "\u9075"], /* CJK Ideograph */
+ ["\u9076", "\u9076"], /* CJK Ideograph */
+ ["\u9077", "\u9077"], /* CJK Ideograph */
+ ["\u9078", "\u9078"], /* CJK Ideograph */
+ ["\u9079", "\u9079"], /* CJK Ideograph */
+ ["\u907A", "\u907A"], /* CJK Ideograph */
+ ["\u907B", "\u907B"], /* CJK Ideograph */
+ ["\u907C", "\u907C"], /* CJK Ideograph */
+ ["\u907D", "\u907D"], /* CJK Ideograph */
+ ["\u907E", "\u907E"], /* CJK Ideograph */
+ ["\u907F", "\u907F"], /* CJK Ideograph */
+ ["\u9080", "\u9080"], /* CJK Ideograph */
+ ["\u9081", "\u9081"], /* CJK Ideograph */
+ ["\u9082", "\u9082"], /* CJK Ideograph */
+ ["\u9083", "\u9083"], /* CJK Ideograph */
+ ["\u9084", "\u9084"], /* CJK Ideograph */
+ ["\u9085", "\u9085"], /* CJK Ideograph */
+ ["\u9086", "\u9086"], /* CJK Ideograph */
+ ["\u9087", "\u9087"], /* CJK Ideograph */
+ ["\u9088", "\u9088"], /* CJK Ideograph */
+ ["\u9089", "\u9089"], /* CJK Ideograph */
+ ["\u908A", "\u908A"], /* CJK Ideograph */
+ ["\u908B", "\u908B"], /* CJK Ideograph */
+ ["\u908C", "\u908C"], /* CJK Ideograph */
+ ["\u908D", "\u908D"], /* CJK Ideograph */
+ ["\u908E", "\u908E"], /* CJK Ideograph */
+ ["\u908F", "\u908F"], /* CJK Ideograph */
+ ["\u9090", "\u9090"], /* CJK Ideograph */
+ ["\u9091", "\u9091"], /* CJK Ideograph */
+ ["\u9092", "\u9092"], /* CJK Ideograph */
+ ["\u9093", "\u9093"], /* CJK Ideograph */
+ ["\u9094", "\u9094"], /* CJK Ideograph */
+ ["\u9095", "\u9095"], /* CJK Ideograph */
+ ["\u9096", "\u9096"], /* CJK Ideograph */
+ ["\u9097", "\u9097"], /* CJK Ideograph */
+ ["\u9098", "\u9098"], /* CJK Ideograph */
+ ["\u9099", "\u9099"], /* CJK Ideograph */
+ ["\u909A", "\u909A"], /* CJK Ideograph */
+ ["\u909B", "\u909B"], /* CJK Ideograph */
+ ["\u909C", "\u909C"], /* CJK Ideograph */
+ ["\u909D", "\u909D"], /* CJK Ideograph */
+ ["\u909E", "\u909E"], /* CJK Ideograph */
+ ["\u909F", "\u909F"], /* CJK Ideograph */
+ ["\u90A0", "\u90A0"], /* CJK Ideograph */
+ ["\u90A1", "\u90A1"], /* CJK Ideograph */
+ ["\u90A2", "\u90A2"], /* CJK Ideograph */
+ ["\u90A3", "\u90A3"], /* CJK Ideograph */
+ ["\u90A4", "\u90A4"], /* CJK Ideograph */
+ ["\u90A5", "\u90A5"], /* CJK Ideograph */
+ ["\u90A6", "\u90A6"], /* CJK Ideograph */
+ ["\u90A7", "\u90A7"], /* CJK Ideograph */
+ ["\u90A8", "\u90A8"], /* CJK Ideograph */
+ ["\u90A9", "\u90A9"], /* CJK Ideograph */
+ ["\u90AA", "\u90AA"], /* CJK Ideograph */
+ ["\u90AB", "\u90AB"], /* CJK Ideograph */
+ ["\u90AC", "\u90AC"], /* CJK Ideograph */
+ ["\u90AD", "\u90AD"], /* CJK Ideograph */
+ ["\u90AE", "\u90AE"], /* CJK Ideograph */
+ ["\u90AF", "\u90AF"], /* CJK Ideograph */
+ ["\u90B0", "\u90B0"], /* CJK Ideograph */
+ ["\u90B1", "\u90B1"], /* CJK Ideograph */
+ ["\u90B2", "\u90B2"], /* CJK Ideograph */
+ ["\u90B3", "\u90B3"], /* CJK Ideograph */
+ ["\u90B4", "\u90B4"], /* CJK Ideograph */
+ ["\u90B5", "\u90B5"], /* CJK Ideograph */
+ ["\u90B6", "\u90B6"], /* CJK Ideograph */
+ ["\u90B7", "\u90B7"], /* CJK Ideograph */
+ ["\u90B8", "\u90B8"], /* CJK Ideograph */
+ ["\u90B9", "\u90B9"], /* CJK Ideograph */
+ ["\u90BA", "\u90BA"], /* CJK Ideograph */
+ ["\u90BB", "\u90BB"], /* CJK Ideograph */
+ ["\u90BC", "\u90BC"], /* CJK Ideograph */
+ ["\u90BD", "\u90BD"], /* CJK Ideograph */
+ ["\u90BE", "\u90BE"], /* CJK Ideograph */
+ ["\u90BF", "\u90BF"], /* CJK Ideograph */
+ ["\u90C0", "\u90C0"], /* CJK Ideograph */
+ ["\u90C1", "\u90C1"], /* CJK Ideograph */
+ ["\u90C2", "\u90C2"], /* CJK Ideograph */
+ ["\u90C3", "\u90C3"], /* CJK Ideograph */
+ ["\u90C4", "\u90C4"], /* CJK Ideograph */
+ ["\u90C5", "\u90C5"], /* CJK Ideograph */
+ ["\u90C6", "\u90C6"], /* CJK Ideograph */
+ ["\u90C7", "\u90C7"], /* CJK Ideograph */
+ ["\u90C8", "\u90C8"], /* CJK Ideograph */
+ ["\u90C9", "\u90C9"], /* CJK Ideograph */
+ ["\u90CA", "\u90CA"], /* CJK Ideograph */
+ ["\u90CB", "\u90CB"], /* CJK Ideograph */
+ ["\u90CC", "\u90CC"], /* CJK Ideograph */
+ ["\u90CD", "\u90CD"], /* CJK Ideograph */
+ ["\u90CE", "\u90CE"], /* CJK Ideograph */
+ ["\u90CF", "\u90CF"], /* CJK Ideograph */
+ ["\u90D0", "\u90D0"], /* CJK Ideograph */
+ ["\u90D1", "\u90D1"], /* CJK Ideograph */
+ ["\u90D2", "\u90D2"], /* CJK Ideograph */
+ ["\u90D3", "\u90D3"], /* CJK Ideograph */
+ ["\u90D4", "\u90D4"], /* CJK Ideograph */
+ ["\u90D5", "\u90D5"], /* CJK Ideograph */
+ ["\u90D6", "\u90D6"], /* CJK Ideograph */
+ ["\u90D7", "\u90D7"], /* CJK Ideograph */
+ ["\u90D8", "\u90D8"], /* CJK Ideograph */
+ ["\u90D9", "\u90D9"], /* CJK Ideograph */
+ ["\u90DA", "\u90DA"], /* CJK Ideograph */
+ ["\u90DB", "\u90DB"], /* CJK Ideograph */
+ ["\u90DC", "\u90DC"], /* CJK Ideograph */
+ ["\u90DD", "\u90DD"], /* CJK Ideograph */
+ ["\u90DE", "\u90DE"], /* CJK Ideograph */
+ ["\u90DF", "\u90DF"], /* CJK Ideograph */
+ ["\u90E0", "\u90E0"], /* CJK Ideograph */
+ ["\u90E1", "\u90E1"], /* CJK Ideograph */
+ ["\u90E2", "\u90E2"], /* CJK Ideograph */
+ ["\u90E3", "\u90E3"], /* CJK Ideograph */
+ ["\u90E4", "\u90E4"], /* CJK Ideograph */
+ ["\u90E5", "\u90E5"], /* CJK Ideograph */
+ ["\u90E6", "\u90E6"], /* CJK Ideograph */
+ ["\u90E7", "\u90E7"], /* CJK Ideograph */
+ ["\u90E8", "\u90E8"], /* CJK Ideograph */
+ ["\u90E9", "\u90E9"], /* CJK Ideograph */
+ ["\u90EA", "\u90EA"], /* CJK Ideograph */
+ ["\u90EB", "\u90EB"], /* CJK Ideograph */
+ ["\u90EC", "\u90EC"], /* CJK Ideograph */
+ ["\u90ED", "\u90ED"], /* CJK Ideograph */
+ ["\u90EE", "\u90EE"], /* CJK Ideograph */
+ ["\u90EF", "\u90EF"], /* CJK Ideograph */
+ ["\u90F0", "\u90F0"], /* CJK Ideograph */
+ ["\u90F1", "\u90F1"], /* CJK Ideograph */
+ ["\u90F2", "\u90F2"], /* CJK Ideograph */
+ ["\u90F3", "\u90F3"], /* CJK Ideograph */
+ ["\u90F4", "\u90F4"], /* CJK Ideograph */
+ ["\u90F5", "\u90F5"], /* CJK Ideograph */
+ ["\u90F6", "\u90F6"], /* CJK Ideograph */
+ ["\u90F7", "\u90F7"], /* CJK Ideograph */
+ ["\u90F8", "\u90F8"], /* CJK Ideograph */
+ ["\u90F9", "\u90F9"], /* CJK Ideograph */
+ ["\u90FA", "\u90FA"], /* CJK Ideograph */
+ ["\u90FB", "\u90FB"], /* CJK Ideograph */
+ ["\u90FC", "\u90FC"], /* CJK Ideograph */
+ ["\u90FD", "\u90FD"], /* CJK Ideograph */
+ ["\u90FE", "\u90FE"], /* CJK Ideograph */
+ ["\u90FF", "\u90FF"], /* CJK Ideograph */
+ ["\u9100", "\u9100"], /* CJK Ideograph */
+ ["\u9101", "\u9101"], /* CJK Ideograph */
+ ["\u9102", "\u9102"], /* CJK Ideograph */
+ ["\u9103", "\u9103"], /* CJK Ideograph */
+ ["\u9104", "\u9104"], /* CJK Ideograph */
+ ["\u9105", "\u9105"], /* CJK Ideograph */
+ ["\u9106", "\u9106"], /* CJK Ideograph */
+ ["\u9107", "\u9107"], /* CJK Ideograph */
+ ["\u9108", "\u9108"], /* CJK Ideograph */
+ ["\u9109", "\u9109"], /* CJK Ideograph */
+ ["\u910A", "\u910A"], /* CJK Ideograph */
+ ["\u910B", "\u910B"], /* CJK Ideograph */
+ ["\u910C", "\u910C"], /* CJK Ideograph */
+ ["\u910D", "\u910D"], /* CJK Ideograph */
+ ["\u910E", "\u910E"], /* CJK Ideograph */
+ ["\u910F", "\u910F"], /* CJK Ideograph */
+ ["\u9110", "\u9110"], /* CJK Ideograph */
+ ["\u9111", "\u9111"], /* CJK Ideograph */
+ ["\u9112", "\u9112"], /* CJK Ideograph */
+ ["\u9113", "\u9113"], /* CJK Ideograph */
+ ["\u9114", "\u9114"], /* CJK Ideograph */
+ ["\u9115", "\u9115"], /* CJK Ideograph */
+ ["\u9116", "\u9116"], /* CJK Ideograph */
+ ["\u9117", "\u9117"], /* CJK Ideograph */
+ ["\u9118", "\u9118"], /* CJK Ideograph */
+ ["\u9119", "\u9119"], /* CJK Ideograph */
+ ["\u911A", "\u911A"], /* CJK Ideograph */
+ ["\u911B", "\u911B"], /* CJK Ideograph */
+ ["\u911C", "\u911C"], /* CJK Ideograph */
+ ["\u911D", "\u911D"], /* CJK Ideograph */
+ ["\u911E", "\u911E"], /* CJK Ideograph */
+ ["\u911F", "\u911F"], /* CJK Ideograph */
+ ["\u9120", "\u9120"], /* CJK Ideograph */
+ ["\u9121", "\u9121"], /* CJK Ideograph */
+ ["\u9122", "\u9122"], /* CJK Ideograph */
+ ["\u9123", "\u9123"], /* CJK Ideograph */
+ ["\u9124", "\u9124"], /* CJK Ideograph */
+ ["\u9125", "\u9125"], /* CJK Ideograph */
+ ["\u9126", "\u9126"], /* CJK Ideograph */
+ ["\u9127", "\u9127"], /* CJK Ideograph */
+ ["\u9128", "\u9128"], /* CJK Ideograph */
+ ["\u9129", "\u9129"], /* CJK Ideograph */
+ ["\u912A", "\u912A"], /* CJK Ideograph */
+ ["\u912B", "\u912B"], /* CJK Ideograph */
+ ["\u912C", "\u912C"], /* CJK Ideograph */
+ ["\u912D", "\u912D"], /* CJK Ideograph */
+ ["\u912E", "\u912E"], /* CJK Ideograph */
+ ["\u912F", "\u912F"], /* CJK Ideograph */
+ ["\u9130", "\u9130"], /* CJK Ideograph */
+ ["\u9131", "\u9131"], /* CJK Ideograph */
+ ["\u9132", "\u9132"], /* CJK Ideograph */
+ ["\u9133", "\u9133"], /* CJK Ideograph */
+ ["\u9134", "\u9134"], /* CJK Ideograph */
+ ["\u9135", "\u9135"], /* CJK Ideograph */
+ ["\u9136", "\u9136"], /* CJK Ideograph */
+ ["\u9137", "\u9137"], /* CJK Ideograph */
+ ["\u9138", "\u9138"], /* CJK Ideograph */
+ ["\u9139", "\u9139"], /* CJK Ideograph */
+ ["\u913A", "\u913A"], /* CJK Ideograph */
+ ["\u913B", "\u913B"], /* CJK Ideograph */
+ ["\u913C", "\u913C"], /* CJK Ideograph */
+ ["\u913D", "\u913D"], /* CJK Ideograph */
+ ["\u913E", "\u913E"], /* CJK Ideograph */
+ ["\u913F", "\u913F"], /* CJK Ideograph */
+ ["\u9140", "\u9140"], /* CJK Ideograph */
+ ["\u9141", "\u9141"], /* CJK Ideograph */
+ ["\u9142", "\u9142"], /* CJK Ideograph */
+ ["\u9143", "\u9143"], /* CJK Ideograph */
+ ["\u9144", "\u9144"], /* CJK Ideograph */
+ ["\u9145", "\u9145"], /* CJK Ideograph */
+ ["\u9146", "\u9146"], /* CJK Ideograph */
+ ["\u9147", "\u9147"], /* CJK Ideograph */
+ ["\u9148", "\u9148"], /* CJK Ideograph */
+ ["\u9149", "\u9149"], /* CJK Ideograph */
+ ["\u914A", "\u914A"], /* CJK Ideograph */
+ ["\u914B", "\u914B"], /* CJK Ideograph */
+ ["\u914C", "\u914C"], /* CJK Ideograph */
+ ["\u914D", "\u914D"], /* CJK Ideograph */
+ ["\u914E", "\u914E"], /* CJK Ideograph */
+ ["\u914F", "\u914F"], /* CJK Ideograph */
+ ["\u9150", "\u9150"], /* CJK Ideograph */
+ ["\u9151", "\u9151"], /* CJK Ideograph */
+ ["\u9152", "\u9152"], /* CJK Ideograph */
+ ["\u9153", "\u9153"], /* CJK Ideograph */
+ ["\u9154", "\u9154"], /* CJK Ideograph */
+ ["\u9155", "\u9155"], /* CJK Ideograph */
+ ["\u9156", "\u9156"], /* CJK Ideograph */
+ ["\u9157", "\u9157"], /* CJK Ideograph */
+ ["\u9158", "\u9158"], /* CJK Ideograph */
+ ["\u9159", "\u9159"], /* CJK Ideograph */
+ ["\u915A", "\u915A"], /* CJK Ideograph */
+ ["\u915B", "\u915B"], /* CJK Ideograph */
+ ["\u915C", "\u915C"], /* CJK Ideograph */
+ ["\u915D", "\u915D"], /* CJK Ideograph */
+ ["\u915E", "\u915E"], /* CJK Ideograph */
+ ["\u915F", "\u915F"], /* CJK Ideograph */
+ ["\u9160", "\u9160"], /* CJK Ideograph */
+ ["\u9161", "\u9161"], /* CJK Ideograph */
+ ["\u9162", "\u9162"], /* CJK Ideograph */
+ ["\u9163", "\u9163"], /* CJK Ideograph */
+ ["\u9164", "\u9164"], /* CJK Ideograph */
+ ["\u9165", "\u9165"], /* CJK Ideograph */
+ ["\u9166", "\u9166"], /* CJK Ideograph */
+ ["\u9167", "\u9167"], /* CJK Ideograph */
+ ["\u9168", "\u9168"], /* CJK Ideograph */
+ ["\u9169", "\u9169"], /* CJK Ideograph */
+ ["\u916A", "\u916A"], /* CJK Ideograph */
+ ["\u916B", "\u916B"], /* CJK Ideograph */
+ ["\u916C", "\u916C"], /* CJK Ideograph */
+ ["\u916D", "\u916D"], /* CJK Ideograph */
+ ["\u916E", "\u916E"], /* CJK Ideograph */
+ ["\u916F", "\u916F"], /* CJK Ideograph */
+ ["\u9170", "\u9170"], /* CJK Ideograph */
+ ["\u9171", "\u9171"], /* CJK Ideograph */
+ ["\u9172", "\u9172"], /* CJK Ideograph */
+ ["\u9173", "\u9173"], /* CJK Ideograph */
+ ["\u9174", "\u9174"], /* CJK Ideograph */
+ ["\u9175", "\u9175"], /* CJK Ideograph */
+ ["\u9176", "\u9176"], /* CJK Ideograph */
+ ["\u9177", "\u9177"], /* CJK Ideograph */
+ ["\u9178", "\u9178"], /* CJK Ideograph */
+ ["\u9179", "\u9179"], /* CJK Ideograph */
+ ["\u917A", "\u917A"], /* CJK Ideograph */
+ ["\u917B", "\u917B"], /* CJK Ideograph */
+ ["\u917C", "\u917C"], /* CJK Ideograph */
+ ["\u917D", "\u917D"], /* CJK Ideograph */
+ ["\u917E", "\u917E"], /* CJK Ideograph */
+ ["\u917F", "\u917F"], /* CJK Ideograph */
+ ["\u9180", "\u9180"], /* CJK Ideograph */
+ ["\u9181", "\u9181"], /* CJK Ideograph */
+ ["\u9182", "\u9182"], /* CJK Ideograph */
+ ["\u9183", "\u9183"], /* CJK Ideograph */
+ ["\u9184", "\u9184"], /* CJK Ideograph */
+ ["\u9185", "\u9185"], /* CJK Ideograph */
+ ["\u9186", "\u9186"], /* CJK Ideograph */
+ ["\u9187", "\u9187"], /* CJK Ideograph */
+ ["\u9188", "\u9188"], /* CJK Ideograph */
+ ["\u9189", "\u9189"], /* CJK Ideograph */
+ ["\u918A", "\u918A"], /* CJK Ideograph */
+ ["\u918B", "\u918B"], /* CJK Ideograph */
+ ["\u918C", "\u918C"], /* CJK Ideograph */
+ ["\u918D", "\u918D"], /* CJK Ideograph */
+ ["\u918E", "\u918E"], /* CJK Ideograph */
+ ["\u918F", "\u918F"], /* CJK Ideograph */
+ ["\u9190", "\u9190"], /* CJK Ideograph */
+ ["\u9191", "\u9191"], /* CJK Ideograph */
+ ["\u9192", "\u9192"], /* CJK Ideograph */
+ ["\u9193", "\u9193"], /* CJK Ideograph */
+ ["\u9194", "\u9194"], /* CJK Ideograph */
+ ["\u9195", "\u9195"], /* CJK Ideograph */
+ ["\u9196", "\u9196"], /* CJK Ideograph */
+ ["\u9197", "\u9197"], /* CJK Ideograph */
+ ["\u9198", "\u9198"], /* CJK Ideograph */
+ ["\u9199", "\u9199"], /* CJK Ideograph */
+ ["\u919A", "\u919A"], /* CJK Ideograph */
+ ["\u919B", "\u919B"], /* CJK Ideograph */
+ ["\u919C", "\u919C"], /* CJK Ideograph */
+ ["\u919D", "\u919D"], /* CJK Ideograph */
+ ["\u919E", "\u919E"], /* CJK Ideograph */
+ ["\u919F", "\u919F"], /* CJK Ideograph */
+ ["\u91A0", "\u91A0"], /* CJK Ideograph */
+ ["\u91A1", "\u91A1"], /* CJK Ideograph */
+ ["\u91A2", "\u91A2"], /* CJK Ideograph */
+ ["\u91A3", "\u91A3"], /* CJK Ideograph */
+ ["\u91A4", "\u91A4"], /* CJK Ideograph */
+ ["\u91A5", "\u91A5"], /* CJK Ideograph */
+ ["\u91A6", "\u91A6"], /* CJK Ideograph */
+ ["\u91A7", "\u91A7"], /* CJK Ideograph */
+ ["\u91A8", "\u91A8"], /* CJK Ideograph */
+ ["\u91A9", "\u91A9"], /* CJK Ideograph */
+ ["\u91AA", "\u91AA"], /* CJK Ideograph */
+ ["\u91AB", "\u91AB"], /* CJK Ideograph */
+ ["\u91AC", "\u91AC"], /* CJK Ideograph */
+ ["\u91AD", "\u91AD"], /* CJK Ideograph */
+ ["\u91AE", "\u91AE"], /* CJK Ideograph */
+ ["\u91AF", "\u91AF"], /* CJK Ideograph */
+ ["\u91B0", "\u91B0"], /* CJK Ideograph */
+ ["\u91B1", "\u91B1"], /* CJK Ideograph */
+ ["\u91B2", "\u91B2"], /* CJK Ideograph */
+ ["\u91B3", "\u91B3"], /* CJK Ideograph */
+ ["\u91B4", "\u91B4"], /* CJK Ideograph */
+ ["\u91B5", "\u91B5"], /* CJK Ideograph */
+ ["\u91B6", "\u91B6"], /* CJK Ideograph */
+ ["\u91B7", "\u91B7"], /* CJK Ideograph */
+ ["\u91B8", "\u91B8"], /* CJK Ideograph */
+ ["\u91B9", "\u91B9"], /* CJK Ideograph */
+ ["\u91BA", "\u91BA"], /* CJK Ideograph */
+ ["\u91BB", "\u91BB"], /* CJK Ideograph */
+ ["\u91BC", "\u91BC"], /* CJK Ideograph */
+ ["\u91BD", "\u91BD"], /* CJK Ideograph */
+ ["\u91BE", "\u91BE"], /* CJK Ideograph */
+ ["\u91BF", "\u91BF"], /* CJK Ideograph */
+ ["\u91C0", "\u91C0"], /* CJK Ideograph */
+ ["\u91C1", "\u91C1"], /* CJK Ideograph */
+ ["\u91C2", "\u91C2"], /* CJK Ideograph */
+ ["\u91C3", "\u91C3"], /* CJK Ideograph */
+ ["\u91C4", "\u91C4"], /* CJK Ideograph */
+ ["\u91C5", "\u91C5"], /* CJK Ideograph */
+ ["\u91C6", "\u91C6"], /* CJK Ideograph */
+ ["\u91C7", "\u91C7"], /* CJK Ideograph */
+ ["\u91C8", "\u91C8"], /* CJK Ideograph */
+ ["\u91C9", "\u91C9"], /* CJK Ideograph */
+ ["\u91CA", "\u91CA"], /* CJK Ideograph */
+ ["\u91CB", "\u91CB"], /* CJK Ideograph */
+ ["\u91CC", "\u91CC"], /* CJK Ideograph */
+ ["\u91CD", "\u91CD"], /* CJK Ideograph */
+ ["\u91CE", "\u91CE"], /* CJK Ideograph */
+ ["\u91CF", "\u91CF"], /* CJK Ideograph */
+ ["\u91D0", "\u91D0"], /* CJK Ideograph */
+ ["\u91D1", "\u91D1"], /* CJK Ideograph */
+ ["\u91D2", "\u91D2"], /* CJK Ideograph */
+ ["\u91D3", "\u91D3"], /* CJK Ideograph */
+ ["\u91D4", "\u91D4"], /* CJK Ideograph */
+ ["\u91D5", "\u91D5"], /* CJK Ideograph */
+ ["\u91D6", "\u91D6"], /* CJK Ideograph */
+ ["\u91D7", "\u91D7"], /* CJK Ideograph */
+ ["\u91D8", "\u91D8"], /* CJK Ideograph */
+ ["\u91D9", "\u91D9"], /* CJK Ideograph */
+ ["\u91DA", "\u91DA"], /* CJK Ideograph */
+ ["\u91DB", "\u91DB"], /* CJK Ideograph */
+ ["\u91DC", "\u91DC"], /* CJK Ideograph */
+ ["\u91DD", "\u91DD"], /* CJK Ideograph */
+ ["\u91DE", "\u91DE"], /* CJK Ideograph */
+ ["\u91DF", "\u91DF"], /* CJK Ideograph */
+ ["\u91E0", "\u91E0"], /* CJK Ideograph */
+ ["\u91E1", "\u91E1"], /* CJK Ideograph */
+ ["\u91E2", "\u91E2"], /* CJK Ideograph */
+ ["\u91E3", "\u91E3"], /* CJK Ideograph */
+ ["\u91E4", "\u91E4"], /* CJK Ideograph */
+ ["\u91E5", "\u91E5"], /* CJK Ideograph */
+ ["\u91E6", "\u91E6"], /* CJK Ideograph */
+ ["\u91E7", "\u91E7"], /* CJK Ideograph */
+ ["\u91E8", "\u91E8"], /* CJK Ideograph */
+ ["\u91E9", "\u91E9"], /* CJK Ideograph */
+ ["\u91EA", "\u91EA"], /* CJK Ideograph */
+ ["\u91EB", "\u91EB"], /* CJK Ideograph */
+ ["\u91EC", "\u91EC"], /* CJK Ideograph */
+ ["\u91ED", "\u91ED"], /* CJK Ideograph */
+ ["\u91EE", "\u91EE"], /* CJK Ideograph */
+ ["\u91EF", "\u91EF"], /* CJK Ideograph */
+ ["\u91F0", "\u91F0"], /* CJK Ideograph */
+ ["\u91F1", "\u91F1"], /* CJK Ideograph */
+ ["\u91F2", "\u91F2"], /* CJK Ideograph */
+ ["\u91F3", "\u91F3"], /* CJK Ideograph */
+ ["\u91F4", "\u91F4"], /* CJK Ideograph */
+ ["\u91F5", "\u91F5"], /* CJK Ideograph */
+ ["\u91F6", "\u91F6"], /* CJK Ideograph */
+ ["\u91F7", "\u91F7"], /* CJK Ideograph */
+ ["\u91F8", "\u91F8"], /* CJK Ideograph */
+ ["\u91F9", "\u91F9"], /* CJK Ideograph */
+ ["\u91FA", "\u91FA"], /* CJK Ideograph */
+ ["\u91FB", "\u91FB"], /* CJK Ideograph */
+ ["\u91FC", "\u91FC"], /* CJK Ideograph */
+ ["\u91FD", "\u91FD"], /* CJK Ideograph */
+ ["\u91FE", "\u91FE"], /* CJK Ideograph */
+ ["\u91FF", "\u91FF"], /* CJK Ideograph */
+ ["\u9200", "\u9200"], /* CJK Ideograph */
+ ["\u9201", "\u9201"], /* CJK Ideograph */
+ ["\u9202", "\u9202"], /* CJK Ideograph */
+ ["\u9203", "\u9203"], /* CJK Ideograph */
+ ["\u9204", "\u9204"], /* CJK Ideograph */
+ ["\u9205", "\u9205"], /* CJK Ideograph */
+ ["\u9206", "\u9206"], /* CJK Ideograph */
+ ["\u9207", "\u9207"], /* CJK Ideograph */
+ ["\u9208", "\u9208"], /* CJK Ideograph */
+ ["\u9209", "\u9209"], /* CJK Ideograph */
+ ["\u920A", "\u920A"], /* CJK Ideograph */
+ ["\u920B", "\u920B"], /* CJK Ideograph */
+ ["\u920C", "\u920C"], /* CJK Ideograph */
+ ["\u920D", "\u920D"], /* CJK Ideograph */
+ ["\u920E", "\u920E"], /* CJK Ideograph */
+ ["\u920F", "\u920F"], /* CJK Ideograph */
+ ["\u9210", "\u9210"], /* CJK Ideograph */
+ ["\u9211", "\u9211"], /* CJK Ideograph */
+ ["\u9212", "\u9212"], /* CJK Ideograph */
+ ["\u9213", "\u9213"], /* CJK Ideograph */
+ ["\u9214", "\u9214"], /* CJK Ideograph */
+ ["\u9215", "\u9215"], /* CJK Ideograph */
+ ["\u9216", "\u9216"], /* CJK Ideograph */
+ ["\u9217", "\u9217"], /* CJK Ideograph */
+ ["\u9218", "\u9218"], /* CJK Ideograph */
+ ["\u9219", "\u9219"], /* CJK Ideograph */
+ ["\u921A", "\u921A"], /* CJK Ideograph */
+ ["\u921B", "\u921B"], /* CJK Ideograph */
+ ["\u921C", "\u921C"], /* CJK Ideograph */
+ ["\u921D", "\u921D"], /* CJK Ideograph */
+ ["\u921E", "\u921E"], /* CJK Ideograph */
+ ["\u921F", "\u921F"], /* CJK Ideograph */
+ ["\u9220", "\u9220"], /* CJK Ideograph */
+ ["\u9221", "\u9221"], /* CJK Ideograph */
+ ["\u9222", "\u9222"], /* CJK Ideograph */
+ ["\u9223", "\u9223"], /* CJK Ideograph */
+ ["\u9224", "\u9224"], /* CJK Ideograph */
+ ["\u9225", "\u9225"], /* CJK Ideograph */
+ ["\u9226", "\u9226"], /* CJK Ideograph */
+ ["\u9227", "\u9227"], /* CJK Ideograph */
+ ["\u9228", "\u9228"], /* CJK Ideograph */
+ ["\u9229", "\u9229"], /* CJK Ideograph */
+ ["\u922A", "\u922A"], /* CJK Ideograph */
+ ["\u922B", "\u922B"], /* CJK Ideograph */
+ ["\u922C", "\u922C"], /* CJK Ideograph */
+ ["\u922D", "\u922D"], /* CJK Ideograph */
+ ["\u922E", "\u922E"], /* CJK Ideograph */
+ ["\u922F", "\u922F"], /* CJK Ideograph */
+ ["\u9230", "\u9230"], /* CJK Ideograph */
+ ["\u9231", "\u9231"], /* CJK Ideograph */
+ ["\u9232", "\u9232"], /* CJK Ideograph */
+ ["\u9233", "\u9233"], /* CJK Ideograph */
+ ["\u9234", "\u9234"], /* CJK Ideograph */
+ ["\u9235", "\u9235"], /* CJK Ideograph */
+ ["\u9236", "\u9236"], /* CJK Ideograph */
+ ["\u9237", "\u9237"], /* CJK Ideograph */
+ ["\u9238", "\u9238"], /* CJK Ideograph */
+ ["\u9239", "\u9239"], /* CJK Ideograph */
+ ["\u923A", "\u923A"], /* CJK Ideograph */
+ ["\u923B", "\u923B"], /* CJK Ideograph */
+ ["\u923C", "\u923C"], /* CJK Ideograph */
+ ["\u923D", "\u923D"], /* CJK Ideograph */
+ ["\u923E", "\u923E"], /* CJK Ideograph */
+ ["\u923F", "\u923F"], /* CJK Ideograph */
+ ["\u9240", "\u9240"], /* CJK Ideograph */
+ ["\u9241", "\u9241"], /* CJK Ideograph */
+ ["\u9242", "\u9242"], /* CJK Ideograph */
+ ["\u9243", "\u9243"], /* CJK Ideograph */
+ ["\u9244", "\u9244"], /* CJK Ideograph */
+ ["\u9245", "\u9245"], /* CJK Ideograph */
+ ["\u9246", "\u9246"], /* CJK Ideograph */
+ ["\u9247", "\u9247"], /* CJK Ideograph */
+ ["\u9248", "\u9248"], /* CJK Ideograph */
+ ["\u9249", "\u9249"], /* CJK Ideograph */
+ ["\u924A", "\u924A"], /* CJK Ideograph */
+ ["\u924B", "\u924B"], /* CJK Ideograph */
+ ["\u924C", "\u924C"], /* CJK Ideograph */
+ ["\u924D", "\u924D"], /* CJK Ideograph */
+ ["\u924E", "\u924E"], /* CJK Ideograph */
+ ["\u924F", "\u924F"], /* CJK Ideograph */
+ ["\u9250", "\u9250"], /* CJK Ideograph */
+ ["\u9251", "\u9251"], /* CJK Ideograph */
+ ["\u9252", "\u9252"], /* CJK Ideograph */
+ ["\u9253", "\u9253"], /* CJK Ideograph */
+ ["\u9254", "\u9254"], /* CJK Ideograph */
+ ["\u9255", "\u9255"], /* CJK Ideograph */
+ ["\u9256", "\u9256"], /* CJK Ideograph */
+ ["\u9257", "\u9257"], /* CJK Ideograph */
+ ["\u9258", "\u9258"], /* CJK Ideograph */
+ ["\u9259", "\u9259"], /* CJK Ideograph */
+ ["\u925A", "\u925A"], /* CJK Ideograph */
+ ["\u925B", "\u925B"], /* CJK Ideograph */
+ ["\u925C", "\u925C"], /* CJK Ideograph */
+ ["\u925D", "\u925D"], /* CJK Ideograph */
+ ["\u925E", "\u925E"], /* CJK Ideograph */
+ ["\u925F", "\u925F"], /* CJK Ideograph */
+ ["\u9260", "\u9260"], /* CJK Ideograph */
+ ["\u9261", "\u9261"], /* CJK Ideograph */
+ ["\u9262", "\u9262"], /* CJK Ideograph */
+ ["\u9263", "\u9263"], /* CJK Ideograph */
+ ["\u9264", "\u9264"], /* CJK Ideograph */
+ ["\u9265", "\u9265"], /* CJK Ideograph */
+ ["\u9266", "\u9266"], /* CJK Ideograph */
+ ["\u9267", "\u9267"], /* CJK Ideograph */
+ ["\u9268", "\u9268"], /* CJK Ideograph */
+ ["\u9269", "\u9269"], /* CJK Ideograph */
+ ["\u926A", "\u926A"], /* CJK Ideograph */
+ ["\u926B", "\u926B"], /* CJK Ideograph */
+ ["\u926C", "\u926C"], /* CJK Ideograph */
+ ["\u926D", "\u926D"], /* CJK Ideograph */
+ ["\u926E", "\u926E"], /* CJK Ideograph */
+ ["\u926F", "\u926F"], /* CJK Ideograph */
+ ["\u9270", "\u9270"], /* CJK Ideograph */
+ ["\u9271", "\u9271"], /* CJK Ideograph */
+ ["\u9272", "\u9272"], /* CJK Ideograph */
+ ["\u9273", "\u9273"], /* CJK Ideograph */
+ ["\u9274", "\u9274"], /* CJK Ideograph */
+ ["\u9275", "\u9275"], /* CJK Ideograph */
+ ["\u9276", "\u9276"], /* CJK Ideograph */
+ ["\u9277", "\u9277"], /* CJK Ideograph */
+ ["\u9278", "\u9278"], /* CJK Ideograph */
+ ["\u9279", "\u9279"], /* CJK Ideograph */
+ ["\u927A", "\u927A"], /* CJK Ideograph */
+ ["\u927B", "\u927B"], /* CJK Ideograph */
+ ["\u927C", "\u927C"], /* CJK Ideograph */
+ ["\u927D", "\u927D"], /* CJK Ideograph */
+ ["\u927E", "\u927E"], /* CJK Ideograph */
+ ["\u927F", "\u927F"], /* CJK Ideograph */
+ ["\u9280", "\u9280"], /* CJK Ideograph */
+ ["\u9281", "\u9281"], /* CJK Ideograph */
+ ["\u9282", "\u9282"], /* CJK Ideograph */
+ ["\u9283", "\u9283"], /* CJK Ideograph */
+ ["\u9284", "\u9284"], /* CJK Ideograph */
+ ["\u9285", "\u9285"], /* CJK Ideograph */
+ ["\u9286", "\u9286"], /* CJK Ideograph */
+ ["\u9287", "\u9287"], /* CJK Ideograph */
+ ["\u9288", "\u9288"], /* CJK Ideograph */
+ ["\u9289", "\u9289"], /* CJK Ideograph */
+ ["\u928A", "\u928A"], /* CJK Ideograph */
+ ["\u928B", "\u928B"], /* CJK Ideograph */
+ ["\u928C", "\u928C"], /* CJK Ideograph */
+ ["\u928D", "\u928D"], /* CJK Ideograph */
+ ["\u928E", "\u928E"], /* CJK Ideograph */
+ ["\u928F", "\u928F"], /* CJK Ideograph */
+ ["\u9290", "\u9290"], /* CJK Ideograph */
+ ["\u9291", "\u9291"], /* CJK Ideograph */
+ ["\u9292", "\u9292"], /* CJK Ideograph */
+ ["\u9293", "\u9293"], /* CJK Ideograph */
+ ["\u9294", "\u9294"], /* CJK Ideograph */
+ ["\u9295", "\u9295"], /* CJK Ideograph */
+ ["\u9296", "\u9296"], /* CJK Ideograph */
+ ["\u9297", "\u9297"], /* CJK Ideograph */
+ ["\u9298", "\u9298"], /* CJK Ideograph */
+ ["\u9299", "\u9299"], /* CJK Ideograph */
+ ["\u929A", "\u929A"], /* CJK Ideograph */
+ ["\u929B", "\u929B"], /* CJK Ideograph */
+ ["\u929C", "\u929C"], /* CJK Ideograph */
+ ["\u929D", "\u929D"], /* CJK Ideograph */
+ ["\u929E", "\u929E"], /* CJK Ideograph */
+ ["\u929F", "\u929F"], /* CJK Ideograph */
+ ["\u92A0", "\u92A0"], /* CJK Ideograph */
+ ["\u92A1", "\u92A1"], /* CJK Ideograph */
+ ["\u92A2", "\u92A2"], /* CJK Ideograph */
+ ["\u92A3", "\u92A3"], /* CJK Ideograph */
+ ["\u92A4", "\u92A4"], /* CJK Ideograph */
+ ["\u92A5", "\u92A5"], /* CJK Ideograph */
+ ["\u92A6", "\u92A6"], /* CJK Ideograph */
+ ["\u92A7", "\u92A7"], /* CJK Ideograph */
+ ["\u92A8", "\u92A8"], /* CJK Ideograph */
+ ["\u92A9", "\u92A9"], /* CJK Ideograph */
+ ["\u92AA", "\u92AA"], /* CJK Ideograph */
+ ["\u92AB", "\u92AB"], /* CJK Ideograph */
+ ["\u92AC", "\u92AC"], /* CJK Ideograph */
+ ["\u92AD", "\u92AD"], /* CJK Ideograph */
+ ["\u92AE", "\u92AE"], /* CJK Ideograph */
+ ["\u92AF", "\u92AF"], /* CJK Ideograph */
+ ["\u92B0", "\u92B0"], /* CJK Ideograph */
+ ["\u92B1", "\u92B1"], /* CJK Ideograph */
+ ["\u92B2", "\u92B2"], /* CJK Ideograph */
+ ["\u92B3", "\u92B3"], /* CJK Ideograph */
+ ["\u92B4", "\u92B4"], /* CJK Ideograph */
+ ["\u92B5", "\u92B5"], /* CJK Ideograph */
+ ["\u92B6", "\u92B6"], /* CJK Ideograph */
+ ["\u92B7", "\u92B7"], /* CJK Ideograph */
+ ["\u92B8", "\u92B8"], /* CJK Ideograph */
+ ["\u92B9", "\u92B9"], /* CJK Ideograph */
+ ["\u92BA", "\u92BA"], /* CJK Ideograph */
+ ["\u92BB", "\u92BB"], /* CJK Ideograph */
+ ["\u92BC", "\u92BC"], /* CJK Ideograph */
+ ["\u92BD", "\u92BD"], /* CJK Ideograph */
+ ["\u92BE", "\u92BE"], /* CJK Ideograph */
+ ["\u92BF", "\u92BF"], /* CJK Ideograph */
+ ["\u92C0", "\u92C0"], /* CJK Ideograph */
+ ["\u92C1", "\u92C1"], /* CJK Ideograph */
+ ["\u92C2", "\u92C2"], /* CJK Ideograph */
+ ["\u92C3", "\u92C3"], /* CJK Ideograph */
+ ["\u92C4", "\u92C4"], /* CJK Ideograph */
+ ["\u92C5", "\u92C5"], /* CJK Ideograph */
+ ["\u92C6", "\u92C6"], /* CJK Ideograph */
+ ["\u92C7", "\u92C7"], /* CJK Ideograph */
+ ["\u92C8", "\u92C8"], /* CJK Ideograph */
+ ["\u92C9", "\u92C9"], /* CJK Ideograph */
+ ["\u92CA", "\u92CA"], /* CJK Ideograph */
+ ["\u92CB", "\u92CB"], /* CJK Ideograph */
+ ["\u92CC", "\u92CC"], /* CJK Ideograph */
+ ["\u92CD", "\u92CD"], /* CJK Ideograph */
+ ["\u92CE", "\u92CE"], /* CJK Ideograph */
+ ["\u92CF", "\u92CF"], /* CJK Ideograph */
+ ["\u92D0", "\u92D0"], /* CJK Ideograph */
+ ["\u92D1", "\u92D1"], /* CJK Ideograph */
+ ["\u92D2", "\u92D2"], /* CJK Ideograph */
+ ["\u92D3", "\u92D3"], /* CJK Ideograph */
+ ["\u92D4", "\u92D4"], /* CJK Ideograph */
+ ["\u92D5", "\u92D5"], /* CJK Ideograph */
+ ["\u92D6", "\u92D6"], /* CJK Ideograph */
+ ["\u92D7", "\u92D7"], /* CJK Ideograph */
+ ["\u92D8", "\u92D8"], /* CJK Ideograph */
+ ["\u92D9", "\u92D9"], /* CJK Ideograph */
+ ["\u92DA", "\u92DA"], /* CJK Ideograph */
+ ["\u92DB", "\u92DB"], /* CJK Ideograph */
+ ["\u92DC", "\u92DC"], /* CJK Ideograph */
+ ["\u92DD", "\u92DD"], /* CJK Ideograph */
+ ["\u92DE", "\u92DE"], /* CJK Ideograph */
+ ["\u92DF", "\u92DF"], /* CJK Ideograph */
+ ["\u92E0", "\u92E0"], /* CJK Ideograph */
+ ["\u92E1", "\u92E1"], /* CJK Ideograph */
+ ["\u92E2", "\u92E2"], /* CJK Ideograph */
+ ["\u92E3", "\u92E3"], /* CJK Ideograph */
+ ["\u92E4", "\u92E4"], /* CJK Ideograph */
+ ["\u92E5", "\u92E5"], /* CJK Ideograph */
+ ["\u92E6", "\u92E6"], /* CJK Ideograph */
+ ["\u92E7", "\u92E7"], /* CJK Ideograph */
+ ["\u92E8", "\u92E8"], /* CJK Ideograph */
+ ["\u92E9", "\u92E9"], /* CJK Ideograph */
+ ["\u92EA", "\u92EA"], /* CJK Ideograph */
+ ["\u92EB", "\u92EB"], /* CJK Ideograph */
+ ["\u92EC", "\u92EC"], /* CJK Ideograph */
+ ["\u92ED", "\u92ED"], /* CJK Ideograph */
+ ["\u92EE", "\u92EE"], /* CJK Ideograph */
+ ["\u92EF", "\u92EF"], /* CJK Ideograph */
+ ["\u92F0", "\u92F0"], /* CJK Ideograph */
+ ["\u92F1", "\u92F1"], /* CJK Ideograph */
+ ["\u92F2", "\u92F2"], /* CJK Ideograph */
+ ["\u92F3", "\u92F3"], /* CJK Ideograph */
+ ["\u92F4", "\u92F4"], /* CJK Ideograph */
+ ["\u92F5", "\u92F5"], /* CJK Ideograph */
+ ["\u92F6", "\u92F6"], /* CJK Ideograph */
+ ["\u92F7", "\u92F7"], /* CJK Ideograph */
+ ["\u92F8", "\u92F8"], /* CJK Ideograph */
+ ["\u92F9", "\u92F9"], /* CJK Ideograph */
+ ["\u92FA", "\u92FA"], /* CJK Ideograph */
+ ["\u92FB", "\u92FB"], /* CJK Ideograph */
+ ["\u92FC", "\u92FC"], /* CJK Ideograph */
+ ["\u92FD", "\u92FD"], /* CJK Ideograph */
+ ["\u92FE", "\u92FE"], /* CJK Ideograph */
+ ["\u92FF", "\u92FF"], /* CJK Ideograph */
+ ["\u9300", "\u9300"], /* CJK Ideograph */
+ ["\u9301", "\u9301"], /* CJK Ideograph */
+ ["\u9302", "\u9302"], /* CJK Ideograph */
+ ["\u9303", "\u9303"], /* CJK Ideograph */
+ ["\u9304", "\u9304"], /* CJK Ideograph */
+ ["\u9305", "\u9305"], /* CJK Ideograph */
+ ["\u9306", "\u9306"], /* CJK Ideograph */
+ ["\u9307", "\u9307"], /* CJK Ideograph */
+ ["\u9308", "\u9308"], /* CJK Ideograph */
+ ["\u9309", "\u9309"], /* CJK Ideograph */
+ ["\u930A", "\u930A"], /* CJK Ideograph */
+ ["\u930B", "\u930B"], /* CJK Ideograph */
+ ["\u930C", "\u930C"], /* CJK Ideograph */
+ ["\u930D", "\u930D"], /* CJK Ideograph */
+ ["\u930E", "\u930E"], /* CJK Ideograph */
+ ["\u930F", "\u930F"], /* CJK Ideograph */
+ ["\u9310", "\u9310"], /* CJK Ideograph */
+ ["\u9311", "\u9311"], /* CJK Ideograph */
+ ["\u9312", "\u9312"], /* CJK Ideograph */
+ ["\u9313", "\u9313"], /* CJK Ideograph */
+ ["\u9314", "\u9314"], /* CJK Ideograph */
+ ["\u9315", "\u9315"], /* CJK Ideograph */
+ ["\u9316", "\u9316"], /* CJK Ideograph */
+ ["\u9317", "\u9317"], /* CJK Ideograph */
+ ["\u9318", "\u9318"], /* CJK Ideograph */
+ ["\u9319", "\u9319"], /* CJK Ideograph */
+ ["\u931A", "\u931A"], /* CJK Ideograph */
+ ["\u931B", "\u931B"], /* CJK Ideograph */
+ ["\u931C", "\u931C"], /* CJK Ideograph */
+ ["\u931D", "\u931D"], /* CJK Ideograph */
+ ["\u931E", "\u931E"], /* CJK Ideograph */
+ ["\u931F", "\u931F"], /* CJK Ideograph */
+ ["\u9320", "\u9320"], /* CJK Ideograph */
+ ["\u9321", "\u9321"], /* CJK Ideograph */
+ ["\u9322", "\u9322"], /* CJK Ideograph */
+ ["\u9323", "\u9323"], /* CJK Ideograph */
+ ["\u9324", "\u9324"], /* CJK Ideograph */
+ ["\u9325", "\u9325"], /* CJK Ideograph */
+ ["\u9326", "\u9326"], /* CJK Ideograph */
+ ["\u9327", "\u9327"], /* CJK Ideograph */
+ ["\u9328", "\u9328"], /* CJK Ideograph */
+ ["\u9329", "\u9329"], /* CJK Ideograph */
+ ["\u932A", "\u932A"], /* CJK Ideograph */
+ ["\u932B", "\u932B"], /* CJK Ideograph */
+ ["\u932C", "\u932C"], /* CJK Ideograph */
+ ["\u932D", "\u932D"], /* CJK Ideograph */
+ ["\u932E", "\u932E"], /* CJK Ideograph */
+ ["\u932F", "\u932F"], /* CJK Ideograph */
+ ["\u9330", "\u9330"], /* CJK Ideograph */
+ ["\u9331", "\u9331"], /* CJK Ideograph */
+ ["\u9332", "\u9332"], /* CJK Ideograph */
+ ["\u9333", "\u9333"], /* CJK Ideograph */
+ ["\u9334", "\u9334"], /* CJK Ideograph */
+ ["\u9335", "\u9335"], /* CJK Ideograph */
+ ["\u9336", "\u9336"], /* CJK Ideograph */
+ ["\u9337", "\u9337"], /* CJK Ideograph */
+ ["\u9338", "\u9338"], /* CJK Ideograph */
+ ["\u9339", "\u9339"], /* CJK Ideograph */
+ ["\u933A", "\u933A"], /* CJK Ideograph */
+ ["\u933B", "\u933B"], /* CJK Ideograph */
+ ["\u933C", "\u933C"], /* CJK Ideograph */
+ ["\u933D", "\u933D"], /* CJK Ideograph */
+ ["\u933E", "\u933E"], /* CJK Ideograph */
+ ["\u933F", "\u933F"], /* CJK Ideograph */
+ ["\u9340", "\u9340"], /* CJK Ideograph */
+ ["\u9341", "\u9341"], /* CJK Ideograph */
+ ["\u9342", "\u9342"], /* CJK Ideograph */
+ ["\u9343", "\u9343"], /* CJK Ideograph */
+ ["\u9344", "\u9344"], /* CJK Ideograph */
+ ["\u9345", "\u9345"], /* CJK Ideograph */
+ ["\u9346", "\u9346"], /* CJK Ideograph */
+ ["\u9347", "\u9347"], /* CJK Ideograph */
+ ["\u9348", "\u9348"], /* CJK Ideograph */
+ ["\u9349", "\u9349"], /* CJK Ideograph */
+ ["\u934A", "\u934A"], /* CJK Ideograph */
+ ["\u934B", "\u934B"], /* CJK Ideograph */
+ ["\u934C", "\u934C"], /* CJK Ideograph */
+ ["\u934D", "\u934D"], /* CJK Ideograph */
+ ["\u934E", "\u934E"], /* CJK Ideograph */
+ ["\u934F", "\u934F"], /* CJK Ideograph */
+ ["\u9350", "\u9350"], /* CJK Ideograph */
+ ["\u9351", "\u9351"], /* CJK Ideograph */
+ ["\u9352", "\u9352"], /* CJK Ideograph */
+ ["\u9353", "\u9353"], /* CJK Ideograph */
+ ["\u9354", "\u9354"], /* CJK Ideograph */
+ ["\u9355", "\u9355"], /* CJK Ideograph */
+ ["\u9356", "\u9356"], /* CJK Ideograph */
+ ["\u9357", "\u9357"], /* CJK Ideograph */
+ ["\u9358", "\u9358"], /* CJK Ideograph */
+ ["\u9359", "\u9359"], /* CJK Ideograph */
+ ["\u935A", "\u935A"], /* CJK Ideograph */
+ ["\u935B", "\u935B"], /* CJK Ideograph */
+ ["\u935C", "\u935C"], /* CJK Ideograph */
+ ["\u935D", "\u935D"], /* CJK Ideograph */
+ ["\u935E", "\u935E"], /* CJK Ideograph */
+ ["\u935F", "\u935F"], /* CJK Ideograph */
+ ["\u9360", "\u9360"], /* CJK Ideograph */
+ ["\u9361", "\u9361"], /* CJK Ideograph */
+ ["\u9362", "\u9362"], /* CJK Ideograph */
+ ["\u9363", "\u9363"], /* CJK Ideograph */
+ ["\u9364", "\u9364"], /* CJK Ideograph */
+ ["\u9365", "\u9365"], /* CJK Ideograph */
+ ["\u9366", "\u9366"], /* CJK Ideograph */
+ ["\u9367", "\u9367"], /* CJK Ideograph */
+ ["\u9368", "\u9368"], /* CJK Ideograph */
+ ["\u9369", "\u9369"], /* CJK Ideograph */
+ ["\u936A", "\u936A"], /* CJK Ideograph */
+ ["\u936B", "\u936B"], /* CJK Ideograph */
+ ["\u936C", "\u936C"], /* CJK Ideograph */
+ ["\u936D", "\u936D"], /* CJK Ideograph */
+ ["\u936E", "\u936E"], /* CJK Ideograph */
+ ["\u936F", "\u936F"], /* CJK Ideograph */
+ ["\u9370", "\u9370"], /* CJK Ideograph */
+ ["\u9371", "\u9371"], /* CJK Ideograph */
+ ["\u9372", "\u9372"], /* CJK Ideograph */
+ ["\u9373", "\u9373"], /* CJK Ideograph */
+ ["\u9374", "\u9374"], /* CJK Ideograph */
+ ["\u9375", "\u9375"], /* CJK Ideograph */
+ ["\u9376", "\u9376"], /* CJK Ideograph */
+ ["\u9377", "\u9377"], /* CJK Ideograph */
+ ["\u9378", "\u9378"], /* CJK Ideograph */
+ ["\u9379", "\u9379"], /* CJK Ideograph */
+ ["\u937A", "\u937A"], /* CJK Ideograph */
+ ["\u937B", "\u937B"], /* CJK Ideograph */
+ ["\u937C", "\u937C"], /* CJK Ideograph */
+ ["\u937D", "\u937D"], /* CJK Ideograph */
+ ["\u937E", "\u937E"], /* CJK Ideograph */
+ ["\u937F", "\u937F"], /* CJK Ideograph */
+ ["\u9380", "\u9380"], /* CJK Ideograph */
+ ["\u9381", "\u9381"], /* CJK Ideograph */
+ ["\u9382", "\u9382"], /* CJK Ideograph */
+ ["\u9383", "\u9383"], /* CJK Ideograph */
+ ["\u9384", "\u9384"], /* CJK Ideograph */
+ ["\u9385", "\u9385"], /* CJK Ideograph */
+ ["\u9386", "\u9386"], /* CJK Ideograph */
+ ["\u9387", "\u9387"], /* CJK Ideograph */
+ ["\u9388", "\u9388"], /* CJK Ideograph */
+ ["\u9389", "\u9389"], /* CJK Ideograph */
+ ["\u938A", "\u938A"], /* CJK Ideograph */
+ ["\u938B", "\u938B"], /* CJK Ideograph */
+ ["\u938C", "\u938C"], /* CJK Ideograph */
+ ["\u938D", "\u938D"], /* CJK Ideograph */
+ ["\u938E", "\u938E"], /* CJK Ideograph */
+ ["\u938F", "\u938F"], /* CJK Ideograph */
+ ["\u9390", "\u9390"], /* CJK Ideograph */
+ ["\u9391", "\u9391"], /* CJK Ideograph */
+ ["\u9392", "\u9392"], /* CJK Ideograph */
+ ["\u9393", "\u9393"], /* CJK Ideograph */
+ ["\u9394", "\u9394"], /* CJK Ideograph */
+ ["\u9395", "\u9395"], /* CJK Ideograph */
+ ["\u9396", "\u9396"], /* CJK Ideograph */
+ ["\u9397", "\u9397"], /* CJK Ideograph */
+ ["\u9398", "\u9398"], /* CJK Ideograph */
+ ["\u9399", "\u9399"], /* CJK Ideograph */
+ ["\u939A", "\u939A"], /* CJK Ideograph */
+ ["\u939B", "\u939B"], /* CJK Ideograph */
+ ["\u939C", "\u939C"], /* CJK Ideograph */
+ ["\u939D", "\u939D"], /* CJK Ideograph */
+ ["\u939E", "\u939E"], /* CJK Ideograph */
+ ["\u939F", "\u939F"], /* CJK Ideograph */
+ ["\u93A0", "\u93A0"], /* CJK Ideograph */
+ ["\u93A1", "\u93A1"], /* CJK Ideograph */
+ ["\u93A2", "\u93A2"], /* CJK Ideograph */
+ ["\u93A3", "\u93A3"], /* CJK Ideograph */
+ ["\u93A4", "\u93A4"], /* CJK Ideograph */
+ ["\u93A5", "\u93A5"], /* CJK Ideograph */
+ ["\u93A6", "\u93A6"], /* CJK Ideograph */
+ ["\u93A7", "\u93A7"], /* CJK Ideograph */
+ ["\u93A8", "\u93A8"], /* CJK Ideograph */
+ ["\u93A9", "\u93A9"], /* CJK Ideograph */
+ ["\u93AA", "\u93AA"], /* CJK Ideograph */
+ ["\u93AB", "\u93AB"], /* CJK Ideograph */
+ ["\u93AC", "\u93AC"], /* CJK Ideograph */
+ ["\u93AD", "\u93AD"], /* CJK Ideograph */
+ ["\u93AE", "\u93AE"], /* CJK Ideograph */
+ ["\u93AF", "\u93AF"], /* CJK Ideograph */
+ ["\u93B0", "\u93B0"], /* CJK Ideograph */
+ ["\u93B1", "\u93B1"], /* CJK Ideograph */
+ ["\u93B2", "\u93B2"], /* CJK Ideograph */
+ ["\u93B3", "\u93B3"], /* CJK Ideograph */
+ ["\u93B4", "\u93B4"], /* CJK Ideograph */
+ ["\u93B5", "\u93B5"], /* CJK Ideograph */
+ ["\u93B6", "\u93B6"], /* CJK Ideograph */
+ ["\u93B7", "\u93B7"], /* CJK Ideograph */
+ ["\u93B8", "\u93B8"], /* CJK Ideograph */
+ ["\u93B9", "\u93B9"], /* CJK Ideograph */
+ ["\u93BA", "\u93BA"], /* CJK Ideograph */
+ ["\u93BB", "\u93BB"], /* CJK Ideograph */
+ ["\u93BC", "\u93BC"], /* CJK Ideograph */
+ ["\u93BD", "\u93BD"], /* CJK Ideograph */
+ ["\u93BE", "\u93BE"], /* CJK Ideograph */
+ ["\u93BF", "\u93BF"], /* CJK Ideograph */
+ ["\u93C0", "\u93C0"], /* CJK Ideograph */
+ ["\u93C1", "\u93C1"], /* CJK Ideograph */
+ ["\u93C2", "\u93C2"], /* CJK Ideograph */
+ ["\u93C3", "\u93C3"], /* CJK Ideograph */
+ ["\u93C4", "\u93C4"], /* CJK Ideograph */
+ ["\u93C5", "\u93C5"], /* CJK Ideograph */
+ ["\u93C6", "\u93C6"], /* CJK Ideograph */
+ ["\u93C7", "\u93C7"], /* CJK Ideograph */
+ ["\u93C8", "\u93C8"], /* CJK Ideograph */
+ ["\u93C9", "\u93C9"], /* CJK Ideograph */
+ ["\u93CA", "\u93CA"], /* CJK Ideograph */
+ ["\u93CB", "\u93CB"], /* CJK Ideograph */
+ ["\u93CC", "\u93CC"], /* CJK Ideograph */
+ ["\u93CD", "\u93CD"], /* CJK Ideograph */
+ ["\u93CE", "\u93CE"], /* CJK Ideograph */
+ ["\u93CF", "\u93CF"], /* CJK Ideograph */
+ ["\u93D0", "\u93D0"], /* CJK Ideograph */
+ ["\u93D1", "\u93D1"], /* CJK Ideograph */
+ ["\u93D2", "\u93D2"], /* CJK Ideograph */
+ ["\u93D3", "\u93D3"], /* CJK Ideograph */
+ ["\u93D4", "\u93D4"], /* CJK Ideograph */
+ ["\u93D5", "\u93D5"], /* CJK Ideograph */
+ ["\u93D6", "\u93D6"], /* CJK Ideograph */
+ ["\u93D7", "\u93D7"], /* CJK Ideograph */
+ ["\u93D8", "\u93D8"], /* CJK Ideograph */
+ ["\u93D9", "\u93D9"], /* CJK Ideograph */
+ ["\u93DA", "\u93DA"], /* CJK Ideograph */
+ ["\u93DB", "\u93DB"], /* CJK Ideograph */
+ ["\u93DC", "\u93DC"], /* CJK Ideograph */
+ ["\u93DD", "\u93DD"], /* CJK Ideograph */
+ ["\u93DE", "\u93DE"], /* CJK Ideograph */
+ ["\u93DF", "\u93DF"], /* CJK Ideograph */
+ ["\u93E0", "\u93E0"], /* CJK Ideograph */
+ ["\u93E1", "\u93E1"], /* CJK Ideograph */
+ ["\u93E2", "\u93E2"], /* CJK Ideograph */
+ ["\u93E3", "\u93E3"], /* CJK Ideograph */
+ ["\u93E4", "\u93E4"], /* CJK Ideograph */
+ ["\u93E5", "\u93E5"], /* CJK Ideograph */
+ ["\u93E6", "\u93E6"], /* CJK Ideograph */
+ ["\u93E7", "\u93E7"], /* CJK Ideograph */
+ ["\u93E8", "\u93E8"], /* CJK Ideograph */
+ ["\u93E9", "\u93E9"], /* CJK Ideograph */
+ ["\u93EA", "\u93EA"], /* CJK Ideograph */
+ ["\u93EB", "\u93EB"], /* CJK Ideograph */
+ ["\u93EC", "\u93EC"], /* CJK Ideograph */
+ ["\u93ED", "\u93ED"], /* CJK Ideograph */
+ ["\u93EE", "\u93EE"], /* CJK Ideograph */
+ ["\u93EF", "\u93EF"], /* CJK Ideograph */
+ ["\u93F0", "\u93F0"], /* CJK Ideograph */
+ ["\u93F1", "\u93F1"], /* CJK Ideograph */
+ ["\u93F2", "\u93F2"], /* CJK Ideograph */
+ ["\u93F3", "\u93F3"], /* CJK Ideograph */
+ ["\u93F4", "\u93F4"], /* CJK Ideograph */
+ ["\u93F5", "\u93F5"], /* CJK Ideograph */
+ ["\u93F6", "\u93F6"], /* CJK Ideograph */
+ ["\u93F7", "\u93F7"], /* CJK Ideograph */
+ ["\u93F8", "\u93F8"], /* CJK Ideograph */
+ ["\u93F9", "\u93F9"], /* CJK Ideograph */
+ ["\u93FA", "\u93FA"], /* CJK Ideograph */
+ ["\u93FB", "\u93FB"], /* CJK Ideograph */
+ ["\u93FC", "\u93FC"], /* CJK Ideograph */
+ ["\u93FD", "\u93FD"], /* CJK Ideograph */
+ ["\u93FE", "\u93FE"], /* CJK Ideograph */
+ ["\u93FF", "\u93FF"], /* CJK Ideograph */
+ ["\u9400", "\u9400"], /* CJK Ideograph */
+ ["\u9401", "\u9401"], /* CJK Ideograph */
+ ["\u9402", "\u9402"], /* CJK Ideograph */
+ ["\u9403", "\u9403"], /* CJK Ideograph */
+ ["\u9404", "\u9404"], /* CJK Ideograph */
+ ["\u9405", "\u9405"], /* CJK Ideograph */
+ ["\u9406", "\u9406"], /* CJK Ideograph */
+ ["\u9407", "\u9407"], /* CJK Ideograph */
+ ["\u9408", "\u9408"], /* CJK Ideograph */
+ ["\u9409", "\u9409"], /* CJK Ideograph */
+ ["\u940A", "\u940A"], /* CJK Ideograph */
+ ["\u940B", "\u940B"], /* CJK Ideograph */
+ ["\u940C", "\u940C"], /* CJK Ideograph */
+ ["\u940D", "\u940D"], /* CJK Ideograph */
+ ["\u940E", "\u940E"], /* CJK Ideograph */
+ ["\u940F", "\u940F"], /* CJK Ideograph */
+ ["\u9410", "\u9410"], /* CJK Ideograph */
+ ["\u9411", "\u9411"], /* CJK Ideograph */
+ ["\u9412", "\u9412"], /* CJK Ideograph */
+ ["\u9413", "\u9413"], /* CJK Ideograph */
+ ["\u9414", "\u9414"], /* CJK Ideograph */
+ ["\u9415", "\u9415"], /* CJK Ideograph */
+ ["\u9416", "\u9416"], /* CJK Ideograph */
+ ["\u9417", "\u9417"], /* CJK Ideograph */
+ ["\u9418", "\u9418"], /* CJK Ideograph */
+ ["\u9419", "\u9419"], /* CJK Ideograph */
+ ["\u941A", "\u941A"], /* CJK Ideograph */
+ ["\u941B", "\u941B"], /* CJK Ideograph */
+ ["\u941C", "\u941C"], /* CJK Ideograph */
+ ["\u941D", "\u941D"], /* CJK Ideograph */
+ ["\u941E", "\u941E"], /* CJK Ideograph */
+ ["\u941F", "\u941F"], /* CJK Ideograph */
+ ["\u9420", "\u9420"], /* CJK Ideograph */
+ ["\u9421", "\u9421"], /* CJK Ideograph */
+ ["\u9422", "\u9422"], /* CJK Ideograph */
+ ["\u9423", "\u9423"], /* CJK Ideograph */
+ ["\u9424", "\u9424"], /* CJK Ideograph */
+ ["\u9425", "\u9425"], /* CJK Ideograph */
+ ["\u9426", "\u9426"], /* CJK Ideograph */
+ ["\u9427", "\u9427"], /* CJK Ideograph */
+ ["\u9428", "\u9428"], /* CJK Ideograph */
+ ["\u9429", "\u9429"], /* CJK Ideograph */
+ ["\u942A", "\u942A"], /* CJK Ideograph */
+ ["\u942B", "\u942B"], /* CJK Ideograph */
+ ["\u942C", "\u942C"], /* CJK Ideograph */
+ ["\u942D", "\u942D"], /* CJK Ideograph */
+ ["\u942E", "\u942E"], /* CJK Ideograph */
+ ["\u942F", "\u942F"], /* CJK Ideograph */
+ ["\u9430", "\u9430"], /* CJK Ideograph */
+ ["\u9431", "\u9431"], /* CJK Ideograph */
+ ["\u9432", "\u9432"], /* CJK Ideograph */
+ ["\u9433", "\u9433"], /* CJK Ideograph */
+ ["\u9434", "\u9434"], /* CJK Ideograph */
+ ["\u9435", "\u9435"], /* CJK Ideograph */
+ ["\u9436", "\u9436"], /* CJK Ideograph */
+ ["\u9437", "\u9437"], /* CJK Ideograph */
+ ["\u9438", "\u9438"], /* CJK Ideograph */
+ ["\u9439", "\u9439"], /* CJK Ideograph */
+ ["\u943A", "\u943A"], /* CJK Ideograph */
+ ["\u943B", "\u943B"], /* CJK Ideograph */
+ ["\u943C", "\u943C"], /* CJK Ideograph */
+ ["\u943D", "\u943D"], /* CJK Ideograph */
+ ["\u943E", "\u943E"], /* CJK Ideograph */
+ ["\u943F", "\u943F"], /* CJK Ideograph */
+ ["\u9440", "\u9440"], /* CJK Ideograph */
+ ["\u9441", "\u9441"], /* CJK Ideograph */
+ ["\u9442", "\u9442"], /* CJK Ideograph */
+ ["\u9443", "\u9443"], /* CJK Ideograph */
+ ["\u9444", "\u9444"], /* CJK Ideograph */
+ ["\u9445", "\u9445"], /* CJK Ideograph */
+ ["\u9446", "\u9446"], /* CJK Ideograph */
+ ["\u9447", "\u9447"], /* CJK Ideograph */
+ ["\u9448", "\u9448"], /* CJK Ideograph */
+ ["\u9449", "\u9449"], /* CJK Ideograph */
+ ["\u944A", "\u944A"], /* CJK Ideograph */
+ ["\u944B", "\u944B"], /* CJK Ideograph */
+ ["\u944C", "\u944C"], /* CJK Ideograph */
+ ["\u944D", "\u944D"], /* CJK Ideograph */
+ ["\u944E", "\u944E"], /* CJK Ideograph */
+ ["\u944F", "\u944F"], /* CJK Ideograph */
+ ["\u9450", "\u9450"], /* CJK Ideograph */
+ ["\u9451", "\u9451"], /* CJK Ideograph */
+ ["\u9452", "\u9452"], /* CJK Ideograph */
+ ["\u9453", "\u9453"], /* CJK Ideograph */
+ ["\u9454", "\u9454"], /* CJK Ideograph */
+ ["\u9455", "\u9455"], /* CJK Ideograph */
+ ["\u9456", "\u9456"], /* CJK Ideograph */
+ ["\u9457", "\u9457"], /* CJK Ideograph */
+ ["\u9458", "\u9458"], /* CJK Ideograph */
+ ["\u9459", "\u9459"], /* CJK Ideograph */
+ ["\u945A", "\u945A"], /* CJK Ideograph */
+ ["\u945B", "\u945B"], /* CJK Ideograph */
+ ["\u945C", "\u945C"], /* CJK Ideograph */
+ ["\u945D", "\u945D"], /* CJK Ideograph */
+ ["\u945E", "\u945E"], /* CJK Ideograph */
+ ["\u945F", "\u945F"], /* CJK Ideograph */
+ ["\u9460", "\u9460"], /* CJK Ideograph */
+ ["\u9461", "\u9461"], /* CJK Ideograph */
+ ["\u9462", "\u9462"], /* CJK Ideograph */
+ ["\u9463", "\u9463"], /* CJK Ideograph */
+ ["\u9464", "\u9464"], /* CJK Ideograph */
+ ["\u9465", "\u9465"], /* CJK Ideograph */
+ ["\u9466", "\u9466"], /* CJK Ideograph */
+ ["\u9467", "\u9467"], /* CJK Ideograph */
+ ["\u9468", "\u9468"], /* CJK Ideograph */
+ ["\u9469", "\u9469"], /* CJK Ideograph */
+ ["\u946A", "\u946A"], /* CJK Ideograph */
+ ["\u946B", "\u946B"], /* CJK Ideograph */
+ ["\u946C", "\u946C"], /* CJK Ideograph */
+ ["\u946D", "\u946D"], /* CJK Ideograph */
+ ["\u946E", "\u946E"], /* CJK Ideograph */
+ ["\u946F", "\u946F"], /* CJK Ideograph */
+ ["\u9470", "\u9470"], /* CJK Ideograph */
+ ["\u9471", "\u9471"], /* CJK Ideograph */
+ ["\u9472", "\u9472"], /* CJK Ideograph */
+ ["\u9473", "\u9473"], /* CJK Ideograph */
+ ["\u9474", "\u9474"], /* CJK Ideograph */
+ ["\u9475", "\u9475"], /* CJK Ideograph */
+ ["\u9476", "\u9476"], /* CJK Ideograph */
+ ["\u9477", "\u9477"], /* CJK Ideograph */
+ ["\u9478", "\u9478"], /* CJK Ideograph */
+ ["\u9479", "\u9479"], /* CJK Ideograph */
+ ["\u947A", "\u947A"], /* CJK Ideograph */
+ ["\u947B", "\u947B"], /* CJK Ideograph */
+ ["\u947C", "\u947C"], /* CJK Ideograph */
+ ["\u947D", "\u947D"], /* CJK Ideograph */
+ ["\u947E", "\u947E"], /* CJK Ideograph */
+ ["\u947F", "\u947F"], /* CJK Ideograph */
+ ["\u9480", "\u9480"], /* CJK Ideograph */
+ ["\u9481", "\u9481"], /* CJK Ideograph */
+ ["\u9482", "\u9482"], /* CJK Ideograph */
+ ["\u9483", "\u9483"], /* CJK Ideograph */
+ ["\u9484", "\u9484"], /* CJK Ideograph */
+ ["\u9485", "\u9485"], /* CJK Ideograph */
+ ["\u9486", "\u9486"], /* CJK Ideograph */
+ ["\u9487", "\u9487"], /* CJK Ideograph */
+ ["\u9488", "\u9488"], /* CJK Ideograph */
+ ["\u9489", "\u9489"], /* CJK Ideograph */
+ ["\u948A", "\u948A"], /* CJK Ideograph */
+ ["\u948B", "\u948B"], /* CJK Ideograph */
+ ["\u948C", "\u948C"], /* CJK Ideograph */
+ ["\u948D", "\u948D"], /* CJK Ideograph */
+ ["\u948E", "\u948E"], /* CJK Ideograph */
+ ["\u948F", "\u948F"], /* CJK Ideograph */
+ ["\u9490", "\u9490"], /* CJK Ideograph */
+ ["\u9491", "\u9491"], /* CJK Ideograph */
+ ["\u9492", "\u9492"], /* CJK Ideograph */
+ ["\u9493", "\u9493"], /* CJK Ideograph */
+ ["\u9494", "\u9494"], /* CJK Ideograph */
+ ["\u9495", "\u9495"], /* CJK Ideograph */
+ ["\u9496", "\u9496"], /* CJK Ideograph */
+ ["\u9497", "\u9497"], /* CJK Ideograph */
+ ["\u9498", "\u9498"], /* CJK Ideograph */
+ ["\u9499", "\u9499"], /* CJK Ideograph */
+ ["\u949A", "\u949A"], /* CJK Ideograph */
+ ["\u949B", "\u949B"], /* CJK Ideograph */
+ ["\u949C", "\u949C"], /* CJK Ideograph */
+ ["\u949D", "\u949D"], /* CJK Ideograph */
+ ["\u949E", "\u949E"], /* CJK Ideograph */
+ ["\u949F", "\u949F"], /* CJK Ideograph */
+ ["\u94A0", "\u94A0"], /* CJK Ideograph */
+ ["\u94A1", "\u94A1"], /* CJK Ideograph */
+ ["\u94A2", "\u94A2"], /* CJK Ideograph */
+ ["\u94A3", "\u94A3"], /* CJK Ideograph */
+ ["\u94A4", "\u94A4"], /* CJK Ideograph */
+ ["\u94A5", "\u94A5"], /* CJK Ideograph */
+ ["\u94A6", "\u94A6"], /* CJK Ideograph */
+ ["\u94A7", "\u94A7"], /* CJK Ideograph */
+ ["\u94A8", "\u94A8"], /* CJK Ideograph */
+ ["\u94A9", "\u94A9"], /* CJK Ideograph */
+ ["\u94AA", "\u94AA"], /* CJK Ideograph */
+ ["\u94AB", "\u94AB"], /* CJK Ideograph */
+ ["\u94AC", "\u94AC"], /* CJK Ideograph */
+ ["\u94AD", "\u94AD"], /* CJK Ideograph */
+ ["\u94AE", "\u94AE"], /* CJK Ideograph */
+ ["\u94AF", "\u94AF"], /* CJK Ideograph */
+ ["\u94B0", "\u94B0"], /* CJK Ideograph */
+ ["\u94B1", "\u94B1"], /* CJK Ideograph */
+ ["\u94B2", "\u94B2"], /* CJK Ideograph */
+ ["\u94B3", "\u94B3"], /* CJK Ideograph */
+ ["\u94B4", "\u94B4"], /* CJK Ideograph */
+ ["\u94B5", "\u94B5"], /* CJK Ideograph */
+ ["\u94B6", "\u94B6"], /* CJK Ideograph */
+ ["\u94B7", "\u94B7"], /* CJK Ideograph */
+ ["\u94B8", "\u94B8"], /* CJK Ideograph */
+ ["\u94B9", "\u94B9"], /* CJK Ideograph */
+ ["\u94BA", "\u94BA"], /* CJK Ideograph */
+ ["\u94BB", "\u94BB"], /* CJK Ideograph */
+ ["\u94BC", "\u94BC"], /* CJK Ideograph */
+ ["\u94BD", "\u94BD"], /* CJK Ideograph */
+ ["\u94BE", "\u94BE"], /* CJK Ideograph */
+ ["\u94BF", "\u94BF"], /* CJK Ideograph */
+ ["\u94C0", "\u94C0"], /* CJK Ideograph */
+ ["\u94C1", "\u94C1"], /* CJK Ideograph */
+ ["\u94C2", "\u94C2"], /* CJK Ideograph */
+ ["\u94C3", "\u94C3"], /* CJK Ideograph */
+ ["\u94C4", "\u94C4"], /* CJK Ideograph */
+ ["\u94C5", "\u94C5"], /* CJK Ideograph */
+ ["\u94C6", "\u94C6"], /* CJK Ideograph */
+ ["\u94C7", "\u94C7"], /* CJK Ideograph */
+ ["\u94C8", "\u94C8"], /* CJK Ideograph */
+ ["\u94C9", "\u94C9"], /* CJK Ideograph */
+ ["\u94CA", "\u94CA"], /* CJK Ideograph */
+ ["\u94CB", "\u94CB"], /* CJK Ideograph */
+ ["\u94CC", "\u94CC"], /* CJK Ideograph */
+ ["\u94CD", "\u94CD"], /* CJK Ideograph */
+ ["\u94CE", "\u94CE"], /* CJK Ideograph */
+ ["\u94CF", "\u94CF"], /* CJK Ideograph */
+ ["\u94D0", "\u94D0"], /* CJK Ideograph */
+ ["\u94D1", "\u94D1"], /* CJK Ideograph */
+ ["\u94D2", "\u94D2"], /* CJK Ideograph */
+ ["\u94D3", "\u94D3"], /* CJK Ideograph */
+ ["\u94D4", "\u94D4"], /* CJK Ideograph */
+ ["\u94D5", "\u94D5"], /* CJK Ideograph */
+ ["\u94D6", "\u94D6"], /* CJK Ideograph */
+ ["\u94D7", "\u94D7"], /* CJK Ideograph */
+ ["\u94D8", "\u94D8"], /* CJK Ideograph */
+ ["\u94D9", "\u94D9"], /* CJK Ideograph */
+ ["\u94DA", "\u94DA"], /* CJK Ideograph */
+ ["\u94DB", "\u94DB"], /* CJK Ideograph */
+ ["\u94DC", "\u94DC"], /* CJK Ideograph */
+ ["\u94DD", "\u94DD"], /* CJK Ideograph */
+ ["\u94DE", "\u94DE"], /* CJK Ideograph */
+ ["\u94DF", "\u94DF"], /* CJK Ideograph */
+ ["\u94E0", "\u94E0"], /* CJK Ideograph */
+ ["\u94E1", "\u94E1"], /* CJK Ideograph */
+ ["\u94E2", "\u94E2"], /* CJK Ideograph */
+ ["\u94E3", "\u94E3"], /* CJK Ideograph */
+ ["\u94E4", "\u94E4"], /* CJK Ideograph */
+ ["\u94E5", "\u94E5"], /* CJK Ideograph */
+ ["\u94E6", "\u94E6"], /* CJK Ideograph */
+ ["\u94E7", "\u94E7"], /* CJK Ideograph */
+ ["\u94E8", "\u94E8"], /* CJK Ideograph */
+ ["\u94E9", "\u94E9"], /* CJK Ideograph */
+ ["\u94EA", "\u94EA"], /* CJK Ideograph */
+ ["\u94EB", "\u94EB"], /* CJK Ideograph */
+ ["\u94EC", "\u94EC"], /* CJK Ideograph */
+ ["\u94ED", "\u94ED"], /* CJK Ideograph */
+ ["\u94EE", "\u94EE"], /* CJK Ideograph */
+ ["\u94EF", "\u94EF"], /* CJK Ideograph */
+ ["\u94F0", "\u94F0"], /* CJK Ideograph */
+ ["\u94F1", "\u94F1"], /* CJK Ideograph */
+ ["\u94F2", "\u94F2"], /* CJK Ideograph */
+ ["\u94F3", "\u94F3"], /* CJK Ideograph */
+ ["\u94F4", "\u94F4"], /* CJK Ideograph */
+ ["\u94F5", "\u94F5"], /* CJK Ideograph */
+ ["\u94F6", "\u94F6"], /* CJK Ideograph */
+ ["\u94F7", "\u94F7"], /* CJK Ideograph */
+ ["\u94F8", "\u94F8"], /* CJK Ideograph */
+ ["\u94F9", "\u94F9"], /* CJK Ideograph */
+ ["\u94FA", "\u94FA"], /* CJK Ideograph */
+ ["\u94FB", "\u94FB"], /* CJK Ideograph */
+ ["\u94FC", "\u94FC"], /* CJK Ideograph */
+ ["\u94FD", "\u94FD"], /* CJK Ideograph */
+ ["\u94FE", "\u94FE"], /* CJK Ideograph */
+ ["\u94FF", "\u94FF"], /* CJK Ideograph */
+ ["\u9500", "\u9500"], /* CJK Ideograph */
+ ["\u9501", "\u9501"], /* CJK Ideograph */
+ ["\u9502", "\u9502"], /* CJK Ideograph */
+ ["\u9503", "\u9503"], /* CJK Ideograph */
+ ["\u9504", "\u9504"], /* CJK Ideograph */
+ ["\u9505", "\u9505"], /* CJK Ideograph */
+ ["\u9506", "\u9506"], /* CJK Ideograph */
+ ["\u9507", "\u9507"], /* CJK Ideograph */
+ ["\u9508", "\u9508"], /* CJK Ideograph */
+ ["\u9509", "\u9509"], /* CJK Ideograph */
+ ["\u950A", "\u950A"], /* CJK Ideograph */
+ ["\u950B", "\u950B"], /* CJK Ideograph */
+ ["\u950C", "\u950C"], /* CJK Ideograph */
+ ["\u950D", "\u950D"], /* CJK Ideograph */
+ ["\u950E", "\u950E"], /* CJK Ideograph */
+ ["\u950F", "\u950F"], /* CJK Ideograph */
+ ["\u9510", "\u9510"], /* CJK Ideograph */
+ ["\u9511", "\u9511"], /* CJK Ideograph */
+ ["\u9512", "\u9512"], /* CJK Ideograph */
+ ["\u9513", "\u9513"], /* CJK Ideograph */
+ ["\u9514", "\u9514"], /* CJK Ideograph */
+ ["\u9515", "\u9515"], /* CJK Ideograph */
+ ["\u9516", "\u9516"], /* CJK Ideograph */
+ ["\u9517", "\u9517"], /* CJK Ideograph */
+ ["\u9518", "\u9518"], /* CJK Ideograph */
+ ["\u9519", "\u9519"], /* CJK Ideograph */
+ ["\u951A", "\u951A"], /* CJK Ideograph */
+ ["\u951B", "\u951B"], /* CJK Ideograph */
+ ["\u951C", "\u951C"], /* CJK Ideograph */
+ ["\u951D", "\u951D"], /* CJK Ideograph */
+ ["\u951E", "\u951E"], /* CJK Ideograph */
+ ["\u951F", "\u951F"], /* CJK Ideograph */
+ ["\u9520", "\u9520"], /* CJK Ideograph */
+ ["\u9521", "\u9521"], /* CJK Ideograph */
+ ["\u9522", "\u9522"], /* CJK Ideograph */
+ ["\u9523", "\u9523"], /* CJK Ideograph */
+ ["\u9524", "\u9524"], /* CJK Ideograph */
+ ["\u9525", "\u9525"], /* CJK Ideograph */
+ ["\u9526", "\u9526"], /* CJK Ideograph */
+ ["\u9527", "\u9527"], /* CJK Ideograph */
+ ["\u9528", "\u9528"], /* CJK Ideograph */
+ ["\u9529", "\u9529"], /* CJK Ideograph */
+ ["\u952A", "\u952A"], /* CJK Ideograph */
+ ["\u952B", "\u952B"], /* CJK Ideograph */
+ ["\u952C", "\u952C"], /* CJK Ideograph */
+ ["\u952D", "\u952D"], /* CJK Ideograph */
+ ["\u952E", "\u952E"], /* CJK Ideograph */
+ ["\u952F", "\u952F"], /* CJK Ideograph */
+ ["\u9530", "\u9530"], /* CJK Ideograph */
+ ["\u9531", "\u9531"], /* CJK Ideograph */
+ ["\u9532", "\u9532"], /* CJK Ideograph */
+ ["\u9533", "\u9533"], /* CJK Ideograph */
+ ["\u9534", "\u9534"], /* CJK Ideograph */
+ ["\u9535", "\u9535"], /* CJK Ideograph */
+ ["\u9536", "\u9536"], /* CJK Ideograph */
+ ["\u9537", "\u9537"], /* CJK Ideograph */
+ ["\u9538", "\u9538"], /* CJK Ideograph */
+ ["\u9539", "\u9539"], /* CJK Ideograph */
+ ["\u953A", "\u953A"], /* CJK Ideograph */
+ ["\u953B", "\u953B"], /* CJK Ideograph */
+ ["\u953C", "\u953C"], /* CJK Ideograph */
+ ["\u953D", "\u953D"], /* CJK Ideograph */
+ ["\u953E", "\u953E"], /* CJK Ideograph */
+ ["\u953F", "\u953F"], /* CJK Ideograph */
+ ["\u9540", "\u9540"], /* CJK Ideograph */
+ ["\u9541", "\u9541"], /* CJK Ideograph */
+ ["\u9542", "\u9542"], /* CJK Ideograph */
+ ["\u9543", "\u9543"], /* CJK Ideograph */
+ ["\u9544", "\u9544"], /* CJK Ideograph */
+ ["\u9545", "\u9545"], /* CJK Ideograph */
+ ["\u9546", "\u9546"], /* CJK Ideograph */
+ ["\u9547", "\u9547"], /* CJK Ideograph */
+ ["\u9548", "\u9548"], /* CJK Ideograph */
+ ["\u9549", "\u9549"], /* CJK Ideograph */
+ ["\u954A", "\u954A"], /* CJK Ideograph */
+ ["\u954B", "\u954B"], /* CJK Ideograph */
+ ["\u954C", "\u954C"], /* CJK Ideograph */
+ ["\u954D", "\u954D"], /* CJK Ideograph */
+ ["\u954E", "\u954E"], /* CJK Ideograph */
+ ["\u954F", "\u954F"], /* CJK Ideograph */
+ ["\u9550", "\u9550"], /* CJK Ideograph */
+ ["\u9551", "\u9551"], /* CJK Ideograph */
+ ["\u9552", "\u9552"], /* CJK Ideograph */
+ ["\u9553", "\u9553"], /* CJK Ideograph */
+ ["\u9554", "\u9554"], /* CJK Ideograph */
+ ["\u9555", "\u9555"], /* CJK Ideograph */
+ ["\u9556", "\u9556"], /* CJK Ideograph */
+ ["\u9557", "\u9557"], /* CJK Ideograph */
+ ["\u9558", "\u9558"], /* CJK Ideograph */
+ ["\u9559", "\u9559"], /* CJK Ideograph */
+ ["\u955A", "\u955A"], /* CJK Ideograph */
+ ["\u955B", "\u955B"], /* CJK Ideograph */
+ ["\u955C", "\u955C"], /* CJK Ideograph */
+ ["\u955D", "\u955D"], /* CJK Ideograph */
+ ["\u955E", "\u955E"], /* CJK Ideograph */
+ ["\u955F", "\u955F"], /* CJK Ideograph */
+ ["\u9560", "\u9560"], /* CJK Ideograph */
+ ["\u9561", "\u9561"], /* CJK Ideograph */
+ ["\u9562", "\u9562"], /* CJK Ideograph */
+ ["\u9563", "\u9563"], /* CJK Ideograph */
+ ["\u9564", "\u9564"], /* CJK Ideograph */
+ ["\u9565", "\u9565"], /* CJK Ideograph */
+ ["\u9566", "\u9566"], /* CJK Ideograph */
+ ["\u9567", "\u9567"], /* CJK Ideograph */
+ ["\u9568", "\u9568"], /* CJK Ideograph */
+ ["\u9569", "\u9569"], /* CJK Ideograph */
+ ["\u956A", "\u956A"], /* CJK Ideograph */
+ ["\u956B", "\u956B"], /* CJK Ideograph */
+ ["\u956C", "\u956C"], /* CJK Ideograph */
+ ["\u956D", "\u956D"], /* CJK Ideograph */
+ ["\u956E", "\u956E"], /* CJK Ideograph */
+ ["\u956F", "\u956F"], /* CJK Ideograph */
+ ["\u9570", "\u9570"], /* CJK Ideograph */
+ ["\u9571", "\u9571"], /* CJK Ideograph */
+ ["\u9572", "\u9572"], /* CJK Ideograph */
+ ["\u9573", "\u9573"], /* CJK Ideograph */
+ ["\u9574", "\u9574"], /* CJK Ideograph */
+ ["\u9575", "\u9575"], /* CJK Ideograph */
+ ["\u9576", "\u9576"], /* CJK Ideograph */
+ ["\u9577", "\u9577"], /* CJK Ideograph */
+ ["\u9578", "\u9578"], /* CJK Ideograph */
+ ["\u9579", "\u9579"], /* CJK Ideograph */
+ ["\u957A", "\u957A"], /* CJK Ideograph */
+ ["\u957B", "\u957B"], /* CJK Ideograph */
+ ["\u957C", "\u957C"], /* CJK Ideograph */
+ ["\u957D", "\u957D"], /* CJK Ideograph */
+ ["\u957E", "\u957E"], /* CJK Ideograph */
+ ["\u957F", "\u957F"], /* CJK Ideograph */
+ ["\u9580", "\u9580"], /* CJK Ideograph */
+ ["\u9581", "\u9581"], /* CJK Ideograph */
+ ["\u9582", "\u9582"], /* CJK Ideograph */
+ ["\u9583", "\u9583"], /* CJK Ideograph */
+ ["\u9584", "\u9584"], /* CJK Ideograph */
+ ["\u9585", "\u9585"], /* CJK Ideograph */
+ ["\u9586", "\u9586"], /* CJK Ideograph */
+ ["\u9587", "\u9587"], /* CJK Ideograph */
+ ["\u9588", "\u9588"], /* CJK Ideograph */
+ ["\u9589", "\u9589"], /* CJK Ideograph */
+ ["\u958A", "\u958A"], /* CJK Ideograph */
+ ["\u958B", "\u958B"], /* CJK Ideograph */
+ ["\u958C", "\u958C"], /* CJK Ideograph */
+ ["\u958D", "\u958D"], /* CJK Ideograph */
+ ["\u958E", "\u958E"], /* CJK Ideograph */
+ ["\u958F", "\u958F"], /* CJK Ideograph */
+ ["\u9590", "\u9590"], /* CJK Ideograph */
+ ["\u9591", "\u9591"], /* CJK Ideograph */
+ ["\u9592", "\u9592"], /* CJK Ideograph */
+ ["\u9593", "\u9593"], /* CJK Ideograph */
+ ["\u9594", "\u9594"], /* CJK Ideograph */
+ ["\u9595", "\u9595"], /* CJK Ideograph */
+ ["\u9596", "\u9596"], /* CJK Ideograph */
+ ["\u9597", "\u9597"], /* CJK Ideograph */
+ ["\u9598", "\u9598"], /* CJK Ideograph */
+ ["\u9599", "\u9599"], /* CJK Ideograph */
+ ["\u959A", "\u959A"], /* CJK Ideograph */
+ ["\u959B", "\u959B"], /* CJK Ideograph */
+ ["\u959C", "\u959C"], /* CJK Ideograph */
+ ["\u959D", "\u959D"], /* CJK Ideograph */
+ ["\u959E", "\u959E"], /* CJK Ideograph */
+ ["\u959F", "\u959F"], /* CJK Ideograph */
+ ["\u95A0", "\u95A0"], /* CJK Ideograph */
+ ["\u95A1", "\u95A1"], /* CJK Ideograph */
+ ["\u95A2", "\u95A2"], /* CJK Ideograph */
+ ["\u95A3", "\u95A3"], /* CJK Ideograph */
+ ["\u95A4", "\u95A4"], /* CJK Ideograph */
+ ["\u95A5", "\u95A5"], /* CJK Ideograph */
+ ["\u95A6", "\u95A6"], /* CJK Ideograph */
+ ["\u95A7", "\u95A7"], /* CJK Ideograph */
+ ["\u95A8", "\u95A8"], /* CJK Ideograph */
+ ["\u95A9", "\u95A9"], /* CJK Ideograph */
+ ["\u95AA", "\u95AA"], /* CJK Ideograph */
+ ["\u95AB", "\u95AB"], /* CJK Ideograph */
+ ["\u95AC", "\u95AC"], /* CJK Ideograph */
+ ["\u95AD", "\u95AD"], /* CJK Ideograph */
+ ["\u95AE", "\u95AE"], /* CJK Ideograph */
+ ["\u95AF", "\u95AF"], /* CJK Ideograph */
+ ["\u95B0", "\u95B0"], /* CJK Ideograph */
+ ["\u95B1", "\u95B1"], /* CJK Ideograph */
+ ["\u95B2", "\u95B2"], /* CJK Ideograph */
+ ["\u95B3", "\u95B3"], /* CJK Ideograph */
+ ["\u95B4", "\u95B4"], /* CJK Ideograph */
+ ["\u95B5", "\u95B5"], /* CJK Ideograph */
+ ["\u95B6", "\u95B6"], /* CJK Ideograph */
+ ["\u95B7", "\u95B7"], /* CJK Ideograph */
+ ["\u95B8", "\u95B8"], /* CJK Ideograph */
+ ["\u95B9", "\u95B9"], /* CJK Ideograph */
+ ["\u95BA", "\u95BA"], /* CJK Ideograph */
+ ["\u95BB", "\u95BB"], /* CJK Ideograph */
+ ["\u95BC", "\u95BC"], /* CJK Ideograph */
+ ["\u95BD", "\u95BD"], /* CJK Ideograph */
+ ["\u95BE", "\u95BE"], /* CJK Ideograph */
+ ["\u95BF", "\u95BF"], /* CJK Ideograph */
+ ["\u95C0", "\u95C0"], /* CJK Ideograph */
+ ["\u95C1", "\u95C1"], /* CJK Ideograph */
+ ["\u95C2", "\u95C2"], /* CJK Ideograph */
+ ["\u95C3", "\u95C3"], /* CJK Ideograph */
+ ["\u95C4", "\u95C4"], /* CJK Ideograph */
+ ["\u95C5", "\u95C5"], /* CJK Ideograph */
+ ["\u95C6", "\u95C6"], /* CJK Ideograph */
+ ["\u95C7", "\u95C7"], /* CJK Ideograph */
+ ["\u95C8", "\u95C8"], /* CJK Ideograph */
+ ["\u95C9", "\u95C9"], /* CJK Ideograph */
+ ["\u95CA", "\u95CA"], /* CJK Ideograph */
+ ["\u95CB", "\u95CB"], /* CJK Ideograph */
+ ["\u95CC", "\u95CC"], /* CJK Ideograph */
+ ["\u95CD", "\u95CD"], /* CJK Ideograph */
+ ["\u95CE", "\u95CE"], /* CJK Ideograph */
+ ["\u95CF", "\u95CF"], /* CJK Ideograph */
+ ["\u95D0", "\u95D0"], /* CJK Ideograph */
+ ["\u95D1", "\u95D1"], /* CJK Ideograph */
+ ["\u95D2", "\u95D2"], /* CJK Ideograph */
+ ["\u95D3", "\u95D3"], /* CJK Ideograph */
+ ["\u95D4", "\u95D4"], /* CJK Ideograph */
+ ["\u95D5", "\u95D5"], /* CJK Ideograph */
+ ["\u95D6", "\u95D6"], /* CJK Ideograph */
+ ["\u95D7", "\u95D7"], /* CJK Ideograph */
+ ["\u95D8", "\u95D8"], /* CJK Ideograph */
+ ["\u95D9", "\u95D9"], /* CJK Ideograph */
+ ["\u95DA", "\u95DA"], /* CJK Ideograph */
+ ["\u95DB", "\u95DB"], /* CJK Ideograph */
+ ["\u95DC", "\u95DC"], /* CJK Ideograph */
+ ["\u95DD", "\u95DD"], /* CJK Ideograph */
+ ["\u95DE", "\u95DE"], /* CJK Ideograph */
+ ["\u95DF", "\u95DF"], /* CJK Ideograph */
+ ["\u95E0", "\u95E0"], /* CJK Ideograph */
+ ["\u95E1", "\u95E1"], /* CJK Ideograph */
+ ["\u95E2", "\u95E2"], /* CJK Ideograph */
+ ["\u95E3", "\u95E3"], /* CJK Ideograph */
+ ["\u95E4", "\u95E4"], /* CJK Ideograph */
+ ["\u95E5", "\u95E5"], /* CJK Ideograph */
+ ["\u95E6", "\u95E6"], /* CJK Ideograph */
+ ["\u95E7", "\u95E7"], /* CJK Ideograph */
+ ["\u95E8", "\u95E8"], /* CJK Ideograph */
+ ["\u95E9", "\u95E9"], /* CJK Ideograph */
+ ["\u95EA", "\u95EA"], /* CJK Ideograph */
+ ["\u95EB", "\u95EB"], /* CJK Ideograph */
+ ["\u95EC", "\u95EC"], /* CJK Ideograph */
+ ["\u95ED", "\u95ED"], /* CJK Ideograph */
+ ["\u95EE", "\u95EE"], /* CJK Ideograph */
+ ["\u95EF", "\u95EF"], /* CJK Ideograph */
+ ["\u95F0", "\u95F0"], /* CJK Ideograph */
+ ["\u95F1", "\u95F1"], /* CJK Ideograph */
+ ["\u95F2", "\u95F2"], /* CJK Ideograph */
+ ["\u95F3", "\u95F3"], /* CJK Ideograph */
+ ["\u95F4", "\u95F4"], /* CJK Ideograph */
+ ["\u95F5", "\u95F5"], /* CJK Ideograph */
+ ["\u95F6", "\u95F6"], /* CJK Ideograph */
+ ["\u95F7", "\u95F7"], /* CJK Ideograph */
+ ["\u95F8", "\u95F8"], /* CJK Ideograph */
+ ["\u95F9", "\u95F9"], /* CJK Ideograph */
+ ["\u95FA", "\u95FA"], /* CJK Ideograph */
+ ["\u95FB", "\u95FB"], /* CJK Ideograph */
+ ["\u95FC", "\u95FC"], /* CJK Ideograph */
+ ["\u95FD", "\u95FD"], /* CJK Ideograph */
+ ["\u95FE", "\u95FE"], /* CJK Ideograph */
+ ["\u95FF", "\u95FF"], /* CJK Ideograph */
+ ["\u9600", "\u9600"], /* CJK Ideograph */
+ ["\u9601", "\u9601"], /* CJK Ideograph */
+ ["\u9602", "\u9602"], /* CJK Ideograph */
+ ["\u9603", "\u9603"], /* CJK Ideograph */
+ ["\u9604", "\u9604"], /* CJK Ideograph */
+ ["\u9605", "\u9605"], /* CJK Ideograph */
+ ["\u9606", "\u9606"], /* CJK Ideograph */
+ ["\u9607", "\u9607"], /* CJK Ideograph */
+ ["\u9608", "\u9608"], /* CJK Ideograph */
+ ["\u9609", "\u9609"], /* CJK Ideograph */
+ ["\u960A", "\u960A"], /* CJK Ideograph */
+ ["\u960B", "\u960B"], /* CJK Ideograph */
+ ["\u960C", "\u960C"], /* CJK Ideograph */
+ ["\u960D", "\u960D"], /* CJK Ideograph */
+ ["\u960E", "\u960E"], /* CJK Ideograph */
+ ["\u960F", "\u960F"], /* CJK Ideograph */
+ ["\u9610", "\u9610"], /* CJK Ideograph */
+ ["\u9611", "\u9611"], /* CJK Ideograph */
+ ["\u9612", "\u9612"], /* CJK Ideograph */
+ ["\u9613", "\u9613"], /* CJK Ideograph */
+ ["\u9614", "\u9614"], /* CJK Ideograph */
+ ["\u9615", "\u9615"], /* CJK Ideograph */
+ ["\u9616", "\u9616"], /* CJK Ideograph */
+ ["\u9617", "\u9617"], /* CJK Ideograph */
+ ["\u9618", "\u9618"], /* CJK Ideograph */
+ ["\u9619", "\u9619"], /* CJK Ideograph */
+ ["\u961A", "\u961A"], /* CJK Ideograph */
+ ["\u961B", "\u961B"], /* CJK Ideograph */
+ ["\u961C", "\u961C"], /* CJK Ideograph */
+ ["\u961D", "\u961D"], /* CJK Ideograph */
+ ["\u961E", "\u961E"], /* CJK Ideograph */
+ ["\u961F", "\u961F"], /* CJK Ideograph */
+ ["\u9620", "\u9620"], /* CJK Ideograph */
+ ["\u9621", "\u9621"], /* CJK Ideograph */
+ ["\u9622", "\u9622"], /* CJK Ideograph */
+ ["\u9623", "\u9623"], /* CJK Ideograph */
+ ["\u9624", "\u9624"], /* CJK Ideograph */
+ ["\u9625", "\u9625"], /* CJK Ideograph */
+ ["\u9626", "\u9626"], /* CJK Ideograph */
+ ["\u9627", "\u9627"], /* CJK Ideograph */
+ ["\u9628", "\u9628"], /* CJK Ideograph */
+ ["\u9629", "\u9629"], /* CJK Ideograph */
+ ["\u962A", "\u962A"], /* CJK Ideograph */
+ ["\u962B", "\u962B"], /* CJK Ideograph */
+ ["\u962C", "\u962C"], /* CJK Ideograph */
+ ["\u962D", "\u962D"], /* CJK Ideograph */
+ ["\u962E", "\u962E"], /* CJK Ideograph */
+ ["\u962F", "\u962F"], /* CJK Ideograph */
+ ["\u9630", "\u9630"], /* CJK Ideograph */
+ ["\u9631", "\u9631"], /* CJK Ideograph */
+ ["\u9632", "\u9632"], /* CJK Ideograph */
+ ["\u9633", "\u9633"], /* CJK Ideograph */
+ ["\u9634", "\u9634"], /* CJK Ideograph */
+ ["\u9635", "\u9635"], /* CJK Ideograph */
+ ["\u9636", "\u9636"], /* CJK Ideograph */
+ ["\u9637", "\u9637"], /* CJK Ideograph */
+ ["\u9638", "\u9638"], /* CJK Ideograph */
+ ["\u9639", "\u9639"], /* CJK Ideograph */
+ ["\u963A", "\u963A"], /* CJK Ideograph */
+ ["\u963B", "\u963B"], /* CJK Ideograph */
+ ["\u963C", "\u963C"], /* CJK Ideograph */
+ ["\u963D", "\u963D"], /* CJK Ideograph */
+ ["\u963E", "\u963E"], /* CJK Ideograph */
+ ["\u963F", "\u963F"], /* CJK Ideograph */
+ ["\u9640", "\u9640"], /* CJK Ideograph */
+ ["\u9641", "\u9641"], /* CJK Ideograph */
+ ["\u9642", "\u9642"], /* CJK Ideograph */
+ ["\u9643", "\u9643"], /* CJK Ideograph */
+ ["\u9644", "\u9644"], /* CJK Ideograph */
+ ["\u9645", "\u9645"], /* CJK Ideograph */
+ ["\u9646", "\u9646"], /* CJK Ideograph */
+ ["\u9647", "\u9647"], /* CJK Ideograph */
+ ["\u9648", "\u9648"], /* CJK Ideograph */
+ ["\u9649", "\u9649"], /* CJK Ideograph */
+ ["\u964A", "\u964A"], /* CJK Ideograph */
+ ["\u964B", "\u964B"], /* CJK Ideograph */
+ ["\u964C", "\u964C"], /* CJK Ideograph */
+ ["\u964D", "\u964D"], /* CJK Ideograph */
+ ["\u964E", "\u964E"], /* CJK Ideograph */
+ ["\u964F", "\u964F"], /* CJK Ideograph */
+ ["\u9650", "\u9650"], /* CJK Ideograph */
+ ["\u9651", "\u9651"], /* CJK Ideograph */
+ ["\u9652", "\u9652"], /* CJK Ideograph */
+ ["\u9653", "\u9653"], /* CJK Ideograph */
+ ["\u9654", "\u9654"], /* CJK Ideograph */
+ ["\u9655", "\u9655"], /* CJK Ideograph */
+ ["\u9656", "\u9656"], /* CJK Ideograph */
+ ["\u9657", "\u9657"], /* CJK Ideograph */
+ ["\u9658", "\u9658"], /* CJK Ideograph */
+ ["\u9659", "\u9659"], /* CJK Ideograph */
+ ["\u965A", "\u965A"], /* CJK Ideograph */
+ ["\u965B", "\u965B"], /* CJK Ideograph */
+ ["\u965C", "\u965C"], /* CJK Ideograph */
+ ["\u965D", "\u965D"], /* CJK Ideograph */
+ ["\u965E", "\u965E"], /* CJK Ideograph */
+ ["\u965F", "\u965F"], /* CJK Ideograph */
+ ["\u9660", "\u9660"], /* CJK Ideograph */
+ ["\u9661", "\u9661"], /* CJK Ideograph */
+ ["\u9662", "\u9662"], /* CJK Ideograph */
+ ["\u9663", "\u9663"], /* CJK Ideograph */
+ ["\u9664", "\u9664"], /* CJK Ideograph */
+ ["\u9665", "\u9665"], /* CJK Ideograph */
+ ["\u9666", "\u9666"], /* CJK Ideograph */
+ ["\u9667", "\u9667"], /* CJK Ideograph */
+ ["\u9668", "\u9668"], /* CJK Ideograph */
+ ["\u9669", "\u9669"], /* CJK Ideograph */
+ ["\u966A", "\u966A"], /* CJK Ideograph */
+ ["\u966B", "\u966B"], /* CJK Ideograph */
+ ["\u966C", "\u966C"], /* CJK Ideograph */
+ ["\u966D", "\u966D"], /* CJK Ideograph */
+ ["\u966E", "\u966E"], /* CJK Ideograph */
+ ["\u966F", "\u966F"], /* CJK Ideograph */
+ ["\u9670", "\u9670"], /* CJK Ideograph */
+ ["\u9671", "\u9671"], /* CJK Ideograph */
+ ["\u9672", "\u9672"], /* CJK Ideograph */
+ ["\u9673", "\u9673"], /* CJK Ideograph */
+ ["\u9674", "\u9674"], /* CJK Ideograph */
+ ["\u9675", "\u9675"], /* CJK Ideograph */
+ ["\u9676", "\u9676"], /* CJK Ideograph */
+ ["\u9677", "\u9677"], /* CJK Ideograph */
+ ["\u9678", "\u9678"], /* CJK Ideograph */
+ ["\u9679", "\u9679"], /* CJK Ideograph */
+ ["\u967A", "\u967A"], /* CJK Ideograph */
+ ["\u967B", "\u967B"], /* CJK Ideograph */
+ ["\u967C", "\u967C"], /* CJK Ideograph */
+ ["\u967D", "\u967D"], /* CJK Ideograph */
+ ["\u967E", "\u967E"], /* CJK Ideograph */
+ ["\u967F", "\u967F"], /* CJK Ideograph */
+ ["\u9680", "\u9680"], /* CJK Ideograph */
+ ["\u9681", "\u9681"], /* CJK Ideograph */
+ ["\u9682", "\u9682"], /* CJK Ideograph */
+ ["\u9683", "\u9683"], /* CJK Ideograph */
+ ["\u9684", "\u9684"], /* CJK Ideograph */
+ ["\u9685", "\u9685"], /* CJK Ideograph */
+ ["\u9686", "\u9686"], /* CJK Ideograph */
+ ["\u9687", "\u9687"], /* CJK Ideograph */
+ ["\u9688", "\u9688"], /* CJK Ideograph */
+ ["\u9689", "\u9689"], /* CJK Ideograph */
+ ["\u968A", "\u968A"], /* CJK Ideograph */
+ ["\u968B", "\u968B"], /* CJK Ideograph */
+ ["\u968C", "\u968C"], /* CJK Ideograph */
+ ["\u968D", "\u968D"], /* CJK Ideograph */
+ ["\u968E", "\u968E"], /* CJK Ideograph */
+ ["\u968F", "\u968F"], /* CJK Ideograph */
+ ["\u9690", "\u9690"], /* CJK Ideograph */
+ ["\u9691", "\u9691"], /* CJK Ideograph */
+ ["\u9692", "\u9692"], /* CJK Ideograph */
+ ["\u9693", "\u9693"], /* CJK Ideograph */
+ ["\u9694", "\u9694"], /* CJK Ideograph */
+ ["\u9695", "\u9695"], /* CJK Ideograph */
+ ["\u9696", "\u9696"], /* CJK Ideograph */
+ ["\u9697", "\u9697"], /* CJK Ideograph */
+ ["\u9698", "\u9698"], /* CJK Ideograph */
+ ["\u9699", "\u9699"], /* CJK Ideograph */
+ ["\u969A", "\u969A"], /* CJK Ideograph */
+ ["\u969B", "\u969B"], /* CJK Ideograph */
+ ["\u969C", "\u969C"], /* CJK Ideograph */
+ ["\u969D", "\u969D"], /* CJK Ideograph */
+ ["\u969E", "\u969E"], /* CJK Ideograph */
+ ["\u969F", "\u969F"], /* CJK Ideograph */
+ ["\u96A0", "\u96A0"], /* CJK Ideograph */
+ ["\u96A1", "\u96A1"], /* CJK Ideograph */
+ ["\u96A2", "\u96A2"], /* CJK Ideograph */
+ ["\u96A3", "\u96A3"], /* CJK Ideograph */
+ ["\u96A4", "\u96A4"], /* CJK Ideograph */
+ ["\u96A5", "\u96A5"], /* CJK Ideograph */
+ ["\u96A6", "\u96A6"], /* CJK Ideograph */
+ ["\u96A7", "\u96A7"], /* CJK Ideograph */
+ ["\u96A8", "\u96A8"], /* CJK Ideograph */
+ ["\u96A9", "\u96A9"], /* CJK Ideograph */
+ ["\u96AA", "\u96AA"], /* CJK Ideograph */
+ ["\u96AB", "\u96AB"], /* CJK Ideograph */
+ ["\u96AC", "\u96AC"], /* CJK Ideograph */
+ ["\u96AD", "\u96AD"], /* CJK Ideograph */
+ ["\u96AE", "\u96AE"], /* CJK Ideograph */
+ ["\u96AF", "\u96AF"], /* CJK Ideograph */
+ ["\u96B0", "\u96B0"], /* CJK Ideograph */
+ ["\u96B1", "\u96B1"], /* CJK Ideograph */
+ ["\u96B2", "\u96B2"], /* CJK Ideograph */
+ ["\u96B3", "\u96B3"], /* CJK Ideograph */
+ ["\u96B4", "\u96B4"], /* CJK Ideograph */
+ ["\u96B5", "\u96B5"], /* CJK Ideograph */
+ ["\u96B6", "\u96B6"], /* CJK Ideograph */
+ ["\u96B7", "\u96B7"], /* CJK Ideograph */
+ ["\u96B8", "\u96B8"], /* CJK Ideograph */
+ ["\u96B9", "\u96B9"], /* CJK Ideograph */
+ ["\u96BA", "\u96BA"], /* CJK Ideograph */
+ ["\u96BB", "\u96BB"], /* CJK Ideograph */
+ ["\u96BC", "\u96BC"], /* CJK Ideograph */
+ ["\u96BD", "\u96BD"], /* CJK Ideograph */
+ ["\u96BE", "\u96BE"], /* CJK Ideograph */
+ ["\u96BF", "\u96BF"], /* CJK Ideograph */
+ ["\u96C0", "\u96C0"], /* CJK Ideograph */
+ ["\u96C1", "\u96C1"], /* CJK Ideograph */
+ ["\u96C2", "\u96C2"], /* CJK Ideograph */
+ ["\u96C3", "\u96C3"], /* CJK Ideograph */
+ ["\u96C4", "\u96C4"], /* CJK Ideograph */
+ ["\u96C5", "\u96C5"], /* CJK Ideograph */
+ ["\u96C6", "\u96C6"], /* CJK Ideograph */
+ ["\u96C7", "\u96C7"], /* CJK Ideograph */
+ ["\u96C8", "\u96C8"], /* CJK Ideograph */
+ ["\u96C9", "\u96C9"], /* CJK Ideograph */
+ ["\u96CA", "\u96CA"], /* CJK Ideograph */
+ ["\u96CB", "\u96CB"], /* CJK Ideograph */
+ ["\u96CC", "\u96CC"], /* CJK Ideograph */
+ ["\u96CD", "\u96CD"], /* CJK Ideograph */
+ ["\u96CE", "\u96CE"], /* CJK Ideograph */
+ ["\u96CF", "\u96CF"], /* CJK Ideograph */
+ ["\u96D0", "\u96D0"], /* CJK Ideograph */
+ ["\u96D1", "\u96D1"], /* CJK Ideograph */
+ ["\u96D2", "\u96D2"], /* CJK Ideograph */
+ ["\u96D3", "\u96D3"], /* CJK Ideograph */
+ ["\u96D4", "\u96D4"], /* CJK Ideograph */
+ ["\u96D5", "\u96D5"], /* CJK Ideograph */
+ ["\u96D6", "\u96D6"], /* CJK Ideograph */
+ ["\u96D7", "\u96D7"], /* CJK Ideograph */
+ ["\u96D8", "\u96D8"], /* CJK Ideograph */
+ ["\u96D9", "\u96D9"], /* CJK Ideograph */
+ ["\u96DA", "\u96DA"], /* CJK Ideograph */
+ ["\u96DB", "\u96DB"], /* CJK Ideograph */
+ ["\u96DC", "\u96DC"], /* CJK Ideograph */
+ ["\u96DD", "\u96DD"], /* CJK Ideograph */
+ ["\u96DE", "\u96DE"], /* CJK Ideograph */
+ ["\u96DF", "\u96DF"], /* CJK Ideograph */
+ ["\u96E0", "\u96E0"], /* CJK Ideograph */
+ ["\u96E1", "\u96E1"], /* CJK Ideograph */
+ ["\u96E2", "\u96E2"], /* CJK Ideograph */
+ ["\u96E3", "\u96E3"], /* CJK Ideograph */
+ ["\u96E4", "\u96E4"], /* CJK Ideograph */
+ ["\u96E5", "\u96E5"], /* CJK Ideograph */
+ ["\u96E6", "\u96E6"], /* CJK Ideograph */
+ ["\u96E7", "\u96E7"], /* CJK Ideograph */
+ ["\u96E8", "\u96E8"], /* CJK Ideograph */
+ ["\u96E9", "\u96E9"], /* CJK Ideograph */
+ ["\u96EA", "\u96EA"], /* CJK Ideograph */
+ ["\u96EB", "\u96EB"], /* CJK Ideograph */
+ ["\u96EC", "\u96EC"], /* CJK Ideograph */
+ ["\u96ED", "\u96ED"], /* CJK Ideograph */
+ ["\u96EE", "\u96EE"], /* CJK Ideograph */
+ ["\u96EF", "\u96EF"], /* CJK Ideograph */
+ ["\u96F0", "\u96F0"], /* CJK Ideograph */
+ ["\u96F1", "\u96F1"], /* CJK Ideograph */
+ ["\u96F2", "\u96F2"], /* CJK Ideograph */
+ ["\u96F3", "\u96F3"], /* CJK Ideograph */
+ ["\u96F4", "\u96F4"], /* CJK Ideograph */
+ ["\u96F5", "\u96F5"], /* CJK Ideograph */
+ ["\u96F6", "\u96F6"], /* CJK Ideograph */
+ ["\u96F7", "\u96F7"], /* CJK Ideograph */
+ ["\u96F8", "\u96F8"], /* CJK Ideograph */
+ ["\u96F9", "\u96F9"], /* CJK Ideograph */
+ ["\u96FA", "\u96FA"], /* CJK Ideograph */
+ ["\u96FB", "\u96FB"], /* CJK Ideograph */
+ ["\u96FC", "\u96FC"], /* CJK Ideograph */
+ ["\u96FD", "\u96FD"], /* CJK Ideograph */
+ ["\u96FE", "\u96FE"], /* CJK Ideograph */
+ ["\u96FF", "\u96FF"], /* CJK Ideograph */
+ ["\u9700", "\u9700"], /* CJK Ideograph */
+ ["\u9701", "\u9701"], /* CJK Ideograph */
+ ["\u9702", "\u9702"], /* CJK Ideograph */
+ ["\u9703", "\u9703"], /* CJK Ideograph */
+ ["\u9704", "\u9704"], /* CJK Ideograph */
+ ["\u9705", "\u9705"], /* CJK Ideograph */
+ ["\u9706", "\u9706"], /* CJK Ideograph */
+ ["\u9707", "\u9707"], /* CJK Ideograph */
+ ["\u9708", "\u9708"], /* CJK Ideograph */
+ ["\u9709", "\u9709"], /* CJK Ideograph */
+ ["\u970A", "\u970A"], /* CJK Ideograph */
+ ["\u970B", "\u970B"], /* CJK Ideograph */
+ ["\u970C", "\u970C"], /* CJK Ideograph */
+ ["\u970D", "\u970D"], /* CJK Ideograph */
+ ["\u970E", "\u970E"], /* CJK Ideograph */
+ ["\u970F", "\u970F"], /* CJK Ideograph */
+ ["\u9710", "\u9710"], /* CJK Ideograph */
+ ["\u9711", "\u9711"], /* CJK Ideograph */
+ ["\u9712", "\u9712"], /* CJK Ideograph */
+ ["\u9713", "\u9713"], /* CJK Ideograph */
+ ["\u9714", "\u9714"], /* CJK Ideograph */
+ ["\u9715", "\u9715"], /* CJK Ideograph */
+ ["\u9716", "\u9716"], /* CJK Ideograph */
+ ["\u9717", "\u9717"], /* CJK Ideograph */
+ ["\u9718", "\u9718"], /* CJK Ideograph */
+ ["\u9719", "\u9719"], /* CJK Ideograph */
+ ["\u971A", "\u971A"], /* CJK Ideograph */
+ ["\u971B", "\u971B"], /* CJK Ideograph */
+ ["\u971C", "\u971C"], /* CJK Ideograph */
+ ["\u971D", "\u971D"], /* CJK Ideograph */
+ ["\u971E", "\u971E"], /* CJK Ideograph */
+ ["\u971F", "\u971F"], /* CJK Ideograph */
+ ["\u9720", "\u9720"], /* CJK Ideograph */
+ ["\u9721", "\u9721"], /* CJK Ideograph */
+ ["\u9722", "\u9722"], /* CJK Ideograph */
+ ["\u9723", "\u9723"], /* CJK Ideograph */
+ ["\u9724", "\u9724"], /* CJK Ideograph */
+ ["\u9725", "\u9725"], /* CJK Ideograph */
+ ["\u9726", "\u9726"], /* CJK Ideograph */
+ ["\u9727", "\u9727"], /* CJK Ideograph */
+ ["\u9728", "\u9728"], /* CJK Ideograph */
+ ["\u9729", "\u9729"], /* CJK Ideograph */
+ ["\u972A", "\u972A"], /* CJK Ideograph */
+ ["\u972B", "\u972B"], /* CJK Ideograph */
+ ["\u972C", "\u972C"], /* CJK Ideograph */
+ ["\u972D", "\u972D"], /* CJK Ideograph */
+ ["\u972E", "\u972E"], /* CJK Ideograph */
+ ["\u972F", "\u972F"], /* CJK Ideograph */
+ ["\u9730", "\u9730"], /* CJK Ideograph */
+ ["\u9731", "\u9731"], /* CJK Ideograph */
+ ["\u9732", "\u9732"], /* CJK Ideograph */
+ ["\u9733", "\u9733"], /* CJK Ideograph */
+ ["\u9734", "\u9734"], /* CJK Ideograph */
+ ["\u9735", "\u9735"], /* CJK Ideograph */
+ ["\u9736", "\u9736"], /* CJK Ideograph */
+ ["\u9737", "\u9737"], /* CJK Ideograph */
+ ["\u9738", "\u9738"], /* CJK Ideograph */
+ ["\u9739", "\u9739"], /* CJK Ideograph */
+ ["\u973A", "\u973A"], /* CJK Ideograph */
+ ["\u973B", "\u973B"], /* CJK Ideograph */
+ ["\u973C", "\u973C"], /* CJK Ideograph */
+ ["\u973D", "\u973D"], /* CJK Ideograph */
+ ["\u973E", "\u973E"], /* CJK Ideograph */
+ ["\u973F", "\u973F"], /* CJK Ideograph */
+ ["\u9740", "\u9740"], /* CJK Ideograph */
+ ["\u9741", "\u9741"], /* CJK Ideograph */
+ ["\u9742", "\u9742"], /* CJK Ideograph */
+ ["\u9743", "\u9743"], /* CJK Ideograph */
+ ["\u9744", "\u9744"], /* CJK Ideograph */
+ ["\u9745", "\u9745"], /* CJK Ideograph */
+ ["\u9746", "\u9746"], /* CJK Ideograph */
+ ["\u9747", "\u9747"], /* CJK Ideograph */
+ ["\u9748", "\u9748"], /* CJK Ideograph */
+ ["\u9749", "\u9749"], /* CJK Ideograph */
+ ["\u974A", "\u974A"], /* CJK Ideograph */
+ ["\u974B", "\u974B"], /* CJK Ideograph */
+ ["\u974C", "\u974C"], /* CJK Ideograph */
+ ["\u974D", "\u974D"], /* CJK Ideograph */
+ ["\u974E", "\u974E"], /* CJK Ideograph */
+ ["\u974F", "\u974F"], /* CJK Ideograph */
+ ["\u9750", "\u9750"], /* CJK Ideograph */
+ ["\u9751", "\u9751"], /* CJK Ideograph */
+ ["\u9752", "\u9752"], /* CJK Ideograph */
+ ["\u9753", "\u9753"], /* CJK Ideograph */
+ ["\u9754", "\u9754"], /* CJK Ideograph */
+ ["\u9755", "\u9755"], /* CJK Ideograph */
+ ["\u9756", "\u9756"], /* CJK Ideograph */
+ ["\u9757", "\u9757"], /* CJK Ideograph */
+ ["\u9758", "\u9758"], /* CJK Ideograph */
+ ["\u9759", "\u9759"], /* CJK Ideograph */
+ ["\u975A", "\u975A"], /* CJK Ideograph */
+ ["\u975B", "\u975B"], /* CJK Ideograph */
+ ["\u975C", "\u975C"], /* CJK Ideograph */
+ ["\u975D", "\u975D"], /* CJK Ideograph */
+ ["\u975E", "\u975E"], /* CJK Ideograph */
+ ["\u975F", "\u975F"], /* CJK Ideograph */
+ ["\u9760", "\u9760"], /* CJK Ideograph */
+ ["\u9761", "\u9761"], /* CJK Ideograph */
+ ["\u9762", "\u9762"], /* CJK Ideograph */
+ ["\u9763", "\u9763"], /* CJK Ideograph */
+ ["\u9764", "\u9764"], /* CJK Ideograph */
+ ["\u9765", "\u9765"], /* CJK Ideograph */
+ ["\u9766", "\u9766"], /* CJK Ideograph */
+ ["\u9767", "\u9767"], /* CJK Ideograph */
+ ["\u9768", "\u9768"], /* CJK Ideograph */
+ ["\u9769", "\u9769"], /* CJK Ideograph */
+ ["\u976A", "\u976A"], /* CJK Ideograph */
+ ["\u976B", "\u976B"], /* CJK Ideograph */
+ ["\u976C", "\u976C"], /* CJK Ideograph */
+ ["\u976D", "\u976D"], /* CJK Ideograph */
+ ["\u976E", "\u976E"], /* CJK Ideograph */
+ ["\u976F", "\u976F"], /* CJK Ideograph */
+ ["\u9770", "\u9770"], /* CJK Ideograph */
+ ["\u9771", "\u9771"], /* CJK Ideograph */
+ ["\u9772", "\u9772"], /* CJK Ideograph */
+ ["\u9773", "\u9773"], /* CJK Ideograph */
+ ["\u9774", "\u9774"], /* CJK Ideograph */
+ ["\u9775", "\u9775"], /* CJK Ideograph */
+ ["\u9776", "\u9776"], /* CJK Ideograph */
+ ["\u9777", "\u9777"], /* CJK Ideograph */
+ ["\u9778", "\u9778"], /* CJK Ideograph */
+ ["\u9779", "\u9779"], /* CJK Ideograph */
+ ["\u977A", "\u977A"], /* CJK Ideograph */
+ ["\u977B", "\u977B"], /* CJK Ideograph */
+ ["\u977C", "\u977C"], /* CJK Ideograph */
+ ["\u977D", "\u977D"], /* CJK Ideograph */
+ ["\u977E", "\u977E"], /* CJK Ideograph */
+ ["\u977F", "\u977F"], /* CJK Ideograph */
+ ["\u9780", "\u9780"], /* CJK Ideograph */
+ ["\u9781", "\u9781"], /* CJK Ideograph */
+ ["\u9782", "\u9782"], /* CJK Ideograph */
+ ["\u9783", "\u9783"], /* CJK Ideograph */
+ ["\u9784", "\u9784"], /* CJK Ideograph */
+ ["\u9785", "\u9785"], /* CJK Ideograph */
+ ["\u9786", "\u9786"], /* CJK Ideograph */
+ ["\u9787", "\u9787"], /* CJK Ideograph */
+ ["\u9788", "\u9788"], /* CJK Ideograph */
+ ["\u9789", "\u9789"], /* CJK Ideograph */
+ ["\u978A", "\u978A"], /* CJK Ideograph */
+ ["\u978B", "\u978B"], /* CJK Ideograph */
+ ["\u978C", "\u978C"], /* CJK Ideograph */
+ ["\u978D", "\u978D"], /* CJK Ideograph */
+ ["\u978E", "\u978E"], /* CJK Ideograph */
+ ["\u978F", "\u978F"], /* CJK Ideograph */
+ ["\u9790", "\u9790"], /* CJK Ideograph */
+ ["\u9791", "\u9791"], /* CJK Ideograph */
+ ["\u9792", "\u9792"], /* CJK Ideograph */
+ ["\u9793", "\u9793"], /* CJK Ideograph */
+ ["\u9794", "\u9794"], /* CJK Ideograph */
+ ["\u9795", "\u9795"], /* CJK Ideograph */
+ ["\u9796", "\u9796"], /* CJK Ideograph */
+ ["\u9797", "\u9797"], /* CJK Ideograph */
+ ["\u9798", "\u9798"], /* CJK Ideograph */
+ ["\u9799", "\u9799"], /* CJK Ideograph */
+ ["\u979A", "\u979A"], /* CJK Ideograph */
+ ["\u979B", "\u979B"], /* CJK Ideograph */
+ ["\u979C", "\u979C"], /* CJK Ideograph */
+ ["\u979D", "\u979D"], /* CJK Ideograph */
+ ["\u979E", "\u979E"], /* CJK Ideograph */
+ ["\u979F", "\u979F"], /* CJK Ideograph */
+ ["\u97A0", "\u97A0"], /* CJK Ideograph */
+ ["\u97A1", "\u97A1"], /* CJK Ideograph */
+ ["\u97A2", "\u97A2"], /* CJK Ideograph */
+ ["\u97A3", "\u97A3"], /* CJK Ideograph */
+ ["\u97A4", "\u97A4"], /* CJK Ideograph */
+ ["\u97A5", "\u97A5"], /* CJK Ideograph */
+ ["\u97A6", "\u97A6"], /* CJK Ideograph */
+ ["\u97A7", "\u97A7"], /* CJK Ideograph */
+ ["\u97A8", "\u97A8"], /* CJK Ideograph */
+ ["\u97A9", "\u97A9"], /* CJK Ideograph */
+ ["\u97AA", "\u97AA"], /* CJK Ideograph */
+ ["\u97AB", "\u97AB"], /* CJK Ideograph */
+ ["\u97AC", "\u97AC"], /* CJK Ideograph */
+ ["\u97AD", "\u97AD"], /* CJK Ideograph */
+ ["\u97AE", "\u97AE"], /* CJK Ideograph */
+ ["\u97AF", "\u97AF"], /* CJK Ideograph */
+ ["\u97B0", "\u97B0"], /* CJK Ideograph */
+ ["\u97B1", "\u97B1"], /* CJK Ideograph */
+ ["\u97B2", "\u97B2"], /* CJK Ideograph */
+ ["\u97B3", "\u97B3"], /* CJK Ideograph */
+ ["\u97B4", "\u97B4"], /* CJK Ideograph */
+ ["\u97B5", "\u97B5"], /* CJK Ideograph */
+ ["\u97B6", "\u97B6"], /* CJK Ideograph */
+ ["\u97B7", "\u97B7"], /* CJK Ideograph */
+ ["\u97B8", "\u97B8"], /* CJK Ideograph */
+ ["\u97B9", "\u97B9"], /* CJK Ideograph */
+ ["\u97BA", "\u97BA"], /* CJK Ideograph */
+ ["\u97BB", "\u97BB"], /* CJK Ideograph */
+ ["\u97BC", "\u97BC"], /* CJK Ideograph */
+ ["\u97BD", "\u97BD"], /* CJK Ideograph */
+ ["\u97BE", "\u97BE"], /* CJK Ideograph */
+ ["\u97BF", "\u97BF"], /* CJK Ideograph */
+ ["\u97C0", "\u97C0"], /* CJK Ideograph */
+ ["\u97C1", "\u97C1"], /* CJK Ideograph */
+ ["\u97C2", "\u97C2"], /* CJK Ideograph */
+ ["\u97C3", "\u97C3"], /* CJK Ideograph */
+ ["\u97C4", "\u97C4"], /* CJK Ideograph */
+ ["\u97C5", "\u97C5"], /* CJK Ideograph */
+ ["\u97C6", "\u97C6"], /* CJK Ideograph */
+ ["\u97C7", "\u97C7"], /* CJK Ideograph */
+ ["\u97C8", "\u97C8"], /* CJK Ideograph */
+ ["\u97C9", "\u97C9"], /* CJK Ideograph */
+ ["\u97CA", "\u97CA"], /* CJK Ideograph */
+ ["\u97CB", "\u97CB"], /* CJK Ideograph */
+ ["\u97CC", "\u97CC"], /* CJK Ideograph */
+ ["\u97CD", "\u97CD"], /* CJK Ideograph */
+ ["\u97CE", "\u97CE"], /* CJK Ideograph */
+ ["\u97CF", "\u97CF"], /* CJK Ideograph */
+ ["\u97D0", "\u97D0"], /* CJK Ideograph */
+ ["\u97D1", "\u97D1"], /* CJK Ideograph */
+ ["\u97D2", "\u97D2"], /* CJK Ideograph */
+ ["\u97D3", "\u97D3"], /* CJK Ideograph */
+ ["\u97D4", "\u97D4"], /* CJK Ideograph */
+ ["\u97D5", "\u97D5"], /* CJK Ideograph */
+ ["\u97D6", "\u97D6"], /* CJK Ideograph */
+ ["\u97D7", "\u97D7"], /* CJK Ideograph */
+ ["\u97D8", "\u97D8"], /* CJK Ideograph */
+ ["\u97D9", "\u97D9"], /* CJK Ideograph */
+ ["\u97DA", "\u97DA"], /* CJK Ideograph */
+ ["\u97DB", "\u97DB"], /* CJK Ideograph */
+ ["\u97DC", "\u97DC"], /* CJK Ideograph */
+ ["\u97DD", "\u97DD"], /* CJK Ideograph */
+ ["\u97DE", "\u97DE"], /* CJK Ideograph */
+ ["\u97DF", "\u97DF"], /* CJK Ideograph */
+ ["\u97E0", "\u97E0"], /* CJK Ideograph */
+ ["\u97E1", "\u97E1"], /* CJK Ideograph */
+ ["\u97E2", "\u97E2"], /* CJK Ideograph */
+ ["\u97E3", "\u97E3"], /* CJK Ideograph */
+ ["\u97E4", "\u97E4"], /* CJK Ideograph */
+ ["\u97E5", "\u97E5"], /* CJK Ideograph */
+ ["\u97E6", "\u97E6"], /* CJK Ideograph */
+ ["\u97E7", "\u97E7"], /* CJK Ideograph */
+ ["\u97E8", "\u97E8"], /* CJK Ideograph */
+ ["\u97E9", "\u97E9"], /* CJK Ideograph */
+ ["\u97EA", "\u97EA"], /* CJK Ideograph */
+ ["\u97EB", "\u97EB"], /* CJK Ideograph */
+ ["\u97EC", "\u97EC"], /* CJK Ideograph */
+ ["\u97ED", "\u97ED"], /* CJK Ideograph */
+ ["\u97EE", "\u97EE"], /* CJK Ideograph */
+ ["\u97EF", "\u97EF"], /* CJK Ideograph */
+ ["\u97F0", "\u97F0"], /* CJK Ideograph */
+ ["\u97F1", "\u97F1"], /* CJK Ideograph */
+ ["\u97F2", "\u97F2"], /* CJK Ideograph */
+ ["\u97F3", "\u97F3"], /* CJK Ideograph */
+ ["\u97F4", "\u97F4"], /* CJK Ideograph */
+ ["\u97F5", "\u97F5"], /* CJK Ideograph */
+ ["\u97F6", "\u97F6"], /* CJK Ideograph */
+ ["\u97F7", "\u97F7"], /* CJK Ideograph */
+ ["\u97F8", "\u97F8"], /* CJK Ideograph */
+ ["\u97F9", "\u97F9"], /* CJK Ideograph */
+ ["\u97FA", "\u97FA"], /* CJK Ideograph */
+ ["\u97FB", "\u97FB"], /* CJK Ideograph */
+ ["\u97FC", "\u97FC"], /* CJK Ideograph */
+ ["\u97FD", "\u97FD"], /* CJK Ideograph */
+ ["\u97FE", "\u97FE"], /* CJK Ideograph */
+ ["\u97FF", "\u97FF"], /* CJK Ideograph */
+ ["\u9800", "\u9800"], /* CJK Ideograph */
+ ["\u9801", "\u9801"], /* CJK Ideograph */
+ ["\u9802", "\u9802"], /* CJK Ideograph */
+ ["\u9803", "\u9803"], /* CJK Ideograph */
+ ["\u9804", "\u9804"], /* CJK Ideograph */
+ ["\u9805", "\u9805"], /* CJK Ideograph */
+ ["\u9806", "\u9806"], /* CJK Ideograph */
+ ["\u9807", "\u9807"], /* CJK Ideograph */
+ ["\u9808", "\u9808"], /* CJK Ideograph */
+ ["\u9809", "\u9809"], /* CJK Ideograph */
+ ["\u980A", "\u980A"], /* CJK Ideograph */
+ ["\u980B", "\u980B"], /* CJK Ideograph */
+ ["\u980C", "\u980C"], /* CJK Ideograph */
+ ["\u980D", "\u980D"], /* CJK Ideograph */
+ ["\u980E", "\u980E"], /* CJK Ideograph */
+ ["\u980F", "\u980F"], /* CJK Ideograph */
+ ["\u9810", "\u9810"], /* CJK Ideograph */
+ ["\u9811", "\u9811"], /* CJK Ideograph */
+ ["\u9812", "\u9812"], /* CJK Ideograph */
+ ["\u9813", "\u9813"], /* CJK Ideograph */
+ ["\u9814", "\u9814"], /* CJK Ideograph */
+ ["\u9815", "\u9815"], /* CJK Ideograph */
+ ["\u9816", "\u9816"], /* CJK Ideograph */
+ ["\u9817", "\u9817"], /* CJK Ideograph */
+ ["\u9818", "\u9818"], /* CJK Ideograph */
+ ["\u9819", "\u9819"], /* CJK Ideograph */
+ ["\u981A", "\u981A"], /* CJK Ideograph */
+ ["\u981B", "\u981B"], /* CJK Ideograph */
+ ["\u981C", "\u981C"], /* CJK Ideograph */
+ ["\u981D", "\u981D"], /* CJK Ideograph */
+ ["\u981E", "\u981E"], /* CJK Ideograph */
+ ["\u981F", "\u981F"], /* CJK Ideograph */
+ ["\u9820", "\u9820"], /* CJK Ideograph */
+ ["\u9821", "\u9821"], /* CJK Ideograph */
+ ["\u9822", "\u9822"], /* CJK Ideograph */
+ ["\u9823", "\u9823"], /* CJK Ideograph */
+ ["\u9824", "\u9824"], /* CJK Ideograph */
+ ["\u9825", "\u9825"], /* CJK Ideograph */
+ ["\u9826", "\u9826"], /* CJK Ideograph */
+ ["\u9827", "\u9827"], /* CJK Ideograph */
+ ["\u9828", "\u9828"], /* CJK Ideograph */
+ ["\u9829", "\u9829"], /* CJK Ideograph */
+ ["\u982A", "\u982A"], /* CJK Ideograph */
+ ["\u982B", "\u982B"], /* CJK Ideograph */
+ ["\u982C", "\u982C"], /* CJK Ideograph */
+ ["\u982D", "\u982D"], /* CJK Ideograph */
+ ["\u982E", "\u982E"], /* CJK Ideograph */
+ ["\u982F", "\u982F"], /* CJK Ideograph */
+ ["\u9830", "\u9830"], /* CJK Ideograph */
+ ["\u9831", "\u9831"], /* CJK Ideograph */
+ ["\u9832", "\u9832"], /* CJK Ideograph */
+ ["\u9833", "\u9833"], /* CJK Ideograph */
+ ["\u9834", "\u9834"], /* CJK Ideograph */
+ ["\u9835", "\u9835"], /* CJK Ideograph */
+ ["\u9836", "\u9836"], /* CJK Ideograph */
+ ["\u9837", "\u9837"], /* CJK Ideograph */
+ ["\u9838", "\u9838"], /* CJK Ideograph */
+ ["\u9839", "\u9839"], /* CJK Ideograph */
+ ["\u983A", "\u983A"], /* CJK Ideograph */
+ ["\u983B", "\u983B"], /* CJK Ideograph */
+ ["\u983C", "\u983C"], /* CJK Ideograph */
+ ["\u983D", "\u983D"], /* CJK Ideograph */
+ ["\u983E", "\u983E"], /* CJK Ideograph */
+ ["\u983F", "\u983F"], /* CJK Ideograph */
+ ["\u9840", "\u9840"], /* CJK Ideograph */
+ ["\u9841", "\u9841"], /* CJK Ideograph */
+ ["\u9842", "\u9842"], /* CJK Ideograph */
+ ["\u9843", "\u9843"], /* CJK Ideograph */
+ ["\u9844", "\u9844"], /* CJK Ideograph */
+ ["\u9845", "\u9845"], /* CJK Ideograph */
+ ["\u9846", "\u9846"], /* CJK Ideograph */
+ ["\u9847", "\u9847"], /* CJK Ideograph */
+ ["\u9848", "\u9848"], /* CJK Ideograph */
+ ["\u9849", "\u9849"], /* CJK Ideograph */
+ ["\u984A", "\u984A"], /* CJK Ideograph */
+ ["\u984B", "\u984B"], /* CJK Ideograph */
+ ["\u984C", "\u984C"], /* CJK Ideograph */
+ ["\u984D", "\u984D"], /* CJK Ideograph */
+ ["\u984E", "\u984E"], /* CJK Ideograph */
+ ["\u984F", "\u984F"], /* CJK Ideograph */
+ ["\u9850", "\u9850"], /* CJK Ideograph */
+ ["\u9851", "\u9851"], /* CJK Ideograph */
+ ["\u9852", "\u9852"], /* CJK Ideograph */
+ ["\u9853", "\u9853"], /* CJK Ideograph */
+ ["\u9854", "\u9854"], /* CJK Ideograph */
+ ["\u9855", "\u9855"], /* CJK Ideograph */
+ ["\u9856", "\u9856"], /* CJK Ideograph */
+ ["\u9857", "\u9857"], /* CJK Ideograph */
+ ["\u9858", "\u9858"], /* CJK Ideograph */
+ ["\u9859", "\u9859"], /* CJK Ideograph */
+ ["\u985A", "\u985A"], /* CJK Ideograph */
+ ["\u985B", "\u985B"], /* CJK Ideograph */
+ ["\u985C", "\u985C"], /* CJK Ideograph */
+ ["\u985D", "\u985D"], /* CJK Ideograph */
+ ["\u985E", "\u985E"], /* CJK Ideograph */
+ ["\u985F", "\u985F"], /* CJK Ideograph */
+ ["\u9860", "\u9860"], /* CJK Ideograph */
+ ["\u9861", "\u9861"], /* CJK Ideograph */
+ ["\u9862", "\u9862"], /* CJK Ideograph */
+ ["\u9863", "\u9863"], /* CJK Ideograph */
+ ["\u9864", "\u9864"], /* CJK Ideograph */
+ ["\u9865", "\u9865"], /* CJK Ideograph */
+ ["\u9866", "\u9866"], /* CJK Ideograph */
+ ["\u9867", "\u9867"], /* CJK Ideograph */
+ ["\u9868", "\u9868"], /* CJK Ideograph */
+ ["\u9869", "\u9869"], /* CJK Ideograph */
+ ["\u986A", "\u986A"], /* CJK Ideograph */
+ ["\u986B", "\u986B"], /* CJK Ideograph */
+ ["\u986C", "\u986C"], /* CJK Ideograph */
+ ["\u986D", "\u986D"], /* CJK Ideograph */
+ ["\u986E", "\u986E"], /* CJK Ideograph */
+ ["\u986F", "\u986F"], /* CJK Ideograph */
+ ["\u9870", "\u9870"], /* CJK Ideograph */
+ ["\u9871", "\u9871"], /* CJK Ideograph */
+ ["\u9872", "\u9872"], /* CJK Ideograph */
+ ["\u9873", "\u9873"], /* CJK Ideograph */
+ ["\u9874", "\u9874"], /* CJK Ideograph */
+ ["\u9875", "\u9875"], /* CJK Ideograph */
+ ["\u9876", "\u9876"], /* CJK Ideograph */
+ ["\u9877", "\u9877"], /* CJK Ideograph */
+ ["\u9878", "\u9878"], /* CJK Ideograph */
+ ["\u9879", "\u9879"], /* CJK Ideograph */
+ ["\u987A", "\u987A"], /* CJK Ideograph */
+ ["\u987B", "\u987B"], /* CJK Ideograph */
+ ["\u987C", "\u987C"], /* CJK Ideograph */
+ ["\u987D", "\u987D"], /* CJK Ideograph */
+ ["\u987E", "\u987E"], /* CJK Ideograph */
+ ["\u987F", "\u987F"], /* CJK Ideograph */
+ ["\u9880", "\u9880"], /* CJK Ideograph */
+ ["\u9881", "\u9881"], /* CJK Ideograph */
+ ["\u9882", "\u9882"], /* CJK Ideograph */
+ ["\u9883", "\u9883"], /* CJK Ideograph */
+ ["\u9884", "\u9884"], /* CJK Ideograph */
+ ["\u9885", "\u9885"], /* CJK Ideograph */
+ ["\u9886", "\u9886"], /* CJK Ideograph */
+ ["\u9887", "\u9887"], /* CJK Ideograph */
+ ["\u9888", "\u9888"], /* CJK Ideograph */
+ ["\u9889", "\u9889"], /* CJK Ideograph */
+ ["\u988A", "\u988A"], /* CJK Ideograph */
+ ["\u988B", "\u988B"], /* CJK Ideograph */
+ ["\u988C", "\u988C"], /* CJK Ideograph */
+ ["\u988D", "\u988D"], /* CJK Ideograph */
+ ["\u988E", "\u988E"], /* CJK Ideograph */
+ ["\u988F", "\u988F"], /* CJK Ideograph */
+ ["\u9890", "\u9890"], /* CJK Ideograph */
+ ["\u9891", "\u9891"], /* CJK Ideograph */
+ ["\u9892", "\u9892"], /* CJK Ideograph */
+ ["\u9893", "\u9893"], /* CJK Ideograph */
+ ["\u9894", "\u9894"], /* CJK Ideograph */
+ ["\u9895", "\u9895"], /* CJK Ideograph */
+ ["\u9896", "\u9896"], /* CJK Ideograph */
+ ["\u9897", "\u9897"], /* CJK Ideograph */
+ ["\u9898", "\u9898"], /* CJK Ideograph */
+ ["\u9899", "\u9899"], /* CJK Ideograph */
+ ["\u989A", "\u989A"], /* CJK Ideograph */
+ ["\u989B", "\u989B"], /* CJK Ideograph */
+ ["\u989C", "\u989C"], /* CJK Ideograph */
+ ["\u989D", "\u989D"], /* CJK Ideograph */
+ ["\u989E", "\u989E"], /* CJK Ideograph */
+ ["\u989F", "\u989F"], /* CJK Ideograph */
+ ["\u98A0", "\u98A0"], /* CJK Ideograph */
+ ["\u98A1", "\u98A1"], /* CJK Ideograph */
+ ["\u98A2", "\u98A2"], /* CJK Ideograph */
+ ["\u98A3", "\u98A3"], /* CJK Ideograph */
+ ["\u98A4", "\u98A4"], /* CJK Ideograph */
+ ["\u98A5", "\u98A5"], /* CJK Ideograph */
+ ["\u98A6", "\u98A6"], /* CJK Ideograph */
+ ["\u98A7", "\u98A7"], /* CJK Ideograph */
+ ["\u98A8", "\u98A8"], /* CJK Ideograph */
+ ["\u98A9", "\u98A9"], /* CJK Ideograph */
+ ["\u98AA", "\u98AA"], /* CJK Ideograph */
+ ["\u98AB", "\u98AB"], /* CJK Ideograph */
+ ["\u98AC", "\u98AC"], /* CJK Ideograph */
+ ["\u98AD", "\u98AD"], /* CJK Ideograph */
+ ["\u98AE", "\u98AE"], /* CJK Ideograph */
+ ["\u98AF", "\u98AF"], /* CJK Ideograph */
+ ["\u98B0", "\u98B0"], /* CJK Ideograph */
+ ["\u98B1", "\u98B1"], /* CJK Ideograph */
+ ["\u98B2", "\u98B2"], /* CJK Ideograph */
+ ["\u98B3", "\u98B3"], /* CJK Ideograph */
+ ["\u98B4", "\u98B4"], /* CJK Ideograph */
+ ["\u98B5", "\u98B5"], /* CJK Ideograph */
+ ["\u98B6", "\u98B6"], /* CJK Ideograph */
+ ["\u98B7", "\u98B7"], /* CJK Ideograph */
+ ["\u98B8", "\u98B8"], /* CJK Ideograph */
+ ["\u98B9", "\u98B9"], /* CJK Ideograph */
+ ["\u98BA", "\u98BA"], /* CJK Ideograph */
+ ["\u98BB", "\u98BB"], /* CJK Ideograph */
+ ["\u98BC", "\u98BC"], /* CJK Ideograph */
+ ["\u98BD", "\u98BD"], /* CJK Ideograph */
+ ["\u98BE", "\u98BE"], /* CJK Ideograph */
+ ["\u98BF", "\u98BF"], /* CJK Ideograph */
+ ["\u98C0", "\u98C0"], /* CJK Ideograph */
+ ["\u98C1", "\u98C1"], /* CJK Ideograph */
+ ["\u98C2", "\u98C2"], /* CJK Ideograph */
+ ["\u98C3", "\u98C3"], /* CJK Ideograph */
+ ["\u98C4", "\u98C4"], /* CJK Ideograph */
+ ["\u98C5", "\u98C5"], /* CJK Ideograph */
+ ["\u98C6", "\u98C6"], /* CJK Ideograph */
+ ["\u98C7", "\u98C7"], /* CJK Ideograph */
+ ["\u98C8", "\u98C8"], /* CJK Ideograph */
+ ["\u98C9", "\u98C9"], /* CJK Ideograph */
+ ["\u98CA", "\u98CA"], /* CJK Ideograph */
+ ["\u98CB", "\u98CB"], /* CJK Ideograph */
+ ["\u98CC", "\u98CC"], /* CJK Ideograph */
+ ["\u98CD", "\u98CD"], /* CJK Ideograph */
+ ["\u98CE", "\u98CE"], /* CJK Ideograph */
+ ["\u98CF", "\u98CF"], /* CJK Ideograph */
+ ["\u98D0", "\u98D0"], /* CJK Ideograph */
+ ["\u98D1", "\u98D1"], /* CJK Ideograph */
+ ["\u98D2", "\u98D2"], /* CJK Ideograph */
+ ["\u98D3", "\u98D3"], /* CJK Ideograph */
+ ["\u98D4", "\u98D4"], /* CJK Ideograph */
+ ["\u98D5", "\u98D5"], /* CJK Ideograph */
+ ["\u98D6", "\u98D6"], /* CJK Ideograph */
+ ["\u98D7", "\u98D7"], /* CJK Ideograph */
+ ["\u98D8", "\u98D8"], /* CJK Ideograph */
+ ["\u98D9", "\u98D9"], /* CJK Ideograph */
+ ["\u98DA", "\u98DA"], /* CJK Ideograph */
+ ["\u98DB", "\u98DB"], /* CJK Ideograph */
+ ["\u98DC", "\u98DC"], /* CJK Ideograph */
+ ["\u98DD", "\u98DD"], /* CJK Ideograph */
+ ["\u98DE", "\u98DE"], /* CJK Ideograph */
+ ["\u98DF", "\u98DF"], /* CJK Ideograph */
+ ["\u98E0", "\u98E0"], /* CJK Ideograph */
+ ["\u98E1", "\u98E1"], /* CJK Ideograph */
+ ["\u98E2", "\u98E2"], /* CJK Ideograph */
+ ["\u98E3", "\u98E3"], /* CJK Ideograph */
+ ["\u98E4", "\u98E4"], /* CJK Ideograph */
+ ["\u98E5", "\u98E5"], /* CJK Ideograph */
+ ["\u98E6", "\u98E6"], /* CJK Ideograph */
+ ["\u98E7", "\u98E7"], /* CJK Ideograph */
+ ["\u98E8", "\u98E8"], /* CJK Ideograph */
+ ["\u98E9", "\u98E9"], /* CJK Ideograph */
+ ["\u98EA", "\u98EA"], /* CJK Ideograph */
+ ["\u98EB", "\u98EB"], /* CJK Ideograph */
+ ["\u98EC", "\u98EC"], /* CJK Ideograph */
+ ["\u98ED", "\u98ED"], /* CJK Ideograph */
+ ["\u98EE", "\u98EE"], /* CJK Ideograph */
+ ["\u98EF", "\u98EF"], /* CJK Ideograph */
+ ["\u98F0", "\u98F0"], /* CJK Ideograph */
+ ["\u98F1", "\u98F1"], /* CJK Ideograph */
+ ["\u98F2", "\u98F2"], /* CJK Ideograph */
+ ["\u98F3", "\u98F3"], /* CJK Ideograph */
+ ["\u98F4", "\u98F4"], /* CJK Ideograph */
+ ["\u98F5", "\u98F5"], /* CJK Ideograph */
+ ["\u98F6", "\u98F6"], /* CJK Ideograph */
+ ["\u98F7", "\u98F7"], /* CJK Ideograph */
+ ["\u98F8", "\u98F8"], /* CJK Ideograph */
+ ["\u98F9", "\u98F9"], /* CJK Ideograph */
+ ["\u98FA", "\u98FA"], /* CJK Ideograph */
+ ["\u98FB", "\u98FB"], /* CJK Ideograph */
+ ["\u98FC", "\u98FC"], /* CJK Ideograph */
+ ["\u98FD", "\u98FD"], /* CJK Ideograph */
+ ["\u98FE", "\u98FE"], /* CJK Ideograph */
+ ["\u98FF", "\u98FF"], /* CJK Ideograph */
+ ["\u9900", "\u9900"], /* CJK Ideograph */
+ ["\u9901", "\u9901"], /* CJK Ideograph */
+ ["\u9902", "\u9902"], /* CJK Ideograph */
+ ["\u9903", "\u9903"], /* CJK Ideograph */
+ ["\u9904", "\u9904"], /* CJK Ideograph */
+ ["\u9905", "\u9905"], /* CJK Ideograph */
+ ["\u9906", "\u9906"], /* CJK Ideograph */
+ ["\u9907", "\u9907"], /* CJK Ideograph */
+ ["\u9908", "\u9908"], /* CJK Ideograph */
+ ["\u9909", "\u9909"], /* CJK Ideograph */
+ ["\u990A", "\u990A"], /* CJK Ideograph */
+ ["\u990B", "\u990B"], /* CJK Ideograph */
+ ["\u990C", "\u990C"], /* CJK Ideograph */
+ ["\u990D", "\u990D"], /* CJK Ideograph */
+ ["\u990E", "\u990E"], /* CJK Ideograph */
+ ["\u990F", "\u990F"], /* CJK Ideograph */
+ ["\u9910", "\u9910"], /* CJK Ideograph */
+ ["\u9911", "\u9911"], /* CJK Ideograph */
+ ["\u9912", "\u9912"], /* CJK Ideograph */
+ ["\u9913", "\u9913"], /* CJK Ideograph */
+ ["\u9914", "\u9914"], /* CJK Ideograph */
+ ["\u9915", "\u9915"], /* CJK Ideograph */
+ ["\u9916", "\u9916"], /* CJK Ideograph */
+ ["\u9917", "\u9917"], /* CJK Ideograph */
+ ["\u9918", "\u9918"], /* CJK Ideograph */
+ ["\u9919", "\u9919"], /* CJK Ideograph */
+ ["\u991A", "\u991A"], /* CJK Ideograph */
+ ["\u991B", "\u991B"], /* CJK Ideograph */
+ ["\u991C", "\u991C"], /* CJK Ideograph */
+ ["\u991D", "\u991D"], /* CJK Ideograph */
+ ["\u991E", "\u991E"], /* CJK Ideograph */
+ ["\u991F", "\u991F"], /* CJK Ideograph */
+ ["\u9920", "\u9920"], /* CJK Ideograph */
+ ["\u9921", "\u9921"], /* CJK Ideograph */
+ ["\u9922", "\u9922"], /* CJK Ideograph */
+ ["\u9923", "\u9923"], /* CJK Ideograph */
+ ["\u9924", "\u9924"], /* CJK Ideograph */
+ ["\u9925", "\u9925"], /* CJK Ideograph */
+ ["\u9926", "\u9926"], /* CJK Ideograph */
+ ["\u9927", "\u9927"], /* CJK Ideograph */
+ ["\u9928", "\u9928"], /* CJK Ideograph */
+ ["\u9929", "\u9929"], /* CJK Ideograph */
+ ["\u992A", "\u992A"], /* CJK Ideograph */
+ ["\u992B", "\u992B"], /* CJK Ideograph */
+ ["\u992C", "\u992C"], /* CJK Ideograph */
+ ["\u992D", "\u992D"], /* CJK Ideograph */
+ ["\u992E", "\u992E"], /* CJK Ideograph */
+ ["\u992F", "\u992F"], /* CJK Ideograph */
+ ["\u9930", "\u9930"], /* CJK Ideograph */
+ ["\u9931", "\u9931"], /* CJK Ideograph */
+ ["\u9932", "\u9932"], /* CJK Ideograph */
+ ["\u9933", "\u9933"], /* CJK Ideograph */
+ ["\u9934", "\u9934"], /* CJK Ideograph */
+ ["\u9935", "\u9935"], /* CJK Ideograph */
+ ["\u9936", "\u9936"], /* CJK Ideograph */
+ ["\u9937", "\u9937"], /* CJK Ideograph */
+ ["\u9938", "\u9938"], /* CJK Ideograph */
+ ["\u9939", "\u9939"], /* CJK Ideograph */
+ ["\u993A", "\u993A"], /* CJK Ideograph */
+ ["\u993B", "\u993B"], /* CJK Ideograph */
+ ["\u993C", "\u993C"], /* CJK Ideograph */
+ ["\u993D", "\u993D"], /* CJK Ideograph */
+ ["\u993E", "\u993E"], /* CJK Ideograph */
+ ["\u993F", "\u993F"], /* CJK Ideograph */
+ ["\u9940", "\u9940"], /* CJK Ideograph */
+ ["\u9941", "\u9941"], /* CJK Ideograph */
+ ["\u9942", "\u9942"], /* CJK Ideograph */
+ ["\u9943", "\u9943"], /* CJK Ideograph */
+ ["\u9944", "\u9944"], /* CJK Ideograph */
+ ["\u9945", "\u9945"], /* CJK Ideograph */
+ ["\u9946", "\u9946"], /* CJK Ideograph */
+ ["\u9947", "\u9947"], /* CJK Ideograph */
+ ["\u9948", "\u9948"], /* CJK Ideograph */
+ ["\u9949", "\u9949"], /* CJK Ideograph */
+ ["\u994A", "\u994A"], /* CJK Ideograph */
+ ["\u994B", "\u994B"], /* CJK Ideograph */
+ ["\u994C", "\u994C"], /* CJK Ideograph */
+ ["\u994D", "\u994D"], /* CJK Ideograph */
+ ["\u994E", "\u994E"], /* CJK Ideograph */
+ ["\u994F", "\u994F"], /* CJK Ideograph */
+ ["\u9950", "\u9950"], /* CJK Ideograph */
+ ["\u9951", "\u9951"], /* CJK Ideograph */
+ ["\u9952", "\u9952"], /* CJK Ideograph */
+ ["\u9953", "\u9953"], /* CJK Ideograph */
+ ["\u9954", "\u9954"], /* CJK Ideograph */
+ ["\u9955", "\u9955"], /* CJK Ideograph */
+ ["\u9956", "\u9956"], /* CJK Ideograph */
+ ["\u9957", "\u9957"], /* CJK Ideograph */
+ ["\u9958", "\u9958"], /* CJK Ideograph */
+ ["\u9959", "\u9959"], /* CJK Ideograph */
+ ["\u995A", "\u995A"], /* CJK Ideograph */
+ ["\u995B", "\u995B"], /* CJK Ideograph */
+ ["\u995C", "\u995C"], /* CJK Ideograph */
+ ["\u995D", "\u995D"], /* CJK Ideograph */
+ ["\u995E", "\u995E"], /* CJK Ideograph */
+ ["\u995F", "\u995F"], /* CJK Ideograph */
+ ["\u9960", "\u9960"], /* CJK Ideograph */
+ ["\u9961", "\u9961"], /* CJK Ideograph */
+ ["\u9962", "\u9962"], /* CJK Ideograph */
+ ["\u9963", "\u9963"], /* CJK Ideograph */
+ ["\u9964", "\u9964"], /* CJK Ideograph */
+ ["\u9965", "\u9965"], /* CJK Ideograph */
+ ["\u9966", "\u9966"], /* CJK Ideograph */
+ ["\u9967", "\u9967"], /* CJK Ideograph */
+ ["\u9968", "\u9968"], /* CJK Ideograph */
+ ["\u9969", "\u9969"], /* CJK Ideograph */
+ ["\u996A", "\u996A"], /* CJK Ideograph */
+ ["\u996B", "\u996B"], /* CJK Ideograph */
+ ["\u996C", "\u996C"], /* CJK Ideograph */
+ ["\u996D", "\u996D"], /* CJK Ideograph */
+ ["\u996E", "\u996E"], /* CJK Ideograph */
+ ["\u996F", "\u996F"], /* CJK Ideograph */
+ ["\u9970", "\u9970"], /* CJK Ideograph */
+ ["\u9971", "\u9971"], /* CJK Ideograph */
+ ["\u9972", "\u9972"], /* CJK Ideograph */
+ ["\u9973", "\u9973"], /* CJK Ideograph */
+ ["\u9974", "\u9974"], /* CJK Ideograph */
+ ["\u9975", "\u9975"], /* CJK Ideograph */
+ ["\u9976", "\u9976"], /* CJK Ideograph */
+ ["\u9977", "\u9977"], /* CJK Ideograph */
+ ["\u9978", "\u9978"], /* CJK Ideograph */
+ ["\u9979", "\u9979"], /* CJK Ideograph */
+ ["\u997A", "\u997A"], /* CJK Ideograph */
+ ["\u997B", "\u997B"], /* CJK Ideograph */
+ ["\u997C", "\u997C"], /* CJK Ideograph */
+ ["\u997D", "\u997D"], /* CJK Ideograph */
+ ["\u997E", "\u997E"], /* CJK Ideograph */
+ ["\u997F", "\u997F"], /* CJK Ideograph */
+ ["\u9980", "\u9980"], /* CJK Ideograph */
+ ["\u9981", "\u9981"], /* CJK Ideograph */
+ ["\u9982", "\u9982"], /* CJK Ideograph */
+ ["\u9983", "\u9983"], /* CJK Ideograph */
+ ["\u9984", "\u9984"], /* CJK Ideograph */
+ ["\u9985", "\u9985"], /* CJK Ideograph */
+ ["\u9986", "\u9986"], /* CJK Ideograph */
+ ["\u9987", "\u9987"], /* CJK Ideograph */
+ ["\u9988", "\u9988"], /* CJK Ideograph */
+ ["\u9989", "\u9989"], /* CJK Ideograph */
+ ["\u998A", "\u998A"], /* CJK Ideograph */
+ ["\u998B", "\u998B"], /* CJK Ideograph */
+ ["\u998C", "\u998C"], /* CJK Ideograph */
+ ["\u998D", "\u998D"], /* CJK Ideograph */
+ ["\u998E", "\u998E"], /* CJK Ideograph */
+ ["\u998F", "\u998F"], /* CJK Ideograph */
+ ["\u9990", "\u9990"], /* CJK Ideograph */
+ ["\u9991", "\u9991"], /* CJK Ideograph */
+ ["\u9992", "\u9992"], /* CJK Ideograph */
+ ["\u9993", "\u9993"], /* CJK Ideograph */
+ ["\u9994", "\u9994"], /* CJK Ideograph */
+ ["\u9995", "\u9995"], /* CJK Ideograph */
+ ["\u9996", "\u9996"], /* CJK Ideograph */
+ ["\u9997", "\u9997"], /* CJK Ideograph */
+ ["\u9998", "\u9998"], /* CJK Ideograph */
+ ["\u9999", "\u9999"], /* CJK Ideograph */
+ ["\u999A", "\u999A"], /* CJK Ideograph */
+ ["\u999B", "\u999B"], /* CJK Ideograph */
+ ["\u999C", "\u999C"], /* CJK Ideograph */
+ ["\u999D", "\u999D"], /* CJK Ideograph */
+ ["\u999E", "\u999E"], /* CJK Ideograph */
+ ["\u999F", "\u999F"], /* CJK Ideograph */
+ ["\u99A0", "\u99A0"], /* CJK Ideograph */
+ ["\u99A1", "\u99A1"], /* CJK Ideograph */
+ ["\u99A2", "\u99A2"], /* CJK Ideograph */
+ ["\u99A3", "\u99A3"], /* CJK Ideograph */
+ ["\u99A4", "\u99A4"], /* CJK Ideograph */
+ ["\u99A5", "\u99A5"], /* CJK Ideograph */
+ ["\u99A6", "\u99A6"], /* CJK Ideograph */
+ ["\u99A7", "\u99A7"], /* CJK Ideograph */
+ ["\u99A8", "\u99A8"], /* CJK Ideograph */
+ ["\u99A9", "\u99A9"], /* CJK Ideograph */
+ ["\u99AA", "\u99AA"], /* CJK Ideograph */
+ ["\u99AB", "\u99AB"], /* CJK Ideograph */
+ ["\u99AC", "\u99AC"], /* CJK Ideograph */
+ ["\u99AD", "\u99AD"], /* CJK Ideograph */
+ ["\u99AE", "\u99AE"], /* CJK Ideograph */
+ ["\u99AF", "\u99AF"], /* CJK Ideograph */
+ ["\u99B0", "\u99B0"], /* CJK Ideograph */
+ ["\u99B1", "\u99B1"], /* CJK Ideograph */
+ ["\u99B2", "\u99B2"], /* CJK Ideograph */
+ ["\u99B3", "\u99B3"], /* CJK Ideograph */
+ ["\u99B4", "\u99B4"], /* CJK Ideograph */
+ ["\u99B5", "\u99B5"], /* CJK Ideograph */
+ ["\u99B6", "\u99B6"], /* CJK Ideograph */
+ ["\u99B7", "\u99B7"], /* CJK Ideograph */
+ ["\u99B8", "\u99B8"], /* CJK Ideograph */
+ ["\u99B9", "\u99B9"], /* CJK Ideograph */
+ ["\u99BA", "\u99BA"], /* CJK Ideograph */
+ ["\u99BB", "\u99BB"], /* CJK Ideograph */
+ ["\u99BC", "\u99BC"], /* CJK Ideograph */
+ ["\u99BD", "\u99BD"], /* CJK Ideograph */
+ ["\u99BE", "\u99BE"], /* CJK Ideograph */
+ ["\u99BF", "\u99BF"], /* CJK Ideograph */
+ ["\u99C0", "\u99C0"], /* CJK Ideograph */
+ ["\u99C1", "\u99C1"], /* CJK Ideograph */
+ ["\u99C2", "\u99C2"], /* CJK Ideograph */
+ ["\u99C3", "\u99C3"], /* CJK Ideograph */
+ ["\u99C4", "\u99C4"], /* CJK Ideograph */
+ ["\u99C5", "\u99C5"], /* CJK Ideograph */
+ ["\u99C6", "\u99C6"], /* CJK Ideograph */
+ ["\u99C7", "\u99C7"], /* CJK Ideograph */
+ ["\u99C8", "\u99C8"], /* CJK Ideograph */
+ ["\u99C9", "\u99C9"], /* CJK Ideograph */
+ ["\u99CA", "\u99CA"], /* CJK Ideograph */
+ ["\u99CB", "\u99CB"], /* CJK Ideograph */
+ ["\u99CC", "\u99CC"], /* CJK Ideograph */
+ ["\u99CD", "\u99CD"], /* CJK Ideograph */
+ ["\u99CE", "\u99CE"], /* CJK Ideograph */
+ ["\u99CF", "\u99CF"], /* CJK Ideograph */
+ ["\u99D0", "\u99D0"], /* CJK Ideograph */
+ ["\u99D1", "\u99D1"], /* CJK Ideograph */
+ ["\u99D2", "\u99D2"], /* CJK Ideograph */
+ ["\u99D3", "\u99D3"], /* CJK Ideograph */
+ ["\u99D4", "\u99D4"], /* CJK Ideograph */
+ ["\u99D5", "\u99D5"], /* CJK Ideograph */
+ ["\u99D6", "\u99D6"], /* CJK Ideograph */
+ ["\u99D7", "\u99D7"], /* CJK Ideograph */
+ ["\u99D8", "\u99D8"], /* CJK Ideograph */
+ ["\u99D9", "\u99D9"], /* CJK Ideograph */
+ ["\u99DA", "\u99DA"], /* CJK Ideograph */
+ ["\u99DB", "\u99DB"], /* CJK Ideograph */
+ ["\u99DC", "\u99DC"], /* CJK Ideograph */
+ ["\u99DD", "\u99DD"], /* CJK Ideograph */
+ ["\u99DE", "\u99DE"], /* CJK Ideograph */
+ ["\u99DF", "\u99DF"], /* CJK Ideograph */
+ ["\u99E0", "\u99E0"], /* CJK Ideograph */
+ ["\u99E1", "\u99E1"], /* CJK Ideograph */
+ ["\u99E2", "\u99E2"], /* CJK Ideograph */
+ ["\u99E3", "\u99E3"], /* CJK Ideograph */
+ ["\u99E4", "\u99E4"], /* CJK Ideograph */
+ ["\u99E5", "\u99E5"], /* CJK Ideograph */
+ ["\u99E6", "\u99E6"], /* CJK Ideograph */
+ ["\u99E7", "\u99E7"], /* CJK Ideograph */
+ ["\u99E8", "\u99E8"], /* CJK Ideograph */
+ ["\u99E9", "\u99E9"], /* CJK Ideograph */
+ ["\u99EA", "\u99EA"], /* CJK Ideograph */
+ ["\u99EB", "\u99EB"], /* CJK Ideograph */
+ ["\u99EC", "\u99EC"], /* CJK Ideograph */
+ ["\u99ED", "\u99ED"], /* CJK Ideograph */
+ ["\u99EE", "\u99EE"], /* CJK Ideograph */
+ ["\u99EF", "\u99EF"], /* CJK Ideograph */
+ ["\u99F0", "\u99F0"], /* CJK Ideograph */
+ ["\u99F1", "\u99F1"], /* CJK Ideograph */
+ ["\u99F2", "\u99F2"], /* CJK Ideograph */
+ ["\u99F3", "\u99F3"], /* CJK Ideograph */
+ ["\u99F4", "\u99F4"], /* CJK Ideograph */
+ ["\u99F5", "\u99F5"], /* CJK Ideograph */
+ ["\u99F6", "\u99F6"], /* CJK Ideograph */
+ ["\u99F7", "\u99F7"], /* CJK Ideograph */
+ ["\u99F8", "\u99F8"], /* CJK Ideograph */
+ ["\u99F9", "\u99F9"], /* CJK Ideograph */
+ ["\u99FA", "\u99FA"], /* CJK Ideograph */
+ ["\u99FB", "\u99FB"], /* CJK Ideograph */
+ ["\u99FC", "\u99FC"], /* CJK Ideograph */
+ ["\u99FD", "\u99FD"], /* CJK Ideograph */
+ ["\u99FE", "\u99FE"], /* CJK Ideograph */
+ ["\u99FF", "\u99FF"], /* CJK Ideograph */
+ ["\u9A00", "\u9A00"], /* CJK Ideograph */
+ ["\u9A01", "\u9A01"], /* CJK Ideograph */
+ ["\u9A02", "\u9A02"], /* CJK Ideograph */
+ ["\u9A03", "\u9A03"], /* CJK Ideograph */
+ ["\u9A04", "\u9A04"], /* CJK Ideograph */
+ ["\u9A05", "\u9A05"], /* CJK Ideograph */
+ ["\u9A06", "\u9A06"], /* CJK Ideograph */
+ ["\u9A07", "\u9A07"], /* CJK Ideograph */
+ ["\u9A08", "\u9A08"], /* CJK Ideograph */
+ ["\u9A09", "\u9A09"], /* CJK Ideograph */
+ ["\u9A0A", "\u9A0A"], /* CJK Ideograph */
+ ["\u9A0B", "\u9A0B"], /* CJK Ideograph */
+ ["\u9A0C", "\u9A0C"], /* CJK Ideograph */
+ ["\u9A0D", "\u9A0D"], /* CJK Ideograph */
+ ["\u9A0E", "\u9A0E"], /* CJK Ideograph */
+ ["\u9A0F", "\u9A0F"], /* CJK Ideograph */
+ ["\u9A10", "\u9A10"], /* CJK Ideograph */
+ ["\u9A11", "\u9A11"], /* CJK Ideograph */
+ ["\u9A12", "\u9A12"], /* CJK Ideograph */
+ ["\u9A13", "\u9A13"], /* CJK Ideograph */
+ ["\u9A14", "\u9A14"], /* CJK Ideograph */
+ ["\u9A15", "\u9A15"], /* CJK Ideograph */
+ ["\u9A16", "\u9A16"], /* CJK Ideograph */
+ ["\u9A17", "\u9A17"], /* CJK Ideograph */
+ ["\u9A18", "\u9A18"], /* CJK Ideograph */
+ ["\u9A19", "\u9A19"], /* CJK Ideograph */
+ ["\u9A1A", "\u9A1A"], /* CJK Ideograph */
+ ["\u9A1B", "\u9A1B"], /* CJK Ideograph */
+ ["\u9A1C", "\u9A1C"], /* CJK Ideograph */
+ ["\u9A1D", "\u9A1D"], /* CJK Ideograph */
+ ["\u9A1E", "\u9A1E"], /* CJK Ideograph */
+ ["\u9A1F", "\u9A1F"], /* CJK Ideograph */
+ ["\u9A20", "\u9A20"], /* CJK Ideograph */
+ ["\u9A21", "\u9A21"], /* CJK Ideograph */
+ ["\u9A22", "\u9A22"], /* CJK Ideograph */
+ ["\u9A23", "\u9A23"], /* CJK Ideograph */
+ ["\u9A24", "\u9A24"], /* CJK Ideograph */
+ ["\u9A25", "\u9A25"], /* CJK Ideograph */
+ ["\u9A26", "\u9A26"], /* CJK Ideograph */
+ ["\u9A27", "\u9A27"], /* CJK Ideograph */
+ ["\u9A28", "\u9A28"], /* CJK Ideograph */
+ ["\u9A29", "\u9A29"], /* CJK Ideograph */
+ ["\u9A2A", "\u9A2A"], /* CJK Ideograph */
+ ["\u9A2B", "\u9A2B"], /* CJK Ideograph */
+ ["\u9A2C", "\u9A2C"], /* CJK Ideograph */
+ ["\u9A2D", "\u9A2D"], /* CJK Ideograph */
+ ["\u9A2E", "\u9A2E"], /* CJK Ideograph */
+ ["\u9A2F", "\u9A2F"], /* CJK Ideograph */
+ ["\u9A30", "\u9A30"], /* CJK Ideograph */
+ ["\u9A31", "\u9A31"], /* CJK Ideograph */
+ ["\u9A32", "\u9A32"], /* CJK Ideograph */
+ ["\u9A33", "\u9A33"], /* CJK Ideograph */
+ ["\u9A34", "\u9A34"], /* CJK Ideograph */
+ ["\u9A35", "\u9A35"], /* CJK Ideograph */
+ ["\u9A36", "\u9A36"], /* CJK Ideograph */
+ ["\u9A37", "\u9A37"], /* CJK Ideograph */
+ ["\u9A38", "\u9A38"], /* CJK Ideograph */
+ ["\u9A39", "\u9A39"], /* CJK Ideograph */
+ ["\u9A3A", "\u9A3A"], /* CJK Ideograph */
+ ["\u9A3B", "\u9A3B"], /* CJK Ideograph */
+ ["\u9A3C", "\u9A3C"], /* CJK Ideograph */
+ ["\u9A3D", "\u9A3D"], /* CJK Ideograph */
+ ["\u9A3E", "\u9A3E"], /* CJK Ideograph */
+ ["\u9A3F", "\u9A3F"], /* CJK Ideograph */
+ ["\u9A40", "\u9A40"], /* CJK Ideograph */
+ ["\u9A41", "\u9A41"], /* CJK Ideograph */
+ ["\u9A42", "\u9A42"], /* CJK Ideograph */
+ ["\u9A43", "\u9A43"], /* CJK Ideograph */
+ ["\u9A44", "\u9A44"], /* CJK Ideograph */
+ ["\u9A45", "\u9A45"], /* CJK Ideograph */
+ ["\u9A46", "\u9A46"], /* CJK Ideograph */
+ ["\u9A47", "\u9A47"], /* CJK Ideograph */
+ ["\u9A48", "\u9A48"], /* CJK Ideograph */
+ ["\u9A49", "\u9A49"], /* CJK Ideograph */
+ ["\u9A4A", "\u9A4A"], /* CJK Ideograph */
+ ["\u9A4B", "\u9A4B"], /* CJK Ideograph */
+ ["\u9A4C", "\u9A4C"], /* CJK Ideograph */
+ ["\u9A4D", "\u9A4D"], /* CJK Ideograph */
+ ["\u9A4E", "\u9A4E"], /* CJK Ideograph */
+ ["\u9A4F", "\u9A4F"], /* CJK Ideograph */
+ ["\u9A50", "\u9A50"], /* CJK Ideograph */
+ ["\u9A51", "\u9A51"], /* CJK Ideograph */
+ ["\u9A52", "\u9A52"], /* CJK Ideograph */
+ ["\u9A53", "\u9A53"], /* CJK Ideograph */
+ ["\u9A54", "\u9A54"], /* CJK Ideograph */
+ ["\u9A55", "\u9A55"], /* CJK Ideograph */
+ ["\u9A56", "\u9A56"], /* CJK Ideograph */
+ ["\u9A57", "\u9A57"], /* CJK Ideograph */
+ ["\u9A58", "\u9A58"], /* CJK Ideograph */
+ ["\u9A59", "\u9A59"], /* CJK Ideograph */
+ ["\u9A5A", "\u9A5A"], /* CJK Ideograph */
+ ["\u9A5B", "\u9A5B"], /* CJK Ideograph */
+ ["\u9A5C", "\u9A5C"], /* CJK Ideograph */
+ ["\u9A5D", "\u9A5D"], /* CJK Ideograph */
+ ["\u9A5E", "\u9A5E"], /* CJK Ideograph */
+ ["\u9A5F", "\u9A5F"], /* CJK Ideograph */
+ ["\u9A60", "\u9A60"], /* CJK Ideograph */
+ ["\u9A61", "\u9A61"], /* CJK Ideograph */
+ ["\u9A62", "\u9A62"], /* CJK Ideograph */
+ ["\u9A63", "\u9A63"], /* CJK Ideograph */
+ ["\u9A64", "\u9A64"], /* CJK Ideograph */
+ ["\u9A65", "\u9A65"], /* CJK Ideograph */
+ ["\u9A66", "\u9A66"], /* CJK Ideograph */
+ ["\u9A67", "\u9A67"], /* CJK Ideograph */
+ ["\u9A68", "\u9A68"], /* CJK Ideograph */
+ ["\u9A69", "\u9A69"], /* CJK Ideograph */
+ ["\u9A6A", "\u9A6A"], /* CJK Ideograph */
+ ["\u9A6B", "\u9A6B"], /* CJK Ideograph */
+ ["\u9A6C", "\u9A6C"], /* CJK Ideograph */
+ ["\u9A6D", "\u9A6D"], /* CJK Ideograph */
+ ["\u9A6E", "\u9A6E"], /* CJK Ideograph */
+ ["\u9A6F", "\u9A6F"], /* CJK Ideograph */
+ ["\u9A70", "\u9A70"], /* CJK Ideograph */
+ ["\u9A71", "\u9A71"], /* CJK Ideograph */
+ ["\u9A72", "\u9A72"], /* CJK Ideograph */
+ ["\u9A73", "\u9A73"], /* CJK Ideograph */
+ ["\u9A74", "\u9A74"], /* CJK Ideograph */
+ ["\u9A75", "\u9A75"], /* CJK Ideograph */
+ ["\u9A76", "\u9A76"], /* CJK Ideograph */
+ ["\u9A77", "\u9A77"], /* CJK Ideograph */
+ ["\u9A78", "\u9A78"], /* CJK Ideograph */
+ ["\u9A79", "\u9A79"], /* CJK Ideograph */
+ ["\u9A7A", "\u9A7A"], /* CJK Ideograph */
+ ["\u9A7B", "\u9A7B"], /* CJK Ideograph */
+ ["\u9A7C", "\u9A7C"], /* CJK Ideograph */
+ ["\u9A7D", "\u9A7D"], /* CJK Ideograph */
+ ["\u9A7E", "\u9A7E"], /* CJK Ideograph */
+ ["\u9A7F", "\u9A7F"], /* CJK Ideograph */
+ ["\u9A80", "\u9A80"], /* CJK Ideograph */
+ ["\u9A81", "\u9A81"], /* CJK Ideograph */
+ ["\u9A82", "\u9A82"], /* CJK Ideograph */
+ ["\u9A83", "\u9A83"], /* CJK Ideograph */
+ ["\u9A84", "\u9A84"], /* CJK Ideograph */
+ ["\u9A85", "\u9A85"], /* CJK Ideograph */
+ ["\u9A86", "\u9A86"], /* CJK Ideograph */
+ ["\u9A87", "\u9A87"], /* CJK Ideograph */
+ ["\u9A88", "\u9A88"], /* CJK Ideograph */
+ ["\u9A89", "\u9A89"], /* CJK Ideograph */
+ ["\u9A8A", "\u9A8A"], /* CJK Ideograph */
+ ["\u9A8B", "\u9A8B"], /* CJK Ideograph */
+ ["\u9A8C", "\u9A8C"], /* CJK Ideograph */
+ ["\u9A8D", "\u9A8D"], /* CJK Ideograph */
+ ["\u9A8E", "\u9A8E"], /* CJK Ideograph */
+ ["\u9A8F", "\u9A8F"], /* CJK Ideograph */
+ ["\u9A90", "\u9A90"], /* CJK Ideograph */
+ ["\u9A91", "\u9A91"], /* CJK Ideograph */
+ ["\u9A92", "\u9A92"], /* CJK Ideograph */
+ ["\u9A93", "\u9A93"], /* CJK Ideograph */
+ ["\u9A94", "\u9A94"], /* CJK Ideograph */
+ ["\u9A95", "\u9A95"], /* CJK Ideograph */
+ ["\u9A96", "\u9A96"], /* CJK Ideograph */
+ ["\u9A97", "\u9A97"], /* CJK Ideograph */
+ ["\u9A98", "\u9A98"], /* CJK Ideograph */
+ ["\u9A99", "\u9A99"], /* CJK Ideograph */
+ ["\u9A9A", "\u9A9A"], /* CJK Ideograph */
+ ["\u9A9B", "\u9A9B"], /* CJK Ideograph */
+ ["\u9A9C", "\u9A9C"], /* CJK Ideograph */
+ ["\u9A9D", "\u9A9D"], /* CJK Ideograph */
+ ["\u9A9E", "\u9A9E"], /* CJK Ideograph */
+ ["\u9A9F", "\u9A9F"], /* CJK Ideograph */
+ ["\u9AA0", "\u9AA0"], /* CJK Ideograph */
+ ["\u9AA1", "\u9AA1"], /* CJK Ideograph */
+ ["\u9AA2", "\u9AA2"], /* CJK Ideograph */
+ ["\u9AA3", "\u9AA3"], /* CJK Ideograph */
+ ["\u9AA4", "\u9AA4"], /* CJK Ideograph */
+ ["\u9AA5", "\u9AA5"], /* CJK Ideograph */
+ ["\u9AA6", "\u9AA6"], /* CJK Ideograph */
+ ["\u9AA7", "\u9AA7"], /* CJK Ideograph */
+ ["\u9AA8", "\u9AA8"], /* CJK Ideograph */
+ ["\u9AA9", "\u9AA9"], /* CJK Ideograph */
+ ["\u9AAA", "\u9AAA"], /* CJK Ideograph */
+ ["\u9AAB", "\u9AAB"], /* CJK Ideograph */
+ ["\u9AAC", "\u9AAC"], /* CJK Ideograph */
+ ["\u9AAD", "\u9AAD"], /* CJK Ideograph */
+ ["\u9AAE", "\u9AAE"], /* CJK Ideograph */
+ ["\u9AAF", "\u9AAF"], /* CJK Ideograph */
+ ["\u9AB0", "\u9AB0"], /* CJK Ideograph */
+ ["\u9AB1", "\u9AB1"], /* CJK Ideograph */
+ ["\u9AB2", "\u9AB2"], /* CJK Ideograph */
+ ["\u9AB3", "\u9AB3"], /* CJK Ideograph */
+ ["\u9AB4", "\u9AB4"], /* CJK Ideograph */
+ ["\u9AB5", "\u9AB5"], /* CJK Ideograph */
+ ["\u9AB6", "\u9AB6"], /* CJK Ideograph */
+ ["\u9AB7", "\u9AB7"], /* CJK Ideograph */
+ ["\u9AB8", "\u9AB8"], /* CJK Ideograph */
+ ["\u9AB9", "\u9AB9"], /* CJK Ideograph */
+ ["\u9ABA", "\u9ABA"], /* CJK Ideograph */
+ ["\u9ABB", "\u9ABB"], /* CJK Ideograph */
+ ["\u9ABC", "\u9ABC"], /* CJK Ideograph */
+ ["\u9ABD", "\u9ABD"], /* CJK Ideograph */
+ ["\u9ABE", "\u9ABE"], /* CJK Ideograph */
+ ["\u9ABF", "\u9ABF"], /* CJK Ideograph */
+ ["\u9AC0", "\u9AC0"], /* CJK Ideograph */
+ ["\u9AC1", "\u9AC1"], /* CJK Ideograph */
+ ["\u9AC2", "\u9AC2"], /* CJK Ideograph */
+ ["\u9AC3", "\u9AC3"], /* CJK Ideograph */
+ ["\u9AC4", "\u9AC4"], /* CJK Ideograph */
+ ["\u9AC5", "\u9AC5"], /* CJK Ideograph */
+ ["\u9AC6", "\u9AC6"], /* CJK Ideograph */
+ ["\u9AC7", "\u9AC7"], /* CJK Ideograph */
+ ["\u9AC8", "\u9AC8"], /* CJK Ideograph */
+ ["\u9AC9", "\u9AC9"], /* CJK Ideograph */
+ ["\u9ACA", "\u9ACA"], /* CJK Ideograph */
+ ["\u9ACB", "\u9ACB"], /* CJK Ideograph */
+ ["\u9ACC", "\u9ACC"], /* CJK Ideograph */
+ ["\u9ACD", "\u9ACD"], /* CJK Ideograph */
+ ["\u9ACE", "\u9ACE"], /* CJK Ideograph */
+ ["\u9ACF", "\u9ACF"], /* CJK Ideograph */
+ ["\u9AD0", "\u9AD0"], /* CJK Ideograph */
+ ["\u9AD1", "\u9AD1"], /* CJK Ideograph */
+ ["\u9AD2", "\u9AD2"], /* CJK Ideograph */
+ ["\u9AD3", "\u9AD3"], /* CJK Ideograph */
+ ["\u9AD4", "\u9AD4"], /* CJK Ideograph */
+ ["\u9AD5", "\u9AD5"], /* CJK Ideograph */
+ ["\u9AD6", "\u9AD6"], /* CJK Ideograph */
+ ["\u9AD7", "\u9AD7"], /* CJK Ideograph */
+ ["\u9AD8", "\u9AD8"], /* CJK Ideograph */
+ ["\u9AD9", "\u9AD9"], /* CJK Ideograph */
+ ["\u9ADA", "\u9ADA"], /* CJK Ideograph */
+ ["\u9ADB", "\u9ADB"], /* CJK Ideograph */
+ ["\u9ADC", "\u9ADC"], /* CJK Ideograph */
+ ["\u9ADD", "\u9ADD"], /* CJK Ideograph */
+ ["\u9ADE", "\u9ADE"], /* CJK Ideograph */
+ ["\u9ADF", "\u9ADF"], /* CJK Ideograph */
+ ["\u9AE0", "\u9AE0"], /* CJK Ideograph */
+ ["\u9AE1", "\u9AE1"], /* CJK Ideograph */
+ ["\u9AE2", "\u9AE2"], /* CJK Ideograph */
+ ["\u9AE3", "\u9AE3"], /* CJK Ideograph */
+ ["\u9AE4", "\u9AE4"], /* CJK Ideograph */
+ ["\u9AE5", "\u9AE5"], /* CJK Ideograph */
+ ["\u9AE6", "\u9AE6"], /* CJK Ideograph */
+ ["\u9AE7", "\u9AE7"], /* CJK Ideograph */
+ ["\u9AE8", "\u9AE8"], /* CJK Ideograph */
+ ["\u9AE9", "\u9AE9"], /* CJK Ideograph */
+ ["\u9AEA", "\u9AEA"], /* CJK Ideograph */
+ ["\u9AEB", "\u9AEB"], /* CJK Ideograph */
+ ["\u9AEC", "\u9AEC"], /* CJK Ideograph */
+ ["\u9AED", "\u9AED"], /* CJK Ideograph */
+ ["\u9AEE", "\u9AEE"], /* CJK Ideograph */
+ ["\u9AEF", "\u9AEF"], /* CJK Ideograph */
+ ["\u9AF0", "\u9AF0"], /* CJK Ideograph */
+ ["\u9AF1", "\u9AF1"], /* CJK Ideograph */
+ ["\u9AF2", "\u9AF2"], /* CJK Ideograph */
+ ["\u9AF3", "\u9AF3"], /* CJK Ideograph */
+ ["\u9AF4", "\u9AF4"], /* CJK Ideograph */
+ ["\u9AF5", "\u9AF5"], /* CJK Ideograph */
+ ["\u9AF6", "\u9AF6"], /* CJK Ideograph */
+ ["\u9AF7", "\u9AF7"], /* CJK Ideograph */
+ ["\u9AF8", "\u9AF8"], /* CJK Ideograph */
+ ["\u9AF9", "\u9AF9"], /* CJK Ideograph */
+ ["\u9AFA", "\u9AFA"], /* CJK Ideograph */
+ ["\u9AFB", "\u9AFB"], /* CJK Ideograph */
+ ["\u9AFC", "\u9AFC"], /* CJK Ideograph */
+ ["\u9AFD", "\u9AFD"], /* CJK Ideograph */
+ ["\u9AFE", "\u9AFE"], /* CJK Ideograph */
+ ["\u9AFF", "\u9AFF"], /* CJK Ideograph */
+ ["\u9B00", "\u9B00"], /* CJK Ideograph */
+ ["\u9B01", "\u9B01"], /* CJK Ideograph */
+ ["\u9B02", "\u9B02"], /* CJK Ideograph */
+ ["\u9B03", "\u9B03"], /* CJK Ideograph */
+ ["\u9B04", "\u9B04"], /* CJK Ideograph */
+ ["\u9B05", "\u9B05"], /* CJK Ideograph */
+ ["\u9B06", "\u9B06"], /* CJK Ideograph */
+ ["\u9B07", "\u9B07"], /* CJK Ideograph */
+ ["\u9B08", "\u9B08"], /* CJK Ideograph */
+ ["\u9B09", "\u9B09"], /* CJK Ideograph */
+ ["\u9B0A", "\u9B0A"], /* CJK Ideograph */
+ ["\u9B0B", "\u9B0B"], /* CJK Ideograph */
+ ["\u9B0C", "\u9B0C"], /* CJK Ideograph */
+ ["\u9B0D", "\u9B0D"], /* CJK Ideograph */
+ ["\u9B0E", "\u9B0E"], /* CJK Ideograph */
+ ["\u9B0F", "\u9B0F"], /* CJK Ideograph */
+ ["\u9B10", "\u9B10"], /* CJK Ideograph */
+ ["\u9B11", "\u9B11"], /* CJK Ideograph */
+ ["\u9B12", "\u9B12"], /* CJK Ideograph */
+ ["\u9B13", "\u9B13"], /* CJK Ideograph */
+ ["\u9B14", "\u9B14"], /* CJK Ideograph */
+ ["\u9B15", "\u9B15"], /* CJK Ideograph */
+ ["\u9B16", "\u9B16"], /* CJK Ideograph */
+ ["\u9B17", "\u9B17"], /* CJK Ideograph */
+ ["\u9B18", "\u9B18"], /* CJK Ideograph */
+ ["\u9B19", "\u9B19"], /* CJK Ideograph */
+ ["\u9B1A", "\u9B1A"], /* CJK Ideograph */
+ ["\u9B1B", "\u9B1B"], /* CJK Ideograph */
+ ["\u9B1C", "\u9B1C"], /* CJK Ideograph */
+ ["\u9B1D", "\u9B1D"], /* CJK Ideograph */
+ ["\u9B1E", "\u9B1E"], /* CJK Ideograph */
+ ["\u9B1F", "\u9B1F"], /* CJK Ideograph */
+ ["\u9B20", "\u9B20"], /* CJK Ideograph */
+ ["\u9B21", "\u9B21"], /* CJK Ideograph */
+ ["\u9B22", "\u9B22"], /* CJK Ideograph */
+ ["\u9B23", "\u9B23"], /* CJK Ideograph */
+ ["\u9B24", "\u9B24"], /* CJK Ideograph */
+ ["\u9B25", "\u9B25"], /* CJK Ideograph */
+ ["\u9B26", "\u9B26"], /* CJK Ideograph */
+ ["\u9B27", "\u9B27"], /* CJK Ideograph */
+ ["\u9B28", "\u9B28"], /* CJK Ideograph */
+ ["\u9B29", "\u9B29"], /* CJK Ideograph */
+ ["\u9B2A", "\u9B2A"], /* CJK Ideograph */
+ ["\u9B2B", "\u9B2B"], /* CJK Ideograph */
+ ["\u9B2C", "\u9B2C"], /* CJK Ideograph */
+ ["\u9B2D", "\u9B2D"], /* CJK Ideograph */
+ ["\u9B2E", "\u9B2E"], /* CJK Ideograph */
+ ["\u9B2F", "\u9B2F"], /* CJK Ideograph */
+ ["\u9B30", "\u9B30"], /* CJK Ideograph */
+ ["\u9B31", "\u9B31"], /* CJK Ideograph */
+ ["\u9B32", "\u9B32"], /* CJK Ideograph */
+ ["\u9B33", "\u9B33"], /* CJK Ideograph */
+ ["\u9B34", "\u9B34"], /* CJK Ideograph */
+ ["\u9B35", "\u9B35"], /* CJK Ideograph */
+ ["\u9B36", "\u9B36"], /* CJK Ideograph */
+ ["\u9B37", "\u9B37"], /* CJK Ideograph */
+ ["\u9B38", "\u9B38"], /* CJK Ideograph */
+ ["\u9B39", "\u9B39"], /* CJK Ideograph */
+ ["\u9B3A", "\u9B3A"], /* CJK Ideograph */
+ ["\u9B3B", "\u9B3B"], /* CJK Ideograph */
+ ["\u9B3C", "\u9B3C"], /* CJK Ideograph */
+ ["\u9B3D", "\u9B3D"], /* CJK Ideograph */
+ ["\u9B3E", "\u9B3E"], /* CJK Ideograph */
+ ["\u9B3F", "\u9B3F"], /* CJK Ideograph */
+ ["\u9B40", "\u9B40"], /* CJK Ideograph */
+ ["\u9B41", "\u9B41"], /* CJK Ideograph */
+ ["\u9B42", "\u9B42"], /* CJK Ideograph */
+ ["\u9B43", "\u9B43"], /* CJK Ideograph */
+ ["\u9B44", "\u9B44"], /* CJK Ideograph */
+ ["\u9B45", "\u9B45"], /* CJK Ideograph */
+ ["\u9B46", "\u9B46"], /* CJK Ideograph */
+ ["\u9B47", "\u9B47"], /* CJK Ideograph */
+ ["\u9B48", "\u9B48"], /* CJK Ideograph */
+ ["\u9B49", "\u9B49"], /* CJK Ideograph */
+ ["\u9B4A", "\u9B4A"], /* CJK Ideograph */
+ ["\u9B4B", "\u9B4B"], /* CJK Ideograph */
+ ["\u9B4C", "\u9B4C"], /* CJK Ideograph */
+ ["\u9B4D", "\u9B4D"], /* CJK Ideograph */
+ ["\u9B4E", "\u9B4E"], /* CJK Ideograph */
+ ["\u9B4F", "\u9B4F"], /* CJK Ideograph */
+ ["\u9B50", "\u9B50"], /* CJK Ideograph */
+ ["\u9B51", "\u9B51"], /* CJK Ideograph */
+ ["\u9B52", "\u9B52"], /* CJK Ideograph */
+ ["\u9B53", "\u9B53"], /* CJK Ideograph */
+ ["\u9B54", "\u9B54"], /* CJK Ideograph */
+ ["\u9B55", "\u9B55"], /* CJK Ideograph */
+ ["\u9B56", "\u9B56"], /* CJK Ideograph */
+ ["\u9B57", "\u9B57"], /* CJK Ideograph */
+ ["\u9B58", "\u9B58"], /* CJK Ideograph */
+ ["\u9B59", "\u9B59"], /* CJK Ideograph */
+ ["\u9B5A", "\u9B5A"], /* CJK Ideograph */
+ ["\u9B5B", "\u9B5B"], /* CJK Ideograph */
+ ["\u9B5C", "\u9B5C"], /* CJK Ideograph */
+ ["\u9B5D", "\u9B5D"], /* CJK Ideograph */
+ ["\u9B5E", "\u9B5E"], /* CJK Ideograph */
+ ["\u9B5F", "\u9B5F"], /* CJK Ideograph */
+ ["\u9B60", "\u9B60"], /* CJK Ideograph */
+ ["\u9B61", "\u9B61"], /* CJK Ideograph */
+ ["\u9B62", "\u9B62"], /* CJK Ideograph */
+ ["\u9B63", "\u9B63"], /* CJK Ideograph */
+ ["\u9B64", "\u9B64"], /* CJK Ideograph */
+ ["\u9B65", "\u9B65"], /* CJK Ideograph */
+ ["\u9B66", "\u9B66"], /* CJK Ideograph */
+ ["\u9B67", "\u9B67"], /* CJK Ideograph */
+ ["\u9B68", "\u9B68"], /* CJK Ideograph */
+ ["\u9B69", "\u9B69"], /* CJK Ideograph */
+ ["\u9B6A", "\u9B6A"], /* CJK Ideograph */
+ ["\u9B6B", "\u9B6B"], /* CJK Ideograph */
+ ["\u9B6C", "\u9B6C"], /* CJK Ideograph */
+ ["\u9B6D", "\u9B6D"], /* CJK Ideograph */
+ ["\u9B6E", "\u9B6E"], /* CJK Ideograph */
+ ["\u9B6F", "\u9B6F"], /* CJK Ideograph */
+ ["\u9B70", "\u9B70"], /* CJK Ideograph */
+ ["\u9B71", "\u9B71"], /* CJK Ideograph */
+ ["\u9B72", "\u9B72"], /* CJK Ideograph */
+ ["\u9B73", "\u9B73"], /* CJK Ideograph */
+ ["\u9B74", "\u9B74"], /* CJK Ideograph */
+ ["\u9B75", "\u9B75"], /* CJK Ideograph */
+ ["\u9B76", "\u9B76"], /* CJK Ideograph */
+ ["\u9B77", "\u9B77"], /* CJK Ideograph */
+ ["\u9B78", "\u9B78"], /* CJK Ideograph */
+ ["\u9B79", "\u9B79"], /* CJK Ideograph */
+ ["\u9B7A", "\u9B7A"], /* CJK Ideograph */
+ ["\u9B7B", "\u9B7B"], /* CJK Ideograph */
+ ["\u9B7C", "\u9B7C"], /* CJK Ideograph */
+ ["\u9B7D", "\u9B7D"], /* CJK Ideograph */
+ ["\u9B7E", "\u9B7E"], /* CJK Ideograph */
+ ["\u9B7F", "\u9B7F"], /* CJK Ideograph */
+ ["\u9B80", "\u9B80"], /* CJK Ideograph */
+ ["\u9B81", "\u9B81"], /* CJK Ideograph */
+ ["\u9B82", "\u9B82"], /* CJK Ideograph */
+ ["\u9B83", "\u9B83"], /* CJK Ideograph */
+ ["\u9B84", "\u9B84"], /* CJK Ideograph */
+ ["\u9B85", "\u9B85"], /* CJK Ideograph */
+ ["\u9B86", "\u9B86"], /* CJK Ideograph */
+ ["\u9B87", "\u9B87"], /* CJK Ideograph */
+ ["\u9B88", "\u9B88"], /* CJK Ideograph */
+ ["\u9B89", "\u9B89"], /* CJK Ideograph */
+ ["\u9B8A", "\u9B8A"], /* CJK Ideograph */
+ ["\u9B8B", "\u9B8B"], /* CJK Ideograph */
+ ["\u9B8C", "\u9B8C"], /* CJK Ideograph */
+ ["\u9B8D", "\u9B8D"], /* CJK Ideograph */
+ ["\u9B8E", "\u9B8E"], /* CJK Ideograph */
+ ["\u9B8F", "\u9B8F"], /* CJK Ideograph */
+ ["\u9B90", "\u9B90"], /* CJK Ideograph */
+ ["\u9B91", "\u9B91"], /* CJK Ideograph */
+ ["\u9B92", "\u9B92"], /* CJK Ideograph */
+ ["\u9B93", "\u9B93"], /* CJK Ideograph */
+ ["\u9B94", "\u9B94"], /* CJK Ideograph */
+ ["\u9B95", "\u9B95"], /* CJK Ideograph */
+ ["\u9B96", "\u9B96"], /* CJK Ideograph */
+ ["\u9B97", "\u9B97"], /* CJK Ideograph */
+ ["\u9B98", "\u9B98"], /* CJK Ideograph */
+ ["\u9B99", "\u9B99"], /* CJK Ideograph */
+ ["\u9B9A", "\u9B9A"], /* CJK Ideograph */
+ ["\u9B9B", "\u9B9B"], /* CJK Ideograph */
+ ["\u9B9C", "\u9B9C"], /* CJK Ideograph */
+ ["\u9B9D", "\u9B9D"], /* CJK Ideograph */
+ ["\u9B9E", "\u9B9E"], /* CJK Ideograph */
+ ["\u9B9F", "\u9B9F"], /* CJK Ideograph */
+ ["\u9BA0", "\u9BA0"], /* CJK Ideograph */
+ ["\u9BA1", "\u9BA1"], /* CJK Ideograph */
+ ["\u9BA2", "\u9BA2"], /* CJK Ideograph */
+ ["\u9BA3", "\u9BA3"], /* CJK Ideograph */
+ ["\u9BA4", "\u9BA4"], /* CJK Ideograph */
+ ["\u9BA5", "\u9BA5"], /* CJK Ideograph */
+ ["\u9BA6", "\u9BA6"], /* CJK Ideograph */
+ ["\u9BA7", "\u9BA7"], /* CJK Ideograph */
+ ["\u9BA8", "\u9BA8"], /* CJK Ideograph */
+ ["\u9BA9", "\u9BA9"], /* CJK Ideograph */
+ ["\u9BAA", "\u9BAA"], /* CJK Ideograph */
+ ["\u9BAB", "\u9BAB"], /* CJK Ideograph */
+ ["\u9BAC", "\u9BAC"], /* CJK Ideograph */
+ ["\u9BAD", "\u9BAD"], /* CJK Ideograph */
+ ["\u9BAE", "\u9BAE"], /* CJK Ideograph */
+ ["\u9BAF", "\u9BAF"], /* CJK Ideograph */
+ ["\u9BB0", "\u9BB0"], /* CJK Ideograph */
+ ["\u9BB1", "\u9BB1"], /* CJK Ideograph */
+ ["\u9BB2", "\u9BB2"], /* CJK Ideograph */
+ ["\u9BB3", "\u9BB3"], /* CJK Ideograph */
+ ["\u9BB4", "\u9BB4"], /* CJK Ideograph */
+ ["\u9BB5", "\u9BB5"], /* CJK Ideograph */
+ ["\u9BB6", "\u9BB6"], /* CJK Ideograph */
+ ["\u9BB7", "\u9BB7"], /* CJK Ideograph */
+ ["\u9BB8", "\u9BB8"], /* CJK Ideograph */
+ ["\u9BB9", "\u9BB9"], /* CJK Ideograph */
+ ["\u9BBA", "\u9BBA"], /* CJK Ideograph */
+ ["\u9BBB", "\u9BBB"], /* CJK Ideograph */
+ ["\u9BBC", "\u9BBC"], /* CJK Ideograph */
+ ["\u9BBD", "\u9BBD"], /* CJK Ideograph */
+ ["\u9BBE", "\u9BBE"], /* CJK Ideograph */
+ ["\u9BBF", "\u9BBF"], /* CJK Ideograph */
+ ["\u9BC0", "\u9BC0"], /* CJK Ideograph */
+ ["\u9BC1", "\u9BC1"], /* CJK Ideograph */
+ ["\u9BC2", "\u9BC2"], /* CJK Ideograph */
+ ["\u9BC3", "\u9BC3"], /* CJK Ideograph */
+ ["\u9BC4", "\u9BC4"], /* CJK Ideograph */
+ ["\u9BC5", "\u9BC5"], /* CJK Ideograph */
+ ["\u9BC6", "\u9BC6"], /* CJK Ideograph */
+ ["\u9BC7", "\u9BC7"], /* CJK Ideograph */
+ ["\u9BC8", "\u9BC8"], /* CJK Ideograph */
+ ["\u9BC9", "\u9BC9"], /* CJK Ideograph */
+ ["\u9BCA", "\u9BCA"], /* CJK Ideograph */
+ ["\u9BCB", "\u9BCB"], /* CJK Ideograph */
+ ["\u9BCC", "\u9BCC"], /* CJK Ideograph */
+ ["\u9BCD", "\u9BCD"], /* CJK Ideograph */
+ ["\u9BCE", "\u9BCE"], /* CJK Ideograph */
+ ["\u9BCF", "\u9BCF"], /* CJK Ideograph */
+ ["\u9BD0", "\u9BD0"], /* CJK Ideograph */
+ ["\u9BD1", "\u9BD1"], /* CJK Ideograph */
+ ["\u9BD2", "\u9BD2"], /* CJK Ideograph */
+ ["\u9BD3", "\u9BD3"], /* CJK Ideograph */
+ ["\u9BD4", "\u9BD4"], /* CJK Ideograph */
+ ["\u9BD5", "\u9BD5"], /* CJK Ideograph */
+ ["\u9BD6", "\u9BD6"], /* CJK Ideograph */
+ ["\u9BD7", "\u9BD7"], /* CJK Ideograph */
+ ["\u9BD8", "\u9BD8"], /* CJK Ideograph */
+ ["\u9BD9", "\u9BD9"], /* CJK Ideograph */
+ ["\u9BDA", "\u9BDA"], /* CJK Ideograph */
+ ["\u9BDB", "\u9BDB"], /* CJK Ideograph */
+ ["\u9BDC", "\u9BDC"], /* CJK Ideograph */
+ ["\u9BDD", "\u9BDD"], /* CJK Ideograph */
+ ["\u9BDE", "\u9BDE"], /* CJK Ideograph */
+ ["\u9BDF", "\u9BDF"], /* CJK Ideograph */
+ ["\u9BE0", "\u9BE0"], /* CJK Ideograph */
+ ["\u9BE1", "\u9BE1"], /* CJK Ideograph */
+ ["\u9BE2", "\u9BE2"], /* CJK Ideograph */
+ ["\u9BE3", "\u9BE3"], /* CJK Ideograph */
+ ["\u9BE4", "\u9BE4"], /* CJK Ideograph */
+ ["\u9BE5", "\u9BE5"], /* CJK Ideograph */
+ ["\u9BE6", "\u9BE6"], /* CJK Ideograph */
+ ["\u9BE7", "\u9BE7"], /* CJK Ideograph */
+ ["\u9BE8", "\u9BE8"], /* CJK Ideograph */
+ ["\u9BE9", "\u9BE9"], /* CJK Ideograph */
+ ["\u9BEA", "\u9BEA"], /* CJK Ideograph */
+ ["\u9BEB", "\u9BEB"], /* CJK Ideograph */
+ ["\u9BEC", "\u9BEC"], /* CJK Ideograph */
+ ["\u9BED", "\u9BED"], /* CJK Ideograph */
+ ["\u9BEE", "\u9BEE"], /* CJK Ideograph */
+ ["\u9BEF", "\u9BEF"], /* CJK Ideograph */
+ ["\u9BF0", "\u9BF0"], /* CJK Ideograph */
+ ["\u9BF1", "\u9BF1"], /* CJK Ideograph */
+ ["\u9BF2", "\u9BF2"], /* CJK Ideograph */
+ ["\u9BF3", "\u9BF3"], /* CJK Ideograph */
+ ["\u9BF4", "\u9BF4"], /* CJK Ideograph */
+ ["\u9BF5", "\u9BF5"], /* CJK Ideograph */
+ ["\u9BF6", "\u9BF6"], /* CJK Ideograph */
+ ["\u9BF7", "\u9BF7"], /* CJK Ideograph */
+ ["\u9BF8", "\u9BF8"], /* CJK Ideograph */
+ ["\u9BF9", "\u9BF9"], /* CJK Ideograph */
+ ["\u9BFA", "\u9BFA"], /* CJK Ideograph */
+ ["\u9BFB", "\u9BFB"], /* CJK Ideograph */
+ ["\u9BFC", "\u9BFC"], /* CJK Ideograph */
+ ["\u9BFD", "\u9BFD"], /* CJK Ideograph */
+ ["\u9BFE", "\u9BFE"], /* CJK Ideograph */
+ ["\u9BFF", "\u9BFF"], /* CJK Ideograph */
+ ["\u9C00", "\u9C00"], /* CJK Ideograph */
+ ["\u9C01", "\u9C01"], /* CJK Ideograph */
+ ["\u9C02", "\u9C02"], /* CJK Ideograph */
+ ["\u9C03", "\u9C03"], /* CJK Ideograph */
+ ["\u9C04", "\u9C04"], /* CJK Ideograph */
+ ["\u9C05", "\u9C05"], /* CJK Ideograph */
+ ["\u9C06", "\u9C06"], /* CJK Ideograph */
+ ["\u9C07", "\u9C07"], /* CJK Ideograph */
+ ["\u9C08", "\u9C08"], /* CJK Ideograph */
+ ["\u9C09", "\u9C09"], /* CJK Ideograph */
+ ["\u9C0A", "\u9C0A"], /* CJK Ideograph */
+ ["\u9C0B", "\u9C0B"], /* CJK Ideograph */
+ ["\u9C0C", "\u9C0C"], /* CJK Ideograph */
+ ["\u9C0D", "\u9C0D"], /* CJK Ideograph */
+ ["\u9C0E", "\u9C0E"], /* CJK Ideograph */
+ ["\u9C0F", "\u9C0F"], /* CJK Ideograph */
+ ["\u9C10", "\u9C10"], /* CJK Ideograph */
+ ["\u9C11", "\u9C11"], /* CJK Ideograph */
+ ["\u9C12", "\u9C12"], /* CJK Ideograph */
+ ["\u9C13", "\u9C13"], /* CJK Ideograph */
+ ["\u9C14", "\u9C14"], /* CJK Ideograph */
+ ["\u9C15", "\u9C15"], /* CJK Ideograph */
+ ["\u9C16", "\u9C16"], /* CJK Ideograph */
+ ["\u9C17", "\u9C17"], /* CJK Ideograph */
+ ["\u9C18", "\u9C18"], /* CJK Ideograph */
+ ["\u9C19", "\u9C19"], /* CJK Ideograph */
+ ["\u9C1A", "\u9C1A"], /* CJK Ideograph */
+ ["\u9C1B", "\u9C1B"], /* CJK Ideograph */
+ ["\u9C1C", "\u9C1C"], /* CJK Ideograph */
+ ["\u9C1D", "\u9C1D"], /* CJK Ideograph */
+ ["\u9C1E", "\u9C1E"], /* CJK Ideograph */
+ ["\u9C1F", "\u9C1F"], /* CJK Ideograph */
+ ["\u9C20", "\u9C20"], /* CJK Ideograph */
+ ["\u9C21", "\u9C21"], /* CJK Ideograph */
+ ["\u9C22", "\u9C22"], /* CJK Ideograph */
+ ["\u9C23", "\u9C23"], /* CJK Ideograph */
+ ["\u9C24", "\u9C24"], /* CJK Ideograph */
+ ["\u9C25", "\u9C25"], /* CJK Ideograph */
+ ["\u9C26", "\u9C26"], /* CJK Ideograph */
+ ["\u9C27", "\u9C27"], /* CJK Ideograph */
+ ["\u9C28", "\u9C28"], /* CJK Ideograph */
+ ["\u9C29", "\u9C29"], /* CJK Ideograph */
+ ["\u9C2A", "\u9C2A"], /* CJK Ideograph */
+ ["\u9C2B", "\u9C2B"], /* CJK Ideograph */
+ ["\u9C2C", "\u9C2C"], /* CJK Ideograph */
+ ["\u9C2D", "\u9C2D"], /* CJK Ideograph */
+ ["\u9C2E", "\u9C2E"], /* CJK Ideograph */
+ ["\u9C2F", "\u9C2F"], /* CJK Ideograph */
+ ["\u9C30", "\u9C30"], /* CJK Ideograph */
+ ["\u9C31", "\u9C31"], /* CJK Ideograph */
+ ["\u9C32", "\u9C32"], /* CJK Ideograph */
+ ["\u9C33", "\u9C33"], /* CJK Ideograph */
+ ["\u9C34", "\u9C34"], /* CJK Ideograph */
+ ["\u9C35", "\u9C35"], /* CJK Ideograph */
+ ["\u9C36", "\u9C36"], /* CJK Ideograph */
+ ["\u9C37", "\u9C37"], /* CJK Ideograph */
+ ["\u9C38", "\u9C38"], /* CJK Ideograph */
+ ["\u9C39", "\u9C39"], /* CJK Ideograph */
+ ["\u9C3A", "\u9C3A"], /* CJK Ideograph */
+ ["\u9C3B", "\u9C3B"], /* CJK Ideograph */
+ ["\u9C3C", "\u9C3C"], /* CJK Ideograph */
+ ["\u9C3D", "\u9C3D"], /* CJK Ideograph */
+ ["\u9C3E", "\u9C3E"], /* CJK Ideograph */
+ ["\u9C3F", "\u9C3F"], /* CJK Ideograph */
+ ["\u9C40", "\u9C40"], /* CJK Ideograph */
+ ["\u9C41", "\u9C41"], /* CJK Ideograph */
+ ["\u9C42", "\u9C42"], /* CJK Ideograph */
+ ["\u9C43", "\u9C43"], /* CJK Ideograph */
+ ["\u9C44", "\u9C44"], /* CJK Ideograph */
+ ["\u9C45", "\u9C45"], /* CJK Ideograph */
+ ["\u9C46", "\u9C46"], /* CJK Ideograph */
+ ["\u9C47", "\u9C47"], /* CJK Ideograph */
+ ["\u9C48", "\u9C48"], /* CJK Ideograph */
+ ["\u9C49", "\u9C49"], /* CJK Ideograph */
+ ["\u9C4A", "\u9C4A"], /* CJK Ideograph */
+ ["\u9C4B", "\u9C4B"], /* CJK Ideograph */
+ ["\u9C4C", "\u9C4C"], /* CJK Ideograph */
+ ["\u9C4D", "\u9C4D"], /* CJK Ideograph */
+ ["\u9C4E", "\u9C4E"], /* CJK Ideograph */
+ ["\u9C4F", "\u9C4F"], /* CJK Ideograph */
+ ["\u9C50", "\u9C50"], /* CJK Ideograph */
+ ["\u9C51", "\u9C51"], /* CJK Ideograph */
+ ["\u9C52", "\u9C52"], /* CJK Ideograph */
+ ["\u9C53", "\u9C53"], /* CJK Ideograph */
+ ["\u9C54", "\u9C54"], /* CJK Ideograph */
+ ["\u9C55", "\u9C55"], /* CJK Ideograph */
+ ["\u9C56", "\u9C56"], /* CJK Ideograph */
+ ["\u9C57", "\u9C57"], /* CJK Ideograph */
+ ["\u9C58", "\u9C58"], /* CJK Ideograph */
+ ["\u9C59", "\u9C59"], /* CJK Ideograph */
+ ["\u9C5A", "\u9C5A"], /* CJK Ideograph */
+ ["\u9C5B", "\u9C5B"], /* CJK Ideograph */
+ ["\u9C5C", "\u9C5C"], /* CJK Ideograph */
+ ["\u9C5D", "\u9C5D"], /* CJK Ideograph */
+ ["\u9C5E", "\u9C5E"], /* CJK Ideograph */
+ ["\u9C5F", "\u9C5F"], /* CJK Ideograph */
+ ["\u9C60", "\u9C60"], /* CJK Ideograph */
+ ["\u9C61", "\u9C61"], /* CJK Ideograph */
+ ["\u9C62", "\u9C62"], /* CJK Ideograph */
+ ["\u9C63", "\u9C63"], /* CJK Ideograph */
+ ["\u9C64", "\u9C64"], /* CJK Ideograph */
+ ["\u9C65", "\u9C65"], /* CJK Ideograph */
+ ["\u9C66", "\u9C66"], /* CJK Ideograph */
+ ["\u9C67", "\u9C67"], /* CJK Ideograph */
+ ["\u9C68", "\u9C68"], /* CJK Ideograph */
+ ["\u9C69", "\u9C69"], /* CJK Ideograph */
+ ["\u9C6A", "\u9C6A"], /* CJK Ideograph */
+ ["\u9C6B", "\u9C6B"], /* CJK Ideograph */
+ ["\u9C6C", "\u9C6C"], /* CJK Ideograph */
+ ["\u9C6D", "\u9C6D"], /* CJK Ideograph */
+ ["\u9C6E", "\u9C6E"], /* CJK Ideograph */
+ ["\u9C6F", "\u9C6F"], /* CJK Ideograph */
+ ["\u9C70", "\u9C70"], /* CJK Ideograph */
+ ["\u9C71", "\u9C71"], /* CJK Ideograph */
+ ["\u9C72", "\u9C72"], /* CJK Ideograph */
+ ["\u9C73", "\u9C73"], /* CJK Ideograph */
+ ["\u9C74", "\u9C74"], /* CJK Ideograph */
+ ["\u9C75", "\u9C75"], /* CJK Ideograph */
+ ["\u9C76", "\u9C76"], /* CJK Ideograph */
+ ["\u9C77", "\u9C77"], /* CJK Ideograph */
+ ["\u9C78", "\u9C78"], /* CJK Ideograph */
+ ["\u9C79", "\u9C79"], /* CJK Ideograph */
+ ["\u9C7A", "\u9C7A"], /* CJK Ideograph */
+ ["\u9C7B", "\u9C7B"], /* CJK Ideograph */
+ ["\u9C7C", "\u9C7C"], /* CJK Ideograph */
+ ["\u9C7D", "\u9C7D"], /* CJK Ideograph */
+ ["\u9C7E", "\u9C7E"], /* CJK Ideograph */
+ ["\u9C7F", "\u9C7F"], /* CJK Ideograph */
+ ["\u9C80", "\u9C80"], /* CJK Ideograph */
+ ["\u9C81", "\u9C81"], /* CJK Ideograph */
+ ["\u9C82", "\u9C82"], /* CJK Ideograph */
+ ["\u9C83", "\u9C83"], /* CJK Ideograph */
+ ["\u9C84", "\u9C84"], /* CJK Ideograph */
+ ["\u9C85", "\u9C85"], /* CJK Ideograph */
+ ["\u9C86", "\u9C86"], /* CJK Ideograph */
+ ["\u9C87", "\u9C87"], /* CJK Ideograph */
+ ["\u9C88", "\u9C88"], /* CJK Ideograph */
+ ["\u9C89", "\u9C89"], /* CJK Ideograph */
+ ["\u9C8A", "\u9C8A"], /* CJK Ideograph */
+ ["\u9C8B", "\u9C8B"], /* CJK Ideograph */
+ ["\u9C8C", "\u9C8C"], /* CJK Ideograph */
+ ["\u9C8D", "\u9C8D"], /* CJK Ideograph */
+ ["\u9C8E", "\u9C8E"], /* CJK Ideograph */
+ ["\u9C8F", "\u9C8F"], /* CJK Ideograph */
+ ["\u9C90", "\u9C90"], /* CJK Ideograph */
+ ["\u9C91", "\u9C91"], /* CJK Ideograph */
+ ["\u9C92", "\u9C92"], /* CJK Ideograph */
+ ["\u9C93", "\u9C93"], /* CJK Ideograph */
+ ["\u9C94", "\u9C94"], /* CJK Ideograph */
+ ["\u9C95", "\u9C95"], /* CJK Ideograph */
+ ["\u9C96", "\u9C96"], /* CJK Ideograph */
+ ["\u9C97", "\u9C97"], /* CJK Ideograph */
+ ["\u9C98", "\u9C98"], /* CJK Ideograph */
+ ["\u9C99", "\u9C99"], /* CJK Ideograph */
+ ["\u9C9A", "\u9C9A"], /* CJK Ideograph */
+ ["\u9C9B", "\u9C9B"], /* CJK Ideograph */
+ ["\u9C9C", "\u9C9C"], /* CJK Ideograph */
+ ["\u9C9D", "\u9C9D"], /* CJK Ideograph */
+ ["\u9C9E", "\u9C9E"], /* CJK Ideograph */
+ ["\u9C9F", "\u9C9F"], /* CJK Ideograph */
+ ["\u9CA0", "\u9CA0"], /* CJK Ideograph */
+ ["\u9CA1", "\u9CA1"], /* CJK Ideograph */
+ ["\u9CA2", "\u9CA2"], /* CJK Ideograph */
+ ["\u9CA3", "\u9CA3"], /* CJK Ideograph */
+ ["\u9CA4", "\u9CA4"], /* CJK Ideograph */
+ ["\u9CA5", "\u9CA5"], /* CJK Ideograph */
+ ["\u9CA6", "\u9CA6"], /* CJK Ideograph */
+ ["\u9CA7", "\u9CA7"], /* CJK Ideograph */
+ ["\u9CA8", "\u9CA8"], /* CJK Ideograph */
+ ["\u9CA9", "\u9CA9"], /* CJK Ideograph */
+ ["\u9CAA", "\u9CAA"], /* CJK Ideograph */
+ ["\u9CAB", "\u9CAB"], /* CJK Ideograph */
+ ["\u9CAC", "\u9CAC"], /* CJK Ideograph */
+ ["\u9CAD", "\u9CAD"], /* CJK Ideograph */
+ ["\u9CAE", "\u9CAE"], /* CJK Ideograph */
+ ["\u9CAF", "\u9CAF"], /* CJK Ideograph */
+ ["\u9CB0", "\u9CB0"], /* CJK Ideograph */
+ ["\u9CB1", "\u9CB1"], /* CJK Ideograph */
+ ["\u9CB2", "\u9CB2"], /* CJK Ideograph */
+ ["\u9CB3", "\u9CB3"], /* CJK Ideograph */
+ ["\u9CB4", "\u9CB4"], /* CJK Ideograph */
+ ["\u9CB5", "\u9CB5"], /* CJK Ideograph */
+ ["\u9CB6", "\u9CB6"], /* CJK Ideograph */
+ ["\u9CB7", "\u9CB7"], /* CJK Ideograph */
+ ["\u9CB8", "\u9CB8"], /* CJK Ideograph */
+ ["\u9CB9", "\u9CB9"], /* CJK Ideograph */
+ ["\u9CBA", "\u9CBA"], /* CJK Ideograph */
+ ["\u9CBB", "\u9CBB"], /* CJK Ideograph */
+ ["\u9CBC", "\u9CBC"], /* CJK Ideograph */
+ ["\u9CBD", "\u9CBD"], /* CJK Ideograph */
+ ["\u9CBE", "\u9CBE"], /* CJK Ideograph */
+ ["\u9CBF", "\u9CBF"], /* CJK Ideograph */
+ ["\u9CC0", "\u9CC0"], /* CJK Ideograph */
+ ["\u9CC1", "\u9CC1"], /* CJK Ideograph */
+ ["\u9CC2", "\u9CC2"], /* CJK Ideograph */
+ ["\u9CC3", "\u9CC3"], /* CJK Ideograph */
+ ["\u9CC4", "\u9CC4"], /* CJK Ideograph */
+ ["\u9CC5", "\u9CC5"], /* CJK Ideograph */
+ ["\u9CC6", "\u9CC6"], /* CJK Ideograph */
+ ["\u9CC7", "\u9CC7"], /* CJK Ideograph */
+ ["\u9CC8", "\u9CC8"], /* CJK Ideograph */
+ ["\u9CC9", "\u9CC9"], /* CJK Ideograph */
+ ["\u9CCA", "\u9CCA"], /* CJK Ideograph */
+ ["\u9CCB", "\u9CCB"], /* CJK Ideograph */
+ ["\u9CCC", "\u9CCC"], /* CJK Ideograph */
+ ["\u9CCD", "\u9CCD"], /* CJK Ideograph */
+ ["\u9CCE", "\u9CCE"], /* CJK Ideograph */
+ ["\u9CCF", "\u9CCF"], /* CJK Ideograph */
+ ["\u9CD0", "\u9CD0"], /* CJK Ideograph */
+ ["\u9CD1", "\u9CD1"], /* CJK Ideograph */
+ ["\u9CD2", "\u9CD2"], /* CJK Ideograph */
+ ["\u9CD3", "\u9CD3"], /* CJK Ideograph */
+ ["\u9CD4", "\u9CD4"], /* CJK Ideograph */
+ ["\u9CD5", "\u9CD5"], /* CJK Ideograph */
+ ["\u9CD6", "\u9CD6"], /* CJK Ideograph */
+ ["\u9CD7", "\u9CD7"], /* CJK Ideograph */
+ ["\u9CD8", "\u9CD8"], /* CJK Ideograph */
+ ["\u9CD9", "\u9CD9"], /* CJK Ideograph */
+ ["\u9CDA", "\u9CDA"], /* CJK Ideograph */
+ ["\u9CDB", "\u9CDB"], /* CJK Ideograph */
+ ["\u9CDC", "\u9CDC"], /* CJK Ideograph */
+ ["\u9CDD", "\u9CDD"], /* CJK Ideograph */
+ ["\u9CDE", "\u9CDE"], /* CJK Ideograph */
+ ["\u9CDF", "\u9CDF"], /* CJK Ideograph */
+ ["\u9CE0", "\u9CE0"], /* CJK Ideograph */
+ ["\u9CE1", "\u9CE1"], /* CJK Ideograph */
+ ["\u9CE2", "\u9CE2"], /* CJK Ideograph */
+ ["\u9CE3", "\u9CE3"], /* CJK Ideograph */
+ ["\u9CE4", "\u9CE4"], /* CJK Ideograph */
+ ["\u9CE5", "\u9CE5"], /* CJK Ideograph */
+ ["\u9CE6", "\u9CE6"], /* CJK Ideograph */
+ ["\u9CE7", "\u9CE7"], /* CJK Ideograph */
+ ["\u9CE8", "\u9CE8"], /* CJK Ideograph */
+ ["\u9CE9", "\u9CE9"], /* CJK Ideograph */
+ ["\u9CEA", "\u9CEA"], /* CJK Ideograph */
+ ["\u9CEB", "\u9CEB"], /* CJK Ideograph */
+ ["\u9CEC", "\u9CEC"], /* CJK Ideograph */
+ ["\u9CED", "\u9CED"], /* CJK Ideograph */
+ ["\u9CEE", "\u9CEE"], /* CJK Ideograph */
+ ["\u9CEF", "\u9CEF"], /* CJK Ideograph */
+ ["\u9CF0", "\u9CF0"], /* CJK Ideograph */
+ ["\u9CF1", "\u9CF1"], /* CJK Ideograph */
+ ["\u9CF2", "\u9CF2"], /* CJK Ideograph */
+ ["\u9CF3", "\u9CF3"], /* CJK Ideograph */
+ ["\u9CF4", "\u9CF4"], /* CJK Ideograph */
+ ["\u9CF5", "\u9CF5"], /* CJK Ideograph */
+ ["\u9CF6", "\u9CF6"], /* CJK Ideograph */
+ ["\u9CF7", "\u9CF7"], /* CJK Ideograph */
+ ["\u9CF8", "\u9CF8"], /* CJK Ideograph */
+ ["\u9CF9", "\u9CF9"], /* CJK Ideograph */
+ ["\u9CFA", "\u9CFA"], /* CJK Ideograph */
+ ["\u9CFB", "\u9CFB"], /* CJK Ideograph */
+ ["\u9CFC", "\u9CFC"], /* CJK Ideograph */
+ ["\u9CFD", "\u9CFD"], /* CJK Ideograph */
+ ["\u9CFE", "\u9CFE"], /* CJK Ideograph */
+ ["\u9CFF", "\u9CFF"], /* CJK Ideograph */
+ ["\u9D00", "\u9D00"], /* CJK Ideograph */
+ ["\u9D01", "\u9D01"], /* CJK Ideograph */
+ ["\u9D02", "\u9D02"], /* CJK Ideograph */
+ ["\u9D03", "\u9D03"], /* CJK Ideograph */
+ ["\u9D04", "\u9D04"], /* CJK Ideograph */
+ ["\u9D05", "\u9D05"], /* CJK Ideograph */
+ ["\u9D06", "\u9D06"], /* CJK Ideograph */
+ ["\u9D07", "\u9D07"], /* CJK Ideograph */
+ ["\u9D08", "\u9D08"], /* CJK Ideograph */
+ ["\u9D09", "\u9D09"], /* CJK Ideograph */
+ ["\u9D0A", "\u9D0A"], /* CJK Ideograph */
+ ["\u9D0B", "\u9D0B"], /* CJK Ideograph */
+ ["\u9D0C", "\u9D0C"], /* CJK Ideograph */
+ ["\u9D0D", "\u9D0D"], /* CJK Ideograph */
+ ["\u9D0E", "\u9D0E"], /* CJK Ideograph */
+ ["\u9D0F", "\u9D0F"], /* CJK Ideograph */
+ ["\u9D10", "\u9D10"], /* CJK Ideograph */
+ ["\u9D11", "\u9D11"], /* CJK Ideograph */
+ ["\u9D12", "\u9D12"], /* CJK Ideograph */
+ ["\u9D13", "\u9D13"], /* CJK Ideograph */
+ ["\u9D14", "\u9D14"], /* CJK Ideograph */
+ ["\u9D15", "\u9D15"], /* CJK Ideograph */
+ ["\u9D16", "\u9D16"], /* CJK Ideograph */
+ ["\u9D17", "\u9D17"], /* CJK Ideograph */
+ ["\u9D18", "\u9D18"], /* CJK Ideograph */
+ ["\u9D19", "\u9D19"], /* CJK Ideograph */
+ ["\u9D1A", "\u9D1A"], /* CJK Ideograph */
+ ["\u9D1B", "\u9D1B"], /* CJK Ideograph */
+ ["\u9D1C", "\u9D1C"], /* CJK Ideograph */
+ ["\u9D1D", "\u9D1D"], /* CJK Ideograph */
+ ["\u9D1E", "\u9D1E"], /* CJK Ideograph */
+ ["\u9D1F", "\u9D1F"], /* CJK Ideograph */
+ ["\u9D20", "\u9D20"], /* CJK Ideograph */
+ ["\u9D21", "\u9D21"], /* CJK Ideograph */
+ ["\u9D22", "\u9D22"], /* CJK Ideograph */
+ ["\u9D23", "\u9D23"], /* CJK Ideograph */
+ ["\u9D24", "\u9D24"], /* CJK Ideograph */
+ ["\u9D25", "\u9D25"], /* CJK Ideograph */
+ ["\u9D26", "\u9D26"], /* CJK Ideograph */
+ ["\u9D27", "\u9D27"], /* CJK Ideograph */
+ ["\u9D28", "\u9D28"], /* CJK Ideograph */
+ ["\u9D29", "\u9D29"], /* CJK Ideograph */
+ ["\u9D2A", "\u9D2A"], /* CJK Ideograph */
+ ["\u9D2B", "\u9D2B"], /* CJK Ideograph */
+ ["\u9D2C", "\u9D2C"], /* CJK Ideograph */
+ ["\u9D2D", "\u9D2D"], /* CJK Ideograph */
+ ["\u9D2E", "\u9D2E"], /* CJK Ideograph */
+ ["\u9D2F", "\u9D2F"], /* CJK Ideograph */
+ ["\u9D30", "\u9D30"], /* CJK Ideograph */
+ ["\u9D31", "\u9D31"], /* CJK Ideograph */
+ ["\u9D32", "\u9D32"], /* CJK Ideograph */
+ ["\u9D33", "\u9D33"], /* CJK Ideograph */
+ ["\u9D34", "\u9D34"], /* CJK Ideograph */
+ ["\u9D35", "\u9D35"], /* CJK Ideograph */
+ ["\u9D36", "\u9D36"], /* CJK Ideograph */
+ ["\u9D37", "\u9D37"], /* CJK Ideograph */
+ ["\u9D38", "\u9D38"], /* CJK Ideograph */
+ ["\u9D39", "\u9D39"], /* CJK Ideograph */
+ ["\u9D3A", "\u9D3A"], /* CJK Ideograph */
+ ["\u9D3B", "\u9D3B"], /* CJK Ideograph */
+ ["\u9D3C", "\u9D3C"], /* CJK Ideograph */
+ ["\u9D3D", "\u9D3D"], /* CJK Ideograph */
+ ["\u9D3E", "\u9D3E"], /* CJK Ideograph */
+ ["\u9D3F", "\u9D3F"], /* CJK Ideograph */
+ ["\u9D40", "\u9D40"], /* CJK Ideograph */
+ ["\u9D41", "\u9D41"], /* CJK Ideograph */
+ ["\u9D42", "\u9D42"], /* CJK Ideograph */
+ ["\u9D43", "\u9D43"], /* CJK Ideograph */
+ ["\u9D44", "\u9D44"], /* CJK Ideograph */
+ ["\u9D45", "\u9D45"], /* CJK Ideograph */
+ ["\u9D46", "\u9D46"], /* CJK Ideograph */
+ ["\u9D47", "\u9D47"], /* CJK Ideograph */
+ ["\u9D48", "\u9D48"], /* CJK Ideograph */
+ ["\u9D49", "\u9D49"], /* CJK Ideograph */
+ ["\u9D4A", "\u9D4A"], /* CJK Ideograph */
+ ["\u9D4B", "\u9D4B"], /* CJK Ideograph */
+ ["\u9D4C", "\u9D4C"], /* CJK Ideograph */
+ ["\u9D4D", "\u9D4D"], /* CJK Ideograph */
+ ["\u9D4E", "\u9D4E"], /* CJK Ideograph */
+ ["\u9D4F", "\u9D4F"], /* CJK Ideograph */
+ ["\u9D50", "\u9D50"], /* CJK Ideograph */
+ ["\u9D51", "\u9D51"], /* CJK Ideograph */
+ ["\u9D52", "\u9D52"], /* CJK Ideograph */
+ ["\u9D53", "\u9D53"], /* CJK Ideograph */
+ ["\u9D54", "\u9D54"], /* CJK Ideograph */
+ ["\u9D55", "\u9D55"], /* CJK Ideograph */
+ ["\u9D56", "\u9D56"], /* CJK Ideograph */
+ ["\u9D57", "\u9D57"], /* CJK Ideograph */
+ ["\u9D58", "\u9D58"], /* CJK Ideograph */
+ ["\u9D59", "\u9D59"], /* CJK Ideograph */
+ ["\u9D5A", "\u9D5A"], /* CJK Ideograph */
+ ["\u9D5B", "\u9D5B"], /* CJK Ideograph */
+ ["\u9D5C", "\u9D5C"], /* CJK Ideograph */
+ ["\u9D5D", "\u9D5D"], /* CJK Ideograph */
+ ["\u9D5E", "\u9D5E"], /* CJK Ideograph */
+ ["\u9D5F", "\u9D5F"], /* CJK Ideograph */
+ ["\u9D60", "\u9D60"], /* CJK Ideograph */
+ ["\u9D61", "\u9D61"], /* CJK Ideograph */
+ ["\u9D62", "\u9D62"], /* CJK Ideograph */
+ ["\u9D63", "\u9D63"], /* CJK Ideograph */
+ ["\u9D64", "\u9D64"], /* CJK Ideograph */
+ ["\u9D65", "\u9D65"], /* CJK Ideograph */
+ ["\u9D66", "\u9D66"], /* CJK Ideograph */
+ ["\u9D67", "\u9D67"], /* CJK Ideograph */
+ ["\u9D68", "\u9D68"], /* CJK Ideograph */
+ ["\u9D69", "\u9D69"], /* CJK Ideograph */
+ ["\u9D6A", "\u9D6A"], /* CJK Ideograph */
+ ["\u9D6B", "\u9D6B"], /* CJK Ideograph */
+ ["\u9D6C", "\u9D6C"], /* CJK Ideograph */
+ ["\u9D6D", "\u9D6D"], /* CJK Ideograph */
+ ["\u9D6E", "\u9D6E"], /* CJK Ideograph */
+ ["\u9D6F", "\u9D6F"], /* CJK Ideograph */
+ ["\u9D70", "\u9D70"], /* CJK Ideograph */
+ ["\u9D71", "\u9D71"], /* CJK Ideograph */
+ ["\u9D72", "\u9D72"], /* CJK Ideograph */
+ ["\u9D73", "\u9D73"], /* CJK Ideograph */
+ ["\u9D74", "\u9D74"], /* CJK Ideograph */
+ ["\u9D75", "\u9D75"], /* CJK Ideograph */
+ ["\u9D76", "\u9D76"], /* CJK Ideograph */
+ ["\u9D77", "\u9D77"], /* CJK Ideograph */
+ ["\u9D78", "\u9D78"], /* CJK Ideograph */
+ ["\u9D79", "\u9D79"], /* CJK Ideograph */
+ ["\u9D7A", "\u9D7A"], /* CJK Ideograph */
+ ["\u9D7B", "\u9D7B"], /* CJK Ideograph */
+ ["\u9D7C", "\u9D7C"], /* CJK Ideograph */
+ ["\u9D7D", "\u9D7D"], /* CJK Ideograph */
+ ["\u9D7E", "\u9D7E"], /* CJK Ideograph */
+ ["\u9D7F", "\u9D7F"], /* CJK Ideograph */
+ ["\u9D80", "\u9D80"], /* CJK Ideograph */
+ ["\u9D81", "\u9D81"], /* CJK Ideograph */
+ ["\u9D82", "\u9D82"], /* CJK Ideograph */
+ ["\u9D83", "\u9D83"], /* CJK Ideograph */
+ ["\u9D84", "\u9D84"], /* CJK Ideograph */
+ ["\u9D85", "\u9D85"], /* CJK Ideograph */
+ ["\u9D86", "\u9D86"], /* CJK Ideograph */
+ ["\u9D87", "\u9D87"], /* CJK Ideograph */
+ ["\u9D88", "\u9D88"], /* CJK Ideograph */
+ ["\u9D89", "\u9D89"], /* CJK Ideograph */
+ ["\u9D8A", "\u9D8A"], /* CJK Ideograph */
+ ["\u9D8B", "\u9D8B"], /* CJK Ideograph */
+ ["\u9D8C", "\u9D8C"], /* CJK Ideograph */
+ ["\u9D8D", "\u9D8D"], /* CJK Ideograph */
+ ["\u9D8E", "\u9D8E"], /* CJK Ideograph */
+ ["\u9D8F", "\u9D8F"], /* CJK Ideograph */
+ ["\u9D90", "\u9D90"], /* CJK Ideograph */
+ ["\u9D91", "\u9D91"], /* CJK Ideograph */
+ ["\u9D92", "\u9D92"], /* CJK Ideograph */
+ ["\u9D93", "\u9D93"], /* CJK Ideograph */
+ ["\u9D94", "\u9D94"], /* CJK Ideograph */
+ ["\u9D95", "\u9D95"], /* CJK Ideograph */
+ ["\u9D96", "\u9D96"], /* CJK Ideograph */
+ ["\u9D97", "\u9D97"], /* CJK Ideograph */
+ ["\u9D98", "\u9D98"], /* CJK Ideograph */
+ ["\u9D99", "\u9D99"], /* CJK Ideograph */
+ ["\u9D9A", "\u9D9A"], /* CJK Ideograph */
+ ["\u9D9B", "\u9D9B"], /* CJK Ideograph */
+ ["\u9D9C", "\u9D9C"], /* CJK Ideograph */
+ ["\u9D9D", "\u9D9D"], /* CJK Ideograph */
+ ["\u9D9E", "\u9D9E"], /* CJK Ideograph */
+ ["\u9D9F", "\u9D9F"], /* CJK Ideograph */
+ ["\u9DA0", "\u9DA0"], /* CJK Ideograph */
+ ["\u9DA1", "\u9DA1"], /* CJK Ideograph */
+ ["\u9DA2", "\u9DA2"], /* CJK Ideograph */
+ ["\u9DA3", "\u9DA3"], /* CJK Ideograph */
+ ["\u9DA4", "\u9DA4"], /* CJK Ideograph */
+ ["\u9DA5", "\u9DA5"], /* CJK Ideograph */
+ ["\u9DA6", "\u9DA6"], /* CJK Ideograph */
+ ["\u9DA7", "\u9DA7"], /* CJK Ideograph */
+ ["\u9DA8", "\u9DA8"], /* CJK Ideograph */
+ ["\u9DA9", "\u9DA9"], /* CJK Ideograph */
+ ["\u9DAA", "\u9DAA"], /* CJK Ideograph */
+ ["\u9DAB", "\u9DAB"], /* CJK Ideograph */
+ ["\u9DAC", "\u9DAC"], /* CJK Ideograph */
+ ["\u9DAD", "\u9DAD"], /* CJK Ideograph */
+ ["\u9DAE", "\u9DAE"], /* CJK Ideograph */
+ ["\u9DAF", "\u9DAF"], /* CJK Ideograph */
+ ["\u9DB0", "\u9DB0"], /* CJK Ideograph */
+ ["\u9DB1", "\u9DB1"], /* CJK Ideograph */
+ ["\u9DB2", "\u9DB2"], /* CJK Ideograph */
+ ["\u9DB3", "\u9DB3"], /* CJK Ideograph */
+ ["\u9DB4", "\u9DB4"], /* CJK Ideograph */
+ ["\u9DB5", "\u9DB5"], /* CJK Ideograph */
+ ["\u9DB6", "\u9DB6"], /* CJK Ideograph */
+ ["\u9DB7", "\u9DB7"], /* CJK Ideograph */
+ ["\u9DB8", "\u9DB8"], /* CJK Ideograph */
+ ["\u9DB9", "\u9DB9"], /* CJK Ideograph */
+ ["\u9DBA", "\u9DBA"], /* CJK Ideograph */
+ ["\u9DBB", "\u9DBB"], /* CJK Ideograph */
+ ["\u9DBC", "\u9DBC"], /* CJK Ideograph */
+ ["\u9DBD", "\u9DBD"], /* CJK Ideograph */
+ ["\u9DBE", "\u9DBE"], /* CJK Ideograph */
+ ["\u9DBF", "\u9DBF"], /* CJK Ideograph */
+ ["\u9DC0", "\u9DC0"], /* CJK Ideograph */
+ ["\u9DC1", "\u9DC1"], /* CJK Ideograph */
+ ["\u9DC2", "\u9DC2"], /* CJK Ideograph */
+ ["\u9DC3", "\u9DC3"], /* CJK Ideograph */
+ ["\u9DC4", "\u9DC4"], /* CJK Ideograph */
+ ["\u9DC5", "\u9DC5"], /* CJK Ideograph */
+ ["\u9DC6", "\u9DC6"], /* CJK Ideograph */
+ ["\u9DC7", "\u9DC7"], /* CJK Ideograph */
+ ["\u9DC8", "\u9DC8"], /* CJK Ideograph */
+ ["\u9DC9", "\u9DC9"], /* CJK Ideograph */
+ ["\u9DCA", "\u9DCA"], /* CJK Ideograph */
+ ["\u9DCB", "\u9DCB"], /* CJK Ideograph */
+ ["\u9DCC", "\u9DCC"], /* CJK Ideograph */
+ ["\u9DCD", "\u9DCD"], /* CJK Ideograph */
+ ["\u9DCE", "\u9DCE"], /* CJK Ideograph */
+ ["\u9DCF", "\u9DCF"], /* CJK Ideograph */
+ ["\u9DD0", "\u9DD0"], /* CJK Ideograph */
+ ["\u9DD1", "\u9DD1"], /* CJK Ideograph */
+ ["\u9DD2", "\u9DD2"], /* CJK Ideograph */
+ ["\u9DD3", "\u9DD3"], /* CJK Ideograph */
+ ["\u9DD4", "\u9DD4"], /* CJK Ideograph */
+ ["\u9DD5", "\u9DD5"], /* CJK Ideograph */
+ ["\u9DD6", "\u9DD6"], /* CJK Ideograph */
+ ["\u9DD7", "\u9DD7"], /* CJK Ideograph */
+ ["\u9DD8", "\u9DD8"], /* CJK Ideograph */
+ ["\u9DD9", "\u9DD9"], /* CJK Ideograph */
+ ["\u9DDA", "\u9DDA"], /* CJK Ideograph */
+ ["\u9DDB", "\u9DDB"], /* CJK Ideograph */
+ ["\u9DDC", "\u9DDC"], /* CJK Ideograph */
+ ["\u9DDD", "\u9DDD"], /* CJK Ideograph */
+ ["\u9DDE", "\u9DDE"], /* CJK Ideograph */
+ ["\u9DDF", "\u9DDF"], /* CJK Ideograph */
+ ["\u9DE0", "\u9DE0"], /* CJK Ideograph */
+ ["\u9DE1", "\u9DE1"], /* CJK Ideograph */
+ ["\u9DE2", "\u9DE2"], /* CJK Ideograph */
+ ["\u9DE3", "\u9DE3"], /* CJK Ideograph */
+ ["\u9DE4", "\u9DE4"], /* CJK Ideograph */
+ ["\u9DE5", "\u9DE5"], /* CJK Ideograph */
+ ["\u9DE6", "\u9DE6"], /* CJK Ideograph */
+ ["\u9DE7", "\u9DE7"], /* CJK Ideograph */
+ ["\u9DE8", "\u9DE8"], /* CJK Ideograph */
+ ["\u9DE9", "\u9DE9"], /* CJK Ideograph */
+ ["\u9DEA", "\u9DEA"], /* CJK Ideograph */
+ ["\u9DEB", "\u9DEB"], /* CJK Ideograph */
+ ["\u9DEC", "\u9DEC"], /* CJK Ideograph */
+ ["\u9DED", "\u9DED"], /* CJK Ideograph */
+ ["\u9DEE", "\u9DEE"], /* CJK Ideograph */
+ ["\u9DEF", "\u9DEF"], /* CJK Ideograph */
+ ["\u9DF0", "\u9DF0"], /* CJK Ideograph */
+ ["\u9DF1", "\u9DF1"], /* CJK Ideograph */
+ ["\u9DF2", "\u9DF2"], /* CJK Ideograph */
+ ["\u9DF3", "\u9DF3"], /* CJK Ideograph */
+ ["\u9DF4", "\u9DF4"], /* CJK Ideograph */
+ ["\u9DF5", "\u9DF5"], /* CJK Ideograph */
+ ["\u9DF6", "\u9DF6"], /* CJK Ideograph */
+ ["\u9DF7", "\u9DF7"], /* CJK Ideograph */
+ ["\u9DF8", "\u9DF8"], /* CJK Ideograph */
+ ["\u9DF9", "\u9DF9"], /* CJK Ideograph */
+ ["\u9DFA", "\u9DFA"], /* CJK Ideograph */
+ ["\u9DFB", "\u9DFB"], /* CJK Ideograph */
+ ["\u9DFC", "\u9DFC"], /* CJK Ideograph */
+ ["\u9DFD", "\u9DFD"], /* CJK Ideograph */
+ ["\u9DFE", "\u9DFE"], /* CJK Ideograph */
+ ["\u9DFF", "\u9DFF"], /* CJK Ideograph */
+ ["\u9E00", "\u9E00"], /* CJK Ideograph */
+ ["\u9E01", "\u9E01"], /* CJK Ideograph */
+ ["\u9E02", "\u9E02"], /* CJK Ideograph */
+ ["\u9E03", "\u9E03"], /* CJK Ideograph */
+ ["\u9E04", "\u9E04"], /* CJK Ideograph */
+ ["\u9E05", "\u9E05"], /* CJK Ideograph */
+ ["\u9E06", "\u9E06"], /* CJK Ideograph */
+ ["\u9E07", "\u9E07"], /* CJK Ideograph */
+ ["\u9E08", "\u9E08"], /* CJK Ideograph */
+ ["\u9E09", "\u9E09"], /* CJK Ideograph */
+ ["\u9E0A", "\u9E0A"], /* CJK Ideograph */
+ ["\u9E0B", "\u9E0B"], /* CJK Ideograph */
+ ["\u9E0C", "\u9E0C"], /* CJK Ideograph */
+ ["\u9E0D", "\u9E0D"], /* CJK Ideograph */
+ ["\u9E0E", "\u9E0E"], /* CJK Ideograph */
+ ["\u9E0F", "\u9E0F"], /* CJK Ideograph */
+ ["\u9E10", "\u9E10"], /* CJK Ideograph */
+ ["\u9E11", "\u9E11"], /* CJK Ideograph */
+ ["\u9E12", "\u9E12"], /* CJK Ideograph */
+ ["\u9E13", "\u9E13"], /* CJK Ideograph */
+ ["\u9E14", "\u9E14"], /* CJK Ideograph */
+ ["\u9E15", "\u9E15"], /* CJK Ideograph */
+ ["\u9E16", "\u9E16"], /* CJK Ideograph */
+ ["\u9E17", "\u9E17"], /* CJK Ideograph */
+ ["\u9E18", "\u9E18"], /* CJK Ideograph */
+ ["\u9E19", "\u9E19"], /* CJK Ideograph */
+ ["\u9E1A", "\u9E1A"], /* CJK Ideograph */
+ ["\u9E1B", "\u9E1B"], /* CJK Ideograph */
+ ["\u9E1C", "\u9E1C"], /* CJK Ideograph */
+ ["\u9E1D", "\u9E1D"], /* CJK Ideograph */
+ ["\u9E1E", "\u9E1E"], /* CJK Ideograph */
+ ["\u9E1F", "\u9E1F"], /* CJK Ideograph */
+ ["\u9E20", "\u9E20"], /* CJK Ideograph */
+ ["\u9E21", "\u9E21"], /* CJK Ideograph */
+ ["\u9E22", "\u9E22"], /* CJK Ideograph */
+ ["\u9E23", "\u9E23"], /* CJK Ideograph */
+ ["\u9E24", "\u9E24"], /* CJK Ideograph */
+ ["\u9E25", "\u9E25"], /* CJK Ideograph */
+ ["\u9E26", "\u9E26"], /* CJK Ideograph */
+ ["\u9E27", "\u9E27"], /* CJK Ideograph */
+ ["\u9E28", "\u9E28"], /* CJK Ideograph */
+ ["\u9E29", "\u9E29"], /* CJK Ideograph */
+ ["\u9E2A", "\u9E2A"], /* CJK Ideograph */
+ ["\u9E2B", "\u9E2B"], /* CJK Ideograph */
+ ["\u9E2C", "\u9E2C"], /* CJK Ideograph */
+ ["\u9E2D", "\u9E2D"], /* CJK Ideograph */
+ ["\u9E2E", "\u9E2E"], /* CJK Ideograph */
+ ["\u9E2F", "\u9E2F"], /* CJK Ideograph */
+ ["\u9E30", "\u9E30"], /* CJK Ideograph */
+ ["\u9E31", "\u9E31"], /* CJK Ideograph */
+ ["\u9E32", "\u9E32"], /* CJK Ideograph */
+ ["\u9E33", "\u9E33"], /* CJK Ideograph */
+ ["\u9E34", "\u9E34"], /* CJK Ideograph */
+ ["\u9E35", "\u9E35"], /* CJK Ideograph */
+ ["\u9E36", "\u9E36"], /* CJK Ideograph */
+ ["\u9E37", "\u9E37"], /* CJK Ideograph */
+ ["\u9E38", "\u9E38"], /* CJK Ideograph */
+ ["\u9E39", "\u9E39"], /* CJK Ideograph */
+ ["\u9E3A", "\u9E3A"], /* CJK Ideograph */
+ ["\u9E3B", "\u9E3B"], /* CJK Ideograph */
+ ["\u9E3C", "\u9E3C"], /* CJK Ideograph */
+ ["\u9E3D", "\u9E3D"], /* CJK Ideograph */
+ ["\u9E3E", "\u9E3E"], /* CJK Ideograph */
+ ["\u9E3F", "\u9E3F"], /* CJK Ideograph */
+ ["\u9E40", "\u9E40"], /* CJK Ideograph */
+ ["\u9E41", "\u9E41"], /* CJK Ideograph */
+ ["\u9E42", "\u9E42"], /* CJK Ideograph */
+ ["\u9E43", "\u9E43"], /* CJK Ideograph */
+ ["\u9E44", "\u9E44"], /* CJK Ideograph */
+ ["\u9E45", "\u9E45"], /* CJK Ideograph */
+ ["\u9E46", "\u9E46"], /* CJK Ideograph */
+ ["\u9E47", "\u9E47"], /* CJK Ideograph */
+ ["\u9E48", "\u9E48"], /* CJK Ideograph */
+ ["\u9E49", "\u9E49"], /* CJK Ideograph */
+ ["\u9E4A", "\u9E4A"], /* CJK Ideograph */
+ ["\u9E4B", "\u9E4B"], /* CJK Ideograph */
+ ["\u9E4C", "\u9E4C"], /* CJK Ideograph */
+ ["\u9E4D", "\u9E4D"], /* CJK Ideograph */
+ ["\u9E4E", "\u9E4E"], /* CJK Ideograph */
+ ["\u9E4F", "\u9E4F"], /* CJK Ideograph */
+ ["\u9E50", "\u9E50"], /* CJK Ideograph */
+ ["\u9E51", "\u9E51"], /* CJK Ideograph */
+ ["\u9E52", "\u9E52"], /* CJK Ideograph */
+ ["\u9E53", "\u9E53"], /* CJK Ideograph */
+ ["\u9E54", "\u9E54"], /* CJK Ideograph */
+ ["\u9E55", "\u9E55"], /* CJK Ideograph */
+ ["\u9E56", "\u9E56"], /* CJK Ideograph */
+ ["\u9E57", "\u9E57"], /* CJK Ideograph */
+ ["\u9E58", "\u9E58"], /* CJK Ideograph */
+ ["\u9E59", "\u9E59"], /* CJK Ideograph */
+ ["\u9E5A", "\u9E5A"], /* CJK Ideograph */
+ ["\u9E5B", "\u9E5B"], /* CJK Ideograph */
+ ["\u9E5C", "\u9E5C"], /* CJK Ideograph */
+ ["\u9E5D", "\u9E5D"], /* CJK Ideograph */
+ ["\u9E5E", "\u9E5E"], /* CJK Ideograph */
+ ["\u9E5F", "\u9E5F"], /* CJK Ideograph */
+ ["\u9E60", "\u9E60"], /* CJK Ideograph */
+ ["\u9E61", "\u9E61"], /* CJK Ideograph */
+ ["\u9E62", "\u9E62"], /* CJK Ideograph */
+ ["\u9E63", "\u9E63"], /* CJK Ideograph */
+ ["\u9E64", "\u9E64"], /* CJK Ideograph */
+ ["\u9E65", "\u9E65"], /* CJK Ideograph */
+ ["\u9E66", "\u9E66"], /* CJK Ideograph */
+ ["\u9E67", "\u9E67"], /* CJK Ideograph */
+ ["\u9E68", "\u9E68"], /* CJK Ideograph */
+ ["\u9E69", "\u9E69"], /* CJK Ideograph */
+ ["\u9E6A", "\u9E6A"], /* CJK Ideograph */
+ ["\u9E6B", "\u9E6B"], /* CJK Ideograph */
+ ["\u9E6C", "\u9E6C"], /* CJK Ideograph */
+ ["\u9E6D", "\u9E6D"], /* CJK Ideograph */
+ ["\u9E6E", "\u9E6E"], /* CJK Ideograph */
+ ["\u9E6F", "\u9E6F"], /* CJK Ideograph */
+ ["\u9E70", "\u9E70"], /* CJK Ideograph */
+ ["\u9E71", "\u9E71"], /* CJK Ideograph */
+ ["\u9E72", "\u9E72"], /* CJK Ideograph */
+ ["\u9E73", "\u9E73"], /* CJK Ideograph */
+ ["\u9E74", "\u9E74"], /* CJK Ideograph */
+ ["\u9E75", "\u9E75"], /* CJK Ideograph */
+ ["\u9E76", "\u9E76"], /* CJK Ideograph */
+ ["\u9E77", "\u9E77"], /* CJK Ideograph */
+ ["\u9E78", "\u9E78"], /* CJK Ideograph */
+ ["\u9E79", "\u9E79"], /* CJK Ideograph */
+ ["\u9E7A", "\u9E7A"], /* CJK Ideograph */
+ ["\u9E7B", "\u9E7B"], /* CJK Ideograph */
+ ["\u9E7C", "\u9E7C"], /* CJK Ideograph */
+ ["\u9E7D", "\u9E7D"], /* CJK Ideograph */
+ ["\u9E7E", "\u9E7E"], /* CJK Ideograph */
+ ["\u9E7F", "\u9E7F"], /* CJK Ideograph */
+ ["\u9E80", "\u9E80"], /* CJK Ideograph */
+ ["\u9E81", "\u9E81"], /* CJK Ideograph */
+ ["\u9E82", "\u9E82"], /* CJK Ideograph */
+ ["\u9E83", "\u9E83"], /* CJK Ideograph */
+ ["\u9E84", "\u9E84"], /* CJK Ideograph */
+ ["\u9E85", "\u9E85"], /* CJK Ideograph */
+ ["\u9E86", "\u9E86"], /* CJK Ideograph */
+ ["\u9E87", "\u9E87"], /* CJK Ideograph */
+ ["\u9E88", "\u9E88"], /* CJK Ideograph */
+ ["\u9E89", "\u9E89"], /* CJK Ideograph */
+ ["\u9E8A", "\u9E8A"], /* CJK Ideograph */
+ ["\u9E8B", "\u9E8B"], /* CJK Ideograph */
+ ["\u9E8C", "\u9E8C"], /* CJK Ideograph */
+ ["\u9E8D", "\u9E8D"], /* CJK Ideograph */
+ ["\u9E8E", "\u9E8E"], /* CJK Ideograph */
+ ["\u9E8F", "\u9E8F"], /* CJK Ideograph */
+ ["\u9E90", "\u9E90"], /* CJK Ideograph */
+ ["\u9E91", "\u9E91"], /* CJK Ideograph */
+ ["\u9E92", "\u9E92"], /* CJK Ideograph */
+ ["\u9E93", "\u9E93"], /* CJK Ideograph */
+ ["\u9E94", "\u9E94"], /* CJK Ideograph */
+ ["\u9E95", "\u9E95"], /* CJK Ideograph */
+ ["\u9E96", "\u9E96"], /* CJK Ideograph */
+ ["\u9E97", "\u9E97"], /* CJK Ideograph */
+ ["\u9E98", "\u9E98"], /* CJK Ideograph */
+ ["\u9E99", "\u9E99"], /* CJK Ideograph */
+ ["\u9E9A", "\u9E9A"], /* CJK Ideograph */
+ ["\u9E9B", "\u9E9B"], /* CJK Ideograph */
+ ["\u9E9C", "\u9E9C"], /* CJK Ideograph */
+ ["\u9E9D", "\u9E9D"], /* CJK Ideograph */
+ ["\u9E9E", "\u9E9E"], /* CJK Ideograph */
+ ["\u9E9F", "\u9E9F"], /* CJK Ideograph */
+ ["\u9EA0", "\u9EA0"], /* CJK Ideograph */
+ ["\u9EA1", "\u9EA1"], /* CJK Ideograph */
+ ["\u9EA2", "\u9EA2"], /* CJK Ideograph */
+ ["\u9EA3", "\u9EA3"], /* CJK Ideograph */
+ ["\u9EA4", "\u9EA4"], /* CJK Ideograph */
+ ["\u9EA5", "\u9EA5"], /* CJK Ideograph */
+ ["\u9EA6", "\u9EA6"], /* CJK Ideograph */
+ ["\u9EA7", "\u9EA7"], /* CJK Ideograph */
+ ["\u9EA8", "\u9EA8"], /* CJK Ideograph */
+ ["\u9EA9", "\u9EA9"], /* CJK Ideograph */
+ ["\u9EAA", "\u9EAA"], /* CJK Ideograph */
+ ["\u9EAB", "\u9EAB"], /* CJK Ideograph */
+ ["\u9EAC", "\u9EAC"], /* CJK Ideograph */
+ ["\u9EAD", "\u9EAD"], /* CJK Ideograph */
+ ["\u9EAE", "\u9EAE"], /* CJK Ideograph */
+ ["\u9EAF", "\u9EAF"], /* CJK Ideograph */
+ ["\u9EB0", "\u9EB0"], /* CJK Ideograph */
+ ["\u9EB1", "\u9EB1"], /* CJK Ideograph */
+ ["\u9EB2", "\u9EB2"], /* CJK Ideograph */
+ ["\u9EB3", "\u9EB3"], /* CJK Ideograph */
+ ["\u9EB4", "\u9EB4"], /* CJK Ideograph */
+ ["\u9EB5", "\u9EB5"], /* CJK Ideograph */
+ ["\u9EB6", "\u9EB6"], /* CJK Ideograph */
+ ["\u9EB7", "\u9EB7"], /* CJK Ideograph */
+ ["\u9EB8", "\u9EB8"], /* CJK Ideograph */
+ ["\u9EB9", "\u9EB9"], /* CJK Ideograph */
+ ["\u9EBA", "\u9EBA"], /* CJK Ideograph */
+ ["\u9EBB", "\u9EBB"], /* CJK Ideograph */
+ ["\u9EBC", "\u9EBC"], /* CJK Ideograph */
+ ["\u9EBD", "\u9EBD"], /* CJK Ideograph */
+ ["\u9EBE", "\u9EBE"], /* CJK Ideograph */
+ ["\u9EBF", "\u9EBF"], /* CJK Ideograph */
+ ["\u9EC0", "\u9EC0"], /* CJK Ideograph */
+ ["\u9EC1", "\u9EC1"], /* CJK Ideograph */
+ ["\u9EC2", "\u9EC2"], /* CJK Ideograph */
+ ["\u9EC3", "\u9EC3"], /* CJK Ideograph */
+ ["\u9EC4", "\u9EC4"], /* CJK Ideograph */
+ ["\u9EC5", "\u9EC5"], /* CJK Ideograph */
+ ["\u9EC6", "\u9EC6"], /* CJK Ideograph */
+ ["\u9EC7", "\u9EC7"], /* CJK Ideograph */
+ ["\u9EC8", "\u9EC8"], /* CJK Ideograph */
+ ["\u9EC9", "\u9EC9"], /* CJK Ideograph */
+ ["\u9ECA", "\u9ECA"], /* CJK Ideograph */
+ ["\u9ECB", "\u9ECB"], /* CJK Ideograph */
+ ["\u9ECC", "\u9ECC"], /* CJK Ideograph */
+ ["\u9ECD", "\u9ECD"], /* CJK Ideograph */
+ ["\u9ECE", "\u9ECE"], /* CJK Ideograph */
+ ["\u9ECF", "\u9ECF"], /* CJK Ideograph */
+ ["\u9ED0", "\u9ED0"], /* CJK Ideograph */
+ ["\u9ED1", "\u9ED1"], /* CJK Ideograph */
+ ["\u9ED2", "\u9ED2"], /* CJK Ideograph */
+ ["\u9ED3", "\u9ED3"], /* CJK Ideograph */
+ ["\u9ED4", "\u9ED4"], /* CJK Ideograph */
+ ["\u9ED5", "\u9ED5"], /* CJK Ideograph */
+ ["\u9ED6", "\u9ED6"], /* CJK Ideograph */
+ ["\u9ED7", "\u9ED7"], /* CJK Ideograph */
+ ["\u9ED8", "\u9ED8"], /* CJK Ideograph */
+ ["\u9ED9", "\u9ED9"], /* CJK Ideograph */
+ ["\u9EDA", "\u9EDA"], /* CJK Ideograph */
+ ["\u9EDB", "\u9EDB"], /* CJK Ideograph */
+ ["\u9EDC", "\u9EDC"], /* CJK Ideograph */
+ ["\u9EDD", "\u9EDD"], /* CJK Ideograph */
+ ["\u9EDE", "\u9EDE"], /* CJK Ideograph */
+ ["\u9EDF", "\u9EDF"], /* CJK Ideograph */
+ ["\u9EE0", "\u9EE0"], /* CJK Ideograph */
+ ["\u9EE1", "\u9EE1"], /* CJK Ideograph */
+ ["\u9EE2", "\u9EE2"], /* CJK Ideograph */
+ ["\u9EE3", "\u9EE3"], /* CJK Ideograph */
+ ["\u9EE4", "\u9EE4"], /* CJK Ideograph */
+ ["\u9EE5", "\u9EE5"], /* CJK Ideograph */
+ ["\u9EE6", "\u9EE6"], /* CJK Ideograph */
+ ["\u9EE7", "\u9EE7"], /* CJK Ideograph */
+ ["\u9EE8", "\u9EE8"], /* CJK Ideograph */
+ ["\u9EE9", "\u9EE9"], /* CJK Ideograph */
+ ["\u9EEA", "\u9EEA"], /* CJK Ideograph */
+ ["\u9EEB", "\u9EEB"], /* CJK Ideograph */
+ ["\u9EEC", "\u9EEC"], /* CJK Ideograph */
+ ["\u9EED", "\u9EED"], /* CJK Ideograph */
+ ["\u9EEE", "\u9EEE"], /* CJK Ideograph */
+ ["\u9EEF", "\u9EEF"], /* CJK Ideograph */
+ ["\u9EF0", "\u9EF0"], /* CJK Ideograph */
+ ["\u9EF1", "\u9EF1"], /* CJK Ideograph */
+ ["\u9EF2", "\u9EF2"], /* CJK Ideograph */
+ ["\u9EF3", "\u9EF3"], /* CJK Ideograph */
+ ["\u9EF4", "\u9EF4"], /* CJK Ideograph */
+ ["\u9EF5", "\u9EF5"], /* CJK Ideograph */
+ ["\u9EF6", "\u9EF6"], /* CJK Ideograph */
+ ["\u9EF7", "\u9EF7"], /* CJK Ideograph */
+ ["\u9EF8", "\u9EF8"], /* CJK Ideograph */
+ ["\u9EF9", "\u9EF9"], /* CJK Ideograph */
+ ["\u9EFA", "\u9EFA"], /* CJK Ideograph */
+ ["\u9EFB", "\u9EFB"], /* CJK Ideograph */
+ ["\u9EFC", "\u9EFC"], /* CJK Ideograph */
+ ["\u9EFD", "\u9EFD"], /* CJK Ideograph */
+ ["\u9EFE", "\u9EFE"], /* CJK Ideograph */
+ ["\u9EFF", "\u9EFF"], /* CJK Ideograph */
+ ["\u9F00", "\u9F00"], /* CJK Ideograph */
+ ["\u9F01", "\u9F01"], /* CJK Ideograph */
+ ["\u9F02", "\u9F02"], /* CJK Ideograph */
+ ["\u9F03", "\u9F03"], /* CJK Ideograph */
+ ["\u9F04", "\u9F04"], /* CJK Ideograph */
+ ["\u9F05", "\u9F05"], /* CJK Ideograph */
+ ["\u9F06", "\u9F06"], /* CJK Ideograph */
+ ["\u9F07", "\u9F07"], /* CJK Ideograph */
+ ["\u9F08", "\u9F08"], /* CJK Ideograph */
+ ["\u9F09", "\u9F09"], /* CJK Ideograph */
+ ["\u9F0A", "\u9F0A"], /* CJK Ideograph */
+ ["\u9F0B", "\u9F0B"], /* CJK Ideograph */
+ ["\u9F0C", "\u9F0C"], /* CJK Ideograph */
+ ["\u9F0D", "\u9F0D"], /* CJK Ideograph */
+ ["\u9F0E", "\u9F0E"], /* CJK Ideograph */
+ ["\u9F0F", "\u9F0F"], /* CJK Ideograph */
+ ["\u9F10", "\u9F10"], /* CJK Ideograph */
+ ["\u9F11", "\u9F11"], /* CJK Ideograph */
+ ["\u9F12", "\u9F12"], /* CJK Ideograph */
+ ["\u9F13", "\u9F13"], /* CJK Ideograph */
+ ["\u9F14", "\u9F14"], /* CJK Ideograph */
+ ["\u9F15", "\u9F15"], /* CJK Ideograph */
+ ["\u9F16", "\u9F16"], /* CJK Ideograph */
+ ["\u9F17", "\u9F17"], /* CJK Ideograph */
+ ["\u9F18", "\u9F18"], /* CJK Ideograph */
+ ["\u9F19", "\u9F19"], /* CJK Ideograph */
+ ["\u9F1A", "\u9F1A"], /* CJK Ideograph */
+ ["\u9F1B", "\u9F1B"], /* CJK Ideograph */
+ ["\u9F1C", "\u9F1C"], /* CJK Ideograph */
+ ["\u9F1D", "\u9F1D"], /* CJK Ideograph */
+ ["\u9F1E", "\u9F1E"], /* CJK Ideograph */
+ ["\u9F1F", "\u9F1F"], /* CJK Ideograph */
+ ["\u9F20", "\u9F20"], /* CJK Ideograph */
+ ["\u9F21", "\u9F21"], /* CJK Ideograph */
+ ["\u9F22", "\u9F22"], /* CJK Ideograph */
+ ["\u9F23", "\u9F23"], /* CJK Ideograph */
+ ["\u9F24", "\u9F24"], /* CJK Ideograph */
+ ["\u9F25", "\u9F25"], /* CJK Ideograph */
+ ["\u9F26", "\u9F26"], /* CJK Ideograph */
+ ["\u9F27", "\u9F27"], /* CJK Ideograph */
+ ["\u9F28", "\u9F28"], /* CJK Ideograph */
+ ["\u9F29", "\u9F29"], /* CJK Ideograph */
+ ["\u9F2A", "\u9F2A"], /* CJK Ideograph */
+ ["\u9F2B", "\u9F2B"], /* CJK Ideograph */
+ ["\u9F2C", "\u9F2C"], /* CJK Ideograph */
+ ["\u9F2D", "\u9F2D"], /* CJK Ideograph */
+ ["\u9F2E", "\u9F2E"], /* CJK Ideograph */
+ ["\u9F2F", "\u9F2F"], /* CJK Ideograph */
+ ["\u9F30", "\u9F30"], /* CJK Ideograph */
+ ["\u9F31", "\u9F31"], /* CJK Ideograph */
+ ["\u9F32", "\u9F32"], /* CJK Ideograph */
+ ["\u9F33", "\u9F33"], /* CJK Ideograph */
+ ["\u9F34", "\u9F34"], /* CJK Ideograph */
+ ["\u9F35", "\u9F35"], /* CJK Ideograph */
+ ["\u9F36", "\u9F36"], /* CJK Ideograph */
+ ["\u9F37", "\u9F37"], /* CJK Ideograph */
+ ["\u9F38", "\u9F38"], /* CJK Ideograph */
+ ["\u9F39", "\u9F39"], /* CJK Ideograph */
+ ["\u9F3A", "\u9F3A"], /* CJK Ideograph */
+ ["\u9F3B", "\u9F3B"], /* CJK Ideograph */
+ ["\u9F3C", "\u9F3C"], /* CJK Ideograph */
+ ["\u9F3D", "\u9F3D"], /* CJK Ideograph */
+ ["\u9F3E", "\u9F3E"], /* CJK Ideograph */
+ ["\u9F3F", "\u9F3F"], /* CJK Ideograph */
+ ["\u9F40", "\u9F40"], /* CJK Ideograph */
+ ["\u9F41", "\u9F41"], /* CJK Ideograph */
+ ["\u9F42", "\u9F42"], /* CJK Ideograph */
+ ["\u9F43", "\u9F43"], /* CJK Ideograph */
+ ["\u9F44", "\u9F44"], /* CJK Ideograph */
+ ["\u9F45", "\u9F45"], /* CJK Ideograph */
+ ["\u9F46", "\u9F46"], /* CJK Ideograph */
+ ["\u9F47", "\u9F47"], /* CJK Ideograph */
+ ["\u9F48", "\u9F48"], /* CJK Ideograph */
+ ["\u9F49", "\u9F49"], /* CJK Ideograph */
+ ["\u9F4A", "\u9F4A"], /* CJK Ideograph */
+ ["\u9F4B", "\u9F4B"], /* CJK Ideograph */
+ ["\u9F4C", "\u9F4C"], /* CJK Ideograph */
+ ["\u9F4D", "\u9F4D"], /* CJK Ideograph */
+ ["\u9F4E", "\u9F4E"], /* CJK Ideograph */
+ ["\u9F4F", "\u9F4F"], /* CJK Ideograph */
+ ["\u9F50", "\u9F50"], /* CJK Ideograph */
+ ["\u9F51", "\u9F51"], /* CJK Ideograph */
+ ["\u9F52", "\u9F52"], /* CJK Ideograph */
+ ["\u9F53", "\u9F53"], /* CJK Ideograph */
+ ["\u9F54", "\u9F54"], /* CJK Ideograph */
+ ["\u9F55", "\u9F55"], /* CJK Ideograph */
+ ["\u9F56", "\u9F56"], /* CJK Ideograph */
+ ["\u9F57", "\u9F57"], /* CJK Ideograph */
+ ["\u9F58", "\u9F58"], /* CJK Ideograph */
+ ["\u9F59", "\u9F59"], /* CJK Ideograph */
+ ["\u9F5A", "\u9F5A"], /* CJK Ideograph */
+ ["\u9F5B", "\u9F5B"], /* CJK Ideograph */
+ ["\u9F5C", "\u9F5C"], /* CJK Ideograph */
+ ["\u9F5D", "\u9F5D"], /* CJK Ideograph */
+ ["\u9F5E", "\u9F5E"], /* CJK Ideograph */
+ ["\u9F5F", "\u9F5F"], /* CJK Ideograph */
+ ["\u9F60", "\u9F60"], /* CJK Ideograph */
+ ["\u9F61", "\u9F61"], /* CJK Ideograph */
+ ["\u9F62", "\u9F62"], /* CJK Ideograph */
+ ["\u9F63", "\u9F63"], /* CJK Ideograph */
+ ["\u9F64", "\u9F64"], /* CJK Ideograph */
+ ["\u9F65", "\u9F65"], /* CJK Ideograph */
+ ["\u9F66", "\u9F66"], /* CJK Ideograph */
+ ["\u9F67", "\u9F67"], /* CJK Ideograph */
+ ["\u9F68", "\u9F68"], /* CJK Ideograph */
+ ["\u9F69", "\u9F69"], /* CJK Ideograph */
+ ["\u9F6A", "\u9F6A"], /* CJK Ideograph */
+ ["\u9F6B", "\u9F6B"], /* CJK Ideograph */
+ ["\u9F6C", "\u9F6C"], /* CJK Ideograph */
+ ["\u9F6D", "\u9F6D"], /* CJK Ideograph */
+ ["\u9F6E", "\u9F6E"], /* CJK Ideograph */
+ ["\u9F6F", "\u9F6F"], /* CJK Ideograph */
+ ["\u9F70", "\u9F70"], /* CJK Ideograph */
+ ["\u9F71", "\u9F71"], /* CJK Ideograph */
+ ["\u9F72", "\u9F72"], /* CJK Ideograph */
+ ["\u9F73", "\u9F73"], /* CJK Ideograph */
+ ["\u9F74", "\u9F74"], /* CJK Ideograph */
+ ["\u9F75", "\u9F75"], /* CJK Ideograph */
+ ["\u9F76", "\u9F76"], /* CJK Ideograph */
+ ["\u9F77", "\u9F77"], /* CJK Ideograph */
+ ["\u9F78", "\u9F78"], /* CJK Ideograph */
+ ["\u9F79", "\u9F79"], /* CJK Ideograph */
+ ["\u9F7A", "\u9F7A"], /* CJK Ideograph */
+ ["\u9F7B", "\u9F7B"], /* CJK Ideograph */
+ ["\u9F7C", "\u9F7C"], /* CJK Ideograph */
+ ["\u9F7D", "\u9F7D"], /* CJK Ideograph */
+ ["\u9F7E", "\u9F7E"], /* CJK Ideograph */
+ ["\u9F7F", "\u9F7F"], /* CJK Ideograph */
+ ["\u9F80", "\u9F80"], /* CJK Ideograph */
+ ["\u9F81", "\u9F81"], /* CJK Ideograph */
+ ["\u9F82", "\u9F82"], /* CJK Ideograph */
+ ["\u9F83", "\u9F83"], /* CJK Ideograph */
+ ["\u9F84", "\u9F84"], /* CJK Ideograph */
+ ["\u9F85", "\u9F85"], /* CJK Ideograph */
+ ["\u9F86", "\u9F86"], /* CJK Ideograph */
+ ["\u9F87", "\u9F87"], /* CJK Ideograph */
+ ["\u9F88", "\u9F88"], /* CJK Ideograph */
+ ["\u9F89", "\u9F89"], /* CJK Ideograph */
+ ["\u9F8A", "\u9F8A"], /* CJK Ideograph */
+ ["\u9F8B", "\u9F8B"], /* CJK Ideograph */
+ ["\u9F8C", "\u9F8C"], /* CJK Ideograph */
+ ["\u9F8D", "\u9F8D"], /* CJK Ideograph */
+ ["\u9F8E", "\u9F8E"], /* CJK Ideograph */
+ ["\u9F8F", "\u9F8F"], /* CJK Ideograph */
+ ["\u9F90", "\u9F90"], /* CJK Ideograph */
+ ["\u9F91", "\u9F91"], /* CJK Ideograph */
+ ["\u9F92", "\u9F92"], /* CJK Ideograph */
+ ["\u9F93", "\u9F93"], /* CJK Ideograph */
+ ["\u9F94", "\u9F94"], /* CJK Ideograph */
+ ["\u9F95", "\u9F95"], /* CJK Ideograph */
+ ["\u9F96", "\u9F96"], /* CJK Ideograph */
+ ["\u9F97", "\u9F97"], /* CJK Ideograph */
+ ["\u9F98", "\u9F98"], /* CJK Ideograph */
+ ["\u9F99", "\u9F99"], /* CJK Ideograph */
+ ["\u9F9A", "\u9F9A"], /* CJK Ideograph */
+ ["\u9F9B", "\u9F9B"], /* CJK Ideograph */
+ ["\u9F9C", "\u9F9C"], /* CJK Ideograph */
+ ["\u9F9D", "\u9F9D"], /* CJK Ideograph */
+ ["\u9F9E", "\u9F9E"], /* CJK Ideograph */
+ ["\u9F9F", "\u9F9F"], /* CJK Ideograph */
+ ["\u9FA0", "\u9FA0"], /* CJK Ideograph */
+ ["\u9FA1", "\u9FA1"], /* CJK Ideograph */
+ ["\u9FA2", "\u9FA2"], /* CJK Ideograph */
+ ["\u9FA3", "\u9FA3"], /* CJK Ideograph */
+ ["\u9FA4", "\u9FA4"], /* CJK Ideograph */
+ ["\u9FA5", "\u9FA5"], /* CJK Ideograph */
+ ["\u9FA6", "\u9FA6"], /* CJK Ideograph */
+ ["\u9FA7", "\u9FA7"], /* CJK Ideograph */
+ ["\u9FA8", "\u9FA8"], /* CJK Ideograph */
+ ["\u9FA9", "\u9FA9"], /* CJK Ideograph */
+ ["\u9FAA", "\u9FAA"], /* CJK Ideograph */
+ ["\u9FAB", "\u9FAB"], /* CJK Ideograph */
+ ["\u9FAC", "\u9FAC"], /* CJK Ideograph */
+ ["\u9FAD", "\u9FAD"], /* CJK Ideograph */
+ ["\u9FAE", "\u9FAE"], /* CJK Ideograph */
+ ["\u9FAF", "\u9FAF"], /* CJK Ideograph */
+ ["\u9FB0", "\u9FB0"], /* CJK Ideograph */
+ ["\u9FB1", "\u9FB1"], /* CJK Ideograph */
+ ["\u9FB2", "\u9FB2"], /* CJK Ideograph */
+ ["\u9FB3", "\u9FB3"], /* CJK Ideograph */
+ ["\u9FB4", "\u9FB4"], /* CJK Ideograph */
+ ["\u9FB5", "\u9FB5"], /* CJK Ideograph */
+ ["\u9FB6", "\u9FB6"], /* CJK Ideograph */
+ ["\u9FB7", "\u9FB7"], /* CJK Ideograph */
+ ["\u9FB8", "\u9FB8"], /* CJK Ideograph */
+ ["\u9FB9", "\u9FB9"], /* CJK Ideograph */
+ ["\u9FBA", "\u9FBA"], /* CJK Ideograph */
+ ["\u9FBB", "\u9FBB"], /* CJK Ideograph */
+ ["\u9FBC", "\u9FBC"], /* CJK Ideograph */
+ ["\u9FBD", "\u9FBD"], /* CJK Ideograph */
+ ["\u9FBE", "\u9FBE"], /* CJK Ideograph */
+ ["\u9FBF", "\u9FBF"], /* CJK Ideograph */
+ ["\u9FC0", "\u9FC0"], /* CJK Ideograph */
+ ["\u9FC1", "\u9FC1"], /* CJK Ideograph */
+ ["\u9FC2", "\u9FC2"], /* CJK Ideograph */
+ ["\u9FC3", "\u9FC3"], /* CJK Ideograph */
+ ["\u9FC4", "\u9FC4"], /* CJK Ideograph */
+ ["\u9FC5", "\u9FC5"], /* CJK Ideograph */
+ ["\u9FC6", "\u9FC6"], /* CJK Ideograph */
+ ["\u9FC7", "\u9FC7"], /* CJK Ideograph */
+ ["\u9FC8", "\u9FC8"], /* CJK Ideograph */
+ ["\u9FC9", "\u9FC9"], /* CJK Ideograph */
+ ["\u9FCA", "\u9FCA"], /* CJK Ideograph */
+ ["\u9FCB", "\u9FCB"], /* CJK Ideograph */
+ ["\u9FCC", "\u9FCC"], /* CJK Ideograph */
+ ["\u9FCD", "\u9FCD"], /* CJK Ideograph */
+ ["\u9FCE", "\u9FCE"], /* CJK Ideograph */
+ ["\u9FCF", "\u9FCF"], /* CJK Ideograph */
+ ["\u9FD0", "\u9FD0"], /* CJK Ideograph */
+ ["\u9FD1", "\u9FD1"], /* CJK Ideograph */
+ ["\u9FD2", "\u9FD2"], /* CJK Ideograph */
+ ["\u9FD3", "\u9FD3"], /* CJK Ideograph */
+ ["\u9FD4", "\u9FD4"], /* CJK Ideograph */
+ ["\u9FD5", "\u9FD5"], /* CJK Ideograph */
+ ["\u9FD6", "\u9FD6"], /* CJK Ideograph */
+ ["\u9FD7", "\u9FD7"], /* CJK Ideograph */
+ ["\u9FD8", "\u9FD8"], /* CJK Ideograph */
+ ["\u9FD9", "\u9FD9"], /* CJK Ideograph */
+ ["\u9FDA", "\u9FDA"], /* CJK Ideograph */
+ ["\u9FDB", "\u9FDB"], /* CJK Ideograph */
+ ["\u9FDC", "\u9FDC"], /* CJK Ideograph */
+ ["\u9FDD", "\u9FDD"], /* CJK Ideograph */
+ ["\u9FDE", "\u9FDE"], /* CJK Ideograph */
+ ["\u9FDF", "\u9FDF"], /* CJK Ideograph */
+ ["\u9FE0", "\u9FE0"], /* CJK Ideograph */
+ ["\u9FE1", "\u9FE1"], /* CJK Ideograph */
+ ["\u9FE2", "\u9FE2"], /* CJK Ideograph */
+ ["\u9FE3", "\u9FE3"], /* CJK Ideograph */
+ ["\u9FE4", "\u9FE4"], /* CJK Ideograph */
+ ["\u9FE5", "\u9FE5"], /* CJK Ideograph */
+ ["\u9FE6", "\u9FE6"], /* CJK Ideograph */
+ ["\u9FE7", "\u9FE7"], /* CJK Ideograph */
+ ["\u9FE8", "\u9FE8"], /* CJK Ideograph */
+ ["\u9FE9", "\u9FE9"], /* CJK Ideograph */
+ ["\u9FEA", "\u9FEA"], /* CJK Ideograph */
+ ["\u9FEB", "\u9FEB"], /* CJK Ideograph */
+ ["\u9FEC", "\u9FEC"], /* CJK Ideograph */
+ ["\u9FED", "\u9FED"], /* CJK Ideograph */
+ ["\u9FEE", "\u9FEE"], /* CJK Ideograph */
+ ["\u9FEF", "\u9FEF"], /* CJK Ideograph */
+ ["\u9FF0", "\u9FF0"],
+ ["\u9FF1", "\u9FF1"],
+ ["\u9FF2", "\u9FF2"],
+ ["\u9FF3", "\u9FF3"],
+ ["\u9FF4", "\u9FF4"],
+ ["\u9FF5", "\u9FF5"],
+ ["\u9FF6", "\u9FF6"],
+ ["\u9FF7", "\u9FF7"],
+ ["\u9FF8", "\u9FF8"],
+ ["\u9FF9", "\u9FF9"],
+ ["\u9FFA", "\u9FFA"],
+ ["\u9FFB", "\u9FFB"],
+ ["\u9FFC", "\u9FFC"],
+ ["\u9FFD", "\u9FFD"],
+ ["\u9FFE", "\u9FFE"],
+ ["\u9FFF", "\u9FFF"],
+ ["\uA000", "\uA000"], /* YI SYLLABLE IT */
+ ["\uA001", "\uA001"], /* YI SYLLABLE IX */
+ ["\uA002", "\uA002"], /* YI SYLLABLE I */
+ ["\uA003", "\uA003"], /* YI SYLLABLE IP */
+ ["\uA004", "\uA004"], /* YI SYLLABLE IET */
+ ["\uA005", "\uA005"], /* YI SYLLABLE IEX */
+ ["\uA006", "\uA006"], /* YI SYLLABLE IE */
+ ["\uA007", "\uA007"], /* YI SYLLABLE IEP */
+ ["\uA008", "\uA008"], /* YI SYLLABLE AT */
+ ["\uA009", "\uA009"], /* YI SYLLABLE AX */
+ ["\uA00A", "\uA00A"], /* YI SYLLABLE A */
+ ["\uA00B", "\uA00B"], /* YI SYLLABLE AP */
+ ["\uA00C", "\uA00C"], /* YI SYLLABLE UOX */
+ ["\uA00D", "\uA00D"], /* YI SYLLABLE UO */
+ ["\uA00E", "\uA00E"], /* YI SYLLABLE UOP */
+ ["\uA00F", "\uA00F"], /* YI SYLLABLE OT */
+ ["\uA010", "\uA010"], /* YI SYLLABLE OX */
+ ["\uA011", "\uA011"], /* YI SYLLABLE O */
+ ["\uA012", "\uA012"], /* YI SYLLABLE OP */
+ ["\uA013", "\uA013"], /* YI SYLLABLE EX */
+ ["\uA014", "\uA014"], /* YI SYLLABLE E */
+ ["\uA015", "\uA015"], /* YI SYLLABLE WU */
+ ["\uA016", "\uA016"], /* YI SYLLABLE BIT */
+ ["\uA017", "\uA017"], /* YI SYLLABLE BIX */
+ ["\uA018", "\uA018"], /* YI SYLLABLE BI */
+ ["\uA019", "\uA019"], /* YI SYLLABLE BIP */
+ ["\uA01A", "\uA01A"], /* YI SYLLABLE BIET */
+ ["\uA01B", "\uA01B"], /* YI SYLLABLE BIEX */
+ ["\uA01C", "\uA01C"], /* YI SYLLABLE BIE */
+ ["\uA01D", "\uA01D"], /* YI SYLLABLE BIEP */
+ ["\uA01E", "\uA01E"], /* YI SYLLABLE BAT */
+ ["\uA01F", "\uA01F"], /* YI SYLLABLE BAX */
+ ["\uA020", "\uA020"], /* YI SYLLABLE BA */
+ ["\uA021", "\uA021"], /* YI SYLLABLE BAP */
+ ["\uA022", "\uA022"], /* YI SYLLABLE BUOX */
+ ["\uA023", "\uA023"], /* YI SYLLABLE BUO */
+ ["\uA024", "\uA024"], /* YI SYLLABLE BUOP */
+ ["\uA025", "\uA025"], /* YI SYLLABLE BOT */
+ ["\uA026", "\uA026"], /* YI SYLLABLE BOX */
+ ["\uA027", "\uA027"], /* YI SYLLABLE BO */
+ ["\uA028", "\uA028"], /* YI SYLLABLE BOP */
+ ["\uA029", "\uA029"], /* YI SYLLABLE BEX */
+ ["\uA02A", "\uA02A"], /* YI SYLLABLE BE */
+ ["\uA02B", "\uA02B"], /* YI SYLLABLE BEP */
+ ["\uA02C", "\uA02C"], /* YI SYLLABLE BUT */
+ ["\uA02D", "\uA02D"], /* YI SYLLABLE BUX */
+ ["\uA02E", "\uA02E"], /* YI SYLLABLE BU */
+ ["\uA02F", "\uA02F"], /* YI SYLLABLE BUP */
+ ["\uA030", "\uA030"], /* YI SYLLABLE BURX */
+ ["\uA031", "\uA031"], /* YI SYLLABLE BUR */
+ ["\uA032", "\uA032"], /* YI SYLLABLE BYT */
+ ["\uA033", "\uA033"], /* YI SYLLABLE BYX */
+ ["\uA034", "\uA034"], /* YI SYLLABLE BY */
+ ["\uA035", "\uA035"], /* YI SYLLABLE BYP */
+ ["\uA036", "\uA036"], /* YI SYLLABLE BYRX */
+ ["\uA037", "\uA037"], /* YI SYLLABLE BYR */
+ ["\uA038", "\uA038"], /* YI SYLLABLE PIT */
+ ["\uA039", "\uA039"], /* YI SYLLABLE PIX */
+ ["\uA03A", "\uA03A"], /* YI SYLLABLE PI */
+ ["\uA03B", "\uA03B"], /* YI SYLLABLE PIP */
+ ["\uA03C", "\uA03C"], /* YI SYLLABLE PIEX */
+ ["\uA03D", "\uA03D"], /* YI SYLLABLE PIE */
+ ["\uA03E", "\uA03E"], /* YI SYLLABLE PIEP */
+ ["\uA03F", "\uA03F"], /* YI SYLLABLE PAT */
+ ["\uA040", "\uA040"], /* YI SYLLABLE PAX */
+ ["\uA041", "\uA041"], /* YI SYLLABLE PA */
+ ["\uA042", "\uA042"], /* YI SYLLABLE PAP */
+ ["\uA043", "\uA043"], /* YI SYLLABLE PUOX */
+ ["\uA044", "\uA044"], /* YI SYLLABLE PUO */
+ ["\uA045", "\uA045"], /* YI SYLLABLE PUOP */
+ ["\uA046", "\uA046"], /* YI SYLLABLE POT */
+ ["\uA047", "\uA047"], /* YI SYLLABLE POX */
+ ["\uA048", "\uA048"], /* YI SYLLABLE PO */
+ ["\uA049", "\uA049"], /* YI SYLLABLE POP */
+ ["\uA04A", "\uA04A"], /* YI SYLLABLE PUT */
+ ["\uA04B", "\uA04B"], /* YI SYLLABLE PUX */
+ ["\uA04C", "\uA04C"], /* YI SYLLABLE PU */
+ ["\uA04D", "\uA04D"], /* YI SYLLABLE PUP */
+ ["\uA04E", "\uA04E"], /* YI SYLLABLE PURX */
+ ["\uA04F", "\uA04F"], /* YI SYLLABLE PUR */
+ ["\uA050", "\uA050"], /* YI SYLLABLE PYT */
+ ["\uA051", "\uA051"], /* YI SYLLABLE PYX */
+ ["\uA052", "\uA052"], /* YI SYLLABLE PY */
+ ["\uA053", "\uA053"], /* YI SYLLABLE PYP */
+ ["\uA054", "\uA054"], /* YI SYLLABLE PYRX */
+ ["\uA055", "\uA055"], /* YI SYLLABLE PYR */
+ ["\uA056", "\uA056"], /* YI SYLLABLE BBIT */
+ ["\uA057", "\uA057"], /* YI SYLLABLE BBIX */
+ ["\uA058", "\uA058"], /* YI SYLLABLE BBI */
+ ["\uA059", "\uA059"], /* YI SYLLABLE BBIP */
+ ["\uA05A", "\uA05A"], /* YI SYLLABLE BBIET */
+ ["\uA05B", "\uA05B"], /* YI SYLLABLE BBIEX */
+ ["\uA05C", "\uA05C"], /* YI SYLLABLE BBIE */
+ ["\uA05D", "\uA05D"], /* YI SYLLABLE BBIEP */
+ ["\uA05E", "\uA05E"], /* YI SYLLABLE BBAT */
+ ["\uA05F", "\uA05F"], /* YI SYLLABLE BBAX */
+ ["\uA060", "\uA060"], /* YI SYLLABLE BBA */
+ ["\uA061", "\uA061"], /* YI SYLLABLE BBAP */
+ ["\uA062", "\uA062"], /* YI SYLLABLE BBUOX */
+ ["\uA063", "\uA063"], /* YI SYLLABLE BBUO */
+ ["\uA064", "\uA064"], /* YI SYLLABLE BBUOP */
+ ["\uA065", "\uA065"], /* YI SYLLABLE BBOT */
+ ["\uA066", "\uA066"], /* YI SYLLABLE BBOX */
+ ["\uA067", "\uA067"], /* YI SYLLABLE BBO */
+ ["\uA068", "\uA068"], /* YI SYLLABLE BBOP */
+ ["\uA069", "\uA069"], /* YI SYLLABLE BBEX */
+ ["\uA06A", "\uA06A"], /* YI SYLLABLE BBE */
+ ["\uA06B", "\uA06B"], /* YI SYLLABLE BBEP */
+ ["\uA06C", "\uA06C"], /* YI SYLLABLE BBUT */
+ ["\uA06D", "\uA06D"], /* YI SYLLABLE BBUX */
+ ["\uA06E", "\uA06E"], /* YI SYLLABLE BBU */
+ ["\uA06F", "\uA06F"], /* YI SYLLABLE BBUP */
+ ["\uA070", "\uA070"], /* YI SYLLABLE BBURX */
+ ["\uA071", "\uA071"], /* YI SYLLABLE BBUR */
+ ["\uA072", "\uA072"], /* YI SYLLABLE BBYT */
+ ["\uA073", "\uA073"], /* YI SYLLABLE BBYX */
+ ["\uA074", "\uA074"], /* YI SYLLABLE BBY */
+ ["\uA075", "\uA075"], /* YI SYLLABLE BBYP */
+ ["\uA076", "\uA076"], /* YI SYLLABLE NBIT */
+ ["\uA077", "\uA077"], /* YI SYLLABLE NBIX */
+ ["\uA078", "\uA078"], /* YI SYLLABLE NBI */
+ ["\uA079", "\uA079"], /* YI SYLLABLE NBIP */
+ ["\uA07A", "\uA07A"], /* YI SYLLABLE NBIEX */
+ ["\uA07B", "\uA07B"], /* YI SYLLABLE NBIE */
+ ["\uA07C", "\uA07C"], /* YI SYLLABLE NBIEP */
+ ["\uA07D", "\uA07D"], /* YI SYLLABLE NBAT */
+ ["\uA07E", "\uA07E"], /* YI SYLLABLE NBAX */
+ ["\uA07F", "\uA07F"], /* YI SYLLABLE NBA */
+ ["\uA080", "\uA080"], /* YI SYLLABLE NBAP */
+ ["\uA081", "\uA081"], /* YI SYLLABLE NBOT */
+ ["\uA082", "\uA082"], /* YI SYLLABLE NBOX */
+ ["\uA083", "\uA083"], /* YI SYLLABLE NBO */
+ ["\uA084", "\uA084"], /* YI SYLLABLE NBOP */
+ ["\uA085", "\uA085"], /* YI SYLLABLE NBUT */
+ ["\uA086", "\uA086"], /* YI SYLLABLE NBUX */
+ ["\uA087", "\uA087"], /* YI SYLLABLE NBU */
+ ["\uA088", "\uA088"], /* YI SYLLABLE NBUP */
+ ["\uA089", "\uA089"], /* YI SYLLABLE NBURX */
+ ["\uA08A", "\uA08A"], /* YI SYLLABLE NBUR */
+ ["\uA08B", "\uA08B"], /* YI SYLLABLE NBYT */
+ ["\uA08C", "\uA08C"], /* YI SYLLABLE NBYX */
+ ["\uA08D", "\uA08D"], /* YI SYLLABLE NBY */
+ ["\uA08E", "\uA08E"], /* YI SYLLABLE NBYP */
+ ["\uA08F", "\uA08F"], /* YI SYLLABLE NBYRX */
+ ["\uA090", "\uA090"], /* YI SYLLABLE NBYR */
+ ["\uA091", "\uA091"], /* YI SYLLABLE HMIT */
+ ["\uA092", "\uA092"], /* YI SYLLABLE HMIX */
+ ["\uA093", "\uA093"], /* YI SYLLABLE HMI */
+ ["\uA094", "\uA094"], /* YI SYLLABLE HMIP */
+ ["\uA095", "\uA095"], /* YI SYLLABLE HMIEX */
+ ["\uA096", "\uA096"], /* YI SYLLABLE HMIE */
+ ["\uA097", "\uA097"], /* YI SYLLABLE HMIEP */
+ ["\uA098", "\uA098"], /* YI SYLLABLE HMAT */
+ ["\uA099", "\uA099"], /* YI SYLLABLE HMAX */
+ ["\uA09A", "\uA09A"], /* YI SYLLABLE HMA */
+ ["\uA09B", "\uA09B"], /* YI SYLLABLE HMAP */
+ ["\uA09C", "\uA09C"], /* YI SYLLABLE HMUOX */
+ ["\uA09D", "\uA09D"], /* YI SYLLABLE HMUO */
+ ["\uA09E", "\uA09E"], /* YI SYLLABLE HMUOP */
+ ["\uA09F", "\uA09F"], /* YI SYLLABLE HMOT */
+ ["\uA0A0", "\uA0A0"], /* YI SYLLABLE HMOX */
+ ["\uA0A1", "\uA0A1"], /* YI SYLLABLE HMO */
+ ["\uA0A2", "\uA0A2"], /* YI SYLLABLE HMOP */
+ ["\uA0A3", "\uA0A3"], /* YI SYLLABLE HMUT */
+ ["\uA0A4", "\uA0A4"], /* YI SYLLABLE HMUX */
+ ["\uA0A5", "\uA0A5"], /* YI SYLLABLE HMU */
+ ["\uA0A6", "\uA0A6"], /* YI SYLLABLE HMUP */
+ ["\uA0A7", "\uA0A7"], /* YI SYLLABLE HMURX */
+ ["\uA0A8", "\uA0A8"], /* YI SYLLABLE HMUR */
+ ["\uA0A9", "\uA0A9"], /* YI SYLLABLE HMYX */
+ ["\uA0AA", "\uA0AA"], /* YI SYLLABLE HMY */
+ ["\uA0AB", "\uA0AB"], /* YI SYLLABLE HMYP */
+ ["\uA0AC", "\uA0AC"], /* YI SYLLABLE HMYRX */
+ ["\uA0AD", "\uA0AD"], /* YI SYLLABLE HMYR */
+ ["\uA0AE", "\uA0AE"], /* YI SYLLABLE MIT */
+ ["\uA0AF", "\uA0AF"], /* YI SYLLABLE MIX */
+ ["\uA0B0", "\uA0B0"], /* YI SYLLABLE MI */
+ ["\uA0B1", "\uA0B1"], /* YI SYLLABLE MIP */
+ ["\uA0B2", "\uA0B2"], /* YI SYLLABLE MIEX */
+ ["\uA0B3", "\uA0B3"], /* YI SYLLABLE MIE */
+ ["\uA0B4", "\uA0B4"], /* YI SYLLABLE MIEP */
+ ["\uA0B5", "\uA0B5"], /* YI SYLLABLE MAT */
+ ["\uA0B6", "\uA0B6"], /* YI SYLLABLE MAX */
+ ["\uA0B7", "\uA0B7"], /* YI SYLLABLE MA */
+ ["\uA0B8", "\uA0B8"], /* YI SYLLABLE MAP */
+ ["\uA0B9", "\uA0B9"], /* YI SYLLABLE MUOT */
+ ["\uA0BA", "\uA0BA"], /* YI SYLLABLE MUOX */
+ ["\uA0BB", "\uA0BB"], /* YI SYLLABLE MUO */
+ ["\uA0BC", "\uA0BC"], /* YI SYLLABLE MUOP */
+ ["\uA0BD", "\uA0BD"], /* YI SYLLABLE MOT */
+ ["\uA0BE", "\uA0BE"], /* YI SYLLABLE MOX */
+ ["\uA0BF", "\uA0BF"], /* YI SYLLABLE MO */
+ ["\uA0C0", "\uA0C0"], /* YI SYLLABLE MOP */
+ ["\uA0C1", "\uA0C1"], /* YI SYLLABLE MEX */
+ ["\uA0C2", "\uA0C2"], /* YI SYLLABLE ME */
+ ["\uA0C3", "\uA0C3"], /* YI SYLLABLE MUT */
+ ["\uA0C4", "\uA0C4"], /* YI SYLLABLE MUX */
+ ["\uA0C5", "\uA0C5"], /* YI SYLLABLE MU */
+ ["\uA0C6", "\uA0C6"], /* YI SYLLABLE MUP */
+ ["\uA0C7", "\uA0C7"], /* YI SYLLABLE MURX */
+ ["\uA0C8", "\uA0C8"], /* YI SYLLABLE MUR */
+ ["\uA0C9", "\uA0C9"], /* YI SYLLABLE MYT */
+ ["\uA0CA", "\uA0CA"], /* YI SYLLABLE MYX */
+ ["\uA0CB", "\uA0CB"], /* YI SYLLABLE MY */
+ ["\uA0CC", "\uA0CC"], /* YI SYLLABLE MYP */
+ ["\uA0CD", "\uA0CD"], /* YI SYLLABLE FIT */
+ ["\uA0CE", "\uA0CE"], /* YI SYLLABLE FIX */
+ ["\uA0CF", "\uA0CF"], /* YI SYLLABLE FI */
+ ["\uA0D0", "\uA0D0"], /* YI SYLLABLE FIP */
+ ["\uA0D1", "\uA0D1"], /* YI SYLLABLE FAT */
+ ["\uA0D2", "\uA0D2"], /* YI SYLLABLE FAX */
+ ["\uA0D3", "\uA0D3"], /* YI SYLLABLE FA */
+ ["\uA0D4", "\uA0D4"], /* YI SYLLABLE FAP */
+ ["\uA0D5", "\uA0D5"], /* YI SYLLABLE FOX */
+ ["\uA0D6", "\uA0D6"], /* YI SYLLABLE FO */
+ ["\uA0D7", "\uA0D7"], /* YI SYLLABLE FOP */
+ ["\uA0D8", "\uA0D8"], /* YI SYLLABLE FUT */
+ ["\uA0D9", "\uA0D9"], /* YI SYLLABLE FUX */
+ ["\uA0DA", "\uA0DA"], /* YI SYLLABLE FU */
+ ["\uA0DB", "\uA0DB"], /* YI SYLLABLE FUP */
+ ["\uA0DC", "\uA0DC"], /* YI SYLLABLE FURX */
+ ["\uA0DD", "\uA0DD"], /* YI SYLLABLE FUR */
+ ["\uA0DE", "\uA0DE"], /* YI SYLLABLE FYT */
+ ["\uA0DF", "\uA0DF"], /* YI SYLLABLE FYX */
+ ["\uA0E0", "\uA0E0"], /* YI SYLLABLE FY */
+ ["\uA0E1", "\uA0E1"], /* YI SYLLABLE FYP */
+ ["\uA0E2", "\uA0E2"], /* YI SYLLABLE VIT */
+ ["\uA0E3", "\uA0E3"], /* YI SYLLABLE VIX */
+ ["\uA0E4", "\uA0E4"], /* YI SYLLABLE VI */
+ ["\uA0E5", "\uA0E5"], /* YI SYLLABLE VIP */
+ ["\uA0E6", "\uA0E6"], /* YI SYLLABLE VIET */
+ ["\uA0E7", "\uA0E7"], /* YI SYLLABLE VIEX */
+ ["\uA0E8", "\uA0E8"], /* YI SYLLABLE VIE */
+ ["\uA0E9", "\uA0E9"], /* YI SYLLABLE VIEP */
+ ["\uA0EA", "\uA0EA"], /* YI SYLLABLE VAT */
+ ["\uA0EB", "\uA0EB"], /* YI SYLLABLE VAX */
+ ["\uA0EC", "\uA0EC"], /* YI SYLLABLE VA */
+ ["\uA0ED", "\uA0ED"], /* YI SYLLABLE VAP */
+ ["\uA0EE", "\uA0EE"], /* YI SYLLABLE VOT */
+ ["\uA0EF", "\uA0EF"], /* YI SYLLABLE VOX */
+ ["\uA0F0", "\uA0F0"], /* YI SYLLABLE VO */
+ ["\uA0F1", "\uA0F1"], /* YI SYLLABLE VOP */
+ ["\uA0F2", "\uA0F2"], /* YI SYLLABLE VEX */
+ ["\uA0F3", "\uA0F3"], /* YI SYLLABLE VEP */
+ ["\uA0F4", "\uA0F4"], /* YI SYLLABLE VUT */
+ ["\uA0F5", "\uA0F5"], /* YI SYLLABLE VUX */
+ ["\uA0F6", "\uA0F6"], /* YI SYLLABLE VU */
+ ["\uA0F7", "\uA0F7"], /* YI SYLLABLE VUP */
+ ["\uA0F8", "\uA0F8"], /* YI SYLLABLE VURX */
+ ["\uA0F9", "\uA0F9"], /* YI SYLLABLE VUR */
+ ["\uA0FA", "\uA0FA"], /* YI SYLLABLE VYT */
+ ["\uA0FB", "\uA0FB"], /* YI SYLLABLE VYX */
+ ["\uA0FC", "\uA0FC"], /* YI SYLLABLE VY */
+ ["\uA0FD", "\uA0FD"], /* YI SYLLABLE VYP */
+ ["\uA0FE", "\uA0FE"], /* YI SYLLABLE VYRX */
+ ["\uA0FF", "\uA0FF"], /* YI SYLLABLE VYR */
+ ["\uA100", "\uA100"], /* YI SYLLABLE DIT */
+ ["\uA101", "\uA101"], /* YI SYLLABLE DIX */
+ ["\uA102", "\uA102"], /* YI SYLLABLE DI */
+ ["\uA103", "\uA103"], /* YI SYLLABLE DIP */
+ ["\uA104", "\uA104"], /* YI SYLLABLE DIEX */
+ ["\uA105", "\uA105"], /* YI SYLLABLE DIE */
+ ["\uA106", "\uA106"], /* YI SYLLABLE DIEP */
+ ["\uA107", "\uA107"], /* YI SYLLABLE DAT */
+ ["\uA108", "\uA108"], /* YI SYLLABLE DAX */
+ ["\uA109", "\uA109"], /* YI SYLLABLE DA */
+ ["\uA10A", "\uA10A"], /* YI SYLLABLE DAP */
+ ["\uA10B", "\uA10B"], /* YI SYLLABLE DUOX */
+ ["\uA10C", "\uA10C"], /* YI SYLLABLE DUO */
+ ["\uA10D", "\uA10D"], /* YI SYLLABLE DOT */
+ ["\uA10E", "\uA10E"], /* YI SYLLABLE DOX */
+ ["\uA10F", "\uA10F"], /* YI SYLLABLE DO */
+ ["\uA110", "\uA110"], /* YI SYLLABLE DOP */
+ ["\uA111", "\uA111"], /* YI SYLLABLE DEX */
+ ["\uA112", "\uA112"], /* YI SYLLABLE DE */
+ ["\uA113", "\uA113"], /* YI SYLLABLE DEP */
+ ["\uA114", "\uA114"], /* YI SYLLABLE DUT */
+ ["\uA115", "\uA115"], /* YI SYLLABLE DUX */
+ ["\uA116", "\uA116"], /* YI SYLLABLE DU */
+ ["\uA117", "\uA117"], /* YI SYLLABLE DUP */
+ ["\uA118", "\uA118"], /* YI SYLLABLE DURX */
+ ["\uA119", "\uA119"], /* YI SYLLABLE DUR */
+ ["\uA11A", "\uA11A"], /* YI SYLLABLE TIT */
+ ["\uA11B", "\uA11B"], /* YI SYLLABLE TIX */
+ ["\uA11C", "\uA11C"], /* YI SYLLABLE TI */
+ ["\uA11D", "\uA11D"], /* YI SYLLABLE TIP */
+ ["\uA11E", "\uA11E"], /* YI SYLLABLE TIEX */
+ ["\uA11F", "\uA11F"], /* YI SYLLABLE TIE */
+ ["\uA120", "\uA120"], /* YI SYLLABLE TIEP */
+ ["\uA121", "\uA121"], /* YI SYLLABLE TAT */
+ ["\uA122", "\uA122"], /* YI SYLLABLE TAX */
+ ["\uA123", "\uA123"], /* YI SYLLABLE TA */
+ ["\uA124", "\uA124"], /* YI SYLLABLE TAP */
+ ["\uA125", "\uA125"], /* YI SYLLABLE TUOT */
+ ["\uA126", "\uA126"], /* YI SYLLABLE TUOX */
+ ["\uA127", "\uA127"], /* YI SYLLABLE TUO */
+ ["\uA128", "\uA128"], /* YI SYLLABLE TUOP */
+ ["\uA129", "\uA129"], /* YI SYLLABLE TOT */
+ ["\uA12A", "\uA12A"], /* YI SYLLABLE TOX */
+ ["\uA12B", "\uA12B"], /* YI SYLLABLE TO */
+ ["\uA12C", "\uA12C"], /* YI SYLLABLE TOP */
+ ["\uA12D", "\uA12D"], /* YI SYLLABLE TEX */
+ ["\uA12E", "\uA12E"], /* YI SYLLABLE TE */
+ ["\uA12F", "\uA12F"], /* YI SYLLABLE TEP */
+ ["\uA130", "\uA130"], /* YI SYLLABLE TUT */
+ ["\uA131", "\uA131"], /* YI SYLLABLE TUX */
+ ["\uA132", "\uA132"], /* YI SYLLABLE TU */
+ ["\uA133", "\uA133"], /* YI SYLLABLE TUP */
+ ["\uA134", "\uA134"], /* YI SYLLABLE TURX */
+ ["\uA135", "\uA135"], /* YI SYLLABLE TUR */
+ ["\uA136", "\uA136"], /* YI SYLLABLE DDIT */
+ ["\uA137", "\uA137"], /* YI SYLLABLE DDIX */
+ ["\uA138", "\uA138"], /* YI SYLLABLE DDI */
+ ["\uA139", "\uA139"], /* YI SYLLABLE DDIP */
+ ["\uA13A", "\uA13A"], /* YI SYLLABLE DDIEX */
+ ["\uA13B", "\uA13B"], /* YI SYLLABLE DDIE */
+ ["\uA13C", "\uA13C"], /* YI SYLLABLE DDIEP */
+ ["\uA13D", "\uA13D"], /* YI SYLLABLE DDAT */
+ ["\uA13E", "\uA13E"], /* YI SYLLABLE DDAX */
+ ["\uA13F", "\uA13F"], /* YI SYLLABLE DDA */
+ ["\uA140", "\uA140"], /* YI SYLLABLE DDAP */
+ ["\uA141", "\uA141"], /* YI SYLLABLE DDUOX */
+ ["\uA142", "\uA142"], /* YI SYLLABLE DDUO */
+ ["\uA143", "\uA143"], /* YI SYLLABLE DDUOP */
+ ["\uA144", "\uA144"], /* YI SYLLABLE DDOT */
+ ["\uA145", "\uA145"], /* YI SYLLABLE DDOX */
+ ["\uA146", "\uA146"], /* YI SYLLABLE DDO */
+ ["\uA147", "\uA147"], /* YI SYLLABLE DDOP */
+ ["\uA148", "\uA148"], /* YI SYLLABLE DDEX */
+ ["\uA149", "\uA149"], /* YI SYLLABLE DDE */
+ ["\uA14A", "\uA14A"], /* YI SYLLABLE DDEP */
+ ["\uA14B", "\uA14B"], /* YI SYLLABLE DDUT */
+ ["\uA14C", "\uA14C"], /* YI SYLLABLE DDUX */
+ ["\uA14D", "\uA14D"], /* YI SYLLABLE DDU */
+ ["\uA14E", "\uA14E"], /* YI SYLLABLE DDUP */
+ ["\uA14F", "\uA14F"], /* YI SYLLABLE DDURX */
+ ["\uA150", "\uA150"], /* YI SYLLABLE DDUR */
+ ["\uA151", "\uA151"], /* YI SYLLABLE NDIT */
+ ["\uA152", "\uA152"], /* YI SYLLABLE NDIX */
+ ["\uA153", "\uA153"], /* YI SYLLABLE NDI */
+ ["\uA154", "\uA154"], /* YI SYLLABLE NDIP */
+ ["\uA155", "\uA155"], /* YI SYLLABLE NDIEX */
+ ["\uA156", "\uA156"], /* YI SYLLABLE NDIE */
+ ["\uA157", "\uA157"], /* YI SYLLABLE NDAT */
+ ["\uA158", "\uA158"], /* YI SYLLABLE NDAX */
+ ["\uA159", "\uA159"], /* YI SYLLABLE NDA */
+ ["\uA15A", "\uA15A"], /* YI SYLLABLE NDAP */
+ ["\uA15B", "\uA15B"], /* YI SYLLABLE NDOT */
+ ["\uA15C", "\uA15C"], /* YI SYLLABLE NDOX */
+ ["\uA15D", "\uA15D"], /* YI SYLLABLE NDO */
+ ["\uA15E", "\uA15E"], /* YI SYLLABLE NDOP */
+ ["\uA15F", "\uA15F"], /* YI SYLLABLE NDEX */
+ ["\uA160", "\uA160"], /* YI SYLLABLE NDE */
+ ["\uA161", "\uA161"], /* YI SYLLABLE NDEP */
+ ["\uA162", "\uA162"], /* YI SYLLABLE NDUT */
+ ["\uA163", "\uA163"], /* YI SYLLABLE NDUX */
+ ["\uA164", "\uA164"], /* YI SYLLABLE NDU */
+ ["\uA165", "\uA165"], /* YI SYLLABLE NDUP */
+ ["\uA166", "\uA166"], /* YI SYLLABLE NDURX */
+ ["\uA167", "\uA167"], /* YI SYLLABLE NDUR */
+ ["\uA168", "\uA168"], /* YI SYLLABLE HNIT */
+ ["\uA169", "\uA169"], /* YI SYLLABLE HNIX */
+ ["\uA16A", "\uA16A"], /* YI SYLLABLE HNI */
+ ["\uA16B", "\uA16B"], /* YI SYLLABLE HNIP */
+ ["\uA16C", "\uA16C"], /* YI SYLLABLE HNIET */
+ ["\uA16D", "\uA16D"], /* YI SYLLABLE HNIEX */
+ ["\uA16E", "\uA16E"], /* YI SYLLABLE HNIE */
+ ["\uA16F", "\uA16F"], /* YI SYLLABLE HNIEP */
+ ["\uA170", "\uA170"], /* YI SYLLABLE HNAT */
+ ["\uA171", "\uA171"], /* YI SYLLABLE HNAX */
+ ["\uA172", "\uA172"], /* YI SYLLABLE HNA */
+ ["\uA173", "\uA173"], /* YI SYLLABLE HNAP */
+ ["\uA174", "\uA174"], /* YI SYLLABLE HNUOX */
+ ["\uA175", "\uA175"], /* YI SYLLABLE HNUO */
+ ["\uA176", "\uA176"], /* YI SYLLABLE HNOT */
+ ["\uA177", "\uA177"], /* YI SYLLABLE HNOX */
+ ["\uA178", "\uA178"], /* YI SYLLABLE HNOP */
+ ["\uA179", "\uA179"], /* YI SYLLABLE HNEX */
+ ["\uA17A", "\uA17A"], /* YI SYLLABLE HNE */
+ ["\uA17B", "\uA17B"], /* YI SYLLABLE HNEP */
+ ["\uA17C", "\uA17C"], /* YI SYLLABLE HNUT */
+ ["\uA17D", "\uA17D"], /* YI SYLLABLE NIT */
+ ["\uA17E", "\uA17E"], /* YI SYLLABLE NIX */
+ ["\uA17F", "\uA17F"], /* YI SYLLABLE NI */
+ ["\uA180", "\uA180"], /* YI SYLLABLE NIP */
+ ["\uA181", "\uA181"], /* YI SYLLABLE NIEX */
+ ["\uA182", "\uA182"], /* YI SYLLABLE NIE */
+ ["\uA183", "\uA183"], /* YI SYLLABLE NIEP */
+ ["\uA184", "\uA184"], /* YI SYLLABLE NAX */
+ ["\uA185", "\uA185"], /* YI SYLLABLE NA */
+ ["\uA186", "\uA186"], /* YI SYLLABLE NAP */
+ ["\uA187", "\uA187"], /* YI SYLLABLE NUOX */
+ ["\uA188", "\uA188"], /* YI SYLLABLE NUO */
+ ["\uA189", "\uA189"], /* YI SYLLABLE NUOP */
+ ["\uA18A", "\uA18A"], /* YI SYLLABLE NOT */
+ ["\uA18B", "\uA18B"], /* YI SYLLABLE NOX */
+ ["\uA18C", "\uA18C"], /* YI SYLLABLE NO */
+ ["\uA18D", "\uA18D"], /* YI SYLLABLE NOP */
+ ["\uA18E", "\uA18E"], /* YI SYLLABLE NEX */
+ ["\uA18F", "\uA18F"], /* YI SYLLABLE NE */
+ ["\uA190", "\uA190"], /* YI SYLLABLE NEP */
+ ["\uA191", "\uA191"], /* YI SYLLABLE NUT */
+ ["\uA192", "\uA192"], /* YI SYLLABLE NUX */
+ ["\uA193", "\uA193"], /* YI SYLLABLE NU */
+ ["\uA194", "\uA194"], /* YI SYLLABLE NUP */
+ ["\uA195", "\uA195"], /* YI SYLLABLE NURX */
+ ["\uA196", "\uA196"], /* YI SYLLABLE NUR */
+ ["\uA197", "\uA197"], /* YI SYLLABLE HLIT */
+ ["\uA198", "\uA198"], /* YI SYLLABLE HLIX */
+ ["\uA199", "\uA199"], /* YI SYLLABLE HLI */
+ ["\uA19A", "\uA19A"], /* YI SYLLABLE HLIP */
+ ["\uA19B", "\uA19B"], /* YI SYLLABLE HLIEX */
+ ["\uA19C", "\uA19C"], /* YI SYLLABLE HLIE */
+ ["\uA19D", "\uA19D"], /* YI SYLLABLE HLIEP */
+ ["\uA19E", "\uA19E"], /* YI SYLLABLE HLAT */
+ ["\uA19F", "\uA19F"], /* YI SYLLABLE HLAX */
+ ["\uA1A0", "\uA1A0"], /* YI SYLLABLE HLA */
+ ["\uA1A1", "\uA1A1"], /* YI SYLLABLE HLAP */
+ ["\uA1A2", "\uA1A2"], /* YI SYLLABLE HLUOX */
+ ["\uA1A3", "\uA1A3"], /* YI SYLLABLE HLUO */
+ ["\uA1A4", "\uA1A4"], /* YI SYLLABLE HLUOP */
+ ["\uA1A5", "\uA1A5"], /* YI SYLLABLE HLOX */
+ ["\uA1A6", "\uA1A6"], /* YI SYLLABLE HLO */
+ ["\uA1A7", "\uA1A7"], /* YI SYLLABLE HLOP */
+ ["\uA1A8", "\uA1A8"], /* YI SYLLABLE HLEX */
+ ["\uA1A9", "\uA1A9"], /* YI SYLLABLE HLE */
+ ["\uA1AA", "\uA1AA"], /* YI SYLLABLE HLEP */
+ ["\uA1AB", "\uA1AB"], /* YI SYLLABLE HLUT */
+ ["\uA1AC", "\uA1AC"], /* YI SYLLABLE HLUX */
+ ["\uA1AD", "\uA1AD"], /* YI SYLLABLE HLU */
+ ["\uA1AE", "\uA1AE"], /* YI SYLLABLE HLUP */
+ ["\uA1AF", "\uA1AF"], /* YI SYLLABLE HLURX */
+ ["\uA1B0", "\uA1B0"], /* YI SYLLABLE HLUR */
+ ["\uA1B1", "\uA1B1"], /* YI SYLLABLE HLYT */
+ ["\uA1B2", "\uA1B2"], /* YI SYLLABLE HLYX */
+ ["\uA1B3", "\uA1B3"], /* YI SYLLABLE HLY */
+ ["\uA1B4", "\uA1B4"], /* YI SYLLABLE HLYP */
+ ["\uA1B5", "\uA1B5"], /* YI SYLLABLE HLYRX */
+ ["\uA1B6", "\uA1B6"], /* YI SYLLABLE HLYR */
+ ["\uA1B7", "\uA1B7"], /* YI SYLLABLE LIT */
+ ["\uA1B8", "\uA1B8"], /* YI SYLLABLE LIX */
+ ["\uA1B9", "\uA1B9"], /* YI SYLLABLE LI */
+ ["\uA1BA", "\uA1BA"], /* YI SYLLABLE LIP */
+ ["\uA1BB", "\uA1BB"], /* YI SYLLABLE LIET */
+ ["\uA1BC", "\uA1BC"], /* YI SYLLABLE LIEX */
+ ["\uA1BD", "\uA1BD"], /* YI SYLLABLE LIE */
+ ["\uA1BE", "\uA1BE"], /* YI SYLLABLE LIEP */
+ ["\uA1BF", "\uA1BF"], /* YI SYLLABLE LAT */
+ ["\uA1C0", "\uA1C0"], /* YI SYLLABLE LAX */
+ ["\uA1C1", "\uA1C1"], /* YI SYLLABLE LA */
+ ["\uA1C2", "\uA1C2"], /* YI SYLLABLE LAP */
+ ["\uA1C3", "\uA1C3"], /* YI SYLLABLE LUOT */
+ ["\uA1C4", "\uA1C4"], /* YI SYLLABLE LUOX */
+ ["\uA1C5", "\uA1C5"], /* YI SYLLABLE LUO */
+ ["\uA1C6", "\uA1C6"], /* YI SYLLABLE LUOP */
+ ["\uA1C7", "\uA1C7"], /* YI SYLLABLE LOT */
+ ["\uA1C8", "\uA1C8"], /* YI SYLLABLE LOX */
+ ["\uA1C9", "\uA1C9"], /* YI SYLLABLE LO */
+ ["\uA1CA", "\uA1CA"], /* YI SYLLABLE LOP */
+ ["\uA1CB", "\uA1CB"], /* YI SYLLABLE LEX */
+ ["\uA1CC", "\uA1CC"], /* YI SYLLABLE LE */
+ ["\uA1CD", "\uA1CD"], /* YI SYLLABLE LEP */
+ ["\uA1CE", "\uA1CE"], /* YI SYLLABLE LUT */
+ ["\uA1CF", "\uA1CF"], /* YI SYLLABLE LUX */
+ ["\uA1D0", "\uA1D0"], /* YI SYLLABLE LU */
+ ["\uA1D1", "\uA1D1"], /* YI SYLLABLE LUP */
+ ["\uA1D2", "\uA1D2"], /* YI SYLLABLE LURX */
+ ["\uA1D3", "\uA1D3"], /* YI SYLLABLE LUR */
+ ["\uA1D4", "\uA1D4"], /* YI SYLLABLE LYT */
+ ["\uA1D5", "\uA1D5"], /* YI SYLLABLE LYX */
+ ["\uA1D6", "\uA1D6"], /* YI SYLLABLE LY */
+ ["\uA1D7", "\uA1D7"], /* YI SYLLABLE LYP */
+ ["\uA1D8", "\uA1D8"], /* YI SYLLABLE LYRX */
+ ["\uA1D9", "\uA1D9"], /* YI SYLLABLE LYR */
+ ["\uA1DA", "\uA1DA"], /* YI SYLLABLE GIT */
+ ["\uA1DB", "\uA1DB"], /* YI SYLLABLE GIX */
+ ["\uA1DC", "\uA1DC"], /* YI SYLLABLE GI */
+ ["\uA1DD", "\uA1DD"], /* YI SYLLABLE GIP */
+ ["\uA1DE", "\uA1DE"], /* YI SYLLABLE GIET */
+ ["\uA1DF", "\uA1DF"], /* YI SYLLABLE GIEX */
+ ["\uA1E0", "\uA1E0"], /* YI SYLLABLE GIE */
+ ["\uA1E1", "\uA1E1"], /* YI SYLLABLE GIEP */
+ ["\uA1E2", "\uA1E2"], /* YI SYLLABLE GAT */
+ ["\uA1E3", "\uA1E3"], /* YI SYLLABLE GAX */
+ ["\uA1E4", "\uA1E4"], /* YI SYLLABLE GA */
+ ["\uA1E5", "\uA1E5"], /* YI SYLLABLE GAP */
+ ["\uA1E6", "\uA1E6"], /* YI SYLLABLE GUOT */
+ ["\uA1E7", "\uA1E7"], /* YI SYLLABLE GUOX */
+ ["\uA1E8", "\uA1E8"], /* YI SYLLABLE GUO */
+ ["\uA1E9", "\uA1E9"], /* YI SYLLABLE GUOP */
+ ["\uA1EA", "\uA1EA"], /* YI SYLLABLE GOT */
+ ["\uA1EB", "\uA1EB"], /* YI SYLLABLE GOX */
+ ["\uA1EC", "\uA1EC"], /* YI SYLLABLE GO */
+ ["\uA1ED", "\uA1ED"], /* YI SYLLABLE GOP */
+ ["\uA1EE", "\uA1EE"], /* YI SYLLABLE GET */
+ ["\uA1EF", "\uA1EF"], /* YI SYLLABLE GEX */
+ ["\uA1F0", "\uA1F0"], /* YI SYLLABLE GE */
+ ["\uA1F1", "\uA1F1"], /* YI SYLLABLE GEP */
+ ["\uA1F2", "\uA1F2"], /* YI SYLLABLE GUT */
+ ["\uA1F3", "\uA1F3"], /* YI SYLLABLE GUX */
+ ["\uA1F4", "\uA1F4"], /* YI SYLLABLE GU */
+ ["\uA1F5", "\uA1F5"], /* YI SYLLABLE GUP */
+ ["\uA1F6", "\uA1F6"], /* YI SYLLABLE GURX */
+ ["\uA1F7", "\uA1F7"], /* YI SYLLABLE GUR */
+ ["\uA1F8", "\uA1F8"], /* YI SYLLABLE KIT */
+ ["\uA1F9", "\uA1F9"], /* YI SYLLABLE KIX */
+ ["\uA1FA", "\uA1FA"], /* YI SYLLABLE KI */
+ ["\uA1FB", "\uA1FB"], /* YI SYLLABLE KIP */
+ ["\uA1FC", "\uA1FC"], /* YI SYLLABLE KIEX */
+ ["\uA1FD", "\uA1FD"], /* YI SYLLABLE KIE */
+ ["\uA1FE", "\uA1FE"], /* YI SYLLABLE KIEP */
+ ["\uA1FF", "\uA1FF"], /* YI SYLLABLE KAT */
+ ["\uA200", "\uA200"], /* YI SYLLABLE KAX */
+ ["\uA201", "\uA201"], /* YI SYLLABLE KA */
+ ["\uA202", "\uA202"], /* YI SYLLABLE KAP */
+ ["\uA203", "\uA203"], /* YI SYLLABLE KUOX */
+ ["\uA204", "\uA204"], /* YI SYLLABLE KUO */
+ ["\uA205", "\uA205"], /* YI SYLLABLE KUOP */
+ ["\uA206", "\uA206"], /* YI SYLLABLE KOT */
+ ["\uA207", "\uA207"], /* YI SYLLABLE KOX */
+ ["\uA208", "\uA208"], /* YI SYLLABLE KO */
+ ["\uA209", "\uA209"], /* YI SYLLABLE KOP */
+ ["\uA20A", "\uA20A"], /* YI SYLLABLE KET */
+ ["\uA20B", "\uA20B"], /* YI SYLLABLE KEX */
+ ["\uA20C", "\uA20C"], /* YI SYLLABLE KE */
+ ["\uA20D", "\uA20D"], /* YI SYLLABLE KEP */
+ ["\uA20E", "\uA20E"], /* YI SYLLABLE KUT */
+ ["\uA20F", "\uA20F"], /* YI SYLLABLE KUX */
+ ["\uA210", "\uA210"], /* YI SYLLABLE KU */
+ ["\uA211", "\uA211"], /* YI SYLLABLE KUP */
+ ["\uA212", "\uA212"], /* YI SYLLABLE KURX */
+ ["\uA213", "\uA213"], /* YI SYLLABLE KUR */
+ ["\uA214", "\uA214"], /* YI SYLLABLE GGIT */
+ ["\uA215", "\uA215"], /* YI SYLLABLE GGIX */
+ ["\uA216", "\uA216"], /* YI SYLLABLE GGI */
+ ["\uA217", "\uA217"], /* YI SYLLABLE GGIEX */
+ ["\uA218", "\uA218"], /* YI SYLLABLE GGIE */
+ ["\uA219", "\uA219"], /* YI SYLLABLE GGIEP */
+ ["\uA21A", "\uA21A"], /* YI SYLLABLE GGAT */
+ ["\uA21B", "\uA21B"], /* YI SYLLABLE GGAX */
+ ["\uA21C", "\uA21C"], /* YI SYLLABLE GGA */
+ ["\uA21D", "\uA21D"], /* YI SYLLABLE GGAP */
+ ["\uA21E", "\uA21E"], /* YI SYLLABLE GGUOT */
+ ["\uA21F", "\uA21F"], /* YI SYLLABLE GGUOX */
+ ["\uA220", "\uA220"], /* YI SYLLABLE GGUO */
+ ["\uA221", "\uA221"], /* YI SYLLABLE GGUOP */
+ ["\uA222", "\uA222"], /* YI SYLLABLE GGOT */
+ ["\uA223", "\uA223"], /* YI SYLLABLE GGOX */
+ ["\uA224", "\uA224"], /* YI SYLLABLE GGO */
+ ["\uA225", "\uA225"], /* YI SYLLABLE GGOP */
+ ["\uA226", "\uA226"], /* YI SYLLABLE GGET */
+ ["\uA227", "\uA227"], /* YI SYLLABLE GGEX */
+ ["\uA228", "\uA228"], /* YI SYLLABLE GGE */
+ ["\uA229", "\uA229"], /* YI SYLLABLE GGEP */
+ ["\uA22A", "\uA22A"], /* YI SYLLABLE GGUT */
+ ["\uA22B", "\uA22B"], /* YI SYLLABLE GGUX */
+ ["\uA22C", "\uA22C"], /* YI SYLLABLE GGU */
+ ["\uA22D", "\uA22D"], /* YI SYLLABLE GGUP */
+ ["\uA22E", "\uA22E"], /* YI SYLLABLE GGURX */
+ ["\uA22F", "\uA22F"], /* YI SYLLABLE GGUR */
+ ["\uA230", "\uA230"], /* YI SYLLABLE MGIEX */
+ ["\uA231", "\uA231"], /* YI SYLLABLE MGIE */
+ ["\uA232", "\uA232"], /* YI SYLLABLE MGAT */
+ ["\uA233", "\uA233"], /* YI SYLLABLE MGAX */
+ ["\uA234", "\uA234"], /* YI SYLLABLE MGA */
+ ["\uA235", "\uA235"], /* YI SYLLABLE MGAP */
+ ["\uA236", "\uA236"], /* YI SYLLABLE MGUOX */
+ ["\uA237", "\uA237"], /* YI SYLLABLE MGUO */
+ ["\uA238", "\uA238"], /* YI SYLLABLE MGUOP */
+ ["\uA239", "\uA239"], /* YI SYLLABLE MGOT */
+ ["\uA23A", "\uA23A"], /* YI SYLLABLE MGOX */
+ ["\uA23B", "\uA23B"], /* YI SYLLABLE MGO */
+ ["\uA23C", "\uA23C"], /* YI SYLLABLE MGOP */
+ ["\uA23D", "\uA23D"], /* YI SYLLABLE MGEX */
+ ["\uA23E", "\uA23E"], /* YI SYLLABLE MGE */
+ ["\uA23F", "\uA23F"], /* YI SYLLABLE MGEP */
+ ["\uA240", "\uA240"], /* YI SYLLABLE MGUT */
+ ["\uA241", "\uA241"], /* YI SYLLABLE MGUX */
+ ["\uA242", "\uA242"], /* YI SYLLABLE MGU */
+ ["\uA243", "\uA243"], /* YI SYLLABLE MGUP */
+ ["\uA244", "\uA244"], /* YI SYLLABLE MGURX */
+ ["\uA245", "\uA245"], /* YI SYLLABLE MGUR */
+ ["\uA246", "\uA246"], /* YI SYLLABLE HXIT */
+ ["\uA247", "\uA247"], /* YI SYLLABLE HXIX */
+ ["\uA248", "\uA248"], /* YI SYLLABLE HXI */
+ ["\uA249", "\uA249"], /* YI SYLLABLE HXIP */
+ ["\uA24A", "\uA24A"], /* YI SYLLABLE HXIET */
+ ["\uA24B", "\uA24B"], /* YI SYLLABLE HXIEX */
+ ["\uA24C", "\uA24C"], /* YI SYLLABLE HXIE */
+ ["\uA24D", "\uA24D"], /* YI SYLLABLE HXIEP */
+ ["\uA24E", "\uA24E"], /* YI SYLLABLE HXAT */
+ ["\uA24F", "\uA24F"], /* YI SYLLABLE HXAX */
+ ["\uA250", "\uA250"], /* YI SYLLABLE HXA */
+ ["\uA251", "\uA251"], /* YI SYLLABLE HXAP */
+ ["\uA252", "\uA252"], /* YI SYLLABLE HXUOT */
+ ["\uA253", "\uA253"], /* YI SYLLABLE HXUOX */
+ ["\uA254", "\uA254"], /* YI SYLLABLE HXUO */
+ ["\uA255", "\uA255"], /* YI SYLLABLE HXUOP */
+ ["\uA256", "\uA256"], /* YI SYLLABLE HXOT */
+ ["\uA257", "\uA257"], /* YI SYLLABLE HXOX */
+ ["\uA258", "\uA258"], /* YI SYLLABLE HXO */
+ ["\uA259", "\uA259"], /* YI SYLLABLE HXOP */
+ ["\uA25A", "\uA25A"], /* YI SYLLABLE HXEX */
+ ["\uA25B", "\uA25B"], /* YI SYLLABLE HXE */
+ ["\uA25C", "\uA25C"], /* YI SYLLABLE HXEP */
+ ["\uA25D", "\uA25D"], /* YI SYLLABLE NGIEX */
+ ["\uA25E", "\uA25E"], /* YI SYLLABLE NGIE */
+ ["\uA25F", "\uA25F"], /* YI SYLLABLE NGIEP */
+ ["\uA260", "\uA260"], /* YI SYLLABLE NGAT */
+ ["\uA261", "\uA261"], /* YI SYLLABLE NGAX */
+ ["\uA262", "\uA262"], /* YI SYLLABLE NGA */
+ ["\uA263", "\uA263"], /* YI SYLLABLE NGAP */
+ ["\uA264", "\uA264"], /* YI SYLLABLE NGUOT */
+ ["\uA265", "\uA265"], /* YI SYLLABLE NGUOX */
+ ["\uA266", "\uA266"], /* YI SYLLABLE NGUO */
+ ["\uA267", "\uA267"], /* YI SYLLABLE NGOT */
+ ["\uA268", "\uA268"], /* YI SYLLABLE NGOX */
+ ["\uA269", "\uA269"], /* YI SYLLABLE NGO */
+ ["\uA26A", "\uA26A"], /* YI SYLLABLE NGOP */
+ ["\uA26B", "\uA26B"], /* YI SYLLABLE NGEX */
+ ["\uA26C", "\uA26C"], /* YI SYLLABLE NGE */
+ ["\uA26D", "\uA26D"], /* YI SYLLABLE NGEP */
+ ["\uA26E", "\uA26E"], /* YI SYLLABLE HIT */
+ ["\uA26F", "\uA26F"], /* YI SYLLABLE HIEX */
+ ["\uA270", "\uA270"], /* YI SYLLABLE HIE */
+ ["\uA271", "\uA271"], /* YI SYLLABLE HAT */
+ ["\uA272", "\uA272"], /* YI SYLLABLE HAX */
+ ["\uA273", "\uA273"], /* YI SYLLABLE HA */
+ ["\uA274", "\uA274"], /* YI SYLLABLE HAP */
+ ["\uA275", "\uA275"], /* YI SYLLABLE HUOT */
+ ["\uA276", "\uA276"], /* YI SYLLABLE HUOX */
+ ["\uA277", "\uA277"], /* YI SYLLABLE HUO */
+ ["\uA278", "\uA278"], /* YI SYLLABLE HUOP */
+ ["\uA279", "\uA279"], /* YI SYLLABLE HOT */
+ ["\uA27A", "\uA27A"], /* YI SYLLABLE HOX */
+ ["\uA27B", "\uA27B"], /* YI SYLLABLE HO */
+ ["\uA27C", "\uA27C"], /* YI SYLLABLE HOP */
+ ["\uA27D", "\uA27D"], /* YI SYLLABLE HEX */
+ ["\uA27E", "\uA27E"], /* YI SYLLABLE HE */
+ ["\uA27F", "\uA27F"], /* YI SYLLABLE HEP */
+ ["\uA280", "\uA280"], /* YI SYLLABLE WAT */
+ ["\uA281", "\uA281"], /* YI SYLLABLE WAX */
+ ["\uA282", "\uA282"], /* YI SYLLABLE WA */
+ ["\uA283", "\uA283"], /* YI SYLLABLE WAP */
+ ["\uA284", "\uA284"], /* YI SYLLABLE WUOX */
+ ["\uA285", "\uA285"], /* YI SYLLABLE WUO */
+ ["\uA286", "\uA286"], /* YI SYLLABLE WUOP */
+ ["\uA287", "\uA287"], /* YI SYLLABLE WOX */
+ ["\uA288", "\uA288"], /* YI SYLLABLE WO */
+ ["\uA289", "\uA289"], /* YI SYLLABLE WOP */
+ ["\uA28A", "\uA28A"], /* YI SYLLABLE WEX */
+ ["\uA28B", "\uA28B"], /* YI SYLLABLE WE */
+ ["\uA28C", "\uA28C"], /* YI SYLLABLE WEP */
+ ["\uA28D", "\uA28D"], /* YI SYLLABLE ZIT */
+ ["\uA28E", "\uA28E"], /* YI SYLLABLE ZIX */
+ ["\uA28F", "\uA28F"], /* YI SYLLABLE ZI */
+ ["\uA290", "\uA290"], /* YI SYLLABLE ZIP */
+ ["\uA291", "\uA291"], /* YI SYLLABLE ZIEX */
+ ["\uA292", "\uA292"], /* YI SYLLABLE ZIE */
+ ["\uA293", "\uA293"], /* YI SYLLABLE ZIEP */
+ ["\uA294", "\uA294"], /* YI SYLLABLE ZAT */
+ ["\uA295", "\uA295"], /* YI SYLLABLE ZAX */
+ ["\uA296", "\uA296"], /* YI SYLLABLE ZA */
+ ["\uA297", "\uA297"], /* YI SYLLABLE ZAP */
+ ["\uA298", "\uA298"], /* YI SYLLABLE ZUOX */
+ ["\uA299", "\uA299"], /* YI SYLLABLE ZUO */
+ ["\uA29A", "\uA29A"], /* YI SYLLABLE ZUOP */
+ ["\uA29B", "\uA29B"], /* YI SYLLABLE ZOT */
+ ["\uA29C", "\uA29C"], /* YI SYLLABLE ZOX */
+ ["\uA29D", "\uA29D"], /* YI SYLLABLE ZO */
+ ["\uA29E", "\uA29E"], /* YI SYLLABLE ZOP */
+ ["\uA29F", "\uA29F"], /* YI SYLLABLE ZEX */
+ ["\uA2A0", "\uA2A0"], /* YI SYLLABLE ZE */
+ ["\uA2A1", "\uA2A1"], /* YI SYLLABLE ZEP */
+ ["\uA2A2", "\uA2A2"], /* YI SYLLABLE ZUT */
+ ["\uA2A3", "\uA2A3"], /* YI SYLLABLE ZUX */
+ ["\uA2A4", "\uA2A4"], /* YI SYLLABLE ZU */
+ ["\uA2A5", "\uA2A5"], /* YI SYLLABLE ZUP */
+ ["\uA2A6", "\uA2A6"], /* YI SYLLABLE ZURX */
+ ["\uA2A7", "\uA2A7"], /* YI SYLLABLE ZUR */
+ ["\uA2A8", "\uA2A8"], /* YI SYLLABLE ZYT */
+ ["\uA2A9", "\uA2A9"], /* YI SYLLABLE ZYX */
+ ["\uA2AA", "\uA2AA"], /* YI SYLLABLE ZY */
+ ["\uA2AB", "\uA2AB"], /* YI SYLLABLE ZYP */
+ ["\uA2AC", "\uA2AC"], /* YI SYLLABLE ZYRX */
+ ["\uA2AD", "\uA2AD"], /* YI SYLLABLE ZYR */
+ ["\uA2AE", "\uA2AE"], /* YI SYLLABLE CIT */
+ ["\uA2AF", "\uA2AF"], /* YI SYLLABLE CIX */
+ ["\uA2B0", "\uA2B0"], /* YI SYLLABLE CI */
+ ["\uA2B1", "\uA2B1"], /* YI SYLLABLE CIP */
+ ["\uA2B2", "\uA2B2"], /* YI SYLLABLE CIET */
+ ["\uA2B3", "\uA2B3"], /* YI SYLLABLE CIEX */
+ ["\uA2B4", "\uA2B4"], /* YI SYLLABLE CIE */
+ ["\uA2B5", "\uA2B5"], /* YI SYLLABLE CIEP */
+ ["\uA2B6", "\uA2B6"], /* YI SYLLABLE CAT */
+ ["\uA2B7", "\uA2B7"], /* YI SYLLABLE CAX */
+ ["\uA2B8", "\uA2B8"], /* YI SYLLABLE CA */
+ ["\uA2B9", "\uA2B9"], /* YI SYLLABLE CAP */
+ ["\uA2BA", "\uA2BA"], /* YI SYLLABLE CUOX */
+ ["\uA2BB", "\uA2BB"], /* YI SYLLABLE CUO */
+ ["\uA2BC", "\uA2BC"], /* YI SYLLABLE CUOP */
+ ["\uA2BD", "\uA2BD"], /* YI SYLLABLE COT */
+ ["\uA2BE", "\uA2BE"], /* YI SYLLABLE COX */
+ ["\uA2BF", "\uA2BF"], /* YI SYLLABLE CO */
+ ["\uA2C0", "\uA2C0"], /* YI SYLLABLE COP */
+ ["\uA2C1", "\uA2C1"], /* YI SYLLABLE CEX */
+ ["\uA2C2", "\uA2C2"], /* YI SYLLABLE CE */
+ ["\uA2C3", "\uA2C3"], /* YI SYLLABLE CEP */
+ ["\uA2C4", "\uA2C4"], /* YI SYLLABLE CUT */
+ ["\uA2C5", "\uA2C5"], /* YI SYLLABLE CUX */
+ ["\uA2C6", "\uA2C6"], /* YI SYLLABLE CU */
+ ["\uA2C7", "\uA2C7"], /* YI SYLLABLE CUP */
+ ["\uA2C8", "\uA2C8"], /* YI SYLLABLE CURX */
+ ["\uA2C9", "\uA2C9"], /* YI SYLLABLE CUR */
+ ["\uA2CA", "\uA2CA"], /* YI SYLLABLE CYT */
+ ["\uA2CB", "\uA2CB"], /* YI SYLLABLE CYX */
+ ["\uA2CC", "\uA2CC"], /* YI SYLLABLE CY */
+ ["\uA2CD", "\uA2CD"], /* YI SYLLABLE CYP */
+ ["\uA2CE", "\uA2CE"], /* YI SYLLABLE CYRX */
+ ["\uA2CF", "\uA2CF"], /* YI SYLLABLE CYR */
+ ["\uA2D0", "\uA2D0"], /* YI SYLLABLE ZZIT */
+ ["\uA2D1", "\uA2D1"], /* YI SYLLABLE ZZIX */
+ ["\uA2D2", "\uA2D2"], /* YI SYLLABLE ZZI */
+ ["\uA2D3", "\uA2D3"], /* YI SYLLABLE ZZIP */
+ ["\uA2D4", "\uA2D4"], /* YI SYLLABLE ZZIET */
+ ["\uA2D5", "\uA2D5"], /* YI SYLLABLE ZZIEX */
+ ["\uA2D6", "\uA2D6"], /* YI SYLLABLE ZZIE */
+ ["\uA2D7", "\uA2D7"], /* YI SYLLABLE ZZIEP */
+ ["\uA2D8", "\uA2D8"], /* YI SYLLABLE ZZAT */
+ ["\uA2D9", "\uA2D9"], /* YI SYLLABLE ZZAX */
+ ["\uA2DA", "\uA2DA"], /* YI SYLLABLE ZZA */
+ ["\uA2DB", "\uA2DB"], /* YI SYLLABLE ZZAP */
+ ["\uA2DC", "\uA2DC"], /* YI SYLLABLE ZZOX */
+ ["\uA2DD", "\uA2DD"], /* YI SYLLABLE ZZO */
+ ["\uA2DE", "\uA2DE"], /* YI SYLLABLE ZZOP */
+ ["\uA2DF", "\uA2DF"], /* YI SYLLABLE ZZEX */
+ ["\uA2E0", "\uA2E0"], /* YI SYLLABLE ZZE */
+ ["\uA2E1", "\uA2E1"], /* YI SYLLABLE ZZEP */
+ ["\uA2E2", "\uA2E2"], /* YI SYLLABLE ZZUX */
+ ["\uA2E3", "\uA2E3"], /* YI SYLLABLE ZZU */
+ ["\uA2E4", "\uA2E4"], /* YI SYLLABLE ZZUP */
+ ["\uA2E5", "\uA2E5"], /* YI SYLLABLE ZZURX */
+ ["\uA2E6", "\uA2E6"], /* YI SYLLABLE ZZUR */
+ ["\uA2E7", "\uA2E7"], /* YI SYLLABLE ZZYT */
+ ["\uA2E8", "\uA2E8"], /* YI SYLLABLE ZZYX */
+ ["\uA2E9", "\uA2E9"], /* YI SYLLABLE ZZY */
+ ["\uA2EA", "\uA2EA"], /* YI SYLLABLE ZZYP */
+ ["\uA2EB", "\uA2EB"], /* YI SYLLABLE ZZYRX */
+ ["\uA2EC", "\uA2EC"], /* YI SYLLABLE ZZYR */
+ ["\uA2ED", "\uA2ED"], /* YI SYLLABLE NZIT */
+ ["\uA2EE", "\uA2EE"], /* YI SYLLABLE NZIX */
+ ["\uA2EF", "\uA2EF"], /* YI SYLLABLE NZI */
+ ["\uA2F0", "\uA2F0"], /* YI SYLLABLE NZIP */
+ ["\uA2F1", "\uA2F1"], /* YI SYLLABLE NZIEX */
+ ["\uA2F2", "\uA2F2"], /* YI SYLLABLE NZIE */
+ ["\uA2F3", "\uA2F3"], /* YI SYLLABLE NZIEP */
+ ["\uA2F4", "\uA2F4"], /* YI SYLLABLE NZAT */
+ ["\uA2F5", "\uA2F5"], /* YI SYLLABLE NZAX */
+ ["\uA2F6", "\uA2F6"], /* YI SYLLABLE NZA */
+ ["\uA2F7", "\uA2F7"], /* YI SYLLABLE NZAP */
+ ["\uA2F8", "\uA2F8"], /* YI SYLLABLE NZUOX */
+ ["\uA2F9", "\uA2F9"], /* YI SYLLABLE NZUO */
+ ["\uA2FA", "\uA2FA"], /* YI SYLLABLE NZOX */
+ ["\uA2FB", "\uA2FB"], /* YI SYLLABLE NZOP */
+ ["\uA2FC", "\uA2FC"], /* YI SYLLABLE NZEX */
+ ["\uA2FD", "\uA2FD"], /* YI SYLLABLE NZE */
+ ["\uA2FE", "\uA2FE"], /* YI SYLLABLE NZUX */
+ ["\uA2FF", "\uA2FF"], /* YI SYLLABLE NZU */
+ ["\uA300", "\uA300"], /* YI SYLLABLE NZUP */
+ ["\uA301", "\uA301"], /* YI SYLLABLE NZURX */
+ ["\uA302", "\uA302"], /* YI SYLLABLE NZUR */
+ ["\uA303", "\uA303"], /* YI SYLLABLE NZYT */
+ ["\uA304", "\uA304"], /* YI SYLLABLE NZYX */
+ ["\uA305", "\uA305"], /* YI SYLLABLE NZY */
+ ["\uA306", "\uA306"], /* YI SYLLABLE NZYP */
+ ["\uA307", "\uA307"], /* YI SYLLABLE NZYRX */
+ ["\uA308", "\uA308"], /* YI SYLLABLE NZYR */
+ ["\uA309", "\uA309"], /* YI SYLLABLE SIT */
+ ["\uA30A", "\uA30A"], /* YI SYLLABLE SIX */
+ ["\uA30B", "\uA30B"], /* YI SYLLABLE SI */
+ ["\uA30C", "\uA30C"], /* YI SYLLABLE SIP */
+ ["\uA30D", "\uA30D"], /* YI SYLLABLE SIEX */
+ ["\uA30E", "\uA30E"], /* YI SYLLABLE SIE */
+ ["\uA30F", "\uA30F"], /* YI SYLLABLE SIEP */
+ ["\uA310", "\uA310"], /* YI SYLLABLE SAT */
+ ["\uA311", "\uA311"], /* YI SYLLABLE SAX */
+ ["\uA312", "\uA312"], /* YI SYLLABLE SA */
+ ["\uA313", "\uA313"], /* YI SYLLABLE SAP */
+ ["\uA314", "\uA314"], /* YI SYLLABLE SUOX */
+ ["\uA315", "\uA315"], /* YI SYLLABLE SUO */
+ ["\uA316", "\uA316"], /* YI SYLLABLE SUOP */
+ ["\uA317", "\uA317"], /* YI SYLLABLE SOT */
+ ["\uA318", "\uA318"], /* YI SYLLABLE SOX */
+ ["\uA319", "\uA319"], /* YI SYLLABLE SO */
+ ["\uA31A", "\uA31A"], /* YI SYLLABLE SOP */
+ ["\uA31B", "\uA31B"], /* YI SYLLABLE SEX */
+ ["\uA31C", "\uA31C"], /* YI SYLLABLE SE */
+ ["\uA31D", "\uA31D"], /* YI SYLLABLE SEP */
+ ["\uA31E", "\uA31E"], /* YI SYLLABLE SUT */
+ ["\uA31F", "\uA31F"], /* YI SYLLABLE SUX */
+ ["\uA320", "\uA320"], /* YI SYLLABLE SU */
+ ["\uA321", "\uA321"], /* YI SYLLABLE SUP */
+ ["\uA322", "\uA322"], /* YI SYLLABLE SURX */
+ ["\uA323", "\uA323"], /* YI SYLLABLE SUR */
+ ["\uA324", "\uA324"], /* YI SYLLABLE SYT */
+ ["\uA325", "\uA325"], /* YI SYLLABLE SYX */
+ ["\uA326", "\uA326"], /* YI SYLLABLE SY */
+ ["\uA327", "\uA327"], /* YI SYLLABLE SYP */
+ ["\uA328", "\uA328"], /* YI SYLLABLE SYRX */
+ ["\uA329", "\uA329"], /* YI SYLLABLE SYR */
+ ["\uA32A", "\uA32A"], /* YI SYLLABLE SSIT */
+ ["\uA32B", "\uA32B"], /* YI SYLLABLE SSIX */
+ ["\uA32C", "\uA32C"], /* YI SYLLABLE SSI */
+ ["\uA32D", "\uA32D"], /* YI SYLLABLE SSIP */
+ ["\uA32E", "\uA32E"], /* YI SYLLABLE SSIEX */
+ ["\uA32F", "\uA32F"], /* YI SYLLABLE SSIE */
+ ["\uA330", "\uA330"], /* YI SYLLABLE SSIEP */
+ ["\uA331", "\uA331"], /* YI SYLLABLE SSAT */
+ ["\uA332", "\uA332"], /* YI SYLLABLE SSAX */
+ ["\uA333", "\uA333"], /* YI SYLLABLE SSA */
+ ["\uA334", "\uA334"], /* YI SYLLABLE SSAP */
+ ["\uA335", "\uA335"], /* YI SYLLABLE SSOT */
+ ["\uA336", "\uA336"], /* YI SYLLABLE SSOX */
+ ["\uA337", "\uA337"], /* YI SYLLABLE SSO */
+ ["\uA338", "\uA338"], /* YI SYLLABLE SSOP */
+ ["\uA339", "\uA339"], /* YI SYLLABLE SSEX */
+ ["\uA33A", "\uA33A"], /* YI SYLLABLE SSE */
+ ["\uA33B", "\uA33B"], /* YI SYLLABLE SSEP */
+ ["\uA33C", "\uA33C"], /* YI SYLLABLE SSUT */
+ ["\uA33D", "\uA33D"], /* YI SYLLABLE SSUX */
+ ["\uA33E", "\uA33E"], /* YI SYLLABLE SSU */
+ ["\uA33F", "\uA33F"], /* YI SYLLABLE SSUP */
+ ["\uA340", "\uA340"], /* YI SYLLABLE SSYT */
+ ["\uA341", "\uA341"], /* YI SYLLABLE SSYX */
+ ["\uA342", "\uA342"], /* YI SYLLABLE SSY */
+ ["\uA343", "\uA343"], /* YI SYLLABLE SSYP */
+ ["\uA344", "\uA344"], /* YI SYLLABLE SSYRX */
+ ["\uA345", "\uA345"], /* YI SYLLABLE SSYR */
+ ["\uA346", "\uA346"], /* YI SYLLABLE ZHAT */
+ ["\uA347", "\uA347"], /* YI SYLLABLE ZHAX */
+ ["\uA348", "\uA348"], /* YI SYLLABLE ZHA */
+ ["\uA349", "\uA349"], /* YI SYLLABLE ZHAP */
+ ["\uA34A", "\uA34A"], /* YI SYLLABLE ZHUOX */
+ ["\uA34B", "\uA34B"], /* YI SYLLABLE ZHUO */
+ ["\uA34C", "\uA34C"], /* YI SYLLABLE ZHUOP */
+ ["\uA34D", "\uA34D"], /* YI SYLLABLE ZHOT */
+ ["\uA34E", "\uA34E"], /* YI SYLLABLE ZHOX */
+ ["\uA34F", "\uA34F"], /* YI SYLLABLE ZHO */
+ ["\uA350", "\uA350"], /* YI SYLLABLE ZHOP */
+ ["\uA351", "\uA351"], /* YI SYLLABLE ZHET */
+ ["\uA352", "\uA352"], /* YI SYLLABLE ZHEX */
+ ["\uA353", "\uA353"], /* YI SYLLABLE ZHE */
+ ["\uA354", "\uA354"], /* YI SYLLABLE ZHEP */
+ ["\uA355", "\uA355"], /* YI SYLLABLE ZHUT */
+ ["\uA356", "\uA356"], /* YI SYLLABLE ZHUX */
+ ["\uA357", "\uA357"], /* YI SYLLABLE ZHU */
+ ["\uA358", "\uA358"], /* YI SYLLABLE ZHUP */
+ ["\uA359", "\uA359"], /* YI SYLLABLE ZHURX */
+ ["\uA35A", "\uA35A"], /* YI SYLLABLE ZHUR */
+ ["\uA35B", "\uA35B"], /* YI SYLLABLE ZHYT */
+ ["\uA35C", "\uA35C"], /* YI SYLLABLE ZHYX */
+ ["\uA35D", "\uA35D"], /* YI SYLLABLE ZHY */
+ ["\uA35E", "\uA35E"], /* YI SYLLABLE ZHYP */
+ ["\uA35F", "\uA35F"], /* YI SYLLABLE ZHYRX */
+ ["\uA360", "\uA360"], /* YI SYLLABLE ZHYR */
+ ["\uA361", "\uA361"], /* YI SYLLABLE CHAT */
+ ["\uA362", "\uA362"], /* YI SYLLABLE CHAX */
+ ["\uA363", "\uA363"], /* YI SYLLABLE CHA */
+ ["\uA364", "\uA364"], /* YI SYLLABLE CHAP */
+ ["\uA365", "\uA365"], /* YI SYLLABLE CHUOT */
+ ["\uA366", "\uA366"], /* YI SYLLABLE CHUOX */
+ ["\uA367", "\uA367"], /* YI SYLLABLE CHUO */
+ ["\uA368", "\uA368"], /* YI SYLLABLE CHUOP */
+ ["\uA369", "\uA369"], /* YI SYLLABLE CHOT */
+ ["\uA36A", "\uA36A"], /* YI SYLLABLE CHOX */
+ ["\uA36B", "\uA36B"], /* YI SYLLABLE CHO */
+ ["\uA36C", "\uA36C"], /* YI SYLLABLE CHOP */
+ ["\uA36D", "\uA36D"], /* YI SYLLABLE CHET */
+ ["\uA36E", "\uA36E"], /* YI SYLLABLE CHEX */
+ ["\uA36F", "\uA36F"], /* YI SYLLABLE CHE */
+ ["\uA370", "\uA370"], /* YI SYLLABLE CHEP */
+ ["\uA371", "\uA371"], /* YI SYLLABLE CHUX */
+ ["\uA372", "\uA372"], /* YI SYLLABLE CHU */
+ ["\uA373", "\uA373"], /* YI SYLLABLE CHUP */
+ ["\uA374", "\uA374"], /* YI SYLLABLE CHURX */
+ ["\uA375", "\uA375"], /* YI SYLLABLE CHUR */
+ ["\uA376", "\uA376"], /* YI SYLLABLE CHYT */
+ ["\uA377", "\uA377"], /* YI SYLLABLE CHYX */
+ ["\uA378", "\uA378"], /* YI SYLLABLE CHY */
+ ["\uA379", "\uA379"], /* YI SYLLABLE CHYP */
+ ["\uA37A", "\uA37A"], /* YI SYLLABLE CHYRX */
+ ["\uA37B", "\uA37B"], /* YI SYLLABLE CHYR */
+ ["\uA37C", "\uA37C"], /* YI SYLLABLE RRAX */
+ ["\uA37D", "\uA37D"], /* YI SYLLABLE RRA */
+ ["\uA37E", "\uA37E"], /* YI SYLLABLE RRUOX */
+ ["\uA37F", "\uA37F"], /* YI SYLLABLE RRUO */
+ ["\uA380", "\uA380"], /* YI SYLLABLE RROT */
+ ["\uA381", "\uA381"], /* YI SYLLABLE RROX */
+ ["\uA382", "\uA382"], /* YI SYLLABLE RRO */
+ ["\uA383", "\uA383"], /* YI SYLLABLE RROP */
+ ["\uA384", "\uA384"], /* YI SYLLABLE RRET */
+ ["\uA385", "\uA385"], /* YI SYLLABLE RREX */
+ ["\uA386", "\uA386"], /* YI SYLLABLE RRE */
+ ["\uA387", "\uA387"], /* YI SYLLABLE RREP */
+ ["\uA388", "\uA388"], /* YI SYLLABLE RRUT */
+ ["\uA389", "\uA389"], /* YI SYLLABLE RRUX */
+ ["\uA38A", "\uA38A"], /* YI SYLLABLE RRU */
+ ["\uA38B", "\uA38B"], /* YI SYLLABLE RRUP */
+ ["\uA38C", "\uA38C"], /* YI SYLLABLE RRURX */
+ ["\uA38D", "\uA38D"], /* YI SYLLABLE RRUR */
+ ["\uA38E", "\uA38E"], /* YI SYLLABLE RRYT */
+ ["\uA38F", "\uA38F"], /* YI SYLLABLE RRYX */
+ ["\uA390", "\uA390"], /* YI SYLLABLE RRY */
+ ["\uA391", "\uA391"], /* YI SYLLABLE RRYP */
+ ["\uA392", "\uA392"], /* YI SYLLABLE RRYRX */
+ ["\uA393", "\uA393"], /* YI SYLLABLE RRYR */
+ ["\uA394", "\uA394"], /* YI SYLLABLE NRAT */
+ ["\uA395", "\uA395"], /* YI SYLLABLE NRAX */
+ ["\uA396", "\uA396"], /* YI SYLLABLE NRA */
+ ["\uA397", "\uA397"], /* YI SYLLABLE NRAP */
+ ["\uA398", "\uA398"], /* YI SYLLABLE NROX */
+ ["\uA399", "\uA399"], /* YI SYLLABLE NRO */
+ ["\uA39A", "\uA39A"], /* YI SYLLABLE NROP */
+ ["\uA39B", "\uA39B"], /* YI SYLLABLE NRET */
+ ["\uA39C", "\uA39C"], /* YI SYLLABLE NREX */
+ ["\uA39D", "\uA39D"], /* YI SYLLABLE NRE */
+ ["\uA39E", "\uA39E"], /* YI SYLLABLE NREP */
+ ["\uA39F", "\uA39F"], /* YI SYLLABLE NRUT */
+ ["\uA3A0", "\uA3A0"], /* YI SYLLABLE NRUX */
+ ["\uA3A1", "\uA3A1"], /* YI SYLLABLE NRU */
+ ["\uA3A2", "\uA3A2"], /* YI SYLLABLE NRUP */
+ ["\uA3A3", "\uA3A3"], /* YI SYLLABLE NRURX */
+ ["\uA3A4", "\uA3A4"], /* YI SYLLABLE NRUR */
+ ["\uA3A5", "\uA3A5"], /* YI SYLLABLE NRYT */
+ ["\uA3A6", "\uA3A6"], /* YI SYLLABLE NRYX */
+ ["\uA3A7", "\uA3A7"], /* YI SYLLABLE NRY */
+ ["\uA3A8", "\uA3A8"], /* YI SYLLABLE NRYP */
+ ["\uA3A9", "\uA3A9"], /* YI SYLLABLE NRYRX */
+ ["\uA3AA", "\uA3AA"], /* YI SYLLABLE NRYR */
+ ["\uA3AB", "\uA3AB"], /* YI SYLLABLE SHAT */
+ ["\uA3AC", "\uA3AC"], /* YI SYLLABLE SHAX */
+ ["\uA3AD", "\uA3AD"], /* YI SYLLABLE SHA */
+ ["\uA3AE", "\uA3AE"], /* YI SYLLABLE SHAP */
+ ["\uA3AF", "\uA3AF"], /* YI SYLLABLE SHUOX */
+ ["\uA3B0", "\uA3B0"], /* YI SYLLABLE SHUO */
+ ["\uA3B1", "\uA3B1"], /* YI SYLLABLE SHUOP */
+ ["\uA3B2", "\uA3B2"], /* YI SYLLABLE SHOT */
+ ["\uA3B3", "\uA3B3"], /* YI SYLLABLE SHOX */
+ ["\uA3B4", "\uA3B4"], /* YI SYLLABLE SHO */
+ ["\uA3B5", "\uA3B5"], /* YI SYLLABLE SHOP */
+ ["\uA3B6", "\uA3B6"], /* YI SYLLABLE SHET */
+ ["\uA3B7", "\uA3B7"], /* YI SYLLABLE SHEX */
+ ["\uA3B8", "\uA3B8"], /* YI SYLLABLE SHE */
+ ["\uA3B9", "\uA3B9"], /* YI SYLLABLE SHEP */
+ ["\uA3BA", "\uA3BA"], /* YI SYLLABLE SHUT */
+ ["\uA3BB", "\uA3BB"], /* YI SYLLABLE SHUX */
+ ["\uA3BC", "\uA3BC"], /* YI SYLLABLE SHU */
+ ["\uA3BD", "\uA3BD"], /* YI SYLLABLE SHUP */
+ ["\uA3BE", "\uA3BE"], /* YI SYLLABLE SHURX */
+ ["\uA3BF", "\uA3BF"], /* YI SYLLABLE SHUR */
+ ["\uA3C0", "\uA3C0"], /* YI SYLLABLE SHYT */
+ ["\uA3C1", "\uA3C1"], /* YI SYLLABLE SHYX */
+ ["\uA3C2", "\uA3C2"], /* YI SYLLABLE SHY */
+ ["\uA3C3", "\uA3C3"], /* YI SYLLABLE SHYP */
+ ["\uA3C4", "\uA3C4"], /* YI SYLLABLE SHYRX */
+ ["\uA3C5", "\uA3C5"], /* YI SYLLABLE SHYR */
+ ["\uA3C6", "\uA3C6"], /* YI SYLLABLE RAT */
+ ["\uA3C7", "\uA3C7"], /* YI SYLLABLE RAX */
+ ["\uA3C8", "\uA3C8"], /* YI SYLLABLE RA */
+ ["\uA3C9", "\uA3C9"], /* YI SYLLABLE RAP */
+ ["\uA3CA", "\uA3CA"], /* YI SYLLABLE RUOX */
+ ["\uA3CB", "\uA3CB"], /* YI SYLLABLE RUO */
+ ["\uA3CC", "\uA3CC"], /* YI SYLLABLE RUOP */
+ ["\uA3CD", "\uA3CD"], /* YI SYLLABLE ROT */
+ ["\uA3CE", "\uA3CE"], /* YI SYLLABLE ROX */
+ ["\uA3CF", "\uA3CF"], /* YI SYLLABLE RO */
+ ["\uA3D0", "\uA3D0"], /* YI SYLLABLE ROP */
+ ["\uA3D1", "\uA3D1"], /* YI SYLLABLE REX */
+ ["\uA3D2", "\uA3D2"], /* YI SYLLABLE RE */
+ ["\uA3D3", "\uA3D3"], /* YI SYLLABLE REP */
+ ["\uA3D4", "\uA3D4"], /* YI SYLLABLE RUT */
+ ["\uA3D5", "\uA3D5"], /* YI SYLLABLE RUX */
+ ["\uA3D6", "\uA3D6"], /* YI SYLLABLE RU */
+ ["\uA3D7", "\uA3D7"], /* YI SYLLABLE RUP */
+ ["\uA3D8", "\uA3D8"], /* YI SYLLABLE RURX */
+ ["\uA3D9", "\uA3D9"], /* YI SYLLABLE RUR */
+ ["\uA3DA", "\uA3DA"], /* YI SYLLABLE RYT */
+ ["\uA3DB", "\uA3DB"], /* YI SYLLABLE RYX */
+ ["\uA3DC", "\uA3DC"], /* YI SYLLABLE RY */
+ ["\uA3DD", "\uA3DD"], /* YI SYLLABLE RYP */
+ ["\uA3DE", "\uA3DE"], /* YI SYLLABLE RYRX */
+ ["\uA3DF", "\uA3DF"], /* YI SYLLABLE RYR */
+ ["\uA3E0", "\uA3E0"], /* YI SYLLABLE JIT */
+ ["\uA3E1", "\uA3E1"], /* YI SYLLABLE JIX */
+ ["\uA3E2", "\uA3E2"], /* YI SYLLABLE JI */
+ ["\uA3E3", "\uA3E3"], /* YI SYLLABLE JIP */
+ ["\uA3E4", "\uA3E4"], /* YI SYLLABLE JIET */
+ ["\uA3E5", "\uA3E5"], /* YI SYLLABLE JIEX */
+ ["\uA3E6", "\uA3E6"], /* YI SYLLABLE JIE */
+ ["\uA3E7", "\uA3E7"], /* YI SYLLABLE JIEP */
+ ["\uA3E8", "\uA3E8"], /* YI SYLLABLE JUOT */
+ ["\uA3E9", "\uA3E9"], /* YI SYLLABLE JUOX */
+ ["\uA3EA", "\uA3EA"], /* YI SYLLABLE JUO */
+ ["\uA3EB", "\uA3EB"], /* YI SYLLABLE JUOP */
+ ["\uA3EC", "\uA3EC"], /* YI SYLLABLE JOT */
+ ["\uA3ED", "\uA3ED"], /* YI SYLLABLE JOX */
+ ["\uA3EE", "\uA3EE"], /* YI SYLLABLE JO */
+ ["\uA3EF", "\uA3EF"], /* YI SYLLABLE JOP */
+ ["\uA3F0", "\uA3F0"], /* YI SYLLABLE JUT */
+ ["\uA3F1", "\uA3F1"], /* YI SYLLABLE JUX */
+ ["\uA3F2", "\uA3F2"], /* YI SYLLABLE JU */
+ ["\uA3F3", "\uA3F3"], /* YI SYLLABLE JUP */
+ ["\uA3F4", "\uA3F4"], /* YI SYLLABLE JURX */
+ ["\uA3F5", "\uA3F5"], /* YI SYLLABLE JUR */
+ ["\uA3F6", "\uA3F6"], /* YI SYLLABLE JYT */
+ ["\uA3F7", "\uA3F7"], /* YI SYLLABLE JYX */
+ ["\uA3F8", "\uA3F8"], /* YI SYLLABLE JY */
+ ["\uA3F9", "\uA3F9"], /* YI SYLLABLE JYP */
+ ["\uA3FA", "\uA3FA"], /* YI SYLLABLE JYRX */
+ ["\uA3FB", "\uA3FB"], /* YI SYLLABLE JYR */
+ ["\uA3FC", "\uA3FC"], /* YI SYLLABLE QIT */
+ ["\uA3FD", "\uA3FD"], /* YI SYLLABLE QIX */
+ ["\uA3FE", "\uA3FE"], /* YI SYLLABLE QI */
+ ["\uA3FF", "\uA3FF"], /* YI SYLLABLE QIP */
+ ["\uA400", "\uA400"], /* YI SYLLABLE QIET */
+ ["\uA401", "\uA401"], /* YI SYLLABLE QIEX */
+ ["\uA402", "\uA402"], /* YI SYLLABLE QIE */
+ ["\uA403", "\uA403"], /* YI SYLLABLE QIEP */
+ ["\uA404", "\uA404"], /* YI SYLLABLE QUOT */
+ ["\uA405", "\uA405"], /* YI SYLLABLE QUOX */
+ ["\uA406", "\uA406"], /* YI SYLLABLE QUO */
+ ["\uA407", "\uA407"], /* YI SYLLABLE QUOP */
+ ["\uA408", "\uA408"], /* YI SYLLABLE QOT */
+ ["\uA409", "\uA409"], /* YI SYLLABLE QOX */
+ ["\uA40A", "\uA40A"], /* YI SYLLABLE QO */
+ ["\uA40B", "\uA40B"], /* YI SYLLABLE QOP */
+ ["\uA40C", "\uA40C"], /* YI SYLLABLE QUT */
+ ["\uA40D", "\uA40D"], /* YI SYLLABLE QUX */
+ ["\uA40E", "\uA40E"], /* YI SYLLABLE QU */
+ ["\uA40F", "\uA40F"], /* YI SYLLABLE QUP */
+ ["\uA410", "\uA410"], /* YI SYLLABLE QURX */
+ ["\uA411", "\uA411"], /* YI SYLLABLE QUR */
+ ["\uA412", "\uA412"], /* YI SYLLABLE QYT */
+ ["\uA413", "\uA413"], /* YI SYLLABLE QYX */
+ ["\uA414", "\uA414"], /* YI SYLLABLE QY */
+ ["\uA415", "\uA415"], /* YI SYLLABLE QYP */
+ ["\uA416", "\uA416"], /* YI SYLLABLE QYRX */
+ ["\uA417", "\uA417"], /* YI SYLLABLE QYR */
+ ["\uA418", "\uA418"], /* YI SYLLABLE JJIT */
+ ["\uA419", "\uA419"], /* YI SYLLABLE JJIX */
+ ["\uA41A", "\uA41A"], /* YI SYLLABLE JJI */
+ ["\uA41B", "\uA41B"], /* YI SYLLABLE JJIP */
+ ["\uA41C", "\uA41C"], /* YI SYLLABLE JJIET */
+ ["\uA41D", "\uA41D"], /* YI SYLLABLE JJIEX */
+ ["\uA41E", "\uA41E"], /* YI SYLLABLE JJIE */
+ ["\uA41F", "\uA41F"], /* YI SYLLABLE JJIEP */
+ ["\uA420", "\uA420"], /* YI SYLLABLE JJUOX */
+ ["\uA421", "\uA421"], /* YI SYLLABLE JJUO */
+ ["\uA422", "\uA422"], /* YI SYLLABLE JJUOP */
+ ["\uA423", "\uA423"], /* YI SYLLABLE JJOT */
+ ["\uA424", "\uA424"], /* YI SYLLABLE JJOX */
+ ["\uA425", "\uA425"], /* YI SYLLABLE JJO */
+ ["\uA426", "\uA426"], /* YI SYLLABLE JJOP */
+ ["\uA427", "\uA427"], /* YI SYLLABLE JJUT */
+ ["\uA428", "\uA428"], /* YI SYLLABLE JJUX */
+ ["\uA429", "\uA429"], /* YI SYLLABLE JJU */
+ ["\uA42A", "\uA42A"], /* YI SYLLABLE JJUP */
+ ["\uA42B", "\uA42B"], /* YI SYLLABLE JJURX */
+ ["\uA42C", "\uA42C"], /* YI SYLLABLE JJUR */
+ ["\uA42D", "\uA42D"], /* YI SYLLABLE JJYT */
+ ["\uA42E", "\uA42E"], /* YI SYLLABLE JJYX */
+ ["\uA42F", "\uA42F"], /* YI SYLLABLE JJY */
+ ["\uA430", "\uA430"], /* YI SYLLABLE JJYP */
+ ["\uA431", "\uA431"], /* YI SYLLABLE NJIT */
+ ["\uA432", "\uA432"], /* YI SYLLABLE NJIX */
+ ["\uA433", "\uA433"], /* YI SYLLABLE NJI */
+ ["\uA434", "\uA434"], /* YI SYLLABLE NJIP */
+ ["\uA435", "\uA435"], /* YI SYLLABLE NJIET */
+ ["\uA436", "\uA436"], /* YI SYLLABLE NJIEX */
+ ["\uA437", "\uA437"], /* YI SYLLABLE NJIE */
+ ["\uA438", "\uA438"], /* YI SYLLABLE NJIEP */
+ ["\uA439", "\uA439"], /* YI SYLLABLE NJUOX */
+ ["\uA43A", "\uA43A"], /* YI SYLLABLE NJUO */
+ ["\uA43B", "\uA43B"], /* YI SYLLABLE NJOT */
+ ["\uA43C", "\uA43C"], /* YI SYLLABLE NJOX */
+ ["\uA43D", "\uA43D"], /* YI SYLLABLE NJO */
+ ["\uA43E", "\uA43E"], /* YI SYLLABLE NJOP */
+ ["\uA43F", "\uA43F"], /* YI SYLLABLE NJUX */
+ ["\uA440", "\uA440"], /* YI SYLLABLE NJU */
+ ["\uA441", "\uA441"], /* YI SYLLABLE NJUP */
+ ["\uA442", "\uA442"], /* YI SYLLABLE NJURX */
+ ["\uA443", "\uA443"], /* YI SYLLABLE NJUR */
+ ["\uA444", "\uA444"], /* YI SYLLABLE NJYT */
+ ["\uA445", "\uA445"], /* YI SYLLABLE NJYX */
+ ["\uA446", "\uA446"], /* YI SYLLABLE NJY */
+ ["\uA447", "\uA447"], /* YI SYLLABLE NJYP */
+ ["\uA448", "\uA448"], /* YI SYLLABLE NJYRX */
+ ["\uA449", "\uA449"], /* YI SYLLABLE NJYR */
+ ["\uA44A", "\uA44A"], /* YI SYLLABLE NYIT */
+ ["\uA44B", "\uA44B"], /* YI SYLLABLE NYIX */
+ ["\uA44C", "\uA44C"], /* YI SYLLABLE NYI */
+ ["\uA44D", "\uA44D"], /* YI SYLLABLE NYIP */
+ ["\uA44E", "\uA44E"], /* YI SYLLABLE NYIET */
+ ["\uA44F", "\uA44F"], /* YI SYLLABLE NYIEX */
+ ["\uA450", "\uA450"], /* YI SYLLABLE NYIE */
+ ["\uA451", "\uA451"], /* YI SYLLABLE NYIEP */
+ ["\uA452", "\uA452"], /* YI SYLLABLE NYUOX */
+ ["\uA453", "\uA453"], /* YI SYLLABLE NYUO */
+ ["\uA454", "\uA454"], /* YI SYLLABLE NYUOP */
+ ["\uA455", "\uA455"], /* YI SYLLABLE NYOT */
+ ["\uA456", "\uA456"], /* YI SYLLABLE NYOX */
+ ["\uA457", "\uA457"], /* YI SYLLABLE NYO */
+ ["\uA458", "\uA458"], /* YI SYLLABLE NYOP */
+ ["\uA459", "\uA459"], /* YI SYLLABLE NYUT */
+ ["\uA45A", "\uA45A"], /* YI SYLLABLE NYUX */
+ ["\uA45B", "\uA45B"], /* YI SYLLABLE NYU */
+ ["\uA45C", "\uA45C"], /* YI SYLLABLE NYUP */
+ ["\uA45D", "\uA45D"], /* YI SYLLABLE XIT */
+ ["\uA45E", "\uA45E"], /* YI SYLLABLE XIX */
+ ["\uA45F", "\uA45F"], /* YI SYLLABLE XI */
+ ["\uA460", "\uA460"], /* YI SYLLABLE XIP */
+ ["\uA461", "\uA461"], /* YI SYLLABLE XIET */
+ ["\uA462", "\uA462"], /* YI SYLLABLE XIEX */
+ ["\uA463", "\uA463"], /* YI SYLLABLE XIE */
+ ["\uA464", "\uA464"], /* YI SYLLABLE XIEP */
+ ["\uA465", "\uA465"], /* YI SYLLABLE XUOX */
+ ["\uA466", "\uA466"], /* YI SYLLABLE XUO */
+ ["\uA467", "\uA467"], /* YI SYLLABLE XOT */
+ ["\uA468", "\uA468"], /* YI SYLLABLE XOX */
+ ["\uA469", "\uA469"], /* YI SYLLABLE XO */
+ ["\uA46A", "\uA46A"], /* YI SYLLABLE XOP */
+ ["\uA46B", "\uA46B"], /* YI SYLLABLE XYT */
+ ["\uA46C", "\uA46C"], /* YI SYLLABLE XYX */
+ ["\uA46D", "\uA46D"], /* YI SYLLABLE XY */
+ ["\uA46E", "\uA46E"], /* YI SYLLABLE XYP */
+ ["\uA46F", "\uA46F"], /* YI SYLLABLE XYRX */
+ ["\uA470", "\uA470"], /* YI SYLLABLE XYR */
+ ["\uA471", "\uA471"], /* YI SYLLABLE YIT */
+ ["\uA472", "\uA472"], /* YI SYLLABLE YIX */
+ ["\uA473", "\uA473"], /* YI SYLLABLE YI */
+ ["\uA474", "\uA474"], /* YI SYLLABLE YIP */
+ ["\uA475", "\uA475"], /* YI SYLLABLE YIET */
+ ["\uA476", "\uA476"], /* YI SYLLABLE YIEX */
+ ["\uA477", "\uA477"], /* YI SYLLABLE YIE */
+ ["\uA478", "\uA478"], /* YI SYLLABLE YIEP */
+ ["\uA479", "\uA479"], /* YI SYLLABLE YUOT */
+ ["\uA47A", "\uA47A"], /* YI SYLLABLE YUOX */
+ ["\uA47B", "\uA47B"], /* YI SYLLABLE YUO */
+ ["\uA47C", "\uA47C"], /* YI SYLLABLE YUOP */
+ ["\uA47D", "\uA47D"], /* YI SYLLABLE YOT */
+ ["\uA47E", "\uA47E"], /* YI SYLLABLE YOX */
+ ["\uA47F", "\uA47F"], /* YI SYLLABLE YO */
+ ["\uA480", "\uA480"], /* YI SYLLABLE YOP */
+ ["\uA481", "\uA481"], /* YI SYLLABLE YUT */
+ ["\uA482", "\uA482"], /* YI SYLLABLE YUX */
+ ["\uA483", "\uA483"], /* YI SYLLABLE YU */
+ ["\uA484", "\uA484"], /* YI SYLLABLE YUP */
+ ["\uA485", "\uA485"], /* YI SYLLABLE YURX */
+ ["\uA486", "\uA486"], /* YI SYLLABLE YUR */
+ ["\uA487", "\uA487"], /* YI SYLLABLE YYT */
+ ["\uA488", "\uA488"], /* YI SYLLABLE YYX */
+ ["\uA489", "\uA489"], /* YI SYLLABLE YY */
+ ["\uA48A", "\uA48A"], /* YI SYLLABLE YYP */
+ ["\uA48B", "\uA48B"], /* YI SYLLABLE YYRX */
+ ["\uA48C", "\uA48C"], /* YI SYLLABLE YYR */
+ ["\uA48D", "\uA48D"],
+ ["\uA48E", "\uA48E"],
+ ["\uA48F", "\uA48F"],
+ ["\uA490", "\uA490"], /* YI RADICAL QOT */
+ ["\uA491", "\uA491"], /* YI RADICAL LI */
+ ["\uA492", "\uA492"], /* YI RADICAL KIT */
+ ["\uA493", "\uA493"], /* YI RADICAL NYIP */
+ ["\uA494", "\uA494"], /* YI RADICAL CYP */
+ ["\uA495", "\uA495"], /* YI RADICAL SSI */
+ ["\uA496", "\uA496"], /* YI RADICAL GGOP */
+ ["\uA497", "\uA497"], /* YI RADICAL GEP */
+ ["\uA498", "\uA498"], /* YI RADICAL MI */
+ ["\uA499", "\uA499"], /* YI RADICAL HXIT */
+ ["\uA49A", "\uA49A"], /* YI RADICAL LYR */
+ ["\uA49B", "\uA49B"], /* YI RADICAL BBUT */
+ ["\uA49C", "\uA49C"], /* YI RADICAL MOP */
+ ["\uA49D", "\uA49D"], /* YI RADICAL YO */
+ ["\uA49E", "\uA49E"], /* YI RADICAL PUT */
+ ["\uA49F", "\uA49F"], /* YI RADICAL HXUO */
+ ["\uA4A0", "\uA4A0"], /* YI RADICAL TAT */
+ ["\uA4A1", "\uA4A1"], /* YI RADICAL GA */
+ ["\uA4A2", "\uA4A2"], /* YI RADICAL ZUP */
+ ["\uA4A3", "\uA4A3"], /* YI RADICAL CYT */
+ ["\uA4A4", "\uA4A4"], /* YI RADICAL DDUR */
+ ["\uA4A5", "\uA4A5"], /* YI RADICAL BUR */
+ ["\uA4A6", "\uA4A6"], /* YI RADICAL GGUO */
+ ["\uA4A7", "\uA4A7"], /* YI RADICAL NYOP */
+ ["\uA4A8", "\uA4A8"], /* YI RADICAL TU */
+ ["\uA4A9", "\uA4A9"], /* YI RADICAL OP */
+ ["\uA4AA", "\uA4AA"], /* YI RADICAL JJUT */
+ ["\uA4AB", "\uA4AB"], /* YI RADICAL ZOT */
+ ["\uA4AC", "\uA4AC"], /* YI RADICAL PYT */
+ ["\uA4AD", "\uA4AD"], /* YI RADICAL HMO */
+ ["\uA4AE", "\uA4AE"], /* YI RADICAL YIT */
+ ["\uA4AF", "\uA4AF"], /* YI RADICAL VUR */
+ ["\uA4B0", "\uA4B0"], /* YI RADICAL SHY */
+ ["\uA4B1", "\uA4B1"], /* YI RADICAL VEP */
+ ["\uA4B2", "\uA4B2"], /* YI RADICAL ZA */
+ ["\uA4B3", "\uA4B3"], /* YI RADICAL JO */
+ ["\uA4B4", "\uA4B4"], /* YI RADICAL NZUP */
+ ["\uA4B5", "\uA4B5"], /* YI RADICAL JJY */
+ ["\uA4B6", "\uA4B6"], /* YI RADICAL GOT */
+ ["\uA4B7", "\uA4B7"], /* YI RADICAL JJIE */
+ ["\uA4B8", "\uA4B8"], /* YI RADICAL WO */
+ ["\uA4B9", "\uA4B9"], /* YI RADICAL DU */
+ ["\uA4BA", "\uA4BA"], /* YI RADICAL SHUR */
+ ["\uA4BB", "\uA4BB"], /* YI RADICAL LIE */
+ ["\uA4BC", "\uA4BC"], /* YI RADICAL CY */
+ ["\uA4BD", "\uA4BD"], /* YI RADICAL CUOP */
+ ["\uA4BE", "\uA4BE"], /* YI RADICAL CIP */
+ ["\uA4BF", "\uA4BF"], /* YI RADICAL HXOP */
+ ["\uA4C0", "\uA4C0"], /* YI RADICAL SHAT */
+ ["\uA4C1", "\uA4C1"], /* YI RADICAL ZUR */
+ ["\uA4C2", "\uA4C2"], /* YI RADICAL SHOP */
+ ["\uA4C3", "\uA4C3"], /* YI RADICAL CHE */
+ ["\uA4C4", "\uA4C4"], /* YI RADICAL ZZIET */
+ ["\uA4C5", "\uA4C5"], /* YI RADICAL NBIE */
+ ["\uA4C6", "\uA4C6"], /* YI RADICAL KE */
+ ["\uA4C7", "\uA4C7"],
+ ["\uA4C8", "\uA4C8"],
+ ["\uA4C9", "\uA4C9"],
+ ["\uA4CA", "\uA4CA"],
+ ["\uA4CB", "\uA4CB"],
+ ["\uA4CC", "\uA4CC"],
+ ["\uA4CD", "\uA4CD"],
+ ["\uA4CE", "\uA4CE"],
+ ["\uA4CF", "\uA4CF"],
+ ["\uA4D0", "\uA4D0"], /* LISU LETTER BA */
+ ["\uA4D1", "\uA4D1"], /* LISU LETTER PA */
+ ["\uA4D2", "\uA4D2"], /* LISU LETTER PHA */
+ ["\uA4D3", "\uA4D3"], /* LISU LETTER DA */
+ ["\uA4D4", "\uA4D4"], /* LISU LETTER TA */
+ ["\uA4D5", "\uA4D5"], /* LISU LETTER THA */
+ ["\uA4D6", "\uA4D6"], /* LISU LETTER GA */
+ ["\uA4D7", "\uA4D7"], /* LISU LETTER KA */
+ ["\uA4D8", "\uA4D8"], /* LISU LETTER KHA */
+ ["\uA4D9", "\uA4D9"], /* LISU LETTER JA */
+ ["\uA4DA", "\uA4DA"], /* LISU LETTER CA */
+ ["\uA4DB", "\uA4DB"], /* LISU LETTER CHA */
+ ["\uA4DC", "\uA4DC"], /* LISU LETTER DZA */
+ ["\uA4DD", "\uA4DD"], /* LISU LETTER TSA */
+ ["\uA4DE", "\uA4DE"], /* LISU LETTER TSHA */
+ ["\uA4DF", "\uA4DF"], /* LISU LETTER MA */
+ ["\uA4E0", "\uA4E0"], /* LISU LETTER NA */
+ ["\uA4E1", "\uA4E1"], /* LISU LETTER LA */
+ ["\uA4E2", "\uA4E2"], /* LISU LETTER SA */
+ ["\uA4E3", "\uA4E3"], /* LISU LETTER ZHA */
+ ["\uA4E4", "\uA4E4"], /* LISU LETTER ZA */
+ ["\uA4E5", "\uA4E5"], /* LISU LETTER NGA */
+ ["\uA4E6", "\uA4E6"], /* LISU LETTER HA */
+ ["\uA4E7", "\uA4E7"], /* LISU LETTER XA */
+ ["\uA4E8", "\uA4E8"], /* LISU LETTER HHA */
+ ["\uA4E9", "\uA4E9"], /* LISU LETTER FA */
+ ["\uA4EA", "\uA4EA"], /* LISU LETTER WA */
+ ["\uA4EB", "\uA4EB"], /* LISU LETTER SHA */
+ ["\uA4EC", "\uA4EC"], /* LISU LETTER YA */
+ ["\uA4ED", "\uA4ED"], /* LISU LETTER GHA */
+ ["\uA4EE", "\uA4EE"], /* LISU LETTER A */
+ ["\uA4EF", "\uA4EF"], /* LISU LETTER AE */
+ ["\uA4F0", "\uA4F0"], /* LISU LETTER E */
+ ["\uA4F1", "\uA4F1"], /* LISU LETTER EU */
+ ["\uA4F2", "\uA4F2"], /* LISU LETTER I */
+ ["\uA4F3", "\uA4F3"], /* LISU LETTER O */
+ ["\uA4F4", "\uA4F4"], /* LISU LETTER U */
+ ["\uA4F5", "\uA4F5"], /* LISU LETTER UE */
+ ["\uA4F6", "\uA4F6"], /* LISU LETTER UH */
+ ["\uA4F7", "\uA4F7"], /* LISU LETTER OE */
+ ["\uA4F8", "\uA4F8"], /* LISU LETTER TONE MYA TI */
+ ["\uA4F9", "\uA4F9"], /* LISU LETTER TONE NA PO */
+ ["\uA4FA", "\uA4FA"], /* LISU LETTER TONE MYA CYA */
+ ["\uA4FB", "\uA4FB"], /* LISU LETTER TONE MYA BO */
+ ["\uA4FC", "\uA4FC"], /* LISU LETTER TONE MYA NA */
+ ["\uA4FD", "\uA4FD"], /* LISU LETTER TONE MYA JEU */
+ ["\uA4FE", "\uA4FE"], /* LISU PUNCTUATION COMMA */
+ ["\uA4FF", "\uA4FF"], /* LISU PUNCTUATION FULL STOP */
+ ["\uA500", "\uA500"], /* VAI SYLLABLE EE */
+ ["\uA501", "\uA501"], /* VAI SYLLABLE EEN */
+ ["\uA502", "\uA502"], /* VAI SYLLABLE HEE */
+ ["\uA503", "\uA503"], /* VAI SYLLABLE WEE */
+ ["\uA504", "\uA504"], /* VAI SYLLABLE WEEN */
+ ["\uA505", "\uA505"], /* VAI SYLLABLE PEE */
+ ["\uA506", "\uA506"], /* VAI SYLLABLE BHEE */
+ ["\uA507", "\uA507"], /* VAI SYLLABLE BEE */
+ ["\uA508", "\uA508"], /* VAI SYLLABLE MBEE */
+ ["\uA509", "\uA509"], /* VAI SYLLABLE KPEE */
+ ["\uA50A", "\uA50A"], /* VAI SYLLABLE MGBEE */
+ ["\uA50B", "\uA50B"], /* VAI SYLLABLE GBEE */
+ ["\uA50C", "\uA50C"], /* VAI SYLLABLE FEE */
+ ["\uA50D", "\uA50D"], /* VAI SYLLABLE VEE */
+ ["\uA50E", "\uA50E"], /* VAI SYLLABLE TEE */
+ ["\uA50F", "\uA50F"], /* VAI SYLLABLE THEE */
+ ["\uA510", "\uA510"], /* VAI SYLLABLE DHEE */
+ ["\uA511", "\uA511"], /* VAI SYLLABLE DHHEE */
+ ["\uA512", "\uA512"], /* VAI SYLLABLE LEE */
+ ["\uA513", "\uA513"], /* VAI SYLLABLE REE */
+ ["\uA514", "\uA514"], /* VAI SYLLABLE DEE */
+ ["\uA515", "\uA515"], /* VAI SYLLABLE NDEE */
+ ["\uA516", "\uA516"], /* VAI SYLLABLE SEE */
+ ["\uA517", "\uA517"], /* VAI SYLLABLE SHEE */
+ ["\uA518", "\uA518"], /* VAI SYLLABLE ZEE */
+ ["\uA519", "\uA519"], /* VAI SYLLABLE ZHEE */
+ ["\uA51A", "\uA51A"], /* VAI SYLLABLE CEE */
+ ["\uA51B", "\uA51B"], /* VAI SYLLABLE JEE */
+ ["\uA51C", "\uA51C"], /* VAI SYLLABLE NJEE */
+ ["\uA51D", "\uA51D"], /* VAI SYLLABLE YEE */
+ ["\uA51E", "\uA51E"], /* VAI SYLLABLE KEE */
+ ["\uA51F", "\uA51F"], /* VAI SYLLABLE NGGEE */
+ ["\uA520", "\uA520"], /* VAI SYLLABLE GEE */
+ ["\uA521", "\uA521"], /* VAI SYLLABLE MEE */
+ ["\uA522", "\uA522"], /* VAI SYLLABLE NEE */
+ ["\uA523", "\uA523"], /* VAI SYLLABLE NYEE */
+ ["\uA524", "\uA524"], /* VAI SYLLABLE I */
+ ["\uA525", "\uA525"], /* VAI SYLLABLE IN */
+ ["\uA526", "\uA526"], /* VAI SYLLABLE HI */
+ ["\uA527", "\uA527"], /* VAI SYLLABLE HIN */
+ ["\uA528", "\uA528"], /* VAI SYLLABLE WI */
+ ["\uA529", "\uA529"], /* VAI SYLLABLE WIN */
+ ["\uA52A", "\uA52A"], /* VAI SYLLABLE PI */
+ ["\uA52B", "\uA52B"], /* VAI SYLLABLE BHI */
+ ["\uA52C", "\uA52C"], /* VAI SYLLABLE BI */
+ ["\uA52D", "\uA52D"], /* VAI SYLLABLE MBI */
+ ["\uA52E", "\uA52E"], /* VAI SYLLABLE KPI */
+ ["\uA52F", "\uA52F"], /* VAI SYLLABLE MGBI */
+ ["\uA530", "\uA530"], /* VAI SYLLABLE GBI */
+ ["\uA531", "\uA531"], /* VAI SYLLABLE FI */
+ ["\uA532", "\uA532"], /* VAI SYLLABLE VI */
+ ["\uA533", "\uA533"], /* VAI SYLLABLE TI */
+ ["\uA534", "\uA534"], /* VAI SYLLABLE THI */
+ ["\uA535", "\uA535"], /* VAI SYLLABLE DHI */
+ ["\uA536", "\uA536"], /* VAI SYLLABLE DHHI */
+ ["\uA537", "\uA537"], /* VAI SYLLABLE LI */
+ ["\uA538", "\uA538"], /* VAI SYLLABLE RI */
+ ["\uA539", "\uA539"], /* VAI SYLLABLE DI */
+ ["\uA53A", "\uA53A"], /* VAI SYLLABLE NDI */
+ ["\uA53B", "\uA53B"], /* VAI SYLLABLE SI */
+ ["\uA53C", "\uA53C"], /* VAI SYLLABLE SHI */
+ ["\uA53D", "\uA53D"], /* VAI SYLLABLE ZI */
+ ["\uA53E", "\uA53E"], /* VAI SYLLABLE ZHI */
+ ["\uA53F", "\uA53F"], /* VAI SYLLABLE CI */
+ ["\uA540", "\uA540"], /* VAI SYLLABLE JI */
+ ["\uA541", "\uA541"], /* VAI SYLLABLE NJI */
+ ["\uA542", "\uA542"], /* VAI SYLLABLE YI */
+ ["\uA543", "\uA543"], /* VAI SYLLABLE KI */
+ ["\uA544", "\uA544"], /* VAI SYLLABLE NGGI */
+ ["\uA545", "\uA545"], /* VAI SYLLABLE GI */
+ ["\uA546", "\uA546"], /* VAI SYLLABLE MI */
+ ["\uA547", "\uA547"], /* VAI SYLLABLE NI */
+ ["\uA548", "\uA548"], /* VAI SYLLABLE NYI */
+ ["\uA549", "\uA549"], /* VAI SYLLABLE A */
+ ["\uA54A", "\uA54A"], /* VAI SYLLABLE AN */
+ ["\uA54B", "\uA54B"], /* VAI SYLLABLE NGAN */
+ ["\uA54C", "\uA54C"], /* VAI SYLLABLE HA */
+ ["\uA54D", "\uA54D"], /* VAI SYLLABLE HAN */
+ ["\uA54E", "\uA54E"], /* VAI SYLLABLE WA */
+ ["\uA54F", "\uA54F"], /* VAI SYLLABLE WAN */
+ ["\uA550", "\uA550"], /* VAI SYLLABLE PA */
+ ["\uA551", "\uA551"], /* VAI SYLLABLE BHA */
+ ["\uA552", "\uA552"], /* VAI SYLLABLE BA */
+ ["\uA553", "\uA553"], /* VAI SYLLABLE MBA */
+ ["\uA554", "\uA554"], /* VAI SYLLABLE KPA */
+ ["\uA555", "\uA555"], /* VAI SYLLABLE KPAN */
+ ["\uA556", "\uA556"], /* VAI SYLLABLE MGBA */
+ ["\uA557", "\uA557"], /* VAI SYLLABLE GBA */
+ ["\uA558", "\uA558"], /* VAI SYLLABLE FA */
+ ["\uA559", "\uA559"], /* VAI SYLLABLE VA */
+ ["\uA55A", "\uA55A"], /* VAI SYLLABLE TA */
+ ["\uA55B", "\uA55B"], /* VAI SYLLABLE THA */
+ ["\uA55C", "\uA55C"], /* VAI SYLLABLE DHA */
+ ["\uA55D", "\uA55D"], /* VAI SYLLABLE DHHA */
+ ["\uA55E", "\uA55E"], /* VAI SYLLABLE LA */
+ ["\uA55F", "\uA55F"], /* VAI SYLLABLE RA */
+ ["\uA560", "\uA560"], /* VAI SYLLABLE DA */
+ ["\uA561", "\uA561"], /* VAI SYLLABLE NDA */
+ ["\uA562", "\uA562"], /* VAI SYLLABLE SA */
+ ["\uA563", "\uA563"], /* VAI SYLLABLE SHA */
+ ["\uA564", "\uA564"], /* VAI SYLLABLE ZA */
+ ["\uA565", "\uA565"], /* VAI SYLLABLE ZHA */
+ ["\uA566", "\uA566"], /* VAI SYLLABLE CA */
+ ["\uA567", "\uA567"], /* VAI SYLLABLE JA */
+ ["\uA568", "\uA568"], /* VAI SYLLABLE NJA */
+ ["\uA569", "\uA569"], /* VAI SYLLABLE YA */
+ ["\uA56A", "\uA56A"], /* VAI SYLLABLE KA */
+ ["\uA56B", "\uA56B"], /* VAI SYLLABLE KAN */
+ ["\uA56C", "\uA56C"], /* VAI SYLLABLE NGGA */
+ ["\uA56D", "\uA56D"], /* VAI SYLLABLE GA */
+ ["\uA56E", "\uA56E"], /* VAI SYLLABLE MA */
+ ["\uA56F", "\uA56F"], /* VAI SYLLABLE NA */
+ ["\uA570", "\uA570"], /* VAI SYLLABLE NYA */
+ ["\uA571", "\uA571"], /* VAI SYLLABLE OO */
+ ["\uA572", "\uA572"], /* VAI SYLLABLE OON */
+ ["\uA573", "\uA573"], /* VAI SYLLABLE HOO */
+ ["\uA574", "\uA574"], /* VAI SYLLABLE WOO */
+ ["\uA575", "\uA575"], /* VAI SYLLABLE WOON */
+ ["\uA576", "\uA576"], /* VAI SYLLABLE POO */
+ ["\uA577", "\uA577"], /* VAI SYLLABLE BHOO */
+ ["\uA578", "\uA578"], /* VAI SYLLABLE BOO */
+ ["\uA579", "\uA579"], /* VAI SYLLABLE MBOO */
+ ["\uA57A", "\uA57A"], /* VAI SYLLABLE KPOO */
+ ["\uA57B", "\uA57B"], /* VAI SYLLABLE MGBOO */
+ ["\uA57C", "\uA57C"], /* VAI SYLLABLE GBOO */
+ ["\uA57D", "\uA57D"], /* VAI SYLLABLE FOO */
+ ["\uA57E", "\uA57E"], /* VAI SYLLABLE VOO */
+ ["\uA57F", "\uA57F"], /* VAI SYLLABLE TOO */
+ ["\uA580", "\uA580"], /* VAI SYLLABLE THOO */
+ ["\uA581", "\uA581"], /* VAI SYLLABLE DHOO */
+ ["\uA582", "\uA582"], /* VAI SYLLABLE DHHOO */
+ ["\uA583", "\uA583"], /* VAI SYLLABLE LOO */
+ ["\uA584", "\uA584"], /* VAI SYLLABLE ROO */
+ ["\uA585", "\uA585"], /* VAI SYLLABLE DOO */
+ ["\uA586", "\uA586"], /* VAI SYLLABLE NDOO */
+ ["\uA587", "\uA587"], /* VAI SYLLABLE SOO */
+ ["\uA588", "\uA588"], /* VAI SYLLABLE SHOO */
+ ["\uA589", "\uA589"], /* VAI SYLLABLE ZOO */
+ ["\uA58A", "\uA58A"], /* VAI SYLLABLE ZHOO */
+ ["\uA58B", "\uA58B"], /* VAI SYLLABLE COO */
+ ["\uA58C", "\uA58C"], /* VAI SYLLABLE JOO */
+ ["\uA58D", "\uA58D"], /* VAI SYLLABLE NJOO */
+ ["\uA58E", "\uA58E"], /* VAI SYLLABLE YOO */
+ ["\uA58F", "\uA58F"], /* VAI SYLLABLE KOO */
+ ["\uA590", "\uA590"], /* VAI SYLLABLE NGGOO */
+ ["\uA591", "\uA591"], /* VAI SYLLABLE GOO */
+ ["\uA592", "\uA592"], /* VAI SYLLABLE MOO */
+ ["\uA593", "\uA593"], /* VAI SYLLABLE NOO */
+ ["\uA594", "\uA594"], /* VAI SYLLABLE NYOO */
+ ["\uA595", "\uA595"], /* VAI SYLLABLE U */
+ ["\uA596", "\uA596"], /* VAI SYLLABLE UN */
+ ["\uA597", "\uA597"], /* VAI SYLLABLE HU */
+ ["\uA598", "\uA598"], /* VAI SYLLABLE HUN */
+ ["\uA599", "\uA599"], /* VAI SYLLABLE WU */
+ ["\uA59A", "\uA59A"], /* VAI SYLLABLE WUN */
+ ["\uA59B", "\uA59B"], /* VAI SYLLABLE PU */
+ ["\uA59C", "\uA59C"], /* VAI SYLLABLE BHU */
+ ["\uA59D", "\uA59D"], /* VAI SYLLABLE BU */
+ ["\uA59E", "\uA59E"], /* VAI SYLLABLE MBU */
+ ["\uA59F", "\uA59F"], /* VAI SYLLABLE KPU */
+ ["\uA5A0", "\uA5A0"], /* VAI SYLLABLE MGBU */
+ ["\uA5A1", "\uA5A1"], /* VAI SYLLABLE GBU */
+ ["\uA5A2", "\uA5A2"], /* VAI SYLLABLE FU */
+ ["\uA5A3", "\uA5A3"], /* VAI SYLLABLE VU */
+ ["\uA5A4", "\uA5A4"], /* VAI SYLLABLE TU */
+ ["\uA5A5", "\uA5A5"], /* VAI SYLLABLE THU */
+ ["\uA5A6", "\uA5A6"], /* VAI SYLLABLE DHU */
+ ["\uA5A7", "\uA5A7"], /* VAI SYLLABLE DHHU */
+ ["\uA5A8", "\uA5A8"], /* VAI SYLLABLE LU */
+ ["\uA5A9", "\uA5A9"], /* VAI SYLLABLE RU */
+ ["\uA5AA", "\uA5AA"], /* VAI SYLLABLE DU */
+ ["\uA5AB", "\uA5AB"], /* VAI SYLLABLE NDU */
+ ["\uA5AC", "\uA5AC"], /* VAI SYLLABLE SU */
+ ["\uA5AD", "\uA5AD"], /* VAI SYLLABLE SHU */
+ ["\uA5AE", "\uA5AE"], /* VAI SYLLABLE ZU */
+ ["\uA5AF", "\uA5AF"], /* VAI SYLLABLE ZHU */
+ ["\uA5B0", "\uA5B0"], /* VAI SYLLABLE CU */
+ ["\uA5B1", "\uA5B1"], /* VAI SYLLABLE JU */
+ ["\uA5B2", "\uA5B2"], /* VAI SYLLABLE NJU */
+ ["\uA5B3", "\uA5B3"], /* VAI SYLLABLE YU */
+ ["\uA5B4", "\uA5B4"], /* VAI SYLLABLE KU */
+ ["\uA5B5", "\uA5B5"], /* VAI SYLLABLE NGGU */
+ ["\uA5B6", "\uA5B6"], /* VAI SYLLABLE GU */
+ ["\uA5B7", "\uA5B7"], /* VAI SYLLABLE MU */
+ ["\uA5B8", "\uA5B8"], /* VAI SYLLABLE NU */
+ ["\uA5B9", "\uA5B9"], /* VAI SYLLABLE NYU */
+ ["\uA5BA", "\uA5BA"], /* VAI SYLLABLE O */
+ ["\uA5BB", "\uA5BB"], /* VAI SYLLABLE ON */
+ ["\uA5BC", "\uA5BC"], /* VAI SYLLABLE NGON */
+ ["\uA5BD", "\uA5BD"], /* VAI SYLLABLE HO */
+ ["\uA5BE", "\uA5BE"], /* VAI SYLLABLE HON */
+ ["\uA5BF", "\uA5BF"], /* VAI SYLLABLE WO */
+ ["\uA5C0", "\uA5C0"], /* VAI SYLLABLE WON */
+ ["\uA5C1", "\uA5C1"], /* VAI SYLLABLE PO */
+ ["\uA5C2", "\uA5C2"], /* VAI SYLLABLE BHO */
+ ["\uA5C3", "\uA5C3"], /* VAI SYLLABLE BO */
+ ["\uA5C4", "\uA5C4"], /* VAI SYLLABLE MBO */
+ ["\uA5C5", "\uA5C5"], /* VAI SYLLABLE KPO */
+ ["\uA5C6", "\uA5C6"], /* VAI SYLLABLE MGBO */
+ ["\uA5C7", "\uA5C7"], /* VAI SYLLABLE GBO */
+ ["\uA5C8", "\uA5C8"], /* VAI SYLLABLE GBON */
+ ["\uA5C9", "\uA5C9"], /* VAI SYLLABLE FO */
+ ["\uA5CA", "\uA5CA"], /* VAI SYLLABLE VO */
+ ["\uA5CB", "\uA5CB"], /* VAI SYLLABLE TO */
+ ["\uA5CC", "\uA5CC"], /* VAI SYLLABLE THO */
+ ["\uA5CD", "\uA5CD"], /* VAI SYLLABLE DHO */
+ ["\uA5CE", "\uA5CE"], /* VAI SYLLABLE DHHO */
+ ["\uA5CF", "\uA5CF"], /* VAI SYLLABLE LO */
+ ["\uA5D0", "\uA5D0"], /* VAI SYLLABLE RO */
+ ["\uA5D1", "\uA5D1"], /* VAI SYLLABLE DO */
+ ["\uA5D2", "\uA5D2"], /* VAI SYLLABLE NDO */
+ ["\uA5D3", "\uA5D3"], /* VAI SYLLABLE SO */
+ ["\uA5D4", "\uA5D4"], /* VAI SYLLABLE SHO */
+ ["\uA5D5", "\uA5D5"], /* VAI SYLLABLE ZO */
+ ["\uA5D6", "\uA5D6"], /* VAI SYLLABLE ZHO */
+ ["\uA5D7", "\uA5D7"], /* VAI SYLLABLE CO */
+ ["\uA5D8", "\uA5D8"], /* VAI SYLLABLE JO */
+ ["\uA5D9", "\uA5D9"], /* VAI SYLLABLE NJO */
+ ["\uA5DA", "\uA5DA"], /* VAI SYLLABLE YO */
+ ["\uA5DB", "\uA5DB"], /* VAI SYLLABLE KO */
+ ["\uA5DC", "\uA5DC"], /* VAI SYLLABLE NGGO */
+ ["\uA5DD", "\uA5DD"], /* VAI SYLLABLE GO */
+ ["\uA5DE", "\uA5DE"], /* VAI SYLLABLE MO */
+ ["\uA5DF", "\uA5DF"], /* VAI SYLLABLE NO */
+ ["\uA5E0", "\uA5E0"], /* VAI SYLLABLE NYO */
+ ["\uA5E1", "\uA5E1"], /* VAI SYLLABLE E */
+ ["\uA5E2", "\uA5E2"], /* VAI SYLLABLE EN */
+ ["\uA5E3", "\uA5E3"], /* VAI SYLLABLE NGEN */
+ ["\uA5E4", "\uA5E4"], /* VAI SYLLABLE HE */
+ ["\uA5E5", "\uA5E5"], /* VAI SYLLABLE HEN */
+ ["\uA5E6", "\uA5E6"], /* VAI SYLLABLE WE */
+ ["\uA5E7", "\uA5E7"], /* VAI SYLLABLE WEN */
+ ["\uA5E8", "\uA5E8"], /* VAI SYLLABLE PE */
+ ["\uA5E9", "\uA5E9"], /* VAI SYLLABLE BHE */
+ ["\uA5EA", "\uA5EA"], /* VAI SYLLABLE BE */
+ ["\uA5EB", "\uA5EB"], /* VAI SYLLABLE MBE */
+ ["\uA5EC", "\uA5EC"], /* VAI SYLLABLE KPE */
+ ["\uA5ED", "\uA5ED"], /* VAI SYLLABLE KPEN */
+ ["\uA5EE", "\uA5EE"], /* VAI SYLLABLE MGBE */
+ ["\uA5EF", "\uA5EF"], /* VAI SYLLABLE GBE */
+ ["\uA5F0", "\uA5F0"], /* VAI SYLLABLE GBEN */
+ ["\uA5F1", "\uA5F1"], /* VAI SYLLABLE FE */
+ ["\uA5F2", "\uA5F2"], /* VAI SYLLABLE VE */
+ ["\uA5F3", "\uA5F3"], /* VAI SYLLABLE TE */
+ ["\uA5F4", "\uA5F4"], /* VAI SYLLABLE THE */
+ ["\uA5F5", "\uA5F5"], /* VAI SYLLABLE DHE */
+ ["\uA5F6", "\uA5F6"], /* VAI SYLLABLE DHHE */
+ ["\uA5F7", "\uA5F7"], /* VAI SYLLABLE LE */
+ ["\uA5F8", "\uA5F8"], /* VAI SYLLABLE RE */
+ ["\uA5F9", "\uA5F9"], /* VAI SYLLABLE DE */
+ ["\uA5FA", "\uA5FA"], /* VAI SYLLABLE NDE */
+ ["\uA5FB", "\uA5FB"], /* VAI SYLLABLE SE */
+ ["\uA5FC", "\uA5FC"], /* VAI SYLLABLE SHE */
+ ["\uA5FD", "\uA5FD"], /* VAI SYLLABLE ZE */
+ ["\uA5FE", "\uA5FE"], /* VAI SYLLABLE ZHE */
+ ["\uA5FF", "\uA5FF"], /* VAI SYLLABLE CE */
+ ["\uA600", "\uA600"], /* VAI SYLLABLE JE */
+ ["\uA601", "\uA601"], /* VAI SYLLABLE NJE */
+ ["\uA602", "\uA602"], /* VAI SYLLABLE YE */
+ ["\uA603", "\uA603"], /* VAI SYLLABLE KE */
+ ["\uA604", "\uA604"], /* VAI SYLLABLE NGGE */
+ ["\uA605", "\uA605"], /* VAI SYLLABLE NGGEN */
+ ["\uA606", "\uA606"], /* VAI SYLLABLE GE */
+ ["\uA607", "\uA607"], /* VAI SYLLABLE GEN */
+ ["\uA608", "\uA608"], /* VAI SYLLABLE ME */
+ ["\uA609", "\uA609"], /* VAI SYLLABLE NE */
+ ["\uA60A", "\uA60A"], /* VAI SYLLABLE NYE */
+ ["\uA60B", "\uA60B"], /* VAI SYLLABLE NG */
+ ["\uA60C", "\uA60C"], /* VAI SYLLABLE LENGTHENER */
+ ["\uA60D", "\uA60D"], /* VAI COMMA */
+ ["\uA60E", "\uA60E"], /* VAI FULL STOP */
+ ["\uA60F", "\uA60F"], /* VAI QUESTION MARK */
+ ["\uA610", "\uA610"], /* VAI SYLLABLE NDOLE FA */
+ ["\uA611", "\uA611"], /* VAI SYLLABLE NDOLE KA */
+ ["\uA612", "\uA612"], /* VAI SYLLABLE NDOLE SOO */
+ ["\uA613", "\uA613"], /* VAI SYMBOL FEENG */
+ ["\uA614", "\uA614"], /* VAI SYMBOL KEENG */
+ ["\uA615", "\uA615"], /* VAI SYMBOL TING */
+ ["\uA616", "\uA616"], /* VAI SYMBOL NII */
+ ["\uA617", "\uA617"], /* VAI SYMBOL BANG */
+ ["\uA618", "\uA618"], /* VAI SYMBOL FAA */
+ ["\uA619", "\uA619"], /* VAI SYMBOL TAA */
+ ["\uA61A", "\uA61A"], /* VAI SYMBOL DANG */
+ ["\uA61B", "\uA61B"], /* VAI SYMBOL DOONG */
+ ["\uA61C", "\uA61C"], /* VAI SYMBOL KUNG */
+ ["\uA61D", "\uA61D"], /* VAI SYMBOL TONG */
+ ["\uA61E", "\uA61E"], /* VAI SYMBOL DO-O */
+ ["\uA61F", "\uA61F"], /* VAI SYMBOL JONG */
+ ["\uA620", "\uA620"], /* VAI DIGIT ZERO */
+ ["\uA621", "\uA621"], /* VAI DIGIT ONE */
+ ["\uA622", "\uA622"], /* VAI DIGIT TWO */
+ ["\uA623", "\uA623"], /* VAI DIGIT THREE */
+ ["\uA624", "\uA624"], /* VAI DIGIT FOUR */
+ ["\uA625", "\uA625"], /* VAI DIGIT FIVE */
+ ["\uA626", "\uA626"], /* VAI DIGIT SIX */
+ ["\uA627", "\uA627"], /* VAI DIGIT SEVEN */
+ ["\uA628", "\uA628"], /* VAI DIGIT EIGHT */
+ ["\uA629", "\uA629"], /* VAI DIGIT NINE */
+ ["\uA62A", "\uA62A"], /* VAI SYLLABLE NDOLE MA */
+ ["\uA62B", "\uA62B"], /* VAI SYLLABLE NDOLE DO */
+ ["\uA62C", "\uA62C"],
+ ["\uA62D", "\uA62D"],
+ ["\uA62E", "\uA62E"],
+ ["\uA62F", "\uA62F"],
+ ["\uA630", "\uA630"],
+ ["\uA631", "\uA631"],
+ ["\uA632", "\uA632"],
+ ["\uA633", "\uA633"],
+ ["\uA634", "\uA634"],
+ ["\uA635", "\uA635"],
+ ["\uA636", "\uA636"],
+ ["\uA637", "\uA637"],
+ ["\uA638", "\uA638"],
+ ["\uA639", "\uA639"],
+ ["\uA63A", "\uA63A"],
+ ["\uA63B", "\uA63B"],
+ ["\uA63C", "\uA63C"],
+ ["\uA63D", "\uA63D"],
+ ["\uA63E", "\uA63E"],
+ ["\uA63F", "\uA63F"],
+ ["\uA640", "\uA641"], /* CYRILLIC CAPITAL LETTER ZEMLYA */
+ ["\uA640", "\uA641"], /* CYRILLIC SMALL LETTER ZEMLYA */
+ ["\uA642", "\uA643"], /* CYRILLIC CAPITAL LETTER DZELO */
+ ["\uA642", "\uA643"], /* CYRILLIC SMALL LETTER DZELO */
+ ["\uA644", "\uA645"], /* CYRILLIC CAPITAL LETTER REVERSED DZE */
+ ["\uA644", "\uA645"], /* CYRILLIC SMALL LETTER REVERSED DZE */
+ ["\uA646", "\uA647"], /* CYRILLIC CAPITAL LETTER IOTA */
+ ["\uA646", "\uA647"], /* CYRILLIC SMALL LETTER IOTA */
+ ["\uA648", "\uA649"], /* CYRILLIC CAPITAL LETTER DJERV */
+ ["\uA648", "\uA649"], /* CYRILLIC SMALL LETTER DJERV */
+ ["\uA64A", "\uA64B"], /* CYRILLIC CAPITAL LETTER MONOGRAPH UK */
+ ["\uA64A", "\uA64B"], /* CYRILLIC SMALL LETTER MONOGRAPH UK */
+ ["\uA64C", "\uA64D"], /* CYRILLIC CAPITAL LETTER BROAD OMEGA */
+ ["\uA64C", "\uA64D"], /* CYRILLIC SMALL LETTER BROAD OMEGA */
+ ["\uA64E", "\uA64F"], /* CYRILLIC CAPITAL LETTER NEUTRAL YER */
+ ["\uA64E", "\uA64F"], /* CYRILLIC SMALL LETTER NEUTRAL YER */
+ ["\uA650", "\uA651"], /* CYRILLIC CAPITAL LETTER YERU WITH BACK YER */
+ ["\uA650", "\uA651"], /* CYRILLIC SMALL LETTER YERU WITH BACK YER */
+ ["\uA652", "\uA653"], /* CYRILLIC CAPITAL LETTER IOTIFIED YAT */
+ ["\uA652", "\uA653"], /* CYRILLIC SMALL LETTER IOTIFIED YAT */
+ ["\uA654", "\uA655"], /* CYRILLIC CAPITAL LETTER REVERSED YU */
+ ["\uA654", "\uA655"], /* CYRILLIC SMALL LETTER REVERSED YU */
+ ["\uA656", "\uA657"], /* CYRILLIC CAPITAL LETTER IOTIFIED A */
+ ["\uA656", "\uA657"], /* CYRILLIC SMALL LETTER IOTIFIED A */
+ ["\uA658", "\uA659"], /* CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS */
+ ["\uA658", "\uA659"], /* CYRILLIC SMALL LETTER CLOSED LITTLE YUS */
+ ["\uA65A", "\uA65B"], /* CYRILLIC CAPITAL LETTER BLENDED YUS */
+ ["\uA65A", "\uA65B"], /* CYRILLIC SMALL LETTER BLENDED YUS */
+ ["\uA65C", "\uA65D"], /* CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS */
+ ["\uA65C", "\uA65D"], /* CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS */
+ ["\uA65E", "\uA65F"], /* CYRILLIC CAPITAL LETTER YN */
+ ["\uA65E", "\uA65F"], /* CYRILLIC SMALL LETTER YN */
+ ["\uA660", "\uA661"], /* CYRILLIC CAPITAL LETTER REVERSED TSE */
+ ["\uA660", "\uA661"], /* CYRILLIC SMALL LETTER REVERSED TSE */
+ ["\uA662", "\uA663"], /* CYRILLIC CAPITAL LETTER SOFT DE */
+ ["\uA662", "\uA663"], /* CYRILLIC SMALL LETTER SOFT DE */
+ ["\uA664", "\uA665"], /* CYRILLIC CAPITAL LETTER SOFT EL */
+ ["\uA664", "\uA665"], /* CYRILLIC SMALL LETTER SOFT EL */
+ ["\uA666", "\uA667"], /* CYRILLIC CAPITAL LETTER SOFT EM */
+ ["\uA666", "\uA667"], /* CYRILLIC SMALL LETTER SOFT EM */
+ ["\uA668", "\uA669"], /* CYRILLIC CAPITAL LETTER MONOCULAR O */
+ ["\uA668", "\uA669"], /* CYRILLIC SMALL LETTER MONOCULAR O */
+ ["\uA66A", "\uA66B"], /* CYRILLIC CAPITAL LETTER BINOCULAR O */
+ ["\uA66A", "\uA66B"], /* CYRILLIC SMALL LETTER BINOCULAR O */
+ ["\uA66C", "\uA66D"], /* CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O */
+ ["\uA66C", "\uA66D"], /* CYRILLIC SMALL LETTER DOUBLE MONOCULAR O */
+ ["\uA66E", "\uA66E"], /* CYRILLIC LETTER MULTIOCULAR O */
+ ["\uA66F", "\uA66F"], /* COMBINING CYRILLIC VZMET */
+ ["\uA670", "\uA670"], /* COMBINING CYRILLIC TEN MILLIONS SIGN */
+ ["\uA671", "\uA671"], /* COMBINING CYRILLIC HUNDRED MILLIONS SIGN */
+ ["\uA672", "\uA672"], /* COMBINING CYRILLIC THOUSAND MILLIONS SIGN */
+ ["\uA673", "\uA673"], /* SLAVONIC ASTERISK */
+ ["\uA674", "\uA674"], /* COMBINING CYRILLIC LETTER UKRAINIAN IE */
+ ["\uA675", "\uA675"], /* COMBINING CYRILLIC LETTER I */
+ ["\uA676", "\uA676"], /* COMBINING CYRILLIC LETTER YI */
+ ["\uA677", "\uA677"], /* COMBINING CYRILLIC LETTER U */
+ ["\uA678", "\uA678"], /* COMBINING CYRILLIC LETTER HARD SIGN */
+ ["\uA679", "\uA679"], /* COMBINING CYRILLIC LETTER YERU */
+ ["\uA67A", "\uA67A"], /* COMBINING CYRILLIC LETTER SOFT SIGN */
+ ["\uA67B", "\uA67B"], /* COMBINING CYRILLIC LETTER OMEGA */
+ ["\uA67C", "\uA67C"], /* COMBINING CYRILLIC KAVYKA */
+ ["\uA67D", "\uA67D"], /* COMBINING CYRILLIC PAYEROK */
+ ["\uA67E", "\uA67E"], /* CYRILLIC KAVYKA */
+ ["\uA67F", "\uA67F"], /* CYRILLIC PAYEROK */
+ ["\uA680", "\uA681"], /* CYRILLIC CAPITAL LETTER DWE */
+ ["\uA680", "\uA681"], /* CYRILLIC SMALL LETTER DWE */
+ ["\uA682", "\uA683"], /* CYRILLIC CAPITAL LETTER DZWE */
+ ["\uA682", "\uA683"], /* CYRILLIC SMALL LETTER DZWE */
+ ["\uA684", "\uA685"], /* CYRILLIC CAPITAL LETTER ZHWE */
+ ["\uA684", "\uA685"], /* CYRILLIC SMALL LETTER ZHWE */
+ ["\uA686", "\uA687"], /* CYRILLIC CAPITAL LETTER CCHE */
+ ["\uA686", "\uA687"], /* CYRILLIC SMALL LETTER CCHE */
+ ["\uA688", "\uA689"], /* CYRILLIC CAPITAL LETTER DZZE */
+ ["\uA688", "\uA689"], /* CYRILLIC SMALL LETTER DZZE */
+ ["\uA68A", "\uA68B"], /* CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK */
+ ["\uA68A", "\uA68B"], /* CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK */
+ ["\uA68C", "\uA68D"], /* CYRILLIC CAPITAL LETTER TWE */
+ ["\uA68C", "\uA68D"], /* CYRILLIC SMALL LETTER TWE */
+ ["\uA68E", "\uA68F"], /* CYRILLIC CAPITAL LETTER TSWE */
+ ["\uA68E", "\uA68F"], /* CYRILLIC SMALL LETTER TSWE */
+ ["\uA690", "\uA691"], /* CYRILLIC CAPITAL LETTER TSSE */
+ ["\uA690", "\uA691"], /* CYRILLIC SMALL LETTER TSSE */
+ ["\uA692", "\uA693"], /* CYRILLIC CAPITAL LETTER TCHE */
+ ["\uA692", "\uA693"], /* CYRILLIC SMALL LETTER TCHE */
+ ["\uA694", "\uA695"], /* CYRILLIC CAPITAL LETTER HWE */
+ ["\uA694", "\uA695"], /* CYRILLIC SMALL LETTER HWE */
+ ["\uA696", "\uA697"], /* CYRILLIC CAPITAL LETTER SHWE */
+ ["\uA696", "\uA697"], /* CYRILLIC SMALL LETTER SHWE */
+ ["\uA698", "\uA699"], /* CYRILLIC CAPITAL LETTER DOUBLE O */
+ ["\uA698", "\uA699"], /* CYRILLIC SMALL LETTER DOUBLE O */
+ ["\uA69A", "\uA69B"], /* CYRILLIC CAPITAL LETTER CROSSED O */
+ ["\uA69A", "\uA69B"], /* CYRILLIC SMALL LETTER CROSSED O */
+ ["\uA69C", "\uA69C"], /* MODIFIER LETTER CYRILLIC HARD SIGN */
+ ["\uA69D", "\uA69D"], /* MODIFIER LETTER CYRILLIC SOFT SIGN */
+ ["\uA69E", "\uA69E"], /* COMBINING CYRILLIC LETTER EF */
+ ["\uA69F", "\uA69F"], /* COMBINING CYRILLIC LETTER IOTIFIED E */
+ ["\uA6A0", "\uA6A0"], /* BAMUM LETTER A */
+ ["\uA6A1", "\uA6A1"], /* BAMUM LETTER KA */
+ ["\uA6A2", "\uA6A2"], /* BAMUM LETTER U */
+ ["\uA6A3", "\uA6A3"], /* BAMUM LETTER KU */
+ ["\uA6A4", "\uA6A4"], /* BAMUM LETTER EE */
+ ["\uA6A5", "\uA6A5"], /* BAMUM LETTER REE */
+ ["\uA6A6", "\uA6A6"], /* BAMUM LETTER TAE */
+ ["\uA6A7", "\uA6A7"], /* BAMUM LETTER O */
+ ["\uA6A8", "\uA6A8"], /* BAMUM LETTER NYI */
+ ["\uA6A9", "\uA6A9"], /* BAMUM LETTER I */
+ ["\uA6AA", "\uA6AA"], /* BAMUM LETTER LA */
+ ["\uA6AB", "\uA6AB"], /* BAMUM LETTER PA */
+ ["\uA6AC", "\uA6AC"], /* BAMUM LETTER RII */
+ ["\uA6AD", "\uA6AD"], /* BAMUM LETTER RIEE */
+ ["\uA6AE", "\uA6AE"], /* BAMUM LETTER LEEEE */
+ ["\uA6AF", "\uA6AF"], /* BAMUM LETTER MEEEE */
+ ["\uA6B0", "\uA6B0"], /* BAMUM LETTER TAA */
+ ["\uA6B1", "\uA6B1"], /* BAMUM LETTER NDAA */
+ ["\uA6B2", "\uA6B2"], /* BAMUM LETTER NJAEM */
+ ["\uA6B3", "\uA6B3"], /* BAMUM LETTER M */
+ ["\uA6B4", "\uA6B4"], /* BAMUM LETTER SUU */
+ ["\uA6B5", "\uA6B5"], /* BAMUM LETTER MU */
+ ["\uA6B6", "\uA6B6"], /* BAMUM LETTER SHII */
+ ["\uA6B7", "\uA6B7"], /* BAMUM LETTER SI */
+ ["\uA6B8", "\uA6B8"], /* BAMUM LETTER SHEUX */
+ ["\uA6B9", "\uA6B9"], /* BAMUM LETTER SEUX */
+ ["\uA6BA", "\uA6BA"], /* BAMUM LETTER KYEE */
+ ["\uA6BB", "\uA6BB"], /* BAMUM LETTER KET */
+ ["\uA6BC", "\uA6BC"], /* BAMUM LETTER NUAE */
+ ["\uA6BD", "\uA6BD"], /* BAMUM LETTER NU */
+ ["\uA6BE", "\uA6BE"], /* BAMUM LETTER NJUAE */
+ ["\uA6BF", "\uA6BF"], /* BAMUM LETTER YOQ */
+ ["\uA6C0", "\uA6C0"], /* BAMUM LETTER SHU */
+ ["\uA6C1", "\uA6C1"], /* BAMUM LETTER YUQ */
+ ["\uA6C2", "\uA6C2"], /* BAMUM LETTER YA */
+ ["\uA6C3", "\uA6C3"], /* BAMUM LETTER NSHA */
+ ["\uA6C4", "\uA6C4"], /* BAMUM LETTER KEUX */
+ ["\uA6C5", "\uA6C5"], /* BAMUM LETTER PEUX */
+ ["\uA6C6", "\uA6C6"], /* BAMUM LETTER NJEE */
+ ["\uA6C7", "\uA6C7"], /* BAMUM LETTER NTEE */
+ ["\uA6C8", "\uA6C8"], /* BAMUM LETTER PUE */
+ ["\uA6C9", "\uA6C9"], /* BAMUM LETTER WUE */
+ ["\uA6CA", "\uA6CA"], /* BAMUM LETTER PEE */
+ ["\uA6CB", "\uA6CB"], /* BAMUM LETTER FEE */
+ ["\uA6CC", "\uA6CC"], /* BAMUM LETTER RU */
+ ["\uA6CD", "\uA6CD"], /* BAMUM LETTER LU */
+ ["\uA6CE", "\uA6CE"], /* BAMUM LETTER MI */
+ ["\uA6CF", "\uA6CF"], /* BAMUM LETTER NI */
+ ["\uA6D0", "\uA6D0"], /* BAMUM LETTER REUX */
+ ["\uA6D1", "\uA6D1"], /* BAMUM LETTER RAE */
+ ["\uA6D2", "\uA6D2"], /* BAMUM LETTER KEN */
+ ["\uA6D3", "\uA6D3"], /* BAMUM LETTER NGKWAEN */
+ ["\uA6D4", "\uA6D4"], /* BAMUM LETTER NGGA */
+ ["\uA6D5", "\uA6D5"], /* BAMUM LETTER NGA */
+ ["\uA6D6", "\uA6D6"], /* BAMUM LETTER SHO */
+ ["\uA6D7", "\uA6D7"], /* BAMUM LETTER PUAE */
+ ["\uA6D8", "\uA6D8"], /* BAMUM LETTER FU */
+ ["\uA6D9", "\uA6D9"], /* BAMUM LETTER FOM */
+ ["\uA6DA", "\uA6DA"], /* BAMUM LETTER WA */
+ ["\uA6DB", "\uA6DB"], /* BAMUM LETTER NA */
+ ["\uA6DC", "\uA6DC"], /* BAMUM LETTER LI */
+ ["\uA6DD", "\uA6DD"], /* BAMUM LETTER PI */
+ ["\uA6DE", "\uA6DE"], /* BAMUM LETTER LOQ */
+ ["\uA6DF", "\uA6DF"], /* BAMUM LETTER KO */
+ ["\uA6E0", "\uA6E0"], /* BAMUM LETTER MBEN */
+ ["\uA6E1", "\uA6E1"], /* BAMUM LETTER REN */
+ ["\uA6E2", "\uA6E2"], /* BAMUM LETTER MEN */
+ ["\uA6E3", "\uA6E3"], /* BAMUM LETTER MA */
+ ["\uA6E4", "\uA6E4"], /* BAMUM LETTER TI */
+ ["\uA6E5", "\uA6E5"], /* BAMUM LETTER KI */
+ ["\uA6E6", "\uA6E6"], /* BAMUM LETTER MO */
+ ["\uA6E7", "\uA6E7"], /* BAMUM LETTER MBAA */
+ ["\uA6E8", "\uA6E8"], /* BAMUM LETTER TET */
+ ["\uA6E9", "\uA6E9"], /* BAMUM LETTER KPA */
+ ["\uA6EA", "\uA6EA"], /* BAMUM LETTER TEN */
+ ["\uA6EB", "\uA6EB"], /* BAMUM LETTER NTUU */
+ ["\uA6EC", "\uA6EC"], /* BAMUM LETTER SAMBA */
+ ["\uA6ED", "\uA6ED"], /* BAMUM LETTER FAAMAE */
+ ["\uA6EE", "\uA6EE"], /* BAMUM LETTER KOVUU */
+ ["\uA6EF", "\uA6EF"], /* BAMUM LETTER KOGHOM */
+ ["\uA6F0", "\uA6F0"], /* BAMUM COMBINING MARK KOQNDON */
+ ["\uA6F1", "\uA6F1"], /* BAMUM COMBINING MARK TUKWENTIS */
+ ["\uA6F2", "\uA6F2"], /* BAMUM NJAEMLI */
+ ["\uA6F3", "\uA6F3"], /* BAMUM FULL STOP */
+ ["\uA6F4", "\uA6F4"], /* BAMUM COLON */
+ ["\uA6F5", "\uA6F5"], /* BAMUM COMMA */
+ ["\uA6F6", "\uA6F6"], /* BAMUM SEMICOLON */
+ ["\uA6F7", "\uA6F7"], /* BAMUM QUESTION MARK */
+ ["\uA6F8", "\uA6F8"],
+ ["\uA6F9", "\uA6F9"],
+ ["\uA6FA", "\uA6FA"],
+ ["\uA6FB", "\uA6FB"],
+ ["\uA6FC", "\uA6FC"],
+ ["\uA6FD", "\uA6FD"],
+ ["\uA6FE", "\uA6FE"],
+ ["\uA6FF", "\uA6FF"],
+ ["\uA700", "\uA700"], /* MODIFIER LETTER CHINESE TONE YIN PING */
+ ["\uA701", "\uA701"], /* MODIFIER LETTER CHINESE TONE YANG PING */
+ ["\uA702", "\uA702"], /* MODIFIER LETTER CHINESE TONE YIN SHANG */
+ ["\uA703", "\uA703"], /* MODIFIER LETTER CHINESE TONE YANG SHANG */
+ ["\uA704", "\uA704"], /* MODIFIER LETTER CHINESE TONE YIN QU */
+ ["\uA705", "\uA705"], /* MODIFIER LETTER CHINESE TONE YANG QU */
+ ["\uA706", "\uA706"], /* MODIFIER LETTER CHINESE TONE YIN RU */
+ ["\uA707", "\uA707"], /* MODIFIER LETTER CHINESE TONE YANG RU */
+ ["\uA708", "\uA708"], /* MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR */
+ ["\uA709", "\uA709"], /* MODIFIER LETTER HIGH DOTTED TONE BAR */
+ ["\uA70A", "\uA70A"], /* MODIFIER LETTER MID DOTTED TONE BAR */
+ ["\uA70B", "\uA70B"], /* MODIFIER LETTER LOW DOTTED TONE BAR */
+ ["\uA70C", "\uA70C"], /* MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR */
+ ["\uA70D", "\uA70D"], /* MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR */
+ ["\uA70E", "\uA70E"], /* MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR */
+ ["\uA70F", "\uA70F"], /* MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR */
+ ["\uA710", "\uA710"], /* MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR */
+ ["\uA711", "\uA711"], /* MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR */
+ ["\uA712", "\uA712"], /* MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR */
+ ["\uA713", "\uA713"], /* MODIFIER LETTER HIGH LEFT-STEM TONE BAR */
+ ["\uA714", "\uA714"], /* MODIFIER LETTER MID LEFT-STEM TONE BAR */
+ ["\uA715", "\uA715"], /* MODIFIER LETTER LOW LEFT-STEM TONE BAR */
+ ["\uA716", "\uA716"], /* MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR */
+ ["\uA717", "\uA717"], /* MODIFIER LETTER DOT VERTICAL BAR */
+ ["\uA718", "\uA718"], /* MODIFIER LETTER DOT SLASH */
+ ["\uA719", "\uA719"], /* MODIFIER LETTER DOT HORIZONTAL BAR */
+ ["\uA71A", "\uA71A"], /* MODIFIER LETTER LOWER RIGHT CORNER ANGLE */
+ ["\uA71B", "\uA71B"], /* MODIFIER LETTER RAISED UP ARROW */
+ ["\uA71C", "\uA71C"], /* MODIFIER LETTER RAISED DOWN ARROW */
+ ["\uA71D", "\uA71D"], /* MODIFIER LETTER RAISED EXCLAMATION MARK */
+ ["\uA71E", "\uA71E"], /* MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK */
+ ["\uA71F", "\uA71F"], /* MODIFIER LETTER LOW INVERTED EXCLAMATION MARK */
+ ["\uA720", "\uA720"], /* MODIFIER LETTER STRESS AND HIGH TONE */
+ ["\uA721", "\uA721"], /* MODIFIER LETTER STRESS AND LOW TONE */
+ ["\uA722", "\uA723"], /* LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF */
+ ["\uA722", "\uA723"], /* LATIN SMALL LETTER EGYPTOLOGICAL ALEF */
+ ["\uA724", "\uA725"], /* LATIN CAPITAL LETTER EGYPTOLOGICAL AIN */
+ ["\uA724", "\uA725"], /* LATIN SMALL LETTER EGYPTOLOGICAL AIN */
+ ["\uA726", "\uA727"], /* LATIN CAPITAL LETTER HENG */
+ ["\uA726", "\uA727"], /* LATIN SMALL LETTER HENG */
+ ["\uA728", "\uA729"], /* LATIN CAPITAL LETTER TZ */
+ ["\uA728", "\uA729"], /* LATIN SMALL LETTER TZ */
+ ["\uA72A", "\uA72B"], /* LATIN CAPITAL LETTER TRESILLO */
+ ["\uA72A", "\uA72B"], /* LATIN SMALL LETTER TRESILLO */
+ ["\uA72C", "\uA72D"], /* LATIN CAPITAL LETTER CUATRILLO */
+ ["\uA72C", "\uA72D"], /* LATIN SMALL LETTER CUATRILLO */
+ ["\uA72E", "\uA72F"], /* LATIN CAPITAL LETTER CUATRILLO WITH COMMA */
+ ["\uA72E", "\uA72F"], /* LATIN SMALL LETTER CUATRILLO WITH COMMA */
+ ["\uA730", "\uA730"], /* LATIN LETTER SMALL CAPITAL F */
+ ["\uA731", "\uA731"], /* LATIN LETTER SMALL CAPITAL S */
+ ["\uA732", "\uA733"], /* LATIN CAPITAL LETTER AA */
+ ["\uA732", "\uA733"], /* LATIN SMALL LETTER AA */
+ ["\uA734", "\uA735"], /* LATIN CAPITAL LETTER AO */
+ ["\uA734", "\uA735"], /* LATIN SMALL LETTER AO */
+ ["\uA736", "\uA737"], /* LATIN CAPITAL LETTER AU */
+ ["\uA736", "\uA737"], /* LATIN SMALL LETTER AU */
+ ["\uA738", "\uA739"], /* LATIN CAPITAL LETTER AV */
+ ["\uA738", "\uA739"], /* LATIN SMALL LETTER AV */
+ ["\uA73A", "\uA73B"], /* LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR */
+ ["\uA73A", "\uA73B"], /* LATIN SMALL LETTER AV WITH HORIZONTAL BAR */
+ ["\uA73C", "\uA73D"], /* LATIN CAPITAL LETTER AY */
+ ["\uA73C", "\uA73D"], /* LATIN SMALL LETTER AY */
+ ["\uA73E", "\uA73F"], /* LATIN CAPITAL LETTER REVERSED C WITH DOT */
+ ["\uA73E", "\uA73F"], /* LATIN SMALL LETTER REVERSED C WITH DOT */
+ ["\uA740", "\uA741"], /* LATIN CAPITAL LETTER K WITH STROKE */
+ ["\uA740", "\uA741"], /* LATIN SMALL LETTER K WITH STROKE */
+ ["\uA742", "\uA743"], /* LATIN CAPITAL LETTER K WITH DIAGONAL STROKE */
+ ["\uA742", "\uA743"], /* LATIN SMALL LETTER K WITH DIAGONAL STROKE */
+ ["\uA744", "\uA745"], /* LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE */
+ ["\uA744", "\uA745"], /* LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE */
+ ["\uA746", "\uA747"], /* LATIN CAPITAL LETTER BROKEN L */
+ ["\uA746", "\uA747"], /* LATIN SMALL LETTER BROKEN L */
+ ["\uA748", "\uA749"], /* LATIN CAPITAL LETTER L WITH HIGH STROKE */
+ ["\uA748", "\uA749"], /* LATIN SMALL LETTER L WITH HIGH STROKE */
+ ["\uA74A", "\uA74B"], /* LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY */
+ ["\uA74A", "\uA74B"], /* LATIN SMALL LETTER O WITH LONG STROKE OVERLAY */
+ ["\uA74C", "\uA74D"], /* LATIN CAPITAL LETTER O WITH LOOP */
+ ["\uA74C", "\uA74D"], /* LATIN SMALL LETTER O WITH LOOP */
+ ["\uA74E", "\uA74F"], /* LATIN CAPITAL LETTER OO */
+ ["\uA74E", "\uA74F"], /* LATIN SMALL LETTER OO */
+ ["\uA750", "\uA751"], /* LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER */
+ ["\uA750", "\uA751"], /* LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER */
+ ["\uA752", "\uA753"], /* LATIN CAPITAL LETTER P WITH FLOURISH */
+ ["\uA752", "\uA753"], /* LATIN SMALL LETTER P WITH FLOURISH */
+ ["\uA754", "\uA755"], /* LATIN CAPITAL LETTER P WITH SQUIRREL TAIL */
+ ["\uA754", "\uA755"], /* LATIN SMALL LETTER P WITH SQUIRREL TAIL */
+ ["\uA756", "\uA757"], /* LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER */
+ ["\uA756", "\uA757"], /* LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER */
+ ["\uA758", "\uA759"], /* LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE */
+ ["\uA758", "\uA759"], /* LATIN SMALL LETTER Q WITH DIAGONAL STROKE */
+ ["\uA75A", "\uA75B"], /* LATIN CAPITAL LETTER R ROTUNDA */
+ ["\uA75A", "\uA75B"], /* LATIN SMALL LETTER R ROTUNDA */
+ ["\uA75C", "\uA75D"], /* LATIN CAPITAL LETTER RUM ROTUNDA */
+ ["\uA75C", "\uA75D"], /* LATIN SMALL LETTER RUM ROTUNDA */
+ ["\uA75E", "\uA75F"], /* LATIN CAPITAL LETTER V WITH DIAGONAL STROKE */
+ ["\uA75E", "\uA75F"], /* LATIN SMALL LETTER V WITH DIAGONAL STROKE */
+ ["\uA760", "\uA761"], /* LATIN CAPITAL LETTER VY */
+ ["\uA760", "\uA761"], /* LATIN SMALL LETTER VY */
+ ["\uA762", "\uA763"], /* LATIN CAPITAL LETTER VISIGOTHIC Z */
+ ["\uA762", "\uA763"], /* LATIN SMALL LETTER VISIGOTHIC Z */
+ ["\uA764", "\uA765"], /* LATIN CAPITAL LETTER THORN WITH STROKE */
+ ["\uA764", "\uA765"], /* LATIN SMALL LETTER THORN WITH STROKE */
+ ["\uA766", "\uA767"], /* LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER */
+ ["\uA766", "\uA767"], /* LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER */
+ ["\uA768", "\uA769"], /* LATIN CAPITAL LETTER VEND */
+ ["\uA768", "\uA769"], /* LATIN SMALL LETTER VEND */
+ ["\uA76A", "\uA76B"], /* LATIN CAPITAL LETTER ET */
+ ["\uA76A", "\uA76B"], /* LATIN SMALL LETTER ET */
+ ["\uA76C", "\uA76D"], /* LATIN CAPITAL LETTER IS */
+ ["\uA76C", "\uA76D"], /* LATIN SMALL LETTER IS */
+ ["\uA76E", "\uA76F"], /* LATIN CAPITAL LETTER CON */
+ ["\uA76E", "\uA76F"], /* LATIN SMALL LETTER CON */
+ ["\uA770", "\uA770"], /* MODIFIER LETTER US */
+ ["\uA771", "\uA771"], /* LATIN SMALL LETTER DUM */
+ ["\uA772", "\uA772"], /* LATIN SMALL LETTER LUM */
+ ["\uA773", "\uA773"], /* LATIN SMALL LETTER MUM */
+ ["\uA774", "\uA774"], /* LATIN SMALL LETTER NUM */
+ ["\uA775", "\uA775"], /* LATIN SMALL LETTER RUM */
+ ["\uA776", "\uA776"], /* LATIN LETTER SMALL CAPITAL RUM */
+ ["\uA777", "\uA777"], /* LATIN SMALL LETTER TUM */
+ ["\uA778", "\uA778"], /* LATIN SMALL LETTER UM */
+ ["\uA779", "\uA77A"], /* LATIN CAPITAL LETTER INSULAR D */
+ ["\uA779", "\uA77A"], /* LATIN SMALL LETTER INSULAR D */
+ ["\uA77B", "\uA77C"], /* LATIN CAPITAL LETTER INSULAR F */
+ ["\uA77B", "\uA77C"], /* LATIN SMALL LETTER INSULAR F */
+ ["\uA77D", "\u1D79"], /* LATIN CAPITAL LETTER INSULAR G */
+ ["\uA77E", "\uA77F"], /* LATIN CAPITAL LETTER TURNED INSULAR G */
+ ["\uA77E", "\uA77F"], /* LATIN SMALL LETTER TURNED INSULAR G */
+ ["\uA780", "\uA781"], /* LATIN CAPITAL LETTER TURNED L */
+ ["\uA780", "\uA781"], /* LATIN SMALL LETTER TURNED L */
+ ["\uA782", "\uA783"], /* LATIN CAPITAL LETTER INSULAR R */
+ ["\uA782", "\uA783"], /* LATIN SMALL LETTER INSULAR R */
+ ["\uA784", "\uA785"], /* LATIN CAPITAL LETTER INSULAR S */
+ ["\uA784", "\uA785"], /* LATIN SMALL LETTER INSULAR S */
+ ["\uA786", "\uA787"], /* LATIN CAPITAL LETTER INSULAR T */
+ ["\uA786", "\uA787"], /* LATIN SMALL LETTER INSULAR T */
+ ["\uA788", "\uA788"], /* MODIFIER LETTER LOW CIRCUMFLEX ACCENT */
+ ["\uA789", "\uA789"], /* MODIFIER LETTER COLON */
+ ["\uA78A", "\uA78A"], /* MODIFIER LETTER SHORT EQUALS SIGN */
+ ["\uA78B", "\uA78C"], /* LATIN CAPITAL LETTER SALTILLO */
+ ["\uA78B", "\uA78C"], /* LATIN SMALL LETTER SALTILLO */
+ ["\uA78D", "\u0265"], /* LATIN CAPITAL LETTER TURNED H */
+ ["\uA78E", "\uA78E"], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT */
+ ["\uA78F", "\uA78F"], /* LATIN LETTER SINOLOGICAL DOT */
+ ["\uA790", "\uA791"], /* LATIN CAPITAL LETTER N WITH DESCENDER */
+ ["\uA790", "\uA791"], /* LATIN SMALL LETTER N WITH DESCENDER */
+ ["\uA792", "\uA793"], /* LATIN CAPITAL LETTER C WITH BAR */
+ ["\uA792", "\uA793"], /* LATIN SMALL LETTER C WITH BAR */
+ ["\uA794", "\uA794"], /* LATIN SMALL LETTER C WITH PALATAL HOOK */
+ ["\uA795", "\uA795"], /* LATIN SMALL LETTER H WITH PALATAL HOOK */
+ ["\uA796", "\uA797"], /* LATIN CAPITAL LETTER B WITH FLOURISH */
+ ["\uA796", "\uA797"], /* LATIN SMALL LETTER B WITH FLOURISH */
+ ["\uA798", "\uA799"], /* LATIN CAPITAL LETTER F WITH STROKE */
+ ["\uA798", "\uA799"], /* LATIN SMALL LETTER F WITH STROKE */
+ ["\uA79A", "\uA79B"], /* LATIN CAPITAL LETTER VOLAPUK AE */
+ ["\uA79A", "\uA79B"], /* LATIN SMALL LETTER VOLAPUK AE */
+ ["\uA79C", "\uA79D"], /* LATIN CAPITAL LETTER VOLAPUK OE */
+ ["\uA79C", "\uA79D"], /* LATIN SMALL LETTER VOLAPUK OE */
+ ["\uA79E", "\uA79F"], /* LATIN CAPITAL LETTER VOLAPUK UE */
+ ["\uA79E", "\uA79F"], /* LATIN SMALL LETTER VOLAPUK UE */
+ ["\uA7A0", "\uA7A1"], /* LATIN CAPITAL LETTER G WITH OBLIQUE STROKE */
+ ["\uA7A0", "\uA7A1"], /* LATIN SMALL LETTER G WITH OBLIQUE STROKE */
+ ["\uA7A2", "\uA7A3"], /* LATIN CAPITAL LETTER K WITH OBLIQUE STROKE */
+ ["\uA7A2", "\uA7A3"], /* LATIN SMALL LETTER K WITH OBLIQUE STROKE */
+ ["\uA7A4", "\uA7A5"], /* LATIN CAPITAL LETTER N WITH OBLIQUE STROKE */
+ ["\uA7A4", "\uA7A5"], /* LATIN SMALL LETTER N WITH OBLIQUE STROKE */
+ ["\uA7A6", "\uA7A7"], /* LATIN CAPITAL LETTER R WITH OBLIQUE STROKE */
+ ["\uA7A6", "\uA7A7"], /* LATIN SMALL LETTER R WITH OBLIQUE STROKE */
+ ["\uA7A8", "\uA7A9"], /* LATIN CAPITAL LETTER S WITH OBLIQUE STROKE */
+ ["\uA7A8", "\uA7A9"], /* LATIN SMALL LETTER S WITH OBLIQUE STROKE */
+ ["\uA7AA", "\u0266"], /* LATIN CAPITAL LETTER H WITH HOOK */
+ ["\uA7AB", "\u025C"], /* LATIN CAPITAL LETTER REVERSED OPEN E */
+ ["\uA7AC", "\u0261"], /* LATIN CAPITAL LETTER SCRIPT G */
+ ["\uA7AD", "\u026C"], /* LATIN CAPITAL LETTER L WITH BELT */
+ ["\uA7AE", "\u026A"], /* LATIN CAPITAL LETTER SMALL CAPITAL I */
+ ["\uA7AF", "\uA7AF"], /* LATIN LETTER SMALL CAPITAL Q */
+ ["\uA7B0", "\u029E"], /* LATIN CAPITAL LETTER TURNED K */
+ ["\uA7B1", "\u0287"], /* LATIN CAPITAL LETTER TURNED T */
+ ["\uA7B2", "\u029D"], /* LATIN CAPITAL LETTER J WITH CROSSED-TAIL */
+ ["\uA7B3", "\uAB53"], /* LATIN CAPITAL LETTER CHI */
+ ["\uA7B4", "\uA7B5"], /* LATIN CAPITAL LETTER BETA */
+ ["\uA7B4", "\uA7B5"], /* LATIN SMALL LETTER BETA */
+ ["\uA7B6", "\uA7B7"], /* LATIN CAPITAL LETTER OMEGA */
+ ["\uA7B6", "\uA7B7"], /* LATIN SMALL LETTER OMEGA */
+ ["\uA7B8", "\uA7B9"], /* LATIN CAPITAL LETTER U WITH STROKE */
+ ["\uA7B8", "\uA7B9"], /* LATIN SMALL LETTER U WITH STROKE */
+ ["\uA7BA", "\uA7BA"],
+ ["\uA7BB", "\uA7BB"],
+ ["\uA7BC", "\uA7BC"],
+ ["\uA7BD", "\uA7BD"],
+ ["\uA7BE", "\uA7BE"],
+ ["\uA7BF", "\uA7BF"],
+ ["\uA7C0", "\uA7C0"],
+ ["\uA7C1", "\uA7C1"],
+ ["\uA7C2", "\uA7C2"],
+ ["\uA7C3", "\uA7C3"],
+ ["\uA7C4", "\uA7C4"],
+ ["\uA7C5", "\uA7C5"],
+ ["\uA7C6", "\uA7C6"],
+ ["\uA7C7", "\uA7C7"],
+ ["\uA7C8", "\uA7C8"],
+ ["\uA7C9", "\uA7C9"],
+ ["\uA7CA", "\uA7CA"],
+ ["\uA7CB", "\uA7CB"],
+ ["\uA7CC", "\uA7CC"],
+ ["\uA7CD", "\uA7CD"],
+ ["\uA7CE", "\uA7CE"],
+ ["\uA7CF", "\uA7CF"],
+ ["\uA7D0", "\uA7D0"],
+ ["\uA7D1", "\uA7D1"],
+ ["\uA7D2", "\uA7D2"],
+ ["\uA7D3", "\uA7D3"],
+ ["\uA7D4", "\uA7D4"],
+ ["\uA7D5", "\uA7D5"],
+ ["\uA7D6", "\uA7D6"],
+ ["\uA7D7", "\uA7D7"],
+ ["\uA7D8", "\uA7D8"],
+ ["\uA7D9", "\uA7D9"],
+ ["\uA7DA", "\uA7DA"],
+ ["\uA7DB", "\uA7DB"],
+ ["\uA7DC", "\uA7DC"],
+ ["\uA7DD", "\uA7DD"],
+ ["\uA7DE", "\uA7DE"],
+ ["\uA7DF", "\uA7DF"],
+ ["\uA7E0", "\uA7E0"],
+ ["\uA7E1", "\uA7E1"],
+ ["\uA7E2", "\uA7E2"],
+ ["\uA7E3", "\uA7E3"],
+ ["\uA7E4", "\uA7E4"],
+ ["\uA7E5", "\uA7E5"],
+ ["\uA7E6", "\uA7E6"],
+ ["\uA7E7", "\uA7E7"],
+ ["\uA7E8", "\uA7E8"],
+ ["\uA7E9", "\uA7E9"],
+ ["\uA7EA", "\uA7EA"],
+ ["\uA7EB", "\uA7EB"],
+ ["\uA7EC", "\uA7EC"],
+ ["\uA7ED", "\uA7ED"],
+ ["\uA7EE", "\uA7EE"],
+ ["\uA7EF", "\uA7EF"],
+ ["\uA7F0", "\uA7F0"],
+ ["\uA7F1", "\uA7F1"],
+ ["\uA7F2", "\uA7F2"],
+ ["\uA7F3", "\uA7F3"],
+ ["\uA7F4", "\uA7F4"],
+ ["\uA7F5", "\uA7F5"],
+ ["\uA7F6", "\uA7F6"],
+ ["\uA7F7", "\uA7F7"], /* LATIN EPIGRAPHIC LETTER SIDEWAYS I */
+ ["\uA7F8", "\uA7F8"], /* MODIFIER LETTER CAPITAL H WITH STROKE */
+ ["\uA7F9", "\uA7F9"], /* MODIFIER LETTER SMALL LIGATURE OE */
+ ["\uA7FA", "\uA7FA"], /* LATIN LETTER SMALL CAPITAL TURNED M */
+ ["\uA7FB", "\uA7FB"], /* LATIN EPIGRAPHIC LETTER REVERSED F */
+ ["\uA7FC", "\uA7FC"], /* LATIN EPIGRAPHIC LETTER REVERSED P */
+ ["\uA7FD", "\uA7FD"], /* LATIN EPIGRAPHIC LETTER INVERTED M */
+ ["\uA7FE", "\uA7FE"], /* LATIN EPIGRAPHIC LETTER I LONGA */
+ ["\uA7FF", "\uA7FF"], /* LATIN EPIGRAPHIC LETTER ARCHAIC M */
+ ["\uA800", "\uA800"], /* SYLOTI NAGRI LETTER A */
+ ["\uA801", "\uA801"], /* SYLOTI NAGRI LETTER I */
+ ["\uA802", "\uA802"], /* SYLOTI NAGRI SIGN DVISVARA */
+ ["\uA803", "\uA803"], /* SYLOTI NAGRI LETTER U */
+ ["\uA804", "\uA804"], /* SYLOTI NAGRI LETTER E */
+ ["\uA805", "\uA805"], /* SYLOTI NAGRI LETTER O */
+ ["\uA806", "\uA806"], /* SYLOTI NAGRI SIGN HASANTA */
+ ["\uA807", "\uA807"], /* SYLOTI NAGRI LETTER KO */
+ ["\uA808", "\uA808"], /* SYLOTI NAGRI LETTER KHO */
+ ["\uA809", "\uA809"], /* SYLOTI NAGRI LETTER GO */
+ ["\uA80A", "\uA80A"], /* SYLOTI NAGRI LETTER GHO */
+ ["\uA80B", "\uA80B"], /* SYLOTI NAGRI SIGN ANUSVARA */
+ ["\uA80C", "\uA80C"], /* SYLOTI NAGRI LETTER CO */
+ ["\uA80D", "\uA80D"], /* SYLOTI NAGRI LETTER CHO */
+ ["\uA80E", "\uA80E"], /* SYLOTI NAGRI LETTER JO */
+ ["\uA80F", "\uA80F"], /* SYLOTI NAGRI LETTER JHO */
+ ["\uA810", "\uA810"], /* SYLOTI NAGRI LETTER TTO */
+ ["\uA811", "\uA811"], /* SYLOTI NAGRI LETTER TTHO */
+ ["\uA812", "\uA812"], /* SYLOTI NAGRI LETTER DDO */
+ ["\uA813", "\uA813"], /* SYLOTI NAGRI LETTER DDHO */
+ ["\uA814", "\uA814"], /* SYLOTI NAGRI LETTER TO */
+ ["\uA815", "\uA815"], /* SYLOTI NAGRI LETTER THO */
+ ["\uA816", "\uA816"], /* SYLOTI NAGRI LETTER DO */
+ ["\uA817", "\uA817"], /* SYLOTI NAGRI LETTER DHO */
+ ["\uA818", "\uA818"], /* SYLOTI NAGRI LETTER NO */
+ ["\uA819", "\uA819"], /* SYLOTI NAGRI LETTER PO */
+ ["\uA81A", "\uA81A"], /* SYLOTI NAGRI LETTER PHO */
+ ["\uA81B", "\uA81B"], /* SYLOTI NAGRI LETTER BO */
+ ["\uA81C", "\uA81C"], /* SYLOTI NAGRI LETTER BHO */
+ ["\uA81D", "\uA81D"], /* SYLOTI NAGRI LETTER MO */
+ ["\uA81E", "\uA81E"], /* SYLOTI NAGRI LETTER RO */
+ ["\uA81F", "\uA81F"], /* SYLOTI NAGRI LETTER LO */
+ ["\uA820", "\uA820"], /* SYLOTI NAGRI LETTER RRO */
+ ["\uA821", "\uA821"], /* SYLOTI NAGRI LETTER SO */
+ ["\uA822", "\uA822"], /* SYLOTI NAGRI LETTER HO */
+ ["\uA823", "\uA823"], /* SYLOTI NAGRI VOWEL SIGN A */
+ ["\uA824", "\uA824"], /* SYLOTI NAGRI VOWEL SIGN I */
+ ["\uA825", "\uA825"], /* SYLOTI NAGRI VOWEL SIGN U */
+ ["\uA826", "\uA826"], /* SYLOTI NAGRI VOWEL SIGN E */
+ ["\uA827", "\uA827"], /* SYLOTI NAGRI VOWEL SIGN OO */
+ ["\uA828", "\uA828"], /* SYLOTI NAGRI POETRY MARK-1 */
+ ["\uA829", "\uA829"], /* SYLOTI NAGRI POETRY MARK-2 */
+ ["\uA82A", "\uA82A"], /* SYLOTI NAGRI POETRY MARK-3 */
+ ["\uA82B", "\uA82B"], /* SYLOTI NAGRI POETRY MARK-4 */
+ ["\uA82C", "\uA82C"],
+ ["\uA82D", "\uA82D"],
+ ["\uA82E", "\uA82E"],
+ ["\uA82F", "\uA82F"],
+ ["\uA830", "\uA830"], /* NORTH INDIC FRACTION ONE QUARTER */
+ ["\uA831", "\uA831"], /* NORTH INDIC FRACTION ONE HALF */
+ ["\uA832", "\uA832"], /* NORTH INDIC FRACTION THREE QUARTERS */
+ ["\uA833", "\uA833"], /* NORTH INDIC FRACTION ONE SIXTEENTH */
+ ["\uA834", "\uA834"], /* NORTH INDIC FRACTION ONE EIGHTH */
+ ["\uA835", "\uA835"], /* NORTH INDIC FRACTION THREE SIXTEENTHS */
+ ["\uA836", "\uA836"], /* NORTH INDIC QUARTER MARK */
+ ["\uA837", "\uA837"], /* NORTH INDIC PLACEHOLDER MARK */
+ ["\uA838", "\uA838"], /* NORTH INDIC RUPEE MARK */
+ ["\uA839", "\uA839"], /* NORTH INDIC QUANTITY MARK */
+ ["\uA83A", "\uA83A"],
+ ["\uA83B", "\uA83B"],
+ ["\uA83C", "\uA83C"],
+ ["\uA83D", "\uA83D"],
+ ["\uA83E", "\uA83E"],
+ ["\uA83F", "\uA83F"],
+ ["\uA840", "\uA840"], /* PHAGS-PA LETTER KA */
+ ["\uA841", "\uA841"], /* PHAGS-PA LETTER KHA */
+ ["\uA842", "\uA842"], /* PHAGS-PA LETTER GA */
+ ["\uA843", "\uA843"], /* PHAGS-PA LETTER NGA */
+ ["\uA844", "\uA844"], /* PHAGS-PA LETTER CA */
+ ["\uA845", "\uA845"], /* PHAGS-PA LETTER CHA */
+ ["\uA846", "\uA846"], /* PHAGS-PA LETTER JA */
+ ["\uA847", "\uA847"], /* PHAGS-PA LETTER NYA */
+ ["\uA848", "\uA848"], /* PHAGS-PA LETTER TA */
+ ["\uA849", "\uA849"], /* PHAGS-PA LETTER THA */
+ ["\uA84A", "\uA84A"], /* PHAGS-PA LETTER DA */
+ ["\uA84B", "\uA84B"], /* PHAGS-PA LETTER NA */
+ ["\uA84C", "\uA84C"], /* PHAGS-PA LETTER PA */
+ ["\uA84D", "\uA84D"], /* PHAGS-PA LETTER PHA */
+ ["\uA84E", "\uA84E"], /* PHAGS-PA LETTER BA */
+ ["\uA84F", "\uA84F"], /* PHAGS-PA LETTER MA */
+ ["\uA850", "\uA850"], /* PHAGS-PA LETTER TSA */
+ ["\uA851", "\uA851"], /* PHAGS-PA LETTER TSHA */
+ ["\uA852", "\uA852"], /* PHAGS-PA LETTER DZA */
+ ["\uA853", "\uA853"], /* PHAGS-PA LETTER WA */
+ ["\uA854", "\uA854"], /* PHAGS-PA LETTER ZHA */
+ ["\uA855", "\uA855"], /* PHAGS-PA LETTER ZA */
+ ["\uA856", "\uA856"], /* PHAGS-PA LETTER SMALL A */
+ ["\uA857", "\uA857"], /* PHAGS-PA LETTER YA */
+ ["\uA858", "\uA858"], /* PHAGS-PA LETTER RA */
+ ["\uA859", "\uA859"], /* PHAGS-PA LETTER LA */
+ ["\uA85A", "\uA85A"], /* PHAGS-PA LETTER SHA */
+ ["\uA85B", "\uA85B"], /* PHAGS-PA LETTER SA */
+ ["\uA85C", "\uA85C"], /* PHAGS-PA LETTER HA */
+ ["\uA85D", "\uA85D"], /* PHAGS-PA LETTER A */
+ ["\uA85E", "\uA85E"], /* PHAGS-PA LETTER I */
+ ["\uA85F", "\uA85F"], /* PHAGS-PA LETTER U */
+ ["\uA860", "\uA860"], /* PHAGS-PA LETTER E */
+ ["\uA861", "\uA861"], /* PHAGS-PA LETTER O */
+ ["\uA862", "\uA862"], /* PHAGS-PA LETTER QA */
+ ["\uA863", "\uA863"], /* PHAGS-PA LETTER XA */
+ ["\uA864", "\uA864"], /* PHAGS-PA LETTER FA */
+ ["\uA865", "\uA865"], /* PHAGS-PA LETTER GGA */
+ ["\uA866", "\uA866"], /* PHAGS-PA LETTER EE */
+ ["\uA867", "\uA867"], /* PHAGS-PA SUBJOINED LETTER WA */
+ ["\uA868", "\uA868"], /* PHAGS-PA SUBJOINED LETTER YA */
+ ["\uA869", "\uA869"], /* PHAGS-PA LETTER TTA */
+ ["\uA86A", "\uA86A"], /* PHAGS-PA LETTER TTHA */
+ ["\uA86B", "\uA86B"], /* PHAGS-PA LETTER DDA */
+ ["\uA86C", "\uA86C"], /* PHAGS-PA LETTER NNA */
+ ["\uA86D", "\uA86D"], /* PHAGS-PA LETTER ALTERNATE YA */
+ ["\uA86E", "\uA86E"], /* PHAGS-PA LETTER VOICELESS SHA */
+ ["\uA86F", "\uA86F"], /* PHAGS-PA LETTER VOICED HA */
+ ["\uA870", "\uA870"], /* PHAGS-PA LETTER ASPIRATED FA */
+ ["\uA871", "\uA871"], /* PHAGS-PA SUBJOINED LETTER RA */
+ ["\uA872", "\uA872"], /* PHAGS-PA SUPERFIXED LETTER RA */
+ ["\uA873", "\uA873"], /* PHAGS-PA LETTER CANDRABINDU */
+ ["\uA874", "\uA874"], /* PHAGS-PA SINGLE HEAD MARK */
+ ["\uA875", "\uA875"], /* PHAGS-PA DOUBLE HEAD MARK */
+ ["\uA876", "\uA876"], /* PHAGS-PA MARK SHAD */
+ ["\uA877", "\uA877"], /* PHAGS-PA MARK DOUBLE SHAD */
+ ["\uA878", "\uA878"],
+ ["\uA879", "\uA879"],
+ ["\uA87A", "\uA87A"],
+ ["\uA87B", "\uA87B"],
+ ["\uA87C", "\uA87C"],
+ ["\uA87D", "\uA87D"],
+ ["\uA87E", "\uA87E"],
+ ["\uA87F", "\uA87F"],
+ ["\uA880", "\uA880"], /* SAURASHTRA SIGN ANUSVARA */
+ ["\uA881", "\uA881"], /* SAURASHTRA SIGN VISARGA */
+ ["\uA882", "\uA882"], /* SAURASHTRA LETTER A */
+ ["\uA883", "\uA883"], /* SAURASHTRA LETTER AA */
+ ["\uA884", "\uA884"], /* SAURASHTRA LETTER I */
+ ["\uA885", "\uA885"], /* SAURASHTRA LETTER II */
+ ["\uA886", "\uA886"], /* SAURASHTRA LETTER U */
+ ["\uA887", "\uA887"], /* SAURASHTRA LETTER UU */
+ ["\uA888", "\uA888"], /* SAURASHTRA LETTER VOCALIC R */
+ ["\uA889", "\uA889"], /* SAURASHTRA LETTER VOCALIC RR */
+ ["\uA88A", "\uA88A"], /* SAURASHTRA LETTER VOCALIC L */
+ ["\uA88B", "\uA88B"], /* SAURASHTRA LETTER VOCALIC LL */
+ ["\uA88C", "\uA88C"], /* SAURASHTRA LETTER E */
+ ["\uA88D", "\uA88D"], /* SAURASHTRA LETTER EE */
+ ["\uA88E", "\uA88E"], /* SAURASHTRA LETTER AI */
+ ["\uA88F", "\uA88F"], /* SAURASHTRA LETTER O */
+ ["\uA890", "\uA890"], /* SAURASHTRA LETTER OO */
+ ["\uA891", "\uA891"], /* SAURASHTRA LETTER AU */
+ ["\uA892", "\uA892"], /* SAURASHTRA LETTER KA */
+ ["\uA893", "\uA893"], /* SAURASHTRA LETTER KHA */
+ ["\uA894", "\uA894"], /* SAURASHTRA LETTER GA */
+ ["\uA895", "\uA895"], /* SAURASHTRA LETTER GHA */
+ ["\uA896", "\uA896"], /* SAURASHTRA LETTER NGA */
+ ["\uA897", "\uA897"], /* SAURASHTRA LETTER CA */
+ ["\uA898", "\uA898"], /* SAURASHTRA LETTER CHA */
+ ["\uA899", "\uA899"], /* SAURASHTRA LETTER JA */
+ ["\uA89A", "\uA89A"], /* SAURASHTRA LETTER JHA */
+ ["\uA89B", "\uA89B"], /* SAURASHTRA LETTER NYA */
+ ["\uA89C", "\uA89C"], /* SAURASHTRA LETTER TTA */
+ ["\uA89D", "\uA89D"], /* SAURASHTRA LETTER TTHA */
+ ["\uA89E", "\uA89E"], /* SAURASHTRA LETTER DDA */
+ ["\uA89F", "\uA89F"], /* SAURASHTRA LETTER DDHA */
+ ["\uA8A0", "\uA8A0"], /* SAURASHTRA LETTER NNA */
+ ["\uA8A1", "\uA8A1"], /* SAURASHTRA LETTER TA */
+ ["\uA8A2", "\uA8A2"], /* SAURASHTRA LETTER THA */
+ ["\uA8A3", "\uA8A3"], /* SAURASHTRA LETTER DA */
+ ["\uA8A4", "\uA8A4"], /* SAURASHTRA LETTER DHA */
+ ["\uA8A5", "\uA8A5"], /* SAURASHTRA LETTER NA */
+ ["\uA8A6", "\uA8A6"], /* SAURASHTRA LETTER PA */
+ ["\uA8A7", "\uA8A7"], /* SAURASHTRA LETTER PHA */
+ ["\uA8A8", "\uA8A8"], /* SAURASHTRA LETTER BA */
+ ["\uA8A9", "\uA8A9"], /* SAURASHTRA LETTER BHA */
+ ["\uA8AA", "\uA8AA"], /* SAURASHTRA LETTER MA */
+ ["\uA8AB", "\uA8AB"], /* SAURASHTRA LETTER YA */
+ ["\uA8AC", "\uA8AC"], /* SAURASHTRA LETTER RA */
+ ["\uA8AD", "\uA8AD"], /* SAURASHTRA LETTER LA */
+ ["\uA8AE", "\uA8AE"], /* SAURASHTRA LETTER VA */
+ ["\uA8AF", "\uA8AF"], /* SAURASHTRA LETTER SHA */
+ ["\uA8B0", "\uA8B0"], /* SAURASHTRA LETTER SSA */
+ ["\uA8B1", "\uA8B1"], /* SAURASHTRA LETTER SA */
+ ["\uA8B2", "\uA8B2"], /* SAURASHTRA LETTER HA */
+ ["\uA8B3", "\uA8B3"], /* SAURASHTRA LETTER LLA */
+ ["\uA8B4", "\uA8B4"], /* SAURASHTRA CONSONANT SIGN HAARU */
+ ["\uA8B5", "\uA8B5"], /* SAURASHTRA VOWEL SIGN AA */
+ ["\uA8B6", "\uA8B6"], /* SAURASHTRA VOWEL SIGN I */
+ ["\uA8B7", "\uA8B7"], /* SAURASHTRA VOWEL SIGN II */
+ ["\uA8B8", "\uA8B8"], /* SAURASHTRA VOWEL SIGN U */
+ ["\uA8B9", "\uA8B9"], /* SAURASHTRA VOWEL SIGN UU */
+ ["\uA8BA", "\uA8BA"], /* SAURASHTRA VOWEL SIGN VOCALIC R */
+ ["\uA8BB", "\uA8BB"], /* SAURASHTRA VOWEL SIGN VOCALIC RR */
+ ["\uA8BC", "\uA8BC"], /* SAURASHTRA VOWEL SIGN VOCALIC L */
+ ["\uA8BD", "\uA8BD"], /* SAURASHTRA VOWEL SIGN VOCALIC LL */
+ ["\uA8BE", "\uA8BE"], /* SAURASHTRA VOWEL SIGN E */
+ ["\uA8BF", "\uA8BF"], /* SAURASHTRA VOWEL SIGN EE */
+ ["\uA8C0", "\uA8C0"], /* SAURASHTRA VOWEL SIGN AI */
+ ["\uA8C1", "\uA8C1"], /* SAURASHTRA VOWEL SIGN O */
+ ["\uA8C2", "\uA8C2"], /* SAURASHTRA VOWEL SIGN OO */
+ ["\uA8C3", "\uA8C3"], /* SAURASHTRA VOWEL SIGN AU */
+ ["\uA8C4", "\uA8C4"], /* SAURASHTRA SIGN VIRAMA */
+ ["\uA8C5", "\uA8C5"], /* SAURASHTRA SIGN CANDRABINDU */
+ ["\uA8C6", "\uA8C6"],
+ ["\uA8C7", "\uA8C7"],
+ ["\uA8C8", "\uA8C8"],
+ ["\uA8C9", "\uA8C9"],
+ ["\uA8CA", "\uA8CA"],
+ ["\uA8CB", "\uA8CB"],
+ ["\uA8CC", "\uA8CC"],
+ ["\uA8CD", "\uA8CD"],
+ ["\uA8CE", "\uA8CE"], /* SAURASHTRA DANDA */
+ ["\uA8CF", "\uA8CF"], /* SAURASHTRA DOUBLE DANDA */
+ ["\uA8D0", "\uA8D0"], /* SAURASHTRA DIGIT ZERO */
+ ["\uA8D1", "\uA8D1"], /* SAURASHTRA DIGIT ONE */
+ ["\uA8D2", "\uA8D2"], /* SAURASHTRA DIGIT TWO */
+ ["\uA8D3", "\uA8D3"], /* SAURASHTRA DIGIT THREE */
+ ["\uA8D4", "\uA8D4"], /* SAURASHTRA DIGIT FOUR */
+ ["\uA8D5", "\uA8D5"], /* SAURASHTRA DIGIT FIVE */
+ ["\uA8D6", "\uA8D6"], /* SAURASHTRA DIGIT SIX */
+ ["\uA8D7", "\uA8D7"], /* SAURASHTRA DIGIT SEVEN */
+ ["\uA8D8", "\uA8D8"], /* SAURASHTRA DIGIT EIGHT */
+ ["\uA8D9", "\uA8D9"], /* SAURASHTRA DIGIT NINE */
+ ["\uA8DA", "\uA8DA"],
+ ["\uA8DB", "\uA8DB"],
+ ["\uA8DC", "\uA8DC"],
+ ["\uA8DD", "\uA8DD"],
+ ["\uA8DE", "\uA8DE"],
+ ["\uA8DF", "\uA8DF"],
+ ["\uA8E0", "\uA8E0"], /* COMBINING DEVANAGARI DIGIT ZERO */
+ ["\uA8E1", "\uA8E1"], /* COMBINING DEVANAGARI DIGIT ONE */
+ ["\uA8E2", "\uA8E2"], /* COMBINING DEVANAGARI DIGIT TWO */
+ ["\uA8E3", "\uA8E3"], /* COMBINING DEVANAGARI DIGIT THREE */
+ ["\uA8E4", "\uA8E4"], /* COMBINING DEVANAGARI DIGIT FOUR */
+ ["\uA8E5", "\uA8E5"], /* COMBINING DEVANAGARI DIGIT FIVE */
+ ["\uA8E6", "\uA8E6"], /* COMBINING DEVANAGARI DIGIT SIX */
+ ["\uA8E7", "\uA8E7"], /* COMBINING DEVANAGARI DIGIT SEVEN */
+ ["\uA8E8", "\uA8E8"], /* COMBINING DEVANAGARI DIGIT EIGHT */
+ ["\uA8E9", "\uA8E9"], /* COMBINING DEVANAGARI DIGIT NINE */
+ ["\uA8EA", "\uA8EA"], /* COMBINING DEVANAGARI LETTER A */
+ ["\uA8EB", "\uA8EB"], /* COMBINING DEVANAGARI LETTER U */
+ ["\uA8EC", "\uA8EC"], /* COMBINING DEVANAGARI LETTER KA */
+ ["\uA8ED", "\uA8ED"], /* COMBINING DEVANAGARI LETTER NA */
+ ["\uA8EE", "\uA8EE"], /* COMBINING DEVANAGARI LETTER PA */
+ ["\uA8EF", "\uA8EF"], /* COMBINING DEVANAGARI LETTER RA */
+ ["\uA8F0", "\uA8F0"], /* COMBINING DEVANAGARI LETTER VI */
+ ["\uA8F1", "\uA8F1"], /* COMBINING DEVANAGARI SIGN AVAGRAHA */
+ ["\uA8F2", "\uA8F2"], /* DEVANAGARI SIGN SPACING CANDRABINDU */
+ ["\uA8F3", "\uA8F3"], /* DEVANAGARI SIGN CANDRABINDU VIRAMA */
+ ["\uA8F4", "\uA8F4"], /* DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA */
+ ["\uA8F5", "\uA8F5"], /* DEVANAGARI SIGN CANDRABINDU TWO */
+ ["\uA8F6", "\uA8F6"], /* DEVANAGARI SIGN CANDRABINDU THREE */
+ ["\uA8F7", "\uA8F7"], /* DEVANAGARI SIGN CANDRABINDU AVAGRAHA */
+ ["\uA8F8", "\uA8F8"], /* DEVANAGARI SIGN PUSHPIKA */
+ ["\uA8F9", "\uA8F9"], /* DEVANAGARI GAP FILLER */
+ ["\uA8FA", "\uA8FA"], /* DEVANAGARI CARET */
+ ["\uA8FB", "\uA8FB"], /* DEVANAGARI HEADSTROKE */
+ ["\uA8FC", "\uA8FC"], /* DEVANAGARI SIGN SIDDHAM */
+ ["\uA8FD", "\uA8FD"], /* DEVANAGARI JAIN OM */
+ ["\uA8FE", "\uA8FE"], /* DEVANAGARI LETTER AY */
+ ["\uA8FF", "\uA8FF"], /* DEVANAGARI VOWEL SIGN AY */
+ ["\uA900", "\uA900"], /* KAYAH LI DIGIT ZERO */
+ ["\uA901", "\uA901"], /* KAYAH LI DIGIT ONE */
+ ["\uA902", "\uA902"], /* KAYAH LI DIGIT TWO */
+ ["\uA903", "\uA903"], /* KAYAH LI DIGIT THREE */
+ ["\uA904", "\uA904"], /* KAYAH LI DIGIT FOUR */
+ ["\uA905", "\uA905"], /* KAYAH LI DIGIT FIVE */
+ ["\uA906", "\uA906"], /* KAYAH LI DIGIT SIX */
+ ["\uA907", "\uA907"], /* KAYAH LI DIGIT SEVEN */
+ ["\uA908", "\uA908"], /* KAYAH LI DIGIT EIGHT */
+ ["\uA909", "\uA909"], /* KAYAH LI DIGIT NINE */
+ ["\uA90A", "\uA90A"], /* KAYAH LI LETTER KA */
+ ["\uA90B", "\uA90B"], /* KAYAH LI LETTER KHA */
+ ["\uA90C", "\uA90C"], /* KAYAH LI LETTER GA */
+ ["\uA90D", "\uA90D"], /* KAYAH LI LETTER NGA */
+ ["\uA90E", "\uA90E"], /* KAYAH LI LETTER SA */
+ ["\uA90F", "\uA90F"], /* KAYAH LI LETTER SHA */
+ ["\uA910", "\uA910"], /* KAYAH LI LETTER ZA */
+ ["\uA911", "\uA911"], /* KAYAH LI LETTER NYA */
+ ["\uA912", "\uA912"], /* KAYAH LI LETTER TA */
+ ["\uA913", "\uA913"], /* KAYAH LI LETTER HTA */
+ ["\uA914", "\uA914"], /* KAYAH LI LETTER NA */
+ ["\uA915", "\uA915"], /* KAYAH LI LETTER PA */
+ ["\uA916", "\uA916"], /* KAYAH LI LETTER PHA */
+ ["\uA917", "\uA917"], /* KAYAH LI LETTER MA */
+ ["\uA918", "\uA918"], /* KAYAH LI LETTER DA */
+ ["\uA919", "\uA919"], /* KAYAH LI LETTER BA */
+ ["\uA91A", "\uA91A"], /* KAYAH LI LETTER RA */
+ ["\uA91B", "\uA91B"], /* KAYAH LI LETTER YA */
+ ["\uA91C", "\uA91C"], /* KAYAH LI LETTER LA */
+ ["\uA91D", "\uA91D"], /* KAYAH LI LETTER WA */
+ ["\uA91E", "\uA91E"], /* KAYAH LI LETTER THA */
+ ["\uA91F", "\uA91F"], /* KAYAH LI LETTER HA */
+ ["\uA920", "\uA920"], /* KAYAH LI LETTER VA */
+ ["\uA921", "\uA921"], /* KAYAH LI LETTER CA */
+ ["\uA922", "\uA922"], /* KAYAH LI LETTER A */
+ ["\uA923", "\uA923"], /* KAYAH LI LETTER OE */
+ ["\uA924", "\uA924"], /* KAYAH LI LETTER I */
+ ["\uA925", "\uA925"], /* KAYAH LI LETTER OO */
+ ["\uA926", "\uA926"], /* KAYAH LI VOWEL UE */
+ ["\uA927", "\uA927"], /* KAYAH LI VOWEL E */
+ ["\uA928", "\uA928"], /* KAYAH LI VOWEL U */
+ ["\uA929", "\uA929"], /* KAYAH LI VOWEL EE */
+ ["\uA92A", "\uA92A"], /* KAYAH LI VOWEL O */
+ ["\uA92B", "\uA92B"], /* KAYAH LI TONE PLOPHU */
+ ["\uA92C", "\uA92C"], /* KAYAH LI TONE CALYA */
+ ["\uA92D", "\uA92D"], /* KAYAH LI TONE CALYA PLOPHU */
+ ["\uA92E", "\uA92E"], /* KAYAH LI SIGN CWI */
+ ["\uA92F", "\uA92F"], /* KAYAH LI SIGN SHYA */
+ ["\uA930", "\uA930"], /* REJANG LETTER KA */
+ ["\uA931", "\uA931"], /* REJANG LETTER GA */
+ ["\uA932", "\uA932"], /* REJANG LETTER NGA */
+ ["\uA933", "\uA933"], /* REJANG LETTER TA */
+ ["\uA934", "\uA934"], /* REJANG LETTER DA */
+ ["\uA935", "\uA935"], /* REJANG LETTER NA */
+ ["\uA936", "\uA936"], /* REJANG LETTER PA */
+ ["\uA937", "\uA937"], /* REJANG LETTER BA */
+ ["\uA938", "\uA938"], /* REJANG LETTER MA */
+ ["\uA939", "\uA939"], /* REJANG LETTER CA */
+ ["\uA93A", "\uA93A"], /* REJANG LETTER JA */
+ ["\uA93B", "\uA93B"], /* REJANG LETTER NYA */
+ ["\uA93C", "\uA93C"], /* REJANG LETTER SA */
+ ["\uA93D", "\uA93D"], /* REJANG LETTER RA */
+ ["\uA93E", "\uA93E"], /* REJANG LETTER LA */
+ ["\uA93F", "\uA93F"], /* REJANG LETTER YA */
+ ["\uA940", "\uA940"], /* REJANG LETTER WA */
+ ["\uA941", "\uA941"], /* REJANG LETTER HA */
+ ["\uA942", "\uA942"], /* REJANG LETTER MBA */
+ ["\uA943", "\uA943"], /* REJANG LETTER NGGA */
+ ["\uA944", "\uA944"], /* REJANG LETTER NDA */
+ ["\uA945", "\uA945"], /* REJANG LETTER NYJA */
+ ["\uA946", "\uA946"], /* REJANG LETTER A */
+ ["\uA947", "\uA947"], /* REJANG VOWEL SIGN I */
+ ["\uA948", "\uA948"], /* REJANG VOWEL SIGN U */
+ ["\uA949", "\uA949"], /* REJANG VOWEL SIGN E */
+ ["\uA94A", "\uA94A"], /* REJANG VOWEL SIGN AI */
+ ["\uA94B", "\uA94B"], /* REJANG VOWEL SIGN O */
+ ["\uA94C", "\uA94C"], /* REJANG VOWEL SIGN AU */
+ ["\uA94D", "\uA94D"], /* REJANG VOWEL SIGN EU */
+ ["\uA94E", "\uA94E"], /* REJANG VOWEL SIGN EA */
+ ["\uA94F", "\uA94F"], /* REJANG CONSONANT SIGN NG */
+ ["\uA950", "\uA950"], /* REJANG CONSONANT SIGN N */
+ ["\uA951", "\uA951"], /* REJANG CONSONANT SIGN R */
+ ["\uA952", "\uA952"], /* REJANG CONSONANT SIGN H */
+ ["\uA953", "\uA953"], /* REJANG VIRAMA */
+ ["\uA954", "\uA954"],
+ ["\uA955", "\uA955"],
+ ["\uA956", "\uA956"],
+ ["\uA957", "\uA957"],
+ ["\uA958", "\uA958"],
+ ["\uA959", "\uA959"],
+ ["\uA95A", "\uA95A"],
+ ["\uA95B", "\uA95B"],
+ ["\uA95C", "\uA95C"],
+ ["\uA95D", "\uA95D"],
+ ["\uA95E", "\uA95E"],
+ ["\uA95F", "\uA95F"], /* REJANG SECTION MARK */
+ ["\uA960", "\uA960"], /* HANGUL CHOSEONG TIKEUT-MIEUM */
+ ["\uA961", "\uA961"], /* HANGUL CHOSEONG TIKEUT-PIEUP */
+ ["\uA962", "\uA962"], /* HANGUL CHOSEONG TIKEUT-SIOS */
+ ["\uA963", "\uA963"], /* HANGUL CHOSEONG TIKEUT-CIEUC */
+ ["\uA964", "\uA964"], /* HANGUL CHOSEONG RIEUL-KIYEOK */
+ ["\uA965", "\uA965"], /* HANGUL CHOSEONG RIEUL-SSANGKIYEOK */
+ ["\uA966", "\uA966"], /* HANGUL CHOSEONG RIEUL-TIKEUT */
+ ["\uA967", "\uA967"], /* HANGUL CHOSEONG RIEUL-SSANGTIKEUT */
+ ["\uA968", "\uA968"], /* HANGUL CHOSEONG RIEUL-MIEUM */
+ ["\uA969", "\uA969"], /* HANGUL CHOSEONG RIEUL-PIEUP */
+ ["\uA96A", "\uA96A"], /* HANGUL CHOSEONG RIEUL-SSANGPIEUP */
+ ["\uA96B", "\uA96B"], /* HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP */
+ ["\uA96C", "\uA96C"], /* HANGUL CHOSEONG RIEUL-SIOS */
+ ["\uA96D", "\uA96D"], /* HANGUL CHOSEONG RIEUL-CIEUC */
+ ["\uA96E", "\uA96E"], /* HANGUL CHOSEONG RIEUL-KHIEUKH */
+ ["\uA96F", "\uA96F"], /* HANGUL CHOSEONG MIEUM-KIYEOK */
+ ["\uA970", "\uA970"], /* HANGUL CHOSEONG MIEUM-TIKEUT */
+ ["\uA971", "\uA971"], /* HANGUL CHOSEONG MIEUM-SIOS */
+ ["\uA972", "\uA972"], /* HANGUL CHOSEONG PIEUP-SIOS-THIEUTH */
+ ["\uA973", "\uA973"], /* HANGUL CHOSEONG PIEUP-KHIEUKH */
+ ["\uA974", "\uA974"], /* HANGUL CHOSEONG PIEUP-HIEUH */
+ ["\uA975", "\uA975"], /* HANGUL CHOSEONG SSANGSIOS-PIEUP */
+ ["\uA976", "\uA976"], /* HANGUL CHOSEONG IEUNG-RIEUL */
+ ["\uA977", "\uA977"], /* HANGUL CHOSEONG IEUNG-HIEUH */
+ ["\uA978", "\uA978"], /* HANGUL CHOSEONG SSANGCIEUC-HIEUH */
+ ["\uA979", "\uA979"], /* HANGUL CHOSEONG SSANGTHIEUTH */
+ ["\uA97A", "\uA97A"], /* HANGUL CHOSEONG PHIEUPH-HIEUH */
+ ["\uA97B", "\uA97B"], /* HANGUL CHOSEONG HIEUH-SIOS */
+ ["\uA97C", "\uA97C"], /* HANGUL CHOSEONG SSANGYEORINHIEUH */
+ ["\uA97D", "\uA97D"],
+ ["\uA97E", "\uA97E"],
+ ["\uA97F", "\uA97F"],
+ ["\uA980", "\uA980"], /* JAVANESE SIGN PANYANGGA */
+ ["\uA981", "\uA981"], /* JAVANESE SIGN CECAK */
+ ["\uA982", "\uA982"], /* JAVANESE SIGN LAYAR */
+ ["\uA983", "\uA983"], /* JAVANESE SIGN WIGNYAN */
+ ["\uA984", "\uA984"], /* JAVANESE LETTER A */
+ ["\uA985", "\uA985"], /* JAVANESE LETTER I KAWI */
+ ["\uA986", "\uA986"], /* JAVANESE LETTER I */
+ ["\uA987", "\uA987"], /* JAVANESE LETTER II */
+ ["\uA988", "\uA988"], /* JAVANESE LETTER U */
+ ["\uA989", "\uA989"], /* JAVANESE LETTER PA CEREK */
+ ["\uA98A", "\uA98A"], /* JAVANESE LETTER NGA LELET */
+ ["\uA98B", "\uA98B"], /* JAVANESE LETTER NGA LELET RASWADI */
+ ["\uA98C", "\uA98C"], /* JAVANESE LETTER E */
+ ["\uA98D", "\uA98D"], /* JAVANESE LETTER AI */
+ ["\uA98E", "\uA98E"], /* JAVANESE LETTER O */
+ ["\uA98F", "\uA98F"], /* JAVANESE LETTER KA */
+ ["\uA990", "\uA990"], /* JAVANESE LETTER KA SASAK */
+ ["\uA991", "\uA991"], /* JAVANESE LETTER KA MURDA */
+ ["\uA992", "\uA992"], /* JAVANESE LETTER GA */
+ ["\uA993", "\uA993"], /* JAVANESE LETTER GA MURDA */
+ ["\uA994", "\uA994"], /* JAVANESE LETTER NGA */
+ ["\uA995", "\uA995"], /* JAVANESE LETTER CA */
+ ["\uA996", "\uA996"], /* JAVANESE LETTER CA MURDA */
+ ["\uA997", "\uA997"], /* JAVANESE LETTER JA */
+ ["\uA998", "\uA998"], /* JAVANESE LETTER NYA MURDA */
+ ["\uA999", "\uA999"], /* JAVANESE LETTER JA MAHAPRANA */
+ ["\uA99A", "\uA99A"], /* JAVANESE LETTER NYA */
+ ["\uA99B", "\uA99B"], /* JAVANESE LETTER TTA */
+ ["\uA99C", "\uA99C"], /* JAVANESE LETTER TTA MAHAPRANA */
+ ["\uA99D", "\uA99D"], /* JAVANESE LETTER DDA */
+ ["\uA99E", "\uA99E"], /* JAVANESE LETTER DDA MAHAPRANA */
+ ["\uA99F", "\uA99F"], /* JAVANESE LETTER NA MURDA */
+ ["\uA9A0", "\uA9A0"], /* JAVANESE LETTER TA */
+ ["\uA9A1", "\uA9A1"], /* JAVANESE LETTER TA MURDA */
+ ["\uA9A2", "\uA9A2"], /* JAVANESE LETTER DA */
+ ["\uA9A3", "\uA9A3"], /* JAVANESE LETTER DA MAHAPRANA */
+ ["\uA9A4", "\uA9A4"], /* JAVANESE LETTER NA */
+ ["\uA9A5", "\uA9A5"], /* JAVANESE LETTER PA */
+ ["\uA9A6", "\uA9A6"], /* JAVANESE LETTER PA MURDA */
+ ["\uA9A7", "\uA9A7"], /* JAVANESE LETTER BA */
+ ["\uA9A8", "\uA9A8"], /* JAVANESE LETTER BA MURDA */
+ ["\uA9A9", "\uA9A9"], /* JAVANESE LETTER MA */
+ ["\uA9AA", "\uA9AA"], /* JAVANESE LETTER YA */
+ ["\uA9AB", "\uA9AB"], /* JAVANESE LETTER RA */
+ ["\uA9AC", "\uA9AC"], /* JAVANESE LETTER RA AGUNG */
+ ["\uA9AD", "\uA9AD"], /* JAVANESE LETTER LA */
+ ["\uA9AE", "\uA9AE"], /* JAVANESE LETTER WA */
+ ["\uA9AF", "\uA9AF"], /* JAVANESE LETTER SA MURDA */
+ ["\uA9B0", "\uA9B0"], /* JAVANESE LETTER SA MAHAPRANA */
+ ["\uA9B1", "\uA9B1"], /* JAVANESE LETTER SA */
+ ["\uA9B2", "\uA9B2"], /* JAVANESE LETTER HA */
+ ["\uA9B3", "\uA9B3"], /* JAVANESE SIGN CECAK TELU */
+ ["\uA9B4", "\uA9B4"], /* JAVANESE VOWEL SIGN TARUNG */
+ ["\uA9B5", "\uA9B5"], /* JAVANESE VOWEL SIGN TOLONG */
+ ["\uA9B6", "\uA9B6"], /* JAVANESE VOWEL SIGN WULU */
+ ["\uA9B7", "\uA9B7"], /* JAVANESE VOWEL SIGN WULU MELIK */
+ ["\uA9B8", "\uA9B8"], /* JAVANESE VOWEL SIGN SUKU */
+ ["\uA9B9", "\uA9B9"], /* JAVANESE VOWEL SIGN SUKU MENDUT */
+ ["\uA9BA", "\uA9BA"], /* JAVANESE VOWEL SIGN TALING */
+ ["\uA9BB", "\uA9BB"], /* JAVANESE VOWEL SIGN DIRGA MURE */
+ ["\uA9BC", "\uA9BC"], /* JAVANESE VOWEL SIGN PEPET */
+ ["\uA9BD", "\uA9BD"], /* JAVANESE CONSONANT SIGN KERET */
+ ["\uA9BE", "\uA9BE"], /* JAVANESE CONSONANT SIGN PENGKAL */
+ ["\uA9BF", "\uA9BF"], /* JAVANESE CONSONANT SIGN CAKRA */
+ ["\uA9C0", "\uA9C0"], /* JAVANESE PANGKON */
+ ["\uA9C1", "\uA9C1"], /* JAVANESE LEFT RERENGGAN */
+ ["\uA9C2", "\uA9C2"], /* JAVANESE RIGHT RERENGGAN */
+ ["\uA9C3", "\uA9C3"], /* JAVANESE PADA ANDAP */
+ ["\uA9C4", "\uA9C4"], /* JAVANESE PADA MADYA */
+ ["\uA9C5", "\uA9C5"], /* JAVANESE PADA LUHUR */
+ ["\uA9C6", "\uA9C6"], /* JAVANESE PADA WINDU */
+ ["\uA9C7", "\uA9C7"], /* JAVANESE PADA PANGKAT */
+ ["\uA9C8", "\uA9C8"], /* JAVANESE PADA LINGSA */
+ ["\uA9C9", "\uA9C9"], /* JAVANESE PADA LUNGSI */
+ ["\uA9CA", "\uA9CA"], /* JAVANESE PADA ADEG */
+ ["\uA9CB", "\uA9CB"], /* JAVANESE PADA ADEG ADEG */
+ ["\uA9CC", "\uA9CC"], /* JAVANESE PADA PISELEH */
+ ["\uA9CD", "\uA9CD"], /* JAVANESE TURNED PADA PISELEH */
+ ["\uA9CE", "\uA9CE"],
+ ["\uA9CF", "\uA9CF"], /* JAVANESE PANGRANGKEP */
+ ["\uA9D0", "\uA9D0"], /* JAVANESE DIGIT ZERO */
+ ["\uA9D1", "\uA9D1"], /* JAVANESE DIGIT ONE */
+ ["\uA9D2", "\uA9D2"], /* JAVANESE DIGIT TWO */
+ ["\uA9D3", "\uA9D3"], /* JAVANESE DIGIT THREE */
+ ["\uA9D4", "\uA9D4"], /* JAVANESE DIGIT FOUR */
+ ["\uA9D5", "\uA9D5"], /* JAVANESE DIGIT FIVE */
+ ["\uA9D6", "\uA9D6"], /* JAVANESE DIGIT SIX */
+ ["\uA9D7", "\uA9D7"], /* JAVANESE DIGIT SEVEN */
+ ["\uA9D8", "\uA9D8"], /* JAVANESE DIGIT EIGHT */
+ ["\uA9D9", "\uA9D9"], /* JAVANESE DIGIT NINE */
+ ["\uA9DA", "\uA9DA"],
+ ["\uA9DB", "\uA9DB"],
+ ["\uA9DC", "\uA9DC"],
+ ["\uA9DD", "\uA9DD"],
+ ["\uA9DE", "\uA9DE"], /* JAVANESE PADA TIRTA TUMETES */
+ ["\uA9DF", "\uA9DF"], /* JAVANESE PADA ISEN-ISEN */
+ ["\uA9E0", "\uA9E0"], /* MYANMAR LETTER SHAN GHA */
+ ["\uA9E1", "\uA9E1"], /* MYANMAR LETTER SHAN CHA */
+ ["\uA9E2", "\uA9E2"], /* MYANMAR LETTER SHAN JHA */
+ ["\uA9E3", "\uA9E3"], /* MYANMAR LETTER SHAN NNA */
+ ["\uA9E4", "\uA9E4"], /* MYANMAR LETTER SHAN BHA */
+ ["\uA9E5", "\uA9E5"], /* MYANMAR SIGN SHAN SAW */
+ ["\uA9E6", "\uA9E6"], /* MYANMAR MODIFIER LETTER SHAN REDUPLICATION */
+ ["\uA9E7", "\uA9E7"], /* MYANMAR LETTER TAI LAING NYA */
+ ["\uA9E8", "\uA9E8"], /* MYANMAR LETTER TAI LAING FA */
+ ["\uA9E9", "\uA9E9"], /* MYANMAR LETTER TAI LAING GA */
+ ["\uA9EA", "\uA9EA"], /* MYANMAR LETTER TAI LAING GHA */
+ ["\uA9EB", "\uA9EB"], /* MYANMAR LETTER TAI LAING JA */
+ ["\uA9EC", "\uA9EC"], /* MYANMAR LETTER TAI LAING JHA */
+ ["\uA9ED", "\uA9ED"], /* MYANMAR LETTER TAI LAING DDA */
+ ["\uA9EE", "\uA9EE"], /* MYANMAR LETTER TAI LAING DDHA */
+ ["\uA9EF", "\uA9EF"], /* MYANMAR LETTER TAI LAING NNA */
+ ["\uA9F0", "\uA9F0"], /* MYANMAR TAI LAING DIGIT ZERO */
+ ["\uA9F1", "\uA9F1"], /* MYANMAR TAI LAING DIGIT ONE */
+ ["\uA9F2", "\uA9F2"], /* MYANMAR TAI LAING DIGIT TWO */
+ ["\uA9F3", "\uA9F3"], /* MYANMAR TAI LAING DIGIT THREE */
+ ["\uA9F4", "\uA9F4"], /* MYANMAR TAI LAING DIGIT FOUR */
+ ["\uA9F5", "\uA9F5"], /* MYANMAR TAI LAING DIGIT FIVE */
+ ["\uA9F6", "\uA9F6"], /* MYANMAR TAI LAING DIGIT SIX */
+ ["\uA9F7", "\uA9F7"], /* MYANMAR TAI LAING DIGIT SEVEN */
+ ["\uA9F8", "\uA9F8"], /* MYANMAR TAI LAING DIGIT EIGHT */
+ ["\uA9F9", "\uA9F9"], /* MYANMAR TAI LAING DIGIT NINE */
+ ["\uA9FA", "\uA9FA"], /* MYANMAR LETTER TAI LAING LLA */
+ ["\uA9FB", "\uA9FB"], /* MYANMAR LETTER TAI LAING DA */
+ ["\uA9FC", "\uA9FC"], /* MYANMAR LETTER TAI LAING DHA */
+ ["\uA9FD", "\uA9FD"], /* MYANMAR LETTER TAI LAING BA */
+ ["\uA9FE", "\uA9FE"], /* MYANMAR LETTER TAI LAING BHA */
+ ["\uA9FF", "\uA9FF"],
+ ["\uAA00", "\uAA00"], /* CHAM LETTER A */
+ ["\uAA01", "\uAA01"], /* CHAM LETTER I */
+ ["\uAA02", "\uAA02"], /* CHAM LETTER U */
+ ["\uAA03", "\uAA03"], /* CHAM LETTER E */
+ ["\uAA04", "\uAA04"], /* CHAM LETTER AI */
+ ["\uAA05", "\uAA05"], /* CHAM LETTER O */
+ ["\uAA06", "\uAA06"], /* CHAM LETTER KA */
+ ["\uAA07", "\uAA07"], /* CHAM LETTER KHA */
+ ["\uAA08", "\uAA08"], /* CHAM LETTER GA */
+ ["\uAA09", "\uAA09"], /* CHAM LETTER GHA */
+ ["\uAA0A", "\uAA0A"], /* CHAM LETTER NGUE */
+ ["\uAA0B", "\uAA0B"], /* CHAM LETTER NGA */
+ ["\uAA0C", "\uAA0C"], /* CHAM LETTER CHA */
+ ["\uAA0D", "\uAA0D"], /* CHAM LETTER CHHA */
+ ["\uAA0E", "\uAA0E"], /* CHAM LETTER JA */
+ ["\uAA0F", "\uAA0F"], /* CHAM LETTER JHA */
+ ["\uAA10", "\uAA10"], /* CHAM LETTER NHUE */
+ ["\uAA11", "\uAA11"], /* CHAM LETTER NHA */
+ ["\uAA12", "\uAA12"], /* CHAM LETTER NHJA */
+ ["\uAA13", "\uAA13"], /* CHAM LETTER TA */
+ ["\uAA14", "\uAA14"], /* CHAM LETTER THA */
+ ["\uAA15", "\uAA15"], /* CHAM LETTER DA */
+ ["\uAA16", "\uAA16"], /* CHAM LETTER DHA */
+ ["\uAA17", "\uAA17"], /* CHAM LETTER NUE */
+ ["\uAA18", "\uAA18"], /* CHAM LETTER NA */
+ ["\uAA19", "\uAA19"], /* CHAM LETTER DDA */
+ ["\uAA1A", "\uAA1A"], /* CHAM LETTER PA */
+ ["\uAA1B", "\uAA1B"], /* CHAM LETTER PPA */
+ ["\uAA1C", "\uAA1C"], /* CHAM LETTER PHA */
+ ["\uAA1D", "\uAA1D"], /* CHAM LETTER BA */
+ ["\uAA1E", "\uAA1E"], /* CHAM LETTER BHA */
+ ["\uAA1F", "\uAA1F"], /* CHAM LETTER MUE */
+ ["\uAA20", "\uAA20"], /* CHAM LETTER MA */
+ ["\uAA21", "\uAA21"], /* CHAM LETTER BBA */
+ ["\uAA22", "\uAA22"], /* CHAM LETTER YA */
+ ["\uAA23", "\uAA23"], /* CHAM LETTER RA */
+ ["\uAA24", "\uAA24"], /* CHAM LETTER LA */
+ ["\uAA25", "\uAA25"], /* CHAM LETTER VA */
+ ["\uAA26", "\uAA26"], /* CHAM LETTER SSA */
+ ["\uAA27", "\uAA27"], /* CHAM LETTER SA */
+ ["\uAA28", "\uAA28"], /* CHAM LETTER HA */
+ ["\uAA29", "\uAA29"], /* CHAM VOWEL SIGN AA */
+ ["\uAA2A", "\uAA2A"], /* CHAM VOWEL SIGN I */
+ ["\uAA2B", "\uAA2B"], /* CHAM VOWEL SIGN II */
+ ["\uAA2C", "\uAA2C"], /* CHAM VOWEL SIGN EI */
+ ["\uAA2D", "\uAA2D"], /* CHAM VOWEL SIGN U */
+ ["\uAA2E", "\uAA2E"], /* CHAM VOWEL SIGN OE */
+ ["\uAA2F", "\uAA2F"], /* CHAM VOWEL SIGN O */
+ ["\uAA30", "\uAA30"], /* CHAM VOWEL SIGN AI */
+ ["\uAA31", "\uAA31"], /* CHAM VOWEL SIGN AU */
+ ["\uAA32", "\uAA32"], /* CHAM VOWEL SIGN UE */
+ ["\uAA33", "\uAA33"], /* CHAM CONSONANT SIGN YA */
+ ["\uAA34", "\uAA34"], /* CHAM CONSONANT SIGN RA */
+ ["\uAA35", "\uAA35"], /* CHAM CONSONANT SIGN LA */
+ ["\uAA36", "\uAA36"], /* CHAM CONSONANT SIGN WA */
+ ["\uAA37", "\uAA37"],
+ ["\uAA38", "\uAA38"],
+ ["\uAA39", "\uAA39"],
+ ["\uAA3A", "\uAA3A"],
+ ["\uAA3B", "\uAA3B"],
+ ["\uAA3C", "\uAA3C"],
+ ["\uAA3D", "\uAA3D"],
+ ["\uAA3E", "\uAA3E"],
+ ["\uAA3F", "\uAA3F"],
+ ["\uAA40", "\uAA40"], /* CHAM LETTER FINAL K */
+ ["\uAA41", "\uAA41"], /* CHAM LETTER FINAL G */
+ ["\uAA42", "\uAA42"], /* CHAM LETTER FINAL NG */
+ ["\uAA43", "\uAA43"], /* CHAM CONSONANT SIGN FINAL NG */
+ ["\uAA44", "\uAA44"], /* CHAM LETTER FINAL CH */
+ ["\uAA45", "\uAA45"], /* CHAM LETTER FINAL T */
+ ["\uAA46", "\uAA46"], /* CHAM LETTER FINAL N */
+ ["\uAA47", "\uAA47"], /* CHAM LETTER FINAL P */
+ ["\uAA48", "\uAA48"], /* CHAM LETTER FINAL Y */
+ ["\uAA49", "\uAA49"], /* CHAM LETTER FINAL R */
+ ["\uAA4A", "\uAA4A"], /* CHAM LETTER FINAL L */
+ ["\uAA4B", "\uAA4B"], /* CHAM LETTER FINAL SS */
+ ["\uAA4C", "\uAA4C"], /* CHAM CONSONANT SIGN FINAL M */
+ ["\uAA4D", "\uAA4D"], /* CHAM CONSONANT SIGN FINAL H */
+ ["\uAA4E", "\uAA4E"],
+ ["\uAA4F", "\uAA4F"],
+ ["\uAA50", "\uAA50"], /* CHAM DIGIT ZERO */
+ ["\uAA51", "\uAA51"], /* CHAM DIGIT ONE */
+ ["\uAA52", "\uAA52"], /* CHAM DIGIT TWO */
+ ["\uAA53", "\uAA53"], /* CHAM DIGIT THREE */
+ ["\uAA54", "\uAA54"], /* CHAM DIGIT FOUR */
+ ["\uAA55", "\uAA55"], /* CHAM DIGIT FIVE */
+ ["\uAA56", "\uAA56"], /* CHAM DIGIT SIX */
+ ["\uAA57", "\uAA57"], /* CHAM DIGIT SEVEN */
+ ["\uAA58", "\uAA58"], /* CHAM DIGIT EIGHT */
+ ["\uAA59", "\uAA59"], /* CHAM DIGIT NINE */
+ ["\uAA5A", "\uAA5A"],
+ ["\uAA5B", "\uAA5B"],
+ ["\uAA5C", "\uAA5C"], /* CHAM PUNCTUATION SPIRAL */
+ ["\uAA5D", "\uAA5D"], /* CHAM PUNCTUATION DANDA */
+ ["\uAA5E", "\uAA5E"], /* CHAM PUNCTUATION DOUBLE DANDA */
+ ["\uAA5F", "\uAA5F"], /* CHAM PUNCTUATION TRIPLE DANDA */
+ ["\uAA60", "\uAA60"], /* MYANMAR LETTER KHAMTI GA */
+ ["\uAA61", "\uAA61"], /* MYANMAR LETTER KHAMTI CA */
+ ["\uAA62", "\uAA62"], /* MYANMAR LETTER KHAMTI CHA */
+ ["\uAA63", "\uAA63"], /* MYANMAR LETTER KHAMTI JA */
+ ["\uAA64", "\uAA64"], /* MYANMAR LETTER KHAMTI JHA */
+ ["\uAA65", "\uAA65"], /* MYANMAR LETTER KHAMTI NYA */
+ ["\uAA66", "\uAA66"], /* MYANMAR LETTER KHAMTI TTA */
+ ["\uAA67", "\uAA67"], /* MYANMAR LETTER KHAMTI TTHA */
+ ["\uAA68", "\uAA68"], /* MYANMAR LETTER KHAMTI DDA */
+ ["\uAA69", "\uAA69"], /* MYANMAR LETTER KHAMTI DDHA */
+ ["\uAA6A", "\uAA6A"], /* MYANMAR LETTER KHAMTI DHA */
+ ["\uAA6B", "\uAA6B"], /* MYANMAR LETTER KHAMTI NA */
+ ["\uAA6C", "\uAA6C"], /* MYANMAR LETTER KHAMTI SA */
+ ["\uAA6D", "\uAA6D"], /* MYANMAR LETTER KHAMTI HA */
+ ["\uAA6E", "\uAA6E"], /* MYANMAR LETTER KHAMTI HHA */
+ ["\uAA6F", "\uAA6F"], /* MYANMAR LETTER KHAMTI FA */
+ ["\uAA70", "\uAA70"], /* MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION */
+ ["\uAA71", "\uAA71"], /* MYANMAR LETTER KHAMTI XA */
+ ["\uAA72", "\uAA72"], /* MYANMAR LETTER KHAMTI ZA */
+ ["\uAA73", "\uAA73"], /* MYANMAR LETTER KHAMTI RA */
+ ["\uAA74", "\uAA74"], /* MYANMAR LOGOGRAM KHAMTI OAY */
+ ["\uAA75", "\uAA75"], /* MYANMAR LOGOGRAM KHAMTI QN */
+ ["\uAA76", "\uAA76"], /* MYANMAR LOGOGRAM KHAMTI HM */
+ ["\uAA77", "\uAA77"], /* MYANMAR SYMBOL AITON EXCLAMATION */
+ ["\uAA78", "\uAA78"], /* MYANMAR SYMBOL AITON ONE */
+ ["\uAA79", "\uAA79"], /* MYANMAR SYMBOL AITON TWO */
+ ["\uAA7A", "\uAA7A"], /* MYANMAR LETTER AITON RA */
+ ["\uAA7B", "\uAA7B"], /* MYANMAR SIGN PAO KAREN TONE */
+ ["\uAA7C", "\uAA7C"], /* MYANMAR SIGN TAI LAING TONE-2 */
+ ["\uAA7D", "\uAA7D"], /* MYANMAR SIGN TAI LAING TONE-5 */
+ ["\uAA7E", "\uAA7E"], /* MYANMAR LETTER SHWE PALAUNG CHA */
+ ["\uAA7F", "\uAA7F"], /* MYANMAR LETTER SHWE PALAUNG SHA */
+ ["\uAA80", "\uAA80"], /* TAI VIET LETTER LOW KO */
+ ["\uAA81", "\uAA81"], /* TAI VIET LETTER HIGH KO */
+ ["\uAA82", "\uAA82"], /* TAI VIET LETTER LOW KHO */
+ ["\uAA83", "\uAA83"], /* TAI VIET LETTER HIGH KHO */
+ ["\uAA84", "\uAA84"], /* TAI VIET LETTER LOW KHHO */
+ ["\uAA85", "\uAA85"], /* TAI VIET LETTER HIGH KHHO */
+ ["\uAA86", "\uAA86"], /* TAI VIET LETTER LOW GO */
+ ["\uAA87", "\uAA87"], /* TAI VIET LETTER HIGH GO */
+ ["\uAA88", "\uAA88"], /* TAI VIET LETTER LOW NGO */
+ ["\uAA89", "\uAA89"], /* TAI VIET LETTER HIGH NGO */
+ ["\uAA8A", "\uAA8A"], /* TAI VIET LETTER LOW CO */
+ ["\uAA8B", "\uAA8B"], /* TAI VIET LETTER HIGH CO */
+ ["\uAA8C", "\uAA8C"], /* TAI VIET LETTER LOW CHO */
+ ["\uAA8D", "\uAA8D"], /* TAI VIET LETTER HIGH CHO */
+ ["\uAA8E", "\uAA8E"], /* TAI VIET LETTER LOW SO */
+ ["\uAA8F", "\uAA8F"], /* TAI VIET LETTER HIGH SO */
+ ["\uAA90", "\uAA90"], /* TAI VIET LETTER LOW NYO */
+ ["\uAA91", "\uAA91"], /* TAI VIET LETTER HIGH NYO */
+ ["\uAA92", "\uAA92"], /* TAI VIET LETTER LOW DO */
+ ["\uAA93", "\uAA93"], /* TAI VIET LETTER HIGH DO */
+ ["\uAA94", "\uAA94"], /* TAI VIET LETTER LOW TO */
+ ["\uAA95", "\uAA95"], /* TAI VIET LETTER HIGH TO */
+ ["\uAA96", "\uAA96"], /* TAI VIET LETTER LOW THO */
+ ["\uAA97", "\uAA97"], /* TAI VIET LETTER HIGH THO */
+ ["\uAA98", "\uAA98"], /* TAI VIET LETTER LOW NO */
+ ["\uAA99", "\uAA99"], /* TAI VIET LETTER HIGH NO */
+ ["\uAA9A", "\uAA9A"], /* TAI VIET LETTER LOW BO */
+ ["\uAA9B", "\uAA9B"], /* TAI VIET LETTER HIGH BO */
+ ["\uAA9C", "\uAA9C"], /* TAI VIET LETTER LOW PO */
+ ["\uAA9D", "\uAA9D"], /* TAI VIET LETTER HIGH PO */
+ ["\uAA9E", "\uAA9E"], /* TAI VIET LETTER LOW PHO */
+ ["\uAA9F", "\uAA9F"], /* TAI VIET LETTER HIGH PHO */
+ ["\uAAA0", "\uAAA0"], /* TAI VIET LETTER LOW FO */
+ ["\uAAA1", "\uAAA1"], /* TAI VIET LETTER HIGH FO */
+ ["\uAAA2", "\uAAA2"], /* TAI VIET LETTER LOW MO */
+ ["\uAAA3", "\uAAA3"], /* TAI VIET LETTER HIGH MO */
+ ["\uAAA4", "\uAAA4"], /* TAI VIET LETTER LOW YO */
+ ["\uAAA5", "\uAAA5"], /* TAI VIET LETTER HIGH YO */
+ ["\uAAA6", "\uAAA6"], /* TAI VIET LETTER LOW RO */
+ ["\uAAA7", "\uAAA7"], /* TAI VIET LETTER HIGH RO */
+ ["\uAAA8", "\uAAA8"], /* TAI VIET LETTER LOW LO */
+ ["\uAAA9", "\uAAA9"], /* TAI VIET LETTER HIGH LO */
+ ["\uAAAA", "\uAAAA"], /* TAI VIET LETTER LOW VO */
+ ["\uAAAB", "\uAAAB"], /* TAI VIET LETTER HIGH VO */
+ ["\uAAAC", "\uAAAC"], /* TAI VIET LETTER LOW HO */
+ ["\uAAAD", "\uAAAD"], /* TAI VIET LETTER HIGH HO */
+ ["\uAAAE", "\uAAAE"], /* TAI VIET LETTER LOW O */
+ ["\uAAAF", "\uAAAF"], /* TAI VIET LETTER HIGH O */
+ ["\uAAB0", "\uAAB0"], /* TAI VIET MAI KANG */
+ ["\uAAB1", "\uAAB1"], /* TAI VIET VOWEL AA */
+ ["\uAAB2", "\uAAB2"], /* TAI VIET VOWEL I */
+ ["\uAAB3", "\uAAB3"], /* TAI VIET VOWEL UE */
+ ["\uAAB4", "\uAAB4"], /* TAI VIET VOWEL U */
+ ["\uAAB5", "\uAAB5"], /* TAI VIET VOWEL E */
+ ["\uAAB6", "\uAAB6"], /* TAI VIET VOWEL O */
+ ["\uAAB7", "\uAAB7"], /* TAI VIET MAI KHIT */
+ ["\uAAB8", "\uAAB8"], /* TAI VIET VOWEL IA */
+ ["\uAAB9", "\uAAB9"], /* TAI VIET VOWEL UEA */
+ ["\uAABA", "\uAABA"], /* TAI VIET VOWEL UA */
+ ["\uAABB", "\uAABB"], /* TAI VIET VOWEL AUE */
+ ["\uAABC", "\uAABC"], /* TAI VIET VOWEL AY */
+ ["\uAABD", "\uAABD"], /* TAI VIET VOWEL AN */
+ ["\uAABE", "\uAABE"], /* TAI VIET VOWEL AM */
+ ["\uAABF", "\uAABF"], /* TAI VIET TONE MAI EK */
+ ["\uAAC0", "\uAAC0"], /* TAI VIET TONE MAI NUENG */
+ ["\uAAC1", "\uAAC1"], /* TAI VIET TONE MAI THO */
+ ["\uAAC2", "\uAAC2"], /* TAI VIET TONE MAI SONG */
+ ["\uAAC3", "\uAAC3"],
+ ["\uAAC4", "\uAAC4"],
+ ["\uAAC5", "\uAAC5"],
+ ["\uAAC6", "\uAAC6"],
+ ["\uAAC7", "\uAAC7"],
+ ["\uAAC8", "\uAAC8"],
+ ["\uAAC9", "\uAAC9"],
+ ["\uAACA", "\uAACA"],
+ ["\uAACB", "\uAACB"],
+ ["\uAACC", "\uAACC"],
+ ["\uAACD", "\uAACD"],
+ ["\uAACE", "\uAACE"],
+ ["\uAACF", "\uAACF"],
+ ["\uAAD0", "\uAAD0"],
+ ["\uAAD1", "\uAAD1"],
+ ["\uAAD2", "\uAAD2"],
+ ["\uAAD3", "\uAAD3"],
+ ["\uAAD4", "\uAAD4"],
+ ["\uAAD5", "\uAAD5"],
+ ["\uAAD6", "\uAAD6"],
+ ["\uAAD7", "\uAAD7"],
+ ["\uAAD8", "\uAAD8"],
+ ["\uAAD9", "\uAAD9"],
+ ["\uAADA", "\uAADA"],
+ ["\uAADB", "\uAADB"], /* TAI VIET SYMBOL KON */
+ ["\uAADC", "\uAADC"], /* TAI VIET SYMBOL NUENG */
+ ["\uAADD", "\uAADD"], /* TAI VIET SYMBOL SAM */
+ ["\uAADE", "\uAADE"], /* TAI VIET SYMBOL HO HOI */
+ ["\uAADF", "\uAADF"], /* TAI VIET SYMBOL KOI KOI */
+ ["\uAAE0", "\uAAE0"], /* MEETEI MAYEK LETTER E */
+ ["\uAAE1", "\uAAE1"], /* MEETEI MAYEK LETTER O */
+ ["\uAAE2", "\uAAE2"], /* MEETEI MAYEK LETTER CHA */
+ ["\uAAE3", "\uAAE3"], /* MEETEI MAYEK LETTER NYA */
+ ["\uAAE4", "\uAAE4"], /* MEETEI MAYEK LETTER TTA */
+ ["\uAAE5", "\uAAE5"], /* MEETEI MAYEK LETTER TTHA */
+ ["\uAAE6", "\uAAE6"], /* MEETEI MAYEK LETTER DDA */
+ ["\uAAE7", "\uAAE7"], /* MEETEI MAYEK LETTER DDHA */
+ ["\uAAE8", "\uAAE8"], /* MEETEI MAYEK LETTER NNA */
+ ["\uAAE9", "\uAAE9"], /* MEETEI MAYEK LETTER SHA */
+ ["\uAAEA", "\uAAEA"], /* MEETEI MAYEK LETTER SSA */
+ ["\uAAEB", "\uAAEB"], /* MEETEI MAYEK VOWEL SIGN II */
+ ["\uAAEC", "\uAAEC"], /* MEETEI MAYEK VOWEL SIGN UU */
+ ["\uAAED", "\uAAED"], /* MEETEI MAYEK VOWEL SIGN AAI */
+ ["\uAAEE", "\uAAEE"], /* MEETEI MAYEK VOWEL SIGN AU */
+ ["\uAAEF", "\uAAEF"], /* MEETEI MAYEK VOWEL SIGN AAU */
+ ["\uAAF0", "\uAAF0"], /* MEETEI MAYEK CHEIKHAN */
+ ["\uAAF1", "\uAAF1"], /* MEETEI MAYEK AHANG KHUDAM */
+ ["\uAAF2", "\uAAF2"], /* MEETEI MAYEK ANJI */
+ ["\uAAF3", "\uAAF3"], /* MEETEI MAYEK SYLLABLE REPETITION MARK */
+ ["\uAAF4", "\uAAF4"], /* MEETEI MAYEK WORD REPETITION MARK */
+ ["\uAAF5", "\uAAF5"], /* MEETEI MAYEK VOWEL SIGN VISARGA */
+ ["\uAAF6", "\uAAF6"], /* MEETEI MAYEK VIRAMA */
+ ["\uAAF7", "\uAAF7"],
+ ["\uAAF8", "\uAAF8"],
+ ["\uAAF9", "\uAAF9"],
+ ["\uAAFA", "\uAAFA"],
+ ["\uAAFB", "\uAAFB"],
+ ["\uAAFC", "\uAAFC"],
+ ["\uAAFD", "\uAAFD"],
+ ["\uAAFE", "\uAAFE"],
+ ["\uAAFF", "\uAAFF"],
+ ["\uAB00", "\uAB00"],
+ ["\uAB01", "\uAB01"], /* ETHIOPIC SYLLABLE TTHU */
+ ["\uAB02", "\uAB02"], /* ETHIOPIC SYLLABLE TTHI */
+ ["\uAB03", "\uAB03"], /* ETHIOPIC SYLLABLE TTHAA */
+ ["\uAB04", "\uAB04"], /* ETHIOPIC SYLLABLE TTHEE */
+ ["\uAB05", "\uAB05"], /* ETHIOPIC SYLLABLE TTHE */
+ ["\uAB06", "\uAB06"], /* ETHIOPIC SYLLABLE TTHO */
+ ["\uAB07", "\uAB07"],
+ ["\uAB08", "\uAB08"],
+ ["\uAB09", "\uAB09"], /* ETHIOPIC SYLLABLE DDHU */
+ ["\uAB0A", "\uAB0A"], /* ETHIOPIC SYLLABLE DDHI */
+ ["\uAB0B", "\uAB0B"], /* ETHIOPIC SYLLABLE DDHAA */
+ ["\uAB0C", "\uAB0C"], /* ETHIOPIC SYLLABLE DDHEE */
+ ["\uAB0D", "\uAB0D"], /* ETHIOPIC SYLLABLE DDHE */
+ ["\uAB0E", "\uAB0E"], /* ETHIOPIC SYLLABLE DDHO */
+ ["\uAB0F", "\uAB0F"],
+ ["\uAB10", "\uAB10"],
+ ["\uAB11", "\uAB11"], /* ETHIOPIC SYLLABLE DZU */
+ ["\uAB12", "\uAB12"], /* ETHIOPIC SYLLABLE DZI */
+ ["\uAB13", "\uAB13"], /* ETHIOPIC SYLLABLE DZAA */
+ ["\uAB14", "\uAB14"], /* ETHIOPIC SYLLABLE DZEE */
+ ["\uAB15", "\uAB15"], /* ETHIOPIC SYLLABLE DZE */
+ ["\uAB16", "\uAB16"], /* ETHIOPIC SYLLABLE DZO */
+ ["\uAB17", "\uAB17"],
+ ["\uAB18", "\uAB18"],
+ ["\uAB19", "\uAB19"],
+ ["\uAB1A", "\uAB1A"],
+ ["\uAB1B", "\uAB1B"],
+ ["\uAB1C", "\uAB1C"],
+ ["\uAB1D", "\uAB1D"],
+ ["\uAB1E", "\uAB1E"],
+ ["\uAB1F", "\uAB1F"],
+ ["\uAB20", "\uAB20"], /* ETHIOPIC SYLLABLE CCHHA */
+ ["\uAB21", "\uAB21"], /* ETHIOPIC SYLLABLE CCHHU */
+ ["\uAB22", "\uAB22"], /* ETHIOPIC SYLLABLE CCHHI */
+ ["\uAB23", "\uAB23"], /* ETHIOPIC SYLLABLE CCHHAA */
+ ["\uAB24", "\uAB24"], /* ETHIOPIC SYLLABLE CCHHEE */
+ ["\uAB25", "\uAB25"], /* ETHIOPIC SYLLABLE CCHHE */
+ ["\uAB26", "\uAB26"], /* ETHIOPIC SYLLABLE CCHHO */
+ ["\uAB27", "\uAB27"],
+ ["\uAB28", "\uAB28"], /* ETHIOPIC SYLLABLE BBA */
+ ["\uAB29", "\uAB29"], /* ETHIOPIC SYLLABLE BBU */
+ ["\uAB2A", "\uAB2A"], /* ETHIOPIC SYLLABLE BBI */
+ ["\uAB2B", "\uAB2B"], /* ETHIOPIC SYLLABLE BBAA */
+ ["\uAB2C", "\uAB2C"], /* ETHIOPIC SYLLABLE BBEE */
+ ["\uAB2D", "\uAB2D"], /* ETHIOPIC SYLLABLE BBE */
+ ["\uAB2E", "\uAB2E"], /* ETHIOPIC SYLLABLE BBO */
+ ["\uAB2F", "\uAB2F"],
+ ["\uAB30", "\uAB30"], /* LATIN SMALL LETTER BARRED ALPHA */
+ ["\uAB31", "\uAB31"], /* LATIN SMALL LETTER A REVERSED-SCHWA */
+ ["\uAB32", "\uAB32"], /* LATIN SMALL LETTER BLACKLETTER E */
+ ["\uAB33", "\uAB33"], /* LATIN SMALL LETTER BARRED E */
+ ["\uAB34", "\uAB34"], /* LATIN SMALL LETTER E WITH FLOURISH */
+ ["\uAB35", "\uAB35"], /* LATIN SMALL LETTER LENIS F */
+ ["\uAB36", "\uAB36"], /* LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL */
+ ["\uAB37", "\uAB37"], /* LATIN SMALL LETTER L WITH INVERTED LAZY S */
+ ["\uAB38", "\uAB38"], /* LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */
+ ["\uAB39", "\uAB39"], /* LATIN SMALL LETTER L WITH MIDDLE RING */
+ ["\uAB3A", "\uAB3A"], /* LATIN SMALL LETTER M WITH CROSSED-TAIL */
+ ["\uAB3B", "\uAB3B"], /* LATIN SMALL LETTER N WITH CROSSED-TAIL */
+ ["\uAB3C", "\uAB3C"], /* LATIN SMALL LETTER ENG WITH CROSSED-TAIL */
+ ["\uAB3D", "\uAB3D"], /* LATIN SMALL LETTER BLACKLETTER O */
+ ["\uAB3E", "\uAB3E"], /* LATIN SMALL LETTER BLACKLETTER O WITH STROKE */
+ ["\uAB3F", "\uAB3F"], /* LATIN SMALL LETTER OPEN O WITH STROKE */
+ ["\uAB40", "\uAB40"], /* LATIN SMALL LETTER INVERTED OE */
+ ["\uAB41", "\uAB41"], /* LATIN SMALL LETTER TURNED OE WITH STROKE */
+ ["\uAB42", "\uAB42"], /* LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE */
+ ["\uAB43", "\uAB43"], /* LATIN SMALL LETTER TURNED O OPEN-O */
+ ["\uAB44", "\uAB44"], /* LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE */
+ ["\uAB45", "\uAB45"], /* LATIN SMALL LETTER STIRRUP R */
+ ["\uAB46", "\uAB46"], /* LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG */
+ ["\uAB47", "\uAB47"], /* LATIN SMALL LETTER R WITHOUT HANDLE */
+ ["\uAB48", "\uAB48"], /* LATIN SMALL LETTER DOUBLE R */
+ ["\uAB49", "\uAB49"], /* LATIN SMALL LETTER R WITH CROSSED-TAIL */
+ ["\uAB4A", "\uAB4A"], /* LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL */
+ ["\uAB4B", "\uAB4B"], /* LATIN SMALL LETTER SCRIPT R */
+ ["\uAB4C", "\uAB4C"], /* LATIN SMALL LETTER SCRIPT R WITH RING */
+ ["\uAB4D", "\uAB4D"], /* LATIN SMALL LETTER BASELINE ESH */
+ ["\uAB4E", "\uAB4E"], /* LATIN SMALL LETTER U WITH SHORT RIGHT LEG */
+ ["\uAB4F", "\uAB4F"], /* LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG */
+ ["\uAB50", "\uAB50"], /* LATIN SMALL LETTER UI */
+ ["\uAB51", "\uAB51"], /* LATIN SMALL LETTER TURNED UI */
+ ["\uAB52", "\uAB52"], /* LATIN SMALL LETTER U WITH LEFT HOOK */
+ ["\uA7B3", "\uAB53"], /* LATIN SMALL LETTER CHI */
+ ["\uAB54", "\uAB54"], /* LATIN SMALL LETTER CHI WITH LOW RIGHT RING */
+ ["\uAB55", "\uAB55"], /* LATIN SMALL LETTER CHI WITH LOW LEFT SERIF */
+ ["\uAB56", "\uAB56"], /* LATIN SMALL LETTER X WITH LOW RIGHT RING */
+ ["\uAB57", "\uAB57"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG */
+ ["\uAB58", "\uAB58"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING */
+ ["\uAB59", "\uAB59"], /* LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF */
+ ["\uAB5A", "\uAB5A"], /* LATIN SMALL LETTER Y WITH SHORT RIGHT LEG */
+ ["\uAB5B", "\uAB5B"], /* MODIFIER BREVE WITH INVERTED BREVE */
+ ["\uAB5C", "\uAB5C"], /* MODIFIER LETTER SMALL HENG */
+ ["\uAB5D", "\uAB5D"], /* MODIFIER LETTER SMALL L WITH INVERTED LAZY S */
+ ["\uAB5E", "\uAB5E"], /* MODIFIER LETTER SMALL L WITH MIDDLE TILDE */
+ ["\uAB5F", "\uAB5F"], /* MODIFIER LETTER SMALL U WITH LEFT HOOK */
+ ["\uAB60", "\uAB60"], /* LATIN SMALL LETTER SAKHA YAT */
+ ["\uAB61", "\uAB61"], /* LATIN SMALL LETTER IOTIFIED E */
+ ["\uAB62", "\uAB62"], /* LATIN SMALL LETTER OPEN OE */
+ ["\uAB63", "\uAB63"], /* LATIN SMALL LETTER UO */
+ ["\uAB64", "\uAB64"], /* LATIN SMALL LETTER INVERTED ALPHA */
+ ["\uAB65", "\uAB65"], /* GREEK LETTER SMALL CAPITAL OMEGA */
+ ["\uAB66", "\uAB66"],
+ ["\uAB67", "\uAB67"],
+ ["\uAB68", "\uAB68"],
+ ["\uAB69", "\uAB69"],
+ ["\uAB6A", "\uAB6A"],
+ ["\uAB6B", "\uAB6B"],
+ ["\uAB6C", "\uAB6C"],
+ ["\uAB6D", "\uAB6D"],
+ ["\uAB6E", "\uAB6E"],
+ ["\uAB6F", "\uAB6F"],
+ ["\u13A0", "\uAB70"], /* CHEROKEE SMALL LETTER A */
+ ["\u13A1", "\uAB71"], /* CHEROKEE SMALL LETTER E */
+ ["\u13A2", "\uAB72"], /* CHEROKEE SMALL LETTER I */
+ ["\u13A3", "\uAB73"], /* CHEROKEE SMALL LETTER O */
+ ["\u13A4", "\uAB74"], /* CHEROKEE SMALL LETTER U */
+ ["\u13A5", "\uAB75"], /* CHEROKEE SMALL LETTER V */
+ ["\u13A6", "\uAB76"], /* CHEROKEE SMALL LETTER GA */
+ ["\u13A7", "\uAB77"], /* CHEROKEE SMALL LETTER KA */
+ ["\u13A8", "\uAB78"], /* CHEROKEE SMALL LETTER GE */
+ ["\u13A9", "\uAB79"], /* CHEROKEE SMALL LETTER GI */
+ ["\u13AA", "\uAB7A"], /* CHEROKEE SMALL LETTER GO */
+ ["\u13AB", "\uAB7B"], /* CHEROKEE SMALL LETTER GU */
+ ["\u13AC", "\uAB7C"], /* CHEROKEE SMALL LETTER GV */
+ ["\u13AD", "\uAB7D"], /* CHEROKEE SMALL LETTER HA */
+ ["\u13AE", "\uAB7E"], /* CHEROKEE SMALL LETTER HE */
+ ["\u13AF", "\uAB7F"], /* CHEROKEE SMALL LETTER HI */
+ ["\u13B0", "\uAB80"], /* CHEROKEE SMALL LETTER HO */
+ ["\u13B1", "\uAB81"], /* CHEROKEE SMALL LETTER HU */
+ ["\u13B2", "\uAB82"], /* CHEROKEE SMALL LETTER HV */
+ ["\u13B3", "\uAB83"], /* CHEROKEE SMALL LETTER LA */
+ ["\u13B4", "\uAB84"], /* CHEROKEE SMALL LETTER LE */
+ ["\u13B5", "\uAB85"], /* CHEROKEE SMALL LETTER LI */
+ ["\u13B6", "\uAB86"], /* CHEROKEE SMALL LETTER LO */
+ ["\u13B7", "\uAB87"], /* CHEROKEE SMALL LETTER LU */
+ ["\u13B8", "\uAB88"], /* CHEROKEE SMALL LETTER LV */
+ ["\u13B9", "\uAB89"], /* CHEROKEE SMALL LETTER MA */
+ ["\u13BA", "\uAB8A"], /* CHEROKEE SMALL LETTER ME */
+ ["\u13BB", "\uAB8B"], /* CHEROKEE SMALL LETTER MI */
+ ["\u13BC", "\uAB8C"], /* CHEROKEE SMALL LETTER MO */
+ ["\u13BD", "\uAB8D"], /* CHEROKEE SMALL LETTER MU */
+ ["\u13BE", "\uAB8E"], /* CHEROKEE SMALL LETTER NA */
+ ["\u13BF", "\uAB8F"], /* CHEROKEE SMALL LETTER HNA */
+ ["\u13C0", "\uAB90"], /* CHEROKEE SMALL LETTER NAH */
+ ["\u13C1", "\uAB91"], /* CHEROKEE SMALL LETTER NE */
+ ["\u13C2", "\uAB92"], /* CHEROKEE SMALL LETTER NI */
+ ["\u13C3", "\uAB93"], /* CHEROKEE SMALL LETTER NO */
+ ["\u13C4", "\uAB94"], /* CHEROKEE SMALL LETTER NU */
+ ["\u13C5", "\uAB95"], /* CHEROKEE SMALL LETTER NV */
+ ["\u13C6", "\uAB96"], /* CHEROKEE SMALL LETTER QUA */
+ ["\u13C7", "\uAB97"], /* CHEROKEE SMALL LETTER QUE */
+ ["\u13C8", "\uAB98"], /* CHEROKEE SMALL LETTER QUI */
+ ["\u13C9", "\uAB99"], /* CHEROKEE SMALL LETTER QUO */
+ ["\u13CA", "\uAB9A"], /* CHEROKEE SMALL LETTER QUU */
+ ["\u13CB", "\uAB9B"], /* CHEROKEE SMALL LETTER QUV */
+ ["\u13CC", "\uAB9C"], /* CHEROKEE SMALL LETTER SA */
+ ["\u13CD", "\uAB9D"], /* CHEROKEE SMALL LETTER S */
+ ["\u13CE", "\uAB9E"], /* CHEROKEE SMALL LETTER SE */
+ ["\u13CF", "\uAB9F"], /* CHEROKEE SMALL LETTER SI */
+ ["\u13D0", "\uABA0"], /* CHEROKEE SMALL LETTER SO */
+ ["\u13D1", "\uABA1"], /* CHEROKEE SMALL LETTER SU */
+ ["\u13D2", "\uABA2"], /* CHEROKEE SMALL LETTER SV */
+ ["\u13D3", "\uABA3"], /* CHEROKEE SMALL LETTER DA */
+ ["\u13D4", "\uABA4"], /* CHEROKEE SMALL LETTER TA */
+ ["\u13D5", "\uABA5"], /* CHEROKEE SMALL LETTER DE */
+ ["\u13D6", "\uABA6"], /* CHEROKEE SMALL LETTER TE */
+ ["\u13D7", "\uABA7"], /* CHEROKEE SMALL LETTER DI */
+ ["\u13D8", "\uABA8"], /* CHEROKEE SMALL LETTER TI */
+ ["\u13D9", "\uABA9"], /* CHEROKEE SMALL LETTER DO */
+ ["\u13DA", "\uABAA"], /* CHEROKEE SMALL LETTER DU */
+ ["\u13DB", "\uABAB"], /* CHEROKEE SMALL LETTER DV */
+ ["\u13DC", "\uABAC"], /* CHEROKEE SMALL LETTER DLA */
+ ["\u13DD", "\uABAD"], /* CHEROKEE SMALL LETTER TLA */
+ ["\u13DE", "\uABAE"], /* CHEROKEE SMALL LETTER TLE */
+ ["\u13DF", "\uABAF"], /* CHEROKEE SMALL LETTER TLI */
+ ["\u13E0", "\uABB0"], /* CHEROKEE SMALL LETTER TLO */
+ ["\u13E1", "\uABB1"], /* CHEROKEE SMALL LETTER TLU */
+ ["\u13E2", "\uABB2"], /* CHEROKEE SMALL LETTER TLV */
+ ["\u13E3", "\uABB3"], /* CHEROKEE SMALL LETTER TSA */
+ ["\u13E4", "\uABB4"], /* CHEROKEE SMALL LETTER TSE */
+ ["\u13E5", "\uABB5"], /* CHEROKEE SMALL LETTER TSI */
+ ["\u13E6", "\uABB6"], /* CHEROKEE SMALL LETTER TSO */
+ ["\u13E7", "\uABB7"], /* CHEROKEE SMALL LETTER TSU */
+ ["\u13E8", "\uABB8"], /* CHEROKEE SMALL LETTER TSV */
+ ["\u13E9", "\uABB9"], /* CHEROKEE SMALL LETTER WA */
+ ["\u13EA", "\uABBA"], /* CHEROKEE SMALL LETTER WE */
+ ["\u13EB", "\uABBB"], /* CHEROKEE SMALL LETTER WI */
+ ["\u13EC", "\uABBC"], /* CHEROKEE SMALL LETTER WO */
+ ["\u13ED", "\uABBD"], /* CHEROKEE SMALL LETTER WU */
+ ["\u13EE", "\uABBE"], /* CHEROKEE SMALL LETTER WV */
+ ["\u13EF", "\uABBF"], /* CHEROKEE SMALL LETTER YA */
+ ["\uABC0", "\uABC0"], /* MEETEI MAYEK LETTER KOK */
+ ["\uABC1", "\uABC1"], /* MEETEI MAYEK LETTER SAM */
+ ["\uABC2", "\uABC2"], /* MEETEI MAYEK LETTER LAI */
+ ["\uABC3", "\uABC3"], /* MEETEI MAYEK LETTER MIT */
+ ["\uABC4", "\uABC4"], /* MEETEI MAYEK LETTER PA */
+ ["\uABC5", "\uABC5"], /* MEETEI MAYEK LETTER NA */
+ ["\uABC6", "\uABC6"], /* MEETEI MAYEK LETTER CHIL */
+ ["\uABC7", "\uABC7"], /* MEETEI MAYEK LETTER TIL */
+ ["\uABC8", "\uABC8"], /* MEETEI MAYEK LETTER KHOU */
+ ["\uABC9", "\uABC9"], /* MEETEI MAYEK LETTER NGOU */
+ ["\uABCA", "\uABCA"], /* MEETEI MAYEK LETTER THOU */
+ ["\uABCB", "\uABCB"], /* MEETEI MAYEK LETTER WAI */
+ ["\uABCC", "\uABCC"], /* MEETEI MAYEK LETTER YANG */
+ ["\uABCD", "\uABCD"], /* MEETEI MAYEK LETTER HUK */
+ ["\uABCE", "\uABCE"], /* MEETEI MAYEK LETTER UN */
+ ["\uABCF", "\uABCF"], /* MEETEI MAYEK LETTER I */
+ ["\uABD0", "\uABD0"], /* MEETEI MAYEK LETTER PHAM */
+ ["\uABD1", "\uABD1"], /* MEETEI MAYEK LETTER ATIYA */
+ ["\uABD2", "\uABD2"], /* MEETEI MAYEK LETTER GOK */
+ ["\uABD3", "\uABD3"], /* MEETEI MAYEK LETTER JHAM */
+ ["\uABD4", "\uABD4"], /* MEETEI MAYEK LETTER RAI */
+ ["\uABD5", "\uABD5"], /* MEETEI MAYEK LETTER BA */
+ ["\uABD6", "\uABD6"], /* MEETEI MAYEK LETTER JIL */
+ ["\uABD7", "\uABD7"], /* MEETEI MAYEK LETTER DIL */
+ ["\uABD8", "\uABD8"], /* MEETEI MAYEK LETTER GHOU */
+ ["\uABD9", "\uABD9"], /* MEETEI MAYEK LETTER DHOU */
+ ["\uABDA", "\uABDA"], /* MEETEI MAYEK LETTER BHAM */
+ ["\uABDB", "\uABDB"], /* MEETEI MAYEK LETTER KOK LONSUM */
+ ["\uABDC", "\uABDC"], /* MEETEI MAYEK LETTER LAI LONSUM */
+ ["\uABDD", "\uABDD"], /* MEETEI MAYEK LETTER MIT LONSUM */
+ ["\uABDE", "\uABDE"], /* MEETEI MAYEK LETTER PA LONSUM */
+ ["\uABDF", "\uABDF"], /* MEETEI MAYEK LETTER NA LONSUM */
+ ["\uABE0", "\uABE0"], /* MEETEI MAYEK LETTER TIL LONSUM */
+ ["\uABE1", "\uABE1"], /* MEETEI MAYEK LETTER NGOU LONSUM */
+ ["\uABE2", "\uABE2"], /* MEETEI MAYEK LETTER I LONSUM */
+ ["\uABE3", "\uABE3"], /* MEETEI MAYEK VOWEL SIGN ONAP */
+ ["\uABE4", "\uABE4"], /* MEETEI MAYEK VOWEL SIGN INAP */
+ ["\uABE5", "\uABE5"], /* MEETEI MAYEK VOWEL SIGN ANAP */
+ ["\uABE6", "\uABE6"], /* MEETEI MAYEK VOWEL SIGN YENAP */
+ ["\uABE7", "\uABE7"], /* MEETEI MAYEK VOWEL SIGN SOUNAP */
+ ["\uABE8", "\uABE8"], /* MEETEI MAYEK VOWEL SIGN UNAP */
+ ["\uABE9", "\uABE9"], /* MEETEI MAYEK VOWEL SIGN CHEINAP */
+ ["\uABEA", "\uABEA"], /* MEETEI MAYEK VOWEL SIGN NUNG */
+ ["\uABEB", "\uABEB"], /* MEETEI MAYEK CHEIKHEI */
+ ["\uABEC", "\uABEC"], /* MEETEI MAYEK LUM IYEK */
+ ["\uABED", "\uABED"], /* MEETEI MAYEK APUN IYEK */
+ ["\uABEE", "\uABEE"],
+ ["\uABEF", "\uABEF"],
+ ["\uABF0", "\uABF0"], /* MEETEI MAYEK DIGIT ZERO */
+ ["\uABF1", "\uABF1"], /* MEETEI MAYEK DIGIT ONE */
+ ["\uABF2", "\uABF2"], /* MEETEI MAYEK DIGIT TWO */
+ ["\uABF3", "\uABF3"], /* MEETEI MAYEK DIGIT THREE */
+ ["\uABF4", "\uABF4"], /* MEETEI MAYEK DIGIT FOUR */
+ ["\uABF5", "\uABF5"], /* MEETEI MAYEK DIGIT FIVE */
+ ["\uABF6", "\uABF6"], /* MEETEI MAYEK DIGIT SIX */
+ ["\uABF7", "\uABF7"], /* MEETEI MAYEK DIGIT SEVEN */
+ ["\uABF8", "\uABF8"], /* MEETEI MAYEK DIGIT EIGHT */
+ ["\uABF9", "\uABF9"], /* MEETEI MAYEK DIGIT NINE */
+ ["\uABFA", "\uABFA"],
+ ["\uABFB", "\uABFB"],
+ ["\uABFC", "\uABFC"],
+ ["\uABFD", "\uABFD"],
+ ["\uABFE", "\uABFE"],
+ ["\uABFF", "\uABFF"],
+ ["\uAC00", "\uAC00"], /* Hangul Syllable */
+ ["\uAC01", "\uAC01"], /* Hangul Syllable */
+ ["\uAC02", "\uAC02"], /* Hangul Syllable */
+ ["\uAC03", "\uAC03"], /* Hangul Syllable */
+ ["\uAC04", "\uAC04"], /* Hangul Syllable */
+ ["\uAC05", "\uAC05"], /* Hangul Syllable */
+ ["\uAC06", "\uAC06"], /* Hangul Syllable */
+ ["\uAC07", "\uAC07"], /* Hangul Syllable */
+ ["\uAC08", "\uAC08"], /* Hangul Syllable */
+ ["\uAC09", "\uAC09"], /* Hangul Syllable */
+ ["\uAC0A", "\uAC0A"], /* Hangul Syllable */
+ ["\uAC0B", "\uAC0B"], /* Hangul Syllable */
+ ["\uAC0C", "\uAC0C"], /* Hangul Syllable */
+ ["\uAC0D", "\uAC0D"], /* Hangul Syllable */
+ ["\uAC0E", "\uAC0E"], /* Hangul Syllable */
+ ["\uAC0F", "\uAC0F"], /* Hangul Syllable */
+ ["\uAC10", "\uAC10"], /* Hangul Syllable */
+ ["\uAC11", "\uAC11"], /* Hangul Syllable */
+ ["\uAC12", "\uAC12"], /* Hangul Syllable */
+ ["\uAC13", "\uAC13"], /* Hangul Syllable */
+ ["\uAC14", "\uAC14"], /* Hangul Syllable */
+ ["\uAC15", "\uAC15"], /* Hangul Syllable */
+ ["\uAC16", "\uAC16"], /* Hangul Syllable */
+ ["\uAC17", "\uAC17"], /* Hangul Syllable */
+ ["\uAC18", "\uAC18"], /* Hangul Syllable */
+ ["\uAC19", "\uAC19"], /* Hangul Syllable */
+ ["\uAC1A", "\uAC1A"], /* Hangul Syllable */
+ ["\uAC1B", "\uAC1B"], /* Hangul Syllable */
+ ["\uAC1C", "\uAC1C"], /* Hangul Syllable */
+ ["\uAC1D", "\uAC1D"], /* Hangul Syllable */
+ ["\uAC1E", "\uAC1E"], /* Hangul Syllable */
+ ["\uAC1F", "\uAC1F"], /* Hangul Syllable */
+ ["\uAC20", "\uAC20"], /* Hangul Syllable */
+ ["\uAC21", "\uAC21"], /* Hangul Syllable */
+ ["\uAC22", "\uAC22"], /* Hangul Syllable */
+ ["\uAC23", "\uAC23"], /* Hangul Syllable */
+ ["\uAC24", "\uAC24"], /* Hangul Syllable */
+ ["\uAC25", "\uAC25"], /* Hangul Syllable */
+ ["\uAC26", "\uAC26"], /* Hangul Syllable */
+ ["\uAC27", "\uAC27"], /* Hangul Syllable */
+ ["\uAC28", "\uAC28"], /* Hangul Syllable */
+ ["\uAC29", "\uAC29"], /* Hangul Syllable */
+ ["\uAC2A", "\uAC2A"], /* Hangul Syllable */
+ ["\uAC2B", "\uAC2B"], /* Hangul Syllable */
+ ["\uAC2C", "\uAC2C"], /* Hangul Syllable */
+ ["\uAC2D", "\uAC2D"], /* Hangul Syllable */
+ ["\uAC2E", "\uAC2E"], /* Hangul Syllable */
+ ["\uAC2F", "\uAC2F"], /* Hangul Syllable */
+ ["\uAC30", "\uAC30"], /* Hangul Syllable */
+ ["\uAC31", "\uAC31"], /* Hangul Syllable */
+ ["\uAC32", "\uAC32"], /* Hangul Syllable */
+ ["\uAC33", "\uAC33"], /* Hangul Syllable */
+ ["\uAC34", "\uAC34"], /* Hangul Syllable */
+ ["\uAC35", "\uAC35"], /* Hangul Syllable */
+ ["\uAC36", "\uAC36"], /* Hangul Syllable */
+ ["\uAC37", "\uAC37"], /* Hangul Syllable */
+ ["\uAC38", "\uAC38"], /* Hangul Syllable */
+ ["\uAC39", "\uAC39"], /* Hangul Syllable */
+ ["\uAC3A", "\uAC3A"], /* Hangul Syllable */
+ ["\uAC3B", "\uAC3B"], /* Hangul Syllable */
+ ["\uAC3C", "\uAC3C"], /* Hangul Syllable */
+ ["\uAC3D", "\uAC3D"], /* Hangul Syllable */
+ ["\uAC3E", "\uAC3E"], /* Hangul Syllable */
+ ["\uAC3F", "\uAC3F"], /* Hangul Syllable */
+ ["\uAC40", "\uAC40"], /* Hangul Syllable */
+ ["\uAC41", "\uAC41"], /* Hangul Syllable */
+ ["\uAC42", "\uAC42"], /* Hangul Syllable */
+ ["\uAC43", "\uAC43"], /* Hangul Syllable */
+ ["\uAC44", "\uAC44"], /* Hangul Syllable */
+ ["\uAC45", "\uAC45"], /* Hangul Syllable */
+ ["\uAC46", "\uAC46"], /* Hangul Syllable */
+ ["\uAC47", "\uAC47"], /* Hangul Syllable */
+ ["\uAC48", "\uAC48"], /* Hangul Syllable */
+ ["\uAC49", "\uAC49"], /* Hangul Syllable */
+ ["\uAC4A", "\uAC4A"], /* Hangul Syllable */
+ ["\uAC4B", "\uAC4B"], /* Hangul Syllable */
+ ["\uAC4C", "\uAC4C"], /* Hangul Syllable */
+ ["\uAC4D", "\uAC4D"], /* Hangul Syllable */
+ ["\uAC4E", "\uAC4E"], /* Hangul Syllable */
+ ["\uAC4F", "\uAC4F"], /* Hangul Syllable */
+ ["\uAC50", "\uAC50"], /* Hangul Syllable */
+ ["\uAC51", "\uAC51"], /* Hangul Syllable */
+ ["\uAC52", "\uAC52"], /* Hangul Syllable */
+ ["\uAC53", "\uAC53"], /* Hangul Syllable */
+ ["\uAC54", "\uAC54"], /* Hangul Syllable */
+ ["\uAC55", "\uAC55"], /* Hangul Syllable */
+ ["\uAC56", "\uAC56"], /* Hangul Syllable */
+ ["\uAC57", "\uAC57"], /* Hangul Syllable */
+ ["\uAC58", "\uAC58"], /* Hangul Syllable */
+ ["\uAC59", "\uAC59"], /* Hangul Syllable */
+ ["\uAC5A", "\uAC5A"], /* Hangul Syllable */
+ ["\uAC5B", "\uAC5B"], /* Hangul Syllable */
+ ["\uAC5C", "\uAC5C"], /* Hangul Syllable */
+ ["\uAC5D", "\uAC5D"], /* Hangul Syllable */
+ ["\uAC5E", "\uAC5E"], /* Hangul Syllable */
+ ["\uAC5F", "\uAC5F"], /* Hangul Syllable */
+ ["\uAC60", "\uAC60"], /* Hangul Syllable */
+ ["\uAC61", "\uAC61"], /* Hangul Syllable */
+ ["\uAC62", "\uAC62"], /* Hangul Syllable */
+ ["\uAC63", "\uAC63"], /* Hangul Syllable */
+ ["\uAC64", "\uAC64"], /* Hangul Syllable */
+ ["\uAC65", "\uAC65"], /* Hangul Syllable */
+ ["\uAC66", "\uAC66"], /* Hangul Syllable */
+ ["\uAC67", "\uAC67"], /* Hangul Syllable */
+ ["\uAC68", "\uAC68"], /* Hangul Syllable */
+ ["\uAC69", "\uAC69"], /* Hangul Syllable */
+ ["\uAC6A", "\uAC6A"], /* Hangul Syllable */
+ ["\uAC6B", "\uAC6B"], /* Hangul Syllable */
+ ["\uAC6C", "\uAC6C"], /* Hangul Syllable */
+ ["\uAC6D", "\uAC6D"], /* Hangul Syllable */
+ ["\uAC6E", "\uAC6E"], /* Hangul Syllable */
+ ["\uAC6F", "\uAC6F"], /* Hangul Syllable */
+ ["\uAC70", "\uAC70"], /* Hangul Syllable */
+ ["\uAC71", "\uAC71"], /* Hangul Syllable */
+ ["\uAC72", "\uAC72"], /* Hangul Syllable */
+ ["\uAC73", "\uAC73"], /* Hangul Syllable */
+ ["\uAC74", "\uAC74"], /* Hangul Syllable */
+ ["\uAC75", "\uAC75"], /* Hangul Syllable */
+ ["\uAC76", "\uAC76"], /* Hangul Syllable */
+ ["\uAC77", "\uAC77"], /* Hangul Syllable */
+ ["\uAC78", "\uAC78"], /* Hangul Syllable */
+ ["\uAC79", "\uAC79"], /* Hangul Syllable */
+ ["\uAC7A", "\uAC7A"], /* Hangul Syllable */
+ ["\uAC7B", "\uAC7B"], /* Hangul Syllable */
+ ["\uAC7C", "\uAC7C"], /* Hangul Syllable */
+ ["\uAC7D", "\uAC7D"], /* Hangul Syllable */
+ ["\uAC7E", "\uAC7E"], /* Hangul Syllable */
+ ["\uAC7F", "\uAC7F"], /* Hangul Syllable */
+ ["\uAC80", "\uAC80"], /* Hangul Syllable */
+ ["\uAC81", "\uAC81"], /* Hangul Syllable */
+ ["\uAC82", "\uAC82"], /* Hangul Syllable */
+ ["\uAC83", "\uAC83"], /* Hangul Syllable */
+ ["\uAC84", "\uAC84"], /* Hangul Syllable */
+ ["\uAC85", "\uAC85"], /* Hangul Syllable */
+ ["\uAC86", "\uAC86"], /* Hangul Syllable */
+ ["\uAC87", "\uAC87"], /* Hangul Syllable */
+ ["\uAC88", "\uAC88"], /* Hangul Syllable */
+ ["\uAC89", "\uAC89"], /* Hangul Syllable */
+ ["\uAC8A", "\uAC8A"], /* Hangul Syllable */
+ ["\uAC8B", "\uAC8B"], /* Hangul Syllable */
+ ["\uAC8C", "\uAC8C"], /* Hangul Syllable */
+ ["\uAC8D", "\uAC8D"], /* Hangul Syllable */
+ ["\uAC8E", "\uAC8E"], /* Hangul Syllable */
+ ["\uAC8F", "\uAC8F"], /* Hangul Syllable */
+ ["\uAC90", "\uAC90"], /* Hangul Syllable */
+ ["\uAC91", "\uAC91"], /* Hangul Syllable */
+ ["\uAC92", "\uAC92"], /* Hangul Syllable */
+ ["\uAC93", "\uAC93"], /* Hangul Syllable */
+ ["\uAC94", "\uAC94"], /* Hangul Syllable */
+ ["\uAC95", "\uAC95"], /* Hangul Syllable */
+ ["\uAC96", "\uAC96"], /* Hangul Syllable */
+ ["\uAC97", "\uAC97"], /* Hangul Syllable */
+ ["\uAC98", "\uAC98"], /* Hangul Syllable */
+ ["\uAC99", "\uAC99"], /* Hangul Syllable */
+ ["\uAC9A", "\uAC9A"], /* Hangul Syllable */
+ ["\uAC9B", "\uAC9B"], /* Hangul Syllable */
+ ["\uAC9C", "\uAC9C"], /* Hangul Syllable */
+ ["\uAC9D", "\uAC9D"], /* Hangul Syllable */
+ ["\uAC9E", "\uAC9E"], /* Hangul Syllable */
+ ["\uAC9F", "\uAC9F"], /* Hangul Syllable */
+ ["\uACA0", "\uACA0"], /* Hangul Syllable */
+ ["\uACA1", "\uACA1"], /* Hangul Syllable */
+ ["\uACA2", "\uACA2"], /* Hangul Syllable */
+ ["\uACA3", "\uACA3"], /* Hangul Syllable */
+ ["\uACA4", "\uACA4"], /* Hangul Syllable */
+ ["\uACA5", "\uACA5"], /* Hangul Syllable */
+ ["\uACA6", "\uACA6"], /* Hangul Syllable */
+ ["\uACA7", "\uACA7"], /* Hangul Syllable */
+ ["\uACA8", "\uACA8"], /* Hangul Syllable */
+ ["\uACA9", "\uACA9"], /* Hangul Syllable */
+ ["\uACAA", "\uACAA"], /* Hangul Syllable */
+ ["\uACAB", "\uACAB"], /* Hangul Syllable */
+ ["\uACAC", "\uACAC"], /* Hangul Syllable */
+ ["\uACAD", "\uACAD"], /* Hangul Syllable */
+ ["\uACAE", "\uACAE"], /* Hangul Syllable */
+ ["\uACAF", "\uACAF"], /* Hangul Syllable */
+ ["\uACB0", "\uACB0"], /* Hangul Syllable */
+ ["\uACB1", "\uACB1"], /* Hangul Syllable */
+ ["\uACB2", "\uACB2"], /* Hangul Syllable */
+ ["\uACB3", "\uACB3"], /* Hangul Syllable */
+ ["\uACB4", "\uACB4"], /* Hangul Syllable */
+ ["\uACB5", "\uACB5"], /* Hangul Syllable */
+ ["\uACB6", "\uACB6"], /* Hangul Syllable */
+ ["\uACB7", "\uACB7"], /* Hangul Syllable */
+ ["\uACB8", "\uACB8"], /* Hangul Syllable */
+ ["\uACB9", "\uACB9"], /* Hangul Syllable */
+ ["\uACBA", "\uACBA"], /* Hangul Syllable */
+ ["\uACBB", "\uACBB"], /* Hangul Syllable */
+ ["\uACBC", "\uACBC"], /* Hangul Syllable */
+ ["\uACBD", "\uACBD"], /* Hangul Syllable */
+ ["\uACBE", "\uACBE"], /* Hangul Syllable */
+ ["\uACBF", "\uACBF"], /* Hangul Syllable */
+ ["\uACC0", "\uACC0"], /* Hangul Syllable */
+ ["\uACC1", "\uACC1"], /* Hangul Syllable */
+ ["\uACC2", "\uACC2"], /* Hangul Syllable */
+ ["\uACC3", "\uACC3"], /* Hangul Syllable */
+ ["\uACC4", "\uACC4"], /* Hangul Syllable */
+ ["\uACC5", "\uACC5"], /* Hangul Syllable */
+ ["\uACC6", "\uACC6"], /* Hangul Syllable */
+ ["\uACC7", "\uACC7"], /* Hangul Syllable */
+ ["\uACC8", "\uACC8"], /* Hangul Syllable */
+ ["\uACC9", "\uACC9"], /* Hangul Syllable */
+ ["\uACCA", "\uACCA"], /* Hangul Syllable */
+ ["\uACCB", "\uACCB"], /* Hangul Syllable */
+ ["\uACCC", "\uACCC"], /* Hangul Syllable */
+ ["\uACCD", "\uACCD"], /* Hangul Syllable */
+ ["\uACCE", "\uACCE"], /* Hangul Syllable */
+ ["\uACCF", "\uACCF"], /* Hangul Syllable */
+ ["\uACD0", "\uACD0"], /* Hangul Syllable */
+ ["\uACD1", "\uACD1"], /* Hangul Syllable */
+ ["\uACD2", "\uACD2"], /* Hangul Syllable */
+ ["\uACD3", "\uACD3"], /* Hangul Syllable */
+ ["\uACD4", "\uACD4"], /* Hangul Syllable */
+ ["\uACD5", "\uACD5"], /* Hangul Syllable */
+ ["\uACD6", "\uACD6"], /* Hangul Syllable */
+ ["\uACD7", "\uACD7"], /* Hangul Syllable */
+ ["\uACD8", "\uACD8"], /* Hangul Syllable */
+ ["\uACD9", "\uACD9"], /* Hangul Syllable */
+ ["\uACDA", "\uACDA"], /* Hangul Syllable */
+ ["\uACDB", "\uACDB"], /* Hangul Syllable */
+ ["\uACDC", "\uACDC"], /* Hangul Syllable */
+ ["\uACDD", "\uACDD"], /* Hangul Syllable */
+ ["\uACDE", "\uACDE"], /* Hangul Syllable */
+ ["\uACDF", "\uACDF"], /* Hangul Syllable */
+ ["\uACE0", "\uACE0"], /* Hangul Syllable */
+ ["\uACE1", "\uACE1"], /* Hangul Syllable */
+ ["\uACE2", "\uACE2"], /* Hangul Syllable */
+ ["\uACE3", "\uACE3"], /* Hangul Syllable */
+ ["\uACE4", "\uACE4"], /* Hangul Syllable */
+ ["\uACE5", "\uACE5"], /* Hangul Syllable */
+ ["\uACE6", "\uACE6"], /* Hangul Syllable */
+ ["\uACE7", "\uACE7"], /* Hangul Syllable */
+ ["\uACE8", "\uACE8"], /* Hangul Syllable */
+ ["\uACE9", "\uACE9"], /* Hangul Syllable */
+ ["\uACEA", "\uACEA"], /* Hangul Syllable */
+ ["\uACEB", "\uACEB"], /* Hangul Syllable */
+ ["\uACEC", "\uACEC"], /* Hangul Syllable */
+ ["\uACED", "\uACED"], /* Hangul Syllable */
+ ["\uACEE", "\uACEE"], /* Hangul Syllable */
+ ["\uACEF", "\uACEF"], /* Hangul Syllable */
+ ["\uACF0", "\uACF0"], /* Hangul Syllable */
+ ["\uACF1", "\uACF1"], /* Hangul Syllable */
+ ["\uACF2", "\uACF2"], /* Hangul Syllable */
+ ["\uACF3", "\uACF3"], /* Hangul Syllable */
+ ["\uACF4", "\uACF4"], /* Hangul Syllable */
+ ["\uACF5", "\uACF5"], /* Hangul Syllable */
+ ["\uACF6", "\uACF6"], /* Hangul Syllable */
+ ["\uACF7", "\uACF7"], /* Hangul Syllable */
+ ["\uACF8", "\uACF8"], /* Hangul Syllable */
+ ["\uACF9", "\uACF9"], /* Hangul Syllable */
+ ["\uACFA", "\uACFA"], /* Hangul Syllable */
+ ["\uACFB", "\uACFB"], /* Hangul Syllable */
+ ["\uACFC", "\uACFC"], /* Hangul Syllable */
+ ["\uACFD", "\uACFD"], /* Hangul Syllable */
+ ["\uACFE", "\uACFE"], /* Hangul Syllable */
+ ["\uACFF", "\uACFF"], /* Hangul Syllable */
+ ["\uAD00", "\uAD00"], /* Hangul Syllable */
+ ["\uAD01", "\uAD01"], /* Hangul Syllable */
+ ["\uAD02", "\uAD02"], /* Hangul Syllable */
+ ["\uAD03", "\uAD03"], /* Hangul Syllable */
+ ["\uAD04", "\uAD04"], /* Hangul Syllable */
+ ["\uAD05", "\uAD05"], /* Hangul Syllable */
+ ["\uAD06", "\uAD06"], /* Hangul Syllable */
+ ["\uAD07", "\uAD07"], /* Hangul Syllable */
+ ["\uAD08", "\uAD08"], /* Hangul Syllable */
+ ["\uAD09", "\uAD09"], /* Hangul Syllable */
+ ["\uAD0A", "\uAD0A"], /* Hangul Syllable */
+ ["\uAD0B", "\uAD0B"], /* Hangul Syllable */
+ ["\uAD0C", "\uAD0C"], /* Hangul Syllable */
+ ["\uAD0D", "\uAD0D"], /* Hangul Syllable */
+ ["\uAD0E", "\uAD0E"], /* Hangul Syllable */
+ ["\uAD0F", "\uAD0F"], /* Hangul Syllable */
+ ["\uAD10", "\uAD10"], /* Hangul Syllable */
+ ["\uAD11", "\uAD11"], /* Hangul Syllable */
+ ["\uAD12", "\uAD12"], /* Hangul Syllable */
+ ["\uAD13", "\uAD13"], /* Hangul Syllable */
+ ["\uAD14", "\uAD14"], /* Hangul Syllable */
+ ["\uAD15", "\uAD15"], /* Hangul Syllable */
+ ["\uAD16", "\uAD16"], /* Hangul Syllable */
+ ["\uAD17", "\uAD17"], /* Hangul Syllable */
+ ["\uAD18", "\uAD18"], /* Hangul Syllable */
+ ["\uAD19", "\uAD19"], /* Hangul Syllable */
+ ["\uAD1A", "\uAD1A"], /* Hangul Syllable */
+ ["\uAD1B", "\uAD1B"], /* Hangul Syllable */
+ ["\uAD1C", "\uAD1C"], /* Hangul Syllable */
+ ["\uAD1D", "\uAD1D"], /* Hangul Syllable */
+ ["\uAD1E", "\uAD1E"], /* Hangul Syllable */
+ ["\uAD1F", "\uAD1F"], /* Hangul Syllable */
+ ["\uAD20", "\uAD20"], /* Hangul Syllable */
+ ["\uAD21", "\uAD21"], /* Hangul Syllable */
+ ["\uAD22", "\uAD22"], /* Hangul Syllable */
+ ["\uAD23", "\uAD23"], /* Hangul Syllable */
+ ["\uAD24", "\uAD24"], /* Hangul Syllable */
+ ["\uAD25", "\uAD25"], /* Hangul Syllable */
+ ["\uAD26", "\uAD26"], /* Hangul Syllable */
+ ["\uAD27", "\uAD27"], /* Hangul Syllable */
+ ["\uAD28", "\uAD28"], /* Hangul Syllable */
+ ["\uAD29", "\uAD29"], /* Hangul Syllable */
+ ["\uAD2A", "\uAD2A"], /* Hangul Syllable */
+ ["\uAD2B", "\uAD2B"], /* Hangul Syllable */
+ ["\uAD2C", "\uAD2C"], /* Hangul Syllable */
+ ["\uAD2D", "\uAD2D"], /* Hangul Syllable */
+ ["\uAD2E", "\uAD2E"], /* Hangul Syllable */
+ ["\uAD2F", "\uAD2F"], /* Hangul Syllable */
+ ["\uAD30", "\uAD30"], /* Hangul Syllable */
+ ["\uAD31", "\uAD31"], /* Hangul Syllable */
+ ["\uAD32", "\uAD32"], /* Hangul Syllable */
+ ["\uAD33", "\uAD33"], /* Hangul Syllable */
+ ["\uAD34", "\uAD34"], /* Hangul Syllable */
+ ["\uAD35", "\uAD35"], /* Hangul Syllable */
+ ["\uAD36", "\uAD36"], /* Hangul Syllable */
+ ["\uAD37", "\uAD37"], /* Hangul Syllable */
+ ["\uAD38", "\uAD38"], /* Hangul Syllable */
+ ["\uAD39", "\uAD39"], /* Hangul Syllable */
+ ["\uAD3A", "\uAD3A"], /* Hangul Syllable */
+ ["\uAD3B", "\uAD3B"], /* Hangul Syllable */
+ ["\uAD3C", "\uAD3C"], /* Hangul Syllable */
+ ["\uAD3D", "\uAD3D"], /* Hangul Syllable */
+ ["\uAD3E", "\uAD3E"], /* Hangul Syllable */
+ ["\uAD3F", "\uAD3F"], /* Hangul Syllable */
+ ["\uAD40", "\uAD40"], /* Hangul Syllable */
+ ["\uAD41", "\uAD41"], /* Hangul Syllable */
+ ["\uAD42", "\uAD42"], /* Hangul Syllable */
+ ["\uAD43", "\uAD43"], /* Hangul Syllable */
+ ["\uAD44", "\uAD44"], /* Hangul Syllable */
+ ["\uAD45", "\uAD45"], /* Hangul Syllable */
+ ["\uAD46", "\uAD46"], /* Hangul Syllable */
+ ["\uAD47", "\uAD47"], /* Hangul Syllable */
+ ["\uAD48", "\uAD48"], /* Hangul Syllable */
+ ["\uAD49", "\uAD49"], /* Hangul Syllable */
+ ["\uAD4A", "\uAD4A"], /* Hangul Syllable */
+ ["\uAD4B", "\uAD4B"], /* Hangul Syllable */
+ ["\uAD4C", "\uAD4C"], /* Hangul Syllable */
+ ["\uAD4D", "\uAD4D"], /* Hangul Syllable */
+ ["\uAD4E", "\uAD4E"], /* Hangul Syllable */
+ ["\uAD4F", "\uAD4F"], /* Hangul Syllable */
+ ["\uAD50", "\uAD50"], /* Hangul Syllable */
+ ["\uAD51", "\uAD51"], /* Hangul Syllable */
+ ["\uAD52", "\uAD52"], /* Hangul Syllable */
+ ["\uAD53", "\uAD53"], /* Hangul Syllable */
+ ["\uAD54", "\uAD54"], /* Hangul Syllable */
+ ["\uAD55", "\uAD55"], /* Hangul Syllable */
+ ["\uAD56", "\uAD56"], /* Hangul Syllable */
+ ["\uAD57", "\uAD57"], /* Hangul Syllable */
+ ["\uAD58", "\uAD58"], /* Hangul Syllable */
+ ["\uAD59", "\uAD59"], /* Hangul Syllable */
+ ["\uAD5A", "\uAD5A"], /* Hangul Syllable */
+ ["\uAD5B", "\uAD5B"], /* Hangul Syllable */
+ ["\uAD5C", "\uAD5C"], /* Hangul Syllable */
+ ["\uAD5D", "\uAD5D"], /* Hangul Syllable */
+ ["\uAD5E", "\uAD5E"], /* Hangul Syllable */
+ ["\uAD5F", "\uAD5F"], /* Hangul Syllable */
+ ["\uAD60", "\uAD60"], /* Hangul Syllable */
+ ["\uAD61", "\uAD61"], /* Hangul Syllable */
+ ["\uAD62", "\uAD62"], /* Hangul Syllable */
+ ["\uAD63", "\uAD63"], /* Hangul Syllable */
+ ["\uAD64", "\uAD64"], /* Hangul Syllable */
+ ["\uAD65", "\uAD65"], /* Hangul Syllable */
+ ["\uAD66", "\uAD66"], /* Hangul Syllable */
+ ["\uAD67", "\uAD67"], /* Hangul Syllable */
+ ["\uAD68", "\uAD68"], /* Hangul Syllable */
+ ["\uAD69", "\uAD69"], /* Hangul Syllable */
+ ["\uAD6A", "\uAD6A"], /* Hangul Syllable */
+ ["\uAD6B", "\uAD6B"], /* Hangul Syllable */
+ ["\uAD6C", "\uAD6C"], /* Hangul Syllable */
+ ["\uAD6D", "\uAD6D"], /* Hangul Syllable */
+ ["\uAD6E", "\uAD6E"], /* Hangul Syllable */
+ ["\uAD6F", "\uAD6F"], /* Hangul Syllable */
+ ["\uAD70", "\uAD70"], /* Hangul Syllable */
+ ["\uAD71", "\uAD71"], /* Hangul Syllable */
+ ["\uAD72", "\uAD72"], /* Hangul Syllable */
+ ["\uAD73", "\uAD73"], /* Hangul Syllable */
+ ["\uAD74", "\uAD74"], /* Hangul Syllable */
+ ["\uAD75", "\uAD75"], /* Hangul Syllable */
+ ["\uAD76", "\uAD76"], /* Hangul Syllable */
+ ["\uAD77", "\uAD77"], /* Hangul Syllable */
+ ["\uAD78", "\uAD78"], /* Hangul Syllable */
+ ["\uAD79", "\uAD79"], /* Hangul Syllable */
+ ["\uAD7A", "\uAD7A"], /* Hangul Syllable */
+ ["\uAD7B", "\uAD7B"], /* Hangul Syllable */
+ ["\uAD7C", "\uAD7C"], /* Hangul Syllable */
+ ["\uAD7D", "\uAD7D"], /* Hangul Syllable */
+ ["\uAD7E", "\uAD7E"], /* Hangul Syllable */
+ ["\uAD7F", "\uAD7F"], /* Hangul Syllable */
+ ["\uAD80", "\uAD80"], /* Hangul Syllable */
+ ["\uAD81", "\uAD81"], /* Hangul Syllable */
+ ["\uAD82", "\uAD82"], /* Hangul Syllable */
+ ["\uAD83", "\uAD83"], /* Hangul Syllable */
+ ["\uAD84", "\uAD84"], /* Hangul Syllable */
+ ["\uAD85", "\uAD85"], /* Hangul Syllable */
+ ["\uAD86", "\uAD86"], /* Hangul Syllable */
+ ["\uAD87", "\uAD87"], /* Hangul Syllable */
+ ["\uAD88", "\uAD88"], /* Hangul Syllable */
+ ["\uAD89", "\uAD89"], /* Hangul Syllable */
+ ["\uAD8A", "\uAD8A"], /* Hangul Syllable */
+ ["\uAD8B", "\uAD8B"], /* Hangul Syllable */
+ ["\uAD8C", "\uAD8C"], /* Hangul Syllable */
+ ["\uAD8D", "\uAD8D"], /* Hangul Syllable */
+ ["\uAD8E", "\uAD8E"], /* Hangul Syllable */
+ ["\uAD8F", "\uAD8F"], /* Hangul Syllable */
+ ["\uAD90", "\uAD90"], /* Hangul Syllable */
+ ["\uAD91", "\uAD91"], /* Hangul Syllable */
+ ["\uAD92", "\uAD92"], /* Hangul Syllable */
+ ["\uAD93", "\uAD93"], /* Hangul Syllable */
+ ["\uAD94", "\uAD94"], /* Hangul Syllable */
+ ["\uAD95", "\uAD95"], /* Hangul Syllable */
+ ["\uAD96", "\uAD96"], /* Hangul Syllable */
+ ["\uAD97", "\uAD97"], /* Hangul Syllable */
+ ["\uAD98", "\uAD98"], /* Hangul Syllable */
+ ["\uAD99", "\uAD99"], /* Hangul Syllable */
+ ["\uAD9A", "\uAD9A"], /* Hangul Syllable */
+ ["\uAD9B", "\uAD9B"], /* Hangul Syllable */
+ ["\uAD9C", "\uAD9C"], /* Hangul Syllable */
+ ["\uAD9D", "\uAD9D"], /* Hangul Syllable */
+ ["\uAD9E", "\uAD9E"], /* Hangul Syllable */
+ ["\uAD9F", "\uAD9F"], /* Hangul Syllable */
+ ["\uADA0", "\uADA0"], /* Hangul Syllable */
+ ["\uADA1", "\uADA1"], /* Hangul Syllable */
+ ["\uADA2", "\uADA2"], /* Hangul Syllable */
+ ["\uADA3", "\uADA3"], /* Hangul Syllable */
+ ["\uADA4", "\uADA4"], /* Hangul Syllable */
+ ["\uADA5", "\uADA5"], /* Hangul Syllable */
+ ["\uADA6", "\uADA6"], /* Hangul Syllable */
+ ["\uADA7", "\uADA7"], /* Hangul Syllable */
+ ["\uADA8", "\uADA8"], /* Hangul Syllable */
+ ["\uADA9", "\uADA9"], /* Hangul Syllable */
+ ["\uADAA", "\uADAA"], /* Hangul Syllable */
+ ["\uADAB", "\uADAB"], /* Hangul Syllable */
+ ["\uADAC", "\uADAC"], /* Hangul Syllable */
+ ["\uADAD", "\uADAD"], /* Hangul Syllable */
+ ["\uADAE", "\uADAE"], /* Hangul Syllable */
+ ["\uADAF", "\uADAF"], /* Hangul Syllable */
+ ["\uADB0", "\uADB0"], /* Hangul Syllable */
+ ["\uADB1", "\uADB1"], /* Hangul Syllable */
+ ["\uADB2", "\uADB2"], /* Hangul Syllable */
+ ["\uADB3", "\uADB3"], /* Hangul Syllable */
+ ["\uADB4", "\uADB4"], /* Hangul Syllable */
+ ["\uADB5", "\uADB5"], /* Hangul Syllable */
+ ["\uADB6", "\uADB6"], /* Hangul Syllable */
+ ["\uADB7", "\uADB7"], /* Hangul Syllable */
+ ["\uADB8", "\uADB8"], /* Hangul Syllable */
+ ["\uADB9", "\uADB9"], /* Hangul Syllable */
+ ["\uADBA", "\uADBA"], /* Hangul Syllable */
+ ["\uADBB", "\uADBB"], /* Hangul Syllable */
+ ["\uADBC", "\uADBC"], /* Hangul Syllable */
+ ["\uADBD", "\uADBD"], /* Hangul Syllable */
+ ["\uADBE", "\uADBE"], /* Hangul Syllable */
+ ["\uADBF", "\uADBF"], /* Hangul Syllable */
+ ["\uADC0", "\uADC0"], /* Hangul Syllable */
+ ["\uADC1", "\uADC1"], /* Hangul Syllable */
+ ["\uADC2", "\uADC2"], /* Hangul Syllable */
+ ["\uADC3", "\uADC3"], /* Hangul Syllable */
+ ["\uADC4", "\uADC4"], /* Hangul Syllable */
+ ["\uADC5", "\uADC5"], /* Hangul Syllable */
+ ["\uADC6", "\uADC6"], /* Hangul Syllable */
+ ["\uADC7", "\uADC7"], /* Hangul Syllable */
+ ["\uADC8", "\uADC8"], /* Hangul Syllable */
+ ["\uADC9", "\uADC9"], /* Hangul Syllable */
+ ["\uADCA", "\uADCA"], /* Hangul Syllable */
+ ["\uADCB", "\uADCB"], /* Hangul Syllable */
+ ["\uADCC", "\uADCC"], /* Hangul Syllable */
+ ["\uADCD", "\uADCD"], /* Hangul Syllable */
+ ["\uADCE", "\uADCE"], /* Hangul Syllable */
+ ["\uADCF", "\uADCF"], /* Hangul Syllable */
+ ["\uADD0", "\uADD0"], /* Hangul Syllable */
+ ["\uADD1", "\uADD1"], /* Hangul Syllable */
+ ["\uADD2", "\uADD2"], /* Hangul Syllable */
+ ["\uADD3", "\uADD3"], /* Hangul Syllable */
+ ["\uADD4", "\uADD4"], /* Hangul Syllable */
+ ["\uADD5", "\uADD5"], /* Hangul Syllable */
+ ["\uADD6", "\uADD6"], /* Hangul Syllable */
+ ["\uADD7", "\uADD7"], /* Hangul Syllable */
+ ["\uADD8", "\uADD8"], /* Hangul Syllable */
+ ["\uADD9", "\uADD9"], /* Hangul Syllable */
+ ["\uADDA", "\uADDA"], /* Hangul Syllable */
+ ["\uADDB", "\uADDB"], /* Hangul Syllable */
+ ["\uADDC", "\uADDC"], /* Hangul Syllable */
+ ["\uADDD", "\uADDD"], /* Hangul Syllable */
+ ["\uADDE", "\uADDE"], /* Hangul Syllable */
+ ["\uADDF", "\uADDF"], /* Hangul Syllable */
+ ["\uADE0", "\uADE0"], /* Hangul Syllable */
+ ["\uADE1", "\uADE1"], /* Hangul Syllable */
+ ["\uADE2", "\uADE2"], /* Hangul Syllable */
+ ["\uADE3", "\uADE3"], /* Hangul Syllable */
+ ["\uADE4", "\uADE4"], /* Hangul Syllable */
+ ["\uADE5", "\uADE5"], /* Hangul Syllable */
+ ["\uADE6", "\uADE6"], /* Hangul Syllable */
+ ["\uADE7", "\uADE7"], /* Hangul Syllable */
+ ["\uADE8", "\uADE8"], /* Hangul Syllable */
+ ["\uADE9", "\uADE9"], /* Hangul Syllable */
+ ["\uADEA", "\uADEA"], /* Hangul Syllable */
+ ["\uADEB", "\uADEB"], /* Hangul Syllable */
+ ["\uADEC", "\uADEC"], /* Hangul Syllable */
+ ["\uADED", "\uADED"], /* Hangul Syllable */
+ ["\uADEE", "\uADEE"], /* Hangul Syllable */
+ ["\uADEF", "\uADEF"], /* Hangul Syllable */
+ ["\uADF0", "\uADF0"], /* Hangul Syllable */
+ ["\uADF1", "\uADF1"], /* Hangul Syllable */
+ ["\uADF2", "\uADF2"], /* Hangul Syllable */
+ ["\uADF3", "\uADF3"], /* Hangul Syllable */
+ ["\uADF4", "\uADF4"], /* Hangul Syllable */
+ ["\uADF5", "\uADF5"], /* Hangul Syllable */
+ ["\uADF6", "\uADF6"], /* Hangul Syllable */
+ ["\uADF7", "\uADF7"], /* Hangul Syllable */
+ ["\uADF8", "\uADF8"], /* Hangul Syllable */
+ ["\uADF9", "\uADF9"], /* Hangul Syllable */
+ ["\uADFA", "\uADFA"], /* Hangul Syllable */
+ ["\uADFB", "\uADFB"], /* Hangul Syllable */
+ ["\uADFC", "\uADFC"], /* Hangul Syllable */
+ ["\uADFD", "\uADFD"], /* Hangul Syllable */
+ ["\uADFE", "\uADFE"], /* Hangul Syllable */
+ ["\uADFF", "\uADFF"], /* Hangul Syllable */
+ ["\uAE00", "\uAE00"], /* Hangul Syllable */
+ ["\uAE01", "\uAE01"], /* Hangul Syllable */
+ ["\uAE02", "\uAE02"], /* Hangul Syllable */
+ ["\uAE03", "\uAE03"], /* Hangul Syllable */
+ ["\uAE04", "\uAE04"], /* Hangul Syllable */
+ ["\uAE05", "\uAE05"], /* Hangul Syllable */
+ ["\uAE06", "\uAE06"], /* Hangul Syllable */
+ ["\uAE07", "\uAE07"], /* Hangul Syllable */
+ ["\uAE08", "\uAE08"], /* Hangul Syllable */
+ ["\uAE09", "\uAE09"], /* Hangul Syllable */
+ ["\uAE0A", "\uAE0A"], /* Hangul Syllable */
+ ["\uAE0B", "\uAE0B"], /* Hangul Syllable */
+ ["\uAE0C", "\uAE0C"], /* Hangul Syllable */
+ ["\uAE0D", "\uAE0D"], /* Hangul Syllable */
+ ["\uAE0E", "\uAE0E"], /* Hangul Syllable */
+ ["\uAE0F", "\uAE0F"], /* Hangul Syllable */
+ ["\uAE10", "\uAE10"], /* Hangul Syllable */
+ ["\uAE11", "\uAE11"], /* Hangul Syllable */
+ ["\uAE12", "\uAE12"], /* Hangul Syllable */
+ ["\uAE13", "\uAE13"], /* Hangul Syllable */
+ ["\uAE14", "\uAE14"], /* Hangul Syllable */
+ ["\uAE15", "\uAE15"], /* Hangul Syllable */
+ ["\uAE16", "\uAE16"], /* Hangul Syllable */
+ ["\uAE17", "\uAE17"], /* Hangul Syllable */
+ ["\uAE18", "\uAE18"], /* Hangul Syllable */
+ ["\uAE19", "\uAE19"], /* Hangul Syllable */
+ ["\uAE1A", "\uAE1A"], /* Hangul Syllable */
+ ["\uAE1B", "\uAE1B"], /* Hangul Syllable */
+ ["\uAE1C", "\uAE1C"], /* Hangul Syllable */
+ ["\uAE1D", "\uAE1D"], /* Hangul Syllable */
+ ["\uAE1E", "\uAE1E"], /* Hangul Syllable */
+ ["\uAE1F", "\uAE1F"], /* Hangul Syllable */
+ ["\uAE20", "\uAE20"], /* Hangul Syllable */
+ ["\uAE21", "\uAE21"], /* Hangul Syllable */
+ ["\uAE22", "\uAE22"], /* Hangul Syllable */
+ ["\uAE23", "\uAE23"], /* Hangul Syllable */
+ ["\uAE24", "\uAE24"], /* Hangul Syllable */
+ ["\uAE25", "\uAE25"], /* Hangul Syllable */
+ ["\uAE26", "\uAE26"], /* Hangul Syllable */
+ ["\uAE27", "\uAE27"], /* Hangul Syllable */
+ ["\uAE28", "\uAE28"], /* Hangul Syllable */
+ ["\uAE29", "\uAE29"], /* Hangul Syllable */
+ ["\uAE2A", "\uAE2A"], /* Hangul Syllable */
+ ["\uAE2B", "\uAE2B"], /* Hangul Syllable */
+ ["\uAE2C", "\uAE2C"], /* Hangul Syllable */
+ ["\uAE2D", "\uAE2D"], /* Hangul Syllable */
+ ["\uAE2E", "\uAE2E"], /* Hangul Syllable */
+ ["\uAE2F", "\uAE2F"], /* Hangul Syllable */
+ ["\uAE30", "\uAE30"], /* Hangul Syllable */
+ ["\uAE31", "\uAE31"], /* Hangul Syllable */
+ ["\uAE32", "\uAE32"], /* Hangul Syllable */
+ ["\uAE33", "\uAE33"], /* Hangul Syllable */
+ ["\uAE34", "\uAE34"], /* Hangul Syllable */
+ ["\uAE35", "\uAE35"], /* Hangul Syllable */
+ ["\uAE36", "\uAE36"], /* Hangul Syllable */
+ ["\uAE37", "\uAE37"], /* Hangul Syllable */
+ ["\uAE38", "\uAE38"], /* Hangul Syllable */
+ ["\uAE39", "\uAE39"], /* Hangul Syllable */
+ ["\uAE3A", "\uAE3A"], /* Hangul Syllable */
+ ["\uAE3B", "\uAE3B"], /* Hangul Syllable */
+ ["\uAE3C", "\uAE3C"], /* Hangul Syllable */
+ ["\uAE3D", "\uAE3D"], /* Hangul Syllable */
+ ["\uAE3E", "\uAE3E"], /* Hangul Syllable */
+ ["\uAE3F", "\uAE3F"], /* Hangul Syllable */
+ ["\uAE40", "\uAE40"], /* Hangul Syllable */
+ ["\uAE41", "\uAE41"], /* Hangul Syllable */
+ ["\uAE42", "\uAE42"], /* Hangul Syllable */
+ ["\uAE43", "\uAE43"], /* Hangul Syllable */
+ ["\uAE44", "\uAE44"], /* Hangul Syllable */
+ ["\uAE45", "\uAE45"], /* Hangul Syllable */
+ ["\uAE46", "\uAE46"], /* Hangul Syllable */
+ ["\uAE47", "\uAE47"], /* Hangul Syllable */
+ ["\uAE48", "\uAE48"], /* Hangul Syllable */
+ ["\uAE49", "\uAE49"], /* Hangul Syllable */
+ ["\uAE4A", "\uAE4A"], /* Hangul Syllable */
+ ["\uAE4B", "\uAE4B"], /* Hangul Syllable */
+ ["\uAE4C", "\uAE4C"], /* Hangul Syllable */
+ ["\uAE4D", "\uAE4D"], /* Hangul Syllable */
+ ["\uAE4E", "\uAE4E"], /* Hangul Syllable */
+ ["\uAE4F", "\uAE4F"], /* Hangul Syllable */
+ ["\uAE50", "\uAE50"], /* Hangul Syllable */
+ ["\uAE51", "\uAE51"], /* Hangul Syllable */
+ ["\uAE52", "\uAE52"], /* Hangul Syllable */
+ ["\uAE53", "\uAE53"], /* Hangul Syllable */
+ ["\uAE54", "\uAE54"], /* Hangul Syllable */
+ ["\uAE55", "\uAE55"], /* Hangul Syllable */
+ ["\uAE56", "\uAE56"], /* Hangul Syllable */
+ ["\uAE57", "\uAE57"], /* Hangul Syllable */
+ ["\uAE58", "\uAE58"], /* Hangul Syllable */
+ ["\uAE59", "\uAE59"], /* Hangul Syllable */
+ ["\uAE5A", "\uAE5A"], /* Hangul Syllable */
+ ["\uAE5B", "\uAE5B"], /* Hangul Syllable */
+ ["\uAE5C", "\uAE5C"], /* Hangul Syllable */
+ ["\uAE5D", "\uAE5D"], /* Hangul Syllable */
+ ["\uAE5E", "\uAE5E"], /* Hangul Syllable */
+ ["\uAE5F", "\uAE5F"], /* Hangul Syllable */
+ ["\uAE60", "\uAE60"], /* Hangul Syllable */
+ ["\uAE61", "\uAE61"], /* Hangul Syllable */
+ ["\uAE62", "\uAE62"], /* Hangul Syllable */
+ ["\uAE63", "\uAE63"], /* Hangul Syllable */
+ ["\uAE64", "\uAE64"], /* Hangul Syllable */
+ ["\uAE65", "\uAE65"], /* Hangul Syllable */
+ ["\uAE66", "\uAE66"], /* Hangul Syllable */
+ ["\uAE67", "\uAE67"], /* Hangul Syllable */
+ ["\uAE68", "\uAE68"], /* Hangul Syllable */
+ ["\uAE69", "\uAE69"], /* Hangul Syllable */
+ ["\uAE6A", "\uAE6A"], /* Hangul Syllable */
+ ["\uAE6B", "\uAE6B"], /* Hangul Syllable */
+ ["\uAE6C", "\uAE6C"], /* Hangul Syllable */
+ ["\uAE6D", "\uAE6D"], /* Hangul Syllable */
+ ["\uAE6E", "\uAE6E"], /* Hangul Syllable */
+ ["\uAE6F", "\uAE6F"], /* Hangul Syllable */
+ ["\uAE70", "\uAE70"], /* Hangul Syllable */
+ ["\uAE71", "\uAE71"], /* Hangul Syllable */
+ ["\uAE72", "\uAE72"], /* Hangul Syllable */
+ ["\uAE73", "\uAE73"], /* Hangul Syllable */
+ ["\uAE74", "\uAE74"], /* Hangul Syllable */
+ ["\uAE75", "\uAE75"], /* Hangul Syllable */
+ ["\uAE76", "\uAE76"], /* Hangul Syllable */
+ ["\uAE77", "\uAE77"], /* Hangul Syllable */
+ ["\uAE78", "\uAE78"], /* Hangul Syllable */
+ ["\uAE79", "\uAE79"], /* Hangul Syllable */
+ ["\uAE7A", "\uAE7A"], /* Hangul Syllable */
+ ["\uAE7B", "\uAE7B"], /* Hangul Syllable */
+ ["\uAE7C", "\uAE7C"], /* Hangul Syllable */
+ ["\uAE7D", "\uAE7D"], /* Hangul Syllable */
+ ["\uAE7E", "\uAE7E"], /* Hangul Syllable */
+ ["\uAE7F", "\uAE7F"], /* Hangul Syllable */
+ ["\uAE80", "\uAE80"], /* Hangul Syllable */
+ ["\uAE81", "\uAE81"], /* Hangul Syllable */
+ ["\uAE82", "\uAE82"], /* Hangul Syllable */
+ ["\uAE83", "\uAE83"], /* Hangul Syllable */
+ ["\uAE84", "\uAE84"], /* Hangul Syllable */
+ ["\uAE85", "\uAE85"], /* Hangul Syllable */
+ ["\uAE86", "\uAE86"], /* Hangul Syllable */
+ ["\uAE87", "\uAE87"], /* Hangul Syllable */
+ ["\uAE88", "\uAE88"], /* Hangul Syllable */
+ ["\uAE89", "\uAE89"], /* Hangul Syllable */
+ ["\uAE8A", "\uAE8A"], /* Hangul Syllable */
+ ["\uAE8B", "\uAE8B"], /* Hangul Syllable */
+ ["\uAE8C", "\uAE8C"], /* Hangul Syllable */
+ ["\uAE8D", "\uAE8D"], /* Hangul Syllable */
+ ["\uAE8E", "\uAE8E"], /* Hangul Syllable */
+ ["\uAE8F", "\uAE8F"], /* Hangul Syllable */
+ ["\uAE90", "\uAE90"], /* Hangul Syllable */
+ ["\uAE91", "\uAE91"], /* Hangul Syllable */
+ ["\uAE92", "\uAE92"], /* Hangul Syllable */
+ ["\uAE93", "\uAE93"], /* Hangul Syllable */
+ ["\uAE94", "\uAE94"], /* Hangul Syllable */
+ ["\uAE95", "\uAE95"], /* Hangul Syllable */
+ ["\uAE96", "\uAE96"], /* Hangul Syllable */
+ ["\uAE97", "\uAE97"], /* Hangul Syllable */
+ ["\uAE98", "\uAE98"], /* Hangul Syllable */
+ ["\uAE99", "\uAE99"], /* Hangul Syllable */
+ ["\uAE9A", "\uAE9A"], /* Hangul Syllable */
+ ["\uAE9B", "\uAE9B"], /* Hangul Syllable */
+ ["\uAE9C", "\uAE9C"], /* Hangul Syllable */
+ ["\uAE9D", "\uAE9D"], /* Hangul Syllable */
+ ["\uAE9E", "\uAE9E"], /* Hangul Syllable */
+ ["\uAE9F", "\uAE9F"], /* Hangul Syllable */
+ ["\uAEA0", "\uAEA0"], /* Hangul Syllable */
+ ["\uAEA1", "\uAEA1"], /* Hangul Syllable */
+ ["\uAEA2", "\uAEA2"], /* Hangul Syllable */
+ ["\uAEA3", "\uAEA3"], /* Hangul Syllable */
+ ["\uAEA4", "\uAEA4"], /* Hangul Syllable */
+ ["\uAEA5", "\uAEA5"], /* Hangul Syllable */
+ ["\uAEA6", "\uAEA6"], /* Hangul Syllable */
+ ["\uAEA7", "\uAEA7"], /* Hangul Syllable */
+ ["\uAEA8", "\uAEA8"], /* Hangul Syllable */
+ ["\uAEA9", "\uAEA9"], /* Hangul Syllable */
+ ["\uAEAA", "\uAEAA"], /* Hangul Syllable */
+ ["\uAEAB", "\uAEAB"], /* Hangul Syllable */
+ ["\uAEAC", "\uAEAC"], /* Hangul Syllable */
+ ["\uAEAD", "\uAEAD"], /* Hangul Syllable */
+ ["\uAEAE", "\uAEAE"], /* Hangul Syllable */
+ ["\uAEAF", "\uAEAF"], /* Hangul Syllable */
+ ["\uAEB0", "\uAEB0"], /* Hangul Syllable */
+ ["\uAEB1", "\uAEB1"], /* Hangul Syllable */
+ ["\uAEB2", "\uAEB2"], /* Hangul Syllable */
+ ["\uAEB3", "\uAEB3"], /* Hangul Syllable */
+ ["\uAEB4", "\uAEB4"], /* Hangul Syllable */
+ ["\uAEB5", "\uAEB5"], /* Hangul Syllable */
+ ["\uAEB6", "\uAEB6"], /* Hangul Syllable */
+ ["\uAEB7", "\uAEB7"], /* Hangul Syllable */
+ ["\uAEB8", "\uAEB8"], /* Hangul Syllable */
+ ["\uAEB9", "\uAEB9"], /* Hangul Syllable */
+ ["\uAEBA", "\uAEBA"], /* Hangul Syllable */
+ ["\uAEBB", "\uAEBB"], /* Hangul Syllable */
+ ["\uAEBC", "\uAEBC"], /* Hangul Syllable */
+ ["\uAEBD", "\uAEBD"], /* Hangul Syllable */
+ ["\uAEBE", "\uAEBE"], /* Hangul Syllable */
+ ["\uAEBF", "\uAEBF"], /* Hangul Syllable */
+ ["\uAEC0", "\uAEC0"], /* Hangul Syllable */
+ ["\uAEC1", "\uAEC1"], /* Hangul Syllable */
+ ["\uAEC2", "\uAEC2"], /* Hangul Syllable */
+ ["\uAEC3", "\uAEC3"], /* Hangul Syllable */
+ ["\uAEC4", "\uAEC4"], /* Hangul Syllable */
+ ["\uAEC5", "\uAEC5"], /* Hangul Syllable */
+ ["\uAEC6", "\uAEC6"], /* Hangul Syllable */
+ ["\uAEC7", "\uAEC7"], /* Hangul Syllable */
+ ["\uAEC8", "\uAEC8"], /* Hangul Syllable */
+ ["\uAEC9", "\uAEC9"], /* Hangul Syllable */
+ ["\uAECA", "\uAECA"], /* Hangul Syllable */
+ ["\uAECB", "\uAECB"], /* Hangul Syllable */
+ ["\uAECC", "\uAECC"], /* Hangul Syllable */
+ ["\uAECD", "\uAECD"], /* Hangul Syllable */
+ ["\uAECE", "\uAECE"], /* Hangul Syllable */
+ ["\uAECF", "\uAECF"], /* Hangul Syllable */
+ ["\uAED0", "\uAED0"], /* Hangul Syllable */
+ ["\uAED1", "\uAED1"], /* Hangul Syllable */
+ ["\uAED2", "\uAED2"], /* Hangul Syllable */
+ ["\uAED3", "\uAED3"], /* Hangul Syllable */
+ ["\uAED4", "\uAED4"], /* Hangul Syllable */
+ ["\uAED5", "\uAED5"], /* Hangul Syllable */
+ ["\uAED6", "\uAED6"], /* Hangul Syllable */
+ ["\uAED7", "\uAED7"], /* Hangul Syllable */
+ ["\uAED8", "\uAED8"], /* Hangul Syllable */
+ ["\uAED9", "\uAED9"], /* Hangul Syllable */
+ ["\uAEDA", "\uAEDA"], /* Hangul Syllable */
+ ["\uAEDB", "\uAEDB"], /* Hangul Syllable */
+ ["\uAEDC", "\uAEDC"], /* Hangul Syllable */
+ ["\uAEDD", "\uAEDD"], /* Hangul Syllable */
+ ["\uAEDE", "\uAEDE"], /* Hangul Syllable */
+ ["\uAEDF", "\uAEDF"], /* Hangul Syllable */
+ ["\uAEE0", "\uAEE0"], /* Hangul Syllable */
+ ["\uAEE1", "\uAEE1"], /* Hangul Syllable */
+ ["\uAEE2", "\uAEE2"], /* Hangul Syllable */
+ ["\uAEE3", "\uAEE3"], /* Hangul Syllable */
+ ["\uAEE4", "\uAEE4"], /* Hangul Syllable */
+ ["\uAEE5", "\uAEE5"], /* Hangul Syllable */
+ ["\uAEE6", "\uAEE6"], /* Hangul Syllable */
+ ["\uAEE7", "\uAEE7"], /* Hangul Syllable */
+ ["\uAEE8", "\uAEE8"], /* Hangul Syllable */
+ ["\uAEE9", "\uAEE9"], /* Hangul Syllable */
+ ["\uAEEA", "\uAEEA"], /* Hangul Syllable */
+ ["\uAEEB", "\uAEEB"], /* Hangul Syllable */
+ ["\uAEEC", "\uAEEC"], /* Hangul Syllable */
+ ["\uAEED", "\uAEED"], /* Hangul Syllable */
+ ["\uAEEE", "\uAEEE"], /* Hangul Syllable */
+ ["\uAEEF", "\uAEEF"], /* Hangul Syllable */
+ ["\uAEF0", "\uAEF0"], /* Hangul Syllable */
+ ["\uAEF1", "\uAEF1"], /* Hangul Syllable */
+ ["\uAEF2", "\uAEF2"], /* Hangul Syllable */
+ ["\uAEF3", "\uAEF3"], /* Hangul Syllable */
+ ["\uAEF4", "\uAEF4"], /* Hangul Syllable */
+ ["\uAEF5", "\uAEF5"], /* Hangul Syllable */
+ ["\uAEF6", "\uAEF6"], /* Hangul Syllable */
+ ["\uAEF7", "\uAEF7"], /* Hangul Syllable */
+ ["\uAEF8", "\uAEF8"], /* Hangul Syllable */
+ ["\uAEF9", "\uAEF9"], /* Hangul Syllable */
+ ["\uAEFA", "\uAEFA"], /* Hangul Syllable */
+ ["\uAEFB", "\uAEFB"], /* Hangul Syllable */
+ ["\uAEFC", "\uAEFC"], /* Hangul Syllable */
+ ["\uAEFD", "\uAEFD"], /* Hangul Syllable */
+ ["\uAEFE", "\uAEFE"], /* Hangul Syllable */
+ ["\uAEFF", "\uAEFF"], /* Hangul Syllable */
+ ["\uAF00", "\uAF00"], /* Hangul Syllable */
+ ["\uAF01", "\uAF01"], /* Hangul Syllable */
+ ["\uAF02", "\uAF02"], /* Hangul Syllable */
+ ["\uAF03", "\uAF03"], /* Hangul Syllable */
+ ["\uAF04", "\uAF04"], /* Hangul Syllable */
+ ["\uAF05", "\uAF05"], /* Hangul Syllable */
+ ["\uAF06", "\uAF06"], /* Hangul Syllable */
+ ["\uAF07", "\uAF07"], /* Hangul Syllable */
+ ["\uAF08", "\uAF08"], /* Hangul Syllable */
+ ["\uAF09", "\uAF09"], /* Hangul Syllable */
+ ["\uAF0A", "\uAF0A"], /* Hangul Syllable */
+ ["\uAF0B", "\uAF0B"], /* Hangul Syllable */
+ ["\uAF0C", "\uAF0C"], /* Hangul Syllable */
+ ["\uAF0D", "\uAF0D"], /* Hangul Syllable */
+ ["\uAF0E", "\uAF0E"], /* Hangul Syllable */
+ ["\uAF0F", "\uAF0F"], /* Hangul Syllable */
+ ["\uAF10", "\uAF10"], /* Hangul Syllable */
+ ["\uAF11", "\uAF11"], /* Hangul Syllable */
+ ["\uAF12", "\uAF12"], /* Hangul Syllable */
+ ["\uAF13", "\uAF13"], /* Hangul Syllable */
+ ["\uAF14", "\uAF14"], /* Hangul Syllable */
+ ["\uAF15", "\uAF15"], /* Hangul Syllable */
+ ["\uAF16", "\uAF16"], /* Hangul Syllable */
+ ["\uAF17", "\uAF17"], /* Hangul Syllable */
+ ["\uAF18", "\uAF18"], /* Hangul Syllable */
+ ["\uAF19", "\uAF19"], /* Hangul Syllable */
+ ["\uAF1A", "\uAF1A"], /* Hangul Syllable */
+ ["\uAF1B", "\uAF1B"], /* Hangul Syllable */
+ ["\uAF1C", "\uAF1C"], /* Hangul Syllable */
+ ["\uAF1D", "\uAF1D"], /* Hangul Syllable */
+ ["\uAF1E", "\uAF1E"], /* Hangul Syllable */
+ ["\uAF1F", "\uAF1F"], /* Hangul Syllable */
+ ["\uAF20", "\uAF20"], /* Hangul Syllable */
+ ["\uAF21", "\uAF21"], /* Hangul Syllable */
+ ["\uAF22", "\uAF22"], /* Hangul Syllable */
+ ["\uAF23", "\uAF23"], /* Hangul Syllable */
+ ["\uAF24", "\uAF24"], /* Hangul Syllable */
+ ["\uAF25", "\uAF25"], /* Hangul Syllable */
+ ["\uAF26", "\uAF26"], /* Hangul Syllable */
+ ["\uAF27", "\uAF27"], /* Hangul Syllable */
+ ["\uAF28", "\uAF28"], /* Hangul Syllable */
+ ["\uAF29", "\uAF29"], /* Hangul Syllable */
+ ["\uAF2A", "\uAF2A"], /* Hangul Syllable */
+ ["\uAF2B", "\uAF2B"], /* Hangul Syllable */
+ ["\uAF2C", "\uAF2C"], /* Hangul Syllable */
+ ["\uAF2D", "\uAF2D"], /* Hangul Syllable */
+ ["\uAF2E", "\uAF2E"], /* Hangul Syllable */
+ ["\uAF2F", "\uAF2F"], /* Hangul Syllable */
+ ["\uAF30", "\uAF30"], /* Hangul Syllable */
+ ["\uAF31", "\uAF31"], /* Hangul Syllable */
+ ["\uAF32", "\uAF32"], /* Hangul Syllable */
+ ["\uAF33", "\uAF33"], /* Hangul Syllable */
+ ["\uAF34", "\uAF34"], /* Hangul Syllable */
+ ["\uAF35", "\uAF35"], /* Hangul Syllable */
+ ["\uAF36", "\uAF36"], /* Hangul Syllable */
+ ["\uAF37", "\uAF37"], /* Hangul Syllable */
+ ["\uAF38", "\uAF38"], /* Hangul Syllable */
+ ["\uAF39", "\uAF39"], /* Hangul Syllable */
+ ["\uAF3A", "\uAF3A"], /* Hangul Syllable */
+ ["\uAF3B", "\uAF3B"], /* Hangul Syllable */
+ ["\uAF3C", "\uAF3C"], /* Hangul Syllable */
+ ["\uAF3D", "\uAF3D"], /* Hangul Syllable */
+ ["\uAF3E", "\uAF3E"], /* Hangul Syllable */
+ ["\uAF3F", "\uAF3F"], /* Hangul Syllable */
+ ["\uAF40", "\uAF40"], /* Hangul Syllable */
+ ["\uAF41", "\uAF41"], /* Hangul Syllable */
+ ["\uAF42", "\uAF42"], /* Hangul Syllable */
+ ["\uAF43", "\uAF43"], /* Hangul Syllable */
+ ["\uAF44", "\uAF44"], /* Hangul Syllable */
+ ["\uAF45", "\uAF45"], /* Hangul Syllable */
+ ["\uAF46", "\uAF46"], /* Hangul Syllable */
+ ["\uAF47", "\uAF47"], /* Hangul Syllable */
+ ["\uAF48", "\uAF48"], /* Hangul Syllable */
+ ["\uAF49", "\uAF49"], /* Hangul Syllable */
+ ["\uAF4A", "\uAF4A"], /* Hangul Syllable */
+ ["\uAF4B", "\uAF4B"], /* Hangul Syllable */
+ ["\uAF4C", "\uAF4C"], /* Hangul Syllable */
+ ["\uAF4D", "\uAF4D"], /* Hangul Syllable */
+ ["\uAF4E", "\uAF4E"], /* Hangul Syllable */
+ ["\uAF4F", "\uAF4F"], /* Hangul Syllable */
+ ["\uAF50", "\uAF50"], /* Hangul Syllable */
+ ["\uAF51", "\uAF51"], /* Hangul Syllable */
+ ["\uAF52", "\uAF52"], /* Hangul Syllable */
+ ["\uAF53", "\uAF53"], /* Hangul Syllable */
+ ["\uAF54", "\uAF54"], /* Hangul Syllable */
+ ["\uAF55", "\uAF55"], /* Hangul Syllable */
+ ["\uAF56", "\uAF56"], /* Hangul Syllable */
+ ["\uAF57", "\uAF57"], /* Hangul Syllable */
+ ["\uAF58", "\uAF58"], /* Hangul Syllable */
+ ["\uAF59", "\uAF59"], /* Hangul Syllable */
+ ["\uAF5A", "\uAF5A"], /* Hangul Syllable */
+ ["\uAF5B", "\uAF5B"], /* Hangul Syllable */
+ ["\uAF5C", "\uAF5C"], /* Hangul Syllable */
+ ["\uAF5D", "\uAF5D"], /* Hangul Syllable */
+ ["\uAF5E", "\uAF5E"], /* Hangul Syllable */
+ ["\uAF5F", "\uAF5F"], /* Hangul Syllable */
+ ["\uAF60", "\uAF60"], /* Hangul Syllable */
+ ["\uAF61", "\uAF61"], /* Hangul Syllable */
+ ["\uAF62", "\uAF62"], /* Hangul Syllable */
+ ["\uAF63", "\uAF63"], /* Hangul Syllable */
+ ["\uAF64", "\uAF64"], /* Hangul Syllable */
+ ["\uAF65", "\uAF65"], /* Hangul Syllable */
+ ["\uAF66", "\uAF66"], /* Hangul Syllable */
+ ["\uAF67", "\uAF67"], /* Hangul Syllable */
+ ["\uAF68", "\uAF68"], /* Hangul Syllable */
+ ["\uAF69", "\uAF69"], /* Hangul Syllable */
+ ["\uAF6A", "\uAF6A"], /* Hangul Syllable */
+ ["\uAF6B", "\uAF6B"], /* Hangul Syllable */
+ ["\uAF6C", "\uAF6C"], /* Hangul Syllable */
+ ["\uAF6D", "\uAF6D"], /* Hangul Syllable */
+ ["\uAF6E", "\uAF6E"], /* Hangul Syllable */
+ ["\uAF6F", "\uAF6F"], /* Hangul Syllable */
+ ["\uAF70", "\uAF70"], /* Hangul Syllable */
+ ["\uAF71", "\uAF71"], /* Hangul Syllable */
+ ["\uAF72", "\uAF72"], /* Hangul Syllable */
+ ["\uAF73", "\uAF73"], /* Hangul Syllable */
+ ["\uAF74", "\uAF74"], /* Hangul Syllable */
+ ["\uAF75", "\uAF75"], /* Hangul Syllable */
+ ["\uAF76", "\uAF76"], /* Hangul Syllable */
+ ["\uAF77", "\uAF77"], /* Hangul Syllable */
+ ["\uAF78", "\uAF78"], /* Hangul Syllable */
+ ["\uAF79", "\uAF79"], /* Hangul Syllable */
+ ["\uAF7A", "\uAF7A"], /* Hangul Syllable */
+ ["\uAF7B", "\uAF7B"], /* Hangul Syllable */
+ ["\uAF7C", "\uAF7C"], /* Hangul Syllable */
+ ["\uAF7D", "\uAF7D"], /* Hangul Syllable */
+ ["\uAF7E", "\uAF7E"], /* Hangul Syllable */
+ ["\uAF7F", "\uAF7F"], /* Hangul Syllable */
+ ["\uAF80", "\uAF80"], /* Hangul Syllable */
+ ["\uAF81", "\uAF81"], /* Hangul Syllable */
+ ["\uAF82", "\uAF82"], /* Hangul Syllable */
+ ["\uAF83", "\uAF83"], /* Hangul Syllable */
+ ["\uAF84", "\uAF84"], /* Hangul Syllable */
+ ["\uAF85", "\uAF85"], /* Hangul Syllable */
+ ["\uAF86", "\uAF86"], /* Hangul Syllable */
+ ["\uAF87", "\uAF87"], /* Hangul Syllable */
+ ["\uAF88", "\uAF88"], /* Hangul Syllable */
+ ["\uAF89", "\uAF89"], /* Hangul Syllable */
+ ["\uAF8A", "\uAF8A"], /* Hangul Syllable */
+ ["\uAF8B", "\uAF8B"], /* Hangul Syllable */
+ ["\uAF8C", "\uAF8C"], /* Hangul Syllable */
+ ["\uAF8D", "\uAF8D"], /* Hangul Syllable */
+ ["\uAF8E", "\uAF8E"], /* Hangul Syllable */
+ ["\uAF8F", "\uAF8F"], /* Hangul Syllable */
+ ["\uAF90", "\uAF90"], /* Hangul Syllable */
+ ["\uAF91", "\uAF91"], /* Hangul Syllable */
+ ["\uAF92", "\uAF92"], /* Hangul Syllable */
+ ["\uAF93", "\uAF93"], /* Hangul Syllable */
+ ["\uAF94", "\uAF94"], /* Hangul Syllable */
+ ["\uAF95", "\uAF95"], /* Hangul Syllable */
+ ["\uAF96", "\uAF96"], /* Hangul Syllable */
+ ["\uAF97", "\uAF97"], /* Hangul Syllable */
+ ["\uAF98", "\uAF98"], /* Hangul Syllable */
+ ["\uAF99", "\uAF99"], /* Hangul Syllable */
+ ["\uAF9A", "\uAF9A"], /* Hangul Syllable */
+ ["\uAF9B", "\uAF9B"], /* Hangul Syllable */
+ ["\uAF9C", "\uAF9C"], /* Hangul Syllable */
+ ["\uAF9D", "\uAF9D"], /* Hangul Syllable */
+ ["\uAF9E", "\uAF9E"], /* Hangul Syllable */
+ ["\uAF9F", "\uAF9F"], /* Hangul Syllable */
+ ["\uAFA0", "\uAFA0"], /* Hangul Syllable */
+ ["\uAFA1", "\uAFA1"], /* Hangul Syllable */
+ ["\uAFA2", "\uAFA2"], /* Hangul Syllable */
+ ["\uAFA3", "\uAFA3"], /* Hangul Syllable */
+ ["\uAFA4", "\uAFA4"], /* Hangul Syllable */
+ ["\uAFA5", "\uAFA5"], /* Hangul Syllable */
+ ["\uAFA6", "\uAFA6"], /* Hangul Syllable */
+ ["\uAFA7", "\uAFA7"], /* Hangul Syllable */
+ ["\uAFA8", "\uAFA8"], /* Hangul Syllable */
+ ["\uAFA9", "\uAFA9"], /* Hangul Syllable */
+ ["\uAFAA", "\uAFAA"], /* Hangul Syllable */
+ ["\uAFAB", "\uAFAB"], /* Hangul Syllable */
+ ["\uAFAC", "\uAFAC"], /* Hangul Syllable */
+ ["\uAFAD", "\uAFAD"], /* Hangul Syllable */
+ ["\uAFAE", "\uAFAE"], /* Hangul Syllable */
+ ["\uAFAF", "\uAFAF"], /* Hangul Syllable */
+ ["\uAFB0", "\uAFB0"], /* Hangul Syllable */
+ ["\uAFB1", "\uAFB1"], /* Hangul Syllable */
+ ["\uAFB2", "\uAFB2"], /* Hangul Syllable */
+ ["\uAFB3", "\uAFB3"], /* Hangul Syllable */
+ ["\uAFB4", "\uAFB4"], /* Hangul Syllable */
+ ["\uAFB5", "\uAFB5"], /* Hangul Syllable */
+ ["\uAFB6", "\uAFB6"], /* Hangul Syllable */
+ ["\uAFB7", "\uAFB7"], /* Hangul Syllable */
+ ["\uAFB8", "\uAFB8"], /* Hangul Syllable */
+ ["\uAFB9", "\uAFB9"], /* Hangul Syllable */
+ ["\uAFBA", "\uAFBA"], /* Hangul Syllable */
+ ["\uAFBB", "\uAFBB"], /* Hangul Syllable */
+ ["\uAFBC", "\uAFBC"], /* Hangul Syllable */
+ ["\uAFBD", "\uAFBD"], /* Hangul Syllable */
+ ["\uAFBE", "\uAFBE"], /* Hangul Syllable */
+ ["\uAFBF", "\uAFBF"], /* Hangul Syllable */
+ ["\uAFC0", "\uAFC0"], /* Hangul Syllable */
+ ["\uAFC1", "\uAFC1"], /* Hangul Syllable */
+ ["\uAFC2", "\uAFC2"], /* Hangul Syllable */
+ ["\uAFC3", "\uAFC3"], /* Hangul Syllable */
+ ["\uAFC4", "\uAFC4"], /* Hangul Syllable */
+ ["\uAFC5", "\uAFC5"], /* Hangul Syllable */
+ ["\uAFC6", "\uAFC6"], /* Hangul Syllable */
+ ["\uAFC7", "\uAFC7"], /* Hangul Syllable */
+ ["\uAFC8", "\uAFC8"], /* Hangul Syllable */
+ ["\uAFC9", "\uAFC9"], /* Hangul Syllable */
+ ["\uAFCA", "\uAFCA"], /* Hangul Syllable */
+ ["\uAFCB", "\uAFCB"], /* Hangul Syllable */
+ ["\uAFCC", "\uAFCC"], /* Hangul Syllable */
+ ["\uAFCD", "\uAFCD"], /* Hangul Syllable */
+ ["\uAFCE", "\uAFCE"], /* Hangul Syllable */
+ ["\uAFCF", "\uAFCF"], /* Hangul Syllable */
+ ["\uAFD0", "\uAFD0"], /* Hangul Syllable */
+ ["\uAFD1", "\uAFD1"], /* Hangul Syllable */
+ ["\uAFD2", "\uAFD2"], /* Hangul Syllable */
+ ["\uAFD3", "\uAFD3"], /* Hangul Syllable */
+ ["\uAFD4", "\uAFD4"], /* Hangul Syllable */
+ ["\uAFD5", "\uAFD5"], /* Hangul Syllable */
+ ["\uAFD6", "\uAFD6"], /* Hangul Syllable */
+ ["\uAFD7", "\uAFD7"], /* Hangul Syllable */
+ ["\uAFD8", "\uAFD8"], /* Hangul Syllable */
+ ["\uAFD9", "\uAFD9"], /* Hangul Syllable */
+ ["\uAFDA", "\uAFDA"], /* Hangul Syllable */
+ ["\uAFDB", "\uAFDB"], /* Hangul Syllable */
+ ["\uAFDC", "\uAFDC"], /* Hangul Syllable */
+ ["\uAFDD", "\uAFDD"], /* Hangul Syllable */
+ ["\uAFDE", "\uAFDE"], /* Hangul Syllable */
+ ["\uAFDF", "\uAFDF"], /* Hangul Syllable */
+ ["\uAFE0", "\uAFE0"], /* Hangul Syllable */
+ ["\uAFE1", "\uAFE1"], /* Hangul Syllable */
+ ["\uAFE2", "\uAFE2"], /* Hangul Syllable */
+ ["\uAFE3", "\uAFE3"], /* Hangul Syllable */
+ ["\uAFE4", "\uAFE4"], /* Hangul Syllable */
+ ["\uAFE5", "\uAFE5"], /* Hangul Syllable */
+ ["\uAFE6", "\uAFE6"], /* Hangul Syllable */
+ ["\uAFE7", "\uAFE7"], /* Hangul Syllable */
+ ["\uAFE8", "\uAFE8"], /* Hangul Syllable */
+ ["\uAFE9", "\uAFE9"], /* Hangul Syllable */
+ ["\uAFEA", "\uAFEA"], /* Hangul Syllable */
+ ["\uAFEB", "\uAFEB"], /* Hangul Syllable */
+ ["\uAFEC", "\uAFEC"], /* Hangul Syllable */
+ ["\uAFED", "\uAFED"], /* Hangul Syllable */
+ ["\uAFEE", "\uAFEE"], /* Hangul Syllable */
+ ["\uAFEF", "\uAFEF"], /* Hangul Syllable */
+ ["\uAFF0", "\uAFF0"], /* Hangul Syllable */
+ ["\uAFF1", "\uAFF1"], /* Hangul Syllable */
+ ["\uAFF2", "\uAFF2"], /* Hangul Syllable */
+ ["\uAFF3", "\uAFF3"], /* Hangul Syllable */
+ ["\uAFF4", "\uAFF4"], /* Hangul Syllable */
+ ["\uAFF5", "\uAFF5"], /* Hangul Syllable */
+ ["\uAFF6", "\uAFF6"], /* Hangul Syllable */
+ ["\uAFF7", "\uAFF7"], /* Hangul Syllable */
+ ["\uAFF8", "\uAFF8"], /* Hangul Syllable */
+ ["\uAFF9", "\uAFF9"], /* Hangul Syllable */
+ ["\uAFFA", "\uAFFA"], /* Hangul Syllable */
+ ["\uAFFB", "\uAFFB"], /* Hangul Syllable */
+ ["\uAFFC", "\uAFFC"], /* Hangul Syllable */
+ ["\uAFFD", "\uAFFD"], /* Hangul Syllable */
+ ["\uAFFE", "\uAFFE"], /* Hangul Syllable */
+ ["\uAFFF", "\uAFFF"], /* Hangul Syllable */
+ ["\uB000", "\uB000"], /* Hangul Syllable */
+ ["\uB001", "\uB001"], /* Hangul Syllable */
+ ["\uB002", "\uB002"], /* Hangul Syllable */
+ ["\uB003", "\uB003"], /* Hangul Syllable */
+ ["\uB004", "\uB004"], /* Hangul Syllable */
+ ["\uB005", "\uB005"], /* Hangul Syllable */
+ ["\uB006", "\uB006"], /* Hangul Syllable */
+ ["\uB007", "\uB007"], /* Hangul Syllable */
+ ["\uB008", "\uB008"], /* Hangul Syllable */
+ ["\uB009", "\uB009"], /* Hangul Syllable */
+ ["\uB00A", "\uB00A"], /* Hangul Syllable */
+ ["\uB00B", "\uB00B"], /* Hangul Syllable */
+ ["\uB00C", "\uB00C"], /* Hangul Syllable */
+ ["\uB00D", "\uB00D"], /* Hangul Syllable */
+ ["\uB00E", "\uB00E"], /* Hangul Syllable */
+ ["\uB00F", "\uB00F"], /* Hangul Syllable */
+ ["\uB010", "\uB010"], /* Hangul Syllable */
+ ["\uB011", "\uB011"], /* Hangul Syllable */
+ ["\uB012", "\uB012"], /* Hangul Syllable */
+ ["\uB013", "\uB013"], /* Hangul Syllable */
+ ["\uB014", "\uB014"], /* Hangul Syllable */
+ ["\uB015", "\uB015"], /* Hangul Syllable */
+ ["\uB016", "\uB016"], /* Hangul Syllable */
+ ["\uB017", "\uB017"], /* Hangul Syllable */
+ ["\uB018", "\uB018"], /* Hangul Syllable */
+ ["\uB019", "\uB019"], /* Hangul Syllable */
+ ["\uB01A", "\uB01A"], /* Hangul Syllable */
+ ["\uB01B", "\uB01B"], /* Hangul Syllable */
+ ["\uB01C", "\uB01C"], /* Hangul Syllable */
+ ["\uB01D", "\uB01D"], /* Hangul Syllable */
+ ["\uB01E", "\uB01E"], /* Hangul Syllable */
+ ["\uB01F", "\uB01F"], /* Hangul Syllable */
+ ["\uB020", "\uB020"], /* Hangul Syllable */
+ ["\uB021", "\uB021"], /* Hangul Syllable */
+ ["\uB022", "\uB022"], /* Hangul Syllable */
+ ["\uB023", "\uB023"], /* Hangul Syllable */
+ ["\uB024", "\uB024"], /* Hangul Syllable */
+ ["\uB025", "\uB025"], /* Hangul Syllable */
+ ["\uB026", "\uB026"], /* Hangul Syllable */
+ ["\uB027", "\uB027"], /* Hangul Syllable */
+ ["\uB028", "\uB028"], /* Hangul Syllable */
+ ["\uB029", "\uB029"], /* Hangul Syllable */
+ ["\uB02A", "\uB02A"], /* Hangul Syllable */
+ ["\uB02B", "\uB02B"], /* Hangul Syllable */
+ ["\uB02C", "\uB02C"], /* Hangul Syllable */
+ ["\uB02D", "\uB02D"], /* Hangul Syllable */
+ ["\uB02E", "\uB02E"], /* Hangul Syllable */
+ ["\uB02F", "\uB02F"], /* Hangul Syllable */
+ ["\uB030", "\uB030"], /* Hangul Syllable */
+ ["\uB031", "\uB031"], /* Hangul Syllable */
+ ["\uB032", "\uB032"], /* Hangul Syllable */
+ ["\uB033", "\uB033"], /* Hangul Syllable */
+ ["\uB034", "\uB034"], /* Hangul Syllable */
+ ["\uB035", "\uB035"], /* Hangul Syllable */
+ ["\uB036", "\uB036"], /* Hangul Syllable */
+ ["\uB037", "\uB037"], /* Hangul Syllable */
+ ["\uB038", "\uB038"], /* Hangul Syllable */
+ ["\uB039", "\uB039"], /* Hangul Syllable */
+ ["\uB03A", "\uB03A"], /* Hangul Syllable */
+ ["\uB03B", "\uB03B"], /* Hangul Syllable */
+ ["\uB03C", "\uB03C"], /* Hangul Syllable */
+ ["\uB03D", "\uB03D"], /* Hangul Syllable */
+ ["\uB03E", "\uB03E"], /* Hangul Syllable */
+ ["\uB03F", "\uB03F"], /* Hangul Syllable */
+ ["\uB040", "\uB040"], /* Hangul Syllable */
+ ["\uB041", "\uB041"], /* Hangul Syllable */
+ ["\uB042", "\uB042"], /* Hangul Syllable */
+ ["\uB043", "\uB043"], /* Hangul Syllable */
+ ["\uB044", "\uB044"], /* Hangul Syllable */
+ ["\uB045", "\uB045"], /* Hangul Syllable */
+ ["\uB046", "\uB046"], /* Hangul Syllable */
+ ["\uB047", "\uB047"], /* Hangul Syllable */
+ ["\uB048", "\uB048"], /* Hangul Syllable */
+ ["\uB049", "\uB049"], /* Hangul Syllable */
+ ["\uB04A", "\uB04A"], /* Hangul Syllable */
+ ["\uB04B", "\uB04B"], /* Hangul Syllable */
+ ["\uB04C", "\uB04C"], /* Hangul Syllable */
+ ["\uB04D", "\uB04D"], /* Hangul Syllable */
+ ["\uB04E", "\uB04E"], /* Hangul Syllable */
+ ["\uB04F", "\uB04F"], /* Hangul Syllable */
+ ["\uB050", "\uB050"], /* Hangul Syllable */
+ ["\uB051", "\uB051"], /* Hangul Syllable */
+ ["\uB052", "\uB052"], /* Hangul Syllable */
+ ["\uB053", "\uB053"], /* Hangul Syllable */
+ ["\uB054", "\uB054"], /* Hangul Syllable */
+ ["\uB055", "\uB055"], /* Hangul Syllable */
+ ["\uB056", "\uB056"], /* Hangul Syllable */
+ ["\uB057", "\uB057"], /* Hangul Syllable */
+ ["\uB058", "\uB058"], /* Hangul Syllable */
+ ["\uB059", "\uB059"], /* Hangul Syllable */
+ ["\uB05A", "\uB05A"], /* Hangul Syllable */
+ ["\uB05B", "\uB05B"], /* Hangul Syllable */
+ ["\uB05C", "\uB05C"], /* Hangul Syllable */
+ ["\uB05D", "\uB05D"], /* Hangul Syllable */
+ ["\uB05E", "\uB05E"], /* Hangul Syllable */
+ ["\uB05F", "\uB05F"], /* Hangul Syllable */
+ ["\uB060", "\uB060"], /* Hangul Syllable */
+ ["\uB061", "\uB061"], /* Hangul Syllable */
+ ["\uB062", "\uB062"], /* Hangul Syllable */
+ ["\uB063", "\uB063"], /* Hangul Syllable */
+ ["\uB064", "\uB064"], /* Hangul Syllable */
+ ["\uB065", "\uB065"], /* Hangul Syllable */
+ ["\uB066", "\uB066"], /* Hangul Syllable */
+ ["\uB067", "\uB067"], /* Hangul Syllable */
+ ["\uB068", "\uB068"], /* Hangul Syllable */
+ ["\uB069", "\uB069"], /* Hangul Syllable */
+ ["\uB06A", "\uB06A"], /* Hangul Syllable */
+ ["\uB06B", "\uB06B"], /* Hangul Syllable */
+ ["\uB06C", "\uB06C"], /* Hangul Syllable */
+ ["\uB06D", "\uB06D"], /* Hangul Syllable */
+ ["\uB06E", "\uB06E"], /* Hangul Syllable */
+ ["\uB06F", "\uB06F"], /* Hangul Syllable */
+ ["\uB070", "\uB070"], /* Hangul Syllable */
+ ["\uB071", "\uB071"], /* Hangul Syllable */
+ ["\uB072", "\uB072"], /* Hangul Syllable */
+ ["\uB073", "\uB073"], /* Hangul Syllable */
+ ["\uB074", "\uB074"], /* Hangul Syllable */
+ ["\uB075", "\uB075"], /* Hangul Syllable */
+ ["\uB076", "\uB076"], /* Hangul Syllable */
+ ["\uB077", "\uB077"], /* Hangul Syllable */
+ ["\uB078", "\uB078"], /* Hangul Syllable */
+ ["\uB079", "\uB079"], /* Hangul Syllable */
+ ["\uB07A", "\uB07A"], /* Hangul Syllable */
+ ["\uB07B", "\uB07B"], /* Hangul Syllable */
+ ["\uB07C", "\uB07C"], /* Hangul Syllable */
+ ["\uB07D", "\uB07D"], /* Hangul Syllable */
+ ["\uB07E", "\uB07E"], /* Hangul Syllable */
+ ["\uB07F", "\uB07F"], /* Hangul Syllable */
+ ["\uB080", "\uB080"], /* Hangul Syllable */
+ ["\uB081", "\uB081"], /* Hangul Syllable */
+ ["\uB082", "\uB082"], /* Hangul Syllable */
+ ["\uB083", "\uB083"], /* Hangul Syllable */
+ ["\uB084", "\uB084"], /* Hangul Syllable */
+ ["\uB085", "\uB085"], /* Hangul Syllable */
+ ["\uB086", "\uB086"], /* Hangul Syllable */
+ ["\uB087", "\uB087"], /* Hangul Syllable */
+ ["\uB088", "\uB088"], /* Hangul Syllable */
+ ["\uB089", "\uB089"], /* Hangul Syllable */
+ ["\uB08A", "\uB08A"], /* Hangul Syllable */
+ ["\uB08B", "\uB08B"], /* Hangul Syllable */
+ ["\uB08C", "\uB08C"], /* Hangul Syllable */
+ ["\uB08D", "\uB08D"], /* Hangul Syllable */
+ ["\uB08E", "\uB08E"], /* Hangul Syllable */
+ ["\uB08F", "\uB08F"], /* Hangul Syllable */
+ ["\uB090", "\uB090"], /* Hangul Syllable */
+ ["\uB091", "\uB091"], /* Hangul Syllable */
+ ["\uB092", "\uB092"], /* Hangul Syllable */
+ ["\uB093", "\uB093"], /* Hangul Syllable */
+ ["\uB094", "\uB094"], /* Hangul Syllable */
+ ["\uB095", "\uB095"], /* Hangul Syllable */
+ ["\uB096", "\uB096"], /* Hangul Syllable */
+ ["\uB097", "\uB097"], /* Hangul Syllable */
+ ["\uB098", "\uB098"], /* Hangul Syllable */
+ ["\uB099", "\uB099"], /* Hangul Syllable */
+ ["\uB09A", "\uB09A"], /* Hangul Syllable */
+ ["\uB09B", "\uB09B"], /* Hangul Syllable */
+ ["\uB09C", "\uB09C"], /* Hangul Syllable */
+ ["\uB09D", "\uB09D"], /* Hangul Syllable */
+ ["\uB09E", "\uB09E"], /* Hangul Syllable */
+ ["\uB09F", "\uB09F"], /* Hangul Syllable */
+ ["\uB0A0", "\uB0A0"], /* Hangul Syllable */
+ ["\uB0A1", "\uB0A1"], /* Hangul Syllable */
+ ["\uB0A2", "\uB0A2"], /* Hangul Syllable */
+ ["\uB0A3", "\uB0A3"], /* Hangul Syllable */
+ ["\uB0A4", "\uB0A4"], /* Hangul Syllable */
+ ["\uB0A5", "\uB0A5"], /* Hangul Syllable */
+ ["\uB0A6", "\uB0A6"], /* Hangul Syllable */
+ ["\uB0A7", "\uB0A7"], /* Hangul Syllable */
+ ["\uB0A8", "\uB0A8"], /* Hangul Syllable */
+ ["\uB0A9", "\uB0A9"], /* Hangul Syllable */
+ ["\uB0AA", "\uB0AA"], /* Hangul Syllable */
+ ["\uB0AB", "\uB0AB"], /* Hangul Syllable */
+ ["\uB0AC", "\uB0AC"], /* Hangul Syllable */
+ ["\uB0AD", "\uB0AD"], /* Hangul Syllable */
+ ["\uB0AE", "\uB0AE"], /* Hangul Syllable */
+ ["\uB0AF", "\uB0AF"], /* Hangul Syllable */
+ ["\uB0B0", "\uB0B0"], /* Hangul Syllable */
+ ["\uB0B1", "\uB0B1"], /* Hangul Syllable */
+ ["\uB0B2", "\uB0B2"], /* Hangul Syllable */
+ ["\uB0B3", "\uB0B3"], /* Hangul Syllable */
+ ["\uB0B4", "\uB0B4"], /* Hangul Syllable */
+ ["\uB0B5", "\uB0B5"], /* Hangul Syllable */
+ ["\uB0B6", "\uB0B6"], /* Hangul Syllable */
+ ["\uB0B7", "\uB0B7"], /* Hangul Syllable */
+ ["\uB0B8", "\uB0B8"], /* Hangul Syllable */
+ ["\uB0B9", "\uB0B9"], /* Hangul Syllable */
+ ["\uB0BA", "\uB0BA"], /* Hangul Syllable */
+ ["\uB0BB", "\uB0BB"], /* Hangul Syllable */
+ ["\uB0BC", "\uB0BC"], /* Hangul Syllable */
+ ["\uB0BD", "\uB0BD"], /* Hangul Syllable */
+ ["\uB0BE", "\uB0BE"], /* Hangul Syllable */
+ ["\uB0BF", "\uB0BF"], /* Hangul Syllable */
+ ["\uB0C0", "\uB0C0"], /* Hangul Syllable */
+ ["\uB0C1", "\uB0C1"], /* Hangul Syllable */
+ ["\uB0C2", "\uB0C2"], /* Hangul Syllable */
+ ["\uB0C3", "\uB0C3"], /* Hangul Syllable */
+ ["\uB0C4", "\uB0C4"], /* Hangul Syllable */
+ ["\uB0C5", "\uB0C5"], /* Hangul Syllable */
+ ["\uB0C6", "\uB0C6"], /* Hangul Syllable */
+ ["\uB0C7", "\uB0C7"], /* Hangul Syllable */
+ ["\uB0C8", "\uB0C8"], /* Hangul Syllable */
+ ["\uB0C9", "\uB0C9"], /* Hangul Syllable */
+ ["\uB0CA", "\uB0CA"], /* Hangul Syllable */
+ ["\uB0CB", "\uB0CB"], /* Hangul Syllable */
+ ["\uB0CC", "\uB0CC"], /* Hangul Syllable */
+ ["\uB0CD", "\uB0CD"], /* Hangul Syllable */
+ ["\uB0CE", "\uB0CE"], /* Hangul Syllable */
+ ["\uB0CF", "\uB0CF"], /* Hangul Syllable */
+ ["\uB0D0", "\uB0D0"], /* Hangul Syllable */
+ ["\uB0D1", "\uB0D1"], /* Hangul Syllable */
+ ["\uB0D2", "\uB0D2"], /* Hangul Syllable */
+ ["\uB0D3", "\uB0D3"], /* Hangul Syllable */
+ ["\uB0D4", "\uB0D4"], /* Hangul Syllable */
+ ["\uB0D5", "\uB0D5"], /* Hangul Syllable */
+ ["\uB0D6", "\uB0D6"], /* Hangul Syllable */
+ ["\uB0D7", "\uB0D7"], /* Hangul Syllable */
+ ["\uB0D8", "\uB0D8"], /* Hangul Syllable */
+ ["\uB0D9", "\uB0D9"], /* Hangul Syllable */
+ ["\uB0DA", "\uB0DA"], /* Hangul Syllable */
+ ["\uB0DB", "\uB0DB"], /* Hangul Syllable */
+ ["\uB0DC", "\uB0DC"], /* Hangul Syllable */
+ ["\uB0DD", "\uB0DD"], /* Hangul Syllable */
+ ["\uB0DE", "\uB0DE"], /* Hangul Syllable */
+ ["\uB0DF", "\uB0DF"], /* Hangul Syllable */
+ ["\uB0E0", "\uB0E0"], /* Hangul Syllable */
+ ["\uB0E1", "\uB0E1"], /* Hangul Syllable */
+ ["\uB0E2", "\uB0E2"], /* Hangul Syllable */
+ ["\uB0E3", "\uB0E3"], /* Hangul Syllable */
+ ["\uB0E4", "\uB0E4"], /* Hangul Syllable */
+ ["\uB0E5", "\uB0E5"], /* Hangul Syllable */
+ ["\uB0E6", "\uB0E6"], /* Hangul Syllable */
+ ["\uB0E7", "\uB0E7"], /* Hangul Syllable */
+ ["\uB0E8", "\uB0E8"], /* Hangul Syllable */
+ ["\uB0E9", "\uB0E9"], /* Hangul Syllable */
+ ["\uB0EA", "\uB0EA"], /* Hangul Syllable */
+ ["\uB0EB", "\uB0EB"], /* Hangul Syllable */
+ ["\uB0EC", "\uB0EC"], /* Hangul Syllable */
+ ["\uB0ED", "\uB0ED"], /* Hangul Syllable */
+ ["\uB0EE", "\uB0EE"], /* Hangul Syllable */
+ ["\uB0EF", "\uB0EF"], /* Hangul Syllable */
+ ["\uB0F0", "\uB0F0"], /* Hangul Syllable */
+ ["\uB0F1", "\uB0F1"], /* Hangul Syllable */
+ ["\uB0F2", "\uB0F2"], /* Hangul Syllable */
+ ["\uB0F3", "\uB0F3"], /* Hangul Syllable */
+ ["\uB0F4", "\uB0F4"], /* Hangul Syllable */
+ ["\uB0F5", "\uB0F5"], /* Hangul Syllable */
+ ["\uB0F6", "\uB0F6"], /* Hangul Syllable */
+ ["\uB0F7", "\uB0F7"], /* Hangul Syllable */
+ ["\uB0F8", "\uB0F8"], /* Hangul Syllable */
+ ["\uB0F9", "\uB0F9"], /* Hangul Syllable */
+ ["\uB0FA", "\uB0FA"], /* Hangul Syllable */
+ ["\uB0FB", "\uB0FB"], /* Hangul Syllable */
+ ["\uB0FC", "\uB0FC"], /* Hangul Syllable */
+ ["\uB0FD", "\uB0FD"], /* Hangul Syllable */
+ ["\uB0FE", "\uB0FE"], /* Hangul Syllable */
+ ["\uB0FF", "\uB0FF"], /* Hangul Syllable */
+ ["\uB100", "\uB100"], /* Hangul Syllable */
+ ["\uB101", "\uB101"], /* Hangul Syllable */
+ ["\uB102", "\uB102"], /* Hangul Syllable */
+ ["\uB103", "\uB103"], /* Hangul Syllable */
+ ["\uB104", "\uB104"], /* Hangul Syllable */
+ ["\uB105", "\uB105"], /* Hangul Syllable */
+ ["\uB106", "\uB106"], /* Hangul Syllable */
+ ["\uB107", "\uB107"], /* Hangul Syllable */
+ ["\uB108", "\uB108"], /* Hangul Syllable */
+ ["\uB109", "\uB109"], /* Hangul Syllable */
+ ["\uB10A", "\uB10A"], /* Hangul Syllable */
+ ["\uB10B", "\uB10B"], /* Hangul Syllable */
+ ["\uB10C", "\uB10C"], /* Hangul Syllable */
+ ["\uB10D", "\uB10D"], /* Hangul Syllable */
+ ["\uB10E", "\uB10E"], /* Hangul Syllable */
+ ["\uB10F", "\uB10F"], /* Hangul Syllable */
+ ["\uB110", "\uB110"], /* Hangul Syllable */
+ ["\uB111", "\uB111"], /* Hangul Syllable */
+ ["\uB112", "\uB112"], /* Hangul Syllable */
+ ["\uB113", "\uB113"], /* Hangul Syllable */
+ ["\uB114", "\uB114"], /* Hangul Syllable */
+ ["\uB115", "\uB115"], /* Hangul Syllable */
+ ["\uB116", "\uB116"], /* Hangul Syllable */
+ ["\uB117", "\uB117"], /* Hangul Syllable */
+ ["\uB118", "\uB118"], /* Hangul Syllable */
+ ["\uB119", "\uB119"], /* Hangul Syllable */
+ ["\uB11A", "\uB11A"], /* Hangul Syllable */
+ ["\uB11B", "\uB11B"], /* Hangul Syllable */
+ ["\uB11C", "\uB11C"], /* Hangul Syllable */
+ ["\uB11D", "\uB11D"], /* Hangul Syllable */
+ ["\uB11E", "\uB11E"], /* Hangul Syllable */
+ ["\uB11F", "\uB11F"], /* Hangul Syllable */
+ ["\uB120", "\uB120"], /* Hangul Syllable */
+ ["\uB121", "\uB121"], /* Hangul Syllable */
+ ["\uB122", "\uB122"], /* Hangul Syllable */
+ ["\uB123", "\uB123"], /* Hangul Syllable */
+ ["\uB124", "\uB124"], /* Hangul Syllable */
+ ["\uB125", "\uB125"], /* Hangul Syllable */
+ ["\uB126", "\uB126"], /* Hangul Syllable */
+ ["\uB127", "\uB127"], /* Hangul Syllable */
+ ["\uB128", "\uB128"], /* Hangul Syllable */
+ ["\uB129", "\uB129"], /* Hangul Syllable */
+ ["\uB12A", "\uB12A"], /* Hangul Syllable */
+ ["\uB12B", "\uB12B"], /* Hangul Syllable */
+ ["\uB12C", "\uB12C"], /* Hangul Syllable */
+ ["\uB12D", "\uB12D"], /* Hangul Syllable */
+ ["\uB12E", "\uB12E"], /* Hangul Syllable */
+ ["\uB12F", "\uB12F"], /* Hangul Syllable */
+ ["\uB130", "\uB130"], /* Hangul Syllable */
+ ["\uB131", "\uB131"], /* Hangul Syllable */
+ ["\uB132", "\uB132"], /* Hangul Syllable */
+ ["\uB133", "\uB133"], /* Hangul Syllable */
+ ["\uB134", "\uB134"], /* Hangul Syllable */
+ ["\uB135", "\uB135"], /* Hangul Syllable */
+ ["\uB136", "\uB136"], /* Hangul Syllable */
+ ["\uB137", "\uB137"], /* Hangul Syllable */
+ ["\uB138", "\uB138"], /* Hangul Syllable */
+ ["\uB139", "\uB139"], /* Hangul Syllable */
+ ["\uB13A", "\uB13A"], /* Hangul Syllable */
+ ["\uB13B", "\uB13B"], /* Hangul Syllable */
+ ["\uB13C", "\uB13C"], /* Hangul Syllable */
+ ["\uB13D", "\uB13D"], /* Hangul Syllable */
+ ["\uB13E", "\uB13E"], /* Hangul Syllable */
+ ["\uB13F", "\uB13F"], /* Hangul Syllable */
+ ["\uB140", "\uB140"], /* Hangul Syllable */
+ ["\uB141", "\uB141"], /* Hangul Syllable */
+ ["\uB142", "\uB142"], /* Hangul Syllable */
+ ["\uB143", "\uB143"], /* Hangul Syllable */
+ ["\uB144", "\uB144"], /* Hangul Syllable */
+ ["\uB145", "\uB145"], /* Hangul Syllable */
+ ["\uB146", "\uB146"], /* Hangul Syllable */
+ ["\uB147", "\uB147"], /* Hangul Syllable */
+ ["\uB148", "\uB148"], /* Hangul Syllable */
+ ["\uB149", "\uB149"], /* Hangul Syllable */
+ ["\uB14A", "\uB14A"], /* Hangul Syllable */
+ ["\uB14B", "\uB14B"], /* Hangul Syllable */
+ ["\uB14C", "\uB14C"], /* Hangul Syllable */
+ ["\uB14D", "\uB14D"], /* Hangul Syllable */
+ ["\uB14E", "\uB14E"], /* Hangul Syllable */
+ ["\uB14F", "\uB14F"], /* Hangul Syllable */
+ ["\uB150", "\uB150"], /* Hangul Syllable */
+ ["\uB151", "\uB151"], /* Hangul Syllable */
+ ["\uB152", "\uB152"], /* Hangul Syllable */
+ ["\uB153", "\uB153"], /* Hangul Syllable */
+ ["\uB154", "\uB154"], /* Hangul Syllable */
+ ["\uB155", "\uB155"], /* Hangul Syllable */
+ ["\uB156", "\uB156"], /* Hangul Syllable */
+ ["\uB157", "\uB157"], /* Hangul Syllable */
+ ["\uB158", "\uB158"], /* Hangul Syllable */
+ ["\uB159", "\uB159"], /* Hangul Syllable */
+ ["\uB15A", "\uB15A"], /* Hangul Syllable */
+ ["\uB15B", "\uB15B"], /* Hangul Syllable */
+ ["\uB15C", "\uB15C"], /* Hangul Syllable */
+ ["\uB15D", "\uB15D"], /* Hangul Syllable */
+ ["\uB15E", "\uB15E"], /* Hangul Syllable */
+ ["\uB15F", "\uB15F"], /* Hangul Syllable */
+ ["\uB160", "\uB160"], /* Hangul Syllable */
+ ["\uB161", "\uB161"], /* Hangul Syllable */
+ ["\uB162", "\uB162"], /* Hangul Syllable */
+ ["\uB163", "\uB163"], /* Hangul Syllable */
+ ["\uB164", "\uB164"], /* Hangul Syllable */
+ ["\uB165", "\uB165"], /* Hangul Syllable */
+ ["\uB166", "\uB166"], /* Hangul Syllable */
+ ["\uB167", "\uB167"], /* Hangul Syllable */
+ ["\uB168", "\uB168"], /* Hangul Syllable */
+ ["\uB169", "\uB169"], /* Hangul Syllable */
+ ["\uB16A", "\uB16A"], /* Hangul Syllable */
+ ["\uB16B", "\uB16B"], /* Hangul Syllable */
+ ["\uB16C", "\uB16C"], /* Hangul Syllable */
+ ["\uB16D", "\uB16D"], /* Hangul Syllable */
+ ["\uB16E", "\uB16E"], /* Hangul Syllable */
+ ["\uB16F", "\uB16F"], /* Hangul Syllable */
+ ["\uB170", "\uB170"], /* Hangul Syllable */
+ ["\uB171", "\uB171"], /* Hangul Syllable */
+ ["\uB172", "\uB172"], /* Hangul Syllable */
+ ["\uB173", "\uB173"], /* Hangul Syllable */
+ ["\uB174", "\uB174"], /* Hangul Syllable */
+ ["\uB175", "\uB175"], /* Hangul Syllable */
+ ["\uB176", "\uB176"], /* Hangul Syllable */
+ ["\uB177", "\uB177"], /* Hangul Syllable */
+ ["\uB178", "\uB178"], /* Hangul Syllable */
+ ["\uB179", "\uB179"], /* Hangul Syllable */
+ ["\uB17A", "\uB17A"], /* Hangul Syllable */
+ ["\uB17B", "\uB17B"], /* Hangul Syllable */
+ ["\uB17C", "\uB17C"], /* Hangul Syllable */
+ ["\uB17D", "\uB17D"], /* Hangul Syllable */
+ ["\uB17E", "\uB17E"], /* Hangul Syllable */
+ ["\uB17F", "\uB17F"], /* Hangul Syllable */
+ ["\uB180", "\uB180"], /* Hangul Syllable */
+ ["\uB181", "\uB181"], /* Hangul Syllable */
+ ["\uB182", "\uB182"], /* Hangul Syllable */
+ ["\uB183", "\uB183"], /* Hangul Syllable */
+ ["\uB184", "\uB184"], /* Hangul Syllable */
+ ["\uB185", "\uB185"], /* Hangul Syllable */
+ ["\uB186", "\uB186"], /* Hangul Syllable */
+ ["\uB187", "\uB187"], /* Hangul Syllable */
+ ["\uB188", "\uB188"], /* Hangul Syllable */
+ ["\uB189", "\uB189"], /* Hangul Syllable */
+ ["\uB18A", "\uB18A"], /* Hangul Syllable */
+ ["\uB18B", "\uB18B"], /* Hangul Syllable */
+ ["\uB18C", "\uB18C"], /* Hangul Syllable */
+ ["\uB18D", "\uB18D"], /* Hangul Syllable */
+ ["\uB18E", "\uB18E"], /* Hangul Syllable */
+ ["\uB18F", "\uB18F"], /* Hangul Syllable */
+ ["\uB190", "\uB190"], /* Hangul Syllable */
+ ["\uB191", "\uB191"], /* Hangul Syllable */
+ ["\uB192", "\uB192"], /* Hangul Syllable */
+ ["\uB193", "\uB193"], /* Hangul Syllable */
+ ["\uB194", "\uB194"], /* Hangul Syllable */
+ ["\uB195", "\uB195"], /* Hangul Syllable */
+ ["\uB196", "\uB196"], /* Hangul Syllable */
+ ["\uB197", "\uB197"], /* Hangul Syllable */
+ ["\uB198", "\uB198"], /* Hangul Syllable */
+ ["\uB199", "\uB199"], /* Hangul Syllable */
+ ["\uB19A", "\uB19A"], /* Hangul Syllable */
+ ["\uB19B", "\uB19B"], /* Hangul Syllable */
+ ["\uB19C", "\uB19C"], /* Hangul Syllable */
+ ["\uB19D", "\uB19D"], /* Hangul Syllable */
+ ["\uB19E", "\uB19E"], /* Hangul Syllable */
+ ["\uB19F", "\uB19F"], /* Hangul Syllable */
+ ["\uB1A0", "\uB1A0"], /* Hangul Syllable */
+ ["\uB1A1", "\uB1A1"], /* Hangul Syllable */
+ ["\uB1A2", "\uB1A2"], /* Hangul Syllable */
+ ["\uB1A3", "\uB1A3"], /* Hangul Syllable */
+ ["\uB1A4", "\uB1A4"], /* Hangul Syllable */
+ ["\uB1A5", "\uB1A5"], /* Hangul Syllable */
+ ["\uB1A6", "\uB1A6"], /* Hangul Syllable */
+ ["\uB1A7", "\uB1A7"], /* Hangul Syllable */
+ ["\uB1A8", "\uB1A8"], /* Hangul Syllable */
+ ["\uB1A9", "\uB1A9"], /* Hangul Syllable */
+ ["\uB1AA", "\uB1AA"], /* Hangul Syllable */
+ ["\uB1AB", "\uB1AB"], /* Hangul Syllable */
+ ["\uB1AC", "\uB1AC"], /* Hangul Syllable */
+ ["\uB1AD", "\uB1AD"], /* Hangul Syllable */
+ ["\uB1AE", "\uB1AE"], /* Hangul Syllable */
+ ["\uB1AF", "\uB1AF"], /* Hangul Syllable */
+ ["\uB1B0", "\uB1B0"], /* Hangul Syllable */
+ ["\uB1B1", "\uB1B1"], /* Hangul Syllable */
+ ["\uB1B2", "\uB1B2"], /* Hangul Syllable */
+ ["\uB1B3", "\uB1B3"], /* Hangul Syllable */
+ ["\uB1B4", "\uB1B4"], /* Hangul Syllable */
+ ["\uB1B5", "\uB1B5"], /* Hangul Syllable */
+ ["\uB1B6", "\uB1B6"], /* Hangul Syllable */
+ ["\uB1B7", "\uB1B7"], /* Hangul Syllable */
+ ["\uB1B8", "\uB1B8"], /* Hangul Syllable */
+ ["\uB1B9", "\uB1B9"], /* Hangul Syllable */
+ ["\uB1BA", "\uB1BA"], /* Hangul Syllable */
+ ["\uB1BB", "\uB1BB"], /* Hangul Syllable */
+ ["\uB1BC", "\uB1BC"], /* Hangul Syllable */
+ ["\uB1BD", "\uB1BD"], /* Hangul Syllable */
+ ["\uB1BE", "\uB1BE"], /* Hangul Syllable */
+ ["\uB1BF", "\uB1BF"], /* Hangul Syllable */
+ ["\uB1C0", "\uB1C0"], /* Hangul Syllable */
+ ["\uB1C1", "\uB1C1"], /* Hangul Syllable */
+ ["\uB1C2", "\uB1C2"], /* Hangul Syllable */
+ ["\uB1C3", "\uB1C3"], /* Hangul Syllable */
+ ["\uB1C4", "\uB1C4"], /* Hangul Syllable */
+ ["\uB1C5", "\uB1C5"], /* Hangul Syllable */
+ ["\uB1C6", "\uB1C6"], /* Hangul Syllable */
+ ["\uB1C7", "\uB1C7"], /* Hangul Syllable */
+ ["\uB1C8", "\uB1C8"], /* Hangul Syllable */
+ ["\uB1C9", "\uB1C9"], /* Hangul Syllable */
+ ["\uB1CA", "\uB1CA"], /* Hangul Syllable */
+ ["\uB1CB", "\uB1CB"], /* Hangul Syllable */
+ ["\uB1CC", "\uB1CC"], /* Hangul Syllable */
+ ["\uB1CD", "\uB1CD"], /* Hangul Syllable */
+ ["\uB1CE", "\uB1CE"], /* Hangul Syllable */
+ ["\uB1CF", "\uB1CF"], /* Hangul Syllable */
+ ["\uB1D0", "\uB1D0"], /* Hangul Syllable */
+ ["\uB1D1", "\uB1D1"], /* Hangul Syllable */
+ ["\uB1D2", "\uB1D2"], /* Hangul Syllable */
+ ["\uB1D3", "\uB1D3"], /* Hangul Syllable */
+ ["\uB1D4", "\uB1D4"], /* Hangul Syllable */
+ ["\uB1D5", "\uB1D5"], /* Hangul Syllable */
+ ["\uB1D6", "\uB1D6"], /* Hangul Syllable */
+ ["\uB1D7", "\uB1D7"], /* Hangul Syllable */
+ ["\uB1D8", "\uB1D8"], /* Hangul Syllable */
+ ["\uB1D9", "\uB1D9"], /* Hangul Syllable */
+ ["\uB1DA", "\uB1DA"], /* Hangul Syllable */
+ ["\uB1DB", "\uB1DB"], /* Hangul Syllable */
+ ["\uB1DC", "\uB1DC"], /* Hangul Syllable */
+ ["\uB1DD", "\uB1DD"], /* Hangul Syllable */
+ ["\uB1DE", "\uB1DE"], /* Hangul Syllable */
+ ["\uB1DF", "\uB1DF"], /* Hangul Syllable */
+ ["\uB1E0", "\uB1E0"], /* Hangul Syllable */
+ ["\uB1E1", "\uB1E1"], /* Hangul Syllable */
+ ["\uB1E2", "\uB1E2"], /* Hangul Syllable */
+ ["\uB1E3", "\uB1E3"], /* Hangul Syllable */
+ ["\uB1E4", "\uB1E4"], /* Hangul Syllable */
+ ["\uB1E5", "\uB1E5"], /* Hangul Syllable */
+ ["\uB1E6", "\uB1E6"], /* Hangul Syllable */
+ ["\uB1E7", "\uB1E7"], /* Hangul Syllable */
+ ["\uB1E8", "\uB1E8"], /* Hangul Syllable */
+ ["\uB1E9", "\uB1E9"], /* Hangul Syllable */
+ ["\uB1EA", "\uB1EA"], /* Hangul Syllable */
+ ["\uB1EB", "\uB1EB"], /* Hangul Syllable */
+ ["\uB1EC", "\uB1EC"], /* Hangul Syllable */
+ ["\uB1ED", "\uB1ED"], /* Hangul Syllable */
+ ["\uB1EE", "\uB1EE"], /* Hangul Syllable */
+ ["\uB1EF", "\uB1EF"], /* Hangul Syllable */
+ ["\uB1F0", "\uB1F0"], /* Hangul Syllable */
+ ["\uB1F1", "\uB1F1"], /* Hangul Syllable */
+ ["\uB1F2", "\uB1F2"], /* Hangul Syllable */
+ ["\uB1F3", "\uB1F3"], /* Hangul Syllable */
+ ["\uB1F4", "\uB1F4"], /* Hangul Syllable */
+ ["\uB1F5", "\uB1F5"], /* Hangul Syllable */
+ ["\uB1F6", "\uB1F6"], /* Hangul Syllable */
+ ["\uB1F7", "\uB1F7"], /* Hangul Syllable */
+ ["\uB1F8", "\uB1F8"], /* Hangul Syllable */
+ ["\uB1F9", "\uB1F9"], /* Hangul Syllable */
+ ["\uB1FA", "\uB1FA"], /* Hangul Syllable */
+ ["\uB1FB", "\uB1FB"], /* Hangul Syllable */
+ ["\uB1FC", "\uB1FC"], /* Hangul Syllable */
+ ["\uB1FD", "\uB1FD"], /* Hangul Syllable */
+ ["\uB1FE", "\uB1FE"], /* Hangul Syllable */
+ ["\uB1FF", "\uB1FF"], /* Hangul Syllable */
+ ["\uB200", "\uB200"], /* Hangul Syllable */
+ ["\uB201", "\uB201"], /* Hangul Syllable */
+ ["\uB202", "\uB202"], /* Hangul Syllable */
+ ["\uB203", "\uB203"], /* Hangul Syllable */
+ ["\uB204", "\uB204"], /* Hangul Syllable */
+ ["\uB205", "\uB205"], /* Hangul Syllable */
+ ["\uB206", "\uB206"], /* Hangul Syllable */
+ ["\uB207", "\uB207"], /* Hangul Syllable */
+ ["\uB208", "\uB208"], /* Hangul Syllable */
+ ["\uB209", "\uB209"], /* Hangul Syllable */
+ ["\uB20A", "\uB20A"], /* Hangul Syllable */
+ ["\uB20B", "\uB20B"], /* Hangul Syllable */
+ ["\uB20C", "\uB20C"], /* Hangul Syllable */
+ ["\uB20D", "\uB20D"], /* Hangul Syllable */
+ ["\uB20E", "\uB20E"], /* Hangul Syllable */
+ ["\uB20F", "\uB20F"], /* Hangul Syllable */
+ ["\uB210", "\uB210"], /* Hangul Syllable */
+ ["\uB211", "\uB211"], /* Hangul Syllable */
+ ["\uB212", "\uB212"], /* Hangul Syllable */
+ ["\uB213", "\uB213"], /* Hangul Syllable */
+ ["\uB214", "\uB214"], /* Hangul Syllable */
+ ["\uB215", "\uB215"], /* Hangul Syllable */
+ ["\uB216", "\uB216"], /* Hangul Syllable */
+ ["\uB217", "\uB217"], /* Hangul Syllable */
+ ["\uB218", "\uB218"], /* Hangul Syllable */
+ ["\uB219", "\uB219"], /* Hangul Syllable */
+ ["\uB21A", "\uB21A"], /* Hangul Syllable */
+ ["\uB21B", "\uB21B"], /* Hangul Syllable */
+ ["\uB21C", "\uB21C"], /* Hangul Syllable */
+ ["\uB21D", "\uB21D"], /* Hangul Syllable */
+ ["\uB21E", "\uB21E"], /* Hangul Syllable */
+ ["\uB21F", "\uB21F"], /* Hangul Syllable */
+ ["\uB220", "\uB220"], /* Hangul Syllable */
+ ["\uB221", "\uB221"], /* Hangul Syllable */
+ ["\uB222", "\uB222"], /* Hangul Syllable */
+ ["\uB223", "\uB223"], /* Hangul Syllable */
+ ["\uB224", "\uB224"], /* Hangul Syllable */
+ ["\uB225", "\uB225"], /* Hangul Syllable */
+ ["\uB226", "\uB226"], /* Hangul Syllable */
+ ["\uB227", "\uB227"], /* Hangul Syllable */
+ ["\uB228", "\uB228"], /* Hangul Syllable */
+ ["\uB229", "\uB229"], /* Hangul Syllable */
+ ["\uB22A", "\uB22A"], /* Hangul Syllable */
+ ["\uB22B", "\uB22B"], /* Hangul Syllable */
+ ["\uB22C", "\uB22C"], /* Hangul Syllable */
+ ["\uB22D", "\uB22D"], /* Hangul Syllable */
+ ["\uB22E", "\uB22E"], /* Hangul Syllable */
+ ["\uB22F", "\uB22F"], /* Hangul Syllable */
+ ["\uB230", "\uB230"], /* Hangul Syllable */
+ ["\uB231", "\uB231"], /* Hangul Syllable */
+ ["\uB232", "\uB232"], /* Hangul Syllable */
+ ["\uB233", "\uB233"], /* Hangul Syllable */
+ ["\uB234", "\uB234"], /* Hangul Syllable */
+ ["\uB235", "\uB235"], /* Hangul Syllable */
+ ["\uB236", "\uB236"], /* Hangul Syllable */
+ ["\uB237", "\uB237"], /* Hangul Syllable */
+ ["\uB238", "\uB238"], /* Hangul Syllable */
+ ["\uB239", "\uB239"], /* Hangul Syllable */
+ ["\uB23A", "\uB23A"], /* Hangul Syllable */
+ ["\uB23B", "\uB23B"], /* Hangul Syllable */
+ ["\uB23C", "\uB23C"], /* Hangul Syllable */
+ ["\uB23D", "\uB23D"], /* Hangul Syllable */
+ ["\uB23E", "\uB23E"], /* Hangul Syllable */
+ ["\uB23F", "\uB23F"], /* Hangul Syllable */
+ ["\uB240", "\uB240"], /* Hangul Syllable */
+ ["\uB241", "\uB241"], /* Hangul Syllable */
+ ["\uB242", "\uB242"], /* Hangul Syllable */
+ ["\uB243", "\uB243"], /* Hangul Syllable */
+ ["\uB244", "\uB244"], /* Hangul Syllable */
+ ["\uB245", "\uB245"], /* Hangul Syllable */
+ ["\uB246", "\uB246"], /* Hangul Syllable */
+ ["\uB247", "\uB247"], /* Hangul Syllable */
+ ["\uB248", "\uB248"], /* Hangul Syllable */
+ ["\uB249", "\uB249"], /* Hangul Syllable */
+ ["\uB24A", "\uB24A"], /* Hangul Syllable */
+ ["\uB24B", "\uB24B"], /* Hangul Syllable */
+ ["\uB24C", "\uB24C"], /* Hangul Syllable */
+ ["\uB24D", "\uB24D"], /* Hangul Syllable */
+ ["\uB24E", "\uB24E"], /* Hangul Syllable */
+ ["\uB24F", "\uB24F"], /* Hangul Syllable */
+ ["\uB250", "\uB250"], /* Hangul Syllable */
+ ["\uB251", "\uB251"], /* Hangul Syllable */
+ ["\uB252", "\uB252"], /* Hangul Syllable */
+ ["\uB253", "\uB253"], /* Hangul Syllable */
+ ["\uB254", "\uB254"], /* Hangul Syllable */
+ ["\uB255", "\uB255"], /* Hangul Syllable */
+ ["\uB256", "\uB256"], /* Hangul Syllable */
+ ["\uB257", "\uB257"], /* Hangul Syllable */
+ ["\uB258", "\uB258"], /* Hangul Syllable */
+ ["\uB259", "\uB259"], /* Hangul Syllable */
+ ["\uB25A", "\uB25A"], /* Hangul Syllable */
+ ["\uB25B", "\uB25B"], /* Hangul Syllable */
+ ["\uB25C", "\uB25C"], /* Hangul Syllable */
+ ["\uB25D", "\uB25D"], /* Hangul Syllable */
+ ["\uB25E", "\uB25E"], /* Hangul Syllable */
+ ["\uB25F", "\uB25F"], /* Hangul Syllable */
+ ["\uB260", "\uB260"], /* Hangul Syllable */
+ ["\uB261", "\uB261"], /* Hangul Syllable */
+ ["\uB262", "\uB262"], /* Hangul Syllable */
+ ["\uB263", "\uB263"], /* Hangul Syllable */
+ ["\uB264", "\uB264"], /* Hangul Syllable */
+ ["\uB265", "\uB265"], /* Hangul Syllable */
+ ["\uB266", "\uB266"], /* Hangul Syllable */
+ ["\uB267", "\uB267"], /* Hangul Syllable */
+ ["\uB268", "\uB268"], /* Hangul Syllable */
+ ["\uB269", "\uB269"], /* Hangul Syllable */
+ ["\uB26A", "\uB26A"], /* Hangul Syllable */
+ ["\uB26B", "\uB26B"], /* Hangul Syllable */
+ ["\uB26C", "\uB26C"], /* Hangul Syllable */
+ ["\uB26D", "\uB26D"], /* Hangul Syllable */
+ ["\uB26E", "\uB26E"], /* Hangul Syllable */
+ ["\uB26F", "\uB26F"], /* Hangul Syllable */
+ ["\uB270", "\uB270"], /* Hangul Syllable */
+ ["\uB271", "\uB271"], /* Hangul Syllable */
+ ["\uB272", "\uB272"], /* Hangul Syllable */
+ ["\uB273", "\uB273"], /* Hangul Syllable */
+ ["\uB274", "\uB274"], /* Hangul Syllable */
+ ["\uB275", "\uB275"], /* Hangul Syllable */
+ ["\uB276", "\uB276"], /* Hangul Syllable */
+ ["\uB277", "\uB277"], /* Hangul Syllable */
+ ["\uB278", "\uB278"], /* Hangul Syllable */
+ ["\uB279", "\uB279"], /* Hangul Syllable */
+ ["\uB27A", "\uB27A"], /* Hangul Syllable */
+ ["\uB27B", "\uB27B"], /* Hangul Syllable */
+ ["\uB27C", "\uB27C"], /* Hangul Syllable */
+ ["\uB27D", "\uB27D"], /* Hangul Syllable */
+ ["\uB27E", "\uB27E"], /* Hangul Syllable */
+ ["\uB27F", "\uB27F"], /* Hangul Syllable */
+ ["\uB280", "\uB280"], /* Hangul Syllable */
+ ["\uB281", "\uB281"], /* Hangul Syllable */
+ ["\uB282", "\uB282"], /* Hangul Syllable */
+ ["\uB283", "\uB283"], /* Hangul Syllable */
+ ["\uB284", "\uB284"], /* Hangul Syllable */
+ ["\uB285", "\uB285"], /* Hangul Syllable */
+ ["\uB286", "\uB286"], /* Hangul Syllable */
+ ["\uB287", "\uB287"], /* Hangul Syllable */
+ ["\uB288", "\uB288"], /* Hangul Syllable */
+ ["\uB289", "\uB289"], /* Hangul Syllable */
+ ["\uB28A", "\uB28A"], /* Hangul Syllable */
+ ["\uB28B", "\uB28B"], /* Hangul Syllable */
+ ["\uB28C", "\uB28C"], /* Hangul Syllable */
+ ["\uB28D", "\uB28D"], /* Hangul Syllable */
+ ["\uB28E", "\uB28E"], /* Hangul Syllable */
+ ["\uB28F", "\uB28F"], /* Hangul Syllable */
+ ["\uB290", "\uB290"], /* Hangul Syllable */
+ ["\uB291", "\uB291"], /* Hangul Syllable */
+ ["\uB292", "\uB292"], /* Hangul Syllable */
+ ["\uB293", "\uB293"], /* Hangul Syllable */
+ ["\uB294", "\uB294"], /* Hangul Syllable */
+ ["\uB295", "\uB295"], /* Hangul Syllable */
+ ["\uB296", "\uB296"], /* Hangul Syllable */
+ ["\uB297", "\uB297"], /* Hangul Syllable */
+ ["\uB298", "\uB298"], /* Hangul Syllable */
+ ["\uB299", "\uB299"], /* Hangul Syllable */
+ ["\uB29A", "\uB29A"], /* Hangul Syllable */
+ ["\uB29B", "\uB29B"], /* Hangul Syllable */
+ ["\uB29C", "\uB29C"], /* Hangul Syllable */
+ ["\uB29D", "\uB29D"], /* Hangul Syllable */
+ ["\uB29E", "\uB29E"], /* Hangul Syllable */
+ ["\uB29F", "\uB29F"], /* Hangul Syllable */
+ ["\uB2A0", "\uB2A0"], /* Hangul Syllable */
+ ["\uB2A1", "\uB2A1"], /* Hangul Syllable */
+ ["\uB2A2", "\uB2A2"], /* Hangul Syllable */
+ ["\uB2A3", "\uB2A3"], /* Hangul Syllable */
+ ["\uB2A4", "\uB2A4"], /* Hangul Syllable */
+ ["\uB2A5", "\uB2A5"], /* Hangul Syllable */
+ ["\uB2A6", "\uB2A6"], /* Hangul Syllable */
+ ["\uB2A7", "\uB2A7"], /* Hangul Syllable */
+ ["\uB2A8", "\uB2A8"], /* Hangul Syllable */
+ ["\uB2A9", "\uB2A9"], /* Hangul Syllable */
+ ["\uB2AA", "\uB2AA"], /* Hangul Syllable */
+ ["\uB2AB", "\uB2AB"], /* Hangul Syllable */
+ ["\uB2AC", "\uB2AC"], /* Hangul Syllable */
+ ["\uB2AD", "\uB2AD"], /* Hangul Syllable */
+ ["\uB2AE", "\uB2AE"], /* Hangul Syllable */
+ ["\uB2AF", "\uB2AF"], /* Hangul Syllable */
+ ["\uB2B0", "\uB2B0"], /* Hangul Syllable */
+ ["\uB2B1", "\uB2B1"], /* Hangul Syllable */
+ ["\uB2B2", "\uB2B2"], /* Hangul Syllable */
+ ["\uB2B3", "\uB2B3"], /* Hangul Syllable */
+ ["\uB2B4", "\uB2B4"], /* Hangul Syllable */
+ ["\uB2B5", "\uB2B5"], /* Hangul Syllable */
+ ["\uB2B6", "\uB2B6"], /* Hangul Syllable */
+ ["\uB2B7", "\uB2B7"], /* Hangul Syllable */
+ ["\uB2B8", "\uB2B8"], /* Hangul Syllable */
+ ["\uB2B9", "\uB2B9"], /* Hangul Syllable */
+ ["\uB2BA", "\uB2BA"], /* Hangul Syllable */
+ ["\uB2BB", "\uB2BB"], /* Hangul Syllable */
+ ["\uB2BC", "\uB2BC"], /* Hangul Syllable */
+ ["\uB2BD", "\uB2BD"], /* Hangul Syllable */
+ ["\uB2BE", "\uB2BE"], /* Hangul Syllable */
+ ["\uB2BF", "\uB2BF"], /* Hangul Syllable */
+ ["\uB2C0", "\uB2C0"], /* Hangul Syllable */
+ ["\uB2C1", "\uB2C1"], /* Hangul Syllable */
+ ["\uB2C2", "\uB2C2"], /* Hangul Syllable */
+ ["\uB2C3", "\uB2C3"], /* Hangul Syllable */
+ ["\uB2C4", "\uB2C4"], /* Hangul Syllable */
+ ["\uB2C5", "\uB2C5"], /* Hangul Syllable */
+ ["\uB2C6", "\uB2C6"], /* Hangul Syllable */
+ ["\uB2C7", "\uB2C7"], /* Hangul Syllable */
+ ["\uB2C8", "\uB2C8"], /* Hangul Syllable */
+ ["\uB2C9", "\uB2C9"], /* Hangul Syllable */
+ ["\uB2CA", "\uB2CA"], /* Hangul Syllable */
+ ["\uB2CB", "\uB2CB"], /* Hangul Syllable */
+ ["\uB2CC", "\uB2CC"], /* Hangul Syllable */
+ ["\uB2CD", "\uB2CD"], /* Hangul Syllable */
+ ["\uB2CE", "\uB2CE"], /* Hangul Syllable */
+ ["\uB2CF", "\uB2CF"], /* Hangul Syllable */
+ ["\uB2D0", "\uB2D0"], /* Hangul Syllable */
+ ["\uB2D1", "\uB2D1"], /* Hangul Syllable */
+ ["\uB2D2", "\uB2D2"], /* Hangul Syllable */
+ ["\uB2D3", "\uB2D3"], /* Hangul Syllable */
+ ["\uB2D4", "\uB2D4"], /* Hangul Syllable */
+ ["\uB2D5", "\uB2D5"], /* Hangul Syllable */
+ ["\uB2D6", "\uB2D6"], /* Hangul Syllable */
+ ["\uB2D7", "\uB2D7"], /* Hangul Syllable */
+ ["\uB2D8", "\uB2D8"], /* Hangul Syllable */
+ ["\uB2D9", "\uB2D9"], /* Hangul Syllable */
+ ["\uB2DA", "\uB2DA"], /* Hangul Syllable */
+ ["\uB2DB", "\uB2DB"], /* Hangul Syllable */
+ ["\uB2DC", "\uB2DC"], /* Hangul Syllable */
+ ["\uB2DD", "\uB2DD"], /* Hangul Syllable */
+ ["\uB2DE", "\uB2DE"], /* Hangul Syllable */
+ ["\uB2DF", "\uB2DF"], /* Hangul Syllable */
+ ["\uB2E0", "\uB2E0"], /* Hangul Syllable */
+ ["\uB2E1", "\uB2E1"], /* Hangul Syllable */
+ ["\uB2E2", "\uB2E2"], /* Hangul Syllable */
+ ["\uB2E3", "\uB2E3"], /* Hangul Syllable */
+ ["\uB2E4", "\uB2E4"], /* Hangul Syllable */
+ ["\uB2E5", "\uB2E5"], /* Hangul Syllable */
+ ["\uB2E6", "\uB2E6"], /* Hangul Syllable */
+ ["\uB2E7", "\uB2E7"], /* Hangul Syllable */
+ ["\uB2E8", "\uB2E8"], /* Hangul Syllable */
+ ["\uB2E9", "\uB2E9"], /* Hangul Syllable */
+ ["\uB2EA", "\uB2EA"], /* Hangul Syllable */
+ ["\uB2EB", "\uB2EB"], /* Hangul Syllable */
+ ["\uB2EC", "\uB2EC"], /* Hangul Syllable */
+ ["\uB2ED", "\uB2ED"], /* Hangul Syllable */
+ ["\uB2EE", "\uB2EE"], /* Hangul Syllable */
+ ["\uB2EF", "\uB2EF"], /* Hangul Syllable */
+ ["\uB2F0", "\uB2F0"], /* Hangul Syllable */
+ ["\uB2F1", "\uB2F1"], /* Hangul Syllable */
+ ["\uB2F2", "\uB2F2"], /* Hangul Syllable */
+ ["\uB2F3", "\uB2F3"], /* Hangul Syllable */
+ ["\uB2F4", "\uB2F4"], /* Hangul Syllable */
+ ["\uB2F5", "\uB2F5"], /* Hangul Syllable */
+ ["\uB2F6", "\uB2F6"], /* Hangul Syllable */
+ ["\uB2F7", "\uB2F7"], /* Hangul Syllable */
+ ["\uB2F8", "\uB2F8"], /* Hangul Syllable */
+ ["\uB2F9", "\uB2F9"], /* Hangul Syllable */
+ ["\uB2FA", "\uB2FA"], /* Hangul Syllable */
+ ["\uB2FB", "\uB2FB"], /* Hangul Syllable */
+ ["\uB2FC", "\uB2FC"], /* Hangul Syllable */
+ ["\uB2FD", "\uB2FD"], /* Hangul Syllable */
+ ["\uB2FE", "\uB2FE"], /* Hangul Syllable */
+ ["\uB2FF", "\uB2FF"], /* Hangul Syllable */
+ ["\uB300", "\uB300"], /* Hangul Syllable */
+ ["\uB301", "\uB301"], /* Hangul Syllable */
+ ["\uB302", "\uB302"], /* Hangul Syllable */
+ ["\uB303", "\uB303"], /* Hangul Syllable */
+ ["\uB304", "\uB304"], /* Hangul Syllable */
+ ["\uB305", "\uB305"], /* Hangul Syllable */
+ ["\uB306", "\uB306"], /* Hangul Syllable */
+ ["\uB307", "\uB307"], /* Hangul Syllable */
+ ["\uB308", "\uB308"], /* Hangul Syllable */
+ ["\uB309", "\uB309"], /* Hangul Syllable */
+ ["\uB30A", "\uB30A"], /* Hangul Syllable */
+ ["\uB30B", "\uB30B"], /* Hangul Syllable */
+ ["\uB30C", "\uB30C"], /* Hangul Syllable */
+ ["\uB30D", "\uB30D"], /* Hangul Syllable */
+ ["\uB30E", "\uB30E"], /* Hangul Syllable */
+ ["\uB30F", "\uB30F"], /* Hangul Syllable */
+ ["\uB310", "\uB310"], /* Hangul Syllable */
+ ["\uB311", "\uB311"], /* Hangul Syllable */
+ ["\uB312", "\uB312"], /* Hangul Syllable */
+ ["\uB313", "\uB313"], /* Hangul Syllable */
+ ["\uB314", "\uB314"], /* Hangul Syllable */
+ ["\uB315", "\uB315"], /* Hangul Syllable */
+ ["\uB316", "\uB316"], /* Hangul Syllable */
+ ["\uB317", "\uB317"], /* Hangul Syllable */
+ ["\uB318", "\uB318"], /* Hangul Syllable */
+ ["\uB319", "\uB319"], /* Hangul Syllable */
+ ["\uB31A", "\uB31A"], /* Hangul Syllable */
+ ["\uB31B", "\uB31B"], /* Hangul Syllable */
+ ["\uB31C", "\uB31C"], /* Hangul Syllable */
+ ["\uB31D", "\uB31D"], /* Hangul Syllable */
+ ["\uB31E", "\uB31E"], /* Hangul Syllable */
+ ["\uB31F", "\uB31F"], /* Hangul Syllable */
+ ["\uB320", "\uB320"], /* Hangul Syllable */
+ ["\uB321", "\uB321"], /* Hangul Syllable */
+ ["\uB322", "\uB322"], /* Hangul Syllable */
+ ["\uB323", "\uB323"], /* Hangul Syllable */
+ ["\uB324", "\uB324"], /* Hangul Syllable */
+ ["\uB325", "\uB325"], /* Hangul Syllable */
+ ["\uB326", "\uB326"], /* Hangul Syllable */
+ ["\uB327", "\uB327"], /* Hangul Syllable */
+ ["\uB328", "\uB328"], /* Hangul Syllable */
+ ["\uB329", "\uB329"], /* Hangul Syllable */
+ ["\uB32A", "\uB32A"], /* Hangul Syllable */
+ ["\uB32B", "\uB32B"], /* Hangul Syllable */
+ ["\uB32C", "\uB32C"], /* Hangul Syllable */
+ ["\uB32D", "\uB32D"], /* Hangul Syllable */
+ ["\uB32E", "\uB32E"], /* Hangul Syllable */
+ ["\uB32F", "\uB32F"], /* Hangul Syllable */
+ ["\uB330", "\uB330"], /* Hangul Syllable */
+ ["\uB331", "\uB331"], /* Hangul Syllable */
+ ["\uB332", "\uB332"], /* Hangul Syllable */
+ ["\uB333", "\uB333"], /* Hangul Syllable */
+ ["\uB334", "\uB334"], /* Hangul Syllable */
+ ["\uB335", "\uB335"], /* Hangul Syllable */
+ ["\uB336", "\uB336"], /* Hangul Syllable */
+ ["\uB337", "\uB337"], /* Hangul Syllable */
+ ["\uB338", "\uB338"], /* Hangul Syllable */
+ ["\uB339", "\uB339"], /* Hangul Syllable */
+ ["\uB33A", "\uB33A"], /* Hangul Syllable */
+ ["\uB33B", "\uB33B"], /* Hangul Syllable */
+ ["\uB33C", "\uB33C"], /* Hangul Syllable */
+ ["\uB33D", "\uB33D"], /* Hangul Syllable */
+ ["\uB33E", "\uB33E"], /* Hangul Syllable */
+ ["\uB33F", "\uB33F"], /* Hangul Syllable */
+ ["\uB340", "\uB340"], /* Hangul Syllable */
+ ["\uB341", "\uB341"], /* Hangul Syllable */
+ ["\uB342", "\uB342"], /* Hangul Syllable */
+ ["\uB343", "\uB343"], /* Hangul Syllable */
+ ["\uB344", "\uB344"], /* Hangul Syllable */
+ ["\uB345", "\uB345"], /* Hangul Syllable */
+ ["\uB346", "\uB346"], /* Hangul Syllable */
+ ["\uB347", "\uB347"], /* Hangul Syllable */
+ ["\uB348", "\uB348"], /* Hangul Syllable */
+ ["\uB349", "\uB349"], /* Hangul Syllable */
+ ["\uB34A", "\uB34A"], /* Hangul Syllable */
+ ["\uB34B", "\uB34B"], /* Hangul Syllable */
+ ["\uB34C", "\uB34C"], /* Hangul Syllable */
+ ["\uB34D", "\uB34D"], /* Hangul Syllable */
+ ["\uB34E", "\uB34E"], /* Hangul Syllable */
+ ["\uB34F", "\uB34F"], /* Hangul Syllable */
+ ["\uB350", "\uB350"], /* Hangul Syllable */
+ ["\uB351", "\uB351"], /* Hangul Syllable */
+ ["\uB352", "\uB352"], /* Hangul Syllable */
+ ["\uB353", "\uB353"], /* Hangul Syllable */
+ ["\uB354", "\uB354"], /* Hangul Syllable */
+ ["\uB355", "\uB355"], /* Hangul Syllable */
+ ["\uB356", "\uB356"], /* Hangul Syllable */
+ ["\uB357", "\uB357"], /* Hangul Syllable */
+ ["\uB358", "\uB358"], /* Hangul Syllable */
+ ["\uB359", "\uB359"], /* Hangul Syllable */
+ ["\uB35A", "\uB35A"], /* Hangul Syllable */
+ ["\uB35B", "\uB35B"], /* Hangul Syllable */
+ ["\uB35C", "\uB35C"], /* Hangul Syllable */
+ ["\uB35D", "\uB35D"], /* Hangul Syllable */
+ ["\uB35E", "\uB35E"], /* Hangul Syllable */
+ ["\uB35F", "\uB35F"], /* Hangul Syllable */
+ ["\uB360", "\uB360"], /* Hangul Syllable */
+ ["\uB361", "\uB361"], /* Hangul Syllable */
+ ["\uB362", "\uB362"], /* Hangul Syllable */
+ ["\uB363", "\uB363"], /* Hangul Syllable */
+ ["\uB364", "\uB364"], /* Hangul Syllable */
+ ["\uB365", "\uB365"], /* Hangul Syllable */
+ ["\uB366", "\uB366"], /* Hangul Syllable */
+ ["\uB367", "\uB367"], /* Hangul Syllable */
+ ["\uB368", "\uB368"], /* Hangul Syllable */
+ ["\uB369", "\uB369"], /* Hangul Syllable */
+ ["\uB36A", "\uB36A"], /* Hangul Syllable */
+ ["\uB36B", "\uB36B"], /* Hangul Syllable */
+ ["\uB36C", "\uB36C"], /* Hangul Syllable */
+ ["\uB36D", "\uB36D"], /* Hangul Syllable */
+ ["\uB36E", "\uB36E"], /* Hangul Syllable */
+ ["\uB36F", "\uB36F"], /* Hangul Syllable */
+ ["\uB370", "\uB370"], /* Hangul Syllable */
+ ["\uB371", "\uB371"], /* Hangul Syllable */
+ ["\uB372", "\uB372"], /* Hangul Syllable */
+ ["\uB373", "\uB373"], /* Hangul Syllable */
+ ["\uB374", "\uB374"], /* Hangul Syllable */
+ ["\uB375", "\uB375"], /* Hangul Syllable */
+ ["\uB376", "\uB376"], /* Hangul Syllable */
+ ["\uB377", "\uB377"], /* Hangul Syllable */
+ ["\uB378", "\uB378"], /* Hangul Syllable */
+ ["\uB379", "\uB379"], /* Hangul Syllable */
+ ["\uB37A", "\uB37A"], /* Hangul Syllable */
+ ["\uB37B", "\uB37B"], /* Hangul Syllable */
+ ["\uB37C", "\uB37C"], /* Hangul Syllable */
+ ["\uB37D", "\uB37D"], /* Hangul Syllable */
+ ["\uB37E", "\uB37E"], /* Hangul Syllable */
+ ["\uB37F", "\uB37F"], /* Hangul Syllable */
+ ["\uB380", "\uB380"], /* Hangul Syllable */
+ ["\uB381", "\uB381"], /* Hangul Syllable */
+ ["\uB382", "\uB382"], /* Hangul Syllable */
+ ["\uB383", "\uB383"], /* Hangul Syllable */
+ ["\uB384", "\uB384"], /* Hangul Syllable */
+ ["\uB385", "\uB385"], /* Hangul Syllable */
+ ["\uB386", "\uB386"], /* Hangul Syllable */
+ ["\uB387", "\uB387"], /* Hangul Syllable */
+ ["\uB388", "\uB388"], /* Hangul Syllable */
+ ["\uB389", "\uB389"], /* Hangul Syllable */
+ ["\uB38A", "\uB38A"], /* Hangul Syllable */
+ ["\uB38B", "\uB38B"], /* Hangul Syllable */
+ ["\uB38C", "\uB38C"], /* Hangul Syllable */
+ ["\uB38D", "\uB38D"], /* Hangul Syllable */
+ ["\uB38E", "\uB38E"], /* Hangul Syllable */
+ ["\uB38F", "\uB38F"], /* Hangul Syllable */
+ ["\uB390", "\uB390"], /* Hangul Syllable */
+ ["\uB391", "\uB391"], /* Hangul Syllable */
+ ["\uB392", "\uB392"], /* Hangul Syllable */
+ ["\uB393", "\uB393"], /* Hangul Syllable */
+ ["\uB394", "\uB394"], /* Hangul Syllable */
+ ["\uB395", "\uB395"], /* Hangul Syllable */
+ ["\uB396", "\uB396"], /* Hangul Syllable */
+ ["\uB397", "\uB397"], /* Hangul Syllable */
+ ["\uB398", "\uB398"], /* Hangul Syllable */
+ ["\uB399", "\uB399"], /* Hangul Syllable */
+ ["\uB39A", "\uB39A"], /* Hangul Syllable */
+ ["\uB39B", "\uB39B"], /* Hangul Syllable */
+ ["\uB39C", "\uB39C"], /* Hangul Syllable */
+ ["\uB39D", "\uB39D"], /* Hangul Syllable */
+ ["\uB39E", "\uB39E"], /* Hangul Syllable */
+ ["\uB39F", "\uB39F"], /* Hangul Syllable */
+ ["\uB3A0", "\uB3A0"], /* Hangul Syllable */
+ ["\uB3A1", "\uB3A1"], /* Hangul Syllable */
+ ["\uB3A2", "\uB3A2"], /* Hangul Syllable */
+ ["\uB3A3", "\uB3A3"], /* Hangul Syllable */
+ ["\uB3A4", "\uB3A4"], /* Hangul Syllable */
+ ["\uB3A5", "\uB3A5"], /* Hangul Syllable */
+ ["\uB3A6", "\uB3A6"], /* Hangul Syllable */
+ ["\uB3A7", "\uB3A7"], /* Hangul Syllable */
+ ["\uB3A8", "\uB3A8"], /* Hangul Syllable */
+ ["\uB3A9", "\uB3A9"], /* Hangul Syllable */
+ ["\uB3AA", "\uB3AA"], /* Hangul Syllable */
+ ["\uB3AB", "\uB3AB"], /* Hangul Syllable */
+ ["\uB3AC", "\uB3AC"], /* Hangul Syllable */
+ ["\uB3AD", "\uB3AD"], /* Hangul Syllable */
+ ["\uB3AE", "\uB3AE"], /* Hangul Syllable */
+ ["\uB3AF", "\uB3AF"], /* Hangul Syllable */
+ ["\uB3B0", "\uB3B0"], /* Hangul Syllable */
+ ["\uB3B1", "\uB3B1"], /* Hangul Syllable */
+ ["\uB3B2", "\uB3B2"], /* Hangul Syllable */
+ ["\uB3B3", "\uB3B3"], /* Hangul Syllable */
+ ["\uB3B4", "\uB3B4"], /* Hangul Syllable */
+ ["\uB3B5", "\uB3B5"], /* Hangul Syllable */
+ ["\uB3B6", "\uB3B6"], /* Hangul Syllable */
+ ["\uB3B7", "\uB3B7"], /* Hangul Syllable */
+ ["\uB3B8", "\uB3B8"], /* Hangul Syllable */
+ ["\uB3B9", "\uB3B9"], /* Hangul Syllable */
+ ["\uB3BA", "\uB3BA"], /* Hangul Syllable */
+ ["\uB3BB", "\uB3BB"], /* Hangul Syllable */
+ ["\uB3BC", "\uB3BC"], /* Hangul Syllable */
+ ["\uB3BD", "\uB3BD"], /* Hangul Syllable */
+ ["\uB3BE", "\uB3BE"], /* Hangul Syllable */
+ ["\uB3BF", "\uB3BF"], /* Hangul Syllable */
+ ["\uB3C0", "\uB3C0"], /* Hangul Syllable */
+ ["\uB3C1", "\uB3C1"], /* Hangul Syllable */
+ ["\uB3C2", "\uB3C2"], /* Hangul Syllable */
+ ["\uB3C3", "\uB3C3"], /* Hangul Syllable */
+ ["\uB3C4", "\uB3C4"], /* Hangul Syllable */
+ ["\uB3C5", "\uB3C5"], /* Hangul Syllable */
+ ["\uB3C6", "\uB3C6"], /* Hangul Syllable */
+ ["\uB3C7", "\uB3C7"], /* Hangul Syllable */
+ ["\uB3C8", "\uB3C8"], /* Hangul Syllable */
+ ["\uB3C9", "\uB3C9"], /* Hangul Syllable */
+ ["\uB3CA", "\uB3CA"], /* Hangul Syllable */
+ ["\uB3CB", "\uB3CB"], /* Hangul Syllable */
+ ["\uB3CC", "\uB3CC"], /* Hangul Syllable */
+ ["\uB3CD", "\uB3CD"], /* Hangul Syllable */
+ ["\uB3CE", "\uB3CE"], /* Hangul Syllable */
+ ["\uB3CF", "\uB3CF"], /* Hangul Syllable */
+ ["\uB3D0", "\uB3D0"], /* Hangul Syllable */
+ ["\uB3D1", "\uB3D1"], /* Hangul Syllable */
+ ["\uB3D2", "\uB3D2"], /* Hangul Syllable */
+ ["\uB3D3", "\uB3D3"], /* Hangul Syllable */
+ ["\uB3D4", "\uB3D4"], /* Hangul Syllable */
+ ["\uB3D5", "\uB3D5"], /* Hangul Syllable */
+ ["\uB3D6", "\uB3D6"], /* Hangul Syllable */
+ ["\uB3D7", "\uB3D7"], /* Hangul Syllable */
+ ["\uB3D8", "\uB3D8"], /* Hangul Syllable */
+ ["\uB3D9", "\uB3D9"], /* Hangul Syllable */
+ ["\uB3DA", "\uB3DA"], /* Hangul Syllable */
+ ["\uB3DB", "\uB3DB"], /* Hangul Syllable */
+ ["\uB3DC", "\uB3DC"], /* Hangul Syllable */
+ ["\uB3DD", "\uB3DD"], /* Hangul Syllable */
+ ["\uB3DE", "\uB3DE"], /* Hangul Syllable */
+ ["\uB3DF", "\uB3DF"], /* Hangul Syllable */
+ ["\uB3E0", "\uB3E0"], /* Hangul Syllable */
+ ["\uB3E1", "\uB3E1"], /* Hangul Syllable */
+ ["\uB3E2", "\uB3E2"], /* Hangul Syllable */
+ ["\uB3E3", "\uB3E3"], /* Hangul Syllable */
+ ["\uB3E4", "\uB3E4"], /* Hangul Syllable */
+ ["\uB3E5", "\uB3E5"], /* Hangul Syllable */
+ ["\uB3E6", "\uB3E6"], /* Hangul Syllable */
+ ["\uB3E7", "\uB3E7"], /* Hangul Syllable */
+ ["\uB3E8", "\uB3E8"], /* Hangul Syllable */
+ ["\uB3E9", "\uB3E9"], /* Hangul Syllable */
+ ["\uB3EA", "\uB3EA"], /* Hangul Syllable */
+ ["\uB3EB", "\uB3EB"], /* Hangul Syllable */
+ ["\uB3EC", "\uB3EC"], /* Hangul Syllable */
+ ["\uB3ED", "\uB3ED"], /* Hangul Syllable */
+ ["\uB3EE", "\uB3EE"], /* Hangul Syllable */
+ ["\uB3EF", "\uB3EF"], /* Hangul Syllable */
+ ["\uB3F0", "\uB3F0"], /* Hangul Syllable */
+ ["\uB3F1", "\uB3F1"], /* Hangul Syllable */
+ ["\uB3F2", "\uB3F2"], /* Hangul Syllable */
+ ["\uB3F3", "\uB3F3"], /* Hangul Syllable */
+ ["\uB3F4", "\uB3F4"], /* Hangul Syllable */
+ ["\uB3F5", "\uB3F5"], /* Hangul Syllable */
+ ["\uB3F6", "\uB3F6"], /* Hangul Syllable */
+ ["\uB3F7", "\uB3F7"], /* Hangul Syllable */
+ ["\uB3F8", "\uB3F8"], /* Hangul Syllable */
+ ["\uB3F9", "\uB3F9"], /* Hangul Syllable */
+ ["\uB3FA", "\uB3FA"], /* Hangul Syllable */
+ ["\uB3FB", "\uB3FB"], /* Hangul Syllable */
+ ["\uB3FC", "\uB3FC"], /* Hangul Syllable */
+ ["\uB3FD", "\uB3FD"], /* Hangul Syllable */
+ ["\uB3FE", "\uB3FE"], /* Hangul Syllable */
+ ["\uB3FF", "\uB3FF"], /* Hangul Syllable */
+ ["\uB400", "\uB400"], /* Hangul Syllable */
+ ["\uB401", "\uB401"], /* Hangul Syllable */
+ ["\uB402", "\uB402"], /* Hangul Syllable */
+ ["\uB403", "\uB403"], /* Hangul Syllable */
+ ["\uB404", "\uB404"], /* Hangul Syllable */
+ ["\uB405", "\uB405"], /* Hangul Syllable */
+ ["\uB406", "\uB406"], /* Hangul Syllable */
+ ["\uB407", "\uB407"], /* Hangul Syllable */
+ ["\uB408", "\uB408"], /* Hangul Syllable */
+ ["\uB409", "\uB409"], /* Hangul Syllable */
+ ["\uB40A", "\uB40A"], /* Hangul Syllable */
+ ["\uB40B", "\uB40B"], /* Hangul Syllable */
+ ["\uB40C", "\uB40C"], /* Hangul Syllable */
+ ["\uB40D", "\uB40D"], /* Hangul Syllable */
+ ["\uB40E", "\uB40E"], /* Hangul Syllable */
+ ["\uB40F", "\uB40F"], /* Hangul Syllable */
+ ["\uB410", "\uB410"], /* Hangul Syllable */
+ ["\uB411", "\uB411"], /* Hangul Syllable */
+ ["\uB412", "\uB412"], /* Hangul Syllable */
+ ["\uB413", "\uB413"], /* Hangul Syllable */
+ ["\uB414", "\uB414"], /* Hangul Syllable */
+ ["\uB415", "\uB415"], /* Hangul Syllable */
+ ["\uB416", "\uB416"], /* Hangul Syllable */
+ ["\uB417", "\uB417"], /* Hangul Syllable */
+ ["\uB418", "\uB418"], /* Hangul Syllable */
+ ["\uB419", "\uB419"], /* Hangul Syllable */
+ ["\uB41A", "\uB41A"], /* Hangul Syllable */
+ ["\uB41B", "\uB41B"], /* Hangul Syllable */
+ ["\uB41C", "\uB41C"], /* Hangul Syllable */
+ ["\uB41D", "\uB41D"], /* Hangul Syllable */
+ ["\uB41E", "\uB41E"], /* Hangul Syllable */
+ ["\uB41F", "\uB41F"], /* Hangul Syllable */
+ ["\uB420", "\uB420"], /* Hangul Syllable */
+ ["\uB421", "\uB421"], /* Hangul Syllable */
+ ["\uB422", "\uB422"], /* Hangul Syllable */
+ ["\uB423", "\uB423"], /* Hangul Syllable */
+ ["\uB424", "\uB424"], /* Hangul Syllable */
+ ["\uB425", "\uB425"], /* Hangul Syllable */
+ ["\uB426", "\uB426"], /* Hangul Syllable */
+ ["\uB427", "\uB427"], /* Hangul Syllable */
+ ["\uB428", "\uB428"], /* Hangul Syllable */
+ ["\uB429", "\uB429"], /* Hangul Syllable */
+ ["\uB42A", "\uB42A"], /* Hangul Syllable */
+ ["\uB42B", "\uB42B"], /* Hangul Syllable */
+ ["\uB42C", "\uB42C"], /* Hangul Syllable */
+ ["\uB42D", "\uB42D"], /* Hangul Syllable */
+ ["\uB42E", "\uB42E"], /* Hangul Syllable */
+ ["\uB42F", "\uB42F"], /* Hangul Syllable */
+ ["\uB430", "\uB430"], /* Hangul Syllable */
+ ["\uB431", "\uB431"], /* Hangul Syllable */
+ ["\uB432", "\uB432"], /* Hangul Syllable */
+ ["\uB433", "\uB433"], /* Hangul Syllable */
+ ["\uB434", "\uB434"], /* Hangul Syllable */
+ ["\uB435", "\uB435"], /* Hangul Syllable */
+ ["\uB436", "\uB436"], /* Hangul Syllable */
+ ["\uB437", "\uB437"], /* Hangul Syllable */
+ ["\uB438", "\uB438"], /* Hangul Syllable */
+ ["\uB439", "\uB439"], /* Hangul Syllable */
+ ["\uB43A", "\uB43A"], /* Hangul Syllable */
+ ["\uB43B", "\uB43B"], /* Hangul Syllable */
+ ["\uB43C", "\uB43C"], /* Hangul Syllable */
+ ["\uB43D", "\uB43D"], /* Hangul Syllable */
+ ["\uB43E", "\uB43E"], /* Hangul Syllable */
+ ["\uB43F", "\uB43F"], /* Hangul Syllable */
+ ["\uB440", "\uB440"], /* Hangul Syllable */
+ ["\uB441", "\uB441"], /* Hangul Syllable */
+ ["\uB442", "\uB442"], /* Hangul Syllable */
+ ["\uB443", "\uB443"], /* Hangul Syllable */
+ ["\uB444", "\uB444"], /* Hangul Syllable */
+ ["\uB445", "\uB445"], /* Hangul Syllable */
+ ["\uB446", "\uB446"], /* Hangul Syllable */
+ ["\uB447", "\uB447"], /* Hangul Syllable */
+ ["\uB448", "\uB448"], /* Hangul Syllable */
+ ["\uB449", "\uB449"], /* Hangul Syllable */
+ ["\uB44A", "\uB44A"], /* Hangul Syllable */
+ ["\uB44B", "\uB44B"], /* Hangul Syllable */
+ ["\uB44C", "\uB44C"], /* Hangul Syllable */
+ ["\uB44D", "\uB44D"], /* Hangul Syllable */
+ ["\uB44E", "\uB44E"], /* Hangul Syllable */
+ ["\uB44F", "\uB44F"], /* Hangul Syllable */
+ ["\uB450", "\uB450"], /* Hangul Syllable */
+ ["\uB451", "\uB451"], /* Hangul Syllable */
+ ["\uB452", "\uB452"], /* Hangul Syllable */
+ ["\uB453", "\uB453"], /* Hangul Syllable */
+ ["\uB454", "\uB454"], /* Hangul Syllable */
+ ["\uB455", "\uB455"], /* Hangul Syllable */
+ ["\uB456", "\uB456"], /* Hangul Syllable */
+ ["\uB457", "\uB457"], /* Hangul Syllable */
+ ["\uB458", "\uB458"], /* Hangul Syllable */
+ ["\uB459", "\uB459"], /* Hangul Syllable */
+ ["\uB45A", "\uB45A"], /* Hangul Syllable */
+ ["\uB45B", "\uB45B"], /* Hangul Syllable */
+ ["\uB45C", "\uB45C"], /* Hangul Syllable */
+ ["\uB45D", "\uB45D"], /* Hangul Syllable */
+ ["\uB45E", "\uB45E"], /* Hangul Syllable */
+ ["\uB45F", "\uB45F"], /* Hangul Syllable */
+ ["\uB460", "\uB460"], /* Hangul Syllable */
+ ["\uB461", "\uB461"], /* Hangul Syllable */
+ ["\uB462", "\uB462"], /* Hangul Syllable */
+ ["\uB463", "\uB463"], /* Hangul Syllable */
+ ["\uB464", "\uB464"], /* Hangul Syllable */
+ ["\uB465", "\uB465"], /* Hangul Syllable */
+ ["\uB466", "\uB466"], /* Hangul Syllable */
+ ["\uB467", "\uB467"], /* Hangul Syllable */
+ ["\uB468", "\uB468"], /* Hangul Syllable */
+ ["\uB469", "\uB469"], /* Hangul Syllable */
+ ["\uB46A", "\uB46A"], /* Hangul Syllable */
+ ["\uB46B", "\uB46B"], /* Hangul Syllable */
+ ["\uB46C", "\uB46C"], /* Hangul Syllable */
+ ["\uB46D", "\uB46D"], /* Hangul Syllable */
+ ["\uB46E", "\uB46E"], /* Hangul Syllable */
+ ["\uB46F", "\uB46F"], /* Hangul Syllable */
+ ["\uB470", "\uB470"], /* Hangul Syllable */
+ ["\uB471", "\uB471"], /* Hangul Syllable */
+ ["\uB472", "\uB472"], /* Hangul Syllable */
+ ["\uB473", "\uB473"], /* Hangul Syllable */
+ ["\uB474", "\uB474"], /* Hangul Syllable */
+ ["\uB475", "\uB475"], /* Hangul Syllable */
+ ["\uB476", "\uB476"], /* Hangul Syllable */
+ ["\uB477", "\uB477"], /* Hangul Syllable */
+ ["\uB478", "\uB478"], /* Hangul Syllable */
+ ["\uB479", "\uB479"], /* Hangul Syllable */
+ ["\uB47A", "\uB47A"], /* Hangul Syllable */
+ ["\uB47B", "\uB47B"], /* Hangul Syllable */
+ ["\uB47C", "\uB47C"], /* Hangul Syllable */
+ ["\uB47D", "\uB47D"], /* Hangul Syllable */
+ ["\uB47E", "\uB47E"], /* Hangul Syllable */
+ ["\uB47F", "\uB47F"], /* Hangul Syllable */
+ ["\uB480", "\uB480"], /* Hangul Syllable */
+ ["\uB481", "\uB481"], /* Hangul Syllable */
+ ["\uB482", "\uB482"], /* Hangul Syllable */
+ ["\uB483", "\uB483"], /* Hangul Syllable */
+ ["\uB484", "\uB484"], /* Hangul Syllable */
+ ["\uB485", "\uB485"], /* Hangul Syllable */
+ ["\uB486", "\uB486"], /* Hangul Syllable */
+ ["\uB487", "\uB487"], /* Hangul Syllable */
+ ["\uB488", "\uB488"], /* Hangul Syllable */
+ ["\uB489", "\uB489"], /* Hangul Syllable */
+ ["\uB48A", "\uB48A"], /* Hangul Syllable */
+ ["\uB48B", "\uB48B"], /* Hangul Syllable */
+ ["\uB48C", "\uB48C"], /* Hangul Syllable */
+ ["\uB48D", "\uB48D"], /* Hangul Syllable */
+ ["\uB48E", "\uB48E"], /* Hangul Syllable */
+ ["\uB48F", "\uB48F"], /* Hangul Syllable */
+ ["\uB490", "\uB490"], /* Hangul Syllable */
+ ["\uB491", "\uB491"], /* Hangul Syllable */
+ ["\uB492", "\uB492"], /* Hangul Syllable */
+ ["\uB493", "\uB493"], /* Hangul Syllable */
+ ["\uB494", "\uB494"], /* Hangul Syllable */
+ ["\uB495", "\uB495"], /* Hangul Syllable */
+ ["\uB496", "\uB496"], /* Hangul Syllable */
+ ["\uB497", "\uB497"], /* Hangul Syllable */
+ ["\uB498", "\uB498"], /* Hangul Syllable */
+ ["\uB499", "\uB499"], /* Hangul Syllable */
+ ["\uB49A", "\uB49A"], /* Hangul Syllable */
+ ["\uB49B", "\uB49B"], /* Hangul Syllable */
+ ["\uB49C", "\uB49C"], /* Hangul Syllable */
+ ["\uB49D", "\uB49D"], /* Hangul Syllable */
+ ["\uB49E", "\uB49E"], /* Hangul Syllable */
+ ["\uB49F", "\uB49F"], /* Hangul Syllable */
+ ["\uB4A0", "\uB4A0"], /* Hangul Syllable */
+ ["\uB4A1", "\uB4A1"], /* Hangul Syllable */
+ ["\uB4A2", "\uB4A2"], /* Hangul Syllable */
+ ["\uB4A3", "\uB4A3"], /* Hangul Syllable */
+ ["\uB4A4", "\uB4A4"], /* Hangul Syllable */
+ ["\uB4A5", "\uB4A5"], /* Hangul Syllable */
+ ["\uB4A6", "\uB4A6"], /* Hangul Syllable */
+ ["\uB4A7", "\uB4A7"], /* Hangul Syllable */
+ ["\uB4A8", "\uB4A8"], /* Hangul Syllable */
+ ["\uB4A9", "\uB4A9"], /* Hangul Syllable */
+ ["\uB4AA", "\uB4AA"], /* Hangul Syllable */
+ ["\uB4AB", "\uB4AB"], /* Hangul Syllable */
+ ["\uB4AC", "\uB4AC"], /* Hangul Syllable */
+ ["\uB4AD", "\uB4AD"], /* Hangul Syllable */
+ ["\uB4AE", "\uB4AE"], /* Hangul Syllable */
+ ["\uB4AF", "\uB4AF"], /* Hangul Syllable */
+ ["\uB4B0", "\uB4B0"], /* Hangul Syllable */
+ ["\uB4B1", "\uB4B1"], /* Hangul Syllable */
+ ["\uB4B2", "\uB4B2"], /* Hangul Syllable */
+ ["\uB4B3", "\uB4B3"], /* Hangul Syllable */
+ ["\uB4B4", "\uB4B4"], /* Hangul Syllable */
+ ["\uB4B5", "\uB4B5"], /* Hangul Syllable */
+ ["\uB4B6", "\uB4B6"], /* Hangul Syllable */
+ ["\uB4B7", "\uB4B7"], /* Hangul Syllable */
+ ["\uB4B8", "\uB4B8"], /* Hangul Syllable */
+ ["\uB4B9", "\uB4B9"], /* Hangul Syllable */
+ ["\uB4BA", "\uB4BA"], /* Hangul Syllable */
+ ["\uB4BB", "\uB4BB"], /* Hangul Syllable */
+ ["\uB4BC", "\uB4BC"], /* Hangul Syllable */
+ ["\uB4BD", "\uB4BD"], /* Hangul Syllable */
+ ["\uB4BE", "\uB4BE"], /* Hangul Syllable */
+ ["\uB4BF", "\uB4BF"], /* Hangul Syllable */
+ ["\uB4C0", "\uB4C0"], /* Hangul Syllable */
+ ["\uB4C1", "\uB4C1"], /* Hangul Syllable */
+ ["\uB4C2", "\uB4C2"], /* Hangul Syllable */
+ ["\uB4C3", "\uB4C3"], /* Hangul Syllable */
+ ["\uB4C4", "\uB4C4"], /* Hangul Syllable */
+ ["\uB4C5", "\uB4C5"], /* Hangul Syllable */
+ ["\uB4C6", "\uB4C6"], /* Hangul Syllable */
+ ["\uB4C7", "\uB4C7"], /* Hangul Syllable */
+ ["\uB4C8", "\uB4C8"], /* Hangul Syllable */
+ ["\uB4C9", "\uB4C9"], /* Hangul Syllable */
+ ["\uB4CA", "\uB4CA"], /* Hangul Syllable */
+ ["\uB4CB", "\uB4CB"], /* Hangul Syllable */
+ ["\uB4CC", "\uB4CC"], /* Hangul Syllable */
+ ["\uB4CD", "\uB4CD"], /* Hangul Syllable */
+ ["\uB4CE", "\uB4CE"], /* Hangul Syllable */
+ ["\uB4CF", "\uB4CF"], /* Hangul Syllable */
+ ["\uB4D0", "\uB4D0"], /* Hangul Syllable */
+ ["\uB4D1", "\uB4D1"], /* Hangul Syllable */
+ ["\uB4D2", "\uB4D2"], /* Hangul Syllable */
+ ["\uB4D3", "\uB4D3"], /* Hangul Syllable */
+ ["\uB4D4", "\uB4D4"], /* Hangul Syllable */
+ ["\uB4D5", "\uB4D5"], /* Hangul Syllable */
+ ["\uB4D6", "\uB4D6"], /* Hangul Syllable */
+ ["\uB4D7", "\uB4D7"], /* Hangul Syllable */
+ ["\uB4D8", "\uB4D8"], /* Hangul Syllable */
+ ["\uB4D9", "\uB4D9"], /* Hangul Syllable */
+ ["\uB4DA", "\uB4DA"], /* Hangul Syllable */
+ ["\uB4DB", "\uB4DB"], /* Hangul Syllable */
+ ["\uB4DC", "\uB4DC"], /* Hangul Syllable */
+ ["\uB4DD", "\uB4DD"], /* Hangul Syllable */
+ ["\uB4DE", "\uB4DE"], /* Hangul Syllable */
+ ["\uB4DF", "\uB4DF"], /* Hangul Syllable */
+ ["\uB4E0", "\uB4E0"], /* Hangul Syllable */
+ ["\uB4E1", "\uB4E1"], /* Hangul Syllable */
+ ["\uB4E2", "\uB4E2"], /* Hangul Syllable */
+ ["\uB4E3", "\uB4E3"], /* Hangul Syllable */
+ ["\uB4E4", "\uB4E4"], /* Hangul Syllable */
+ ["\uB4E5", "\uB4E5"], /* Hangul Syllable */
+ ["\uB4E6", "\uB4E6"], /* Hangul Syllable */
+ ["\uB4E7", "\uB4E7"], /* Hangul Syllable */
+ ["\uB4E8", "\uB4E8"], /* Hangul Syllable */
+ ["\uB4E9", "\uB4E9"], /* Hangul Syllable */
+ ["\uB4EA", "\uB4EA"], /* Hangul Syllable */
+ ["\uB4EB", "\uB4EB"], /* Hangul Syllable */
+ ["\uB4EC", "\uB4EC"], /* Hangul Syllable */
+ ["\uB4ED", "\uB4ED"], /* Hangul Syllable */
+ ["\uB4EE", "\uB4EE"], /* Hangul Syllable */
+ ["\uB4EF", "\uB4EF"], /* Hangul Syllable */
+ ["\uB4F0", "\uB4F0"], /* Hangul Syllable */
+ ["\uB4F1", "\uB4F1"], /* Hangul Syllable */
+ ["\uB4F2", "\uB4F2"], /* Hangul Syllable */
+ ["\uB4F3", "\uB4F3"], /* Hangul Syllable */
+ ["\uB4F4", "\uB4F4"], /* Hangul Syllable */
+ ["\uB4F5", "\uB4F5"], /* Hangul Syllable */
+ ["\uB4F6", "\uB4F6"], /* Hangul Syllable */
+ ["\uB4F7", "\uB4F7"], /* Hangul Syllable */
+ ["\uB4F8", "\uB4F8"], /* Hangul Syllable */
+ ["\uB4F9", "\uB4F9"], /* Hangul Syllable */
+ ["\uB4FA", "\uB4FA"], /* Hangul Syllable */
+ ["\uB4FB", "\uB4FB"], /* Hangul Syllable */
+ ["\uB4FC", "\uB4FC"], /* Hangul Syllable */
+ ["\uB4FD", "\uB4FD"], /* Hangul Syllable */
+ ["\uB4FE", "\uB4FE"], /* Hangul Syllable */
+ ["\uB4FF", "\uB4FF"], /* Hangul Syllable */
+ ["\uB500", "\uB500"], /* Hangul Syllable */
+ ["\uB501", "\uB501"], /* Hangul Syllable */
+ ["\uB502", "\uB502"], /* Hangul Syllable */
+ ["\uB503", "\uB503"], /* Hangul Syllable */
+ ["\uB504", "\uB504"], /* Hangul Syllable */
+ ["\uB505", "\uB505"], /* Hangul Syllable */
+ ["\uB506", "\uB506"], /* Hangul Syllable */
+ ["\uB507", "\uB507"], /* Hangul Syllable */
+ ["\uB508", "\uB508"], /* Hangul Syllable */
+ ["\uB509", "\uB509"], /* Hangul Syllable */
+ ["\uB50A", "\uB50A"], /* Hangul Syllable */
+ ["\uB50B", "\uB50B"], /* Hangul Syllable */
+ ["\uB50C", "\uB50C"], /* Hangul Syllable */
+ ["\uB50D", "\uB50D"], /* Hangul Syllable */
+ ["\uB50E", "\uB50E"], /* Hangul Syllable */
+ ["\uB50F", "\uB50F"], /* Hangul Syllable */
+ ["\uB510", "\uB510"], /* Hangul Syllable */
+ ["\uB511", "\uB511"], /* Hangul Syllable */
+ ["\uB512", "\uB512"], /* Hangul Syllable */
+ ["\uB513", "\uB513"], /* Hangul Syllable */
+ ["\uB514", "\uB514"], /* Hangul Syllable */
+ ["\uB515", "\uB515"], /* Hangul Syllable */
+ ["\uB516", "\uB516"], /* Hangul Syllable */
+ ["\uB517", "\uB517"], /* Hangul Syllable */
+ ["\uB518", "\uB518"], /* Hangul Syllable */
+ ["\uB519", "\uB519"], /* Hangul Syllable */
+ ["\uB51A", "\uB51A"], /* Hangul Syllable */
+ ["\uB51B", "\uB51B"], /* Hangul Syllable */
+ ["\uB51C", "\uB51C"], /* Hangul Syllable */
+ ["\uB51D", "\uB51D"], /* Hangul Syllable */
+ ["\uB51E", "\uB51E"], /* Hangul Syllable */
+ ["\uB51F", "\uB51F"], /* Hangul Syllable */
+ ["\uB520", "\uB520"], /* Hangul Syllable */
+ ["\uB521", "\uB521"], /* Hangul Syllable */
+ ["\uB522", "\uB522"], /* Hangul Syllable */
+ ["\uB523", "\uB523"], /* Hangul Syllable */
+ ["\uB524", "\uB524"], /* Hangul Syllable */
+ ["\uB525", "\uB525"], /* Hangul Syllable */
+ ["\uB526", "\uB526"], /* Hangul Syllable */
+ ["\uB527", "\uB527"], /* Hangul Syllable */
+ ["\uB528", "\uB528"], /* Hangul Syllable */
+ ["\uB529", "\uB529"], /* Hangul Syllable */
+ ["\uB52A", "\uB52A"], /* Hangul Syllable */
+ ["\uB52B", "\uB52B"], /* Hangul Syllable */
+ ["\uB52C", "\uB52C"], /* Hangul Syllable */
+ ["\uB52D", "\uB52D"], /* Hangul Syllable */
+ ["\uB52E", "\uB52E"], /* Hangul Syllable */
+ ["\uB52F", "\uB52F"], /* Hangul Syllable */
+ ["\uB530", "\uB530"], /* Hangul Syllable */
+ ["\uB531", "\uB531"], /* Hangul Syllable */
+ ["\uB532", "\uB532"], /* Hangul Syllable */
+ ["\uB533", "\uB533"], /* Hangul Syllable */
+ ["\uB534", "\uB534"], /* Hangul Syllable */
+ ["\uB535", "\uB535"], /* Hangul Syllable */
+ ["\uB536", "\uB536"], /* Hangul Syllable */
+ ["\uB537", "\uB537"], /* Hangul Syllable */
+ ["\uB538", "\uB538"], /* Hangul Syllable */
+ ["\uB539", "\uB539"], /* Hangul Syllable */
+ ["\uB53A", "\uB53A"], /* Hangul Syllable */
+ ["\uB53B", "\uB53B"], /* Hangul Syllable */
+ ["\uB53C", "\uB53C"], /* Hangul Syllable */
+ ["\uB53D", "\uB53D"], /* Hangul Syllable */
+ ["\uB53E", "\uB53E"], /* Hangul Syllable */
+ ["\uB53F", "\uB53F"], /* Hangul Syllable */
+ ["\uB540", "\uB540"], /* Hangul Syllable */
+ ["\uB541", "\uB541"], /* Hangul Syllable */
+ ["\uB542", "\uB542"], /* Hangul Syllable */
+ ["\uB543", "\uB543"], /* Hangul Syllable */
+ ["\uB544", "\uB544"], /* Hangul Syllable */
+ ["\uB545", "\uB545"], /* Hangul Syllable */
+ ["\uB546", "\uB546"], /* Hangul Syllable */
+ ["\uB547", "\uB547"], /* Hangul Syllable */
+ ["\uB548", "\uB548"], /* Hangul Syllable */
+ ["\uB549", "\uB549"], /* Hangul Syllable */
+ ["\uB54A", "\uB54A"], /* Hangul Syllable */
+ ["\uB54B", "\uB54B"], /* Hangul Syllable */
+ ["\uB54C", "\uB54C"], /* Hangul Syllable */
+ ["\uB54D", "\uB54D"], /* Hangul Syllable */
+ ["\uB54E", "\uB54E"], /* Hangul Syllable */
+ ["\uB54F", "\uB54F"], /* Hangul Syllable */
+ ["\uB550", "\uB550"], /* Hangul Syllable */
+ ["\uB551", "\uB551"], /* Hangul Syllable */
+ ["\uB552", "\uB552"], /* Hangul Syllable */
+ ["\uB553", "\uB553"], /* Hangul Syllable */
+ ["\uB554", "\uB554"], /* Hangul Syllable */
+ ["\uB555", "\uB555"], /* Hangul Syllable */
+ ["\uB556", "\uB556"], /* Hangul Syllable */
+ ["\uB557", "\uB557"], /* Hangul Syllable */
+ ["\uB558", "\uB558"], /* Hangul Syllable */
+ ["\uB559", "\uB559"], /* Hangul Syllable */
+ ["\uB55A", "\uB55A"], /* Hangul Syllable */
+ ["\uB55B", "\uB55B"], /* Hangul Syllable */
+ ["\uB55C", "\uB55C"], /* Hangul Syllable */
+ ["\uB55D", "\uB55D"], /* Hangul Syllable */
+ ["\uB55E", "\uB55E"], /* Hangul Syllable */
+ ["\uB55F", "\uB55F"], /* Hangul Syllable */
+ ["\uB560", "\uB560"], /* Hangul Syllable */
+ ["\uB561", "\uB561"], /* Hangul Syllable */
+ ["\uB562", "\uB562"], /* Hangul Syllable */
+ ["\uB563", "\uB563"], /* Hangul Syllable */
+ ["\uB564", "\uB564"], /* Hangul Syllable */
+ ["\uB565", "\uB565"], /* Hangul Syllable */
+ ["\uB566", "\uB566"], /* Hangul Syllable */
+ ["\uB567", "\uB567"], /* Hangul Syllable */
+ ["\uB568", "\uB568"], /* Hangul Syllable */
+ ["\uB569", "\uB569"], /* Hangul Syllable */
+ ["\uB56A", "\uB56A"], /* Hangul Syllable */
+ ["\uB56B", "\uB56B"], /* Hangul Syllable */
+ ["\uB56C", "\uB56C"], /* Hangul Syllable */
+ ["\uB56D", "\uB56D"], /* Hangul Syllable */
+ ["\uB56E", "\uB56E"], /* Hangul Syllable */
+ ["\uB56F", "\uB56F"], /* Hangul Syllable */
+ ["\uB570", "\uB570"], /* Hangul Syllable */
+ ["\uB571", "\uB571"], /* Hangul Syllable */
+ ["\uB572", "\uB572"], /* Hangul Syllable */
+ ["\uB573", "\uB573"], /* Hangul Syllable */
+ ["\uB574", "\uB574"], /* Hangul Syllable */
+ ["\uB575", "\uB575"], /* Hangul Syllable */
+ ["\uB576", "\uB576"], /* Hangul Syllable */
+ ["\uB577", "\uB577"], /* Hangul Syllable */
+ ["\uB578", "\uB578"], /* Hangul Syllable */
+ ["\uB579", "\uB579"], /* Hangul Syllable */
+ ["\uB57A", "\uB57A"], /* Hangul Syllable */
+ ["\uB57B", "\uB57B"], /* Hangul Syllable */
+ ["\uB57C", "\uB57C"], /* Hangul Syllable */
+ ["\uB57D", "\uB57D"], /* Hangul Syllable */
+ ["\uB57E", "\uB57E"], /* Hangul Syllable */
+ ["\uB57F", "\uB57F"], /* Hangul Syllable */
+ ["\uB580", "\uB580"], /* Hangul Syllable */
+ ["\uB581", "\uB581"], /* Hangul Syllable */
+ ["\uB582", "\uB582"], /* Hangul Syllable */
+ ["\uB583", "\uB583"], /* Hangul Syllable */
+ ["\uB584", "\uB584"], /* Hangul Syllable */
+ ["\uB585", "\uB585"], /* Hangul Syllable */
+ ["\uB586", "\uB586"], /* Hangul Syllable */
+ ["\uB587", "\uB587"], /* Hangul Syllable */
+ ["\uB588", "\uB588"], /* Hangul Syllable */
+ ["\uB589", "\uB589"], /* Hangul Syllable */
+ ["\uB58A", "\uB58A"], /* Hangul Syllable */
+ ["\uB58B", "\uB58B"], /* Hangul Syllable */
+ ["\uB58C", "\uB58C"], /* Hangul Syllable */
+ ["\uB58D", "\uB58D"], /* Hangul Syllable */
+ ["\uB58E", "\uB58E"], /* Hangul Syllable */
+ ["\uB58F", "\uB58F"], /* Hangul Syllable */
+ ["\uB590", "\uB590"], /* Hangul Syllable */
+ ["\uB591", "\uB591"], /* Hangul Syllable */
+ ["\uB592", "\uB592"], /* Hangul Syllable */
+ ["\uB593", "\uB593"], /* Hangul Syllable */
+ ["\uB594", "\uB594"], /* Hangul Syllable */
+ ["\uB595", "\uB595"], /* Hangul Syllable */
+ ["\uB596", "\uB596"], /* Hangul Syllable */
+ ["\uB597", "\uB597"], /* Hangul Syllable */
+ ["\uB598", "\uB598"], /* Hangul Syllable */
+ ["\uB599", "\uB599"], /* Hangul Syllable */
+ ["\uB59A", "\uB59A"], /* Hangul Syllable */
+ ["\uB59B", "\uB59B"], /* Hangul Syllable */
+ ["\uB59C", "\uB59C"], /* Hangul Syllable */
+ ["\uB59D", "\uB59D"], /* Hangul Syllable */
+ ["\uB59E", "\uB59E"], /* Hangul Syllable */
+ ["\uB59F", "\uB59F"], /* Hangul Syllable */
+ ["\uB5A0", "\uB5A0"], /* Hangul Syllable */
+ ["\uB5A1", "\uB5A1"], /* Hangul Syllable */
+ ["\uB5A2", "\uB5A2"], /* Hangul Syllable */
+ ["\uB5A3", "\uB5A3"], /* Hangul Syllable */
+ ["\uB5A4", "\uB5A4"], /* Hangul Syllable */
+ ["\uB5A5", "\uB5A5"], /* Hangul Syllable */
+ ["\uB5A6", "\uB5A6"], /* Hangul Syllable */
+ ["\uB5A7", "\uB5A7"], /* Hangul Syllable */
+ ["\uB5A8", "\uB5A8"], /* Hangul Syllable */
+ ["\uB5A9", "\uB5A9"], /* Hangul Syllable */
+ ["\uB5AA", "\uB5AA"], /* Hangul Syllable */
+ ["\uB5AB", "\uB5AB"], /* Hangul Syllable */
+ ["\uB5AC", "\uB5AC"], /* Hangul Syllable */
+ ["\uB5AD", "\uB5AD"], /* Hangul Syllable */
+ ["\uB5AE", "\uB5AE"], /* Hangul Syllable */
+ ["\uB5AF", "\uB5AF"], /* Hangul Syllable */
+ ["\uB5B0", "\uB5B0"], /* Hangul Syllable */
+ ["\uB5B1", "\uB5B1"], /* Hangul Syllable */
+ ["\uB5B2", "\uB5B2"], /* Hangul Syllable */
+ ["\uB5B3", "\uB5B3"], /* Hangul Syllable */
+ ["\uB5B4", "\uB5B4"], /* Hangul Syllable */
+ ["\uB5B5", "\uB5B5"], /* Hangul Syllable */
+ ["\uB5B6", "\uB5B6"], /* Hangul Syllable */
+ ["\uB5B7", "\uB5B7"], /* Hangul Syllable */
+ ["\uB5B8", "\uB5B8"], /* Hangul Syllable */
+ ["\uB5B9", "\uB5B9"], /* Hangul Syllable */
+ ["\uB5BA", "\uB5BA"], /* Hangul Syllable */
+ ["\uB5BB", "\uB5BB"], /* Hangul Syllable */
+ ["\uB5BC", "\uB5BC"], /* Hangul Syllable */
+ ["\uB5BD", "\uB5BD"], /* Hangul Syllable */
+ ["\uB5BE", "\uB5BE"], /* Hangul Syllable */
+ ["\uB5BF", "\uB5BF"], /* Hangul Syllable */
+ ["\uB5C0", "\uB5C0"], /* Hangul Syllable */
+ ["\uB5C1", "\uB5C1"], /* Hangul Syllable */
+ ["\uB5C2", "\uB5C2"], /* Hangul Syllable */
+ ["\uB5C3", "\uB5C3"], /* Hangul Syllable */
+ ["\uB5C4", "\uB5C4"], /* Hangul Syllable */
+ ["\uB5C5", "\uB5C5"], /* Hangul Syllable */
+ ["\uB5C6", "\uB5C6"], /* Hangul Syllable */
+ ["\uB5C7", "\uB5C7"], /* Hangul Syllable */
+ ["\uB5C8", "\uB5C8"], /* Hangul Syllable */
+ ["\uB5C9", "\uB5C9"], /* Hangul Syllable */
+ ["\uB5CA", "\uB5CA"], /* Hangul Syllable */
+ ["\uB5CB", "\uB5CB"], /* Hangul Syllable */
+ ["\uB5CC", "\uB5CC"], /* Hangul Syllable */
+ ["\uB5CD", "\uB5CD"], /* Hangul Syllable */
+ ["\uB5CE", "\uB5CE"], /* Hangul Syllable */
+ ["\uB5CF", "\uB5CF"], /* Hangul Syllable */
+ ["\uB5D0", "\uB5D0"], /* Hangul Syllable */
+ ["\uB5D1", "\uB5D1"], /* Hangul Syllable */
+ ["\uB5D2", "\uB5D2"], /* Hangul Syllable */
+ ["\uB5D3", "\uB5D3"], /* Hangul Syllable */
+ ["\uB5D4", "\uB5D4"], /* Hangul Syllable */
+ ["\uB5D5", "\uB5D5"], /* Hangul Syllable */
+ ["\uB5D6", "\uB5D6"], /* Hangul Syllable */
+ ["\uB5D7", "\uB5D7"], /* Hangul Syllable */
+ ["\uB5D8", "\uB5D8"], /* Hangul Syllable */
+ ["\uB5D9", "\uB5D9"], /* Hangul Syllable */
+ ["\uB5DA", "\uB5DA"], /* Hangul Syllable */
+ ["\uB5DB", "\uB5DB"], /* Hangul Syllable */
+ ["\uB5DC", "\uB5DC"], /* Hangul Syllable */
+ ["\uB5DD", "\uB5DD"], /* Hangul Syllable */
+ ["\uB5DE", "\uB5DE"], /* Hangul Syllable */
+ ["\uB5DF", "\uB5DF"], /* Hangul Syllable */
+ ["\uB5E0", "\uB5E0"], /* Hangul Syllable */
+ ["\uB5E1", "\uB5E1"], /* Hangul Syllable */
+ ["\uB5E2", "\uB5E2"], /* Hangul Syllable */
+ ["\uB5E3", "\uB5E3"], /* Hangul Syllable */
+ ["\uB5E4", "\uB5E4"], /* Hangul Syllable */
+ ["\uB5E5", "\uB5E5"], /* Hangul Syllable */
+ ["\uB5E6", "\uB5E6"], /* Hangul Syllable */
+ ["\uB5E7", "\uB5E7"], /* Hangul Syllable */
+ ["\uB5E8", "\uB5E8"], /* Hangul Syllable */
+ ["\uB5E9", "\uB5E9"], /* Hangul Syllable */
+ ["\uB5EA", "\uB5EA"], /* Hangul Syllable */
+ ["\uB5EB", "\uB5EB"], /* Hangul Syllable */
+ ["\uB5EC", "\uB5EC"], /* Hangul Syllable */
+ ["\uB5ED", "\uB5ED"], /* Hangul Syllable */
+ ["\uB5EE", "\uB5EE"], /* Hangul Syllable */
+ ["\uB5EF", "\uB5EF"], /* Hangul Syllable */
+ ["\uB5F0", "\uB5F0"], /* Hangul Syllable */
+ ["\uB5F1", "\uB5F1"], /* Hangul Syllable */
+ ["\uB5F2", "\uB5F2"], /* Hangul Syllable */
+ ["\uB5F3", "\uB5F3"], /* Hangul Syllable */
+ ["\uB5F4", "\uB5F4"], /* Hangul Syllable */
+ ["\uB5F5", "\uB5F5"], /* Hangul Syllable */
+ ["\uB5F6", "\uB5F6"], /* Hangul Syllable */
+ ["\uB5F7", "\uB5F7"], /* Hangul Syllable */
+ ["\uB5F8", "\uB5F8"], /* Hangul Syllable */
+ ["\uB5F9", "\uB5F9"], /* Hangul Syllable */
+ ["\uB5FA", "\uB5FA"], /* Hangul Syllable */
+ ["\uB5FB", "\uB5FB"], /* Hangul Syllable */
+ ["\uB5FC", "\uB5FC"], /* Hangul Syllable */
+ ["\uB5FD", "\uB5FD"], /* Hangul Syllable */
+ ["\uB5FE", "\uB5FE"], /* Hangul Syllable */
+ ["\uB5FF", "\uB5FF"], /* Hangul Syllable */
+ ["\uB600", "\uB600"], /* Hangul Syllable */
+ ["\uB601", "\uB601"], /* Hangul Syllable */
+ ["\uB602", "\uB602"], /* Hangul Syllable */
+ ["\uB603", "\uB603"], /* Hangul Syllable */
+ ["\uB604", "\uB604"], /* Hangul Syllable */
+ ["\uB605", "\uB605"], /* Hangul Syllable */
+ ["\uB606", "\uB606"], /* Hangul Syllable */
+ ["\uB607", "\uB607"], /* Hangul Syllable */
+ ["\uB608", "\uB608"], /* Hangul Syllable */
+ ["\uB609", "\uB609"], /* Hangul Syllable */
+ ["\uB60A", "\uB60A"], /* Hangul Syllable */
+ ["\uB60B", "\uB60B"], /* Hangul Syllable */
+ ["\uB60C", "\uB60C"], /* Hangul Syllable */
+ ["\uB60D", "\uB60D"], /* Hangul Syllable */
+ ["\uB60E", "\uB60E"], /* Hangul Syllable */
+ ["\uB60F", "\uB60F"], /* Hangul Syllable */
+ ["\uB610", "\uB610"], /* Hangul Syllable */
+ ["\uB611", "\uB611"], /* Hangul Syllable */
+ ["\uB612", "\uB612"], /* Hangul Syllable */
+ ["\uB613", "\uB613"], /* Hangul Syllable */
+ ["\uB614", "\uB614"], /* Hangul Syllable */
+ ["\uB615", "\uB615"], /* Hangul Syllable */
+ ["\uB616", "\uB616"], /* Hangul Syllable */
+ ["\uB617", "\uB617"], /* Hangul Syllable */
+ ["\uB618", "\uB618"], /* Hangul Syllable */
+ ["\uB619", "\uB619"], /* Hangul Syllable */
+ ["\uB61A", "\uB61A"], /* Hangul Syllable */
+ ["\uB61B", "\uB61B"], /* Hangul Syllable */
+ ["\uB61C", "\uB61C"], /* Hangul Syllable */
+ ["\uB61D", "\uB61D"], /* Hangul Syllable */
+ ["\uB61E", "\uB61E"], /* Hangul Syllable */
+ ["\uB61F", "\uB61F"], /* Hangul Syllable */
+ ["\uB620", "\uB620"], /* Hangul Syllable */
+ ["\uB621", "\uB621"], /* Hangul Syllable */
+ ["\uB622", "\uB622"], /* Hangul Syllable */
+ ["\uB623", "\uB623"], /* Hangul Syllable */
+ ["\uB624", "\uB624"], /* Hangul Syllable */
+ ["\uB625", "\uB625"], /* Hangul Syllable */
+ ["\uB626", "\uB626"], /* Hangul Syllable */
+ ["\uB627", "\uB627"], /* Hangul Syllable */
+ ["\uB628", "\uB628"], /* Hangul Syllable */
+ ["\uB629", "\uB629"], /* Hangul Syllable */
+ ["\uB62A", "\uB62A"], /* Hangul Syllable */
+ ["\uB62B", "\uB62B"], /* Hangul Syllable */
+ ["\uB62C", "\uB62C"], /* Hangul Syllable */
+ ["\uB62D", "\uB62D"], /* Hangul Syllable */
+ ["\uB62E", "\uB62E"], /* Hangul Syllable */
+ ["\uB62F", "\uB62F"], /* Hangul Syllable */
+ ["\uB630", "\uB630"], /* Hangul Syllable */
+ ["\uB631", "\uB631"], /* Hangul Syllable */
+ ["\uB632", "\uB632"], /* Hangul Syllable */
+ ["\uB633", "\uB633"], /* Hangul Syllable */
+ ["\uB634", "\uB634"], /* Hangul Syllable */
+ ["\uB635", "\uB635"], /* Hangul Syllable */
+ ["\uB636", "\uB636"], /* Hangul Syllable */
+ ["\uB637", "\uB637"], /* Hangul Syllable */
+ ["\uB638", "\uB638"], /* Hangul Syllable */
+ ["\uB639", "\uB639"], /* Hangul Syllable */
+ ["\uB63A", "\uB63A"], /* Hangul Syllable */
+ ["\uB63B", "\uB63B"], /* Hangul Syllable */
+ ["\uB63C", "\uB63C"], /* Hangul Syllable */
+ ["\uB63D", "\uB63D"], /* Hangul Syllable */
+ ["\uB63E", "\uB63E"], /* Hangul Syllable */
+ ["\uB63F", "\uB63F"], /* Hangul Syllable */
+ ["\uB640", "\uB640"], /* Hangul Syllable */
+ ["\uB641", "\uB641"], /* Hangul Syllable */
+ ["\uB642", "\uB642"], /* Hangul Syllable */
+ ["\uB643", "\uB643"], /* Hangul Syllable */
+ ["\uB644", "\uB644"], /* Hangul Syllable */
+ ["\uB645", "\uB645"], /* Hangul Syllable */
+ ["\uB646", "\uB646"], /* Hangul Syllable */
+ ["\uB647", "\uB647"], /* Hangul Syllable */
+ ["\uB648", "\uB648"], /* Hangul Syllable */
+ ["\uB649", "\uB649"], /* Hangul Syllable */
+ ["\uB64A", "\uB64A"], /* Hangul Syllable */
+ ["\uB64B", "\uB64B"], /* Hangul Syllable */
+ ["\uB64C", "\uB64C"], /* Hangul Syllable */
+ ["\uB64D", "\uB64D"], /* Hangul Syllable */
+ ["\uB64E", "\uB64E"], /* Hangul Syllable */
+ ["\uB64F", "\uB64F"], /* Hangul Syllable */
+ ["\uB650", "\uB650"], /* Hangul Syllable */
+ ["\uB651", "\uB651"], /* Hangul Syllable */
+ ["\uB652", "\uB652"], /* Hangul Syllable */
+ ["\uB653", "\uB653"], /* Hangul Syllable */
+ ["\uB654", "\uB654"], /* Hangul Syllable */
+ ["\uB655", "\uB655"], /* Hangul Syllable */
+ ["\uB656", "\uB656"], /* Hangul Syllable */
+ ["\uB657", "\uB657"], /* Hangul Syllable */
+ ["\uB658", "\uB658"], /* Hangul Syllable */
+ ["\uB659", "\uB659"], /* Hangul Syllable */
+ ["\uB65A", "\uB65A"], /* Hangul Syllable */
+ ["\uB65B", "\uB65B"], /* Hangul Syllable */
+ ["\uB65C", "\uB65C"], /* Hangul Syllable */
+ ["\uB65D", "\uB65D"], /* Hangul Syllable */
+ ["\uB65E", "\uB65E"], /* Hangul Syllable */
+ ["\uB65F", "\uB65F"], /* Hangul Syllable */
+ ["\uB660", "\uB660"], /* Hangul Syllable */
+ ["\uB661", "\uB661"], /* Hangul Syllable */
+ ["\uB662", "\uB662"], /* Hangul Syllable */
+ ["\uB663", "\uB663"], /* Hangul Syllable */
+ ["\uB664", "\uB664"], /* Hangul Syllable */
+ ["\uB665", "\uB665"], /* Hangul Syllable */
+ ["\uB666", "\uB666"], /* Hangul Syllable */
+ ["\uB667", "\uB667"], /* Hangul Syllable */
+ ["\uB668", "\uB668"], /* Hangul Syllable */
+ ["\uB669", "\uB669"], /* Hangul Syllable */
+ ["\uB66A", "\uB66A"], /* Hangul Syllable */
+ ["\uB66B", "\uB66B"], /* Hangul Syllable */
+ ["\uB66C", "\uB66C"], /* Hangul Syllable */
+ ["\uB66D", "\uB66D"], /* Hangul Syllable */
+ ["\uB66E", "\uB66E"], /* Hangul Syllable */
+ ["\uB66F", "\uB66F"], /* Hangul Syllable */
+ ["\uB670", "\uB670"], /* Hangul Syllable */
+ ["\uB671", "\uB671"], /* Hangul Syllable */
+ ["\uB672", "\uB672"], /* Hangul Syllable */
+ ["\uB673", "\uB673"], /* Hangul Syllable */
+ ["\uB674", "\uB674"], /* Hangul Syllable */
+ ["\uB675", "\uB675"], /* Hangul Syllable */
+ ["\uB676", "\uB676"], /* Hangul Syllable */
+ ["\uB677", "\uB677"], /* Hangul Syllable */
+ ["\uB678", "\uB678"], /* Hangul Syllable */
+ ["\uB679", "\uB679"], /* Hangul Syllable */
+ ["\uB67A", "\uB67A"], /* Hangul Syllable */
+ ["\uB67B", "\uB67B"], /* Hangul Syllable */
+ ["\uB67C", "\uB67C"], /* Hangul Syllable */
+ ["\uB67D", "\uB67D"], /* Hangul Syllable */
+ ["\uB67E", "\uB67E"], /* Hangul Syllable */
+ ["\uB67F", "\uB67F"], /* Hangul Syllable */
+ ["\uB680", "\uB680"], /* Hangul Syllable */
+ ["\uB681", "\uB681"], /* Hangul Syllable */
+ ["\uB682", "\uB682"], /* Hangul Syllable */
+ ["\uB683", "\uB683"], /* Hangul Syllable */
+ ["\uB684", "\uB684"], /* Hangul Syllable */
+ ["\uB685", "\uB685"], /* Hangul Syllable */
+ ["\uB686", "\uB686"], /* Hangul Syllable */
+ ["\uB687", "\uB687"], /* Hangul Syllable */
+ ["\uB688", "\uB688"], /* Hangul Syllable */
+ ["\uB689", "\uB689"], /* Hangul Syllable */
+ ["\uB68A", "\uB68A"], /* Hangul Syllable */
+ ["\uB68B", "\uB68B"], /* Hangul Syllable */
+ ["\uB68C", "\uB68C"], /* Hangul Syllable */
+ ["\uB68D", "\uB68D"], /* Hangul Syllable */
+ ["\uB68E", "\uB68E"], /* Hangul Syllable */
+ ["\uB68F", "\uB68F"], /* Hangul Syllable */
+ ["\uB690", "\uB690"], /* Hangul Syllable */
+ ["\uB691", "\uB691"], /* Hangul Syllable */
+ ["\uB692", "\uB692"], /* Hangul Syllable */
+ ["\uB693", "\uB693"], /* Hangul Syllable */
+ ["\uB694", "\uB694"], /* Hangul Syllable */
+ ["\uB695", "\uB695"], /* Hangul Syllable */
+ ["\uB696", "\uB696"], /* Hangul Syllable */
+ ["\uB697", "\uB697"], /* Hangul Syllable */
+ ["\uB698", "\uB698"], /* Hangul Syllable */
+ ["\uB699", "\uB699"], /* Hangul Syllable */
+ ["\uB69A", "\uB69A"], /* Hangul Syllable */
+ ["\uB69B", "\uB69B"], /* Hangul Syllable */
+ ["\uB69C", "\uB69C"], /* Hangul Syllable */
+ ["\uB69D", "\uB69D"], /* Hangul Syllable */
+ ["\uB69E", "\uB69E"], /* Hangul Syllable */
+ ["\uB69F", "\uB69F"], /* Hangul Syllable */
+ ["\uB6A0", "\uB6A0"], /* Hangul Syllable */
+ ["\uB6A1", "\uB6A1"], /* Hangul Syllable */
+ ["\uB6A2", "\uB6A2"], /* Hangul Syllable */
+ ["\uB6A3", "\uB6A3"], /* Hangul Syllable */
+ ["\uB6A4", "\uB6A4"], /* Hangul Syllable */
+ ["\uB6A5", "\uB6A5"], /* Hangul Syllable */
+ ["\uB6A6", "\uB6A6"], /* Hangul Syllable */
+ ["\uB6A7", "\uB6A7"], /* Hangul Syllable */
+ ["\uB6A8", "\uB6A8"], /* Hangul Syllable */
+ ["\uB6A9", "\uB6A9"], /* Hangul Syllable */
+ ["\uB6AA", "\uB6AA"], /* Hangul Syllable */
+ ["\uB6AB", "\uB6AB"], /* Hangul Syllable */
+ ["\uB6AC", "\uB6AC"], /* Hangul Syllable */
+ ["\uB6AD", "\uB6AD"], /* Hangul Syllable */
+ ["\uB6AE", "\uB6AE"], /* Hangul Syllable */
+ ["\uB6AF", "\uB6AF"], /* Hangul Syllable */
+ ["\uB6B0", "\uB6B0"], /* Hangul Syllable */
+ ["\uB6B1", "\uB6B1"], /* Hangul Syllable */
+ ["\uB6B2", "\uB6B2"], /* Hangul Syllable */
+ ["\uB6B3", "\uB6B3"], /* Hangul Syllable */
+ ["\uB6B4", "\uB6B4"], /* Hangul Syllable */
+ ["\uB6B5", "\uB6B5"], /* Hangul Syllable */
+ ["\uB6B6", "\uB6B6"], /* Hangul Syllable */
+ ["\uB6B7", "\uB6B7"], /* Hangul Syllable */
+ ["\uB6B8", "\uB6B8"], /* Hangul Syllable */
+ ["\uB6B9", "\uB6B9"], /* Hangul Syllable */
+ ["\uB6BA", "\uB6BA"], /* Hangul Syllable */
+ ["\uB6BB", "\uB6BB"], /* Hangul Syllable */
+ ["\uB6BC", "\uB6BC"], /* Hangul Syllable */
+ ["\uB6BD", "\uB6BD"], /* Hangul Syllable */
+ ["\uB6BE", "\uB6BE"], /* Hangul Syllable */
+ ["\uB6BF", "\uB6BF"], /* Hangul Syllable */
+ ["\uB6C0", "\uB6C0"], /* Hangul Syllable */
+ ["\uB6C1", "\uB6C1"], /* Hangul Syllable */
+ ["\uB6C2", "\uB6C2"], /* Hangul Syllable */
+ ["\uB6C3", "\uB6C3"], /* Hangul Syllable */
+ ["\uB6C4", "\uB6C4"], /* Hangul Syllable */
+ ["\uB6C5", "\uB6C5"], /* Hangul Syllable */
+ ["\uB6C6", "\uB6C6"], /* Hangul Syllable */
+ ["\uB6C7", "\uB6C7"], /* Hangul Syllable */
+ ["\uB6C8", "\uB6C8"], /* Hangul Syllable */
+ ["\uB6C9", "\uB6C9"], /* Hangul Syllable */
+ ["\uB6CA", "\uB6CA"], /* Hangul Syllable */
+ ["\uB6CB", "\uB6CB"], /* Hangul Syllable */
+ ["\uB6CC", "\uB6CC"], /* Hangul Syllable */
+ ["\uB6CD", "\uB6CD"], /* Hangul Syllable */
+ ["\uB6CE", "\uB6CE"], /* Hangul Syllable */
+ ["\uB6CF", "\uB6CF"], /* Hangul Syllable */
+ ["\uB6D0", "\uB6D0"], /* Hangul Syllable */
+ ["\uB6D1", "\uB6D1"], /* Hangul Syllable */
+ ["\uB6D2", "\uB6D2"], /* Hangul Syllable */
+ ["\uB6D3", "\uB6D3"], /* Hangul Syllable */
+ ["\uB6D4", "\uB6D4"], /* Hangul Syllable */
+ ["\uB6D5", "\uB6D5"], /* Hangul Syllable */
+ ["\uB6D6", "\uB6D6"], /* Hangul Syllable */
+ ["\uB6D7", "\uB6D7"], /* Hangul Syllable */
+ ["\uB6D8", "\uB6D8"], /* Hangul Syllable */
+ ["\uB6D9", "\uB6D9"], /* Hangul Syllable */
+ ["\uB6DA", "\uB6DA"], /* Hangul Syllable */
+ ["\uB6DB", "\uB6DB"], /* Hangul Syllable */
+ ["\uB6DC", "\uB6DC"], /* Hangul Syllable */
+ ["\uB6DD", "\uB6DD"], /* Hangul Syllable */
+ ["\uB6DE", "\uB6DE"], /* Hangul Syllable */
+ ["\uB6DF", "\uB6DF"], /* Hangul Syllable */
+ ["\uB6E0", "\uB6E0"], /* Hangul Syllable */
+ ["\uB6E1", "\uB6E1"], /* Hangul Syllable */
+ ["\uB6E2", "\uB6E2"], /* Hangul Syllable */
+ ["\uB6E3", "\uB6E3"], /* Hangul Syllable */
+ ["\uB6E4", "\uB6E4"], /* Hangul Syllable */
+ ["\uB6E5", "\uB6E5"], /* Hangul Syllable */
+ ["\uB6E6", "\uB6E6"], /* Hangul Syllable */
+ ["\uB6E7", "\uB6E7"], /* Hangul Syllable */
+ ["\uB6E8", "\uB6E8"], /* Hangul Syllable */
+ ["\uB6E9", "\uB6E9"], /* Hangul Syllable */
+ ["\uB6EA", "\uB6EA"], /* Hangul Syllable */
+ ["\uB6EB", "\uB6EB"], /* Hangul Syllable */
+ ["\uB6EC", "\uB6EC"], /* Hangul Syllable */
+ ["\uB6ED", "\uB6ED"], /* Hangul Syllable */
+ ["\uB6EE", "\uB6EE"], /* Hangul Syllable */
+ ["\uB6EF", "\uB6EF"], /* Hangul Syllable */
+ ["\uB6F0", "\uB6F0"], /* Hangul Syllable */
+ ["\uB6F1", "\uB6F1"], /* Hangul Syllable */
+ ["\uB6F2", "\uB6F2"], /* Hangul Syllable */
+ ["\uB6F3", "\uB6F3"], /* Hangul Syllable */
+ ["\uB6F4", "\uB6F4"], /* Hangul Syllable */
+ ["\uB6F5", "\uB6F5"], /* Hangul Syllable */
+ ["\uB6F6", "\uB6F6"], /* Hangul Syllable */
+ ["\uB6F7", "\uB6F7"], /* Hangul Syllable */
+ ["\uB6F8", "\uB6F8"], /* Hangul Syllable */
+ ["\uB6F9", "\uB6F9"], /* Hangul Syllable */
+ ["\uB6FA", "\uB6FA"], /* Hangul Syllable */
+ ["\uB6FB", "\uB6FB"], /* Hangul Syllable */
+ ["\uB6FC", "\uB6FC"], /* Hangul Syllable */
+ ["\uB6FD", "\uB6FD"], /* Hangul Syllable */
+ ["\uB6FE", "\uB6FE"], /* Hangul Syllable */
+ ["\uB6FF", "\uB6FF"], /* Hangul Syllable */
+ ["\uB700", "\uB700"], /* Hangul Syllable */
+ ["\uB701", "\uB701"], /* Hangul Syllable */
+ ["\uB702", "\uB702"], /* Hangul Syllable */
+ ["\uB703", "\uB703"], /* Hangul Syllable */
+ ["\uB704", "\uB704"], /* Hangul Syllable */
+ ["\uB705", "\uB705"], /* Hangul Syllable */
+ ["\uB706", "\uB706"], /* Hangul Syllable */
+ ["\uB707", "\uB707"], /* Hangul Syllable */
+ ["\uB708", "\uB708"], /* Hangul Syllable */
+ ["\uB709", "\uB709"], /* Hangul Syllable */
+ ["\uB70A", "\uB70A"], /* Hangul Syllable */
+ ["\uB70B", "\uB70B"], /* Hangul Syllable */
+ ["\uB70C", "\uB70C"], /* Hangul Syllable */
+ ["\uB70D", "\uB70D"], /* Hangul Syllable */
+ ["\uB70E", "\uB70E"], /* Hangul Syllable */
+ ["\uB70F", "\uB70F"], /* Hangul Syllable */
+ ["\uB710", "\uB710"], /* Hangul Syllable */
+ ["\uB711", "\uB711"], /* Hangul Syllable */
+ ["\uB712", "\uB712"], /* Hangul Syllable */
+ ["\uB713", "\uB713"], /* Hangul Syllable */
+ ["\uB714", "\uB714"], /* Hangul Syllable */
+ ["\uB715", "\uB715"], /* Hangul Syllable */
+ ["\uB716", "\uB716"], /* Hangul Syllable */
+ ["\uB717", "\uB717"], /* Hangul Syllable */
+ ["\uB718", "\uB718"], /* Hangul Syllable */
+ ["\uB719", "\uB719"], /* Hangul Syllable */
+ ["\uB71A", "\uB71A"], /* Hangul Syllable */
+ ["\uB71B", "\uB71B"], /* Hangul Syllable */
+ ["\uB71C", "\uB71C"], /* Hangul Syllable */
+ ["\uB71D", "\uB71D"], /* Hangul Syllable */
+ ["\uB71E", "\uB71E"], /* Hangul Syllable */
+ ["\uB71F", "\uB71F"], /* Hangul Syllable */
+ ["\uB720", "\uB720"], /* Hangul Syllable */
+ ["\uB721", "\uB721"], /* Hangul Syllable */
+ ["\uB722", "\uB722"], /* Hangul Syllable */
+ ["\uB723", "\uB723"], /* Hangul Syllable */
+ ["\uB724", "\uB724"], /* Hangul Syllable */
+ ["\uB725", "\uB725"], /* Hangul Syllable */
+ ["\uB726", "\uB726"], /* Hangul Syllable */
+ ["\uB727", "\uB727"], /* Hangul Syllable */
+ ["\uB728", "\uB728"], /* Hangul Syllable */
+ ["\uB729", "\uB729"], /* Hangul Syllable */
+ ["\uB72A", "\uB72A"], /* Hangul Syllable */
+ ["\uB72B", "\uB72B"], /* Hangul Syllable */
+ ["\uB72C", "\uB72C"], /* Hangul Syllable */
+ ["\uB72D", "\uB72D"], /* Hangul Syllable */
+ ["\uB72E", "\uB72E"], /* Hangul Syllable */
+ ["\uB72F", "\uB72F"], /* Hangul Syllable */
+ ["\uB730", "\uB730"], /* Hangul Syllable */
+ ["\uB731", "\uB731"], /* Hangul Syllable */
+ ["\uB732", "\uB732"], /* Hangul Syllable */
+ ["\uB733", "\uB733"], /* Hangul Syllable */
+ ["\uB734", "\uB734"], /* Hangul Syllable */
+ ["\uB735", "\uB735"], /* Hangul Syllable */
+ ["\uB736", "\uB736"], /* Hangul Syllable */
+ ["\uB737", "\uB737"], /* Hangul Syllable */
+ ["\uB738", "\uB738"], /* Hangul Syllable */
+ ["\uB739", "\uB739"], /* Hangul Syllable */
+ ["\uB73A", "\uB73A"], /* Hangul Syllable */
+ ["\uB73B", "\uB73B"], /* Hangul Syllable */
+ ["\uB73C", "\uB73C"], /* Hangul Syllable */
+ ["\uB73D", "\uB73D"], /* Hangul Syllable */
+ ["\uB73E", "\uB73E"], /* Hangul Syllable */
+ ["\uB73F", "\uB73F"], /* Hangul Syllable */
+ ["\uB740", "\uB740"], /* Hangul Syllable */
+ ["\uB741", "\uB741"], /* Hangul Syllable */
+ ["\uB742", "\uB742"], /* Hangul Syllable */
+ ["\uB743", "\uB743"], /* Hangul Syllable */
+ ["\uB744", "\uB744"], /* Hangul Syllable */
+ ["\uB745", "\uB745"], /* Hangul Syllable */
+ ["\uB746", "\uB746"], /* Hangul Syllable */
+ ["\uB747", "\uB747"], /* Hangul Syllable */
+ ["\uB748", "\uB748"], /* Hangul Syllable */
+ ["\uB749", "\uB749"], /* Hangul Syllable */
+ ["\uB74A", "\uB74A"], /* Hangul Syllable */
+ ["\uB74B", "\uB74B"], /* Hangul Syllable */
+ ["\uB74C", "\uB74C"], /* Hangul Syllable */
+ ["\uB74D", "\uB74D"], /* Hangul Syllable */
+ ["\uB74E", "\uB74E"], /* Hangul Syllable */
+ ["\uB74F", "\uB74F"], /* Hangul Syllable */
+ ["\uB750", "\uB750"], /* Hangul Syllable */
+ ["\uB751", "\uB751"], /* Hangul Syllable */
+ ["\uB752", "\uB752"], /* Hangul Syllable */
+ ["\uB753", "\uB753"], /* Hangul Syllable */
+ ["\uB754", "\uB754"], /* Hangul Syllable */
+ ["\uB755", "\uB755"], /* Hangul Syllable */
+ ["\uB756", "\uB756"], /* Hangul Syllable */
+ ["\uB757", "\uB757"], /* Hangul Syllable */
+ ["\uB758", "\uB758"], /* Hangul Syllable */
+ ["\uB759", "\uB759"], /* Hangul Syllable */
+ ["\uB75A", "\uB75A"], /* Hangul Syllable */
+ ["\uB75B", "\uB75B"], /* Hangul Syllable */
+ ["\uB75C", "\uB75C"], /* Hangul Syllable */
+ ["\uB75D", "\uB75D"], /* Hangul Syllable */
+ ["\uB75E", "\uB75E"], /* Hangul Syllable */
+ ["\uB75F", "\uB75F"], /* Hangul Syllable */
+ ["\uB760", "\uB760"], /* Hangul Syllable */
+ ["\uB761", "\uB761"], /* Hangul Syllable */
+ ["\uB762", "\uB762"], /* Hangul Syllable */
+ ["\uB763", "\uB763"], /* Hangul Syllable */
+ ["\uB764", "\uB764"], /* Hangul Syllable */
+ ["\uB765", "\uB765"], /* Hangul Syllable */
+ ["\uB766", "\uB766"], /* Hangul Syllable */
+ ["\uB767", "\uB767"], /* Hangul Syllable */
+ ["\uB768", "\uB768"], /* Hangul Syllable */
+ ["\uB769", "\uB769"], /* Hangul Syllable */
+ ["\uB76A", "\uB76A"], /* Hangul Syllable */
+ ["\uB76B", "\uB76B"], /* Hangul Syllable */
+ ["\uB76C", "\uB76C"], /* Hangul Syllable */
+ ["\uB76D", "\uB76D"], /* Hangul Syllable */
+ ["\uB76E", "\uB76E"], /* Hangul Syllable */
+ ["\uB76F", "\uB76F"], /* Hangul Syllable */
+ ["\uB770", "\uB770"], /* Hangul Syllable */
+ ["\uB771", "\uB771"], /* Hangul Syllable */
+ ["\uB772", "\uB772"], /* Hangul Syllable */
+ ["\uB773", "\uB773"], /* Hangul Syllable */
+ ["\uB774", "\uB774"], /* Hangul Syllable */
+ ["\uB775", "\uB775"], /* Hangul Syllable */
+ ["\uB776", "\uB776"], /* Hangul Syllable */
+ ["\uB777", "\uB777"], /* Hangul Syllable */
+ ["\uB778", "\uB778"], /* Hangul Syllable */
+ ["\uB779", "\uB779"], /* Hangul Syllable */
+ ["\uB77A", "\uB77A"], /* Hangul Syllable */
+ ["\uB77B", "\uB77B"], /* Hangul Syllable */
+ ["\uB77C", "\uB77C"], /* Hangul Syllable */
+ ["\uB77D", "\uB77D"], /* Hangul Syllable */
+ ["\uB77E", "\uB77E"], /* Hangul Syllable */
+ ["\uB77F", "\uB77F"], /* Hangul Syllable */
+ ["\uB780", "\uB780"], /* Hangul Syllable */
+ ["\uB781", "\uB781"], /* Hangul Syllable */
+ ["\uB782", "\uB782"], /* Hangul Syllable */
+ ["\uB783", "\uB783"], /* Hangul Syllable */
+ ["\uB784", "\uB784"], /* Hangul Syllable */
+ ["\uB785", "\uB785"], /* Hangul Syllable */
+ ["\uB786", "\uB786"], /* Hangul Syllable */
+ ["\uB787", "\uB787"], /* Hangul Syllable */
+ ["\uB788", "\uB788"], /* Hangul Syllable */
+ ["\uB789", "\uB789"], /* Hangul Syllable */
+ ["\uB78A", "\uB78A"], /* Hangul Syllable */
+ ["\uB78B", "\uB78B"], /* Hangul Syllable */
+ ["\uB78C", "\uB78C"], /* Hangul Syllable */
+ ["\uB78D", "\uB78D"], /* Hangul Syllable */
+ ["\uB78E", "\uB78E"], /* Hangul Syllable */
+ ["\uB78F", "\uB78F"], /* Hangul Syllable */
+ ["\uB790", "\uB790"], /* Hangul Syllable */
+ ["\uB791", "\uB791"], /* Hangul Syllable */
+ ["\uB792", "\uB792"], /* Hangul Syllable */
+ ["\uB793", "\uB793"], /* Hangul Syllable */
+ ["\uB794", "\uB794"], /* Hangul Syllable */
+ ["\uB795", "\uB795"], /* Hangul Syllable */
+ ["\uB796", "\uB796"], /* Hangul Syllable */
+ ["\uB797", "\uB797"], /* Hangul Syllable */
+ ["\uB798", "\uB798"], /* Hangul Syllable */
+ ["\uB799", "\uB799"], /* Hangul Syllable */
+ ["\uB79A", "\uB79A"], /* Hangul Syllable */
+ ["\uB79B", "\uB79B"], /* Hangul Syllable */
+ ["\uB79C", "\uB79C"], /* Hangul Syllable */
+ ["\uB79D", "\uB79D"], /* Hangul Syllable */
+ ["\uB79E", "\uB79E"], /* Hangul Syllable */
+ ["\uB79F", "\uB79F"], /* Hangul Syllable */
+ ["\uB7A0", "\uB7A0"], /* Hangul Syllable */
+ ["\uB7A1", "\uB7A1"], /* Hangul Syllable */
+ ["\uB7A2", "\uB7A2"], /* Hangul Syllable */
+ ["\uB7A3", "\uB7A3"], /* Hangul Syllable */
+ ["\uB7A4", "\uB7A4"], /* Hangul Syllable */
+ ["\uB7A5", "\uB7A5"], /* Hangul Syllable */
+ ["\uB7A6", "\uB7A6"], /* Hangul Syllable */
+ ["\uB7A7", "\uB7A7"], /* Hangul Syllable */
+ ["\uB7A8", "\uB7A8"], /* Hangul Syllable */
+ ["\uB7A9", "\uB7A9"], /* Hangul Syllable */
+ ["\uB7AA", "\uB7AA"], /* Hangul Syllable */
+ ["\uB7AB", "\uB7AB"], /* Hangul Syllable */
+ ["\uB7AC", "\uB7AC"], /* Hangul Syllable */
+ ["\uB7AD", "\uB7AD"], /* Hangul Syllable */
+ ["\uB7AE", "\uB7AE"], /* Hangul Syllable */
+ ["\uB7AF", "\uB7AF"], /* Hangul Syllable */
+ ["\uB7B0", "\uB7B0"], /* Hangul Syllable */
+ ["\uB7B1", "\uB7B1"], /* Hangul Syllable */
+ ["\uB7B2", "\uB7B2"], /* Hangul Syllable */
+ ["\uB7B3", "\uB7B3"], /* Hangul Syllable */
+ ["\uB7B4", "\uB7B4"], /* Hangul Syllable */
+ ["\uB7B5", "\uB7B5"], /* Hangul Syllable */
+ ["\uB7B6", "\uB7B6"], /* Hangul Syllable */
+ ["\uB7B7", "\uB7B7"], /* Hangul Syllable */
+ ["\uB7B8", "\uB7B8"], /* Hangul Syllable */
+ ["\uB7B9", "\uB7B9"], /* Hangul Syllable */
+ ["\uB7BA", "\uB7BA"], /* Hangul Syllable */
+ ["\uB7BB", "\uB7BB"], /* Hangul Syllable */
+ ["\uB7BC", "\uB7BC"], /* Hangul Syllable */
+ ["\uB7BD", "\uB7BD"], /* Hangul Syllable */
+ ["\uB7BE", "\uB7BE"], /* Hangul Syllable */
+ ["\uB7BF", "\uB7BF"], /* Hangul Syllable */
+ ["\uB7C0", "\uB7C0"], /* Hangul Syllable */
+ ["\uB7C1", "\uB7C1"], /* Hangul Syllable */
+ ["\uB7C2", "\uB7C2"], /* Hangul Syllable */
+ ["\uB7C3", "\uB7C3"], /* Hangul Syllable */
+ ["\uB7C4", "\uB7C4"], /* Hangul Syllable */
+ ["\uB7C5", "\uB7C5"], /* Hangul Syllable */
+ ["\uB7C6", "\uB7C6"], /* Hangul Syllable */
+ ["\uB7C7", "\uB7C7"], /* Hangul Syllable */
+ ["\uB7C8", "\uB7C8"], /* Hangul Syllable */
+ ["\uB7C9", "\uB7C9"], /* Hangul Syllable */
+ ["\uB7CA", "\uB7CA"], /* Hangul Syllable */
+ ["\uB7CB", "\uB7CB"], /* Hangul Syllable */
+ ["\uB7CC", "\uB7CC"], /* Hangul Syllable */
+ ["\uB7CD", "\uB7CD"], /* Hangul Syllable */
+ ["\uB7CE", "\uB7CE"], /* Hangul Syllable */
+ ["\uB7CF", "\uB7CF"], /* Hangul Syllable */
+ ["\uB7D0", "\uB7D0"], /* Hangul Syllable */
+ ["\uB7D1", "\uB7D1"], /* Hangul Syllable */
+ ["\uB7D2", "\uB7D2"], /* Hangul Syllable */
+ ["\uB7D3", "\uB7D3"], /* Hangul Syllable */
+ ["\uB7D4", "\uB7D4"], /* Hangul Syllable */
+ ["\uB7D5", "\uB7D5"], /* Hangul Syllable */
+ ["\uB7D6", "\uB7D6"], /* Hangul Syllable */
+ ["\uB7D7", "\uB7D7"], /* Hangul Syllable */
+ ["\uB7D8", "\uB7D8"], /* Hangul Syllable */
+ ["\uB7D9", "\uB7D9"], /* Hangul Syllable */
+ ["\uB7DA", "\uB7DA"], /* Hangul Syllable */
+ ["\uB7DB", "\uB7DB"], /* Hangul Syllable */
+ ["\uB7DC", "\uB7DC"], /* Hangul Syllable */
+ ["\uB7DD", "\uB7DD"], /* Hangul Syllable */
+ ["\uB7DE", "\uB7DE"], /* Hangul Syllable */
+ ["\uB7DF", "\uB7DF"], /* Hangul Syllable */
+ ["\uB7E0", "\uB7E0"], /* Hangul Syllable */
+ ["\uB7E1", "\uB7E1"], /* Hangul Syllable */
+ ["\uB7E2", "\uB7E2"], /* Hangul Syllable */
+ ["\uB7E3", "\uB7E3"], /* Hangul Syllable */
+ ["\uB7E4", "\uB7E4"], /* Hangul Syllable */
+ ["\uB7E5", "\uB7E5"], /* Hangul Syllable */
+ ["\uB7E6", "\uB7E6"], /* Hangul Syllable */
+ ["\uB7E7", "\uB7E7"], /* Hangul Syllable */
+ ["\uB7E8", "\uB7E8"], /* Hangul Syllable */
+ ["\uB7E9", "\uB7E9"], /* Hangul Syllable */
+ ["\uB7EA", "\uB7EA"], /* Hangul Syllable */
+ ["\uB7EB", "\uB7EB"], /* Hangul Syllable */
+ ["\uB7EC", "\uB7EC"], /* Hangul Syllable */
+ ["\uB7ED", "\uB7ED"], /* Hangul Syllable */
+ ["\uB7EE", "\uB7EE"], /* Hangul Syllable */
+ ["\uB7EF", "\uB7EF"], /* Hangul Syllable */
+ ["\uB7F0", "\uB7F0"], /* Hangul Syllable */
+ ["\uB7F1", "\uB7F1"], /* Hangul Syllable */
+ ["\uB7F2", "\uB7F2"], /* Hangul Syllable */
+ ["\uB7F3", "\uB7F3"], /* Hangul Syllable */
+ ["\uB7F4", "\uB7F4"], /* Hangul Syllable */
+ ["\uB7F5", "\uB7F5"], /* Hangul Syllable */
+ ["\uB7F6", "\uB7F6"], /* Hangul Syllable */
+ ["\uB7F7", "\uB7F7"], /* Hangul Syllable */
+ ["\uB7F8", "\uB7F8"], /* Hangul Syllable */
+ ["\uB7F9", "\uB7F9"], /* Hangul Syllable */
+ ["\uB7FA", "\uB7FA"], /* Hangul Syllable */
+ ["\uB7FB", "\uB7FB"], /* Hangul Syllable */
+ ["\uB7FC", "\uB7FC"], /* Hangul Syllable */
+ ["\uB7FD", "\uB7FD"], /* Hangul Syllable */
+ ["\uB7FE", "\uB7FE"], /* Hangul Syllable */
+ ["\uB7FF", "\uB7FF"], /* Hangul Syllable */
+ ["\uB800", "\uB800"], /* Hangul Syllable */
+ ["\uB801", "\uB801"], /* Hangul Syllable */
+ ["\uB802", "\uB802"], /* Hangul Syllable */
+ ["\uB803", "\uB803"], /* Hangul Syllable */
+ ["\uB804", "\uB804"], /* Hangul Syllable */
+ ["\uB805", "\uB805"], /* Hangul Syllable */
+ ["\uB806", "\uB806"], /* Hangul Syllable */
+ ["\uB807", "\uB807"], /* Hangul Syllable */
+ ["\uB808", "\uB808"], /* Hangul Syllable */
+ ["\uB809", "\uB809"], /* Hangul Syllable */
+ ["\uB80A", "\uB80A"], /* Hangul Syllable */
+ ["\uB80B", "\uB80B"], /* Hangul Syllable */
+ ["\uB80C", "\uB80C"], /* Hangul Syllable */
+ ["\uB80D", "\uB80D"], /* Hangul Syllable */
+ ["\uB80E", "\uB80E"], /* Hangul Syllable */
+ ["\uB80F", "\uB80F"], /* Hangul Syllable */
+ ["\uB810", "\uB810"], /* Hangul Syllable */
+ ["\uB811", "\uB811"], /* Hangul Syllable */
+ ["\uB812", "\uB812"], /* Hangul Syllable */
+ ["\uB813", "\uB813"], /* Hangul Syllable */
+ ["\uB814", "\uB814"], /* Hangul Syllable */
+ ["\uB815", "\uB815"], /* Hangul Syllable */
+ ["\uB816", "\uB816"], /* Hangul Syllable */
+ ["\uB817", "\uB817"], /* Hangul Syllable */
+ ["\uB818", "\uB818"], /* Hangul Syllable */
+ ["\uB819", "\uB819"], /* Hangul Syllable */
+ ["\uB81A", "\uB81A"], /* Hangul Syllable */
+ ["\uB81B", "\uB81B"], /* Hangul Syllable */
+ ["\uB81C", "\uB81C"], /* Hangul Syllable */
+ ["\uB81D", "\uB81D"], /* Hangul Syllable */
+ ["\uB81E", "\uB81E"], /* Hangul Syllable */
+ ["\uB81F", "\uB81F"], /* Hangul Syllable */
+ ["\uB820", "\uB820"], /* Hangul Syllable */
+ ["\uB821", "\uB821"], /* Hangul Syllable */
+ ["\uB822", "\uB822"], /* Hangul Syllable */
+ ["\uB823", "\uB823"], /* Hangul Syllable */
+ ["\uB824", "\uB824"], /* Hangul Syllable */
+ ["\uB825", "\uB825"], /* Hangul Syllable */
+ ["\uB826", "\uB826"], /* Hangul Syllable */
+ ["\uB827", "\uB827"], /* Hangul Syllable */
+ ["\uB828", "\uB828"], /* Hangul Syllable */
+ ["\uB829", "\uB829"], /* Hangul Syllable */
+ ["\uB82A", "\uB82A"], /* Hangul Syllable */
+ ["\uB82B", "\uB82B"], /* Hangul Syllable */
+ ["\uB82C", "\uB82C"], /* Hangul Syllable */
+ ["\uB82D", "\uB82D"], /* Hangul Syllable */
+ ["\uB82E", "\uB82E"], /* Hangul Syllable */
+ ["\uB82F", "\uB82F"], /* Hangul Syllable */
+ ["\uB830", "\uB830"], /* Hangul Syllable */
+ ["\uB831", "\uB831"], /* Hangul Syllable */
+ ["\uB832", "\uB832"], /* Hangul Syllable */
+ ["\uB833", "\uB833"], /* Hangul Syllable */
+ ["\uB834", "\uB834"], /* Hangul Syllable */
+ ["\uB835", "\uB835"], /* Hangul Syllable */
+ ["\uB836", "\uB836"], /* Hangul Syllable */
+ ["\uB837", "\uB837"], /* Hangul Syllable */
+ ["\uB838", "\uB838"], /* Hangul Syllable */
+ ["\uB839", "\uB839"], /* Hangul Syllable */
+ ["\uB83A", "\uB83A"], /* Hangul Syllable */
+ ["\uB83B", "\uB83B"], /* Hangul Syllable */
+ ["\uB83C", "\uB83C"], /* Hangul Syllable */
+ ["\uB83D", "\uB83D"], /* Hangul Syllable */
+ ["\uB83E", "\uB83E"], /* Hangul Syllable */
+ ["\uB83F", "\uB83F"], /* Hangul Syllable */
+ ["\uB840", "\uB840"], /* Hangul Syllable */
+ ["\uB841", "\uB841"], /* Hangul Syllable */
+ ["\uB842", "\uB842"], /* Hangul Syllable */
+ ["\uB843", "\uB843"], /* Hangul Syllable */
+ ["\uB844", "\uB844"], /* Hangul Syllable */
+ ["\uB845", "\uB845"], /* Hangul Syllable */
+ ["\uB846", "\uB846"], /* Hangul Syllable */
+ ["\uB847", "\uB847"], /* Hangul Syllable */
+ ["\uB848", "\uB848"], /* Hangul Syllable */
+ ["\uB849", "\uB849"], /* Hangul Syllable */
+ ["\uB84A", "\uB84A"], /* Hangul Syllable */
+ ["\uB84B", "\uB84B"], /* Hangul Syllable */
+ ["\uB84C", "\uB84C"], /* Hangul Syllable */
+ ["\uB84D", "\uB84D"], /* Hangul Syllable */
+ ["\uB84E", "\uB84E"], /* Hangul Syllable */
+ ["\uB84F", "\uB84F"], /* Hangul Syllable */
+ ["\uB850", "\uB850"], /* Hangul Syllable */
+ ["\uB851", "\uB851"], /* Hangul Syllable */
+ ["\uB852", "\uB852"], /* Hangul Syllable */
+ ["\uB853", "\uB853"], /* Hangul Syllable */
+ ["\uB854", "\uB854"], /* Hangul Syllable */
+ ["\uB855", "\uB855"], /* Hangul Syllable */
+ ["\uB856", "\uB856"], /* Hangul Syllable */
+ ["\uB857", "\uB857"], /* Hangul Syllable */
+ ["\uB858", "\uB858"], /* Hangul Syllable */
+ ["\uB859", "\uB859"], /* Hangul Syllable */
+ ["\uB85A", "\uB85A"], /* Hangul Syllable */
+ ["\uB85B", "\uB85B"], /* Hangul Syllable */
+ ["\uB85C", "\uB85C"], /* Hangul Syllable */
+ ["\uB85D", "\uB85D"], /* Hangul Syllable */
+ ["\uB85E", "\uB85E"], /* Hangul Syllable */
+ ["\uB85F", "\uB85F"], /* Hangul Syllable */
+ ["\uB860", "\uB860"], /* Hangul Syllable */
+ ["\uB861", "\uB861"], /* Hangul Syllable */
+ ["\uB862", "\uB862"], /* Hangul Syllable */
+ ["\uB863", "\uB863"], /* Hangul Syllable */
+ ["\uB864", "\uB864"], /* Hangul Syllable */
+ ["\uB865", "\uB865"], /* Hangul Syllable */
+ ["\uB866", "\uB866"], /* Hangul Syllable */
+ ["\uB867", "\uB867"], /* Hangul Syllable */
+ ["\uB868", "\uB868"], /* Hangul Syllable */
+ ["\uB869", "\uB869"], /* Hangul Syllable */
+ ["\uB86A", "\uB86A"], /* Hangul Syllable */
+ ["\uB86B", "\uB86B"], /* Hangul Syllable */
+ ["\uB86C", "\uB86C"], /* Hangul Syllable */
+ ["\uB86D", "\uB86D"], /* Hangul Syllable */
+ ["\uB86E", "\uB86E"], /* Hangul Syllable */
+ ["\uB86F", "\uB86F"], /* Hangul Syllable */
+ ["\uB870", "\uB870"], /* Hangul Syllable */
+ ["\uB871", "\uB871"], /* Hangul Syllable */
+ ["\uB872", "\uB872"], /* Hangul Syllable */
+ ["\uB873", "\uB873"], /* Hangul Syllable */
+ ["\uB874", "\uB874"], /* Hangul Syllable */
+ ["\uB875", "\uB875"], /* Hangul Syllable */
+ ["\uB876", "\uB876"], /* Hangul Syllable */
+ ["\uB877", "\uB877"], /* Hangul Syllable */
+ ["\uB878", "\uB878"], /* Hangul Syllable */
+ ["\uB879", "\uB879"], /* Hangul Syllable */
+ ["\uB87A", "\uB87A"], /* Hangul Syllable */
+ ["\uB87B", "\uB87B"], /* Hangul Syllable */
+ ["\uB87C", "\uB87C"], /* Hangul Syllable */
+ ["\uB87D", "\uB87D"], /* Hangul Syllable */
+ ["\uB87E", "\uB87E"], /* Hangul Syllable */
+ ["\uB87F", "\uB87F"], /* Hangul Syllable */
+ ["\uB880", "\uB880"], /* Hangul Syllable */
+ ["\uB881", "\uB881"], /* Hangul Syllable */
+ ["\uB882", "\uB882"], /* Hangul Syllable */
+ ["\uB883", "\uB883"], /* Hangul Syllable */
+ ["\uB884", "\uB884"], /* Hangul Syllable */
+ ["\uB885", "\uB885"], /* Hangul Syllable */
+ ["\uB886", "\uB886"], /* Hangul Syllable */
+ ["\uB887", "\uB887"], /* Hangul Syllable */
+ ["\uB888", "\uB888"], /* Hangul Syllable */
+ ["\uB889", "\uB889"], /* Hangul Syllable */
+ ["\uB88A", "\uB88A"], /* Hangul Syllable */
+ ["\uB88B", "\uB88B"], /* Hangul Syllable */
+ ["\uB88C", "\uB88C"], /* Hangul Syllable */
+ ["\uB88D", "\uB88D"], /* Hangul Syllable */
+ ["\uB88E", "\uB88E"], /* Hangul Syllable */
+ ["\uB88F", "\uB88F"], /* Hangul Syllable */
+ ["\uB890", "\uB890"], /* Hangul Syllable */
+ ["\uB891", "\uB891"], /* Hangul Syllable */
+ ["\uB892", "\uB892"], /* Hangul Syllable */
+ ["\uB893", "\uB893"], /* Hangul Syllable */
+ ["\uB894", "\uB894"], /* Hangul Syllable */
+ ["\uB895", "\uB895"], /* Hangul Syllable */
+ ["\uB896", "\uB896"], /* Hangul Syllable */
+ ["\uB897", "\uB897"], /* Hangul Syllable */
+ ["\uB898", "\uB898"], /* Hangul Syllable */
+ ["\uB899", "\uB899"], /* Hangul Syllable */
+ ["\uB89A", "\uB89A"], /* Hangul Syllable */
+ ["\uB89B", "\uB89B"], /* Hangul Syllable */
+ ["\uB89C", "\uB89C"], /* Hangul Syllable */
+ ["\uB89D", "\uB89D"], /* Hangul Syllable */
+ ["\uB89E", "\uB89E"], /* Hangul Syllable */
+ ["\uB89F", "\uB89F"], /* Hangul Syllable */
+ ["\uB8A0", "\uB8A0"], /* Hangul Syllable */
+ ["\uB8A1", "\uB8A1"], /* Hangul Syllable */
+ ["\uB8A2", "\uB8A2"], /* Hangul Syllable */
+ ["\uB8A3", "\uB8A3"], /* Hangul Syllable */
+ ["\uB8A4", "\uB8A4"], /* Hangul Syllable */
+ ["\uB8A5", "\uB8A5"], /* Hangul Syllable */
+ ["\uB8A6", "\uB8A6"], /* Hangul Syllable */
+ ["\uB8A7", "\uB8A7"], /* Hangul Syllable */
+ ["\uB8A8", "\uB8A8"], /* Hangul Syllable */
+ ["\uB8A9", "\uB8A9"], /* Hangul Syllable */
+ ["\uB8AA", "\uB8AA"], /* Hangul Syllable */
+ ["\uB8AB", "\uB8AB"], /* Hangul Syllable */
+ ["\uB8AC", "\uB8AC"], /* Hangul Syllable */
+ ["\uB8AD", "\uB8AD"], /* Hangul Syllable */
+ ["\uB8AE", "\uB8AE"], /* Hangul Syllable */
+ ["\uB8AF", "\uB8AF"], /* Hangul Syllable */
+ ["\uB8B0", "\uB8B0"], /* Hangul Syllable */
+ ["\uB8B1", "\uB8B1"], /* Hangul Syllable */
+ ["\uB8B2", "\uB8B2"], /* Hangul Syllable */
+ ["\uB8B3", "\uB8B3"], /* Hangul Syllable */
+ ["\uB8B4", "\uB8B4"], /* Hangul Syllable */
+ ["\uB8B5", "\uB8B5"], /* Hangul Syllable */
+ ["\uB8B6", "\uB8B6"], /* Hangul Syllable */
+ ["\uB8B7", "\uB8B7"], /* Hangul Syllable */
+ ["\uB8B8", "\uB8B8"], /* Hangul Syllable */
+ ["\uB8B9", "\uB8B9"], /* Hangul Syllable */
+ ["\uB8BA", "\uB8BA"], /* Hangul Syllable */
+ ["\uB8BB", "\uB8BB"], /* Hangul Syllable */
+ ["\uB8BC", "\uB8BC"], /* Hangul Syllable */
+ ["\uB8BD", "\uB8BD"], /* Hangul Syllable */
+ ["\uB8BE", "\uB8BE"], /* Hangul Syllable */
+ ["\uB8BF", "\uB8BF"], /* Hangul Syllable */
+ ["\uB8C0", "\uB8C0"], /* Hangul Syllable */
+ ["\uB8C1", "\uB8C1"], /* Hangul Syllable */
+ ["\uB8C2", "\uB8C2"], /* Hangul Syllable */
+ ["\uB8C3", "\uB8C3"], /* Hangul Syllable */
+ ["\uB8C4", "\uB8C4"], /* Hangul Syllable */
+ ["\uB8C5", "\uB8C5"], /* Hangul Syllable */
+ ["\uB8C6", "\uB8C6"], /* Hangul Syllable */
+ ["\uB8C7", "\uB8C7"], /* Hangul Syllable */
+ ["\uB8C8", "\uB8C8"], /* Hangul Syllable */
+ ["\uB8C9", "\uB8C9"], /* Hangul Syllable */
+ ["\uB8CA", "\uB8CA"], /* Hangul Syllable */
+ ["\uB8CB", "\uB8CB"], /* Hangul Syllable */
+ ["\uB8CC", "\uB8CC"], /* Hangul Syllable */
+ ["\uB8CD", "\uB8CD"], /* Hangul Syllable */
+ ["\uB8CE", "\uB8CE"], /* Hangul Syllable */
+ ["\uB8CF", "\uB8CF"], /* Hangul Syllable */
+ ["\uB8D0", "\uB8D0"], /* Hangul Syllable */
+ ["\uB8D1", "\uB8D1"], /* Hangul Syllable */
+ ["\uB8D2", "\uB8D2"], /* Hangul Syllable */
+ ["\uB8D3", "\uB8D3"], /* Hangul Syllable */
+ ["\uB8D4", "\uB8D4"], /* Hangul Syllable */
+ ["\uB8D5", "\uB8D5"], /* Hangul Syllable */
+ ["\uB8D6", "\uB8D6"], /* Hangul Syllable */
+ ["\uB8D7", "\uB8D7"], /* Hangul Syllable */
+ ["\uB8D8", "\uB8D8"], /* Hangul Syllable */
+ ["\uB8D9", "\uB8D9"], /* Hangul Syllable */
+ ["\uB8DA", "\uB8DA"], /* Hangul Syllable */
+ ["\uB8DB", "\uB8DB"], /* Hangul Syllable */
+ ["\uB8DC", "\uB8DC"], /* Hangul Syllable */
+ ["\uB8DD", "\uB8DD"], /* Hangul Syllable */
+ ["\uB8DE", "\uB8DE"], /* Hangul Syllable */
+ ["\uB8DF", "\uB8DF"], /* Hangul Syllable */
+ ["\uB8E0", "\uB8E0"], /* Hangul Syllable */
+ ["\uB8E1", "\uB8E1"], /* Hangul Syllable */
+ ["\uB8E2", "\uB8E2"], /* Hangul Syllable */
+ ["\uB8E3", "\uB8E3"], /* Hangul Syllable */
+ ["\uB8E4", "\uB8E4"], /* Hangul Syllable */
+ ["\uB8E5", "\uB8E5"], /* Hangul Syllable */
+ ["\uB8E6", "\uB8E6"], /* Hangul Syllable */
+ ["\uB8E7", "\uB8E7"], /* Hangul Syllable */
+ ["\uB8E8", "\uB8E8"], /* Hangul Syllable */
+ ["\uB8E9", "\uB8E9"], /* Hangul Syllable */
+ ["\uB8EA", "\uB8EA"], /* Hangul Syllable */
+ ["\uB8EB", "\uB8EB"], /* Hangul Syllable */
+ ["\uB8EC", "\uB8EC"], /* Hangul Syllable */
+ ["\uB8ED", "\uB8ED"], /* Hangul Syllable */
+ ["\uB8EE", "\uB8EE"], /* Hangul Syllable */
+ ["\uB8EF", "\uB8EF"], /* Hangul Syllable */
+ ["\uB8F0", "\uB8F0"], /* Hangul Syllable */
+ ["\uB8F1", "\uB8F1"], /* Hangul Syllable */
+ ["\uB8F2", "\uB8F2"], /* Hangul Syllable */
+ ["\uB8F3", "\uB8F3"], /* Hangul Syllable */
+ ["\uB8F4", "\uB8F4"], /* Hangul Syllable */
+ ["\uB8F5", "\uB8F5"], /* Hangul Syllable */
+ ["\uB8F6", "\uB8F6"], /* Hangul Syllable */
+ ["\uB8F7", "\uB8F7"], /* Hangul Syllable */
+ ["\uB8F8", "\uB8F8"], /* Hangul Syllable */
+ ["\uB8F9", "\uB8F9"], /* Hangul Syllable */
+ ["\uB8FA", "\uB8FA"], /* Hangul Syllable */
+ ["\uB8FB", "\uB8FB"], /* Hangul Syllable */
+ ["\uB8FC", "\uB8FC"], /* Hangul Syllable */
+ ["\uB8FD", "\uB8FD"], /* Hangul Syllable */
+ ["\uB8FE", "\uB8FE"], /* Hangul Syllable */
+ ["\uB8FF", "\uB8FF"], /* Hangul Syllable */
+ ["\uB900", "\uB900"], /* Hangul Syllable */
+ ["\uB901", "\uB901"], /* Hangul Syllable */
+ ["\uB902", "\uB902"], /* Hangul Syllable */
+ ["\uB903", "\uB903"], /* Hangul Syllable */
+ ["\uB904", "\uB904"], /* Hangul Syllable */
+ ["\uB905", "\uB905"], /* Hangul Syllable */
+ ["\uB906", "\uB906"], /* Hangul Syllable */
+ ["\uB907", "\uB907"], /* Hangul Syllable */
+ ["\uB908", "\uB908"], /* Hangul Syllable */
+ ["\uB909", "\uB909"], /* Hangul Syllable */
+ ["\uB90A", "\uB90A"], /* Hangul Syllable */
+ ["\uB90B", "\uB90B"], /* Hangul Syllable */
+ ["\uB90C", "\uB90C"], /* Hangul Syllable */
+ ["\uB90D", "\uB90D"], /* Hangul Syllable */
+ ["\uB90E", "\uB90E"], /* Hangul Syllable */
+ ["\uB90F", "\uB90F"], /* Hangul Syllable */
+ ["\uB910", "\uB910"], /* Hangul Syllable */
+ ["\uB911", "\uB911"], /* Hangul Syllable */
+ ["\uB912", "\uB912"], /* Hangul Syllable */
+ ["\uB913", "\uB913"], /* Hangul Syllable */
+ ["\uB914", "\uB914"], /* Hangul Syllable */
+ ["\uB915", "\uB915"], /* Hangul Syllable */
+ ["\uB916", "\uB916"], /* Hangul Syllable */
+ ["\uB917", "\uB917"], /* Hangul Syllable */
+ ["\uB918", "\uB918"], /* Hangul Syllable */
+ ["\uB919", "\uB919"], /* Hangul Syllable */
+ ["\uB91A", "\uB91A"], /* Hangul Syllable */
+ ["\uB91B", "\uB91B"], /* Hangul Syllable */
+ ["\uB91C", "\uB91C"], /* Hangul Syllable */
+ ["\uB91D", "\uB91D"], /* Hangul Syllable */
+ ["\uB91E", "\uB91E"], /* Hangul Syllable */
+ ["\uB91F", "\uB91F"], /* Hangul Syllable */
+ ["\uB920", "\uB920"], /* Hangul Syllable */
+ ["\uB921", "\uB921"], /* Hangul Syllable */
+ ["\uB922", "\uB922"], /* Hangul Syllable */
+ ["\uB923", "\uB923"], /* Hangul Syllable */
+ ["\uB924", "\uB924"], /* Hangul Syllable */
+ ["\uB925", "\uB925"], /* Hangul Syllable */
+ ["\uB926", "\uB926"], /* Hangul Syllable */
+ ["\uB927", "\uB927"], /* Hangul Syllable */
+ ["\uB928", "\uB928"], /* Hangul Syllable */
+ ["\uB929", "\uB929"], /* Hangul Syllable */
+ ["\uB92A", "\uB92A"], /* Hangul Syllable */
+ ["\uB92B", "\uB92B"], /* Hangul Syllable */
+ ["\uB92C", "\uB92C"], /* Hangul Syllable */
+ ["\uB92D", "\uB92D"], /* Hangul Syllable */
+ ["\uB92E", "\uB92E"], /* Hangul Syllable */
+ ["\uB92F", "\uB92F"], /* Hangul Syllable */
+ ["\uB930", "\uB930"], /* Hangul Syllable */
+ ["\uB931", "\uB931"], /* Hangul Syllable */
+ ["\uB932", "\uB932"], /* Hangul Syllable */
+ ["\uB933", "\uB933"], /* Hangul Syllable */
+ ["\uB934", "\uB934"], /* Hangul Syllable */
+ ["\uB935", "\uB935"], /* Hangul Syllable */
+ ["\uB936", "\uB936"], /* Hangul Syllable */
+ ["\uB937", "\uB937"], /* Hangul Syllable */
+ ["\uB938", "\uB938"], /* Hangul Syllable */
+ ["\uB939", "\uB939"], /* Hangul Syllable */
+ ["\uB93A", "\uB93A"], /* Hangul Syllable */
+ ["\uB93B", "\uB93B"], /* Hangul Syllable */
+ ["\uB93C", "\uB93C"], /* Hangul Syllable */
+ ["\uB93D", "\uB93D"], /* Hangul Syllable */
+ ["\uB93E", "\uB93E"], /* Hangul Syllable */
+ ["\uB93F", "\uB93F"], /* Hangul Syllable */
+ ["\uB940", "\uB940"], /* Hangul Syllable */
+ ["\uB941", "\uB941"], /* Hangul Syllable */
+ ["\uB942", "\uB942"], /* Hangul Syllable */
+ ["\uB943", "\uB943"], /* Hangul Syllable */
+ ["\uB944", "\uB944"], /* Hangul Syllable */
+ ["\uB945", "\uB945"], /* Hangul Syllable */
+ ["\uB946", "\uB946"], /* Hangul Syllable */
+ ["\uB947", "\uB947"], /* Hangul Syllable */
+ ["\uB948", "\uB948"], /* Hangul Syllable */
+ ["\uB949", "\uB949"], /* Hangul Syllable */
+ ["\uB94A", "\uB94A"], /* Hangul Syllable */
+ ["\uB94B", "\uB94B"], /* Hangul Syllable */
+ ["\uB94C", "\uB94C"], /* Hangul Syllable */
+ ["\uB94D", "\uB94D"], /* Hangul Syllable */
+ ["\uB94E", "\uB94E"], /* Hangul Syllable */
+ ["\uB94F", "\uB94F"], /* Hangul Syllable */
+ ["\uB950", "\uB950"], /* Hangul Syllable */
+ ["\uB951", "\uB951"], /* Hangul Syllable */
+ ["\uB952", "\uB952"], /* Hangul Syllable */
+ ["\uB953", "\uB953"], /* Hangul Syllable */
+ ["\uB954", "\uB954"], /* Hangul Syllable */
+ ["\uB955", "\uB955"], /* Hangul Syllable */
+ ["\uB956", "\uB956"], /* Hangul Syllable */
+ ["\uB957", "\uB957"], /* Hangul Syllable */
+ ["\uB958", "\uB958"], /* Hangul Syllable */
+ ["\uB959", "\uB959"], /* Hangul Syllable */
+ ["\uB95A", "\uB95A"], /* Hangul Syllable */
+ ["\uB95B", "\uB95B"], /* Hangul Syllable */
+ ["\uB95C", "\uB95C"], /* Hangul Syllable */
+ ["\uB95D", "\uB95D"], /* Hangul Syllable */
+ ["\uB95E", "\uB95E"], /* Hangul Syllable */
+ ["\uB95F", "\uB95F"], /* Hangul Syllable */
+ ["\uB960", "\uB960"], /* Hangul Syllable */
+ ["\uB961", "\uB961"], /* Hangul Syllable */
+ ["\uB962", "\uB962"], /* Hangul Syllable */
+ ["\uB963", "\uB963"], /* Hangul Syllable */
+ ["\uB964", "\uB964"], /* Hangul Syllable */
+ ["\uB965", "\uB965"], /* Hangul Syllable */
+ ["\uB966", "\uB966"], /* Hangul Syllable */
+ ["\uB967", "\uB967"], /* Hangul Syllable */
+ ["\uB968", "\uB968"], /* Hangul Syllable */
+ ["\uB969", "\uB969"], /* Hangul Syllable */
+ ["\uB96A", "\uB96A"], /* Hangul Syllable */
+ ["\uB96B", "\uB96B"], /* Hangul Syllable */
+ ["\uB96C", "\uB96C"], /* Hangul Syllable */
+ ["\uB96D", "\uB96D"], /* Hangul Syllable */
+ ["\uB96E", "\uB96E"], /* Hangul Syllable */
+ ["\uB96F", "\uB96F"], /* Hangul Syllable */
+ ["\uB970", "\uB970"], /* Hangul Syllable */
+ ["\uB971", "\uB971"], /* Hangul Syllable */
+ ["\uB972", "\uB972"], /* Hangul Syllable */
+ ["\uB973", "\uB973"], /* Hangul Syllable */
+ ["\uB974", "\uB974"], /* Hangul Syllable */
+ ["\uB975", "\uB975"], /* Hangul Syllable */
+ ["\uB976", "\uB976"], /* Hangul Syllable */
+ ["\uB977", "\uB977"], /* Hangul Syllable */
+ ["\uB978", "\uB978"], /* Hangul Syllable */
+ ["\uB979", "\uB979"], /* Hangul Syllable */
+ ["\uB97A", "\uB97A"], /* Hangul Syllable */
+ ["\uB97B", "\uB97B"], /* Hangul Syllable */
+ ["\uB97C", "\uB97C"], /* Hangul Syllable */
+ ["\uB97D", "\uB97D"], /* Hangul Syllable */
+ ["\uB97E", "\uB97E"], /* Hangul Syllable */
+ ["\uB97F", "\uB97F"], /* Hangul Syllable */
+ ["\uB980", "\uB980"], /* Hangul Syllable */
+ ["\uB981", "\uB981"], /* Hangul Syllable */
+ ["\uB982", "\uB982"], /* Hangul Syllable */
+ ["\uB983", "\uB983"], /* Hangul Syllable */
+ ["\uB984", "\uB984"], /* Hangul Syllable */
+ ["\uB985", "\uB985"], /* Hangul Syllable */
+ ["\uB986", "\uB986"], /* Hangul Syllable */
+ ["\uB987", "\uB987"], /* Hangul Syllable */
+ ["\uB988", "\uB988"], /* Hangul Syllable */
+ ["\uB989", "\uB989"], /* Hangul Syllable */
+ ["\uB98A", "\uB98A"], /* Hangul Syllable */
+ ["\uB98B", "\uB98B"], /* Hangul Syllable */
+ ["\uB98C", "\uB98C"], /* Hangul Syllable */
+ ["\uB98D", "\uB98D"], /* Hangul Syllable */
+ ["\uB98E", "\uB98E"], /* Hangul Syllable */
+ ["\uB98F", "\uB98F"], /* Hangul Syllable */
+ ["\uB990", "\uB990"], /* Hangul Syllable */
+ ["\uB991", "\uB991"], /* Hangul Syllable */
+ ["\uB992", "\uB992"], /* Hangul Syllable */
+ ["\uB993", "\uB993"], /* Hangul Syllable */
+ ["\uB994", "\uB994"], /* Hangul Syllable */
+ ["\uB995", "\uB995"], /* Hangul Syllable */
+ ["\uB996", "\uB996"], /* Hangul Syllable */
+ ["\uB997", "\uB997"], /* Hangul Syllable */
+ ["\uB998", "\uB998"], /* Hangul Syllable */
+ ["\uB999", "\uB999"], /* Hangul Syllable */
+ ["\uB99A", "\uB99A"], /* Hangul Syllable */
+ ["\uB99B", "\uB99B"], /* Hangul Syllable */
+ ["\uB99C", "\uB99C"], /* Hangul Syllable */
+ ["\uB99D", "\uB99D"], /* Hangul Syllable */
+ ["\uB99E", "\uB99E"], /* Hangul Syllable */
+ ["\uB99F", "\uB99F"], /* Hangul Syllable */
+ ["\uB9A0", "\uB9A0"], /* Hangul Syllable */
+ ["\uB9A1", "\uB9A1"], /* Hangul Syllable */
+ ["\uB9A2", "\uB9A2"], /* Hangul Syllable */
+ ["\uB9A3", "\uB9A3"], /* Hangul Syllable */
+ ["\uB9A4", "\uB9A4"], /* Hangul Syllable */
+ ["\uB9A5", "\uB9A5"], /* Hangul Syllable */
+ ["\uB9A6", "\uB9A6"], /* Hangul Syllable */
+ ["\uB9A7", "\uB9A7"], /* Hangul Syllable */
+ ["\uB9A8", "\uB9A8"], /* Hangul Syllable */
+ ["\uB9A9", "\uB9A9"], /* Hangul Syllable */
+ ["\uB9AA", "\uB9AA"], /* Hangul Syllable */
+ ["\uB9AB", "\uB9AB"], /* Hangul Syllable */
+ ["\uB9AC", "\uB9AC"], /* Hangul Syllable */
+ ["\uB9AD", "\uB9AD"], /* Hangul Syllable */
+ ["\uB9AE", "\uB9AE"], /* Hangul Syllable */
+ ["\uB9AF", "\uB9AF"], /* Hangul Syllable */
+ ["\uB9B0", "\uB9B0"], /* Hangul Syllable */
+ ["\uB9B1", "\uB9B1"], /* Hangul Syllable */
+ ["\uB9B2", "\uB9B2"], /* Hangul Syllable */
+ ["\uB9B3", "\uB9B3"], /* Hangul Syllable */
+ ["\uB9B4", "\uB9B4"], /* Hangul Syllable */
+ ["\uB9B5", "\uB9B5"], /* Hangul Syllable */
+ ["\uB9B6", "\uB9B6"], /* Hangul Syllable */
+ ["\uB9B7", "\uB9B7"], /* Hangul Syllable */
+ ["\uB9B8", "\uB9B8"], /* Hangul Syllable */
+ ["\uB9B9", "\uB9B9"], /* Hangul Syllable */
+ ["\uB9BA", "\uB9BA"], /* Hangul Syllable */
+ ["\uB9BB", "\uB9BB"], /* Hangul Syllable */
+ ["\uB9BC", "\uB9BC"], /* Hangul Syllable */
+ ["\uB9BD", "\uB9BD"], /* Hangul Syllable */
+ ["\uB9BE", "\uB9BE"], /* Hangul Syllable */
+ ["\uB9BF", "\uB9BF"], /* Hangul Syllable */
+ ["\uB9C0", "\uB9C0"], /* Hangul Syllable */
+ ["\uB9C1", "\uB9C1"], /* Hangul Syllable */
+ ["\uB9C2", "\uB9C2"], /* Hangul Syllable */
+ ["\uB9C3", "\uB9C3"], /* Hangul Syllable */
+ ["\uB9C4", "\uB9C4"], /* Hangul Syllable */
+ ["\uB9C5", "\uB9C5"], /* Hangul Syllable */
+ ["\uB9C6", "\uB9C6"], /* Hangul Syllable */
+ ["\uB9C7", "\uB9C7"], /* Hangul Syllable */
+ ["\uB9C8", "\uB9C8"], /* Hangul Syllable */
+ ["\uB9C9", "\uB9C9"], /* Hangul Syllable */
+ ["\uB9CA", "\uB9CA"], /* Hangul Syllable */
+ ["\uB9CB", "\uB9CB"], /* Hangul Syllable */
+ ["\uB9CC", "\uB9CC"], /* Hangul Syllable */
+ ["\uB9CD", "\uB9CD"], /* Hangul Syllable */
+ ["\uB9CE", "\uB9CE"], /* Hangul Syllable */
+ ["\uB9CF", "\uB9CF"], /* Hangul Syllable */
+ ["\uB9D0", "\uB9D0"], /* Hangul Syllable */
+ ["\uB9D1", "\uB9D1"], /* Hangul Syllable */
+ ["\uB9D2", "\uB9D2"], /* Hangul Syllable */
+ ["\uB9D3", "\uB9D3"], /* Hangul Syllable */
+ ["\uB9D4", "\uB9D4"], /* Hangul Syllable */
+ ["\uB9D5", "\uB9D5"], /* Hangul Syllable */
+ ["\uB9D6", "\uB9D6"], /* Hangul Syllable */
+ ["\uB9D7", "\uB9D7"], /* Hangul Syllable */
+ ["\uB9D8", "\uB9D8"], /* Hangul Syllable */
+ ["\uB9D9", "\uB9D9"], /* Hangul Syllable */
+ ["\uB9DA", "\uB9DA"], /* Hangul Syllable */
+ ["\uB9DB", "\uB9DB"], /* Hangul Syllable */
+ ["\uB9DC", "\uB9DC"], /* Hangul Syllable */
+ ["\uB9DD", "\uB9DD"], /* Hangul Syllable */
+ ["\uB9DE", "\uB9DE"], /* Hangul Syllable */
+ ["\uB9DF", "\uB9DF"], /* Hangul Syllable */
+ ["\uB9E0", "\uB9E0"], /* Hangul Syllable */
+ ["\uB9E1", "\uB9E1"], /* Hangul Syllable */
+ ["\uB9E2", "\uB9E2"], /* Hangul Syllable */
+ ["\uB9E3", "\uB9E3"], /* Hangul Syllable */
+ ["\uB9E4", "\uB9E4"], /* Hangul Syllable */
+ ["\uB9E5", "\uB9E5"], /* Hangul Syllable */
+ ["\uB9E6", "\uB9E6"], /* Hangul Syllable */
+ ["\uB9E7", "\uB9E7"], /* Hangul Syllable */
+ ["\uB9E8", "\uB9E8"], /* Hangul Syllable */
+ ["\uB9E9", "\uB9E9"], /* Hangul Syllable */
+ ["\uB9EA", "\uB9EA"], /* Hangul Syllable */
+ ["\uB9EB", "\uB9EB"], /* Hangul Syllable */
+ ["\uB9EC", "\uB9EC"], /* Hangul Syllable */
+ ["\uB9ED", "\uB9ED"], /* Hangul Syllable */
+ ["\uB9EE", "\uB9EE"], /* Hangul Syllable */
+ ["\uB9EF", "\uB9EF"], /* Hangul Syllable */
+ ["\uB9F0", "\uB9F0"], /* Hangul Syllable */
+ ["\uB9F1", "\uB9F1"], /* Hangul Syllable */
+ ["\uB9F2", "\uB9F2"], /* Hangul Syllable */
+ ["\uB9F3", "\uB9F3"], /* Hangul Syllable */
+ ["\uB9F4", "\uB9F4"], /* Hangul Syllable */
+ ["\uB9F5", "\uB9F5"], /* Hangul Syllable */
+ ["\uB9F6", "\uB9F6"], /* Hangul Syllable */
+ ["\uB9F7", "\uB9F7"], /* Hangul Syllable */
+ ["\uB9F8", "\uB9F8"], /* Hangul Syllable */
+ ["\uB9F9", "\uB9F9"], /* Hangul Syllable */
+ ["\uB9FA", "\uB9FA"], /* Hangul Syllable */
+ ["\uB9FB", "\uB9FB"], /* Hangul Syllable */
+ ["\uB9FC", "\uB9FC"], /* Hangul Syllable */
+ ["\uB9FD", "\uB9FD"], /* Hangul Syllable */
+ ["\uB9FE", "\uB9FE"], /* Hangul Syllable */
+ ["\uB9FF", "\uB9FF"], /* Hangul Syllable */
+ ["\uBA00", "\uBA00"], /* Hangul Syllable */
+ ["\uBA01", "\uBA01"], /* Hangul Syllable */
+ ["\uBA02", "\uBA02"], /* Hangul Syllable */
+ ["\uBA03", "\uBA03"], /* Hangul Syllable */
+ ["\uBA04", "\uBA04"], /* Hangul Syllable */
+ ["\uBA05", "\uBA05"], /* Hangul Syllable */
+ ["\uBA06", "\uBA06"], /* Hangul Syllable */
+ ["\uBA07", "\uBA07"], /* Hangul Syllable */
+ ["\uBA08", "\uBA08"], /* Hangul Syllable */
+ ["\uBA09", "\uBA09"], /* Hangul Syllable */
+ ["\uBA0A", "\uBA0A"], /* Hangul Syllable */
+ ["\uBA0B", "\uBA0B"], /* Hangul Syllable */
+ ["\uBA0C", "\uBA0C"], /* Hangul Syllable */
+ ["\uBA0D", "\uBA0D"], /* Hangul Syllable */
+ ["\uBA0E", "\uBA0E"], /* Hangul Syllable */
+ ["\uBA0F", "\uBA0F"], /* Hangul Syllable */
+ ["\uBA10", "\uBA10"], /* Hangul Syllable */
+ ["\uBA11", "\uBA11"], /* Hangul Syllable */
+ ["\uBA12", "\uBA12"], /* Hangul Syllable */
+ ["\uBA13", "\uBA13"], /* Hangul Syllable */
+ ["\uBA14", "\uBA14"], /* Hangul Syllable */
+ ["\uBA15", "\uBA15"], /* Hangul Syllable */
+ ["\uBA16", "\uBA16"], /* Hangul Syllable */
+ ["\uBA17", "\uBA17"], /* Hangul Syllable */
+ ["\uBA18", "\uBA18"], /* Hangul Syllable */
+ ["\uBA19", "\uBA19"], /* Hangul Syllable */
+ ["\uBA1A", "\uBA1A"], /* Hangul Syllable */
+ ["\uBA1B", "\uBA1B"], /* Hangul Syllable */
+ ["\uBA1C", "\uBA1C"], /* Hangul Syllable */
+ ["\uBA1D", "\uBA1D"], /* Hangul Syllable */
+ ["\uBA1E", "\uBA1E"], /* Hangul Syllable */
+ ["\uBA1F", "\uBA1F"], /* Hangul Syllable */
+ ["\uBA20", "\uBA20"], /* Hangul Syllable */
+ ["\uBA21", "\uBA21"], /* Hangul Syllable */
+ ["\uBA22", "\uBA22"], /* Hangul Syllable */
+ ["\uBA23", "\uBA23"], /* Hangul Syllable */
+ ["\uBA24", "\uBA24"], /* Hangul Syllable */
+ ["\uBA25", "\uBA25"], /* Hangul Syllable */
+ ["\uBA26", "\uBA26"], /* Hangul Syllable */
+ ["\uBA27", "\uBA27"], /* Hangul Syllable */
+ ["\uBA28", "\uBA28"], /* Hangul Syllable */
+ ["\uBA29", "\uBA29"], /* Hangul Syllable */
+ ["\uBA2A", "\uBA2A"], /* Hangul Syllable */
+ ["\uBA2B", "\uBA2B"], /* Hangul Syllable */
+ ["\uBA2C", "\uBA2C"], /* Hangul Syllable */
+ ["\uBA2D", "\uBA2D"], /* Hangul Syllable */
+ ["\uBA2E", "\uBA2E"], /* Hangul Syllable */
+ ["\uBA2F", "\uBA2F"], /* Hangul Syllable */
+ ["\uBA30", "\uBA30"], /* Hangul Syllable */
+ ["\uBA31", "\uBA31"], /* Hangul Syllable */
+ ["\uBA32", "\uBA32"], /* Hangul Syllable */
+ ["\uBA33", "\uBA33"], /* Hangul Syllable */
+ ["\uBA34", "\uBA34"], /* Hangul Syllable */
+ ["\uBA35", "\uBA35"], /* Hangul Syllable */
+ ["\uBA36", "\uBA36"], /* Hangul Syllable */
+ ["\uBA37", "\uBA37"], /* Hangul Syllable */
+ ["\uBA38", "\uBA38"], /* Hangul Syllable */
+ ["\uBA39", "\uBA39"], /* Hangul Syllable */
+ ["\uBA3A", "\uBA3A"], /* Hangul Syllable */
+ ["\uBA3B", "\uBA3B"], /* Hangul Syllable */
+ ["\uBA3C", "\uBA3C"], /* Hangul Syllable */
+ ["\uBA3D", "\uBA3D"], /* Hangul Syllable */
+ ["\uBA3E", "\uBA3E"], /* Hangul Syllable */
+ ["\uBA3F", "\uBA3F"], /* Hangul Syllable */
+ ["\uBA40", "\uBA40"], /* Hangul Syllable */
+ ["\uBA41", "\uBA41"], /* Hangul Syllable */
+ ["\uBA42", "\uBA42"], /* Hangul Syllable */
+ ["\uBA43", "\uBA43"], /* Hangul Syllable */
+ ["\uBA44", "\uBA44"], /* Hangul Syllable */
+ ["\uBA45", "\uBA45"], /* Hangul Syllable */
+ ["\uBA46", "\uBA46"], /* Hangul Syllable */
+ ["\uBA47", "\uBA47"], /* Hangul Syllable */
+ ["\uBA48", "\uBA48"], /* Hangul Syllable */
+ ["\uBA49", "\uBA49"], /* Hangul Syllable */
+ ["\uBA4A", "\uBA4A"], /* Hangul Syllable */
+ ["\uBA4B", "\uBA4B"], /* Hangul Syllable */
+ ["\uBA4C", "\uBA4C"], /* Hangul Syllable */
+ ["\uBA4D", "\uBA4D"], /* Hangul Syllable */
+ ["\uBA4E", "\uBA4E"], /* Hangul Syllable */
+ ["\uBA4F", "\uBA4F"], /* Hangul Syllable */
+ ["\uBA50", "\uBA50"], /* Hangul Syllable */
+ ["\uBA51", "\uBA51"], /* Hangul Syllable */
+ ["\uBA52", "\uBA52"], /* Hangul Syllable */
+ ["\uBA53", "\uBA53"], /* Hangul Syllable */
+ ["\uBA54", "\uBA54"], /* Hangul Syllable */
+ ["\uBA55", "\uBA55"], /* Hangul Syllable */
+ ["\uBA56", "\uBA56"], /* Hangul Syllable */
+ ["\uBA57", "\uBA57"], /* Hangul Syllable */
+ ["\uBA58", "\uBA58"], /* Hangul Syllable */
+ ["\uBA59", "\uBA59"], /* Hangul Syllable */
+ ["\uBA5A", "\uBA5A"], /* Hangul Syllable */
+ ["\uBA5B", "\uBA5B"], /* Hangul Syllable */
+ ["\uBA5C", "\uBA5C"], /* Hangul Syllable */
+ ["\uBA5D", "\uBA5D"], /* Hangul Syllable */
+ ["\uBA5E", "\uBA5E"], /* Hangul Syllable */
+ ["\uBA5F", "\uBA5F"], /* Hangul Syllable */
+ ["\uBA60", "\uBA60"], /* Hangul Syllable */
+ ["\uBA61", "\uBA61"], /* Hangul Syllable */
+ ["\uBA62", "\uBA62"], /* Hangul Syllable */
+ ["\uBA63", "\uBA63"], /* Hangul Syllable */
+ ["\uBA64", "\uBA64"], /* Hangul Syllable */
+ ["\uBA65", "\uBA65"], /* Hangul Syllable */
+ ["\uBA66", "\uBA66"], /* Hangul Syllable */
+ ["\uBA67", "\uBA67"], /* Hangul Syllable */
+ ["\uBA68", "\uBA68"], /* Hangul Syllable */
+ ["\uBA69", "\uBA69"], /* Hangul Syllable */
+ ["\uBA6A", "\uBA6A"], /* Hangul Syllable */
+ ["\uBA6B", "\uBA6B"], /* Hangul Syllable */
+ ["\uBA6C", "\uBA6C"], /* Hangul Syllable */
+ ["\uBA6D", "\uBA6D"], /* Hangul Syllable */
+ ["\uBA6E", "\uBA6E"], /* Hangul Syllable */
+ ["\uBA6F", "\uBA6F"], /* Hangul Syllable */
+ ["\uBA70", "\uBA70"], /* Hangul Syllable */
+ ["\uBA71", "\uBA71"], /* Hangul Syllable */
+ ["\uBA72", "\uBA72"], /* Hangul Syllable */
+ ["\uBA73", "\uBA73"], /* Hangul Syllable */
+ ["\uBA74", "\uBA74"], /* Hangul Syllable */
+ ["\uBA75", "\uBA75"], /* Hangul Syllable */
+ ["\uBA76", "\uBA76"], /* Hangul Syllable */
+ ["\uBA77", "\uBA77"], /* Hangul Syllable */
+ ["\uBA78", "\uBA78"], /* Hangul Syllable */
+ ["\uBA79", "\uBA79"], /* Hangul Syllable */
+ ["\uBA7A", "\uBA7A"], /* Hangul Syllable */
+ ["\uBA7B", "\uBA7B"], /* Hangul Syllable */
+ ["\uBA7C", "\uBA7C"], /* Hangul Syllable */
+ ["\uBA7D", "\uBA7D"], /* Hangul Syllable */
+ ["\uBA7E", "\uBA7E"], /* Hangul Syllable */
+ ["\uBA7F", "\uBA7F"], /* Hangul Syllable */
+ ["\uBA80", "\uBA80"], /* Hangul Syllable */
+ ["\uBA81", "\uBA81"], /* Hangul Syllable */
+ ["\uBA82", "\uBA82"], /* Hangul Syllable */
+ ["\uBA83", "\uBA83"], /* Hangul Syllable */
+ ["\uBA84", "\uBA84"], /* Hangul Syllable */
+ ["\uBA85", "\uBA85"], /* Hangul Syllable */
+ ["\uBA86", "\uBA86"], /* Hangul Syllable */
+ ["\uBA87", "\uBA87"], /* Hangul Syllable */
+ ["\uBA88", "\uBA88"], /* Hangul Syllable */
+ ["\uBA89", "\uBA89"], /* Hangul Syllable */
+ ["\uBA8A", "\uBA8A"], /* Hangul Syllable */
+ ["\uBA8B", "\uBA8B"], /* Hangul Syllable */
+ ["\uBA8C", "\uBA8C"], /* Hangul Syllable */
+ ["\uBA8D", "\uBA8D"], /* Hangul Syllable */
+ ["\uBA8E", "\uBA8E"], /* Hangul Syllable */
+ ["\uBA8F", "\uBA8F"], /* Hangul Syllable */
+ ["\uBA90", "\uBA90"], /* Hangul Syllable */
+ ["\uBA91", "\uBA91"], /* Hangul Syllable */
+ ["\uBA92", "\uBA92"], /* Hangul Syllable */
+ ["\uBA93", "\uBA93"], /* Hangul Syllable */
+ ["\uBA94", "\uBA94"], /* Hangul Syllable */
+ ["\uBA95", "\uBA95"], /* Hangul Syllable */
+ ["\uBA96", "\uBA96"], /* Hangul Syllable */
+ ["\uBA97", "\uBA97"], /* Hangul Syllable */
+ ["\uBA98", "\uBA98"], /* Hangul Syllable */
+ ["\uBA99", "\uBA99"], /* Hangul Syllable */
+ ["\uBA9A", "\uBA9A"], /* Hangul Syllable */
+ ["\uBA9B", "\uBA9B"], /* Hangul Syllable */
+ ["\uBA9C", "\uBA9C"], /* Hangul Syllable */
+ ["\uBA9D", "\uBA9D"], /* Hangul Syllable */
+ ["\uBA9E", "\uBA9E"], /* Hangul Syllable */
+ ["\uBA9F", "\uBA9F"], /* Hangul Syllable */
+ ["\uBAA0", "\uBAA0"], /* Hangul Syllable */
+ ["\uBAA1", "\uBAA1"], /* Hangul Syllable */
+ ["\uBAA2", "\uBAA2"], /* Hangul Syllable */
+ ["\uBAA3", "\uBAA3"], /* Hangul Syllable */
+ ["\uBAA4", "\uBAA4"], /* Hangul Syllable */
+ ["\uBAA5", "\uBAA5"], /* Hangul Syllable */
+ ["\uBAA6", "\uBAA6"], /* Hangul Syllable */
+ ["\uBAA7", "\uBAA7"], /* Hangul Syllable */
+ ["\uBAA8", "\uBAA8"], /* Hangul Syllable */
+ ["\uBAA9", "\uBAA9"], /* Hangul Syllable */
+ ["\uBAAA", "\uBAAA"], /* Hangul Syllable */
+ ["\uBAAB", "\uBAAB"], /* Hangul Syllable */
+ ["\uBAAC", "\uBAAC"], /* Hangul Syllable */
+ ["\uBAAD", "\uBAAD"], /* Hangul Syllable */
+ ["\uBAAE", "\uBAAE"], /* Hangul Syllable */
+ ["\uBAAF", "\uBAAF"], /* Hangul Syllable */
+ ["\uBAB0", "\uBAB0"], /* Hangul Syllable */
+ ["\uBAB1", "\uBAB1"], /* Hangul Syllable */
+ ["\uBAB2", "\uBAB2"], /* Hangul Syllable */
+ ["\uBAB3", "\uBAB3"], /* Hangul Syllable */
+ ["\uBAB4", "\uBAB4"], /* Hangul Syllable */
+ ["\uBAB5", "\uBAB5"], /* Hangul Syllable */
+ ["\uBAB6", "\uBAB6"], /* Hangul Syllable */
+ ["\uBAB7", "\uBAB7"], /* Hangul Syllable */
+ ["\uBAB8", "\uBAB8"], /* Hangul Syllable */
+ ["\uBAB9", "\uBAB9"], /* Hangul Syllable */
+ ["\uBABA", "\uBABA"], /* Hangul Syllable */
+ ["\uBABB", "\uBABB"], /* Hangul Syllable */
+ ["\uBABC", "\uBABC"], /* Hangul Syllable */
+ ["\uBABD", "\uBABD"], /* Hangul Syllable */
+ ["\uBABE", "\uBABE"], /* Hangul Syllable */
+ ["\uBABF", "\uBABF"], /* Hangul Syllable */
+ ["\uBAC0", "\uBAC0"], /* Hangul Syllable */
+ ["\uBAC1", "\uBAC1"], /* Hangul Syllable */
+ ["\uBAC2", "\uBAC2"], /* Hangul Syllable */
+ ["\uBAC3", "\uBAC3"], /* Hangul Syllable */
+ ["\uBAC4", "\uBAC4"], /* Hangul Syllable */
+ ["\uBAC5", "\uBAC5"], /* Hangul Syllable */
+ ["\uBAC6", "\uBAC6"], /* Hangul Syllable */
+ ["\uBAC7", "\uBAC7"], /* Hangul Syllable */
+ ["\uBAC8", "\uBAC8"], /* Hangul Syllable */
+ ["\uBAC9", "\uBAC9"], /* Hangul Syllable */
+ ["\uBACA", "\uBACA"], /* Hangul Syllable */
+ ["\uBACB", "\uBACB"], /* Hangul Syllable */
+ ["\uBACC", "\uBACC"], /* Hangul Syllable */
+ ["\uBACD", "\uBACD"], /* Hangul Syllable */
+ ["\uBACE", "\uBACE"], /* Hangul Syllable */
+ ["\uBACF", "\uBACF"], /* Hangul Syllable */
+ ["\uBAD0", "\uBAD0"], /* Hangul Syllable */
+ ["\uBAD1", "\uBAD1"], /* Hangul Syllable */
+ ["\uBAD2", "\uBAD2"], /* Hangul Syllable */
+ ["\uBAD3", "\uBAD3"], /* Hangul Syllable */
+ ["\uBAD4", "\uBAD4"], /* Hangul Syllable */
+ ["\uBAD5", "\uBAD5"], /* Hangul Syllable */
+ ["\uBAD6", "\uBAD6"], /* Hangul Syllable */
+ ["\uBAD7", "\uBAD7"], /* Hangul Syllable */
+ ["\uBAD8", "\uBAD8"], /* Hangul Syllable */
+ ["\uBAD9", "\uBAD9"], /* Hangul Syllable */
+ ["\uBADA", "\uBADA"], /* Hangul Syllable */
+ ["\uBADB", "\uBADB"], /* Hangul Syllable */
+ ["\uBADC", "\uBADC"], /* Hangul Syllable */
+ ["\uBADD", "\uBADD"], /* Hangul Syllable */
+ ["\uBADE", "\uBADE"], /* Hangul Syllable */
+ ["\uBADF", "\uBADF"], /* Hangul Syllable */
+ ["\uBAE0", "\uBAE0"], /* Hangul Syllable */
+ ["\uBAE1", "\uBAE1"], /* Hangul Syllable */
+ ["\uBAE2", "\uBAE2"], /* Hangul Syllable */
+ ["\uBAE3", "\uBAE3"], /* Hangul Syllable */
+ ["\uBAE4", "\uBAE4"], /* Hangul Syllable */
+ ["\uBAE5", "\uBAE5"], /* Hangul Syllable */
+ ["\uBAE6", "\uBAE6"], /* Hangul Syllable */
+ ["\uBAE7", "\uBAE7"], /* Hangul Syllable */
+ ["\uBAE8", "\uBAE8"], /* Hangul Syllable */
+ ["\uBAE9", "\uBAE9"], /* Hangul Syllable */
+ ["\uBAEA", "\uBAEA"], /* Hangul Syllable */
+ ["\uBAEB", "\uBAEB"], /* Hangul Syllable */
+ ["\uBAEC", "\uBAEC"], /* Hangul Syllable */
+ ["\uBAED", "\uBAED"], /* Hangul Syllable */
+ ["\uBAEE", "\uBAEE"], /* Hangul Syllable */
+ ["\uBAEF", "\uBAEF"], /* Hangul Syllable */
+ ["\uBAF0", "\uBAF0"], /* Hangul Syllable */
+ ["\uBAF1", "\uBAF1"], /* Hangul Syllable */
+ ["\uBAF2", "\uBAF2"], /* Hangul Syllable */
+ ["\uBAF3", "\uBAF3"], /* Hangul Syllable */
+ ["\uBAF4", "\uBAF4"], /* Hangul Syllable */
+ ["\uBAF5", "\uBAF5"], /* Hangul Syllable */
+ ["\uBAF6", "\uBAF6"], /* Hangul Syllable */
+ ["\uBAF7", "\uBAF7"], /* Hangul Syllable */
+ ["\uBAF8", "\uBAF8"], /* Hangul Syllable */
+ ["\uBAF9", "\uBAF9"], /* Hangul Syllable */
+ ["\uBAFA", "\uBAFA"], /* Hangul Syllable */
+ ["\uBAFB", "\uBAFB"], /* Hangul Syllable */
+ ["\uBAFC", "\uBAFC"], /* Hangul Syllable */
+ ["\uBAFD", "\uBAFD"], /* Hangul Syllable */
+ ["\uBAFE", "\uBAFE"], /* Hangul Syllable */
+ ["\uBAFF", "\uBAFF"], /* Hangul Syllable */
+ ["\uBB00", "\uBB00"], /* Hangul Syllable */
+ ["\uBB01", "\uBB01"], /* Hangul Syllable */
+ ["\uBB02", "\uBB02"], /* Hangul Syllable */
+ ["\uBB03", "\uBB03"], /* Hangul Syllable */
+ ["\uBB04", "\uBB04"], /* Hangul Syllable */
+ ["\uBB05", "\uBB05"], /* Hangul Syllable */
+ ["\uBB06", "\uBB06"], /* Hangul Syllable */
+ ["\uBB07", "\uBB07"], /* Hangul Syllable */
+ ["\uBB08", "\uBB08"], /* Hangul Syllable */
+ ["\uBB09", "\uBB09"], /* Hangul Syllable */
+ ["\uBB0A", "\uBB0A"], /* Hangul Syllable */
+ ["\uBB0B", "\uBB0B"], /* Hangul Syllable */
+ ["\uBB0C", "\uBB0C"], /* Hangul Syllable */
+ ["\uBB0D", "\uBB0D"], /* Hangul Syllable */
+ ["\uBB0E", "\uBB0E"], /* Hangul Syllable */
+ ["\uBB0F", "\uBB0F"], /* Hangul Syllable */
+ ["\uBB10", "\uBB10"], /* Hangul Syllable */
+ ["\uBB11", "\uBB11"], /* Hangul Syllable */
+ ["\uBB12", "\uBB12"], /* Hangul Syllable */
+ ["\uBB13", "\uBB13"], /* Hangul Syllable */
+ ["\uBB14", "\uBB14"], /* Hangul Syllable */
+ ["\uBB15", "\uBB15"], /* Hangul Syllable */
+ ["\uBB16", "\uBB16"], /* Hangul Syllable */
+ ["\uBB17", "\uBB17"], /* Hangul Syllable */
+ ["\uBB18", "\uBB18"], /* Hangul Syllable */
+ ["\uBB19", "\uBB19"], /* Hangul Syllable */
+ ["\uBB1A", "\uBB1A"], /* Hangul Syllable */
+ ["\uBB1B", "\uBB1B"], /* Hangul Syllable */
+ ["\uBB1C", "\uBB1C"], /* Hangul Syllable */
+ ["\uBB1D", "\uBB1D"], /* Hangul Syllable */
+ ["\uBB1E", "\uBB1E"], /* Hangul Syllable */
+ ["\uBB1F", "\uBB1F"], /* Hangul Syllable */
+ ["\uBB20", "\uBB20"], /* Hangul Syllable */
+ ["\uBB21", "\uBB21"], /* Hangul Syllable */
+ ["\uBB22", "\uBB22"], /* Hangul Syllable */
+ ["\uBB23", "\uBB23"], /* Hangul Syllable */
+ ["\uBB24", "\uBB24"], /* Hangul Syllable */
+ ["\uBB25", "\uBB25"], /* Hangul Syllable */
+ ["\uBB26", "\uBB26"], /* Hangul Syllable */
+ ["\uBB27", "\uBB27"], /* Hangul Syllable */
+ ["\uBB28", "\uBB28"], /* Hangul Syllable */
+ ["\uBB29", "\uBB29"], /* Hangul Syllable */
+ ["\uBB2A", "\uBB2A"], /* Hangul Syllable */
+ ["\uBB2B", "\uBB2B"], /* Hangul Syllable */
+ ["\uBB2C", "\uBB2C"], /* Hangul Syllable */
+ ["\uBB2D", "\uBB2D"], /* Hangul Syllable */
+ ["\uBB2E", "\uBB2E"], /* Hangul Syllable */
+ ["\uBB2F", "\uBB2F"], /* Hangul Syllable */
+ ["\uBB30", "\uBB30"], /* Hangul Syllable */
+ ["\uBB31", "\uBB31"], /* Hangul Syllable */
+ ["\uBB32", "\uBB32"], /* Hangul Syllable */
+ ["\uBB33", "\uBB33"], /* Hangul Syllable */
+ ["\uBB34", "\uBB34"], /* Hangul Syllable */
+ ["\uBB35", "\uBB35"], /* Hangul Syllable */
+ ["\uBB36", "\uBB36"], /* Hangul Syllable */
+ ["\uBB37", "\uBB37"], /* Hangul Syllable */
+ ["\uBB38", "\uBB38"], /* Hangul Syllable */
+ ["\uBB39", "\uBB39"], /* Hangul Syllable */
+ ["\uBB3A", "\uBB3A"], /* Hangul Syllable */
+ ["\uBB3B", "\uBB3B"], /* Hangul Syllable */
+ ["\uBB3C", "\uBB3C"], /* Hangul Syllable */
+ ["\uBB3D", "\uBB3D"], /* Hangul Syllable */
+ ["\uBB3E", "\uBB3E"], /* Hangul Syllable */
+ ["\uBB3F", "\uBB3F"], /* Hangul Syllable */
+ ["\uBB40", "\uBB40"], /* Hangul Syllable */
+ ["\uBB41", "\uBB41"], /* Hangul Syllable */
+ ["\uBB42", "\uBB42"], /* Hangul Syllable */
+ ["\uBB43", "\uBB43"], /* Hangul Syllable */
+ ["\uBB44", "\uBB44"], /* Hangul Syllable */
+ ["\uBB45", "\uBB45"], /* Hangul Syllable */
+ ["\uBB46", "\uBB46"], /* Hangul Syllable */
+ ["\uBB47", "\uBB47"], /* Hangul Syllable */
+ ["\uBB48", "\uBB48"], /* Hangul Syllable */
+ ["\uBB49", "\uBB49"], /* Hangul Syllable */
+ ["\uBB4A", "\uBB4A"], /* Hangul Syllable */
+ ["\uBB4B", "\uBB4B"], /* Hangul Syllable */
+ ["\uBB4C", "\uBB4C"], /* Hangul Syllable */
+ ["\uBB4D", "\uBB4D"], /* Hangul Syllable */
+ ["\uBB4E", "\uBB4E"], /* Hangul Syllable */
+ ["\uBB4F", "\uBB4F"], /* Hangul Syllable */
+ ["\uBB50", "\uBB50"], /* Hangul Syllable */
+ ["\uBB51", "\uBB51"], /* Hangul Syllable */
+ ["\uBB52", "\uBB52"], /* Hangul Syllable */
+ ["\uBB53", "\uBB53"], /* Hangul Syllable */
+ ["\uBB54", "\uBB54"], /* Hangul Syllable */
+ ["\uBB55", "\uBB55"], /* Hangul Syllable */
+ ["\uBB56", "\uBB56"], /* Hangul Syllable */
+ ["\uBB57", "\uBB57"], /* Hangul Syllable */
+ ["\uBB58", "\uBB58"], /* Hangul Syllable */
+ ["\uBB59", "\uBB59"], /* Hangul Syllable */
+ ["\uBB5A", "\uBB5A"], /* Hangul Syllable */
+ ["\uBB5B", "\uBB5B"], /* Hangul Syllable */
+ ["\uBB5C", "\uBB5C"], /* Hangul Syllable */
+ ["\uBB5D", "\uBB5D"], /* Hangul Syllable */
+ ["\uBB5E", "\uBB5E"], /* Hangul Syllable */
+ ["\uBB5F", "\uBB5F"], /* Hangul Syllable */
+ ["\uBB60", "\uBB60"], /* Hangul Syllable */
+ ["\uBB61", "\uBB61"], /* Hangul Syllable */
+ ["\uBB62", "\uBB62"], /* Hangul Syllable */
+ ["\uBB63", "\uBB63"], /* Hangul Syllable */
+ ["\uBB64", "\uBB64"], /* Hangul Syllable */
+ ["\uBB65", "\uBB65"], /* Hangul Syllable */
+ ["\uBB66", "\uBB66"], /* Hangul Syllable */
+ ["\uBB67", "\uBB67"], /* Hangul Syllable */
+ ["\uBB68", "\uBB68"], /* Hangul Syllable */
+ ["\uBB69", "\uBB69"], /* Hangul Syllable */
+ ["\uBB6A", "\uBB6A"], /* Hangul Syllable */
+ ["\uBB6B", "\uBB6B"], /* Hangul Syllable */
+ ["\uBB6C", "\uBB6C"], /* Hangul Syllable */
+ ["\uBB6D", "\uBB6D"], /* Hangul Syllable */
+ ["\uBB6E", "\uBB6E"], /* Hangul Syllable */
+ ["\uBB6F", "\uBB6F"], /* Hangul Syllable */
+ ["\uBB70", "\uBB70"], /* Hangul Syllable */
+ ["\uBB71", "\uBB71"], /* Hangul Syllable */
+ ["\uBB72", "\uBB72"], /* Hangul Syllable */
+ ["\uBB73", "\uBB73"], /* Hangul Syllable */
+ ["\uBB74", "\uBB74"], /* Hangul Syllable */
+ ["\uBB75", "\uBB75"], /* Hangul Syllable */
+ ["\uBB76", "\uBB76"], /* Hangul Syllable */
+ ["\uBB77", "\uBB77"], /* Hangul Syllable */
+ ["\uBB78", "\uBB78"], /* Hangul Syllable */
+ ["\uBB79", "\uBB79"], /* Hangul Syllable */
+ ["\uBB7A", "\uBB7A"], /* Hangul Syllable */
+ ["\uBB7B", "\uBB7B"], /* Hangul Syllable */
+ ["\uBB7C", "\uBB7C"], /* Hangul Syllable */
+ ["\uBB7D", "\uBB7D"], /* Hangul Syllable */
+ ["\uBB7E", "\uBB7E"], /* Hangul Syllable */
+ ["\uBB7F", "\uBB7F"], /* Hangul Syllable */
+ ["\uBB80", "\uBB80"], /* Hangul Syllable */
+ ["\uBB81", "\uBB81"], /* Hangul Syllable */
+ ["\uBB82", "\uBB82"], /* Hangul Syllable */
+ ["\uBB83", "\uBB83"], /* Hangul Syllable */
+ ["\uBB84", "\uBB84"], /* Hangul Syllable */
+ ["\uBB85", "\uBB85"], /* Hangul Syllable */
+ ["\uBB86", "\uBB86"], /* Hangul Syllable */
+ ["\uBB87", "\uBB87"], /* Hangul Syllable */
+ ["\uBB88", "\uBB88"], /* Hangul Syllable */
+ ["\uBB89", "\uBB89"], /* Hangul Syllable */
+ ["\uBB8A", "\uBB8A"], /* Hangul Syllable */
+ ["\uBB8B", "\uBB8B"], /* Hangul Syllable */
+ ["\uBB8C", "\uBB8C"], /* Hangul Syllable */
+ ["\uBB8D", "\uBB8D"], /* Hangul Syllable */
+ ["\uBB8E", "\uBB8E"], /* Hangul Syllable */
+ ["\uBB8F", "\uBB8F"], /* Hangul Syllable */
+ ["\uBB90", "\uBB90"], /* Hangul Syllable */
+ ["\uBB91", "\uBB91"], /* Hangul Syllable */
+ ["\uBB92", "\uBB92"], /* Hangul Syllable */
+ ["\uBB93", "\uBB93"], /* Hangul Syllable */
+ ["\uBB94", "\uBB94"], /* Hangul Syllable */
+ ["\uBB95", "\uBB95"], /* Hangul Syllable */
+ ["\uBB96", "\uBB96"], /* Hangul Syllable */
+ ["\uBB97", "\uBB97"], /* Hangul Syllable */
+ ["\uBB98", "\uBB98"], /* Hangul Syllable */
+ ["\uBB99", "\uBB99"], /* Hangul Syllable */
+ ["\uBB9A", "\uBB9A"], /* Hangul Syllable */
+ ["\uBB9B", "\uBB9B"], /* Hangul Syllable */
+ ["\uBB9C", "\uBB9C"], /* Hangul Syllable */
+ ["\uBB9D", "\uBB9D"], /* Hangul Syllable */
+ ["\uBB9E", "\uBB9E"], /* Hangul Syllable */
+ ["\uBB9F", "\uBB9F"], /* Hangul Syllable */
+ ["\uBBA0", "\uBBA0"], /* Hangul Syllable */
+ ["\uBBA1", "\uBBA1"], /* Hangul Syllable */
+ ["\uBBA2", "\uBBA2"], /* Hangul Syllable */
+ ["\uBBA3", "\uBBA3"], /* Hangul Syllable */
+ ["\uBBA4", "\uBBA4"], /* Hangul Syllable */
+ ["\uBBA5", "\uBBA5"], /* Hangul Syllable */
+ ["\uBBA6", "\uBBA6"], /* Hangul Syllable */
+ ["\uBBA7", "\uBBA7"], /* Hangul Syllable */
+ ["\uBBA8", "\uBBA8"], /* Hangul Syllable */
+ ["\uBBA9", "\uBBA9"], /* Hangul Syllable */
+ ["\uBBAA", "\uBBAA"], /* Hangul Syllable */
+ ["\uBBAB", "\uBBAB"], /* Hangul Syllable */
+ ["\uBBAC", "\uBBAC"], /* Hangul Syllable */
+ ["\uBBAD", "\uBBAD"], /* Hangul Syllable */
+ ["\uBBAE", "\uBBAE"], /* Hangul Syllable */
+ ["\uBBAF", "\uBBAF"], /* Hangul Syllable */
+ ["\uBBB0", "\uBBB0"], /* Hangul Syllable */
+ ["\uBBB1", "\uBBB1"], /* Hangul Syllable */
+ ["\uBBB2", "\uBBB2"], /* Hangul Syllable */
+ ["\uBBB3", "\uBBB3"], /* Hangul Syllable */
+ ["\uBBB4", "\uBBB4"], /* Hangul Syllable */
+ ["\uBBB5", "\uBBB5"], /* Hangul Syllable */
+ ["\uBBB6", "\uBBB6"], /* Hangul Syllable */
+ ["\uBBB7", "\uBBB7"], /* Hangul Syllable */
+ ["\uBBB8", "\uBBB8"], /* Hangul Syllable */
+ ["\uBBB9", "\uBBB9"], /* Hangul Syllable */
+ ["\uBBBA", "\uBBBA"], /* Hangul Syllable */
+ ["\uBBBB", "\uBBBB"], /* Hangul Syllable */
+ ["\uBBBC", "\uBBBC"], /* Hangul Syllable */
+ ["\uBBBD", "\uBBBD"], /* Hangul Syllable */
+ ["\uBBBE", "\uBBBE"], /* Hangul Syllable */
+ ["\uBBBF", "\uBBBF"], /* Hangul Syllable */
+ ["\uBBC0", "\uBBC0"], /* Hangul Syllable */
+ ["\uBBC1", "\uBBC1"], /* Hangul Syllable */
+ ["\uBBC2", "\uBBC2"], /* Hangul Syllable */
+ ["\uBBC3", "\uBBC3"], /* Hangul Syllable */
+ ["\uBBC4", "\uBBC4"], /* Hangul Syllable */
+ ["\uBBC5", "\uBBC5"], /* Hangul Syllable */
+ ["\uBBC6", "\uBBC6"], /* Hangul Syllable */
+ ["\uBBC7", "\uBBC7"], /* Hangul Syllable */
+ ["\uBBC8", "\uBBC8"], /* Hangul Syllable */
+ ["\uBBC9", "\uBBC9"], /* Hangul Syllable */
+ ["\uBBCA", "\uBBCA"], /* Hangul Syllable */
+ ["\uBBCB", "\uBBCB"], /* Hangul Syllable */
+ ["\uBBCC", "\uBBCC"], /* Hangul Syllable */
+ ["\uBBCD", "\uBBCD"], /* Hangul Syllable */
+ ["\uBBCE", "\uBBCE"], /* Hangul Syllable */
+ ["\uBBCF", "\uBBCF"], /* Hangul Syllable */
+ ["\uBBD0", "\uBBD0"], /* Hangul Syllable */
+ ["\uBBD1", "\uBBD1"], /* Hangul Syllable */
+ ["\uBBD2", "\uBBD2"], /* Hangul Syllable */
+ ["\uBBD3", "\uBBD3"], /* Hangul Syllable */
+ ["\uBBD4", "\uBBD4"], /* Hangul Syllable */
+ ["\uBBD5", "\uBBD5"], /* Hangul Syllable */
+ ["\uBBD6", "\uBBD6"], /* Hangul Syllable */
+ ["\uBBD7", "\uBBD7"], /* Hangul Syllable */
+ ["\uBBD8", "\uBBD8"], /* Hangul Syllable */
+ ["\uBBD9", "\uBBD9"], /* Hangul Syllable */
+ ["\uBBDA", "\uBBDA"], /* Hangul Syllable */
+ ["\uBBDB", "\uBBDB"], /* Hangul Syllable */
+ ["\uBBDC", "\uBBDC"], /* Hangul Syllable */
+ ["\uBBDD", "\uBBDD"], /* Hangul Syllable */
+ ["\uBBDE", "\uBBDE"], /* Hangul Syllable */
+ ["\uBBDF", "\uBBDF"], /* Hangul Syllable */
+ ["\uBBE0", "\uBBE0"], /* Hangul Syllable */
+ ["\uBBE1", "\uBBE1"], /* Hangul Syllable */
+ ["\uBBE2", "\uBBE2"], /* Hangul Syllable */
+ ["\uBBE3", "\uBBE3"], /* Hangul Syllable */
+ ["\uBBE4", "\uBBE4"], /* Hangul Syllable */
+ ["\uBBE5", "\uBBE5"], /* Hangul Syllable */
+ ["\uBBE6", "\uBBE6"], /* Hangul Syllable */
+ ["\uBBE7", "\uBBE7"], /* Hangul Syllable */
+ ["\uBBE8", "\uBBE8"], /* Hangul Syllable */
+ ["\uBBE9", "\uBBE9"], /* Hangul Syllable */
+ ["\uBBEA", "\uBBEA"], /* Hangul Syllable */
+ ["\uBBEB", "\uBBEB"], /* Hangul Syllable */
+ ["\uBBEC", "\uBBEC"], /* Hangul Syllable */
+ ["\uBBED", "\uBBED"], /* Hangul Syllable */
+ ["\uBBEE", "\uBBEE"], /* Hangul Syllable */
+ ["\uBBEF", "\uBBEF"], /* Hangul Syllable */
+ ["\uBBF0", "\uBBF0"], /* Hangul Syllable */
+ ["\uBBF1", "\uBBF1"], /* Hangul Syllable */
+ ["\uBBF2", "\uBBF2"], /* Hangul Syllable */
+ ["\uBBF3", "\uBBF3"], /* Hangul Syllable */
+ ["\uBBF4", "\uBBF4"], /* Hangul Syllable */
+ ["\uBBF5", "\uBBF5"], /* Hangul Syllable */
+ ["\uBBF6", "\uBBF6"], /* Hangul Syllable */
+ ["\uBBF7", "\uBBF7"], /* Hangul Syllable */
+ ["\uBBF8", "\uBBF8"], /* Hangul Syllable */
+ ["\uBBF9", "\uBBF9"], /* Hangul Syllable */
+ ["\uBBFA", "\uBBFA"], /* Hangul Syllable */
+ ["\uBBFB", "\uBBFB"], /* Hangul Syllable */
+ ["\uBBFC", "\uBBFC"], /* Hangul Syllable */
+ ["\uBBFD", "\uBBFD"], /* Hangul Syllable */
+ ["\uBBFE", "\uBBFE"], /* Hangul Syllable */
+ ["\uBBFF", "\uBBFF"], /* Hangul Syllable */
+ ["\uBC00", "\uBC00"], /* Hangul Syllable */
+ ["\uBC01", "\uBC01"], /* Hangul Syllable */
+ ["\uBC02", "\uBC02"], /* Hangul Syllable */
+ ["\uBC03", "\uBC03"], /* Hangul Syllable */
+ ["\uBC04", "\uBC04"], /* Hangul Syllable */
+ ["\uBC05", "\uBC05"], /* Hangul Syllable */
+ ["\uBC06", "\uBC06"], /* Hangul Syllable */
+ ["\uBC07", "\uBC07"], /* Hangul Syllable */
+ ["\uBC08", "\uBC08"], /* Hangul Syllable */
+ ["\uBC09", "\uBC09"], /* Hangul Syllable */
+ ["\uBC0A", "\uBC0A"], /* Hangul Syllable */
+ ["\uBC0B", "\uBC0B"], /* Hangul Syllable */
+ ["\uBC0C", "\uBC0C"], /* Hangul Syllable */
+ ["\uBC0D", "\uBC0D"], /* Hangul Syllable */
+ ["\uBC0E", "\uBC0E"], /* Hangul Syllable */
+ ["\uBC0F", "\uBC0F"], /* Hangul Syllable */
+ ["\uBC10", "\uBC10"], /* Hangul Syllable */
+ ["\uBC11", "\uBC11"], /* Hangul Syllable */
+ ["\uBC12", "\uBC12"], /* Hangul Syllable */
+ ["\uBC13", "\uBC13"], /* Hangul Syllable */
+ ["\uBC14", "\uBC14"], /* Hangul Syllable */
+ ["\uBC15", "\uBC15"], /* Hangul Syllable */
+ ["\uBC16", "\uBC16"], /* Hangul Syllable */
+ ["\uBC17", "\uBC17"], /* Hangul Syllable */
+ ["\uBC18", "\uBC18"], /* Hangul Syllable */
+ ["\uBC19", "\uBC19"], /* Hangul Syllable */
+ ["\uBC1A", "\uBC1A"], /* Hangul Syllable */
+ ["\uBC1B", "\uBC1B"], /* Hangul Syllable */
+ ["\uBC1C", "\uBC1C"], /* Hangul Syllable */
+ ["\uBC1D", "\uBC1D"], /* Hangul Syllable */
+ ["\uBC1E", "\uBC1E"], /* Hangul Syllable */
+ ["\uBC1F", "\uBC1F"], /* Hangul Syllable */
+ ["\uBC20", "\uBC20"], /* Hangul Syllable */
+ ["\uBC21", "\uBC21"], /* Hangul Syllable */
+ ["\uBC22", "\uBC22"], /* Hangul Syllable */
+ ["\uBC23", "\uBC23"], /* Hangul Syllable */
+ ["\uBC24", "\uBC24"], /* Hangul Syllable */
+ ["\uBC25", "\uBC25"], /* Hangul Syllable */
+ ["\uBC26", "\uBC26"], /* Hangul Syllable */
+ ["\uBC27", "\uBC27"], /* Hangul Syllable */
+ ["\uBC28", "\uBC28"], /* Hangul Syllable */
+ ["\uBC29", "\uBC29"], /* Hangul Syllable */
+ ["\uBC2A", "\uBC2A"], /* Hangul Syllable */
+ ["\uBC2B", "\uBC2B"], /* Hangul Syllable */
+ ["\uBC2C", "\uBC2C"], /* Hangul Syllable */
+ ["\uBC2D", "\uBC2D"], /* Hangul Syllable */
+ ["\uBC2E", "\uBC2E"], /* Hangul Syllable */
+ ["\uBC2F", "\uBC2F"], /* Hangul Syllable */
+ ["\uBC30", "\uBC30"], /* Hangul Syllable */
+ ["\uBC31", "\uBC31"], /* Hangul Syllable */
+ ["\uBC32", "\uBC32"], /* Hangul Syllable */
+ ["\uBC33", "\uBC33"], /* Hangul Syllable */
+ ["\uBC34", "\uBC34"], /* Hangul Syllable */
+ ["\uBC35", "\uBC35"], /* Hangul Syllable */
+ ["\uBC36", "\uBC36"], /* Hangul Syllable */
+ ["\uBC37", "\uBC37"], /* Hangul Syllable */
+ ["\uBC38", "\uBC38"], /* Hangul Syllable */
+ ["\uBC39", "\uBC39"], /* Hangul Syllable */
+ ["\uBC3A", "\uBC3A"], /* Hangul Syllable */
+ ["\uBC3B", "\uBC3B"], /* Hangul Syllable */
+ ["\uBC3C", "\uBC3C"], /* Hangul Syllable */
+ ["\uBC3D", "\uBC3D"], /* Hangul Syllable */
+ ["\uBC3E", "\uBC3E"], /* Hangul Syllable */
+ ["\uBC3F", "\uBC3F"], /* Hangul Syllable */
+ ["\uBC40", "\uBC40"], /* Hangul Syllable */
+ ["\uBC41", "\uBC41"], /* Hangul Syllable */
+ ["\uBC42", "\uBC42"], /* Hangul Syllable */
+ ["\uBC43", "\uBC43"], /* Hangul Syllable */
+ ["\uBC44", "\uBC44"], /* Hangul Syllable */
+ ["\uBC45", "\uBC45"], /* Hangul Syllable */
+ ["\uBC46", "\uBC46"], /* Hangul Syllable */
+ ["\uBC47", "\uBC47"], /* Hangul Syllable */
+ ["\uBC48", "\uBC48"], /* Hangul Syllable */
+ ["\uBC49", "\uBC49"], /* Hangul Syllable */
+ ["\uBC4A", "\uBC4A"], /* Hangul Syllable */
+ ["\uBC4B", "\uBC4B"], /* Hangul Syllable */
+ ["\uBC4C", "\uBC4C"], /* Hangul Syllable */
+ ["\uBC4D", "\uBC4D"], /* Hangul Syllable */
+ ["\uBC4E", "\uBC4E"], /* Hangul Syllable */
+ ["\uBC4F", "\uBC4F"], /* Hangul Syllable */
+ ["\uBC50", "\uBC50"], /* Hangul Syllable */
+ ["\uBC51", "\uBC51"], /* Hangul Syllable */
+ ["\uBC52", "\uBC52"], /* Hangul Syllable */
+ ["\uBC53", "\uBC53"], /* Hangul Syllable */
+ ["\uBC54", "\uBC54"], /* Hangul Syllable */
+ ["\uBC55", "\uBC55"], /* Hangul Syllable */
+ ["\uBC56", "\uBC56"], /* Hangul Syllable */
+ ["\uBC57", "\uBC57"], /* Hangul Syllable */
+ ["\uBC58", "\uBC58"], /* Hangul Syllable */
+ ["\uBC59", "\uBC59"], /* Hangul Syllable */
+ ["\uBC5A", "\uBC5A"], /* Hangul Syllable */
+ ["\uBC5B", "\uBC5B"], /* Hangul Syllable */
+ ["\uBC5C", "\uBC5C"], /* Hangul Syllable */
+ ["\uBC5D", "\uBC5D"], /* Hangul Syllable */
+ ["\uBC5E", "\uBC5E"], /* Hangul Syllable */
+ ["\uBC5F", "\uBC5F"], /* Hangul Syllable */
+ ["\uBC60", "\uBC60"], /* Hangul Syllable */
+ ["\uBC61", "\uBC61"], /* Hangul Syllable */
+ ["\uBC62", "\uBC62"], /* Hangul Syllable */
+ ["\uBC63", "\uBC63"], /* Hangul Syllable */
+ ["\uBC64", "\uBC64"], /* Hangul Syllable */
+ ["\uBC65", "\uBC65"], /* Hangul Syllable */
+ ["\uBC66", "\uBC66"], /* Hangul Syllable */
+ ["\uBC67", "\uBC67"], /* Hangul Syllable */
+ ["\uBC68", "\uBC68"], /* Hangul Syllable */
+ ["\uBC69", "\uBC69"], /* Hangul Syllable */
+ ["\uBC6A", "\uBC6A"], /* Hangul Syllable */
+ ["\uBC6B", "\uBC6B"], /* Hangul Syllable */
+ ["\uBC6C", "\uBC6C"], /* Hangul Syllable */
+ ["\uBC6D", "\uBC6D"], /* Hangul Syllable */
+ ["\uBC6E", "\uBC6E"], /* Hangul Syllable */
+ ["\uBC6F", "\uBC6F"], /* Hangul Syllable */
+ ["\uBC70", "\uBC70"], /* Hangul Syllable */
+ ["\uBC71", "\uBC71"], /* Hangul Syllable */
+ ["\uBC72", "\uBC72"], /* Hangul Syllable */
+ ["\uBC73", "\uBC73"], /* Hangul Syllable */
+ ["\uBC74", "\uBC74"], /* Hangul Syllable */
+ ["\uBC75", "\uBC75"], /* Hangul Syllable */
+ ["\uBC76", "\uBC76"], /* Hangul Syllable */
+ ["\uBC77", "\uBC77"], /* Hangul Syllable */
+ ["\uBC78", "\uBC78"], /* Hangul Syllable */
+ ["\uBC79", "\uBC79"], /* Hangul Syllable */
+ ["\uBC7A", "\uBC7A"], /* Hangul Syllable */
+ ["\uBC7B", "\uBC7B"], /* Hangul Syllable */
+ ["\uBC7C", "\uBC7C"], /* Hangul Syllable */
+ ["\uBC7D", "\uBC7D"], /* Hangul Syllable */
+ ["\uBC7E", "\uBC7E"], /* Hangul Syllable */
+ ["\uBC7F", "\uBC7F"], /* Hangul Syllable */
+ ["\uBC80", "\uBC80"], /* Hangul Syllable */
+ ["\uBC81", "\uBC81"], /* Hangul Syllable */
+ ["\uBC82", "\uBC82"], /* Hangul Syllable */
+ ["\uBC83", "\uBC83"], /* Hangul Syllable */
+ ["\uBC84", "\uBC84"], /* Hangul Syllable */
+ ["\uBC85", "\uBC85"], /* Hangul Syllable */
+ ["\uBC86", "\uBC86"], /* Hangul Syllable */
+ ["\uBC87", "\uBC87"], /* Hangul Syllable */
+ ["\uBC88", "\uBC88"], /* Hangul Syllable */
+ ["\uBC89", "\uBC89"], /* Hangul Syllable */
+ ["\uBC8A", "\uBC8A"], /* Hangul Syllable */
+ ["\uBC8B", "\uBC8B"], /* Hangul Syllable */
+ ["\uBC8C", "\uBC8C"], /* Hangul Syllable */
+ ["\uBC8D", "\uBC8D"], /* Hangul Syllable */
+ ["\uBC8E", "\uBC8E"], /* Hangul Syllable */
+ ["\uBC8F", "\uBC8F"], /* Hangul Syllable */
+ ["\uBC90", "\uBC90"], /* Hangul Syllable */
+ ["\uBC91", "\uBC91"], /* Hangul Syllable */
+ ["\uBC92", "\uBC92"], /* Hangul Syllable */
+ ["\uBC93", "\uBC93"], /* Hangul Syllable */
+ ["\uBC94", "\uBC94"], /* Hangul Syllable */
+ ["\uBC95", "\uBC95"], /* Hangul Syllable */
+ ["\uBC96", "\uBC96"], /* Hangul Syllable */
+ ["\uBC97", "\uBC97"], /* Hangul Syllable */
+ ["\uBC98", "\uBC98"], /* Hangul Syllable */
+ ["\uBC99", "\uBC99"], /* Hangul Syllable */
+ ["\uBC9A", "\uBC9A"], /* Hangul Syllable */
+ ["\uBC9B", "\uBC9B"], /* Hangul Syllable */
+ ["\uBC9C", "\uBC9C"], /* Hangul Syllable */
+ ["\uBC9D", "\uBC9D"], /* Hangul Syllable */
+ ["\uBC9E", "\uBC9E"], /* Hangul Syllable */
+ ["\uBC9F", "\uBC9F"], /* Hangul Syllable */
+ ["\uBCA0", "\uBCA0"], /* Hangul Syllable */
+ ["\uBCA1", "\uBCA1"], /* Hangul Syllable */
+ ["\uBCA2", "\uBCA2"], /* Hangul Syllable */
+ ["\uBCA3", "\uBCA3"], /* Hangul Syllable */
+ ["\uBCA4", "\uBCA4"], /* Hangul Syllable */
+ ["\uBCA5", "\uBCA5"], /* Hangul Syllable */
+ ["\uBCA6", "\uBCA6"], /* Hangul Syllable */
+ ["\uBCA7", "\uBCA7"], /* Hangul Syllable */
+ ["\uBCA8", "\uBCA8"], /* Hangul Syllable */
+ ["\uBCA9", "\uBCA9"], /* Hangul Syllable */
+ ["\uBCAA", "\uBCAA"], /* Hangul Syllable */
+ ["\uBCAB", "\uBCAB"], /* Hangul Syllable */
+ ["\uBCAC", "\uBCAC"], /* Hangul Syllable */
+ ["\uBCAD", "\uBCAD"], /* Hangul Syllable */
+ ["\uBCAE", "\uBCAE"], /* Hangul Syllable */
+ ["\uBCAF", "\uBCAF"], /* Hangul Syllable */
+ ["\uBCB0", "\uBCB0"], /* Hangul Syllable */
+ ["\uBCB1", "\uBCB1"], /* Hangul Syllable */
+ ["\uBCB2", "\uBCB2"], /* Hangul Syllable */
+ ["\uBCB3", "\uBCB3"], /* Hangul Syllable */
+ ["\uBCB4", "\uBCB4"], /* Hangul Syllable */
+ ["\uBCB5", "\uBCB5"], /* Hangul Syllable */
+ ["\uBCB6", "\uBCB6"], /* Hangul Syllable */
+ ["\uBCB7", "\uBCB7"], /* Hangul Syllable */
+ ["\uBCB8", "\uBCB8"], /* Hangul Syllable */
+ ["\uBCB9", "\uBCB9"], /* Hangul Syllable */
+ ["\uBCBA", "\uBCBA"], /* Hangul Syllable */
+ ["\uBCBB", "\uBCBB"], /* Hangul Syllable */
+ ["\uBCBC", "\uBCBC"], /* Hangul Syllable */
+ ["\uBCBD", "\uBCBD"], /* Hangul Syllable */
+ ["\uBCBE", "\uBCBE"], /* Hangul Syllable */
+ ["\uBCBF", "\uBCBF"], /* Hangul Syllable */
+ ["\uBCC0", "\uBCC0"], /* Hangul Syllable */
+ ["\uBCC1", "\uBCC1"], /* Hangul Syllable */
+ ["\uBCC2", "\uBCC2"], /* Hangul Syllable */
+ ["\uBCC3", "\uBCC3"], /* Hangul Syllable */
+ ["\uBCC4", "\uBCC4"], /* Hangul Syllable */
+ ["\uBCC5", "\uBCC5"], /* Hangul Syllable */
+ ["\uBCC6", "\uBCC6"], /* Hangul Syllable */
+ ["\uBCC7", "\uBCC7"], /* Hangul Syllable */
+ ["\uBCC8", "\uBCC8"], /* Hangul Syllable */
+ ["\uBCC9", "\uBCC9"], /* Hangul Syllable */
+ ["\uBCCA", "\uBCCA"], /* Hangul Syllable */
+ ["\uBCCB", "\uBCCB"], /* Hangul Syllable */
+ ["\uBCCC", "\uBCCC"], /* Hangul Syllable */
+ ["\uBCCD", "\uBCCD"], /* Hangul Syllable */
+ ["\uBCCE", "\uBCCE"], /* Hangul Syllable */
+ ["\uBCCF", "\uBCCF"], /* Hangul Syllable */
+ ["\uBCD0", "\uBCD0"], /* Hangul Syllable */
+ ["\uBCD1", "\uBCD1"], /* Hangul Syllable */
+ ["\uBCD2", "\uBCD2"], /* Hangul Syllable */
+ ["\uBCD3", "\uBCD3"], /* Hangul Syllable */
+ ["\uBCD4", "\uBCD4"], /* Hangul Syllable */
+ ["\uBCD5", "\uBCD5"], /* Hangul Syllable */
+ ["\uBCD6", "\uBCD6"], /* Hangul Syllable */
+ ["\uBCD7", "\uBCD7"], /* Hangul Syllable */
+ ["\uBCD8", "\uBCD8"], /* Hangul Syllable */
+ ["\uBCD9", "\uBCD9"], /* Hangul Syllable */
+ ["\uBCDA", "\uBCDA"], /* Hangul Syllable */
+ ["\uBCDB", "\uBCDB"], /* Hangul Syllable */
+ ["\uBCDC", "\uBCDC"], /* Hangul Syllable */
+ ["\uBCDD", "\uBCDD"], /* Hangul Syllable */
+ ["\uBCDE", "\uBCDE"], /* Hangul Syllable */
+ ["\uBCDF", "\uBCDF"], /* Hangul Syllable */
+ ["\uBCE0", "\uBCE0"], /* Hangul Syllable */
+ ["\uBCE1", "\uBCE1"], /* Hangul Syllable */
+ ["\uBCE2", "\uBCE2"], /* Hangul Syllable */
+ ["\uBCE3", "\uBCE3"], /* Hangul Syllable */
+ ["\uBCE4", "\uBCE4"], /* Hangul Syllable */
+ ["\uBCE5", "\uBCE5"], /* Hangul Syllable */
+ ["\uBCE6", "\uBCE6"], /* Hangul Syllable */
+ ["\uBCE7", "\uBCE7"], /* Hangul Syllable */
+ ["\uBCE8", "\uBCE8"], /* Hangul Syllable */
+ ["\uBCE9", "\uBCE9"], /* Hangul Syllable */
+ ["\uBCEA", "\uBCEA"], /* Hangul Syllable */
+ ["\uBCEB", "\uBCEB"], /* Hangul Syllable */
+ ["\uBCEC", "\uBCEC"], /* Hangul Syllable */
+ ["\uBCED", "\uBCED"], /* Hangul Syllable */
+ ["\uBCEE", "\uBCEE"], /* Hangul Syllable */
+ ["\uBCEF", "\uBCEF"], /* Hangul Syllable */
+ ["\uBCF0", "\uBCF0"], /* Hangul Syllable */
+ ["\uBCF1", "\uBCF1"], /* Hangul Syllable */
+ ["\uBCF2", "\uBCF2"], /* Hangul Syllable */
+ ["\uBCF3", "\uBCF3"], /* Hangul Syllable */
+ ["\uBCF4", "\uBCF4"], /* Hangul Syllable */
+ ["\uBCF5", "\uBCF5"], /* Hangul Syllable */
+ ["\uBCF6", "\uBCF6"], /* Hangul Syllable */
+ ["\uBCF7", "\uBCF7"], /* Hangul Syllable */
+ ["\uBCF8", "\uBCF8"], /* Hangul Syllable */
+ ["\uBCF9", "\uBCF9"], /* Hangul Syllable */
+ ["\uBCFA", "\uBCFA"], /* Hangul Syllable */
+ ["\uBCFB", "\uBCFB"], /* Hangul Syllable */
+ ["\uBCFC", "\uBCFC"], /* Hangul Syllable */
+ ["\uBCFD", "\uBCFD"], /* Hangul Syllable */
+ ["\uBCFE", "\uBCFE"], /* Hangul Syllable */
+ ["\uBCFF", "\uBCFF"], /* Hangul Syllable */
+ ["\uBD00", "\uBD00"], /* Hangul Syllable */
+ ["\uBD01", "\uBD01"], /* Hangul Syllable */
+ ["\uBD02", "\uBD02"], /* Hangul Syllable */
+ ["\uBD03", "\uBD03"], /* Hangul Syllable */
+ ["\uBD04", "\uBD04"], /* Hangul Syllable */
+ ["\uBD05", "\uBD05"], /* Hangul Syllable */
+ ["\uBD06", "\uBD06"], /* Hangul Syllable */
+ ["\uBD07", "\uBD07"], /* Hangul Syllable */
+ ["\uBD08", "\uBD08"], /* Hangul Syllable */
+ ["\uBD09", "\uBD09"], /* Hangul Syllable */
+ ["\uBD0A", "\uBD0A"], /* Hangul Syllable */
+ ["\uBD0B", "\uBD0B"], /* Hangul Syllable */
+ ["\uBD0C", "\uBD0C"], /* Hangul Syllable */
+ ["\uBD0D", "\uBD0D"], /* Hangul Syllable */
+ ["\uBD0E", "\uBD0E"], /* Hangul Syllable */
+ ["\uBD0F", "\uBD0F"], /* Hangul Syllable */
+ ["\uBD10", "\uBD10"], /* Hangul Syllable */
+ ["\uBD11", "\uBD11"], /* Hangul Syllable */
+ ["\uBD12", "\uBD12"], /* Hangul Syllable */
+ ["\uBD13", "\uBD13"], /* Hangul Syllable */
+ ["\uBD14", "\uBD14"], /* Hangul Syllable */
+ ["\uBD15", "\uBD15"], /* Hangul Syllable */
+ ["\uBD16", "\uBD16"], /* Hangul Syllable */
+ ["\uBD17", "\uBD17"], /* Hangul Syllable */
+ ["\uBD18", "\uBD18"], /* Hangul Syllable */
+ ["\uBD19", "\uBD19"], /* Hangul Syllable */
+ ["\uBD1A", "\uBD1A"], /* Hangul Syllable */
+ ["\uBD1B", "\uBD1B"], /* Hangul Syllable */
+ ["\uBD1C", "\uBD1C"], /* Hangul Syllable */
+ ["\uBD1D", "\uBD1D"], /* Hangul Syllable */
+ ["\uBD1E", "\uBD1E"], /* Hangul Syllable */
+ ["\uBD1F", "\uBD1F"], /* Hangul Syllable */
+ ["\uBD20", "\uBD20"], /* Hangul Syllable */
+ ["\uBD21", "\uBD21"], /* Hangul Syllable */
+ ["\uBD22", "\uBD22"], /* Hangul Syllable */
+ ["\uBD23", "\uBD23"], /* Hangul Syllable */
+ ["\uBD24", "\uBD24"], /* Hangul Syllable */
+ ["\uBD25", "\uBD25"], /* Hangul Syllable */
+ ["\uBD26", "\uBD26"], /* Hangul Syllable */
+ ["\uBD27", "\uBD27"], /* Hangul Syllable */
+ ["\uBD28", "\uBD28"], /* Hangul Syllable */
+ ["\uBD29", "\uBD29"], /* Hangul Syllable */
+ ["\uBD2A", "\uBD2A"], /* Hangul Syllable */
+ ["\uBD2B", "\uBD2B"], /* Hangul Syllable */
+ ["\uBD2C", "\uBD2C"], /* Hangul Syllable */
+ ["\uBD2D", "\uBD2D"], /* Hangul Syllable */
+ ["\uBD2E", "\uBD2E"], /* Hangul Syllable */
+ ["\uBD2F", "\uBD2F"], /* Hangul Syllable */
+ ["\uBD30", "\uBD30"], /* Hangul Syllable */
+ ["\uBD31", "\uBD31"], /* Hangul Syllable */
+ ["\uBD32", "\uBD32"], /* Hangul Syllable */
+ ["\uBD33", "\uBD33"], /* Hangul Syllable */
+ ["\uBD34", "\uBD34"], /* Hangul Syllable */
+ ["\uBD35", "\uBD35"], /* Hangul Syllable */
+ ["\uBD36", "\uBD36"], /* Hangul Syllable */
+ ["\uBD37", "\uBD37"], /* Hangul Syllable */
+ ["\uBD38", "\uBD38"], /* Hangul Syllable */
+ ["\uBD39", "\uBD39"], /* Hangul Syllable */
+ ["\uBD3A", "\uBD3A"], /* Hangul Syllable */
+ ["\uBD3B", "\uBD3B"], /* Hangul Syllable */
+ ["\uBD3C", "\uBD3C"], /* Hangul Syllable */
+ ["\uBD3D", "\uBD3D"], /* Hangul Syllable */
+ ["\uBD3E", "\uBD3E"], /* Hangul Syllable */
+ ["\uBD3F", "\uBD3F"], /* Hangul Syllable */
+ ["\uBD40", "\uBD40"], /* Hangul Syllable */
+ ["\uBD41", "\uBD41"], /* Hangul Syllable */
+ ["\uBD42", "\uBD42"], /* Hangul Syllable */
+ ["\uBD43", "\uBD43"], /* Hangul Syllable */
+ ["\uBD44", "\uBD44"], /* Hangul Syllable */
+ ["\uBD45", "\uBD45"], /* Hangul Syllable */
+ ["\uBD46", "\uBD46"], /* Hangul Syllable */
+ ["\uBD47", "\uBD47"], /* Hangul Syllable */
+ ["\uBD48", "\uBD48"], /* Hangul Syllable */
+ ["\uBD49", "\uBD49"], /* Hangul Syllable */
+ ["\uBD4A", "\uBD4A"], /* Hangul Syllable */
+ ["\uBD4B", "\uBD4B"], /* Hangul Syllable */
+ ["\uBD4C", "\uBD4C"], /* Hangul Syllable */
+ ["\uBD4D", "\uBD4D"], /* Hangul Syllable */
+ ["\uBD4E", "\uBD4E"], /* Hangul Syllable */
+ ["\uBD4F", "\uBD4F"], /* Hangul Syllable */
+ ["\uBD50", "\uBD50"], /* Hangul Syllable */
+ ["\uBD51", "\uBD51"], /* Hangul Syllable */
+ ["\uBD52", "\uBD52"], /* Hangul Syllable */
+ ["\uBD53", "\uBD53"], /* Hangul Syllable */
+ ["\uBD54", "\uBD54"], /* Hangul Syllable */
+ ["\uBD55", "\uBD55"], /* Hangul Syllable */
+ ["\uBD56", "\uBD56"], /* Hangul Syllable */
+ ["\uBD57", "\uBD57"], /* Hangul Syllable */
+ ["\uBD58", "\uBD58"], /* Hangul Syllable */
+ ["\uBD59", "\uBD59"], /* Hangul Syllable */
+ ["\uBD5A", "\uBD5A"], /* Hangul Syllable */
+ ["\uBD5B", "\uBD5B"], /* Hangul Syllable */
+ ["\uBD5C", "\uBD5C"], /* Hangul Syllable */
+ ["\uBD5D", "\uBD5D"], /* Hangul Syllable */
+ ["\uBD5E", "\uBD5E"], /* Hangul Syllable */
+ ["\uBD5F", "\uBD5F"], /* Hangul Syllable */
+ ["\uBD60", "\uBD60"], /* Hangul Syllable */
+ ["\uBD61", "\uBD61"], /* Hangul Syllable */
+ ["\uBD62", "\uBD62"], /* Hangul Syllable */
+ ["\uBD63", "\uBD63"], /* Hangul Syllable */
+ ["\uBD64", "\uBD64"], /* Hangul Syllable */
+ ["\uBD65", "\uBD65"], /* Hangul Syllable */
+ ["\uBD66", "\uBD66"], /* Hangul Syllable */
+ ["\uBD67", "\uBD67"], /* Hangul Syllable */
+ ["\uBD68", "\uBD68"], /* Hangul Syllable */
+ ["\uBD69", "\uBD69"], /* Hangul Syllable */
+ ["\uBD6A", "\uBD6A"], /* Hangul Syllable */
+ ["\uBD6B", "\uBD6B"], /* Hangul Syllable */
+ ["\uBD6C", "\uBD6C"], /* Hangul Syllable */
+ ["\uBD6D", "\uBD6D"], /* Hangul Syllable */
+ ["\uBD6E", "\uBD6E"], /* Hangul Syllable */
+ ["\uBD6F", "\uBD6F"], /* Hangul Syllable */
+ ["\uBD70", "\uBD70"], /* Hangul Syllable */
+ ["\uBD71", "\uBD71"], /* Hangul Syllable */
+ ["\uBD72", "\uBD72"], /* Hangul Syllable */
+ ["\uBD73", "\uBD73"], /* Hangul Syllable */
+ ["\uBD74", "\uBD74"], /* Hangul Syllable */
+ ["\uBD75", "\uBD75"], /* Hangul Syllable */
+ ["\uBD76", "\uBD76"], /* Hangul Syllable */
+ ["\uBD77", "\uBD77"], /* Hangul Syllable */
+ ["\uBD78", "\uBD78"], /* Hangul Syllable */
+ ["\uBD79", "\uBD79"], /* Hangul Syllable */
+ ["\uBD7A", "\uBD7A"], /* Hangul Syllable */
+ ["\uBD7B", "\uBD7B"], /* Hangul Syllable */
+ ["\uBD7C", "\uBD7C"], /* Hangul Syllable */
+ ["\uBD7D", "\uBD7D"], /* Hangul Syllable */
+ ["\uBD7E", "\uBD7E"], /* Hangul Syllable */
+ ["\uBD7F", "\uBD7F"], /* Hangul Syllable */
+ ["\uBD80", "\uBD80"], /* Hangul Syllable */
+ ["\uBD81", "\uBD81"], /* Hangul Syllable */
+ ["\uBD82", "\uBD82"], /* Hangul Syllable */
+ ["\uBD83", "\uBD83"], /* Hangul Syllable */
+ ["\uBD84", "\uBD84"], /* Hangul Syllable */
+ ["\uBD85", "\uBD85"], /* Hangul Syllable */
+ ["\uBD86", "\uBD86"], /* Hangul Syllable */
+ ["\uBD87", "\uBD87"], /* Hangul Syllable */
+ ["\uBD88", "\uBD88"], /* Hangul Syllable */
+ ["\uBD89", "\uBD89"], /* Hangul Syllable */
+ ["\uBD8A", "\uBD8A"], /* Hangul Syllable */
+ ["\uBD8B", "\uBD8B"], /* Hangul Syllable */
+ ["\uBD8C", "\uBD8C"], /* Hangul Syllable */
+ ["\uBD8D", "\uBD8D"], /* Hangul Syllable */
+ ["\uBD8E", "\uBD8E"], /* Hangul Syllable */
+ ["\uBD8F", "\uBD8F"], /* Hangul Syllable */
+ ["\uBD90", "\uBD90"], /* Hangul Syllable */
+ ["\uBD91", "\uBD91"], /* Hangul Syllable */
+ ["\uBD92", "\uBD92"], /* Hangul Syllable */
+ ["\uBD93", "\uBD93"], /* Hangul Syllable */
+ ["\uBD94", "\uBD94"], /* Hangul Syllable */
+ ["\uBD95", "\uBD95"], /* Hangul Syllable */
+ ["\uBD96", "\uBD96"], /* Hangul Syllable */
+ ["\uBD97", "\uBD97"], /* Hangul Syllable */
+ ["\uBD98", "\uBD98"], /* Hangul Syllable */
+ ["\uBD99", "\uBD99"], /* Hangul Syllable */
+ ["\uBD9A", "\uBD9A"], /* Hangul Syllable */
+ ["\uBD9B", "\uBD9B"], /* Hangul Syllable */
+ ["\uBD9C", "\uBD9C"], /* Hangul Syllable */
+ ["\uBD9D", "\uBD9D"], /* Hangul Syllable */
+ ["\uBD9E", "\uBD9E"], /* Hangul Syllable */
+ ["\uBD9F", "\uBD9F"], /* Hangul Syllable */
+ ["\uBDA0", "\uBDA0"], /* Hangul Syllable */
+ ["\uBDA1", "\uBDA1"], /* Hangul Syllable */
+ ["\uBDA2", "\uBDA2"], /* Hangul Syllable */
+ ["\uBDA3", "\uBDA3"], /* Hangul Syllable */
+ ["\uBDA4", "\uBDA4"], /* Hangul Syllable */
+ ["\uBDA5", "\uBDA5"], /* Hangul Syllable */
+ ["\uBDA6", "\uBDA6"], /* Hangul Syllable */
+ ["\uBDA7", "\uBDA7"], /* Hangul Syllable */
+ ["\uBDA8", "\uBDA8"], /* Hangul Syllable */
+ ["\uBDA9", "\uBDA9"], /* Hangul Syllable */
+ ["\uBDAA", "\uBDAA"], /* Hangul Syllable */
+ ["\uBDAB", "\uBDAB"], /* Hangul Syllable */
+ ["\uBDAC", "\uBDAC"], /* Hangul Syllable */
+ ["\uBDAD", "\uBDAD"], /* Hangul Syllable */
+ ["\uBDAE", "\uBDAE"], /* Hangul Syllable */
+ ["\uBDAF", "\uBDAF"], /* Hangul Syllable */
+ ["\uBDB0", "\uBDB0"], /* Hangul Syllable */
+ ["\uBDB1", "\uBDB1"], /* Hangul Syllable */
+ ["\uBDB2", "\uBDB2"], /* Hangul Syllable */
+ ["\uBDB3", "\uBDB3"], /* Hangul Syllable */
+ ["\uBDB4", "\uBDB4"], /* Hangul Syllable */
+ ["\uBDB5", "\uBDB5"], /* Hangul Syllable */
+ ["\uBDB6", "\uBDB6"], /* Hangul Syllable */
+ ["\uBDB7", "\uBDB7"], /* Hangul Syllable */
+ ["\uBDB8", "\uBDB8"], /* Hangul Syllable */
+ ["\uBDB9", "\uBDB9"], /* Hangul Syllable */
+ ["\uBDBA", "\uBDBA"], /* Hangul Syllable */
+ ["\uBDBB", "\uBDBB"], /* Hangul Syllable */
+ ["\uBDBC", "\uBDBC"], /* Hangul Syllable */
+ ["\uBDBD", "\uBDBD"], /* Hangul Syllable */
+ ["\uBDBE", "\uBDBE"], /* Hangul Syllable */
+ ["\uBDBF", "\uBDBF"], /* Hangul Syllable */
+ ["\uBDC0", "\uBDC0"], /* Hangul Syllable */
+ ["\uBDC1", "\uBDC1"], /* Hangul Syllable */
+ ["\uBDC2", "\uBDC2"], /* Hangul Syllable */
+ ["\uBDC3", "\uBDC3"], /* Hangul Syllable */
+ ["\uBDC4", "\uBDC4"], /* Hangul Syllable */
+ ["\uBDC5", "\uBDC5"], /* Hangul Syllable */
+ ["\uBDC6", "\uBDC6"], /* Hangul Syllable */
+ ["\uBDC7", "\uBDC7"], /* Hangul Syllable */
+ ["\uBDC8", "\uBDC8"], /* Hangul Syllable */
+ ["\uBDC9", "\uBDC9"], /* Hangul Syllable */
+ ["\uBDCA", "\uBDCA"], /* Hangul Syllable */
+ ["\uBDCB", "\uBDCB"], /* Hangul Syllable */
+ ["\uBDCC", "\uBDCC"], /* Hangul Syllable */
+ ["\uBDCD", "\uBDCD"], /* Hangul Syllable */
+ ["\uBDCE", "\uBDCE"], /* Hangul Syllable */
+ ["\uBDCF", "\uBDCF"], /* Hangul Syllable */
+ ["\uBDD0", "\uBDD0"], /* Hangul Syllable */
+ ["\uBDD1", "\uBDD1"], /* Hangul Syllable */
+ ["\uBDD2", "\uBDD2"], /* Hangul Syllable */
+ ["\uBDD3", "\uBDD3"], /* Hangul Syllable */
+ ["\uBDD4", "\uBDD4"], /* Hangul Syllable */
+ ["\uBDD5", "\uBDD5"], /* Hangul Syllable */
+ ["\uBDD6", "\uBDD6"], /* Hangul Syllable */
+ ["\uBDD7", "\uBDD7"], /* Hangul Syllable */
+ ["\uBDD8", "\uBDD8"], /* Hangul Syllable */
+ ["\uBDD9", "\uBDD9"], /* Hangul Syllable */
+ ["\uBDDA", "\uBDDA"], /* Hangul Syllable */
+ ["\uBDDB", "\uBDDB"], /* Hangul Syllable */
+ ["\uBDDC", "\uBDDC"], /* Hangul Syllable */
+ ["\uBDDD", "\uBDDD"], /* Hangul Syllable */
+ ["\uBDDE", "\uBDDE"], /* Hangul Syllable */
+ ["\uBDDF", "\uBDDF"], /* Hangul Syllable */
+ ["\uBDE0", "\uBDE0"], /* Hangul Syllable */
+ ["\uBDE1", "\uBDE1"], /* Hangul Syllable */
+ ["\uBDE2", "\uBDE2"], /* Hangul Syllable */
+ ["\uBDE3", "\uBDE3"], /* Hangul Syllable */
+ ["\uBDE4", "\uBDE4"], /* Hangul Syllable */
+ ["\uBDE5", "\uBDE5"], /* Hangul Syllable */
+ ["\uBDE6", "\uBDE6"], /* Hangul Syllable */
+ ["\uBDE7", "\uBDE7"], /* Hangul Syllable */
+ ["\uBDE8", "\uBDE8"], /* Hangul Syllable */
+ ["\uBDE9", "\uBDE9"], /* Hangul Syllable */
+ ["\uBDEA", "\uBDEA"], /* Hangul Syllable */
+ ["\uBDEB", "\uBDEB"], /* Hangul Syllable */
+ ["\uBDEC", "\uBDEC"], /* Hangul Syllable */
+ ["\uBDED", "\uBDED"], /* Hangul Syllable */
+ ["\uBDEE", "\uBDEE"], /* Hangul Syllable */
+ ["\uBDEF", "\uBDEF"], /* Hangul Syllable */
+ ["\uBDF0", "\uBDF0"], /* Hangul Syllable */
+ ["\uBDF1", "\uBDF1"], /* Hangul Syllable */
+ ["\uBDF2", "\uBDF2"], /* Hangul Syllable */
+ ["\uBDF3", "\uBDF3"], /* Hangul Syllable */
+ ["\uBDF4", "\uBDF4"], /* Hangul Syllable */
+ ["\uBDF5", "\uBDF5"], /* Hangul Syllable */
+ ["\uBDF6", "\uBDF6"], /* Hangul Syllable */
+ ["\uBDF7", "\uBDF7"], /* Hangul Syllable */
+ ["\uBDF8", "\uBDF8"], /* Hangul Syllable */
+ ["\uBDF9", "\uBDF9"], /* Hangul Syllable */
+ ["\uBDFA", "\uBDFA"], /* Hangul Syllable */
+ ["\uBDFB", "\uBDFB"], /* Hangul Syllable */
+ ["\uBDFC", "\uBDFC"], /* Hangul Syllable */
+ ["\uBDFD", "\uBDFD"], /* Hangul Syllable */
+ ["\uBDFE", "\uBDFE"], /* Hangul Syllable */
+ ["\uBDFF", "\uBDFF"], /* Hangul Syllable */
+ ["\uBE00", "\uBE00"], /* Hangul Syllable */
+ ["\uBE01", "\uBE01"], /* Hangul Syllable */
+ ["\uBE02", "\uBE02"], /* Hangul Syllable */
+ ["\uBE03", "\uBE03"], /* Hangul Syllable */
+ ["\uBE04", "\uBE04"], /* Hangul Syllable */
+ ["\uBE05", "\uBE05"], /* Hangul Syllable */
+ ["\uBE06", "\uBE06"], /* Hangul Syllable */
+ ["\uBE07", "\uBE07"], /* Hangul Syllable */
+ ["\uBE08", "\uBE08"], /* Hangul Syllable */
+ ["\uBE09", "\uBE09"], /* Hangul Syllable */
+ ["\uBE0A", "\uBE0A"], /* Hangul Syllable */
+ ["\uBE0B", "\uBE0B"], /* Hangul Syllable */
+ ["\uBE0C", "\uBE0C"], /* Hangul Syllable */
+ ["\uBE0D", "\uBE0D"], /* Hangul Syllable */
+ ["\uBE0E", "\uBE0E"], /* Hangul Syllable */
+ ["\uBE0F", "\uBE0F"], /* Hangul Syllable */
+ ["\uBE10", "\uBE10"], /* Hangul Syllable */
+ ["\uBE11", "\uBE11"], /* Hangul Syllable */
+ ["\uBE12", "\uBE12"], /* Hangul Syllable */
+ ["\uBE13", "\uBE13"], /* Hangul Syllable */
+ ["\uBE14", "\uBE14"], /* Hangul Syllable */
+ ["\uBE15", "\uBE15"], /* Hangul Syllable */
+ ["\uBE16", "\uBE16"], /* Hangul Syllable */
+ ["\uBE17", "\uBE17"], /* Hangul Syllable */
+ ["\uBE18", "\uBE18"], /* Hangul Syllable */
+ ["\uBE19", "\uBE19"], /* Hangul Syllable */
+ ["\uBE1A", "\uBE1A"], /* Hangul Syllable */
+ ["\uBE1B", "\uBE1B"], /* Hangul Syllable */
+ ["\uBE1C", "\uBE1C"], /* Hangul Syllable */
+ ["\uBE1D", "\uBE1D"], /* Hangul Syllable */
+ ["\uBE1E", "\uBE1E"], /* Hangul Syllable */
+ ["\uBE1F", "\uBE1F"], /* Hangul Syllable */
+ ["\uBE20", "\uBE20"], /* Hangul Syllable */
+ ["\uBE21", "\uBE21"], /* Hangul Syllable */
+ ["\uBE22", "\uBE22"], /* Hangul Syllable */
+ ["\uBE23", "\uBE23"], /* Hangul Syllable */
+ ["\uBE24", "\uBE24"], /* Hangul Syllable */
+ ["\uBE25", "\uBE25"], /* Hangul Syllable */
+ ["\uBE26", "\uBE26"], /* Hangul Syllable */
+ ["\uBE27", "\uBE27"], /* Hangul Syllable */
+ ["\uBE28", "\uBE28"], /* Hangul Syllable */
+ ["\uBE29", "\uBE29"], /* Hangul Syllable */
+ ["\uBE2A", "\uBE2A"], /* Hangul Syllable */
+ ["\uBE2B", "\uBE2B"], /* Hangul Syllable */
+ ["\uBE2C", "\uBE2C"], /* Hangul Syllable */
+ ["\uBE2D", "\uBE2D"], /* Hangul Syllable */
+ ["\uBE2E", "\uBE2E"], /* Hangul Syllable */
+ ["\uBE2F", "\uBE2F"], /* Hangul Syllable */
+ ["\uBE30", "\uBE30"], /* Hangul Syllable */
+ ["\uBE31", "\uBE31"], /* Hangul Syllable */
+ ["\uBE32", "\uBE32"], /* Hangul Syllable */
+ ["\uBE33", "\uBE33"], /* Hangul Syllable */
+ ["\uBE34", "\uBE34"], /* Hangul Syllable */
+ ["\uBE35", "\uBE35"], /* Hangul Syllable */
+ ["\uBE36", "\uBE36"], /* Hangul Syllable */
+ ["\uBE37", "\uBE37"], /* Hangul Syllable */
+ ["\uBE38", "\uBE38"], /* Hangul Syllable */
+ ["\uBE39", "\uBE39"], /* Hangul Syllable */
+ ["\uBE3A", "\uBE3A"], /* Hangul Syllable */
+ ["\uBE3B", "\uBE3B"], /* Hangul Syllable */
+ ["\uBE3C", "\uBE3C"], /* Hangul Syllable */
+ ["\uBE3D", "\uBE3D"], /* Hangul Syllable */
+ ["\uBE3E", "\uBE3E"], /* Hangul Syllable */
+ ["\uBE3F", "\uBE3F"], /* Hangul Syllable */
+ ["\uBE40", "\uBE40"], /* Hangul Syllable */
+ ["\uBE41", "\uBE41"], /* Hangul Syllable */
+ ["\uBE42", "\uBE42"], /* Hangul Syllable */
+ ["\uBE43", "\uBE43"], /* Hangul Syllable */
+ ["\uBE44", "\uBE44"], /* Hangul Syllable */
+ ["\uBE45", "\uBE45"], /* Hangul Syllable */
+ ["\uBE46", "\uBE46"], /* Hangul Syllable */
+ ["\uBE47", "\uBE47"], /* Hangul Syllable */
+ ["\uBE48", "\uBE48"], /* Hangul Syllable */
+ ["\uBE49", "\uBE49"], /* Hangul Syllable */
+ ["\uBE4A", "\uBE4A"], /* Hangul Syllable */
+ ["\uBE4B", "\uBE4B"], /* Hangul Syllable */
+ ["\uBE4C", "\uBE4C"], /* Hangul Syllable */
+ ["\uBE4D", "\uBE4D"], /* Hangul Syllable */
+ ["\uBE4E", "\uBE4E"], /* Hangul Syllable */
+ ["\uBE4F", "\uBE4F"], /* Hangul Syllable */
+ ["\uBE50", "\uBE50"], /* Hangul Syllable */
+ ["\uBE51", "\uBE51"], /* Hangul Syllable */
+ ["\uBE52", "\uBE52"], /* Hangul Syllable */
+ ["\uBE53", "\uBE53"], /* Hangul Syllable */
+ ["\uBE54", "\uBE54"], /* Hangul Syllable */
+ ["\uBE55", "\uBE55"], /* Hangul Syllable */
+ ["\uBE56", "\uBE56"], /* Hangul Syllable */
+ ["\uBE57", "\uBE57"], /* Hangul Syllable */
+ ["\uBE58", "\uBE58"], /* Hangul Syllable */
+ ["\uBE59", "\uBE59"], /* Hangul Syllable */
+ ["\uBE5A", "\uBE5A"], /* Hangul Syllable */
+ ["\uBE5B", "\uBE5B"], /* Hangul Syllable */
+ ["\uBE5C", "\uBE5C"], /* Hangul Syllable */
+ ["\uBE5D", "\uBE5D"], /* Hangul Syllable */
+ ["\uBE5E", "\uBE5E"], /* Hangul Syllable */
+ ["\uBE5F", "\uBE5F"], /* Hangul Syllable */
+ ["\uBE60", "\uBE60"], /* Hangul Syllable */
+ ["\uBE61", "\uBE61"], /* Hangul Syllable */
+ ["\uBE62", "\uBE62"], /* Hangul Syllable */
+ ["\uBE63", "\uBE63"], /* Hangul Syllable */
+ ["\uBE64", "\uBE64"], /* Hangul Syllable */
+ ["\uBE65", "\uBE65"], /* Hangul Syllable */
+ ["\uBE66", "\uBE66"], /* Hangul Syllable */
+ ["\uBE67", "\uBE67"], /* Hangul Syllable */
+ ["\uBE68", "\uBE68"], /* Hangul Syllable */
+ ["\uBE69", "\uBE69"], /* Hangul Syllable */
+ ["\uBE6A", "\uBE6A"], /* Hangul Syllable */
+ ["\uBE6B", "\uBE6B"], /* Hangul Syllable */
+ ["\uBE6C", "\uBE6C"], /* Hangul Syllable */
+ ["\uBE6D", "\uBE6D"], /* Hangul Syllable */
+ ["\uBE6E", "\uBE6E"], /* Hangul Syllable */
+ ["\uBE6F", "\uBE6F"], /* Hangul Syllable */
+ ["\uBE70", "\uBE70"], /* Hangul Syllable */
+ ["\uBE71", "\uBE71"], /* Hangul Syllable */
+ ["\uBE72", "\uBE72"], /* Hangul Syllable */
+ ["\uBE73", "\uBE73"], /* Hangul Syllable */
+ ["\uBE74", "\uBE74"], /* Hangul Syllable */
+ ["\uBE75", "\uBE75"], /* Hangul Syllable */
+ ["\uBE76", "\uBE76"], /* Hangul Syllable */
+ ["\uBE77", "\uBE77"], /* Hangul Syllable */
+ ["\uBE78", "\uBE78"], /* Hangul Syllable */
+ ["\uBE79", "\uBE79"], /* Hangul Syllable */
+ ["\uBE7A", "\uBE7A"], /* Hangul Syllable */
+ ["\uBE7B", "\uBE7B"], /* Hangul Syllable */
+ ["\uBE7C", "\uBE7C"], /* Hangul Syllable */
+ ["\uBE7D", "\uBE7D"], /* Hangul Syllable */
+ ["\uBE7E", "\uBE7E"], /* Hangul Syllable */
+ ["\uBE7F", "\uBE7F"], /* Hangul Syllable */
+ ["\uBE80", "\uBE80"], /* Hangul Syllable */
+ ["\uBE81", "\uBE81"], /* Hangul Syllable */
+ ["\uBE82", "\uBE82"], /* Hangul Syllable */
+ ["\uBE83", "\uBE83"], /* Hangul Syllable */
+ ["\uBE84", "\uBE84"], /* Hangul Syllable */
+ ["\uBE85", "\uBE85"], /* Hangul Syllable */
+ ["\uBE86", "\uBE86"], /* Hangul Syllable */
+ ["\uBE87", "\uBE87"], /* Hangul Syllable */
+ ["\uBE88", "\uBE88"], /* Hangul Syllable */
+ ["\uBE89", "\uBE89"], /* Hangul Syllable */
+ ["\uBE8A", "\uBE8A"], /* Hangul Syllable */
+ ["\uBE8B", "\uBE8B"], /* Hangul Syllable */
+ ["\uBE8C", "\uBE8C"], /* Hangul Syllable */
+ ["\uBE8D", "\uBE8D"], /* Hangul Syllable */
+ ["\uBE8E", "\uBE8E"], /* Hangul Syllable */
+ ["\uBE8F", "\uBE8F"], /* Hangul Syllable */
+ ["\uBE90", "\uBE90"], /* Hangul Syllable */
+ ["\uBE91", "\uBE91"], /* Hangul Syllable */
+ ["\uBE92", "\uBE92"], /* Hangul Syllable */
+ ["\uBE93", "\uBE93"], /* Hangul Syllable */
+ ["\uBE94", "\uBE94"], /* Hangul Syllable */
+ ["\uBE95", "\uBE95"], /* Hangul Syllable */
+ ["\uBE96", "\uBE96"], /* Hangul Syllable */
+ ["\uBE97", "\uBE97"], /* Hangul Syllable */
+ ["\uBE98", "\uBE98"], /* Hangul Syllable */
+ ["\uBE99", "\uBE99"], /* Hangul Syllable */
+ ["\uBE9A", "\uBE9A"], /* Hangul Syllable */
+ ["\uBE9B", "\uBE9B"], /* Hangul Syllable */
+ ["\uBE9C", "\uBE9C"], /* Hangul Syllable */
+ ["\uBE9D", "\uBE9D"], /* Hangul Syllable */
+ ["\uBE9E", "\uBE9E"], /* Hangul Syllable */
+ ["\uBE9F", "\uBE9F"], /* Hangul Syllable */
+ ["\uBEA0", "\uBEA0"], /* Hangul Syllable */
+ ["\uBEA1", "\uBEA1"], /* Hangul Syllable */
+ ["\uBEA2", "\uBEA2"], /* Hangul Syllable */
+ ["\uBEA3", "\uBEA3"], /* Hangul Syllable */
+ ["\uBEA4", "\uBEA4"], /* Hangul Syllable */
+ ["\uBEA5", "\uBEA5"], /* Hangul Syllable */
+ ["\uBEA6", "\uBEA6"], /* Hangul Syllable */
+ ["\uBEA7", "\uBEA7"], /* Hangul Syllable */
+ ["\uBEA8", "\uBEA8"], /* Hangul Syllable */
+ ["\uBEA9", "\uBEA9"], /* Hangul Syllable */
+ ["\uBEAA", "\uBEAA"], /* Hangul Syllable */
+ ["\uBEAB", "\uBEAB"], /* Hangul Syllable */
+ ["\uBEAC", "\uBEAC"], /* Hangul Syllable */
+ ["\uBEAD", "\uBEAD"], /* Hangul Syllable */
+ ["\uBEAE", "\uBEAE"], /* Hangul Syllable */
+ ["\uBEAF", "\uBEAF"], /* Hangul Syllable */
+ ["\uBEB0", "\uBEB0"], /* Hangul Syllable */
+ ["\uBEB1", "\uBEB1"], /* Hangul Syllable */
+ ["\uBEB2", "\uBEB2"], /* Hangul Syllable */
+ ["\uBEB3", "\uBEB3"], /* Hangul Syllable */
+ ["\uBEB4", "\uBEB4"], /* Hangul Syllable */
+ ["\uBEB5", "\uBEB5"], /* Hangul Syllable */
+ ["\uBEB6", "\uBEB6"], /* Hangul Syllable */
+ ["\uBEB7", "\uBEB7"], /* Hangul Syllable */
+ ["\uBEB8", "\uBEB8"], /* Hangul Syllable */
+ ["\uBEB9", "\uBEB9"], /* Hangul Syllable */
+ ["\uBEBA", "\uBEBA"], /* Hangul Syllable */
+ ["\uBEBB", "\uBEBB"], /* Hangul Syllable */
+ ["\uBEBC", "\uBEBC"], /* Hangul Syllable */
+ ["\uBEBD", "\uBEBD"], /* Hangul Syllable */
+ ["\uBEBE", "\uBEBE"], /* Hangul Syllable */
+ ["\uBEBF", "\uBEBF"], /* Hangul Syllable */
+ ["\uBEC0", "\uBEC0"], /* Hangul Syllable */
+ ["\uBEC1", "\uBEC1"], /* Hangul Syllable */
+ ["\uBEC2", "\uBEC2"], /* Hangul Syllable */
+ ["\uBEC3", "\uBEC3"], /* Hangul Syllable */
+ ["\uBEC4", "\uBEC4"], /* Hangul Syllable */
+ ["\uBEC5", "\uBEC5"], /* Hangul Syllable */
+ ["\uBEC6", "\uBEC6"], /* Hangul Syllable */
+ ["\uBEC7", "\uBEC7"], /* Hangul Syllable */
+ ["\uBEC8", "\uBEC8"], /* Hangul Syllable */
+ ["\uBEC9", "\uBEC9"], /* Hangul Syllable */
+ ["\uBECA", "\uBECA"], /* Hangul Syllable */
+ ["\uBECB", "\uBECB"], /* Hangul Syllable */
+ ["\uBECC", "\uBECC"], /* Hangul Syllable */
+ ["\uBECD", "\uBECD"], /* Hangul Syllable */
+ ["\uBECE", "\uBECE"], /* Hangul Syllable */
+ ["\uBECF", "\uBECF"], /* Hangul Syllable */
+ ["\uBED0", "\uBED0"], /* Hangul Syllable */
+ ["\uBED1", "\uBED1"], /* Hangul Syllable */
+ ["\uBED2", "\uBED2"], /* Hangul Syllable */
+ ["\uBED3", "\uBED3"], /* Hangul Syllable */
+ ["\uBED4", "\uBED4"], /* Hangul Syllable */
+ ["\uBED5", "\uBED5"], /* Hangul Syllable */
+ ["\uBED6", "\uBED6"], /* Hangul Syllable */
+ ["\uBED7", "\uBED7"], /* Hangul Syllable */
+ ["\uBED8", "\uBED8"], /* Hangul Syllable */
+ ["\uBED9", "\uBED9"], /* Hangul Syllable */
+ ["\uBEDA", "\uBEDA"], /* Hangul Syllable */
+ ["\uBEDB", "\uBEDB"], /* Hangul Syllable */
+ ["\uBEDC", "\uBEDC"], /* Hangul Syllable */
+ ["\uBEDD", "\uBEDD"], /* Hangul Syllable */
+ ["\uBEDE", "\uBEDE"], /* Hangul Syllable */
+ ["\uBEDF", "\uBEDF"], /* Hangul Syllable */
+ ["\uBEE0", "\uBEE0"], /* Hangul Syllable */
+ ["\uBEE1", "\uBEE1"], /* Hangul Syllable */
+ ["\uBEE2", "\uBEE2"], /* Hangul Syllable */
+ ["\uBEE3", "\uBEE3"], /* Hangul Syllable */
+ ["\uBEE4", "\uBEE4"], /* Hangul Syllable */
+ ["\uBEE5", "\uBEE5"], /* Hangul Syllable */
+ ["\uBEE6", "\uBEE6"], /* Hangul Syllable */
+ ["\uBEE7", "\uBEE7"], /* Hangul Syllable */
+ ["\uBEE8", "\uBEE8"], /* Hangul Syllable */
+ ["\uBEE9", "\uBEE9"], /* Hangul Syllable */
+ ["\uBEEA", "\uBEEA"], /* Hangul Syllable */
+ ["\uBEEB", "\uBEEB"], /* Hangul Syllable */
+ ["\uBEEC", "\uBEEC"], /* Hangul Syllable */
+ ["\uBEED", "\uBEED"], /* Hangul Syllable */
+ ["\uBEEE", "\uBEEE"], /* Hangul Syllable */
+ ["\uBEEF", "\uBEEF"], /* Hangul Syllable */
+ ["\uBEF0", "\uBEF0"], /* Hangul Syllable */
+ ["\uBEF1", "\uBEF1"], /* Hangul Syllable */
+ ["\uBEF2", "\uBEF2"], /* Hangul Syllable */
+ ["\uBEF3", "\uBEF3"], /* Hangul Syllable */
+ ["\uBEF4", "\uBEF4"], /* Hangul Syllable */
+ ["\uBEF5", "\uBEF5"], /* Hangul Syllable */
+ ["\uBEF6", "\uBEF6"], /* Hangul Syllable */
+ ["\uBEF7", "\uBEF7"], /* Hangul Syllable */
+ ["\uBEF8", "\uBEF8"], /* Hangul Syllable */
+ ["\uBEF9", "\uBEF9"], /* Hangul Syllable */
+ ["\uBEFA", "\uBEFA"], /* Hangul Syllable */
+ ["\uBEFB", "\uBEFB"], /* Hangul Syllable */
+ ["\uBEFC", "\uBEFC"], /* Hangul Syllable */
+ ["\uBEFD", "\uBEFD"], /* Hangul Syllable */
+ ["\uBEFE", "\uBEFE"], /* Hangul Syllable */
+ ["\uBEFF", "\uBEFF"], /* Hangul Syllable */
+ ["\uBF00", "\uBF00"], /* Hangul Syllable */
+ ["\uBF01", "\uBF01"], /* Hangul Syllable */
+ ["\uBF02", "\uBF02"], /* Hangul Syllable */
+ ["\uBF03", "\uBF03"], /* Hangul Syllable */
+ ["\uBF04", "\uBF04"], /* Hangul Syllable */
+ ["\uBF05", "\uBF05"], /* Hangul Syllable */
+ ["\uBF06", "\uBF06"], /* Hangul Syllable */
+ ["\uBF07", "\uBF07"], /* Hangul Syllable */
+ ["\uBF08", "\uBF08"], /* Hangul Syllable */
+ ["\uBF09", "\uBF09"], /* Hangul Syllable */
+ ["\uBF0A", "\uBF0A"], /* Hangul Syllable */
+ ["\uBF0B", "\uBF0B"], /* Hangul Syllable */
+ ["\uBF0C", "\uBF0C"], /* Hangul Syllable */
+ ["\uBF0D", "\uBF0D"], /* Hangul Syllable */
+ ["\uBF0E", "\uBF0E"], /* Hangul Syllable */
+ ["\uBF0F", "\uBF0F"], /* Hangul Syllable */
+ ["\uBF10", "\uBF10"], /* Hangul Syllable */
+ ["\uBF11", "\uBF11"], /* Hangul Syllable */
+ ["\uBF12", "\uBF12"], /* Hangul Syllable */
+ ["\uBF13", "\uBF13"], /* Hangul Syllable */
+ ["\uBF14", "\uBF14"], /* Hangul Syllable */
+ ["\uBF15", "\uBF15"], /* Hangul Syllable */
+ ["\uBF16", "\uBF16"], /* Hangul Syllable */
+ ["\uBF17", "\uBF17"], /* Hangul Syllable */
+ ["\uBF18", "\uBF18"], /* Hangul Syllable */
+ ["\uBF19", "\uBF19"], /* Hangul Syllable */
+ ["\uBF1A", "\uBF1A"], /* Hangul Syllable */
+ ["\uBF1B", "\uBF1B"], /* Hangul Syllable */
+ ["\uBF1C", "\uBF1C"], /* Hangul Syllable */
+ ["\uBF1D", "\uBF1D"], /* Hangul Syllable */
+ ["\uBF1E", "\uBF1E"], /* Hangul Syllable */
+ ["\uBF1F", "\uBF1F"], /* Hangul Syllable */
+ ["\uBF20", "\uBF20"], /* Hangul Syllable */
+ ["\uBF21", "\uBF21"], /* Hangul Syllable */
+ ["\uBF22", "\uBF22"], /* Hangul Syllable */
+ ["\uBF23", "\uBF23"], /* Hangul Syllable */
+ ["\uBF24", "\uBF24"], /* Hangul Syllable */
+ ["\uBF25", "\uBF25"], /* Hangul Syllable */
+ ["\uBF26", "\uBF26"], /* Hangul Syllable */
+ ["\uBF27", "\uBF27"], /* Hangul Syllable */
+ ["\uBF28", "\uBF28"], /* Hangul Syllable */
+ ["\uBF29", "\uBF29"], /* Hangul Syllable */
+ ["\uBF2A", "\uBF2A"], /* Hangul Syllable */
+ ["\uBF2B", "\uBF2B"], /* Hangul Syllable */
+ ["\uBF2C", "\uBF2C"], /* Hangul Syllable */
+ ["\uBF2D", "\uBF2D"], /* Hangul Syllable */
+ ["\uBF2E", "\uBF2E"], /* Hangul Syllable */
+ ["\uBF2F", "\uBF2F"], /* Hangul Syllable */
+ ["\uBF30", "\uBF30"], /* Hangul Syllable */
+ ["\uBF31", "\uBF31"], /* Hangul Syllable */
+ ["\uBF32", "\uBF32"], /* Hangul Syllable */
+ ["\uBF33", "\uBF33"], /* Hangul Syllable */
+ ["\uBF34", "\uBF34"], /* Hangul Syllable */
+ ["\uBF35", "\uBF35"], /* Hangul Syllable */
+ ["\uBF36", "\uBF36"], /* Hangul Syllable */
+ ["\uBF37", "\uBF37"], /* Hangul Syllable */
+ ["\uBF38", "\uBF38"], /* Hangul Syllable */
+ ["\uBF39", "\uBF39"], /* Hangul Syllable */
+ ["\uBF3A", "\uBF3A"], /* Hangul Syllable */
+ ["\uBF3B", "\uBF3B"], /* Hangul Syllable */
+ ["\uBF3C", "\uBF3C"], /* Hangul Syllable */
+ ["\uBF3D", "\uBF3D"], /* Hangul Syllable */
+ ["\uBF3E", "\uBF3E"], /* Hangul Syllable */
+ ["\uBF3F", "\uBF3F"], /* Hangul Syllable */
+ ["\uBF40", "\uBF40"], /* Hangul Syllable */
+ ["\uBF41", "\uBF41"], /* Hangul Syllable */
+ ["\uBF42", "\uBF42"], /* Hangul Syllable */
+ ["\uBF43", "\uBF43"], /* Hangul Syllable */
+ ["\uBF44", "\uBF44"], /* Hangul Syllable */
+ ["\uBF45", "\uBF45"], /* Hangul Syllable */
+ ["\uBF46", "\uBF46"], /* Hangul Syllable */
+ ["\uBF47", "\uBF47"], /* Hangul Syllable */
+ ["\uBF48", "\uBF48"], /* Hangul Syllable */
+ ["\uBF49", "\uBF49"], /* Hangul Syllable */
+ ["\uBF4A", "\uBF4A"], /* Hangul Syllable */
+ ["\uBF4B", "\uBF4B"], /* Hangul Syllable */
+ ["\uBF4C", "\uBF4C"], /* Hangul Syllable */
+ ["\uBF4D", "\uBF4D"], /* Hangul Syllable */
+ ["\uBF4E", "\uBF4E"], /* Hangul Syllable */
+ ["\uBF4F", "\uBF4F"], /* Hangul Syllable */
+ ["\uBF50", "\uBF50"], /* Hangul Syllable */
+ ["\uBF51", "\uBF51"], /* Hangul Syllable */
+ ["\uBF52", "\uBF52"], /* Hangul Syllable */
+ ["\uBF53", "\uBF53"], /* Hangul Syllable */
+ ["\uBF54", "\uBF54"], /* Hangul Syllable */
+ ["\uBF55", "\uBF55"], /* Hangul Syllable */
+ ["\uBF56", "\uBF56"], /* Hangul Syllable */
+ ["\uBF57", "\uBF57"], /* Hangul Syllable */
+ ["\uBF58", "\uBF58"], /* Hangul Syllable */
+ ["\uBF59", "\uBF59"], /* Hangul Syllable */
+ ["\uBF5A", "\uBF5A"], /* Hangul Syllable */
+ ["\uBF5B", "\uBF5B"], /* Hangul Syllable */
+ ["\uBF5C", "\uBF5C"], /* Hangul Syllable */
+ ["\uBF5D", "\uBF5D"], /* Hangul Syllable */
+ ["\uBF5E", "\uBF5E"], /* Hangul Syllable */
+ ["\uBF5F", "\uBF5F"], /* Hangul Syllable */
+ ["\uBF60", "\uBF60"], /* Hangul Syllable */
+ ["\uBF61", "\uBF61"], /* Hangul Syllable */
+ ["\uBF62", "\uBF62"], /* Hangul Syllable */
+ ["\uBF63", "\uBF63"], /* Hangul Syllable */
+ ["\uBF64", "\uBF64"], /* Hangul Syllable */
+ ["\uBF65", "\uBF65"], /* Hangul Syllable */
+ ["\uBF66", "\uBF66"], /* Hangul Syllable */
+ ["\uBF67", "\uBF67"], /* Hangul Syllable */
+ ["\uBF68", "\uBF68"], /* Hangul Syllable */
+ ["\uBF69", "\uBF69"], /* Hangul Syllable */
+ ["\uBF6A", "\uBF6A"], /* Hangul Syllable */
+ ["\uBF6B", "\uBF6B"], /* Hangul Syllable */
+ ["\uBF6C", "\uBF6C"], /* Hangul Syllable */
+ ["\uBF6D", "\uBF6D"], /* Hangul Syllable */
+ ["\uBF6E", "\uBF6E"], /* Hangul Syllable */
+ ["\uBF6F", "\uBF6F"], /* Hangul Syllable */
+ ["\uBF70", "\uBF70"], /* Hangul Syllable */
+ ["\uBF71", "\uBF71"], /* Hangul Syllable */
+ ["\uBF72", "\uBF72"], /* Hangul Syllable */
+ ["\uBF73", "\uBF73"], /* Hangul Syllable */
+ ["\uBF74", "\uBF74"], /* Hangul Syllable */
+ ["\uBF75", "\uBF75"], /* Hangul Syllable */
+ ["\uBF76", "\uBF76"], /* Hangul Syllable */
+ ["\uBF77", "\uBF77"], /* Hangul Syllable */
+ ["\uBF78", "\uBF78"], /* Hangul Syllable */
+ ["\uBF79", "\uBF79"], /* Hangul Syllable */
+ ["\uBF7A", "\uBF7A"], /* Hangul Syllable */
+ ["\uBF7B", "\uBF7B"], /* Hangul Syllable */
+ ["\uBF7C", "\uBF7C"], /* Hangul Syllable */
+ ["\uBF7D", "\uBF7D"], /* Hangul Syllable */
+ ["\uBF7E", "\uBF7E"], /* Hangul Syllable */
+ ["\uBF7F", "\uBF7F"], /* Hangul Syllable */
+ ["\uBF80", "\uBF80"], /* Hangul Syllable */
+ ["\uBF81", "\uBF81"], /* Hangul Syllable */
+ ["\uBF82", "\uBF82"], /* Hangul Syllable */
+ ["\uBF83", "\uBF83"], /* Hangul Syllable */
+ ["\uBF84", "\uBF84"], /* Hangul Syllable */
+ ["\uBF85", "\uBF85"], /* Hangul Syllable */
+ ["\uBF86", "\uBF86"], /* Hangul Syllable */
+ ["\uBF87", "\uBF87"], /* Hangul Syllable */
+ ["\uBF88", "\uBF88"], /* Hangul Syllable */
+ ["\uBF89", "\uBF89"], /* Hangul Syllable */
+ ["\uBF8A", "\uBF8A"], /* Hangul Syllable */
+ ["\uBF8B", "\uBF8B"], /* Hangul Syllable */
+ ["\uBF8C", "\uBF8C"], /* Hangul Syllable */
+ ["\uBF8D", "\uBF8D"], /* Hangul Syllable */
+ ["\uBF8E", "\uBF8E"], /* Hangul Syllable */
+ ["\uBF8F", "\uBF8F"], /* Hangul Syllable */
+ ["\uBF90", "\uBF90"], /* Hangul Syllable */
+ ["\uBF91", "\uBF91"], /* Hangul Syllable */
+ ["\uBF92", "\uBF92"], /* Hangul Syllable */
+ ["\uBF93", "\uBF93"], /* Hangul Syllable */
+ ["\uBF94", "\uBF94"], /* Hangul Syllable */
+ ["\uBF95", "\uBF95"], /* Hangul Syllable */
+ ["\uBF96", "\uBF96"], /* Hangul Syllable */
+ ["\uBF97", "\uBF97"], /* Hangul Syllable */
+ ["\uBF98", "\uBF98"], /* Hangul Syllable */
+ ["\uBF99", "\uBF99"], /* Hangul Syllable */
+ ["\uBF9A", "\uBF9A"], /* Hangul Syllable */
+ ["\uBF9B", "\uBF9B"], /* Hangul Syllable */
+ ["\uBF9C", "\uBF9C"], /* Hangul Syllable */
+ ["\uBF9D", "\uBF9D"], /* Hangul Syllable */
+ ["\uBF9E", "\uBF9E"], /* Hangul Syllable */
+ ["\uBF9F", "\uBF9F"], /* Hangul Syllable */
+ ["\uBFA0", "\uBFA0"], /* Hangul Syllable */
+ ["\uBFA1", "\uBFA1"], /* Hangul Syllable */
+ ["\uBFA2", "\uBFA2"], /* Hangul Syllable */
+ ["\uBFA3", "\uBFA3"], /* Hangul Syllable */
+ ["\uBFA4", "\uBFA4"], /* Hangul Syllable */
+ ["\uBFA5", "\uBFA5"], /* Hangul Syllable */
+ ["\uBFA6", "\uBFA6"], /* Hangul Syllable */
+ ["\uBFA7", "\uBFA7"], /* Hangul Syllable */
+ ["\uBFA8", "\uBFA8"], /* Hangul Syllable */
+ ["\uBFA9", "\uBFA9"], /* Hangul Syllable */
+ ["\uBFAA", "\uBFAA"], /* Hangul Syllable */
+ ["\uBFAB", "\uBFAB"], /* Hangul Syllable */
+ ["\uBFAC", "\uBFAC"], /* Hangul Syllable */
+ ["\uBFAD", "\uBFAD"], /* Hangul Syllable */
+ ["\uBFAE", "\uBFAE"], /* Hangul Syllable */
+ ["\uBFAF", "\uBFAF"], /* Hangul Syllable */
+ ["\uBFB0", "\uBFB0"], /* Hangul Syllable */
+ ["\uBFB1", "\uBFB1"], /* Hangul Syllable */
+ ["\uBFB2", "\uBFB2"], /* Hangul Syllable */
+ ["\uBFB3", "\uBFB3"], /* Hangul Syllable */
+ ["\uBFB4", "\uBFB4"], /* Hangul Syllable */
+ ["\uBFB5", "\uBFB5"], /* Hangul Syllable */
+ ["\uBFB6", "\uBFB6"], /* Hangul Syllable */
+ ["\uBFB7", "\uBFB7"], /* Hangul Syllable */
+ ["\uBFB8", "\uBFB8"], /* Hangul Syllable */
+ ["\uBFB9", "\uBFB9"], /* Hangul Syllable */
+ ["\uBFBA", "\uBFBA"], /* Hangul Syllable */
+ ["\uBFBB", "\uBFBB"], /* Hangul Syllable */
+ ["\uBFBC", "\uBFBC"], /* Hangul Syllable */
+ ["\uBFBD", "\uBFBD"], /* Hangul Syllable */
+ ["\uBFBE", "\uBFBE"], /* Hangul Syllable */
+ ["\uBFBF", "\uBFBF"], /* Hangul Syllable */
+ ["\uBFC0", "\uBFC0"], /* Hangul Syllable */
+ ["\uBFC1", "\uBFC1"], /* Hangul Syllable */
+ ["\uBFC2", "\uBFC2"], /* Hangul Syllable */
+ ["\uBFC3", "\uBFC3"], /* Hangul Syllable */
+ ["\uBFC4", "\uBFC4"], /* Hangul Syllable */
+ ["\uBFC5", "\uBFC5"], /* Hangul Syllable */
+ ["\uBFC6", "\uBFC6"], /* Hangul Syllable */
+ ["\uBFC7", "\uBFC7"], /* Hangul Syllable */
+ ["\uBFC8", "\uBFC8"], /* Hangul Syllable */
+ ["\uBFC9", "\uBFC9"], /* Hangul Syllable */
+ ["\uBFCA", "\uBFCA"], /* Hangul Syllable */
+ ["\uBFCB", "\uBFCB"], /* Hangul Syllable */
+ ["\uBFCC", "\uBFCC"], /* Hangul Syllable */
+ ["\uBFCD", "\uBFCD"], /* Hangul Syllable */
+ ["\uBFCE", "\uBFCE"], /* Hangul Syllable */
+ ["\uBFCF", "\uBFCF"], /* Hangul Syllable */
+ ["\uBFD0", "\uBFD0"], /* Hangul Syllable */
+ ["\uBFD1", "\uBFD1"], /* Hangul Syllable */
+ ["\uBFD2", "\uBFD2"], /* Hangul Syllable */
+ ["\uBFD3", "\uBFD3"], /* Hangul Syllable */
+ ["\uBFD4", "\uBFD4"], /* Hangul Syllable */
+ ["\uBFD5", "\uBFD5"], /* Hangul Syllable */
+ ["\uBFD6", "\uBFD6"], /* Hangul Syllable */
+ ["\uBFD7", "\uBFD7"], /* Hangul Syllable */
+ ["\uBFD8", "\uBFD8"], /* Hangul Syllable */
+ ["\uBFD9", "\uBFD9"], /* Hangul Syllable */
+ ["\uBFDA", "\uBFDA"], /* Hangul Syllable */
+ ["\uBFDB", "\uBFDB"], /* Hangul Syllable */
+ ["\uBFDC", "\uBFDC"], /* Hangul Syllable */
+ ["\uBFDD", "\uBFDD"], /* Hangul Syllable */
+ ["\uBFDE", "\uBFDE"], /* Hangul Syllable */
+ ["\uBFDF", "\uBFDF"], /* Hangul Syllable */
+ ["\uBFE0", "\uBFE0"], /* Hangul Syllable */
+ ["\uBFE1", "\uBFE1"], /* Hangul Syllable */
+ ["\uBFE2", "\uBFE2"], /* Hangul Syllable */
+ ["\uBFE3", "\uBFE3"], /* Hangul Syllable */
+ ["\uBFE4", "\uBFE4"], /* Hangul Syllable */
+ ["\uBFE5", "\uBFE5"], /* Hangul Syllable */
+ ["\uBFE6", "\uBFE6"], /* Hangul Syllable */
+ ["\uBFE7", "\uBFE7"], /* Hangul Syllable */
+ ["\uBFE8", "\uBFE8"], /* Hangul Syllable */
+ ["\uBFE9", "\uBFE9"], /* Hangul Syllable */
+ ["\uBFEA", "\uBFEA"], /* Hangul Syllable */
+ ["\uBFEB", "\uBFEB"], /* Hangul Syllable */
+ ["\uBFEC", "\uBFEC"], /* Hangul Syllable */
+ ["\uBFED", "\uBFED"], /* Hangul Syllable */
+ ["\uBFEE", "\uBFEE"], /* Hangul Syllable */
+ ["\uBFEF", "\uBFEF"], /* Hangul Syllable */
+ ["\uBFF0", "\uBFF0"], /* Hangul Syllable */
+ ["\uBFF1", "\uBFF1"], /* Hangul Syllable */
+ ["\uBFF2", "\uBFF2"], /* Hangul Syllable */
+ ["\uBFF3", "\uBFF3"], /* Hangul Syllable */
+ ["\uBFF4", "\uBFF4"], /* Hangul Syllable */
+ ["\uBFF5", "\uBFF5"], /* Hangul Syllable */
+ ["\uBFF6", "\uBFF6"], /* Hangul Syllable */
+ ["\uBFF7", "\uBFF7"], /* Hangul Syllable */
+ ["\uBFF8", "\uBFF8"], /* Hangul Syllable */
+ ["\uBFF9", "\uBFF9"], /* Hangul Syllable */
+ ["\uBFFA", "\uBFFA"], /* Hangul Syllable */
+ ["\uBFFB", "\uBFFB"], /* Hangul Syllable */
+ ["\uBFFC", "\uBFFC"], /* Hangul Syllable */
+ ["\uBFFD", "\uBFFD"], /* Hangul Syllable */
+ ["\uBFFE", "\uBFFE"], /* Hangul Syllable */
+ ["\uBFFF", "\uBFFF"], /* Hangul Syllable */
+ ["\uC000", "\uC000"], /* Hangul Syllable */
+ ["\uC001", "\uC001"], /* Hangul Syllable */
+ ["\uC002", "\uC002"], /* Hangul Syllable */
+ ["\uC003", "\uC003"], /* Hangul Syllable */
+ ["\uC004", "\uC004"], /* Hangul Syllable */
+ ["\uC005", "\uC005"], /* Hangul Syllable */
+ ["\uC006", "\uC006"], /* Hangul Syllable */
+ ["\uC007", "\uC007"], /* Hangul Syllable */
+ ["\uC008", "\uC008"], /* Hangul Syllable */
+ ["\uC009", "\uC009"], /* Hangul Syllable */
+ ["\uC00A", "\uC00A"], /* Hangul Syllable */
+ ["\uC00B", "\uC00B"], /* Hangul Syllable */
+ ["\uC00C", "\uC00C"], /* Hangul Syllable */
+ ["\uC00D", "\uC00D"], /* Hangul Syllable */
+ ["\uC00E", "\uC00E"], /* Hangul Syllable */
+ ["\uC00F", "\uC00F"], /* Hangul Syllable */
+ ["\uC010", "\uC010"], /* Hangul Syllable */
+ ["\uC011", "\uC011"], /* Hangul Syllable */
+ ["\uC012", "\uC012"], /* Hangul Syllable */
+ ["\uC013", "\uC013"], /* Hangul Syllable */
+ ["\uC014", "\uC014"], /* Hangul Syllable */
+ ["\uC015", "\uC015"], /* Hangul Syllable */
+ ["\uC016", "\uC016"], /* Hangul Syllable */
+ ["\uC017", "\uC017"], /* Hangul Syllable */
+ ["\uC018", "\uC018"], /* Hangul Syllable */
+ ["\uC019", "\uC019"], /* Hangul Syllable */
+ ["\uC01A", "\uC01A"], /* Hangul Syllable */
+ ["\uC01B", "\uC01B"], /* Hangul Syllable */
+ ["\uC01C", "\uC01C"], /* Hangul Syllable */
+ ["\uC01D", "\uC01D"], /* Hangul Syllable */
+ ["\uC01E", "\uC01E"], /* Hangul Syllable */
+ ["\uC01F", "\uC01F"], /* Hangul Syllable */
+ ["\uC020", "\uC020"], /* Hangul Syllable */
+ ["\uC021", "\uC021"], /* Hangul Syllable */
+ ["\uC022", "\uC022"], /* Hangul Syllable */
+ ["\uC023", "\uC023"], /* Hangul Syllable */
+ ["\uC024", "\uC024"], /* Hangul Syllable */
+ ["\uC025", "\uC025"], /* Hangul Syllable */
+ ["\uC026", "\uC026"], /* Hangul Syllable */
+ ["\uC027", "\uC027"], /* Hangul Syllable */
+ ["\uC028", "\uC028"], /* Hangul Syllable */
+ ["\uC029", "\uC029"], /* Hangul Syllable */
+ ["\uC02A", "\uC02A"], /* Hangul Syllable */
+ ["\uC02B", "\uC02B"], /* Hangul Syllable */
+ ["\uC02C", "\uC02C"], /* Hangul Syllable */
+ ["\uC02D", "\uC02D"], /* Hangul Syllable */
+ ["\uC02E", "\uC02E"], /* Hangul Syllable */
+ ["\uC02F", "\uC02F"], /* Hangul Syllable */
+ ["\uC030", "\uC030"], /* Hangul Syllable */
+ ["\uC031", "\uC031"], /* Hangul Syllable */
+ ["\uC032", "\uC032"], /* Hangul Syllable */
+ ["\uC033", "\uC033"], /* Hangul Syllable */
+ ["\uC034", "\uC034"], /* Hangul Syllable */
+ ["\uC035", "\uC035"], /* Hangul Syllable */
+ ["\uC036", "\uC036"], /* Hangul Syllable */
+ ["\uC037", "\uC037"], /* Hangul Syllable */
+ ["\uC038", "\uC038"], /* Hangul Syllable */
+ ["\uC039", "\uC039"], /* Hangul Syllable */
+ ["\uC03A", "\uC03A"], /* Hangul Syllable */
+ ["\uC03B", "\uC03B"], /* Hangul Syllable */
+ ["\uC03C", "\uC03C"], /* Hangul Syllable */
+ ["\uC03D", "\uC03D"], /* Hangul Syllable */
+ ["\uC03E", "\uC03E"], /* Hangul Syllable */
+ ["\uC03F", "\uC03F"], /* Hangul Syllable */
+ ["\uC040", "\uC040"], /* Hangul Syllable */
+ ["\uC041", "\uC041"], /* Hangul Syllable */
+ ["\uC042", "\uC042"], /* Hangul Syllable */
+ ["\uC043", "\uC043"], /* Hangul Syllable */
+ ["\uC044", "\uC044"], /* Hangul Syllable */
+ ["\uC045", "\uC045"], /* Hangul Syllable */
+ ["\uC046", "\uC046"], /* Hangul Syllable */
+ ["\uC047", "\uC047"], /* Hangul Syllable */
+ ["\uC048", "\uC048"], /* Hangul Syllable */
+ ["\uC049", "\uC049"], /* Hangul Syllable */
+ ["\uC04A", "\uC04A"], /* Hangul Syllable */
+ ["\uC04B", "\uC04B"], /* Hangul Syllable */
+ ["\uC04C", "\uC04C"], /* Hangul Syllable */
+ ["\uC04D", "\uC04D"], /* Hangul Syllable */
+ ["\uC04E", "\uC04E"], /* Hangul Syllable */
+ ["\uC04F", "\uC04F"], /* Hangul Syllable */
+ ["\uC050", "\uC050"], /* Hangul Syllable */
+ ["\uC051", "\uC051"], /* Hangul Syllable */
+ ["\uC052", "\uC052"], /* Hangul Syllable */
+ ["\uC053", "\uC053"], /* Hangul Syllable */
+ ["\uC054", "\uC054"], /* Hangul Syllable */
+ ["\uC055", "\uC055"], /* Hangul Syllable */
+ ["\uC056", "\uC056"], /* Hangul Syllable */
+ ["\uC057", "\uC057"], /* Hangul Syllable */
+ ["\uC058", "\uC058"], /* Hangul Syllable */
+ ["\uC059", "\uC059"], /* Hangul Syllable */
+ ["\uC05A", "\uC05A"], /* Hangul Syllable */
+ ["\uC05B", "\uC05B"], /* Hangul Syllable */
+ ["\uC05C", "\uC05C"], /* Hangul Syllable */
+ ["\uC05D", "\uC05D"], /* Hangul Syllable */
+ ["\uC05E", "\uC05E"], /* Hangul Syllable */
+ ["\uC05F", "\uC05F"], /* Hangul Syllable */
+ ["\uC060", "\uC060"], /* Hangul Syllable */
+ ["\uC061", "\uC061"], /* Hangul Syllable */
+ ["\uC062", "\uC062"], /* Hangul Syllable */
+ ["\uC063", "\uC063"], /* Hangul Syllable */
+ ["\uC064", "\uC064"], /* Hangul Syllable */
+ ["\uC065", "\uC065"], /* Hangul Syllable */
+ ["\uC066", "\uC066"], /* Hangul Syllable */
+ ["\uC067", "\uC067"], /* Hangul Syllable */
+ ["\uC068", "\uC068"], /* Hangul Syllable */
+ ["\uC069", "\uC069"], /* Hangul Syllable */
+ ["\uC06A", "\uC06A"], /* Hangul Syllable */
+ ["\uC06B", "\uC06B"], /* Hangul Syllable */
+ ["\uC06C", "\uC06C"], /* Hangul Syllable */
+ ["\uC06D", "\uC06D"], /* Hangul Syllable */
+ ["\uC06E", "\uC06E"], /* Hangul Syllable */
+ ["\uC06F", "\uC06F"], /* Hangul Syllable */
+ ["\uC070", "\uC070"], /* Hangul Syllable */
+ ["\uC071", "\uC071"], /* Hangul Syllable */
+ ["\uC072", "\uC072"], /* Hangul Syllable */
+ ["\uC073", "\uC073"], /* Hangul Syllable */
+ ["\uC074", "\uC074"], /* Hangul Syllable */
+ ["\uC075", "\uC075"], /* Hangul Syllable */
+ ["\uC076", "\uC076"], /* Hangul Syllable */
+ ["\uC077", "\uC077"], /* Hangul Syllable */
+ ["\uC078", "\uC078"], /* Hangul Syllable */
+ ["\uC079", "\uC079"], /* Hangul Syllable */
+ ["\uC07A", "\uC07A"], /* Hangul Syllable */
+ ["\uC07B", "\uC07B"], /* Hangul Syllable */
+ ["\uC07C", "\uC07C"], /* Hangul Syllable */
+ ["\uC07D", "\uC07D"], /* Hangul Syllable */
+ ["\uC07E", "\uC07E"], /* Hangul Syllable */
+ ["\uC07F", "\uC07F"], /* Hangul Syllable */
+ ["\uC080", "\uC080"], /* Hangul Syllable */
+ ["\uC081", "\uC081"], /* Hangul Syllable */
+ ["\uC082", "\uC082"], /* Hangul Syllable */
+ ["\uC083", "\uC083"], /* Hangul Syllable */
+ ["\uC084", "\uC084"], /* Hangul Syllable */
+ ["\uC085", "\uC085"], /* Hangul Syllable */
+ ["\uC086", "\uC086"], /* Hangul Syllable */
+ ["\uC087", "\uC087"], /* Hangul Syllable */
+ ["\uC088", "\uC088"], /* Hangul Syllable */
+ ["\uC089", "\uC089"], /* Hangul Syllable */
+ ["\uC08A", "\uC08A"], /* Hangul Syllable */
+ ["\uC08B", "\uC08B"], /* Hangul Syllable */
+ ["\uC08C", "\uC08C"], /* Hangul Syllable */
+ ["\uC08D", "\uC08D"], /* Hangul Syllable */
+ ["\uC08E", "\uC08E"], /* Hangul Syllable */
+ ["\uC08F", "\uC08F"], /* Hangul Syllable */
+ ["\uC090", "\uC090"], /* Hangul Syllable */
+ ["\uC091", "\uC091"], /* Hangul Syllable */
+ ["\uC092", "\uC092"], /* Hangul Syllable */
+ ["\uC093", "\uC093"], /* Hangul Syllable */
+ ["\uC094", "\uC094"], /* Hangul Syllable */
+ ["\uC095", "\uC095"], /* Hangul Syllable */
+ ["\uC096", "\uC096"], /* Hangul Syllable */
+ ["\uC097", "\uC097"], /* Hangul Syllable */
+ ["\uC098", "\uC098"], /* Hangul Syllable */
+ ["\uC099", "\uC099"], /* Hangul Syllable */
+ ["\uC09A", "\uC09A"], /* Hangul Syllable */
+ ["\uC09B", "\uC09B"], /* Hangul Syllable */
+ ["\uC09C", "\uC09C"], /* Hangul Syllable */
+ ["\uC09D", "\uC09D"], /* Hangul Syllable */
+ ["\uC09E", "\uC09E"], /* Hangul Syllable */
+ ["\uC09F", "\uC09F"], /* Hangul Syllable */
+ ["\uC0A0", "\uC0A0"], /* Hangul Syllable */
+ ["\uC0A1", "\uC0A1"], /* Hangul Syllable */
+ ["\uC0A2", "\uC0A2"], /* Hangul Syllable */
+ ["\uC0A3", "\uC0A3"], /* Hangul Syllable */
+ ["\uC0A4", "\uC0A4"], /* Hangul Syllable */
+ ["\uC0A5", "\uC0A5"], /* Hangul Syllable */
+ ["\uC0A6", "\uC0A6"], /* Hangul Syllable */
+ ["\uC0A7", "\uC0A7"], /* Hangul Syllable */
+ ["\uC0A8", "\uC0A8"], /* Hangul Syllable */
+ ["\uC0A9", "\uC0A9"], /* Hangul Syllable */
+ ["\uC0AA", "\uC0AA"], /* Hangul Syllable */
+ ["\uC0AB", "\uC0AB"], /* Hangul Syllable */
+ ["\uC0AC", "\uC0AC"], /* Hangul Syllable */
+ ["\uC0AD", "\uC0AD"], /* Hangul Syllable */
+ ["\uC0AE", "\uC0AE"], /* Hangul Syllable */
+ ["\uC0AF", "\uC0AF"], /* Hangul Syllable */
+ ["\uC0B0", "\uC0B0"], /* Hangul Syllable */
+ ["\uC0B1", "\uC0B1"], /* Hangul Syllable */
+ ["\uC0B2", "\uC0B2"], /* Hangul Syllable */
+ ["\uC0B3", "\uC0B3"], /* Hangul Syllable */
+ ["\uC0B4", "\uC0B4"], /* Hangul Syllable */
+ ["\uC0B5", "\uC0B5"], /* Hangul Syllable */
+ ["\uC0B6", "\uC0B6"], /* Hangul Syllable */
+ ["\uC0B7", "\uC0B7"], /* Hangul Syllable */
+ ["\uC0B8", "\uC0B8"], /* Hangul Syllable */
+ ["\uC0B9", "\uC0B9"], /* Hangul Syllable */
+ ["\uC0BA", "\uC0BA"], /* Hangul Syllable */
+ ["\uC0BB", "\uC0BB"], /* Hangul Syllable */
+ ["\uC0BC", "\uC0BC"], /* Hangul Syllable */
+ ["\uC0BD", "\uC0BD"], /* Hangul Syllable */
+ ["\uC0BE", "\uC0BE"], /* Hangul Syllable */
+ ["\uC0BF", "\uC0BF"], /* Hangul Syllable */
+ ["\uC0C0", "\uC0C0"], /* Hangul Syllable */
+ ["\uC0C1", "\uC0C1"], /* Hangul Syllable */
+ ["\uC0C2", "\uC0C2"], /* Hangul Syllable */
+ ["\uC0C3", "\uC0C3"], /* Hangul Syllable */
+ ["\uC0C4", "\uC0C4"], /* Hangul Syllable */
+ ["\uC0C5", "\uC0C5"], /* Hangul Syllable */
+ ["\uC0C6", "\uC0C6"], /* Hangul Syllable */
+ ["\uC0C7", "\uC0C7"], /* Hangul Syllable */
+ ["\uC0C8", "\uC0C8"], /* Hangul Syllable */
+ ["\uC0C9", "\uC0C9"], /* Hangul Syllable */
+ ["\uC0CA", "\uC0CA"], /* Hangul Syllable */
+ ["\uC0CB", "\uC0CB"], /* Hangul Syllable */
+ ["\uC0CC", "\uC0CC"], /* Hangul Syllable */
+ ["\uC0CD", "\uC0CD"], /* Hangul Syllable */
+ ["\uC0CE", "\uC0CE"], /* Hangul Syllable */
+ ["\uC0CF", "\uC0CF"], /* Hangul Syllable */
+ ["\uC0D0", "\uC0D0"], /* Hangul Syllable */
+ ["\uC0D1", "\uC0D1"], /* Hangul Syllable */
+ ["\uC0D2", "\uC0D2"], /* Hangul Syllable */
+ ["\uC0D3", "\uC0D3"], /* Hangul Syllable */
+ ["\uC0D4", "\uC0D4"], /* Hangul Syllable */
+ ["\uC0D5", "\uC0D5"], /* Hangul Syllable */
+ ["\uC0D6", "\uC0D6"], /* Hangul Syllable */
+ ["\uC0D7", "\uC0D7"], /* Hangul Syllable */
+ ["\uC0D8", "\uC0D8"], /* Hangul Syllable */
+ ["\uC0D9", "\uC0D9"], /* Hangul Syllable */
+ ["\uC0DA", "\uC0DA"], /* Hangul Syllable */
+ ["\uC0DB", "\uC0DB"], /* Hangul Syllable */
+ ["\uC0DC", "\uC0DC"], /* Hangul Syllable */
+ ["\uC0DD", "\uC0DD"], /* Hangul Syllable */
+ ["\uC0DE", "\uC0DE"], /* Hangul Syllable */
+ ["\uC0DF", "\uC0DF"], /* Hangul Syllable */
+ ["\uC0E0", "\uC0E0"], /* Hangul Syllable */
+ ["\uC0E1", "\uC0E1"], /* Hangul Syllable */
+ ["\uC0E2", "\uC0E2"], /* Hangul Syllable */
+ ["\uC0E3", "\uC0E3"], /* Hangul Syllable */
+ ["\uC0E4", "\uC0E4"], /* Hangul Syllable */
+ ["\uC0E5", "\uC0E5"], /* Hangul Syllable */
+ ["\uC0E6", "\uC0E6"], /* Hangul Syllable */
+ ["\uC0E7", "\uC0E7"], /* Hangul Syllable */
+ ["\uC0E8", "\uC0E8"], /* Hangul Syllable */
+ ["\uC0E9", "\uC0E9"], /* Hangul Syllable */
+ ["\uC0EA", "\uC0EA"], /* Hangul Syllable */
+ ["\uC0EB", "\uC0EB"], /* Hangul Syllable */
+ ["\uC0EC", "\uC0EC"], /* Hangul Syllable */
+ ["\uC0ED", "\uC0ED"], /* Hangul Syllable */
+ ["\uC0EE", "\uC0EE"], /* Hangul Syllable */
+ ["\uC0EF", "\uC0EF"], /* Hangul Syllable */
+ ["\uC0F0", "\uC0F0"], /* Hangul Syllable */
+ ["\uC0F1", "\uC0F1"], /* Hangul Syllable */
+ ["\uC0F2", "\uC0F2"], /* Hangul Syllable */
+ ["\uC0F3", "\uC0F3"], /* Hangul Syllable */
+ ["\uC0F4", "\uC0F4"], /* Hangul Syllable */
+ ["\uC0F5", "\uC0F5"], /* Hangul Syllable */
+ ["\uC0F6", "\uC0F6"], /* Hangul Syllable */
+ ["\uC0F7", "\uC0F7"], /* Hangul Syllable */
+ ["\uC0F8", "\uC0F8"], /* Hangul Syllable */
+ ["\uC0F9", "\uC0F9"], /* Hangul Syllable */
+ ["\uC0FA", "\uC0FA"], /* Hangul Syllable */
+ ["\uC0FB", "\uC0FB"], /* Hangul Syllable */
+ ["\uC0FC", "\uC0FC"], /* Hangul Syllable */
+ ["\uC0FD", "\uC0FD"], /* Hangul Syllable */
+ ["\uC0FE", "\uC0FE"], /* Hangul Syllable */
+ ["\uC0FF", "\uC0FF"], /* Hangul Syllable */
+ ["\uC100", "\uC100"], /* Hangul Syllable */
+ ["\uC101", "\uC101"], /* Hangul Syllable */
+ ["\uC102", "\uC102"], /* Hangul Syllable */
+ ["\uC103", "\uC103"], /* Hangul Syllable */
+ ["\uC104", "\uC104"], /* Hangul Syllable */
+ ["\uC105", "\uC105"], /* Hangul Syllable */
+ ["\uC106", "\uC106"], /* Hangul Syllable */
+ ["\uC107", "\uC107"], /* Hangul Syllable */
+ ["\uC108", "\uC108"], /* Hangul Syllable */
+ ["\uC109", "\uC109"], /* Hangul Syllable */
+ ["\uC10A", "\uC10A"], /* Hangul Syllable */
+ ["\uC10B", "\uC10B"], /* Hangul Syllable */
+ ["\uC10C", "\uC10C"], /* Hangul Syllable */
+ ["\uC10D", "\uC10D"], /* Hangul Syllable */
+ ["\uC10E", "\uC10E"], /* Hangul Syllable */
+ ["\uC10F", "\uC10F"], /* Hangul Syllable */
+ ["\uC110", "\uC110"], /* Hangul Syllable */
+ ["\uC111", "\uC111"], /* Hangul Syllable */
+ ["\uC112", "\uC112"], /* Hangul Syllable */
+ ["\uC113", "\uC113"], /* Hangul Syllable */
+ ["\uC114", "\uC114"], /* Hangul Syllable */
+ ["\uC115", "\uC115"], /* Hangul Syllable */
+ ["\uC116", "\uC116"], /* Hangul Syllable */
+ ["\uC117", "\uC117"], /* Hangul Syllable */
+ ["\uC118", "\uC118"], /* Hangul Syllable */
+ ["\uC119", "\uC119"], /* Hangul Syllable */
+ ["\uC11A", "\uC11A"], /* Hangul Syllable */
+ ["\uC11B", "\uC11B"], /* Hangul Syllable */
+ ["\uC11C", "\uC11C"], /* Hangul Syllable */
+ ["\uC11D", "\uC11D"], /* Hangul Syllable */
+ ["\uC11E", "\uC11E"], /* Hangul Syllable */
+ ["\uC11F", "\uC11F"], /* Hangul Syllable */
+ ["\uC120", "\uC120"], /* Hangul Syllable */
+ ["\uC121", "\uC121"], /* Hangul Syllable */
+ ["\uC122", "\uC122"], /* Hangul Syllable */
+ ["\uC123", "\uC123"], /* Hangul Syllable */
+ ["\uC124", "\uC124"], /* Hangul Syllable */
+ ["\uC125", "\uC125"], /* Hangul Syllable */
+ ["\uC126", "\uC126"], /* Hangul Syllable */
+ ["\uC127", "\uC127"], /* Hangul Syllable */
+ ["\uC128", "\uC128"], /* Hangul Syllable */
+ ["\uC129", "\uC129"], /* Hangul Syllable */
+ ["\uC12A", "\uC12A"], /* Hangul Syllable */
+ ["\uC12B", "\uC12B"], /* Hangul Syllable */
+ ["\uC12C", "\uC12C"], /* Hangul Syllable */
+ ["\uC12D", "\uC12D"], /* Hangul Syllable */
+ ["\uC12E", "\uC12E"], /* Hangul Syllable */
+ ["\uC12F", "\uC12F"], /* Hangul Syllable */
+ ["\uC130", "\uC130"], /* Hangul Syllable */
+ ["\uC131", "\uC131"], /* Hangul Syllable */
+ ["\uC132", "\uC132"], /* Hangul Syllable */
+ ["\uC133", "\uC133"], /* Hangul Syllable */
+ ["\uC134", "\uC134"], /* Hangul Syllable */
+ ["\uC135", "\uC135"], /* Hangul Syllable */
+ ["\uC136", "\uC136"], /* Hangul Syllable */
+ ["\uC137", "\uC137"], /* Hangul Syllable */
+ ["\uC138", "\uC138"], /* Hangul Syllable */
+ ["\uC139", "\uC139"], /* Hangul Syllable */
+ ["\uC13A", "\uC13A"], /* Hangul Syllable */
+ ["\uC13B", "\uC13B"], /* Hangul Syllable */
+ ["\uC13C", "\uC13C"], /* Hangul Syllable */
+ ["\uC13D", "\uC13D"], /* Hangul Syllable */
+ ["\uC13E", "\uC13E"], /* Hangul Syllable */
+ ["\uC13F", "\uC13F"], /* Hangul Syllable */
+ ["\uC140", "\uC140"], /* Hangul Syllable */
+ ["\uC141", "\uC141"], /* Hangul Syllable */
+ ["\uC142", "\uC142"], /* Hangul Syllable */
+ ["\uC143", "\uC143"], /* Hangul Syllable */
+ ["\uC144", "\uC144"], /* Hangul Syllable */
+ ["\uC145", "\uC145"], /* Hangul Syllable */
+ ["\uC146", "\uC146"], /* Hangul Syllable */
+ ["\uC147", "\uC147"], /* Hangul Syllable */
+ ["\uC148", "\uC148"], /* Hangul Syllable */
+ ["\uC149", "\uC149"], /* Hangul Syllable */
+ ["\uC14A", "\uC14A"], /* Hangul Syllable */
+ ["\uC14B", "\uC14B"], /* Hangul Syllable */
+ ["\uC14C", "\uC14C"], /* Hangul Syllable */
+ ["\uC14D", "\uC14D"], /* Hangul Syllable */
+ ["\uC14E", "\uC14E"], /* Hangul Syllable */
+ ["\uC14F", "\uC14F"], /* Hangul Syllable */
+ ["\uC150", "\uC150"], /* Hangul Syllable */
+ ["\uC151", "\uC151"], /* Hangul Syllable */
+ ["\uC152", "\uC152"], /* Hangul Syllable */
+ ["\uC153", "\uC153"], /* Hangul Syllable */
+ ["\uC154", "\uC154"], /* Hangul Syllable */
+ ["\uC155", "\uC155"], /* Hangul Syllable */
+ ["\uC156", "\uC156"], /* Hangul Syllable */
+ ["\uC157", "\uC157"], /* Hangul Syllable */
+ ["\uC158", "\uC158"], /* Hangul Syllable */
+ ["\uC159", "\uC159"], /* Hangul Syllable */
+ ["\uC15A", "\uC15A"], /* Hangul Syllable */
+ ["\uC15B", "\uC15B"], /* Hangul Syllable */
+ ["\uC15C", "\uC15C"], /* Hangul Syllable */
+ ["\uC15D", "\uC15D"], /* Hangul Syllable */
+ ["\uC15E", "\uC15E"], /* Hangul Syllable */
+ ["\uC15F", "\uC15F"], /* Hangul Syllable */
+ ["\uC160", "\uC160"], /* Hangul Syllable */
+ ["\uC161", "\uC161"], /* Hangul Syllable */
+ ["\uC162", "\uC162"], /* Hangul Syllable */
+ ["\uC163", "\uC163"], /* Hangul Syllable */
+ ["\uC164", "\uC164"], /* Hangul Syllable */
+ ["\uC165", "\uC165"], /* Hangul Syllable */
+ ["\uC166", "\uC166"], /* Hangul Syllable */
+ ["\uC167", "\uC167"], /* Hangul Syllable */
+ ["\uC168", "\uC168"], /* Hangul Syllable */
+ ["\uC169", "\uC169"], /* Hangul Syllable */
+ ["\uC16A", "\uC16A"], /* Hangul Syllable */
+ ["\uC16B", "\uC16B"], /* Hangul Syllable */
+ ["\uC16C", "\uC16C"], /* Hangul Syllable */
+ ["\uC16D", "\uC16D"], /* Hangul Syllable */
+ ["\uC16E", "\uC16E"], /* Hangul Syllable */
+ ["\uC16F", "\uC16F"], /* Hangul Syllable */
+ ["\uC170", "\uC170"], /* Hangul Syllable */
+ ["\uC171", "\uC171"], /* Hangul Syllable */
+ ["\uC172", "\uC172"], /* Hangul Syllable */
+ ["\uC173", "\uC173"], /* Hangul Syllable */
+ ["\uC174", "\uC174"], /* Hangul Syllable */
+ ["\uC175", "\uC175"], /* Hangul Syllable */
+ ["\uC176", "\uC176"], /* Hangul Syllable */
+ ["\uC177", "\uC177"], /* Hangul Syllable */
+ ["\uC178", "\uC178"], /* Hangul Syllable */
+ ["\uC179", "\uC179"], /* Hangul Syllable */
+ ["\uC17A", "\uC17A"], /* Hangul Syllable */
+ ["\uC17B", "\uC17B"], /* Hangul Syllable */
+ ["\uC17C", "\uC17C"], /* Hangul Syllable */
+ ["\uC17D", "\uC17D"], /* Hangul Syllable */
+ ["\uC17E", "\uC17E"], /* Hangul Syllable */
+ ["\uC17F", "\uC17F"], /* Hangul Syllable */
+ ["\uC180", "\uC180"], /* Hangul Syllable */
+ ["\uC181", "\uC181"], /* Hangul Syllable */
+ ["\uC182", "\uC182"], /* Hangul Syllable */
+ ["\uC183", "\uC183"], /* Hangul Syllable */
+ ["\uC184", "\uC184"], /* Hangul Syllable */
+ ["\uC185", "\uC185"], /* Hangul Syllable */
+ ["\uC186", "\uC186"], /* Hangul Syllable */
+ ["\uC187", "\uC187"], /* Hangul Syllable */
+ ["\uC188", "\uC188"], /* Hangul Syllable */
+ ["\uC189", "\uC189"], /* Hangul Syllable */
+ ["\uC18A", "\uC18A"], /* Hangul Syllable */
+ ["\uC18B", "\uC18B"], /* Hangul Syllable */
+ ["\uC18C", "\uC18C"], /* Hangul Syllable */
+ ["\uC18D", "\uC18D"], /* Hangul Syllable */
+ ["\uC18E", "\uC18E"], /* Hangul Syllable */
+ ["\uC18F", "\uC18F"], /* Hangul Syllable */
+ ["\uC190", "\uC190"], /* Hangul Syllable */
+ ["\uC191", "\uC191"], /* Hangul Syllable */
+ ["\uC192", "\uC192"], /* Hangul Syllable */
+ ["\uC193", "\uC193"], /* Hangul Syllable */
+ ["\uC194", "\uC194"], /* Hangul Syllable */
+ ["\uC195", "\uC195"], /* Hangul Syllable */
+ ["\uC196", "\uC196"], /* Hangul Syllable */
+ ["\uC197", "\uC197"], /* Hangul Syllable */
+ ["\uC198", "\uC198"], /* Hangul Syllable */
+ ["\uC199", "\uC199"], /* Hangul Syllable */
+ ["\uC19A", "\uC19A"], /* Hangul Syllable */
+ ["\uC19B", "\uC19B"], /* Hangul Syllable */
+ ["\uC19C", "\uC19C"], /* Hangul Syllable */
+ ["\uC19D", "\uC19D"], /* Hangul Syllable */
+ ["\uC19E", "\uC19E"], /* Hangul Syllable */
+ ["\uC19F", "\uC19F"], /* Hangul Syllable */
+ ["\uC1A0", "\uC1A0"], /* Hangul Syllable */
+ ["\uC1A1", "\uC1A1"], /* Hangul Syllable */
+ ["\uC1A2", "\uC1A2"], /* Hangul Syllable */
+ ["\uC1A3", "\uC1A3"], /* Hangul Syllable */
+ ["\uC1A4", "\uC1A4"], /* Hangul Syllable */
+ ["\uC1A5", "\uC1A5"], /* Hangul Syllable */
+ ["\uC1A6", "\uC1A6"], /* Hangul Syllable */
+ ["\uC1A7", "\uC1A7"], /* Hangul Syllable */
+ ["\uC1A8", "\uC1A8"], /* Hangul Syllable */
+ ["\uC1A9", "\uC1A9"], /* Hangul Syllable */
+ ["\uC1AA", "\uC1AA"], /* Hangul Syllable */
+ ["\uC1AB", "\uC1AB"], /* Hangul Syllable */
+ ["\uC1AC", "\uC1AC"], /* Hangul Syllable */
+ ["\uC1AD", "\uC1AD"], /* Hangul Syllable */
+ ["\uC1AE", "\uC1AE"], /* Hangul Syllable */
+ ["\uC1AF", "\uC1AF"], /* Hangul Syllable */
+ ["\uC1B0", "\uC1B0"], /* Hangul Syllable */
+ ["\uC1B1", "\uC1B1"], /* Hangul Syllable */
+ ["\uC1B2", "\uC1B2"], /* Hangul Syllable */
+ ["\uC1B3", "\uC1B3"], /* Hangul Syllable */
+ ["\uC1B4", "\uC1B4"], /* Hangul Syllable */
+ ["\uC1B5", "\uC1B5"], /* Hangul Syllable */
+ ["\uC1B6", "\uC1B6"], /* Hangul Syllable */
+ ["\uC1B7", "\uC1B7"], /* Hangul Syllable */
+ ["\uC1B8", "\uC1B8"], /* Hangul Syllable */
+ ["\uC1B9", "\uC1B9"], /* Hangul Syllable */
+ ["\uC1BA", "\uC1BA"], /* Hangul Syllable */
+ ["\uC1BB", "\uC1BB"], /* Hangul Syllable */
+ ["\uC1BC", "\uC1BC"], /* Hangul Syllable */
+ ["\uC1BD", "\uC1BD"], /* Hangul Syllable */
+ ["\uC1BE", "\uC1BE"], /* Hangul Syllable */
+ ["\uC1BF", "\uC1BF"], /* Hangul Syllable */
+ ["\uC1C0", "\uC1C0"], /* Hangul Syllable */
+ ["\uC1C1", "\uC1C1"], /* Hangul Syllable */
+ ["\uC1C2", "\uC1C2"], /* Hangul Syllable */
+ ["\uC1C3", "\uC1C3"], /* Hangul Syllable */
+ ["\uC1C4", "\uC1C4"], /* Hangul Syllable */
+ ["\uC1C5", "\uC1C5"], /* Hangul Syllable */
+ ["\uC1C6", "\uC1C6"], /* Hangul Syllable */
+ ["\uC1C7", "\uC1C7"], /* Hangul Syllable */
+ ["\uC1C8", "\uC1C8"], /* Hangul Syllable */
+ ["\uC1C9", "\uC1C9"], /* Hangul Syllable */
+ ["\uC1CA", "\uC1CA"], /* Hangul Syllable */
+ ["\uC1CB", "\uC1CB"], /* Hangul Syllable */
+ ["\uC1CC", "\uC1CC"], /* Hangul Syllable */
+ ["\uC1CD", "\uC1CD"], /* Hangul Syllable */
+ ["\uC1CE", "\uC1CE"], /* Hangul Syllable */
+ ["\uC1CF", "\uC1CF"], /* Hangul Syllable */
+ ["\uC1D0", "\uC1D0"], /* Hangul Syllable */
+ ["\uC1D1", "\uC1D1"], /* Hangul Syllable */
+ ["\uC1D2", "\uC1D2"], /* Hangul Syllable */
+ ["\uC1D3", "\uC1D3"], /* Hangul Syllable */
+ ["\uC1D4", "\uC1D4"], /* Hangul Syllable */
+ ["\uC1D5", "\uC1D5"], /* Hangul Syllable */
+ ["\uC1D6", "\uC1D6"], /* Hangul Syllable */
+ ["\uC1D7", "\uC1D7"], /* Hangul Syllable */
+ ["\uC1D8", "\uC1D8"], /* Hangul Syllable */
+ ["\uC1D9", "\uC1D9"], /* Hangul Syllable */
+ ["\uC1DA", "\uC1DA"], /* Hangul Syllable */
+ ["\uC1DB", "\uC1DB"], /* Hangul Syllable */
+ ["\uC1DC", "\uC1DC"], /* Hangul Syllable */
+ ["\uC1DD", "\uC1DD"], /* Hangul Syllable */
+ ["\uC1DE", "\uC1DE"], /* Hangul Syllable */
+ ["\uC1DF", "\uC1DF"], /* Hangul Syllable */
+ ["\uC1E0", "\uC1E0"], /* Hangul Syllable */
+ ["\uC1E1", "\uC1E1"], /* Hangul Syllable */
+ ["\uC1E2", "\uC1E2"], /* Hangul Syllable */
+ ["\uC1E3", "\uC1E3"], /* Hangul Syllable */
+ ["\uC1E4", "\uC1E4"], /* Hangul Syllable */
+ ["\uC1E5", "\uC1E5"], /* Hangul Syllable */
+ ["\uC1E6", "\uC1E6"], /* Hangul Syllable */
+ ["\uC1E7", "\uC1E7"], /* Hangul Syllable */
+ ["\uC1E8", "\uC1E8"], /* Hangul Syllable */
+ ["\uC1E9", "\uC1E9"], /* Hangul Syllable */
+ ["\uC1EA", "\uC1EA"], /* Hangul Syllable */
+ ["\uC1EB", "\uC1EB"], /* Hangul Syllable */
+ ["\uC1EC", "\uC1EC"], /* Hangul Syllable */
+ ["\uC1ED", "\uC1ED"], /* Hangul Syllable */
+ ["\uC1EE", "\uC1EE"], /* Hangul Syllable */
+ ["\uC1EF", "\uC1EF"], /* Hangul Syllable */
+ ["\uC1F0", "\uC1F0"], /* Hangul Syllable */
+ ["\uC1F1", "\uC1F1"], /* Hangul Syllable */
+ ["\uC1F2", "\uC1F2"], /* Hangul Syllable */
+ ["\uC1F3", "\uC1F3"], /* Hangul Syllable */
+ ["\uC1F4", "\uC1F4"], /* Hangul Syllable */
+ ["\uC1F5", "\uC1F5"], /* Hangul Syllable */
+ ["\uC1F6", "\uC1F6"], /* Hangul Syllable */
+ ["\uC1F7", "\uC1F7"], /* Hangul Syllable */
+ ["\uC1F8", "\uC1F8"], /* Hangul Syllable */
+ ["\uC1F9", "\uC1F9"], /* Hangul Syllable */
+ ["\uC1FA", "\uC1FA"], /* Hangul Syllable */
+ ["\uC1FB", "\uC1FB"], /* Hangul Syllable */
+ ["\uC1FC", "\uC1FC"], /* Hangul Syllable */
+ ["\uC1FD", "\uC1FD"], /* Hangul Syllable */
+ ["\uC1FE", "\uC1FE"], /* Hangul Syllable */
+ ["\uC1FF", "\uC1FF"], /* Hangul Syllable */
+ ["\uC200", "\uC200"], /* Hangul Syllable */
+ ["\uC201", "\uC201"], /* Hangul Syllable */
+ ["\uC202", "\uC202"], /* Hangul Syllable */
+ ["\uC203", "\uC203"], /* Hangul Syllable */
+ ["\uC204", "\uC204"], /* Hangul Syllable */
+ ["\uC205", "\uC205"], /* Hangul Syllable */
+ ["\uC206", "\uC206"], /* Hangul Syllable */
+ ["\uC207", "\uC207"], /* Hangul Syllable */
+ ["\uC208", "\uC208"], /* Hangul Syllable */
+ ["\uC209", "\uC209"], /* Hangul Syllable */
+ ["\uC20A", "\uC20A"], /* Hangul Syllable */
+ ["\uC20B", "\uC20B"], /* Hangul Syllable */
+ ["\uC20C", "\uC20C"], /* Hangul Syllable */
+ ["\uC20D", "\uC20D"], /* Hangul Syllable */
+ ["\uC20E", "\uC20E"], /* Hangul Syllable */
+ ["\uC20F", "\uC20F"], /* Hangul Syllable */
+ ["\uC210", "\uC210"], /* Hangul Syllable */
+ ["\uC211", "\uC211"], /* Hangul Syllable */
+ ["\uC212", "\uC212"], /* Hangul Syllable */
+ ["\uC213", "\uC213"], /* Hangul Syllable */
+ ["\uC214", "\uC214"], /* Hangul Syllable */
+ ["\uC215", "\uC215"], /* Hangul Syllable */
+ ["\uC216", "\uC216"], /* Hangul Syllable */
+ ["\uC217", "\uC217"], /* Hangul Syllable */
+ ["\uC218", "\uC218"], /* Hangul Syllable */
+ ["\uC219", "\uC219"], /* Hangul Syllable */
+ ["\uC21A", "\uC21A"], /* Hangul Syllable */
+ ["\uC21B", "\uC21B"], /* Hangul Syllable */
+ ["\uC21C", "\uC21C"], /* Hangul Syllable */
+ ["\uC21D", "\uC21D"], /* Hangul Syllable */
+ ["\uC21E", "\uC21E"], /* Hangul Syllable */
+ ["\uC21F", "\uC21F"], /* Hangul Syllable */
+ ["\uC220", "\uC220"], /* Hangul Syllable */
+ ["\uC221", "\uC221"], /* Hangul Syllable */
+ ["\uC222", "\uC222"], /* Hangul Syllable */
+ ["\uC223", "\uC223"], /* Hangul Syllable */
+ ["\uC224", "\uC224"], /* Hangul Syllable */
+ ["\uC225", "\uC225"], /* Hangul Syllable */
+ ["\uC226", "\uC226"], /* Hangul Syllable */
+ ["\uC227", "\uC227"], /* Hangul Syllable */
+ ["\uC228", "\uC228"], /* Hangul Syllable */
+ ["\uC229", "\uC229"], /* Hangul Syllable */
+ ["\uC22A", "\uC22A"], /* Hangul Syllable */
+ ["\uC22B", "\uC22B"], /* Hangul Syllable */
+ ["\uC22C", "\uC22C"], /* Hangul Syllable */
+ ["\uC22D", "\uC22D"], /* Hangul Syllable */
+ ["\uC22E", "\uC22E"], /* Hangul Syllable */
+ ["\uC22F", "\uC22F"], /* Hangul Syllable */
+ ["\uC230", "\uC230"], /* Hangul Syllable */
+ ["\uC231", "\uC231"], /* Hangul Syllable */
+ ["\uC232", "\uC232"], /* Hangul Syllable */
+ ["\uC233", "\uC233"], /* Hangul Syllable */
+ ["\uC234", "\uC234"], /* Hangul Syllable */
+ ["\uC235", "\uC235"], /* Hangul Syllable */
+ ["\uC236", "\uC236"], /* Hangul Syllable */
+ ["\uC237", "\uC237"], /* Hangul Syllable */
+ ["\uC238", "\uC238"], /* Hangul Syllable */
+ ["\uC239", "\uC239"], /* Hangul Syllable */
+ ["\uC23A", "\uC23A"], /* Hangul Syllable */
+ ["\uC23B", "\uC23B"], /* Hangul Syllable */
+ ["\uC23C", "\uC23C"], /* Hangul Syllable */
+ ["\uC23D", "\uC23D"], /* Hangul Syllable */
+ ["\uC23E", "\uC23E"], /* Hangul Syllable */
+ ["\uC23F", "\uC23F"], /* Hangul Syllable */
+ ["\uC240", "\uC240"], /* Hangul Syllable */
+ ["\uC241", "\uC241"], /* Hangul Syllable */
+ ["\uC242", "\uC242"], /* Hangul Syllable */
+ ["\uC243", "\uC243"], /* Hangul Syllable */
+ ["\uC244", "\uC244"], /* Hangul Syllable */
+ ["\uC245", "\uC245"], /* Hangul Syllable */
+ ["\uC246", "\uC246"], /* Hangul Syllable */
+ ["\uC247", "\uC247"], /* Hangul Syllable */
+ ["\uC248", "\uC248"], /* Hangul Syllable */
+ ["\uC249", "\uC249"], /* Hangul Syllable */
+ ["\uC24A", "\uC24A"], /* Hangul Syllable */
+ ["\uC24B", "\uC24B"], /* Hangul Syllable */
+ ["\uC24C", "\uC24C"], /* Hangul Syllable */
+ ["\uC24D", "\uC24D"], /* Hangul Syllable */
+ ["\uC24E", "\uC24E"], /* Hangul Syllable */
+ ["\uC24F", "\uC24F"], /* Hangul Syllable */
+ ["\uC250", "\uC250"], /* Hangul Syllable */
+ ["\uC251", "\uC251"], /* Hangul Syllable */
+ ["\uC252", "\uC252"], /* Hangul Syllable */
+ ["\uC253", "\uC253"], /* Hangul Syllable */
+ ["\uC254", "\uC254"], /* Hangul Syllable */
+ ["\uC255", "\uC255"], /* Hangul Syllable */
+ ["\uC256", "\uC256"], /* Hangul Syllable */
+ ["\uC257", "\uC257"], /* Hangul Syllable */
+ ["\uC258", "\uC258"], /* Hangul Syllable */
+ ["\uC259", "\uC259"], /* Hangul Syllable */
+ ["\uC25A", "\uC25A"], /* Hangul Syllable */
+ ["\uC25B", "\uC25B"], /* Hangul Syllable */
+ ["\uC25C", "\uC25C"], /* Hangul Syllable */
+ ["\uC25D", "\uC25D"], /* Hangul Syllable */
+ ["\uC25E", "\uC25E"], /* Hangul Syllable */
+ ["\uC25F", "\uC25F"], /* Hangul Syllable */
+ ["\uC260", "\uC260"], /* Hangul Syllable */
+ ["\uC261", "\uC261"], /* Hangul Syllable */
+ ["\uC262", "\uC262"], /* Hangul Syllable */
+ ["\uC263", "\uC263"], /* Hangul Syllable */
+ ["\uC264", "\uC264"], /* Hangul Syllable */
+ ["\uC265", "\uC265"], /* Hangul Syllable */
+ ["\uC266", "\uC266"], /* Hangul Syllable */
+ ["\uC267", "\uC267"], /* Hangul Syllable */
+ ["\uC268", "\uC268"], /* Hangul Syllable */
+ ["\uC269", "\uC269"], /* Hangul Syllable */
+ ["\uC26A", "\uC26A"], /* Hangul Syllable */
+ ["\uC26B", "\uC26B"], /* Hangul Syllable */
+ ["\uC26C", "\uC26C"], /* Hangul Syllable */
+ ["\uC26D", "\uC26D"], /* Hangul Syllable */
+ ["\uC26E", "\uC26E"], /* Hangul Syllable */
+ ["\uC26F", "\uC26F"], /* Hangul Syllable */
+ ["\uC270", "\uC270"], /* Hangul Syllable */
+ ["\uC271", "\uC271"], /* Hangul Syllable */
+ ["\uC272", "\uC272"], /* Hangul Syllable */
+ ["\uC273", "\uC273"], /* Hangul Syllable */
+ ["\uC274", "\uC274"], /* Hangul Syllable */
+ ["\uC275", "\uC275"], /* Hangul Syllable */
+ ["\uC276", "\uC276"], /* Hangul Syllable */
+ ["\uC277", "\uC277"], /* Hangul Syllable */
+ ["\uC278", "\uC278"], /* Hangul Syllable */
+ ["\uC279", "\uC279"], /* Hangul Syllable */
+ ["\uC27A", "\uC27A"], /* Hangul Syllable */
+ ["\uC27B", "\uC27B"], /* Hangul Syllable */
+ ["\uC27C", "\uC27C"], /* Hangul Syllable */
+ ["\uC27D", "\uC27D"], /* Hangul Syllable */
+ ["\uC27E", "\uC27E"], /* Hangul Syllable */
+ ["\uC27F", "\uC27F"], /* Hangul Syllable */
+ ["\uC280", "\uC280"], /* Hangul Syllable */
+ ["\uC281", "\uC281"], /* Hangul Syllable */
+ ["\uC282", "\uC282"], /* Hangul Syllable */
+ ["\uC283", "\uC283"], /* Hangul Syllable */
+ ["\uC284", "\uC284"], /* Hangul Syllable */
+ ["\uC285", "\uC285"], /* Hangul Syllable */
+ ["\uC286", "\uC286"], /* Hangul Syllable */
+ ["\uC287", "\uC287"], /* Hangul Syllable */
+ ["\uC288", "\uC288"], /* Hangul Syllable */
+ ["\uC289", "\uC289"], /* Hangul Syllable */
+ ["\uC28A", "\uC28A"], /* Hangul Syllable */
+ ["\uC28B", "\uC28B"], /* Hangul Syllable */
+ ["\uC28C", "\uC28C"], /* Hangul Syllable */
+ ["\uC28D", "\uC28D"], /* Hangul Syllable */
+ ["\uC28E", "\uC28E"], /* Hangul Syllable */
+ ["\uC28F", "\uC28F"], /* Hangul Syllable */
+ ["\uC290", "\uC290"], /* Hangul Syllable */
+ ["\uC291", "\uC291"], /* Hangul Syllable */
+ ["\uC292", "\uC292"], /* Hangul Syllable */
+ ["\uC293", "\uC293"], /* Hangul Syllable */
+ ["\uC294", "\uC294"], /* Hangul Syllable */
+ ["\uC295", "\uC295"], /* Hangul Syllable */
+ ["\uC296", "\uC296"], /* Hangul Syllable */
+ ["\uC297", "\uC297"], /* Hangul Syllable */
+ ["\uC298", "\uC298"], /* Hangul Syllable */
+ ["\uC299", "\uC299"], /* Hangul Syllable */
+ ["\uC29A", "\uC29A"], /* Hangul Syllable */
+ ["\uC29B", "\uC29B"], /* Hangul Syllable */
+ ["\uC29C", "\uC29C"], /* Hangul Syllable */
+ ["\uC29D", "\uC29D"], /* Hangul Syllable */
+ ["\uC29E", "\uC29E"], /* Hangul Syllable */
+ ["\uC29F", "\uC29F"], /* Hangul Syllable */
+ ["\uC2A0", "\uC2A0"], /* Hangul Syllable */
+ ["\uC2A1", "\uC2A1"], /* Hangul Syllable */
+ ["\uC2A2", "\uC2A2"], /* Hangul Syllable */
+ ["\uC2A3", "\uC2A3"], /* Hangul Syllable */
+ ["\uC2A4", "\uC2A4"], /* Hangul Syllable */
+ ["\uC2A5", "\uC2A5"], /* Hangul Syllable */
+ ["\uC2A6", "\uC2A6"], /* Hangul Syllable */
+ ["\uC2A7", "\uC2A7"], /* Hangul Syllable */
+ ["\uC2A8", "\uC2A8"], /* Hangul Syllable */
+ ["\uC2A9", "\uC2A9"], /* Hangul Syllable */
+ ["\uC2AA", "\uC2AA"], /* Hangul Syllable */
+ ["\uC2AB", "\uC2AB"], /* Hangul Syllable */
+ ["\uC2AC", "\uC2AC"], /* Hangul Syllable */
+ ["\uC2AD", "\uC2AD"], /* Hangul Syllable */
+ ["\uC2AE", "\uC2AE"], /* Hangul Syllable */
+ ["\uC2AF", "\uC2AF"], /* Hangul Syllable */
+ ["\uC2B0", "\uC2B0"], /* Hangul Syllable */
+ ["\uC2B1", "\uC2B1"], /* Hangul Syllable */
+ ["\uC2B2", "\uC2B2"], /* Hangul Syllable */
+ ["\uC2B3", "\uC2B3"], /* Hangul Syllable */
+ ["\uC2B4", "\uC2B4"], /* Hangul Syllable */
+ ["\uC2B5", "\uC2B5"], /* Hangul Syllable */
+ ["\uC2B6", "\uC2B6"], /* Hangul Syllable */
+ ["\uC2B7", "\uC2B7"], /* Hangul Syllable */
+ ["\uC2B8", "\uC2B8"], /* Hangul Syllable */
+ ["\uC2B9", "\uC2B9"], /* Hangul Syllable */
+ ["\uC2BA", "\uC2BA"], /* Hangul Syllable */
+ ["\uC2BB", "\uC2BB"], /* Hangul Syllable */
+ ["\uC2BC", "\uC2BC"], /* Hangul Syllable */
+ ["\uC2BD", "\uC2BD"], /* Hangul Syllable */
+ ["\uC2BE", "\uC2BE"], /* Hangul Syllable */
+ ["\uC2BF", "\uC2BF"], /* Hangul Syllable */
+ ["\uC2C0", "\uC2C0"], /* Hangul Syllable */
+ ["\uC2C1", "\uC2C1"], /* Hangul Syllable */
+ ["\uC2C2", "\uC2C2"], /* Hangul Syllable */
+ ["\uC2C3", "\uC2C3"], /* Hangul Syllable */
+ ["\uC2C4", "\uC2C4"], /* Hangul Syllable */
+ ["\uC2C5", "\uC2C5"], /* Hangul Syllable */
+ ["\uC2C6", "\uC2C6"], /* Hangul Syllable */
+ ["\uC2C7", "\uC2C7"], /* Hangul Syllable */
+ ["\uC2C8", "\uC2C8"], /* Hangul Syllable */
+ ["\uC2C9", "\uC2C9"], /* Hangul Syllable */
+ ["\uC2CA", "\uC2CA"], /* Hangul Syllable */
+ ["\uC2CB", "\uC2CB"], /* Hangul Syllable */
+ ["\uC2CC", "\uC2CC"], /* Hangul Syllable */
+ ["\uC2CD", "\uC2CD"], /* Hangul Syllable */
+ ["\uC2CE", "\uC2CE"], /* Hangul Syllable */
+ ["\uC2CF", "\uC2CF"], /* Hangul Syllable */
+ ["\uC2D0", "\uC2D0"], /* Hangul Syllable */
+ ["\uC2D1", "\uC2D1"], /* Hangul Syllable */
+ ["\uC2D2", "\uC2D2"], /* Hangul Syllable */
+ ["\uC2D3", "\uC2D3"], /* Hangul Syllable */
+ ["\uC2D4", "\uC2D4"], /* Hangul Syllable */
+ ["\uC2D5", "\uC2D5"], /* Hangul Syllable */
+ ["\uC2D6", "\uC2D6"], /* Hangul Syllable */
+ ["\uC2D7", "\uC2D7"], /* Hangul Syllable */
+ ["\uC2D8", "\uC2D8"], /* Hangul Syllable */
+ ["\uC2D9", "\uC2D9"], /* Hangul Syllable */
+ ["\uC2DA", "\uC2DA"], /* Hangul Syllable */
+ ["\uC2DB", "\uC2DB"], /* Hangul Syllable */
+ ["\uC2DC", "\uC2DC"], /* Hangul Syllable */
+ ["\uC2DD", "\uC2DD"], /* Hangul Syllable */
+ ["\uC2DE", "\uC2DE"], /* Hangul Syllable */
+ ["\uC2DF", "\uC2DF"], /* Hangul Syllable */
+ ["\uC2E0", "\uC2E0"], /* Hangul Syllable */
+ ["\uC2E1", "\uC2E1"], /* Hangul Syllable */
+ ["\uC2E2", "\uC2E2"], /* Hangul Syllable */
+ ["\uC2E3", "\uC2E3"], /* Hangul Syllable */
+ ["\uC2E4", "\uC2E4"], /* Hangul Syllable */
+ ["\uC2E5", "\uC2E5"], /* Hangul Syllable */
+ ["\uC2E6", "\uC2E6"], /* Hangul Syllable */
+ ["\uC2E7", "\uC2E7"], /* Hangul Syllable */
+ ["\uC2E8", "\uC2E8"], /* Hangul Syllable */
+ ["\uC2E9", "\uC2E9"], /* Hangul Syllable */
+ ["\uC2EA", "\uC2EA"], /* Hangul Syllable */
+ ["\uC2EB", "\uC2EB"], /* Hangul Syllable */
+ ["\uC2EC", "\uC2EC"], /* Hangul Syllable */
+ ["\uC2ED", "\uC2ED"], /* Hangul Syllable */
+ ["\uC2EE", "\uC2EE"], /* Hangul Syllable */
+ ["\uC2EF", "\uC2EF"], /* Hangul Syllable */
+ ["\uC2F0", "\uC2F0"], /* Hangul Syllable */
+ ["\uC2F1", "\uC2F1"], /* Hangul Syllable */
+ ["\uC2F2", "\uC2F2"], /* Hangul Syllable */
+ ["\uC2F3", "\uC2F3"], /* Hangul Syllable */
+ ["\uC2F4", "\uC2F4"], /* Hangul Syllable */
+ ["\uC2F5", "\uC2F5"], /* Hangul Syllable */
+ ["\uC2F6", "\uC2F6"], /* Hangul Syllable */
+ ["\uC2F7", "\uC2F7"], /* Hangul Syllable */
+ ["\uC2F8", "\uC2F8"], /* Hangul Syllable */
+ ["\uC2F9", "\uC2F9"], /* Hangul Syllable */
+ ["\uC2FA", "\uC2FA"], /* Hangul Syllable */
+ ["\uC2FB", "\uC2FB"], /* Hangul Syllable */
+ ["\uC2FC", "\uC2FC"], /* Hangul Syllable */
+ ["\uC2FD", "\uC2FD"], /* Hangul Syllable */
+ ["\uC2FE", "\uC2FE"], /* Hangul Syllable */
+ ["\uC2FF", "\uC2FF"], /* Hangul Syllable */
+ ["\uC300", "\uC300"], /* Hangul Syllable */
+ ["\uC301", "\uC301"], /* Hangul Syllable */
+ ["\uC302", "\uC302"], /* Hangul Syllable */
+ ["\uC303", "\uC303"], /* Hangul Syllable */
+ ["\uC304", "\uC304"], /* Hangul Syllable */
+ ["\uC305", "\uC305"], /* Hangul Syllable */
+ ["\uC306", "\uC306"], /* Hangul Syllable */
+ ["\uC307", "\uC307"], /* Hangul Syllable */
+ ["\uC308", "\uC308"], /* Hangul Syllable */
+ ["\uC309", "\uC309"], /* Hangul Syllable */
+ ["\uC30A", "\uC30A"], /* Hangul Syllable */
+ ["\uC30B", "\uC30B"], /* Hangul Syllable */
+ ["\uC30C", "\uC30C"], /* Hangul Syllable */
+ ["\uC30D", "\uC30D"], /* Hangul Syllable */
+ ["\uC30E", "\uC30E"], /* Hangul Syllable */
+ ["\uC30F", "\uC30F"], /* Hangul Syllable */
+ ["\uC310", "\uC310"], /* Hangul Syllable */
+ ["\uC311", "\uC311"], /* Hangul Syllable */
+ ["\uC312", "\uC312"], /* Hangul Syllable */
+ ["\uC313", "\uC313"], /* Hangul Syllable */
+ ["\uC314", "\uC314"], /* Hangul Syllable */
+ ["\uC315", "\uC315"], /* Hangul Syllable */
+ ["\uC316", "\uC316"], /* Hangul Syllable */
+ ["\uC317", "\uC317"], /* Hangul Syllable */
+ ["\uC318", "\uC318"], /* Hangul Syllable */
+ ["\uC319", "\uC319"], /* Hangul Syllable */
+ ["\uC31A", "\uC31A"], /* Hangul Syllable */
+ ["\uC31B", "\uC31B"], /* Hangul Syllable */
+ ["\uC31C", "\uC31C"], /* Hangul Syllable */
+ ["\uC31D", "\uC31D"], /* Hangul Syllable */
+ ["\uC31E", "\uC31E"], /* Hangul Syllable */
+ ["\uC31F", "\uC31F"], /* Hangul Syllable */
+ ["\uC320", "\uC320"], /* Hangul Syllable */
+ ["\uC321", "\uC321"], /* Hangul Syllable */
+ ["\uC322", "\uC322"], /* Hangul Syllable */
+ ["\uC323", "\uC323"], /* Hangul Syllable */
+ ["\uC324", "\uC324"], /* Hangul Syllable */
+ ["\uC325", "\uC325"], /* Hangul Syllable */
+ ["\uC326", "\uC326"], /* Hangul Syllable */
+ ["\uC327", "\uC327"], /* Hangul Syllable */
+ ["\uC328", "\uC328"], /* Hangul Syllable */
+ ["\uC329", "\uC329"], /* Hangul Syllable */
+ ["\uC32A", "\uC32A"], /* Hangul Syllable */
+ ["\uC32B", "\uC32B"], /* Hangul Syllable */
+ ["\uC32C", "\uC32C"], /* Hangul Syllable */
+ ["\uC32D", "\uC32D"], /* Hangul Syllable */
+ ["\uC32E", "\uC32E"], /* Hangul Syllable */
+ ["\uC32F", "\uC32F"], /* Hangul Syllable */
+ ["\uC330", "\uC330"], /* Hangul Syllable */
+ ["\uC331", "\uC331"], /* Hangul Syllable */
+ ["\uC332", "\uC332"], /* Hangul Syllable */
+ ["\uC333", "\uC333"], /* Hangul Syllable */
+ ["\uC334", "\uC334"], /* Hangul Syllable */
+ ["\uC335", "\uC335"], /* Hangul Syllable */
+ ["\uC336", "\uC336"], /* Hangul Syllable */
+ ["\uC337", "\uC337"], /* Hangul Syllable */
+ ["\uC338", "\uC338"], /* Hangul Syllable */
+ ["\uC339", "\uC339"], /* Hangul Syllable */
+ ["\uC33A", "\uC33A"], /* Hangul Syllable */
+ ["\uC33B", "\uC33B"], /* Hangul Syllable */
+ ["\uC33C", "\uC33C"], /* Hangul Syllable */
+ ["\uC33D", "\uC33D"], /* Hangul Syllable */
+ ["\uC33E", "\uC33E"], /* Hangul Syllable */
+ ["\uC33F", "\uC33F"], /* Hangul Syllable */
+ ["\uC340", "\uC340"], /* Hangul Syllable */
+ ["\uC341", "\uC341"], /* Hangul Syllable */
+ ["\uC342", "\uC342"], /* Hangul Syllable */
+ ["\uC343", "\uC343"], /* Hangul Syllable */
+ ["\uC344", "\uC344"], /* Hangul Syllable */
+ ["\uC345", "\uC345"], /* Hangul Syllable */
+ ["\uC346", "\uC346"], /* Hangul Syllable */
+ ["\uC347", "\uC347"], /* Hangul Syllable */
+ ["\uC348", "\uC348"], /* Hangul Syllable */
+ ["\uC349", "\uC349"], /* Hangul Syllable */
+ ["\uC34A", "\uC34A"], /* Hangul Syllable */
+ ["\uC34B", "\uC34B"], /* Hangul Syllable */
+ ["\uC34C", "\uC34C"], /* Hangul Syllable */
+ ["\uC34D", "\uC34D"], /* Hangul Syllable */
+ ["\uC34E", "\uC34E"], /* Hangul Syllable */
+ ["\uC34F", "\uC34F"], /* Hangul Syllable */
+ ["\uC350", "\uC350"], /* Hangul Syllable */
+ ["\uC351", "\uC351"], /* Hangul Syllable */
+ ["\uC352", "\uC352"], /* Hangul Syllable */
+ ["\uC353", "\uC353"], /* Hangul Syllable */
+ ["\uC354", "\uC354"], /* Hangul Syllable */
+ ["\uC355", "\uC355"], /* Hangul Syllable */
+ ["\uC356", "\uC356"], /* Hangul Syllable */
+ ["\uC357", "\uC357"], /* Hangul Syllable */
+ ["\uC358", "\uC358"], /* Hangul Syllable */
+ ["\uC359", "\uC359"], /* Hangul Syllable */
+ ["\uC35A", "\uC35A"], /* Hangul Syllable */
+ ["\uC35B", "\uC35B"], /* Hangul Syllable */
+ ["\uC35C", "\uC35C"], /* Hangul Syllable */
+ ["\uC35D", "\uC35D"], /* Hangul Syllable */
+ ["\uC35E", "\uC35E"], /* Hangul Syllable */
+ ["\uC35F", "\uC35F"], /* Hangul Syllable */
+ ["\uC360", "\uC360"], /* Hangul Syllable */
+ ["\uC361", "\uC361"], /* Hangul Syllable */
+ ["\uC362", "\uC362"], /* Hangul Syllable */
+ ["\uC363", "\uC363"], /* Hangul Syllable */
+ ["\uC364", "\uC364"], /* Hangul Syllable */
+ ["\uC365", "\uC365"], /* Hangul Syllable */
+ ["\uC366", "\uC366"], /* Hangul Syllable */
+ ["\uC367", "\uC367"], /* Hangul Syllable */
+ ["\uC368", "\uC368"], /* Hangul Syllable */
+ ["\uC369", "\uC369"], /* Hangul Syllable */
+ ["\uC36A", "\uC36A"], /* Hangul Syllable */
+ ["\uC36B", "\uC36B"], /* Hangul Syllable */
+ ["\uC36C", "\uC36C"], /* Hangul Syllable */
+ ["\uC36D", "\uC36D"], /* Hangul Syllable */
+ ["\uC36E", "\uC36E"], /* Hangul Syllable */
+ ["\uC36F", "\uC36F"], /* Hangul Syllable */
+ ["\uC370", "\uC370"], /* Hangul Syllable */
+ ["\uC371", "\uC371"], /* Hangul Syllable */
+ ["\uC372", "\uC372"], /* Hangul Syllable */
+ ["\uC373", "\uC373"], /* Hangul Syllable */
+ ["\uC374", "\uC374"], /* Hangul Syllable */
+ ["\uC375", "\uC375"], /* Hangul Syllable */
+ ["\uC376", "\uC376"], /* Hangul Syllable */
+ ["\uC377", "\uC377"], /* Hangul Syllable */
+ ["\uC378", "\uC378"], /* Hangul Syllable */
+ ["\uC379", "\uC379"], /* Hangul Syllable */
+ ["\uC37A", "\uC37A"], /* Hangul Syllable */
+ ["\uC37B", "\uC37B"], /* Hangul Syllable */
+ ["\uC37C", "\uC37C"], /* Hangul Syllable */
+ ["\uC37D", "\uC37D"], /* Hangul Syllable */
+ ["\uC37E", "\uC37E"], /* Hangul Syllable */
+ ["\uC37F", "\uC37F"], /* Hangul Syllable */
+ ["\uC380", "\uC380"], /* Hangul Syllable */
+ ["\uC381", "\uC381"], /* Hangul Syllable */
+ ["\uC382", "\uC382"], /* Hangul Syllable */
+ ["\uC383", "\uC383"], /* Hangul Syllable */
+ ["\uC384", "\uC384"], /* Hangul Syllable */
+ ["\uC385", "\uC385"], /* Hangul Syllable */
+ ["\uC386", "\uC386"], /* Hangul Syllable */
+ ["\uC387", "\uC387"], /* Hangul Syllable */
+ ["\uC388", "\uC388"], /* Hangul Syllable */
+ ["\uC389", "\uC389"], /* Hangul Syllable */
+ ["\uC38A", "\uC38A"], /* Hangul Syllable */
+ ["\uC38B", "\uC38B"], /* Hangul Syllable */
+ ["\uC38C", "\uC38C"], /* Hangul Syllable */
+ ["\uC38D", "\uC38D"], /* Hangul Syllable */
+ ["\uC38E", "\uC38E"], /* Hangul Syllable */
+ ["\uC38F", "\uC38F"], /* Hangul Syllable */
+ ["\uC390", "\uC390"], /* Hangul Syllable */
+ ["\uC391", "\uC391"], /* Hangul Syllable */
+ ["\uC392", "\uC392"], /* Hangul Syllable */
+ ["\uC393", "\uC393"], /* Hangul Syllable */
+ ["\uC394", "\uC394"], /* Hangul Syllable */
+ ["\uC395", "\uC395"], /* Hangul Syllable */
+ ["\uC396", "\uC396"], /* Hangul Syllable */
+ ["\uC397", "\uC397"], /* Hangul Syllable */
+ ["\uC398", "\uC398"], /* Hangul Syllable */
+ ["\uC399", "\uC399"], /* Hangul Syllable */
+ ["\uC39A", "\uC39A"], /* Hangul Syllable */
+ ["\uC39B", "\uC39B"], /* Hangul Syllable */
+ ["\uC39C", "\uC39C"], /* Hangul Syllable */
+ ["\uC39D", "\uC39D"], /* Hangul Syllable */
+ ["\uC39E", "\uC39E"], /* Hangul Syllable */
+ ["\uC39F", "\uC39F"], /* Hangul Syllable */
+ ["\uC3A0", "\uC3A0"], /* Hangul Syllable */
+ ["\uC3A1", "\uC3A1"], /* Hangul Syllable */
+ ["\uC3A2", "\uC3A2"], /* Hangul Syllable */
+ ["\uC3A3", "\uC3A3"], /* Hangul Syllable */
+ ["\uC3A4", "\uC3A4"], /* Hangul Syllable */
+ ["\uC3A5", "\uC3A5"], /* Hangul Syllable */
+ ["\uC3A6", "\uC3A6"], /* Hangul Syllable */
+ ["\uC3A7", "\uC3A7"], /* Hangul Syllable */
+ ["\uC3A8", "\uC3A8"], /* Hangul Syllable */
+ ["\uC3A9", "\uC3A9"], /* Hangul Syllable */
+ ["\uC3AA", "\uC3AA"], /* Hangul Syllable */
+ ["\uC3AB", "\uC3AB"], /* Hangul Syllable */
+ ["\uC3AC", "\uC3AC"], /* Hangul Syllable */
+ ["\uC3AD", "\uC3AD"], /* Hangul Syllable */
+ ["\uC3AE", "\uC3AE"], /* Hangul Syllable */
+ ["\uC3AF", "\uC3AF"], /* Hangul Syllable */
+ ["\uC3B0", "\uC3B0"], /* Hangul Syllable */
+ ["\uC3B1", "\uC3B1"], /* Hangul Syllable */
+ ["\uC3B2", "\uC3B2"], /* Hangul Syllable */
+ ["\uC3B3", "\uC3B3"], /* Hangul Syllable */
+ ["\uC3B4", "\uC3B4"], /* Hangul Syllable */
+ ["\uC3B5", "\uC3B5"], /* Hangul Syllable */
+ ["\uC3B6", "\uC3B6"], /* Hangul Syllable */
+ ["\uC3B7", "\uC3B7"], /* Hangul Syllable */
+ ["\uC3B8", "\uC3B8"], /* Hangul Syllable */
+ ["\uC3B9", "\uC3B9"], /* Hangul Syllable */
+ ["\uC3BA", "\uC3BA"], /* Hangul Syllable */
+ ["\uC3BB", "\uC3BB"], /* Hangul Syllable */
+ ["\uC3BC", "\uC3BC"], /* Hangul Syllable */
+ ["\uC3BD", "\uC3BD"], /* Hangul Syllable */
+ ["\uC3BE", "\uC3BE"], /* Hangul Syllable */
+ ["\uC3BF", "\uC3BF"], /* Hangul Syllable */
+ ["\uC3C0", "\uC3C0"], /* Hangul Syllable */
+ ["\uC3C1", "\uC3C1"], /* Hangul Syllable */
+ ["\uC3C2", "\uC3C2"], /* Hangul Syllable */
+ ["\uC3C3", "\uC3C3"], /* Hangul Syllable */
+ ["\uC3C4", "\uC3C4"], /* Hangul Syllable */
+ ["\uC3C5", "\uC3C5"], /* Hangul Syllable */
+ ["\uC3C6", "\uC3C6"], /* Hangul Syllable */
+ ["\uC3C7", "\uC3C7"], /* Hangul Syllable */
+ ["\uC3C8", "\uC3C8"], /* Hangul Syllable */
+ ["\uC3C9", "\uC3C9"], /* Hangul Syllable */
+ ["\uC3CA", "\uC3CA"], /* Hangul Syllable */
+ ["\uC3CB", "\uC3CB"], /* Hangul Syllable */
+ ["\uC3CC", "\uC3CC"], /* Hangul Syllable */
+ ["\uC3CD", "\uC3CD"], /* Hangul Syllable */
+ ["\uC3CE", "\uC3CE"], /* Hangul Syllable */
+ ["\uC3CF", "\uC3CF"], /* Hangul Syllable */
+ ["\uC3D0", "\uC3D0"], /* Hangul Syllable */
+ ["\uC3D1", "\uC3D1"], /* Hangul Syllable */
+ ["\uC3D2", "\uC3D2"], /* Hangul Syllable */
+ ["\uC3D3", "\uC3D3"], /* Hangul Syllable */
+ ["\uC3D4", "\uC3D4"], /* Hangul Syllable */
+ ["\uC3D5", "\uC3D5"], /* Hangul Syllable */
+ ["\uC3D6", "\uC3D6"], /* Hangul Syllable */
+ ["\uC3D7", "\uC3D7"], /* Hangul Syllable */
+ ["\uC3D8", "\uC3D8"], /* Hangul Syllable */
+ ["\uC3D9", "\uC3D9"], /* Hangul Syllable */
+ ["\uC3DA", "\uC3DA"], /* Hangul Syllable */
+ ["\uC3DB", "\uC3DB"], /* Hangul Syllable */
+ ["\uC3DC", "\uC3DC"], /* Hangul Syllable */
+ ["\uC3DD", "\uC3DD"], /* Hangul Syllable */
+ ["\uC3DE", "\uC3DE"], /* Hangul Syllable */
+ ["\uC3DF", "\uC3DF"], /* Hangul Syllable */
+ ["\uC3E0", "\uC3E0"], /* Hangul Syllable */
+ ["\uC3E1", "\uC3E1"], /* Hangul Syllable */
+ ["\uC3E2", "\uC3E2"], /* Hangul Syllable */
+ ["\uC3E3", "\uC3E3"], /* Hangul Syllable */
+ ["\uC3E4", "\uC3E4"], /* Hangul Syllable */
+ ["\uC3E5", "\uC3E5"], /* Hangul Syllable */
+ ["\uC3E6", "\uC3E6"], /* Hangul Syllable */
+ ["\uC3E7", "\uC3E7"], /* Hangul Syllable */
+ ["\uC3E8", "\uC3E8"], /* Hangul Syllable */
+ ["\uC3E9", "\uC3E9"], /* Hangul Syllable */
+ ["\uC3EA", "\uC3EA"], /* Hangul Syllable */
+ ["\uC3EB", "\uC3EB"], /* Hangul Syllable */
+ ["\uC3EC", "\uC3EC"], /* Hangul Syllable */
+ ["\uC3ED", "\uC3ED"], /* Hangul Syllable */
+ ["\uC3EE", "\uC3EE"], /* Hangul Syllable */
+ ["\uC3EF", "\uC3EF"], /* Hangul Syllable */
+ ["\uC3F0", "\uC3F0"], /* Hangul Syllable */
+ ["\uC3F1", "\uC3F1"], /* Hangul Syllable */
+ ["\uC3F2", "\uC3F2"], /* Hangul Syllable */
+ ["\uC3F3", "\uC3F3"], /* Hangul Syllable */
+ ["\uC3F4", "\uC3F4"], /* Hangul Syllable */
+ ["\uC3F5", "\uC3F5"], /* Hangul Syllable */
+ ["\uC3F6", "\uC3F6"], /* Hangul Syllable */
+ ["\uC3F7", "\uC3F7"], /* Hangul Syllable */
+ ["\uC3F8", "\uC3F8"], /* Hangul Syllable */
+ ["\uC3F9", "\uC3F9"], /* Hangul Syllable */
+ ["\uC3FA", "\uC3FA"], /* Hangul Syllable */
+ ["\uC3FB", "\uC3FB"], /* Hangul Syllable */
+ ["\uC3FC", "\uC3FC"], /* Hangul Syllable */
+ ["\uC3FD", "\uC3FD"], /* Hangul Syllable */
+ ["\uC3FE", "\uC3FE"], /* Hangul Syllable */
+ ["\uC3FF", "\uC3FF"], /* Hangul Syllable */
+ ["\uC400", "\uC400"], /* Hangul Syllable */
+ ["\uC401", "\uC401"], /* Hangul Syllable */
+ ["\uC402", "\uC402"], /* Hangul Syllable */
+ ["\uC403", "\uC403"], /* Hangul Syllable */
+ ["\uC404", "\uC404"], /* Hangul Syllable */
+ ["\uC405", "\uC405"], /* Hangul Syllable */
+ ["\uC406", "\uC406"], /* Hangul Syllable */
+ ["\uC407", "\uC407"], /* Hangul Syllable */
+ ["\uC408", "\uC408"], /* Hangul Syllable */
+ ["\uC409", "\uC409"], /* Hangul Syllable */
+ ["\uC40A", "\uC40A"], /* Hangul Syllable */
+ ["\uC40B", "\uC40B"], /* Hangul Syllable */
+ ["\uC40C", "\uC40C"], /* Hangul Syllable */
+ ["\uC40D", "\uC40D"], /* Hangul Syllable */
+ ["\uC40E", "\uC40E"], /* Hangul Syllable */
+ ["\uC40F", "\uC40F"], /* Hangul Syllable */
+ ["\uC410", "\uC410"], /* Hangul Syllable */
+ ["\uC411", "\uC411"], /* Hangul Syllable */
+ ["\uC412", "\uC412"], /* Hangul Syllable */
+ ["\uC413", "\uC413"], /* Hangul Syllable */
+ ["\uC414", "\uC414"], /* Hangul Syllable */
+ ["\uC415", "\uC415"], /* Hangul Syllable */
+ ["\uC416", "\uC416"], /* Hangul Syllable */
+ ["\uC417", "\uC417"], /* Hangul Syllable */
+ ["\uC418", "\uC418"], /* Hangul Syllable */
+ ["\uC419", "\uC419"], /* Hangul Syllable */
+ ["\uC41A", "\uC41A"], /* Hangul Syllable */
+ ["\uC41B", "\uC41B"], /* Hangul Syllable */
+ ["\uC41C", "\uC41C"], /* Hangul Syllable */
+ ["\uC41D", "\uC41D"], /* Hangul Syllable */
+ ["\uC41E", "\uC41E"], /* Hangul Syllable */
+ ["\uC41F", "\uC41F"], /* Hangul Syllable */
+ ["\uC420", "\uC420"], /* Hangul Syllable */
+ ["\uC421", "\uC421"], /* Hangul Syllable */
+ ["\uC422", "\uC422"], /* Hangul Syllable */
+ ["\uC423", "\uC423"], /* Hangul Syllable */
+ ["\uC424", "\uC424"], /* Hangul Syllable */
+ ["\uC425", "\uC425"], /* Hangul Syllable */
+ ["\uC426", "\uC426"], /* Hangul Syllable */
+ ["\uC427", "\uC427"], /* Hangul Syllable */
+ ["\uC428", "\uC428"], /* Hangul Syllable */
+ ["\uC429", "\uC429"], /* Hangul Syllable */
+ ["\uC42A", "\uC42A"], /* Hangul Syllable */
+ ["\uC42B", "\uC42B"], /* Hangul Syllable */
+ ["\uC42C", "\uC42C"], /* Hangul Syllable */
+ ["\uC42D", "\uC42D"], /* Hangul Syllable */
+ ["\uC42E", "\uC42E"], /* Hangul Syllable */
+ ["\uC42F", "\uC42F"], /* Hangul Syllable */
+ ["\uC430", "\uC430"], /* Hangul Syllable */
+ ["\uC431", "\uC431"], /* Hangul Syllable */
+ ["\uC432", "\uC432"], /* Hangul Syllable */
+ ["\uC433", "\uC433"], /* Hangul Syllable */
+ ["\uC434", "\uC434"], /* Hangul Syllable */
+ ["\uC435", "\uC435"], /* Hangul Syllable */
+ ["\uC436", "\uC436"], /* Hangul Syllable */
+ ["\uC437", "\uC437"], /* Hangul Syllable */
+ ["\uC438", "\uC438"], /* Hangul Syllable */
+ ["\uC439", "\uC439"], /* Hangul Syllable */
+ ["\uC43A", "\uC43A"], /* Hangul Syllable */
+ ["\uC43B", "\uC43B"], /* Hangul Syllable */
+ ["\uC43C", "\uC43C"], /* Hangul Syllable */
+ ["\uC43D", "\uC43D"], /* Hangul Syllable */
+ ["\uC43E", "\uC43E"], /* Hangul Syllable */
+ ["\uC43F", "\uC43F"], /* Hangul Syllable */
+ ["\uC440", "\uC440"], /* Hangul Syllable */
+ ["\uC441", "\uC441"], /* Hangul Syllable */
+ ["\uC442", "\uC442"], /* Hangul Syllable */
+ ["\uC443", "\uC443"], /* Hangul Syllable */
+ ["\uC444", "\uC444"], /* Hangul Syllable */
+ ["\uC445", "\uC445"], /* Hangul Syllable */
+ ["\uC446", "\uC446"], /* Hangul Syllable */
+ ["\uC447", "\uC447"], /* Hangul Syllable */
+ ["\uC448", "\uC448"], /* Hangul Syllable */
+ ["\uC449", "\uC449"], /* Hangul Syllable */
+ ["\uC44A", "\uC44A"], /* Hangul Syllable */
+ ["\uC44B", "\uC44B"], /* Hangul Syllable */
+ ["\uC44C", "\uC44C"], /* Hangul Syllable */
+ ["\uC44D", "\uC44D"], /* Hangul Syllable */
+ ["\uC44E", "\uC44E"], /* Hangul Syllable */
+ ["\uC44F", "\uC44F"], /* Hangul Syllable */
+ ["\uC450", "\uC450"], /* Hangul Syllable */
+ ["\uC451", "\uC451"], /* Hangul Syllable */
+ ["\uC452", "\uC452"], /* Hangul Syllable */
+ ["\uC453", "\uC453"], /* Hangul Syllable */
+ ["\uC454", "\uC454"], /* Hangul Syllable */
+ ["\uC455", "\uC455"], /* Hangul Syllable */
+ ["\uC456", "\uC456"], /* Hangul Syllable */
+ ["\uC457", "\uC457"], /* Hangul Syllable */
+ ["\uC458", "\uC458"], /* Hangul Syllable */
+ ["\uC459", "\uC459"], /* Hangul Syllable */
+ ["\uC45A", "\uC45A"], /* Hangul Syllable */
+ ["\uC45B", "\uC45B"], /* Hangul Syllable */
+ ["\uC45C", "\uC45C"], /* Hangul Syllable */
+ ["\uC45D", "\uC45D"], /* Hangul Syllable */
+ ["\uC45E", "\uC45E"], /* Hangul Syllable */
+ ["\uC45F", "\uC45F"], /* Hangul Syllable */
+ ["\uC460", "\uC460"], /* Hangul Syllable */
+ ["\uC461", "\uC461"], /* Hangul Syllable */
+ ["\uC462", "\uC462"], /* Hangul Syllable */
+ ["\uC463", "\uC463"], /* Hangul Syllable */
+ ["\uC464", "\uC464"], /* Hangul Syllable */
+ ["\uC465", "\uC465"], /* Hangul Syllable */
+ ["\uC466", "\uC466"], /* Hangul Syllable */
+ ["\uC467", "\uC467"], /* Hangul Syllable */
+ ["\uC468", "\uC468"], /* Hangul Syllable */
+ ["\uC469", "\uC469"], /* Hangul Syllable */
+ ["\uC46A", "\uC46A"], /* Hangul Syllable */
+ ["\uC46B", "\uC46B"], /* Hangul Syllable */
+ ["\uC46C", "\uC46C"], /* Hangul Syllable */
+ ["\uC46D", "\uC46D"], /* Hangul Syllable */
+ ["\uC46E", "\uC46E"], /* Hangul Syllable */
+ ["\uC46F", "\uC46F"], /* Hangul Syllable */
+ ["\uC470", "\uC470"], /* Hangul Syllable */
+ ["\uC471", "\uC471"], /* Hangul Syllable */
+ ["\uC472", "\uC472"], /* Hangul Syllable */
+ ["\uC473", "\uC473"], /* Hangul Syllable */
+ ["\uC474", "\uC474"], /* Hangul Syllable */
+ ["\uC475", "\uC475"], /* Hangul Syllable */
+ ["\uC476", "\uC476"], /* Hangul Syllable */
+ ["\uC477", "\uC477"], /* Hangul Syllable */
+ ["\uC478", "\uC478"], /* Hangul Syllable */
+ ["\uC479", "\uC479"], /* Hangul Syllable */
+ ["\uC47A", "\uC47A"], /* Hangul Syllable */
+ ["\uC47B", "\uC47B"], /* Hangul Syllable */
+ ["\uC47C", "\uC47C"], /* Hangul Syllable */
+ ["\uC47D", "\uC47D"], /* Hangul Syllable */
+ ["\uC47E", "\uC47E"], /* Hangul Syllable */
+ ["\uC47F", "\uC47F"], /* Hangul Syllable */
+ ["\uC480", "\uC480"], /* Hangul Syllable */
+ ["\uC481", "\uC481"], /* Hangul Syllable */
+ ["\uC482", "\uC482"], /* Hangul Syllable */
+ ["\uC483", "\uC483"], /* Hangul Syllable */
+ ["\uC484", "\uC484"], /* Hangul Syllable */
+ ["\uC485", "\uC485"], /* Hangul Syllable */
+ ["\uC486", "\uC486"], /* Hangul Syllable */
+ ["\uC487", "\uC487"], /* Hangul Syllable */
+ ["\uC488", "\uC488"], /* Hangul Syllable */
+ ["\uC489", "\uC489"], /* Hangul Syllable */
+ ["\uC48A", "\uC48A"], /* Hangul Syllable */
+ ["\uC48B", "\uC48B"], /* Hangul Syllable */
+ ["\uC48C", "\uC48C"], /* Hangul Syllable */
+ ["\uC48D", "\uC48D"], /* Hangul Syllable */
+ ["\uC48E", "\uC48E"], /* Hangul Syllable */
+ ["\uC48F", "\uC48F"], /* Hangul Syllable */
+ ["\uC490", "\uC490"], /* Hangul Syllable */
+ ["\uC491", "\uC491"], /* Hangul Syllable */
+ ["\uC492", "\uC492"], /* Hangul Syllable */
+ ["\uC493", "\uC493"], /* Hangul Syllable */
+ ["\uC494", "\uC494"], /* Hangul Syllable */
+ ["\uC495", "\uC495"], /* Hangul Syllable */
+ ["\uC496", "\uC496"], /* Hangul Syllable */
+ ["\uC497", "\uC497"], /* Hangul Syllable */
+ ["\uC498", "\uC498"], /* Hangul Syllable */
+ ["\uC499", "\uC499"], /* Hangul Syllable */
+ ["\uC49A", "\uC49A"], /* Hangul Syllable */
+ ["\uC49B", "\uC49B"], /* Hangul Syllable */
+ ["\uC49C", "\uC49C"], /* Hangul Syllable */
+ ["\uC49D", "\uC49D"], /* Hangul Syllable */
+ ["\uC49E", "\uC49E"], /* Hangul Syllable */
+ ["\uC49F", "\uC49F"], /* Hangul Syllable */
+ ["\uC4A0", "\uC4A0"], /* Hangul Syllable */
+ ["\uC4A1", "\uC4A1"], /* Hangul Syllable */
+ ["\uC4A2", "\uC4A2"], /* Hangul Syllable */
+ ["\uC4A3", "\uC4A3"], /* Hangul Syllable */
+ ["\uC4A4", "\uC4A4"], /* Hangul Syllable */
+ ["\uC4A5", "\uC4A5"], /* Hangul Syllable */
+ ["\uC4A6", "\uC4A6"], /* Hangul Syllable */
+ ["\uC4A7", "\uC4A7"], /* Hangul Syllable */
+ ["\uC4A8", "\uC4A8"], /* Hangul Syllable */
+ ["\uC4A9", "\uC4A9"], /* Hangul Syllable */
+ ["\uC4AA", "\uC4AA"], /* Hangul Syllable */
+ ["\uC4AB", "\uC4AB"], /* Hangul Syllable */
+ ["\uC4AC", "\uC4AC"], /* Hangul Syllable */
+ ["\uC4AD", "\uC4AD"], /* Hangul Syllable */
+ ["\uC4AE", "\uC4AE"], /* Hangul Syllable */
+ ["\uC4AF", "\uC4AF"], /* Hangul Syllable */
+ ["\uC4B0", "\uC4B0"], /* Hangul Syllable */
+ ["\uC4B1", "\uC4B1"], /* Hangul Syllable */
+ ["\uC4B2", "\uC4B2"], /* Hangul Syllable */
+ ["\uC4B3", "\uC4B3"], /* Hangul Syllable */
+ ["\uC4B4", "\uC4B4"], /* Hangul Syllable */
+ ["\uC4B5", "\uC4B5"], /* Hangul Syllable */
+ ["\uC4B6", "\uC4B6"], /* Hangul Syllable */
+ ["\uC4B7", "\uC4B7"], /* Hangul Syllable */
+ ["\uC4B8", "\uC4B8"], /* Hangul Syllable */
+ ["\uC4B9", "\uC4B9"], /* Hangul Syllable */
+ ["\uC4BA", "\uC4BA"], /* Hangul Syllable */
+ ["\uC4BB", "\uC4BB"], /* Hangul Syllable */
+ ["\uC4BC", "\uC4BC"], /* Hangul Syllable */
+ ["\uC4BD", "\uC4BD"], /* Hangul Syllable */
+ ["\uC4BE", "\uC4BE"], /* Hangul Syllable */
+ ["\uC4BF", "\uC4BF"], /* Hangul Syllable */
+ ["\uC4C0", "\uC4C0"], /* Hangul Syllable */
+ ["\uC4C1", "\uC4C1"], /* Hangul Syllable */
+ ["\uC4C2", "\uC4C2"], /* Hangul Syllable */
+ ["\uC4C3", "\uC4C3"], /* Hangul Syllable */
+ ["\uC4C4", "\uC4C4"], /* Hangul Syllable */
+ ["\uC4C5", "\uC4C5"], /* Hangul Syllable */
+ ["\uC4C6", "\uC4C6"], /* Hangul Syllable */
+ ["\uC4C7", "\uC4C7"], /* Hangul Syllable */
+ ["\uC4C8", "\uC4C8"], /* Hangul Syllable */
+ ["\uC4C9", "\uC4C9"], /* Hangul Syllable */
+ ["\uC4CA", "\uC4CA"], /* Hangul Syllable */
+ ["\uC4CB", "\uC4CB"], /* Hangul Syllable */
+ ["\uC4CC", "\uC4CC"], /* Hangul Syllable */
+ ["\uC4CD", "\uC4CD"], /* Hangul Syllable */
+ ["\uC4CE", "\uC4CE"], /* Hangul Syllable */
+ ["\uC4CF", "\uC4CF"], /* Hangul Syllable */
+ ["\uC4D0", "\uC4D0"], /* Hangul Syllable */
+ ["\uC4D1", "\uC4D1"], /* Hangul Syllable */
+ ["\uC4D2", "\uC4D2"], /* Hangul Syllable */
+ ["\uC4D3", "\uC4D3"], /* Hangul Syllable */
+ ["\uC4D4", "\uC4D4"], /* Hangul Syllable */
+ ["\uC4D5", "\uC4D5"], /* Hangul Syllable */
+ ["\uC4D6", "\uC4D6"], /* Hangul Syllable */
+ ["\uC4D7", "\uC4D7"], /* Hangul Syllable */
+ ["\uC4D8", "\uC4D8"], /* Hangul Syllable */
+ ["\uC4D9", "\uC4D9"], /* Hangul Syllable */
+ ["\uC4DA", "\uC4DA"], /* Hangul Syllable */
+ ["\uC4DB", "\uC4DB"], /* Hangul Syllable */
+ ["\uC4DC", "\uC4DC"], /* Hangul Syllable */
+ ["\uC4DD", "\uC4DD"], /* Hangul Syllable */
+ ["\uC4DE", "\uC4DE"], /* Hangul Syllable */
+ ["\uC4DF", "\uC4DF"], /* Hangul Syllable */
+ ["\uC4E0", "\uC4E0"], /* Hangul Syllable */
+ ["\uC4E1", "\uC4E1"], /* Hangul Syllable */
+ ["\uC4E2", "\uC4E2"], /* Hangul Syllable */
+ ["\uC4E3", "\uC4E3"], /* Hangul Syllable */
+ ["\uC4E4", "\uC4E4"], /* Hangul Syllable */
+ ["\uC4E5", "\uC4E5"], /* Hangul Syllable */
+ ["\uC4E6", "\uC4E6"], /* Hangul Syllable */
+ ["\uC4E7", "\uC4E7"], /* Hangul Syllable */
+ ["\uC4E8", "\uC4E8"], /* Hangul Syllable */
+ ["\uC4E9", "\uC4E9"], /* Hangul Syllable */
+ ["\uC4EA", "\uC4EA"], /* Hangul Syllable */
+ ["\uC4EB", "\uC4EB"], /* Hangul Syllable */
+ ["\uC4EC", "\uC4EC"], /* Hangul Syllable */
+ ["\uC4ED", "\uC4ED"], /* Hangul Syllable */
+ ["\uC4EE", "\uC4EE"], /* Hangul Syllable */
+ ["\uC4EF", "\uC4EF"], /* Hangul Syllable */
+ ["\uC4F0", "\uC4F0"], /* Hangul Syllable */
+ ["\uC4F1", "\uC4F1"], /* Hangul Syllable */
+ ["\uC4F2", "\uC4F2"], /* Hangul Syllable */
+ ["\uC4F3", "\uC4F3"], /* Hangul Syllable */
+ ["\uC4F4", "\uC4F4"], /* Hangul Syllable */
+ ["\uC4F5", "\uC4F5"], /* Hangul Syllable */
+ ["\uC4F6", "\uC4F6"], /* Hangul Syllable */
+ ["\uC4F7", "\uC4F7"], /* Hangul Syllable */
+ ["\uC4F8", "\uC4F8"], /* Hangul Syllable */
+ ["\uC4F9", "\uC4F9"], /* Hangul Syllable */
+ ["\uC4FA", "\uC4FA"], /* Hangul Syllable */
+ ["\uC4FB", "\uC4FB"], /* Hangul Syllable */
+ ["\uC4FC", "\uC4FC"], /* Hangul Syllable */
+ ["\uC4FD", "\uC4FD"], /* Hangul Syllable */
+ ["\uC4FE", "\uC4FE"], /* Hangul Syllable */
+ ["\uC4FF", "\uC4FF"], /* Hangul Syllable */
+ ["\uC500", "\uC500"], /* Hangul Syllable */
+ ["\uC501", "\uC501"], /* Hangul Syllable */
+ ["\uC502", "\uC502"], /* Hangul Syllable */
+ ["\uC503", "\uC503"], /* Hangul Syllable */
+ ["\uC504", "\uC504"], /* Hangul Syllable */
+ ["\uC505", "\uC505"], /* Hangul Syllable */
+ ["\uC506", "\uC506"], /* Hangul Syllable */
+ ["\uC507", "\uC507"], /* Hangul Syllable */
+ ["\uC508", "\uC508"], /* Hangul Syllable */
+ ["\uC509", "\uC509"], /* Hangul Syllable */
+ ["\uC50A", "\uC50A"], /* Hangul Syllable */
+ ["\uC50B", "\uC50B"], /* Hangul Syllable */
+ ["\uC50C", "\uC50C"], /* Hangul Syllable */
+ ["\uC50D", "\uC50D"], /* Hangul Syllable */
+ ["\uC50E", "\uC50E"], /* Hangul Syllable */
+ ["\uC50F", "\uC50F"], /* Hangul Syllable */
+ ["\uC510", "\uC510"], /* Hangul Syllable */
+ ["\uC511", "\uC511"], /* Hangul Syllable */
+ ["\uC512", "\uC512"], /* Hangul Syllable */
+ ["\uC513", "\uC513"], /* Hangul Syllable */
+ ["\uC514", "\uC514"], /* Hangul Syllable */
+ ["\uC515", "\uC515"], /* Hangul Syllable */
+ ["\uC516", "\uC516"], /* Hangul Syllable */
+ ["\uC517", "\uC517"], /* Hangul Syllable */
+ ["\uC518", "\uC518"], /* Hangul Syllable */
+ ["\uC519", "\uC519"], /* Hangul Syllable */
+ ["\uC51A", "\uC51A"], /* Hangul Syllable */
+ ["\uC51B", "\uC51B"], /* Hangul Syllable */
+ ["\uC51C", "\uC51C"], /* Hangul Syllable */
+ ["\uC51D", "\uC51D"], /* Hangul Syllable */
+ ["\uC51E", "\uC51E"], /* Hangul Syllable */
+ ["\uC51F", "\uC51F"], /* Hangul Syllable */
+ ["\uC520", "\uC520"], /* Hangul Syllable */
+ ["\uC521", "\uC521"], /* Hangul Syllable */
+ ["\uC522", "\uC522"], /* Hangul Syllable */
+ ["\uC523", "\uC523"], /* Hangul Syllable */
+ ["\uC524", "\uC524"], /* Hangul Syllable */
+ ["\uC525", "\uC525"], /* Hangul Syllable */
+ ["\uC526", "\uC526"], /* Hangul Syllable */
+ ["\uC527", "\uC527"], /* Hangul Syllable */
+ ["\uC528", "\uC528"], /* Hangul Syllable */
+ ["\uC529", "\uC529"], /* Hangul Syllable */
+ ["\uC52A", "\uC52A"], /* Hangul Syllable */
+ ["\uC52B", "\uC52B"], /* Hangul Syllable */
+ ["\uC52C", "\uC52C"], /* Hangul Syllable */
+ ["\uC52D", "\uC52D"], /* Hangul Syllable */
+ ["\uC52E", "\uC52E"], /* Hangul Syllable */
+ ["\uC52F", "\uC52F"], /* Hangul Syllable */
+ ["\uC530", "\uC530"], /* Hangul Syllable */
+ ["\uC531", "\uC531"], /* Hangul Syllable */
+ ["\uC532", "\uC532"], /* Hangul Syllable */
+ ["\uC533", "\uC533"], /* Hangul Syllable */
+ ["\uC534", "\uC534"], /* Hangul Syllable */
+ ["\uC535", "\uC535"], /* Hangul Syllable */
+ ["\uC536", "\uC536"], /* Hangul Syllable */
+ ["\uC537", "\uC537"], /* Hangul Syllable */
+ ["\uC538", "\uC538"], /* Hangul Syllable */
+ ["\uC539", "\uC539"], /* Hangul Syllable */
+ ["\uC53A", "\uC53A"], /* Hangul Syllable */
+ ["\uC53B", "\uC53B"], /* Hangul Syllable */
+ ["\uC53C", "\uC53C"], /* Hangul Syllable */
+ ["\uC53D", "\uC53D"], /* Hangul Syllable */
+ ["\uC53E", "\uC53E"], /* Hangul Syllable */
+ ["\uC53F", "\uC53F"], /* Hangul Syllable */
+ ["\uC540", "\uC540"], /* Hangul Syllable */
+ ["\uC541", "\uC541"], /* Hangul Syllable */
+ ["\uC542", "\uC542"], /* Hangul Syllable */
+ ["\uC543", "\uC543"], /* Hangul Syllable */
+ ["\uC544", "\uC544"], /* Hangul Syllable */
+ ["\uC545", "\uC545"], /* Hangul Syllable */
+ ["\uC546", "\uC546"], /* Hangul Syllable */
+ ["\uC547", "\uC547"], /* Hangul Syllable */
+ ["\uC548", "\uC548"], /* Hangul Syllable */
+ ["\uC549", "\uC549"], /* Hangul Syllable */
+ ["\uC54A", "\uC54A"], /* Hangul Syllable */
+ ["\uC54B", "\uC54B"], /* Hangul Syllable */
+ ["\uC54C", "\uC54C"], /* Hangul Syllable */
+ ["\uC54D", "\uC54D"], /* Hangul Syllable */
+ ["\uC54E", "\uC54E"], /* Hangul Syllable */
+ ["\uC54F", "\uC54F"], /* Hangul Syllable */
+ ["\uC550", "\uC550"], /* Hangul Syllable */
+ ["\uC551", "\uC551"], /* Hangul Syllable */
+ ["\uC552", "\uC552"], /* Hangul Syllable */
+ ["\uC553", "\uC553"], /* Hangul Syllable */
+ ["\uC554", "\uC554"], /* Hangul Syllable */
+ ["\uC555", "\uC555"], /* Hangul Syllable */
+ ["\uC556", "\uC556"], /* Hangul Syllable */
+ ["\uC557", "\uC557"], /* Hangul Syllable */
+ ["\uC558", "\uC558"], /* Hangul Syllable */
+ ["\uC559", "\uC559"], /* Hangul Syllable */
+ ["\uC55A", "\uC55A"], /* Hangul Syllable */
+ ["\uC55B", "\uC55B"], /* Hangul Syllable */
+ ["\uC55C", "\uC55C"], /* Hangul Syllable */
+ ["\uC55D", "\uC55D"], /* Hangul Syllable */
+ ["\uC55E", "\uC55E"], /* Hangul Syllable */
+ ["\uC55F", "\uC55F"], /* Hangul Syllable */
+ ["\uC560", "\uC560"], /* Hangul Syllable */
+ ["\uC561", "\uC561"], /* Hangul Syllable */
+ ["\uC562", "\uC562"], /* Hangul Syllable */
+ ["\uC563", "\uC563"], /* Hangul Syllable */
+ ["\uC564", "\uC564"], /* Hangul Syllable */
+ ["\uC565", "\uC565"], /* Hangul Syllable */
+ ["\uC566", "\uC566"], /* Hangul Syllable */
+ ["\uC567", "\uC567"], /* Hangul Syllable */
+ ["\uC568", "\uC568"], /* Hangul Syllable */
+ ["\uC569", "\uC569"], /* Hangul Syllable */
+ ["\uC56A", "\uC56A"], /* Hangul Syllable */
+ ["\uC56B", "\uC56B"], /* Hangul Syllable */
+ ["\uC56C", "\uC56C"], /* Hangul Syllable */
+ ["\uC56D", "\uC56D"], /* Hangul Syllable */
+ ["\uC56E", "\uC56E"], /* Hangul Syllable */
+ ["\uC56F", "\uC56F"], /* Hangul Syllable */
+ ["\uC570", "\uC570"], /* Hangul Syllable */
+ ["\uC571", "\uC571"], /* Hangul Syllable */
+ ["\uC572", "\uC572"], /* Hangul Syllable */
+ ["\uC573", "\uC573"], /* Hangul Syllable */
+ ["\uC574", "\uC574"], /* Hangul Syllable */
+ ["\uC575", "\uC575"], /* Hangul Syllable */
+ ["\uC576", "\uC576"], /* Hangul Syllable */
+ ["\uC577", "\uC577"], /* Hangul Syllable */
+ ["\uC578", "\uC578"], /* Hangul Syllable */
+ ["\uC579", "\uC579"], /* Hangul Syllable */
+ ["\uC57A", "\uC57A"], /* Hangul Syllable */
+ ["\uC57B", "\uC57B"], /* Hangul Syllable */
+ ["\uC57C", "\uC57C"], /* Hangul Syllable */
+ ["\uC57D", "\uC57D"], /* Hangul Syllable */
+ ["\uC57E", "\uC57E"], /* Hangul Syllable */
+ ["\uC57F", "\uC57F"], /* Hangul Syllable */
+ ["\uC580", "\uC580"], /* Hangul Syllable */
+ ["\uC581", "\uC581"], /* Hangul Syllable */
+ ["\uC582", "\uC582"], /* Hangul Syllable */
+ ["\uC583", "\uC583"], /* Hangul Syllable */
+ ["\uC584", "\uC584"], /* Hangul Syllable */
+ ["\uC585", "\uC585"], /* Hangul Syllable */
+ ["\uC586", "\uC586"], /* Hangul Syllable */
+ ["\uC587", "\uC587"], /* Hangul Syllable */
+ ["\uC588", "\uC588"], /* Hangul Syllable */
+ ["\uC589", "\uC589"], /* Hangul Syllable */
+ ["\uC58A", "\uC58A"], /* Hangul Syllable */
+ ["\uC58B", "\uC58B"], /* Hangul Syllable */
+ ["\uC58C", "\uC58C"], /* Hangul Syllable */
+ ["\uC58D", "\uC58D"], /* Hangul Syllable */
+ ["\uC58E", "\uC58E"], /* Hangul Syllable */
+ ["\uC58F", "\uC58F"], /* Hangul Syllable */
+ ["\uC590", "\uC590"], /* Hangul Syllable */
+ ["\uC591", "\uC591"], /* Hangul Syllable */
+ ["\uC592", "\uC592"], /* Hangul Syllable */
+ ["\uC593", "\uC593"], /* Hangul Syllable */
+ ["\uC594", "\uC594"], /* Hangul Syllable */
+ ["\uC595", "\uC595"], /* Hangul Syllable */
+ ["\uC596", "\uC596"], /* Hangul Syllable */
+ ["\uC597", "\uC597"], /* Hangul Syllable */
+ ["\uC598", "\uC598"], /* Hangul Syllable */
+ ["\uC599", "\uC599"], /* Hangul Syllable */
+ ["\uC59A", "\uC59A"], /* Hangul Syllable */
+ ["\uC59B", "\uC59B"], /* Hangul Syllable */
+ ["\uC59C", "\uC59C"], /* Hangul Syllable */
+ ["\uC59D", "\uC59D"], /* Hangul Syllable */
+ ["\uC59E", "\uC59E"], /* Hangul Syllable */
+ ["\uC59F", "\uC59F"], /* Hangul Syllable */
+ ["\uC5A0", "\uC5A0"], /* Hangul Syllable */
+ ["\uC5A1", "\uC5A1"], /* Hangul Syllable */
+ ["\uC5A2", "\uC5A2"], /* Hangul Syllable */
+ ["\uC5A3", "\uC5A3"], /* Hangul Syllable */
+ ["\uC5A4", "\uC5A4"], /* Hangul Syllable */
+ ["\uC5A5", "\uC5A5"], /* Hangul Syllable */
+ ["\uC5A6", "\uC5A6"], /* Hangul Syllable */
+ ["\uC5A7", "\uC5A7"], /* Hangul Syllable */
+ ["\uC5A8", "\uC5A8"], /* Hangul Syllable */
+ ["\uC5A9", "\uC5A9"], /* Hangul Syllable */
+ ["\uC5AA", "\uC5AA"], /* Hangul Syllable */
+ ["\uC5AB", "\uC5AB"], /* Hangul Syllable */
+ ["\uC5AC", "\uC5AC"], /* Hangul Syllable */
+ ["\uC5AD", "\uC5AD"], /* Hangul Syllable */
+ ["\uC5AE", "\uC5AE"], /* Hangul Syllable */
+ ["\uC5AF", "\uC5AF"], /* Hangul Syllable */
+ ["\uC5B0", "\uC5B0"], /* Hangul Syllable */
+ ["\uC5B1", "\uC5B1"], /* Hangul Syllable */
+ ["\uC5B2", "\uC5B2"], /* Hangul Syllable */
+ ["\uC5B3", "\uC5B3"], /* Hangul Syllable */
+ ["\uC5B4", "\uC5B4"], /* Hangul Syllable */
+ ["\uC5B5", "\uC5B5"], /* Hangul Syllable */
+ ["\uC5B6", "\uC5B6"], /* Hangul Syllable */
+ ["\uC5B7", "\uC5B7"], /* Hangul Syllable */
+ ["\uC5B8", "\uC5B8"], /* Hangul Syllable */
+ ["\uC5B9", "\uC5B9"], /* Hangul Syllable */
+ ["\uC5BA", "\uC5BA"], /* Hangul Syllable */
+ ["\uC5BB", "\uC5BB"], /* Hangul Syllable */
+ ["\uC5BC", "\uC5BC"], /* Hangul Syllable */
+ ["\uC5BD", "\uC5BD"], /* Hangul Syllable */
+ ["\uC5BE", "\uC5BE"], /* Hangul Syllable */
+ ["\uC5BF", "\uC5BF"], /* Hangul Syllable */
+ ["\uC5C0", "\uC5C0"], /* Hangul Syllable */
+ ["\uC5C1", "\uC5C1"], /* Hangul Syllable */
+ ["\uC5C2", "\uC5C2"], /* Hangul Syllable */
+ ["\uC5C3", "\uC5C3"], /* Hangul Syllable */
+ ["\uC5C4", "\uC5C4"], /* Hangul Syllable */
+ ["\uC5C5", "\uC5C5"], /* Hangul Syllable */
+ ["\uC5C6", "\uC5C6"], /* Hangul Syllable */
+ ["\uC5C7", "\uC5C7"], /* Hangul Syllable */
+ ["\uC5C8", "\uC5C8"], /* Hangul Syllable */
+ ["\uC5C9", "\uC5C9"], /* Hangul Syllable */
+ ["\uC5CA", "\uC5CA"], /* Hangul Syllable */
+ ["\uC5CB", "\uC5CB"], /* Hangul Syllable */
+ ["\uC5CC", "\uC5CC"], /* Hangul Syllable */
+ ["\uC5CD", "\uC5CD"], /* Hangul Syllable */
+ ["\uC5CE", "\uC5CE"], /* Hangul Syllable */
+ ["\uC5CF", "\uC5CF"], /* Hangul Syllable */
+ ["\uC5D0", "\uC5D0"], /* Hangul Syllable */
+ ["\uC5D1", "\uC5D1"], /* Hangul Syllable */
+ ["\uC5D2", "\uC5D2"], /* Hangul Syllable */
+ ["\uC5D3", "\uC5D3"], /* Hangul Syllable */
+ ["\uC5D4", "\uC5D4"], /* Hangul Syllable */
+ ["\uC5D5", "\uC5D5"], /* Hangul Syllable */
+ ["\uC5D6", "\uC5D6"], /* Hangul Syllable */
+ ["\uC5D7", "\uC5D7"], /* Hangul Syllable */
+ ["\uC5D8", "\uC5D8"], /* Hangul Syllable */
+ ["\uC5D9", "\uC5D9"], /* Hangul Syllable */
+ ["\uC5DA", "\uC5DA"], /* Hangul Syllable */
+ ["\uC5DB", "\uC5DB"], /* Hangul Syllable */
+ ["\uC5DC", "\uC5DC"], /* Hangul Syllable */
+ ["\uC5DD", "\uC5DD"], /* Hangul Syllable */
+ ["\uC5DE", "\uC5DE"], /* Hangul Syllable */
+ ["\uC5DF", "\uC5DF"], /* Hangul Syllable */
+ ["\uC5E0", "\uC5E0"], /* Hangul Syllable */
+ ["\uC5E1", "\uC5E1"], /* Hangul Syllable */
+ ["\uC5E2", "\uC5E2"], /* Hangul Syllable */
+ ["\uC5E3", "\uC5E3"], /* Hangul Syllable */
+ ["\uC5E4", "\uC5E4"], /* Hangul Syllable */
+ ["\uC5E5", "\uC5E5"], /* Hangul Syllable */
+ ["\uC5E6", "\uC5E6"], /* Hangul Syllable */
+ ["\uC5E7", "\uC5E7"], /* Hangul Syllable */
+ ["\uC5E8", "\uC5E8"], /* Hangul Syllable */
+ ["\uC5E9", "\uC5E9"], /* Hangul Syllable */
+ ["\uC5EA", "\uC5EA"], /* Hangul Syllable */
+ ["\uC5EB", "\uC5EB"], /* Hangul Syllable */
+ ["\uC5EC", "\uC5EC"], /* Hangul Syllable */
+ ["\uC5ED", "\uC5ED"], /* Hangul Syllable */
+ ["\uC5EE", "\uC5EE"], /* Hangul Syllable */
+ ["\uC5EF", "\uC5EF"], /* Hangul Syllable */
+ ["\uC5F0", "\uC5F0"], /* Hangul Syllable */
+ ["\uC5F1", "\uC5F1"], /* Hangul Syllable */
+ ["\uC5F2", "\uC5F2"], /* Hangul Syllable */
+ ["\uC5F3", "\uC5F3"], /* Hangul Syllable */
+ ["\uC5F4", "\uC5F4"], /* Hangul Syllable */
+ ["\uC5F5", "\uC5F5"], /* Hangul Syllable */
+ ["\uC5F6", "\uC5F6"], /* Hangul Syllable */
+ ["\uC5F7", "\uC5F7"], /* Hangul Syllable */
+ ["\uC5F8", "\uC5F8"], /* Hangul Syllable */
+ ["\uC5F9", "\uC5F9"], /* Hangul Syllable */
+ ["\uC5FA", "\uC5FA"], /* Hangul Syllable */
+ ["\uC5FB", "\uC5FB"], /* Hangul Syllable */
+ ["\uC5FC", "\uC5FC"], /* Hangul Syllable */
+ ["\uC5FD", "\uC5FD"], /* Hangul Syllable */
+ ["\uC5FE", "\uC5FE"], /* Hangul Syllable */
+ ["\uC5FF", "\uC5FF"], /* Hangul Syllable */
+ ["\uC600", "\uC600"], /* Hangul Syllable */
+ ["\uC601", "\uC601"], /* Hangul Syllable */
+ ["\uC602", "\uC602"], /* Hangul Syllable */
+ ["\uC603", "\uC603"], /* Hangul Syllable */
+ ["\uC604", "\uC604"], /* Hangul Syllable */
+ ["\uC605", "\uC605"], /* Hangul Syllable */
+ ["\uC606", "\uC606"], /* Hangul Syllable */
+ ["\uC607", "\uC607"], /* Hangul Syllable */
+ ["\uC608", "\uC608"], /* Hangul Syllable */
+ ["\uC609", "\uC609"], /* Hangul Syllable */
+ ["\uC60A", "\uC60A"], /* Hangul Syllable */
+ ["\uC60B", "\uC60B"], /* Hangul Syllable */
+ ["\uC60C", "\uC60C"], /* Hangul Syllable */
+ ["\uC60D", "\uC60D"], /* Hangul Syllable */
+ ["\uC60E", "\uC60E"], /* Hangul Syllable */
+ ["\uC60F", "\uC60F"], /* Hangul Syllable */
+ ["\uC610", "\uC610"], /* Hangul Syllable */
+ ["\uC611", "\uC611"], /* Hangul Syllable */
+ ["\uC612", "\uC612"], /* Hangul Syllable */
+ ["\uC613", "\uC613"], /* Hangul Syllable */
+ ["\uC614", "\uC614"], /* Hangul Syllable */
+ ["\uC615", "\uC615"], /* Hangul Syllable */
+ ["\uC616", "\uC616"], /* Hangul Syllable */
+ ["\uC617", "\uC617"], /* Hangul Syllable */
+ ["\uC618", "\uC618"], /* Hangul Syllable */
+ ["\uC619", "\uC619"], /* Hangul Syllable */
+ ["\uC61A", "\uC61A"], /* Hangul Syllable */
+ ["\uC61B", "\uC61B"], /* Hangul Syllable */
+ ["\uC61C", "\uC61C"], /* Hangul Syllable */
+ ["\uC61D", "\uC61D"], /* Hangul Syllable */
+ ["\uC61E", "\uC61E"], /* Hangul Syllable */
+ ["\uC61F", "\uC61F"], /* Hangul Syllable */
+ ["\uC620", "\uC620"], /* Hangul Syllable */
+ ["\uC621", "\uC621"], /* Hangul Syllable */
+ ["\uC622", "\uC622"], /* Hangul Syllable */
+ ["\uC623", "\uC623"], /* Hangul Syllable */
+ ["\uC624", "\uC624"], /* Hangul Syllable */
+ ["\uC625", "\uC625"], /* Hangul Syllable */
+ ["\uC626", "\uC626"], /* Hangul Syllable */
+ ["\uC627", "\uC627"], /* Hangul Syllable */
+ ["\uC628", "\uC628"], /* Hangul Syllable */
+ ["\uC629", "\uC629"], /* Hangul Syllable */
+ ["\uC62A", "\uC62A"], /* Hangul Syllable */
+ ["\uC62B", "\uC62B"], /* Hangul Syllable */
+ ["\uC62C", "\uC62C"], /* Hangul Syllable */
+ ["\uC62D", "\uC62D"], /* Hangul Syllable */
+ ["\uC62E", "\uC62E"], /* Hangul Syllable */
+ ["\uC62F", "\uC62F"], /* Hangul Syllable */
+ ["\uC630", "\uC630"], /* Hangul Syllable */
+ ["\uC631", "\uC631"], /* Hangul Syllable */
+ ["\uC632", "\uC632"], /* Hangul Syllable */
+ ["\uC633", "\uC633"], /* Hangul Syllable */
+ ["\uC634", "\uC634"], /* Hangul Syllable */
+ ["\uC635", "\uC635"], /* Hangul Syllable */
+ ["\uC636", "\uC636"], /* Hangul Syllable */
+ ["\uC637", "\uC637"], /* Hangul Syllable */
+ ["\uC638", "\uC638"], /* Hangul Syllable */
+ ["\uC639", "\uC639"], /* Hangul Syllable */
+ ["\uC63A", "\uC63A"], /* Hangul Syllable */
+ ["\uC63B", "\uC63B"], /* Hangul Syllable */
+ ["\uC63C", "\uC63C"], /* Hangul Syllable */
+ ["\uC63D", "\uC63D"], /* Hangul Syllable */
+ ["\uC63E", "\uC63E"], /* Hangul Syllable */
+ ["\uC63F", "\uC63F"], /* Hangul Syllable */
+ ["\uC640", "\uC640"], /* Hangul Syllable */
+ ["\uC641", "\uC641"], /* Hangul Syllable */
+ ["\uC642", "\uC642"], /* Hangul Syllable */
+ ["\uC643", "\uC643"], /* Hangul Syllable */
+ ["\uC644", "\uC644"], /* Hangul Syllable */
+ ["\uC645", "\uC645"], /* Hangul Syllable */
+ ["\uC646", "\uC646"], /* Hangul Syllable */
+ ["\uC647", "\uC647"], /* Hangul Syllable */
+ ["\uC648", "\uC648"], /* Hangul Syllable */
+ ["\uC649", "\uC649"], /* Hangul Syllable */
+ ["\uC64A", "\uC64A"], /* Hangul Syllable */
+ ["\uC64B", "\uC64B"], /* Hangul Syllable */
+ ["\uC64C", "\uC64C"], /* Hangul Syllable */
+ ["\uC64D", "\uC64D"], /* Hangul Syllable */
+ ["\uC64E", "\uC64E"], /* Hangul Syllable */
+ ["\uC64F", "\uC64F"], /* Hangul Syllable */
+ ["\uC650", "\uC650"], /* Hangul Syllable */
+ ["\uC651", "\uC651"], /* Hangul Syllable */
+ ["\uC652", "\uC652"], /* Hangul Syllable */
+ ["\uC653", "\uC653"], /* Hangul Syllable */
+ ["\uC654", "\uC654"], /* Hangul Syllable */
+ ["\uC655", "\uC655"], /* Hangul Syllable */
+ ["\uC656", "\uC656"], /* Hangul Syllable */
+ ["\uC657", "\uC657"], /* Hangul Syllable */
+ ["\uC658", "\uC658"], /* Hangul Syllable */
+ ["\uC659", "\uC659"], /* Hangul Syllable */
+ ["\uC65A", "\uC65A"], /* Hangul Syllable */
+ ["\uC65B", "\uC65B"], /* Hangul Syllable */
+ ["\uC65C", "\uC65C"], /* Hangul Syllable */
+ ["\uC65D", "\uC65D"], /* Hangul Syllable */
+ ["\uC65E", "\uC65E"], /* Hangul Syllable */
+ ["\uC65F", "\uC65F"], /* Hangul Syllable */
+ ["\uC660", "\uC660"], /* Hangul Syllable */
+ ["\uC661", "\uC661"], /* Hangul Syllable */
+ ["\uC662", "\uC662"], /* Hangul Syllable */
+ ["\uC663", "\uC663"], /* Hangul Syllable */
+ ["\uC664", "\uC664"], /* Hangul Syllable */
+ ["\uC665", "\uC665"], /* Hangul Syllable */
+ ["\uC666", "\uC666"], /* Hangul Syllable */
+ ["\uC667", "\uC667"], /* Hangul Syllable */
+ ["\uC668", "\uC668"], /* Hangul Syllable */
+ ["\uC669", "\uC669"], /* Hangul Syllable */
+ ["\uC66A", "\uC66A"], /* Hangul Syllable */
+ ["\uC66B", "\uC66B"], /* Hangul Syllable */
+ ["\uC66C", "\uC66C"], /* Hangul Syllable */
+ ["\uC66D", "\uC66D"], /* Hangul Syllable */
+ ["\uC66E", "\uC66E"], /* Hangul Syllable */
+ ["\uC66F", "\uC66F"], /* Hangul Syllable */
+ ["\uC670", "\uC670"], /* Hangul Syllable */
+ ["\uC671", "\uC671"], /* Hangul Syllable */
+ ["\uC672", "\uC672"], /* Hangul Syllable */
+ ["\uC673", "\uC673"], /* Hangul Syllable */
+ ["\uC674", "\uC674"], /* Hangul Syllable */
+ ["\uC675", "\uC675"], /* Hangul Syllable */
+ ["\uC676", "\uC676"], /* Hangul Syllable */
+ ["\uC677", "\uC677"], /* Hangul Syllable */
+ ["\uC678", "\uC678"], /* Hangul Syllable */
+ ["\uC679", "\uC679"], /* Hangul Syllable */
+ ["\uC67A", "\uC67A"], /* Hangul Syllable */
+ ["\uC67B", "\uC67B"], /* Hangul Syllable */
+ ["\uC67C", "\uC67C"], /* Hangul Syllable */
+ ["\uC67D", "\uC67D"], /* Hangul Syllable */
+ ["\uC67E", "\uC67E"], /* Hangul Syllable */
+ ["\uC67F", "\uC67F"], /* Hangul Syllable */
+ ["\uC680", "\uC680"], /* Hangul Syllable */
+ ["\uC681", "\uC681"], /* Hangul Syllable */
+ ["\uC682", "\uC682"], /* Hangul Syllable */
+ ["\uC683", "\uC683"], /* Hangul Syllable */
+ ["\uC684", "\uC684"], /* Hangul Syllable */
+ ["\uC685", "\uC685"], /* Hangul Syllable */
+ ["\uC686", "\uC686"], /* Hangul Syllable */
+ ["\uC687", "\uC687"], /* Hangul Syllable */
+ ["\uC688", "\uC688"], /* Hangul Syllable */
+ ["\uC689", "\uC689"], /* Hangul Syllable */
+ ["\uC68A", "\uC68A"], /* Hangul Syllable */
+ ["\uC68B", "\uC68B"], /* Hangul Syllable */
+ ["\uC68C", "\uC68C"], /* Hangul Syllable */
+ ["\uC68D", "\uC68D"], /* Hangul Syllable */
+ ["\uC68E", "\uC68E"], /* Hangul Syllable */
+ ["\uC68F", "\uC68F"], /* Hangul Syllable */
+ ["\uC690", "\uC690"], /* Hangul Syllable */
+ ["\uC691", "\uC691"], /* Hangul Syllable */
+ ["\uC692", "\uC692"], /* Hangul Syllable */
+ ["\uC693", "\uC693"], /* Hangul Syllable */
+ ["\uC694", "\uC694"], /* Hangul Syllable */
+ ["\uC695", "\uC695"], /* Hangul Syllable */
+ ["\uC696", "\uC696"], /* Hangul Syllable */
+ ["\uC697", "\uC697"], /* Hangul Syllable */
+ ["\uC698", "\uC698"], /* Hangul Syllable */
+ ["\uC699", "\uC699"], /* Hangul Syllable */
+ ["\uC69A", "\uC69A"], /* Hangul Syllable */
+ ["\uC69B", "\uC69B"], /* Hangul Syllable */
+ ["\uC69C", "\uC69C"], /* Hangul Syllable */
+ ["\uC69D", "\uC69D"], /* Hangul Syllable */
+ ["\uC69E", "\uC69E"], /* Hangul Syllable */
+ ["\uC69F", "\uC69F"], /* Hangul Syllable */
+ ["\uC6A0", "\uC6A0"], /* Hangul Syllable */
+ ["\uC6A1", "\uC6A1"], /* Hangul Syllable */
+ ["\uC6A2", "\uC6A2"], /* Hangul Syllable */
+ ["\uC6A3", "\uC6A3"], /* Hangul Syllable */
+ ["\uC6A4", "\uC6A4"], /* Hangul Syllable */
+ ["\uC6A5", "\uC6A5"], /* Hangul Syllable */
+ ["\uC6A6", "\uC6A6"], /* Hangul Syllable */
+ ["\uC6A7", "\uC6A7"], /* Hangul Syllable */
+ ["\uC6A8", "\uC6A8"], /* Hangul Syllable */
+ ["\uC6A9", "\uC6A9"], /* Hangul Syllable */
+ ["\uC6AA", "\uC6AA"], /* Hangul Syllable */
+ ["\uC6AB", "\uC6AB"], /* Hangul Syllable */
+ ["\uC6AC", "\uC6AC"], /* Hangul Syllable */
+ ["\uC6AD", "\uC6AD"], /* Hangul Syllable */
+ ["\uC6AE", "\uC6AE"], /* Hangul Syllable */
+ ["\uC6AF", "\uC6AF"], /* Hangul Syllable */
+ ["\uC6B0", "\uC6B0"], /* Hangul Syllable */
+ ["\uC6B1", "\uC6B1"], /* Hangul Syllable */
+ ["\uC6B2", "\uC6B2"], /* Hangul Syllable */
+ ["\uC6B3", "\uC6B3"], /* Hangul Syllable */
+ ["\uC6B4", "\uC6B4"], /* Hangul Syllable */
+ ["\uC6B5", "\uC6B5"], /* Hangul Syllable */
+ ["\uC6B6", "\uC6B6"], /* Hangul Syllable */
+ ["\uC6B7", "\uC6B7"], /* Hangul Syllable */
+ ["\uC6B8", "\uC6B8"], /* Hangul Syllable */
+ ["\uC6B9", "\uC6B9"], /* Hangul Syllable */
+ ["\uC6BA", "\uC6BA"], /* Hangul Syllable */
+ ["\uC6BB", "\uC6BB"], /* Hangul Syllable */
+ ["\uC6BC", "\uC6BC"], /* Hangul Syllable */
+ ["\uC6BD", "\uC6BD"], /* Hangul Syllable */
+ ["\uC6BE", "\uC6BE"], /* Hangul Syllable */
+ ["\uC6BF", "\uC6BF"], /* Hangul Syllable */
+ ["\uC6C0", "\uC6C0"], /* Hangul Syllable */
+ ["\uC6C1", "\uC6C1"], /* Hangul Syllable */
+ ["\uC6C2", "\uC6C2"], /* Hangul Syllable */
+ ["\uC6C3", "\uC6C3"], /* Hangul Syllable */
+ ["\uC6C4", "\uC6C4"], /* Hangul Syllable */
+ ["\uC6C5", "\uC6C5"], /* Hangul Syllable */
+ ["\uC6C6", "\uC6C6"], /* Hangul Syllable */
+ ["\uC6C7", "\uC6C7"], /* Hangul Syllable */
+ ["\uC6C8", "\uC6C8"], /* Hangul Syllable */
+ ["\uC6C9", "\uC6C9"], /* Hangul Syllable */
+ ["\uC6CA", "\uC6CA"], /* Hangul Syllable */
+ ["\uC6CB", "\uC6CB"], /* Hangul Syllable */
+ ["\uC6CC", "\uC6CC"], /* Hangul Syllable */
+ ["\uC6CD", "\uC6CD"], /* Hangul Syllable */
+ ["\uC6CE", "\uC6CE"], /* Hangul Syllable */
+ ["\uC6CF", "\uC6CF"], /* Hangul Syllable */
+ ["\uC6D0", "\uC6D0"], /* Hangul Syllable */
+ ["\uC6D1", "\uC6D1"], /* Hangul Syllable */
+ ["\uC6D2", "\uC6D2"], /* Hangul Syllable */
+ ["\uC6D3", "\uC6D3"], /* Hangul Syllable */
+ ["\uC6D4", "\uC6D4"], /* Hangul Syllable */
+ ["\uC6D5", "\uC6D5"], /* Hangul Syllable */
+ ["\uC6D6", "\uC6D6"], /* Hangul Syllable */
+ ["\uC6D7", "\uC6D7"], /* Hangul Syllable */
+ ["\uC6D8", "\uC6D8"], /* Hangul Syllable */
+ ["\uC6D9", "\uC6D9"], /* Hangul Syllable */
+ ["\uC6DA", "\uC6DA"], /* Hangul Syllable */
+ ["\uC6DB", "\uC6DB"], /* Hangul Syllable */
+ ["\uC6DC", "\uC6DC"], /* Hangul Syllable */
+ ["\uC6DD", "\uC6DD"], /* Hangul Syllable */
+ ["\uC6DE", "\uC6DE"], /* Hangul Syllable */
+ ["\uC6DF", "\uC6DF"], /* Hangul Syllable */
+ ["\uC6E0", "\uC6E0"], /* Hangul Syllable */
+ ["\uC6E1", "\uC6E1"], /* Hangul Syllable */
+ ["\uC6E2", "\uC6E2"], /* Hangul Syllable */
+ ["\uC6E3", "\uC6E3"], /* Hangul Syllable */
+ ["\uC6E4", "\uC6E4"], /* Hangul Syllable */
+ ["\uC6E5", "\uC6E5"], /* Hangul Syllable */
+ ["\uC6E6", "\uC6E6"], /* Hangul Syllable */
+ ["\uC6E7", "\uC6E7"], /* Hangul Syllable */
+ ["\uC6E8", "\uC6E8"], /* Hangul Syllable */
+ ["\uC6E9", "\uC6E9"], /* Hangul Syllable */
+ ["\uC6EA", "\uC6EA"], /* Hangul Syllable */
+ ["\uC6EB", "\uC6EB"], /* Hangul Syllable */
+ ["\uC6EC", "\uC6EC"], /* Hangul Syllable */
+ ["\uC6ED", "\uC6ED"], /* Hangul Syllable */
+ ["\uC6EE", "\uC6EE"], /* Hangul Syllable */
+ ["\uC6EF", "\uC6EF"], /* Hangul Syllable */
+ ["\uC6F0", "\uC6F0"], /* Hangul Syllable */
+ ["\uC6F1", "\uC6F1"], /* Hangul Syllable */
+ ["\uC6F2", "\uC6F2"], /* Hangul Syllable */
+ ["\uC6F3", "\uC6F3"], /* Hangul Syllable */
+ ["\uC6F4", "\uC6F4"], /* Hangul Syllable */
+ ["\uC6F5", "\uC6F5"], /* Hangul Syllable */
+ ["\uC6F6", "\uC6F6"], /* Hangul Syllable */
+ ["\uC6F7", "\uC6F7"], /* Hangul Syllable */
+ ["\uC6F8", "\uC6F8"], /* Hangul Syllable */
+ ["\uC6F9", "\uC6F9"], /* Hangul Syllable */
+ ["\uC6FA", "\uC6FA"], /* Hangul Syllable */
+ ["\uC6FB", "\uC6FB"], /* Hangul Syllable */
+ ["\uC6FC", "\uC6FC"], /* Hangul Syllable */
+ ["\uC6FD", "\uC6FD"], /* Hangul Syllable */
+ ["\uC6FE", "\uC6FE"], /* Hangul Syllable */
+ ["\uC6FF", "\uC6FF"], /* Hangul Syllable */
+ ["\uC700", "\uC700"], /* Hangul Syllable */
+ ["\uC701", "\uC701"], /* Hangul Syllable */
+ ["\uC702", "\uC702"], /* Hangul Syllable */
+ ["\uC703", "\uC703"], /* Hangul Syllable */
+ ["\uC704", "\uC704"], /* Hangul Syllable */
+ ["\uC705", "\uC705"], /* Hangul Syllable */
+ ["\uC706", "\uC706"], /* Hangul Syllable */
+ ["\uC707", "\uC707"], /* Hangul Syllable */
+ ["\uC708", "\uC708"], /* Hangul Syllable */
+ ["\uC709", "\uC709"], /* Hangul Syllable */
+ ["\uC70A", "\uC70A"], /* Hangul Syllable */
+ ["\uC70B", "\uC70B"], /* Hangul Syllable */
+ ["\uC70C", "\uC70C"], /* Hangul Syllable */
+ ["\uC70D", "\uC70D"], /* Hangul Syllable */
+ ["\uC70E", "\uC70E"], /* Hangul Syllable */
+ ["\uC70F", "\uC70F"], /* Hangul Syllable */
+ ["\uC710", "\uC710"], /* Hangul Syllable */
+ ["\uC711", "\uC711"], /* Hangul Syllable */
+ ["\uC712", "\uC712"], /* Hangul Syllable */
+ ["\uC713", "\uC713"], /* Hangul Syllable */
+ ["\uC714", "\uC714"], /* Hangul Syllable */
+ ["\uC715", "\uC715"], /* Hangul Syllable */
+ ["\uC716", "\uC716"], /* Hangul Syllable */
+ ["\uC717", "\uC717"], /* Hangul Syllable */
+ ["\uC718", "\uC718"], /* Hangul Syllable */
+ ["\uC719", "\uC719"], /* Hangul Syllable */
+ ["\uC71A", "\uC71A"], /* Hangul Syllable */
+ ["\uC71B", "\uC71B"], /* Hangul Syllable */
+ ["\uC71C", "\uC71C"], /* Hangul Syllable */
+ ["\uC71D", "\uC71D"], /* Hangul Syllable */
+ ["\uC71E", "\uC71E"], /* Hangul Syllable */
+ ["\uC71F", "\uC71F"], /* Hangul Syllable */
+ ["\uC720", "\uC720"], /* Hangul Syllable */
+ ["\uC721", "\uC721"], /* Hangul Syllable */
+ ["\uC722", "\uC722"], /* Hangul Syllable */
+ ["\uC723", "\uC723"], /* Hangul Syllable */
+ ["\uC724", "\uC724"], /* Hangul Syllable */
+ ["\uC725", "\uC725"], /* Hangul Syllable */
+ ["\uC726", "\uC726"], /* Hangul Syllable */
+ ["\uC727", "\uC727"], /* Hangul Syllable */
+ ["\uC728", "\uC728"], /* Hangul Syllable */
+ ["\uC729", "\uC729"], /* Hangul Syllable */
+ ["\uC72A", "\uC72A"], /* Hangul Syllable */
+ ["\uC72B", "\uC72B"], /* Hangul Syllable */
+ ["\uC72C", "\uC72C"], /* Hangul Syllable */
+ ["\uC72D", "\uC72D"], /* Hangul Syllable */
+ ["\uC72E", "\uC72E"], /* Hangul Syllable */
+ ["\uC72F", "\uC72F"], /* Hangul Syllable */
+ ["\uC730", "\uC730"], /* Hangul Syllable */
+ ["\uC731", "\uC731"], /* Hangul Syllable */
+ ["\uC732", "\uC732"], /* Hangul Syllable */
+ ["\uC733", "\uC733"], /* Hangul Syllable */
+ ["\uC734", "\uC734"], /* Hangul Syllable */
+ ["\uC735", "\uC735"], /* Hangul Syllable */
+ ["\uC736", "\uC736"], /* Hangul Syllable */
+ ["\uC737", "\uC737"], /* Hangul Syllable */
+ ["\uC738", "\uC738"], /* Hangul Syllable */
+ ["\uC739", "\uC739"], /* Hangul Syllable */
+ ["\uC73A", "\uC73A"], /* Hangul Syllable */
+ ["\uC73B", "\uC73B"], /* Hangul Syllable */
+ ["\uC73C", "\uC73C"], /* Hangul Syllable */
+ ["\uC73D", "\uC73D"], /* Hangul Syllable */
+ ["\uC73E", "\uC73E"], /* Hangul Syllable */
+ ["\uC73F", "\uC73F"], /* Hangul Syllable */
+ ["\uC740", "\uC740"], /* Hangul Syllable */
+ ["\uC741", "\uC741"], /* Hangul Syllable */
+ ["\uC742", "\uC742"], /* Hangul Syllable */
+ ["\uC743", "\uC743"], /* Hangul Syllable */
+ ["\uC744", "\uC744"], /* Hangul Syllable */
+ ["\uC745", "\uC745"], /* Hangul Syllable */
+ ["\uC746", "\uC746"], /* Hangul Syllable */
+ ["\uC747", "\uC747"], /* Hangul Syllable */
+ ["\uC748", "\uC748"], /* Hangul Syllable */
+ ["\uC749", "\uC749"], /* Hangul Syllable */
+ ["\uC74A", "\uC74A"], /* Hangul Syllable */
+ ["\uC74B", "\uC74B"], /* Hangul Syllable */
+ ["\uC74C", "\uC74C"], /* Hangul Syllable */
+ ["\uC74D", "\uC74D"], /* Hangul Syllable */
+ ["\uC74E", "\uC74E"], /* Hangul Syllable */
+ ["\uC74F", "\uC74F"], /* Hangul Syllable */
+ ["\uC750", "\uC750"], /* Hangul Syllable */
+ ["\uC751", "\uC751"], /* Hangul Syllable */
+ ["\uC752", "\uC752"], /* Hangul Syllable */
+ ["\uC753", "\uC753"], /* Hangul Syllable */
+ ["\uC754", "\uC754"], /* Hangul Syllable */
+ ["\uC755", "\uC755"], /* Hangul Syllable */
+ ["\uC756", "\uC756"], /* Hangul Syllable */
+ ["\uC757", "\uC757"], /* Hangul Syllable */
+ ["\uC758", "\uC758"], /* Hangul Syllable */
+ ["\uC759", "\uC759"], /* Hangul Syllable */
+ ["\uC75A", "\uC75A"], /* Hangul Syllable */
+ ["\uC75B", "\uC75B"], /* Hangul Syllable */
+ ["\uC75C", "\uC75C"], /* Hangul Syllable */
+ ["\uC75D", "\uC75D"], /* Hangul Syllable */
+ ["\uC75E", "\uC75E"], /* Hangul Syllable */
+ ["\uC75F", "\uC75F"], /* Hangul Syllable */
+ ["\uC760", "\uC760"], /* Hangul Syllable */
+ ["\uC761", "\uC761"], /* Hangul Syllable */
+ ["\uC762", "\uC762"], /* Hangul Syllable */
+ ["\uC763", "\uC763"], /* Hangul Syllable */
+ ["\uC764", "\uC764"], /* Hangul Syllable */
+ ["\uC765", "\uC765"], /* Hangul Syllable */
+ ["\uC766", "\uC766"], /* Hangul Syllable */
+ ["\uC767", "\uC767"], /* Hangul Syllable */
+ ["\uC768", "\uC768"], /* Hangul Syllable */
+ ["\uC769", "\uC769"], /* Hangul Syllable */
+ ["\uC76A", "\uC76A"], /* Hangul Syllable */
+ ["\uC76B", "\uC76B"], /* Hangul Syllable */
+ ["\uC76C", "\uC76C"], /* Hangul Syllable */
+ ["\uC76D", "\uC76D"], /* Hangul Syllable */
+ ["\uC76E", "\uC76E"], /* Hangul Syllable */
+ ["\uC76F", "\uC76F"], /* Hangul Syllable */
+ ["\uC770", "\uC770"], /* Hangul Syllable */
+ ["\uC771", "\uC771"], /* Hangul Syllable */
+ ["\uC772", "\uC772"], /* Hangul Syllable */
+ ["\uC773", "\uC773"], /* Hangul Syllable */
+ ["\uC774", "\uC774"], /* Hangul Syllable */
+ ["\uC775", "\uC775"], /* Hangul Syllable */
+ ["\uC776", "\uC776"], /* Hangul Syllable */
+ ["\uC777", "\uC777"], /* Hangul Syllable */
+ ["\uC778", "\uC778"], /* Hangul Syllable */
+ ["\uC779", "\uC779"], /* Hangul Syllable */
+ ["\uC77A", "\uC77A"], /* Hangul Syllable */
+ ["\uC77B", "\uC77B"], /* Hangul Syllable */
+ ["\uC77C", "\uC77C"], /* Hangul Syllable */
+ ["\uC77D", "\uC77D"], /* Hangul Syllable */
+ ["\uC77E", "\uC77E"], /* Hangul Syllable */
+ ["\uC77F", "\uC77F"], /* Hangul Syllable */
+ ["\uC780", "\uC780"], /* Hangul Syllable */
+ ["\uC781", "\uC781"], /* Hangul Syllable */
+ ["\uC782", "\uC782"], /* Hangul Syllable */
+ ["\uC783", "\uC783"], /* Hangul Syllable */
+ ["\uC784", "\uC784"], /* Hangul Syllable */
+ ["\uC785", "\uC785"], /* Hangul Syllable */
+ ["\uC786", "\uC786"], /* Hangul Syllable */
+ ["\uC787", "\uC787"], /* Hangul Syllable */
+ ["\uC788", "\uC788"], /* Hangul Syllable */
+ ["\uC789", "\uC789"], /* Hangul Syllable */
+ ["\uC78A", "\uC78A"], /* Hangul Syllable */
+ ["\uC78B", "\uC78B"], /* Hangul Syllable */
+ ["\uC78C", "\uC78C"], /* Hangul Syllable */
+ ["\uC78D", "\uC78D"], /* Hangul Syllable */
+ ["\uC78E", "\uC78E"], /* Hangul Syllable */
+ ["\uC78F", "\uC78F"], /* Hangul Syllable */
+ ["\uC790", "\uC790"], /* Hangul Syllable */
+ ["\uC791", "\uC791"], /* Hangul Syllable */
+ ["\uC792", "\uC792"], /* Hangul Syllable */
+ ["\uC793", "\uC793"], /* Hangul Syllable */
+ ["\uC794", "\uC794"], /* Hangul Syllable */
+ ["\uC795", "\uC795"], /* Hangul Syllable */
+ ["\uC796", "\uC796"], /* Hangul Syllable */
+ ["\uC797", "\uC797"], /* Hangul Syllable */
+ ["\uC798", "\uC798"], /* Hangul Syllable */
+ ["\uC799", "\uC799"], /* Hangul Syllable */
+ ["\uC79A", "\uC79A"], /* Hangul Syllable */
+ ["\uC79B", "\uC79B"], /* Hangul Syllable */
+ ["\uC79C", "\uC79C"], /* Hangul Syllable */
+ ["\uC79D", "\uC79D"], /* Hangul Syllable */
+ ["\uC79E", "\uC79E"], /* Hangul Syllable */
+ ["\uC79F", "\uC79F"], /* Hangul Syllable */
+ ["\uC7A0", "\uC7A0"], /* Hangul Syllable */
+ ["\uC7A1", "\uC7A1"], /* Hangul Syllable */
+ ["\uC7A2", "\uC7A2"], /* Hangul Syllable */
+ ["\uC7A3", "\uC7A3"], /* Hangul Syllable */
+ ["\uC7A4", "\uC7A4"], /* Hangul Syllable */
+ ["\uC7A5", "\uC7A5"], /* Hangul Syllable */
+ ["\uC7A6", "\uC7A6"], /* Hangul Syllable */
+ ["\uC7A7", "\uC7A7"], /* Hangul Syllable */
+ ["\uC7A8", "\uC7A8"], /* Hangul Syllable */
+ ["\uC7A9", "\uC7A9"], /* Hangul Syllable */
+ ["\uC7AA", "\uC7AA"], /* Hangul Syllable */
+ ["\uC7AB", "\uC7AB"], /* Hangul Syllable */
+ ["\uC7AC", "\uC7AC"], /* Hangul Syllable */
+ ["\uC7AD", "\uC7AD"], /* Hangul Syllable */
+ ["\uC7AE", "\uC7AE"], /* Hangul Syllable */
+ ["\uC7AF", "\uC7AF"], /* Hangul Syllable */
+ ["\uC7B0", "\uC7B0"], /* Hangul Syllable */
+ ["\uC7B1", "\uC7B1"], /* Hangul Syllable */
+ ["\uC7B2", "\uC7B2"], /* Hangul Syllable */
+ ["\uC7B3", "\uC7B3"], /* Hangul Syllable */
+ ["\uC7B4", "\uC7B4"], /* Hangul Syllable */
+ ["\uC7B5", "\uC7B5"], /* Hangul Syllable */
+ ["\uC7B6", "\uC7B6"], /* Hangul Syllable */
+ ["\uC7B7", "\uC7B7"], /* Hangul Syllable */
+ ["\uC7B8", "\uC7B8"], /* Hangul Syllable */
+ ["\uC7B9", "\uC7B9"], /* Hangul Syllable */
+ ["\uC7BA", "\uC7BA"], /* Hangul Syllable */
+ ["\uC7BB", "\uC7BB"], /* Hangul Syllable */
+ ["\uC7BC", "\uC7BC"], /* Hangul Syllable */
+ ["\uC7BD", "\uC7BD"], /* Hangul Syllable */
+ ["\uC7BE", "\uC7BE"], /* Hangul Syllable */
+ ["\uC7BF", "\uC7BF"], /* Hangul Syllable */
+ ["\uC7C0", "\uC7C0"], /* Hangul Syllable */
+ ["\uC7C1", "\uC7C1"], /* Hangul Syllable */
+ ["\uC7C2", "\uC7C2"], /* Hangul Syllable */
+ ["\uC7C3", "\uC7C3"], /* Hangul Syllable */
+ ["\uC7C4", "\uC7C4"], /* Hangul Syllable */
+ ["\uC7C5", "\uC7C5"], /* Hangul Syllable */
+ ["\uC7C6", "\uC7C6"], /* Hangul Syllable */
+ ["\uC7C7", "\uC7C7"], /* Hangul Syllable */
+ ["\uC7C8", "\uC7C8"], /* Hangul Syllable */
+ ["\uC7C9", "\uC7C9"], /* Hangul Syllable */
+ ["\uC7CA", "\uC7CA"], /* Hangul Syllable */
+ ["\uC7CB", "\uC7CB"], /* Hangul Syllable */
+ ["\uC7CC", "\uC7CC"], /* Hangul Syllable */
+ ["\uC7CD", "\uC7CD"], /* Hangul Syllable */
+ ["\uC7CE", "\uC7CE"], /* Hangul Syllable */
+ ["\uC7CF", "\uC7CF"], /* Hangul Syllable */
+ ["\uC7D0", "\uC7D0"], /* Hangul Syllable */
+ ["\uC7D1", "\uC7D1"], /* Hangul Syllable */
+ ["\uC7D2", "\uC7D2"], /* Hangul Syllable */
+ ["\uC7D3", "\uC7D3"], /* Hangul Syllable */
+ ["\uC7D4", "\uC7D4"], /* Hangul Syllable */
+ ["\uC7D5", "\uC7D5"], /* Hangul Syllable */
+ ["\uC7D6", "\uC7D6"], /* Hangul Syllable */
+ ["\uC7D7", "\uC7D7"], /* Hangul Syllable */
+ ["\uC7D8", "\uC7D8"], /* Hangul Syllable */
+ ["\uC7D9", "\uC7D9"], /* Hangul Syllable */
+ ["\uC7DA", "\uC7DA"], /* Hangul Syllable */
+ ["\uC7DB", "\uC7DB"], /* Hangul Syllable */
+ ["\uC7DC", "\uC7DC"], /* Hangul Syllable */
+ ["\uC7DD", "\uC7DD"], /* Hangul Syllable */
+ ["\uC7DE", "\uC7DE"], /* Hangul Syllable */
+ ["\uC7DF", "\uC7DF"], /* Hangul Syllable */
+ ["\uC7E0", "\uC7E0"], /* Hangul Syllable */
+ ["\uC7E1", "\uC7E1"], /* Hangul Syllable */
+ ["\uC7E2", "\uC7E2"], /* Hangul Syllable */
+ ["\uC7E3", "\uC7E3"], /* Hangul Syllable */
+ ["\uC7E4", "\uC7E4"], /* Hangul Syllable */
+ ["\uC7E5", "\uC7E5"], /* Hangul Syllable */
+ ["\uC7E6", "\uC7E6"], /* Hangul Syllable */
+ ["\uC7E7", "\uC7E7"], /* Hangul Syllable */
+ ["\uC7E8", "\uC7E8"], /* Hangul Syllable */
+ ["\uC7E9", "\uC7E9"], /* Hangul Syllable */
+ ["\uC7EA", "\uC7EA"], /* Hangul Syllable */
+ ["\uC7EB", "\uC7EB"], /* Hangul Syllable */
+ ["\uC7EC", "\uC7EC"], /* Hangul Syllable */
+ ["\uC7ED", "\uC7ED"], /* Hangul Syllable */
+ ["\uC7EE", "\uC7EE"], /* Hangul Syllable */
+ ["\uC7EF", "\uC7EF"], /* Hangul Syllable */
+ ["\uC7F0", "\uC7F0"], /* Hangul Syllable */
+ ["\uC7F1", "\uC7F1"], /* Hangul Syllable */
+ ["\uC7F2", "\uC7F2"], /* Hangul Syllable */
+ ["\uC7F3", "\uC7F3"], /* Hangul Syllable */
+ ["\uC7F4", "\uC7F4"], /* Hangul Syllable */
+ ["\uC7F5", "\uC7F5"], /* Hangul Syllable */
+ ["\uC7F6", "\uC7F6"], /* Hangul Syllable */
+ ["\uC7F7", "\uC7F7"], /* Hangul Syllable */
+ ["\uC7F8", "\uC7F8"], /* Hangul Syllable */
+ ["\uC7F9", "\uC7F9"], /* Hangul Syllable */
+ ["\uC7FA", "\uC7FA"], /* Hangul Syllable */
+ ["\uC7FB", "\uC7FB"], /* Hangul Syllable */
+ ["\uC7FC", "\uC7FC"], /* Hangul Syllable */
+ ["\uC7FD", "\uC7FD"], /* Hangul Syllable */
+ ["\uC7FE", "\uC7FE"], /* Hangul Syllable */
+ ["\uC7FF", "\uC7FF"], /* Hangul Syllable */
+ ["\uC800", "\uC800"], /* Hangul Syllable */
+ ["\uC801", "\uC801"], /* Hangul Syllable */
+ ["\uC802", "\uC802"], /* Hangul Syllable */
+ ["\uC803", "\uC803"], /* Hangul Syllable */
+ ["\uC804", "\uC804"], /* Hangul Syllable */
+ ["\uC805", "\uC805"], /* Hangul Syllable */
+ ["\uC806", "\uC806"], /* Hangul Syllable */
+ ["\uC807", "\uC807"], /* Hangul Syllable */
+ ["\uC808", "\uC808"], /* Hangul Syllable */
+ ["\uC809", "\uC809"], /* Hangul Syllable */
+ ["\uC80A", "\uC80A"], /* Hangul Syllable */
+ ["\uC80B", "\uC80B"], /* Hangul Syllable */
+ ["\uC80C", "\uC80C"], /* Hangul Syllable */
+ ["\uC80D", "\uC80D"], /* Hangul Syllable */
+ ["\uC80E", "\uC80E"], /* Hangul Syllable */
+ ["\uC80F", "\uC80F"], /* Hangul Syllable */
+ ["\uC810", "\uC810"], /* Hangul Syllable */
+ ["\uC811", "\uC811"], /* Hangul Syllable */
+ ["\uC812", "\uC812"], /* Hangul Syllable */
+ ["\uC813", "\uC813"], /* Hangul Syllable */
+ ["\uC814", "\uC814"], /* Hangul Syllable */
+ ["\uC815", "\uC815"], /* Hangul Syllable */
+ ["\uC816", "\uC816"], /* Hangul Syllable */
+ ["\uC817", "\uC817"], /* Hangul Syllable */
+ ["\uC818", "\uC818"], /* Hangul Syllable */
+ ["\uC819", "\uC819"], /* Hangul Syllable */
+ ["\uC81A", "\uC81A"], /* Hangul Syllable */
+ ["\uC81B", "\uC81B"], /* Hangul Syllable */
+ ["\uC81C", "\uC81C"], /* Hangul Syllable */
+ ["\uC81D", "\uC81D"], /* Hangul Syllable */
+ ["\uC81E", "\uC81E"], /* Hangul Syllable */
+ ["\uC81F", "\uC81F"], /* Hangul Syllable */
+ ["\uC820", "\uC820"], /* Hangul Syllable */
+ ["\uC821", "\uC821"], /* Hangul Syllable */
+ ["\uC822", "\uC822"], /* Hangul Syllable */
+ ["\uC823", "\uC823"], /* Hangul Syllable */
+ ["\uC824", "\uC824"], /* Hangul Syllable */
+ ["\uC825", "\uC825"], /* Hangul Syllable */
+ ["\uC826", "\uC826"], /* Hangul Syllable */
+ ["\uC827", "\uC827"], /* Hangul Syllable */
+ ["\uC828", "\uC828"], /* Hangul Syllable */
+ ["\uC829", "\uC829"], /* Hangul Syllable */
+ ["\uC82A", "\uC82A"], /* Hangul Syllable */
+ ["\uC82B", "\uC82B"], /* Hangul Syllable */
+ ["\uC82C", "\uC82C"], /* Hangul Syllable */
+ ["\uC82D", "\uC82D"], /* Hangul Syllable */
+ ["\uC82E", "\uC82E"], /* Hangul Syllable */
+ ["\uC82F", "\uC82F"], /* Hangul Syllable */
+ ["\uC830", "\uC830"], /* Hangul Syllable */
+ ["\uC831", "\uC831"], /* Hangul Syllable */
+ ["\uC832", "\uC832"], /* Hangul Syllable */
+ ["\uC833", "\uC833"], /* Hangul Syllable */
+ ["\uC834", "\uC834"], /* Hangul Syllable */
+ ["\uC835", "\uC835"], /* Hangul Syllable */
+ ["\uC836", "\uC836"], /* Hangul Syllable */
+ ["\uC837", "\uC837"], /* Hangul Syllable */
+ ["\uC838", "\uC838"], /* Hangul Syllable */
+ ["\uC839", "\uC839"], /* Hangul Syllable */
+ ["\uC83A", "\uC83A"], /* Hangul Syllable */
+ ["\uC83B", "\uC83B"], /* Hangul Syllable */
+ ["\uC83C", "\uC83C"], /* Hangul Syllable */
+ ["\uC83D", "\uC83D"], /* Hangul Syllable */
+ ["\uC83E", "\uC83E"], /* Hangul Syllable */
+ ["\uC83F", "\uC83F"], /* Hangul Syllable */
+ ["\uC840", "\uC840"], /* Hangul Syllable */
+ ["\uC841", "\uC841"], /* Hangul Syllable */
+ ["\uC842", "\uC842"], /* Hangul Syllable */
+ ["\uC843", "\uC843"], /* Hangul Syllable */
+ ["\uC844", "\uC844"], /* Hangul Syllable */
+ ["\uC845", "\uC845"], /* Hangul Syllable */
+ ["\uC846", "\uC846"], /* Hangul Syllable */
+ ["\uC847", "\uC847"], /* Hangul Syllable */
+ ["\uC848", "\uC848"], /* Hangul Syllable */
+ ["\uC849", "\uC849"], /* Hangul Syllable */
+ ["\uC84A", "\uC84A"], /* Hangul Syllable */
+ ["\uC84B", "\uC84B"], /* Hangul Syllable */
+ ["\uC84C", "\uC84C"], /* Hangul Syllable */
+ ["\uC84D", "\uC84D"], /* Hangul Syllable */
+ ["\uC84E", "\uC84E"], /* Hangul Syllable */
+ ["\uC84F", "\uC84F"], /* Hangul Syllable */
+ ["\uC850", "\uC850"], /* Hangul Syllable */
+ ["\uC851", "\uC851"], /* Hangul Syllable */
+ ["\uC852", "\uC852"], /* Hangul Syllable */
+ ["\uC853", "\uC853"], /* Hangul Syllable */
+ ["\uC854", "\uC854"], /* Hangul Syllable */
+ ["\uC855", "\uC855"], /* Hangul Syllable */
+ ["\uC856", "\uC856"], /* Hangul Syllable */
+ ["\uC857", "\uC857"], /* Hangul Syllable */
+ ["\uC858", "\uC858"], /* Hangul Syllable */
+ ["\uC859", "\uC859"], /* Hangul Syllable */
+ ["\uC85A", "\uC85A"], /* Hangul Syllable */
+ ["\uC85B", "\uC85B"], /* Hangul Syllable */
+ ["\uC85C", "\uC85C"], /* Hangul Syllable */
+ ["\uC85D", "\uC85D"], /* Hangul Syllable */
+ ["\uC85E", "\uC85E"], /* Hangul Syllable */
+ ["\uC85F", "\uC85F"], /* Hangul Syllable */
+ ["\uC860", "\uC860"], /* Hangul Syllable */
+ ["\uC861", "\uC861"], /* Hangul Syllable */
+ ["\uC862", "\uC862"], /* Hangul Syllable */
+ ["\uC863", "\uC863"], /* Hangul Syllable */
+ ["\uC864", "\uC864"], /* Hangul Syllable */
+ ["\uC865", "\uC865"], /* Hangul Syllable */
+ ["\uC866", "\uC866"], /* Hangul Syllable */
+ ["\uC867", "\uC867"], /* Hangul Syllable */
+ ["\uC868", "\uC868"], /* Hangul Syllable */
+ ["\uC869", "\uC869"], /* Hangul Syllable */
+ ["\uC86A", "\uC86A"], /* Hangul Syllable */
+ ["\uC86B", "\uC86B"], /* Hangul Syllable */
+ ["\uC86C", "\uC86C"], /* Hangul Syllable */
+ ["\uC86D", "\uC86D"], /* Hangul Syllable */
+ ["\uC86E", "\uC86E"], /* Hangul Syllable */
+ ["\uC86F", "\uC86F"], /* Hangul Syllable */
+ ["\uC870", "\uC870"], /* Hangul Syllable */
+ ["\uC871", "\uC871"], /* Hangul Syllable */
+ ["\uC872", "\uC872"], /* Hangul Syllable */
+ ["\uC873", "\uC873"], /* Hangul Syllable */
+ ["\uC874", "\uC874"], /* Hangul Syllable */
+ ["\uC875", "\uC875"], /* Hangul Syllable */
+ ["\uC876", "\uC876"], /* Hangul Syllable */
+ ["\uC877", "\uC877"], /* Hangul Syllable */
+ ["\uC878", "\uC878"], /* Hangul Syllable */
+ ["\uC879", "\uC879"], /* Hangul Syllable */
+ ["\uC87A", "\uC87A"], /* Hangul Syllable */
+ ["\uC87B", "\uC87B"], /* Hangul Syllable */
+ ["\uC87C", "\uC87C"], /* Hangul Syllable */
+ ["\uC87D", "\uC87D"], /* Hangul Syllable */
+ ["\uC87E", "\uC87E"], /* Hangul Syllable */
+ ["\uC87F", "\uC87F"], /* Hangul Syllable */
+ ["\uC880", "\uC880"], /* Hangul Syllable */
+ ["\uC881", "\uC881"], /* Hangul Syllable */
+ ["\uC882", "\uC882"], /* Hangul Syllable */
+ ["\uC883", "\uC883"], /* Hangul Syllable */
+ ["\uC884", "\uC884"], /* Hangul Syllable */
+ ["\uC885", "\uC885"], /* Hangul Syllable */
+ ["\uC886", "\uC886"], /* Hangul Syllable */
+ ["\uC887", "\uC887"], /* Hangul Syllable */
+ ["\uC888", "\uC888"], /* Hangul Syllable */
+ ["\uC889", "\uC889"], /* Hangul Syllable */
+ ["\uC88A", "\uC88A"], /* Hangul Syllable */
+ ["\uC88B", "\uC88B"], /* Hangul Syllable */
+ ["\uC88C", "\uC88C"], /* Hangul Syllable */
+ ["\uC88D", "\uC88D"], /* Hangul Syllable */
+ ["\uC88E", "\uC88E"], /* Hangul Syllable */
+ ["\uC88F", "\uC88F"], /* Hangul Syllable */
+ ["\uC890", "\uC890"], /* Hangul Syllable */
+ ["\uC891", "\uC891"], /* Hangul Syllable */
+ ["\uC892", "\uC892"], /* Hangul Syllable */
+ ["\uC893", "\uC893"], /* Hangul Syllable */
+ ["\uC894", "\uC894"], /* Hangul Syllable */
+ ["\uC895", "\uC895"], /* Hangul Syllable */
+ ["\uC896", "\uC896"], /* Hangul Syllable */
+ ["\uC897", "\uC897"], /* Hangul Syllable */
+ ["\uC898", "\uC898"], /* Hangul Syllable */
+ ["\uC899", "\uC899"], /* Hangul Syllable */
+ ["\uC89A", "\uC89A"], /* Hangul Syllable */
+ ["\uC89B", "\uC89B"], /* Hangul Syllable */
+ ["\uC89C", "\uC89C"], /* Hangul Syllable */
+ ["\uC89D", "\uC89D"], /* Hangul Syllable */
+ ["\uC89E", "\uC89E"], /* Hangul Syllable */
+ ["\uC89F", "\uC89F"], /* Hangul Syllable */
+ ["\uC8A0", "\uC8A0"], /* Hangul Syllable */
+ ["\uC8A1", "\uC8A1"], /* Hangul Syllable */
+ ["\uC8A2", "\uC8A2"], /* Hangul Syllable */
+ ["\uC8A3", "\uC8A3"], /* Hangul Syllable */
+ ["\uC8A4", "\uC8A4"], /* Hangul Syllable */
+ ["\uC8A5", "\uC8A5"], /* Hangul Syllable */
+ ["\uC8A6", "\uC8A6"], /* Hangul Syllable */
+ ["\uC8A7", "\uC8A7"], /* Hangul Syllable */
+ ["\uC8A8", "\uC8A8"], /* Hangul Syllable */
+ ["\uC8A9", "\uC8A9"], /* Hangul Syllable */
+ ["\uC8AA", "\uC8AA"], /* Hangul Syllable */
+ ["\uC8AB", "\uC8AB"], /* Hangul Syllable */
+ ["\uC8AC", "\uC8AC"], /* Hangul Syllable */
+ ["\uC8AD", "\uC8AD"], /* Hangul Syllable */
+ ["\uC8AE", "\uC8AE"], /* Hangul Syllable */
+ ["\uC8AF", "\uC8AF"], /* Hangul Syllable */
+ ["\uC8B0", "\uC8B0"], /* Hangul Syllable */
+ ["\uC8B1", "\uC8B1"], /* Hangul Syllable */
+ ["\uC8B2", "\uC8B2"], /* Hangul Syllable */
+ ["\uC8B3", "\uC8B3"], /* Hangul Syllable */
+ ["\uC8B4", "\uC8B4"], /* Hangul Syllable */
+ ["\uC8B5", "\uC8B5"], /* Hangul Syllable */
+ ["\uC8B6", "\uC8B6"], /* Hangul Syllable */
+ ["\uC8B7", "\uC8B7"], /* Hangul Syllable */
+ ["\uC8B8", "\uC8B8"], /* Hangul Syllable */
+ ["\uC8B9", "\uC8B9"], /* Hangul Syllable */
+ ["\uC8BA", "\uC8BA"], /* Hangul Syllable */
+ ["\uC8BB", "\uC8BB"], /* Hangul Syllable */
+ ["\uC8BC", "\uC8BC"], /* Hangul Syllable */
+ ["\uC8BD", "\uC8BD"], /* Hangul Syllable */
+ ["\uC8BE", "\uC8BE"], /* Hangul Syllable */
+ ["\uC8BF", "\uC8BF"], /* Hangul Syllable */
+ ["\uC8C0", "\uC8C0"], /* Hangul Syllable */
+ ["\uC8C1", "\uC8C1"], /* Hangul Syllable */
+ ["\uC8C2", "\uC8C2"], /* Hangul Syllable */
+ ["\uC8C3", "\uC8C3"], /* Hangul Syllable */
+ ["\uC8C4", "\uC8C4"], /* Hangul Syllable */
+ ["\uC8C5", "\uC8C5"], /* Hangul Syllable */
+ ["\uC8C6", "\uC8C6"], /* Hangul Syllable */
+ ["\uC8C7", "\uC8C7"], /* Hangul Syllable */
+ ["\uC8C8", "\uC8C8"], /* Hangul Syllable */
+ ["\uC8C9", "\uC8C9"], /* Hangul Syllable */
+ ["\uC8CA", "\uC8CA"], /* Hangul Syllable */
+ ["\uC8CB", "\uC8CB"], /* Hangul Syllable */
+ ["\uC8CC", "\uC8CC"], /* Hangul Syllable */
+ ["\uC8CD", "\uC8CD"], /* Hangul Syllable */
+ ["\uC8CE", "\uC8CE"], /* Hangul Syllable */
+ ["\uC8CF", "\uC8CF"], /* Hangul Syllable */
+ ["\uC8D0", "\uC8D0"], /* Hangul Syllable */
+ ["\uC8D1", "\uC8D1"], /* Hangul Syllable */
+ ["\uC8D2", "\uC8D2"], /* Hangul Syllable */
+ ["\uC8D3", "\uC8D3"], /* Hangul Syllable */
+ ["\uC8D4", "\uC8D4"], /* Hangul Syllable */
+ ["\uC8D5", "\uC8D5"], /* Hangul Syllable */
+ ["\uC8D6", "\uC8D6"], /* Hangul Syllable */
+ ["\uC8D7", "\uC8D7"], /* Hangul Syllable */
+ ["\uC8D8", "\uC8D8"], /* Hangul Syllable */
+ ["\uC8D9", "\uC8D9"], /* Hangul Syllable */
+ ["\uC8DA", "\uC8DA"], /* Hangul Syllable */
+ ["\uC8DB", "\uC8DB"], /* Hangul Syllable */
+ ["\uC8DC", "\uC8DC"], /* Hangul Syllable */
+ ["\uC8DD", "\uC8DD"], /* Hangul Syllable */
+ ["\uC8DE", "\uC8DE"], /* Hangul Syllable */
+ ["\uC8DF", "\uC8DF"], /* Hangul Syllable */
+ ["\uC8E0", "\uC8E0"], /* Hangul Syllable */
+ ["\uC8E1", "\uC8E1"], /* Hangul Syllable */
+ ["\uC8E2", "\uC8E2"], /* Hangul Syllable */
+ ["\uC8E3", "\uC8E3"], /* Hangul Syllable */
+ ["\uC8E4", "\uC8E4"], /* Hangul Syllable */
+ ["\uC8E5", "\uC8E5"], /* Hangul Syllable */
+ ["\uC8E6", "\uC8E6"], /* Hangul Syllable */
+ ["\uC8E7", "\uC8E7"], /* Hangul Syllable */
+ ["\uC8E8", "\uC8E8"], /* Hangul Syllable */
+ ["\uC8E9", "\uC8E9"], /* Hangul Syllable */
+ ["\uC8EA", "\uC8EA"], /* Hangul Syllable */
+ ["\uC8EB", "\uC8EB"], /* Hangul Syllable */
+ ["\uC8EC", "\uC8EC"], /* Hangul Syllable */
+ ["\uC8ED", "\uC8ED"], /* Hangul Syllable */
+ ["\uC8EE", "\uC8EE"], /* Hangul Syllable */
+ ["\uC8EF", "\uC8EF"], /* Hangul Syllable */
+ ["\uC8F0", "\uC8F0"], /* Hangul Syllable */
+ ["\uC8F1", "\uC8F1"], /* Hangul Syllable */
+ ["\uC8F2", "\uC8F2"], /* Hangul Syllable */
+ ["\uC8F3", "\uC8F3"], /* Hangul Syllable */
+ ["\uC8F4", "\uC8F4"], /* Hangul Syllable */
+ ["\uC8F5", "\uC8F5"], /* Hangul Syllable */
+ ["\uC8F6", "\uC8F6"], /* Hangul Syllable */
+ ["\uC8F7", "\uC8F7"], /* Hangul Syllable */
+ ["\uC8F8", "\uC8F8"], /* Hangul Syllable */
+ ["\uC8F9", "\uC8F9"], /* Hangul Syllable */
+ ["\uC8FA", "\uC8FA"], /* Hangul Syllable */
+ ["\uC8FB", "\uC8FB"], /* Hangul Syllable */
+ ["\uC8FC", "\uC8FC"], /* Hangul Syllable */
+ ["\uC8FD", "\uC8FD"], /* Hangul Syllable */
+ ["\uC8FE", "\uC8FE"], /* Hangul Syllable */
+ ["\uC8FF", "\uC8FF"], /* Hangul Syllable */
+ ["\uC900", "\uC900"], /* Hangul Syllable */
+ ["\uC901", "\uC901"], /* Hangul Syllable */
+ ["\uC902", "\uC902"], /* Hangul Syllable */
+ ["\uC903", "\uC903"], /* Hangul Syllable */
+ ["\uC904", "\uC904"], /* Hangul Syllable */
+ ["\uC905", "\uC905"], /* Hangul Syllable */
+ ["\uC906", "\uC906"], /* Hangul Syllable */
+ ["\uC907", "\uC907"], /* Hangul Syllable */
+ ["\uC908", "\uC908"], /* Hangul Syllable */
+ ["\uC909", "\uC909"], /* Hangul Syllable */
+ ["\uC90A", "\uC90A"], /* Hangul Syllable */
+ ["\uC90B", "\uC90B"], /* Hangul Syllable */
+ ["\uC90C", "\uC90C"], /* Hangul Syllable */
+ ["\uC90D", "\uC90D"], /* Hangul Syllable */
+ ["\uC90E", "\uC90E"], /* Hangul Syllable */
+ ["\uC90F", "\uC90F"], /* Hangul Syllable */
+ ["\uC910", "\uC910"], /* Hangul Syllable */
+ ["\uC911", "\uC911"], /* Hangul Syllable */
+ ["\uC912", "\uC912"], /* Hangul Syllable */
+ ["\uC913", "\uC913"], /* Hangul Syllable */
+ ["\uC914", "\uC914"], /* Hangul Syllable */
+ ["\uC915", "\uC915"], /* Hangul Syllable */
+ ["\uC916", "\uC916"], /* Hangul Syllable */
+ ["\uC917", "\uC917"], /* Hangul Syllable */
+ ["\uC918", "\uC918"], /* Hangul Syllable */
+ ["\uC919", "\uC919"], /* Hangul Syllable */
+ ["\uC91A", "\uC91A"], /* Hangul Syllable */
+ ["\uC91B", "\uC91B"], /* Hangul Syllable */
+ ["\uC91C", "\uC91C"], /* Hangul Syllable */
+ ["\uC91D", "\uC91D"], /* Hangul Syllable */
+ ["\uC91E", "\uC91E"], /* Hangul Syllable */
+ ["\uC91F", "\uC91F"], /* Hangul Syllable */
+ ["\uC920", "\uC920"], /* Hangul Syllable */
+ ["\uC921", "\uC921"], /* Hangul Syllable */
+ ["\uC922", "\uC922"], /* Hangul Syllable */
+ ["\uC923", "\uC923"], /* Hangul Syllable */
+ ["\uC924", "\uC924"], /* Hangul Syllable */
+ ["\uC925", "\uC925"], /* Hangul Syllable */
+ ["\uC926", "\uC926"], /* Hangul Syllable */
+ ["\uC927", "\uC927"], /* Hangul Syllable */
+ ["\uC928", "\uC928"], /* Hangul Syllable */
+ ["\uC929", "\uC929"], /* Hangul Syllable */
+ ["\uC92A", "\uC92A"], /* Hangul Syllable */
+ ["\uC92B", "\uC92B"], /* Hangul Syllable */
+ ["\uC92C", "\uC92C"], /* Hangul Syllable */
+ ["\uC92D", "\uC92D"], /* Hangul Syllable */
+ ["\uC92E", "\uC92E"], /* Hangul Syllable */
+ ["\uC92F", "\uC92F"], /* Hangul Syllable */
+ ["\uC930", "\uC930"], /* Hangul Syllable */
+ ["\uC931", "\uC931"], /* Hangul Syllable */
+ ["\uC932", "\uC932"], /* Hangul Syllable */
+ ["\uC933", "\uC933"], /* Hangul Syllable */
+ ["\uC934", "\uC934"], /* Hangul Syllable */
+ ["\uC935", "\uC935"], /* Hangul Syllable */
+ ["\uC936", "\uC936"], /* Hangul Syllable */
+ ["\uC937", "\uC937"], /* Hangul Syllable */
+ ["\uC938", "\uC938"], /* Hangul Syllable */
+ ["\uC939", "\uC939"], /* Hangul Syllable */
+ ["\uC93A", "\uC93A"], /* Hangul Syllable */
+ ["\uC93B", "\uC93B"], /* Hangul Syllable */
+ ["\uC93C", "\uC93C"], /* Hangul Syllable */
+ ["\uC93D", "\uC93D"], /* Hangul Syllable */
+ ["\uC93E", "\uC93E"], /* Hangul Syllable */
+ ["\uC93F", "\uC93F"], /* Hangul Syllable */
+ ["\uC940", "\uC940"], /* Hangul Syllable */
+ ["\uC941", "\uC941"], /* Hangul Syllable */
+ ["\uC942", "\uC942"], /* Hangul Syllable */
+ ["\uC943", "\uC943"], /* Hangul Syllable */
+ ["\uC944", "\uC944"], /* Hangul Syllable */
+ ["\uC945", "\uC945"], /* Hangul Syllable */
+ ["\uC946", "\uC946"], /* Hangul Syllable */
+ ["\uC947", "\uC947"], /* Hangul Syllable */
+ ["\uC948", "\uC948"], /* Hangul Syllable */
+ ["\uC949", "\uC949"], /* Hangul Syllable */
+ ["\uC94A", "\uC94A"], /* Hangul Syllable */
+ ["\uC94B", "\uC94B"], /* Hangul Syllable */
+ ["\uC94C", "\uC94C"], /* Hangul Syllable */
+ ["\uC94D", "\uC94D"], /* Hangul Syllable */
+ ["\uC94E", "\uC94E"], /* Hangul Syllable */
+ ["\uC94F", "\uC94F"], /* Hangul Syllable */
+ ["\uC950", "\uC950"], /* Hangul Syllable */
+ ["\uC951", "\uC951"], /* Hangul Syllable */
+ ["\uC952", "\uC952"], /* Hangul Syllable */
+ ["\uC953", "\uC953"], /* Hangul Syllable */
+ ["\uC954", "\uC954"], /* Hangul Syllable */
+ ["\uC955", "\uC955"], /* Hangul Syllable */
+ ["\uC956", "\uC956"], /* Hangul Syllable */
+ ["\uC957", "\uC957"], /* Hangul Syllable */
+ ["\uC958", "\uC958"], /* Hangul Syllable */
+ ["\uC959", "\uC959"], /* Hangul Syllable */
+ ["\uC95A", "\uC95A"], /* Hangul Syllable */
+ ["\uC95B", "\uC95B"], /* Hangul Syllable */
+ ["\uC95C", "\uC95C"], /* Hangul Syllable */
+ ["\uC95D", "\uC95D"], /* Hangul Syllable */
+ ["\uC95E", "\uC95E"], /* Hangul Syllable */
+ ["\uC95F", "\uC95F"], /* Hangul Syllable */
+ ["\uC960", "\uC960"], /* Hangul Syllable */
+ ["\uC961", "\uC961"], /* Hangul Syllable */
+ ["\uC962", "\uC962"], /* Hangul Syllable */
+ ["\uC963", "\uC963"], /* Hangul Syllable */
+ ["\uC964", "\uC964"], /* Hangul Syllable */
+ ["\uC965", "\uC965"], /* Hangul Syllable */
+ ["\uC966", "\uC966"], /* Hangul Syllable */
+ ["\uC967", "\uC967"], /* Hangul Syllable */
+ ["\uC968", "\uC968"], /* Hangul Syllable */
+ ["\uC969", "\uC969"], /* Hangul Syllable */
+ ["\uC96A", "\uC96A"], /* Hangul Syllable */
+ ["\uC96B", "\uC96B"], /* Hangul Syllable */
+ ["\uC96C", "\uC96C"], /* Hangul Syllable */
+ ["\uC96D", "\uC96D"], /* Hangul Syllable */
+ ["\uC96E", "\uC96E"], /* Hangul Syllable */
+ ["\uC96F", "\uC96F"], /* Hangul Syllable */
+ ["\uC970", "\uC970"], /* Hangul Syllable */
+ ["\uC971", "\uC971"], /* Hangul Syllable */
+ ["\uC972", "\uC972"], /* Hangul Syllable */
+ ["\uC973", "\uC973"], /* Hangul Syllable */
+ ["\uC974", "\uC974"], /* Hangul Syllable */
+ ["\uC975", "\uC975"], /* Hangul Syllable */
+ ["\uC976", "\uC976"], /* Hangul Syllable */
+ ["\uC977", "\uC977"], /* Hangul Syllable */
+ ["\uC978", "\uC978"], /* Hangul Syllable */
+ ["\uC979", "\uC979"], /* Hangul Syllable */
+ ["\uC97A", "\uC97A"], /* Hangul Syllable */
+ ["\uC97B", "\uC97B"], /* Hangul Syllable */
+ ["\uC97C", "\uC97C"], /* Hangul Syllable */
+ ["\uC97D", "\uC97D"], /* Hangul Syllable */
+ ["\uC97E", "\uC97E"], /* Hangul Syllable */
+ ["\uC97F", "\uC97F"], /* Hangul Syllable */
+ ["\uC980", "\uC980"], /* Hangul Syllable */
+ ["\uC981", "\uC981"], /* Hangul Syllable */
+ ["\uC982", "\uC982"], /* Hangul Syllable */
+ ["\uC983", "\uC983"], /* Hangul Syllable */
+ ["\uC984", "\uC984"], /* Hangul Syllable */
+ ["\uC985", "\uC985"], /* Hangul Syllable */
+ ["\uC986", "\uC986"], /* Hangul Syllable */
+ ["\uC987", "\uC987"], /* Hangul Syllable */
+ ["\uC988", "\uC988"], /* Hangul Syllable */
+ ["\uC989", "\uC989"], /* Hangul Syllable */
+ ["\uC98A", "\uC98A"], /* Hangul Syllable */
+ ["\uC98B", "\uC98B"], /* Hangul Syllable */
+ ["\uC98C", "\uC98C"], /* Hangul Syllable */
+ ["\uC98D", "\uC98D"], /* Hangul Syllable */
+ ["\uC98E", "\uC98E"], /* Hangul Syllable */
+ ["\uC98F", "\uC98F"], /* Hangul Syllable */
+ ["\uC990", "\uC990"], /* Hangul Syllable */
+ ["\uC991", "\uC991"], /* Hangul Syllable */
+ ["\uC992", "\uC992"], /* Hangul Syllable */
+ ["\uC993", "\uC993"], /* Hangul Syllable */
+ ["\uC994", "\uC994"], /* Hangul Syllable */
+ ["\uC995", "\uC995"], /* Hangul Syllable */
+ ["\uC996", "\uC996"], /* Hangul Syllable */
+ ["\uC997", "\uC997"], /* Hangul Syllable */
+ ["\uC998", "\uC998"], /* Hangul Syllable */
+ ["\uC999", "\uC999"], /* Hangul Syllable */
+ ["\uC99A", "\uC99A"], /* Hangul Syllable */
+ ["\uC99B", "\uC99B"], /* Hangul Syllable */
+ ["\uC99C", "\uC99C"], /* Hangul Syllable */
+ ["\uC99D", "\uC99D"], /* Hangul Syllable */
+ ["\uC99E", "\uC99E"], /* Hangul Syllable */
+ ["\uC99F", "\uC99F"], /* Hangul Syllable */
+ ["\uC9A0", "\uC9A0"], /* Hangul Syllable */
+ ["\uC9A1", "\uC9A1"], /* Hangul Syllable */
+ ["\uC9A2", "\uC9A2"], /* Hangul Syllable */
+ ["\uC9A3", "\uC9A3"], /* Hangul Syllable */
+ ["\uC9A4", "\uC9A4"], /* Hangul Syllable */
+ ["\uC9A5", "\uC9A5"], /* Hangul Syllable */
+ ["\uC9A6", "\uC9A6"], /* Hangul Syllable */
+ ["\uC9A7", "\uC9A7"], /* Hangul Syllable */
+ ["\uC9A8", "\uC9A8"], /* Hangul Syllable */
+ ["\uC9A9", "\uC9A9"], /* Hangul Syllable */
+ ["\uC9AA", "\uC9AA"], /* Hangul Syllable */
+ ["\uC9AB", "\uC9AB"], /* Hangul Syllable */
+ ["\uC9AC", "\uC9AC"], /* Hangul Syllable */
+ ["\uC9AD", "\uC9AD"], /* Hangul Syllable */
+ ["\uC9AE", "\uC9AE"], /* Hangul Syllable */
+ ["\uC9AF", "\uC9AF"], /* Hangul Syllable */
+ ["\uC9B0", "\uC9B0"], /* Hangul Syllable */
+ ["\uC9B1", "\uC9B1"], /* Hangul Syllable */
+ ["\uC9B2", "\uC9B2"], /* Hangul Syllable */
+ ["\uC9B3", "\uC9B3"], /* Hangul Syllable */
+ ["\uC9B4", "\uC9B4"], /* Hangul Syllable */
+ ["\uC9B5", "\uC9B5"], /* Hangul Syllable */
+ ["\uC9B6", "\uC9B6"], /* Hangul Syllable */
+ ["\uC9B7", "\uC9B7"], /* Hangul Syllable */
+ ["\uC9B8", "\uC9B8"], /* Hangul Syllable */
+ ["\uC9B9", "\uC9B9"], /* Hangul Syllable */
+ ["\uC9BA", "\uC9BA"], /* Hangul Syllable */
+ ["\uC9BB", "\uC9BB"], /* Hangul Syllable */
+ ["\uC9BC", "\uC9BC"], /* Hangul Syllable */
+ ["\uC9BD", "\uC9BD"], /* Hangul Syllable */
+ ["\uC9BE", "\uC9BE"], /* Hangul Syllable */
+ ["\uC9BF", "\uC9BF"], /* Hangul Syllable */
+ ["\uC9C0", "\uC9C0"], /* Hangul Syllable */
+ ["\uC9C1", "\uC9C1"], /* Hangul Syllable */
+ ["\uC9C2", "\uC9C2"], /* Hangul Syllable */
+ ["\uC9C3", "\uC9C3"], /* Hangul Syllable */
+ ["\uC9C4", "\uC9C4"], /* Hangul Syllable */
+ ["\uC9C5", "\uC9C5"], /* Hangul Syllable */
+ ["\uC9C6", "\uC9C6"], /* Hangul Syllable */
+ ["\uC9C7", "\uC9C7"], /* Hangul Syllable */
+ ["\uC9C8", "\uC9C8"], /* Hangul Syllable */
+ ["\uC9C9", "\uC9C9"], /* Hangul Syllable */
+ ["\uC9CA", "\uC9CA"], /* Hangul Syllable */
+ ["\uC9CB", "\uC9CB"], /* Hangul Syllable */
+ ["\uC9CC", "\uC9CC"], /* Hangul Syllable */
+ ["\uC9CD", "\uC9CD"], /* Hangul Syllable */
+ ["\uC9CE", "\uC9CE"], /* Hangul Syllable */
+ ["\uC9CF", "\uC9CF"], /* Hangul Syllable */
+ ["\uC9D0", "\uC9D0"], /* Hangul Syllable */
+ ["\uC9D1", "\uC9D1"], /* Hangul Syllable */
+ ["\uC9D2", "\uC9D2"], /* Hangul Syllable */
+ ["\uC9D3", "\uC9D3"], /* Hangul Syllable */
+ ["\uC9D4", "\uC9D4"], /* Hangul Syllable */
+ ["\uC9D5", "\uC9D5"], /* Hangul Syllable */
+ ["\uC9D6", "\uC9D6"], /* Hangul Syllable */
+ ["\uC9D7", "\uC9D7"], /* Hangul Syllable */
+ ["\uC9D8", "\uC9D8"], /* Hangul Syllable */
+ ["\uC9D9", "\uC9D9"], /* Hangul Syllable */
+ ["\uC9DA", "\uC9DA"], /* Hangul Syllable */
+ ["\uC9DB", "\uC9DB"], /* Hangul Syllable */
+ ["\uC9DC", "\uC9DC"], /* Hangul Syllable */
+ ["\uC9DD", "\uC9DD"], /* Hangul Syllable */
+ ["\uC9DE", "\uC9DE"], /* Hangul Syllable */
+ ["\uC9DF", "\uC9DF"], /* Hangul Syllable */
+ ["\uC9E0", "\uC9E0"], /* Hangul Syllable */
+ ["\uC9E1", "\uC9E1"], /* Hangul Syllable */
+ ["\uC9E2", "\uC9E2"], /* Hangul Syllable */
+ ["\uC9E3", "\uC9E3"], /* Hangul Syllable */
+ ["\uC9E4", "\uC9E4"], /* Hangul Syllable */
+ ["\uC9E5", "\uC9E5"], /* Hangul Syllable */
+ ["\uC9E6", "\uC9E6"], /* Hangul Syllable */
+ ["\uC9E7", "\uC9E7"], /* Hangul Syllable */
+ ["\uC9E8", "\uC9E8"], /* Hangul Syllable */
+ ["\uC9E9", "\uC9E9"], /* Hangul Syllable */
+ ["\uC9EA", "\uC9EA"], /* Hangul Syllable */
+ ["\uC9EB", "\uC9EB"], /* Hangul Syllable */
+ ["\uC9EC", "\uC9EC"], /* Hangul Syllable */
+ ["\uC9ED", "\uC9ED"], /* Hangul Syllable */
+ ["\uC9EE", "\uC9EE"], /* Hangul Syllable */
+ ["\uC9EF", "\uC9EF"], /* Hangul Syllable */
+ ["\uC9F0", "\uC9F0"], /* Hangul Syllable */
+ ["\uC9F1", "\uC9F1"], /* Hangul Syllable */
+ ["\uC9F2", "\uC9F2"], /* Hangul Syllable */
+ ["\uC9F3", "\uC9F3"], /* Hangul Syllable */
+ ["\uC9F4", "\uC9F4"], /* Hangul Syllable */
+ ["\uC9F5", "\uC9F5"], /* Hangul Syllable */
+ ["\uC9F6", "\uC9F6"], /* Hangul Syllable */
+ ["\uC9F7", "\uC9F7"], /* Hangul Syllable */
+ ["\uC9F8", "\uC9F8"], /* Hangul Syllable */
+ ["\uC9F9", "\uC9F9"], /* Hangul Syllable */
+ ["\uC9FA", "\uC9FA"], /* Hangul Syllable */
+ ["\uC9FB", "\uC9FB"], /* Hangul Syllable */
+ ["\uC9FC", "\uC9FC"], /* Hangul Syllable */
+ ["\uC9FD", "\uC9FD"], /* Hangul Syllable */
+ ["\uC9FE", "\uC9FE"], /* Hangul Syllable */
+ ["\uC9FF", "\uC9FF"], /* Hangul Syllable */
+ ["\uCA00", "\uCA00"], /* Hangul Syllable */
+ ["\uCA01", "\uCA01"], /* Hangul Syllable */
+ ["\uCA02", "\uCA02"], /* Hangul Syllable */
+ ["\uCA03", "\uCA03"], /* Hangul Syllable */
+ ["\uCA04", "\uCA04"], /* Hangul Syllable */
+ ["\uCA05", "\uCA05"], /* Hangul Syllable */
+ ["\uCA06", "\uCA06"], /* Hangul Syllable */
+ ["\uCA07", "\uCA07"], /* Hangul Syllable */
+ ["\uCA08", "\uCA08"], /* Hangul Syllable */
+ ["\uCA09", "\uCA09"], /* Hangul Syllable */
+ ["\uCA0A", "\uCA0A"], /* Hangul Syllable */
+ ["\uCA0B", "\uCA0B"], /* Hangul Syllable */
+ ["\uCA0C", "\uCA0C"], /* Hangul Syllable */
+ ["\uCA0D", "\uCA0D"], /* Hangul Syllable */
+ ["\uCA0E", "\uCA0E"], /* Hangul Syllable */
+ ["\uCA0F", "\uCA0F"], /* Hangul Syllable */
+ ["\uCA10", "\uCA10"], /* Hangul Syllable */
+ ["\uCA11", "\uCA11"], /* Hangul Syllable */
+ ["\uCA12", "\uCA12"], /* Hangul Syllable */
+ ["\uCA13", "\uCA13"], /* Hangul Syllable */
+ ["\uCA14", "\uCA14"], /* Hangul Syllable */
+ ["\uCA15", "\uCA15"], /* Hangul Syllable */
+ ["\uCA16", "\uCA16"], /* Hangul Syllable */
+ ["\uCA17", "\uCA17"], /* Hangul Syllable */
+ ["\uCA18", "\uCA18"], /* Hangul Syllable */
+ ["\uCA19", "\uCA19"], /* Hangul Syllable */
+ ["\uCA1A", "\uCA1A"], /* Hangul Syllable */
+ ["\uCA1B", "\uCA1B"], /* Hangul Syllable */
+ ["\uCA1C", "\uCA1C"], /* Hangul Syllable */
+ ["\uCA1D", "\uCA1D"], /* Hangul Syllable */
+ ["\uCA1E", "\uCA1E"], /* Hangul Syllable */
+ ["\uCA1F", "\uCA1F"], /* Hangul Syllable */
+ ["\uCA20", "\uCA20"], /* Hangul Syllable */
+ ["\uCA21", "\uCA21"], /* Hangul Syllable */
+ ["\uCA22", "\uCA22"], /* Hangul Syllable */
+ ["\uCA23", "\uCA23"], /* Hangul Syllable */
+ ["\uCA24", "\uCA24"], /* Hangul Syllable */
+ ["\uCA25", "\uCA25"], /* Hangul Syllable */
+ ["\uCA26", "\uCA26"], /* Hangul Syllable */
+ ["\uCA27", "\uCA27"], /* Hangul Syllable */
+ ["\uCA28", "\uCA28"], /* Hangul Syllable */
+ ["\uCA29", "\uCA29"], /* Hangul Syllable */
+ ["\uCA2A", "\uCA2A"], /* Hangul Syllable */
+ ["\uCA2B", "\uCA2B"], /* Hangul Syllable */
+ ["\uCA2C", "\uCA2C"], /* Hangul Syllable */
+ ["\uCA2D", "\uCA2D"], /* Hangul Syllable */
+ ["\uCA2E", "\uCA2E"], /* Hangul Syllable */
+ ["\uCA2F", "\uCA2F"], /* Hangul Syllable */
+ ["\uCA30", "\uCA30"], /* Hangul Syllable */
+ ["\uCA31", "\uCA31"], /* Hangul Syllable */
+ ["\uCA32", "\uCA32"], /* Hangul Syllable */
+ ["\uCA33", "\uCA33"], /* Hangul Syllable */
+ ["\uCA34", "\uCA34"], /* Hangul Syllable */
+ ["\uCA35", "\uCA35"], /* Hangul Syllable */
+ ["\uCA36", "\uCA36"], /* Hangul Syllable */
+ ["\uCA37", "\uCA37"], /* Hangul Syllable */
+ ["\uCA38", "\uCA38"], /* Hangul Syllable */
+ ["\uCA39", "\uCA39"], /* Hangul Syllable */
+ ["\uCA3A", "\uCA3A"], /* Hangul Syllable */
+ ["\uCA3B", "\uCA3B"], /* Hangul Syllable */
+ ["\uCA3C", "\uCA3C"], /* Hangul Syllable */
+ ["\uCA3D", "\uCA3D"], /* Hangul Syllable */
+ ["\uCA3E", "\uCA3E"], /* Hangul Syllable */
+ ["\uCA3F", "\uCA3F"], /* Hangul Syllable */
+ ["\uCA40", "\uCA40"], /* Hangul Syllable */
+ ["\uCA41", "\uCA41"], /* Hangul Syllable */
+ ["\uCA42", "\uCA42"], /* Hangul Syllable */
+ ["\uCA43", "\uCA43"], /* Hangul Syllable */
+ ["\uCA44", "\uCA44"], /* Hangul Syllable */
+ ["\uCA45", "\uCA45"], /* Hangul Syllable */
+ ["\uCA46", "\uCA46"], /* Hangul Syllable */
+ ["\uCA47", "\uCA47"], /* Hangul Syllable */
+ ["\uCA48", "\uCA48"], /* Hangul Syllable */
+ ["\uCA49", "\uCA49"], /* Hangul Syllable */
+ ["\uCA4A", "\uCA4A"], /* Hangul Syllable */
+ ["\uCA4B", "\uCA4B"], /* Hangul Syllable */
+ ["\uCA4C", "\uCA4C"], /* Hangul Syllable */
+ ["\uCA4D", "\uCA4D"], /* Hangul Syllable */
+ ["\uCA4E", "\uCA4E"], /* Hangul Syllable */
+ ["\uCA4F", "\uCA4F"], /* Hangul Syllable */
+ ["\uCA50", "\uCA50"], /* Hangul Syllable */
+ ["\uCA51", "\uCA51"], /* Hangul Syllable */
+ ["\uCA52", "\uCA52"], /* Hangul Syllable */
+ ["\uCA53", "\uCA53"], /* Hangul Syllable */
+ ["\uCA54", "\uCA54"], /* Hangul Syllable */
+ ["\uCA55", "\uCA55"], /* Hangul Syllable */
+ ["\uCA56", "\uCA56"], /* Hangul Syllable */
+ ["\uCA57", "\uCA57"], /* Hangul Syllable */
+ ["\uCA58", "\uCA58"], /* Hangul Syllable */
+ ["\uCA59", "\uCA59"], /* Hangul Syllable */
+ ["\uCA5A", "\uCA5A"], /* Hangul Syllable */
+ ["\uCA5B", "\uCA5B"], /* Hangul Syllable */
+ ["\uCA5C", "\uCA5C"], /* Hangul Syllable */
+ ["\uCA5D", "\uCA5D"], /* Hangul Syllable */
+ ["\uCA5E", "\uCA5E"], /* Hangul Syllable */
+ ["\uCA5F", "\uCA5F"], /* Hangul Syllable */
+ ["\uCA60", "\uCA60"], /* Hangul Syllable */
+ ["\uCA61", "\uCA61"], /* Hangul Syllable */
+ ["\uCA62", "\uCA62"], /* Hangul Syllable */
+ ["\uCA63", "\uCA63"], /* Hangul Syllable */
+ ["\uCA64", "\uCA64"], /* Hangul Syllable */
+ ["\uCA65", "\uCA65"], /* Hangul Syllable */
+ ["\uCA66", "\uCA66"], /* Hangul Syllable */
+ ["\uCA67", "\uCA67"], /* Hangul Syllable */
+ ["\uCA68", "\uCA68"], /* Hangul Syllable */
+ ["\uCA69", "\uCA69"], /* Hangul Syllable */
+ ["\uCA6A", "\uCA6A"], /* Hangul Syllable */
+ ["\uCA6B", "\uCA6B"], /* Hangul Syllable */
+ ["\uCA6C", "\uCA6C"], /* Hangul Syllable */
+ ["\uCA6D", "\uCA6D"], /* Hangul Syllable */
+ ["\uCA6E", "\uCA6E"], /* Hangul Syllable */
+ ["\uCA6F", "\uCA6F"], /* Hangul Syllable */
+ ["\uCA70", "\uCA70"], /* Hangul Syllable */
+ ["\uCA71", "\uCA71"], /* Hangul Syllable */
+ ["\uCA72", "\uCA72"], /* Hangul Syllable */
+ ["\uCA73", "\uCA73"], /* Hangul Syllable */
+ ["\uCA74", "\uCA74"], /* Hangul Syllable */
+ ["\uCA75", "\uCA75"], /* Hangul Syllable */
+ ["\uCA76", "\uCA76"], /* Hangul Syllable */
+ ["\uCA77", "\uCA77"], /* Hangul Syllable */
+ ["\uCA78", "\uCA78"], /* Hangul Syllable */
+ ["\uCA79", "\uCA79"], /* Hangul Syllable */
+ ["\uCA7A", "\uCA7A"], /* Hangul Syllable */
+ ["\uCA7B", "\uCA7B"], /* Hangul Syllable */
+ ["\uCA7C", "\uCA7C"], /* Hangul Syllable */
+ ["\uCA7D", "\uCA7D"], /* Hangul Syllable */
+ ["\uCA7E", "\uCA7E"], /* Hangul Syllable */
+ ["\uCA7F", "\uCA7F"], /* Hangul Syllable */
+ ["\uCA80", "\uCA80"], /* Hangul Syllable */
+ ["\uCA81", "\uCA81"], /* Hangul Syllable */
+ ["\uCA82", "\uCA82"], /* Hangul Syllable */
+ ["\uCA83", "\uCA83"], /* Hangul Syllable */
+ ["\uCA84", "\uCA84"], /* Hangul Syllable */
+ ["\uCA85", "\uCA85"], /* Hangul Syllable */
+ ["\uCA86", "\uCA86"], /* Hangul Syllable */
+ ["\uCA87", "\uCA87"], /* Hangul Syllable */
+ ["\uCA88", "\uCA88"], /* Hangul Syllable */
+ ["\uCA89", "\uCA89"], /* Hangul Syllable */
+ ["\uCA8A", "\uCA8A"], /* Hangul Syllable */
+ ["\uCA8B", "\uCA8B"], /* Hangul Syllable */
+ ["\uCA8C", "\uCA8C"], /* Hangul Syllable */
+ ["\uCA8D", "\uCA8D"], /* Hangul Syllable */
+ ["\uCA8E", "\uCA8E"], /* Hangul Syllable */
+ ["\uCA8F", "\uCA8F"], /* Hangul Syllable */
+ ["\uCA90", "\uCA90"], /* Hangul Syllable */
+ ["\uCA91", "\uCA91"], /* Hangul Syllable */
+ ["\uCA92", "\uCA92"], /* Hangul Syllable */
+ ["\uCA93", "\uCA93"], /* Hangul Syllable */
+ ["\uCA94", "\uCA94"], /* Hangul Syllable */
+ ["\uCA95", "\uCA95"], /* Hangul Syllable */
+ ["\uCA96", "\uCA96"], /* Hangul Syllable */
+ ["\uCA97", "\uCA97"], /* Hangul Syllable */
+ ["\uCA98", "\uCA98"], /* Hangul Syllable */
+ ["\uCA99", "\uCA99"], /* Hangul Syllable */
+ ["\uCA9A", "\uCA9A"], /* Hangul Syllable */
+ ["\uCA9B", "\uCA9B"], /* Hangul Syllable */
+ ["\uCA9C", "\uCA9C"], /* Hangul Syllable */
+ ["\uCA9D", "\uCA9D"], /* Hangul Syllable */
+ ["\uCA9E", "\uCA9E"], /* Hangul Syllable */
+ ["\uCA9F", "\uCA9F"], /* Hangul Syllable */
+ ["\uCAA0", "\uCAA0"], /* Hangul Syllable */
+ ["\uCAA1", "\uCAA1"], /* Hangul Syllable */
+ ["\uCAA2", "\uCAA2"], /* Hangul Syllable */
+ ["\uCAA3", "\uCAA3"], /* Hangul Syllable */
+ ["\uCAA4", "\uCAA4"], /* Hangul Syllable */
+ ["\uCAA5", "\uCAA5"], /* Hangul Syllable */
+ ["\uCAA6", "\uCAA6"], /* Hangul Syllable */
+ ["\uCAA7", "\uCAA7"], /* Hangul Syllable */
+ ["\uCAA8", "\uCAA8"], /* Hangul Syllable */
+ ["\uCAA9", "\uCAA9"], /* Hangul Syllable */
+ ["\uCAAA", "\uCAAA"], /* Hangul Syllable */
+ ["\uCAAB", "\uCAAB"], /* Hangul Syllable */
+ ["\uCAAC", "\uCAAC"], /* Hangul Syllable */
+ ["\uCAAD", "\uCAAD"], /* Hangul Syllable */
+ ["\uCAAE", "\uCAAE"], /* Hangul Syllable */
+ ["\uCAAF", "\uCAAF"], /* Hangul Syllable */
+ ["\uCAB0", "\uCAB0"], /* Hangul Syllable */
+ ["\uCAB1", "\uCAB1"], /* Hangul Syllable */
+ ["\uCAB2", "\uCAB2"], /* Hangul Syllable */
+ ["\uCAB3", "\uCAB3"], /* Hangul Syllable */
+ ["\uCAB4", "\uCAB4"], /* Hangul Syllable */
+ ["\uCAB5", "\uCAB5"], /* Hangul Syllable */
+ ["\uCAB6", "\uCAB6"], /* Hangul Syllable */
+ ["\uCAB7", "\uCAB7"], /* Hangul Syllable */
+ ["\uCAB8", "\uCAB8"], /* Hangul Syllable */
+ ["\uCAB9", "\uCAB9"], /* Hangul Syllable */
+ ["\uCABA", "\uCABA"], /* Hangul Syllable */
+ ["\uCABB", "\uCABB"], /* Hangul Syllable */
+ ["\uCABC", "\uCABC"], /* Hangul Syllable */
+ ["\uCABD", "\uCABD"], /* Hangul Syllable */
+ ["\uCABE", "\uCABE"], /* Hangul Syllable */
+ ["\uCABF", "\uCABF"], /* Hangul Syllable */
+ ["\uCAC0", "\uCAC0"], /* Hangul Syllable */
+ ["\uCAC1", "\uCAC1"], /* Hangul Syllable */
+ ["\uCAC2", "\uCAC2"], /* Hangul Syllable */
+ ["\uCAC3", "\uCAC3"], /* Hangul Syllable */
+ ["\uCAC4", "\uCAC4"], /* Hangul Syllable */
+ ["\uCAC5", "\uCAC5"], /* Hangul Syllable */
+ ["\uCAC6", "\uCAC6"], /* Hangul Syllable */
+ ["\uCAC7", "\uCAC7"], /* Hangul Syllable */
+ ["\uCAC8", "\uCAC8"], /* Hangul Syllable */
+ ["\uCAC9", "\uCAC9"], /* Hangul Syllable */
+ ["\uCACA", "\uCACA"], /* Hangul Syllable */
+ ["\uCACB", "\uCACB"], /* Hangul Syllable */
+ ["\uCACC", "\uCACC"], /* Hangul Syllable */
+ ["\uCACD", "\uCACD"], /* Hangul Syllable */
+ ["\uCACE", "\uCACE"], /* Hangul Syllable */
+ ["\uCACF", "\uCACF"], /* Hangul Syllable */
+ ["\uCAD0", "\uCAD0"], /* Hangul Syllable */
+ ["\uCAD1", "\uCAD1"], /* Hangul Syllable */
+ ["\uCAD2", "\uCAD2"], /* Hangul Syllable */
+ ["\uCAD3", "\uCAD3"], /* Hangul Syllable */
+ ["\uCAD4", "\uCAD4"], /* Hangul Syllable */
+ ["\uCAD5", "\uCAD5"], /* Hangul Syllable */
+ ["\uCAD6", "\uCAD6"], /* Hangul Syllable */
+ ["\uCAD7", "\uCAD7"], /* Hangul Syllable */
+ ["\uCAD8", "\uCAD8"], /* Hangul Syllable */
+ ["\uCAD9", "\uCAD9"], /* Hangul Syllable */
+ ["\uCADA", "\uCADA"], /* Hangul Syllable */
+ ["\uCADB", "\uCADB"], /* Hangul Syllable */
+ ["\uCADC", "\uCADC"], /* Hangul Syllable */
+ ["\uCADD", "\uCADD"], /* Hangul Syllable */
+ ["\uCADE", "\uCADE"], /* Hangul Syllable */
+ ["\uCADF", "\uCADF"], /* Hangul Syllable */
+ ["\uCAE0", "\uCAE0"], /* Hangul Syllable */
+ ["\uCAE1", "\uCAE1"], /* Hangul Syllable */
+ ["\uCAE2", "\uCAE2"], /* Hangul Syllable */
+ ["\uCAE3", "\uCAE3"], /* Hangul Syllable */
+ ["\uCAE4", "\uCAE4"], /* Hangul Syllable */
+ ["\uCAE5", "\uCAE5"], /* Hangul Syllable */
+ ["\uCAE6", "\uCAE6"], /* Hangul Syllable */
+ ["\uCAE7", "\uCAE7"], /* Hangul Syllable */
+ ["\uCAE8", "\uCAE8"], /* Hangul Syllable */
+ ["\uCAE9", "\uCAE9"], /* Hangul Syllable */
+ ["\uCAEA", "\uCAEA"], /* Hangul Syllable */
+ ["\uCAEB", "\uCAEB"], /* Hangul Syllable */
+ ["\uCAEC", "\uCAEC"], /* Hangul Syllable */
+ ["\uCAED", "\uCAED"], /* Hangul Syllable */
+ ["\uCAEE", "\uCAEE"], /* Hangul Syllable */
+ ["\uCAEF", "\uCAEF"], /* Hangul Syllable */
+ ["\uCAF0", "\uCAF0"], /* Hangul Syllable */
+ ["\uCAF1", "\uCAF1"], /* Hangul Syllable */
+ ["\uCAF2", "\uCAF2"], /* Hangul Syllable */
+ ["\uCAF3", "\uCAF3"], /* Hangul Syllable */
+ ["\uCAF4", "\uCAF4"], /* Hangul Syllable */
+ ["\uCAF5", "\uCAF5"], /* Hangul Syllable */
+ ["\uCAF6", "\uCAF6"], /* Hangul Syllable */
+ ["\uCAF7", "\uCAF7"], /* Hangul Syllable */
+ ["\uCAF8", "\uCAF8"], /* Hangul Syllable */
+ ["\uCAF9", "\uCAF9"], /* Hangul Syllable */
+ ["\uCAFA", "\uCAFA"], /* Hangul Syllable */
+ ["\uCAFB", "\uCAFB"], /* Hangul Syllable */
+ ["\uCAFC", "\uCAFC"], /* Hangul Syllable */
+ ["\uCAFD", "\uCAFD"], /* Hangul Syllable */
+ ["\uCAFE", "\uCAFE"], /* Hangul Syllable */
+ ["\uCAFF", "\uCAFF"], /* Hangul Syllable */
+ ["\uCB00", "\uCB00"], /* Hangul Syllable */
+ ["\uCB01", "\uCB01"], /* Hangul Syllable */
+ ["\uCB02", "\uCB02"], /* Hangul Syllable */
+ ["\uCB03", "\uCB03"], /* Hangul Syllable */
+ ["\uCB04", "\uCB04"], /* Hangul Syllable */
+ ["\uCB05", "\uCB05"], /* Hangul Syllable */
+ ["\uCB06", "\uCB06"], /* Hangul Syllable */
+ ["\uCB07", "\uCB07"], /* Hangul Syllable */
+ ["\uCB08", "\uCB08"], /* Hangul Syllable */
+ ["\uCB09", "\uCB09"], /* Hangul Syllable */
+ ["\uCB0A", "\uCB0A"], /* Hangul Syllable */
+ ["\uCB0B", "\uCB0B"], /* Hangul Syllable */
+ ["\uCB0C", "\uCB0C"], /* Hangul Syllable */
+ ["\uCB0D", "\uCB0D"], /* Hangul Syllable */
+ ["\uCB0E", "\uCB0E"], /* Hangul Syllable */
+ ["\uCB0F", "\uCB0F"], /* Hangul Syllable */
+ ["\uCB10", "\uCB10"], /* Hangul Syllable */
+ ["\uCB11", "\uCB11"], /* Hangul Syllable */
+ ["\uCB12", "\uCB12"], /* Hangul Syllable */
+ ["\uCB13", "\uCB13"], /* Hangul Syllable */
+ ["\uCB14", "\uCB14"], /* Hangul Syllable */
+ ["\uCB15", "\uCB15"], /* Hangul Syllable */
+ ["\uCB16", "\uCB16"], /* Hangul Syllable */
+ ["\uCB17", "\uCB17"], /* Hangul Syllable */
+ ["\uCB18", "\uCB18"], /* Hangul Syllable */
+ ["\uCB19", "\uCB19"], /* Hangul Syllable */
+ ["\uCB1A", "\uCB1A"], /* Hangul Syllable */
+ ["\uCB1B", "\uCB1B"], /* Hangul Syllable */
+ ["\uCB1C", "\uCB1C"], /* Hangul Syllable */
+ ["\uCB1D", "\uCB1D"], /* Hangul Syllable */
+ ["\uCB1E", "\uCB1E"], /* Hangul Syllable */
+ ["\uCB1F", "\uCB1F"], /* Hangul Syllable */
+ ["\uCB20", "\uCB20"], /* Hangul Syllable */
+ ["\uCB21", "\uCB21"], /* Hangul Syllable */
+ ["\uCB22", "\uCB22"], /* Hangul Syllable */
+ ["\uCB23", "\uCB23"], /* Hangul Syllable */
+ ["\uCB24", "\uCB24"], /* Hangul Syllable */
+ ["\uCB25", "\uCB25"], /* Hangul Syllable */
+ ["\uCB26", "\uCB26"], /* Hangul Syllable */
+ ["\uCB27", "\uCB27"], /* Hangul Syllable */
+ ["\uCB28", "\uCB28"], /* Hangul Syllable */
+ ["\uCB29", "\uCB29"], /* Hangul Syllable */
+ ["\uCB2A", "\uCB2A"], /* Hangul Syllable */
+ ["\uCB2B", "\uCB2B"], /* Hangul Syllable */
+ ["\uCB2C", "\uCB2C"], /* Hangul Syllable */
+ ["\uCB2D", "\uCB2D"], /* Hangul Syllable */
+ ["\uCB2E", "\uCB2E"], /* Hangul Syllable */
+ ["\uCB2F", "\uCB2F"], /* Hangul Syllable */
+ ["\uCB30", "\uCB30"], /* Hangul Syllable */
+ ["\uCB31", "\uCB31"], /* Hangul Syllable */
+ ["\uCB32", "\uCB32"], /* Hangul Syllable */
+ ["\uCB33", "\uCB33"], /* Hangul Syllable */
+ ["\uCB34", "\uCB34"], /* Hangul Syllable */
+ ["\uCB35", "\uCB35"], /* Hangul Syllable */
+ ["\uCB36", "\uCB36"], /* Hangul Syllable */
+ ["\uCB37", "\uCB37"], /* Hangul Syllable */
+ ["\uCB38", "\uCB38"], /* Hangul Syllable */
+ ["\uCB39", "\uCB39"], /* Hangul Syllable */
+ ["\uCB3A", "\uCB3A"], /* Hangul Syllable */
+ ["\uCB3B", "\uCB3B"], /* Hangul Syllable */
+ ["\uCB3C", "\uCB3C"], /* Hangul Syllable */
+ ["\uCB3D", "\uCB3D"], /* Hangul Syllable */
+ ["\uCB3E", "\uCB3E"], /* Hangul Syllable */
+ ["\uCB3F", "\uCB3F"], /* Hangul Syllable */
+ ["\uCB40", "\uCB40"], /* Hangul Syllable */
+ ["\uCB41", "\uCB41"], /* Hangul Syllable */
+ ["\uCB42", "\uCB42"], /* Hangul Syllable */
+ ["\uCB43", "\uCB43"], /* Hangul Syllable */
+ ["\uCB44", "\uCB44"], /* Hangul Syllable */
+ ["\uCB45", "\uCB45"], /* Hangul Syllable */
+ ["\uCB46", "\uCB46"], /* Hangul Syllable */
+ ["\uCB47", "\uCB47"], /* Hangul Syllable */
+ ["\uCB48", "\uCB48"], /* Hangul Syllable */
+ ["\uCB49", "\uCB49"], /* Hangul Syllable */
+ ["\uCB4A", "\uCB4A"], /* Hangul Syllable */
+ ["\uCB4B", "\uCB4B"], /* Hangul Syllable */
+ ["\uCB4C", "\uCB4C"], /* Hangul Syllable */
+ ["\uCB4D", "\uCB4D"], /* Hangul Syllable */
+ ["\uCB4E", "\uCB4E"], /* Hangul Syllable */
+ ["\uCB4F", "\uCB4F"], /* Hangul Syllable */
+ ["\uCB50", "\uCB50"], /* Hangul Syllable */
+ ["\uCB51", "\uCB51"], /* Hangul Syllable */
+ ["\uCB52", "\uCB52"], /* Hangul Syllable */
+ ["\uCB53", "\uCB53"], /* Hangul Syllable */
+ ["\uCB54", "\uCB54"], /* Hangul Syllable */
+ ["\uCB55", "\uCB55"], /* Hangul Syllable */
+ ["\uCB56", "\uCB56"], /* Hangul Syllable */
+ ["\uCB57", "\uCB57"], /* Hangul Syllable */
+ ["\uCB58", "\uCB58"], /* Hangul Syllable */
+ ["\uCB59", "\uCB59"], /* Hangul Syllable */
+ ["\uCB5A", "\uCB5A"], /* Hangul Syllable */
+ ["\uCB5B", "\uCB5B"], /* Hangul Syllable */
+ ["\uCB5C", "\uCB5C"], /* Hangul Syllable */
+ ["\uCB5D", "\uCB5D"], /* Hangul Syllable */
+ ["\uCB5E", "\uCB5E"], /* Hangul Syllable */
+ ["\uCB5F", "\uCB5F"], /* Hangul Syllable */
+ ["\uCB60", "\uCB60"], /* Hangul Syllable */
+ ["\uCB61", "\uCB61"], /* Hangul Syllable */
+ ["\uCB62", "\uCB62"], /* Hangul Syllable */
+ ["\uCB63", "\uCB63"], /* Hangul Syllable */
+ ["\uCB64", "\uCB64"], /* Hangul Syllable */
+ ["\uCB65", "\uCB65"], /* Hangul Syllable */
+ ["\uCB66", "\uCB66"], /* Hangul Syllable */
+ ["\uCB67", "\uCB67"], /* Hangul Syllable */
+ ["\uCB68", "\uCB68"], /* Hangul Syllable */
+ ["\uCB69", "\uCB69"], /* Hangul Syllable */
+ ["\uCB6A", "\uCB6A"], /* Hangul Syllable */
+ ["\uCB6B", "\uCB6B"], /* Hangul Syllable */
+ ["\uCB6C", "\uCB6C"], /* Hangul Syllable */
+ ["\uCB6D", "\uCB6D"], /* Hangul Syllable */
+ ["\uCB6E", "\uCB6E"], /* Hangul Syllable */
+ ["\uCB6F", "\uCB6F"], /* Hangul Syllable */
+ ["\uCB70", "\uCB70"], /* Hangul Syllable */
+ ["\uCB71", "\uCB71"], /* Hangul Syllable */
+ ["\uCB72", "\uCB72"], /* Hangul Syllable */
+ ["\uCB73", "\uCB73"], /* Hangul Syllable */
+ ["\uCB74", "\uCB74"], /* Hangul Syllable */
+ ["\uCB75", "\uCB75"], /* Hangul Syllable */
+ ["\uCB76", "\uCB76"], /* Hangul Syllable */
+ ["\uCB77", "\uCB77"], /* Hangul Syllable */
+ ["\uCB78", "\uCB78"], /* Hangul Syllable */
+ ["\uCB79", "\uCB79"], /* Hangul Syllable */
+ ["\uCB7A", "\uCB7A"], /* Hangul Syllable */
+ ["\uCB7B", "\uCB7B"], /* Hangul Syllable */
+ ["\uCB7C", "\uCB7C"], /* Hangul Syllable */
+ ["\uCB7D", "\uCB7D"], /* Hangul Syllable */
+ ["\uCB7E", "\uCB7E"], /* Hangul Syllable */
+ ["\uCB7F", "\uCB7F"], /* Hangul Syllable */
+ ["\uCB80", "\uCB80"], /* Hangul Syllable */
+ ["\uCB81", "\uCB81"], /* Hangul Syllable */
+ ["\uCB82", "\uCB82"], /* Hangul Syllable */
+ ["\uCB83", "\uCB83"], /* Hangul Syllable */
+ ["\uCB84", "\uCB84"], /* Hangul Syllable */
+ ["\uCB85", "\uCB85"], /* Hangul Syllable */
+ ["\uCB86", "\uCB86"], /* Hangul Syllable */
+ ["\uCB87", "\uCB87"], /* Hangul Syllable */
+ ["\uCB88", "\uCB88"], /* Hangul Syllable */
+ ["\uCB89", "\uCB89"], /* Hangul Syllable */
+ ["\uCB8A", "\uCB8A"], /* Hangul Syllable */
+ ["\uCB8B", "\uCB8B"], /* Hangul Syllable */
+ ["\uCB8C", "\uCB8C"], /* Hangul Syllable */
+ ["\uCB8D", "\uCB8D"], /* Hangul Syllable */
+ ["\uCB8E", "\uCB8E"], /* Hangul Syllable */
+ ["\uCB8F", "\uCB8F"], /* Hangul Syllable */
+ ["\uCB90", "\uCB90"], /* Hangul Syllable */
+ ["\uCB91", "\uCB91"], /* Hangul Syllable */
+ ["\uCB92", "\uCB92"], /* Hangul Syllable */
+ ["\uCB93", "\uCB93"], /* Hangul Syllable */
+ ["\uCB94", "\uCB94"], /* Hangul Syllable */
+ ["\uCB95", "\uCB95"], /* Hangul Syllable */
+ ["\uCB96", "\uCB96"], /* Hangul Syllable */
+ ["\uCB97", "\uCB97"], /* Hangul Syllable */
+ ["\uCB98", "\uCB98"], /* Hangul Syllable */
+ ["\uCB99", "\uCB99"], /* Hangul Syllable */
+ ["\uCB9A", "\uCB9A"], /* Hangul Syllable */
+ ["\uCB9B", "\uCB9B"], /* Hangul Syllable */
+ ["\uCB9C", "\uCB9C"], /* Hangul Syllable */
+ ["\uCB9D", "\uCB9D"], /* Hangul Syllable */
+ ["\uCB9E", "\uCB9E"], /* Hangul Syllable */
+ ["\uCB9F", "\uCB9F"], /* Hangul Syllable */
+ ["\uCBA0", "\uCBA0"], /* Hangul Syllable */
+ ["\uCBA1", "\uCBA1"], /* Hangul Syllable */
+ ["\uCBA2", "\uCBA2"], /* Hangul Syllable */
+ ["\uCBA3", "\uCBA3"], /* Hangul Syllable */
+ ["\uCBA4", "\uCBA4"], /* Hangul Syllable */
+ ["\uCBA5", "\uCBA5"], /* Hangul Syllable */
+ ["\uCBA6", "\uCBA6"], /* Hangul Syllable */
+ ["\uCBA7", "\uCBA7"], /* Hangul Syllable */
+ ["\uCBA8", "\uCBA8"], /* Hangul Syllable */
+ ["\uCBA9", "\uCBA9"], /* Hangul Syllable */
+ ["\uCBAA", "\uCBAA"], /* Hangul Syllable */
+ ["\uCBAB", "\uCBAB"], /* Hangul Syllable */
+ ["\uCBAC", "\uCBAC"], /* Hangul Syllable */
+ ["\uCBAD", "\uCBAD"], /* Hangul Syllable */
+ ["\uCBAE", "\uCBAE"], /* Hangul Syllable */
+ ["\uCBAF", "\uCBAF"], /* Hangul Syllable */
+ ["\uCBB0", "\uCBB0"], /* Hangul Syllable */
+ ["\uCBB1", "\uCBB1"], /* Hangul Syllable */
+ ["\uCBB2", "\uCBB2"], /* Hangul Syllable */
+ ["\uCBB3", "\uCBB3"], /* Hangul Syllable */
+ ["\uCBB4", "\uCBB4"], /* Hangul Syllable */
+ ["\uCBB5", "\uCBB5"], /* Hangul Syllable */
+ ["\uCBB6", "\uCBB6"], /* Hangul Syllable */
+ ["\uCBB7", "\uCBB7"], /* Hangul Syllable */
+ ["\uCBB8", "\uCBB8"], /* Hangul Syllable */
+ ["\uCBB9", "\uCBB9"], /* Hangul Syllable */
+ ["\uCBBA", "\uCBBA"], /* Hangul Syllable */
+ ["\uCBBB", "\uCBBB"], /* Hangul Syllable */
+ ["\uCBBC", "\uCBBC"], /* Hangul Syllable */
+ ["\uCBBD", "\uCBBD"], /* Hangul Syllable */
+ ["\uCBBE", "\uCBBE"], /* Hangul Syllable */
+ ["\uCBBF", "\uCBBF"], /* Hangul Syllable */
+ ["\uCBC0", "\uCBC0"], /* Hangul Syllable */
+ ["\uCBC1", "\uCBC1"], /* Hangul Syllable */
+ ["\uCBC2", "\uCBC2"], /* Hangul Syllable */
+ ["\uCBC3", "\uCBC3"], /* Hangul Syllable */
+ ["\uCBC4", "\uCBC4"], /* Hangul Syllable */
+ ["\uCBC5", "\uCBC5"], /* Hangul Syllable */
+ ["\uCBC6", "\uCBC6"], /* Hangul Syllable */
+ ["\uCBC7", "\uCBC7"], /* Hangul Syllable */
+ ["\uCBC8", "\uCBC8"], /* Hangul Syllable */
+ ["\uCBC9", "\uCBC9"], /* Hangul Syllable */
+ ["\uCBCA", "\uCBCA"], /* Hangul Syllable */
+ ["\uCBCB", "\uCBCB"], /* Hangul Syllable */
+ ["\uCBCC", "\uCBCC"], /* Hangul Syllable */
+ ["\uCBCD", "\uCBCD"], /* Hangul Syllable */
+ ["\uCBCE", "\uCBCE"], /* Hangul Syllable */
+ ["\uCBCF", "\uCBCF"], /* Hangul Syllable */
+ ["\uCBD0", "\uCBD0"], /* Hangul Syllable */
+ ["\uCBD1", "\uCBD1"], /* Hangul Syllable */
+ ["\uCBD2", "\uCBD2"], /* Hangul Syllable */
+ ["\uCBD3", "\uCBD3"], /* Hangul Syllable */
+ ["\uCBD4", "\uCBD4"], /* Hangul Syllable */
+ ["\uCBD5", "\uCBD5"], /* Hangul Syllable */
+ ["\uCBD6", "\uCBD6"], /* Hangul Syllable */
+ ["\uCBD7", "\uCBD7"], /* Hangul Syllable */
+ ["\uCBD8", "\uCBD8"], /* Hangul Syllable */
+ ["\uCBD9", "\uCBD9"], /* Hangul Syllable */
+ ["\uCBDA", "\uCBDA"], /* Hangul Syllable */
+ ["\uCBDB", "\uCBDB"], /* Hangul Syllable */
+ ["\uCBDC", "\uCBDC"], /* Hangul Syllable */
+ ["\uCBDD", "\uCBDD"], /* Hangul Syllable */
+ ["\uCBDE", "\uCBDE"], /* Hangul Syllable */
+ ["\uCBDF", "\uCBDF"], /* Hangul Syllable */
+ ["\uCBE0", "\uCBE0"], /* Hangul Syllable */
+ ["\uCBE1", "\uCBE1"], /* Hangul Syllable */
+ ["\uCBE2", "\uCBE2"], /* Hangul Syllable */
+ ["\uCBE3", "\uCBE3"], /* Hangul Syllable */
+ ["\uCBE4", "\uCBE4"], /* Hangul Syllable */
+ ["\uCBE5", "\uCBE5"], /* Hangul Syllable */
+ ["\uCBE6", "\uCBE6"], /* Hangul Syllable */
+ ["\uCBE7", "\uCBE7"], /* Hangul Syllable */
+ ["\uCBE8", "\uCBE8"], /* Hangul Syllable */
+ ["\uCBE9", "\uCBE9"], /* Hangul Syllable */
+ ["\uCBEA", "\uCBEA"], /* Hangul Syllable */
+ ["\uCBEB", "\uCBEB"], /* Hangul Syllable */
+ ["\uCBEC", "\uCBEC"], /* Hangul Syllable */
+ ["\uCBED", "\uCBED"], /* Hangul Syllable */
+ ["\uCBEE", "\uCBEE"], /* Hangul Syllable */
+ ["\uCBEF", "\uCBEF"], /* Hangul Syllable */
+ ["\uCBF0", "\uCBF0"], /* Hangul Syllable */
+ ["\uCBF1", "\uCBF1"], /* Hangul Syllable */
+ ["\uCBF2", "\uCBF2"], /* Hangul Syllable */
+ ["\uCBF3", "\uCBF3"], /* Hangul Syllable */
+ ["\uCBF4", "\uCBF4"], /* Hangul Syllable */
+ ["\uCBF5", "\uCBF5"], /* Hangul Syllable */
+ ["\uCBF6", "\uCBF6"], /* Hangul Syllable */
+ ["\uCBF7", "\uCBF7"], /* Hangul Syllable */
+ ["\uCBF8", "\uCBF8"], /* Hangul Syllable */
+ ["\uCBF9", "\uCBF9"], /* Hangul Syllable */
+ ["\uCBFA", "\uCBFA"], /* Hangul Syllable */
+ ["\uCBFB", "\uCBFB"], /* Hangul Syllable */
+ ["\uCBFC", "\uCBFC"], /* Hangul Syllable */
+ ["\uCBFD", "\uCBFD"], /* Hangul Syllable */
+ ["\uCBFE", "\uCBFE"], /* Hangul Syllable */
+ ["\uCBFF", "\uCBFF"], /* Hangul Syllable */
+ ["\uCC00", "\uCC00"], /* Hangul Syllable */
+ ["\uCC01", "\uCC01"], /* Hangul Syllable */
+ ["\uCC02", "\uCC02"], /* Hangul Syllable */
+ ["\uCC03", "\uCC03"], /* Hangul Syllable */
+ ["\uCC04", "\uCC04"], /* Hangul Syllable */
+ ["\uCC05", "\uCC05"], /* Hangul Syllable */
+ ["\uCC06", "\uCC06"], /* Hangul Syllable */
+ ["\uCC07", "\uCC07"], /* Hangul Syllable */
+ ["\uCC08", "\uCC08"], /* Hangul Syllable */
+ ["\uCC09", "\uCC09"], /* Hangul Syllable */
+ ["\uCC0A", "\uCC0A"], /* Hangul Syllable */
+ ["\uCC0B", "\uCC0B"], /* Hangul Syllable */
+ ["\uCC0C", "\uCC0C"], /* Hangul Syllable */
+ ["\uCC0D", "\uCC0D"], /* Hangul Syllable */
+ ["\uCC0E", "\uCC0E"], /* Hangul Syllable */
+ ["\uCC0F", "\uCC0F"], /* Hangul Syllable */
+ ["\uCC10", "\uCC10"], /* Hangul Syllable */
+ ["\uCC11", "\uCC11"], /* Hangul Syllable */
+ ["\uCC12", "\uCC12"], /* Hangul Syllable */
+ ["\uCC13", "\uCC13"], /* Hangul Syllable */
+ ["\uCC14", "\uCC14"], /* Hangul Syllable */
+ ["\uCC15", "\uCC15"], /* Hangul Syllable */
+ ["\uCC16", "\uCC16"], /* Hangul Syllable */
+ ["\uCC17", "\uCC17"], /* Hangul Syllable */
+ ["\uCC18", "\uCC18"], /* Hangul Syllable */
+ ["\uCC19", "\uCC19"], /* Hangul Syllable */
+ ["\uCC1A", "\uCC1A"], /* Hangul Syllable */
+ ["\uCC1B", "\uCC1B"], /* Hangul Syllable */
+ ["\uCC1C", "\uCC1C"], /* Hangul Syllable */
+ ["\uCC1D", "\uCC1D"], /* Hangul Syllable */
+ ["\uCC1E", "\uCC1E"], /* Hangul Syllable */
+ ["\uCC1F", "\uCC1F"], /* Hangul Syllable */
+ ["\uCC20", "\uCC20"], /* Hangul Syllable */
+ ["\uCC21", "\uCC21"], /* Hangul Syllable */
+ ["\uCC22", "\uCC22"], /* Hangul Syllable */
+ ["\uCC23", "\uCC23"], /* Hangul Syllable */
+ ["\uCC24", "\uCC24"], /* Hangul Syllable */
+ ["\uCC25", "\uCC25"], /* Hangul Syllable */
+ ["\uCC26", "\uCC26"], /* Hangul Syllable */
+ ["\uCC27", "\uCC27"], /* Hangul Syllable */
+ ["\uCC28", "\uCC28"], /* Hangul Syllable */
+ ["\uCC29", "\uCC29"], /* Hangul Syllable */
+ ["\uCC2A", "\uCC2A"], /* Hangul Syllable */
+ ["\uCC2B", "\uCC2B"], /* Hangul Syllable */
+ ["\uCC2C", "\uCC2C"], /* Hangul Syllable */
+ ["\uCC2D", "\uCC2D"], /* Hangul Syllable */
+ ["\uCC2E", "\uCC2E"], /* Hangul Syllable */
+ ["\uCC2F", "\uCC2F"], /* Hangul Syllable */
+ ["\uCC30", "\uCC30"], /* Hangul Syllable */
+ ["\uCC31", "\uCC31"], /* Hangul Syllable */
+ ["\uCC32", "\uCC32"], /* Hangul Syllable */
+ ["\uCC33", "\uCC33"], /* Hangul Syllable */
+ ["\uCC34", "\uCC34"], /* Hangul Syllable */
+ ["\uCC35", "\uCC35"], /* Hangul Syllable */
+ ["\uCC36", "\uCC36"], /* Hangul Syllable */
+ ["\uCC37", "\uCC37"], /* Hangul Syllable */
+ ["\uCC38", "\uCC38"], /* Hangul Syllable */
+ ["\uCC39", "\uCC39"], /* Hangul Syllable */
+ ["\uCC3A", "\uCC3A"], /* Hangul Syllable */
+ ["\uCC3B", "\uCC3B"], /* Hangul Syllable */
+ ["\uCC3C", "\uCC3C"], /* Hangul Syllable */
+ ["\uCC3D", "\uCC3D"], /* Hangul Syllable */
+ ["\uCC3E", "\uCC3E"], /* Hangul Syllable */
+ ["\uCC3F", "\uCC3F"], /* Hangul Syllable */
+ ["\uCC40", "\uCC40"], /* Hangul Syllable */
+ ["\uCC41", "\uCC41"], /* Hangul Syllable */
+ ["\uCC42", "\uCC42"], /* Hangul Syllable */
+ ["\uCC43", "\uCC43"], /* Hangul Syllable */
+ ["\uCC44", "\uCC44"], /* Hangul Syllable */
+ ["\uCC45", "\uCC45"], /* Hangul Syllable */
+ ["\uCC46", "\uCC46"], /* Hangul Syllable */
+ ["\uCC47", "\uCC47"], /* Hangul Syllable */
+ ["\uCC48", "\uCC48"], /* Hangul Syllable */
+ ["\uCC49", "\uCC49"], /* Hangul Syllable */
+ ["\uCC4A", "\uCC4A"], /* Hangul Syllable */
+ ["\uCC4B", "\uCC4B"], /* Hangul Syllable */
+ ["\uCC4C", "\uCC4C"], /* Hangul Syllable */
+ ["\uCC4D", "\uCC4D"], /* Hangul Syllable */
+ ["\uCC4E", "\uCC4E"], /* Hangul Syllable */
+ ["\uCC4F", "\uCC4F"], /* Hangul Syllable */
+ ["\uCC50", "\uCC50"], /* Hangul Syllable */
+ ["\uCC51", "\uCC51"], /* Hangul Syllable */
+ ["\uCC52", "\uCC52"], /* Hangul Syllable */
+ ["\uCC53", "\uCC53"], /* Hangul Syllable */
+ ["\uCC54", "\uCC54"], /* Hangul Syllable */
+ ["\uCC55", "\uCC55"], /* Hangul Syllable */
+ ["\uCC56", "\uCC56"], /* Hangul Syllable */
+ ["\uCC57", "\uCC57"], /* Hangul Syllable */
+ ["\uCC58", "\uCC58"], /* Hangul Syllable */
+ ["\uCC59", "\uCC59"], /* Hangul Syllable */
+ ["\uCC5A", "\uCC5A"], /* Hangul Syllable */
+ ["\uCC5B", "\uCC5B"], /* Hangul Syllable */
+ ["\uCC5C", "\uCC5C"], /* Hangul Syllable */
+ ["\uCC5D", "\uCC5D"], /* Hangul Syllable */
+ ["\uCC5E", "\uCC5E"], /* Hangul Syllable */
+ ["\uCC5F", "\uCC5F"], /* Hangul Syllable */
+ ["\uCC60", "\uCC60"], /* Hangul Syllable */
+ ["\uCC61", "\uCC61"], /* Hangul Syllable */
+ ["\uCC62", "\uCC62"], /* Hangul Syllable */
+ ["\uCC63", "\uCC63"], /* Hangul Syllable */
+ ["\uCC64", "\uCC64"], /* Hangul Syllable */
+ ["\uCC65", "\uCC65"], /* Hangul Syllable */
+ ["\uCC66", "\uCC66"], /* Hangul Syllable */
+ ["\uCC67", "\uCC67"], /* Hangul Syllable */
+ ["\uCC68", "\uCC68"], /* Hangul Syllable */
+ ["\uCC69", "\uCC69"], /* Hangul Syllable */
+ ["\uCC6A", "\uCC6A"], /* Hangul Syllable */
+ ["\uCC6B", "\uCC6B"], /* Hangul Syllable */
+ ["\uCC6C", "\uCC6C"], /* Hangul Syllable */
+ ["\uCC6D", "\uCC6D"], /* Hangul Syllable */
+ ["\uCC6E", "\uCC6E"], /* Hangul Syllable */
+ ["\uCC6F", "\uCC6F"], /* Hangul Syllable */
+ ["\uCC70", "\uCC70"], /* Hangul Syllable */
+ ["\uCC71", "\uCC71"], /* Hangul Syllable */
+ ["\uCC72", "\uCC72"], /* Hangul Syllable */
+ ["\uCC73", "\uCC73"], /* Hangul Syllable */
+ ["\uCC74", "\uCC74"], /* Hangul Syllable */
+ ["\uCC75", "\uCC75"], /* Hangul Syllable */
+ ["\uCC76", "\uCC76"], /* Hangul Syllable */
+ ["\uCC77", "\uCC77"], /* Hangul Syllable */
+ ["\uCC78", "\uCC78"], /* Hangul Syllable */
+ ["\uCC79", "\uCC79"], /* Hangul Syllable */
+ ["\uCC7A", "\uCC7A"], /* Hangul Syllable */
+ ["\uCC7B", "\uCC7B"], /* Hangul Syllable */
+ ["\uCC7C", "\uCC7C"], /* Hangul Syllable */
+ ["\uCC7D", "\uCC7D"], /* Hangul Syllable */
+ ["\uCC7E", "\uCC7E"], /* Hangul Syllable */
+ ["\uCC7F", "\uCC7F"], /* Hangul Syllable */
+ ["\uCC80", "\uCC80"], /* Hangul Syllable */
+ ["\uCC81", "\uCC81"], /* Hangul Syllable */
+ ["\uCC82", "\uCC82"], /* Hangul Syllable */
+ ["\uCC83", "\uCC83"], /* Hangul Syllable */
+ ["\uCC84", "\uCC84"], /* Hangul Syllable */
+ ["\uCC85", "\uCC85"], /* Hangul Syllable */
+ ["\uCC86", "\uCC86"], /* Hangul Syllable */
+ ["\uCC87", "\uCC87"], /* Hangul Syllable */
+ ["\uCC88", "\uCC88"], /* Hangul Syllable */
+ ["\uCC89", "\uCC89"], /* Hangul Syllable */
+ ["\uCC8A", "\uCC8A"], /* Hangul Syllable */
+ ["\uCC8B", "\uCC8B"], /* Hangul Syllable */
+ ["\uCC8C", "\uCC8C"], /* Hangul Syllable */
+ ["\uCC8D", "\uCC8D"], /* Hangul Syllable */
+ ["\uCC8E", "\uCC8E"], /* Hangul Syllable */
+ ["\uCC8F", "\uCC8F"], /* Hangul Syllable */
+ ["\uCC90", "\uCC90"], /* Hangul Syllable */
+ ["\uCC91", "\uCC91"], /* Hangul Syllable */
+ ["\uCC92", "\uCC92"], /* Hangul Syllable */
+ ["\uCC93", "\uCC93"], /* Hangul Syllable */
+ ["\uCC94", "\uCC94"], /* Hangul Syllable */
+ ["\uCC95", "\uCC95"], /* Hangul Syllable */
+ ["\uCC96", "\uCC96"], /* Hangul Syllable */
+ ["\uCC97", "\uCC97"], /* Hangul Syllable */
+ ["\uCC98", "\uCC98"], /* Hangul Syllable */
+ ["\uCC99", "\uCC99"], /* Hangul Syllable */
+ ["\uCC9A", "\uCC9A"], /* Hangul Syllable */
+ ["\uCC9B", "\uCC9B"], /* Hangul Syllable */
+ ["\uCC9C", "\uCC9C"], /* Hangul Syllable */
+ ["\uCC9D", "\uCC9D"], /* Hangul Syllable */
+ ["\uCC9E", "\uCC9E"], /* Hangul Syllable */
+ ["\uCC9F", "\uCC9F"], /* Hangul Syllable */
+ ["\uCCA0", "\uCCA0"], /* Hangul Syllable */
+ ["\uCCA1", "\uCCA1"], /* Hangul Syllable */
+ ["\uCCA2", "\uCCA2"], /* Hangul Syllable */
+ ["\uCCA3", "\uCCA3"], /* Hangul Syllable */
+ ["\uCCA4", "\uCCA4"], /* Hangul Syllable */
+ ["\uCCA5", "\uCCA5"], /* Hangul Syllable */
+ ["\uCCA6", "\uCCA6"], /* Hangul Syllable */
+ ["\uCCA7", "\uCCA7"], /* Hangul Syllable */
+ ["\uCCA8", "\uCCA8"], /* Hangul Syllable */
+ ["\uCCA9", "\uCCA9"], /* Hangul Syllable */
+ ["\uCCAA", "\uCCAA"], /* Hangul Syllable */
+ ["\uCCAB", "\uCCAB"], /* Hangul Syllable */
+ ["\uCCAC", "\uCCAC"], /* Hangul Syllable */
+ ["\uCCAD", "\uCCAD"], /* Hangul Syllable */
+ ["\uCCAE", "\uCCAE"], /* Hangul Syllable */
+ ["\uCCAF", "\uCCAF"], /* Hangul Syllable */
+ ["\uCCB0", "\uCCB0"], /* Hangul Syllable */
+ ["\uCCB1", "\uCCB1"], /* Hangul Syllable */
+ ["\uCCB2", "\uCCB2"], /* Hangul Syllable */
+ ["\uCCB3", "\uCCB3"], /* Hangul Syllable */
+ ["\uCCB4", "\uCCB4"], /* Hangul Syllable */
+ ["\uCCB5", "\uCCB5"], /* Hangul Syllable */
+ ["\uCCB6", "\uCCB6"], /* Hangul Syllable */
+ ["\uCCB7", "\uCCB7"], /* Hangul Syllable */
+ ["\uCCB8", "\uCCB8"], /* Hangul Syllable */
+ ["\uCCB9", "\uCCB9"], /* Hangul Syllable */
+ ["\uCCBA", "\uCCBA"], /* Hangul Syllable */
+ ["\uCCBB", "\uCCBB"], /* Hangul Syllable */
+ ["\uCCBC", "\uCCBC"], /* Hangul Syllable */
+ ["\uCCBD", "\uCCBD"], /* Hangul Syllable */
+ ["\uCCBE", "\uCCBE"], /* Hangul Syllable */
+ ["\uCCBF", "\uCCBF"], /* Hangul Syllable */
+ ["\uCCC0", "\uCCC0"], /* Hangul Syllable */
+ ["\uCCC1", "\uCCC1"], /* Hangul Syllable */
+ ["\uCCC2", "\uCCC2"], /* Hangul Syllable */
+ ["\uCCC3", "\uCCC3"], /* Hangul Syllable */
+ ["\uCCC4", "\uCCC4"], /* Hangul Syllable */
+ ["\uCCC5", "\uCCC5"], /* Hangul Syllable */
+ ["\uCCC6", "\uCCC6"], /* Hangul Syllable */
+ ["\uCCC7", "\uCCC7"], /* Hangul Syllable */
+ ["\uCCC8", "\uCCC8"], /* Hangul Syllable */
+ ["\uCCC9", "\uCCC9"], /* Hangul Syllable */
+ ["\uCCCA", "\uCCCA"], /* Hangul Syllable */
+ ["\uCCCB", "\uCCCB"], /* Hangul Syllable */
+ ["\uCCCC", "\uCCCC"], /* Hangul Syllable */
+ ["\uCCCD", "\uCCCD"], /* Hangul Syllable */
+ ["\uCCCE", "\uCCCE"], /* Hangul Syllable */
+ ["\uCCCF", "\uCCCF"], /* Hangul Syllable */
+ ["\uCCD0", "\uCCD0"], /* Hangul Syllable */
+ ["\uCCD1", "\uCCD1"], /* Hangul Syllable */
+ ["\uCCD2", "\uCCD2"], /* Hangul Syllable */
+ ["\uCCD3", "\uCCD3"], /* Hangul Syllable */
+ ["\uCCD4", "\uCCD4"], /* Hangul Syllable */
+ ["\uCCD5", "\uCCD5"], /* Hangul Syllable */
+ ["\uCCD6", "\uCCD6"], /* Hangul Syllable */
+ ["\uCCD7", "\uCCD7"], /* Hangul Syllable */
+ ["\uCCD8", "\uCCD8"], /* Hangul Syllable */
+ ["\uCCD9", "\uCCD9"], /* Hangul Syllable */
+ ["\uCCDA", "\uCCDA"], /* Hangul Syllable */
+ ["\uCCDB", "\uCCDB"], /* Hangul Syllable */
+ ["\uCCDC", "\uCCDC"], /* Hangul Syllable */
+ ["\uCCDD", "\uCCDD"], /* Hangul Syllable */
+ ["\uCCDE", "\uCCDE"], /* Hangul Syllable */
+ ["\uCCDF", "\uCCDF"], /* Hangul Syllable */
+ ["\uCCE0", "\uCCE0"], /* Hangul Syllable */
+ ["\uCCE1", "\uCCE1"], /* Hangul Syllable */
+ ["\uCCE2", "\uCCE2"], /* Hangul Syllable */
+ ["\uCCE3", "\uCCE3"], /* Hangul Syllable */
+ ["\uCCE4", "\uCCE4"], /* Hangul Syllable */
+ ["\uCCE5", "\uCCE5"], /* Hangul Syllable */
+ ["\uCCE6", "\uCCE6"], /* Hangul Syllable */
+ ["\uCCE7", "\uCCE7"], /* Hangul Syllable */
+ ["\uCCE8", "\uCCE8"], /* Hangul Syllable */
+ ["\uCCE9", "\uCCE9"], /* Hangul Syllable */
+ ["\uCCEA", "\uCCEA"], /* Hangul Syllable */
+ ["\uCCEB", "\uCCEB"], /* Hangul Syllable */
+ ["\uCCEC", "\uCCEC"], /* Hangul Syllable */
+ ["\uCCED", "\uCCED"], /* Hangul Syllable */
+ ["\uCCEE", "\uCCEE"], /* Hangul Syllable */
+ ["\uCCEF", "\uCCEF"], /* Hangul Syllable */
+ ["\uCCF0", "\uCCF0"], /* Hangul Syllable */
+ ["\uCCF1", "\uCCF1"], /* Hangul Syllable */
+ ["\uCCF2", "\uCCF2"], /* Hangul Syllable */
+ ["\uCCF3", "\uCCF3"], /* Hangul Syllable */
+ ["\uCCF4", "\uCCF4"], /* Hangul Syllable */
+ ["\uCCF5", "\uCCF5"], /* Hangul Syllable */
+ ["\uCCF6", "\uCCF6"], /* Hangul Syllable */
+ ["\uCCF7", "\uCCF7"], /* Hangul Syllable */
+ ["\uCCF8", "\uCCF8"], /* Hangul Syllable */
+ ["\uCCF9", "\uCCF9"], /* Hangul Syllable */
+ ["\uCCFA", "\uCCFA"], /* Hangul Syllable */
+ ["\uCCFB", "\uCCFB"], /* Hangul Syllable */
+ ["\uCCFC", "\uCCFC"], /* Hangul Syllable */
+ ["\uCCFD", "\uCCFD"], /* Hangul Syllable */
+ ["\uCCFE", "\uCCFE"], /* Hangul Syllable */
+ ["\uCCFF", "\uCCFF"], /* Hangul Syllable */
+ ["\uCD00", "\uCD00"], /* Hangul Syllable */
+ ["\uCD01", "\uCD01"], /* Hangul Syllable */
+ ["\uCD02", "\uCD02"], /* Hangul Syllable */
+ ["\uCD03", "\uCD03"], /* Hangul Syllable */
+ ["\uCD04", "\uCD04"], /* Hangul Syllable */
+ ["\uCD05", "\uCD05"], /* Hangul Syllable */
+ ["\uCD06", "\uCD06"], /* Hangul Syllable */
+ ["\uCD07", "\uCD07"], /* Hangul Syllable */
+ ["\uCD08", "\uCD08"], /* Hangul Syllable */
+ ["\uCD09", "\uCD09"], /* Hangul Syllable */
+ ["\uCD0A", "\uCD0A"], /* Hangul Syllable */
+ ["\uCD0B", "\uCD0B"], /* Hangul Syllable */
+ ["\uCD0C", "\uCD0C"], /* Hangul Syllable */
+ ["\uCD0D", "\uCD0D"], /* Hangul Syllable */
+ ["\uCD0E", "\uCD0E"], /* Hangul Syllable */
+ ["\uCD0F", "\uCD0F"], /* Hangul Syllable */
+ ["\uCD10", "\uCD10"], /* Hangul Syllable */
+ ["\uCD11", "\uCD11"], /* Hangul Syllable */
+ ["\uCD12", "\uCD12"], /* Hangul Syllable */
+ ["\uCD13", "\uCD13"], /* Hangul Syllable */
+ ["\uCD14", "\uCD14"], /* Hangul Syllable */
+ ["\uCD15", "\uCD15"], /* Hangul Syllable */
+ ["\uCD16", "\uCD16"], /* Hangul Syllable */
+ ["\uCD17", "\uCD17"], /* Hangul Syllable */
+ ["\uCD18", "\uCD18"], /* Hangul Syllable */
+ ["\uCD19", "\uCD19"], /* Hangul Syllable */
+ ["\uCD1A", "\uCD1A"], /* Hangul Syllable */
+ ["\uCD1B", "\uCD1B"], /* Hangul Syllable */
+ ["\uCD1C", "\uCD1C"], /* Hangul Syllable */
+ ["\uCD1D", "\uCD1D"], /* Hangul Syllable */
+ ["\uCD1E", "\uCD1E"], /* Hangul Syllable */
+ ["\uCD1F", "\uCD1F"], /* Hangul Syllable */
+ ["\uCD20", "\uCD20"], /* Hangul Syllable */
+ ["\uCD21", "\uCD21"], /* Hangul Syllable */
+ ["\uCD22", "\uCD22"], /* Hangul Syllable */
+ ["\uCD23", "\uCD23"], /* Hangul Syllable */
+ ["\uCD24", "\uCD24"], /* Hangul Syllable */
+ ["\uCD25", "\uCD25"], /* Hangul Syllable */
+ ["\uCD26", "\uCD26"], /* Hangul Syllable */
+ ["\uCD27", "\uCD27"], /* Hangul Syllable */
+ ["\uCD28", "\uCD28"], /* Hangul Syllable */
+ ["\uCD29", "\uCD29"], /* Hangul Syllable */
+ ["\uCD2A", "\uCD2A"], /* Hangul Syllable */
+ ["\uCD2B", "\uCD2B"], /* Hangul Syllable */
+ ["\uCD2C", "\uCD2C"], /* Hangul Syllable */
+ ["\uCD2D", "\uCD2D"], /* Hangul Syllable */
+ ["\uCD2E", "\uCD2E"], /* Hangul Syllable */
+ ["\uCD2F", "\uCD2F"], /* Hangul Syllable */
+ ["\uCD30", "\uCD30"], /* Hangul Syllable */
+ ["\uCD31", "\uCD31"], /* Hangul Syllable */
+ ["\uCD32", "\uCD32"], /* Hangul Syllable */
+ ["\uCD33", "\uCD33"], /* Hangul Syllable */
+ ["\uCD34", "\uCD34"], /* Hangul Syllable */
+ ["\uCD35", "\uCD35"], /* Hangul Syllable */
+ ["\uCD36", "\uCD36"], /* Hangul Syllable */
+ ["\uCD37", "\uCD37"], /* Hangul Syllable */
+ ["\uCD38", "\uCD38"], /* Hangul Syllable */
+ ["\uCD39", "\uCD39"], /* Hangul Syllable */
+ ["\uCD3A", "\uCD3A"], /* Hangul Syllable */
+ ["\uCD3B", "\uCD3B"], /* Hangul Syllable */
+ ["\uCD3C", "\uCD3C"], /* Hangul Syllable */
+ ["\uCD3D", "\uCD3D"], /* Hangul Syllable */
+ ["\uCD3E", "\uCD3E"], /* Hangul Syllable */
+ ["\uCD3F", "\uCD3F"], /* Hangul Syllable */
+ ["\uCD40", "\uCD40"], /* Hangul Syllable */
+ ["\uCD41", "\uCD41"], /* Hangul Syllable */
+ ["\uCD42", "\uCD42"], /* Hangul Syllable */
+ ["\uCD43", "\uCD43"], /* Hangul Syllable */
+ ["\uCD44", "\uCD44"], /* Hangul Syllable */
+ ["\uCD45", "\uCD45"], /* Hangul Syllable */
+ ["\uCD46", "\uCD46"], /* Hangul Syllable */
+ ["\uCD47", "\uCD47"], /* Hangul Syllable */
+ ["\uCD48", "\uCD48"], /* Hangul Syllable */
+ ["\uCD49", "\uCD49"], /* Hangul Syllable */
+ ["\uCD4A", "\uCD4A"], /* Hangul Syllable */
+ ["\uCD4B", "\uCD4B"], /* Hangul Syllable */
+ ["\uCD4C", "\uCD4C"], /* Hangul Syllable */
+ ["\uCD4D", "\uCD4D"], /* Hangul Syllable */
+ ["\uCD4E", "\uCD4E"], /* Hangul Syllable */
+ ["\uCD4F", "\uCD4F"], /* Hangul Syllable */
+ ["\uCD50", "\uCD50"], /* Hangul Syllable */
+ ["\uCD51", "\uCD51"], /* Hangul Syllable */
+ ["\uCD52", "\uCD52"], /* Hangul Syllable */
+ ["\uCD53", "\uCD53"], /* Hangul Syllable */
+ ["\uCD54", "\uCD54"], /* Hangul Syllable */
+ ["\uCD55", "\uCD55"], /* Hangul Syllable */
+ ["\uCD56", "\uCD56"], /* Hangul Syllable */
+ ["\uCD57", "\uCD57"], /* Hangul Syllable */
+ ["\uCD58", "\uCD58"], /* Hangul Syllable */
+ ["\uCD59", "\uCD59"], /* Hangul Syllable */
+ ["\uCD5A", "\uCD5A"], /* Hangul Syllable */
+ ["\uCD5B", "\uCD5B"], /* Hangul Syllable */
+ ["\uCD5C", "\uCD5C"], /* Hangul Syllable */
+ ["\uCD5D", "\uCD5D"], /* Hangul Syllable */
+ ["\uCD5E", "\uCD5E"], /* Hangul Syllable */
+ ["\uCD5F", "\uCD5F"], /* Hangul Syllable */
+ ["\uCD60", "\uCD60"], /* Hangul Syllable */
+ ["\uCD61", "\uCD61"], /* Hangul Syllable */
+ ["\uCD62", "\uCD62"], /* Hangul Syllable */
+ ["\uCD63", "\uCD63"], /* Hangul Syllable */
+ ["\uCD64", "\uCD64"], /* Hangul Syllable */
+ ["\uCD65", "\uCD65"], /* Hangul Syllable */
+ ["\uCD66", "\uCD66"], /* Hangul Syllable */
+ ["\uCD67", "\uCD67"], /* Hangul Syllable */
+ ["\uCD68", "\uCD68"], /* Hangul Syllable */
+ ["\uCD69", "\uCD69"], /* Hangul Syllable */
+ ["\uCD6A", "\uCD6A"], /* Hangul Syllable */
+ ["\uCD6B", "\uCD6B"], /* Hangul Syllable */
+ ["\uCD6C", "\uCD6C"], /* Hangul Syllable */
+ ["\uCD6D", "\uCD6D"], /* Hangul Syllable */
+ ["\uCD6E", "\uCD6E"], /* Hangul Syllable */
+ ["\uCD6F", "\uCD6F"], /* Hangul Syllable */
+ ["\uCD70", "\uCD70"], /* Hangul Syllable */
+ ["\uCD71", "\uCD71"], /* Hangul Syllable */
+ ["\uCD72", "\uCD72"], /* Hangul Syllable */
+ ["\uCD73", "\uCD73"], /* Hangul Syllable */
+ ["\uCD74", "\uCD74"], /* Hangul Syllable */
+ ["\uCD75", "\uCD75"], /* Hangul Syllable */
+ ["\uCD76", "\uCD76"], /* Hangul Syllable */
+ ["\uCD77", "\uCD77"], /* Hangul Syllable */
+ ["\uCD78", "\uCD78"], /* Hangul Syllable */
+ ["\uCD79", "\uCD79"], /* Hangul Syllable */
+ ["\uCD7A", "\uCD7A"], /* Hangul Syllable */
+ ["\uCD7B", "\uCD7B"], /* Hangul Syllable */
+ ["\uCD7C", "\uCD7C"], /* Hangul Syllable */
+ ["\uCD7D", "\uCD7D"], /* Hangul Syllable */
+ ["\uCD7E", "\uCD7E"], /* Hangul Syllable */
+ ["\uCD7F", "\uCD7F"], /* Hangul Syllable */
+ ["\uCD80", "\uCD80"], /* Hangul Syllable */
+ ["\uCD81", "\uCD81"], /* Hangul Syllable */
+ ["\uCD82", "\uCD82"], /* Hangul Syllable */
+ ["\uCD83", "\uCD83"], /* Hangul Syllable */
+ ["\uCD84", "\uCD84"], /* Hangul Syllable */
+ ["\uCD85", "\uCD85"], /* Hangul Syllable */
+ ["\uCD86", "\uCD86"], /* Hangul Syllable */
+ ["\uCD87", "\uCD87"], /* Hangul Syllable */
+ ["\uCD88", "\uCD88"], /* Hangul Syllable */
+ ["\uCD89", "\uCD89"], /* Hangul Syllable */
+ ["\uCD8A", "\uCD8A"], /* Hangul Syllable */
+ ["\uCD8B", "\uCD8B"], /* Hangul Syllable */
+ ["\uCD8C", "\uCD8C"], /* Hangul Syllable */
+ ["\uCD8D", "\uCD8D"], /* Hangul Syllable */
+ ["\uCD8E", "\uCD8E"], /* Hangul Syllable */
+ ["\uCD8F", "\uCD8F"], /* Hangul Syllable */
+ ["\uCD90", "\uCD90"], /* Hangul Syllable */
+ ["\uCD91", "\uCD91"], /* Hangul Syllable */
+ ["\uCD92", "\uCD92"], /* Hangul Syllable */
+ ["\uCD93", "\uCD93"], /* Hangul Syllable */
+ ["\uCD94", "\uCD94"], /* Hangul Syllable */
+ ["\uCD95", "\uCD95"], /* Hangul Syllable */
+ ["\uCD96", "\uCD96"], /* Hangul Syllable */
+ ["\uCD97", "\uCD97"], /* Hangul Syllable */
+ ["\uCD98", "\uCD98"], /* Hangul Syllable */
+ ["\uCD99", "\uCD99"], /* Hangul Syllable */
+ ["\uCD9A", "\uCD9A"], /* Hangul Syllable */
+ ["\uCD9B", "\uCD9B"], /* Hangul Syllable */
+ ["\uCD9C", "\uCD9C"], /* Hangul Syllable */
+ ["\uCD9D", "\uCD9D"], /* Hangul Syllable */
+ ["\uCD9E", "\uCD9E"], /* Hangul Syllable */
+ ["\uCD9F", "\uCD9F"], /* Hangul Syllable */
+ ["\uCDA0", "\uCDA0"], /* Hangul Syllable */
+ ["\uCDA1", "\uCDA1"], /* Hangul Syllable */
+ ["\uCDA2", "\uCDA2"], /* Hangul Syllable */
+ ["\uCDA3", "\uCDA3"], /* Hangul Syllable */
+ ["\uCDA4", "\uCDA4"], /* Hangul Syllable */
+ ["\uCDA5", "\uCDA5"], /* Hangul Syllable */
+ ["\uCDA6", "\uCDA6"], /* Hangul Syllable */
+ ["\uCDA7", "\uCDA7"], /* Hangul Syllable */
+ ["\uCDA8", "\uCDA8"], /* Hangul Syllable */
+ ["\uCDA9", "\uCDA9"], /* Hangul Syllable */
+ ["\uCDAA", "\uCDAA"], /* Hangul Syllable */
+ ["\uCDAB", "\uCDAB"], /* Hangul Syllable */
+ ["\uCDAC", "\uCDAC"], /* Hangul Syllable */
+ ["\uCDAD", "\uCDAD"], /* Hangul Syllable */
+ ["\uCDAE", "\uCDAE"], /* Hangul Syllable */
+ ["\uCDAF", "\uCDAF"], /* Hangul Syllable */
+ ["\uCDB0", "\uCDB0"], /* Hangul Syllable */
+ ["\uCDB1", "\uCDB1"], /* Hangul Syllable */
+ ["\uCDB2", "\uCDB2"], /* Hangul Syllable */
+ ["\uCDB3", "\uCDB3"], /* Hangul Syllable */
+ ["\uCDB4", "\uCDB4"], /* Hangul Syllable */
+ ["\uCDB5", "\uCDB5"], /* Hangul Syllable */
+ ["\uCDB6", "\uCDB6"], /* Hangul Syllable */
+ ["\uCDB7", "\uCDB7"], /* Hangul Syllable */
+ ["\uCDB8", "\uCDB8"], /* Hangul Syllable */
+ ["\uCDB9", "\uCDB9"], /* Hangul Syllable */
+ ["\uCDBA", "\uCDBA"], /* Hangul Syllable */
+ ["\uCDBB", "\uCDBB"], /* Hangul Syllable */
+ ["\uCDBC", "\uCDBC"], /* Hangul Syllable */
+ ["\uCDBD", "\uCDBD"], /* Hangul Syllable */
+ ["\uCDBE", "\uCDBE"], /* Hangul Syllable */
+ ["\uCDBF", "\uCDBF"], /* Hangul Syllable */
+ ["\uCDC0", "\uCDC0"], /* Hangul Syllable */
+ ["\uCDC1", "\uCDC1"], /* Hangul Syllable */
+ ["\uCDC2", "\uCDC2"], /* Hangul Syllable */
+ ["\uCDC3", "\uCDC3"], /* Hangul Syllable */
+ ["\uCDC4", "\uCDC4"], /* Hangul Syllable */
+ ["\uCDC5", "\uCDC5"], /* Hangul Syllable */
+ ["\uCDC6", "\uCDC6"], /* Hangul Syllable */
+ ["\uCDC7", "\uCDC7"], /* Hangul Syllable */
+ ["\uCDC8", "\uCDC8"], /* Hangul Syllable */
+ ["\uCDC9", "\uCDC9"], /* Hangul Syllable */
+ ["\uCDCA", "\uCDCA"], /* Hangul Syllable */
+ ["\uCDCB", "\uCDCB"], /* Hangul Syllable */
+ ["\uCDCC", "\uCDCC"], /* Hangul Syllable */
+ ["\uCDCD", "\uCDCD"], /* Hangul Syllable */
+ ["\uCDCE", "\uCDCE"], /* Hangul Syllable */
+ ["\uCDCF", "\uCDCF"], /* Hangul Syllable */
+ ["\uCDD0", "\uCDD0"], /* Hangul Syllable */
+ ["\uCDD1", "\uCDD1"], /* Hangul Syllable */
+ ["\uCDD2", "\uCDD2"], /* Hangul Syllable */
+ ["\uCDD3", "\uCDD3"], /* Hangul Syllable */
+ ["\uCDD4", "\uCDD4"], /* Hangul Syllable */
+ ["\uCDD5", "\uCDD5"], /* Hangul Syllable */
+ ["\uCDD6", "\uCDD6"], /* Hangul Syllable */
+ ["\uCDD7", "\uCDD7"], /* Hangul Syllable */
+ ["\uCDD8", "\uCDD8"], /* Hangul Syllable */
+ ["\uCDD9", "\uCDD9"], /* Hangul Syllable */
+ ["\uCDDA", "\uCDDA"], /* Hangul Syllable */
+ ["\uCDDB", "\uCDDB"], /* Hangul Syllable */
+ ["\uCDDC", "\uCDDC"], /* Hangul Syllable */
+ ["\uCDDD", "\uCDDD"], /* Hangul Syllable */
+ ["\uCDDE", "\uCDDE"], /* Hangul Syllable */
+ ["\uCDDF", "\uCDDF"], /* Hangul Syllable */
+ ["\uCDE0", "\uCDE0"], /* Hangul Syllable */
+ ["\uCDE1", "\uCDE1"], /* Hangul Syllable */
+ ["\uCDE2", "\uCDE2"], /* Hangul Syllable */
+ ["\uCDE3", "\uCDE3"], /* Hangul Syllable */
+ ["\uCDE4", "\uCDE4"], /* Hangul Syllable */
+ ["\uCDE5", "\uCDE5"], /* Hangul Syllable */
+ ["\uCDE6", "\uCDE6"], /* Hangul Syllable */
+ ["\uCDE7", "\uCDE7"], /* Hangul Syllable */
+ ["\uCDE8", "\uCDE8"], /* Hangul Syllable */
+ ["\uCDE9", "\uCDE9"], /* Hangul Syllable */
+ ["\uCDEA", "\uCDEA"], /* Hangul Syllable */
+ ["\uCDEB", "\uCDEB"], /* Hangul Syllable */
+ ["\uCDEC", "\uCDEC"], /* Hangul Syllable */
+ ["\uCDED", "\uCDED"], /* Hangul Syllable */
+ ["\uCDEE", "\uCDEE"], /* Hangul Syllable */
+ ["\uCDEF", "\uCDEF"], /* Hangul Syllable */
+ ["\uCDF0", "\uCDF0"], /* Hangul Syllable */
+ ["\uCDF1", "\uCDF1"], /* Hangul Syllable */
+ ["\uCDF2", "\uCDF2"], /* Hangul Syllable */
+ ["\uCDF3", "\uCDF3"], /* Hangul Syllable */
+ ["\uCDF4", "\uCDF4"], /* Hangul Syllable */
+ ["\uCDF5", "\uCDF5"], /* Hangul Syllable */
+ ["\uCDF6", "\uCDF6"], /* Hangul Syllable */
+ ["\uCDF7", "\uCDF7"], /* Hangul Syllable */
+ ["\uCDF8", "\uCDF8"], /* Hangul Syllable */
+ ["\uCDF9", "\uCDF9"], /* Hangul Syllable */
+ ["\uCDFA", "\uCDFA"], /* Hangul Syllable */
+ ["\uCDFB", "\uCDFB"], /* Hangul Syllable */
+ ["\uCDFC", "\uCDFC"], /* Hangul Syllable */
+ ["\uCDFD", "\uCDFD"], /* Hangul Syllable */
+ ["\uCDFE", "\uCDFE"], /* Hangul Syllable */
+ ["\uCDFF", "\uCDFF"], /* Hangul Syllable */
+ ["\uCE00", "\uCE00"], /* Hangul Syllable */
+ ["\uCE01", "\uCE01"], /* Hangul Syllable */
+ ["\uCE02", "\uCE02"], /* Hangul Syllable */
+ ["\uCE03", "\uCE03"], /* Hangul Syllable */
+ ["\uCE04", "\uCE04"], /* Hangul Syllable */
+ ["\uCE05", "\uCE05"], /* Hangul Syllable */
+ ["\uCE06", "\uCE06"], /* Hangul Syllable */
+ ["\uCE07", "\uCE07"], /* Hangul Syllable */
+ ["\uCE08", "\uCE08"], /* Hangul Syllable */
+ ["\uCE09", "\uCE09"], /* Hangul Syllable */
+ ["\uCE0A", "\uCE0A"], /* Hangul Syllable */
+ ["\uCE0B", "\uCE0B"], /* Hangul Syllable */
+ ["\uCE0C", "\uCE0C"], /* Hangul Syllable */
+ ["\uCE0D", "\uCE0D"], /* Hangul Syllable */
+ ["\uCE0E", "\uCE0E"], /* Hangul Syllable */
+ ["\uCE0F", "\uCE0F"], /* Hangul Syllable */
+ ["\uCE10", "\uCE10"], /* Hangul Syllable */
+ ["\uCE11", "\uCE11"], /* Hangul Syllable */
+ ["\uCE12", "\uCE12"], /* Hangul Syllable */
+ ["\uCE13", "\uCE13"], /* Hangul Syllable */
+ ["\uCE14", "\uCE14"], /* Hangul Syllable */
+ ["\uCE15", "\uCE15"], /* Hangul Syllable */
+ ["\uCE16", "\uCE16"], /* Hangul Syllable */
+ ["\uCE17", "\uCE17"], /* Hangul Syllable */
+ ["\uCE18", "\uCE18"], /* Hangul Syllable */
+ ["\uCE19", "\uCE19"], /* Hangul Syllable */
+ ["\uCE1A", "\uCE1A"], /* Hangul Syllable */
+ ["\uCE1B", "\uCE1B"], /* Hangul Syllable */
+ ["\uCE1C", "\uCE1C"], /* Hangul Syllable */
+ ["\uCE1D", "\uCE1D"], /* Hangul Syllable */
+ ["\uCE1E", "\uCE1E"], /* Hangul Syllable */
+ ["\uCE1F", "\uCE1F"], /* Hangul Syllable */
+ ["\uCE20", "\uCE20"], /* Hangul Syllable */
+ ["\uCE21", "\uCE21"], /* Hangul Syllable */
+ ["\uCE22", "\uCE22"], /* Hangul Syllable */
+ ["\uCE23", "\uCE23"], /* Hangul Syllable */
+ ["\uCE24", "\uCE24"], /* Hangul Syllable */
+ ["\uCE25", "\uCE25"], /* Hangul Syllable */
+ ["\uCE26", "\uCE26"], /* Hangul Syllable */
+ ["\uCE27", "\uCE27"], /* Hangul Syllable */
+ ["\uCE28", "\uCE28"], /* Hangul Syllable */
+ ["\uCE29", "\uCE29"], /* Hangul Syllable */
+ ["\uCE2A", "\uCE2A"], /* Hangul Syllable */
+ ["\uCE2B", "\uCE2B"], /* Hangul Syllable */
+ ["\uCE2C", "\uCE2C"], /* Hangul Syllable */
+ ["\uCE2D", "\uCE2D"], /* Hangul Syllable */
+ ["\uCE2E", "\uCE2E"], /* Hangul Syllable */
+ ["\uCE2F", "\uCE2F"], /* Hangul Syllable */
+ ["\uCE30", "\uCE30"], /* Hangul Syllable */
+ ["\uCE31", "\uCE31"], /* Hangul Syllable */
+ ["\uCE32", "\uCE32"], /* Hangul Syllable */
+ ["\uCE33", "\uCE33"], /* Hangul Syllable */
+ ["\uCE34", "\uCE34"], /* Hangul Syllable */
+ ["\uCE35", "\uCE35"], /* Hangul Syllable */
+ ["\uCE36", "\uCE36"], /* Hangul Syllable */
+ ["\uCE37", "\uCE37"], /* Hangul Syllable */
+ ["\uCE38", "\uCE38"], /* Hangul Syllable */
+ ["\uCE39", "\uCE39"], /* Hangul Syllable */
+ ["\uCE3A", "\uCE3A"], /* Hangul Syllable */
+ ["\uCE3B", "\uCE3B"], /* Hangul Syllable */
+ ["\uCE3C", "\uCE3C"], /* Hangul Syllable */
+ ["\uCE3D", "\uCE3D"], /* Hangul Syllable */
+ ["\uCE3E", "\uCE3E"], /* Hangul Syllable */
+ ["\uCE3F", "\uCE3F"], /* Hangul Syllable */
+ ["\uCE40", "\uCE40"], /* Hangul Syllable */
+ ["\uCE41", "\uCE41"], /* Hangul Syllable */
+ ["\uCE42", "\uCE42"], /* Hangul Syllable */
+ ["\uCE43", "\uCE43"], /* Hangul Syllable */
+ ["\uCE44", "\uCE44"], /* Hangul Syllable */
+ ["\uCE45", "\uCE45"], /* Hangul Syllable */
+ ["\uCE46", "\uCE46"], /* Hangul Syllable */
+ ["\uCE47", "\uCE47"], /* Hangul Syllable */
+ ["\uCE48", "\uCE48"], /* Hangul Syllable */
+ ["\uCE49", "\uCE49"], /* Hangul Syllable */
+ ["\uCE4A", "\uCE4A"], /* Hangul Syllable */
+ ["\uCE4B", "\uCE4B"], /* Hangul Syllable */
+ ["\uCE4C", "\uCE4C"], /* Hangul Syllable */
+ ["\uCE4D", "\uCE4D"], /* Hangul Syllable */
+ ["\uCE4E", "\uCE4E"], /* Hangul Syllable */
+ ["\uCE4F", "\uCE4F"], /* Hangul Syllable */
+ ["\uCE50", "\uCE50"], /* Hangul Syllable */
+ ["\uCE51", "\uCE51"], /* Hangul Syllable */
+ ["\uCE52", "\uCE52"], /* Hangul Syllable */
+ ["\uCE53", "\uCE53"], /* Hangul Syllable */
+ ["\uCE54", "\uCE54"], /* Hangul Syllable */
+ ["\uCE55", "\uCE55"], /* Hangul Syllable */
+ ["\uCE56", "\uCE56"], /* Hangul Syllable */
+ ["\uCE57", "\uCE57"], /* Hangul Syllable */
+ ["\uCE58", "\uCE58"], /* Hangul Syllable */
+ ["\uCE59", "\uCE59"], /* Hangul Syllable */
+ ["\uCE5A", "\uCE5A"], /* Hangul Syllable */
+ ["\uCE5B", "\uCE5B"], /* Hangul Syllable */
+ ["\uCE5C", "\uCE5C"], /* Hangul Syllable */
+ ["\uCE5D", "\uCE5D"], /* Hangul Syllable */
+ ["\uCE5E", "\uCE5E"], /* Hangul Syllable */
+ ["\uCE5F", "\uCE5F"], /* Hangul Syllable */
+ ["\uCE60", "\uCE60"], /* Hangul Syllable */
+ ["\uCE61", "\uCE61"], /* Hangul Syllable */
+ ["\uCE62", "\uCE62"], /* Hangul Syllable */
+ ["\uCE63", "\uCE63"], /* Hangul Syllable */
+ ["\uCE64", "\uCE64"], /* Hangul Syllable */
+ ["\uCE65", "\uCE65"], /* Hangul Syllable */
+ ["\uCE66", "\uCE66"], /* Hangul Syllable */
+ ["\uCE67", "\uCE67"], /* Hangul Syllable */
+ ["\uCE68", "\uCE68"], /* Hangul Syllable */
+ ["\uCE69", "\uCE69"], /* Hangul Syllable */
+ ["\uCE6A", "\uCE6A"], /* Hangul Syllable */
+ ["\uCE6B", "\uCE6B"], /* Hangul Syllable */
+ ["\uCE6C", "\uCE6C"], /* Hangul Syllable */
+ ["\uCE6D", "\uCE6D"], /* Hangul Syllable */
+ ["\uCE6E", "\uCE6E"], /* Hangul Syllable */
+ ["\uCE6F", "\uCE6F"], /* Hangul Syllable */
+ ["\uCE70", "\uCE70"], /* Hangul Syllable */
+ ["\uCE71", "\uCE71"], /* Hangul Syllable */
+ ["\uCE72", "\uCE72"], /* Hangul Syllable */
+ ["\uCE73", "\uCE73"], /* Hangul Syllable */
+ ["\uCE74", "\uCE74"], /* Hangul Syllable */
+ ["\uCE75", "\uCE75"], /* Hangul Syllable */
+ ["\uCE76", "\uCE76"], /* Hangul Syllable */
+ ["\uCE77", "\uCE77"], /* Hangul Syllable */
+ ["\uCE78", "\uCE78"], /* Hangul Syllable */
+ ["\uCE79", "\uCE79"], /* Hangul Syllable */
+ ["\uCE7A", "\uCE7A"], /* Hangul Syllable */
+ ["\uCE7B", "\uCE7B"], /* Hangul Syllable */
+ ["\uCE7C", "\uCE7C"], /* Hangul Syllable */
+ ["\uCE7D", "\uCE7D"], /* Hangul Syllable */
+ ["\uCE7E", "\uCE7E"], /* Hangul Syllable */
+ ["\uCE7F", "\uCE7F"], /* Hangul Syllable */
+ ["\uCE80", "\uCE80"], /* Hangul Syllable */
+ ["\uCE81", "\uCE81"], /* Hangul Syllable */
+ ["\uCE82", "\uCE82"], /* Hangul Syllable */
+ ["\uCE83", "\uCE83"], /* Hangul Syllable */
+ ["\uCE84", "\uCE84"], /* Hangul Syllable */
+ ["\uCE85", "\uCE85"], /* Hangul Syllable */
+ ["\uCE86", "\uCE86"], /* Hangul Syllable */
+ ["\uCE87", "\uCE87"], /* Hangul Syllable */
+ ["\uCE88", "\uCE88"], /* Hangul Syllable */
+ ["\uCE89", "\uCE89"], /* Hangul Syllable */
+ ["\uCE8A", "\uCE8A"], /* Hangul Syllable */
+ ["\uCE8B", "\uCE8B"], /* Hangul Syllable */
+ ["\uCE8C", "\uCE8C"], /* Hangul Syllable */
+ ["\uCE8D", "\uCE8D"], /* Hangul Syllable */
+ ["\uCE8E", "\uCE8E"], /* Hangul Syllable */
+ ["\uCE8F", "\uCE8F"], /* Hangul Syllable */
+ ["\uCE90", "\uCE90"], /* Hangul Syllable */
+ ["\uCE91", "\uCE91"], /* Hangul Syllable */
+ ["\uCE92", "\uCE92"], /* Hangul Syllable */
+ ["\uCE93", "\uCE93"], /* Hangul Syllable */
+ ["\uCE94", "\uCE94"], /* Hangul Syllable */
+ ["\uCE95", "\uCE95"], /* Hangul Syllable */
+ ["\uCE96", "\uCE96"], /* Hangul Syllable */
+ ["\uCE97", "\uCE97"], /* Hangul Syllable */
+ ["\uCE98", "\uCE98"], /* Hangul Syllable */
+ ["\uCE99", "\uCE99"], /* Hangul Syllable */
+ ["\uCE9A", "\uCE9A"], /* Hangul Syllable */
+ ["\uCE9B", "\uCE9B"], /* Hangul Syllable */
+ ["\uCE9C", "\uCE9C"], /* Hangul Syllable */
+ ["\uCE9D", "\uCE9D"], /* Hangul Syllable */
+ ["\uCE9E", "\uCE9E"], /* Hangul Syllable */
+ ["\uCE9F", "\uCE9F"], /* Hangul Syllable */
+ ["\uCEA0", "\uCEA0"], /* Hangul Syllable */
+ ["\uCEA1", "\uCEA1"], /* Hangul Syllable */
+ ["\uCEA2", "\uCEA2"], /* Hangul Syllable */
+ ["\uCEA3", "\uCEA3"], /* Hangul Syllable */
+ ["\uCEA4", "\uCEA4"], /* Hangul Syllable */
+ ["\uCEA5", "\uCEA5"], /* Hangul Syllable */
+ ["\uCEA6", "\uCEA6"], /* Hangul Syllable */
+ ["\uCEA7", "\uCEA7"], /* Hangul Syllable */
+ ["\uCEA8", "\uCEA8"], /* Hangul Syllable */
+ ["\uCEA9", "\uCEA9"], /* Hangul Syllable */
+ ["\uCEAA", "\uCEAA"], /* Hangul Syllable */
+ ["\uCEAB", "\uCEAB"], /* Hangul Syllable */
+ ["\uCEAC", "\uCEAC"], /* Hangul Syllable */
+ ["\uCEAD", "\uCEAD"], /* Hangul Syllable */
+ ["\uCEAE", "\uCEAE"], /* Hangul Syllable */
+ ["\uCEAF", "\uCEAF"], /* Hangul Syllable */
+ ["\uCEB0", "\uCEB0"], /* Hangul Syllable */
+ ["\uCEB1", "\uCEB1"], /* Hangul Syllable */
+ ["\uCEB2", "\uCEB2"], /* Hangul Syllable */
+ ["\uCEB3", "\uCEB3"], /* Hangul Syllable */
+ ["\uCEB4", "\uCEB4"], /* Hangul Syllable */
+ ["\uCEB5", "\uCEB5"], /* Hangul Syllable */
+ ["\uCEB6", "\uCEB6"], /* Hangul Syllable */
+ ["\uCEB7", "\uCEB7"], /* Hangul Syllable */
+ ["\uCEB8", "\uCEB8"], /* Hangul Syllable */
+ ["\uCEB9", "\uCEB9"], /* Hangul Syllable */
+ ["\uCEBA", "\uCEBA"], /* Hangul Syllable */
+ ["\uCEBB", "\uCEBB"], /* Hangul Syllable */
+ ["\uCEBC", "\uCEBC"], /* Hangul Syllable */
+ ["\uCEBD", "\uCEBD"], /* Hangul Syllable */
+ ["\uCEBE", "\uCEBE"], /* Hangul Syllable */
+ ["\uCEBF", "\uCEBF"], /* Hangul Syllable */
+ ["\uCEC0", "\uCEC0"], /* Hangul Syllable */
+ ["\uCEC1", "\uCEC1"], /* Hangul Syllable */
+ ["\uCEC2", "\uCEC2"], /* Hangul Syllable */
+ ["\uCEC3", "\uCEC3"], /* Hangul Syllable */
+ ["\uCEC4", "\uCEC4"], /* Hangul Syllable */
+ ["\uCEC5", "\uCEC5"], /* Hangul Syllable */
+ ["\uCEC6", "\uCEC6"], /* Hangul Syllable */
+ ["\uCEC7", "\uCEC7"], /* Hangul Syllable */
+ ["\uCEC8", "\uCEC8"], /* Hangul Syllable */
+ ["\uCEC9", "\uCEC9"], /* Hangul Syllable */
+ ["\uCECA", "\uCECA"], /* Hangul Syllable */
+ ["\uCECB", "\uCECB"], /* Hangul Syllable */
+ ["\uCECC", "\uCECC"], /* Hangul Syllable */
+ ["\uCECD", "\uCECD"], /* Hangul Syllable */
+ ["\uCECE", "\uCECE"], /* Hangul Syllable */
+ ["\uCECF", "\uCECF"], /* Hangul Syllable */
+ ["\uCED0", "\uCED0"], /* Hangul Syllable */
+ ["\uCED1", "\uCED1"], /* Hangul Syllable */
+ ["\uCED2", "\uCED2"], /* Hangul Syllable */
+ ["\uCED3", "\uCED3"], /* Hangul Syllable */
+ ["\uCED4", "\uCED4"], /* Hangul Syllable */
+ ["\uCED5", "\uCED5"], /* Hangul Syllable */
+ ["\uCED6", "\uCED6"], /* Hangul Syllable */
+ ["\uCED7", "\uCED7"], /* Hangul Syllable */
+ ["\uCED8", "\uCED8"], /* Hangul Syllable */
+ ["\uCED9", "\uCED9"], /* Hangul Syllable */
+ ["\uCEDA", "\uCEDA"], /* Hangul Syllable */
+ ["\uCEDB", "\uCEDB"], /* Hangul Syllable */
+ ["\uCEDC", "\uCEDC"], /* Hangul Syllable */
+ ["\uCEDD", "\uCEDD"], /* Hangul Syllable */
+ ["\uCEDE", "\uCEDE"], /* Hangul Syllable */
+ ["\uCEDF", "\uCEDF"], /* Hangul Syllable */
+ ["\uCEE0", "\uCEE0"], /* Hangul Syllable */
+ ["\uCEE1", "\uCEE1"], /* Hangul Syllable */
+ ["\uCEE2", "\uCEE2"], /* Hangul Syllable */
+ ["\uCEE3", "\uCEE3"], /* Hangul Syllable */
+ ["\uCEE4", "\uCEE4"], /* Hangul Syllable */
+ ["\uCEE5", "\uCEE5"], /* Hangul Syllable */
+ ["\uCEE6", "\uCEE6"], /* Hangul Syllable */
+ ["\uCEE7", "\uCEE7"], /* Hangul Syllable */
+ ["\uCEE8", "\uCEE8"], /* Hangul Syllable */
+ ["\uCEE9", "\uCEE9"], /* Hangul Syllable */
+ ["\uCEEA", "\uCEEA"], /* Hangul Syllable */
+ ["\uCEEB", "\uCEEB"], /* Hangul Syllable */
+ ["\uCEEC", "\uCEEC"], /* Hangul Syllable */
+ ["\uCEED", "\uCEED"], /* Hangul Syllable */
+ ["\uCEEE", "\uCEEE"], /* Hangul Syllable */
+ ["\uCEEF", "\uCEEF"], /* Hangul Syllable */
+ ["\uCEF0", "\uCEF0"], /* Hangul Syllable */
+ ["\uCEF1", "\uCEF1"], /* Hangul Syllable */
+ ["\uCEF2", "\uCEF2"], /* Hangul Syllable */
+ ["\uCEF3", "\uCEF3"], /* Hangul Syllable */
+ ["\uCEF4", "\uCEF4"], /* Hangul Syllable */
+ ["\uCEF5", "\uCEF5"], /* Hangul Syllable */
+ ["\uCEF6", "\uCEF6"], /* Hangul Syllable */
+ ["\uCEF7", "\uCEF7"], /* Hangul Syllable */
+ ["\uCEF8", "\uCEF8"], /* Hangul Syllable */
+ ["\uCEF9", "\uCEF9"], /* Hangul Syllable */
+ ["\uCEFA", "\uCEFA"], /* Hangul Syllable */
+ ["\uCEFB", "\uCEFB"], /* Hangul Syllable */
+ ["\uCEFC", "\uCEFC"], /* Hangul Syllable */
+ ["\uCEFD", "\uCEFD"], /* Hangul Syllable */
+ ["\uCEFE", "\uCEFE"], /* Hangul Syllable */
+ ["\uCEFF", "\uCEFF"], /* Hangul Syllable */
+ ["\uCF00", "\uCF00"], /* Hangul Syllable */
+ ["\uCF01", "\uCF01"], /* Hangul Syllable */
+ ["\uCF02", "\uCF02"], /* Hangul Syllable */
+ ["\uCF03", "\uCF03"], /* Hangul Syllable */
+ ["\uCF04", "\uCF04"], /* Hangul Syllable */
+ ["\uCF05", "\uCF05"], /* Hangul Syllable */
+ ["\uCF06", "\uCF06"], /* Hangul Syllable */
+ ["\uCF07", "\uCF07"], /* Hangul Syllable */
+ ["\uCF08", "\uCF08"], /* Hangul Syllable */
+ ["\uCF09", "\uCF09"], /* Hangul Syllable */
+ ["\uCF0A", "\uCF0A"], /* Hangul Syllable */
+ ["\uCF0B", "\uCF0B"], /* Hangul Syllable */
+ ["\uCF0C", "\uCF0C"], /* Hangul Syllable */
+ ["\uCF0D", "\uCF0D"], /* Hangul Syllable */
+ ["\uCF0E", "\uCF0E"], /* Hangul Syllable */
+ ["\uCF0F", "\uCF0F"], /* Hangul Syllable */
+ ["\uCF10", "\uCF10"], /* Hangul Syllable */
+ ["\uCF11", "\uCF11"], /* Hangul Syllable */
+ ["\uCF12", "\uCF12"], /* Hangul Syllable */
+ ["\uCF13", "\uCF13"], /* Hangul Syllable */
+ ["\uCF14", "\uCF14"], /* Hangul Syllable */
+ ["\uCF15", "\uCF15"], /* Hangul Syllable */
+ ["\uCF16", "\uCF16"], /* Hangul Syllable */
+ ["\uCF17", "\uCF17"], /* Hangul Syllable */
+ ["\uCF18", "\uCF18"], /* Hangul Syllable */
+ ["\uCF19", "\uCF19"], /* Hangul Syllable */
+ ["\uCF1A", "\uCF1A"], /* Hangul Syllable */
+ ["\uCF1B", "\uCF1B"], /* Hangul Syllable */
+ ["\uCF1C", "\uCF1C"], /* Hangul Syllable */
+ ["\uCF1D", "\uCF1D"], /* Hangul Syllable */
+ ["\uCF1E", "\uCF1E"], /* Hangul Syllable */
+ ["\uCF1F", "\uCF1F"], /* Hangul Syllable */
+ ["\uCF20", "\uCF20"], /* Hangul Syllable */
+ ["\uCF21", "\uCF21"], /* Hangul Syllable */
+ ["\uCF22", "\uCF22"], /* Hangul Syllable */
+ ["\uCF23", "\uCF23"], /* Hangul Syllable */
+ ["\uCF24", "\uCF24"], /* Hangul Syllable */
+ ["\uCF25", "\uCF25"], /* Hangul Syllable */
+ ["\uCF26", "\uCF26"], /* Hangul Syllable */
+ ["\uCF27", "\uCF27"], /* Hangul Syllable */
+ ["\uCF28", "\uCF28"], /* Hangul Syllable */
+ ["\uCF29", "\uCF29"], /* Hangul Syllable */
+ ["\uCF2A", "\uCF2A"], /* Hangul Syllable */
+ ["\uCF2B", "\uCF2B"], /* Hangul Syllable */
+ ["\uCF2C", "\uCF2C"], /* Hangul Syllable */
+ ["\uCF2D", "\uCF2D"], /* Hangul Syllable */
+ ["\uCF2E", "\uCF2E"], /* Hangul Syllable */
+ ["\uCF2F", "\uCF2F"], /* Hangul Syllable */
+ ["\uCF30", "\uCF30"], /* Hangul Syllable */
+ ["\uCF31", "\uCF31"], /* Hangul Syllable */
+ ["\uCF32", "\uCF32"], /* Hangul Syllable */
+ ["\uCF33", "\uCF33"], /* Hangul Syllable */
+ ["\uCF34", "\uCF34"], /* Hangul Syllable */
+ ["\uCF35", "\uCF35"], /* Hangul Syllable */
+ ["\uCF36", "\uCF36"], /* Hangul Syllable */
+ ["\uCF37", "\uCF37"], /* Hangul Syllable */
+ ["\uCF38", "\uCF38"], /* Hangul Syllable */
+ ["\uCF39", "\uCF39"], /* Hangul Syllable */
+ ["\uCF3A", "\uCF3A"], /* Hangul Syllable */
+ ["\uCF3B", "\uCF3B"], /* Hangul Syllable */
+ ["\uCF3C", "\uCF3C"], /* Hangul Syllable */
+ ["\uCF3D", "\uCF3D"], /* Hangul Syllable */
+ ["\uCF3E", "\uCF3E"], /* Hangul Syllable */
+ ["\uCF3F", "\uCF3F"], /* Hangul Syllable */
+ ["\uCF40", "\uCF40"], /* Hangul Syllable */
+ ["\uCF41", "\uCF41"], /* Hangul Syllable */
+ ["\uCF42", "\uCF42"], /* Hangul Syllable */
+ ["\uCF43", "\uCF43"], /* Hangul Syllable */
+ ["\uCF44", "\uCF44"], /* Hangul Syllable */
+ ["\uCF45", "\uCF45"], /* Hangul Syllable */
+ ["\uCF46", "\uCF46"], /* Hangul Syllable */
+ ["\uCF47", "\uCF47"], /* Hangul Syllable */
+ ["\uCF48", "\uCF48"], /* Hangul Syllable */
+ ["\uCF49", "\uCF49"], /* Hangul Syllable */
+ ["\uCF4A", "\uCF4A"], /* Hangul Syllable */
+ ["\uCF4B", "\uCF4B"], /* Hangul Syllable */
+ ["\uCF4C", "\uCF4C"], /* Hangul Syllable */
+ ["\uCF4D", "\uCF4D"], /* Hangul Syllable */
+ ["\uCF4E", "\uCF4E"], /* Hangul Syllable */
+ ["\uCF4F", "\uCF4F"], /* Hangul Syllable */
+ ["\uCF50", "\uCF50"], /* Hangul Syllable */
+ ["\uCF51", "\uCF51"], /* Hangul Syllable */
+ ["\uCF52", "\uCF52"], /* Hangul Syllable */
+ ["\uCF53", "\uCF53"], /* Hangul Syllable */
+ ["\uCF54", "\uCF54"], /* Hangul Syllable */
+ ["\uCF55", "\uCF55"], /* Hangul Syllable */
+ ["\uCF56", "\uCF56"], /* Hangul Syllable */
+ ["\uCF57", "\uCF57"], /* Hangul Syllable */
+ ["\uCF58", "\uCF58"], /* Hangul Syllable */
+ ["\uCF59", "\uCF59"], /* Hangul Syllable */
+ ["\uCF5A", "\uCF5A"], /* Hangul Syllable */
+ ["\uCF5B", "\uCF5B"], /* Hangul Syllable */
+ ["\uCF5C", "\uCF5C"], /* Hangul Syllable */
+ ["\uCF5D", "\uCF5D"], /* Hangul Syllable */
+ ["\uCF5E", "\uCF5E"], /* Hangul Syllable */
+ ["\uCF5F", "\uCF5F"], /* Hangul Syllable */
+ ["\uCF60", "\uCF60"], /* Hangul Syllable */
+ ["\uCF61", "\uCF61"], /* Hangul Syllable */
+ ["\uCF62", "\uCF62"], /* Hangul Syllable */
+ ["\uCF63", "\uCF63"], /* Hangul Syllable */
+ ["\uCF64", "\uCF64"], /* Hangul Syllable */
+ ["\uCF65", "\uCF65"], /* Hangul Syllable */
+ ["\uCF66", "\uCF66"], /* Hangul Syllable */
+ ["\uCF67", "\uCF67"], /* Hangul Syllable */
+ ["\uCF68", "\uCF68"], /* Hangul Syllable */
+ ["\uCF69", "\uCF69"], /* Hangul Syllable */
+ ["\uCF6A", "\uCF6A"], /* Hangul Syllable */
+ ["\uCF6B", "\uCF6B"], /* Hangul Syllable */
+ ["\uCF6C", "\uCF6C"], /* Hangul Syllable */
+ ["\uCF6D", "\uCF6D"], /* Hangul Syllable */
+ ["\uCF6E", "\uCF6E"], /* Hangul Syllable */
+ ["\uCF6F", "\uCF6F"], /* Hangul Syllable */
+ ["\uCF70", "\uCF70"], /* Hangul Syllable */
+ ["\uCF71", "\uCF71"], /* Hangul Syllable */
+ ["\uCF72", "\uCF72"], /* Hangul Syllable */
+ ["\uCF73", "\uCF73"], /* Hangul Syllable */
+ ["\uCF74", "\uCF74"], /* Hangul Syllable */
+ ["\uCF75", "\uCF75"], /* Hangul Syllable */
+ ["\uCF76", "\uCF76"], /* Hangul Syllable */
+ ["\uCF77", "\uCF77"], /* Hangul Syllable */
+ ["\uCF78", "\uCF78"], /* Hangul Syllable */
+ ["\uCF79", "\uCF79"], /* Hangul Syllable */
+ ["\uCF7A", "\uCF7A"], /* Hangul Syllable */
+ ["\uCF7B", "\uCF7B"], /* Hangul Syllable */
+ ["\uCF7C", "\uCF7C"], /* Hangul Syllable */
+ ["\uCF7D", "\uCF7D"], /* Hangul Syllable */
+ ["\uCF7E", "\uCF7E"], /* Hangul Syllable */
+ ["\uCF7F", "\uCF7F"], /* Hangul Syllable */
+ ["\uCF80", "\uCF80"], /* Hangul Syllable */
+ ["\uCF81", "\uCF81"], /* Hangul Syllable */
+ ["\uCF82", "\uCF82"], /* Hangul Syllable */
+ ["\uCF83", "\uCF83"], /* Hangul Syllable */
+ ["\uCF84", "\uCF84"], /* Hangul Syllable */
+ ["\uCF85", "\uCF85"], /* Hangul Syllable */
+ ["\uCF86", "\uCF86"], /* Hangul Syllable */
+ ["\uCF87", "\uCF87"], /* Hangul Syllable */
+ ["\uCF88", "\uCF88"], /* Hangul Syllable */
+ ["\uCF89", "\uCF89"], /* Hangul Syllable */
+ ["\uCF8A", "\uCF8A"], /* Hangul Syllable */
+ ["\uCF8B", "\uCF8B"], /* Hangul Syllable */
+ ["\uCF8C", "\uCF8C"], /* Hangul Syllable */
+ ["\uCF8D", "\uCF8D"], /* Hangul Syllable */
+ ["\uCF8E", "\uCF8E"], /* Hangul Syllable */
+ ["\uCF8F", "\uCF8F"], /* Hangul Syllable */
+ ["\uCF90", "\uCF90"], /* Hangul Syllable */
+ ["\uCF91", "\uCF91"], /* Hangul Syllable */
+ ["\uCF92", "\uCF92"], /* Hangul Syllable */
+ ["\uCF93", "\uCF93"], /* Hangul Syllable */
+ ["\uCF94", "\uCF94"], /* Hangul Syllable */
+ ["\uCF95", "\uCF95"], /* Hangul Syllable */
+ ["\uCF96", "\uCF96"], /* Hangul Syllable */
+ ["\uCF97", "\uCF97"], /* Hangul Syllable */
+ ["\uCF98", "\uCF98"], /* Hangul Syllable */
+ ["\uCF99", "\uCF99"], /* Hangul Syllable */
+ ["\uCF9A", "\uCF9A"], /* Hangul Syllable */
+ ["\uCF9B", "\uCF9B"], /* Hangul Syllable */
+ ["\uCF9C", "\uCF9C"], /* Hangul Syllable */
+ ["\uCF9D", "\uCF9D"], /* Hangul Syllable */
+ ["\uCF9E", "\uCF9E"], /* Hangul Syllable */
+ ["\uCF9F", "\uCF9F"], /* Hangul Syllable */
+ ["\uCFA0", "\uCFA0"], /* Hangul Syllable */
+ ["\uCFA1", "\uCFA1"], /* Hangul Syllable */
+ ["\uCFA2", "\uCFA2"], /* Hangul Syllable */
+ ["\uCFA3", "\uCFA3"], /* Hangul Syllable */
+ ["\uCFA4", "\uCFA4"], /* Hangul Syllable */
+ ["\uCFA5", "\uCFA5"], /* Hangul Syllable */
+ ["\uCFA6", "\uCFA6"], /* Hangul Syllable */
+ ["\uCFA7", "\uCFA7"], /* Hangul Syllable */
+ ["\uCFA8", "\uCFA8"], /* Hangul Syllable */
+ ["\uCFA9", "\uCFA9"], /* Hangul Syllable */
+ ["\uCFAA", "\uCFAA"], /* Hangul Syllable */
+ ["\uCFAB", "\uCFAB"], /* Hangul Syllable */
+ ["\uCFAC", "\uCFAC"], /* Hangul Syllable */
+ ["\uCFAD", "\uCFAD"], /* Hangul Syllable */
+ ["\uCFAE", "\uCFAE"], /* Hangul Syllable */
+ ["\uCFAF", "\uCFAF"], /* Hangul Syllable */
+ ["\uCFB0", "\uCFB0"], /* Hangul Syllable */
+ ["\uCFB1", "\uCFB1"], /* Hangul Syllable */
+ ["\uCFB2", "\uCFB2"], /* Hangul Syllable */
+ ["\uCFB3", "\uCFB3"], /* Hangul Syllable */
+ ["\uCFB4", "\uCFB4"], /* Hangul Syllable */
+ ["\uCFB5", "\uCFB5"], /* Hangul Syllable */
+ ["\uCFB6", "\uCFB6"], /* Hangul Syllable */
+ ["\uCFB7", "\uCFB7"], /* Hangul Syllable */
+ ["\uCFB8", "\uCFB8"], /* Hangul Syllable */
+ ["\uCFB9", "\uCFB9"], /* Hangul Syllable */
+ ["\uCFBA", "\uCFBA"], /* Hangul Syllable */
+ ["\uCFBB", "\uCFBB"], /* Hangul Syllable */
+ ["\uCFBC", "\uCFBC"], /* Hangul Syllable */
+ ["\uCFBD", "\uCFBD"], /* Hangul Syllable */
+ ["\uCFBE", "\uCFBE"], /* Hangul Syllable */
+ ["\uCFBF", "\uCFBF"], /* Hangul Syllable */
+ ["\uCFC0", "\uCFC0"], /* Hangul Syllable */
+ ["\uCFC1", "\uCFC1"], /* Hangul Syllable */
+ ["\uCFC2", "\uCFC2"], /* Hangul Syllable */
+ ["\uCFC3", "\uCFC3"], /* Hangul Syllable */
+ ["\uCFC4", "\uCFC4"], /* Hangul Syllable */
+ ["\uCFC5", "\uCFC5"], /* Hangul Syllable */
+ ["\uCFC6", "\uCFC6"], /* Hangul Syllable */
+ ["\uCFC7", "\uCFC7"], /* Hangul Syllable */
+ ["\uCFC8", "\uCFC8"], /* Hangul Syllable */
+ ["\uCFC9", "\uCFC9"], /* Hangul Syllable */
+ ["\uCFCA", "\uCFCA"], /* Hangul Syllable */
+ ["\uCFCB", "\uCFCB"], /* Hangul Syllable */
+ ["\uCFCC", "\uCFCC"], /* Hangul Syllable */
+ ["\uCFCD", "\uCFCD"], /* Hangul Syllable */
+ ["\uCFCE", "\uCFCE"], /* Hangul Syllable */
+ ["\uCFCF", "\uCFCF"], /* Hangul Syllable */
+ ["\uCFD0", "\uCFD0"], /* Hangul Syllable */
+ ["\uCFD1", "\uCFD1"], /* Hangul Syllable */
+ ["\uCFD2", "\uCFD2"], /* Hangul Syllable */
+ ["\uCFD3", "\uCFD3"], /* Hangul Syllable */
+ ["\uCFD4", "\uCFD4"], /* Hangul Syllable */
+ ["\uCFD5", "\uCFD5"], /* Hangul Syllable */
+ ["\uCFD6", "\uCFD6"], /* Hangul Syllable */
+ ["\uCFD7", "\uCFD7"], /* Hangul Syllable */
+ ["\uCFD8", "\uCFD8"], /* Hangul Syllable */
+ ["\uCFD9", "\uCFD9"], /* Hangul Syllable */
+ ["\uCFDA", "\uCFDA"], /* Hangul Syllable */
+ ["\uCFDB", "\uCFDB"], /* Hangul Syllable */
+ ["\uCFDC", "\uCFDC"], /* Hangul Syllable */
+ ["\uCFDD", "\uCFDD"], /* Hangul Syllable */
+ ["\uCFDE", "\uCFDE"], /* Hangul Syllable */
+ ["\uCFDF", "\uCFDF"], /* Hangul Syllable */
+ ["\uCFE0", "\uCFE0"], /* Hangul Syllable */
+ ["\uCFE1", "\uCFE1"], /* Hangul Syllable */
+ ["\uCFE2", "\uCFE2"], /* Hangul Syllable */
+ ["\uCFE3", "\uCFE3"], /* Hangul Syllable */
+ ["\uCFE4", "\uCFE4"], /* Hangul Syllable */
+ ["\uCFE5", "\uCFE5"], /* Hangul Syllable */
+ ["\uCFE6", "\uCFE6"], /* Hangul Syllable */
+ ["\uCFE7", "\uCFE7"], /* Hangul Syllable */
+ ["\uCFE8", "\uCFE8"], /* Hangul Syllable */
+ ["\uCFE9", "\uCFE9"], /* Hangul Syllable */
+ ["\uCFEA", "\uCFEA"], /* Hangul Syllable */
+ ["\uCFEB", "\uCFEB"], /* Hangul Syllable */
+ ["\uCFEC", "\uCFEC"], /* Hangul Syllable */
+ ["\uCFED", "\uCFED"], /* Hangul Syllable */
+ ["\uCFEE", "\uCFEE"], /* Hangul Syllable */
+ ["\uCFEF", "\uCFEF"], /* Hangul Syllable */
+ ["\uCFF0", "\uCFF0"], /* Hangul Syllable */
+ ["\uCFF1", "\uCFF1"], /* Hangul Syllable */
+ ["\uCFF2", "\uCFF2"], /* Hangul Syllable */
+ ["\uCFF3", "\uCFF3"], /* Hangul Syllable */
+ ["\uCFF4", "\uCFF4"], /* Hangul Syllable */
+ ["\uCFF5", "\uCFF5"], /* Hangul Syllable */
+ ["\uCFF6", "\uCFF6"], /* Hangul Syllable */
+ ["\uCFF7", "\uCFF7"], /* Hangul Syllable */
+ ["\uCFF8", "\uCFF8"], /* Hangul Syllable */
+ ["\uCFF9", "\uCFF9"], /* Hangul Syllable */
+ ["\uCFFA", "\uCFFA"], /* Hangul Syllable */
+ ["\uCFFB", "\uCFFB"], /* Hangul Syllable */
+ ["\uCFFC", "\uCFFC"], /* Hangul Syllable */
+ ["\uCFFD", "\uCFFD"], /* Hangul Syllable */
+ ["\uCFFE", "\uCFFE"], /* Hangul Syllable */
+ ["\uCFFF", "\uCFFF"], /* Hangul Syllable */
+ ["\uD000", "\uD000"], /* Hangul Syllable */
+ ["\uD001", "\uD001"], /* Hangul Syllable */
+ ["\uD002", "\uD002"], /* Hangul Syllable */
+ ["\uD003", "\uD003"], /* Hangul Syllable */
+ ["\uD004", "\uD004"], /* Hangul Syllable */
+ ["\uD005", "\uD005"], /* Hangul Syllable */
+ ["\uD006", "\uD006"], /* Hangul Syllable */
+ ["\uD007", "\uD007"], /* Hangul Syllable */
+ ["\uD008", "\uD008"], /* Hangul Syllable */
+ ["\uD009", "\uD009"], /* Hangul Syllable */
+ ["\uD00A", "\uD00A"], /* Hangul Syllable */
+ ["\uD00B", "\uD00B"], /* Hangul Syllable */
+ ["\uD00C", "\uD00C"], /* Hangul Syllable */
+ ["\uD00D", "\uD00D"], /* Hangul Syllable */
+ ["\uD00E", "\uD00E"], /* Hangul Syllable */
+ ["\uD00F", "\uD00F"], /* Hangul Syllable */
+ ["\uD010", "\uD010"], /* Hangul Syllable */
+ ["\uD011", "\uD011"], /* Hangul Syllable */
+ ["\uD012", "\uD012"], /* Hangul Syllable */
+ ["\uD013", "\uD013"], /* Hangul Syllable */
+ ["\uD014", "\uD014"], /* Hangul Syllable */
+ ["\uD015", "\uD015"], /* Hangul Syllable */
+ ["\uD016", "\uD016"], /* Hangul Syllable */
+ ["\uD017", "\uD017"], /* Hangul Syllable */
+ ["\uD018", "\uD018"], /* Hangul Syllable */
+ ["\uD019", "\uD019"], /* Hangul Syllable */
+ ["\uD01A", "\uD01A"], /* Hangul Syllable */
+ ["\uD01B", "\uD01B"], /* Hangul Syllable */
+ ["\uD01C", "\uD01C"], /* Hangul Syllable */
+ ["\uD01D", "\uD01D"], /* Hangul Syllable */
+ ["\uD01E", "\uD01E"], /* Hangul Syllable */
+ ["\uD01F", "\uD01F"], /* Hangul Syllable */
+ ["\uD020", "\uD020"], /* Hangul Syllable */
+ ["\uD021", "\uD021"], /* Hangul Syllable */
+ ["\uD022", "\uD022"], /* Hangul Syllable */
+ ["\uD023", "\uD023"], /* Hangul Syllable */
+ ["\uD024", "\uD024"], /* Hangul Syllable */
+ ["\uD025", "\uD025"], /* Hangul Syllable */
+ ["\uD026", "\uD026"], /* Hangul Syllable */
+ ["\uD027", "\uD027"], /* Hangul Syllable */
+ ["\uD028", "\uD028"], /* Hangul Syllable */
+ ["\uD029", "\uD029"], /* Hangul Syllable */
+ ["\uD02A", "\uD02A"], /* Hangul Syllable */
+ ["\uD02B", "\uD02B"], /* Hangul Syllable */
+ ["\uD02C", "\uD02C"], /* Hangul Syllable */
+ ["\uD02D", "\uD02D"], /* Hangul Syllable */
+ ["\uD02E", "\uD02E"], /* Hangul Syllable */
+ ["\uD02F", "\uD02F"], /* Hangul Syllable */
+ ["\uD030", "\uD030"], /* Hangul Syllable */
+ ["\uD031", "\uD031"], /* Hangul Syllable */
+ ["\uD032", "\uD032"], /* Hangul Syllable */
+ ["\uD033", "\uD033"], /* Hangul Syllable */
+ ["\uD034", "\uD034"], /* Hangul Syllable */
+ ["\uD035", "\uD035"], /* Hangul Syllable */
+ ["\uD036", "\uD036"], /* Hangul Syllable */
+ ["\uD037", "\uD037"], /* Hangul Syllable */
+ ["\uD038", "\uD038"], /* Hangul Syllable */
+ ["\uD039", "\uD039"], /* Hangul Syllable */
+ ["\uD03A", "\uD03A"], /* Hangul Syllable */
+ ["\uD03B", "\uD03B"], /* Hangul Syllable */
+ ["\uD03C", "\uD03C"], /* Hangul Syllable */
+ ["\uD03D", "\uD03D"], /* Hangul Syllable */
+ ["\uD03E", "\uD03E"], /* Hangul Syllable */
+ ["\uD03F", "\uD03F"], /* Hangul Syllable */
+ ["\uD040", "\uD040"], /* Hangul Syllable */
+ ["\uD041", "\uD041"], /* Hangul Syllable */
+ ["\uD042", "\uD042"], /* Hangul Syllable */
+ ["\uD043", "\uD043"], /* Hangul Syllable */
+ ["\uD044", "\uD044"], /* Hangul Syllable */
+ ["\uD045", "\uD045"], /* Hangul Syllable */
+ ["\uD046", "\uD046"], /* Hangul Syllable */
+ ["\uD047", "\uD047"], /* Hangul Syllable */
+ ["\uD048", "\uD048"], /* Hangul Syllable */
+ ["\uD049", "\uD049"], /* Hangul Syllable */
+ ["\uD04A", "\uD04A"], /* Hangul Syllable */
+ ["\uD04B", "\uD04B"], /* Hangul Syllable */
+ ["\uD04C", "\uD04C"], /* Hangul Syllable */
+ ["\uD04D", "\uD04D"], /* Hangul Syllable */
+ ["\uD04E", "\uD04E"], /* Hangul Syllable */
+ ["\uD04F", "\uD04F"], /* Hangul Syllable */
+ ["\uD050", "\uD050"], /* Hangul Syllable */
+ ["\uD051", "\uD051"], /* Hangul Syllable */
+ ["\uD052", "\uD052"], /* Hangul Syllable */
+ ["\uD053", "\uD053"], /* Hangul Syllable */
+ ["\uD054", "\uD054"], /* Hangul Syllable */
+ ["\uD055", "\uD055"], /* Hangul Syllable */
+ ["\uD056", "\uD056"], /* Hangul Syllable */
+ ["\uD057", "\uD057"], /* Hangul Syllable */
+ ["\uD058", "\uD058"], /* Hangul Syllable */
+ ["\uD059", "\uD059"], /* Hangul Syllable */
+ ["\uD05A", "\uD05A"], /* Hangul Syllable */
+ ["\uD05B", "\uD05B"], /* Hangul Syllable */
+ ["\uD05C", "\uD05C"], /* Hangul Syllable */
+ ["\uD05D", "\uD05D"], /* Hangul Syllable */
+ ["\uD05E", "\uD05E"], /* Hangul Syllable */
+ ["\uD05F", "\uD05F"], /* Hangul Syllable */
+ ["\uD060", "\uD060"], /* Hangul Syllable */
+ ["\uD061", "\uD061"], /* Hangul Syllable */
+ ["\uD062", "\uD062"], /* Hangul Syllable */
+ ["\uD063", "\uD063"], /* Hangul Syllable */
+ ["\uD064", "\uD064"], /* Hangul Syllable */
+ ["\uD065", "\uD065"], /* Hangul Syllable */
+ ["\uD066", "\uD066"], /* Hangul Syllable */
+ ["\uD067", "\uD067"], /* Hangul Syllable */
+ ["\uD068", "\uD068"], /* Hangul Syllable */
+ ["\uD069", "\uD069"], /* Hangul Syllable */
+ ["\uD06A", "\uD06A"], /* Hangul Syllable */
+ ["\uD06B", "\uD06B"], /* Hangul Syllable */
+ ["\uD06C", "\uD06C"], /* Hangul Syllable */
+ ["\uD06D", "\uD06D"], /* Hangul Syllable */
+ ["\uD06E", "\uD06E"], /* Hangul Syllable */
+ ["\uD06F", "\uD06F"], /* Hangul Syllable */
+ ["\uD070", "\uD070"], /* Hangul Syllable */
+ ["\uD071", "\uD071"], /* Hangul Syllable */
+ ["\uD072", "\uD072"], /* Hangul Syllable */
+ ["\uD073", "\uD073"], /* Hangul Syllable */
+ ["\uD074", "\uD074"], /* Hangul Syllable */
+ ["\uD075", "\uD075"], /* Hangul Syllable */
+ ["\uD076", "\uD076"], /* Hangul Syllable */
+ ["\uD077", "\uD077"], /* Hangul Syllable */
+ ["\uD078", "\uD078"], /* Hangul Syllable */
+ ["\uD079", "\uD079"], /* Hangul Syllable */
+ ["\uD07A", "\uD07A"], /* Hangul Syllable */
+ ["\uD07B", "\uD07B"], /* Hangul Syllable */
+ ["\uD07C", "\uD07C"], /* Hangul Syllable */
+ ["\uD07D", "\uD07D"], /* Hangul Syllable */
+ ["\uD07E", "\uD07E"], /* Hangul Syllable */
+ ["\uD07F", "\uD07F"], /* Hangul Syllable */
+ ["\uD080", "\uD080"], /* Hangul Syllable */
+ ["\uD081", "\uD081"], /* Hangul Syllable */
+ ["\uD082", "\uD082"], /* Hangul Syllable */
+ ["\uD083", "\uD083"], /* Hangul Syllable */
+ ["\uD084", "\uD084"], /* Hangul Syllable */
+ ["\uD085", "\uD085"], /* Hangul Syllable */
+ ["\uD086", "\uD086"], /* Hangul Syllable */
+ ["\uD087", "\uD087"], /* Hangul Syllable */
+ ["\uD088", "\uD088"], /* Hangul Syllable */
+ ["\uD089", "\uD089"], /* Hangul Syllable */
+ ["\uD08A", "\uD08A"], /* Hangul Syllable */
+ ["\uD08B", "\uD08B"], /* Hangul Syllable */
+ ["\uD08C", "\uD08C"], /* Hangul Syllable */
+ ["\uD08D", "\uD08D"], /* Hangul Syllable */
+ ["\uD08E", "\uD08E"], /* Hangul Syllable */
+ ["\uD08F", "\uD08F"], /* Hangul Syllable */
+ ["\uD090", "\uD090"], /* Hangul Syllable */
+ ["\uD091", "\uD091"], /* Hangul Syllable */
+ ["\uD092", "\uD092"], /* Hangul Syllable */
+ ["\uD093", "\uD093"], /* Hangul Syllable */
+ ["\uD094", "\uD094"], /* Hangul Syllable */
+ ["\uD095", "\uD095"], /* Hangul Syllable */
+ ["\uD096", "\uD096"], /* Hangul Syllable */
+ ["\uD097", "\uD097"], /* Hangul Syllable */
+ ["\uD098", "\uD098"], /* Hangul Syllable */
+ ["\uD099", "\uD099"], /* Hangul Syllable */
+ ["\uD09A", "\uD09A"], /* Hangul Syllable */
+ ["\uD09B", "\uD09B"], /* Hangul Syllable */
+ ["\uD09C", "\uD09C"], /* Hangul Syllable */
+ ["\uD09D", "\uD09D"], /* Hangul Syllable */
+ ["\uD09E", "\uD09E"], /* Hangul Syllable */
+ ["\uD09F", "\uD09F"], /* Hangul Syllable */
+ ["\uD0A0", "\uD0A0"], /* Hangul Syllable */
+ ["\uD0A1", "\uD0A1"], /* Hangul Syllable */
+ ["\uD0A2", "\uD0A2"], /* Hangul Syllable */
+ ["\uD0A3", "\uD0A3"], /* Hangul Syllable */
+ ["\uD0A4", "\uD0A4"], /* Hangul Syllable */
+ ["\uD0A5", "\uD0A5"], /* Hangul Syllable */
+ ["\uD0A6", "\uD0A6"], /* Hangul Syllable */
+ ["\uD0A7", "\uD0A7"], /* Hangul Syllable */
+ ["\uD0A8", "\uD0A8"], /* Hangul Syllable */
+ ["\uD0A9", "\uD0A9"], /* Hangul Syllable */
+ ["\uD0AA", "\uD0AA"], /* Hangul Syllable */
+ ["\uD0AB", "\uD0AB"], /* Hangul Syllable */
+ ["\uD0AC", "\uD0AC"], /* Hangul Syllable */
+ ["\uD0AD", "\uD0AD"], /* Hangul Syllable */
+ ["\uD0AE", "\uD0AE"], /* Hangul Syllable */
+ ["\uD0AF", "\uD0AF"], /* Hangul Syllable */
+ ["\uD0B0", "\uD0B0"], /* Hangul Syllable */
+ ["\uD0B1", "\uD0B1"], /* Hangul Syllable */
+ ["\uD0B2", "\uD0B2"], /* Hangul Syllable */
+ ["\uD0B3", "\uD0B3"], /* Hangul Syllable */
+ ["\uD0B4", "\uD0B4"], /* Hangul Syllable */
+ ["\uD0B5", "\uD0B5"], /* Hangul Syllable */
+ ["\uD0B6", "\uD0B6"], /* Hangul Syllable */
+ ["\uD0B7", "\uD0B7"], /* Hangul Syllable */
+ ["\uD0B8", "\uD0B8"], /* Hangul Syllable */
+ ["\uD0B9", "\uD0B9"], /* Hangul Syllable */
+ ["\uD0BA", "\uD0BA"], /* Hangul Syllable */
+ ["\uD0BB", "\uD0BB"], /* Hangul Syllable */
+ ["\uD0BC", "\uD0BC"], /* Hangul Syllable */
+ ["\uD0BD", "\uD0BD"], /* Hangul Syllable */
+ ["\uD0BE", "\uD0BE"], /* Hangul Syllable */
+ ["\uD0BF", "\uD0BF"], /* Hangul Syllable */
+ ["\uD0C0", "\uD0C0"], /* Hangul Syllable */
+ ["\uD0C1", "\uD0C1"], /* Hangul Syllable */
+ ["\uD0C2", "\uD0C2"], /* Hangul Syllable */
+ ["\uD0C3", "\uD0C3"], /* Hangul Syllable */
+ ["\uD0C4", "\uD0C4"], /* Hangul Syllable */
+ ["\uD0C5", "\uD0C5"], /* Hangul Syllable */
+ ["\uD0C6", "\uD0C6"], /* Hangul Syllable */
+ ["\uD0C7", "\uD0C7"], /* Hangul Syllable */
+ ["\uD0C8", "\uD0C8"], /* Hangul Syllable */
+ ["\uD0C9", "\uD0C9"], /* Hangul Syllable */
+ ["\uD0CA", "\uD0CA"], /* Hangul Syllable */
+ ["\uD0CB", "\uD0CB"], /* Hangul Syllable */
+ ["\uD0CC", "\uD0CC"], /* Hangul Syllable */
+ ["\uD0CD", "\uD0CD"], /* Hangul Syllable */
+ ["\uD0CE", "\uD0CE"], /* Hangul Syllable */
+ ["\uD0CF", "\uD0CF"], /* Hangul Syllable */
+ ["\uD0D0", "\uD0D0"], /* Hangul Syllable */
+ ["\uD0D1", "\uD0D1"], /* Hangul Syllable */
+ ["\uD0D2", "\uD0D2"], /* Hangul Syllable */
+ ["\uD0D3", "\uD0D3"], /* Hangul Syllable */
+ ["\uD0D4", "\uD0D4"], /* Hangul Syllable */
+ ["\uD0D5", "\uD0D5"], /* Hangul Syllable */
+ ["\uD0D6", "\uD0D6"], /* Hangul Syllable */
+ ["\uD0D7", "\uD0D7"], /* Hangul Syllable */
+ ["\uD0D8", "\uD0D8"], /* Hangul Syllable */
+ ["\uD0D9", "\uD0D9"], /* Hangul Syllable */
+ ["\uD0DA", "\uD0DA"], /* Hangul Syllable */
+ ["\uD0DB", "\uD0DB"], /* Hangul Syllable */
+ ["\uD0DC", "\uD0DC"], /* Hangul Syllable */
+ ["\uD0DD", "\uD0DD"], /* Hangul Syllable */
+ ["\uD0DE", "\uD0DE"], /* Hangul Syllable */
+ ["\uD0DF", "\uD0DF"], /* Hangul Syllable */
+ ["\uD0E0", "\uD0E0"], /* Hangul Syllable */
+ ["\uD0E1", "\uD0E1"], /* Hangul Syllable */
+ ["\uD0E2", "\uD0E2"], /* Hangul Syllable */
+ ["\uD0E3", "\uD0E3"], /* Hangul Syllable */
+ ["\uD0E4", "\uD0E4"], /* Hangul Syllable */
+ ["\uD0E5", "\uD0E5"], /* Hangul Syllable */
+ ["\uD0E6", "\uD0E6"], /* Hangul Syllable */
+ ["\uD0E7", "\uD0E7"], /* Hangul Syllable */
+ ["\uD0E8", "\uD0E8"], /* Hangul Syllable */
+ ["\uD0E9", "\uD0E9"], /* Hangul Syllable */
+ ["\uD0EA", "\uD0EA"], /* Hangul Syllable */
+ ["\uD0EB", "\uD0EB"], /* Hangul Syllable */
+ ["\uD0EC", "\uD0EC"], /* Hangul Syllable */
+ ["\uD0ED", "\uD0ED"], /* Hangul Syllable */
+ ["\uD0EE", "\uD0EE"], /* Hangul Syllable */
+ ["\uD0EF", "\uD0EF"], /* Hangul Syllable */
+ ["\uD0F0", "\uD0F0"], /* Hangul Syllable */
+ ["\uD0F1", "\uD0F1"], /* Hangul Syllable */
+ ["\uD0F2", "\uD0F2"], /* Hangul Syllable */
+ ["\uD0F3", "\uD0F3"], /* Hangul Syllable */
+ ["\uD0F4", "\uD0F4"], /* Hangul Syllable */
+ ["\uD0F5", "\uD0F5"], /* Hangul Syllable */
+ ["\uD0F6", "\uD0F6"], /* Hangul Syllable */
+ ["\uD0F7", "\uD0F7"], /* Hangul Syllable */
+ ["\uD0F8", "\uD0F8"], /* Hangul Syllable */
+ ["\uD0F9", "\uD0F9"], /* Hangul Syllable */
+ ["\uD0FA", "\uD0FA"], /* Hangul Syllable */
+ ["\uD0FB", "\uD0FB"], /* Hangul Syllable */
+ ["\uD0FC", "\uD0FC"], /* Hangul Syllable */
+ ["\uD0FD", "\uD0FD"], /* Hangul Syllable */
+ ["\uD0FE", "\uD0FE"], /* Hangul Syllable */
+ ["\uD0FF", "\uD0FF"], /* Hangul Syllable */
+ ["\uD100", "\uD100"], /* Hangul Syllable */
+ ["\uD101", "\uD101"], /* Hangul Syllable */
+ ["\uD102", "\uD102"], /* Hangul Syllable */
+ ["\uD103", "\uD103"], /* Hangul Syllable */
+ ["\uD104", "\uD104"], /* Hangul Syllable */
+ ["\uD105", "\uD105"], /* Hangul Syllable */
+ ["\uD106", "\uD106"], /* Hangul Syllable */
+ ["\uD107", "\uD107"], /* Hangul Syllable */
+ ["\uD108", "\uD108"], /* Hangul Syllable */
+ ["\uD109", "\uD109"], /* Hangul Syllable */
+ ["\uD10A", "\uD10A"], /* Hangul Syllable */
+ ["\uD10B", "\uD10B"], /* Hangul Syllable */
+ ["\uD10C", "\uD10C"], /* Hangul Syllable */
+ ["\uD10D", "\uD10D"], /* Hangul Syllable */
+ ["\uD10E", "\uD10E"], /* Hangul Syllable */
+ ["\uD10F", "\uD10F"], /* Hangul Syllable */
+ ["\uD110", "\uD110"], /* Hangul Syllable */
+ ["\uD111", "\uD111"], /* Hangul Syllable */
+ ["\uD112", "\uD112"], /* Hangul Syllable */
+ ["\uD113", "\uD113"], /* Hangul Syllable */
+ ["\uD114", "\uD114"], /* Hangul Syllable */
+ ["\uD115", "\uD115"], /* Hangul Syllable */
+ ["\uD116", "\uD116"], /* Hangul Syllable */
+ ["\uD117", "\uD117"], /* Hangul Syllable */
+ ["\uD118", "\uD118"], /* Hangul Syllable */
+ ["\uD119", "\uD119"], /* Hangul Syllable */
+ ["\uD11A", "\uD11A"], /* Hangul Syllable */
+ ["\uD11B", "\uD11B"], /* Hangul Syllable */
+ ["\uD11C", "\uD11C"], /* Hangul Syllable */
+ ["\uD11D", "\uD11D"], /* Hangul Syllable */
+ ["\uD11E", "\uD11E"], /* Hangul Syllable */
+ ["\uD11F", "\uD11F"], /* Hangul Syllable */
+ ["\uD120", "\uD120"], /* Hangul Syllable */
+ ["\uD121", "\uD121"], /* Hangul Syllable */
+ ["\uD122", "\uD122"], /* Hangul Syllable */
+ ["\uD123", "\uD123"], /* Hangul Syllable */
+ ["\uD124", "\uD124"], /* Hangul Syllable */
+ ["\uD125", "\uD125"], /* Hangul Syllable */
+ ["\uD126", "\uD126"], /* Hangul Syllable */
+ ["\uD127", "\uD127"], /* Hangul Syllable */
+ ["\uD128", "\uD128"], /* Hangul Syllable */
+ ["\uD129", "\uD129"], /* Hangul Syllable */
+ ["\uD12A", "\uD12A"], /* Hangul Syllable */
+ ["\uD12B", "\uD12B"], /* Hangul Syllable */
+ ["\uD12C", "\uD12C"], /* Hangul Syllable */
+ ["\uD12D", "\uD12D"], /* Hangul Syllable */
+ ["\uD12E", "\uD12E"], /* Hangul Syllable */
+ ["\uD12F", "\uD12F"], /* Hangul Syllable */
+ ["\uD130", "\uD130"], /* Hangul Syllable */
+ ["\uD131", "\uD131"], /* Hangul Syllable */
+ ["\uD132", "\uD132"], /* Hangul Syllable */
+ ["\uD133", "\uD133"], /* Hangul Syllable */
+ ["\uD134", "\uD134"], /* Hangul Syllable */
+ ["\uD135", "\uD135"], /* Hangul Syllable */
+ ["\uD136", "\uD136"], /* Hangul Syllable */
+ ["\uD137", "\uD137"], /* Hangul Syllable */
+ ["\uD138", "\uD138"], /* Hangul Syllable */
+ ["\uD139", "\uD139"], /* Hangul Syllable */
+ ["\uD13A", "\uD13A"], /* Hangul Syllable */
+ ["\uD13B", "\uD13B"], /* Hangul Syllable */
+ ["\uD13C", "\uD13C"], /* Hangul Syllable */
+ ["\uD13D", "\uD13D"], /* Hangul Syllable */
+ ["\uD13E", "\uD13E"], /* Hangul Syllable */
+ ["\uD13F", "\uD13F"], /* Hangul Syllable */
+ ["\uD140", "\uD140"], /* Hangul Syllable */
+ ["\uD141", "\uD141"], /* Hangul Syllable */
+ ["\uD142", "\uD142"], /* Hangul Syllable */
+ ["\uD143", "\uD143"], /* Hangul Syllable */
+ ["\uD144", "\uD144"], /* Hangul Syllable */
+ ["\uD145", "\uD145"], /* Hangul Syllable */
+ ["\uD146", "\uD146"], /* Hangul Syllable */
+ ["\uD147", "\uD147"], /* Hangul Syllable */
+ ["\uD148", "\uD148"], /* Hangul Syllable */
+ ["\uD149", "\uD149"], /* Hangul Syllable */
+ ["\uD14A", "\uD14A"], /* Hangul Syllable */
+ ["\uD14B", "\uD14B"], /* Hangul Syllable */
+ ["\uD14C", "\uD14C"], /* Hangul Syllable */
+ ["\uD14D", "\uD14D"], /* Hangul Syllable */
+ ["\uD14E", "\uD14E"], /* Hangul Syllable */
+ ["\uD14F", "\uD14F"], /* Hangul Syllable */
+ ["\uD150", "\uD150"], /* Hangul Syllable */
+ ["\uD151", "\uD151"], /* Hangul Syllable */
+ ["\uD152", "\uD152"], /* Hangul Syllable */
+ ["\uD153", "\uD153"], /* Hangul Syllable */
+ ["\uD154", "\uD154"], /* Hangul Syllable */
+ ["\uD155", "\uD155"], /* Hangul Syllable */
+ ["\uD156", "\uD156"], /* Hangul Syllable */
+ ["\uD157", "\uD157"], /* Hangul Syllable */
+ ["\uD158", "\uD158"], /* Hangul Syllable */
+ ["\uD159", "\uD159"], /* Hangul Syllable */
+ ["\uD15A", "\uD15A"], /* Hangul Syllable */
+ ["\uD15B", "\uD15B"], /* Hangul Syllable */
+ ["\uD15C", "\uD15C"], /* Hangul Syllable */
+ ["\uD15D", "\uD15D"], /* Hangul Syllable */
+ ["\uD15E", "\uD15E"], /* Hangul Syllable */
+ ["\uD15F", "\uD15F"], /* Hangul Syllable */
+ ["\uD160", "\uD160"], /* Hangul Syllable */
+ ["\uD161", "\uD161"], /* Hangul Syllable */
+ ["\uD162", "\uD162"], /* Hangul Syllable */
+ ["\uD163", "\uD163"], /* Hangul Syllable */
+ ["\uD164", "\uD164"], /* Hangul Syllable */
+ ["\uD165", "\uD165"], /* Hangul Syllable */
+ ["\uD166", "\uD166"], /* Hangul Syllable */
+ ["\uD167", "\uD167"], /* Hangul Syllable */
+ ["\uD168", "\uD168"], /* Hangul Syllable */
+ ["\uD169", "\uD169"], /* Hangul Syllable */
+ ["\uD16A", "\uD16A"], /* Hangul Syllable */
+ ["\uD16B", "\uD16B"], /* Hangul Syllable */
+ ["\uD16C", "\uD16C"], /* Hangul Syllable */
+ ["\uD16D", "\uD16D"], /* Hangul Syllable */
+ ["\uD16E", "\uD16E"], /* Hangul Syllable */
+ ["\uD16F", "\uD16F"], /* Hangul Syllable */
+ ["\uD170", "\uD170"], /* Hangul Syllable */
+ ["\uD171", "\uD171"], /* Hangul Syllable */
+ ["\uD172", "\uD172"], /* Hangul Syllable */
+ ["\uD173", "\uD173"], /* Hangul Syllable */
+ ["\uD174", "\uD174"], /* Hangul Syllable */
+ ["\uD175", "\uD175"], /* Hangul Syllable */
+ ["\uD176", "\uD176"], /* Hangul Syllable */
+ ["\uD177", "\uD177"], /* Hangul Syllable */
+ ["\uD178", "\uD178"], /* Hangul Syllable */
+ ["\uD179", "\uD179"], /* Hangul Syllable */
+ ["\uD17A", "\uD17A"], /* Hangul Syllable */
+ ["\uD17B", "\uD17B"], /* Hangul Syllable */
+ ["\uD17C", "\uD17C"], /* Hangul Syllable */
+ ["\uD17D", "\uD17D"], /* Hangul Syllable */
+ ["\uD17E", "\uD17E"], /* Hangul Syllable */
+ ["\uD17F", "\uD17F"], /* Hangul Syllable */
+ ["\uD180", "\uD180"], /* Hangul Syllable */
+ ["\uD181", "\uD181"], /* Hangul Syllable */
+ ["\uD182", "\uD182"], /* Hangul Syllable */
+ ["\uD183", "\uD183"], /* Hangul Syllable */
+ ["\uD184", "\uD184"], /* Hangul Syllable */
+ ["\uD185", "\uD185"], /* Hangul Syllable */
+ ["\uD186", "\uD186"], /* Hangul Syllable */
+ ["\uD187", "\uD187"], /* Hangul Syllable */
+ ["\uD188", "\uD188"], /* Hangul Syllable */
+ ["\uD189", "\uD189"], /* Hangul Syllable */
+ ["\uD18A", "\uD18A"], /* Hangul Syllable */
+ ["\uD18B", "\uD18B"], /* Hangul Syllable */
+ ["\uD18C", "\uD18C"], /* Hangul Syllable */
+ ["\uD18D", "\uD18D"], /* Hangul Syllable */
+ ["\uD18E", "\uD18E"], /* Hangul Syllable */
+ ["\uD18F", "\uD18F"], /* Hangul Syllable */
+ ["\uD190", "\uD190"], /* Hangul Syllable */
+ ["\uD191", "\uD191"], /* Hangul Syllable */
+ ["\uD192", "\uD192"], /* Hangul Syllable */
+ ["\uD193", "\uD193"], /* Hangul Syllable */
+ ["\uD194", "\uD194"], /* Hangul Syllable */
+ ["\uD195", "\uD195"], /* Hangul Syllable */
+ ["\uD196", "\uD196"], /* Hangul Syllable */
+ ["\uD197", "\uD197"], /* Hangul Syllable */
+ ["\uD198", "\uD198"], /* Hangul Syllable */
+ ["\uD199", "\uD199"], /* Hangul Syllable */
+ ["\uD19A", "\uD19A"], /* Hangul Syllable */
+ ["\uD19B", "\uD19B"], /* Hangul Syllable */
+ ["\uD19C", "\uD19C"], /* Hangul Syllable */
+ ["\uD19D", "\uD19D"], /* Hangul Syllable */
+ ["\uD19E", "\uD19E"], /* Hangul Syllable */
+ ["\uD19F", "\uD19F"], /* Hangul Syllable */
+ ["\uD1A0", "\uD1A0"], /* Hangul Syllable */
+ ["\uD1A1", "\uD1A1"], /* Hangul Syllable */
+ ["\uD1A2", "\uD1A2"], /* Hangul Syllable */
+ ["\uD1A3", "\uD1A3"], /* Hangul Syllable */
+ ["\uD1A4", "\uD1A4"], /* Hangul Syllable */
+ ["\uD1A5", "\uD1A5"], /* Hangul Syllable */
+ ["\uD1A6", "\uD1A6"], /* Hangul Syllable */
+ ["\uD1A7", "\uD1A7"], /* Hangul Syllable */
+ ["\uD1A8", "\uD1A8"], /* Hangul Syllable */
+ ["\uD1A9", "\uD1A9"], /* Hangul Syllable */
+ ["\uD1AA", "\uD1AA"], /* Hangul Syllable */
+ ["\uD1AB", "\uD1AB"], /* Hangul Syllable */
+ ["\uD1AC", "\uD1AC"], /* Hangul Syllable */
+ ["\uD1AD", "\uD1AD"], /* Hangul Syllable */
+ ["\uD1AE", "\uD1AE"], /* Hangul Syllable */
+ ["\uD1AF", "\uD1AF"], /* Hangul Syllable */
+ ["\uD1B0", "\uD1B0"], /* Hangul Syllable */
+ ["\uD1B1", "\uD1B1"], /* Hangul Syllable */
+ ["\uD1B2", "\uD1B2"], /* Hangul Syllable */
+ ["\uD1B3", "\uD1B3"], /* Hangul Syllable */
+ ["\uD1B4", "\uD1B4"], /* Hangul Syllable */
+ ["\uD1B5", "\uD1B5"], /* Hangul Syllable */
+ ["\uD1B6", "\uD1B6"], /* Hangul Syllable */
+ ["\uD1B7", "\uD1B7"], /* Hangul Syllable */
+ ["\uD1B8", "\uD1B8"], /* Hangul Syllable */
+ ["\uD1B9", "\uD1B9"], /* Hangul Syllable */
+ ["\uD1BA", "\uD1BA"], /* Hangul Syllable */
+ ["\uD1BB", "\uD1BB"], /* Hangul Syllable */
+ ["\uD1BC", "\uD1BC"], /* Hangul Syllable */
+ ["\uD1BD", "\uD1BD"], /* Hangul Syllable */
+ ["\uD1BE", "\uD1BE"], /* Hangul Syllable */
+ ["\uD1BF", "\uD1BF"], /* Hangul Syllable */
+ ["\uD1C0", "\uD1C0"], /* Hangul Syllable */
+ ["\uD1C1", "\uD1C1"], /* Hangul Syllable */
+ ["\uD1C2", "\uD1C2"], /* Hangul Syllable */
+ ["\uD1C3", "\uD1C3"], /* Hangul Syllable */
+ ["\uD1C4", "\uD1C4"], /* Hangul Syllable */
+ ["\uD1C5", "\uD1C5"], /* Hangul Syllable */
+ ["\uD1C6", "\uD1C6"], /* Hangul Syllable */
+ ["\uD1C7", "\uD1C7"], /* Hangul Syllable */
+ ["\uD1C8", "\uD1C8"], /* Hangul Syllable */
+ ["\uD1C9", "\uD1C9"], /* Hangul Syllable */
+ ["\uD1CA", "\uD1CA"], /* Hangul Syllable */
+ ["\uD1CB", "\uD1CB"], /* Hangul Syllable */
+ ["\uD1CC", "\uD1CC"], /* Hangul Syllable */
+ ["\uD1CD", "\uD1CD"], /* Hangul Syllable */
+ ["\uD1CE", "\uD1CE"], /* Hangul Syllable */
+ ["\uD1CF", "\uD1CF"], /* Hangul Syllable */
+ ["\uD1D0", "\uD1D0"], /* Hangul Syllable */
+ ["\uD1D1", "\uD1D1"], /* Hangul Syllable */
+ ["\uD1D2", "\uD1D2"], /* Hangul Syllable */
+ ["\uD1D3", "\uD1D3"], /* Hangul Syllable */
+ ["\uD1D4", "\uD1D4"], /* Hangul Syllable */
+ ["\uD1D5", "\uD1D5"], /* Hangul Syllable */
+ ["\uD1D6", "\uD1D6"], /* Hangul Syllable */
+ ["\uD1D7", "\uD1D7"], /* Hangul Syllable */
+ ["\uD1D8", "\uD1D8"], /* Hangul Syllable */
+ ["\uD1D9", "\uD1D9"], /* Hangul Syllable */
+ ["\uD1DA", "\uD1DA"], /* Hangul Syllable */
+ ["\uD1DB", "\uD1DB"], /* Hangul Syllable */
+ ["\uD1DC", "\uD1DC"], /* Hangul Syllable */
+ ["\uD1DD", "\uD1DD"], /* Hangul Syllable */
+ ["\uD1DE", "\uD1DE"], /* Hangul Syllable */
+ ["\uD1DF", "\uD1DF"], /* Hangul Syllable */
+ ["\uD1E0", "\uD1E0"], /* Hangul Syllable */
+ ["\uD1E1", "\uD1E1"], /* Hangul Syllable */
+ ["\uD1E2", "\uD1E2"], /* Hangul Syllable */
+ ["\uD1E3", "\uD1E3"], /* Hangul Syllable */
+ ["\uD1E4", "\uD1E4"], /* Hangul Syllable */
+ ["\uD1E5", "\uD1E5"], /* Hangul Syllable */
+ ["\uD1E6", "\uD1E6"], /* Hangul Syllable */
+ ["\uD1E7", "\uD1E7"], /* Hangul Syllable */
+ ["\uD1E8", "\uD1E8"], /* Hangul Syllable */
+ ["\uD1E9", "\uD1E9"], /* Hangul Syllable */
+ ["\uD1EA", "\uD1EA"], /* Hangul Syllable */
+ ["\uD1EB", "\uD1EB"], /* Hangul Syllable */
+ ["\uD1EC", "\uD1EC"], /* Hangul Syllable */
+ ["\uD1ED", "\uD1ED"], /* Hangul Syllable */
+ ["\uD1EE", "\uD1EE"], /* Hangul Syllable */
+ ["\uD1EF", "\uD1EF"], /* Hangul Syllable */
+ ["\uD1F0", "\uD1F0"], /* Hangul Syllable */
+ ["\uD1F1", "\uD1F1"], /* Hangul Syllable */
+ ["\uD1F2", "\uD1F2"], /* Hangul Syllable */
+ ["\uD1F3", "\uD1F3"], /* Hangul Syllable */
+ ["\uD1F4", "\uD1F4"], /* Hangul Syllable */
+ ["\uD1F5", "\uD1F5"], /* Hangul Syllable */
+ ["\uD1F6", "\uD1F6"], /* Hangul Syllable */
+ ["\uD1F7", "\uD1F7"], /* Hangul Syllable */
+ ["\uD1F8", "\uD1F8"], /* Hangul Syllable */
+ ["\uD1F9", "\uD1F9"], /* Hangul Syllable */
+ ["\uD1FA", "\uD1FA"], /* Hangul Syllable */
+ ["\uD1FB", "\uD1FB"], /* Hangul Syllable */
+ ["\uD1FC", "\uD1FC"], /* Hangul Syllable */
+ ["\uD1FD", "\uD1FD"], /* Hangul Syllable */
+ ["\uD1FE", "\uD1FE"], /* Hangul Syllable */
+ ["\uD1FF", "\uD1FF"], /* Hangul Syllable */
+ ["\uD200", "\uD200"], /* Hangul Syllable */
+ ["\uD201", "\uD201"], /* Hangul Syllable */
+ ["\uD202", "\uD202"], /* Hangul Syllable */
+ ["\uD203", "\uD203"], /* Hangul Syllable */
+ ["\uD204", "\uD204"], /* Hangul Syllable */
+ ["\uD205", "\uD205"], /* Hangul Syllable */
+ ["\uD206", "\uD206"], /* Hangul Syllable */
+ ["\uD207", "\uD207"], /* Hangul Syllable */
+ ["\uD208", "\uD208"], /* Hangul Syllable */
+ ["\uD209", "\uD209"], /* Hangul Syllable */
+ ["\uD20A", "\uD20A"], /* Hangul Syllable */
+ ["\uD20B", "\uD20B"], /* Hangul Syllable */
+ ["\uD20C", "\uD20C"], /* Hangul Syllable */
+ ["\uD20D", "\uD20D"], /* Hangul Syllable */
+ ["\uD20E", "\uD20E"], /* Hangul Syllable */
+ ["\uD20F", "\uD20F"], /* Hangul Syllable */
+ ["\uD210", "\uD210"], /* Hangul Syllable */
+ ["\uD211", "\uD211"], /* Hangul Syllable */
+ ["\uD212", "\uD212"], /* Hangul Syllable */
+ ["\uD213", "\uD213"], /* Hangul Syllable */
+ ["\uD214", "\uD214"], /* Hangul Syllable */
+ ["\uD215", "\uD215"], /* Hangul Syllable */
+ ["\uD216", "\uD216"], /* Hangul Syllable */
+ ["\uD217", "\uD217"], /* Hangul Syllable */
+ ["\uD218", "\uD218"], /* Hangul Syllable */
+ ["\uD219", "\uD219"], /* Hangul Syllable */
+ ["\uD21A", "\uD21A"], /* Hangul Syllable */
+ ["\uD21B", "\uD21B"], /* Hangul Syllable */
+ ["\uD21C", "\uD21C"], /* Hangul Syllable */
+ ["\uD21D", "\uD21D"], /* Hangul Syllable */
+ ["\uD21E", "\uD21E"], /* Hangul Syllable */
+ ["\uD21F", "\uD21F"], /* Hangul Syllable */
+ ["\uD220", "\uD220"], /* Hangul Syllable */
+ ["\uD221", "\uD221"], /* Hangul Syllable */
+ ["\uD222", "\uD222"], /* Hangul Syllable */
+ ["\uD223", "\uD223"], /* Hangul Syllable */
+ ["\uD224", "\uD224"], /* Hangul Syllable */
+ ["\uD225", "\uD225"], /* Hangul Syllable */
+ ["\uD226", "\uD226"], /* Hangul Syllable */
+ ["\uD227", "\uD227"], /* Hangul Syllable */
+ ["\uD228", "\uD228"], /* Hangul Syllable */
+ ["\uD229", "\uD229"], /* Hangul Syllable */
+ ["\uD22A", "\uD22A"], /* Hangul Syllable */
+ ["\uD22B", "\uD22B"], /* Hangul Syllable */
+ ["\uD22C", "\uD22C"], /* Hangul Syllable */
+ ["\uD22D", "\uD22D"], /* Hangul Syllable */
+ ["\uD22E", "\uD22E"], /* Hangul Syllable */
+ ["\uD22F", "\uD22F"], /* Hangul Syllable */
+ ["\uD230", "\uD230"], /* Hangul Syllable */
+ ["\uD231", "\uD231"], /* Hangul Syllable */
+ ["\uD232", "\uD232"], /* Hangul Syllable */
+ ["\uD233", "\uD233"], /* Hangul Syllable */
+ ["\uD234", "\uD234"], /* Hangul Syllable */
+ ["\uD235", "\uD235"], /* Hangul Syllable */
+ ["\uD236", "\uD236"], /* Hangul Syllable */
+ ["\uD237", "\uD237"], /* Hangul Syllable */
+ ["\uD238", "\uD238"], /* Hangul Syllable */
+ ["\uD239", "\uD239"], /* Hangul Syllable */
+ ["\uD23A", "\uD23A"], /* Hangul Syllable */
+ ["\uD23B", "\uD23B"], /* Hangul Syllable */
+ ["\uD23C", "\uD23C"], /* Hangul Syllable */
+ ["\uD23D", "\uD23D"], /* Hangul Syllable */
+ ["\uD23E", "\uD23E"], /* Hangul Syllable */
+ ["\uD23F", "\uD23F"], /* Hangul Syllable */
+ ["\uD240", "\uD240"], /* Hangul Syllable */
+ ["\uD241", "\uD241"], /* Hangul Syllable */
+ ["\uD242", "\uD242"], /* Hangul Syllable */
+ ["\uD243", "\uD243"], /* Hangul Syllable */
+ ["\uD244", "\uD244"], /* Hangul Syllable */
+ ["\uD245", "\uD245"], /* Hangul Syllable */
+ ["\uD246", "\uD246"], /* Hangul Syllable */
+ ["\uD247", "\uD247"], /* Hangul Syllable */
+ ["\uD248", "\uD248"], /* Hangul Syllable */
+ ["\uD249", "\uD249"], /* Hangul Syllable */
+ ["\uD24A", "\uD24A"], /* Hangul Syllable */
+ ["\uD24B", "\uD24B"], /* Hangul Syllable */
+ ["\uD24C", "\uD24C"], /* Hangul Syllable */
+ ["\uD24D", "\uD24D"], /* Hangul Syllable */
+ ["\uD24E", "\uD24E"], /* Hangul Syllable */
+ ["\uD24F", "\uD24F"], /* Hangul Syllable */
+ ["\uD250", "\uD250"], /* Hangul Syllable */
+ ["\uD251", "\uD251"], /* Hangul Syllable */
+ ["\uD252", "\uD252"], /* Hangul Syllable */
+ ["\uD253", "\uD253"], /* Hangul Syllable */
+ ["\uD254", "\uD254"], /* Hangul Syllable */
+ ["\uD255", "\uD255"], /* Hangul Syllable */
+ ["\uD256", "\uD256"], /* Hangul Syllable */
+ ["\uD257", "\uD257"], /* Hangul Syllable */
+ ["\uD258", "\uD258"], /* Hangul Syllable */
+ ["\uD259", "\uD259"], /* Hangul Syllable */
+ ["\uD25A", "\uD25A"], /* Hangul Syllable */
+ ["\uD25B", "\uD25B"], /* Hangul Syllable */
+ ["\uD25C", "\uD25C"], /* Hangul Syllable */
+ ["\uD25D", "\uD25D"], /* Hangul Syllable */
+ ["\uD25E", "\uD25E"], /* Hangul Syllable */
+ ["\uD25F", "\uD25F"], /* Hangul Syllable */
+ ["\uD260", "\uD260"], /* Hangul Syllable */
+ ["\uD261", "\uD261"], /* Hangul Syllable */
+ ["\uD262", "\uD262"], /* Hangul Syllable */
+ ["\uD263", "\uD263"], /* Hangul Syllable */
+ ["\uD264", "\uD264"], /* Hangul Syllable */
+ ["\uD265", "\uD265"], /* Hangul Syllable */
+ ["\uD266", "\uD266"], /* Hangul Syllable */
+ ["\uD267", "\uD267"], /* Hangul Syllable */
+ ["\uD268", "\uD268"], /* Hangul Syllable */
+ ["\uD269", "\uD269"], /* Hangul Syllable */
+ ["\uD26A", "\uD26A"], /* Hangul Syllable */
+ ["\uD26B", "\uD26B"], /* Hangul Syllable */
+ ["\uD26C", "\uD26C"], /* Hangul Syllable */
+ ["\uD26D", "\uD26D"], /* Hangul Syllable */
+ ["\uD26E", "\uD26E"], /* Hangul Syllable */
+ ["\uD26F", "\uD26F"], /* Hangul Syllable */
+ ["\uD270", "\uD270"], /* Hangul Syllable */
+ ["\uD271", "\uD271"], /* Hangul Syllable */
+ ["\uD272", "\uD272"], /* Hangul Syllable */
+ ["\uD273", "\uD273"], /* Hangul Syllable */
+ ["\uD274", "\uD274"], /* Hangul Syllable */
+ ["\uD275", "\uD275"], /* Hangul Syllable */
+ ["\uD276", "\uD276"], /* Hangul Syllable */
+ ["\uD277", "\uD277"], /* Hangul Syllable */
+ ["\uD278", "\uD278"], /* Hangul Syllable */
+ ["\uD279", "\uD279"], /* Hangul Syllable */
+ ["\uD27A", "\uD27A"], /* Hangul Syllable */
+ ["\uD27B", "\uD27B"], /* Hangul Syllable */
+ ["\uD27C", "\uD27C"], /* Hangul Syllable */
+ ["\uD27D", "\uD27D"], /* Hangul Syllable */
+ ["\uD27E", "\uD27E"], /* Hangul Syllable */
+ ["\uD27F", "\uD27F"], /* Hangul Syllable */
+ ["\uD280", "\uD280"], /* Hangul Syllable */
+ ["\uD281", "\uD281"], /* Hangul Syllable */
+ ["\uD282", "\uD282"], /* Hangul Syllable */
+ ["\uD283", "\uD283"], /* Hangul Syllable */
+ ["\uD284", "\uD284"], /* Hangul Syllable */
+ ["\uD285", "\uD285"], /* Hangul Syllable */
+ ["\uD286", "\uD286"], /* Hangul Syllable */
+ ["\uD287", "\uD287"], /* Hangul Syllable */
+ ["\uD288", "\uD288"], /* Hangul Syllable */
+ ["\uD289", "\uD289"], /* Hangul Syllable */
+ ["\uD28A", "\uD28A"], /* Hangul Syllable */
+ ["\uD28B", "\uD28B"], /* Hangul Syllable */
+ ["\uD28C", "\uD28C"], /* Hangul Syllable */
+ ["\uD28D", "\uD28D"], /* Hangul Syllable */
+ ["\uD28E", "\uD28E"], /* Hangul Syllable */
+ ["\uD28F", "\uD28F"], /* Hangul Syllable */
+ ["\uD290", "\uD290"], /* Hangul Syllable */
+ ["\uD291", "\uD291"], /* Hangul Syllable */
+ ["\uD292", "\uD292"], /* Hangul Syllable */
+ ["\uD293", "\uD293"], /* Hangul Syllable */
+ ["\uD294", "\uD294"], /* Hangul Syllable */
+ ["\uD295", "\uD295"], /* Hangul Syllable */
+ ["\uD296", "\uD296"], /* Hangul Syllable */
+ ["\uD297", "\uD297"], /* Hangul Syllable */
+ ["\uD298", "\uD298"], /* Hangul Syllable */
+ ["\uD299", "\uD299"], /* Hangul Syllable */
+ ["\uD29A", "\uD29A"], /* Hangul Syllable */
+ ["\uD29B", "\uD29B"], /* Hangul Syllable */
+ ["\uD29C", "\uD29C"], /* Hangul Syllable */
+ ["\uD29D", "\uD29D"], /* Hangul Syllable */
+ ["\uD29E", "\uD29E"], /* Hangul Syllable */
+ ["\uD29F", "\uD29F"], /* Hangul Syllable */
+ ["\uD2A0", "\uD2A0"], /* Hangul Syllable */
+ ["\uD2A1", "\uD2A1"], /* Hangul Syllable */
+ ["\uD2A2", "\uD2A2"], /* Hangul Syllable */
+ ["\uD2A3", "\uD2A3"], /* Hangul Syllable */
+ ["\uD2A4", "\uD2A4"], /* Hangul Syllable */
+ ["\uD2A5", "\uD2A5"], /* Hangul Syllable */
+ ["\uD2A6", "\uD2A6"], /* Hangul Syllable */
+ ["\uD2A7", "\uD2A7"], /* Hangul Syllable */
+ ["\uD2A8", "\uD2A8"], /* Hangul Syllable */
+ ["\uD2A9", "\uD2A9"], /* Hangul Syllable */
+ ["\uD2AA", "\uD2AA"], /* Hangul Syllable */
+ ["\uD2AB", "\uD2AB"], /* Hangul Syllable */
+ ["\uD2AC", "\uD2AC"], /* Hangul Syllable */
+ ["\uD2AD", "\uD2AD"], /* Hangul Syllable */
+ ["\uD2AE", "\uD2AE"], /* Hangul Syllable */
+ ["\uD2AF", "\uD2AF"], /* Hangul Syllable */
+ ["\uD2B0", "\uD2B0"], /* Hangul Syllable */
+ ["\uD2B1", "\uD2B1"], /* Hangul Syllable */
+ ["\uD2B2", "\uD2B2"], /* Hangul Syllable */
+ ["\uD2B3", "\uD2B3"], /* Hangul Syllable */
+ ["\uD2B4", "\uD2B4"], /* Hangul Syllable */
+ ["\uD2B5", "\uD2B5"], /* Hangul Syllable */
+ ["\uD2B6", "\uD2B6"], /* Hangul Syllable */
+ ["\uD2B7", "\uD2B7"], /* Hangul Syllable */
+ ["\uD2B8", "\uD2B8"], /* Hangul Syllable */
+ ["\uD2B9", "\uD2B9"], /* Hangul Syllable */
+ ["\uD2BA", "\uD2BA"], /* Hangul Syllable */
+ ["\uD2BB", "\uD2BB"], /* Hangul Syllable */
+ ["\uD2BC", "\uD2BC"], /* Hangul Syllable */
+ ["\uD2BD", "\uD2BD"], /* Hangul Syllable */
+ ["\uD2BE", "\uD2BE"], /* Hangul Syllable */
+ ["\uD2BF", "\uD2BF"], /* Hangul Syllable */
+ ["\uD2C0", "\uD2C0"], /* Hangul Syllable */
+ ["\uD2C1", "\uD2C1"], /* Hangul Syllable */
+ ["\uD2C2", "\uD2C2"], /* Hangul Syllable */
+ ["\uD2C3", "\uD2C3"], /* Hangul Syllable */
+ ["\uD2C4", "\uD2C4"], /* Hangul Syllable */
+ ["\uD2C5", "\uD2C5"], /* Hangul Syllable */
+ ["\uD2C6", "\uD2C6"], /* Hangul Syllable */
+ ["\uD2C7", "\uD2C7"], /* Hangul Syllable */
+ ["\uD2C8", "\uD2C8"], /* Hangul Syllable */
+ ["\uD2C9", "\uD2C9"], /* Hangul Syllable */
+ ["\uD2CA", "\uD2CA"], /* Hangul Syllable */
+ ["\uD2CB", "\uD2CB"], /* Hangul Syllable */
+ ["\uD2CC", "\uD2CC"], /* Hangul Syllable */
+ ["\uD2CD", "\uD2CD"], /* Hangul Syllable */
+ ["\uD2CE", "\uD2CE"], /* Hangul Syllable */
+ ["\uD2CF", "\uD2CF"], /* Hangul Syllable */
+ ["\uD2D0", "\uD2D0"], /* Hangul Syllable */
+ ["\uD2D1", "\uD2D1"], /* Hangul Syllable */
+ ["\uD2D2", "\uD2D2"], /* Hangul Syllable */
+ ["\uD2D3", "\uD2D3"], /* Hangul Syllable */
+ ["\uD2D4", "\uD2D4"], /* Hangul Syllable */
+ ["\uD2D5", "\uD2D5"], /* Hangul Syllable */
+ ["\uD2D6", "\uD2D6"], /* Hangul Syllable */
+ ["\uD2D7", "\uD2D7"], /* Hangul Syllable */
+ ["\uD2D8", "\uD2D8"], /* Hangul Syllable */
+ ["\uD2D9", "\uD2D9"], /* Hangul Syllable */
+ ["\uD2DA", "\uD2DA"], /* Hangul Syllable */
+ ["\uD2DB", "\uD2DB"], /* Hangul Syllable */
+ ["\uD2DC", "\uD2DC"], /* Hangul Syllable */
+ ["\uD2DD", "\uD2DD"], /* Hangul Syllable */
+ ["\uD2DE", "\uD2DE"], /* Hangul Syllable */
+ ["\uD2DF", "\uD2DF"], /* Hangul Syllable */
+ ["\uD2E0", "\uD2E0"], /* Hangul Syllable */
+ ["\uD2E1", "\uD2E1"], /* Hangul Syllable */
+ ["\uD2E2", "\uD2E2"], /* Hangul Syllable */
+ ["\uD2E3", "\uD2E3"], /* Hangul Syllable */
+ ["\uD2E4", "\uD2E4"], /* Hangul Syllable */
+ ["\uD2E5", "\uD2E5"], /* Hangul Syllable */
+ ["\uD2E6", "\uD2E6"], /* Hangul Syllable */
+ ["\uD2E7", "\uD2E7"], /* Hangul Syllable */
+ ["\uD2E8", "\uD2E8"], /* Hangul Syllable */
+ ["\uD2E9", "\uD2E9"], /* Hangul Syllable */
+ ["\uD2EA", "\uD2EA"], /* Hangul Syllable */
+ ["\uD2EB", "\uD2EB"], /* Hangul Syllable */
+ ["\uD2EC", "\uD2EC"], /* Hangul Syllable */
+ ["\uD2ED", "\uD2ED"], /* Hangul Syllable */
+ ["\uD2EE", "\uD2EE"], /* Hangul Syllable */
+ ["\uD2EF", "\uD2EF"], /* Hangul Syllable */
+ ["\uD2F0", "\uD2F0"], /* Hangul Syllable */
+ ["\uD2F1", "\uD2F1"], /* Hangul Syllable */
+ ["\uD2F2", "\uD2F2"], /* Hangul Syllable */
+ ["\uD2F3", "\uD2F3"], /* Hangul Syllable */
+ ["\uD2F4", "\uD2F4"], /* Hangul Syllable */
+ ["\uD2F5", "\uD2F5"], /* Hangul Syllable */
+ ["\uD2F6", "\uD2F6"], /* Hangul Syllable */
+ ["\uD2F7", "\uD2F7"], /* Hangul Syllable */
+ ["\uD2F8", "\uD2F8"], /* Hangul Syllable */
+ ["\uD2F9", "\uD2F9"], /* Hangul Syllable */
+ ["\uD2FA", "\uD2FA"], /* Hangul Syllable */
+ ["\uD2FB", "\uD2FB"], /* Hangul Syllable */
+ ["\uD2FC", "\uD2FC"], /* Hangul Syllable */
+ ["\uD2FD", "\uD2FD"], /* Hangul Syllable */
+ ["\uD2FE", "\uD2FE"], /* Hangul Syllable */
+ ["\uD2FF", "\uD2FF"], /* Hangul Syllable */
+ ["\uD300", "\uD300"], /* Hangul Syllable */
+ ["\uD301", "\uD301"], /* Hangul Syllable */
+ ["\uD302", "\uD302"], /* Hangul Syllable */
+ ["\uD303", "\uD303"], /* Hangul Syllable */
+ ["\uD304", "\uD304"], /* Hangul Syllable */
+ ["\uD305", "\uD305"], /* Hangul Syllable */
+ ["\uD306", "\uD306"], /* Hangul Syllable */
+ ["\uD307", "\uD307"], /* Hangul Syllable */
+ ["\uD308", "\uD308"], /* Hangul Syllable */
+ ["\uD309", "\uD309"], /* Hangul Syllable */
+ ["\uD30A", "\uD30A"], /* Hangul Syllable */
+ ["\uD30B", "\uD30B"], /* Hangul Syllable */
+ ["\uD30C", "\uD30C"], /* Hangul Syllable */
+ ["\uD30D", "\uD30D"], /* Hangul Syllable */
+ ["\uD30E", "\uD30E"], /* Hangul Syllable */
+ ["\uD30F", "\uD30F"], /* Hangul Syllable */
+ ["\uD310", "\uD310"], /* Hangul Syllable */
+ ["\uD311", "\uD311"], /* Hangul Syllable */
+ ["\uD312", "\uD312"], /* Hangul Syllable */
+ ["\uD313", "\uD313"], /* Hangul Syllable */
+ ["\uD314", "\uD314"], /* Hangul Syllable */
+ ["\uD315", "\uD315"], /* Hangul Syllable */
+ ["\uD316", "\uD316"], /* Hangul Syllable */
+ ["\uD317", "\uD317"], /* Hangul Syllable */
+ ["\uD318", "\uD318"], /* Hangul Syllable */
+ ["\uD319", "\uD319"], /* Hangul Syllable */
+ ["\uD31A", "\uD31A"], /* Hangul Syllable */
+ ["\uD31B", "\uD31B"], /* Hangul Syllable */
+ ["\uD31C", "\uD31C"], /* Hangul Syllable */
+ ["\uD31D", "\uD31D"], /* Hangul Syllable */
+ ["\uD31E", "\uD31E"], /* Hangul Syllable */
+ ["\uD31F", "\uD31F"], /* Hangul Syllable */
+ ["\uD320", "\uD320"], /* Hangul Syllable */
+ ["\uD321", "\uD321"], /* Hangul Syllable */
+ ["\uD322", "\uD322"], /* Hangul Syllable */
+ ["\uD323", "\uD323"], /* Hangul Syllable */
+ ["\uD324", "\uD324"], /* Hangul Syllable */
+ ["\uD325", "\uD325"], /* Hangul Syllable */
+ ["\uD326", "\uD326"], /* Hangul Syllable */
+ ["\uD327", "\uD327"], /* Hangul Syllable */
+ ["\uD328", "\uD328"], /* Hangul Syllable */
+ ["\uD329", "\uD329"], /* Hangul Syllable */
+ ["\uD32A", "\uD32A"], /* Hangul Syllable */
+ ["\uD32B", "\uD32B"], /* Hangul Syllable */
+ ["\uD32C", "\uD32C"], /* Hangul Syllable */
+ ["\uD32D", "\uD32D"], /* Hangul Syllable */
+ ["\uD32E", "\uD32E"], /* Hangul Syllable */
+ ["\uD32F", "\uD32F"], /* Hangul Syllable */
+ ["\uD330", "\uD330"], /* Hangul Syllable */
+ ["\uD331", "\uD331"], /* Hangul Syllable */
+ ["\uD332", "\uD332"], /* Hangul Syllable */
+ ["\uD333", "\uD333"], /* Hangul Syllable */
+ ["\uD334", "\uD334"], /* Hangul Syllable */
+ ["\uD335", "\uD335"], /* Hangul Syllable */
+ ["\uD336", "\uD336"], /* Hangul Syllable */
+ ["\uD337", "\uD337"], /* Hangul Syllable */
+ ["\uD338", "\uD338"], /* Hangul Syllable */
+ ["\uD339", "\uD339"], /* Hangul Syllable */
+ ["\uD33A", "\uD33A"], /* Hangul Syllable */
+ ["\uD33B", "\uD33B"], /* Hangul Syllable */
+ ["\uD33C", "\uD33C"], /* Hangul Syllable */
+ ["\uD33D", "\uD33D"], /* Hangul Syllable */
+ ["\uD33E", "\uD33E"], /* Hangul Syllable */
+ ["\uD33F", "\uD33F"], /* Hangul Syllable */
+ ["\uD340", "\uD340"], /* Hangul Syllable */
+ ["\uD341", "\uD341"], /* Hangul Syllable */
+ ["\uD342", "\uD342"], /* Hangul Syllable */
+ ["\uD343", "\uD343"], /* Hangul Syllable */
+ ["\uD344", "\uD344"], /* Hangul Syllable */
+ ["\uD345", "\uD345"], /* Hangul Syllable */
+ ["\uD346", "\uD346"], /* Hangul Syllable */
+ ["\uD347", "\uD347"], /* Hangul Syllable */
+ ["\uD348", "\uD348"], /* Hangul Syllable */
+ ["\uD349", "\uD349"], /* Hangul Syllable */
+ ["\uD34A", "\uD34A"], /* Hangul Syllable */
+ ["\uD34B", "\uD34B"], /* Hangul Syllable */
+ ["\uD34C", "\uD34C"], /* Hangul Syllable */
+ ["\uD34D", "\uD34D"], /* Hangul Syllable */
+ ["\uD34E", "\uD34E"], /* Hangul Syllable */
+ ["\uD34F", "\uD34F"], /* Hangul Syllable */
+ ["\uD350", "\uD350"], /* Hangul Syllable */
+ ["\uD351", "\uD351"], /* Hangul Syllable */
+ ["\uD352", "\uD352"], /* Hangul Syllable */
+ ["\uD353", "\uD353"], /* Hangul Syllable */
+ ["\uD354", "\uD354"], /* Hangul Syllable */
+ ["\uD355", "\uD355"], /* Hangul Syllable */
+ ["\uD356", "\uD356"], /* Hangul Syllable */
+ ["\uD357", "\uD357"], /* Hangul Syllable */
+ ["\uD358", "\uD358"], /* Hangul Syllable */
+ ["\uD359", "\uD359"], /* Hangul Syllable */
+ ["\uD35A", "\uD35A"], /* Hangul Syllable */
+ ["\uD35B", "\uD35B"], /* Hangul Syllable */
+ ["\uD35C", "\uD35C"], /* Hangul Syllable */
+ ["\uD35D", "\uD35D"], /* Hangul Syllable */
+ ["\uD35E", "\uD35E"], /* Hangul Syllable */
+ ["\uD35F", "\uD35F"], /* Hangul Syllable */
+ ["\uD360", "\uD360"], /* Hangul Syllable */
+ ["\uD361", "\uD361"], /* Hangul Syllable */
+ ["\uD362", "\uD362"], /* Hangul Syllable */
+ ["\uD363", "\uD363"], /* Hangul Syllable */
+ ["\uD364", "\uD364"], /* Hangul Syllable */
+ ["\uD365", "\uD365"], /* Hangul Syllable */
+ ["\uD366", "\uD366"], /* Hangul Syllable */
+ ["\uD367", "\uD367"], /* Hangul Syllable */
+ ["\uD368", "\uD368"], /* Hangul Syllable */
+ ["\uD369", "\uD369"], /* Hangul Syllable */
+ ["\uD36A", "\uD36A"], /* Hangul Syllable */
+ ["\uD36B", "\uD36B"], /* Hangul Syllable */
+ ["\uD36C", "\uD36C"], /* Hangul Syllable */
+ ["\uD36D", "\uD36D"], /* Hangul Syllable */
+ ["\uD36E", "\uD36E"], /* Hangul Syllable */
+ ["\uD36F", "\uD36F"], /* Hangul Syllable */
+ ["\uD370", "\uD370"], /* Hangul Syllable */
+ ["\uD371", "\uD371"], /* Hangul Syllable */
+ ["\uD372", "\uD372"], /* Hangul Syllable */
+ ["\uD373", "\uD373"], /* Hangul Syllable */
+ ["\uD374", "\uD374"], /* Hangul Syllable */
+ ["\uD375", "\uD375"], /* Hangul Syllable */
+ ["\uD376", "\uD376"], /* Hangul Syllable */
+ ["\uD377", "\uD377"], /* Hangul Syllable */
+ ["\uD378", "\uD378"], /* Hangul Syllable */
+ ["\uD379", "\uD379"], /* Hangul Syllable */
+ ["\uD37A", "\uD37A"], /* Hangul Syllable */
+ ["\uD37B", "\uD37B"], /* Hangul Syllable */
+ ["\uD37C", "\uD37C"], /* Hangul Syllable */
+ ["\uD37D", "\uD37D"], /* Hangul Syllable */
+ ["\uD37E", "\uD37E"], /* Hangul Syllable */
+ ["\uD37F", "\uD37F"], /* Hangul Syllable */
+ ["\uD380", "\uD380"], /* Hangul Syllable */
+ ["\uD381", "\uD381"], /* Hangul Syllable */
+ ["\uD382", "\uD382"], /* Hangul Syllable */
+ ["\uD383", "\uD383"], /* Hangul Syllable */
+ ["\uD384", "\uD384"], /* Hangul Syllable */
+ ["\uD385", "\uD385"], /* Hangul Syllable */
+ ["\uD386", "\uD386"], /* Hangul Syllable */
+ ["\uD387", "\uD387"], /* Hangul Syllable */
+ ["\uD388", "\uD388"], /* Hangul Syllable */
+ ["\uD389", "\uD389"], /* Hangul Syllable */
+ ["\uD38A", "\uD38A"], /* Hangul Syllable */
+ ["\uD38B", "\uD38B"], /* Hangul Syllable */
+ ["\uD38C", "\uD38C"], /* Hangul Syllable */
+ ["\uD38D", "\uD38D"], /* Hangul Syllable */
+ ["\uD38E", "\uD38E"], /* Hangul Syllable */
+ ["\uD38F", "\uD38F"], /* Hangul Syllable */
+ ["\uD390", "\uD390"], /* Hangul Syllable */
+ ["\uD391", "\uD391"], /* Hangul Syllable */
+ ["\uD392", "\uD392"], /* Hangul Syllable */
+ ["\uD393", "\uD393"], /* Hangul Syllable */
+ ["\uD394", "\uD394"], /* Hangul Syllable */
+ ["\uD395", "\uD395"], /* Hangul Syllable */
+ ["\uD396", "\uD396"], /* Hangul Syllable */
+ ["\uD397", "\uD397"], /* Hangul Syllable */
+ ["\uD398", "\uD398"], /* Hangul Syllable */
+ ["\uD399", "\uD399"], /* Hangul Syllable */
+ ["\uD39A", "\uD39A"], /* Hangul Syllable */
+ ["\uD39B", "\uD39B"], /* Hangul Syllable */
+ ["\uD39C", "\uD39C"], /* Hangul Syllable */
+ ["\uD39D", "\uD39D"], /* Hangul Syllable */
+ ["\uD39E", "\uD39E"], /* Hangul Syllable */
+ ["\uD39F", "\uD39F"], /* Hangul Syllable */
+ ["\uD3A0", "\uD3A0"], /* Hangul Syllable */
+ ["\uD3A1", "\uD3A1"], /* Hangul Syllable */
+ ["\uD3A2", "\uD3A2"], /* Hangul Syllable */
+ ["\uD3A3", "\uD3A3"], /* Hangul Syllable */
+ ["\uD3A4", "\uD3A4"], /* Hangul Syllable */
+ ["\uD3A5", "\uD3A5"], /* Hangul Syllable */
+ ["\uD3A6", "\uD3A6"], /* Hangul Syllable */
+ ["\uD3A7", "\uD3A7"], /* Hangul Syllable */
+ ["\uD3A8", "\uD3A8"], /* Hangul Syllable */
+ ["\uD3A9", "\uD3A9"], /* Hangul Syllable */
+ ["\uD3AA", "\uD3AA"], /* Hangul Syllable */
+ ["\uD3AB", "\uD3AB"], /* Hangul Syllable */
+ ["\uD3AC", "\uD3AC"], /* Hangul Syllable */
+ ["\uD3AD", "\uD3AD"], /* Hangul Syllable */
+ ["\uD3AE", "\uD3AE"], /* Hangul Syllable */
+ ["\uD3AF", "\uD3AF"], /* Hangul Syllable */
+ ["\uD3B0", "\uD3B0"], /* Hangul Syllable */
+ ["\uD3B1", "\uD3B1"], /* Hangul Syllable */
+ ["\uD3B2", "\uD3B2"], /* Hangul Syllable */
+ ["\uD3B3", "\uD3B3"], /* Hangul Syllable */
+ ["\uD3B4", "\uD3B4"], /* Hangul Syllable */
+ ["\uD3B5", "\uD3B5"], /* Hangul Syllable */
+ ["\uD3B6", "\uD3B6"], /* Hangul Syllable */
+ ["\uD3B7", "\uD3B7"], /* Hangul Syllable */
+ ["\uD3B8", "\uD3B8"], /* Hangul Syllable */
+ ["\uD3B9", "\uD3B9"], /* Hangul Syllable */
+ ["\uD3BA", "\uD3BA"], /* Hangul Syllable */
+ ["\uD3BB", "\uD3BB"], /* Hangul Syllable */
+ ["\uD3BC", "\uD3BC"], /* Hangul Syllable */
+ ["\uD3BD", "\uD3BD"], /* Hangul Syllable */
+ ["\uD3BE", "\uD3BE"], /* Hangul Syllable */
+ ["\uD3BF", "\uD3BF"], /* Hangul Syllable */
+ ["\uD3C0", "\uD3C0"], /* Hangul Syllable */
+ ["\uD3C1", "\uD3C1"], /* Hangul Syllable */
+ ["\uD3C2", "\uD3C2"], /* Hangul Syllable */
+ ["\uD3C3", "\uD3C3"], /* Hangul Syllable */
+ ["\uD3C4", "\uD3C4"], /* Hangul Syllable */
+ ["\uD3C5", "\uD3C5"], /* Hangul Syllable */
+ ["\uD3C6", "\uD3C6"], /* Hangul Syllable */
+ ["\uD3C7", "\uD3C7"], /* Hangul Syllable */
+ ["\uD3C8", "\uD3C8"], /* Hangul Syllable */
+ ["\uD3C9", "\uD3C9"], /* Hangul Syllable */
+ ["\uD3CA", "\uD3CA"], /* Hangul Syllable */
+ ["\uD3CB", "\uD3CB"], /* Hangul Syllable */
+ ["\uD3CC", "\uD3CC"], /* Hangul Syllable */
+ ["\uD3CD", "\uD3CD"], /* Hangul Syllable */
+ ["\uD3CE", "\uD3CE"], /* Hangul Syllable */
+ ["\uD3CF", "\uD3CF"], /* Hangul Syllable */
+ ["\uD3D0", "\uD3D0"], /* Hangul Syllable */
+ ["\uD3D1", "\uD3D1"], /* Hangul Syllable */
+ ["\uD3D2", "\uD3D2"], /* Hangul Syllable */
+ ["\uD3D3", "\uD3D3"], /* Hangul Syllable */
+ ["\uD3D4", "\uD3D4"], /* Hangul Syllable */
+ ["\uD3D5", "\uD3D5"], /* Hangul Syllable */
+ ["\uD3D6", "\uD3D6"], /* Hangul Syllable */
+ ["\uD3D7", "\uD3D7"], /* Hangul Syllable */
+ ["\uD3D8", "\uD3D8"], /* Hangul Syllable */
+ ["\uD3D9", "\uD3D9"], /* Hangul Syllable */
+ ["\uD3DA", "\uD3DA"], /* Hangul Syllable */
+ ["\uD3DB", "\uD3DB"], /* Hangul Syllable */
+ ["\uD3DC", "\uD3DC"], /* Hangul Syllable */
+ ["\uD3DD", "\uD3DD"], /* Hangul Syllable */
+ ["\uD3DE", "\uD3DE"], /* Hangul Syllable */
+ ["\uD3DF", "\uD3DF"], /* Hangul Syllable */
+ ["\uD3E0", "\uD3E0"], /* Hangul Syllable */
+ ["\uD3E1", "\uD3E1"], /* Hangul Syllable */
+ ["\uD3E2", "\uD3E2"], /* Hangul Syllable */
+ ["\uD3E3", "\uD3E3"], /* Hangul Syllable */
+ ["\uD3E4", "\uD3E4"], /* Hangul Syllable */
+ ["\uD3E5", "\uD3E5"], /* Hangul Syllable */
+ ["\uD3E6", "\uD3E6"], /* Hangul Syllable */
+ ["\uD3E7", "\uD3E7"], /* Hangul Syllable */
+ ["\uD3E8", "\uD3E8"], /* Hangul Syllable */
+ ["\uD3E9", "\uD3E9"], /* Hangul Syllable */
+ ["\uD3EA", "\uD3EA"], /* Hangul Syllable */
+ ["\uD3EB", "\uD3EB"], /* Hangul Syllable */
+ ["\uD3EC", "\uD3EC"], /* Hangul Syllable */
+ ["\uD3ED", "\uD3ED"], /* Hangul Syllable */
+ ["\uD3EE", "\uD3EE"], /* Hangul Syllable */
+ ["\uD3EF", "\uD3EF"], /* Hangul Syllable */
+ ["\uD3F0", "\uD3F0"], /* Hangul Syllable */
+ ["\uD3F1", "\uD3F1"], /* Hangul Syllable */
+ ["\uD3F2", "\uD3F2"], /* Hangul Syllable */
+ ["\uD3F3", "\uD3F3"], /* Hangul Syllable */
+ ["\uD3F4", "\uD3F4"], /* Hangul Syllable */
+ ["\uD3F5", "\uD3F5"], /* Hangul Syllable */
+ ["\uD3F6", "\uD3F6"], /* Hangul Syllable */
+ ["\uD3F7", "\uD3F7"], /* Hangul Syllable */
+ ["\uD3F8", "\uD3F8"], /* Hangul Syllable */
+ ["\uD3F9", "\uD3F9"], /* Hangul Syllable */
+ ["\uD3FA", "\uD3FA"], /* Hangul Syllable */
+ ["\uD3FB", "\uD3FB"], /* Hangul Syllable */
+ ["\uD3FC", "\uD3FC"], /* Hangul Syllable */
+ ["\uD3FD", "\uD3FD"], /* Hangul Syllable */
+ ["\uD3FE", "\uD3FE"], /* Hangul Syllable */
+ ["\uD3FF", "\uD3FF"], /* Hangul Syllable */
+ ["\uD400", "\uD400"], /* Hangul Syllable */
+ ["\uD401", "\uD401"], /* Hangul Syllable */
+ ["\uD402", "\uD402"], /* Hangul Syllable */
+ ["\uD403", "\uD403"], /* Hangul Syllable */
+ ["\uD404", "\uD404"], /* Hangul Syllable */
+ ["\uD405", "\uD405"], /* Hangul Syllable */
+ ["\uD406", "\uD406"], /* Hangul Syllable */
+ ["\uD407", "\uD407"], /* Hangul Syllable */
+ ["\uD408", "\uD408"], /* Hangul Syllable */
+ ["\uD409", "\uD409"], /* Hangul Syllable */
+ ["\uD40A", "\uD40A"], /* Hangul Syllable */
+ ["\uD40B", "\uD40B"], /* Hangul Syllable */
+ ["\uD40C", "\uD40C"], /* Hangul Syllable */
+ ["\uD40D", "\uD40D"], /* Hangul Syllable */
+ ["\uD40E", "\uD40E"], /* Hangul Syllable */
+ ["\uD40F", "\uD40F"], /* Hangul Syllable */
+ ["\uD410", "\uD410"], /* Hangul Syllable */
+ ["\uD411", "\uD411"], /* Hangul Syllable */
+ ["\uD412", "\uD412"], /* Hangul Syllable */
+ ["\uD413", "\uD413"], /* Hangul Syllable */
+ ["\uD414", "\uD414"], /* Hangul Syllable */
+ ["\uD415", "\uD415"], /* Hangul Syllable */
+ ["\uD416", "\uD416"], /* Hangul Syllable */
+ ["\uD417", "\uD417"], /* Hangul Syllable */
+ ["\uD418", "\uD418"], /* Hangul Syllable */
+ ["\uD419", "\uD419"], /* Hangul Syllable */
+ ["\uD41A", "\uD41A"], /* Hangul Syllable */
+ ["\uD41B", "\uD41B"], /* Hangul Syllable */
+ ["\uD41C", "\uD41C"], /* Hangul Syllable */
+ ["\uD41D", "\uD41D"], /* Hangul Syllable */
+ ["\uD41E", "\uD41E"], /* Hangul Syllable */
+ ["\uD41F", "\uD41F"], /* Hangul Syllable */
+ ["\uD420", "\uD420"], /* Hangul Syllable */
+ ["\uD421", "\uD421"], /* Hangul Syllable */
+ ["\uD422", "\uD422"], /* Hangul Syllable */
+ ["\uD423", "\uD423"], /* Hangul Syllable */
+ ["\uD424", "\uD424"], /* Hangul Syllable */
+ ["\uD425", "\uD425"], /* Hangul Syllable */
+ ["\uD426", "\uD426"], /* Hangul Syllable */
+ ["\uD427", "\uD427"], /* Hangul Syllable */
+ ["\uD428", "\uD428"], /* Hangul Syllable */
+ ["\uD429", "\uD429"], /* Hangul Syllable */
+ ["\uD42A", "\uD42A"], /* Hangul Syllable */
+ ["\uD42B", "\uD42B"], /* Hangul Syllable */
+ ["\uD42C", "\uD42C"], /* Hangul Syllable */
+ ["\uD42D", "\uD42D"], /* Hangul Syllable */
+ ["\uD42E", "\uD42E"], /* Hangul Syllable */
+ ["\uD42F", "\uD42F"], /* Hangul Syllable */
+ ["\uD430", "\uD430"], /* Hangul Syllable */
+ ["\uD431", "\uD431"], /* Hangul Syllable */
+ ["\uD432", "\uD432"], /* Hangul Syllable */
+ ["\uD433", "\uD433"], /* Hangul Syllable */
+ ["\uD434", "\uD434"], /* Hangul Syllable */
+ ["\uD435", "\uD435"], /* Hangul Syllable */
+ ["\uD436", "\uD436"], /* Hangul Syllable */
+ ["\uD437", "\uD437"], /* Hangul Syllable */
+ ["\uD438", "\uD438"], /* Hangul Syllable */
+ ["\uD439", "\uD439"], /* Hangul Syllable */
+ ["\uD43A", "\uD43A"], /* Hangul Syllable */
+ ["\uD43B", "\uD43B"], /* Hangul Syllable */
+ ["\uD43C", "\uD43C"], /* Hangul Syllable */
+ ["\uD43D", "\uD43D"], /* Hangul Syllable */
+ ["\uD43E", "\uD43E"], /* Hangul Syllable */
+ ["\uD43F", "\uD43F"], /* Hangul Syllable */
+ ["\uD440", "\uD440"], /* Hangul Syllable */
+ ["\uD441", "\uD441"], /* Hangul Syllable */
+ ["\uD442", "\uD442"], /* Hangul Syllable */
+ ["\uD443", "\uD443"], /* Hangul Syllable */
+ ["\uD444", "\uD444"], /* Hangul Syllable */
+ ["\uD445", "\uD445"], /* Hangul Syllable */
+ ["\uD446", "\uD446"], /* Hangul Syllable */
+ ["\uD447", "\uD447"], /* Hangul Syllable */
+ ["\uD448", "\uD448"], /* Hangul Syllable */
+ ["\uD449", "\uD449"], /* Hangul Syllable */
+ ["\uD44A", "\uD44A"], /* Hangul Syllable */
+ ["\uD44B", "\uD44B"], /* Hangul Syllable */
+ ["\uD44C", "\uD44C"], /* Hangul Syllable */
+ ["\uD44D", "\uD44D"], /* Hangul Syllable */
+ ["\uD44E", "\uD44E"], /* Hangul Syllable */
+ ["\uD44F", "\uD44F"], /* Hangul Syllable */
+ ["\uD450", "\uD450"], /* Hangul Syllable */
+ ["\uD451", "\uD451"], /* Hangul Syllable */
+ ["\uD452", "\uD452"], /* Hangul Syllable */
+ ["\uD453", "\uD453"], /* Hangul Syllable */
+ ["\uD454", "\uD454"], /* Hangul Syllable */
+ ["\uD455", "\uD455"], /* Hangul Syllable */
+ ["\uD456", "\uD456"], /* Hangul Syllable */
+ ["\uD457", "\uD457"], /* Hangul Syllable */
+ ["\uD458", "\uD458"], /* Hangul Syllable */
+ ["\uD459", "\uD459"], /* Hangul Syllable */
+ ["\uD45A", "\uD45A"], /* Hangul Syllable */
+ ["\uD45B", "\uD45B"], /* Hangul Syllable */
+ ["\uD45C", "\uD45C"], /* Hangul Syllable */
+ ["\uD45D", "\uD45D"], /* Hangul Syllable */
+ ["\uD45E", "\uD45E"], /* Hangul Syllable */
+ ["\uD45F", "\uD45F"], /* Hangul Syllable */
+ ["\uD460", "\uD460"], /* Hangul Syllable */
+ ["\uD461", "\uD461"], /* Hangul Syllable */
+ ["\uD462", "\uD462"], /* Hangul Syllable */
+ ["\uD463", "\uD463"], /* Hangul Syllable */
+ ["\uD464", "\uD464"], /* Hangul Syllable */
+ ["\uD465", "\uD465"], /* Hangul Syllable */
+ ["\uD466", "\uD466"], /* Hangul Syllable */
+ ["\uD467", "\uD467"], /* Hangul Syllable */
+ ["\uD468", "\uD468"], /* Hangul Syllable */
+ ["\uD469", "\uD469"], /* Hangul Syllable */
+ ["\uD46A", "\uD46A"], /* Hangul Syllable */
+ ["\uD46B", "\uD46B"], /* Hangul Syllable */
+ ["\uD46C", "\uD46C"], /* Hangul Syllable */
+ ["\uD46D", "\uD46D"], /* Hangul Syllable */
+ ["\uD46E", "\uD46E"], /* Hangul Syllable */
+ ["\uD46F", "\uD46F"], /* Hangul Syllable */
+ ["\uD470", "\uD470"], /* Hangul Syllable */
+ ["\uD471", "\uD471"], /* Hangul Syllable */
+ ["\uD472", "\uD472"], /* Hangul Syllable */
+ ["\uD473", "\uD473"], /* Hangul Syllable */
+ ["\uD474", "\uD474"], /* Hangul Syllable */
+ ["\uD475", "\uD475"], /* Hangul Syllable */
+ ["\uD476", "\uD476"], /* Hangul Syllable */
+ ["\uD477", "\uD477"], /* Hangul Syllable */
+ ["\uD478", "\uD478"], /* Hangul Syllable */
+ ["\uD479", "\uD479"], /* Hangul Syllable */
+ ["\uD47A", "\uD47A"], /* Hangul Syllable */
+ ["\uD47B", "\uD47B"], /* Hangul Syllable */
+ ["\uD47C", "\uD47C"], /* Hangul Syllable */
+ ["\uD47D", "\uD47D"], /* Hangul Syllable */
+ ["\uD47E", "\uD47E"], /* Hangul Syllable */
+ ["\uD47F", "\uD47F"], /* Hangul Syllable */
+ ["\uD480", "\uD480"], /* Hangul Syllable */
+ ["\uD481", "\uD481"], /* Hangul Syllable */
+ ["\uD482", "\uD482"], /* Hangul Syllable */
+ ["\uD483", "\uD483"], /* Hangul Syllable */
+ ["\uD484", "\uD484"], /* Hangul Syllable */
+ ["\uD485", "\uD485"], /* Hangul Syllable */
+ ["\uD486", "\uD486"], /* Hangul Syllable */
+ ["\uD487", "\uD487"], /* Hangul Syllable */
+ ["\uD488", "\uD488"], /* Hangul Syllable */
+ ["\uD489", "\uD489"], /* Hangul Syllable */
+ ["\uD48A", "\uD48A"], /* Hangul Syllable */
+ ["\uD48B", "\uD48B"], /* Hangul Syllable */
+ ["\uD48C", "\uD48C"], /* Hangul Syllable */
+ ["\uD48D", "\uD48D"], /* Hangul Syllable */
+ ["\uD48E", "\uD48E"], /* Hangul Syllable */
+ ["\uD48F", "\uD48F"], /* Hangul Syllable */
+ ["\uD490", "\uD490"], /* Hangul Syllable */
+ ["\uD491", "\uD491"], /* Hangul Syllable */
+ ["\uD492", "\uD492"], /* Hangul Syllable */
+ ["\uD493", "\uD493"], /* Hangul Syllable */
+ ["\uD494", "\uD494"], /* Hangul Syllable */
+ ["\uD495", "\uD495"], /* Hangul Syllable */
+ ["\uD496", "\uD496"], /* Hangul Syllable */
+ ["\uD497", "\uD497"], /* Hangul Syllable */
+ ["\uD498", "\uD498"], /* Hangul Syllable */
+ ["\uD499", "\uD499"], /* Hangul Syllable */
+ ["\uD49A", "\uD49A"], /* Hangul Syllable */
+ ["\uD49B", "\uD49B"], /* Hangul Syllable */
+ ["\uD49C", "\uD49C"], /* Hangul Syllable */
+ ["\uD49D", "\uD49D"], /* Hangul Syllable */
+ ["\uD49E", "\uD49E"], /* Hangul Syllable */
+ ["\uD49F", "\uD49F"], /* Hangul Syllable */
+ ["\uD4A0", "\uD4A0"], /* Hangul Syllable */
+ ["\uD4A1", "\uD4A1"], /* Hangul Syllable */
+ ["\uD4A2", "\uD4A2"], /* Hangul Syllable */
+ ["\uD4A3", "\uD4A3"], /* Hangul Syllable */
+ ["\uD4A4", "\uD4A4"], /* Hangul Syllable */
+ ["\uD4A5", "\uD4A5"], /* Hangul Syllable */
+ ["\uD4A6", "\uD4A6"], /* Hangul Syllable */
+ ["\uD4A7", "\uD4A7"], /* Hangul Syllable */
+ ["\uD4A8", "\uD4A8"], /* Hangul Syllable */
+ ["\uD4A9", "\uD4A9"], /* Hangul Syllable */
+ ["\uD4AA", "\uD4AA"], /* Hangul Syllable */
+ ["\uD4AB", "\uD4AB"], /* Hangul Syllable */
+ ["\uD4AC", "\uD4AC"], /* Hangul Syllable */
+ ["\uD4AD", "\uD4AD"], /* Hangul Syllable */
+ ["\uD4AE", "\uD4AE"], /* Hangul Syllable */
+ ["\uD4AF", "\uD4AF"], /* Hangul Syllable */
+ ["\uD4B0", "\uD4B0"], /* Hangul Syllable */
+ ["\uD4B1", "\uD4B1"], /* Hangul Syllable */
+ ["\uD4B2", "\uD4B2"], /* Hangul Syllable */
+ ["\uD4B3", "\uD4B3"], /* Hangul Syllable */
+ ["\uD4B4", "\uD4B4"], /* Hangul Syllable */
+ ["\uD4B5", "\uD4B5"], /* Hangul Syllable */
+ ["\uD4B6", "\uD4B6"], /* Hangul Syllable */
+ ["\uD4B7", "\uD4B7"], /* Hangul Syllable */
+ ["\uD4B8", "\uD4B8"], /* Hangul Syllable */
+ ["\uD4B9", "\uD4B9"], /* Hangul Syllable */
+ ["\uD4BA", "\uD4BA"], /* Hangul Syllable */
+ ["\uD4BB", "\uD4BB"], /* Hangul Syllable */
+ ["\uD4BC", "\uD4BC"], /* Hangul Syllable */
+ ["\uD4BD", "\uD4BD"], /* Hangul Syllable */
+ ["\uD4BE", "\uD4BE"], /* Hangul Syllable */
+ ["\uD4BF", "\uD4BF"], /* Hangul Syllable */
+ ["\uD4C0", "\uD4C0"], /* Hangul Syllable */
+ ["\uD4C1", "\uD4C1"], /* Hangul Syllable */
+ ["\uD4C2", "\uD4C2"], /* Hangul Syllable */
+ ["\uD4C3", "\uD4C3"], /* Hangul Syllable */
+ ["\uD4C4", "\uD4C4"], /* Hangul Syllable */
+ ["\uD4C5", "\uD4C5"], /* Hangul Syllable */
+ ["\uD4C6", "\uD4C6"], /* Hangul Syllable */
+ ["\uD4C7", "\uD4C7"], /* Hangul Syllable */
+ ["\uD4C8", "\uD4C8"], /* Hangul Syllable */
+ ["\uD4C9", "\uD4C9"], /* Hangul Syllable */
+ ["\uD4CA", "\uD4CA"], /* Hangul Syllable */
+ ["\uD4CB", "\uD4CB"], /* Hangul Syllable */
+ ["\uD4CC", "\uD4CC"], /* Hangul Syllable */
+ ["\uD4CD", "\uD4CD"], /* Hangul Syllable */
+ ["\uD4CE", "\uD4CE"], /* Hangul Syllable */
+ ["\uD4CF", "\uD4CF"], /* Hangul Syllable */
+ ["\uD4D0", "\uD4D0"], /* Hangul Syllable */
+ ["\uD4D1", "\uD4D1"], /* Hangul Syllable */
+ ["\uD4D2", "\uD4D2"], /* Hangul Syllable */
+ ["\uD4D3", "\uD4D3"], /* Hangul Syllable */
+ ["\uD4D4", "\uD4D4"], /* Hangul Syllable */
+ ["\uD4D5", "\uD4D5"], /* Hangul Syllable */
+ ["\uD4D6", "\uD4D6"], /* Hangul Syllable */
+ ["\uD4D7", "\uD4D7"], /* Hangul Syllable */
+ ["\uD4D8", "\uD4D8"], /* Hangul Syllable */
+ ["\uD4D9", "\uD4D9"], /* Hangul Syllable */
+ ["\uD4DA", "\uD4DA"], /* Hangul Syllable */
+ ["\uD4DB", "\uD4DB"], /* Hangul Syllable */
+ ["\uD4DC", "\uD4DC"], /* Hangul Syllable */
+ ["\uD4DD", "\uD4DD"], /* Hangul Syllable */
+ ["\uD4DE", "\uD4DE"], /* Hangul Syllable */
+ ["\uD4DF", "\uD4DF"], /* Hangul Syllable */
+ ["\uD4E0", "\uD4E0"], /* Hangul Syllable */
+ ["\uD4E1", "\uD4E1"], /* Hangul Syllable */
+ ["\uD4E2", "\uD4E2"], /* Hangul Syllable */
+ ["\uD4E3", "\uD4E3"], /* Hangul Syllable */
+ ["\uD4E4", "\uD4E4"], /* Hangul Syllable */
+ ["\uD4E5", "\uD4E5"], /* Hangul Syllable */
+ ["\uD4E6", "\uD4E6"], /* Hangul Syllable */
+ ["\uD4E7", "\uD4E7"], /* Hangul Syllable */
+ ["\uD4E8", "\uD4E8"], /* Hangul Syllable */
+ ["\uD4E9", "\uD4E9"], /* Hangul Syllable */
+ ["\uD4EA", "\uD4EA"], /* Hangul Syllable */
+ ["\uD4EB", "\uD4EB"], /* Hangul Syllable */
+ ["\uD4EC", "\uD4EC"], /* Hangul Syllable */
+ ["\uD4ED", "\uD4ED"], /* Hangul Syllable */
+ ["\uD4EE", "\uD4EE"], /* Hangul Syllable */
+ ["\uD4EF", "\uD4EF"], /* Hangul Syllable */
+ ["\uD4F0", "\uD4F0"], /* Hangul Syllable */
+ ["\uD4F1", "\uD4F1"], /* Hangul Syllable */
+ ["\uD4F2", "\uD4F2"], /* Hangul Syllable */
+ ["\uD4F3", "\uD4F3"], /* Hangul Syllable */
+ ["\uD4F4", "\uD4F4"], /* Hangul Syllable */
+ ["\uD4F5", "\uD4F5"], /* Hangul Syllable */
+ ["\uD4F6", "\uD4F6"], /* Hangul Syllable */
+ ["\uD4F7", "\uD4F7"], /* Hangul Syllable */
+ ["\uD4F8", "\uD4F8"], /* Hangul Syllable */
+ ["\uD4F9", "\uD4F9"], /* Hangul Syllable */
+ ["\uD4FA", "\uD4FA"], /* Hangul Syllable */
+ ["\uD4FB", "\uD4FB"], /* Hangul Syllable */
+ ["\uD4FC", "\uD4FC"], /* Hangul Syllable */
+ ["\uD4FD", "\uD4FD"], /* Hangul Syllable */
+ ["\uD4FE", "\uD4FE"], /* Hangul Syllable */
+ ["\uD4FF", "\uD4FF"], /* Hangul Syllable */
+ ["\uD500", "\uD500"], /* Hangul Syllable */
+ ["\uD501", "\uD501"], /* Hangul Syllable */
+ ["\uD502", "\uD502"], /* Hangul Syllable */
+ ["\uD503", "\uD503"], /* Hangul Syllable */
+ ["\uD504", "\uD504"], /* Hangul Syllable */
+ ["\uD505", "\uD505"], /* Hangul Syllable */
+ ["\uD506", "\uD506"], /* Hangul Syllable */
+ ["\uD507", "\uD507"], /* Hangul Syllable */
+ ["\uD508", "\uD508"], /* Hangul Syllable */
+ ["\uD509", "\uD509"], /* Hangul Syllable */
+ ["\uD50A", "\uD50A"], /* Hangul Syllable */
+ ["\uD50B", "\uD50B"], /* Hangul Syllable */
+ ["\uD50C", "\uD50C"], /* Hangul Syllable */
+ ["\uD50D", "\uD50D"], /* Hangul Syllable */
+ ["\uD50E", "\uD50E"], /* Hangul Syllable */
+ ["\uD50F", "\uD50F"], /* Hangul Syllable */
+ ["\uD510", "\uD510"], /* Hangul Syllable */
+ ["\uD511", "\uD511"], /* Hangul Syllable */
+ ["\uD512", "\uD512"], /* Hangul Syllable */
+ ["\uD513", "\uD513"], /* Hangul Syllable */
+ ["\uD514", "\uD514"], /* Hangul Syllable */
+ ["\uD515", "\uD515"], /* Hangul Syllable */
+ ["\uD516", "\uD516"], /* Hangul Syllable */
+ ["\uD517", "\uD517"], /* Hangul Syllable */
+ ["\uD518", "\uD518"], /* Hangul Syllable */
+ ["\uD519", "\uD519"], /* Hangul Syllable */
+ ["\uD51A", "\uD51A"], /* Hangul Syllable */
+ ["\uD51B", "\uD51B"], /* Hangul Syllable */
+ ["\uD51C", "\uD51C"], /* Hangul Syllable */
+ ["\uD51D", "\uD51D"], /* Hangul Syllable */
+ ["\uD51E", "\uD51E"], /* Hangul Syllable */
+ ["\uD51F", "\uD51F"], /* Hangul Syllable */
+ ["\uD520", "\uD520"], /* Hangul Syllable */
+ ["\uD521", "\uD521"], /* Hangul Syllable */
+ ["\uD522", "\uD522"], /* Hangul Syllable */
+ ["\uD523", "\uD523"], /* Hangul Syllable */
+ ["\uD524", "\uD524"], /* Hangul Syllable */
+ ["\uD525", "\uD525"], /* Hangul Syllable */
+ ["\uD526", "\uD526"], /* Hangul Syllable */
+ ["\uD527", "\uD527"], /* Hangul Syllable */
+ ["\uD528", "\uD528"], /* Hangul Syllable */
+ ["\uD529", "\uD529"], /* Hangul Syllable */
+ ["\uD52A", "\uD52A"], /* Hangul Syllable */
+ ["\uD52B", "\uD52B"], /* Hangul Syllable */
+ ["\uD52C", "\uD52C"], /* Hangul Syllable */
+ ["\uD52D", "\uD52D"], /* Hangul Syllable */
+ ["\uD52E", "\uD52E"], /* Hangul Syllable */
+ ["\uD52F", "\uD52F"], /* Hangul Syllable */
+ ["\uD530", "\uD530"], /* Hangul Syllable */
+ ["\uD531", "\uD531"], /* Hangul Syllable */
+ ["\uD532", "\uD532"], /* Hangul Syllable */
+ ["\uD533", "\uD533"], /* Hangul Syllable */
+ ["\uD534", "\uD534"], /* Hangul Syllable */
+ ["\uD535", "\uD535"], /* Hangul Syllable */
+ ["\uD536", "\uD536"], /* Hangul Syllable */
+ ["\uD537", "\uD537"], /* Hangul Syllable */
+ ["\uD538", "\uD538"], /* Hangul Syllable */
+ ["\uD539", "\uD539"], /* Hangul Syllable */
+ ["\uD53A", "\uD53A"], /* Hangul Syllable */
+ ["\uD53B", "\uD53B"], /* Hangul Syllable */
+ ["\uD53C", "\uD53C"], /* Hangul Syllable */
+ ["\uD53D", "\uD53D"], /* Hangul Syllable */
+ ["\uD53E", "\uD53E"], /* Hangul Syllable */
+ ["\uD53F", "\uD53F"], /* Hangul Syllable */
+ ["\uD540", "\uD540"], /* Hangul Syllable */
+ ["\uD541", "\uD541"], /* Hangul Syllable */
+ ["\uD542", "\uD542"], /* Hangul Syllable */
+ ["\uD543", "\uD543"], /* Hangul Syllable */
+ ["\uD544", "\uD544"], /* Hangul Syllable */
+ ["\uD545", "\uD545"], /* Hangul Syllable */
+ ["\uD546", "\uD546"], /* Hangul Syllable */
+ ["\uD547", "\uD547"], /* Hangul Syllable */
+ ["\uD548", "\uD548"], /* Hangul Syllable */
+ ["\uD549", "\uD549"], /* Hangul Syllable */
+ ["\uD54A", "\uD54A"], /* Hangul Syllable */
+ ["\uD54B", "\uD54B"], /* Hangul Syllable */
+ ["\uD54C", "\uD54C"], /* Hangul Syllable */
+ ["\uD54D", "\uD54D"], /* Hangul Syllable */
+ ["\uD54E", "\uD54E"], /* Hangul Syllable */
+ ["\uD54F", "\uD54F"], /* Hangul Syllable */
+ ["\uD550", "\uD550"], /* Hangul Syllable */
+ ["\uD551", "\uD551"], /* Hangul Syllable */
+ ["\uD552", "\uD552"], /* Hangul Syllable */
+ ["\uD553", "\uD553"], /* Hangul Syllable */
+ ["\uD554", "\uD554"], /* Hangul Syllable */
+ ["\uD555", "\uD555"], /* Hangul Syllable */
+ ["\uD556", "\uD556"], /* Hangul Syllable */
+ ["\uD557", "\uD557"], /* Hangul Syllable */
+ ["\uD558", "\uD558"], /* Hangul Syllable */
+ ["\uD559", "\uD559"], /* Hangul Syllable */
+ ["\uD55A", "\uD55A"], /* Hangul Syllable */
+ ["\uD55B", "\uD55B"], /* Hangul Syllable */
+ ["\uD55C", "\uD55C"], /* Hangul Syllable */
+ ["\uD55D", "\uD55D"], /* Hangul Syllable */
+ ["\uD55E", "\uD55E"], /* Hangul Syllable */
+ ["\uD55F", "\uD55F"], /* Hangul Syllable */
+ ["\uD560", "\uD560"], /* Hangul Syllable */
+ ["\uD561", "\uD561"], /* Hangul Syllable */
+ ["\uD562", "\uD562"], /* Hangul Syllable */
+ ["\uD563", "\uD563"], /* Hangul Syllable */
+ ["\uD564", "\uD564"], /* Hangul Syllable */
+ ["\uD565", "\uD565"], /* Hangul Syllable */
+ ["\uD566", "\uD566"], /* Hangul Syllable */
+ ["\uD567", "\uD567"], /* Hangul Syllable */
+ ["\uD568", "\uD568"], /* Hangul Syllable */
+ ["\uD569", "\uD569"], /* Hangul Syllable */
+ ["\uD56A", "\uD56A"], /* Hangul Syllable */
+ ["\uD56B", "\uD56B"], /* Hangul Syllable */
+ ["\uD56C", "\uD56C"], /* Hangul Syllable */
+ ["\uD56D", "\uD56D"], /* Hangul Syllable */
+ ["\uD56E", "\uD56E"], /* Hangul Syllable */
+ ["\uD56F", "\uD56F"], /* Hangul Syllable */
+ ["\uD570", "\uD570"], /* Hangul Syllable */
+ ["\uD571", "\uD571"], /* Hangul Syllable */
+ ["\uD572", "\uD572"], /* Hangul Syllable */
+ ["\uD573", "\uD573"], /* Hangul Syllable */
+ ["\uD574", "\uD574"], /* Hangul Syllable */
+ ["\uD575", "\uD575"], /* Hangul Syllable */
+ ["\uD576", "\uD576"], /* Hangul Syllable */
+ ["\uD577", "\uD577"], /* Hangul Syllable */
+ ["\uD578", "\uD578"], /* Hangul Syllable */
+ ["\uD579", "\uD579"], /* Hangul Syllable */
+ ["\uD57A", "\uD57A"], /* Hangul Syllable */
+ ["\uD57B", "\uD57B"], /* Hangul Syllable */
+ ["\uD57C", "\uD57C"], /* Hangul Syllable */
+ ["\uD57D", "\uD57D"], /* Hangul Syllable */
+ ["\uD57E", "\uD57E"], /* Hangul Syllable */
+ ["\uD57F", "\uD57F"], /* Hangul Syllable */
+ ["\uD580", "\uD580"], /* Hangul Syllable */
+ ["\uD581", "\uD581"], /* Hangul Syllable */
+ ["\uD582", "\uD582"], /* Hangul Syllable */
+ ["\uD583", "\uD583"], /* Hangul Syllable */
+ ["\uD584", "\uD584"], /* Hangul Syllable */
+ ["\uD585", "\uD585"], /* Hangul Syllable */
+ ["\uD586", "\uD586"], /* Hangul Syllable */
+ ["\uD587", "\uD587"], /* Hangul Syllable */
+ ["\uD588", "\uD588"], /* Hangul Syllable */
+ ["\uD589", "\uD589"], /* Hangul Syllable */
+ ["\uD58A", "\uD58A"], /* Hangul Syllable */
+ ["\uD58B", "\uD58B"], /* Hangul Syllable */
+ ["\uD58C", "\uD58C"], /* Hangul Syllable */
+ ["\uD58D", "\uD58D"], /* Hangul Syllable */
+ ["\uD58E", "\uD58E"], /* Hangul Syllable */
+ ["\uD58F", "\uD58F"], /* Hangul Syllable */
+ ["\uD590", "\uD590"], /* Hangul Syllable */
+ ["\uD591", "\uD591"], /* Hangul Syllable */
+ ["\uD592", "\uD592"], /* Hangul Syllable */
+ ["\uD593", "\uD593"], /* Hangul Syllable */
+ ["\uD594", "\uD594"], /* Hangul Syllable */
+ ["\uD595", "\uD595"], /* Hangul Syllable */
+ ["\uD596", "\uD596"], /* Hangul Syllable */
+ ["\uD597", "\uD597"], /* Hangul Syllable */
+ ["\uD598", "\uD598"], /* Hangul Syllable */
+ ["\uD599", "\uD599"], /* Hangul Syllable */
+ ["\uD59A", "\uD59A"], /* Hangul Syllable */
+ ["\uD59B", "\uD59B"], /* Hangul Syllable */
+ ["\uD59C", "\uD59C"], /* Hangul Syllable */
+ ["\uD59D", "\uD59D"], /* Hangul Syllable */
+ ["\uD59E", "\uD59E"], /* Hangul Syllable */
+ ["\uD59F", "\uD59F"], /* Hangul Syllable */
+ ["\uD5A0", "\uD5A0"], /* Hangul Syllable */
+ ["\uD5A1", "\uD5A1"], /* Hangul Syllable */
+ ["\uD5A2", "\uD5A2"], /* Hangul Syllable */
+ ["\uD5A3", "\uD5A3"], /* Hangul Syllable */
+ ["\uD5A4", "\uD5A4"], /* Hangul Syllable */
+ ["\uD5A5", "\uD5A5"], /* Hangul Syllable */
+ ["\uD5A6", "\uD5A6"], /* Hangul Syllable */
+ ["\uD5A7", "\uD5A7"], /* Hangul Syllable */
+ ["\uD5A8", "\uD5A8"], /* Hangul Syllable */
+ ["\uD5A9", "\uD5A9"], /* Hangul Syllable */
+ ["\uD5AA", "\uD5AA"], /* Hangul Syllable */
+ ["\uD5AB", "\uD5AB"], /* Hangul Syllable */
+ ["\uD5AC", "\uD5AC"], /* Hangul Syllable */
+ ["\uD5AD", "\uD5AD"], /* Hangul Syllable */
+ ["\uD5AE", "\uD5AE"], /* Hangul Syllable */
+ ["\uD5AF", "\uD5AF"], /* Hangul Syllable */
+ ["\uD5B0", "\uD5B0"], /* Hangul Syllable */
+ ["\uD5B1", "\uD5B1"], /* Hangul Syllable */
+ ["\uD5B2", "\uD5B2"], /* Hangul Syllable */
+ ["\uD5B3", "\uD5B3"], /* Hangul Syllable */
+ ["\uD5B4", "\uD5B4"], /* Hangul Syllable */
+ ["\uD5B5", "\uD5B5"], /* Hangul Syllable */
+ ["\uD5B6", "\uD5B6"], /* Hangul Syllable */
+ ["\uD5B7", "\uD5B7"], /* Hangul Syllable */
+ ["\uD5B8", "\uD5B8"], /* Hangul Syllable */
+ ["\uD5B9", "\uD5B9"], /* Hangul Syllable */
+ ["\uD5BA", "\uD5BA"], /* Hangul Syllable */
+ ["\uD5BB", "\uD5BB"], /* Hangul Syllable */
+ ["\uD5BC", "\uD5BC"], /* Hangul Syllable */
+ ["\uD5BD", "\uD5BD"], /* Hangul Syllable */
+ ["\uD5BE", "\uD5BE"], /* Hangul Syllable */
+ ["\uD5BF", "\uD5BF"], /* Hangul Syllable */
+ ["\uD5C0", "\uD5C0"], /* Hangul Syllable */
+ ["\uD5C1", "\uD5C1"], /* Hangul Syllable */
+ ["\uD5C2", "\uD5C2"], /* Hangul Syllable */
+ ["\uD5C3", "\uD5C3"], /* Hangul Syllable */
+ ["\uD5C4", "\uD5C4"], /* Hangul Syllable */
+ ["\uD5C5", "\uD5C5"], /* Hangul Syllable */
+ ["\uD5C6", "\uD5C6"], /* Hangul Syllable */
+ ["\uD5C7", "\uD5C7"], /* Hangul Syllable */
+ ["\uD5C8", "\uD5C8"], /* Hangul Syllable */
+ ["\uD5C9", "\uD5C9"], /* Hangul Syllable */
+ ["\uD5CA", "\uD5CA"], /* Hangul Syllable */
+ ["\uD5CB", "\uD5CB"], /* Hangul Syllable */
+ ["\uD5CC", "\uD5CC"], /* Hangul Syllable */
+ ["\uD5CD", "\uD5CD"], /* Hangul Syllable */
+ ["\uD5CE", "\uD5CE"], /* Hangul Syllable */
+ ["\uD5CF", "\uD5CF"], /* Hangul Syllable */
+ ["\uD5D0", "\uD5D0"], /* Hangul Syllable */
+ ["\uD5D1", "\uD5D1"], /* Hangul Syllable */
+ ["\uD5D2", "\uD5D2"], /* Hangul Syllable */
+ ["\uD5D3", "\uD5D3"], /* Hangul Syllable */
+ ["\uD5D4", "\uD5D4"], /* Hangul Syllable */
+ ["\uD5D5", "\uD5D5"], /* Hangul Syllable */
+ ["\uD5D6", "\uD5D6"], /* Hangul Syllable */
+ ["\uD5D7", "\uD5D7"], /* Hangul Syllable */
+ ["\uD5D8", "\uD5D8"], /* Hangul Syllable */
+ ["\uD5D9", "\uD5D9"], /* Hangul Syllable */
+ ["\uD5DA", "\uD5DA"], /* Hangul Syllable */
+ ["\uD5DB", "\uD5DB"], /* Hangul Syllable */
+ ["\uD5DC", "\uD5DC"], /* Hangul Syllable */
+ ["\uD5DD", "\uD5DD"], /* Hangul Syllable */
+ ["\uD5DE", "\uD5DE"], /* Hangul Syllable */
+ ["\uD5DF", "\uD5DF"], /* Hangul Syllable */
+ ["\uD5E0", "\uD5E0"], /* Hangul Syllable */
+ ["\uD5E1", "\uD5E1"], /* Hangul Syllable */
+ ["\uD5E2", "\uD5E2"], /* Hangul Syllable */
+ ["\uD5E3", "\uD5E3"], /* Hangul Syllable */
+ ["\uD5E4", "\uD5E4"], /* Hangul Syllable */
+ ["\uD5E5", "\uD5E5"], /* Hangul Syllable */
+ ["\uD5E6", "\uD5E6"], /* Hangul Syllable */
+ ["\uD5E7", "\uD5E7"], /* Hangul Syllable */
+ ["\uD5E8", "\uD5E8"], /* Hangul Syllable */
+ ["\uD5E9", "\uD5E9"], /* Hangul Syllable */
+ ["\uD5EA", "\uD5EA"], /* Hangul Syllable */
+ ["\uD5EB", "\uD5EB"], /* Hangul Syllable */
+ ["\uD5EC", "\uD5EC"], /* Hangul Syllable */
+ ["\uD5ED", "\uD5ED"], /* Hangul Syllable */
+ ["\uD5EE", "\uD5EE"], /* Hangul Syllable */
+ ["\uD5EF", "\uD5EF"], /* Hangul Syllable */
+ ["\uD5F0", "\uD5F0"], /* Hangul Syllable */
+ ["\uD5F1", "\uD5F1"], /* Hangul Syllable */
+ ["\uD5F2", "\uD5F2"], /* Hangul Syllable */
+ ["\uD5F3", "\uD5F3"], /* Hangul Syllable */
+ ["\uD5F4", "\uD5F4"], /* Hangul Syllable */
+ ["\uD5F5", "\uD5F5"], /* Hangul Syllable */
+ ["\uD5F6", "\uD5F6"], /* Hangul Syllable */
+ ["\uD5F7", "\uD5F7"], /* Hangul Syllable */
+ ["\uD5F8", "\uD5F8"], /* Hangul Syllable */
+ ["\uD5F9", "\uD5F9"], /* Hangul Syllable */
+ ["\uD5FA", "\uD5FA"], /* Hangul Syllable */
+ ["\uD5FB", "\uD5FB"], /* Hangul Syllable */
+ ["\uD5FC", "\uD5FC"], /* Hangul Syllable */
+ ["\uD5FD", "\uD5FD"], /* Hangul Syllable */
+ ["\uD5FE", "\uD5FE"], /* Hangul Syllable */
+ ["\uD5FF", "\uD5FF"], /* Hangul Syllable */
+ ["\uD600", "\uD600"], /* Hangul Syllable */
+ ["\uD601", "\uD601"], /* Hangul Syllable */
+ ["\uD602", "\uD602"], /* Hangul Syllable */
+ ["\uD603", "\uD603"], /* Hangul Syllable */
+ ["\uD604", "\uD604"], /* Hangul Syllable */
+ ["\uD605", "\uD605"], /* Hangul Syllable */
+ ["\uD606", "\uD606"], /* Hangul Syllable */
+ ["\uD607", "\uD607"], /* Hangul Syllable */
+ ["\uD608", "\uD608"], /* Hangul Syllable */
+ ["\uD609", "\uD609"], /* Hangul Syllable */
+ ["\uD60A", "\uD60A"], /* Hangul Syllable */
+ ["\uD60B", "\uD60B"], /* Hangul Syllable */
+ ["\uD60C", "\uD60C"], /* Hangul Syllable */
+ ["\uD60D", "\uD60D"], /* Hangul Syllable */
+ ["\uD60E", "\uD60E"], /* Hangul Syllable */
+ ["\uD60F", "\uD60F"], /* Hangul Syllable */
+ ["\uD610", "\uD610"], /* Hangul Syllable */
+ ["\uD611", "\uD611"], /* Hangul Syllable */
+ ["\uD612", "\uD612"], /* Hangul Syllable */
+ ["\uD613", "\uD613"], /* Hangul Syllable */
+ ["\uD614", "\uD614"], /* Hangul Syllable */
+ ["\uD615", "\uD615"], /* Hangul Syllable */
+ ["\uD616", "\uD616"], /* Hangul Syllable */
+ ["\uD617", "\uD617"], /* Hangul Syllable */
+ ["\uD618", "\uD618"], /* Hangul Syllable */
+ ["\uD619", "\uD619"], /* Hangul Syllable */
+ ["\uD61A", "\uD61A"], /* Hangul Syllable */
+ ["\uD61B", "\uD61B"], /* Hangul Syllable */
+ ["\uD61C", "\uD61C"], /* Hangul Syllable */
+ ["\uD61D", "\uD61D"], /* Hangul Syllable */
+ ["\uD61E", "\uD61E"], /* Hangul Syllable */
+ ["\uD61F", "\uD61F"], /* Hangul Syllable */
+ ["\uD620", "\uD620"], /* Hangul Syllable */
+ ["\uD621", "\uD621"], /* Hangul Syllable */
+ ["\uD622", "\uD622"], /* Hangul Syllable */
+ ["\uD623", "\uD623"], /* Hangul Syllable */
+ ["\uD624", "\uD624"], /* Hangul Syllable */
+ ["\uD625", "\uD625"], /* Hangul Syllable */
+ ["\uD626", "\uD626"], /* Hangul Syllable */
+ ["\uD627", "\uD627"], /* Hangul Syllable */
+ ["\uD628", "\uD628"], /* Hangul Syllable */
+ ["\uD629", "\uD629"], /* Hangul Syllable */
+ ["\uD62A", "\uD62A"], /* Hangul Syllable */
+ ["\uD62B", "\uD62B"], /* Hangul Syllable */
+ ["\uD62C", "\uD62C"], /* Hangul Syllable */
+ ["\uD62D", "\uD62D"], /* Hangul Syllable */
+ ["\uD62E", "\uD62E"], /* Hangul Syllable */
+ ["\uD62F", "\uD62F"], /* Hangul Syllable */
+ ["\uD630", "\uD630"], /* Hangul Syllable */
+ ["\uD631", "\uD631"], /* Hangul Syllable */
+ ["\uD632", "\uD632"], /* Hangul Syllable */
+ ["\uD633", "\uD633"], /* Hangul Syllable */
+ ["\uD634", "\uD634"], /* Hangul Syllable */
+ ["\uD635", "\uD635"], /* Hangul Syllable */
+ ["\uD636", "\uD636"], /* Hangul Syllable */
+ ["\uD637", "\uD637"], /* Hangul Syllable */
+ ["\uD638", "\uD638"], /* Hangul Syllable */
+ ["\uD639", "\uD639"], /* Hangul Syllable */
+ ["\uD63A", "\uD63A"], /* Hangul Syllable */
+ ["\uD63B", "\uD63B"], /* Hangul Syllable */
+ ["\uD63C", "\uD63C"], /* Hangul Syllable */
+ ["\uD63D", "\uD63D"], /* Hangul Syllable */
+ ["\uD63E", "\uD63E"], /* Hangul Syllable */
+ ["\uD63F", "\uD63F"], /* Hangul Syllable */
+ ["\uD640", "\uD640"], /* Hangul Syllable */
+ ["\uD641", "\uD641"], /* Hangul Syllable */
+ ["\uD642", "\uD642"], /* Hangul Syllable */
+ ["\uD643", "\uD643"], /* Hangul Syllable */
+ ["\uD644", "\uD644"], /* Hangul Syllable */
+ ["\uD645", "\uD645"], /* Hangul Syllable */
+ ["\uD646", "\uD646"], /* Hangul Syllable */
+ ["\uD647", "\uD647"], /* Hangul Syllable */
+ ["\uD648", "\uD648"], /* Hangul Syllable */
+ ["\uD649", "\uD649"], /* Hangul Syllable */
+ ["\uD64A", "\uD64A"], /* Hangul Syllable */
+ ["\uD64B", "\uD64B"], /* Hangul Syllable */
+ ["\uD64C", "\uD64C"], /* Hangul Syllable */
+ ["\uD64D", "\uD64D"], /* Hangul Syllable */
+ ["\uD64E", "\uD64E"], /* Hangul Syllable */
+ ["\uD64F", "\uD64F"], /* Hangul Syllable */
+ ["\uD650", "\uD650"], /* Hangul Syllable */
+ ["\uD651", "\uD651"], /* Hangul Syllable */
+ ["\uD652", "\uD652"], /* Hangul Syllable */
+ ["\uD653", "\uD653"], /* Hangul Syllable */
+ ["\uD654", "\uD654"], /* Hangul Syllable */
+ ["\uD655", "\uD655"], /* Hangul Syllable */
+ ["\uD656", "\uD656"], /* Hangul Syllable */
+ ["\uD657", "\uD657"], /* Hangul Syllable */
+ ["\uD658", "\uD658"], /* Hangul Syllable */
+ ["\uD659", "\uD659"], /* Hangul Syllable */
+ ["\uD65A", "\uD65A"], /* Hangul Syllable */
+ ["\uD65B", "\uD65B"], /* Hangul Syllable */
+ ["\uD65C", "\uD65C"], /* Hangul Syllable */
+ ["\uD65D", "\uD65D"], /* Hangul Syllable */
+ ["\uD65E", "\uD65E"], /* Hangul Syllable */
+ ["\uD65F", "\uD65F"], /* Hangul Syllable */
+ ["\uD660", "\uD660"], /* Hangul Syllable */
+ ["\uD661", "\uD661"], /* Hangul Syllable */
+ ["\uD662", "\uD662"], /* Hangul Syllable */
+ ["\uD663", "\uD663"], /* Hangul Syllable */
+ ["\uD664", "\uD664"], /* Hangul Syllable */
+ ["\uD665", "\uD665"], /* Hangul Syllable */
+ ["\uD666", "\uD666"], /* Hangul Syllable */
+ ["\uD667", "\uD667"], /* Hangul Syllable */
+ ["\uD668", "\uD668"], /* Hangul Syllable */
+ ["\uD669", "\uD669"], /* Hangul Syllable */
+ ["\uD66A", "\uD66A"], /* Hangul Syllable */
+ ["\uD66B", "\uD66B"], /* Hangul Syllable */
+ ["\uD66C", "\uD66C"], /* Hangul Syllable */
+ ["\uD66D", "\uD66D"], /* Hangul Syllable */
+ ["\uD66E", "\uD66E"], /* Hangul Syllable */
+ ["\uD66F", "\uD66F"], /* Hangul Syllable */
+ ["\uD670", "\uD670"], /* Hangul Syllable */
+ ["\uD671", "\uD671"], /* Hangul Syllable */
+ ["\uD672", "\uD672"], /* Hangul Syllable */
+ ["\uD673", "\uD673"], /* Hangul Syllable */
+ ["\uD674", "\uD674"], /* Hangul Syllable */
+ ["\uD675", "\uD675"], /* Hangul Syllable */
+ ["\uD676", "\uD676"], /* Hangul Syllable */
+ ["\uD677", "\uD677"], /* Hangul Syllable */
+ ["\uD678", "\uD678"], /* Hangul Syllable */
+ ["\uD679", "\uD679"], /* Hangul Syllable */
+ ["\uD67A", "\uD67A"], /* Hangul Syllable */
+ ["\uD67B", "\uD67B"], /* Hangul Syllable */
+ ["\uD67C", "\uD67C"], /* Hangul Syllable */
+ ["\uD67D", "\uD67D"], /* Hangul Syllable */
+ ["\uD67E", "\uD67E"], /* Hangul Syllable */
+ ["\uD67F", "\uD67F"], /* Hangul Syllable */
+ ["\uD680", "\uD680"], /* Hangul Syllable */
+ ["\uD681", "\uD681"], /* Hangul Syllable */
+ ["\uD682", "\uD682"], /* Hangul Syllable */
+ ["\uD683", "\uD683"], /* Hangul Syllable */
+ ["\uD684", "\uD684"], /* Hangul Syllable */
+ ["\uD685", "\uD685"], /* Hangul Syllable */
+ ["\uD686", "\uD686"], /* Hangul Syllable */
+ ["\uD687", "\uD687"], /* Hangul Syllable */
+ ["\uD688", "\uD688"], /* Hangul Syllable */
+ ["\uD689", "\uD689"], /* Hangul Syllable */
+ ["\uD68A", "\uD68A"], /* Hangul Syllable */
+ ["\uD68B", "\uD68B"], /* Hangul Syllable */
+ ["\uD68C", "\uD68C"], /* Hangul Syllable */
+ ["\uD68D", "\uD68D"], /* Hangul Syllable */
+ ["\uD68E", "\uD68E"], /* Hangul Syllable */
+ ["\uD68F", "\uD68F"], /* Hangul Syllable */
+ ["\uD690", "\uD690"], /* Hangul Syllable */
+ ["\uD691", "\uD691"], /* Hangul Syllable */
+ ["\uD692", "\uD692"], /* Hangul Syllable */
+ ["\uD693", "\uD693"], /* Hangul Syllable */
+ ["\uD694", "\uD694"], /* Hangul Syllable */
+ ["\uD695", "\uD695"], /* Hangul Syllable */
+ ["\uD696", "\uD696"], /* Hangul Syllable */
+ ["\uD697", "\uD697"], /* Hangul Syllable */
+ ["\uD698", "\uD698"], /* Hangul Syllable */
+ ["\uD699", "\uD699"], /* Hangul Syllable */
+ ["\uD69A", "\uD69A"], /* Hangul Syllable */
+ ["\uD69B", "\uD69B"], /* Hangul Syllable */
+ ["\uD69C", "\uD69C"], /* Hangul Syllable */
+ ["\uD69D", "\uD69D"], /* Hangul Syllable */
+ ["\uD69E", "\uD69E"], /* Hangul Syllable */
+ ["\uD69F", "\uD69F"], /* Hangul Syllable */
+ ["\uD6A0", "\uD6A0"], /* Hangul Syllable */
+ ["\uD6A1", "\uD6A1"], /* Hangul Syllable */
+ ["\uD6A2", "\uD6A2"], /* Hangul Syllable */
+ ["\uD6A3", "\uD6A3"], /* Hangul Syllable */
+ ["\uD6A4", "\uD6A4"], /* Hangul Syllable */
+ ["\uD6A5", "\uD6A5"], /* Hangul Syllable */
+ ["\uD6A6", "\uD6A6"], /* Hangul Syllable */
+ ["\uD6A7", "\uD6A7"], /* Hangul Syllable */
+ ["\uD6A8", "\uD6A8"], /* Hangul Syllable */
+ ["\uD6A9", "\uD6A9"], /* Hangul Syllable */
+ ["\uD6AA", "\uD6AA"], /* Hangul Syllable */
+ ["\uD6AB", "\uD6AB"], /* Hangul Syllable */
+ ["\uD6AC", "\uD6AC"], /* Hangul Syllable */
+ ["\uD6AD", "\uD6AD"], /* Hangul Syllable */
+ ["\uD6AE", "\uD6AE"], /* Hangul Syllable */
+ ["\uD6AF", "\uD6AF"], /* Hangul Syllable */
+ ["\uD6B0", "\uD6B0"], /* Hangul Syllable */
+ ["\uD6B1", "\uD6B1"], /* Hangul Syllable */
+ ["\uD6B2", "\uD6B2"], /* Hangul Syllable */
+ ["\uD6B3", "\uD6B3"], /* Hangul Syllable */
+ ["\uD6B4", "\uD6B4"], /* Hangul Syllable */
+ ["\uD6B5", "\uD6B5"], /* Hangul Syllable */
+ ["\uD6B6", "\uD6B6"], /* Hangul Syllable */
+ ["\uD6B7", "\uD6B7"], /* Hangul Syllable */
+ ["\uD6B8", "\uD6B8"], /* Hangul Syllable */
+ ["\uD6B9", "\uD6B9"], /* Hangul Syllable */
+ ["\uD6BA", "\uD6BA"], /* Hangul Syllable */
+ ["\uD6BB", "\uD6BB"], /* Hangul Syllable */
+ ["\uD6BC", "\uD6BC"], /* Hangul Syllable */
+ ["\uD6BD", "\uD6BD"], /* Hangul Syllable */
+ ["\uD6BE", "\uD6BE"], /* Hangul Syllable */
+ ["\uD6BF", "\uD6BF"], /* Hangul Syllable */
+ ["\uD6C0", "\uD6C0"], /* Hangul Syllable */
+ ["\uD6C1", "\uD6C1"], /* Hangul Syllable */
+ ["\uD6C2", "\uD6C2"], /* Hangul Syllable */
+ ["\uD6C3", "\uD6C3"], /* Hangul Syllable */
+ ["\uD6C4", "\uD6C4"], /* Hangul Syllable */
+ ["\uD6C5", "\uD6C5"], /* Hangul Syllable */
+ ["\uD6C6", "\uD6C6"], /* Hangul Syllable */
+ ["\uD6C7", "\uD6C7"], /* Hangul Syllable */
+ ["\uD6C8", "\uD6C8"], /* Hangul Syllable */
+ ["\uD6C9", "\uD6C9"], /* Hangul Syllable */
+ ["\uD6CA", "\uD6CA"], /* Hangul Syllable */
+ ["\uD6CB", "\uD6CB"], /* Hangul Syllable */
+ ["\uD6CC", "\uD6CC"], /* Hangul Syllable */
+ ["\uD6CD", "\uD6CD"], /* Hangul Syllable */
+ ["\uD6CE", "\uD6CE"], /* Hangul Syllable */
+ ["\uD6CF", "\uD6CF"], /* Hangul Syllable */
+ ["\uD6D0", "\uD6D0"], /* Hangul Syllable */
+ ["\uD6D1", "\uD6D1"], /* Hangul Syllable */
+ ["\uD6D2", "\uD6D2"], /* Hangul Syllable */
+ ["\uD6D3", "\uD6D3"], /* Hangul Syllable */
+ ["\uD6D4", "\uD6D4"], /* Hangul Syllable */
+ ["\uD6D5", "\uD6D5"], /* Hangul Syllable */
+ ["\uD6D6", "\uD6D6"], /* Hangul Syllable */
+ ["\uD6D7", "\uD6D7"], /* Hangul Syllable */
+ ["\uD6D8", "\uD6D8"], /* Hangul Syllable */
+ ["\uD6D9", "\uD6D9"], /* Hangul Syllable */
+ ["\uD6DA", "\uD6DA"], /* Hangul Syllable */
+ ["\uD6DB", "\uD6DB"], /* Hangul Syllable */
+ ["\uD6DC", "\uD6DC"], /* Hangul Syllable */
+ ["\uD6DD", "\uD6DD"], /* Hangul Syllable */
+ ["\uD6DE", "\uD6DE"], /* Hangul Syllable */
+ ["\uD6DF", "\uD6DF"], /* Hangul Syllable */
+ ["\uD6E0", "\uD6E0"], /* Hangul Syllable */
+ ["\uD6E1", "\uD6E1"], /* Hangul Syllable */
+ ["\uD6E2", "\uD6E2"], /* Hangul Syllable */
+ ["\uD6E3", "\uD6E3"], /* Hangul Syllable */
+ ["\uD6E4", "\uD6E4"], /* Hangul Syllable */
+ ["\uD6E5", "\uD6E5"], /* Hangul Syllable */
+ ["\uD6E6", "\uD6E6"], /* Hangul Syllable */
+ ["\uD6E7", "\uD6E7"], /* Hangul Syllable */
+ ["\uD6E8", "\uD6E8"], /* Hangul Syllable */
+ ["\uD6E9", "\uD6E9"], /* Hangul Syllable */
+ ["\uD6EA", "\uD6EA"], /* Hangul Syllable */
+ ["\uD6EB", "\uD6EB"], /* Hangul Syllable */
+ ["\uD6EC", "\uD6EC"], /* Hangul Syllable */
+ ["\uD6ED", "\uD6ED"], /* Hangul Syllable */
+ ["\uD6EE", "\uD6EE"], /* Hangul Syllable */
+ ["\uD6EF", "\uD6EF"], /* Hangul Syllable */
+ ["\uD6F0", "\uD6F0"], /* Hangul Syllable */
+ ["\uD6F1", "\uD6F1"], /* Hangul Syllable */
+ ["\uD6F2", "\uD6F2"], /* Hangul Syllable */
+ ["\uD6F3", "\uD6F3"], /* Hangul Syllable */
+ ["\uD6F4", "\uD6F4"], /* Hangul Syllable */
+ ["\uD6F5", "\uD6F5"], /* Hangul Syllable */
+ ["\uD6F6", "\uD6F6"], /* Hangul Syllable */
+ ["\uD6F7", "\uD6F7"], /* Hangul Syllable */
+ ["\uD6F8", "\uD6F8"], /* Hangul Syllable */
+ ["\uD6F9", "\uD6F9"], /* Hangul Syllable */
+ ["\uD6FA", "\uD6FA"], /* Hangul Syllable */
+ ["\uD6FB", "\uD6FB"], /* Hangul Syllable */
+ ["\uD6FC", "\uD6FC"], /* Hangul Syllable */
+ ["\uD6FD", "\uD6FD"], /* Hangul Syllable */
+ ["\uD6FE", "\uD6FE"], /* Hangul Syllable */
+ ["\uD6FF", "\uD6FF"], /* Hangul Syllable */
+ ["\uD700", "\uD700"], /* Hangul Syllable */
+ ["\uD701", "\uD701"], /* Hangul Syllable */
+ ["\uD702", "\uD702"], /* Hangul Syllable */
+ ["\uD703", "\uD703"], /* Hangul Syllable */
+ ["\uD704", "\uD704"], /* Hangul Syllable */
+ ["\uD705", "\uD705"], /* Hangul Syllable */
+ ["\uD706", "\uD706"], /* Hangul Syllable */
+ ["\uD707", "\uD707"], /* Hangul Syllable */
+ ["\uD708", "\uD708"], /* Hangul Syllable */
+ ["\uD709", "\uD709"], /* Hangul Syllable */
+ ["\uD70A", "\uD70A"], /* Hangul Syllable */
+ ["\uD70B", "\uD70B"], /* Hangul Syllable */
+ ["\uD70C", "\uD70C"], /* Hangul Syllable */
+ ["\uD70D", "\uD70D"], /* Hangul Syllable */
+ ["\uD70E", "\uD70E"], /* Hangul Syllable */
+ ["\uD70F", "\uD70F"], /* Hangul Syllable */
+ ["\uD710", "\uD710"], /* Hangul Syllable */
+ ["\uD711", "\uD711"], /* Hangul Syllable */
+ ["\uD712", "\uD712"], /* Hangul Syllable */
+ ["\uD713", "\uD713"], /* Hangul Syllable */
+ ["\uD714", "\uD714"], /* Hangul Syllable */
+ ["\uD715", "\uD715"], /* Hangul Syllable */
+ ["\uD716", "\uD716"], /* Hangul Syllable */
+ ["\uD717", "\uD717"], /* Hangul Syllable */
+ ["\uD718", "\uD718"], /* Hangul Syllable */
+ ["\uD719", "\uD719"], /* Hangul Syllable */
+ ["\uD71A", "\uD71A"], /* Hangul Syllable */
+ ["\uD71B", "\uD71B"], /* Hangul Syllable */
+ ["\uD71C", "\uD71C"], /* Hangul Syllable */
+ ["\uD71D", "\uD71D"], /* Hangul Syllable */
+ ["\uD71E", "\uD71E"], /* Hangul Syllable */
+ ["\uD71F", "\uD71F"], /* Hangul Syllable */
+ ["\uD720", "\uD720"], /* Hangul Syllable */
+ ["\uD721", "\uD721"], /* Hangul Syllable */
+ ["\uD722", "\uD722"], /* Hangul Syllable */
+ ["\uD723", "\uD723"], /* Hangul Syllable */
+ ["\uD724", "\uD724"], /* Hangul Syllable */
+ ["\uD725", "\uD725"], /* Hangul Syllable */
+ ["\uD726", "\uD726"], /* Hangul Syllable */
+ ["\uD727", "\uD727"], /* Hangul Syllable */
+ ["\uD728", "\uD728"], /* Hangul Syllable */
+ ["\uD729", "\uD729"], /* Hangul Syllable */
+ ["\uD72A", "\uD72A"], /* Hangul Syllable */
+ ["\uD72B", "\uD72B"], /* Hangul Syllable */
+ ["\uD72C", "\uD72C"], /* Hangul Syllable */
+ ["\uD72D", "\uD72D"], /* Hangul Syllable */
+ ["\uD72E", "\uD72E"], /* Hangul Syllable */
+ ["\uD72F", "\uD72F"], /* Hangul Syllable */
+ ["\uD730", "\uD730"], /* Hangul Syllable */
+ ["\uD731", "\uD731"], /* Hangul Syllable */
+ ["\uD732", "\uD732"], /* Hangul Syllable */
+ ["\uD733", "\uD733"], /* Hangul Syllable */
+ ["\uD734", "\uD734"], /* Hangul Syllable */
+ ["\uD735", "\uD735"], /* Hangul Syllable */
+ ["\uD736", "\uD736"], /* Hangul Syllable */
+ ["\uD737", "\uD737"], /* Hangul Syllable */
+ ["\uD738", "\uD738"], /* Hangul Syllable */
+ ["\uD739", "\uD739"], /* Hangul Syllable */
+ ["\uD73A", "\uD73A"], /* Hangul Syllable */
+ ["\uD73B", "\uD73B"], /* Hangul Syllable */
+ ["\uD73C", "\uD73C"], /* Hangul Syllable */
+ ["\uD73D", "\uD73D"], /* Hangul Syllable */
+ ["\uD73E", "\uD73E"], /* Hangul Syllable */
+ ["\uD73F", "\uD73F"], /* Hangul Syllable */
+ ["\uD740", "\uD740"], /* Hangul Syllable */
+ ["\uD741", "\uD741"], /* Hangul Syllable */
+ ["\uD742", "\uD742"], /* Hangul Syllable */
+ ["\uD743", "\uD743"], /* Hangul Syllable */
+ ["\uD744", "\uD744"], /* Hangul Syllable */
+ ["\uD745", "\uD745"], /* Hangul Syllable */
+ ["\uD746", "\uD746"], /* Hangul Syllable */
+ ["\uD747", "\uD747"], /* Hangul Syllable */
+ ["\uD748", "\uD748"], /* Hangul Syllable */
+ ["\uD749", "\uD749"], /* Hangul Syllable */
+ ["\uD74A", "\uD74A"], /* Hangul Syllable */
+ ["\uD74B", "\uD74B"], /* Hangul Syllable */
+ ["\uD74C", "\uD74C"], /* Hangul Syllable */
+ ["\uD74D", "\uD74D"], /* Hangul Syllable */
+ ["\uD74E", "\uD74E"], /* Hangul Syllable */
+ ["\uD74F", "\uD74F"], /* Hangul Syllable */
+ ["\uD750", "\uD750"], /* Hangul Syllable */
+ ["\uD751", "\uD751"], /* Hangul Syllable */
+ ["\uD752", "\uD752"], /* Hangul Syllable */
+ ["\uD753", "\uD753"], /* Hangul Syllable */
+ ["\uD754", "\uD754"], /* Hangul Syllable */
+ ["\uD755", "\uD755"], /* Hangul Syllable */
+ ["\uD756", "\uD756"], /* Hangul Syllable */
+ ["\uD757", "\uD757"], /* Hangul Syllable */
+ ["\uD758", "\uD758"], /* Hangul Syllable */
+ ["\uD759", "\uD759"], /* Hangul Syllable */
+ ["\uD75A", "\uD75A"], /* Hangul Syllable */
+ ["\uD75B", "\uD75B"], /* Hangul Syllable */
+ ["\uD75C", "\uD75C"], /* Hangul Syllable */
+ ["\uD75D", "\uD75D"], /* Hangul Syllable */
+ ["\uD75E", "\uD75E"], /* Hangul Syllable */
+ ["\uD75F", "\uD75F"], /* Hangul Syllable */
+ ["\uD760", "\uD760"], /* Hangul Syllable */
+ ["\uD761", "\uD761"], /* Hangul Syllable */
+ ["\uD762", "\uD762"], /* Hangul Syllable */
+ ["\uD763", "\uD763"], /* Hangul Syllable */
+ ["\uD764", "\uD764"], /* Hangul Syllable */
+ ["\uD765", "\uD765"], /* Hangul Syllable */
+ ["\uD766", "\uD766"], /* Hangul Syllable */
+ ["\uD767", "\uD767"], /* Hangul Syllable */
+ ["\uD768", "\uD768"], /* Hangul Syllable */
+ ["\uD769", "\uD769"], /* Hangul Syllable */
+ ["\uD76A", "\uD76A"], /* Hangul Syllable */
+ ["\uD76B", "\uD76B"], /* Hangul Syllable */
+ ["\uD76C", "\uD76C"], /* Hangul Syllable */
+ ["\uD76D", "\uD76D"], /* Hangul Syllable */
+ ["\uD76E", "\uD76E"], /* Hangul Syllable */
+ ["\uD76F", "\uD76F"], /* Hangul Syllable */
+ ["\uD770", "\uD770"], /* Hangul Syllable */
+ ["\uD771", "\uD771"], /* Hangul Syllable */
+ ["\uD772", "\uD772"], /* Hangul Syllable */
+ ["\uD773", "\uD773"], /* Hangul Syllable */
+ ["\uD774", "\uD774"], /* Hangul Syllable */
+ ["\uD775", "\uD775"], /* Hangul Syllable */
+ ["\uD776", "\uD776"], /* Hangul Syllable */
+ ["\uD777", "\uD777"], /* Hangul Syllable */
+ ["\uD778", "\uD778"], /* Hangul Syllable */
+ ["\uD779", "\uD779"], /* Hangul Syllable */
+ ["\uD77A", "\uD77A"], /* Hangul Syllable */
+ ["\uD77B", "\uD77B"], /* Hangul Syllable */
+ ["\uD77C", "\uD77C"], /* Hangul Syllable */
+ ["\uD77D", "\uD77D"], /* Hangul Syllable */
+ ["\uD77E", "\uD77E"], /* Hangul Syllable */
+ ["\uD77F", "\uD77F"], /* Hangul Syllable */
+ ["\uD780", "\uD780"], /* Hangul Syllable */
+ ["\uD781", "\uD781"], /* Hangul Syllable */
+ ["\uD782", "\uD782"], /* Hangul Syllable */
+ ["\uD783", "\uD783"], /* Hangul Syllable */
+ ["\uD784", "\uD784"], /* Hangul Syllable */
+ ["\uD785", "\uD785"], /* Hangul Syllable */
+ ["\uD786", "\uD786"], /* Hangul Syllable */
+ ["\uD787", "\uD787"], /* Hangul Syllable */
+ ["\uD788", "\uD788"], /* Hangul Syllable */
+ ["\uD789", "\uD789"], /* Hangul Syllable */
+ ["\uD78A", "\uD78A"], /* Hangul Syllable */
+ ["\uD78B", "\uD78B"], /* Hangul Syllable */
+ ["\uD78C", "\uD78C"], /* Hangul Syllable */
+ ["\uD78D", "\uD78D"], /* Hangul Syllable */
+ ["\uD78E", "\uD78E"], /* Hangul Syllable */
+ ["\uD78F", "\uD78F"], /* Hangul Syllable */
+ ["\uD790", "\uD790"], /* Hangul Syllable */
+ ["\uD791", "\uD791"], /* Hangul Syllable */
+ ["\uD792", "\uD792"], /* Hangul Syllable */
+ ["\uD793", "\uD793"], /* Hangul Syllable */
+ ["\uD794", "\uD794"], /* Hangul Syllable */
+ ["\uD795", "\uD795"], /* Hangul Syllable */
+ ["\uD796", "\uD796"], /* Hangul Syllable */
+ ["\uD797", "\uD797"], /* Hangul Syllable */
+ ["\uD798", "\uD798"], /* Hangul Syllable */
+ ["\uD799", "\uD799"], /* Hangul Syllable */
+ ["\uD79A", "\uD79A"], /* Hangul Syllable */
+ ["\uD79B", "\uD79B"], /* Hangul Syllable */
+ ["\uD79C", "\uD79C"], /* Hangul Syllable */
+ ["\uD79D", "\uD79D"], /* Hangul Syllable */
+ ["\uD79E", "\uD79E"], /* Hangul Syllable */
+ ["\uD79F", "\uD79F"], /* Hangul Syllable */
+ ["\uD7A0", "\uD7A0"], /* Hangul Syllable */
+ ["\uD7A1", "\uD7A1"], /* Hangul Syllable */
+ ["\uD7A2", "\uD7A2"], /* Hangul Syllable */
+ ["\uD7A3", "\uD7A3"], /* Hangul Syllable */
+ ["\uD7A4", "\uD7A4"],
+ ["\uD7A5", "\uD7A5"],
+ ["\uD7A6", "\uD7A6"],
+ ["\uD7A7", "\uD7A7"],
+ ["\uD7A8", "\uD7A8"],
+ ["\uD7A9", "\uD7A9"],
+ ["\uD7AA", "\uD7AA"],
+ ["\uD7AB", "\uD7AB"],
+ ["\uD7AC", "\uD7AC"],
+ ["\uD7AD", "\uD7AD"],
+ ["\uD7AE", "\uD7AE"],
+ ["\uD7AF", "\uD7AF"],
+ ["\uD7B0", "\uD7B0"], /* HANGUL JUNGSEONG O-YEO */
+ ["\uD7B1", "\uD7B1"], /* HANGUL JUNGSEONG O-O-I */
+ ["\uD7B2", "\uD7B2"], /* HANGUL JUNGSEONG YO-A */
+ ["\uD7B3", "\uD7B3"], /* HANGUL JUNGSEONG YO-AE */
+ ["\uD7B4", "\uD7B4"], /* HANGUL JUNGSEONG YO-EO */
+ ["\uD7B5", "\uD7B5"], /* HANGUL JUNGSEONG U-YEO */
+ ["\uD7B6", "\uD7B6"], /* HANGUL JUNGSEONG U-I-I */
+ ["\uD7B7", "\uD7B7"], /* HANGUL JUNGSEONG YU-AE */
+ ["\uD7B8", "\uD7B8"], /* HANGUL JUNGSEONG YU-O */
+ ["\uD7B9", "\uD7B9"], /* HANGUL JUNGSEONG EU-A */
+ ["\uD7BA", "\uD7BA"], /* HANGUL JUNGSEONG EU-EO */
+ ["\uD7BB", "\uD7BB"], /* HANGUL JUNGSEONG EU-E */
+ ["\uD7BC", "\uD7BC"], /* HANGUL JUNGSEONG EU-O */
+ ["\uD7BD", "\uD7BD"], /* HANGUL JUNGSEONG I-YA-O */
+ ["\uD7BE", "\uD7BE"], /* HANGUL JUNGSEONG I-YAE */
+ ["\uD7BF", "\uD7BF"], /* HANGUL JUNGSEONG I-YEO */
+ ["\uD7C0", "\uD7C0"], /* HANGUL JUNGSEONG I-YE */
+ ["\uD7C1", "\uD7C1"], /* HANGUL JUNGSEONG I-O-I */
+ ["\uD7C2", "\uD7C2"], /* HANGUL JUNGSEONG I-YO */
+ ["\uD7C3", "\uD7C3"], /* HANGUL JUNGSEONG I-YU */
+ ["\uD7C4", "\uD7C4"], /* HANGUL JUNGSEONG I-I */
+ ["\uD7C5", "\uD7C5"], /* HANGUL JUNGSEONG ARAEA-A */
+ ["\uD7C6", "\uD7C6"], /* HANGUL JUNGSEONG ARAEA-E */
+ ["\uD7C7", "\uD7C7"],
+ ["\uD7C8", "\uD7C8"],
+ ["\uD7C9", "\uD7C9"],
+ ["\uD7CA", "\uD7CA"],
+ ["\uD7CB", "\uD7CB"], /* HANGUL JONGSEONG NIEUN-RIEUL */
+ ["\uD7CC", "\uD7CC"], /* HANGUL JONGSEONG NIEUN-CHIEUCH */
+ ["\uD7CD", "\uD7CD"], /* HANGUL JONGSEONG SSANGTIKEUT */
+ ["\uD7CE", "\uD7CE"], /* HANGUL JONGSEONG SSANGTIKEUT-PIEUP */
+ ["\uD7CF", "\uD7CF"], /* HANGUL JONGSEONG TIKEUT-PIEUP */
+ ["\uD7D0", "\uD7D0"], /* HANGUL JONGSEONG TIKEUT-SIOS */
+ ["\uD7D1", "\uD7D1"], /* HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK */
+ ["\uD7D2", "\uD7D2"], /* HANGUL JONGSEONG TIKEUT-CIEUC */
+ ["\uD7D3", "\uD7D3"], /* HANGUL JONGSEONG TIKEUT-CHIEUCH */
+ ["\uD7D4", "\uD7D4"], /* HANGUL JONGSEONG TIKEUT-THIEUTH */
+ ["\uD7D5", "\uD7D5"], /* HANGUL JONGSEONG RIEUL-SSANGKIYEOK */
+ ["\uD7D6", "\uD7D6"], /* HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH */
+ ["\uD7D7", "\uD7D7"], /* HANGUL JONGSEONG SSANGRIEUL-KHIEUKH */
+ ["\uD7D8", "\uD7D8"], /* HANGUL JONGSEONG RIEUL-MIEUM-HIEUH */
+ ["\uD7D9", "\uD7D9"], /* HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT */
+ ["\uD7DA", "\uD7DA"], /* HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH */
+ ["\uD7DB", "\uD7DB"], /* HANGUL JONGSEONG RIEUL-YESIEUNG */
+ ["\uD7DC", "\uD7DC"], /* HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH */
+ ["\uD7DD", "\uD7DD"], /* HANGUL JONGSEONG KAPYEOUNRIEUL */
+ ["\uD7DE", "\uD7DE"], /* HANGUL JONGSEONG MIEUM-NIEUN */
+ ["\uD7DF", "\uD7DF"], /* HANGUL JONGSEONG MIEUM-SSANGNIEUN */
+ ["\uD7E0", "\uD7E0"], /* HANGUL JONGSEONG SSANGMIEUM */
+ ["\uD7E1", "\uD7E1"], /* HANGUL JONGSEONG MIEUM-PIEUP-SIOS */
+ ["\uD7E2", "\uD7E2"], /* HANGUL JONGSEONG MIEUM-CIEUC */
+ ["\uD7E3", "\uD7E3"], /* HANGUL JONGSEONG PIEUP-TIKEUT */
+ ["\uD7E4", "\uD7E4"], /* HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH */
+ ["\uD7E5", "\uD7E5"], /* HANGUL JONGSEONG PIEUP-MIEUM */
+ ["\uD7E6", "\uD7E6"], /* HANGUL JONGSEONG SSANGPIEUP */
+ ["\uD7E7", "\uD7E7"], /* HANGUL JONGSEONG PIEUP-SIOS-TIKEUT */
+ ["\uD7E8", "\uD7E8"], /* HANGUL JONGSEONG PIEUP-CIEUC */
+ ["\uD7E9", "\uD7E9"], /* HANGUL JONGSEONG PIEUP-CHIEUCH */
+ ["\uD7EA", "\uD7EA"], /* HANGUL JONGSEONG SIOS-MIEUM */
+ ["\uD7EB", "\uD7EB"], /* HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP */
+ ["\uD7EC", "\uD7EC"], /* HANGUL JONGSEONG SSANGSIOS-KIYEOK */
+ ["\uD7ED", "\uD7ED"], /* HANGUL JONGSEONG SSANGSIOS-TIKEUT */
+ ["\uD7EE", "\uD7EE"], /* HANGUL JONGSEONG SIOS-PANSIOS */
+ ["\uD7EF", "\uD7EF"], /* HANGUL JONGSEONG SIOS-CIEUC */
+ ["\uD7F0", "\uD7F0"], /* HANGUL JONGSEONG SIOS-CHIEUCH */
+ ["\uD7F1", "\uD7F1"], /* HANGUL JONGSEONG SIOS-THIEUTH */
+ ["\uD7F2", "\uD7F2"], /* HANGUL JONGSEONG SIOS-HIEUH */
+ ["\uD7F3", "\uD7F3"], /* HANGUL JONGSEONG PANSIOS-PIEUP */
+ ["\uD7F4", "\uD7F4"], /* HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP */
+ ["\uD7F5", "\uD7F5"], /* HANGUL JONGSEONG YESIEUNG-MIEUM */
+ ["\uD7F6", "\uD7F6"], /* HANGUL JONGSEONG YESIEUNG-HIEUH */
+ ["\uD7F7", "\uD7F7"], /* HANGUL JONGSEONG CIEUC-PIEUP */
+ ["\uD7F8", "\uD7F8"], /* HANGUL JONGSEONG CIEUC-SSANGPIEUP */
+ ["\uD7F9", "\uD7F9"], /* HANGUL JONGSEONG SSANGCIEUC */
+ ["\uD7FA", "\uD7FA"], /* HANGUL JONGSEONG PHIEUPH-SIOS */
+ ["\uD7FB", "\uD7FB"], /* HANGUL JONGSEONG PHIEUPH-THIEUTH */
+ ["\uD7FC", "\uD7FC"],
+ ["\uD7FD", "\uD7FD"],
+ ["\uD7FE", "\uD7FE"],
+ ["\uD7FF", "\uD7FF"],
+ ["\uD800", "\uD800"], /* Non Private Use High Surrogate */
+ ["\uD801", "\uD801"], /* Non Private Use High Surrogate */
+ ["\uD802", "\uD802"], /* Non Private Use High Surrogate */
+ ["\uD803", "\uD803"], /* Non Private Use High Surrogate */
+ ["\uD804", "\uD804"], /* Non Private Use High Surrogate */
+ ["\uD805", "\uD805"], /* Non Private Use High Surrogate */
+ ["\uD806", "\uD806"], /* Non Private Use High Surrogate */
+ ["\uD807", "\uD807"], /* Non Private Use High Surrogate */
+ ["\uD808", "\uD808"], /* Non Private Use High Surrogate */
+ ["\uD809", "\uD809"], /* Non Private Use High Surrogate */
+ ["\uD80A", "\uD80A"], /* Non Private Use High Surrogate */
+ ["\uD80B", "\uD80B"], /* Non Private Use High Surrogate */
+ ["\uD80C", "\uD80C"], /* Non Private Use High Surrogate */
+ ["\uD80D", "\uD80D"], /* Non Private Use High Surrogate */
+ ["\uD80E", "\uD80E"], /* Non Private Use High Surrogate */
+ ["\uD80F", "\uD80F"], /* Non Private Use High Surrogate */
+ ["\uD810", "\uD810"], /* Non Private Use High Surrogate */
+ ["\uD811", "\uD811"], /* Non Private Use High Surrogate */
+ ["\uD812", "\uD812"], /* Non Private Use High Surrogate */
+ ["\uD813", "\uD813"], /* Non Private Use High Surrogate */
+ ["\uD814", "\uD814"], /* Non Private Use High Surrogate */
+ ["\uD815", "\uD815"], /* Non Private Use High Surrogate */
+ ["\uD816", "\uD816"], /* Non Private Use High Surrogate */
+ ["\uD817", "\uD817"], /* Non Private Use High Surrogate */
+ ["\uD818", "\uD818"], /* Non Private Use High Surrogate */
+ ["\uD819", "\uD819"], /* Non Private Use High Surrogate */
+ ["\uD81A", "\uD81A"], /* Non Private Use High Surrogate */
+ ["\uD81B", "\uD81B"], /* Non Private Use High Surrogate */
+ ["\uD81C", "\uD81C"], /* Non Private Use High Surrogate */
+ ["\uD81D", "\uD81D"], /* Non Private Use High Surrogate */
+ ["\uD81E", "\uD81E"], /* Non Private Use High Surrogate */
+ ["\uD81F", "\uD81F"], /* Non Private Use High Surrogate */
+ ["\uD820", "\uD820"], /* Non Private Use High Surrogate */
+ ["\uD821", "\uD821"], /* Non Private Use High Surrogate */
+ ["\uD822", "\uD822"], /* Non Private Use High Surrogate */
+ ["\uD823", "\uD823"], /* Non Private Use High Surrogate */
+ ["\uD824", "\uD824"], /* Non Private Use High Surrogate */
+ ["\uD825", "\uD825"], /* Non Private Use High Surrogate */
+ ["\uD826", "\uD826"], /* Non Private Use High Surrogate */
+ ["\uD827", "\uD827"], /* Non Private Use High Surrogate */
+ ["\uD828", "\uD828"], /* Non Private Use High Surrogate */
+ ["\uD829", "\uD829"], /* Non Private Use High Surrogate */
+ ["\uD82A", "\uD82A"], /* Non Private Use High Surrogate */
+ ["\uD82B", "\uD82B"], /* Non Private Use High Surrogate */
+ ["\uD82C", "\uD82C"], /* Non Private Use High Surrogate */
+ ["\uD82D", "\uD82D"], /* Non Private Use High Surrogate */
+ ["\uD82E", "\uD82E"], /* Non Private Use High Surrogate */
+ ["\uD82F", "\uD82F"], /* Non Private Use High Surrogate */
+ ["\uD830", "\uD830"], /* Non Private Use High Surrogate */
+ ["\uD831", "\uD831"], /* Non Private Use High Surrogate */
+ ["\uD832", "\uD832"], /* Non Private Use High Surrogate */
+ ["\uD833", "\uD833"], /* Non Private Use High Surrogate */
+ ["\uD834", "\uD834"], /* Non Private Use High Surrogate */
+ ["\uD835", "\uD835"], /* Non Private Use High Surrogate */
+ ["\uD836", "\uD836"], /* Non Private Use High Surrogate */
+ ["\uD837", "\uD837"], /* Non Private Use High Surrogate */
+ ["\uD838", "\uD838"], /* Non Private Use High Surrogate */
+ ["\uD839", "\uD839"], /* Non Private Use High Surrogate */
+ ["\uD83A", "\uD83A"], /* Non Private Use High Surrogate */
+ ["\uD83B", "\uD83B"], /* Non Private Use High Surrogate */
+ ["\uD83C", "\uD83C"], /* Non Private Use High Surrogate */
+ ["\uD83D", "\uD83D"], /* Non Private Use High Surrogate */
+ ["\uD83E", "\uD83E"], /* Non Private Use High Surrogate */
+ ["\uD83F", "\uD83F"], /* Non Private Use High Surrogate */
+ ["\uD840", "\uD840"], /* Non Private Use High Surrogate */
+ ["\uD841", "\uD841"], /* Non Private Use High Surrogate */
+ ["\uD842", "\uD842"], /* Non Private Use High Surrogate */
+ ["\uD843", "\uD843"], /* Non Private Use High Surrogate */
+ ["\uD844", "\uD844"], /* Non Private Use High Surrogate */
+ ["\uD845", "\uD845"], /* Non Private Use High Surrogate */
+ ["\uD846", "\uD846"], /* Non Private Use High Surrogate */
+ ["\uD847", "\uD847"], /* Non Private Use High Surrogate */
+ ["\uD848", "\uD848"], /* Non Private Use High Surrogate */
+ ["\uD849", "\uD849"], /* Non Private Use High Surrogate */
+ ["\uD84A", "\uD84A"], /* Non Private Use High Surrogate */
+ ["\uD84B", "\uD84B"], /* Non Private Use High Surrogate */
+ ["\uD84C", "\uD84C"], /* Non Private Use High Surrogate */
+ ["\uD84D", "\uD84D"], /* Non Private Use High Surrogate */
+ ["\uD84E", "\uD84E"], /* Non Private Use High Surrogate */
+ ["\uD84F", "\uD84F"], /* Non Private Use High Surrogate */
+ ["\uD850", "\uD850"], /* Non Private Use High Surrogate */
+ ["\uD851", "\uD851"], /* Non Private Use High Surrogate */
+ ["\uD852", "\uD852"], /* Non Private Use High Surrogate */
+ ["\uD853", "\uD853"], /* Non Private Use High Surrogate */
+ ["\uD854", "\uD854"], /* Non Private Use High Surrogate */
+ ["\uD855", "\uD855"], /* Non Private Use High Surrogate */
+ ["\uD856", "\uD856"], /* Non Private Use High Surrogate */
+ ["\uD857", "\uD857"], /* Non Private Use High Surrogate */
+ ["\uD858", "\uD858"], /* Non Private Use High Surrogate */
+ ["\uD859", "\uD859"], /* Non Private Use High Surrogate */
+ ["\uD85A", "\uD85A"], /* Non Private Use High Surrogate */
+ ["\uD85B", "\uD85B"], /* Non Private Use High Surrogate */
+ ["\uD85C", "\uD85C"], /* Non Private Use High Surrogate */
+ ["\uD85D", "\uD85D"], /* Non Private Use High Surrogate */
+ ["\uD85E", "\uD85E"], /* Non Private Use High Surrogate */
+ ["\uD85F", "\uD85F"], /* Non Private Use High Surrogate */
+ ["\uD860", "\uD860"], /* Non Private Use High Surrogate */
+ ["\uD861", "\uD861"], /* Non Private Use High Surrogate */
+ ["\uD862", "\uD862"], /* Non Private Use High Surrogate */
+ ["\uD863", "\uD863"], /* Non Private Use High Surrogate */
+ ["\uD864", "\uD864"], /* Non Private Use High Surrogate */
+ ["\uD865", "\uD865"], /* Non Private Use High Surrogate */
+ ["\uD866", "\uD866"], /* Non Private Use High Surrogate */
+ ["\uD867", "\uD867"], /* Non Private Use High Surrogate */
+ ["\uD868", "\uD868"], /* Non Private Use High Surrogate */
+ ["\uD869", "\uD869"], /* Non Private Use High Surrogate */
+ ["\uD86A", "\uD86A"], /* Non Private Use High Surrogate */
+ ["\uD86B", "\uD86B"], /* Non Private Use High Surrogate */
+ ["\uD86C", "\uD86C"], /* Non Private Use High Surrogate */
+ ["\uD86D", "\uD86D"], /* Non Private Use High Surrogate */
+ ["\uD86E", "\uD86E"], /* Non Private Use High Surrogate */
+ ["\uD86F", "\uD86F"], /* Non Private Use High Surrogate */
+ ["\uD870", "\uD870"], /* Non Private Use High Surrogate */
+ ["\uD871", "\uD871"], /* Non Private Use High Surrogate */
+ ["\uD872", "\uD872"], /* Non Private Use High Surrogate */
+ ["\uD873", "\uD873"], /* Non Private Use High Surrogate */
+ ["\uD874", "\uD874"], /* Non Private Use High Surrogate */
+ ["\uD875", "\uD875"], /* Non Private Use High Surrogate */
+ ["\uD876", "\uD876"], /* Non Private Use High Surrogate */
+ ["\uD877", "\uD877"], /* Non Private Use High Surrogate */
+ ["\uD878", "\uD878"], /* Non Private Use High Surrogate */
+ ["\uD879", "\uD879"], /* Non Private Use High Surrogate */
+ ["\uD87A", "\uD87A"], /* Non Private Use High Surrogate */
+ ["\uD87B", "\uD87B"], /* Non Private Use High Surrogate */
+ ["\uD87C", "\uD87C"], /* Non Private Use High Surrogate */
+ ["\uD87D", "\uD87D"], /* Non Private Use High Surrogate */
+ ["\uD87E", "\uD87E"], /* Non Private Use High Surrogate */
+ ["\uD87F", "\uD87F"], /* Non Private Use High Surrogate */
+ ["\uD880", "\uD880"], /* Non Private Use High Surrogate */
+ ["\uD881", "\uD881"], /* Non Private Use High Surrogate */
+ ["\uD882", "\uD882"], /* Non Private Use High Surrogate */
+ ["\uD883", "\uD883"], /* Non Private Use High Surrogate */
+ ["\uD884", "\uD884"], /* Non Private Use High Surrogate */
+ ["\uD885", "\uD885"], /* Non Private Use High Surrogate */
+ ["\uD886", "\uD886"], /* Non Private Use High Surrogate */
+ ["\uD887", "\uD887"], /* Non Private Use High Surrogate */
+ ["\uD888", "\uD888"], /* Non Private Use High Surrogate */
+ ["\uD889", "\uD889"], /* Non Private Use High Surrogate */
+ ["\uD88A", "\uD88A"], /* Non Private Use High Surrogate */
+ ["\uD88B", "\uD88B"], /* Non Private Use High Surrogate */
+ ["\uD88C", "\uD88C"], /* Non Private Use High Surrogate */
+ ["\uD88D", "\uD88D"], /* Non Private Use High Surrogate */
+ ["\uD88E", "\uD88E"], /* Non Private Use High Surrogate */
+ ["\uD88F", "\uD88F"], /* Non Private Use High Surrogate */
+ ["\uD890", "\uD890"], /* Non Private Use High Surrogate */
+ ["\uD891", "\uD891"], /* Non Private Use High Surrogate */
+ ["\uD892", "\uD892"], /* Non Private Use High Surrogate */
+ ["\uD893", "\uD893"], /* Non Private Use High Surrogate */
+ ["\uD894", "\uD894"], /* Non Private Use High Surrogate */
+ ["\uD895", "\uD895"], /* Non Private Use High Surrogate */
+ ["\uD896", "\uD896"], /* Non Private Use High Surrogate */
+ ["\uD897", "\uD897"], /* Non Private Use High Surrogate */
+ ["\uD898", "\uD898"], /* Non Private Use High Surrogate */
+ ["\uD899", "\uD899"], /* Non Private Use High Surrogate */
+ ["\uD89A", "\uD89A"], /* Non Private Use High Surrogate */
+ ["\uD89B", "\uD89B"], /* Non Private Use High Surrogate */
+ ["\uD89C", "\uD89C"], /* Non Private Use High Surrogate */
+ ["\uD89D", "\uD89D"], /* Non Private Use High Surrogate */
+ ["\uD89E", "\uD89E"], /* Non Private Use High Surrogate */
+ ["\uD89F", "\uD89F"], /* Non Private Use High Surrogate */
+ ["\uD8A0", "\uD8A0"], /* Non Private Use High Surrogate */
+ ["\uD8A1", "\uD8A1"], /* Non Private Use High Surrogate */
+ ["\uD8A2", "\uD8A2"], /* Non Private Use High Surrogate */
+ ["\uD8A3", "\uD8A3"], /* Non Private Use High Surrogate */
+ ["\uD8A4", "\uD8A4"], /* Non Private Use High Surrogate */
+ ["\uD8A5", "\uD8A5"], /* Non Private Use High Surrogate */
+ ["\uD8A6", "\uD8A6"], /* Non Private Use High Surrogate */
+ ["\uD8A7", "\uD8A7"], /* Non Private Use High Surrogate */
+ ["\uD8A8", "\uD8A8"], /* Non Private Use High Surrogate */
+ ["\uD8A9", "\uD8A9"], /* Non Private Use High Surrogate */
+ ["\uD8AA", "\uD8AA"], /* Non Private Use High Surrogate */
+ ["\uD8AB", "\uD8AB"], /* Non Private Use High Surrogate */
+ ["\uD8AC", "\uD8AC"], /* Non Private Use High Surrogate */
+ ["\uD8AD", "\uD8AD"], /* Non Private Use High Surrogate */
+ ["\uD8AE", "\uD8AE"], /* Non Private Use High Surrogate */
+ ["\uD8AF", "\uD8AF"], /* Non Private Use High Surrogate */
+ ["\uD8B0", "\uD8B0"], /* Non Private Use High Surrogate */
+ ["\uD8B1", "\uD8B1"], /* Non Private Use High Surrogate */
+ ["\uD8B2", "\uD8B2"], /* Non Private Use High Surrogate */
+ ["\uD8B3", "\uD8B3"], /* Non Private Use High Surrogate */
+ ["\uD8B4", "\uD8B4"], /* Non Private Use High Surrogate */
+ ["\uD8B5", "\uD8B5"], /* Non Private Use High Surrogate */
+ ["\uD8B6", "\uD8B6"], /* Non Private Use High Surrogate */
+ ["\uD8B7", "\uD8B7"], /* Non Private Use High Surrogate */
+ ["\uD8B8", "\uD8B8"], /* Non Private Use High Surrogate */
+ ["\uD8B9", "\uD8B9"], /* Non Private Use High Surrogate */
+ ["\uD8BA", "\uD8BA"], /* Non Private Use High Surrogate */
+ ["\uD8BB", "\uD8BB"], /* Non Private Use High Surrogate */
+ ["\uD8BC", "\uD8BC"], /* Non Private Use High Surrogate */
+ ["\uD8BD", "\uD8BD"], /* Non Private Use High Surrogate */
+ ["\uD8BE", "\uD8BE"], /* Non Private Use High Surrogate */
+ ["\uD8BF", "\uD8BF"], /* Non Private Use High Surrogate */
+ ["\uD8C0", "\uD8C0"], /* Non Private Use High Surrogate */
+ ["\uD8C1", "\uD8C1"], /* Non Private Use High Surrogate */
+ ["\uD8C2", "\uD8C2"], /* Non Private Use High Surrogate */
+ ["\uD8C3", "\uD8C3"], /* Non Private Use High Surrogate */
+ ["\uD8C4", "\uD8C4"], /* Non Private Use High Surrogate */
+ ["\uD8C5", "\uD8C5"], /* Non Private Use High Surrogate */
+ ["\uD8C6", "\uD8C6"], /* Non Private Use High Surrogate */
+ ["\uD8C7", "\uD8C7"], /* Non Private Use High Surrogate */
+ ["\uD8C8", "\uD8C8"], /* Non Private Use High Surrogate */
+ ["\uD8C9", "\uD8C9"], /* Non Private Use High Surrogate */
+ ["\uD8CA", "\uD8CA"], /* Non Private Use High Surrogate */
+ ["\uD8CB", "\uD8CB"], /* Non Private Use High Surrogate */
+ ["\uD8CC", "\uD8CC"], /* Non Private Use High Surrogate */
+ ["\uD8CD", "\uD8CD"], /* Non Private Use High Surrogate */
+ ["\uD8CE", "\uD8CE"], /* Non Private Use High Surrogate */
+ ["\uD8CF", "\uD8CF"], /* Non Private Use High Surrogate */
+ ["\uD8D0", "\uD8D0"], /* Non Private Use High Surrogate */
+ ["\uD8D1", "\uD8D1"], /* Non Private Use High Surrogate */
+ ["\uD8D2", "\uD8D2"], /* Non Private Use High Surrogate */
+ ["\uD8D3", "\uD8D3"], /* Non Private Use High Surrogate */
+ ["\uD8D4", "\uD8D4"], /* Non Private Use High Surrogate */
+ ["\uD8D5", "\uD8D5"], /* Non Private Use High Surrogate */
+ ["\uD8D6", "\uD8D6"], /* Non Private Use High Surrogate */
+ ["\uD8D7", "\uD8D7"], /* Non Private Use High Surrogate */
+ ["\uD8D8", "\uD8D8"], /* Non Private Use High Surrogate */
+ ["\uD8D9", "\uD8D9"], /* Non Private Use High Surrogate */
+ ["\uD8DA", "\uD8DA"], /* Non Private Use High Surrogate */
+ ["\uD8DB", "\uD8DB"], /* Non Private Use High Surrogate */
+ ["\uD8DC", "\uD8DC"], /* Non Private Use High Surrogate */
+ ["\uD8DD", "\uD8DD"], /* Non Private Use High Surrogate */
+ ["\uD8DE", "\uD8DE"], /* Non Private Use High Surrogate */
+ ["\uD8DF", "\uD8DF"], /* Non Private Use High Surrogate */
+ ["\uD8E0", "\uD8E0"], /* Non Private Use High Surrogate */
+ ["\uD8E1", "\uD8E1"], /* Non Private Use High Surrogate */
+ ["\uD8E2", "\uD8E2"], /* Non Private Use High Surrogate */
+ ["\uD8E3", "\uD8E3"], /* Non Private Use High Surrogate */
+ ["\uD8E4", "\uD8E4"], /* Non Private Use High Surrogate */
+ ["\uD8E5", "\uD8E5"], /* Non Private Use High Surrogate */
+ ["\uD8E6", "\uD8E6"], /* Non Private Use High Surrogate */
+ ["\uD8E7", "\uD8E7"], /* Non Private Use High Surrogate */
+ ["\uD8E8", "\uD8E8"], /* Non Private Use High Surrogate */
+ ["\uD8E9", "\uD8E9"], /* Non Private Use High Surrogate */
+ ["\uD8EA", "\uD8EA"], /* Non Private Use High Surrogate */
+ ["\uD8EB", "\uD8EB"], /* Non Private Use High Surrogate */
+ ["\uD8EC", "\uD8EC"], /* Non Private Use High Surrogate */
+ ["\uD8ED", "\uD8ED"], /* Non Private Use High Surrogate */
+ ["\uD8EE", "\uD8EE"], /* Non Private Use High Surrogate */
+ ["\uD8EF", "\uD8EF"], /* Non Private Use High Surrogate */
+ ["\uD8F0", "\uD8F0"], /* Non Private Use High Surrogate */
+ ["\uD8F1", "\uD8F1"], /* Non Private Use High Surrogate */
+ ["\uD8F2", "\uD8F2"], /* Non Private Use High Surrogate */
+ ["\uD8F3", "\uD8F3"], /* Non Private Use High Surrogate */
+ ["\uD8F4", "\uD8F4"], /* Non Private Use High Surrogate */
+ ["\uD8F5", "\uD8F5"], /* Non Private Use High Surrogate */
+ ["\uD8F6", "\uD8F6"], /* Non Private Use High Surrogate */
+ ["\uD8F7", "\uD8F7"], /* Non Private Use High Surrogate */
+ ["\uD8F8", "\uD8F8"], /* Non Private Use High Surrogate */
+ ["\uD8F9", "\uD8F9"], /* Non Private Use High Surrogate */
+ ["\uD8FA", "\uD8FA"], /* Non Private Use High Surrogate */
+ ["\uD8FB", "\uD8FB"], /* Non Private Use High Surrogate */
+ ["\uD8FC", "\uD8FC"], /* Non Private Use High Surrogate */
+ ["\uD8FD", "\uD8FD"], /* Non Private Use High Surrogate */
+ ["\uD8FE", "\uD8FE"], /* Non Private Use High Surrogate */
+ ["\uD8FF", "\uD8FF"], /* Non Private Use High Surrogate */
+ ["\uD900", "\uD900"], /* Non Private Use High Surrogate */
+ ["\uD901", "\uD901"], /* Non Private Use High Surrogate */
+ ["\uD902", "\uD902"], /* Non Private Use High Surrogate */
+ ["\uD903", "\uD903"], /* Non Private Use High Surrogate */
+ ["\uD904", "\uD904"], /* Non Private Use High Surrogate */
+ ["\uD905", "\uD905"], /* Non Private Use High Surrogate */
+ ["\uD906", "\uD906"], /* Non Private Use High Surrogate */
+ ["\uD907", "\uD907"], /* Non Private Use High Surrogate */
+ ["\uD908", "\uD908"], /* Non Private Use High Surrogate */
+ ["\uD909", "\uD909"], /* Non Private Use High Surrogate */
+ ["\uD90A", "\uD90A"], /* Non Private Use High Surrogate */
+ ["\uD90B", "\uD90B"], /* Non Private Use High Surrogate */
+ ["\uD90C", "\uD90C"], /* Non Private Use High Surrogate */
+ ["\uD90D", "\uD90D"], /* Non Private Use High Surrogate */
+ ["\uD90E", "\uD90E"], /* Non Private Use High Surrogate */
+ ["\uD90F", "\uD90F"], /* Non Private Use High Surrogate */
+ ["\uD910", "\uD910"], /* Non Private Use High Surrogate */
+ ["\uD911", "\uD911"], /* Non Private Use High Surrogate */
+ ["\uD912", "\uD912"], /* Non Private Use High Surrogate */
+ ["\uD913", "\uD913"], /* Non Private Use High Surrogate */
+ ["\uD914", "\uD914"], /* Non Private Use High Surrogate */
+ ["\uD915", "\uD915"], /* Non Private Use High Surrogate */
+ ["\uD916", "\uD916"], /* Non Private Use High Surrogate */
+ ["\uD917", "\uD917"], /* Non Private Use High Surrogate */
+ ["\uD918", "\uD918"], /* Non Private Use High Surrogate */
+ ["\uD919", "\uD919"], /* Non Private Use High Surrogate */
+ ["\uD91A", "\uD91A"], /* Non Private Use High Surrogate */
+ ["\uD91B", "\uD91B"], /* Non Private Use High Surrogate */
+ ["\uD91C", "\uD91C"], /* Non Private Use High Surrogate */
+ ["\uD91D", "\uD91D"], /* Non Private Use High Surrogate */
+ ["\uD91E", "\uD91E"], /* Non Private Use High Surrogate */
+ ["\uD91F", "\uD91F"], /* Non Private Use High Surrogate */
+ ["\uD920", "\uD920"], /* Non Private Use High Surrogate */
+ ["\uD921", "\uD921"], /* Non Private Use High Surrogate */
+ ["\uD922", "\uD922"], /* Non Private Use High Surrogate */
+ ["\uD923", "\uD923"], /* Non Private Use High Surrogate */
+ ["\uD924", "\uD924"], /* Non Private Use High Surrogate */
+ ["\uD925", "\uD925"], /* Non Private Use High Surrogate */
+ ["\uD926", "\uD926"], /* Non Private Use High Surrogate */
+ ["\uD927", "\uD927"], /* Non Private Use High Surrogate */
+ ["\uD928", "\uD928"], /* Non Private Use High Surrogate */
+ ["\uD929", "\uD929"], /* Non Private Use High Surrogate */
+ ["\uD92A", "\uD92A"], /* Non Private Use High Surrogate */
+ ["\uD92B", "\uD92B"], /* Non Private Use High Surrogate */
+ ["\uD92C", "\uD92C"], /* Non Private Use High Surrogate */
+ ["\uD92D", "\uD92D"], /* Non Private Use High Surrogate */
+ ["\uD92E", "\uD92E"], /* Non Private Use High Surrogate */
+ ["\uD92F", "\uD92F"], /* Non Private Use High Surrogate */
+ ["\uD930", "\uD930"], /* Non Private Use High Surrogate */
+ ["\uD931", "\uD931"], /* Non Private Use High Surrogate */
+ ["\uD932", "\uD932"], /* Non Private Use High Surrogate */
+ ["\uD933", "\uD933"], /* Non Private Use High Surrogate */
+ ["\uD934", "\uD934"], /* Non Private Use High Surrogate */
+ ["\uD935", "\uD935"], /* Non Private Use High Surrogate */
+ ["\uD936", "\uD936"], /* Non Private Use High Surrogate */
+ ["\uD937", "\uD937"], /* Non Private Use High Surrogate */
+ ["\uD938", "\uD938"], /* Non Private Use High Surrogate */
+ ["\uD939", "\uD939"], /* Non Private Use High Surrogate */
+ ["\uD93A", "\uD93A"], /* Non Private Use High Surrogate */
+ ["\uD93B", "\uD93B"], /* Non Private Use High Surrogate */
+ ["\uD93C", "\uD93C"], /* Non Private Use High Surrogate */
+ ["\uD93D", "\uD93D"], /* Non Private Use High Surrogate */
+ ["\uD93E", "\uD93E"], /* Non Private Use High Surrogate */
+ ["\uD93F", "\uD93F"], /* Non Private Use High Surrogate */
+ ["\uD940", "\uD940"], /* Non Private Use High Surrogate */
+ ["\uD941", "\uD941"], /* Non Private Use High Surrogate */
+ ["\uD942", "\uD942"], /* Non Private Use High Surrogate */
+ ["\uD943", "\uD943"], /* Non Private Use High Surrogate */
+ ["\uD944", "\uD944"], /* Non Private Use High Surrogate */
+ ["\uD945", "\uD945"], /* Non Private Use High Surrogate */
+ ["\uD946", "\uD946"], /* Non Private Use High Surrogate */
+ ["\uD947", "\uD947"], /* Non Private Use High Surrogate */
+ ["\uD948", "\uD948"], /* Non Private Use High Surrogate */
+ ["\uD949", "\uD949"], /* Non Private Use High Surrogate */
+ ["\uD94A", "\uD94A"], /* Non Private Use High Surrogate */
+ ["\uD94B", "\uD94B"], /* Non Private Use High Surrogate */
+ ["\uD94C", "\uD94C"], /* Non Private Use High Surrogate */
+ ["\uD94D", "\uD94D"], /* Non Private Use High Surrogate */
+ ["\uD94E", "\uD94E"], /* Non Private Use High Surrogate */
+ ["\uD94F", "\uD94F"], /* Non Private Use High Surrogate */
+ ["\uD950", "\uD950"], /* Non Private Use High Surrogate */
+ ["\uD951", "\uD951"], /* Non Private Use High Surrogate */
+ ["\uD952", "\uD952"], /* Non Private Use High Surrogate */
+ ["\uD953", "\uD953"], /* Non Private Use High Surrogate */
+ ["\uD954", "\uD954"], /* Non Private Use High Surrogate */
+ ["\uD955", "\uD955"], /* Non Private Use High Surrogate */
+ ["\uD956", "\uD956"], /* Non Private Use High Surrogate */
+ ["\uD957", "\uD957"], /* Non Private Use High Surrogate */
+ ["\uD958", "\uD958"], /* Non Private Use High Surrogate */
+ ["\uD959", "\uD959"], /* Non Private Use High Surrogate */
+ ["\uD95A", "\uD95A"], /* Non Private Use High Surrogate */
+ ["\uD95B", "\uD95B"], /* Non Private Use High Surrogate */
+ ["\uD95C", "\uD95C"], /* Non Private Use High Surrogate */
+ ["\uD95D", "\uD95D"], /* Non Private Use High Surrogate */
+ ["\uD95E", "\uD95E"], /* Non Private Use High Surrogate */
+ ["\uD95F", "\uD95F"], /* Non Private Use High Surrogate */
+ ["\uD960", "\uD960"], /* Non Private Use High Surrogate */
+ ["\uD961", "\uD961"], /* Non Private Use High Surrogate */
+ ["\uD962", "\uD962"], /* Non Private Use High Surrogate */
+ ["\uD963", "\uD963"], /* Non Private Use High Surrogate */
+ ["\uD964", "\uD964"], /* Non Private Use High Surrogate */
+ ["\uD965", "\uD965"], /* Non Private Use High Surrogate */
+ ["\uD966", "\uD966"], /* Non Private Use High Surrogate */
+ ["\uD967", "\uD967"], /* Non Private Use High Surrogate */
+ ["\uD968", "\uD968"], /* Non Private Use High Surrogate */
+ ["\uD969", "\uD969"], /* Non Private Use High Surrogate */
+ ["\uD96A", "\uD96A"], /* Non Private Use High Surrogate */
+ ["\uD96B", "\uD96B"], /* Non Private Use High Surrogate */
+ ["\uD96C", "\uD96C"], /* Non Private Use High Surrogate */
+ ["\uD96D", "\uD96D"], /* Non Private Use High Surrogate */
+ ["\uD96E", "\uD96E"], /* Non Private Use High Surrogate */
+ ["\uD96F", "\uD96F"], /* Non Private Use High Surrogate */
+ ["\uD970", "\uD970"], /* Non Private Use High Surrogate */
+ ["\uD971", "\uD971"], /* Non Private Use High Surrogate */
+ ["\uD972", "\uD972"], /* Non Private Use High Surrogate */
+ ["\uD973", "\uD973"], /* Non Private Use High Surrogate */
+ ["\uD974", "\uD974"], /* Non Private Use High Surrogate */
+ ["\uD975", "\uD975"], /* Non Private Use High Surrogate */
+ ["\uD976", "\uD976"], /* Non Private Use High Surrogate */
+ ["\uD977", "\uD977"], /* Non Private Use High Surrogate */
+ ["\uD978", "\uD978"], /* Non Private Use High Surrogate */
+ ["\uD979", "\uD979"], /* Non Private Use High Surrogate */
+ ["\uD97A", "\uD97A"], /* Non Private Use High Surrogate */
+ ["\uD97B", "\uD97B"], /* Non Private Use High Surrogate */
+ ["\uD97C", "\uD97C"], /* Non Private Use High Surrogate */
+ ["\uD97D", "\uD97D"], /* Non Private Use High Surrogate */
+ ["\uD97E", "\uD97E"], /* Non Private Use High Surrogate */
+ ["\uD97F", "\uD97F"], /* Non Private Use High Surrogate */
+ ["\uD980", "\uD980"], /* Non Private Use High Surrogate */
+ ["\uD981", "\uD981"], /* Non Private Use High Surrogate */
+ ["\uD982", "\uD982"], /* Non Private Use High Surrogate */
+ ["\uD983", "\uD983"], /* Non Private Use High Surrogate */
+ ["\uD984", "\uD984"], /* Non Private Use High Surrogate */
+ ["\uD985", "\uD985"], /* Non Private Use High Surrogate */
+ ["\uD986", "\uD986"], /* Non Private Use High Surrogate */
+ ["\uD987", "\uD987"], /* Non Private Use High Surrogate */
+ ["\uD988", "\uD988"], /* Non Private Use High Surrogate */
+ ["\uD989", "\uD989"], /* Non Private Use High Surrogate */
+ ["\uD98A", "\uD98A"], /* Non Private Use High Surrogate */
+ ["\uD98B", "\uD98B"], /* Non Private Use High Surrogate */
+ ["\uD98C", "\uD98C"], /* Non Private Use High Surrogate */
+ ["\uD98D", "\uD98D"], /* Non Private Use High Surrogate */
+ ["\uD98E", "\uD98E"], /* Non Private Use High Surrogate */
+ ["\uD98F", "\uD98F"], /* Non Private Use High Surrogate */
+ ["\uD990", "\uD990"], /* Non Private Use High Surrogate */
+ ["\uD991", "\uD991"], /* Non Private Use High Surrogate */
+ ["\uD992", "\uD992"], /* Non Private Use High Surrogate */
+ ["\uD993", "\uD993"], /* Non Private Use High Surrogate */
+ ["\uD994", "\uD994"], /* Non Private Use High Surrogate */
+ ["\uD995", "\uD995"], /* Non Private Use High Surrogate */
+ ["\uD996", "\uD996"], /* Non Private Use High Surrogate */
+ ["\uD997", "\uD997"], /* Non Private Use High Surrogate */
+ ["\uD998", "\uD998"], /* Non Private Use High Surrogate */
+ ["\uD999", "\uD999"], /* Non Private Use High Surrogate */
+ ["\uD99A", "\uD99A"], /* Non Private Use High Surrogate */
+ ["\uD99B", "\uD99B"], /* Non Private Use High Surrogate */
+ ["\uD99C", "\uD99C"], /* Non Private Use High Surrogate */
+ ["\uD99D", "\uD99D"], /* Non Private Use High Surrogate */
+ ["\uD99E", "\uD99E"], /* Non Private Use High Surrogate */
+ ["\uD99F", "\uD99F"], /* Non Private Use High Surrogate */
+ ["\uD9A0", "\uD9A0"], /* Non Private Use High Surrogate */
+ ["\uD9A1", "\uD9A1"], /* Non Private Use High Surrogate */
+ ["\uD9A2", "\uD9A2"], /* Non Private Use High Surrogate */
+ ["\uD9A3", "\uD9A3"], /* Non Private Use High Surrogate */
+ ["\uD9A4", "\uD9A4"], /* Non Private Use High Surrogate */
+ ["\uD9A5", "\uD9A5"], /* Non Private Use High Surrogate */
+ ["\uD9A6", "\uD9A6"], /* Non Private Use High Surrogate */
+ ["\uD9A7", "\uD9A7"], /* Non Private Use High Surrogate */
+ ["\uD9A8", "\uD9A8"], /* Non Private Use High Surrogate */
+ ["\uD9A9", "\uD9A9"], /* Non Private Use High Surrogate */
+ ["\uD9AA", "\uD9AA"], /* Non Private Use High Surrogate */
+ ["\uD9AB", "\uD9AB"], /* Non Private Use High Surrogate */
+ ["\uD9AC", "\uD9AC"], /* Non Private Use High Surrogate */
+ ["\uD9AD", "\uD9AD"], /* Non Private Use High Surrogate */
+ ["\uD9AE", "\uD9AE"], /* Non Private Use High Surrogate */
+ ["\uD9AF", "\uD9AF"], /* Non Private Use High Surrogate */
+ ["\uD9B0", "\uD9B0"], /* Non Private Use High Surrogate */
+ ["\uD9B1", "\uD9B1"], /* Non Private Use High Surrogate */
+ ["\uD9B2", "\uD9B2"], /* Non Private Use High Surrogate */
+ ["\uD9B3", "\uD9B3"], /* Non Private Use High Surrogate */
+ ["\uD9B4", "\uD9B4"], /* Non Private Use High Surrogate */
+ ["\uD9B5", "\uD9B5"], /* Non Private Use High Surrogate */
+ ["\uD9B6", "\uD9B6"], /* Non Private Use High Surrogate */
+ ["\uD9B7", "\uD9B7"], /* Non Private Use High Surrogate */
+ ["\uD9B8", "\uD9B8"], /* Non Private Use High Surrogate */
+ ["\uD9B9", "\uD9B9"], /* Non Private Use High Surrogate */
+ ["\uD9BA", "\uD9BA"], /* Non Private Use High Surrogate */
+ ["\uD9BB", "\uD9BB"], /* Non Private Use High Surrogate */
+ ["\uD9BC", "\uD9BC"], /* Non Private Use High Surrogate */
+ ["\uD9BD", "\uD9BD"], /* Non Private Use High Surrogate */
+ ["\uD9BE", "\uD9BE"], /* Non Private Use High Surrogate */
+ ["\uD9BF", "\uD9BF"], /* Non Private Use High Surrogate */
+ ["\uD9C0", "\uD9C0"], /* Non Private Use High Surrogate */
+ ["\uD9C1", "\uD9C1"], /* Non Private Use High Surrogate */
+ ["\uD9C2", "\uD9C2"], /* Non Private Use High Surrogate */
+ ["\uD9C3", "\uD9C3"], /* Non Private Use High Surrogate */
+ ["\uD9C4", "\uD9C4"], /* Non Private Use High Surrogate */
+ ["\uD9C5", "\uD9C5"], /* Non Private Use High Surrogate */
+ ["\uD9C6", "\uD9C6"], /* Non Private Use High Surrogate */
+ ["\uD9C7", "\uD9C7"], /* Non Private Use High Surrogate */
+ ["\uD9C8", "\uD9C8"], /* Non Private Use High Surrogate */
+ ["\uD9C9", "\uD9C9"], /* Non Private Use High Surrogate */
+ ["\uD9CA", "\uD9CA"], /* Non Private Use High Surrogate */
+ ["\uD9CB", "\uD9CB"], /* Non Private Use High Surrogate */
+ ["\uD9CC", "\uD9CC"], /* Non Private Use High Surrogate */
+ ["\uD9CD", "\uD9CD"], /* Non Private Use High Surrogate */
+ ["\uD9CE", "\uD9CE"], /* Non Private Use High Surrogate */
+ ["\uD9CF", "\uD9CF"], /* Non Private Use High Surrogate */
+ ["\uD9D0", "\uD9D0"], /* Non Private Use High Surrogate */
+ ["\uD9D1", "\uD9D1"], /* Non Private Use High Surrogate */
+ ["\uD9D2", "\uD9D2"], /* Non Private Use High Surrogate */
+ ["\uD9D3", "\uD9D3"], /* Non Private Use High Surrogate */
+ ["\uD9D4", "\uD9D4"], /* Non Private Use High Surrogate */
+ ["\uD9D5", "\uD9D5"], /* Non Private Use High Surrogate */
+ ["\uD9D6", "\uD9D6"], /* Non Private Use High Surrogate */
+ ["\uD9D7", "\uD9D7"], /* Non Private Use High Surrogate */
+ ["\uD9D8", "\uD9D8"], /* Non Private Use High Surrogate */
+ ["\uD9D9", "\uD9D9"], /* Non Private Use High Surrogate */
+ ["\uD9DA", "\uD9DA"], /* Non Private Use High Surrogate */
+ ["\uD9DB", "\uD9DB"], /* Non Private Use High Surrogate */
+ ["\uD9DC", "\uD9DC"], /* Non Private Use High Surrogate */
+ ["\uD9DD", "\uD9DD"], /* Non Private Use High Surrogate */
+ ["\uD9DE", "\uD9DE"], /* Non Private Use High Surrogate */
+ ["\uD9DF", "\uD9DF"], /* Non Private Use High Surrogate */
+ ["\uD9E0", "\uD9E0"], /* Non Private Use High Surrogate */
+ ["\uD9E1", "\uD9E1"], /* Non Private Use High Surrogate */
+ ["\uD9E2", "\uD9E2"], /* Non Private Use High Surrogate */
+ ["\uD9E3", "\uD9E3"], /* Non Private Use High Surrogate */
+ ["\uD9E4", "\uD9E4"], /* Non Private Use High Surrogate */
+ ["\uD9E5", "\uD9E5"], /* Non Private Use High Surrogate */
+ ["\uD9E6", "\uD9E6"], /* Non Private Use High Surrogate */
+ ["\uD9E7", "\uD9E7"], /* Non Private Use High Surrogate */
+ ["\uD9E8", "\uD9E8"], /* Non Private Use High Surrogate */
+ ["\uD9E9", "\uD9E9"], /* Non Private Use High Surrogate */
+ ["\uD9EA", "\uD9EA"], /* Non Private Use High Surrogate */
+ ["\uD9EB", "\uD9EB"], /* Non Private Use High Surrogate */
+ ["\uD9EC", "\uD9EC"], /* Non Private Use High Surrogate */
+ ["\uD9ED", "\uD9ED"], /* Non Private Use High Surrogate */
+ ["\uD9EE", "\uD9EE"], /* Non Private Use High Surrogate */
+ ["\uD9EF", "\uD9EF"], /* Non Private Use High Surrogate */
+ ["\uD9F0", "\uD9F0"], /* Non Private Use High Surrogate */
+ ["\uD9F1", "\uD9F1"], /* Non Private Use High Surrogate */
+ ["\uD9F2", "\uD9F2"], /* Non Private Use High Surrogate */
+ ["\uD9F3", "\uD9F3"], /* Non Private Use High Surrogate */
+ ["\uD9F4", "\uD9F4"], /* Non Private Use High Surrogate */
+ ["\uD9F5", "\uD9F5"], /* Non Private Use High Surrogate */
+ ["\uD9F6", "\uD9F6"], /* Non Private Use High Surrogate */
+ ["\uD9F7", "\uD9F7"], /* Non Private Use High Surrogate */
+ ["\uD9F8", "\uD9F8"], /* Non Private Use High Surrogate */
+ ["\uD9F9", "\uD9F9"], /* Non Private Use High Surrogate */
+ ["\uD9FA", "\uD9FA"], /* Non Private Use High Surrogate */
+ ["\uD9FB", "\uD9FB"], /* Non Private Use High Surrogate */
+ ["\uD9FC", "\uD9FC"], /* Non Private Use High Surrogate */
+ ["\uD9FD", "\uD9FD"], /* Non Private Use High Surrogate */
+ ["\uD9FE", "\uD9FE"], /* Non Private Use High Surrogate */
+ ["\uD9FF", "\uD9FF"], /* Non Private Use High Surrogate */
+ ["\uDA00", "\uDA00"], /* Non Private Use High Surrogate */
+ ["\uDA01", "\uDA01"], /* Non Private Use High Surrogate */
+ ["\uDA02", "\uDA02"], /* Non Private Use High Surrogate */
+ ["\uDA03", "\uDA03"], /* Non Private Use High Surrogate */
+ ["\uDA04", "\uDA04"], /* Non Private Use High Surrogate */
+ ["\uDA05", "\uDA05"], /* Non Private Use High Surrogate */
+ ["\uDA06", "\uDA06"], /* Non Private Use High Surrogate */
+ ["\uDA07", "\uDA07"], /* Non Private Use High Surrogate */
+ ["\uDA08", "\uDA08"], /* Non Private Use High Surrogate */
+ ["\uDA09", "\uDA09"], /* Non Private Use High Surrogate */
+ ["\uDA0A", "\uDA0A"], /* Non Private Use High Surrogate */
+ ["\uDA0B", "\uDA0B"], /* Non Private Use High Surrogate */
+ ["\uDA0C", "\uDA0C"], /* Non Private Use High Surrogate */
+ ["\uDA0D", "\uDA0D"], /* Non Private Use High Surrogate */
+ ["\uDA0E", "\uDA0E"], /* Non Private Use High Surrogate */
+ ["\uDA0F", "\uDA0F"], /* Non Private Use High Surrogate */
+ ["\uDA10", "\uDA10"], /* Non Private Use High Surrogate */
+ ["\uDA11", "\uDA11"], /* Non Private Use High Surrogate */
+ ["\uDA12", "\uDA12"], /* Non Private Use High Surrogate */
+ ["\uDA13", "\uDA13"], /* Non Private Use High Surrogate */
+ ["\uDA14", "\uDA14"], /* Non Private Use High Surrogate */
+ ["\uDA15", "\uDA15"], /* Non Private Use High Surrogate */
+ ["\uDA16", "\uDA16"], /* Non Private Use High Surrogate */
+ ["\uDA17", "\uDA17"], /* Non Private Use High Surrogate */
+ ["\uDA18", "\uDA18"], /* Non Private Use High Surrogate */
+ ["\uDA19", "\uDA19"], /* Non Private Use High Surrogate */
+ ["\uDA1A", "\uDA1A"], /* Non Private Use High Surrogate */
+ ["\uDA1B", "\uDA1B"], /* Non Private Use High Surrogate */
+ ["\uDA1C", "\uDA1C"], /* Non Private Use High Surrogate */
+ ["\uDA1D", "\uDA1D"], /* Non Private Use High Surrogate */
+ ["\uDA1E", "\uDA1E"], /* Non Private Use High Surrogate */
+ ["\uDA1F", "\uDA1F"], /* Non Private Use High Surrogate */
+ ["\uDA20", "\uDA20"], /* Non Private Use High Surrogate */
+ ["\uDA21", "\uDA21"], /* Non Private Use High Surrogate */
+ ["\uDA22", "\uDA22"], /* Non Private Use High Surrogate */
+ ["\uDA23", "\uDA23"], /* Non Private Use High Surrogate */
+ ["\uDA24", "\uDA24"], /* Non Private Use High Surrogate */
+ ["\uDA25", "\uDA25"], /* Non Private Use High Surrogate */
+ ["\uDA26", "\uDA26"], /* Non Private Use High Surrogate */
+ ["\uDA27", "\uDA27"], /* Non Private Use High Surrogate */
+ ["\uDA28", "\uDA28"], /* Non Private Use High Surrogate */
+ ["\uDA29", "\uDA29"], /* Non Private Use High Surrogate */
+ ["\uDA2A", "\uDA2A"], /* Non Private Use High Surrogate */
+ ["\uDA2B", "\uDA2B"], /* Non Private Use High Surrogate */
+ ["\uDA2C", "\uDA2C"], /* Non Private Use High Surrogate */
+ ["\uDA2D", "\uDA2D"], /* Non Private Use High Surrogate */
+ ["\uDA2E", "\uDA2E"], /* Non Private Use High Surrogate */
+ ["\uDA2F", "\uDA2F"], /* Non Private Use High Surrogate */
+ ["\uDA30", "\uDA30"], /* Non Private Use High Surrogate */
+ ["\uDA31", "\uDA31"], /* Non Private Use High Surrogate */
+ ["\uDA32", "\uDA32"], /* Non Private Use High Surrogate */
+ ["\uDA33", "\uDA33"], /* Non Private Use High Surrogate */
+ ["\uDA34", "\uDA34"], /* Non Private Use High Surrogate */
+ ["\uDA35", "\uDA35"], /* Non Private Use High Surrogate */
+ ["\uDA36", "\uDA36"], /* Non Private Use High Surrogate */
+ ["\uDA37", "\uDA37"], /* Non Private Use High Surrogate */
+ ["\uDA38", "\uDA38"], /* Non Private Use High Surrogate */
+ ["\uDA39", "\uDA39"], /* Non Private Use High Surrogate */
+ ["\uDA3A", "\uDA3A"], /* Non Private Use High Surrogate */
+ ["\uDA3B", "\uDA3B"], /* Non Private Use High Surrogate */
+ ["\uDA3C", "\uDA3C"], /* Non Private Use High Surrogate */
+ ["\uDA3D", "\uDA3D"], /* Non Private Use High Surrogate */
+ ["\uDA3E", "\uDA3E"], /* Non Private Use High Surrogate */
+ ["\uDA3F", "\uDA3F"], /* Non Private Use High Surrogate */
+ ["\uDA40", "\uDA40"], /* Non Private Use High Surrogate */
+ ["\uDA41", "\uDA41"], /* Non Private Use High Surrogate */
+ ["\uDA42", "\uDA42"], /* Non Private Use High Surrogate */
+ ["\uDA43", "\uDA43"], /* Non Private Use High Surrogate */
+ ["\uDA44", "\uDA44"], /* Non Private Use High Surrogate */
+ ["\uDA45", "\uDA45"], /* Non Private Use High Surrogate */
+ ["\uDA46", "\uDA46"], /* Non Private Use High Surrogate */
+ ["\uDA47", "\uDA47"], /* Non Private Use High Surrogate */
+ ["\uDA48", "\uDA48"], /* Non Private Use High Surrogate */
+ ["\uDA49", "\uDA49"], /* Non Private Use High Surrogate */
+ ["\uDA4A", "\uDA4A"], /* Non Private Use High Surrogate */
+ ["\uDA4B", "\uDA4B"], /* Non Private Use High Surrogate */
+ ["\uDA4C", "\uDA4C"], /* Non Private Use High Surrogate */
+ ["\uDA4D", "\uDA4D"], /* Non Private Use High Surrogate */
+ ["\uDA4E", "\uDA4E"], /* Non Private Use High Surrogate */
+ ["\uDA4F", "\uDA4F"], /* Non Private Use High Surrogate */
+ ["\uDA50", "\uDA50"], /* Non Private Use High Surrogate */
+ ["\uDA51", "\uDA51"], /* Non Private Use High Surrogate */
+ ["\uDA52", "\uDA52"], /* Non Private Use High Surrogate */
+ ["\uDA53", "\uDA53"], /* Non Private Use High Surrogate */
+ ["\uDA54", "\uDA54"], /* Non Private Use High Surrogate */
+ ["\uDA55", "\uDA55"], /* Non Private Use High Surrogate */
+ ["\uDA56", "\uDA56"], /* Non Private Use High Surrogate */
+ ["\uDA57", "\uDA57"], /* Non Private Use High Surrogate */
+ ["\uDA58", "\uDA58"], /* Non Private Use High Surrogate */
+ ["\uDA59", "\uDA59"], /* Non Private Use High Surrogate */
+ ["\uDA5A", "\uDA5A"], /* Non Private Use High Surrogate */
+ ["\uDA5B", "\uDA5B"], /* Non Private Use High Surrogate */
+ ["\uDA5C", "\uDA5C"], /* Non Private Use High Surrogate */
+ ["\uDA5D", "\uDA5D"], /* Non Private Use High Surrogate */
+ ["\uDA5E", "\uDA5E"], /* Non Private Use High Surrogate */
+ ["\uDA5F", "\uDA5F"], /* Non Private Use High Surrogate */
+ ["\uDA60", "\uDA60"], /* Non Private Use High Surrogate */
+ ["\uDA61", "\uDA61"], /* Non Private Use High Surrogate */
+ ["\uDA62", "\uDA62"], /* Non Private Use High Surrogate */
+ ["\uDA63", "\uDA63"], /* Non Private Use High Surrogate */
+ ["\uDA64", "\uDA64"], /* Non Private Use High Surrogate */
+ ["\uDA65", "\uDA65"], /* Non Private Use High Surrogate */
+ ["\uDA66", "\uDA66"], /* Non Private Use High Surrogate */
+ ["\uDA67", "\uDA67"], /* Non Private Use High Surrogate */
+ ["\uDA68", "\uDA68"], /* Non Private Use High Surrogate */
+ ["\uDA69", "\uDA69"], /* Non Private Use High Surrogate */
+ ["\uDA6A", "\uDA6A"], /* Non Private Use High Surrogate */
+ ["\uDA6B", "\uDA6B"], /* Non Private Use High Surrogate */
+ ["\uDA6C", "\uDA6C"], /* Non Private Use High Surrogate */
+ ["\uDA6D", "\uDA6D"], /* Non Private Use High Surrogate */
+ ["\uDA6E", "\uDA6E"], /* Non Private Use High Surrogate */
+ ["\uDA6F", "\uDA6F"], /* Non Private Use High Surrogate */
+ ["\uDA70", "\uDA70"], /* Non Private Use High Surrogate */
+ ["\uDA71", "\uDA71"], /* Non Private Use High Surrogate */
+ ["\uDA72", "\uDA72"], /* Non Private Use High Surrogate */
+ ["\uDA73", "\uDA73"], /* Non Private Use High Surrogate */
+ ["\uDA74", "\uDA74"], /* Non Private Use High Surrogate */
+ ["\uDA75", "\uDA75"], /* Non Private Use High Surrogate */
+ ["\uDA76", "\uDA76"], /* Non Private Use High Surrogate */
+ ["\uDA77", "\uDA77"], /* Non Private Use High Surrogate */
+ ["\uDA78", "\uDA78"], /* Non Private Use High Surrogate */
+ ["\uDA79", "\uDA79"], /* Non Private Use High Surrogate */
+ ["\uDA7A", "\uDA7A"], /* Non Private Use High Surrogate */
+ ["\uDA7B", "\uDA7B"], /* Non Private Use High Surrogate */
+ ["\uDA7C", "\uDA7C"], /* Non Private Use High Surrogate */
+ ["\uDA7D", "\uDA7D"], /* Non Private Use High Surrogate */
+ ["\uDA7E", "\uDA7E"], /* Non Private Use High Surrogate */
+ ["\uDA7F", "\uDA7F"], /* Non Private Use High Surrogate */
+ ["\uDA80", "\uDA80"], /* Non Private Use High Surrogate */
+ ["\uDA81", "\uDA81"], /* Non Private Use High Surrogate */
+ ["\uDA82", "\uDA82"], /* Non Private Use High Surrogate */
+ ["\uDA83", "\uDA83"], /* Non Private Use High Surrogate */
+ ["\uDA84", "\uDA84"], /* Non Private Use High Surrogate */
+ ["\uDA85", "\uDA85"], /* Non Private Use High Surrogate */
+ ["\uDA86", "\uDA86"], /* Non Private Use High Surrogate */
+ ["\uDA87", "\uDA87"], /* Non Private Use High Surrogate */
+ ["\uDA88", "\uDA88"], /* Non Private Use High Surrogate */
+ ["\uDA89", "\uDA89"], /* Non Private Use High Surrogate */
+ ["\uDA8A", "\uDA8A"], /* Non Private Use High Surrogate */
+ ["\uDA8B", "\uDA8B"], /* Non Private Use High Surrogate */
+ ["\uDA8C", "\uDA8C"], /* Non Private Use High Surrogate */
+ ["\uDA8D", "\uDA8D"], /* Non Private Use High Surrogate */
+ ["\uDA8E", "\uDA8E"], /* Non Private Use High Surrogate */
+ ["\uDA8F", "\uDA8F"], /* Non Private Use High Surrogate */
+ ["\uDA90", "\uDA90"], /* Non Private Use High Surrogate */
+ ["\uDA91", "\uDA91"], /* Non Private Use High Surrogate */
+ ["\uDA92", "\uDA92"], /* Non Private Use High Surrogate */
+ ["\uDA93", "\uDA93"], /* Non Private Use High Surrogate */
+ ["\uDA94", "\uDA94"], /* Non Private Use High Surrogate */
+ ["\uDA95", "\uDA95"], /* Non Private Use High Surrogate */
+ ["\uDA96", "\uDA96"], /* Non Private Use High Surrogate */
+ ["\uDA97", "\uDA97"], /* Non Private Use High Surrogate */
+ ["\uDA98", "\uDA98"], /* Non Private Use High Surrogate */
+ ["\uDA99", "\uDA99"], /* Non Private Use High Surrogate */
+ ["\uDA9A", "\uDA9A"], /* Non Private Use High Surrogate */
+ ["\uDA9B", "\uDA9B"], /* Non Private Use High Surrogate */
+ ["\uDA9C", "\uDA9C"], /* Non Private Use High Surrogate */
+ ["\uDA9D", "\uDA9D"], /* Non Private Use High Surrogate */
+ ["\uDA9E", "\uDA9E"], /* Non Private Use High Surrogate */
+ ["\uDA9F", "\uDA9F"], /* Non Private Use High Surrogate */
+ ["\uDAA0", "\uDAA0"], /* Non Private Use High Surrogate */
+ ["\uDAA1", "\uDAA1"], /* Non Private Use High Surrogate */
+ ["\uDAA2", "\uDAA2"], /* Non Private Use High Surrogate */
+ ["\uDAA3", "\uDAA3"], /* Non Private Use High Surrogate */
+ ["\uDAA4", "\uDAA4"], /* Non Private Use High Surrogate */
+ ["\uDAA5", "\uDAA5"], /* Non Private Use High Surrogate */
+ ["\uDAA6", "\uDAA6"], /* Non Private Use High Surrogate */
+ ["\uDAA7", "\uDAA7"], /* Non Private Use High Surrogate */
+ ["\uDAA8", "\uDAA8"], /* Non Private Use High Surrogate */
+ ["\uDAA9", "\uDAA9"], /* Non Private Use High Surrogate */
+ ["\uDAAA", "\uDAAA"], /* Non Private Use High Surrogate */
+ ["\uDAAB", "\uDAAB"], /* Non Private Use High Surrogate */
+ ["\uDAAC", "\uDAAC"], /* Non Private Use High Surrogate */
+ ["\uDAAD", "\uDAAD"], /* Non Private Use High Surrogate */
+ ["\uDAAE", "\uDAAE"], /* Non Private Use High Surrogate */
+ ["\uDAAF", "\uDAAF"], /* Non Private Use High Surrogate */
+ ["\uDAB0", "\uDAB0"], /* Non Private Use High Surrogate */
+ ["\uDAB1", "\uDAB1"], /* Non Private Use High Surrogate */
+ ["\uDAB2", "\uDAB2"], /* Non Private Use High Surrogate */
+ ["\uDAB3", "\uDAB3"], /* Non Private Use High Surrogate */
+ ["\uDAB4", "\uDAB4"], /* Non Private Use High Surrogate */
+ ["\uDAB5", "\uDAB5"], /* Non Private Use High Surrogate */
+ ["\uDAB6", "\uDAB6"], /* Non Private Use High Surrogate */
+ ["\uDAB7", "\uDAB7"], /* Non Private Use High Surrogate */
+ ["\uDAB8", "\uDAB8"], /* Non Private Use High Surrogate */
+ ["\uDAB9", "\uDAB9"], /* Non Private Use High Surrogate */
+ ["\uDABA", "\uDABA"], /* Non Private Use High Surrogate */
+ ["\uDABB", "\uDABB"], /* Non Private Use High Surrogate */
+ ["\uDABC", "\uDABC"], /* Non Private Use High Surrogate */
+ ["\uDABD", "\uDABD"], /* Non Private Use High Surrogate */
+ ["\uDABE", "\uDABE"], /* Non Private Use High Surrogate */
+ ["\uDABF", "\uDABF"], /* Non Private Use High Surrogate */
+ ["\uDAC0", "\uDAC0"], /* Non Private Use High Surrogate */
+ ["\uDAC1", "\uDAC1"], /* Non Private Use High Surrogate */
+ ["\uDAC2", "\uDAC2"], /* Non Private Use High Surrogate */
+ ["\uDAC3", "\uDAC3"], /* Non Private Use High Surrogate */
+ ["\uDAC4", "\uDAC4"], /* Non Private Use High Surrogate */
+ ["\uDAC5", "\uDAC5"], /* Non Private Use High Surrogate */
+ ["\uDAC6", "\uDAC6"], /* Non Private Use High Surrogate */
+ ["\uDAC7", "\uDAC7"], /* Non Private Use High Surrogate */
+ ["\uDAC8", "\uDAC8"], /* Non Private Use High Surrogate */
+ ["\uDAC9", "\uDAC9"], /* Non Private Use High Surrogate */
+ ["\uDACA", "\uDACA"], /* Non Private Use High Surrogate */
+ ["\uDACB", "\uDACB"], /* Non Private Use High Surrogate */
+ ["\uDACC", "\uDACC"], /* Non Private Use High Surrogate */
+ ["\uDACD", "\uDACD"], /* Non Private Use High Surrogate */
+ ["\uDACE", "\uDACE"], /* Non Private Use High Surrogate */
+ ["\uDACF", "\uDACF"], /* Non Private Use High Surrogate */
+ ["\uDAD0", "\uDAD0"], /* Non Private Use High Surrogate */
+ ["\uDAD1", "\uDAD1"], /* Non Private Use High Surrogate */
+ ["\uDAD2", "\uDAD2"], /* Non Private Use High Surrogate */
+ ["\uDAD3", "\uDAD3"], /* Non Private Use High Surrogate */
+ ["\uDAD4", "\uDAD4"], /* Non Private Use High Surrogate */
+ ["\uDAD5", "\uDAD5"], /* Non Private Use High Surrogate */
+ ["\uDAD6", "\uDAD6"], /* Non Private Use High Surrogate */
+ ["\uDAD7", "\uDAD7"], /* Non Private Use High Surrogate */
+ ["\uDAD8", "\uDAD8"], /* Non Private Use High Surrogate */
+ ["\uDAD9", "\uDAD9"], /* Non Private Use High Surrogate */
+ ["\uDADA", "\uDADA"], /* Non Private Use High Surrogate */
+ ["\uDADB", "\uDADB"], /* Non Private Use High Surrogate */
+ ["\uDADC", "\uDADC"], /* Non Private Use High Surrogate */
+ ["\uDADD", "\uDADD"], /* Non Private Use High Surrogate */
+ ["\uDADE", "\uDADE"], /* Non Private Use High Surrogate */
+ ["\uDADF", "\uDADF"], /* Non Private Use High Surrogate */
+ ["\uDAE0", "\uDAE0"], /* Non Private Use High Surrogate */
+ ["\uDAE1", "\uDAE1"], /* Non Private Use High Surrogate */
+ ["\uDAE2", "\uDAE2"], /* Non Private Use High Surrogate */
+ ["\uDAE3", "\uDAE3"], /* Non Private Use High Surrogate */
+ ["\uDAE4", "\uDAE4"], /* Non Private Use High Surrogate */
+ ["\uDAE5", "\uDAE5"], /* Non Private Use High Surrogate */
+ ["\uDAE6", "\uDAE6"], /* Non Private Use High Surrogate */
+ ["\uDAE7", "\uDAE7"], /* Non Private Use High Surrogate */
+ ["\uDAE8", "\uDAE8"], /* Non Private Use High Surrogate */
+ ["\uDAE9", "\uDAE9"], /* Non Private Use High Surrogate */
+ ["\uDAEA", "\uDAEA"], /* Non Private Use High Surrogate */
+ ["\uDAEB", "\uDAEB"], /* Non Private Use High Surrogate */
+ ["\uDAEC", "\uDAEC"], /* Non Private Use High Surrogate */
+ ["\uDAED", "\uDAED"], /* Non Private Use High Surrogate */
+ ["\uDAEE", "\uDAEE"], /* Non Private Use High Surrogate */
+ ["\uDAEF", "\uDAEF"], /* Non Private Use High Surrogate */
+ ["\uDAF0", "\uDAF0"], /* Non Private Use High Surrogate */
+ ["\uDAF1", "\uDAF1"], /* Non Private Use High Surrogate */
+ ["\uDAF2", "\uDAF2"], /* Non Private Use High Surrogate */
+ ["\uDAF3", "\uDAF3"], /* Non Private Use High Surrogate */
+ ["\uDAF4", "\uDAF4"], /* Non Private Use High Surrogate */
+ ["\uDAF5", "\uDAF5"], /* Non Private Use High Surrogate */
+ ["\uDAF6", "\uDAF6"], /* Non Private Use High Surrogate */
+ ["\uDAF7", "\uDAF7"], /* Non Private Use High Surrogate */
+ ["\uDAF8", "\uDAF8"], /* Non Private Use High Surrogate */
+ ["\uDAF9", "\uDAF9"], /* Non Private Use High Surrogate */
+ ["\uDAFA", "\uDAFA"], /* Non Private Use High Surrogate */
+ ["\uDAFB", "\uDAFB"], /* Non Private Use High Surrogate */
+ ["\uDAFC", "\uDAFC"], /* Non Private Use High Surrogate */
+ ["\uDAFD", "\uDAFD"], /* Non Private Use High Surrogate */
+ ["\uDAFE", "\uDAFE"], /* Non Private Use High Surrogate */
+ ["\uDAFF", "\uDAFF"], /* Non Private Use High Surrogate */
+ ["\uDB00", "\uDB00"], /* Non Private Use High Surrogate */
+ ["\uDB01", "\uDB01"], /* Non Private Use High Surrogate */
+ ["\uDB02", "\uDB02"], /* Non Private Use High Surrogate */
+ ["\uDB03", "\uDB03"], /* Non Private Use High Surrogate */
+ ["\uDB04", "\uDB04"], /* Non Private Use High Surrogate */
+ ["\uDB05", "\uDB05"], /* Non Private Use High Surrogate */
+ ["\uDB06", "\uDB06"], /* Non Private Use High Surrogate */
+ ["\uDB07", "\uDB07"], /* Non Private Use High Surrogate */
+ ["\uDB08", "\uDB08"], /* Non Private Use High Surrogate */
+ ["\uDB09", "\uDB09"], /* Non Private Use High Surrogate */
+ ["\uDB0A", "\uDB0A"], /* Non Private Use High Surrogate */
+ ["\uDB0B", "\uDB0B"], /* Non Private Use High Surrogate */
+ ["\uDB0C", "\uDB0C"], /* Non Private Use High Surrogate */
+ ["\uDB0D", "\uDB0D"], /* Non Private Use High Surrogate */
+ ["\uDB0E", "\uDB0E"], /* Non Private Use High Surrogate */
+ ["\uDB0F", "\uDB0F"], /* Non Private Use High Surrogate */
+ ["\uDB10", "\uDB10"], /* Non Private Use High Surrogate */
+ ["\uDB11", "\uDB11"], /* Non Private Use High Surrogate */
+ ["\uDB12", "\uDB12"], /* Non Private Use High Surrogate */
+ ["\uDB13", "\uDB13"], /* Non Private Use High Surrogate */
+ ["\uDB14", "\uDB14"], /* Non Private Use High Surrogate */
+ ["\uDB15", "\uDB15"], /* Non Private Use High Surrogate */
+ ["\uDB16", "\uDB16"], /* Non Private Use High Surrogate */
+ ["\uDB17", "\uDB17"], /* Non Private Use High Surrogate */
+ ["\uDB18", "\uDB18"], /* Non Private Use High Surrogate */
+ ["\uDB19", "\uDB19"], /* Non Private Use High Surrogate */
+ ["\uDB1A", "\uDB1A"], /* Non Private Use High Surrogate */
+ ["\uDB1B", "\uDB1B"], /* Non Private Use High Surrogate */
+ ["\uDB1C", "\uDB1C"], /* Non Private Use High Surrogate */
+ ["\uDB1D", "\uDB1D"], /* Non Private Use High Surrogate */
+ ["\uDB1E", "\uDB1E"], /* Non Private Use High Surrogate */
+ ["\uDB1F", "\uDB1F"], /* Non Private Use High Surrogate */
+ ["\uDB20", "\uDB20"], /* Non Private Use High Surrogate */
+ ["\uDB21", "\uDB21"], /* Non Private Use High Surrogate */
+ ["\uDB22", "\uDB22"], /* Non Private Use High Surrogate */
+ ["\uDB23", "\uDB23"], /* Non Private Use High Surrogate */
+ ["\uDB24", "\uDB24"], /* Non Private Use High Surrogate */
+ ["\uDB25", "\uDB25"], /* Non Private Use High Surrogate */
+ ["\uDB26", "\uDB26"], /* Non Private Use High Surrogate */
+ ["\uDB27", "\uDB27"], /* Non Private Use High Surrogate */
+ ["\uDB28", "\uDB28"], /* Non Private Use High Surrogate */
+ ["\uDB29", "\uDB29"], /* Non Private Use High Surrogate */
+ ["\uDB2A", "\uDB2A"], /* Non Private Use High Surrogate */
+ ["\uDB2B", "\uDB2B"], /* Non Private Use High Surrogate */
+ ["\uDB2C", "\uDB2C"], /* Non Private Use High Surrogate */
+ ["\uDB2D", "\uDB2D"], /* Non Private Use High Surrogate */
+ ["\uDB2E", "\uDB2E"], /* Non Private Use High Surrogate */
+ ["\uDB2F", "\uDB2F"], /* Non Private Use High Surrogate */
+ ["\uDB30", "\uDB30"], /* Non Private Use High Surrogate */
+ ["\uDB31", "\uDB31"], /* Non Private Use High Surrogate */
+ ["\uDB32", "\uDB32"], /* Non Private Use High Surrogate */
+ ["\uDB33", "\uDB33"], /* Non Private Use High Surrogate */
+ ["\uDB34", "\uDB34"], /* Non Private Use High Surrogate */
+ ["\uDB35", "\uDB35"], /* Non Private Use High Surrogate */
+ ["\uDB36", "\uDB36"], /* Non Private Use High Surrogate */
+ ["\uDB37", "\uDB37"], /* Non Private Use High Surrogate */
+ ["\uDB38", "\uDB38"], /* Non Private Use High Surrogate */
+ ["\uDB39", "\uDB39"], /* Non Private Use High Surrogate */
+ ["\uDB3A", "\uDB3A"], /* Non Private Use High Surrogate */
+ ["\uDB3B", "\uDB3B"], /* Non Private Use High Surrogate */
+ ["\uDB3C", "\uDB3C"], /* Non Private Use High Surrogate */
+ ["\uDB3D", "\uDB3D"], /* Non Private Use High Surrogate */
+ ["\uDB3E", "\uDB3E"], /* Non Private Use High Surrogate */
+ ["\uDB3F", "\uDB3F"], /* Non Private Use High Surrogate */
+ ["\uDB40", "\uDB40"], /* Non Private Use High Surrogate */
+ ["\uDB41", "\uDB41"], /* Non Private Use High Surrogate */
+ ["\uDB42", "\uDB42"], /* Non Private Use High Surrogate */
+ ["\uDB43", "\uDB43"], /* Non Private Use High Surrogate */
+ ["\uDB44", "\uDB44"], /* Non Private Use High Surrogate */
+ ["\uDB45", "\uDB45"], /* Non Private Use High Surrogate */
+ ["\uDB46", "\uDB46"], /* Non Private Use High Surrogate */
+ ["\uDB47", "\uDB47"], /* Non Private Use High Surrogate */
+ ["\uDB48", "\uDB48"], /* Non Private Use High Surrogate */
+ ["\uDB49", "\uDB49"], /* Non Private Use High Surrogate */
+ ["\uDB4A", "\uDB4A"], /* Non Private Use High Surrogate */
+ ["\uDB4B", "\uDB4B"], /* Non Private Use High Surrogate */
+ ["\uDB4C", "\uDB4C"], /* Non Private Use High Surrogate */
+ ["\uDB4D", "\uDB4D"], /* Non Private Use High Surrogate */
+ ["\uDB4E", "\uDB4E"], /* Non Private Use High Surrogate */
+ ["\uDB4F", "\uDB4F"], /* Non Private Use High Surrogate */
+ ["\uDB50", "\uDB50"], /* Non Private Use High Surrogate */
+ ["\uDB51", "\uDB51"], /* Non Private Use High Surrogate */
+ ["\uDB52", "\uDB52"], /* Non Private Use High Surrogate */
+ ["\uDB53", "\uDB53"], /* Non Private Use High Surrogate */
+ ["\uDB54", "\uDB54"], /* Non Private Use High Surrogate */
+ ["\uDB55", "\uDB55"], /* Non Private Use High Surrogate */
+ ["\uDB56", "\uDB56"], /* Non Private Use High Surrogate */
+ ["\uDB57", "\uDB57"], /* Non Private Use High Surrogate */
+ ["\uDB58", "\uDB58"], /* Non Private Use High Surrogate */
+ ["\uDB59", "\uDB59"], /* Non Private Use High Surrogate */
+ ["\uDB5A", "\uDB5A"], /* Non Private Use High Surrogate */
+ ["\uDB5B", "\uDB5B"], /* Non Private Use High Surrogate */
+ ["\uDB5C", "\uDB5C"], /* Non Private Use High Surrogate */
+ ["\uDB5D", "\uDB5D"], /* Non Private Use High Surrogate */
+ ["\uDB5E", "\uDB5E"], /* Non Private Use High Surrogate */
+ ["\uDB5F", "\uDB5F"], /* Non Private Use High Surrogate */
+ ["\uDB60", "\uDB60"], /* Non Private Use High Surrogate */
+ ["\uDB61", "\uDB61"], /* Non Private Use High Surrogate */
+ ["\uDB62", "\uDB62"], /* Non Private Use High Surrogate */
+ ["\uDB63", "\uDB63"], /* Non Private Use High Surrogate */
+ ["\uDB64", "\uDB64"], /* Non Private Use High Surrogate */
+ ["\uDB65", "\uDB65"], /* Non Private Use High Surrogate */
+ ["\uDB66", "\uDB66"], /* Non Private Use High Surrogate */
+ ["\uDB67", "\uDB67"], /* Non Private Use High Surrogate */
+ ["\uDB68", "\uDB68"], /* Non Private Use High Surrogate */
+ ["\uDB69", "\uDB69"], /* Non Private Use High Surrogate */
+ ["\uDB6A", "\uDB6A"], /* Non Private Use High Surrogate */
+ ["\uDB6B", "\uDB6B"], /* Non Private Use High Surrogate */
+ ["\uDB6C", "\uDB6C"], /* Non Private Use High Surrogate */
+ ["\uDB6D", "\uDB6D"], /* Non Private Use High Surrogate */
+ ["\uDB6E", "\uDB6E"], /* Non Private Use High Surrogate */
+ ["\uDB6F", "\uDB6F"], /* Non Private Use High Surrogate */
+ ["\uDB70", "\uDB70"], /* Non Private Use High Surrogate */
+ ["\uDB71", "\uDB71"], /* Non Private Use High Surrogate */
+ ["\uDB72", "\uDB72"], /* Non Private Use High Surrogate */
+ ["\uDB73", "\uDB73"], /* Non Private Use High Surrogate */
+ ["\uDB74", "\uDB74"], /* Non Private Use High Surrogate */
+ ["\uDB75", "\uDB75"], /* Non Private Use High Surrogate */
+ ["\uDB76", "\uDB76"], /* Non Private Use High Surrogate */
+ ["\uDB77", "\uDB77"], /* Non Private Use High Surrogate */
+ ["\uDB78", "\uDB78"], /* Non Private Use High Surrogate */
+ ["\uDB79", "\uDB79"], /* Non Private Use High Surrogate */
+ ["\uDB7A", "\uDB7A"], /* Non Private Use High Surrogate */
+ ["\uDB7B", "\uDB7B"], /* Non Private Use High Surrogate */
+ ["\uDB7C", "\uDB7C"], /* Non Private Use High Surrogate */
+ ["\uDB7D", "\uDB7D"], /* Non Private Use High Surrogate */
+ ["\uDB7E", "\uDB7E"], /* Non Private Use High Surrogate */
+ ["\uDB7F", "\uDB7F"], /* Non Private Use High Surrogate */
+ ["\uDB80", "\uDB80"], /* Private Use High Surrogate */
+ ["\uDB81", "\uDB81"], /* Private Use High Surrogate */
+ ["\uDB82", "\uDB82"], /* Private Use High Surrogate */
+ ["\uDB83", "\uDB83"], /* Private Use High Surrogate */
+ ["\uDB84", "\uDB84"], /* Private Use High Surrogate */
+ ["\uDB85", "\uDB85"], /* Private Use High Surrogate */
+ ["\uDB86", "\uDB86"], /* Private Use High Surrogate */
+ ["\uDB87", "\uDB87"], /* Private Use High Surrogate */
+ ["\uDB88", "\uDB88"], /* Private Use High Surrogate */
+ ["\uDB89", "\uDB89"], /* Private Use High Surrogate */
+ ["\uDB8A", "\uDB8A"], /* Private Use High Surrogate */
+ ["\uDB8B", "\uDB8B"], /* Private Use High Surrogate */
+ ["\uDB8C", "\uDB8C"], /* Private Use High Surrogate */
+ ["\uDB8D", "\uDB8D"], /* Private Use High Surrogate */
+ ["\uDB8E", "\uDB8E"], /* Private Use High Surrogate */
+ ["\uDB8F", "\uDB8F"], /* Private Use High Surrogate */
+ ["\uDB90", "\uDB90"], /* Private Use High Surrogate */
+ ["\uDB91", "\uDB91"], /* Private Use High Surrogate */
+ ["\uDB92", "\uDB92"], /* Private Use High Surrogate */
+ ["\uDB93", "\uDB93"], /* Private Use High Surrogate */
+ ["\uDB94", "\uDB94"], /* Private Use High Surrogate */
+ ["\uDB95", "\uDB95"], /* Private Use High Surrogate */
+ ["\uDB96", "\uDB96"], /* Private Use High Surrogate */
+ ["\uDB97", "\uDB97"], /* Private Use High Surrogate */
+ ["\uDB98", "\uDB98"], /* Private Use High Surrogate */
+ ["\uDB99", "\uDB99"], /* Private Use High Surrogate */
+ ["\uDB9A", "\uDB9A"], /* Private Use High Surrogate */
+ ["\uDB9B", "\uDB9B"], /* Private Use High Surrogate */
+ ["\uDB9C", "\uDB9C"], /* Private Use High Surrogate */
+ ["\uDB9D", "\uDB9D"], /* Private Use High Surrogate */
+ ["\uDB9E", "\uDB9E"], /* Private Use High Surrogate */
+ ["\uDB9F", "\uDB9F"], /* Private Use High Surrogate */
+ ["\uDBA0", "\uDBA0"], /* Private Use High Surrogate */
+ ["\uDBA1", "\uDBA1"], /* Private Use High Surrogate */
+ ["\uDBA2", "\uDBA2"], /* Private Use High Surrogate */
+ ["\uDBA3", "\uDBA3"], /* Private Use High Surrogate */
+ ["\uDBA4", "\uDBA4"], /* Private Use High Surrogate */
+ ["\uDBA5", "\uDBA5"], /* Private Use High Surrogate */
+ ["\uDBA6", "\uDBA6"], /* Private Use High Surrogate */
+ ["\uDBA7", "\uDBA7"], /* Private Use High Surrogate */
+ ["\uDBA8", "\uDBA8"], /* Private Use High Surrogate */
+ ["\uDBA9", "\uDBA9"], /* Private Use High Surrogate */
+ ["\uDBAA", "\uDBAA"], /* Private Use High Surrogate */
+ ["\uDBAB", "\uDBAB"], /* Private Use High Surrogate */
+ ["\uDBAC", "\uDBAC"], /* Private Use High Surrogate */
+ ["\uDBAD", "\uDBAD"], /* Private Use High Surrogate */
+ ["\uDBAE", "\uDBAE"], /* Private Use High Surrogate */
+ ["\uDBAF", "\uDBAF"], /* Private Use High Surrogate */
+ ["\uDBB0", "\uDBB0"], /* Private Use High Surrogate */
+ ["\uDBB1", "\uDBB1"], /* Private Use High Surrogate */
+ ["\uDBB2", "\uDBB2"], /* Private Use High Surrogate */
+ ["\uDBB3", "\uDBB3"], /* Private Use High Surrogate */
+ ["\uDBB4", "\uDBB4"], /* Private Use High Surrogate */
+ ["\uDBB5", "\uDBB5"], /* Private Use High Surrogate */
+ ["\uDBB6", "\uDBB6"], /* Private Use High Surrogate */
+ ["\uDBB7", "\uDBB7"], /* Private Use High Surrogate */
+ ["\uDBB8", "\uDBB8"], /* Private Use High Surrogate */
+ ["\uDBB9", "\uDBB9"], /* Private Use High Surrogate */
+ ["\uDBBA", "\uDBBA"], /* Private Use High Surrogate */
+ ["\uDBBB", "\uDBBB"], /* Private Use High Surrogate */
+ ["\uDBBC", "\uDBBC"], /* Private Use High Surrogate */
+ ["\uDBBD", "\uDBBD"], /* Private Use High Surrogate */
+ ["\uDBBE", "\uDBBE"], /* Private Use High Surrogate */
+ ["\uDBBF", "\uDBBF"], /* Private Use High Surrogate */
+ ["\uDBC0", "\uDBC0"], /* Private Use High Surrogate */
+ ["\uDBC1", "\uDBC1"], /* Private Use High Surrogate */
+ ["\uDBC2", "\uDBC2"], /* Private Use High Surrogate */
+ ["\uDBC3", "\uDBC3"], /* Private Use High Surrogate */
+ ["\uDBC4", "\uDBC4"], /* Private Use High Surrogate */
+ ["\uDBC5", "\uDBC5"], /* Private Use High Surrogate */
+ ["\uDBC6", "\uDBC6"], /* Private Use High Surrogate */
+ ["\uDBC7", "\uDBC7"], /* Private Use High Surrogate */
+ ["\uDBC8", "\uDBC8"], /* Private Use High Surrogate */
+ ["\uDBC9", "\uDBC9"], /* Private Use High Surrogate */
+ ["\uDBCA", "\uDBCA"], /* Private Use High Surrogate */
+ ["\uDBCB", "\uDBCB"], /* Private Use High Surrogate */
+ ["\uDBCC", "\uDBCC"], /* Private Use High Surrogate */
+ ["\uDBCD", "\uDBCD"], /* Private Use High Surrogate */
+ ["\uDBCE", "\uDBCE"], /* Private Use High Surrogate */
+ ["\uDBCF", "\uDBCF"], /* Private Use High Surrogate */
+ ["\uDBD0", "\uDBD0"], /* Private Use High Surrogate */
+ ["\uDBD1", "\uDBD1"], /* Private Use High Surrogate */
+ ["\uDBD2", "\uDBD2"], /* Private Use High Surrogate */
+ ["\uDBD3", "\uDBD3"], /* Private Use High Surrogate */
+ ["\uDBD4", "\uDBD4"], /* Private Use High Surrogate */
+ ["\uDBD5", "\uDBD5"], /* Private Use High Surrogate */
+ ["\uDBD6", "\uDBD6"], /* Private Use High Surrogate */
+ ["\uDBD7", "\uDBD7"], /* Private Use High Surrogate */
+ ["\uDBD8", "\uDBD8"], /* Private Use High Surrogate */
+ ["\uDBD9", "\uDBD9"], /* Private Use High Surrogate */
+ ["\uDBDA", "\uDBDA"], /* Private Use High Surrogate */
+ ["\uDBDB", "\uDBDB"], /* Private Use High Surrogate */
+ ["\uDBDC", "\uDBDC"], /* Private Use High Surrogate */
+ ["\uDBDD", "\uDBDD"], /* Private Use High Surrogate */
+ ["\uDBDE", "\uDBDE"], /* Private Use High Surrogate */
+ ["\uDBDF", "\uDBDF"], /* Private Use High Surrogate */
+ ["\uDBE0", "\uDBE0"], /* Private Use High Surrogate */
+ ["\uDBE1", "\uDBE1"], /* Private Use High Surrogate */
+ ["\uDBE2", "\uDBE2"], /* Private Use High Surrogate */
+ ["\uDBE3", "\uDBE3"], /* Private Use High Surrogate */
+ ["\uDBE4", "\uDBE4"], /* Private Use High Surrogate */
+ ["\uDBE5", "\uDBE5"], /* Private Use High Surrogate */
+ ["\uDBE6", "\uDBE6"], /* Private Use High Surrogate */
+ ["\uDBE7", "\uDBE7"], /* Private Use High Surrogate */
+ ["\uDBE8", "\uDBE8"], /* Private Use High Surrogate */
+ ["\uDBE9", "\uDBE9"], /* Private Use High Surrogate */
+ ["\uDBEA", "\uDBEA"], /* Private Use High Surrogate */
+ ["\uDBEB", "\uDBEB"], /* Private Use High Surrogate */
+ ["\uDBEC", "\uDBEC"], /* Private Use High Surrogate */
+ ["\uDBED", "\uDBED"], /* Private Use High Surrogate */
+ ["\uDBEE", "\uDBEE"], /* Private Use High Surrogate */
+ ["\uDBEF", "\uDBEF"], /* Private Use High Surrogate */
+ ["\uDBF0", "\uDBF0"], /* Private Use High Surrogate */
+ ["\uDBF1", "\uDBF1"], /* Private Use High Surrogate */
+ ["\uDBF2", "\uDBF2"], /* Private Use High Surrogate */
+ ["\uDBF3", "\uDBF3"], /* Private Use High Surrogate */
+ ["\uDBF4", "\uDBF4"], /* Private Use High Surrogate */
+ ["\uDBF5", "\uDBF5"], /* Private Use High Surrogate */
+ ["\uDBF6", "\uDBF6"], /* Private Use High Surrogate */
+ ["\uDBF7", "\uDBF7"], /* Private Use High Surrogate */
+ ["\uDBF8", "\uDBF8"], /* Private Use High Surrogate */
+ ["\uDBF9", "\uDBF9"], /* Private Use High Surrogate */
+ ["\uDBFA", "\uDBFA"], /* Private Use High Surrogate */
+ ["\uDBFB", "\uDBFB"], /* Private Use High Surrogate */
+ ["\uDBFC", "\uDBFC"], /* Private Use High Surrogate */
+ ["\uDBFD", "\uDBFD"], /* Private Use High Surrogate */
+ ["\uDBFE", "\uDBFE"], /* Private Use High Surrogate */
+ ["\uDBFF", "\uDBFF"], /* Private Use High Surrogate */
+ ["\uDC00", "\uDC00"], /* Low Surrogate */
+ ["\uDC01", "\uDC01"], /* Low Surrogate */
+ ["\uDC02", "\uDC02"], /* Low Surrogate */
+ ["\uDC03", "\uDC03"], /* Low Surrogate */
+ ["\uDC04", "\uDC04"], /* Low Surrogate */
+ ["\uDC05", "\uDC05"], /* Low Surrogate */
+ ["\uDC06", "\uDC06"], /* Low Surrogate */
+ ["\uDC07", "\uDC07"], /* Low Surrogate */
+ ["\uDC08", "\uDC08"], /* Low Surrogate */
+ ["\uDC09", "\uDC09"], /* Low Surrogate */
+ ["\uDC0A", "\uDC0A"], /* Low Surrogate */
+ ["\uDC0B", "\uDC0B"], /* Low Surrogate */
+ ["\uDC0C", "\uDC0C"], /* Low Surrogate */
+ ["\uDC0D", "\uDC0D"], /* Low Surrogate */
+ ["\uDC0E", "\uDC0E"], /* Low Surrogate */
+ ["\uDC0F", "\uDC0F"], /* Low Surrogate */
+ ["\uDC10", "\uDC10"], /* Low Surrogate */
+ ["\uDC11", "\uDC11"], /* Low Surrogate */
+ ["\uDC12", "\uDC12"], /* Low Surrogate */
+ ["\uDC13", "\uDC13"], /* Low Surrogate */
+ ["\uDC14", "\uDC14"], /* Low Surrogate */
+ ["\uDC15", "\uDC15"], /* Low Surrogate */
+ ["\uDC16", "\uDC16"], /* Low Surrogate */
+ ["\uDC17", "\uDC17"], /* Low Surrogate */
+ ["\uDC18", "\uDC18"], /* Low Surrogate */
+ ["\uDC19", "\uDC19"], /* Low Surrogate */
+ ["\uDC1A", "\uDC1A"], /* Low Surrogate */
+ ["\uDC1B", "\uDC1B"], /* Low Surrogate */
+ ["\uDC1C", "\uDC1C"], /* Low Surrogate */
+ ["\uDC1D", "\uDC1D"], /* Low Surrogate */
+ ["\uDC1E", "\uDC1E"], /* Low Surrogate */
+ ["\uDC1F", "\uDC1F"], /* Low Surrogate */
+ ["\uDC20", "\uDC20"], /* Low Surrogate */
+ ["\uDC21", "\uDC21"], /* Low Surrogate */
+ ["\uDC22", "\uDC22"], /* Low Surrogate */
+ ["\uDC23", "\uDC23"], /* Low Surrogate */
+ ["\uDC24", "\uDC24"], /* Low Surrogate */
+ ["\uDC25", "\uDC25"], /* Low Surrogate */
+ ["\uDC26", "\uDC26"], /* Low Surrogate */
+ ["\uDC27", "\uDC27"], /* Low Surrogate */
+ ["\uDC28", "\uDC28"], /* Low Surrogate */
+ ["\uDC29", "\uDC29"], /* Low Surrogate */
+ ["\uDC2A", "\uDC2A"], /* Low Surrogate */
+ ["\uDC2B", "\uDC2B"], /* Low Surrogate */
+ ["\uDC2C", "\uDC2C"], /* Low Surrogate */
+ ["\uDC2D", "\uDC2D"], /* Low Surrogate */
+ ["\uDC2E", "\uDC2E"], /* Low Surrogate */
+ ["\uDC2F", "\uDC2F"], /* Low Surrogate */
+ ["\uDC30", "\uDC30"], /* Low Surrogate */
+ ["\uDC31", "\uDC31"], /* Low Surrogate */
+ ["\uDC32", "\uDC32"], /* Low Surrogate */
+ ["\uDC33", "\uDC33"], /* Low Surrogate */
+ ["\uDC34", "\uDC34"], /* Low Surrogate */
+ ["\uDC35", "\uDC35"], /* Low Surrogate */
+ ["\uDC36", "\uDC36"], /* Low Surrogate */
+ ["\uDC37", "\uDC37"], /* Low Surrogate */
+ ["\uDC38", "\uDC38"], /* Low Surrogate */
+ ["\uDC39", "\uDC39"], /* Low Surrogate */
+ ["\uDC3A", "\uDC3A"], /* Low Surrogate */
+ ["\uDC3B", "\uDC3B"], /* Low Surrogate */
+ ["\uDC3C", "\uDC3C"], /* Low Surrogate */
+ ["\uDC3D", "\uDC3D"], /* Low Surrogate */
+ ["\uDC3E", "\uDC3E"], /* Low Surrogate */
+ ["\uDC3F", "\uDC3F"], /* Low Surrogate */
+ ["\uDC40", "\uDC40"], /* Low Surrogate */
+ ["\uDC41", "\uDC41"], /* Low Surrogate */
+ ["\uDC42", "\uDC42"], /* Low Surrogate */
+ ["\uDC43", "\uDC43"], /* Low Surrogate */
+ ["\uDC44", "\uDC44"], /* Low Surrogate */
+ ["\uDC45", "\uDC45"], /* Low Surrogate */
+ ["\uDC46", "\uDC46"], /* Low Surrogate */
+ ["\uDC47", "\uDC47"], /* Low Surrogate */
+ ["\uDC48", "\uDC48"], /* Low Surrogate */
+ ["\uDC49", "\uDC49"], /* Low Surrogate */
+ ["\uDC4A", "\uDC4A"], /* Low Surrogate */
+ ["\uDC4B", "\uDC4B"], /* Low Surrogate */
+ ["\uDC4C", "\uDC4C"], /* Low Surrogate */
+ ["\uDC4D", "\uDC4D"], /* Low Surrogate */
+ ["\uDC4E", "\uDC4E"], /* Low Surrogate */
+ ["\uDC4F", "\uDC4F"], /* Low Surrogate */
+ ["\uDC50", "\uDC50"], /* Low Surrogate */
+ ["\uDC51", "\uDC51"], /* Low Surrogate */
+ ["\uDC52", "\uDC52"], /* Low Surrogate */
+ ["\uDC53", "\uDC53"], /* Low Surrogate */
+ ["\uDC54", "\uDC54"], /* Low Surrogate */
+ ["\uDC55", "\uDC55"], /* Low Surrogate */
+ ["\uDC56", "\uDC56"], /* Low Surrogate */
+ ["\uDC57", "\uDC57"], /* Low Surrogate */
+ ["\uDC58", "\uDC58"], /* Low Surrogate */
+ ["\uDC59", "\uDC59"], /* Low Surrogate */
+ ["\uDC5A", "\uDC5A"], /* Low Surrogate */
+ ["\uDC5B", "\uDC5B"], /* Low Surrogate */
+ ["\uDC5C", "\uDC5C"], /* Low Surrogate */
+ ["\uDC5D", "\uDC5D"], /* Low Surrogate */
+ ["\uDC5E", "\uDC5E"], /* Low Surrogate */
+ ["\uDC5F", "\uDC5F"], /* Low Surrogate */
+ ["\uDC60", "\uDC60"], /* Low Surrogate */
+ ["\uDC61", "\uDC61"], /* Low Surrogate */
+ ["\uDC62", "\uDC62"], /* Low Surrogate */
+ ["\uDC63", "\uDC63"], /* Low Surrogate */
+ ["\uDC64", "\uDC64"], /* Low Surrogate */
+ ["\uDC65", "\uDC65"], /* Low Surrogate */
+ ["\uDC66", "\uDC66"], /* Low Surrogate */
+ ["\uDC67", "\uDC67"], /* Low Surrogate */
+ ["\uDC68", "\uDC68"], /* Low Surrogate */
+ ["\uDC69", "\uDC69"], /* Low Surrogate */
+ ["\uDC6A", "\uDC6A"], /* Low Surrogate */
+ ["\uDC6B", "\uDC6B"], /* Low Surrogate */
+ ["\uDC6C", "\uDC6C"], /* Low Surrogate */
+ ["\uDC6D", "\uDC6D"], /* Low Surrogate */
+ ["\uDC6E", "\uDC6E"], /* Low Surrogate */
+ ["\uDC6F", "\uDC6F"], /* Low Surrogate */
+ ["\uDC70", "\uDC70"], /* Low Surrogate */
+ ["\uDC71", "\uDC71"], /* Low Surrogate */
+ ["\uDC72", "\uDC72"], /* Low Surrogate */
+ ["\uDC73", "\uDC73"], /* Low Surrogate */
+ ["\uDC74", "\uDC74"], /* Low Surrogate */
+ ["\uDC75", "\uDC75"], /* Low Surrogate */
+ ["\uDC76", "\uDC76"], /* Low Surrogate */
+ ["\uDC77", "\uDC77"], /* Low Surrogate */
+ ["\uDC78", "\uDC78"], /* Low Surrogate */
+ ["\uDC79", "\uDC79"], /* Low Surrogate */
+ ["\uDC7A", "\uDC7A"], /* Low Surrogate */
+ ["\uDC7B", "\uDC7B"], /* Low Surrogate */
+ ["\uDC7C", "\uDC7C"], /* Low Surrogate */
+ ["\uDC7D", "\uDC7D"], /* Low Surrogate */
+ ["\uDC7E", "\uDC7E"], /* Low Surrogate */
+ ["\uDC7F", "\uDC7F"], /* Low Surrogate */
+ ["\uDC80", "\uDC80"], /* Low Surrogate */
+ ["\uDC81", "\uDC81"], /* Low Surrogate */
+ ["\uDC82", "\uDC82"], /* Low Surrogate */
+ ["\uDC83", "\uDC83"], /* Low Surrogate */
+ ["\uDC84", "\uDC84"], /* Low Surrogate */
+ ["\uDC85", "\uDC85"], /* Low Surrogate */
+ ["\uDC86", "\uDC86"], /* Low Surrogate */
+ ["\uDC87", "\uDC87"], /* Low Surrogate */
+ ["\uDC88", "\uDC88"], /* Low Surrogate */
+ ["\uDC89", "\uDC89"], /* Low Surrogate */
+ ["\uDC8A", "\uDC8A"], /* Low Surrogate */
+ ["\uDC8B", "\uDC8B"], /* Low Surrogate */
+ ["\uDC8C", "\uDC8C"], /* Low Surrogate */
+ ["\uDC8D", "\uDC8D"], /* Low Surrogate */
+ ["\uDC8E", "\uDC8E"], /* Low Surrogate */
+ ["\uDC8F", "\uDC8F"], /* Low Surrogate */
+ ["\uDC90", "\uDC90"], /* Low Surrogate */
+ ["\uDC91", "\uDC91"], /* Low Surrogate */
+ ["\uDC92", "\uDC92"], /* Low Surrogate */
+ ["\uDC93", "\uDC93"], /* Low Surrogate */
+ ["\uDC94", "\uDC94"], /* Low Surrogate */
+ ["\uDC95", "\uDC95"], /* Low Surrogate */
+ ["\uDC96", "\uDC96"], /* Low Surrogate */
+ ["\uDC97", "\uDC97"], /* Low Surrogate */
+ ["\uDC98", "\uDC98"], /* Low Surrogate */
+ ["\uDC99", "\uDC99"], /* Low Surrogate */
+ ["\uDC9A", "\uDC9A"], /* Low Surrogate */
+ ["\uDC9B", "\uDC9B"], /* Low Surrogate */
+ ["\uDC9C", "\uDC9C"], /* Low Surrogate */
+ ["\uDC9D", "\uDC9D"], /* Low Surrogate */
+ ["\uDC9E", "\uDC9E"], /* Low Surrogate */
+ ["\uDC9F", "\uDC9F"], /* Low Surrogate */
+ ["\uDCA0", "\uDCA0"], /* Low Surrogate */
+ ["\uDCA1", "\uDCA1"], /* Low Surrogate */
+ ["\uDCA2", "\uDCA2"], /* Low Surrogate */
+ ["\uDCA3", "\uDCA3"], /* Low Surrogate */
+ ["\uDCA4", "\uDCA4"], /* Low Surrogate */
+ ["\uDCA5", "\uDCA5"], /* Low Surrogate */
+ ["\uDCA6", "\uDCA6"], /* Low Surrogate */
+ ["\uDCA7", "\uDCA7"], /* Low Surrogate */
+ ["\uDCA8", "\uDCA8"], /* Low Surrogate */
+ ["\uDCA9", "\uDCA9"], /* Low Surrogate */
+ ["\uDCAA", "\uDCAA"], /* Low Surrogate */
+ ["\uDCAB", "\uDCAB"], /* Low Surrogate */
+ ["\uDCAC", "\uDCAC"], /* Low Surrogate */
+ ["\uDCAD", "\uDCAD"], /* Low Surrogate */
+ ["\uDCAE", "\uDCAE"], /* Low Surrogate */
+ ["\uDCAF", "\uDCAF"], /* Low Surrogate */
+ ["\uDCB0", "\uDCB0"], /* Low Surrogate */
+ ["\uDCB1", "\uDCB1"], /* Low Surrogate */
+ ["\uDCB2", "\uDCB2"], /* Low Surrogate */
+ ["\uDCB3", "\uDCB3"], /* Low Surrogate */
+ ["\uDCB4", "\uDCB4"], /* Low Surrogate */
+ ["\uDCB5", "\uDCB5"], /* Low Surrogate */
+ ["\uDCB6", "\uDCB6"], /* Low Surrogate */
+ ["\uDCB7", "\uDCB7"], /* Low Surrogate */
+ ["\uDCB8", "\uDCB8"], /* Low Surrogate */
+ ["\uDCB9", "\uDCB9"], /* Low Surrogate */
+ ["\uDCBA", "\uDCBA"], /* Low Surrogate */
+ ["\uDCBB", "\uDCBB"], /* Low Surrogate */
+ ["\uDCBC", "\uDCBC"], /* Low Surrogate */
+ ["\uDCBD", "\uDCBD"], /* Low Surrogate */
+ ["\uDCBE", "\uDCBE"], /* Low Surrogate */
+ ["\uDCBF", "\uDCBF"], /* Low Surrogate */
+ ["\uDCC0", "\uDCC0"], /* Low Surrogate */
+ ["\uDCC1", "\uDCC1"], /* Low Surrogate */
+ ["\uDCC2", "\uDCC2"], /* Low Surrogate */
+ ["\uDCC3", "\uDCC3"], /* Low Surrogate */
+ ["\uDCC4", "\uDCC4"], /* Low Surrogate */
+ ["\uDCC5", "\uDCC5"], /* Low Surrogate */
+ ["\uDCC6", "\uDCC6"], /* Low Surrogate */
+ ["\uDCC7", "\uDCC7"], /* Low Surrogate */
+ ["\uDCC8", "\uDCC8"], /* Low Surrogate */
+ ["\uDCC9", "\uDCC9"], /* Low Surrogate */
+ ["\uDCCA", "\uDCCA"], /* Low Surrogate */
+ ["\uDCCB", "\uDCCB"], /* Low Surrogate */
+ ["\uDCCC", "\uDCCC"], /* Low Surrogate */
+ ["\uDCCD", "\uDCCD"], /* Low Surrogate */
+ ["\uDCCE", "\uDCCE"], /* Low Surrogate */
+ ["\uDCCF", "\uDCCF"], /* Low Surrogate */
+ ["\uDCD0", "\uDCD0"], /* Low Surrogate */
+ ["\uDCD1", "\uDCD1"], /* Low Surrogate */
+ ["\uDCD2", "\uDCD2"], /* Low Surrogate */
+ ["\uDCD3", "\uDCD3"], /* Low Surrogate */
+ ["\uDCD4", "\uDCD4"], /* Low Surrogate */
+ ["\uDCD5", "\uDCD5"], /* Low Surrogate */
+ ["\uDCD6", "\uDCD6"], /* Low Surrogate */
+ ["\uDCD7", "\uDCD7"], /* Low Surrogate */
+ ["\uDCD8", "\uDCD8"], /* Low Surrogate */
+ ["\uDCD9", "\uDCD9"], /* Low Surrogate */
+ ["\uDCDA", "\uDCDA"], /* Low Surrogate */
+ ["\uDCDB", "\uDCDB"], /* Low Surrogate */
+ ["\uDCDC", "\uDCDC"], /* Low Surrogate */
+ ["\uDCDD", "\uDCDD"], /* Low Surrogate */
+ ["\uDCDE", "\uDCDE"], /* Low Surrogate */
+ ["\uDCDF", "\uDCDF"], /* Low Surrogate */
+ ["\uDCE0", "\uDCE0"], /* Low Surrogate */
+ ["\uDCE1", "\uDCE1"], /* Low Surrogate */
+ ["\uDCE2", "\uDCE2"], /* Low Surrogate */
+ ["\uDCE3", "\uDCE3"], /* Low Surrogate */
+ ["\uDCE4", "\uDCE4"], /* Low Surrogate */
+ ["\uDCE5", "\uDCE5"], /* Low Surrogate */
+ ["\uDCE6", "\uDCE6"], /* Low Surrogate */
+ ["\uDCE7", "\uDCE7"], /* Low Surrogate */
+ ["\uDCE8", "\uDCE8"], /* Low Surrogate */
+ ["\uDCE9", "\uDCE9"], /* Low Surrogate */
+ ["\uDCEA", "\uDCEA"], /* Low Surrogate */
+ ["\uDCEB", "\uDCEB"], /* Low Surrogate */
+ ["\uDCEC", "\uDCEC"], /* Low Surrogate */
+ ["\uDCED", "\uDCED"], /* Low Surrogate */
+ ["\uDCEE", "\uDCEE"], /* Low Surrogate */
+ ["\uDCEF", "\uDCEF"], /* Low Surrogate */
+ ["\uDCF0", "\uDCF0"], /* Low Surrogate */
+ ["\uDCF1", "\uDCF1"], /* Low Surrogate */
+ ["\uDCF2", "\uDCF2"], /* Low Surrogate */
+ ["\uDCF3", "\uDCF3"], /* Low Surrogate */
+ ["\uDCF4", "\uDCF4"], /* Low Surrogate */
+ ["\uDCF5", "\uDCF5"], /* Low Surrogate */
+ ["\uDCF6", "\uDCF6"], /* Low Surrogate */
+ ["\uDCF7", "\uDCF7"], /* Low Surrogate */
+ ["\uDCF8", "\uDCF8"], /* Low Surrogate */
+ ["\uDCF9", "\uDCF9"], /* Low Surrogate */
+ ["\uDCFA", "\uDCFA"], /* Low Surrogate */
+ ["\uDCFB", "\uDCFB"], /* Low Surrogate */
+ ["\uDCFC", "\uDCFC"], /* Low Surrogate */
+ ["\uDCFD", "\uDCFD"], /* Low Surrogate */
+ ["\uDCFE", "\uDCFE"], /* Low Surrogate */
+ ["\uDCFF", "\uDCFF"], /* Low Surrogate */
+ ["\uDD00", "\uDD00"], /* Low Surrogate */
+ ["\uDD01", "\uDD01"], /* Low Surrogate */
+ ["\uDD02", "\uDD02"], /* Low Surrogate */
+ ["\uDD03", "\uDD03"], /* Low Surrogate */
+ ["\uDD04", "\uDD04"], /* Low Surrogate */
+ ["\uDD05", "\uDD05"], /* Low Surrogate */
+ ["\uDD06", "\uDD06"], /* Low Surrogate */
+ ["\uDD07", "\uDD07"], /* Low Surrogate */
+ ["\uDD08", "\uDD08"], /* Low Surrogate */
+ ["\uDD09", "\uDD09"], /* Low Surrogate */
+ ["\uDD0A", "\uDD0A"], /* Low Surrogate */
+ ["\uDD0B", "\uDD0B"], /* Low Surrogate */
+ ["\uDD0C", "\uDD0C"], /* Low Surrogate */
+ ["\uDD0D", "\uDD0D"], /* Low Surrogate */
+ ["\uDD0E", "\uDD0E"], /* Low Surrogate */
+ ["\uDD0F", "\uDD0F"], /* Low Surrogate */
+ ["\uDD10", "\uDD10"], /* Low Surrogate */
+ ["\uDD11", "\uDD11"], /* Low Surrogate */
+ ["\uDD12", "\uDD12"], /* Low Surrogate */
+ ["\uDD13", "\uDD13"], /* Low Surrogate */
+ ["\uDD14", "\uDD14"], /* Low Surrogate */
+ ["\uDD15", "\uDD15"], /* Low Surrogate */
+ ["\uDD16", "\uDD16"], /* Low Surrogate */
+ ["\uDD17", "\uDD17"], /* Low Surrogate */
+ ["\uDD18", "\uDD18"], /* Low Surrogate */
+ ["\uDD19", "\uDD19"], /* Low Surrogate */
+ ["\uDD1A", "\uDD1A"], /* Low Surrogate */
+ ["\uDD1B", "\uDD1B"], /* Low Surrogate */
+ ["\uDD1C", "\uDD1C"], /* Low Surrogate */
+ ["\uDD1D", "\uDD1D"], /* Low Surrogate */
+ ["\uDD1E", "\uDD1E"], /* Low Surrogate */
+ ["\uDD1F", "\uDD1F"], /* Low Surrogate */
+ ["\uDD20", "\uDD20"], /* Low Surrogate */
+ ["\uDD21", "\uDD21"], /* Low Surrogate */
+ ["\uDD22", "\uDD22"], /* Low Surrogate */
+ ["\uDD23", "\uDD23"], /* Low Surrogate */
+ ["\uDD24", "\uDD24"], /* Low Surrogate */
+ ["\uDD25", "\uDD25"], /* Low Surrogate */
+ ["\uDD26", "\uDD26"], /* Low Surrogate */
+ ["\uDD27", "\uDD27"], /* Low Surrogate */
+ ["\uDD28", "\uDD28"], /* Low Surrogate */
+ ["\uDD29", "\uDD29"], /* Low Surrogate */
+ ["\uDD2A", "\uDD2A"], /* Low Surrogate */
+ ["\uDD2B", "\uDD2B"], /* Low Surrogate */
+ ["\uDD2C", "\uDD2C"], /* Low Surrogate */
+ ["\uDD2D", "\uDD2D"], /* Low Surrogate */
+ ["\uDD2E", "\uDD2E"], /* Low Surrogate */
+ ["\uDD2F", "\uDD2F"], /* Low Surrogate */
+ ["\uDD30", "\uDD30"], /* Low Surrogate */
+ ["\uDD31", "\uDD31"], /* Low Surrogate */
+ ["\uDD32", "\uDD32"], /* Low Surrogate */
+ ["\uDD33", "\uDD33"], /* Low Surrogate */
+ ["\uDD34", "\uDD34"], /* Low Surrogate */
+ ["\uDD35", "\uDD35"], /* Low Surrogate */
+ ["\uDD36", "\uDD36"], /* Low Surrogate */
+ ["\uDD37", "\uDD37"], /* Low Surrogate */
+ ["\uDD38", "\uDD38"], /* Low Surrogate */
+ ["\uDD39", "\uDD39"], /* Low Surrogate */
+ ["\uDD3A", "\uDD3A"], /* Low Surrogate */
+ ["\uDD3B", "\uDD3B"], /* Low Surrogate */
+ ["\uDD3C", "\uDD3C"], /* Low Surrogate */
+ ["\uDD3D", "\uDD3D"], /* Low Surrogate */
+ ["\uDD3E", "\uDD3E"], /* Low Surrogate */
+ ["\uDD3F", "\uDD3F"], /* Low Surrogate */
+ ["\uDD40", "\uDD40"], /* Low Surrogate */
+ ["\uDD41", "\uDD41"], /* Low Surrogate */
+ ["\uDD42", "\uDD42"], /* Low Surrogate */
+ ["\uDD43", "\uDD43"], /* Low Surrogate */
+ ["\uDD44", "\uDD44"], /* Low Surrogate */
+ ["\uDD45", "\uDD45"], /* Low Surrogate */
+ ["\uDD46", "\uDD46"], /* Low Surrogate */
+ ["\uDD47", "\uDD47"], /* Low Surrogate */
+ ["\uDD48", "\uDD48"], /* Low Surrogate */
+ ["\uDD49", "\uDD49"], /* Low Surrogate */
+ ["\uDD4A", "\uDD4A"], /* Low Surrogate */
+ ["\uDD4B", "\uDD4B"], /* Low Surrogate */
+ ["\uDD4C", "\uDD4C"], /* Low Surrogate */
+ ["\uDD4D", "\uDD4D"], /* Low Surrogate */
+ ["\uDD4E", "\uDD4E"], /* Low Surrogate */
+ ["\uDD4F", "\uDD4F"], /* Low Surrogate */
+ ["\uDD50", "\uDD50"], /* Low Surrogate */
+ ["\uDD51", "\uDD51"], /* Low Surrogate */
+ ["\uDD52", "\uDD52"], /* Low Surrogate */
+ ["\uDD53", "\uDD53"], /* Low Surrogate */
+ ["\uDD54", "\uDD54"], /* Low Surrogate */
+ ["\uDD55", "\uDD55"], /* Low Surrogate */
+ ["\uDD56", "\uDD56"], /* Low Surrogate */
+ ["\uDD57", "\uDD57"], /* Low Surrogate */
+ ["\uDD58", "\uDD58"], /* Low Surrogate */
+ ["\uDD59", "\uDD59"], /* Low Surrogate */
+ ["\uDD5A", "\uDD5A"], /* Low Surrogate */
+ ["\uDD5B", "\uDD5B"], /* Low Surrogate */
+ ["\uDD5C", "\uDD5C"], /* Low Surrogate */
+ ["\uDD5D", "\uDD5D"], /* Low Surrogate */
+ ["\uDD5E", "\uDD5E"], /* Low Surrogate */
+ ["\uDD5F", "\uDD5F"], /* Low Surrogate */
+ ["\uDD60", "\uDD60"], /* Low Surrogate */
+ ["\uDD61", "\uDD61"], /* Low Surrogate */
+ ["\uDD62", "\uDD62"], /* Low Surrogate */
+ ["\uDD63", "\uDD63"], /* Low Surrogate */
+ ["\uDD64", "\uDD64"], /* Low Surrogate */
+ ["\uDD65", "\uDD65"], /* Low Surrogate */
+ ["\uDD66", "\uDD66"], /* Low Surrogate */
+ ["\uDD67", "\uDD67"], /* Low Surrogate */
+ ["\uDD68", "\uDD68"], /* Low Surrogate */
+ ["\uDD69", "\uDD69"], /* Low Surrogate */
+ ["\uDD6A", "\uDD6A"], /* Low Surrogate */
+ ["\uDD6B", "\uDD6B"], /* Low Surrogate */
+ ["\uDD6C", "\uDD6C"], /* Low Surrogate */
+ ["\uDD6D", "\uDD6D"], /* Low Surrogate */
+ ["\uDD6E", "\uDD6E"], /* Low Surrogate */
+ ["\uDD6F", "\uDD6F"], /* Low Surrogate */
+ ["\uDD70", "\uDD70"], /* Low Surrogate */
+ ["\uDD71", "\uDD71"], /* Low Surrogate */
+ ["\uDD72", "\uDD72"], /* Low Surrogate */
+ ["\uDD73", "\uDD73"], /* Low Surrogate */
+ ["\uDD74", "\uDD74"], /* Low Surrogate */
+ ["\uDD75", "\uDD75"], /* Low Surrogate */
+ ["\uDD76", "\uDD76"], /* Low Surrogate */
+ ["\uDD77", "\uDD77"], /* Low Surrogate */
+ ["\uDD78", "\uDD78"], /* Low Surrogate */
+ ["\uDD79", "\uDD79"], /* Low Surrogate */
+ ["\uDD7A", "\uDD7A"], /* Low Surrogate */
+ ["\uDD7B", "\uDD7B"], /* Low Surrogate */
+ ["\uDD7C", "\uDD7C"], /* Low Surrogate */
+ ["\uDD7D", "\uDD7D"], /* Low Surrogate */
+ ["\uDD7E", "\uDD7E"], /* Low Surrogate */
+ ["\uDD7F", "\uDD7F"], /* Low Surrogate */
+ ["\uDD80", "\uDD80"], /* Low Surrogate */
+ ["\uDD81", "\uDD81"], /* Low Surrogate */
+ ["\uDD82", "\uDD82"], /* Low Surrogate */
+ ["\uDD83", "\uDD83"], /* Low Surrogate */
+ ["\uDD84", "\uDD84"], /* Low Surrogate */
+ ["\uDD85", "\uDD85"], /* Low Surrogate */
+ ["\uDD86", "\uDD86"], /* Low Surrogate */
+ ["\uDD87", "\uDD87"], /* Low Surrogate */
+ ["\uDD88", "\uDD88"], /* Low Surrogate */
+ ["\uDD89", "\uDD89"], /* Low Surrogate */
+ ["\uDD8A", "\uDD8A"], /* Low Surrogate */
+ ["\uDD8B", "\uDD8B"], /* Low Surrogate */
+ ["\uDD8C", "\uDD8C"], /* Low Surrogate */
+ ["\uDD8D", "\uDD8D"], /* Low Surrogate */
+ ["\uDD8E", "\uDD8E"], /* Low Surrogate */
+ ["\uDD8F", "\uDD8F"], /* Low Surrogate */
+ ["\uDD90", "\uDD90"], /* Low Surrogate */
+ ["\uDD91", "\uDD91"], /* Low Surrogate */
+ ["\uDD92", "\uDD92"], /* Low Surrogate */
+ ["\uDD93", "\uDD93"], /* Low Surrogate */
+ ["\uDD94", "\uDD94"], /* Low Surrogate */
+ ["\uDD95", "\uDD95"], /* Low Surrogate */
+ ["\uDD96", "\uDD96"], /* Low Surrogate */
+ ["\uDD97", "\uDD97"], /* Low Surrogate */
+ ["\uDD98", "\uDD98"], /* Low Surrogate */
+ ["\uDD99", "\uDD99"], /* Low Surrogate */
+ ["\uDD9A", "\uDD9A"], /* Low Surrogate */
+ ["\uDD9B", "\uDD9B"], /* Low Surrogate */
+ ["\uDD9C", "\uDD9C"], /* Low Surrogate */
+ ["\uDD9D", "\uDD9D"], /* Low Surrogate */
+ ["\uDD9E", "\uDD9E"], /* Low Surrogate */
+ ["\uDD9F", "\uDD9F"], /* Low Surrogate */
+ ["\uDDA0", "\uDDA0"], /* Low Surrogate */
+ ["\uDDA1", "\uDDA1"], /* Low Surrogate */
+ ["\uDDA2", "\uDDA2"], /* Low Surrogate */
+ ["\uDDA3", "\uDDA3"], /* Low Surrogate */
+ ["\uDDA4", "\uDDA4"], /* Low Surrogate */
+ ["\uDDA5", "\uDDA5"], /* Low Surrogate */
+ ["\uDDA6", "\uDDA6"], /* Low Surrogate */
+ ["\uDDA7", "\uDDA7"], /* Low Surrogate */
+ ["\uDDA8", "\uDDA8"], /* Low Surrogate */
+ ["\uDDA9", "\uDDA9"], /* Low Surrogate */
+ ["\uDDAA", "\uDDAA"], /* Low Surrogate */
+ ["\uDDAB", "\uDDAB"], /* Low Surrogate */
+ ["\uDDAC", "\uDDAC"], /* Low Surrogate */
+ ["\uDDAD", "\uDDAD"], /* Low Surrogate */
+ ["\uDDAE", "\uDDAE"], /* Low Surrogate */
+ ["\uDDAF", "\uDDAF"], /* Low Surrogate */
+ ["\uDDB0", "\uDDB0"], /* Low Surrogate */
+ ["\uDDB1", "\uDDB1"], /* Low Surrogate */
+ ["\uDDB2", "\uDDB2"], /* Low Surrogate */
+ ["\uDDB3", "\uDDB3"], /* Low Surrogate */
+ ["\uDDB4", "\uDDB4"], /* Low Surrogate */
+ ["\uDDB5", "\uDDB5"], /* Low Surrogate */
+ ["\uDDB6", "\uDDB6"], /* Low Surrogate */
+ ["\uDDB7", "\uDDB7"], /* Low Surrogate */
+ ["\uDDB8", "\uDDB8"], /* Low Surrogate */
+ ["\uDDB9", "\uDDB9"], /* Low Surrogate */
+ ["\uDDBA", "\uDDBA"], /* Low Surrogate */
+ ["\uDDBB", "\uDDBB"], /* Low Surrogate */
+ ["\uDDBC", "\uDDBC"], /* Low Surrogate */
+ ["\uDDBD", "\uDDBD"], /* Low Surrogate */
+ ["\uDDBE", "\uDDBE"], /* Low Surrogate */
+ ["\uDDBF", "\uDDBF"], /* Low Surrogate */
+ ["\uDDC0", "\uDDC0"], /* Low Surrogate */
+ ["\uDDC1", "\uDDC1"], /* Low Surrogate */
+ ["\uDDC2", "\uDDC2"], /* Low Surrogate */
+ ["\uDDC3", "\uDDC3"], /* Low Surrogate */
+ ["\uDDC4", "\uDDC4"], /* Low Surrogate */
+ ["\uDDC5", "\uDDC5"], /* Low Surrogate */
+ ["\uDDC6", "\uDDC6"], /* Low Surrogate */
+ ["\uDDC7", "\uDDC7"], /* Low Surrogate */
+ ["\uDDC8", "\uDDC8"], /* Low Surrogate */
+ ["\uDDC9", "\uDDC9"], /* Low Surrogate */
+ ["\uDDCA", "\uDDCA"], /* Low Surrogate */
+ ["\uDDCB", "\uDDCB"], /* Low Surrogate */
+ ["\uDDCC", "\uDDCC"], /* Low Surrogate */
+ ["\uDDCD", "\uDDCD"], /* Low Surrogate */
+ ["\uDDCE", "\uDDCE"], /* Low Surrogate */
+ ["\uDDCF", "\uDDCF"], /* Low Surrogate */
+ ["\uDDD0", "\uDDD0"], /* Low Surrogate */
+ ["\uDDD1", "\uDDD1"], /* Low Surrogate */
+ ["\uDDD2", "\uDDD2"], /* Low Surrogate */
+ ["\uDDD3", "\uDDD3"], /* Low Surrogate */
+ ["\uDDD4", "\uDDD4"], /* Low Surrogate */
+ ["\uDDD5", "\uDDD5"], /* Low Surrogate */
+ ["\uDDD6", "\uDDD6"], /* Low Surrogate */
+ ["\uDDD7", "\uDDD7"], /* Low Surrogate */
+ ["\uDDD8", "\uDDD8"], /* Low Surrogate */
+ ["\uDDD9", "\uDDD9"], /* Low Surrogate */
+ ["\uDDDA", "\uDDDA"], /* Low Surrogate */
+ ["\uDDDB", "\uDDDB"], /* Low Surrogate */
+ ["\uDDDC", "\uDDDC"], /* Low Surrogate */
+ ["\uDDDD", "\uDDDD"], /* Low Surrogate */
+ ["\uDDDE", "\uDDDE"], /* Low Surrogate */
+ ["\uDDDF", "\uDDDF"], /* Low Surrogate */
+ ["\uDDE0", "\uDDE0"], /* Low Surrogate */
+ ["\uDDE1", "\uDDE1"], /* Low Surrogate */
+ ["\uDDE2", "\uDDE2"], /* Low Surrogate */
+ ["\uDDE3", "\uDDE3"], /* Low Surrogate */
+ ["\uDDE4", "\uDDE4"], /* Low Surrogate */
+ ["\uDDE5", "\uDDE5"], /* Low Surrogate */
+ ["\uDDE6", "\uDDE6"], /* Low Surrogate */
+ ["\uDDE7", "\uDDE7"], /* Low Surrogate */
+ ["\uDDE8", "\uDDE8"], /* Low Surrogate */
+ ["\uDDE9", "\uDDE9"], /* Low Surrogate */
+ ["\uDDEA", "\uDDEA"], /* Low Surrogate */
+ ["\uDDEB", "\uDDEB"], /* Low Surrogate */
+ ["\uDDEC", "\uDDEC"], /* Low Surrogate */
+ ["\uDDED", "\uDDED"], /* Low Surrogate */
+ ["\uDDEE", "\uDDEE"], /* Low Surrogate */
+ ["\uDDEF", "\uDDEF"], /* Low Surrogate */
+ ["\uDDF0", "\uDDF0"], /* Low Surrogate */
+ ["\uDDF1", "\uDDF1"], /* Low Surrogate */
+ ["\uDDF2", "\uDDF2"], /* Low Surrogate */
+ ["\uDDF3", "\uDDF3"], /* Low Surrogate */
+ ["\uDDF4", "\uDDF4"], /* Low Surrogate */
+ ["\uDDF5", "\uDDF5"], /* Low Surrogate */
+ ["\uDDF6", "\uDDF6"], /* Low Surrogate */
+ ["\uDDF7", "\uDDF7"], /* Low Surrogate */
+ ["\uDDF8", "\uDDF8"], /* Low Surrogate */
+ ["\uDDF9", "\uDDF9"], /* Low Surrogate */
+ ["\uDDFA", "\uDDFA"], /* Low Surrogate */
+ ["\uDDFB", "\uDDFB"], /* Low Surrogate */
+ ["\uDDFC", "\uDDFC"], /* Low Surrogate */
+ ["\uDDFD", "\uDDFD"], /* Low Surrogate */
+ ["\uDDFE", "\uDDFE"], /* Low Surrogate */
+ ["\uDDFF", "\uDDFF"], /* Low Surrogate */
+ ["\uDE00", "\uDE00"], /* Low Surrogate */
+ ["\uDE01", "\uDE01"], /* Low Surrogate */
+ ["\uDE02", "\uDE02"], /* Low Surrogate */
+ ["\uDE03", "\uDE03"], /* Low Surrogate */
+ ["\uDE04", "\uDE04"], /* Low Surrogate */
+ ["\uDE05", "\uDE05"], /* Low Surrogate */
+ ["\uDE06", "\uDE06"], /* Low Surrogate */
+ ["\uDE07", "\uDE07"], /* Low Surrogate */
+ ["\uDE08", "\uDE08"], /* Low Surrogate */
+ ["\uDE09", "\uDE09"], /* Low Surrogate */
+ ["\uDE0A", "\uDE0A"], /* Low Surrogate */
+ ["\uDE0B", "\uDE0B"], /* Low Surrogate */
+ ["\uDE0C", "\uDE0C"], /* Low Surrogate */
+ ["\uDE0D", "\uDE0D"], /* Low Surrogate */
+ ["\uDE0E", "\uDE0E"], /* Low Surrogate */
+ ["\uDE0F", "\uDE0F"], /* Low Surrogate */
+ ["\uDE10", "\uDE10"], /* Low Surrogate */
+ ["\uDE11", "\uDE11"], /* Low Surrogate */
+ ["\uDE12", "\uDE12"], /* Low Surrogate */
+ ["\uDE13", "\uDE13"], /* Low Surrogate */
+ ["\uDE14", "\uDE14"], /* Low Surrogate */
+ ["\uDE15", "\uDE15"], /* Low Surrogate */
+ ["\uDE16", "\uDE16"], /* Low Surrogate */
+ ["\uDE17", "\uDE17"], /* Low Surrogate */
+ ["\uDE18", "\uDE18"], /* Low Surrogate */
+ ["\uDE19", "\uDE19"], /* Low Surrogate */
+ ["\uDE1A", "\uDE1A"], /* Low Surrogate */
+ ["\uDE1B", "\uDE1B"], /* Low Surrogate */
+ ["\uDE1C", "\uDE1C"], /* Low Surrogate */
+ ["\uDE1D", "\uDE1D"], /* Low Surrogate */
+ ["\uDE1E", "\uDE1E"], /* Low Surrogate */
+ ["\uDE1F", "\uDE1F"], /* Low Surrogate */
+ ["\uDE20", "\uDE20"], /* Low Surrogate */
+ ["\uDE21", "\uDE21"], /* Low Surrogate */
+ ["\uDE22", "\uDE22"], /* Low Surrogate */
+ ["\uDE23", "\uDE23"], /* Low Surrogate */
+ ["\uDE24", "\uDE24"], /* Low Surrogate */
+ ["\uDE25", "\uDE25"], /* Low Surrogate */
+ ["\uDE26", "\uDE26"], /* Low Surrogate */
+ ["\uDE27", "\uDE27"], /* Low Surrogate */
+ ["\uDE28", "\uDE28"], /* Low Surrogate */
+ ["\uDE29", "\uDE29"], /* Low Surrogate */
+ ["\uDE2A", "\uDE2A"], /* Low Surrogate */
+ ["\uDE2B", "\uDE2B"], /* Low Surrogate */
+ ["\uDE2C", "\uDE2C"], /* Low Surrogate */
+ ["\uDE2D", "\uDE2D"], /* Low Surrogate */
+ ["\uDE2E", "\uDE2E"], /* Low Surrogate */
+ ["\uDE2F", "\uDE2F"], /* Low Surrogate */
+ ["\uDE30", "\uDE30"], /* Low Surrogate */
+ ["\uDE31", "\uDE31"], /* Low Surrogate */
+ ["\uDE32", "\uDE32"], /* Low Surrogate */
+ ["\uDE33", "\uDE33"], /* Low Surrogate */
+ ["\uDE34", "\uDE34"], /* Low Surrogate */
+ ["\uDE35", "\uDE35"], /* Low Surrogate */
+ ["\uDE36", "\uDE36"], /* Low Surrogate */
+ ["\uDE37", "\uDE37"], /* Low Surrogate */
+ ["\uDE38", "\uDE38"], /* Low Surrogate */
+ ["\uDE39", "\uDE39"], /* Low Surrogate */
+ ["\uDE3A", "\uDE3A"], /* Low Surrogate */
+ ["\uDE3B", "\uDE3B"], /* Low Surrogate */
+ ["\uDE3C", "\uDE3C"], /* Low Surrogate */
+ ["\uDE3D", "\uDE3D"], /* Low Surrogate */
+ ["\uDE3E", "\uDE3E"], /* Low Surrogate */
+ ["\uDE3F", "\uDE3F"], /* Low Surrogate */
+ ["\uDE40", "\uDE40"], /* Low Surrogate */
+ ["\uDE41", "\uDE41"], /* Low Surrogate */
+ ["\uDE42", "\uDE42"], /* Low Surrogate */
+ ["\uDE43", "\uDE43"], /* Low Surrogate */
+ ["\uDE44", "\uDE44"], /* Low Surrogate */
+ ["\uDE45", "\uDE45"], /* Low Surrogate */
+ ["\uDE46", "\uDE46"], /* Low Surrogate */
+ ["\uDE47", "\uDE47"], /* Low Surrogate */
+ ["\uDE48", "\uDE48"], /* Low Surrogate */
+ ["\uDE49", "\uDE49"], /* Low Surrogate */
+ ["\uDE4A", "\uDE4A"], /* Low Surrogate */
+ ["\uDE4B", "\uDE4B"], /* Low Surrogate */
+ ["\uDE4C", "\uDE4C"], /* Low Surrogate */
+ ["\uDE4D", "\uDE4D"], /* Low Surrogate */
+ ["\uDE4E", "\uDE4E"], /* Low Surrogate */
+ ["\uDE4F", "\uDE4F"], /* Low Surrogate */
+ ["\uDE50", "\uDE50"], /* Low Surrogate */
+ ["\uDE51", "\uDE51"], /* Low Surrogate */
+ ["\uDE52", "\uDE52"], /* Low Surrogate */
+ ["\uDE53", "\uDE53"], /* Low Surrogate */
+ ["\uDE54", "\uDE54"], /* Low Surrogate */
+ ["\uDE55", "\uDE55"], /* Low Surrogate */
+ ["\uDE56", "\uDE56"], /* Low Surrogate */
+ ["\uDE57", "\uDE57"], /* Low Surrogate */
+ ["\uDE58", "\uDE58"], /* Low Surrogate */
+ ["\uDE59", "\uDE59"], /* Low Surrogate */
+ ["\uDE5A", "\uDE5A"], /* Low Surrogate */
+ ["\uDE5B", "\uDE5B"], /* Low Surrogate */
+ ["\uDE5C", "\uDE5C"], /* Low Surrogate */
+ ["\uDE5D", "\uDE5D"], /* Low Surrogate */
+ ["\uDE5E", "\uDE5E"], /* Low Surrogate */
+ ["\uDE5F", "\uDE5F"], /* Low Surrogate */
+ ["\uDE60", "\uDE60"], /* Low Surrogate */
+ ["\uDE61", "\uDE61"], /* Low Surrogate */
+ ["\uDE62", "\uDE62"], /* Low Surrogate */
+ ["\uDE63", "\uDE63"], /* Low Surrogate */
+ ["\uDE64", "\uDE64"], /* Low Surrogate */
+ ["\uDE65", "\uDE65"], /* Low Surrogate */
+ ["\uDE66", "\uDE66"], /* Low Surrogate */
+ ["\uDE67", "\uDE67"], /* Low Surrogate */
+ ["\uDE68", "\uDE68"], /* Low Surrogate */
+ ["\uDE69", "\uDE69"], /* Low Surrogate */
+ ["\uDE6A", "\uDE6A"], /* Low Surrogate */
+ ["\uDE6B", "\uDE6B"], /* Low Surrogate */
+ ["\uDE6C", "\uDE6C"], /* Low Surrogate */
+ ["\uDE6D", "\uDE6D"], /* Low Surrogate */
+ ["\uDE6E", "\uDE6E"], /* Low Surrogate */
+ ["\uDE6F", "\uDE6F"], /* Low Surrogate */
+ ["\uDE70", "\uDE70"], /* Low Surrogate */
+ ["\uDE71", "\uDE71"], /* Low Surrogate */
+ ["\uDE72", "\uDE72"], /* Low Surrogate */
+ ["\uDE73", "\uDE73"], /* Low Surrogate */
+ ["\uDE74", "\uDE74"], /* Low Surrogate */
+ ["\uDE75", "\uDE75"], /* Low Surrogate */
+ ["\uDE76", "\uDE76"], /* Low Surrogate */
+ ["\uDE77", "\uDE77"], /* Low Surrogate */
+ ["\uDE78", "\uDE78"], /* Low Surrogate */
+ ["\uDE79", "\uDE79"], /* Low Surrogate */
+ ["\uDE7A", "\uDE7A"], /* Low Surrogate */
+ ["\uDE7B", "\uDE7B"], /* Low Surrogate */
+ ["\uDE7C", "\uDE7C"], /* Low Surrogate */
+ ["\uDE7D", "\uDE7D"], /* Low Surrogate */
+ ["\uDE7E", "\uDE7E"], /* Low Surrogate */
+ ["\uDE7F", "\uDE7F"], /* Low Surrogate */
+ ["\uDE80", "\uDE80"], /* Low Surrogate */
+ ["\uDE81", "\uDE81"], /* Low Surrogate */
+ ["\uDE82", "\uDE82"], /* Low Surrogate */
+ ["\uDE83", "\uDE83"], /* Low Surrogate */
+ ["\uDE84", "\uDE84"], /* Low Surrogate */
+ ["\uDE85", "\uDE85"], /* Low Surrogate */
+ ["\uDE86", "\uDE86"], /* Low Surrogate */
+ ["\uDE87", "\uDE87"], /* Low Surrogate */
+ ["\uDE88", "\uDE88"], /* Low Surrogate */
+ ["\uDE89", "\uDE89"], /* Low Surrogate */
+ ["\uDE8A", "\uDE8A"], /* Low Surrogate */
+ ["\uDE8B", "\uDE8B"], /* Low Surrogate */
+ ["\uDE8C", "\uDE8C"], /* Low Surrogate */
+ ["\uDE8D", "\uDE8D"], /* Low Surrogate */
+ ["\uDE8E", "\uDE8E"], /* Low Surrogate */
+ ["\uDE8F", "\uDE8F"], /* Low Surrogate */
+ ["\uDE90", "\uDE90"], /* Low Surrogate */
+ ["\uDE91", "\uDE91"], /* Low Surrogate */
+ ["\uDE92", "\uDE92"], /* Low Surrogate */
+ ["\uDE93", "\uDE93"], /* Low Surrogate */
+ ["\uDE94", "\uDE94"], /* Low Surrogate */
+ ["\uDE95", "\uDE95"], /* Low Surrogate */
+ ["\uDE96", "\uDE96"], /* Low Surrogate */
+ ["\uDE97", "\uDE97"], /* Low Surrogate */
+ ["\uDE98", "\uDE98"], /* Low Surrogate */
+ ["\uDE99", "\uDE99"], /* Low Surrogate */
+ ["\uDE9A", "\uDE9A"], /* Low Surrogate */
+ ["\uDE9B", "\uDE9B"], /* Low Surrogate */
+ ["\uDE9C", "\uDE9C"], /* Low Surrogate */
+ ["\uDE9D", "\uDE9D"], /* Low Surrogate */
+ ["\uDE9E", "\uDE9E"], /* Low Surrogate */
+ ["\uDE9F", "\uDE9F"], /* Low Surrogate */
+ ["\uDEA0", "\uDEA0"], /* Low Surrogate */
+ ["\uDEA1", "\uDEA1"], /* Low Surrogate */
+ ["\uDEA2", "\uDEA2"], /* Low Surrogate */
+ ["\uDEA3", "\uDEA3"], /* Low Surrogate */
+ ["\uDEA4", "\uDEA4"], /* Low Surrogate */
+ ["\uDEA5", "\uDEA5"], /* Low Surrogate */
+ ["\uDEA6", "\uDEA6"], /* Low Surrogate */
+ ["\uDEA7", "\uDEA7"], /* Low Surrogate */
+ ["\uDEA8", "\uDEA8"], /* Low Surrogate */
+ ["\uDEA9", "\uDEA9"], /* Low Surrogate */
+ ["\uDEAA", "\uDEAA"], /* Low Surrogate */
+ ["\uDEAB", "\uDEAB"], /* Low Surrogate */
+ ["\uDEAC", "\uDEAC"], /* Low Surrogate */
+ ["\uDEAD", "\uDEAD"], /* Low Surrogate */
+ ["\uDEAE", "\uDEAE"], /* Low Surrogate */
+ ["\uDEAF", "\uDEAF"], /* Low Surrogate */
+ ["\uDEB0", "\uDEB0"], /* Low Surrogate */
+ ["\uDEB1", "\uDEB1"], /* Low Surrogate */
+ ["\uDEB2", "\uDEB2"], /* Low Surrogate */
+ ["\uDEB3", "\uDEB3"], /* Low Surrogate */
+ ["\uDEB4", "\uDEB4"], /* Low Surrogate */
+ ["\uDEB5", "\uDEB5"], /* Low Surrogate */
+ ["\uDEB6", "\uDEB6"], /* Low Surrogate */
+ ["\uDEB7", "\uDEB7"], /* Low Surrogate */
+ ["\uDEB8", "\uDEB8"], /* Low Surrogate */
+ ["\uDEB9", "\uDEB9"], /* Low Surrogate */
+ ["\uDEBA", "\uDEBA"], /* Low Surrogate */
+ ["\uDEBB", "\uDEBB"], /* Low Surrogate */
+ ["\uDEBC", "\uDEBC"], /* Low Surrogate */
+ ["\uDEBD", "\uDEBD"], /* Low Surrogate */
+ ["\uDEBE", "\uDEBE"], /* Low Surrogate */
+ ["\uDEBF", "\uDEBF"], /* Low Surrogate */
+ ["\uDEC0", "\uDEC0"], /* Low Surrogate */
+ ["\uDEC1", "\uDEC1"], /* Low Surrogate */
+ ["\uDEC2", "\uDEC2"], /* Low Surrogate */
+ ["\uDEC3", "\uDEC3"], /* Low Surrogate */
+ ["\uDEC4", "\uDEC4"], /* Low Surrogate */
+ ["\uDEC5", "\uDEC5"], /* Low Surrogate */
+ ["\uDEC6", "\uDEC6"], /* Low Surrogate */
+ ["\uDEC7", "\uDEC7"], /* Low Surrogate */
+ ["\uDEC8", "\uDEC8"], /* Low Surrogate */
+ ["\uDEC9", "\uDEC9"], /* Low Surrogate */
+ ["\uDECA", "\uDECA"], /* Low Surrogate */
+ ["\uDECB", "\uDECB"], /* Low Surrogate */
+ ["\uDECC", "\uDECC"], /* Low Surrogate */
+ ["\uDECD", "\uDECD"], /* Low Surrogate */
+ ["\uDECE", "\uDECE"], /* Low Surrogate */
+ ["\uDECF", "\uDECF"], /* Low Surrogate */
+ ["\uDED0", "\uDED0"], /* Low Surrogate */
+ ["\uDED1", "\uDED1"], /* Low Surrogate */
+ ["\uDED2", "\uDED2"], /* Low Surrogate */
+ ["\uDED3", "\uDED3"], /* Low Surrogate */
+ ["\uDED4", "\uDED4"], /* Low Surrogate */
+ ["\uDED5", "\uDED5"], /* Low Surrogate */
+ ["\uDED6", "\uDED6"], /* Low Surrogate */
+ ["\uDED7", "\uDED7"], /* Low Surrogate */
+ ["\uDED8", "\uDED8"], /* Low Surrogate */
+ ["\uDED9", "\uDED9"], /* Low Surrogate */
+ ["\uDEDA", "\uDEDA"], /* Low Surrogate */
+ ["\uDEDB", "\uDEDB"], /* Low Surrogate */
+ ["\uDEDC", "\uDEDC"], /* Low Surrogate */
+ ["\uDEDD", "\uDEDD"], /* Low Surrogate */
+ ["\uDEDE", "\uDEDE"], /* Low Surrogate */
+ ["\uDEDF", "\uDEDF"], /* Low Surrogate */
+ ["\uDEE0", "\uDEE0"], /* Low Surrogate */
+ ["\uDEE1", "\uDEE1"], /* Low Surrogate */
+ ["\uDEE2", "\uDEE2"], /* Low Surrogate */
+ ["\uDEE3", "\uDEE3"], /* Low Surrogate */
+ ["\uDEE4", "\uDEE4"], /* Low Surrogate */
+ ["\uDEE5", "\uDEE5"], /* Low Surrogate */
+ ["\uDEE6", "\uDEE6"], /* Low Surrogate */
+ ["\uDEE7", "\uDEE7"], /* Low Surrogate */
+ ["\uDEE8", "\uDEE8"], /* Low Surrogate */
+ ["\uDEE9", "\uDEE9"], /* Low Surrogate */
+ ["\uDEEA", "\uDEEA"], /* Low Surrogate */
+ ["\uDEEB", "\uDEEB"], /* Low Surrogate */
+ ["\uDEEC", "\uDEEC"], /* Low Surrogate */
+ ["\uDEED", "\uDEED"], /* Low Surrogate */
+ ["\uDEEE", "\uDEEE"], /* Low Surrogate */
+ ["\uDEEF", "\uDEEF"], /* Low Surrogate */
+ ["\uDEF0", "\uDEF0"], /* Low Surrogate */
+ ["\uDEF1", "\uDEF1"], /* Low Surrogate */
+ ["\uDEF2", "\uDEF2"], /* Low Surrogate */
+ ["\uDEF3", "\uDEF3"], /* Low Surrogate */
+ ["\uDEF4", "\uDEF4"], /* Low Surrogate */
+ ["\uDEF5", "\uDEF5"], /* Low Surrogate */
+ ["\uDEF6", "\uDEF6"], /* Low Surrogate */
+ ["\uDEF7", "\uDEF7"], /* Low Surrogate */
+ ["\uDEF8", "\uDEF8"], /* Low Surrogate */
+ ["\uDEF9", "\uDEF9"], /* Low Surrogate */
+ ["\uDEFA", "\uDEFA"], /* Low Surrogate */
+ ["\uDEFB", "\uDEFB"], /* Low Surrogate */
+ ["\uDEFC", "\uDEFC"], /* Low Surrogate */
+ ["\uDEFD", "\uDEFD"], /* Low Surrogate */
+ ["\uDEFE", "\uDEFE"], /* Low Surrogate */
+ ["\uDEFF", "\uDEFF"], /* Low Surrogate */
+ ["\uDF00", "\uDF00"], /* Low Surrogate */
+ ["\uDF01", "\uDF01"], /* Low Surrogate */
+ ["\uDF02", "\uDF02"], /* Low Surrogate */
+ ["\uDF03", "\uDF03"], /* Low Surrogate */
+ ["\uDF04", "\uDF04"], /* Low Surrogate */
+ ["\uDF05", "\uDF05"], /* Low Surrogate */
+ ["\uDF06", "\uDF06"], /* Low Surrogate */
+ ["\uDF07", "\uDF07"], /* Low Surrogate */
+ ["\uDF08", "\uDF08"], /* Low Surrogate */
+ ["\uDF09", "\uDF09"], /* Low Surrogate */
+ ["\uDF0A", "\uDF0A"], /* Low Surrogate */
+ ["\uDF0B", "\uDF0B"], /* Low Surrogate */
+ ["\uDF0C", "\uDF0C"], /* Low Surrogate */
+ ["\uDF0D", "\uDF0D"], /* Low Surrogate */
+ ["\uDF0E", "\uDF0E"], /* Low Surrogate */
+ ["\uDF0F", "\uDF0F"], /* Low Surrogate */
+ ["\uDF10", "\uDF10"], /* Low Surrogate */
+ ["\uDF11", "\uDF11"], /* Low Surrogate */
+ ["\uDF12", "\uDF12"], /* Low Surrogate */
+ ["\uDF13", "\uDF13"], /* Low Surrogate */
+ ["\uDF14", "\uDF14"], /* Low Surrogate */
+ ["\uDF15", "\uDF15"], /* Low Surrogate */
+ ["\uDF16", "\uDF16"], /* Low Surrogate */
+ ["\uDF17", "\uDF17"], /* Low Surrogate */
+ ["\uDF18", "\uDF18"], /* Low Surrogate */
+ ["\uDF19", "\uDF19"], /* Low Surrogate */
+ ["\uDF1A", "\uDF1A"], /* Low Surrogate */
+ ["\uDF1B", "\uDF1B"], /* Low Surrogate */
+ ["\uDF1C", "\uDF1C"], /* Low Surrogate */
+ ["\uDF1D", "\uDF1D"], /* Low Surrogate */
+ ["\uDF1E", "\uDF1E"], /* Low Surrogate */
+ ["\uDF1F", "\uDF1F"], /* Low Surrogate */
+ ["\uDF20", "\uDF20"], /* Low Surrogate */
+ ["\uDF21", "\uDF21"], /* Low Surrogate */
+ ["\uDF22", "\uDF22"], /* Low Surrogate */
+ ["\uDF23", "\uDF23"], /* Low Surrogate */
+ ["\uDF24", "\uDF24"], /* Low Surrogate */
+ ["\uDF25", "\uDF25"], /* Low Surrogate */
+ ["\uDF26", "\uDF26"], /* Low Surrogate */
+ ["\uDF27", "\uDF27"], /* Low Surrogate */
+ ["\uDF28", "\uDF28"], /* Low Surrogate */
+ ["\uDF29", "\uDF29"], /* Low Surrogate */
+ ["\uDF2A", "\uDF2A"], /* Low Surrogate */
+ ["\uDF2B", "\uDF2B"], /* Low Surrogate */
+ ["\uDF2C", "\uDF2C"], /* Low Surrogate */
+ ["\uDF2D", "\uDF2D"], /* Low Surrogate */
+ ["\uDF2E", "\uDF2E"], /* Low Surrogate */
+ ["\uDF2F", "\uDF2F"], /* Low Surrogate */
+ ["\uDF30", "\uDF30"], /* Low Surrogate */
+ ["\uDF31", "\uDF31"], /* Low Surrogate */
+ ["\uDF32", "\uDF32"], /* Low Surrogate */
+ ["\uDF33", "\uDF33"], /* Low Surrogate */
+ ["\uDF34", "\uDF34"], /* Low Surrogate */
+ ["\uDF35", "\uDF35"], /* Low Surrogate */
+ ["\uDF36", "\uDF36"], /* Low Surrogate */
+ ["\uDF37", "\uDF37"], /* Low Surrogate */
+ ["\uDF38", "\uDF38"], /* Low Surrogate */
+ ["\uDF39", "\uDF39"], /* Low Surrogate */
+ ["\uDF3A", "\uDF3A"], /* Low Surrogate */
+ ["\uDF3B", "\uDF3B"], /* Low Surrogate */
+ ["\uDF3C", "\uDF3C"], /* Low Surrogate */
+ ["\uDF3D", "\uDF3D"], /* Low Surrogate */
+ ["\uDF3E", "\uDF3E"], /* Low Surrogate */
+ ["\uDF3F", "\uDF3F"], /* Low Surrogate */
+ ["\uDF40", "\uDF40"], /* Low Surrogate */
+ ["\uDF41", "\uDF41"], /* Low Surrogate */
+ ["\uDF42", "\uDF42"], /* Low Surrogate */
+ ["\uDF43", "\uDF43"], /* Low Surrogate */
+ ["\uDF44", "\uDF44"], /* Low Surrogate */
+ ["\uDF45", "\uDF45"], /* Low Surrogate */
+ ["\uDF46", "\uDF46"], /* Low Surrogate */
+ ["\uDF47", "\uDF47"], /* Low Surrogate */
+ ["\uDF48", "\uDF48"], /* Low Surrogate */
+ ["\uDF49", "\uDF49"], /* Low Surrogate */
+ ["\uDF4A", "\uDF4A"], /* Low Surrogate */
+ ["\uDF4B", "\uDF4B"], /* Low Surrogate */
+ ["\uDF4C", "\uDF4C"], /* Low Surrogate */
+ ["\uDF4D", "\uDF4D"], /* Low Surrogate */
+ ["\uDF4E", "\uDF4E"], /* Low Surrogate */
+ ["\uDF4F", "\uDF4F"], /* Low Surrogate */
+ ["\uDF50", "\uDF50"], /* Low Surrogate */
+ ["\uDF51", "\uDF51"], /* Low Surrogate */
+ ["\uDF52", "\uDF52"], /* Low Surrogate */
+ ["\uDF53", "\uDF53"], /* Low Surrogate */
+ ["\uDF54", "\uDF54"], /* Low Surrogate */
+ ["\uDF55", "\uDF55"], /* Low Surrogate */
+ ["\uDF56", "\uDF56"], /* Low Surrogate */
+ ["\uDF57", "\uDF57"], /* Low Surrogate */
+ ["\uDF58", "\uDF58"], /* Low Surrogate */
+ ["\uDF59", "\uDF59"], /* Low Surrogate */
+ ["\uDF5A", "\uDF5A"], /* Low Surrogate */
+ ["\uDF5B", "\uDF5B"], /* Low Surrogate */
+ ["\uDF5C", "\uDF5C"], /* Low Surrogate */
+ ["\uDF5D", "\uDF5D"], /* Low Surrogate */
+ ["\uDF5E", "\uDF5E"], /* Low Surrogate */
+ ["\uDF5F", "\uDF5F"], /* Low Surrogate */
+ ["\uDF60", "\uDF60"], /* Low Surrogate */
+ ["\uDF61", "\uDF61"], /* Low Surrogate */
+ ["\uDF62", "\uDF62"], /* Low Surrogate */
+ ["\uDF63", "\uDF63"], /* Low Surrogate */
+ ["\uDF64", "\uDF64"], /* Low Surrogate */
+ ["\uDF65", "\uDF65"], /* Low Surrogate */
+ ["\uDF66", "\uDF66"], /* Low Surrogate */
+ ["\uDF67", "\uDF67"], /* Low Surrogate */
+ ["\uDF68", "\uDF68"], /* Low Surrogate */
+ ["\uDF69", "\uDF69"], /* Low Surrogate */
+ ["\uDF6A", "\uDF6A"], /* Low Surrogate */
+ ["\uDF6B", "\uDF6B"], /* Low Surrogate */
+ ["\uDF6C", "\uDF6C"], /* Low Surrogate */
+ ["\uDF6D", "\uDF6D"], /* Low Surrogate */
+ ["\uDF6E", "\uDF6E"], /* Low Surrogate */
+ ["\uDF6F", "\uDF6F"], /* Low Surrogate */
+ ["\uDF70", "\uDF70"], /* Low Surrogate */
+ ["\uDF71", "\uDF71"], /* Low Surrogate */
+ ["\uDF72", "\uDF72"], /* Low Surrogate */
+ ["\uDF73", "\uDF73"], /* Low Surrogate */
+ ["\uDF74", "\uDF74"], /* Low Surrogate */
+ ["\uDF75", "\uDF75"], /* Low Surrogate */
+ ["\uDF76", "\uDF76"], /* Low Surrogate */
+ ["\uDF77", "\uDF77"], /* Low Surrogate */
+ ["\uDF78", "\uDF78"], /* Low Surrogate */
+ ["\uDF79", "\uDF79"], /* Low Surrogate */
+ ["\uDF7A", "\uDF7A"], /* Low Surrogate */
+ ["\uDF7B", "\uDF7B"], /* Low Surrogate */
+ ["\uDF7C", "\uDF7C"], /* Low Surrogate */
+ ["\uDF7D", "\uDF7D"], /* Low Surrogate */
+ ["\uDF7E", "\uDF7E"], /* Low Surrogate */
+ ["\uDF7F", "\uDF7F"], /* Low Surrogate */
+ ["\uDF80", "\uDF80"], /* Low Surrogate */
+ ["\uDF81", "\uDF81"], /* Low Surrogate */
+ ["\uDF82", "\uDF82"], /* Low Surrogate */
+ ["\uDF83", "\uDF83"], /* Low Surrogate */
+ ["\uDF84", "\uDF84"], /* Low Surrogate */
+ ["\uDF85", "\uDF85"], /* Low Surrogate */
+ ["\uDF86", "\uDF86"], /* Low Surrogate */
+ ["\uDF87", "\uDF87"], /* Low Surrogate */
+ ["\uDF88", "\uDF88"], /* Low Surrogate */
+ ["\uDF89", "\uDF89"], /* Low Surrogate */
+ ["\uDF8A", "\uDF8A"], /* Low Surrogate */
+ ["\uDF8B", "\uDF8B"], /* Low Surrogate */
+ ["\uDF8C", "\uDF8C"], /* Low Surrogate */
+ ["\uDF8D", "\uDF8D"], /* Low Surrogate */
+ ["\uDF8E", "\uDF8E"], /* Low Surrogate */
+ ["\uDF8F", "\uDF8F"], /* Low Surrogate */
+ ["\uDF90", "\uDF90"], /* Low Surrogate */
+ ["\uDF91", "\uDF91"], /* Low Surrogate */
+ ["\uDF92", "\uDF92"], /* Low Surrogate */
+ ["\uDF93", "\uDF93"], /* Low Surrogate */
+ ["\uDF94", "\uDF94"], /* Low Surrogate */
+ ["\uDF95", "\uDF95"], /* Low Surrogate */
+ ["\uDF96", "\uDF96"], /* Low Surrogate */
+ ["\uDF97", "\uDF97"], /* Low Surrogate */
+ ["\uDF98", "\uDF98"], /* Low Surrogate */
+ ["\uDF99", "\uDF99"], /* Low Surrogate */
+ ["\uDF9A", "\uDF9A"], /* Low Surrogate */
+ ["\uDF9B", "\uDF9B"], /* Low Surrogate */
+ ["\uDF9C", "\uDF9C"], /* Low Surrogate */
+ ["\uDF9D", "\uDF9D"], /* Low Surrogate */
+ ["\uDF9E", "\uDF9E"], /* Low Surrogate */
+ ["\uDF9F", "\uDF9F"], /* Low Surrogate */
+ ["\uDFA0", "\uDFA0"], /* Low Surrogate */
+ ["\uDFA1", "\uDFA1"], /* Low Surrogate */
+ ["\uDFA2", "\uDFA2"], /* Low Surrogate */
+ ["\uDFA3", "\uDFA3"], /* Low Surrogate */
+ ["\uDFA4", "\uDFA4"], /* Low Surrogate */
+ ["\uDFA5", "\uDFA5"], /* Low Surrogate */
+ ["\uDFA6", "\uDFA6"], /* Low Surrogate */
+ ["\uDFA7", "\uDFA7"], /* Low Surrogate */
+ ["\uDFA8", "\uDFA8"], /* Low Surrogate */
+ ["\uDFA9", "\uDFA9"], /* Low Surrogate */
+ ["\uDFAA", "\uDFAA"], /* Low Surrogate */
+ ["\uDFAB", "\uDFAB"], /* Low Surrogate */
+ ["\uDFAC", "\uDFAC"], /* Low Surrogate */
+ ["\uDFAD", "\uDFAD"], /* Low Surrogate */
+ ["\uDFAE", "\uDFAE"], /* Low Surrogate */
+ ["\uDFAF", "\uDFAF"], /* Low Surrogate */
+ ["\uDFB0", "\uDFB0"], /* Low Surrogate */
+ ["\uDFB1", "\uDFB1"], /* Low Surrogate */
+ ["\uDFB2", "\uDFB2"], /* Low Surrogate */
+ ["\uDFB3", "\uDFB3"], /* Low Surrogate */
+ ["\uDFB4", "\uDFB4"], /* Low Surrogate */
+ ["\uDFB5", "\uDFB5"], /* Low Surrogate */
+ ["\uDFB6", "\uDFB6"], /* Low Surrogate */
+ ["\uDFB7", "\uDFB7"], /* Low Surrogate */
+ ["\uDFB8", "\uDFB8"], /* Low Surrogate */
+ ["\uDFB9", "\uDFB9"], /* Low Surrogate */
+ ["\uDFBA", "\uDFBA"], /* Low Surrogate */
+ ["\uDFBB", "\uDFBB"], /* Low Surrogate */
+ ["\uDFBC", "\uDFBC"], /* Low Surrogate */
+ ["\uDFBD", "\uDFBD"], /* Low Surrogate */
+ ["\uDFBE", "\uDFBE"], /* Low Surrogate */
+ ["\uDFBF", "\uDFBF"], /* Low Surrogate */
+ ["\uDFC0", "\uDFC0"], /* Low Surrogate */
+ ["\uDFC1", "\uDFC1"], /* Low Surrogate */
+ ["\uDFC2", "\uDFC2"], /* Low Surrogate */
+ ["\uDFC3", "\uDFC3"], /* Low Surrogate */
+ ["\uDFC4", "\uDFC4"], /* Low Surrogate */
+ ["\uDFC5", "\uDFC5"], /* Low Surrogate */
+ ["\uDFC6", "\uDFC6"], /* Low Surrogate */
+ ["\uDFC7", "\uDFC7"], /* Low Surrogate */
+ ["\uDFC8", "\uDFC8"], /* Low Surrogate */
+ ["\uDFC9", "\uDFC9"], /* Low Surrogate */
+ ["\uDFCA", "\uDFCA"], /* Low Surrogate */
+ ["\uDFCB", "\uDFCB"], /* Low Surrogate */
+ ["\uDFCC", "\uDFCC"], /* Low Surrogate */
+ ["\uDFCD", "\uDFCD"], /* Low Surrogate */
+ ["\uDFCE", "\uDFCE"], /* Low Surrogate */
+ ["\uDFCF", "\uDFCF"], /* Low Surrogate */
+ ["\uDFD0", "\uDFD0"], /* Low Surrogate */
+ ["\uDFD1", "\uDFD1"], /* Low Surrogate */
+ ["\uDFD2", "\uDFD2"], /* Low Surrogate */
+ ["\uDFD3", "\uDFD3"], /* Low Surrogate */
+ ["\uDFD4", "\uDFD4"], /* Low Surrogate */
+ ["\uDFD5", "\uDFD5"], /* Low Surrogate */
+ ["\uDFD6", "\uDFD6"], /* Low Surrogate */
+ ["\uDFD7", "\uDFD7"], /* Low Surrogate */
+ ["\uDFD8", "\uDFD8"], /* Low Surrogate */
+ ["\uDFD9", "\uDFD9"], /* Low Surrogate */
+ ["\uDFDA", "\uDFDA"], /* Low Surrogate */
+ ["\uDFDB", "\uDFDB"], /* Low Surrogate */
+ ["\uDFDC", "\uDFDC"], /* Low Surrogate */
+ ["\uDFDD", "\uDFDD"], /* Low Surrogate */
+ ["\uDFDE", "\uDFDE"], /* Low Surrogate */
+ ["\uDFDF", "\uDFDF"], /* Low Surrogate */
+ ["\uDFE0", "\uDFE0"], /* Low Surrogate */
+ ["\uDFE1", "\uDFE1"], /* Low Surrogate */
+ ["\uDFE2", "\uDFE2"], /* Low Surrogate */
+ ["\uDFE3", "\uDFE3"], /* Low Surrogate */
+ ["\uDFE4", "\uDFE4"], /* Low Surrogate */
+ ["\uDFE5", "\uDFE5"], /* Low Surrogate */
+ ["\uDFE6", "\uDFE6"], /* Low Surrogate */
+ ["\uDFE7", "\uDFE7"], /* Low Surrogate */
+ ["\uDFE8", "\uDFE8"], /* Low Surrogate */
+ ["\uDFE9", "\uDFE9"], /* Low Surrogate */
+ ["\uDFEA", "\uDFEA"], /* Low Surrogate */
+ ["\uDFEB", "\uDFEB"], /* Low Surrogate */
+ ["\uDFEC", "\uDFEC"], /* Low Surrogate */
+ ["\uDFED", "\uDFED"], /* Low Surrogate */
+ ["\uDFEE", "\uDFEE"], /* Low Surrogate */
+ ["\uDFEF", "\uDFEF"], /* Low Surrogate */
+ ["\uDFF0", "\uDFF0"], /* Low Surrogate */
+ ["\uDFF1", "\uDFF1"], /* Low Surrogate */
+ ["\uDFF2", "\uDFF2"], /* Low Surrogate */
+ ["\uDFF3", "\uDFF3"], /* Low Surrogate */
+ ["\uDFF4", "\uDFF4"], /* Low Surrogate */
+ ["\uDFF5", "\uDFF5"], /* Low Surrogate */
+ ["\uDFF6", "\uDFF6"], /* Low Surrogate */
+ ["\uDFF7", "\uDFF7"], /* Low Surrogate */
+ ["\uDFF8", "\uDFF8"], /* Low Surrogate */
+ ["\uDFF9", "\uDFF9"], /* Low Surrogate */
+ ["\uDFFA", "\uDFFA"], /* Low Surrogate */
+ ["\uDFFB", "\uDFFB"], /* Low Surrogate */
+ ["\uDFFC", "\uDFFC"], /* Low Surrogate */
+ ["\uDFFD", "\uDFFD"], /* Low Surrogate */
+ ["\uDFFE", "\uDFFE"], /* Low Surrogate */
+ ["\uDFFF", "\uDFFF"], /* Low Surrogate */
+ ["\uE000", "\uE000"], /* Private Use */
+ ["\uE001", "\uE001"], /* Private Use */
+ ["\uE002", "\uE002"], /* Private Use */
+ ["\uE003", "\uE003"], /* Private Use */
+ ["\uE004", "\uE004"], /* Private Use */
+ ["\uE005", "\uE005"], /* Private Use */
+ ["\uE006", "\uE006"], /* Private Use */
+ ["\uE007", "\uE007"], /* Private Use */
+ ["\uE008", "\uE008"], /* Private Use */
+ ["\uE009", "\uE009"], /* Private Use */
+ ["\uE00A", "\uE00A"], /* Private Use */
+ ["\uE00B", "\uE00B"], /* Private Use */
+ ["\uE00C", "\uE00C"], /* Private Use */
+ ["\uE00D", "\uE00D"], /* Private Use */
+ ["\uE00E", "\uE00E"], /* Private Use */
+ ["\uE00F", "\uE00F"], /* Private Use */
+ ["\uE010", "\uE010"], /* Private Use */
+ ["\uE011", "\uE011"], /* Private Use */
+ ["\uE012", "\uE012"], /* Private Use */
+ ["\uE013", "\uE013"], /* Private Use */
+ ["\uE014", "\uE014"], /* Private Use */
+ ["\uE015", "\uE015"], /* Private Use */
+ ["\uE016", "\uE016"], /* Private Use */
+ ["\uE017", "\uE017"], /* Private Use */
+ ["\uE018", "\uE018"], /* Private Use */
+ ["\uE019", "\uE019"], /* Private Use */
+ ["\uE01A", "\uE01A"], /* Private Use */
+ ["\uE01B", "\uE01B"], /* Private Use */
+ ["\uE01C", "\uE01C"], /* Private Use */
+ ["\uE01D", "\uE01D"], /* Private Use */
+ ["\uE01E", "\uE01E"], /* Private Use */
+ ["\uE01F", "\uE01F"], /* Private Use */
+ ["\uE020", "\uE020"], /* Private Use */
+ ["\uE021", "\uE021"], /* Private Use */
+ ["\uE022", "\uE022"], /* Private Use */
+ ["\uE023", "\uE023"], /* Private Use */
+ ["\uE024", "\uE024"], /* Private Use */
+ ["\uE025", "\uE025"], /* Private Use */
+ ["\uE026", "\uE026"], /* Private Use */
+ ["\uE027", "\uE027"], /* Private Use */
+ ["\uE028", "\uE028"], /* Private Use */
+ ["\uE029", "\uE029"], /* Private Use */
+ ["\uE02A", "\uE02A"], /* Private Use */
+ ["\uE02B", "\uE02B"], /* Private Use */
+ ["\uE02C", "\uE02C"], /* Private Use */
+ ["\uE02D", "\uE02D"], /* Private Use */
+ ["\uE02E", "\uE02E"], /* Private Use */
+ ["\uE02F", "\uE02F"], /* Private Use */
+ ["\uE030", "\uE030"], /* Private Use */
+ ["\uE031", "\uE031"], /* Private Use */
+ ["\uE032", "\uE032"], /* Private Use */
+ ["\uE033", "\uE033"], /* Private Use */
+ ["\uE034", "\uE034"], /* Private Use */
+ ["\uE035", "\uE035"], /* Private Use */
+ ["\uE036", "\uE036"], /* Private Use */
+ ["\uE037", "\uE037"], /* Private Use */
+ ["\uE038", "\uE038"], /* Private Use */
+ ["\uE039", "\uE039"], /* Private Use */
+ ["\uE03A", "\uE03A"], /* Private Use */
+ ["\uE03B", "\uE03B"], /* Private Use */
+ ["\uE03C", "\uE03C"], /* Private Use */
+ ["\uE03D", "\uE03D"], /* Private Use */
+ ["\uE03E", "\uE03E"], /* Private Use */
+ ["\uE03F", "\uE03F"], /* Private Use */
+ ["\uE040", "\uE040"], /* Private Use */
+ ["\uE041", "\uE041"], /* Private Use */
+ ["\uE042", "\uE042"], /* Private Use */
+ ["\uE043", "\uE043"], /* Private Use */
+ ["\uE044", "\uE044"], /* Private Use */
+ ["\uE045", "\uE045"], /* Private Use */
+ ["\uE046", "\uE046"], /* Private Use */
+ ["\uE047", "\uE047"], /* Private Use */
+ ["\uE048", "\uE048"], /* Private Use */
+ ["\uE049", "\uE049"], /* Private Use */
+ ["\uE04A", "\uE04A"], /* Private Use */
+ ["\uE04B", "\uE04B"], /* Private Use */
+ ["\uE04C", "\uE04C"], /* Private Use */
+ ["\uE04D", "\uE04D"], /* Private Use */
+ ["\uE04E", "\uE04E"], /* Private Use */
+ ["\uE04F", "\uE04F"], /* Private Use */
+ ["\uE050", "\uE050"], /* Private Use */
+ ["\uE051", "\uE051"], /* Private Use */
+ ["\uE052", "\uE052"], /* Private Use */
+ ["\uE053", "\uE053"], /* Private Use */
+ ["\uE054", "\uE054"], /* Private Use */
+ ["\uE055", "\uE055"], /* Private Use */
+ ["\uE056", "\uE056"], /* Private Use */
+ ["\uE057", "\uE057"], /* Private Use */
+ ["\uE058", "\uE058"], /* Private Use */
+ ["\uE059", "\uE059"], /* Private Use */
+ ["\uE05A", "\uE05A"], /* Private Use */
+ ["\uE05B", "\uE05B"], /* Private Use */
+ ["\uE05C", "\uE05C"], /* Private Use */
+ ["\uE05D", "\uE05D"], /* Private Use */
+ ["\uE05E", "\uE05E"], /* Private Use */
+ ["\uE05F", "\uE05F"], /* Private Use */
+ ["\uE060", "\uE060"], /* Private Use */
+ ["\uE061", "\uE061"], /* Private Use */
+ ["\uE062", "\uE062"], /* Private Use */
+ ["\uE063", "\uE063"], /* Private Use */
+ ["\uE064", "\uE064"], /* Private Use */
+ ["\uE065", "\uE065"], /* Private Use */
+ ["\uE066", "\uE066"], /* Private Use */
+ ["\uE067", "\uE067"], /* Private Use */
+ ["\uE068", "\uE068"], /* Private Use */
+ ["\uE069", "\uE069"], /* Private Use */
+ ["\uE06A", "\uE06A"], /* Private Use */
+ ["\uE06B", "\uE06B"], /* Private Use */
+ ["\uE06C", "\uE06C"], /* Private Use */
+ ["\uE06D", "\uE06D"], /* Private Use */
+ ["\uE06E", "\uE06E"], /* Private Use */
+ ["\uE06F", "\uE06F"], /* Private Use */
+ ["\uE070", "\uE070"], /* Private Use */
+ ["\uE071", "\uE071"], /* Private Use */
+ ["\uE072", "\uE072"], /* Private Use */
+ ["\uE073", "\uE073"], /* Private Use */
+ ["\uE074", "\uE074"], /* Private Use */
+ ["\uE075", "\uE075"], /* Private Use */
+ ["\uE076", "\uE076"], /* Private Use */
+ ["\uE077", "\uE077"], /* Private Use */
+ ["\uE078", "\uE078"], /* Private Use */
+ ["\uE079", "\uE079"], /* Private Use */
+ ["\uE07A", "\uE07A"], /* Private Use */
+ ["\uE07B", "\uE07B"], /* Private Use */
+ ["\uE07C", "\uE07C"], /* Private Use */
+ ["\uE07D", "\uE07D"], /* Private Use */
+ ["\uE07E", "\uE07E"], /* Private Use */
+ ["\uE07F", "\uE07F"], /* Private Use */
+ ["\uE080", "\uE080"], /* Private Use */
+ ["\uE081", "\uE081"], /* Private Use */
+ ["\uE082", "\uE082"], /* Private Use */
+ ["\uE083", "\uE083"], /* Private Use */
+ ["\uE084", "\uE084"], /* Private Use */
+ ["\uE085", "\uE085"], /* Private Use */
+ ["\uE086", "\uE086"], /* Private Use */
+ ["\uE087", "\uE087"], /* Private Use */
+ ["\uE088", "\uE088"], /* Private Use */
+ ["\uE089", "\uE089"], /* Private Use */
+ ["\uE08A", "\uE08A"], /* Private Use */
+ ["\uE08B", "\uE08B"], /* Private Use */
+ ["\uE08C", "\uE08C"], /* Private Use */
+ ["\uE08D", "\uE08D"], /* Private Use */
+ ["\uE08E", "\uE08E"], /* Private Use */
+ ["\uE08F", "\uE08F"], /* Private Use */
+ ["\uE090", "\uE090"], /* Private Use */
+ ["\uE091", "\uE091"], /* Private Use */
+ ["\uE092", "\uE092"], /* Private Use */
+ ["\uE093", "\uE093"], /* Private Use */
+ ["\uE094", "\uE094"], /* Private Use */
+ ["\uE095", "\uE095"], /* Private Use */
+ ["\uE096", "\uE096"], /* Private Use */
+ ["\uE097", "\uE097"], /* Private Use */
+ ["\uE098", "\uE098"], /* Private Use */
+ ["\uE099", "\uE099"], /* Private Use */
+ ["\uE09A", "\uE09A"], /* Private Use */
+ ["\uE09B", "\uE09B"], /* Private Use */
+ ["\uE09C", "\uE09C"], /* Private Use */
+ ["\uE09D", "\uE09D"], /* Private Use */
+ ["\uE09E", "\uE09E"], /* Private Use */
+ ["\uE09F", "\uE09F"], /* Private Use */
+ ["\uE0A0", "\uE0A0"], /* Private Use */
+ ["\uE0A1", "\uE0A1"], /* Private Use */
+ ["\uE0A2", "\uE0A2"], /* Private Use */
+ ["\uE0A3", "\uE0A3"], /* Private Use */
+ ["\uE0A4", "\uE0A4"], /* Private Use */
+ ["\uE0A5", "\uE0A5"], /* Private Use */
+ ["\uE0A6", "\uE0A6"], /* Private Use */
+ ["\uE0A7", "\uE0A7"], /* Private Use */
+ ["\uE0A8", "\uE0A8"], /* Private Use */
+ ["\uE0A9", "\uE0A9"], /* Private Use */
+ ["\uE0AA", "\uE0AA"], /* Private Use */
+ ["\uE0AB", "\uE0AB"], /* Private Use */
+ ["\uE0AC", "\uE0AC"], /* Private Use */
+ ["\uE0AD", "\uE0AD"], /* Private Use */
+ ["\uE0AE", "\uE0AE"], /* Private Use */
+ ["\uE0AF", "\uE0AF"], /* Private Use */
+ ["\uE0B0", "\uE0B0"], /* Private Use */
+ ["\uE0B1", "\uE0B1"], /* Private Use */
+ ["\uE0B2", "\uE0B2"], /* Private Use */
+ ["\uE0B3", "\uE0B3"], /* Private Use */
+ ["\uE0B4", "\uE0B4"], /* Private Use */
+ ["\uE0B5", "\uE0B5"], /* Private Use */
+ ["\uE0B6", "\uE0B6"], /* Private Use */
+ ["\uE0B7", "\uE0B7"], /* Private Use */
+ ["\uE0B8", "\uE0B8"], /* Private Use */
+ ["\uE0B9", "\uE0B9"], /* Private Use */
+ ["\uE0BA", "\uE0BA"], /* Private Use */
+ ["\uE0BB", "\uE0BB"], /* Private Use */
+ ["\uE0BC", "\uE0BC"], /* Private Use */
+ ["\uE0BD", "\uE0BD"], /* Private Use */
+ ["\uE0BE", "\uE0BE"], /* Private Use */
+ ["\uE0BF", "\uE0BF"], /* Private Use */
+ ["\uE0C0", "\uE0C0"], /* Private Use */
+ ["\uE0C1", "\uE0C1"], /* Private Use */
+ ["\uE0C2", "\uE0C2"], /* Private Use */
+ ["\uE0C3", "\uE0C3"], /* Private Use */
+ ["\uE0C4", "\uE0C4"], /* Private Use */
+ ["\uE0C5", "\uE0C5"], /* Private Use */
+ ["\uE0C6", "\uE0C6"], /* Private Use */
+ ["\uE0C7", "\uE0C7"], /* Private Use */
+ ["\uE0C8", "\uE0C8"], /* Private Use */
+ ["\uE0C9", "\uE0C9"], /* Private Use */
+ ["\uE0CA", "\uE0CA"], /* Private Use */
+ ["\uE0CB", "\uE0CB"], /* Private Use */
+ ["\uE0CC", "\uE0CC"], /* Private Use */
+ ["\uE0CD", "\uE0CD"], /* Private Use */
+ ["\uE0CE", "\uE0CE"], /* Private Use */
+ ["\uE0CF", "\uE0CF"], /* Private Use */
+ ["\uE0D0", "\uE0D0"], /* Private Use */
+ ["\uE0D1", "\uE0D1"], /* Private Use */
+ ["\uE0D2", "\uE0D2"], /* Private Use */
+ ["\uE0D3", "\uE0D3"], /* Private Use */
+ ["\uE0D4", "\uE0D4"], /* Private Use */
+ ["\uE0D5", "\uE0D5"], /* Private Use */
+ ["\uE0D6", "\uE0D6"], /* Private Use */
+ ["\uE0D7", "\uE0D7"], /* Private Use */
+ ["\uE0D8", "\uE0D8"], /* Private Use */
+ ["\uE0D9", "\uE0D9"], /* Private Use */
+ ["\uE0DA", "\uE0DA"], /* Private Use */
+ ["\uE0DB", "\uE0DB"], /* Private Use */
+ ["\uE0DC", "\uE0DC"], /* Private Use */
+ ["\uE0DD", "\uE0DD"], /* Private Use */
+ ["\uE0DE", "\uE0DE"], /* Private Use */
+ ["\uE0DF", "\uE0DF"], /* Private Use */
+ ["\uE0E0", "\uE0E0"], /* Private Use */
+ ["\uE0E1", "\uE0E1"], /* Private Use */
+ ["\uE0E2", "\uE0E2"], /* Private Use */
+ ["\uE0E3", "\uE0E3"], /* Private Use */
+ ["\uE0E4", "\uE0E4"], /* Private Use */
+ ["\uE0E5", "\uE0E5"], /* Private Use */
+ ["\uE0E6", "\uE0E6"], /* Private Use */
+ ["\uE0E7", "\uE0E7"], /* Private Use */
+ ["\uE0E8", "\uE0E8"], /* Private Use */
+ ["\uE0E9", "\uE0E9"], /* Private Use */
+ ["\uE0EA", "\uE0EA"], /* Private Use */
+ ["\uE0EB", "\uE0EB"], /* Private Use */
+ ["\uE0EC", "\uE0EC"], /* Private Use */
+ ["\uE0ED", "\uE0ED"], /* Private Use */
+ ["\uE0EE", "\uE0EE"], /* Private Use */
+ ["\uE0EF", "\uE0EF"], /* Private Use */
+ ["\uE0F0", "\uE0F0"], /* Private Use */
+ ["\uE0F1", "\uE0F1"], /* Private Use */
+ ["\uE0F2", "\uE0F2"], /* Private Use */
+ ["\uE0F3", "\uE0F3"], /* Private Use */
+ ["\uE0F4", "\uE0F4"], /* Private Use */
+ ["\uE0F5", "\uE0F5"], /* Private Use */
+ ["\uE0F6", "\uE0F6"], /* Private Use */
+ ["\uE0F7", "\uE0F7"], /* Private Use */
+ ["\uE0F8", "\uE0F8"], /* Private Use */
+ ["\uE0F9", "\uE0F9"], /* Private Use */
+ ["\uE0FA", "\uE0FA"], /* Private Use */
+ ["\uE0FB", "\uE0FB"], /* Private Use */
+ ["\uE0FC", "\uE0FC"], /* Private Use */
+ ["\uE0FD", "\uE0FD"], /* Private Use */
+ ["\uE0FE", "\uE0FE"], /* Private Use */
+ ["\uE0FF", "\uE0FF"], /* Private Use */
+ ["\uE100", "\uE100"], /* Private Use */
+ ["\uE101", "\uE101"], /* Private Use */
+ ["\uE102", "\uE102"], /* Private Use */
+ ["\uE103", "\uE103"], /* Private Use */
+ ["\uE104", "\uE104"], /* Private Use */
+ ["\uE105", "\uE105"], /* Private Use */
+ ["\uE106", "\uE106"], /* Private Use */
+ ["\uE107", "\uE107"], /* Private Use */
+ ["\uE108", "\uE108"], /* Private Use */
+ ["\uE109", "\uE109"], /* Private Use */
+ ["\uE10A", "\uE10A"], /* Private Use */
+ ["\uE10B", "\uE10B"], /* Private Use */
+ ["\uE10C", "\uE10C"], /* Private Use */
+ ["\uE10D", "\uE10D"], /* Private Use */
+ ["\uE10E", "\uE10E"], /* Private Use */
+ ["\uE10F", "\uE10F"], /* Private Use */
+ ["\uE110", "\uE110"], /* Private Use */
+ ["\uE111", "\uE111"], /* Private Use */
+ ["\uE112", "\uE112"], /* Private Use */
+ ["\uE113", "\uE113"], /* Private Use */
+ ["\uE114", "\uE114"], /* Private Use */
+ ["\uE115", "\uE115"], /* Private Use */
+ ["\uE116", "\uE116"], /* Private Use */
+ ["\uE117", "\uE117"], /* Private Use */
+ ["\uE118", "\uE118"], /* Private Use */
+ ["\uE119", "\uE119"], /* Private Use */
+ ["\uE11A", "\uE11A"], /* Private Use */
+ ["\uE11B", "\uE11B"], /* Private Use */
+ ["\uE11C", "\uE11C"], /* Private Use */
+ ["\uE11D", "\uE11D"], /* Private Use */
+ ["\uE11E", "\uE11E"], /* Private Use */
+ ["\uE11F", "\uE11F"], /* Private Use */
+ ["\uE120", "\uE120"], /* Private Use */
+ ["\uE121", "\uE121"], /* Private Use */
+ ["\uE122", "\uE122"], /* Private Use */
+ ["\uE123", "\uE123"], /* Private Use */
+ ["\uE124", "\uE124"], /* Private Use */
+ ["\uE125", "\uE125"], /* Private Use */
+ ["\uE126", "\uE126"], /* Private Use */
+ ["\uE127", "\uE127"], /* Private Use */
+ ["\uE128", "\uE128"], /* Private Use */
+ ["\uE129", "\uE129"], /* Private Use */
+ ["\uE12A", "\uE12A"], /* Private Use */
+ ["\uE12B", "\uE12B"], /* Private Use */
+ ["\uE12C", "\uE12C"], /* Private Use */
+ ["\uE12D", "\uE12D"], /* Private Use */
+ ["\uE12E", "\uE12E"], /* Private Use */
+ ["\uE12F", "\uE12F"], /* Private Use */
+ ["\uE130", "\uE130"], /* Private Use */
+ ["\uE131", "\uE131"], /* Private Use */
+ ["\uE132", "\uE132"], /* Private Use */
+ ["\uE133", "\uE133"], /* Private Use */
+ ["\uE134", "\uE134"], /* Private Use */
+ ["\uE135", "\uE135"], /* Private Use */
+ ["\uE136", "\uE136"], /* Private Use */
+ ["\uE137", "\uE137"], /* Private Use */
+ ["\uE138", "\uE138"], /* Private Use */
+ ["\uE139", "\uE139"], /* Private Use */
+ ["\uE13A", "\uE13A"], /* Private Use */
+ ["\uE13B", "\uE13B"], /* Private Use */
+ ["\uE13C", "\uE13C"], /* Private Use */
+ ["\uE13D", "\uE13D"], /* Private Use */
+ ["\uE13E", "\uE13E"], /* Private Use */
+ ["\uE13F", "\uE13F"], /* Private Use */
+ ["\uE140", "\uE140"], /* Private Use */
+ ["\uE141", "\uE141"], /* Private Use */
+ ["\uE142", "\uE142"], /* Private Use */
+ ["\uE143", "\uE143"], /* Private Use */
+ ["\uE144", "\uE144"], /* Private Use */
+ ["\uE145", "\uE145"], /* Private Use */
+ ["\uE146", "\uE146"], /* Private Use */
+ ["\uE147", "\uE147"], /* Private Use */
+ ["\uE148", "\uE148"], /* Private Use */
+ ["\uE149", "\uE149"], /* Private Use */
+ ["\uE14A", "\uE14A"], /* Private Use */
+ ["\uE14B", "\uE14B"], /* Private Use */
+ ["\uE14C", "\uE14C"], /* Private Use */
+ ["\uE14D", "\uE14D"], /* Private Use */
+ ["\uE14E", "\uE14E"], /* Private Use */
+ ["\uE14F", "\uE14F"], /* Private Use */
+ ["\uE150", "\uE150"], /* Private Use */
+ ["\uE151", "\uE151"], /* Private Use */
+ ["\uE152", "\uE152"], /* Private Use */
+ ["\uE153", "\uE153"], /* Private Use */
+ ["\uE154", "\uE154"], /* Private Use */
+ ["\uE155", "\uE155"], /* Private Use */
+ ["\uE156", "\uE156"], /* Private Use */
+ ["\uE157", "\uE157"], /* Private Use */
+ ["\uE158", "\uE158"], /* Private Use */
+ ["\uE159", "\uE159"], /* Private Use */
+ ["\uE15A", "\uE15A"], /* Private Use */
+ ["\uE15B", "\uE15B"], /* Private Use */
+ ["\uE15C", "\uE15C"], /* Private Use */
+ ["\uE15D", "\uE15D"], /* Private Use */
+ ["\uE15E", "\uE15E"], /* Private Use */
+ ["\uE15F", "\uE15F"], /* Private Use */
+ ["\uE160", "\uE160"], /* Private Use */
+ ["\uE161", "\uE161"], /* Private Use */
+ ["\uE162", "\uE162"], /* Private Use */
+ ["\uE163", "\uE163"], /* Private Use */
+ ["\uE164", "\uE164"], /* Private Use */
+ ["\uE165", "\uE165"], /* Private Use */
+ ["\uE166", "\uE166"], /* Private Use */
+ ["\uE167", "\uE167"], /* Private Use */
+ ["\uE168", "\uE168"], /* Private Use */
+ ["\uE169", "\uE169"], /* Private Use */
+ ["\uE16A", "\uE16A"], /* Private Use */
+ ["\uE16B", "\uE16B"], /* Private Use */
+ ["\uE16C", "\uE16C"], /* Private Use */
+ ["\uE16D", "\uE16D"], /* Private Use */
+ ["\uE16E", "\uE16E"], /* Private Use */
+ ["\uE16F", "\uE16F"], /* Private Use */
+ ["\uE170", "\uE170"], /* Private Use */
+ ["\uE171", "\uE171"], /* Private Use */
+ ["\uE172", "\uE172"], /* Private Use */
+ ["\uE173", "\uE173"], /* Private Use */
+ ["\uE174", "\uE174"], /* Private Use */
+ ["\uE175", "\uE175"], /* Private Use */
+ ["\uE176", "\uE176"], /* Private Use */
+ ["\uE177", "\uE177"], /* Private Use */
+ ["\uE178", "\uE178"], /* Private Use */
+ ["\uE179", "\uE179"], /* Private Use */
+ ["\uE17A", "\uE17A"], /* Private Use */
+ ["\uE17B", "\uE17B"], /* Private Use */
+ ["\uE17C", "\uE17C"], /* Private Use */
+ ["\uE17D", "\uE17D"], /* Private Use */
+ ["\uE17E", "\uE17E"], /* Private Use */
+ ["\uE17F", "\uE17F"], /* Private Use */
+ ["\uE180", "\uE180"], /* Private Use */
+ ["\uE181", "\uE181"], /* Private Use */
+ ["\uE182", "\uE182"], /* Private Use */
+ ["\uE183", "\uE183"], /* Private Use */
+ ["\uE184", "\uE184"], /* Private Use */
+ ["\uE185", "\uE185"], /* Private Use */
+ ["\uE186", "\uE186"], /* Private Use */
+ ["\uE187", "\uE187"], /* Private Use */
+ ["\uE188", "\uE188"], /* Private Use */
+ ["\uE189", "\uE189"], /* Private Use */
+ ["\uE18A", "\uE18A"], /* Private Use */
+ ["\uE18B", "\uE18B"], /* Private Use */
+ ["\uE18C", "\uE18C"], /* Private Use */
+ ["\uE18D", "\uE18D"], /* Private Use */
+ ["\uE18E", "\uE18E"], /* Private Use */
+ ["\uE18F", "\uE18F"], /* Private Use */
+ ["\uE190", "\uE190"], /* Private Use */
+ ["\uE191", "\uE191"], /* Private Use */
+ ["\uE192", "\uE192"], /* Private Use */
+ ["\uE193", "\uE193"], /* Private Use */
+ ["\uE194", "\uE194"], /* Private Use */
+ ["\uE195", "\uE195"], /* Private Use */
+ ["\uE196", "\uE196"], /* Private Use */
+ ["\uE197", "\uE197"], /* Private Use */
+ ["\uE198", "\uE198"], /* Private Use */
+ ["\uE199", "\uE199"], /* Private Use */
+ ["\uE19A", "\uE19A"], /* Private Use */
+ ["\uE19B", "\uE19B"], /* Private Use */
+ ["\uE19C", "\uE19C"], /* Private Use */
+ ["\uE19D", "\uE19D"], /* Private Use */
+ ["\uE19E", "\uE19E"], /* Private Use */
+ ["\uE19F", "\uE19F"], /* Private Use */
+ ["\uE1A0", "\uE1A0"], /* Private Use */
+ ["\uE1A1", "\uE1A1"], /* Private Use */
+ ["\uE1A2", "\uE1A2"], /* Private Use */
+ ["\uE1A3", "\uE1A3"], /* Private Use */
+ ["\uE1A4", "\uE1A4"], /* Private Use */
+ ["\uE1A5", "\uE1A5"], /* Private Use */
+ ["\uE1A6", "\uE1A6"], /* Private Use */
+ ["\uE1A7", "\uE1A7"], /* Private Use */
+ ["\uE1A8", "\uE1A8"], /* Private Use */
+ ["\uE1A9", "\uE1A9"], /* Private Use */
+ ["\uE1AA", "\uE1AA"], /* Private Use */
+ ["\uE1AB", "\uE1AB"], /* Private Use */
+ ["\uE1AC", "\uE1AC"], /* Private Use */
+ ["\uE1AD", "\uE1AD"], /* Private Use */
+ ["\uE1AE", "\uE1AE"], /* Private Use */
+ ["\uE1AF", "\uE1AF"], /* Private Use */
+ ["\uE1B0", "\uE1B0"], /* Private Use */
+ ["\uE1B1", "\uE1B1"], /* Private Use */
+ ["\uE1B2", "\uE1B2"], /* Private Use */
+ ["\uE1B3", "\uE1B3"], /* Private Use */
+ ["\uE1B4", "\uE1B4"], /* Private Use */
+ ["\uE1B5", "\uE1B5"], /* Private Use */
+ ["\uE1B6", "\uE1B6"], /* Private Use */
+ ["\uE1B7", "\uE1B7"], /* Private Use */
+ ["\uE1B8", "\uE1B8"], /* Private Use */
+ ["\uE1B9", "\uE1B9"], /* Private Use */
+ ["\uE1BA", "\uE1BA"], /* Private Use */
+ ["\uE1BB", "\uE1BB"], /* Private Use */
+ ["\uE1BC", "\uE1BC"], /* Private Use */
+ ["\uE1BD", "\uE1BD"], /* Private Use */
+ ["\uE1BE", "\uE1BE"], /* Private Use */
+ ["\uE1BF", "\uE1BF"], /* Private Use */
+ ["\uE1C0", "\uE1C0"], /* Private Use */
+ ["\uE1C1", "\uE1C1"], /* Private Use */
+ ["\uE1C2", "\uE1C2"], /* Private Use */
+ ["\uE1C3", "\uE1C3"], /* Private Use */
+ ["\uE1C4", "\uE1C4"], /* Private Use */
+ ["\uE1C5", "\uE1C5"], /* Private Use */
+ ["\uE1C6", "\uE1C6"], /* Private Use */
+ ["\uE1C7", "\uE1C7"], /* Private Use */
+ ["\uE1C8", "\uE1C8"], /* Private Use */
+ ["\uE1C9", "\uE1C9"], /* Private Use */
+ ["\uE1CA", "\uE1CA"], /* Private Use */
+ ["\uE1CB", "\uE1CB"], /* Private Use */
+ ["\uE1CC", "\uE1CC"], /* Private Use */
+ ["\uE1CD", "\uE1CD"], /* Private Use */
+ ["\uE1CE", "\uE1CE"], /* Private Use */
+ ["\uE1CF", "\uE1CF"], /* Private Use */
+ ["\uE1D0", "\uE1D0"], /* Private Use */
+ ["\uE1D1", "\uE1D1"], /* Private Use */
+ ["\uE1D2", "\uE1D2"], /* Private Use */
+ ["\uE1D3", "\uE1D3"], /* Private Use */
+ ["\uE1D4", "\uE1D4"], /* Private Use */
+ ["\uE1D5", "\uE1D5"], /* Private Use */
+ ["\uE1D6", "\uE1D6"], /* Private Use */
+ ["\uE1D7", "\uE1D7"], /* Private Use */
+ ["\uE1D8", "\uE1D8"], /* Private Use */
+ ["\uE1D9", "\uE1D9"], /* Private Use */
+ ["\uE1DA", "\uE1DA"], /* Private Use */
+ ["\uE1DB", "\uE1DB"], /* Private Use */
+ ["\uE1DC", "\uE1DC"], /* Private Use */
+ ["\uE1DD", "\uE1DD"], /* Private Use */
+ ["\uE1DE", "\uE1DE"], /* Private Use */
+ ["\uE1DF", "\uE1DF"], /* Private Use */
+ ["\uE1E0", "\uE1E0"], /* Private Use */
+ ["\uE1E1", "\uE1E1"], /* Private Use */
+ ["\uE1E2", "\uE1E2"], /* Private Use */
+ ["\uE1E3", "\uE1E3"], /* Private Use */
+ ["\uE1E4", "\uE1E4"], /* Private Use */
+ ["\uE1E5", "\uE1E5"], /* Private Use */
+ ["\uE1E6", "\uE1E6"], /* Private Use */
+ ["\uE1E7", "\uE1E7"], /* Private Use */
+ ["\uE1E8", "\uE1E8"], /* Private Use */
+ ["\uE1E9", "\uE1E9"], /* Private Use */
+ ["\uE1EA", "\uE1EA"], /* Private Use */
+ ["\uE1EB", "\uE1EB"], /* Private Use */
+ ["\uE1EC", "\uE1EC"], /* Private Use */
+ ["\uE1ED", "\uE1ED"], /* Private Use */
+ ["\uE1EE", "\uE1EE"], /* Private Use */
+ ["\uE1EF", "\uE1EF"], /* Private Use */
+ ["\uE1F0", "\uE1F0"], /* Private Use */
+ ["\uE1F1", "\uE1F1"], /* Private Use */
+ ["\uE1F2", "\uE1F2"], /* Private Use */
+ ["\uE1F3", "\uE1F3"], /* Private Use */
+ ["\uE1F4", "\uE1F4"], /* Private Use */
+ ["\uE1F5", "\uE1F5"], /* Private Use */
+ ["\uE1F6", "\uE1F6"], /* Private Use */
+ ["\uE1F7", "\uE1F7"], /* Private Use */
+ ["\uE1F8", "\uE1F8"], /* Private Use */
+ ["\uE1F9", "\uE1F9"], /* Private Use */
+ ["\uE1FA", "\uE1FA"], /* Private Use */
+ ["\uE1FB", "\uE1FB"], /* Private Use */
+ ["\uE1FC", "\uE1FC"], /* Private Use */
+ ["\uE1FD", "\uE1FD"], /* Private Use */
+ ["\uE1FE", "\uE1FE"], /* Private Use */
+ ["\uE1FF", "\uE1FF"], /* Private Use */
+ ["\uE200", "\uE200"], /* Private Use */
+ ["\uE201", "\uE201"], /* Private Use */
+ ["\uE202", "\uE202"], /* Private Use */
+ ["\uE203", "\uE203"], /* Private Use */
+ ["\uE204", "\uE204"], /* Private Use */
+ ["\uE205", "\uE205"], /* Private Use */
+ ["\uE206", "\uE206"], /* Private Use */
+ ["\uE207", "\uE207"], /* Private Use */
+ ["\uE208", "\uE208"], /* Private Use */
+ ["\uE209", "\uE209"], /* Private Use */
+ ["\uE20A", "\uE20A"], /* Private Use */
+ ["\uE20B", "\uE20B"], /* Private Use */
+ ["\uE20C", "\uE20C"], /* Private Use */
+ ["\uE20D", "\uE20D"], /* Private Use */
+ ["\uE20E", "\uE20E"], /* Private Use */
+ ["\uE20F", "\uE20F"], /* Private Use */
+ ["\uE210", "\uE210"], /* Private Use */
+ ["\uE211", "\uE211"], /* Private Use */
+ ["\uE212", "\uE212"], /* Private Use */
+ ["\uE213", "\uE213"], /* Private Use */
+ ["\uE214", "\uE214"], /* Private Use */
+ ["\uE215", "\uE215"], /* Private Use */
+ ["\uE216", "\uE216"], /* Private Use */
+ ["\uE217", "\uE217"], /* Private Use */
+ ["\uE218", "\uE218"], /* Private Use */
+ ["\uE219", "\uE219"], /* Private Use */
+ ["\uE21A", "\uE21A"], /* Private Use */
+ ["\uE21B", "\uE21B"], /* Private Use */
+ ["\uE21C", "\uE21C"], /* Private Use */
+ ["\uE21D", "\uE21D"], /* Private Use */
+ ["\uE21E", "\uE21E"], /* Private Use */
+ ["\uE21F", "\uE21F"], /* Private Use */
+ ["\uE220", "\uE220"], /* Private Use */
+ ["\uE221", "\uE221"], /* Private Use */
+ ["\uE222", "\uE222"], /* Private Use */
+ ["\uE223", "\uE223"], /* Private Use */
+ ["\uE224", "\uE224"], /* Private Use */
+ ["\uE225", "\uE225"], /* Private Use */
+ ["\uE226", "\uE226"], /* Private Use */
+ ["\uE227", "\uE227"], /* Private Use */
+ ["\uE228", "\uE228"], /* Private Use */
+ ["\uE229", "\uE229"], /* Private Use */
+ ["\uE22A", "\uE22A"], /* Private Use */
+ ["\uE22B", "\uE22B"], /* Private Use */
+ ["\uE22C", "\uE22C"], /* Private Use */
+ ["\uE22D", "\uE22D"], /* Private Use */
+ ["\uE22E", "\uE22E"], /* Private Use */
+ ["\uE22F", "\uE22F"], /* Private Use */
+ ["\uE230", "\uE230"], /* Private Use */
+ ["\uE231", "\uE231"], /* Private Use */
+ ["\uE232", "\uE232"], /* Private Use */
+ ["\uE233", "\uE233"], /* Private Use */
+ ["\uE234", "\uE234"], /* Private Use */
+ ["\uE235", "\uE235"], /* Private Use */
+ ["\uE236", "\uE236"], /* Private Use */
+ ["\uE237", "\uE237"], /* Private Use */
+ ["\uE238", "\uE238"], /* Private Use */
+ ["\uE239", "\uE239"], /* Private Use */
+ ["\uE23A", "\uE23A"], /* Private Use */
+ ["\uE23B", "\uE23B"], /* Private Use */
+ ["\uE23C", "\uE23C"], /* Private Use */
+ ["\uE23D", "\uE23D"], /* Private Use */
+ ["\uE23E", "\uE23E"], /* Private Use */
+ ["\uE23F", "\uE23F"], /* Private Use */
+ ["\uE240", "\uE240"], /* Private Use */
+ ["\uE241", "\uE241"], /* Private Use */
+ ["\uE242", "\uE242"], /* Private Use */
+ ["\uE243", "\uE243"], /* Private Use */
+ ["\uE244", "\uE244"], /* Private Use */
+ ["\uE245", "\uE245"], /* Private Use */
+ ["\uE246", "\uE246"], /* Private Use */
+ ["\uE247", "\uE247"], /* Private Use */
+ ["\uE248", "\uE248"], /* Private Use */
+ ["\uE249", "\uE249"], /* Private Use */
+ ["\uE24A", "\uE24A"], /* Private Use */
+ ["\uE24B", "\uE24B"], /* Private Use */
+ ["\uE24C", "\uE24C"], /* Private Use */
+ ["\uE24D", "\uE24D"], /* Private Use */
+ ["\uE24E", "\uE24E"], /* Private Use */
+ ["\uE24F", "\uE24F"], /* Private Use */
+ ["\uE250", "\uE250"], /* Private Use */
+ ["\uE251", "\uE251"], /* Private Use */
+ ["\uE252", "\uE252"], /* Private Use */
+ ["\uE253", "\uE253"], /* Private Use */
+ ["\uE254", "\uE254"], /* Private Use */
+ ["\uE255", "\uE255"], /* Private Use */
+ ["\uE256", "\uE256"], /* Private Use */
+ ["\uE257", "\uE257"], /* Private Use */
+ ["\uE258", "\uE258"], /* Private Use */
+ ["\uE259", "\uE259"], /* Private Use */
+ ["\uE25A", "\uE25A"], /* Private Use */
+ ["\uE25B", "\uE25B"], /* Private Use */
+ ["\uE25C", "\uE25C"], /* Private Use */
+ ["\uE25D", "\uE25D"], /* Private Use */
+ ["\uE25E", "\uE25E"], /* Private Use */
+ ["\uE25F", "\uE25F"], /* Private Use */
+ ["\uE260", "\uE260"], /* Private Use */
+ ["\uE261", "\uE261"], /* Private Use */
+ ["\uE262", "\uE262"], /* Private Use */
+ ["\uE263", "\uE263"], /* Private Use */
+ ["\uE264", "\uE264"], /* Private Use */
+ ["\uE265", "\uE265"], /* Private Use */
+ ["\uE266", "\uE266"], /* Private Use */
+ ["\uE267", "\uE267"], /* Private Use */
+ ["\uE268", "\uE268"], /* Private Use */
+ ["\uE269", "\uE269"], /* Private Use */
+ ["\uE26A", "\uE26A"], /* Private Use */
+ ["\uE26B", "\uE26B"], /* Private Use */
+ ["\uE26C", "\uE26C"], /* Private Use */
+ ["\uE26D", "\uE26D"], /* Private Use */
+ ["\uE26E", "\uE26E"], /* Private Use */
+ ["\uE26F", "\uE26F"], /* Private Use */
+ ["\uE270", "\uE270"], /* Private Use */
+ ["\uE271", "\uE271"], /* Private Use */
+ ["\uE272", "\uE272"], /* Private Use */
+ ["\uE273", "\uE273"], /* Private Use */
+ ["\uE274", "\uE274"], /* Private Use */
+ ["\uE275", "\uE275"], /* Private Use */
+ ["\uE276", "\uE276"], /* Private Use */
+ ["\uE277", "\uE277"], /* Private Use */
+ ["\uE278", "\uE278"], /* Private Use */
+ ["\uE279", "\uE279"], /* Private Use */
+ ["\uE27A", "\uE27A"], /* Private Use */
+ ["\uE27B", "\uE27B"], /* Private Use */
+ ["\uE27C", "\uE27C"], /* Private Use */
+ ["\uE27D", "\uE27D"], /* Private Use */
+ ["\uE27E", "\uE27E"], /* Private Use */
+ ["\uE27F", "\uE27F"], /* Private Use */
+ ["\uE280", "\uE280"], /* Private Use */
+ ["\uE281", "\uE281"], /* Private Use */
+ ["\uE282", "\uE282"], /* Private Use */
+ ["\uE283", "\uE283"], /* Private Use */
+ ["\uE284", "\uE284"], /* Private Use */
+ ["\uE285", "\uE285"], /* Private Use */
+ ["\uE286", "\uE286"], /* Private Use */
+ ["\uE287", "\uE287"], /* Private Use */
+ ["\uE288", "\uE288"], /* Private Use */
+ ["\uE289", "\uE289"], /* Private Use */
+ ["\uE28A", "\uE28A"], /* Private Use */
+ ["\uE28B", "\uE28B"], /* Private Use */
+ ["\uE28C", "\uE28C"], /* Private Use */
+ ["\uE28D", "\uE28D"], /* Private Use */
+ ["\uE28E", "\uE28E"], /* Private Use */
+ ["\uE28F", "\uE28F"], /* Private Use */
+ ["\uE290", "\uE290"], /* Private Use */
+ ["\uE291", "\uE291"], /* Private Use */
+ ["\uE292", "\uE292"], /* Private Use */
+ ["\uE293", "\uE293"], /* Private Use */
+ ["\uE294", "\uE294"], /* Private Use */
+ ["\uE295", "\uE295"], /* Private Use */
+ ["\uE296", "\uE296"], /* Private Use */
+ ["\uE297", "\uE297"], /* Private Use */
+ ["\uE298", "\uE298"], /* Private Use */
+ ["\uE299", "\uE299"], /* Private Use */
+ ["\uE29A", "\uE29A"], /* Private Use */
+ ["\uE29B", "\uE29B"], /* Private Use */
+ ["\uE29C", "\uE29C"], /* Private Use */
+ ["\uE29D", "\uE29D"], /* Private Use */
+ ["\uE29E", "\uE29E"], /* Private Use */
+ ["\uE29F", "\uE29F"], /* Private Use */
+ ["\uE2A0", "\uE2A0"], /* Private Use */
+ ["\uE2A1", "\uE2A1"], /* Private Use */
+ ["\uE2A2", "\uE2A2"], /* Private Use */
+ ["\uE2A3", "\uE2A3"], /* Private Use */
+ ["\uE2A4", "\uE2A4"], /* Private Use */
+ ["\uE2A5", "\uE2A5"], /* Private Use */
+ ["\uE2A6", "\uE2A6"], /* Private Use */
+ ["\uE2A7", "\uE2A7"], /* Private Use */
+ ["\uE2A8", "\uE2A8"], /* Private Use */
+ ["\uE2A9", "\uE2A9"], /* Private Use */
+ ["\uE2AA", "\uE2AA"], /* Private Use */
+ ["\uE2AB", "\uE2AB"], /* Private Use */
+ ["\uE2AC", "\uE2AC"], /* Private Use */
+ ["\uE2AD", "\uE2AD"], /* Private Use */
+ ["\uE2AE", "\uE2AE"], /* Private Use */
+ ["\uE2AF", "\uE2AF"], /* Private Use */
+ ["\uE2B0", "\uE2B0"], /* Private Use */
+ ["\uE2B1", "\uE2B1"], /* Private Use */
+ ["\uE2B2", "\uE2B2"], /* Private Use */
+ ["\uE2B3", "\uE2B3"], /* Private Use */
+ ["\uE2B4", "\uE2B4"], /* Private Use */
+ ["\uE2B5", "\uE2B5"], /* Private Use */
+ ["\uE2B6", "\uE2B6"], /* Private Use */
+ ["\uE2B7", "\uE2B7"], /* Private Use */
+ ["\uE2B8", "\uE2B8"], /* Private Use */
+ ["\uE2B9", "\uE2B9"], /* Private Use */
+ ["\uE2BA", "\uE2BA"], /* Private Use */
+ ["\uE2BB", "\uE2BB"], /* Private Use */
+ ["\uE2BC", "\uE2BC"], /* Private Use */
+ ["\uE2BD", "\uE2BD"], /* Private Use */
+ ["\uE2BE", "\uE2BE"], /* Private Use */
+ ["\uE2BF", "\uE2BF"], /* Private Use */
+ ["\uE2C0", "\uE2C0"], /* Private Use */
+ ["\uE2C1", "\uE2C1"], /* Private Use */
+ ["\uE2C2", "\uE2C2"], /* Private Use */
+ ["\uE2C3", "\uE2C3"], /* Private Use */
+ ["\uE2C4", "\uE2C4"], /* Private Use */
+ ["\uE2C5", "\uE2C5"], /* Private Use */
+ ["\uE2C6", "\uE2C6"], /* Private Use */
+ ["\uE2C7", "\uE2C7"], /* Private Use */
+ ["\uE2C8", "\uE2C8"], /* Private Use */
+ ["\uE2C9", "\uE2C9"], /* Private Use */
+ ["\uE2CA", "\uE2CA"], /* Private Use */
+ ["\uE2CB", "\uE2CB"], /* Private Use */
+ ["\uE2CC", "\uE2CC"], /* Private Use */
+ ["\uE2CD", "\uE2CD"], /* Private Use */
+ ["\uE2CE", "\uE2CE"], /* Private Use */
+ ["\uE2CF", "\uE2CF"], /* Private Use */
+ ["\uE2D0", "\uE2D0"], /* Private Use */
+ ["\uE2D1", "\uE2D1"], /* Private Use */
+ ["\uE2D2", "\uE2D2"], /* Private Use */
+ ["\uE2D3", "\uE2D3"], /* Private Use */
+ ["\uE2D4", "\uE2D4"], /* Private Use */
+ ["\uE2D5", "\uE2D5"], /* Private Use */
+ ["\uE2D6", "\uE2D6"], /* Private Use */
+ ["\uE2D7", "\uE2D7"], /* Private Use */
+ ["\uE2D8", "\uE2D8"], /* Private Use */
+ ["\uE2D9", "\uE2D9"], /* Private Use */
+ ["\uE2DA", "\uE2DA"], /* Private Use */
+ ["\uE2DB", "\uE2DB"], /* Private Use */
+ ["\uE2DC", "\uE2DC"], /* Private Use */
+ ["\uE2DD", "\uE2DD"], /* Private Use */
+ ["\uE2DE", "\uE2DE"], /* Private Use */
+ ["\uE2DF", "\uE2DF"], /* Private Use */
+ ["\uE2E0", "\uE2E0"], /* Private Use */
+ ["\uE2E1", "\uE2E1"], /* Private Use */
+ ["\uE2E2", "\uE2E2"], /* Private Use */
+ ["\uE2E3", "\uE2E3"], /* Private Use */
+ ["\uE2E4", "\uE2E4"], /* Private Use */
+ ["\uE2E5", "\uE2E5"], /* Private Use */
+ ["\uE2E6", "\uE2E6"], /* Private Use */
+ ["\uE2E7", "\uE2E7"], /* Private Use */
+ ["\uE2E8", "\uE2E8"], /* Private Use */
+ ["\uE2E9", "\uE2E9"], /* Private Use */
+ ["\uE2EA", "\uE2EA"], /* Private Use */
+ ["\uE2EB", "\uE2EB"], /* Private Use */
+ ["\uE2EC", "\uE2EC"], /* Private Use */
+ ["\uE2ED", "\uE2ED"], /* Private Use */
+ ["\uE2EE", "\uE2EE"], /* Private Use */
+ ["\uE2EF", "\uE2EF"], /* Private Use */
+ ["\uE2F0", "\uE2F0"], /* Private Use */
+ ["\uE2F1", "\uE2F1"], /* Private Use */
+ ["\uE2F2", "\uE2F2"], /* Private Use */
+ ["\uE2F3", "\uE2F3"], /* Private Use */
+ ["\uE2F4", "\uE2F4"], /* Private Use */
+ ["\uE2F5", "\uE2F5"], /* Private Use */
+ ["\uE2F6", "\uE2F6"], /* Private Use */
+ ["\uE2F7", "\uE2F7"], /* Private Use */
+ ["\uE2F8", "\uE2F8"], /* Private Use */
+ ["\uE2F9", "\uE2F9"], /* Private Use */
+ ["\uE2FA", "\uE2FA"], /* Private Use */
+ ["\uE2FB", "\uE2FB"], /* Private Use */
+ ["\uE2FC", "\uE2FC"], /* Private Use */
+ ["\uE2FD", "\uE2FD"], /* Private Use */
+ ["\uE2FE", "\uE2FE"], /* Private Use */
+ ["\uE2FF", "\uE2FF"], /* Private Use */
+ ["\uE300", "\uE300"], /* Private Use */
+ ["\uE301", "\uE301"], /* Private Use */
+ ["\uE302", "\uE302"], /* Private Use */
+ ["\uE303", "\uE303"], /* Private Use */
+ ["\uE304", "\uE304"], /* Private Use */
+ ["\uE305", "\uE305"], /* Private Use */
+ ["\uE306", "\uE306"], /* Private Use */
+ ["\uE307", "\uE307"], /* Private Use */
+ ["\uE308", "\uE308"], /* Private Use */
+ ["\uE309", "\uE309"], /* Private Use */
+ ["\uE30A", "\uE30A"], /* Private Use */
+ ["\uE30B", "\uE30B"], /* Private Use */
+ ["\uE30C", "\uE30C"], /* Private Use */
+ ["\uE30D", "\uE30D"], /* Private Use */
+ ["\uE30E", "\uE30E"], /* Private Use */
+ ["\uE30F", "\uE30F"], /* Private Use */
+ ["\uE310", "\uE310"], /* Private Use */
+ ["\uE311", "\uE311"], /* Private Use */
+ ["\uE312", "\uE312"], /* Private Use */
+ ["\uE313", "\uE313"], /* Private Use */
+ ["\uE314", "\uE314"], /* Private Use */
+ ["\uE315", "\uE315"], /* Private Use */
+ ["\uE316", "\uE316"], /* Private Use */
+ ["\uE317", "\uE317"], /* Private Use */
+ ["\uE318", "\uE318"], /* Private Use */
+ ["\uE319", "\uE319"], /* Private Use */
+ ["\uE31A", "\uE31A"], /* Private Use */
+ ["\uE31B", "\uE31B"], /* Private Use */
+ ["\uE31C", "\uE31C"], /* Private Use */
+ ["\uE31D", "\uE31D"], /* Private Use */
+ ["\uE31E", "\uE31E"], /* Private Use */
+ ["\uE31F", "\uE31F"], /* Private Use */
+ ["\uE320", "\uE320"], /* Private Use */
+ ["\uE321", "\uE321"], /* Private Use */
+ ["\uE322", "\uE322"], /* Private Use */
+ ["\uE323", "\uE323"], /* Private Use */
+ ["\uE324", "\uE324"], /* Private Use */
+ ["\uE325", "\uE325"], /* Private Use */
+ ["\uE326", "\uE326"], /* Private Use */
+ ["\uE327", "\uE327"], /* Private Use */
+ ["\uE328", "\uE328"], /* Private Use */
+ ["\uE329", "\uE329"], /* Private Use */
+ ["\uE32A", "\uE32A"], /* Private Use */
+ ["\uE32B", "\uE32B"], /* Private Use */
+ ["\uE32C", "\uE32C"], /* Private Use */
+ ["\uE32D", "\uE32D"], /* Private Use */
+ ["\uE32E", "\uE32E"], /* Private Use */
+ ["\uE32F", "\uE32F"], /* Private Use */
+ ["\uE330", "\uE330"], /* Private Use */
+ ["\uE331", "\uE331"], /* Private Use */
+ ["\uE332", "\uE332"], /* Private Use */
+ ["\uE333", "\uE333"], /* Private Use */
+ ["\uE334", "\uE334"], /* Private Use */
+ ["\uE335", "\uE335"], /* Private Use */
+ ["\uE336", "\uE336"], /* Private Use */
+ ["\uE337", "\uE337"], /* Private Use */
+ ["\uE338", "\uE338"], /* Private Use */
+ ["\uE339", "\uE339"], /* Private Use */
+ ["\uE33A", "\uE33A"], /* Private Use */
+ ["\uE33B", "\uE33B"], /* Private Use */
+ ["\uE33C", "\uE33C"], /* Private Use */
+ ["\uE33D", "\uE33D"], /* Private Use */
+ ["\uE33E", "\uE33E"], /* Private Use */
+ ["\uE33F", "\uE33F"], /* Private Use */
+ ["\uE340", "\uE340"], /* Private Use */
+ ["\uE341", "\uE341"], /* Private Use */
+ ["\uE342", "\uE342"], /* Private Use */
+ ["\uE343", "\uE343"], /* Private Use */
+ ["\uE344", "\uE344"], /* Private Use */
+ ["\uE345", "\uE345"], /* Private Use */
+ ["\uE346", "\uE346"], /* Private Use */
+ ["\uE347", "\uE347"], /* Private Use */
+ ["\uE348", "\uE348"], /* Private Use */
+ ["\uE349", "\uE349"], /* Private Use */
+ ["\uE34A", "\uE34A"], /* Private Use */
+ ["\uE34B", "\uE34B"], /* Private Use */
+ ["\uE34C", "\uE34C"], /* Private Use */
+ ["\uE34D", "\uE34D"], /* Private Use */
+ ["\uE34E", "\uE34E"], /* Private Use */
+ ["\uE34F", "\uE34F"], /* Private Use */
+ ["\uE350", "\uE350"], /* Private Use */
+ ["\uE351", "\uE351"], /* Private Use */
+ ["\uE352", "\uE352"], /* Private Use */
+ ["\uE353", "\uE353"], /* Private Use */
+ ["\uE354", "\uE354"], /* Private Use */
+ ["\uE355", "\uE355"], /* Private Use */
+ ["\uE356", "\uE356"], /* Private Use */
+ ["\uE357", "\uE357"], /* Private Use */
+ ["\uE358", "\uE358"], /* Private Use */
+ ["\uE359", "\uE359"], /* Private Use */
+ ["\uE35A", "\uE35A"], /* Private Use */
+ ["\uE35B", "\uE35B"], /* Private Use */
+ ["\uE35C", "\uE35C"], /* Private Use */
+ ["\uE35D", "\uE35D"], /* Private Use */
+ ["\uE35E", "\uE35E"], /* Private Use */
+ ["\uE35F", "\uE35F"], /* Private Use */
+ ["\uE360", "\uE360"], /* Private Use */
+ ["\uE361", "\uE361"], /* Private Use */
+ ["\uE362", "\uE362"], /* Private Use */
+ ["\uE363", "\uE363"], /* Private Use */
+ ["\uE364", "\uE364"], /* Private Use */
+ ["\uE365", "\uE365"], /* Private Use */
+ ["\uE366", "\uE366"], /* Private Use */
+ ["\uE367", "\uE367"], /* Private Use */
+ ["\uE368", "\uE368"], /* Private Use */
+ ["\uE369", "\uE369"], /* Private Use */
+ ["\uE36A", "\uE36A"], /* Private Use */
+ ["\uE36B", "\uE36B"], /* Private Use */
+ ["\uE36C", "\uE36C"], /* Private Use */
+ ["\uE36D", "\uE36D"], /* Private Use */
+ ["\uE36E", "\uE36E"], /* Private Use */
+ ["\uE36F", "\uE36F"], /* Private Use */
+ ["\uE370", "\uE370"], /* Private Use */
+ ["\uE371", "\uE371"], /* Private Use */
+ ["\uE372", "\uE372"], /* Private Use */
+ ["\uE373", "\uE373"], /* Private Use */
+ ["\uE374", "\uE374"], /* Private Use */
+ ["\uE375", "\uE375"], /* Private Use */
+ ["\uE376", "\uE376"], /* Private Use */
+ ["\uE377", "\uE377"], /* Private Use */
+ ["\uE378", "\uE378"], /* Private Use */
+ ["\uE379", "\uE379"], /* Private Use */
+ ["\uE37A", "\uE37A"], /* Private Use */
+ ["\uE37B", "\uE37B"], /* Private Use */
+ ["\uE37C", "\uE37C"], /* Private Use */
+ ["\uE37D", "\uE37D"], /* Private Use */
+ ["\uE37E", "\uE37E"], /* Private Use */
+ ["\uE37F", "\uE37F"], /* Private Use */
+ ["\uE380", "\uE380"], /* Private Use */
+ ["\uE381", "\uE381"], /* Private Use */
+ ["\uE382", "\uE382"], /* Private Use */
+ ["\uE383", "\uE383"], /* Private Use */
+ ["\uE384", "\uE384"], /* Private Use */
+ ["\uE385", "\uE385"], /* Private Use */
+ ["\uE386", "\uE386"], /* Private Use */
+ ["\uE387", "\uE387"], /* Private Use */
+ ["\uE388", "\uE388"], /* Private Use */
+ ["\uE389", "\uE389"], /* Private Use */
+ ["\uE38A", "\uE38A"], /* Private Use */
+ ["\uE38B", "\uE38B"], /* Private Use */
+ ["\uE38C", "\uE38C"], /* Private Use */
+ ["\uE38D", "\uE38D"], /* Private Use */
+ ["\uE38E", "\uE38E"], /* Private Use */
+ ["\uE38F", "\uE38F"], /* Private Use */
+ ["\uE390", "\uE390"], /* Private Use */
+ ["\uE391", "\uE391"], /* Private Use */
+ ["\uE392", "\uE392"], /* Private Use */
+ ["\uE393", "\uE393"], /* Private Use */
+ ["\uE394", "\uE394"], /* Private Use */
+ ["\uE395", "\uE395"], /* Private Use */
+ ["\uE396", "\uE396"], /* Private Use */
+ ["\uE397", "\uE397"], /* Private Use */
+ ["\uE398", "\uE398"], /* Private Use */
+ ["\uE399", "\uE399"], /* Private Use */
+ ["\uE39A", "\uE39A"], /* Private Use */
+ ["\uE39B", "\uE39B"], /* Private Use */
+ ["\uE39C", "\uE39C"], /* Private Use */
+ ["\uE39D", "\uE39D"], /* Private Use */
+ ["\uE39E", "\uE39E"], /* Private Use */
+ ["\uE39F", "\uE39F"], /* Private Use */
+ ["\uE3A0", "\uE3A0"], /* Private Use */
+ ["\uE3A1", "\uE3A1"], /* Private Use */
+ ["\uE3A2", "\uE3A2"], /* Private Use */
+ ["\uE3A3", "\uE3A3"], /* Private Use */
+ ["\uE3A4", "\uE3A4"], /* Private Use */
+ ["\uE3A5", "\uE3A5"], /* Private Use */
+ ["\uE3A6", "\uE3A6"], /* Private Use */
+ ["\uE3A7", "\uE3A7"], /* Private Use */
+ ["\uE3A8", "\uE3A8"], /* Private Use */
+ ["\uE3A9", "\uE3A9"], /* Private Use */
+ ["\uE3AA", "\uE3AA"], /* Private Use */
+ ["\uE3AB", "\uE3AB"], /* Private Use */
+ ["\uE3AC", "\uE3AC"], /* Private Use */
+ ["\uE3AD", "\uE3AD"], /* Private Use */
+ ["\uE3AE", "\uE3AE"], /* Private Use */
+ ["\uE3AF", "\uE3AF"], /* Private Use */
+ ["\uE3B0", "\uE3B0"], /* Private Use */
+ ["\uE3B1", "\uE3B1"], /* Private Use */
+ ["\uE3B2", "\uE3B2"], /* Private Use */
+ ["\uE3B3", "\uE3B3"], /* Private Use */
+ ["\uE3B4", "\uE3B4"], /* Private Use */
+ ["\uE3B5", "\uE3B5"], /* Private Use */
+ ["\uE3B6", "\uE3B6"], /* Private Use */
+ ["\uE3B7", "\uE3B7"], /* Private Use */
+ ["\uE3B8", "\uE3B8"], /* Private Use */
+ ["\uE3B9", "\uE3B9"], /* Private Use */
+ ["\uE3BA", "\uE3BA"], /* Private Use */
+ ["\uE3BB", "\uE3BB"], /* Private Use */
+ ["\uE3BC", "\uE3BC"], /* Private Use */
+ ["\uE3BD", "\uE3BD"], /* Private Use */
+ ["\uE3BE", "\uE3BE"], /* Private Use */
+ ["\uE3BF", "\uE3BF"], /* Private Use */
+ ["\uE3C0", "\uE3C0"], /* Private Use */
+ ["\uE3C1", "\uE3C1"], /* Private Use */
+ ["\uE3C2", "\uE3C2"], /* Private Use */
+ ["\uE3C3", "\uE3C3"], /* Private Use */
+ ["\uE3C4", "\uE3C4"], /* Private Use */
+ ["\uE3C5", "\uE3C5"], /* Private Use */
+ ["\uE3C6", "\uE3C6"], /* Private Use */
+ ["\uE3C7", "\uE3C7"], /* Private Use */
+ ["\uE3C8", "\uE3C8"], /* Private Use */
+ ["\uE3C9", "\uE3C9"], /* Private Use */
+ ["\uE3CA", "\uE3CA"], /* Private Use */
+ ["\uE3CB", "\uE3CB"], /* Private Use */
+ ["\uE3CC", "\uE3CC"], /* Private Use */
+ ["\uE3CD", "\uE3CD"], /* Private Use */
+ ["\uE3CE", "\uE3CE"], /* Private Use */
+ ["\uE3CF", "\uE3CF"], /* Private Use */
+ ["\uE3D0", "\uE3D0"], /* Private Use */
+ ["\uE3D1", "\uE3D1"], /* Private Use */
+ ["\uE3D2", "\uE3D2"], /* Private Use */
+ ["\uE3D3", "\uE3D3"], /* Private Use */
+ ["\uE3D4", "\uE3D4"], /* Private Use */
+ ["\uE3D5", "\uE3D5"], /* Private Use */
+ ["\uE3D6", "\uE3D6"], /* Private Use */
+ ["\uE3D7", "\uE3D7"], /* Private Use */
+ ["\uE3D8", "\uE3D8"], /* Private Use */
+ ["\uE3D9", "\uE3D9"], /* Private Use */
+ ["\uE3DA", "\uE3DA"], /* Private Use */
+ ["\uE3DB", "\uE3DB"], /* Private Use */
+ ["\uE3DC", "\uE3DC"], /* Private Use */
+ ["\uE3DD", "\uE3DD"], /* Private Use */
+ ["\uE3DE", "\uE3DE"], /* Private Use */
+ ["\uE3DF", "\uE3DF"], /* Private Use */
+ ["\uE3E0", "\uE3E0"], /* Private Use */
+ ["\uE3E1", "\uE3E1"], /* Private Use */
+ ["\uE3E2", "\uE3E2"], /* Private Use */
+ ["\uE3E3", "\uE3E3"], /* Private Use */
+ ["\uE3E4", "\uE3E4"], /* Private Use */
+ ["\uE3E5", "\uE3E5"], /* Private Use */
+ ["\uE3E6", "\uE3E6"], /* Private Use */
+ ["\uE3E7", "\uE3E7"], /* Private Use */
+ ["\uE3E8", "\uE3E8"], /* Private Use */
+ ["\uE3E9", "\uE3E9"], /* Private Use */
+ ["\uE3EA", "\uE3EA"], /* Private Use */
+ ["\uE3EB", "\uE3EB"], /* Private Use */
+ ["\uE3EC", "\uE3EC"], /* Private Use */
+ ["\uE3ED", "\uE3ED"], /* Private Use */
+ ["\uE3EE", "\uE3EE"], /* Private Use */
+ ["\uE3EF", "\uE3EF"], /* Private Use */
+ ["\uE3F0", "\uE3F0"], /* Private Use */
+ ["\uE3F1", "\uE3F1"], /* Private Use */
+ ["\uE3F2", "\uE3F2"], /* Private Use */
+ ["\uE3F3", "\uE3F3"], /* Private Use */
+ ["\uE3F4", "\uE3F4"], /* Private Use */
+ ["\uE3F5", "\uE3F5"], /* Private Use */
+ ["\uE3F6", "\uE3F6"], /* Private Use */
+ ["\uE3F7", "\uE3F7"], /* Private Use */
+ ["\uE3F8", "\uE3F8"], /* Private Use */
+ ["\uE3F9", "\uE3F9"], /* Private Use */
+ ["\uE3FA", "\uE3FA"], /* Private Use */
+ ["\uE3FB", "\uE3FB"], /* Private Use */
+ ["\uE3FC", "\uE3FC"], /* Private Use */
+ ["\uE3FD", "\uE3FD"], /* Private Use */
+ ["\uE3FE", "\uE3FE"], /* Private Use */
+ ["\uE3FF", "\uE3FF"], /* Private Use */
+ ["\uE400", "\uE400"], /* Private Use */
+ ["\uE401", "\uE401"], /* Private Use */
+ ["\uE402", "\uE402"], /* Private Use */
+ ["\uE403", "\uE403"], /* Private Use */
+ ["\uE404", "\uE404"], /* Private Use */
+ ["\uE405", "\uE405"], /* Private Use */
+ ["\uE406", "\uE406"], /* Private Use */
+ ["\uE407", "\uE407"], /* Private Use */
+ ["\uE408", "\uE408"], /* Private Use */
+ ["\uE409", "\uE409"], /* Private Use */
+ ["\uE40A", "\uE40A"], /* Private Use */
+ ["\uE40B", "\uE40B"], /* Private Use */
+ ["\uE40C", "\uE40C"], /* Private Use */
+ ["\uE40D", "\uE40D"], /* Private Use */
+ ["\uE40E", "\uE40E"], /* Private Use */
+ ["\uE40F", "\uE40F"], /* Private Use */
+ ["\uE410", "\uE410"], /* Private Use */
+ ["\uE411", "\uE411"], /* Private Use */
+ ["\uE412", "\uE412"], /* Private Use */
+ ["\uE413", "\uE413"], /* Private Use */
+ ["\uE414", "\uE414"], /* Private Use */
+ ["\uE415", "\uE415"], /* Private Use */
+ ["\uE416", "\uE416"], /* Private Use */
+ ["\uE417", "\uE417"], /* Private Use */
+ ["\uE418", "\uE418"], /* Private Use */
+ ["\uE419", "\uE419"], /* Private Use */
+ ["\uE41A", "\uE41A"], /* Private Use */
+ ["\uE41B", "\uE41B"], /* Private Use */
+ ["\uE41C", "\uE41C"], /* Private Use */
+ ["\uE41D", "\uE41D"], /* Private Use */
+ ["\uE41E", "\uE41E"], /* Private Use */
+ ["\uE41F", "\uE41F"], /* Private Use */
+ ["\uE420", "\uE420"], /* Private Use */
+ ["\uE421", "\uE421"], /* Private Use */
+ ["\uE422", "\uE422"], /* Private Use */
+ ["\uE423", "\uE423"], /* Private Use */
+ ["\uE424", "\uE424"], /* Private Use */
+ ["\uE425", "\uE425"], /* Private Use */
+ ["\uE426", "\uE426"], /* Private Use */
+ ["\uE427", "\uE427"], /* Private Use */
+ ["\uE428", "\uE428"], /* Private Use */
+ ["\uE429", "\uE429"], /* Private Use */
+ ["\uE42A", "\uE42A"], /* Private Use */
+ ["\uE42B", "\uE42B"], /* Private Use */
+ ["\uE42C", "\uE42C"], /* Private Use */
+ ["\uE42D", "\uE42D"], /* Private Use */
+ ["\uE42E", "\uE42E"], /* Private Use */
+ ["\uE42F", "\uE42F"], /* Private Use */
+ ["\uE430", "\uE430"], /* Private Use */
+ ["\uE431", "\uE431"], /* Private Use */
+ ["\uE432", "\uE432"], /* Private Use */
+ ["\uE433", "\uE433"], /* Private Use */
+ ["\uE434", "\uE434"], /* Private Use */
+ ["\uE435", "\uE435"], /* Private Use */
+ ["\uE436", "\uE436"], /* Private Use */
+ ["\uE437", "\uE437"], /* Private Use */
+ ["\uE438", "\uE438"], /* Private Use */
+ ["\uE439", "\uE439"], /* Private Use */
+ ["\uE43A", "\uE43A"], /* Private Use */
+ ["\uE43B", "\uE43B"], /* Private Use */
+ ["\uE43C", "\uE43C"], /* Private Use */
+ ["\uE43D", "\uE43D"], /* Private Use */
+ ["\uE43E", "\uE43E"], /* Private Use */
+ ["\uE43F", "\uE43F"], /* Private Use */
+ ["\uE440", "\uE440"], /* Private Use */
+ ["\uE441", "\uE441"], /* Private Use */
+ ["\uE442", "\uE442"], /* Private Use */
+ ["\uE443", "\uE443"], /* Private Use */
+ ["\uE444", "\uE444"], /* Private Use */
+ ["\uE445", "\uE445"], /* Private Use */
+ ["\uE446", "\uE446"], /* Private Use */
+ ["\uE447", "\uE447"], /* Private Use */
+ ["\uE448", "\uE448"], /* Private Use */
+ ["\uE449", "\uE449"], /* Private Use */
+ ["\uE44A", "\uE44A"], /* Private Use */
+ ["\uE44B", "\uE44B"], /* Private Use */
+ ["\uE44C", "\uE44C"], /* Private Use */
+ ["\uE44D", "\uE44D"], /* Private Use */
+ ["\uE44E", "\uE44E"], /* Private Use */
+ ["\uE44F", "\uE44F"], /* Private Use */
+ ["\uE450", "\uE450"], /* Private Use */
+ ["\uE451", "\uE451"], /* Private Use */
+ ["\uE452", "\uE452"], /* Private Use */
+ ["\uE453", "\uE453"], /* Private Use */
+ ["\uE454", "\uE454"], /* Private Use */
+ ["\uE455", "\uE455"], /* Private Use */
+ ["\uE456", "\uE456"], /* Private Use */
+ ["\uE457", "\uE457"], /* Private Use */
+ ["\uE458", "\uE458"], /* Private Use */
+ ["\uE459", "\uE459"], /* Private Use */
+ ["\uE45A", "\uE45A"], /* Private Use */
+ ["\uE45B", "\uE45B"], /* Private Use */
+ ["\uE45C", "\uE45C"], /* Private Use */
+ ["\uE45D", "\uE45D"], /* Private Use */
+ ["\uE45E", "\uE45E"], /* Private Use */
+ ["\uE45F", "\uE45F"], /* Private Use */
+ ["\uE460", "\uE460"], /* Private Use */
+ ["\uE461", "\uE461"], /* Private Use */
+ ["\uE462", "\uE462"], /* Private Use */
+ ["\uE463", "\uE463"], /* Private Use */
+ ["\uE464", "\uE464"], /* Private Use */
+ ["\uE465", "\uE465"], /* Private Use */
+ ["\uE466", "\uE466"], /* Private Use */
+ ["\uE467", "\uE467"], /* Private Use */
+ ["\uE468", "\uE468"], /* Private Use */
+ ["\uE469", "\uE469"], /* Private Use */
+ ["\uE46A", "\uE46A"], /* Private Use */
+ ["\uE46B", "\uE46B"], /* Private Use */
+ ["\uE46C", "\uE46C"], /* Private Use */
+ ["\uE46D", "\uE46D"], /* Private Use */
+ ["\uE46E", "\uE46E"], /* Private Use */
+ ["\uE46F", "\uE46F"], /* Private Use */
+ ["\uE470", "\uE470"], /* Private Use */
+ ["\uE471", "\uE471"], /* Private Use */
+ ["\uE472", "\uE472"], /* Private Use */
+ ["\uE473", "\uE473"], /* Private Use */
+ ["\uE474", "\uE474"], /* Private Use */
+ ["\uE475", "\uE475"], /* Private Use */
+ ["\uE476", "\uE476"], /* Private Use */
+ ["\uE477", "\uE477"], /* Private Use */
+ ["\uE478", "\uE478"], /* Private Use */
+ ["\uE479", "\uE479"], /* Private Use */
+ ["\uE47A", "\uE47A"], /* Private Use */
+ ["\uE47B", "\uE47B"], /* Private Use */
+ ["\uE47C", "\uE47C"], /* Private Use */
+ ["\uE47D", "\uE47D"], /* Private Use */
+ ["\uE47E", "\uE47E"], /* Private Use */
+ ["\uE47F", "\uE47F"], /* Private Use */
+ ["\uE480", "\uE480"], /* Private Use */
+ ["\uE481", "\uE481"], /* Private Use */
+ ["\uE482", "\uE482"], /* Private Use */
+ ["\uE483", "\uE483"], /* Private Use */
+ ["\uE484", "\uE484"], /* Private Use */
+ ["\uE485", "\uE485"], /* Private Use */
+ ["\uE486", "\uE486"], /* Private Use */
+ ["\uE487", "\uE487"], /* Private Use */
+ ["\uE488", "\uE488"], /* Private Use */
+ ["\uE489", "\uE489"], /* Private Use */
+ ["\uE48A", "\uE48A"], /* Private Use */
+ ["\uE48B", "\uE48B"], /* Private Use */
+ ["\uE48C", "\uE48C"], /* Private Use */
+ ["\uE48D", "\uE48D"], /* Private Use */
+ ["\uE48E", "\uE48E"], /* Private Use */
+ ["\uE48F", "\uE48F"], /* Private Use */
+ ["\uE490", "\uE490"], /* Private Use */
+ ["\uE491", "\uE491"], /* Private Use */
+ ["\uE492", "\uE492"], /* Private Use */
+ ["\uE493", "\uE493"], /* Private Use */
+ ["\uE494", "\uE494"], /* Private Use */
+ ["\uE495", "\uE495"], /* Private Use */
+ ["\uE496", "\uE496"], /* Private Use */
+ ["\uE497", "\uE497"], /* Private Use */
+ ["\uE498", "\uE498"], /* Private Use */
+ ["\uE499", "\uE499"], /* Private Use */
+ ["\uE49A", "\uE49A"], /* Private Use */
+ ["\uE49B", "\uE49B"], /* Private Use */
+ ["\uE49C", "\uE49C"], /* Private Use */
+ ["\uE49D", "\uE49D"], /* Private Use */
+ ["\uE49E", "\uE49E"], /* Private Use */
+ ["\uE49F", "\uE49F"], /* Private Use */
+ ["\uE4A0", "\uE4A0"], /* Private Use */
+ ["\uE4A1", "\uE4A1"], /* Private Use */
+ ["\uE4A2", "\uE4A2"], /* Private Use */
+ ["\uE4A3", "\uE4A3"], /* Private Use */
+ ["\uE4A4", "\uE4A4"], /* Private Use */
+ ["\uE4A5", "\uE4A5"], /* Private Use */
+ ["\uE4A6", "\uE4A6"], /* Private Use */
+ ["\uE4A7", "\uE4A7"], /* Private Use */
+ ["\uE4A8", "\uE4A8"], /* Private Use */
+ ["\uE4A9", "\uE4A9"], /* Private Use */
+ ["\uE4AA", "\uE4AA"], /* Private Use */
+ ["\uE4AB", "\uE4AB"], /* Private Use */
+ ["\uE4AC", "\uE4AC"], /* Private Use */
+ ["\uE4AD", "\uE4AD"], /* Private Use */
+ ["\uE4AE", "\uE4AE"], /* Private Use */
+ ["\uE4AF", "\uE4AF"], /* Private Use */
+ ["\uE4B0", "\uE4B0"], /* Private Use */
+ ["\uE4B1", "\uE4B1"], /* Private Use */
+ ["\uE4B2", "\uE4B2"], /* Private Use */
+ ["\uE4B3", "\uE4B3"], /* Private Use */
+ ["\uE4B4", "\uE4B4"], /* Private Use */
+ ["\uE4B5", "\uE4B5"], /* Private Use */
+ ["\uE4B6", "\uE4B6"], /* Private Use */
+ ["\uE4B7", "\uE4B7"], /* Private Use */
+ ["\uE4B8", "\uE4B8"], /* Private Use */
+ ["\uE4B9", "\uE4B9"], /* Private Use */
+ ["\uE4BA", "\uE4BA"], /* Private Use */
+ ["\uE4BB", "\uE4BB"], /* Private Use */
+ ["\uE4BC", "\uE4BC"], /* Private Use */
+ ["\uE4BD", "\uE4BD"], /* Private Use */
+ ["\uE4BE", "\uE4BE"], /* Private Use */
+ ["\uE4BF", "\uE4BF"], /* Private Use */
+ ["\uE4C0", "\uE4C0"], /* Private Use */
+ ["\uE4C1", "\uE4C1"], /* Private Use */
+ ["\uE4C2", "\uE4C2"], /* Private Use */
+ ["\uE4C3", "\uE4C3"], /* Private Use */
+ ["\uE4C4", "\uE4C4"], /* Private Use */
+ ["\uE4C5", "\uE4C5"], /* Private Use */
+ ["\uE4C6", "\uE4C6"], /* Private Use */
+ ["\uE4C7", "\uE4C7"], /* Private Use */
+ ["\uE4C8", "\uE4C8"], /* Private Use */
+ ["\uE4C9", "\uE4C9"], /* Private Use */
+ ["\uE4CA", "\uE4CA"], /* Private Use */
+ ["\uE4CB", "\uE4CB"], /* Private Use */
+ ["\uE4CC", "\uE4CC"], /* Private Use */
+ ["\uE4CD", "\uE4CD"], /* Private Use */
+ ["\uE4CE", "\uE4CE"], /* Private Use */
+ ["\uE4CF", "\uE4CF"], /* Private Use */
+ ["\uE4D0", "\uE4D0"], /* Private Use */
+ ["\uE4D1", "\uE4D1"], /* Private Use */
+ ["\uE4D2", "\uE4D2"], /* Private Use */
+ ["\uE4D3", "\uE4D3"], /* Private Use */
+ ["\uE4D4", "\uE4D4"], /* Private Use */
+ ["\uE4D5", "\uE4D5"], /* Private Use */
+ ["\uE4D6", "\uE4D6"], /* Private Use */
+ ["\uE4D7", "\uE4D7"], /* Private Use */
+ ["\uE4D8", "\uE4D8"], /* Private Use */
+ ["\uE4D9", "\uE4D9"], /* Private Use */
+ ["\uE4DA", "\uE4DA"], /* Private Use */
+ ["\uE4DB", "\uE4DB"], /* Private Use */
+ ["\uE4DC", "\uE4DC"], /* Private Use */
+ ["\uE4DD", "\uE4DD"], /* Private Use */
+ ["\uE4DE", "\uE4DE"], /* Private Use */
+ ["\uE4DF", "\uE4DF"], /* Private Use */
+ ["\uE4E0", "\uE4E0"], /* Private Use */
+ ["\uE4E1", "\uE4E1"], /* Private Use */
+ ["\uE4E2", "\uE4E2"], /* Private Use */
+ ["\uE4E3", "\uE4E3"], /* Private Use */
+ ["\uE4E4", "\uE4E4"], /* Private Use */
+ ["\uE4E5", "\uE4E5"], /* Private Use */
+ ["\uE4E6", "\uE4E6"], /* Private Use */
+ ["\uE4E7", "\uE4E7"], /* Private Use */
+ ["\uE4E8", "\uE4E8"], /* Private Use */
+ ["\uE4E9", "\uE4E9"], /* Private Use */
+ ["\uE4EA", "\uE4EA"], /* Private Use */
+ ["\uE4EB", "\uE4EB"], /* Private Use */
+ ["\uE4EC", "\uE4EC"], /* Private Use */
+ ["\uE4ED", "\uE4ED"], /* Private Use */
+ ["\uE4EE", "\uE4EE"], /* Private Use */
+ ["\uE4EF", "\uE4EF"], /* Private Use */
+ ["\uE4F0", "\uE4F0"], /* Private Use */
+ ["\uE4F1", "\uE4F1"], /* Private Use */
+ ["\uE4F2", "\uE4F2"], /* Private Use */
+ ["\uE4F3", "\uE4F3"], /* Private Use */
+ ["\uE4F4", "\uE4F4"], /* Private Use */
+ ["\uE4F5", "\uE4F5"], /* Private Use */
+ ["\uE4F6", "\uE4F6"], /* Private Use */
+ ["\uE4F7", "\uE4F7"], /* Private Use */
+ ["\uE4F8", "\uE4F8"], /* Private Use */
+ ["\uE4F9", "\uE4F9"], /* Private Use */
+ ["\uE4FA", "\uE4FA"], /* Private Use */
+ ["\uE4FB", "\uE4FB"], /* Private Use */
+ ["\uE4FC", "\uE4FC"], /* Private Use */
+ ["\uE4FD", "\uE4FD"], /* Private Use */
+ ["\uE4FE", "\uE4FE"], /* Private Use */
+ ["\uE4FF", "\uE4FF"], /* Private Use */
+ ["\uE500", "\uE500"], /* Private Use */
+ ["\uE501", "\uE501"], /* Private Use */
+ ["\uE502", "\uE502"], /* Private Use */
+ ["\uE503", "\uE503"], /* Private Use */
+ ["\uE504", "\uE504"], /* Private Use */
+ ["\uE505", "\uE505"], /* Private Use */
+ ["\uE506", "\uE506"], /* Private Use */
+ ["\uE507", "\uE507"], /* Private Use */
+ ["\uE508", "\uE508"], /* Private Use */
+ ["\uE509", "\uE509"], /* Private Use */
+ ["\uE50A", "\uE50A"], /* Private Use */
+ ["\uE50B", "\uE50B"], /* Private Use */
+ ["\uE50C", "\uE50C"], /* Private Use */
+ ["\uE50D", "\uE50D"], /* Private Use */
+ ["\uE50E", "\uE50E"], /* Private Use */
+ ["\uE50F", "\uE50F"], /* Private Use */
+ ["\uE510", "\uE510"], /* Private Use */
+ ["\uE511", "\uE511"], /* Private Use */
+ ["\uE512", "\uE512"], /* Private Use */
+ ["\uE513", "\uE513"], /* Private Use */
+ ["\uE514", "\uE514"], /* Private Use */
+ ["\uE515", "\uE515"], /* Private Use */
+ ["\uE516", "\uE516"], /* Private Use */
+ ["\uE517", "\uE517"], /* Private Use */
+ ["\uE518", "\uE518"], /* Private Use */
+ ["\uE519", "\uE519"], /* Private Use */
+ ["\uE51A", "\uE51A"], /* Private Use */
+ ["\uE51B", "\uE51B"], /* Private Use */
+ ["\uE51C", "\uE51C"], /* Private Use */
+ ["\uE51D", "\uE51D"], /* Private Use */
+ ["\uE51E", "\uE51E"], /* Private Use */
+ ["\uE51F", "\uE51F"], /* Private Use */
+ ["\uE520", "\uE520"], /* Private Use */
+ ["\uE521", "\uE521"], /* Private Use */
+ ["\uE522", "\uE522"], /* Private Use */
+ ["\uE523", "\uE523"], /* Private Use */
+ ["\uE524", "\uE524"], /* Private Use */
+ ["\uE525", "\uE525"], /* Private Use */
+ ["\uE526", "\uE526"], /* Private Use */
+ ["\uE527", "\uE527"], /* Private Use */
+ ["\uE528", "\uE528"], /* Private Use */
+ ["\uE529", "\uE529"], /* Private Use */
+ ["\uE52A", "\uE52A"], /* Private Use */
+ ["\uE52B", "\uE52B"], /* Private Use */
+ ["\uE52C", "\uE52C"], /* Private Use */
+ ["\uE52D", "\uE52D"], /* Private Use */
+ ["\uE52E", "\uE52E"], /* Private Use */
+ ["\uE52F", "\uE52F"], /* Private Use */
+ ["\uE530", "\uE530"], /* Private Use */
+ ["\uE531", "\uE531"], /* Private Use */
+ ["\uE532", "\uE532"], /* Private Use */
+ ["\uE533", "\uE533"], /* Private Use */
+ ["\uE534", "\uE534"], /* Private Use */
+ ["\uE535", "\uE535"], /* Private Use */
+ ["\uE536", "\uE536"], /* Private Use */
+ ["\uE537", "\uE537"], /* Private Use */
+ ["\uE538", "\uE538"], /* Private Use */
+ ["\uE539", "\uE539"], /* Private Use */
+ ["\uE53A", "\uE53A"], /* Private Use */
+ ["\uE53B", "\uE53B"], /* Private Use */
+ ["\uE53C", "\uE53C"], /* Private Use */
+ ["\uE53D", "\uE53D"], /* Private Use */
+ ["\uE53E", "\uE53E"], /* Private Use */
+ ["\uE53F", "\uE53F"], /* Private Use */
+ ["\uE540", "\uE540"], /* Private Use */
+ ["\uE541", "\uE541"], /* Private Use */
+ ["\uE542", "\uE542"], /* Private Use */
+ ["\uE543", "\uE543"], /* Private Use */
+ ["\uE544", "\uE544"], /* Private Use */
+ ["\uE545", "\uE545"], /* Private Use */
+ ["\uE546", "\uE546"], /* Private Use */
+ ["\uE547", "\uE547"], /* Private Use */
+ ["\uE548", "\uE548"], /* Private Use */
+ ["\uE549", "\uE549"], /* Private Use */
+ ["\uE54A", "\uE54A"], /* Private Use */
+ ["\uE54B", "\uE54B"], /* Private Use */
+ ["\uE54C", "\uE54C"], /* Private Use */
+ ["\uE54D", "\uE54D"], /* Private Use */
+ ["\uE54E", "\uE54E"], /* Private Use */
+ ["\uE54F", "\uE54F"], /* Private Use */
+ ["\uE550", "\uE550"], /* Private Use */
+ ["\uE551", "\uE551"], /* Private Use */
+ ["\uE552", "\uE552"], /* Private Use */
+ ["\uE553", "\uE553"], /* Private Use */
+ ["\uE554", "\uE554"], /* Private Use */
+ ["\uE555", "\uE555"], /* Private Use */
+ ["\uE556", "\uE556"], /* Private Use */
+ ["\uE557", "\uE557"], /* Private Use */
+ ["\uE558", "\uE558"], /* Private Use */
+ ["\uE559", "\uE559"], /* Private Use */
+ ["\uE55A", "\uE55A"], /* Private Use */
+ ["\uE55B", "\uE55B"], /* Private Use */
+ ["\uE55C", "\uE55C"], /* Private Use */
+ ["\uE55D", "\uE55D"], /* Private Use */
+ ["\uE55E", "\uE55E"], /* Private Use */
+ ["\uE55F", "\uE55F"], /* Private Use */
+ ["\uE560", "\uE560"], /* Private Use */
+ ["\uE561", "\uE561"], /* Private Use */
+ ["\uE562", "\uE562"], /* Private Use */
+ ["\uE563", "\uE563"], /* Private Use */
+ ["\uE564", "\uE564"], /* Private Use */
+ ["\uE565", "\uE565"], /* Private Use */
+ ["\uE566", "\uE566"], /* Private Use */
+ ["\uE567", "\uE567"], /* Private Use */
+ ["\uE568", "\uE568"], /* Private Use */
+ ["\uE569", "\uE569"], /* Private Use */
+ ["\uE56A", "\uE56A"], /* Private Use */
+ ["\uE56B", "\uE56B"], /* Private Use */
+ ["\uE56C", "\uE56C"], /* Private Use */
+ ["\uE56D", "\uE56D"], /* Private Use */
+ ["\uE56E", "\uE56E"], /* Private Use */
+ ["\uE56F", "\uE56F"], /* Private Use */
+ ["\uE570", "\uE570"], /* Private Use */
+ ["\uE571", "\uE571"], /* Private Use */
+ ["\uE572", "\uE572"], /* Private Use */
+ ["\uE573", "\uE573"], /* Private Use */
+ ["\uE574", "\uE574"], /* Private Use */
+ ["\uE575", "\uE575"], /* Private Use */
+ ["\uE576", "\uE576"], /* Private Use */
+ ["\uE577", "\uE577"], /* Private Use */
+ ["\uE578", "\uE578"], /* Private Use */
+ ["\uE579", "\uE579"], /* Private Use */
+ ["\uE57A", "\uE57A"], /* Private Use */
+ ["\uE57B", "\uE57B"], /* Private Use */
+ ["\uE57C", "\uE57C"], /* Private Use */
+ ["\uE57D", "\uE57D"], /* Private Use */
+ ["\uE57E", "\uE57E"], /* Private Use */
+ ["\uE57F", "\uE57F"], /* Private Use */
+ ["\uE580", "\uE580"], /* Private Use */
+ ["\uE581", "\uE581"], /* Private Use */
+ ["\uE582", "\uE582"], /* Private Use */
+ ["\uE583", "\uE583"], /* Private Use */
+ ["\uE584", "\uE584"], /* Private Use */
+ ["\uE585", "\uE585"], /* Private Use */
+ ["\uE586", "\uE586"], /* Private Use */
+ ["\uE587", "\uE587"], /* Private Use */
+ ["\uE588", "\uE588"], /* Private Use */
+ ["\uE589", "\uE589"], /* Private Use */
+ ["\uE58A", "\uE58A"], /* Private Use */
+ ["\uE58B", "\uE58B"], /* Private Use */
+ ["\uE58C", "\uE58C"], /* Private Use */
+ ["\uE58D", "\uE58D"], /* Private Use */
+ ["\uE58E", "\uE58E"], /* Private Use */
+ ["\uE58F", "\uE58F"], /* Private Use */
+ ["\uE590", "\uE590"], /* Private Use */
+ ["\uE591", "\uE591"], /* Private Use */
+ ["\uE592", "\uE592"], /* Private Use */
+ ["\uE593", "\uE593"], /* Private Use */
+ ["\uE594", "\uE594"], /* Private Use */
+ ["\uE595", "\uE595"], /* Private Use */
+ ["\uE596", "\uE596"], /* Private Use */
+ ["\uE597", "\uE597"], /* Private Use */
+ ["\uE598", "\uE598"], /* Private Use */
+ ["\uE599", "\uE599"], /* Private Use */
+ ["\uE59A", "\uE59A"], /* Private Use */
+ ["\uE59B", "\uE59B"], /* Private Use */
+ ["\uE59C", "\uE59C"], /* Private Use */
+ ["\uE59D", "\uE59D"], /* Private Use */
+ ["\uE59E", "\uE59E"], /* Private Use */
+ ["\uE59F", "\uE59F"], /* Private Use */
+ ["\uE5A0", "\uE5A0"], /* Private Use */
+ ["\uE5A1", "\uE5A1"], /* Private Use */
+ ["\uE5A2", "\uE5A2"], /* Private Use */
+ ["\uE5A3", "\uE5A3"], /* Private Use */
+ ["\uE5A4", "\uE5A4"], /* Private Use */
+ ["\uE5A5", "\uE5A5"], /* Private Use */
+ ["\uE5A6", "\uE5A6"], /* Private Use */
+ ["\uE5A7", "\uE5A7"], /* Private Use */
+ ["\uE5A8", "\uE5A8"], /* Private Use */
+ ["\uE5A9", "\uE5A9"], /* Private Use */
+ ["\uE5AA", "\uE5AA"], /* Private Use */
+ ["\uE5AB", "\uE5AB"], /* Private Use */
+ ["\uE5AC", "\uE5AC"], /* Private Use */
+ ["\uE5AD", "\uE5AD"], /* Private Use */
+ ["\uE5AE", "\uE5AE"], /* Private Use */
+ ["\uE5AF", "\uE5AF"], /* Private Use */
+ ["\uE5B0", "\uE5B0"], /* Private Use */
+ ["\uE5B1", "\uE5B1"], /* Private Use */
+ ["\uE5B2", "\uE5B2"], /* Private Use */
+ ["\uE5B3", "\uE5B3"], /* Private Use */
+ ["\uE5B4", "\uE5B4"], /* Private Use */
+ ["\uE5B5", "\uE5B5"], /* Private Use */
+ ["\uE5B6", "\uE5B6"], /* Private Use */
+ ["\uE5B7", "\uE5B7"], /* Private Use */
+ ["\uE5B8", "\uE5B8"], /* Private Use */
+ ["\uE5B9", "\uE5B9"], /* Private Use */
+ ["\uE5BA", "\uE5BA"], /* Private Use */
+ ["\uE5BB", "\uE5BB"], /* Private Use */
+ ["\uE5BC", "\uE5BC"], /* Private Use */
+ ["\uE5BD", "\uE5BD"], /* Private Use */
+ ["\uE5BE", "\uE5BE"], /* Private Use */
+ ["\uE5BF", "\uE5BF"], /* Private Use */
+ ["\uE5C0", "\uE5C0"], /* Private Use */
+ ["\uE5C1", "\uE5C1"], /* Private Use */
+ ["\uE5C2", "\uE5C2"], /* Private Use */
+ ["\uE5C3", "\uE5C3"], /* Private Use */
+ ["\uE5C4", "\uE5C4"], /* Private Use */
+ ["\uE5C5", "\uE5C5"], /* Private Use */
+ ["\uE5C6", "\uE5C6"], /* Private Use */
+ ["\uE5C7", "\uE5C7"], /* Private Use */
+ ["\uE5C8", "\uE5C8"], /* Private Use */
+ ["\uE5C9", "\uE5C9"], /* Private Use */
+ ["\uE5CA", "\uE5CA"], /* Private Use */
+ ["\uE5CB", "\uE5CB"], /* Private Use */
+ ["\uE5CC", "\uE5CC"], /* Private Use */
+ ["\uE5CD", "\uE5CD"], /* Private Use */
+ ["\uE5CE", "\uE5CE"], /* Private Use */
+ ["\uE5CF", "\uE5CF"], /* Private Use */
+ ["\uE5D0", "\uE5D0"], /* Private Use */
+ ["\uE5D1", "\uE5D1"], /* Private Use */
+ ["\uE5D2", "\uE5D2"], /* Private Use */
+ ["\uE5D3", "\uE5D3"], /* Private Use */
+ ["\uE5D4", "\uE5D4"], /* Private Use */
+ ["\uE5D5", "\uE5D5"], /* Private Use */
+ ["\uE5D6", "\uE5D6"], /* Private Use */
+ ["\uE5D7", "\uE5D7"], /* Private Use */
+ ["\uE5D8", "\uE5D8"], /* Private Use */
+ ["\uE5D9", "\uE5D9"], /* Private Use */
+ ["\uE5DA", "\uE5DA"], /* Private Use */
+ ["\uE5DB", "\uE5DB"], /* Private Use */
+ ["\uE5DC", "\uE5DC"], /* Private Use */
+ ["\uE5DD", "\uE5DD"], /* Private Use */
+ ["\uE5DE", "\uE5DE"], /* Private Use */
+ ["\uE5DF", "\uE5DF"], /* Private Use */
+ ["\uE5E0", "\uE5E0"], /* Private Use */
+ ["\uE5E1", "\uE5E1"], /* Private Use */
+ ["\uE5E2", "\uE5E2"], /* Private Use */
+ ["\uE5E3", "\uE5E3"], /* Private Use */
+ ["\uE5E4", "\uE5E4"], /* Private Use */
+ ["\uE5E5", "\uE5E5"], /* Private Use */
+ ["\uE5E6", "\uE5E6"], /* Private Use */
+ ["\uE5E7", "\uE5E7"], /* Private Use */
+ ["\uE5E8", "\uE5E8"], /* Private Use */
+ ["\uE5E9", "\uE5E9"], /* Private Use */
+ ["\uE5EA", "\uE5EA"], /* Private Use */
+ ["\uE5EB", "\uE5EB"], /* Private Use */
+ ["\uE5EC", "\uE5EC"], /* Private Use */
+ ["\uE5ED", "\uE5ED"], /* Private Use */
+ ["\uE5EE", "\uE5EE"], /* Private Use */
+ ["\uE5EF", "\uE5EF"], /* Private Use */
+ ["\uE5F0", "\uE5F0"], /* Private Use */
+ ["\uE5F1", "\uE5F1"], /* Private Use */
+ ["\uE5F2", "\uE5F2"], /* Private Use */
+ ["\uE5F3", "\uE5F3"], /* Private Use */
+ ["\uE5F4", "\uE5F4"], /* Private Use */
+ ["\uE5F5", "\uE5F5"], /* Private Use */
+ ["\uE5F6", "\uE5F6"], /* Private Use */
+ ["\uE5F7", "\uE5F7"], /* Private Use */
+ ["\uE5F8", "\uE5F8"], /* Private Use */
+ ["\uE5F9", "\uE5F9"], /* Private Use */
+ ["\uE5FA", "\uE5FA"], /* Private Use */
+ ["\uE5FB", "\uE5FB"], /* Private Use */
+ ["\uE5FC", "\uE5FC"], /* Private Use */
+ ["\uE5FD", "\uE5FD"], /* Private Use */
+ ["\uE5FE", "\uE5FE"], /* Private Use */
+ ["\uE5FF", "\uE5FF"], /* Private Use */
+ ["\uE600", "\uE600"], /* Private Use */
+ ["\uE601", "\uE601"], /* Private Use */
+ ["\uE602", "\uE602"], /* Private Use */
+ ["\uE603", "\uE603"], /* Private Use */
+ ["\uE604", "\uE604"], /* Private Use */
+ ["\uE605", "\uE605"], /* Private Use */
+ ["\uE606", "\uE606"], /* Private Use */
+ ["\uE607", "\uE607"], /* Private Use */
+ ["\uE608", "\uE608"], /* Private Use */
+ ["\uE609", "\uE609"], /* Private Use */
+ ["\uE60A", "\uE60A"], /* Private Use */
+ ["\uE60B", "\uE60B"], /* Private Use */
+ ["\uE60C", "\uE60C"], /* Private Use */
+ ["\uE60D", "\uE60D"], /* Private Use */
+ ["\uE60E", "\uE60E"], /* Private Use */
+ ["\uE60F", "\uE60F"], /* Private Use */
+ ["\uE610", "\uE610"], /* Private Use */
+ ["\uE611", "\uE611"], /* Private Use */
+ ["\uE612", "\uE612"], /* Private Use */
+ ["\uE613", "\uE613"], /* Private Use */
+ ["\uE614", "\uE614"], /* Private Use */
+ ["\uE615", "\uE615"], /* Private Use */
+ ["\uE616", "\uE616"], /* Private Use */
+ ["\uE617", "\uE617"], /* Private Use */
+ ["\uE618", "\uE618"], /* Private Use */
+ ["\uE619", "\uE619"], /* Private Use */
+ ["\uE61A", "\uE61A"], /* Private Use */
+ ["\uE61B", "\uE61B"], /* Private Use */
+ ["\uE61C", "\uE61C"], /* Private Use */
+ ["\uE61D", "\uE61D"], /* Private Use */
+ ["\uE61E", "\uE61E"], /* Private Use */
+ ["\uE61F", "\uE61F"], /* Private Use */
+ ["\uE620", "\uE620"], /* Private Use */
+ ["\uE621", "\uE621"], /* Private Use */
+ ["\uE622", "\uE622"], /* Private Use */
+ ["\uE623", "\uE623"], /* Private Use */
+ ["\uE624", "\uE624"], /* Private Use */
+ ["\uE625", "\uE625"], /* Private Use */
+ ["\uE626", "\uE626"], /* Private Use */
+ ["\uE627", "\uE627"], /* Private Use */
+ ["\uE628", "\uE628"], /* Private Use */
+ ["\uE629", "\uE629"], /* Private Use */
+ ["\uE62A", "\uE62A"], /* Private Use */
+ ["\uE62B", "\uE62B"], /* Private Use */
+ ["\uE62C", "\uE62C"], /* Private Use */
+ ["\uE62D", "\uE62D"], /* Private Use */
+ ["\uE62E", "\uE62E"], /* Private Use */
+ ["\uE62F", "\uE62F"], /* Private Use */
+ ["\uE630", "\uE630"], /* Private Use */
+ ["\uE631", "\uE631"], /* Private Use */
+ ["\uE632", "\uE632"], /* Private Use */
+ ["\uE633", "\uE633"], /* Private Use */
+ ["\uE634", "\uE634"], /* Private Use */
+ ["\uE635", "\uE635"], /* Private Use */
+ ["\uE636", "\uE636"], /* Private Use */
+ ["\uE637", "\uE637"], /* Private Use */
+ ["\uE638", "\uE638"], /* Private Use */
+ ["\uE639", "\uE639"], /* Private Use */
+ ["\uE63A", "\uE63A"], /* Private Use */
+ ["\uE63B", "\uE63B"], /* Private Use */
+ ["\uE63C", "\uE63C"], /* Private Use */
+ ["\uE63D", "\uE63D"], /* Private Use */
+ ["\uE63E", "\uE63E"], /* Private Use */
+ ["\uE63F", "\uE63F"], /* Private Use */
+ ["\uE640", "\uE640"], /* Private Use */
+ ["\uE641", "\uE641"], /* Private Use */
+ ["\uE642", "\uE642"], /* Private Use */
+ ["\uE643", "\uE643"], /* Private Use */
+ ["\uE644", "\uE644"], /* Private Use */
+ ["\uE645", "\uE645"], /* Private Use */
+ ["\uE646", "\uE646"], /* Private Use */
+ ["\uE647", "\uE647"], /* Private Use */
+ ["\uE648", "\uE648"], /* Private Use */
+ ["\uE649", "\uE649"], /* Private Use */
+ ["\uE64A", "\uE64A"], /* Private Use */
+ ["\uE64B", "\uE64B"], /* Private Use */
+ ["\uE64C", "\uE64C"], /* Private Use */
+ ["\uE64D", "\uE64D"], /* Private Use */
+ ["\uE64E", "\uE64E"], /* Private Use */
+ ["\uE64F", "\uE64F"], /* Private Use */
+ ["\uE650", "\uE650"], /* Private Use */
+ ["\uE651", "\uE651"], /* Private Use */
+ ["\uE652", "\uE652"], /* Private Use */
+ ["\uE653", "\uE653"], /* Private Use */
+ ["\uE654", "\uE654"], /* Private Use */
+ ["\uE655", "\uE655"], /* Private Use */
+ ["\uE656", "\uE656"], /* Private Use */
+ ["\uE657", "\uE657"], /* Private Use */
+ ["\uE658", "\uE658"], /* Private Use */
+ ["\uE659", "\uE659"], /* Private Use */
+ ["\uE65A", "\uE65A"], /* Private Use */
+ ["\uE65B", "\uE65B"], /* Private Use */
+ ["\uE65C", "\uE65C"], /* Private Use */
+ ["\uE65D", "\uE65D"], /* Private Use */
+ ["\uE65E", "\uE65E"], /* Private Use */
+ ["\uE65F", "\uE65F"], /* Private Use */
+ ["\uE660", "\uE660"], /* Private Use */
+ ["\uE661", "\uE661"], /* Private Use */
+ ["\uE662", "\uE662"], /* Private Use */
+ ["\uE663", "\uE663"], /* Private Use */
+ ["\uE664", "\uE664"], /* Private Use */
+ ["\uE665", "\uE665"], /* Private Use */
+ ["\uE666", "\uE666"], /* Private Use */
+ ["\uE667", "\uE667"], /* Private Use */
+ ["\uE668", "\uE668"], /* Private Use */
+ ["\uE669", "\uE669"], /* Private Use */
+ ["\uE66A", "\uE66A"], /* Private Use */
+ ["\uE66B", "\uE66B"], /* Private Use */
+ ["\uE66C", "\uE66C"], /* Private Use */
+ ["\uE66D", "\uE66D"], /* Private Use */
+ ["\uE66E", "\uE66E"], /* Private Use */
+ ["\uE66F", "\uE66F"], /* Private Use */
+ ["\uE670", "\uE670"], /* Private Use */
+ ["\uE671", "\uE671"], /* Private Use */
+ ["\uE672", "\uE672"], /* Private Use */
+ ["\uE673", "\uE673"], /* Private Use */
+ ["\uE674", "\uE674"], /* Private Use */
+ ["\uE675", "\uE675"], /* Private Use */
+ ["\uE676", "\uE676"], /* Private Use */
+ ["\uE677", "\uE677"], /* Private Use */
+ ["\uE678", "\uE678"], /* Private Use */
+ ["\uE679", "\uE679"], /* Private Use */
+ ["\uE67A", "\uE67A"], /* Private Use */
+ ["\uE67B", "\uE67B"], /* Private Use */
+ ["\uE67C", "\uE67C"], /* Private Use */
+ ["\uE67D", "\uE67D"], /* Private Use */
+ ["\uE67E", "\uE67E"], /* Private Use */
+ ["\uE67F", "\uE67F"], /* Private Use */
+ ["\uE680", "\uE680"], /* Private Use */
+ ["\uE681", "\uE681"], /* Private Use */
+ ["\uE682", "\uE682"], /* Private Use */
+ ["\uE683", "\uE683"], /* Private Use */
+ ["\uE684", "\uE684"], /* Private Use */
+ ["\uE685", "\uE685"], /* Private Use */
+ ["\uE686", "\uE686"], /* Private Use */
+ ["\uE687", "\uE687"], /* Private Use */
+ ["\uE688", "\uE688"], /* Private Use */
+ ["\uE689", "\uE689"], /* Private Use */
+ ["\uE68A", "\uE68A"], /* Private Use */
+ ["\uE68B", "\uE68B"], /* Private Use */
+ ["\uE68C", "\uE68C"], /* Private Use */
+ ["\uE68D", "\uE68D"], /* Private Use */
+ ["\uE68E", "\uE68E"], /* Private Use */
+ ["\uE68F", "\uE68F"], /* Private Use */
+ ["\uE690", "\uE690"], /* Private Use */
+ ["\uE691", "\uE691"], /* Private Use */
+ ["\uE692", "\uE692"], /* Private Use */
+ ["\uE693", "\uE693"], /* Private Use */
+ ["\uE694", "\uE694"], /* Private Use */
+ ["\uE695", "\uE695"], /* Private Use */
+ ["\uE696", "\uE696"], /* Private Use */
+ ["\uE697", "\uE697"], /* Private Use */
+ ["\uE698", "\uE698"], /* Private Use */
+ ["\uE699", "\uE699"], /* Private Use */
+ ["\uE69A", "\uE69A"], /* Private Use */
+ ["\uE69B", "\uE69B"], /* Private Use */
+ ["\uE69C", "\uE69C"], /* Private Use */
+ ["\uE69D", "\uE69D"], /* Private Use */
+ ["\uE69E", "\uE69E"], /* Private Use */
+ ["\uE69F", "\uE69F"], /* Private Use */
+ ["\uE6A0", "\uE6A0"], /* Private Use */
+ ["\uE6A1", "\uE6A1"], /* Private Use */
+ ["\uE6A2", "\uE6A2"], /* Private Use */
+ ["\uE6A3", "\uE6A3"], /* Private Use */
+ ["\uE6A4", "\uE6A4"], /* Private Use */
+ ["\uE6A5", "\uE6A5"], /* Private Use */
+ ["\uE6A6", "\uE6A6"], /* Private Use */
+ ["\uE6A7", "\uE6A7"], /* Private Use */
+ ["\uE6A8", "\uE6A8"], /* Private Use */
+ ["\uE6A9", "\uE6A9"], /* Private Use */
+ ["\uE6AA", "\uE6AA"], /* Private Use */
+ ["\uE6AB", "\uE6AB"], /* Private Use */
+ ["\uE6AC", "\uE6AC"], /* Private Use */
+ ["\uE6AD", "\uE6AD"], /* Private Use */
+ ["\uE6AE", "\uE6AE"], /* Private Use */
+ ["\uE6AF", "\uE6AF"], /* Private Use */
+ ["\uE6B0", "\uE6B0"], /* Private Use */
+ ["\uE6B1", "\uE6B1"], /* Private Use */
+ ["\uE6B2", "\uE6B2"], /* Private Use */
+ ["\uE6B3", "\uE6B3"], /* Private Use */
+ ["\uE6B4", "\uE6B4"], /* Private Use */
+ ["\uE6B5", "\uE6B5"], /* Private Use */
+ ["\uE6B6", "\uE6B6"], /* Private Use */
+ ["\uE6B7", "\uE6B7"], /* Private Use */
+ ["\uE6B8", "\uE6B8"], /* Private Use */
+ ["\uE6B9", "\uE6B9"], /* Private Use */
+ ["\uE6BA", "\uE6BA"], /* Private Use */
+ ["\uE6BB", "\uE6BB"], /* Private Use */
+ ["\uE6BC", "\uE6BC"], /* Private Use */
+ ["\uE6BD", "\uE6BD"], /* Private Use */
+ ["\uE6BE", "\uE6BE"], /* Private Use */
+ ["\uE6BF", "\uE6BF"], /* Private Use */
+ ["\uE6C0", "\uE6C0"], /* Private Use */
+ ["\uE6C1", "\uE6C1"], /* Private Use */
+ ["\uE6C2", "\uE6C2"], /* Private Use */
+ ["\uE6C3", "\uE6C3"], /* Private Use */
+ ["\uE6C4", "\uE6C4"], /* Private Use */
+ ["\uE6C5", "\uE6C5"], /* Private Use */
+ ["\uE6C6", "\uE6C6"], /* Private Use */
+ ["\uE6C7", "\uE6C7"], /* Private Use */
+ ["\uE6C8", "\uE6C8"], /* Private Use */
+ ["\uE6C9", "\uE6C9"], /* Private Use */
+ ["\uE6CA", "\uE6CA"], /* Private Use */
+ ["\uE6CB", "\uE6CB"], /* Private Use */
+ ["\uE6CC", "\uE6CC"], /* Private Use */
+ ["\uE6CD", "\uE6CD"], /* Private Use */
+ ["\uE6CE", "\uE6CE"], /* Private Use */
+ ["\uE6CF", "\uE6CF"], /* Private Use */
+ ["\uE6D0", "\uE6D0"], /* Private Use */
+ ["\uE6D1", "\uE6D1"], /* Private Use */
+ ["\uE6D2", "\uE6D2"], /* Private Use */
+ ["\uE6D3", "\uE6D3"], /* Private Use */
+ ["\uE6D4", "\uE6D4"], /* Private Use */
+ ["\uE6D5", "\uE6D5"], /* Private Use */
+ ["\uE6D6", "\uE6D6"], /* Private Use */
+ ["\uE6D7", "\uE6D7"], /* Private Use */
+ ["\uE6D8", "\uE6D8"], /* Private Use */
+ ["\uE6D9", "\uE6D9"], /* Private Use */
+ ["\uE6DA", "\uE6DA"], /* Private Use */
+ ["\uE6DB", "\uE6DB"], /* Private Use */
+ ["\uE6DC", "\uE6DC"], /* Private Use */
+ ["\uE6DD", "\uE6DD"], /* Private Use */
+ ["\uE6DE", "\uE6DE"], /* Private Use */
+ ["\uE6DF", "\uE6DF"], /* Private Use */
+ ["\uE6E0", "\uE6E0"], /* Private Use */
+ ["\uE6E1", "\uE6E1"], /* Private Use */
+ ["\uE6E2", "\uE6E2"], /* Private Use */
+ ["\uE6E3", "\uE6E3"], /* Private Use */
+ ["\uE6E4", "\uE6E4"], /* Private Use */
+ ["\uE6E5", "\uE6E5"], /* Private Use */
+ ["\uE6E6", "\uE6E6"], /* Private Use */
+ ["\uE6E7", "\uE6E7"], /* Private Use */
+ ["\uE6E8", "\uE6E8"], /* Private Use */
+ ["\uE6E9", "\uE6E9"], /* Private Use */
+ ["\uE6EA", "\uE6EA"], /* Private Use */
+ ["\uE6EB", "\uE6EB"], /* Private Use */
+ ["\uE6EC", "\uE6EC"], /* Private Use */
+ ["\uE6ED", "\uE6ED"], /* Private Use */
+ ["\uE6EE", "\uE6EE"], /* Private Use */
+ ["\uE6EF", "\uE6EF"], /* Private Use */
+ ["\uE6F0", "\uE6F0"], /* Private Use */
+ ["\uE6F1", "\uE6F1"], /* Private Use */
+ ["\uE6F2", "\uE6F2"], /* Private Use */
+ ["\uE6F3", "\uE6F3"], /* Private Use */
+ ["\uE6F4", "\uE6F4"], /* Private Use */
+ ["\uE6F5", "\uE6F5"], /* Private Use */
+ ["\uE6F6", "\uE6F6"], /* Private Use */
+ ["\uE6F7", "\uE6F7"], /* Private Use */
+ ["\uE6F8", "\uE6F8"], /* Private Use */
+ ["\uE6F9", "\uE6F9"], /* Private Use */
+ ["\uE6FA", "\uE6FA"], /* Private Use */
+ ["\uE6FB", "\uE6FB"], /* Private Use */
+ ["\uE6FC", "\uE6FC"], /* Private Use */
+ ["\uE6FD", "\uE6FD"], /* Private Use */
+ ["\uE6FE", "\uE6FE"], /* Private Use */
+ ["\uE6FF", "\uE6FF"], /* Private Use */
+ ["\uE700", "\uE700"], /* Private Use */
+ ["\uE701", "\uE701"], /* Private Use */
+ ["\uE702", "\uE702"], /* Private Use */
+ ["\uE703", "\uE703"], /* Private Use */
+ ["\uE704", "\uE704"], /* Private Use */
+ ["\uE705", "\uE705"], /* Private Use */
+ ["\uE706", "\uE706"], /* Private Use */
+ ["\uE707", "\uE707"], /* Private Use */
+ ["\uE708", "\uE708"], /* Private Use */
+ ["\uE709", "\uE709"], /* Private Use */
+ ["\uE70A", "\uE70A"], /* Private Use */
+ ["\uE70B", "\uE70B"], /* Private Use */
+ ["\uE70C", "\uE70C"], /* Private Use */
+ ["\uE70D", "\uE70D"], /* Private Use */
+ ["\uE70E", "\uE70E"], /* Private Use */
+ ["\uE70F", "\uE70F"], /* Private Use */
+ ["\uE710", "\uE710"], /* Private Use */
+ ["\uE711", "\uE711"], /* Private Use */
+ ["\uE712", "\uE712"], /* Private Use */
+ ["\uE713", "\uE713"], /* Private Use */
+ ["\uE714", "\uE714"], /* Private Use */
+ ["\uE715", "\uE715"], /* Private Use */
+ ["\uE716", "\uE716"], /* Private Use */
+ ["\uE717", "\uE717"], /* Private Use */
+ ["\uE718", "\uE718"], /* Private Use */
+ ["\uE719", "\uE719"], /* Private Use */
+ ["\uE71A", "\uE71A"], /* Private Use */
+ ["\uE71B", "\uE71B"], /* Private Use */
+ ["\uE71C", "\uE71C"], /* Private Use */
+ ["\uE71D", "\uE71D"], /* Private Use */
+ ["\uE71E", "\uE71E"], /* Private Use */
+ ["\uE71F", "\uE71F"], /* Private Use */
+ ["\uE720", "\uE720"], /* Private Use */
+ ["\uE721", "\uE721"], /* Private Use */
+ ["\uE722", "\uE722"], /* Private Use */
+ ["\uE723", "\uE723"], /* Private Use */
+ ["\uE724", "\uE724"], /* Private Use */
+ ["\uE725", "\uE725"], /* Private Use */
+ ["\uE726", "\uE726"], /* Private Use */
+ ["\uE727", "\uE727"], /* Private Use */
+ ["\uE728", "\uE728"], /* Private Use */
+ ["\uE729", "\uE729"], /* Private Use */
+ ["\uE72A", "\uE72A"], /* Private Use */
+ ["\uE72B", "\uE72B"], /* Private Use */
+ ["\uE72C", "\uE72C"], /* Private Use */
+ ["\uE72D", "\uE72D"], /* Private Use */
+ ["\uE72E", "\uE72E"], /* Private Use */
+ ["\uE72F", "\uE72F"], /* Private Use */
+ ["\uE730", "\uE730"], /* Private Use */
+ ["\uE731", "\uE731"], /* Private Use */
+ ["\uE732", "\uE732"], /* Private Use */
+ ["\uE733", "\uE733"], /* Private Use */
+ ["\uE734", "\uE734"], /* Private Use */
+ ["\uE735", "\uE735"], /* Private Use */
+ ["\uE736", "\uE736"], /* Private Use */
+ ["\uE737", "\uE737"], /* Private Use */
+ ["\uE738", "\uE738"], /* Private Use */
+ ["\uE739", "\uE739"], /* Private Use */
+ ["\uE73A", "\uE73A"], /* Private Use */
+ ["\uE73B", "\uE73B"], /* Private Use */
+ ["\uE73C", "\uE73C"], /* Private Use */
+ ["\uE73D", "\uE73D"], /* Private Use */
+ ["\uE73E", "\uE73E"], /* Private Use */
+ ["\uE73F", "\uE73F"], /* Private Use */
+ ["\uE740", "\uE740"], /* Private Use */
+ ["\uE741", "\uE741"], /* Private Use */
+ ["\uE742", "\uE742"], /* Private Use */
+ ["\uE743", "\uE743"], /* Private Use */
+ ["\uE744", "\uE744"], /* Private Use */
+ ["\uE745", "\uE745"], /* Private Use */
+ ["\uE746", "\uE746"], /* Private Use */
+ ["\uE747", "\uE747"], /* Private Use */
+ ["\uE748", "\uE748"], /* Private Use */
+ ["\uE749", "\uE749"], /* Private Use */
+ ["\uE74A", "\uE74A"], /* Private Use */
+ ["\uE74B", "\uE74B"], /* Private Use */
+ ["\uE74C", "\uE74C"], /* Private Use */
+ ["\uE74D", "\uE74D"], /* Private Use */
+ ["\uE74E", "\uE74E"], /* Private Use */
+ ["\uE74F", "\uE74F"], /* Private Use */
+ ["\uE750", "\uE750"], /* Private Use */
+ ["\uE751", "\uE751"], /* Private Use */
+ ["\uE752", "\uE752"], /* Private Use */
+ ["\uE753", "\uE753"], /* Private Use */
+ ["\uE754", "\uE754"], /* Private Use */
+ ["\uE755", "\uE755"], /* Private Use */
+ ["\uE756", "\uE756"], /* Private Use */
+ ["\uE757", "\uE757"], /* Private Use */
+ ["\uE758", "\uE758"], /* Private Use */
+ ["\uE759", "\uE759"], /* Private Use */
+ ["\uE75A", "\uE75A"], /* Private Use */
+ ["\uE75B", "\uE75B"], /* Private Use */
+ ["\uE75C", "\uE75C"], /* Private Use */
+ ["\uE75D", "\uE75D"], /* Private Use */
+ ["\uE75E", "\uE75E"], /* Private Use */
+ ["\uE75F", "\uE75F"], /* Private Use */
+ ["\uE760", "\uE760"], /* Private Use */
+ ["\uE761", "\uE761"], /* Private Use */
+ ["\uE762", "\uE762"], /* Private Use */
+ ["\uE763", "\uE763"], /* Private Use */
+ ["\uE764", "\uE764"], /* Private Use */
+ ["\uE765", "\uE765"], /* Private Use */
+ ["\uE766", "\uE766"], /* Private Use */
+ ["\uE767", "\uE767"], /* Private Use */
+ ["\uE768", "\uE768"], /* Private Use */
+ ["\uE769", "\uE769"], /* Private Use */
+ ["\uE76A", "\uE76A"], /* Private Use */
+ ["\uE76B", "\uE76B"], /* Private Use */
+ ["\uE76C", "\uE76C"], /* Private Use */
+ ["\uE76D", "\uE76D"], /* Private Use */
+ ["\uE76E", "\uE76E"], /* Private Use */
+ ["\uE76F", "\uE76F"], /* Private Use */
+ ["\uE770", "\uE770"], /* Private Use */
+ ["\uE771", "\uE771"], /* Private Use */
+ ["\uE772", "\uE772"], /* Private Use */
+ ["\uE773", "\uE773"], /* Private Use */
+ ["\uE774", "\uE774"], /* Private Use */
+ ["\uE775", "\uE775"], /* Private Use */
+ ["\uE776", "\uE776"], /* Private Use */
+ ["\uE777", "\uE777"], /* Private Use */
+ ["\uE778", "\uE778"], /* Private Use */
+ ["\uE779", "\uE779"], /* Private Use */
+ ["\uE77A", "\uE77A"], /* Private Use */
+ ["\uE77B", "\uE77B"], /* Private Use */
+ ["\uE77C", "\uE77C"], /* Private Use */
+ ["\uE77D", "\uE77D"], /* Private Use */
+ ["\uE77E", "\uE77E"], /* Private Use */
+ ["\uE77F", "\uE77F"], /* Private Use */
+ ["\uE780", "\uE780"], /* Private Use */
+ ["\uE781", "\uE781"], /* Private Use */
+ ["\uE782", "\uE782"], /* Private Use */
+ ["\uE783", "\uE783"], /* Private Use */
+ ["\uE784", "\uE784"], /* Private Use */
+ ["\uE785", "\uE785"], /* Private Use */
+ ["\uE786", "\uE786"], /* Private Use */
+ ["\uE787", "\uE787"], /* Private Use */
+ ["\uE788", "\uE788"], /* Private Use */
+ ["\uE789", "\uE789"], /* Private Use */
+ ["\uE78A", "\uE78A"], /* Private Use */
+ ["\uE78B", "\uE78B"], /* Private Use */
+ ["\uE78C", "\uE78C"], /* Private Use */
+ ["\uE78D", "\uE78D"], /* Private Use */
+ ["\uE78E", "\uE78E"], /* Private Use */
+ ["\uE78F", "\uE78F"], /* Private Use */
+ ["\uE790", "\uE790"], /* Private Use */
+ ["\uE791", "\uE791"], /* Private Use */
+ ["\uE792", "\uE792"], /* Private Use */
+ ["\uE793", "\uE793"], /* Private Use */
+ ["\uE794", "\uE794"], /* Private Use */
+ ["\uE795", "\uE795"], /* Private Use */
+ ["\uE796", "\uE796"], /* Private Use */
+ ["\uE797", "\uE797"], /* Private Use */
+ ["\uE798", "\uE798"], /* Private Use */
+ ["\uE799", "\uE799"], /* Private Use */
+ ["\uE79A", "\uE79A"], /* Private Use */
+ ["\uE79B", "\uE79B"], /* Private Use */
+ ["\uE79C", "\uE79C"], /* Private Use */
+ ["\uE79D", "\uE79D"], /* Private Use */
+ ["\uE79E", "\uE79E"], /* Private Use */
+ ["\uE79F", "\uE79F"], /* Private Use */
+ ["\uE7A0", "\uE7A0"], /* Private Use */
+ ["\uE7A1", "\uE7A1"], /* Private Use */
+ ["\uE7A2", "\uE7A2"], /* Private Use */
+ ["\uE7A3", "\uE7A3"], /* Private Use */
+ ["\uE7A4", "\uE7A4"], /* Private Use */
+ ["\uE7A5", "\uE7A5"], /* Private Use */
+ ["\uE7A6", "\uE7A6"], /* Private Use */
+ ["\uE7A7", "\uE7A7"], /* Private Use */
+ ["\uE7A8", "\uE7A8"], /* Private Use */
+ ["\uE7A9", "\uE7A9"], /* Private Use */
+ ["\uE7AA", "\uE7AA"], /* Private Use */
+ ["\uE7AB", "\uE7AB"], /* Private Use */
+ ["\uE7AC", "\uE7AC"], /* Private Use */
+ ["\uE7AD", "\uE7AD"], /* Private Use */
+ ["\uE7AE", "\uE7AE"], /* Private Use */
+ ["\uE7AF", "\uE7AF"], /* Private Use */
+ ["\uE7B0", "\uE7B0"], /* Private Use */
+ ["\uE7B1", "\uE7B1"], /* Private Use */
+ ["\uE7B2", "\uE7B2"], /* Private Use */
+ ["\uE7B3", "\uE7B3"], /* Private Use */
+ ["\uE7B4", "\uE7B4"], /* Private Use */
+ ["\uE7B5", "\uE7B5"], /* Private Use */
+ ["\uE7B6", "\uE7B6"], /* Private Use */
+ ["\uE7B7", "\uE7B7"], /* Private Use */
+ ["\uE7B8", "\uE7B8"], /* Private Use */
+ ["\uE7B9", "\uE7B9"], /* Private Use */
+ ["\uE7BA", "\uE7BA"], /* Private Use */
+ ["\uE7BB", "\uE7BB"], /* Private Use */
+ ["\uE7BC", "\uE7BC"], /* Private Use */
+ ["\uE7BD", "\uE7BD"], /* Private Use */
+ ["\uE7BE", "\uE7BE"], /* Private Use */
+ ["\uE7BF", "\uE7BF"], /* Private Use */
+ ["\uE7C0", "\uE7C0"], /* Private Use */
+ ["\uE7C1", "\uE7C1"], /* Private Use */
+ ["\uE7C2", "\uE7C2"], /* Private Use */
+ ["\uE7C3", "\uE7C3"], /* Private Use */
+ ["\uE7C4", "\uE7C4"], /* Private Use */
+ ["\uE7C5", "\uE7C5"], /* Private Use */
+ ["\uE7C6", "\uE7C6"], /* Private Use */
+ ["\uE7C7", "\uE7C7"], /* Private Use */
+ ["\uE7C8", "\uE7C8"], /* Private Use */
+ ["\uE7C9", "\uE7C9"], /* Private Use */
+ ["\uE7CA", "\uE7CA"], /* Private Use */
+ ["\uE7CB", "\uE7CB"], /* Private Use */
+ ["\uE7CC", "\uE7CC"], /* Private Use */
+ ["\uE7CD", "\uE7CD"], /* Private Use */
+ ["\uE7CE", "\uE7CE"], /* Private Use */
+ ["\uE7CF", "\uE7CF"], /* Private Use */
+ ["\uE7D0", "\uE7D0"], /* Private Use */
+ ["\uE7D1", "\uE7D1"], /* Private Use */
+ ["\uE7D2", "\uE7D2"], /* Private Use */
+ ["\uE7D3", "\uE7D3"], /* Private Use */
+ ["\uE7D4", "\uE7D4"], /* Private Use */
+ ["\uE7D5", "\uE7D5"], /* Private Use */
+ ["\uE7D6", "\uE7D6"], /* Private Use */
+ ["\uE7D7", "\uE7D7"], /* Private Use */
+ ["\uE7D8", "\uE7D8"], /* Private Use */
+ ["\uE7D9", "\uE7D9"], /* Private Use */
+ ["\uE7DA", "\uE7DA"], /* Private Use */
+ ["\uE7DB", "\uE7DB"], /* Private Use */
+ ["\uE7DC", "\uE7DC"], /* Private Use */
+ ["\uE7DD", "\uE7DD"], /* Private Use */
+ ["\uE7DE", "\uE7DE"], /* Private Use */
+ ["\uE7DF", "\uE7DF"], /* Private Use */
+ ["\uE7E0", "\uE7E0"], /* Private Use */
+ ["\uE7E1", "\uE7E1"], /* Private Use */
+ ["\uE7E2", "\uE7E2"], /* Private Use */
+ ["\uE7E3", "\uE7E3"], /* Private Use */
+ ["\uE7E4", "\uE7E4"], /* Private Use */
+ ["\uE7E5", "\uE7E5"], /* Private Use */
+ ["\uE7E6", "\uE7E6"], /* Private Use */
+ ["\uE7E7", "\uE7E7"], /* Private Use */
+ ["\uE7E8", "\uE7E8"], /* Private Use */
+ ["\uE7E9", "\uE7E9"], /* Private Use */
+ ["\uE7EA", "\uE7EA"], /* Private Use */
+ ["\uE7EB", "\uE7EB"], /* Private Use */
+ ["\uE7EC", "\uE7EC"], /* Private Use */
+ ["\uE7ED", "\uE7ED"], /* Private Use */
+ ["\uE7EE", "\uE7EE"], /* Private Use */
+ ["\uE7EF", "\uE7EF"], /* Private Use */
+ ["\uE7F0", "\uE7F0"], /* Private Use */
+ ["\uE7F1", "\uE7F1"], /* Private Use */
+ ["\uE7F2", "\uE7F2"], /* Private Use */
+ ["\uE7F3", "\uE7F3"], /* Private Use */
+ ["\uE7F4", "\uE7F4"], /* Private Use */
+ ["\uE7F5", "\uE7F5"], /* Private Use */
+ ["\uE7F6", "\uE7F6"], /* Private Use */
+ ["\uE7F7", "\uE7F7"], /* Private Use */
+ ["\uE7F8", "\uE7F8"], /* Private Use */
+ ["\uE7F9", "\uE7F9"], /* Private Use */
+ ["\uE7FA", "\uE7FA"], /* Private Use */
+ ["\uE7FB", "\uE7FB"], /* Private Use */
+ ["\uE7FC", "\uE7FC"], /* Private Use */
+ ["\uE7FD", "\uE7FD"], /* Private Use */
+ ["\uE7FE", "\uE7FE"], /* Private Use */
+ ["\uE7FF", "\uE7FF"], /* Private Use */
+ ["\uE800", "\uE800"], /* Private Use */
+ ["\uE801", "\uE801"], /* Private Use */
+ ["\uE802", "\uE802"], /* Private Use */
+ ["\uE803", "\uE803"], /* Private Use */
+ ["\uE804", "\uE804"], /* Private Use */
+ ["\uE805", "\uE805"], /* Private Use */
+ ["\uE806", "\uE806"], /* Private Use */
+ ["\uE807", "\uE807"], /* Private Use */
+ ["\uE808", "\uE808"], /* Private Use */
+ ["\uE809", "\uE809"], /* Private Use */
+ ["\uE80A", "\uE80A"], /* Private Use */
+ ["\uE80B", "\uE80B"], /* Private Use */
+ ["\uE80C", "\uE80C"], /* Private Use */
+ ["\uE80D", "\uE80D"], /* Private Use */
+ ["\uE80E", "\uE80E"], /* Private Use */
+ ["\uE80F", "\uE80F"], /* Private Use */
+ ["\uE810", "\uE810"], /* Private Use */
+ ["\uE811", "\uE811"], /* Private Use */
+ ["\uE812", "\uE812"], /* Private Use */
+ ["\uE813", "\uE813"], /* Private Use */
+ ["\uE814", "\uE814"], /* Private Use */
+ ["\uE815", "\uE815"], /* Private Use */
+ ["\uE816", "\uE816"], /* Private Use */
+ ["\uE817", "\uE817"], /* Private Use */
+ ["\uE818", "\uE818"], /* Private Use */
+ ["\uE819", "\uE819"], /* Private Use */
+ ["\uE81A", "\uE81A"], /* Private Use */
+ ["\uE81B", "\uE81B"], /* Private Use */
+ ["\uE81C", "\uE81C"], /* Private Use */
+ ["\uE81D", "\uE81D"], /* Private Use */
+ ["\uE81E", "\uE81E"], /* Private Use */
+ ["\uE81F", "\uE81F"], /* Private Use */
+ ["\uE820", "\uE820"], /* Private Use */
+ ["\uE821", "\uE821"], /* Private Use */
+ ["\uE822", "\uE822"], /* Private Use */
+ ["\uE823", "\uE823"], /* Private Use */
+ ["\uE824", "\uE824"], /* Private Use */
+ ["\uE825", "\uE825"], /* Private Use */
+ ["\uE826", "\uE826"], /* Private Use */
+ ["\uE827", "\uE827"], /* Private Use */
+ ["\uE828", "\uE828"], /* Private Use */
+ ["\uE829", "\uE829"], /* Private Use */
+ ["\uE82A", "\uE82A"], /* Private Use */
+ ["\uE82B", "\uE82B"], /* Private Use */
+ ["\uE82C", "\uE82C"], /* Private Use */
+ ["\uE82D", "\uE82D"], /* Private Use */
+ ["\uE82E", "\uE82E"], /* Private Use */
+ ["\uE82F", "\uE82F"], /* Private Use */
+ ["\uE830", "\uE830"], /* Private Use */
+ ["\uE831", "\uE831"], /* Private Use */
+ ["\uE832", "\uE832"], /* Private Use */
+ ["\uE833", "\uE833"], /* Private Use */
+ ["\uE834", "\uE834"], /* Private Use */
+ ["\uE835", "\uE835"], /* Private Use */
+ ["\uE836", "\uE836"], /* Private Use */
+ ["\uE837", "\uE837"], /* Private Use */
+ ["\uE838", "\uE838"], /* Private Use */
+ ["\uE839", "\uE839"], /* Private Use */
+ ["\uE83A", "\uE83A"], /* Private Use */
+ ["\uE83B", "\uE83B"], /* Private Use */
+ ["\uE83C", "\uE83C"], /* Private Use */
+ ["\uE83D", "\uE83D"], /* Private Use */
+ ["\uE83E", "\uE83E"], /* Private Use */
+ ["\uE83F", "\uE83F"], /* Private Use */
+ ["\uE840", "\uE840"], /* Private Use */
+ ["\uE841", "\uE841"], /* Private Use */
+ ["\uE842", "\uE842"], /* Private Use */
+ ["\uE843", "\uE843"], /* Private Use */
+ ["\uE844", "\uE844"], /* Private Use */
+ ["\uE845", "\uE845"], /* Private Use */
+ ["\uE846", "\uE846"], /* Private Use */
+ ["\uE847", "\uE847"], /* Private Use */
+ ["\uE848", "\uE848"], /* Private Use */
+ ["\uE849", "\uE849"], /* Private Use */
+ ["\uE84A", "\uE84A"], /* Private Use */
+ ["\uE84B", "\uE84B"], /* Private Use */
+ ["\uE84C", "\uE84C"], /* Private Use */
+ ["\uE84D", "\uE84D"], /* Private Use */
+ ["\uE84E", "\uE84E"], /* Private Use */
+ ["\uE84F", "\uE84F"], /* Private Use */
+ ["\uE850", "\uE850"], /* Private Use */
+ ["\uE851", "\uE851"], /* Private Use */
+ ["\uE852", "\uE852"], /* Private Use */
+ ["\uE853", "\uE853"], /* Private Use */
+ ["\uE854", "\uE854"], /* Private Use */
+ ["\uE855", "\uE855"], /* Private Use */
+ ["\uE856", "\uE856"], /* Private Use */
+ ["\uE857", "\uE857"], /* Private Use */
+ ["\uE858", "\uE858"], /* Private Use */
+ ["\uE859", "\uE859"], /* Private Use */
+ ["\uE85A", "\uE85A"], /* Private Use */
+ ["\uE85B", "\uE85B"], /* Private Use */
+ ["\uE85C", "\uE85C"], /* Private Use */
+ ["\uE85D", "\uE85D"], /* Private Use */
+ ["\uE85E", "\uE85E"], /* Private Use */
+ ["\uE85F", "\uE85F"], /* Private Use */
+ ["\uE860", "\uE860"], /* Private Use */
+ ["\uE861", "\uE861"], /* Private Use */
+ ["\uE862", "\uE862"], /* Private Use */
+ ["\uE863", "\uE863"], /* Private Use */
+ ["\uE864", "\uE864"], /* Private Use */
+ ["\uE865", "\uE865"], /* Private Use */
+ ["\uE866", "\uE866"], /* Private Use */
+ ["\uE867", "\uE867"], /* Private Use */
+ ["\uE868", "\uE868"], /* Private Use */
+ ["\uE869", "\uE869"], /* Private Use */
+ ["\uE86A", "\uE86A"], /* Private Use */
+ ["\uE86B", "\uE86B"], /* Private Use */
+ ["\uE86C", "\uE86C"], /* Private Use */
+ ["\uE86D", "\uE86D"], /* Private Use */
+ ["\uE86E", "\uE86E"], /* Private Use */
+ ["\uE86F", "\uE86F"], /* Private Use */
+ ["\uE870", "\uE870"], /* Private Use */
+ ["\uE871", "\uE871"], /* Private Use */
+ ["\uE872", "\uE872"], /* Private Use */
+ ["\uE873", "\uE873"], /* Private Use */
+ ["\uE874", "\uE874"], /* Private Use */
+ ["\uE875", "\uE875"], /* Private Use */
+ ["\uE876", "\uE876"], /* Private Use */
+ ["\uE877", "\uE877"], /* Private Use */
+ ["\uE878", "\uE878"], /* Private Use */
+ ["\uE879", "\uE879"], /* Private Use */
+ ["\uE87A", "\uE87A"], /* Private Use */
+ ["\uE87B", "\uE87B"], /* Private Use */
+ ["\uE87C", "\uE87C"], /* Private Use */
+ ["\uE87D", "\uE87D"], /* Private Use */
+ ["\uE87E", "\uE87E"], /* Private Use */
+ ["\uE87F", "\uE87F"], /* Private Use */
+ ["\uE880", "\uE880"], /* Private Use */
+ ["\uE881", "\uE881"], /* Private Use */
+ ["\uE882", "\uE882"], /* Private Use */
+ ["\uE883", "\uE883"], /* Private Use */
+ ["\uE884", "\uE884"], /* Private Use */
+ ["\uE885", "\uE885"], /* Private Use */
+ ["\uE886", "\uE886"], /* Private Use */
+ ["\uE887", "\uE887"], /* Private Use */
+ ["\uE888", "\uE888"], /* Private Use */
+ ["\uE889", "\uE889"], /* Private Use */
+ ["\uE88A", "\uE88A"], /* Private Use */
+ ["\uE88B", "\uE88B"], /* Private Use */
+ ["\uE88C", "\uE88C"], /* Private Use */
+ ["\uE88D", "\uE88D"], /* Private Use */
+ ["\uE88E", "\uE88E"], /* Private Use */
+ ["\uE88F", "\uE88F"], /* Private Use */
+ ["\uE890", "\uE890"], /* Private Use */
+ ["\uE891", "\uE891"], /* Private Use */
+ ["\uE892", "\uE892"], /* Private Use */
+ ["\uE893", "\uE893"], /* Private Use */
+ ["\uE894", "\uE894"], /* Private Use */
+ ["\uE895", "\uE895"], /* Private Use */
+ ["\uE896", "\uE896"], /* Private Use */
+ ["\uE897", "\uE897"], /* Private Use */
+ ["\uE898", "\uE898"], /* Private Use */
+ ["\uE899", "\uE899"], /* Private Use */
+ ["\uE89A", "\uE89A"], /* Private Use */
+ ["\uE89B", "\uE89B"], /* Private Use */
+ ["\uE89C", "\uE89C"], /* Private Use */
+ ["\uE89D", "\uE89D"], /* Private Use */
+ ["\uE89E", "\uE89E"], /* Private Use */
+ ["\uE89F", "\uE89F"], /* Private Use */
+ ["\uE8A0", "\uE8A0"], /* Private Use */
+ ["\uE8A1", "\uE8A1"], /* Private Use */
+ ["\uE8A2", "\uE8A2"], /* Private Use */
+ ["\uE8A3", "\uE8A3"], /* Private Use */
+ ["\uE8A4", "\uE8A4"], /* Private Use */
+ ["\uE8A5", "\uE8A5"], /* Private Use */
+ ["\uE8A6", "\uE8A6"], /* Private Use */
+ ["\uE8A7", "\uE8A7"], /* Private Use */
+ ["\uE8A8", "\uE8A8"], /* Private Use */
+ ["\uE8A9", "\uE8A9"], /* Private Use */
+ ["\uE8AA", "\uE8AA"], /* Private Use */
+ ["\uE8AB", "\uE8AB"], /* Private Use */
+ ["\uE8AC", "\uE8AC"], /* Private Use */
+ ["\uE8AD", "\uE8AD"], /* Private Use */
+ ["\uE8AE", "\uE8AE"], /* Private Use */
+ ["\uE8AF", "\uE8AF"], /* Private Use */
+ ["\uE8B0", "\uE8B0"], /* Private Use */
+ ["\uE8B1", "\uE8B1"], /* Private Use */
+ ["\uE8B2", "\uE8B2"], /* Private Use */
+ ["\uE8B3", "\uE8B3"], /* Private Use */
+ ["\uE8B4", "\uE8B4"], /* Private Use */
+ ["\uE8B5", "\uE8B5"], /* Private Use */
+ ["\uE8B6", "\uE8B6"], /* Private Use */
+ ["\uE8B7", "\uE8B7"], /* Private Use */
+ ["\uE8B8", "\uE8B8"], /* Private Use */
+ ["\uE8B9", "\uE8B9"], /* Private Use */
+ ["\uE8BA", "\uE8BA"], /* Private Use */
+ ["\uE8BB", "\uE8BB"], /* Private Use */
+ ["\uE8BC", "\uE8BC"], /* Private Use */
+ ["\uE8BD", "\uE8BD"], /* Private Use */
+ ["\uE8BE", "\uE8BE"], /* Private Use */
+ ["\uE8BF", "\uE8BF"], /* Private Use */
+ ["\uE8C0", "\uE8C0"], /* Private Use */
+ ["\uE8C1", "\uE8C1"], /* Private Use */
+ ["\uE8C2", "\uE8C2"], /* Private Use */
+ ["\uE8C3", "\uE8C3"], /* Private Use */
+ ["\uE8C4", "\uE8C4"], /* Private Use */
+ ["\uE8C5", "\uE8C5"], /* Private Use */
+ ["\uE8C6", "\uE8C6"], /* Private Use */
+ ["\uE8C7", "\uE8C7"], /* Private Use */
+ ["\uE8C8", "\uE8C8"], /* Private Use */
+ ["\uE8C9", "\uE8C9"], /* Private Use */
+ ["\uE8CA", "\uE8CA"], /* Private Use */
+ ["\uE8CB", "\uE8CB"], /* Private Use */
+ ["\uE8CC", "\uE8CC"], /* Private Use */
+ ["\uE8CD", "\uE8CD"], /* Private Use */
+ ["\uE8CE", "\uE8CE"], /* Private Use */
+ ["\uE8CF", "\uE8CF"], /* Private Use */
+ ["\uE8D0", "\uE8D0"], /* Private Use */
+ ["\uE8D1", "\uE8D1"], /* Private Use */
+ ["\uE8D2", "\uE8D2"], /* Private Use */
+ ["\uE8D3", "\uE8D3"], /* Private Use */
+ ["\uE8D4", "\uE8D4"], /* Private Use */
+ ["\uE8D5", "\uE8D5"], /* Private Use */
+ ["\uE8D6", "\uE8D6"], /* Private Use */
+ ["\uE8D7", "\uE8D7"], /* Private Use */
+ ["\uE8D8", "\uE8D8"], /* Private Use */
+ ["\uE8D9", "\uE8D9"], /* Private Use */
+ ["\uE8DA", "\uE8DA"], /* Private Use */
+ ["\uE8DB", "\uE8DB"], /* Private Use */
+ ["\uE8DC", "\uE8DC"], /* Private Use */
+ ["\uE8DD", "\uE8DD"], /* Private Use */
+ ["\uE8DE", "\uE8DE"], /* Private Use */
+ ["\uE8DF", "\uE8DF"], /* Private Use */
+ ["\uE8E0", "\uE8E0"], /* Private Use */
+ ["\uE8E1", "\uE8E1"], /* Private Use */
+ ["\uE8E2", "\uE8E2"], /* Private Use */
+ ["\uE8E3", "\uE8E3"], /* Private Use */
+ ["\uE8E4", "\uE8E4"], /* Private Use */
+ ["\uE8E5", "\uE8E5"], /* Private Use */
+ ["\uE8E6", "\uE8E6"], /* Private Use */
+ ["\uE8E7", "\uE8E7"], /* Private Use */
+ ["\uE8E8", "\uE8E8"], /* Private Use */
+ ["\uE8E9", "\uE8E9"], /* Private Use */
+ ["\uE8EA", "\uE8EA"], /* Private Use */
+ ["\uE8EB", "\uE8EB"], /* Private Use */
+ ["\uE8EC", "\uE8EC"], /* Private Use */
+ ["\uE8ED", "\uE8ED"], /* Private Use */
+ ["\uE8EE", "\uE8EE"], /* Private Use */
+ ["\uE8EF", "\uE8EF"], /* Private Use */
+ ["\uE8F0", "\uE8F0"], /* Private Use */
+ ["\uE8F1", "\uE8F1"], /* Private Use */
+ ["\uE8F2", "\uE8F2"], /* Private Use */
+ ["\uE8F3", "\uE8F3"], /* Private Use */
+ ["\uE8F4", "\uE8F4"], /* Private Use */
+ ["\uE8F5", "\uE8F5"], /* Private Use */
+ ["\uE8F6", "\uE8F6"], /* Private Use */
+ ["\uE8F7", "\uE8F7"], /* Private Use */
+ ["\uE8F8", "\uE8F8"], /* Private Use */
+ ["\uE8F9", "\uE8F9"], /* Private Use */
+ ["\uE8FA", "\uE8FA"], /* Private Use */
+ ["\uE8FB", "\uE8FB"], /* Private Use */
+ ["\uE8FC", "\uE8FC"], /* Private Use */
+ ["\uE8FD", "\uE8FD"], /* Private Use */
+ ["\uE8FE", "\uE8FE"], /* Private Use */
+ ["\uE8FF", "\uE8FF"], /* Private Use */
+ ["\uE900", "\uE900"], /* Private Use */
+ ["\uE901", "\uE901"], /* Private Use */
+ ["\uE902", "\uE902"], /* Private Use */
+ ["\uE903", "\uE903"], /* Private Use */
+ ["\uE904", "\uE904"], /* Private Use */
+ ["\uE905", "\uE905"], /* Private Use */
+ ["\uE906", "\uE906"], /* Private Use */
+ ["\uE907", "\uE907"], /* Private Use */
+ ["\uE908", "\uE908"], /* Private Use */
+ ["\uE909", "\uE909"], /* Private Use */
+ ["\uE90A", "\uE90A"], /* Private Use */
+ ["\uE90B", "\uE90B"], /* Private Use */
+ ["\uE90C", "\uE90C"], /* Private Use */
+ ["\uE90D", "\uE90D"], /* Private Use */
+ ["\uE90E", "\uE90E"], /* Private Use */
+ ["\uE90F", "\uE90F"], /* Private Use */
+ ["\uE910", "\uE910"], /* Private Use */
+ ["\uE911", "\uE911"], /* Private Use */
+ ["\uE912", "\uE912"], /* Private Use */
+ ["\uE913", "\uE913"], /* Private Use */
+ ["\uE914", "\uE914"], /* Private Use */
+ ["\uE915", "\uE915"], /* Private Use */
+ ["\uE916", "\uE916"], /* Private Use */
+ ["\uE917", "\uE917"], /* Private Use */
+ ["\uE918", "\uE918"], /* Private Use */
+ ["\uE919", "\uE919"], /* Private Use */
+ ["\uE91A", "\uE91A"], /* Private Use */
+ ["\uE91B", "\uE91B"], /* Private Use */
+ ["\uE91C", "\uE91C"], /* Private Use */
+ ["\uE91D", "\uE91D"], /* Private Use */
+ ["\uE91E", "\uE91E"], /* Private Use */
+ ["\uE91F", "\uE91F"], /* Private Use */
+ ["\uE920", "\uE920"], /* Private Use */
+ ["\uE921", "\uE921"], /* Private Use */
+ ["\uE922", "\uE922"], /* Private Use */
+ ["\uE923", "\uE923"], /* Private Use */
+ ["\uE924", "\uE924"], /* Private Use */
+ ["\uE925", "\uE925"], /* Private Use */
+ ["\uE926", "\uE926"], /* Private Use */
+ ["\uE927", "\uE927"], /* Private Use */
+ ["\uE928", "\uE928"], /* Private Use */
+ ["\uE929", "\uE929"], /* Private Use */
+ ["\uE92A", "\uE92A"], /* Private Use */
+ ["\uE92B", "\uE92B"], /* Private Use */
+ ["\uE92C", "\uE92C"], /* Private Use */
+ ["\uE92D", "\uE92D"], /* Private Use */
+ ["\uE92E", "\uE92E"], /* Private Use */
+ ["\uE92F", "\uE92F"], /* Private Use */
+ ["\uE930", "\uE930"], /* Private Use */
+ ["\uE931", "\uE931"], /* Private Use */
+ ["\uE932", "\uE932"], /* Private Use */
+ ["\uE933", "\uE933"], /* Private Use */
+ ["\uE934", "\uE934"], /* Private Use */
+ ["\uE935", "\uE935"], /* Private Use */
+ ["\uE936", "\uE936"], /* Private Use */
+ ["\uE937", "\uE937"], /* Private Use */
+ ["\uE938", "\uE938"], /* Private Use */
+ ["\uE939", "\uE939"], /* Private Use */
+ ["\uE93A", "\uE93A"], /* Private Use */
+ ["\uE93B", "\uE93B"], /* Private Use */
+ ["\uE93C", "\uE93C"], /* Private Use */
+ ["\uE93D", "\uE93D"], /* Private Use */
+ ["\uE93E", "\uE93E"], /* Private Use */
+ ["\uE93F", "\uE93F"], /* Private Use */
+ ["\uE940", "\uE940"], /* Private Use */
+ ["\uE941", "\uE941"], /* Private Use */
+ ["\uE942", "\uE942"], /* Private Use */
+ ["\uE943", "\uE943"], /* Private Use */
+ ["\uE944", "\uE944"], /* Private Use */
+ ["\uE945", "\uE945"], /* Private Use */
+ ["\uE946", "\uE946"], /* Private Use */
+ ["\uE947", "\uE947"], /* Private Use */
+ ["\uE948", "\uE948"], /* Private Use */
+ ["\uE949", "\uE949"], /* Private Use */
+ ["\uE94A", "\uE94A"], /* Private Use */
+ ["\uE94B", "\uE94B"], /* Private Use */
+ ["\uE94C", "\uE94C"], /* Private Use */
+ ["\uE94D", "\uE94D"], /* Private Use */
+ ["\uE94E", "\uE94E"], /* Private Use */
+ ["\uE94F", "\uE94F"], /* Private Use */
+ ["\uE950", "\uE950"], /* Private Use */
+ ["\uE951", "\uE951"], /* Private Use */
+ ["\uE952", "\uE952"], /* Private Use */
+ ["\uE953", "\uE953"], /* Private Use */
+ ["\uE954", "\uE954"], /* Private Use */
+ ["\uE955", "\uE955"], /* Private Use */
+ ["\uE956", "\uE956"], /* Private Use */
+ ["\uE957", "\uE957"], /* Private Use */
+ ["\uE958", "\uE958"], /* Private Use */
+ ["\uE959", "\uE959"], /* Private Use */
+ ["\uE95A", "\uE95A"], /* Private Use */
+ ["\uE95B", "\uE95B"], /* Private Use */
+ ["\uE95C", "\uE95C"], /* Private Use */
+ ["\uE95D", "\uE95D"], /* Private Use */
+ ["\uE95E", "\uE95E"], /* Private Use */
+ ["\uE95F", "\uE95F"], /* Private Use */
+ ["\uE960", "\uE960"], /* Private Use */
+ ["\uE961", "\uE961"], /* Private Use */
+ ["\uE962", "\uE962"], /* Private Use */
+ ["\uE963", "\uE963"], /* Private Use */
+ ["\uE964", "\uE964"], /* Private Use */
+ ["\uE965", "\uE965"], /* Private Use */
+ ["\uE966", "\uE966"], /* Private Use */
+ ["\uE967", "\uE967"], /* Private Use */
+ ["\uE968", "\uE968"], /* Private Use */
+ ["\uE969", "\uE969"], /* Private Use */
+ ["\uE96A", "\uE96A"], /* Private Use */
+ ["\uE96B", "\uE96B"], /* Private Use */
+ ["\uE96C", "\uE96C"], /* Private Use */
+ ["\uE96D", "\uE96D"], /* Private Use */
+ ["\uE96E", "\uE96E"], /* Private Use */
+ ["\uE96F", "\uE96F"], /* Private Use */
+ ["\uE970", "\uE970"], /* Private Use */
+ ["\uE971", "\uE971"], /* Private Use */
+ ["\uE972", "\uE972"], /* Private Use */
+ ["\uE973", "\uE973"], /* Private Use */
+ ["\uE974", "\uE974"], /* Private Use */
+ ["\uE975", "\uE975"], /* Private Use */
+ ["\uE976", "\uE976"], /* Private Use */
+ ["\uE977", "\uE977"], /* Private Use */
+ ["\uE978", "\uE978"], /* Private Use */
+ ["\uE979", "\uE979"], /* Private Use */
+ ["\uE97A", "\uE97A"], /* Private Use */
+ ["\uE97B", "\uE97B"], /* Private Use */
+ ["\uE97C", "\uE97C"], /* Private Use */
+ ["\uE97D", "\uE97D"], /* Private Use */
+ ["\uE97E", "\uE97E"], /* Private Use */
+ ["\uE97F", "\uE97F"], /* Private Use */
+ ["\uE980", "\uE980"], /* Private Use */
+ ["\uE981", "\uE981"], /* Private Use */
+ ["\uE982", "\uE982"], /* Private Use */
+ ["\uE983", "\uE983"], /* Private Use */
+ ["\uE984", "\uE984"], /* Private Use */
+ ["\uE985", "\uE985"], /* Private Use */
+ ["\uE986", "\uE986"], /* Private Use */
+ ["\uE987", "\uE987"], /* Private Use */
+ ["\uE988", "\uE988"], /* Private Use */
+ ["\uE989", "\uE989"], /* Private Use */
+ ["\uE98A", "\uE98A"], /* Private Use */
+ ["\uE98B", "\uE98B"], /* Private Use */
+ ["\uE98C", "\uE98C"], /* Private Use */
+ ["\uE98D", "\uE98D"], /* Private Use */
+ ["\uE98E", "\uE98E"], /* Private Use */
+ ["\uE98F", "\uE98F"], /* Private Use */
+ ["\uE990", "\uE990"], /* Private Use */
+ ["\uE991", "\uE991"], /* Private Use */
+ ["\uE992", "\uE992"], /* Private Use */
+ ["\uE993", "\uE993"], /* Private Use */
+ ["\uE994", "\uE994"], /* Private Use */
+ ["\uE995", "\uE995"], /* Private Use */
+ ["\uE996", "\uE996"], /* Private Use */
+ ["\uE997", "\uE997"], /* Private Use */
+ ["\uE998", "\uE998"], /* Private Use */
+ ["\uE999", "\uE999"], /* Private Use */
+ ["\uE99A", "\uE99A"], /* Private Use */
+ ["\uE99B", "\uE99B"], /* Private Use */
+ ["\uE99C", "\uE99C"], /* Private Use */
+ ["\uE99D", "\uE99D"], /* Private Use */
+ ["\uE99E", "\uE99E"], /* Private Use */
+ ["\uE99F", "\uE99F"], /* Private Use */
+ ["\uE9A0", "\uE9A0"], /* Private Use */
+ ["\uE9A1", "\uE9A1"], /* Private Use */
+ ["\uE9A2", "\uE9A2"], /* Private Use */
+ ["\uE9A3", "\uE9A3"], /* Private Use */
+ ["\uE9A4", "\uE9A4"], /* Private Use */
+ ["\uE9A5", "\uE9A5"], /* Private Use */
+ ["\uE9A6", "\uE9A6"], /* Private Use */
+ ["\uE9A7", "\uE9A7"], /* Private Use */
+ ["\uE9A8", "\uE9A8"], /* Private Use */
+ ["\uE9A9", "\uE9A9"], /* Private Use */
+ ["\uE9AA", "\uE9AA"], /* Private Use */
+ ["\uE9AB", "\uE9AB"], /* Private Use */
+ ["\uE9AC", "\uE9AC"], /* Private Use */
+ ["\uE9AD", "\uE9AD"], /* Private Use */
+ ["\uE9AE", "\uE9AE"], /* Private Use */
+ ["\uE9AF", "\uE9AF"], /* Private Use */
+ ["\uE9B0", "\uE9B0"], /* Private Use */
+ ["\uE9B1", "\uE9B1"], /* Private Use */
+ ["\uE9B2", "\uE9B2"], /* Private Use */
+ ["\uE9B3", "\uE9B3"], /* Private Use */
+ ["\uE9B4", "\uE9B4"], /* Private Use */
+ ["\uE9B5", "\uE9B5"], /* Private Use */
+ ["\uE9B6", "\uE9B6"], /* Private Use */
+ ["\uE9B7", "\uE9B7"], /* Private Use */
+ ["\uE9B8", "\uE9B8"], /* Private Use */
+ ["\uE9B9", "\uE9B9"], /* Private Use */
+ ["\uE9BA", "\uE9BA"], /* Private Use */
+ ["\uE9BB", "\uE9BB"], /* Private Use */
+ ["\uE9BC", "\uE9BC"], /* Private Use */
+ ["\uE9BD", "\uE9BD"], /* Private Use */
+ ["\uE9BE", "\uE9BE"], /* Private Use */
+ ["\uE9BF", "\uE9BF"], /* Private Use */
+ ["\uE9C0", "\uE9C0"], /* Private Use */
+ ["\uE9C1", "\uE9C1"], /* Private Use */
+ ["\uE9C2", "\uE9C2"], /* Private Use */
+ ["\uE9C3", "\uE9C3"], /* Private Use */
+ ["\uE9C4", "\uE9C4"], /* Private Use */
+ ["\uE9C5", "\uE9C5"], /* Private Use */
+ ["\uE9C6", "\uE9C6"], /* Private Use */
+ ["\uE9C7", "\uE9C7"], /* Private Use */
+ ["\uE9C8", "\uE9C8"], /* Private Use */
+ ["\uE9C9", "\uE9C9"], /* Private Use */
+ ["\uE9CA", "\uE9CA"], /* Private Use */
+ ["\uE9CB", "\uE9CB"], /* Private Use */
+ ["\uE9CC", "\uE9CC"], /* Private Use */
+ ["\uE9CD", "\uE9CD"], /* Private Use */
+ ["\uE9CE", "\uE9CE"], /* Private Use */
+ ["\uE9CF", "\uE9CF"], /* Private Use */
+ ["\uE9D0", "\uE9D0"], /* Private Use */
+ ["\uE9D1", "\uE9D1"], /* Private Use */
+ ["\uE9D2", "\uE9D2"], /* Private Use */
+ ["\uE9D3", "\uE9D3"], /* Private Use */
+ ["\uE9D4", "\uE9D4"], /* Private Use */
+ ["\uE9D5", "\uE9D5"], /* Private Use */
+ ["\uE9D6", "\uE9D6"], /* Private Use */
+ ["\uE9D7", "\uE9D7"], /* Private Use */
+ ["\uE9D8", "\uE9D8"], /* Private Use */
+ ["\uE9D9", "\uE9D9"], /* Private Use */
+ ["\uE9DA", "\uE9DA"], /* Private Use */
+ ["\uE9DB", "\uE9DB"], /* Private Use */
+ ["\uE9DC", "\uE9DC"], /* Private Use */
+ ["\uE9DD", "\uE9DD"], /* Private Use */
+ ["\uE9DE", "\uE9DE"], /* Private Use */
+ ["\uE9DF", "\uE9DF"], /* Private Use */
+ ["\uE9E0", "\uE9E0"], /* Private Use */
+ ["\uE9E1", "\uE9E1"], /* Private Use */
+ ["\uE9E2", "\uE9E2"], /* Private Use */
+ ["\uE9E3", "\uE9E3"], /* Private Use */
+ ["\uE9E4", "\uE9E4"], /* Private Use */
+ ["\uE9E5", "\uE9E5"], /* Private Use */
+ ["\uE9E6", "\uE9E6"], /* Private Use */
+ ["\uE9E7", "\uE9E7"], /* Private Use */
+ ["\uE9E8", "\uE9E8"], /* Private Use */
+ ["\uE9E9", "\uE9E9"], /* Private Use */
+ ["\uE9EA", "\uE9EA"], /* Private Use */
+ ["\uE9EB", "\uE9EB"], /* Private Use */
+ ["\uE9EC", "\uE9EC"], /* Private Use */
+ ["\uE9ED", "\uE9ED"], /* Private Use */
+ ["\uE9EE", "\uE9EE"], /* Private Use */
+ ["\uE9EF", "\uE9EF"], /* Private Use */
+ ["\uE9F0", "\uE9F0"], /* Private Use */
+ ["\uE9F1", "\uE9F1"], /* Private Use */
+ ["\uE9F2", "\uE9F2"], /* Private Use */
+ ["\uE9F3", "\uE9F3"], /* Private Use */
+ ["\uE9F4", "\uE9F4"], /* Private Use */
+ ["\uE9F5", "\uE9F5"], /* Private Use */
+ ["\uE9F6", "\uE9F6"], /* Private Use */
+ ["\uE9F7", "\uE9F7"], /* Private Use */
+ ["\uE9F8", "\uE9F8"], /* Private Use */
+ ["\uE9F9", "\uE9F9"], /* Private Use */
+ ["\uE9FA", "\uE9FA"], /* Private Use */
+ ["\uE9FB", "\uE9FB"], /* Private Use */
+ ["\uE9FC", "\uE9FC"], /* Private Use */
+ ["\uE9FD", "\uE9FD"], /* Private Use */
+ ["\uE9FE", "\uE9FE"], /* Private Use */
+ ["\uE9FF", "\uE9FF"], /* Private Use */
+ ["\uEA00", "\uEA00"], /* Private Use */
+ ["\uEA01", "\uEA01"], /* Private Use */
+ ["\uEA02", "\uEA02"], /* Private Use */
+ ["\uEA03", "\uEA03"], /* Private Use */
+ ["\uEA04", "\uEA04"], /* Private Use */
+ ["\uEA05", "\uEA05"], /* Private Use */
+ ["\uEA06", "\uEA06"], /* Private Use */
+ ["\uEA07", "\uEA07"], /* Private Use */
+ ["\uEA08", "\uEA08"], /* Private Use */
+ ["\uEA09", "\uEA09"], /* Private Use */
+ ["\uEA0A", "\uEA0A"], /* Private Use */
+ ["\uEA0B", "\uEA0B"], /* Private Use */
+ ["\uEA0C", "\uEA0C"], /* Private Use */
+ ["\uEA0D", "\uEA0D"], /* Private Use */
+ ["\uEA0E", "\uEA0E"], /* Private Use */
+ ["\uEA0F", "\uEA0F"], /* Private Use */
+ ["\uEA10", "\uEA10"], /* Private Use */
+ ["\uEA11", "\uEA11"], /* Private Use */
+ ["\uEA12", "\uEA12"], /* Private Use */
+ ["\uEA13", "\uEA13"], /* Private Use */
+ ["\uEA14", "\uEA14"], /* Private Use */
+ ["\uEA15", "\uEA15"], /* Private Use */
+ ["\uEA16", "\uEA16"], /* Private Use */
+ ["\uEA17", "\uEA17"], /* Private Use */
+ ["\uEA18", "\uEA18"], /* Private Use */
+ ["\uEA19", "\uEA19"], /* Private Use */
+ ["\uEA1A", "\uEA1A"], /* Private Use */
+ ["\uEA1B", "\uEA1B"], /* Private Use */
+ ["\uEA1C", "\uEA1C"], /* Private Use */
+ ["\uEA1D", "\uEA1D"], /* Private Use */
+ ["\uEA1E", "\uEA1E"], /* Private Use */
+ ["\uEA1F", "\uEA1F"], /* Private Use */
+ ["\uEA20", "\uEA20"], /* Private Use */
+ ["\uEA21", "\uEA21"], /* Private Use */
+ ["\uEA22", "\uEA22"], /* Private Use */
+ ["\uEA23", "\uEA23"], /* Private Use */
+ ["\uEA24", "\uEA24"], /* Private Use */
+ ["\uEA25", "\uEA25"], /* Private Use */
+ ["\uEA26", "\uEA26"], /* Private Use */
+ ["\uEA27", "\uEA27"], /* Private Use */
+ ["\uEA28", "\uEA28"], /* Private Use */
+ ["\uEA29", "\uEA29"], /* Private Use */
+ ["\uEA2A", "\uEA2A"], /* Private Use */
+ ["\uEA2B", "\uEA2B"], /* Private Use */
+ ["\uEA2C", "\uEA2C"], /* Private Use */
+ ["\uEA2D", "\uEA2D"], /* Private Use */
+ ["\uEA2E", "\uEA2E"], /* Private Use */
+ ["\uEA2F", "\uEA2F"], /* Private Use */
+ ["\uEA30", "\uEA30"], /* Private Use */
+ ["\uEA31", "\uEA31"], /* Private Use */
+ ["\uEA32", "\uEA32"], /* Private Use */
+ ["\uEA33", "\uEA33"], /* Private Use */
+ ["\uEA34", "\uEA34"], /* Private Use */
+ ["\uEA35", "\uEA35"], /* Private Use */
+ ["\uEA36", "\uEA36"], /* Private Use */
+ ["\uEA37", "\uEA37"], /* Private Use */
+ ["\uEA38", "\uEA38"], /* Private Use */
+ ["\uEA39", "\uEA39"], /* Private Use */
+ ["\uEA3A", "\uEA3A"], /* Private Use */
+ ["\uEA3B", "\uEA3B"], /* Private Use */
+ ["\uEA3C", "\uEA3C"], /* Private Use */
+ ["\uEA3D", "\uEA3D"], /* Private Use */
+ ["\uEA3E", "\uEA3E"], /* Private Use */
+ ["\uEA3F", "\uEA3F"], /* Private Use */
+ ["\uEA40", "\uEA40"], /* Private Use */
+ ["\uEA41", "\uEA41"], /* Private Use */
+ ["\uEA42", "\uEA42"], /* Private Use */
+ ["\uEA43", "\uEA43"], /* Private Use */
+ ["\uEA44", "\uEA44"], /* Private Use */
+ ["\uEA45", "\uEA45"], /* Private Use */
+ ["\uEA46", "\uEA46"], /* Private Use */
+ ["\uEA47", "\uEA47"], /* Private Use */
+ ["\uEA48", "\uEA48"], /* Private Use */
+ ["\uEA49", "\uEA49"], /* Private Use */
+ ["\uEA4A", "\uEA4A"], /* Private Use */
+ ["\uEA4B", "\uEA4B"], /* Private Use */
+ ["\uEA4C", "\uEA4C"], /* Private Use */
+ ["\uEA4D", "\uEA4D"], /* Private Use */
+ ["\uEA4E", "\uEA4E"], /* Private Use */
+ ["\uEA4F", "\uEA4F"], /* Private Use */
+ ["\uEA50", "\uEA50"], /* Private Use */
+ ["\uEA51", "\uEA51"], /* Private Use */
+ ["\uEA52", "\uEA52"], /* Private Use */
+ ["\uEA53", "\uEA53"], /* Private Use */
+ ["\uEA54", "\uEA54"], /* Private Use */
+ ["\uEA55", "\uEA55"], /* Private Use */
+ ["\uEA56", "\uEA56"], /* Private Use */
+ ["\uEA57", "\uEA57"], /* Private Use */
+ ["\uEA58", "\uEA58"], /* Private Use */
+ ["\uEA59", "\uEA59"], /* Private Use */
+ ["\uEA5A", "\uEA5A"], /* Private Use */
+ ["\uEA5B", "\uEA5B"], /* Private Use */
+ ["\uEA5C", "\uEA5C"], /* Private Use */
+ ["\uEA5D", "\uEA5D"], /* Private Use */
+ ["\uEA5E", "\uEA5E"], /* Private Use */
+ ["\uEA5F", "\uEA5F"], /* Private Use */
+ ["\uEA60", "\uEA60"], /* Private Use */
+ ["\uEA61", "\uEA61"], /* Private Use */
+ ["\uEA62", "\uEA62"], /* Private Use */
+ ["\uEA63", "\uEA63"], /* Private Use */
+ ["\uEA64", "\uEA64"], /* Private Use */
+ ["\uEA65", "\uEA65"], /* Private Use */
+ ["\uEA66", "\uEA66"], /* Private Use */
+ ["\uEA67", "\uEA67"], /* Private Use */
+ ["\uEA68", "\uEA68"], /* Private Use */
+ ["\uEA69", "\uEA69"], /* Private Use */
+ ["\uEA6A", "\uEA6A"], /* Private Use */
+ ["\uEA6B", "\uEA6B"], /* Private Use */
+ ["\uEA6C", "\uEA6C"], /* Private Use */
+ ["\uEA6D", "\uEA6D"], /* Private Use */
+ ["\uEA6E", "\uEA6E"], /* Private Use */
+ ["\uEA6F", "\uEA6F"], /* Private Use */
+ ["\uEA70", "\uEA70"], /* Private Use */
+ ["\uEA71", "\uEA71"], /* Private Use */
+ ["\uEA72", "\uEA72"], /* Private Use */
+ ["\uEA73", "\uEA73"], /* Private Use */
+ ["\uEA74", "\uEA74"], /* Private Use */
+ ["\uEA75", "\uEA75"], /* Private Use */
+ ["\uEA76", "\uEA76"], /* Private Use */
+ ["\uEA77", "\uEA77"], /* Private Use */
+ ["\uEA78", "\uEA78"], /* Private Use */
+ ["\uEA79", "\uEA79"], /* Private Use */
+ ["\uEA7A", "\uEA7A"], /* Private Use */
+ ["\uEA7B", "\uEA7B"], /* Private Use */
+ ["\uEA7C", "\uEA7C"], /* Private Use */
+ ["\uEA7D", "\uEA7D"], /* Private Use */
+ ["\uEA7E", "\uEA7E"], /* Private Use */
+ ["\uEA7F", "\uEA7F"], /* Private Use */
+ ["\uEA80", "\uEA80"], /* Private Use */
+ ["\uEA81", "\uEA81"], /* Private Use */
+ ["\uEA82", "\uEA82"], /* Private Use */
+ ["\uEA83", "\uEA83"], /* Private Use */
+ ["\uEA84", "\uEA84"], /* Private Use */
+ ["\uEA85", "\uEA85"], /* Private Use */
+ ["\uEA86", "\uEA86"], /* Private Use */
+ ["\uEA87", "\uEA87"], /* Private Use */
+ ["\uEA88", "\uEA88"], /* Private Use */
+ ["\uEA89", "\uEA89"], /* Private Use */
+ ["\uEA8A", "\uEA8A"], /* Private Use */
+ ["\uEA8B", "\uEA8B"], /* Private Use */
+ ["\uEA8C", "\uEA8C"], /* Private Use */
+ ["\uEA8D", "\uEA8D"], /* Private Use */
+ ["\uEA8E", "\uEA8E"], /* Private Use */
+ ["\uEA8F", "\uEA8F"], /* Private Use */
+ ["\uEA90", "\uEA90"], /* Private Use */
+ ["\uEA91", "\uEA91"], /* Private Use */
+ ["\uEA92", "\uEA92"], /* Private Use */
+ ["\uEA93", "\uEA93"], /* Private Use */
+ ["\uEA94", "\uEA94"], /* Private Use */
+ ["\uEA95", "\uEA95"], /* Private Use */
+ ["\uEA96", "\uEA96"], /* Private Use */
+ ["\uEA97", "\uEA97"], /* Private Use */
+ ["\uEA98", "\uEA98"], /* Private Use */
+ ["\uEA99", "\uEA99"], /* Private Use */
+ ["\uEA9A", "\uEA9A"], /* Private Use */
+ ["\uEA9B", "\uEA9B"], /* Private Use */
+ ["\uEA9C", "\uEA9C"], /* Private Use */
+ ["\uEA9D", "\uEA9D"], /* Private Use */
+ ["\uEA9E", "\uEA9E"], /* Private Use */
+ ["\uEA9F", "\uEA9F"], /* Private Use */
+ ["\uEAA0", "\uEAA0"], /* Private Use */
+ ["\uEAA1", "\uEAA1"], /* Private Use */
+ ["\uEAA2", "\uEAA2"], /* Private Use */
+ ["\uEAA3", "\uEAA3"], /* Private Use */
+ ["\uEAA4", "\uEAA4"], /* Private Use */
+ ["\uEAA5", "\uEAA5"], /* Private Use */
+ ["\uEAA6", "\uEAA6"], /* Private Use */
+ ["\uEAA7", "\uEAA7"], /* Private Use */
+ ["\uEAA8", "\uEAA8"], /* Private Use */
+ ["\uEAA9", "\uEAA9"], /* Private Use */
+ ["\uEAAA", "\uEAAA"], /* Private Use */
+ ["\uEAAB", "\uEAAB"], /* Private Use */
+ ["\uEAAC", "\uEAAC"], /* Private Use */
+ ["\uEAAD", "\uEAAD"], /* Private Use */
+ ["\uEAAE", "\uEAAE"], /* Private Use */
+ ["\uEAAF", "\uEAAF"], /* Private Use */
+ ["\uEAB0", "\uEAB0"], /* Private Use */
+ ["\uEAB1", "\uEAB1"], /* Private Use */
+ ["\uEAB2", "\uEAB2"], /* Private Use */
+ ["\uEAB3", "\uEAB3"], /* Private Use */
+ ["\uEAB4", "\uEAB4"], /* Private Use */
+ ["\uEAB5", "\uEAB5"], /* Private Use */
+ ["\uEAB6", "\uEAB6"], /* Private Use */
+ ["\uEAB7", "\uEAB7"], /* Private Use */
+ ["\uEAB8", "\uEAB8"], /* Private Use */
+ ["\uEAB9", "\uEAB9"], /* Private Use */
+ ["\uEABA", "\uEABA"], /* Private Use */
+ ["\uEABB", "\uEABB"], /* Private Use */
+ ["\uEABC", "\uEABC"], /* Private Use */
+ ["\uEABD", "\uEABD"], /* Private Use */
+ ["\uEABE", "\uEABE"], /* Private Use */
+ ["\uEABF", "\uEABF"], /* Private Use */
+ ["\uEAC0", "\uEAC0"], /* Private Use */
+ ["\uEAC1", "\uEAC1"], /* Private Use */
+ ["\uEAC2", "\uEAC2"], /* Private Use */
+ ["\uEAC3", "\uEAC3"], /* Private Use */
+ ["\uEAC4", "\uEAC4"], /* Private Use */
+ ["\uEAC5", "\uEAC5"], /* Private Use */
+ ["\uEAC6", "\uEAC6"], /* Private Use */
+ ["\uEAC7", "\uEAC7"], /* Private Use */
+ ["\uEAC8", "\uEAC8"], /* Private Use */
+ ["\uEAC9", "\uEAC9"], /* Private Use */
+ ["\uEACA", "\uEACA"], /* Private Use */
+ ["\uEACB", "\uEACB"], /* Private Use */
+ ["\uEACC", "\uEACC"], /* Private Use */
+ ["\uEACD", "\uEACD"], /* Private Use */
+ ["\uEACE", "\uEACE"], /* Private Use */
+ ["\uEACF", "\uEACF"], /* Private Use */
+ ["\uEAD0", "\uEAD0"], /* Private Use */
+ ["\uEAD1", "\uEAD1"], /* Private Use */
+ ["\uEAD2", "\uEAD2"], /* Private Use */
+ ["\uEAD3", "\uEAD3"], /* Private Use */
+ ["\uEAD4", "\uEAD4"], /* Private Use */
+ ["\uEAD5", "\uEAD5"], /* Private Use */
+ ["\uEAD6", "\uEAD6"], /* Private Use */
+ ["\uEAD7", "\uEAD7"], /* Private Use */
+ ["\uEAD8", "\uEAD8"], /* Private Use */
+ ["\uEAD9", "\uEAD9"], /* Private Use */
+ ["\uEADA", "\uEADA"], /* Private Use */
+ ["\uEADB", "\uEADB"], /* Private Use */
+ ["\uEADC", "\uEADC"], /* Private Use */
+ ["\uEADD", "\uEADD"], /* Private Use */
+ ["\uEADE", "\uEADE"], /* Private Use */
+ ["\uEADF", "\uEADF"], /* Private Use */
+ ["\uEAE0", "\uEAE0"], /* Private Use */
+ ["\uEAE1", "\uEAE1"], /* Private Use */
+ ["\uEAE2", "\uEAE2"], /* Private Use */
+ ["\uEAE3", "\uEAE3"], /* Private Use */
+ ["\uEAE4", "\uEAE4"], /* Private Use */
+ ["\uEAE5", "\uEAE5"], /* Private Use */
+ ["\uEAE6", "\uEAE6"], /* Private Use */
+ ["\uEAE7", "\uEAE7"], /* Private Use */
+ ["\uEAE8", "\uEAE8"], /* Private Use */
+ ["\uEAE9", "\uEAE9"], /* Private Use */
+ ["\uEAEA", "\uEAEA"], /* Private Use */
+ ["\uEAEB", "\uEAEB"], /* Private Use */
+ ["\uEAEC", "\uEAEC"], /* Private Use */
+ ["\uEAED", "\uEAED"], /* Private Use */
+ ["\uEAEE", "\uEAEE"], /* Private Use */
+ ["\uEAEF", "\uEAEF"], /* Private Use */
+ ["\uEAF0", "\uEAF0"], /* Private Use */
+ ["\uEAF1", "\uEAF1"], /* Private Use */
+ ["\uEAF2", "\uEAF2"], /* Private Use */
+ ["\uEAF3", "\uEAF3"], /* Private Use */
+ ["\uEAF4", "\uEAF4"], /* Private Use */
+ ["\uEAF5", "\uEAF5"], /* Private Use */
+ ["\uEAF6", "\uEAF6"], /* Private Use */
+ ["\uEAF7", "\uEAF7"], /* Private Use */
+ ["\uEAF8", "\uEAF8"], /* Private Use */
+ ["\uEAF9", "\uEAF9"], /* Private Use */
+ ["\uEAFA", "\uEAFA"], /* Private Use */
+ ["\uEAFB", "\uEAFB"], /* Private Use */
+ ["\uEAFC", "\uEAFC"], /* Private Use */
+ ["\uEAFD", "\uEAFD"], /* Private Use */
+ ["\uEAFE", "\uEAFE"], /* Private Use */
+ ["\uEAFF", "\uEAFF"], /* Private Use */
+ ["\uEB00", "\uEB00"], /* Private Use */
+ ["\uEB01", "\uEB01"], /* Private Use */
+ ["\uEB02", "\uEB02"], /* Private Use */
+ ["\uEB03", "\uEB03"], /* Private Use */
+ ["\uEB04", "\uEB04"], /* Private Use */
+ ["\uEB05", "\uEB05"], /* Private Use */
+ ["\uEB06", "\uEB06"], /* Private Use */
+ ["\uEB07", "\uEB07"], /* Private Use */
+ ["\uEB08", "\uEB08"], /* Private Use */
+ ["\uEB09", "\uEB09"], /* Private Use */
+ ["\uEB0A", "\uEB0A"], /* Private Use */
+ ["\uEB0B", "\uEB0B"], /* Private Use */
+ ["\uEB0C", "\uEB0C"], /* Private Use */
+ ["\uEB0D", "\uEB0D"], /* Private Use */
+ ["\uEB0E", "\uEB0E"], /* Private Use */
+ ["\uEB0F", "\uEB0F"], /* Private Use */
+ ["\uEB10", "\uEB10"], /* Private Use */
+ ["\uEB11", "\uEB11"], /* Private Use */
+ ["\uEB12", "\uEB12"], /* Private Use */
+ ["\uEB13", "\uEB13"], /* Private Use */
+ ["\uEB14", "\uEB14"], /* Private Use */
+ ["\uEB15", "\uEB15"], /* Private Use */
+ ["\uEB16", "\uEB16"], /* Private Use */
+ ["\uEB17", "\uEB17"], /* Private Use */
+ ["\uEB18", "\uEB18"], /* Private Use */
+ ["\uEB19", "\uEB19"], /* Private Use */
+ ["\uEB1A", "\uEB1A"], /* Private Use */
+ ["\uEB1B", "\uEB1B"], /* Private Use */
+ ["\uEB1C", "\uEB1C"], /* Private Use */
+ ["\uEB1D", "\uEB1D"], /* Private Use */
+ ["\uEB1E", "\uEB1E"], /* Private Use */
+ ["\uEB1F", "\uEB1F"], /* Private Use */
+ ["\uEB20", "\uEB20"], /* Private Use */
+ ["\uEB21", "\uEB21"], /* Private Use */
+ ["\uEB22", "\uEB22"], /* Private Use */
+ ["\uEB23", "\uEB23"], /* Private Use */
+ ["\uEB24", "\uEB24"], /* Private Use */
+ ["\uEB25", "\uEB25"], /* Private Use */
+ ["\uEB26", "\uEB26"], /* Private Use */
+ ["\uEB27", "\uEB27"], /* Private Use */
+ ["\uEB28", "\uEB28"], /* Private Use */
+ ["\uEB29", "\uEB29"], /* Private Use */
+ ["\uEB2A", "\uEB2A"], /* Private Use */
+ ["\uEB2B", "\uEB2B"], /* Private Use */
+ ["\uEB2C", "\uEB2C"], /* Private Use */
+ ["\uEB2D", "\uEB2D"], /* Private Use */
+ ["\uEB2E", "\uEB2E"], /* Private Use */
+ ["\uEB2F", "\uEB2F"], /* Private Use */
+ ["\uEB30", "\uEB30"], /* Private Use */
+ ["\uEB31", "\uEB31"], /* Private Use */
+ ["\uEB32", "\uEB32"], /* Private Use */
+ ["\uEB33", "\uEB33"], /* Private Use */
+ ["\uEB34", "\uEB34"], /* Private Use */
+ ["\uEB35", "\uEB35"], /* Private Use */
+ ["\uEB36", "\uEB36"], /* Private Use */
+ ["\uEB37", "\uEB37"], /* Private Use */
+ ["\uEB38", "\uEB38"], /* Private Use */
+ ["\uEB39", "\uEB39"], /* Private Use */
+ ["\uEB3A", "\uEB3A"], /* Private Use */
+ ["\uEB3B", "\uEB3B"], /* Private Use */
+ ["\uEB3C", "\uEB3C"], /* Private Use */
+ ["\uEB3D", "\uEB3D"], /* Private Use */
+ ["\uEB3E", "\uEB3E"], /* Private Use */
+ ["\uEB3F", "\uEB3F"], /* Private Use */
+ ["\uEB40", "\uEB40"], /* Private Use */
+ ["\uEB41", "\uEB41"], /* Private Use */
+ ["\uEB42", "\uEB42"], /* Private Use */
+ ["\uEB43", "\uEB43"], /* Private Use */
+ ["\uEB44", "\uEB44"], /* Private Use */
+ ["\uEB45", "\uEB45"], /* Private Use */
+ ["\uEB46", "\uEB46"], /* Private Use */
+ ["\uEB47", "\uEB47"], /* Private Use */
+ ["\uEB48", "\uEB48"], /* Private Use */
+ ["\uEB49", "\uEB49"], /* Private Use */
+ ["\uEB4A", "\uEB4A"], /* Private Use */
+ ["\uEB4B", "\uEB4B"], /* Private Use */
+ ["\uEB4C", "\uEB4C"], /* Private Use */
+ ["\uEB4D", "\uEB4D"], /* Private Use */
+ ["\uEB4E", "\uEB4E"], /* Private Use */
+ ["\uEB4F", "\uEB4F"], /* Private Use */
+ ["\uEB50", "\uEB50"], /* Private Use */
+ ["\uEB51", "\uEB51"], /* Private Use */
+ ["\uEB52", "\uEB52"], /* Private Use */
+ ["\uEB53", "\uEB53"], /* Private Use */
+ ["\uEB54", "\uEB54"], /* Private Use */
+ ["\uEB55", "\uEB55"], /* Private Use */
+ ["\uEB56", "\uEB56"], /* Private Use */
+ ["\uEB57", "\uEB57"], /* Private Use */
+ ["\uEB58", "\uEB58"], /* Private Use */
+ ["\uEB59", "\uEB59"], /* Private Use */
+ ["\uEB5A", "\uEB5A"], /* Private Use */
+ ["\uEB5B", "\uEB5B"], /* Private Use */
+ ["\uEB5C", "\uEB5C"], /* Private Use */
+ ["\uEB5D", "\uEB5D"], /* Private Use */
+ ["\uEB5E", "\uEB5E"], /* Private Use */
+ ["\uEB5F", "\uEB5F"], /* Private Use */
+ ["\uEB60", "\uEB60"], /* Private Use */
+ ["\uEB61", "\uEB61"], /* Private Use */
+ ["\uEB62", "\uEB62"], /* Private Use */
+ ["\uEB63", "\uEB63"], /* Private Use */
+ ["\uEB64", "\uEB64"], /* Private Use */
+ ["\uEB65", "\uEB65"], /* Private Use */
+ ["\uEB66", "\uEB66"], /* Private Use */
+ ["\uEB67", "\uEB67"], /* Private Use */
+ ["\uEB68", "\uEB68"], /* Private Use */
+ ["\uEB69", "\uEB69"], /* Private Use */
+ ["\uEB6A", "\uEB6A"], /* Private Use */
+ ["\uEB6B", "\uEB6B"], /* Private Use */
+ ["\uEB6C", "\uEB6C"], /* Private Use */
+ ["\uEB6D", "\uEB6D"], /* Private Use */
+ ["\uEB6E", "\uEB6E"], /* Private Use */
+ ["\uEB6F", "\uEB6F"], /* Private Use */
+ ["\uEB70", "\uEB70"], /* Private Use */
+ ["\uEB71", "\uEB71"], /* Private Use */
+ ["\uEB72", "\uEB72"], /* Private Use */
+ ["\uEB73", "\uEB73"], /* Private Use */
+ ["\uEB74", "\uEB74"], /* Private Use */
+ ["\uEB75", "\uEB75"], /* Private Use */
+ ["\uEB76", "\uEB76"], /* Private Use */
+ ["\uEB77", "\uEB77"], /* Private Use */
+ ["\uEB78", "\uEB78"], /* Private Use */
+ ["\uEB79", "\uEB79"], /* Private Use */
+ ["\uEB7A", "\uEB7A"], /* Private Use */
+ ["\uEB7B", "\uEB7B"], /* Private Use */
+ ["\uEB7C", "\uEB7C"], /* Private Use */
+ ["\uEB7D", "\uEB7D"], /* Private Use */
+ ["\uEB7E", "\uEB7E"], /* Private Use */
+ ["\uEB7F", "\uEB7F"], /* Private Use */
+ ["\uEB80", "\uEB80"], /* Private Use */
+ ["\uEB81", "\uEB81"], /* Private Use */
+ ["\uEB82", "\uEB82"], /* Private Use */
+ ["\uEB83", "\uEB83"], /* Private Use */
+ ["\uEB84", "\uEB84"], /* Private Use */
+ ["\uEB85", "\uEB85"], /* Private Use */
+ ["\uEB86", "\uEB86"], /* Private Use */
+ ["\uEB87", "\uEB87"], /* Private Use */
+ ["\uEB88", "\uEB88"], /* Private Use */
+ ["\uEB89", "\uEB89"], /* Private Use */
+ ["\uEB8A", "\uEB8A"], /* Private Use */
+ ["\uEB8B", "\uEB8B"], /* Private Use */
+ ["\uEB8C", "\uEB8C"], /* Private Use */
+ ["\uEB8D", "\uEB8D"], /* Private Use */
+ ["\uEB8E", "\uEB8E"], /* Private Use */
+ ["\uEB8F", "\uEB8F"], /* Private Use */
+ ["\uEB90", "\uEB90"], /* Private Use */
+ ["\uEB91", "\uEB91"], /* Private Use */
+ ["\uEB92", "\uEB92"], /* Private Use */
+ ["\uEB93", "\uEB93"], /* Private Use */
+ ["\uEB94", "\uEB94"], /* Private Use */
+ ["\uEB95", "\uEB95"], /* Private Use */
+ ["\uEB96", "\uEB96"], /* Private Use */
+ ["\uEB97", "\uEB97"], /* Private Use */
+ ["\uEB98", "\uEB98"], /* Private Use */
+ ["\uEB99", "\uEB99"], /* Private Use */
+ ["\uEB9A", "\uEB9A"], /* Private Use */
+ ["\uEB9B", "\uEB9B"], /* Private Use */
+ ["\uEB9C", "\uEB9C"], /* Private Use */
+ ["\uEB9D", "\uEB9D"], /* Private Use */
+ ["\uEB9E", "\uEB9E"], /* Private Use */
+ ["\uEB9F", "\uEB9F"], /* Private Use */
+ ["\uEBA0", "\uEBA0"], /* Private Use */
+ ["\uEBA1", "\uEBA1"], /* Private Use */
+ ["\uEBA2", "\uEBA2"], /* Private Use */
+ ["\uEBA3", "\uEBA3"], /* Private Use */
+ ["\uEBA4", "\uEBA4"], /* Private Use */
+ ["\uEBA5", "\uEBA5"], /* Private Use */
+ ["\uEBA6", "\uEBA6"], /* Private Use */
+ ["\uEBA7", "\uEBA7"], /* Private Use */
+ ["\uEBA8", "\uEBA8"], /* Private Use */
+ ["\uEBA9", "\uEBA9"], /* Private Use */
+ ["\uEBAA", "\uEBAA"], /* Private Use */
+ ["\uEBAB", "\uEBAB"], /* Private Use */
+ ["\uEBAC", "\uEBAC"], /* Private Use */
+ ["\uEBAD", "\uEBAD"], /* Private Use */
+ ["\uEBAE", "\uEBAE"], /* Private Use */
+ ["\uEBAF", "\uEBAF"], /* Private Use */
+ ["\uEBB0", "\uEBB0"], /* Private Use */
+ ["\uEBB1", "\uEBB1"], /* Private Use */
+ ["\uEBB2", "\uEBB2"], /* Private Use */
+ ["\uEBB3", "\uEBB3"], /* Private Use */
+ ["\uEBB4", "\uEBB4"], /* Private Use */
+ ["\uEBB5", "\uEBB5"], /* Private Use */
+ ["\uEBB6", "\uEBB6"], /* Private Use */
+ ["\uEBB7", "\uEBB7"], /* Private Use */
+ ["\uEBB8", "\uEBB8"], /* Private Use */
+ ["\uEBB9", "\uEBB9"], /* Private Use */
+ ["\uEBBA", "\uEBBA"], /* Private Use */
+ ["\uEBBB", "\uEBBB"], /* Private Use */
+ ["\uEBBC", "\uEBBC"], /* Private Use */
+ ["\uEBBD", "\uEBBD"], /* Private Use */
+ ["\uEBBE", "\uEBBE"], /* Private Use */
+ ["\uEBBF", "\uEBBF"], /* Private Use */
+ ["\uEBC0", "\uEBC0"], /* Private Use */
+ ["\uEBC1", "\uEBC1"], /* Private Use */
+ ["\uEBC2", "\uEBC2"], /* Private Use */
+ ["\uEBC3", "\uEBC3"], /* Private Use */
+ ["\uEBC4", "\uEBC4"], /* Private Use */
+ ["\uEBC5", "\uEBC5"], /* Private Use */
+ ["\uEBC6", "\uEBC6"], /* Private Use */
+ ["\uEBC7", "\uEBC7"], /* Private Use */
+ ["\uEBC8", "\uEBC8"], /* Private Use */
+ ["\uEBC9", "\uEBC9"], /* Private Use */
+ ["\uEBCA", "\uEBCA"], /* Private Use */
+ ["\uEBCB", "\uEBCB"], /* Private Use */
+ ["\uEBCC", "\uEBCC"], /* Private Use */
+ ["\uEBCD", "\uEBCD"], /* Private Use */
+ ["\uEBCE", "\uEBCE"], /* Private Use */
+ ["\uEBCF", "\uEBCF"], /* Private Use */
+ ["\uEBD0", "\uEBD0"], /* Private Use */
+ ["\uEBD1", "\uEBD1"], /* Private Use */
+ ["\uEBD2", "\uEBD2"], /* Private Use */
+ ["\uEBD3", "\uEBD3"], /* Private Use */
+ ["\uEBD4", "\uEBD4"], /* Private Use */
+ ["\uEBD5", "\uEBD5"], /* Private Use */
+ ["\uEBD6", "\uEBD6"], /* Private Use */
+ ["\uEBD7", "\uEBD7"], /* Private Use */
+ ["\uEBD8", "\uEBD8"], /* Private Use */
+ ["\uEBD9", "\uEBD9"], /* Private Use */
+ ["\uEBDA", "\uEBDA"], /* Private Use */
+ ["\uEBDB", "\uEBDB"], /* Private Use */
+ ["\uEBDC", "\uEBDC"], /* Private Use */
+ ["\uEBDD", "\uEBDD"], /* Private Use */
+ ["\uEBDE", "\uEBDE"], /* Private Use */
+ ["\uEBDF", "\uEBDF"], /* Private Use */
+ ["\uEBE0", "\uEBE0"], /* Private Use */
+ ["\uEBE1", "\uEBE1"], /* Private Use */
+ ["\uEBE2", "\uEBE2"], /* Private Use */
+ ["\uEBE3", "\uEBE3"], /* Private Use */
+ ["\uEBE4", "\uEBE4"], /* Private Use */
+ ["\uEBE5", "\uEBE5"], /* Private Use */
+ ["\uEBE6", "\uEBE6"], /* Private Use */
+ ["\uEBE7", "\uEBE7"], /* Private Use */
+ ["\uEBE8", "\uEBE8"], /* Private Use */
+ ["\uEBE9", "\uEBE9"], /* Private Use */
+ ["\uEBEA", "\uEBEA"], /* Private Use */
+ ["\uEBEB", "\uEBEB"], /* Private Use */
+ ["\uEBEC", "\uEBEC"], /* Private Use */
+ ["\uEBED", "\uEBED"], /* Private Use */
+ ["\uEBEE", "\uEBEE"], /* Private Use */
+ ["\uEBEF", "\uEBEF"], /* Private Use */
+ ["\uEBF0", "\uEBF0"], /* Private Use */
+ ["\uEBF1", "\uEBF1"], /* Private Use */
+ ["\uEBF2", "\uEBF2"], /* Private Use */
+ ["\uEBF3", "\uEBF3"], /* Private Use */
+ ["\uEBF4", "\uEBF4"], /* Private Use */
+ ["\uEBF5", "\uEBF5"], /* Private Use */
+ ["\uEBF6", "\uEBF6"], /* Private Use */
+ ["\uEBF7", "\uEBF7"], /* Private Use */
+ ["\uEBF8", "\uEBF8"], /* Private Use */
+ ["\uEBF9", "\uEBF9"], /* Private Use */
+ ["\uEBFA", "\uEBFA"], /* Private Use */
+ ["\uEBFB", "\uEBFB"], /* Private Use */
+ ["\uEBFC", "\uEBFC"], /* Private Use */
+ ["\uEBFD", "\uEBFD"], /* Private Use */
+ ["\uEBFE", "\uEBFE"], /* Private Use */
+ ["\uEBFF", "\uEBFF"], /* Private Use */
+ ["\uEC00", "\uEC00"], /* Private Use */
+ ["\uEC01", "\uEC01"], /* Private Use */
+ ["\uEC02", "\uEC02"], /* Private Use */
+ ["\uEC03", "\uEC03"], /* Private Use */
+ ["\uEC04", "\uEC04"], /* Private Use */
+ ["\uEC05", "\uEC05"], /* Private Use */
+ ["\uEC06", "\uEC06"], /* Private Use */
+ ["\uEC07", "\uEC07"], /* Private Use */
+ ["\uEC08", "\uEC08"], /* Private Use */
+ ["\uEC09", "\uEC09"], /* Private Use */
+ ["\uEC0A", "\uEC0A"], /* Private Use */
+ ["\uEC0B", "\uEC0B"], /* Private Use */
+ ["\uEC0C", "\uEC0C"], /* Private Use */
+ ["\uEC0D", "\uEC0D"], /* Private Use */
+ ["\uEC0E", "\uEC0E"], /* Private Use */
+ ["\uEC0F", "\uEC0F"], /* Private Use */
+ ["\uEC10", "\uEC10"], /* Private Use */
+ ["\uEC11", "\uEC11"], /* Private Use */
+ ["\uEC12", "\uEC12"], /* Private Use */
+ ["\uEC13", "\uEC13"], /* Private Use */
+ ["\uEC14", "\uEC14"], /* Private Use */
+ ["\uEC15", "\uEC15"], /* Private Use */
+ ["\uEC16", "\uEC16"], /* Private Use */
+ ["\uEC17", "\uEC17"], /* Private Use */
+ ["\uEC18", "\uEC18"], /* Private Use */
+ ["\uEC19", "\uEC19"], /* Private Use */
+ ["\uEC1A", "\uEC1A"], /* Private Use */
+ ["\uEC1B", "\uEC1B"], /* Private Use */
+ ["\uEC1C", "\uEC1C"], /* Private Use */
+ ["\uEC1D", "\uEC1D"], /* Private Use */
+ ["\uEC1E", "\uEC1E"], /* Private Use */
+ ["\uEC1F", "\uEC1F"], /* Private Use */
+ ["\uEC20", "\uEC20"], /* Private Use */
+ ["\uEC21", "\uEC21"], /* Private Use */
+ ["\uEC22", "\uEC22"], /* Private Use */
+ ["\uEC23", "\uEC23"], /* Private Use */
+ ["\uEC24", "\uEC24"], /* Private Use */
+ ["\uEC25", "\uEC25"], /* Private Use */
+ ["\uEC26", "\uEC26"], /* Private Use */
+ ["\uEC27", "\uEC27"], /* Private Use */
+ ["\uEC28", "\uEC28"], /* Private Use */
+ ["\uEC29", "\uEC29"], /* Private Use */
+ ["\uEC2A", "\uEC2A"], /* Private Use */
+ ["\uEC2B", "\uEC2B"], /* Private Use */
+ ["\uEC2C", "\uEC2C"], /* Private Use */
+ ["\uEC2D", "\uEC2D"], /* Private Use */
+ ["\uEC2E", "\uEC2E"], /* Private Use */
+ ["\uEC2F", "\uEC2F"], /* Private Use */
+ ["\uEC30", "\uEC30"], /* Private Use */
+ ["\uEC31", "\uEC31"], /* Private Use */
+ ["\uEC32", "\uEC32"], /* Private Use */
+ ["\uEC33", "\uEC33"], /* Private Use */
+ ["\uEC34", "\uEC34"], /* Private Use */
+ ["\uEC35", "\uEC35"], /* Private Use */
+ ["\uEC36", "\uEC36"], /* Private Use */
+ ["\uEC37", "\uEC37"], /* Private Use */
+ ["\uEC38", "\uEC38"], /* Private Use */
+ ["\uEC39", "\uEC39"], /* Private Use */
+ ["\uEC3A", "\uEC3A"], /* Private Use */
+ ["\uEC3B", "\uEC3B"], /* Private Use */
+ ["\uEC3C", "\uEC3C"], /* Private Use */
+ ["\uEC3D", "\uEC3D"], /* Private Use */
+ ["\uEC3E", "\uEC3E"], /* Private Use */
+ ["\uEC3F", "\uEC3F"], /* Private Use */
+ ["\uEC40", "\uEC40"], /* Private Use */
+ ["\uEC41", "\uEC41"], /* Private Use */
+ ["\uEC42", "\uEC42"], /* Private Use */
+ ["\uEC43", "\uEC43"], /* Private Use */
+ ["\uEC44", "\uEC44"], /* Private Use */
+ ["\uEC45", "\uEC45"], /* Private Use */
+ ["\uEC46", "\uEC46"], /* Private Use */
+ ["\uEC47", "\uEC47"], /* Private Use */
+ ["\uEC48", "\uEC48"], /* Private Use */
+ ["\uEC49", "\uEC49"], /* Private Use */
+ ["\uEC4A", "\uEC4A"], /* Private Use */
+ ["\uEC4B", "\uEC4B"], /* Private Use */
+ ["\uEC4C", "\uEC4C"], /* Private Use */
+ ["\uEC4D", "\uEC4D"], /* Private Use */
+ ["\uEC4E", "\uEC4E"], /* Private Use */
+ ["\uEC4F", "\uEC4F"], /* Private Use */
+ ["\uEC50", "\uEC50"], /* Private Use */
+ ["\uEC51", "\uEC51"], /* Private Use */
+ ["\uEC52", "\uEC52"], /* Private Use */
+ ["\uEC53", "\uEC53"], /* Private Use */
+ ["\uEC54", "\uEC54"], /* Private Use */
+ ["\uEC55", "\uEC55"], /* Private Use */
+ ["\uEC56", "\uEC56"], /* Private Use */
+ ["\uEC57", "\uEC57"], /* Private Use */
+ ["\uEC58", "\uEC58"], /* Private Use */
+ ["\uEC59", "\uEC59"], /* Private Use */
+ ["\uEC5A", "\uEC5A"], /* Private Use */
+ ["\uEC5B", "\uEC5B"], /* Private Use */
+ ["\uEC5C", "\uEC5C"], /* Private Use */
+ ["\uEC5D", "\uEC5D"], /* Private Use */
+ ["\uEC5E", "\uEC5E"], /* Private Use */
+ ["\uEC5F", "\uEC5F"], /* Private Use */
+ ["\uEC60", "\uEC60"], /* Private Use */
+ ["\uEC61", "\uEC61"], /* Private Use */
+ ["\uEC62", "\uEC62"], /* Private Use */
+ ["\uEC63", "\uEC63"], /* Private Use */
+ ["\uEC64", "\uEC64"], /* Private Use */
+ ["\uEC65", "\uEC65"], /* Private Use */
+ ["\uEC66", "\uEC66"], /* Private Use */
+ ["\uEC67", "\uEC67"], /* Private Use */
+ ["\uEC68", "\uEC68"], /* Private Use */
+ ["\uEC69", "\uEC69"], /* Private Use */
+ ["\uEC6A", "\uEC6A"], /* Private Use */
+ ["\uEC6B", "\uEC6B"], /* Private Use */
+ ["\uEC6C", "\uEC6C"], /* Private Use */
+ ["\uEC6D", "\uEC6D"], /* Private Use */
+ ["\uEC6E", "\uEC6E"], /* Private Use */
+ ["\uEC6F", "\uEC6F"], /* Private Use */
+ ["\uEC70", "\uEC70"], /* Private Use */
+ ["\uEC71", "\uEC71"], /* Private Use */
+ ["\uEC72", "\uEC72"], /* Private Use */
+ ["\uEC73", "\uEC73"], /* Private Use */
+ ["\uEC74", "\uEC74"], /* Private Use */
+ ["\uEC75", "\uEC75"], /* Private Use */
+ ["\uEC76", "\uEC76"], /* Private Use */
+ ["\uEC77", "\uEC77"], /* Private Use */
+ ["\uEC78", "\uEC78"], /* Private Use */
+ ["\uEC79", "\uEC79"], /* Private Use */
+ ["\uEC7A", "\uEC7A"], /* Private Use */
+ ["\uEC7B", "\uEC7B"], /* Private Use */
+ ["\uEC7C", "\uEC7C"], /* Private Use */
+ ["\uEC7D", "\uEC7D"], /* Private Use */
+ ["\uEC7E", "\uEC7E"], /* Private Use */
+ ["\uEC7F", "\uEC7F"], /* Private Use */
+ ["\uEC80", "\uEC80"], /* Private Use */
+ ["\uEC81", "\uEC81"], /* Private Use */
+ ["\uEC82", "\uEC82"], /* Private Use */
+ ["\uEC83", "\uEC83"], /* Private Use */
+ ["\uEC84", "\uEC84"], /* Private Use */
+ ["\uEC85", "\uEC85"], /* Private Use */
+ ["\uEC86", "\uEC86"], /* Private Use */
+ ["\uEC87", "\uEC87"], /* Private Use */
+ ["\uEC88", "\uEC88"], /* Private Use */
+ ["\uEC89", "\uEC89"], /* Private Use */
+ ["\uEC8A", "\uEC8A"], /* Private Use */
+ ["\uEC8B", "\uEC8B"], /* Private Use */
+ ["\uEC8C", "\uEC8C"], /* Private Use */
+ ["\uEC8D", "\uEC8D"], /* Private Use */
+ ["\uEC8E", "\uEC8E"], /* Private Use */
+ ["\uEC8F", "\uEC8F"], /* Private Use */
+ ["\uEC90", "\uEC90"], /* Private Use */
+ ["\uEC91", "\uEC91"], /* Private Use */
+ ["\uEC92", "\uEC92"], /* Private Use */
+ ["\uEC93", "\uEC93"], /* Private Use */
+ ["\uEC94", "\uEC94"], /* Private Use */
+ ["\uEC95", "\uEC95"], /* Private Use */
+ ["\uEC96", "\uEC96"], /* Private Use */
+ ["\uEC97", "\uEC97"], /* Private Use */
+ ["\uEC98", "\uEC98"], /* Private Use */
+ ["\uEC99", "\uEC99"], /* Private Use */
+ ["\uEC9A", "\uEC9A"], /* Private Use */
+ ["\uEC9B", "\uEC9B"], /* Private Use */
+ ["\uEC9C", "\uEC9C"], /* Private Use */
+ ["\uEC9D", "\uEC9D"], /* Private Use */
+ ["\uEC9E", "\uEC9E"], /* Private Use */
+ ["\uEC9F", "\uEC9F"], /* Private Use */
+ ["\uECA0", "\uECA0"], /* Private Use */
+ ["\uECA1", "\uECA1"], /* Private Use */
+ ["\uECA2", "\uECA2"], /* Private Use */
+ ["\uECA3", "\uECA3"], /* Private Use */
+ ["\uECA4", "\uECA4"], /* Private Use */
+ ["\uECA5", "\uECA5"], /* Private Use */
+ ["\uECA6", "\uECA6"], /* Private Use */
+ ["\uECA7", "\uECA7"], /* Private Use */
+ ["\uECA8", "\uECA8"], /* Private Use */
+ ["\uECA9", "\uECA9"], /* Private Use */
+ ["\uECAA", "\uECAA"], /* Private Use */
+ ["\uECAB", "\uECAB"], /* Private Use */
+ ["\uECAC", "\uECAC"], /* Private Use */
+ ["\uECAD", "\uECAD"], /* Private Use */
+ ["\uECAE", "\uECAE"], /* Private Use */
+ ["\uECAF", "\uECAF"], /* Private Use */
+ ["\uECB0", "\uECB0"], /* Private Use */
+ ["\uECB1", "\uECB1"], /* Private Use */
+ ["\uECB2", "\uECB2"], /* Private Use */
+ ["\uECB3", "\uECB3"], /* Private Use */
+ ["\uECB4", "\uECB4"], /* Private Use */
+ ["\uECB5", "\uECB5"], /* Private Use */
+ ["\uECB6", "\uECB6"], /* Private Use */
+ ["\uECB7", "\uECB7"], /* Private Use */
+ ["\uECB8", "\uECB8"], /* Private Use */
+ ["\uECB9", "\uECB9"], /* Private Use */
+ ["\uECBA", "\uECBA"], /* Private Use */
+ ["\uECBB", "\uECBB"], /* Private Use */
+ ["\uECBC", "\uECBC"], /* Private Use */
+ ["\uECBD", "\uECBD"], /* Private Use */
+ ["\uECBE", "\uECBE"], /* Private Use */
+ ["\uECBF", "\uECBF"], /* Private Use */
+ ["\uECC0", "\uECC0"], /* Private Use */
+ ["\uECC1", "\uECC1"], /* Private Use */
+ ["\uECC2", "\uECC2"], /* Private Use */
+ ["\uECC3", "\uECC3"], /* Private Use */
+ ["\uECC4", "\uECC4"], /* Private Use */
+ ["\uECC5", "\uECC5"], /* Private Use */
+ ["\uECC6", "\uECC6"], /* Private Use */
+ ["\uECC7", "\uECC7"], /* Private Use */
+ ["\uECC8", "\uECC8"], /* Private Use */
+ ["\uECC9", "\uECC9"], /* Private Use */
+ ["\uECCA", "\uECCA"], /* Private Use */
+ ["\uECCB", "\uECCB"], /* Private Use */
+ ["\uECCC", "\uECCC"], /* Private Use */
+ ["\uECCD", "\uECCD"], /* Private Use */
+ ["\uECCE", "\uECCE"], /* Private Use */
+ ["\uECCF", "\uECCF"], /* Private Use */
+ ["\uECD0", "\uECD0"], /* Private Use */
+ ["\uECD1", "\uECD1"], /* Private Use */
+ ["\uECD2", "\uECD2"], /* Private Use */
+ ["\uECD3", "\uECD3"], /* Private Use */
+ ["\uECD4", "\uECD4"], /* Private Use */
+ ["\uECD5", "\uECD5"], /* Private Use */
+ ["\uECD6", "\uECD6"], /* Private Use */
+ ["\uECD7", "\uECD7"], /* Private Use */
+ ["\uECD8", "\uECD8"], /* Private Use */
+ ["\uECD9", "\uECD9"], /* Private Use */
+ ["\uECDA", "\uECDA"], /* Private Use */
+ ["\uECDB", "\uECDB"], /* Private Use */
+ ["\uECDC", "\uECDC"], /* Private Use */
+ ["\uECDD", "\uECDD"], /* Private Use */
+ ["\uECDE", "\uECDE"], /* Private Use */
+ ["\uECDF", "\uECDF"], /* Private Use */
+ ["\uECE0", "\uECE0"], /* Private Use */
+ ["\uECE1", "\uECE1"], /* Private Use */
+ ["\uECE2", "\uECE2"], /* Private Use */
+ ["\uECE3", "\uECE3"], /* Private Use */
+ ["\uECE4", "\uECE4"], /* Private Use */
+ ["\uECE5", "\uECE5"], /* Private Use */
+ ["\uECE6", "\uECE6"], /* Private Use */
+ ["\uECE7", "\uECE7"], /* Private Use */
+ ["\uECE8", "\uECE8"], /* Private Use */
+ ["\uECE9", "\uECE9"], /* Private Use */
+ ["\uECEA", "\uECEA"], /* Private Use */
+ ["\uECEB", "\uECEB"], /* Private Use */
+ ["\uECEC", "\uECEC"], /* Private Use */
+ ["\uECED", "\uECED"], /* Private Use */
+ ["\uECEE", "\uECEE"], /* Private Use */
+ ["\uECEF", "\uECEF"], /* Private Use */
+ ["\uECF0", "\uECF0"], /* Private Use */
+ ["\uECF1", "\uECF1"], /* Private Use */
+ ["\uECF2", "\uECF2"], /* Private Use */
+ ["\uECF3", "\uECF3"], /* Private Use */
+ ["\uECF4", "\uECF4"], /* Private Use */
+ ["\uECF5", "\uECF5"], /* Private Use */
+ ["\uECF6", "\uECF6"], /* Private Use */
+ ["\uECF7", "\uECF7"], /* Private Use */
+ ["\uECF8", "\uECF8"], /* Private Use */
+ ["\uECF9", "\uECF9"], /* Private Use */
+ ["\uECFA", "\uECFA"], /* Private Use */
+ ["\uECFB", "\uECFB"], /* Private Use */
+ ["\uECFC", "\uECFC"], /* Private Use */
+ ["\uECFD", "\uECFD"], /* Private Use */
+ ["\uECFE", "\uECFE"], /* Private Use */
+ ["\uECFF", "\uECFF"], /* Private Use */
+ ["\uED00", "\uED00"], /* Private Use */
+ ["\uED01", "\uED01"], /* Private Use */
+ ["\uED02", "\uED02"], /* Private Use */
+ ["\uED03", "\uED03"], /* Private Use */
+ ["\uED04", "\uED04"], /* Private Use */
+ ["\uED05", "\uED05"], /* Private Use */
+ ["\uED06", "\uED06"], /* Private Use */
+ ["\uED07", "\uED07"], /* Private Use */
+ ["\uED08", "\uED08"], /* Private Use */
+ ["\uED09", "\uED09"], /* Private Use */
+ ["\uED0A", "\uED0A"], /* Private Use */
+ ["\uED0B", "\uED0B"], /* Private Use */
+ ["\uED0C", "\uED0C"], /* Private Use */
+ ["\uED0D", "\uED0D"], /* Private Use */
+ ["\uED0E", "\uED0E"], /* Private Use */
+ ["\uED0F", "\uED0F"], /* Private Use */
+ ["\uED10", "\uED10"], /* Private Use */
+ ["\uED11", "\uED11"], /* Private Use */
+ ["\uED12", "\uED12"], /* Private Use */
+ ["\uED13", "\uED13"], /* Private Use */
+ ["\uED14", "\uED14"], /* Private Use */
+ ["\uED15", "\uED15"], /* Private Use */
+ ["\uED16", "\uED16"], /* Private Use */
+ ["\uED17", "\uED17"], /* Private Use */
+ ["\uED18", "\uED18"], /* Private Use */
+ ["\uED19", "\uED19"], /* Private Use */
+ ["\uED1A", "\uED1A"], /* Private Use */
+ ["\uED1B", "\uED1B"], /* Private Use */
+ ["\uED1C", "\uED1C"], /* Private Use */
+ ["\uED1D", "\uED1D"], /* Private Use */
+ ["\uED1E", "\uED1E"], /* Private Use */
+ ["\uED1F", "\uED1F"], /* Private Use */
+ ["\uED20", "\uED20"], /* Private Use */
+ ["\uED21", "\uED21"], /* Private Use */
+ ["\uED22", "\uED22"], /* Private Use */
+ ["\uED23", "\uED23"], /* Private Use */
+ ["\uED24", "\uED24"], /* Private Use */
+ ["\uED25", "\uED25"], /* Private Use */
+ ["\uED26", "\uED26"], /* Private Use */
+ ["\uED27", "\uED27"], /* Private Use */
+ ["\uED28", "\uED28"], /* Private Use */
+ ["\uED29", "\uED29"], /* Private Use */
+ ["\uED2A", "\uED2A"], /* Private Use */
+ ["\uED2B", "\uED2B"], /* Private Use */
+ ["\uED2C", "\uED2C"], /* Private Use */
+ ["\uED2D", "\uED2D"], /* Private Use */
+ ["\uED2E", "\uED2E"], /* Private Use */
+ ["\uED2F", "\uED2F"], /* Private Use */
+ ["\uED30", "\uED30"], /* Private Use */
+ ["\uED31", "\uED31"], /* Private Use */
+ ["\uED32", "\uED32"], /* Private Use */
+ ["\uED33", "\uED33"], /* Private Use */
+ ["\uED34", "\uED34"], /* Private Use */
+ ["\uED35", "\uED35"], /* Private Use */
+ ["\uED36", "\uED36"], /* Private Use */
+ ["\uED37", "\uED37"], /* Private Use */
+ ["\uED38", "\uED38"], /* Private Use */
+ ["\uED39", "\uED39"], /* Private Use */
+ ["\uED3A", "\uED3A"], /* Private Use */
+ ["\uED3B", "\uED3B"], /* Private Use */
+ ["\uED3C", "\uED3C"], /* Private Use */
+ ["\uED3D", "\uED3D"], /* Private Use */
+ ["\uED3E", "\uED3E"], /* Private Use */
+ ["\uED3F", "\uED3F"], /* Private Use */
+ ["\uED40", "\uED40"], /* Private Use */
+ ["\uED41", "\uED41"], /* Private Use */
+ ["\uED42", "\uED42"], /* Private Use */
+ ["\uED43", "\uED43"], /* Private Use */
+ ["\uED44", "\uED44"], /* Private Use */
+ ["\uED45", "\uED45"], /* Private Use */
+ ["\uED46", "\uED46"], /* Private Use */
+ ["\uED47", "\uED47"], /* Private Use */
+ ["\uED48", "\uED48"], /* Private Use */
+ ["\uED49", "\uED49"], /* Private Use */
+ ["\uED4A", "\uED4A"], /* Private Use */
+ ["\uED4B", "\uED4B"], /* Private Use */
+ ["\uED4C", "\uED4C"], /* Private Use */
+ ["\uED4D", "\uED4D"], /* Private Use */
+ ["\uED4E", "\uED4E"], /* Private Use */
+ ["\uED4F", "\uED4F"], /* Private Use */
+ ["\uED50", "\uED50"], /* Private Use */
+ ["\uED51", "\uED51"], /* Private Use */
+ ["\uED52", "\uED52"], /* Private Use */
+ ["\uED53", "\uED53"], /* Private Use */
+ ["\uED54", "\uED54"], /* Private Use */
+ ["\uED55", "\uED55"], /* Private Use */
+ ["\uED56", "\uED56"], /* Private Use */
+ ["\uED57", "\uED57"], /* Private Use */
+ ["\uED58", "\uED58"], /* Private Use */
+ ["\uED59", "\uED59"], /* Private Use */
+ ["\uED5A", "\uED5A"], /* Private Use */
+ ["\uED5B", "\uED5B"], /* Private Use */
+ ["\uED5C", "\uED5C"], /* Private Use */
+ ["\uED5D", "\uED5D"], /* Private Use */
+ ["\uED5E", "\uED5E"], /* Private Use */
+ ["\uED5F", "\uED5F"], /* Private Use */
+ ["\uED60", "\uED60"], /* Private Use */
+ ["\uED61", "\uED61"], /* Private Use */
+ ["\uED62", "\uED62"], /* Private Use */
+ ["\uED63", "\uED63"], /* Private Use */
+ ["\uED64", "\uED64"], /* Private Use */
+ ["\uED65", "\uED65"], /* Private Use */
+ ["\uED66", "\uED66"], /* Private Use */
+ ["\uED67", "\uED67"], /* Private Use */
+ ["\uED68", "\uED68"], /* Private Use */
+ ["\uED69", "\uED69"], /* Private Use */
+ ["\uED6A", "\uED6A"], /* Private Use */
+ ["\uED6B", "\uED6B"], /* Private Use */
+ ["\uED6C", "\uED6C"], /* Private Use */
+ ["\uED6D", "\uED6D"], /* Private Use */
+ ["\uED6E", "\uED6E"], /* Private Use */
+ ["\uED6F", "\uED6F"], /* Private Use */
+ ["\uED70", "\uED70"], /* Private Use */
+ ["\uED71", "\uED71"], /* Private Use */
+ ["\uED72", "\uED72"], /* Private Use */
+ ["\uED73", "\uED73"], /* Private Use */
+ ["\uED74", "\uED74"], /* Private Use */
+ ["\uED75", "\uED75"], /* Private Use */
+ ["\uED76", "\uED76"], /* Private Use */
+ ["\uED77", "\uED77"], /* Private Use */
+ ["\uED78", "\uED78"], /* Private Use */
+ ["\uED79", "\uED79"], /* Private Use */
+ ["\uED7A", "\uED7A"], /* Private Use */
+ ["\uED7B", "\uED7B"], /* Private Use */
+ ["\uED7C", "\uED7C"], /* Private Use */
+ ["\uED7D", "\uED7D"], /* Private Use */
+ ["\uED7E", "\uED7E"], /* Private Use */
+ ["\uED7F", "\uED7F"], /* Private Use */
+ ["\uED80", "\uED80"], /* Private Use */
+ ["\uED81", "\uED81"], /* Private Use */
+ ["\uED82", "\uED82"], /* Private Use */
+ ["\uED83", "\uED83"], /* Private Use */
+ ["\uED84", "\uED84"], /* Private Use */
+ ["\uED85", "\uED85"], /* Private Use */
+ ["\uED86", "\uED86"], /* Private Use */
+ ["\uED87", "\uED87"], /* Private Use */
+ ["\uED88", "\uED88"], /* Private Use */
+ ["\uED89", "\uED89"], /* Private Use */
+ ["\uED8A", "\uED8A"], /* Private Use */
+ ["\uED8B", "\uED8B"], /* Private Use */
+ ["\uED8C", "\uED8C"], /* Private Use */
+ ["\uED8D", "\uED8D"], /* Private Use */
+ ["\uED8E", "\uED8E"], /* Private Use */
+ ["\uED8F", "\uED8F"], /* Private Use */
+ ["\uED90", "\uED90"], /* Private Use */
+ ["\uED91", "\uED91"], /* Private Use */
+ ["\uED92", "\uED92"], /* Private Use */
+ ["\uED93", "\uED93"], /* Private Use */
+ ["\uED94", "\uED94"], /* Private Use */
+ ["\uED95", "\uED95"], /* Private Use */
+ ["\uED96", "\uED96"], /* Private Use */
+ ["\uED97", "\uED97"], /* Private Use */
+ ["\uED98", "\uED98"], /* Private Use */
+ ["\uED99", "\uED99"], /* Private Use */
+ ["\uED9A", "\uED9A"], /* Private Use */
+ ["\uED9B", "\uED9B"], /* Private Use */
+ ["\uED9C", "\uED9C"], /* Private Use */
+ ["\uED9D", "\uED9D"], /* Private Use */
+ ["\uED9E", "\uED9E"], /* Private Use */
+ ["\uED9F", "\uED9F"], /* Private Use */
+ ["\uEDA0", "\uEDA0"], /* Private Use */
+ ["\uEDA1", "\uEDA1"], /* Private Use */
+ ["\uEDA2", "\uEDA2"], /* Private Use */
+ ["\uEDA3", "\uEDA3"], /* Private Use */
+ ["\uEDA4", "\uEDA4"], /* Private Use */
+ ["\uEDA5", "\uEDA5"], /* Private Use */
+ ["\uEDA6", "\uEDA6"], /* Private Use */
+ ["\uEDA7", "\uEDA7"], /* Private Use */
+ ["\uEDA8", "\uEDA8"], /* Private Use */
+ ["\uEDA9", "\uEDA9"], /* Private Use */
+ ["\uEDAA", "\uEDAA"], /* Private Use */
+ ["\uEDAB", "\uEDAB"], /* Private Use */
+ ["\uEDAC", "\uEDAC"], /* Private Use */
+ ["\uEDAD", "\uEDAD"], /* Private Use */
+ ["\uEDAE", "\uEDAE"], /* Private Use */
+ ["\uEDAF", "\uEDAF"], /* Private Use */
+ ["\uEDB0", "\uEDB0"], /* Private Use */
+ ["\uEDB1", "\uEDB1"], /* Private Use */
+ ["\uEDB2", "\uEDB2"], /* Private Use */
+ ["\uEDB3", "\uEDB3"], /* Private Use */
+ ["\uEDB4", "\uEDB4"], /* Private Use */
+ ["\uEDB5", "\uEDB5"], /* Private Use */
+ ["\uEDB6", "\uEDB6"], /* Private Use */
+ ["\uEDB7", "\uEDB7"], /* Private Use */
+ ["\uEDB8", "\uEDB8"], /* Private Use */
+ ["\uEDB9", "\uEDB9"], /* Private Use */
+ ["\uEDBA", "\uEDBA"], /* Private Use */
+ ["\uEDBB", "\uEDBB"], /* Private Use */
+ ["\uEDBC", "\uEDBC"], /* Private Use */
+ ["\uEDBD", "\uEDBD"], /* Private Use */
+ ["\uEDBE", "\uEDBE"], /* Private Use */
+ ["\uEDBF", "\uEDBF"], /* Private Use */
+ ["\uEDC0", "\uEDC0"], /* Private Use */
+ ["\uEDC1", "\uEDC1"], /* Private Use */
+ ["\uEDC2", "\uEDC2"], /* Private Use */
+ ["\uEDC3", "\uEDC3"], /* Private Use */
+ ["\uEDC4", "\uEDC4"], /* Private Use */
+ ["\uEDC5", "\uEDC5"], /* Private Use */
+ ["\uEDC6", "\uEDC6"], /* Private Use */
+ ["\uEDC7", "\uEDC7"], /* Private Use */
+ ["\uEDC8", "\uEDC8"], /* Private Use */
+ ["\uEDC9", "\uEDC9"], /* Private Use */
+ ["\uEDCA", "\uEDCA"], /* Private Use */
+ ["\uEDCB", "\uEDCB"], /* Private Use */
+ ["\uEDCC", "\uEDCC"], /* Private Use */
+ ["\uEDCD", "\uEDCD"], /* Private Use */
+ ["\uEDCE", "\uEDCE"], /* Private Use */
+ ["\uEDCF", "\uEDCF"], /* Private Use */
+ ["\uEDD0", "\uEDD0"], /* Private Use */
+ ["\uEDD1", "\uEDD1"], /* Private Use */
+ ["\uEDD2", "\uEDD2"], /* Private Use */
+ ["\uEDD3", "\uEDD3"], /* Private Use */
+ ["\uEDD4", "\uEDD4"], /* Private Use */
+ ["\uEDD5", "\uEDD5"], /* Private Use */
+ ["\uEDD6", "\uEDD6"], /* Private Use */
+ ["\uEDD7", "\uEDD7"], /* Private Use */
+ ["\uEDD8", "\uEDD8"], /* Private Use */
+ ["\uEDD9", "\uEDD9"], /* Private Use */
+ ["\uEDDA", "\uEDDA"], /* Private Use */
+ ["\uEDDB", "\uEDDB"], /* Private Use */
+ ["\uEDDC", "\uEDDC"], /* Private Use */
+ ["\uEDDD", "\uEDDD"], /* Private Use */
+ ["\uEDDE", "\uEDDE"], /* Private Use */
+ ["\uEDDF", "\uEDDF"], /* Private Use */
+ ["\uEDE0", "\uEDE0"], /* Private Use */
+ ["\uEDE1", "\uEDE1"], /* Private Use */
+ ["\uEDE2", "\uEDE2"], /* Private Use */
+ ["\uEDE3", "\uEDE3"], /* Private Use */
+ ["\uEDE4", "\uEDE4"], /* Private Use */
+ ["\uEDE5", "\uEDE5"], /* Private Use */
+ ["\uEDE6", "\uEDE6"], /* Private Use */
+ ["\uEDE7", "\uEDE7"], /* Private Use */
+ ["\uEDE8", "\uEDE8"], /* Private Use */
+ ["\uEDE9", "\uEDE9"], /* Private Use */
+ ["\uEDEA", "\uEDEA"], /* Private Use */
+ ["\uEDEB", "\uEDEB"], /* Private Use */
+ ["\uEDEC", "\uEDEC"], /* Private Use */
+ ["\uEDED", "\uEDED"], /* Private Use */
+ ["\uEDEE", "\uEDEE"], /* Private Use */
+ ["\uEDEF", "\uEDEF"], /* Private Use */
+ ["\uEDF0", "\uEDF0"], /* Private Use */
+ ["\uEDF1", "\uEDF1"], /* Private Use */
+ ["\uEDF2", "\uEDF2"], /* Private Use */
+ ["\uEDF3", "\uEDF3"], /* Private Use */
+ ["\uEDF4", "\uEDF4"], /* Private Use */
+ ["\uEDF5", "\uEDF5"], /* Private Use */
+ ["\uEDF6", "\uEDF6"], /* Private Use */
+ ["\uEDF7", "\uEDF7"], /* Private Use */
+ ["\uEDF8", "\uEDF8"], /* Private Use */
+ ["\uEDF9", "\uEDF9"], /* Private Use */
+ ["\uEDFA", "\uEDFA"], /* Private Use */
+ ["\uEDFB", "\uEDFB"], /* Private Use */
+ ["\uEDFC", "\uEDFC"], /* Private Use */
+ ["\uEDFD", "\uEDFD"], /* Private Use */
+ ["\uEDFE", "\uEDFE"], /* Private Use */
+ ["\uEDFF", "\uEDFF"], /* Private Use */
+ ["\uEE00", "\uEE00"], /* Private Use */
+ ["\uEE01", "\uEE01"], /* Private Use */
+ ["\uEE02", "\uEE02"], /* Private Use */
+ ["\uEE03", "\uEE03"], /* Private Use */
+ ["\uEE04", "\uEE04"], /* Private Use */
+ ["\uEE05", "\uEE05"], /* Private Use */
+ ["\uEE06", "\uEE06"], /* Private Use */
+ ["\uEE07", "\uEE07"], /* Private Use */
+ ["\uEE08", "\uEE08"], /* Private Use */
+ ["\uEE09", "\uEE09"], /* Private Use */
+ ["\uEE0A", "\uEE0A"], /* Private Use */
+ ["\uEE0B", "\uEE0B"], /* Private Use */
+ ["\uEE0C", "\uEE0C"], /* Private Use */
+ ["\uEE0D", "\uEE0D"], /* Private Use */
+ ["\uEE0E", "\uEE0E"], /* Private Use */
+ ["\uEE0F", "\uEE0F"], /* Private Use */
+ ["\uEE10", "\uEE10"], /* Private Use */
+ ["\uEE11", "\uEE11"], /* Private Use */
+ ["\uEE12", "\uEE12"], /* Private Use */
+ ["\uEE13", "\uEE13"], /* Private Use */
+ ["\uEE14", "\uEE14"], /* Private Use */
+ ["\uEE15", "\uEE15"], /* Private Use */
+ ["\uEE16", "\uEE16"], /* Private Use */
+ ["\uEE17", "\uEE17"], /* Private Use */
+ ["\uEE18", "\uEE18"], /* Private Use */
+ ["\uEE19", "\uEE19"], /* Private Use */
+ ["\uEE1A", "\uEE1A"], /* Private Use */
+ ["\uEE1B", "\uEE1B"], /* Private Use */
+ ["\uEE1C", "\uEE1C"], /* Private Use */
+ ["\uEE1D", "\uEE1D"], /* Private Use */
+ ["\uEE1E", "\uEE1E"], /* Private Use */
+ ["\uEE1F", "\uEE1F"], /* Private Use */
+ ["\uEE20", "\uEE20"], /* Private Use */
+ ["\uEE21", "\uEE21"], /* Private Use */
+ ["\uEE22", "\uEE22"], /* Private Use */
+ ["\uEE23", "\uEE23"], /* Private Use */
+ ["\uEE24", "\uEE24"], /* Private Use */
+ ["\uEE25", "\uEE25"], /* Private Use */
+ ["\uEE26", "\uEE26"], /* Private Use */
+ ["\uEE27", "\uEE27"], /* Private Use */
+ ["\uEE28", "\uEE28"], /* Private Use */
+ ["\uEE29", "\uEE29"], /* Private Use */
+ ["\uEE2A", "\uEE2A"], /* Private Use */
+ ["\uEE2B", "\uEE2B"], /* Private Use */
+ ["\uEE2C", "\uEE2C"], /* Private Use */
+ ["\uEE2D", "\uEE2D"], /* Private Use */
+ ["\uEE2E", "\uEE2E"], /* Private Use */
+ ["\uEE2F", "\uEE2F"], /* Private Use */
+ ["\uEE30", "\uEE30"], /* Private Use */
+ ["\uEE31", "\uEE31"], /* Private Use */
+ ["\uEE32", "\uEE32"], /* Private Use */
+ ["\uEE33", "\uEE33"], /* Private Use */
+ ["\uEE34", "\uEE34"], /* Private Use */
+ ["\uEE35", "\uEE35"], /* Private Use */
+ ["\uEE36", "\uEE36"], /* Private Use */
+ ["\uEE37", "\uEE37"], /* Private Use */
+ ["\uEE38", "\uEE38"], /* Private Use */
+ ["\uEE39", "\uEE39"], /* Private Use */
+ ["\uEE3A", "\uEE3A"], /* Private Use */
+ ["\uEE3B", "\uEE3B"], /* Private Use */
+ ["\uEE3C", "\uEE3C"], /* Private Use */
+ ["\uEE3D", "\uEE3D"], /* Private Use */
+ ["\uEE3E", "\uEE3E"], /* Private Use */
+ ["\uEE3F", "\uEE3F"], /* Private Use */
+ ["\uEE40", "\uEE40"], /* Private Use */
+ ["\uEE41", "\uEE41"], /* Private Use */
+ ["\uEE42", "\uEE42"], /* Private Use */
+ ["\uEE43", "\uEE43"], /* Private Use */
+ ["\uEE44", "\uEE44"], /* Private Use */
+ ["\uEE45", "\uEE45"], /* Private Use */
+ ["\uEE46", "\uEE46"], /* Private Use */
+ ["\uEE47", "\uEE47"], /* Private Use */
+ ["\uEE48", "\uEE48"], /* Private Use */
+ ["\uEE49", "\uEE49"], /* Private Use */
+ ["\uEE4A", "\uEE4A"], /* Private Use */
+ ["\uEE4B", "\uEE4B"], /* Private Use */
+ ["\uEE4C", "\uEE4C"], /* Private Use */
+ ["\uEE4D", "\uEE4D"], /* Private Use */
+ ["\uEE4E", "\uEE4E"], /* Private Use */
+ ["\uEE4F", "\uEE4F"], /* Private Use */
+ ["\uEE50", "\uEE50"], /* Private Use */
+ ["\uEE51", "\uEE51"], /* Private Use */
+ ["\uEE52", "\uEE52"], /* Private Use */
+ ["\uEE53", "\uEE53"], /* Private Use */
+ ["\uEE54", "\uEE54"], /* Private Use */
+ ["\uEE55", "\uEE55"], /* Private Use */
+ ["\uEE56", "\uEE56"], /* Private Use */
+ ["\uEE57", "\uEE57"], /* Private Use */
+ ["\uEE58", "\uEE58"], /* Private Use */
+ ["\uEE59", "\uEE59"], /* Private Use */
+ ["\uEE5A", "\uEE5A"], /* Private Use */
+ ["\uEE5B", "\uEE5B"], /* Private Use */
+ ["\uEE5C", "\uEE5C"], /* Private Use */
+ ["\uEE5D", "\uEE5D"], /* Private Use */
+ ["\uEE5E", "\uEE5E"], /* Private Use */
+ ["\uEE5F", "\uEE5F"], /* Private Use */
+ ["\uEE60", "\uEE60"], /* Private Use */
+ ["\uEE61", "\uEE61"], /* Private Use */
+ ["\uEE62", "\uEE62"], /* Private Use */
+ ["\uEE63", "\uEE63"], /* Private Use */
+ ["\uEE64", "\uEE64"], /* Private Use */
+ ["\uEE65", "\uEE65"], /* Private Use */
+ ["\uEE66", "\uEE66"], /* Private Use */
+ ["\uEE67", "\uEE67"], /* Private Use */
+ ["\uEE68", "\uEE68"], /* Private Use */
+ ["\uEE69", "\uEE69"], /* Private Use */
+ ["\uEE6A", "\uEE6A"], /* Private Use */
+ ["\uEE6B", "\uEE6B"], /* Private Use */
+ ["\uEE6C", "\uEE6C"], /* Private Use */
+ ["\uEE6D", "\uEE6D"], /* Private Use */
+ ["\uEE6E", "\uEE6E"], /* Private Use */
+ ["\uEE6F", "\uEE6F"], /* Private Use */
+ ["\uEE70", "\uEE70"], /* Private Use */
+ ["\uEE71", "\uEE71"], /* Private Use */
+ ["\uEE72", "\uEE72"], /* Private Use */
+ ["\uEE73", "\uEE73"], /* Private Use */
+ ["\uEE74", "\uEE74"], /* Private Use */
+ ["\uEE75", "\uEE75"], /* Private Use */
+ ["\uEE76", "\uEE76"], /* Private Use */
+ ["\uEE77", "\uEE77"], /* Private Use */
+ ["\uEE78", "\uEE78"], /* Private Use */
+ ["\uEE79", "\uEE79"], /* Private Use */
+ ["\uEE7A", "\uEE7A"], /* Private Use */
+ ["\uEE7B", "\uEE7B"], /* Private Use */
+ ["\uEE7C", "\uEE7C"], /* Private Use */
+ ["\uEE7D", "\uEE7D"], /* Private Use */
+ ["\uEE7E", "\uEE7E"], /* Private Use */
+ ["\uEE7F", "\uEE7F"], /* Private Use */
+ ["\uEE80", "\uEE80"], /* Private Use */
+ ["\uEE81", "\uEE81"], /* Private Use */
+ ["\uEE82", "\uEE82"], /* Private Use */
+ ["\uEE83", "\uEE83"], /* Private Use */
+ ["\uEE84", "\uEE84"], /* Private Use */
+ ["\uEE85", "\uEE85"], /* Private Use */
+ ["\uEE86", "\uEE86"], /* Private Use */
+ ["\uEE87", "\uEE87"], /* Private Use */
+ ["\uEE88", "\uEE88"], /* Private Use */
+ ["\uEE89", "\uEE89"], /* Private Use */
+ ["\uEE8A", "\uEE8A"], /* Private Use */
+ ["\uEE8B", "\uEE8B"], /* Private Use */
+ ["\uEE8C", "\uEE8C"], /* Private Use */
+ ["\uEE8D", "\uEE8D"], /* Private Use */
+ ["\uEE8E", "\uEE8E"], /* Private Use */
+ ["\uEE8F", "\uEE8F"], /* Private Use */
+ ["\uEE90", "\uEE90"], /* Private Use */
+ ["\uEE91", "\uEE91"], /* Private Use */
+ ["\uEE92", "\uEE92"], /* Private Use */
+ ["\uEE93", "\uEE93"], /* Private Use */
+ ["\uEE94", "\uEE94"], /* Private Use */
+ ["\uEE95", "\uEE95"], /* Private Use */
+ ["\uEE96", "\uEE96"], /* Private Use */
+ ["\uEE97", "\uEE97"], /* Private Use */
+ ["\uEE98", "\uEE98"], /* Private Use */
+ ["\uEE99", "\uEE99"], /* Private Use */
+ ["\uEE9A", "\uEE9A"], /* Private Use */
+ ["\uEE9B", "\uEE9B"], /* Private Use */
+ ["\uEE9C", "\uEE9C"], /* Private Use */
+ ["\uEE9D", "\uEE9D"], /* Private Use */
+ ["\uEE9E", "\uEE9E"], /* Private Use */
+ ["\uEE9F", "\uEE9F"], /* Private Use */
+ ["\uEEA0", "\uEEA0"], /* Private Use */
+ ["\uEEA1", "\uEEA1"], /* Private Use */
+ ["\uEEA2", "\uEEA2"], /* Private Use */
+ ["\uEEA3", "\uEEA3"], /* Private Use */
+ ["\uEEA4", "\uEEA4"], /* Private Use */
+ ["\uEEA5", "\uEEA5"], /* Private Use */
+ ["\uEEA6", "\uEEA6"], /* Private Use */
+ ["\uEEA7", "\uEEA7"], /* Private Use */
+ ["\uEEA8", "\uEEA8"], /* Private Use */
+ ["\uEEA9", "\uEEA9"], /* Private Use */
+ ["\uEEAA", "\uEEAA"], /* Private Use */
+ ["\uEEAB", "\uEEAB"], /* Private Use */
+ ["\uEEAC", "\uEEAC"], /* Private Use */
+ ["\uEEAD", "\uEEAD"], /* Private Use */
+ ["\uEEAE", "\uEEAE"], /* Private Use */
+ ["\uEEAF", "\uEEAF"], /* Private Use */
+ ["\uEEB0", "\uEEB0"], /* Private Use */
+ ["\uEEB1", "\uEEB1"], /* Private Use */
+ ["\uEEB2", "\uEEB2"], /* Private Use */
+ ["\uEEB3", "\uEEB3"], /* Private Use */
+ ["\uEEB4", "\uEEB4"], /* Private Use */
+ ["\uEEB5", "\uEEB5"], /* Private Use */
+ ["\uEEB6", "\uEEB6"], /* Private Use */
+ ["\uEEB7", "\uEEB7"], /* Private Use */
+ ["\uEEB8", "\uEEB8"], /* Private Use */
+ ["\uEEB9", "\uEEB9"], /* Private Use */
+ ["\uEEBA", "\uEEBA"], /* Private Use */
+ ["\uEEBB", "\uEEBB"], /* Private Use */
+ ["\uEEBC", "\uEEBC"], /* Private Use */
+ ["\uEEBD", "\uEEBD"], /* Private Use */
+ ["\uEEBE", "\uEEBE"], /* Private Use */
+ ["\uEEBF", "\uEEBF"], /* Private Use */
+ ["\uEEC0", "\uEEC0"], /* Private Use */
+ ["\uEEC1", "\uEEC1"], /* Private Use */
+ ["\uEEC2", "\uEEC2"], /* Private Use */
+ ["\uEEC3", "\uEEC3"], /* Private Use */
+ ["\uEEC4", "\uEEC4"], /* Private Use */
+ ["\uEEC5", "\uEEC5"], /* Private Use */
+ ["\uEEC6", "\uEEC6"], /* Private Use */
+ ["\uEEC7", "\uEEC7"], /* Private Use */
+ ["\uEEC8", "\uEEC8"], /* Private Use */
+ ["\uEEC9", "\uEEC9"], /* Private Use */
+ ["\uEECA", "\uEECA"], /* Private Use */
+ ["\uEECB", "\uEECB"], /* Private Use */
+ ["\uEECC", "\uEECC"], /* Private Use */
+ ["\uEECD", "\uEECD"], /* Private Use */
+ ["\uEECE", "\uEECE"], /* Private Use */
+ ["\uEECF", "\uEECF"], /* Private Use */
+ ["\uEED0", "\uEED0"], /* Private Use */
+ ["\uEED1", "\uEED1"], /* Private Use */
+ ["\uEED2", "\uEED2"], /* Private Use */
+ ["\uEED3", "\uEED3"], /* Private Use */
+ ["\uEED4", "\uEED4"], /* Private Use */
+ ["\uEED5", "\uEED5"], /* Private Use */
+ ["\uEED6", "\uEED6"], /* Private Use */
+ ["\uEED7", "\uEED7"], /* Private Use */
+ ["\uEED8", "\uEED8"], /* Private Use */
+ ["\uEED9", "\uEED9"], /* Private Use */
+ ["\uEEDA", "\uEEDA"], /* Private Use */
+ ["\uEEDB", "\uEEDB"], /* Private Use */
+ ["\uEEDC", "\uEEDC"], /* Private Use */
+ ["\uEEDD", "\uEEDD"], /* Private Use */
+ ["\uEEDE", "\uEEDE"], /* Private Use */
+ ["\uEEDF", "\uEEDF"], /* Private Use */
+ ["\uEEE0", "\uEEE0"], /* Private Use */
+ ["\uEEE1", "\uEEE1"], /* Private Use */
+ ["\uEEE2", "\uEEE2"], /* Private Use */
+ ["\uEEE3", "\uEEE3"], /* Private Use */
+ ["\uEEE4", "\uEEE4"], /* Private Use */
+ ["\uEEE5", "\uEEE5"], /* Private Use */
+ ["\uEEE6", "\uEEE6"], /* Private Use */
+ ["\uEEE7", "\uEEE7"], /* Private Use */
+ ["\uEEE8", "\uEEE8"], /* Private Use */
+ ["\uEEE9", "\uEEE9"], /* Private Use */
+ ["\uEEEA", "\uEEEA"], /* Private Use */
+ ["\uEEEB", "\uEEEB"], /* Private Use */
+ ["\uEEEC", "\uEEEC"], /* Private Use */
+ ["\uEEED", "\uEEED"], /* Private Use */
+ ["\uEEEE", "\uEEEE"], /* Private Use */
+ ["\uEEEF", "\uEEEF"], /* Private Use */
+ ["\uEEF0", "\uEEF0"], /* Private Use */
+ ["\uEEF1", "\uEEF1"], /* Private Use */
+ ["\uEEF2", "\uEEF2"], /* Private Use */
+ ["\uEEF3", "\uEEF3"], /* Private Use */
+ ["\uEEF4", "\uEEF4"], /* Private Use */
+ ["\uEEF5", "\uEEF5"], /* Private Use */
+ ["\uEEF6", "\uEEF6"], /* Private Use */
+ ["\uEEF7", "\uEEF7"], /* Private Use */
+ ["\uEEF8", "\uEEF8"], /* Private Use */
+ ["\uEEF9", "\uEEF9"], /* Private Use */
+ ["\uEEFA", "\uEEFA"], /* Private Use */
+ ["\uEEFB", "\uEEFB"], /* Private Use */
+ ["\uEEFC", "\uEEFC"], /* Private Use */
+ ["\uEEFD", "\uEEFD"], /* Private Use */
+ ["\uEEFE", "\uEEFE"], /* Private Use */
+ ["\uEEFF", "\uEEFF"], /* Private Use */
+ ["\uEF00", "\uEF00"], /* Private Use */
+ ["\uEF01", "\uEF01"], /* Private Use */
+ ["\uEF02", "\uEF02"], /* Private Use */
+ ["\uEF03", "\uEF03"], /* Private Use */
+ ["\uEF04", "\uEF04"], /* Private Use */
+ ["\uEF05", "\uEF05"], /* Private Use */
+ ["\uEF06", "\uEF06"], /* Private Use */
+ ["\uEF07", "\uEF07"], /* Private Use */
+ ["\uEF08", "\uEF08"], /* Private Use */
+ ["\uEF09", "\uEF09"], /* Private Use */
+ ["\uEF0A", "\uEF0A"], /* Private Use */
+ ["\uEF0B", "\uEF0B"], /* Private Use */
+ ["\uEF0C", "\uEF0C"], /* Private Use */
+ ["\uEF0D", "\uEF0D"], /* Private Use */
+ ["\uEF0E", "\uEF0E"], /* Private Use */
+ ["\uEF0F", "\uEF0F"], /* Private Use */
+ ["\uEF10", "\uEF10"], /* Private Use */
+ ["\uEF11", "\uEF11"], /* Private Use */
+ ["\uEF12", "\uEF12"], /* Private Use */
+ ["\uEF13", "\uEF13"], /* Private Use */
+ ["\uEF14", "\uEF14"], /* Private Use */
+ ["\uEF15", "\uEF15"], /* Private Use */
+ ["\uEF16", "\uEF16"], /* Private Use */
+ ["\uEF17", "\uEF17"], /* Private Use */
+ ["\uEF18", "\uEF18"], /* Private Use */
+ ["\uEF19", "\uEF19"], /* Private Use */
+ ["\uEF1A", "\uEF1A"], /* Private Use */
+ ["\uEF1B", "\uEF1B"], /* Private Use */
+ ["\uEF1C", "\uEF1C"], /* Private Use */
+ ["\uEF1D", "\uEF1D"], /* Private Use */
+ ["\uEF1E", "\uEF1E"], /* Private Use */
+ ["\uEF1F", "\uEF1F"], /* Private Use */
+ ["\uEF20", "\uEF20"], /* Private Use */
+ ["\uEF21", "\uEF21"], /* Private Use */
+ ["\uEF22", "\uEF22"], /* Private Use */
+ ["\uEF23", "\uEF23"], /* Private Use */
+ ["\uEF24", "\uEF24"], /* Private Use */
+ ["\uEF25", "\uEF25"], /* Private Use */
+ ["\uEF26", "\uEF26"], /* Private Use */
+ ["\uEF27", "\uEF27"], /* Private Use */
+ ["\uEF28", "\uEF28"], /* Private Use */
+ ["\uEF29", "\uEF29"], /* Private Use */
+ ["\uEF2A", "\uEF2A"], /* Private Use */
+ ["\uEF2B", "\uEF2B"], /* Private Use */
+ ["\uEF2C", "\uEF2C"], /* Private Use */
+ ["\uEF2D", "\uEF2D"], /* Private Use */
+ ["\uEF2E", "\uEF2E"], /* Private Use */
+ ["\uEF2F", "\uEF2F"], /* Private Use */
+ ["\uEF30", "\uEF30"], /* Private Use */
+ ["\uEF31", "\uEF31"], /* Private Use */
+ ["\uEF32", "\uEF32"], /* Private Use */
+ ["\uEF33", "\uEF33"], /* Private Use */
+ ["\uEF34", "\uEF34"], /* Private Use */
+ ["\uEF35", "\uEF35"], /* Private Use */
+ ["\uEF36", "\uEF36"], /* Private Use */
+ ["\uEF37", "\uEF37"], /* Private Use */
+ ["\uEF38", "\uEF38"], /* Private Use */
+ ["\uEF39", "\uEF39"], /* Private Use */
+ ["\uEF3A", "\uEF3A"], /* Private Use */
+ ["\uEF3B", "\uEF3B"], /* Private Use */
+ ["\uEF3C", "\uEF3C"], /* Private Use */
+ ["\uEF3D", "\uEF3D"], /* Private Use */
+ ["\uEF3E", "\uEF3E"], /* Private Use */
+ ["\uEF3F", "\uEF3F"], /* Private Use */
+ ["\uEF40", "\uEF40"], /* Private Use */
+ ["\uEF41", "\uEF41"], /* Private Use */
+ ["\uEF42", "\uEF42"], /* Private Use */
+ ["\uEF43", "\uEF43"], /* Private Use */
+ ["\uEF44", "\uEF44"], /* Private Use */
+ ["\uEF45", "\uEF45"], /* Private Use */
+ ["\uEF46", "\uEF46"], /* Private Use */
+ ["\uEF47", "\uEF47"], /* Private Use */
+ ["\uEF48", "\uEF48"], /* Private Use */
+ ["\uEF49", "\uEF49"], /* Private Use */
+ ["\uEF4A", "\uEF4A"], /* Private Use */
+ ["\uEF4B", "\uEF4B"], /* Private Use */
+ ["\uEF4C", "\uEF4C"], /* Private Use */
+ ["\uEF4D", "\uEF4D"], /* Private Use */
+ ["\uEF4E", "\uEF4E"], /* Private Use */
+ ["\uEF4F", "\uEF4F"], /* Private Use */
+ ["\uEF50", "\uEF50"], /* Private Use */
+ ["\uEF51", "\uEF51"], /* Private Use */
+ ["\uEF52", "\uEF52"], /* Private Use */
+ ["\uEF53", "\uEF53"], /* Private Use */
+ ["\uEF54", "\uEF54"], /* Private Use */
+ ["\uEF55", "\uEF55"], /* Private Use */
+ ["\uEF56", "\uEF56"], /* Private Use */
+ ["\uEF57", "\uEF57"], /* Private Use */
+ ["\uEF58", "\uEF58"], /* Private Use */
+ ["\uEF59", "\uEF59"], /* Private Use */
+ ["\uEF5A", "\uEF5A"], /* Private Use */
+ ["\uEF5B", "\uEF5B"], /* Private Use */
+ ["\uEF5C", "\uEF5C"], /* Private Use */
+ ["\uEF5D", "\uEF5D"], /* Private Use */
+ ["\uEF5E", "\uEF5E"], /* Private Use */
+ ["\uEF5F", "\uEF5F"], /* Private Use */
+ ["\uEF60", "\uEF60"], /* Private Use */
+ ["\uEF61", "\uEF61"], /* Private Use */
+ ["\uEF62", "\uEF62"], /* Private Use */
+ ["\uEF63", "\uEF63"], /* Private Use */
+ ["\uEF64", "\uEF64"], /* Private Use */
+ ["\uEF65", "\uEF65"], /* Private Use */
+ ["\uEF66", "\uEF66"], /* Private Use */
+ ["\uEF67", "\uEF67"], /* Private Use */
+ ["\uEF68", "\uEF68"], /* Private Use */
+ ["\uEF69", "\uEF69"], /* Private Use */
+ ["\uEF6A", "\uEF6A"], /* Private Use */
+ ["\uEF6B", "\uEF6B"], /* Private Use */
+ ["\uEF6C", "\uEF6C"], /* Private Use */
+ ["\uEF6D", "\uEF6D"], /* Private Use */
+ ["\uEF6E", "\uEF6E"], /* Private Use */
+ ["\uEF6F", "\uEF6F"], /* Private Use */
+ ["\uEF70", "\uEF70"], /* Private Use */
+ ["\uEF71", "\uEF71"], /* Private Use */
+ ["\uEF72", "\uEF72"], /* Private Use */
+ ["\uEF73", "\uEF73"], /* Private Use */
+ ["\uEF74", "\uEF74"], /* Private Use */
+ ["\uEF75", "\uEF75"], /* Private Use */
+ ["\uEF76", "\uEF76"], /* Private Use */
+ ["\uEF77", "\uEF77"], /* Private Use */
+ ["\uEF78", "\uEF78"], /* Private Use */
+ ["\uEF79", "\uEF79"], /* Private Use */
+ ["\uEF7A", "\uEF7A"], /* Private Use */
+ ["\uEF7B", "\uEF7B"], /* Private Use */
+ ["\uEF7C", "\uEF7C"], /* Private Use */
+ ["\uEF7D", "\uEF7D"], /* Private Use */
+ ["\uEF7E", "\uEF7E"], /* Private Use */
+ ["\uEF7F", "\uEF7F"], /* Private Use */
+ ["\uEF80", "\uEF80"], /* Private Use */
+ ["\uEF81", "\uEF81"], /* Private Use */
+ ["\uEF82", "\uEF82"], /* Private Use */
+ ["\uEF83", "\uEF83"], /* Private Use */
+ ["\uEF84", "\uEF84"], /* Private Use */
+ ["\uEF85", "\uEF85"], /* Private Use */
+ ["\uEF86", "\uEF86"], /* Private Use */
+ ["\uEF87", "\uEF87"], /* Private Use */
+ ["\uEF88", "\uEF88"], /* Private Use */
+ ["\uEF89", "\uEF89"], /* Private Use */
+ ["\uEF8A", "\uEF8A"], /* Private Use */
+ ["\uEF8B", "\uEF8B"], /* Private Use */
+ ["\uEF8C", "\uEF8C"], /* Private Use */
+ ["\uEF8D", "\uEF8D"], /* Private Use */
+ ["\uEF8E", "\uEF8E"], /* Private Use */
+ ["\uEF8F", "\uEF8F"], /* Private Use */
+ ["\uEF90", "\uEF90"], /* Private Use */
+ ["\uEF91", "\uEF91"], /* Private Use */
+ ["\uEF92", "\uEF92"], /* Private Use */
+ ["\uEF93", "\uEF93"], /* Private Use */
+ ["\uEF94", "\uEF94"], /* Private Use */
+ ["\uEF95", "\uEF95"], /* Private Use */
+ ["\uEF96", "\uEF96"], /* Private Use */
+ ["\uEF97", "\uEF97"], /* Private Use */
+ ["\uEF98", "\uEF98"], /* Private Use */
+ ["\uEF99", "\uEF99"], /* Private Use */
+ ["\uEF9A", "\uEF9A"], /* Private Use */
+ ["\uEF9B", "\uEF9B"], /* Private Use */
+ ["\uEF9C", "\uEF9C"], /* Private Use */
+ ["\uEF9D", "\uEF9D"], /* Private Use */
+ ["\uEF9E", "\uEF9E"], /* Private Use */
+ ["\uEF9F", "\uEF9F"], /* Private Use */
+ ["\uEFA0", "\uEFA0"], /* Private Use */
+ ["\uEFA1", "\uEFA1"], /* Private Use */
+ ["\uEFA2", "\uEFA2"], /* Private Use */
+ ["\uEFA3", "\uEFA3"], /* Private Use */
+ ["\uEFA4", "\uEFA4"], /* Private Use */
+ ["\uEFA5", "\uEFA5"], /* Private Use */
+ ["\uEFA6", "\uEFA6"], /* Private Use */
+ ["\uEFA7", "\uEFA7"], /* Private Use */
+ ["\uEFA8", "\uEFA8"], /* Private Use */
+ ["\uEFA9", "\uEFA9"], /* Private Use */
+ ["\uEFAA", "\uEFAA"], /* Private Use */
+ ["\uEFAB", "\uEFAB"], /* Private Use */
+ ["\uEFAC", "\uEFAC"], /* Private Use */
+ ["\uEFAD", "\uEFAD"], /* Private Use */
+ ["\uEFAE", "\uEFAE"], /* Private Use */
+ ["\uEFAF", "\uEFAF"], /* Private Use */
+ ["\uEFB0", "\uEFB0"], /* Private Use */
+ ["\uEFB1", "\uEFB1"], /* Private Use */
+ ["\uEFB2", "\uEFB2"], /* Private Use */
+ ["\uEFB3", "\uEFB3"], /* Private Use */
+ ["\uEFB4", "\uEFB4"], /* Private Use */
+ ["\uEFB5", "\uEFB5"], /* Private Use */
+ ["\uEFB6", "\uEFB6"], /* Private Use */
+ ["\uEFB7", "\uEFB7"], /* Private Use */
+ ["\uEFB8", "\uEFB8"], /* Private Use */
+ ["\uEFB9", "\uEFB9"], /* Private Use */
+ ["\uEFBA", "\uEFBA"], /* Private Use */
+ ["\uEFBB", "\uEFBB"], /* Private Use */
+ ["\uEFBC", "\uEFBC"], /* Private Use */
+ ["\uEFBD", "\uEFBD"], /* Private Use */
+ ["\uEFBE", "\uEFBE"], /* Private Use */
+ ["\uEFBF", "\uEFBF"], /* Private Use */
+ ["\uEFC0", "\uEFC0"], /* Private Use */
+ ["\uEFC1", "\uEFC1"], /* Private Use */
+ ["\uEFC2", "\uEFC2"], /* Private Use */
+ ["\uEFC3", "\uEFC3"], /* Private Use */
+ ["\uEFC4", "\uEFC4"], /* Private Use */
+ ["\uEFC5", "\uEFC5"], /* Private Use */
+ ["\uEFC6", "\uEFC6"], /* Private Use */
+ ["\uEFC7", "\uEFC7"], /* Private Use */
+ ["\uEFC8", "\uEFC8"], /* Private Use */
+ ["\uEFC9", "\uEFC9"], /* Private Use */
+ ["\uEFCA", "\uEFCA"], /* Private Use */
+ ["\uEFCB", "\uEFCB"], /* Private Use */
+ ["\uEFCC", "\uEFCC"], /* Private Use */
+ ["\uEFCD", "\uEFCD"], /* Private Use */
+ ["\uEFCE", "\uEFCE"], /* Private Use */
+ ["\uEFCF", "\uEFCF"], /* Private Use */
+ ["\uEFD0", "\uEFD0"], /* Private Use */
+ ["\uEFD1", "\uEFD1"], /* Private Use */
+ ["\uEFD2", "\uEFD2"], /* Private Use */
+ ["\uEFD3", "\uEFD3"], /* Private Use */
+ ["\uEFD4", "\uEFD4"], /* Private Use */
+ ["\uEFD5", "\uEFD5"], /* Private Use */
+ ["\uEFD6", "\uEFD6"], /* Private Use */
+ ["\uEFD7", "\uEFD7"], /* Private Use */
+ ["\uEFD8", "\uEFD8"], /* Private Use */
+ ["\uEFD9", "\uEFD9"], /* Private Use */
+ ["\uEFDA", "\uEFDA"], /* Private Use */
+ ["\uEFDB", "\uEFDB"], /* Private Use */
+ ["\uEFDC", "\uEFDC"], /* Private Use */
+ ["\uEFDD", "\uEFDD"], /* Private Use */
+ ["\uEFDE", "\uEFDE"], /* Private Use */
+ ["\uEFDF", "\uEFDF"], /* Private Use */
+ ["\uEFE0", "\uEFE0"], /* Private Use */
+ ["\uEFE1", "\uEFE1"], /* Private Use */
+ ["\uEFE2", "\uEFE2"], /* Private Use */
+ ["\uEFE3", "\uEFE3"], /* Private Use */
+ ["\uEFE4", "\uEFE4"], /* Private Use */
+ ["\uEFE5", "\uEFE5"], /* Private Use */
+ ["\uEFE6", "\uEFE6"], /* Private Use */
+ ["\uEFE7", "\uEFE7"], /* Private Use */
+ ["\uEFE8", "\uEFE8"], /* Private Use */
+ ["\uEFE9", "\uEFE9"], /* Private Use */
+ ["\uEFEA", "\uEFEA"], /* Private Use */
+ ["\uEFEB", "\uEFEB"], /* Private Use */
+ ["\uEFEC", "\uEFEC"], /* Private Use */
+ ["\uEFED", "\uEFED"], /* Private Use */
+ ["\uEFEE", "\uEFEE"], /* Private Use */
+ ["\uEFEF", "\uEFEF"], /* Private Use */
+ ["\uEFF0", "\uEFF0"], /* Private Use */
+ ["\uEFF1", "\uEFF1"], /* Private Use */
+ ["\uEFF2", "\uEFF2"], /* Private Use */
+ ["\uEFF3", "\uEFF3"], /* Private Use */
+ ["\uEFF4", "\uEFF4"], /* Private Use */
+ ["\uEFF5", "\uEFF5"], /* Private Use */
+ ["\uEFF6", "\uEFF6"], /* Private Use */
+ ["\uEFF7", "\uEFF7"], /* Private Use */
+ ["\uEFF8", "\uEFF8"], /* Private Use */
+ ["\uEFF9", "\uEFF9"], /* Private Use */
+ ["\uEFFA", "\uEFFA"], /* Private Use */
+ ["\uEFFB", "\uEFFB"], /* Private Use */
+ ["\uEFFC", "\uEFFC"], /* Private Use */
+ ["\uEFFD", "\uEFFD"], /* Private Use */
+ ["\uEFFE", "\uEFFE"], /* Private Use */
+ ["\uEFFF", "\uEFFF"], /* Private Use */
+ ["\uF000", "\uF000"], /* Private Use */
+ ["\uF001", "\uF001"], /* Private Use */
+ ["\uF002", "\uF002"], /* Private Use */
+ ["\uF003", "\uF003"], /* Private Use */
+ ["\uF004", "\uF004"], /* Private Use */
+ ["\uF005", "\uF005"], /* Private Use */
+ ["\uF006", "\uF006"], /* Private Use */
+ ["\uF007", "\uF007"], /* Private Use */
+ ["\uF008", "\uF008"], /* Private Use */
+ ["\uF009", "\uF009"], /* Private Use */
+ ["\uF00A", "\uF00A"], /* Private Use */
+ ["\uF00B", "\uF00B"], /* Private Use */
+ ["\uF00C", "\uF00C"], /* Private Use */
+ ["\uF00D", "\uF00D"], /* Private Use */
+ ["\uF00E", "\uF00E"], /* Private Use */
+ ["\uF00F", "\uF00F"], /* Private Use */
+ ["\uF010", "\uF010"], /* Private Use */
+ ["\uF011", "\uF011"], /* Private Use */
+ ["\uF012", "\uF012"], /* Private Use */
+ ["\uF013", "\uF013"], /* Private Use */
+ ["\uF014", "\uF014"], /* Private Use */
+ ["\uF015", "\uF015"], /* Private Use */
+ ["\uF016", "\uF016"], /* Private Use */
+ ["\uF017", "\uF017"], /* Private Use */
+ ["\uF018", "\uF018"], /* Private Use */
+ ["\uF019", "\uF019"], /* Private Use */
+ ["\uF01A", "\uF01A"], /* Private Use */
+ ["\uF01B", "\uF01B"], /* Private Use */
+ ["\uF01C", "\uF01C"], /* Private Use */
+ ["\uF01D", "\uF01D"], /* Private Use */
+ ["\uF01E", "\uF01E"], /* Private Use */
+ ["\uF01F", "\uF01F"], /* Private Use */
+ ["\uF020", "\uF020"], /* Private Use */
+ ["\uF021", "\uF021"], /* Private Use */
+ ["\uF022", "\uF022"], /* Private Use */
+ ["\uF023", "\uF023"], /* Private Use */
+ ["\uF024", "\uF024"], /* Private Use */
+ ["\uF025", "\uF025"], /* Private Use */
+ ["\uF026", "\uF026"], /* Private Use */
+ ["\uF027", "\uF027"], /* Private Use */
+ ["\uF028", "\uF028"], /* Private Use */
+ ["\uF029", "\uF029"], /* Private Use */
+ ["\uF02A", "\uF02A"], /* Private Use */
+ ["\uF02B", "\uF02B"], /* Private Use */
+ ["\uF02C", "\uF02C"], /* Private Use */
+ ["\uF02D", "\uF02D"], /* Private Use */
+ ["\uF02E", "\uF02E"], /* Private Use */
+ ["\uF02F", "\uF02F"], /* Private Use */
+ ["\uF030", "\uF030"], /* Private Use */
+ ["\uF031", "\uF031"], /* Private Use */
+ ["\uF032", "\uF032"], /* Private Use */
+ ["\uF033", "\uF033"], /* Private Use */
+ ["\uF034", "\uF034"], /* Private Use */
+ ["\uF035", "\uF035"], /* Private Use */
+ ["\uF036", "\uF036"], /* Private Use */
+ ["\uF037", "\uF037"], /* Private Use */
+ ["\uF038", "\uF038"], /* Private Use */
+ ["\uF039", "\uF039"], /* Private Use */
+ ["\uF03A", "\uF03A"], /* Private Use */
+ ["\uF03B", "\uF03B"], /* Private Use */
+ ["\uF03C", "\uF03C"], /* Private Use */
+ ["\uF03D", "\uF03D"], /* Private Use */
+ ["\uF03E", "\uF03E"], /* Private Use */
+ ["\uF03F", "\uF03F"], /* Private Use */
+ ["\uF040", "\uF040"], /* Private Use */
+ ["\uF041", "\uF041"], /* Private Use */
+ ["\uF042", "\uF042"], /* Private Use */
+ ["\uF043", "\uF043"], /* Private Use */
+ ["\uF044", "\uF044"], /* Private Use */
+ ["\uF045", "\uF045"], /* Private Use */
+ ["\uF046", "\uF046"], /* Private Use */
+ ["\uF047", "\uF047"], /* Private Use */
+ ["\uF048", "\uF048"], /* Private Use */
+ ["\uF049", "\uF049"], /* Private Use */
+ ["\uF04A", "\uF04A"], /* Private Use */
+ ["\uF04B", "\uF04B"], /* Private Use */
+ ["\uF04C", "\uF04C"], /* Private Use */
+ ["\uF04D", "\uF04D"], /* Private Use */
+ ["\uF04E", "\uF04E"], /* Private Use */
+ ["\uF04F", "\uF04F"], /* Private Use */
+ ["\uF050", "\uF050"], /* Private Use */
+ ["\uF051", "\uF051"], /* Private Use */
+ ["\uF052", "\uF052"], /* Private Use */
+ ["\uF053", "\uF053"], /* Private Use */
+ ["\uF054", "\uF054"], /* Private Use */
+ ["\uF055", "\uF055"], /* Private Use */
+ ["\uF056", "\uF056"], /* Private Use */
+ ["\uF057", "\uF057"], /* Private Use */
+ ["\uF058", "\uF058"], /* Private Use */
+ ["\uF059", "\uF059"], /* Private Use */
+ ["\uF05A", "\uF05A"], /* Private Use */
+ ["\uF05B", "\uF05B"], /* Private Use */
+ ["\uF05C", "\uF05C"], /* Private Use */
+ ["\uF05D", "\uF05D"], /* Private Use */
+ ["\uF05E", "\uF05E"], /* Private Use */
+ ["\uF05F", "\uF05F"], /* Private Use */
+ ["\uF060", "\uF060"], /* Private Use */
+ ["\uF061", "\uF061"], /* Private Use */
+ ["\uF062", "\uF062"], /* Private Use */
+ ["\uF063", "\uF063"], /* Private Use */
+ ["\uF064", "\uF064"], /* Private Use */
+ ["\uF065", "\uF065"], /* Private Use */
+ ["\uF066", "\uF066"], /* Private Use */
+ ["\uF067", "\uF067"], /* Private Use */
+ ["\uF068", "\uF068"], /* Private Use */
+ ["\uF069", "\uF069"], /* Private Use */
+ ["\uF06A", "\uF06A"], /* Private Use */
+ ["\uF06B", "\uF06B"], /* Private Use */
+ ["\uF06C", "\uF06C"], /* Private Use */
+ ["\uF06D", "\uF06D"], /* Private Use */
+ ["\uF06E", "\uF06E"], /* Private Use */
+ ["\uF06F", "\uF06F"], /* Private Use */
+ ["\uF070", "\uF070"], /* Private Use */
+ ["\uF071", "\uF071"], /* Private Use */
+ ["\uF072", "\uF072"], /* Private Use */
+ ["\uF073", "\uF073"], /* Private Use */
+ ["\uF074", "\uF074"], /* Private Use */
+ ["\uF075", "\uF075"], /* Private Use */
+ ["\uF076", "\uF076"], /* Private Use */
+ ["\uF077", "\uF077"], /* Private Use */
+ ["\uF078", "\uF078"], /* Private Use */
+ ["\uF079", "\uF079"], /* Private Use */
+ ["\uF07A", "\uF07A"], /* Private Use */
+ ["\uF07B", "\uF07B"], /* Private Use */
+ ["\uF07C", "\uF07C"], /* Private Use */
+ ["\uF07D", "\uF07D"], /* Private Use */
+ ["\uF07E", "\uF07E"], /* Private Use */
+ ["\uF07F", "\uF07F"], /* Private Use */
+ ["\uF080", "\uF080"], /* Private Use */
+ ["\uF081", "\uF081"], /* Private Use */
+ ["\uF082", "\uF082"], /* Private Use */
+ ["\uF083", "\uF083"], /* Private Use */
+ ["\uF084", "\uF084"], /* Private Use */
+ ["\uF085", "\uF085"], /* Private Use */
+ ["\uF086", "\uF086"], /* Private Use */
+ ["\uF087", "\uF087"], /* Private Use */
+ ["\uF088", "\uF088"], /* Private Use */
+ ["\uF089", "\uF089"], /* Private Use */
+ ["\uF08A", "\uF08A"], /* Private Use */
+ ["\uF08B", "\uF08B"], /* Private Use */
+ ["\uF08C", "\uF08C"], /* Private Use */
+ ["\uF08D", "\uF08D"], /* Private Use */
+ ["\uF08E", "\uF08E"], /* Private Use */
+ ["\uF08F", "\uF08F"], /* Private Use */
+ ["\uF090", "\uF090"], /* Private Use */
+ ["\uF091", "\uF091"], /* Private Use */
+ ["\uF092", "\uF092"], /* Private Use */
+ ["\uF093", "\uF093"], /* Private Use */
+ ["\uF094", "\uF094"], /* Private Use */
+ ["\uF095", "\uF095"], /* Private Use */
+ ["\uF096", "\uF096"], /* Private Use */
+ ["\uF097", "\uF097"], /* Private Use */
+ ["\uF098", "\uF098"], /* Private Use */
+ ["\uF099", "\uF099"], /* Private Use */
+ ["\uF09A", "\uF09A"], /* Private Use */
+ ["\uF09B", "\uF09B"], /* Private Use */
+ ["\uF09C", "\uF09C"], /* Private Use */
+ ["\uF09D", "\uF09D"], /* Private Use */
+ ["\uF09E", "\uF09E"], /* Private Use */
+ ["\uF09F", "\uF09F"], /* Private Use */
+ ["\uF0A0", "\uF0A0"], /* Private Use */
+ ["\uF0A1", "\uF0A1"], /* Private Use */
+ ["\uF0A2", "\uF0A2"], /* Private Use */
+ ["\uF0A3", "\uF0A3"], /* Private Use */
+ ["\uF0A4", "\uF0A4"], /* Private Use */
+ ["\uF0A5", "\uF0A5"], /* Private Use */
+ ["\uF0A6", "\uF0A6"], /* Private Use */
+ ["\uF0A7", "\uF0A7"], /* Private Use */
+ ["\uF0A8", "\uF0A8"], /* Private Use */
+ ["\uF0A9", "\uF0A9"], /* Private Use */
+ ["\uF0AA", "\uF0AA"], /* Private Use */
+ ["\uF0AB", "\uF0AB"], /* Private Use */
+ ["\uF0AC", "\uF0AC"], /* Private Use */
+ ["\uF0AD", "\uF0AD"], /* Private Use */
+ ["\uF0AE", "\uF0AE"], /* Private Use */
+ ["\uF0AF", "\uF0AF"], /* Private Use */
+ ["\uF0B0", "\uF0B0"], /* Private Use */
+ ["\uF0B1", "\uF0B1"], /* Private Use */
+ ["\uF0B2", "\uF0B2"], /* Private Use */
+ ["\uF0B3", "\uF0B3"], /* Private Use */
+ ["\uF0B4", "\uF0B4"], /* Private Use */
+ ["\uF0B5", "\uF0B5"], /* Private Use */
+ ["\uF0B6", "\uF0B6"], /* Private Use */
+ ["\uF0B7", "\uF0B7"], /* Private Use */
+ ["\uF0B8", "\uF0B8"], /* Private Use */
+ ["\uF0B9", "\uF0B9"], /* Private Use */
+ ["\uF0BA", "\uF0BA"], /* Private Use */
+ ["\uF0BB", "\uF0BB"], /* Private Use */
+ ["\uF0BC", "\uF0BC"], /* Private Use */
+ ["\uF0BD", "\uF0BD"], /* Private Use */
+ ["\uF0BE", "\uF0BE"], /* Private Use */
+ ["\uF0BF", "\uF0BF"], /* Private Use */
+ ["\uF0C0", "\uF0C0"], /* Private Use */
+ ["\uF0C1", "\uF0C1"], /* Private Use */
+ ["\uF0C2", "\uF0C2"], /* Private Use */
+ ["\uF0C3", "\uF0C3"], /* Private Use */
+ ["\uF0C4", "\uF0C4"], /* Private Use */
+ ["\uF0C5", "\uF0C5"], /* Private Use */
+ ["\uF0C6", "\uF0C6"], /* Private Use */
+ ["\uF0C7", "\uF0C7"], /* Private Use */
+ ["\uF0C8", "\uF0C8"], /* Private Use */
+ ["\uF0C9", "\uF0C9"], /* Private Use */
+ ["\uF0CA", "\uF0CA"], /* Private Use */
+ ["\uF0CB", "\uF0CB"], /* Private Use */
+ ["\uF0CC", "\uF0CC"], /* Private Use */
+ ["\uF0CD", "\uF0CD"], /* Private Use */
+ ["\uF0CE", "\uF0CE"], /* Private Use */
+ ["\uF0CF", "\uF0CF"], /* Private Use */
+ ["\uF0D0", "\uF0D0"], /* Private Use */
+ ["\uF0D1", "\uF0D1"], /* Private Use */
+ ["\uF0D2", "\uF0D2"], /* Private Use */
+ ["\uF0D3", "\uF0D3"], /* Private Use */
+ ["\uF0D4", "\uF0D4"], /* Private Use */
+ ["\uF0D5", "\uF0D5"], /* Private Use */
+ ["\uF0D6", "\uF0D6"], /* Private Use */
+ ["\uF0D7", "\uF0D7"], /* Private Use */
+ ["\uF0D8", "\uF0D8"], /* Private Use */
+ ["\uF0D9", "\uF0D9"], /* Private Use */
+ ["\uF0DA", "\uF0DA"], /* Private Use */
+ ["\uF0DB", "\uF0DB"], /* Private Use */
+ ["\uF0DC", "\uF0DC"], /* Private Use */
+ ["\uF0DD", "\uF0DD"], /* Private Use */
+ ["\uF0DE", "\uF0DE"], /* Private Use */
+ ["\uF0DF", "\uF0DF"], /* Private Use */
+ ["\uF0E0", "\uF0E0"], /* Private Use */
+ ["\uF0E1", "\uF0E1"], /* Private Use */
+ ["\uF0E2", "\uF0E2"], /* Private Use */
+ ["\uF0E3", "\uF0E3"], /* Private Use */
+ ["\uF0E4", "\uF0E4"], /* Private Use */
+ ["\uF0E5", "\uF0E5"], /* Private Use */
+ ["\uF0E6", "\uF0E6"], /* Private Use */
+ ["\uF0E7", "\uF0E7"], /* Private Use */
+ ["\uF0E8", "\uF0E8"], /* Private Use */
+ ["\uF0E9", "\uF0E9"], /* Private Use */
+ ["\uF0EA", "\uF0EA"], /* Private Use */
+ ["\uF0EB", "\uF0EB"], /* Private Use */
+ ["\uF0EC", "\uF0EC"], /* Private Use */
+ ["\uF0ED", "\uF0ED"], /* Private Use */
+ ["\uF0EE", "\uF0EE"], /* Private Use */
+ ["\uF0EF", "\uF0EF"], /* Private Use */
+ ["\uF0F0", "\uF0F0"], /* Private Use */
+ ["\uF0F1", "\uF0F1"], /* Private Use */
+ ["\uF0F2", "\uF0F2"], /* Private Use */
+ ["\uF0F3", "\uF0F3"], /* Private Use */
+ ["\uF0F4", "\uF0F4"], /* Private Use */
+ ["\uF0F5", "\uF0F5"], /* Private Use */
+ ["\uF0F6", "\uF0F6"], /* Private Use */
+ ["\uF0F7", "\uF0F7"], /* Private Use */
+ ["\uF0F8", "\uF0F8"], /* Private Use */
+ ["\uF0F9", "\uF0F9"], /* Private Use */
+ ["\uF0FA", "\uF0FA"], /* Private Use */
+ ["\uF0FB", "\uF0FB"], /* Private Use */
+ ["\uF0FC", "\uF0FC"], /* Private Use */
+ ["\uF0FD", "\uF0FD"], /* Private Use */
+ ["\uF0FE", "\uF0FE"], /* Private Use */
+ ["\uF0FF", "\uF0FF"], /* Private Use */
+ ["\uF100", "\uF100"], /* Private Use */
+ ["\uF101", "\uF101"], /* Private Use */
+ ["\uF102", "\uF102"], /* Private Use */
+ ["\uF103", "\uF103"], /* Private Use */
+ ["\uF104", "\uF104"], /* Private Use */
+ ["\uF105", "\uF105"], /* Private Use */
+ ["\uF106", "\uF106"], /* Private Use */
+ ["\uF107", "\uF107"], /* Private Use */
+ ["\uF108", "\uF108"], /* Private Use */
+ ["\uF109", "\uF109"], /* Private Use */
+ ["\uF10A", "\uF10A"], /* Private Use */
+ ["\uF10B", "\uF10B"], /* Private Use */
+ ["\uF10C", "\uF10C"], /* Private Use */
+ ["\uF10D", "\uF10D"], /* Private Use */
+ ["\uF10E", "\uF10E"], /* Private Use */
+ ["\uF10F", "\uF10F"], /* Private Use */
+ ["\uF110", "\uF110"], /* Private Use */
+ ["\uF111", "\uF111"], /* Private Use */
+ ["\uF112", "\uF112"], /* Private Use */
+ ["\uF113", "\uF113"], /* Private Use */
+ ["\uF114", "\uF114"], /* Private Use */
+ ["\uF115", "\uF115"], /* Private Use */
+ ["\uF116", "\uF116"], /* Private Use */
+ ["\uF117", "\uF117"], /* Private Use */
+ ["\uF118", "\uF118"], /* Private Use */
+ ["\uF119", "\uF119"], /* Private Use */
+ ["\uF11A", "\uF11A"], /* Private Use */
+ ["\uF11B", "\uF11B"], /* Private Use */
+ ["\uF11C", "\uF11C"], /* Private Use */
+ ["\uF11D", "\uF11D"], /* Private Use */
+ ["\uF11E", "\uF11E"], /* Private Use */
+ ["\uF11F", "\uF11F"], /* Private Use */
+ ["\uF120", "\uF120"], /* Private Use */
+ ["\uF121", "\uF121"], /* Private Use */
+ ["\uF122", "\uF122"], /* Private Use */
+ ["\uF123", "\uF123"], /* Private Use */
+ ["\uF124", "\uF124"], /* Private Use */
+ ["\uF125", "\uF125"], /* Private Use */
+ ["\uF126", "\uF126"], /* Private Use */
+ ["\uF127", "\uF127"], /* Private Use */
+ ["\uF128", "\uF128"], /* Private Use */
+ ["\uF129", "\uF129"], /* Private Use */
+ ["\uF12A", "\uF12A"], /* Private Use */
+ ["\uF12B", "\uF12B"], /* Private Use */
+ ["\uF12C", "\uF12C"], /* Private Use */
+ ["\uF12D", "\uF12D"], /* Private Use */
+ ["\uF12E", "\uF12E"], /* Private Use */
+ ["\uF12F", "\uF12F"], /* Private Use */
+ ["\uF130", "\uF130"], /* Private Use */
+ ["\uF131", "\uF131"], /* Private Use */
+ ["\uF132", "\uF132"], /* Private Use */
+ ["\uF133", "\uF133"], /* Private Use */
+ ["\uF134", "\uF134"], /* Private Use */
+ ["\uF135", "\uF135"], /* Private Use */
+ ["\uF136", "\uF136"], /* Private Use */
+ ["\uF137", "\uF137"], /* Private Use */
+ ["\uF138", "\uF138"], /* Private Use */
+ ["\uF139", "\uF139"], /* Private Use */
+ ["\uF13A", "\uF13A"], /* Private Use */
+ ["\uF13B", "\uF13B"], /* Private Use */
+ ["\uF13C", "\uF13C"], /* Private Use */
+ ["\uF13D", "\uF13D"], /* Private Use */
+ ["\uF13E", "\uF13E"], /* Private Use */
+ ["\uF13F", "\uF13F"], /* Private Use */
+ ["\uF140", "\uF140"], /* Private Use */
+ ["\uF141", "\uF141"], /* Private Use */
+ ["\uF142", "\uF142"], /* Private Use */
+ ["\uF143", "\uF143"], /* Private Use */
+ ["\uF144", "\uF144"], /* Private Use */
+ ["\uF145", "\uF145"], /* Private Use */
+ ["\uF146", "\uF146"], /* Private Use */
+ ["\uF147", "\uF147"], /* Private Use */
+ ["\uF148", "\uF148"], /* Private Use */
+ ["\uF149", "\uF149"], /* Private Use */
+ ["\uF14A", "\uF14A"], /* Private Use */
+ ["\uF14B", "\uF14B"], /* Private Use */
+ ["\uF14C", "\uF14C"], /* Private Use */
+ ["\uF14D", "\uF14D"], /* Private Use */
+ ["\uF14E", "\uF14E"], /* Private Use */
+ ["\uF14F", "\uF14F"], /* Private Use */
+ ["\uF150", "\uF150"], /* Private Use */
+ ["\uF151", "\uF151"], /* Private Use */
+ ["\uF152", "\uF152"], /* Private Use */
+ ["\uF153", "\uF153"], /* Private Use */
+ ["\uF154", "\uF154"], /* Private Use */
+ ["\uF155", "\uF155"], /* Private Use */
+ ["\uF156", "\uF156"], /* Private Use */
+ ["\uF157", "\uF157"], /* Private Use */
+ ["\uF158", "\uF158"], /* Private Use */
+ ["\uF159", "\uF159"], /* Private Use */
+ ["\uF15A", "\uF15A"], /* Private Use */
+ ["\uF15B", "\uF15B"], /* Private Use */
+ ["\uF15C", "\uF15C"], /* Private Use */
+ ["\uF15D", "\uF15D"], /* Private Use */
+ ["\uF15E", "\uF15E"], /* Private Use */
+ ["\uF15F", "\uF15F"], /* Private Use */
+ ["\uF160", "\uF160"], /* Private Use */
+ ["\uF161", "\uF161"], /* Private Use */
+ ["\uF162", "\uF162"], /* Private Use */
+ ["\uF163", "\uF163"], /* Private Use */
+ ["\uF164", "\uF164"], /* Private Use */
+ ["\uF165", "\uF165"], /* Private Use */
+ ["\uF166", "\uF166"], /* Private Use */
+ ["\uF167", "\uF167"], /* Private Use */
+ ["\uF168", "\uF168"], /* Private Use */
+ ["\uF169", "\uF169"], /* Private Use */
+ ["\uF16A", "\uF16A"], /* Private Use */
+ ["\uF16B", "\uF16B"], /* Private Use */
+ ["\uF16C", "\uF16C"], /* Private Use */
+ ["\uF16D", "\uF16D"], /* Private Use */
+ ["\uF16E", "\uF16E"], /* Private Use */
+ ["\uF16F", "\uF16F"], /* Private Use */
+ ["\uF170", "\uF170"], /* Private Use */
+ ["\uF171", "\uF171"], /* Private Use */
+ ["\uF172", "\uF172"], /* Private Use */
+ ["\uF173", "\uF173"], /* Private Use */
+ ["\uF174", "\uF174"], /* Private Use */
+ ["\uF175", "\uF175"], /* Private Use */
+ ["\uF176", "\uF176"], /* Private Use */
+ ["\uF177", "\uF177"], /* Private Use */
+ ["\uF178", "\uF178"], /* Private Use */
+ ["\uF179", "\uF179"], /* Private Use */
+ ["\uF17A", "\uF17A"], /* Private Use */
+ ["\uF17B", "\uF17B"], /* Private Use */
+ ["\uF17C", "\uF17C"], /* Private Use */
+ ["\uF17D", "\uF17D"], /* Private Use */
+ ["\uF17E", "\uF17E"], /* Private Use */
+ ["\uF17F", "\uF17F"], /* Private Use */
+ ["\uF180", "\uF180"], /* Private Use */
+ ["\uF181", "\uF181"], /* Private Use */
+ ["\uF182", "\uF182"], /* Private Use */
+ ["\uF183", "\uF183"], /* Private Use */
+ ["\uF184", "\uF184"], /* Private Use */
+ ["\uF185", "\uF185"], /* Private Use */
+ ["\uF186", "\uF186"], /* Private Use */
+ ["\uF187", "\uF187"], /* Private Use */
+ ["\uF188", "\uF188"], /* Private Use */
+ ["\uF189", "\uF189"], /* Private Use */
+ ["\uF18A", "\uF18A"], /* Private Use */
+ ["\uF18B", "\uF18B"], /* Private Use */
+ ["\uF18C", "\uF18C"], /* Private Use */
+ ["\uF18D", "\uF18D"], /* Private Use */
+ ["\uF18E", "\uF18E"], /* Private Use */
+ ["\uF18F", "\uF18F"], /* Private Use */
+ ["\uF190", "\uF190"], /* Private Use */
+ ["\uF191", "\uF191"], /* Private Use */
+ ["\uF192", "\uF192"], /* Private Use */
+ ["\uF193", "\uF193"], /* Private Use */
+ ["\uF194", "\uF194"], /* Private Use */
+ ["\uF195", "\uF195"], /* Private Use */
+ ["\uF196", "\uF196"], /* Private Use */
+ ["\uF197", "\uF197"], /* Private Use */
+ ["\uF198", "\uF198"], /* Private Use */
+ ["\uF199", "\uF199"], /* Private Use */
+ ["\uF19A", "\uF19A"], /* Private Use */
+ ["\uF19B", "\uF19B"], /* Private Use */
+ ["\uF19C", "\uF19C"], /* Private Use */
+ ["\uF19D", "\uF19D"], /* Private Use */
+ ["\uF19E", "\uF19E"], /* Private Use */
+ ["\uF19F", "\uF19F"], /* Private Use */
+ ["\uF1A0", "\uF1A0"], /* Private Use */
+ ["\uF1A1", "\uF1A1"], /* Private Use */
+ ["\uF1A2", "\uF1A2"], /* Private Use */
+ ["\uF1A3", "\uF1A3"], /* Private Use */
+ ["\uF1A4", "\uF1A4"], /* Private Use */
+ ["\uF1A5", "\uF1A5"], /* Private Use */
+ ["\uF1A6", "\uF1A6"], /* Private Use */
+ ["\uF1A7", "\uF1A7"], /* Private Use */
+ ["\uF1A8", "\uF1A8"], /* Private Use */
+ ["\uF1A9", "\uF1A9"], /* Private Use */
+ ["\uF1AA", "\uF1AA"], /* Private Use */
+ ["\uF1AB", "\uF1AB"], /* Private Use */
+ ["\uF1AC", "\uF1AC"], /* Private Use */
+ ["\uF1AD", "\uF1AD"], /* Private Use */
+ ["\uF1AE", "\uF1AE"], /* Private Use */
+ ["\uF1AF", "\uF1AF"], /* Private Use */
+ ["\uF1B0", "\uF1B0"], /* Private Use */
+ ["\uF1B1", "\uF1B1"], /* Private Use */
+ ["\uF1B2", "\uF1B2"], /* Private Use */
+ ["\uF1B3", "\uF1B3"], /* Private Use */
+ ["\uF1B4", "\uF1B4"], /* Private Use */
+ ["\uF1B5", "\uF1B5"], /* Private Use */
+ ["\uF1B6", "\uF1B6"], /* Private Use */
+ ["\uF1B7", "\uF1B7"], /* Private Use */
+ ["\uF1B8", "\uF1B8"], /* Private Use */
+ ["\uF1B9", "\uF1B9"], /* Private Use */
+ ["\uF1BA", "\uF1BA"], /* Private Use */
+ ["\uF1BB", "\uF1BB"], /* Private Use */
+ ["\uF1BC", "\uF1BC"], /* Private Use */
+ ["\uF1BD", "\uF1BD"], /* Private Use */
+ ["\uF1BE", "\uF1BE"], /* Private Use */
+ ["\uF1BF", "\uF1BF"], /* Private Use */
+ ["\uF1C0", "\uF1C0"], /* Private Use */
+ ["\uF1C1", "\uF1C1"], /* Private Use */
+ ["\uF1C2", "\uF1C2"], /* Private Use */
+ ["\uF1C3", "\uF1C3"], /* Private Use */
+ ["\uF1C4", "\uF1C4"], /* Private Use */
+ ["\uF1C5", "\uF1C5"], /* Private Use */
+ ["\uF1C6", "\uF1C6"], /* Private Use */
+ ["\uF1C7", "\uF1C7"], /* Private Use */
+ ["\uF1C8", "\uF1C8"], /* Private Use */
+ ["\uF1C9", "\uF1C9"], /* Private Use */
+ ["\uF1CA", "\uF1CA"], /* Private Use */
+ ["\uF1CB", "\uF1CB"], /* Private Use */
+ ["\uF1CC", "\uF1CC"], /* Private Use */
+ ["\uF1CD", "\uF1CD"], /* Private Use */
+ ["\uF1CE", "\uF1CE"], /* Private Use */
+ ["\uF1CF", "\uF1CF"], /* Private Use */
+ ["\uF1D0", "\uF1D0"], /* Private Use */
+ ["\uF1D1", "\uF1D1"], /* Private Use */
+ ["\uF1D2", "\uF1D2"], /* Private Use */
+ ["\uF1D3", "\uF1D3"], /* Private Use */
+ ["\uF1D4", "\uF1D4"], /* Private Use */
+ ["\uF1D5", "\uF1D5"], /* Private Use */
+ ["\uF1D6", "\uF1D6"], /* Private Use */
+ ["\uF1D7", "\uF1D7"], /* Private Use */
+ ["\uF1D8", "\uF1D8"], /* Private Use */
+ ["\uF1D9", "\uF1D9"], /* Private Use */
+ ["\uF1DA", "\uF1DA"], /* Private Use */
+ ["\uF1DB", "\uF1DB"], /* Private Use */
+ ["\uF1DC", "\uF1DC"], /* Private Use */
+ ["\uF1DD", "\uF1DD"], /* Private Use */
+ ["\uF1DE", "\uF1DE"], /* Private Use */
+ ["\uF1DF", "\uF1DF"], /* Private Use */
+ ["\uF1E0", "\uF1E0"], /* Private Use */
+ ["\uF1E1", "\uF1E1"], /* Private Use */
+ ["\uF1E2", "\uF1E2"], /* Private Use */
+ ["\uF1E3", "\uF1E3"], /* Private Use */
+ ["\uF1E4", "\uF1E4"], /* Private Use */
+ ["\uF1E5", "\uF1E5"], /* Private Use */
+ ["\uF1E6", "\uF1E6"], /* Private Use */
+ ["\uF1E7", "\uF1E7"], /* Private Use */
+ ["\uF1E8", "\uF1E8"], /* Private Use */
+ ["\uF1E9", "\uF1E9"], /* Private Use */
+ ["\uF1EA", "\uF1EA"], /* Private Use */
+ ["\uF1EB", "\uF1EB"], /* Private Use */
+ ["\uF1EC", "\uF1EC"], /* Private Use */
+ ["\uF1ED", "\uF1ED"], /* Private Use */
+ ["\uF1EE", "\uF1EE"], /* Private Use */
+ ["\uF1EF", "\uF1EF"], /* Private Use */
+ ["\uF1F0", "\uF1F0"], /* Private Use */
+ ["\uF1F1", "\uF1F1"], /* Private Use */
+ ["\uF1F2", "\uF1F2"], /* Private Use */
+ ["\uF1F3", "\uF1F3"], /* Private Use */
+ ["\uF1F4", "\uF1F4"], /* Private Use */
+ ["\uF1F5", "\uF1F5"], /* Private Use */
+ ["\uF1F6", "\uF1F6"], /* Private Use */
+ ["\uF1F7", "\uF1F7"], /* Private Use */
+ ["\uF1F8", "\uF1F8"], /* Private Use */
+ ["\uF1F9", "\uF1F9"], /* Private Use */
+ ["\uF1FA", "\uF1FA"], /* Private Use */
+ ["\uF1FB", "\uF1FB"], /* Private Use */
+ ["\uF1FC", "\uF1FC"], /* Private Use */
+ ["\uF1FD", "\uF1FD"], /* Private Use */
+ ["\uF1FE", "\uF1FE"], /* Private Use */
+ ["\uF1FF", "\uF1FF"], /* Private Use */
+ ["\uF200", "\uF200"], /* Private Use */
+ ["\uF201", "\uF201"], /* Private Use */
+ ["\uF202", "\uF202"], /* Private Use */
+ ["\uF203", "\uF203"], /* Private Use */
+ ["\uF204", "\uF204"], /* Private Use */
+ ["\uF205", "\uF205"], /* Private Use */
+ ["\uF206", "\uF206"], /* Private Use */
+ ["\uF207", "\uF207"], /* Private Use */
+ ["\uF208", "\uF208"], /* Private Use */
+ ["\uF209", "\uF209"], /* Private Use */
+ ["\uF20A", "\uF20A"], /* Private Use */
+ ["\uF20B", "\uF20B"], /* Private Use */
+ ["\uF20C", "\uF20C"], /* Private Use */
+ ["\uF20D", "\uF20D"], /* Private Use */
+ ["\uF20E", "\uF20E"], /* Private Use */
+ ["\uF20F", "\uF20F"], /* Private Use */
+ ["\uF210", "\uF210"], /* Private Use */
+ ["\uF211", "\uF211"], /* Private Use */
+ ["\uF212", "\uF212"], /* Private Use */
+ ["\uF213", "\uF213"], /* Private Use */
+ ["\uF214", "\uF214"], /* Private Use */
+ ["\uF215", "\uF215"], /* Private Use */
+ ["\uF216", "\uF216"], /* Private Use */
+ ["\uF217", "\uF217"], /* Private Use */
+ ["\uF218", "\uF218"], /* Private Use */
+ ["\uF219", "\uF219"], /* Private Use */
+ ["\uF21A", "\uF21A"], /* Private Use */
+ ["\uF21B", "\uF21B"], /* Private Use */
+ ["\uF21C", "\uF21C"], /* Private Use */
+ ["\uF21D", "\uF21D"], /* Private Use */
+ ["\uF21E", "\uF21E"], /* Private Use */
+ ["\uF21F", "\uF21F"], /* Private Use */
+ ["\uF220", "\uF220"], /* Private Use */
+ ["\uF221", "\uF221"], /* Private Use */
+ ["\uF222", "\uF222"], /* Private Use */
+ ["\uF223", "\uF223"], /* Private Use */
+ ["\uF224", "\uF224"], /* Private Use */
+ ["\uF225", "\uF225"], /* Private Use */
+ ["\uF226", "\uF226"], /* Private Use */
+ ["\uF227", "\uF227"], /* Private Use */
+ ["\uF228", "\uF228"], /* Private Use */
+ ["\uF229", "\uF229"], /* Private Use */
+ ["\uF22A", "\uF22A"], /* Private Use */
+ ["\uF22B", "\uF22B"], /* Private Use */
+ ["\uF22C", "\uF22C"], /* Private Use */
+ ["\uF22D", "\uF22D"], /* Private Use */
+ ["\uF22E", "\uF22E"], /* Private Use */
+ ["\uF22F", "\uF22F"], /* Private Use */
+ ["\uF230", "\uF230"], /* Private Use */
+ ["\uF231", "\uF231"], /* Private Use */
+ ["\uF232", "\uF232"], /* Private Use */
+ ["\uF233", "\uF233"], /* Private Use */
+ ["\uF234", "\uF234"], /* Private Use */
+ ["\uF235", "\uF235"], /* Private Use */
+ ["\uF236", "\uF236"], /* Private Use */
+ ["\uF237", "\uF237"], /* Private Use */
+ ["\uF238", "\uF238"], /* Private Use */
+ ["\uF239", "\uF239"], /* Private Use */
+ ["\uF23A", "\uF23A"], /* Private Use */
+ ["\uF23B", "\uF23B"], /* Private Use */
+ ["\uF23C", "\uF23C"], /* Private Use */
+ ["\uF23D", "\uF23D"], /* Private Use */
+ ["\uF23E", "\uF23E"], /* Private Use */
+ ["\uF23F", "\uF23F"], /* Private Use */
+ ["\uF240", "\uF240"], /* Private Use */
+ ["\uF241", "\uF241"], /* Private Use */
+ ["\uF242", "\uF242"], /* Private Use */
+ ["\uF243", "\uF243"], /* Private Use */
+ ["\uF244", "\uF244"], /* Private Use */
+ ["\uF245", "\uF245"], /* Private Use */
+ ["\uF246", "\uF246"], /* Private Use */
+ ["\uF247", "\uF247"], /* Private Use */
+ ["\uF248", "\uF248"], /* Private Use */
+ ["\uF249", "\uF249"], /* Private Use */
+ ["\uF24A", "\uF24A"], /* Private Use */
+ ["\uF24B", "\uF24B"], /* Private Use */
+ ["\uF24C", "\uF24C"], /* Private Use */
+ ["\uF24D", "\uF24D"], /* Private Use */
+ ["\uF24E", "\uF24E"], /* Private Use */
+ ["\uF24F", "\uF24F"], /* Private Use */
+ ["\uF250", "\uF250"], /* Private Use */
+ ["\uF251", "\uF251"], /* Private Use */
+ ["\uF252", "\uF252"], /* Private Use */
+ ["\uF253", "\uF253"], /* Private Use */
+ ["\uF254", "\uF254"], /* Private Use */
+ ["\uF255", "\uF255"], /* Private Use */
+ ["\uF256", "\uF256"], /* Private Use */
+ ["\uF257", "\uF257"], /* Private Use */
+ ["\uF258", "\uF258"], /* Private Use */
+ ["\uF259", "\uF259"], /* Private Use */
+ ["\uF25A", "\uF25A"], /* Private Use */
+ ["\uF25B", "\uF25B"], /* Private Use */
+ ["\uF25C", "\uF25C"], /* Private Use */
+ ["\uF25D", "\uF25D"], /* Private Use */
+ ["\uF25E", "\uF25E"], /* Private Use */
+ ["\uF25F", "\uF25F"], /* Private Use */
+ ["\uF260", "\uF260"], /* Private Use */
+ ["\uF261", "\uF261"], /* Private Use */
+ ["\uF262", "\uF262"], /* Private Use */
+ ["\uF263", "\uF263"], /* Private Use */
+ ["\uF264", "\uF264"], /* Private Use */
+ ["\uF265", "\uF265"], /* Private Use */
+ ["\uF266", "\uF266"], /* Private Use */
+ ["\uF267", "\uF267"], /* Private Use */
+ ["\uF268", "\uF268"], /* Private Use */
+ ["\uF269", "\uF269"], /* Private Use */
+ ["\uF26A", "\uF26A"], /* Private Use */
+ ["\uF26B", "\uF26B"], /* Private Use */
+ ["\uF26C", "\uF26C"], /* Private Use */
+ ["\uF26D", "\uF26D"], /* Private Use */
+ ["\uF26E", "\uF26E"], /* Private Use */
+ ["\uF26F", "\uF26F"], /* Private Use */
+ ["\uF270", "\uF270"], /* Private Use */
+ ["\uF271", "\uF271"], /* Private Use */
+ ["\uF272", "\uF272"], /* Private Use */
+ ["\uF273", "\uF273"], /* Private Use */
+ ["\uF274", "\uF274"], /* Private Use */
+ ["\uF275", "\uF275"], /* Private Use */
+ ["\uF276", "\uF276"], /* Private Use */
+ ["\uF277", "\uF277"], /* Private Use */
+ ["\uF278", "\uF278"], /* Private Use */
+ ["\uF279", "\uF279"], /* Private Use */
+ ["\uF27A", "\uF27A"], /* Private Use */
+ ["\uF27B", "\uF27B"], /* Private Use */
+ ["\uF27C", "\uF27C"], /* Private Use */
+ ["\uF27D", "\uF27D"], /* Private Use */
+ ["\uF27E", "\uF27E"], /* Private Use */
+ ["\uF27F", "\uF27F"], /* Private Use */
+ ["\uF280", "\uF280"], /* Private Use */
+ ["\uF281", "\uF281"], /* Private Use */
+ ["\uF282", "\uF282"], /* Private Use */
+ ["\uF283", "\uF283"], /* Private Use */
+ ["\uF284", "\uF284"], /* Private Use */
+ ["\uF285", "\uF285"], /* Private Use */
+ ["\uF286", "\uF286"], /* Private Use */
+ ["\uF287", "\uF287"], /* Private Use */
+ ["\uF288", "\uF288"], /* Private Use */
+ ["\uF289", "\uF289"], /* Private Use */
+ ["\uF28A", "\uF28A"], /* Private Use */
+ ["\uF28B", "\uF28B"], /* Private Use */
+ ["\uF28C", "\uF28C"], /* Private Use */
+ ["\uF28D", "\uF28D"], /* Private Use */
+ ["\uF28E", "\uF28E"], /* Private Use */
+ ["\uF28F", "\uF28F"], /* Private Use */
+ ["\uF290", "\uF290"], /* Private Use */
+ ["\uF291", "\uF291"], /* Private Use */
+ ["\uF292", "\uF292"], /* Private Use */
+ ["\uF293", "\uF293"], /* Private Use */
+ ["\uF294", "\uF294"], /* Private Use */
+ ["\uF295", "\uF295"], /* Private Use */
+ ["\uF296", "\uF296"], /* Private Use */
+ ["\uF297", "\uF297"], /* Private Use */
+ ["\uF298", "\uF298"], /* Private Use */
+ ["\uF299", "\uF299"], /* Private Use */
+ ["\uF29A", "\uF29A"], /* Private Use */
+ ["\uF29B", "\uF29B"], /* Private Use */
+ ["\uF29C", "\uF29C"], /* Private Use */
+ ["\uF29D", "\uF29D"], /* Private Use */
+ ["\uF29E", "\uF29E"], /* Private Use */
+ ["\uF29F", "\uF29F"], /* Private Use */
+ ["\uF2A0", "\uF2A0"], /* Private Use */
+ ["\uF2A1", "\uF2A1"], /* Private Use */
+ ["\uF2A2", "\uF2A2"], /* Private Use */
+ ["\uF2A3", "\uF2A3"], /* Private Use */
+ ["\uF2A4", "\uF2A4"], /* Private Use */
+ ["\uF2A5", "\uF2A5"], /* Private Use */
+ ["\uF2A6", "\uF2A6"], /* Private Use */
+ ["\uF2A7", "\uF2A7"], /* Private Use */
+ ["\uF2A8", "\uF2A8"], /* Private Use */
+ ["\uF2A9", "\uF2A9"], /* Private Use */
+ ["\uF2AA", "\uF2AA"], /* Private Use */
+ ["\uF2AB", "\uF2AB"], /* Private Use */
+ ["\uF2AC", "\uF2AC"], /* Private Use */
+ ["\uF2AD", "\uF2AD"], /* Private Use */
+ ["\uF2AE", "\uF2AE"], /* Private Use */
+ ["\uF2AF", "\uF2AF"], /* Private Use */
+ ["\uF2B0", "\uF2B0"], /* Private Use */
+ ["\uF2B1", "\uF2B1"], /* Private Use */
+ ["\uF2B2", "\uF2B2"], /* Private Use */
+ ["\uF2B3", "\uF2B3"], /* Private Use */
+ ["\uF2B4", "\uF2B4"], /* Private Use */
+ ["\uF2B5", "\uF2B5"], /* Private Use */
+ ["\uF2B6", "\uF2B6"], /* Private Use */
+ ["\uF2B7", "\uF2B7"], /* Private Use */
+ ["\uF2B8", "\uF2B8"], /* Private Use */
+ ["\uF2B9", "\uF2B9"], /* Private Use */
+ ["\uF2BA", "\uF2BA"], /* Private Use */
+ ["\uF2BB", "\uF2BB"], /* Private Use */
+ ["\uF2BC", "\uF2BC"], /* Private Use */
+ ["\uF2BD", "\uF2BD"], /* Private Use */
+ ["\uF2BE", "\uF2BE"], /* Private Use */
+ ["\uF2BF", "\uF2BF"], /* Private Use */
+ ["\uF2C0", "\uF2C0"], /* Private Use */
+ ["\uF2C1", "\uF2C1"], /* Private Use */
+ ["\uF2C2", "\uF2C2"], /* Private Use */
+ ["\uF2C3", "\uF2C3"], /* Private Use */
+ ["\uF2C4", "\uF2C4"], /* Private Use */
+ ["\uF2C5", "\uF2C5"], /* Private Use */
+ ["\uF2C6", "\uF2C6"], /* Private Use */
+ ["\uF2C7", "\uF2C7"], /* Private Use */
+ ["\uF2C8", "\uF2C8"], /* Private Use */
+ ["\uF2C9", "\uF2C9"], /* Private Use */
+ ["\uF2CA", "\uF2CA"], /* Private Use */
+ ["\uF2CB", "\uF2CB"], /* Private Use */
+ ["\uF2CC", "\uF2CC"], /* Private Use */
+ ["\uF2CD", "\uF2CD"], /* Private Use */
+ ["\uF2CE", "\uF2CE"], /* Private Use */
+ ["\uF2CF", "\uF2CF"], /* Private Use */
+ ["\uF2D0", "\uF2D0"], /* Private Use */
+ ["\uF2D1", "\uF2D1"], /* Private Use */
+ ["\uF2D2", "\uF2D2"], /* Private Use */
+ ["\uF2D3", "\uF2D3"], /* Private Use */
+ ["\uF2D4", "\uF2D4"], /* Private Use */
+ ["\uF2D5", "\uF2D5"], /* Private Use */
+ ["\uF2D6", "\uF2D6"], /* Private Use */
+ ["\uF2D7", "\uF2D7"], /* Private Use */
+ ["\uF2D8", "\uF2D8"], /* Private Use */
+ ["\uF2D9", "\uF2D9"], /* Private Use */
+ ["\uF2DA", "\uF2DA"], /* Private Use */
+ ["\uF2DB", "\uF2DB"], /* Private Use */
+ ["\uF2DC", "\uF2DC"], /* Private Use */
+ ["\uF2DD", "\uF2DD"], /* Private Use */
+ ["\uF2DE", "\uF2DE"], /* Private Use */
+ ["\uF2DF", "\uF2DF"], /* Private Use */
+ ["\uF2E0", "\uF2E0"], /* Private Use */
+ ["\uF2E1", "\uF2E1"], /* Private Use */
+ ["\uF2E2", "\uF2E2"], /* Private Use */
+ ["\uF2E3", "\uF2E3"], /* Private Use */
+ ["\uF2E4", "\uF2E4"], /* Private Use */
+ ["\uF2E5", "\uF2E5"], /* Private Use */
+ ["\uF2E6", "\uF2E6"], /* Private Use */
+ ["\uF2E7", "\uF2E7"], /* Private Use */
+ ["\uF2E8", "\uF2E8"], /* Private Use */
+ ["\uF2E9", "\uF2E9"], /* Private Use */
+ ["\uF2EA", "\uF2EA"], /* Private Use */
+ ["\uF2EB", "\uF2EB"], /* Private Use */
+ ["\uF2EC", "\uF2EC"], /* Private Use */
+ ["\uF2ED", "\uF2ED"], /* Private Use */
+ ["\uF2EE", "\uF2EE"], /* Private Use */
+ ["\uF2EF", "\uF2EF"], /* Private Use */
+ ["\uF2F0", "\uF2F0"], /* Private Use */
+ ["\uF2F1", "\uF2F1"], /* Private Use */
+ ["\uF2F2", "\uF2F2"], /* Private Use */
+ ["\uF2F3", "\uF2F3"], /* Private Use */
+ ["\uF2F4", "\uF2F4"], /* Private Use */
+ ["\uF2F5", "\uF2F5"], /* Private Use */
+ ["\uF2F6", "\uF2F6"], /* Private Use */
+ ["\uF2F7", "\uF2F7"], /* Private Use */
+ ["\uF2F8", "\uF2F8"], /* Private Use */
+ ["\uF2F9", "\uF2F9"], /* Private Use */
+ ["\uF2FA", "\uF2FA"], /* Private Use */
+ ["\uF2FB", "\uF2FB"], /* Private Use */
+ ["\uF2FC", "\uF2FC"], /* Private Use */
+ ["\uF2FD", "\uF2FD"], /* Private Use */
+ ["\uF2FE", "\uF2FE"], /* Private Use */
+ ["\uF2FF", "\uF2FF"], /* Private Use */
+ ["\uF300", "\uF300"], /* Private Use */
+ ["\uF301", "\uF301"], /* Private Use */
+ ["\uF302", "\uF302"], /* Private Use */
+ ["\uF303", "\uF303"], /* Private Use */
+ ["\uF304", "\uF304"], /* Private Use */
+ ["\uF305", "\uF305"], /* Private Use */
+ ["\uF306", "\uF306"], /* Private Use */
+ ["\uF307", "\uF307"], /* Private Use */
+ ["\uF308", "\uF308"], /* Private Use */
+ ["\uF309", "\uF309"], /* Private Use */
+ ["\uF30A", "\uF30A"], /* Private Use */
+ ["\uF30B", "\uF30B"], /* Private Use */
+ ["\uF30C", "\uF30C"], /* Private Use */
+ ["\uF30D", "\uF30D"], /* Private Use */
+ ["\uF30E", "\uF30E"], /* Private Use */
+ ["\uF30F", "\uF30F"], /* Private Use */
+ ["\uF310", "\uF310"], /* Private Use */
+ ["\uF311", "\uF311"], /* Private Use */
+ ["\uF312", "\uF312"], /* Private Use */
+ ["\uF313", "\uF313"], /* Private Use */
+ ["\uF314", "\uF314"], /* Private Use */
+ ["\uF315", "\uF315"], /* Private Use */
+ ["\uF316", "\uF316"], /* Private Use */
+ ["\uF317", "\uF317"], /* Private Use */
+ ["\uF318", "\uF318"], /* Private Use */
+ ["\uF319", "\uF319"], /* Private Use */
+ ["\uF31A", "\uF31A"], /* Private Use */
+ ["\uF31B", "\uF31B"], /* Private Use */
+ ["\uF31C", "\uF31C"], /* Private Use */
+ ["\uF31D", "\uF31D"], /* Private Use */
+ ["\uF31E", "\uF31E"], /* Private Use */
+ ["\uF31F", "\uF31F"], /* Private Use */
+ ["\uF320", "\uF320"], /* Private Use */
+ ["\uF321", "\uF321"], /* Private Use */
+ ["\uF322", "\uF322"], /* Private Use */
+ ["\uF323", "\uF323"], /* Private Use */
+ ["\uF324", "\uF324"], /* Private Use */
+ ["\uF325", "\uF325"], /* Private Use */
+ ["\uF326", "\uF326"], /* Private Use */
+ ["\uF327", "\uF327"], /* Private Use */
+ ["\uF328", "\uF328"], /* Private Use */
+ ["\uF329", "\uF329"], /* Private Use */
+ ["\uF32A", "\uF32A"], /* Private Use */
+ ["\uF32B", "\uF32B"], /* Private Use */
+ ["\uF32C", "\uF32C"], /* Private Use */
+ ["\uF32D", "\uF32D"], /* Private Use */
+ ["\uF32E", "\uF32E"], /* Private Use */
+ ["\uF32F", "\uF32F"], /* Private Use */
+ ["\uF330", "\uF330"], /* Private Use */
+ ["\uF331", "\uF331"], /* Private Use */
+ ["\uF332", "\uF332"], /* Private Use */
+ ["\uF333", "\uF333"], /* Private Use */
+ ["\uF334", "\uF334"], /* Private Use */
+ ["\uF335", "\uF335"], /* Private Use */
+ ["\uF336", "\uF336"], /* Private Use */
+ ["\uF337", "\uF337"], /* Private Use */
+ ["\uF338", "\uF338"], /* Private Use */
+ ["\uF339", "\uF339"], /* Private Use */
+ ["\uF33A", "\uF33A"], /* Private Use */
+ ["\uF33B", "\uF33B"], /* Private Use */
+ ["\uF33C", "\uF33C"], /* Private Use */
+ ["\uF33D", "\uF33D"], /* Private Use */
+ ["\uF33E", "\uF33E"], /* Private Use */
+ ["\uF33F", "\uF33F"], /* Private Use */
+ ["\uF340", "\uF340"], /* Private Use */
+ ["\uF341", "\uF341"], /* Private Use */
+ ["\uF342", "\uF342"], /* Private Use */
+ ["\uF343", "\uF343"], /* Private Use */
+ ["\uF344", "\uF344"], /* Private Use */
+ ["\uF345", "\uF345"], /* Private Use */
+ ["\uF346", "\uF346"], /* Private Use */
+ ["\uF347", "\uF347"], /* Private Use */
+ ["\uF348", "\uF348"], /* Private Use */
+ ["\uF349", "\uF349"], /* Private Use */
+ ["\uF34A", "\uF34A"], /* Private Use */
+ ["\uF34B", "\uF34B"], /* Private Use */
+ ["\uF34C", "\uF34C"], /* Private Use */
+ ["\uF34D", "\uF34D"], /* Private Use */
+ ["\uF34E", "\uF34E"], /* Private Use */
+ ["\uF34F", "\uF34F"], /* Private Use */
+ ["\uF350", "\uF350"], /* Private Use */
+ ["\uF351", "\uF351"], /* Private Use */
+ ["\uF352", "\uF352"], /* Private Use */
+ ["\uF353", "\uF353"], /* Private Use */
+ ["\uF354", "\uF354"], /* Private Use */
+ ["\uF355", "\uF355"], /* Private Use */
+ ["\uF356", "\uF356"], /* Private Use */
+ ["\uF357", "\uF357"], /* Private Use */
+ ["\uF358", "\uF358"], /* Private Use */
+ ["\uF359", "\uF359"], /* Private Use */
+ ["\uF35A", "\uF35A"], /* Private Use */
+ ["\uF35B", "\uF35B"], /* Private Use */
+ ["\uF35C", "\uF35C"], /* Private Use */
+ ["\uF35D", "\uF35D"], /* Private Use */
+ ["\uF35E", "\uF35E"], /* Private Use */
+ ["\uF35F", "\uF35F"], /* Private Use */
+ ["\uF360", "\uF360"], /* Private Use */
+ ["\uF361", "\uF361"], /* Private Use */
+ ["\uF362", "\uF362"], /* Private Use */
+ ["\uF363", "\uF363"], /* Private Use */
+ ["\uF364", "\uF364"], /* Private Use */
+ ["\uF365", "\uF365"], /* Private Use */
+ ["\uF366", "\uF366"], /* Private Use */
+ ["\uF367", "\uF367"], /* Private Use */
+ ["\uF368", "\uF368"], /* Private Use */
+ ["\uF369", "\uF369"], /* Private Use */
+ ["\uF36A", "\uF36A"], /* Private Use */
+ ["\uF36B", "\uF36B"], /* Private Use */
+ ["\uF36C", "\uF36C"], /* Private Use */
+ ["\uF36D", "\uF36D"], /* Private Use */
+ ["\uF36E", "\uF36E"], /* Private Use */
+ ["\uF36F", "\uF36F"], /* Private Use */
+ ["\uF370", "\uF370"], /* Private Use */
+ ["\uF371", "\uF371"], /* Private Use */
+ ["\uF372", "\uF372"], /* Private Use */
+ ["\uF373", "\uF373"], /* Private Use */
+ ["\uF374", "\uF374"], /* Private Use */
+ ["\uF375", "\uF375"], /* Private Use */
+ ["\uF376", "\uF376"], /* Private Use */
+ ["\uF377", "\uF377"], /* Private Use */
+ ["\uF378", "\uF378"], /* Private Use */
+ ["\uF379", "\uF379"], /* Private Use */
+ ["\uF37A", "\uF37A"], /* Private Use */
+ ["\uF37B", "\uF37B"], /* Private Use */
+ ["\uF37C", "\uF37C"], /* Private Use */
+ ["\uF37D", "\uF37D"], /* Private Use */
+ ["\uF37E", "\uF37E"], /* Private Use */
+ ["\uF37F", "\uF37F"], /* Private Use */
+ ["\uF380", "\uF380"], /* Private Use */
+ ["\uF381", "\uF381"], /* Private Use */
+ ["\uF382", "\uF382"], /* Private Use */
+ ["\uF383", "\uF383"], /* Private Use */
+ ["\uF384", "\uF384"], /* Private Use */
+ ["\uF385", "\uF385"], /* Private Use */
+ ["\uF386", "\uF386"], /* Private Use */
+ ["\uF387", "\uF387"], /* Private Use */
+ ["\uF388", "\uF388"], /* Private Use */
+ ["\uF389", "\uF389"], /* Private Use */
+ ["\uF38A", "\uF38A"], /* Private Use */
+ ["\uF38B", "\uF38B"], /* Private Use */
+ ["\uF38C", "\uF38C"], /* Private Use */
+ ["\uF38D", "\uF38D"], /* Private Use */
+ ["\uF38E", "\uF38E"], /* Private Use */
+ ["\uF38F", "\uF38F"], /* Private Use */
+ ["\uF390", "\uF390"], /* Private Use */
+ ["\uF391", "\uF391"], /* Private Use */
+ ["\uF392", "\uF392"], /* Private Use */
+ ["\uF393", "\uF393"], /* Private Use */
+ ["\uF394", "\uF394"], /* Private Use */
+ ["\uF395", "\uF395"], /* Private Use */
+ ["\uF396", "\uF396"], /* Private Use */
+ ["\uF397", "\uF397"], /* Private Use */
+ ["\uF398", "\uF398"], /* Private Use */
+ ["\uF399", "\uF399"], /* Private Use */
+ ["\uF39A", "\uF39A"], /* Private Use */
+ ["\uF39B", "\uF39B"], /* Private Use */
+ ["\uF39C", "\uF39C"], /* Private Use */
+ ["\uF39D", "\uF39D"], /* Private Use */
+ ["\uF39E", "\uF39E"], /* Private Use */
+ ["\uF39F", "\uF39F"], /* Private Use */
+ ["\uF3A0", "\uF3A0"], /* Private Use */
+ ["\uF3A1", "\uF3A1"], /* Private Use */
+ ["\uF3A2", "\uF3A2"], /* Private Use */
+ ["\uF3A3", "\uF3A3"], /* Private Use */
+ ["\uF3A4", "\uF3A4"], /* Private Use */
+ ["\uF3A5", "\uF3A5"], /* Private Use */
+ ["\uF3A6", "\uF3A6"], /* Private Use */
+ ["\uF3A7", "\uF3A7"], /* Private Use */
+ ["\uF3A8", "\uF3A8"], /* Private Use */
+ ["\uF3A9", "\uF3A9"], /* Private Use */
+ ["\uF3AA", "\uF3AA"], /* Private Use */
+ ["\uF3AB", "\uF3AB"], /* Private Use */
+ ["\uF3AC", "\uF3AC"], /* Private Use */
+ ["\uF3AD", "\uF3AD"], /* Private Use */
+ ["\uF3AE", "\uF3AE"], /* Private Use */
+ ["\uF3AF", "\uF3AF"], /* Private Use */
+ ["\uF3B0", "\uF3B0"], /* Private Use */
+ ["\uF3B1", "\uF3B1"], /* Private Use */
+ ["\uF3B2", "\uF3B2"], /* Private Use */
+ ["\uF3B3", "\uF3B3"], /* Private Use */
+ ["\uF3B4", "\uF3B4"], /* Private Use */
+ ["\uF3B5", "\uF3B5"], /* Private Use */
+ ["\uF3B6", "\uF3B6"], /* Private Use */
+ ["\uF3B7", "\uF3B7"], /* Private Use */
+ ["\uF3B8", "\uF3B8"], /* Private Use */
+ ["\uF3B9", "\uF3B9"], /* Private Use */
+ ["\uF3BA", "\uF3BA"], /* Private Use */
+ ["\uF3BB", "\uF3BB"], /* Private Use */
+ ["\uF3BC", "\uF3BC"], /* Private Use */
+ ["\uF3BD", "\uF3BD"], /* Private Use */
+ ["\uF3BE", "\uF3BE"], /* Private Use */
+ ["\uF3BF", "\uF3BF"], /* Private Use */
+ ["\uF3C0", "\uF3C0"], /* Private Use */
+ ["\uF3C1", "\uF3C1"], /* Private Use */
+ ["\uF3C2", "\uF3C2"], /* Private Use */
+ ["\uF3C3", "\uF3C3"], /* Private Use */
+ ["\uF3C4", "\uF3C4"], /* Private Use */
+ ["\uF3C5", "\uF3C5"], /* Private Use */
+ ["\uF3C6", "\uF3C6"], /* Private Use */
+ ["\uF3C7", "\uF3C7"], /* Private Use */
+ ["\uF3C8", "\uF3C8"], /* Private Use */
+ ["\uF3C9", "\uF3C9"], /* Private Use */
+ ["\uF3CA", "\uF3CA"], /* Private Use */
+ ["\uF3CB", "\uF3CB"], /* Private Use */
+ ["\uF3CC", "\uF3CC"], /* Private Use */
+ ["\uF3CD", "\uF3CD"], /* Private Use */
+ ["\uF3CE", "\uF3CE"], /* Private Use */
+ ["\uF3CF", "\uF3CF"], /* Private Use */
+ ["\uF3D0", "\uF3D0"], /* Private Use */
+ ["\uF3D1", "\uF3D1"], /* Private Use */
+ ["\uF3D2", "\uF3D2"], /* Private Use */
+ ["\uF3D3", "\uF3D3"], /* Private Use */
+ ["\uF3D4", "\uF3D4"], /* Private Use */
+ ["\uF3D5", "\uF3D5"], /* Private Use */
+ ["\uF3D6", "\uF3D6"], /* Private Use */
+ ["\uF3D7", "\uF3D7"], /* Private Use */
+ ["\uF3D8", "\uF3D8"], /* Private Use */
+ ["\uF3D9", "\uF3D9"], /* Private Use */
+ ["\uF3DA", "\uF3DA"], /* Private Use */
+ ["\uF3DB", "\uF3DB"], /* Private Use */
+ ["\uF3DC", "\uF3DC"], /* Private Use */
+ ["\uF3DD", "\uF3DD"], /* Private Use */
+ ["\uF3DE", "\uF3DE"], /* Private Use */
+ ["\uF3DF", "\uF3DF"], /* Private Use */
+ ["\uF3E0", "\uF3E0"], /* Private Use */
+ ["\uF3E1", "\uF3E1"], /* Private Use */
+ ["\uF3E2", "\uF3E2"], /* Private Use */
+ ["\uF3E3", "\uF3E3"], /* Private Use */
+ ["\uF3E4", "\uF3E4"], /* Private Use */
+ ["\uF3E5", "\uF3E5"], /* Private Use */
+ ["\uF3E6", "\uF3E6"], /* Private Use */
+ ["\uF3E7", "\uF3E7"], /* Private Use */
+ ["\uF3E8", "\uF3E8"], /* Private Use */
+ ["\uF3E9", "\uF3E9"], /* Private Use */
+ ["\uF3EA", "\uF3EA"], /* Private Use */
+ ["\uF3EB", "\uF3EB"], /* Private Use */
+ ["\uF3EC", "\uF3EC"], /* Private Use */
+ ["\uF3ED", "\uF3ED"], /* Private Use */
+ ["\uF3EE", "\uF3EE"], /* Private Use */
+ ["\uF3EF", "\uF3EF"], /* Private Use */
+ ["\uF3F0", "\uF3F0"], /* Private Use */
+ ["\uF3F1", "\uF3F1"], /* Private Use */
+ ["\uF3F2", "\uF3F2"], /* Private Use */
+ ["\uF3F3", "\uF3F3"], /* Private Use */
+ ["\uF3F4", "\uF3F4"], /* Private Use */
+ ["\uF3F5", "\uF3F5"], /* Private Use */
+ ["\uF3F6", "\uF3F6"], /* Private Use */
+ ["\uF3F7", "\uF3F7"], /* Private Use */
+ ["\uF3F8", "\uF3F8"], /* Private Use */
+ ["\uF3F9", "\uF3F9"], /* Private Use */
+ ["\uF3FA", "\uF3FA"], /* Private Use */
+ ["\uF3FB", "\uF3FB"], /* Private Use */
+ ["\uF3FC", "\uF3FC"], /* Private Use */
+ ["\uF3FD", "\uF3FD"], /* Private Use */
+ ["\uF3FE", "\uF3FE"], /* Private Use */
+ ["\uF3FF", "\uF3FF"], /* Private Use */
+ ["\uF400", "\uF400"], /* Private Use */
+ ["\uF401", "\uF401"], /* Private Use */
+ ["\uF402", "\uF402"], /* Private Use */
+ ["\uF403", "\uF403"], /* Private Use */
+ ["\uF404", "\uF404"], /* Private Use */
+ ["\uF405", "\uF405"], /* Private Use */
+ ["\uF406", "\uF406"], /* Private Use */
+ ["\uF407", "\uF407"], /* Private Use */
+ ["\uF408", "\uF408"], /* Private Use */
+ ["\uF409", "\uF409"], /* Private Use */
+ ["\uF40A", "\uF40A"], /* Private Use */
+ ["\uF40B", "\uF40B"], /* Private Use */
+ ["\uF40C", "\uF40C"], /* Private Use */
+ ["\uF40D", "\uF40D"], /* Private Use */
+ ["\uF40E", "\uF40E"], /* Private Use */
+ ["\uF40F", "\uF40F"], /* Private Use */
+ ["\uF410", "\uF410"], /* Private Use */
+ ["\uF411", "\uF411"], /* Private Use */
+ ["\uF412", "\uF412"], /* Private Use */
+ ["\uF413", "\uF413"], /* Private Use */
+ ["\uF414", "\uF414"], /* Private Use */
+ ["\uF415", "\uF415"], /* Private Use */
+ ["\uF416", "\uF416"], /* Private Use */
+ ["\uF417", "\uF417"], /* Private Use */
+ ["\uF418", "\uF418"], /* Private Use */
+ ["\uF419", "\uF419"], /* Private Use */
+ ["\uF41A", "\uF41A"], /* Private Use */
+ ["\uF41B", "\uF41B"], /* Private Use */
+ ["\uF41C", "\uF41C"], /* Private Use */
+ ["\uF41D", "\uF41D"], /* Private Use */
+ ["\uF41E", "\uF41E"], /* Private Use */
+ ["\uF41F", "\uF41F"], /* Private Use */
+ ["\uF420", "\uF420"], /* Private Use */
+ ["\uF421", "\uF421"], /* Private Use */
+ ["\uF422", "\uF422"], /* Private Use */
+ ["\uF423", "\uF423"], /* Private Use */
+ ["\uF424", "\uF424"], /* Private Use */
+ ["\uF425", "\uF425"], /* Private Use */
+ ["\uF426", "\uF426"], /* Private Use */
+ ["\uF427", "\uF427"], /* Private Use */
+ ["\uF428", "\uF428"], /* Private Use */
+ ["\uF429", "\uF429"], /* Private Use */
+ ["\uF42A", "\uF42A"], /* Private Use */
+ ["\uF42B", "\uF42B"], /* Private Use */
+ ["\uF42C", "\uF42C"], /* Private Use */
+ ["\uF42D", "\uF42D"], /* Private Use */
+ ["\uF42E", "\uF42E"], /* Private Use */
+ ["\uF42F", "\uF42F"], /* Private Use */
+ ["\uF430", "\uF430"], /* Private Use */
+ ["\uF431", "\uF431"], /* Private Use */
+ ["\uF432", "\uF432"], /* Private Use */
+ ["\uF433", "\uF433"], /* Private Use */
+ ["\uF434", "\uF434"], /* Private Use */
+ ["\uF435", "\uF435"], /* Private Use */
+ ["\uF436", "\uF436"], /* Private Use */
+ ["\uF437", "\uF437"], /* Private Use */
+ ["\uF438", "\uF438"], /* Private Use */
+ ["\uF439", "\uF439"], /* Private Use */
+ ["\uF43A", "\uF43A"], /* Private Use */
+ ["\uF43B", "\uF43B"], /* Private Use */
+ ["\uF43C", "\uF43C"], /* Private Use */
+ ["\uF43D", "\uF43D"], /* Private Use */
+ ["\uF43E", "\uF43E"], /* Private Use */
+ ["\uF43F", "\uF43F"], /* Private Use */
+ ["\uF440", "\uF440"], /* Private Use */
+ ["\uF441", "\uF441"], /* Private Use */
+ ["\uF442", "\uF442"], /* Private Use */
+ ["\uF443", "\uF443"], /* Private Use */
+ ["\uF444", "\uF444"], /* Private Use */
+ ["\uF445", "\uF445"], /* Private Use */
+ ["\uF446", "\uF446"], /* Private Use */
+ ["\uF447", "\uF447"], /* Private Use */
+ ["\uF448", "\uF448"], /* Private Use */
+ ["\uF449", "\uF449"], /* Private Use */
+ ["\uF44A", "\uF44A"], /* Private Use */
+ ["\uF44B", "\uF44B"], /* Private Use */
+ ["\uF44C", "\uF44C"], /* Private Use */
+ ["\uF44D", "\uF44D"], /* Private Use */
+ ["\uF44E", "\uF44E"], /* Private Use */
+ ["\uF44F", "\uF44F"], /* Private Use */
+ ["\uF450", "\uF450"], /* Private Use */
+ ["\uF451", "\uF451"], /* Private Use */
+ ["\uF452", "\uF452"], /* Private Use */
+ ["\uF453", "\uF453"], /* Private Use */
+ ["\uF454", "\uF454"], /* Private Use */
+ ["\uF455", "\uF455"], /* Private Use */
+ ["\uF456", "\uF456"], /* Private Use */
+ ["\uF457", "\uF457"], /* Private Use */
+ ["\uF458", "\uF458"], /* Private Use */
+ ["\uF459", "\uF459"], /* Private Use */
+ ["\uF45A", "\uF45A"], /* Private Use */
+ ["\uF45B", "\uF45B"], /* Private Use */
+ ["\uF45C", "\uF45C"], /* Private Use */
+ ["\uF45D", "\uF45D"], /* Private Use */
+ ["\uF45E", "\uF45E"], /* Private Use */
+ ["\uF45F", "\uF45F"], /* Private Use */
+ ["\uF460", "\uF460"], /* Private Use */
+ ["\uF461", "\uF461"], /* Private Use */
+ ["\uF462", "\uF462"], /* Private Use */
+ ["\uF463", "\uF463"], /* Private Use */
+ ["\uF464", "\uF464"], /* Private Use */
+ ["\uF465", "\uF465"], /* Private Use */
+ ["\uF466", "\uF466"], /* Private Use */
+ ["\uF467", "\uF467"], /* Private Use */
+ ["\uF468", "\uF468"], /* Private Use */
+ ["\uF469", "\uF469"], /* Private Use */
+ ["\uF46A", "\uF46A"], /* Private Use */
+ ["\uF46B", "\uF46B"], /* Private Use */
+ ["\uF46C", "\uF46C"], /* Private Use */
+ ["\uF46D", "\uF46D"], /* Private Use */
+ ["\uF46E", "\uF46E"], /* Private Use */
+ ["\uF46F", "\uF46F"], /* Private Use */
+ ["\uF470", "\uF470"], /* Private Use */
+ ["\uF471", "\uF471"], /* Private Use */
+ ["\uF472", "\uF472"], /* Private Use */
+ ["\uF473", "\uF473"], /* Private Use */
+ ["\uF474", "\uF474"], /* Private Use */
+ ["\uF475", "\uF475"], /* Private Use */
+ ["\uF476", "\uF476"], /* Private Use */
+ ["\uF477", "\uF477"], /* Private Use */
+ ["\uF478", "\uF478"], /* Private Use */
+ ["\uF479", "\uF479"], /* Private Use */
+ ["\uF47A", "\uF47A"], /* Private Use */
+ ["\uF47B", "\uF47B"], /* Private Use */
+ ["\uF47C", "\uF47C"], /* Private Use */
+ ["\uF47D", "\uF47D"], /* Private Use */
+ ["\uF47E", "\uF47E"], /* Private Use */
+ ["\uF47F", "\uF47F"], /* Private Use */
+ ["\uF480", "\uF480"], /* Private Use */
+ ["\uF481", "\uF481"], /* Private Use */
+ ["\uF482", "\uF482"], /* Private Use */
+ ["\uF483", "\uF483"], /* Private Use */
+ ["\uF484", "\uF484"], /* Private Use */
+ ["\uF485", "\uF485"], /* Private Use */
+ ["\uF486", "\uF486"], /* Private Use */
+ ["\uF487", "\uF487"], /* Private Use */
+ ["\uF488", "\uF488"], /* Private Use */
+ ["\uF489", "\uF489"], /* Private Use */
+ ["\uF48A", "\uF48A"], /* Private Use */
+ ["\uF48B", "\uF48B"], /* Private Use */
+ ["\uF48C", "\uF48C"], /* Private Use */
+ ["\uF48D", "\uF48D"], /* Private Use */
+ ["\uF48E", "\uF48E"], /* Private Use */
+ ["\uF48F", "\uF48F"], /* Private Use */
+ ["\uF490", "\uF490"], /* Private Use */
+ ["\uF491", "\uF491"], /* Private Use */
+ ["\uF492", "\uF492"], /* Private Use */
+ ["\uF493", "\uF493"], /* Private Use */
+ ["\uF494", "\uF494"], /* Private Use */
+ ["\uF495", "\uF495"], /* Private Use */
+ ["\uF496", "\uF496"], /* Private Use */
+ ["\uF497", "\uF497"], /* Private Use */
+ ["\uF498", "\uF498"], /* Private Use */
+ ["\uF499", "\uF499"], /* Private Use */
+ ["\uF49A", "\uF49A"], /* Private Use */
+ ["\uF49B", "\uF49B"], /* Private Use */
+ ["\uF49C", "\uF49C"], /* Private Use */
+ ["\uF49D", "\uF49D"], /* Private Use */
+ ["\uF49E", "\uF49E"], /* Private Use */
+ ["\uF49F", "\uF49F"], /* Private Use */
+ ["\uF4A0", "\uF4A0"], /* Private Use */
+ ["\uF4A1", "\uF4A1"], /* Private Use */
+ ["\uF4A2", "\uF4A2"], /* Private Use */
+ ["\uF4A3", "\uF4A3"], /* Private Use */
+ ["\uF4A4", "\uF4A4"], /* Private Use */
+ ["\uF4A5", "\uF4A5"], /* Private Use */
+ ["\uF4A6", "\uF4A6"], /* Private Use */
+ ["\uF4A7", "\uF4A7"], /* Private Use */
+ ["\uF4A8", "\uF4A8"], /* Private Use */
+ ["\uF4A9", "\uF4A9"], /* Private Use */
+ ["\uF4AA", "\uF4AA"], /* Private Use */
+ ["\uF4AB", "\uF4AB"], /* Private Use */
+ ["\uF4AC", "\uF4AC"], /* Private Use */
+ ["\uF4AD", "\uF4AD"], /* Private Use */
+ ["\uF4AE", "\uF4AE"], /* Private Use */
+ ["\uF4AF", "\uF4AF"], /* Private Use */
+ ["\uF4B0", "\uF4B0"], /* Private Use */
+ ["\uF4B1", "\uF4B1"], /* Private Use */
+ ["\uF4B2", "\uF4B2"], /* Private Use */
+ ["\uF4B3", "\uF4B3"], /* Private Use */
+ ["\uF4B4", "\uF4B4"], /* Private Use */
+ ["\uF4B5", "\uF4B5"], /* Private Use */
+ ["\uF4B6", "\uF4B6"], /* Private Use */
+ ["\uF4B7", "\uF4B7"], /* Private Use */
+ ["\uF4B8", "\uF4B8"], /* Private Use */
+ ["\uF4B9", "\uF4B9"], /* Private Use */
+ ["\uF4BA", "\uF4BA"], /* Private Use */
+ ["\uF4BB", "\uF4BB"], /* Private Use */
+ ["\uF4BC", "\uF4BC"], /* Private Use */
+ ["\uF4BD", "\uF4BD"], /* Private Use */
+ ["\uF4BE", "\uF4BE"], /* Private Use */
+ ["\uF4BF", "\uF4BF"], /* Private Use */
+ ["\uF4C0", "\uF4C0"], /* Private Use */
+ ["\uF4C1", "\uF4C1"], /* Private Use */
+ ["\uF4C2", "\uF4C2"], /* Private Use */
+ ["\uF4C3", "\uF4C3"], /* Private Use */
+ ["\uF4C4", "\uF4C4"], /* Private Use */
+ ["\uF4C5", "\uF4C5"], /* Private Use */
+ ["\uF4C6", "\uF4C6"], /* Private Use */
+ ["\uF4C7", "\uF4C7"], /* Private Use */
+ ["\uF4C8", "\uF4C8"], /* Private Use */
+ ["\uF4C9", "\uF4C9"], /* Private Use */
+ ["\uF4CA", "\uF4CA"], /* Private Use */
+ ["\uF4CB", "\uF4CB"], /* Private Use */
+ ["\uF4CC", "\uF4CC"], /* Private Use */
+ ["\uF4CD", "\uF4CD"], /* Private Use */
+ ["\uF4CE", "\uF4CE"], /* Private Use */
+ ["\uF4CF", "\uF4CF"], /* Private Use */
+ ["\uF4D0", "\uF4D0"], /* Private Use */
+ ["\uF4D1", "\uF4D1"], /* Private Use */
+ ["\uF4D2", "\uF4D2"], /* Private Use */
+ ["\uF4D3", "\uF4D3"], /* Private Use */
+ ["\uF4D4", "\uF4D4"], /* Private Use */
+ ["\uF4D5", "\uF4D5"], /* Private Use */
+ ["\uF4D6", "\uF4D6"], /* Private Use */
+ ["\uF4D7", "\uF4D7"], /* Private Use */
+ ["\uF4D8", "\uF4D8"], /* Private Use */
+ ["\uF4D9", "\uF4D9"], /* Private Use */
+ ["\uF4DA", "\uF4DA"], /* Private Use */
+ ["\uF4DB", "\uF4DB"], /* Private Use */
+ ["\uF4DC", "\uF4DC"], /* Private Use */
+ ["\uF4DD", "\uF4DD"], /* Private Use */
+ ["\uF4DE", "\uF4DE"], /* Private Use */
+ ["\uF4DF", "\uF4DF"], /* Private Use */
+ ["\uF4E0", "\uF4E0"], /* Private Use */
+ ["\uF4E1", "\uF4E1"], /* Private Use */
+ ["\uF4E2", "\uF4E2"], /* Private Use */
+ ["\uF4E3", "\uF4E3"], /* Private Use */
+ ["\uF4E4", "\uF4E4"], /* Private Use */
+ ["\uF4E5", "\uF4E5"], /* Private Use */
+ ["\uF4E6", "\uF4E6"], /* Private Use */
+ ["\uF4E7", "\uF4E7"], /* Private Use */
+ ["\uF4E8", "\uF4E8"], /* Private Use */
+ ["\uF4E9", "\uF4E9"], /* Private Use */
+ ["\uF4EA", "\uF4EA"], /* Private Use */
+ ["\uF4EB", "\uF4EB"], /* Private Use */
+ ["\uF4EC", "\uF4EC"], /* Private Use */
+ ["\uF4ED", "\uF4ED"], /* Private Use */
+ ["\uF4EE", "\uF4EE"], /* Private Use */
+ ["\uF4EF", "\uF4EF"], /* Private Use */
+ ["\uF4F0", "\uF4F0"], /* Private Use */
+ ["\uF4F1", "\uF4F1"], /* Private Use */
+ ["\uF4F2", "\uF4F2"], /* Private Use */
+ ["\uF4F3", "\uF4F3"], /* Private Use */
+ ["\uF4F4", "\uF4F4"], /* Private Use */
+ ["\uF4F5", "\uF4F5"], /* Private Use */
+ ["\uF4F6", "\uF4F6"], /* Private Use */
+ ["\uF4F7", "\uF4F7"], /* Private Use */
+ ["\uF4F8", "\uF4F8"], /* Private Use */
+ ["\uF4F9", "\uF4F9"], /* Private Use */
+ ["\uF4FA", "\uF4FA"], /* Private Use */
+ ["\uF4FB", "\uF4FB"], /* Private Use */
+ ["\uF4FC", "\uF4FC"], /* Private Use */
+ ["\uF4FD", "\uF4FD"], /* Private Use */
+ ["\uF4FE", "\uF4FE"], /* Private Use */
+ ["\uF4FF", "\uF4FF"], /* Private Use */
+ ["\uF500", "\uF500"], /* Private Use */
+ ["\uF501", "\uF501"], /* Private Use */
+ ["\uF502", "\uF502"], /* Private Use */
+ ["\uF503", "\uF503"], /* Private Use */
+ ["\uF504", "\uF504"], /* Private Use */
+ ["\uF505", "\uF505"], /* Private Use */
+ ["\uF506", "\uF506"], /* Private Use */
+ ["\uF507", "\uF507"], /* Private Use */
+ ["\uF508", "\uF508"], /* Private Use */
+ ["\uF509", "\uF509"], /* Private Use */
+ ["\uF50A", "\uF50A"], /* Private Use */
+ ["\uF50B", "\uF50B"], /* Private Use */
+ ["\uF50C", "\uF50C"], /* Private Use */
+ ["\uF50D", "\uF50D"], /* Private Use */
+ ["\uF50E", "\uF50E"], /* Private Use */
+ ["\uF50F", "\uF50F"], /* Private Use */
+ ["\uF510", "\uF510"], /* Private Use */
+ ["\uF511", "\uF511"], /* Private Use */
+ ["\uF512", "\uF512"], /* Private Use */
+ ["\uF513", "\uF513"], /* Private Use */
+ ["\uF514", "\uF514"], /* Private Use */
+ ["\uF515", "\uF515"], /* Private Use */
+ ["\uF516", "\uF516"], /* Private Use */
+ ["\uF517", "\uF517"], /* Private Use */
+ ["\uF518", "\uF518"], /* Private Use */
+ ["\uF519", "\uF519"], /* Private Use */
+ ["\uF51A", "\uF51A"], /* Private Use */
+ ["\uF51B", "\uF51B"], /* Private Use */
+ ["\uF51C", "\uF51C"], /* Private Use */
+ ["\uF51D", "\uF51D"], /* Private Use */
+ ["\uF51E", "\uF51E"], /* Private Use */
+ ["\uF51F", "\uF51F"], /* Private Use */
+ ["\uF520", "\uF520"], /* Private Use */
+ ["\uF521", "\uF521"], /* Private Use */
+ ["\uF522", "\uF522"], /* Private Use */
+ ["\uF523", "\uF523"], /* Private Use */
+ ["\uF524", "\uF524"], /* Private Use */
+ ["\uF525", "\uF525"], /* Private Use */
+ ["\uF526", "\uF526"], /* Private Use */
+ ["\uF527", "\uF527"], /* Private Use */
+ ["\uF528", "\uF528"], /* Private Use */
+ ["\uF529", "\uF529"], /* Private Use */
+ ["\uF52A", "\uF52A"], /* Private Use */
+ ["\uF52B", "\uF52B"], /* Private Use */
+ ["\uF52C", "\uF52C"], /* Private Use */
+ ["\uF52D", "\uF52D"], /* Private Use */
+ ["\uF52E", "\uF52E"], /* Private Use */
+ ["\uF52F", "\uF52F"], /* Private Use */
+ ["\uF530", "\uF530"], /* Private Use */
+ ["\uF531", "\uF531"], /* Private Use */
+ ["\uF532", "\uF532"], /* Private Use */
+ ["\uF533", "\uF533"], /* Private Use */
+ ["\uF534", "\uF534"], /* Private Use */
+ ["\uF535", "\uF535"], /* Private Use */
+ ["\uF536", "\uF536"], /* Private Use */
+ ["\uF537", "\uF537"], /* Private Use */
+ ["\uF538", "\uF538"], /* Private Use */
+ ["\uF539", "\uF539"], /* Private Use */
+ ["\uF53A", "\uF53A"], /* Private Use */
+ ["\uF53B", "\uF53B"], /* Private Use */
+ ["\uF53C", "\uF53C"], /* Private Use */
+ ["\uF53D", "\uF53D"], /* Private Use */
+ ["\uF53E", "\uF53E"], /* Private Use */
+ ["\uF53F", "\uF53F"], /* Private Use */
+ ["\uF540", "\uF540"], /* Private Use */
+ ["\uF541", "\uF541"], /* Private Use */
+ ["\uF542", "\uF542"], /* Private Use */
+ ["\uF543", "\uF543"], /* Private Use */
+ ["\uF544", "\uF544"], /* Private Use */
+ ["\uF545", "\uF545"], /* Private Use */
+ ["\uF546", "\uF546"], /* Private Use */
+ ["\uF547", "\uF547"], /* Private Use */
+ ["\uF548", "\uF548"], /* Private Use */
+ ["\uF549", "\uF549"], /* Private Use */
+ ["\uF54A", "\uF54A"], /* Private Use */
+ ["\uF54B", "\uF54B"], /* Private Use */
+ ["\uF54C", "\uF54C"], /* Private Use */
+ ["\uF54D", "\uF54D"], /* Private Use */
+ ["\uF54E", "\uF54E"], /* Private Use */
+ ["\uF54F", "\uF54F"], /* Private Use */
+ ["\uF550", "\uF550"], /* Private Use */
+ ["\uF551", "\uF551"], /* Private Use */
+ ["\uF552", "\uF552"], /* Private Use */
+ ["\uF553", "\uF553"], /* Private Use */
+ ["\uF554", "\uF554"], /* Private Use */
+ ["\uF555", "\uF555"], /* Private Use */
+ ["\uF556", "\uF556"], /* Private Use */
+ ["\uF557", "\uF557"], /* Private Use */
+ ["\uF558", "\uF558"], /* Private Use */
+ ["\uF559", "\uF559"], /* Private Use */
+ ["\uF55A", "\uF55A"], /* Private Use */
+ ["\uF55B", "\uF55B"], /* Private Use */
+ ["\uF55C", "\uF55C"], /* Private Use */
+ ["\uF55D", "\uF55D"], /* Private Use */
+ ["\uF55E", "\uF55E"], /* Private Use */
+ ["\uF55F", "\uF55F"], /* Private Use */
+ ["\uF560", "\uF560"], /* Private Use */
+ ["\uF561", "\uF561"], /* Private Use */
+ ["\uF562", "\uF562"], /* Private Use */
+ ["\uF563", "\uF563"], /* Private Use */
+ ["\uF564", "\uF564"], /* Private Use */
+ ["\uF565", "\uF565"], /* Private Use */
+ ["\uF566", "\uF566"], /* Private Use */
+ ["\uF567", "\uF567"], /* Private Use */
+ ["\uF568", "\uF568"], /* Private Use */
+ ["\uF569", "\uF569"], /* Private Use */
+ ["\uF56A", "\uF56A"], /* Private Use */
+ ["\uF56B", "\uF56B"], /* Private Use */
+ ["\uF56C", "\uF56C"], /* Private Use */
+ ["\uF56D", "\uF56D"], /* Private Use */
+ ["\uF56E", "\uF56E"], /* Private Use */
+ ["\uF56F", "\uF56F"], /* Private Use */
+ ["\uF570", "\uF570"], /* Private Use */
+ ["\uF571", "\uF571"], /* Private Use */
+ ["\uF572", "\uF572"], /* Private Use */
+ ["\uF573", "\uF573"], /* Private Use */
+ ["\uF574", "\uF574"], /* Private Use */
+ ["\uF575", "\uF575"], /* Private Use */
+ ["\uF576", "\uF576"], /* Private Use */
+ ["\uF577", "\uF577"], /* Private Use */
+ ["\uF578", "\uF578"], /* Private Use */
+ ["\uF579", "\uF579"], /* Private Use */
+ ["\uF57A", "\uF57A"], /* Private Use */
+ ["\uF57B", "\uF57B"], /* Private Use */
+ ["\uF57C", "\uF57C"], /* Private Use */
+ ["\uF57D", "\uF57D"], /* Private Use */
+ ["\uF57E", "\uF57E"], /* Private Use */
+ ["\uF57F", "\uF57F"], /* Private Use */
+ ["\uF580", "\uF580"], /* Private Use */
+ ["\uF581", "\uF581"], /* Private Use */
+ ["\uF582", "\uF582"], /* Private Use */
+ ["\uF583", "\uF583"], /* Private Use */
+ ["\uF584", "\uF584"], /* Private Use */
+ ["\uF585", "\uF585"], /* Private Use */
+ ["\uF586", "\uF586"], /* Private Use */
+ ["\uF587", "\uF587"], /* Private Use */
+ ["\uF588", "\uF588"], /* Private Use */
+ ["\uF589", "\uF589"], /* Private Use */
+ ["\uF58A", "\uF58A"], /* Private Use */
+ ["\uF58B", "\uF58B"], /* Private Use */
+ ["\uF58C", "\uF58C"], /* Private Use */
+ ["\uF58D", "\uF58D"], /* Private Use */
+ ["\uF58E", "\uF58E"], /* Private Use */
+ ["\uF58F", "\uF58F"], /* Private Use */
+ ["\uF590", "\uF590"], /* Private Use */
+ ["\uF591", "\uF591"], /* Private Use */
+ ["\uF592", "\uF592"], /* Private Use */
+ ["\uF593", "\uF593"], /* Private Use */
+ ["\uF594", "\uF594"], /* Private Use */
+ ["\uF595", "\uF595"], /* Private Use */
+ ["\uF596", "\uF596"], /* Private Use */
+ ["\uF597", "\uF597"], /* Private Use */
+ ["\uF598", "\uF598"], /* Private Use */
+ ["\uF599", "\uF599"], /* Private Use */
+ ["\uF59A", "\uF59A"], /* Private Use */
+ ["\uF59B", "\uF59B"], /* Private Use */
+ ["\uF59C", "\uF59C"], /* Private Use */
+ ["\uF59D", "\uF59D"], /* Private Use */
+ ["\uF59E", "\uF59E"], /* Private Use */
+ ["\uF59F", "\uF59F"], /* Private Use */
+ ["\uF5A0", "\uF5A0"], /* Private Use */
+ ["\uF5A1", "\uF5A1"], /* Private Use */
+ ["\uF5A2", "\uF5A2"], /* Private Use */
+ ["\uF5A3", "\uF5A3"], /* Private Use */
+ ["\uF5A4", "\uF5A4"], /* Private Use */
+ ["\uF5A5", "\uF5A5"], /* Private Use */
+ ["\uF5A6", "\uF5A6"], /* Private Use */
+ ["\uF5A7", "\uF5A7"], /* Private Use */
+ ["\uF5A8", "\uF5A8"], /* Private Use */
+ ["\uF5A9", "\uF5A9"], /* Private Use */
+ ["\uF5AA", "\uF5AA"], /* Private Use */
+ ["\uF5AB", "\uF5AB"], /* Private Use */
+ ["\uF5AC", "\uF5AC"], /* Private Use */
+ ["\uF5AD", "\uF5AD"], /* Private Use */
+ ["\uF5AE", "\uF5AE"], /* Private Use */
+ ["\uF5AF", "\uF5AF"], /* Private Use */
+ ["\uF5B0", "\uF5B0"], /* Private Use */
+ ["\uF5B1", "\uF5B1"], /* Private Use */
+ ["\uF5B2", "\uF5B2"], /* Private Use */
+ ["\uF5B3", "\uF5B3"], /* Private Use */
+ ["\uF5B4", "\uF5B4"], /* Private Use */
+ ["\uF5B5", "\uF5B5"], /* Private Use */
+ ["\uF5B6", "\uF5B6"], /* Private Use */
+ ["\uF5B7", "\uF5B7"], /* Private Use */
+ ["\uF5B8", "\uF5B8"], /* Private Use */
+ ["\uF5B9", "\uF5B9"], /* Private Use */
+ ["\uF5BA", "\uF5BA"], /* Private Use */
+ ["\uF5BB", "\uF5BB"], /* Private Use */
+ ["\uF5BC", "\uF5BC"], /* Private Use */
+ ["\uF5BD", "\uF5BD"], /* Private Use */
+ ["\uF5BE", "\uF5BE"], /* Private Use */
+ ["\uF5BF", "\uF5BF"], /* Private Use */
+ ["\uF5C0", "\uF5C0"], /* Private Use */
+ ["\uF5C1", "\uF5C1"], /* Private Use */
+ ["\uF5C2", "\uF5C2"], /* Private Use */
+ ["\uF5C3", "\uF5C3"], /* Private Use */
+ ["\uF5C4", "\uF5C4"], /* Private Use */
+ ["\uF5C5", "\uF5C5"], /* Private Use */
+ ["\uF5C6", "\uF5C6"], /* Private Use */
+ ["\uF5C7", "\uF5C7"], /* Private Use */
+ ["\uF5C8", "\uF5C8"], /* Private Use */
+ ["\uF5C9", "\uF5C9"], /* Private Use */
+ ["\uF5CA", "\uF5CA"], /* Private Use */
+ ["\uF5CB", "\uF5CB"], /* Private Use */
+ ["\uF5CC", "\uF5CC"], /* Private Use */
+ ["\uF5CD", "\uF5CD"], /* Private Use */
+ ["\uF5CE", "\uF5CE"], /* Private Use */
+ ["\uF5CF", "\uF5CF"], /* Private Use */
+ ["\uF5D0", "\uF5D0"], /* Private Use */
+ ["\uF5D1", "\uF5D1"], /* Private Use */
+ ["\uF5D2", "\uF5D2"], /* Private Use */
+ ["\uF5D3", "\uF5D3"], /* Private Use */
+ ["\uF5D4", "\uF5D4"], /* Private Use */
+ ["\uF5D5", "\uF5D5"], /* Private Use */
+ ["\uF5D6", "\uF5D6"], /* Private Use */
+ ["\uF5D7", "\uF5D7"], /* Private Use */
+ ["\uF5D8", "\uF5D8"], /* Private Use */
+ ["\uF5D9", "\uF5D9"], /* Private Use */
+ ["\uF5DA", "\uF5DA"], /* Private Use */
+ ["\uF5DB", "\uF5DB"], /* Private Use */
+ ["\uF5DC", "\uF5DC"], /* Private Use */
+ ["\uF5DD", "\uF5DD"], /* Private Use */
+ ["\uF5DE", "\uF5DE"], /* Private Use */
+ ["\uF5DF", "\uF5DF"], /* Private Use */
+ ["\uF5E0", "\uF5E0"], /* Private Use */
+ ["\uF5E1", "\uF5E1"], /* Private Use */
+ ["\uF5E2", "\uF5E2"], /* Private Use */
+ ["\uF5E3", "\uF5E3"], /* Private Use */
+ ["\uF5E4", "\uF5E4"], /* Private Use */
+ ["\uF5E5", "\uF5E5"], /* Private Use */
+ ["\uF5E6", "\uF5E6"], /* Private Use */
+ ["\uF5E7", "\uF5E7"], /* Private Use */
+ ["\uF5E8", "\uF5E8"], /* Private Use */
+ ["\uF5E9", "\uF5E9"], /* Private Use */
+ ["\uF5EA", "\uF5EA"], /* Private Use */
+ ["\uF5EB", "\uF5EB"], /* Private Use */
+ ["\uF5EC", "\uF5EC"], /* Private Use */
+ ["\uF5ED", "\uF5ED"], /* Private Use */
+ ["\uF5EE", "\uF5EE"], /* Private Use */
+ ["\uF5EF", "\uF5EF"], /* Private Use */
+ ["\uF5F0", "\uF5F0"], /* Private Use */
+ ["\uF5F1", "\uF5F1"], /* Private Use */
+ ["\uF5F2", "\uF5F2"], /* Private Use */
+ ["\uF5F3", "\uF5F3"], /* Private Use */
+ ["\uF5F4", "\uF5F4"], /* Private Use */
+ ["\uF5F5", "\uF5F5"], /* Private Use */
+ ["\uF5F6", "\uF5F6"], /* Private Use */
+ ["\uF5F7", "\uF5F7"], /* Private Use */
+ ["\uF5F8", "\uF5F8"], /* Private Use */
+ ["\uF5F9", "\uF5F9"], /* Private Use */
+ ["\uF5FA", "\uF5FA"], /* Private Use */
+ ["\uF5FB", "\uF5FB"], /* Private Use */
+ ["\uF5FC", "\uF5FC"], /* Private Use */
+ ["\uF5FD", "\uF5FD"], /* Private Use */
+ ["\uF5FE", "\uF5FE"], /* Private Use */
+ ["\uF5FF", "\uF5FF"], /* Private Use */
+ ["\uF600", "\uF600"], /* Private Use */
+ ["\uF601", "\uF601"], /* Private Use */
+ ["\uF602", "\uF602"], /* Private Use */
+ ["\uF603", "\uF603"], /* Private Use */
+ ["\uF604", "\uF604"], /* Private Use */
+ ["\uF605", "\uF605"], /* Private Use */
+ ["\uF606", "\uF606"], /* Private Use */
+ ["\uF607", "\uF607"], /* Private Use */
+ ["\uF608", "\uF608"], /* Private Use */
+ ["\uF609", "\uF609"], /* Private Use */
+ ["\uF60A", "\uF60A"], /* Private Use */
+ ["\uF60B", "\uF60B"], /* Private Use */
+ ["\uF60C", "\uF60C"], /* Private Use */
+ ["\uF60D", "\uF60D"], /* Private Use */
+ ["\uF60E", "\uF60E"], /* Private Use */
+ ["\uF60F", "\uF60F"], /* Private Use */
+ ["\uF610", "\uF610"], /* Private Use */
+ ["\uF611", "\uF611"], /* Private Use */
+ ["\uF612", "\uF612"], /* Private Use */
+ ["\uF613", "\uF613"], /* Private Use */
+ ["\uF614", "\uF614"], /* Private Use */
+ ["\uF615", "\uF615"], /* Private Use */
+ ["\uF616", "\uF616"], /* Private Use */
+ ["\uF617", "\uF617"], /* Private Use */
+ ["\uF618", "\uF618"], /* Private Use */
+ ["\uF619", "\uF619"], /* Private Use */
+ ["\uF61A", "\uF61A"], /* Private Use */
+ ["\uF61B", "\uF61B"], /* Private Use */
+ ["\uF61C", "\uF61C"], /* Private Use */
+ ["\uF61D", "\uF61D"], /* Private Use */
+ ["\uF61E", "\uF61E"], /* Private Use */
+ ["\uF61F", "\uF61F"], /* Private Use */
+ ["\uF620", "\uF620"], /* Private Use */
+ ["\uF621", "\uF621"], /* Private Use */
+ ["\uF622", "\uF622"], /* Private Use */
+ ["\uF623", "\uF623"], /* Private Use */
+ ["\uF624", "\uF624"], /* Private Use */
+ ["\uF625", "\uF625"], /* Private Use */
+ ["\uF626", "\uF626"], /* Private Use */
+ ["\uF627", "\uF627"], /* Private Use */
+ ["\uF628", "\uF628"], /* Private Use */
+ ["\uF629", "\uF629"], /* Private Use */
+ ["\uF62A", "\uF62A"], /* Private Use */
+ ["\uF62B", "\uF62B"], /* Private Use */
+ ["\uF62C", "\uF62C"], /* Private Use */
+ ["\uF62D", "\uF62D"], /* Private Use */
+ ["\uF62E", "\uF62E"], /* Private Use */
+ ["\uF62F", "\uF62F"], /* Private Use */
+ ["\uF630", "\uF630"], /* Private Use */
+ ["\uF631", "\uF631"], /* Private Use */
+ ["\uF632", "\uF632"], /* Private Use */
+ ["\uF633", "\uF633"], /* Private Use */
+ ["\uF634", "\uF634"], /* Private Use */
+ ["\uF635", "\uF635"], /* Private Use */
+ ["\uF636", "\uF636"], /* Private Use */
+ ["\uF637", "\uF637"], /* Private Use */
+ ["\uF638", "\uF638"], /* Private Use */
+ ["\uF639", "\uF639"], /* Private Use */
+ ["\uF63A", "\uF63A"], /* Private Use */
+ ["\uF63B", "\uF63B"], /* Private Use */
+ ["\uF63C", "\uF63C"], /* Private Use */
+ ["\uF63D", "\uF63D"], /* Private Use */
+ ["\uF63E", "\uF63E"], /* Private Use */
+ ["\uF63F", "\uF63F"], /* Private Use */
+ ["\uF640", "\uF640"], /* Private Use */
+ ["\uF641", "\uF641"], /* Private Use */
+ ["\uF642", "\uF642"], /* Private Use */
+ ["\uF643", "\uF643"], /* Private Use */
+ ["\uF644", "\uF644"], /* Private Use */
+ ["\uF645", "\uF645"], /* Private Use */
+ ["\uF646", "\uF646"], /* Private Use */
+ ["\uF647", "\uF647"], /* Private Use */
+ ["\uF648", "\uF648"], /* Private Use */
+ ["\uF649", "\uF649"], /* Private Use */
+ ["\uF64A", "\uF64A"], /* Private Use */
+ ["\uF64B", "\uF64B"], /* Private Use */
+ ["\uF64C", "\uF64C"], /* Private Use */
+ ["\uF64D", "\uF64D"], /* Private Use */
+ ["\uF64E", "\uF64E"], /* Private Use */
+ ["\uF64F", "\uF64F"], /* Private Use */
+ ["\uF650", "\uF650"], /* Private Use */
+ ["\uF651", "\uF651"], /* Private Use */
+ ["\uF652", "\uF652"], /* Private Use */
+ ["\uF653", "\uF653"], /* Private Use */
+ ["\uF654", "\uF654"], /* Private Use */
+ ["\uF655", "\uF655"], /* Private Use */
+ ["\uF656", "\uF656"], /* Private Use */
+ ["\uF657", "\uF657"], /* Private Use */
+ ["\uF658", "\uF658"], /* Private Use */
+ ["\uF659", "\uF659"], /* Private Use */
+ ["\uF65A", "\uF65A"], /* Private Use */
+ ["\uF65B", "\uF65B"], /* Private Use */
+ ["\uF65C", "\uF65C"], /* Private Use */
+ ["\uF65D", "\uF65D"], /* Private Use */
+ ["\uF65E", "\uF65E"], /* Private Use */
+ ["\uF65F", "\uF65F"], /* Private Use */
+ ["\uF660", "\uF660"], /* Private Use */
+ ["\uF661", "\uF661"], /* Private Use */
+ ["\uF662", "\uF662"], /* Private Use */
+ ["\uF663", "\uF663"], /* Private Use */
+ ["\uF664", "\uF664"], /* Private Use */
+ ["\uF665", "\uF665"], /* Private Use */
+ ["\uF666", "\uF666"], /* Private Use */
+ ["\uF667", "\uF667"], /* Private Use */
+ ["\uF668", "\uF668"], /* Private Use */
+ ["\uF669", "\uF669"], /* Private Use */
+ ["\uF66A", "\uF66A"], /* Private Use */
+ ["\uF66B", "\uF66B"], /* Private Use */
+ ["\uF66C", "\uF66C"], /* Private Use */
+ ["\uF66D", "\uF66D"], /* Private Use */
+ ["\uF66E", "\uF66E"], /* Private Use */
+ ["\uF66F", "\uF66F"], /* Private Use */
+ ["\uF670", "\uF670"], /* Private Use */
+ ["\uF671", "\uF671"], /* Private Use */
+ ["\uF672", "\uF672"], /* Private Use */
+ ["\uF673", "\uF673"], /* Private Use */
+ ["\uF674", "\uF674"], /* Private Use */
+ ["\uF675", "\uF675"], /* Private Use */
+ ["\uF676", "\uF676"], /* Private Use */
+ ["\uF677", "\uF677"], /* Private Use */
+ ["\uF678", "\uF678"], /* Private Use */
+ ["\uF679", "\uF679"], /* Private Use */
+ ["\uF67A", "\uF67A"], /* Private Use */
+ ["\uF67B", "\uF67B"], /* Private Use */
+ ["\uF67C", "\uF67C"], /* Private Use */
+ ["\uF67D", "\uF67D"], /* Private Use */
+ ["\uF67E", "\uF67E"], /* Private Use */
+ ["\uF67F", "\uF67F"], /* Private Use */
+ ["\uF680", "\uF680"], /* Private Use */
+ ["\uF681", "\uF681"], /* Private Use */
+ ["\uF682", "\uF682"], /* Private Use */
+ ["\uF683", "\uF683"], /* Private Use */
+ ["\uF684", "\uF684"], /* Private Use */
+ ["\uF685", "\uF685"], /* Private Use */
+ ["\uF686", "\uF686"], /* Private Use */
+ ["\uF687", "\uF687"], /* Private Use */
+ ["\uF688", "\uF688"], /* Private Use */
+ ["\uF689", "\uF689"], /* Private Use */
+ ["\uF68A", "\uF68A"], /* Private Use */
+ ["\uF68B", "\uF68B"], /* Private Use */
+ ["\uF68C", "\uF68C"], /* Private Use */
+ ["\uF68D", "\uF68D"], /* Private Use */
+ ["\uF68E", "\uF68E"], /* Private Use */
+ ["\uF68F", "\uF68F"], /* Private Use */
+ ["\uF690", "\uF690"], /* Private Use */
+ ["\uF691", "\uF691"], /* Private Use */
+ ["\uF692", "\uF692"], /* Private Use */
+ ["\uF693", "\uF693"], /* Private Use */
+ ["\uF694", "\uF694"], /* Private Use */
+ ["\uF695", "\uF695"], /* Private Use */
+ ["\uF696", "\uF696"], /* Private Use */
+ ["\uF697", "\uF697"], /* Private Use */
+ ["\uF698", "\uF698"], /* Private Use */
+ ["\uF699", "\uF699"], /* Private Use */
+ ["\uF69A", "\uF69A"], /* Private Use */
+ ["\uF69B", "\uF69B"], /* Private Use */
+ ["\uF69C", "\uF69C"], /* Private Use */
+ ["\uF69D", "\uF69D"], /* Private Use */
+ ["\uF69E", "\uF69E"], /* Private Use */
+ ["\uF69F", "\uF69F"], /* Private Use */
+ ["\uF6A0", "\uF6A0"], /* Private Use */
+ ["\uF6A1", "\uF6A1"], /* Private Use */
+ ["\uF6A2", "\uF6A2"], /* Private Use */
+ ["\uF6A3", "\uF6A3"], /* Private Use */
+ ["\uF6A4", "\uF6A4"], /* Private Use */
+ ["\uF6A5", "\uF6A5"], /* Private Use */
+ ["\uF6A6", "\uF6A6"], /* Private Use */
+ ["\uF6A7", "\uF6A7"], /* Private Use */
+ ["\uF6A8", "\uF6A8"], /* Private Use */
+ ["\uF6A9", "\uF6A9"], /* Private Use */
+ ["\uF6AA", "\uF6AA"], /* Private Use */
+ ["\uF6AB", "\uF6AB"], /* Private Use */
+ ["\uF6AC", "\uF6AC"], /* Private Use */
+ ["\uF6AD", "\uF6AD"], /* Private Use */
+ ["\uF6AE", "\uF6AE"], /* Private Use */
+ ["\uF6AF", "\uF6AF"], /* Private Use */
+ ["\uF6B0", "\uF6B0"], /* Private Use */
+ ["\uF6B1", "\uF6B1"], /* Private Use */
+ ["\uF6B2", "\uF6B2"], /* Private Use */
+ ["\uF6B3", "\uF6B3"], /* Private Use */
+ ["\uF6B4", "\uF6B4"], /* Private Use */
+ ["\uF6B5", "\uF6B5"], /* Private Use */
+ ["\uF6B6", "\uF6B6"], /* Private Use */
+ ["\uF6B7", "\uF6B7"], /* Private Use */
+ ["\uF6B8", "\uF6B8"], /* Private Use */
+ ["\uF6B9", "\uF6B9"], /* Private Use */
+ ["\uF6BA", "\uF6BA"], /* Private Use */
+ ["\uF6BB", "\uF6BB"], /* Private Use */
+ ["\uF6BC", "\uF6BC"], /* Private Use */
+ ["\uF6BD", "\uF6BD"], /* Private Use */
+ ["\uF6BE", "\uF6BE"], /* Private Use */
+ ["\uF6BF", "\uF6BF"], /* Private Use */
+ ["\uF6C0", "\uF6C0"], /* Private Use */
+ ["\uF6C1", "\uF6C1"], /* Private Use */
+ ["\uF6C2", "\uF6C2"], /* Private Use */
+ ["\uF6C3", "\uF6C3"], /* Private Use */
+ ["\uF6C4", "\uF6C4"], /* Private Use */
+ ["\uF6C5", "\uF6C5"], /* Private Use */
+ ["\uF6C6", "\uF6C6"], /* Private Use */
+ ["\uF6C7", "\uF6C7"], /* Private Use */
+ ["\uF6C8", "\uF6C8"], /* Private Use */
+ ["\uF6C9", "\uF6C9"], /* Private Use */
+ ["\uF6CA", "\uF6CA"], /* Private Use */
+ ["\uF6CB", "\uF6CB"], /* Private Use */
+ ["\uF6CC", "\uF6CC"], /* Private Use */
+ ["\uF6CD", "\uF6CD"], /* Private Use */
+ ["\uF6CE", "\uF6CE"], /* Private Use */
+ ["\uF6CF", "\uF6CF"], /* Private Use */
+ ["\uF6D0", "\uF6D0"], /* Private Use */
+ ["\uF6D1", "\uF6D1"], /* Private Use */
+ ["\uF6D2", "\uF6D2"], /* Private Use */
+ ["\uF6D3", "\uF6D3"], /* Private Use */
+ ["\uF6D4", "\uF6D4"], /* Private Use */
+ ["\uF6D5", "\uF6D5"], /* Private Use */
+ ["\uF6D6", "\uF6D6"], /* Private Use */
+ ["\uF6D7", "\uF6D7"], /* Private Use */
+ ["\uF6D8", "\uF6D8"], /* Private Use */
+ ["\uF6D9", "\uF6D9"], /* Private Use */
+ ["\uF6DA", "\uF6DA"], /* Private Use */
+ ["\uF6DB", "\uF6DB"], /* Private Use */
+ ["\uF6DC", "\uF6DC"], /* Private Use */
+ ["\uF6DD", "\uF6DD"], /* Private Use */
+ ["\uF6DE", "\uF6DE"], /* Private Use */
+ ["\uF6DF", "\uF6DF"], /* Private Use */
+ ["\uF6E0", "\uF6E0"], /* Private Use */
+ ["\uF6E1", "\uF6E1"], /* Private Use */
+ ["\uF6E2", "\uF6E2"], /* Private Use */
+ ["\uF6E3", "\uF6E3"], /* Private Use */
+ ["\uF6E4", "\uF6E4"], /* Private Use */
+ ["\uF6E5", "\uF6E5"], /* Private Use */
+ ["\uF6E6", "\uF6E6"], /* Private Use */
+ ["\uF6E7", "\uF6E7"], /* Private Use */
+ ["\uF6E8", "\uF6E8"], /* Private Use */
+ ["\uF6E9", "\uF6E9"], /* Private Use */
+ ["\uF6EA", "\uF6EA"], /* Private Use */
+ ["\uF6EB", "\uF6EB"], /* Private Use */
+ ["\uF6EC", "\uF6EC"], /* Private Use */
+ ["\uF6ED", "\uF6ED"], /* Private Use */
+ ["\uF6EE", "\uF6EE"], /* Private Use */
+ ["\uF6EF", "\uF6EF"], /* Private Use */
+ ["\uF6F0", "\uF6F0"], /* Private Use */
+ ["\uF6F1", "\uF6F1"], /* Private Use */
+ ["\uF6F2", "\uF6F2"], /* Private Use */
+ ["\uF6F3", "\uF6F3"], /* Private Use */
+ ["\uF6F4", "\uF6F4"], /* Private Use */
+ ["\uF6F5", "\uF6F5"], /* Private Use */
+ ["\uF6F6", "\uF6F6"], /* Private Use */
+ ["\uF6F7", "\uF6F7"], /* Private Use */
+ ["\uF6F8", "\uF6F8"], /* Private Use */
+ ["\uF6F9", "\uF6F9"], /* Private Use */
+ ["\uF6FA", "\uF6FA"], /* Private Use */
+ ["\uF6FB", "\uF6FB"], /* Private Use */
+ ["\uF6FC", "\uF6FC"], /* Private Use */
+ ["\uF6FD", "\uF6FD"], /* Private Use */
+ ["\uF6FE", "\uF6FE"], /* Private Use */
+ ["\uF6FF", "\uF6FF"], /* Private Use */
+ ["\uF700", "\uF700"], /* Private Use */
+ ["\uF701", "\uF701"], /* Private Use */
+ ["\uF702", "\uF702"], /* Private Use */
+ ["\uF703", "\uF703"], /* Private Use */
+ ["\uF704", "\uF704"], /* Private Use */
+ ["\uF705", "\uF705"], /* Private Use */
+ ["\uF706", "\uF706"], /* Private Use */
+ ["\uF707", "\uF707"], /* Private Use */
+ ["\uF708", "\uF708"], /* Private Use */
+ ["\uF709", "\uF709"], /* Private Use */
+ ["\uF70A", "\uF70A"], /* Private Use */
+ ["\uF70B", "\uF70B"], /* Private Use */
+ ["\uF70C", "\uF70C"], /* Private Use */
+ ["\uF70D", "\uF70D"], /* Private Use */
+ ["\uF70E", "\uF70E"], /* Private Use */
+ ["\uF70F", "\uF70F"], /* Private Use */
+ ["\uF710", "\uF710"], /* Private Use */
+ ["\uF711", "\uF711"], /* Private Use */
+ ["\uF712", "\uF712"], /* Private Use */
+ ["\uF713", "\uF713"], /* Private Use */
+ ["\uF714", "\uF714"], /* Private Use */
+ ["\uF715", "\uF715"], /* Private Use */
+ ["\uF716", "\uF716"], /* Private Use */
+ ["\uF717", "\uF717"], /* Private Use */
+ ["\uF718", "\uF718"], /* Private Use */
+ ["\uF719", "\uF719"], /* Private Use */
+ ["\uF71A", "\uF71A"], /* Private Use */
+ ["\uF71B", "\uF71B"], /* Private Use */
+ ["\uF71C", "\uF71C"], /* Private Use */
+ ["\uF71D", "\uF71D"], /* Private Use */
+ ["\uF71E", "\uF71E"], /* Private Use */
+ ["\uF71F", "\uF71F"], /* Private Use */
+ ["\uF720", "\uF720"], /* Private Use */
+ ["\uF721", "\uF721"], /* Private Use */
+ ["\uF722", "\uF722"], /* Private Use */
+ ["\uF723", "\uF723"], /* Private Use */
+ ["\uF724", "\uF724"], /* Private Use */
+ ["\uF725", "\uF725"], /* Private Use */
+ ["\uF726", "\uF726"], /* Private Use */
+ ["\uF727", "\uF727"], /* Private Use */
+ ["\uF728", "\uF728"], /* Private Use */
+ ["\uF729", "\uF729"], /* Private Use */
+ ["\uF72A", "\uF72A"], /* Private Use */
+ ["\uF72B", "\uF72B"], /* Private Use */
+ ["\uF72C", "\uF72C"], /* Private Use */
+ ["\uF72D", "\uF72D"], /* Private Use */
+ ["\uF72E", "\uF72E"], /* Private Use */
+ ["\uF72F", "\uF72F"], /* Private Use */
+ ["\uF730", "\uF730"], /* Private Use */
+ ["\uF731", "\uF731"], /* Private Use */
+ ["\uF732", "\uF732"], /* Private Use */
+ ["\uF733", "\uF733"], /* Private Use */
+ ["\uF734", "\uF734"], /* Private Use */
+ ["\uF735", "\uF735"], /* Private Use */
+ ["\uF736", "\uF736"], /* Private Use */
+ ["\uF737", "\uF737"], /* Private Use */
+ ["\uF738", "\uF738"], /* Private Use */
+ ["\uF739", "\uF739"], /* Private Use */
+ ["\uF73A", "\uF73A"], /* Private Use */
+ ["\uF73B", "\uF73B"], /* Private Use */
+ ["\uF73C", "\uF73C"], /* Private Use */
+ ["\uF73D", "\uF73D"], /* Private Use */
+ ["\uF73E", "\uF73E"], /* Private Use */
+ ["\uF73F", "\uF73F"], /* Private Use */
+ ["\uF740", "\uF740"], /* Private Use */
+ ["\uF741", "\uF741"], /* Private Use */
+ ["\uF742", "\uF742"], /* Private Use */
+ ["\uF743", "\uF743"], /* Private Use */
+ ["\uF744", "\uF744"], /* Private Use */
+ ["\uF745", "\uF745"], /* Private Use */
+ ["\uF746", "\uF746"], /* Private Use */
+ ["\uF747", "\uF747"], /* Private Use */
+ ["\uF748", "\uF748"], /* Private Use */
+ ["\uF749", "\uF749"], /* Private Use */
+ ["\uF74A", "\uF74A"], /* Private Use */
+ ["\uF74B", "\uF74B"], /* Private Use */
+ ["\uF74C", "\uF74C"], /* Private Use */
+ ["\uF74D", "\uF74D"], /* Private Use */
+ ["\uF74E", "\uF74E"], /* Private Use */
+ ["\uF74F", "\uF74F"], /* Private Use */
+ ["\uF750", "\uF750"], /* Private Use */
+ ["\uF751", "\uF751"], /* Private Use */
+ ["\uF752", "\uF752"], /* Private Use */
+ ["\uF753", "\uF753"], /* Private Use */
+ ["\uF754", "\uF754"], /* Private Use */
+ ["\uF755", "\uF755"], /* Private Use */
+ ["\uF756", "\uF756"], /* Private Use */
+ ["\uF757", "\uF757"], /* Private Use */
+ ["\uF758", "\uF758"], /* Private Use */
+ ["\uF759", "\uF759"], /* Private Use */
+ ["\uF75A", "\uF75A"], /* Private Use */
+ ["\uF75B", "\uF75B"], /* Private Use */
+ ["\uF75C", "\uF75C"], /* Private Use */
+ ["\uF75D", "\uF75D"], /* Private Use */
+ ["\uF75E", "\uF75E"], /* Private Use */
+ ["\uF75F", "\uF75F"], /* Private Use */
+ ["\uF760", "\uF760"], /* Private Use */
+ ["\uF761", "\uF761"], /* Private Use */
+ ["\uF762", "\uF762"], /* Private Use */
+ ["\uF763", "\uF763"], /* Private Use */
+ ["\uF764", "\uF764"], /* Private Use */
+ ["\uF765", "\uF765"], /* Private Use */
+ ["\uF766", "\uF766"], /* Private Use */
+ ["\uF767", "\uF767"], /* Private Use */
+ ["\uF768", "\uF768"], /* Private Use */
+ ["\uF769", "\uF769"], /* Private Use */
+ ["\uF76A", "\uF76A"], /* Private Use */
+ ["\uF76B", "\uF76B"], /* Private Use */
+ ["\uF76C", "\uF76C"], /* Private Use */
+ ["\uF76D", "\uF76D"], /* Private Use */
+ ["\uF76E", "\uF76E"], /* Private Use */
+ ["\uF76F", "\uF76F"], /* Private Use */
+ ["\uF770", "\uF770"], /* Private Use */
+ ["\uF771", "\uF771"], /* Private Use */
+ ["\uF772", "\uF772"], /* Private Use */
+ ["\uF773", "\uF773"], /* Private Use */
+ ["\uF774", "\uF774"], /* Private Use */
+ ["\uF775", "\uF775"], /* Private Use */
+ ["\uF776", "\uF776"], /* Private Use */
+ ["\uF777", "\uF777"], /* Private Use */
+ ["\uF778", "\uF778"], /* Private Use */
+ ["\uF779", "\uF779"], /* Private Use */
+ ["\uF77A", "\uF77A"], /* Private Use */
+ ["\uF77B", "\uF77B"], /* Private Use */
+ ["\uF77C", "\uF77C"], /* Private Use */
+ ["\uF77D", "\uF77D"], /* Private Use */
+ ["\uF77E", "\uF77E"], /* Private Use */
+ ["\uF77F", "\uF77F"], /* Private Use */
+ ["\uF780", "\uF780"], /* Private Use */
+ ["\uF781", "\uF781"], /* Private Use */
+ ["\uF782", "\uF782"], /* Private Use */
+ ["\uF783", "\uF783"], /* Private Use */
+ ["\uF784", "\uF784"], /* Private Use */
+ ["\uF785", "\uF785"], /* Private Use */
+ ["\uF786", "\uF786"], /* Private Use */
+ ["\uF787", "\uF787"], /* Private Use */
+ ["\uF788", "\uF788"], /* Private Use */
+ ["\uF789", "\uF789"], /* Private Use */
+ ["\uF78A", "\uF78A"], /* Private Use */
+ ["\uF78B", "\uF78B"], /* Private Use */
+ ["\uF78C", "\uF78C"], /* Private Use */
+ ["\uF78D", "\uF78D"], /* Private Use */
+ ["\uF78E", "\uF78E"], /* Private Use */
+ ["\uF78F", "\uF78F"], /* Private Use */
+ ["\uF790", "\uF790"], /* Private Use */
+ ["\uF791", "\uF791"], /* Private Use */
+ ["\uF792", "\uF792"], /* Private Use */
+ ["\uF793", "\uF793"], /* Private Use */
+ ["\uF794", "\uF794"], /* Private Use */
+ ["\uF795", "\uF795"], /* Private Use */
+ ["\uF796", "\uF796"], /* Private Use */
+ ["\uF797", "\uF797"], /* Private Use */
+ ["\uF798", "\uF798"], /* Private Use */
+ ["\uF799", "\uF799"], /* Private Use */
+ ["\uF79A", "\uF79A"], /* Private Use */
+ ["\uF79B", "\uF79B"], /* Private Use */
+ ["\uF79C", "\uF79C"], /* Private Use */
+ ["\uF79D", "\uF79D"], /* Private Use */
+ ["\uF79E", "\uF79E"], /* Private Use */
+ ["\uF79F", "\uF79F"], /* Private Use */
+ ["\uF7A0", "\uF7A0"], /* Private Use */
+ ["\uF7A1", "\uF7A1"], /* Private Use */
+ ["\uF7A2", "\uF7A2"], /* Private Use */
+ ["\uF7A3", "\uF7A3"], /* Private Use */
+ ["\uF7A4", "\uF7A4"], /* Private Use */
+ ["\uF7A5", "\uF7A5"], /* Private Use */
+ ["\uF7A6", "\uF7A6"], /* Private Use */
+ ["\uF7A7", "\uF7A7"], /* Private Use */
+ ["\uF7A8", "\uF7A8"], /* Private Use */
+ ["\uF7A9", "\uF7A9"], /* Private Use */
+ ["\uF7AA", "\uF7AA"], /* Private Use */
+ ["\uF7AB", "\uF7AB"], /* Private Use */
+ ["\uF7AC", "\uF7AC"], /* Private Use */
+ ["\uF7AD", "\uF7AD"], /* Private Use */
+ ["\uF7AE", "\uF7AE"], /* Private Use */
+ ["\uF7AF", "\uF7AF"], /* Private Use */
+ ["\uF7B0", "\uF7B0"], /* Private Use */
+ ["\uF7B1", "\uF7B1"], /* Private Use */
+ ["\uF7B2", "\uF7B2"], /* Private Use */
+ ["\uF7B3", "\uF7B3"], /* Private Use */
+ ["\uF7B4", "\uF7B4"], /* Private Use */
+ ["\uF7B5", "\uF7B5"], /* Private Use */
+ ["\uF7B6", "\uF7B6"], /* Private Use */
+ ["\uF7B7", "\uF7B7"], /* Private Use */
+ ["\uF7B8", "\uF7B8"], /* Private Use */
+ ["\uF7B9", "\uF7B9"], /* Private Use */
+ ["\uF7BA", "\uF7BA"], /* Private Use */
+ ["\uF7BB", "\uF7BB"], /* Private Use */
+ ["\uF7BC", "\uF7BC"], /* Private Use */
+ ["\uF7BD", "\uF7BD"], /* Private Use */
+ ["\uF7BE", "\uF7BE"], /* Private Use */
+ ["\uF7BF", "\uF7BF"], /* Private Use */
+ ["\uF7C0", "\uF7C0"], /* Private Use */
+ ["\uF7C1", "\uF7C1"], /* Private Use */
+ ["\uF7C2", "\uF7C2"], /* Private Use */
+ ["\uF7C3", "\uF7C3"], /* Private Use */
+ ["\uF7C4", "\uF7C4"], /* Private Use */
+ ["\uF7C5", "\uF7C5"], /* Private Use */
+ ["\uF7C6", "\uF7C6"], /* Private Use */
+ ["\uF7C7", "\uF7C7"], /* Private Use */
+ ["\uF7C8", "\uF7C8"], /* Private Use */
+ ["\uF7C9", "\uF7C9"], /* Private Use */
+ ["\uF7CA", "\uF7CA"], /* Private Use */
+ ["\uF7CB", "\uF7CB"], /* Private Use */
+ ["\uF7CC", "\uF7CC"], /* Private Use */
+ ["\uF7CD", "\uF7CD"], /* Private Use */
+ ["\uF7CE", "\uF7CE"], /* Private Use */
+ ["\uF7CF", "\uF7CF"], /* Private Use */
+ ["\uF7D0", "\uF7D0"], /* Private Use */
+ ["\uF7D1", "\uF7D1"], /* Private Use */
+ ["\uF7D2", "\uF7D2"], /* Private Use */
+ ["\uF7D3", "\uF7D3"], /* Private Use */
+ ["\uF7D4", "\uF7D4"], /* Private Use */
+ ["\uF7D5", "\uF7D5"], /* Private Use */
+ ["\uF7D6", "\uF7D6"], /* Private Use */
+ ["\uF7D7", "\uF7D7"], /* Private Use */
+ ["\uF7D8", "\uF7D8"], /* Private Use */
+ ["\uF7D9", "\uF7D9"], /* Private Use */
+ ["\uF7DA", "\uF7DA"], /* Private Use */
+ ["\uF7DB", "\uF7DB"], /* Private Use */
+ ["\uF7DC", "\uF7DC"], /* Private Use */
+ ["\uF7DD", "\uF7DD"], /* Private Use */
+ ["\uF7DE", "\uF7DE"], /* Private Use */
+ ["\uF7DF", "\uF7DF"], /* Private Use */
+ ["\uF7E0", "\uF7E0"], /* Private Use */
+ ["\uF7E1", "\uF7E1"], /* Private Use */
+ ["\uF7E2", "\uF7E2"], /* Private Use */
+ ["\uF7E3", "\uF7E3"], /* Private Use */
+ ["\uF7E4", "\uF7E4"], /* Private Use */
+ ["\uF7E5", "\uF7E5"], /* Private Use */
+ ["\uF7E6", "\uF7E6"], /* Private Use */
+ ["\uF7E7", "\uF7E7"], /* Private Use */
+ ["\uF7E8", "\uF7E8"], /* Private Use */
+ ["\uF7E9", "\uF7E9"], /* Private Use */
+ ["\uF7EA", "\uF7EA"], /* Private Use */
+ ["\uF7EB", "\uF7EB"], /* Private Use */
+ ["\uF7EC", "\uF7EC"], /* Private Use */
+ ["\uF7ED", "\uF7ED"], /* Private Use */
+ ["\uF7EE", "\uF7EE"], /* Private Use */
+ ["\uF7EF", "\uF7EF"], /* Private Use */
+ ["\uF7F0", "\uF7F0"], /* Private Use */
+ ["\uF7F1", "\uF7F1"], /* Private Use */
+ ["\uF7F2", "\uF7F2"], /* Private Use */
+ ["\uF7F3", "\uF7F3"], /* Private Use */
+ ["\uF7F4", "\uF7F4"], /* Private Use */
+ ["\uF7F5", "\uF7F5"], /* Private Use */
+ ["\uF7F6", "\uF7F6"], /* Private Use */
+ ["\uF7F7", "\uF7F7"], /* Private Use */
+ ["\uF7F8", "\uF7F8"], /* Private Use */
+ ["\uF7F9", "\uF7F9"], /* Private Use */
+ ["\uF7FA", "\uF7FA"], /* Private Use */
+ ["\uF7FB", "\uF7FB"], /* Private Use */
+ ["\uF7FC", "\uF7FC"], /* Private Use */
+ ["\uF7FD", "\uF7FD"], /* Private Use */
+ ["\uF7FE", "\uF7FE"], /* Private Use */
+ ["\uF7FF", "\uF7FF"], /* Private Use */
+ ["\uF800", "\uF800"], /* Private Use */
+ ["\uF801", "\uF801"], /* Private Use */
+ ["\uF802", "\uF802"], /* Private Use */
+ ["\uF803", "\uF803"], /* Private Use */
+ ["\uF804", "\uF804"], /* Private Use */
+ ["\uF805", "\uF805"], /* Private Use */
+ ["\uF806", "\uF806"], /* Private Use */
+ ["\uF807", "\uF807"], /* Private Use */
+ ["\uF808", "\uF808"], /* Private Use */
+ ["\uF809", "\uF809"], /* Private Use */
+ ["\uF80A", "\uF80A"], /* Private Use */
+ ["\uF80B", "\uF80B"], /* Private Use */
+ ["\uF80C", "\uF80C"], /* Private Use */
+ ["\uF80D", "\uF80D"], /* Private Use */
+ ["\uF80E", "\uF80E"], /* Private Use */
+ ["\uF80F", "\uF80F"], /* Private Use */
+ ["\uF810", "\uF810"], /* Private Use */
+ ["\uF811", "\uF811"], /* Private Use */
+ ["\uF812", "\uF812"], /* Private Use */
+ ["\uF813", "\uF813"], /* Private Use */
+ ["\uF814", "\uF814"], /* Private Use */
+ ["\uF815", "\uF815"], /* Private Use */
+ ["\uF816", "\uF816"], /* Private Use */
+ ["\uF817", "\uF817"], /* Private Use */
+ ["\uF818", "\uF818"], /* Private Use */
+ ["\uF819", "\uF819"], /* Private Use */
+ ["\uF81A", "\uF81A"], /* Private Use */
+ ["\uF81B", "\uF81B"], /* Private Use */
+ ["\uF81C", "\uF81C"], /* Private Use */
+ ["\uF81D", "\uF81D"], /* Private Use */
+ ["\uF81E", "\uF81E"], /* Private Use */
+ ["\uF81F", "\uF81F"], /* Private Use */
+ ["\uF820", "\uF820"], /* Private Use */
+ ["\uF821", "\uF821"], /* Private Use */
+ ["\uF822", "\uF822"], /* Private Use */
+ ["\uF823", "\uF823"], /* Private Use */
+ ["\uF824", "\uF824"], /* Private Use */
+ ["\uF825", "\uF825"], /* Private Use */
+ ["\uF826", "\uF826"], /* Private Use */
+ ["\uF827", "\uF827"], /* Private Use */
+ ["\uF828", "\uF828"], /* Private Use */
+ ["\uF829", "\uF829"], /* Private Use */
+ ["\uF82A", "\uF82A"], /* Private Use */
+ ["\uF82B", "\uF82B"], /* Private Use */
+ ["\uF82C", "\uF82C"], /* Private Use */
+ ["\uF82D", "\uF82D"], /* Private Use */
+ ["\uF82E", "\uF82E"], /* Private Use */
+ ["\uF82F", "\uF82F"], /* Private Use */
+ ["\uF830", "\uF830"], /* Private Use */
+ ["\uF831", "\uF831"], /* Private Use */
+ ["\uF832", "\uF832"], /* Private Use */
+ ["\uF833", "\uF833"], /* Private Use */
+ ["\uF834", "\uF834"], /* Private Use */
+ ["\uF835", "\uF835"], /* Private Use */
+ ["\uF836", "\uF836"], /* Private Use */
+ ["\uF837", "\uF837"], /* Private Use */
+ ["\uF838", "\uF838"], /* Private Use */
+ ["\uF839", "\uF839"], /* Private Use */
+ ["\uF83A", "\uF83A"], /* Private Use */
+ ["\uF83B", "\uF83B"], /* Private Use */
+ ["\uF83C", "\uF83C"], /* Private Use */
+ ["\uF83D", "\uF83D"], /* Private Use */
+ ["\uF83E", "\uF83E"], /* Private Use */
+ ["\uF83F", "\uF83F"], /* Private Use */
+ ["\uF840", "\uF840"], /* Private Use */
+ ["\uF841", "\uF841"], /* Private Use */
+ ["\uF842", "\uF842"], /* Private Use */
+ ["\uF843", "\uF843"], /* Private Use */
+ ["\uF844", "\uF844"], /* Private Use */
+ ["\uF845", "\uF845"], /* Private Use */
+ ["\uF846", "\uF846"], /* Private Use */
+ ["\uF847", "\uF847"], /* Private Use */
+ ["\uF848", "\uF848"], /* Private Use */
+ ["\uF849", "\uF849"], /* Private Use */
+ ["\uF84A", "\uF84A"], /* Private Use */
+ ["\uF84B", "\uF84B"], /* Private Use */
+ ["\uF84C", "\uF84C"], /* Private Use */
+ ["\uF84D", "\uF84D"], /* Private Use */
+ ["\uF84E", "\uF84E"], /* Private Use */
+ ["\uF84F", "\uF84F"], /* Private Use */
+ ["\uF850", "\uF850"], /* Private Use */
+ ["\uF851", "\uF851"], /* Private Use */
+ ["\uF852", "\uF852"], /* Private Use */
+ ["\uF853", "\uF853"], /* Private Use */
+ ["\uF854", "\uF854"], /* Private Use */
+ ["\uF855", "\uF855"], /* Private Use */
+ ["\uF856", "\uF856"], /* Private Use */
+ ["\uF857", "\uF857"], /* Private Use */
+ ["\uF858", "\uF858"], /* Private Use */
+ ["\uF859", "\uF859"], /* Private Use */
+ ["\uF85A", "\uF85A"], /* Private Use */
+ ["\uF85B", "\uF85B"], /* Private Use */
+ ["\uF85C", "\uF85C"], /* Private Use */
+ ["\uF85D", "\uF85D"], /* Private Use */
+ ["\uF85E", "\uF85E"], /* Private Use */
+ ["\uF85F", "\uF85F"], /* Private Use */
+ ["\uF860", "\uF860"], /* Private Use */
+ ["\uF861", "\uF861"], /* Private Use */
+ ["\uF862", "\uF862"], /* Private Use */
+ ["\uF863", "\uF863"], /* Private Use */
+ ["\uF864", "\uF864"], /* Private Use */
+ ["\uF865", "\uF865"], /* Private Use */
+ ["\uF866", "\uF866"], /* Private Use */
+ ["\uF867", "\uF867"], /* Private Use */
+ ["\uF868", "\uF868"], /* Private Use */
+ ["\uF869", "\uF869"], /* Private Use */
+ ["\uF86A", "\uF86A"], /* Private Use */
+ ["\uF86B", "\uF86B"], /* Private Use */
+ ["\uF86C", "\uF86C"], /* Private Use */
+ ["\uF86D", "\uF86D"], /* Private Use */
+ ["\uF86E", "\uF86E"], /* Private Use */
+ ["\uF86F", "\uF86F"], /* Private Use */
+ ["\uF870", "\uF870"], /* Private Use */
+ ["\uF871", "\uF871"], /* Private Use */
+ ["\uF872", "\uF872"], /* Private Use */
+ ["\uF873", "\uF873"], /* Private Use */
+ ["\uF874", "\uF874"], /* Private Use */
+ ["\uF875", "\uF875"], /* Private Use */
+ ["\uF876", "\uF876"], /* Private Use */
+ ["\uF877", "\uF877"], /* Private Use */
+ ["\uF878", "\uF878"], /* Private Use */
+ ["\uF879", "\uF879"], /* Private Use */
+ ["\uF87A", "\uF87A"], /* Private Use */
+ ["\uF87B", "\uF87B"], /* Private Use */
+ ["\uF87C", "\uF87C"], /* Private Use */
+ ["\uF87D", "\uF87D"], /* Private Use */
+ ["\uF87E", "\uF87E"], /* Private Use */
+ ["\uF87F", "\uF87F"], /* Private Use */
+ ["\uF880", "\uF880"], /* Private Use */
+ ["\uF881", "\uF881"], /* Private Use */
+ ["\uF882", "\uF882"], /* Private Use */
+ ["\uF883", "\uF883"], /* Private Use */
+ ["\uF884", "\uF884"], /* Private Use */
+ ["\uF885", "\uF885"], /* Private Use */
+ ["\uF886", "\uF886"], /* Private Use */
+ ["\uF887", "\uF887"], /* Private Use */
+ ["\uF888", "\uF888"], /* Private Use */
+ ["\uF889", "\uF889"], /* Private Use */
+ ["\uF88A", "\uF88A"], /* Private Use */
+ ["\uF88B", "\uF88B"], /* Private Use */
+ ["\uF88C", "\uF88C"], /* Private Use */
+ ["\uF88D", "\uF88D"], /* Private Use */
+ ["\uF88E", "\uF88E"], /* Private Use */
+ ["\uF88F", "\uF88F"], /* Private Use */
+ ["\uF890", "\uF890"], /* Private Use */
+ ["\uF891", "\uF891"], /* Private Use */
+ ["\uF892", "\uF892"], /* Private Use */
+ ["\uF893", "\uF893"], /* Private Use */
+ ["\uF894", "\uF894"], /* Private Use */
+ ["\uF895", "\uF895"], /* Private Use */
+ ["\uF896", "\uF896"], /* Private Use */
+ ["\uF897", "\uF897"], /* Private Use */
+ ["\uF898", "\uF898"], /* Private Use */
+ ["\uF899", "\uF899"], /* Private Use */
+ ["\uF89A", "\uF89A"], /* Private Use */
+ ["\uF89B", "\uF89B"], /* Private Use */
+ ["\uF89C", "\uF89C"], /* Private Use */
+ ["\uF89D", "\uF89D"], /* Private Use */
+ ["\uF89E", "\uF89E"], /* Private Use */
+ ["\uF89F", "\uF89F"], /* Private Use */
+ ["\uF8A0", "\uF8A0"], /* Private Use */
+ ["\uF8A1", "\uF8A1"], /* Private Use */
+ ["\uF8A2", "\uF8A2"], /* Private Use */
+ ["\uF8A3", "\uF8A3"], /* Private Use */
+ ["\uF8A4", "\uF8A4"], /* Private Use */
+ ["\uF8A5", "\uF8A5"], /* Private Use */
+ ["\uF8A6", "\uF8A6"], /* Private Use */
+ ["\uF8A7", "\uF8A7"], /* Private Use */
+ ["\uF8A8", "\uF8A8"], /* Private Use */
+ ["\uF8A9", "\uF8A9"], /* Private Use */
+ ["\uF8AA", "\uF8AA"], /* Private Use */
+ ["\uF8AB", "\uF8AB"], /* Private Use */
+ ["\uF8AC", "\uF8AC"], /* Private Use */
+ ["\uF8AD", "\uF8AD"], /* Private Use */
+ ["\uF8AE", "\uF8AE"], /* Private Use */
+ ["\uF8AF", "\uF8AF"], /* Private Use */
+ ["\uF8B0", "\uF8B0"], /* Private Use */
+ ["\uF8B1", "\uF8B1"], /* Private Use */
+ ["\uF8B2", "\uF8B2"], /* Private Use */
+ ["\uF8B3", "\uF8B3"], /* Private Use */
+ ["\uF8B4", "\uF8B4"], /* Private Use */
+ ["\uF8B5", "\uF8B5"], /* Private Use */
+ ["\uF8B6", "\uF8B6"], /* Private Use */
+ ["\uF8B7", "\uF8B7"], /* Private Use */
+ ["\uF8B8", "\uF8B8"], /* Private Use */
+ ["\uF8B9", "\uF8B9"], /* Private Use */
+ ["\uF8BA", "\uF8BA"], /* Private Use */
+ ["\uF8BB", "\uF8BB"], /* Private Use */
+ ["\uF8BC", "\uF8BC"], /* Private Use */
+ ["\uF8BD", "\uF8BD"], /* Private Use */
+ ["\uF8BE", "\uF8BE"], /* Private Use */
+ ["\uF8BF", "\uF8BF"], /* Private Use */
+ ["\uF8C0", "\uF8C0"], /* Private Use */
+ ["\uF8C1", "\uF8C1"], /* Private Use */
+ ["\uF8C2", "\uF8C2"], /* Private Use */
+ ["\uF8C3", "\uF8C3"], /* Private Use */
+ ["\uF8C4", "\uF8C4"], /* Private Use */
+ ["\uF8C5", "\uF8C5"], /* Private Use */
+ ["\uF8C6", "\uF8C6"], /* Private Use */
+ ["\uF8C7", "\uF8C7"], /* Private Use */
+ ["\uF8C8", "\uF8C8"], /* Private Use */
+ ["\uF8C9", "\uF8C9"], /* Private Use */
+ ["\uF8CA", "\uF8CA"], /* Private Use */
+ ["\uF8CB", "\uF8CB"], /* Private Use */
+ ["\uF8CC", "\uF8CC"], /* Private Use */
+ ["\uF8CD", "\uF8CD"], /* Private Use */
+ ["\uF8CE", "\uF8CE"], /* Private Use */
+ ["\uF8CF", "\uF8CF"], /* Private Use */
+ ["\uF8D0", "\uF8D0"], /* Private Use */
+ ["\uF8D1", "\uF8D1"], /* Private Use */
+ ["\uF8D2", "\uF8D2"], /* Private Use */
+ ["\uF8D3", "\uF8D3"], /* Private Use */
+ ["\uF8D4", "\uF8D4"], /* Private Use */
+ ["\uF8D5", "\uF8D5"], /* Private Use */
+ ["\uF8D6", "\uF8D6"], /* Private Use */
+ ["\uF8D7", "\uF8D7"], /* Private Use */
+ ["\uF8D8", "\uF8D8"], /* Private Use */
+ ["\uF8D9", "\uF8D9"], /* Private Use */
+ ["\uF8DA", "\uF8DA"], /* Private Use */
+ ["\uF8DB", "\uF8DB"], /* Private Use */
+ ["\uF8DC", "\uF8DC"], /* Private Use */
+ ["\uF8DD", "\uF8DD"], /* Private Use */
+ ["\uF8DE", "\uF8DE"], /* Private Use */
+ ["\uF8DF", "\uF8DF"], /* Private Use */
+ ["\uF8E0", "\uF8E0"], /* Private Use */
+ ["\uF8E1", "\uF8E1"], /* Private Use */
+ ["\uF8E2", "\uF8E2"], /* Private Use */
+ ["\uF8E3", "\uF8E3"], /* Private Use */
+ ["\uF8E4", "\uF8E4"], /* Private Use */
+ ["\uF8E5", "\uF8E5"], /* Private Use */
+ ["\uF8E6", "\uF8E6"], /* Private Use */
+ ["\uF8E7", "\uF8E7"], /* Private Use */
+ ["\uF8E8", "\uF8E8"], /* Private Use */
+ ["\uF8E9", "\uF8E9"], /* Private Use */
+ ["\uF8EA", "\uF8EA"], /* Private Use */
+ ["\uF8EB", "\uF8EB"], /* Private Use */
+ ["\uF8EC", "\uF8EC"], /* Private Use */
+ ["\uF8ED", "\uF8ED"], /* Private Use */
+ ["\uF8EE", "\uF8EE"], /* Private Use */
+ ["\uF8EF", "\uF8EF"], /* Private Use */
+ ["\uF8F0", "\uF8F0"], /* Private Use */
+ ["\uF8F1", "\uF8F1"], /* Private Use */
+ ["\uF8F2", "\uF8F2"], /* Private Use */
+ ["\uF8F3", "\uF8F3"], /* Private Use */
+ ["\uF8F4", "\uF8F4"], /* Private Use */
+ ["\uF8F5", "\uF8F5"], /* Private Use */
+ ["\uF8F6", "\uF8F6"], /* Private Use */
+ ["\uF8F7", "\uF8F7"], /* Private Use */
+ ["\uF8F8", "\uF8F8"], /* Private Use */
+ ["\uF8F9", "\uF8F9"], /* Private Use */
+ ["\uF8FA", "\uF8FA"], /* Private Use */
+ ["\uF8FB", "\uF8FB"], /* Private Use */
+ ["\uF8FC", "\uF8FC"], /* Private Use */
+ ["\uF8FD", "\uF8FD"], /* Private Use */
+ ["\uF8FE", "\uF8FE"], /* Private Use */
+ ["\uF8FF", "\uF8FF"], /* Private Use */
+ ["\uF900", "\uF900"], /* CJK COMPATIBILITY IDEOGRAPH-F900 */
+ ["\uF901", "\uF901"], /* CJK COMPATIBILITY IDEOGRAPH-F901 */
+ ["\uF902", "\uF902"], /* CJK COMPATIBILITY IDEOGRAPH-F902 */
+ ["\uF903", "\uF903"], /* CJK COMPATIBILITY IDEOGRAPH-F903 */
+ ["\uF904", "\uF904"], /* CJK COMPATIBILITY IDEOGRAPH-F904 */
+ ["\uF905", "\uF905"], /* CJK COMPATIBILITY IDEOGRAPH-F905 */
+ ["\uF906", "\uF906"], /* CJK COMPATIBILITY IDEOGRAPH-F906 */
+ ["\uF907", "\uF907"], /* CJK COMPATIBILITY IDEOGRAPH-F907 */
+ ["\uF908", "\uF908"], /* CJK COMPATIBILITY IDEOGRAPH-F908 */
+ ["\uF909", "\uF909"], /* CJK COMPATIBILITY IDEOGRAPH-F909 */
+ ["\uF90A", "\uF90A"], /* CJK COMPATIBILITY IDEOGRAPH-F90A */
+ ["\uF90B", "\uF90B"], /* CJK COMPATIBILITY IDEOGRAPH-F90B */
+ ["\uF90C", "\uF90C"], /* CJK COMPATIBILITY IDEOGRAPH-F90C */
+ ["\uF90D", "\uF90D"], /* CJK COMPATIBILITY IDEOGRAPH-F90D */
+ ["\uF90E", "\uF90E"], /* CJK COMPATIBILITY IDEOGRAPH-F90E */
+ ["\uF90F", "\uF90F"], /* CJK COMPATIBILITY IDEOGRAPH-F90F */
+ ["\uF910", "\uF910"], /* CJK COMPATIBILITY IDEOGRAPH-F910 */
+ ["\uF911", "\uF911"], /* CJK COMPATIBILITY IDEOGRAPH-F911 */
+ ["\uF912", "\uF912"], /* CJK COMPATIBILITY IDEOGRAPH-F912 */
+ ["\uF913", "\uF913"], /* CJK COMPATIBILITY IDEOGRAPH-F913 */
+ ["\uF914", "\uF914"], /* CJK COMPATIBILITY IDEOGRAPH-F914 */
+ ["\uF915", "\uF915"], /* CJK COMPATIBILITY IDEOGRAPH-F915 */
+ ["\uF916", "\uF916"], /* CJK COMPATIBILITY IDEOGRAPH-F916 */
+ ["\uF917", "\uF917"], /* CJK COMPATIBILITY IDEOGRAPH-F917 */
+ ["\uF918", "\uF918"], /* CJK COMPATIBILITY IDEOGRAPH-F918 */
+ ["\uF919", "\uF919"], /* CJK COMPATIBILITY IDEOGRAPH-F919 */
+ ["\uF91A", "\uF91A"], /* CJK COMPATIBILITY IDEOGRAPH-F91A */
+ ["\uF91B", "\uF91B"], /* CJK COMPATIBILITY IDEOGRAPH-F91B */
+ ["\uF91C", "\uF91C"], /* CJK COMPATIBILITY IDEOGRAPH-F91C */
+ ["\uF91D", "\uF91D"], /* CJK COMPATIBILITY IDEOGRAPH-F91D */
+ ["\uF91E", "\uF91E"], /* CJK COMPATIBILITY IDEOGRAPH-F91E */
+ ["\uF91F", "\uF91F"], /* CJK COMPATIBILITY IDEOGRAPH-F91F */
+ ["\uF920", "\uF920"], /* CJK COMPATIBILITY IDEOGRAPH-F920 */
+ ["\uF921", "\uF921"], /* CJK COMPATIBILITY IDEOGRAPH-F921 */
+ ["\uF922", "\uF922"], /* CJK COMPATIBILITY IDEOGRAPH-F922 */
+ ["\uF923", "\uF923"], /* CJK COMPATIBILITY IDEOGRAPH-F923 */
+ ["\uF924", "\uF924"], /* CJK COMPATIBILITY IDEOGRAPH-F924 */
+ ["\uF925", "\uF925"], /* CJK COMPATIBILITY IDEOGRAPH-F925 */
+ ["\uF926", "\uF926"], /* CJK COMPATIBILITY IDEOGRAPH-F926 */
+ ["\uF927", "\uF927"], /* CJK COMPATIBILITY IDEOGRAPH-F927 */
+ ["\uF928", "\uF928"], /* CJK COMPATIBILITY IDEOGRAPH-F928 */
+ ["\uF929", "\uF929"], /* CJK COMPATIBILITY IDEOGRAPH-F929 */
+ ["\uF92A", "\uF92A"], /* CJK COMPATIBILITY IDEOGRAPH-F92A */
+ ["\uF92B", "\uF92B"], /* CJK COMPATIBILITY IDEOGRAPH-F92B */
+ ["\uF92C", "\uF92C"], /* CJK COMPATIBILITY IDEOGRAPH-F92C */
+ ["\uF92D", "\uF92D"], /* CJK COMPATIBILITY IDEOGRAPH-F92D */
+ ["\uF92E", "\uF92E"], /* CJK COMPATIBILITY IDEOGRAPH-F92E */
+ ["\uF92F", "\uF92F"], /* CJK COMPATIBILITY IDEOGRAPH-F92F */
+ ["\uF930", "\uF930"], /* CJK COMPATIBILITY IDEOGRAPH-F930 */
+ ["\uF931", "\uF931"], /* CJK COMPATIBILITY IDEOGRAPH-F931 */
+ ["\uF932", "\uF932"], /* CJK COMPATIBILITY IDEOGRAPH-F932 */
+ ["\uF933", "\uF933"], /* CJK COMPATIBILITY IDEOGRAPH-F933 */
+ ["\uF934", "\uF934"], /* CJK COMPATIBILITY IDEOGRAPH-F934 */
+ ["\uF935", "\uF935"], /* CJK COMPATIBILITY IDEOGRAPH-F935 */
+ ["\uF936", "\uF936"], /* CJK COMPATIBILITY IDEOGRAPH-F936 */
+ ["\uF937", "\uF937"], /* CJK COMPATIBILITY IDEOGRAPH-F937 */
+ ["\uF938", "\uF938"], /* CJK COMPATIBILITY IDEOGRAPH-F938 */
+ ["\uF939", "\uF939"], /* CJK COMPATIBILITY IDEOGRAPH-F939 */
+ ["\uF93A", "\uF93A"], /* CJK COMPATIBILITY IDEOGRAPH-F93A */
+ ["\uF93B", "\uF93B"], /* CJK COMPATIBILITY IDEOGRAPH-F93B */
+ ["\uF93C", "\uF93C"], /* CJK COMPATIBILITY IDEOGRAPH-F93C */
+ ["\uF93D", "\uF93D"], /* CJK COMPATIBILITY IDEOGRAPH-F93D */
+ ["\uF93E", "\uF93E"], /* CJK COMPATIBILITY IDEOGRAPH-F93E */
+ ["\uF93F", "\uF93F"], /* CJK COMPATIBILITY IDEOGRAPH-F93F */
+ ["\uF940", "\uF940"], /* CJK COMPATIBILITY IDEOGRAPH-F940 */
+ ["\uF941", "\uF941"], /* CJK COMPATIBILITY IDEOGRAPH-F941 */
+ ["\uF942", "\uF942"], /* CJK COMPATIBILITY IDEOGRAPH-F942 */
+ ["\uF943", "\uF943"], /* CJK COMPATIBILITY IDEOGRAPH-F943 */
+ ["\uF944", "\uF944"], /* CJK COMPATIBILITY IDEOGRAPH-F944 */
+ ["\uF945", "\uF945"], /* CJK COMPATIBILITY IDEOGRAPH-F945 */
+ ["\uF946", "\uF946"], /* CJK COMPATIBILITY IDEOGRAPH-F946 */
+ ["\uF947", "\uF947"], /* CJK COMPATIBILITY IDEOGRAPH-F947 */
+ ["\uF948", "\uF948"], /* CJK COMPATIBILITY IDEOGRAPH-F948 */
+ ["\uF949", "\uF949"], /* CJK COMPATIBILITY IDEOGRAPH-F949 */
+ ["\uF94A", "\uF94A"], /* CJK COMPATIBILITY IDEOGRAPH-F94A */
+ ["\uF94B", "\uF94B"], /* CJK COMPATIBILITY IDEOGRAPH-F94B */
+ ["\uF94C", "\uF94C"], /* CJK COMPATIBILITY IDEOGRAPH-F94C */
+ ["\uF94D", "\uF94D"], /* CJK COMPATIBILITY IDEOGRAPH-F94D */
+ ["\uF94E", "\uF94E"], /* CJK COMPATIBILITY IDEOGRAPH-F94E */
+ ["\uF94F", "\uF94F"], /* CJK COMPATIBILITY IDEOGRAPH-F94F */
+ ["\uF950", "\uF950"], /* CJK COMPATIBILITY IDEOGRAPH-F950 */
+ ["\uF951", "\uF951"], /* CJK COMPATIBILITY IDEOGRAPH-F951 */
+ ["\uF952", "\uF952"], /* CJK COMPATIBILITY IDEOGRAPH-F952 */
+ ["\uF953", "\uF953"], /* CJK COMPATIBILITY IDEOGRAPH-F953 */
+ ["\uF954", "\uF954"], /* CJK COMPATIBILITY IDEOGRAPH-F954 */
+ ["\uF955", "\uF955"], /* CJK COMPATIBILITY IDEOGRAPH-F955 */
+ ["\uF956", "\uF956"], /* CJK COMPATIBILITY IDEOGRAPH-F956 */
+ ["\uF957", "\uF957"], /* CJK COMPATIBILITY IDEOGRAPH-F957 */
+ ["\uF958", "\uF958"], /* CJK COMPATIBILITY IDEOGRAPH-F958 */
+ ["\uF959", "\uF959"], /* CJK COMPATIBILITY IDEOGRAPH-F959 */
+ ["\uF95A", "\uF95A"], /* CJK COMPATIBILITY IDEOGRAPH-F95A */
+ ["\uF95B", "\uF95B"], /* CJK COMPATIBILITY IDEOGRAPH-F95B */
+ ["\uF95C", "\uF95C"], /* CJK COMPATIBILITY IDEOGRAPH-F95C */
+ ["\uF95D", "\uF95D"], /* CJK COMPATIBILITY IDEOGRAPH-F95D */
+ ["\uF95E", "\uF95E"], /* CJK COMPATIBILITY IDEOGRAPH-F95E */
+ ["\uF95F", "\uF95F"], /* CJK COMPATIBILITY IDEOGRAPH-F95F */
+ ["\uF960", "\uF960"], /* CJK COMPATIBILITY IDEOGRAPH-F960 */
+ ["\uF961", "\uF961"], /* CJK COMPATIBILITY IDEOGRAPH-F961 */
+ ["\uF962", "\uF962"], /* CJK COMPATIBILITY IDEOGRAPH-F962 */
+ ["\uF963", "\uF963"], /* CJK COMPATIBILITY IDEOGRAPH-F963 */
+ ["\uF964", "\uF964"], /* CJK COMPATIBILITY IDEOGRAPH-F964 */
+ ["\uF965", "\uF965"], /* CJK COMPATIBILITY IDEOGRAPH-F965 */
+ ["\uF966", "\uF966"], /* CJK COMPATIBILITY IDEOGRAPH-F966 */
+ ["\uF967", "\uF967"], /* CJK COMPATIBILITY IDEOGRAPH-F967 */
+ ["\uF968", "\uF968"], /* CJK COMPATIBILITY IDEOGRAPH-F968 */
+ ["\uF969", "\uF969"], /* CJK COMPATIBILITY IDEOGRAPH-F969 */
+ ["\uF96A", "\uF96A"], /* CJK COMPATIBILITY IDEOGRAPH-F96A */
+ ["\uF96B", "\uF96B"], /* CJK COMPATIBILITY IDEOGRAPH-F96B */
+ ["\uF96C", "\uF96C"], /* CJK COMPATIBILITY IDEOGRAPH-F96C */
+ ["\uF96D", "\uF96D"], /* CJK COMPATIBILITY IDEOGRAPH-F96D */
+ ["\uF96E", "\uF96E"], /* CJK COMPATIBILITY IDEOGRAPH-F96E */
+ ["\uF96F", "\uF96F"], /* CJK COMPATIBILITY IDEOGRAPH-F96F */
+ ["\uF970", "\uF970"], /* CJK COMPATIBILITY IDEOGRAPH-F970 */
+ ["\uF971", "\uF971"], /* CJK COMPATIBILITY IDEOGRAPH-F971 */
+ ["\uF972", "\uF972"], /* CJK COMPATIBILITY IDEOGRAPH-F972 */
+ ["\uF973", "\uF973"], /* CJK COMPATIBILITY IDEOGRAPH-F973 */
+ ["\uF974", "\uF974"], /* CJK COMPATIBILITY IDEOGRAPH-F974 */
+ ["\uF975", "\uF975"], /* CJK COMPATIBILITY IDEOGRAPH-F975 */
+ ["\uF976", "\uF976"], /* CJK COMPATIBILITY IDEOGRAPH-F976 */
+ ["\uF977", "\uF977"], /* CJK COMPATIBILITY IDEOGRAPH-F977 */
+ ["\uF978", "\uF978"], /* CJK COMPATIBILITY IDEOGRAPH-F978 */
+ ["\uF979", "\uF979"], /* CJK COMPATIBILITY IDEOGRAPH-F979 */
+ ["\uF97A", "\uF97A"], /* CJK COMPATIBILITY IDEOGRAPH-F97A */
+ ["\uF97B", "\uF97B"], /* CJK COMPATIBILITY IDEOGRAPH-F97B */
+ ["\uF97C", "\uF97C"], /* CJK COMPATIBILITY IDEOGRAPH-F97C */
+ ["\uF97D", "\uF97D"], /* CJK COMPATIBILITY IDEOGRAPH-F97D */
+ ["\uF97E", "\uF97E"], /* CJK COMPATIBILITY IDEOGRAPH-F97E */
+ ["\uF97F", "\uF97F"], /* CJK COMPATIBILITY IDEOGRAPH-F97F */
+ ["\uF980", "\uF980"], /* CJK COMPATIBILITY IDEOGRAPH-F980 */
+ ["\uF981", "\uF981"], /* CJK COMPATIBILITY IDEOGRAPH-F981 */
+ ["\uF982", "\uF982"], /* CJK COMPATIBILITY IDEOGRAPH-F982 */
+ ["\uF983", "\uF983"], /* CJK COMPATIBILITY IDEOGRAPH-F983 */
+ ["\uF984", "\uF984"], /* CJK COMPATIBILITY IDEOGRAPH-F984 */
+ ["\uF985", "\uF985"], /* CJK COMPATIBILITY IDEOGRAPH-F985 */
+ ["\uF986", "\uF986"], /* CJK COMPATIBILITY IDEOGRAPH-F986 */
+ ["\uF987", "\uF987"], /* CJK COMPATIBILITY IDEOGRAPH-F987 */
+ ["\uF988", "\uF988"], /* CJK COMPATIBILITY IDEOGRAPH-F988 */
+ ["\uF989", "\uF989"], /* CJK COMPATIBILITY IDEOGRAPH-F989 */
+ ["\uF98A", "\uF98A"], /* CJK COMPATIBILITY IDEOGRAPH-F98A */
+ ["\uF98B", "\uF98B"], /* CJK COMPATIBILITY IDEOGRAPH-F98B */
+ ["\uF98C", "\uF98C"], /* CJK COMPATIBILITY IDEOGRAPH-F98C */
+ ["\uF98D", "\uF98D"], /* CJK COMPATIBILITY IDEOGRAPH-F98D */
+ ["\uF98E", "\uF98E"], /* CJK COMPATIBILITY IDEOGRAPH-F98E */
+ ["\uF98F", "\uF98F"], /* CJK COMPATIBILITY IDEOGRAPH-F98F */
+ ["\uF990", "\uF990"], /* CJK COMPATIBILITY IDEOGRAPH-F990 */
+ ["\uF991", "\uF991"], /* CJK COMPATIBILITY IDEOGRAPH-F991 */
+ ["\uF992", "\uF992"], /* CJK COMPATIBILITY IDEOGRAPH-F992 */
+ ["\uF993", "\uF993"], /* CJK COMPATIBILITY IDEOGRAPH-F993 */
+ ["\uF994", "\uF994"], /* CJK COMPATIBILITY IDEOGRAPH-F994 */
+ ["\uF995", "\uF995"], /* CJK COMPATIBILITY IDEOGRAPH-F995 */
+ ["\uF996", "\uF996"], /* CJK COMPATIBILITY IDEOGRAPH-F996 */
+ ["\uF997", "\uF997"], /* CJK COMPATIBILITY IDEOGRAPH-F997 */
+ ["\uF998", "\uF998"], /* CJK COMPATIBILITY IDEOGRAPH-F998 */
+ ["\uF999", "\uF999"], /* CJK COMPATIBILITY IDEOGRAPH-F999 */
+ ["\uF99A", "\uF99A"], /* CJK COMPATIBILITY IDEOGRAPH-F99A */
+ ["\uF99B", "\uF99B"], /* CJK COMPATIBILITY IDEOGRAPH-F99B */
+ ["\uF99C", "\uF99C"], /* CJK COMPATIBILITY IDEOGRAPH-F99C */
+ ["\uF99D", "\uF99D"], /* CJK COMPATIBILITY IDEOGRAPH-F99D */
+ ["\uF99E", "\uF99E"], /* CJK COMPATIBILITY IDEOGRAPH-F99E */
+ ["\uF99F", "\uF99F"], /* CJK COMPATIBILITY IDEOGRAPH-F99F */
+ ["\uF9A0", "\uF9A0"], /* CJK COMPATIBILITY IDEOGRAPH-F9A0 */
+ ["\uF9A1", "\uF9A1"], /* CJK COMPATIBILITY IDEOGRAPH-F9A1 */
+ ["\uF9A2", "\uF9A2"], /* CJK COMPATIBILITY IDEOGRAPH-F9A2 */
+ ["\uF9A3", "\uF9A3"], /* CJK COMPATIBILITY IDEOGRAPH-F9A3 */
+ ["\uF9A4", "\uF9A4"], /* CJK COMPATIBILITY IDEOGRAPH-F9A4 */
+ ["\uF9A5", "\uF9A5"], /* CJK COMPATIBILITY IDEOGRAPH-F9A5 */
+ ["\uF9A6", "\uF9A6"], /* CJK COMPATIBILITY IDEOGRAPH-F9A6 */
+ ["\uF9A7", "\uF9A7"], /* CJK COMPATIBILITY IDEOGRAPH-F9A7 */
+ ["\uF9A8", "\uF9A8"], /* CJK COMPATIBILITY IDEOGRAPH-F9A8 */
+ ["\uF9A9", "\uF9A9"], /* CJK COMPATIBILITY IDEOGRAPH-F9A9 */
+ ["\uF9AA", "\uF9AA"], /* CJK COMPATIBILITY IDEOGRAPH-F9AA */
+ ["\uF9AB", "\uF9AB"], /* CJK COMPATIBILITY IDEOGRAPH-F9AB */
+ ["\uF9AC", "\uF9AC"], /* CJK COMPATIBILITY IDEOGRAPH-F9AC */
+ ["\uF9AD", "\uF9AD"], /* CJK COMPATIBILITY IDEOGRAPH-F9AD */
+ ["\uF9AE", "\uF9AE"], /* CJK COMPATIBILITY IDEOGRAPH-F9AE */
+ ["\uF9AF", "\uF9AF"], /* CJK COMPATIBILITY IDEOGRAPH-F9AF */
+ ["\uF9B0", "\uF9B0"], /* CJK COMPATIBILITY IDEOGRAPH-F9B0 */
+ ["\uF9B1", "\uF9B1"], /* CJK COMPATIBILITY IDEOGRAPH-F9B1 */
+ ["\uF9B2", "\uF9B2"], /* CJK COMPATIBILITY IDEOGRAPH-F9B2 */
+ ["\uF9B3", "\uF9B3"], /* CJK COMPATIBILITY IDEOGRAPH-F9B3 */
+ ["\uF9B4", "\uF9B4"], /* CJK COMPATIBILITY IDEOGRAPH-F9B4 */
+ ["\uF9B5", "\uF9B5"], /* CJK COMPATIBILITY IDEOGRAPH-F9B5 */
+ ["\uF9B6", "\uF9B6"], /* CJK COMPATIBILITY IDEOGRAPH-F9B6 */
+ ["\uF9B7", "\uF9B7"], /* CJK COMPATIBILITY IDEOGRAPH-F9B7 */
+ ["\uF9B8", "\uF9B8"], /* CJK COMPATIBILITY IDEOGRAPH-F9B8 */
+ ["\uF9B9", "\uF9B9"], /* CJK COMPATIBILITY IDEOGRAPH-F9B9 */
+ ["\uF9BA", "\uF9BA"], /* CJK COMPATIBILITY IDEOGRAPH-F9BA */
+ ["\uF9BB", "\uF9BB"], /* CJK COMPATIBILITY IDEOGRAPH-F9BB */
+ ["\uF9BC", "\uF9BC"], /* CJK COMPATIBILITY IDEOGRAPH-F9BC */
+ ["\uF9BD", "\uF9BD"], /* CJK COMPATIBILITY IDEOGRAPH-F9BD */
+ ["\uF9BE", "\uF9BE"], /* CJK COMPATIBILITY IDEOGRAPH-F9BE */
+ ["\uF9BF", "\uF9BF"], /* CJK COMPATIBILITY IDEOGRAPH-F9BF */
+ ["\uF9C0", "\uF9C0"], /* CJK COMPATIBILITY IDEOGRAPH-F9C0 */
+ ["\uF9C1", "\uF9C1"], /* CJK COMPATIBILITY IDEOGRAPH-F9C1 */
+ ["\uF9C2", "\uF9C2"], /* CJK COMPATIBILITY IDEOGRAPH-F9C2 */
+ ["\uF9C3", "\uF9C3"], /* CJK COMPATIBILITY IDEOGRAPH-F9C3 */
+ ["\uF9C4", "\uF9C4"], /* CJK COMPATIBILITY IDEOGRAPH-F9C4 */
+ ["\uF9C5", "\uF9C5"], /* CJK COMPATIBILITY IDEOGRAPH-F9C5 */
+ ["\uF9C6", "\uF9C6"], /* CJK COMPATIBILITY IDEOGRAPH-F9C6 */
+ ["\uF9C7", "\uF9C7"], /* CJK COMPATIBILITY IDEOGRAPH-F9C7 */
+ ["\uF9C8", "\uF9C8"], /* CJK COMPATIBILITY IDEOGRAPH-F9C8 */
+ ["\uF9C9", "\uF9C9"], /* CJK COMPATIBILITY IDEOGRAPH-F9C9 */
+ ["\uF9CA", "\uF9CA"], /* CJK COMPATIBILITY IDEOGRAPH-F9CA */
+ ["\uF9CB", "\uF9CB"], /* CJK COMPATIBILITY IDEOGRAPH-F9CB */
+ ["\uF9CC", "\uF9CC"], /* CJK COMPATIBILITY IDEOGRAPH-F9CC */
+ ["\uF9CD", "\uF9CD"], /* CJK COMPATIBILITY IDEOGRAPH-F9CD */
+ ["\uF9CE", "\uF9CE"], /* CJK COMPATIBILITY IDEOGRAPH-F9CE */
+ ["\uF9CF", "\uF9CF"], /* CJK COMPATIBILITY IDEOGRAPH-F9CF */
+ ["\uF9D0", "\uF9D0"], /* CJK COMPATIBILITY IDEOGRAPH-F9D0 */
+ ["\uF9D1", "\uF9D1"], /* CJK COMPATIBILITY IDEOGRAPH-F9D1 */
+ ["\uF9D2", "\uF9D2"], /* CJK COMPATIBILITY IDEOGRAPH-F9D2 */
+ ["\uF9D3", "\uF9D3"], /* CJK COMPATIBILITY IDEOGRAPH-F9D3 */
+ ["\uF9D4", "\uF9D4"], /* CJK COMPATIBILITY IDEOGRAPH-F9D4 */
+ ["\uF9D5", "\uF9D5"], /* CJK COMPATIBILITY IDEOGRAPH-F9D5 */
+ ["\uF9D6", "\uF9D6"], /* CJK COMPATIBILITY IDEOGRAPH-F9D6 */
+ ["\uF9D7", "\uF9D7"], /* CJK COMPATIBILITY IDEOGRAPH-F9D7 */
+ ["\uF9D8", "\uF9D8"], /* CJK COMPATIBILITY IDEOGRAPH-F9D8 */
+ ["\uF9D9", "\uF9D9"], /* CJK COMPATIBILITY IDEOGRAPH-F9D9 */
+ ["\uF9DA", "\uF9DA"], /* CJK COMPATIBILITY IDEOGRAPH-F9DA */
+ ["\uF9DB", "\uF9DB"], /* CJK COMPATIBILITY IDEOGRAPH-F9DB */
+ ["\uF9DC", "\uF9DC"], /* CJK COMPATIBILITY IDEOGRAPH-F9DC */
+ ["\uF9DD", "\uF9DD"], /* CJK COMPATIBILITY IDEOGRAPH-F9DD */
+ ["\uF9DE", "\uF9DE"], /* CJK COMPATIBILITY IDEOGRAPH-F9DE */
+ ["\uF9DF", "\uF9DF"], /* CJK COMPATIBILITY IDEOGRAPH-F9DF */
+ ["\uF9E0", "\uF9E0"], /* CJK COMPATIBILITY IDEOGRAPH-F9E0 */
+ ["\uF9E1", "\uF9E1"], /* CJK COMPATIBILITY IDEOGRAPH-F9E1 */
+ ["\uF9E2", "\uF9E2"], /* CJK COMPATIBILITY IDEOGRAPH-F9E2 */
+ ["\uF9E3", "\uF9E3"], /* CJK COMPATIBILITY IDEOGRAPH-F9E3 */
+ ["\uF9E4", "\uF9E4"], /* CJK COMPATIBILITY IDEOGRAPH-F9E4 */
+ ["\uF9E5", "\uF9E5"], /* CJK COMPATIBILITY IDEOGRAPH-F9E5 */
+ ["\uF9E6", "\uF9E6"], /* CJK COMPATIBILITY IDEOGRAPH-F9E6 */
+ ["\uF9E7", "\uF9E7"], /* CJK COMPATIBILITY IDEOGRAPH-F9E7 */
+ ["\uF9E8", "\uF9E8"], /* CJK COMPATIBILITY IDEOGRAPH-F9E8 */
+ ["\uF9E9", "\uF9E9"], /* CJK COMPATIBILITY IDEOGRAPH-F9E9 */
+ ["\uF9EA", "\uF9EA"], /* CJK COMPATIBILITY IDEOGRAPH-F9EA */
+ ["\uF9EB", "\uF9EB"], /* CJK COMPATIBILITY IDEOGRAPH-F9EB */
+ ["\uF9EC", "\uF9EC"], /* CJK COMPATIBILITY IDEOGRAPH-F9EC */
+ ["\uF9ED", "\uF9ED"], /* CJK COMPATIBILITY IDEOGRAPH-F9ED */
+ ["\uF9EE", "\uF9EE"], /* CJK COMPATIBILITY IDEOGRAPH-F9EE */
+ ["\uF9EF", "\uF9EF"], /* CJK COMPATIBILITY IDEOGRAPH-F9EF */
+ ["\uF9F0", "\uF9F0"], /* CJK COMPATIBILITY IDEOGRAPH-F9F0 */
+ ["\uF9F1", "\uF9F1"], /* CJK COMPATIBILITY IDEOGRAPH-F9F1 */
+ ["\uF9F2", "\uF9F2"], /* CJK COMPATIBILITY IDEOGRAPH-F9F2 */
+ ["\uF9F3", "\uF9F3"], /* CJK COMPATIBILITY IDEOGRAPH-F9F3 */
+ ["\uF9F4", "\uF9F4"], /* CJK COMPATIBILITY IDEOGRAPH-F9F4 */
+ ["\uF9F5", "\uF9F5"], /* CJK COMPATIBILITY IDEOGRAPH-F9F5 */
+ ["\uF9F6", "\uF9F6"], /* CJK COMPATIBILITY IDEOGRAPH-F9F6 */
+ ["\uF9F7", "\uF9F7"], /* CJK COMPATIBILITY IDEOGRAPH-F9F7 */
+ ["\uF9F8", "\uF9F8"], /* CJK COMPATIBILITY IDEOGRAPH-F9F8 */
+ ["\uF9F9", "\uF9F9"], /* CJK COMPATIBILITY IDEOGRAPH-F9F9 */
+ ["\uF9FA", "\uF9FA"], /* CJK COMPATIBILITY IDEOGRAPH-F9FA */
+ ["\uF9FB", "\uF9FB"], /* CJK COMPATIBILITY IDEOGRAPH-F9FB */
+ ["\uF9FC", "\uF9FC"], /* CJK COMPATIBILITY IDEOGRAPH-F9FC */
+ ["\uF9FD", "\uF9FD"], /* CJK COMPATIBILITY IDEOGRAPH-F9FD */
+ ["\uF9FE", "\uF9FE"], /* CJK COMPATIBILITY IDEOGRAPH-F9FE */
+ ["\uF9FF", "\uF9FF"], /* CJK COMPATIBILITY IDEOGRAPH-F9FF */
+ ["\uFA00", "\uFA00"], /* CJK COMPATIBILITY IDEOGRAPH-FA00 */
+ ["\uFA01", "\uFA01"], /* CJK COMPATIBILITY IDEOGRAPH-FA01 */
+ ["\uFA02", "\uFA02"], /* CJK COMPATIBILITY IDEOGRAPH-FA02 */
+ ["\uFA03", "\uFA03"], /* CJK COMPATIBILITY IDEOGRAPH-FA03 */
+ ["\uFA04", "\uFA04"], /* CJK COMPATIBILITY IDEOGRAPH-FA04 */
+ ["\uFA05", "\uFA05"], /* CJK COMPATIBILITY IDEOGRAPH-FA05 */
+ ["\uFA06", "\uFA06"], /* CJK COMPATIBILITY IDEOGRAPH-FA06 */
+ ["\uFA07", "\uFA07"], /* CJK COMPATIBILITY IDEOGRAPH-FA07 */
+ ["\uFA08", "\uFA08"], /* CJK COMPATIBILITY IDEOGRAPH-FA08 */
+ ["\uFA09", "\uFA09"], /* CJK COMPATIBILITY IDEOGRAPH-FA09 */
+ ["\uFA0A", "\uFA0A"], /* CJK COMPATIBILITY IDEOGRAPH-FA0A */
+ ["\uFA0B", "\uFA0B"], /* CJK COMPATIBILITY IDEOGRAPH-FA0B */
+ ["\uFA0C", "\uFA0C"], /* CJK COMPATIBILITY IDEOGRAPH-FA0C */
+ ["\uFA0D", "\uFA0D"], /* CJK COMPATIBILITY IDEOGRAPH-FA0D */
+ ["\uFA0E", "\uFA0E"], /* CJK COMPATIBILITY IDEOGRAPH-FA0E */
+ ["\uFA0F", "\uFA0F"], /* CJK COMPATIBILITY IDEOGRAPH-FA0F */
+ ["\uFA10", "\uFA10"], /* CJK COMPATIBILITY IDEOGRAPH-FA10 */
+ ["\uFA11", "\uFA11"], /* CJK COMPATIBILITY IDEOGRAPH-FA11 */
+ ["\uFA12", "\uFA12"], /* CJK COMPATIBILITY IDEOGRAPH-FA12 */
+ ["\uFA13", "\uFA13"], /* CJK COMPATIBILITY IDEOGRAPH-FA13 */
+ ["\uFA14", "\uFA14"], /* CJK COMPATIBILITY IDEOGRAPH-FA14 */
+ ["\uFA15", "\uFA15"], /* CJK COMPATIBILITY IDEOGRAPH-FA15 */
+ ["\uFA16", "\uFA16"], /* CJK COMPATIBILITY IDEOGRAPH-FA16 */
+ ["\uFA17", "\uFA17"], /* CJK COMPATIBILITY IDEOGRAPH-FA17 */
+ ["\uFA18", "\uFA18"], /* CJK COMPATIBILITY IDEOGRAPH-FA18 */
+ ["\uFA19", "\uFA19"], /* CJK COMPATIBILITY IDEOGRAPH-FA19 */
+ ["\uFA1A", "\uFA1A"], /* CJK COMPATIBILITY IDEOGRAPH-FA1A */
+ ["\uFA1B", "\uFA1B"], /* CJK COMPATIBILITY IDEOGRAPH-FA1B */
+ ["\uFA1C", "\uFA1C"], /* CJK COMPATIBILITY IDEOGRAPH-FA1C */
+ ["\uFA1D", "\uFA1D"], /* CJK COMPATIBILITY IDEOGRAPH-FA1D */
+ ["\uFA1E", "\uFA1E"], /* CJK COMPATIBILITY IDEOGRAPH-FA1E */
+ ["\uFA1F", "\uFA1F"], /* CJK COMPATIBILITY IDEOGRAPH-FA1F */
+ ["\uFA20", "\uFA20"], /* CJK COMPATIBILITY IDEOGRAPH-FA20 */
+ ["\uFA21", "\uFA21"], /* CJK COMPATIBILITY IDEOGRAPH-FA21 */
+ ["\uFA22", "\uFA22"], /* CJK COMPATIBILITY IDEOGRAPH-FA22 */
+ ["\uFA23", "\uFA23"], /* CJK COMPATIBILITY IDEOGRAPH-FA23 */
+ ["\uFA24", "\uFA24"], /* CJK COMPATIBILITY IDEOGRAPH-FA24 */
+ ["\uFA25", "\uFA25"], /* CJK COMPATIBILITY IDEOGRAPH-FA25 */
+ ["\uFA26", "\uFA26"], /* CJK COMPATIBILITY IDEOGRAPH-FA26 */
+ ["\uFA27", "\uFA27"], /* CJK COMPATIBILITY IDEOGRAPH-FA27 */
+ ["\uFA28", "\uFA28"], /* CJK COMPATIBILITY IDEOGRAPH-FA28 */
+ ["\uFA29", "\uFA29"], /* CJK COMPATIBILITY IDEOGRAPH-FA29 */
+ ["\uFA2A", "\uFA2A"], /* CJK COMPATIBILITY IDEOGRAPH-FA2A */
+ ["\uFA2B", "\uFA2B"], /* CJK COMPATIBILITY IDEOGRAPH-FA2B */
+ ["\uFA2C", "\uFA2C"], /* CJK COMPATIBILITY IDEOGRAPH-FA2C */
+ ["\uFA2D", "\uFA2D"], /* CJK COMPATIBILITY IDEOGRAPH-FA2D */
+ ["\uFA2E", "\uFA2E"], /* CJK COMPATIBILITY IDEOGRAPH-FA2E */
+ ["\uFA2F", "\uFA2F"], /* CJK COMPATIBILITY IDEOGRAPH-FA2F */
+ ["\uFA30", "\uFA30"], /* CJK COMPATIBILITY IDEOGRAPH-FA30 */
+ ["\uFA31", "\uFA31"], /* CJK COMPATIBILITY IDEOGRAPH-FA31 */
+ ["\uFA32", "\uFA32"], /* CJK COMPATIBILITY IDEOGRAPH-FA32 */
+ ["\uFA33", "\uFA33"], /* CJK COMPATIBILITY IDEOGRAPH-FA33 */
+ ["\uFA34", "\uFA34"], /* CJK COMPATIBILITY IDEOGRAPH-FA34 */
+ ["\uFA35", "\uFA35"], /* CJK COMPATIBILITY IDEOGRAPH-FA35 */
+ ["\uFA36", "\uFA36"], /* CJK COMPATIBILITY IDEOGRAPH-FA36 */
+ ["\uFA37", "\uFA37"], /* CJK COMPATIBILITY IDEOGRAPH-FA37 */
+ ["\uFA38", "\uFA38"], /* CJK COMPATIBILITY IDEOGRAPH-FA38 */
+ ["\uFA39", "\uFA39"], /* CJK COMPATIBILITY IDEOGRAPH-FA39 */
+ ["\uFA3A", "\uFA3A"], /* CJK COMPATIBILITY IDEOGRAPH-FA3A */
+ ["\uFA3B", "\uFA3B"], /* CJK COMPATIBILITY IDEOGRAPH-FA3B */
+ ["\uFA3C", "\uFA3C"], /* CJK COMPATIBILITY IDEOGRAPH-FA3C */
+ ["\uFA3D", "\uFA3D"], /* CJK COMPATIBILITY IDEOGRAPH-FA3D */
+ ["\uFA3E", "\uFA3E"], /* CJK COMPATIBILITY IDEOGRAPH-FA3E */
+ ["\uFA3F", "\uFA3F"], /* CJK COMPATIBILITY IDEOGRAPH-FA3F */
+ ["\uFA40", "\uFA40"], /* CJK COMPATIBILITY IDEOGRAPH-FA40 */
+ ["\uFA41", "\uFA41"], /* CJK COMPATIBILITY IDEOGRAPH-FA41 */
+ ["\uFA42", "\uFA42"], /* CJK COMPATIBILITY IDEOGRAPH-FA42 */
+ ["\uFA43", "\uFA43"], /* CJK COMPATIBILITY IDEOGRAPH-FA43 */
+ ["\uFA44", "\uFA44"], /* CJK COMPATIBILITY IDEOGRAPH-FA44 */
+ ["\uFA45", "\uFA45"], /* CJK COMPATIBILITY IDEOGRAPH-FA45 */
+ ["\uFA46", "\uFA46"], /* CJK COMPATIBILITY IDEOGRAPH-FA46 */
+ ["\uFA47", "\uFA47"], /* CJK COMPATIBILITY IDEOGRAPH-FA47 */
+ ["\uFA48", "\uFA48"], /* CJK COMPATIBILITY IDEOGRAPH-FA48 */
+ ["\uFA49", "\uFA49"], /* CJK COMPATIBILITY IDEOGRAPH-FA49 */
+ ["\uFA4A", "\uFA4A"], /* CJK COMPATIBILITY IDEOGRAPH-FA4A */
+ ["\uFA4B", "\uFA4B"], /* CJK COMPATIBILITY IDEOGRAPH-FA4B */
+ ["\uFA4C", "\uFA4C"], /* CJK COMPATIBILITY IDEOGRAPH-FA4C */
+ ["\uFA4D", "\uFA4D"], /* CJK COMPATIBILITY IDEOGRAPH-FA4D */
+ ["\uFA4E", "\uFA4E"], /* CJK COMPATIBILITY IDEOGRAPH-FA4E */
+ ["\uFA4F", "\uFA4F"], /* CJK COMPATIBILITY IDEOGRAPH-FA4F */
+ ["\uFA50", "\uFA50"], /* CJK COMPATIBILITY IDEOGRAPH-FA50 */
+ ["\uFA51", "\uFA51"], /* CJK COMPATIBILITY IDEOGRAPH-FA51 */
+ ["\uFA52", "\uFA52"], /* CJK COMPATIBILITY IDEOGRAPH-FA52 */
+ ["\uFA53", "\uFA53"], /* CJK COMPATIBILITY IDEOGRAPH-FA53 */
+ ["\uFA54", "\uFA54"], /* CJK COMPATIBILITY IDEOGRAPH-FA54 */
+ ["\uFA55", "\uFA55"], /* CJK COMPATIBILITY IDEOGRAPH-FA55 */
+ ["\uFA56", "\uFA56"], /* CJK COMPATIBILITY IDEOGRAPH-FA56 */
+ ["\uFA57", "\uFA57"], /* CJK COMPATIBILITY IDEOGRAPH-FA57 */
+ ["\uFA58", "\uFA58"], /* CJK COMPATIBILITY IDEOGRAPH-FA58 */
+ ["\uFA59", "\uFA59"], /* CJK COMPATIBILITY IDEOGRAPH-FA59 */
+ ["\uFA5A", "\uFA5A"], /* CJK COMPATIBILITY IDEOGRAPH-FA5A */
+ ["\uFA5B", "\uFA5B"], /* CJK COMPATIBILITY IDEOGRAPH-FA5B */
+ ["\uFA5C", "\uFA5C"], /* CJK COMPATIBILITY IDEOGRAPH-FA5C */
+ ["\uFA5D", "\uFA5D"], /* CJK COMPATIBILITY IDEOGRAPH-FA5D */
+ ["\uFA5E", "\uFA5E"], /* CJK COMPATIBILITY IDEOGRAPH-FA5E */
+ ["\uFA5F", "\uFA5F"], /* CJK COMPATIBILITY IDEOGRAPH-FA5F */
+ ["\uFA60", "\uFA60"], /* CJK COMPATIBILITY IDEOGRAPH-FA60 */
+ ["\uFA61", "\uFA61"], /* CJK COMPATIBILITY IDEOGRAPH-FA61 */
+ ["\uFA62", "\uFA62"], /* CJK COMPATIBILITY IDEOGRAPH-FA62 */
+ ["\uFA63", "\uFA63"], /* CJK COMPATIBILITY IDEOGRAPH-FA63 */
+ ["\uFA64", "\uFA64"], /* CJK COMPATIBILITY IDEOGRAPH-FA64 */
+ ["\uFA65", "\uFA65"], /* CJK COMPATIBILITY IDEOGRAPH-FA65 */
+ ["\uFA66", "\uFA66"], /* CJK COMPATIBILITY IDEOGRAPH-FA66 */
+ ["\uFA67", "\uFA67"], /* CJK COMPATIBILITY IDEOGRAPH-FA67 */
+ ["\uFA68", "\uFA68"], /* CJK COMPATIBILITY IDEOGRAPH-FA68 */
+ ["\uFA69", "\uFA69"], /* CJK COMPATIBILITY IDEOGRAPH-FA69 */
+ ["\uFA6A", "\uFA6A"], /* CJK COMPATIBILITY IDEOGRAPH-FA6A */
+ ["\uFA6B", "\uFA6B"], /* CJK COMPATIBILITY IDEOGRAPH-FA6B */
+ ["\uFA6C", "\uFA6C"], /* CJK COMPATIBILITY IDEOGRAPH-FA6C */
+ ["\uFA6D", "\uFA6D"], /* CJK COMPATIBILITY IDEOGRAPH-FA6D */
+ ["\uFA6E", "\uFA6E"],
+ ["\uFA6F", "\uFA6F"],
+ ["\uFA70", "\uFA70"], /* CJK COMPATIBILITY IDEOGRAPH-FA70 */
+ ["\uFA71", "\uFA71"], /* CJK COMPATIBILITY IDEOGRAPH-FA71 */
+ ["\uFA72", "\uFA72"], /* CJK COMPATIBILITY IDEOGRAPH-FA72 */
+ ["\uFA73", "\uFA73"], /* CJK COMPATIBILITY IDEOGRAPH-FA73 */
+ ["\uFA74", "\uFA74"], /* CJK COMPATIBILITY IDEOGRAPH-FA74 */
+ ["\uFA75", "\uFA75"], /* CJK COMPATIBILITY IDEOGRAPH-FA75 */
+ ["\uFA76", "\uFA76"], /* CJK COMPATIBILITY IDEOGRAPH-FA76 */
+ ["\uFA77", "\uFA77"], /* CJK COMPATIBILITY IDEOGRAPH-FA77 */
+ ["\uFA78", "\uFA78"], /* CJK COMPATIBILITY IDEOGRAPH-FA78 */
+ ["\uFA79", "\uFA79"], /* CJK COMPATIBILITY IDEOGRAPH-FA79 */
+ ["\uFA7A", "\uFA7A"], /* CJK COMPATIBILITY IDEOGRAPH-FA7A */
+ ["\uFA7B", "\uFA7B"], /* CJK COMPATIBILITY IDEOGRAPH-FA7B */
+ ["\uFA7C", "\uFA7C"], /* CJK COMPATIBILITY IDEOGRAPH-FA7C */
+ ["\uFA7D", "\uFA7D"], /* CJK COMPATIBILITY IDEOGRAPH-FA7D */
+ ["\uFA7E", "\uFA7E"], /* CJK COMPATIBILITY IDEOGRAPH-FA7E */
+ ["\uFA7F", "\uFA7F"], /* CJK COMPATIBILITY IDEOGRAPH-FA7F */
+ ["\uFA80", "\uFA80"], /* CJK COMPATIBILITY IDEOGRAPH-FA80 */
+ ["\uFA81", "\uFA81"], /* CJK COMPATIBILITY IDEOGRAPH-FA81 */
+ ["\uFA82", "\uFA82"], /* CJK COMPATIBILITY IDEOGRAPH-FA82 */
+ ["\uFA83", "\uFA83"], /* CJK COMPATIBILITY IDEOGRAPH-FA83 */
+ ["\uFA84", "\uFA84"], /* CJK COMPATIBILITY IDEOGRAPH-FA84 */
+ ["\uFA85", "\uFA85"], /* CJK COMPATIBILITY IDEOGRAPH-FA85 */
+ ["\uFA86", "\uFA86"], /* CJK COMPATIBILITY IDEOGRAPH-FA86 */
+ ["\uFA87", "\uFA87"], /* CJK COMPATIBILITY IDEOGRAPH-FA87 */
+ ["\uFA88", "\uFA88"], /* CJK COMPATIBILITY IDEOGRAPH-FA88 */
+ ["\uFA89", "\uFA89"], /* CJK COMPATIBILITY IDEOGRAPH-FA89 */
+ ["\uFA8A", "\uFA8A"], /* CJK COMPATIBILITY IDEOGRAPH-FA8A */
+ ["\uFA8B", "\uFA8B"], /* CJK COMPATIBILITY IDEOGRAPH-FA8B */
+ ["\uFA8C", "\uFA8C"], /* CJK COMPATIBILITY IDEOGRAPH-FA8C */
+ ["\uFA8D", "\uFA8D"], /* CJK COMPATIBILITY IDEOGRAPH-FA8D */
+ ["\uFA8E", "\uFA8E"], /* CJK COMPATIBILITY IDEOGRAPH-FA8E */
+ ["\uFA8F", "\uFA8F"], /* CJK COMPATIBILITY IDEOGRAPH-FA8F */
+ ["\uFA90", "\uFA90"], /* CJK COMPATIBILITY IDEOGRAPH-FA90 */
+ ["\uFA91", "\uFA91"], /* CJK COMPATIBILITY IDEOGRAPH-FA91 */
+ ["\uFA92", "\uFA92"], /* CJK COMPATIBILITY IDEOGRAPH-FA92 */
+ ["\uFA93", "\uFA93"], /* CJK COMPATIBILITY IDEOGRAPH-FA93 */
+ ["\uFA94", "\uFA94"], /* CJK COMPATIBILITY IDEOGRAPH-FA94 */
+ ["\uFA95", "\uFA95"], /* CJK COMPATIBILITY IDEOGRAPH-FA95 */
+ ["\uFA96", "\uFA96"], /* CJK COMPATIBILITY IDEOGRAPH-FA96 */
+ ["\uFA97", "\uFA97"], /* CJK COMPATIBILITY IDEOGRAPH-FA97 */
+ ["\uFA98", "\uFA98"], /* CJK COMPATIBILITY IDEOGRAPH-FA98 */
+ ["\uFA99", "\uFA99"], /* CJK COMPATIBILITY IDEOGRAPH-FA99 */
+ ["\uFA9A", "\uFA9A"], /* CJK COMPATIBILITY IDEOGRAPH-FA9A */
+ ["\uFA9B", "\uFA9B"], /* CJK COMPATIBILITY IDEOGRAPH-FA9B */
+ ["\uFA9C", "\uFA9C"], /* CJK COMPATIBILITY IDEOGRAPH-FA9C */
+ ["\uFA9D", "\uFA9D"], /* CJK COMPATIBILITY IDEOGRAPH-FA9D */
+ ["\uFA9E", "\uFA9E"], /* CJK COMPATIBILITY IDEOGRAPH-FA9E */
+ ["\uFA9F", "\uFA9F"], /* CJK COMPATIBILITY IDEOGRAPH-FA9F */
+ ["\uFAA0", "\uFAA0"], /* CJK COMPATIBILITY IDEOGRAPH-FAA0 */
+ ["\uFAA1", "\uFAA1"], /* CJK COMPATIBILITY IDEOGRAPH-FAA1 */
+ ["\uFAA2", "\uFAA2"], /* CJK COMPATIBILITY IDEOGRAPH-FAA2 */
+ ["\uFAA3", "\uFAA3"], /* CJK COMPATIBILITY IDEOGRAPH-FAA3 */
+ ["\uFAA4", "\uFAA4"], /* CJK COMPATIBILITY IDEOGRAPH-FAA4 */
+ ["\uFAA5", "\uFAA5"], /* CJK COMPATIBILITY IDEOGRAPH-FAA5 */
+ ["\uFAA6", "\uFAA6"], /* CJK COMPATIBILITY IDEOGRAPH-FAA6 */
+ ["\uFAA7", "\uFAA7"], /* CJK COMPATIBILITY IDEOGRAPH-FAA7 */
+ ["\uFAA8", "\uFAA8"], /* CJK COMPATIBILITY IDEOGRAPH-FAA8 */
+ ["\uFAA9", "\uFAA9"], /* CJK COMPATIBILITY IDEOGRAPH-FAA9 */
+ ["\uFAAA", "\uFAAA"], /* CJK COMPATIBILITY IDEOGRAPH-FAAA */
+ ["\uFAAB", "\uFAAB"], /* CJK COMPATIBILITY IDEOGRAPH-FAAB */
+ ["\uFAAC", "\uFAAC"], /* CJK COMPATIBILITY IDEOGRAPH-FAAC */
+ ["\uFAAD", "\uFAAD"], /* CJK COMPATIBILITY IDEOGRAPH-FAAD */
+ ["\uFAAE", "\uFAAE"], /* CJK COMPATIBILITY IDEOGRAPH-FAAE */
+ ["\uFAAF", "\uFAAF"], /* CJK COMPATIBILITY IDEOGRAPH-FAAF */
+ ["\uFAB0", "\uFAB0"], /* CJK COMPATIBILITY IDEOGRAPH-FAB0 */
+ ["\uFAB1", "\uFAB1"], /* CJK COMPATIBILITY IDEOGRAPH-FAB1 */
+ ["\uFAB2", "\uFAB2"], /* CJK COMPATIBILITY IDEOGRAPH-FAB2 */
+ ["\uFAB3", "\uFAB3"], /* CJK COMPATIBILITY IDEOGRAPH-FAB3 */
+ ["\uFAB4", "\uFAB4"], /* CJK COMPATIBILITY IDEOGRAPH-FAB4 */
+ ["\uFAB5", "\uFAB5"], /* CJK COMPATIBILITY IDEOGRAPH-FAB5 */
+ ["\uFAB6", "\uFAB6"], /* CJK COMPATIBILITY IDEOGRAPH-FAB6 */
+ ["\uFAB7", "\uFAB7"], /* CJK COMPATIBILITY IDEOGRAPH-FAB7 */
+ ["\uFAB8", "\uFAB8"], /* CJK COMPATIBILITY IDEOGRAPH-FAB8 */
+ ["\uFAB9", "\uFAB9"], /* CJK COMPATIBILITY IDEOGRAPH-FAB9 */
+ ["\uFABA", "\uFABA"], /* CJK COMPATIBILITY IDEOGRAPH-FABA */
+ ["\uFABB", "\uFABB"], /* CJK COMPATIBILITY IDEOGRAPH-FABB */
+ ["\uFABC", "\uFABC"], /* CJK COMPATIBILITY IDEOGRAPH-FABC */
+ ["\uFABD", "\uFABD"], /* CJK COMPATIBILITY IDEOGRAPH-FABD */
+ ["\uFABE", "\uFABE"], /* CJK COMPATIBILITY IDEOGRAPH-FABE */
+ ["\uFABF", "\uFABF"], /* CJK COMPATIBILITY IDEOGRAPH-FABF */
+ ["\uFAC0", "\uFAC0"], /* CJK COMPATIBILITY IDEOGRAPH-FAC0 */
+ ["\uFAC1", "\uFAC1"], /* CJK COMPATIBILITY IDEOGRAPH-FAC1 */
+ ["\uFAC2", "\uFAC2"], /* CJK COMPATIBILITY IDEOGRAPH-FAC2 */
+ ["\uFAC3", "\uFAC3"], /* CJK COMPATIBILITY IDEOGRAPH-FAC3 */
+ ["\uFAC4", "\uFAC4"], /* CJK COMPATIBILITY IDEOGRAPH-FAC4 */
+ ["\uFAC5", "\uFAC5"], /* CJK COMPATIBILITY IDEOGRAPH-FAC5 */
+ ["\uFAC6", "\uFAC6"], /* CJK COMPATIBILITY IDEOGRAPH-FAC6 */
+ ["\uFAC7", "\uFAC7"], /* CJK COMPATIBILITY IDEOGRAPH-FAC7 */
+ ["\uFAC8", "\uFAC8"], /* CJK COMPATIBILITY IDEOGRAPH-FAC8 */
+ ["\uFAC9", "\uFAC9"], /* CJK COMPATIBILITY IDEOGRAPH-FAC9 */
+ ["\uFACA", "\uFACA"], /* CJK COMPATIBILITY IDEOGRAPH-FACA */
+ ["\uFACB", "\uFACB"], /* CJK COMPATIBILITY IDEOGRAPH-FACB */
+ ["\uFACC", "\uFACC"], /* CJK COMPATIBILITY IDEOGRAPH-FACC */
+ ["\uFACD", "\uFACD"], /* CJK COMPATIBILITY IDEOGRAPH-FACD */
+ ["\uFACE", "\uFACE"], /* CJK COMPATIBILITY IDEOGRAPH-FACE */
+ ["\uFACF", "\uFACF"], /* CJK COMPATIBILITY IDEOGRAPH-FACF */
+ ["\uFAD0", "\uFAD0"], /* CJK COMPATIBILITY IDEOGRAPH-FAD0 */
+ ["\uFAD1", "\uFAD1"], /* CJK COMPATIBILITY IDEOGRAPH-FAD1 */
+ ["\uFAD2", "\uFAD2"], /* CJK COMPATIBILITY IDEOGRAPH-FAD2 */
+ ["\uFAD3", "\uFAD3"], /* CJK COMPATIBILITY IDEOGRAPH-FAD3 */
+ ["\uFAD4", "\uFAD4"], /* CJK COMPATIBILITY IDEOGRAPH-FAD4 */
+ ["\uFAD5", "\uFAD5"], /* CJK COMPATIBILITY IDEOGRAPH-FAD5 */
+ ["\uFAD6", "\uFAD6"], /* CJK COMPATIBILITY IDEOGRAPH-FAD6 */
+ ["\uFAD7", "\uFAD7"], /* CJK COMPATIBILITY IDEOGRAPH-FAD7 */
+ ["\uFAD8", "\uFAD8"], /* CJK COMPATIBILITY IDEOGRAPH-FAD8 */
+ ["\uFAD9", "\uFAD9"], /* CJK COMPATIBILITY IDEOGRAPH-FAD9 */
+ ["\uFADA", "\uFADA"],
+ ["\uFADB", "\uFADB"],
+ ["\uFADC", "\uFADC"],
+ ["\uFADD", "\uFADD"],
+ ["\uFADE", "\uFADE"],
+ ["\uFADF", "\uFADF"],
+ ["\uFAE0", "\uFAE0"],
+ ["\uFAE1", "\uFAE1"],
+ ["\uFAE2", "\uFAE2"],
+ ["\uFAE3", "\uFAE3"],
+ ["\uFAE4", "\uFAE4"],
+ ["\uFAE5", "\uFAE5"],
+ ["\uFAE6", "\uFAE6"],
+ ["\uFAE7", "\uFAE7"],
+ ["\uFAE8", "\uFAE8"],
+ ["\uFAE9", "\uFAE9"],
+ ["\uFAEA", "\uFAEA"],
+ ["\uFAEB", "\uFAEB"],
+ ["\uFAEC", "\uFAEC"],
+ ["\uFAED", "\uFAED"],
+ ["\uFAEE", "\uFAEE"],
+ ["\uFAEF", "\uFAEF"],
+ ["\uFAF0", "\uFAF0"],
+ ["\uFAF1", "\uFAF1"],
+ ["\uFAF2", "\uFAF2"],
+ ["\uFAF3", "\uFAF3"],
+ ["\uFAF4", "\uFAF4"],
+ ["\uFAF5", "\uFAF5"],
+ ["\uFAF6", "\uFAF6"],
+ ["\uFAF7", "\uFAF7"],
+ ["\uFAF8", "\uFAF8"],
+ ["\uFAF9", "\uFAF9"],
+ ["\uFAFA", "\uFAFA"],
+ ["\uFAFB", "\uFAFB"],
+ ["\uFAFC", "\uFAFC"],
+ ["\uFAFD", "\uFAFD"],
+ ["\uFAFE", "\uFAFE"],
+ ["\uFAFF", "\uFAFF"],
+ ["\u0046\u0046", "\uFB00"], /* LATIN SMALL LIGATURE FF */
+ ["\u0046\u0049", "\uFB01"], /* LATIN SMALL LIGATURE FI */
+ ["\u0046\u004C", "\uFB02"], /* LATIN SMALL LIGATURE FL */
+ ["\u0046\u0046\u0049", "\uFB03"], /* LATIN SMALL LIGATURE FFI */
+ ["\u0046\u0046\u004C", "\uFB04"], /* LATIN SMALL LIGATURE FFL */
+ ["\u0053\u0054", "\uFB05"], /* LATIN SMALL LIGATURE LONG S T */
+ ["\u0053\u0054", "\uFB06"], /* LATIN SMALL LIGATURE ST */
+ ["\uFB07", "\uFB07"],
+ ["\uFB08", "\uFB08"],
+ ["\uFB09", "\uFB09"],
+ ["\uFB0A", "\uFB0A"],
+ ["\uFB0B", "\uFB0B"],
+ ["\uFB0C", "\uFB0C"],
+ ["\uFB0D", "\uFB0D"],
+ ["\uFB0E", "\uFB0E"],
+ ["\uFB0F", "\uFB0F"],
+ ["\uFB10", "\uFB10"],
+ ["\uFB11", "\uFB11"],
+ ["\uFB12", "\uFB12"],
+ ["\u0544\u0546", "\uFB13"], /* ARMENIAN SMALL LIGATURE MEN NOW */
+ ["\u0544\u0535", "\uFB14"], /* ARMENIAN SMALL LIGATURE MEN ECH */
+ ["\u0544\u053B", "\uFB15"], /* ARMENIAN SMALL LIGATURE MEN INI */
+ ["\u054E\u0546", "\uFB16"], /* ARMENIAN SMALL LIGATURE VEW NOW */
+ ["\u0544\u053D", "\uFB17"], /* ARMENIAN SMALL LIGATURE MEN XEH */
+ ["\uFB18", "\uFB18"],
+ ["\uFB19", "\uFB19"],
+ ["\uFB1A", "\uFB1A"],
+ ["\uFB1B", "\uFB1B"],
+ ["\uFB1C", "\uFB1C"],
+ ["\uFB1D", "\uFB1D"], /* HEBREW LETTER YOD WITH HIRIQ */
+ ["\uFB1E", "\uFB1E"], /* HEBREW POINT JUDEO-SPANISH VARIKA (HEBREW POINT VARIKA) */
+ ["\uFB1F", "\uFB1F"], /* HEBREW LIGATURE YIDDISH YOD YOD PATAH */
+ ["\uFB20", "\uFB20"], /* HEBREW LETTER ALTERNATIVE AYIN */
+ ["\uFB21", "\uFB21"], /* HEBREW LETTER WIDE ALEF */
+ ["\uFB22", "\uFB22"], /* HEBREW LETTER WIDE DALET */
+ ["\uFB23", "\uFB23"], /* HEBREW LETTER WIDE HE */
+ ["\uFB24", "\uFB24"], /* HEBREW LETTER WIDE KAF */
+ ["\uFB25", "\uFB25"], /* HEBREW LETTER WIDE LAMED */
+ ["\uFB26", "\uFB26"], /* HEBREW LETTER WIDE FINAL MEM */
+ ["\uFB27", "\uFB27"], /* HEBREW LETTER WIDE RESH */
+ ["\uFB28", "\uFB28"], /* HEBREW LETTER WIDE TAV */
+ ["\uFB29", "\uFB29"], /* HEBREW LETTER ALTERNATIVE PLUS SIGN */
+ ["\uFB2A", "\uFB2A"], /* HEBREW LETTER SHIN WITH SHIN DOT */
+ ["\uFB2B", "\uFB2B"], /* HEBREW LETTER SHIN WITH SIN DOT */
+ ["\uFB2C", "\uFB2C"], /* HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT */
+ ["\uFB2D", "\uFB2D"], /* HEBREW LETTER SHIN WITH DAGESH AND SIN DOT */
+ ["\uFB2E", "\uFB2E"], /* HEBREW LETTER ALEF WITH PATAH */
+ ["\uFB2F", "\uFB2F"], /* HEBREW LETTER ALEF WITH QAMATS */
+ ["\uFB30", "\uFB30"], /* HEBREW LETTER ALEF WITH MAPIQ */
+ ["\uFB31", "\uFB31"], /* HEBREW LETTER BET WITH DAGESH */
+ ["\uFB32", "\uFB32"], /* HEBREW LETTER GIMEL WITH DAGESH */
+ ["\uFB33", "\uFB33"], /* HEBREW LETTER DALET WITH DAGESH */
+ ["\uFB34", "\uFB34"], /* HEBREW LETTER HE WITH MAPIQ */
+ ["\uFB35", "\uFB35"], /* HEBREW LETTER VAV WITH DAGESH */
+ ["\uFB36", "\uFB36"], /* HEBREW LETTER ZAYIN WITH DAGESH */
+ ["\uFB37", "\uFB37"],
+ ["\uFB38", "\uFB38"], /* HEBREW LETTER TET WITH DAGESH */
+ ["\uFB39", "\uFB39"], /* HEBREW LETTER YOD WITH DAGESH */
+ ["\uFB3A", "\uFB3A"], /* HEBREW LETTER FINAL KAF WITH DAGESH */
+ ["\uFB3B", "\uFB3B"], /* HEBREW LETTER KAF WITH DAGESH */
+ ["\uFB3C", "\uFB3C"], /* HEBREW LETTER LAMED WITH DAGESH */
+ ["\uFB3D", "\uFB3D"],
+ ["\uFB3E", "\uFB3E"], /* HEBREW LETTER MEM WITH DAGESH */
+ ["\uFB3F", "\uFB3F"],
+ ["\uFB40", "\uFB40"], /* HEBREW LETTER NUN WITH DAGESH */
+ ["\uFB41", "\uFB41"], /* HEBREW LETTER SAMEKH WITH DAGESH */
+ ["\uFB42", "\uFB42"],
+ ["\uFB43", "\uFB43"], /* HEBREW LETTER FINAL PE WITH DAGESH */
+ ["\uFB44", "\uFB44"], /* HEBREW LETTER PE WITH DAGESH */
+ ["\uFB45", "\uFB45"],
+ ["\uFB46", "\uFB46"], /* HEBREW LETTER TSADI WITH DAGESH */
+ ["\uFB47", "\uFB47"], /* HEBREW LETTER QOF WITH DAGESH */
+ ["\uFB48", "\uFB48"], /* HEBREW LETTER RESH WITH DAGESH */
+ ["\uFB49", "\uFB49"], /* HEBREW LETTER SHIN WITH DAGESH */
+ ["\uFB4A", "\uFB4A"], /* HEBREW LETTER TAV WITH DAGESH */
+ ["\uFB4B", "\uFB4B"], /* HEBREW LETTER VAV WITH HOLAM */
+ ["\uFB4C", "\uFB4C"], /* HEBREW LETTER BET WITH RAFE */
+ ["\uFB4D", "\uFB4D"], /* HEBREW LETTER KAF WITH RAFE */
+ ["\uFB4E", "\uFB4E"], /* HEBREW LETTER PE WITH RAFE */
+ ["\uFB4F", "\uFB4F"], /* HEBREW LIGATURE ALEF LAMED */
+ ["\uFB50", "\uFB50"], /* ARABIC LETTER ALEF WASLA ISOLATED FORM */
+ ["\uFB51", "\uFB51"], /* ARABIC LETTER ALEF WASLA FINAL FORM */
+ ["\uFB52", "\uFB52"], /* ARABIC LETTER BEEH ISOLATED FORM */
+ ["\uFB53", "\uFB53"], /* ARABIC LETTER BEEH FINAL FORM */
+ ["\uFB54", "\uFB54"], /* ARABIC LETTER BEEH INITIAL FORM */
+ ["\uFB55", "\uFB55"], /* ARABIC LETTER BEEH MEDIAL FORM */
+ ["\uFB56", "\uFB56"], /* ARABIC LETTER PEH ISOLATED FORM */
+ ["\uFB57", "\uFB57"], /* ARABIC LETTER PEH FINAL FORM */
+ ["\uFB58", "\uFB58"], /* ARABIC LETTER PEH INITIAL FORM */
+ ["\uFB59", "\uFB59"], /* ARABIC LETTER PEH MEDIAL FORM */
+ ["\uFB5A", "\uFB5A"], /* ARABIC LETTER BEHEH ISOLATED FORM */
+ ["\uFB5B", "\uFB5B"], /* ARABIC LETTER BEHEH FINAL FORM */
+ ["\uFB5C", "\uFB5C"], /* ARABIC LETTER BEHEH INITIAL FORM */
+ ["\uFB5D", "\uFB5D"], /* ARABIC LETTER BEHEH MEDIAL FORM */
+ ["\uFB5E", "\uFB5E"], /* ARABIC LETTER TTEHEH ISOLATED FORM */
+ ["\uFB5F", "\uFB5F"], /* ARABIC LETTER TTEHEH FINAL FORM */
+ ["\uFB60", "\uFB60"], /* ARABIC LETTER TTEHEH INITIAL FORM */
+ ["\uFB61", "\uFB61"], /* ARABIC LETTER TTEHEH MEDIAL FORM */
+ ["\uFB62", "\uFB62"], /* ARABIC LETTER TEHEH ISOLATED FORM */
+ ["\uFB63", "\uFB63"], /* ARABIC LETTER TEHEH FINAL FORM */
+ ["\uFB64", "\uFB64"], /* ARABIC LETTER TEHEH INITIAL FORM */
+ ["\uFB65", "\uFB65"], /* ARABIC LETTER TEHEH MEDIAL FORM */
+ ["\uFB66", "\uFB66"], /* ARABIC LETTER TTEH ISOLATED FORM */
+ ["\uFB67", "\uFB67"], /* ARABIC LETTER TTEH FINAL FORM */
+ ["\uFB68", "\uFB68"], /* ARABIC LETTER TTEH INITIAL FORM */
+ ["\uFB69", "\uFB69"], /* ARABIC LETTER TTEH MEDIAL FORM */
+ ["\uFB6A", "\uFB6A"], /* ARABIC LETTER VEH ISOLATED FORM */
+ ["\uFB6B", "\uFB6B"], /* ARABIC LETTER VEH FINAL FORM */
+ ["\uFB6C", "\uFB6C"], /* ARABIC LETTER VEH INITIAL FORM */
+ ["\uFB6D", "\uFB6D"], /* ARABIC LETTER VEH MEDIAL FORM */
+ ["\uFB6E", "\uFB6E"], /* ARABIC LETTER PEHEH ISOLATED FORM */
+ ["\uFB6F", "\uFB6F"], /* ARABIC LETTER PEHEH FINAL FORM */
+ ["\uFB70", "\uFB70"], /* ARABIC LETTER PEHEH INITIAL FORM */
+ ["\uFB71", "\uFB71"], /* ARABIC LETTER PEHEH MEDIAL FORM */
+ ["\uFB72", "\uFB72"], /* ARABIC LETTER DYEH ISOLATED FORM */
+ ["\uFB73", "\uFB73"], /* ARABIC LETTER DYEH FINAL FORM */
+ ["\uFB74", "\uFB74"], /* ARABIC LETTER DYEH INITIAL FORM */
+ ["\uFB75", "\uFB75"], /* ARABIC LETTER DYEH MEDIAL FORM */
+ ["\uFB76", "\uFB76"], /* ARABIC LETTER NYEH ISOLATED FORM */
+ ["\uFB77", "\uFB77"], /* ARABIC LETTER NYEH FINAL FORM */
+ ["\uFB78", "\uFB78"], /* ARABIC LETTER NYEH INITIAL FORM */
+ ["\uFB79", "\uFB79"], /* ARABIC LETTER NYEH MEDIAL FORM */
+ ["\uFB7A", "\uFB7A"], /* ARABIC LETTER TCHEH ISOLATED FORM */
+ ["\uFB7B", "\uFB7B"], /* ARABIC LETTER TCHEH FINAL FORM */
+ ["\uFB7C", "\uFB7C"], /* ARABIC LETTER TCHEH INITIAL FORM */
+ ["\uFB7D", "\uFB7D"], /* ARABIC LETTER TCHEH MEDIAL FORM */
+ ["\uFB7E", "\uFB7E"], /* ARABIC LETTER TCHEHEH ISOLATED FORM */
+ ["\uFB7F", "\uFB7F"], /* ARABIC LETTER TCHEHEH FINAL FORM */
+ ["\uFB80", "\uFB80"], /* ARABIC LETTER TCHEHEH INITIAL FORM */
+ ["\uFB81", "\uFB81"], /* ARABIC LETTER TCHEHEH MEDIAL FORM */
+ ["\uFB82", "\uFB82"], /* ARABIC LETTER DDAHAL ISOLATED FORM */
+ ["\uFB83", "\uFB83"], /* ARABIC LETTER DDAHAL FINAL FORM */
+ ["\uFB84", "\uFB84"], /* ARABIC LETTER DAHAL ISOLATED FORM */
+ ["\uFB85", "\uFB85"], /* ARABIC LETTER DAHAL FINAL FORM */
+ ["\uFB86", "\uFB86"], /* ARABIC LETTER DUL ISOLATED FORM */
+ ["\uFB87", "\uFB87"], /* ARABIC LETTER DUL FINAL FORM */
+ ["\uFB88", "\uFB88"], /* ARABIC LETTER DDAL ISOLATED FORM */
+ ["\uFB89", "\uFB89"], /* ARABIC LETTER DDAL FINAL FORM */
+ ["\uFB8A", "\uFB8A"], /* ARABIC LETTER JEH ISOLATED FORM */
+ ["\uFB8B", "\uFB8B"], /* ARABIC LETTER JEH FINAL FORM */
+ ["\uFB8C", "\uFB8C"], /* ARABIC LETTER RREH ISOLATED FORM */
+ ["\uFB8D", "\uFB8D"], /* ARABIC LETTER RREH FINAL FORM */
+ ["\uFB8E", "\uFB8E"], /* ARABIC LETTER KEHEH ISOLATED FORM */
+ ["\uFB8F", "\uFB8F"], /* ARABIC LETTER KEHEH FINAL FORM */
+ ["\uFB90", "\uFB90"], /* ARABIC LETTER KEHEH INITIAL FORM */
+ ["\uFB91", "\uFB91"], /* ARABIC LETTER KEHEH MEDIAL FORM */
+ ["\uFB92", "\uFB92"], /* ARABIC LETTER GAF ISOLATED FORM */
+ ["\uFB93", "\uFB93"], /* ARABIC LETTER GAF FINAL FORM */
+ ["\uFB94", "\uFB94"], /* ARABIC LETTER GAF INITIAL FORM */
+ ["\uFB95", "\uFB95"], /* ARABIC LETTER GAF MEDIAL FORM */
+ ["\uFB96", "\uFB96"], /* ARABIC LETTER GUEH ISOLATED FORM */
+ ["\uFB97", "\uFB97"], /* ARABIC LETTER GUEH FINAL FORM */
+ ["\uFB98", "\uFB98"], /* ARABIC LETTER GUEH INITIAL FORM */
+ ["\uFB99", "\uFB99"], /* ARABIC LETTER GUEH MEDIAL FORM */
+ ["\uFB9A", "\uFB9A"], /* ARABIC LETTER NGOEH ISOLATED FORM */
+ ["\uFB9B", "\uFB9B"], /* ARABIC LETTER NGOEH FINAL FORM */
+ ["\uFB9C", "\uFB9C"], /* ARABIC LETTER NGOEH INITIAL FORM */
+ ["\uFB9D", "\uFB9D"], /* ARABIC LETTER NGOEH MEDIAL FORM */
+ ["\uFB9E", "\uFB9E"], /* ARABIC LETTER NOON GHUNNA ISOLATED FORM */
+ ["\uFB9F", "\uFB9F"], /* ARABIC LETTER NOON GHUNNA FINAL FORM */
+ ["\uFBA0", "\uFBA0"], /* ARABIC LETTER RNOON ISOLATED FORM */
+ ["\uFBA1", "\uFBA1"], /* ARABIC LETTER RNOON FINAL FORM */
+ ["\uFBA2", "\uFBA2"], /* ARABIC LETTER RNOON INITIAL FORM */
+ ["\uFBA3", "\uFBA3"], /* ARABIC LETTER RNOON MEDIAL FORM */
+ ["\uFBA4", "\uFBA4"], /* ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM */
+ ["\uFBA5", "\uFBA5"], /* ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM */
+ ["\uFBA6", "\uFBA6"], /* ARABIC LETTER HEH GOAL ISOLATED FORM */
+ ["\uFBA7", "\uFBA7"], /* ARABIC LETTER HEH GOAL FINAL FORM */
+ ["\uFBA8", "\uFBA8"], /* ARABIC LETTER HEH GOAL INITIAL FORM */
+ ["\uFBA9", "\uFBA9"], /* ARABIC LETTER HEH GOAL MEDIAL FORM */
+ ["\uFBAA", "\uFBAA"], /* ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM */
+ ["\uFBAB", "\uFBAB"], /* ARABIC LETTER HEH DOACHASHMEE FINAL FORM */
+ ["\uFBAC", "\uFBAC"], /* ARABIC LETTER HEH DOACHASHMEE INITIAL FORM */
+ ["\uFBAD", "\uFBAD"], /* ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM */
+ ["\uFBAE", "\uFBAE"], /* ARABIC LETTER YEH BARREE ISOLATED FORM */
+ ["\uFBAF", "\uFBAF"], /* ARABIC LETTER YEH BARREE FINAL FORM */
+ ["\uFBB0", "\uFBB0"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM */
+ ["\uFBB1", "\uFBB1"], /* ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM */
+ ["\uFBB2", "\uFBB2"], /* ARABIC SYMBOL DOT ABOVE */
+ ["\uFBB3", "\uFBB3"], /* ARABIC SYMBOL DOT BELOW */
+ ["\uFBB4", "\uFBB4"], /* ARABIC SYMBOL TWO DOTS ABOVE */
+ ["\uFBB5", "\uFBB5"], /* ARABIC SYMBOL TWO DOTS BELOW */
+ ["\uFBB6", "\uFBB6"], /* ARABIC SYMBOL THREE DOTS ABOVE */
+ ["\uFBB7", "\uFBB7"], /* ARABIC SYMBOL THREE DOTS BELOW */
+ ["\uFBB8", "\uFBB8"], /* ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE */
+ ["\uFBB9", "\uFBB9"], /* ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW */
+ ["\uFBBA", "\uFBBA"], /* ARABIC SYMBOL FOUR DOTS ABOVE */
+ ["\uFBBB", "\uFBBB"], /* ARABIC SYMBOL FOUR DOTS BELOW */
+ ["\uFBBC", "\uFBBC"], /* ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW */
+ ["\uFBBD", "\uFBBD"], /* ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE */
+ ["\uFBBE", "\uFBBE"], /* ARABIC SYMBOL TWO DOTS VERTICALLY BELOW */
+ ["\uFBBF", "\uFBBF"], /* ARABIC SYMBOL RING */
+ ["\uFBC0", "\uFBC0"], /* ARABIC SYMBOL SMALL TAH ABOVE */
+ ["\uFBC1", "\uFBC1"], /* ARABIC SYMBOL SMALL TAH BELOW */
+ ["\uFBC2", "\uFBC2"],
+ ["\uFBC3", "\uFBC3"],
+ ["\uFBC4", "\uFBC4"],
+ ["\uFBC5", "\uFBC5"],
+ ["\uFBC6", "\uFBC6"],
+ ["\uFBC7", "\uFBC7"],
+ ["\uFBC8", "\uFBC8"],
+ ["\uFBC9", "\uFBC9"],
+ ["\uFBCA", "\uFBCA"],
+ ["\uFBCB", "\uFBCB"],
+ ["\uFBCC", "\uFBCC"],
+ ["\uFBCD", "\uFBCD"],
+ ["\uFBCE", "\uFBCE"],
+ ["\uFBCF", "\uFBCF"],
+ ["\uFBD0", "\uFBD0"],
+ ["\uFBD1", "\uFBD1"],
+ ["\uFBD2", "\uFBD2"],
+ ["\uFBD3", "\uFBD3"], /* ARABIC LETTER NG ISOLATED FORM */
+ ["\uFBD4", "\uFBD4"], /* ARABIC LETTER NG FINAL FORM */
+ ["\uFBD5", "\uFBD5"], /* ARABIC LETTER NG INITIAL FORM */
+ ["\uFBD6", "\uFBD6"], /* ARABIC LETTER NG MEDIAL FORM */
+ ["\uFBD7", "\uFBD7"], /* ARABIC LETTER U ISOLATED FORM */
+ ["\uFBD8", "\uFBD8"], /* ARABIC LETTER U FINAL FORM */
+ ["\uFBD9", "\uFBD9"], /* ARABIC LETTER OE ISOLATED FORM */
+ ["\uFBDA", "\uFBDA"], /* ARABIC LETTER OE FINAL FORM */
+ ["\uFBDB", "\uFBDB"], /* ARABIC LETTER YU ISOLATED FORM */
+ ["\uFBDC", "\uFBDC"], /* ARABIC LETTER YU FINAL FORM */
+ ["\uFBDD", "\uFBDD"], /* ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM */
+ ["\uFBDE", "\uFBDE"], /* ARABIC LETTER VE ISOLATED FORM */
+ ["\uFBDF", "\uFBDF"], /* ARABIC LETTER VE FINAL FORM */
+ ["\uFBE0", "\uFBE0"], /* ARABIC LETTER KIRGHIZ OE ISOLATED FORM */
+ ["\uFBE1", "\uFBE1"], /* ARABIC LETTER KIRGHIZ OE FINAL FORM */
+ ["\uFBE2", "\uFBE2"], /* ARABIC LETTER KIRGHIZ YU ISOLATED FORM */
+ ["\uFBE3", "\uFBE3"], /* ARABIC LETTER KIRGHIZ YU FINAL FORM */
+ ["\uFBE4", "\uFBE4"], /* ARABIC LETTER E ISOLATED FORM */
+ ["\uFBE5", "\uFBE5"], /* ARABIC LETTER E FINAL FORM */
+ ["\uFBE6", "\uFBE6"], /* ARABIC LETTER E INITIAL FORM */
+ ["\uFBE7", "\uFBE7"], /* ARABIC LETTER E MEDIAL FORM */
+ ["\uFBE8", "\uFBE8"], /* ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM */
+ ["\uFBE9", "\uFBE9"], /* ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM */
+ ["\uFBEA", "\uFBEA"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM */
+ ["\uFBEB", "\uFBEB"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM */
+ ["\uFBEC", "\uFBEC"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM */
+ ["\uFBED", "\uFBED"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM */
+ ["\uFBEE", "\uFBEE"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM */
+ ["\uFBEF", "\uFBEF"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM */
+ ["\uFBF0", "\uFBF0"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM */
+ ["\uFBF1", "\uFBF1"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM */
+ ["\uFBF2", "\uFBF2"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM */
+ ["\uFBF3", "\uFBF3"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM */
+ ["\uFBF4", "\uFBF4"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM */
+ ["\uFBF5", "\uFBF5"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM */
+ ["\uFBF6", "\uFBF6"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM */
+ ["\uFBF7", "\uFBF7"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM */
+ ["\uFBF8", "\uFBF8"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM */
+ ["\uFBF9", "\uFBF9"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFBFA", "\uFBFA"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM */
+ ["\uFBFB", "\uFBFB"], /* ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM */
+ ["\uFBFC", "\uFBFC"], /* ARABIC LETTER FARSI YEH ISOLATED FORM */
+ ["\uFBFD", "\uFBFD"], /* ARABIC LETTER FARSI YEH FINAL FORM */
+ ["\uFBFE", "\uFBFE"], /* ARABIC LETTER FARSI YEH INITIAL FORM */
+ ["\uFBFF", "\uFBFF"], /* ARABIC LETTER FARSI YEH MEDIAL FORM */
+ ["\uFC00", "\uFC00"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM */
+ ["\uFC01", "\uFC01"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM */
+ ["\uFC02", "\uFC02"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM */
+ ["\uFC03", "\uFC03"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC04", "\uFC04"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM */
+ ["\uFC05", "\uFC05"], /* ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM */
+ ["\uFC06", "\uFC06"], /* ARABIC LIGATURE BEH WITH HAH ISOLATED FORM */
+ ["\uFC07", "\uFC07"], /* ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM */
+ ["\uFC08", "\uFC08"], /* ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM */
+ ["\uFC09", "\uFC09"], /* ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC0A", "\uFC0A"], /* ARABIC LIGATURE BEH WITH YEH ISOLATED FORM */
+ ["\uFC0B", "\uFC0B"], /* ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM */
+ ["\uFC0C", "\uFC0C"], /* ARABIC LIGATURE TEH WITH HAH ISOLATED FORM */
+ ["\uFC0D", "\uFC0D"], /* ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM */
+ ["\uFC0E", "\uFC0E"], /* ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM */
+ ["\uFC0F", "\uFC0F"], /* ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC10", "\uFC10"], /* ARABIC LIGATURE TEH WITH YEH ISOLATED FORM */
+ ["\uFC11", "\uFC11"], /* ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM */
+ ["\uFC12", "\uFC12"], /* ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM */
+ ["\uFC13", "\uFC13"], /* ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC14", "\uFC14"], /* ARABIC LIGATURE THEH WITH YEH ISOLATED FORM */
+ ["\uFC15", "\uFC15"], /* ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM */
+ ["\uFC16", "\uFC16"], /* ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM */
+ ["\uFC17", "\uFC17"], /* ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM */
+ ["\uFC18", "\uFC18"], /* ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM */
+ ["\uFC19", "\uFC19"], /* ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM */
+ ["\uFC1A", "\uFC1A"], /* ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM */
+ ["\uFC1B", "\uFC1B"], /* ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM */
+ ["\uFC1C", "\uFC1C"], /* ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM */
+ ["\uFC1D", "\uFC1D"], /* ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM */
+ ["\uFC1E", "\uFC1E"], /* ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM */
+ ["\uFC1F", "\uFC1F"], /* ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM */
+ ["\uFC20", "\uFC20"], /* ARABIC LIGATURE SAD WITH HAH ISOLATED FORM */
+ ["\uFC21", "\uFC21"], /* ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM */
+ ["\uFC22", "\uFC22"], /* ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM */
+ ["\uFC23", "\uFC23"], /* ARABIC LIGATURE DAD WITH HAH ISOLATED FORM */
+ ["\uFC24", "\uFC24"], /* ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM */
+ ["\uFC25", "\uFC25"], /* ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM */
+ ["\uFC26", "\uFC26"], /* ARABIC LIGATURE TAH WITH HAH ISOLATED FORM */
+ ["\uFC27", "\uFC27"], /* ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM */
+ ["\uFC28", "\uFC28"], /* ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM */
+ ["\uFC29", "\uFC29"], /* ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM */
+ ["\uFC2A", "\uFC2A"], /* ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM */
+ ["\uFC2B", "\uFC2B"], /* ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM */
+ ["\uFC2C", "\uFC2C"], /* ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM */
+ ["\uFC2D", "\uFC2D"], /* ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM */
+ ["\uFC2E", "\uFC2E"], /* ARABIC LIGATURE FEH WITH HAH ISOLATED FORM */
+ ["\uFC2F", "\uFC2F"], /* ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM */
+ ["\uFC30", "\uFC30"], /* ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM */
+ ["\uFC31", "\uFC31"], /* ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC32", "\uFC32"], /* ARABIC LIGATURE FEH WITH YEH ISOLATED FORM */
+ ["\uFC33", "\uFC33"], /* ARABIC LIGATURE QAF WITH HAH ISOLATED FORM */
+ ["\uFC34", "\uFC34"], /* ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM */
+ ["\uFC35", "\uFC35"], /* ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC36", "\uFC36"], /* ARABIC LIGATURE QAF WITH YEH ISOLATED FORM */
+ ["\uFC37", "\uFC37"], /* ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM */
+ ["\uFC38", "\uFC38"], /* ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM */
+ ["\uFC39", "\uFC39"], /* ARABIC LIGATURE KAF WITH HAH ISOLATED FORM */
+ ["\uFC3A", "\uFC3A"], /* ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM */
+ ["\uFC3B", "\uFC3B"], /* ARABIC LIGATURE KAF WITH LAM ISOLATED FORM */
+ ["\uFC3C", "\uFC3C"], /* ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM */
+ ["\uFC3D", "\uFC3D"], /* ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC3E", "\uFC3E"], /* ARABIC LIGATURE KAF WITH YEH ISOLATED FORM */
+ ["\uFC3F", "\uFC3F"], /* ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM */
+ ["\uFC40", "\uFC40"], /* ARABIC LIGATURE LAM WITH HAH ISOLATED FORM */
+ ["\uFC41", "\uFC41"], /* ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM */
+ ["\uFC42", "\uFC42"], /* ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM */
+ ["\uFC43", "\uFC43"], /* ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC44", "\uFC44"], /* ARABIC LIGATURE LAM WITH YEH ISOLATED FORM */
+ ["\uFC45", "\uFC45"], /* ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM */
+ ["\uFC46", "\uFC46"], /* ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM */
+ ["\uFC47", "\uFC47"], /* ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM */
+ ["\uFC48", "\uFC48"], /* ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM */
+ ["\uFC49", "\uFC49"], /* ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC4A", "\uFC4A"], /* ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM */
+ ["\uFC4B", "\uFC4B"], /* ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM */
+ ["\uFC4C", "\uFC4C"], /* ARABIC LIGATURE NOON WITH HAH ISOLATED FORM */
+ ["\uFC4D", "\uFC4D"], /* ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM */
+ ["\uFC4E", "\uFC4E"], /* ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM */
+ ["\uFC4F", "\uFC4F"], /* ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC50", "\uFC50"], /* ARABIC LIGATURE NOON WITH YEH ISOLATED FORM */
+ ["\uFC51", "\uFC51"], /* ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM */
+ ["\uFC52", "\uFC52"], /* ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM */
+ ["\uFC53", "\uFC53"], /* ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC54", "\uFC54"], /* ARABIC LIGATURE HEH WITH YEH ISOLATED FORM */
+ ["\uFC55", "\uFC55"], /* ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM */
+ ["\uFC56", "\uFC56"], /* ARABIC LIGATURE YEH WITH HAH ISOLATED FORM */
+ ["\uFC57", "\uFC57"], /* ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM */
+ ["\uFC58", "\uFC58"], /* ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM */
+ ["\uFC59", "\uFC59"], /* ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFC5A", "\uFC5A"], /* ARABIC LIGATURE YEH WITH YEH ISOLATED FORM */
+ ["\uFC5B", "\uFC5B"], /* ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM */
+ ["\uFC5C", "\uFC5C"], /* ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM */
+ ["\uFC5D", "\uFC5D"], /* ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM */
+ ["\uFC5E", "\uFC5E"], /* ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM */
+ ["\uFC5F", "\uFC5F"], /* ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM */
+ ["\uFC60", "\uFC60"], /* ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM */
+ ["\uFC61", "\uFC61"], /* ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM */
+ ["\uFC62", "\uFC62"], /* ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM */
+ ["\uFC63", "\uFC63"], /* ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM */
+ ["\uFC64", "\uFC64"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM */
+ ["\uFC65", "\uFC65"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM */
+ ["\uFC66", "\uFC66"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM */
+ ["\uFC67", "\uFC67"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM */
+ ["\uFC68", "\uFC68"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC69", "\uFC69"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM */
+ ["\uFC6A", "\uFC6A"], /* ARABIC LIGATURE BEH WITH REH FINAL FORM */
+ ["\uFC6B", "\uFC6B"], /* ARABIC LIGATURE BEH WITH ZAIN FINAL FORM */
+ ["\uFC6C", "\uFC6C"], /* ARABIC LIGATURE BEH WITH MEEM FINAL FORM */
+ ["\uFC6D", "\uFC6D"], /* ARABIC LIGATURE BEH WITH NOON FINAL FORM */
+ ["\uFC6E", "\uFC6E"], /* ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC6F", "\uFC6F"], /* ARABIC LIGATURE BEH WITH YEH FINAL FORM */
+ ["\uFC70", "\uFC70"], /* ARABIC LIGATURE TEH WITH REH FINAL FORM */
+ ["\uFC71", "\uFC71"], /* ARABIC LIGATURE TEH WITH ZAIN FINAL FORM */
+ ["\uFC72", "\uFC72"], /* ARABIC LIGATURE TEH WITH MEEM FINAL FORM */
+ ["\uFC73", "\uFC73"], /* ARABIC LIGATURE TEH WITH NOON FINAL FORM */
+ ["\uFC74", "\uFC74"], /* ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC75", "\uFC75"], /* ARABIC LIGATURE TEH WITH YEH FINAL FORM */
+ ["\uFC76", "\uFC76"], /* ARABIC LIGATURE THEH WITH REH FINAL FORM */
+ ["\uFC77", "\uFC77"], /* ARABIC LIGATURE THEH WITH ZAIN FINAL FORM */
+ ["\uFC78", "\uFC78"], /* ARABIC LIGATURE THEH WITH MEEM FINAL FORM */
+ ["\uFC79", "\uFC79"], /* ARABIC LIGATURE THEH WITH NOON FINAL FORM */
+ ["\uFC7A", "\uFC7A"], /* ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC7B", "\uFC7B"], /* ARABIC LIGATURE THEH WITH YEH FINAL FORM */
+ ["\uFC7C", "\uFC7C"], /* ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC7D", "\uFC7D"], /* ARABIC LIGATURE FEH WITH YEH FINAL FORM */
+ ["\uFC7E", "\uFC7E"], /* ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC7F", "\uFC7F"], /* ARABIC LIGATURE QAF WITH YEH FINAL FORM */
+ ["\uFC80", "\uFC80"], /* ARABIC LIGATURE KAF WITH ALEF FINAL FORM */
+ ["\uFC81", "\uFC81"], /* ARABIC LIGATURE KAF WITH LAM FINAL FORM */
+ ["\uFC82", "\uFC82"], /* ARABIC LIGATURE KAF WITH MEEM FINAL FORM */
+ ["\uFC83", "\uFC83"], /* ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC84", "\uFC84"], /* ARABIC LIGATURE KAF WITH YEH FINAL FORM */
+ ["\uFC85", "\uFC85"], /* ARABIC LIGATURE LAM WITH MEEM FINAL FORM */
+ ["\uFC86", "\uFC86"], /* ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC87", "\uFC87"], /* ARABIC LIGATURE LAM WITH YEH FINAL FORM */
+ ["\uFC88", "\uFC88"], /* ARABIC LIGATURE MEEM WITH ALEF FINAL FORM */
+ ["\uFC89", "\uFC89"], /* ARABIC LIGATURE MEEM WITH MEEM FINAL FORM */
+ ["\uFC8A", "\uFC8A"], /* ARABIC LIGATURE NOON WITH REH FINAL FORM */
+ ["\uFC8B", "\uFC8B"], /* ARABIC LIGATURE NOON WITH ZAIN FINAL FORM */
+ ["\uFC8C", "\uFC8C"], /* ARABIC LIGATURE NOON WITH MEEM FINAL FORM */
+ ["\uFC8D", "\uFC8D"], /* ARABIC LIGATURE NOON WITH NOON FINAL FORM */
+ ["\uFC8E", "\uFC8E"], /* ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC8F", "\uFC8F"], /* ARABIC LIGATURE NOON WITH YEH FINAL FORM */
+ ["\uFC90", "\uFC90"], /* ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM */
+ ["\uFC91", "\uFC91"], /* ARABIC LIGATURE YEH WITH REH FINAL FORM */
+ ["\uFC92", "\uFC92"], /* ARABIC LIGATURE YEH WITH ZAIN FINAL FORM */
+ ["\uFC93", "\uFC93"], /* ARABIC LIGATURE YEH WITH MEEM FINAL FORM */
+ ["\uFC94", "\uFC94"], /* ARABIC LIGATURE YEH WITH NOON FINAL FORM */
+ ["\uFC95", "\uFC95"], /* ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFC96", "\uFC96"], /* ARABIC LIGATURE YEH WITH YEH FINAL FORM */
+ ["\uFC97", "\uFC97"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM */
+ ["\uFC98", "\uFC98"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM */
+ ["\uFC99", "\uFC99"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM */
+ ["\uFC9A", "\uFC9A"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM */
+ ["\uFC9B", "\uFC9B"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM */
+ ["\uFC9C", "\uFC9C"], /* ARABIC LIGATURE BEH WITH JEEM INITIAL FORM */
+ ["\uFC9D", "\uFC9D"], /* ARABIC LIGATURE BEH WITH HAH INITIAL FORM */
+ ["\uFC9E", "\uFC9E"], /* ARABIC LIGATURE BEH WITH KHAH INITIAL FORM */
+ ["\uFC9F", "\uFC9F"], /* ARABIC LIGATURE BEH WITH MEEM INITIAL FORM */
+ ["\uFCA0", "\uFCA0"], /* ARABIC LIGATURE BEH WITH HEH INITIAL FORM */
+ ["\uFCA1", "\uFCA1"], /* ARABIC LIGATURE TEH WITH JEEM INITIAL FORM */
+ ["\uFCA2", "\uFCA2"], /* ARABIC LIGATURE TEH WITH HAH INITIAL FORM */
+ ["\uFCA3", "\uFCA3"], /* ARABIC LIGATURE TEH WITH KHAH INITIAL FORM */
+ ["\uFCA4", "\uFCA4"], /* ARABIC LIGATURE TEH WITH MEEM INITIAL FORM */
+ ["\uFCA5", "\uFCA5"], /* ARABIC LIGATURE TEH WITH HEH INITIAL FORM */
+ ["\uFCA6", "\uFCA6"], /* ARABIC LIGATURE THEH WITH MEEM INITIAL FORM */
+ ["\uFCA7", "\uFCA7"], /* ARABIC LIGATURE JEEM WITH HAH INITIAL FORM */
+ ["\uFCA8", "\uFCA8"], /* ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM */
+ ["\uFCA9", "\uFCA9"], /* ARABIC LIGATURE HAH WITH JEEM INITIAL FORM */
+ ["\uFCAA", "\uFCAA"], /* ARABIC LIGATURE HAH WITH MEEM INITIAL FORM */
+ ["\uFCAB", "\uFCAB"], /* ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM */
+ ["\uFCAC", "\uFCAC"], /* ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM */
+ ["\uFCAD", "\uFCAD"], /* ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM */
+ ["\uFCAE", "\uFCAE"], /* ARABIC LIGATURE SEEN WITH HAH INITIAL FORM */
+ ["\uFCAF", "\uFCAF"], /* ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM */
+ ["\uFCB0", "\uFCB0"], /* ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM */
+ ["\uFCB1", "\uFCB1"], /* ARABIC LIGATURE SAD WITH HAH INITIAL FORM */
+ ["\uFCB2", "\uFCB2"], /* ARABIC LIGATURE SAD WITH KHAH INITIAL FORM */
+ ["\uFCB3", "\uFCB3"], /* ARABIC LIGATURE SAD WITH MEEM INITIAL FORM */
+ ["\uFCB4", "\uFCB4"], /* ARABIC LIGATURE DAD WITH JEEM INITIAL FORM */
+ ["\uFCB5", "\uFCB5"], /* ARABIC LIGATURE DAD WITH HAH INITIAL FORM */
+ ["\uFCB6", "\uFCB6"], /* ARABIC LIGATURE DAD WITH KHAH INITIAL FORM */
+ ["\uFCB7", "\uFCB7"], /* ARABIC LIGATURE DAD WITH MEEM INITIAL FORM */
+ ["\uFCB8", "\uFCB8"], /* ARABIC LIGATURE TAH WITH HAH INITIAL FORM */
+ ["\uFCB9", "\uFCB9"], /* ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM */
+ ["\uFCBA", "\uFCBA"], /* ARABIC LIGATURE AIN WITH JEEM INITIAL FORM */
+ ["\uFCBB", "\uFCBB"], /* ARABIC LIGATURE AIN WITH MEEM INITIAL FORM */
+ ["\uFCBC", "\uFCBC"], /* ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM */
+ ["\uFCBD", "\uFCBD"], /* ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM */
+ ["\uFCBE", "\uFCBE"], /* ARABIC LIGATURE FEH WITH JEEM INITIAL FORM */
+ ["\uFCBF", "\uFCBF"], /* ARABIC LIGATURE FEH WITH HAH INITIAL FORM */
+ ["\uFCC0", "\uFCC0"], /* ARABIC LIGATURE FEH WITH KHAH INITIAL FORM */
+ ["\uFCC1", "\uFCC1"], /* ARABIC LIGATURE FEH WITH MEEM INITIAL FORM */
+ ["\uFCC2", "\uFCC2"], /* ARABIC LIGATURE QAF WITH HAH INITIAL FORM */
+ ["\uFCC3", "\uFCC3"], /* ARABIC LIGATURE QAF WITH MEEM INITIAL FORM */
+ ["\uFCC4", "\uFCC4"], /* ARABIC LIGATURE KAF WITH JEEM INITIAL FORM */
+ ["\uFCC5", "\uFCC5"], /* ARABIC LIGATURE KAF WITH HAH INITIAL FORM */
+ ["\uFCC6", "\uFCC6"], /* ARABIC LIGATURE KAF WITH KHAH INITIAL FORM */
+ ["\uFCC7", "\uFCC7"], /* ARABIC LIGATURE KAF WITH LAM INITIAL FORM */
+ ["\uFCC8", "\uFCC8"], /* ARABIC LIGATURE KAF WITH MEEM INITIAL FORM */
+ ["\uFCC9", "\uFCC9"], /* ARABIC LIGATURE LAM WITH JEEM INITIAL FORM */
+ ["\uFCCA", "\uFCCA"], /* ARABIC LIGATURE LAM WITH HAH INITIAL FORM */
+ ["\uFCCB", "\uFCCB"], /* ARABIC LIGATURE LAM WITH KHAH INITIAL FORM */
+ ["\uFCCC", "\uFCCC"], /* ARABIC LIGATURE LAM WITH MEEM INITIAL FORM */
+ ["\uFCCD", "\uFCCD"], /* ARABIC LIGATURE LAM WITH HEH INITIAL FORM */
+ ["\uFCCE", "\uFCCE"], /* ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM */
+ ["\uFCCF", "\uFCCF"], /* ARABIC LIGATURE MEEM WITH HAH INITIAL FORM */
+ ["\uFCD0", "\uFCD0"], /* ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM */
+ ["\uFCD1", "\uFCD1"], /* ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM */
+ ["\uFCD2", "\uFCD2"], /* ARABIC LIGATURE NOON WITH JEEM INITIAL FORM */
+ ["\uFCD3", "\uFCD3"], /* ARABIC LIGATURE NOON WITH HAH INITIAL FORM */
+ ["\uFCD4", "\uFCD4"], /* ARABIC LIGATURE NOON WITH KHAH INITIAL FORM */
+ ["\uFCD5", "\uFCD5"], /* ARABIC LIGATURE NOON WITH MEEM INITIAL FORM */
+ ["\uFCD6", "\uFCD6"], /* ARABIC LIGATURE NOON WITH HEH INITIAL FORM */
+ ["\uFCD7", "\uFCD7"], /* ARABIC LIGATURE HEH WITH JEEM INITIAL FORM */
+ ["\uFCD8", "\uFCD8"], /* ARABIC LIGATURE HEH WITH MEEM INITIAL FORM */
+ ["\uFCD9", "\uFCD9"], /* ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM */
+ ["\uFCDA", "\uFCDA"], /* ARABIC LIGATURE YEH WITH JEEM INITIAL FORM */
+ ["\uFCDB", "\uFCDB"], /* ARABIC LIGATURE YEH WITH HAH INITIAL FORM */
+ ["\uFCDC", "\uFCDC"], /* ARABIC LIGATURE YEH WITH KHAH INITIAL FORM */
+ ["\uFCDD", "\uFCDD"], /* ARABIC LIGATURE YEH WITH MEEM INITIAL FORM */
+ ["\uFCDE", "\uFCDE"], /* ARABIC LIGATURE YEH WITH HEH INITIAL FORM */
+ ["\uFCDF", "\uFCDF"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM */
+ ["\uFCE0", "\uFCE0"], /* ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM */
+ ["\uFCE1", "\uFCE1"], /* ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM */
+ ["\uFCE2", "\uFCE2"], /* ARABIC LIGATURE BEH WITH HEH MEDIAL FORM */
+ ["\uFCE3", "\uFCE3"], /* ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM */
+ ["\uFCE4", "\uFCE4"], /* ARABIC LIGATURE TEH WITH HEH MEDIAL FORM */
+ ["\uFCE5", "\uFCE5"], /* ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM */
+ ["\uFCE6", "\uFCE6"], /* ARABIC LIGATURE THEH WITH HEH MEDIAL FORM */
+ ["\uFCE7", "\uFCE7"], /* ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM */
+ ["\uFCE8", "\uFCE8"], /* ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM */
+ ["\uFCE9", "\uFCE9"], /* ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM */
+ ["\uFCEA", "\uFCEA"], /* ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM */
+ ["\uFCEB", "\uFCEB"], /* ARABIC LIGATURE KAF WITH LAM MEDIAL FORM */
+ ["\uFCEC", "\uFCEC"], /* ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM */
+ ["\uFCED", "\uFCED"], /* ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM */
+ ["\uFCEE", "\uFCEE"], /* ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM */
+ ["\uFCEF", "\uFCEF"], /* ARABIC LIGATURE NOON WITH HEH MEDIAL FORM */
+ ["\uFCF0", "\uFCF0"], /* ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM */
+ ["\uFCF1", "\uFCF1"], /* ARABIC LIGATURE YEH WITH HEH MEDIAL FORM */
+ ["\uFCF2", "\uFCF2"], /* ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM */
+ ["\uFCF3", "\uFCF3"], /* ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM */
+ ["\uFCF4", "\uFCF4"], /* ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM */
+ ["\uFCF5", "\uFCF5"], /* ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCF6", "\uFCF6"], /* ARABIC LIGATURE TAH WITH YEH ISOLATED FORM */
+ ["\uFCF7", "\uFCF7"], /* ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCF8", "\uFCF8"], /* ARABIC LIGATURE AIN WITH YEH ISOLATED FORM */
+ ["\uFCF9", "\uFCF9"], /* ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCFA", "\uFCFA"], /* ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM */
+ ["\uFCFB", "\uFCFB"], /* ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCFC", "\uFCFC"], /* ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM */
+ ["\uFCFD", "\uFCFD"], /* ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFCFE", "\uFCFE"], /* ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM */
+ ["\uFCFF", "\uFCFF"], /* ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD00", "\uFD00"], /* ARABIC LIGATURE HAH WITH YEH ISOLATED FORM */
+ ["\uFD01", "\uFD01"], /* ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD02", "\uFD02"], /* ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM */
+ ["\uFD03", "\uFD03"], /* ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD04", "\uFD04"], /* ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM */
+ ["\uFD05", "\uFD05"], /* ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD06", "\uFD06"], /* ARABIC LIGATURE SAD WITH YEH ISOLATED FORM */
+ ["\uFD07", "\uFD07"], /* ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM */
+ ["\uFD08", "\uFD08"], /* ARABIC LIGATURE DAD WITH YEH ISOLATED FORM */
+ ["\uFD09", "\uFD09"], /* ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM */
+ ["\uFD0A", "\uFD0A"], /* ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM */
+ ["\uFD0B", "\uFD0B"], /* ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM */
+ ["\uFD0C", "\uFD0C"], /* ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM */
+ ["\uFD0D", "\uFD0D"], /* ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM */
+ ["\uFD0E", "\uFD0E"], /* ARABIC LIGATURE SEEN WITH REH ISOLATED FORM */
+ ["\uFD0F", "\uFD0F"], /* ARABIC LIGATURE SAD WITH REH ISOLATED FORM */
+ ["\uFD10", "\uFD10"], /* ARABIC LIGATURE DAD WITH REH ISOLATED FORM */
+ ["\uFD11", "\uFD11"], /* ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD12", "\uFD12"], /* ARABIC LIGATURE TAH WITH YEH FINAL FORM */
+ ["\uFD13", "\uFD13"], /* ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD14", "\uFD14"], /* ARABIC LIGATURE AIN WITH YEH FINAL FORM */
+ ["\uFD15", "\uFD15"], /* ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD16", "\uFD16"], /* ARABIC LIGATURE GHAIN WITH YEH FINAL FORM */
+ ["\uFD17", "\uFD17"], /* ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD18", "\uFD18"], /* ARABIC LIGATURE SEEN WITH YEH FINAL FORM */
+ ["\uFD19", "\uFD19"], /* ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD1A", "\uFD1A"], /* ARABIC LIGATURE SHEEN WITH YEH FINAL FORM */
+ ["\uFD1B", "\uFD1B"], /* ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD1C", "\uFD1C"], /* ARABIC LIGATURE HAH WITH YEH FINAL FORM */
+ ["\uFD1D", "\uFD1D"], /* ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD1E", "\uFD1E"], /* ARABIC LIGATURE JEEM WITH YEH FINAL FORM */
+ ["\uFD1F", "\uFD1F"], /* ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD20", "\uFD20"], /* ARABIC LIGATURE KHAH WITH YEH FINAL FORM */
+ ["\uFD21", "\uFD21"], /* ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD22", "\uFD22"], /* ARABIC LIGATURE SAD WITH YEH FINAL FORM */
+ ["\uFD23", "\uFD23"], /* ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD24", "\uFD24"], /* ARABIC LIGATURE DAD WITH YEH FINAL FORM */
+ ["\uFD25", "\uFD25"], /* ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM */
+ ["\uFD26", "\uFD26"], /* ARABIC LIGATURE SHEEN WITH HAH FINAL FORM */
+ ["\uFD27", "\uFD27"], /* ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM */
+ ["\uFD28", "\uFD28"], /* ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM */
+ ["\uFD29", "\uFD29"], /* ARABIC LIGATURE SHEEN WITH REH FINAL FORM */
+ ["\uFD2A", "\uFD2A"], /* ARABIC LIGATURE SEEN WITH REH FINAL FORM */
+ ["\uFD2B", "\uFD2B"], /* ARABIC LIGATURE SAD WITH REH FINAL FORM */
+ ["\uFD2C", "\uFD2C"], /* ARABIC LIGATURE DAD WITH REH FINAL FORM */
+ ["\uFD2D", "\uFD2D"], /* ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM */
+ ["\uFD2E", "\uFD2E"], /* ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM */
+ ["\uFD2F", "\uFD2F"], /* ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM */
+ ["\uFD30", "\uFD30"], /* ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM */
+ ["\uFD31", "\uFD31"], /* ARABIC LIGATURE SEEN WITH HEH INITIAL FORM */
+ ["\uFD32", "\uFD32"], /* ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM */
+ ["\uFD33", "\uFD33"], /* ARABIC LIGATURE TAH WITH MEEM INITIAL FORM */
+ ["\uFD34", "\uFD34"], /* ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM */
+ ["\uFD35", "\uFD35"], /* ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM */
+ ["\uFD36", "\uFD36"], /* ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM */
+ ["\uFD37", "\uFD37"], /* ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM */
+ ["\uFD38", "\uFD38"], /* ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM */
+ ["\uFD39", "\uFD39"], /* ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM */
+ ["\uFD3A", "\uFD3A"], /* ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM */
+ ["\uFD3B", "\uFD3B"], /* ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM */
+ ["\uFD3C", "\uFD3C"], /* ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM */
+ ["\uFD3D", "\uFD3D"], /* ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM */
+ ["\uFD3E", "\uFD3E"], /* ORNATE LEFT PARENTHESIS */
+ ["\uFD3F", "\uFD3F"], /* ORNATE RIGHT PARENTHESIS */
+ ["\uFD40", "\uFD40"],
+ ["\uFD41", "\uFD41"],
+ ["\uFD42", "\uFD42"],
+ ["\uFD43", "\uFD43"],
+ ["\uFD44", "\uFD44"],
+ ["\uFD45", "\uFD45"],
+ ["\uFD46", "\uFD46"],
+ ["\uFD47", "\uFD47"],
+ ["\uFD48", "\uFD48"],
+ ["\uFD49", "\uFD49"],
+ ["\uFD4A", "\uFD4A"],
+ ["\uFD4B", "\uFD4B"],
+ ["\uFD4C", "\uFD4C"],
+ ["\uFD4D", "\uFD4D"],
+ ["\uFD4E", "\uFD4E"],
+ ["\uFD4F", "\uFD4F"],
+ ["\uFD50", "\uFD50"], /* ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFD51", "\uFD51"], /* ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM */
+ ["\uFD52", "\uFD52"], /* ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM */
+ ["\uFD53", "\uFD53"], /* ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFD54", "\uFD54"], /* ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD55", "\uFD55"], /* ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM */
+ ["\uFD56", "\uFD56"], /* ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD57", "\uFD57"], /* ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM */
+ ["\uFD58", "\uFD58"], /* ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD59", "\uFD59"], /* ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD5A", "\uFD5A"], /* ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFD5B", "\uFD5B"], /* ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD5C", "\uFD5C"], /* ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM */
+ ["\uFD5D", "\uFD5D"], /* ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM */
+ ["\uFD5E", "\uFD5E"], /* ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD5F", "\uFD5F"], /* ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD60", "\uFD60"], /* ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD61", "\uFD61"], /* ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM */
+ ["\uFD62", "\uFD62"], /* ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD63", "\uFD63"], /* ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD64", "\uFD64"], /* ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM */
+ ["\uFD65", "\uFD65"], /* ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM */
+ ["\uFD66", "\uFD66"], /* ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD67", "\uFD67"], /* ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM */
+ ["\uFD68", "\uFD68"], /* ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFD69", "\uFD69"], /* ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM */
+ ["\uFD6A", "\uFD6A"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM */
+ ["\uFD6B", "\uFD6B"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM */
+ ["\uFD6C", "\uFD6C"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD6D", "\uFD6D"], /* ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD6E", "\uFD6E"], /* ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD6F", "\uFD6F"], /* ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM */
+ ["\uFD70", "\uFD70"], /* ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD71", "\uFD71"], /* ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD72", "\uFD72"], /* ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD73", "\uFD73"], /* ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD74", "\uFD74"], /* ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFD75", "\uFD75"], /* ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM */
+ ["\uFD76", "\uFD76"], /* ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD77", "\uFD77"], /* ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD78", "\uFD78"], /* ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD79", "\uFD79"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD7A", "\uFD7A"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM */
+ ["\uFD7B", "\uFD7B"], /* ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD7C", "\uFD7C"], /* ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM */
+ ["\uFD7D", "\uFD7D"], /* ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD7E", "\uFD7E"], /* ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD7F", "\uFD7F"], /* ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD80", "\uFD80"], /* ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM */
+ ["\uFD81", "\uFD81"], /* ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM */
+ ["\uFD82", "\uFD82"], /* ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD83", "\uFD83"], /* ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM */
+ ["\uFD84", "\uFD84"], /* ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM */
+ ["\uFD85", "\uFD85"], /* ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM */
+ ["\uFD86", "\uFD86"], /* ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD87", "\uFD87"], /* ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM */
+ ["\uFD88", "\uFD88"], /* ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFD89", "\uFD89"], /* ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM */
+ ["\uFD8A", "\uFD8A"], /* ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFD8B", "\uFD8B"], /* ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM */
+ ["\uFD8C", "\uFD8C"], /* ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM */
+ ["\uFD8D", "\uFD8D"], /* ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFD8E", "\uFD8E"], /* ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM */
+ ["\uFD8F", "\uFD8F"], /* ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM */
+ ["\uFD90", "\uFD90"],
+ ["\uFD91", "\uFD91"],
+ ["\uFD92", "\uFD92"], /* ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM */
+ ["\uFD93", "\uFD93"], /* ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM */
+ ["\uFD94", "\uFD94"], /* ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD95", "\uFD95"], /* ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFD96", "\uFD96"], /* ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD97", "\uFD97"], /* ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM */
+ ["\uFD98", "\uFD98"], /* ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFD99", "\uFD99"], /* ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD9A", "\uFD9A"], /* ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM */
+ ["\uFD9B", "\uFD9B"], /* ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFD9C", "\uFD9C"], /* ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFD9D", "\uFD9D"], /* ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFD9E", "\uFD9E"], /* ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM */
+ ["\uFD9F", "\uFD9F"], /* ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDA0", "\uFDA0"], /* ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA1", "\uFDA1"], /* ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM */
+ ["\uFDA2", "\uFDA2"], /* ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA3", "\uFDA3"], /* ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDA4", "\uFDA4"], /* ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA5", "\uFDA5"], /* ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDA6", "\uFDA6"], /* ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA7", "\uFDA7"], /* ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA8", "\uFDA8"], /* ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM */
+ ["\uFDA9", "\uFDA9"], /* ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM */
+ ["\uFDAA", "\uFDAA"], /* ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM */
+ ["\uFDAB", "\uFDAB"], /* ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM */
+ ["\uFDAC", "\uFDAC"], /* ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDAD", "\uFDAD"], /* ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDAE", "\uFDAE"], /* ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM */
+ ["\uFDAF", "\uFDAF"], /* ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDB0", "\uFDB0"], /* ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB1", "\uFDB1"], /* ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB2", "\uFDB2"], /* ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB3", "\uFDB3"], /* ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM */
+ ["\uFDB4", "\uFDB4"], /* ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM */
+ ["\uFDB5", "\uFDB5"], /* ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM */
+ ["\uFDB6", "\uFDB6"], /* ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB7", "\uFDB7"], /* ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDB8", "\uFDB8"], /* ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM */
+ ["\uFDB9", "\uFDB9"], /* ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM */
+ ["\uFDBA", "\uFDBA"], /* ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFDBB", "\uFDBB"], /* ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM */
+ ["\uFDBC", "\uFDBC"], /* ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM */
+ ["\uFDBD", "\uFDBD"], /* ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM */
+ ["\uFDBE", "\uFDBE"], /* ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM */
+ ["\uFDBF", "\uFDBF"], /* ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDC0", "\uFDC0"], /* ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDC1", "\uFDC1"], /* ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM */
+ ["\uFDC2", "\uFDC2"], /* ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM */
+ ["\uFDC3", "\uFDC3"], /* ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFDC4", "\uFDC4"], /* ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM */
+ ["\uFDC5", "\uFDC5"], /* ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM */
+ ["\uFDC6", "\uFDC6"], /* ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM */
+ ["\uFDC7", "\uFDC7"], /* ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM */
+ ["\uFDC8", "\uFDC8"],
+ ["\uFDC9", "\uFDC9"],
+ ["\uFDCA", "\uFDCA"],
+ ["\uFDCB", "\uFDCB"],
+ ["\uFDCC", "\uFDCC"],
+ ["\uFDCD", "\uFDCD"],
+ ["\uFDCE", "\uFDCE"],
+ ["\uFDCF", "\uFDCF"],
+ ["\uFDD0", "\uFDD0"],
+ ["\uFDD1", "\uFDD1"],
+ ["\uFDD2", "\uFDD2"],
+ ["\uFDD3", "\uFDD3"],
+ ["\uFDD4", "\uFDD4"],
+ ["\uFDD5", "\uFDD5"],
+ ["\uFDD6", "\uFDD6"],
+ ["\uFDD7", "\uFDD7"],
+ ["\uFDD8", "\uFDD8"],
+ ["\uFDD9", "\uFDD9"],
+ ["\uFDDA", "\uFDDA"],
+ ["\uFDDB", "\uFDDB"],
+ ["\uFDDC", "\uFDDC"],
+ ["\uFDDD", "\uFDDD"],
+ ["\uFDDE", "\uFDDE"],
+ ["\uFDDF", "\uFDDF"],
+ ["\uFDE0", "\uFDE0"],
+ ["\uFDE1", "\uFDE1"],
+ ["\uFDE2", "\uFDE2"],
+ ["\uFDE3", "\uFDE3"],
+ ["\uFDE4", "\uFDE4"],
+ ["\uFDE5", "\uFDE5"],
+ ["\uFDE6", "\uFDE6"],
+ ["\uFDE7", "\uFDE7"],
+ ["\uFDE8", "\uFDE8"],
+ ["\uFDE9", "\uFDE9"],
+ ["\uFDEA", "\uFDEA"],
+ ["\uFDEB", "\uFDEB"],
+ ["\uFDEC", "\uFDEC"],
+ ["\uFDED", "\uFDED"],
+ ["\uFDEE", "\uFDEE"],
+ ["\uFDEF", "\uFDEF"],
+ ["\uFDF0", "\uFDF0"], /* ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM */
+ ["\uFDF1", "\uFDF1"], /* ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM */
+ ["\uFDF2", "\uFDF2"], /* ARABIC LIGATURE ALLAH ISOLATED FORM */
+ ["\uFDF3", "\uFDF3"], /* ARABIC LIGATURE AKBAR ISOLATED FORM */
+ ["\uFDF4", "\uFDF4"], /* ARABIC LIGATURE MOHAMMAD ISOLATED FORM */
+ ["\uFDF5", "\uFDF5"], /* ARABIC LIGATURE SALAM ISOLATED FORM */
+ ["\uFDF6", "\uFDF6"], /* ARABIC LIGATURE RASOUL ISOLATED FORM */
+ ["\uFDF7", "\uFDF7"], /* ARABIC LIGATURE ALAYHE ISOLATED FORM */
+ ["\uFDF8", "\uFDF8"], /* ARABIC LIGATURE WASALLAM ISOLATED FORM */
+ ["\uFDF9", "\uFDF9"], /* ARABIC LIGATURE SALLA ISOLATED FORM */
+ ["\uFDFA", "\uFDFA"], /* ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM (ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM) */
+ ["\uFDFB", "\uFDFB"], /* ARABIC LIGATURE JALLAJALALOUHOU (ARABIC LETTER JALLAJALALOUHOU) */
+ ["\uFDFC", "\uFDFC"], /* RIAL SIGN */
+ ["\uFDFD", "\uFDFD"], /* ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM */
+ ["\uFDFE", "\uFDFE"],
+ ["\uFDFF", "\uFDFF"],
+ ["\uFE00", "\uFE00"], /* VARIATION SELECTOR-1 */
+ ["\uFE01", "\uFE01"], /* VARIATION SELECTOR-2 */
+ ["\uFE02", "\uFE02"], /* VARIATION SELECTOR-3 */
+ ["\uFE03", "\uFE03"], /* VARIATION SELECTOR-4 */
+ ["\uFE04", "\uFE04"], /* VARIATION SELECTOR-5 */
+ ["\uFE05", "\uFE05"], /* VARIATION SELECTOR-6 */
+ ["\uFE06", "\uFE06"], /* VARIATION SELECTOR-7 */
+ ["\uFE07", "\uFE07"], /* VARIATION SELECTOR-8 */
+ ["\uFE08", "\uFE08"], /* VARIATION SELECTOR-9 */
+ ["\uFE09", "\uFE09"], /* VARIATION SELECTOR-10 */
+ ["\uFE0A", "\uFE0A"], /* VARIATION SELECTOR-11 */
+ ["\uFE0B", "\uFE0B"], /* VARIATION SELECTOR-12 */
+ ["\uFE0C", "\uFE0C"], /* VARIATION SELECTOR-13 */
+ ["\uFE0D", "\uFE0D"], /* VARIATION SELECTOR-14 */
+ ["\uFE0E", "\uFE0E"], /* VARIATION SELECTOR-15 */
+ ["\uFE0F", "\uFE0F"], /* VARIATION SELECTOR-16 */
+ ["\uFE10", "\uFE10"], /* PRESENTATION FORM FOR VERTICAL COMMA */
+ ["\uFE11", "\uFE11"], /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA */
+ ["\uFE12", "\uFE12"], /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP */
+ ["\uFE13", "\uFE13"], /* PRESENTATION FORM FOR VERTICAL COLON */
+ ["\uFE14", "\uFE14"], /* PRESENTATION FORM FOR VERTICAL SEMICOLON */
+ ["\uFE15", "\uFE15"], /* PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK */
+ ["\uFE16", "\uFE16"], /* PRESENTATION FORM FOR VERTICAL QUESTION MARK */
+ ["\uFE17", "\uFE17"], /* PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET */
+ ["\uFE18", "\uFE18"], /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET */
+ ["\uFE19", "\uFE19"], /* PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS */
+ ["\uFE1A", "\uFE1A"],
+ ["\uFE1B", "\uFE1B"],
+ ["\uFE1C", "\uFE1C"],
+ ["\uFE1D", "\uFE1D"],
+ ["\uFE1E", "\uFE1E"],
+ ["\uFE1F", "\uFE1F"],
+ ["\uFE20", "\uFE20"], /* COMBINING LIGATURE LEFT HALF */
+ ["\uFE21", "\uFE21"], /* COMBINING LIGATURE RIGHT HALF */
+ ["\uFE22", "\uFE22"], /* COMBINING DOUBLE TILDE LEFT HALF */
+ ["\uFE23", "\uFE23"], /* COMBINING DOUBLE TILDE RIGHT HALF */
+ ["\uFE24", "\uFE24"], /* COMBINING MACRON LEFT HALF */
+ ["\uFE25", "\uFE25"], /* COMBINING MACRON RIGHT HALF */
+ ["\uFE26", "\uFE26"], /* COMBINING CONJOINING MACRON */
+ ["\uFE27", "\uFE27"], /* COMBINING LIGATURE LEFT HALF BELOW */
+ ["\uFE28", "\uFE28"], /* COMBINING LIGATURE RIGHT HALF BELOW */
+ ["\uFE29", "\uFE29"], /* COMBINING TILDE LEFT HALF BELOW */
+ ["\uFE2A", "\uFE2A"], /* COMBINING TILDE RIGHT HALF BELOW */
+ ["\uFE2B", "\uFE2B"], /* COMBINING MACRON LEFT HALF BELOW */
+ ["\uFE2C", "\uFE2C"], /* COMBINING MACRON RIGHT HALF BELOW */
+ ["\uFE2D", "\uFE2D"], /* COMBINING CONJOINING MACRON BELOW */
+ ["\uFE2E", "\uFE2E"], /* COMBINING CYRILLIC TITLO LEFT HALF */
+ ["\uFE2F", "\uFE2F"], /* COMBINING CYRILLIC TITLO RIGHT HALF */
+ ["\uFE30", "\uFE30"], /* PRESENTATION FORM FOR VERTICAL TWO DOT LEADER (GLYPH FOR VERTICAL TWO DOT LEADER) */
+ ["\uFE31", "\uFE31"], /* PRESENTATION FORM FOR VERTICAL EM DASH (GLYPH FOR VERTICAL EM DASH) */
+ ["\uFE32", "\uFE32"], /* PRESENTATION FORM FOR VERTICAL EN DASH (GLYPH FOR VERTICAL EN DASH) */
+ ["\uFE33", "\uFE33"], /* PRESENTATION FORM FOR VERTICAL LOW LINE (GLYPH FOR VERTICAL SPACING UNDERSCORE) */
+ ["\uFE34", "\uFE34"], /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE (GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE) */
+ ["\uFE35", "\uFE35"], /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS (GLYPH FOR VERTICAL OPENING PARENTHESIS) */
+ ["\uFE36", "\uFE36"], /* PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS (GLYPH FOR VERTICAL CLOSING PARENTHESIS) */
+ ["\uFE37", "\uFE37"], /* PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET (GLYPH FOR VERTICAL OPENING CURLY BRACKET) */
+ ["\uFE38", "\uFE38"], /* PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET (GLYPH FOR VERTICAL CLOSING CURLY BRACKET) */
+ ["\uFE39", "\uFE39"], /* PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET (GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET) */
+ ["\uFE3A", "\uFE3A"], /* PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET (GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET) */
+ ["\uFE3B", "\uFE3B"], /* PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET (GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET) */
+ ["\uFE3C", "\uFE3C"], /* PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET (GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET) */
+ ["\uFE3D", "\uFE3D"], /* PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET (GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET) */
+ ["\uFE3E", "\uFE3E"], /* PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET (GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET) */
+ ["\uFE3F", "\uFE3F"], /* PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET (GLYPH FOR VERTICAL OPENING ANGLE BRACKET) */
+ ["\uFE40", "\uFE40"], /* PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET (GLYPH FOR VERTICAL CLOSING ANGLE BRACKET) */
+ ["\uFE41", "\uFE41"], /* PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET (GLYPH FOR VERTICAL OPENING CORNER BRACKET) */
+ ["\uFE42", "\uFE42"], /* PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET (GLYPH FOR VERTICAL CLOSING CORNER BRACKET) */
+ ["\uFE43", "\uFE43"], /* PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET (GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET) */
+ ["\uFE44", "\uFE44"], /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET (GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET) */
+ ["\uFE45", "\uFE45"], /* SESAME DOT */
+ ["\uFE46", "\uFE46"], /* WHITE SESAME DOT */
+ ["\uFE47", "\uFE47"], /* PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET */
+ ["\uFE48", "\uFE48"], /* PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET */
+ ["\uFE49", "\uFE49"], /* DASHED OVERLINE (SPACING DASHED OVERSCORE) */
+ ["\uFE4A", "\uFE4A"], /* CENTRELINE OVERLINE (SPACING CENTERLINE OVERSCORE) */
+ ["\uFE4B", "\uFE4B"], /* WAVY OVERLINE (SPACING WAVY OVERSCORE) */
+ ["\uFE4C", "\uFE4C"], /* DOUBLE WAVY OVERLINE (SPACING DOUBLE WAVY OVERSCORE) */
+ ["\uFE4D", "\uFE4D"], /* DASHED LOW LINE (SPACING DASHED UNDERSCORE) */
+ ["\uFE4E", "\uFE4E"], /* CENTRELINE LOW LINE (SPACING CENTERLINE UNDERSCORE) */
+ ["\uFE4F", "\uFE4F"], /* WAVY LOW LINE (SPACING WAVY UNDERSCORE) */
+ ["\uFE50", "\uFE50"], /* SMALL COMMA */
+ ["\uFE51", "\uFE51"], /* SMALL IDEOGRAPHIC COMMA */
+ ["\uFE52", "\uFE52"], /* SMALL FULL STOP (SMALL PERIOD) */
+ ["\uFE53", "\uFE53"],
+ ["\uFE54", "\uFE54"], /* SMALL SEMICOLON */
+ ["\uFE55", "\uFE55"], /* SMALL COLON */
+ ["\uFE56", "\uFE56"], /* SMALL QUESTION MARK */
+ ["\uFE57", "\uFE57"], /* SMALL EXCLAMATION MARK */
+ ["\uFE58", "\uFE58"], /* SMALL EM DASH */
+ ["\uFE59", "\uFE59"], /* SMALL LEFT PARENTHESIS (SMALL OPENING PARENTHESIS) */
+ ["\uFE5A", "\uFE5A"], /* SMALL RIGHT PARENTHESIS (SMALL CLOSING PARENTHESIS) */
+ ["\uFE5B", "\uFE5B"], /* SMALL LEFT CURLY BRACKET (SMALL OPENING CURLY BRACKET) */
+ ["\uFE5C", "\uFE5C"], /* SMALL RIGHT CURLY BRACKET (SMALL CLOSING CURLY BRACKET) */
+ ["\uFE5D", "\uFE5D"], /* SMALL LEFT TORTOISE SHELL BRACKET (SMALL OPENING TORTOISE SHELL BRACKET) */
+ ["\uFE5E", "\uFE5E"], /* SMALL RIGHT TORTOISE SHELL BRACKET (SMALL CLOSING TORTOISE SHELL BRACKET) */
+ ["\uFE5F", "\uFE5F"], /* SMALL NUMBER SIGN */
+ ["\uFE60", "\uFE60"], /* SMALL AMPERSAND */
+ ["\uFE61", "\uFE61"], /* SMALL ASTERISK */
+ ["\uFE62", "\uFE62"], /* SMALL PLUS SIGN */
+ ["\uFE63", "\uFE63"], /* SMALL HYPHEN-MINUS */
+ ["\uFE64", "\uFE64"], /* SMALL LESS-THAN SIGN */
+ ["\uFE65", "\uFE65"], /* SMALL GREATER-THAN SIGN */
+ ["\uFE66", "\uFE66"], /* SMALL EQUALS SIGN */
+ ["\uFE67", "\uFE67"],
+ ["\uFE68", "\uFE68"], /* SMALL REVERSE SOLIDUS (SMALL BACKSLASH) */
+ ["\uFE69", "\uFE69"], /* SMALL DOLLAR SIGN */
+ ["\uFE6A", "\uFE6A"], /* SMALL PERCENT SIGN */
+ ["\uFE6B", "\uFE6B"], /* SMALL COMMERCIAL AT */
+ ["\uFE6C", "\uFE6C"],
+ ["\uFE6D", "\uFE6D"],
+ ["\uFE6E", "\uFE6E"],
+ ["\uFE6F", "\uFE6F"],
+ ["\uFE70", "\uFE70"], /* ARABIC FATHATAN ISOLATED FORM (ARABIC SPACING FATHATAN) */
+ ["\uFE71", "\uFE71"], /* ARABIC TATWEEL WITH FATHATAN ABOVE (ARABIC FATHATAN ON TATWEEL) */
+ ["\uFE72", "\uFE72"], /* ARABIC DAMMATAN ISOLATED FORM (ARABIC SPACING DAMMATAN) */
+ ["\uFE73", "\uFE73"], /* ARABIC TAIL FRAGMENT */
+ ["\uFE74", "\uFE74"], /* ARABIC KASRATAN ISOLATED FORM (ARABIC SPACING KASRATAN) */
+ ["\uFE75", "\uFE75"],
+ ["\uFE76", "\uFE76"], /* ARABIC FATHA ISOLATED FORM (ARABIC SPACING FATHAH) */
+ ["\uFE77", "\uFE77"], /* ARABIC FATHA MEDIAL FORM (ARABIC FATHAH ON TATWEEL) */
+ ["\uFE78", "\uFE78"], /* ARABIC DAMMA ISOLATED FORM (ARABIC SPACING DAMMAH) */
+ ["\uFE79", "\uFE79"], /* ARABIC DAMMA MEDIAL FORM (ARABIC DAMMAH ON TATWEEL) */
+ ["\uFE7A", "\uFE7A"], /* ARABIC KASRA ISOLATED FORM (ARABIC SPACING KASRAH) */
+ ["\uFE7B", "\uFE7B"], /* ARABIC KASRA MEDIAL FORM (ARABIC KASRAH ON TATWEEL) */
+ ["\uFE7C", "\uFE7C"], /* ARABIC SHADDA ISOLATED FORM (ARABIC SPACING SHADDAH) */
+ ["\uFE7D", "\uFE7D"], /* ARABIC SHADDA MEDIAL FORM (ARABIC SHADDAH ON TATWEEL) */
+ ["\uFE7E", "\uFE7E"], /* ARABIC SUKUN ISOLATED FORM (ARABIC SPACING SUKUN) */
+ ["\uFE7F", "\uFE7F"], /* ARABIC SUKUN MEDIAL FORM (ARABIC SUKUN ON TATWEEL) */
+ ["\uFE80", "\uFE80"], /* ARABIC LETTER HAMZA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH) */
+ ["\uFE81", "\uFE81"], /* ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF) */
+ ["\uFE82", "\uFE82"], /* ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC MADDAH ON ALEF) */
+ ["\uFE83", "\uFE83"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF) */
+ ["\uFE84", "\uFE84"], /* ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON ALEF) */
+ ["\uFE85", "\uFE85"], /* ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW) */
+ ["\uFE86", "\uFE86"], /* ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON WAW) */
+ ["\uFE87", "\uFE87"], /* ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF) */
+ ["\uFE88", "\uFE88"], /* ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF) */
+ ["\uFE89", "\uFE89"], /* ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON YA) */
+ ["\uFE8A", "\uFE8A"], /* ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON YA) */
+ ["\uFE8B", "\uFE8B"], /* ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM (GLYPH FOR INITIAL ARABIC HAMZAH ON YA) */
+ ["\uFE8C", "\uFE8C"], /* ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HAMZAH ON YA) */
+ ["\uFE8D", "\uFE8D"], /* ARABIC LETTER ALEF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ALEF) */
+ ["\uFE8E", "\uFE8E"], /* ARABIC LETTER ALEF FINAL FORM (GLYPH FOR FINAL ARABIC ALEF) */
+ ["\uFE8F", "\uFE8F"], /* ARABIC LETTER BEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC BAA) */
+ ["\uFE90", "\uFE90"], /* ARABIC LETTER BEH FINAL FORM (GLYPH FOR FINAL ARABIC BAA) */
+ ["\uFE91", "\uFE91"], /* ARABIC LETTER BEH INITIAL FORM (GLYPH FOR INITIAL ARABIC BAA) */
+ ["\uFE92", "\uFE92"], /* ARABIC LETTER BEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC BAA) */
+ ["\uFE93", "\uFE93"], /* ARABIC LETTER TEH MARBUTA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAA MARBUTAH) */
+ ["\uFE94", "\uFE94"], /* ARABIC LETTER TEH MARBUTA FINAL FORM (GLYPH FOR FINAL ARABIC TAA MARBUTAH) */
+ ["\uFE95", "\uFE95"], /* ARABIC LETTER TEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAA) */
+ ["\uFE96", "\uFE96"], /* ARABIC LETTER TEH FINAL FORM (GLYPH FOR FINAL ARABIC TAA) */
+ ["\uFE97", "\uFE97"], /* ARABIC LETTER TEH INITIAL FORM (GLYPH FOR INITIAL ARABIC TAA) */
+ ["\uFE98", "\uFE98"], /* ARABIC LETTER TEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC TAA) */
+ ["\uFE99", "\uFE99"], /* ARABIC LETTER THEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC THAA) */
+ ["\uFE9A", "\uFE9A"], /* ARABIC LETTER THEH FINAL FORM (GLYPH FOR FINAL ARABIC THAA) */
+ ["\uFE9B", "\uFE9B"], /* ARABIC LETTER THEH INITIAL FORM (GLYPH FOR INITIAL ARABIC THAA) */
+ ["\uFE9C", "\uFE9C"], /* ARABIC LETTER THEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC THAA) */
+ ["\uFE9D", "\uFE9D"], /* ARABIC LETTER JEEM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC JEEM) */
+ ["\uFE9E", "\uFE9E"], /* ARABIC LETTER JEEM FINAL FORM (GLYPH FOR FINAL ARABIC JEEM) */
+ ["\uFE9F", "\uFE9F"], /* ARABIC LETTER JEEM INITIAL FORM (GLYPH FOR INITIAL ARABIC JEEM) */
+ ["\uFEA0", "\uFEA0"], /* ARABIC LETTER JEEM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC JEEM) */
+ ["\uFEA1", "\uFEA1"], /* ARABIC LETTER HAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAA) */
+ ["\uFEA2", "\uFEA2"], /* ARABIC LETTER HAH FINAL FORM (GLYPH FOR FINAL ARABIC HAA) */
+ ["\uFEA3", "\uFEA3"], /* ARABIC LETTER HAH INITIAL FORM (GLYPH FOR INITIAL ARABIC HAA) */
+ ["\uFEA4", "\uFEA4"], /* ARABIC LETTER HAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HAA) */
+ ["\uFEA5", "\uFEA5"], /* ARABIC LETTER KHAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC KHAA) */
+ ["\uFEA6", "\uFEA6"], /* ARABIC LETTER KHAH FINAL FORM (GLYPH FOR FINAL ARABIC KHAA) */
+ ["\uFEA7", "\uFEA7"], /* ARABIC LETTER KHAH INITIAL FORM (GLYPH FOR INITIAL ARABIC KHAA) */
+ ["\uFEA8", "\uFEA8"], /* ARABIC LETTER KHAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC KHAA) */
+ ["\uFEA9", "\uFEA9"], /* ARABIC LETTER DAL ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DAL) */
+ ["\uFEAA", "\uFEAA"], /* ARABIC LETTER DAL FINAL FORM (GLYPH FOR FINAL ARABIC DAL) */
+ ["\uFEAB", "\uFEAB"], /* ARABIC LETTER THAL ISOLATED FORM (GLYPH FOR ISOLATE ARABIC THAL) */
+ ["\uFEAC", "\uFEAC"], /* ARABIC LETTER THAL FINAL FORM (GLYPH FOR FINAL ARABIC THAL) */
+ ["\uFEAD", "\uFEAD"], /* ARABIC LETTER REH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC RA) */
+ ["\uFEAE", "\uFEAE"], /* ARABIC LETTER REH FINAL FORM (GLYPH FOR FINAL ARABIC RA) */
+ ["\uFEAF", "\uFEAF"], /* ARABIC LETTER ZAIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ZAIN) */
+ ["\uFEB0", "\uFEB0"], /* ARABIC LETTER ZAIN FINAL FORM (GLYPH FOR FINAL ARABIC ZAIN) */
+ ["\uFEB1", "\uFEB1"], /* ARABIC LETTER SEEN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SEEN) */
+ ["\uFEB2", "\uFEB2"], /* ARABIC LETTER SEEN FINAL FORM (GLYPH FOR FINAL ARABIC SEEN) */
+ ["\uFEB3", "\uFEB3"], /* ARABIC LETTER SEEN INITIAL FORM (GLYPH FOR INITIAL ARABIC SEEN) */
+ ["\uFEB4", "\uFEB4"], /* ARABIC LETTER SEEN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SEEN) */
+ ["\uFEB5", "\uFEB5"], /* ARABIC LETTER SHEEN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SHEEN) */
+ ["\uFEB6", "\uFEB6"], /* ARABIC LETTER SHEEN FINAL FORM (GLYPH FOR FINAL ARABIC SHEEN) */
+ ["\uFEB7", "\uFEB7"], /* ARABIC LETTER SHEEN INITIAL FORM (GLYPH FOR INITIAL ARABIC SHEEN) */
+ ["\uFEB8", "\uFEB8"], /* ARABIC LETTER SHEEN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SHEEN) */
+ ["\uFEB9", "\uFEB9"], /* ARABIC LETTER SAD ISOLATED FORM (GLYPH FOR ISOLATE ARABIC SAD) */
+ ["\uFEBA", "\uFEBA"], /* ARABIC LETTER SAD FINAL FORM (GLYPH FOR FINAL ARABIC SAD) */
+ ["\uFEBB", "\uFEBB"], /* ARABIC LETTER SAD INITIAL FORM (GLYPH FOR INITIAL ARABIC SAD) */
+ ["\uFEBC", "\uFEBC"], /* ARABIC LETTER SAD MEDIAL FORM (GLYPH FOR MEDIAL ARABIC SAD) */
+ ["\uFEBD", "\uFEBD"], /* ARABIC LETTER DAD ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DAD) */
+ ["\uFEBE", "\uFEBE"], /* ARABIC LETTER DAD FINAL FORM (GLYPH FOR FINAL ARABIC DAD) */
+ ["\uFEBF", "\uFEBF"], /* ARABIC LETTER DAD INITIAL FORM (GLYPH FOR INITIAL ARABIC DAD) */
+ ["\uFEC0", "\uFEC0"], /* ARABIC LETTER DAD MEDIAL FORM (GLYPH FOR MEDIAL ARABIC DAD) */
+ ["\uFEC1", "\uFEC1"], /* ARABIC LETTER TAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC TAH) */
+ ["\uFEC2", "\uFEC2"], /* ARABIC LETTER TAH FINAL FORM (GLYPH FOR FINAL ARABIC TAH) */
+ ["\uFEC3", "\uFEC3"], /* ARABIC LETTER TAH INITIAL FORM (GLYPH FOR INITIAL ARABIC TAH) */
+ ["\uFEC4", "\uFEC4"], /* ARABIC LETTER TAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC TAH) */
+ ["\uFEC5", "\uFEC5"], /* ARABIC LETTER ZAH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC DHAH) */
+ ["\uFEC6", "\uFEC6"], /* ARABIC LETTER ZAH FINAL FORM (GLYPH FOR FINAL ARABIC DHAH) */
+ ["\uFEC7", "\uFEC7"], /* ARABIC LETTER ZAH INITIAL FORM (GLYPH FOR INITIAL ARABIC DHAH) */
+ ["\uFEC8", "\uFEC8"], /* ARABIC LETTER ZAH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC DHAH) */
+ ["\uFEC9", "\uFEC9"], /* ARABIC LETTER AIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC AIN) */
+ ["\uFECA", "\uFECA"], /* ARABIC LETTER AIN FINAL FORM (GLYPH FOR FINAL ARABIC AIN) */
+ ["\uFECB", "\uFECB"], /* ARABIC LETTER AIN INITIAL FORM (GLYPH FOR INITIAL ARABIC AIN) */
+ ["\uFECC", "\uFECC"], /* ARABIC LETTER AIN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC AIN) */
+ ["\uFECD", "\uFECD"], /* ARABIC LETTER GHAIN ISOLATED FORM (GLYPH FOR ISOLATE ARABIC GHAIN) */
+ ["\uFECE", "\uFECE"], /* ARABIC LETTER GHAIN FINAL FORM (GLYPH FOR FINAL ARABIC GHAIN) */
+ ["\uFECF", "\uFECF"], /* ARABIC LETTER GHAIN INITIAL FORM (GLYPH FOR INITIAL ARABIC GHAIN) */
+ ["\uFED0", "\uFED0"], /* ARABIC LETTER GHAIN MEDIAL FORM (GLYPH FOR MEDIAL ARABIC GHAIN) */
+ ["\uFED1", "\uFED1"], /* ARABIC LETTER FEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC FA) */
+ ["\uFED2", "\uFED2"], /* ARABIC LETTER FEH FINAL FORM (GLYPH FOR FINAL ARABIC FA) */
+ ["\uFED3", "\uFED3"], /* ARABIC LETTER FEH INITIAL FORM (GLYPH FOR INITIAL ARABIC FA) */
+ ["\uFED4", "\uFED4"], /* ARABIC LETTER FEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC FA) */
+ ["\uFED5", "\uFED5"], /* ARABIC LETTER QAF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC QAF) */
+ ["\uFED6", "\uFED6"], /* ARABIC LETTER QAF FINAL FORM (GLYPH FOR FINAL ARABIC QAF) */
+ ["\uFED7", "\uFED7"], /* ARABIC LETTER QAF INITIAL FORM (GLYPH FOR INITIAL ARABIC QAF) */
+ ["\uFED8", "\uFED8"], /* ARABIC LETTER QAF MEDIAL FORM (GLYPH FOR MEDIAL ARABIC QAF) */
+ ["\uFED9", "\uFED9"], /* ARABIC LETTER KAF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC CAF) */
+ ["\uFEDA", "\uFEDA"], /* ARABIC LETTER KAF FINAL FORM (GLYPH FOR FINAL ARABIC CAF) */
+ ["\uFEDB", "\uFEDB"], /* ARABIC LETTER KAF INITIAL FORM (GLYPH FOR INITIAL ARABIC CAF) */
+ ["\uFEDC", "\uFEDC"], /* ARABIC LETTER KAF MEDIAL FORM (GLYPH FOR MEDIAL ARABIC CAF) */
+ ["\uFEDD", "\uFEDD"], /* ARABIC LETTER LAM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC LAM) */
+ ["\uFEDE", "\uFEDE"], /* ARABIC LETTER LAM FINAL FORM (GLYPH FOR FINAL ARABIC LAM) */
+ ["\uFEDF", "\uFEDF"], /* ARABIC LETTER LAM INITIAL FORM (GLYPH FOR INITIAL ARABIC LAM) */
+ ["\uFEE0", "\uFEE0"], /* ARABIC LETTER LAM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC LAM) */
+ ["\uFEE1", "\uFEE1"], /* ARABIC LETTER MEEM ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MEEM) */
+ ["\uFEE2", "\uFEE2"], /* ARABIC LETTER MEEM FINAL FORM (GLYPH FOR FINAL ARABIC MEEM) */
+ ["\uFEE3", "\uFEE3"], /* ARABIC LETTER MEEM INITIAL FORM (GLYPH FOR INITIAL ARABIC MEEM) */
+ ["\uFEE4", "\uFEE4"], /* ARABIC LETTER MEEM MEDIAL FORM (GLYPH FOR MEDIAL ARABIC MEEM) */
+ ["\uFEE5", "\uFEE5"], /* ARABIC LETTER NOON ISOLATED FORM (GLYPH FOR ISOLATE ARABIC NOON) */
+ ["\uFEE6", "\uFEE6"], /* ARABIC LETTER NOON FINAL FORM (GLYPH FOR FINAL ARABIC NOON) */
+ ["\uFEE7", "\uFEE7"], /* ARABIC LETTER NOON INITIAL FORM (GLYPH FOR INITIAL ARABIC NOON) */
+ ["\uFEE8", "\uFEE8"], /* ARABIC LETTER NOON MEDIAL FORM (GLYPH FOR MEDIAL ARABIC NOON) */
+ ["\uFEE9", "\uFEE9"], /* ARABIC LETTER HEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HA) */
+ ["\uFEEA", "\uFEEA"], /* ARABIC LETTER HEH FINAL FORM (GLYPH FOR FINAL ARABIC HA) */
+ ["\uFEEB", "\uFEEB"], /* ARABIC LETTER HEH INITIAL FORM (GLYPH FOR INITIAL ARABIC HA) */
+ ["\uFEEC", "\uFEEC"], /* ARABIC LETTER HEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC HA) */
+ ["\uFEED", "\uFEED"], /* ARABIC LETTER WAW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC WAW) */
+ ["\uFEEE", "\uFEEE"], /* ARABIC LETTER WAW FINAL FORM (GLYPH FOR FINAL ARABIC WAW) */
+ ["\uFEEF", "\uFEEF"], /* ARABIC LETTER ALEF MAKSURA ISOLATED FORM (GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH) */
+ ["\uFEF0", "\uFEF0"], /* ARABIC LETTER ALEF MAKSURA FINAL FORM (GLYPH FOR FINAL ARABIC ALEF MAQSURAH) */
+ ["\uFEF1", "\uFEF1"], /* ARABIC LETTER YEH ISOLATED FORM (GLYPH FOR ISOLATE ARABIC YA) */
+ ["\uFEF2", "\uFEF2"], /* ARABIC LETTER YEH FINAL FORM (GLYPH FOR FINAL ARABIC YA) */
+ ["\uFEF3", "\uFEF3"], /* ARABIC LETTER YEH INITIAL FORM (GLYPH FOR INITIAL ARABIC YA) */
+ ["\uFEF4", "\uFEF4"], /* ARABIC LETTER YEH MEDIAL FORM (GLYPH FOR MEDIAL ARABIC YA) */
+ ["\uFEF5", "\uFEF5"], /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF) */
+ ["\uFEF6", "\uFEF6"], /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF) */
+ ["\uFEF7", "\uFEF7"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF) */
+ ["\uFEF8", "\uFEF8"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF) */
+ ["\uFEF9", "\uFEF9"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM (GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF) */
+ ["\uFEFA", "\uFEFA"], /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM (GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF) */
+ ["\uFEFB", "\uFEFB"], /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM (GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF) */
+ ["\uFEFC", "\uFEFC"], /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM (GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF) */
+ ["\uFEFD", "\uFEFD"],
+ ["\uFEFE", "\uFEFE"],
+ ["\uFEFF", "\uFEFF"], /* ZERO WIDTH NO-BREAK SPACE (BYTE ORDER MARK) */
+ ["\uFF00", "\uFF00"],
+ ["\uFF01", "\uFF01"], /* FULLWIDTH EXCLAMATION MARK */
+ ["\uFF02", "\uFF02"], /* FULLWIDTH QUOTATION MARK */
+ ["\uFF03", "\uFF03"], /* FULLWIDTH NUMBER SIGN */
+ ["\uFF04", "\uFF04"], /* FULLWIDTH DOLLAR SIGN */
+ ["\uFF05", "\uFF05"], /* FULLWIDTH PERCENT SIGN */
+ ["\uFF06", "\uFF06"], /* FULLWIDTH AMPERSAND */
+ ["\uFF07", "\uFF07"], /* FULLWIDTH APOSTROPHE */
+ ["\uFF08", "\uFF08"], /* FULLWIDTH LEFT PARENTHESIS (FULLWIDTH OPENING PARENTHESIS) */
+ ["\uFF09", "\uFF09"], /* FULLWIDTH RIGHT PARENTHESIS (FULLWIDTH CLOSING PARENTHESIS) */
+ ["\uFF0A", "\uFF0A"], /* FULLWIDTH ASTERISK */
+ ["\uFF0B", "\uFF0B"], /* FULLWIDTH PLUS SIGN */
+ ["\uFF0C", "\uFF0C"], /* FULLWIDTH COMMA */
+ ["\uFF0D", "\uFF0D"], /* FULLWIDTH HYPHEN-MINUS */
+ ["\uFF0E", "\uFF0E"], /* FULLWIDTH FULL STOP (FULLWIDTH PERIOD) */
+ ["\uFF0F", "\uFF0F"], /* FULLWIDTH SOLIDUS (FULLWIDTH SLASH) */
+ ["\uFF10", "\uFF10"], /* FULLWIDTH DIGIT ZERO */
+ ["\uFF11", "\uFF11"], /* FULLWIDTH DIGIT ONE */
+ ["\uFF12", "\uFF12"], /* FULLWIDTH DIGIT TWO */
+ ["\uFF13", "\uFF13"], /* FULLWIDTH DIGIT THREE */
+ ["\uFF14", "\uFF14"], /* FULLWIDTH DIGIT FOUR */
+ ["\uFF15", "\uFF15"], /* FULLWIDTH DIGIT FIVE */
+ ["\uFF16", "\uFF16"], /* FULLWIDTH DIGIT SIX */
+ ["\uFF17", "\uFF17"], /* FULLWIDTH DIGIT SEVEN */
+ ["\uFF18", "\uFF18"], /* FULLWIDTH DIGIT EIGHT */
+ ["\uFF19", "\uFF19"], /* FULLWIDTH DIGIT NINE */
+ ["\uFF1A", "\uFF1A"], /* FULLWIDTH COLON */
+ ["\uFF1B", "\uFF1B"], /* FULLWIDTH SEMICOLON */
+ ["\uFF1C", "\uFF1C"], /* FULLWIDTH LESS-THAN SIGN */
+ ["\uFF1D", "\uFF1D"], /* FULLWIDTH EQUALS SIGN */
+ ["\uFF1E", "\uFF1E"], /* FULLWIDTH GREATER-THAN SIGN */
+ ["\uFF1F", "\uFF1F"], /* FULLWIDTH QUESTION MARK */
+ ["\uFF20", "\uFF20"], /* FULLWIDTH COMMERCIAL AT */
+ ["\uFF21", "\uFF41"], /* FULLWIDTH LATIN CAPITAL LETTER A */
+ ["\uFF22", "\uFF42"], /* FULLWIDTH LATIN CAPITAL LETTER B */
+ ["\uFF23", "\uFF43"], /* FULLWIDTH LATIN CAPITAL LETTER C */
+ ["\uFF24", "\uFF44"], /* FULLWIDTH LATIN CAPITAL LETTER D */
+ ["\uFF25", "\uFF45"], /* FULLWIDTH LATIN CAPITAL LETTER E */
+ ["\uFF26", "\uFF46"], /* FULLWIDTH LATIN CAPITAL LETTER F */
+ ["\uFF27", "\uFF47"], /* FULLWIDTH LATIN CAPITAL LETTER G */
+ ["\uFF28", "\uFF48"], /* FULLWIDTH LATIN CAPITAL LETTER H */
+ ["\uFF29", "\uFF49"], /* FULLWIDTH LATIN CAPITAL LETTER I */
+ ["\uFF2A", "\uFF4A"], /* FULLWIDTH LATIN CAPITAL LETTER J */
+ ["\uFF2B", "\uFF4B"], /* FULLWIDTH LATIN CAPITAL LETTER K */
+ ["\uFF2C", "\uFF4C"], /* FULLWIDTH LATIN CAPITAL LETTER L */
+ ["\uFF2D", "\uFF4D"], /* FULLWIDTH LATIN CAPITAL LETTER M */
+ ["\uFF2E", "\uFF4E"], /* FULLWIDTH LATIN CAPITAL LETTER N */
+ ["\uFF2F", "\uFF4F"], /* FULLWIDTH LATIN CAPITAL LETTER O */
+ ["\uFF30", "\uFF50"], /* FULLWIDTH LATIN CAPITAL LETTER P */
+ ["\uFF31", "\uFF51"], /* FULLWIDTH LATIN CAPITAL LETTER Q */
+ ["\uFF32", "\uFF52"], /* FULLWIDTH LATIN CAPITAL LETTER R */
+ ["\uFF33", "\uFF53"], /* FULLWIDTH LATIN CAPITAL LETTER S */
+ ["\uFF34", "\uFF54"], /* FULLWIDTH LATIN CAPITAL LETTER T */
+ ["\uFF35", "\uFF55"], /* FULLWIDTH LATIN CAPITAL LETTER U */
+ ["\uFF36", "\uFF56"], /* FULLWIDTH LATIN CAPITAL LETTER V */
+ ["\uFF37", "\uFF57"], /* FULLWIDTH LATIN CAPITAL LETTER W */
+ ["\uFF38", "\uFF58"], /* FULLWIDTH LATIN CAPITAL LETTER X */
+ ["\uFF39", "\uFF59"], /* FULLWIDTH LATIN CAPITAL LETTER Y */
+ ["\uFF3A", "\uFF5A"], /* FULLWIDTH LATIN CAPITAL LETTER Z */
+ ["\uFF3B", "\uFF3B"], /* FULLWIDTH LEFT SQUARE BRACKET (FULLWIDTH OPENING SQUARE BRACKET) */
+ ["\uFF3C", "\uFF3C"], /* FULLWIDTH REVERSE SOLIDUS (FULLWIDTH BACKSLASH) */
+ ["\uFF3D", "\uFF3D"], /* FULLWIDTH RIGHT SQUARE BRACKET (FULLWIDTH CLOSING SQUARE BRACKET) */
+ ["\uFF3E", "\uFF3E"], /* FULLWIDTH CIRCUMFLEX ACCENT (FULLWIDTH SPACING CIRCUMFLEX) */
+ ["\uFF3F", "\uFF3F"], /* FULLWIDTH LOW LINE (FULLWIDTH SPACING UNDERSCORE) */
+ ["\uFF40", "\uFF40"], /* FULLWIDTH GRAVE ACCENT (FULLWIDTH SPACING GRAVE) */
+ ["\uFF21", "\uFF41"], /* FULLWIDTH LATIN SMALL LETTER A */
+ ["\uFF22", "\uFF42"], /* FULLWIDTH LATIN SMALL LETTER B */
+ ["\uFF23", "\uFF43"], /* FULLWIDTH LATIN SMALL LETTER C */
+ ["\uFF24", "\uFF44"], /* FULLWIDTH LATIN SMALL LETTER D */
+ ["\uFF25", "\uFF45"], /* FULLWIDTH LATIN SMALL LETTER E */
+ ["\uFF26", "\uFF46"], /* FULLWIDTH LATIN SMALL LETTER F */
+ ["\uFF27", "\uFF47"], /* FULLWIDTH LATIN SMALL LETTER G */
+ ["\uFF28", "\uFF48"], /* FULLWIDTH LATIN SMALL LETTER H */
+ ["\uFF29", "\uFF49"], /* FULLWIDTH LATIN SMALL LETTER I */
+ ["\uFF2A", "\uFF4A"], /* FULLWIDTH LATIN SMALL LETTER J */
+ ["\uFF2B", "\uFF4B"], /* FULLWIDTH LATIN SMALL LETTER K */
+ ["\uFF2C", "\uFF4C"], /* FULLWIDTH LATIN SMALL LETTER L */
+ ["\uFF2D", "\uFF4D"], /* FULLWIDTH LATIN SMALL LETTER M */
+ ["\uFF2E", "\uFF4E"], /* FULLWIDTH LATIN SMALL LETTER N */
+ ["\uFF2F", "\uFF4F"], /* FULLWIDTH LATIN SMALL LETTER O */
+ ["\uFF30", "\uFF50"], /* FULLWIDTH LATIN SMALL LETTER P */
+ ["\uFF31", "\uFF51"], /* FULLWIDTH LATIN SMALL LETTER Q */
+ ["\uFF32", "\uFF52"], /* FULLWIDTH LATIN SMALL LETTER R */
+ ["\uFF33", "\uFF53"], /* FULLWIDTH LATIN SMALL LETTER S */
+ ["\uFF34", "\uFF54"], /* FULLWIDTH LATIN SMALL LETTER T */
+ ["\uFF35", "\uFF55"], /* FULLWIDTH LATIN SMALL LETTER U */
+ ["\uFF36", "\uFF56"], /* FULLWIDTH LATIN SMALL LETTER V */
+ ["\uFF37", "\uFF57"], /* FULLWIDTH LATIN SMALL LETTER W */
+ ["\uFF38", "\uFF58"], /* FULLWIDTH LATIN SMALL LETTER X */
+ ["\uFF39", "\uFF59"], /* FULLWIDTH LATIN SMALL LETTER Y */
+ ["\uFF3A", "\uFF5A"], /* FULLWIDTH LATIN SMALL LETTER Z */
+ ["\uFF5B", "\uFF5B"], /* FULLWIDTH LEFT CURLY BRACKET (FULLWIDTH OPENING CURLY BRACKET) */
+ ["\uFF5C", "\uFF5C"], /* FULLWIDTH VERTICAL LINE (FULLWIDTH VERTICAL BAR) */
+ ["\uFF5D", "\uFF5D"], /* FULLWIDTH RIGHT CURLY BRACKET (FULLWIDTH CLOSING CURLY BRACKET) */
+ ["\uFF5E", "\uFF5E"], /* FULLWIDTH TILDE (FULLWIDTH SPACING TILDE) */
+ ["\uFF5F", "\uFF5F"], /* FULLWIDTH LEFT WHITE PARENTHESIS */
+ ["\uFF60", "\uFF60"], /* FULLWIDTH RIGHT WHITE PARENTHESIS */
+ ["\uFF61", "\uFF61"], /* HALFWIDTH IDEOGRAPHIC FULL STOP (HALFWIDTH IDEOGRAPHIC PERIOD) */
+ ["\uFF62", "\uFF62"], /* HALFWIDTH LEFT CORNER BRACKET (HALFWIDTH OPENING CORNER BRACKET) */
+ ["\uFF63", "\uFF63"], /* HALFWIDTH RIGHT CORNER BRACKET (HALFWIDTH CLOSING CORNER BRACKET) */
+ ["\uFF64", "\uFF64"], /* HALFWIDTH IDEOGRAPHIC COMMA */
+ ["\uFF65", "\uFF65"], /* HALFWIDTH KATAKANA MIDDLE DOT */
+ ["\uFF66", "\uFF66"], /* HALFWIDTH KATAKANA LETTER WO */
+ ["\uFF67", "\uFF67"], /* HALFWIDTH KATAKANA LETTER SMALL A */
+ ["\uFF68", "\uFF68"], /* HALFWIDTH KATAKANA LETTER SMALL I */
+ ["\uFF69", "\uFF69"], /* HALFWIDTH KATAKANA LETTER SMALL U */
+ ["\uFF6A", "\uFF6A"], /* HALFWIDTH KATAKANA LETTER SMALL E */
+ ["\uFF6B", "\uFF6B"], /* HALFWIDTH KATAKANA LETTER SMALL O */
+ ["\uFF6C", "\uFF6C"], /* HALFWIDTH KATAKANA LETTER SMALL YA */
+ ["\uFF6D", "\uFF6D"], /* HALFWIDTH KATAKANA LETTER SMALL YU */
+ ["\uFF6E", "\uFF6E"], /* HALFWIDTH KATAKANA LETTER SMALL YO */
+ ["\uFF6F", "\uFF6F"], /* HALFWIDTH KATAKANA LETTER SMALL TU */
+ ["\uFF70", "\uFF70"], /* HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ ["\uFF71", "\uFF71"], /* HALFWIDTH KATAKANA LETTER A */
+ ["\uFF72", "\uFF72"], /* HALFWIDTH KATAKANA LETTER I */
+ ["\uFF73", "\uFF73"], /* HALFWIDTH KATAKANA LETTER U */
+ ["\uFF74", "\uFF74"], /* HALFWIDTH KATAKANA LETTER E */
+ ["\uFF75", "\uFF75"], /* HALFWIDTH KATAKANA LETTER O */
+ ["\uFF76", "\uFF76"], /* HALFWIDTH KATAKANA LETTER KA */
+ ["\uFF77", "\uFF77"], /* HALFWIDTH KATAKANA LETTER KI */
+ ["\uFF78", "\uFF78"], /* HALFWIDTH KATAKANA LETTER KU */
+ ["\uFF79", "\uFF79"], /* HALFWIDTH KATAKANA LETTER KE */
+ ["\uFF7A", "\uFF7A"], /* HALFWIDTH KATAKANA LETTER KO */
+ ["\uFF7B", "\uFF7B"], /* HALFWIDTH KATAKANA LETTER SA */
+ ["\uFF7C", "\uFF7C"], /* HALFWIDTH KATAKANA LETTER SI */
+ ["\uFF7D", "\uFF7D"], /* HALFWIDTH KATAKANA LETTER SU */
+ ["\uFF7E", "\uFF7E"], /* HALFWIDTH KATAKANA LETTER SE */
+ ["\uFF7F", "\uFF7F"], /* HALFWIDTH KATAKANA LETTER SO */
+ ["\uFF80", "\uFF80"], /* HALFWIDTH KATAKANA LETTER TA */
+ ["\uFF81", "\uFF81"], /* HALFWIDTH KATAKANA LETTER TI */
+ ["\uFF82", "\uFF82"], /* HALFWIDTH KATAKANA LETTER TU */
+ ["\uFF83", "\uFF83"], /* HALFWIDTH KATAKANA LETTER TE */
+ ["\uFF84", "\uFF84"], /* HALFWIDTH KATAKANA LETTER TO */
+ ["\uFF85", "\uFF85"], /* HALFWIDTH KATAKANA LETTER NA */
+ ["\uFF86", "\uFF86"], /* HALFWIDTH KATAKANA LETTER NI */
+ ["\uFF87", "\uFF87"], /* HALFWIDTH KATAKANA LETTER NU */
+ ["\uFF88", "\uFF88"], /* HALFWIDTH KATAKANA LETTER NE */
+ ["\uFF89", "\uFF89"], /* HALFWIDTH KATAKANA LETTER NO */
+ ["\uFF8A", "\uFF8A"], /* HALFWIDTH KATAKANA LETTER HA */
+ ["\uFF8B", "\uFF8B"], /* HALFWIDTH KATAKANA LETTER HI */
+ ["\uFF8C", "\uFF8C"], /* HALFWIDTH KATAKANA LETTER HU */
+ ["\uFF8D", "\uFF8D"], /* HALFWIDTH KATAKANA LETTER HE */
+ ["\uFF8E", "\uFF8E"], /* HALFWIDTH KATAKANA LETTER HO */
+ ["\uFF8F", "\uFF8F"], /* HALFWIDTH KATAKANA LETTER MA */
+ ["\uFF90", "\uFF90"], /* HALFWIDTH KATAKANA LETTER MI */
+ ["\uFF91", "\uFF91"], /* HALFWIDTH KATAKANA LETTER MU */
+ ["\uFF92", "\uFF92"], /* HALFWIDTH KATAKANA LETTER ME */
+ ["\uFF93", "\uFF93"], /* HALFWIDTH KATAKANA LETTER MO */
+ ["\uFF94", "\uFF94"], /* HALFWIDTH KATAKANA LETTER YA */
+ ["\uFF95", "\uFF95"], /* HALFWIDTH KATAKANA LETTER YU */
+ ["\uFF96", "\uFF96"], /* HALFWIDTH KATAKANA LETTER YO */
+ ["\uFF97", "\uFF97"], /* HALFWIDTH KATAKANA LETTER RA */
+ ["\uFF98", "\uFF98"], /* HALFWIDTH KATAKANA LETTER RI */
+ ["\uFF99", "\uFF99"], /* HALFWIDTH KATAKANA LETTER RU */
+ ["\uFF9A", "\uFF9A"], /* HALFWIDTH KATAKANA LETTER RE */
+ ["\uFF9B", "\uFF9B"], /* HALFWIDTH KATAKANA LETTER RO */
+ ["\uFF9C", "\uFF9C"], /* HALFWIDTH KATAKANA LETTER WA */
+ ["\uFF9D", "\uFF9D"], /* HALFWIDTH KATAKANA LETTER N */
+ ["\uFF9E", "\uFF9E"], /* HALFWIDTH KATAKANA VOICED SOUND MARK */
+ ["\uFF9F", "\uFF9F"], /* HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK */
+ ["\uFFA0", "\uFFA0"], /* HALFWIDTH HANGUL FILLER (HALFWIDTH HANGUL CAE OM) */
+ ["\uFFA1", "\uFFA1"], /* HALFWIDTH HANGUL LETTER KIYEOK (HALFWIDTH HANGUL LETTER GIYEOG) */
+ ["\uFFA2", "\uFFA2"], /* HALFWIDTH HANGUL LETTER SSANGKIYEOK (HALFWIDTH HANGUL LETTER SSANG GIYEOG) */
+ ["\uFFA3", "\uFFA3"], /* HALFWIDTH HANGUL LETTER KIYEOK-SIOS (HALFWIDTH HANGUL LETTER GIYEOG SIOS) */
+ ["\uFFA4", "\uFFA4"], /* HALFWIDTH HANGUL LETTER NIEUN */
+ ["\uFFA5", "\uFFA5"], /* HALFWIDTH HANGUL LETTER NIEUN-CIEUC (HALFWIDTH HANGUL LETTER NIEUN JIEUJ) */
+ ["\uFFA6", "\uFFA6"], /* HALFWIDTH HANGUL LETTER NIEUN-HIEUH (HALFWIDTH HANGUL LETTER NIEUN HIEUH) */
+ ["\uFFA7", "\uFFA7"], /* HALFWIDTH HANGUL LETTER TIKEUT (HALFWIDTH HANGUL LETTER DIGEUD) */
+ ["\uFFA8", "\uFFA8"], /* HALFWIDTH HANGUL LETTER SSANGTIKEUT (HALFWIDTH HANGUL LETTER SSANG DIGEUD) */
+ ["\uFFA9", "\uFFA9"], /* HALFWIDTH HANGUL LETTER RIEUL (HALFWIDTH HANGUL LETTER LIEUL) */
+ ["\uFFAA", "\uFFAA"], /* HALFWIDTH HANGUL LETTER RIEUL-KIYEOK (HALFWIDTH HANGUL LETTER LIEUL GIYEOG) */
+ ["\uFFAB", "\uFFAB"], /* HALFWIDTH HANGUL LETTER RIEUL-MIEUM (HALFWIDTH HANGUL LETTER LIEUL MIEUM) */
+ ["\uFFAC", "\uFFAC"], /* HALFWIDTH HANGUL LETTER RIEUL-PIEUP (HALFWIDTH HANGUL LETTER LIEUL BIEUB) */
+ ["\uFFAD", "\uFFAD"], /* HALFWIDTH HANGUL LETTER RIEUL-SIOS (HALFWIDTH HANGUL LETTER LIEUL SIOS) */
+ ["\uFFAE", "\uFFAE"], /* HALFWIDTH HANGUL LETTER RIEUL-THIEUTH (HALFWIDTH HANGUL LETTER LIEUL TIEUT) */
+ ["\uFFAF", "\uFFAF"], /* HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH (HALFWIDTH HANGUL LETTER LIEUL PIEUP) */
+ ["\uFFB0", "\uFFB0"], /* HALFWIDTH HANGUL LETTER RIEUL-HIEUH (HALFWIDTH HANGUL LETTER LIEUL HIEUH) */
+ ["\uFFB1", "\uFFB1"], /* HALFWIDTH HANGUL LETTER MIEUM */
+ ["\uFFB2", "\uFFB2"], /* HALFWIDTH HANGUL LETTER PIEUP (HALFWIDTH HANGUL LETTER BIEUB) */
+ ["\uFFB3", "\uFFB3"], /* HALFWIDTH HANGUL LETTER SSANGPIEUP (HALFWIDTH HANGUL LETTER SSANG BIEUB) */
+ ["\uFFB4", "\uFFB4"], /* HALFWIDTH HANGUL LETTER PIEUP-SIOS (HALFWIDTH HANGUL LETTER BIEUB SIOS) */
+ ["\uFFB5", "\uFFB5"], /* HALFWIDTH HANGUL LETTER SIOS */
+ ["\uFFB6", "\uFFB6"], /* HALFWIDTH HANGUL LETTER SSANGSIOS (HALFWIDTH HANGUL LETTER SSANG SIOS) */
+ ["\uFFB7", "\uFFB7"], /* HALFWIDTH HANGUL LETTER IEUNG */
+ ["\uFFB8", "\uFFB8"], /* HALFWIDTH HANGUL LETTER CIEUC (HALFWIDTH HANGUL LETTER JIEUJ) */
+ ["\uFFB9", "\uFFB9"], /* HALFWIDTH HANGUL LETTER SSANGCIEUC (HALFWIDTH HANGUL LETTER SSANG JIEUJ) */
+ ["\uFFBA", "\uFFBA"], /* HALFWIDTH HANGUL LETTER CHIEUCH (HALFWIDTH HANGUL LETTER CIEUC) */
+ ["\uFFBB", "\uFFBB"], /* HALFWIDTH HANGUL LETTER KHIEUKH (HALFWIDTH HANGUL LETTER KIYEOK) */
+ ["\uFFBC", "\uFFBC"], /* HALFWIDTH HANGUL LETTER THIEUTH (HALFWIDTH HANGUL LETTER TIEUT) */
+ ["\uFFBD", "\uFFBD"], /* HALFWIDTH HANGUL LETTER PHIEUPH (HALFWIDTH HANGUL LETTER PIEUP) */
+ ["\uFFBE", "\uFFBE"], /* HALFWIDTH HANGUL LETTER HIEUH */
+ ["\uFFBF", "\uFFBF"],
+ ["\uFFC0", "\uFFC0"],
+ ["\uFFC1", "\uFFC1"],
+ ["\uFFC2", "\uFFC2"], /* HALFWIDTH HANGUL LETTER A */
+ ["\uFFC3", "\uFFC3"], /* HALFWIDTH HANGUL LETTER AE */
+ ["\uFFC4", "\uFFC4"], /* HALFWIDTH HANGUL LETTER YA */
+ ["\uFFC5", "\uFFC5"], /* HALFWIDTH HANGUL LETTER YAE */
+ ["\uFFC6", "\uFFC6"], /* HALFWIDTH HANGUL LETTER EO */
+ ["\uFFC7", "\uFFC7"], /* HALFWIDTH HANGUL LETTER E */
+ ["\uFFC8", "\uFFC8"],
+ ["\uFFC9", "\uFFC9"],
+ ["\uFFCA", "\uFFCA"], /* HALFWIDTH HANGUL LETTER YEO */
+ ["\uFFCB", "\uFFCB"], /* HALFWIDTH HANGUL LETTER YE */
+ ["\uFFCC", "\uFFCC"], /* HALFWIDTH HANGUL LETTER O */
+ ["\uFFCD", "\uFFCD"], /* HALFWIDTH HANGUL LETTER WA */
+ ["\uFFCE", "\uFFCE"], /* HALFWIDTH HANGUL LETTER WAE */
+ ["\uFFCF", "\uFFCF"], /* HALFWIDTH HANGUL LETTER OE */
+ ["\uFFD0", "\uFFD0"],
+ ["\uFFD1", "\uFFD1"],
+ ["\uFFD2", "\uFFD2"], /* HALFWIDTH HANGUL LETTER YO */
+ ["\uFFD3", "\uFFD3"], /* HALFWIDTH HANGUL LETTER U */
+ ["\uFFD4", "\uFFD4"], /* HALFWIDTH HANGUL LETTER WEO */
+ ["\uFFD5", "\uFFD5"], /* HALFWIDTH HANGUL LETTER WE */
+ ["\uFFD6", "\uFFD6"], /* HALFWIDTH HANGUL LETTER WI */
+ ["\uFFD7", "\uFFD7"], /* HALFWIDTH HANGUL LETTER YU */
+ ["\uFFD8", "\uFFD8"],
+ ["\uFFD9", "\uFFD9"],
+ ["\uFFDA", "\uFFDA"], /* HALFWIDTH HANGUL LETTER EU */
+ ["\uFFDB", "\uFFDB"], /* HALFWIDTH HANGUL LETTER YI */
+ ["\uFFDC", "\uFFDC"], /* HALFWIDTH HANGUL LETTER I */
+ ["\uFFDD", "\uFFDD"],
+ ["\uFFDE", "\uFFDE"],
+ ["\uFFDF", "\uFFDF"],
+ ["\uFFE0", "\uFFE0"], /* FULLWIDTH CENT SIGN */
+ ["\uFFE1", "\uFFE1"], /* FULLWIDTH POUND SIGN */
+ ["\uFFE2", "\uFFE2"], /* FULLWIDTH NOT SIGN */
+ ["\uFFE3", "\uFFE3"], /* FULLWIDTH MACRON (FULLWIDTH SPACING MACRON) */
+ ["\uFFE4", "\uFFE4"], /* FULLWIDTH BROKEN BAR (FULLWIDTH BROKEN VERTICAL BAR) */
+ ["\uFFE5", "\uFFE5"], /* FULLWIDTH YEN SIGN */
+ ["\uFFE6", "\uFFE6"], /* FULLWIDTH WON SIGN */
+ ["\uFFE7", "\uFFE7"],
+ ["\uFFE8", "\uFFE8"], /* HALFWIDTH FORMS LIGHT VERTICAL */
+ ["\uFFE9", "\uFFE9"], /* HALFWIDTH LEFTWARDS ARROW */
+ ["\uFFEA", "\uFFEA"], /* HALFWIDTH UPWARDS ARROW */
+ ["\uFFEB", "\uFFEB"], /* HALFWIDTH RIGHTWARDS ARROW */
+ ["\uFFEC", "\uFFEC"], /* HALFWIDTH DOWNWARDS ARROW */
+ ["\uFFED", "\uFFED"], /* HALFWIDTH BLACK SQUARE */
+ ["\uFFEE", "\uFFEE"], /* HALFWIDTH WHITE CIRCLE */
+ ["\uFFEF", "\uFFEF"],
+ ["\uFFF0", "\uFFF0"],
+ ["\uFFF1", "\uFFF1"],
+ ["\uFFF2", "\uFFF2"],
+ ["\uFFF3", "\uFFF3"],
+ ["\uFFF4", "\uFFF4"],
+ ["\uFFF5", "\uFFF5"],
+ ["\uFFF6", "\uFFF6"],
+ ["\uFFF7", "\uFFF7"],
+ ["\uFFF8", "\uFFF8"],
+ ["\uFFF9", "\uFFF9"], /* INTERLINEAR ANNOTATION ANCHOR */
+ ["\uFFFA", "\uFFFA"], /* INTERLINEAR ANNOTATION SEPARATOR */
+ ["\uFFFB", "\uFFFB"], /* INTERLINEAR ANNOTATION TERMINATOR */
+ ["\uFFFC", "\uFFFC"], /* OBJECT REPLACEMENT CHARACTER */
+ ["\uFFFD", "\uFFFD"], /* REPLACEMENT CHARACTER */
+ ["\uFFFE", "\uFFFE"],
+ ["\uFFFF", "\uFFFF"],
];
+
assertEq(mapping.length, 0x10000);
for (var i = 0; i <= 0xffff; i++) {
var char = String.fromCharCode(i);
var info = mapping[i];
- assertEq(char.toUpperCase().charCodeAt(0), info[0]);
- assertEq(char.toLowerCase().charCodeAt(0), info[1]);
+ assertEq(char.toUpperCase(), info[0]);
+ assertEq(char.toLowerCase(), info[1]);
}
if (typeof reportCompare === "function")
diff --git a/js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js b/js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js
index 21d983bf41..ac0aaf56e2 100644
--- a/js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js
+++ b/js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js
@@ -18,2784 +18,2784 @@ function test(code, ...equivs) {
codeRe = new RegExp("[" + String.fromCodePoint(code) + "]+", "iu");
assertEqArray(codeRe.exec("<" + ans + ">"), [ans]);
}
-test(0x41,0x61);
-test(0x42,0x62);
-test(0x43,0x63);
-test(0x44,0x64);
-test(0x45,0x65);
-test(0x46,0x66);
-test(0x47,0x67);
-test(0x48,0x68);
-test(0x49,0x69);
-test(0x4a,0x6a);
-test(0x4b,0x6b,0x212a);
-test(0x4c,0x6c);
-test(0x4d,0x6d);
-test(0x4e,0x6e);
-test(0x4f,0x6f);
-test(0x50,0x70);
-test(0x51,0x71);
-test(0x52,0x72);
-test(0x53,0x73,0x17f);
-test(0x54,0x74);
-test(0x55,0x75);
-test(0x56,0x76);
-test(0x57,0x77);
-test(0x58,0x78);
-test(0x59,0x79);
-test(0x5a,0x7a);
-test(0x61,0x41);
-test(0x62,0x42);
-test(0x63,0x43);
-test(0x64,0x44);
-test(0x65,0x45);
-test(0x66,0x46);
-test(0x67,0x47);
-test(0x68,0x48);
-test(0x69,0x49);
-test(0x6a,0x4a);
-test(0x6b,0x4b,0x212a);
-test(0x6c,0x4c);
-test(0x6d,0x4d);
-test(0x6e,0x4e);
-test(0x6f,0x4f);
-test(0x70,0x50);
-test(0x71,0x51);
-test(0x72,0x52);
-test(0x73,0x53,0x17f);
-test(0x74,0x54);
-test(0x75,0x55);
-test(0x76,0x56);
-test(0x77,0x57);
-test(0x78,0x58);
-test(0x79,0x59);
-test(0x7a,0x5a);
-test(0xb5,0x3bc,0x39c);
-test(0xc0,0xe0);
-test(0xc1,0xe1);
-test(0xc2,0xe2);
-test(0xc3,0xe3);
-test(0xc4,0xe4);
-test(0xc5,0xe5,0x212b);
-test(0xc6,0xe6);
-test(0xc7,0xe7);
-test(0xc8,0xe8);
-test(0xc9,0xe9);
-test(0xca,0xea);
-test(0xcb,0xeb);
-test(0xcc,0xec);
-test(0xcd,0xed);
-test(0xce,0xee);
-test(0xcf,0xef);
-test(0xd0,0xf0);
-test(0xd1,0xf1);
-test(0xd2,0xf2);
-test(0xd3,0xf3);
-test(0xd4,0xf4);
-test(0xd5,0xf5);
-test(0xd6,0xf6);
-test(0xd8,0xf8);
-test(0xd9,0xf9);
-test(0xda,0xfa);
-test(0xdb,0xfb);
-test(0xdc,0xfc);
-test(0xdd,0xfd);
-test(0xde,0xfe);
-test(0xdf,0x1e9e);
-test(0xe0,0xc0);
-test(0xe1,0xc1);
-test(0xe2,0xc2);
-test(0xe3,0xc3);
-test(0xe4,0xc4);
-test(0xe5,0xc5,0x212b);
-test(0xe6,0xc6);
-test(0xe7,0xc7);
-test(0xe8,0xc8);
-test(0xe9,0xc9);
-test(0xea,0xca);
-test(0xeb,0xcb);
-test(0xec,0xcc);
-test(0xed,0xcd);
-test(0xee,0xce);
-test(0xef,0xcf);
-test(0xf0,0xd0);
-test(0xf1,0xd1);
-test(0xf2,0xd2);
-test(0xf3,0xd3);
-test(0xf4,0xd4);
-test(0xf5,0xd5);
-test(0xf6,0xd6);
-test(0xf8,0xd8);
-test(0xf9,0xd9);
-test(0xfa,0xda);
-test(0xfb,0xdb);
-test(0xfc,0xdc);
-test(0xfd,0xdd);
-test(0xfe,0xde);
-test(0xff,0x178);
-test(0x100,0x101);
-test(0x101,0x100);
-test(0x102,0x103);
-test(0x103,0x102);
-test(0x104,0x105);
-test(0x105,0x104);
-test(0x106,0x107);
-test(0x107,0x106);
-test(0x108,0x109);
-test(0x109,0x108);
-test(0x10a,0x10b);
-test(0x10b,0x10a);
-test(0x10c,0x10d);
-test(0x10d,0x10c);
-test(0x10e,0x10f);
-test(0x10f,0x10e);
-test(0x110,0x111);
-test(0x111,0x110);
-test(0x112,0x113);
-test(0x113,0x112);
-test(0x114,0x115);
-test(0x115,0x114);
-test(0x116,0x117);
-test(0x117,0x116);
-test(0x118,0x119);
-test(0x119,0x118);
-test(0x11a,0x11b);
-test(0x11b,0x11a);
-test(0x11c,0x11d);
-test(0x11d,0x11c);
-test(0x11e,0x11f);
-test(0x11f,0x11e);
-test(0x120,0x121);
-test(0x121,0x120);
-test(0x122,0x123);
-test(0x123,0x122);
-test(0x124,0x125);
-test(0x125,0x124);
-test(0x126,0x127);
-test(0x127,0x126);
-test(0x128,0x129);
-test(0x129,0x128);
-test(0x12a,0x12b);
-test(0x12b,0x12a);
-test(0x12c,0x12d);
-test(0x12d,0x12c);
-test(0x12e,0x12f);
-test(0x12f,0x12e);
-test(0x132,0x133);
-test(0x133,0x132);
-test(0x134,0x135);
-test(0x135,0x134);
-test(0x136,0x137);
-test(0x137,0x136);
-test(0x139,0x13a);
-test(0x13a,0x139);
-test(0x13b,0x13c);
-test(0x13c,0x13b);
-test(0x13d,0x13e);
-test(0x13e,0x13d);
-test(0x13f,0x140);
-test(0x140,0x13f);
-test(0x141,0x142);
-test(0x142,0x141);
-test(0x143,0x144);
-test(0x144,0x143);
-test(0x145,0x146);
-test(0x146,0x145);
-test(0x147,0x148);
-test(0x148,0x147);
-test(0x14a,0x14b);
-test(0x14b,0x14a);
-test(0x14c,0x14d);
-test(0x14d,0x14c);
-test(0x14e,0x14f);
-test(0x14f,0x14e);
-test(0x150,0x151);
-test(0x151,0x150);
-test(0x152,0x153);
-test(0x153,0x152);
-test(0x154,0x155);
-test(0x155,0x154);
-test(0x156,0x157);
-test(0x157,0x156);
-test(0x158,0x159);
-test(0x159,0x158);
-test(0x15a,0x15b);
-test(0x15b,0x15a);
-test(0x15c,0x15d);
-test(0x15d,0x15c);
-test(0x15e,0x15f);
-test(0x15f,0x15e);
-test(0x160,0x161);
-test(0x161,0x160);
-test(0x162,0x163);
-test(0x163,0x162);
-test(0x164,0x165);
-test(0x165,0x164);
-test(0x166,0x167);
-test(0x167,0x166);
-test(0x168,0x169);
-test(0x169,0x168);
-test(0x16a,0x16b);
-test(0x16b,0x16a);
-test(0x16c,0x16d);
-test(0x16d,0x16c);
-test(0x16e,0x16f);
-test(0x16f,0x16e);
-test(0x170,0x171);
-test(0x171,0x170);
-test(0x172,0x173);
-test(0x173,0x172);
-test(0x174,0x175);
-test(0x175,0x174);
-test(0x176,0x177);
-test(0x177,0x176);
-test(0x178,0xff);
-test(0x179,0x17a);
-test(0x17a,0x179);
-test(0x17b,0x17c);
-test(0x17c,0x17b);
-test(0x17d,0x17e);
-test(0x17e,0x17d);
-test(0x17f,0x73,0x53);
-test(0x180,0x243);
-test(0x181,0x253);
-test(0x182,0x183);
-test(0x183,0x182);
-test(0x184,0x185);
-test(0x185,0x184);
-test(0x186,0x254);
-test(0x187,0x188);
-test(0x188,0x187);
-test(0x189,0x256);
-test(0x18a,0x257);
-test(0x18b,0x18c);
-test(0x18c,0x18b);
-test(0x18e,0x1dd);
-test(0x18f,0x259);
-test(0x190,0x25b);
-test(0x191,0x192);
-test(0x192,0x191);
-test(0x193,0x260);
-test(0x194,0x263);
-test(0x195,0x1f6);
-test(0x196,0x269);
-test(0x197,0x268);
-test(0x198,0x199);
-test(0x199,0x198);
-test(0x19a,0x23d);
-test(0x19c,0x26f);
-test(0x19d,0x272);
-test(0x19e,0x220);
-test(0x19f,0x275);
-test(0x1a0,0x1a1);
-test(0x1a1,0x1a0);
-test(0x1a2,0x1a3);
-test(0x1a3,0x1a2);
-test(0x1a4,0x1a5);
-test(0x1a5,0x1a4);
-test(0x1a6,0x280);
-test(0x1a7,0x1a8);
-test(0x1a8,0x1a7);
-test(0x1a9,0x283);
-test(0x1ac,0x1ad);
-test(0x1ad,0x1ac);
-test(0x1ae,0x288);
-test(0x1af,0x1b0);
-test(0x1b0,0x1af);
-test(0x1b1,0x28a);
-test(0x1b2,0x28b);
-test(0x1b3,0x1b4);
-test(0x1b4,0x1b3);
-test(0x1b5,0x1b6);
-test(0x1b6,0x1b5);
-test(0x1b7,0x292);
-test(0x1b8,0x1b9);
-test(0x1b9,0x1b8);
-test(0x1bc,0x1bd);
-test(0x1bd,0x1bc);
-test(0x1bf,0x1f7);
-test(0x1c4,0x1c6,0x1c5);
-test(0x1c5,0x1c6,0x1c4);
-test(0x1c6,0x1c4,0x1c5);
-test(0x1c7,0x1c9,0x1c8);
-test(0x1c8,0x1c9,0x1c7);
-test(0x1c9,0x1c7,0x1c8);
-test(0x1ca,0x1cc,0x1cb);
-test(0x1cb,0x1cc,0x1ca);
-test(0x1cc,0x1ca,0x1cb);
-test(0x1cd,0x1ce);
-test(0x1ce,0x1cd);
-test(0x1cf,0x1d0);
-test(0x1d0,0x1cf);
-test(0x1d1,0x1d2);
-test(0x1d2,0x1d1);
-test(0x1d3,0x1d4);
-test(0x1d4,0x1d3);
-test(0x1d5,0x1d6);
-test(0x1d6,0x1d5);
-test(0x1d7,0x1d8);
-test(0x1d8,0x1d7);
-test(0x1d9,0x1da);
-test(0x1da,0x1d9);
-test(0x1db,0x1dc);
-test(0x1dc,0x1db);
-test(0x1dd,0x18e);
-test(0x1de,0x1df);
-test(0x1df,0x1de);
-test(0x1e0,0x1e1);
-test(0x1e1,0x1e0);
-test(0x1e2,0x1e3);
-test(0x1e3,0x1e2);
-test(0x1e4,0x1e5);
-test(0x1e5,0x1e4);
-test(0x1e6,0x1e7);
-test(0x1e7,0x1e6);
-test(0x1e8,0x1e9);
-test(0x1e9,0x1e8);
-test(0x1ea,0x1eb);
-test(0x1eb,0x1ea);
-test(0x1ec,0x1ed);
-test(0x1ed,0x1ec);
-test(0x1ee,0x1ef);
-test(0x1ef,0x1ee);
-test(0x1f1,0x1f3,0x1f2);
-test(0x1f2,0x1f3,0x1f1);
-test(0x1f3,0x1f1,0x1f2);
-test(0x1f4,0x1f5);
-test(0x1f5,0x1f4);
-test(0x1f6,0x195);
-test(0x1f7,0x1bf);
-test(0x1f8,0x1f9);
-test(0x1f9,0x1f8);
-test(0x1fa,0x1fb);
-test(0x1fb,0x1fa);
-test(0x1fc,0x1fd);
-test(0x1fd,0x1fc);
-test(0x1fe,0x1ff);
-test(0x1ff,0x1fe);
-test(0x200,0x201);
-test(0x201,0x200);
-test(0x202,0x203);
-test(0x203,0x202);
-test(0x204,0x205);
-test(0x205,0x204);
-test(0x206,0x207);
-test(0x207,0x206);
-test(0x208,0x209);
-test(0x209,0x208);
-test(0x20a,0x20b);
-test(0x20b,0x20a);
-test(0x20c,0x20d);
-test(0x20d,0x20c);
-test(0x20e,0x20f);
-test(0x20f,0x20e);
-test(0x210,0x211);
-test(0x211,0x210);
-test(0x212,0x213);
-test(0x213,0x212);
-test(0x214,0x215);
-test(0x215,0x214);
-test(0x216,0x217);
-test(0x217,0x216);
-test(0x218,0x219);
-test(0x219,0x218);
-test(0x21a,0x21b);
-test(0x21b,0x21a);
-test(0x21c,0x21d);
-test(0x21d,0x21c);
-test(0x21e,0x21f);
-test(0x21f,0x21e);
-test(0x220,0x19e);
-test(0x222,0x223);
-test(0x223,0x222);
-test(0x224,0x225);
-test(0x225,0x224);
-test(0x226,0x227);
-test(0x227,0x226);
-test(0x228,0x229);
-test(0x229,0x228);
-test(0x22a,0x22b);
-test(0x22b,0x22a);
-test(0x22c,0x22d);
-test(0x22d,0x22c);
-test(0x22e,0x22f);
-test(0x22f,0x22e);
-test(0x230,0x231);
-test(0x231,0x230);
-test(0x232,0x233);
-test(0x233,0x232);
-test(0x23a,0x2c65);
-test(0x23b,0x23c);
-test(0x23c,0x23b);
-test(0x23d,0x19a);
-test(0x23e,0x2c66);
-test(0x23f,0x2c7e);
-test(0x240,0x2c7f);
-test(0x241,0x242);
-test(0x242,0x241);
-test(0x243,0x180);
-test(0x244,0x289);
-test(0x245,0x28c);
-test(0x246,0x247);
-test(0x247,0x246);
-test(0x248,0x249);
-test(0x249,0x248);
-test(0x24a,0x24b);
-test(0x24b,0x24a);
-test(0x24c,0x24d);
-test(0x24d,0x24c);
-test(0x24e,0x24f);
-test(0x24f,0x24e);
-test(0x250,0x2c6f);
-test(0x251,0x2c6d);
-test(0x252,0x2c70);
-test(0x253,0x181);
-test(0x254,0x186);
-test(0x256,0x189);
-test(0x257,0x18a);
-test(0x259,0x18f);
-test(0x25b,0x190);
-test(0x25c,0xa7ab);
-test(0x260,0x193);
-test(0x261,0xa7ac);
-test(0x263,0x194);
-test(0x265,0xa78d);
-test(0x266,0xa7aa);
-test(0x268,0x197);
-test(0x269,0x196);
-test(0x26a,0xa7ae);
-test(0x26b,0x2c62);
-test(0x26c,0xa7ad);
-test(0x26f,0x19c);
-test(0x271,0x2c6e);
-test(0x272,0x19d);
-test(0x275,0x19f);
-test(0x27d,0x2c64);
-test(0x280,0x1a6);
-test(0x283,0x1a9);
-test(0x287,0xa7b1);
-test(0x288,0x1ae);
-test(0x289,0x244);
-test(0x28a,0x1b1);
-test(0x28b,0x1b2);
-test(0x28c,0x245);
-test(0x292,0x1b7);
-test(0x29d,0xa7b2);
-test(0x29e,0xa7b0);
-test(0x345,0x3b9,0x399,0x1fbe);
-test(0x370,0x371);
-test(0x371,0x370);
-test(0x372,0x373);
-test(0x373,0x372);
-test(0x376,0x377);
-test(0x377,0x376);
-test(0x37b,0x3fd);
-test(0x37c,0x3fe);
-test(0x37d,0x3ff);
-test(0x37f,0x3f3);
-test(0x386,0x3ac);
-test(0x388,0x3ad);
-test(0x389,0x3ae);
-test(0x38a,0x3af);
-test(0x38c,0x3cc);
-test(0x38e,0x3cd);
-test(0x38f,0x3ce);
-test(0x391,0x3b1);
-test(0x392,0x3b2,0x3d0);
-test(0x393,0x3b3);
-test(0x394,0x3b4);
-test(0x395,0x3b5,0x3f5);
-test(0x396,0x3b6);
-test(0x397,0x3b7);
-test(0x398,0x3b8,0x3d1,0x3f4);
-test(0x399,0x3b9,0x345,0x1fbe);
-test(0x39a,0x3ba,0x3f0);
-test(0x39b,0x3bb);
-test(0x39c,0x3bc,0xb5);
-test(0x39d,0x3bd);
-test(0x39e,0x3be);
-test(0x39f,0x3bf);
-test(0x3a0,0x3c0,0x3d6);
-test(0x3a1,0x3c1,0x3f1);
-test(0x3a3,0x3c3,0x3c2);
-test(0x3a4,0x3c4);
-test(0x3a5,0x3c5);
-test(0x3a6,0x3c6,0x3d5);
-test(0x3a7,0x3c7);
-test(0x3a8,0x3c8);
-test(0x3a9,0x3c9,0x2126);
-test(0x3aa,0x3ca);
-test(0x3ab,0x3cb);
-test(0x3ac,0x386);
-test(0x3ad,0x388);
-test(0x3ae,0x389);
-test(0x3af,0x38a);
-test(0x3b1,0x391);
-test(0x3b2,0x392,0x3d0);
-test(0x3b3,0x393);
-test(0x3b4,0x394);
-test(0x3b5,0x395,0x3f5);
-test(0x3b6,0x396);
-test(0x3b7,0x397);
-test(0x3b8,0x398,0x3d1,0x3f4);
-test(0x3b9,0x345,0x399,0x1fbe);
-test(0x3ba,0x39a,0x3f0);
-test(0x3bb,0x39b);
-test(0x3bc,0xb5,0x39c);
-test(0x3bd,0x39d);
-test(0x3be,0x39e);
-test(0x3bf,0x39f);
-test(0x3c0,0x3a0,0x3d6);
-test(0x3c1,0x3a1,0x3f1);
-test(0x3c2,0x3c3,0x3a3);
-test(0x3c3,0x3a3,0x3c2);
-test(0x3c4,0x3a4);
-test(0x3c5,0x3a5);
-test(0x3c6,0x3a6,0x3d5);
-test(0x3c7,0x3a7);
-test(0x3c8,0x3a8);
-test(0x3c9,0x3a9,0x2126);
-test(0x3ca,0x3aa);
-test(0x3cb,0x3ab);
-test(0x3cc,0x38c);
-test(0x3cd,0x38e);
-test(0x3ce,0x38f);
-test(0x3cf,0x3d7);
-test(0x3d0,0x3b2,0x392);
-test(0x3d1,0x3b8,0x398,0x3f4);
-test(0x3d5,0x3c6,0x3a6);
-test(0x3d6,0x3c0,0x3a0);
-test(0x3d7,0x3cf);
-test(0x3d8,0x3d9);
-test(0x3d9,0x3d8);
-test(0x3da,0x3db);
-test(0x3db,0x3da);
-test(0x3dc,0x3dd);
-test(0x3dd,0x3dc);
-test(0x3de,0x3df);
-test(0x3df,0x3de);
-test(0x3e0,0x3e1);
-test(0x3e1,0x3e0);
-test(0x3e2,0x3e3);
-test(0x3e3,0x3e2);
-test(0x3e4,0x3e5);
-test(0x3e5,0x3e4);
-test(0x3e6,0x3e7);
-test(0x3e7,0x3e6);
-test(0x3e8,0x3e9);
-test(0x3e9,0x3e8);
-test(0x3ea,0x3eb);
-test(0x3eb,0x3ea);
-test(0x3ec,0x3ed);
-test(0x3ed,0x3ec);
-test(0x3ee,0x3ef);
-test(0x3ef,0x3ee);
-test(0x3f0,0x3ba,0x39a);
-test(0x3f1,0x3c1,0x3a1);
-test(0x3f2,0x3f9);
-test(0x3f3,0x37f);
-test(0x3f4,0x3b8,0x398,0x3d1);
-test(0x3f5,0x3b5,0x395);
-test(0x3f7,0x3f8);
-test(0x3f8,0x3f7);
-test(0x3f9,0x3f2);
-test(0x3fa,0x3fb);
-test(0x3fb,0x3fa);
-test(0x3fd,0x37b);
-test(0x3fe,0x37c);
-test(0x3ff,0x37d);
-test(0x400,0x450);
-test(0x401,0x451);
-test(0x402,0x452);
-test(0x403,0x453);
-test(0x404,0x454);
-test(0x405,0x455);
-test(0x406,0x456);
-test(0x407,0x457);
-test(0x408,0x458);
-test(0x409,0x459);
-test(0x40a,0x45a);
-test(0x40b,0x45b);
-test(0x40c,0x45c);
-test(0x40d,0x45d);
-test(0x40e,0x45e);
-test(0x40f,0x45f);
-test(0x410,0x430);
-test(0x411,0x431);
-test(0x412,0x432,0x1c80);
-test(0x413,0x433);
-test(0x414,0x434,0x1c81);
-test(0x415,0x435);
-test(0x416,0x436);
-test(0x417,0x437);
-test(0x418,0x438);
-test(0x419,0x439);
-test(0x41a,0x43a);
-test(0x41b,0x43b);
-test(0x41c,0x43c);
-test(0x41d,0x43d);
-test(0x41e,0x43e,0x1c82);
-test(0x41f,0x43f);
-test(0x420,0x440);
-test(0x421,0x441,0x1c83);
-test(0x422,0x442,0x1c84,0x1c85);
-test(0x423,0x443);
-test(0x424,0x444);
-test(0x425,0x445);
-test(0x426,0x446);
-test(0x427,0x447);
-test(0x428,0x448);
-test(0x429,0x449);
-test(0x42a,0x44a,0x1c86);
-test(0x42b,0x44b);
-test(0x42c,0x44c);
-test(0x42d,0x44d);
-test(0x42e,0x44e);
-test(0x42f,0x44f);
-test(0x430,0x410);
-test(0x431,0x411);
-test(0x432,0x412,0x1c80);
-test(0x433,0x413);
-test(0x434,0x414,0x1c81);
-test(0x435,0x415);
-test(0x436,0x416);
-test(0x437,0x417);
-test(0x438,0x418);
-test(0x439,0x419);
-test(0x43a,0x41a);
-test(0x43b,0x41b);
-test(0x43c,0x41c);
-test(0x43d,0x41d);
-test(0x43e,0x41e,0x1c82);
-test(0x43f,0x41f);
-test(0x440,0x420);
-test(0x441,0x421,0x1c83);
-test(0x442,0x422,0x1c84,0x1c85);
-test(0x443,0x423);
-test(0x444,0x424);
-test(0x445,0x425);
-test(0x446,0x426);
-test(0x447,0x427);
-test(0x448,0x428);
-test(0x449,0x429);
-test(0x44a,0x42a,0x1c86);
-test(0x44b,0x42b);
-test(0x44c,0x42c);
-test(0x44d,0x42d);
-test(0x44e,0x42e);
-test(0x44f,0x42f);
-test(0x450,0x400);
-test(0x451,0x401);
-test(0x452,0x402);
-test(0x453,0x403);
-test(0x454,0x404);
-test(0x455,0x405);
-test(0x456,0x406);
-test(0x457,0x407);
-test(0x458,0x408);
-test(0x459,0x409);
-test(0x45a,0x40a);
-test(0x45b,0x40b);
-test(0x45c,0x40c);
-test(0x45d,0x40d);
-test(0x45e,0x40e);
-test(0x45f,0x40f);
-test(0x460,0x461);
-test(0x461,0x460);
-test(0x462,0x463,0x1c87);
-test(0x463,0x462,0x1c87);
-test(0x464,0x465);
-test(0x465,0x464);
-test(0x466,0x467);
-test(0x467,0x466);
-test(0x468,0x469);
-test(0x469,0x468);
-test(0x46a,0x46b);
-test(0x46b,0x46a);
-test(0x46c,0x46d);
-test(0x46d,0x46c);
-test(0x46e,0x46f);
-test(0x46f,0x46e);
-test(0x470,0x471);
-test(0x471,0x470);
-test(0x472,0x473);
-test(0x473,0x472);
-test(0x474,0x475);
-test(0x475,0x474);
-test(0x476,0x477);
-test(0x477,0x476);
-test(0x478,0x479);
-test(0x479,0x478);
-test(0x47a,0x47b);
-test(0x47b,0x47a);
-test(0x47c,0x47d);
-test(0x47d,0x47c);
-test(0x47e,0x47f);
-test(0x47f,0x47e);
-test(0x480,0x481);
-test(0x481,0x480);
-test(0x48a,0x48b);
-test(0x48b,0x48a);
-test(0x48c,0x48d);
-test(0x48d,0x48c);
-test(0x48e,0x48f);
-test(0x48f,0x48e);
-test(0x490,0x491);
-test(0x491,0x490);
-test(0x492,0x493);
-test(0x493,0x492);
-test(0x494,0x495);
-test(0x495,0x494);
-test(0x496,0x497);
-test(0x497,0x496);
-test(0x498,0x499);
-test(0x499,0x498);
-test(0x49a,0x49b);
-test(0x49b,0x49a);
-test(0x49c,0x49d);
-test(0x49d,0x49c);
-test(0x49e,0x49f);
-test(0x49f,0x49e);
-test(0x4a0,0x4a1);
-test(0x4a1,0x4a0);
-test(0x4a2,0x4a3);
-test(0x4a3,0x4a2);
-test(0x4a4,0x4a5);
-test(0x4a5,0x4a4);
-test(0x4a6,0x4a7);
-test(0x4a7,0x4a6);
-test(0x4a8,0x4a9);
-test(0x4a9,0x4a8);
-test(0x4aa,0x4ab);
-test(0x4ab,0x4aa);
-test(0x4ac,0x4ad);
-test(0x4ad,0x4ac);
-test(0x4ae,0x4af);
-test(0x4af,0x4ae);
-test(0x4b0,0x4b1);
-test(0x4b1,0x4b0);
-test(0x4b2,0x4b3);
-test(0x4b3,0x4b2);
-test(0x4b4,0x4b5);
-test(0x4b5,0x4b4);
-test(0x4b6,0x4b7);
-test(0x4b7,0x4b6);
-test(0x4b8,0x4b9);
-test(0x4b9,0x4b8);
-test(0x4ba,0x4bb);
-test(0x4bb,0x4ba);
-test(0x4bc,0x4bd);
-test(0x4bd,0x4bc);
-test(0x4be,0x4bf);
-test(0x4bf,0x4be);
-test(0x4c0,0x4cf);
-test(0x4c1,0x4c2);
-test(0x4c2,0x4c1);
-test(0x4c3,0x4c4);
-test(0x4c4,0x4c3);
-test(0x4c5,0x4c6);
-test(0x4c6,0x4c5);
-test(0x4c7,0x4c8);
-test(0x4c8,0x4c7);
-test(0x4c9,0x4ca);
-test(0x4ca,0x4c9);
-test(0x4cb,0x4cc);
-test(0x4cc,0x4cb);
-test(0x4cd,0x4ce);
-test(0x4ce,0x4cd);
-test(0x4cf,0x4c0);
-test(0x4d0,0x4d1);
-test(0x4d1,0x4d0);
-test(0x4d2,0x4d3);
-test(0x4d3,0x4d2);
-test(0x4d4,0x4d5);
-test(0x4d5,0x4d4);
-test(0x4d6,0x4d7);
-test(0x4d7,0x4d6);
-test(0x4d8,0x4d9);
-test(0x4d9,0x4d8);
-test(0x4da,0x4db);
-test(0x4db,0x4da);
-test(0x4dc,0x4dd);
-test(0x4dd,0x4dc);
-test(0x4de,0x4df);
-test(0x4df,0x4de);
-test(0x4e0,0x4e1);
-test(0x4e1,0x4e0);
-test(0x4e2,0x4e3);
-test(0x4e3,0x4e2);
-test(0x4e4,0x4e5);
-test(0x4e5,0x4e4);
-test(0x4e6,0x4e7);
-test(0x4e7,0x4e6);
-test(0x4e8,0x4e9);
-test(0x4e9,0x4e8);
-test(0x4ea,0x4eb);
-test(0x4eb,0x4ea);
-test(0x4ec,0x4ed);
-test(0x4ed,0x4ec);
-test(0x4ee,0x4ef);
-test(0x4ef,0x4ee);
-test(0x4f0,0x4f1);
-test(0x4f1,0x4f0);
-test(0x4f2,0x4f3);
-test(0x4f3,0x4f2);
-test(0x4f4,0x4f5);
-test(0x4f5,0x4f4);
-test(0x4f6,0x4f7);
-test(0x4f7,0x4f6);
-test(0x4f8,0x4f9);
-test(0x4f9,0x4f8);
-test(0x4fa,0x4fb);
-test(0x4fb,0x4fa);
-test(0x4fc,0x4fd);
-test(0x4fd,0x4fc);
-test(0x4fe,0x4ff);
-test(0x4ff,0x4fe);
-test(0x500,0x501);
-test(0x501,0x500);
-test(0x502,0x503);
-test(0x503,0x502);
-test(0x504,0x505);
-test(0x505,0x504);
-test(0x506,0x507);
-test(0x507,0x506);
-test(0x508,0x509);
-test(0x509,0x508);
-test(0x50a,0x50b);
-test(0x50b,0x50a);
-test(0x50c,0x50d);
-test(0x50d,0x50c);
-test(0x50e,0x50f);
-test(0x50f,0x50e);
-test(0x510,0x511);
-test(0x511,0x510);
-test(0x512,0x513);
-test(0x513,0x512);
-test(0x514,0x515);
-test(0x515,0x514);
-test(0x516,0x517);
-test(0x517,0x516);
-test(0x518,0x519);
-test(0x519,0x518);
-test(0x51a,0x51b);
-test(0x51b,0x51a);
-test(0x51c,0x51d);
-test(0x51d,0x51c);
-test(0x51e,0x51f);
-test(0x51f,0x51e);
-test(0x520,0x521);
-test(0x521,0x520);
-test(0x522,0x523);
-test(0x523,0x522);
-test(0x524,0x525);
-test(0x525,0x524);
-test(0x526,0x527);
-test(0x527,0x526);
-test(0x528,0x529);
-test(0x529,0x528);
-test(0x52a,0x52b);
-test(0x52b,0x52a);
-test(0x52c,0x52d);
-test(0x52d,0x52c);
-test(0x52e,0x52f);
-test(0x52f,0x52e);
-test(0x531,0x561);
-test(0x532,0x562);
-test(0x533,0x563);
-test(0x534,0x564);
-test(0x535,0x565);
-test(0x536,0x566);
-test(0x537,0x567);
-test(0x538,0x568);
-test(0x539,0x569);
-test(0x53a,0x56a);
-test(0x53b,0x56b);
-test(0x53c,0x56c);
-test(0x53d,0x56d);
-test(0x53e,0x56e);
-test(0x53f,0x56f);
-test(0x540,0x570);
-test(0x541,0x571);
-test(0x542,0x572);
-test(0x543,0x573);
-test(0x544,0x574);
-test(0x545,0x575);
-test(0x546,0x576);
-test(0x547,0x577);
-test(0x548,0x578);
-test(0x549,0x579);
-test(0x54a,0x57a);
-test(0x54b,0x57b);
-test(0x54c,0x57c);
-test(0x54d,0x57d);
-test(0x54e,0x57e);
-test(0x54f,0x57f);
-test(0x550,0x580);
-test(0x551,0x581);
-test(0x552,0x582);
-test(0x553,0x583);
-test(0x554,0x584);
-test(0x555,0x585);
-test(0x556,0x586);
-test(0x561,0x531);
-test(0x562,0x532);
-test(0x563,0x533);
-test(0x564,0x534);
-test(0x565,0x535);
-test(0x566,0x536);
-test(0x567,0x537);
-test(0x568,0x538);
-test(0x569,0x539);
-test(0x56a,0x53a);
-test(0x56b,0x53b);
-test(0x56c,0x53c);
-test(0x56d,0x53d);
-test(0x56e,0x53e);
-test(0x56f,0x53f);
-test(0x570,0x540);
-test(0x571,0x541);
-test(0x572,0x542);
-test(0x573,0x543);
-test(0x574,0x544);
-test(0x575,0x545);
-test(0x576,0x546);
-test(0x577,0x547);
-test(0x578,0x548);
-test(0x579,0x549);
-test(0x57a,0x54a);
-test(0x57b,0x54b);
-test(0x57c,0x54c);
-test(0x57d,0x54d);
-test(0x57e,0x54e);
-test(0x57f,0x54f);
-test(0x580,0x550);
-test(0x581,0x551);
-test(0x582,0x552);
-test(0x583,0x553);
-test(0x584,0x554);
-test(0x585,0x555);
-test(0x586,0x556);
-test(0x10a0,0x2d00);
-test(0x10a1,0x2d01);
-test(0x10a2,0x2d02);
-test(0x10a3,0x2d03);
-test(0x10a4,0x2d04);
-test(0x10a5,0x2d05);
-test(0x10a6,0x2d06);
-test(0x10a7,0x2d07);
-test(0x10a8,0x2d08);
-test(0x10a9,0x2d09);
-test(0x10aa,0x2d0a);
-test(0x10ab,0x2d0b);
-test(0x10ac,0x2d0c);
-test(0x10ad,0x2d0d);
-test(0x10ae,0x2d0e);
-test(0x10af,0x2d0f);
-test(0x10b0,0x2d10);
-test(0x10b1,0x2d11);
-test(0x10b2,0x2d12);
-test(0x10b3,0x2d13);
-test(0x10b4,0x2d14);
-test(0x10b5,0x2d15);
-test(0x10b6,0x2d16);
-test(0x10b7,0x2d17);
-test(0x10b8,0x2d18);
-test(0x10b9,0x2d19);
-test(0x10ba,0x2d1a);
-test(0x10bb,0x2d1b);
-test(0x10bc,0x2d1c);
-test(0x10bd,0x2d1d);
-test(0x10be,0x2d1e);
-test(0x10bf,0x2d1f);
-test(0x10c0,0x2d20);
-test(0x10c1,0x2d21);
-test(0x10c2,0x2d22);
-test(0x10c3,0x2d23);
-test(0x10c4,0x2d24);
-test(0x10c5,0x2d25);
-test(0x10c7,0x2d27);
-test(0x10cd,0x2d2d);
-test(0x10d0,0x1c90);
-test(0x10d1,0x1c91);
-test(0x10d2,0x1c92);
-test(0x10d3,0x1c93);
-test(0x10d4,0x1c94);
-test(0x10d5,0x1c95);
-test(0x10d6,0x1c96);
-test(0x10d7,0x1c97);
-test(0x10d8,0x1c98);
-test(0x10d9,0x1c99);
-test(0x10da,0x1c9a);
-test(0x10db,0x1c9b);
-test(0x10dc,0x1c9c);
-test(0x10dd,0x1c9d);
-test(0x10de,0x1c9e);
-test(0x10df,0x1c9f);
-test(0x10e0,0x1ca0);
-test(0x10e1,0x1ca1);
-test(0x10e2,0x1ca2);
-test(0x10e3,0x1ca3);
-test(0x10e4,0x1ca4);
-test(0x10e5,0x1ca5);
-test(0x10e6,0x1ca6);
-test(0x10e7,0x1ca7);
-test(0x10e8,0x1ca8);
-test(0x10e9,0x1ca9);
-test(0x10ea,0x1caa);
-test(0x10eb,0x1cab);
-test(0x10ec,0x1cac);
-test(0x10ed,0x1cad);
-test(0x10ee,0x1cae);
-test(0x10ef,0x1caf);
-test(0x10f0,0x1cb0);
-test(0x10f1,0x1cb1);
-test(0x10f2,0x1cb2);
-test(0x10f3,0x1cb3);
-test(0x10f4,0x1cb4);
-test(0x10f5,0x1cb5);
-test(0x10f6,0x1cb6);
-test(0x10f7,0x1cb7);
-test(0x10f8,0x1cb8);
-test(0x10f9,0x1cb9);
-test(0x10fa,0x1cba);
-test(0x10fd,0x1cbd);
-test(0x10fe,0x1cbe);
-test(0x10ff,0x1cbf);
-test(0x13a0,0xab70);
-test(0x13a1,0xab71);
-test(0x13a2,0xab72);
-test(0x13a3,0xab73);
-test(0x13a4,0xab74);
-test(0x13a5,0xab75);
-test(0x13a6,0xab76);
-test(0x13a7,0xab77);
-test(0x13a8,0xab78);
-test(0x13a9,0xab79);
-test(0x13aa,0xab7a);
-test(0x13ab,0xab7b);
-test(0x13ac,0xab7c);
-test(0x13ad,0xab7d);
-test(0x13ae,0xab7e);
-test(0x13af,0xab7f);
-test(0x13b0,0xab80);
-test(0x13b1,0xab81);
-test(0x13b2,0xab82);
-test(0x13b3,0xab83);
-test(0x13b4,0xab84);
-test(0x13b5,0xab85);
-test(0x13b6,0xab86);
-test(0x13b7,0xab87);
-test(0x13b8,0xab88);
-test(0x13b9,0xab89);
-test(0x13ba,0xab8a);
-test(0x13bb,0xab8b);
-test(0x13bc,0xab8c);
-test(0x13bd,0xab8d);
-test(0x13be,0xab8e);
-test(0x13bf,0xab8f);
-test(0x13c0,0xab90);
-test(0x13c1,0xab91);
-test(0x13c2,0xab92);
-test(0x13c3,0xab93);
-test(0x13c4,0xab94);
-test(0x13c5,0xab95);
-test(0x13c6,0xab96);
-test(0x13c7,0xab97);
-test(0x13c8,0xab98);
-test(0x13c9,0xab99);
-test(0x13ca,0xab9a);
-test(0x13cb,0xab9b);
-test(0x13cc,0xab9c);
-test(0x13cd,0xab9d);
-test(0x13ce,0xab9e);
-test(0x13cf,0xab9f);
-test(0x13d0,0xaba0);
-test(0x13d1,0xaba1);
-test(0x13d2,0xaba2);
-test(0x13d3,0xaba3);
-test(0x13d4,0xaba4);
-test(0x13d5,0xaba5);
-test(0x13d6,0xaba6);
-test(0x13d7,0xaba7);
-test(0x13d8,0xaba8);
-test(0x13d9,0xaba9);
-test(0x13da,0xabaa);
-test(0x13db,0xabab);
-test(0x13dc,0xabac);
-test(0x13dd,0xabad);
-test(0x13de,0xabae);
-test(0x13df,0xabaf);
-test(0x13e0,0xabb0);
-test(0x13e1,0xabb1);
-test(0x13e2,0xabb2);
-test(0x13e3,0xabb3);
-test(0x13e4,0xabb4);
-test(0x13e5,0xabb5);
-test(0x13e6,0xabb6);
-test(0x13e7,0xabb7);
-test(0x13e8,0xabb8);
-test(0x13e9,0xabb9);
-test(0x13ea,0xabba);
-test(0x13eb,0xabbb);
-test(0x13ec,0xabbc);
-test(0x13ed,0xabbd);
-test(0x13ee,0xabbe);
-test(0x13ef,0xabbf);
-test(0x13f0,0x13f8);
-test(0x13f1,0x13f9);
-test(0x13f2,0x13fa);
-test(0x13f3,0x13fb);
-test(0x13f4,0x13fc);
-test(0x13f5,0x13fd);
-test(0x13f8,0x13f0);
-test(0x13f9,0x13f1);
-test(0x13fa,0x13f2);
-test(0x13fb,0x13f3);
-test(0x13fc,0x13f4);
-test(0x13fd,0x13f5);
-test(0x1c80,0x432,0x412);
-test(0x1c81,0x434,0x414);
-test(0x1c82,0x43e,0x41e);
-test(0x1c83,0x441,0x421);
-test(0x1c84,0x442,0x422,0x1c85);
-test(0x1c85,0x442,0x422,0x1c84);
-test(0x1c86,0x44a,0x42a);
-test(0x1c87,0x463,0x462);
-test(0x1c88,0xa64b,0xa64a);
-test(0x1c90,0x10d0);
-test(0x1c91,0x10d1);
-test(0x1c92,0x10d2);
-test(0x1c93,0x10d3);
-test(0x1c94,0x10d4);
-test(0x1c95,0x10d5);
-test(0x1c96,0x10d6);
-test(0x1c97,0x10d7);
-test(0x1c98,0x10d8);
-test(0x1c99,0x10d9);
-test(0x1c9a,0x10da);
-test(0x1c9b,0x10db);
-test(0x1c9c,0x10dc);
-test(0x1c9d,0x10dd);
-test(0x1c9e,0x10de);
-test(0x1c9f,0x10df);
-test(0x1ca0,0x10e0);
-test(0x1ca1,0x10e1);
-test(0x1ca2,0x10e2);
-test(0x1ca3,0x10e3);
-test(0x1ca4,0x10e4);
-test(0x1ca5,0x10e5);
-test(0x1ca6,0x10e6);
-test(0x1ca7,0x10e7);
-test(0x1ca8,0x10e8);
-test(0x1ca9,0x10e9);
-test(0x1caa,0x10ea);
-test(0x1cab,0x10eb);
-test(0x1cac,0x10ec);
-test(0x1cad,0x10ed);
-test(0x1cae,0x10ee);
-test(0x1caf,0x10ef);
-test(0x1cb0,0x10f0);
-test(0x1cb1,0x10f1);
-test(0x1cb2,0x10f2);
-test(0x1cb3,0x10f3);
-test(0x1cb4,0x10f4);
-test(0x1cb5,0x10f5);
-test(0x1cb6,0x10f6);
-test(0x1cb7,0x10f7);
-test(0x1cb8,0x10f8);
-test(0x1cb9,0x10f9);
-test(0x1cba,0x10fa);
-test(0x1cbd,0x10fd);
-test(0x1cbe,0x10fe);
-test(0x1cbf,0x10ff);
-test(0x1d79,0xa77d);
-test(0x1d7d,0x2c63);
-test(0x1e00,0x1e01);
-test(0x1e01,0x1e00);
-test(0x1e02,0x1e03);
-test(0x1e03,0x1e02);
-test(0x1e04,0x1e05);
-test(0x1e05,0x1e04);
-test(0x1e06,0x1e07);
-test(0x1e07,0x1e06);
-test(0x1e08,0x1e09);
-test(0x1e09,0x1e08);
-test(0x1e0a,0x1e0b);
-test(0x1e0b,0x1e0a);
-test(0x1e0c,0x1e0d);
-test(0x1e0d,0x1e0c);
-test(0x1e0e,0x1e0f);
-test(0x1e0f,0x1e0e);
-test(0x1e10,0x1e11);
-test(0x1e11,0x1e10);
-test(0x1e12,0x1e13);
-test(0x1e13,0x1e12);
-test(0x1e14,0x1e15);
-test(0x1e15,0x1e14);
-test(0x1e16,0x1e17);
-test(0x1e17,0x1e16);
-test(0x1e18,0x1e19);
-test(0x1e19,0x1e18);
-test(0x1e1a,0x1e1b);
-test(0x1e1b,0x1e1a);
-test(0x1e1c,0x1e1d);
-test(0x1e1d,0x1e1c);
-test(0x1e1e,0x1e1f);
-test(0x1e1f,0x1e1e);
-test(0x1e20,0x1e21);
-test(0x1e21,0x1e20);
-test(0x1e22,0x1e23);
-test(0x1e23,0x1e22);
-test(0x1e24,0x1e25);
-test(0x1e25,0x1e24);
-test(0x1e26,0x1e27);
-test(0x1e27,0x1e26);
-test(0x1e28,0x1e29);
-test(0x1e29,0x1e28);
-test(0x1e2a,0x1e2b);
-test(0x1e2b,0x1e2a);
-test(0x1e2c,0x1e2d);
-test(0x1e2d,0x1e2c);
-test(0x1e2e,0x1e2f);
-test(0x1e2f,0x1e2e);
-test(0x1e30,0x1e31);
-test(0x1e31,0x1e30);
-test(0x1e32,0x1e33);
-test(0x1e33,0x1e32);
-test(0x1e34,0x1e35);
-test(0x1e35,0x1e34);
-test(0x1e36,0x1e37);
-test(0x1e37,0x1e36);
-test(0x1e38,0x1e39);
-test(0x1e39,0x1e38);
-test(0x1e3a,0x1e3b);
-test(0x1e3b,0x1e3a);
-test(0x1e3c,0x1e3d);
-test(0x1e3d,0x1e3c);
-test(0x1e3e,0x1e3f);
-test(0x1e3f,0x1e3e);
-test(0x1e40,0x1e41);
-test(0x1e41,0x1e40);
-test(0x1e42,0x1e43);
-test(0x1e43,0x1e42);
-test(0x1e44,0x1e45);
-test(0x1e45,0x1e44);
-test(0x1e46,0x1e47);
-test(0x1e47,0x1e46);
-test(0x1e48,0x1e49);
-test(0x1e49,0x1e48);
-test(0x1e4a,0x1e4b);
-test(0x1e4b,0x1e4a);
-test(0x1e4c,0x1e4d);
-test(0x1e4d,0x1e4c);
-test(0x1e4e,0x1e4f);
-test(0x1e4f,0x1e4e);
-test(0x1e50,0x1e51);
-test(0x1e51,0x1e50);
-test(0x1e52,0x1e53);
-test(0x1e53,0x1e52);
-test(0x1e54,0x1e55);
-test(0x1e55,0x1e54);
-test(0x1e56,0x1e57);
-test(0x1e57,0x1e56);
-test(0x1e58,0x1e59);
-test(0x1e59,0x1e58);
-test(0x1e5a,0x1e5b);
-test(0x1e5b,0x1e5a);
-test(0x1e5c,0x1e5d);
-test(0x1e5d,0x1e5c);
-test(0x1e5e,0x1e5f);
-test(0x1e5f,0x1e5e);
-test(0x1e60,0x1e61,0x1e9b);
-test(0x1e61,0x1e60,0x1e9b);
-test(0x1e62,0x1e63);
-test(0x1e63,0x1e62);
-test(0x1e64,0x1e65);
-test(0x1e65,0x1e64);
-test(0x1e66,0x1e67);
-test(0x1e67,0x1e66);
-test(0x1e68,0x1e69);
-test(0x1e69,0x1e68);
-test(0x1e6a,0x1e6b);
-test(0x1e6b,0x1e6a);
-test(0x1e6c,0x1e6d);
-test(0x1e6d,0x1e6c);
-test(0x1e6e,0x1e6f);
-test(0x1e6f,0x1e6e);
-test(0x1e70,0x1e71);
-test(0x1e71,0x1e70);
-test(0x1e72,0x1e73);
-test(0x1e73,0x1e72);
-test(0x1e74,0x1e75);
-test(0x1e75,0x1e74);
-test(0x1e76,0x1e77);
-test(0x1e77,0x1e76);
-test(0x1e78,0x1e79);
-test(0x1e79,0x1e78);
-test(0x1e7a,0x1e7b);
-test(0x1e7b,0x1e7a);
-test(0x1e7c,0x1e7d);
-test(0x1e7d,0x1e7c);
-test(0x1e7e,0x1e7f);
-test(0x1e7f,0x1e7e);
-test(0x1e80,0x1e81);
-test(0x1e81,0x1e80);
-test(0x1e82,0x1e83);
-test(0x1e83,0x1e82);
-test(0x1e84,0x1e85);
-test(0x1e85,0x1e84);
-test(0x1e86,0x1e87);
-test(0x1e87,0x1e86);
-test(0x1e88,0x1e89);
-test(0x1e89,0x1e88);
-test(0x1e8a,0x1e8b);
-test(0x1e8b,0x1e8a);
-test(0x1e8c,0x1e8d);
-test(0x1e8d,0x1e8c);
-test(0x1e8e,0x1e8f);
-test(0x1e8f,0x1e8e);
-test(0x1e90,0x1e91);
-test(0x1e91,0x1e90);
-test(0x1e92,0x1e93);
-test(0x1e93,0x1e92);
-test(0x1e94,0x1e95);
-test(0x1e95,0x1e94);
-test(0x1e9b,0x1e61,0x1e60);
-test(0x1e9e,0xdf);
-test(0x1ea0,0x1ea1);
-test(0x1ea1,0x1ea0);
-test(0x1ea2,0x1ea3);
-test(0x1ea3,0x1ea2);
-test(0x1ea4,0x1ea5);
-test(0x1ea5,0x1ea4);
-test(0x1ea6,0x1ea7);
-test(0x1ea7,0x1ea6);
-test(0x1ea8,0x1ea9);
-test(0x1ea9,0x1ea8);
-test(0x1eaa,0x1eab);
-test(0x1eab,0x1eaa);
-test(0x1eac,0x1ead);
-test(0x1ead,0x1eac);
-test(0x1eae,0x1eaf);
-test(0x1eaf,0x1eae);
-test(0x1eb0,0x1eb1);
-test(0x1eb1,0x1eb0);
-test(0x1eb2,0x1eb3);
-test(0x1eb3,0x1eb2);
-test(0x1eb4,0x1eb5);
-test(0x1eb5,0x1eb4);
-test(0x1eb6,0x1eb7);
-test(0x1eb7,0x1eb6);
-test(0x1eb8,0x1eb9);
-test(0x1eb9,0x1eb8);
-test(0x1eba,0x1ebb);
-test(0x1ebb,0x1eba);
-test(0x1ebc,0x1ebd);
-test(0x1ebd,0x1ebc);
-test(0x1ebe,0x1ebf);
-test(0x1ebf,0x1ebe);
-test(0x1ec0,0x1ec1);
-test(0x1ec1,0x1ec0);
-test(0x1ec2,0x1ec3);
-test(0x1ec3,0x1ec2);
-test(0x1ec4,0x1ec5);
-test(0x1ec5,0x1ec4);
-test(0x1ec6,0x1ec7);
-test(0x1ec7,0x1ec6);
-test(0x1ec8,0x1ec9);
-test(0x1ec9,0x1ec8);
-test(0x1eca,0x1ecb);
-test(0x1ecb,0x1eca);
-test(0x1ecc,0x1ecd);
-test(0x1ecd,0x1ecc);
-test(0x1ece,0x1ecf);
-test(0x1ecf,0x1ece);
-test(0x1ed0,0x1ed1);
-test(0x1ed1,0x1ed0);
-test(0x1ed2,0x1ed3);
-test(0x1ed3,0x1ed2);
-test(0x1ed4,0x1ed5);
-test(0x1ed5,0x1ed4);
-test(0x1ed6,0x1ed7);
-test(0x1ed7,0x1ed6);
-test(0x1ed8,0x1ed9);
-test(0x1ed9,0x1ed8);
-test(0x1eda,0x1edb);
-test(0x1edb,0x1eda);
-test(0x1edc,0x1edd);
-test(0x1edd,0x1edc);
-test(0x1ede,0x1edf);
-test(0x1edf,0x1ede);
-test(0x1ee0,0x1ee1);
-test(0x1ee1,0x1ee0);
-test(0x1ee2,0x1ee3);
-test(0x1ee3,0x1ee2);
-test(0x1ee4,0x1ee5);
-test(0x1ee5,0x1ee4);
-test(0x1ee6,0x1ee7);
-test(0x1ee7,0x1ee6);
-test(0x1ee8,0x1ee9);
-test(0x1ee9,0x1ee8);
-test(0x1eea,0x1eeb);
-test(0x1eeb,0x1eea);
-test(0x1eec,0x1eed);
-test(0x1eed,0x1eec);
-test(0x1eee,0x1eef);
-test(0x1eef,0x1eee);
-test(0x1ef0,0x1ef1);
-test(0x1ef1,0x1ef0);
-test(0x1ef2,0x1ef3);
-test(0x1ef3,0x1ef2);
-test(0x1ef4,0x1ef5);
-test(0x1ef5,0x1ef4);
-test(0x1ef6,0x1ef7);
-test(0x1ef7,0x1ef6);
-test(0x1ef8,0x1ef9);
-test(0x1ef9,0x1ef8);
-test(0x1efa,0x1efb);
-test(0x1efb,0x1efa);
-test(0x1efc,0x1efd);
-test(0x1efd,0x1efc);
-test(0x1efe,0x1eff);
-test(0x1eff,0x1efe);
-test(0x1f00,0x1f08);
-test(0x1f01,0x1f09);
-test(0x1f02,0x1f0a);
-test(0x1f03,0x1f0b);
-test(0x1f04,0x1f0c);
-test(0x1f05,0x1f0d);
-test(0x1f06,0x1f0e);
-test(0x1f07,0x1f0f);
-test(0x1f08,0x1f00);
-test(0x1f09,0x1f01);
-test(0x1f0a,0x1f02);
-test(0x1f0b,0x1f03);
-test(0x1f0c,0x1f04);
-test(0x1f0d,0x1f05);
-test(0x1f0e,0x1f06);
-test(0x1f0f,0x1f07);
-test(0x1f10,0x1f18);
-test(0x1f11,0x1f19);
-test(0x1f12,0x1f1a);
-test(0x1f13,0x1f1b);
-test(0x1f14,0x1f1c);
-test(0x1f15,0x1f1d);
-test(0x1f18,0x1f10);
-test(0x1f19,0x1f11);
-test(0x1f1a,0x1f12);
-test(0x1f1b,0x1f13);
-test(0x1f1c,0x1f14);
-test(0x1f1d,0x1f15);
-test(0x1f20,0x1f28);
-test(0x1f21,0x1f29);
-test(0x1f22,0x1f2a);
-test(0x1f23,0x1f2b);
-test(0x1f24,0x1f2c);
-test(0x1f25,0x1f2d);
-test(0x1f26,0x1f2e);
-test(0x1f27,0x1f2f);
-test(0x1f28,0x1f20);
-test(0x1f29,0x1f21);
-test(0x1f2a,0x1f22);
-test(0x1f2b,0x1f23);
-test(0x1f2c,0x1f24);
-test(0x1f2d,0x1f25);
-test(0x1f2e,0x1f26);
-test(0x1f2f,0x1f27);
-test(0x1f30,0x1f38);
-test(0x1f31,0x1f39);
-test(0x1f32,0x1f3a);
-test(0x1f33,0x1f3b);
-test(0x1f34,0x1f3c);
-test(0x1f35,0x1f3d);
-test(0x1f36,0x1f3e);
-test(0x1f37,0x1f3f);
-test(0x1f38,0x1f30);
-test(0x1f39,0x1f31);
-test(0x1f3a,0x1f32);
-test(0x1f3b,0x1f33);
-test(0x1f3c,0x1f34);
-test(0x1f3d,0x1f35);
-test(0x1f3e,0x1f36);
-test(0x1f3f,0x1f37);
-test(0x1f40,0x1f48);
-test(0x1f41,0x1f49);
-test(0x1f42,0x1f4a);
-test(0x1f43,0x1f4b);
-test(0x1f44,0x1f4c);
-test(0x1f45,0x1f4d);
-test(0x1f48,0x1f40);
-test(0x1f49,0x1f41);
-test(0x1f4a,0x1f42);
-test(0x1f4b,0x1f43);
-test(0x1f4c,0x1f44);
-test(0x1f4d,0x1f45);
-test(0x1f51,0x1f59);
-test(0x1f53,0x1f5b);
-test(0x1f55,0x1f5d);
-test(0x1f57,0x1f5f);
-test(0x1f59,0x1f51);
-test(0x1f5b,0x1f53);
-test(0x1f5d,0x1f55);
-test(0x1f5f,0x1f57);
-test(0x1f60,0x1f68);
-test(0x1f61,0x1f69);
-test(0x1f62,0x1f6a);
-test(0x1f63,0x1f6b);
-test(0x1f64,0x1f6c);
-test(0x1f65,0x1f6d);
-test(0x1f66,0x1f6e);
-test(0x1f67,0x1f6f);
-test(0x1f68,0x1f60);
-test(0x1f69,0x1f61);
-test(0x1f6a,0x1f62);
-test(0x1f6b,0x1f63);
-test(0x1f6c,0x1f64);
-test(0x1f6d,0x1f65);
-test(0x1f6e,0x1f66);
-test(0x1f6f,0x1f67);
-test(0x1f70,0x1fba);
-test(0x1f71,0x1fbb);
-test(0x1f72,0x1fc8);
-test(0x1f73,0x1fc9);
-test(0x1f74,0x1fca);
-test(0x1f75,0x1fcb);
-test(0x1f76,0x1fda);
-test(0x1f77,0x1fdb);
-test(0x1f78,0x1ff8);
-test(0x1f79,0x1ff9);
-test(0x1f7a,0x1fea);
-test(0x1f7b,0x1feb);
-test(0x1f7c,0x1ffa);
-test(0x1f7d,0x1ffb);
-test(0x1f80,0x1f88);
-test(0x1f81,0x1f89);
-test(0x1f82,0x1f8a);
-test(0x1f83,0x1f8b);
-test(0x1f84,0x1f8c);
-test(0x1f85,0x1f8d);
-test(0x1f86,0x1f8e);
-test(0x1f87,0x1f8f);
-test(0x1f88,0x1f80);
-test(0x1f89,0x1f81);
-test(0x1f8a,0x1f82);
-test(0x1f8b,0x1f83);
-test(0x1f8c,0x1f84);
-test(0x1f8d,0x1f85);
-test(0x1f8e,0x1f86);
-test(0x1f8f,0x1f87);
-test(0x1f90,0x1f98);
-test(0x1f91,0x1f99);
-test(0x1f92,0x1f9a);
-test(0x1f93,0x1f9b);
-test(0x1f94,0x1f9c);
-test(0x1f95,0x1f9d);
-test(0x1f96,0x1f9e);
-test(0x1f97,0x1f9f);
-test(0x1f98,0x1f90);
-test(0x1f99,0x1f91);
-test(0x1f9a,0x1f92);
-test(0x1f9b,0x1f93);
-test(0x1f9c,0x1f94);
-test(0x1f9d,0x1f95);
-test(0x1f9e,0x1f96);
-test(0x1f9f,0x1f97);
-test(0x1fa0,0x1fa8);
-test(0x1fa1,0x1fa9);
-test(0x1fa2,0x1faa);
-test(0x1fa3,0x1fab);
-test(0x1fa4,0x1fac);
-test(0x1fa5,0x1fad);
-test(0x1fa6,0x1fae);
-test(0x1fa7,0x1faf);
-test(0x1fa8,0x1fa0);
-test(0x1fa9,0x1fa1);
-test(0x1faa,0x1fa2);
-test(0x1fab,0x1fa3);
-test(0x1fac,0x1fa4);
-test(0x1fad,0x1fa5);
-test(0x1fae,0x1fa6);
-test(0x1faf,0x1fa7);
-test(0x1fb0,0x1fb8);
-test(0x1fb1,0x1fb9);
-test(0x1fb3,0x1fbc);
-test(0x1fb8,0x1fb0);
-test(0x1fb9,0x1fb1);
-test(0x1fba,0x1f70);
-test(0x1fbb,0x1f71);
-test(0x1fbc,0x1fb3);
-test(0x1fbe,0x3b9,0x345,0x399);
-test(0x1fc3,0x1fcc);
-test(0x1fc8,0x1f72);
-test(0x1fc9,0x1f73);
-test(0x1fca,0x1f74);
-test(0x1fcb,0x1f75);
-test(0x1fcc,0x1fc3);
-test(0x1fd0,0x1fd8);
-test(0x1fd1,0x1fd9);
-test(0x1fd8,0x1fd0);
-test(0x1fd9,0x1fd1);
-test(0x1fda,0x1f76);
-test(0x1fdb,0x1f77);
-test(0x1fe0,0x1fe8);
-test(0x1fe1,0x1fe9);
-test(0x1fe5,0x1fec);
-test(0x1fe8,0x1fe0);
-test(0x1fe9,0x1fe1);
-test(0x1fea,0x1f7a);
-test(0x1feb,0x1f7b);
-test(0x1fec,0x1fe5);
-test(0x1ff3,0x1ffc);
-test(0x1ff8,0x1f78);
-test(0x1ff9,0x1f79);
-test(0x1ffa,0x1f7c);
-test(0x1ffb,0x1f7d);
-test(0x1ffc,0x1ff3);
-test(0x2126,0x3c9,0x3a9);
-test(0x212a,0x6b,0x4b);
-test(0x212b,0xe5,0xc5);
-test(0x2132,0x214e);
-test(0x214e,0x2132);
-test(0x2160,0x2170);
-test(0x2161,0x2171);
-test(0x2162,0x2172);
-test(0x2163,0x2173);
-test(0x2164,0x2174);
-test(0x2165,0x2175);
-test(0x2166,0x2176);
-test(0x2167,0x2177);
-test(0x2168,0x2178);
-test(0x2169,0x2179);
-test(0x216a,0x217a);
-test(0x216b,0x217b);
-test(0x216c,0x217c);
-test(0x216d,0x217d);
-test(0x216e,0x217e);
-test(0x216f,0x217f);
-test(0x2170,0x2160);
-test(0x2171,0x2161);
-test(0x2172,0x2162);
-test(0x2173,0x2163);
-test(0x2174,0x2164);
-test(0x2175,0x2165);
-test(0x2176,0x2166);
-test(0x2177,0x2167);
-test(0x2178,0x2168);
-test(0x2179,0x2169);
-test(0x217a,0x216a);
-test(0x217b,0x216b);
-test(0x217c,0x216c);
-test(0x217d,0x216d);
-test(0x217e,0x216e);
-test(0x217f,0x216f);
-test(0x2183,0x2184);
-test(0x2184,0x2183);
-test(0x24b6,0x24d0);
-test(0x24b7,0x24d1);
-test(0x24b8,0x24d2);
-test(0x24b9,0x24d3);
-test(0x24ba,0x24d4);
-test(0x24bb,0x24d5);
-test(0x24bc,0x24d6);
-test(0x24bd,0x24d7);
-test(0x24be,0x24d8);
-test(0x24bf,0x24d9);
-test(0x24c0,0x24da);
-test(0x24c1,0x24db);
-test(0x24c2,0x24dc);
-test(0x24c3,0x24dd);
-test(0x24c4,0x24de);
-test(0x24c5,0x24df);
-test(0x24c6,0x24e0);
-test(0x24c7,0x24e1);
-test(0x24c8,0x24e2);
-test(0x24c9,0x24e3);
-test(0x24ca,0x24e4);
-test(0x24cb,0x24e5);
-test(0x24cc,0x24e6);
-test(0x24cd,0x24e7);
-test(0x24ce,0x24e8);
-test(0x24cf,0x24e9);
-test(0x24d0,0x24b6);
-test(0x24d1,0x24b7);
-test(0x24d2,0x24b8);
-test(0x24d3,0x24b9);
-test(0x24d4,0x24ba);
-test(0x24d5,0x24bb);
-test(0x24d6,0x24bc);
-test(0x24d7,0x24bd);
-test(0x24d8,0x24be);
-test(0x24d9,0x24bf);
-test(0x24da,0x24c0);
-test(0x24db,0x24c1);
-test(0x24dc,0x24c2);
-test(0x24dd,0x24c3);
-test(0x24de,0x24c4);
-test(0x24df,0x24c5);
-test(0x24e0,0x24c6);
-test(0x24e1,0x24c7);
-test(0x24e2,0x24c8);
-test(0x24e3,0x24c9);
-test(0x24e4,0x24ca);
-test(0x24e5,0x24cb);
-test(0x24e6,0x24cc);
-test(0x24e7,0x24cd);
-test(0x24e8,0x24ce);
-test(0x24e9,0x24cf);
-test(0x2c00,0x2c30);
-test(0x2c01,0x2c31);
-test(0x2c02,0x2c32);
-test(0x2c03,0x2c33);
-test(0x2c04,0x2c34);
-test(0x2c05,0x2c35);
-test(0x2c06,0x2c36);
-test(0x2c07,0x2c37);
-test(0x2c08,0x2c38);
-test(0x2c09,0x2c39);
-test(0x2c0a,0x2c3a);
-test(0x2c0b,0x2c3b);
-test(0x2c0c,0x2c3c);
-test(0x2c0d,0x2c3d);
-test(0x2c0e,0x2c3e);
-test(0x2c0f,0x2c3f);
-test(0x2c10,0x2c40);
-test(0x2c11,0x2c41);
-test(0x2c12,0x2c42);
-test(0x2c13,0x2c43);
-test(0x2c14,0x2c44);
-test(0x2c15,0x2c45);
-test(0x2c16,0x2c46);
-test(0x2c17,0x2c47);
-test(0x2c18,0x2c48);
-test(0x2c19,0x2c49);
-test(0x2c1a,0x2c4a);
-test(0x2c1b,0x2c4b);
-test(0x2c1c,0x2c4c);
-test(0x2c1d,0x2c4d);
-test(0x2c1e,0x2c4e);
-test(0x2c1f,0x2c4f);
-test(0x2c20,0x2c50);
-test(0x2c21,0x2c51);
-test(0x2c22,0x2c52);
-test(0x2c23,0x2c53);
-test(0x2c24,0x2c54);
-test(0x2c25,0x2c55);
-test(0x2c26,0x2c56);
-test(0x2c27,0x2c57);
-test(0x2c28,0x2c58);
-test(0x2c29,0x2c59);
-test(0x2c2a,0x2c5a);
-test(0x2c2b,0x2c5b);
-test(0x2c2c,0x2c5c);
-test(0x2c2d,0x2c5d);
-test(0x2c2e,0x2c5e);
-test(0x2c30,0x2c00);
-test(0x2c31,0x2c01);
-test(0x2c32,0x2c02);
-test(0x2c33,0x2c03);
-test(0x2c34,0x2c04);
-test(0x2c35,0x2c05);
-test(0x2c36,0x2c06);
-test(0x2c37,0x2c07);
-test(0x2c38,0x2c08);
-test(0x2c39,0x2c09);
-test(0x2c3a,0x2c0a);
-test(0x2c3b,0x2c0b);
-test(0x2c3c,0x2c0c);
-test(0x2c3d,0x2c0d);
-test(0x2c3e,0x2c0e);
-test(0x2c3f,0x2c0f);
-test(0x2c40,0x2c10);
-test(0x2c41,0x2c11);
-test(0x2c42,0x2c12);
-test(0x2c43,0x2c13);
-test(0x2c44,0x2c14);
-test(0x2c45,0x2c15);
-test(0x2c46,0x2c16);
-test(0x2c47,0x2c17);
-test(0x2c48,0x2c18);
-test(0x2c49,0x2c19);
-test(0x2c4a,0x2c1a);
-test(0x2c4b,0x2c1b);
-test(0x2c4c,0x2c1c);
-test(0x2c4d,0x2c1d);
-test(0x2c4e,0x2c1e);
-test(0x2c4f,0x2c1f);
-test(0x2c50,0x2c20);
-test(0x2c51,0x2c21);
-test(0x2c52,0x2c22);
-test(0x2c53,0x2c23);
-test(0x2c54,0x2c24);
-test(0x2c55,0x2c25);
-test(0x2c56,0x2c26);
-test(0x2c57,0x2c27);
-test(0x2c58,0x2c28);
-test(0x2c59,0x2c29);
-test(0x2c5a,0x2c2a);
-test(0x2c5b,0x2c2b);
-test(0x2c5c,0x2c2c);
-test(0x2c5d,0x2c2d);
-test(0x2c5e,0x2c2e);
-test(0x2c60,0x2c61);
-test(0x2c61,0x2c60);
-test(0x2c62,0x26b);
-test(0x2c63,0x1d7d);
-test(0x2c64,0x27d);
-test(0x2c65,0x23a);
-test(0x2c66,0x23e);
-test(0x2c67,0x2c68);
-test(0x2c68,0x2c67);
-test(0x2c69,0x2c6a);
-test(0x2c6a,0x2c69);
-test(0x2c6b,0x2c6c);
-test(0x2c6c,0x2c6b);
-test(0x2c6d,0x251);
-test(0x2c6e,0x271);
-test(0x2c6f,0x250);
-test(0x2c70,0x252);
-test(0x2c72,0x2c73);
-test(0x2c73,0x2c72);
-test(0x2c75,0x2c76);
-test(0x2c76,0x2c75);
-test(0x2c7e,0x23f);
-test(0x2c7f,0x240);
-test(0x2c80,0x2c81);
-test(0x2c81,0x2c80);
-test(0x2c82,0x2c83);
-test(0x2c83,0x2c82);
-test(0x2c84,0x2c85);
-test(0x2c85,0x2c84);
-test(0x2c86,0x2c87);
-test(0x2c87,0x2c86);
-test(0x2c88,0x2c89);
-test(0x2c89,0x2c88);
-test(0x2c8a,0x2c8b);
-test(0x2c8b,0x2c8a);
-test(0x2c8c,0x2c8d);
-test(0x2c8d,0x2c8c);
-test(0x2c8e,0x2c8f);
-test(0x2c8f,0x2c8e);
-test(0x2c90,0x2c91);
-test(0x2c91,0x2c90);
-test(0x2c92,0x2c93);
-test(0x2c93,0x2c92);
-test(0x2c94,0x2c95);
-test(0x2c95,0x2c94);
-test(0x2c96,0x2c97);
-test(0x2c97,0x2c96);
-test(0x2c98,0x2c99);
-test(0x2c99,0x2c98);
-test(0x2c9a,0x2c9b);
-test(0x2c9b,0x2c9a);
-test(0x2c9c,0x2c9d);
-test(0x2c9d,0x2c9c);
-test(0x2c9e,0x2c9f);
-test(0x2c9f,0x2c9e);
-test(0x2ca0,0x2ca1);
-test(0x2ca1,0x2ca0);
-test(0x2ca2,0x2ca3);
-test(0x2ca3,0x2ca2);
-test(0x2ca4,0x2ca5);
-test(0x2ca5,0x2ca4);
-test(0x2ca6,0x2ca7);
-test(0x2ca7,0x2ca6);
-test(0x2ca8,0x2ca9);
-test(0x2ca9,0x2ca8);
-test(0x2caa,0x2cab);
-test(0x2cab,0x2caa);
-test(0x2cac,0x2cad);
-test(0x2cad,0x2cac);
-test(0x2cae,0x2caf);
-test(0x2caf,0x2cae);
-test(0x2cb0,0x2cb1);
-test(0x2cb1,0x2cb0);
-test(0x2cb2,0x2cb3);
-test(0x2cb3,0x2cb2);
-test(0x2cb4,0x2cb5);
-test(0x2cb5,0x2cb4);
-test(0x2cb6,0x2cb7);
-test(0x2cb7,0x2cb6);
-test(0x2cb8,0x2cb9);
-test(0x2cb9,0x2cb8);
-test(0x2cba,0x2cbb);
-test(0x2cbb,0x2cba);
-test(0x2cbc,0x2cbd);
-test(0x2cbd,0x2cbc);
-test(0x2cbe,0x2cbf);
-test(0x2cbf,0x2cbe);
-test(0x2cc0,0x2cc1);
-test(0x2cc1,0x2cc0);
-test(0x2cc2,0x2cc3);
-test(0x2cc3,0x2cc2);
-test(0x2cc4,0x2cc5);
-test(0x2cc5,0x2cc4);
-test(0x2cc6,0x2cc7);
-test(0x2cc7,0x2cc6);
-test(0x2cc8,0x2cc9);
-test(0x2cc9,0x2cc8);
-test(0x2cca,0x2ccb);
-test(0x2ccb,0x2cca);
-test(0x2ccc,0x2ccd);
-test(0x2ccd,0x2ccc);
-test(0x2cce,0x2ccf);
-test(0x2ccf,0x2cce);
-test(0x2cd0,0x2cd1);
-test(0x2cd1,0x2cd0);
-test(0x2cd2,0x2cd3);
-test(0x2cd3,0x2cd2);
-test(0x2cd4,0x2cd5);
-test(0x2cd5,0x2cd4);
-test(0x2cd6,0x2cd7);
-test(0x2cd7,0x2cd6);
-test(0x2cd8,0x2cd9);
-test(0x2cd9,0x2cd8);
-test(0x2cda,0x2cdb);
-test(0x2cdb,0x2cda);
-test(0x2cdc,0x2cdd);
-test(0x2cdd,0x2cdc);
-test(0x2cde,0x2cdf);
-test(0x2cdf,0x2cde);
-test(0x2ce0,0x2ce1);
-test(0x2ce1,0x2ce0);
-test(0x2ce2,0x2ce3);
-test(0x2ce3,0x2ce2);
-test(0x2ceb,0x2cec);
-test(0x2cec,0x2ceb);
-test(0x2ced,0x2cee);
-test(0x2cee,0x2ced);
-test(0x2cf2,0x2cf3);
-test(0x2cf3,0x2cf2);
-test(0x2d00,0x10a0);
-test(0x2d01,0x10a1);
-test(0x2d02,0x10a2);
-test(0x2d03,0x10a3);
-test(0x2d04,0x10a4);
-test(0x2d05,0x10a5);
-test(0x2d06,0x10a6);
-test(0x2d07,0x10a7);
-test(0x2d08,0x10a8);
-test(0x2d09,0x10a9);
-test(0x2d0a,0x10aa);
-test(0x2d0b,0x10ab);
-test(0x2d0c,0x10ac);
-test(0x2d0d,0x10ad);
-test(0x2d0e,0x10ae);
-test(0x2d0f,0x10af);
-test(0x2d10,0x10b0);
-test(0x2d11,0x10b1);
-test(0x2d12,0x10b2);
-test(0x2d13,0x10b3);
-test(0x2d14,0x10b4);
-test(0x2d15,0x10b5);
-test(0x2d16,0x10b6);
-test(0x2d17,0x10b7);
-test(0x2d18,0x10b8);
-test(0x2d19,0x10b9);
-test(0x2d1a,0x10ba);
-test(0x2d1b,0x10bb);
-test(0x2d1c,0x10bc);
-test(0x2d1d,0x10bd);
-test(0x2d1e,0x10be);
-test(0x2d1f,0x10bf);
-test(0x2d20,0x10c0);
-test(0x2d21,0x10c1);
-test(0x2d22,0x10c2);
-test(0x2d23,0x10c3);
-test(0x2d24,0x10c4);
-test(0x2d25,0x10c5);
-test(0x2d27,0x10c7);
-test(0x2d2d,0x10cd);
-test(0xa640,0xa641);
-test(0xa641,0xa640);
-test(0xa642,0xa643);
-test(0xa643,0xa642);
-test(0xa644,0xa645);
-test(0xa645,0xa644);
-test(0xa646,0xa647);
-test(0xa647,0xa646);
-test(0xa648,0xa649);
-test(0xa649,0xa648);
-test(0xa64a,0xa64b,0x1c88);
-test(0xa64b,0x1c88,0xa64a);
-test(0xa64c,0xa64d);
-test(0xa64d,0xa64c);
-test(0xa64e,0xa64f);
-test(0xa64f,0xa64e);
-test(0xa650,0xa651);
-test(0xa651,0xa650);
-test(0xa652,0xa653);
-test(0xa653,0xa652);
-test(0xa654,0xa655);
-test(0xa655,0xa654);
-test(0xa656,0xa657);
-test(0xa657,0xa656);
-test(0xa658,0xa659);
-test(0xa659,0xa658);
-test(0xa65a,0xa65b);
-test(0xa65b,0xa65a);
-test(0xa65c,0xa65d);
-test(0xa65d,0xa65c);
-test(0xa65e,0xa65f);
-test(0xa65f,0xa65e);
-test(0xa660,0xa661);
-test(0xa661,0xa660);
-test(0xa662,0xa663);
-test(0xa663,0xa662);
-test(0xa664,0xa665);
-test(0xa665,0xa664);
-test(0xa666,0xa667);
-test(0xa667,0xa666);
-test(0xa668,0xa669);
-test(0xa669,0xa668);
-test(0xa66a,0xa66b);
-test(0xa66b,0xa66a);
-test(0xa66c,0xa66d);
-test(0xa66d,0xa66c);
-test(0xa680,0xa681);
-test(0xa681,0xa680);
-test(0xa682,0xa683);
-test(0xa683,0xa682);
-test(0xa684,0xa685);
-test(0xa685,0xa684);
-test(0xa686,0xa687);
-test(0xa687,0xa686);
-test(0xa688,0xa689);
-test(0xa689,0xa688);
-test(0xa68a,0xa68b);
-test(0xa68b,0xa68a);
-test(0xa68c,0xa68d);
-test(0xa68d,0xa68c);
-test(0xa68e,0xa68f);
-test(0xa68f,0xa68e);
-test(0xa690,0xa691);
-test(0xa691,0xa690);
-test(0xa692,0xa693);
-test(0xa693,0xa692);
-test(0xa694,0xa695);
-test(0xa695,0xa694);
-test(0xa696,0xa697);
-test(0xa697,0xa696);
-test(0xa698,0xa699);
-test(0xa699,0xa698);
-test(0xa69a,0xa69b);
-test(0xa69b,0xa69a);
-test(0xa722,0xa723);
-test(0xa723,0xa722);
-test(0xa724,0xa725);
-test(0xa725,0xa724);
-test(0xa726,0xa727);
-test(0xa727,0xa726);
-test(0xa728,0xa729);
-test(0xa729,0xa728);
-test(0xa72a,0xa72b);
-test(0xa72b,0xa72a);
-test(0xa72c,0xa72d);
-test(0xa72d,0xa72c);
-test(0xa72e,0xa72f);
-test(0xa72f,0xa72e);
-test(0xa732,0xa733);
-test(0xa733,0xa732);
-test(0xa734,0xa735);
-test(0xa735,0xa734);
-test(0xa736,0xa737);
-test(0xa737,0xa736);
-test(0xa738,0xa739);
-test(0xa739,0xa738);
-test(0xa73a,0xa73b);
-test(0xa73b,0xa73a);
-test(0xa73c,0xa73d);
-test(0xa73d,0xa73c);
-test(0xa73e,0xa73f);
-test(0xa73f,0xa73e);
-test(0xa740,0xa741);
-test(0xa741,0xa740);
-test(0xa742,0xa743);
-test(0xa743,0xa742);
-test(0xa744,0xa745);
-test(0xa745,0xa744);
-test(0xa746,0xa747);
-test(0xa747,0xa746);
-test(0xa748,0xa749);
-test(0xa749,0xa748);
-test(0xa74a,0xa74b);
-test(0xa74b,0xa74a);
-test(0xa74c,0xa74d);
-test(0xa74d,0xa74c);
-test(0xa74e,0xa74f);
-test(0xa74f,0xa74e);
-test(0xa750,0xa751);
-test(0xa751,0xa750);
-test(0xa752,0xa753);
-test(0xa753,0xa752);
-test(0xa754,0xa755);
-test(0xa755,0xa754);
-test(0xa756,0xa757);
-test(0xa757,0xa756);
-test(0xa758,0xa759);
-test(0xa759,0xa758);
-test(0xa75a,0xa75b);
-test(0xa75b,0xa75a);
-test(0xa75c,0xa75d);
-test(0xa75d,0xa75c);
-test(0xa75e,0xa75f);
-test(0xa75f,0xa75e);
-test(0xa760,0xa761);
-test(0xa761,0xa760);
-test(0xa762,0xa763);
-test(0xa763,0xa762);
-test(0xa764,0xa765);
-test(0xa765,0xa764);
-test(0xa766,0xa767);
-test(0xa767,0xa766);
-test(0xa768,0xa769);
-test(0xa769,0xa768);
-test(0xa76a,0xa76b);
-test(0xa76b,0xa76a);
-test(0xa76c,0xa76d);
-test(0xa76d,0xa76c);
-test(0xa76e,0xa76f);
-test(0xa76f,0xa76e);
-test(0xa779,0xa77a);
-test(0xa77a,0xa779);
-test(0xa77b,0xa77c);
-test(0xa77c,0xa77b);
-test(0xa77d,0x1d79);
-test(0xa77e,0xa77f);
-test(0xa77f,0xa77e);
-test(0xa780,0xa781);
-test(0xa781,0xa780);
-test(0xa782,0xa783);
-test(0xa783,0xa782);
-test(0xa784,0xa785);
-test(0xa785,0xa784);
-test(0xa786,0xa787);
-test(0xa787,0xa786);
-test(0xa78b,0xa78c);
-test(0xa78c,0xa78b);
-test(0xa78d,0x265);
-test(0xa790,0xa791);
-test(0xa791,0xa790);
-test(0xa792,0xa793);
-test(0xa793,0xa792);
-test(0xa796,0xa797);
-test(0xa797,0xa796);
-test(0xa798,0xa799);
-test(0xa799,0xa798);
-test(0xa79a,0xa79b);
-test(0xa79b,0xa79a);
-test(0xa79c,0xa79d);
-test(0xa79d,0xa79c);
-test(0xa79e,0xa79f);
-test(0xa79f,0xa79e);
-test(0xa7a0,0xa7a1);
-test(0xa7a1,0xa7a0);
-test(0xa7a2,0xa7a3);
-test(0xa7a3,0xa7a2);
-test(0xa7a4,0xa7a5);
-test(0xa7a5,0xa7a4);
-test(0xa7a6,0xa7a7);
-test(0xa7a7,0xa7a6);
-test(0xa7a8,0xa7a9);
-test(0xa7a9,0xa7a8);
-test(0xa7aa,0x266);
-test(0xa7ab,0x25c);
-test(0xa7ac,0x261);
-test(0xa7ad,0x26c);
-test(0xa7ae,0x26a);
-test(0xa7b0,0x29e);
-test(0xa7b1,0x287);
-test(0xa7b2,0x29d);
-test(0xa7b3,0xab53);
-test(0xa7b4,0xa7b5);
-test(0xa7b5,0xa7b4);
-test(0xa7b6,0xa7b7);
-test(0xa7b7,0xa7b6);
-test(0xa7b8,0xa7b9);
-test(0xa7b9,0xa7b8);
-test(0xab53,0xa7b3);
-test(0xab70,0x13a0);
-test(0xab71,0x13a1);
-test(0xab72,0x13a2);
-test(0xab73,0x13a3);
-test(0xab74,0x13a4);
-test(0xab75,0x13a5);
-test(0xab76,0x13a6);
-test(0xab77,0x13a7);
-test(0xab78,0x13a8);
-test(0xab79,0x13a9);
-test(0xab7a,0x13aa);
-test(0xab7b,0x13ab);
-test(0xab7c,0x13ac);
-test(0xab7d,0x13ad);
-test(0xab7e,0x13ae);
-test(0xab7f,0x13af);
-test(0xab80,0x13b0);
-test(0xab81,0x13b1);
-test(0xab82,0x13b2);
-test(0xab83,0x13b3);
-test(0xab84,0x13b4);
-test(0xab85,0x13b5);
-test(0xab86,0x13b6);
-test(0xab87,0x13b7);
-test(0xab88,0x13b8);
-test(0xab89,0x13b9);
-test(0xab8a,0x13ba);
-test(0xab8b,0x13bb);
-test(0xab8c,0x13bc);
-test(0xab8d,0x13bd);
-test(0xab8e,0x13be);
-test(0xab8f,0x13bf);
-test(0xab90,0x13c0);
-test(0xab91,0x13c1);
-test(0xab92,0x13c2);
-test(0xab93,0x13c3);
-test(0xab94,0x13c4);
-test(0xab95,0x13c5);
-test(0xab96,0x13c6);
-test(0xab97,0x13c7);
-test(0xab98,0x13c8);
-test(0xab99,0x13c9);
-test(0xab9a,0x13ca);
-test(0xab9b,0x13cb);
-test(0xab9c,0x13cc);
-test(0xab9d,0x13cd);
-test(0xab9e,0x13ce);
-test(0xab9f,0x13cf);
-test(0xaba0,0x13d0);
-test(0xaba1,0x13d1);
-test(0xaba2,0x13d2);
-test(0xaba3,0x13d3);
-test(0xaba4,0x13d4);
-test(0xaba5,0x13d5);
-test(0xaba6,0x13d6);
-test(0xaba7,0x13d7);
-test(0xaba8,0x13d8);
-test(0xaba9,0x13d9);
-test(0xabaa,0x13da);
-test(0xabab,0x13db);
-test(0xabac,0x13dc);
-test(0xabad,0x13dd);
-test(0xabae,0x13de);
-test(0xabaf,0x13df);
-test(0xabb0,0x13e0);
-test(0xabb1,0x13e1);
-test(0xabb2,0x13e2);
-test(0xabb3,0x13e3);
-test(0xabb4,0x13e4);
-test(0xabb5,0x13e5);
-test(0xabb6,0x13e6);
-test(0xabb7,0x13e7);
-test(0xabb8,0x13e8);
-test(0xabb9,0x13e9);
-test(0xabba,0x13ea);
-test(0xabbb,0x13eb);
-test(0xabbc,0x13ec);
-test(0xabbd,0x13ed);
-test(0xabbe,0x13ee);
-test(0xabbf,0x13ef);
-test(0xff21,0xff41);
-test(0xff22,0xff42);
-test(0xff23,0xff43);
-test(0xff24,0xff44);
-test(0xff25,0xff45);
-test(0xff26,0xff46);
-test(0xff27,0xff47);
-test(0xff28,0xff48);
-test(0xff29,0xff49);
-test(0xff2a,0xff4a);
-test(0xff2b,0xff4b);
-test(0xff2c,0xff4c);
-test(0xff2d,0xff4d);
-test(0xff2e,0xff4e);
-test(0xff2f,0xff4f);
-test(0xff30,0xff50);
-test(0xff31,0xff51);
-test(0xff32,0xff52);
-test(0xff33,0xff53);
-test(0xff34,0xff54);
-test(0xff35,0xff55);
-test(0xff36,0xff56);
-test(0xff37,0xff57);
-test(0xff38,0xff58);
-test(0xff39,0xff59);
-test(0xff3a,0xff5a);
-test(0xff41,0xff21);
-test(0xff42,0xff22);
-test(0xff43,0xff23);
-test(0xff44,0xff24);
-test(0xff45,0xff25);
-test(0xff46,0xff26);
-test(0xff47,0xff27);
-test(0xff48,0xff28);
-test(0xff49,0xff29);
-test(0xff4a,0xff2a);
-test(0xff4b,0xff2b);
-test(0xff4c,0xff2c);
-test(0xff4d,0xff2d);
-test(0xff4e,0xff2e);
-test(0xff4f,0xff2f);
-test(0xff50,0xff30);
-test(0xff51,0xff31);
-test(0xff52,0xff32);
-test(0xff53,0xff33);
-test(0xff54,0xff34);
-test(0xff55,0xff35);
-test(0xff56,0xff36);
-test(0xff57,0xff37);
-test(0xff58,0xff38);
-test(0xff59,0xff39);
-test(0xff5a,0xff3a);
-test(0x10400,0x10428);
-test(0x10401,0x10429);
-test(0x10402,0x1042a);
-test(0x10403,0x1042b);
-test(0x10404,0x1042c);
-test(0x10405,0x1042d);
-test(0x10406,0x1042e);
-test(0x10407,0x1042f);
-test(0x10408,0x10430);
-test(0x10409,0x10431);
-test(0x1040a,0x10432);
-test(0x1040b,0x10433);
-test(0x1040c,0x10434);
-test(0x1040d,0x10435);
-test(0x1040e,0x10436);
-test(0x1040f,0x10437);
-test(0x10410,0x10438);
-test(0x10411,0x10439);
-test(0x10412,0x1043a);
-test(0x10413,0x1043b);
-test(0x10414,0x1043c);
-test(0x10415,0x1043d);
-test(0x10416,0x1043e);
-test(0x10417,0x1043f);
-test(0x10418,0x10440);
-test(0x10419,0x10441);
-test(0x1041a,0x10442);
-test(0x1041b,0x10443);
-test(0x1041c,0x10444);
-test(0x1041d,0x10445);
-test(0x1041e,0x10446);
-test(0x1041f,0x10447);
-test(0x10420,0x10448);
-test(0x10421,0x10449);
-test(0x10422,0x1044a);
-test(0x10423,0x1044b);
-test(0x10424,0x1044c);
-test(0x10425,0x1044d);
-test(0x10426,0x1044e);
-test(0x10427,0x1044f);
-test(0x10428,0x10400);
-test(0x10429,0x10401);
-test(0x1042a,0x10402);
-test(0x1042b,0x10403);
-test(0x1042c,0x10404);
-test(0x1042d,0x10405);
-test(0x1042e,0x10406);
-test(0x1042f,0x10407);
-test(0x10430,0x10408);
-test(0x10431,0x10409);
-test(0x10432,0x1040a);
-test(0x10433,0x1040b);
-test(0x10434,0x1040c);
-test(0x10435,0x1040d);
-test(0x10436,0x1040e);
-test(0x10437,0x1040f);
-test(0x10438,0x10410);
-test(0x10439,0x10411);
-test(0x1043a,0x10412);
-test(0x1043b,0x10413);
-test(0x1043c,0x10414);
-test(0x1043d,0x10415);
-test(0x1043e,0x10416);
-test(0x1043f,0x10417);
-test(0x10440,0x10418);
-test(0x10441,0x10419);
-test(0x10442,0x1041a);
-test(0x10443,0x1041b);
-test(0x10444,0x1041c);
-test(0x10445,0x1041d);
-test(0x10446,0x1041e);
-test(0x10447,0x1041f);
-test(0x10448,0x10420);
-test(0x10449,0x10421);
-test(0x1044a,0x10422);
-test(0x1044b,0x10423);
-test(0x1044c,0x10424);
-test(0x1044d,0x10425);
-test(0x1044e,0x10426);
-test(0x1044f,0x10427);
-test(0x104b0,0x104d8);
-test(0x104b1,0x104d9);
-test(0x104b2,0x104da);
-test(0x104b3,0x104db);
-test(0x104b4,0x104dc);
-test(0x104b5,0x104dd);
-test(0x104b6,0x104de);
-test(0x104b7,0x104df);
-test(0x104b8,0x104e0);
-test(0x104b9,0x104e1);
-test(0x104ba,0x104e2);
-test(0x104bb,0x104e3);
-test(0x104bc,0x104e4);
-test(0x104bd,0x104e5);
-test(0x104be,0x104e6);
-test(0x104bf,0x104e7);
-test(0x104c0,0x104e8);
-test(0x104c1,0x104e9);
-test(0x104c2,0x104ea);
-test(0x104c3,0x104eb);
-test(0x104c4,0x104ec);
-test(0x104c5,0x104ed);
-test(0x104c6,0x104ee);
-test(0x104c7,0x104ef);
-test(0x104c8,0x104f0);
-test(0x104c9,0x104f1);
-test(0x104ca,0x104f2);
-test(0x104cb,0x104f3);
-test(0x104cc,0x104f4);
-test(0x104cd,0x104f5);
-test(0x104ce,0x104f6);
-test(0x104cf,0x104f7);
-test(0x104d0,0x104f8);
-test(0x104d1,0x104f9);
-test(0x104d2,0x104fa);
-test(0x104d3,0x104fb);
-test(0x104d8,0x104b0);
-test(0x104d9,0x104b1);
-test(0x104da,0x104b2);
-test(0x104db,0x104b3);
-test(0x104dc,0x104b4);
-test(0x104dd,0x104b5);
-test(0x104de,0x104b6);
-test(0x104df,0x104b7);
-test(0x104e0,0x104b8);
-test(0x104e1,0x104b9);
-test(0x104e2,0x104ba);
-test(0x104e3,0x104bb);
-test(0x104e4,0x104bc);
-test(0x104e5,0x104bd);
-test(0x104e6,0x104be);
-test(0x104e7,0x104bf);
-test(0x104e8,0x104c0);
-test(0x104e9,0x104c1);
-test(0x104ea,0x104c2);
-test(0x104eb,0x104c3);
-test(0x104ec,0x104c4);
-test(0x104ed,0x104c5);
-test(0x104ee,0x104c6);
-test(0x104ef,0x104c7);
-test(0x104f0,0x104c8);
-test(0x104f1,0x104c9);
-test(0x104f2,0x104ca);
-test(0x104f3,0x104cb);
-test(0x104f4,0x104cc);
-test(0x104f5,0x104cd);
-test(0x104f6,0x104ce);
-test(0x104f7,0x104cf);
-test(0x104f8,0x104d0);
-test(0x104f9,0x104d1);
-test(0x104fa,0x104d2);
-test(0x104fb,0x104d3);
-test(0x10c80,0x10cc0);
-test(0x10c81,0x10cc1);
-test(0x10c82,0x10cc2);
-test(0x10c83,0x10cc3);
-test(0x10c84,0x10cc4);
-test(0x10c85,0x10cc5);
-test(0x10c86,0x10cc6);
-test(0x10c87,0x10cc7);
-test(0x10c88,0x10cc8);
-test(0x10c89,0x10cc9);
-test(0x10c8a,0x10cca);
-test(0x10c8b,0x10ccb);
-test(0x10c8c,0x10ccc);
-test(0x10c8d,0x10ccd);
-test(0x10c8e,0x10cce);
-test(0x10c8f,0x10ccf);
-test(0x10c90,0x10cd0);
-test(0x10c91,0x10cd1);
-test(0x10c92,0x10cd2);
-test(0x10c93,0x10cd3);
-test(0x10c94,0x10cd4);
-test(0x10c95,0x10cd5);
-test(0x10c96,0x10cd6);
-test(0x10c97,0x10cd7);
-test(0x10c98,0x10cd8);
-test(0x10c99,0x10cd9);
-test(0x10c9a,0x10cda);
-test(0x10c9b,0x10cdb);
-test(0x10c9c,0x10cdc);
-test(0x10c9d,0x10cdd);
-test(0x10c9e,0x10cde);
-test(0x10c9f,0x10cdf);
-test(0x10ca0,0x10ce0);
-test(0x10ca1,0x10ce1);
-test(0x10ca2,0x10ce2);
-test(0x10ca3,0x10ce3);
-test(0x10ca4,0x10ce4);
-test(0x10ca5,0x10ce5);
-test(0x10ca6,0x10ce6);
-test(0x10ca7,0x10ce7);
-test(0x10ca8,0x10ce8);
-test(0x10ca9,0x10ce9);
-test(0x10caa,0x10cea);
-test(0x10cab,0x10ceb);
-test(0x10cac,0x10cec);
-test(0x10cad,0x10ced);
-test(0x10cae,0x10cee);
-test(0x10caf,0x10cef);
-test(0x10cb0,0x10cf0);
-test(0x10cb1,0x10cf1);
-test(0x10cb2,0x10cf2);
-test(0x10cc0,0x10c80);
-test(0x10cc1,0x10c81);
-test(0x10cc2,0x10c82);
-test(0x10cc3,0x10c83);
-test(0x10cc4,0x10c84);
-test(0x10cc5,0x10c85);
-test(0x10cc6,0x10c86);
-test(0x10cc7,0x10c87);
-test(0x10cc8,0x10c88);
-test(0x10cc9,0x10c89);
-test(0x10cca,0x10c8a);
-test(0x10ccb,0x10c8b);
-test(0x10ccc,0x10c8c);
-test(0x10ccd,0x10c8d);
-test(0x10cce,0x10c8e);
-test(0x10ccf,0x10c8f);
-test(0x10cd0,0x10c90);
-test(0x10cd1,0x10c91);
-test(0x10cd2,0x10c92);
-test(0x10cd3,0x10c93);
-test(0x10cd4,0x10c94);
-test(0x10cd5,0x10c95);
-test(0x10cd6,0x10c96);
-test(0x10cd7,0x10c97);
-test(0x10cd8,0x10c98);
-test(0x10cd9,0x10c99);
-test(0x10cda,0x10c9a);
-test(0x10cdb,0x10c9b);
-test(0x10cdc,0x10c9c);
-test(0x10cdd,0x10c9d);
-test(0x10cde,0x10c9e);
-test(0x10cdf,0x10c9f);
-test(0x10ce0,0x10ca0);
-test(0x10ce1,0x10ca1);
-test(0x10ce2,0x10ca2);
-test(0x10ce3,0x10ca3);
-test(0x10ce4,0x10ca4);
-test(0x10ce5,0x10ca5);
-test(0x10ce6,0x10ca6);
-test(0x10ce7,0x10ca7);
-test(0x10ce8,0x10ca8);
-test(0x10ce9,0x10ca9);
-test(0x10cea,0x10caa);
-test(0x10ceb,0x10cab);
-test(0x10cec,0x10cac);
-test(0x10ced,0x10cad);
-test(0x10cee,0x10cae);
-test(0x10cef,0x10caf);
-test(0x10cf0,0x10cb0);
-test(0x10cf1,0x10cb1);
-test(0x10cf2,0x10cb2);
-test(0x118a0,0x118c0);
-test(0x118a1,0x118c1);
-test(0x118a2,0x118c2);
-test(0x118a3,0x118c3);
-test(0x118a4,0x118c4);
-test(0x118a5,0x118c5);
-test(0x118a6,0x118c6);
-test(0x118a7,0x118c7);
-test(0x118a8,0x118c8);
-test(0x118a9,0x118c9);
-test(0x118aa,0x118ca);
-test(0x118ab,0x118cb);
-test(0x118ac,0x118cc);
-test(0x118ad,0x118cd);
-test(0x118ae,0x118ce);
-test(0x118af,0x118cf);
-test(0x118b0,0x118d0);
-test(0x118b1,0x118d1);
-test(0x118b2,0x118d2);
-test(0x118b3,0x118d3);
-test(0x118b4,0x118d4);
-test(0x118b5,0x118d5);
-test(0x118b6,0x118d6);
-test(0x118b7,0x118d7);
-test(0x118b8,0x118d8);
-test(0x118b9,0x118d9);
-test(0x118ba,0x118da);
-test(0x118bb,0x118db);
-test(0x118bc,0x118dc);
-test(0x118bd,0x118dd);
-test(0x118be,0x118de);
-test(0x118bf,0x118df);
-test(0x118c0,0x118a0);
-test(0x118c1,0x118a1);
-test(0x118c2,0x118a2);
-test(0x118c3,0x118a3);
-test(0x118c4,0x118a4);
-test(0x118c5,0x118a5);
-test(0x118c6,0x118a6);
-test(0x118c7,0x118a7);
-test(0x118c8,0x118a8);
-test(0x118c9,0x118a9);
-test(0x118ca,0x118aa);
-test(0x118cb,0x118ab);
-test(0x118cc,0x118ac);
-test(0x118cd,0x118ad);
-test(0x118ce,0x118ae);
-test(0x118cf,0x118af);
-test(0x118d0,0x118b0);
-test(0x118d1,0x118b1);
-test(0x118d2,0x118b2);
-test(0x118d3,0x118b3);
-test(0x118d4,0x118b4);
-test(0x118d5,0x118b5);
-test(0x118d6,0x118b6);
-test(0x118d7,0x118b7);
-test(0x118d8,0x118b8);
-test(0x118d9,0x118b9);
-test(0x118da,0x118ba);
-test(0x118db,0x118bb);
-test(0x118dc,0x118bc);
-test(0x118dd,0x118bd);
-test(0x118de,0x118be);
-test(0x118df,0x118bf);
-test(0x16e40,0x16e60);
-test(0x16e41,0x16e61);
-test(0x16e42,0x16e62);
-test(0x16e43,0x16e63);
-test(0x16e44,0x16e64);
-test(0x16e45,0x16e65);
-test(0x16e46,0x16e66);
-test(0x16e47,0x16e67);
-test(0x16e48,0x16e68);
-test(0x16e49,0x16e69);
-test(0x16e4a,0x16e6a);
-test(0x16e4b,0x16e6b);
-test(0x16e4c,0x16e6c);
-test(0x16e4d,0x16e6d);
-test(0x16e4e,0x16e6e);
-test(0x16e4f,0x16e6f);
-test(0x16e50,0x16e70);
-test(0x16e51,0x16e71);
-test(0x16e52,0x16e72);
-test(0x16e53,0x16e73);
-test(0x16e54,0x16e74);
-test(0x16e55,0x16e75);
-test(0x16e56,0x16e76);
-test(0x16e57,0x16e77);
-test(0x16e58,0x16e78);
-test(0x16e59,0x16e79);
-test(0x16e5a,0x16e7a);
-test(0x16e5b,0x16e7b);
-test(0x16e5c,0x16e7c);
-test(0x16e5d,0x16e7d);
-test(0x16e5e,0x16e7e);
-test(0x16e5f,0x16e7f);
-test(0x16e60,0x16e40);
-test(0x16e61,0x16e41);
-test(0x16e62,0x16e42);
-test(0x16e63,0x16e43);
-test(0x16e64,0x16e44);
-test(0x16e65,0x16e45);
-test(0x16e66,0x16e46);
-test(0x16e67,0x16e47);
-test(0x16e68,0x16e48);
-test(0x16e69,0x16e49);
-test(0x16e6a,0x16e4a);
-test(0x16e6b,0x16e4b);
-test(0x16e6c,0x16e4c);
-test(0x16e6d,0x16e4d);
-test(0x16e6e,0x16e4e);
-test(0x16e6f,0x16e4f);
-test(0x16e70,0x16e50);
-test(0x16e71,0x16e51);
-test(0x16e72,0x16e52);
-test(0x16e73,0x16e53);
-test(0x16e74,0x16e54);
-test(0x16e75,0x16e55);
-test(0x16e76,0x16e56);
-test(0x16e77,0x16e57);
-test(0x16e78,0x16e58);
-test(0x16e79,0x16e59);
-test(0x16e7a,0x16e5a);
-test(0x16e7b,0x16e5b);
-test(0x16e7c,0x16e5c);
-test(0x16e7d,0x16e5d);
-test(0x16e7e,0x16e5e);
-test(0x16e7f,0x16e5f);
-test(0x1e900,0x1e922);
-test(0x1e901,0x1e923);
-test(0x1e902,0x1e924);
-test(0x1e903,0x1e925);
-test(0x1e904,0x1e926);
-test(0x1e905,0x1e927);
-test(0x1e906,0x1e928);
-test(0x1e907,0x1e929);
-test(0x1e908,0x1e92a);
-test(0x1e909,0x1e92b);
-test(0x1e90a,0x1e92c);
-test(0x1e90b,0x1e92d);
-test(0x1e90c,0x1e92e);
-test(0x1e90d,0x1e92f);
-test(0x1e90e,0x1e930);
-test(0x1e90f,0x1e931);
-test(0x1e910,0x1e932);
-test(0x1e911,0x1e933);
-test(0x1e912,0x1e934);
-test(0x1e913,0x1e935);
-test(0x1e914,0x1e936);
-test(0x1e915,0x1e937);
-test(0x1e916,0x1e938);
-test(0x1e917,0x1e939);
-test(0x1e918,0x1e93a);
-test(0x1e919,0x1e93b);
-test(0x1e91a,0x1e93c);
-test(0x1e91b,0x1e93d);
-test(0x1e91c,0x1e93e);
-test(0x1e91d,0x1e93f);
-test(0x1e91e,0x1e940);
-test(0x1e91f,0x1e941);
-test(0x1e920,0x1e942);
-test(0x1e921,0x1e943);
-test(0x1e922,0x1e900);
-test(0x1e923,0x1e901);
-test(0x1e924,0x1e902);
-test(0x1e925,0x1e903);
-test(0x1e926,0x1e904);
-test(0x1e927,0x1e905);
-test(0x1e928,0x1e906);
-test(0x1e929,0x1e907);
-test(0x1e92a,0x1e908);
-test(0x1e92b,0x1e909);
-test(0x1e92c,0x1e90a);
-test(0x1e92d,0x1e90b);
-test(0x1e92e,0x1e90c);
-test(0x1e92f,0x1e90d);
-test(0x1e930,0x1e90e);
-test(0x1e931,0x1e90f);
-test(0x1e932,0x1e910);
-test(0x1e933,0x1e911);
-test(0x1e934,0x1e912);
-test(0x1e935,0x1e913);
-test(0x1e936,0x1e914);
-test(0x1e937,0x1e915);
-test(0x1e938,0x1e916);
-test(0x1e939,0x1e917);
-test(0x1e93a,0x1e918);
-test(0x1e93b,0x1e919);
-test(0x1e93c,0x1e91a);
-test(0x1e93d,0x1e91b);
-test(0x1e93e,0x1e91c);
-test(0x1e93f,0x1e91d);
-test(0x1e940,0x1e91e);
-test(0x1e941,0x1e91f);
-test(0x1e942,0x1e920);
-test(0x1e943,0x1e921);
+test(0x0041, 0x0061); // LATIN CAPITAL LETTER A, LATIN SMALL LETTER A
+test(0x0042, 0x0062); // LATIN CAPITAL LETTER B, LATIN SMALL LETTER B
+test(0x0043, 0x0063); // LATIN CAPITAL LETTER C, LATIN SMALL LETTER C
+test(0x0044, 0x0064); // LATIN CAPITAL LETTER D, LATIN SMALL LETTER D
+test(0x0045, 0x0065); // LATIN CAPITAL LETTER E, LATIN SMALL LETTER E
+test(0x0046, 0x0066); // LATIN CAPITAL LETTER F, LATIN SMALL LETTER F
+test(0x0047, 0x0067); // LATIN CAPITAL LETTER G, LATIN SMALL LETTER G
+test(0x0048, 0x0068); // LATIN CAPITAL LETTER H, LATIN SMALL LETTER H
+test(0x0049, 0x0069); // LATIN CAPITAL LETTER I, LATIN SMALL LETTER I
+test(0x004A, 0x006A); // LATIN CAPITAL LETTER J, LATIN SMALL LETTER J
+test(0x004B, 0x006B, 0x212A); // LATIN CAPITAL LETTER K, LATIN SMALL LETTER K, KELVIN SIGN (DEGREES KELVIN)
+test(0x004C, 0x006C); // LATIN CAPITAL LETTER L, LATIN SMALL LETTER L
+test(0x004D, 0x006D); // LATIN CAPITAL LETTER M, LATIN SMALL LETTER M
+test(0x004E, 0x006E); // LATIN CAPITAL LETTER N, LATIN SMALL LETTER N
+test(0x004F, 0x006F); // LATIN CAPITAL LETTER O, LATIN SMALL LETTER O
+test(0x0050, 0x0070); // LATIN CAPITAL LETTER P, LATIN SMALL LETTER P
+test(0x0051, 0x0071); // LATIN CAPITAL LETTER Q, LATIN SMALL LETTER Q
+test(0x0052, 0x0072); // LATIN CAPITAL LETTER R, LATIN SMALL LETTER R
+test(0x0053, 0x0073, 0x017F); // LATIN CAPITAL LETTER S, LATIN SMALL LETTER S, LATIN SMALL LETTER LONG S
+test(0x0054, 0x0074); // LATIN CAPITAL LETTER T, LATIN SMALL LETTER T
+test(0x0055, 0x0075); // LATIN CAPITAL LETTER U, LATIN SMALL LETTER U
+test(0x0056, 0x0076); // LATIN CAPITAL LETTER V, LATIN SMALL LETTER V
+test(0x0057, 0x0077); // LATIN CAPITAL LETTER W, LATIN SMALL LETTER W
+test(0x0058, 0x0078); // LATIN CAPITAL LETTER X, LATIN SMALL LETTER X
+test(0x0059, 0x0079); // LATIN CAPITAL LETTER Y, LATIN SMALL LETTER Y
+test(0x005A, 0x007A); // LATIN CAPITAL LETTER Z, LATIN SMALL LETTER Z
+test(0x0061, 0x0041); // LATIN SMALL LETTER A, LATIN CAPITAL LETTER A
+test(0x0062, 0x0042); // LATIN SMALL LETTER B, LATIN CAPITAL LETTER B
+test(0x0063, 0x0043); // LATIN SMALL LETTER C, LATIN CAPITAL LETTER C
+test(0x0064, 0x0044); // LATIN SMALL LETTER D, LATIN CAPITAL LETTER D
+test(0x0065, 0x0045); // LATIN SMALL LETTER E, LATIN CAPITAL LETTER E
+test(0x0066, 0x0046); // LATIN SMALL LETTER F, LATIN CAPITAL LETTER F
+test(0x0067, 0x0047); // LATIN SMALL LETTER G, LATIN CAPITAL LETTER G
+test(0x0068, 0x0048); // LATIN SMALL LETTER H, LATIN CAPITAL LETTER H
+test(0x0069, 0x0049); // LATIN SMALL LETTER I, LATIN CAPITAL LETTER I
+test(0x006A, 0x004A); // LATIN SMALL LETTER J, LATIN CAPITAL LETTER J
+test(0x006B, 0x004B, 0x212A); // LATIN SMALL LETTER K, LATIN CAPITAL LETTER K, KELVIN SIGN (DEGREES KELVIN)
+test(0x006C, 0x004C); // LATIN SMALL LETTER L, LATIN CAPITAL LETTER L
+test(0x006D, 0x004D); // LATIN SMALL LETTER M, LATIN CAPITAL LETTER M
+test(0x006E, 0x004E); // LATIN SMALL LETTER N, LATIN CAPITAL LETTER N
+test(0x006F, 0x004F); // LATIN SMALL LETTER O, LATIN CAPITAL LETTER O
+test(0x0070, 0x0050); // LATIN SMALL LETTER P, LATIN CAPITAL LETTER P
+test(0x0071, 0x0051); // LATIN SMALL LETTER Q, LATIN CAPITAL LETTER Q
+test(0x0072, 0x0052); // LATIN SMALL LETTER R, LATIN CAPITAL LETTER R
+test(0x0073, 0x0053, 0x017F); // LATIN SMALL LETTER S, LATIN CAPITAL LETTER S, LATIN SMALL LETTER LONG S
+test(0x0074, 0x0054); // LATIN SMALL LETTER T, LATIN CAPITAL LETTER T
+test(0x0075, 0x0055); // LATIN SMALL LETTER U, LATIN CAPITAL LETTER U
+test(0x0076, 0x0056); // LATIN SMALL LETTER V, LATIN CAPITAL LETTER V
+test(0x0077, 0x0057); // LATIN SMALL LETTER W, LATIN CAPITAL LETTER W
+test(0x0078, 0x0058); // LATIN SMALL LETTER X, LATIN CAPITAL LETTER X
+test(0x0079, 0x0059); // LATIN SMALL LETTER Y, LATIN CAPITAL LETTER Y
+test(0x007A, 0x005A); // LATIN SMALL LETTER Z, LATIN CAPITAL LETTER Z
+test(0x00B5, 0x03BC, 0x039C); // MICRO SIGN, GREEK SMALL LETTER MU, GREEK CAPITAL LETTER MU
+test(0x00C0, 0x00E0); // LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE), LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE)
+test(0x00C1, 0x00E1); // LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE), LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE)
+test(0x00C2, 0x00E2); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX), LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX)
+test(0x00C3, 0x00E3); // LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE), LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE)
+test(0x00C4, 0x00E4); // LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS), LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS)
+test(0x00C5, 0x00E5, 0x212B); // LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING), LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), ANGSTROM SIGN (ANGSTROM UNIT)
+test(0x00C6, 0x00E6); // LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E), LATIN SMALL LETTER AE (LATIN SMALL LETTER A E)
+test(0x00C7, 0x00E7); // LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA), LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA)
+test(0x00C8, 0x00E8); // LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE), LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE)
+test(0x00C9, 0x00E9); // LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE), LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE)
+test(0x00CA, 0x00EA); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX), LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX)
+test(0x00CB, 0x00EB); // LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS), LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS)
+test(0x00CC, 0x00EC); // LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE), LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE)
+test(0x00CD, 0x00ED); // LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE), LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE)
+test(0x00CE, 0x00EE); // LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX), LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX)
+test(0x00CF, 0x00EF); // LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS), LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS)
+test(0x00D0, 0x00F0); // LATIN CAPITAL LETTER ETH, LATIN SMALL LETTER ETH
+test(0x00D1, 0x00F1); // LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE), LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE)
+test(0x00D2, 0x00F2); // LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE), LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE)
+test(0x00D3, 0x00F3); // LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE), LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE)
+test(0x00D4, 0x00F4); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX), LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX)
+test(0x00D5, 0x00F5); // LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE), LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE)
+test(0x00D6, 0x00F6); // LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS), LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS)
+test(0x00D8, 0x00F8); // LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH), LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH)
+test(0x00D9, 0x00F9); // LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE), LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE)
+test(0x00DA, 0x00FA); // LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE), LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE)
+test(0x00DB, 0x00FB); // LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX), LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX)
+test(0x00DC, 0x00FC); // LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS), LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS)
+test(0x00DD, 0x00FD); // LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE), LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE)
+test(0x00DE, 0x00FE); // LATIN CAPITAL LETTER THORN, LATIN SMALL LETTER THORN
+test(0x00DF, 0x1E9E); // LATIN SMALL LETTER SHARP S, LATIN CAPITAL LETTER SHARP S
+test(0x00E0, 0x00C0); // LATIN SMALL LETTER A WITH GRAVE (LATIN SMALL LETTER A GRAVE), LATIN CAPITAL LETTER A WITH GRAVE (LATIN CAPITAL LETTER A GRAVE)
+test(0x00E1, 0x00C1); // LATIN SMALL LETTER A WITH ACUTE (LATIN SMALL LETTER A ACUTE), LATIN CAPITAL LETTER A WITH ACUTE (LATIN CAPITAL LETTER A ACUTE)
+test(0x00E2, 0x00C2); // LATIN SMALL LETTER A WITH CIRCUMFLEX (LATIN SMALL LETTER A CIRCUMFLEX), LATIN CAPITAL LETTER A WITH CIRCUMFLEX (LATIN CAPITAL LETTER A CIRCUMFLEX)
+test(0x00E3, 0x00C3); // LATIN SMALL LETTER A WITH TILDE (LATIN SMALL LETTER A TILDE), LATIN CAPITAL LETTER A WITH TILDE (LATIN CAPITAL LETTER A TILDE)
+test(0x00E4, 0x00C4); // LATIN SMALL LETTER A WITH DIAERESIS (LATIN SMALL LETTER A DIAERESIS), LATIN CAPITAL LETTER A WITH DIAERESIS (LATIN CAPITAL LETTER A DIAERESIS)
+test(0x00E5, 0x00C5, 0x212B); // LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING), ANGSTROM SIGN (ANGSTROM UNIT)
+test(0x00E6, 0x00C6); // LATIN SMALL LETTER AE (LATIN SMALL LETTER A E), LATIN CAPITAL LETTER AE (LATIN CAPITAL LETTER A E)
+test(0x00E7, 0x00C7); // LATIN SMALL LETTER C WITH CEDILLA (LATIN SMALL LETTER C CEDILLA), LATIN CAPITAL LETTER C WITH CEDILLA (LATIN CAPITAL LETTER C CEDILLA)
+test(0x00E8, 0x00C8); // LATIN SMALL LETTER E WITH GRAVE (LATIN SMALL LETTER E GRAVE), LATIN CAPITAL LETTER E WITH GRAVE (LATIN CAPITAL LETTER E GRAVE)
+test(0x00E9, 0x00C9); // LATIN SMALL LETTER E WITH ACUTE (LATIN SMALL LETTER E ACUTE), LATIN CAPITAL LETTER E WITH ACUTE (LATIN CAPITAL LETTER E ACUTE)
+test(0x00EA, 0x00CA); // LATIN SMALL LETTER E WITH CIRCUMFLEX (LATIN SMALL LETTER E CIRCUMFLEX), LATIN CAPITAL LETTER E WITH CIRCUMFLEX (LATIN CAPITAL LETTER E CIRCUMFLEX)
+test(0x00EB, 0x00CB); // LATIN SMALL LETTER E WITH DIAERESIS (LATIN SMALL LETTER E DIAERESIS), LATIN CAPITAL LETTER E WITH DIAERESIS (LATIN CAPITAL LETTER E DIAERESIS)
+test(0x00EC, 0x00CC); // LATIN SMALL LETTER I WITH GRAVE (LATIN SMALL LETTER I GRAVE), LATIN CAPITAL LETTER I WITH GRAVE (LATIN CAPITAL LETTER I GRAVE)
+test(0x00ED, 0x00CD); // LATIN SMALL LETTER I WITH ACUTE (LATIN SMALL LETTER I ACUTE), LATIN CAPITAL LETTER I WITH ACUTE (LATIN CAPITAL LETTER I ACUTE)
+test(0x00EE, 0x00CE); // LATIN SMALL LETTER I WITH CIRCUMFLEX (LATIN SMALL LETTER I CIRCUMFLEX), LATIN CAPITAL LETTER I WITH CIRCUMFLEX (LATIN CAPITAL LETTER I CIRCUMFLEX)
+test(0x00EF, 0x00CF); // LATIN SMALL LETTER I WITH DIAERESIS (LATIN SMALL LETTER I DIAERESIS), LATIN CAPITAL LETTER I WITH DIAERESIS (LATIN CAPITAL LETTER I DIAERESIS)
+test(0x00F0, 0x00D0); // LATIN SMALL LETTER ETH, LATIN CAPITAL LETTER ETH
+test(0x00F1, 0x00D1); // LATIN SMALL LETTER N WITH TILDE (LATIN SMALL LETTER N TILDE), LATIN CAPITAL LETTER N WITH TILDE (LATIN CAPITAL LETTER N TILDE)
+test(0x00F2, 0x00D2); // LATIN SMALL LETTER O WITH GRAVE (LATIN SMALL LETTER O GRAVE), LATIN CAPITAL LETTER O WITH GRAVE (LATIN CAPITAL LETTER O GRAVE)
+test(0x00F3, 0x00D3); // LATIN SMALL LETTER O WITH ACUTE (LATIN SMALL LETTER O ACUTE), LATIN CAPITAL LETTER O WITH ACUTE (LATIN CAPITAL LETTER O ACUTE)
+test(0x00F4, 0x00D4); // LATIN SMALL LETTER O WITH CIRCUMFLEX (LATIN SMALL LETTER O CIRCUMFLEX), LATIN CAPITAL LETTER O WITH CIRCUMFLEX (LATIN CAPITAL LETTER O CIRCUMFLEX)
+test(0x00F5, 0x00D5); // LATIN SMALL LETTER O WITH TILDE (LATIN SMALL LETTER O TILDE), LATIN CAPITAL LETTER O WITH TILDE (LATIN CAPITAL LETTER O TILDE)
+test(0x00F6, 0x00D6); // LATIN SMALL LETTER O WITH DIAERESIS (LATIN SMALL LETTER O DIAERESIS), LATIN CAPITAL LETTER O WITH DIAERESIS (LATIN CAPITAL LETTER O DIAERESIS)
+test(0x00F8, 0x00D8); // LATIN SMALL LETTER O WITH STROKE (LATIN SMALL LETTER O SLASH), LATIN CAPITAL LETTER O WITH STROKE (LATIN CAPITAL LETTER O SLASH)
+test(0x00F9, 0x00D9); // LATIN SMALL LETTER U WITH GRAVE (LATIN SMALL LETTER U GRAVE), LATIN CAPITAL LETTER U WITH GRAVE (LATIN CAPITAL LETTER U GRAVE)
+test(0x00FA, 0x00DA); // LATIN SMALL LETTER U WITH ACUTE (LATIN SMALL LETTER U ACUTE), LATIN CAPITAL LETTER U WITH ACUTE (LATIN CAPITAL LETTER U ACUTE)
+test(0x00FB, 0x00DB); // LATIN SMALL LETTER U WITH CIRCUMFLEX (LATIN SMALL LETTER U CIRCUMFLEX), LATIN CAPITAL LETTER U WITH CIRCUMFLEX (LATIN CAPITAL LETTER U CIRCUMFLEX)
+test(0x00FC, 0x00DC); // LATIN SMALL LETTER U WITH DIAERESIS (LATIN SMALL LETTER U DIAERESIS), LATIN CAPITAL LETTER U WITH DIAERESIS (LATIN CAPITAL LETTER U DIAERESIS)
+test(0x00FD, 0x00DD); // LATIN SMALL LETTER Y WITH ACUTE (LATIN SMALL LETTER Y ACUTE), LATIN CAPITAL LETTER Y WITH ACUTE (LATIN CAPITAL LETTER Y ACUTE)
+test(0x00FE, 0x00DE); // LATIN SMALL LETTER THORN, LATIN CAPITAL LETTER THORN
+test(0x00FF, 0x0178); // LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS), LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS)
+test(0x0100, 0x0101); // LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON), LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON)
+test(0x0101, 0x0100); // LATIN SMALL LETTER A WITH MACRON (LATIN SMALL LETTER A MACRON), LATIN CAPITAL LETTER A WITH MACRON (LATIN CAPITAL LETTER A MACRON)
+test(0x0102, 0x0103); // LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE), LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE)
+test(0x0103, 0x0102); // LATIN SMALL LETTER A WITH BREVE (LATIN SMALL LETTER A BREVE), LATIN CAPITAL LETTER A WITH BREVE (LATIN CAPITAL LETTER A BREVE)
+test(0x0104, 0x0105); // LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK), LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK)
+test(0x0105, 0x0104); // LATIN SMALL LETTER A WITH OGONEK (LATIN SMALL LETTER A OGONEK), LATIN CAPITAL LETTER A WITH OGONEK (LATIN CAPITAL LETTER A OGONEK)
+test(0x0106, 0x0107); // LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE), LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE)
+test(0x0107, 0x0106); // LATIN SMALL LETTER C WITH ACUTE (LATIN SMALL LETTER C ACUTE), LATIN CAPITAL LETTER C WITH ACUTE (LATIN CAPITAL LETTER C ACUTE)
+test(0x0108, 0x0109); // LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX), LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX)
+test(0x0109, 0x0108); // LATIN SMALL LETTER C WITH CIRCUMFLEX (LATIN SMALL LETTER C CIRCUMFLEX), LATIN CAPITAL LETTER C WITH CIRCUMFLEX (LATIN CAPITAL LETTER C CIRCUMFLEX)
+test(0x010A, 0x010B); // LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT), LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT)
+test(0x010B, 0x010A); // LATIN SMALL LETTER C WITH DOT ABOVE (LATIN SMALL LETTER C DOT), LATIN CAPITAL LETTER C WITH DOT ABOVE (LATIN CAPITAL LETTER C DOT)
+test(0x010C, 0x010D); // LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK), LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK)
+test(0x010D, 0x010C); // LATIN SMALL LETTER C WITH CARON (LATIN SMALL LETTER C HACEK), LATIN CAPITAL LETTER C WITH CARON (LATIN CAPITAL LETTER C HACEK)
+test(0x010E, 0x010F); // LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK), LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK)
+test(0x010F, 0x010E); // LATIN SMALL LETTER D WITH CARON (LATIN SMALL LETTER D HACEK), LATIN CAPITAL LETTER D WITH CARON (LATIN CAPITAL LETTER D HACEK)
+test(0x0110, 0x0111); // LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR), LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR)
+test(0x0111, 0x0110); // LATIN SMALL LETTER D WITH STROKE (LATIN SMALL LETTER D BAR), LATIN CAPITAL LETTER D WITH STROKE (LATIN CAPITAL LETTER D BAR)
+test(0x0112, 0x0113); // LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON), LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON)
+test(0x0113, 0x0112); // LATIN SMALL LETTER E WITH MACRON (LATIN SMALL LETTER E MACRON), LATIN CAPITAL LETTER E WITH MACRON (LATIN CAPITAL LETTER E MACRON)
+test(0x0114, 0x0115); // LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE), LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE)
+test(0x0115, 0x0114); // LATIN SMALL LETTER E WITH BREVE (LATIN SMALL LETTER E BREVE), LATIN CAPITAL LETTER E WITH BREVE (LATIN CAPITAL LETTER E BREVE)
+test(0x0116, 0x0117); // LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT), LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT)
+test(0x0117, 0x0116); // LATIN SMALL LETTER E WITH DOT ABOVE (LATIN SMALL LETTER E DOT), LATIN CAPITAL LETTER E WITH DOT ABOVE (LATIN CAPITAL LETTER E DOT)
+test(0x0118, 0x0119); // LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK), LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK)
+test(0x0119, 0x0118); // LATIN SMALL LETTER E WITH OGONEK (LATIN SMALL LETTER E OGONEK), LATIN CAPITAL LETTER E WITH OGONEK (LATIN CAPITAL LETTER E OGONEK)
+test(0x011A, 0x011B); // LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK), LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK)
+test(0x011B, 0x011A); // LATIN SMALL LETTER E WITH CARON (LATIN SMALL LETTER E HACEK), LATIN CAPITAL LETTER E WITH CARON (LATIN CAPITAL LETTER E HACEK)
+test(0x011C, 0x011D); // LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX), LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX)
+test(0x011D, 0x011C); // LATIN SMALL LETTER G WITH CIRCUMFLEX (LATIN SMALL LETTER G CIRCUMFLEX), LATIN CAPITAL LETTER G WITH CIRCUMFLEX (LATIN CAPITAL LETTER G CIRCUMFLEX)
+test(0x011E, 0x011F); // LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE), LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE)
+test(0x011F, 0x011E); // LATIN SMALL LETTER G WITH BREVE (LATIN SMALL LETTER G BREVE), LATIN CAPITAL LETTER G WITH BREVE (LATIN CAPITAL LETTER G BREVE)
+test(0x0120, 0x0121); // LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT), LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT)
+test(0x0121, 0x0120); // LATIN SMALL LETTER G WITH DOT ABOVE (LATIN SMALL LETTER G DOT), LATIN CAPITAL LETTER G WITH DOT ABOVE (LATIN CAPITAL LETTER G DOT)
+test(0x0122, 0x0123); // LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA), LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA)
+test(0x0123, 0x0122); // LATIN SMALL LETTER G WITH CEDILLA (LATIN SMALL LETTER G CEDILLA), LATIN CAPITAL LETTER G WITH CEDILLA (LATIN CAPITAL LETTER G CEDILLA)
+test(0x0124, 0x0125); // LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX), LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX)
+test(0x0125, 0x0124); // LATIN SMALL LETTER H WITH CIRCUMFLEX (LATIN SMALL LETTER H CIRCUMFLEX), LATIN CAPITAL LETTER H WITH CIRCUMFLEX (LATIN CAPITAL LETTER H CIRCUMFLEX)
+test(0x0126, 0x0127); // LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR), LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR)
+test(0x0127, 0x0126); // LATIN SMALL LETTER H WITH STROKE (LATIN SMALL LETTER H BAR), LATIN CAPITAL LETTER H WITH STROKE (LATIN CAPITAL LETTER H BAR)
+test(0x0128, 0x0129); // LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE), LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE)
+test(0x0129, 0x0128); // LATIN SMALL LETTER I WITH TILDE (LATIN SMALL LETTER I TILDE), LATIN CAPITAL LETTER I WITH TILDE (LATIN CAPITAL LETTER I TILDE)
+test(0x012A, 0x012B); // LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON), LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON)
+test(0x012B, 0x012A); // LATIN SMALL LETTER I WITH MACRON (LATIN SMALL LETTER I MACRON), LATIN CAPITAL LETTER I WITH MACRON (LATIN CAPITAL LETTER I MACRON)
+test(0x012C, 0x012D); // LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE), LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE)
+test(0x012D, 0x012C); // LATIN SMALL LETTER I WITH BREVE (LATIN SMALL LETTER I BREVE), LATIN CAPITAL LETTER I WITH BREVE (LATIN CAPITAL LETTER I BREVE)
+test(0x012E, 0x012F); // LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK), LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK)
+test(0x012F, 0x012E); // LATIN SMALL LETTER I WITH OGONEK (LATIN SMALL LETTER I OGONEK), LATIN CAPITAL LETTER I WITH OGONEK (LATIN CAPITAL LETTER I OGONEK)
+test(0x0132, 0x0133); // LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J), LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J)
+test(0x0133, 0x0132); // LATIN SMALL LIGATURE IJ (LATIN SMALL LETTER I J), LATIN CAPITAL LIGATURE IJ (LATIN CAPITAL LETTER I J)
+test(0x0134, 0x0135); // LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX), LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX)
+test(0x0135, 0x0134); // LATIN SMALL LETTER J WITH CIRCUMFLEX (LATIN SMALL LETTER J CIRCUMFLEX), LATIN CAPITAL LETTER J WITH CIRCUMFLEX (LATIN CAPITAL LETTER J CIRCUMFLEX)
+test(0x0136, 0x0137); // LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA), LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA)
+test(0x0137, 0x0136); // LATIN SMALL LETTER K WITH CEDILLA (LATIN SMALL LETTER K CEDILLA), LATIN CAPITAL LETTER K WITH CEDILLA (LATIN CAPITAL LETTER K CEDILLA)
+test(0x0139, 0x013A); // LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE), LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE)
+test(0x013A, 0x0139); // LATIN SMALL LETTER L WITH ACUTE (LATIN SMALL LETTER L ACUTE), LATIN CAPITAL LETTER L WITH ACUTE (LATIN CAPITAL LETTER L ACUTE)
+test(0x013B, 0x013C); // LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA), LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA)
+test(0x013C, 0x013B); // LATIN SMALL LETTER L WITH CEDILLA (LATIN SMALL LETTER L CEDILLA), LATIN CAPITAL LETTER L WITH CEDILLA (LATIN CAPITAL LETTER L CEDILLA)
+test(0x013D, 0x013E); // LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK), LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK)
+test(0x013E, 0x013D); // LATIN SMALL LETTER L WITH CARON (LATIN SMALL LETTER L HACEK), LATIN CAPITAL LETTER L WITH CARON (LATIN CAPITAL LETTER L HACEK)
+test(0x013F, 0x0140); // LATIN CAPITAL LETTER L WITH MIDDLE DOT, LATIN SMALL LETTER L WITH MIDDLE DOT
+test(0x0140, 0x013F); // LATIN SMALL LETTER L WITH MIDDLE DOT, LATIN CAPITAL LETTER L WITH MIDDLE DOT
+test(0x0141, 0x0142); // LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH), LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH)
+test(0x0142, 0x0141); // LATIN SMALL LETTER L WITH STROKE (LATIN SMALL LETTER L SLASH), LATIN CAPITAL LETTER L WITH STROKE (LATIN CAPITAL LETTER L SLASH)
+test(0x0143, 0x0144); // LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE), LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE)
+test(0x0144, 0x0143); // LATIN SMALL LETTER N WITH ACUTE (LATIN SMALL LETTER N ACUTE), LATIN CAPITAL LETTER N WITH ACUTE (LATIN CAPITAL LETTER N ACUTE)
+test(0x0145, 0x0146); // LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA), LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA)
+test(0x0146, 0x0145); // LATIN SMALL LETTER N WITH CEDILLA (LATIN SMALL LETTER N CEDILLA), LATIN CAPITAL LETTER N WITH CEDILLA (LATIN CAPITAL LETTER N CEDILLA)
+test(0x0147, 0x0148); // LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK), LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK)
+test(0x0148, 0x0147); // LATIN SMALL LETTER N WITH CARON (LATIN SMALL LETTER N HACEK), LATIN CAPITAL LETTER N WITH CARON (LATIN CAPITAL LETTER N HACEK)
+test(0x014A, 0x014B); // LATIN CAPITAL LETTER ENG, LATIN SMALL LETTER ENG
+test(0x014B, 0x014A); // LATIN SMALL LETTER ENG, LATIN CAPITAL LETTER ENG
+test(0x014C, 0x014D); // LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON), LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON)
+test(0x014D, 0x014C); // LATIN SMALL LETTER O WITH MACRON (LATIN SMALL LETTER O MACRON), LATIN CAPITAL LETTER O WITH MACRON (LATIN CAPITAL LETTER O MACRON)
+test(0x014E, 0x014F); // LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE), LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE)
+test(0x014F, 0x014E); // LATIN SMALL LETTER O WITH BREVE (LATIN SMALL LETTER O BREVE), LATIN CAPITAL LETTER O WITH BREVE (LATIN CAPITAL LETTER O BREVE)
+test(0x0150, 0x0151); // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE), LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE)
+test(0x0151, 0x0150); // LATIN SMALL LETTER O WITH DOUBLE ACUTE (LATIN SMALL LETTER O DOUBLE ACUTE), LATIN CAPITAL LETTER O WITH DOUBLE ACUTE (LATIN CAPITAL LETTER O DOUBLE ACUTE)
+test(0x0152, 0x0153); // LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E), LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E)
+test(0x0153, 0x0152); // LATIN SMALL LIGATURE OE (LATIN SMALL LETTER O E), LATIN CAPITAL LIGATURE OE (LATIN CAPITAL LETTER O E)
+test(0x0154, 0x0155); // LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE), LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE)
+test(0x0155, 0x0154); // LATIN SMALL LETTER R WITH ACUTE (LATIN SMALL LETTER R ACUTE), LATIN CAPITAL LETTER R WITH ACUTE (LATIN CAPITAL LETTER R ACUTE)
+test(0x0156, 0x0157); // LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA), LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA)
+test(0x0157, 0x0156); // LATIN SMALL LETTER R WITH CEDILLA (LATIN SMALL LETTER R CEDILLA), LATIN CAPITAL LETTER R WITH CEDILLA (LATIN CAPITAL LETTER R CEDILLA)
+test(0x0158, 0x0159); // LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK), LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK)
+test(0x0159, 0x0158); // LATIN SMALL LETTER R WITH CARON (LATIN SMALL LETTER R HACEK), LATIN CAPITAL LETTER R WITH CARON (LATIN CAPITAL LETTER R HACEK)
+test(0x015A, 0x015B); // LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE), LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE)
+test(0x015B, 0x015A); // LATIN SMALL LETTER S WITH ACUTE (LATIN SMALL LETTER S ACUTE), LATIN CAPITAL LETTER S WITH ACUTE (LATIN CAPITAL LETTER S ACUTE)
+test(0x015C, 0x015D); // LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX), LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX)
+test(0x015D, 0x015C); // LATIN SMALL LETTER S WITH CIRCUMFLEX (LATIN SMALL LETTER S CIRCUMFLEX), LATIN CAPITAL LETTER S WITH CIRCUMFLEX (LATIN CAPITAL LETTER S CIRCUMFLEX)
+test(0x015E, 0x015F); // LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA), LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA)
+test(0x015F, 0x015E); // LATIN SMALL LETTER S WITH CEDILLA (LATIN SMALL LETTER S CEDILLA), LATIN CAPITAL LETTER S WITH CEDILLA (LATIN CAPITAL LETTER S CEDILLA)
+test(0x0160, 0x0161); // LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK), LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK)
+test(0x0161, 0x0160); // LATIN SMALL LETTER S WITH CARON (LATIN SMALL LETTER S HACEK), LATIN CAPITAL LETTER S WITH CARON (LATIN CAPITAL LETTER S HACEK)
+test(0x0162, 0x0163); // LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA), LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA)
+test(0x0163, 0x0162); // LATIN SMALL LETTER T WITH CEDILLA (LATIN SMALL LETTER T CEDILLA), LATIN CAPITAL LETTER T WITH CEDILLA (LATIN CAPITAL LETTER T CEDILLA)
+test(0x0164, 0x0165); // LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK), LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK)
+test(0x0165, 0x0164); // LATIN SMALL LETTER T WITH CARON (LATIN SMALL LETTER T HACEK), LATIN CAPITAL LETTER T WITH CARON (LATIN CAPITAL LETTER T HACEK)
+test(0x0166, 0x0167); // LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR), LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR)
+test(0x0167, 0x0166); // LATIN SMALL LETTER T WITH STROKE (LATIN SMALL LETTER T BAR), LATIN CAPITAL LETTER T WITH STROKE (LATIN CAPITAL LETTER T BAR)
+test(0x0168, 0x0169); // LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE), LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE)
+test(0x0169, 0x0168); // LATIN SMALL LETTER U WITH TILDE (LATIN SMALL LETTER U TILDE), LATIN CAPITAL LETTER U WITH TILDE (LATIN CAPITAL LETTER U TILDE)
+test(0x016A, 0x016B); // LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON), LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON)
+test(0x016B, 0x016A); // LATIN SMALL LETTER U WITH MACRON (LATIN SMALL LETTER U MACRON), LATIN CAPITAL LETTER U WITH MACRON (LATIN CAPITAL LETTER U MACRON)
+test(0x016C, 0x016D); // LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE), LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE)
+test(0x016D, 0x016C); // LATIN SMALL LETTER U WITH BREVE (LATIN SMALL LETTER U BREVE), LATIN CAPITAL LETTER U WITH BREVE (LATIN CAPITAL LETTER U BREVE)
+test(0x016E, 0x016F); // LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING), LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING)
+test(0x016F, 0x016E); // LATIN SMALL LETTER U WITH RING ABOVE (LATIN SMALL LETTER U RING), LATIN CAPITAL LETTER U WITH RING ABOVE (LATIN CAPITAL LETTER U RING)
+test(0x0170, 0x0171); // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE), LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE)
+test(0x0171, 0x0170); // LATIN SMALL LETTER U WITH DOUBLE ACUTE (LATIN SMALL LETTER U DOUBLE ACUTE), LATIN CAPITAL LETTER U WITH DOUBLE ACUTE (LATIN CAPITAL LETTER U DOUBLE ACUTE)
+test(0x0172, 0x0173); // LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK), LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK)
+test(0x0173, 0x0172); // LATIN SMALL LETTER U WITH OGONEK (LATIN SMALL LETTER U OGONEK), LATIN CAPITAL LETTER U WITH OGONEK (LATIN CAPITAL LETTER U OGONEK)
+test(0x0174, 0x0175); // LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX), LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX)
+test(0x0175, 0x0174); // LATIN SMALL LETTER W WITH CIRCUMFLEX (LATIN SMALL LETTER W CIRCUMFLEX), LATIN CAPITAL LETTER W WITH CIRCUMFLEX (LATIN CAPITAL LETTER W CIRCUMFLEX)
+test(0x0176, 0x0177); // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX), LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX)
+test(0x0177, 0x0176); // LATIN SMALL LETTER Y WITH CIRCUMFLEX (LATIN SMALL LETTER Y CIRCUMFLEX), LATIN CAPITAL LETTER Y WITH CIRCUMFLEX (LATIN CAPITAL LETTER Y CIRCUMFLEX)
+test(0x0178, 0x00FF); // LATIN CAPITAL LETTER Y WITH DIAERESIS (LATIN CAPITAL LETTER Y DIAERESIS), LATIN SMALL LETTER Y WITH DIAERESIS (LATIN SMALL LETTER Y DIAERESIS)
+test(0x0179, 0x017A); // LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE), LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE)
+test(0x017A, 0x0179); // LATIN SMALL LETTER Z WITH ACUTE (LATIN SMALL LETTER Z ACUTE), LATIN CAPITAL LETTER Z WITH ACUTE (LATIN CAPITAL LETTER Z ACUTE)
+test(0x017B, 0x017C); // LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT), LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT)
+test(0x017C, 0x017B); // LATIN SMALL LETTER Z WITH DOT ABOVE (LATIN SMALL LETTER Z DOT), LATIN CAPITAL LETTER Z WITH DOT ABOVE (LATIN CAPITAL LETTER Z DOT)
+test(0x017D, 0x017E); // LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK), LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK)
+test(0x017E, 0x017D); // LATIN SMALL LETTER Z WITH CARON (LATIN SMALL LETTER Z HACEK), LATIN CAPITAL LETTER Z WITH CARON (LATIN CAPITAL LETTER Z HACEK)
+test(0x017F, 0x0073, 0x0053); // LATIN SMALL LETTER LONG S, LATIN SMALL LETTER S, LATIN CAPITAL LETTER S
+test(0x0180, 0x0243); // LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR), LATIN CAPITAL LETTER B WITH STROKE
+test(0x0181, 0x0253); // LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK), LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK)
+test(0x0182, 0x0183); // LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR), LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR)
+test(0x0183, 0x0182); // LATIN SMALL LETTER B WITH TOPBAR (LATIN SMALL LETTER B TOPBAR), LATIN CAPITAL LETTER B WITH TOPBAR (LATIN CAPITAL LETTER B TOPBAR)
+test(0x0184, 0x0185); // LATIN CAPITAL LETTER TONE SIX, LATIN SMALL LETTER TONE SIX
+test(0x0185, 0x0184); // LATIN SMALL LETTER TONE SIX, LATIN CAPITAL LETTER TONE SIX
+test(0x0186, 0x0254); // LATIN CAPITAL LETTER OPEN O, LATIN SMALL LETTER OPEN O
+test(0x0187, 0x0188); // LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK), LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK)
+test(0x0188, 0x0187); // LATIN SMALL LETTER C WITH HOOK (LATIN SMALL LETTER C HOOK), LATIN CAPITAL LETTER C WITH HOOK (LATIN CAPITAL LETTER C HOOK)
+test(0x0189, 0x0256); // LATIN CAPITAL LETTER AFRICAN D, LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK)
+test(0x018A, 0x0257); // LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK), LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK)
+test(0x018B, 0x018C); // LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR), LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR)
+test(0x018C, 0x018B); // LATIN SMALL LETTER D WITH TOPBAR (LATIN SMALL LETTER D TOPBAR), LATIN CAPITAL LETTER D WITH TOPBAR (LATIN CAPITAL LETTER D TOPBAR)
+test(0x018E, 0x01DD); // LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E), LATIN SMALL LETTER TURNED E
+test(0x018F, 0x0259); // LATIN CAPITAL LETTER SCHWA, LATIN SMALL LETTER SCHWA
+test(0x0190, 0x025B); // LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON), LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON)
+test(0x0191, 0x0192); // LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK), LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F)
+test(0x0192, 0x0191); // LATIN SMALL LETTER F WITH HOOK (LATIN SMALL LETTER SCRIPT F), LATIN CAPITAL LETTER F WITH HOOK (LATIN CAPITAL LETTER F HOOK)
+test(0x0193, 0x0260); // LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK), LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK)
+test(0x0194, 0x0263); // LATIN CAPITAL LETTER GAMMA, LATIN SMALL LETTER GAMMA
+test(0x0195, 0x01F6); // LATIN SMALL LETTER HV (LATIN SMALL LETTER H V), LATIN CAPITAL LETTER HWAIR
+test(0x0196, 0x0269); // LATIN CAPITAL LETTER IOTA, LATIN SMALL LETTER IOTA
+test(0x0197, 0x0268); // LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I), LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I)
+test(0x0198, 0x0199); // LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK), LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK)
+test(0x0199, 0x0198); // LATIN SMALL LETTER K WITH HOOK (LATIN SMALL LETTER K HOOK), LATIN CAPITAL LETTER K WITH HOOK (LATIN CAPITAL LETTER K HOOK)
+test(0x019A, 0x023D); // LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L), LATIN CAPITAL LETTER L WITH BAR
+test(0x019C, 0x026F); // LATIN CAPITAL LETTER TURNED M, LATIN SMALL LETTER TURNED M
+test(0x019D, 0x0272); // LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK), LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK)
+test(0x019E, 0x0220); // LATIN SMALL LETTER N WITH LONG RIGHT LEG, LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+test(0x019F, 0x0275); // LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O), LATIN SMALL LETTER BARRED O
+test(0x01A0, 0x01A1); // LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN), LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN)
+test(0x01A1, 0x01A0); // LATIN SMALL LETTER O WITH HORN (LATIN SMALL LETTER O HORN), LATIN CAPITAL LETTER O WITH HORN (LATIN CAPITAL LETTER O HORN)
+test(0x01A2, 0x01A3); // LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I), LATIN SMALL LETTER OI (LATIN SMALL LETTER O I)
+test(0x01A3, 0x01A2); // LATIN SMALL LETTER OI (LATIN SMALL LETTER O I), LATIN CAPITAL LETTER OI (LATIN CAPITAL LETTER O I)
+test(0x01A4, 0x01A5); // LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK), LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK)
+test(0x01A5, 0x01A4); // LATIN SMALL LETTER P WITH HOOK (LATIN SMALL LETTER P HOOK), LATIN CAPITAL LETTER P WITH HOOK (LATIN CAPITAL LETTER P HOOK)
+test(0x01A6, 0x0280); // LATIN LETTER YR (LATIN LETTER Y R), LATIN LETTER SMALL CAPITAL R
+test(0x01A7, 0x01A8); // LATIN CAPITAL LETTER TONE TWO, LATIN SMALL LETTER TONE TWO
+test(0x01A8, 0x01A7); // LATIN SMALL LETTER TONE TWO, LATIN CAPITAL LETTER TONE TWO
+test(0x01A9, 0x0283); // LATIN CAPITAL LETTER ESH, LATIN SMALL LETTER ESH
+test(0x01AC, 0x01AD); // LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK), LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK)
+test(0x01AD, 0x01AC); // LATIN SMALL LETTER T WITH HOOK (LATIN SMALL LETTER T HOOK), LATIN CAPITAL LETTER T WITH HOOK (LATIN CAPITAL LETTER T HOOK)
+test(0x01AE, 0x0288); // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK), LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK)
+test(0x01AF, 0x01B0); // LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN), LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN)
+test(0x01B0, 0x01AF); // LATIN SMALL LETTER U WITH HORN (LATIN SMALL LETTER U HORN), LATIN CAPITAL LETTER U WITH HORN (LATIN CAPITAL LETTER U HORN)
+test(0x01B1, 0x028A); // LATIN CAPITAL LETTER UPSILON, LATIN SMALL LETTER UPSILON
+test(0x01B2, 0x028B); // LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V), LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V)
+test(0x01B3, 0x01B4); // LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK), LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK)
+test(0x01B4, 0x01B3); // LATIN SMALL LETTER Y WITH HOOK (LATIN SMALL LETTER Y HOOK), LATIN CAPITAL LETTER Y WITH HOOK (LATIN CAPITAL LETTER Y HOOK)
+test(0x01B5, 0x01B6); // LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR), LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR)
+test(0x01B6, 0x01B5); // LATIN SMALL LETTER Z WITH STROKE (LATIN SMALL LETTER Z BAR), LATIN CAPITAL LETTER Z WITH STROKE (LATIN CAPITAL LETTER Z BAR)
+test(0x01B7, 0x0292); // LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH), LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH)
+test(0x01B8, 0x01B9); // LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH), LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH)
+test(0x01B9, 0x01B8); // LATIN SMALL LETTER EZH REVERSED (LATIN SMALL LETTER REVERSED YOGH), LATIN CAPITAL LETTER EZH REVERSED (LATIN CAPITAL LETTER REVERSED YOGH)
+test(0x01BC, 0x01BD); // LATIN CAPITAL LETTER TONE FIVE, LATIN SMALL LETTER TONE FIVE
+test(0x01BD, 0x01BC); // LATIN SMALL LETTER TONE FIVE, LATIN CAPITAL LETTER TONE FIVE
+test(0x01BF, 0x01F7); // LATIN LETTER WYNN, LATIN CAPITAL LETTER WYNN
+test(0x01C4, 0x01C6, 0x01C5); // LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK), LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK)
+test(0x01C5, 0x01C6, 0x01C4); // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK), LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK)
+test(0x01C6, 0x01C4, 0x01C5); // LATIN SMALL LETTER DZ WITH CARON (LATIN SMALL LETTER D Z HACEK), LATIN CAPITAL LETTER DZ WITH CARON (LATIN CAPITAL LETTER D Z HACEK), LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (LATIN LETTER CAPITAL D SMALL Z HACEK)
+test(0x01C7, 0x01C9, 0x01C8); // LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J), LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J)
+test(0x01C8, 0x01C9, 0x01C7); // LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J), LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J)
+test(0x01C9, 0x01C7, 0x01C8); // LATIN SMALL LETTER LJ (LATIN SMALL LETTER L J), LATIN CAPITAL LETTER LJ (LATIN CAPITAL LETTER L J), LATIN CAPITAL LETTER L WITH SMALL LETTER J (LATIN LETTER CAPITAL L SMALL J)
+test(0x01CA, 0x01CC, 0x01CB); // LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J), LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J)
+test(0x01CB, 0x01CC, 0x01CA); // LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J), LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J)
+test(0x01CC, 0x01CA, 0x01CB); // LATIN SMALL LETTER NJ (LATIN SMALL LETTER N J), LATIN CAPITAL LETTER NJ (LATIN CAPITAL LETTER N J), LATIN CAPITAL LETTER N WITH SMALL LETTER J (LATIN LETTER CAPITAL N SMALL J)
+test(0x01CD, 0x01CE); // LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK), LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK)
+test(0x01CE, 0x01CD); // LATIN SMALL LETTER A WITH CARON (LATIN SMALL LETTER A HACEK), LATIN CAPITAL LETTER A WITH CARON (LATIN CAPITAL LETTER A HACEK)
+test(0x01CF, 0x01D0); // LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK), LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK)
+test(0x01D0, 0x01CF); // LATIN SMALL LETTER I WITH CARON (LATIN SMALL LETTER I HACEK), LATIN CAPITAL LETTER I WITH CARON (LATIN CAPITAL LETTER I HACEK)
+test(0x01D1, 0x01D2); // LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK), LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK)
+test(0x01D2, 0x01D1); // LATIN SMALL LETTER O WITH CARON (LATIN SMALL LETTER O HACEK), LATIN CAPITAL LETTER O WITH CARON (LATIN CAPITAL LETTER O HACEK)
+test(0x01D3, 0x01D4); // LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK), LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK)
+test(0x01D4, 0x01D3); // LATIN SMALL LETTER U WITH CARON (LATIN SMALL LETTER U HACEK), LATIN CAPITAL LETTER U WITH CARON (LATIN CAPITAL LETTER U HACEK)
+test(0x01D5, 0x01D6); // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON), LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON)
+test(0x01D6, 0x01D5); // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON (LATIN SMALL LETTER U DIAERESIS MACRON), LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER U DIAERESIS MACRON)
+test(0x01D7, 0x01D8); // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE), LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE)
+test(0x01D8, 0x01D7); // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE (LATIN SMALL LETTER U DIAERESIS ACUTE), LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE (LATIN CAPITAL LETTER U DIAERESIS ACUTE)
+test(0x01D9, 0x01DA); // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK), LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK)
+test(0x01DA, 0x01D9); // LATIN SMALL LETTER U WITH DIAERESIS AND CARON (LATIN SMALL LETTER U DIAERESIS HACEK), LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON (LATIN CAPITAL LETTER U DIAERESIS HACEK)
+test(0x01DB, 0x01DC); // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE), LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE)
+test(0x01DC, 0x01DB); // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE (LATIN SMALL LETTER U DIAERESIS GRAVE), LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE (LATIN CAPITAL LETTER U DIAERESIS GRAVE)
+test(0x01DD, 0x018E); // LATIN SMALL LETTER TURNED E, LATIN CAPITAL LETTER REVERSED E (LATIN CAPITAL LETTER TURNED E)
+test(0x01DE, 0x01DF); // LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON), LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON)
+test(0x01DF, 0x01DE); // LATIN SMALL LETTER A WITH DIAERESIS AND MACRON (LATIN SMALL LETTER A DIAERESIS MACRON), LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON (LATIN CAPITAL LETTER A DIAERESIS MACRON)
+test(0x01E0, 0x01E1); // LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON), LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON)
+test(0x01E1, 0x01E0); // LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON (LATIN SMALL LETTER A DOT MACRON), LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON (LATIN CAPITAL LETTER A DOT MACRON)
+test(0x01E2, 0x01E3); // LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON), LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON)
+test(0x01E3, 0x01E2); // LATIN SMALL LETTER AE WITH MACRON (LATIN SMALL LETTER A E MACRON), LATIN CAPITAL LETTER AE WITH MACRON (LATIN CAPITAL LETTER A E MACRON)
+test(0x01E4, 0x01E5); // LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR), LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR)
+test(0x01E5, 0x01E4); // LATIN SMALL LETTER G WITH STROKE (LATIN SMALL LETTER G BAR), LATIN CAPITAL LETTER G WITH STROKE (LATIN CAPITAL LETTER G BAR)
+test(0x01E6, 0x01E7); // LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK), LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK)
+test(0x01E7, 0x01E6); // LATIN SMALL LETTER G WITH CARON (LATIN SMALL LETTER G HACEK), LATIN CAPITAL LETTER G WITH CARON (LATIN CAPITAL LETTER G HACEK)
+test(0x01E8, 0x01E9); // LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK), LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK)
+test(0x01E9, 0x01E8); // LATIN SMALL LETTER K WITH CARON (LATIN SMALL LETTER K HACEK), LATIN CAPITAL LETTER K WITH CARON (LATIN CAPITAL LETTER K HACEK)
+test(0x01EA, 0x01EB); // LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK), LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK)
+test(0x01EB, 0x01EA); // LATIN SMALL LETTER O WITH OGONEK (LATIN SMALL LETTER O OGONEK), LATIN CAPITAL LETTER O WITH OGONEK (LATIN CAPITAL LETTER O OGONEK)
+test(0x01EC, 0x01ED); // LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON), LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON)
+test(0x01ED, 0x01EC); // LATIN SMALL LETTER O WITH OGONEK AND MACRON (LATIN SMALL LETTER O OGONEK MACRON), LATIN CAPITAL LETTER O WITH OGONEK AND MACRON (LATIN CAPITAL LETTER O OGONEK MACRON)
+test(0x01EE, 0x01EF); // LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK), LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK)
+test(0x01EF, 0x01EE); // LATIN SMALL LETTER EZH WITH CARON (LATIN SMALL LETTER YOGH HACEK), LATIN CAPITAL LETTER EZH WITH CARON (LATIN CAPITAL LETTER YOGH HACEK)
+test(0x01F1, 0x01F3, 0x01F2); // LATIN CAPITAL LETTER DZ, LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+test(0x01F2, 0x01F3, 0x01F1); // LATIN CAPITAL LETTER D WITH SMALL LETTER Z, LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER DZ
+test(0x01F3, 0x01F1, 0x01F2); // LATIN SMALL LETTER DZ, LATIN CAPITAL LETTER DZ, LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+test(0x01F4, 0x01F5); // LATIN CAPITAL LETTER G WITH ACUTE, LATIN SMALL LETTER G WITH ACUTE
+test(0x01F5, 0x01F4); // LATIN SMALL LETTER G WITH ACUTE, LATIN CAPITAL LETTER G WITH ACUTE
+test(0x01F6, 0x0195); // LATIN CAPITAL LETTER HWAIR, LATIN SMALL LETTER HV (LATIN SMALL LETTER H V)
+test(0x01F7, 0x01BF); // LATIN CAPITAL LETTER WYNN, LATIN LETTER WYNN
+test(0x01F8, 0x01F9); // LATIN CAPITAL LETTER N WITH GRAVE, LATIN SMALL LETTER N WITH GRAVE
+test(0x01F9, 0x01F8); // LATIN SMALL LETTER N WITH GRAVE, LATIN CAPITAL LETTER N WITH GRAVE
+test(0x01FA, 0x01FB); // LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE, LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+test(0x01FB, 0x01FA); // LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE, LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+test(0x01FC, 0x01FD); // LATIN CAPITAL LETTER AE WITH ACUTE, LATIN SMALL LETTER AE WITH ACUTE
+test(0x01FD, 0x01FC); // LATIN SMALL LETTER AE WITH ACUTE, LATIN CAPITAL LETTER AE WITH ACUTE
+test(0x01FE, 0x01FF); // LATIN CAPITAL LETTER O WITH STROKE AND ACUTE, LATIN SMALL LETTER O WITH STROKE AND ACUTE
+test(0x01FF, 0x01FE); // LATIN SMALL LETTER O WITH STROKE AND ACUTE, LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+test(0x0200, 0x0201); // LATIN CAPITAL LETTER A WITH DOUBLE GRAVE, LATIN SMALL LETTER A WITH DOUBLE GRAVE
+test(0x0201, 0x0200); // LATIN SMALL LETTER A WITH DOUBLE GRAVE, LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+test(0x0202, 0x0203); // LATIN CAPITAL LETTER A WITH INVERTED BREVE, LATIN SMALL LETTER A WITH INVERTED BREVE
+test(0x0203, 0x0202); // LATIN SMALL LETTER A WITH INVERTED BREVE, LATIN CAPITAL LETTER A WITH INVERTED BREVE
+test(0x0204, 0x0205); // LATIN CAPITAL LETTER E WITH DOUBLE GRAVE, LATIN SMALL LETTER E WITH DOUBLE GRAVE
+test(0x0205, 0x0204); // LATIN SMALL LETTER E WITH DOUBLE GRAVE, LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+test(0x0206, 0x0207); // LATIN CAPITAL LETTER E WITH INVERTED BREVE, LATIN SMALL LETTER E WITH INVERTED BREVE
+test(0x0207, 0x0206); // LATIN SMALL LETTER E WITH INVERTED BREVE, LATIN CAPITAL LETTER E WITH INVERTED BREVE
+test(0x0208, 0x0209); // LATIN CAPITAL LETTER I WITH DOUBLE GRAVE, LATIN SMALL LETTER I WITH DOUBLE GRAVE
+test(0x0209, 0x0208); // LATIN SMALL LETTER I WITH DOUBLE GRAVE, LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+test(0x020A, 0x020B); // LATIN CAPITAL LETTER I WITH INVERTED BREVE, LATIN SMALL LETTER I WITH INVERTED BREVE
+test(0x020B, 0x020A); // LATIN SMALL LETTER I WITH INVERTED BREVE, LATIN CAPITAL LETTER I WITH INVERTED BREVE
+test(0x020C, 0x020D); // LATIN CAPITAL LETTER O WITH DOUBLE GRAVE, LATIN SMALL LETTER O WITH DOUBLE GRAVE
+test(0x020D, 0x020C); // LATIN SMALL LETTER O WITH DOUBLE GRAVE, LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+test(0x020E, 0x020F); // LATIN CAPITAL LETTER O WITH INVERTED BREVE, LATIN SMALL LETTER O WITH INVERTED BREVE
+test(0x020F, 0x020E); // LATIN SMALL LETTER O WITH INVERTED BREVE, LATIN CAPITAL LETTER O WITH INVERTED BREVE
+test(0x0210, 0x0211); // LATIN CAPITAL LETTER R WITH DOUBLE GRAVE, LATIN SMALL LETTER R WITH DOUBLE GRAVE
+test(0x0211, 0x0210); // LATIN SMALL LETTER R WITH DOUBLE GRAVE, LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+test(0x0212, 0x0213); // LATIN CAPITAL LETTER R WITH INVERTED BREVE, LATIN SMALL LETTER R WITH INVERTED BREVE
+test(0x0213, 0x0212); // LATIN SMALL LETTER R WITH INVERTED BREVE, LATIN CAPITAL LETTER R WITH INVERTED BREVE
+test(0x0214, 0x0215); // LATIN CAPITAL LETTER U WITH DOUBLE GRAVE, LATIN SMALL LETTER U WITH DOUBLE GRAVE
+test(0x0215, 0x0214); // LATIN SMALL LETTER U WITH DOUBLE GRAVE, LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+test(0x0216, 0x0217); // LATIN CAPITAL LETTER U WITH INVERTED BREVE, LATIN SMALL LETTER U WITH INVERTED BREVE
+test(0x0217, 0x0216); // LATIN SMALL LETTER U WITH INVERTED BREVE, LATIN CAPITAL LETTER U WITH INVERTED BREVE
+test(0x0218, 0x0219); // LATIN CAPITAL LETTER S WITH COMMA BELOW, LATIN SMALL LETTER S WITH COMMA BELOW
+test(0x0219, 0x0218); // LATIN SMALL LETTER S WITH COMMA BELOW, LATIN CAPITAL LETTER S WITH COMMA BELOW
+test(0x021A, 0x021B); // LATIN CAPITAL LETTER T WITH COMMA BELOW, LATIN SMALL LETTER T WITH COMMA BELOW
+test(0x021B, 0x021A); // LATIN SMALL LETTER T WITH COMMA BELOW, LATIN CAPITAL LETTER T WITH COMMA BELOW
+test(0x021C, 0x021D); // LATIN CAPITAL LETTER YOGH, LATIN SMALL LETTER YOGH
+test(0x021D, 0x021C); // LATIN SMALL LETTER YOGH, LATIN CAPITAL LETTER YOGH
+test(0x021E, 0x021F); // LATIN CAPITAL LETTER H WITH CARON, LATIN SMALL LETTER H WITH CARON
+test(0x021F, 0x021E); // LATIN SMALL LETTER H WITH CARON, LATIN CAPITAL LETTER H WITH CARON
+test(0x0220, 0x019E); // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG, LATIN SMALL LETTER N WITH LONG RIGHT LEG
+test(0x0222, 0x0223); // LATIN CAPITAL LETTER OU, LATIN SMALL LETTER OU
+test(0x0223, 0x0222); // LATIN SMALL LETTER OU, LATIN CAPITAL LETTER OU
+test(0x0224, 0x0225); // LATIN CAPITAL LETTER Z WITH HOOK, LATIN SMALL LETTER Z WITH HOOK
+test(0x0225, 0x0224); // LATIN SMALL LETTER Z WITH HOOK, LATIN CAPITAL LETTER Z WITH HOOK
+test(0x0226, 0x0227); // LATIN CAPITAL LETTER A WITH DOT ABOVE, LATIN SMALL LETTER A WITH DOT ABOVE
+test(0x0227, 0x0226); // LATIN SMALL LETTER A WITH DOT ABOVE, LATIN CAPITAL LETTER A WITH DOT ABOVE
+test(0x0228, 0x0229); // LATIN CAPITAL LETTER E WITH CEDILLA, LATIN SMALL LETTER E WITH CEDILLA
+test(0x0229, 0x0228); // LATIN SMALL LETTER E WITH CEDILLA, LATIN CAPITAL LETTER E WITH CEDILLA
+test(0x022A, 0x022B); // LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON, LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+test(0x022B, 0x022A); // LATIN SMALL LETTER O WITH DIAERESIS AND MACRON, LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+test(0x022C, 0x022D); // LATIN CAPITAL LETTER O WITH TILDE AND MACRON, LATIN SMALL LETTER O WITH TILDE AND MACRON
+test(0x022D, 0x022C); // LATIN SMALL LETTER O WITH TILDE AND MACRON, LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+test(0x022E, 0x022F); // LATIN CAPITAL LETTER O WITH DOT ABOVE, LATIN SMALL LETTER O WITH DOT ABOVE
+test(0x022F, 0x022E); // LATIN SMALL LETTER O WITH DOT ABOVE, LATIN CAPITAL LETTER O WITH DOT ABOVE
+test(0x0230, 0x0231); // LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON, LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+test(0x0231, 0x0230); // LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON, LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+test(0x0232, 0x0233); // LATIN CAPITAL LETTER Y WITH MACRON, LATIN SMALL LETTER Y WITH MACRON
+test(0x0233, 0x0232); // LATIN SMALL LETTER Y WITH MACRON, LATIN CAPITAL LETTER Y WITH MACRON
+test(0x023A, 0x2C65); // LATIN CAPITAL LETTER A WITH STROKE, LATIN SMALL LETTER A WITH STROKE
+test(0x023B, 0x023C); // LATIN CAPITAL LETTER C WITH STROKE, LATIN SMALL LETTER C WITH STROKE
+test(0x023C, 0x023B); // LATIN SMALL LETTER C WITH STROKE, LATIN CAPITAL LETTER C WITH STROKE
+test(0x023D, 0x019A); // LATIN CAPITAL LETTER L WITH BAR, LATIN SMALL LETTER L WITH BAR (LATIN SMALL LETTER BARRED L)
+test(0x023E, 0x2C66); // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE, LATIN SMALL LETTER T WITH DIAGONAL STROKE
+test(0x023F, 0x2C7E); // LATIN SMALL LETTER S WITH SWASH TAIL, LATIN CAPITAL LETTER S WITH SWASH TAIL
+test(0x0240, 0x2C7F); // LATIN SMALL LETTER Z WITH SWASH TAIL, LATIN CAPITAL LETTER Z WITH SWASH TAIL
+test(0x0241, 0x0242); // LATIN CAPITAL LETTER GLOTTAL STOP, LATIN SMALL LETTER GLOTTAL STOP
+test(0x0242, 0x0241); // LATIN SMALL LETTER GLOTTAL STOP, LATIN CAPITAL LETTER GLOTTAL STOP
+test(0x0243, 0x0180); // LATIN CAPITAL LETTER B WITH STROKE, LATIN SMALL LETTER B WITH STROKE (LATIN SMALL LETTER B BAR)
+test(0x0244, 0x0289); // LATIN CAPITAL LETTER U BAR, LATIN SMALL LETTER U BAR
+test(0x0245, 0x028C); // LATIN CAPITAL LETTER TURNED V, LATIN SMALL LETTER TURNED V
+test(0x0246, 0x0247); // LATIN CAPITAL LETTER E WITH STROKE, LATIN SMALL LETTER E WITH STROKE
+test(0x0247, 0x0246); // LATIN SMALL LETTER E WITH STROKE, LATIN CAPITAL LETTER E WITH STROKE
+test(0x0248, 0x0249); // LATIN CAPITAL LETTER J WITH STROKE, LATIN SMALL LETTER J WITH STROKE
+test(0x0249, 0x0248); // LATIN SMALL LETTER J WITH STROKE, LATIN CAPITAL LETTER J WITH STROKE
+test(0x024A, 0x024B); // LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL, LATIN SMALL LETTER Q WITH HOOK TAIL
+test(0x024B, 0x024A); // LATIN SMALL LETTER Q WITH HOOK TAIL, LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+test(0x024C, 0x024D); // LATIN CAPITAL LETTER R WITH STROKE, LATIN SMALL LETTER R WITH STROKE
+test(0x024D, 0x024C); // LATIN SMALL LETTER R WITH STROKE, LATIN CAPITAL LETTER R WITH STROKE
+test(0x024E, 0x024F); // LATIN CAPITAL LETTER Y WITH STROKE, LATIN SMALL LETTER Y WITH STROKE
+test(0x024F, 0x024E); // LATIN SMALL LETTER Y WITH STROKE, LATIN CAPITAL LETTER Y WITH STROKE
+test(0x0250, 0x2C6F); // LATIN SMALL LETTER TURNED A, LATIN CAPITAL LETTER TURNED A
+test(0x0251, 0x2C6D); // LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A), LATIN CAPITAL LETTER ALPHA
+test(0x0252, 0x2C70); // LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A), LATIN CAPITAL LETTER TURNED ALPHA
+test(0x0253, 0x0181); // LATIN SMALL LETTER B WITH HOOK (LATIN SMALL LETTER B HOOK), LATIN CAPITAL LETTER B WITH HOOK (LATIN CAPITAL LETTER B HOOK)
+test(0x0254, 0x0186); // LATIN SMALL LETTER OPEN O, LATIN CAPITAL LETTER OPEN O
+test(0x0256, 0x0189); // LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK), LATIN CAPITAL LETTER AFRICAN D
+test(0x0257, 0x018A); // LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK), LATIN CAPITAL LETTER D WITH HOOK (LATIN CAPITAL LETTER D HOOK)
+test(0x0259, 0x018F); // LATIN SMALL LETTER SCHWA, LATIN CAPITAL LETTER SCHWA
+test(0x025B, 0x0190); // LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON), LATIN CAPITAL LETTER OPEN E (LATIN CAPITAL LETTER EPSILON)
+test(0x025C, 0xA7AB); // LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON), LATIN CAPITAL LETTER REVERSED OPEN E
+test(0x0260, 0x0193); // LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK), LATIN CAPITAL LETTER G WITH HOOK (LATIN CAPITAL LETTER G HOOK)
+test(0x0261, 0xA7AC); // LATIN SMALL LETTER SCRIPT G, LATIN CAPITAL LETTER SCRIPT G
+test(0x0263, 0x0194); // LATIN SMALL LETTER GAMMA, LATIN CAPITAL LETTER GAMMA
+test(0x0265, 0xA78D); // LATIN SMALL LETTER TURNED H, LATIN CAPITAL LETTER TURNED H
+test(0x0266, 0xA7AA); // LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK), LATIN CAPITAL LETTER H WITH HOOK
+test(0x0268, 0x0197); // LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I), LATIN CAPITAL LETTER I WITH STROKE (LATIN CAPITAL LETTER BARRED I)
+test(0x0269, 0x0196); // LATIN SMALL LETTER IOTA, LATIN CAPITAL LETTER IOTA
+test(0x026A, 0xA7AE); // LATIN LETTER SMALL CAPITAL I, LATIN CAPITAL LETTER SMALL CAPITAL I
+test(0x026B, 0x2C62); // LATIN SMALL LETTER L WITH MIDDLE TILDE, LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+test(0x026C, 0xA7AD); // LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT), LATIN CAPITAL LETTER L WITH BELT
+test(0x026F, 0x019C); // LATIN SMALL LETTER TURNED M, LATIN CAPITAL LETTER TURNED M
+test(0x0271, 0x2C6E); // LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK), LATIN CAPITAL LETTER M WITH HOOK
+test(0x0272, 0x019D); // LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK), LATIN CAPITAL LETTER N WITH LEFT HOOK (LATIN CAPITAL LETTER N HOOK)
+test(0x0275, 0x019F); // LATIN SMALL LETTER BARRED O, LATIN CAPITAL LETTER O WITH MIDDLE TILDE (LATIN CAPITAL LETTER BARRED O)
+test(0x027D, 0x2C64); // LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK), LATIN CAPITAL LETTER R WITH TAIL
+test(0x0280, 0x01A6); // LATIN LETTER SMALL CAPITAL R, LATIN LETTER YR (LATIN LETTER Y R)
+test(0x0283, 0x01A9); // LATIN SMALL LETTER ESH, LATIN CAPITAL LETTER ESH
+test(0x0287, 0xA7B1); // LATIN SMALL LETTER TURNED T, LATIN CAPITAL LETTER TURNED T
+test(0x0288, 0x01AE); // LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK), LATIN CAPITAL LETTER T WITH RETROFLEX HOOK (LATIN CAPITAL LETTER T RETROFLEX HOOK)
+test(0x0289, 0x0244); // LATIN SMALL LETTER U BAR, LATIN CAPITAL LETTER U BAR
+test(0x028A, 0x01B1); // LATIN SMALL LETTER UPSILON, LATIN CAPITAL LETTER UPSILON
+test(0x028B, 0x01B2); // LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V), LATIN CAPITAL LETTER V WITH HOOK (LATIN CAPITAL LETTER SCRIPT V)
+test(0x028C, 0x0245); // LATIN SMALL LETTER TURNED V, LATIN CAPITAL LETTER TURNED V
+test(0x0292, 0x01B7); // LATIN SMALL LETTER EZH (LATIN SMALL LETTER YOGH), LATIN CAPITAL LETTER EZH (LATIN CAPITAL LETTER YOGH)
+test(0x029D, 0xA7B2); // LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J), LATIN CAPITAL LETTER J WITH CROSSED-TAIL
+test(0x029E, 0xA7B0); // LATIN SMALL LETTER TURNED K, LATIN CAPITAL LETTER TURNED K
+test(0x0345, 0x03B9, 0x0399, 0x1FBE); // COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK SMALL LETTER IOTA, GREEK CAPITAL LETTER IOTA, GREEK PROSGEGRAMMENI
+test(0x0370, 0x0371); // GREEK CAPITAL LETTER HETA, GREEK SMALL LETTER HETA
+test(0x0371, 0x0370); // GREEK SMALL LETTER HETA, GREEK CAPITAL LETTER HETA
+test(0x0372, 0x0373); // GREEK CAPITAL LETTER ARCHAIC SAMPI, GREEK SMALL LETTER ARCHAIC SAMPI
+test(0x0373, 0x0372); // GREEK SMALL LETTER ARCHAIC SAMPI, GREEK CAPITAL LETTER ARCHAIC SAMPI
+test(0x0376, 0x0377); // GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA, GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+test(0x0377, 0x0376); // GREEK SMALL LETTER PAMPHYLIAN DIGAMMA, GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+test(0x037B, 0x03FD); // GREEK SMALL REVERSED LUNATE SIGMA SYMBOL, GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+test(0x037C, 0x03FE); // GREEK SMALL DOTTED LUNATE SIGMA SYMBOL, GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+test(0x037D, 0x03FF); // GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL, GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+test(0x037F, 0x03F3); // GREEK CAPITAL LETTER YOT, GREEK LETTER YOT
+test(0x0386, 0x03AC); // GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS), GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS)
+test(0x0388, 0x03AD); // GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS), GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS)
+test(0x0389, 0x03AE); // GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS), GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS)
+test(0x038A, 0x03AF); // GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS), GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS)
+test(0x038C, 0x03CC); // GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS), GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS)
+test(0x038E, 0x03CD); // GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS), GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS)
+test(0x038F, 0x03CE); // GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS), GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS)
+test(0x0391, 0x03B1); // GREEK CAPITAL LETTER ALPHA, GREEK SMALL LETTER ALPHA
+test(0x0392, 0x03B2, 0x03D0); // GREEK CAPITAL LETTER BETA, GREEK SMALL LETTER BETA, GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA)
+test(0x0393, 0x03B3); // GREEK CAPITAL LETTER GAMMA, GREEK SMALL LETTER GAMMA
+test(0x0394, 0x03B4); // GREEK CAPITAL LETTER DELTA, GREEK SMALL LETTER DELTA
+test(0x0395, 0x03B5, 0x03F5); // GREEK CAPITAL LETTER EPSILON, GREEK SMALL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL
+test(0x0396, 0x03B6); // GREEK CAPITAL LETTER ZETA, GREEK SMALL LETTER ZETA
+test(0x0397, 0x03B7); // GREEK CAPITAL LETTER ETA, GREEK SMALL LETTER ETA
+test(0x0398, 0x03B8, 0x03D1, 0x03F4); // GREEK CAPITAL LETTER THETA, GREEK SMALL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK CAPITAL THETA SYMBOL
+test(0x0399, 0x03B9, 0x0345, 0x1FBE); // GREEK CAPITAL LETTER IOTA, GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK PROSGEGRAMMENI
+test(0x039A, 0x03BA, 0x03F0); // GREEK CAPITAL LETTER KAPPA, GREEK SMALL LETTER KAPPA, GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA)
+test(0x039B, 0x03BB); // GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA), GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA)
+test(0x039C, 0x03BC, 0x00B5); // GREEK CAPITAL LETTER MU, GREEK SMALL LETTER MU, MICRO SIGN
+test(0x039D, 0x03BD); // GREEK CAPITAL LETTER NU, GREEK SMALL LETTER NU
+test(0x039E, 0x03BE); // GREEK CAPITAL LETTER XI, GREEK SMALL LETTER XI
+test(0x039F, 0x03BF); // GREEK CAPITAL LETTER OMICRON, GREEK SMALL LETTER OMICRON
+test(0x03A0, 0x03C0, 0x03D6); // GREEK CAPITAL LETTER PI, GREEK SMALL LETTER PI, GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI)
+test(0x03A1, 0x03C1, 0x03F1); // GREEK CAPITAL LETTER RHO, GREEK SMALL LETTER RHO, GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO)
+test(0x03A3, 0x03C3, 0x03C2); // GREEK CAPITAL LETTER SIGMA, GREEK SMALL LETTER SIGMA, GREEK SMALL LETTER FINAL SIGMA
+test(0x03A4, 0x03C4); // GREEK CAPITAL LETTER TAU, GREEK SMALL LETTER TAU
+test(0x03A5, 0x03C5); // GREEK CAPITAL LETTER UPSILON, GREEK SMALL LETTER UPSILON
+test(0x03A6, 0x03C6, 0x03D5); // GREEK CAPITAL LETTER PHI, GREEK SMALL LETTER PHI, GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI)
+test(0x03A7, 0x03C7); // GREEK CAPITAL LETTER CHI, GREEK SMALL LETTER CHI
+test(0x03A8, 0x03C8); // GREEK CAPITAL LETTER PSI, GREEK SMALL LETTER PSI
+test(0x03A9, 0x03C9, 0x2126); // GREEK CAPITAL LETTER OMEGA, GREEK SMALL LETTER OMEGA, OHM SIGN (OHM)
+test(0x03AA, 0x03CA); // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS), GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS)
+test(0x03AB, 0x03CB); // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS), GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS)
+test(0x03AC, 0x0386); // GREEK SMALL LETTER ALPHA WITH TONOS (GREEK SMALL LETTER ALPHA TONOS), GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS)
+test(0x03AD, 0x0388); // GREEK SMALL LETTER EPSILON WITH TONOS (GREEK SMALL LETTER EPSILON TONOS), GREEK CAPITAL LETTER EPSILON WITH TONOS (GREEK CAPITAL LETTER EPSILON TONOS)
+test(0x03AE, 0x0389); // GREEK SMALL LETTER ETA WITH TONOS (GREEK SMALL LETTER ETA TONOS), GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS)
+test(0x03AF, 0x038A); // GREEK SMALL LETTER IOTA WITH TONOS (GREEK SMALL LETTER IOTA TONOS), GREEK CAPITAL LETTER IOTA WITH TONOS (GREEK CAPITAL LETTER IOTA TONOS)
+test(0x03B1, 0x0391); // GREEK SMALL LETTER ALPHA, GREEK CAPITAL LETTER ALPHA
+test(0x03B2, 0x0392, 0x03D0); // GREEK SMALL LETTER BETA, GREEK CAPITAL LETTER BETA, GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA)
+test(0x03B3, 0x0393); // GREEK SMALL LETTER GAMMA, GREEK CAPITAL LETTER GAMMA
+test(0x03B4, 0x0394); // GREEK SMALL LETTER DELTA, GREEK CAPITAL LETTER DELTA
+test(0x03B5, 0x0395, 0x03F5); // GREEK SMALL LETTER EPSILON, GREEK CAPITAL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL
+test(0x03B6, 0x0396); // GREEK SMALL LETTER ZETA, GREEK CAPITAL LETTER ZETA
+test(0x03B7, 0x0397); // GREEK SMALL LETTER ETA, GREEK CAPITAL LETTER ETA
+test(0x03B8, 0x0398, 0x03D1, 0x03F4); // GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK CAPITAL THETA SYMBOL
+test(0x03B9, 0x0345, 0x0399, 0x1FBE); // GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK CAPITAL LETTER IOTA, GREEK PROSGEGRAMMENI
+test(0x03BA, 0x039A, 0x03F0); // GREEK SMALL LETTER KAPPA, GREEK CAPITAL LETTER KAPPA, GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA)
+test(0x03BB, 0x039B); // GREEK SMALL LETTER LAMDA (GREEK SMALL LETTER LAMBDA), GREEK CAPITAL LETTER LAMDA (GREEK CAPITAL LETTER LAMBDA)
+test(0x03BC, 0x00B5, 0x039C); // GREEK SMALL LETTER MU, MICRO SIGN, GREEK CAPITAL LETTER MU
+test(0x03BD, 0x039D); // GREEK SMALL LETTER NU, GREEK CAPITAL LETTER NU
+test(0x03BE, 0x039E); // GREEK SMALL LETTER XI, GREEK CAPITAL LETTER XI
+test(0x03BF, 0x039F); // GREEK SMALL LETTER OMICRON, GREEK CAPITAL LETTER OMICRON
+test(0x03C0, 0x03A0, 0x03D6); // GREEK SMALL LETTER PI, GREEK CAPITAL LETTER PI, GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI)
+test(0x03C1, 0x03A1, 0x03F1); // GREEK SMALL LETTER RHO, GREEK CAPITAL LETTER RHO, GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO)
+test(0x03C2, 0x03C3, 0x03A3); // GREEK SMALL LETTER FINAL SIGMA, GREEK SMALL LETTER SIGMA, GREEK CAPITAL LETTER SIGMA
+test(0x03C3, 0x03A3, 0x03C2); // GREEK SMALL LETTER SIGMA, GREEK CAPITAL LETTER SIGMA, GREEK SMALL LETTER FINAL SIGMA
+test(0x03C4, 0x03A4); // GREEK SMALL LETTER TAU, GREEK CAPITAL LETTER TAU
+test(0x03C5, 0x03A5); // GREEK SMALL LETTER UPSILON, GREEK CAPITAL LETTER UPSILON
+test(0x03C6, 0x03A6, 0x03D5); // GREEK SMALL LETTER PHI, GREEK CAPITAL LETTER PHI, GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI)
+test(0x03C7, 0x03A7); // GREEK SMALL LETTER CHI, GREEK CAPITAL LETTER CHI
+test(0x03C8, 0x03A8); // GREEK SMALL LETTER PSI, GREEK CAPITAL LETTER PSI
+test(0x03C9, 0x03A9, 0x2126); // GREEK SMALL LETTER OMEGA, GREEK CAPITAL LETTER OMEGA, OHM SIGN (OHM)
+test(0x03CA, 0x03AA); // GREEK SMALL LETTER IOTA WITH DIALYTIKA (GREEK SMALL LETTER IOTA DIAERESIS), GREEK CAPITAL LETTER IOTA WITH DIALYTIKA (GREEK CAPITAL LETTER IOTA DIAERESIS)
+test(0x03CB, 0x03AB); // GREEK SMALL LETTER UPSILON WITH DIALYTIKA (GREEK SMALL LETTER UPSILON DIAERESIS), GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA (GREEK CAPITAL LETTER UPSILON DIAERESIS)
+test(0x03CC, 0x038C); // GREEK SMALL LETTER OMICRON WITH TONOS (GREEK SMALL LETTER OMICRON TONOS), GREEK CAPITAL LETTER OMICRON WITH TONOS (GREEK CAPITAL LETTER OMICRON TONOS)
+test(0x03CD, 0x038E); // GREEK SMALL LETTER UPSILON WITH TONOS (GREEK SMALL LETTER UPSILON TONOS), GREEK CAPITAL LETTER UPSILON WITH TONOS (GREEK CAPITAL LETTER UPSILON TONOS)
+test(0x03CE, 0x038F); // GREEK SMALL LETTER OMEGA WITH TONOS (GREEK SMALL LETTER OMEGA TONOS), GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS)
+test(0x03CF, 0x03D7); // GREEK CAPITAL KAI SYMBOL, GREEK KAI SYMBOL
+test(0x03D0, 0x03B2, 0x0392); // GREEK BETA SYMBOL (GREEK SMALL LETTER CURLED BETA), GREEK SMALL LETTER BETA, GREEK CAPITAL LETTER BETA
+test(0x03D1, 0x03B8, 0x0398, 0x03F4); // GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA), GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK CAPITAL THETA SYMBOL
+test(0x03D5, 0x03C6, 0x03A6); // GREEK PHI SYMBOL (GREEK SMALL LETTER SCRIPT PHI), GREEK SMALL LETTER PHI, GREEK CAPITAL LETTER PHI
+test(0x03D6, 0x03C0, 0x03A0); // GREEK PI SYMBOL (GREEK SMALL LETTER OMEGA PI), GREEK SMALL LETTER PI, GREEK CAPITAL LETTER PI
+test(0x03D7, 0x03CF); // GREEK KAI SYMBOL, GREEK CAPITAL KAI SYMBOL
+test(0x03D8, 0x03D9); // GREEK LETTER ARCHAIC KOPPA, GREEK SMALL LETTER ARCHAIC KOPPA
+test(0x03D9, 0x03D8); // GREEK SMALL LETTER ARCHAIC KOPPA, GREEK LETTER ARCHAIC KOPPA
+test(0x03DA, 0x03DB); // GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA), GREEK SMALL LETTER STIGMA
+test(0x03DB, 0x03DA); // GREEK SMALL LETTER STIGMA, GREEK LETTER STIGMA (GREEK CAPITAL LETTER STIGMA)
+test(0x03DC, 0x03DD); // GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA), GREEK SMALL LETTER DIGAMMA
+test(0x03DD, 0x03DC); // GREEK SMALL LETTER DIGAMMA, GREEK LETTER DIGAMMA (GREEK CAPITAL LETTER DIGAMMA)
+test(0x03DE, 0x03DF); // GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA), GREEK SMALL LETTER KOPPA
+test(0x03DF, 0x03DE); // GREEK SMALL LETTER KOPPA, GREEK LETTER KOPPA (GREEK CAPITAL LETTER KOPPA)
+test(0x03E0, 0x03E1); // GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI), GREEK SMALL LETTER SAMPI
+test(0x03E1, 0x03E0); // GREEK SMALL LETTER SAMPI, GREEK LETTER SAMPI (GREEK CAPITAL LETTER SAMPI)
+test(0x03E2, 0x03E3); // COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI), COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI)
+test(0x03E3, 0x03E2); // COPTIC SMALL LETTER SHEI (GREEK SMALL LETTER SHEI), COPTIC CAPITAL LETTER SHEI (GREEK CAPITAL LETTER SHEI)
+test(0x03E4, 0x03E5); // COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI), COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI)
+test(0x03E5, 0x03E4); // COPTIC SMALL LETTER FEI (GREEK SMALL LETTER FEI), COPTIC CAPITAL LETTER FEI (GREEK CAPITAL LETTER FEI)
+test(0x03E6, 0x03E7); // COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI), COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI)
+test(0x03E7, 0x03E6); // COPTIC SMALL LETTER KHEI (GREEK SMALL LETTER KHEI), COPTIC CAPITAL LETTER KHEI (GREEK CAPITAL LETTER KHEI)
+test(0x03E8, 0x03E9); // COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI), COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI)
+test(0x03E9, 0x03E8); // COPTIC SMALL LETTER HORI (GREEK SMALL LETTER HORI), COPTIC CAPITAL LETTER HORI (GREEK CAPITAL LETTER HORI)
+test(0x03EA, 0x03EB); // COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA), COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA)
+test(0x03EB, 0x03EA); // COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA), COPTIC CAPITAL LETTER GANGIA (GREEK CAPITAL LETTER GANGIA)
+test(0x03EC, 0x03ED); // COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA), COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA)
+test(0x03ED, 0x03EC); // COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA), COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA)
+test(0x03EE, 0x03EF); // COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI), COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI)
+test(0x03EF, 0x03EE); // COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI), COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI)
+test(0x03F0, 0x03BA, 0x039A); // GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA), GREEK SMALL LETTER KAPPA, GREEK CAPITAL LETTER KAPPA
+test(0x03F1, 0x03C1, 0x03A1); // GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO), GREEK SMALL LETTER RHO, GREEK CAPITAL LETTER RHO
+test(0x03F2, 0x03F9); // GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA), GREEK CAPITAL LUNATE SIGMA SYMBOL
+test(0x03F3, 0x037F); // GREEK LETTER YOT, GREEK CAPITAL LETTER YOT
+test(0x03F4, 0x03B8, 0x0398, 0x03D1); // GREEK CAPITAL THETA SYMBOL, GREEK SMALL LETTER THETA, GREEK CAPITAL LETTER THETA, GREEK THETA SYMBOL (GREEK SMALL LETTER SCRIPT THETA)
+test(0x03F5, 0x03B5, 0x0395); // GREEK LUNATE EPSILON SYMBOL, GREEK SMALL LETTER EPSILON, GREEK CAPITAL LETTER EPSILON
+test(0x03F7, 0x03F8); // GREEK CAPITAL LETTER SHO, GREEK SMALL LETTER SHO
+test(0x03F8, 0x03F7); // GREEK SMALL LETTER SHO, GREEK CAPITAL LETTER SHO
+test(0x03F9, 0x03F2); // GREEK CAPITAL LUNATE SIGMA SYMBOL, GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA)
+test(0x03FA, 0x03FB); // GREEK CAPITAL LETTER SAN, GREEK SMALL LETTER SAN
+test(0x03FB, 0x03FA); // GREEK SMALL LETTER SAN, GREEK CAPITAL LETTER SAN
+test(0x03FD, 0x037B); // GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL, GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+test(0x03FE, 0x037C); // GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL, GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+test(0x03FF, 0x037D); // GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL, GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+test(0x0400, 0x0450); // CYRILLIC CAPITAL LETTER IE WITH GRAVE, CYRILLIC SMALL LETTER IE WITH GRAVE
+test(0x0401, 0x0451); // CYRILLIC CAPITAL LETTER IO, CYRILLIC SMALL LETTER IO
+test(0x0402, 0x0452); // CYRILLIC CAPITAL LETTER DJE, CYRILLIC SMALL LETTER DJE
+test(0x0403, 0x0453); // CYRILLIC CAPITAL LETTER GJE, CYRILLIC SMALL LETTER GJE
+test(0x0404, 0x0454); // CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E), CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E)
+test(0x0405, 0x0455); // CYRILLIC CAPITAL LETTER DZE, CYRILLIC SMALL LETTER DZE
+test(0x0406, 0x0456); // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I), CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I)
+test(0x0407, 0x0457); // CYRILLIC CAPITAL LETTER YI, CYRILLIC SMALL LETTER YI
+test(0x0408, 0x0458); // CYRILLIC CAPITAL LETTER JE, CYRILLIC SMALL LETTER JE
+test(0x0409, 0x0459); // CYRILLIC CAPITAL LETTER LJE, CYRILLIC SMALL LETTER LJE
+test(0x040A, 0x045A); // CYRILLIC CAPITAL LETTER NJE, CYRILLIC SMALL LETTER NJE
+test(0x040B, 0x045B); // CYRILLIC CAPITAL LETTER TSHE, CYRILLIC SMALL LETTER TSHE
+test(0x040C, 0x045C); // CYRILLIC CAPITAL LETTER KJE, CYRILLIC SMALL LETTER KJE
+test(0x040D, 0x045D); // CYRILLIC CAPITAL LETTER I WITH GRAVE, CYRILLIC SMALL LETTER I WITH GRAVE
+test(0x040E, 0x045E); // CYRILLIC CAPITAL LETTER SHORT U, CYRILLIC SMALL LETTER SHORT U
+test(0x040F, 0x045F); // CYRILLIC CAPITAL LETTER DZHE, CYRILLIC SMALL LETTER DZHE
+test(0x0410, 0x0430); // CYRILLIC CAPITAL LETTER A, CYRILLIC SMALL LETTER A
+test(0x0411, 0x0431); // CYRILLIC CAPITAL LETTER BE, CYRILLIC SMALL LETTER BE
+test(0x0412, 0x0432, 0x1C80); // CYRILLIC CAPITAL LETTER VE, CYRILLIC SMALL LETTER VE, CYRILLIC SMALL LETTER ROUNDED VE
+test(0x0413, 0x0433); // CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE), CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE)
+test(0x0414, 0x0434, 0x1C81); // CYRILLIC CAPITAL LETTER DE, CYRILLIC SMALL LETTER DE, CYRILLIC SMALL LETTER LONG-LEGGED DE
+test(0x0415, 0x0435); // CYRILLIC CAPITAL LETTER IE, CYRILLIC SMALL LETTER IE
+test(0x0416, 0x0436); // CYRILLIC CAPITAL LETTER ZHE, CYRILLIC SMALL LETTER ZHE
+test(0x0417, 0x0437); // CYRILLIC CAPITAL LETTER ZE, CYRILLIC SMALL LETTER ZE
+test(0x0418, 0x0438); // CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II), CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II)
+test(0x0419, 0x0439); // CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II), CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II)
+test(0x041A, 0x043A); // CYRILLIC CAPITAL LETTER KA, CYRILLIC SMALL LETTER KA
+test(0x041B, 0x043B); // CYRILLIC CAPITAL LETTER EL, CYRILLIC SMALL LETTER EL
+test(0x041C, 0x043C); // CYRILLIC CAPITAL LETTER EM, CYRILLIC SMALL LETTER EM
+test(0x041D, 0x043D); // CYRILLIC CAPITAL LETTER EN, CYRILLIC SMALL LETTER EN
+test(0x041E, 0x043E, 0x1C82); // CYRILLIC CAPITAL LETTER O, CYRILLIC SMALL LETTER O, CYRILLIC SMALL LETTER NARROW O
+test(0x041F, 0x043F); // CYRILLIC CAPITAL LETTER PE, CYRILLIC SMALL LETTER PE
+test(0x0420, 0x0440); // CYRILLIC CAPITAL LETTER ER, CYRILLIC SMALL LETTER ER
+test(0x0421, 0x0441, 0x1C83); // CYRILLIC CAPITAL LETTER ES, CYRILLIC SMALL LETTER ES, CYRILLIC SMALL LETTER WIDE ES
+test(0x0422, 0x0442, 0x1C84, 0x1C85); // CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TE, CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER THREE-LEGGED TE
+test(0x0423, 0x0443); // CYRILLIC CAPITAL LETTER U, CYRILLIC SMALL LETTER U
+test(0x0424, 0x0444); // CYRILLIC CAPITAL LETTER EF, CYRILLIC SMALL LETTER EF
+test(0x0425, 0x0445); // CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA), CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA)
+test(0x0426, 0x0446); // CYRILLIC CAPITAL LETTER TSE, CYRILLIC SMALL LETTER TSE
+test(0x0427, 0x0447); // CYRILLIC CAPITAL LETTER CHE, CYRILLIC SMALL LETTER CHE
+test(0x0428, 0x0448); // CYRILLIC CAPITAL LETTER SHA, CYRILLIC SMALL LETTER SHA
+test(0x0429, 0x0449); // CYRILLIC CAPITAL LETTER SHCHA, CYRILLIC SMALL LETTER SHCHA
+test(0x042A, 0x044A, 0x1C86); // CYRILLIC CAPITAL LETTER HARD SIGN, CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC SMALL LETTER TALL HARD SIGN
+test(0x042B, 0x044B); // CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI), CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI)
+test(0x042C, 0x044C); // CYRILLIC CAPITAL LETTER SOFT SIGN, CYRILLIC SMALL LETTER SOFT SIGN
+test(0x042D, 0x044D); // CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E), CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E)
+test(0x042E, 0x044E); // CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU), CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU)
+test(0x042F, 0x044F); // CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA), CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA)
+test(0x0430, 0x0410); // CYRILLIC SMALL LETTER A, CYRILLIC CAPITAL LETTER A
+test(0x0431, 0x0411); // CYRILLIC SMALL LETTER BE, CYRILLIC CAPITAL LETTER BE
+test(0x0432, 0x0412, 0x1C80); // CYRILLIC SMALL LETTER VE, CYRILLIC CAPITAL LETTER VE, CYRILLIC SMALL LETTER ROUNDED VE
+test(0x0433, 0x0413); // CYRILLIC SMALL LETTER GHE (CYRILLIC SMALL LETTER GE), CYRILLIC CAPITAL LETTER GHE (CYRILLIC CAPITAL LETTER GE)
+test(0x0434, 0x0414, 0x1C81); // CYRILLIC SMALL LETTER DE, CYRILLIC CAPITAL LETTER DE, CYRILLIC SMALL LETTER LONG-LEGGED DE
+test(0x0435, 0x0415); // CYRILLIC SMALL LETTER IE, CYRILLIC CAPITAL LETTER IE
+test(0x0436, 0x0416); // CYRILLIC SMALL LETTER ZHE, CYRILLIC CAPITAL LETTER ZHE
+test(0x0437, 0x0417); // CYRILLIC SMALL LETTER ZE, CYRILLIC CAPITAL LETTER ZE
+test(0x0438, 0x0418); // CYRILLIC SMALL LETTER I (CYRILLIC SMALL LETTER II), CYRILLIC CAPITAL LETTER I (CYRILLIC CAPITAL LETTER II)
+test(0x0439, 0x0419); // CYRILLIC SMALL LETTER SHORT I (CYRILLIC SMALL LETTER SHORT II), CYRILLIC CAPITAL LETTER SHORT I (CYRILLIC CAPITAL LETTER SHORT II)
+test(0x043A, 0x041A); // CYRILLIC SMALL LETTER KA, CYRILLIC CAPITAL LETTER KA
+test(0x043B, 0x041B); // CYRILLIC SMALL LETTER EL, CYRILLIC CAPITAL LETTER EL
+test(0x043C, 0x041C); // CYRILLIC SMALL LETTER EM, CYRILLIC CAPITAL LETTER EM
+test(0x043D, 0x041D); // CYRILLIC SMALL LETTER EN, CYRILLIC CAPITAL LETTER EN
+test(0x043E, 0x041E, 0x1C82); // CYRILLIC SMALL LETTER O, CYRILLIC CAPITAL LETTER O, CYRILLIC SMALL LETTER NARROW O
+test(0x043F, 0x041F); // CYRILLIC SMALL LETTER PE, CYRILLIC CAPITAL LETTER PE
+test(0x0440, 0x0420); // CYRILLIC SMALL LETTER ER, CYRILLIC CAPITAL LETTER ER
+test(0x0441, 0x0421, 0x1C83); // CYRILLIC SMALL LETTER ES, CYRILLIC CAPITAL LETTER ES, CYRILLIC SMALL LETTER WIDE ES
+test(0x0442, 0x0422, 0x1C84, 0x1C85); // CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER THREE-LEGGED TE
+test(0x0443, 0x0423); // CYRILLIC SMALL LETTER U, CYRILLIC CAPITAL LETTER U
+test(0x0444, 0x0424); // CYRILLIC SMALL LETTER EF, CYRILLIC CAPITAL LETTER EF
+test(0x0445, 0x0425); // CYRILLIC SMALL LETTER HA (CYRILLIC SMALL LETTER KHA), CYRILLIC CAPITAL LETTER HA (CYRILLIC CAPITAL LETTER KHA)
+test(0x0446, 0x0426); // CYRILLIC SMALL LETTER TSE, CYRILLIC CAPITAL LETTER TSE
+test(0x0447, 0x0427); // CYRILLIC SMALL LETTER CHE, CYRILLIC CAPITAL LETTER CHE
+test(0x0448, 0x0428); // CYRILLIC SMALL LETTER SHA, CYRILLIC CAPITAL LETTER SHA
+test(0x0449, 0x0429); // CYRILLIC SMALL LETTER SHCHA, CYRILLIC CAPITAL LETTER SHCHA
+test(0x044A, 0x042A, 0x1C86); // CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC CAPITAL LETTER HARD SIGN, CYRILLIC SMALL LETTER TALL HARD SIGN
+test(0x044B, 0x042B); // CYRILLIC SMALL LETTER YERU (CYRILLIC SMALL LETTER YERI), CYRILLIC CAPITAL LETTER YERU (CYRILLIC CAPITAL LETTER YERI)
+test(0x044C, 0x042C); // CYRILLIC SMALL LETTER SOFT SIGN, CYRILLIC CAPITAL LETTER SOFT SIGN
+test(0x044D, 0x042D); // CYRILLIC SMALL LETTER E (CYRILLIC SMALL LETTER REVERSED E), CYRILLIC CAPITAL LETTER E (CYRILLIC CAPITAL LETTER REVERSED E)
+test(0x044E, 0x042E); // CYRILLIC SMALL LETTER YU (CYRILLIC SMALL LETTER IU), CYRILLIC CAPITAL LETTER YU (CYRILLIC CAPITAL LETTER IU)
+test(0x044F, 0x042F); // CYRILLIC SMALL LETTER YA (CYRILLIC SMALL LETTER IA), CYRILLIC CAPITAL LETTER YA (CYRILLIC CAPITAL LETTER IA)
+test(0x0450, 0x0400); // CYRILLIC SMALL LETTER IE WITH GRAVE, CYRILLIC CAPITAL LETTER IE WITH GRAVE
+test(0x0451, 0x0401); // CYRILLIC SMALL LETTER IO, CYRILLIC CAPITAL LETTER IO
+test(0x0452, 0x0402); // CYRILLIC SMALL LETTER DJE, CYRILLIC CAPITAL LETTER DJE
+test(0x0453, 0x0403); // CYRILLIC SMALL LETTER GJE, CYRILLIC CAPITAL LETTER GJE
+test(0x0454, 0x0404); // CYRILLIC SMALL LETTER UKRAINIAN IE (CYRILLIC SMALL LETTER E), CYRILLIC CAPITAL LETTER UKRAINIAN IE (CYRILLIC CAPITAL LETTER E)
+test(0x0455, 0x0405); // CYRILLIC SMALL LETTER DZE, CYRILLIC CAPITAL LETTER DZE
+test(0x0456, 0x0406); // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC SMALL LETTER I), CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I (CYRILLIC CAPITAL LETTER I)
+test(0x0457, 0x0407); // CYRILLIC SMALL LETTER YI, CYRILLIC CAPITAL LETTER YI
+test(0x0458, 0x0408); // CYRILLIC SMALL LETTER JE, CYRILLIC CAPITAL LETTER JE
+test(0x0459, 0x0409); // CYRILLIC SMALL LETTER LJE, CYRILLIC CAPITAL LETTER LJE
+test(0x045A, 0x040A); // CYRILLIC SMALL LETTER NJE, CYRILLIC CAPITAL LETTER NJE
+test(0x045B, 0x040B); // CYRILLIC SMALL LETTER TSHE, CYRILLIC CAPITAL LETTER TSHE
+test(0x045C, 0x040C); // CYRILLIC SMALL LETTER KJE, CYRILLIC CAPITAL LETTER KJE
+test(0x045D, 0x040D); // CYRILLIC SMALL LETTER I WITH GRAVE, CYRILLIC CAPITAL LETTER I WITH GRAVE
+test(0x045E, 0x040E); // CYRILLIC SMALL LETTER SHORT U, CYRILLIC CAPITAL LETTER SHORT U
+test(0x045F, 0x040F); // CYRILLIC SMALL LETTER DZHE, CYRILLIC CAPITAL LETTER DZHE
+test(0x0460, 0x0461); // CYRILLIC CAPITAL LETTER OMEGA, CYRILLIC SMALL LETTER OMEGA
+test(0x0461, 0x0460); // CYRILLIC SMALL LETTER OMEGA, CYRILLIC CAPITAL LETTER OMEGA
+test(0x0462, 0x0463, 0x1C87); // CYRILLIC CAPITAL LETTER YAT, CYRILLIC SMALL LETTER YAT, CYRILLIC SMALL LETTER TALL YAT
+test(0x0463, 0x0462, 0x1C87); // CYRILLIC SMALL LETTER YAT, CYRILLIC CAPITAL LETTER YAT, CYRILLIC SMALL LETTER TALL YAT
+test(0x0464, 0x0465); // CYRILLIC CAPITAL LETTER IOTIFIED E, CYRILLIC SMALL LETTER IOTIFIED E
+test(0x0465, 0x0464); // CYRILLIC SMALL LETTER IOTIFIED E, CYRILLIC CAPITAL LETTER IOTIFIED E
+test(0x0466, 0x0467); // CYRILLIC CAPITAL LETTER LITTLE YUS, CYRILLIC SMALL LETTER LITTLE YUS
+test(0x0467, 0x0466); // CYRILLIC SMALL LETTER LITTLE YUS, CYRILLIC CAPITAL LETTER LITTLE YUS
+test(0x0468, 0x0469); // CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS, CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+test(0x0469, 0x0468); // CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS, CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+test(0x046A, 0x046B); // CYRILLIC CAPITAL LETTER BIG YUS, CYRILLIC SMALL LETTER BIG YUS
+test(0x046B, 0x046A); // CYRILLIC SMALL LETTER BIG YUS, CYRILLIC CAPITAL LETTER BIG YUS
+test(0x046C, 0x046D); // CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS, CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+test(0x046D, 0x046C); // CYRILLIC SMALL LETTER IOTIFIED BIG YUS, CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+test(0x046E, 0x046F); // CYRILLIC CAPITAL LETTER KSI, CYRILLIC SMALL LETTER KSI
+test(0x046F, 0x046E); // CYRILLIC SMALL LETTER KSI, CYRILLIC CAPITAL LETTER KSI
+test(0x0470, 0x0471); // CYRILLIC CAPITAL LETTER PSI, CYRILLIC SMALL LETTER PSI
+test(0x0471, 0x0470); // CYRILLIC SMALL LETTER PSI, CYRILLIC CAPITAL LETTER PSI
+test(0x0472, 0x0473); // CYRILLIC CAPITAL LETTER FITA, CYRILLIC SMALL LETTER FITA
+test(0x0473, 0x0472); // CYRILLIC SMALL LETTER FITA, CYRILLIC CAPITAL LETTER FITA
+test(0x0474, 0x0475); // CYRILLIC CAPITAL LETTER IZHITSA, CYRILLIC SMALL LETTER IZHITSA
+test(0x0475, 0x0474); // CYRILLIC SMALL LETTER IZHITSA, CYRILLIC CAPITAL LETTER IZHITSA
+test(0x0476, 0x0477); // CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE), CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE)
+test(0x0477, 0x0476); // CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE), CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT (CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE)
+test(0x0478, 0x0479); // CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH), CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH)
+test(0x0479, 0x0478); // CYRILLIC SMALL LETTER UK (CYRILLIC SMALL LETTER UK DIGRAPH), CYRILLIC CAPITAL LETTER UK (CYRILLIC CAPITAL LETTER UK DIGRAPH)
+test(0x047A, 0x047B); // CYRILLIC CAPITAL LETTER ROUND OMEGA, CYRILLIC SMALL LETTER ROUND OMEGA
+test(0x047B, 0x047A); // CYRILLIC SMALL LETTER ROUND OMEGA, CYRILLIC CAPITAL LETTER ROUND OMEGA
+test(0x047C, 0x047D); // CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO), CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO)
+test(0x047D, 0x047C); // CYRILLIC SMALL LETTER OMEGA WITH TITLO (CYRILLIC SMALL LETTER OMEGA TITLO), CYRILLIC CAPITAL LETTER OMEGA WITH TITLO (CYRILLIC CAPITAL LETTER OMEGA TITLO)
+test(0x047E, 0x047F); // CYRILLIC CAPITAL LETTER OT, CYRILLIC SMALL LETTER OT
+test(0x047F, 0x047E); // CYRILLIC SMALL LETTER OT, CYRILLIC CAPITAL LETTER OT
+test(0x0480, 0x0481); // CYRILLIC CAPITAL LETTER KOPPA, CYRILLIC SMALL LETTER KOPPA
+test(0x0481, 0x0480); // CYRILLIC SMALL LETTER KOPPA, CYRILLIC CAPITAL LETTER KOPPA
+test(0x048A, 0x048B); // CYRILLIC CAPITAL LETTER SHORT I WITH TAIL, CYRILLIC SMALL LETTER SHORT I WITH TAIL
+test(0x048B, 0x048A); // CYRILLIC SMALL LETTER SHORT I WITH TAIL, CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+test(0x048C, 0x048D); // CYRILLIC CAPITAL LETTER SEMISOFT SIGN, CYRILLIC SMALL LETTER SEMISOFT SIGN
+test(0x048D, 0x048C); // CYRILLIC SMALL LETTER SEMISOFT SIGN, CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+test(0x048E, 0x048F); // CYRILLIC CAPITAL LETTER ER WITH TICK, CYRILLIC SMALL LETTER ER WITH TICK
+test(0x048F, 0x048E); // CYRILLIC SMALL LETTER ER WITH TICK, CYRILLIC CAPITAL LETTER ER WITH TICK
+test(0x0490, 0x0491); // CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN), CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN)
+test(0x0491, 0x0490); // CYRILLIC SMALL LETTER GHE WITH UPTURN (CYRILLIC SMALL LETTER GE WITH UPTURN), CYRILLIC CAPITAL LETTER GHE WITH UPTURN (CYRILLIC CAPITAL LETTER GE WITH UPTURN)
+test(0x0492, 0x0493); // CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR), CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR)
+test(0x0493, 0x0492); // CYRILLIC SMALL LETTER GHE WITH STROKE (CYRILLIC SMALL LETTER GE BAR), CYRILLIC CAPITAL LETTER GHE WITH STROKE (CYRILLIC CAPITAL LETTER GE BAR)
+test(0x0494, 0x0495); // CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK), CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK)
+test(0x0495, 0x0494); // CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER GE HOOK), CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER GE HOOK)
+test(0x0496, 0x0497); // CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER)
+test(0x0497, 0x0496); // CYRILLIC SMALL LETTER ZHE WITH DESCENDER (CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER)
+test(0x0498, 0x0499); // CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA), CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA)
+test(0x0499, 0x0498); // CYRILLIC SMALL LETTER ZE WITH DESCENDER (CYRILLIC SMALL LETTER ZE CEDILLA), CYRILLIC CAPITAL LETTER ZE WITH DESCENDER (CYRILLIC CAPITAL LETTER ZE CEDILLA)
+test(0x049A, 0x049B); // CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER)
+test(0x049B, 0x049A); // CYRILLIC SMALL LETTER KA WITH DESCENDER (CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER KA WITH DESCENDER (CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER)
+test(0x049C, 0x049D); // CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR), CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR)
+test(0x049D, 0x049C); // CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE (CYRILLIC SMALL LETTER KA VERTICAL BAR), CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER KA VERTICAL BAR)
+test(0x049E, 0x049F); // CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR), CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR)
+test(0x049F, 0x049E); // CYRILLIC SMALL LETTER KA WITH STROKE (CYRILLIC SMALL LETTER KA BAR), CYRILLIC CAPITAL LETTER KA WITH STROKE (CYRILLIC CAPITAL LETTER KA BAR)
+test(0x04A0, 0x04A1); // CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA), CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA)
+test(0x04A1, 0x04A0); // CYRILLIC SMALL LETTER BASHKIR KA (CYRILLIC SMALL LETTER REVERSED GE KA), CYRILLIC CAPITAL LETTER BASHKIR KA (CYRILLIC CAPITAL LETTER REVERSED GE KA)
+test(0x04A2, 0x04A3); // CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER)
+test(0x04A3, 0x04A2); // CYRILLIC SMALL LETTER EN WITH DESCENDER (CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER EN WITH DESCENDER (CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER)
+test(0x04A4, 0x04A5); // CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE), CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE)
+test(0x04A5, 0x04A4); // CYRILLIC SMALL LIGATURE EN GHE (CYRILLIC SMALL LETTER EN GE), CYRILLIC CAPITAL LIGATURE EN GHE (CYRILLIC CAPITAL LETTER EN GE)
+test(0x04A6, 0x04A7); // CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK), CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK)
+test(0x04A7, 0x04A6); // CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (CYRILLIC SMALL LETTER PE HOOK), CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (CYRILLIC CAPITAL LETTER PE HOOK)
+test(0x04A8, 0x04A9); // CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK), CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK)
+test(0x04A9, 0x04A8); // CYRILLIC SMALL LETTER ABKHASIAN HA (CYRILLIC SMALL LETTER O HOOK), CYRILLIC CAPITAL LETTER ABKHASIAN HA (CYRILLIC CAPITAL LETTER O HOOK)
+test(0x04AA, 0x04AB); // CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA), CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA)
+test(0x04AB, 0x04AA); // CYRILLIC SMALL LETTER ES WITH DESCENDER (CYRILLIC SMALL LETTER ES CEDILLA), CYRILLIC CAPITAL LETTER ES WITH DESCENDER (CYRILLIC CAPITAL LETTER ES CEDILLA)
+test(0x04AC, 0x04AD); // CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER)
+test(0x04AD, 0x04AC); // CYRILLIC SMALL LETTER TE WITH DESCENDER (CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER TE WITH DESCENDER (CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER)
+test(0x04AE, 0x04AF); // CYRILLIC CAPITAL LETTER STRAIGHT U, CYRILLIC SMALL LETTER STRAIGHT U
+test(0x04AF, 0x04AE); // CYRILLIC SMALL LETTER STRAIGHT U, CYRILLIC CAPITAL LETTER STRAIGHT U
+test(0x04B0, 0x04B1); // CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR), CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR)
+test(0x04B1, 0x04B0); // CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE (CYRILLIC SMALL LETTER STRAIGHT U BAR), CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE (CYRILLIC CAPITAL LETTER STRAIGHT U BAR)
+test(0x04B2, 0x04B3); // CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER)
+test(0x04B3, 0x04B2); // CYRILLIC SMALL LETTER HA WITH DESCENDER (CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER HA WITH DESCENDER (CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER)
+test(0x04B4, 0x04B5); // CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE), CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE)
+test(0x04B5, 0x04B4); // CYRILLIC SMALL LIGATURE TE TSE (CYRILLIC SMALL LETTER TE TSE), CYRILLIC CAPITAL LIGATURE TE TSE (CYRILLIC CAPITAL LETTER TE TSE)
+test(0x04B6, 0x04B7); // CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER), CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER)
+test(0x04B7, 0x04B6); // CYRILLIC SMALL LETTER CHE WITH DESCENDER (CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER), CYRILLIC CAPITAL LETTER CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER)
+test(0x04B8, 0x04B9); // CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR), CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR)
+test(0x04B9, 0x04B8); // CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE (CYRILLIC SMALL LETTER CHE VERTICAL BAR), CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE (CYRILLIC CAPITAL LETTER CHE VERTICAL BAR)
+test(0x04BA, 0x04BB); // CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H), CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H)
+test(0x04BB, 0x04BA); // CYRILLIC SMALL LETTER SHHA (CYRILLIC SMALL LETTER H), CYRILLIC CAPITAL LETTER SHHA (CYRILLIC CAPITAL LETTER H)
+test(0x04BC, 0x04BD); // CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK), CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK)
+test(0x04BD, 0x04BC); // CYRILLIC SMALL LETTER ABKHASIAN CHE (CYRILLIC SMALL LETTER IE HOOK), CYRILLIC CAPITAL LETTER ABKHASIAN CHE (CYRILLIC CAPITAL LETTER IE HOOK)
+test(0x04BE, 0x04BF); // CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK), CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK)
+test(0x04BF, 0x04BE); // CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC SMALL LETTER IE HOOK OGONEK), CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER (CYRILLIC CAPITAL LETTER IE HOOK OGONEK)
+test(0x04C0, 0x04CF); // CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I), CYRILLIC SMALL LETTER PALOCHKA
+test(0x04C1, 0x04C2); // CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE), CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE)
+test(0x04C2, 0x04C1); // CYRILLIC SMALL LETTER ZHE WITH BREVE (CYRILLIC SMALL LETTER SHORT ZHE), CYRILLIC CAPITAL LETTER ZHE WITH BREVE (CYRILLIC CAPITAL LETTER SHORT ZHE)
+test(0x04C3, 0x04C4); // CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK), CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK)
+test(0x04C4, 0x04C3); // CYRILLIC SMALL LETTER KA WITH HOOK (CYRILLIC SMALL LETTER KA HOOK), CYRILLIC CAPITAL LETTER KA WITH HOOK (CYRILLIC CAPITAL LETTER KA HOOK)
+test(0x04C5, 0x04C6); // CYRILLIC CAPITAL LETTER EL WITH TAIL, CYRILLIC SMALL LETTER EL WITH TAIL
+test(0x04C6, 0x04C5); // CYRILLIC SMALL LETTER EL WITH TAIL, CYRILLIC CAPITAL LETTER EL WITH TAIL
+test(0x04C7, 0x04C8); // CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK), CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK)
+test(0x04C8, 0x04C7); // CYRILLIC SMALL LETTER EN WITH HOOK (CYRILLIC SMALL LETTER EN HOOK), CYRILLIC CAPITAL LETTER EN WITH HOOK (CYRILLIC CAPITAL LETTER EN HOOK)
+test(0x04C9, 0x04CA); // CYRILLIC CAPITAL LETTER EN WITH TAIL, CYRILLIC SMALL LETTER EN WITH TAIL
+test(0x04CA, 0x04C9); // CYRILLIC SMALL LETTER EN WITH TAIL, CYRILLIC CAPITAL LETTER EN WITH TAIL
+test(0x04CB, 0x04CC); // CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER), CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER)
+test(0x04CC, 0x04CB); // CYRILLIC SMALL LETTER KHAKASSIAN CHE (CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER), CYRILLIC CAPITAL LETTER KHAKASSIAN CHE (CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER)
+test(0x04CD, 0x04CE); // CYRILLIC CAPITAL LETTER EM WITH TAIL, CYRILLIC SMALL LETTER EM WITH TAIL
+test(0x04CE, 0x04CD); // CYRILLIC SMALL LETTER EM WITH TAIL, CYRILLIC CAPITAL LETTER EM WITH TAIL
+test(0x04CF, 0x04C0); // CYRILLIC SMALL LETTER PALOCHKA, CYRILLIC LETTER PALOCHKA (CYRILLIC LETTER I)
+test(0x04D0, 0x04D1); // CYRILLIC CAPITAL LETTER A WITH BREVE, CYRILLIC SMALL LETTER A WITH BREVE
+test(0x04D1, 0x04D0); // CYRILLIC SMALL LETTER A WITH BREVE, CYRILLIC CAPITAL LETTER A WITH BREVE
+test(0x04D2, 0x04D3); // CYRILLIC CAPITAL LETTER A WITH DIAERESIS, CYRILLIC SMALL LETTER A WITH DIAERESIS
+test(0x04D3, 0x04D2); // CYRILLIC SMALL LETTER A WITH DIAERESIS, CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+test(0x04D4, 0x04D5); // CYRILLIC CAPITAL LIGATURE A IE, CYRILLIC SMALL LIGATURE A IE
+test(0x04D5, 0x04D4); // CYRILLIC SMALL LIGATURE A IE, CYRILLIC CAPITAL LIGATURE A IE
+test(0x04D6, 0x04D7); // CYRILLIC CAPITAL LETTER IE WITH BREVE, CYRILLIC SMALL LETTER IE WITH BREVE
+test(0x04D7, 0x04D6); // CYRILLIC SMALL LETTER IE WITH BREVE, CYRILLIC CAPITAL LETTER IE WITH BREVE
+test(0x04D8, 0x04D9); // CYRILLIC CAPITAL LETTER SCHWA, CYRILLIC SMALL LETTER SCHWA
+test(0x04D9, 0x04D8); // CYRILLIC SMALL LETTER SCHWA, CYRILLIC CAPITAL LETTER SCHWA
+test(0x04DA, 0x04DB); // CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS, CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+test(0x04DB, 0x04DA); // CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS, CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+test(0x04DC, 0x04DD); // CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS, CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+test(0x04DD, 0x04DC); // CYRILLIC SMALL LETTER ZHE WITH DIAERESIS, CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+test(0x04DE, 0x04DF); // CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS, CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+test(0x04DF, 0x04DE); // CYRILLIC SMALL LETTER ZE WITH DIAERESIS, CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+test(0x04E0, 0x04E1); // CYRILLIC CAPITAL LETTER ABKHASIAN DZE, CYRILLIC SMALL LETTER ABKHASIAN DZE
+test(0x04E1, 0x04E0); // CYRILLIC SMALL LETTER ABKHASIAN DZE, CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+test(0x04E2, 0x04E3); // CYRILLIC CAPITAL LETTER I WITH MACRON, CYRILLIC SMALL LETTER I WITH MACRON
+test(0x04E3, 0x04E2); // CYRILLIC SMALL LETTER I WITH MACRON, CYRILLIC CAPITAL LETTER I WITH MACRON
+test(0x04E4, 0x04E5); // CYRILLIC CAPITAL LETTER I WITH DIAERESIS, CYRILLIC SMALL LETTER I WITH DIAERESIS
+test(0x04E5, 0x04E4); // CYRILLIC SMALL LETTER I WITH DIAERESIS, CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+test(0x04E6, 0x04E7); // CYRILLIC CAPITAL LETTER O WITH DIAERESIS, CYRILLIC SMALL LETTER O WITH DIAERESIS
+test(0x04E7, 0x04E6); // CYRILLIC SMALL LETTER O WITH DIAERESIS, CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+test(0x04E8, 0x04E9); // CYRILLIC CAPITAL LETTER BARRED O, CYRILLIC SMALL LETTER BARRED O
+test(0x04E9, 0x04E8); // CYRILLIC SMALL LETTER BARRED O, CYRILLIC CAPITAL LETTER BARRED O
+test(0x04EA, 0x04EB); // CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS, CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+test(0x04EB, 0x04EA); // CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS, CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+test(0x04EC, 0x04ED); // CYRILLIC CAPITAL LETTER E WITH DIAERESIS, CYRILLIC SMALL LETTER E WITH DIAERESIS
+test(0x04ED, 0x04EC); // CYRILLIC SMALL LETTER E WITH DIAERESIS, CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+test(0x04EE, 0x04EF); // CYRILLIC CAPITAL LETTER U WITH MACRON, CYRILLIC SMALL LETTER U WITH MACRON
+test(0x04EF, 0x04EE); // CYRILLIC SMALL LETTER U WITH MACRON, CYRILLIC CAPITAL LETTER U WITH MACRON
+test(0x04F0, 0x04F1); // CYRILLIC CAPITAL LETTER U WITH DIAERESIS, CYRILLIC SMALL LETTER U WITH DIAERESIS
+test(0x04F1, 0x04F0); // CYRILLIC SMALL LETTER U WITH DIAERESIS, CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+test(0x04F2, 0x04F3); // CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE, CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+test(0x04F3, 0x04F2); // CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE, CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+test(0x04F4, 0x04F5); // CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS, CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+test(0x04F5, 0x04F4); // CYRILLIC SMALL LETTER CHE WITH DIAERESIS, CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+test(0x04F6, 0x04F7); // CYRILLIC CAPITAL LETTER GHE WITH DESCENDER, CYRILLIC SMALL LETTER GHE WITH DESCENDER
+test(0x04F7, 0x04F6); // CYRILLIC SMALL LETTER GHE WITH DESCENDER, CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+test(0x04F8, 0x04F9); // CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS, CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+test(0x04F9, 0x04F8); // CYRILLIC SMALL LETTER YERU WITH DIAERESIS, CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+test(0x04FA, 0x04FB); // CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK, CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+test(0x04FB, 0x04FA); // CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK, CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+test(0x04FC, 0x04FD); // CYRILLIC CAPITAL LETTER HA WITH HOOK, CYRILLIC SMALL LETTER HA WITH HOOK
+test(0x04FD, 0x04FC); // CYRILLIC SMALL LETTER HA WITH HOOK, CYRILLIC CAPITAL LETTER HA WITH HOOK
+test(0x04FE, 0x04FF); // CYRILLIC CAPITAL LETTER HA WITH STROKE, CYRILLIC SMALL LETTER HA WITH STROKE
+test(0x04FF, 0x04FE); // CYRILLIC SMALL LETTER HA WITH STROKE, CYRILLIC CAPITAL LETTER HA WITH STROKE
+test(0x0500, 0x0501); // CYRILLIC CAPITAL LETTER KOMI DE, CYRILLIC SMALL LETTER KOMI DE
+test(0x0501, 0x0500); // CYRILLIC SMALL LETTER KOMI DE, CYRILLIC CAPITAL LETTER KOMI DE
+test(0x0502, 0x0503); // CYRILLIC CAPITAL LETTER KOMI DJE, CYRILLIC SMALL LETTER KOMI DJE
+test(0x0503, 0x0502); // CYRILLIC SMALL LETTER KOMI DJE, CYRILLIC CAPITAL LETTER KOMI DJE
+test(0x0504, 0x0505); // CYRILLIC CAPITAL LETTER KOMI ZJE, CYRILLIC SMALL LETTER KOMI ZJE
+test(0x0505, 0x0504); // CYRILLIC SMALL LETTER KOMI ZJE, CYRILLIC CAPITAL LETTER KOMI ZJE
+test(0x0506, 0x0507); // CYRILLIC CAPITAL LETTER KOMI DZJE, CYRILLIC SMALL LETTER KOMI DZJE
+test(0x0507, 0x0506); // CYRILLIC SMALL LETTER KOMI DZJE, CYRILLIC CAPITAL LETTER KOMI DZJE
+test(0x0508, 0x0509); // CYRILLIC CAPITAL LETTER KOMI LJE, CYRILLIC SMALL LETTER KOMI LJE
+test(0x0509, 0x0508); // CYRILLIC SMALL LETTER KOMI LJE, CYRILLIC CAPITAL LETTER KOMI LJE
+test(0x050A, 0x050B); // CYRILLIC CAPITAL LETTER KOMI NJE, CYRILLIC SMALL LETTER KOMI NJE
+test(0x050B, 0x050A); // CYRILLIC SMALL LETTER KOMI NJE, CYRILLIC CAPITAL LETTER KOMI NJE
+test(0x050C, 0x050D); // CYRILLIC CAPITAL LETTER KOMI SJE, CYRILLIC SMALL LETTER KOMI SJE
+test(0x050D, 0x050C); // CYRILLIC SMALL LETTER KOMI SJE, CYRILLIC CAPITAL LETTER KOMI SJE
+test(0x050E, 0x050F); // CYRILLIC CAPITAL LETTER KOMI TJE, CYRILLIC SMALL LETTER KOMI TJE
+test(0x050F, 0x050E); // CYRILLIC SMALL LETTER KOMI TJE, CYRILLIC CAPITAL LETTER KOMI TJE
+test(0x0510, 0x0511); // CYRILLIC CAPITAL LETTER REVERSED ZE, CYRILLIC SMALL LETTER REVERSED ZE
+test(0x0511, 0x0510); // CYRILLIC SMALL LETTER REVERSED ZE, CYRILLIC CAPITAL LETTER REVERSED ZE
+test(0x0512, 0x0513); // CYRILLIC CAPITAL LETTER EL WITH HOOK, CYRILLIC SMALL LETTER EL WITH HOOK
+test(0x0513, 0x0512); // CYRILLIC SMALL LETTER EL WITH HOOK, CYRILLIC CAPITAL LETTER EL WITH HOOK
+test(0x0514, 0x0515); // CYRILLIC CAPITAL LETTER LHA, CYRILLIC SMALL LETTER LHA
+test(0x0515, 0x0514); // CYRILLIC SMALL LETTER LHA, CYRILLIC CAPITAL LETTER LHA
+test(0x0516, 0x0517); // CYRILLIC CAPITAL LETTER RHA, CYRILLIC SMALL LETTER RHA
+test(0x0517, 0x0516); // CYRILLIC SMALL LETTER RHA, CYRILLIC CAPITAL LETTER RHA
+test(0x0518, 0x0519); // CYRILLIC CAPITAL LETTER YAE, CYRILLIC SMALL LETTER YAE
+test(0x0519, 0x0518); // CYRILLIC SMALL LETTER YAE, CYRILLIC CAPITAL LETTER YAE
+test(0x051A, 0x051B); // CYRILLIC CAPITAL LETTER QA, CYRILLIC SMALL LETTER QA
+test(0x051B, 0x051A); // CYRILLIC SMALL LETTER QA, CYRILLIC CAPITAL LETTER QA
+test(0x051C, 0x051D); // CYRILLIC CAPITAL LETTER WE, CYRILLIC SMALL LETTER WE
+test(0x051D, 0x051C); // CYRILLIC SMALL LETTER WE, CYRILLIC CAPITAL LETTER WE
+test(0x051E, 0x051F); // CYRILLIC CAPITAL LETTER ALEUT KA, CYRILLIC SMALL LETTER ALEUT KA
+test(0x051F, 0x051E); // CYRILLIC SMALL LETTER ALEUT KA, CYRILLIC CAPITAL LETTER ALEUT KA
+test(0x0520, 0x0521); // CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK, CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+test(0x0521, 0x0520); // CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+test(0x0522, 0x0523); // CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK, CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+test(0x0523, 0x0522); // CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+test(0x0524, 0x0525); // CYRILLIC CAPITAL LETTER PE WITH DESCENDER, CYRILLIC SMALL LETTER PE WITH DESCENDER
+test(0x0525, 0x0524); // CYRILLIC SMALL LETTER PE WITH DESCENDER, CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+test(0x0526, 0x0527); // CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER, CYRILLIC SMALL LETTER SHHA WITH DESCENDER
+test(0x0527, 0x0526); // CYRILLIC SMALL LETTER SHHA WITH DESCENDER, CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER
+test(0x0528, 0x0529); // CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK, CYRILLIC SMALL LETTER EN WITH LEFT HOOK
+test(0x0529, 0x0528); // CYRILLIC SMALL LETTER EN WITH LEFT HOOK, CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK
+test(0x052A, 0x052B); // CYRILLIC CAPITAL LETTER DZZHE, CYRILLIC SMALL LETTER DZZHE
+test(0x052B, 0x052A); // CYRILLIC SMALL LETTER DZZHE, CYRILLIC CAPITAL LETTER DZZHE
+test(0x052C, 0x052D); // CYRILLIC CAPITAL LETTER DCHE, CYRILLIC SMALL LETTER DCHE
+test(0x052D, 0x052C); // CYRILLIC SMALL LETTER DCHE, CYRILLIC CAPITAL LETTER DCHE
+test(0x052E, 0x052F); // CYRILLIC CAPITAL LETTER EL WITH DESCENDER, CYRILLIC SMALL LETTER EL WITH DESCENDER
+test(0x052F, 0x052E); // CYRILLIC SMALL LETTER EL WITH DESCENDER, CYRILLIC CAPITAL LETTER EL WITH DESCENDER
+test(0x0531, 0x0561); // ARMENIAN CAPITAL LETTER AYB, ARMENIAN SMALL LETTER AYB
+test(0x0532, 0x0562); // ARMENIAN CAPITAL LETTER BEN, ARMENIAN SMALL LETTER BEN
+test(0x0533, 0x0563); // ARMENIAN CAPITAL LETTER GIM, ARMENIAN SMALL LETTER GIM
+test(0x0534, 0x0564); // ARMENIAN CAPITAL LETTER DA, ARMENIAN SMALL LETTER DA
+test(0x0535, 0x0565); // ARMENIAN CAPITAL LETTER ECH, ARMENIAN SMALL LETTER ECH
+test(0x0536, 0x0566); // ARMENIAN CAPITAL LETTER ZA, ARMENIAN SMALL LETTER ZA
+test(0x0537, 0x0567); // ARMENIAN CAPITAL LETTER EH, ARMENIAN SMALL LETTER EH
+test(0x0538, 0x0568); // ARMENIAN CAPITAL LETTER ET, ARMENIAN SMALL LETTER ET
+test(0x0539, 0x0569); // ARMENIAN CAPITAL LETTER TO, ARMENIAN SMALL LETTER TO
+test(0x053A, 0x056A); // ARMENIAN CAPITAL LETTER ZHE, ARMENIAN SMALL LETTER ZHE
+test(0x053B, 0x056B); // ARMENIAN CAPITAL LETTER INI, ARMENIAN SMALL LETTER INI
+test(0x053C, 0x056C); // ARMENIAN CAPITAL LETTER LIWN, ARMENIAN SMALL LETTER LIWN
+test(0x053D, 0x056D); // ARMENIAN CAPITAL LETTER XEH, ARMENIAN SMALL LETTER XEH
+test(0x053E, 0x056E); // ARMENIAN CAPITAL LETTER CA, ARMENIAN SMALL LETTER CA
+test(0x053F, 0x056F); // ARMENIAN CAPITAL LETTER KEN, ARMENIAN SMALL LETTER KEN
+test(0x0540, 0x0570); // ARMENIAN CAPITAL LETTER HO, ARMENIAN SMALL LETTER HO
+test(0x0541, 0x0571); // ARMENIAN CAPITAL LETTER JA, ARMENIAN SMALL LETTER JA
+test(0x0542, 0x0572); // ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD), ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD)
+test(0x0543, 0x0573); // ARMENIAN CAPITAL LETTER CHEH, ARMENIAN SMALL LETTER CHEH
+test(0x0544, 0x0574); // ARMENIAN CAPITAL LETTER MEN, ARMENIAN SMALL LETTER MEN
+test(0x0545, 0x0575); // ARMENIAN CAPITAL LETTER YI, ARMENIAN SMALL LETTER YI
+test(0x0546, 0x0576); // ARMENIAN CAPITAL LETTER NOW, ARMENIAN SMALL LETTER NOW
+test(0x0547, 0x0577); // ARMENIAN CAPITAL LETTER SHA, ARMENIAN SMALL LETTER SHA
+test(0x0548, 0x0578); // ARMENIAN CAPITAL LETTER VO, ARMENIAN SMALL LETTER VO
+test(0x0549, 0x0579); // ARMENIAN CAPITAL LETTER CHA, ARMENIAN SMALL LETTER CHA
+test(0x054A, 0x057A); // ARMENIAN CAPITAL LETTER PEH, ARMENIAN SMALL LETTER PEH
+test(0x054B, 0x057B); // ARMENIAN CAPITAL LETTER JHEH, ARMENIAN SMALL LETTER JHEH
+test(0x054C, 0x057C); // ARMENIAN CAPITAL LETTER RA, ARMENIAN SMALL LETTER RA
+test(0x054D, 0x057D); // ARMENIAN CAPITAL LETTER SEH, ARMENIAN SMALL LETTER SEH
+test(0x054E, 0x057E); // ARMENIAN CAPITAL LETTER VEW, ARMENIAN SMALL LETTER VEW
+test(0x054F, 0x057F); // ARMENIAN CAPITAL LETTER TIWN, ARMENIAN SMALL LETTER TIWN
+test(0x0550, 0x0580); // ARMENIAN CAPITAL LETTER REH, ARMENIAN SMALL LETTER REH
+test(0x0551, 0x0581); // ARMENIAN CAPITAL LETTER CO, ARMENIAN SMALL LETTER CO
+test(0x0552, 0x0582); // ARMENIAN CAPITAL LETTER YIWN, ARMENIAN SMALL LETTER YIWN
+test(0x0553, 0x0583); // ARMENIAN CAPITAL LETTER PIWR, ARMENIAN SMALL LETTER PIWR
+test(0x0554, 0x0584); // ARMENIAN CAPITAL LETTER KEH, ARMENIAN SMALL LETTER KEH
+test(0x0555, 0x0585); // ARMENIAN CAPITAL LETTER OH, ARMENIAN SMALL LETTER OH
+test(0x0556, 0x0586); // ARMENIAN CAPITAL LETTER FEH, ARMENIAN SMALL LETTER FEH
+test(0x0561, 0x0531); // ARMENIAN SMALL LETTER AYB, ARMENIAN CAPITAL LETTER AYB
+test(0x0562, 0x0532); // ARMENIAN SMALL LETTER BEN, ARMENIAN CAPITAL LETTER BEN
+test(0x0563, 0x0533); // ARMENIAN SMALL LETTER GIM, ARMENIAN CAPITAL LETTER GIM
+test(0x0564, 0x0534); // ARMENIAN SMALL LETTER DA, ARMENIAN CAPITAL LETTER DA
+test(0x0565, 0x0535); // ARMENIAN SMALL LETTER ECH, ARMENIAN CAPITAL LETTER ECH
+test(0x0566, 0x0536); // ARMENIAN SMALL LETTER ZA, ARMENIAN CAPITAL LETTER ZA
+test(0x0567, 0x0537); // ARMENIAN SMALL LETTER EH, ARMENIAN CAPITAL LETTER EH
+test(0x0568, 0x0538); // ARMENIAN SMALL LETTER ET, ARMENIAN CAPITAL LETTER ET
+test(0x0569, 0x0539); // ARMENIAN SMALL LETTER TO, ARMENIAN CAPITAL LETTER TO
+test(0x056A, 0x053A); // ARMENIAN SMALL LETTER ZHE, ARMENIAN CAPITAL LETTER ZHE
+test(0x056B, 0x053B); // ARMENIAN SMALL LETTER INI, ARMENIAN CAPITAL LETTER INI
+test(0x056C, 0x053C); // ARMENIAN SMALL LETTER LIWN, ARMENIAN CAPITAL LETTER LIWN
+test(0x056D, 0x053D); // ARMENIAN SMALL LETTER XEH, ARMENIAN CAPITAL LETTER XEH
+test(0x056E, 0x053E); // ARMENIAN SMALL LETTER CA, ARMENIAN CAPITAL LETTER CA
+test(0x056F, 0x053F); // ARMENIAN SMALL LETTER KEN, ARMENIAN CAPITAL LETTER KEN
+test(0x0570, 0x0540); // ARMENIAN SMALL LETTER HO, ARMENIAN CAPITAL LETTER HO
+test(0x0571, 0x0541); // ARMENIAN SMALL LETTER JA, ARMENIAN CAPITAL LETTER JA
+test(0x0572, 0x0542); // ARMENIAN SMALL LETTER GHAD (ARMENIAN SMALL LETTER LAD), ARMENIAN CAPITAL LETTER GHAD (ARMENIAN CAPITAL LETTER LAD)
+test(0x0573, 0x0543); // ARMENIAN SMALL LETTER CHEH, ARMENIAN CAPITAL LETTER CHEH
+test(0x0574, 0x0544); // ARMENIAN SMALL LETTER MEN, ARMENIAN CAPITAL LETTER MEN
+test(0x0575, 0x0545); // ARMENIAN SMALL LETTER YI, ARMENIAN CAPITAL LETTER YI
+test(0x0576, 0x0546); // ARMENIAN SMALL LETTER NOW, ARMENIAN CAPITAL LETTER NOW
+test(0x0577, 0x0547); // ARMENIAN SMALL LETTER SHA, ARMENIAN CAPITAL LETTER SHA
+test(0x0578, 0x0548); // ARMENIAN SMALL LETTER VO, ARMENIAN CAPITAL LETTER VO
+test(0x0579, 0x0549); // ARMENIAN SMALL LETTER CHA, ARMENIAN CAPITAL LETTER CHA
+test(0x057A, 0x054A); // ARMENIAN SMALL LETTER PEH, ARMENIAN CAPITAL LETTER PEH
+test(0x057B, 0x054B); // ARMENIAN SMALL LETTER JHEH, ARMENIAN CAPITAL LETTER JHEH
+test(0x057C, 0x054C); // ARMENIAN SMALL LETTER RA, ARMENIAN CAPITAL LETTER RA
+test(0x057D, 0x054D); // ARMENIAN SMALL LETTER SEH, ARMENIAN CAPITAL LETTER SEH
+test(0x057E, 0x054E); // ARMENIAN SMALL LETTER VEW, ARMENIAN CAPITAL LETTER VEW
+test(0x057F, 0x054F); // ARMENIAN SMALL LETTER TIWN, ARMENIAN CAPITAL LETTER TIWN
+test(0x0580, 0x0550); // ARMENIAN SMALL LETTER REH, ARMENIAN CAPITAL LETTER REH
+test(0x0581, 0x0551); // ARMENIAN SMALL LETTER CO, ARMENIAN CAPITAL LETTER CO
+test(0x0582, 0x0552); // ARMENIAN SMALL LETTER YIWN, ARMENIAN CAPITAL LETTER YIWN
+test(0x0583, 0x0553); // ARMENIAN SMALL LETTER PIWR, ARMENIAN CAPITAL LETTER PIWR
+test(0x0584, 0x0554); // ARMENIAN SMALL LETTER KEH, ARMENIAN CAPITAL LETTER KEH
+test(0x0585, 0x0555); // ARMENIAN SMALL LETTER OH, ARMENIAN CAPITAL LETTER OH
+test(0x0586, 0x0556); // ARMENIAN SMALL LETTER FEH, ARMENIAN CAPITAL LETTER FEH
+test(0x10A0, 0x2D00); // GEORGIAN CAPITAL LETTER AN, GEORGIAN SMALL LETTER AN
+test(0x10A1, 0x2D01); // GEORGIAN CAPITAL LETTER BAN, GEORGIAN SMALL LETTER BAN
+test(0x10A2, 0x2D02); // GEORGIAN CAPITAL LETTER GAN, GEORGIAN SMALL LETTER GAN
+test(0x10A3, 0x2D03); // GEORGIAN CAPITAL LETTER DON, GEORGIAN SMALL LETTER DON
+test(0x10A4, 0x2D04); // GEORGIAN CAPITAL LETTER EN, GEORGIAN SMALL LETTER EN
+test(0x10A5, 0x2D05); // GEORGIAN CAPITAL LETTER VIN, GEORGIAN SMALL LETTER VIN
+test(0x10A6, 0x2D06); // GEORGIAN CAPITAL LETTER ZEN, GEORGIAN SMALL LETTER ZEN
+test(0x10A7, 0x2D07); // GEORGIAN CAPITAL LETTER TAN, GEORGIAN SMALL LETTER TAN
+test(0x10A8, 0x2D08); // GEORGIAN CAPITAL LETTER IN, GEORGIAN SMALL LETTER IN
+test(0x10A9, 0x2D09); // GEORGIAN CAPITAL LETTER KAN, GEORGIAN SMALL LETTER KAN
+test(0x10AA, 0x2D0A); // GEORGIAN CAPITAL LETTER LAS, GEORGIAN SMALL LETTER LAS
+test(0x10AB, 0x2D0B); // GEORGIAN CAPITAL LETTER MAN, GEORGIAN SMALL LETTER MAN
+test(0x10AC, 0x2D0C); // GEORGIAN CAPITAL LETTER NAR, GEORGIAN SMALL LETTER NAR
+test(0x10AD, 0x2D0D); // GEORGIAN CAPITAL LETTER ON, GEORGIAN SMALL LETTER ON
+test(0x10AE, 0x2D0E); // GEORGIAN CAPITAL LETTER PAR, GEORGIAN SMALL LETTER PAR
+test(0x10AF, 0x2D0F); // GEORGIAN CAPITAL LETTER ZHAR, GEORGIAN SMALL LETTER ZHAR
+test(0x10B0, 0x2D10); // GEORGIAN CAPITAL LETTER RAE, GEORGIAN SMALL LETTER RAE
+test(0x10B1, 0x2D11); // GEORGIAN CAPITAL LETTER SAN, GEORGIAN SMALL LETTER SAN
+test(0x10B2, 0x2D12); // GEORGIAN CAPITAL LETTER TAR, GEORGIAN SMALL LETTER TAR
+test(0x10B3, 0x2D13); // GEORGIAN CAPITAL LETTER UN, GEORGIAN SMALL LETTER UN
+test(0x10B4, 0x2D14); // GEORGIAN CAPITAL LETTER PHAR, GEORGIAN SMALL LETTER PHAR
+test(0x10B5, 0x2D15); // GEORGIAN CAPITAL LETTER KHAR, GEORGIAN SMALL LETTER KHAR
+test(0x10B6, 0x2D16); // GEORGIAN CAPITAL LETTER GHAN, GEORGIAN SMALL LETTER GHAN
+test(0x10B7, 0x2D17); // GEORGIAN CAPITAL LETTER QAR, GEORGIAN SMALL LETTER QAR
+test(0x10B8, 0x2D18); // GEORGIAN CAPITAL LETTER SHIN, GEORGIAN SMALL LETTER SHIN
+test(0x10B9, 0x2D19); // GEORGIAN CAPITAL LETTER CHIN, GEORGIAN SMALL LETTER CHIN
+test(0x10BA, 0x2D1A); // GEORGIAN CAPITAL LETTER CAN, GEORGIAN SMALL LETTER CAN
+test(0x10BB, 0x2D1B); // GEORGIAN CAPITAL LETTER JIL, GEORGIAN SMALL LETTER JIL
+test(0x10BC, 0x2D1C); // GEORGIAN CAPITAL LETTER CIL, GEORGIAN SMALL LETTER CIL
+test(0x10BD, 0x2D1D); // GEORGIAN CAPITAL LETTER CHAR, GEORGIAN SMALL LETTER CHAR
+test(0x10BE, 0x2D1E); // GEORGIAN CAPITAL LETTER XAN, GEORGIAN SMALL LETTER XAN
+test(0x10BF, 0x2D1F); // GEORGIAN CAPITAL LETTER JHAN, GEORGIAN SMALL LETTER JHAN
+test(0x10C0, 0x2D20); // GEORGIAN CAPITAL LETTER HAE, GEORGIAN SMALL LETTER HAE
+test(0x10C1, 0x2D21); // GEORGIAN CAPITAL LETTER HE, GEORGIAN SMALL LETTER HE
+test(0x10C2, 0x2D22); // GEORGIAN CAPITAL LETTER HIE, GEORGIAN SMALL LETTER HIE
+test(0x10C3, 0x2D23); // GEORGIAN CAPITAL LETTER WE, GEORGIAN SMALL LETTER WE
+test(0x10C4, 0x2D24); // GEORGIAN CAPITAL LETTER HAR, GEORGIAN SMALL LETTER HAR
+test(0x10C5, 0x2D25); // GEORGIAN CAPITAL LETTER HOE, GEORGIAN SMALL LETTER HOE
+test(0x10C7, 0x2D27); // GEORGIAN CAPITAL LETTER YN, GEORGIAN SMALL LETTER YN
+test(0x10CD, 0x2D2D); // GEORGIAN CAPITAL LETTER AEN, GEORGIAN SMALL LETTER AEN
+test(0x10D0, 0x1C90); // GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN), GEORGIAN MTAVRULI CAPITAL LETTER AN
+test(0x10D1, 0x1C91); // GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN), GEORGIAN MTAVRULI CAPITAL LETTER BAN
+test(0x10D2, 0x1C92); // GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN), GEORGIAN MTAVRULI CAPITAL LETTER GAN
+test(0x10D3, 0x1C93); // GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON), GEORGIAN MTAVRULI CAPITAL LETTER DON
+test(0x10D4, 0x1C94); // GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN), GEORGIAN MTAVRULI CAPITAL LETTER EN
+test(0x10D5, 0x1C95); // GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN), GEORGIAN MTAVRULI CAPITAL LETTER VIN
+test(0x10D6, 0x1C96); // GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN), GEORGIAN MTAVRULI CAPITAL LETTER ZEN
+test(0x10D7, 0x1C97); // GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN), GEORGIAN MTAVRULI CAPITAL LETTER TAN
+test(0x10D8, 0x1C98); // GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN), GEORGIAN MTAVRULI CAPITAL LETTER IN
+test(0x10D9, 0x1C99); // GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN), GEORGIAN MTAVRULI CAPITAL LETTER KAN
+test(0x10DA, 0x1C9A); // GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS), GEORGIAN MTAVRULI CAPITAL LETTER LAS
+test(0x10DB, 0x1C9B); // GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN), GEORGIAN MTAVRULI CAPITAL LETTER MAN
+test(0x10DC, 0x1C9C); // GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR), GEORGIAN MTAVRULI CAPITAL LETTER NAR
+test(0x10DD, 0x1C9D); // GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON), GEORGIAN MTAVRULI CAPITAL LETTER ON
+test(0x10DE, 0x1C9E); // GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR), GEORGIAN MTAVRULI CAPITAL LETTER PAR
+test(0x10DF, 0x1C9F); // GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR), GEORGIAN MTAVRULI CAPITAL LETTER ZHAR
+test(0x10E0, 0x1CA0); // GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE), GEORGIAN MTAVRULI CAPITAL LETTER RAE
+test(0x10E1, 0x1CA1); // GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN), GEORGIAN MTAVRULI CAPITAL LETTER SAN
+test(0x10E2, 0x1CA2); // GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR), GEORGIAN MTAVRULI CAPITAL LETTER TAR
+test(0x10E3, 0x1CA3); // GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN), GEORGIAN MTAVRULI CAPITAL LETTER UN
+test(0x10E4, 0x1CA4); // GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR), GEORGIAN MTAVRULI CAPITAL LETTER PHAR
+test(0x10E5, 0x1CA5); // GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR), GEORGIAN MTAVRULI CAPITAL LETTER KHAR
+test(0x10E6, 0x1CA6); // GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN), GEORGIAN MTAVRULI CAPITAL LETTER GHAN
+test(0x10E7, 0x1CA7); // GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR), GEORGIAN MTAVRULI CAPITAL LETTER QAR
+test(0x10E8, 0x1CA8); // GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN), GEORGIAN MTAVRULI CAPITAL LETTER SHIN
+test(0x10E9, 0x1CA9); // GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN), GEORGIAN MTAVRULI CAPITAL LETTER CHIN
+test(0x10EA, 0x1CAA); // GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN), GEORGIAN MTAVRULI CAPITAL LETTER CAN
+test(0x10EB, 0x1CAB); // GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL), GEORGIAN MTAVRULI CAPITAL LETTER JIL
+test(0x10EC, 0x1CAC); // GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL), GEORGIAN MTAVRULI CAPITAL LETTER CIL
+test(0x10ED, 0x1CAD); // GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR), GEORGIAN MTAVRULI CAPITAL LETTER CHAR
+test(0x10EE, 0x1CAE); // GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN), GEORGIAN MTAVRULI CAPITAL LETTER XAN
+test(0x10EF, 0x1CAF); // GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN), GEORGIAN MTAVRULI CAPITAL LETTER JHAN
+test(0x10F0, 0x1CB0); // GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE), GEORGIAN MTAVRULI CAPITAL LETTER HAE
+test(0x10F1, 0x1CB1); // GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE), GEORGIAN MTAVRULI CAPITAL LETTER HE
+test(0x10F2, 0x1CB2); // GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE), GEORGIAN MTAVRULI CAPITAL LETTER HIE
+test(0x10F3, 0x1CB3); // GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE), GEORGIAN MTAVRULI CAPITAL LETTER WE
+test(0x10F4, 0x1CB4); // GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR), GEORGIAN MTAVRULI CAPITAL LETTER HAR
+test(0x10F5, 0x1CB5); // GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE), GEORGIAN MTAVRULI CAPITAL LETTER HOE
+test(0x10F6, 0x1CB6); // GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI), GEORGIAN MTAVRULI CAPITAL LETTER FI
+test(0x10F7, 0x1CB7); // GEORGIAN LETTER YN, GEORGIAN MTAVRULI CAPITAL LETTER YN
+test(0x10F8, 0x1CB8); // GEORGIAN LETTER ELIFI, GEORGIAN MTAVRULI CAPITAL LETTER ELIFI
+test(0x10F9, 0x1CB9); // GEORGIAN LETTER TURNED GAN, GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN
+test(0x10FA, 0x1CBA); // GEORGIAN LETTER AIN, GEORGIAN MTAVRULI CAPITAL LETTER AIN
+test(0x10FD, 0x1CBD); // GEORGIAN LETTER AEN, GEORGIAN MTAVRULI CAPITAL LETTER AEN
+test(0x10FE, 0x1CBE); // GEORGIAN LETTER HARD SIGN, GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN
+test(0x10FF, 0x1CBF); // GEORGIAN LETTER LABIAL SIGN, GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
+test(0x13A0, 0xAB70); // CHEROKEE LETTER A, CHEROKEE SMALL LETTER A
+test(0x13A1, 0xAB71); // CHEROKEE LETTER E, CHEROKEE SMALL LETTER E
+test(0x13A2, 0xAB72); // CHEROKEE LETTER I, CHEROKEE SMALL LETTER I
+test(0x13A3, 0xAB73); // CHEROKEE LETTER O, CHEROKEE SMALL LETTER O
+test(0x13A4, 0xAB74); // CHEROKEE LETTER U, CHEROKEE SMALL LETTER U
+test(0x13A5, 0xAB75); // CHEROKEE LETTER V, CHEROKEE SMALL LETTER V
+test(0x13A6, 0xAB76); // CHEROKEE LETTER GA, CHEROKEE SMALL LETTER GA
+test(0x13A7, 0xAB77); // CHEROKEE LETTER KA, CHEROKEE SMALL LETTER KA
+test(0x13A8, 0xAB78); // CHEROKEE LETTER GE, CHEROKEE SMALL LETTER GE
+test(0x13A9, 0xAB79); // CHEROKEE LETTER GI, CHEROKEE SMALL LETTER GI
+test(0x13AA, 0xAB7A); // CHEROKEE LETTER GO, CHEROKEE SMALL LETTER GO
+test(0x13AB, 0xAB7B); // CHEROKEE LETTER GU, CHEROKEE SMALL LETTER GU
+test(0x13AC, 0xAB7C); // CHEROKEE LETTER GV, CHEROKEE SMALL LETTER GV
+test(0x13AD, 0xAB7D); // CHEROKEE LETTER HA, CHEROKEE SMALL LETTER HA
+test(0x13AE, 0xAB7E); // CHEROKEE LETTER HE, CHEROKEE SMALL LETTER HE
+test(0x13AF, 0xAB7F); // CHEROKEE LETTER HI, CHEROKEE SMALL LETTER HI
+test(0x13B0, 0xAB80); // CHEROKEE LETTER HO, CHEROKEE SMALL LETTER HO
+test(0x13B1, 0xAB81); // CHEROKEE LETTER HU, CHEROKEE SMALL LETTER HU
+test(0x13B2, 0xAB82); // CHEROKEE LETTER HV, CHEROKEE SMALL LETTER HV
+test(0x13B3, 0xAB83); // CHEROKEE LETTER LA, CHEROKEE SMALL LETTER LA
+test(0x13B4, 0xAB84); // CHEROKEE LETTER LE, CHEROKEE SMALL LETTER LE
+test(0x13B5, 0xAB85); // CHEROKEE LETTER LI, CHEROKEE SMALL LETTER LI
+test(0x13B6, 0xAB86); // CHEROKEE LETTER LO, CHEROKEE SMALL LETTER LO
+test(0x13B7, 0xAB87); // CHEROKEE LETTER LU, CHEROKEE SMALL LETTER LU
+test(0x13B8, 0xAB88); // CHEROKEE LETTER LV, CHEROKEE SMALL LETTER LV
+test(0x13B9, 0xAB89); // CHEROKEE LETTER MA, CHEROKEE SMALL LETTER MA
+test(0x13BA, 0xAB8A); // CHEROKEE LETTER ME, CHEROKEE SMALL LETTER ME
+test(0x13BB, 0xAB8B); // CHEROKEE LETTER MI, CHEROKEE SMALL LETTER MI
+test(0x13BC, 0xAB8C); // CHEROKEE LETTER MO, CHEROKEE SMALL LETTER MO
+test(0x13BD, 0xAB8D); // CHEROKEE LETTER MU, CHEROKEE SMALL LETTER MU
+test(0x13BE, 0xAB8E); // CHEROKEE LETTER NA, CHEROKEE SMALL LETTER NA
+test(0x13BF, 0xAB8F); // CHEROKEE LETTER HNA, CHEROKEE SMALL LETTER HNA
+test(0x13C0, 0xAB90); // CHEROKEE LETTER NAH, CHEROKEE SMALL LETTER NAH
+test(0x13C1, 0xAB91); // CHEROKEE LETTER NE, CHEROKEE SMALL LETTER NE
+test(0x13C2, 0xAB92); // CHEROKEE LETTER NI, CHEROKEE SMALL LETTER NI
+test(0x13C3, 0xAB93); // CHEROKEE LETTER NO, CHEROKEE SMALL LETTER NO
+test(0x13C4, 0xAB94); // CHEROKEE LETTER NU, CHEROKEE SMALL LETTER NU
+test(0x13C5, 0xAB95); // CHEROKEE LETTER NV, CHEROKEE SMALL LETTER NV
+test(0x13C6, 0xAB96); // CHEROKEE LETTER QUA, CHEROKEE SMALL LETTER QUA
+test(0x13C7, 0xAB97); // CHEROKEE LETTER QUE, CHEROKEE SMALL LETTER QUE
+test(0x13C8, 0xAB98); // CHEROKEE LETTER QUI, CHEROKEE SMALL LETTER QUI
+test(0x13C9, 0xAB99); // CHEROKEE LETTER QUO, CHEROKEE SMALL LETTER QUO
+test(0x13CA, 0xAB9A); // CHEROKEE LETTER QUU, CHEROKEE SMALL LETTER QUU
+test(0x13CB, 0xAB9B); // CHEROKEE LETTER QUV, CHEROKEE SMALL LETTER QUV
+test(0x13CC, 0xAB9C); // CHEROKEE LETTER SA, CHEROKEE SMALL LETTER SA
+test(0x13CD, 0xAB9D); // CHEROKEE LETTER S, CHEROKEE SMALL LETTER S
+test(0x13CE, 0xAB9E); // CHEROKEE LETTER SE, CHEROKEE SMALL LETTER SE
+test(0x13CF, 0xAB9F); // CHEROKEE LETTER SI, CHEROKEE SMALL LETTER SI
+test(0x13D0, 0xABA0); // CHEROKEE LETTER SO, CHEROKEE SMALL LETTER SO
+test(0x13D1, 0xABA1); // CHEROKEE LETTER SU, CHEROKEE SMALL LETTER SU
+test(0x13D2, 0xABA2); // CHEROKEE LETTER SV, CHEROKEE SMALL LETTER SV
+test(0x13D3, 0xABA3); // CHEROKEE LETTER DA, CHEROKEE SMALL LETTER DA
+test(0x13D4, 0xABA4); // CHEROKEE LETTER TA, CHEROKEE SMALL LETTER TA
+test(0x13D5, 0xABA5); // CHEROKEE LETTER DE, CHEROKEE SMALL LETTER DE
+test(0x13D6, 0xABA6); // CHEROKEE LETTER TE, CHEROKEE SMALL LETTER TE
+test(0x13D7, 0xABA7); // CHEROKEE LETTER DI, CHEROKEE SMALL LETTER DI
+test(0x13D8, 0xABA8); // CHEROKEE LETTER TI, CHEROKEE SMALL LETTER TI
+test(0x13D9, 0xABA9); // CHEROKEE LETTER DO, CHEROKEE SMALL LETTER DO
+test(0x13DA, 0xABAA); // CHEROKEE LETTER DU, CHEROKEE SMALL LETTER DU
+test(0x13DB, 0xABAB); // CHEROKEE LETTER DV, CHEROKEE SMALL LETTER DV
+test(0x13DC, 0xABAC); // CHEROKEE LETTER DLA, CHEROKEE SMALL LETTER DLA
+test(0x13DD, 0xABAD); // CHEROKEE LETTER TLA, CHEROKEE SMALL LETTER TLA
+test(0x13DE, 0xABAE); // CHEROKEE LETTER TLE, CHEROKEE SMALL LETTER TLE
+test(0x13DF, 0xABAF); // CHEROKEE LETTER TLI, CHEROKEE SMALL LETTER TLI
+test(0x13E0, 0xABB0); // CHEROKEE LETTER TLO, CHEROKEE SMALL LETTER TLO
+test(0x13E1, 0xABB1); // CHEROKEE LETTER TLU, CHEROKEE SMALL LETTER TLU
+test(0x13E2, 0xABB2); // CHEROKEE LETTER TLV, CHEROKEE SMALL LETTER TLV
+test(0x13E3, 0xABB3); // CHEROKEE LETTER TSA, CHEROKEE SMALL LETTER TSA
+test(0x13E4, 0xABB4); // CHEROKEE LETTER TSE, CHEROKEE SMALL LETTER TSE
+test(0x13E5, 0xABB5); // CHEROKEE LETTER TSI, CHEROKEE SMALL LETTER TSI
+test(0x13E6, 0xABB6); // CHEROKEE LETTER TSO, CHEROKEE SMALL LETTER TSO
+test(0x13E7, 0xABB7); // CHEROKEE LETTER TSU, CHEROKEE SMALL LETTER TSU
+test(0x13E8, 0xABB8); // CHEROKEE LETTER TSV, CHEROKEE SMALL LETTER TSV
+test(0x13E9, 0xABB9); // CHEROKEE LETTER WA, CHEROKEE SMALL LETTER WA
+test(0x13EA, 0xABBA); // CHEROKEE LETTER WE, CHEROKEE SMALL LETTER WE
+test(0x13EB, 0xABBB); // CHEROKEE LETTER WI, CHEROKEE SMALL LETTER WI
+test(0x13EC, 0xABBC); // CHEROKEE LETTER WO, CHEROKEE SMALL LETTER WO
+test(0x13ED, 0xABBD); // CHEROKEE LETTER WU, CHEROKEE SMALL LETTER WU
+test(0x13EE, 0xABBE); // CHEROKEE LETTER WV, CHEROKEE SMALL LETTER WV
+test(0x13EF, 0xABBF); // CHEROKEE LETTER YA, CHEROKEE SMALL LETTER YA
+test(0x13F0, 0x13F8); // CHEROKEE LETTER YE, CHEROKEE SMALL LETTER YE
+test(0x13F1, 0x13F9); // CHEROKEE LETTER YI, CHEROKEE SMALL LETTER YI
+test(0x13F2, 0x13FA); // CHEROKEE LETTER YO, CHEROKEE SMALL LETTER YO
+test(0x13F3, 0x13FB); // CHEROKEE LETTER YU, CHEROKEE SMALL LETTER YU
+test(0x13F4, 0x13FC); // CHEROKEE LETTER YV, CHEROKEE SMALL LETTER YV
+test(0x13F5, 0x13FD); // CHEROKEE LETTER MV, CHEROKEE SMALL LETTER MV
+test(0x13F8, 0x13F0); // CHEROKEE SMALL LETTER YE, CHEROKEE LETTER YE
+test(0x13F9, 0x13F1); // CHEROKEE SMALL LETTER YI, CHEROKEE LETTER YI
+test(0x13FA, 0x13F2); // CHEROKEE SMALL LETTER YO, CHEROKEE LETTER YO
+test(0x13FB, 0x13F3); // CHEROKEE SMALL LETTER YU, CHEROKEE LETTER YU
+test(0x13FC, 0x13F4); // CHEROKEE SMALL LETTER YV, CHEROKEE LETTER YV
+test(0x13FD, 0x13F5); // CHEROKEE SMALL LETTER MV, CHEROKEE LETTER MV
+test(0x1C80, 0x0432, 0x0412); // CYRILLIC SMALL LETTER ROUNDED VE, CYRILLIC SMALL LETTER VE, CYRILLIC CAPITAL LETTER VE
+test(0x1C81, 0x0434, 0x0414); // CYRILLIC SMALL LETTER LONG-LEGGED DE, CYRILLIC SMALL LETTER DE, CYRILLIC CAPITAL LETTER DE
+test(0x1C82, 0x043E, 0x041E); // CYRILLIC SMALL LETTER NARROW O, CYRILLIC SMALL LETTER O, CYRILLIC CAPITAL LETTER O
+test(0x1C83, 0x0441, 0x0421); // CYRILLIC SMALL LETTER WIDE ES, CYRILLIC SMALL LETTER ES, CYRILLIC CAPITAL LETTER ES
+test(0x1C84, 0x0442, 0x0422, 0x1C85); // CYRILLIC SMALL LETTER TALL TE, CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER THREE-LEGGED TE
+test(0x1C85, 0x0442, 0x0422, 0x1C84); // CYRILLIC SMALL LETTER THREE-LEGGED TE, CYRILLIC SMALL LETTER TE, CYRILLIC CAPITAL LETTER TE, CYRILLIC SMALL LETTER TALL TE
+test(0x1C86, 0x044A, 0x042A); // CYRILLIC SMALL LETTER TALL HARD SIGN, CYRILLIC SMALL LETTER HARD SIGN, CYRILLIC CAPITAL LETTER HARD SIGN
+test(0x1C87, 0x0463, 0x0462); // CYRILLIC SMALL LETTER TALL YAT, CYRILLIC SMALL LETTER YAT, CYRILLIC CAPITAL LETTER YAT
+test(0x1C88, 0xA64B, 0xA64A); // CYRILLIC SMALL LETTER UNBLENDED UK, CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC CAPITAL LETTER MONOGRAPH UK
+test(0x1C90, 0x10D0); // GEORGIAN MTAVRULI CAPITAL LETTER AN, GEORGIAN LETTER AN (GEORGIAN SMALL LETTER AN)
+test(0x1C91, 0x10D1); // GEORGIAN MTAVRULI CAPITAL LETTER BAN, GEORGIAN LETTER BAN (GEORGIAN SMALL LETTER BAN)
+test(0x1C92, 0x10D2); // GEORGIAN MTAVRULI CAPITAL LETTER GAN, GEORGIAN LETTER GAN (GEORGIAN SMALL LETTER GAN)
+test(0x1C93, 0x10D3); // GEORGIAN MTAVRULI CAPITAL LETTER DON, GEORGIAN LETTER DON (GEORGIAN SMALL LETTER DON)
+test(0x1C94, 0x10D4); // GEORGIAN MTAVRULI CAPITAL LETTER EN, GEORGIAN LETTER EN (GEORGIAN SMALL LETTER EN)
+test(0x1C95, 0x10D5); // GEORGIAN MTAVRULI CAPITAL LETTER VIN, GEORGIAN LETTER VIN (GEORGIAN SMALL LETTER VIN)
+test(0x1C96, 0x10D6); // GEORGIAN MTAVRULI CAPITAL LETTER ZEN, GEORGIAN LETTER ZEN (GEORGIAN SMALL LETTER ZEN)
+test(0x1C97, 0x10D7); // GEORGIAN MTAVRULI CAPITAL LETTER TAN, GEORGIAN LETTER TAN (GEORGIAN SMALL LETTER TAN)
+test(0x1C98, 0x10D8); // GEORGIAN MTAVRULI CAPITAL LETTER IN, GEORGIAN LETTER IN (GEORGIAN SMALL LETTER IN)
+test(0x1C99, 0x10D9); // GEORGIAN MTAVRULI CAPITAL LETTER KAN, GEORGIAN LETTER KAN (GEORGIAN SMALL LETTER KAN)
+test(0x1C9A, 0x10DA); // GEORGIAN MTAVRULI CAPITAL LETTER LAS, GEORGIAN LETTER LAS (GEORGIAN SMALL LETTER LAS)
+test(0x1C9B, 0x10DB); // GEORGIAN MTAVRULI CAPITAL LETTER MAN, GEORGIAN LETTER MAN (GEORGIAN SMALL LETTER MAN)
+test(0x1C9C, 0x10DC); // GEORGIAN MTAVRULI CAPITAL LETTER NAR, GEORGIAN LETTER NAR (GEORGIAN SMALL LETTER NAR)
+test(0x1C9D, 0x10DD); // GEORGIAN MTAVRULI CAPITAL LETTER ON, GEORGIAN LETTER ON (GEORGIAN SMALL LETTER ON)
+test(0x1C9E, 0x10DE); // GEORGIAN MTAVRULI CAPITAL LETTER PAR, GEORGIAN LETTER PAR (GEORGIAN SMALL LETTER PAR)
+test(0x1C9F, 0x10DF); // GEORGIAN MTAVRULI CAPITAL LETTER ZHAR, GEORGIAN LETTER ZHAR (GEORGIAN SMALL LETTER ZHAR)
+test(0x1CA0, 0x10E0); // GEORGIAN MTAVRULI CAPITAL LETTER RAE, GEORGIAN LETTER RAE (GEORGIAN SMALL LETTER RAE)
+test(0x1CA1, 0x10E1); // GEORGIAN MTAVRULI CAPITAL LETTER SAN, GEORGIAN LETTER SAN (GEORGIAN SMALL LETTER SAN)
+test(0x1CA2, 0x10E2); // GEORGIAN MTAVRULI CAPITAL LETTER TAR, GEORGIAN LETTER TAR (GEORGIAN SMALL LETTER TAR)
+test(0x1CA3, 0x10E3); // GEORGIAN MTAVRULI CAPITAL LETTER UN, GEORGIAN LETTER UN (GEORGIAN SMALL LETTER UN)
+test(0x1CA4, 0x10E4); // GEORGIAN MTAVRULI CAPITAL LETTER PHAR, GEORGIAN LETTER PHAR (GEORGIAN SMALL LETTER PHAR)
+test(0x1CA5, 0x10E5); // GEORGIAN MTAVRULI CAPITAL LETTER KHAR, GEORGIAN LETTER KHAR (GEORGIAN SMALL LETTER KHAR)
+test(0x1CA6, 0x10E6); // GEORGIAN MTAVRULI CAPITAL LETTER GHAN, GEORGIAN LETTER GHAN (GEORGIAN SMALL LETTER GHAN)
+test(0x1CA7, 0x10E7); // GEORGIAN MTAVRULI CAPITAL LETTER QAR, GEORGIAN LETTER QAR (GEORGIAN SMALL LETTER QAR)
+test(0x1CA8, 0x10E8); // GEORGIAN MTAVRULI CAPITAL LETTER SHIN, GEORGIAN LETTER SHIN (GEORGIAN SMALL LETTER SHIN)
+test(0x1CA9, 0x10E9); // GEORGIAN MTAVRULI CAPITAL LETTER CHIN, GEORGIAN LETTER CHIN (GEORGIAN SMALL LETTER CHIN)
+test(0x1CAA, 0x10EA); // GEORGIAN MTAVRULI CAPITAL LETTER CAN, GEORGIAN LETTER CAN (GEORGIAN SMALL LETTER CAN)
+test(0x1CAB, 0x10EB); // GEORGIAN MTAVRULI CAPITAL LETTER JIL, GEORGIAN LETTER JIL (GEORGIAN SMALL LETTER JIL)
+test(0x1CAC, 0x10EC); // GEORGIAN MTAVRULI CAPITAL LETTER CIL, GEORGIAN LETTER CIL (GEORGIAN SMALL LETTER CIL)
+test(0x1CAD, 0x10ED); // GEORGIAN MTAVRULI CAPITAL LETTER CHAR, GEORGIAN LETTER CHAR (GEORGIAN SMALL LETTER CHAR)
+test(0x1CAE, 0x10EE); // GEORGIAN MTAVRULI CAPITAL LETTER XAN, GEORGIAN LETTER XAN (GEORGIAN SMALL LETTER XAN)
+test(0x1CAF, 0x10EF); // GEORGIAN MTAVRULI CAPITAL LETTER JHAN, GEORGIAN LETTER JHAN (GEORGIAN SMALL LETTER JHAN)
+test(0x1CB0, 0x10F0); // GEORGIAN MTAVRULI CAPITAL LETTER HAE, GEORGIAN LETTER HAE (GEORGIAN SMALL LETTER HAE)
+test(0x1CB1, 0x10F1); // GEORGIAN MTAVRULI CAPITAL LETTER HE, GEORGIAN LETTER HE (GEORGIAN SMALL LETTER HE)
+test(0x1CB2, 0x10F2); // GEORGIAN MTAVRULI CAPITAL LETTER HIE, GEORGIAN LETTER HIE (GEORGIAN SMALL LETTER HIE)
+test(0x1CB3, 0x10F3); // GEORGIAN MTAVRULI CAPITAL LETTER WE, GEORGIAN LETTER WE (GEORGIAN SMALL LETTER WE)
+test(0x1CB4, 0x10F4); // GEORGIAN MTAVRULI CAPITAL LETTER HAR, GEORGIAN LETTER HAR (GEORGIAN SMALL LETTER HAR)
+test(0x1CB5, 0x10F5); // GEORGIAN MTAVRULI CAPITAL LETTER HOE, GEORGIAN LETTER HOE (GEORGIAN SMALL LETTER HOE)
+test(0x1CB6, 0x10F6); // GEORGIAN MTAVRULI CAPITAL LETTER FI, GEORGIAN LETTER FI (GEORGIAN SMALL LETTER FI)
+test(0x1CB7, 0x10F7); // GEORGIAN MTAVRULI CAPITAL LETTER YN, GEORGIAN LETTER YN
+test(0x1CB8, 0x10F8); // GEORGIAN MTAVRULI CAPITAL LETTER ELIFI, GEORGIAN LETTER ELIFI
+test(0x1CB9, 0x10F9); // GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN, GEORGIAN LETTER TURNED GAN
+test(0x1CBA, 0x10FA); // GEORGIAN MTAVRULI CAPITAL LETTER AIN, GEORGIAN LETTER AIN
+test(0x1CBD, 0x10FD); // GEORGIAN MTAVRULI CAPITAL LETTER AEN, GEORGIAN LETTER AEN
+test(0x1CBE, 0x10FE); // GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN, GEORGIAN LETTER HARD SIGN
+test(0x1CBF, 0x10FF); // GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN, GEORGIAN LETTER LABIAL SIGN
+test(0x1D79, 0xA77D); // LATIN SMALL LETTER INSULAR G, LATIN CAPITAL LETTER INSULAR G
+test(0x1D7D, 0x2C63); // LATIN SMALL LETTER P WITH STROKE, LATIN CAPITAL LETTER P WITH STROKE
+test(0x1E00, 0x1E01); // LATIN CAPITAL LETTER A WITH RING BELOW, LATIN SMALL LETTER A WITH RING BELOW
+test(0x1E01, 0x1E00); // LATIN SMALL LETTER A WITH RING BELOW, LATIN CAPITAL LETTER A WITH RING BELOW
+test(0x1E02, 0x1E03); // LATIN CAPITAL LETTER B WITH DOT ABOVE, LATIN SMALL LETTER B WITH DOT ABOVE
+test(0x1E03, 0x1E02); // LATIN SMALL LETTER B WITH DOT ABOVE, LATIN CAPITAL LETTER B WITH DOT ABOVE
+test(0x1E04, 0x1E05); // LATIN CAPITAL LETTER B WITH DOT BELOW, LATIN SMALL LETTER B WITH DOT BELOW
+test(0x1E05, 0x1E04); // LATIN SMALL LETTER B WITH DOT BELOW, LATIN CAPITAL LETTER B WITH DOT BELOW
+test(0x1E06, 0x1E07); // LATIN CAPITAL LETTER B WITH LINE BELOW, LATIN SMALL LETTER B WITH LINE BELOW
+test(0x1E07, 0x1E06); // LATIN SMALL LETTER B WITH LINE BELOW, LATIN CAPITAL LETTER B WITH LINE BELOW
+test(0x1E08, 0x1E09); // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE, LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+test(0x1E09, 0x1E08); // LATIN SMALL LETTER C WITH CEDILLA AND ACUTE, LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+test(0x1E0A, 0x1E0B); // LATIN CAPITAL LETTER D WITH DOT ABOVE, LATIN SMALL LETTER D WITH DOT ABOVE
+test(0x1E0B, 0x1E0A); // LATIN SMALL LETTER D WITH DOT ABOVE, LATIN CAPITAL LETTER D WITH DOT ABOVE
+test(0x1E0C, 0x1E0D); // LATIN CAPITAL LETTER D WITH DOT BELOW, LATIN SMALL LETTER D WITH DOT BELOW
+test(0x1E0D, 0x1E0C); // LATIN SMALL LETTER D WITH DOT BELOW, LATIN CAPITAL LETTER D WITH DOT BELOW
+test(0x1E0E, 0x1E0F); // LATIN CAPITAL LETTER D WITH LINE BELOW, LATIN SMALL LETTER D WITH LINE BELOW
+test(0x1E0F, 0x1E0E); // LATIN SMALL LETTER D WITH LINE BELOW, LATIN CAPITAL LETTER D WITH LINE BELOW
+test(0x1E10, 0x1E11); // LATIN CAPITAL LETTER D WITH CEDILLA, LATIN SMALL LETTER D WITH CEDILLA
+test(0x1E11, 0x1E10); // LATIN SMALL LETTER D WITH CEDILLA, LATIN CAPITAL LETTER D WITH CEDILLA
+test(0x1E12, 0x1E13); // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+test(0x1E13, 0x1E12); // LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+test(0x1E14, 0x1E15); // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE, LATIN SMALL LETTER E WITH MACRON AND GRAVE
+test(0x1E15, 0x1E14); // LATIN SMALL LETTER E WITH MACRON AND GRAVE, LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+test(0x1E16, 0x1E17); // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE, LATIN SMALL LETTER E WITH MACRON AND ACUTE
+test(0x1E17, 0x1E16); // LATIN SMALL LETTER E WITH MACRON AND ACUTE, LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+test(0x1E18, 0x1E19); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+test(0x1E19, 0x1E18); // LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+test(0x1E1A, 0x1E1B); // LATIN CAPITAL LETTER E WITH TILDE BELOW, LATIN SMALL LETTER E WITH TILDE BELOW
+test(0x1E1B, 0x1E1A); // LATIN SMALL LETTER E WITH TILDE BELOW, LATIN CAPITAL LETTER E WITH TILDE BELOW
+test(0x1E1C, 0x1E1D); // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE, LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+test(0x1E1D, 0x1E1C); // LATIN SMALL LETTER E WITH CEDILLA AND BREVE, LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+test(0x1E1E, 0x1E1F); // LATIN CAPITAL LETTER F WITH DOT ABOVE, LATIN SMALL LETTER F WITH DOT ABOVE
+test(0x1E1F, 0x1E1E); // LATIN SMALL LETTER F WITH DOT ABOVE, LATIN CAPITAL LETTER F WITH DOT ABOVE
+test(0x1E20, 0x1E21); // LATIN CAPITAL LETTER G WITH MACRON, LATIN SMALL LETTER G WITH MACRON
+test(0x1E21, 0x1E20); // LATIN SMALL LETTER G WITH MACRON, LATIN CAPITAL LETTER G WITH MACRON
+test(0x1E22, 0x1E23); // LATIN CAPITAL LETTER H WITH DOT ABOVE, LATIN SMALL LETTER H WITH DOT ABOVE
+test(0x1E23, 0x1E22); // LATIN SMALL LETTER H WITH DOT ABOVE, LATIN CAPITAL LETTER H WITH DOT ABOVE
+test(0x1E24, 0x1E25); // LATIN CAPITAL LETTER H WITH DOT BELOW, LATIN SMALL LETTER H WITH DOT BELOW
+test(0x1E25, 0x1E24); // LATIN SMALL LETTER H WITH DOT BELOW, LATIN CAPITAL LETTER H WITH DOT BELOW
+test(0x1E26, 0x1E27); // LATIN CAPITAL LETTER H WITH DIAERESIS, LATIN SMALL LETTER H WITH DIAERESIS
+test(0x1E27, 0x1E26); // LATIN SMALL LETTER H WITH DIAERESIS, LATIN CAPITAL LETTER H WITH DIAERESIS
+test(0x1E28, 0x1E29); // LATIN CAPITAL LETTER H WITH CEDILLA, LATIN SMALL LETTER H WITH CEDILLA
+test(0x1E29, 0x1E28); // LATIN SMALL LETTER H WITH CEDILLA, LATIN CAPITAL LETTER H WITH CEDILLA
+test(0x1E2A, 0x1E2B); // LATIN CAPITAL LETTER H WITH BREVE BELOW, LATIN SMALL LETTER H WITH BREVE BELOW
+test(0x1E2B, 0x1E2A); // LATIN SMALL LETTER H WITH BREVE BELOW, LATIN CAPITAL LETTER H WITH BREVE BELOW
+test(0x1E2C, 0x1E2D); // LATIN CAPITAL LETTER I WITH TILDE BELOW, LATIN SMALL LETTER I WITH TILDE BELOW
+test(0x1E2D, 0x1E2C); // LATIN SMALL LETTER I WITH TILDE BELOW, LATIN CAPITAL LETTER I WITH TILDE BELOW
+test(0x1E2E, 0x1E2F); // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE, LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+test(0x1E2F, 0x1E2E); // LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE, LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+test(0x1E30, 0x1E31); // LATIN CAPITAL LETTER K WITH ACUTE, LATIN SMALL LETTER K WITH ACUTE
+test(0x1E31, 0x1E30); // LATIN SMALL LETTER K WITH ACUTE, LATIN CAPITAL LETTER K WITH ACUTE
+test(0x1E32, 0x1E33); // LATIN CAPITAL LETTER K WITH DOT BELOW, LATIN SMALL LETTER K WITH DOT BELOW
+test(0x1E33, 0x1E32); // LATIN SMALL LETTER K WITH DOT BELOW, LATIN CAPITAL LETTER K WITH DOT BELOW
+test(0x1E34, 0x1E35); // LATIN CAPITAL LETTER K WITH LINE BELOW, LATIN SMALL LETTER K WITH LINE BELOW
+test(0x1E35, 0x1E34); // LATIN SMALL LETTER K WITH LINE BELOW, LATIN CAPITAL LETTER K WITH LINE BELOW
+test(0x1E36, 0x1E37); // LATIN CAPITAL LETTER L WITH DOT BELOW, LATIN SMALL LETTER L WITH DOT BELOW
+test(0x1E37, 0x1E36); // LATIN SMALL LETTER L WITH DOT BELOW, LATIN CAPITAL LETTER L WITH DOT BELOW
+test(0x1E38, 0x1E39); // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON, LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+test(0x1E39, 0x1E38); // LATIN SMALL LETTER L WITH DOT BELOW AND MACRON, LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+test(0x1E3A, 0x1E3B); // LATIN CAPITAL LETTER L WITH LINE BELOW, LATIN SMALL LETTER L WITH LINE BELOW
+test(0x1E3B, 0x1E3A); // LATIN SMALL LETTER L WITH LINE BELOW, LATIN CAPITAL LETTER L WITH LINE BELOW
+test(0x1E3C, 0x1E3D); // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+test(0x1E3D, 0x1E3C); // LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+test(0x1E3E, 0x1E3F); // LATIN CAPITAL LETTER M WITH ACUTE, LATIN SMALL LETTER M WITH ACUTE
+test(0x1E3F, 0x1E3E); // LATIN SMALL LETTER M WITH ACUTE, LATIN CAPITAL LETTER M WITH ACUTE
+test(0x1E40, 0x1E41); // LATIN CAPITAL LETTER M WITH DOT ABOVE, LATIN SMALL LETTER M WITH DOT ABOVE
+test(0x1E41, 0x1E40); // LATIN SMALL LETTER M WITH DOT ABOVE, LATIN CAPITAL LETTER M WITH DOT ABOVE
+test(0x1E42, 0x1E43); // LATIN CAPITAL LETTER M WITH DOT BELOW, LATIN SMALL LETTER M WITH DOT BELOW
+test(0x1E43, 0x1E42); // LATIN SMALL LETTER M WITH DOT BELOW, LATIN CAPITAL LETTER M WITH DOT BELOW
+test(0x1E44, 0x1E45); // LATIN CAPITAL LETTER N WITH DOT ABOVE, LATIN SMALL LETTER N WITH DOT ABOVE
+test(0x1E45, 0x1E44); // LATIN SMALL LETTER N WITH DOT ABOVE, LATIN CAPITAL LETTER N WITH DOT ABOVE
+test(0x1E46, 0x1E47); // LATIN CAPITAL LETTER N WITH DOT BELOW, LATIN SMALL LETTER N WITH DOT BELOW
+test(0x1E47, 0x1E46); // LATIN SMALL LETTER N WITH DOT BELOW, LATIN CAPITAL LETTER N WITH DOT BELOW
+test(0x1E48, 0x1E49); // LATIN CAPITAL LETTER N WITH LINE BELOW, LATIN SMALL LETTER N WITH LINE BELOW
+test(0x1E49, 0x1E48); // LATIN SMALL LETTER N WITH LINE BELOW, LATIN CAPITAL LETTER N WITH LINE BELOW
+test(0x1E4A, 0x1E4B); // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+test(0x1E4B, 0x1E4A); // LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+test(0x1E4C, 0x1E4D); // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE, LATIN SMALL LETTER O WITH TILDE AND ACUTE
+test(0x1E4D, 0x1E4C); // LATIN SMALL LETTER O WITH TILDE AND ACUTE, LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+test(0x1E4E, 0x1E4F); // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS, LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+test(0x1E4F, 0x1E4E); // LATIN SMALL LETTER O WITH TILDE AND DIAERESIS, LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+test(0x1E50, 0x1E51); // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE, LATIN SMALL LETTER O WITH MACRON AND GRAVE
+test(0x1E51, 0x1E50); // LATIN SMALL LETTER O WITH MACRON AND GRAVE, LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+test(0x1E52, 0x1E53); // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE, LATIN SMALL LETTER O WITH MACRON AND ACUTE
+test(0x1E53, 0x1E52); // LATIN SMALL LETTER O WITH MACRON AND ACUTE, LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+test(0x1E54, 0x1E55); // LATIN CAPITAL LETTER P WITH ACUTE, LATIN SMALL LETTER P WITH ACUTE
+test(0x1E55, 0x1E54); // LATIN SMALL LETTER P WITH ACUTE, LATIN CAPITAL LETTER P WITH ACUTE
+test(0x1E56, 0x1E57); // LATIN CAPITAL LETTER P WITH DOT ABOVE, LATIN SMALL LETTER P WITH DOT ABOVE
+test(0x1E57, 0x1E56); // LATIN SMALL LETTER P WITH DOT ABOVE, LATIN CAPITAL LETTER P WITH DOT ABOVE
+test(0x1E58, 0x1E59); // LATIN CAPITAL LETTER R WITH DOT ABOVE, LATIN SMALL LETTER R WITH DOT ABOVE
+test(0x1E59, 0x1E58); // LATIN SMALL LETTER R WITH DOT ABOVE, LATIN CAPITAL LETTER R WITH DOT ABOVE
+test(0x1E5A, 0x1E5B); // LATIN CAPITAL LETTER R WITH DOT BELOW, LATIN SMALL LETTER R WITH DOT BELOW
+test(0x1E5B, 0x1E5A); // LATIN SMALL LETTER R WITH DOT BELOW, LATIN CAPITAL LETTER R WITH DOT BELOW
+test(0x1E5C, 0x1E5D); // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON, LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+test(0x1E5D, 0x1E5C); // LATIN SMALL LETTER R WITH DOT BELOW AND MACRON, LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+test(0x1E5E, 0x1E5F); // LATIN CAPITAL LETTER R WITH LINE BELOW, LATIN SMALL LETTER R WITH LINE BELOW
+test(0x1E5F, 0x1E5E); // LATIN SMALL LETTER R WITH LINE BELOW, LATIN CAPITAL LETTER R WITH LINE BELOW
+test(0x1E60, 0x1E61, 0x1E9B); // LATIN CAPITAL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE
+test(0x1E61, 0x1E60, 0x1E9B); // LATIN SMALL LETTER S WITH DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE
+test(0x1E62, 0x1E63); // LATIN CAPITAL LETTER S WITH DOT BELOW, LATIN SMALL LETTER S WITH DOT BELOW
+test(0x1E63, 0x1E62); // LATIN SMALL LETTER S WITH DOT BELOW, LATIN CAPITAL LETTER S WITH DOT BELOW
+test(0x1E64, 0x1E65); // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE, LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+test(0x1E65, 0x1E64); // LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE, LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+test(0x1E66, 0x1E67); // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE, LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+test(0x1E67, 0x1E66); // LATIN SMALL LETTER S WITH CARON AND DOT ABOVE, LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+test(0x1E68, 0x1E69); // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE, LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+test(0x1E69, 0x1E68); // LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+test(0x1E6A, 0x1E6B); // LATIN CAPITAL LETTER T WITH DOT ABOVE, LATIN SMALL LETTER T WITH DOT ABOVE
+test(0x1E6B, 0x1E6A); // LATIN SMALL LETTER T WITH DOT ABOVE, LATIN CAPITAL LETTER T WITH DOT ABOVE
+test(0x1E6C, 0x1E6D); // LATIN CAPITAL LETTER T WITH DOT BELOW, LATIN SMALL LETTER T WITH DOT BELOW
+test(0x1E6D, 0x1E6C); // LATIN SMALL LETTER T WITH DOT BELOW, LATIN CAPITAL LETTER T WITH DOT BELOW
+test(0x1E6E, 0x1E6F); // LATIN CAPITAL LETTER T WITH LINE BELOW, LATIN SMALL LETTER T WITH LINE BELOW
+test(0x1E6F, 0x1E6E); // LATIN SMALL LETTER T WITH LINE BELOW, LATIN CAPITAL LETTER T WITH LINE BELOW
+test(0x1E70, 0x1E71); // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+test(0x1E71, 0x1E70); // LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+test(0x1E72, 0x1E73); // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW, LATIN SMALL LETTER U WITH DIAERESIS BELOW
+test(0x1E73, 0x1E72); // LATIN SMALL LETTER U WITH DIAERESIS BELOW, LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+test(0x1E74, 0x1E75); // LATIN CAPITAL LETTER U WITH TILDE BELOW, LATIN SMALL LETTER U WITH TILDE BELOW
+test(0x1E75, 0x1E74); // LATIN SMALL LETTER U WITH TILDE BELOW, LATIN CAPITAL LETTER U WITH TILDE BELOW
+test(0x1E76, 0x1E77); // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+test(0x1E77, 0x1E76); // LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW, LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+test(0x1E78, 0x1E79); // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE, LATIN SMALL LETTER U WITH TILDE AND ACUTE
+test(0x1E79, 0x1E78); // LATIN SMALL LETTER U WITH TILDE AND ACUTE, LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+test(0x1E7A, 0x1E7B); // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS, LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+test(0x1E7B, 0x1E7A); // LATIN SMALL LETTER U WITH MACRON AND DIAERESIS, LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+test(0x1E7C, 0x1E7D); // LATIN CAPITAL LETTER V WITH TILDE, LATIN SMALL LETTER V WITH TILDE
+test(0x1E7D, 0x1E7C); // LATIN SMALL LETTER V WITH TILDE, LATIN CAPITAL LETTER V WITH TILDE
+test(0x1E7E, 0x1E7F); // LATIN CAPITAL LETTER V WITH DOT BELOW, LATIN SMALL LETTER V WITH DOT BELOW
+test(0x1E7F, 0x1E7E); // LATIN SMALL LETTER V WITH DOT BELOW, LATIN CAPITAL LETTER V WITH DOT BELOW
+test(0x1E80, 0x1E81); // LATIN CAPITAL LETTER W WITH GRAVE, LATIN SMALL LETTER W WITH GRAVE
+test(0x1E81, 0x1E80); // LATIN SMALL LETTER W WITH GRAVE, LATIN CAPITAL LETTER W WITH GRAVE
+test(0x1E82, 0x1E83); // LATIN CAPITAL LETTER W WITH ACUTE, LATIN SMALL LETTER W WITH ACUTE
+test(0x1E83, 0x1E82); // LATIN SMALL LETTER W WITH ACUTE, LATIN CAPITAL LETTER W WITH ACUTE
+test(0x1E84, 0x1E85); // LATIN CAPITAL LETTER W WITH DIAERESIS, LATIN SMALL LETTER W WITH DIAERESIS
+test(0x1E85, 0x1E84); // LATIN SMALL LETTER W WITH DIAERESIS, LATIN CAPITAL LETTER W WITH DIAERESIS
+test(0x1E86, 0x1E87); // LATIN CAPITAL LETTER W WITH DOT ABOVE, LATIN SMALL LETTER W WITH DOT ABOVE
+test(0x1E87, 0x1E86); // LATIN SMALL LETTER W WITH DOT ABOVE, LATIN CAPITAL LETTER W WITH DOT ABOVE
+test(0x1E88, 0x1E89); // LATIN CAPITAL LETTER W WITH DOT BELOW, LATIN SMALL LETTER W WITH DOT BELOW
+test(0x1E89, 0x1E88); // LATIN SMALL LETTER W WITH DOT BELOW, LATIN CAPITAL LETTER W WITH DOT BELOW
+test(0x1E8A, 0x1E8B); // LATIN CAPITAL LETTER X WITH DOT ABOVE, LATIN SMALL LETTER X WITH DOT ABOVE
+test(0x1E8B, 0x1E8A); // LATIN SMALL LETTER X WITH DOT ABOVE, LATIN CAPITAL LETTER X WITH DOT ABOVE
+test(0x1E8C, 0x1E8D); // LATIN CAPITAL LETTER X WITH DIAERESIS, LATIN SMALL LETTER X WITH DIAERESIS
+test(0x1E8D, 0x1E8C); // LATIN SMALL LETTER X WITH DIAERESIS, LATIN CAPITAL LETTER X WITH DIAERESIS
+test(0x1E8E, 0x1E8F); // LATIN CAPITAL LETTER Y WITH DOT ABOVE, LATIN SMALL LETTER Y WITH DOT ABOVE
+test(0x1E8F, 0x1E8E); // LATIN SMALL LETTER Y WITH DOT ABOVE, LATIN CAPITAL LETTER Y WITH DOT ABOVE
+test(0x1E90, 0x1E91); // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX, LATIN SMALL LETTER Z WITH CIRCUMFLEX
+test(0x1E91, 0x1E90); // LATIN SMALL LETTER Z WITH CIRCUMFLEX, LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+test(0x1E92, 0x1E93); // LATIN CAPITAL LETTER Z WITH DOT BELOW, LATIN SMALL LETTER Z WITH DOT BELOW
+test(0x1E93, 0x1E92); // LATIN SMALL LETTER Z WITH DOT BELOW, LATIN CAPITAL LETTER Z WITH DOT BELOW
+test(0x1E94, 0x1E95); // LATIN CAPITAL LETTER Z WITH LINE BELOW, LATIN SMALL LETTER Z WITH LINE BELOW
+test(0x1E95, 0x1E94); // LATIN SMALL LETTER Z WITH LINE BELOW, LATIN CAPITAL LETTER Z WITH LINE BELOW
+test(0x1E9B, 0x1E61, 0x1E60); // LATIN SMALL LETTER LONG S WITH DOT ABOVE, LATIN SMALL LETTER S WITH DOT ABOVE, LATIN CAPITAL LETTER S WITH DOT ABOVE
+test(0x1E9E, 0x00DF); // LATIN CAPITAL LETTER SHARP S, LATIN SMALL LETTER SHARP S
+test(0x1EA0, 0x1EA1); // LATIN CAPITAL LETTER A WITH DOT BELOW, LATIN SMALL LETTER A WITH DOT BELOW
+test(0x1EA1, 0x1EA0); // LATIN SMALL LETTER A WITH DOT BELOW, LATIN CAPITAL LETTER A WITH DOT BELOW
+test(0x1EA2, 0x1EA3); // LATIN CAPITAL LETTER A WITH HOOK ABOVE, LATIN SMALL LETTER A WITH HOOK ABOVE
+test(0x1EA3, 0x1EA2); // LATIN SMALL LETTER A WITH HOOK ABOVE, LATIN CAPITAL LETTER A WITH HOOK ABOVE
+test(0x1EA4, 0x1EA5); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+test(0x1EA5, 0x1EA4); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+test(0x1EA6, 0x1EA7); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+test(0x1EA7, 0x1EA6); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+test(0x1EA8, 0x1EA9); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1EA9, 0x1EA8); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1EAA, 0x1EAB); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+test(0x1EAB, 0x1EAA); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+test(0x1EAC, 0x1EAD); // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EAD, 0x1EAC); // LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EAE, 0x1EAF); // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE, LATIN SMALL LETTER A WITH BREVE AND ACUTE
+test(0x1EAF, 0x1EAE); // LATIN SMALL LETTER A WITH BREVE AND ACUTE, LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+test(0x1EB0, 0x1EB1); // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE, LATIN SMALL LETTER A WITH BREVE AND GRAVE
+test(0x1EB1, 0x1EB0); // LATIN SMALL LETTER A WITH BREVE AND GRAVE, LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+test(0x1EB2, 0x1EB3); // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE, LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+test(0x1EB3, 0x1EB2); // LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE, LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+test(0x1EB4, 0x1EB5); // LATIN CAPITAL LETTER A WITH BREVE AND TILDE, LATIN SMALL LETTER A WITH BREVE AND TILDE
+test(0x1EB5, 0x1EB4); // LATIN SMALL LETTER A WITH BREVE AND TILDE, LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+test(0x1EB6, 0x1EB7); // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW, LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+test(0x1EB7, 0x1EB6); // LATIN SMALL LETTER A WITH BREVE AND DOT BELOW, LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+test(0x1EB8, 0x1EB9); // LATIN CAPITAL LETTER E WITH DOT BELOW, LATIN SMALL LETTER E WITH DOT BELOW
+test(0x1EB9, 0x1EB8); // LATIN SMALL LETTER E WITH DOT BELOW, LATIN CAPITAL LETTER E WITH DOT BELOW
+test(0x1EBA, 0x1EBB); // LATIN CAPITAL LETTER E WITH HOOK ABOVE, LATIN SMALL LETTER E WITH HOOK ABOVE
+test(0x1EBB, 0x1EBA); // LATIN SMALL LETTER E WITH HOOK ABOVE, LATIN CAPITAL LETTER E WITH HOOK ABOVE
+test(0x1EBC, 0x1EBD); // LATIN CAPITAL LETTER E WITH TILDE, LATIN SMALL LETTER E WITH TILDE
+test(0x1EBD, 0x1EBC); // LATIN SMALL LETTER E WITH TILDE, LATIN CAPITAL LETTER E WITH TILDE
+test(0x1EBE, 0x1EBF); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+test(0x1EBF, 0x1EBE); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+test(0x1EC0, 0x1EC1); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+test(0x1EC1, 0x1EC0); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+test(0x1EC2, 0x1EC3); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1EC3, 0x1EC2); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1EC4, 0x1EC5); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+test(0x1EC5, 0x1EC4); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+test(0x1EC6, 0x1EC7); // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EC7, 0x1EC6); // LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EC8, 0x1EC9); // LATIN CAPITAL LETTER I WITH HOOK ABOVE, LATIN SMALL LETTER I WITH HOOK ABOVE
+test(0x1EC9, 0x1EC8); // LATIN SMALL LETTER I WITH HOOK ABOVE, LATIN CAPITAL LETTER I WITH HOOK ABOVE
+test(0x1ECA, 0x1ECB); // LATIN CAPITAL LETTER I WITH DOT BELOW, LATIN SMALL LETTER I WITH DOT BELOW
+test(0x1ECB, 0x1ECA); // LATIN SMALL LETTER I WITH DOT BELOW, LATIN CAPITAL LETTER I WITH DOT BELOW
+test(0x1ECC, 0x1ECD); // LATIN CAPITAL LETTER O WITH DOT BELOW, LATIN SMALL LETTER O WITH DOT BELOW
+test(0x1ECD, 0x1ECC); // LATIN SMALL LETTER O WITH DOT BELOW, LATIN CAPITAL LETTER O WITH DOT BELOW
+test(0x1ECE, 0x1ECF); // LATIN CAPITAL LETTER O WITH HOOK ABOVE, LATIN SMALL LETTER O WITH HOOK ABOVE
+test(0x1ECF, 0x1ECE); // LATIN SMALL LETTER O WITH HOOK ABOVE, LATIN CAPITAL LETTER O WITH HOOK ABOVE
+test(0x1ED0, 0x1ED1); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+test(0x1ED1, 0x1ED0); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+test(0x1ED2, 0x1ED3); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+test(0x1ED3, 0x1ED2); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+test(0x1ED4, 0x1ED5); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1ED5, 0x1ED4); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+test(0x1ED6, 0x1ED7); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE, LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+test(0x1ED7, 0x1ED6); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+test(0x1ED8, 0x1ED9); // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW, LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+test(0x1ED9, 0x1ED8); // LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW, LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+test(0x1EDA, 0x1EDB); // LATIN CAPITAL LETTER O WITH HORN AND ACUTE, LATIN SMALL LETTER O WITH HORN AND ACUTE
+test(0x1EDB, 0x1EDA); // LATIN SMALL LETTER O WITH HORN AND ACUTE, LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+test(0x1EDC, 0x1EDD); // LATIN CAPITAL LETTER O WITH HORN AND GRAVE, LATIN SMALL LETTER O WITH HORN AND GRAVE
+test(0x1EDD, 0x1EDC); // LATIN SMALL LETTER O WITH HORN AND GRAVE, LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+test(0x1EDE, 0x1EDF); // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE, LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+test(0x1EDF, 0x1EDE); // LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE, LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+test(0x1EE0, 0x1EE1); // LATIN CAPITAL LETTER O WITH HORN AND TILDE, LATIN SMALL LETTER O WITH HORN AND TILDE
+test(0x1EE1, 0x1EE0); // LATIN SMALL LETTER O WITH HORN AND TILDE, LATIN CAPITAL LETTER O WITH HORN AND TILDE
+test(0x1EE2, 0x1EE3); // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW, LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+test(0x1EE3, 0x1EE2); // LATIN SMALL LETTER O WITH HORN AND DOT BELOW, LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+test(0x1EE4, 0x1EE5); // LATIN CAPITAL LETTER U WITH DOT BELOW, LATIN SMALL LETTER U WITH DOT BELOW
+test(0x1EE5, 0x1EE4); // LATIN SMALL LETTER U WITH DOT BELOW, LATIN CAPITAL LETTER U WITH DOT BELOW
+test(0x1EE6, 0x1EE7); // LATIN CAPITAL LETTER U WITH HOOK ABOVE, LATIN SMALL LETTER U WITH HOOK ABOVE
+test(0x1EE7, 0x1EE6); // LATIN SMALL LETTER U WITH HOOK ABOVE, LATIN CAPITAL LETTER U WITH HOOK ABOVE
+test(0x1EE8, 0x1EE9); // LATIN CAPITAL LETTER U WITH HORN AND ACUTE, LATIN SMALL LETTER U WITH HORN AND ACUTE
+test(0x1EE9, 0x1EE8); // LATIN SMALL LETTER U WITH HORN AND ACUTE, LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+test(0x1EEA, 0x1EEB); // LATIN CAPITAL LETTER U WITH HORN AND GRAVE, LATIN SMALL LETTER U WITH HORN AND GRAVE
+test(0x1EEB, 0x1EEA); // LATIN SMALL LETTER U WITH HORN AND GRAVE, LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+test(0x1EEC, 0x1EED); // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE, LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+test(0x1EED, 0x1EEC); // LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE, LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+test(0x1EEE, 0x1EEF); // LATIN CAPITAL LETTER U WITH HORN AND TILDE, LATIN SMALL LETTER U WITH HORN AND TILDE
+test(0x1EEF, 0x1EEE); // LATIN SMALL LETTER U WITH HORN AND TILDE, LATIN CAPITAL LETTER U WITH HORN AND TILDE
+test(0x1EF0, 0x1EF1); // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW, LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+test(0x1EF1, 0x1EF0); // LATIN SMALL LETTER U WITH HORN AND DOT BELOW, LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+test(0x1EF2, 0x1EF3); // LATIN CAPITAL LETTER Y WITH GRAVE, LATIN SMALL LETTER Y WITH GRAVE
+test(0x1EF3, 0x1EF2); // LATIN SMALL LETTER Y WITH GRAVE, LATIN CAPITAL LETTER Y WITH GRAVE
+test(0x1EF4, 0x1EF5); // LATIN CAPITAL LETTER Y WITH DOT BELOW, LATIN SMALL LETTER Y WITH DOT BELOW
+test(0x1EF5, 0x1EF4); // LATIN SMALL LETTER Y WITH DOT BELOW, LATIN CAPITAL LETTER Y WITH DOT BELOW
+test(0x1EF6, 0x1EF7); // LATIN CAPITAL LETTER Y WITH HOOK ABOVE, LATIN SMALL LETTER Y WITH HOOK ABOVE
+test(0x1EF7, 0x1EF6); // LATIN SMALL LETTER Y WITH HOOK ABOVE, LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+test(0x1EF8, 0x1EF9); // LATIN CAPITAL LETTER Y WITH TILDE, LATIN SMALL LETTER Y WITH TILDE
+test(0x1EF9, 0x1EF8); // LATIN SMALL LETTER Y WITH TILDE, LATIN CAPITAL LETTER Y WITH TILDE
+test(0x1EFA, 0x1EFB); // LATIN CAPITAL LETTER MIDDLE-WELSH LL, LATIN SMALL LETTER MIDDLE-WELSH LL
+test(0x1EFB, 0x1EFA); // LATIN SMALL LETTER MIDDLE-WELSH LL, LATIN CAPITAL LETTER MIDDLE-WELSH LL
+test(0x1EFC, 0x1EFD); // LATIN CAPITAL LETTER MIDDLE-WELSH V, LATIN SMALL LETTER MIDDLE-WELSH V
+test(0x1EFD, 0x1EFC); // LATIN SMALL LETTER MIDDLE-WELSH V, LATIN CAPITAL LETTER MIDDLE-WELSH V
+test(0x1EFE, 0x1EFF); // LATIN CAPITAL LETTER Y WITH LOOP, LATIN SMALL LETTER Y WITH LOOP
+test(0x1EFF, 0x1EFE); // LATIN SMALL LETTER Y WITH LOOP, LATIN CAPITAL LETTER Y WITH LOOP
+test(0x1F00, 0x1F08); // GREEK SMALL LETTER ALPHA WITH PSILI, GREEK CAPITAL LETTER ALPHA WITH PSILI
+test(0x1F01, 0x1F09); // GREEK SMALL LETTER ALPHA WITH DASIA, GREEK CAPITAL LETTER ALPHA WITH DASIA
+test(0x1F02, 0x1F0A); // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA, GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+test(0x1F03, 0x1F0B); // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA, GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+test(0x1F04, 0x1F0C); // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA, GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+test(0x1F05, 0x1F0D); // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA, GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+test(0x1F06, 0x1F0E); // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+test(0x1F07, 0x1F0F); // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+test(0x1F08, 0x1F00); // GREEK CAPITAL LETTER ALPHA WITH PSILI, GREEK SMALL LETTER ALPHA WITH PSILI
+test(0x1F09, 0x1F01); // GREEK CAPITAL LETTER ALPHA WITH DASIA, GREEK SMALL LETTER ALPHA WITH DASIA
+test(0x1F0A, 0x1F02); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA, GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+test(0x1F0B, 0x1F03); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA, GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+test(0x1F0C, 0x1F04); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA, GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+test(0x1F0D, 0x1F05); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA, GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+test(0x1F0E, 0x1F06); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+test(0x1F0F, 0x1F07); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+test(0x1F10, 0x1F18); // GREEK SMALL LETTER EPSILON WITH PSILI, GREEK CAPITAL LETTER EPSILON WITH PSILI
+test(0x1F11, 0x1F19); // GREEK SMALL LETTER EPSILON WITH DASIA, GREEK CAPITAL LETTER EPSILON WITH DASIA
+test(0x1F12, 0x1F1A); // GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA, GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+test(0x1F13, 0x1F1B); // GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA, GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+test(0x1F14, 0x1F1C); // GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA, GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+test(0x1F15, 0x1F1D); // GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA, GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+test(0x1F18, 0x1F10); // GREEK CAPITAL LETTER EPSILON WITH PSILI, GREEK SMALL LETTER EPSILON WITH PSILI
+test(0x1F19, 0x1F11); // GREEK CAPITAL LETTER EPSILON WITH DASIA, GREEK SMALL LETTER EPSILON WITH DASIA
+test(0x1F1A, 0x1F12); // GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA, GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+test(0x1F1B, 0x1F13); // GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA, GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+test(0x1F1C, 0x1F14); // GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA, GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+test(0x1F1D, 0x1F15); // GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA, GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+test(0x1F20, 0x1F28); // GREEK SMALL LETTER ETA WITH PSILI, GREEK CAPITAL LETTER ETA WITH PSILI
+test(0x1F21, 0x1F29); // GREEK SMALL LETTER ETA WITH DASIA, GREEK CAPITAL LETTER ETA WITH DASIA
+test(0x1F22, 0x1F2A); // GREEK SMALL LETTER ETA WITH PSILI AND VARIA, GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+test(0x1F23, 0x1F2B); // GREEK SMALL LETTER ETA WITH DASIA AND VARIA, GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+test(0x1F24, 0x1F2C); // GREEK SMALL LETTER ETA WITH PSILI AND OXIA, GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+test(0x1F25, 0x1F2D); // GREEK SMALL LETTER ETA WITH DASIA AND OXIA, GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+test(0x1F26, 0x1F2E); // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+test(0x1F27, 0x1F2F); // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+test(0x1F28, 0x1F20); // GREEK CAPITAL LETTER ETA WITH PSILI, GREEK SMALL LETTER ETA WITH PSILI
+test(0x1F29, 0x1F21); // GREEK CAPITAL LETTER ETA WITH DASIA, GREEK SMALL LETTER ETA WITH DASIA
+test(0x1F2A, 0x1F22); // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA, GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+test(0x1F2B, 0x1F23); // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA, GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+test(0x1F2C, 0x1F24); // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA, GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+test(0x1F2D, 0x1F25); // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA, GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+test(0x1F2E, 0x1F26); // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+test(0x1F2F, 0x1F27); // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+test(0x1F30, 0x1F38); // GREEK SMALL LETTER IOTA WITH PSILI, GREEK CAPITAL LETTER IOTA WITH PSILI
+test(0x1F31, 0x1F39); // GREEK SMALL LETTER IOTA WITH DASIA, GREEK CAPITAL LETTER IOTA WITH DASIA
+test(0x1F32, 0x1F3A); // GREEK SMALL LETTER IOTA WITH PSILI AND VARIA, GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+test(0x1F33, 0x1F3B); // GREEK SMALL LETTER IOTA WITH DASIA AND VARIA, GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+test(0x1F34, 0x1F3C); // GREEK SMALL LETTER IOTA WITH PSILI AND OXIA, GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+test(0x1F35, 0x1F3D); // GREEK SMALL LETTER IOTA WITH DASIA AND OXIA, GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+test(0x1F36, 0x1F3E); // GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+test(0x1F37, 0x1F3F); // GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+test(0x1F38, 0x1F30); // GREEK CAPITAL LETTER IOTA WITH PSILI, GREEK SMALL LETTER IOTA WITH PSILI
+test(0x1F39, 0x1F31); // GREEK CAPITAL LETTER IOTA WITH DASIA, GREEK SMALL LETTER IOTA WITH DASIA
+test(0x1F3A, 0x1F32); // GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA, GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+test(0x1F3B, 0x1F33); // GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA, GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+test(0x1F3C, 0x1F34); // GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA, GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+test(0x1F3D, 0x1F35); // GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA, GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+test(0x1F3E, 0x1F36); // GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+test(0x1F3F, 0x1F37); // GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+test(0x1F40, 0x1F48); // GREEK SMALL LETTER OMICRON WITH PSILI, GREEK CAPITAL LETTER OMICRON WITH PSILI
+test(0x1F41, 0x1F49); // GREEK SMALL LETTER OMICRON WITH DASIA, GREEK CAPITAL LETTER OMICRON WITH DASIA
+test(0x1F42, 0x1F4A); // GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA, GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+test(0x1F43, 0x1F4B); // GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA, GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+test(0x1F44, 0x1F4C); // GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA, GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+test(0x1F45, 0x1F4D); // GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA, GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+test(0x1F48, 0x1F40); // GREEK CAPITAL LETTER OMICRON WITH PSILI, GREEK SMALL LETTER OMICRON WITH PSILI
+test(0x1F49, 0x1F41); // GREEK CAPITAL LETTER OMICRON WITH DASIA, GREEK SMALL LETTER OMICRON WITH DASIA
+test(0x1F4A, 0x1F42); // GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA, GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+test(0x1F4B, 0x1F43); // GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA, GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+test(0x1F4C, 0x1F44); // GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA, GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+test(0x1F4D, 0x1F45); // GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA, GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+test(0x1F51, 0x1F59); // GREEK SMALL LETTER UPSILON WITH DASIA, GREEK CAPITAL LETTER UPSILON WITH DASIA
+test(0x1F53, 0x1F5B); // GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA, GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+test(0x1F55, 0x1F5D); // GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA, GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+test(0x1F57, 0x1F5F); // GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+test(0x1F59, 0x1F51); // GREEK CAPITAL LETTER UPSILON WITH DASIA, GREEK SMALL LETTER UPSILON WITH DASIA
+test(0x1F5B, 0x1F53); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA, GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+test(0x1F5D, 0x1F55); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA, GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+test(0x1F5F, 0x1F57); // GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+test(0x1F60, 0x1F68); // GREEK SMALL LETTER OMEGA WITH PSILI, GREEK CAPITAL LETTER OMEGA WITH PSILI
+test(0x1F61, 0x1F69); // GREEK SMALL LETTER OMEGA WITH DASIA, GREEK CAPITAL LETTER OMEGA WITH DASIA
+test(0x1F62, 0x1F6A); // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA, GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+test(0x1F63, 0x1F6B); // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA, GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+test(0x1F64, 0x1F6C); // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA, GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+test(0x1F65, 0x1F6D); // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA, GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+test(0x1F66, 0x1F6E); // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+test(0x1F67, 0x1F6F); // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+test(0x1F68, 0x1F60); // GREEK CAPITAL LETTER OMEGA WITH PSILI, GREEK SMALL LETTER OMEGA WITH PSILI
+test(0x1F69, 0x1F61); // GREEK CAPITAL LETTER OMEGA WITH DASIA, GREEK SMALL LETTER OMEGA WITH DASIA
+test(0x1F6A, 0x1F62); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA, GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+test(0x1F6B, 0x1F63); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA, GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+test(0x1F6C, 0x1F64); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA, GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+test(0x1F6D, 0x1F65); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA, GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+test(0x1F6E, 0x1F66); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+test(0x1F6F, 0x1F67); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+test(0x1F70, 0x1FBA); // GREEK SMALL LETTER ALPHA WITH VARIA, GREEK CAPITAL LETTER ALPHA WITH VARIA
+test(0x1F71, 0x1FBB); // GREEK SMALL LETTER ALPHA WITH OXIA, GREEK CAPITAL LETTER ALPHA WITH OXIA
+test(0x1F72, 0x1FC8); // GREEK SMALL LETTER EPSILON WITH VARIA, GREEK CAPITAL LETTER EPSILON WITH VARIA
+test(0x1F73, 0x1FC9); // GREEK SMALL LETTER EPSILON WITH OXIA, GREEK CAPITAL LETTER EPSILON WITH OXIA
+test(0x1F74, 0x1FCA); // GREEK SMALL LETTER ETA WITH VARIA, GREEK CAPITAL LETTER ETA WITH VARIA
+test(0x1F75, 0x1FCB); // GREEK SMALL LETTER ETA WITH OXIA, GREEK CAPITAL LETTER ETA WITH OXIA
+test(0x1F76, 0x1FDA); // GREEK SMALL LETTER IOTA WITH VARIA, GREEK CAPITAL LETTER IOTA WITH VARIA
+test(0x1F77, 0x1FDB); // GREEK SMALL LETTER IOTA WITH OXIA, GREEK CAPITAL LETTER IOTA WITH OXIA
+test(0x1F78, 0x1FF8); // GREEK SMALL LETTER OMICRON WITH VARIA, GREEK CAPITAL LETTER OMICRON WITH VARIA
+test(0x1F79, 0x1FF9); // GREEK SMALL LETTER OMICRON WITH OXIA, GREEK CAPITAL LETTER OMICRON WITH OXIA
+test(0x1F7A, 0x1FEA); // GREEK SMALL LETTER UPSILON WITH VARIA, GREEK CAPITAL LETTER UPSILON WITH VARIA
+test(0x1F7B, 0x1FEB); // GREEK SMALL LETTER UPSILON WITH OXIA, GREEK CAPITAL LETTER UPSILON WITH OXIA
+test(0x1F7C, 0x1FFA); // GREEK SMALL LETTER OMEGA WITH VARIA, GREEK CAPITAL LETTER OMEGA WITH VARIA
+test(0x1F7D, 0x1FFB); // GREEK SMALL LETTER OMEGA WITH OXIA, GREEK CAPITAL LETTER OMEGA WITH OXIA
+test(0x1F80, 0x1F88); // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+test(0x1F81, 0x1F89); // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+test(0x1F82, 0x1F8A); // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+test(0x1F83, 0x1F8B); // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+test(0x1F84, 0x1F8C); // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+test(0x1F85, 0x1F8D); // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+test(0x1F86, 0x1F8E); // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1F87, 0x1F8F); // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1F88, 0x1F80); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+test(0x1F89, 0x1F81); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+test(0x1F8A, 0x1F82); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+test(0x1F8B, 0x1F83); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+test(0x1F8C, 0x1F84); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+test(0x1F8D, 0x1F85); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+test(0x1F8E, 0x1F86); // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1F8F, 0x1F87); // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1F90, 0x1F98); // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+test(0x1F91, 0x1F99); // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+test(0x1F92, 0x1F9A); // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+test(0x1F93, 0x1F9B); // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+test(0x1F94, 0x1F9C); // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+test(0x1F95, 0x1F9D); // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+test(0x1F96, 0x1F9E); // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1F97, 0x1F9F); // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1F98, 0x1F90); // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+test(0x1F99, 0x1F91); // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+test(0x1F9A, 0x1F92); // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+test(0x1F9B, 0x1F93); // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+test(0x1F9C, 0x1F94); // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+test(0x1F9D, 0x1F95); // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+test(0x1F9E, 0x1F96); // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1F9F, 0x1F97); // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1FA0, 0x1FA8); // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+test(0x1FA1, 0x1FA9); // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+test(0x1FA2, 0x1FAA); // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+test(0x1FA3, 0x1FAB); // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+test(0x1FA4, 0x1FAC); // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+test(0x1FA5, 0x1FAD); // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+test(0x1FA6, 0x1FAE); // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1FA7, 0x1FAF); // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+test(0x1FA8, 0x1FA0); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+test(0x1FA9, 0x1FA1); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+test(0x1FAA, 0x1FA2); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+test(0x1FAB, 0x1FA3); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+test(0x1FAC, 0x1FA4); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+test(0x1FAD, 0x1FA5); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+test(0x1FAE, 0x1FA6); // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1FAF, 0x1FA7); // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+test(0x1FB0, 0x1FB8); // GREEK SMALL LETTER ALPHA WITH VRACHY, GREEK CAPITAL LETTER ALPHA WITH VRACHY
+test(0x1FB1, 0x1FB9); // GREEK SMALL LETTER ALPHA WITH MACRON, GREEK CAPITAL LETTER ALPHA WITH MACRON
+test(0x1FB3, 0x1FBC); // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+test(0x1FB8, 0x1FB0); // GREEK CAPITAL LETTER ALPHA WITH VRACHY, GREEK SMALL LETTER ALPHA WITH VRACHY
+test(0x1FB9, 0x1FB1); // GREEK CAPITAL LETTER ALPHA WITH MACRON, GREEK SMALL LETTER ALPHA WITH MACRON
+test(0x1FBA, 0x1F70); // GREEK CAPITAL LETTER ALPHA WITH VARIA, GREEK SMALL LETTER ALPHA WITH VARIA
+test(0x1FBB, 0x1F71); // GREEK CAPITAL LETTER ALPHA WITH OXIA, GREEK SMALL LETTER ALPHA WITH OXIA
+test(0x1FBC, 0x1FB3); // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI, GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+test(0x1FBE, 0x03B9, 0x0345, 0x0399); // GREEK PROSGEGRAMMENI, GREEK SMALL LETTER IOTA, COMBINING GREEK YPOGEGRAMMENI (GREEK NON-SPACING IOTA BELOW), GREEK CAPITAL LETTER IOTA
+test(0x1FC3, 0x1FCC); // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+test(0x1FC8, 0x1F72); // GREEK CAPITAL LETTER EPSILON WITH VARIA, GREEK SMALL LETTER EPSILON WITH VARIA
+test(0x1FC9, 0x1F73); // GREEK CAPITAL LETTER EPSILON WITH OXIA, GREEK SMALL LETTER EPSILON WITH OXIA
+test(0x1FCA, 0x1F74); // GREEK CAPITAL LETTER ETA WITH VARIA, GREEK SMALL LETTER ETA WITH VARIA
+test(0x1FCB, 0x1F75); // GREEK CAPITAL LETTER ETA WITH OXIA, GREEK SMALL LETTER ETA WITH OXIA
+test(0x1FCC, 0x1FC3); // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI, GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+test(0x1FD0, 0x1FD8); // GREEK SMALL LETTER IOTA WITH VRACHY, GREEK CAPITAL LETTER IOTA WITH VRACHY
+test(0x1FD1, 0x1FD9); // GREEK SMALL LETTER IOTA WITH MACRON, GREEK CAPITAL LETTER IOTA WITH MACRON
+test(0x1FD8, 0x1FD0); // GREEK CAPITAL LETTER IOTA WITH VRACHY, GREEK SMALL LETTER IOTA WITH VRACHY
+test(0x1FD9, 0x1FD1); // GREEK CAPITAL LETTER IOTA WITH MACRON, GREEK SMALL LETTER IOTA WITH MACRON
+test(0x1FDA, 0x1F76); // GREEK CAPITAL LETTER IOTA WITH VARIA, GREEK SMALL LETTER IOTA WITH VARIA
+test(0x1FDB, 0x1F77); // GREEK CAPITAL LETTER IOTA WITH OXIA, GREEK SMALL LETTER IOTA WITH OXIA
+test(0x1FE0, 0x1FE8); // GREEK SMALL LETTER UPSILON WITH VRACHY, GREEK CAPITAL LETTER UPSILON WITH VRACHY
+test(0x1FE1, 0x1FE9); // GREEK SMALL LETTER UPSILON WITH MACRON, GREEK CAPITAL LETTER UPSILON WITH MACRON
+test(0x1FE5, 0x1FEC); // GREEK SMALL LETTER RHO WITH DASIA, GREEK CAPITAL LETTER RHO WITH DASIA
+test(0x1FE8, 0x1FE0); // GREEK CAPITAL LETTER UPSILON WITH VRACHY, GREEK SMALL LETTER UPSILON WITH VRACHY
+test(0x1FE9, 0x1FE1); // GREEK CAPITAL LETTER UPSILON WITH MACRON, GREEK SMALL LETTER UPSILON WITH MACRON
+test(0x1FEA, 0x1F7A); // GREEK CAPITAL LETTER UPSILON WITH VARIA, GREEK SMALL LETTER UPSILON WITH VARIA
+test(0x1FEB, 0x1F7B); // GREEK CAPITAL LETTER UPSILON WITH OXIA, GREEK SMALL LETTER UPSILON WITH OXIA
+test(0x1FEC, 0x1FE5); // GREEK CAPITAL LETTER RHO WITH DASIA, GREEK SMALL LETTER RHO WITH DASIA
+test(0x1FF3, 0x1FFC); // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI, GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+test(0x1FF8, 0x1F78); // GREEK CAPITAL LETTER OMICRON WITH VARIA, GREEK SMALL LETTER OMICRON WITH VARIA
+test(0x1FF9, 0x1F79); // GREEK CAPITAL LETTER OMICRON WITH OXIA, GREEK SMALL LETTER OMICRON WITH OXIA
+test(0x1FFA, 0x1F7C); // GREEK CAPITAL LETTER OMEGA WITH VARIA, GREEK SMALL LETTER OMEGA WITH VARIA
+test(0x1FFB, 0x1F7D); // GREEK CAPITAL LETTER OMEGA WITH OXIA, GREEK SMALL LETTER OMEGA WITH OXIA
+test(0x1FFC, 0x1FF3); // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI, GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+test(0x2126, 0x03C9, 0x03A9); // OHM SIGN (OHM), GREEK SMALL LETTER OMEGA, GREEK CAPITAL LETTER OMEGA
+test(0x212A, 0x006B, 0x004B); // KELVIN SIGN (DEGREES KELVIN), LATIN SMALL LETTER K, LATIN CAPITAL LETTER K
+test(0x212B, 0x00E5, 0x00C5); // ANGSTROM SIGN (ANGSTROM UNIT), LATIN SMALL LETTER A WITH RING ABOVE (LATIN SMALL LETTER A RING), LATIN CAPITAL LETTER A WITH RING ABOVE (LATIN CAPITAL LETTER A RING)
+test(0x2132, 0x214E); // TURNED CAPITAL F (TURNED F), TURNED SMALL F
+test(0x214E, 0x2132); // TURNED SMALL F, TURNED CAPITAL F (TURNED F)
+test(0x2160, 0x2170); // ROMAN NUMERAL ONE, SMALL ROMAN NUMERAL ONE
+test(0x2161, 0x2171); // ROMAN NUMERAL TWO, SMALL ROMAN NUMERAL TWO
+test(0x2162, 0x2172); // ROMAN NUMERAL THREE, SMALL ROMAN NUMERAL THREE
+test(0x2163, 0x2173); // ROMAN NUMERAL FOUR, SMALL ROMAN NUMERAL FOUR
+test(0x2164, 0x2174); // ROMAN NUMERAL FIVE, SMALL ROMAN NUMERAL FIVE
+test(0x2165, 0x2175); // ROMAN NUMERAL SIX, SMALL ROMAN NUMERAL SIX
+test(0x2166, 0x2176); // ROMAN NUMERAL SEVEN, SMALL ROMAN NUMERAL SEVEN
+test(0x2167, 0x2177); // ROMAN NUMERAL EIGHT, SMALL ROMAN NUMERAL EIGHT
+test(0x2168, 0x2178); // ROMAN NUMERAL NINE, SMALL ROMAN NUMERAL NINE
+test(0x2169, 0x2179); // ROMAN NUMERAL TEN, SMALL ROMAN NUMERAL TEN
+test(0x216A, 0x217A); // ROMAN NUMERAL ELEVEN, SMALL ROMAN NUMERAL ELEVEN
+test(0x216B, 0x217B); // ROMAN NUMERAL TWELVE, SMALL ROMAN NUMERAL TWELVE
+test(0x216C, 0x217C); // ROMAN NUMERAL FIFTY, SMALL ROMAN NUMERAL FIFTY
+test(0x216D, 0x217D); // ROMAN NUMERAL ONE HUNDRED, SMALL ROMAN NUMERAL ONE HUNDRED
+test(0x216E, 0x217E); // ROMAN NUMERAL FIVE HUNDRED, SMALL ROMAN NUMERAL FIVE HUNDRED
+test(0x216F, 0x217F); // ROMAN NUMERAL ONE THOUSAND, SMALL ROMAN NUMERAL ONE THOUSAND
+test(0x2170, 0x2160); // SMALL ROMAN NUMERAL ONE, ROMAN NUMERAL ONE
+test(0x2171, 0x2161); // SMALL ROMAN NUMERAL TWO, ROMAN NUMERAL TWO
+test(0x2172, 0x2162); // SMALL ROMAN NUMERAL THREE, ROMAN NUMERAL THREE
+test(0x2173, 0x2163); // SMALL ROMAN NUMERAL FOUR, ROMAN NUMERAL FOUR
+test(0x2174, 0x2164); // SMALL ROMAN NUMERAL FIVE, ROMAN NUMERAL FIVE
+test(0x2175, 0x2165); // SMALL ROMAN NUMERAL SIX, ROMAN NUMERAL SIX
+test(0x2176, 0x2166); // SMALL ROMAN NUMERAL SEVEN, ROMAN NUMERAL SEVEN
+test(0x2177, 0x2167); // SMALL ROMAN NUMERAL EIGHT, ROMAN NUMERAL EIGHT
+test(0x2178, 0x2168); // SMALL ROMAN NUMERAL NINE, ROMAN NUMERAL NINE
+test(0x2179, 0x2169); // SMALL ROMAN NUMERAL TEN, ROMAN NUMERAL TEN
+test(0x217A, 0x216A); // SMALL ROMAN NUMERAL ELEVEN, ROMAN NUMERAL ELEVEN
+test(0x217B, 0x216B); // SMALL ROMAN NUMERAL TWELVE, ROMAN NUMERAL TWELVE
+test(0x217C, 0x216C); // SMALL ROMAN NUMERAL FIFTY, ROMAN NUMERAL FIFTY
+test(0x217D, 0x216D); // SMALL ROMAN NUMERAL ONE HUNDRED, ROMAN NUMERAL ONE HUNDRED
+test(0x217E, 0x216E); // SMALL ROMAN NUMERAL FIVE HUNDRED, ROMAN NUMERAL FIVE HUNDRED
+test(0x217F, 0x216F); // SMALL ROMAN NUMERAL ONE THOUSAND, ROMAN NUMERAL ONE THOUSAND
+test(0x2183, 0x2184); // ROMAN NUMERAL REVERSED ONE HUNDRED, LATIN SMALL LETTER REVERSED C
+test(0x2184, 0x2183); // LATIN SMALL LETTER REVERSED C, ROMAN NUMERAL REVERSED ONE HUNDRED
+test(0x24B6, 0x24D0); // CIRCLED LATIN CAPITAL LETTER A, CIRCLED LATIN SMALL LETTER A
+test(0x24B7, 0x24D1); // CIRCLED LATIN CAPITAL LETTER B, CIRCLED LATIN SMALL LETTER B
+test(0x24B8, 0x24D2); // CIRCLED LATIN CAPITAL LETTER C, CIRCLED LATIN SMALL LETTER C
+test(0x24B9, 0x24D3); // CIRCLED LATIN CAPITAL LETTER D, CIRCLED LATIN SMALL LETTER D
+test(0x24BA, 0x24D4); // CIRCLED LATIN CAPITAL LETTER E, CIRCLED LATIN SMALL LETTER E
+test(0x24BB, 0x24D5); // CIRCLED LATIN CAPITAL LETTER F, CIRCLED LATIN SMALL LETTER F
+test(0x24BC, 0x24D6); // CIRCLED LATIN CAPITAL LETTER G, CIRCLED LATIN SMALL LETTER G
+test(0x24BD, 0x24D7); // CIRCLED LATIN CAPITAL LETTER H, CIRCLED LATIN SMALL LETTER H
+test(0x24BE, 0x24D8); // CIRCLED LATIN CAPITAL LETTER I, CIRCLED LATIN SMALL LETTER I
+test(0x24BF, 0x24D9); // CIRCLED LATIN CAPITAL LETTER J, CIRCLED LATIN SMALL LETTER J
+test(0x24C0, 0x24DA); // CIRCLED LATIN CAPITAL LETTER K, CIRCLED LATIN SMALL LETTER K
+test(0x24C1, 0x24DB); // CIRCLED LATIN CAPITAL LETTER L, CIRCLED LATIN SMALL LETTER L
+test(0x24C2, 0x24DC); // CIRCLED LATIN CAPITAL LETTER M, CIRCLED LATIN SMALL LETTER M
+test(0x24C3, 0x24DD); // CIRCLED LATIN CAPITAL LETTER N, CIRCLED LATIN SMALL LETTER N
+test(0x24C4, 0x24DE); // CIRCLED LATIN CAPITAL LETTER O, CIRCLED LATIN SMALL LETTER O
+test(0x24C5, 0x24DF); // CIRCLED LATIN CAPITAL LETTER P, CIRCLED LATIN SMALL LETTER P
+test(0x24C6, 0x24E0); // CIRCLED LATIN CAPITAL LETTER Q, CIRCLED LATIN SMALL LETTER Q
+test(0x24C7, 0x24E1); // CIRCLED LATIN CAPITAL LETTER R, CIRCLED LATIN SMALL LETTER R
+test(0x24C8, 0x24E2); // CIRCLED LATIN CAPITAL LETTER S, CIRCLED LATIN SMALL LETTER S
+test(0x24C9, 0x24E3); // CIRCLED LATIN CAPITAL LETTER T, CIRCLED LATIN SMALL LETTER T
+test(0x24CA, 0x24E4); // CIRCLED LATIN CAPITAL LETTER U, CIRCLED LATIN SMALL LETTER U
+test(0x24CB, 0x24E5); // CIRCLED LATIN CAPITAL LETTER V, CIRCLED LATIN SMALL LETTER V
+test(0x24CC, 0x24E6); // CIRCLED LATIN CAPITAL LETTER W, CIRCLED LATIN SMALL LETTER W
+test(0x24CD, 0x24E7); // CIRCLED LATIN CAPITAL LETTER X, CIRCLED LATIN SMALL LETTER X
+test(0x24CE, 0x24E8); // CIRCLED LATIN CAPITAL LETTER Y, CIRCLED LATIN SMALL LETTER Y
+test(0x24CF, 0x24E9); // CIRCLED LATIN CAPITAL LETTER Z, CIRCLED LATIN SMALL LETTER Z
+test(0x24D0, 0x24B6); // CIRCLED LATIN SMALL LETTER A, CIRCLED LATIN CAPITAL LETTER A
+test(0x24D1, 0x24B7); // CIRCLED LATIN SMALL LETTER B, CIRCLED LATIN CAPITAL LETTER B
+test(0x24D2, 0x24B8); // CIRCLED LATIN SMALL LETTER C, CIRCLED LATIN CAPITAL LETTER C
+test(0x24D3, 0x24B9); // CIRCLED LATIN SMALL LETTER D, CIRCLED LATIN CAPITAL LETTER D
+test(0x24D4, 0x24BA); // CIRCLED LATIN SMALL LETTER E, CIRCLED LATIN CAPITAL LETTER E
+test(0x24D5, 0x24BB); // CIRCLED LATIN SMALL LETTER F, CIRCLED LATIN CAPITAL LETTER F
+test(0x24D6, 0x24BC); // CIRCLED LATIN SMALL LETTER G, CIRCLED LATIN CAPITAL LETTER G
+test(0x24D7, 0x24BD); // CIRCLED LATIN SMALL LETTER H, CIRCLED LATIN CAPITAL LETTER H
+test(0x24D8, 0x24BE); // CIRCLED LATIN SMALL LETTER I, CIRCLED LATIN CAPITAL LETTER I
+test(0x24D9, 0x24BF); // CIRCLED LATIN SMALL LETTER J, CIRCLED LATIN CAPITAL LETTER J
+test(0x24DA, 0x24C0); // CIRCLED LATIN SMALL LETTER K, CIRCLED LATIN CAPITAL LETTER K
+test(0x24DB, 0x24C1); // CIRCLED LATIN SMALL LETTER L, CIRCLED LATIN CAPITAL LETTER L
+test(0x24DC, 0x24C2); // CIRCLED LATIN SMALL LETTER M, CIRCLED LATIN CAPITAL LETTER M
+test(0x24DD, 0x24C3); // CIRCLED LATIN SMALL LETTER N, CIRCLED LATIN CAPITAL LETTER N
+test(0x24DE, 0x24C4); // CIRCLED LATIN SMALL LETTER O, CIRCLED LATIN CAPITAL LETTER O
+test(0x24DF, 0x24C5); // CIRCLED LATIN SMALL LETTER P, CIRCLED LATIN CAPITAL LETTER P
+test(0x24E0, 0x24C6); // CIRCLED LATIN SMALL LETTER Q, CIRCLED LATIN CAPITAL LETTER Q
+test(0x24E1, 0x24C7); // CIRCLED LATIN SMALL LETTER R, CIRCLED LATIN CAPITAL LETTER R
+test(0x24E2, 0x24C8); // CIRCLED LATIN SMALL LETTER S, CIRCLED LATIN CAPITAL LETTER S
+test(0x24E3, 0x24C9); // CIRCLED LATIN SMALL LETTER T, CIRCLED LATIN CAPITAL LETTER T
+test(0x24E4, 0x24CA); // CIRCLED LATIN SMALL LETTER U, CIRCLED LATIN CAPITAL LETTER U
+test(0x24E5, 0x24CB); // CIRCLED LATIN SMALL LETTER V, CIRCLED LATIN CAPITAL LETTER V
+test(0x24E6, 0x24CC); // CIRCLED LATIN SMALL LETTER W, CIRCLED LATIN CAPITAL LETTER W
+test(0x24E7, 0x24CD); // CIRCLED LATIN SMALL LETTER X, CIRCLED LATIN CAPITAL LETTER X
+test(0x24E8, 0x24CE); // CIRCLED LATIN SMALL LETTER Y, CIRCLED LATIN CAPITAL LETTER Y
+test(0x24E9, 0x24CF); // CIRCLED LATIN SMALL LETTER Z, CIRCLED LATIN CAPITAL LETTER Z
+test(0x2C00, 0x2C30); // GLAGOLITIC CAPITAL LETTER AZU, GLAGOLITIC SMALL LETTER AZU
+test(0x2C01, 0x2C31); // GLAGOLITIC CAPITAL LETTER BUKY, GLAGOLITIC SMALL LETTER BUKY
+test(0x2C02, 0x2C32); // GLAGOLITIC CAPITAL LETTER VEDE, GLAGOLITIC SMALL LETTER VEDE
+test(0x2C03, 0x2C33); // GLAGOLITIC CAPITAL LETTER GLAGOLI, GLAGOLITIC SMALL LETTER GLAGOLI
+test(0x2C04, 0x2C34); // GLAGOLITIC CAPITAL LETTER DOBRO, GLAGOLITIC SMALL LETTER DOBRO
+test(0x2C05, 0x2C35); // GLAGOLITIC CAPITAL LETTER YESTU, GLAGOLITIC SMALL LETTER YESTU
+test(0x2C06, 0x2C36); // GLAGOLITIC CAPITAL LETTER ZHIVETE, GLAGOLITIC SMALL LETTER ZHIVETE
+test(0x2C07, 0x2C37); // GLAGOLITIC CAPITAL LETTER DZELO, GLAGOLITIC SMALL LETTER DZELO
+test(0x2C08, 0x2C38); // GLAGOLITIC CAPITAL LETTER ZEMLJA, GLAGOLITIC SMALL LETTER ZEMLJA
+test(0x2C09, 0x2C39); // GLAGOLITIC CAPITAL LETTER IZHE, GLAGOLITIC SMALL LETTER IZHE
+test(0x2C0A, 0x2C3A); // GLAGOLITIC CAPITAL LETTER INITIAL IZHE, GLAGOLITIC SMALL LETTER INITIAL IZHE
+test(0x2C0B, 0x2C3B); // GLAGOLITIC CAPITAL LETTER I, GLAGOLITIC SMALL LETTER I
+test(0x2C0C, 0x2C3C); // GLAGOLITIC CAPITAL LETTER DJERVI, GLAGOLITIC SMALL LETTER DJERVI
+test(0x2C0D, 0x2C3D); // GLAGOLITIC CAPITAL LETTER KAKO, GLAGOLITIC SMALL LETTER KAKO
+test(0x2C0E, 0x2C3E); // GLAGOLITIC CAPITAL LETTER LJUDIJE, GLAGOLITIC SMALL LETTER LJUDIJE
+test(0x2C0F, 0x2C3F); // GLAGOLITIC CAPITAL LETTER MYSLITE, GLAGOLITIC SMALL LETTER MYSLITE
+test(0x2C10, 0x2C40); // GLAGOLITIC CAPITAL LETTER NASHI, GLAGOLITIC SMALL LETTER NASHI
+test(0x2C11, 0x2C41); // GLAGOLITIC CAPITAL LETTER ONU, GLAGOLITIC SMALL LETTER ONU
+test(0x2C12, 0x2C42); // GLAGOLITIC CAPITAL LETTER POKOJI, GLAGOLITIC SMALL LETTER POKOJI
+test(0x2C13, 0x2C43); // GLAGOLITIC CAPITAL LETTER RITSI, GLAGOLITIC SMALL LETTER RITSI
+test(0x2C14, 0x2C44); // GLAGOLITIC CAPITAL LETTER SLOVO, GLAGOLITIC SMALL LETTER SLOVO
+test(0x2C15, 0x2C45); // GLAGOLITIC CAPITAL LETTER TVRIDO, GLAGOLITIC SMALL LETTER TVRIDO
+test(0x2C16, 0x2C46); // GLAGOLITIC CAPITAL LETTER UKU, GLAGOLITIC SMALL LETTER UKU
+test(0x2C17, 0x2C47); // GLAGOLITIC CAPITAL LETTER FRITU, GLAGOLITIC SMALL LETTER FRITU
+test(0x2C18, 0x2C48); // GLAGOLITIC CAPITAL LETTER HERU, GLAGOLITIC SMALL LETTER HERU
+test(0x2C19, 0x2C49); // GLAGOLITIC CAPITAL LETTER OTU, GLAGOLITIC SMALL LETTER OTU
+test(0x2C1A, 0x2C4A); // GLAGOLITIC CAPITAL LETTER PE, GLAGOLITIC SMALL LETTER PE
+test(0x2C1B, 0x2C4B); // GLAGOLITIC CAPITAL LETTER SHTA, GLAGOLITIC SMALL LETTER SHTA
+test(0x2C1C, 0x2C4C); // GLAGOLITIC CAPITAL LETTER TSI, GLAGOLITIC SMALL LETTER TSI
+test(0x2C1D, 0x2C4D); // GLAGOLITIC CAPITAL LETTER CHRIVI, GLAGOLITIC SMALL LETTER CHRIVI
+test(0x2C1E, 0x2C4E); // GLAGOLITIC CAPITAL LETTER SHA, GLAGOLITIC SMALL LETTER SHA
+test(0x2C1F, 0x2C4F); // GLAGOLITIC CAPITAL LETTER YERU, GLAGOLITIC SMALL LETTER YERU
+test(0x2C20, 0x2C50); // GLAGOLITIC CAPITAL LETTER YERI, GLAGOLITIC SMALL LETTER YERI
+test(0x2C21, 0x2C51); // GLAGOLITIC CAPITAL LETTER YATI, GLAGOLITIC SMALL LETTER YATI
+test(0x2C22, 0x2C52); // GLAGOLITIC CAPITAL LETTER SPIDERY HA, GLAGOLITIC SMALL LETTER SPIDERY HA
+test(0x2C23, 0x2C53); // GLAGOLITIC CAPITAL LETTER YU, GLAGOLITIC SMALL LETTER YU
+test(0x2C24, 0x2C54); // GLAGOLITIC CAPITAL LETTER SMALL YUS, GLAGOLITIC SMALL LETTER SMALL YUS
+test(0x2C25, 0x2C55); // GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL, GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+test(0x2C26, 0x2C56); // GLAGOLITIC CAPITAL LETTER YO, GLAGOLITIC SMALL LETTER YO
+test(0x2C27, 0x2C57); // GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS, GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+test(0x2C28, 0x2C58); // GLAGOLITIC CAPITAL LETTER BIG YUS, GLAGOLITIC SMALL LETTER BIG YUS
+test(0x2C29, 0x2C59); // GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS, GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+test(0x2C2A, 0x2C5A); // GLAGOLITIC CAPITAL LETTER FITA, GLAGOLITIC SMALL LETTER FITA
+test(0x2C2B, 0x2C5B); // GLAGOLITIC CAPITAL LETTER IZHITSA, GLAGOLITIC SMALL LETTER IZHITSA
+test(0x2C2C, 0x2C5C); // GLAGOLITIC CAPITAL LETTER SHTAPIC, GLAGOLITIC SMALL LETTER SHTAPIC
+test(0x2C2D, 0x2C5D); // GLAGOLITIC CAPITAL LETTER TROKUTASTI A, GLAGOLITIC SMALL LETTER TROKUTASTI A
+test(0x2C2E, 0x2C5E); // GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE, GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+test(0x2C30, 0x2C00); // GLAGOLITIC SMALL LETTER AZU, GLAGOLITIC CAPITAL LETTER AZU
+test(0x2C31, 0x2C01); // GLAGOLITIC SMALL LETTER BUKY, GLAGOLITIC CAPITAL LETTER BUKY
+test(0x2C32, 0x2C02); // GLAGOLITIC SMALL LETTER VEDE, GLAGOLITIC CAPITAL LETTER VEDE
+test(0x2C33, 0x2C03); // GLAGOLITIC SMALL LETTER GLAGOLI, GLAGOLITIC CAPITAL LETTER GLAGOLI
+test(0x2C34, 0x2C04); // GLAGOLITIC SMALL LETTER DOBRO, GLAGOLITIC CAPITAL LETTER DOBRO
+test(0x2C35, 0x2C05); // GLAGOLITIC SMALL LETTER YESTU, GLAGOLITIC CAPITAL LETTER YESTU
+test(0x2C36, 0x2C06); // GLAGOLITIC SMALL LETTER ZHIVETE, GLAGOLITIC CAPITAL LETTER ZHIVETE
+test(0x2C37, 0x2C07); // GLAGOLITIC SMALL LETTER DZELO, GLAGOLITIC CAPITAL LETTER DZELO
+test(0x2C38, 0x2C08); // GLAGOLITIC SMALL LETTER ZEMLJA, GLAGOLITIC CAPITAL LETTER ZEMLJA
+test(0x2C39, 0x2C09); // GLAGOLITIC SMALL LETTER IZHE, GLAGOLITIC CAPITAL LETTER IZHE
+test(0x2C3A, 0x2C0A); // GLAGOLITIC SMALL LETTER INITIAL IZHE, GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+test(0x2C3B, 0x2C0B); // GLAGOLITIC SMALL LETTER I, GLAGOLITIC CAPITAL LETTER I
+test(0x2C3C, 0x2C0C); // GLAGOLITIC SMALL LETTER DJERVI, GLAGOLITIC CAPITAL LETTER DJERVI
+test(0x2C3D, 0x2C0D); // GLAGOLITIC SMALL LETTER KAKO, GLAGOLITIC CAPITAL LETTER KAKO
+test(0x2C3E, 0x2C0E); // GLAGOLITIC SMALL LETTER LJUDIJE, GLAGOLITIC CAPITAL LETTER LJUDIJE
+test(0x2C3F, 0x2C0F); // GLAGOLITIC SMALL LETTER MYSLITE, GLAGOLITIC CAPITAL LETTER MYSLITE
+test(0x2C40, 0x2C10); // GLAGOLITIC SMALL LETTER NASHI, GLAGOLITIC CAPITAL LETTER NASHI
+test(0x2C41, 0x2C11); // GLAGOLITIC SMALL LETTER ONU, GLAGOLITIC CAPITAL LETTER ONU
+test(0x2C42, 0x2C12); // GLAGOLITIC SMALL LETTER POKOJI, GLAGOLITIC CAPITAL LETTER POKOJI
+test(0x2C43, 0x2C13); // GLAGOLITIC SMALL LETTER RITSI, GLAGOLITIC CAPITAL LETTER RITSI
+test(0x2C44, 0x2C14); // GLAGOLITIC SMALL LETTER SLOVO, GLAGOLITIC CAPITAL LETTER SLOVO
+test(0x2C45, 0x2C15); // GLAGOLITIC SMALL LETTER TVRIDO, GLAGOLITIC CAPITAL LETTER TVRIDO
+test(0x2C46, 0x2C16); // GLAGOLITIC SMALL LETTER UKU, GLAGOLITIC CAPITAL LETTER UKU
+test(0x2C47, 0x2C17); // GLAGOLITIC SMALL LETTER FRITU, GLAGOLITIC CAPITAL LETTER FRITU
+test(0x2C48, 0x2C18); // GLAGOLITIC SMALL LETTER HERU, GLAGOLITIC CAPITAL LETTER HERU
+test(0x2C49, 0x2C19); // GLAGOLITIC SMALL LETTER OTU, GLAGOLITIC CAPITAL LETTER OTU
+test(0x2C4A, 0x2C1A); // GLAGOLITIC SMALL LETTER PE, GLAGOLITIC CAPITAL LETTER PE
+test(0x2C4B, 0x2C1B); // GLAGOLITIC SMALL LETTER SHTA, GLAGOLITIC CAPITAL LETTER SHTA
+test(0x2C4C, 0x2C1C); // GLAGOLITIC SMALL LETTER TSI, GLAGOLITIC CAPITAL LETTER TSI
+test(0x2C4D, 0x2C1D); // GLAGOLITIC SMALL LETTER CHRIVI, GLAGOLITIC CAPITAL LETTER CHRIVI
+test(0x2C4E, 0x2C1E); // GLAGOLITIC SMALL LETTER SHA, GLAGOLITIC CAPITAL LETTER SHA
+test(0x2C4F, 0x2C1F); // GLAGOLITIC SMALL LETTER YERU, GLAGOLITIC CAPITAL LETTER YERU
+test(0x2C50, 0x2C20); // GLAGOLITIC SMALL LETTER YERI, GLAGOLITIC CAPITAL LETTER YERI
+test(0x2C51, 0x2C21); // GLAGOLITIC SMALL LETTER YATI, GLAGOLITIC CAPITAL LETTER YATI
+test(0x2C52, 0x2C22); // GLAGOLITIC SMALL LETTER SPIDERY HA, GLAGOLITIC CAPITAL LETTER SPIDERY HA
+test(0x2C53, 0x2C23); // GLAGOLITIC SMALL LETTER YU, GLAGOLITIC CAPITAL LETTER YU
+test(0x2C54, 0x2C24); // GLAGOLITIC SMALL LETTER SMALL YUS, GLAGOLITIC CAPITAL LETTER SMALL YUS
+test(0x2C55, 0x2C25); // GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL, GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+test(0x2C56, 0x2C26); // GLAGOLITIC SMALL LETTER YO, GLAGOLITIC CAPITAL LETTER YO
+test(0x2C57, 0x2C27); // GLAGOLITIC SMALL LETTER IOTATED SMALL YUS, GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+test(0x2C58, 0x2C28); // GLAGOLITIC SMALL LETTER BIG YUS, GLAGOLITIC CAPITAL LETTER BIG YUS
+test(0x2C59, 0x2C29); // GLAGOLITIC SMALL LETTER IOTATED BIG YUS, GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+test(0x2C5A, 0x2C2A); // GLAGOLITIC SMALL LETTER FITA, GLAGOLITIC CAPITAL LETTER FITA
+test(0x2C5B, 0x2C2B); // GLAGOLITIC SMALL LETTER IZHITSA, GLAGOLITIC CAPITAL LETTER IZHITSA
+test(0x2C5C, 0x2C2C); // GLAGOLITIC SMALL LETTER SHTAPIC, GLAGOLITIC CAPITAL LETTER SHTAPIC
+test(0x2C5D, 0x2C2D); // GLAGOLITIC SMALL LETTER TROKUTASTI A, GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+test(0x2C5E, 0x2C2E); // GLAGOLITIC SMALL LETTER LATINATE MYSLITE, GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+test(0x2C60, 0x2C61); // LATIN CAPITAL LETTER L WITH DOUBLE BAR, LATIN SMALL LETTER L WITH DOUBLE BAR
+test(0x2C61, 0x2C60); // LATIN SMALL LETTER L WITH DOUBLE BAR, LATIN CAPITAL LETTER L WITH DOUBLE BAR
+test(0x2C62, 0x026B); // LATIN CAPITAL LETTER L WITH MIDDLE TILDE, LATIN SMALL LETTER L WITH MIDDLE TILDE
+test(0x2C63, 0x1D7D); // LATIN CAPITAL LETTER P WITH STROKE, LATIN SMALL LETTER P WITH STROKE
+test(0x2C64, 0x027D); // LATIN CAPITAL LETTER R WITH TAIL, LATIN SMALL LETTER R WITH TAIL (LATIN SMALL LETTER R HOOK)
+test(0x2C65, 0x023A); // LATIN SMALL LETTER A WITH STROKE, LATIN CAPITAL LETTER A WITH STROKE
+test(0x2C66, 0x023E); // LATIN SMALL LETTER T WITH DIAGONAL STROKE, LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+test(0x2C67, 0x2C68); // LATIN CAPITAL LETTER H WITH DESCENDER, LATIN SMALL LETTER H WITH DESCENDER
+test(0x2C68, 0x2C67); // LATIN SMALL LETTER H WITH DESCENDER, LATIN CAPITAL LETTER H WITH DESCENDER
+test(0x2C69, 0x2C6A); // LATIN CAPITAL LETTER K WITH DESCENDER, LATIN SMALL LETTER K WITH DESCENDER
+test(0x2C6A, 0x2C69); // LATIN SMALL LETTER K WITH DESCENDER, LATIN CAPITAL LETTER K WITH DESCENDER
+test(0x2C6B, 0x2C6C); // LATIN CAPITAL LETTER Z WITH DESCENDER, LATIN SMALL LETTER Z WITH DESCENDER
+test(0x2C6C, 0x2C6B); // LATIN SMALL LETTER Z WITH DESCENDER, LATIN CAPITAL LETTER Z WITH DESCENDER
+test(0x2C6D, 0x0251); // LATIN CAPITAL LETTER ALPHA, LATIN SMALL LETTER ALPHA (LATIN SMALL LETTER SCRIPT A)
+test(0x2C6E, 0x0271); // LATIN CAPITAL LETTER M WITH HOOK, LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK)
+test(0x2C6F, 0x0250); // LATIN CAPITAL LETTER TURNED A, LATIN SMALL LETTER TURNED A
+test(0x2C70, 0x0252); // LATIN CAPITAL LETTER TURNED ALPHA, LATIN SMALL LETTER TURNED ALPHA (LATIN SMALL LETTER TURNED SCRIPT A)
+test(0x2C72, 0x2C73); // LATIN CAPITAL LETTER W WITH HOOK, LATIN SMALL LETTER W WITH HOOK
+test(0x2C73, 0x2C72); // LATIN SMALL LETTER W WITH HOOK, LATIN CAPITAL LETTER W WITH HOOK
+test(0x2C75, 0x2C76); // LATIN CAPITAL LETTER HALF H, LATIN SMALL LETTER HALF H
+test(0x2C76, 0x2C75); // LATIN SMALL LETTER HALF H, LATIN CAPITAL LETTER HALF H
+test(0x2C7E, 0x023F); // LATIN CAPITAL LETTER S WITH SWASH TAIL, LATIN SMALL LETTER S WITH SWASH TAIL
+test(0x2C7F, 0x0240); // LATIN CAPITAL LETTER Z WITH SWASH TAIL, LATIN SMALL LETTER Z WITH SWASH TAIL
+test(0x2C80, 0x2C81); // COPTIC CAPITAL LETTER ALFA, COPTIC SMALL LETTER ALFA
+test(0x2C81, 0x2C80); // COPTIC SMALL LETTER ALFA, COPTIC CAPITAL LETTER ALFA
+test(0x2C82, 0x2C83); // COPTIC CAPITAL LETTER VIDA, COPTIC SMALL LETTER VIDA
+test(0x2C83, 0x2C82); // COPTIC SMALL LETTER VIDA, COPTIC CAPITAL LETTER VIDA
+test(0x2C84, 0x2C85); // COPTIC CAPITAL LETTER GAMMA, COPTIC SMALL LETTER GAMMA
+test(0x2C85, 0x2C84); // COPTIC SMALL LETTER GAMMA, COPTIC CAPITAL LETTER GAMMA
+test(0x2C86, 0x2C87); // COPTIC CAPITAL LETTER DALDA, COPTIC SMALL LETTER DALDA
+test(0x2C87, 0x2C86); // COPTIC SMALL LETTER DALDA, COPTIC CAPITAL LETTER DALDA
+test(0x2C88, 0x2C89); // COPTIC CAPITAL LETTER EIE, COPTIC SMALL LETTER EIE
+test(0x2C89, 0x2C88); // COPTIC SMALL LETTER EIE, COPTIC CAPITAL LETTER EIE
+test(0x2C8A, 0x2C8B); // COPTIC CAPITAL LETTER SOU, COPTIC SMALL LETTER SOU
+test(0x2C8B, 0x2C8A); // COPTIC SMALL LETTER SOU, COPTIC CAPITAL LETTER SOU
+test(0x2C8C, 0x2C8D); // COPTIC CAPITAL LETTER ZATA, COPTIC SMALL LETTER ZATA
+test(0x2C8D, 0x2C8C); // COPTIC SMALL LETTER ZATA, COPTIC CAPITAL LETTER ZATA
+test(0x2C8E, 0x2C8F); // COPTIC CAPITAL LETTER HATE, COPTIC SMALL LETTER HATE
+test(0x2C8F, 0x2C8E); // COPTIC SMALL LETTER HATE, COPTIC CAPITAL LETTER HATE
+test(0x2C90, 0x2C91); // COPTIC CAPITAL LETTER THETHE, COPTIC SMALL LETTER THETHE
+test(0x2C91, 0x2C90); // COPTIC SMALL LETTER THETHE, COPTIC CAPITAL LETTER THETHE
+test(0x2C92, 0x2C93); // COPTIC CAPITAL LETTER IAUDA, COPTIC SMALL LETTER IAUDA
+test(0x2C93, 0x2C92); // COPTIC SMALL LETTER IAUDA, COPTIC CAPITAL LETTER IAUDA
+test(0x2C94, 0x2C95); // COPTIC CAPITAL LETTER KAPA, COPTIC SMALL LETTER KAPA
+test(0x2C95, 0x2C94); // COPTIC SMALL LETTER KAPA, COPTIC CAPITAL LETTER KAPA
+test(0x2C96, 0x2C97); // COPTIC CAPITAL LETTER LAULA, COPTIC SMALL LETTER LAULA
+test(0x2C97, 0x2C96); // COPTIC SMALL LETTER LAULA, COPTIC CAPITAL LETTER LAULA
+test(0x2C98, 0x2C99); // COPTIC CAPITAL LETTER MI, COPTIC SMALL LETTER MI
+test(0x2C99, 0x2C98); // COPTIC SMALL LETTER MI, COPTIC CAPITAL LETTER MI
+test(0x2C9A, 0x2C9B); // COPTIC CAPITAL LETTER NI, COPTIC SMALL LETTER NI
+test(0x2C9B, 0x2C9A); // COPTIC SMALL LETTER NI, COPTIC CAPITAL LETTER NI
+test(0x2C9C, 0x2C9D); // COPTIC CAPITAL LETTER KSI, COPTIC SMALL LETTER KSI
+test(0x2C9D, 0x2C9C); // COPTIC SMALL LETTER KSI, COPTIC CAPITAL LETTER KSI
+test(0x2C9E, 0x2C9F); // COPTIC CAPITAL LETTER O, COPTIC SMALL LETTER O
+test(0x2C9F, 0x2C9E); // COPTIC SMALL LETTER O, COPTIC CAPITAL LETTER O
+test(0x2CA0, 0x2CA1); // COPTIC CAPITAL LETTER PI, COPTIC SMALL LETTER PI
+test(0x2CA1, 0x2CA0); // COPTIC SMALL LETTER PI, COPTIC CAPITAL LETTER PI
+test(0x2CA2, 0x2CA3); // COPTIC CAPITAL LETTER RO, COPTIC SMALL LETTER RO
+test(0x2CA3, 0x2CA2); // COPTIC SMALL LETTER RO, COPTIC CAPITAL LETTER RO
+test(0x2CA4, 0x2CA5); // COPTIC CAPITAL LETTER SIMA, COPTIC SMALL LETTER SIMA
+test(0x2CA5, 0x2CA4); // COPTIC SMALL LETTER SIMA, COPTIC CAPITAL LETTER SIMA
+test(0x2CA6, 0x2CA7); // COPTIC CAPITAL LETTER TAU, COPTIC SMALL LETTER TAU
+test(0x2CA7, 0x2CA6); // COPTIC SMALL LETTER TAU, COPTIC CAPITAL LETTER TAU
+test(0x2CA8, 0x2CA9); // COPTIC CAPITAL LETTER UA, COPTIC SMALL LETTER UA
+test(0x2CA9, 0x2CA8); // COPTIC SMALL LETTER UA, COPTIC CAPITAL LETTER UA
+test(0x2CAA, 0x2CAB); // COPTIC CAPITAL LETTER FI, COPTIC SMALL LETTER FI
+test(0x2CAB, 0x2CAA); // COPTIC SMALL LETTER FI, COPTIC CAPITAL LETTER FI
+test(0x2CAC, 0x2CAD); // COPTIC CAPITAL LETTER KHI, COPTIC SMALL LETTER KHI
+test(0x2CAD, 0x2CAC); // COPTIC SMALL LETTER KHI, COPTIC CAPITAL LETTER KHI
+test(0x2CAE, 0x2CAF); // COPTIC CAPITAL LETTER PSI, COPTIC SMALL LETTER PSI
+test(0x2CAF, 0x2CAE); // COPTIC SMALL LETTER PSI, COPTIC CAPITAL LETTER PSI
+test(0x2CB0, 0x2CB1); // COPTIC CAPITAL LETTER OOU, COPTIC SMALL LETTER OOU
+test(0x2CB1, 0x2CB0); // COPTIC SMALL LETTER OOU, COPTIC CAPITAL LETTER OOU
+test(0x2CB2, 0x2CB3); // COPTIC CAPITAL LETTER DIALECT-P ALEF, COPTIC SMALL LETTER DIALECT-P ALEF
+test(0x2CB3, 0x2CB2); // COPTIC SMALL LETTER DIALECT-P ALEF, COPTIC CAPITAL LETTER DIALECT-P ALEF
+test(0x2CB4, 0x2CB5); // COPTIC CAPITAL LETTER OLD COPTIC AIN, COPTIC SMALL LETTER OLD COPTIC AIN
+test(0x2CB5, 0x2CB4); // COPTIC SMALL LETTER OLD COPTIC AIN, COPTIC CAPITAL LETTER OLD COPTIC AIN
+test(0x2CB6, 0x2CB7); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE, COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+test(0x2CB7, 0x2CB6); // COPTIC SMALL LETTER CRYPTOGRAMMIC EIE, COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+test(0x2CB8, 0x2CB9); // COPTIC CAPITAL LETTER DIALECT-P KAPA, COPTIC SMALL LETTER DIALECT-P KAPA
+test(0x2CB9, 0x2CB8); // COPTIC SMALL LETTER DIALECT-P KAPA, COPTIC CAPITAL LETTER DIALECT-P KAPA
+test(0x2CBA, 0x2CBB); // COPTIC CAPITAL LETTER DIALECT-P NI, COPTIC SMALL LETTER DIALECT-P NI
+test(0x2CBB, 0x2CBA); // COPTIC SMALL LETTER DIALECT-P NI, COPTIC CAPITAL LETTER DIALECT-P NI
+test(0x2CBC, 0x2CBD); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI, COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+test(0x2CBD, 0x2CBC); // COPTIC SMALL LETTER CRYPTOGRAMMIC NI, COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+test(0x2CBE, 0x2CBF); // COPTIC CAPITAL LETTER OLD COPTIC OOU, COPTIC SMALL LETTER OLD COPTIC OOU
+test(0x2CBF, 0x2CBE); // COPTIC SMALL LETTER OLD COPTIC OOU, COPTIC CAPITAL LETTER OLD COPTIC OOU
+test(0x2CC0, 0x2CC1); // COPTIC CAPITAL LETTER SAMPI, COPTIC SMALL LETTER SAMPI
+test(0x2CC1, 0x2CC0); // COPTIC SMALL LETTER SAMPI, COPTIC CAPITAL LETTER SAMPI
+test(0x2CC2, 0x2CC3); // COPTIC CAPITAL LETTER CROSSED SHEI, COPTIC SMALL LETTER CROSSED SHEI
+test(0x2CC3, 0x2CC2); // COPTIC SMALL LETTER CROSSED SHEI, COPTIC CAPITAL LETTER CROSSED SHEI
+test(0x2CC4, 0x2CC5); // COPTIC CAPITAL LETTER OLD COPTIC SHEI, COPTIC SMALL LETTER OLD COPTIC SHEI
+test(0x2CC5, 0x2CC4); // COPTIC SMALL LETTER OLD COPTIC SHEI, COPTIC CAPITAL LETTER OLD COPTIC SHEI
+test(0x2CC6, 0x2CC7); // COPTIC CAPITAL LETTER OLD COPTIC ESH, COPTIC SMALL LETTER OLD COPTIC ESH
+test(0x2CC7, 0x2CC6); // COPTIC SMALL LETTER OLD COPTIC ESH, COPTIC CAPITAL LETTER OLD COPTIC ESH
+test(0x2CC8, 0x2CC9); // COPTIC CAPITAL LETTER AKHMIMIC KHEI, COPTIC SMALL LETTER AKHMIMIC KHEI
+test(0x2CC9, 0x2CC8); // COPTIC SMALL LETTER AKHMIMIC KHEI, COPTIC CAPITAL LETTER AKHMIMIC KHEI
+test(0x2CCA, 0x2CCB); // COPTIC CAPITAL LETTER DIALECT-P HORI, COPTIC SMALL LETTER DIALECT-P HORI
+test(0x2CCB, 0x2CCA); // COPTIC SMALL LETTER DIALECT-P HORI, COPTIC CAPITAL LETTER DIALECT-P HORI
+test(0x2CCC, 0x2CCD); // COPTIC CAPITAL LETTER OLD COPTIC HORI, COPTIC SMALL LETTER OLD COPTIC HORI
+test(0x2CCD, 0x2CCC); // COPTIC SMALL LETTER OLD COPTIC HORI, COPTIC CAPITAL LETTER OLD COPTIC HORI
+test(0x2CCE, 0x2CCF); // COPTIC CAPITAL LETTER OLD COPTIC HA, COPTIC SMALL LETTER OLD COPTIC HA
+test(0x2CCF, 0x2CCE); // COPTIC SMALL LETTER OLD COPTIC HA, COPTIC CAPITAL LETTER OLD COPTIC HA
+test(0x2CD0, 0x2CD1); // COPTIC CAPITAL LETTER L-SHAPED HA, COPTIC SMALL LETTER L-SHAPED HA
+test(0x2CD1, 0x2CD0); // COPTIC SMALL LETTER L-SHAPED HA, COPTIC CAPITAL LETTER L-SHAPED HA
+test(0x2CD2, 0x2CD3); // COPTIC CAPITAL LETTER OLD COPTIC HEI, COPTIC SMALL LETTER OLD COPTIC HEI
+test(0x2CD3, 0x2CD2); // COPTIC SMALL LETTER OLD COPTIC HEI, COPTIC CAPITAL LETTER OLD COPTIC HEI
+test(0x2CD4, 0x2CD5); // COPTIC CAPITAL LETTER OLD COPTIC HAT, COPTIC SMALL LETTER OLD COPTIC HAT
+test(0x2CD5, 0x2CD4); // COPTIC SMALL LETTER OLD COPTIC HAT, COPTIC CAPITAL LETTER OLD COPTIC HAT
+test(0x2CD6, 0x2CD7); // COPTIC CAPITAL LETTER OLD COPTIC GANGIA, COPTIC SMALL LETTER OLD COPTIC GANGIA
+test(0x2CD7, 0x2CD6); // COPTIC SMALL LETTER OLD COPTIC GANGIA, COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+test(0x2CD8, 0x2CD9); // COPTIC CAPITAL LETTER OLD COPTIC DJA, COPTIC SMALL LETTER OLD COPTIC DJA
+test(0x2CD9, 0x2CD8); // COPTIC SMALL LETTER OLD COPTIC DJA, COPTIC CAPITAL LETTER OLD COPTIC DJA
+test(0x2CDA, 0x2CDB); // COPTIC CAPITAL LETTER OLD COPTIC SHIMA, COPTIC SMALL LETTER OLD COPTIC SHIMA
+test(0x2CDB, 0x2CDA); // COPTIC SMALL LETTER OLD COPTIC SHIMA, COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+test(0x2CDC, 0x2CDD); // COPTIC CAPITAL LETTER OLD NUBIAN SHIMA, COPTIC SMALL LETTER OLD NUBIAN SHIMA
+test(0x2CDD, 0x2CDC); // COPTIC SMALL LETTER OLD NUBIAN SHIMA, COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+test(0x2CDE, 0x2CDF); // COPTIC CAPITAL LETTER OLD NUBIAN NGI, COPTIC SMALL LETTER OLD NUBIAN NGI
+test(0x2CDF, 0x2CDE); // COPTIC SMALL LETTER OLD NUBIAN NGI, COPTIC CAPITAL LETTER OLD NUBIAN NGI
+test(0x2CE0, 0x2CE1); // COPTIC CAPITAL LETTER OLD NUBIAN NYI, COPTIC SMALL LETTER OLD NUBIAN NYI
+test(0x2CE1, 0x2CE0); // COPTIC SMALL LETTER OLD NUBIAN NYI, COPTIC CAPITAL LETTER OLD NUBIAN NYI
+test(0x2CE2, 0x2CE3); // COPTIC CAPITAL LETTER OLD NUBIAN WAU, COPTIC SMALL LETTER OLD NUBIAN WAU
+test(0x2CE3, 0x2CE2); // COPTIC SMALL LETTER OLD NUBIAN WAU, COPTIC CAPITAL LETTER OLD NUBIAN WAU
+test(0x2CEB, 0x2CEC); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI, COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+test(0x2CEC, 0x2CEB); // COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI, COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+test(0x2CED, 0x2CEE); // COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA, COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+test(0x2CEE, 0x2CED); // COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA, COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+test(0x2CF2, 0x2CF3); // COPTIC CAPITAL LETTER BOHAIRIC KHEI, COPTIC SMALL LETTER BOHAIRIC KHEI
+test(0x2CF3, 0x2CF2); // COPTIC SMALL LETTER BOHAIRIC KHEI, COPTIC CAPITAL LETTER BOHAIRIC KHEI
+test(0x2D00, 0x10A0); // GEORGIAN SMALL LETTER AN, GEORGIAN CAPITAL LETTER AN
+test(0x2D01, 0x10A1); // GEORGIAN SMALL LETTER BAN, GEORGIAN CAPITAL LETTER BAN
+test(0x2D02, 0x10A2); // GEORGIAN SMALL LETTER GAN, GEORGIAN CAPITAL LETTER GAN
+test(0x2D03, 0x10A3); // GEORGIAN SMALL LETTER DON, GEORGIAN CAPITAL LETTER DON
+test(0x2D04, 0x10A4); // GEORGIAN SMALL LETTER EN, GEORGIAN CAPITAL LETTER EN
+test(0x2D05, 0x10A5); // GEORGIAN SMALL LETTER VIN, GEORGIAN CAPITAL LETTER VIN
+test(0x2D06, 0x10A6); // GEORGIAN SMALL LETTER ZEN, GEORGIAN CAPITAL LETTER ZEN
+test(0x2D07, 0x10A7); // GEORGIAN SMALL LETTER TAN, GEORGIAN CAPITAL LETTER TAN
+test(0x2D08, 0x10A8); // GEORGIAN SMALL LETTER IN, GEORGIAN CAPITAL LETTER IN
+test(0x2D09, 0x10A9); // GEORGIAN SMALL LETTER KAN, GEORGIAN CAPITAL LETTER KAN
+test(0x2D0A, 0x10AA); // GEORGIAN SMALL LETTER LAS, GEORGIAN CAPITAL LETTER LAS
+test(0x2D0B, 0x10AB); // GEORGIAN SMALL LETTER MAN, GEORGIAN CAPITAL LETTER MAN
+test(0x2D0C, 0x10AC); // GEORGIAN SMALL LETTER NAR, GEORGIAN CAPITAL LETTER NAR
+test(0x2D0D, 0x10AD); // GEORGIAN SMALL LETTER ON, GEORGIAN CAPITAL LETTER ON
+test(0x2D0E, 0x10AE); // GEORGIAN SMALL LETTER PAR, GEORGIAN CAPITAL LETTER PAR
+test(0x2D0F, 0x10AF); // GEORGIAN SMALL LETTER ZHAR, GEORGIAN CAPITAL LETTER ZHAR
+test(0x2D10, 0x10B0); // GEORGIAN SMALL LETTER RAE, GEORGIAN CAPITAL LETTER RAE
+test(0x2D11, 0x10B1); // GEORGIAN SMALL LETTER SAN, GEORGIAN CAPITAL LETTER SAN
+test(0x2D12, 0x10B2); // GEORGIAN SMALL LETTER TAR, GEORGIAN CAPITAL LETTER TAR
+test(0x2D13, 0x10B3); // GEORGIAN SMALL LETTER UN, GEORGIAN CAPITAL LETTER UN
+test(0x2D14, 0x10B4); // GEORGIAN SMALL LETTER PHAR, GEORGIAN CAPITAL LETTER PHAR
+test(0x2D15, 0x10B5); // GEORGIAN SMALL LETTER KHAR, GEORGIAN CAPITAL LETTER KHAR
+test(0x2D16, 0x10B6); // GEORGIAN SMALL LETTER GHAN, GEORGIAN CAPITAL LETTER GHAN
+test(0x2D17, 0x10B7); // GEORGIAN SMALL LETTER QAR, GEORGIAN CAPITAL LETTER QAR
+test(0x2D18, 0x10B8); // GEORGIAN SMALL LETTER SHIN, GEORGIAN CAPITAL LETTER SHIN
+test(0x2D19, 0x10B9); // GEORGIAN SMALL LETTER CHIN, GEORGIAN CAPITAL LETTER CHIN
+test(0x2D1A, 0x10BA); // GEORGIAN SMALL LETTER CAN, GEORGIAN CAPITAL LETTER CAN
+test(0x2D1B, 0x10BB); // GEORGIAN SMALL LETTER JIL, GEORGIAN CAPITAL LETTER JIL
+test(0x2D1C, 0x10BC); // GEORGIAN SMALL LETTER CIL, GEORGIAN CAPITAL LETTER CIL
+test(0x2D1D, 0x10BD); // GEORGIAN SMALL LETTER CHAR, GEORGIAN CAPITAL LETTER CHAR
+test(0x2D1E, 0x10BE); // GEORGIAN SMALL LETTER XAN, GEORGIAN CAPITAL LETTER XAN
+test(0x2D1F, 0x10BF); // GEORGIAN SMALL LETTER JHAN, GEORGIAN CAPITAL LETTER JHAN
+test(0x2D20, 0x10C0); // GEORGIAN SMALL LETTER HAE, GEORGIAN CAPITAL LETTER HAE
+test(0x2D21, 0x10C1); // GEORGIAN SMALL LETTER HE, GEORGIAN CAPITAL LETTER HE
+test(0x2D22, 0x10C2); // GEORGIAN SMALL LETTER HIE, GEORGIAN CAPITAL LETTER HIE
+test(0x2D23, 0x10C3); // GEORGIAN SMALL LETTER WE, GEORGIAN CAPITAL LETTER WE
+test(0x2D24, 0x10C4); // GEORGIAN SMALL LETTER HAR, GEORGIAN CAPITAL LETTER HAR
+test(0x2D25, 0x10C5); // GEORGIAN SMALL LETTER HOE, GEORGIAN CAPITAL LETTER HOE
+test(0x2D27, 0x10C7); // GEORGIAN SMALL LETTER YN, GEORGIAN CAPITAL LETTER YN
+test(0x2D2D, 0x10CD); // GEORGIAN SMALL LETTER AEN, GEORGIAN CAPITAL LETTER AEN
+test(0xA640, 0xA641); // CYRILLIC CAPITAL LETTER ZEMLYA, CYRILLIC SMALL LETTER ZEMLYA
+test(0xA641, 0xA640); // CYRILLIC SMALL LETTER ZEMLYA, CYRILLIC CAPITAL LETTER ZEMLYA
+test(0xA642, 0xA643); // CYRILLIC CAPITAL LETTER DZELO, CYRILLIC SMALL LETTER DZELO
+test(0xA643, 0xA642); // CYRILLIC SMALL LETTER DZELO, CYRILLIC CAPITAL LETTER DZELO
+test(0xA644, 0xA645); // CYRILLIC CAPITAL LETTER REVERSED DZE, CYRILLIC SMALL LETTER REVERSED DZE
+test(0xA645, 0xA644); // CYRILLIC SMALL LETTER REVERSED DZE, CYRILLIC CAPITAL LETTER REVERSED DZE
+test(0xA646, 0xA647); // CYRILLIC CAPITAL LETTER IOTA, CYRILLIC SMALL LETTER IOTA
+test(0xA647, 0xA646); // CYRILLIC SMALL LETTER IOTA, CYRILLIC CAPITAL LETTER IOTA
+test(0xA648, 0xA649); // CYRILLIC CAPITAL LETTER DJERV, CYRILLIC SMALL LETTER DJERV
+test(0xA649, 0xA648); // CYRILLIC SMALL LETTER DJERV, CYRILLIC CAPITAL LETTER DJERV
+test(0xA64A, 0xA64B, 0x1C88); // CYRILLIC CAPITAL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER UNBLENDED UK
+test(0xA64B, 0x1C88, 0xA64A); // CYRILLIC SMALL LETTER MONOGRAPH UK, CYRILLIC SMALL LETTER UNBLENDED UK, CYRILLIC CAPITAL LETTER MONOGRAPH UK
+test(0xA64C, 0xA64D); // CYRILLIC CAPITAL LETTER BROAD OMEGA, CYRILLIC SMALL LETTER BROAD OMEGA
+test(0xA64D, 0xA64C); // CYRILLIC SMALL LETTER BROAD OMEGA, CYRILLIC CAPITAL LETTER BROAD OMEGA
+test(0xA64E, 0xA64F); // CYRILLIC CAPITAL LETTER NEUTRAL YER, CYRILLIC SMALL LETTER NEUTRAL YER
+test(0xA64F, 0xA64E); // CYRILLIC SMALL LETTER NEUTRAL YER, CYRILLIC CAPITAL LETTER NEUTRAL YER
+test(0xA650, 0xA651); // CYRILLIC CAPITAL LETTER YERU WITH BACK YER, CYRILLIC SMALL LETTER YERU WITH BACK YER
+test(0xA651, 0xA650); // CYRILLIC SMALL LETTER YERU WITH BACK YER, CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+test(0xA652, 0xA653); // CYRILLIC CAPITAL LETTER IOTIFIED YAT, CYRILLIC SMALL LETTER IOTIFIED YAT
+test(0xA653, 0xA652); // CYRILLIC SMALL LETTER IOTIFIED YAT, CYRILLIC CAPITAL LETTER IOTIFIED YAT
+test(0xA654, 0xA655); // CYRILLIC CAPITAL LETTER REVERSED YU, CYRILLIC SMALL LETTER REVERSED YU
+test(0xA655, 0xA654); // CYRILLIC SMALL LETTER REVERSED YU, CYRILLIC CAPITAL LETTER REVERSED YU
+test(0xA656, 0xA657); // CYRILLIC CAPITAL LETTER IOTIFIED A, CYRILLIC SMALL LETTER IOTIFIED A
+test(0xA657, 0xA656); // CYRILLIC SMALL LETTER IOTIFIED A, CYRILLIC CAPITAL LETTER IOTIFIED A
+test(0xA658, 0xA659); // CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS, CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+test(0xA659, 0xA658); // CYRILLIC SMALL LETTER CLOSED LITTLE YUS, CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+test(0xA65A, 0xA65B); // CYRILLIC CAPITAL LETTER BLENDED YUS, CYRILLIC SMALL LETTER BLENDED YUS
+test(0xA65B, 0xA65A); // CYRILLIC SMALL LETTER BLENDED YUS, CYRILLIC CAPITAL LETTER BLENDED YUS
+test(0xA65C, 0xA65D); // CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS, CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+test(0xA65D, 0xA65C); // CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS, CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+test(0xA65E, 0xA65F); // CYRILLIC CAPITAL LETTER YN, CYRILLIC SMALL LETTER YN
+test(0xA65F, 0xA65E); // CYRILLIC SMALL LETTER YN, CYRILLIC CAPITAL LETTER YN
+test(0xA660, 0xA661); // CYRILLIC CAPITAL LETTER REVERSED TSE, CYRILLIC SMALL LETTER REVERSED TSE
+test(0xA661, 0xA660); // CYRILLIC SMALL LETTER REVERSED TSE, CYRILLIC CAPITAL LETTER REVERSED TSE
+test(0xA662, 0xA663); // CYRILLIC CAPITAL LETTER SOFT DE, CYRILLIC SMALL LETTER SOFT DE
+test(0xA663, 0xA662); // CYRILLIC SMALL LETTER SOFT DE, CYRILLIC CAPITAL LETTER SOFT DE
+test(0xA664, 0xA665); // CYRILLIC CAPITAL LETTER SOFT EL, CYRILLIC SMALL LETTER SOFT EL
+test(0xA665, 0xA664); // CYRILLIC SMALL LETTER SOFT EL, CYRILLIC CAPITAL LETTER SOFT EL
+test(0xA666, 0xA667); // CYRILLIC CAPITAL LETTER SOFT EM, CYRILLIC SMALL LETTER SOFT EM
+test(0xA667, 0xA666); // CYRILLIC SMALL LETTER SOFT EM, CYRILLIC CAPITAL LETTER SOFT EM
+test(0xA668, 0xA669); // CYRILLIC CAPITAL LETTER MONOCULAR O, CYRILLIC SMALL LETTER MONOCULAR O
+test(0xA669, 0xA668); // CYRILLIC SMALL LETTER MONOCULAR O, CYRILLIC CAPITAL LETTER MONOCULAR O
+test(0xA66A, 0xA66B); // CYRILLIC CAPITAL LETTER BINOCULAR O, CYRILLIC SMALL LETTER BINOCULAR O
+test(0xA66B, 0xA66A); // CYRILLIC SMALL LETTER BINOCULAR O, CYRILLIC CAPITAL LETTER BINOCULAR O
+test(0xA66C, 0xA66D); // CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O, CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+test(0xA66D, 0xA66C); // CYRILLIC SMALL LETTER DOUBLE MONOCULAR O, CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+test(0xA680, 0xA681); // CYRILLIC CAPITAL LETTER DWE, CYRILLIC SMALL LETTER DWE
+test(0xA681, 0xA680); // CYRILLIC SMALL LETTER DWE, CYRILLIC CAPITAL LETTER DWE
+test(0xA682, 0xA683); // CYRILLIC CAPITAL LETTER DZWE, CYRILLIC SMALL LETTER DZWE
+test(0xA683, 0xA682); // CYRILLIC SMALL LETTER DZWE, CYRILLIC CAPITAL LETTER DZWE
+test(0xA684, 0xA685); // CYRILLIC CAPITAL LETTER ZHWE, CYRILLIC SMALL LETTER ZHWE
+test(0xA685, 0xA684); // CYRILLIC SMALL LETTER ZHWE, CYRILLIC CAPITAL LETTER ZHWE
+test(0xA686, 0xA687); // CYRILLIC CAPITAL LETTER CCHE, CYRILLIC SMALL LETTER CCHE
+test(0xA687, 0xA686); // CYRILLIC SMALL LETTER CCHE, CYRILLIC CAPITAL LETTER CCHE
+test(0xA688, 0xA689); // CYRILLIC CAPITAL LETTER DZZE, CYRILLIC SMALL LETTER DZZE
+test(0xA689, 0xA688); // CYRILLIC SMALL LETTER DZZE, CYRILLIC CAPITAL LETTER DZZE
+test(0xA68A, 0xA68B); // CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK, CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+test(0xA68B, 0xA68A); // CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK, CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+test(0xA68C, 0xA68D); // CYRILLIC CAPITAL LETTER TWE, CYRILLIC SMALL LETTER TWE
+test(0xA68D, 0xA68C); // CYRILLIC SMALL LETTER TWE, CYRILLIC CAPITAL LETTER TWE
+test(0xA68E, 0xA68F); // CYRILLIC CAPITAL LETTER TSWE, CYRILLIC SMALL LETTER TSWE
+test(0xA68F, 0xA68E); // CYRILLIC SMALL LETTER TSWE, CYRILLIC CAPITAL LETTER TSWE
+test(0xA690, 0xA691); // CYRILLIC CAPITAL LETTER TSSE, CYRILLIC SMALL LETTER TSSE
+test(0xA691, 0xA690); // CYRILLIC SMALL LETTER TSSE, CYRILLIC CAPITAL LETTER TSSE
+test(0xA692, 0xA693); // CYRILLIC CAPITAL LETTER TCHE, CYRILLIC SMALL LETTER TCHE
+test(0xA693, 0xA692); // CYRILLIC SMALL LETTER TCHE, CYRILLIC CAPITAL LETTER TCHE
+test(0xA694, 0xA695); // CYRILLIC CAPITAL LETTER HWE, CYRILLIC SMALL LETTER HWE
+test(0xA695, 0xA694); // CYRILLIC SMALL LETTER HWE, CYRILLIC CAPITAL LETTER HWE
+test(0xA696, 0xA697); // CYRILLIC CAPITAL LETTER SHWE, CYRILLIC SMALL LETTER SHWE
+test(0xA697, 0xA696); // CYRILLIC SMALL LETTER SHWE, CYRILLIC CAPITAL LETTER SHWE
+test(0xA698, 0xA699); // CYRILLIC CAPITAL LETTER DOUBLE O, CYRILLIC SMALL LETTER DOUBLE O
+test(0xA699, 0xA698); // CYRILLIC SMALL LETTER DOUBLE O, CYRILLIC CAPITAL LETTER DOUBLE O
+test(0xA69A, 0xA69B); // CYRILLIC CAPITAL LETTER CROSSED O, CYRILLIC SMALL LETTER CROSSED O
+test(0xA69B, 0xA69A); // CYRILLIC SMALL LETTER CROSSED O, CYRILLIC CAPITAL LETTER CROSSED O
+test(0xA722, 0xA723); // LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF, LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+test(0xA723, 0xA722); // LATIN SMALL LETTER EGYPTOLOGICAL ALEF, LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+test(0xA724, 0xA725); // LATIN CAPITAL LETTER EGYPTOLOGICAL AIN, LATIN SMALL LETTER EGYPTOLOGICAL AIN
+test(0xA725, 0xA724); // LATIN SMALL LETTER EGYPTOLOGICAL AIN, LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+test(0xA726, 0xA727); // LATIN CAPITAL LETTER HENG, LATIN SMALL LETTER HENG
+test(0xA727, 0xA726); // LATIN SMALL LETTER HENG, LATIN CAPITAL LETTER HENG
+test(0xA728, 0xA729); // LATIN CAPITAL LETTER TZ, LATIN SMALL LETTER TZ
+test(0xA729, 0xA728); // LATIN SMALL LETTER TZ, LATIN CAPITAL LETTER TZ
+test(0xA72A, 0xA72B); // LATIN CAPITAL LETTER TRESILLO, LATIN SMALL LETTER TRESILLO
+test(0xA72B, 0xA72A); // LATIN SMALL LETTER TRESILLO, LATIN CAPITAL LETTER TRESILLO
+test(0xA72C, 0xA72D); // LATIN CAPITAL LETTER CUATRILLO, LATIN SMALL LETTER CUATRILLO
+test(0xA72D, 0xA72C); // LATIN SMALL LETTER CUATRILLO, LATIN CAPITAL LETTER CUATRILLO
+test(0xA72E, 0xA72F); // LATIN CAPITAL LETTER CUATRILLO WITH COMMA, LATIN SMALL LETTER CUATRILLO WITH COMMA
+test(0xA72F, 0xA72E); // LATIN SMALL LETTER CUATRILLO WITH COMMA, LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+test(0xA732, 0xA733); // LATIN CAPITAL LETTER AA, LATIN SMALL LETTER AA
+test(0xA733, 0xA732); // LATIN SMALL LETTER AA, LATIN CAPITAL LETTER AA
+test(0xA734, 0xA735); // LATIN CAPITAL LETTER AO, LATIN SMALL LETTER AO
+test(0xA735, 0xA734); // LATIN SMALL LETTER AO, LATIN CAPITAL LETTER AO
+test(0xA736, 0xA737); // LATIN CAPITAL LETTER AU, LATIN SMALL LETTER AU
+test(0xA737, 0xA736); // LATIN SMALL LETTER AU, LATIN CAPITAL LETTER AU
+test(0xA738, 0xA739); // LATIN CAPITAL LETTER AV, LATIN SMALL LETTER AV
+test(0xA739, 0xA738); // LATIN SMALL LETTER AV, LATIN CAPITAL LETTER AV
+test(0xA73A, 0xA73B); // LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR, LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+test(0xA73B, 0xA73A); // LATIN SMALL LETTER AV WITH HORIZONTAL BAR, LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+test(0xA73C, 0xA73D); // LATIN CAPITAL LETTER AY, LATIN SMALL LETTER AY
+test(0xA73D, 0xA73C); // LATIN SMALL LETTER AY, LATIN CAPITAL LETTER AY
+test(0xA73E, 0xA73F); // LATIN CAPITAL LETTER REVERSED C WITH DOT, LATIN SMALL LETTER REVERSED C WITH DOT
+test(0xA73F, 0xA73E); // LATIN SMALL LETTER REVERSED C WITH DOT, LATIN CAPITAL LETTER REVERSED C WITH DOT
+test(0xA740, 0xA741); // LATIN CAPITAL LETTER K WITH STROKE, LATIN SMALL LETTER K WITH STROKE
+test(0xA741, 0xA740); // LATIN SMALL LETTER K WITH STROKE, LATIN CAPITAL LETTER K WITH STROKE
+test(0xA742, 0xA743); // LATIN CAPITAL LETTER K WITH DIAGONAL STROKE, LATIN SMALL LETTER K WITH DIAGONAL STROKE
+test(0xA743, 0xA742); // LATIN SMALL LETTER K WITH DIAGONAL STROKE, LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+test(0xA744, 0xA745); // LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE, LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+test(0xA745, 0xA744); // LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE, LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+test(0xA746, 0xA747); // LATIN CAPITAL LETTER BROKEN L, LATIN SMALL LETTER BROKEN L
+test(0xA747, 0xA746); // LATIN SMALL LETTER BROKEN L, LATIN CAPITAL LETTER BROKEN L
+test(0xA748, 0xA749); // LATIN CAPITAL LETTER L WITH HIGH STROKE, LATIN SMALL LETTER L WITH HIGH STROKE
+test(0xA749, 0xA748); // LATIN SMALL LETTER L WITH HIGH STROKE, LATIN CAPITAL LETTER L WITH HIGH STROKE
+test(0xA74A, 0xA74B); // LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY, LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+test(0xA74B, 0xA74A); // LATIN SMALL LETTER O WITH LONG STROKE OVERLAY, LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+test(0xA74C, 0xA74D); // LATIN CAPITAL LETTER O WITH LOOP, LATIN SMALL LETTER O WITH LOOP
+test(0xA74D, 0xA74C); // LATIN SMALL LETTER O WITH LOOP, LATIN CAPITAL LETTER O WITH LOOP
+test(0xA74E, 0xA74F); // LATIN CAPITAL LETTER OO, LATIN SMALL LETTER OO
+test(0xA74F, 0xA74E); // LATIN SMALL LETTER OO, LATIN CAPITAL LETTER OO
+test(0xA750, 0xA751); // LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+test(0xA751, 0xA750); // LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+test(0xA752, 0xA753); // LATIN CAPITAL LETTER P WITH FLOURISH, LATIN SMALL LETTER P WITH FLOURISH
+test(0xA753, 0xA752); // LATIN SMALL LETTER P WITH FLOURISH, LATIN CAPITAL LETTER P WITH FLOURISH
+test(0xA754, 0xA755); // LATIN CAPITAL LETTER P WITH SQUIRREL TAIL, LATIN SMALL LETTER P WITH SQUIRREL TAIL
+test(0xA755, 0xA754); // LATIN SMALL LETTER P WITH SQUIRREL TAIL, LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+test(0xA756, 0xA757); // LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+test(0xA757, 0xA756); // LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+test(0xA758, 0xA759); // LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE, LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+test(0xA759, 0xA758); // LATIN SMALL LETTER Q WITH DIAGONAL STROKE, LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+test(0xA75A, 0xA75B); // LATIN CAPITAL LETTER R ROTUNDA, LATIN SMALL LETTER R ROTUNDA
+test(0xA75B, 0xA75A); // LATIN SMALL LETTER R ROTUNDA, LATIN CAPITAL LETTER R ROTUNDA
+test(0xA75C, 0xA75D); // LATIN CAPITAL LETTER RUM ROTUNDA, LATIN SMALL LETTER RUM ROTUNDA
+test(0xA75D, 0xA75C); // LATIN SMALL LETTER RUM ROTUNDA, LATIN CAPITAL LETTER RUM ROTUNDA
+test(0xA75E, 0xA75F); // LATIN CAPITAL LETTER V WITH DIAGONAL STROKE, LATIN SMALL LETTER V WITH DIAGONAL STROKE
+test(0xA75F, 0xA75E); // LATIN SMALL LETTER V WITH DIAGONAL STROKE, LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+test(0xA760, 0xA761); // LATIN CAPITAL LETTER VY, LATIN SMALL LETTER VY
+test(0xA761, 0xA760); // LATIN SMALL LETTER VY, LATIN CAPITAL LETTER VY
+test(0xA762, 0xA763); // LATIN CAPITAL LETTER VISIGOTHIC Z, LATIN SMALL LETTER VISIGOTHIC Z
+test(0xA763, 0xA762); // LATIN SMALL LETTER VISIGOTHIC Z, LATIN CAPITAL LETTER VISIGOTHIC Z
+test(0xA764, 0xA765); // LATIN CAPITAL LETTER THORN WITH STROKE, LATIN SMALL LETTER THORN WITH STROKE
+test(0xA765, 0xA764); // LATIN SMALL LETTER THORN WITH STROKE, LATIN CAPITAL LETTER THORN WITH STROKE
+test(0xA766, 0xA767); // LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER, LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+test(0xA767, 0xA766); // LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER, LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+test(0xA768, 0xA769); // LATIN CAPITAL LETTER VEND, LATIN SMALL LETTER VEND
+test(0xA769, 0xA768); // LATIN SMALL LETTER VEND, LATIN CAPITAL LETTER VEND
+test(0xA76A, 0xA76B); // LATIN CAPITAL LETTER ET, LATIN SMALL LETTER ET
+test(0xA76B, 0xA76A); // LATIN SMALL LETTER ET, LATIN CAPITAL LETTER ET
+test(0xA76C, 0xA76D); // LATIN CAPITAL LETTER IS, LATIN SMALL LETTER IS
+test(0xA76D, 0xA76C); // LATIN SMALL LETTER IS, LATIN CAPITAL LETTER IS
+test(0xA76E, 0xA76F); // LATIN CAPITAL LETTER CON, LATIN SMALL LETTER CON
+test(0xA76F, 0xA76E); // LATIN SMALL LETTER CON, LATIN CAPITAL LETTER CON
+test(0xA779, 0xA77A); // LATIN CAPITAL LETTER INSULAR D, LATIN SMALL LETTER INSULAR D
+test(0xA77A, 0xA779); // LATIN SMALL LETTER INSULAR D, LATIN CAPITAL LETTER INSULAR D
+test(0xA77B, 0xA77C); // LATIN CAPITAL LETTER INSULAR F, LATIN SMALL LETTER INSULAR F
+test(0xA77C, 0xA77B); // LATIN SMALL LETTER INSULAR F, LATIN CAPITAL LETTER INSULAR F
+test(0xA77D, 0x1D79); // LATIN CAPITAL LETTER INSULAR G, LATIN SMALL LETTER INSULAR G
+test(0xA77E, 0xA77F); // LATIN CAPITAL LETTER TURNED INSULAR G, LATIN SMALL LETTER TURNED INSULAR G
+test(0xA77F, 0xA77E); // LATIN SMALL LETTER TURNED INSULAR G, LATIN CAPITAL LETTER TURNED INSULAR G
+test(0xA780, 0xA781); // LATIN CAPITAL LETTER TURNED L, LATIN SMALL LETTER TURNED L
+test(0xA781, 0xA780); // LATIN SMALL LETTER TURNED L, LATIN CAPITAL LETTER TURNED L
+test(0xA782, 0xA783); // LATIN CAPITAL LETTER INSULAR R, LATIN SMALL LETTER INSULAR R
+test(0xA783, 0xA782); // LATIN SMALL LETTER INSULAR R, LATIN CAPITAL LETTER INSULAR R
+test(0xA784, 0xA785); // LATIN CAPITAL LETTER INSULAR S, LATIN SMALL LETTER INSULAR S
+test(0xA785, 0xA784); // LATIN SMALL LETTER INSULAR S, LATIN CAPITAL LETTER INSULAR S
+test(0xA786, 0xA787); // LATIN CAPITAL LETTER INSULAR T, LATIN SMALL LETTER INSULAR T
+test(0xA787, 0xA786); // LATIN SMALL LETTER INSULAR T, LATIN CAPITAL LETTER INSULAR T
+test(0xA78B, 0xA78C); // LATIN CAPITAL LETTER SALTILLO, LATIN SMALL LETTER SALTILLO
+test(0xA78C, 0xA78B); // LATIN SMALL LETTER SALTILLO, LATIN CAPITAL LETTER SALTILLO
+test(0xA78D, 0x0265); // LATIN CAPITAL LETTER TURNED H, LATIN SMALL LETTER TURNED H
+test(0xA790, 0xA791); // LATIN CAPITAL LETTER N WITH DESCENDER, LATIN SMALL LETTER N WITH DESCENDER
+test(0xA791, 0xA790); // LATIN SMALL LETTER N WITH DESCENDER, LATIN CAPITAL LETTER N WITH DESCENDER
+test(0xA792, 0xA793); // LATIN CAPITAL LETTER C WITH BAR, LATIN SMALL LETTER C WITH BAR
+test(0xA793, 0xA792); // LATIN SMALL LETTER C WITH BAR, LATIN CAPITAL LETTER C WITH BAR
+test(0xA796, 0xA797); // LATIN CAPITAL LETTER B WITH FLOURISH, LATIN SMALL LETTER B WITH FLOURISH
+test(0xA797, 0xA796); // LATIN SMALL LETTER B WITH FLOURISH, LATIN CAPITAL LETTER B WITH FLOURISH
+test(0xA798, 0xA799); // LATIN CAPITAL LETTER F WITH STROKE, LATIN SMALL LETTER F WITH STROKE
+test(0xA799, 0xA798); // LATIN SMALL LETTER F WITH STROKE, LATIN CAPITAL LETTER F WITH STROKE
+test(0xA79A, 0xA79B); // LATIN CAPITAL LETTER VOLAPUK AE, LATIN SMALL LETTER VOLAPUK AE
+test(0xA79B, 0xA79A); // LATIN SMALL LETTER VOLAPUK AE, LATIN CAPITAL LETTER VOLAPUK AE
+test(0xA79C, 0xA79D); // LATIN CAPITAL LETTER VOLAPUK OE, LATIN SMALL LETTER VOLAPUK OE
+test(0xA79D, 0xA79C); // LATIN SMALL LETTER VOLAPUK OE, LATIN CAPITAL LETTER VOLAPUK OE
+test(0xA79E, 0xA79F); // LATIN CAPITAL LETTER VOLAPUK UE, LATIN SMALL LETTER VOLAPUK UE
+test(0xA79F, 0xA79E); // LATIN SMALL LETTER VOLAPUK UE, LATIN CAPITAL LETTER VOLAPUK UE
+test(0xA7A0, 0xA7A1); // LATIN CAPITAL LETTER G WITH OBLIQUE STROKE, LATIN SMALL LETTER G WITH OBLIQUE STROKE
+test(0xA7A1, 0xA7A0); // LATIN SMALL LETTER G WITH OBLIQUE STROKE, LATIN CAPITAL LETTER G WITH OBLIQUE STROKE
+test(0xA7A2, 0xA7A3); // LATIN CAPITAL LETTER K WITH OBLIQUE STROKE, LATIN SMALL LETTER K WITH OBLIQUE STROKE
+test(0xA7A3, 0xA7A2); // LATIN SMALL LETTER K WITH OBLIQUE STROKE, LATIN CAPITAL LETTER K WITH OBLIQUE STROKE
+test(0xA7A4, 0xA7A5); // LATIN CAPITAL LETTER N WITH OBLIQUE STROKE, LATIN SMALL LETTER N WITH OBLIQUE STROKE
+test(0xA7A5, 0xA7A4); // LATIN SMALL LETTER N WITH OBLIQUE STROKE, LATIN CAPITAL LETTER N WITH OBLIQUE STROKE
+test(0xA7A6, 0xA7A7); // LATIN CAPITAL LETTER R WITH OBLIQUE STROKE, LATIN SMALL LETTER R WITH OBLIQUE STROKE
+test(0xA7A7, 0xA7A6); // LATIN SMALL LETTER R WITH OBLIQUE STROKE, LATIN CAPITAL LETTER R WITH OBLIQUE STROKE
+test(0xA7A8, 0xA7A9); // LATIN CAPITAL LETTER S WITH OBLIQUE STROKE, LATIN SMALL LETTER S WITH OBLIQUE STROKE
+test(0xA7A9, 0xA7A8); // LATIN SMALL LETTER S WITH OBLIQUE STROKE, LATIN CAPITAL LETTER S WITH OBLIQUE STROKE
+test(0xA7AA, 0x0266); // LATIN CAPITAL LETTER H WITH HOOK, LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK)
+test(0xA7AB, 0x025C); // LATIN CAPITAL LETTER REVERSED OPEN E, LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON)
+test(0xA7AC, 0x0261); // LATIN CAPITAL LETTER SCRIPT G, LATIN SMALL LETTER SCRIPT G
+test(0xA7AD, 0x026C); // LATIN CAPITAL LETTER L WITH BELT, LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT)
+test(0xA7AE, 0x026A); // LATIN CAPITAL LETTER SMALL CAPITAL I, LATIN LETTER SMALL CAPITAL I
+test(0xA7B0, 0x029E); // LATIN CAPITAL LETTER TURNED K, LATIN SMALL LETTER TURNED K
+test(0xA7B1, 0x0287); // LATIN CAPITAL LETTER TURNED T, LATIN SMALL LETTER TURNED T
+test(0xA7B2, 0x029D); // LATIN CAPITAL LETTER J WITH CROSSED-TAIL, LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J)
+test(0xA7B3, 0xAB53); // LATIN CAPITAL LETTER CHI, LATIN SMALL LETTER CHI
+test(0xA7B4, 0xA7B5); // LATIN CAPITAL LETTER BETA, LATIN SMALL LETTER BETA
+test(0xA7B5, 0xA7B4); // LATIN SMALL LETTER BETA, LATIN CAPITAL LETTER BETA
+test(0xA7B6, 0xA7B7); // LATIN CAPITAL LETTER OMEGA, LATIN SMALL LETTER OMEGA
+test(0xA7B7, 0xA7B6); // LATIN SMALL LETTER OMEGA, LATIN CAPITAL LETTER OMEGA
+test(0xA7B8, 0xA7B9); // LATIN CAPITAL LETTER U WITH STROKE, LATIN SMALL LETTER U WITH STROKE
+test(0xA7B9, 0xA7B8); // LATIN SMALL LETTER U WITH STROKE, LATIN CAPITAL LETTER U WITH STROKE
+test(0xAB53, 0xA7B3); // LATIN SMALL LETTER CHI, LATIN CAPITAL LETTER CHI
+test(0xAB70, 0x13A0); // CHEROKEE SMALL LETTER A, CHEROKEE LETTER A
+test(0xAB71, 0x13A1); // CHEROKEE SMALL LETTER E, CHEROKEE LETTER E
+test(0xAB72, 0x13A2); // CHEROKEE SMALL LETTER I, CHEROKEE LETTER I
+test(0xAB73, 0x13A3); // CHEROKEE SMALL LETTER O, CHEROKEE LETTER O
+test(0xAB74, 0x13A4); // CHEROKEE SMALL LETTER U, CHEROKEE LETTER U
+test(0xAB75, 0x13A5); // CHEROKEE SMALL LETTER V, CHEROKEE LETTER V
+test(0xAB76, 0x13A6); // CHEROKEE SMALL LETTER GA, CHEROKEE LETTER GA
+test(0xAB77, 0x13A7); // CHEROKEE SMALL LETTER KA, CHEROKEE LETTER KA
+test(0xAB78, 0x13A8); // CHEROKEE SMALL LETTER GE, CHEROKEE LETTER GE
+test(0xAB79, 0x13A9); // CHEROKEE SMALL LETTER GI, CHEROKEE LETTER GI
+test(0xAB7A, 0x13AA); // CHEROKEE SMALL LETTER GO, CHEROKEE LETTER GO
+test(0xAB7B, 0x13AB); // CHEROKEE SMALL LETTER GU, CHEROKEE LETTER GU
+test(0xAB7C, 0x13AC); // CHEROKEE SMALL LETTER GV, CHEROKEE LETTER GV
+test(0xAB7D, 0x13AD); // CHEROKEE SMALL LETTER HA, CHEROKEE LETTER HA
+test(0xAB7E, 0x13AE); // CHEROKEE SMALL LETTER HE, CHEROKEE LETTER HE
+test(0xAB7F, 0x13AF); // CHEROKEE SMALL LETTER HI, CHEROKEE LETTER HI
+test(0xAB80, 0x13B0); // CHEROKEE SMALL LETTER HO, CHEROKEE LETTER HO
+test(0xAB81, 0x13B1); // CHEROKEE SMALL LETTER HU, CHEROKEE LETTER HU
+test(0xAB82, 0x13B2); // CHEROKEE SMALL LETTER HV, CHEROKEE LETTER HV
+test(0xAB83, 0x13B3); // CHEROKEE SMALL LETTER LA, CHEROKEE LETTER LA
+test(0xAB84, 0x13B4); // CHEROKEE SMALL LETTER LE, CHEROKEE LETTER LE
+test(0xAB85, 0x13B5); // CHEROKEE SMALL LETTER LI, CHEROKEE LETTER LI
+test(0xAB86, 0x13B6); // CHEROKEE SMALL LETTER LO, CHEROKEE LETTER LO
+test(0xAB87, 0x13B7); // CHEROKEE SMALL LETTER LU, CHEROKEE LETTER LU
+test(0xAB88, 0x13B8); // CHEROKEE SMALL LETTER LV, CHEROKEE LETTER LV
+test(0xAB89, 0x13B9); // CHEROKEE SMALL LETTER MA, CHEROKEE LETTER MA
+test(0xAB8A, 0x13BA); // CHEROKEE SMALL LETTER ME, CHEROKEE LETTER ME
+test(0xAB8B, 0x13BB); // CHEROKEE SMALL LETTER MI, CHEROKEE LETTER MI
+test(0xAB8C, 0x13BC); // CHEROKEE SMALL LETTER MO, CHEROKEE LETTER MO
+test(0xAB8D, 0x13BD); // CHEROKEE SMALL LETTER MU, CHEROKEE LETTER MU
+test(0xAB8E, 0x13BE); // CHEROKEE SMALL LETTER NA, CHEROKEE LETTER NA
+test(0xAB8F, 0x13BF); // CHEROKEE SMALL LETTER HNA, CHEROKEE LETTER HNA
+test(0xAB90, 0x13C0); // CHEROKEE SMALL LETTER NAH, CHEROKEE LETTER NAH
+test(0xAB91, 0x13C1); // CHEROKEE SMALL LETTER NE, CHEROKEE LETTER NE
+test(0xAB92, 0x13C2); // CHEROKEE SMALL LETTER NI, CHEROKEE LETTER NI
+test(0xAB93, 0x13C3); // CHEROKEE SMALL LETTER NO, CHEROKEE LETTER NO
+test(0xAB94, 0x13C4); // CHEROKEE SMALL LETTER NU, CHEROKEE LETTER NU
+test(0xAB95, 0x13C5); // CHEROKEE SMALL LETTER NV, CHEROKEE LETTER NV
+test(0xAB96, 0x13C6); // CHEROKEE SMALL LETTER QUA, CHEROKEE LETTER QUA
+test(0xAB97, 0x13C7); // CHEROKEE SMALL LETTER QUE, CHEROKEE LETTER QUE
+test(0xAB98, 0x13C8); // CHEROKEE SMALL LETTER QUI, CHEROKEE LETTER QUI
+test(0xAB99, 0x13C9); // CHEROKEE SMALL LETTER QUO, CHEROKEE LETTER QUO
+test(0xAB9A, 0x13CA); // CHEROKEE SMALL LETTER QUU, CHEROKEE LETTER QUU
+test(0xAB9B, 0x13CB); // CHEROKEE SMALL LETTER QUV, CHEROKEE LETTER QUV
+test(0xAB9C, 0x13CC); // CHEROKEE SMALL LETTER SA, CHEROKEE LETTER SA
+test(0xAB9D, 0x13CD); // CHEROKEE SMALL LETTER S, CHEROKEE LETTER S
+test(0xAB9E, 0x13CE); // CHEROKEE SMALL LETTER SE, CHEROKEE LETTER SE
+test(0xAB9F, 0x13CF); // CHEROKEE SMALL LETTER SI, CHEROKEE LETTER SI
+test(0xABA0, 0x13D0); // CHEROKEE SMALL LETTER SO, CHEROKEE LETTER SO
+test(0xABA1, 0x13D1); // CHEROKEE SMALL LETTER SU, CHEROKEE LETTER SU
+test(0xABA2, 0x13D2); // CHEROKEE SMALL LETTER SV, CHEROKEE LETTER SV
+test(0xABA3, 0x13D3); // CHEROKEE SMALL LETTER DA, CHEROKEE LETTER DA
+test(0xABA4, 0x13D4); // CHEROKEE SMALL LETTER TA, CHEROKEE LETTER TA
+test(0xABA5, 0x13D5); // CHEROKEE SMALL LETTER DE, CHEROKEE LETTER DE
+test(0xABA6, 0x13D6); // CHEROKEE SMALL LETTER TE, CHEROKEE LETTER TE
+test(0xABA7, 0x13D7); // CHEROKEE SMALL LETTER DI, CHEROKEE LETTER DI
+test(0xABA8, 0x13D8); // CHEROKEE SMALL LETTER TI, CHEROKEE LETTER TI
+test(0xABA9, 0x13D9); // CHEROKEE SMALL LETTER DO, CHEROKEE LETTER DO
+test(0xABAA, 0x13DA); // CHEROKEE SMALL LETTER DU, CHEROKEE LETTER DU
+test(0xABAB, 0x13DB); // CHEROKEE SMALL LETTER DV, CHEROKEE LETTER DV
+test(0xABAC, 0x13DC); // CHEROKEE SMALL LETTER DLA, CHEROKEE LETTER DLA
+test(0xABAD, 0x13DD); // CHEROKEE SMALL LETTER TLA, CHEROKEE LETTER TLA
+test(0xABAE, 0x13DE); // CHEROKEE SMALL LETTER TLE, CHEROKEE LETTER TLE
+test(0xABAF, 0x13DF); // CHEROKEE SMALL LETTER TLI, CHEROKEE LETTER TLI
+test(0xABB0, 0x13E0); // CHEROKEE SMALL LETTER TLO, CHEROKEE LETTER TLO
+test(0xABB1, 0x13E1); // CHEROKEE SMALL LETTER TLU, CHEROKEE LETTER TLU
+test(0xABB2, 0x13E2); // CHEROKEE SMALL LETTER TLV, CHEROKEE LETTER TLV
+test(0xABB3, 0x13E3); // CHEROKEE SMALL LETTER TSA, CHEROKEE LETTER TSA
+test(0xABB4, 0x13E4); // CHEROKEE SMALL LETTER TSE, CHEROKEE LETTER TSE
+test(0xABB5, 0x13E5); // CHEROKEE SMALL LETTER TSI, CHEROKEE LETTER TSI
+test(0xABB6, 0x13E6); // CHEROKEE SMALL LETTER TSO, CHEROKEE LETTER TSO
+test(0xABB7, 0x13E7); // CHEROKEE SMALL LETTER TSU, CHEROKEE LETTER TSU
+test(0xABB8, 0x13E8); // CHEROKEE SMALL LETTER TSV, CHEROKEE LETTER TSV
+test(0xABB9, 0x13E9); // CHEROKEE SMALL LETTER WA, CHEROKEE LETTER WA
+test(0xABBA, 0x13EA); // CHEROKEE SMALL LETTER WE, CHEROKEE LETTER WE
+test(0xABBB, 0x13EB); // CHEROKEE SMALL LETTER WI, CHEROKEE LETTER WI
+test(0xABBC, 0x13EC); // CHEROKEE SMALL LETTER WO, CHEROKEE LETTER WO
+test(0xABBD, 0x13ED); // CHEROKEE SMALL LETTER WU, CHEROKEE LETTER WU
+test(0xABBE, 0x13EE); // CHEROKEE SMALL LETTER WV, CHEROKEE LETTER WV
+test(0xABBF, 0x13EF); // CHEROKEE SMALL LETTER YA, CHEROKEE LETTER YA
+test(0xFF21, 0xFF41); // FULLWIDTH LATIN CAPITAL LETTER A, FULLWIDTH LATIN SMALL LETTER A
+test(0xFF22, 0xFF42); // FULLWIDTH LATIN CAPITAL LETTER B, FULLWIDTH LATIN SMALL LETTER B
+test(0xFF23, 0xFF43); // FULLWIDTH LATIN CAPITAL LETTER C, FULLWIDTH LATIN SMALL LETTER C
+test(0xFF24, 0xFF44); // FULLWIDTH LATIN CAPITAL LETTER D, FULLWIDTH LATIN SMALL LETTER D
+test(0xFF25, 0xFF45); // FULLWIDTH LATIN CAPITAL LETTER E, FULLWIDTH LATIN SMALL LETTER E
+test(0xFF26, 0xFF46); // FULLWIDTH LATIN CAPITAL LETTER F, FULLWIDTH LATIN SMALL LETTER F
+test(0xFF27, 0xFF47); // FULLWIDTH LATIN CAPITAL LETTER G, FULLWIDTH LATIN SMALL LETTER G
+test(0xFF28, 0xFF48); // FULLWIDTH LATIN CAPITAL LETTER H, FULLWIDTH LATIN SMALL LETTER H
+test(0xFF29, 0xFF49); // FULLWIDTH LATIN CAPITAL LETTER I, FULLWIDTH LATIN SMALL LETTER I
+test(0xFF2A, 0xFF4A); // FULLWIDTH LATIN CAPITAL LETTER J, FULLWIDTH LATIN SMALL LETTER J
+test(0xFF2B, 0xFF4B); // FULLWIDTH LATIN CAPITAL LETTER K, FULLWIDTH LATIN SMALL LETTER K
+test(0xFF2C, 0xFF4C); // FULLWIDTH LATIN CAPITAL LETTER L, FULLWIDTH LATIN SMALL LETTER L
+test(0xFF2D, 0xFF4D); // FULLWIDTH LATIN CAPITAL LETTER M, FULLWIDTH LATIN SMALL LETTER M
+test(0xFF2E, 0xFF4E); // FULLWIDTH LATIN CAPITAL LETTER N, FULLWIDTH LATIN SMALL LETTER N
+test(0xFF2F, 0xFF4F); // FULLWIDTH LATIN CAPITAL LETTER O, FULLWIDTH LATIN SMALL LETTER O
+test(0xFF30, 0xFF50); // FULLWIDTH LATIN CAPITAL LETTER P, FULLWIDTH LATIN SMALL LETTER P
+test(0xFF31, 0xFF51); // FULLWIDTH LATIN CAPITAL LETTER Q, FULLWIDTH LATIN SMALL LETTER Q
+test(0xFF32, 0xFF52); // FULLWIDTH LATIN CAPITAL LETTER R, FULLWIDTH LATIN SMALL LETTER R
+test(0xFF33, 0xFF53); // FULLWIDTH LATIN CAPITAL LETTER S, FULLWIDTH LATIN SMALL LETTER S
+test(0xFF34, 0xFF54); // FULLWIDTH LATIN CAPITAL LETTER T, FULLWIDTH LATIN SMALL LETTER T
+test(0xFF35, 0xFF55); // FULLWIDTH LATIN CAPITAL LETTER U, FULLWIDTH LATIN SMALL LETTER U
+test(0xFF36, 0xFF56); // FULLWIDTH LATIN CAPITAL LETTER V, FULLWIDTH LATIN SMALL LETTER V
+test(0xFF37, 0xFF57); // FULLWIDTH LATIN CAPITAL LETTER W, FULLWIDTH LATIN SMALL LETTER W
+test(0xFF38, 0xFF58); // FULLWIDTH LATIN CAPITAL LETTER X, FULLWIDTH LATIN SMALL LETTER X
+test(0xFF39, 0xFF59); // FULLWIDTH LATIN CAPITAL LETTER Y, FULLWIDTH LATIN SMALL LETTER Y
+test(0xFF3A, 0xFF5A); // FULLWIDTH LATIN CAPITAL LETTER Z, FULLWIDTH LATIN SMALL LETTER Z
+test(0xFF41, 0xFF21); // FULLWIDTH LATIN SMALL LETTER A, FULLWIDTH LATIN CAPITAL LETTER A
+test(0xFF42, 0xFF22); // FULLWIDTH LATIN SMALL LETTER B, FULLWIDTH LATIN CAPITAL LETTER B
+test(0xFF43, 0xFF23); // FULLWIDTH LATIN SMALL LETTER C, FULLWIDTH LATIN CAPITAL LETTER C
+test(0xFF44, 0xFF24); // FULLWIDTH LATIN SMALL LETTER D, FULLWIDTH LATIN CAPITAL LETTER D
+test(0xFF45, 0xFF25); // FULLWIDTH LATIN SMALL LETTER E, FULLWIDTH LATIN CAPITAL LETTER E
+test(0xFF46, 0xFF26); // FULLWIDTH LATIN SMALL LETTER F, FULLWIDTH LATIN CAPITAL LETTER F
+test(0xFF47, 0xFF27); // FULLWIDTH LATIN SMALL LETTER G, FULLWIDTH LATIN CAPITAL LETTER G
+test(0xFF48, 0xFF28); // FULLWIDTH LATIN SMALL LETTER H, FULLWIDTH LATIN CAPITAL LETTER H
+test(0xFF49, 0xFF29); // FULLWIDTH LATIN SMALL LETTER I, FULLWIDTH LATIN CAPITAL LETTER I
+test(0xFF4A, 0xFF2A); // FULLWIDTH LATIN SMALL LETTER J, FULLWIDTH LATIN CAPITAL LETTER J
+test(0xFF4B, 0xFF2B); // FULLWIDTH LATIN SMALL LETTER K, FULLWIDTH LATIN CAPITAL LETTER K
+test(0xFF4C, 0xFF2C); // FULLWIDTH LATIN SMALL LETTER L, FULLWIDTH LATIN CAPITAL LETTER L
+test(0xFF4D, 0xFF2D); // FULLWIDTH LATIN SMALL LETTER M, FULLWIDTH LATIN CAPITAL LETTER M
+test(0xFF4E, 0xFF2E); // FULLWIDTH LATIN SMALL LETTER N, FULLWIDTH LATIN CAPITAL LETTER N
+test(0xFF4F, 0xFF2F); // FULLWIDTH LATIN SMALL LETTER O, FULLWIDTH LATIN CAPITAL LETTER O
+test(0xFF50, 0xFF30); // FULLWIDTH LATIN SMALL LETTER P, FULLWIDTH LATIN CAPITAL LETTER P
+test(0xFF51, 0xFF31); // FULLWIDTH LATIN SMALL LETTER Q, FULLWIDTH LATIN CAPITAL LETTER Q
+test(0xFF52, 0xFF32); // FULLWIDTH LATIN SMALL LETTER R, FULLWIDTH LATIN CAPITAL LETTER R
+test(0xFF53, 0xFF33); // FULLWIDTH LATIN SMALL LETTER S, FULLWIDTH LATIN CAPITAL LETTER S
+test(0xFF54, 0xFF34); // FULLWIDTH LATIN SMALL LETTER T, FULLWIDTH LATIN CAPITAL LETTER T
+test(0xFF55, 0xFF35); // FULLWIDTH LATIN SMALL LETTER U, FULLWIDTH LATIN CAPITAL LETTER U
+test(0xFF56, 0xFF36); // FULLWIDTH LATIN SMALL LETTER V, FULLWIDTH LATIN CAPITAL LETTER V
+test(0xFF57, 0xFF37); // FULLWIDTH LATIN SMALL LETTER W, FULLWIDTH LATIN CAPITAL LETTER W
+test(0xFF58, 0xFF38); // FULLWIDTH LATIN SMALL LETTER X, FULLWIDTH LATIN CAPITAL LETTER X
+test(0xFF59, 0xFF39); // FULLWIDTH LATIN SMALL LETTER Y, FULLWIDTH LATIN CAPITAL LETTER Y
+test(0xFF5A, 0xFF3A); // FULLWIDTH LATIN SMALL LETTER Z, FULLWIDTH LATIN CAPITAL LETTER Z
+test(0x10400, 0x10428); // DESERET CAPITAL LETTER LONG I, DESERET SMALL LETTER LONG I
+test(0x10401, 0x10429); // DESERET CAPITAL LETTER LONG E, DESERET SMALL LETTER LONG E
+test(0x10402, 0x1042A); // DESERET CAPITAL LETTER LONG A, DESERET SMALL LETTER LONG A
+test(0x10403, 0x1042B); // DESERET CAPITAL LETTER LONG AH, DESERET SMALL LETTER LONG AH
+test(0x10404, 0x1042C); // DESERET CAPITAL LETTER LONG O, DESERET SMALL LETTER LONG O
+test(0x10405, 0x1042D); // DESERET CAPITAL LETTER LONG OO, DESERET SMALL LETTER LONG OO
+test(0x10406, 0x1042E); // DESERET CAPITAL LETTER SHORT I, DESERET SMALL LETTER SHORT I
+test(0x10407, 0x1042F); // DESERET CAPITAL LETTER SHORT E, DESERET SMALL LETTER SHORT E
+test(0x10408, 0x10430); // DESERET CAPITAL LETTER SHORT A, DESERET SMALL LETTER SHORT A
+test(0x10409, 0x10431); // DESERET CAPITAL LETTER SHORT AH, DESERET SMALL LETTER SHORT AH
+test(0x1040A, 0x10432); // DESERET CAPITAL LETTER SHORT O, DESERET SMALL LETTER SHORT O
+test(0x1040B, 0x10433); // DESERET CAPITAL LETTER SHORT OO, DESERET SMALL LETTER SHORT OO
+test(0x1040C, 0x10434); // DESERET CAPITAL LETTER AY, DESERET SMALL LETTER AY
+test(0x1040D, 0x10435); // DESERET CAPITAL LETTER OW, DESERET SMALL LETTER OW
+test(0x1040E, 0x10436); // DESERET CAPITAL LETTER WU, DESERET SMALL LETTER WU
+test(0x1040F, 0x10437); // DESERET CAPITAL LETTER YEE, DESERET SMALL LETTER YEE
+test(0x10410, 0x10438); // DESERET CAPITAL LETTER H, DESERET SMALL LETTER H
+test(0x10411, 0x10439); // DESERET CAPITAL LETTER PEE, DESERET SMALL LETTER PEE
+test(0x10412, 0x1043A); // DESERET CAPITAL LETTER BEE, DESERET SMALL LETTER BEE
+test(0x10413, 0x1043B); // DESERET CAPITAL LETTER TEE, DESERET SMALL LETTER TEE
+test(0x10414, 0x1043C); // DESERET CAPITAL LETTER DEE, DESERET SMALL LETTER DEE
+test(0x10415, 0x1043D); // DESERET CAPITAL LETTER CHEE, DESERET SMALL LETTER CHEE
+test(0x10416, 0x1043E); // DESERET CAPITAL LETTER JEE, DESERET SMALL LETTER JEE
+test(0x10417, 0x1043F); // DESERET CAPITAL LETTER KAY, DESERET SMALL LETTER KAY
+test(0x10418, 0x10440); // DESERET CAPITAL LETTER GAY, DESERET SMALL LETTER GAY
+test(0x10419, 0x10441); // DESERET CAPITAL LETTER EF, DESERET SMALL LETTER EF
+test(0x1041A, 0x10442); // DESERET CAPITAL LETTER VEE, DESERET SMALL LETTER VEE
+test(0x1041B, 0x10443); // DESERET CAPITAL LETTER ETH, DESERET SMALL LETTER ETH
+test(0x1041C, 0x10444); // DESERET CAPITAL LETTER THEE, DESERET SMALL LETTER THEE
+test(0x1041D, 0x10445); // DESERET CAPITAL LETTER ES, DESERET SMALL LETTER ES
+test(0x1041E, 0x10446); // DESERET CAPITAL LETTER ZEE, DESERET SMALL LETTER ZEE
+test(0x1041F, 0x10447); // DESERET CAPITAL LETTER ESH, DESERET SMALL LETTER ESH
+test(0x10420, 0x10448); // DESERET CAPITAL LETTER ZHEE, DESERET SMALL LETTER ZHEE
+test(0x10421, 0x10449); // DESERET CAPITAL LETTER ER, DESERET SMALL LETTER ER
+test(0x10422, 0x1044A); // DESERET CAPITAL LETTER EL, DESERET SMALL LETTER EL
+test(0x10423, 0x1044B); // DESERET CAPITAL LETTER EM, DESERET SMALL LETTER EM
+test(0x10424, 0x1044C); // DESERET CAPITAL LETTER EN, DESERET SMALL LETTER EN
+test(0x10425, 0x1044D); // DESERET CAPITAL LETTER ENG, DESERET SMALL LETTER ENG
+test(0x10426, 0x1044E); // DESERET CAPITAL LETTER OI, DESERET SMALL LETTER OI
+test(0x10427, 0x1044F); // DESERET CAPITAL LETTER EW, DESERET SMALL LETTER EW
+test(0x10428, 0x10400); // DESERET SMALL LETTER LONG I, DESERET CAPITAL LETTER LONG I
+test(0x10429, 0x10401); // DESERET SMALL LETTER LONG E, DESERET CAPITAL LETTER LONG E
+test(0x1042A, 0x10402); // DESERET SMALL LETTER LONG A, DESERET CAPITAL LETTER LONG A
+test(0x1042B, 0x10403); // DESERET SMALL LETTER LONG AH, DESERET CAPITAL LETTER LONG AH
+test(0x1042C, 0x10404); // DESERET SMALL LETTER LONG O, DESERET CAPITAL LETTER LONG O
+test(0x1042D, 0x10405); // DESERET SMALL LETTER LONG OO, DESERET CAPITAL LETTER LONG OO
+test(0x1042E, 0x10406); // DESERET SMALL LETTER SHORT I, DESERET CAPITAL LETTER SHORT I
+test(0x1042F, 0x10407); // DESERET SMALL LETTER SHORT E, DESERET CAPITAL LETTER SHORT E
+test(0x10430, 0x10408); // DESERET SMALL LETTER SHORT A, DESERET CAPITAL LETTER SHORT A
+test(0x10431, 0x10409); // DESERET SMALL LETTER SHORT AH, DESERET CAPITAL LETTER SHORT AH
+test(0x10432, 0x1040A); // DESERET SMALL LETTER SHORT O, DESERET CAPITAL LETTER SHORT O
+test(0x10433, 0x1040B); // DESERET SMALL LETTER SHORT OO, DESERET CAPITAL LETTER SHORT OO
+test(0x10434, 0x1040C); // DESERET SMALL LETTER AY, DESERET CAPITAL LETTER AY
+test(0x10435, 0x1040D); // DESERET SMALL LETTER OW, DESERET CAPITAL LETTER OW
+test(0x10436, 0x1040E); // DESERET SMALL LETTER WU, DESERET CAPITAL LETTER WU
+test(0x10437, 0x1040F); // DESERET SMALL LETTER YEE, DESERET CAPITAL LETTER YEE
+test(0x10438, 0x10410); // DESERET SMALL LETTER H, DESERET CAPITAL LETTER H
+test(0x10439, 0x10411); // DESERET SMALL LETTER PEE, DESERET CAPITAL LETTER PEE
+test(0x1043A, 0x10412); // DESERET SMALL LETTER BEE, DESERET CAPITAL LETTER BEE
+test(0x1043B, 0x10413); // DESERET SMALL LETTER TEE, DESERET CAPITAL LETTER TEE
+test(0x1043C, 0x10414); // DESERET SMALL LETTER DEE, DESERET CAPITAL LETTER DEE
+test(0x1043D, 0x10415); // DESERET SMALL LETTER CHEE, DESERET CAPITAL LETTER CHEE
+test(0x1043E, 0x10416); // DESERET SMALL LETTER JEE, DESERET CAPITAL LETTER JEE
+test(0x1043F, 0x10417); // DESERET SMALL LETTER KAY, DESERET CAPITAL LETTER KAY
+test(0x10440, 0x10418); // DESERET SMALL LETTER GAY, DESERET CAPITAL LETTER GAY
+test(0x10441, 0x10419); // DESERET SMALL LETTER EF, DESERET CAPITAL LETTER EF
+test(0x10442, 0x1041A); // DESERET SMALL LETTER VEE, DESERET CAPITAL LETTER VEE
+test(0x10443, 0x1041B); // DESERET SMALL LETTER ETH, DESERET CAPITAL LETTER ETH
+test(0x10444, 0x1041C); // DESERET SMALL LETTER THEE, DESERET CAPITAL LETTER THEE
+test(0x10445, 0x1041D); // DESERET SMALL LETTER ES, DESERET CAPITAL LETTER ES
+test(0x10446, 0x1041E); // DESERET SMALL LETTER ZEE, DESERET CAPITAL LETTER ZEE
+test(0x10447, 0x1041F); // DESERET SMALL LETTER ESH, DESERET CAPITAL LETTER ESH
+test(0x10448, 0x10420); // DESERET SMALL LETTER ZHEE, DESERET CAPITAL LETTER ZHEE
+test(0x10449, 0x10421); // DESERET SMALL LETTER ER, DESERET CAPITAL LETTER ER
+test(0x1044A, 0x10422); // DESERET SMALL LETTER EL, DESERET CAPITAL LETTER EL
+test(0x1044B, 0x10423); // DESERET SMALL LETTER EM, DESERET CAPITAL LETTER EM
+test(0x1044C, 0x10424); // DESERET SMALL LETTER EN, DESERET CAPITAL LETTER EN
+test(0x1044D, 0x10425); // DESERET SMALL LETTER ENG, DESERET CAPITAL LETTER ENG
+test(0x1044E, 0x10426); // DESERET SMALL LETTER OI, DESERET CAPITAL LETTER OI
+test(0x1044F, 0x10427); // DESERET SMALL LETTER EW, DESERET CAPITAL LETTER EW
+test(0x104B0, 0x104D8); // OSAGE CAPITAL LETTER A, OSAGE SMALL LETTER A
+test(0x104B1, 0x104D9); // OSAGE CAPITAL LETTER AI, OSAGE SMALL LETTER AI
+test(0x104B2, 0x104DA); // OSAGE CAPITAL LETTER AIN, OSAGE SMALL LETTER AIN
+test(0x104B3, 0x104DB); // OSAGE CAPITAL LETTER AH, OSAGE SMALL LETTER AH
+test(0x104B4, 0x104DC); // OSAGE CAPITAL LETTER BRA, OSAGE SMALL LETTER BRA
+test(0x104B5, 0x104DD); // OSAGE CAPITAL LETTER CHA, OSAGE SMALL LETTER CHA
+test(0x104B6, 0x104DE); // OSAGE CAPITAL LETTER EHCHA, OSAGE SMALL LETTER EHCHA
+test(0x104B7, 0x104DF); // OSAGE CAPITAL LETTER E, OSAGE SMALL LETTER E
+test(0x104B8, 0x104E0); // OSAGE CAPITAL LETTER EIN, OSAGE SMALL LETTER EIN
+test(0x104B9, 0x104E1); // OSAGE CAPITAL LETTER HA, OSAGE SMALL LETTER HA
+test(0x104BA, 0x104E2); // OSAGE CAPITAL LETTER HYA, OSAGE SMALL LETTER HYA
+test(0x104BB, 0x104E3); // OSAGE CAPITAL LETTER I, OSAGE SMALL LETTER I
+test(0x104BC, 0x104E4); // OSAGE CAPITAL LETTER KA, OSAGE SMALL LETTER KA
+test(0x104BD, 0x104E5); // OSAGE CAPITAL LETTER EHKA, OSAGE SMALL LETTER EHKA
+test(0x104BE, 0x104E6); // OSAGE CAPITAL LETTER KYA, OSAGE SMALL LETTER KYA
+test(0x104BF, 0x104E7); // OSAGE CAPITAL LETTER LA, OSAGE SMALL LETTER LA
+test(0x104C0, 0x104E8); // OSAGE CAPITAL LETTER MA, OSAGE SMALL LETTER MA
+test(0x104C1, 0x104E9); // OSAGE CAPITAL LETTER NA, OSAGE SMALL LETTER NA
+test(0x104C2, 0x104EA); // OSAGE CAPITAL LETTER O, OSAGE SMALL LETTER O
+test(0x104C3, 0x104EB); // OSAGE CAPITAL LETTER OIN, OSAGE SMALL LETTER OIN
+test(0x104C4, 0x104EC); // OSAGE CAPITAL LETTER PA, OSAGE SMALL LETTER PA
+test(0x104C5, 0x104ED); // OSAGE CAPITAL LETTER EHPA, OSAGE SMALL LETTER EHPA
+test(0x104C6, 0x104EE); // OSAGE CAPITAL LETTER SA, OSAGE SMALL LETTER SA
+test(0x104C7, 0x104EF); // OSAGE CAPITAL LETTER SHA, OSAGE SMALL LETTER SHA
+test(0x104C8, 0x104F0); // OSAGE CAPITAL LETTER TA, OSAGE SMALL LETTER TA
+test(0x104C9, 0x104F1); // OSAGE CAPITAL LETTER EHTA, OSAGE SMALL LETTER EHTA
+test(0x104CA, 0x104F2); // OSAGE CAPITAL LETTER TSA, OSAGE SMALL LETTER TSA
+test(0x104CB, 0x104F3); // OSAGE CAPITAL LETTER EHTSA, OSAGE SMALL LETTER EHTSA
+test(0x104CC, 0x104F4); // OSAGE CAPITAL LETTER TSHA, OSAGE SMALL LETTER TSHA
+test(0x104CD, 0x104F5); // OSAGE CAPITAL LETTER DHA, OSAGE SMALL LETTER DHA
+test(0x104CE, 0x104F6); // OSAGE CAPITAL LETTER U, OSAGE SMALL LETTER U
+test(0x104CF, 0x104F7); // OSAGE CAPITAL LETTER WA, OSAGE SMALL LETTER WA
+test(0x104D0, 0x104F8); // OSAGE CAPITAL LETTER KHA, OSAGE SMALL LETTER KHA
+test(0x104D1, 0x104F9); // OSAGE CAPITAL LETTER GHA, OSAGE SMALL LETTER GHA
+test(0x104D2, 0x104FA); // OSAGE CAPITAL LETTER ZA, OSAGE SMALL LETTER ZA
+test(0x104D3, 0x104FB); // OSAGE CAPITAL LETTER ZHA, OSAGE SMALL LETTER ZHA
+test(0x104D8, 0x104B0); // OSAGE SMALL LETTER A, OSAGE CAPITAL LETTER A
+test(0x104D9, 0x104B1); // OSAGE SMALL LETTER AI, OSAGE CAPITAL LETTER AI
+test(0x104DA, 0x104B2); // OSAGE SMALL LETTER AIN, OSAGE CAPITAL LETTER AIN
+test(0x104DB, 0x104B3); // OSAGE SMALL LETTER AH, OSAGE CAPITAL LETTER AH
+test(0x104DC, 0x104B4); // OSAGE SMALL LETTER BRA, OSAGE CAPITAL LETTER BRA
+test(0x104DD, 0x104B5); // OSAGE SMALL LETTER CHA, OSAGE CAPITAL LETTER CHA
+test(0x104DE, 0x104B6); // OSAGE SMALL LETTER EHCHA, OSAGE CAPITAL LETTER EHCHA
+test(0x104DF, 0x104B7); // OSAGE SMALL LETTER E, OSAGE CAPITAL LETTER E
+test(0x104E0, 0x104B8); // OSAGE SMALL LETTER EIN, OSAGE CAPITAL LETTER EIN
+test(0x104E1, 0x104B9); // OSAGE SMALL LETTER HA, OSAGE CAPITAL LETTER HA
+test(0x104E2, 0x104BA); // OSAGE SMALL LETTER HYA, OSAGE CAPITAL LETTER HYA
+test(0x104E3, 0x104BB); // OSAGE SMALL LETTER I, OSAGE CAPITAL LETTER I
+test(0x104E4, 0x104BC); // OSAGE SMALL LETTER KA, OSAGE CAPITAL LETTER KA
+test(0x104E5, 0x104BD); // OSAGE SMALL LETTER EHKA, OSAGE CAPITAL LETTER EHKA
+test(0x104E6, 0x104BE); // OSAGE SMALL LETTER KYA, OSAGE CAPITAL LETTER KYA
+test(0x104E7, 0x104BF); // OSAGE SMALL LETTER LA, OSAGE CAPITAL LETTER LA
+test(0x104E8, 0x104C0); // OSAGE SMALL LETTER MA, OSAGE CAPITAL LETTER MA
+test(0x104E9, 0x104C1); // OSAGE SMALL LETTER NA, OSAGE CAPITAL LETTER NA
+test(0x104EA, 0x104C2); // OSAGE SMALL LETTER O, OSAGE CAPITAL LETTER O
+test(0x104EB, 0x104C3); // OSAGE SMALL LETTER OIN, OSAGE CAPITAL LETTER OIN
+test(0x104EC, 0x104C4); // OSAGE SMALL LETTER PA, OSAGE CAPITAL LETTER PA
+test(0x104ED, 0x104C5); // OSAGE SMALL LETTER EHPA, OSAGE CAPITAL LETTER EHPA
+test(0x104EE, 0x104C6); // OSAGE SMALL LETTER SA, OSAGE CAPITAL LETTER SA
+test(0x104EF, 0x104C7); // OSAGE SMALL LETTER SHA, OSAGE CAPITAL LETTER SHA
+test(0x104F0, 0x104C8); // OSAGE SMALL LETTER TA, OSAGE CAPITAL LETTER TA
+test(0x104F1, 0x104C9); // OSAGE SMALL LETTER EHTA, OSAGE CAPITAL LETTER EHTA
+test(0x104F2, 0x104CA); // OSAGE SMALL LETTER TSA, OSAGE CAPITAL LETTER TSA
+test(0x104F3, 0x104CB); // OSAGE SMALL LETTER EHTSA, OSAGE CAPITAL LETTER EHTSA
+test(0x104F4, 0x104CC); // OSAGE SMALL LETTER TSHA, OSAGE CAPITAL LETTER TSHA
+test(0x104F5, 0x104CD); // OSAGE SMALL LETTER DHA, OSAGE CAPITAL LETTER DHA
+test(0x104F6, 0x104CE); // OSAGE SMALL LETTER U, OSAGE CAPITAL LETTER U
+test(0x104F7, 0x104CF); // OSAGE SMALL LETTER WA, OSAGE CAPITAL LETTER WA
+test(0x104F8, 0x104D0); // OSAGE SMALL LETTER KHA, OSAGE CAPITAL LETTER KHA
+test(0x104F9, 0x104D1); // OSAGE SMALL LETTER GHA, OSAGE CAPITAL LETTER GHA
+test(0x104FA, 0x104D2); // OSAGE SMALL LETTER ZA, OSAGE CAPITAL LETTER ZA
+test(0x104FB, 0x104D3); // OSAGE SMALL LETTER ZHA, OSAGE CAPITAL LETTER ZHA
+test(0x10C80, 0x10CC0); // OLD HUNGARIAN CAPITAL LETTER A, OLD HUNGARIAN SMALL LETTER A
+test(0x10C81, 0x10CC1); // OLD HUNGARIAN CAPITAL LETTER AA, OLD HUNGARIAN SMALL LETTER AA
+test(0x10C82, 0x10CC2); // OLD HUNGARIAN CAPITAL LETTER EB, OLD HUNGARIAN SMALL LETTER EB
+test(0x10C83, 0x10CC3); // OLD HUNGARIAN CAPITAL LETTER AMB, OLD HUNGARIAN SMALL LETTER AMB
+test(0x10C84, 0x10CC4); // OLD HUNGARIAN CAPITAL LETTER EC, OLD HUNGARIAN SMALL LETTER EC
+test(0x10C85, 0x10CC5); // OLD HUNGARIAN CAPITAL LETTER ENC, OLD HUNGARIAN SMALL LETTER ENC
+test(0x10C86, 0x10CC6); // OLD HUNGARIAN CAPITAL LETTER ECS, OLD HUNGARIAN SMALL LETTER ECS
+test(0x10C87, 0x10CC7); // OLD HUNGARIAN CAPITAL LETTER ED, OLD HUNGARIAN SMALL LETTER ED
+test(0x10C88, 0x10CC8); // OLD HUNGARIAN CAPITAL LETTER AND, OLD HUNGARIAN SMALL LETTER AND
+test(0x10C89, 0x10CC9); // OLD HUNGARIAN CAPITAL LETTER E, OLD HUNGARIAN SMALL LETTER E
+test(0x10C8A, 0x10CCA); // OLD HUNGARIAN CAPITAL LETTER CLOSE E, OLD HUNGARIAN SMALL LETTER CLOSE E
+test(0x10C8B, 0x10CCB); // OLD HUNGARIAN CAPITAL LETTER EE, OLD HUNGARIAN SMALL LETTER EE
+test(0x10C8C, 0x10CCC); // OLD HUNGARIAN CAPITAL LETTER EF, OLD HUNGARIAN SMALL LETTER EF
+test(0x10C8D, 0x10CCD); // OLD HUNGARIAN CAPITAL LETTER EG, OLD HUNGARIAN SMALL LETTER EG
+test(0x10C8E, 0x10CCE); // OLD HUNGARIAN CAPITAL LETTER EGY, OLD HUNGARIAN SMALL LETTER EGY
+test(0x10C8F, 0x10CCF); // OLD HUNGARIAN CAPITAL LETTER EH, OLD HUNGARIAN SMALL LETTER EH
+test(0x10C90, 0x10CD0); // OLD HUNGARIAN CAPITAL LETTER I, OLD HUNGARIAN SMALL LETTER I
+test(0x10C91, 0x10CD1); // OLD HUNGARIAN CAPITAL LETTER II, OLD HUNGARIAN SMALL LETTER II
+test(0x10C92, 0x10CD2); // OLD HUNGARIAN CAPITAL LETTER EJ, OLD HUNGARIAN SMALL LETTER EJ
+test(0x10C93, 0x10CD3); // OLD HUNGARIAN CAPITAL LETTER EK, OLD HUNGARIAN SMALL LETTER EK
+test(0x10C94, 0x10CD4); // OLD HUNGARIAN CAPITAL LETTER AK, OLD HUNGARIAN SMALL LETTER AK
+test(0x10C95, 0x10CD5); // OLD HUNGARIAN CAPITAL LETTER UNK, OLD HUNGARIAN SMALL LETTER UNK
+test(0x10C96, 0x10CD6); // OLD HUNGARIAN CAPITAL LETTER EL, OLD HUNGARIAN SMALL LETTER EL
+test(0x10C97, 0x10CD7); // OLD HUNGARIAN CAPITAL LETTER ELY, OLD HUNGARIAN SMALL LETTER ELY
+test(0x10C98, 0x10CD8); // OLD HUNGARIAN CAPITAL LETTER EM, OLD HUNGARIAN SMALL LETTER EM
+test(0x10C99, 0x10CD9); // OLD HUNGARIAN CAPITAL LETTER EN, OLD HUNGARIAN SMALL LETTER EN
+test(0x10C9A, 0x10CDA); // OLD HUNGARIAN CAPITAL LETTER ENY, OLD HUNGARIAN SMALL LETTER ENY
+test(0x10C9B, 0x10CDB); // OLD HUNGARIAN CAPITAL LETTER O, OLD HUNGARIAN SMALL LETTER O
+test(0x10C9C, 0x10CDC); // OLD HUNGARIAN CAPITAL LETTER OO, OLD HUNGARIAN SMALL LETTER OO
+test(0x10C9D, 0x10CDD); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE
+test(0x10C9E, 0x10CDE); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE, OLD HUNGARIAN SMALL LETTER RUDIMENTA OE
+test(0x10C9F, 0x10CDF); // OLD HUNGARIAN CAPITAL LETTER OEE, OLD HUNGARIAN SMALL LETTER OEE
+test(0x10CA0, 0x10CE0); // OLD HUNGARIAN CAPITAL LETTER EP, OLD HUNGARIAN SMALL LETTER EP
+test(0x10CA1, 0x10CE1); // OLD HUNGARIAN CAPITAL LETTER EMP, OLD HUNGARIAN SMALL LETTER EMP
+test(0x10CA2, 0x10CE2); // OLD HUNGARIAN CAPITAL LETTER ER, OLD HUNGARIAN SMALL LETTER ER
+test(0x10CA3, 0x10CE3); // OLD HUNGARIAN CAPITAL LETTER SHORT ER, OLD HUNGARIAN SMALL LETTER SHORT ER
+test(0x10CA4, 0x10CE4); // OLD HUNGARIAN CAPITAL LETTER ES, OLD HUNGARIAN SMALL LETTER ES
+test(0x10CA5, 0x10CE5); // OLD HUNGARIAN CAPITAL LETTER ESZ, OLD HUNGARIAN SMALL LETTER ESZ
+test(0x10CA6, 0x10CE6); // OLD HUNGARIAN CAPITAL LETTER ET, OLD HUNGARIAN SMALL LETTER ET
+test(0x10CA7, 0x10CE7); // OLD HUNGARIAN CAPITAL LETTER ENT, OLD HUNGARIAN SMALL LETTER ENT
+test(0x10CA8, 0x10CE8); // OLD HUNGARIAN CAPITAL LETTER ETY, OLD HUNGARIAN SMALL LETTER ETY
+test(0x10CA9, 0x10CE9); // OLD HUNGARIAN CAPITAL LETTER ECH, OLD HUNGARIAN SMALL LETTER ECH
+test(0x10CAA, 0x10CEA); // OLD HUNGARIAN CAPITAL LETTER U, OLD HUNGARIAN SMALL LETTER U
+test(0x10CAB, 0x10CEB); // OLD HUNGARIAN CAPITAL LETTER UU, OLD HUNGARIAN SMALL LETTER UU
+test(0x10CAC, 0x10CEC); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE
+test(0x10CAD, 0x10CED); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE, OLD HUNGARIAN SMALL LETTER RUDIMENTA UE
+test(0x10CAE, 0x10CEE); // OLD HUNGARIAN CAPITAL LETTER EV, OLD HUNGARIAN SMALL LETTER EV
+test(0x10CAF, 0x10CEF); // OLD HUNGARIAN CAPITAL LETTER EZ, OLD HUNGARIAN SMALL LETTER EZ
+test(0x10CB0, 0x10CF0); // OLD HUNGARIAN CAPITAL LETTER EZS, OLD HUNGARIAN SMALL LETTER EZS
+test(0x10CB1, 0x10CF1); // OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN
+test(0x10CB2, 0x10CF2); // OLD HUNGARIAN CAPITAL LETTER US, OLD HUNGARIAN SMALL LETTER US
+test(0x10CC0, 0x10C80); // OLD HUNGARIAN SMALL LETTER A, OLD HUNGARIAN CAPITAL LETTER A
+test(0x10CC1, 0x10C81); // OLD HUNGARIAN SMALL LETTER AA, OLD HUNGARIAN CAPITAL LETTER AA
+test(0x10CC2, 0x10C82); // OLD HUNGARIAN SMALL LETTER EB, OLD HUNGARIAN CAPITAL LETTER EB
+test(0x10CC3, 0x10C83); // OLD HUNGARIAN SMALL LETTER AMB, OLD HUNGARIAN CAPITAL LETTER AMB
+test(0x10CC4, 0x10C84); // OLD HUNGARIAN SMALL LETTER EC, OLD HUNGARIAN CAPITAL LETTER EC
+test(0x10CC5, 0x10C85); // OLD HUNGARIAN SMALL LETTER ENC, OLD HUNGARIAN CAPITAL LETTER ENC
+test(0x10CC6, 0x10C86); // OLD HUNGARIAN SMALL LETTER ECS, OLD HUNGARIAN CAPITAL LETTER ECS
+test(0x10CC7, 0x10C87); // OLD HUNGARIAN SMALL LETTER ED, OLD HUNGARIAN CAPITAL LETTER ED
+test(0x10CC8, 0x10C88); // OLD HUNGARIAN SMALL LETTER AND, OLD HUNGARIAN CAPITAL LETTER AND
+test(0x10CC9, 0x10C89); // OLD HUNGARIAN SMALL LETTER E, OLD HUNGARIAN CAPITAL LETTER E
+test(0x10CCA, 0x10C8A); // OLD HUNGARIAN SMALL LETTER CLOSE E, OLD HUNGARIAN CAPITAL LETTER CLOSE E
+test(0x10CCB, 0x10C8B); // OLD HUNGARIAN SMALL LETTER EE, OLD HUNGARIAN CAPITAL LETTER EE
+test(0x10CCC, 0x10C8C); // OLD HUNGARIAN SMALL LETTER EF, OLD HUNGARIAN CAPITAL LETTER EF
+test(0x10CCD, 0x10C8D); // OLD HUNGARIAN SMALL LETTER EG, OLD HUNGARIAN CAPITAL LETTER EG
+test(0x10CCE, 0x10C8E); // OLD HUNGARIAN SMALL LETTER EGY, OLD HUNGARIAN CAPITAL LETTER EGY
+test(0x10CCF, 0x10C8F); // OLD HUNGARIAN SMALL LETTER EH, OLD HUNGARIAN CAPITAL LETTER EH
+test(0x10CD0, 0x10C90); // OLD HUNGARIAN SMALL LETTER I, OLD HUNGARIAN CAPITAL LETTER I
+test(0x10CD1, 0x10C91); // OLD HUNGARIAN SMALL LETTER II, OLD HUNGARIAN CAPITAL LETTER II
+test(0x10CD2, 0x10C92); // OLD HUNGARIAN SMALL LETTER EJ, OLD HUNGARIAN CAPITAL LETTER EJ
+test(0x10CD3, 0x10C93); // OLD HUNGARIAN SMALL LETTER EK, OLD HUNGARIAN CAPITAL LETTER EK
+test(0x10CD4, 0x10C94); // OLD HUNGARIAN SMALL LETTER AK, OLD HUNGARIAN CAPITAL LETTER AK
+test(0x10CD5, 0x10C95); // OLD HUNGARIAN SMALL LETTER UNK, OLD HUNGARIAN CAPITAL LETTER UNK
+test(0x10CD6, 0x10C96); // OLD HUNGARIAN SMALL LETTER EL, OLD HUNGARIAN CAPITAL LETTER EL
+test(0x10CD7, 0x10C97); // OLD HUNGARIAN SMALL LETTER ELY, OLD HUNGARIAN CAPITAL LETTER ELY
+test(0x10CD8, 0x10C98); // OLD HUNGARIAN SMALL LETTER EM, OLD HUNGARIAN CAPITAL LETTER EM
+test(0x10CD9, 0x10C99); // OLD HUNGARIAN SMALL LETTER EN, OLD HUNGARIAN CAPITAL LETTER EN
+test(0x10CDA, 0x10C9A); // OLD HUNGARIAN SMALL LETTER ENY, OLD HUNGARIAN CAPITAL LETTER ENY
+test(0x10CDB, 0x10C9B); // OLD HUNGARIAN SMALL LETTER O, OLD HUNGARIAN CAPITAL LETTER O
+test(0x10CDC, 0x10C9C); // OLD HUNGARIAN SMALL LETTER OO, OLD HUNGARIAN CAPITAL LETTER OO
+test(0x10CDD, 0x10C9D); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
+test(0x10CDE, 0x10C9E); // OLD HUNGARIAN SMALL LETTER RUDIMENTA OE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
+test(0x10CDF, 0x10C9F); // OLD HUNGARIAN SMALL LETTER OEE, OLD HUNGARIAN CAPITAL LETTER OEE
+test(0x10CE0, 0x10CA0); // OLD HUNGARIAN SMALL LETTER EP, OLD HUNGARIAN CAPITAL LETTER EP
+test(0x10CE1, 0x10CA1); // OLD HUNGARIAN SMALL LETTER EMP, OLD HUNGARIAN CAPITAL LETTER EMP
+test(0x10CE2, 0x10CA2); // OLD HUNGARIAN SMALL LETTER ER, OLD HUNGARIAN CAPITAL LETTER ER
+test(0x10CE3, 0x10CA3); // OLD HUNGARIAN SMALL LETTER SHORT ER, OLD HUNGARIAN CAPITAL LETTER SHORT ER
+test(0x10CE4, 0x10CA4); // OLD HUNGARIAN SMALL LETTER ES, OLD HUNGARIAN CAPITAL LETTER ES
+test(0x10CE5, 0x10CA5); // OLD HUNGARIAN SMALL LETTER ESZ, OLD HUNGARIAN CAPITAL LETTER ESZ
+test(0x10CE6, 0x10CA6); // OLD HUNGARIAN SMALL LETTER ET, OLD HUNGARIAN CAPITAL LETTER ET
+test(0x10CE7, 0x10CA7); // OLD HUNGARIAN SMALL LETTER ENT, OLD HUNGARIAN CAPITAL LETTER ENT
+test(0x10CE8, 0x10CA8); // OLD HUNGARIAN SMALL LETTER ETY, OLD HUNGARIAN CAPITAL LETTER ETY
+test(0x10CE9, 0x10CA9); // OLD HUNGARIAN SMALL LETTER ECH, OLD HUNGARIAN CAPITAL LETTER ECH
+test(0x10CEA, 0x10CAA); // OLD HUNGARIAN SMALL LETTER U, OLD HUNGARIAN CAPITAL LETTER U
+test(0x10CEB, 0x10CAB); // OLD HUNGARIAN SMALL LETTER UU, OLD HUNGARIAN CAPITAL LETTER UU
+test(0x10CEC, 0x10CAC); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
+test(0x10CED, 0x10CAD); // OLD HUNGARIAN SMALL LETTER RUDIMENTA UE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
+test(0x10CEE, 0x10CAE); // OLD HUNGARIAN SMALL LETTER EV, OLD HUNGARIAN CAPITAL LETTER EV
+test(0x10CEF, 0x10CAF); // OLD HUNGARIAN SMALL LETTER EZ, OLD HUNGARIAN CAPITAL LETTER EZ
+test(0x10CF0, 0x10CB0); // OLD HUNGARIAN SMALL LETTER EZS, OLD HUNGARIAN CAPITAL LETTER EZS
+test(0x10CF1, 0x10CB1); // OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
+test(0x10CF2, 0x10CB2); // OLD HUNGARIAN SMALL LETTER US, OLD HUNGARIAN CAPITAL LETTER US
+test(0x118A0, 0x118C0); // WARANG CITI CAPITAL LETTER NGAA, WARANG CITI SMALL LETTER NGAA
+test(0x118A1, 0x118C1); // WARANG CITI CAPITAL LETTER A, WARANG CITI SMALL LETTER A
+test(0x118A2, 0x118C2); // WARANG CITI CAPITAL LETTER WI, WARANG CITI SMALL LETTER WI
+test(0x118A3, 0x118C3); // WARANG CITI CAPITAL LETTER YU, WARANG CITI SMALL LETTER YU
+test(0x118A4, 0x118C4); // WARANG CITI CAPITAL LETTER YA, WARANG CITI SMALL LETTER YA
+test(0x118A5, 0x118C5); // WARANG CITI CAPITAL LETTER YO, WARANG CITI SMALL LETTER YO
+test(0x118A6, 0x118C6); // WARANG CITI CAPITAL LETTER II, WARANG CITI SMALL LETTER II
+test(0x118A7, 0x118C7); // WARANG CITI CAPITAL LETTER UU, WARANG CITI SMALL LETTER UU
+test(0x118A8, 0x118C8); // WARANG CITI CAPITAL LETTER E, WARANG CITI SMALL LETTER E
+test(0x118A9, 0x118C9); // WARANG CITI CAPITAL LETTER O, WARANG CITI SMALL LETTER O
+test(0x118AA, 0x118CA); // WARANG CITI CAPITAL LETTER ANG, WARANG CITI SMALL LETTER ANG
+test(0x118AB, 0x118CB); // WARANG CITI CAPITAL LETTER GA, WARANG CITI SMALL LETTER GA
+test(0x118AC, 0x118CC); // WARANG CITI CAPITAL LETTER KO, WARANG CITI SMALL LETTER KO
+test(0x118AD, 0x118CD); // WARANG CITI CAPITAL LETTER ENY, WARANG CITI SMALL LETTER ENY
+test(0x118AE, 0x118CE); // WARANG CITI CAPITAL LETTER YUJ, WARANG CITI SMALL LETTER YUJ
+test(0x118AF, 0x118CF); // WARANG CITI CAPITAL LETTER UC, WARANG CITI SMALL LETTER UC
+test(0x118B0, 0x118D0); // WARANG CITI CAPITAL LETTER ENN, WARANG CITI SMALL LETTER ENN
+test(0x118B1, 0x118D1); // WARANG CITI CAPITAL LETTER ODD, WARANG CITI SMALL LETTER ODD
+test(0x118B2, 0x118D2); // WARANG CITI CAPITAL LETTER TTE, WARANG CITI SMALL LETTER TTE
+test(0x118B3, 0x118D3); // WARANG CITI CAPITAL LETTER NUNG, WARANG CITI SMALL LETTER NUNG
+test(0x118B4, 0x118D4); // WARANG CITI CAPITAL LETTER DA, WARANG CITI SMALL LETTER DA
+test(0x118B5, 0x118D5); // WARANG CITI CAPITAL LETTER AT, WARANG CITI SMALL LETTER AT
+test(0x118B6, 0x118D6); // WARANG CITI CAPITAL LETTER AM, WARANG CITI SMALL LETTER AM
+test(0x118B7, 0x118D7); // WARANG CITI CAPITAL LETTER BU, WARANG CITI SMALL LETTER BU
+test(0x118B8, 0x118D8); // WARANG CITI CAPITAL LETTER PU, WARANG CITI SMALL LETTER PU
+test(0x118B9, 0x118D9); // WARANG CITI CAPITAL LETTER HIYO, WARANG CITI SMALL LETTER HIYO
+test(0x118BA, 0x118DA); // WARANG CITI CAPITAL LETTER HOLO, WARANG CITI SMALL LETTER HOLO
+test(0x118BB, 0x118DB); // WARANG CITI CAPITAL LETTER HORR, WARANG CITI SMALL LETTER HORR
+test(0x118BC, 0x118DC); // WARANG CITI CAPITAL LETTER HAR, WARANG CITI SMALL LETTER HAR
+test(0x118BD, 0x118DD); // WARANG CITI CAPITAL LETTER SSUU, WARANG CITI SMALL LETTER SSUU
+test(0x118BE, 0x118DE); // WARANG CITI CAPITAL LETTER SII, WARANG CITI SMALL LETTER SII
+test(0x118BF, 0x118DF); // WARANG CITI CAPITAL LETTER VIYO, WARANG CITI SMALL LETTER VIYO
+test(0x118C0, 0x118A0); // WARANG CITI SMALL LETTER NGAA, WARANG CITI CAPITAL LETTER NGAA
+test(0x118C1, 0x118A1); // WARANG CITI SMALL LETTER A, WARANG CITI CAPITAL LETTER A
+test(0x118C2, 0x118A2); // WARANG CITI SMALL LETTER WI, WARANG CITI CAPITAL LETTER WI
+test(0x118C3, 0x118A3); // WARANG CITI SMALL LETTER YU, WARANG CITI CAPITAL LETTER YU
+test(0x118C4, 0x118A4); // WARANG CITI SMALL LETTER YA, WARANG CITI CAPITAL LETTER YA
+test(0x118C5, 0x118A5); // WARANG CITI SMALL LETTER YO, WARANG CITI CAPITAL LETTER YO
+test(0x118C6, 0x118A6); // WARANG CITI SMALL LETTER II, WARANG CITI CAPITAL LETTER II
+test(0x118C7, 0x118A7); // WARANG CITI SMALL LETTER UU, WARANG CITI CAPITAL LETTER UU
+test(0x118C8, 0x118A8); // WARANG CITI SMALL LETTER E, WARANG CITI CAPITAL LETTER E
+test(0x118C9, 0x118A9); // WARANG CITI SMALL LETTER O, WARANG CITI CAPITAL LETTER O
+test(0x118CA, 0x118AA); // WARANG CITI SMALL LETTER ANG, WARANG CITI CAPITAL LETTER ANG
+test(0x118CB, 0x118AB); // WARANG CITI SMALL LETTER GA, WARANG CITI CAPITAL LETTER GA
+test(0x118CC, 0x118AC); // WARANG CITI SMALL LETTER KO, WARANG CITI CAPITAL LETTER KO
+test(0x118CD, 0x118AD); // WARANG CITI SMALL LETTER ENY, WARANG CITI CAPITAL LETTER ENY
+test(0x118CE, 0x118AE); // WARANG CITI SMALL LETTER YUJ, WARANG CITI CAPITAL LETTER YUJ
+test(0x118CF, 0x118AF); // WARANG CITI SMALL LETTER UC, WARANG CITI CAPITAL LETTER UC
+test(0x118D0, 0x118B0); // WARANG CITI SMALL LETTER ENN, WARANG CITI CAPITAL LETTER ENN
+test(0x118D1, 0x118B1); // WARANG CITI SMALL LETTER ODD, WARANG CITI CAPITAL LETTER ODD
+test(0x118D2, 0x118B2); // WARANG CITI SMALL LETTER TTE, WARANG CITI CAPITAL LETTER TTE
+test(0x118D3, 0x118B3); // WARANG CITI SMALL LETTER NUNG, WARANG CITI CAPITAL LETTER NUNG
+test(0x118D4, 0x118B4); // WARANG CITI SMALL LETTER DA, WARANG CITI CAPITAL LETTER DA
+test(0x118D5, 0x118B5); // WARANG CITI SMALL LETTER AT, WARANG CITI CAPITAL LETTER AT
+test(0x118D6, 0x118B6); // WARANG CITI SMALL LETTER AM, WARANG CITI CAPITAL LETTER AM
+test(0x118D7, 0x118B7); // WARANG CITI SMALL LETTER BU, WARANG CITI CAPITAL LETTER BU
+test(0x118D8, 0x118B8); // WARANG CITI SMALL LETTER PU, WARANG CITI CAPITAL LETTER PU
+test(0x118D9, 0x118B9); // WARANG CITI SMALL LETTER HIYO, WARANG CITI CAPITAL LETTER HIYO
+test(0x118DA, 0x118BA); // WARANG CITI SMALL LETTER HOLO, WARANG CITI CAPITAL LETTER HOLO
+test(0x118DB, 0x118BB); // WARANG CITI SMALL LETTER HORR, WARANG CITI CAPITAL LETTER HORR
+test(0x118DC, 0x118BC); // WARANG CITI SMALL LETTER HAR, WARANG CITI CAPITAL LETTER HAR
+test(0x118DD, 0x118BD); // WARANG CITI SMALL LETTER SSUU, WARANG CITI CAPITAL LETTER SSUU
+test(0x118DE, 0x118BE); // WARANG CITI SMALL LETTER SII, WARANG CITI CAPITAL LETTER SII
+test(0x118DF, 0x118BF); // WARANG CITI SMALL LETTER VIYO, WARANG CITI CAPITAL LETTER VIYO
+test(0x16E40, 0x16E60); // MEDEFAIDRIN CAPITAL LETTER M, MEDEFAIDRIN SMALL LETTER M
+test(0x16E41, 0x16E61); // MEDEFAIDRIN CAPITAL LETTER S, MEDEFAIDRIN SMALL LETTER S
+test(0x16E42, 0x16E62); // MEDEFAIDRIN CAPITAL LETTER V, MEDEFAIDRIN SMALL LETTER V
+test(0x16E43, 0x16E63); // MEDEFAIDRIN CAPITAL LETTER W, MEDEFAIDRIN SMALL LETTER W
+test(0x16E44, 0x16E64); // MEDEFAIDRIN CAPITAL LETTER ATIU, MEDEFAIDRIN SMALL LETTER ATIU
+test(0x16E45, 0x16E65); // MEDEFAIDRIN CAPITAL LETTER Z, MEDEFAIDRIN SMALL LETTER Z
+test(0x16E46, 0x16E66); // MEDEFAIDRIN CAPITAL LETTER KP, MEDEFAIDRIN SMALL LETTER KP
+test(0x16E47, 0x16E67); // MEDEFAIDRIN CAPITAL LETTER P, MEDEFAIDRIN SMALL LETTER P
+test(0x16E48, 0x16E68); // MEDEFAIDRIN CAPITAL LETTER T, MEDEFAIDRIN SMALL LETTER T
+test(0x16E49, 0x16E69); // MEDEFAIDRIN CAPITAL LETTER G, MEDEFAIDRIN SMALL LETTER G
+test(0x16E4A, 0x16E6A); // MEDEFAIDRIN CAPITAL LETTER F, MEDEFAIDRIN SMALL LETTER F
+test(0x16E4B, 0x16E6B); // MEDEFAIDRIN CAPITAL LETTER I, MEDEFAIDRIN SMALL LETTER I
+test(0x16E4C, 0x16E6C); // MEDEFAIDRIN CAPITAL LETTER K, MEDEFAIDRIN SMALL LETTER K
+test(0x16E4D, 0x16E6D); // MEDEFAIDRIN CAPITAL LETTER A, MEDEFAIDRIN SMALL LETTER A
+test(0x16E4E, 0x16E6E); // MEDEFAIDRIN CAPITAL LETTER J, MEDEFAIDRIN SMALL LETTER J
+test(0x16E4F, 0x16E6F); // MEDEFAIDRIN CAPITAL LETTER E, MEDEFAIDRIN SMALL LETTER E
+test(0x16E50, 0x16E70); // MEDEFAIDRIN CAPITAL LETTER B, MEDEFAIDRIN SMALL LETTER B
+test(0x16E51, 0x16E71); // MEDEFAIDRIN CAPITAL LETTER C, MEDEFAIDRIN SMALL LETTER C
+test(0x16E52, 0x16E72); // MEDEFAIDRIN CAPITAL LETTER U, MEDEFAIDRIN SMALL LETTER U
+test(0x16E53, 0x16E73); // MEDEFAIDRIN CAPITAL LETTER YU, MEDEFAIDRIN SMALL LETTER YU
+test(0x16E54, 0x16E74); // MEDEFAIDRIN CAPITAL LETTER L, MEDEFAIDRIN SMALL LETTER L
+test(0x16E55, 0x16E75); // MEDEFAIDRIN CAPITAL LETTER Q, MEDEFAIDRIN SMALL LETTER Q
+test(0x16E56, 0x16E76); // MEDEFAIDRIN CAPITAL LETTER HP, MEDEFAIDRIN SMALL LETTER HP
+test(0x16E57, 0x16E77); // MEDEFAIDRIN CAPITAL LETTER NY, MEDEFAIDRIN SMALL LETTER NY
+test(0x16E58, 0x16E78); // MEDEFAIDRIN CAPITAL LETTER X, MEDEFAIDRIN SMALL LETTER X
+test(0x16E59, 0x16E79); // MEDEFAIDRIN CAPITAL LETTER D, MEDEFAIDRIN SMALL LETTER D
+test(0x16E5A, 0x16E7A); // MEDEFAIDRIN CAPITAL LETTER OE, MEDEFAIDRIN SMALL LETTER OE
+test(0x16E5B, 0x16E7B); // MEDEFAIDRIN CAPITAL LETTER N, MEDEFAIDRIN SMALL LETTER N
+test(0x16E5C, 0x16E7C); // MEDEFAIDRIN CAPITAL LETTER R, MEDEFAIDRIN SMALL LETTER R
+test(0x16E5D, 0x16E7D); // MEDEFAIDRIN CAPITAL LETTER O, MEDEFAIDRIN SMALL LETTER O
+test(0x16E5E, 0x16E7E); // MEDEFAIDRIN CAPITAL LETTER AI, MEDEFAIDRIN SMALL LETTER AI
+test(0x16E5F, 0x16E7F); // MEDEFAIDRIN CAPITAL LETTER Y, MEDEFAIDRIN SMALL LETTER Y
+test(0x16E60, 0x16E40); // MEDEFAIDRIN SMALL LETTER M, MEDEFAIDRIN CAPITAL LETTER M
+test(0x16E61, 0x16E41); // MEDEFAIDRIN SMALL LETTER S, MEDEFAIDRIN CAPITAL LETTER S
+test(0x16E62, 0x16E42); // MEDEFAIDRIN SMALL LETTER V, MEDEFAIDRIN CAPITAL LETTER V
+test(0x16E63, 0x16E43); // MEDEFAIDRIN SMALL LETTER W, MEDEFAIDRIN CAPITAL LETTER W
+test(0x16E64, 0x16E44); // MEDEFAIDRIN SMALL LETTER ATIU, MEDEFAIDRIN CAPITAL LETTER ATIU
+test(0x16E65, 0x16E45); // MEDEFAIDRIN SMALL LETTER Z, MEDEFAIDRIN CAPITAL LETTER Z
+test(0x16E66, 0x16E46); // MEDEFAIDRIN SMALL LETTER KP, MEDEFAIDRIN CAPITAL LETTER KP
+test(0x16E67, 0x16E47); // MEDEFAIDRIN SMALL LETTER P, MEDEFAIDRIN CAPITAL LETTER P
+test(0x16E68, 0x16E48); // MEDEFAIDRIN SMALL LETTER T, MEDEFAIDRIN CAPITAL LETTER T
+test(0x16E69, 0x16E49); // MEDEFAIDRIN SMALL LETTER G, MEDEFAIDRIN CAPITAL LETTER G
+test(0x16E6A, 0x16E4A); // MEDEFAIDRIN SMALL LETTER F, MEDEFAIDRIN CAPITAL LETTER F
+test(0x16E6B, 0x16E4B); // MEDEFAIDRIN SMALL LETTER I, MEDEFAIDRIN CAPITAL LETTER I
+test(0x16E6C, 0x16E4C); // MEDEFAIDRIN SMALL LETTER K, MEDEFAIDRIN CAPITAL LETTER K
+test(0x16E6D, 0x16E4D); // MEDEFAIDRIN SMALL LETTER A, MEDEFAIDRIN CAPITAL LETTER A
+test(0x16E6E, 0x16E4E); // MEDEFAIDRIN SMALL LETTER J, MEDEFAIDRIN CAPITAL LETTER J
+test(0x16E6F, 0x16E4F); // MEDEFAIDRIN SMALL LETTER E, MEDEFAIDRIN CAPITAL LETTER E
+test(0x16E70, 0x16E50); // MEDEFAIDRIN SMALL LETTER B, MEDEFAIDRIN CAPITAL LETTER B
+test(0x16E71, 0x16E51); // MEDEFAIDRIN SMALL LETTER C, MEDEFAIDRIN CAPITAL LETTER C
+test(0x16E72, 0x16E52); // MEDEFAIDRIN SMALL LETTER U, MEDEFAIDRIN CAPITAL LETTER U
+test(0x16E73, 0x16E53); // MEDEFAIDRIN SMALL LETTER YU, MEDEFAIDRIN CAPITAL LETTER YU
+test(0x16E74, 0x16E54); // MEDEFAIDRIN SMALL LETTER L, MEDEFAIDRIN CAPITAL LETTER L
+test(0x16E75, 0x16E55); // MEDEFAIDRIN SMALL LETTER Q, MEDEFAIDRIN CAPITAL LETTER Q
+test(0x16E76, 0x16E56); // MEDEFAIDRIN SMALL LETTER HP, MEDEFAIDRIN CAPITAL LETTER HP
+test(0x16E77, 0x16E57); // MEDEFAIDRIN SMALL LETTER NY, MEDEFAIDRIN CAPITAL LETTER NY
+test(0x16E78, 0x16E58); // MEDEFAIDRIN SMALL LETTER X, MEDEFAIDRIN CAPITAL LETTER X
+test(0x16E79, 0x16E59); // MEDEFAIDRIN SMALL LETTER D, MEDEFAIDRIN CAPITAL LETTER D
+test(0x16E7A, 0x16E5A); // MEDEFAIDRIN SMALL LETTER OE, MEDEFAIDRIN CAPITAL LETTER OE
+test(0x16E7B, 0x16E5B); // MEDEFAIDRIN SMALL LETTER N, MEDEFAIDRIN CAPITAL LETTER N
+test(0x16E7C, 0x16E5C); // MEDEFAIDRIN SMALL LETTER R, MEDEFAIDRIN CAPITAL LETTER R
+test(0x16E7D, 0x16E5D); // MEDEFAIDRIN SMALL LETTER O, MEDEFAIDRIN CAPITAL LETTER O
+test(0x16E7E, 0x16E5E); // MEDEFAIDRIN SMALL LETTER AI, MEDEFAIDRIN CAPITAL LETTER AI
+test(0x16E7F, 0x16E5F); // MEDEFAIDRIN SMALL LETTER Y, MEDEFAIDRIN CAPITAL LETTER Y
+test(0x1E900, 0x1E922); // ADLAM CAPITAL LETTER ALIF, ADLAM SMALL LETTER ALIF
+test(0x1E901, 0x1E923); // ADLAM CAPITAL LETTER DAALI, ADLAM SMALL LETTER DAALI
+test(0x1E902, 0x1E924); // ADLAM CAPITAL LETTER LAAM, ADLAM SMALL LETTER LAAM
+test(0x1E903, 0x1E925); // ADLAM CAPITAL LETTER MIIM, ADLAM SMALL LETTER MIIM
+test(0x1E904, 0x1E926); // ADLAM CAPITAL LETTER BA, ADLAM SMALL LETTER BA
+test(0x1E905, 0x1E927); // ADLAM CAPITAL LETTER SINNYIIYHE, ADLAM SMALL LETTER SINNYIIYHE
+test(0x1E906, 0x1E928); // ADLAM CAPITAL LETTER PE, ADLAM SMALL LETTER PE
+test(0x1E907, 0x1E929); // ADLAM CAPITAL LETTER BHE, ADLAM SMALL LETTER BHE
+test(0x1E908, 0x1E92A); // ADLAM CAPITAL LETTER RA, ADLAM SMALL LETTER RA
+test(0x1E909, 0x1E92B); // ADLAM CAPITAL LETTER E, ADLAM SMALL LETTER E
+test(0x1E90A, 0x1E92C); // ADLAM CAPITAL LETTER FA, ADLAM SMALL LETTER FA
+test(0x1E90B, 0x1E92D); // ADLAM CAPITAL LETTER I, ADLAM SMALL LETTER I
+test(0x1E90C, 0x1E92E); // ADLAM CAPITAL LETTER O, ADLAM SMALL LETTER O
+test(0x1E90D, 0x1E92F); // ADLAM CAPITAL LETTER DHA, ADLAM SMALL LETTER DHA
+test(0x1E90E, 0x1E930); // ADLAM CAPITAL LETTER YHE, ADLAM SMALL LETTER YHE
+test(0x1E90F, 0x1E931); // ADLAM CAPITAL LETTER WAW, ADLAM SMALL LETTER WAW
+test(0x1E910, 0x1E932); // ADLAM CAPITAL LETTER NUN, ADLAM SMALL LETTER NUN
+test(0x1E911, 0x1E933); // ADLAM CAPITAL LETTER KAF, ADLAM SMALL LETTER KAF
+test(0x1E912, 0x1E934); // ADLAM CAPITAL LETTER YA, ADLAM SMALL LETTER YA
+test(0x1E913, 0x1E935); // ADLAM CAPITAL LETTER U, ADLAM SMALL LETTER U
+test(0x1E914, 0x1E936); // ADLAM CAPITAL LETTER JIIM, ADLAM SMALL LETTER JIIM
+test(0x1E915, 0x1E937); // ADLAM CAPITAL LETTER CHI, ADLAM SMALL LETTER CHI
+test(0x1E916, 0x1E938); // ADLAM CAPITAL LETTER HA, ADLAM SMALL LETTER HA
+test(0x1E917, 0x1E939); // ADLAM CAPITAL LETTER QAAF, ADLAM SMALL LETTER QAAF
+test(0x1E918, 0x1E93A); // ADLAM CAPITAL LETTER GA, ADLAM SMALL LETTER GA
+test(0x1E919, 0x1E93B); // ADLAM CAPITAL LETTER NYA, ADLAM SMALL LETTER NYA
+test(0x1E91A, 0x1E93C); // ADLAM CAPITAL LETTER TU, ADLAM SMALL LETTER TU
+test(0x1E91B, 0x1E93D); // ADLAM CAPITAL LETTER NHA, ADLAM SMALL LETTER NHA
+test(0x1E91C, 0x1E93E); // ADLAM CAPITAL LETTER VA, ADLAM SMALL LETTER VA
+test(0x1E91D, 0x1E93F); // ADLAM CAPITAL LETTER KHA, ADLAM SMALL LETTER KHA
+test(0x1E91E, 0x1E940); // ADLAM CAPITAL LETTER GBE, ADLAM SMALL LETTER GBE
+test(0x1E91F, 0x1E941); // ADLAM CAPITAL LETTER ZAL, ADLAM SMALL LETTER ZAL
+test(0x1E920, 0x1E942); // ADLAM CAPITAL LETTER KPO, ADLAM SMALL LETTER KPO
+test(0x1E921, 0x1E943); // ADLAM CAPITAL LETTER SHA, ADLAM SMALL LETTER SHA
+test(0x1E922, 0x1E900); // ADLAM SMALL LETTER ALIF, ADLAM CAPITAL LETTER ALIF
+test(0x1E923, 0x1E901); // ADLAM SMALL LETTER DAALI, ADLAM CAPITAL LETTER DAALI
+test(0x1E924, 0x1E902); // ADLAM SMALL LETTER LAAM, ADLAM CAPITAL LETTER LAAM
+test(0x1E925, 0x1E903); // ADLAM SMALL LETTER MIIM, ADLAM CAPITAL LETTER MIIM
+test(0x1E926, 0x1E904); // ADLAM SMALL LETTER BA, ADLAM CAPITAL LETTER BA
+test(0x1E927, 0x1E905); // ADLAM SMALL LETTER SINNYIIYHE, ADLAM CAPITAL LETTER SINNYIIYHE
+test(0x1E928, 0x1E906); // ADLAM SMALL LETTER PE, ADLAM CAPITAL LETTER PE
+test(0x1E929, 0x1E907); // ADLAM SMALL LETTER BHE, ADLAM CAPITAL LETTER BHE
+test(0x1E92A, 0x1E908); // ADLAM SMALL LETTER RA, ADLAM CAPITAL LETTER RA
+test(0x1E92B, 0x1E909); // ADLAM SMALL LETTER E, ADLAM CAPITAL LETTER E
+test(0x1E92C, 0x1E90A); // ADLAM SMALL LETTER FA, ADLAM CAPITAL LETTER FA
+test(0x1E92D, 0x1E90B); // ADLAM SMALL LETTER I, ADLAM CAPITAL LETTER I
+test(0x1E92E, 0x1E90C); // ADLAM SMALL LETTER O, ADLAM CAPITAL LETTER O
+test(0x1E92F, 0x1E90D); // ADLAM SMALL LETTER DHA, ADLAM CAPITAL LETTER DHA
+test(0x1E930, 0x1E90E); // ADLAM SMALL LETTER YHE, ADLAM CAPITAL LETTER YHE
+test(0x1E931, 0x1E90F); // ADLAM SMALL LETTER WAW, ADLAM CAPITAL LETTER WAW
+test(0x1E932, 0x1E910); // ADLAM SMALL LETTER NUN, ADLAM CAPITAL LETTER NUN
+test(0x1E933, 0x1E911); // ADLAM SMALL LETTER KAF, ADLAM CAPITAL LETTER KAF
+test(0x1E934, 0x1E912); // ADLAM SMALL LETTER YA, ADLAM CAPITAL LETTER YA
+test(0x1E935, 0x1E913); // ADLAM SMALL LETTER U, ADLAM CAPITAL LETTER U
+test(0x1E936, 0x1E914); // ADLAM SMALL LETTER JIIM, ADLAM CAPITAL LETTER JIIM
+test(0x1E937, 0x1E915); // ADLAM SMALL LETTER CHI, ADLAM CAPITAL LETTER CHI
+test(0x1E938, 0x1E916); // ADLAM SMALL LETTER HA, ADLAM CAPITAL LETTER HA
+test(0x1E939, 0x1E917); // ADLAM SMALL LETTER QAAF, ADLAM CAPITAL LETTER QAAF
+test(0x1E93A, 0x1E918); // ADLAM SMALL LETTER GA, ADLAM CAPITAL LETTER GA
+test(0x1E93B, 0x1E919); // ADLAM SMALL LETTER NYA, ADLAM CAPITAL LETTER NYA
+test(0x1E93C, 0x1E91A); // ADLAM SMALL LETTER TU, ADLAM CAPITAL LETTER TU
+test(0x1E93D, 0x1E91B); // ADLAM SMALL LETTER NHA, ADLAM CAPITAL LETTER NHA
+test(0x1E93E, 0x1E91C); // ADLAM SMALL LETTER VA, ADLAM CAPITAL LETTER VA
+test(0x1E93F, 0x1E91D); // ADLAM SMALL LETTER KHA, ADLAM CAPITAL LETTER KHA
+test(0x1E940, 0x1E91E); // ADLAM SMALL LETTER GBE, ADLAM CAPITAL LETTER GBE
+test(0x1E941, 0x1E91F); // ADLAM SMALL LETTER ZAL, ADLAM CAPITAL LETTER ZAL
+test(0x1E942, 0x1E920); // ADLAM SMALL LETTER KPO, ADLAM CAPITAL LETTER KPO
+test(0x1E943, 0x1E921); // ADLAM SMALL LETTER SHA, ADLAM CAPITAL LETTER SHA
if (typeof reportCompare === "function")
reportCompare(true, true);
diff --git a/js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js b/js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js
index 6a1be5241d..d75bf77059 100644
--- a/js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js
+++ b/js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js
@@ -5,456 +5,456 @@
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
-assertEq(String.fromCodePoint(0x10428).toUpperCase().codePointAt(0), 0x10400);
-assertEq(String.fromCodePoint(0x10429).toUpperCase().codePointAt(0), 0x10401);
-assertEq(String.fromCodePoint(0x1042a).toUpperCase().codePointAt(0), 0x10402);
-assertEq(String.fromCodePoint(0x1042b).toUpperCase().codePointAt(0), 0x10403);
-assertEq(String.fromCodePoint(0x1042c).toUpperCase().codePointAt(0), 0x10404);
-assertEq(String.fromCodePoint(0x1042d).toUpperCase().codePointAt(0), 0x10405);
-assertEq(String.fromCodePoint(0x1042e).toUpperCase().codePointAt(0), 0x10406);
-assertEq(String.fromCodePoint(0x1042f).toUpperCase().codePointAt(0), 0x10407);
-assertEq(String.fromCodePoint(0x10430).toUpperCase().codePointAt(0), 0x10408);
-assertEq(String.fromCodePoint(0x10431).toUpperCase().codePointAt(0), 0x10409);
-assertEq(String.fromCodePoint(0x10432).toUpperCase().codePointAt(0), 0x1040a);
-assertEq(String.fromCodePoint(0x10433).toUpperCase().codePointAt(0), 0x1040b);
-assertEq(String.fromCodePoint(0x10434).toUpperCase().codePointAt(0), 0x1040c);
-assertEq(String.fromCodePoint(0x10435).toUpperCase().codePointAt(0), 0x1040d);
-assertEq(String.fromCodePoint(0x10436).toUpperCase().codePointAt(0), 0x1040e);
-assertEq(String.fromCodePoint(0x10437).toUpperCase().codePointAt(0), 0x1040f);
-assertEq(String.fromCodePoint(0x10438).toUpperCase().codePointAt(0), 0x10410);
-assertEq(String.fromCodePoint(0x10439).toUpperCase().codePointAt(0), 0x10411);
-assertEq(String.fromCodePoint(0x1043a).toUpperCase().codePointAt(0), 0x10412);
-assertEq(String.fromCodePoint(0x1043b).toUpperCase().codePointAt(0), 0x10413);
-assertEq(String.fromCodePoint(0x1043c).toUpperCase().codePointAt(0), 0x10414);
-assertEq(String.fromCodePoint(0x1043d).toUpperCase().codePointAt(0), 0x10415);
-assertEq(String.fromCodePoint(0x1043e).toUpperCase().codePointAt(0), 0x10416);
-assertEq(String.fromCodePoint(0x1043f).toUpperCase().codePointAt(0), 0x10417);
-assertEq(String.fromCodePoint(0x10440).toUpperCase().codePointAt(0), 0x10418);
-assertEq(String.fromCodePoint(0x10441).toUpperCase().codePointAt(0), 0x10419);
-assertEq(String.fromCodePoint(0x10442).toUpperCase().codePointAt(0), 0x1041a);
-assertEq(String.fromCodePoint(0x10443).toUpperCase().codePointAt(0), 0x1041b);
-assertEq(String.fromCodePoint(0x10444).toUpperCase().codePointAt(0), 0x1041c);
-assertEq(String.fromCodePoint(0x10445).toUpperCase().codePointAt(0), 0x1041d);
-assertEq(String.fromCodePoint(0x10446).toUpperCase().codePointAt(0), 0x1041e);
-assertEq(String.fromCodePoint(0x10447).toUpperCase().codePointAt(0), 0x1041f);
-assertEq(String.fromCodePoint(0x10448).toUpperCase().codePointAt(0), 0x10420);
-assertEq(String.fromCodePoint(0x10449).toUpperCase().codePointAt(0), 0x10421);
-assertEq(String.fromCodePoint(0x1044a).toUpperCase().codePointAt(0), 0x10422);
-assertEq(String.fromCodePoint(0x1044b).toUpperCase().codePointAt(0), 0x10423);
-assertEq(String.fromCodePoint(0x1044c).toUpperCase().codePointAt(0), 0x10424);
-assertEq(String.fromCodePoint(0x1044d).toUpperCase().codePointAt(0), 0x10425);
-assertEq(String.fromCodePoint(0x1044e).toUpperCase().codePointAt(0), 0x10426);
-assertEq(String.fromCodePoint(0x1044f).toUpperCase().codePointAt(0), 0x10427);
-assertEq(String.fromCodePoint(0x104d8).toUpperCase().codePointAt(0), 0x104b0);
-assertEq(String.fromCodePoint(0x104d9).toUpperCase().codePointAt(0), 0x104b1);
-assertEq(String.fromCodePoint(0x104da).toUpperCase().codePointAt(0), 0x104b2);
-assertEq(String.fromCodePoint(0x104db).toUpperCase().codePointAt(0), 0x104b3);
-assertEq(String.fromCodePoint(0x104dc).toUpperCase().codePointAt(0), 0x104b4);
-assertEq(String.fromCodePoint(0x104dd).toUpperCase().codePointAt(0), 0x104b5);
-assertEq(String.fromCodePoint(0x104de).toUpperCase().codePointAt(0), 0x104b6);
-assertEq(String.fromCodePoint(0x104df).toUpperCase().codePointAt(0), 0x104b7);
-assertEq(String.fromCodePoint(0x104e0).toUpperCase().codePointAt(0), 0x104b8);
-assertEq(String.fromCodePoint(0x104e1).toUpperCase().codePointAt(0), 0x104b9);
-assertEq(String.fromCodePoint(0x104e2).toUpperCase().codePointAt(0), 0x104ba);
-assertEq(String.fromCodePoint(0x104e3).toUpperCase().codePointAt(0), 0x104bb);
-assertEq(String.fromCodePoint(0x104e4).toUpperCase().codePointAt(0), 0x104bc);
-assertEq(String.fromCodePoint(0x104e5).toUpperCase().codePointAt(0), 0x104bd);
-assertEq(String.fromCodePoint(0x104e6).toUpperCase().codePointAt(0), 0x104be);
-assertEq(String.fromCodePoint(0x104e7).toUpperCase().codePointAt(0), 0x104bf);
-assertEq(String.fromCodePoint(0x104e8).toUpperCase().codePointAt(0), 0x104c0);
-assertEq(String.fromCodePoint(0x104e9).toUpperCase().codePointAt(0), 0x104c1);
-assertEq(String.fromCodePoint(0x104ea).toUpperCase().codePointAt(0), 0x104c2);
-assertEq(String.fromCodePoint(0x104eb).toUpperCase().codePointAt(0), 0x104c3);
-assertEq(String.fromCodePoint(0x104ec).toUpperCase().codePointAt(0), 0x104c4);
-assertEq(String.fromCodePoint(0x104ed).toUpperCase().codePointAt(0), 0x104c5);
-assertEq(String.fromCodePoint(0x104ee).toUpperCase().codePointAt(0), 0x104c6);
-assertEq(String.fromCodePoint(0x104ef).toUpperCase().codePointAt(0), 0x104c7);
-assertEq(String.fromCodePoint(0x104f0).toUpperCase().codePointAt(0), 0x104c8);
-assertEq(String.fromCodePoint(0x104f1).toUpperCase().codePointAt(0), 0x104c9);
-assertEq(String.fromCodePoint(0x104f2).toUpperCase().codePointAt(0), 0x104ca);
-assertEq(String.fromCodePoint(0x104f3).toUpperCase().codePointAt(0), 0x104cb);
-assertEq(String.fromCodePoint(0x104f4).toUpperCase().codePointAt(0), 0x104cc);
-assertEq(String.fromCodePoint(0x104f5).toUpperCase().codePointAt(0), 0x104cd);
-assertEq(String.fromCodePoint(0x104f6).toUpperCase().codePointAt(0), 0x104ce);
-assertEq(String.fromCodePoint(0x104f7).toUpperCase().codePointAt(0), 0x104cf);
-assertEq(String.fromCodePoint(0x104f8).toUpperCase().codePointAt(0), 0x104d0);
-assertEq(String.fromCodePoint(0x104f9).toUpperCase().codePointAt(0), 0x104d1);
-assertEq(String.fromCodePoint(0x104fa).toUpperCase().codePointAt(0), 0x104d2);
-assertEq(String.fromCodePoint(0x104fb).toUpperCase().codePointAt(0), 0x104d3);
-assertEq(String.fromCodePoint(0x10cc0).toUpperCase().codePointAt(0), 0x10c80);
-assertEq(String.fromCodePoint(0x10cc1).toUpperCase().codePointAt(0), 0x10c81);
-assertEq(String.fromCodePoint(0x10cc2).toUpperCase().codePointAt(0), 0x10c82);
-assertEq(String.fromCodePoint(0x10cc3).toUpperCase().codePointAt(0), 0x10c83);
-assertEq(String.fromCodePoint(0x10cc4).toUpperCase().codePointAt(0), 0x10c84);
-assertEq(String.fromCodePoint(0x10cc5).toUpperCase().codePointAt(0), 0x10c85);
-assertEq(String.fromCodePoint(0x10cc6).toUpperCase().codePointAt(0), 0x10c86);
-assertEq(String.fromCodePoint(0x10cc7).toUpperCase().codePointAt(0), 0x10c87);
-assertEq(String.fromCodePoint(0x10cc8).toUpperCase().codePointAt(0), 0x10c88);
-assertEq(String.fromCodePoint(0x10cc9).toUpperCase().codePointAt(0), 0x10c89);
-assertEq(String.fromCodePoint(0x10cca).toUpperCase().codePointAt(0), 0x10c8a);
-assertEq(String.fromCodePoint(0x10ccb).toUpperCase().codePointAt(0), 0x10c8b);
-assertEq(String.fromCodePoint(0x10ccc).toUpperCase().codePointAt(0), 0x10c8c);
-assertEq(String.fromCodePoint(0x10ccd).toUpperCase().codePointAt(0), 0x10c8d);
-assertEq(String.fromCodePoint(0x10cce).toUpperCase().codePointAt(0), 0x10c8e);
-assertEq(String.fromCodePoint(0x10ccf).toUpperCase().codePointAt(0), 0x10c8f);
-assertEq(String.fromCodePoint(0x10cd0).toUpperCase().codePointAt(0), 0x10c90);
-assertEq(String.fromCodePoint(0x10cd1).toUpperCase().codePointAt(0), 0x10c91);
-assertEq(String.fromCodePoint(0x10cd2).toUpperCase().codePointAt(0), 0x10c92);
-assertEq(String.fromCodePoint(0x10cd3).toUpperCase().codePointAt(0), 0x10c93);
-assertEq(String.fromCodePoint(0x10cd4).toUpperCase().codePointAt(0), 0x10c94);
-assertEq(String.fromCodePoint(0x10cd5).toUpperCase().codePointAt(0), 0x10c95);
-assertEq(String.fromCodePoint(0x10cd6).toUpperCase().codePointAt(0), 0x10c96);
-assertEq(String.fromCodePoint(0x10cd7).toUpperCase().codePointAt(0), 0x10c97);
-assertEq(String.fromCodePoint(0x10cd8).toUpperCase().codePointAt(0), 0x10c98);
-assertEq(String.fromCodePoint(0x10cd9).toUpperCase().codePointAt(0), 0x10c99);
-assertEq(String.fromCodePoint(0x10cda).toUpperCase().codePointAt(0), 0x10c9a);
-assertEq(String.fromCodePoint(0x10cdb).toUpperCase().codePointAt(0), 0x10c9b);
-assertEq(String.fromCodePoint(0x10cdc).toUpperCase().codePointAt(0), 0x10c9c);
-assertEq(String.fromCodePoint(0x10cdd).toUpperCase().codePointAt(0), 0x10c9d);
-assertEq(String.fromCodePoint(0x10cde).toUpperCase().codePointAt(0), 0x10c9e);
-assertEq(String.fromCodePoint(0x10cdf).toUpperCase().codePointAt(0), 0x10c9f);
-assertEq(String.fromCodePoint(0x10ce0).toUpperCase().codePointAt(0), 0x10ca0);
-assertEq(String.fromCodePoint(0x10ce1).toUpperCase().codePointAt(0), 0x10ca1);
-assertEq(String.fromCodePoint(0x10ce2).toUpperCase().codePointAt(0), 0x10ca2);
-assertEq(String.fromCodePoint(0x10ce3).toUpperCase().codePointAt(0), 0x10ca3);
-assertEq(String.fromCodePoint(0x10ce4).toUpperCase().codePointAt(0), 0x10ca4);
-assertEq(String.fromCodePoint(0x10ce5).toUpperCase().codePointAt(0), 0x10ca5);
-assertEq(String.fromCodePoint(0x10ce6).toUpperCase().codePointAt(0), 0x10ca6);
-assertEq(String.fromCodePoint(0x10ce7).toUpperCase().codePointAt(0), 0x10ca7);
-assertEq(String.fromCodePoint(0x10ce8).toUpperCase().codePointAt(0), 0x10ca8);
-assertEq(String.fromCodePoint(0x10ce9).toUpperCase().codePointAt(0), 0x10ca9);
-assertEq(String.fromCodePoint(0x10cea).toUpperCase().codePointAt(0), 0x10caa);
-assertEq(String.fromCodePoint(0x10ceb).toUpperCase().codePointAt(0), 0x10cab);
-assertEq(String.fromCodePoint(0x10cec).toUpperCase().codePointAt(0), 0x10cac);
-assertEq(String.fromCodePoint(0x10ced).toUpperCase().codePointAt(0), 0x10cad);
-assertEq(String.fromCodePoint(0x10cee).toUpperCase().codePointAt(0), 0x10cae);
-assertEq(String.fromCodePoint(0x10cef).toUpperCase().codePointAt(0), 0x10caf);
-assertEq(String.fromCodePoint(0x10cf0).toUpperCase().codePointAt(0), 0x10cb0);
-assertEq(String.fromCodePoint(0x10cf1).toUpperCase().codePointAt(0), 0x10cb1);
-assertEq(String.fromCodePoint(0x10cf2).toUpperCase().codePointAt(0), 0x10cb2);
-assertEq(String.fromCodePoint(0x118c0).toUpperCase().codePointAt(0), 0x118a0);
-assertEq(String.fromCodePoint(0x118c1).toUpperCase().codePointAt(0), 0x118a1);
-assertEq(String.fromCodePoint(0x118c2).toUpperCase().codePointAt(0), 0x118a2);
-assertEq(String.fromCodePoint(0x118c3).toUpperCase().codePointAt(0), 0x118a3);
-assertEq(String.fromCodePoint(0x118c4).toUpperCase().codePointAt(0), 0x118a4);
-assertEq(String.fromCodePoint(0x118c5).toUpperCase().codePointAt(0), 0x118a5);
-assertEq(String.fromCodePoint(0x118c6).toUpperCase().codePointAt(0), 0x118a6);
-assertEq(String.fromCodePoint(0x118c7).toUpperCase().codePointAt(0), 0x118a7);
-assertEq(String.fromCodePoint(0x118c8).toUpperCase().codePointAt(0), 0x118a8);
-assertEq(String.fromCodePoint(0x118c9).toUpperCase().codePointAt(0), 0x118a9);
-assertEq(String.fromCodePoint(0x118ca).toUpperCase().codePointAt(0), 0x118aa);
-assertEq(String.fromCodePoint(0x118cb).toUpperCase().codePointAt(0), 0x118ab);
-assertEq(String.fromCodePoint(0x118cc).toUpperCase().codePointAt(0), 0x118ac);
-assertEq(String.fromCodePoint(0x118cd).toUpperCase().codePointAt(0), 0x118ad);
-assertEq(String.fromCodePoint(0x118ce).toUpperCase().codePointAt(0), 0x118ae);
-assertEq(String.fromCodePoint(0x118cf).toUpperCase().codePointAt(0), 0x118af);
-assertEq(String.fromCodePoint(0x118d0).toUpperCase().codePointAt(0), 0x118b0);
-assertEq(String.fromCodePoint(0x118d1).toUpperCase().codePointAt(0), 0x118b1);
-assertEq(String.fromCodePoint(0x118d2).toUpperCase().codePointAt(0), 0x118b2);
-assertEq(String.fromCodePoint(0x118d3).toUpperCase().codePointAt(0), 0x118b3);
-assertEq(String.fromCodePoint(0x118d4).toUpperCase().codePointAt(0), 0x118b4);
-assertEq(String.fromCodePoint(0x118d5).toUpperCase().codePointAt(0), 0x118b5);
-assertEq(String.fromCodePoint(0x118d6).toUpperCase().codePointAt(0), 0x118b6);
-assertEq(String.fromCodePoint(0x118d7).toUpperCase().codePointAt(0), 0x118b7);
-assertEq(String.fromCodePoint(0x118d8).toUpperCase().codePointAt(0), 0x118b8);
-assertEq(String.fromCodePoint(0x118d9).toUpperCase().codePointAt(0), 0x118b9);
-assertEq(String.fromCodePoint(0x118da).toUpperCase().codePointAt(0), 0x118ba);
-assertEq(String.fromCodePoint(0x118db).toUpperCase().codePointAt(0), 0x118bb);
-assertEq(String.fromCodePoint(0x118dc).toUpperCase().codePointAt(0), 0x118bc);
-assertEq(String.fromCodePoint(0x118dd).toUpperCase().codePointAt(0), 0x118bd);
-assertEq(String.fromCodePoint(0x118de).toUpperCase().codePointAt(0), 0x118be);
-assertEq(String.fromCodePoint(0x118df).toUpperCase().codePointAt(0), 0x118bf);
-assertEq(String.fromCodePoint(0x16e60).toUpperCase().codePointAt(0), 0x16e40);
-assertEq(String.fromCodePoint(0x16e61).toUpperCase().codePointAt(0), 0x16e41);
-assertEq(String.fromCodePoint(0x16e62).toUpperCase().codePointAt(0), 0x16e42);
-assertEq(String.fromCodePoint(0x16e63).toUpperCase().codePointAt(0), 0x16e43);
-assertEq(String.fromCodePoint(0x16e64).toUpperCase().codePointAt(0), 0x16e44);
-assertEq(String.fromCodePoint(0x16e65).toUpperCase().codePointAt(0), 0x16e45);
-assertEq(String.fromCodePoint(0x16e66).toUpperCase().codePointAt(0), 0x16e46);
-assertEq(String.fromCodePoint(0x16e67).toUpperCase().codePointAt(0), 0x16e47);
-assertEq(String.fromCodePoint(0x16e68).toUpperCase().codePointAt(0), 0x16e48);
-assertEq(String.fromCodePoint(0x16e69).toUpperCase().codePointAt(0), 0x16e49);
-assertEq(String.fromCodePoint(0x16e6a).toUpperCase().codePointAt(0), 0x16e4a);
-assertEq(String.fromCodePoint(0x16e6b).toUpperCase().codePointAt(0), 0x16e4b);
-assertEq(String.fromCodePoint(0x16e6c).toUpperCase().codePointAt(0), 0x16e4c);
-assertEq(String.fromCodePoint(0x16e6d).toUpperCase().codePointAt(0), 0x16e4d);
-assertEq(String.fromCodePoint(0x16e6e).toUpperCase().codePointAt(0), 0x16e4e);
-assertEq(String.fromCodePoint(0x16e6f).toUpperCase().codePointAt(0), 0x16e4f);
-assertEq(String.fromCodePoint(0x16e70).toUpperCase().codePointAt(0), 0x16e50);
-assertEq(String.fromCodePoint(0x16e71).toUpperCase().codePointAt(0), 0x16e51);
-assertEq(String.fromCodePoint(0x16e72).toUpperCase().codePointAt(0), 0x16e52);
-assertEq(String.fromCodePoint(0x16e73).toUpperCase().codePointAt(0), 0x16e53);
-assertEq(String.fromCodePoint(0x16e74).toUpperCase().codePointAt(0), 0x16e54);
-assertEq(String.fromCodePoint(0x16e75).toUpperCase().codePointAt(0), 0x16e55);
-assertEq(String.fromCodePoint(0x16e76).toUpperCase().codePointAt(0), 0x16e56);
-assertEq(String.fromCodePoint(0x16e77).toUpperCase().codePointAt(0), 0x16e57);
-assertEq(String.fromCodePoint(0x16e78).toUpperCase().codePointAt(0), 0x16e58);
-assertEq(String.fromCodePoint(0x16e79).toUpperCase().codePointAt(0), 0x16e59);
-assertEq(String.fromCodePoint(0x16e7a).toUpperCase().codePointAt(0), 0x16e5a);
-assertEq(String.fromCodePoint(0x16e7b).toUpperCase().codePointAt(0), 0x16e5b);
-assertEq(String.fromCodePoint(0x16e7c).toUpperCase().codePointAt(0), 0x16e5c);
-assertEq(String.fromCodePoint(0x16e7d).toUpperCase().codePointAt(0), 0x16e5d);
-assertEq(String.fromCodePoint(0x16e7e).toUpperCase().codePointAt(0), 0x16e5e);
-assertEq(String.fromCodePoint(0x16e7f).toUpperCase().codePointAt(0), 0x16e5f);
-assertEq(String.fromCodePoint(0x1e922).toUpperCase().codePointAt(0), 0x1e900);
-assertEq(String.fromCodePoint(0x1e923).toUpperCase().codePointAt(0), 0x1e901);
-assertEq(String.fromCodePoint(0x1e924).toUpperCase().codePointAt(0), 0x1e902);
-assertEq(String.fromCodePoint(0x1e925).toUpperCase().codePointAt(0), 0x1e903);
-assertEq(String.fromCodePoint(0x1e926).toUpperCase().codePointAt(0), 0x1e904);
-assertEq(String.fromCodePoint(0x1e927).toUpperCase().codePointAt(0), 0x1e905);
-assertEq(String.fromCodePoint(0x1e928).toUpperCase().codePointAt(0), 0x1e906);
-assertEq(String.fromCodePoint(0x1e929).toUpperCase().codePointAt(0), 0x1e907);
-assertEq(String.fromCodePoint(0x1e92a).toUpperCase().codePointAt(0), 0x1e908);
-assertEq(String.fromCodePoint(0x1e92b).toUpperCase().codePointAt(0), 0x1e909);
-assertEq(String.fromCodePoint(0x1e92c).toUpperCase().codePointAt(0), 0x1e90a);
-assertEq(String.fromCodePoint(0x1e92d).toUpperCase().codePointAt(0), 0x1e90b);
-assertEq(String.fromCodePoint(0x1e92e).toUpperCase().codePointAt(0), 0x1e90c);
-assertEq(String.fromCodePoint(0x1e92f).toUpperCase().codePointAt(0), 0x1e90d);
-assertEq(String.fromCodePoint(0x1e930).toUpperCase().codePointAt(0), 0x1e90e);
-assertEq(String.fromCodePoint(0x1e931).toUpperCase().codePointAt(0), 0x1e90f);
-assertEq(String.fromCodePoint(0x1e932).toUpperCase().codePointAt(0), 0x1e910);
-assertEq(String.fromCodePoint(0x1e933).toUpperCase().codePointAt(0), 0x1e911);
-assertEq(String.fromCodePoint(0x1e934).toUpperCase().codePointAt(0), 0x1e912);
-assertEq(String.fromCodePoint(0x1e935).toUpperCase().codePointAt(0), 0x1e913);
-assertEq(String.fromCodePoint(0x1e936).toUpperCase().codePointAt(0), 0x1e914);
-assertEq(String.fromCodePoint(0x1e937).toUpperCase().codePointAt(0), 0x1e915);
-assertEq(String.fromCodePoint(0x1e938).toUpperCase().codePointAt(0), 0x1e916);
-assertEq(String.fromCodePoint(0x1e939).toUpperCase().codePointAt(0), 0x1e917);
-assertEq(String.fromCodePoint(0x1e93a).toUpperCase().codePointAt(0), 0x1e918);
-assertEq(String.fromCodePoint(0x1e93b).toUpperCase().codePointAt(0), 0x1e919);
-assertEq(String.fromCodePoint(0x1e93c).toUpperCase().codePointAt(0), 0x1e91a);
-assertEq(String.fromCodePoint(0x1e93d).toUpperCase().codePointAt(0), 0x1e91b);
-assertEq(String.fromCodePoint(0x1e93e).toUpperCase().codePointAt(0), 0x1e91c);
-assertEq(String.fromCodePoint(0x1e93f).toUpperCase().codePointAt(0), 0x1e91d);
-assertEq(String.fromCodePoint(0x1e940).toUpperCase().codePointAt(0), 0x1e91e);
-assertEq(String.fromCodePoint(0x1e941).toUpperCase().codePointAt(0), 0x1e91f);
-assertEq(String.fromCodePoint(0x1e942).toUpperCase().codePointAt(0), 0x1e920);
-assertEq(String.fromCodePoint(0x1e943).toUpperCase().codePointAt(0), 0x1e921);
-assertEq(String.fromCodePoint(0x10400).toLowerCase().codePointAt(0), 0x10428);
-assertEq(String.fromCodePoint(0x10401).toLowerCase().codePointAt(0), 0x10429);
-assertEq(String.fromCodePoint(0x10402).toLowerCase().codePointAt(0), 0x1042a);
-assertEq(String.fromCodePoint(0x10403).toLowerCase().codePointAt(0), 0x1042b);
-assertEq(String.fromCodePoint(0x10404).toLowerCase().codePointAt(0), 0x1042c);
-assertEq(String.fromCodePoint(0x10405).toLowerCase().codePointAt(0), 0x1042d);
-assertEq(String.fromCodePoint(0x10406).toLowerCase().codePointAt(0), 0x1042e);
-assertEq(String.fromCodePoint(0x10407).toLowerCase().codePointAt(0), 0x1042f);
-assertEq(String.fromCodePoint(0x10408).toLowerCase().codePointAt(0), 0x10430);
-assertEq(String.fromCodePoint(0x10409).toLowerCase().codePointAt(0), 0x10431);
-assertEq(String.fromCodePoint(0x1040a).toLowerCase().codePointAt(0), 0x10432);
-assertEq(String.fromCodePoint(0x1040b).toLowerCase().codePointAt(0), 0x10433);
-assertEq(String.fromCodePoint(0x1040c).toLowerCase().codePointAt(0), 0x10434);
-assertEq(String.fromCodePoint(0x1040d).toLowerCase().codePointAt(0), 0x10435);
-assertEq(String.fromCodePoint(0x1040e).toLowerCase().codePointAt(0), 0x10436);
-assertEq(String.fromCodePoint(0x1040f).toLowerCase().codePointAt(0), 0x10437);
-assertEq(String.fromCodePoint(0x10410).toLowerCase().codePointAt(0), 0x10438);
-assertEq(String.fromCodePoint(0x10411).toLowerCase().codePointAt(0), 0x10439);
-assertEq(String.fromCodePoint(0x10412).toLowerCase().codePointAt(0), 0x1043a);
-assertEq(String.fromCodePoint(0x10413).toLowerCase().codePointAt(0), 0x1043b);
-assertEq(String.fromCodePoint(0x10414).toLowerCase().codePointAt(0), 0x1043c);
-assertEq(String.fromCodePoint(0x10415).toLowerCase().codePointAt(0), 0x1043d);
-assertEq(String.fromCodePoint(0x10416).toLowerCase().codePointAt(0), 0x1043e);
-assertEq(String.fromCodePoint(0x10417).toLowerCase().codePointAt(0), 0x1043f);
-assertEq(String.fromCodePoint(0x10418).toLowerCase().codePointAt(0), 0x10440);
-assertEq(String.fromCodePoint(0x10419).toLowerCase().codePointAt(0), 0x10441);
-assertEq(String.fromCodePoint(0x1041a).toLowerCase().codePointAt(0), 0x10442);
-assertEq(String.fromCodePoint(0x1041b).toLowerCase().codePointAt(0), 0x10443);
-assertEq(String.fromCodePoint(0x1041c).toLowerCase().codePointAt(0), 0x10444);
-assertEq(String.fromCodePoint(0x1041d).toLowerCase().codePointAt(0), 0x10445);
-assertEq(String.fromCodePoint(0x1041e).toLowerCase().codePointAt(0), 0x10446);
-assertEq(String.fromCodePoint(0x1041f).toLowerCase().codePointAt(0), 0x10447);
-assertEq(String.fromCodePoint(0x10420).toLowerCase().codePointAt(0), 0x10448);
-assertEq(String.fromCodePoint(0x10421).toLowerCase().codePointAt(0), 0x10449);
-assertEq(String.fromCodePoint(0x10422).toLowerCase().codePointAt(0), 0x1044a);
-assertEq(String.fromCodePoint(0x10423).toLowerCase().codePointAt(0), 0x1044b);
-assertEq(String.fromCodePoint(0x10424).toLowerCase().codePointAt(0), 0x1044c);
-assertEq(String.fromCodePoint(0x10425).toLowerCase().codePointAt(0), 0x1044d);
-assertEq(String.fromCodePoint(0x10426).toLowerCase().codePointAt(0), 0x1044e);
-assertEq(String.fromCodePoint(0x10427).toLowerCase().codePointAt(0), 0x1044f);
-assertEq(String.fromCodePoint(0x104b0).toLowerCase().codePointAt(0), 0x104d8);
-assertEq(String.fromCodePoint(0x104b1).toLowerCase().codePointAt(0), 0x104d9);
-assertEq(String.fromCodePoint(0x104b2).toLowerCase().codePointAt(0), 0x104da);
-assertEq(String.fromCodePoint(0x104b3).toLowerCase().codePointAt(0), 0x104db);
-assertEq(String.fromCodePoint(0x104b4).toLowerCase().codePointAt(0), 0x104dc);
-assertEq(String.fromCodePoint(0x104b5).toLowerCase().codePointAt(0), 0x104dd);
-assertEq(String.fromCodePoint(0x104b6).toLowerCase().codePointAt(0), 0x104de);
-assertEq(String.fromCodePoint(0x104b7).toLowerCase().codePointAt(0), 0x104df);
-assertEq(String.fromCodePoint(0x104b8).toLowerCase().codePointAt(0), 0x104e0);
-assertEq(String.fromCodePoint(0x104b9).toLowerCase().codePointAt(0), 0x104e1);
-assertEq(String.fromCodePoint(0x104ba).toLowerCase().codePointAt(0), 0x104e2);
-assertEq(String.fromCodePoint(0x104bb).toLowerCase().codePointAt(0), 0x104e3);
-assertEq(String.fromCodePoint(0x104bc).toLowerCase().codePointAt(0), 0x104e4);
-assertEq(String.fromCodePoint(0x104bd).toLowerCase().codePointAt(0), 0x104e5);
-assertEq(String.fromCodePoint(0x104be).toLowerCase().codePointAt(0), 0x104e6);
-assertEq(String.fromCodePoint(0x104bf).toLowerCase().codePointAt(0), 0x104e7);
-assertEq(String.fromCodePoint(0x104c0).toLowerCase().codePointAt(0), 0x104e8);
-assertEq(String.fromCodePoint(0x104c1).toLowerCase().codePointAt(0), 0x104e9);
-assertEq(String.fromCodePoint(0x104c2).toLowerCase().codePointAt(0), 0x104ea);
-assertEq(String.fromCodePoint(0x104c3).toLowerCase().codePointAt(0), 0x104eb);
-assertEq(String.fromCodePoint(0x104c4).toLowerCase().codePointAt(0), 0x104ec);
-assertEq(String.fromCodePoint(0x104c5).toLowerCase().codePointAt(0), 0x104ed);
-assertEq(String.fromCodePoint(0x104c6).toLowerCase().codePointAt(0), 0x104ee);
-assertEq(String.fromCodePoint(0x104c7).toLowerCase().codePointAt(0), 0x104ef);
-assertEq(String.fromCodePoint(0x104c8).toLowerCase().codePointAt(0), 0x104f0);
-assertEq(String.fromCodePoint(0x104c9).toLowerCase().codePointAt(0), 0x104f1);
-assertEq(String.fromCodePoint(0x104ca).toLowerCase().codePointAt(0), 0x104f2);
-assertEq(String.fromCodePoint(0x104cb).toLowerCase().codePointAt(0), 0x104f3);
-assertEq(String.fromCodePoint(0x104cc).toLowerCase().codePointAt(0), 0x104f4);
-assertEq(String.fromCodePoint(0x104cd).toLowerCase().codePointAt(0), 0x104f5);
-assertEq(String.fromCodePoint(0x104ce).toLowerCase().codePointAt(0), 0x104f6);
-assertEq(String.fromCodePoint(0x104cf).toLowerCase().codePointAt(0), 0x104f7);
-assertEq(String.fromCodePoint(0x104d0).toLowerCase().codePointAt(0), 0x104f8);
-assertEq(String.fromCodePoint(0x104d1).toLowerCase().codePointAt(0), 0x104f9);
-assertEq(String.fromCodePoint(0x104d2).toLowerCase().codePointAt(0), 0x104fa);
-assertEq(String.fromCodePoint(0x104d3).toLowerCase().codePointAt(0), 0x104fb);
-assertEq(String.fromCodePoint(0x10c80).toLowerCase().codePointAt(0), 0x10cc0);
-assertEq(String.fromCodePoint(0x10c81).toLowerCase().codePointAt(0), 0x10cc1);
-assertEq(String.fromCodePoint(0x10c82).toLowerCase().codePointAt(0), 0x10cc2);
-assertEq(String.fromCodePoint(0x10c83).toLowerCase().codePointAt(0), 0x10cc3);
-assertEq(String.fromCodePoint(0x10c84).toLowerCase().codePointAt(0), 0x10cc4);
-assertEq(String.fromCodePoint(0x10c85).toLowerCase().codePointAt(0), 0x10cc5);
-assertEq(String.fromCodePoint(0x10c86).toLowerCase().codePointAt(0), 0x10cc6);
-assertEq(String.fromCodePoint(0x10c87).toLowerCase().codePointAt(0), 0x10cc7);
-assertEq(String.fromCodePoint(0x10c88).toLowerCase().codePointAt(0), 0x10cc8);
-assertEq(String.fromCodePoint(0x10c89).toLowerCase().codePointAt(0), 0x10cc9);
-assertEq(String.fromCodePoint(0x10c8a).toLowerCase().codePointAt(0), 0x10cca);
-assertEq(String.fromCodePoint(0x10c8b).toLowerCase().codePointAt(0), 0x10ccb);
-assertEq(String.fromCodePoint(0x10c8c).toLowerCase().codePointAt(0), 0x10ccc);
-assertEq(String.fromCodePoint(0x10c8d).toLowerCase().codePointAt(0), 0x10ccd);
-assertEq(String.fromCodePoint(0x10c8e).toLowerCase().codePointAt(0), 0x10cce);
-assertEq(String.fromCodePoint(0x10c8f).toLowerCase().codePointAt(0), 0x10ccf);
-assertEq(String.fromCodePoint(0x10c90).toLowerCase().codePointAt(0), 0x10cd0);
-assertEq(String.fromCodePoint(0x10c91).toLowerCase().codePointAt(0), 0x10cd1);
-assertEq(String.fromCodePoint(0x10c92).toLowerCase().codePointAt(0), 0x10cd2);
-assertEq(String.fromCodePoint(0x10c93).toLowerCase().codePointAt(0), 0x10cd3);
-assertEq(String.fromCodePoint(0x10c94).toLowerCase().codePointAt(0), 0x10cd4);
-assertEq(String.fromCodePoint(0x10c95).toLowerCase().codePointAt(0), 0x10cd5);
-assertEq(String.fromCodePoint(0x10c96).toLowerCase().codePointAt(0), 0x10cd6);
-assertEq(String.fromCodePoint(0x10c97).toLowerCase().codePointAt(0), 0x10cd7);
-assertEq(String.fromCodePoint(0x10c98).toLowerCase().codePointAt(0), 0x10cd8);
-assertEq(String.fromCodePoint(0x10c99).toLowerCase().codePointAt(0), 0x10cd9);
-assertEq(String.fromCodePoint(0x10c9a).toLowerCase().codePointAt(0), 0x10cda);
-assertEq(String.fromCodePoint(0x10c9b).toLowerCase().codePointAt(0), 0x10cdb);
-assertEq(String.fromCodePoint(0x10c9c).toLowerCase().codePointAt(0), 0x10cdc);
-assertEq(String.fromCodePoint(0x10c9d).toLowerCase().codePointAt(0), 0x10cdd);
-assertEq(String.fromCodePoint(0x10c9e).toLowerCase().codePointAt(0), 0x10cde);
-assertEq(String.fromCodePoint(0x10c9f).toLowerCase().codePointAt(0), 0x10cdf);
-assertEq(String.fromCodePoint(0x10ca0).toLowerCase().codePointAt(0), 0x10ce0);
-assertEq(String.fromCodePoint(0x10ca1).toLowerCase().codePointAt(0), 0x10ce1);
-assertEq(String.fromCodePoint(0x10ca2).toLowerCase().codePointAt(0), 0x10ce2);
-assertEq(String.fromCodePoint(0x10ca3).toLowerCase().codePointAt(0), 0x10ce3);
-assertEq(String.fromCodePoint(0x10ca4).toLowerCase().codePointAt(0), 0x10ce4);
-assertEq(String.fromCodePoint(0x10ca5).toLowerCase().codePointAt(0), 0x10ce5);
-assertEq(String.fromCodePoint(0x10ca6).toLowerCase().codePointAt(0), 0x10ce6);
-assertEq(String.fromCodePoint(0x10ca7).toLowerCase().codePointAt(0), 0x10ce7);
-assertEq(String.fromCodePoint(0x10ca8).toLowerCase().codePointAt(0), 0x10ce8);
-assertEq(String.fromCodePoint(0x10ca9).toLowerCase().codePointAt(0), 0x10ce9);
-assertEq(String.fromCodePoint(0x10caa).toLowerCase().codePointAt(0), 0x10cea);
-assertEq(String.fromCodePoint(0x10cab).toLowerCase().codePointAt(0), 0x10ceb);
-assertEq(String.fromCodePoint(0x10cac).toLowerCase().codePointAt(0), 0x10cec);
-assertEq(String.fromCodePoint(0x10cad).toLowerCase().codePointAt(0), 0x10ced);
-assertEq(String.fromCodePoint(0x10cae).toLowerCase().codePointAt(0), 0x10cee);
-assertEq(String.fromCodePoint(0x10caf).toLowerCase().codePointAt(0), 0x10cef);
-assertEq(String.fromCodePoint(0x10cb0).toLowerCase().codePointAt(0), 0x10cf0);
-assertEq(String.fromCodePoint(0x10cb1).toLowerCase().codePointAt(0), 0x10cf1);
-assertEq(String.fromCodePoint(0x10cb2).toLowerCase().codePointAt(0), 0x10cf2);
-assertEq(String.fromCodePoint(0x118a0).toLowerCase().codePointAt(0), 0x118c0);
-assertEq(String.fromCodePoint(0x118a1).toLowerCase().codePointAt(0), 0x118c1);
-assertEq(String.fromCodePoint(0x118a2).toLowerCase().codePointAt(0), 0x118c2);
-assertEq(String.fromCodePoint(0x118a3).toLowerCase().codePointAt(0), 0x118c3);
-assertEq(String.fromCodePoint(0x118a4).toLowerCase().codePointAt(0), 0x118c4);
-assertEq(String.fromCodePoint(0x118a5).toLowerCase().codePointAt(0), 0x118c5);
-assertEq(String.fromCodePoint(0x118a6).toLowerCase().codePointAt(0), 0x118c6);
-assertEq(String.fromCodePoint(0x118a7).toLowerCase().codePointAt(0), 0x118c7);
-assertEq(String.fromCodePoint(0x118a8).toLowerCase().codePointAt(0), 0x118c8);
-assertEq(String.fromCodePoint(0x118a9).toLowerCase().codePointAt(0), 0x118c9);
-assertEq(String.fromCodePoint(0x118aa).toLowerCase().codePointAt(0), 0x118ca);
-assertEq(String.fromCodePoint(0x118ab).toLowerCase().codePointAt(0), 0x118cb);
-assertEq(String.fromCodePoint(0x118ac).toLowerCase().codePointAt(0), 0x118cc);
-assertEq(String.fromCodePoint(0x118ad).toLowerCase().codePointAt(0), 0x118cd);
-assertEq(String.fromCodePoint(0x118ae).toLowerCase().codePointAt(0), 0x118ce);
-assertEq(String.fromCodePoint(0x118af).toLowerCase().codePointAt(0), 0x118cf);
-assertEq(String.fromCodePoint(0x118b0).toLowerCase().codePointAt(0), 0x118d0);
-assertEq(String.fromCodePoint(0x118b1).toLowerCase().codePointAt(0), 0x118d1);
-assertEq(String.fromCodePoint(0x118b2).toLowerCase().codePointAt(0), 0x118d2);
-assertEq(String.fromCodePoint(0x118b3).toLowerCase().codePointAt(0), 0x118d3);
-assertEq(String.fromCodePoint(0x118b4).toLowerCase().codePointAt(0), 0x118d4);
-assertEq(String.fromCodePoint(0x118b5).toLowerCase().codePointAt(0), 0x118d5);
-assertEq(String.fromCodePoint(0x118b6).toLowerCase().codePointAt(0), 0x118d6);
-assertEq(String.fromCodePoint(0x118b7).toLowerCase().codePointAt(0), 0x118d7);
-assertEq(String.fromCodePoint(0x118b8).toLowerCase().codePointAt(0), 0x118d8);
-assertEq(String.fromCodePoint(0x118b9).toLowerCase().codePointAt(0), 0x118d9);
-assertEq(String.fromCodePoint(0x118ba).toLowerCase().codePointAt(0), 0x118da);
-assertEq(String.fromCodePoint(0x118bb).toLowerCase().codePointAt(0), 0x118db);
-assertEq(String.fromCodePoint(0x118bc).toLowerCase().codePointAt(0), 0x118dc);
-assertEq(String.fromCodePoint(0x118bd).toLowerCase().codePointAt(0), 0x118dd);
-assertEq(String.fromCodePoint(0x118be).toLowerCase().codePointAt(0), 0x118de);
-assertEq(String.fromCodePoint(0x118bf).toLowerCase().codePointAt(0), 0x118df);
-assertEq(String.fromCodePoint(0x16e40).toLowerCase().codePointAt(0), 0x16e60);
-assertEq(String.fromCodePoint(0x16e41).toLowerCase().codePointAt(0), 0x16e61);
-assertEq(String.fromCodePoint(0x16e42).toLowerCase().codePointAt(0), 0x16e62);
-assertEq(String.fromCodePoint(0x16e43).toLowerCase().codePointAt(0), 0x16e63);
-assertEq(String.fromCodePoint(0x16e44).toLowerCase().codePointAt(0), 0x16e64);
-assertEq(String.fromCodePoint(0x16e45).toLowerCase().codePointAt(0), 0x16e65);
-assertEq(String.fromCodePoint(0x16e46).toLowerCase().codePointAt(0), 0x16e66);
-assertEq(String.fromCodePoint(0x16e47).toLowerCase().codePointAt(0), 0x16e67);
-assertEq(String.fromCodePoint(0x16e48).toLowerCase().codePointAt(0), 0x16e68);
-assertEq(String.fromCodePoint(0x16e49).toLowerCase().codePointAt(0), 0x16e69);
-assertEq(String.fromCodePoint(0x16e4a).toLowerCase().codePointAt(0), 0x16e6a);
-assertEq(String.fromCodePoint(0x16e4b).toLowerCase().codePointAt(0), 0x16e6b);
-assertEq(String.fromCodePoint(0x16e4c).toLowerCase().codePointAt(0), 0x16e6c);
-assertEq(String.fromCodePoint(0x16e4d).toLowerCase().codePointAt(0), 0x16e6d);
-assertEq(String.fromCodePoint(0x16e4e).toLowerCase().codePointAt(0), 0x16e6e);
-assertEq(String.fromCodePoint(0x16e4f).toLowerCase().codePointAt(0), 0x16e6f);
-assertEq(String.fromCodePoint(0x16e50).toLowerCase().codePointAt(0), 0x16e70);
-assertEq(String.fromCodePoint(0x16e51).toLowerCase().codePointAt(0), 0x16e71);
-assertEq(String.fromCodePoint(0x16e52).toLowerCase().codePointAt(0), 0x16e72);
-assertEq(String.fromCodePoint(0x16e53).toLowerCase().codePointAt(0), 0x16e73);
-assertEq(String.fromCodePoint(0x16e54).toLowerCase().codePointAt(0), 0x16e74);
-assertEq(String.fromCodePoint(0x16e55).toLowerCase().codePointAt(0), 0x16e75);
-assertEq(String.fromCodePoint(0x16e56).toLowerCase().codePointAt(0), 0x16e76);
-assertEq(String.fromCodePoint(0x16e57).toLowerCase().codePointAt(0), 0x16e77);
-assertEq(String.fromCodePoint(0x16e58).toLowerCase().codePointAt(0), 0x16e78);
-assertEq(String.fromCodePoint(0x16e59).toLowerCase().codePointAt(0), 0x16e79);
-assertEq(String.fromCodePoint(0x16e5a).toLowerCase().codePointAt(0), 0x16e7a);
-assertEq(String.fromCodePoint(0x16e5b).toLowerCase().codePointAt(0), 0x16e7b);
-assertEq(String.fromCodePoint(0x16e5c).toLowerCase().codePointAt(0), 0x16e7c);
-assertEq(String.fromCodePoint(0x16e5d).toLowerCase().codePointAt(0), 0x16e7d);
-assertEq(String.fromCodePoint(0x16e5e).toLowerCase().codePointAt(0), 0x16e7e);
-assertEq(String.fromCodePoint(0x16e5f).toLowerCase().codePointAt(0), 0x16e7f);
-assertEq(String.fromCodePoint(0x1e900).toLowerCase().codePointAt(0), 0x1e922);
-assertEq(String.fromCodePoint(0x1e901).toLowerCase().codePointAt(0), 0x1e923);
-assertEq(String.fromCodePoint(0x1e902).toLowerCase().codePointAt(0), 0x1e924);
-assertEq(String.fromCodePoint(0x1e903).toLowerCase().codePointAt(0), 0x1e925);
-assertEq(String.fromCodePoint(0x1e904).toLowerCase().codePointAt(0), 0x1e926);
-assertEq(String.fromCodePoint(0x1e905).toLowerCase().codePointAt(0), 0x1e927);
-assertEq(String.fromCodePoint(0x1e906).toLowerCase().codePointAt(0), 0x1e928);
-assertEq(String.fromCodePoint(0x1e907).toLowerCase().codePointAt(0), 0x1e929);
-assertEq(String.fromCodePoint(0x1e908).toLowerCase().codePointAt(0), 0x1e92a);
-assertEq(String.fromCodePoint(0x1e909).toLowerCase().codePointAt(0), 0x1e92b);
-assertEq(String.fromCodePoint(0x1e90a).toLowerCase().codePointAt(0), 0x1e92c);
-assertEq(String.fromCodePoint(0x1e90b).toLowerCase().codePointAt(0), 0x1e92d);
-assertEq(String.fromCodePoint(0x1e90c).toLowerCase().codePointAt(0), 0x1e92e);
-assertEq(String.fromCodePoint(0x1e90d).toLowerCase().codePointAt(0), 0x1e92f);
-assertEq(String.fromCodePoint(0x1e90e).toLowerCase().codePointAt(0), 0x1e930);
-assertEq(String.fromCodePoint(0x1e90f).toLowerCase().codePointAt(0), 0x1e931);
-assertEq(String.fromCodePoint(0x1e910).toLowerCase().codePointAt(0), 0x1e932);
-assertEq(String.fromCodePoint(0x1e911).toLowerCase().codePointAt(0), 0x1e933);
-assertEq(String.fromCodePoint(0x1e912).toLowerCase().codePointAt(0), 0x1e934);
-assertEq(String.fromCodePoint(0x1e913).toLowerCase().codePointAt(0), 0x1e935);
-assertEq(String.fromCodePoint(0x1e914).toLowerCase().codePointAt(0), 0x1e936);
-assertEq(String.fromCodePoint(0x1e915).toLowerCase().codePointAt(0), 0x1e937);
-assertEq(String.fromCodePoint(0x1e916).toLowerCase().codePointAt(0), 0x1e938);
-assertEq(String.fromCodePoint(0x1e917).toLowerCase().codePointAt(0), 0x1e939);
-assertEq(String.fromCodePoint(0x1e918).toLowerCase().codePointAt(0), 0x1e93a);
-assertEq(String.fromCodePoint(0x1e919).toLowerCase().codePointAt(0), 0x1e93b);
-assertEq(String.fromCodePoint(0x1e91a).toLowerCase().codePointAt(0), 0x1e93c);
-assertEq(String.fromCodePoint(0x1e91b).toLowerCase().codePointAt(0), 0x1e93d);
-assertEq(String.fromCodePoint(0x1e91c).toLowerCase().codePointAt(0), 0x1e93e);
-assertEq(String.fromCodePoint(0x1e91d).toLowerCase().codePointAt(0), 0x1e93f);
-assertEq(String.fromCodePoint(0x1e91e).toLowerCase().codePointAt(0), 0x1e940);
-assertEq(String.fromCodePoint(0x1e91f).toLowerCase().codePointAt(0), 0x1e941);
-assertEq(String.fromCodePoint(0x1e920).toLowerCase().codePointAt(0), 0x1e942);
-assertEq(String.fromCodePoint(0x1e921).toLowerCase().codePointAt(0), 0x1e943);
+assertEq(String.fromCodePoint(0x10428).toUpperCase().codePointAt(0), 0x10400); // DESERET SMALL LETTER LONG I, DESERET CAPITAL LETTER LONG I
+assertEq(String.fromCodePoint(0x10429).toUpperCase().codePointAt(0), 0x10401); // DESERET SMALL LETTER LONG E, DESERET CAPITAL LETTER LONG E
+assertEq(String.fromCodePoint(0x1042A).toUpperCase().codePointAt(0), 0x10402); // DESERET SMALL LETTER LONG A, DESERET CAPITAL LETTER LONG A
+assertEq(String.fromCodePoint(0x1042B).toUpperCase().codePointAt(0), 0x10403); // DESERET SMALL LETTER LONG AH, DESERET CAPITAL LETTER LONG AH
+assertEq(String.fromCodePoint(0x1042C).toUpperCase().codePointAt(0), 0x10404); // DESERET SMALL LETTER LONG O, DESERET CAPITAL LETTER LONG O
+assertEq(String.fromCodePoint(0x1042D).toUpperCase().codePointAt(0), 0x10405); // DESERET SMALL LETTER LONG OO, DESERET CAPITAL LETTER LONG OO
+assertEq(String.fromCodePoint(0x1042E).toUpperCase().codePointAt(0), 0x10406); // DESERET SMALL LETTER SHORT I, DESERET CAPITAL LETTER SHORT I
+assertEq(String.fromCodePoint(0x1042F).toUpperCase().codePointAt(0), 0x10407); // DESERET SMALL LETTER SHORT E, DESERET CAPITAL LETTER SHORT E
+assertEq(String.fromCodePoint(0x10430).toUpperCase().codePointAt(0), 0x10408); // DESERET SMALL LETTER SHORT A, DESERET CAPITAL LETTER SHORT A
+assertEq(String.fromCodePoint(0x10431).toUpperCase().codePointAt(0), 0x10409); // DESERET SMALL LETTER SHORT AH, DESERET CAPITAL LETTER SHORT AH
+assertEq(String.fromCodePoint(0x10432).toUpperCase().codePointAt(0), 0x1040A); // DESERET SMALL LETTER SHORT O, DESERET CAPITAL LETTER SHORT O
+assertEq(String.fromCodePoint(0x10433).toUpperCase().codePointAt(0), 0x1040B); // DESERET SMALL LETTER SHORT OO, DESERET CAPITAL LETTER SHORT OO
+assertEq(String.fromCodePoint(0x10434).toUpperCase().codePointAt(0), 0x1040C); // DESERET SMALL LETTER AY, DESERET CAPITAL LETTER AY
+assertEq(String.fromCodePoint(0x10435).toUpperCase().codePointAt(0), 0x1040D); // DESERET SMALL LETTER OW, DESERET CAPITAL LETTER OW
+assertEq(String.fromCodePoint(0x10436).toUpperCase().codePointAt(0), 0x1040E); // DESERET SMALL LETTER WU, DESERET CAPITAL LETTER WU
+assertEq(String.fromCodePoint(0x10437).toUpperCase().codePointAt(0), 0x1040F); // DESERET SMALL LETTER YEE, DESERET CAPITAL LETTER YEE
+assertEq(String.fromCodePoint(0x10438).toUpperCase().codePointAt(0), 0x10410); // DESERET SMALL LETTER H, DESERET CAPITAL LETTER H
+assertEq(String.fromCodePoint(0x10439).toUpperCase().codePointAt(0), 0x10411); // DESERET SMALL LETTER PEE, DESERET CAPITAL LETTER PEE
+assertEq(String.fromCodePoint(0x1043A).toUpperCase().codePointAt(0), 0x10412); // DESERET SMALL LETTER BEE, DESERET CAPITAL LETTER BEE
+assertEq(String.fromCodePoint(0x1043B).toUpperCase().codePointAt(0), 0x10413); // DESERET SMALL LETTER TEE, DESERET CAPITAL LETTER TEE
+assertEq(String.fromCodePoint(0x1043C).toUpperCase().codePointAt(0), 0x10414); // DESERET SMALL LETTER DEE, DESERET CAPITAL LETTER DEE
+assertEq(String.fromCodePoint(0x1043D).toUpperCase().codePointAt(0), 0x10415); // DESERET SMALL LETTER CHEE, DESERET CAPITAL LETTER CHEE
+assertEq(String.fromCodePoint(0x1043E).toUpperCase().codePointAt(0), 0x10416); // DESERET SMALL LETTER JEE, DESERET CAPITAL LETTER JEE
+assertEq(String.fromCodePoint(0x1043F).toUpperCase().codePointAt(0), 0x10417); // DESERET SMALL LETTER KAY, DESERET CAPITAL LETTER KAY
+assertEq(String.fromCodePoint(0x10440).toUpperCase().codePointAt(0), 0x10418); // DESERET SMALL LETTER GAY, DESERET CAPITAL LETTER GAY
+assertEq(String.fromCodePoint(0x10441).toUpperCase().codePointAt(0), 0x10419); // DESERET SMALL LETTER EF, DESERET CAPITAL LETTER EF
+assertEq(String.fromCodePoint(0x10442).toUpperCase().codePointAt(0), 0x1041A); // DESERET SMALL LETTER VEE, DESERET CAPITAL LETTER VEE
+assertEq(String.fromCodePoint(0x10443).toUpperCase().codePointAt(0), 0x1041B); // DESERET SMALL LETTER ETH, DESERET CAPITAL LETTER ETH
+assertEq(String.fromCodePoint(0x10444).toUpperCase().codePointAt(0), 0x1041C); // DESERET SMALL LETTER THEE, DESERET CAPITAL LETTER THEE
+assertEq(String.fromCodePoint(0x10445).toUpperCase().codePointAt(0), 0x1041D); // DESERET SMALL LETTER ES, DESERET CAPITAL LETTER ES
+assertEq(String.fromCodePoint(0x10446).toUpperCase().codePointAt(0), 0x1041E); // DESERET SMALL LETTER ZEE, DESERET CAPITAL LETTER ZEE
+assertEq(String.fromCodePoint(0x10447).toUpperCase().codePointAt(0), 0x1041F); // DESERET SMALL LETTER ESH, DESERET CAPITAL LETTER ESH
+assertEq(String.fromCodePoint(0x10448).toUpperCase().codePointAt(0), 0x10420); // DESERET SMALL LETTER ZHEE, DESERET CAPITAL LETTER ZHEE
+assertEq(String.fromCodePoint(0x10449).toUpperCase().codePointAt(0), 0x10421); // DESERET SMALL LETTER ER, DESERET CAPITAL LETTER ER
+assertEq(String.fromCodePoint(0x1044A).toUpperCase().codePointAt(0), 0x10422); // DESERET SMALL LETTER EL, DESERET CAPITAL LETTER EL
+assertEq(String.fromCodePoint(0x1044B).toUpperCase().codePointAt(0), 0x10423); // DESERET SMALL LETTER EM, DESERET CAPITAL LETTER EM
+assertEq(String.fromCodePoint(0x1044C).toUpperCase().codePointAt(0), 0x10424); // DESERET SMALL LETTER EN, DESERET CAPITAL LETTER EN
+assertEq(String.fromCodePoint(0x1044D).toUpperCase().codePointAt(0), 0x10425); // DESERET SMALL LETTER ENG, DESERET CAPITAL LETTER ENG
+assertEq(String.fromCodePoint(0x1044E).toUpperCase().codePointAt(0), 0x10426); // DESERET SMALL LETTER OI, DESERET CAPITAL LETTER OI
+assertEq(String.fromCodePoint(0x1044F).toUpperCase().codePointAt(0), 0x10427); // DESERET SMALL LETTER EW, DESERET CAPITAL LETTER EW
+assertEq(String.fromCodePoint(0x104D8).toUpperCase().codePointAt(0), 0x104B0); // OSAGE SMALL LETTER A, OSAGE CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x104D9).toUpperCase().codePointAt(0), 0x104B1); // OSAGE SMALL LETTER AI, OSAGE CAPITAL LETTER AI
+assertEq(String.fromCodePoint(0x104DA).toUpperCase().codePointAt(0), 0x104B2); // OSAGE SMALL LETTER AIN, OSAGE CAPITAL LETTER AIN
+assertEq(String.fromCodePoint(0x104DB).toUpperCase().codePointAt(0), 0x104B3); // OSAGE SMALL LETTER AH, OSAGE CAPITAL LETTER AH
+assertEq(String.fromCodePoint(0x104DC).toUpperCase().codePointAt(0), 0x104B4); // OSAGE SMALL LETTER BRA, OSAGE CAPITAL LETTER BRA
+assertEq(String.fromCodePoint(0x104DD).toUpperCase().codePointAt(0), 0x104B5); // OSAGE SMALL LETTER CHA, OSAGE CAPITAL LETTER CHA
+assertEq(String.fromCodePoint(0x104DE).toUpperCase().codePointAt(0), 0x104B6); // OSAGE SMALL LETTER EHCHA, OSAGE CAPITAL LETTER EHCHA
+assertEq(String.fromCodePoint(0x104DF).toUpperCase().codePointAt(0), 0x104B7); // OSAGE SMALL LETTER E, OSAGE CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x104E0).toUpperCase().codePointAt(0), 0x104B8); // OSAGE SMALL LETTER EIN, OSAGE CAPITAL LETTER EIN
+assertEq(String.fromCodePoint(0x104E1).toUpperCase().codePointAt(0), 0x104B9); // OSAGE SMALL LETTER HA, OSAGE CAPITAL LETTER HA
+assertEq(String.fromCodePoint(0x104E2).toUpperCase().codePointAt(0), 0x104BA); // OSAGE SMALL LETTER HYA, OSAGE CAPITAL LETTER HYA
+assertEq(String.fromCodePoint(0x104E3).toUpperCase().codePointAt(0), 0x104BB); // OSAGE SMALL LETTER I, OSAGE CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x104E4).toUpperCase().codePointAt(0), 0x104BC); // OSAGE SMALL LETTER KA, OSAGE CAPITAL LETTER KA
+assertEq(String.fromCodePoint(0x104E5).toUpperCase().codePointAt(0), 0x104BD); // OSAGE SMALL LETTER EHKA, OSAGE CAPITAL LETTER EHKA
+assertEq(String.fromCodePoint(0x104E6).toUpperCase().codePointAt(0), 0x104BE); // OSAGE SMALL LETTER KYA, OSAGE CAPITAL LETTER KYA
+assertEq(String.fromCodePoint(0x104E7).toUpperCase().codePointAt(0), 0x104BF); // OSAGE SMALL LETTER LA, OSAGE CAPITAL LETTER LA
+assertEq(String.fromCodePoint(0x104E8).toUpperCase().codePointAt(0), 0x104C0); // OSAGE SMALL LETTER MA, OSAGE CAPITAL LETTER MA
+assertEq(String.fromCodePoint(0x104E9).toUpperCase().codePointAt(0), 0x104C1); // OSAGE SMALL LETTER NA, OSAGE CAPITAL LETTER NA
+assertEq(String.fromCodePoint(0x104EA).toUpperCase().codePointAt(0), 0x104C2); // OSAGE SMALL LETTER O, OSAGE CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x104EB).toUpperCase().codePointAt(0), 0x104C3); // OSAGE SMALL LETTER OIN, OSAGE CAPITAL LETTER OIN
+assertEq(String.fromCodePoint(0x104EC).toUpperCase().codePointAt(0), 0x104C4); // OSAGE SMALL LETTER PA, OSAGE CAPITAL LETTER PA
+assertEq(String.fromCodePoint(0x104ED).toUpperCase().codePointAt(0), 0x104C5); // OSAGE SMALL LETTER EHPA, OSAGE CAPITAL LETTER EHPA
+assertEq(String.fromCodePoint(0x104EE).toUpperCase().codePointAt(0), 0x104C6); // OSAGE SMALL LETTER SA, OSAGE CAPITAL LETTER SA
+assertEq(String.fromCodePoint(0x104EF).toUpperCase().codePointAt(0), 0x104C7); // OSAGE SMALL LETTER SHA, OSAGE CAPITAL LETTER SHA
+assertEq(String.fromCodePoint(0x104F0).toUpperCase().codePointAt(0), 0x104C8); // OSAGE SMALL LETTER TA, OSAGE CAPITAL LETTER TA
+assertEq(String.fromCodePoint(0x104F1).toUpperCase().codePointAt(0), 0x104C9); // OSAGE SMALL LETTER EHTA, OSAGE CAPITAL LETTER EHTA
+assertEq(String.fromCodePoint(0x104F2).toUpperCase().codePointAt(0), 0x104CA); // OSAGE SMALL LETTER TSA, OSAGE CAPITAL LETTER TSA
+assertEq(String.fromCodePoint(0x104F3).toUpperCase().codePointAt(0), 0x104CB); // OSAGE SMALL LETTER EHTSA, OSAGE CAPITAL LETTER EHTSA
+assertEq(String.fromCodePoint(0x104F4).toUpperCase().codePointAt(0), 0x104CC); // OSAGE SMALL LETTER TSHA, OSAGE CAPITAL LETTER TSHA
+assertEq(String.fromCodePoint(0x104F5).toUpperCase().codePointAt(0), 0x104CD); // OSAGE SMALL LETTER DHA, OSAGE CAPITAL LETTER DHA
+assertEq(String.fromCodePoint(0x104F6).toUpperCase().codePointAt(0), 0x104CE); // OSAGE SMALL LETTER U, OSAGE CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x104F7).toUpperCase().codePointAt(0), 0x104CF); // OSAGE SMALL LETTER WA, OSAGE CAPITAL LETTER WA
+assertEq(String.fromCodePoint(0x104F8).toUpperCase().codePointAt(0), 0x104D0); // OSAGE SMALL LETTER KHA, OSAGE CAPITAL LETTER KHA
+assertEq(String.fromCodePoint(0x104F9).toUpperCase().codePointAt(0), 0x104D1); // OSAGE SMALL LETTER GHA, OSAGE CAPITAL LETTER GHA
+assertEq(String.fromCodePoint(0x104FA).toUpperCase().codePointAt(0), 0x104D2); // OSAGE SMALL LETTER ZA, OSAGE CAPITAL LETTER ZA
+assertEq(String.fromCodePoint(0x104FB).toUpperCase().codePointAt(0), 0x104D3); // OSAGE SMALL LETTER ZHA, OSAGE CAPITAL LETTER ZHA
+assertEq(String.fromCodePoint(0x10CC0).toUpperCase().codePointAt(0), 0x10C80); // OLD HUNGARIAN SMALL LETTER A, OLD HUNGARIAN CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x10CC1).toUpperCase().codePointAt(0), 0x10C81); // OLD HUNGARIAN SMALL LETTER AA, OLD HUNGARIAN CAPITAL LETTER AA
+assertEq(String.fromCodePoint(0x10CC2).toUpperCase().codePointAt(0), 0x10C82); // OLD HUNGARIAN SMALL LETTER EB, OLD HUNGARIAN CAPITAL LETTER EB
+assertEq(String.fromCodePoint(0x10CC3).toUpperCase().codePointAt(0), 0x10C83); // OLD HUNGARIAN SMALL LETTER AMB, OLD HUNGARIAN CAPITAL LETTER AMB
+assertEq(String.fromCodePoint(0x10CC4).toUpperCase().codePointAt(0), 0x10C84); // OLD HUNGARIAN SMALL LETTER EC, OLD HUNGARIAN CAPITAL LETTER EC
+assertEq(String.fromCodePoint(0x10CC5).toUpperCase().codePointAt(0), 0x10C85); // OLD HUNGARIAN SMALL LETTER ENC, OLD HUNGARIAN CAPITAL LETTER ENC
+assertEq(String.fromCodePoint(0x10CC6).toUpperCase().codePointAt(0), 0x10C86); // OLD HUNGARIAN SMALL LETTER ECS, OLD HUNGARIAN CAPITAL LETTER ECS
+assertEq(String.fromCodePoint(0x10CC7).toUpperCase().codePointAt(0), 0x10C87); // OLD HUNGARIAN SMALL LETTER ED, OLD HUNGARIAN CAPITAL LETTER ED
+assertEq(String.fromCodePoint(0x10CC8).toUpperCase().codePointAt(0), 0x10C88); // OLD HUNGARIAN SMALL LETTER AND, OLD HUNGARIAN CAPITAL LETTER AND
+assertEq(String.fromCodePoint(0x10CC9).toUpperCase().codePointAt(0), 0x10C89); // OLD HUNGARIAN SMALL LETTER E, OLD HUNGARIAN CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x10CCA).toUpperCase().codePointAt(0), 0x10C8A); // OLD HUNGARIAN SMALL LETTER CLOSE E, OLD HUNGARIAN CAPITAL LETTER CLOSE E
+assertEq(String.fromCodePoint(0x10CCB).toUpperCase().codePointAt(0), 0x10C8B); // OLD HUNGARIAN SMALL LETTER EE, OLD HUNGARIAN CAPITAL LETTER EE
+assertEq(String.fromCodePoint(0x10CCC).toUpperCase().codePointAt(0), 0x10C8C); // OLD HUNGARIAN SMALL LETTER EF, OLD HUNGARIAN CAPITAL LETTER EF
+assertEq(String.fromCodePoint(0x10CCD).toUpperCase().codePointAt(0), 0x10C8D); // OLD HUNGARIAN SMALL LETTER EG, OLD HUNGARIAN CAPITAL LETTER EG
+assertEq(String.fromCodePoint(0x10CCE).toUpperCase().codePointAt(0), 0x10C8E); // OLD HUNGARIAN SMALL LETTER EGY, OLD HUNGARIAN CAPITAL LETTER EGY
+assertEq(String.fromCodePoint(0x10CCF).toUpperCase().codePointAt(0), 0x10C8F); // OLD HUNGARIAN SMALL LETTER EH, OLD HUNGARIAN CAPITAL LETTER EH
+assertEq(String.fromCodePoint(0x10CD0).toUpperCase().codePointAt(0), 0x10C90); // OLD HUNGARIAN SMALL LETTER I, OLD HUNGARIAN CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x10CD1).toUpperCase().codePointAt(0), 0x10C91); // OLD HUNGARIAN SMALL LETTER II, OLD HUNGARIAN CAPITAL LETTER II
+assertEq(String.fromCodePoint(0x10CD2).toUpperCase().codePointAt(0), 0x10C92); // OLD HUNGARIAN SMALL LETTER EJ, OLD HUNGARIAN CAPITAL LETTER EJ
+assertEq(String.fromCodePoint(0x10CD3).toUpperCase().codePointAt(0), 0x10C93); // OLD HUNGARIAN SMALL LETTER EK, OLD HUNGARIAN CAPITAL LETTER EK
+assertEq(String.fromCodePoint(0x10CD4).toUpperCase().codePointAt(0), 0x10C94); // OLD HUNGARIAN SMALL LETTER AK, OLD HUNGARIAN CAPITAL LETTER AK
+assertEq(String.fromCodePoint(0x10CD5).toUpperCase().codePointAt(0), 0x10C95); // OLD HUNGARIAN SMALL LETTER UNK, OLD HUNGARIAN CAPITAL LETTER UNK
+assertEq(String.fromCodePoint(0x10CD6).toUpperCase().codePointAt(0), 0x10C96); // OLD HUNGARIAN SMALL LETTER EL, OLD HUNGARIAN CAPITAL LETTER EL
+assertEq(String.fromCodePoint(0x10CD7).toUpperCase().codePointAt(0), 0x10C97); // OLD HUNGARIAN SMALL LETTER ELY, OLD HUNGARIAN CAPITAL LETTER ELY
+assertEq(String.fromCodePoint(0x10CD8).toUpperCase().codePointAt(0), 0x10C98); // OLD HUNGARIAN SMALL LETTER EM, OLD HUNGARIAN CAPITAL LETTER EM
+assertEq(String.fromCodePoint(0x10CD9).toUpperCase().codePointAt(0), 0x10C99); // OLD HUNGARIAN SMALL LETTER EN, OLD HUNGARIAN CAPITAL LETTER EN
+assertEq(String.fromCodePoint(0x10CDA).toUpperCase().codePointAt(0), 0x10C9A); // OLD HUNGARIAN SMALL LETTER ENY, OLD HUNGARIAN CAPITAL LETTER ENY
+assertEq(String.fromCodePoint(0x10CDB).toUpperCase().codePointAt(0), 0x10C9B); // OLD HUNGARIAN SMALL LETTER O, OLD HUNGARIAN CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x10CDC).toUpperCase().codePointAt(0), 0x10C9C); // OLD HUNGARIAN SMALL LETTER OO, OLD HUNGARIAN CAPITAL LETTER OO
+assertEq(String.fromCodePoint(0x10CDD).toUpperCase().codePointAt(0), 0x10C9D); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
+assertEq(String.fromCodePoint(0x10CDE).toUpperCase().codePointAt(0), 0x10C9E); // OLD HUNGARIAN SMALL LETTER RUDIMENTA OE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
+assertEq(String.fromCodePoint(0x10CDF).toUpperCase().codePointAt(0), 0x10C9F); // OLD HUNGARIAN SMALL LETTER OEE, OLD HUNGARIAN CAPITAL LETTER OEE
+assertEq(String.fromCodePoint(0x10CE0).toUpperCase().codePointAt(0), 0x10CA0); // OLD HUNGARIAN SMALL LETTER EP, OLD HUNGARIAN CAPITAL LETTER EP
+assertEq(String.fromCodePoint(0x10CE1).toUpperCase().codePointAt(0), 0x10CA1); // OLD HUNGARIAN SMALL LETTER EMP, OLD HUNGARIAN CAPITAL LETTER EMP
+assertEq(String.fromCodePoint(0x10CE2).toUpperCase().codePointAt(0), 0x10CA2); // OLD HUNGARIAN SMALL LETTER ER, OLD HUNGARIAN CAPITAL LETTER ER
+assertEq(String.fromCodePoint(0x10CE3).toUpperCase().codePointAt(0), 0x10CA3); // OLD HUNGARIAN SMALL LETTER SHORT ER, OLD HUNGARIAN CAPITAL LETTER SHORT ER
+assertEq(String.fromCodePoint(0x10CE4).toUpperCase().codePointAt(0), 0x10CA4); // OLD HUNGARIAN SMALL LETTER ES, OLD HUNGARIAN CAPITAL LETTER ES
+assertEq(String.fromCodePoint(0x10CE5).toUpperCase().codePointAt(0), 0x10CA5); // OLD HUNGARIAN SMALL LETTER ESZ, OLD HUNGARIAN CAPITAL LETTER ESZ
+assertEq(String.fromCodePoint(0x10CE6).toUpperCase().codePointAt(0), 0x10CA6); // OLD HUNGARIAN SMALL LETTER ET, OLD HUNGARIAN CAPITAL LETTER ET
+assertEq(String.fromCodePoint(0x10CE7).toUpperCase().codePointAt(0), 0x10CA7); // OLD HUNGARIAN SMALL LETTER ENT, OLD HUNGARIAN CAPITAL LETTER ENT
+assertEq(String.fromCodePoint(0x10CE8).toUpperCase().codePointAt(0), 0x10CA8); // OLD HUNGARIAN SMALL LETTER ETY, OLD HUNGARIAN CAPITAL LETTER ETY
+assertEq(String.fromCodePoint(0x10CE9).toUpperCase().codePointAt(0), 0x10CA9); // OLD HUNGARIAN SMALL LETTER ECH, OLD HUNGARIAN CAPITAL LETTER ECH
+assertEq(String.fromCodePoint(0x10CEA).toUpperCase().codePointAt(0), 0x10CAA); // OLD HUNGARIAN SMALL LETTER U, OLD HUNGARIAN CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x10CEB).toUpperCase().codePointAt(0), 0x10CAB); // OLD HUNGARIAN SMALL LETTER UU, OLD HUNGARIAN CAPITAL LETTER UU
+assertEq(String.fromCodePoint(0x10CEC).toUpperCase().codePointAt(0), 0x10CAC); // OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE, OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
+assertEq(String.fromCodePoint(0x10CED).toUpperCase().codePointAt(0), 0x10CAD); // OLD HUNGARIAN SMALL LETTER RUDIMENTA UE, OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
+assertEq(String.fromCodePoint(0x10CEE).toUpperCase().codePointAt(0), 0x10CAE); // OLD HUNGARIAN SMALL LETTER EV, OLD HUNGARIAN CAPITAL LETTER EV
+assertEq(String.fromCodePoint(0x10CEF).toUpperCase().codePointAt(0), 0x10CAF); // OLD HUNGARIAN SMALL LETTER EZ, OLD HUNGARIAN CAPITAL LETTER EZ
+assertEq(String.fromCodePoint(0x10CF0).toUpperCase().codePointAt(0), 0x10CB0); // OLD HUNGARIAN SMALL LETTER EZS, OLD HUNGARIAN CAPITAL LETTER EZS
+assertEq(String.fromCodePoint(0x10CF1).toUpperCase().codePointAt(0), 0x10CB1); // OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
+assertEq(String.fromCodePoint(0x10CF2).toUpperCase().codePointAt(0), 0x10CB2); // OLD HUNGARIAN SMALL LETTER US, OLD HUNGARIAN CAPITAL LETTER US
+assertEq(String.fromCodePoint(0x118C0).toUpperCase().codePointAt(0), 0x118A0); // WARANG CITI SMALL LETTER NGAA, WARANG CITI CAPITAL LETTER NGAA
+assertEq(String.fromCodePoint(0x118C1).toUpperCase().codePointAt(0), 0x118A1); // WARANG CITI SMALL LETTER A, WARANG CITI CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x118C2).toUpperCase().codePointAt(0), 0x118A2); // WARANG CITI SMALL LETTER WI, WARANG CITI CAPITAL LETTER WI
+assertEq(String.fromCodePoint(0x118C3).toUpperCase().codePointAt(0), 0x118A3); // WARANG CITI SMALL LETTER YU, WARANG CITI CAPITAL LETTER YU
+assertEq(String.fromCodePoint(0x118C4).toUpperCase().codePointAt(0), 0x118A4); // WARANG CITI SMALL LETTER YA, WARANG CITI CAPITAL LETTER YA
+assertEq(String.fromCodePoint(0x118C5).toUpperCase().codePointAt(0), 0x118A5); // WARANG CITI SMALL LETTER YO, WARANG CITI CAPITAL LETTER YO
+assertEq(String.fromCodePoint(0x118C6).toUpperCase().codePointAt(0), 0x118A6); // WARANG CITI SMALL LETTER II, WARANG CITI CAPITAL LETTER II
+assertEq(String.fromCodePoint(0x118C7).toUpperCase().codePointAt(0), 0x118A7); // WARANG CITI SMALL LETTER UU, WARANG CITI CAPITAL LETTER UU
+assertEq(String.fromCodePoint(0x118C8).toUpperCase().codePointAt(0), 0x118A8); // WARANG CITI SMALL LETTER E, WARANG CITI CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x118C9).toUpperCase().codePointAt(0), 0x118A9); // WARANG CITI SMALL LETTER O, WARANG CITI CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x118CA).toUpperCase().codePointAt(0), 0x118AA); // WARANG CITI SMALL LETTER ANG, WARANG CITI CAPITAL LETTER ANG
+assertEq(String.fromCodePoint(0x118CB).toUpperCase().codePointAt(0), 0x118AB); // WARANG CITI SMALL LETTER GA, WARANG CITI CAPITAL LETTER GA
+assertEq(String.fromCodePoint(0x118CC).toUpperCase().codePointAt(0), 0x118AC); // WARANG CITI SMALL LETTER KO, WARANG CITI CAPITAL LETTER KO
+assertEq(String.fromCodePoint(0x118CD).toUpperCase().codePointAt(0), 0x118AD); // WARANG CITI SMALL LETTER ENY, WARANG CITI CAPITAL LETTER ENY
+assertEq(String.fromCodePoint(0x118CE).toUpperCase().codePointAt(0), 0x118AE); // WARANG CITI SMALL LETTER YUJ, WARANG CITI CAPITAL LETTER YUJ
+assertEq(String.fromCodePoint(0x118CF).toUpperCase().codePointAt(0), 0x118AF); // WARANG CITI SMALL LETTER UC, WARANG CITI CAPITAL LETTER UC
+assertEq(String.fromCodePoint(0x118D0).toUpperCase().codePointAt(0), 0x118B0); // WARANG CITI SMALL LETTER ENN, WARANG CITI CAPITAL LETTER ENN
+assertEq(String.fromCodePoint(0x118D1).toUpperCase().codePointAt(0), 0x118B1); // WARANG CITI SMALL LETTER ODD, WARANG CITI CAPITAL LETTER ODD
+assertEq(String.fromCodePoint(0x118D2).toUpperCase().codePointAt(0), 0x118B2); // WARANG CITI SMALL LETTER TTE, WARANG CITI CAPITAL LETTER TTE
+assertEq(String.fromCodePoint(0x118D3).toUpperCase().codePointAt(0), 0x118B3); // WARANG CITI SMALL LETTER NUNG, WARANG CITI CAPITAL LETTER NUNG
+assertEq(String.fromCodePoint(0x118D4).toUpperCase().codePointAt(0), 0x118B4); // WARANG CITI SMALL LETTER DA, WARANG CITI CAPITAL LETTER DA
+assertEq(String.fromCodePoint(0x118D5).toUpperCase().codePointAt(0), 0x118B5); // WARANG CITI SMALL LETTER AT, WARANG CITI CAPITAL LETTER AT
+assertEq(String.fromCodePoint(0x118D6).toUpperCase().codePointAt(0), 0x118B6); // WARANG CITI SMALL LETTER AM, WARANG CITI CAPITAL LETTER AM
+assertEq(String.fromCodePoint(0x118D7).toUpperCase().codePointAt(0), 0x118B7); // WARANG CITI SMALL LETTER BU, WARANG CITI CAPITAL LETTER BU
+assertEq(String.fromCodePoint(0x118D8).toUpperCase().codePointAt(0), 0x118B8); // WARANG CITI SMALL LETTER PU, WARANG CITI CAPITAL LETTER PU
+assertEq(String.fromCodePoint(0x118D9).toUpperCase().codePointAt(0), 0x118B9); // WARANG CITI SMALL LETTER HIYO, WARANG CITI CAPITAL LETTER HIYO
+assertEq(String.fromCodePoint(0x118DA).toUpperCase().codePointAt(0), 0x118BA); // WARANG CITI SMALL LETTER HOLO, WARANG CITI CAPITAL LETTER HOLO
+assertEq(String.fromCodePoint(0x118DB).toUpperCase().codePointAt(0), 0x118BB); // WARANG CITI SMALL LETTER HORR, WARANG CITI CAPITAL LETTER HORR
+assertEq(String.fromCodePoint(0x118DC).toUpperCase().codePointAt(0), 0x118BC); // WARANG CITI SMALL LETTER HAR, WARANG CITI CAPITAL LETTER HAR
+assertEq(String.fromCodePoint(0x118DD).toUpperCase().codePointAt(0), 0x118BD); // WARANG CITI SMALL LETTER SSUU, WARANG CITI CAPITAL LETTER SSUU
+assertEq(String.fromCodePoint(0x118DE).toUpperCase().codePointAt(0), 0x118BE); // WARANG CITI SMALL LETTER SII, WARANG CITI CAPITAL LETTER SII
+assertEq(String.fromCodePoint(0x118DF).toUpperCase().codePointAt(0), 0x118BF); // WARANG CITI SMALL LETTER VIYO, WARANG CITI CAPITAL LETTER VIYO
+assertEq(String.fromCodePoint(0x16E60).toUpperCase().codePointAt(0), 0x16E40); // MEDEFAIDRIN SMALL LETTER M, MEDEFAIDRIN CAPITAL LETTER M
+assertEq(String.fromCodePoint(0x16E61).toUpperCase().codePointAt(0), 0x16E41); // MEDEFAIDRIN SMALL LETTER S, MEDEFAIDRIN CAPITAL LETTER S
+assertEq(String.fromCodePoint(0x16E62).toUpperCase().codePointAt(0), 0x16E42); // MEDEFAIDRIN SMALL LETTER V, MEDEFAIDRIN CAPITAL LETTER V
+assertEq(String.fromCodePoint(0x16E63).toUpperCase().codePointAt(0), 0x16E43); // MEDEFAIDRIN SMALL LETTER W, MEDEFAIDRIN CAPITAL LETTER W
+assertEq(String.fromCodePoint(0x16E64).toUpperCase().codePointAt(0), 0x16E44); // MEDEFAIDRIN SMALL LETTER ATIU, MEDEFAIDRIN CAPITAL LETTER ATIU
+assertEq(String.fromCodePoint(0x16E65).toUpperCase().codePointAt(0), 0x16E45); // MEDEFAIDRIN SMALL LETTER Z, MEDEFAIDRIN CAPITAL LETTER Z
+assertEq(String.fromCodePoint(0x16E66).toUpperCase().codePointAt(0), 0x16E46); // MEDEFAIDRIN SMALL LETTER KP, MEDEFAIDRIN CAPITAL LETTER KP
+assertEq(String.fromCodePoint(0x16E67).toUpperCase().codePointAt(0), 0x16E47); // MEDEFAIDRIN SMALL LETTER P, MEDEFAIDRIN CAPITAL LETTER P
+assertEq(String.fromCodePoint(0x16E68).toUpperCase().codePointAt(0), 0x16E48); // MEDEFAIDRIN SMALL LETTER T, MEDEFAIDRIN CAPITAL LETTER T
+assertEq(String.fromCodePoint(0x16E69).toUpperCase().codePointAt(0), 0x16E49); // MEDEFAIDRIN SMALL LETTER G, MEDEFAIDRIN CAPITAL LETTER G
+assertEq(String.fromCodePoint(0x16E6A).toUpperCase().codePointAt(0), 0x16E4A); // MEDEFAIDRIN SMALL LETTER F, MEDEFAIDRIN CAPITAL LETTER F
+assertEq(String.fromCodePoint(0x16E6B).toUpperCase().codePointAt(0), 0x16E4B); // MEDEFAIDRIN SMALL LETTER I, MEDEFAIDRIN CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x16E6C).toUpperCase().codePointAt(0), 0x16E4C); // MEDEFAIDRIN SMALL LETTER K, MEDEFAIDRIN CAPITAL LETTER K
+assertEq(String.fromCodePoint(0x16E6D).toUpperCase().codePointAt(0), 0x16E4D); // MEDEFAIDRIN SMALL LETTER A, MEDEFAIDRIN CAPITAL LETTER A
+assertEq(String.fromCodePoint(0x16E6E).toUpperCase().codePointAt(0), 0x16E4E); // MEDEFAIDRIN SMALL LETTER J, MEDEFAIDRIN CAPITAL LETTER J
+assertEq(String.fromCodePoint(0x16E6F).toUpperCase().codePointAt(0), 0x16E4F); // MEDEFAIDRIN SMALL LETTER E, MEDEFAIDRIN CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x16E70).toUpperCase().codePointAt(0), 0x16E50); // MEDEFAIDRIN SMALL LETTER B, MEDEFAIDRIN CAPITAL LETTER B
+assertEq(String.fromCodePoint(0x16E71).toUpperCase().codePointAt(0), 0x16E51); // MEDEFAIDRIN SMALL LETTER C, MEDEFAIDRIN CAPITAL LETTER C
+assertEq(String.fromCodePoint(0x16E72).toUpperCase().codePointAt(0), 0x16E52); // MEDEFAIDRIN SMALL LETTER U, MEDEFAIDRIN CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x16E73).toUpperCase().codePointAt(0), 0x16E53); // MEDEFAIDRIN SMALL LETTER YU, MEDEFAIDRIN CAPITAL LETTER YU
+assertEq(String.fromCodePoint(0x16E74).toUpperCase().codePointAt(0), 0x16E54); // MEDEFAIDRIN SMALL LETTER L, MEDEFAIDRIN CAPITAL LETTER L
+assertEq(String.fromCodePoint(0x16E75).toUpperCase().codePointAt(0), 0x16E55); // MEDEFAIDRIN SMALL LETTER Q, MEDEFAIDRIN CAPITAL LETTER Q
+assertEq(String.fromCodePoint(0x16E76).toUpperCase().codePointAt(0), 0x16E56); // MEDEFAIDRIN SMALL LETTER HP, MEDEFAIDRIN CAPITAL LETTER HP
+assertEq(String.fromCodePoint(0x16E77).toUpperCase().codePointAt(0), 0x16E57); // MEDEFAIDRIN SMALL LETTER NY, MEDEFAIDRIN CAPITAL LETTER NY
+assertEq(String.fromCodePoint(0x16E78).toUpperCase().codePointAt(0), 0x16E58); // MEDEFAIDRIN SMALL LETTER X, MEDEFAIDRIN CAPITAL LETTER X
+assertEq(String.fromCodePoint(0x16E79).toUpperCase().codePointAt(0), 0x16E59); // MEDEFAIDRIN SMALL LETTER D, MEDEFAIDRIN CAPITAL LETTER D
+assertEq(String.fromCodePoint(0x16E7A).toUpperCase().codePointAt(0), 0x16E5A); // MEDEFAIDRIN SMALL LETTER OE, MEDEFAIDRIN CAPITAL LETTER OE
+assertEq(String.fromCodePoint(0x16E7B).toUpperCase().codePointAt(0), 0x16E5B); // MEDEFAIDRIN SMALL LETTER N, MEDEFAIDRIN CAPITAL LETTER N
+assertEq(String.fromCodePoint(0x16E7C).toUpperCase().codePointAt(0), 0x16E5C); // MEDEFAIDRIN SMALL LETTER R, MEDEFAIDRIN CAPITAL LETTER R
+assertEq(String.fromCodePoint(0x16E7D).toUpperCase().codePointAt(0), 0x16E5D); // MEDEFAIDRIN SMALL LETTER O, MEDEFAIDRIN CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x16E7E).toUpperCase().codePointAt(0), 0x16E5E); // MEDEFAIDRIN SMALL LETTER AI, MEDEFAIDRIN CAPITAL LETTER AI
+assertEq(String.fromCodePoint(0x16E7F).toUpperCase().codePointAt(0), 0x16E5F); // MEDEFAIDRIN SMALL LETTER Y, MEDEFAIDRIN CAPITAL LETTER Y
+assertEq(String.fromCodePoint(0x1E922).toUpperCase().codePointAt(0), 0x1E900); // ADLAM SMALL LETTER ALIF, ADLAM CAPITAL LETTER ALIF
+assertEq(String.fromCodePoint(0x1E923).toUpperCase().codePointAt(0), 0x1E901); // ADLAM SMALL LETTER DAALI, ADLAM CAPITAL LETTER DAALI
+assertEq(String.fromCodePoint(0x1E924).toUpperCase().codePointAt(0), 0x1E902); // ADLAM SMALL LETTER LAAM, ADLAM CAPITAL LETTER LAAM
+assertEq(String.fromCodePoint(0x1E925).toUpperCase().codePointAt(0), 0x1E903); // ADLAM SMALL LETTER MIIM, ADLAM CAPITAL LETTER MIIM
+assertEq(String.fromCodePoint(0x1E926).toUpperCase().codePointAt(0), 0x1E904); // ADLAM SMALL LETTER BA, ADLAM CAPITAL LETTER BA
+assertEq(String.fromCodePoint(0x1E927).toUpperCase().codePointAt(0), 0x1E905); // ADLAM SMALL LETTER SINNYIIYHE, ADLAM CAPITAL LETTER SINNYIIYHE
+assertEq(String.fromCodePoint(0x1E928).toUpperCase().codePointAt(0), 0x1E906); // ADLAM SMALL LETTER PE, ADLAM CAPITAL LETTER PE
+assertEq(String.fromCodePoint(0x1E929).toUpperCase().codePointAt(0), 0x1E907); // ADLAM SMALL LETTER BHE, ADLAM CAPITAL LETTER BHE
+assertEq(String.fromCodePoint(0x1E92A).toUpperCase().codePointAt(0), 0x1E908); // ADLAM SMALL LETTER RA, ADLAM CAPITAL LETTER RA
+assertEq(String.fromCodePoint(0x1E92B).toUpperCase().codePointAt(0), 0x1E909); // ADLAM SMALL LETTER E, ADLAM CAPITAL LETTER E
+assertEq(String.fromCodePoint(0x1E92C).toUpperCase().codePointAt(0), 0x1E90A); // ADLAM SMALL LETTER FA, ADLAM CAPITAL LETTER FA
+assertEq(String.fromCodePoint(0x1E92D).toUpperCase().codePointAt(0), 0x1E90B); // ADLAM SMALL LETTER I, ADLAM CAPITAL LETTER I
+assertEq(String.fromCodePoint(0x1E92E).toUpperCase().codePointAt(0), 0x1E90C); // ADLAM SMALL LETTER O, ADLAM CAPITAL LETTER O
+assertEq(String.fromCodePoint(0x1E92F).toUpperCase().codePointAt(0), 0x1E90D); // ADLAM SMALL LETTER DHA, ADLAM CAPITAL LETTER DHA
+assertEq(String.fromCodePoint(0x1E930).toUpperCase().codePointAt(0), 0x1E90E); // ADLAM SMALL LETTER YHE, ADLAM CAPITAL LETTER YHE
+assertEq(String.fromCodePoint(0x1E931).toUpperCase().codePointAt(0), 0x1E90F); // ADLAM SMALL LETTER WAW, ADLAM CAPITAL LETTER WAW
+assertEq(String.fromCodePoint(0x1E932).toUpperCase().codePointAt(0), 0x1E910); // ADLAM SMALL LETTER NUN, ADLAM CAPITAL LETTER NUN
+assertEq(String.fromCodePoint(0x1E933).toUpperCase().codePointAt(0), 0x1E911); // ADLAM SMALL LETTER KAF, ADLAM CAPITAL LETTER KAF
+assertEq(String.fromCodePoint(0x1E934).toUpperCase().codePointAt(0), 0x1E912); // ADLAM SMALL LETTER YA, ADLAM CAPITAL LETTER YA
+assertEq(String.fromCodePoint(0x1E935).toUpperCase().codePointAt(0), 0x1E913); // ADLAM SMALL LETTER U, ADLAM CAPITAL LETTER U
+assertEq(String.fromCodePoint(0x1E936).toUpperCase().codePointAt(0), 0x1E914); // ADLAM SMALL LETTER JIIM, ADLAM CAPITAL LETTER JIIM
+assertEq(String.fromCodePoint(0x1E937).toUpperCase().codePointAt(0), 0x1E915); // ADLAM SMALL LETTER CHI, ADLAM CAPITAL LETTER CHI
+assertEq(String.fromCodePoint(0x1E938).toUpperCase().codePointAt(0), 0x1E916); // ADLAM SMALL LETTER HA, ADLAM CAPITAL LETTER HA
+assertEq(String.fromCodePoint(0x1E939).toUpperCase().codePointAt(0), 0x1E917); // ADLAM SMALL LETTER QAAF, ADLAM CAPITAL LETTER QAAF
+assertEq(String.fromCodePoint(0x1E93A).toUpperCase().codePointAt(0), 0x1E918); // ADLAM SMALL LETTER GA, ADLAM CAPITAL LETTER GA
+assertEq(String.fromCodePoint(0x1E93B).toUpperCase().codePointAt(0), 0x1E919); // ADLAM SMALL LETTER NYA, ADLAM CAPITAL LETTER NYA
+assertEq(String.fromCodePoint(0x1E93C).toUpperCase().codePointAt(0), 0x1E91A); // ADLAM SMALL LETTER TU, ADLAM CAPITAL LETTER TU
+assertEq(String.fromCodePoint(0x1E93D).toUpperCase().codePointAt(0), 0x1E91B); // ADLAM SMALL LETTER NHA, ADLAM CAPITAL LETTER NHA
+assertEq(String.fromCodePoint(0x1E93E).toUpperCase().codePointAt(0), 0x1E91C); // ADLAM SMALL LETTER VA, ADLAM CAPITAL LETTER VA
+assertEq(String.fromCodePoint(0x1E93F).toUpperCase().codePointAt(0), 0x1E91D); // ADLAM SMALL LETTER KHA, ADLAM CAPITAL LETTER KHA
+assertEq(String.fromCodePoint(0x1E940).toUpperCase().codePointAt(0), 0x1E91E); // ADLAM SMALL LETTER GBE, ADLAM CAPITAL LETTER GBE
+assertEq(String.fromCodePoint(0x1E941).toUpperCase().codePointAt(0), 0x1E91F); // ADLAM SMALL LETTER ZAL, ADLAM CAPITAL LETTER ZAL
+assertEq(String.fromCodePoint(0x1E942).toUpperCase().codePointAt(0), 0x1E920); // ADLAM SMALL LETTER KPO, ADLAM CAPITAL LETTER KPO
+assertEq(String.fromCodePoint(0x1E943).toUpperCase().codePointAt(0), 0x1E921); // ADLAM SMALL LETTER SHA, ADLAM CAPITAL LETTER SHA
+assertEq(String.fromCodePoint(0x10400).toLowerCase().codePointAt(0), 0x10428); // DESERET CAPITAL LETTER LONG I, DESERET SMALL LETTER LONG I
+assertEq(String.fromCodePoint(0x10401).toLowerCase().codePointAt(0), 0x10429); // DESERET CAPITAL LETTER LONG E, DESERET SMALL LETTER LONG E
+assertEq(String.fromCodePoint(0x10402).toLowerCase().codePointAt(0), 0x1042A); // DESERET CAPITAL LETTER LONG A, DESERET SMALL LETTER LONG A
+assertEq(String.fromCodePoint(0x10403).toLowerCase().codePointAt(0), 0x1042B); // DESERET CAPITAL LETTER LONG AH, DESERET SMALL LETTER LONG AH
+assertEq(String.fromCodePoint(0x10404).toLowerCase().codePointAt(0), 0x1042C); // DESERET CAPITAL LETTER LONG O, DESERET SMALL LETTER LONG O
+assertEq(String.fromCodePoint(0x10405).toLowerCase().codePointAt(0), 0x1042D); // DESERET CAPITAL LETTER LONG OO, DESERET SMALL LETTER LONG OO
+assertEq(String.fromCodePoint(0x10406).toLowerCase().codePointAt(0), 0x1042E); // DESERET CAPITAL LETTER SHORT I, DESERET SMALL LETTER SHORT I
+assertEq(String.fromCodePoint(0x10407).toLowerCase().codePointAt(0), 0x1042F); // DESERET CAPITAL LETTER SHORT E, DESERET SMALL LETTER SHORT E
+assertEq(String.fromCodePoint(0x10408).toLowerCase().codePointAt(0), 0x10430); // DESERET CAPITAL LETTER SHORT A, DESERET SMALL LETTER SHORT A
+assertEq(String.fromCodePoint(0x10409).toLowerCase().codePointAt(0), 0x10431); // DESERET CAPITAL LETTER SHORT AH, DESERET SMALL LETTER SHORT AH
+assertEq(String.fromCodePoint(0x1040A).toLowerCase().codePointAt(0), 0x10432); // DESERET CAPITAL LETTER SHORT O, DESERET SMALL LETTER SHORT O
+assertEq(String.fromCodePoint(0x1040B).toLowerCase().codePointAt(0), 0x10433); // DESERET CAPITAL LETTER SHORT OO, DESERET SMALL LETTER SHORT OO
+assertEq(String.fromCodePoint(0x1040C).toLowerCase().codePointAt(0), 0x10434); // DESERET CAPITAL LETTER AY, DESERET SMALL LETTER AY
+assertEq(String.fromCodePoint(0x1040D).toLowerCase().codePointAt(0), 0x10435); // DESERET CAPITAL LETTER OW, DESERET SMALL LETTER OW
+assertEq(String.fromCodePoint(0x1040E).toLowerCase().codePointAt(0), 0x10436); // DESERET CAPITAL LETTER WU, DESERET SMALL LETTER WU
+assertEq(String.fromCodePoint(0x1040F).toLowerCase().codePointAt(0), 0x10437); // DESERET CAPITAL LETTER YEE, DESERET SMALL LETTER YEE
+assertEq(String.fromCodePoint(0x10410).toLowerCase().codePointAt(0), 0x10438); // DESERET CAPITAL LETTER H, DESERET SMALL LETTER H
+assertEq(String.fromCodePoint(0x10411).toLowerCase().codePointAt(0), 0x10439); // DESERET CAPITAL LETTER PEE, DESERET SMALL LETTER PEE
+assertEq(String.fromCodePoint(0x10412).toLowerCase().codePointAt(0), 0x1043A); // DESERET CAPITAL LETTER BEE, DESERET SMALL LETTER BEE
+assertEq(String.fromCodePoint(0x10413).toLowerCase().codePointAt(0), 0x1043B); // DESERET CAPITAL LETTER TEE, DESERET SMALL LETTER TEE
+assertEq(String.fromCodePoint(0x10414).toLowerCase().codePointAt(0), 0x1043C); // DESERET CAPITAL LETTER DEE, DESERET SMALL LETTER DEE
+assertEq(String.fromCodePoint(0x10415).toLowerCase().codePointAt(0), 0x1043D); // DESERET CAPITAL LETTER CHEE, DESERET SMALL LETTER CHEE
+assertEq(String.fromCodePoint(0x10416).toLowerCase().codePointAt(0), 0x1043E); // DESERET CAPITAL LETTER JEE, DESERET SMALL LETTER JEE
+assertEq(String.fromCodePoint(0x10417).toLowerCase().codePointAt(0), 0x1043F); // DESERET CAPITAL LETTER KAY, DESERET SMALL LETTER KAY
+assertEq(String.fromCodePoint(0x10418).toLowerCase().codePointAt(0), 0x10440); // DESERET CAPITAL LETTER GAY, DESERET SMALL LETTER GAY
+assertEq(String.fromCodePoint(0x10419).toLowerCase().codePointAt(0), 0x10441); // DESERET CAPITAL LETTER EF, DESERET SMALL LETTER EF
+assertEq(String.fromCodePoint(0x1041A).toLowerCase().codePointAt(0), 0x10442); // DESERET CAPITAL LETTER VEE, DESERET SMALL LETTER VEE
+assertEq(String.fromCodePoint(0x1041B).toLowerCase().codePointAt(0), 0x10443); // DESERET CAPITAL LETTER ETH, DESERET SMALL LETTER ETH
+assertEq(String.fromCodePoint(0x1041C).toLowerCase().codePointAt(0), 0x10444); // DESERET CAPITAL LETTER THEE, DESERET SMALL LETTER THEE
+assertEq(String.fromCodePoint(0x1041D).toLowerCase().codePointAt(0), 0x10445); // DESERET CAPITAL LETTER ES, DESERET SMALL LETTER ES
+assertEq(String.fromCodePoint(0x1041E).toLowerCase().codePointAt(0), 0x10446); // DESERET CAPITAL LETTER ZEE, DESERET SMALL LETTER ZEE
+assertEq(String.fromCodePoint(0x1041F).toLowerCase().codePointAt(0), 0x10447); // DESERET CAPITAL LETTER ESH, DESERET SMALL LETTER ESH
+assertEq(String.fromCodePoint(0x10420).toLowerCase().codePointAt(0), 0x10448); // DESERET CAPITAL LETTER ZHEE, DESERET SMALL LETTER ZHEE
+assertEq(String.fromCodePoint(0x10421).toLowerCase().codePointAt(0), 0x10449); // DESERET CAPITAL LETTER ER, DESERET SMALL LETTER ER
+assertEq(String.fromCodePoint(0x10422).toLowerCase().codePointAt(0), 0x1044A); // DESERET CAPITAL LETTER EL, DESERET SMALL LETTER EL
+assertEq(String.fromCodePoint(0x10423).toLowerCase().codePointAt(0), 0x1044B); // DESERET CAPITAL LETTER EM, DESERET SMALL LETTER EM
+assertEq(String.fromCodePoint(0x10424).toLowerCase().codePointAt(0), 0x1044C); // DESERET CAPITAL LETTER EN, DESERET SMALL LETTER EN
+assertEq(String.fromCodePoint(0x10425).toLowerCase().codePointAt(0), 0x1044D); // DESERET CAPITAL LETTER ENG, DESERET SMALL LETTER ENG
+assertEq(String.fromCodePoint(0x10426).toLowerCase().codePointAt(0), 0x1044E); // DESERET CAPITAL LETTER OI, DESERET SMALL LETTER OI
+assertEq(String.fromCodePoint(0x10427).toLowerCase().codePointAt(0), 0x1044F); // DESERET CAPITAL LETTER EW, DESERET SMALL LETTER EW
+assertEq(String.fromCodePoint(0x104B0).toLowerCase().codePointAt(0), 0x104D8); // OSAGE CAPITAL LETTER A, OSAGE SMALL LETTER A
+assertEq(String.fromCodePoint(0x104B1).toLowerCase().codePointAt(0), 0x104D9); // OSAGE CAPITAL LETTER AI, OSAGE SMALL LETTER AI
+assertEq(String.fromCodePoint(0x104B2).toLowerCase().codePointAt(0), 0x104DA); // OSAGE CAPITAL LETTER AIN, OSAGE SMALL LETTER AIN
+assertEq(String.fromCodePoint(0x104B3).toLowerCase().codePointAt(0), 0x104DB); // OSAGE CAPITAL LETTER AH, OSAGE SMALL LETTER AH
+assertEq(String.fromCodePoint(0x104B4).toLowerCase().codePointAt(0), 0x104DC); // OSAGE CAPITAL LETTER BRA, OSAGE SMALL LETTER BRA
+assertEq(String.fromCodePoint(0x104B5).toLowerCase().codePointAt(0), 0x104DD); // OSAGE CAPITAL LETTER CHA, OSAGE SMALL LETTER CHA
+assertEq(String.fromCodePoint(0x104B6).toLowerCase().codePointAt(0), 0x104DE); // OSAGE CAPITAL LETTER EHCHA, OSAGE SMALL LETTER EHCHA
+assertEq(String.fromCodePoint(0x104B7).toLowerCase().codePointAt(0), 0x104DF); // OSAGE CAPITAL LETTER E, OSAGE SMALL LETTER E
+assertEq(String.fromCodePoint(0x104B8).toLowerCase().codePointAt(0), 0x104E0); // OSAGE CAPITAL LETTER EIN, OSAGE SMALL LETTER EIN
+assertEq(String.fromCodePoint(0x104B9).toLowerCase().codePointAt(0), 0x104E1); // OSAGE CAPITAL LETTER HA, OSAGE SMALL LETTER HA
+assertEq(String.fromCodePoint(0x104BA).toLowerCase().codePointAt(0), 0x104E2); // OSAGE CAPITAL LETTER HYA, OSAGE SMALL LETTER HYA
+assertEq(String.fromCodePoint(0x104BB).toLowerCase().codePointAt(0), 0x104E3); // OSAGE CAPITAL LETTER I, OSAGE SMALL LETTER I
+assertEq(String.fromCodePoint(0x104BC).toLowerCase().codePointAt(0), 0x104E4); // OSAGE CAPITAL LETTER KA, OSAGE SMALL LETTER KA
+assertEq(String.fromCodePoint(0x104BD).toLowerCase().codePointAt(0), 0x104E5); // OSAGE CAPITAL LETTER EHKA, OSAGE SMALL LETTER EHKA
+assertEq(String.fromCodePoint(0x104BE).toLowerCase().codePointAt(0), 0x104E6); // OSAGE CAPITAL LETTER KYA, OSAGE SMALL LETTER KYA
+assertEq(String.fromCodePoint(0x104BF).toLowerCase().codePointAt(0), 0x104E7); // OSAGE CAPITAL LETTER LA, OSAGE SMALL LETTER LA
+assertEq(String.fromCodePoint(0x104C0).toLowerCase().codePointAt(0), 0x104E8); // OSAGE CAPITAL LETTER MA, OSAGE SMALL LETTER MA
+assertEq(String.fromCodePoint(0x104C1).toLowerCase().codePointAt(0), 0x104E9); // OSAGE CAPITAL LETTER NA, OSAGE SMALL LETTER NA
+assertEq(String.fromCodePoint(0x104C2).toLowerCase().codePointAt(0), 0x104EA); // OSAGE CAPITAL LETTER O, OSAGE SMALL LETTER O
+assertEq(String.fromCodePoint(0x104C3).toLowerCase().codePointAt(0), 0x104EB); // OSAGE CAPITAL LETTER OIN, OSAGE SMALL LETTER OIN
+assertEq(String.fromCodePoint(0x104C4).toLowerCase().codePointAt(0), 0x104EC); // OSAGE CAPITAL LETTER PA, OSAGE SMALL LETTER PA
+assertEq(String.fromCodePoint(0x104C5).toLowerCase().codePointAt(0), 0x104ED); // OSAGE CAPITAL LETTER EHPA, OSAGE SMALL LETTER EHPA
+assertEq(String.fromCodePoint(0x104C6).toLowerCase().codePointAt(0), 0x104EE); // OSAGE CAPITAL LETTER SA, OSAGE SMALL LETTER SA
+assertEq(String.fromCodePoint(0x104C7).toLowerCase().codePointAt(0), 0x104EF); // OSAGE CAPITAL LETTER SHA, OSAGE SMALL LETTER SHA
+assertEq(String.fromCodePoint(0x104C8).toLowerCase().codePointAt(0), 0x104F0); // OSAGE CAPITAL LETTER TA, OSAGE SMALL LETTER TA
+assertEq(String.fromCodePoint(0x104C9).toLowerCase().codePointAt(0), 0x104F1); // OSAGE CAPITAL LETTER EHTA, OSAGE SMALL LETTER EHTA
+assertEq(String.fromCodePoint(0x104CA).toLowerCase().codePointAt(0), 0x104F2); // OSAGE CAPITAL LETTER TSA, OSAGE SMALL LETTER TSA
+assertEq(String.fromCodePoint(0x104CB).toLowerCase().codePointAt(0), 0x104F3); // OSAGE CAPITAL LETTER EHTSA, OSAGE SMALL LETTER EHTSA
+assertEq(String.fromCodePoint(0x104CC).toLowerCase().codePointAt(0), 0x104F4); // OSAGE CAPITAL LETTER TSHA, OSAGE SMALL LETTER TSHA
+assertEq(String.fromCodePoint(0x104CD).toLowerCase().codePointAt(0), 0x104F5); // OSAGE CAPITAL LETTER DHA, OSAGE SMALL LETTER DHA
+assertEq(String.fromCodePoint(0x104CE).toLowerCase().codePointAt(0), 0x104F6); // OSAGE CAPITAL LETTER U, OSAGE SMALL LETTER U
+assertEq(String.fromCodePoint(0x104CF).toLowerCase().codePointAt(0), 0x104F7); // OSAGE CAPITAL LETTER WA, OSAGE SMALL LETTER WA
+assertEq(String.fromCodePoint(0x104D0).toLowerCase().codePointAt(0), 0x104F8); // OSAGE CAPITAL LETTER KHA, OSAGE SMALL LETTER KHA
+assertEq(String.fromCodePoint(0x104D1).toLowerCase().codePointAt(0), 0x104F9); // OSAGE CAPITAL LETTER GHA, OSAGE SMALL LETTER GHA
+assertEq(String.fromCodePoint(0x104D2).toLowerCase().codePointAt(0), 0x104FA); // OSAGE CAPITAL LETTER ZA, OSAGE SMALL LETTER ZA
+assertEq(String.fromCodePoint(0x104D3).toLowerCase().codePointAt(0), 0x104FB); // OSAGE CAPITAL LETTER ZHA, OSAGE SMALL LETTER ZHA
+assertEq(String.fromCodePoint(0x10C80).toLowerCase().codePointAt(0), 0x10CC0); // OLD HUNGARIAN CAPITAL LETTER A, OLD HUNGARIAN SMALL LETTER A
+assertEq(String.fromCodePoint(0x10C81).toLowerCase().codePointAt(0), 0x10CC1); // OLD HUNGARIAN CAPITAL LETTER AA, OLD HUNGARIAN SMALL LETTER AA
+assertEq(String.fromCodePoint(0x10C82).toLowerCase().codePointAt(0), 0x10CC2); // OLD HUNGARIAN CAPITAL LETTER EB, OLD HUNGARIAN SMALL LETTER EB
+assertEq(String.fromCodePoint(0x10C83).toLowerCase().codePointAt(0), 0x10CC3); // OLD HUNGARIAN CAPITAL LETTER AMB, OLD HUNGARIAN SMALL LETTER AMB
+assertEq(String.fromCodePoint(0x10C84).toLowerCase().codePointAt(0), 0x10CC4); // OLD HUNGARIAN CAPITAL LETTER EC, OLD HUNGARIAN SMALL LETTER EC
+assertEq(String.fromCodePoint(0x10C85).toLowerCase().codePointAt(0), 0x10CC5); // OLD HUNGARIAN CAPITAL LETTER ENC, OLD HUNGARIAN SMALL LETTER ENC
+assertEq(String.fromCodePoint(0x10C86).toLowerCase().codePointAt(0), 0x10CC6); // OLD HUNGARIAN CAPITAL LETTER ECS, OLD HUNGARIAN SMALL LETTER ECS
+assertEq(String.fromCodePoint(0x10C87).toLowerCase().codePointAt(0), 0x10CC7); // OLD HUNGARIAN CAPITAL LETTER ED, OLD HUNGARIAN SMALL LETTER ED
+assertEq(String.fromCodePoint(0x10C88).toLowerCase().codePointAt(0), 0x10CC8); // OLD HUNGARIAN CAPITAL LETTER AND, OLD HUNGARIAN SMALL LETTER AND
+assertEq(String.fromCodePoint(0x10C89).toLowerCase().codePointAt(0), 0x10CC9); // OLD HUNGARIAN CAPITAL LETTER E, OLD HUNGARIAN SMALL LETTER E
+assertEq(String.fromCodePoint(0x10C8A).toLowerCase().codePointAt(0), 0x10CCA); // OLD HUNGARIAN CAPITAL LETTER CLOSE E, OLD HUNGARIAN SMALL LETTER CLOSE E
+assertEq(String.fromCodePoint(0x10C8B).toLowerCase().codePointAt(0), 0x10CCB); // OLD HUNGARIAN CAPITAL LETTER EE, OLD HUNGARIAN SMALL LETTER EE
+assertEq(String.fromCodePoint(0x10C8C).toLowerCase().codePointAt(0), 0x10CCC); // OLD HUNGARIAN CAPITAL LETTER EF, OLD HUNGARIAN SMALL LETTER EF
+assertEq(String.fromCodePoint(0x10C8D).toLowerCase().codePointAt(0), 0x10CCD); // OLD HUNGARIAN CAPITAL LETTER EG, OLD HUNGARIAN SMALL LETTER EG
+assertEq(String.fromCodePoint(0x10C8E).toLowerCase().codePointAt(0), 0x10CCE); // OLD HUNGARIAN CAPITAL LETTER EGY, OLD HUNGARIAN SMALL LETTER EGY
+assertEq(String.fromCodePoint(0x10C8F).toLowerCase().codePointAt(0), 0x10CCF); // OLD HUNGARIAN CAPITAL LETTER EH, OLD HUNGARIAN SMALL LETTER EH
+assertEq(String.fromCodePoint(0x10C90).toLowerCase().codePointAt(0), 0x10CD0); // OLD HUNGARIAN CAPITAL LETTER I, OLD HUNGARIAN SMALL LETTER I
+assertEq(String.fromCodePoint(0x10C91).toLowerCase().codePointAt(0), 0x10CD1); // OLD HUNGARIAN CAPITAL LETTER II, OLD HUNGARIAN SMALL LETTER II
+assertEq(String.fromCodePoint(0x10C92).toLowerCase().codePointAt(0), 0x10CD2); // OLD HUNGARIAN CAPITAL LETTER EJ, OLD HUNGARIAN SMALL LETTER EJ
+assertEq(String.fromCodePoint(0x10C93).toLowerCase().codePointAt(0), 0x10CD3); // OLD HUNGARIAN CAPITAL LETTER EK, OLD HUNGARIAN SMALL LETTER EK
+assertEq(String.fromCodePoint(0x10C94).toLowerCase().codePointAt(0), 0x10CD4); // OLD HUNGARIAN CAPITAL LETTER AK, OLD HUNGARIAN SMALL LETTER AK
+assertEq(String.fromCodePoint(0x10C95).toLowerCase().codePointAt(0), 0x10CD5); // OLD HUNGARIAN CAPITAL LETTER UNK, OLD HUNGARIAN SMALL LETTER UNK
+assertEq(String.fromCodePoint(0x10C96).toLowerCase().codePointAt(0), 0x10CD6); // OLD HUNGARIAN CAPITAL LETTER EL, OLD HUNGARIAN SMALL LETTER EL
+assertEq(String.fromCodePoint(0x10C97).toLowerCase().codePointAt(0), 0x10CD7); // OLD HUNGARIAN CAPITAL LETTER ELY, OLD HUNGARIAN SMALL LETTER ELY
+assertEq(String.fromCodePoint(0x10C98).toLowerCase().codePointAt(0), 0x10CD8); // OLD HUNGARIAN CAPITAL LETTER EM, OLD HUNGARIAN SMALL LETTER EM
+assertEq(String.fromCodePoint(0x10C99).toLowerCase().codePointAt(0), 0x10CD9); // OLD HUNGARIAN CAPITAL LETTER EN, OLD HUNGARIAN SMALL LETTER EN
+assertEq(String.fromCodePoint(0x10C9A).toLowerCase().codePointAt(0), 0x10CDA); // OLD HUNGARIAN CAPITAL LETTER ENY, OLD HUNGARIAN SMALL LETTER ENY
+assertEq(String.fromCodePoint(0x10C9B).toLowerCase().codePointAt(0), 0x10CDB); // OLD HUNGARIAN CAPITAL LETTER O, OLD HUNGARIAN SMALL LETTER O
+assertEq(String.fromCodePoint(0x10C9C).toLowerCase().codePointAt(0), 0x10CDC); // OLD HUNGARIAN CAPITAL LETTER OO, OLD HUNGARIAN SMALL LETTER OO
+assertEq(String.fromCodePoint(0x10C9D).toLowerCase().codePointAt(0), 0x10CDD); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE
+assertEq(String.fromCodePoint(0x10C9E).toLowerCase().codePointAt(0), 0x10CDE); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE, OLD HUNGARIAN SMALL LETTER RUDIMENTA OE
+assertEq(String.fromCodePoint(0x10C9F).toLowerCase().codePointAt(0), 0x10CDF); // OLD HUNGARIAN CAPITAL LETTER OEE, OLD HUNGARIAN SMALL LETTER OEE
+assertEq(String.fromCodePoint(0x10CA0).toLowerCase().codePointAt(0), 0x10CE0); // OLD HUNGARIAN CAPITAL LETTER EP, OLD HUNGARIAN SMALL LETTER EP
+assertEq(String.fromCodePoint(0x10CA1).toLowerCase().codePointAt(0), 0x10CE1); // OLD HUNGARIAN CAPITAL LETTER EMP, OLD HUNGARIAN SMALL LETTER EMP
+assertEq(String.fromCodePoint(0x10CA2).toLowerCase().codePointAt(0), 0x10CE2); // OLD HUNGARIAN CAPITAL LETTER ER, OLD HUNGARIAN SMALL LETTER ER
+assertEq(String.fromCodePoint(0x10CA3).toLowerCase().codePointAt(0), 0x10CE3); // OLD HUNGARIAN CAPITAL LETTER SHORT ER, OLD HUNGARIAN SMALL LETTER SHORT ER
+assertEq(String.fromCodePoint(0x10CA4).toLowerCase().codePointAt(0), 0x10CE4); // OLD HUNGARIAN CAPITAL LETTER ES, OLD HUNGARIAN SMALL LETTER ES
+assertEq(String.fromCodePoint(0x10CA5).toLowerCase().codePointAt(0), 0x10CE5); // OLD HUNGARIAN CAPITAL LETTER ESZ, OLD HUNGARIAN SMALL LETTER ESZ
+assertEq(String.fromCodePoint(0x10CA6).toLowerCase().codePointAt(0), 0x10CE6); // OLD HUNGARIAN CAPITAL LETTER ET, OLD HUNGARIAN SMALL LETTER ET
+assertEq(String.fromCodePoint(0x10CA7).toLowerCase().codePointAt(0), 0x10CE7); // OLD HUNGARIAN CAPITAL LETTER ENT, OLD HUNGARIAN SMALL LETTER ENT
+assertEq(String.fromCodePoint(0x10CA8).toLowerCase().codePointAt(0), 0x10CE8); // OLD HUNGARIAN CAPITAL LETTER ETY, OLD HUNGARIAN SMALL LETTER ETY
+assertEq(String.fromCodePoint(0x10CA9).toLowerCase().codePointAt(0), 0x10CE9); // OLD HUNGARIAN CAPITAL LETTER ECH, OLD HUNGARIAN SMALL LETTER ECH
+assertEq(String.fromCodePoint(0x10CAA).toLowerCase().codePointAt(0), 0x10CEA); // OLD HUNGARIAN CAPITAL LETTER U, OLD HUNGARIAN SMALL LETTER U
+assertEq(String.fromCodePoint(0x10CAB).toLowerCase().codePointAt(0), 0x10CEB); // OLD HUNGARIAN CAPITAL LETTER UU, OLD HUNGARIAN SMALL LETTER UU
+assertEq(String.fromCodePoint(0x10CAC).toLowerCase().codePointAt(0), 0x10CEC); // OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE, OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE
+assertEq(String.fromCodePoint(0x10CAD).toLowerCase().codePointAt(0), 0x10CED); // OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE, OLD HUNGARIAN SMALL LETTER RUDIMENTA UE
+assertEq(String.fromCodePoint(0x10CAE).toLowerCase().codePointAt(0), 0x10CEE); // OLD HUNGARIAN CAPITAL LETTER EV, OLD HUNGARIAN SMALL LETTER EV
+assertEq(String.fromCodePoint(0x10CAF).toLowerCase().codePointAt(0), 0x10CEF); // OLD HUNGARIAN CAPITAL LETTER EZ, OLD HUNGARIAN SMALL LETTER EZ
+assertEq(String.fromCodePoint(0x10CB0).toLowerCase().codePointAt(0), 0x10CF0); // OLD HUNGARIAN CAPITAL LETTER EZS, OLD HUNGARIAN SMALL LETTER EZS
+assertEq(String.fromCodePoint(0x10CB1).toLowerCase().codePointAt(0), 0x10CF1); // OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN, OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN
+assertEq(String.fromCodePoint(0x10CB2).toLowerCase().codePointAt(0), 0x10CF2); // OLD HUNGARIAN CAPITAL LETTER US, OLD HUNGARIAN SMALL LETTER US
+assertEq(String.fromCodePoint(0x118A0).toLowerCase().codePointAt(0), 0x118C0); // WARANG CITI CAPITAL LETTER NGAA, WARANG CITI SMALL LETTER NGAA
+assertEq(String.fromCodePoint(0x118A1).toLowerCase().codePointAt(0), 0x118C1); // WARANG CITI CAPITAL LETTER A, WARANG CITI SMALL LETTER A
+assertEq(String.fromCodePoint(0x118A2).toLowerCase().codePointAt(0), 0x118C2); // WARANG CITI CAPITAL LETTER WI, WARANG CITI SMALL LETTER WI
+assertEq(String.fromCodePoint(0x118A3).toLowerCase().codePointAt(0), 0x118C3); // WARANG CITI CAPITAL LETTER YU, WARANG CITI SMALL LETTER YU
+assertEq(String.fromCodePoint(0x118A4).toLowerCase().codePointAt(0), 0x118C4); // WARANG CITI CAPITAL LETTER YA, WARANG CITI SMALL LETTER YA
+assertEq(String.fromCodePoint(0x118A5).toLowerCase().codePointAt(0), 0x118C5); // WARANG CITI CAPITAL LETTER YO, WARANG CITI SMALL LETTER YO
+assertEq(String.fromCodePoint(0x118A6).toLowerCase().codePointAt(0), 0x118C6); // WARANG CITI CAPITAL LETTER II, WARANG CITI SMALL LETTER II
+assertEq(String.fromCodePoint(0x118A7).toLowerCase().codePointAt(0), 0x118C7); // WARANG CITI CAPITAL LETTER UU, WARANG CITI SMALL LETTER UU
+assertEq(String.fromCodePoint(0x118A8).toLowerCase().codePointAt(0), 0x118C8); // WARANG CITI CAPITAL LETTER E, WARANG CITI SMALL LETTER E
+assertEq(String.fromCodePoint(0x118A9).toLowerCase().codePointAt(0), 0x118C9); // WARANG CITI CAPITAL LETTER O, WARANG CITI SMALL LETTER O
+assertEq(String.fromCodePoint(0x118AA).toLowerCase().codePointAt(0), 0x118CA); // WARANG CITI CAPITAL LETTER ANG, WARANG CITI SMALL LETTER ANG
+assertEq(String.fromCodePoint(0x118AB).toLowerCase().codePointAt(0), 0x118CB); // WARANG CITI CAPITAL LETTER GA, WARANG CITI SMALL LETTER GA
+assertEq(String.fromCodePoint(0x118AC).toLowerCase().codePointAt(0), 0x118CC); // WARANG CITI CAPITAL LETTER KO, WARANG CITI SMALL LETTER KO
+assertEq(String.fromCodePoint(0x118AD).toLowerCase().codePointAt(0), 0x118CD); // WARANG CITI CAPITAL LETTER ENY, WARANG CITI SMALL LETTER ENY
+assertEq(String.fromCodePoint(0x118AE).toLowerCase().codePointAt(0), 0x118CE); // WARANG CITI CAPITAL LETTER YUJ, WARANG CITI SMALL LETTER YUJ
+assertEq(String.fromCodePoint(0x118AF).toLowerCase().codePointAt(0), 0x118CF); // WARANG CITI CAPITAL LETTER UC, WARANG CITI SMALL LETTER UC
+assertEq(String.fromCodePoint(0x118B0).toLowerCase().codePointAt(0), 0x118D0); // WARANG CITI CAPITAL LETTER ENN, WARANG CITI SMALL LETTER ENN
+assertEq(String.fromCodePoint(0x118B1).toLowerCase().codePointAt(0), 0x118D1); // WARANG CITI CAPITAL LETTER ODD, WARANG CITI SMALL LETTER ODD
+assertEq(String.fromCodePoint(0x118B2).toLowerCase().codePointAt(0), 0x118D2); // WARANG CITI CAPITAL LETTER TTE, WARANG CITI SMALL LETTER TTE
+assertEq(String.fromCodePoint(0x118B3).toLowerCase().codePointAt(0), 0x118D3); // WARANG CITI CAPITAL LETTER NUNG, WARANG CITI SMALL LETTER NUNG
+assertEq(String.fromCodePoint(0x118B4).toLowerCase().codePointAt(0), 0x118D4); // WARANG CITI CAPITAL LETTER DA, WARANG CITI SMALL LETTER DA
+assertEq(String.fromCodePoint(0x118B5).toLowerCase().codePointAt(0), 0x118D5); // WARANG CITI CAPITAL LETTER AT, WARANG CITI SMALL LETTER AT
+assertEq(String.fromCodePoint(0x118B6).toLowerCase().codePointAt(0), 0x118D6); // WARANG CITI CAPITAL LETTER AM, WARANG CITI SMALL LETTER AM
+assertEq(String.fromCodePoint(0x118B7).toLowerCase().codePointAt(0), 0x118D7); // WARANG CITI CAPITAL LETTER BU, WARANG CITI SMALL LETTER BU
+assertEq(String.fromCodePoint(0x118B8).toLowerCase().codePointAt(0), 0x118D8); // WARANG CITI CAPITAL LETTER PU, WARANG CITI SMALL LETTER PU
+assertEq(String.fromCodePoint(0x118B9).toLowerCase().codePointAt(0), 0x118D9); // WARANG CITI CAPITAL LETTER HIYO, WARANG CITI SMALL LETTER HIYO
+assertEq(String.fromCodePoint(0x118BA).toLowerCase().codePointAt(0), 0x118DA); // WARANG CITI CAPITAL LETTER HOLO, WARANG CITI SMALL LETTER HOLO
+assertEq(String.fromCodePoint(0x118BB).toLowerCase().codePointAt(0), 0x118DB); // WARANG CITI CAPITAL LETTER HORR, WARANG CITI SMALL LETTER HORR
+assertEq(String.fromCodePoint(0x118BC).toLowerCase().codePointAt(0), 0x118DC); // WARANG CITI CAPITAL LETTER HAR, WARANG CITI SMALL LETTER HAR
+assertEq(String.fromCodePoint(0x118BD).toLowerCase().codePointAt(0), 0x118DD); // WARANG CITI CAPITAL LETTER SSUU, WARANG CITI SMALL LETTER SSUU
+assertEq(String.fromCodePoint(0x118BE).toLowerCase().codePointAt(0), 0x118DE); // WARANG CITI CAPITAL LETTER SII, WARANG CITI SMALL LETTER SII
+assertEq(String.fromCodePoint(0x118BF).toLowerCase().codePointAt(0), 0x118DF); // WARANG CITI CAPITAL LETTER VIYO, WARANG CITI SMALL LETTER VIYO
+assertEq(String.fromCodePoint(0x16E40).toLowerCase().codePointAt(0), 0x16E60); // MEDEFAIDRIN CAPITAL LETTER M, MEDEFAIDRIN SMALL LETTER M
+assertEq(String.fromCodePoint(0x16E41).toLowerCase().codePointAt(0), 0x16E61); // MEDEFAIDRIN CAPITAL LETTER S, MEDEFAIDRIN SMALL LETTER S
+assertEq(String.fromCodePoint(0x16E42).toLowerCase().codePointAt(0), 0x16E62); // MEDEFAIDRIN CAPITAL LETTER V, MEDEFAIDRIN SMALL LETTER V
+assertEq(String.fromCodePoint(0x16E43).toLowerCase().codePointAt(0), 0x16E63); // MEDEFAIDRIN CAPITAL LETTER W, MEDEFAIDRIN SMALL LETTER W
+assertEq(String.fromCodePoint(0x16E44).toLowerCase().codePointAt(0), 0x16E64); // MEDEFAIDRIN CAPITAL LETTER ATIU, MEDEFAIDRIN SMALL LETTER ATIU
+assertEq(String.fromCodePoint(0x16E45).toLowerCase().codePointAt(0), 0x16E65); // MEDEFAIDRIN CAPITAL LETTER Z, MEDEFAIDRIN SMALL LETTER Z
+assertEq(String.fromCodePoint(0x16E46).toLowerCase().codePointAt(0), 0x16E66); // MEDEFAIDRIN CAPITAL LETTER KP, MEDEFAIDRIN SMALL LETTER KP
+assertEq(String.fromCodePoint(0x16E47).toLowerCase().codePointAt(0), 0x16E67); // MEDEFAIDRIN CAPITAL LETTER P, MEDEFAIDRIN SMALL LETTER P
+assertEq(String.fromCodePoint(0x16E48).toLowerCase().codePointAt(0), 0x16E68); // MEDEFAIDRIN CAPITAL LETTER T, MEDEFAIDRIN SMALL LETTER T
+assertEq(String.fromCodePoint(0x16E49).toLowerCase().codePointAt(0), 0x16E69); // MEDEFAIDRIN CAPITAL LETTER G, MEDEFAIDRIN SMALL LETTER G
+assertEq(String.fromCodePoint(0x16E4A).toLowerCase().codePointAt(0), 0x16E6A); // MEDEFAIDRIN CAPITAL LETTER F, MEDEFAIDRIN SMALL LETTER F
+assertEq(String.fromCodePoint(0x16E4B).toLowerCase().codePointAt(0), 0x16E6B); // MEDEFAIDRIN CAPITAL LETTER I, MEDEFAIDRIN SMALL LETTER I
+assertEq(String.fromCodePoint(0x16E4C).toLowerCase().codePointAt(0), 0x16E6C); // MEDEFAIDRIN CAPITAL LETTER K, MEDEFAIDRIN SMALL LETTER K
+assertEq(String.fromCodePoint(0x16E4D).toLowerCase().codePointAt(0), 0x16E6D); // MEDEFAIDRIN CAPITAL LETTER A, MEDEFAIDRIN SMALL LETTER A
+assertEq(String.fromCodePoint(0x16E4E).toLowerCase().codePointAt(0), 0x16E6E); // MEDEFAIDRIN CAPITAL LETTER J, MEDEFAIDRIN SMALL LETTER J
+assertEq(String.fromCodePoint(0x16E4F).toLowerCase().codePointAt(0), 0x16E6F); // MEDEFAIDRIN CAPITAL LETTER E, MEDEFAIDRIN SMALL LETTER E
+assertEq(String.fromCodePoint(0x16E50).toLowerCase().codePointAt(0), 0x16E70); // MEDEFAIDRIN CAPITAL LETTER B, MEDEFAIDRIN SMALL LETTER B
+assertEq(String.fromCodePoint(0x16E51).toLowerCase().codePointAt(0), 0x16E71); // MEDEFAIDRIN CAPITAL LETTER C, MEDEFAIDRIN SMALL LETTER C
+assertEq(String.fromCodePoint(0x16E52).toLowerCase().codePointAt(0), 0x16E72); // MEDEFAIDRIN CAPITAL LETTER U, MEDEFAIDRIN SMALL LETTER U
+assertEq(String.fromCodePoint(0x16E53).toLowerCase().codePointAt(0), 0x16E73); // MEDEFAIDRIN CAPITAL LETTER YU, MEDEFAIDRIN SMALL LETTER YU
+assertEq(String.fromCodePoint(0x16E54).toLowerCase().codePointAt(0), 0x16E74); // MEDEFAIDRIN CAPITAL LETTER L, MEDEFAIDRIN SMALL LETTER L
+assertEq(String.fromCodePoint(0x16E55).toLowerCase().codePointAt(0), 0x16E75); // MEDEFAIDRIN CAPITAL LETTER Q, MEDEFAIDRIN SMALL LETTER Q
+assertEq(String.fromCodePoint(0x16E56).toLowerCase().codePointAt(0), 0x16E76); // MEDEFAIDRIN CAPITAL LETTER HP, MEDEFAIDRIN SMALL LETTER HP
+assertEq(String.fromCodePoint(0x16E57).toLowerCase().codePointAt(0), 0x16E77); // MEDEFAIDRIN CAPITAL LETTER NY, MEDEFAIDRIN SMALL LETTER NY
+assertEq(String.fromCodePoint(0x16E58).toLowerCase().codePointAt(0), 0x16E78); // MEDEFAIDRIN CAPITAL LETTER X, MEDEFAIDRIN SMALL LETTER X
+assertEq(String.fromCodePoint(0x16E59).toLowerCase().codePointAt(0), 0x16E79); // MEDEFAIDRIN CAPITAL LETTER D, MEDEFAIDRIN SMALL LETTER D
+assertEq(String.fromCodePoint(0x16E5A).toLowerCase().codePointAt(0), 0x16E7A); // MEDEFAIDRIN CAPITAL LETTER OE, MEDEFAIDRIN SMALL LETTER OE
+assertEq(String.fromCodePoint(0x16E5B).toLowerCase().codePointAt(0), 0x16E7B); // MEDEFAIDRIN CAPITAL LETTER N, MEDEFAIDRIN SMALL LETTER N
+assertEq(String.fromCodePoint(0x16E5C).toLowerCase().codePointAt(0), 0x16E7C); // MEDEFAIDRIN CAPITAL LETTER R, MEDEFAIDRIN SMALL LETTER R
+assertEq(String.fromCodePoint(0x16E5D).toLowerCase().codePointAt(0), 0x16E7D); // MEDEFAIDRIN CAPITAL LETTER O, MEDEFAIDRIN SMALL LETTER O
+assertEq(String.fromCodePoint(0x16E5E).toLowerCase().codePointAt(0), 0x16E7E); // MEDEFAIDRIN CAPITAL LETTER AI, MEDEFAIDRIN SMALL LETTER AI
+assertEq(String.fromCodePoint(0x16E5F).toLowerCase().codePointAt(0), 0x16E7F); // MEDEFAIDRIN CAPITAL LETTER Y, MEDEFAIDRIN SMALL LETTER Y
+assertEq(String.fromCodePoint(0x1E900).toLowerCase().codePointAt(0), 0x1E922); // ADLAM CAPITAL LETTER ALIF, ADLAM SMALL LETTER ALIF
+assertEq(String.fromCodePoint(0x1E901).toLowerCase().codePointAt(0), 0x1E923); // ADLAM CAPITAL LETTER DAALI, ADLAM SMALL LETTER DAALI
+assertEq(String.fromCodePoint(0x1E902).toLowerCase().codePointAt(0), 0x1E924); // ADLAM CAPITAL LETTER LAAM, ADLAM SMALL LETTER LAAM
+assertEq(String.fromCodePoint(0x1E903).toLowerCase().codePointAt(0), 0x1E925); // ADLAM CAPITAL LETTER MIIM, ADLAM SMALL LETTER MIIM
+assertEq(String.fromCodePoint(0x1E904).toLowerCase().codePointAt(0), 0x1E926); // ADLAM CAPITAL LETTER BA, ADLAM SMALL LETTER BA
+assertEq(String.fromCodePoint(0x1E905).toLowerCase().codePointAt(0), 0x1E927); // ADLAM CAPITAL LETTER SINNYIIYHE, ADLAM SMALL LETTER SINNYIIYHE
+assertEq(String.fromCodePoint(0x1E906).toLowerCase().codePointAt(0), 0x1E928); // ADLAM CAPITAL LETTER PE, ADLAM SMALL LETTER PE
+assertEq(String.fromCodePoint(0x1E907).toLowerCase().codePointAt(0), 0x1E929); // ADLAM CAPITAL LETTER BHE, ADLAM SMALL LETTER BHE
+assertEq(String.fromCodePoint(0x1E908).toLowerCase().codePointAt(0), 0x1E92A); // ADLAM CAPITAL LETTER RA, ADLAM SMALL LETTER RA
+assertEq(String.fromCodePoint(0x1E909).toLowerCase().codePointAt(0), 0x1E92B); // ADLAM CAPITAL LETTER E, ADLAM SMALL LETTER E
+assertEq(String.fromCodePoint(0x1E90A).toLowerCase().codePointAt(0), 0x1E92C); // ADLAM CAPITAL LETTER FA, ADLAM SMALL LETTER FA
+assertEq(String.fromCodePoint(0x1E90B).toLowerCase().codePointAt(0), 0x1E92D); // ADLAM CAPITAL LETTER I, ADLAM SMALL LETTER I
+assertEq(String.fromCodePoint(0x1E90C).toLowerCase().codePointAt(0), 0x1E92E); // ADLAM CAPITAL LETTER O, ADLAM SMALL LETTER O
+assertEq(String.fromCodePoint(0x1E90D).toLowerCase().codePointAt(0), 0x1E92F); // ADLAM CAPITAL LETTER DHA, ADLAM SMALL LETTER DHA
+assertEq(String.fromCodePoint(0x1E90E).toLowerCase().codePointAt(0), 0x1E930); // ADLAM CAPITAL LETTER YHE, ADLAM SMALL LETTER YHE
+assertEq(String.fromCodePoint(0x1E90F).toLowerCase().codePointAt(0), 0x1E931); // ADLAM CAPITAL LETTER WAW, ADLAM SMALL LETTER WAW
+assertEq(String.fromCodePoint(0x1E910).toLowerCase().codePointAt(0), 0x1E932); // ADLAM CAPITAL LETTER NUN, ADLAM SMALL LETTER NUN
+assertEq(String.fromCodePoint(0x1E911).toLowerCase().codePointAt(0), 0x1E933); // ADLAM CAPITAL LETTER KAF, ADLAM SMALL LETTER KAF
+assertEq(String.fromCodePoint(0x1E912).toLowerCase().codePointAt(0), 0x1E934); // ADLAM CAPITAL LETTER YA, ADLAM SMALL LETTER YA
+assertEq(String.fromCodePoint(0x1E913).toLowerCase().codePointAt(0), 0x1E935); // ADLAM CAPITAL LETTER U, ADLAM SMALL LETTER U
+assertEq(String.fromCodePoint(0x1E914).toLowerCase().codePointAt(0), 0x1E936); // ADLAM CAPITAL LETTER JIIM, ADLAM SMALL LETTER JIIM
+assertEq(String.fromCodePoint(0x1E915).toLowerCase().codePointAt(0), 0x1E937); // ADLAM CAPITAL LETTER CHI, ADLAM SMALL LETTER CHI
+assertEq(String.fromCodePoint(0x1E916).toLowerCase().codePointAt(0), 0x1E938); // ADLAM CAPITAL LETTER HA, ADLAM SMALL LETTER HA
+assertEq(String.fromCodePoint(0x1E917).toLowerCase().codePointAt(0), 0x1E939); // ADLAM CAPITAL LETTER QAAF, ADLAM SMALL LETTER QAAF
+assertEq(String.fromCodePoint(0x1E918).toLowerCase().codePointAt(0), 0x1E93A); // ADLAM CAPITAL LETTER GA, ADLAM SMALL LETTER GA
+assertEq(String.fromCodePoint(0x1E919).toLowerCase().codePointAt(0), 0x1E93B); // ADLAM CAPITAL LETTER NYA, ADLAM SMALL LETTER NYA
+assertEq(String.fromCodePoint(0x1E91A).toLowerCase().codePointAt(0), 0x1E93C); // ADLAM CAPITAL LETTER TU, ADLAM SMALL LETTER TU
+assertEq(String.fromCodePoint(0x1E91B).toLowerCase().codePointAt(0), 0x1E93D); // ADLAM CAPITAL LETTER NHA, ADLAM SMALL LETTER NHA
+assertEq(String.fromCodePoint(0x1E91C).toLowerCase().codePointAt(0), 0x1E93E); // ADLAM CAPITAL LETTER VA, ADLAM SMALL LETTER VA
+assertEq(String.fromCodePoint(0x1E91D).toLowerCase().codePointAt(0), 0x1E93F); // ADLAM CAPITAL LETTER KHA, ADLAM SMALL LETTER KHA
+assertEq(String.fromCodePoint(0x1E91E).toLowerCase().codePointAt(0), 0x1E940); // ADLAM CAPITAL LETTER GBE, ADLAM SMALL LETTER GBE
+assertEq(String.fromCodePoint(0x1E91F).toLowerCase().codePointAt(0), 0x1E941); // ADLAM CAPITAL LETTER ZAL, ADLAM SMALL LETTER ZAL
+assertEq(String.fromCodePoint(0x1E920).toLowerCase().codePointAt(0), 0x1E942); // ADLAM CAPITAL LETTER KPO, ADLAM SMALL LETTER KPO
+assertEq(String.fromCodePoint(0x1E921).toLowerCase().codePointAt(0), 0x1E943); // ADLAM CAPITAL LETTER SHA, ADLAM SMALL LETTER SHA
if (typeof reportCompare === "function")
reportCompare(true, true);
diff --git a/js/src/tests/jstests.list b/js/src/tests/jstests.list
index 1e23a3da37..c27ad3f92a 100644
--- a/js/src/tests/jstests.list
+++ b/js/src/tests/jstests.list
@@ -56,6 +56,29 @@ skip script test262/ch10/10.6/10.6-14-b-4-s.js
skip script test262/ch10/10.6/10.6-13-b-1-s.js
skip script test262/ch10/10.6/10.6-13-b-2-s.js
+# ES2017 Intl legacy constructor semantics changes made these tests invalid
+# (bug 1328386).
+skip script test262/intl402/ch10/10.1/10.1.1_1.js
+skip script test262/intl402/ch10/10.1/10.1.2_a.js
+skip script test262/intl402/ch11/11.1/11.1.1_1.js
+skip script test262/intl402/ch12/12.1/12.1.1_1.js
+
+# Intl.{Collator,DateTimeFormat,NumberFormat}.prototype are now plain objects.
+skip script test262/intl402/ch10/10.3/10.3_a.js
+skip script test262/intl402/ch11/11.3/11.3_a.js
+skip script test262/intl402/ch12/12.3/12.3_a.js
+
+# Tests already removed upstream (https://github.com/tc39/test262/pull/807/files),
+# but apparently for the wrong reason.
+skip script test262/intl402/ch10/10.1/10.1.2.1_4.js
+skip script test262/intl402/ch11/11.1/11.1.2.1_4.js
+skip script test262/intl402/ch12/12.1/12.1.2.1_4.js
+
+# Tests not updated to follow new language tag canonicalisation.
+skip script test262/intl402/Locale/constructor-non-iana-canon.js
+skip script test262/intl402/Intl/getCanonicalLocales/preferred-variant.js
+skip script test262/intl402/Intl/getCanonicalLocales/non-iana-canon.js
+
#######################################################################
# Tests disabled due to jstest limitations wrt imported test262 tests #
#######################################################################
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js b/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js
new file mode 100644
index 0000000000..8a86e7f5d6
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/calendar-option.js
@@ -0,0 +1,69 @@
+// |reftest| skip-if(release_or_beta)
+
+const defaultLocale = "en";
+const defaultCalendar = new Intl.DateTimeFormat(defaultLocale).resolvedOptions().calendar;
+
+function createWithLocale(locale, calendar) {
+ return new Intl.DateTimeFormat(locale, {calendar});
+}
+
+function create(calendar) {
+ return createWithLocale(defaultLocale, calendar);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("gregory\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("gregory-toolongstring"), RangeError);
+
+// |calendar| can be set to |undefined|.
+let dtf = create(undefined);
+assertEq(dtf.resolvedOptions().calendar, defaultCalendar);
+
+// Unsupported calendars are ignored.
+dtf = create("xxxxxxxx");
+assertEq(dtf.resolvedOptions().calendar, defaultCalendar);
+
+// Calendars in options overwrite Unicode extension keyword.
+dtf = createWithLocale(`${defaultLocale}-u-ca-iso8601`, "japanese");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().calendar, "japanese");
+
+// |calendar| option ignores case.
+dtf = create("CHINESE");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().calendar, "chinese");
+
+const calendars = [
+ "buddhist", "chinese", "coptic", "dangi", "ethioaa", "ethiopic-amete-alem",
+ "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamic-umalqura",
+ "islamic-tbla", "islamic-civil", "islamic-rgsa", "iso8601", "japanese",
+ "persian", "roc", "islamicc",
+];
+
+// https://github.com/tc39/proposal-intl-locale/issues/96
+const canonical = {
+ "islamicc": "islamic-civil",
+ "ethiopic-amete-alem": "ethioaa",
+};
+
+for (let calendar of calendars) {
+ let dtf1 = new Intl.DateTimeFormat(`${defaultLocale}-u-ca-${calendar}`);
+ let dtf2 = new Intl.DateTimeFormat(defaultLocale, {calendar});
+
+ assertEq(dtf1.resolvedOptions().calendar, canonical[calendar] ?? calendar);
+ assertEq(dtf2.resolvedOptions().calendar, canonical[calendar] ?? calendar);
+
+ assertEq(dtf2.format(0), dtf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js b/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js
new file mode 100644
index 0000000000..b1a59c1c53
--- /dev/null
+++ b/js/src/tests/non262/Intl/DateTimeFormat/numberingSystem-option.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(release_or_beta)
+
+const defaultLocale = "en";
+const defaultNumberingSystem = new Intl.DateTimeFormat(defaultLocale).resolvedOptions().numberingSystem;
+
+function createWithLocale(locale, numberingSystem) {
+ return new Intl.DateTimeFormat(locale, {numberingSystem});
+}
+
+function create(numberingSystem) {
+ return createWithLocale(defaultLocale, numberingSystem);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("latn\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("latn-toolongstring"), RangeError);
+
+// |numberingSystem| can be set to |undefined|.
+let dtf = create(undefined);
+assertEq(dtf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Unsupported numbering systems are ignored.
+dtf = create("xxxxxxxx");
+assertEq(dtf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Numbering system in options overwrite Unicode extension keyword.
+dtf = createWithLocale(`${defaultLocale}-u-nu-thai`, "arab");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().numberingSystem, "arab");
+
+// |numberingSystem| option ignores case.
+dtf = create("ARAB");
+assertEq(dtf.resolvedOptions().locale, defaultLocale);
+assertEq(dtf.resolvedOptions().numberingSystem, "arab");
+
+const numberingSystems = [
+ "arab", "arabext", "bali", "beng", "deva",
+ "fullwide", "gujr", "guru", "hanidec", "khmr",
+ "knda", "laoo", "latn", "limb", "mlym",
+ "mong", "mymr", "orya", "tamldec", "telu",
+ "thai", "tibt",
+];
+
+for (let numberingSystem of numberingSystems) {
+ let dtf1 = new Intl.DateTimeFormat(`${defaultLocale}-u-nu-${numberingSystem}`);
+ let dtf2 = new Intl.DateTimeFormat(defaultLocale, {numberingSystem});
+
+ assertEq(dtf1.resolvedOptions().numberingSystem, numberingSystem);
+ assertEq(dtf2.resolvedOptions().numberingSystem, numberingSystem);
+
+ assertEq(dtf2.format(0), dtf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js b/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js
new file mode 100644
index 0000000000..2a96200757
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/apply-options-to-tag-canonicalize-twice.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+// ApplyOptionsToTag canonicalises the locale identifier before applying the
+// options. That means "und-Armn-SU" is first canonicalised to "und-Armn-AM",
+// then the language is changed to "ru". If "ru" were applied first, the result
+// would be "ru-Armn-RU" instead.
+assertEq(new Intl.Locale("und-Armn-SU", {language:"ru"}).toString(),
+ "ru-Armn-AM");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/browser.js b/js/src/tests/non262/Intl/Locale/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/browser.js
diff --git a/js/src/tests/non262/Intl/Locale/cross-compartment.js b/js/src/tests/non262/Intl/Locale/cross-compartment.js
new file mode 100644
index 0000000000..d3788e3eb7
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/cross-compartment.js
@@ -0,0 +1,28 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var g = newGlobal();
+
+var tag = "de-Latn-AT-u-ca-gregory-nu-latn-co-phonebk-kf-false-kn-hc-h23";
+var locale = new Intl.Locale(tag);
+var ccwLocale = new g.Intl.Locale(tag);
+
+for (var [key, {get, value = get}] of Object.entries(Object.getOwnPropertyDescriptors(Intl.Locale.prototype))) {
+ if (typeof value === "function") {
+ if (key !== "constructor") {
+ var expectedValue = value.call(locale);
+
+ if (typeof expectedValue === "string" || typeof expectedValue === "boolean") {
+ assertEq(value.call(ccwLocale), expectedValue, key);
+ } else if (expectedValue instanceof Intl.Locale) {
+ assertEq(value.call(ccwLocale).toString(), expectedValue.toString(), key);
+ } else {
+ throw new Error("unexpected result value");
+ }
+ } else {
+ assertEq(new value(ccwLocale).toString(), new value(locale).toString(), key);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/grandfathered.js b/js/src/tests/non262/Intl/Locale/grandfathered.js
new file mode 100644
index 0000000000..eb52bc62b4
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/grandfathered.js
@@ -0,0 +1,75 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var testData = [
+ {
+ tag: "cel-gaulish",
+ options: {
+ numberingSystem: "latn",
+ },
+ canonical: "xtg-u-nu-latn-x-cel-gaulish",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "cel-gaulish",
+ options: {
+ region: "FR",
+ numberingSystem: "latn",
+ },
+ canonical: "xtg-FR-u-nu-latn-x-cel-gaulish",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "art-lojban",
+ options: {
+ numberingSystem: "latn",
+ },
+ canonical: "jbo-u-nu-latn",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+
+ {
+ tag: "art-lojban",
+ options: {
+ region: "ZZ",
+ numberingSystem: "latn",
+ },
+ canonical: "jbo-ZZ-u-nu-latn",
+ extensions: {
+ numberingSystem: "latn",
+ },
+ },
+];
+
+for (var {tag, options, canonical, extensions} of testData) {
+ var loc = new Intl.Locale(tag, options);
+ assertEq(loc.toString(), canonical);
+
+ for (var [name, value] of Object.entries(extensions)) {
+ assertEq(loc[name], value);
+ }
+}
+
+var errorTestData = [
+ "en-gb-oed",
+ "i-default",
+ "sgn-ch-de",
+ "zh-min",
+ "zh-min-nan",
+ "zh-hakka-hakka",
+];
+
+for (var tag of errorTestData) {
+ assertThrowsInstanceOf(() => new Intl.Locale(tag), RangeError);
+ assertThrowsInstanceOf(() => new Intl.Locale(tag, {}), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js b/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js
new file mode 100644
index 0000000000..7411ac76c7
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/likely-subtags-generated.js
@@ -0,0 +1,3433 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+// Generated by make_intl_data.py. DO NOT EDIT.
+
+// Extracted from likelySubtags.xml.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+var maxLikelySubtags = {
+ "aa": "aa-Latn-ET",
+ "aai": "aai-Latn-ZZ",
+ "aak": "aak-Latn-ZZ",
+ "aau": "aau-Latn-ZZ",
+ "ab": "ab-Cyrl-GE",
+ "abi": "abi-Latn-ZZ",
+ "abq": "abq-Cyrl-ZZ",
+ "abr": "abr-Latn-GH",
+ "abt": "abt-Latn-ZZ",
+ "aby": "aby-Latn-ZZ",
+ "acd": "acd-Latn-ZZ",
+ "ace": "ace-Latn-ID",
+ "ach": "ach-Latn-UG",
+ "ada": "ada-Latn-GH",
+ "ade": "ade-Latn-ZZ",
+ "adj": "adj-Latn-ZZ",
+ "ady": "ady-Cyrl-RU",
+ "adz": "adz-Latn-ZZ",
+ "ae": "ae-Avst-IR",
+ "aeb": "aeb-Arab-TN",
+ "aey": "aey-Latn-ZZ",
+ "af": "af-Latn-ZA",
+ "agc": "agc-Latn-ZZ",
+ "agd": "agd-Latn-ZZ",
+ "agg": "agg-Latn-ZZ",
+ "agm": "agm-Latn-ZZ",
+ "ago": "ago-Latn-ZZ",
+ "agq": "agq-Latn-CM",
+ "aha": "aha-Latn-ZZ",
+ "ahl": "ahl-Latn-ZZ",
+ "aho": "aho-Ahom-IN",
+ "ajg": "ajg-Latn-ZZ",
+ "ak": "ak-Latn-GH",
+ "akk": "akk-Xsux-IQ",
+ "ala": "ala-Latn-ZZ",
+ "ali": "ali-Latn-ZZ",
+ "aln": "aln-Latn-XK",
+ "alt": "alt-Cyrl-RU",
+ "am": "am-Ethi-ET",
+ "amm": "amm-Latn-ZZ",
+ "amn": "amn-Latn-ZZ",
+ "amo": "amo-Latn-NG",
+ "amp": "amp-Latn-ZZ",
+ "anc": "anc-Latn-ZZ",
+ "ank": "ank-Latn-ZZ",
+ "ann": "ann-Latn-ZZ",
+ "any": "any-Latn-ZZ",
+ "aoj": "aoj-Latn-ZZ",
+ "aom": "aom-Latn-ZZ",
+ "aoz": "aoz-Latn-ID",
+ "apc": "apc-Arab-ZZ",
+ "apd": "apd-Arab-TG",
+ "ape": "ape-Latn-ZZ",
+ "apr": "apr-Latn-ZZ",
+ "aps": "aps-Latn-ZZ",
+ "apz": "apz-Latn-ZZ",
+ "ar": "ar-Arab-EG",
+ "arc": "arc-Armi-IR",
+ "arc-Nbat": "arc-Nbat-JO",
+ "arc-Palm": "arc-Palm-SY",
+ "arh": "arh-Latn-ZZ",
+ "arn": "arn-Latn-CL",
+ "aro": "aro-Latn-BO",
+ "arq": "arq-Arab-DZ",
+ "ary": "ary-Arab-MA",
+ "arz": "arz-Arab-EG",
+ "as": "as-Beng-IN",
+ "asa": "asa-Latn-TZ",
+ "ase": "ase-Sgnw-US",
+ "asg": "asg-Latn-ZZ",
+ "aso": "aso-Latn-ZZ",
+ "ast": "ast-Latn-ES",
+ "ata": "ata-Latn-ZZ",
+ "atg": "atg-Latn-ZZ",
+ "atj": "atj-Latn-CA",
+ "auy": "auy-Latn-ZZ",
+ "av": "av-Cyrl-RU",
+ "avl": "avl-Arab-ZZ",
+ "avn": "avn-Latn-ZZ",
+ "avt": "avt-Latn-ZZ",
+ "avu": "avu-Latn-ZZ",
+ "awa": "awa-Deva-IN",
+ "awb": "awb-Latn-ZZ",
+ "awo": "awo-Latn-ZZ",
+ "awx": "awx-Latn-ZZ",
+ "ay": "ay-Latn-BO",
+ "ayb": "ayb-Latn-ZZ",
+ "az": "az-Latn-AZ",
+ "az-Arab": "az-Arab-IR",
+ "az-IQ": "az-Arab-IQ",
+ "az-IR": "az-Arab-IR",
+ "az-RU": "az-Cyrl-RU",
+ "ba": "ba-Cyrl-RU",
+ "bal": "bal-Arab-PK",
+ "ban": "ban-Latn-ID",
+ "bap": "bap-Deva-NP",
+ "bar": "bar-Latn-AT",
+ "bas": "bas-Latn-CM",
+ "bav": "bav-Latn-ZZ",
+ "bax": "bax-Bamu-CM",
+ "bba": "bba-Latn-ZZ",
+ "bbb": "bbb-Latn-ZZ",
+ "bbc": "bbc-Latn-ID",
+ "bbd": "bbd-Latn-ZZ",
+ "bbj": "bbj-Latn-CM",
+ "bbp": "bbp-Latn-ZZ",
+ "bbr": "bbr-Latn-ZZ",
+ "bcf": "bcf-Latn-ZZ",
+ "bch": "bch-Latn-ZZ",
+ "bci": "bci-Latn-CI",
+ "bcm": "bcm-Latn-ZZ",
+ "bcn": "bcn-Latn-ZZ",
+ "bco": "bco-Latn-ZZ",
+ "bcq": "bcq-Ethi-ZZ",
+ "bcu": "bcu-Latn-ZZ",
+ "bdd": "bdd-Latn-ZZ",
+ "be": "be-Cyrl-BY",
+ "bef": "bef-Latn-ZZ",
+ "beh": "beh-Latn-ZZ",
+ "bej": "bej-Arab-SD",
+ "bem": "bem-Latn-ZM",
+ "bet": "bet-Latn-ZZ",
+ "bew": "bew-Latn-ID",
+ "bex": "bex-Latn-ZZ",
+ "bez": "bez-Latn-TZ",
+ "bfd": "bfd-Latn-CM",
+ "bfq": "bfq-Taml-IN",
+ "bft": "bft-Arab-PK",
+ "bfy": "bfy-Deva-IN",
+ "bg": "bg-Cyrl-BG",
+ "bgc": "bgc-Deva-IN",
+ "bgn": "bgn-Arab-PK",
+ "bgx": "bgx-Grek-TR",
+ "bhb": "bhb-Deva-IN",
+ "bhg": "bhg-Latn-ZZ",
+ "bhi": "bhi-Deva-IN",
+ "bhk": "bhk-Latn-PH",
+ "bhl": "bhl-Latn-ZZ",
+ "bho": "bho-Deva-IN",
+ "bhy": "bhy-Latn-ZZ",
+ "bi": "bi-Latn-VU",
+ "bib": "bib-Latn-ZZ",
+ "big": "big-Latn-ZZ",
+ "bik": "bik-Latn-PH",
+ "bim": "bim-Latn-ZZ",
+ "bin": "bin-Latn-NG",
+ "bio": "bio-Latn-ZZ",
+ "biq": "biq-Latn-ZZ",
+ "bjh": "bjh-Latn-ZZ",
+ "bji": "bji-Ethi-ZZ",
+ "bjj": "bjj-Deva-IN",
+ "bjn": "bjn-Latn-ID",
+ "bjo": "bjo-Latn-ZZ",
+ "bjr": "bjr-Latn-ZZ",
+ "bjt": "bjt-Latn-SN",
+ "bjz": "bjz-Latn-ZZ",
+ "bkc": "bkc-Latn-ZZ",
+ "bkm": "bkm-Latn-CM",
+ "bkq": "bkq-Latn-ZZ",
+ "bku": "bku-Latn-PH",
+ "bkv": "bkv-Latn-ZZ",
+ "blt": "blt-Tavt-VN",
+ "bm": "bm-Latn-ML",
+ "bmh": "bmh-Latn-ZZ",
+ "bmk": "bmk-Latn-ZZ",
+ "bmq": "bmq-Latn-ML",
+ "bmu": "bmu-Latn-ZZ",
+ "bn": "bn-Beng-BD",
+ "bng": "bng-Latn-ZZ",
+ "bnm": "bnm-Latn-ZZ",
+ "bnp": "bnp-Latn-ZZ",
+ "bo": "bo-Tibt-CN",
+ "boj": "boj-Latn-ZZ",
+ "bom": "bom-Latn-ZZ",
+ "bon": "bon-Latn-ZZ",
+ "bpy": "bpy-Beng-IN",
+ "bqc": "bqc-Latn-ZZ",
+ "bqi": "bqi-Arab-IR",
+ "bqp": "bqp-Latn-ZZ",
+ "bqv": "bqv-Latn-CI",
+ "br": "br-Latn-FR",
+ "bra": "bra-Deva-IN",
+ "brh": "brh-Arab-PK",
+ "brx": "brx-Deva-IN",
+ "brz": "brz-Latn-ZZ",
+ "bs": "bs-Latn-BA",
+ "bsj": "bsj-Latn-ZZ",
+ "bsq": "bsq-Bass-LR",
+ "bss": "bss-Latn-CM",
+ "bst": "bst-Ethi-ZZ",
+ "bto": "bto-Latn-PH",
+ "btt": "btt-Latn-ZZ",
+ "btv": "btv-Deva-PK",
+ "bua": "bua-Cyrl-RU",
+ "buc": "buc-Latn-YT",
+ "bud": "bud-Latn-ZZ",
+ "bug": "bug-Latn-ID",
+ "buk": "buk-Latn-ZZ",
+ "bum": "bum-Latn-CM",
+ "buo": "buo-Latn-ZZ",
+ "bus": "bus-Latn-ZZ",
+ "buu": "buu-Latn-ZZ",
+ "bvb": "bvb-Latn-GQ",
+ "bwd": "bwd-Latn-ZZ",
+ "bwr": "bwr-Latn-ZZ",
+ "bxh": "bxh-Latn-ZZ",
+ "bye": "bye-Latn-ZZ",
+ "byn": "byn-Ethi-ER",
+ "byr": "byr-Latn-ZZ",
+ "bys": "bys-Latn-ZZ",
+ "byv": "byv-Latn-CM",
+ "byx": "byx-Latn-ZZ",
+ "bza": "bza-Latn-ZZ",
+ "bze": "bze-Latn-ML",
+ "bzf": "bzf-Latn-ZZ",
+ "bzh": "bzh-Latn-ZZ",
+ "bzw": "bzw-Latn-ZZ",
+ "ca": "ca-Latn-ES",
+ "can": "can-Latn-ZZ",
+ "cbj": "cbj-Latn-ZZ",
+ "cch": "cch-Latn-NG",
+ "ccp": "ccp-Cakm-BD",
+ "ce": "ce-Cyrl-RU",
+ "ceb": "ceb-Latn-PH",
+ "cfa": "cfa-Latn-ZZ",
+ "cgg": "cgg-Latn-UG",
+ "ch": "ch-Latn-GU",
+ "chk": "chk-Latn-FM",
+ "chm": "chm-Cyrl-RU",
+ "cho": "cho-Latn-US",
+ "chp": "chp-Latn-CA",
+ "chr": "chr-Cher-US",
+ "cja": "cja-Arab-KH",
+ "cjm": "cjm-Cham-VN",
+ "cjv": "cjv-Latn-ZZ",
+ "ckb": "ckb-Arab-IQ",
+ "ckl": "ckl-Latn-ZZ",
+ "cko": "cko-Latn-ZZ",
+ "cky": "cky-Latn-ZZ",
+ "cla": "cla-Latn-ZZ",
+ "cme": "cme-Latn-ZZ",
+ "cmg": "cmg-Soyo-MN",
+ "co": "co-Latn-FR",
+ "cop": "cop-Copt-EG",
+ "cps": "cps-Latn-PH",
+ "cr": "cr-Cans-CA",
+ "crh": "crh-Cyrl-UA",
+ "crj": "crj-Cans-CA",
+ "crk": "crk-Cans-CA",
+ "crl": "crl-Cans-CA",
+ "crm": "crm-Cans-CA",
+ "crs": "crs-Latn-SC",
+ "cs": "cs-Latn-CZ",
+ "csb": "csb-Latn-PL",
+ "csw": "csw-Cans-CA",
+ "ctd": "ctd-Pauc-MM",
+ "cu": "cu-Cyrl-RU",
+ "cu-Glag": "cu-Glag-BG",
+ "cv": "cv-Cyrl-RU",
+ "cy": "cy-Latn-GB",
+ "da": "da-Latn-DK",
+ "dad": "dad-Latn-ZZ",
+ "daf": "daf-Latn-ZZ",
+ "dag": "dag-Latn-ZZ",
+ "dah": "dah-Latn-ZZ",
+ "dak": "dak-Latn-US",
+ "dar": "dar-Cyrl-RU",
+ "dav": "dav-Latn-KE",
+ "dbd": "dbd-Latn-ZZ",
+ "dbq": "dbq-Latn-ZZ",
+ "dcc": "dcc-Arab-IN",
+ "ddn": "ddn-Latn-ZZ",
+ "de": "de-Latn-DE",
+ "ded": "ded-Latn-ZZ",
+ "den": "den-Latn-CA",
+ "dga": "dga-Latn-ZZ",
+ "dgh": "dgh-Latn-ZZ",
+ "dgi": "dgi-Latn-ZZ",
+ "dgl": "dgl-Arab-ZZ",
+ "dgr": "dgr-Latn-CA",
+ "dgz": "dgz-Latn-ZZ",
+ "dia": "dia-Latn-ZZ",
+ "dje": "dje-Latn-NE",
+ "dnj": "dnj-Latn-CI",
+ "dob": "dob-Latn-ZZ",
+ "doi": "doi-Arab-IN",
+ "dop": "dop-Latn-ZZ",
+ "dow": "dow-Latn-ZZ",
+ "dri": "dri-Latn-ZZ",
+ "drs": "drs-Ethi-ZZ",
+ "dsb": "dsb-Latn-DE",
+ "dtm": "dtm-Latn-ML",
+ "dtp": "dtp-Latn-MY",
+ "dts": "dts-Latn-ZZ",
+ "dty": "dty-Deva-NP",
+ "dua": "dua-Latn-CM",
+ "duc": "duc-Latn-ZZ",
+ "dud": "dud-Latn-ZZ",
+ "dug": "dug-Latn-ZZ",
+ "dv": "dv-Thaa-MV",
+ "dva": "dva-Latn-ZZ",
+ "dww": "dww-Latn-ZZ",
+ "dyo": "dyo-Latn-SN",
+ "dyu": "dyu-Latn-BF",
+ "dz": "dz-Tibt-BT",
+ "dzg": "dzg-Latn-ZZ",
+ "ebu": "ebu-Latn-KE",
+ "ee": "ee-Latn-GH",
+ "efi": "efi-Latn-NG",
+ "egl": "egl-Latn-IT",
+ "egy": "egy-Egyp-EG",
+ "eka": "eka-Latn-ZZ",
+ "eky": "eky-Kali-MM",
+ "el": "el-Grek-GR",
+ "ema": "ema-Latn-ZZ",
+ "emi": "emi-Latn-ZZ",
+ "en": "en-Latn-US",
+ "en-Shaw": "en-Shaw-GB",
+ "enn": "enn-Latn-ZZ",
+ "enq": "enq-Latn-ZZ",
+ "eo": "eo-Latn-001",
+ "eri": "eri-Latn-ZZ",
+ "es": "es-Latn-ES",
+ "esg": "esg-Gonm-IN",
+ "esu": "esu-Latn-US",
+ "et": "et-Latn-EE",
+ "etr": "etr-Latn-ZZ",
+ "ett": "ett-Ital-IT",
+ "etu": "etu-Latn-ZZ",
+ "etx": "etx-Latn-ZZ",
+ "eu": "eu-Latn-ES",
+ "ewo": "ewo-Latn-CM",
+ "ext": "ext-Latn-ES",
+ "fa": "fa-Arab-IR",
+ "faa": "faa-Latn-ZZ",
+ "fab": "fab-Latn-ZZ",
+ "fag": "fag-Latn-ZZ",
+ "fai": "fai-Latn-ZZ",
+ "fan": "fan-Latn-GQ",
+ "ff": "ff-Latn-SN",
+ "ff-Adlm": "ff-Adlm-GN",
+ "ffi": "ffi-Latn-ZZ",
+ "ffm": "ffm-Latn-ML",
+ "fi": "fi-Latn-FI",
+ "fia": "fia-Arab-SD",
+ "fil": "fil-Latn-PH",
+ "fit": "fit-Latn-SE",
+ "fj": "fj-Latn-FJ",
+ "flr": "flr-Latn-ZZ",
+ "fmp": "fmp-Latn-ZZ",
+ "fo": "fo-Latn-FO",
+ "fod": "fod-Latn-ZZ",
+ "fon": "fon-Latn-BJ",
+ "for": "for-Latn-ZZ",
+ "fpe": "fpe-Latn-ZZ",
+ "fqs": "fqs-Latn-ZZ",
+ "fr": "fr-Latn-FR",
+ "frc": "frc-Latn-US",
+ "frp": "frp-Latn-FR",
+ "frr": "frr-Latn-DE",
+ "frs": "frs-Latn-DE",
+ "fub": "fub-Arab-CM",
+ "fud": "fud-Latn-WF",
+ "fue": "fue-Latn-ZZ",
+ "fuf": "fuf-Latn-GN",
+ "fuh": "fuh-Latn-ZZ",
+ "fuq": "fuq-Latn-NE",
+ "fur": "fur-Latn-IT",
+ "fuv": "fuv-Latn-NG",
+ "fuy": "fuy-Latn-ZZ",
+ "fvr": "fvr-Latn-SD",
+ "fy": "fy-Latn-NL",
+ "ga": "ga-Latn-IE",
+ "gaa": "gaa-Latn-GH",
+ "gaf": "gaf-Latn-ZZ",
+ "gag": "gag-Latn-MD",
+ "gah": "gah-Latn-ZZ",
+ "gaj": "gaj-Latn-ZZ",
+ "gam": "gam-Latn-ZZ",
+ "gan": "gan-Hans-CN",
+ "gaw": "gaw-Latn-ZZ",
+ "gay": "gay-Latn-ID",
+ "gba": "gba-Latn-ZZ",
+ "gbf": "gbf-Latn-ZZ",
+ "gbm": "gbm-Deva-IN",
+ "gby": "gby-Latn-ZZ",
+ "gbz": "gbz-Arab-IR",
+ "gcr": "gcr-Latn-GF",
+ "gd": "gd-Latn-GB",
+ "gde": "gde-Latn-ZZ",
+ "gdn": "gdn-Latn-ZZ",
+ "gdr": "gdr-Latn-ZZ",
+ "geb": "geb-Latn-ZZ",
+ "gej": "gej-Latn-ZZ",
+ "gel": "gel-Latn-ZZ",
+ "gez": "gez-Ethi-ET",
+ "gfk": "gfk-Latn-ZZ",
+ "ggn": "gvr-Deva-NP",
+ "ghs": "ghs-Latn-ZZ",
+ "gil": "gil-Latn-KI",
+ "gim": "gim-Latn-ZZ",
+ "gjk": "gjk-Arab-PK",
+ "gjn": "gjn-Latn-ZZ",
+ "gju": "gju-Arab-PK",
+ "gkn": "gkn-Latn-ZZ",
+ "gkp": "gkp-Latn-ZZ",
+ "gl": "gl-Latn-ES",
+ "glk": "glk-Arab-IR",
+ "gmm": "gmm-Latn-ZZ",
+ "gmv": "gmv-Ethi-ZZ",
+ "gn": "gn-Latn-PY",
+ "gnd": "gnd-Latn-ZZ",
+ "gng": "gng-Latn-ZZ",
+ "god": "god-Latn-ZZ",
+ "gof": "gof-Ethi-ZZ",
+ "goi": "goi-Latn-ZZ",
+ "gom": "gom-Deva-IN",
+ "gon": "gon-Telu-IN",
+ "gor": "gor-Latn-ID",
+ "gos": "gos-Latn-NL",
+ "got": "got-Goth-UA",
+ "grb": "grb-Latn-ZZ",
+ "grc": "grc-Cprt-CY",
+ "grc-Linb": "grc-Linb-GR",
+ "grt": "grt-Beng-IN",
+ "grw": "grw-Latn-ZZ",
+ "gsw": "gsw-Latn-CH",
+ "gu": "gu-Gujr-IN",
+ "gub": "gub-Latn-BR",
+ "guc": "guc-Latn-CO",
+ "gud": "gud-Latn-ZZ",
+ "gur": "gur-Latn-GH",
+ "guw": "guw-Latn-ZZ",
+ "gux": "gux-Latn-ZZ",
+ "guz": "guz-Latn-KE",
+ "gv": "gv-Latn-IM",
+ "gvf": "gvf-Latn-ZZ",
+ "gvr": "gvr-Deva-NP",
+ "gvs": "gvs-Latn-ZZ",
+ "gwc": "gwc-Arab-ZZ",
+ "gwi": "gwi-Latn-CA",
+ "gwt": "gwt-Arab-ZZ",
+ "gyi": "gyi-Latn-ZZ",
+ "ha": "ha-Latn-NG",
+ "ha-CM": "ha-Arab-CM",
+ "ha-SD": "ha-Arab-SD",
+ "hag": "hag-Latn-ZZ",
+ "hak": "hak-Hans-CN",
+ "ham": "ham-Latn-ZZ",
+ "haw": "haw-Latn-US",
+ "haz": "haz-Arab-AF",
+ "hbb": "hbb-Latn-ZZ",
+ "hdy": "hdy-Ethi-ZZ",
+ "he": "he-Hebr-IL",
+ "hhy": "hhy-Latn-ZZ",
+ "hi": "hi-Deva-IN",
+ "hia": "hia-Latn-ZZ",
+ "hif": "hif-Latn-FJ",
+ "hig": "hig-Latn-ZZ",
+ "hih": "hih-Latn-ZZ",
+ "hil": "hil-Latn-PH",
+ "hla": "hla-Latn-ZZ",
+ "hlu": "hlu-Hluw-TR",
+ "hmd": "hmd-Plrd-CN",
+ "hmt": "hmt-Latn-ZZ",
+ "hnd": "hnd-Arab-PK",
+ "hne": "hne-Deva-IN",
+ "hnj": "hnj-Hmng-LA",
+ "hnn": "hnn-Latn-PH",
+ "hno": "hno-Arab-PK",
+ "ho": "ho-Latn-PG",
+ "hoc": "hoc-Deva-IN",
+ "hoj": "hoj-Deva-IN",
+ "hot": "hot-Latn-ZZ",
+ "hr": "hr-Latn-HR",
+ "hsb": "hsb-Latn-DE",
+ "hsn": "hsn-Hans-CN",
+ "ht": "ht-Latn-HT",
+ "hu": "hu-Latn-HU",
+ "hui": "hui-Latn-ZZ",
+ "hy": "hy-Armn-AM",
+ "hz": "hz-Latn-NA",
+ "ia": "ia-Latn-001",
+ "ian": "ian-Latn-ZZ",
+ "iar": "iar-Latn-ZZ",
+ "iba": "iba-Latn-MY",
+ "ibb": "ibb-Latn-NG",
+ "iby": "iby-Latn-ZZ",
+ "ica": "ica-Latn-ZZ",
+ "ich": "ich-Latn-ZZ",
+ "id": "id-Latn-ID",
+ "idd": "idd-Latn-ZZ",
+ "idi": "idi-Latn-ZZ",
+ "idu": "idu-Latn-ZZ",
+ "ife": "ife-Latn-TG",
+ "ig": "ig-Latn-NG",
+ "igb": "igb-Latn-ZZ",
+ "ige": "ige-Latn-ZZ",
+ "ii": "ii-Yiii-CN",
+ "ijj": "ijj-Latn-ZZ",
+ "ik": "ik-Latn-US",
+ "ikk": "ikk-Latn-ZZ",
+ "ikt": "ikt-Latn-CA",
+ "ikw": "ikw-Latn-ZZ",
+ "ikx": "ikx-Latn-ZZ",
+ "ilo": "ilo-Latn-PH",
+ "imo": "imo-Latn-ZZ",
+ "in": "id-Latn-ID",
+ "inh": "inh-Cyrl-RU",
+ "io": "io-Latn-001",
+ "iou": "iou-Latn-ZZ",
+ "iri": "iri-Latn-ZZ",
+ "is": "is-Latn-IS",
+ "it": "it-Latn-IT",
+ "iu": "iu-Cans-CA",
+ "iw": "he-Hebr-IL",
+ "iwm": "iwm-Latn-ZZ",
+ "iws": "iws-Latn-ZZ",
+ "izh": "izh-Latn-RU",
+ "izi": "izi-Latn-ZZ",
+ "ja": "ja-Jpan-JP",
+ "jab": "jab-Latn-ZZ",
+ "jam": "jam-Latn-JM",
+ "jbo": "jbo-Latn-001",
+ "jbu": "jbu-Latn-ZZ",
+ "jen": "jen-Latn-ZZ",
+ "jgk": "jgk-Latn-ZZ",
+ "jgo": "jgo-Latn-CM",
+ "ji": "yi-Hebr-001",
+ "jib": "jib-Latn-ZZ",
+ "jmc": "jmc-Latn-TZ",
+ "jml": "jml-Deva-NP",
+ "jra": "jra-Latn-ZZ",
+ "jut": "jut-Latn-DK",
+ "jv": "jv-Latn-ID",
+ "jw": "jv-Latn-ID",
+ "ka": "ka-Geor-GE",
+ "kaa": "kaa-Cyrl-UZ",
+ "kab": "kab-Latn-DZ",
+ "kac": "kac-Latn-MM",
+ "kad": "kad-Latn-ZZ",
+ "kai": "kai-Latn-ZZ",
+ "kaj": "kaj-Latn-NG",
+ "kam": "kam-Latn-KE",
+ "kao": "kao-Latn-ML",
+ "kbd": "kbd-Cyrl-RU",
+ "kbm": "kbm-Latn-ZZ",
+ "kbp": "kbp-Latn-ZZ",
+ "kbq": "kbq-Latn-ZZ",
+ "kbx": "kbx-Latn-ZZ",
+ "kby": "kby-Arab-NE",
+ "kcg": "kcg-Latn-NG",
+ "kck": "kck-Latn-ZW",
+ "kcl": "kcl-Latn-ZZ",
+ "kct": "kct-Latn-ZZ",
+ "kde": "kde-Latn-TZ",
+ "kdh": "kdh-Arab-TG",
+ "kdl": "kdl-Latn-ZZ",
+ "kdt": "kdt-Thai-TH",
+ "kea": "kea-Latn-CV",
+ "ken": "ken-Latn-CM",
+ "kez": "kez-Latn-ZZ",
+ "kfo": "kfo-Latn-CI",
+ "kfr": "kfr-Deva-IN",
+ "kfy": "kfy-Deva-IN",
+ "kg": "kg-Latn-CD",
+ "kge": "kge-Latn-ID",
+ "kgf": "kgf-Latn-ZZ",
+ "kgp": "kgp-Latn-BR",
+ "kha": "kha-Latn-IN",
+ "khb": "khb-Talu-CN",
+ "khn": "khn-Deva-IN",
+ "khq": "khq-Latn-ML",
+ "khs": "khs-Latn-ZZ",
+ "kht": "kht-Mymr-IN",
+ "khw": "khw-Arab-PK",
+ "khz": "khz-Latn-ZZ",
+ "ki": "ki-Latn-KE",
+ "kij": "kij-Latn-ZZ",
+ "kiu": "kiu-Latn-TR",
+ "kiw": "kiw-Latn-ZZ",
+ "kj": "kj-Latn-NA",
+ "kjd": "kjd-Latn-ZZ",
+ "kjg": "kjg-Laoo-LA",
+ "kjs": "kjs-Latn-ZZ",
+ "kjy": "kjy-Latn-ZZ",
+ "kk": "kk-Cyrl-KZ",
+ "kk-AF": "kk-Arab-AF",
+ "kk-Arab": "kk-Arab-CN",
+ "kk-CN": "kk-Arab-CN",
+ "kk-IR": "kk-Arab-IR",
+ "kk-MN": "kk-Arab-MN",
+ "kkc": "kkc-Latn-ZZ",
+ "kkj": "kkj-Latn-CM",
+ "kl": "kl-Latn-GL",
+ "kln": "kln-Latn-KE",
+ "klq": "klq-Latn-ZZ",
+ "klt": "klt-Latn-ZZ",
+ "klx": "klx-Latn-ZZ",
+ "km": "km-Khmr-KH",
+ "kmb": "kmb-Latn-AO",
+ "kmh": "kmh-Latn-ZZ",
+ "kmo": "kmo-Latn-ZZ",
+ "kms": "kms-Latn-ZZ",
+ "kmu": "kmu-Latn-ZZ",
+ "kmw": "kmw-Latn-ZZ",
+ "kn": "kn-Knda-IN",
+ "knf": "knf-Latn-GW",
+ "knp": "knp-Latn-ZZ",
+ "ko": "ko-Kore-KR",
+ "koi": "koi-Cyrl-RU",
+ "kok": "kok-Deva-IN",
+ "kol": "kol-Latn-ZZ",
+ "kos": "kos-Latn-FM",
+ "koz": "koz-Latn-ZZ",
+ "kpe": "kpe-Latn-LR",
+ "kpf": "kpf-Latn-ZZ",
+ "kpo": "kpo-Latn-ZZ",
+ "kpr": "kpr-Latn-ZZ",
+ "kpx": "kpx-Latn-ZZ",
+ "kqb": "kqb-Latn-ZZ",
+ "kqf": "kqf-Latn-ZZ",
+ "kqs": "kqs-Latn-ZZ",
+ "kqy": "kqy-Ethi-ZZ",
+ "kr": "kr-Latn-ZZ",
+ "krc": "krc-Cyrl-RU",
+ "kri": "kri-Latn-SL",
+ "krj": "krj-Latn-PH",
+ "krl": "krl-Latn-RU",
+ "krs": "krs-Latn-ZZ",
+ "kru": "kru-Deva-IN",
+ "ks": "ks-Arab-IN",
+ "ksb": "ksb-Latn-TZ",
+ "ksd": "ksd-Latn-ZZ",
+ "ksf": "ksf-Latn-CM",
+ "ksh": "ksh-Latn-DE",
+ "ksj": "ksj-Latn-ZZ",
+ "ksr": "ksr-Latn-ZZ",
+ "ktb": "ktb-Ethi-ZZ",
+ "ktm": "ktm-Latn-ZZ",
+ "kto": "kto-Latn-ZZ",
+ "ku": "ku-Latn-TR",
+ "ku-Arab": "ku-Arab-IQ",
+ "ku-LB": "ku-Arab-LB",
+ "kub": "kub-Latn-ZZ",
+ "kud": "kud-Latn-ZZ",
+ "kue": "kue-Latn-ZZ",
+ "kuj": "kuj-Latn-ZZ",
+ "kum": "kum-Cyrl-RU",
+ "kun": "kun-Latn-ZZ",
+ "kup": "kup-Latn-ZZ",
+ "kus": "kus-Latn-ZZ",
+ "kv": "kv-Cyrl-RU",
+ "kvg": "kvg-Latn-ZZ",
+ "kvr": "kvr-Latn-ID",
+ "kvx": "kvx-Arab-PK",
+ "kw": "kw-Latn-GB",
+ "kwj": "kwj-Latn-ZZ",
+ "kwo": "kwo-Latn-ZZ",
+ "kxa": "kxa-Latn-ZZ",
+ "kxc": "kxc-Ethi-ZZ",
+ "kxm": "kxm-Thai-TH",
+ "kxp": "kxp-Arab-PK",
+ "kxw": "kxw-Latn-ZZ",
+ "kxz": "kxz-Latn-ZZ",
+ "ky": "ky-Cyrl-KG",
+ "ky-Arab": "ky-Arab-CN",
+ "ky-CN": "ky-Arab-CN",
+ "ky-Latn": "ky-Latn-TR",
+ "ky-TR": "ky-Latn-TR",
+ "kye": "kye-Latn-ZZ",
+ "kyx": "kyx-Latn-ZZ",
+ "kzr": "kzr-Latn-ZZ",
+ "la": "la-Latn-VA",
+ "lab": "lab-Lina-GR",
+ "lad": "lad-Hebr-IL",
+ "lag": "lag-Latn-TZ",
+ "lah": "lah-Arab-PK",
+ "laj": "laj-Latn-UG",
+ "las": "las-Latn-ZZ",
+ "lb": "lb-Latn-LU",
+ "lbe": "lbe-Cyrl-RU",
+ "lbu": "lbu-Latn-ZZ",
+ "lbw": "lbw-Latn-ID",
+ "lcm": "lcm-Latn-ZZ",
+ "lcp": "lcp-Thai-CN",
+ "ldb": "ldb-Latn-ZZ",
+ "led": "led-Latn-ZZ",
+ "lee": "lee-Latn-ZZ",
+ "lem": "lem-Latn-ZZ",
+ "lep": "lep-Lepc-IN",
+ "leq": "leq-Latn-ZZ",
+ "leu": "leu-Latn-ZZ",
+ "lez": "lez-Cyrl-RU",
+ "lg": "lg-Latn-UG",
+ "lgg": "lgg-Latn-ZZ",
+ "li": "li-Latn-NL",
+ "lia": "lia-Latn-ZZ",
+ "lid": "lid-Latn-ZZ",
+ "lif": "lif-Deva-NP",
+ "lif-Limb": "lif-Limb-IN",
+ "lig": "lig-Latn-ZZ",
+ "lih": "lih-Latn-ZZ",
+ "lij": "lij-Latn-IT",
+ "lis": "lis-Lisu-CN",
+ "ljp": "ljp-Latn-ID",
+ "lki": "lki-Arab-IR",
+ "lkt": "lkt-Latn-US",
+ "lle": "lle-Latn-ZZ",
+ "lln": "lln-Latn-ZZ",
+ "lmn": "lmn-Telu-IN",
+ "lmo": "lmo-Latn-IT",
+ "lmp": "lmp-Latn-ZZ",
+ "ln": "ln-Latn-CD",
+ "lns": "lns-Latn-ZZ",
+ "lnu": "lnu-Latn-ZZ",
+ "lo": "lo-Laoo-LA",
+ "loj": "loj-Latn-ZZ",
+ "lok": "lok-Latn-ZZ",
+ "lol": "lol-Latn-CD",
+ "lor": "lor-Latn-ZZ",
+ "los": "los-Latn-ZZ",
+ "loz": "loz-Latn-ZM",
+ "lrc": "lrc-Arab-IR",
+ "lt": "lt-Latn-LT",
+ "ltg": "ltg-Latn-LV",
+ "lu": "lu-Latn-CD",
+ "lua": "lua-Latn-CD",
+ "luo": "luo-Latn-KE",
+ "luy": "luy-Latn-KE",
+ "luz": "luz-Arab-IR",
+ "lv": "lv-Latn-LV",
+ "lwl": "lwl-Thai-TH",
+ "lzh": "lzh-Hans-CN",
+ "lzz": "lzz-Latn-TR",
+ "mad": "mad-Latn-ID",
+ "maf": "maf-Latn-CM",
+ "mag": "mag-Deva-IN",
+ "mai": "mai-Deva-IN",
+ "mak": "mak-Latn-ID",
+ "man": "man-Latn-GM",
+ "man-GN": "man-Nkoo-GN",
+ "man-Nkoo": "man-Nkoo-GN",
+ "mas": "mas-Latn-KE",
+ "maw": "maw-Latn-ZZ",
+ "maz": "maz-Latn-MX",
+ "mbh": "mbh-Latn-ZZ",
+ "mbo": "mbo-Latn-ZZ",
+ "mbq": "mbq-Latn-ZZ",
+ "mbu": "mbu-Latn-ZZ",
+ "mbw": "mbw-Latn-ZZ",
+ "mci": "mci-Latn-ZZ",
+ "mcp": "mcp-Latn-ZZ",
+ "mcq": "mcq-Latn-ZZ",
+ "mcr": "mcr-Latn-ZZ",
+ "mcu": "mcu-Latn-ZZ",
+ "mda": "mda-Latn-ZZ",
+ "mde": "mde-Arab-ZZ",
+ "mdf": "mdf-Cyrl-RU",
+ "mdh": "mdh-Latn-PH",
+ "mdj": "mdj-Latn-ZZ",
+ "mdr": "mdr-Latn-ID",
+ "mdx": "mdx-Ethi-ZZ",
+ "med": "med-Latn-ZZ",
+ "mee": "mee-Latn-ZZ",
+ "mek": "mek-Latn-ZZ",
+ "men": "men-Latn-SL",
+ "mer": "mer-Latn-KE",
+ "met": "met-Latn-ZZ",
+ "meu": "meu-Latn-ZZ",
+ "mfa": "mfa-Arab-TH",
+ "mfe": "mfe-Latn-MU",
+ "mfn": "mfn-Latn-ZZ",
+ "mfo": "mfo-Latn-ZZ",
+ "mfq": "mfq-Latn-ZZ",
+ "mg": "mg-Latn-MG",
+ "mgh": "mgh-Latn-MZ",
+ "mgl": "mgl-Latn-ZZ",
+ "mgo": "mgo-Latn-CM",
+ "mgp": "mgp-Deva-NP",
+ "mgy": "mgy-Latn-TZ",
+ "mh": "mh-Latn-MH",
+ "mhi": "mhi-Latn-ZZ",
+ "mhl": "mhl-Latn-ZZ",
+ "mi": "mi-Latn-NZ",
+ "mif": "mif-Latn-ZZ",
+ "min": "min-Latn-ID",
+ "mis": "mis-Hatr-IQ",
+ "mis-Medf": "mis-Medf-NG",
+ "miw": "miw-Latn-ZZ",
+ "mk": "mk-Cyrl-MK",
+ "mki": "mki-Arab-ZZ",
+ "mkl": "mkl-Latn-ZZ",
+ "mkp": "mkp-Latn-ZZ",
+ "mkw": "mkw-Latn-ZZ",
+ "ml": "ml-Mlym-IN",
+ "mle": "mle-Latn-ZZ",
+ "mlp": "mlp-Latn-ZZ",
+ "mls": "mls-Latn-SD",
+ "mmo": "mmo-Latn-ZZ",
+ "mmu": "mmu-Latn-ZZ",
+ "mmx": "mmx-Latn-ZZ",
+ "mn": "mn-Cyrl-MN",
+ "mn-CN": "mn-Mong-CN",
+ "mn-Mong": "mn-Mong-CN",
+ "mna": "mna-Latn-ZZ",
+ "mnf": "mnf-Latn-ZZ",
+ "mni": "mni-Beng-IN",
+ "mnw": "mnw-Mymr-MM",
+ "moa": "moa-Latn-ZZ",
+ "moe": "moe-Latn-CA",
+ "moh": "moh-Latn-CA",
+ "mos": "mos-Latn-BF",
+ "mox": "mox-Latn-ZZ",
+ "mpp": "mpp-Latn-ZZ",
+ "mps": "mps-Latn-ZZ",
+ "mpt": "mpt-Latn-ZZ",
+ "mpx": "mpx-Latn-ZZ",
+ "mql": "mql-Latn-ZZ",
+ "mr": "mr-Deva-IN",
+ "mrd": "mrd-Deva-NP",
+ "mrj": "mrj-Cyrl-RU",
+ "mro": "mro-Mroo-BD",
+ "ms": "ms-Latn-MY",
+ "ms-CC": "ms-Arab-CC",
+ "ms-ID": "ms-Arab-ID",
+ "mt": "mt-Latn-MT",
+ "mtc": "mtc-Latn-ZZ",
+ "mtf": "mtf-Latn-ZZ",
+ "mti": "mti-Latn-ZZ",
+ "mtr": "mtr-Deva-IN",
+ "mua": "mua-Latn-CM",
+ "mur": "mur-Latn-ZZ",
+ "mus": "mus-Latn-US",
+ "mva": "mva-Latn-ZZ",
+ "mvn": "mvn-Latn-ZZ",
+ "mvy": "mvy-Arab-PK",
+ "mwk": "mwk-Latn-ML",
+ "mwr": "mwr-Deva-IN",
+ "mwv": "mwv-Latn-ID",
+ "mww": "mww-Hmnp-US",
+ "mxc": "mxc-Latn-ZW",
+ "mxm": "mxm-Latn-ZZ",
+ "my": "my-Mymr-MM",
+ "myk": "myk-Latn-ZZ",
+ "mym": "mym-Ethi-ZZ",
+ "myv": "myv-Cyrl-RU",
+ "myw": "myw-Latn-ZZ",
+ "myx": "myx-Latn-UG",
+ "myz": "myz-Mand-IR",
+ "mzk": "mzk-Latn-ZZ",
+ "mzm": "mzm-Latn-ZZ",
+ "mzn": "mzn-Arab-IR",
+ "mzp": "mzp-Latn-ZZ",
+ "mzw": "mzw-Latn-ZZ",
+ "mzz": "mzz-Latn-ZZ",
+ "na": "na-Latn-NR",
+ "nac": "nac-Latn-ZZ",
+ "naf": "naf-Latn-ZZ",
+ "nak": "nak-Latn-ZZ",
+ "nan": "nan-Hans-CN",
+ "nap": "nap-Latn-IT",
+ "naq": "naq-Latn-NA",
+ "nas": "nas-Latn-ZZ",
+ "nb": "nb-Latn-NO",
+ "nca": "nca-Latn-ZZ",
+ "nce": "nce-Latn-ZZ",
+ "ncf": "ncf-Latn-ZZ",
+ "nch": "nch-Latn-MX",
+ "nco": "nco-Latn-ZZ",
+ "ncu": "ncu-Latn-ZZ",
+ "nd": "nd-Latn-ZW",
+ "ndc": "ndc-Latn-MZ",
+ "nds": "nds-Latn-DE",
+ "ne": "ne-Deva-NP",
+ "neb": "neb-Latn-ZZ",
+ "new": "new-Deva-NP",
+ "nex": "nex-Latn-ZZ",
+ "nfr": "nfr-Latn-ZZ",
+ "ng": "ng-Latn-NA",
+ "nga": "nga-Latn-ZZ",
+ "ngb": "ngb-Latn-ZZ",
+ "ngl": "ngl-Latn-MZ",
+ "nhb": "nhb-Latn-ZZ",
+ "nhe": "nhe-Latn-MX",
+ "nhw": "nhw-Latn-MX",
+ "nif": "nif-Latn-ZZ",
+ "nii": "nii-Latn-ZZ",
+ "nij": "nij-Latn-ID",
+ "nin": "nin-Latn-ZZ",
+ "niu": "niu-Latn-NU",
+ "niy": "niy-Latn-ZZ",
+ "niz": "niz-Latn-ZZ",
+ "njo": "njo-Latn-IN",
+ "nkg": "nkg-Latn-ZZ",
+ "nko": "nko-Latn-ZZ",
+ "nl": "nl-Latn-NL",
+ "nmg": "nmg-Latn-CM",
+ "nmz": "nmz-Latn-ZZ",
+ "nn": "nn-Latn-NO",
+ "nnf": "nnf-Latn-ZZ",
+ "nnh": "nnh-Latn-CM",
+ "nnk": "nnk-Latn-ZZ",
+ "nnm": "nnm-Latn-ZZ",
+ "nnp": "nnp-Wcho-IN",
+ "no": "nb-Latn-NO",
+ "nod": "nod-Lana-TH",
+ "noe": "noe-Deva-IN",
+ "non": "non-Runr-SE",
+ "nop": "nop-Latn-ZZ",
+ "nou": "nou-Latn-ZZ",
+ "nqo": "nqo-Nkoo-GN",
+ "nr": "nr-Latn-ZA",
+ "nrb": "nrb-Latn-ZZ",
+ "nsk": "nsk-Cans-CA",
+ "nsn": "nsn-Latn-ZZ",
+ "nso": "nso-Latn-ZA",
+ "nss": "nss-Latn-ZZ",
+ "ntm": "ntm-Latn-ZZ",
+ "ntr": "ntr-Latn-ZZ",
+ "nui": "nui-Latn-ZZ",
+ "nup": "nup-Latn-ZZ",
+ "nus": "nus-Latn-SS",
+ "nuv": "nuv-Latn-ZZ",
+ "nux": "nux-Latn-ZZ",
+ "nv": "nv-Latn-US",
+ "nwb": "nwb-Latn-ZZ",
+ "nxq": "nxq-Latn-CN",
+ "nxr": "nxr-Latn-ZZ",
+ "ny": "ny-Latn-MW",
+ "nym": "nym-Latn-TZ",
+ "nyn": "nyn-Latn-UG",
+ "nzi": "nzi-Latn-GH",
+ "oc": "oc-Latn-FR",
+ "ogc": "ogc-Latn-ZZ",
+ "okr": "okr-Latn-ZZ",
+ "okv": "okv-Latn-ZZ",
+ "om": "om-Latn-ET",
+ "ong": "ong-Latn-ZZ",
+ "onn": "onn-Latn-ZZ",
+ "ons": "ons-Latn-ZZ",
+ "opm": "opm-Latn-ZZ",
+ "or": "or-Orya-IN",
+ "oro": "oro-Latn-ZZ",
+ "oru": "oru-Arab-ZZ",
+ "os": "os-Cyrl-GE",
+ "osa": "osa-Osge-US",
+ "ota": "ota-Arab-ZZ",
+ "otk": "otk-Orkh-MN",
+ "ozm": "ozm-Latn-ZZ",
+ "pa": "pa-Guru-IN",
+ "pa-Arab": "pa-Arab-PK",
+ "pa-PK": "pa-Arab-PK",
+ "pag": "pag-Latn-PH",
+ "pal": "pal-Phli-IR",
+ "pal-Phlp": "pal-Phlp-CN",
+ "pam": "pam-Latn-PH",
+ "pap": "pap-Latn-AW",
+ "pau": "pau-Latn-PW",
+ "pbi": "pbi-Latn-ZZ",
+ "pcd": "pcd-Latn-FR",
+ "pcm": "pcm-Latn-NG",
+ "pdc": "pdc-Latn-US",
+ "pdt": "pdt-Latn-CA",
+ "ped": "ped-Latn-ZZ",
+ "peo": "peo-Xpeo-IR",
+ "pex": "pex-Latn-ZZ",
+ "pfl": "pfl-Latn-DE",
+ "phl": "phl-Arab-ZZ",
+ "phn": "phn-Phnx-LB",
+ "pil": "pil-Latn-ZZ",
+ "pip": "pip-Latn-ZZ",
+ "pka": "pka-Brah-IN",
+ "pko": "pko-Latn-KE",
+ "pl": "pl-Latn-PL",
+ "pla": "pla-Latn-ZZ",
+ "pms": "pms-Latn-IT",
+ "png": "png-Latn-ZZ",
+ "pnn": "pnn-Latn-ZZ",
+ "pnt": "pnt-Grek-GR",
+ "pon": "pon-Latn-FM",
+ "ppo": "ppo-Latn-ZZ",
+ "pra": "pra-Khar-PK",
+ "prd": "prd-Arab-IR",
+ "prg": "prg-Latn-001",
+ "ps": "ps-Arab-AF",
+ "pss": "pss-Latn-ZZ",
+ "pt": "pt-Latn-BR",
+ "ptp": "ptp-Latn-ZZ",
+ "puu": "puu-Latn-GA",
+ "pwa": "pwa-Latn-ZZ",
+ "qu": "qu-Latn-PE",
+ "quc": "quc-Latn-GT",
+ "qug": "qug-Latn-EC",
+ "rai": "rai-Latn-ZZ",
+ "raj": "raj-Deva-IN",
+ "rao": "rao-Latn-ZZ",
+ "rcf": "rcf-Latn-RE",
+ "rej": "rej-Latn-ID",
+ "rel": "rel-Latn-ZZ",
+ "res": "res-Latn-ZZ",
+ "rgn": "rgn-Latn-IT",
+ "rhg": "rhg-Arab-MM",
+ "ria": "ria-Latn-IN",
+ "rif": "rif-Tfng-MA",
+ "rif-NL": "rif-Latn-NL",
+ "rjs": "rjs-Deva-NP",
+ "rkt": "rkt-Beng-BD",
+ "rm": "rm-Latn-CH",
+ "rmf": "rmf-Latn-FI",
+ "rmo": "rmo-Latn-CH",
+ "rmt": "rmt-Arab-IR",
+ "rmu": "rmu-Latn-SE",
+ "rn": "rn-Latn-BI",
+ "rna": "rna-Latn-ZZ",
+ "rng": "rng-Latn-MZ",
+ "ro": "ro-Latn-RO",
+ "rob": "rob-Latn-ID",
+ "rof": "rof-Latn-TZ",
+ "roo": "roo-Latn-ZZ",
+ "rro": "rro-Latn-ZZ",
+ "rtm": "rtm-Latn-FJ",
+ "ru": "ru-Cyrl-RU",
+ "rue": "rue-Cyrl-UA",
+ "rug": "rug-Latn-SB",
+ "rw": "rw-Latn-RW",
+ "rwk": "rwk-Latn-TZ",
+ "rwo": "rwo-Latn-ZZ",
+ "ryu": "ryu-Kana-JP",
+ "sa": "sa-Deva-IN",
+ "saf": "saf-Latn-GH",
+ "sah": "sah-Cyrl-RU",
+ "saq": "saq-Latn-KE",
+ "sas": "sas-Latn-ID",
+ "sat": "sat-Latn-IN",
+ "sav": "sav-Latn-SN",
+ "saz": "saz-Saur-IN",
+ "sba": "sba-Latn-ZZ",
+ "sbe": "sbe-Latn-ZZ",
+ "sbp": "sbp-Latn-TZ",
+ "sc": "sc-Latn-IT",
+ "sck": "sck-Deva-IN",
+ "scl": "scl-Arab-ZZ",
+ "scn": "scn-Latn-IT",
+ "sco": "sco-Latn-GB",
+ "scs": "scs-Latn-CA",
+ "sd": "sd-Arab-PK",
+ "sd-Deva": "sd-Deva-IN",
+ "sd-Khoj": "sd-Khoj-IN",
+ "sd-Sind": "sd-Sind-IN",
+ "sdc": "sdc-Latn-IT",
+ "sdh": "sdh-Arab-IR",
+ "se": "se-Latn-NO",
+ "sef": "sef-Latn-CI",
+ "seh": "seh-Latn-MZ",
+ "sei": "sei-Latn-MX",
+ "ses": "ses-Latn-ML",
+ "sg": "sg-Latn-CF",
+ "sga": "sga-Ogam-IE",
+ "sgs": "sgs-Latn-LT",
+ "sgw": "sgw-Ethi-ZZ",
+ "sgz": "sgz-Latn-ZZ",
+ "shi": "shi-Tfng-MA",
+ "shk": "shk-Latn-ZZ",
+ "shn": "shn-Mymr-MM",
+ "shu": "shu-Arab-ZZ",
+ "si": "si-Sinh-LK",
+ "sid": "sid-Latn-ET",
+ "sig": "sig-Latn-ZZ",
+ "sil": "sil-Latn-ZZ",
+ "sim": "sim-Latn-ZZ",
+ "sjr": "sjr-Latn-ZZ",
+ "sk": "sk-Latn-SK",
+ "skc": "skc-Latn-ZZ",
+ "skr": "skr-Arab-PK",
+ "sks": "sks-Latn-ZZ",
+ "sl": "sl-Latn-SI",
+ "sld": "sld-Latn-ZZ",
+ "sli": "sli-Latn-PL",
+ "sll": "sll-Latn-ZZ",
+ "sly": "sly-Latn-ID",
+ "sm": "sm-Latn-WS",
+ "sma": "sma-Latn-SE",
+ "smj": "smj-Latn-SE",
+ "smn": "smn-Latn-FI",
+ "smp": "smp-Samr-IL",
+ "smq": "smq-Latn-ZZ",
+ "sms": "sms-Latn-FI",
+ "sn": "sn-Latn-ZW",
+ "snc": "snc-Latn-ZZ",
+ "snk": "snk-Latn-ML",
+ "snp": "snp-Latn-ZZ",
+ "snx": "snx-Latn-ZZ",
+ "sny": "sny-Latn-ZZ",
+ "so": "so-Latn-SO",
+ "sog": "sog-Sogd-UZ",
+ "sok": "sok-Latn-ZZ",
+ "soq": "soq-Latn-ZZ",
+ "sou": "sou-Thai-TH",
+ "soy": "soy-Latn-ZZ",
+ "spd": "spd-Latn-ZZ",
+ "spl": "spl-Latn-ZZ",
+ "sps": "sps-Latn-ZZ",
+ "sq": "sq-Latn-AL",
+ "sr": "sr-Cyrl-RS",
+ "sr-ME": "sr-Latn-ME",
+ "sr-RO": "sr-Latn-RO",
+ "sr-RU": "sr-Latn-RU",
+ "sr-TR": "sr-Latn-TR",
+ "srb": "srb-Sora-IN",
+ "srn": "srn-Latn-SR",
+ "srr": "srr-Latn-SN",
+ "srx": "srx-Deva-IN",
+ "ss": "ss-Latn-ZA",
+ "ssd": "ssd-Latn-ZZ",
+ "ssg": "ssg-Latn-ZZ",
+ "ssy": "ssy-Latn-ER",
+ "st": "st-Latn-ZA",
+ "stk": "stk-Latn-ZZ",
+ "stq": "stq-Latn-DE",
+ "su": "su-Latn-ID",
+ "sua": "sua-Latn-ZZ",
+ "sue": "sue-Latn-ZZ",
+ "suk": "suk-Latn-TZ",
+ "sur": "sur-Latn-ZZ",
+ "sus": "sus-Latn-GN",
+ "sv": "sv-Latn-SE",
+ "sw": "sw-Latn-TZ",
+ "swb": "swb-Arab-YT",
+ "swc": "sw-Latn-CD",
+ "swg": "swg-Latn-DE",
+ "swp": "swp-Latn-ZZ",
+ "swv": "swv-Deva-IN",
+ "sxn": "sxn-Latn-ID",
+ "sxw": "sxw-Latn-ZZ",
+ "syl": "syl-Beng-BD",
+ "syr": "syr-Syrc-IQ",
+ "szl": "szl-Latn-PL",
+ "ta": "ta-Taml-IN",
+ "taj": "taj-Deva-NP",
+ "tal": "tal-Latn-ZZ",
+ "tan": "tan-Latn-ZZ",
+ "taq": "taq-Latn-ZZ",
+ "tbc": "tbc-Latn-ZZ",
+ "tbd": "tbd-Latn-ZZ",
+ "tbf": "tbf-Latn-ZZ",
+ "tbg": "tbg-Latn-ZZ",
+ "tbo": "tbo-Latn-ZZ",
+ "tbw": "tbw-Latn-PH",
+ "tbz": "tbz-Latn-ZZ",
+ "tci": "tci-Latn-ZZ",
+ "tcy": "tcy-Knda-IN",
+ "tdd": "tdd-Tale-CN",
+ "tdg": "tdg-Deva-NP",
+ "tdh": "tdh-Deva-NP",
+ "te": "te-Telu-IN",
+ "ted": "ted-Latn-ZZ",
+ "tem": "tem-Latn-SL",
+ "teo": "teo-Latn-UG",
+ "tet": "tet-Latn-TL",
+ "tfi": "tfi-Latn-ZZ",
+ "tg": "tg-Cyrl-TJ",
+ "tg-Arab": "tg-Arab-PK",
+ "tg-PK": "tg-Arab-PK",
+ "tgc": "tgc-Latn-ZZ",
+ "tgo": "tgo-Latn-ZZ",
+ "tgu": "tgu-Latn-ZZ",
+ "th": "th-Thai-TH",
+ "thl": "thl-Deva-NP",
+ "thq": "thq-Deva-NP",
+ "thr": "thr-Deva-NP",
+ "ti": "ti-Ethi-ET",
+ "tif": "tif-Latn-ZZ",
+ "tig": "tig-Ethi-ER",
+ "tik": "tik-Latn-ZZ",
+ "tim": "tim-Latn-ZZ",
+ "tio": "tio-Latn-ZZ",
+ "tiv": "tiv-Latn-NG",
+ "tk": "tk-Latn-TM",
+ "tkl": "tkl-Latn-TK",
+ "tkr": "tkr-Latn-AZ",
+ "tkt": "tkt-Deva-NP",
+ "tl": "fil-Latn-PH",
+ "tlf": "tlf-Latn-ZZ",
+ "tlx": "tlx-Latn-ZZ",
+ "tly": "tly-Latn-AZ",
+ "tmh": "tmh-Latn-NE",
+ "tmy": "tmy-Latn-ZZ",
+ "tn": "tn-Latn-ZA",
+ "tnh": "tnh-Latn-ZZ",
+ "to": "to-Latn-TO",
+ "tof": "tof-Latn-ZZ",
+ "tog": "tog-Latn-MW",
+ "toq": "toq-Latn-ZZ",
+ "tpi": "tpi-Latn-PG",
+ "tpm": "tpm-Latn-ZZ",
+ "tpz": "tpz-Latn-ZZ",
+ "tqo": "tqo-Latn-ZZ",
+ "tr": "tr-Latn-TR",
+ "tru": "tru-Latn-TR",
+ "trv": "trv-Latn-TW",
+ "trw": "trw-Arab-ZZ",
+ "ts": "ts-Latn-ZA",
+ "tsd": "tsd-Grek-GR",
+ "tsf": "taj-Deva-NP",
+ "tsg": "tsg-Latn-PH",
+ "tsj": "tsj-Tibt-BT",
+ "tsw": "tsw-Latn-ZZ",
+ "tt": "tt-Cyrl-RU",
+ "ttd": "ttd-Latn-ZZ",
+ "tte": "tte-Latn-ZZ",
+ "ttj": "ttj-Latn-UG",
+ "ttr": "ttr-Latn-ZZ",
+ "tts": "tts-Thai-TH",
+ "ttt": "ttt-Latn-AZ",
+ "tuh": "tuh-Latn-ZZ",
+ "tul": "tul-Latn-ZZ",
+ "tum": "tum-Latn-MW",
+ "tuq": "tuq-Latn-ZZ",
+ "tvd": "tvd-Latn-ZZ",
+ "tvl": "tvl-Latn-TV",
+ "tvu": "tvu-Latn-ZZ",
+ "twh": "twh-Latn-ZZ",
+ "twq": "twq-Latn-NE",
+ "txg": "txg-Tang-CN",
+ "ty": "ty-Latn-PF",
+ "tya": "tya-Latn-ZZ",
+ "tyv": "tyv-Cyrl-RU",
+ "tzm": "tzm-Latn-MA",
+ "ubu": "ubu-Latn-ZZ",
+ "udm": "udm-Cyrl-RU",
+ "ug": "ug-Arab-CN",
+ "ug-Cyrl": "ug-Cyrl-KZ",
+ "ug-KZ": "ug-Cyrl-KZ",
+ "ug-MN": "ug-Cyrl-MN",
+ "uga": "uga-Ugar-SY",
+ "uk": "uk-Cyrl-UA",
+ "uli": "uli-Latn-FM",
+ "umb": "umb-Latn-AO",
+ "und": "en-Latn-US",
+ "und-002": "en-Latn-NG",
+ "und-003": "en-Latn-US",
+ "und-005": "pt-Latn-BR",
+ "und-009": "en-Latn-AU",
+ "und-011": "en-Latn-NG",
+ "und-013": "es-Latn-MX",
+ "und-014": "sw-Latn-TZ",
+ "und-015": "ar-Arab-EG",
+ "und-017": "sw-Latn-CD",
+ "und-018": "en-Latn-ZA",
+ "und-019": "en-Latn-US",
+ "und-021": "en-Latn-US",
+ "und-029": "es-Latn-CU",
+ "und-030": "zh-Hans-CN",
+ "und-034": "hi-Deva-IN",
+ "und-035": "id-Latn-ID",
+ "und-039": "it-Latn-IT",
+ "und-053": "en-Latn-AU",
+ "und-054": "en-Latn-PG",
+ "und-057": "en-Latn-GU",
+ "und-061": "sm-Latn-WS",
+ "und-142": "zh-Hans-CN",
+ "und-143": "uz-Latn-UZ",
+ "und-145": "ar-Arab-SA",
+ "und-150": "ru-Cyrl-RU",
+ "und-151": "ru-Cyrl-RU",
+ "und-154": "en-Latn-GB",
+ "und-155": "de-Latn-DE",
+ "und-202": "en-Latn-NG",
+ "und-419": "es-Latn-419",
+ "und-AD": "ca-Latn-AD",
+ "und-AE": "ar-Arab-AE",
+ "und-AF": "fa-Arab-AF",
+ "und-AL": "sq-Latn-AL",
+ "und-AM": "hy-Armn-AM",
+ "und-AO": "pt-Latn-AO",
+ "und-AQ": "und-Latn-AQ",
+ "und-AR": "es-Latn-AR",
+ "und-AS": "sm-Latn-AS",
+ "und-AT": "de-Latn-AT",
+ "und-AW": "nl-Latn-AW",
+ "und-AX": "sv-Latn-AX",
+ "und-AZ": "az-Latn-AZ",
+ "und-Adlm": "ff-Adlm-GN",
+ "und-Aghb": "lez-Aghb-RU",
+ "und-Ahom": "aho-Ahom-IN",
+ "und-Arab": "ar-Arab-EG",
+ "und-Arab-CC": "ms-Arab-CC",
+ "und-Arab-CN": "ug-Arab-CN",
+ "und-Arab-GB": "ks-Arab-GB",
+ "und-Arab-ID": "ms-Arab-ID",
+ "und-Arab-IN": "ur-Arab-IN",
+ "und-Arab-KH": "cja-Arab-KH",
+ "und-Arab-MM": "rhg-Arab-MM",
+ "und-Arab-MN": "kk-Arab-MN",
+ "und-Arab-MU": "ur-Arab-MU",
+ "und-Arab-NG": "ha-Arab-NG",
+ "und-Arab-PK": "ur-Arab-PK",
+ "und-Arab-TG": "apd-Arab-TG",
+ "und-Arab-TH": "mfa-Arab-TH",
+ "und-Arab-TJ": "fa-Arab-TJ",
+ "und-Arab-TR": "az-Arab-TR",
+ "und-Arab-YT": "swb-Arab-YT",
+ "und-Armi": "arc-Armi-IR",
+ "und-Armn": "hy-Armn-AM",
+ "und-Avst": "ae-Avst-IR",
+ "und-BA": "bs-Latn-BA",
+ "und-BD": "bn-Beng-BD",
+ "und-BE": "nl-Latn-BE",
+ "und-BF": "fr-Latn-BF",
+ "und-BG": "bg-Cyrl-BG",
+ "und-BH": "ar-Arab-BH",
+ "und-BI": "rn-Latn-BI",
+ "und-BJ": "fr-Latn-BJ",
+ "und-BL": "fr-Latn-BL",
+ "und-BN": "ms-Latn-BN",
+ "und-BO": "es-Latn-BO",
+ "und-BQ": "pap-Latn-BQ",
+ "und-BR": "pt-Latn-BR",
+ "und-BT": "dz-Tibt-BT",
+ "und-BV": "und-Latn-BV",
+ "und-BY": "be-Cyrl-BY",
+ "und-Bali": "ban-Bali-ID",
+ "und-Bamu": "bax-Bamu-CM",
+ "und-Bass": "bsq-Bass-LR",
+ "und-Batk": "bbc-Batk-ID",
+ "und-Beng": "bn-Beng-BD",
+ "und-Bhks": "sa-Bhks-IN",
+ "und-Bopo": "zh-Bopo-TW",
+ "und-Brah": "pka-Brah-IN",
+ "und-Brai": "fr-Brai-FR",
+ "und-Bugi": "bug-Bugi-ID",
+ "und-Buhd": "bku-Buhd-PH",
+ "und-CD": "sw-Latn-CD",
+ "und-CF": "fr-Latn-CF",
+ "und-CG": "fr-Latn-CG",
+ "und-CH": "de-Latn-CH",
+ "und-CI": "fr-Latn-CI",
+ "und-CL": "es-Latn-CL",
+ "und-CM": "fr-Latn-CM",
+ "und-CN": "zh-Hans-CN",
+ "und-CO": "es-Latn-CO",
+ "und-CP": "und-Latn-CP",
+ "und-CR": "es-Latn-CR",
+ "und-CU": "es-Latn-CU",
+ "und-CV": "pt-Latn-CV",
+ "und-CW": "pap-Latn-CW",
+ "und-CY": "el-Grek-CY",
+ "und-CZ": "cs-Latn-CZ",
+ "und-Cakm": "ccp-Cakm-BD",
+ "und-Cans": "cr-Cans-CA",
+ "und-Cari": "xcr-Cari-TR",
+ "und-Cham": "cjm-Cham-VN",
+ "und-Cher": "chr-Cher-US",
+ "und-Copt": "cop-Copt-EG",
+ "und-Cprt": "grc-Cprt-CY",
+ "und-Cyrl": "ru-Cyrl-RU",
+ "und-Cyrl-AL": "mk-Cyrl-AL",
+ "und-Cyrl-BA": "sr-Cyrl-BA",
+ "und-Cyrl-GE": "ab-Cyrl-GE",
+ "und-Cyrl-GR": "mk-Cyrl-GR",
+ "und-Cyrl-MD": "uk-Cyrl-MD",
+ "und-Cyrl-RO": "bg-Cyrl-RO",
+ "und-Cyrl-SK": "uk-Cyrl-SK",
+ "und-Cyrl-TR": "kbd-Cyrl-TR",
+ "und-Cyrl-XK": "sr-Cyrl-XK",
+ "und-DE": "de-Latn-DE",
+ "und-DJ": "aa-Latn-DJ",
+ "und-DK": "da-Latn-DK",
+ "und-DO": "es-Latn-DO",
+ "und-DZ": "ar-Arab-DZ",
+ "und-Deva": "hi-Deva-IN",
+ "und-Deva-BT": "ne-Deva-BT",
+ "und-Deva-FJ": "hif-Deva-FJ",
+ "und-Deva-MU": "bho-Deva-MU",
+ "und-Deva-PK": "btv-Deva-PK",
+ "und-Dogr": "doi-Dogr-IN",
+ "und-Dupl": "fr-Dupl-FR",
+ "und-EA": "es-Latn-EA",
+ "und-EC": "es-Latn-EC",
+ "und-EE": "et-Latn-EE",
+ "und-EG": "ar-Arab-EG",
+ "und-EH": "ar-Arab-EH",
+ "und-ER": "ti-Ethi-ER",
+ "und-ES": "es-Latn-ES",
+ "und-ET": "am-Ethi-ET",
+ "und-EU": "en-Latn-GB",
+ "und-EZ": "de-Latn-EZ",
+ "und-Egyp": "egy-Egyp-EG",
+ "und-Elba": "sq-Elba-AL",
+ "und-Elym": "arc-Elym-IR",
+ "und-Ethi": "am-Ethi-ET",
+ "und-FI": "fi-Latn-FI",
+ "und-FO": "fo-Latn-FO",
+ "und-FR": "fr-Latn-FR",
+ "und-GA": "fr-Latn-GA",
+ "und-GE": "ka-Geor-GE",
+ "und-GF": "fr-Latn-GF",
+ "und-GH": "ak-Latn-GH",
+ "und-GL": "kl-Latn-GL",
+ "und-GN": "fr-Latn-GN",
+ "und-GP": "fr-Latn-GP",
+ "und-GQ": "es-Latn-GQ",
+ "und-GR": "el-Grek-GR",
+ "und-GS": "und-Latn-GS",
+ "und-GT": "es-Latn-GT",
+ "und-GW": "pt-Latn-GW",
+ "und-Geor": "ka-Geor-GE",
+ "und-Glag": "cu-Glag-BG",
+ "und-Gong": "wsg-Gong-IN",
+ "und-Gonm": "esg-Gonm-IN",
+ "und-Goth": "got-Goth-UA",
+ "und-Gran": "sa-Gran-IN",
+ "und-Grek": "el-Grek-GR",
+ "und-Grek-TR": "bgx-Grek-TR",
+ "und-Gujr": "gu-Gujr-IN",
+ "und-Guru": "pa-Guru-IN",
+ "und-HK": "zh-Hant-HK",
+ "und-HM": "und-Latn-HM",
+ "und-HN": "es-Latn-HN",
+ "und-HR": "hr-Latn-HR",
+ "und-HT": "ht-Latn-HT",
+ "und-HU": "hu-Latn-HU",
+ "und-Hanb": "zh-Hanb-TW",
+ "und-Hang": "ko-Hang-KR",
+ "und-Hani": "zh-Hani-CN",
+ "und-Hano": "hnn-Hano-PH",
+ "und-Hans": "zh-Hans-CN",
+ "und-Hant": "zh-Hant-TW",
+ "und-Hatr": "mis-Hatr-IQ",
+ "und-Hebr": "he-Hebr-IL",
+ "und-Hebr-CA": "yi-Hebr-CA",
+ "und-Hebr-GB": "yi-Hebr-GB",
+ "und-Hebr-SE": "yi-Hebr-SE",
+ "und-Hebr-UA": "yi-Hebr-UA",
+ "und-Hebr-US": "yi-Hebr-US",
+ "und-Hira": "ja-Hira-JP",
+ "und-Hluw": "hlu-Hluw-TR",
+ "und-Hmng": "hnj-Hmng-LA",
+ "und-Hmnp": "mww-Hmnp-US",
+ "und-Hung": "hu-Hung-HU",
+ "und-IC": "es-Latn-IC",
+ "und-ID": "id-Latn-ID",
+ "und-IL": "he-Hebr-IL",
+ "und-IN": "hi-Deva-IN",
+ "und-IQ": "ar-Arab-IQ",
+ "und-IR": "fa-Arab-IR",
+ "und-IS": "is-Latn-IS",
+ "und-IT": "it-Latn-IT",
+ "und-Ital": "ett-Ital-IT",
+ "und-JO": "ar-Arab-JO",
+ "und-JP": "ja-Jpan-JP",
+ "und-Jamo": "ko-Jamo-KR",
+ "und-Java": "jv-Java-ID",
+ "und-Jpan": "ja-Jpan-JP",
+ "und-KE": "sw-Latn-KE",
+ "und-KG": "ky-Cyrl-KG",
+ "und-KH": "km-Khmr-KH",
+ "und-KM": "ar-Arab-KM",
+ "und-KP": "ko-Kore-KP",
+ "und-KR": "ko-Kore-KR",
+ "und-KW": "ar-Arab-KW",
+ "und-KZ": "ru-Cyrl-KZ",
+ "und-Kali": "eky-Kali-MM",
+ "und-Kana": "ja-Kana-JP",
+ "und-Khar": "pra-Khar-PK",
+ "und-Khmr": "km-Khmr-KH",
+ "und-Khoj": "sd-Khoj-IN",
+ "und-Knda": "kn-Knda-IN",
+ "und-Kore": "ko-Kore-KR",
+ "und-Kthi": "bho-Kthi-IN",
+ "und-LA": "lo-Laoo-LA",
+ "und-LB": "ar-Arab-LB",
+ "und-LI": "de-Latn-LI",
+ "und-LK": "si-Sinh-LK",
+ "und-LS": "st-Latn-LS",
+ "und-LT": "lt-Latn-LT",
+ "und-LU": "fr-Latn-LU",
+ "und-LV": "lv-Latn-LV",
+ "und-LY": "ar-Arab-LY",
+ "und-Lana": "nod-Lana-TH",
+ "und-Laoo": "lo-Laoo-LA",
+ "und-Latn-AF": "tk-Latn-AF",
+ "und-Latn-AM": "ku-Latn-AM",
+ "und-Latn-CN": "za-Latn-CN",
+ "und-Latn-CY": "tr-Latn-CY",
+ "und-Latn-DZ": "fr-Latn-DZ",
+ "und-Latn-ET": "en-Latn-ET",
+ "und-Latn-GE": "ku-Latn-GE",
+ "und-Latn-IR": "tk-Latn-IR",
+ "und-Latn-KM": "fr-Latn-KM",
+ "und-Latn-MA": "fr-Latn-MA",
+ "und-Latn-MK": "sq-Latn-MK",
+ "und-Latn-MM": "kac-Latn-MM",
+ "und-Latn-MO": "pt-Latn-MO",
+ "und-Latn-MR": "fr-Latn-MR",
+ "und-Latn-RU": "krl-Latn-RU",
+ "und-Latn-SY": "fr-Latn-SY",
+ "und-Latn-TN": "fr-Latn-TN",
+ "und-Latn-TW": "trv-Latn-TW",
+ "und-Latn-UA": "pl-Latn-UA",
+ "und-Lepc": "lep-Lepc-IN",
+ "und-Limb": "lif-Limb-IN",
+ "und-Lina": "lab-Lina-GR",
+ "und-Linb": "grc-Linb-GR",
+ "und-Lisu": "lis-Lisu-CN",
+ "und-Lyci": "xlc-Lyci-TR",
+ "und-Lydi": "xld-Lydi-TR",
+ "und-MA": "ar-Arab-MA",
+ "und-MC": "fr-Latn-MC",
+ "und-MD": "ro-Latn-MD",
+ "und-ME": "sr-Latn-ME",
+ "und-MF": "fr-Latn-MF",
+ "und-MG": "mg-Latn-MG",
+ "und-MK": "mk-Cyrl-MK",
+ "und-ML": "bm-Latn-ML",
+ "und-MM": "my-Mymr-MM",
+ "und-MN": "mn-Cyrl-MN",
+ "und-MO": "zh-Hant-MO",
+ "und-MQ": "fr-Latn-MQ",
+ "und-MR": "ar-Arab-MR",
+ "und-MT": "mt-Latn-MT",
+ "und-MU": "mfe-Latn-MU",
+ "und-MV": "dv-Thaa-MV",
+ "und-MX": "es-Latn-MX",
+ "und-MY": "ms-Latn-MY",
+ "und-MZ": "pt-Latn-MZ",
+ "und-Mahj": "hi-Mahj-IN",
+ "und-Maka": "mak-Maka-ID",
+ "und-Mand": "myz-Mand-IR",
+ "und-Mani": "xmn-Mani-CN",
+ "und-Marc": "bo-Marc-CN",
+ "und-Medf": "mis-Medf-NG",
+ "und-Mend": "men-Mend-SL",
+ "und-Merc": "xmr-Merc-SD",
+ "und-Mero": "xmr-Mero-SD",
+ "und-Mlym": "ml-Mlym-IN",
+ "und-Modi": "mr-Modi-IN",
+ "und-Mong": "mn-Mong-CN",
+ "und-Mroo": "mro-Mroo-BD",
+ "und-Mtei": "mni-Mtei-IN",
+ "und-Mult": "skr-Mult-PK",
+ "und-Mymr": "my-Mymr-MM",
+ "und-Mymr-IN": "kht-Mymr-IN",
+ "und-Mymr-TH": "mnw-Mymr-TH",
+ "und-NA": "af-Latn-NA",
+ "und-NC": "fr-Latn-NC",
+ "und-NE": "ha-Latn-NE",
+ "und-NI": "es-Latn-NI",
+ "und-NL": "nl-Latn-NL",
+ "und-NO": "nb-Latn-NO",
+ "und-NP": "ne-Deva-NP",
+ "und-Nand": "sa-Nand-IN",
+ "und-Narb": "xna-Narb-SA",
+ "und-Nbat": "arc-Nbat-JO",
+ "und-Newa": "new-Newa-NP",
+ "und-Nkoo": "man-Nkoo-GN",
+ "und-Nshu": "zhx-Nshu-CN",
+ "und-OM": "ar-Arab-OM",
+ "und-Ogam": "sga-Ogam-IE",
+ "und-Olck": "sat-Olck-IN",
+ "und-Orkh": "otk-Orkh-MN",
+ "und-Orya": "or-Orya-IN",
+ "und-Osge": "osa-Osge-US",
+ "und-Osma": "so-Osma-SO",
+ "und-PA": "es-Latn-PA",
+ "und-PE": "es-Latn-PE",
+ "und-PF": "fr-Latn-PF",
+ "und-PG": "tpi-Latn-PG",
+ "und-PH": "fil-Latn-PH",
+ "und-PK": "ur-Arab-PK",
+ "und-PL": "pl-Latn-PL",
+ "und-PM": "fr-Latn-PM",
+ "und-PR": "es-Latn-PR",
+ "und-PS": "ar-Arab-PS",
+ "und-PT": "pt-Latn-PT",
+ "und-PW": "pau-Latn-PW",
+ "und-PY": "gn-Latn-PY",
+ "und-Palm": "arc-Palm-SY",
+ "und-Pauc": "ctd-Pauc-MM",
+ "und-Perm": "kv-Perm-RU",
+ "und-Phag": "lzh-Phag-CN",
+ "und-Phli": "pal-Phli-IR",
+ "und-Phlp": "pal-Phlp-CN",
+ "und-Phnx": "phn-Phnx-LB",
+ "und-Plrd": "hmd-Plrd-CN",
+ "und-Prti": "xpr-Prti-IR",
+ "und-QA": "ar-Arab-QA",
+ "und-QO": "en-Latn-DG",
+ "und-RE": "fr-Latn-RE",
+ "und-RO": "ro-Latn-RO",
+ "und-RS": "sr-Cyrl-RS",
+ "und-RU": "ru-Cyrl-RU",
+ "und-RW": "rw-Latn-RW",
+ "und-Rjng": "rej-Rjng-ID",
+ "und-Rohg": "rhg-Rohg-MM",
+ "und-Runr": "non-Runr-SE",
+ "und-SA": "ar-Arab-SA",
+ "und-SC": "fr-Latn-SC",
+ "und-SD": "ar-Arab-SD",
+ "und-SE": "sv-Latn-SE",
+ "und-SI": "sl-Latn-SI",
+ "und-SJ": "nb-Latn-SJ",
+ "und-SK": "sk-Latn-SK",
+ "und-SM": "it-Latn-SM",
+ "und-SN": "fr-Latn-SN",
+ "und-SO": "so-Latn-SO",
+ "und-SR": "nl-Latn-SR",
+ "und-ST": "pt-Latn-ST",
+ "und-SV": "es-Latn-SV",
+ "und-SY": "ar-Arab-SY",
+ "und-Samr": "smp-Samr-IL",
+ "und-Sarb": "xsa-Sarb-YE",
+ "und-Saur": "saz-Saur-IN",
+ "und-Sgnw": "ase-Sgnw-US",
+ "und-Shaw": "en-Shaw-GB",
+ "und-Shrd": "sa-Shrd-IN",
+ "und-Sidd": "sa-Sidd-IN",
+ "und-Sind": "sd-Sind-IN",
+ "und-Sinh": "si-Sinh-LK",
+ "und-Sogd": "sog-Sogd-UZ",
+ "und-Sogo": "sog-Sogo-UZ",
+ "und-Sora": "srb-Sora-IN",
+ "und-Soyo": "cmg-Soyo-MN",
+ "und-Sund": "su-Sund-ID",
+ "und-Sylo": "syl-Sylo-BD",
+ "und-Syrc": "syr-Syrc-IQ",
+ "und-TD": "fr-Latn-TD",
+ "und-TF": "fr-Latn-TF",
+ "und-TG": "fr-Latn-TG",
+ "und-TH": "th-Thai-TH",
+ "und-TJ": "tg-Cyrl-TJ",
+ "und-TK": "tkl-Latn-TK",
+ "und-TL": "pt-Latn-TL",
+ "und-TM": "tk-Latn-TM",
+ "und-TN": "ar-Arab-TN",
+ "und-TO": "to-Latn-TO",
+ "und-TR": "tr-Latn-TR",
+ "und-TV": "tvl-Latn-TV",
+ "und-TW": "zh-Hant-TW",
+ "und-TZ": "sw-Latn-TZ",
+ "und-Tagb": "tbw-Tagb-PH",
+ "und-Takr": "doi-Takr-IN",
+ "und-Tale": "tdd-Tale-CN",
+ "und-Talu": "khb-Talu-CN",
+ "und-Taml": "ta-Taml-IN",
+ "und-Tang": "txg-Tang-CN",
+ "und-Tavt": "blt-Tavt-VN",
+ "und-Telu": "te-Telu-IN",
+ "und-Tfng": "zgh-Tfng-MA",
+ "und-Tglg": "fil-Tglg-PH",
+ "und-Thaa": "dv-Thaa-MV",
+ "und-Thai": "th-Thai-TH",
+ "und-Thai-CN": "lcp-Thai-CN",
+ "und-Thai-KH": "kdt-Thai-KH",
+ "und-Thai-LA": "kdt-Thai-LA",
+ "und-Tibt": "bo-Tibt-CN",
+ "und-Tirh": "mai-Tirh-IN",
+ "und-UA": "uk-Cyrl-UA",
+ "und-UG": "sw-Latn-UG",
+ "und-UY": "es-Latn-UY",
+ "und-UZ": "uz-Latn-UZ",
+ "und-Ugar": "uga-Ugar-SY",
+ "und-VA": "it-Latn-VA",
+ "und-VE": "es-Latn-VE",
+ "und-VN": "vi-Latn-VN",
+ "und-VU": "bi-Latn-VU",
+ "und-Vaii": "vai-Vaii-LR",
+ "und-WF": "fr-Latn-WF",
+ "und-WS": "sm-Latn-WS",
+ "und-Wara": "hoc-Wara-IN",
+ "und-Wcho": "nnp-Wcho-IN",
+ "und-XK": "sq-Latn-XK",
+ "und-Xpeo": "peo-Xpeo-IR",
+ "und-Xsux": "akk-Xsux-IQ",
+ "und-YE": "ar-Arab-YE",
+ "und-YT": "fr-Latn-YT",
+ "und-Yiii": "ii-Yiii-CN",
+ "und-ZW": "sn-Latn-ZW",
+ "und-Zanb": "cmg-Zanb-MN",
+ "unr": "unr-Beng-IN",
+ "unr-Deva": "unr-Deva-NP",
+ "unr-NP": "unr-Deva-NP",
+ "unx": "unx-Beng-IN",
+ "ur": "ur-Arab-PK",
+ "uri": "uri-Latn-ZZ",
+ "urt": "urt-Latn-ZZ",
+ "urw": "urw-Latn-ZZ",
+ "usa": "usa-Latn-ZZ",
+ "utr": "utr-Latn-ZZ",
+ "uvh": "uvh-Latn-ZZ",
+ "uvl": "uvl-Latn-ZZ",
+ "uz": "uz-Latn-UZ",
+ "uz-AF": "uz-Arab-AF",
+ "uz-Arab": "uz-Arab-AF",
+ "uz-CN": "uz-Cyrl-CN",
+ "vag": "vag-Latn-ZZ",
+ "vai": "vai-Vaii-LR",
+ "van": "van-Latn-ZZ",
+ "ve": "ve-Latn-ZA",
+ "vec": "vec-Latn-IT",
+ "vep": "vep-Latn-RU",
+ "vi": "vi-Latn-VN",
+ "vic": "vic-Latn-SX",
+ "viv": "viv-Latn-ZZ",
+ "vls": "vls-Latn-BE",
+ "vmf": "vmf-Latn-DE",
+ "vmw": "vmw-Latn-MZ",
+ "vo": "vo-Latn-001",
+ "vot": "vot-Latn-RU",
+ "vro": "vro-Latn-EE",
+ "vun": "vun-Latn-TZ",
+ "vut": "vut-Latn-ZZ",
+ "wa": "wa-Latn-BE",
+ "wae": "wae-Latn-CH",
+ "waj": "waj-Latn-ZZ",
+ "wal": "wal-Ethi-ET",
+ "wan": "wan-Latn-ZZ",
+ "war": "war-Latn-PH",
+ "wbp": "wbp-Latn-AU",
+ "wbq": "wbq-Telu-IN",
+ "wbr": "wbr-Deva-IN",
+ "wci": "wci-Latn-ZZ",
+ "wer": "wer-Latn-ZZ",
+ "wgi": "wgi-Latn-ZZ",
+ "whg": "whg-Latn-ZZ",
+ "wib": "wib-Latn-ZZ",
+ "wiu": "wiu-Latn-ZZ",
+ "wiv": "wiv-Latn-ZZ",
+ "wja": "wja-Latn-ZZ",
+ "wji": "wji-Latn-ZZ",
+ "wls": "wls-Latn-WF",
+ "wmo": "wmo-Latn-ZZ",
+ "wnc": "wnc-Latn-ZZ",
+ "wni": "wni-Arab-KM",
+ "wnu": "wnu-Latn-ZZ",
+ "wo": "wo-Latn-SN",
+ "wob": "wob-Latn-ZZ",
+ "wos": "wos-Latn-ZZ",
+ "wrs": "wrs-Latn-ZZ",
+ "wsg": "wsg-Gong-IN",
+ "wsk": "wsk-Latn-ZZ",
+ "wtm": "wtm-Deva-IN",
+ "wuu": "wuu-Hans-CN",
+ "wuv": "wuv-Latn-ZZ",
+ "wwa": "wwa-Latn-ZZ",
+ "xav": "xav-Latn-BR",
+ "xbi": "xbi-Latn-ZZ",
+ "xcr": "xcr-Cari-TR",
+ "xes": "xes-Latn-ZZ",
+ "xh": "xh-Latn-ZA",
+ "xla": "xla-Latn-ZZ",
+ "xlc": "xlc-Lyci-TR",
+ "xld": "xld-Lydi-TR",
+ "xmf": "xmf-Geor-GE",
+ "xmn": "xmn-Mani-CN",
+ "xmr": "xmr-Merc-SD",
+ "xna": "xna-Narb-SA",
+ "xnr": "xnr-Deva-IN",
+ "xog": "xog-Latn-UG",
+ "xon": "xon-Latn-ZZ",
+ "xpr": "xpr-Prti-IR",
+ "xrb": "xrb-Latn-ZZ",
+ "xsa": "xsa-Sarb-YE",
+ "xsi": "xsi-Latn-ZZ",
+ "xsm": "xsm-Latn-ZZ",
+ "xsr": "xsr-Deva-NP",
+ "xwe": "xwe-Latn-ZZ",
+ "yam": "yam-Latn-ZZ",
+ "yao": "yao-Latn-MZ",
+ "yap": "yap-Latn-FM",
+ "yas": "yas-Latn-ZZ",
+ "yat": "yat-Latn-ZZ",
+ "yav": "yav-Latn-CM",
+ "yay": "yay-Latn-ZZ",
+ "yaz": "yaz-Latn-ZZ",
+ "yba": "yba-Latn-ZZ",
+ "ybb": "ybb-Latn-CM",
+ "yby": "yby-Latn-ZZ",
+ "yer": "yer-Latn-ZZ",
+ "ygr": "ygr-Latn-ZZ",
+ "ygw": "ygw-Latn-ZZ",
+ "yi": "yi-Hebr-001",
+ "yko": "yko-Latn-ZZ",
+ "yle": "yle-Latn-ZZ",
+ "ylg": "ylg-Latn-ZZ",
+ "yll": "yll-Latn-ZZ",
+ "yml": "yml-Latn-ZZ",
+ "yo": "yo-Latn-NG",
+ "yon": "yon-Latn-ZZ",
+ "yrb": "yrb-Latn-ZZ",
+ "yre": "yre-Latn-ZZ",
+ "yrl": "yrl-Latn-BR",
+ "yss": "yss-Latn-ZZ",
+ "yua": "yua-Latn-MX",
+ "yue": "yue-Hant-HK",
+ "yue-CN": "yue-Hans-CN",
+ "yue-Hans": "yue-Hans-CN",
+ "yuj": "yuj-Latn-ZZ",
+ "yut": "yut-Latn-ZZ",
+ "yuw": "yuw-Latn-ZZ",
+ "za": "za-Latn-CN",
+ "zag": "zag-Latn-SD",
+ "zdj": "zdj-Arab-KM",
+ "zea": "zea-Latn-NL",
+ "zgh": "zgh-Tfng-MA",
+ "zh": "zh-Hans-CN",
+ "zh-AU": "zh-Hant-AU",
+ "zh-BN": "zh-Hant-BN",
+ "zh-Bopo": "zh-Bopo-TW",
+ "zh-GB": "zh-Hant-GB",
+ "zh-GF": "zh-Hant-GF",
+ "zh-HK": "zh-Hant-HK",
+ "zh-Hanb": "zh-Hanb-TW",
+ "zh-Hant": "zh-Hant-TW",
+ "zh-ID": "zh-Hant-ID",
+ "zh-MO": "zh-Hant-MO",
+ "zh-MY": "zh-Hant-MY",
+ "zh-PA": "zh-Hant-PA",
+ "zh-PF": "zh-Hant-PF",
+ "zh-PH": "zh-Hant-PH",
+ "zh-SR": "zh-Hant-SR",
+ "zh-TH": "zh-Hant-TH",
+ "zh-TW": "zh-Hant-TW",
+ "zh-US": "zh-Hant-US",
+ "zh-VN": "zh-Hant-VN",
+ "zhx": "zhx-Nshu-CN",
+ "zia": "zia-Latn-ZZ",
+ "zlm": "zlm-Latn-TG",
+ "zmi": "zmi-Latn-MY",
+ "zne": "zne-Latn-ZZ",
+ "zu": "zu-Latn-ZA",
+ "zza": "zza-Latn-TR",
+};
+
+// Extracted from likelySubtags.xml.
+// Derived from CLDR Supplemental Data, version 35.1.
+// https://unicode.org/Public/cldr/35.1/core.zip
+var minLikelySubtags = {
+ "aa-Latn-DJ": "aa-DJ",
+ "aa-Latn-ET": "aa",
+ "aai-Latn-ZZ": "aai",
+ "aak-Latn-ZZ": "aak",
+ "aau-Latn-ZZ": "aau",
+ "ab-Cyrl-GE": "ab",
+ "abi-Latn-ZZ": "abi",
+ "abq-Cyrl-ZZ": "abq",
+ "abr-Latn-GH": "abr",
+ "abt-Latn-ZZ": "abt",
+ "aby-Latn-ZZ": "aby",
+ "acd-Latn-ZZ": "acd",
+ "ace-Latn-ID": "ace",
+ "ach-Latn-UG": "ach",
+ "ada-Latn-GH": "ada",
+ "ade-Latn-ZZ": "ade",
+ "adj-Latn-ZZ": "adj",
+ "ady-Cyrl-RU": "ady",
+ "adz-Latn-ZZ": "adz",
+ "ae-Avst-IR": "ae",
+ "aeb-Arab-TN": "aeb",
+ "aey-Latn-ZZ": "aey",
+ "af-Latn-NA": "af-NA",
+ "af-Latn-ZA": "af",
+ "agc-Latn-ZZ": "agc",
+ "agd-Latn-ZZ": "agd",
+ "agg-Latn-ZZ": "agg",
+ "agm-Latn-ZZ": "agm",
+ "ago-Latn-ZZ": "ago",
+ "agq-Latn-CM": "agq",
+ "aha-Latn-ZZ": "aha",
+ "ahl-Latn-ZZ": "ahl",
+ "aho-Ahom-IN": "aho",
+ "ajg-Latn-ZZ": "ajg",
+ "ak-Latn-GH": "ak",
+ "akk-Xsux-IQ": "akk",
+ "ala-Latn-ZZ": "ala",
+ "ali-Latn-ZZ": "ali",
+ "aln-Latn-XK": "aln",
+ "alt-Cyrl-RU": "alt",
+ "am-Ethi-ET": "am",
+ "amm-Latn-ZZ": "amm",
+ "amn-Latn-ZZ": "amn",
+ "amo-Latn-NG": "amo",
+ "amp-Latn-ZZ": "amp",
+ "anc-Latn-ZZ": "anc",
+ "ank-Latn-ZZ": "ank",
+ "ann-Latn-ZZ": "ann",
+ "any-Latn-ZZ": "any",
+ "aoj-Latn-ZZ": "aoj",
+ "aom-Latn-ZZ": "aom",
+ "aoz-Latn-ID": "aoz",
+ "apc-Arab-ZZ": "apc",
+ "apd-Arab-TG": "apd",
+ "ape-Latn-ZZ": "ape",
+ "apr-Latn-ZZ": "apr",
+ "aps-Latn-ZZ": "aps",
+ "apz-Latn-ZZ": "apz",
+ "ar-Arab-AE": "ar-AE",
+ "ar-Arab-BH": "ar-BH",
+ "ar-Arab-DZ": "ar-DZ",
+ "ar-Arab-EG": "ar",
+ "ar-Arab-EH": "ar-EH",
+ "ar-Arab-IQ": "ar-IQ",
+ "ar-Arab-JO": "ar-JO",
+ "ar-Arab-KM": "ar-KM",
+ "ar-Arab-KW": "ar-KW",
+ "ar-Arab-LB": "ar-LB",
+ "ar-Arab-LY": "ar-LY",
+ "ar-Arab-MA": "ar-MA",
+ "ar-Arab-MR": "ar-MR",
+ "ar-Arab-OM": "ar-OM",
+ "ar-Arab-PS": "ar-PS",
+ "ar-Arab-QA": "ar-QA",
+ "ar-Arab-SA": "ar-SA",
+ "ar-Arab-SD": "ar-SD",
+ "ar-Arab-SY": "ar-SY",
+ "ar-Arab-TN": "ar-TN",
+ "ar-Arab-YE": "ar-YE",
+ "arc-Armi-IR": "arc",
+ "arc-Elym-IR": "arc-Elym",
+ "arc-Nbat-JO": "arc-Nbat",
+ "arc-Palm-SY": "arc-Palm",
+ "arh-Latn-ZZ": "arh",
+ "arn-Latn-CL": "arn",
+ "aro-Latn-BO": "aro",
+ "arq-Arab-DZ": "arq",
+ "ary-Arab-MA": "ary",
+ "arz-Arab-EG": "arz",
+ "as-Beng-IN": "as",
+ "asa-Latn-TZ": "asa",
+ "ase-Sgnw-US": "ase",
+ "asg-Latn-ZZ": "asg",
+ "aso-Latn-ZZ": "aso",
+ "ast-Latn-ES": "ast",
+ "ata-Latn-ZZ": "ata",
+ "atg-Latn-ZZ": "atg",
+ "atj-Latn-CA": "atj",
+ "auy-Latn-ZZ": "auy",
+ "av-Cyrl-RU": "av",
+ "avl-Arab-ZZ": "avl",
+ "avn-Latn-ZZ": "avn",
+ "avt-Latn-ZZ": "avt",
+ "avu-Latn-ZZ": "avu",
+ "awa-Deva-IN": "awa",
+ "awb-Latn-ZZ": "awb",
+ "awo-Latn-ZZ": "awo",
+ "awx-Latn-ZZ": "awx",
+ "ay-Latn-BO": "ay",
+ "ayb-Latn-ZZ": "ayb",
+ "az-Arab-IQ": "az-IQ",
+ "az-Arab-IR": "az-IR",
+ "az-Arab-TR": "az-Arab-TR",
+ "az-Cyrl-RU": "az-RU",
+ "az-Latn-AZ": "az",
+ "ba-Cyrl-RU": "ba",
+ "bal-Arab-PK": "bal",
+ "ban-Bali-ID": "ban-Bali",
+ "ban-Latn-ID": "ban",
+ "bap-Deva-NP": "bap",
+ "bar-Latn-AT": "bar",
+ "bas-Latn-CM": "bas",
+ "bav-Latn-ZZ": "bav",
+ "bax-Bamu-CM": "bax",
+ "bba-Latn-ZZ": "bba",
+ "bbb-Latn-ZZ": "bbb",
+ "bbc-Batk-ID": "bbc-Batk",
+ "bbc-Latn-ID": "bbc",
+ "bbd-Latn-ZZ": "bbd",
+ "bbj-Latn-CM": "bbj",
+ "bbp-Latn-ZZ": "bbp",
+ "bbr-Latn-ZZ": "bbr",
+ "bcf-Latn-ZZ": "bcf",
+ "bch-Latn-ZZ": "bch",
+ "bci-Latn-CI": "bci",
+ "bcm-Latn-ZZ": "bcm",
+ "bcn-Latn-ZZ": "bcn",
+ "bco-Latn-ZZ": "bco",
+ "bcq-Ethi-ZZ": "bcq",
+ "bcu-Latn-ZZ": "bcu",
+ "bdd-Latn-ZZ": "bdd",
+ "be-Cyrl-BY": "be",
+ "bef-Latn-ZZ": "bef",
+ "beh-Latn-ZZ": "beh",
+ "bej-Arab-SD": "bej",
+ "bem-Latn-ZM": "bem",
+ "bet-Latn-ZZ": "bet",
+ "bew-Latn-ID": "bew",
+ "bex-Latn-ZZ": "bex",
+ "bez-Latn-TZ": "bez",
+ "bfd-Latn-CM": "bfd",
+ "bfq-Taml-IN": "bfq",
+ "bft-Arab-PK": "bft",
+ "bfy-Deva-IN": "bfy",
+ "bg-Cyrl-BG": "bg",
+ "bg-Cyrl-RO": "bg-RO",
+ "bgc-Deva-IN": "bgc",
+ "bgn-Arab-PK": "bgn",
+ "bgx-Grek-TR": "bgx",
+ "bhb-Deva-IN": "bhb",
+ "bhg-Latn-ZZ": "bhg",
+ "bhi-Deva-IN": "bhi",
+ "bhk-Latn-PH": "bhk",
+ "bhl-Latn-ZZ": "bhl",
+ "bho-Deva-IN": "bho",
+ "bho-Deva-MU": "bho-MU",
+ "bho-Kthi-IN": "bho-Kthi",
+ "bhy-Latn-ZZ": "bhy",
+ "bi-Latn-VU": "bi",
+ "bib-Latn-ZZ": "bib",
+ "big-Latn-ZZ": "big",
+ "bik-Latn-PH": "bik",
+ "bim-Latn-ZZ": "bim",
+ "bin-Latn-NG": "bin",
+ "bio-Latn-ZZ": "bio",
+ "biq-Latn-ZZ": "biq",
+ "bjh-Latn-ZZ": "bjh",
+ "bji-Ethi-ZZ": "bji",
+ "bjj-Deva-IN": "bjj",
+ "bjn-Latn-ID": "bjn",
+ "bjo-Latn-ZZ": "bjo",
+ "bjr-Latn-ZZ": "bjr",
+ "bjt-Latn-SN": "bjt",
+ "bjz-Latn-ZZ": "bjz",
+ "bkc-Latn-ZZ": "bkc",
+ "bkm-Latn-CM": "bkm",
+ "bkq-Latn-ZZ": "bkq",
+ "bku-Buhd-PH": "bku-Buhd",
+ "bku-Latn-PH": "bku",
+ "bkv-Latn-ZZ": "bkv",
+ "blt-Tavt-VN": "blt",
+ "bm-Latn-ML": "bm",
+ "bmh-Latn-ZZ": "bmh",
+ "bmk-Latn-ZZ": "bmk",
+ "bmq-Latn-ML": "bmq",
+ "bmu-Latn-ZZ": "bmu",
+ "bn-Beng-BD": "bn",
+ "bng-Latn-ZZ": "bng",
+ "bnm-Latn-ZZ": "bnm",
+ "bnp-Latn-ZZ": "bnp",
+ "bo-Marc-CN": "bo-Marc",
+ "bo-Tibt-CN": "bo",
+ "boj-Latn-ZZ": "boj",
+ "bom-Latn-ZZ": "bom",
+ "bon-Latn-ZZ": "bon",
+ "bpy-Beng-IN": "bpy",
+ "bqc-Latn-ZZ": "bqc",
+ "bqi-Arab-IR": "bqi",
+ "bqp-Latn-ZZ": "bqp",
+ "bqv-Latn-CI": "bqv",
+ "br-Latn-FR": "br",
+ "bra-Deva-IN": "bra",
+ "brh-Arab-PK": "brh",
+ "brx-Deva-IN": "brx",
+ "brz-Latn-ZZ": "brz",
+ "bs-Latn-BA": "bs",
+ "bsj-Latn-ZZ": "bsj",
+ "bsq-Bass-LR": "bsq",
+ "bss-Latn-CM": "bss",
+ "bst-Ethi-ZZ": "bst",
+ "bto-Latn-PH": "bto",
+ "btt-Latn-ZZ": "btt",
+ "btv-Deva-PK": "btv",
+ "bua-Cyrl-RU": "bua",
+ "buc-Latn-YT": "buc",
+ "bud-Latn-ZZ": "bud",
+ "bug-Bugi-ID": "bug-Bugi",
+ "bug-Latn-ID": "bug",
+ "buk-Latn-ZZ": "buk",
+ "bum-Latn-CM": "bum",
+ "buo-Latn-ZZ": "buo",
+ "bus-Latn-ZZ": "bus",
+ "buu-Latn-ZZ": "buu",
+ "bvb-Latn-GQ": "bvb",
+ "bwd-Latn-ZZ": "bwd",
+ "bwr-Latn-ZZ": "bwr",
+ "bxh-Latn-ZZ": "bxh",
+ "bye-Latn-ZZ": "bye",
+ "byn-Ethi-ER": "byn",
+ "byr-Latn-ZZ": "byr",
+ "bys-Latn-ZZ": "bys",
+ "byv-Latn-CM": "byv",
+ "byx-Latn-ZZ": "byx",
+ "bza-Latn-ZZ": "bza",
+ "bze-Latn-ML": "bze",
+ "bzf-Latn-ZZ": "bzf",
+ "bzh-Latn-ZZ": "bzh",
+ "bzw-Latn-ZZ": "bzw",
+ "ca-Latn-AD": "ca-AD",
+ "ca-Latn-ES": "ca",
+ "can-Latn-ZZ": "can",
+ "cbj-Latn-ZZ": "cbj",
+ "cch-Latn-NG": "cch",
+ "ccp-Cakm-BD": "ccp",
+ "ce-Cyrl-RU": "ce",
+ "ceb-Latn-PH": "ceb",
+ "cfa-Latn-ZZ": "cfa",
+ "cgg-Latn-UG": "cgg",
+ "ch-Latn-GU": "ch",
+ "chk-Latn-FM": "chk",
+ "chm-Cyrl-RU": "chm",
+ "cho-Latn-US": "cho",
+ "chp-Latn-CA": "chp",
+ "chr-Cher-US": "chr",
+ "cja-Arab-KH": "cja",
+ "cjm-Cham-VN": "cjm",
+ "cjv-Latn-ZZ": "cjv",
+ "ckb-Arab-IQ": "ckb",
+ "ckl-Latn-ZZ": "ckl",
+ "cko-Latn-ZZ": "cko",
+ "cky-Latn-ZZ": "cky",
+ "cla-Latn-ZZ": "cla",
+ "cme-Latn-ZZ": "cme",
+ "cmg-Soyo-MN": "cmg",
+ "cmg-Zanb-MN": "cmg-Zanb",
+ "co-Latn-FR": "co",
+ "cop-Copt-EG": "cop",
+ "cps-Latn-PH": "cps",
+ "cr-Cans-CA": "cr",
+ "crh-Cyrl-UA": "crh",
+ "crj-Cans-CA": "crj",
+ "crk-Cans-CA": "crk",
+ "crl-Cans-CA": "crl",
+ "crm-Cans-CA": "crm",
+ "crs-Latn-SC": "crs",
+ "cs-Latn-CZ": "cs",
+ "csb-Latn-PL": "csb",
+ "csw-Cans-CA": "csw",
+ "ctd-Pauc-MM": "ctd",
+ "cu-Cyrl-RU": "cu",
+ "cu-Glag-BG": "cu-Glag",
+ "cv-Cyrl-RU": "cv",
+ "cy-Latn-GB": "cy",
+ "da-Latn-DK": "da",
+ "dad-Latn-ZZ": "dad",
+ "daf-Latn-ZZ": "daf",
+ "dag-Latn-ZZ": "dag",
+ "dah-Latn-ZZ": "dah",
+ "dak-Latn-US": "dak",
+ "dar-Cyrl-RU": "dar",
+ "dav-Latn-KE": "dav",
+ "dbd-Latn-ZZ": "dbd",
+ "dbq-Latn-ZZ": "dbq",
+ "dcc-Arab-IN": "dcc",
+ "ddn-Latn-ZZ": "ddn",
+ "de-Latn-AT": "de-AT",
+ "de-Latn-CH": "de-CH",
+ "de-Latn-DE": "de",
+ "de-Latn-EZ": "de-EZ",
+ "de-Latn-LI": "de-LI",
+ "ded-Latn-ZZ": "ded",
+ "den-Latn-CA": "den",
+ "dga-Latn-ZZ": "dga",
+ "dgh-Latn-ZZ": "dgh",
+ "dgi-Latn-ZZ": "dgi",
+ "dgl-Arab-ZZ": "dgl",
+ "dgr-Latn-CA": "dgr",
+ "dgz-Latn-ZZ": "dgz",
+ "dia-Latn-ZZ": "dia",
+ "dje-Latn-NE": "dje",
+ "dnj-Latn-CI": "dnj",
+ "dob-Latn-ZZ": "dob",
+ "doi-Arab-IN": "doi",
+ "doi-Dogr-IN": "doi-Dogr",
+ "doi-Takr-IN": "doi-Takr",
+ "dop-Latn-ZZ": "dop",
+ "dow-Latn-ZZ": "dow",
+ "dri-Latn-ZZ": "dri",
+ "drs-Ethi-ZZ": "drs",
+ "dsb-Latn-DE": "dsb",
+ "dtm-Latn-ML": "dtm",
+ "dtp-Latn-MY": "dtp",
+ "dts-Latn-ZZ": "dts",
+ "dty-Deva-NP": "dty",
+ "dua-Latn-CM": "dua",
+ "duc-Latn-ZZ": "duc",
+ "dud-Latn-ZZ": "dud",
+ "dug-Latn-ZZ": "dug",
+ "dv-Thaa-MV": "dv",
+ "dva-Latn-ZZ": "dva",
+ "dww-Latn-ZZ": "dww",
+ "dyo-Latn-SN": "dyo",
+ "dyu-Latn-BF": "dyu",
+ "dz-Tibt-BT": "dz",
+ "dzg-Latn-ZZ": "dzg",
+ "ebu-Latn-KE": "ebu",
+ "ee-Latn-GH": "ee",
+ "efi-Latn-NG": "efi",
+ "egl-Latn-IT": "egl",
+ "egy-Egyp-EG": "egy",
+ "eka-Latn-ZZ": "eka",
+ "eky-Kali-MM": "eky",
+ "el-Grek-CY": "el-CY",
+ "el-Grek-GR": "el",
+ "ema-Latn-ZZ": "ema",
+ "emi-Latn-ZZ": "emi",
+ "en-Latn-AU": "en-AU",
+ "en-Latn-DG": "en-DG",
+ "en-Latn-ET": "en-ET",
+ "en-Latn-GB": "en-GB",
+ "en-Latn-GU": "en-GU",
+ "en-Latn-NG": "en-NG",
+ "en-Latn-PG": "en-PG",
+ "en-Latn-US": "en",
+ "en-Latn-ZA": "en-ZA",
+ "en-Shaw-GB": "en-Shaw",
+ "enn-Latn-ZZ": "enn",
+ "enq-Latn-ZZ": "enq",
+ "eo-Latn-001": "eo",
+ "eri-Latn-ZZ": "eri",
+ "es-Latn-419": "es-419",
+ "es-Latn-AR": "es-AR",
+ "es-Latn-BO": "es-BO",
+ "es-Latn-CL": "es-CL",
+ "es-Latn-CO": "es-CO",
+ "es-Latn-CR": "es-CR",
+ "es-Latn-CU": "es-CU",
+ "es-Latn-DO": "es-DO",
+ "es-Latn-EA": "es-EA",
+ "es-Latn-EC": "es-EC",
+ "es-Latn-ES": "es",
+ "es-Latn-GQ": "es-GQ",
+ "es-Latn-GT": "es-GT",
+ "es-Latn-HN": "es-HN",
+ "es-Latn-IC": "es-IC",
+ "es-Latn-MX": "es-MX",
+ "es-Latn-NI": "es-NI",
+ "es-Latn-PA": "es-PA",
+ "es-Latn-PE": "es-PE",
+ "es-Latn-PR": "es-PR",
+ "es-Latn-SV": "es-SV",
+ "es-Latn-UY": "es-UY",
+ "es-Latn-VE": "es-VE",
+ "esg-Gonm-IN": "esg",
+ "esu-Latn-US": "esu",
+ "et-Latn-EE": "et",
+ "etr-Latn-ZZ": "etr",
+ "ett-Ital-IT": "ett",
+ "etu-Latn-ZZ": "etu",
+ "etx-Latn-ZZ": "etx",
+ "eu-Latn-ES": "eu",
+ "ewo-Latn-CM": "ewo",
+ "ext-Latn-ES": "ext",
+ "fa-Arab-AF": "fa-AF",
+ "fa-Arab-IR": "fa",
+ "fa-Arab-TJ": "fa-TJ",
+ "faa-Latn-ZZ": "faa",
+ "fab-Latn-ZZ": "fab",
+ "fag-Latn-ZZ": "fag",
+ "fai-Latn-ZZ": "fai",
+ "fan-Latn-GQ": "fan",
+ "ff-Adlm-GN": "ff-Adlm",
+ "ff-Latn-SN": "ff",
+ "ffi-Latn-ZZ": "ffi",
+ "ffm-Latn-ML": "ffm",
+ "fi-Latn-FI": "fi",
+ "fia-Arab-SD": "fia",
+ "fil-Latn-PH": "fil",
+ "fil-Tglg-PH": "fil-Tglg",
+ "fit-Latn-SE": "fit",
+ "fj-Latn-FJ": "fj",
+ "flr-Latn-ZZ": "flr",
+ "fmp-Latn-ZZ": "fmp",
+ "fo-Latn-FO": "fo",
+ "fod-Latn-ZZ": "fod",
+ "fon-Latn-BJ": "fon",
+ "for-Latn-ZZ": "for",
+ "fpe-Latn-ZZ": "fpe",
+ "fqs-Latn-ZZ": "fqs",
+ "fr-Brai-FR": "fr-Brai",
+ "fr-Dupl-FR": "fr-Dupl",
+ "fr-Latn-BF": "fr-BF",
+ "fr-Latn-BJ": "fr-BJ",
+ "fr-Latn-BL": "fr-BL",
+ "fr-Latn-CF": "fr-CF",
+ "fr-Latn-CG": "fr-CG",
+ "fr-Latn-CI": "fr-CI",
+ "fr-Latn-CM": "fr-CM",
+ "fr-Latn-DZ": "fr-DZ",
+ "fr-Latn-FR": "fr",
+ "fr-Latn-GA": "fr-GA",
+ "fr-Latn-GF": "fr-GF",
+ "fr-Latn-GN": "fr-GN",
+ "fr-Latn-GP": "fr-GP",
+ "fr-Latn-KM": "fr-KM",
+ "fr-Latn-LU": "fr-LU",
+ "fr-Latn-MA": "fr-MA",
+ "fr-Latn-MC": "fr-MC",
+ "fr-Latn-MF": "fr-MF",
+ "fr-Latn-MQ": "fr-MQ",
+ "fr-Latn-MR": "fr-MR",
+ "fr-Latn-NC": "fr-NC",
+ "fr-Latn-PF": "fr-PF",
+ "fr-Latn-PM": "fr-PM",
+ "fr-Latn-RE": "fr-RE",
+ "fr-Latn-SC": "fr-SC",
+ "fr-Latn-SN": "fr-SN",
+ "fr-Latn-SY": "fr-SY",
+ "fr-Latn-TD": "fr-TD",
+ "fr-Latn-TF": "fr-TF",
+ "fr-Latn-TG": "fr-TG",
+ "fr-Latn-TN": "fr-TN",
+ "fr-Latn-WF": "fr-WF",
+ "fr-Latn-YT": "fr-YT",
+ "frc-Latn-US": "frc",
+ "frp-Latn-FR": "frp",
+ "frr-Latn-DE": "frr",
+ "frs-Latn-DE": "frs",
+ "fub-Arab-CM": "fub",
+ "fud-Latn-WF": "fud",
+ "fue-Latn-ZZ": "fue",
+ "fuf-Latn-GN": "fuf",
+ "fuh-Latn-ZZ": "fuh",
+ "fuq-Latn-NE": "fuq",
+ "fur-Latn-IT": "fur",
+ "fuv-Latn-NG": "fuv",
+ "fuy-Latn-ZZ": "fuy",
+ "fvr-Latn-SD": "fvr",
+ "fy-Latn-NL": "fy",
+ "ga-Latn-IE": "ga",
+ "gaa-Latn-GH": "gaa",
+ "gaf-Latn-ZZ": "gaf",
+ "gag-Latn-MD": "gag",
+ "gah-Latn-ZZ": "gah",
+ "gaj-Latn-ZZ": "gaj",
+ "gam-Latn-ZZ": "gam",
+ "gan-Hans-CN": "gan",
+ "gaw-Latn-ZZ": "gaw",
+ "gay-Latn-ID": "gay",
+ "gba-Latn-ZZ": "gba",
+ "gbf-Latn-ZZ": "gbf",
+ "gbm-Deva-IN": "gbm",
+ "gby-Latn-ZZ": "gby",
+ "gbz-Arab-IR": "gbz",
+ "gcr-Latn-GF": "gcr",
+ "gd-Latn-GB": "gd",
+ "gde-Latn-ZZ": "gde",
+ "gdn-Latn-ZZ": "gdn",
+ "gdr-Latn-ZZ": "gdr",
+ "geb-Latn-ZZ": "geb",
+ "gej-Latn-ZZ": "gej",
+ "gel-Latn-ZZ": "gel",
+ "gez-Ethi-ET": "gez",
+ "gfk-Latn-ZZ": "gfk",
+ "ghs-Latn-ZZ": "ghs",
+ "gil-Latn-KI": "gil",
+ "gim-Latn-ZZ": "gim",
+ "gjk-Arab-PK": "gjk",
+ "gjn-Latn-ZZ": "gjn",
+ "gju-Arab-PK": "gju",
+ "gkn-Latn-ZZ": "gkn",
+ "gkp-Latn-ZZ": "gkp",
+ "gl-Latn-ES": "gl",
+ "glk-Arab-IR": "glk",
+ "gmm-Latn-ZZ": "gmm",
+ "gmv-Ethi-ZZ": "gmv",
+ "gn-Latn-PY": "gn",
+ "gnd-Latn-ZZ": "gnd",
+ "gng-Latn-ZZ": "gng",
+ "god-Latn-ZZ": "god",
+ "gof-Ethi-ZZ": "gof",
+ "goi-Latn-ZZ": "goi",
+ "gom-Deva-IN": "gom",
+ "gon-Telu-IN": "gon",
+ "gor-Latn-ID": "gor",
+ "gos-Latn-NL": "gos",
+ "got-Goth-UA": "got",
+ "grb-Latn-ZZ": "grb",
+ "grc-Cprt-CY": "grc",
+ "grc-Linb-GR": "grc-Linb",
+ "grt-Beng-IN": "grt",
+ "grw-Latn-ZZ": "grw",
+ "gsw-Latn-CH": "gsw",
+ "gu-Gujr-IN": "gu",
+ "gub-Latn-BR": "gub",
+ "guc-Latn-CO": "guc",
+ "gud-Latn-ZZ": "gud",
+ "gur-Latn-GH": "gur",
+ "guw-Latn-ZZ": "guw",
+ "gux-Latn-ZZ": "gux",
+ "guz-Latn-KE": "guz",
+ "gv-Latn-IM": "gv",
+ "gvf-Latn-ZZ": "gvf",
+ "gvr-Deva-NP": "gvr",
+ "gvs-Latn-ZZ": "gvs",
+ "gwc-Arab-ZZ": "gwc",
+ "gwi-Latn-CA": "gwi",
+ "gwt-Arab-ZZ": "gwt",
+ "gyi-Latn-ZZ": "gyi",
+ "ha-Arab-CM": "ha-CM",
+ "ha-Arab-NG": "ha-Arab",
+ "ha-Arab-SD": "ha-SD",
+ "ha-Latn-NE": "ha-NE",
+ "ha-Latn-NG": "ha",
+ "hag-Latn-ZZ": "hag",
+ "hak-Hans-CN": "hak",
+ "ham-Latn-ZZ": "ham",
+ "haw-Latn-US": "haw",
+ "haz-Arab-AF": "haz",
+ "hbb-Latn-ZZ": "hbb",
+ "hdy-Ethi-ZZ": "hdy",
+ "he-Hebr-IL": "he",
+ "hhy-Latn-ZZ": "hhy",
+ "hi-Deva-IN": "hi",
+ "hi-Mahj-IN": "hi-Mahj",
+ "hia-Latn-ZZ": "hia",
+ "hif-Deva-FJ": "hif-Deva",
+ "hif-Latn-FJ": "hif",
+ "hig-Latn-ZZ": "hig",
+ "hih-Latn-ZZ": "hih",
+ "hil-Latn-PH": "hil",
+ "hla-Latn-ZZ": "hla",
+ "hlu-Hluw-TR": "hlu",
+ "hmd-Plrd-CN": "hmd",
+ "hmt-Latn-ZZ": "hmt",
+ "hnd-Arab-PK": "hnd",
+ "hne-Deva-IN": "hne",
+ "hnj-Hmng-LA": "hnj",
+ "hnn-Hano-PH": "hnn-Hano",
+ "hnn-Latn-PH": "hnn",
+ "hno-Arab-PK": "hno",
+ "ho-Latn-PG": "ho",
+ "hoc-Deva-IN": "hoc",
+ "hoc-Wara-IN": "hoc-Wara",
+ "hoj-Deva-IN": "hoj",
+ "hot-Latn-ZZ": "hot",
+ "hr-Latn-HR": "hr",
+ "hsb-Latn-DE": "hsb",
+ "hsn-Hans-CN": "hsn",
+ "ht-Latn-HT": "ht",
+ "hu-Hung-HU": "hu-Hung",
+ "hu-Latn-HU": "hu",
+ "hui-Latn-ZZ": "hui",
+ "hy-Armn-AM": "hy",
+ "hz-Latn-NA": "hz",
+ "ia-Latn-001": "ia",
+ "ian-Latn-ZZ": "ian",
+ "iar-Latn-ZZ": "iar",
+ "iba-Latn-MY": "iba",
+ "ibb-Latn-NG": "ibb",
+ "iby-Latn-ZZ": "iby",
+ "ica-Latn-ZZ": "ica",
+ "ich-Latn-ZZ": "ich",
+ "id-Latn-ID": "id",
+ "idd-Latn-ZZ": "idd",
+ "idi-Latn-ZZ": "idi",
+ "idu-Latn-ZZ": "idu",
+ "ife-Latn-TG": "ife",
+ "ig-Latn-NG": "ig",
+ "igb-Latn-ZZ": "igb",
+ "ige-Latn-ZZ": "ige",
+ "ii-Yiii-CN": "ii",
+ "ijj-Latn-ZZ": "ijj",
+ "ik-Latn-US": "ik",
+ "ikk-Latn-ZZ": "ikk",
+ "ikt-Latn-CA": "ikt",
+ "ikw-Latn-ZZ": "ikw",
+ "ikx-Latn-ZZ": "ikx",
+ "ilo-Latn-PH": "ilo",
+ "imo-Latn-ZZ": "imo",
+ "inh-Cyrl-RU": "inh",
+ "io-Latn-001": "io",
+ "iou-Latn-ZZ": "iou",
+ "iri-Latn-ZZ": "iri",
+ "is-Latn-IS": "is",
+ "it-Latn-IT": "it",
+ "it-Latn-SM": "it-SM",
+ "it-Latn-VA": "it-VA",
+ "iu-Cans-CA": "iu",
+ "iwm-Latn-ZZ": "iwm",
+ "iws-Latn-ZZ": "iws",
+ "izh-Latn-RU": "izh",
+ "izi-Latn-ZZ": "izi",
+ "ja-Hira-JP": "ja-Hira",
+ "ja-Jpan-JP": "ja",
+ "ja-Kana-JP": "ja-Kana",
+ "jab-Latn-ZZ": "jab",
+ "jam-Latn-JM": "jam",
+ "jbo-Latn-001": "jbo",
+ "jbu-Latn-ZZ": "jbu",
+ "jen-Latn-ZZ": "jen",
+ "jgk-Latn-ZZ": "jgk",
+ "jgo-Latn-CM": "jgo",
+ "jib-Latn-ZZ": "jib",
+ "jmc-Latn-TZ": "jmc",
+ "jml-Deva-NP": "jml",
+ "jra-Latn-ZZ": "jra",
+ "jut-Latn-DK": "jut",
+ "jv-Java-ID": "jv-Java",
+ "jv-Latn-ID": "jv",
+ "ka-Geor-GE": "ka",
+ "kaa-Cyrl-UZ": "kaa",
+ "kab-Latn-DZ": "kab",
+ "kac-Latn-MM": "kac",
+ "kad-Latn-ZZ": "kad",
+ "kai-Latn-ZZ": "kai",
+ "kaj-Latn-NG": "kaj",
+ "kam-Latn-KE": "kam",
+ "kao-Latn-ML": "kao",
+ "kbd-Cyrl-RU": "kbd",
+ "kbd-Cyrl-TR": "kbd-TR",
+ "kbm-Latn-ZZ": "kbm",
+ "kbp-Latn-ZZ": "kbp",
+ "kbq-Latn-ZZ": "kbq",
+ "kbx-Latn-ZZ": "kbx",
+ "kby-Arab-NE": "kby",
+ "kcg-Latn-NG": "kcg",
+ "kck-Latn-ZW": "kck",
+ "kcl-Latn-ZZ": "kcl",
+ "kct-Latn-ZZ": "kct",
+ "kde-Latn-TZ": "kde",
+ "kdh-Arab-TG": "kdh",
+ "kdl-Latn-ZZ": "kdl",
+ "kdt-Thai-KH": "kdt-KH",
+ "kdt-Thai-LA": "kdt-LA",
+ "kdt-Thai-TH": "kdt",
+ "kea-Latn-CV": "kea",
+ "ken-Latn-CM": "ken",
+ "kez-Latn-ZZ": "kez",
+ "kfo-Latn-CI": "kfo",
+ "kfr-Deva-IN": "kfr",
+ "kfy-Deva-IN": "kfy",
+ "kg-Latn-CD": "kg",
+ "kge-Latn-ID": "kge",
+ "kgf-Latn-ZZ": "kgf",
+ "kgp-Latn-BR": "kgp",
+ "kha-Latn-IN": "kha",
+ "khb-Talu-CN": "khb",
+ "khn-Deva-IN": "khn",
+ "khq-Latn-ML": "khq",
+ "khs-Latn-ZZ": "khs",
+ "kht-Mymr-IN": "kht",
+ "khw-Arab-PK": "khw",
+ "khz-Latn-ZZ": "khz",
+ "ki-Latn-KE": "ki",
+ "kij-Latn-ZZ": "kij",
+ "kiu-Latn-TR": "kiu",
+ "kiw-Latn-ZZ": "kiw",
+ "kj-Latn-NA": "kj",
+ "kjd-Latn-ZZ": "kjd",
+ "kjg-Laoo-LA": "kjg",
+ "kjs-Latn-ZZ": "kjs",
+ "kjy-Latn-ZZ": "kjy",
+ "kk-Arab-AF": "kk-AF",
+ "kk-Arab-CN": "kk-CN",
+ "kk-Arab-IR": "kk-IR",
+ "kk-Arab-MN": "kk-MN",
+ "kk-Cyrl-KZ": "kk",
+ "kkc-Latn-ZZ": "kkc",
+ "kkj-Latn-CM": "kkj",
+ "kl-Latn-GL": "kl",
+ "kln-Latn-KE": "kln",
+ "klq-Latn-ZZ": "klq",
+ "klt-Latn-ZZ": "klt",
+ "klx-Latn-ZZ": "klx",
+ "km-Khmr-KH": "km",
+ "kmb-Latn-AO": "kmb",
+ "kmh-Latn-ZZ": "kmh",
+ "kmo-Latn-ZZ": "kmo",
+ "kms-Latn-ZZ": "kms",
+ "kmu-Latn-ZZ": "kmu",
+ "kmw-Latn-ZZ": "kmw",
+ "kn-Knda-IN": "kn",
+ "knf-Latn-GW": "knf",
+ "knp-Latn-ZZ": "knp",
+ "ko-Hang-KR": "ko-Hang",
+ "ko-Jamo-KR": "ko-Jamo",
+ "ko-Kore-KP": "ko-KP",
+ "ko-Kore-KR": "ko",
+ "koi-Cyrl-RU": "koi",
+ "kok-Deva-IN": "kok",
+ "kol-Latn-ZZ": "kol",
+ "kos-Latn-FM": "kos",
+ "koz-Latn-ZZ": "koz",
+ "kpe-Latn-LR": "kpe",
+ "kpf-Latn-ZZ": "kpf",
+ "kpo-Latn-ZZ": "kpo",
+ "kpr-Latn-ZZ": "kpr",
+ "kpx-Latn-ZZ": "kpx",
+ "kqb-Latn-ZZ": "kqb",
+ "kqf-Latn-ZZ": "kqf",
+ "kqs-Latn-ZZ": "kqs",
+ "kqy-Ethi-ZZ": "kqy",
+ "kr-Latn-ZZ": "kr",
+ "krc-Cyrl-RU": "krc",
+ "kri-Latn-SL": "kri",
+ "krj-Latn-PH": "krj",
+ "krl-Latn-RU": "krl",
+ "krs-Latn-ZZ": "krs",
+ "kru-Deva-IN": "kru",
+ "ks-Arab-GB": "ks-GB",
+ "ks-Arab-IN": "ks",
+ "ksb-Latn-TZ": "ksb",
+ "ksd-Latn-ZZ": "ksd",
+ "ksf-Latn-CM": "ksf",
+ "ksh-Latn-DE": "ksh",
+ "ksj-Latn-ZZ": "ksj",
+ "ksr-Latn-ZZ": "ksr",
+ "ktb-Ethi-ZZ": "ktb",
+ "ktm-Latn-ZZ": "ktm",
+ "kto-Latn-ZZ": "kto",
+ "ku-Arab-IQ": "ku-Arab",
+ "ku-Arab-LB": "ku-LB",
+ "ku-Latn-AM": "ku-AM",
+ "ku-Latn-GE": "ku-GE",
+ "ku-Latn-TR": "ku",
+ "kub-Latn-ZZ": "kub",
+ "kud-Latn-ZZ": "kud",
+ "kue-Latn-ZZ": "kue",
+ "kuj-Latn-ZZ": "kuj",
+ "kum-Cyrl-RU": "kum",
+ "kun-Latn-ZZ": "kun",
+ "kup-Latn-ZZ": "kup",
+ "kus-Latn-ZZ": "kus",
+ "kv-Cyrl-RU": "kv",
+ "kv-Perm-RU": "kv-Perm",
+ "kvg-Latn-ZZ": "kvg",
+ "kvr-Latn-ID": "kvr",
+ "kvx-Arab-PK": "kvx",
+ "kw-Latn-GB": "kw",
+ "kwj-Latn-ZZ": "kwj",
+ "kwo-Latn-ZZ": "kwo",
+ "kxa-Latn-ZZ": "kxa",
+ "kxc-Ethi-ZZ": "kxc",
+ "kxm-Thai-TH": "kxm",
+ "kxp-Arab-PK": "kxp",
+ "kxw-Latn-ZZ": "kxw",
+ "kxz-Latn-ZZ": "kxz",
+ "ky-Arab-CN": "ky-CN",
+ "ky-Cyrl-KG": "ky",
+ "ky-Latn-TR": "ky-TR",
+ "kye-Latn-ZZ": "kye",
+ "kyx-Latn-ZZ": "kyx",
+ "kzr-Latn-ZZ": "kzr",
+ "la-Latn-VA": "la",
+ "lab-Lina-GR": "lab",
+ "lad-Hebr-IL": "lad",
+ "lag-Latn-TZ": "lag",
+ "lah-Arab-PK": "lah",
+ "laj-Latn-UG": "laj",
+ "las-Latn-ZZ": "las",
+ "lb-Latn-LU": "lb",
+ "lbe-Cyrl-RU": "lbe",
+ "lbu-Latn-ZZ": "lbu",
+ "lbw-Latn-ID": "lbw",
+ "lcm-Latn-ZZ": "lcm",
+ "lcp-Thai-CN": "lcp",
+ "ldb-Latn-ZZ": "ldb",
+ "led-Latn-ZZ": "led",
+ "lee-Latn-ZZ": "lee",
+ "lem-Latn-ZZ": "lem",
+ "lep-Lepc-IN": "lep",
+ "leq-Latn-ZZ": "leq",
+ "leu-Latn-ZZ": "leu",
+ "lez-Aghb-RU": "lez-Aghb",
+ "lez-Cyrl-RU": "lez",
+ "lg-Latn-UG": "lg",
+ "lgg-Latn-ZZ": "lgg",
+ "li-Latn-NL": "li",
+ "lia-Latn-ZZ": "lia",
+ "lid-Latn-ZZ": "lid",
+ "lif-Deva-NP": "lif",
+ "lif-Limb-IN": "lif-Limb",
+ "lig-Latn-ZZ": "lig",
+ "lih-Latn-ZZ": "lih",
+ "lij-Latn-IT": "lij",
+ "lis-Lisu-CN": "lis",
+ "ljp-Latn-ID": "ljp",
+ "lki-Arab-IR": "lki",
+ "lkt-Latn-US": "lkt",
+ "lle-Latn-ZZ": "lle",
+ "lln-Latn-ZZ": "lln",
+ "lmn-Telu-IN": "lmn",
+ "lmo-Latn-IT": "lmo",
+ "lmp-Latn-ZZ": "lmp",
+ "ln-Latn-CD": "ln",
+ "lns-Latn-ZZ": "lns",
+ "lnu-Latn-ZZ": "lnu",
+ "lo-Laoo-LA": "lo",
+ "loj-Latn-ZZ": "loj",
+ "lok-Latn-ZZ": "lok",
+ "lol-Latn-CD": "lol",
+ "lor-Latn-ZZ": "lor",
+ "los-Latn-ZZ": "los",
+ "loz-Latn-ZM": "loz",
+ "lrc-Arab-IR": "lrc",
+ "lt-Latn-LT": "lt",
+ "ltg-Latn-LV": "ltg",
+ "lu-Latn-CD": "lu",
+ "lua-Latn-CD": "lua",
+ "luo-Latn-KE": "luo",
+ "luy-Latn-KE": "luy",
+ "luz-Arab-IR": "luz",
+ "lv-Latn-LV": "lv",
+ "lwl-Thai-TH": "lwl",
+ "lzh-Hans-CN": "lzh",
+ "lzh-Phag-CN": "lzh-Phag",
+ "lzz-Latn-TR": "lzz",
+ "mad-Latn-ID": "mad",
+ "maf-Latn-CM": "maf",
+ "mag-Deva-IN": "mag",
+ "mai-Deva-IN": "mai",
+ "mai-Tirh-IN": "mai-Tirh",
+ "mak-Latn-ID": "mak",
+ "mak-Maka-ID": "mak-Maka",
+ "man-Latn-GM": "man",
+ "man-Nkoo-GN": "man-GN",
+ "mas-Latn-KE": "mas",
+ "maw-Latn-ZZ": "maw",
+ "maz-Latn-MX": "maz",
+ "mbh-Latn-ZZ": "mbh",
+ "mbo-Latn-ZZ": "mbo",
+ "mbq-Latn-ZZ": "mbq",
+ "mbu-Latn-ZZ": "mbu",
+ "mbw-Latn-ZZ": "mbw",
+ "mci-Latn-ZZ": "mci",
+ "mcp-Latn-ZZ": "mcp",
+ "mcq-Latn-ZZ": "mcq",
+ "mcr-Latn-ZZ": "mcr",
+ "mcu-Latn-ZZ": "mcu",
+ "mda-Latn-ZZ": "mda",
+ "mde-Arab-ZZ": "mde",
+ "mdf-Cyrl-RU": "mdf",
+ "mdh-Latn-PH": "mdh",
+ "mdj-Latn-ZZ": "mdj",
+ "mdr-Latn-ID": "mdr",
+ "mdx-Ethi-ZZ": "mdx",
+ "med-Latn-ZZ": "med",
+ "mee-Latn-ZZ": "mee",
+ "mek-Latn-ZZ": "mek",
+ "men-Latn-SL": "men",
+ "men-Mend-SL": "men-Mend",
+ "mer-Latn-KE": "mer",
+ "met-Latn-ZZ": "met",
+ "meu-Latn-ZZ": "meu",
+ "mfa-Arab-TH": "mfa",
+ "mfe-Latn-MU": "mfe",
+ "mfn-Latn-ZZ": "mfn",
+ "mfo-Latn-ZZ": "mfo",
+ "mfq-Latn-ZZ": "mfq",
+ "mg-Latn-MG": "mg",
+ "mgh-Latn-MZ": "mgh",
+ "mgl-Latn-ZZ": "mgl",
+ "mgo-Latn-CM": "mgo",
+ "mgp-Deva-NP": "mgp",
+ "mgy-Latn-TZ": "mgy",
+ "mh-Latn-MH": "mh",
+ "mhi-Latn-ZZ": "mhi",
+ "mhl-Latn-ZZ": "mhl",
+ "mi-Latn-NZ": "mi",
+ "mif-Latn-ZZ": "mif",
+ "min-Latn-ID": "min",
+ "mis-Hatr-IQ": "mis",
+ "mis-Medf-NG": "mis-Medf",
+ "miw-Latn-ZZ": "miw",
+ "mk-Cyrl-AL": "mk-AL",
+ "mk-Cyrl-GR": "mk-GR",
+ "mk-Cyrl-MK": "mk",
+ "mki-Arab-ZZ": "mki",
+ "mkl-Latn-ZZ": "mkl",
+ "mkp-Latn-ZZ": "mkp",
+ "mkw-Latn-ZZ": "mkw",
+ "ml-Mlym-IN": "ml",
+ "mle-Latn-ZZ": "mle",
+ "mlp-Latn-ZZ": "mlp",
+ "mls-Latn-SD": "mls",
+ "mmo-Latn-ZZ": "mmo",
+ "mmu-Latn-ZZ": "mmu",
+ "mmx-Latn-ZZ": "mmx",
+ "mn-Cyrl-MN": "mn",
+ "mn-Mong-CN": "mn-CN",
+ "mna-Latn-ZZ": "mna",
+ "mnf-Latn-ZZ": "mnf",
+ "mni-Beng-IN": "mni",
+ "mni-Mtei-IN": "mni-Mtei",
+ "mnw-Mymr-MM": "mnw",
+ "mnw-Mymr-TH": "mnw-TH",
+ "moa-Latn-ZZ": "moa",
+ "moe-Latn-CA": "moe",
+ "moh-Latn-CA": "moh",
+ "mos-Latn-BF": "mos",
+ "mox-Latn-ZZ": "mox",
+ "mpp-Latn-ZZ": "mpp",
+ "mps-Latn-ZZ": "mps",
+ "mpt-Latn-ZZ": "mpt",
+ "mpx-Latn-ZZ": "mpx",
+ "mql-Latn-ZZ": "mql",
+ "mr-Deva-IN": "mr",
+ "mr-Modi-IN": "mr-Modi",
+ "mrd-Deva-NP": "mrd",
+ "mrj-Cyrl-RU": "mrj",
+ "mro-Mroo-BD": "mro",
+ "ms-Arab-CC": "ms-CC",
+ "ms-Arab-ID": "ms-ID",
+ "ms-Latn-BN": "ms-BN",
+ "ms-Latn-MY": "ms",
+ "mt-Latn-MT": "mt",
+ "mtc-Latn-ZZ": "mtc",
+ "mtf-Latn-ZZ": "mtf",
+ "mti-Latn-ZZ": "mti",
+ "mtr-Deva-IN": "mtr",
+ "mua-Latn-CM": "mua",
+ "mur-Latn-ZZ": "mur",
+ "mus-Latn-US": "mus",
+ "mva-Latn-ZZ": "mva",
+ "mvn-Latn-ZZ": "mvn",
+ "mvy-Arab-PK": "mvy",
+ "mwk-Latn-ML": "mwk",
+ "mwr-Deva-IN": "mwr",
+ "mwv-Latn-ID": "mwv",
+ "mww-Hmnp-US": "mww",
+ "mxc-Latn-ZW": "mxc",
+ "mxm-Latn-ZZ": "mxm",
+ "my-Mymr-MM": "my",
+ "myk-Latn-ZZ": "myk",
+ "mym-Ethi-ZZ": "mym",
+ "myv-Cyrl-RU": "myv",
+ "myw-Latn-ZZ": "myw",
+ "myx-Latn-UG": "myx",
+ "myz-Mand-IR": "myz",
+ "mzk-Latn-ZZ": "mzk",
+ "mzm-Latn-ZZ": "mzm",
+ "mzn-Arab-IR": "mzn",
+ "mzp-Latn-ZZ": "mzp",
+ "mzw-Latn-ZZ": "mzw",
+ "mzz-Latn-ZZ": "mzz",
+ "na-Latn-NR": "na",
+ "nac-Latn-ZZ": "nac",
+ "naf-Latn-ZZ": "naf",
+ "nak-Latn-ZZ": "nak",
+ "nan-Hans-CN": "nan",
+ "nap-Latn-IT": "nap",
+ "naq-Latn-NA": "naq",
+ "nas-Latn-ZZ": "nas",
+ "nb-Latn-NO": "nb",
+ "nb-Latn-SJ": "nb-SJ",
+ "nca-Latn-ZZ": "nca",
+ "nce-Latn-ZZ": "nce",
+ "ncf-Latn-ZZ": "ncf",
+ "nch-Latn-MX": "nch",
+ "nco-Latn-ZZ": "nco",
+ "ncu-Latn-ZZ": "ncu",
+ "nd-Latn-ZW": "nd",
+ "ndc-Latn-MZ": "ndc",
+ "nds-Latn-DE": "nds",
+ "ne-Deva-BT": "ne-BT",
+ "ne-Deva-NP": "ne",
+ "neb-Latn-ZZ": "neb",
+ "new-Deva-NP": "new",
+ "new-Newa-NP": "new-Newa",
+ "nex-Latn-ZZ": "nex",
+ "nfr-Latn-ZZ": "nfr",
+ "ng-Latn-NA": "ng",
+ "nga-Latn-ZZ": "nga",
+ "ngb-Latn-ZZ": "ngb",
+ "ngl-Latn-MZ": "ngl",
+ "nhb-Latn-ZZ": "nhb",
+ "nhe-Latn-MX": "nhe",
+ "nhw-Latn-MX": "nhw",
+ "nif-Latn-ZZ": "nif",
+ "nii-Latn-ZZ": "nii",
+ "nij-Latn-ID": "nij",
+ "nin-Latn-ZZ": "nin",
+ "niu-Latn-NU": "niu",
+ "niy-Latn-ZZ": "niy",
+ "niz-Latn-ZZ": "niz",
+ "njo-Latn-IN": "njo",
+ "nkg-Latn-ZZ": "nkg",
+ "nko-Latn-ZZ": "nko",
+ "nl-Latn-AW": "nl-AW",
+ "nl-Latn-BE": "nl-BE",
+ "nl-Latn-NL": "nl",
+ "nl-Latn-SR": "nl-SR",
+ "nmg-Latn-CM": "nmg",
+ "nmz-Latn-ZZ": "nmz",
+ "nn-Latn-NO": "nn",
+ "nnf-Latn-ZZ": "nnf",
+ "nnh-Latn-CM": "nnh",
+ "nnk-Latn-ZZ": "nnk",
+ "nnm-Latn-ZZ": "nnm",
+ "nnp-Wcho-IN": "nnp",
+ "nod-Lana-TH": "nod",
+ "noe-Deva-IN": "noe",
+ "non-Runr-SE": "non",
+ "nop-Latn-ZZ": "nop",
+ "nou-Latn-ZZ": "nou",
+ "nqo-Nkoo-GN": "nqo",
+ "nr-Latn-ZA": "nr",
+ "nrb-Latn-ZZ": "nrb",
+ "nsk-Cans-CA": "nsk",
+ "nsn-Latn-ZZ": "nsn",
+ "nso-Latn-ZA": "nso",
+ "nss-Latn-ZZ": "nss",
+ "ntm-Latn-ZZ": "ntm",
+ "ntr-Latn-ZZ": "ntr",
+ "nui-Latn-ZZ": "nui",
+ "nup-Latn-ZZ": "nup",
+ "nus-Latn-SS": "nus",
+ "nuv-Latn-ZZ": "nuv",
+ "nux-Latn-ZZ": "nux",
+ "nv-Latn-US": "nv",
+ "nwb-Latn-ZZ": "nwb",
+ "nxq-Latn-CN": "nxq",
+ "nxr-Latn-ZZ": "nxr",
+ "ny-Latn-MW": "ny",
+ "nym-Latn-TZ": "nym",
+ "nyn-Latn-UG": "nyn",
+ "nzi-Latn-GH": "nzi",
+ "oc-Latn-FR": "oc",
+ "ogc-Latn-ZZ": "ogc",
+ "okr-Latn-ZZ": "okr",
+ "okv-Latn-ZZ": "okv",
+ "om-Latn-ET": "om",
+ "ong-Latn-ZZ": "ong",
+ "onn-Latn-ZZ": "onn",
+ "ons-Latn-ZZ": "ons",
+ "opm-Latn-ZZ": "opm",
+ "or-Orya-IN": "or",
+ "oro-Latn-ZZ": "oro",
+ "oru-Arab-ZZ": "oru",
+ "os-Cyrl-GE": "os",
+ "osa-Osge-US": "osa",
+ "ota-Arab-ZZ": "ota",
+ "otk-Orkh-MN": "otk",
+ "ozm-Latn-ZZ": "ozm",
+ "pa-Arab-PK": "pa-PK",
+ "pa-Guru-IN": "pa",
+ "pag-Latn-PH": "pag",
+ "pal-Phli-IR": "pal",
+ "pal-Phlp-CN": "pal-Phlp",
+ "pam-Latn-PH": "pam",
+ "pap-Latn-AW": "pap",
+ "pap-Latn-BQ": "pap-BQ",
+ "pap-Latn-CW": "pap-CW",
+ "pau-Latn-PW": "pau",
+ "pbi-Latn-ZZ": "pbi",
+ "pcd-Latn-FR": "pcd",
+ "pcm-Latn-NG": "pcm",
+ "pdc-Latn-US": "pdc",
+ "pdt-Latn-CA": "pdt",
+ "ped-Latn-ZZ": "ped",
+ "peo-Xpeo-IR": "peo",
+ "pex-Latn-ZZ": "pex",
+ "pfl-Latn-DE": "pfl",
+ "phl-Arab-ZZ": "phl",
+ "phn-Phnx-LB": "phn",
+ "pil-Latn-ZZ": "pil",
+ "pip-Latn-ZZ": "pip",
+ "pka-Brah-IN": "pka",
+ "pko-Latn-KE": "pko",
+ "pl-Latn-PL": "pl",
+ "pl-Latn-UA": "pl-UA",
+ "pla-Latn-ZZ": "pla",
+ "pms-Latn-IT": "pms",
+ "png-Latn-ZZ": "png",
+ "pnn-Latn-ZZ": "pnn",
+ "pnt-Grek-GR": "pnt",
+ "pon-Latn-FM": "pon",
+ "ppo-Latn-ZZ": "ppo",
+ "pra-Khar-PK": "pra",
+ "prd-Arab-IR": "prd",
+ "prg-Latn-001": "prg",
+ "ps-Arab-AF": "ps",
+ "pss-Latn-ZZ": "pss",
+ "pt-Latn-AO": "pt-AO",
+ "pt-Latn-BR": "pt",
+ "pt-Latn-CV": "pt-CV",
+ "pt-Latn-GW": "pt-GW",
+ "pt-Latn-MO": "pt-MO",
+ "pt-Latn-MZ": "pt-MZ",
+ "pt-Latn-PT": "pt-PT",
+ "pt-Latn-ST": "pt-ST",
+ "pt-Latn-TL": "pt-TL",
+ "ptp-Latn-ZZ": "ptp",
+ "puu-Latn-GA": "puu",
+ "pwa-Latn-ZZ": "pwa",
+ "qu-Latn-PE": "qu",
+ "quc-Latn-GT": "quc",
+ "qug-Latn-EC": "qug",
+ "rai-Latn-ZZ": "rai",
+ "raj-Deva-IN": "raj",
+ "rao-Latn-ZZ": "rao",
+ "rcf-Latn-RE": "rcf",
+ "rej-Latn-ID": "rej",
+ "rej-Rjng-ID": "rej-Rjng",
+ "rel-Latn-ZZ": "rel",
+ "res-Latn-ZZ": "res",
+ "rgn-Latn-IT": "rgn",
+ "rhg-Arab-MM": "rhg",
+ "rhg-Rohg-MM": "rhg-Rohg",
+ "ria-Latn-IN": "ria",
+ "rif-Latn-NL": "rif-NL",
+ "rif-Tfng-MA": "rif",
+ "rjs-Deva-NP": "rjs",
+ "rkt-Beng-BD": "rkt",
+ "rm-Latn-CH": "rm",
+ "rmf-Latn-FI": "rmf",
+ "rmo-Latn-CH": "rmo",
+ "rmt-Arab-IR": "rmt",
+ "rmu-Latn-SE": "rmu",
+ "rn-Latn-BI": "rn",
+ "rna-Latn-ZZ": "rna",
+ "rng-Latn-MZ": "rng",
+ "ro-Latn-MD": "ro-MD",
+ "ro-Latn-RO": "ro",
+ "rob-Latn-ID": "rob",
+ "rof-Latn-TZ": "rof",
+ "roo-Latn-ZZ": "roo",
+ "rro-Latn-ZZ": "rro",
+ "rtm-Latn-FJ": "rtm",
+ "ru-Cyrl-KZ": "ru-KZ",
+ "ru-Cyrl-RU": "ru",
+ "rue-Cyrl-UA": "rue",
+ "rug-Latn-SB": "rug",
+ "rw-Latn-RW": "rw",
+ "rwk-Latn-TZ": "rwk",
+ "rwo-Latn-ZZ": "rwo",
+ "ryu-Kana-JP": "ryu",
+ "sa-Bhks-IN": "sa-Bhks",
+ "sa-Deva-IN": "sa",
+ "sa-Gran-IN": "sa-Gran",
+ "sa-Nand-IN": "sa-Nand",
+ "sa-Shrd-IN": "sa-Shrd",
+ "sa-Sidd-IN": "sa-Sidd",
+ "saf-Latn-GH": "saf",
+ "sah-Cyrl-RU": "sah",
+ "saq-Latn-KE": "saq",
+ "sas-Latn-ID": "sas",
+ "sat-Latn-IN": "sat",
+ "sat-Olck-IN": "sat-Olck",
+ "sav-Latn-SN": "sav",
+ "saz-Saur-IN": "saz",
+ "sba-Latn-ZZ": "sba",
+ "sbe-Latn-ZZ": "sbe",
+ "sbp-Latn-TZ": "sbp",
+ "sc-Latn-IT": "sc",
+ "sck-Deva-IN": "sck",
+ "scl-Arab-ZZ": "scl",
+ "scn-Latn-IT": "scn",
+ "sco-Latn-GB": "sco",
+ "scs-Latn-CA": "scs",
+ "sd-Arab-PK": "sd",
+ "sd-Deva-IN": "sd-Deva",
+ "sd-Khoj-IN": "sd-Khoj",
+ "sd-Sind-IN": "sd-Sind",
+ "sdc-Latn-IT": "sdc",
+ "sdh-Arab-IR": "sdh",
+ "se-Latn-NO": "se",
+ "sef-Latn-CI": "sef",
+ "seh-Latn-MZ": "seh",
+ "sei-Latn-MX": "sei",
+ "ses-Latn-ML": "ses",
+ "sg-Latn-CF": "sg",
+ "sga-Ogam-IE": "sga",
+ "sgs-Latn-LT": "sgs",
+ "sgw-Ethi-ZZ": "sgw",
+ "sgz-Latn-ZZ": "sgz",
+ "shi-Tfng-MA": "shi",
+ "shk-Latn-ZZ": "shk",
+ "shn-Mymr-MM": "shn",
+ "shu-Arab-ZZ": "shu",
+ "si-Sinh-LK": "si",
+ "sid-Latn-ET": "sid",
+ "sig-Latn-ZZ": "sig",
+ "sil-Latn-ZZ": "sil",
+ "sim-Latn-ZZ": "sim",
+ "sjr-Latn-ZZ": "sjr",
+ "sk-Latn-SK": "sk",
+ "skc-Latn-ZZ": "skc",
+ "skr-Arab-PK": "skr",
+ "skr-Mult-PK": "skr-Mult",
+ "sks-Latn-ZZ": "sks",
+ "sl-Latn-SI": "sl",
+ "sld-Latn-ZZ": "sld",
+ "sli-Latn-PL": "sli",
+ "sll-Latn-ZZ": "sll",
+ "sly-Latn-ID": "sly",
+ "sm-Latn-AS": "sm-AS",
+ "sm-Latn-WS": "sm",
+ "sma-Latn-SE": "sma",
+ "smj-Latn-SE": "smj",
+ "smn-Latn-FI": "smn",
+ "smp-Samr-IL": "smp",
+ "smq-Latn-ZZ": "smq",
+ "sms-Latn-FI": "sms",
+ "sn-Latn-ZW": "sn",
+ "snc-Latn-ZZ": "snc",
+ "snk-Latn-ML": "snk",
+ "snp-Latn-ZZ": "snp",
+ "snx-Latn-ZZ": "snx",
+ "sny-Latn-ZZ": "sny",
+ "so-Latn-SO": "so",
+ "so-Osma-SO": "so-Osma",
+ "sog-Sogd-UZ": "sog",
+ "sog-Sogo-UZ": "sog-Sogo",
+ "sok-Latn-ZZ": "sok",
+ "soq-Latn-ZZ": "soq",
+ "sou-Thai-TH": "sou",
+ "soy-Latn-ZZ": "soy",
+ "spd-Latn-ZZ": "spd",
+ "spl-Latn-ZZ": "spl",
+ "sps-Latn-ZZ": "sps",
+ "sq-Elba-AL": "sq-Elba",
+ "sq-Latn-AL": "sq",
+ "sq-Latn-MK": "sq-MK",
+ "sq-Latn-XK": "sq-XK",
+ "sr-Cyrl-BA": "sr-BA",
+ "sr-Cyrl-RS": "sr",
+ "sr-Cyrl-XK": "sr-XK",
+ "sr-Latn-ME": "sr-ME",
+ "sr-Latn-RO": "sr-RO",
+ "sr-Latn-RU": "sr-RU",
+ "sr-Latn-TR": "sr-TR",
+ "srb-Sora-IN": "srb",
+ "srn-Latn-SR": "srn",
+ "srr-Latn-SN": "srr",
+ "srx-Deva-IN": "srx",
+ "ss-Latn-ZA": "ss",
+ "ssd-Latn-ZZ": "ssd",
+ "ssg-Latn-ZZ": "ssg",
+ "ssy-Latn-ER": "ssy",
+ "st-Latn-LS": "st-LS",
+ "st-Latn-ZA": "st",
+ "stk-Latn-ZZ": "stk",
+ "stq-Latn-DE": "stq",
+ "su-Latn-ID": "su",
+ "su-Sund-ID": "su-Sund",
+ "sua-Latn-ZZ": "sua",
+ "sue-Latn-ZZ": "sue",
+ "suk-Latn-TZ": "suk",
+ "sur-Latn-ZZ": "sur",
+ "sus-Latn-GN": "sus",
+ "sv-Latn-AX": "sv-AX",
+ "sv-Latn-SE": "sv",
+ "sw-Latn-CD": "sw-CD",
+ "sw-Latn-KE": "sw-KE",
+ "sw-Latn-TZ": "sw",
+ "sw-Latn-UG": "sw-UG",
+ "swb-Arab-YT": "swb",
+ "swg-Latn-DE": "swg",
+ "swp-Latn-ZZ": "swp",
+ "swv-Deva-IN": "swv",
+ "sxn-Latn-ID": "sxn",
+ "sxw-Latn-ZZ": "sxw",
+ "syl-Beng-BD": "syl",
+ "syl-Sylo-BD": "syl-Sylo",
+ "syr-Syrc-IQ": "syr",
+ "szl-Latn-PL": "szl",
+ "ta-Taml-IN": "ta",
+ "taj-Deva-NP": "taj",
+ "tal-Latn-ZZ": "tal",
+ "tan-Latn-ZZ": "tan",
+ "taq-Latn-ZZ": "taq",
+ "tbc-Latn-ZZ": "tbc",
+ "tbd-Latn-ZZ": "tbd",
+ "tbf-Latn-ZZ": "tbf",
+ "tbg-Latn-ZZ": "tbg",
+ "tbo-Latn-ZZ": "tbo",
+ "tbw-Latn-PH": "tbw",
+ "tbw-Tagb-PH": "tbw-Tagb",
+ "tbz-Latn-ZZ": "tbz",
+ "tci-Latn-ZZ": "tci",
+ "tcy-Knda-IN": "tcy",
+ "tdd-Tale-CN": "tdd",
+ "tdg-Deva-NP": "tdg",
+ "tdh-Deva-NP": "tdh",
+ "te-Telu-IN": "te",
+ "ted-Latn-ZZ": "ted",
+ "tem-Latn-SL": "tem",
+ "teo-Latn-UG": "teo",
+ "tet-Latn-TL": "tet",
+ "tfi-Latn-ZZ": "tfi",
+ "tg-Arab-PK": "tg-PK",
+ "tg-Cyrl-TJ": "tg",
+ "tgc-Latn-ZZ": "tgc",
+ "tgo-Latn-ZZ": "tgo",
+ "tgu-Latn-ZZ": "tgu",
+ "th-Thai-TH": "th",
+ "thl-Deva-NP": "thl",
+ "thq-Deva-NP": "thq",
+ "thr-Deva-NP": "thr",
+ "ti-Ethi-ER": "ti-ER",
+ "ti-Ethi-ET": "ti",
+ "tif-Latn-ZZ": "tif",
+ "tig-Ethi-ER": "tig",
+ "tik-Latn-ZZ": "tik",
+ "tim-Latn-ZZ": "tim",
+ "tio-Latn-ZZ": "tio",
+ "tiv-Latn-NG": "tiv",
+ "tk-Latn-AF": "tk-AF",
+ "tk-Latn-IR": "tk-IR",
+ "tk-Latn-TM": "tk",
+ "tkl-Latn-TK": "tkl",
+ "tkr-Latn-AZ": "tkr",
+ "tkt-Deva-NP": "tkt",
+ "tlf-Latn-ZZ": "tlf",
+ "tlx-Latn-ZZ": "tlx",
+ "tly-Latn-AZ": "tly",
+ "tmh-Latn-NE": "tmh",
+ "tmy-Latn-ZZ": "tmy",
+ "tn-Latn-ZA": "tn",
+ "tnh-Latn-ZZ": "tnh",
+ "to-Latn-TO": "to",
+ "tof-Latn-ZZ": "tof",
+ "tog-Latn-MW": "tog",
+ "toq-Latn-ZZ": "toq",
+ "tpi-Latn-PG": "tpi",
+ "tpm-Latn-ZZ": "tpm",
+ "tpz-Latn-ZZ": "tpz",
+ "tqo-Latn-ZZ": "tqo",
+ "tr-Latn-CY": "tr-CY",
+ "tr-Latn-TR": "tr",
+ "tru-Latn-TR": "tru",
+ "trv-Latn-TW": "trv",
+ "trw-Arab-ZZ": "trw",
+ "ts-Latn-ZA": "ts",
+ "tsd-Grek-GR": "tsd",
+ "tsg-Latn-PH": "tsg",
+ "tsj-Tibt-BT": "tsj",
+ "tsw-Latn-ZZ": "tsw",
+ "tt-Cyrl-RU": "tt",
+ "ttd-Latn-ZZ": "ttd",
+ "tte-Latn-ZZ": "tte",
+ "ttj-Latn-UG": "ttj",
+ "ttr-Latn-ZZ": "ttr",
+ "tts-Thai-TH": "tts",
+ "ttt-Latn-AZ": "ttt",
+ "tuh-Latn-ZZ": "tuh",
+ "tul-Latn-ZZ": "tul",
+ "tum-Latn-MW": "tum",
+ "tuq-Latn-ZZ": "tuq",
+ "tvd-Latn-ZZ": "tvd",
+ "tvl-Latn-TV": "tvl",
+ "tvu-Latn-ZZ": "tvu",
+ "twh-Latn-ZZ": "twh",
+ "twq-Latn-NE": "twq",
+ "txg-Tang-CN": "txg",
+ "ty-Latn-PF": "ty",
+ "tya-Latn-ZZ": "tya",
+ "tyv-Cyrl-RU": "tyv",
+ "tzm-Latn-MA": "tzm",
+ "ubu-Latn-ZZ": "ubu",
+ "udm-Cyrl-RU": "udm",
+ "ug-Arab-CN": "ug",
+ "ug-Cyrl-KZ": "ug-KZ",
+ "ug-Cyrl-MN": "ug-MN",
+ "uga-Ugar-SY": "uga",
+ "uk-Cyrl-MD": "uk-MD",
+ "uk-Cyrl-SK": "uk-SK",
+ "uk-Cyrl-UA": "uk",
+ "uli-Latn-FM": "uli",
+ "umb-Latn-AO": "umb",
+ "und-Latn-AQ": "und-AQ",
+ "und-Latn-BV": "und-BV",
+ "und-Latn-CP": "und-CP",
+ "und-Latn-GS": "und-GS",
+ "und-Latn-HM": "und-HM",
+ "unr-Beng-IN": "unr",
+ "unr-Deva-NP": "unr-NP",
+ "unx-Beng-IN": "unx",
+ "ur-Arab-IN": "ur-IN",
+ "ur-Arab-MU": "ur-MU",
+ "ur-Arab-PK": "ur",
+ "uri-Latn-ZZ": "uri",
+ "urt-Latn-ZZ": "urt",
+ "urw-Latn-ZZ": "urw",
+ "usa-Latn-ZZ": "usa",
+ "utr-Latn-ZZ": "utr",
+ "uvh-Latn-ZZ": "uvh",
+ "uvl-Latn-ZZ": "uvl",
+ "uz-Arab-AF": "uz-AF",
+ "uz-Cyrl-CN": "uz-CN",
+ "uz-Latn-UZ": "uz",
+ "vag-Latn-ZZ": "vag",
+ "vai-Vaii-LR": "vai",
+ "van-Latn-ZZ": "van",
+ "ve-Latn-ZA": "ve",
+ "vec-Latn-IT": "vec",
+ "vep-Latn-RU": "vep",
+ "vi-Latn-VN": "vi",
+ "vic-Latn-SX": "vic",
+ "viv-Latn-ZZ": "viv",
+ "vls-Latn-BE": "vls",
+ "vmf-Latn-DE": "vmf",
+ "vmw-Latn-MZ": "vmw",
+ "vo-Latn-001": "vo",
+ "vot-Latn-RU": "vot",
+ "vro-Latn-EE": "vro",
+ "vun-Latn-TZ": "vun",
+ "vut-Latn-ZZ": "vut",
+ "wa-Latn-BE": "wa",
+ "wae-Latn-CH": "wae",
+ "waj-Latn-ZZ": "waj",
+ "wal-Ethi-ET": "wal",
+ "wan-Latn-ZZ": "wan",
+ "war-Latn-PH": "war",
+ "wbp-Latn-AU": "wbp",
+ "wbq-Telu-IN": "wbq",
+ "wbr-Deva-IN": "wbr",
+ "wci-Latn-ZZ": "wci",
+ "wer-Latn-ZZ": "wer",
+ "wgi-Latn-ZZ": "wgi",
+ "whg-Latn-ZZ": "whg",
+ "wib-Latn-ZZ": "wib",
+ "wiu-Latn-ZZ": "wiu",
+ "wiv-Latn-ZZ": "wiv",
+ "wja-Latn-ZZ": "wja",
+ "wji-Latn-ZZ": "wji",
+ "wls-Latn-WF": "wls",
+ "wmo-Latn-ZZ": "wmo",
+ "wnc-Latn-ZZ": "wnc",
+ "wni-Arab-KM": "wni",
+ "wnu-Latn-ZZ": "wnu",
+ "wo-Latn-SN": "wo",
+ "wob-Latn-ZZ": "wob",
+ "wos-Latn-ZZ": "wos",
+ "wrs-Latn-ZZ": "wrs",
+ "wsg-Gong-IN": "wsg",
+ "wsk-Latn-ZZ": "wsk",
+ "wtm-Deva-IN": "wtm",
+ "wuu-Hans-CN": "wuu",
+ "wuv-Latn-ZZ": "wuv",
+ "wwa-Latn-ZZ": "wwa",
+ "xav-Latn-BR": "xav",
+ "xbi-Latn-ZZ": "xbi",
+ "xcr-Cari-TR": "xcr",
+ "xes-Latn-ZZ": "xes",
+ "xh-Latn-ZA": "xh",
+ "xla-Latn-ZZ": "xla",
+ "xlc-Lyci-TR": "xlc",
+ "xld-Lydi-TR": "xld",
+ "xmf-Geor-GE": "xmf",
+ "xmn-Mani-CN": "xmn",
+ "xmr-Merc-SD": "xmr",
+ "xmr-Mero-SD": "xmr-Mero",
+ "xna-Narb-SA": "xna",
+ "xnr-Deva-IN": "xnr",
+ "xog-Latn-UG": "xog",
+ "xon-Latn-ZZ": "xon",
+ "xpr-Prti-IR": "xpr",
+ "xrb-Latn-ZZ": "xrb",
+ "xsa-Sarb-YE": "xsa",
+ "xsi-Latn-ZZ": "xsi",
+ "xsm-Latn-ZZ": "xsm",
+ "xsr-Deva-NP": "xsr",
+ "xwe-Latn-ZZ": "xwe",
+ "yam-Latn-ZZ": "yam",
+ "yao-Latn-MZ": "yao",
+ "yap-Latn-FM": "yap",
+ "yas-Latn-ZZ": "yas",
+ "yat-Latn-ZZ": "yat",
+ "yav-Latn-CM": "yav",
+ "yay-Latn-ZZ": "yay",
+ "yaz-Latn-ZZ": "yaz",
+ "yba-Latn-ZZ": "yba",
+ "ybb-Latn-CM": "ybb",
+ "yby-Latn-ZZ": "yby",
+ "yer-Latn-ZZ": "yer",
+ "ygr-Latn-ZZ": "ygr",
+ "ygw-Latn-ZZ": "ygw",
+ "yi-Hebr-001": "yi",
+ "yi-Hebr-CA": "yi-CA",
+ "yi-Hebr-GB": "yi-GB",
+ "yi-Hebr-SE": "yi-SE",
+ "yi-Hebr-UA": "yi-UA",
+ "yi-Hebr-US": "yi-US",
+ "yko-Latn-ZZ": "yko",
+ "yle-Latn-ZZ": "yle",
+ "ylg-Latn-ZZ": "ylg",
+ "yll-Latn-ZZ": "yll",
+ "yml-Latn-ZZ": "yml",
+ "yo-Latn-NG": "yo",
+ "yon-Latn-ZZ": "yon",
+ "yrb-Latn-ZZ": "yrb",
+ "yre-Latn-ZZ": "yre",
+ "yrl-Latn-BR": "yrl",
+ "yss-Latn-ZZ": "yss",
+ "yua-Latn-MX": "yua",
+ "yue-Hans-CN": "yue-CN",
+ "yue-Hant-HK": "yue",
+ "yuj-Latn-ZZ": "yuj",
+ "yut-Latn-ZZ": "yut",
+ "yuw-Latn-ZZ": "yuw",
+ "za-Latn-CN": "za",
+ "zag-Latn-SD": "zag",
+ "zdj-Arab-KM": "zdj",
+ "zea-Latn-NL": "zea",
+ "zgh-Tfng-MA": "zgh",
+ "zh-Bopo-TW": "zh-Bopo",
+ "zh-Hanb-TW": "zh-Hanb",
+ "zh-Hani-CN": "zh-Hani",
+ "zh-Hans-CN": "zh",
+ "zh-Hant-AU": "zh-AU",
+ "zh-Hant-BN": "zh-BN",
+ "zh-Hant-GB": "zh-GB",
+ "zh-Hant-GF": "zh-GF",
+ "zh-Hant-HK": "zh-HK",
+ "zh-Hant-ID": "zh-ID",
+ "zh-Hant-MO": "zh-MO",
+ "zh-Hant-MY": "zh-MY",
+ "zh-Hant-PA": "zh-PA",
+ "zh-Hant-PF": "zh-PF",
+ "zh-Hant-PH": "zh-PH",
+ "zh-Hant-SR": "zh-SR",
+ "zh-Hant-TH": "zh-TH",
+ "zh-Hant-TW": "zh-TW",
+ "zh-Hant-US": "zh-US",
+ "zh-Hant-VN": "zh-VN",
+ "zhx-Nshu-CN": "zhx",
+ "zia-Latn-ZZ": "zia",
+ "zlm-Latn-TG": "zlm",
+ "zmi-Latn-MY": "zmi",
+ "zne-Latn-ZZ": "zne",
+ "zu-Latn-ZA": "zu",
+ "zza-Latn-TR": "zza",
+};
+
+for (let [tag, maximal] of Object.entries(maxLikelySubtags)) {
+ assertEq(new Intl.Locale(tag).maximize().toString(), maximal);
+}
+
+for (let [tag, minimal] of Object.entries(minLikelySubtags)) {
+ assertEq(new Intl.Locale(tag).minimize().toString(), minimal);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/likely-subtags.js b/js/src/tests/non262/Intl/Locale/likely-subtags.js
new file mode 100644
index 0000000000..73f00475d5
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/likely-subtags.js
@@ -0,0 +1,61 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+var testDataMaximal = {
+ // Keeps "und" primary language.
+ "und-AQ": "und-Latn-AQ",
+
+ // Modifies primary language.
+ "und-Cyrl-RO": "bg-Cyrl-RO",
+}
+
+var testDataMinimal = {
+ // Undefined primary language.
+ "und": "en",
+ "und-Thai": "th",
+ "und-419": "es-419",
+ "und-150": "ru",
+ "und-AT": "de-AT",
+
+ // https://ssl.icu-project.org/trac/ticket/13786
+ "aae-Latn-IT": "aae-Latn-IT",
+ "aae-Thai-CO": "aae-Thai-CO",
+
+ // https://ssl.icu-project.org/trac/ticket/10220
+ // https://ssl.icu-project.org/trac/ticket/12345
+ "und-CW": "pap-CW",
+ "und-US": "en",
+ "zh-Hant": "zh-TW",
+ "zh-Hani": "zh-Hani",
+};
+
+// Add variants, extensions, and privateuse subtags and ensure they don't
+// modify the result of the likely subtags algorithms.
+var extras = [
+ "fonipa",
+ "a-not-assigned",
+ "u-attr",
+ "u-co",
+ "u-co-phonebk",
+ "x-private",
+];
+
+for (var [tag, maximal] of Object.entries(testDataMaximal)) {
+ assertEq(new Intl.Locale(tag).maximize().toString(), maximal);
+ assertEq(new Intl.Locale(maximal).maximize().toString(), maximal);
+
+ for (var extra of extras) {
+ assertEq(new Intl.Locale(tag + "-" + extra).maximize().toString(), maximal + "-" + extra);
+ }
+}
+
+for (var [tag, minimal] of Object.entries(testDataMinimal)) {
+ assertEq(new Intl.Locale(tag).minimize().toString(), minimal);
+ assertEq(new Intl.Locale(minimal).minimize().toString(), minimal);
+
+ for (var extra of extras) {
+ assertEq(new Intl.Locale(tag + "-" + extra).minimize().toString(), minimal + "-" + extra);
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/same-compartment.js b/js/src/tests/non262/Intl/Locale/same-compartment.js
new file mode 100644
index 0000000000..fb71c85f6c
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/same-compartment.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl')||!this.wrapWithProto)
+
+var tag = "de-Latn-AT-u-ca-gregory-nu-latn-co-phonebk-kf-false-kn-hc-h23";
+var locale = new Intl.Locale(tag);
+var scwLocale = wrapWithProto(locale, Intl.Locale.prototype);
+
+for (var [key, {get, value = get}] of Object.entries(Object.getOwnPropertyDescriptors(Intl.Locale.prototype))) {
+ if (typeof value === "function") {
+ if (key !== "constructor") {
+ var expectedValue = value.call(locale);
+
+ if (typeof expectedValue === "string" || typeof expectedValue === "boolean") {
+ assertEq(value.call(scwLocale), expectedValue, key);
+ } else if (expectedValue instanceof Intl.Locale) {
+ assertEq(value.call(scwLocale).toString(), expectedValue.toString(), key);
+ } else {
+ throw new Error("unexpected result value");
+ }
+ } else {
+ assertEq(new value(scwLocale).toString(), new value(locale).toString(), key);
+ }
+ }
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/Locale/shell.js b/js/src/tests/non262/Intl/Locale/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/shell.js
diff --git a/js/src/tests/non262/Intl/Locale/surface.js b/js/src/tests/non262/Intl/Locale/surface.js
new file mode 100644
index 0000000000..ba90182436
--- /dev/null
+++ b/js/src/tests/non262/Intl/Locale/surface.js
@@ -0,0 +1,98 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+function assertProperty(object, name, desc) {
+ assertEq(desc === undefined || (typeof desc === "object" && desc !== null), true,
+ "desc is a property descriptor");
+
+ var actual = Object.getOwnPropertyDescriptor(object, name);
+ if (desc === undefined) {
+ assertEq(actual, desc, `property ${String(name)} is absent`);
+ return;
+ }
+ assertEq(actual !== undefined, true, `property ${String(name)} is present`);
+
+ var fields = ["value", "writable", "enumerable", "configurable", "get", "set"];
+ for (var field of fields) {
+ if (Object.prototype.hasOwnProperty.call(desc, field)) {
+ assertEq(actual[field], desc[field], `unexpected value for ${field}`);
+ }
+ }
+}
+
+function assertBuiltinFunction(fn, length, name) {
+ assertProperty(fn, "length", {
+ value: length, writable: false, enumerable: false, configurable: true,
+ });
+}
+
+function assertBuiltinMethod(object, propName, length, name) {
+ var desc = Object.getOwnPropertyDescriptor(object, propName);
+ assertProperty(object, propName, {
+ value: desc.value, writable: true, enumerable: false, configurable: true
+ });
+ assertBuiltinFunction(desc.value, length, name);
+}
+
+function assertBuiltinGetter(object, propName, length, name) {
+ var desc = Object.getOwnPropertyDescriptor(object, propName);
+
+ assertBuiltinFunction(desc.get, length, name);
+}
+
+// Intl.Locale( tag[, options] )
+assertBuiltinFunction(Intl.Locale, 1, "Locale");
+
+// Properties of the Intl.Locale Constructor
+
+// Intl.Locale.prototype
+assertProperty(Intl.Locale, "prototype", {
+ value: Intl.Locale.prototype, writable: false, enumerable: false, configurable: false,
+});
+
+// Properties of the Intl.Locale Prototype Object
+
+// Intl.Locale.prototype.constructor
+assertProperty(Intl.Locale.prototype, "constructor", {
+ value: Intl.Locale, writable: true, enumerable: false, configurable: true,
+});
+
+// Intl.Locale.prototype[ @@toStringTag ]
+assertProperty(Intl.Locale.prototype, Symbol.toStringTag, {
+ value: "Intl.Locale", writable: false, enumerable: false, configurable: true,
+});
+
+// Intl.Locale.prototype.toString ()
+assertBuiltinMethod(Intl.Locale.prototype, "toString", 0, "toString");
+
+// get Intl.Locale.prototype.baseName
+assertBuiltinGetter(Intl.Locale.prototype, "baseName", 0, "get baseName");
+
+// get Intl.Locale.prototype.calendar
+assertBuiltinGetter(Intl.Locale.prototype, "calendar", 0, "get calendar");
+
+// get Intl.Locale.prototype.collation
+assertBuiltinGetter(Intl.Locale.prototype, "collation", 0, "get collation");
+
+// get Intl.Locale.prototype.hourCycle
+assertBuiltinGetter(Intl.Locale.prototype, "hourCycle", 0, "get hourCycle");
+
+// get Intl.Locale.prototype.caseFirst
+assertBuiltinGetter(Intl.Locale.prototype, "caseFirst", 0, "get caseFirst");
+
+// get Intl.Locale.prototype.numeric
+assertBuiltinGetter(Intl.Locale.prototype, "numeric", 0, "get numeric");
+
+// get Intl.Locale.prototype.numberingSystem
+assertBuiltinGetter(Intl.Locale.prototype, "numberingSystem", 0, "get numberingSystem");
+
+// get Intl.Locale.prototype.language
+assertBuiltinGetter(Intl.Locale.prototype, "language", 0, "get language");
+
+// get Intl.Locale.prototype.script
+assertBuiltinGetter(Intl.Locale.prototype, "script", 0, "get script");
+
+// get Intl.Locale.prototype.region
+assertBuiltinGetter(Intl.Locale.prototype, "region", 0, "get region");
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js
new file mode 100644
index 0000000000..8f1b04426f
--- /dev/null
+++ b/js/src/tests/non262/Intl/NumberFormat/numberingSystem-option.js
@@ -0,0 +1,64 @@
+// |reftest| skip-if(release_or_beta)
+
+const defaultLocale = "en";
+const defaultNumberingSystem = new Intl.NumberFormat(defaultLocale).resolvedOptions().numberingSystem;
+
+function createWithLocale(locale, numberingSystem) {
+ return new Intl.NumberFormat(locale, {numberingSystem});
+}
+
+function create(numberingSystem) {
+ return createWithLocale(defaultLocale, numberingSystem);
+}
+
+// Empty string should throw.
+assertThrowsInstanceOf(() => create(""), RangeError);
+
+// Trailing \0 should throw.
+assertThrowsInstanceOf(() => create("latn\0"), RangeError);
+
+// Too short or too long strings should throw.
+assertThrowsInstanceOf(() => create("a"), RangeError);
+assertThrowsInstanceOf(() => create("toolongstring"), RangeError);
+
+// Throw even when prefix is valid.
+assertThrowsInstanceOf(() => create("latn-toolongstring"), RangeError);
+
+// |numberingSystem| can be set to |undefined|.
+let nf = create(undefined);
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Unsupported numbering systems are ignored.
+nf = create("xxxxxxxx");
+assertEq(nf.resolvedOptions().numberingSystem, defaultNumberingSystem);
+
+// Numbering system in options overwrite Unicode extension keyword.
+nf = createWithLocale(`${defaultLocale}-u-nu-thai`, "arab");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+// |numberingSystem| option ignores case.
+nf = create("ARAB");
+assertEq(nf.resolvedOptions().locale, defaultLocale);
+assertEq(nf.resolvedOptions().numberingSystem, "arab");
+
+const numberingSystems = [
+ "arab", "arabext", "bali", "beng", "deva",
+ "fullwide", "gujr", "guru", "hanidec", "khmr",
+ "knda", "laoo", "latn", "limb", "mlym",
+ "mong", "mymr", "orya", "tamldec", "telu",
+ "thai", "tibt",
+];
+
+for (let numberingSystem of numberingSystems) {
+ let nf1 = new Intl.NumberFormat(`${defaultLocale}-u-nu-${numberingSystem}`);
+ let nf2 = new Intl.NumberFormat(defaultLocale, {numberingSystem});
+
+ assertEq(nf1.resolvedOptions().numberingSystem, numberingSystem);
+ assertEq(nf2.resolvedOptions().numberingSystem, numberingSystem);
+
+ assertEq(nf2.format(0), nf1.format(0));
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js b/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js
new file mode 100644
index 0000000000..481d4ed7f1
--- /dev/null
+++ b/js/src/tests/non262/Intl/best-available-locale-from-default-locale.js
@@ -0,0 +1,107 @@
+// |reftest| skip-if(!this.hasOwnProperty('Intl'))
+
+if (typeof getDefaultLocale === "undefined") {
+ var getDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().getDefaultLocale;
+}
+if (typeof setDefaultLocale === "undefined") {
+ var setDefaultLocale = SpecialPowers.Cu.getJSTestingFunctions().setDefaultLocale;
+}
+
+let defaultLocale = null;
+
+function withLocale(locale, fn) {
+ if (defaultLocale === null)
+ defaultLocale = getDefaultLocale();
+
+ setDefaultLocale(locale);
+ try {
+ fn();
+ } finally {
+ setDefaultLocale(defaultLocale);
+ }
+}
+
+// This test assumes German ("de") is a supported locale.
+const supported = Intl.Collator.supportedLocalesOf("de");
+assertEq(supported.length, 1);
+assertEq(supported[0], "de");
+
+withLocale("de", () => {
+ // Ensure the new default locale is now active.
+ assertEq(new Intl.Collator().resolvedOptions().locale, "de");
+
+ // "de" is the active default locale, so explicitly requesting "de" should succeed.
+ assertEq(new Intl.Collator("de").resolvedOptions().locale, "de");
+
+ // ICU doesn't provide a specialised "de-ZA" locale, so we fallback to "de".
+ assertEq(new Intl.Collator("de-ZA").resolvedOptions().locale, "de");
+
+ // ICU doesn't provide a specialised "de-ZA" locale, so we fallback to "de".
+ assertEq(new Intl.Collator("de-ZA-x-private").resolvedOptions().locale, "de");
+});
+
+// As demonstrated above, "de-ZA-x-private" normally isn't a supported Intl.Collator locale. But
+// when used as the default locale, it gets promoted to being supported, because its parent locale
+// "de" is supported and can act as a fallback.
+//
+// This works as follows:
+// We accept any default locale as long as it can be supported either explicitly or implicitly
+// through a fallback. But when we claim a default locale is supported, we also need to make sure
+// we report any parent locale as being supported. So when "de-ZA-x-private" is accepted as the
+// default locale, we also need to report its parent locale "de-ZA" as a supported locale.
+//
+// The reason we're doing this, is to make sure we aren't limiting the supported default locale to
+// the intersection of the sets of supported locales for each Intl service constructor. Also see
+// the requirements in <https://tc39.es/ecma402/#sec-internal-slots>, which state that the default
+// locale must be a member of [[AvailableLocales]] for every Intl service constructor.
+//
+// So the following statement must hold:
+//
+// ∀ Constructor ∈ IntlConstructors: DefaultLocale ∈ Constructor.[[AvailableLocales]]
+//
+// This can trivially be achieved when we restrict the default locale to:
+//
+// { RequestedLocale if RequestedLocale ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// DefaultLocale = { Fallback(RequestedLocale) if Fallback(RequestedLocale) ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// { LastDitchLocale otherwise
+//
+// But that severely restricts the possible default locales. For example, "de-CH" is supported by
+// all Intl constructors except Intl.Collator. Intl.Collator itself only provides explicit support
+// for the parent locale "de". So with the trivial solution we'd need to mark "de-CH" as an invalid
+// default locale and instead use its fallback locale "de".
+//
+// So instead of that we're using the following approach:
+//
+// { RequestedLocale if RequestedLocale ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// DefaultLocale = { RequestedLocale if Fallback(RequestedLocale) ∈ (∩ C.[[AvailableLocales]])
+// { C ∈ IntlConstructors
+// {
+// { LastDitchLocale otherwise
+//
+// So even when the requested default locale is only implicitly supported through a fallback, we
+// still accept it as a valid default locale.
+withLocale("de-ZA-x-private", () => {
+ // Ensure the new default locale is now active.
+ assertEq(new Intl.Collator().resolvedOptions().locale, "de-ZA-x-private");
+
+ // "de-ZA-x-private" is the active default locale, so explicitly requesting the parent locale
+ // "de" should succeed.
+ assertEq(new Intl.Collator("de").resolvedOptions().locale, "de");
+
+ // "de-ZA-x-private" is the active default locale, so explicitly requesting the parent locale
+ // "de-ZA" should succeed.
+ assertEq(new Intl.Collator("de-ZA").resolvedOptions().locale, "de-ZA");
+
+ // "de-ZA-x-private" is the active default locale, so explicitly requesting "de-ZA-x-private"
+ // should succeed.
+ assertEq(new Intl.Collator("de-ZA-x-private").resolvedOptions().locale, "de-ZA-x-private");
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js b/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js
new file mode 100644
index 0000000000..ead69a4632
--- /dev/null
+++ b/js/src/tests/non262/Intl/extensions/unicode-extension-sequences.js
@@ -0,0 +1,74 @@
+// |reftest| skip-if(!this.getSelfHostedValue)
+
+const startOfUnicodeExtensions = getSelfHostedValue("startOfUnicodeExtensions");
+const endOfUnicodeExtensions = getSelfHostedValue("endOfUnicodeExtensions");
+
+const testcases = [
+ // Language tag without Unicode extension.
+ { locale: "en", start: -1, end: 0 },
+ { locale: "en-Latn", start: -1, end: 0 },
+ { locale: "en-x-y", start: -1, end: 0 },
+ { locale: "en-x-yz", start: -1, end: 0 },
+ { locale: "en-x-u-kf", start: -1, end: 0 },
+
+ // Unicode extension sequence starts with key subtag.
+ // - no suceeding key or type subtags.
+ { locale: "en-u-ab", start: 2, end: 7 },
+ { locale: "en-u-ab-x-y", start: 2, end: 7 },
+ { locale: "en-u-ab-x-yz", start: 2, end: 7 },
+ { locale: "en-u-ab-x-u-kn", start: 2, end: 7 },
+ // - followed by key subtag.
+ { locale: "en-u-ab-cd", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-y", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-yz", start: 2, end: 10 },
+ { locale: "en-u-ab-cd-x-u-kn", start: 2, end: 10 },
+ // - followed by type subtag.
+ { locale: "en-u-ab-cdef", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-y", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-yz", start: 2, end: 12 },
+ { locale: "en-u-ab-cdef-x-y-u-kn", start: 2, end: 12 },
+
+ // Unicode extension sequence starts with attribute subtag.
+ // - no suceeding attribute or key subtags.
+ { locale: "en-u-abc", start: 2, end: 8 },
+ { locale: "en-u-abc-x-y", start: 2, end: 8 },
+ { locale: "en-u-abc-x-yz", start: 2, end: 8 },
+ { locale: "en-u-abc-x-y-u-kn", start: 2, end: 8 },
+ // - followed by attribute subtag.
+ { locale: "en-u-abc-def", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-y", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-yz", start: 2, end: 12 },
+ { locale: "en-u-abc-def-x-y-u-kn", start: 2, end: 12 },
+ // - followed by key subtag.
+ { locale: "en-u-abc-de", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-y", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-yz", start: 2, end: 11 },
+ { locale: "en-u-abc-de-x-y-u-kn", start: 2, end: 11 },
+ // - followed by two key subtags.
+ { locale: "en-u-abc-de-fg", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-y", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-yz", start: 2, end: 14 },
+ { locale: "en-u-abc-de-fg-x-y-u-kn", start: 2, end: 14 },
+ // - followed by key and type subtag.
+ { locale: "en-u-abc-de-fgh", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-y", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-yz", start: 2, end: 15 },
+ { locale: "en-u-abc-de-fgh-x-y-u-kn", start: 2, end: 15 },
+
+ // Also test when the Unicode extension doesn't start at index 2.
+ { locale: "en-Latn-u-kf", start: 7, end: 12 },
+ { locale: "und-u-kf", start: 3, end: 8 },
+];
+
+for (const {locale, start, end} of testcases) {
+ // Ensure the input is a valid language tag.
+ assertEqArray(Intl.getCanonicalLocales(locale), [locale]);
+
+ assertEq(startOfUnicodeExtensions(locale), start);
+
+ if (start >= 0)
+ assertEq(endOfUnicodeExtensions(locale, start), end);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/tolower-ascii-equivalent.js b/js/src/tests/non262/Intl/tolower-ascii-equivalent.js
new file mode 100644
index 0000000000..ac3cbfb7d3
--- /dev/null
+++ b/js/src/tests/non262/Intl/tolower-ascii-equivalent.js
@@ -0,0 +1,47 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Language tags are processed case-insensitive, but unconditionally calling
+// the built-in String.prototype.toLowerCase() or toUpperCase() function
+// before parsing a language tag can map non-ASCII characters into the ASCII
+// range.
+//
+// Validate the Unicode BCP 47 locale identifier parser handles this case
+// (pun intended) correctly by passing language tags which contain
+// U+212A (KELVIN SIGN) and U+0131 (LATIN SMALL LETTER DOTLESS I) to
+// Intl.getCanonicalLocales().
+
+// The lower-case form of "i-ha\u212A" is "i-hak".
+assertEq("i-hak", "i-ha\u212A".toLowerCase());
+
+// The upper-case form of "\u0131-hak" is "I-HAK".
+assertEq("I-HAK", "\u0131-hak".toUpperCase());
+
+// "i-hak" is not a valid Unicode BCP 47 locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("i-hak"), RangeError);
+
+// And neither is "i-ha\u212A".
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("i-ha\u212A"), RangeError);
+
+// And also "\u0131-hak" isn't valid.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("\u0131-hak"), RangeError);
+
+// The lower-case form of "zh-ha\u212A\u212Aa" is "zh-hakka".
+assertEq("zh-hakka", "zh-ha\u212A\u212Aa".toLowerCase());
+
+// "zh-hakka" is a valid Unicode BCP 47 locale identifier.
+assertEqArray(Intl.getCanonicalLocales("zh-hakka"), ["hak"]);
+
+// But "zh-ha\u212A\u212Aa" is not a valid locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("zh-ha\u212A\u212Aa"), RangeError);
+
+// The lower-case form of "zh-x\u0131ang" is "ZH-XIANG".
+assertEq("ZH-XIANG", "zh-x\u0131ang".toUpperCase());
+
+// "zh-xiang" is a valid Unicode BCP 47 locale identifier.
+assertEqArray(Intl.getCanonicalLocales("zh-xiang"), ["hsn"]);
+
+// But "zh-x\u0131ang" is not a valid locale identifier.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("zh-x\u0131ang"), RangeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js
new file mode 100644
index 0000000000..7e9aae5519
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-extlangs.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode BCP 47 locale identifiers don't support extlang subtags.
+const invalid = [
+ // Two letter language code followed by extlang subtags.
+ "en-abc",
+ "en-abc-def",
+ "en-abc-def-ghi",
+
+ // Three letter language code followed by extlang subtags.
+ "und-abc",
+ "und-abc-def",
+ "und-abc-def-ghi",
+];
+
+for (let locale of invalid) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-grandfathered.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-grandfathered.js
new file mode 100644
index 0000000000..028127f110
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-grandfathered.js
@@ -0,0 +1,52 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode BCP 47 locale identifiers don't support irregular grandfathered tags.
+var irregularGrandfathered = [
+ "en-gb-oed",
+ "i-ami",
+ "i-bnn",
+ "i-default",
+ "i-enochian",
+ "i-hak",
+ "i-klingon",
+ "i-lux",
+ "i-mingo",
+ "i-navajo",
+ "i-pwn",
+ "i-tao",
+ "i-tay",
+ "i-tsu",
+ "sgn-be-fr",
+ "sgn-be-nl",
+ "sgn-ch-de",
+];
+
+// Unicode BCP 47 locale identifiers don't support regular grandfathered tags
+// which contain an extlang-like subtag.
+var regularGrandfatheredWithExtlangLike = [
+ "no-bok",
+ "no-nyn",
+ "zh-min",
+ "zh-min-nan",
+];
+
+// Unicode BCP 47 locale identifiers do support regular grandfathered tags
+// which contain a variant-like subtag.
+var regularGrandfatheredWithVariantLike = {
+ "art-lojban": "jbo",
+ "cel-gaulish": "xtg-x-cel-gaulish",
+ "zh-guoyu": "zh",
+ "zh-hakka": "hak",
+ "zh-xiang": "hsn",
+};
+
+for (let locale of [...irregularGrandfathered, ...regularGrandfatheredWithExtlangLike]) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+for (let [locale, canonical] of Object.entries(regularGrandfatheredWithVariantLike)) {
+ assertEq(Intl.getCanonicalLocales(locale)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js
new file mode 100644
index 0000000000..a37cd603a0
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-language-mappings.js
@@ -0,0 +1,39 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// For the most part the mappings from IANA are a subset of the CLDR mappings.
+// So there are mappings which are consistent across both databases.
+assertEq(Intl.getCanonicalLocales("iw")[0], "he");
+
+// But some languages are mapped differently.
+//
+// From the IANA language data registry:
+// Type: language
+// Subtag: drh
+// Description: Darkhat
+// Added: 2009-07-29
+// Deprecated: 2010-03-11
+// Preferred-Value: khk
+//
+// From CLDR:
+// <languageAlias type="drh" replacement="mn" reason="deprecated"/>
+//
+// because CLDR also maps macro-languages:
+// <languageAlias type="khk" replacement="mn" reason="macrolanguage"/>
+assertEq(Intl.getCanonicalLocales("drh")[0], "mn");
+
+// CLDR maps macro-languages:
+// <languageAlias type="cmn" replacement="zh" reason="macrolanguage"/>
+assertEq(Intl.getCanonicalLocales("cmn")[0], "zh");
+
+// CLDR also contains mappings from ISO-639-2 (B/T) to 639-1 codes:
+// <languageAlias type="dut" replacement="nl" reason="bibliographic"/>
+// <languageAlias type="nld" replacement="nl" reason="overlong"/>
+assertEq(Intl.getCanonicalLocales("dut")[0], "nl");
+assertEq(Intl.getCanonicalLocales("nld")[0], "nl");
+
+// CLDR has additional mappings for legacy language codes.
+// <languageAlias type="no" replacement="nb" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("no")[0], "nb");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js
new file mode 100644
index 0000000000..320e1b02c0
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-languages-mappings-complex.js
@@ -0,0 +1,21 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// CLDR contains language mappings where in addition to the language subtag also
+// the script or region subtag is modified, unless they're already present.
+
+// <languageAlias type="sh" replacement="sr_Latn" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("sh")[0], "sr-Latn");
+assertEq(Intl.getCanonicalLocales("sh-RS")[0], "sr-Latn-RS");
+assertEq(Intl.getCanonicalLocales("sh-Cyrl")[0], "sr-Cyrl");
+
+// <languageAlias type="cnr" replacement="sr_ME" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("cnr")[0], "sr-ME");
+assertEq(Intl.getCanonicalLocales("cnr-Latn")[0], "sr-Latn-ME");
+assertEq(Intl.getCanonicalLocales("cnr-RS")[0], "sr-RS");
+
+// Aliases where more than just a language subtag are present are ignored.
+// <languageAlias type="sr_RS" replacement="sr_Cyrl_RS" reason="legacy"/>
+assertEq(Intl.getCanonicalLocales("sr-RS")[0], "sr-RS");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js
new file mode 100644
index 0000000000..22dbd17a1d
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings-complex.js
@@ -0,0 +1,57 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// CLDR contains region mappings where the replacement region depends on the
+// likely subtags from the language and script subtags.
+//
+// For example, the breakup of the Soviet Union ("SU") means that the region of
+// the Soviet Union ("SU") is replaced by Russia ("RU"), Armenia ("AM"), or
+// many others -- depending on the specified (or merely likely) language and
+// script subtags:
+//
+// <territoryAlias type="SU" replacement="RU AM AZ BY EE GE KZ KG LV LT MD TJ TM UA UZ" reason="deprecated"/>
+//
+// Armenia can be the preferred region when the language is "hy" (Armenian) or
+// the script is "Armn" (Armenian).
+//
+// <likelySubtag from="hy" to="hy_Armn_AM"/>
+// <likelySubtag from="und_Armn" to="hy_Armn_AM"/>
+assertEq(Intl.getCanonicalLocales("ru-SU")[0], "ru-RU");
+assertEq(Intl.getCanonicalLocales("en-SU")[0], "en-RU");
+assertEq(Intl.getCanonicalLocales("und-SU")[0], "und-RU");
+assertEq(Intl.getCanonicalLocales("und-Latn-SU")[0], "und-Latn-RU");
+assertEq(Intl.getCanonicalLocales("hy-SU")[0], "hy-AM");
+assertEq(Intl.getCanonicalLocales("und-Armn-SU")[0], "und-Armn-AM");
+
+// <territoryAlias type="CS" replacement="RS ME" reason="deprecated"/>
+//
+// The following likely-subtags entries contain "RS" and "ME":
+//
+// <likelySubtag from="sr" to="sr_Cyrl_RS"/>
+// <likelySubtag from="sr_ME" to="sr_Latn_ME"/>
+// <likelySubtag from="und_RS" to="sr_Cyrl_RS"/>
+// <likelySubtag from="und_ME" to="sr_Latn_ME"/>
+//
+// In this case there is no language/script combination (without a region
+// subtag) where "ME" is ever chosen, so the replacement is always "RS".
+assertEq(Intl.getCanonicalLocales("sr-CS")[0], "sr-RS");
+assertEq(Intl.getCanonicalLocales("sr-Latn-CS")[0], "sr-Latn-RS");
+assertEq(Intl.getCanonicalLocales("sr-Cyrl-CS")[0], "sr-Cyrl-RS");
+
+// The existing region in the source locale identifier is ignored when selecting
+// the likely replacement region. For example take "az-NT", which is Azerbaijani
+// spoken in the Neutral Zone. The replacement region for "NT" is either
+// "SA" (Saudi-Arabia) or "IQ" (Iraq), and there is also a likely subtags entry
+// for "az-IQ". But when only looking at the language subtag in "az-NT", "az" is
+// always resolved to "az-Latn-AZ", and because "AZ" is not in the list ["SA",
+// "IQ"], the final replacement region is the default for "NT", namely "SA".
+// That means "az-NT" will be canonicalised to "az-SA" and not "az-IQ", even
+// though the latter may be a more sensible candidate based on the actual usage
+// of the target locales.
+//
+// <territoryAlias type="NT" replacement="SA IQ" reason="deprecated"/>
+// <likelySubtag from="az_IQ" to="az_Arab_IQ"/>
+// <likelySubtag from="az" to="az_Latn_AZ"/>
+assertEq(Intl.getCanonicalLocales("az-NT")[0], "az-SA");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js
new file mode 100644
index 0000000000..affebb33b8
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-region-mappings.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// For the most part the mappings from IANA are a subset of the CLDR mappings.
+// So there are mappings which are consistent across both databases.
+assertEq(Intl.getCanonicalLocales("de-DD")[0], "de-DE");
+
+// CLDR contains additional mappings:
+// <territoryAlias type="QU" replacement="EU" reason="deprecated"/>
+// <territoryAlias type="UK" replacement="GB" reason="deprecated"/>
+assertEq(Intl.getCanonicalLocales("und-QU")[0], "und-EU");
+assertEq(Intl.getCanonicalLocales("en-UK")[0], "en-GB");
+
+// CLDR additional maps ISO 3166-1 numeric to ISO 3166-1 alpha-2 codes:
+// <territoryAlias type="280" replacement="DE" reason="deprecated"/>
+// <territoryAlias type="278" replacement="DE" reason="overlong"/>
+// <territoryAlias type="276" replacement="DE" reason="overlong"/>
+assertEq(Intl.getCanonicalLocales("de-280")[0], "de-DE");
+assertEq(Intl.getCanonicalLocales("de-278")[0], "de-DE");
+assertEq(Intl.getCanonicalLocales("de-276")[0], "de-DE");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js
new file mode 100644
index 0000000000..9ed09a23f1
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-sign-languages.js
@@ -0,0 +1,18 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// The IANA language subtag registry contains replacements for sign language
+// codes marked as redundant. For example:
+//
+// Type: redundant
+// Tag: sgn-DE
+// Description: German Sign Language
+// Added: 2001-11-11
+// Deprecated: 2009-07-29
+// Preferred-Value: gsg
+//
+// CLDR doesn't contain these mappings. Make sure we follow CLDR instead of IANA.
+
+assertEq(Intl.getCanonicalLocales("sgn-DE")[0], "sgn-DE");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js
new file mode 100644
index 0000000000..50ac20e58b
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-transformed-ext.js
@@ -0,0 +1,71 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+const invalid = [
+ // empty
+ "en-t",
+ "en-t-a",
+ "en-t-x",
+ "en-t-0",
+
+ // incomplete
+ "en-t-",
+ "en-t-en-",
+ "en-t-0x-",
+
+ // tlang: unicode_language_subtag must be 2-3 or 5-8 characters and mustn't
+ // contain extlang subtags.
+ "en-t-root",
+ "en-t-abcdefghi",
+ "en-t-ar-aao",
+
+ // tlang: unicode_script_subtag must be 4 alphabetical characters, can't
+ // be repeated.
+ "en-t-en-lat0",
+ "en-t-en-latn-latn",
+
+ // tlang: unicode_region_subtag must either be 2 alpha characters or a three
+ // digit code.
+ "en-t-en-0",
+ "en-t-en-00",
+ "en-t-en-0x",
+ "en-t-en-x0",
+ "en-t-en-latn-0",
+ "en-t-en-latn-00",
+ "en-t-en-latn-xyz",
+
+ // tlang: unicode_variant_subtag is either 5-8 alphanum characters or 4
+ // characters starting with a digit.
+ "en-t-en-abcdefghi",
+ "en-t-en-latn-gb-ab",
+ "en-t-en-latn-gb-abc",
+ "en-t-en-latn-gb-abcd",
+ "en-t-en-latn-gb-abcdefghi",
+];
+
+// Canonicalisation also applies for the transformation extension. But also
+// see <https://github.com/tc39/ecma402/issues/330>.
+const valid = [
+ {locale: "en-t-en", canonical: "en-t-en"},
+ {locale: "en-t-en-latn", canonical: "en-t-en-latn"},
+ {locale: "en-t-en-ca", canonical: "en-t-en-ca"},
+ {locale: "en-t-en-latn-ca", canonical: "en-t-en-latn-ca"},
+ {locale: "en-t-en-emodeng", canonical: "en-t-en-emodeng"},
+ {locale: "en-t-en-latn-emodeng", canonical: "en-t-en-latn-emodeng"},
+ {locale: "en-t-en-latn-ca-emodeng", canonical: "en-t-en-latn-ca-emodeng"},
+ {locale: "sl-t-sl-rozaj-biske-1994", canonical: "sl-t-sl-1994-biske-rozaj"},
+ {locale: "DE-T-M0-DIN-K0-QWERTZ", canonical: "de-t-k0-qwertz-m0-din"},
+ {locale: "en-t-m0-true", canonical: "en-t-m0-true"},
+ {locale: "en-t-iw", canonical: "en-t-he"},
+ {locale: "und-Latn-t-und-hani-m0-names", canonical: "und-Latn-t-und-hani-m0-prprname"},
+];
+
+for (let locale of invalid) {
+ assertThrowsInstanceOf(() => Intl.getCanonicalLocales(locale), RangeError);
+}
+
+for (let {locale, canonical} of valid) {
+ assertEq(Intl.getCanonicalLocales(locale)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js
new file mode 100644
index 0000000000..a46eba475e
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-unicode-ext.js
@@ -0,0 +1,12 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Unicode locale extension sequences don't allow keys with a digit as their
+// second character.
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("en-u-c0"), RangeError);
+assertThrowsInstanceOf(() => Intl.getCanonicalLocales("en-u-00"), RangeError);
+
+// The first character is allowed to be a digit.
+assertEq(Intl.getCanonicalLocales("en-u-0c")[0], "en-u-0c");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js
new file mode 100644
index 0000000000..49e31c6786
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-legacy-mappings.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// ECMA-402 includes mapping of legacy variants, as long as they're also present
+// in <variantAlias> in CLDR's supplementalMetadata.xml
+// <https://www.unicode.org/reports/tr35/#Legacy_Variants>
+
+assertEq(Intl.getCanonicalLocales("sv-AALAND")[0], "sv-AX");
+assertEq(Intl.getCanonicalLocales("no-BOKMAL")[0], "nb-bokmal");
+assertEq(Intl.getCanonicalLocales("no-NYNORSK")[0], "nb-nynorsk");
+assertEq(Intl.getCanonicalLocales("en-POSIX")[0], "en-posix");
+assertEq(Intl.getCanonicalLocales("el-POLYTONI")[0], "el-polyton");
+assertEq(Intl.getCanonicalLocales("aa-SAAHO")[0], "aa-saaho");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js
new file mode 100644
index 0000000000..e50436a83c
--- /dev/null
+++ b/js/src/tests/non262/Intl/unicode-bcp47-locale-ids-variants-sorted.js
@@ -0,0 +1,31 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// UTS 35, 3.2.1 Canonical Unicode Locale Identifiers:
+// - Any variants are in alphabetical order.
+
+assertEq(Intl.getCanonicalLocales("en-scouse-fonipa")[0], "en-fonipa-scouse");
+
+// Sorting in alphabetical order may turn a valid BCP 47 language tag into a
+// BCP 47 language tag which is only well-formed, but no longer valid. This
+// means there are potential compatibility issues when converting between
+// Unicode BCP 47 locale identifiers and BCP 47 language tags.
+//
+// Spec: https://tools.ietf.org/html/rfc5646#section-2.2.9
+
+// <https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry>
+//
+// Type: variant
+// Subtag: 1994
+// Description: Standardized Resian orthography
+// Added: 2007-07-28
+// Prefix: sl-rozaj
+// Prefix: sl-rozaj-biske
+// Prefix: sl-rozaj-njiva
+// Prefix: sl-rozaj-osojs
+// Prefix: sl-rozaj-solba
+// Comments: For standardized Resian an orthography was published in 1994.
+
+assertEq(Intl.getCanonicalLocales("sl-rozaj-biske-1994")[0], "sl-1994-biske-rozaj");
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
diff --git a/js/src/tests/non262/Intl/variant-with-preferred-value.js b/js/src/tests/non262/Intl/variant-with-preferred-value.js
new file mode 100644
index 0000000000..c0c342f0e0
--- /dev/null
+++ b/js/src/tests/non262/Intl/variant-with-preferred-value.js
@@ -0,0 +1,58 @@
+// |reftest| skip-if(!this.hasOwnProperty("Intl"))
+
+// Per UTS 35, computing the canonical form for Unicode BCP 47 locale identifiers
+// includes replacing deprecated variant mappings. The other UTS 35 canonicalisation
+// algorithm ("BCP 47 Language Tag to Unicode BCP 47 Locale Identifier") doesn't
+// support deprecated variant mappings.
+// https://github.com/tc39/ecma402/issues/330
+
+const languageTags = {
+ // The preferred value of "hy-arevela" is "hy" per CLDR.
+ "hy-arevela": "hy",
+ "hy-Armn-arevela": "hy-Armn",
+ "hy-AM-arevela": "hy-AM",
+ "hy-arevela-fonipa": "hy-fonipa",
+ "hy-fonipa-arevela": "hy-fonipa",
+
+ // The preferred value of "hy-arevmda" is "hyw" per CLDR.
+ "hy-arevmda": "hyw",
+ "hy-Armn-arevmda": "hyw-Armn",
+ "hy-AM-arevmda": "hyw-AM",
+ "hy-arevmda-fonipa": "hyw-fonipa",
+ "hy-fonipa-arevmda": "hyw-fonipa",
+
+ // The preferred value of "ja-Latn-hepburn-heploc" is "ja-Latn-alalc97-hepburn" per CLDR.
+ // But: The preferred value of "ja-Latn-hepburn-heploc" is "ja-Latn-alalc97" per IANA!
+ "ja-Latn-hepburn-heploc": "ja-Latn-alalc97-hepburn",
+ "ja-Latn-JP-hepburn-heploc": "ja-Latn-JP-alalc97-hepburn",
+
+ // Variant subtag replacements not present in IANA.
+ "sv-aaland": "sv-AX",
+ "el-polytoni": "el-polyton",
+
+ // Additional cases when more variant subtags are present.
+
+ // 1. The preferred variant is already present.
+ "ja-Latn-alalc97-hepburn-heploc": "ja-Latn-alalc97-hepburn",
+ "ja-Latn-hepburn-alalc97-heploc": "ja-Latn-alalc97-hepburn",
+ "ja-Latn-hepburn-heploc-alalc97": "ja-Latn-alalc97-hepburn",
+
+ // 2. The variant subtags aren't in the expected order per IANA. (CLDR doesn't care
+ // about the order of variant subtags.)
+ "ja-Latn-heploc-hepburn": "ja-Latn-alalc97-hepburn",
+
+ // 3. IANA expects both variant subtags to be present, CLDR only requires "heploc".
+ "ja-Latn-heploc": "ja-Latn-alalc97",
+
+ // 4. Test for cases when the same variant subtag position needs to be checked more
+ // than once when replacing deprecated variant subtags.
+ "ja-Latn-aaland-heploc": "ja-Latn-AX-alalc97",
+ "ja-Latn-heploc-polytoni": "ja-Latn-alalc97-polyton",
+};
+
+for (let [tag, canonical] of Object.entries(languageTags)) {
+ assertEq(Intl.getCanonicalLocales(tag)[0], canonical);
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);
diff --git a/js/src/vm/ArgumentsObject.cpp b/js/src/vm/ArgumentsObject.cpp
index 3be44c9e5e..e23de30d66 100644
--- a/js/src/vm/ArgumentsObject.cpp
+++ b/js/src/vm/ArgumentsObject.cpp
@@ -227,9 +227,8 @@ ArgumentsObject::createTemplateObject(JSContext* cx, bool mapped)
return nullptr;
AutoSetNewObjectMetadata metadata(cx);
- JSObject* base = JSObject::create(cx, FINALIZE_KIND, gc::TenuredHeap, shape, group);
- if (!base)
- return nullptr;
+ JSObject* base;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, base, JSObject::create(cx, FINALIZE_KIND, gc::TenuredHeap, shape, group));
ArgumentsObject* obj = &base->as<js::ArgumentsObject>();
obj->initFixedSlot(ArgumentsObject::DATA_SLOT, PrivateValue(nullptr));
@@ -283,9 +282,8 @@ ArgumentsObject::create(JSContext* cx, HandleFunction callee, unsigned numActual
// to make sure we set the metadata for this arguments object first.
AutoSetNewObjectMetadata metadata(cx);
- JSObject* base = JSObject::create(cx, FINALIZE_KIND, gc::DefaultHeap, shape, group);
- if (!base)
- return nullptr;
+ JSObject* base;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, base, JSObject::create(cx, FINALIZE_KIND, gc::DefaultHeap, shape, group));
obj = &base->as<ArgumentsObject>();
data =
diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h
index e1e9f56c31..d5e7a2d058 100644
--- a/js/src/vm/CommonPropertyNames.h
+++ b/js/src/vm/CommonPropertyNames.h
@@ -51,6 +51,7 @@
macro(byteOffset, byteOffset, "byteOffset") \
macro(bytes, bytes, "bytes") \
macro(BYTES_PER_ELEMENT, BYTES_PER_ELEMENT, "BYTES_PER_ELEMENT") \
+ macro(calendar, calendar, "calendar") \
macro(call, call, "call") \
macro(callContentFunction, callContentFunction, "callContentFunction") \
macro(callee, callee, "callee") \
@@ -61,6 +62,7 @@
macro(catch, catch_, "catch") \
macro(class, class_, "class") \
macro(close, close, "close") \
+ macro(collation, collation, "collation") \
macro(Collator, Collator, "Collator") \
macro(CollatorCompareGet, CollatorCompareGet, "Intl_Collator_compare_get") \
macro(collections, collections, "collections") \
@@ -135,6 +137,8 @@
macro(finally, finally_, "finally") \
macro(find, find, "find") \
macro(findIndex, findIndex, "findIndex") \
+ macro(findLast, findLast, "findLast") \
+ macro(findLastIndex, findLastIndex, "findLastIndex") \
macro(firstDayOfWeek, firstDayOfWeek, "firstDayOfWeek") \
macro(fix, fix, "fix") \
macro(flags, flags, "flags") \
@@ -175,6 +179,7 @@
macro(hasOwn, hasOwn, "hasOwn") \
macro(hasOwnProperty, hasOwnProperty, "hasOwnProperty") \
macro(hour, hour, "hour") \
+ macro(hourCycle, hourCycle, "hourCycle") \
macro(if, if_, "if") \
macro(ignoreCase, ignoreCase, "ignoreCase") \
macro(ignorePunctuation, ignorePunctuation, "ignorePunctuation") \
@@ -188,6 +193,7 @@
macro(Infinity, Infinity, "Infinity") \
macro(InitializeCollator, InitializeCollator, "InitializeCollator") \
macro(InitializeDateTimeFormat, InitializeDateTimeFormat, "InitializeDateTimeFormat") \
+ macro(InitializeLocale, InitializeLocale, "InitializeLocale") \
macro(InitializeNumberFormat, InitializeNumberFormat, "InitializeNumberFormat") \
macro(InitializePluralRules, InitializePluralRules, "InitializePluralRules") \
macro(InitializeRelativeTimeFormat, InitializeRelativeTimeFormat, "InitializeRelativeTimeFormat") \
@@ -216,6 +222,7 @@
macro(js, js, "js") \
macro(keys, keys, "keys") \
macro(label, label, "label") \
+ macro(language, language, "language") \
macro(lastIndex, lastIndex, "lastIndex") \
macro(LegacyGeneratorCloseInternal, LegacyGeneratorCloseInternal, "LegacyGeneratorCloseInternal") \
macro(length, length, "length") \
@@ -224,6 +231,7 @@
macro(lineNumber, lineNumber, "lineNumber") \
macro(literal, literal, "literal") \
macro(loc, loc, "loc") \
+ macro(Locale, Locale, "Locale") \
macro(locale, locale, "locale") \
macro(lookupGetter, lookupGetter, "__lookupGetter__") \
macro(lookupSetter, lookupSetter, "__lookupSetter__") \
@@ -261,6 +269,7 @@
macro(noStack, noStack, "noStack") \
macro(notes, notes, "notes") \
macro(NumberFormat, NumberFormat, "NumberFormat") \
+ macro(numberingSystem, numberingSystem, "numberingSystem") \
macro(NumberFormatFormatGet, NumberFormatFormatGet, "Intl_NumberFormat_format_get") \
macro(numeric, numeric, "numeric") \
macro(objectArguments, objectArguments, "[object Arguments]") \
@@ -304,6 +313,7 @@
macro(reason, reason, "reason") \
macro(RegExpFlagsGetter, RegExpFlagsGetter, "RegExpFlagsGetter") \
macro(RegExpStringIterator, RegExpStringIterator, "RegExp String Iterator") \
+ macro(region, region, "region") \
macro(Reify, Reify, "Reify") \
macro(reject, reject, "reject") \
macro(rejected, rejected, "rejected") \
diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp
index b5fb94ca05..083e125c06 100644
--- a/js/src/vm/Debugger.cpp
+++ b/js/src/vm/Debugger.cpp
@@ -2989,7 +2989,7 @@ Debugger::markAllIteratively(GCMarker* trc)
* - it actually has hooks that might be called
*/
GCPtrNativeObject& dbgobj = dbg->toJSObjectRef();
- if (!dbgobj->zone()->isGCMarking())
+ if (!dbgobj->zone()->shouldMarkInZone())
continue;
bool dbgMarked = IsMarked(rt, &dbgobj);
@@ -3139,7 +3139,7 @@ Debugger::findZoneEdges(Zone* zone, js::gc::ZoneComponentFinder& finder)
*/
for (Debugger* dbg : zone->runtimeFromMainThread()->debuggerList) {
Zone* w = dbg->object->zone();
- if (w == zone || !w->isGCMarking())
+ if (w == zone || !w->shouldMarkInZone())
continue;
if (dbg->debuggeeZones.has(zone) ||
dbg->scripts.hasKeyInZone(zone) ||
@@ -9949,8 +9949,7 @@ DebuggerObject::defineProperty(JSContext* cx, HandleDebuggerObject object, Handl
Rooted<PropertyDescriptor> desc(cx, desc_);
if (!dbg->unwrapPropertyDescriptor(cx, referent, &desc))
return false;
- if (!CheckPropertyDescriptorAccessors(cx, desc))
- return false;
+ JS_TRY_OR_RETURN_FALSE(cx, CheckPropertyDescriptorAccessors(cx, desc));
Maybe<AutoCompartment> ac;
ac.emplace(cx, referent);
@@ -9978,8 +9977,7 @@ DebuggerObject::defineProperties(JSContext* cx, HandleDebuggerObject object,
for (size_t i = 0; i < descs.length(); i++) {
if (!dbg->unwrapPropertyDescriptor(cx, referent, descs[i]))
return false;
- if (!CheckPropertyDescriptorAccessors(cx, descs[i]))
- return false;
+ JS_TRY_OR_RETURN_FALSE(cx, CheckPropertyDescriptorAccessors(cx, descs[i]));
}
Maybe<AutoCompartment> ac;
diff --git a/js/src/vm/EnvironmentObject.cpp b/js/src/vm/EnvironmentObject.cpp
index 364bd45caf..cb2d50f911 100644
--- a/js/src/vm/EnvironmentObject.cpp
+++ b/js/src/vm/EnvironmentObject.cpp
@@ -141,9 +141,8 @@ CallObject::create(JSContext* cx, HandleShape shape, HandleObjectGroup group)
MOZ_ASSERT(CanBeFinalizedInBackground(kind, &CallObject::class_));
kind = gc::GetBackgroundAllocKind(kind);
- JSObject* obj = JSObject::create(cx, kind, gc::DefaultHeap, shape, group);
- if (!obj)
- return nullptr;
+ JSObject* obj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, obj, JSObject::create(cx, kind, gc::DefaultHeap, shape, group));
return &obj->as<CallObject>();
}
@@ -158,9 +157,9 @@ CallObject::createSingleton(JSContext* cx, HandleShape shape)
RootedObjectGroup group(cx, ObjectGroup::lazySingletonGroup(cx, &class_, TaggedProto(nullptr)));
if (!group)
return nullptr;
- RootedObject obj(cx, JSObject::create(cx, kind, gc::TenuredHeap, shape, group));
- if (!obj)
- return nullptr;
+
+ JSObject* obj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, obj, JSObject::create(cx, kind, gc::TenuredHeap, shape, group));
MOZ_ASSERT(obj->isSingleton(),
"group created inline above must be a singleton");
@@ -189,9 +188,8 @@ CallObject::createTemplateObject(JSContext* cx, HandleScript script, HandleObjec
MOZ_ASSERT(CanBeFinalizedInBackground(kind, &class_));
kind = gc::GetBackgroundAllocKind(kind);
- JSObject* obj = JSObject::create(cx, kind, heap, shape, group);
- if (!obj)
- return nullptr;
+ JSObject* obj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, obj, JSObject::create(cx, kind, heap, shape, group));
CallObject* callObj = &obj->as<CallObject>();
callObj->initEnclosingEnvironment(enclosing);
@@ -321,14 +319,13 @@ VarEnvironmentObject::create(JSContext* cx, HandleShape shape, HandleObject encl
MOZ_ASSERT(CanBeFinalizedInBackground(kind, &class_));
kind = gc::GetBackgroundAllocKind(kind);
- NativeObject* obj = MaybeNativeObject(JSObject::create(cx, kind, heap, shape, group));
- if (!obj)
- return nullptr;
-
- MOZ_ASSERT(!obj->inDictionaryMode());
- MOZ_ASSERT(obj->isDelegate());
+ JSObject* obj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, obj, JSObject::create(cx, kind, heap, shape, group));
VarEnvironmentObject* env = &obj->as<VarEnvironmentObject>();
+ MOZ_ASSERT(!env->inDictionaryMode());
+ MOZ_ASSERT(env->isDelegate());
+
env->initEnclosingEnvironment(enclosing);
return env;
@@ -437,9 +434,8 @@ ModuleEnvironmentObject::create(ExclusiveContext* cx, HandleModuleObject module)
MOZ_ASSERT(CanBeFinalizedInBackground(kind, &class_));
kind = gc::GetBackgroundAllocKind(kind);
- JSObject* obj = JSObject::create(cx, kind, TenuredHeap, shape, group);
- if (!obj)
- return nullptr;
+ JSObject* obj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, obj, JSObject::create(cx, kind, TenuredHeap, shape, group));
RootedModuleEnvironmentObject env(cx, &obj->as<ModuleEnvironmentObject>());
@@ -842,15 +838,14 @@ LexicalEnvironmentObject::createTemplateObject(JSContext* cx, HandleShape shape,
gc::AllocKind allocKind = gc::GetGCObjectKind(shape->numFixedSlots());
MOZ_ASSERT(CanBeFinalizedInBackground(allocKind, &LexicalEnvironmentObject::class_));
allocKind = GetBackgroundAllocKind(allocKind);
- RootedNativeObject obj(cx,
- MaybeNativeObject(JSObject::create(cx, allocKind, heap, shape, group)));
- if (!obj)
- return nullptr;
- MOZ_ASSERT(!obj->inDictionaryMode());
- MOZ_ASSERT(obj->isDelegate());
+ JSObject* obj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, obj, JSObject::create(cx, allocKind, heap, shape, group));
LexicalEnvironmentObject* env = &obj->as<LexicalEnvironmentObject>();
+ MOZ_ASSERT(!env->inDictionaryMode());
+ MOZ_ASSERT(env->isDelegate());
+
if (enclosing)
env->initEnclosingEnvironment(enclosing);
diff --git a/js/src/vm/EqualityOperations.cpp b/js/src/vm/EqualityOperations.cpp
new file mode 100644
index 0000000000..6f90450b49
--- /dev/null
+++ b/js/src/vm/EqualityOperations.cpp
@@ -0,0 +1,215 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "vm/EqualityOperations.h" // js::LooselyEqual, js::StrictlyEqual, js::SameValue
+
+#include "mozilla/Assertions.h" // MOZ_ASSERT, MOZ_ASSERT_IF
+
+#include "jsapi.h" // js::AssertHeapIsIdle, CHECK_REQUEST
+#include "jsnum.h" // js::StringToNumber
+#include "jsobj.h" // js::ToPrimitive
+#include "jsstr.h" // js::EqualStrings
+#include "jstypes.h" // JS_PUBLIC_API
+
+#include "js/Equality.h" // JS::LooselyEqual, JS::StrictlyEqual, JS::SameValue
+#include "js/RootingAPI.h" // JS::Rooted, JS::Handle
+#include "js/Value.h" // JS::Int32Value, JS::SameType, JS::Value
+
+#include "jsboolinlines.h" // js::EmulatesUndefined
+#include "jscntxtinlines.h" // js::assertSameCompartment
+
+static inline bool
+EqualGivenSameType(JSContext* cx, JS::HandleValue lval, JS::HandleValue rval, bool* equal)
+{
+ MOZ_ASSERT(SameType(lval, rval));
+
+ if (lval.isString())
+ return EqualStrings(cx, lval.toString(), rval.toString(), equal);
+ if (lval.isDouble()) {
+ *equal = (lval.toDouble() == rval.toDouble());
+ return true;
+ }
+ if (lval.isGCThing()) { // objects or symbols
+ *equal = (lval.toGCThing() == rval.toGCThing());
+ return true;
+ }
+ *equal = lval.get().payloadAsRawUint32() == rval.get().payloadAsRawUint32();
+ MOZ_ASSERT_IF(lval.isUndefined() || lval.isNull(), *equal);
+ return true;
+}
+
+static inline bool
+LooselyEqualBooleanAndOther(JSContext* cx, JS::HandleValue lval, JS::HandleValue rval, bool* result)
+{
+ MOZ_ASSERT(!rval.isBoolean());
+ JS::RootedValue lvalue(cx, JS::Int32Value(lval.toBoolean() ? 1 : 0));
+
+ // The tail-call would end up in Step 3.
+ if (rval.isNumber()) {
+ *result = (lvalue.toNumber() == rval.toNumber());
+ return true;
+ }
+ // The tail-call would end up in Step 6.
+ if (rval.isString()) {
+ double num;
+ if (!StringToNumber(cx, rval.toString(), &num))
+ return false;
+ *result = (lvalue.toNumber() == num);
+ return true;
+ }
+
+ return js::LooselyEqual(cx, lvalue, rval, result);
+}
+
+// ES6 draft rev32 7.2.12 Abstract Equality Comparison
+bool
+js::LooselyEqual(JSContext* cx, JS::HandleValue lval, JS::HandleValue rval, bool* result)
+{
+ // Step 3.
+ if (SameType(lval, rval))
+ return EqualGivenSameType(cx, lval, rval, result);
+
+ // Handle int32 x double.
+ if (lval.isNumber() && rval.isNumber()) {
+ *result = (lval.toNumber() == rval.toNumber());
+ return true;
+ }
+
+ // Step 4. This a bit more complex, because of the undefined emulating object.
+ if (lval.isNullOrUndefined()) {
+ // We can return early here, because null | undefined is only equal to the same set.
+ *result = rval.isNullOrUndefined() ||
+ (rval.isObject() && EmulatesUndefined(&rval.toObject()));
+ return true;
+ }
+
+ // Step 5.
+ if (rval.isNullOrUndefined()) {
+ MOZ_ASSERT(!lval.isNullOrUndefined());
+ *result = lval.isObject() && EmulatesUndefined(&lval.toObject());
+ return true;
+ }
+
+ // Step 6.
+ if (lval.isNumber() && rval.isString()) {
+ double num;
+ if (!StringToNumber(cx, rval.toString(), &num))
+ return false;
+ *result = (lval.toNumber() == num);
+ return true;
+ }
+
+ // Step 7.
+ if (lval.isString() && rval.isNumber()) {
+ double num;
+ if (!StringToNumber(cx, lval.toString(), &num))
+ return false;
+ *result = (num == rval.toNumber());
+ return true;
+ }
+
+ // Step 8.
+ if (lval.isBoolean())
+ return LooselyEqualBooleanAndOther(cx, lval, rval, result);
+
+ // Step 9.
+ if (rval.isBoolean())
+ return LooselyEqualBooleanAndOther(cx, rval, lval, result);
+
+ // Step 10.
+ if ((lval.isString() || lval.isNumber() || lval.isSymbol()) && rval.isObject()) {
+ JS::RootedValue rvalue(cx, rval);
+ if (!ToPrimitive(cx, &rvalue))
+ return false;
+ return js::LooselyEqual(cx, lval, rvalue, result);
+ }
+
+ // Step 11.
+ if (lval.isObject() && (rval.isString() || rval.isNumber() || rval.isSymbol())) {
+ JS::RootedValue lvalue(cx, lval);
+ if (!ToPrimitive(cx, &lvalue))
+ return false;
+ return js::LooselyEqual(cx, lvalue, rval, result);
+ }
+
+ // Step 12.
+ *result = false;
+ return true;
+}
+
+JS_PUBLIC_API(bool)
+JS::LooselyEqual(JSContext* cx, Handle<Value> value1, Handle<Value> value2, bool* equal)
+{
+ js::AssertHeapIsIdle(cx);
+ CHECK_REQUEST(cx);
+ js::assertSameCompartment(cx, value1, value2);
+ MOZ_ASSERT(equal);
+ return js::LooselyEqual(cx, value1, value2, equal);
+}
+
+bool
+js::StrictlyEqual(JSContext* cx, JS::HandleValue lval, JS::HandleValue rval, bool* equal)
+{
+ if (SameType(lval, rval))
+ return EqualGivenSameType(cx, lval, rval, equal);
+
+ if (lval.isNumber() && rval.isNumber()) {
+ *equal = (lval.toNumber() == rval.toNumber());
+ return true;
+ }
+
+ *equal = false;
+ return true;
+}
+
+JS_PUBLIC_API(bool)
+JS::StrictlyEqual(JSContext* cx, Handle<Value> value1, Handle<Value> value2, bool* equal)
+{
+ js::AssertHeapIsIdle(cx);
+ CHECK_REQUEST(cx);
+ js::assertSameCompartment(cx, value1, value2);
+ MOZ_ASSERT(equal);
+ return js::StrictlyEqual(cx, value1, value2, equal);
+}
+
+static inline bool
+IsNegativeZero(const JS::Value& v)
+{
+ return v.isDouble() && mozilla::IsNegativeZero(v.toDouble());
+}
+
+static inline bool
+IsNaN(const JS::Value& v)
+{
+ return v.isDouble() && mozilla::IsNaN(v.toDouble());
+}
+
+bool
+js::SameValue(JSContext* cx, JS::HandleValue v1, JS::HandleValue v2, bool* same)
+{
+ if (IsNegativeZero(v1)) {
+ *same = IsNegativeZero(v2);
+ return true;
+ }
+ if (IsNegativeZero(v2)) {
+ *same = false;
+ return true;
+ }
+ if (IsNaN(v1) && IsNaN(v2)) {
+ *same = true;
+ return true;
+ }
+ return js::StrictlyEqual(cx, v1, v2, same);
+}
+
+JS_PUBLIC_API(bool)
+JS::SameValue(JSContext* cx, Handle<Value> value1, Handle<Value> value2, bool* same)
+{
+ js::AssertHeapIsIdle(cx);
+ CHECK_REQUEST(cx);
+ js::assertSameCompartment(cx, value1, value2);
+ MOZ_ASSERT(same);
+ return js::SameValue(cx, value1, value2, same);
+}
diff --git a/js/src/vm/EqualityOperations.h b/js/src/vm/EqualityOperations.h
new file mode 100644
index 0000000000..13cae70b16
--- /dev/null
+++ b/js/src/vm/EqualityOperations.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * The equality comparisons of js/Equality.h, but with extra efficiency for
+ * SpiderMonkey-internal callers.
+ *
+ * These functions, assuming they're passed C++-valid arguments, are identical
+ * to the same-named JS::-namespaced functions -- just with hidden linkage (so
+ * they're more efficient to call), and without various external-caller-focused
+ * JSAPI-usage assertions performed that SpiderMonkey users never come close to
+ * failing.
+ */
+
+#ifndef vm_EqualityOperations_h
+#define vm_EqualityOperations_h
+
+#include "js/RootingAPI.h" // JS::Handle
+#include "js/Value.h" // JS::Value
+
+struct JSContext;
+
+namespace js {
+
+/** Computes |lval === rval|. */
+extern bool
+StrictlyEqual(JSContext* cx, JS::HandleValue lval, JS::HandleValue rval, bool* equal);
+
+/** Computes |lval == rval|. */
+extern bool
+LooselyEqual(JSContext* cx, JS::HandleValue lval, JS::HandleValue rval, bool* result);
+
+/**
+ * Computes |SameValue(v1, v2)| -- strict equality except that NaNs are
+ * considered equal and opposite-signed zeroes are considered unequal.
+ */
+extern bool
+SameValue(JSContext* cx, JS::HandleValue v1, JS::HandleValue v2, bool* same);
+
+} // namespace js
+
+#endif // vm_EqualityOperations_h
diff --git a/js/src/vm/GlobalObject.cpp b/js/src/vm/GlobalObject.cpp
index 85a001d6a3..542160ce56 100644
--- a/js/src/vm/GlobalObject.cpp
+++ b/js/src/vm/GlobalObject.cpp
@@ -524,6 +524,7 @@ GlobalObject::initSelfHostingBuiltins(JSContext* cx, Handle<GlobalObject*> globa
InitBareBuiltinCtor(cx, global, JSProto_TypedArray) &&
InitBareBuiltinCtor(cx, global, JSProto_Uint8Array) &&
InitBareBuiltinCtor(cx, global, JSProto_Int32Array) &&
+ InitBareSymbolCtor(cx, global) &&
InitBareWeakMapCtor(cx, global) &&
InitStopIterationClass(cx, global) &&
DefineFunctions(cx, global, builtins, AsIntrinsic);
diff --git a/js/src/vm/GlobalObject.h b/js/src/vm/GlobalObject.h
index 2e1b6ce87b..1e10fe5da3 100644
--- a/js/src/vm/GlobalObject.h
+++ b/js/src/vm/GlobalObject.h
@@ -107,10 +107,13 @@ class GlobalObject : public NativeObject
MAP_ITERATOR_PROTO,
SET_ITERATOR_PROTO,
COLLATOR_PROTO,
+ NUMBER_FORMAT,
NUMBER_FORMAT_PROTO,
+ DATE_TIME_FORMAT,
DATE_TIME_FORMAT_PROTO,
PLURAL_RULES_PROTO,
RELATIVE_TIME_FORMAT_PROTO,
+ LOCALE_PROTO,
MODULE_PROTO,
IMPORT_ENTRY_PROTO,
EXPORT_ENTRY_PROTO,
@@ -500,10 +503,27 @@ class GlobalObject : public NativeObject
}
static JSObject*
+ getOrCreateLocalePrototype(JSContext* cx, Handle<GlobalObject*> global) {
+ return getOrCreateObject(cx, global, LOCALE_PROTO, initIntlObject);
+ }
+
+ static JSFunction*
+ getOrCreateNumberFormatConstructor(JSContext* cx, Handle<GlobalObject*> global) {
+ JSObject* obj = getOrCreateObject(cx, global, NUMBER_FORMAT, initIntlObject);
+ return obj ? &obj->as<JSFunction>() : nullptr;
+ }
+
+ static JSObject*
getOrCreateNumberFormatPrototype(JSContext* cx, Handle<GlobalObject*> global) {
return getOrCreateObject(cx, global, NUMBER_FORMAT_PROTO, initIntlObject);
}
+ static JSFunction*
+ getOrCreateDateTimeFormatConstructor(JSContext* cx, Handle<GlobalObject*> global) {
+ JSObject* obj = getOrCreateObject(cx, global, DATE_TIME_FORMAT, initIntlObject);
+ return obj ? &obj->as<JSFunction>() : nullptr;
+ }
+
static JSObject*
getOrCreateDateTimeFormatPrototype(JSContext* cx, Handle<GlobalObject*> global) {
return getOrCreateObject(cx, global, DATE_TIME_FORMAT_PROTO, initIntlObject);
diff --git a/js/src/vm/Initialization.cpp b/js/src/vm/Initialization.cpp
index 6c4303d5e2..dc645f3ed9 100644
--- a/js/src/vm/Initialization.cpp
+++ b/js/src/vm/Initialization.cpp
@@ -102,6 +102,8 @@ JS::detail::InitWithFailureDiagnostic(bool isDebugBuild)
RETURN_IF_FAIL(js::wasm::InitInstanceStaticData());
js::gc::InitMemorySubsystem(); // Ensure gc::SystemPageSize() works.
+ RETURN_IF_FAIL(js::gc::InitializeStaticData());
+
RETURN_IF_FAIL(js::jit::InitProcessExecutableMemory());
MOZ_ALWAYS_TRUE(js::MemoryProtectionExceptionHandler::install());
diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp
index b17c762eae..d7c1b8e84a 100644
--- a/js/src/vm/Interpreter.cpp
+++ b/js/src/vm/Interpreter.cpp
@@ -41,6 +41,7 @@
#include "vm/AsyncFunction.h"
#include "vm/AsyncIteration.h"
#include "vm/Debugger.h"
+#include "vm/EqualityOperations.h" // js::StrictlyEqual
#include "vm/GeneratorObject.h"
#include "vm/Opcodes.h"
#include "vm/Scope.h"
@@ -786,170 +787,6 @@ js::HasInstance(JSContext* cx, HandleObject obj, HandleValue v, bool* bp)
return JS::InstanceofOperator(cx, obj, local, bp);
}
-static inline bool
-EqualGivenSameType(JSContext* cx, HandleValue lval, HandleValue rval, bool* equal)
-{
- MOZ_ASSERT(SameType(lval, rval));
-
- if (lval.isString())
- return EqualStrings(cx, lval.toString(), rval.toString(), equal);
- if (lval.isDouble()) {
- *equal = (lval.toDouble() == rval.toDouble());
- return true;
- }
- if (lval.isGCThing()) { // objects or symbols
- *equal = (lval.toGCThing() == rval.toGCThing());
- return true;
- }
- *equal = lval.get().payloadAsRawUint32() == rval.get().payloadAsRawUint32();
- MOZ_ASSERT_IF(lval.isUndefined() || lval.isNull(), *equal);
- return true;
-}
-
-static inline bool
-LooselyEqualBooleanAndOther(JSContext* cx, HandleValue lval, HandleValue rval, bool* result)
-{
- MOZ_ASSERT(!rval.isBoolean());
- RootedValue lvalue(cx, Int32Value(lval.toBoolean() ? 1 : 0));
-
- // The tail-call would end up in Step 3.
- if (rval.isNumber()) {
- *result = (lvalue.toNumber() == rval.toNumber());
- return true;
- }
- // The tail-call would end up in Step 6.
- if (rval.isString()) {
- double num;
- if (!StringToNumber(cx, rval.toString(), &num))
- return false;
- *result = (lvalue.toNumber() == num);
- return true;
- }
-
- return LooselyEqual(cx, lvalue, rval, result);
-}
-
-// ES6 draft rev32 7.2.12 Abstract Equality Comparison
-bool
-js::LooselyEqual(JSContext* cx, HandleValue lval, HandleValue rval, bool* result)
-{
- // Step 3.
- if (SameType(lval, rval))
- return EqualGivenSameType(cx, lval, rval, result);
-
- // Handle int32 x double.
- if (lval.isNumber() && rval.isNumber()) {
- *result = (lval.toNumber() == rval.toNumber());
- return true;
- }
-
- // Step 4. This a bit more complex, because of the undefined emulating object.
- if (lval.isNullOrUndefined()) {
- // We can return early here, because null | undefined is only equal to the same set.
- *result = rval.isNullOrUndefined() ||
- (rval.isObject() && EmulatesUndefined(&rval.toObject()));
- return true;
- }
-
- // Step 5.
- if (rval.isNullOrUndefined()) {
- MOZ_ASSERT(!lval.isNullOrUndefined());
- *result = lval.isObject() && EmulatesUndefined(&lval.toObject());
- return true;
- }
-
- // Step 6.
- if (lval.isNumber() && rval.isString()) {
- double num;
- if (!StringToNumber(cx, rval.toString(), &num))
- return false;
- *result = (lval.toNumber() == num);
- return true;
- }
-
- // Step 7.
- if (lval.isString() && rval.isNumber()) {
- double num;
- if (!StringToNumber(cx, lval.toString(), &num))
- return false;
- *result = (num == rval.toNumber());
- return true;
- }
-
- // Step 8.
- if (lval.isBoolean())
- return LooselyEqualBooleanAndOther(cx, lval, rval, result);
-
- // Step 9.
- if (rval.isBoolean())
- return LooselyEqualBooleanAndOther(cx, rval, lval, result);
-
- // Step 10.
- if ((lval.isString() || lval.isNumber() || lval.isSymbol()) && rval.isObject()) {
- RootedValue rvalue(cx, rval);
- if (!ToPrimitive(cx, &rvalue))
- return false;
- return LooselyEqual(cx, lval, rvalue, result);
- }
-
- // Step 11.
- if (lval.isObject() && (rval.isString() || rval.isNumber() || rval.isSymbol())) {
- RootedValue lvalue(cx, lval);
- if (!ToPrimitive(cx, &lvalue))
- return false;
- return LooselyEqual(cx, lvalue, rval, result);
- }
-
- // Step 12.
- *result = false;
- return true;
-}
-
-bool
-js::StrictlyEqual(JSContext* cx, HandleValue lval, HandleValue rval, bool* equal)
-{
- if (SameType(lval, rval))
- return EqualGivenSameType(cx, lval, rval, equal);
-
- if (lval.isNumber() && rval.isNumber()) {
- *equal = (lval.toNumber() == rval.toNumber());
- return true;
- }
-
- *equal = false;
- return true;
-}
-
-static inline bool
-IsNegativeZero(const Value& v)
-{
- return v.isDouble() && mozilla::IsNegativeZero(v.toDouble());
-}
-
-static inline bool
-IsNaN(const Value& v)
-{
- return v.isDouble() && mozilla::IsNaN(v.toDouble());
-}
-
-bool
-js::SameValue(JSContext* cx, HandleValue v1, HandleValue v2, bool* same)
-{
- if (IsNegativeZero(v1)) {
- *same = IsNegativeZero(v2);
- return true;
- }
- if (IsNegativeZero(v2)) {
- *same = false;
- return true;
- }
- if (IsNaN(v1) && IsNaN(v2)) {
- *same = true;
- return true;
- }
- return StrictlyEqual(cx, v1, v2, same);
-}
-
JSType
js::TypeOfObject(JSObject* obj)
{
diff --git a/js/src/vm/Interpreter.h b/js/src/vm/Interpreter.h
index df9368e71c..1927e8cc7f 100644
--- a/js/src/vm/Interpreter.h
+++ b/js/src/vm/Interpreter.h
@@ -305,16 +305,6 @@ class InvokeState final : public RunState
extern bool
RunScript(JSContext* cx, RunState& state);
-extern bool
-StrictlyEqual(JSContext* cx, HandleValue lval, HandleValue rval, bool* equal);
-
-extern bool
-LooselyEqual(JSContext* cx, HandleValue lval, HandleValue rval, bool* equal);
-
-/* === except that NaN is the same as NaN and -0 is not the same as +0. */
-extern bool
-SameValue(JSContext* cx, HandleValue v1, HandleValue v2, bool* same);
-
extern JSType
TypeOfObject(JSObject* obj);
diff --git a/js/src/vm/NativeObject-inl.h b/js/src/vm/NativeObject-inl.h
index e2fccbdd44..69976bc462 100644
--- a/js/src/vm/NativeObject-inl.h
+++ b/js/src/vm/NativeObject-inl.h
@@ -258,9 +258,8 @@ NativeObject::createWithTemplate(JSContext* cx, gc::InitialHeap heap,
MOZ_ASSERT(CanBeFinalizedInBackground(kind, shape->getObjectClass()));
kind = gc::GetBackgroundAllocKind(kind);
- JSObject* baseObj = create(cx, kind, heap, shape, group);
- if (!baseObj)
- return nullptr;
+ JSObject* baseObj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, baseObj, create(cx, kind, heap, shape, group));
return &baseObj->as<NativeObject>();
}
@@ -272,9 +271,9 @@ NativeObject::copy(ExclusiveContext* cx, gc::AllocKind kind, gc::InitialHeap hea
RootedObjectGroup group(cx, templateObject->group());
MOZ_ASSERT(!templateObject->denseElementsAreCopyOnWrite());
- JSObject* baseObj = create(cx, kind, heap, shape, group);
- if (!baseObj)
- return nullptr;
+ JSObject* baseObj;
+ JS_TRY_VAR_OR_RETURN_NULL(cx, baseObj, create(cx, kind, heap, shape, group));
+
NativeObject* obj = &baseObj->as<NativeObject>();
size_t span = shape->slotSpan();
diff --git a/js/src/vm/NativeObject.cpp b/js/src/vm/NativeObject.cpp
index 91b7cacb4d..a6bb9826ee 100644
--- a/js/src/vm/NativeObject.cpp
+++ b/js/src/vm/NativeObject.cpp
@@ -11,6 +11,7 @@
#include "gc/Marking.h"
#include "js/Value.h"
#include "vm/Debugger.h"
+#include "vm/EqualityOperations.h" // js::SameValue
#include "vm/TypedArrayCommon.h"
#include "jsobjinlines.h"
diff --git a/js/src/vm/Runtime.h b/js/src/vm/Runtime.h
index c1c28ca7c6..962f0e1a1e 100644
--- a/js/src/vm/Runtime.h
+++ b/js/src/vm/Runtime.h
@@ -87,6 +87,10 @@ namespace js {
extern MOZ_COLD void
ReportOutOfMemory(ExclusiveContext* cx);
+/* Different signature because the return type has MOZ_MUST_USE_TYPE. */
+extern MOZ_COLD mozilla::GenericErrorResult<OOM&>
+ReportOutOfMemoryResult(ExclusiveContext* cx);
+
extern MOZ_COLD void
ReportAllocationOverflow(ExclusiveContext* maybecx);
diff --git a/js/src/vm/SelfHosting.cpp b/js/src/vm/SelfHosting.cpp
index 4b22001a4e..357e151bde 100644
--- a/js/src/vm/SelfHosting.cpp
+++ b/js/src/vm/SelfHosting.cpp
@@ -25,6 +25,7 @@
#include "builtin/intl/Collator.h"
#include "builtin/intl/DateTimeFormat.h"
#include "builtin/intl/IntlObject.h"
+#include "builtin/intl/Locale.h"
#include "builtin/intl/NumberFormat.h"
#include "builtin/intl/PluralRules.h"
#include "builtin/intl/RelativeTimeFormat.h"
@@ -1905,6 +1906,23 @@ intrinsic_RuntimeDefaultLocale(JSContext* cx, unsigned argc, Value* vp)
return true;
}
+using GetOrCreateIntlConstructor = JSFunction* (*)(JSContext*, Handle<GlobalObject*>);
+
+template <GetOrCreateIntlConstructor getOrCreateIntlConstructor>
+static bool
+intrinsic_GetBuiltinIntlConstructor(JSContext* cx, unsigned argc, Value* vp)
+{
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 0);
+
+ JSFunction* constructor = getOrCreateIntlConstructor(cx, cx->global());
+ if (!constructor)
+ return false;
+
+ args.rval().setObject(*constructor);
+ return true;
+}
+
static bool
intrinsic_ConstructFunction(JSContext* cx, unsigned argc, Value* vp)
{
@@ -2190,11 +2208,9 @@ static const JSFunctionSpec intrinsic_functions[] = {
JS_FN("std_String_trimStart", str_trimStart, 0,0),
JS_FN("std_String_trimRight", str_trimEnd, 0,0),
JS_FN("std_String_trimEnd", str_trimEnd, 0,0),
- JS_FN("std_String_toLocaleLowerCase", str_toLocaleLowerCase, 0,0),
- JS_FN("std_String_toLocaleUpperCase", str_toLocaleUpperCase, 0,0),
JS_FN("std_String_normalize", str_normalize, 0,0),
JS_FN("std_String_concat", str_concat, 1,0),
-
+
JS_FN("std_TypedArray_buffer", js::TypedArray_bufferGetter, 1,0),
JS_FN("std_WeakMap_has", WeakMap_has, 1,0),
@@ -2446,29 +2462,56 @@ static const JSFunctionSpec intrinsic_functions[] = {
// See builtin/intl/*.h for descriptions of the intl_* functions.
JS_FN("intl_availableCalendars", intl_availableCalendars, 1,0),
JS_FN("intl_availableCollations", intl_availableCollations, 1,0),
+ JS_FN("intl_BestAvailableLocale", intl_BestAvailableLocale, 3, 0),
+ JS_FN("intl_supportedLocaleOrFallback", intl_supportedLocaleOrFallback, 1, 0),
JS_FN("intl_canonicalizeTimeZone", intl_canonicalizeTimeZone, 1,0),
JS_FN("intl_Collator", intl_Collator, 2,0),
- JS_FN("intl_Collator_availableLocales", intl_Collator_availableLocales, 0,0),
JS_FN("intl_CompareStrings", intl_CompareStrings, 3,0),
JS_FN("intl_DateTimeFormat", intl_DateTimeFormat, 2,0),
- JS_FN("intl_DateTimeFormat_availableLocales", intl_DateTimeFormat_availableLocales, 0,0),
+ JS_FN("intl_defaultCalendar", intl_defaultCalendar, 1,0),
JS_FN("intl_defaultTimeZone", intl_defaultTimeZone, 0,0),
JS_FN("intl_defaultTimeZoneOffset", intl_defaultTimeZoneOffset, 0,0),
JS_FN("intl_FormatDateTime", intl_FormatDateTime, 2,0),
JS_FN("intl_FormatNumber", intl_FormatNumber, 2,0),
JS_FN("intl_GetCalendarInfo", intl_GetCalendarInfo, 1,0),
JS_FN("intl_ComputeDisplayNames", intl_ComputeDisplayNames, 3,0),
+ JS_FN("intl_isUpperCaseFirst", intl_isUpperCaseFirst, 1,0),
JS_FN("intl_IsValidTimeZoneName", intl_IsValidTimeZoneName, 1,0),
JS_FN("intl_NumberFormat", intl_NumberFormat, 2,0),
- JS_FN("intl_NumberFormat_availableLocales", intl_NumberFormat_availableLocales, 0,0),
JS_FN("intl_numberingSystem", intl_numberingSystem, 1,0),
- JS_FN("intl_patternForSkeleton", intl_patternForSkeleton, 2,0),
- JS_FN("intl_PluralRules_availableLocales", intl_PluralRules_availableLocales, 0,0),
+ JS_FN("intl_patternForSkeleton", intl_patternForSkeleton, 3, 0),
+ JS_FN("intl_patternForStyle", intl_patternForStyle, 6, 0),
JS_FN("intl_GetPluralCategories", intl_GetPluralCategories, 2, 0),
JS_FN("intl_SelectPluralRule", intl_SelectPluralRule, 2,0),
- JS_FN("intl_RelativeTimeFormat_availableLocales", intl_RelativeTimeFormat_availableLocales, 0,0),
+ JS_FN("intl_toLocaleLowerCase", intl_toLocaleLowerCase, 2,0),
+ JS_FN("intl_toLocaleUpperCase", intl_toLocaleUpperCase, 2,0),
+ JS_FN("intl_ValidateAndCanonicalizeLanguageTag", intl_ValidateAndCanonicalizeLanguageTag, 2, 0),
+ JS_FN("intl_TryValidateAndCanonicalizeLanguageTag", intl_TryValidateAndCanonicalizeLanguageTag, 1, 0),
+ JS_FN("intl_ValidateAndCanonicalizeUnicodeExtensionType", intl_ValidateAndCanonicalizeUnicodeExtensionType, 3, 0),
JS_FN("intl_FormatRelativeTime", intl_FormatRelativeTime, 3,0),
+ JS_INLINABLE_FN("IsCollator",
+ intrinsic_IsInstanceOfBuiltin<CollatorObject>, 1,0,
+ IntlIsCollator),
+ JS_INLINABLE_FN("IsDateTimeFormat",
+ intrinsic_IsInstanceOfBuiltin<DateTimeFormatObject>, 1,0,
+ IntlIsDateTimeFormat),
+ JS_INLINABLE_FN("IsNumberFormat",
+ intrinsic_IsInstanceOfBuiltin<NumberFormatObject>, 1,0,
+ IntlIsNumberFormat),
+ JS_INLINABLE_FN("IsPluralRules",
+ intrinsic_IsInstanceOfBuiltin<PluralRulesObject>, 1,0,
+ IntlIsPluralRules),
+ JS_INLINABLE_FN("IsRelativeTimeFormat",
+ intrinsic_IsInstanceOfBuiltin<RelativeTimeFormatObject>, 1,0,
+ IntlIsRelativeTimeFormat),
+ JS_FN("GetDateTimeFormatConstructor",
+ intrinsic_GetBuiltinIntlConstructor<GlobalObject::getOrCreateDateTimeFormatConstructor>,
+ 0,0),
+ JS_FN("GetNumberFormatConstructor",
+ intrinsic_GetBuiltinIntlConstructor<GlobalObject::getOrCreateNumberFormatConstructor>,
+ 0,0),
+
JS_INLINABLE_FN("IsRegExpObject",
intrinsic_IsInstanceOfBuiltin<RegExpObject>, 1,0,
IsRegExpObject),
@@ -2503,8 +2546,6 @@ static const JSFunctionSpec intrinsic_functions[] = {
JS_FN("StringSplitStringLimit", intrinsic_StringSplitStringLimit, 3, 0),
// See builtin/RegExp.h for descriptions of the regexp_* functions.
- JS_FN("regexp_exec_no_statics", regexp_exec_no_statics, 2,0),
- JS_FN("regexp_test_no_statics", regexp_test_no_statics, 2,0),
JS_FN("regexp_construct_raw_flags", regexp_construct_raw_flags, 2,0),
JS_FN("regexp_clone", regexp_clone, 1,0),
diff --git a/js/src/vm/SpecialCasing.txt b/js/src/vm/SpecialCasing.txt
new file mode 100644
index 0000000000..c90d09acb3
--- /dev/null
+++ b/js/src/vm/SpecialCasing.txt
@@ -0,0 +1,281 @@
+# SpecialCasing-11.0.0.txt
+# Date: 2018-02-22, 06:16:47 GMT
+# © 2018 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Unicode Character Database
+# For documentation, see http://www.unicode.org/reports/tr44/
+#
+# Special Casing
+#
+# This file is a supplement to the UnicodeData.txt file. It does not define any
+# properties, but rather provides additional information about the casing of
+# Unicode characters, for situations when casing incurs a change in string length
+# or is dependent on context or locale. For compatibility, the UnicodeData.txt
+# file only contains simple case mappings for characters where they are one-to-one
+# and independent of context and language. The data in this file, combined with
+# the simple case mappings in UnicodeData.txt, defines the full case mappings
+# Lowercase_Mapping (lc), Titlecase_Mapping (tc), and Uppercase_Mapping (uc).
+#
+# Note that the preferred mechanism for defining tailored casing operations is
+# the Unicode Common Locale Data Repository (CLDR). For more information, see the
+# discussion of case mappings and case algorithms in the Unicode Standard.
+#
+# All code points not listed in this file that do not have a simple case mappings
+# in UnicodeData.txt map to themselves.
+# ================================================================================
+# Format
+# ================================================================================
+# The entries in this file are in the following machine-readable format:
+#
+# <code>; <lower>; <title>; <upper>; (<condition_list>;)? # <comment>
+#
+# <code>, <lower>, <title>, and <upper> provide the respective full case mappings
+# of <code>, expressed as character values in hex. If there is more than one character,
+# they are separated by spaces. Other than as used to separate elements, spaces are
+# to be ignored.
+#
+# The <condition_list> is optional. Where present, it consists of one or more language IDs
+# or casing contexts, separated by spaces. In these conditions:
+# - A condition list overrides the normal behavior if all of the listed conditions are true.
+# - The casing context is always the context of the characters in the original string,
+# NOT in the resulting string.
+# - Case distinctions in the condition list are not significant.
+# - Conditions preceded by "Not_" represent the negation of the condition.
+# The condition list is not represented in the UCD as a formal property.
+#
+# A language ID is defined by BCP 47, with '-' and '_' treated equivalently.
+#
+# A casing context for a character is defined by Section 3.13 Default Case Algorithms
+# of The Unicode Standard.
+#
+# Parsers of this file must be prepared to deal with future additions to this format:
+# * Additional contexts
+# * Additional fields
+# ================================================================================
+
+# ================================================================================
+# Unconditional mappings
+# ================================================================================
+
+# The German es-zed is special--the normal mapping is to SS.
+# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>))
+
+00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S
+
+# Preserve canonical equivalence for I with dot. Turkic is handled below.
+
+0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+
+# Ligatures
+
+FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF
+FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI
+FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL
+FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI
+FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL
+FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T
+FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST
+
+0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN
+FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW
+FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH
+FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI
+FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW
+FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
+
+# No corresponding uppercase precomposed character
+
+0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON
+1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW
+1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS
+1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE
+1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI
+1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI
+1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+
+# IMPORTANT-when iota-subscript (0345) is uppercased or titlecased,
+# the result will be incorrect unless the iota-subscript is moved to the end
+# of any sequence of combining marks. Otherwise, the accents will go on the capital iota.
+# This process can be achieved by first transforming the text to NFC before casing.
+# E.g. <alpha><iota_subscript><acute> is uppercased to <ALPHA><acute><IOTA>
+
+# The following cases are already in the UnicodeData.txt file, so are only commented here.
+
+# 0345; 0345; 0399; 0399; # COMBINING GREEK YPOGEGRAMMENI
+
+# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
+# have special uppercases.
+# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase!
+
+1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+
+# Some characters with YPOGEGRAMMENI also have no corresponding titlecases
+
+1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+
+1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+
+# ================================================================================
+# Conditional Mappings
+# The remainder of this file provides conditional casing data used to produce
+# full case mappings.
+# ================================================================================
+# Language-Insensitive Mappings
+# These are characters whose full case mappings do not depend on language, but do
+# depend on context (which characters come before or after). For more information
+# see the header of this file and the Unicode Standard.
+# ================================================================================
+
+# Special case for final form of sigma
+
+03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA
+
+# Note: the following cases for non-final are already in the UnicodeData.txt file.
+
+# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA
+# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA
+# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA
+
+# Note: the following cases are not included, since they would case-fold in lowercasing
+
+# 03C3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK SMALL LETTER SIGMA
+# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA
+
+# ================================================================================
+# Language-Sensitive Mappings
+# These are characters whose full case mappings depend on language and perhaps also
+# context (which characters come before or after). For more information
+# see the header of this file and the Unicode Standard.
+# ================================================================================
+
+# Lithuanian
+
+# Lithuanian retains the dot in a lowercase i when followed by accents.
+
+# Remove DOT ABOVE after "i" with upper or titlecase
+
+0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE
+
+# Introduce an explicit dot above when lowercasing capital I's and J's
+# whenever there are more accents above.
+# (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek)
+
+0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I
+004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J
+012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK
+00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE
+00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE
+0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE
+
+# ================================================================================
+
+# Turkish and Azeri
+
+# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri
+# The following rules handle those cases.
+
+0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+
+# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i.
+# This matches the behavior of the canonically equivalent I-dot_above
+
+0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
+0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE
+
+# When lowercasing, unless an I is before a dot_above, it turns into a dotless i.
+
+0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I
+0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I
+
+# When uppercasing, i turns into a dotted capital I
+
+0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I
+0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I
+
+# Note: the following case is already in the UnicodeData.txt file.
+
+# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I
+
+# EOF
+
diff --git a/js/src/vm/String.h b/js/src/vm/String.h
index 4c43439cd9..5eaf9e0c2e 100644
--- a/js/src/vm/String.h
+++ b/js/src/vm/String.h
@@ -1131,6 +1131,20 @@ class StaticStrings
static bool isStatic(JSAtom* atom);
/* Return null if no static atom exists for the given (chars, length). */
+ MOZ_ALWAYS_INLINE JSAtom* lookup(const char* chars, size_t length) {
+ // Collapse calls for |const char*| into |const Latin1Char char*| to avoid
+ // excess instantiations.
+ return lookup(reinterpret_cast<const Latin1Char*>(chars), length);
+ }
+
+ template <typename CharT,
+ typename = typename std::enable_if<!std::is_const<CharT>::value>::type>
+ MOZ_ALWAYS_INLINE JSAtom* lookup(CharT* chars, size_t length) {
+ // Collapse the remaining |CharT*| to |const CharT*| to avoid excess
+ // instantiations.
+ return lookup(const_cast<const CharT*>(chars), length);
+ }
+
template <typename CharT>
JSAtom* lookup(const CharT* chars, size_t length) {
switch (length) {
diff --git a/js/src/vm/StringBuffer.cpp b/js/src/vm/StringBuffer.cpp
index ec8592f951..e4f0e4f4d6 100644
--- a/js/src/vm/StringBuffer.cpp
+++ b/js/src/vm/StringBuffer.cpp
@@ -111,11 +111,17 @@ StringBuffer::finishString()
JS_STATIC_ASSERT(JSFatInlineString::MAX_LENGTH_LATIN1 < Latin1CharBuffer::InlineLength);
if (isLatin1()) {
+ if (JSAtom* staticStr = cx->staticStrings().lookup(latin1Chars().begin(), len))
+ return staticStr;
+
if (JSInlineString::lengthFits<Latin1Char>(len)) {
mozilla::Range<const Latin1Char> range(latin1Chars().begin(), len);
return NewInlineString<CanGC>(cx, range);
}
} else {
+ if (JSAtom* staticStr = cx->staticStrings().lookup(twoByteChars().begin(), len))
+ return staticStr;
+
if (JSInlineString::lengthFits<char16_t>(len)) {
mozilla::Range<const char16_t> range(twoByteChars().begin(), len);
return NewInlineString<CanGC>(cx, range);
diff --git a/js/src/vm/TypedArrayObject.cpp b/js/src/vm/TypedArrayObject.cpp
index 9dca828a3a..9d82fca6ec 100644
--- a/js/src/vm/TypedArrayObject.cpp
+++ b/js/src/vm/TypedArrayObject.cpp
@@ -1486,6 +1486,8 @@ TypedArrayObject::protoFunctions[] = {
JS_SELF_HOSTED_FN("filter", "TypedArrayFilter", 1, 0),
JS_SELF_HOSTED_FN("find", "TypedArrayFind", 1, 0),
JS_SELF_HOSTED_FN("findIndex", "TypedArrayFindIndex", 1, 0),
+ JS_SELF_HOSTED_FN("findLast", "TypedArrayFindLast", 1, 0),
+ JS_SELF_HOSTED_FN("findLastIndex", "TypedArrayFindLastIndex", 1, 0),
JS_SELF_HOSTED_FN("forEach", "TypedArrayForEach", 1, 0),
JS_SELF_HOSTED_FN("indexOf", "TypedArrayIndexOf", 2, 0),
JS_SELF_HOSTED_FN("join", "TypedArrayJoin", 1, 0),
diff --git a/js/src/vm/Unicode.cpp b/js/src/vm/Unicode.cpp
index bc4566c825..0236f7c649 100644
--- a/js/src/vm/Unicode.cpp
+++ b/js/src/vm/Unicode.cpp
@@ -55,176 +55,176 @@ using namespace js::unicode;
* stop if you found the best shift
*/
const CharacterInfo unicode::js_charinfo[] = {
- {0, 0, 0},
- {0, 0, 1},
- {0, 0, 4},
- {0, 32, 2},
- {65504, 0, 2},
- {0, 0, 2},
- {743, 0, 2},
- {121, 0, 2},
- {0, 1, 2},
- {65535, 0, 2},
- {0, 65337, 2},
- {65304, 0, 2},
- {0, 65415, 2},
- {65236, 0, 2},
- {195, 0, 2},
- {0, 210, 2},
- {0, 206, 2},
- {0, 205, 2},
- {0, 79, 2},
- {0, 202, 2},
- {0, 203, 2},
- {0, 207, 2},
- {97, 0, 2},
- {0, 211, 2},
- {0, 209, 2},
- {163, 0, 2},
- {0, 213, 2},
- {130, 0, 2},
- {0, 214, 2},
- {0, 218, 2},
- {0, 217, 2},
- {0, 219, 2},
- {56, 0, 2},
- {0, 2, 2},
- {65535, 1, 2},
- {65534, 0, 2},
- {65457, 0, 2},
- {0, 65439, 2},
- {0, 65480, 2},
- {0, 65406, 2},
- {0, 10795, 2},
- {0, 65373, 2},
- {0, 10792, 2},
- {10815, 0, 2},
- {0, 65341, 2},
- {0, 69, 2},
- {0, 71, 2},
- {10783, 0, 2},
- {10780, 0, 2},
- {10782, 0, 2},
- {65326, 0, 2},
- {65330, 0, 2},
- {65331, 0, 2},
- {65334, 0, 2},
- {65333, 0, 2},
- {42319, 0, 2},
- {42315, 0, 2},
- {65329, 0, 2},
- {42280, 0, 2},
- {42308, 0, 2},
- {65327, 0, 2},
- {65325, 0, 2},
- {10743, 0, 2},
- {42305, 0, 2},
- {10749, 0, 2},
- {65323, 0, 2},
- {65322, 0, 2},
- {10727, 0, 2},
- {65318, 0, 2},
- {42282, 0, 2},
- {65467, 0, 2},
- {65319, 0, 2},
- {65465, 0, 2},
- {65317, 0, 2},
- {42261, 0, 2},
- {42258, 0, 2},
- {84, 0, 4},
- {0, 116, 2},
- {0, 38, 2},
- {0, 37, 2},
- {0, 64, 2},
- {0, 63, 2},
- {65498, 0, 2},
- {65499, 0, 2},
- {65505, 0, 2},
- {65472, 0, 2},
- {65473, 0, 2},
- {0, 8, 2},
- {65474, 0, 2},
- {65479, 0, 2},
- {65489, 0, 2},
- {65482, 0, 2},
- {65528, 0, 2},
- {65450, 0, 2},
- {65456, 0, 2},
- {7, 0, 2},
- {65420, 0, 2},
- {0, 65476, 2},
- {65440, 0, 2},
- {0, 65529, 2},
- {0, 80, 2},
- {0, 15, 2},
- {65521, 0, 2},
- {0, 48, 2},
- {65488, 0, 2},
- {0, 7264, 2},
- {3008, 0, 2},
- {0, 38864, 2},
- {59282, 0, 2},
- {59283, 0, 2},
- {59292, 0, 2},
- {59294, 0, 2},
- {59293, 0, 2},
- {59300, 0, 2},
- {59355, 0, 2},
- {35266, 0, 2},
- {0, 62528, 2},
- {35332, 0, 2},
- {3814, 0, 2},
- {65477, 0, 2},
- {0, 57921, 2},
- {8, 0, 2},
- {0, 65528, 2},
- {74, 0, 2},
- {86, 0, 2},
- {100, 0, 2},
- {128, 0, 2},
- {112, 0, 2},
- {126, 0, 2},
- {9, 0, 2},
- {0, 65462, 2},
- {0, 65527, 2},
- {58331, 0, 2},
- {0, 65450, 2},
- {0, 65436, 2},
- {0, 65424, 2},
- {0, 65408, 2},
- {0, 65410, 2},
- {0, 58019, 2},
- {0, 57153, 2},
- {0, 57274, 2},
- {0, 28, 2},
- {65508, 0, 2},
- {0, 16, 2},
- {65520, 0, 2},
- {0, 26, 0},
- {65510, 0, 0},
- {0, 54793, 2},
- {0, 61722, 2},
- {0, 54809, 2},
- {54741, 0, 2},
- {54744, 0, 2},
- {0, 54756, 2},
- {0, 54787, 2},
- {0, 54753, 2},
- {0, 54754, 2},
- {0, 54721, 2},
- {58272, 0, 2},
- {0, 30204, 2},
- {0, 23256, 2},
- {0, 23228, 2},
- {0, 23217, 2},
- {0, 23221, 2},
- {0, 23231, 2},
- {0, 23278, 2},
- {0, 23254, 2},
- {0, 23275, 2},
- {0, 928, 2},
- {64608, 0, 2},
- {26672, 0, 2},
+ { 0, 0, 0 },
+ { 0, 0, 1 },
+ { 0, 0, 4 },
+ { 0, 32, 2 },
+ { 65504, 0, 2 },
+ { 0, 0, 2 },
+ { 743, 0, 2 },
+ { 121, 0, 2 },
+ { 0, 1, 2 },
+ { 65535, 0, 2 },
+ { 0, 65337, 2 },
+ { 65304, 0, 2 },
+ { 0, 65415, 2 },
+ { 65236, 0, 2 },
+ { 195, 0, 2 },
+ { 0, 210, 2 },
+ { 0, 206, 2 },
+ { 0, 205, 2 },
+ { 0, 79, 2 },
+ { 0, 202, 2 },
+ { 0, 203, 2 },
+ { 0, 207, 2 },
+ { 97, 0, 2 },
+ { 0, 211, 2 },
+ { 0, 209, 2 },
+ { 163, 0, 2 },
+ { 0, 213, 2 },
+ { 130, 0, 2 },
+ { 0, 214, 2 },
+ { 0, 218, 2 },
+ { 0, 217, 2 },
+ { 0, 219, 2 },
+ { 56, 0, 2 },
+ { 0, 2, 2 },
+ { 65535, 1, 2 },
+ { 65534, 0, 2 },
+ { 65457, 0, 2 },
+ { 0, 65439, 2 },
+ { 0, 65480, 2 },
+ { 0, 65406, 2 },
+ { 0, 10795, 2 },
+ { 0, 65373, 2 },
+ { 0, 10792, 2 },
+ { 10815, 0, 2 },
+ { 0, 65341, 2 },
+ { 0, 69, 2 },
+ { 0, 71, 2 },
+ { 10783, 0, 2 },
+ { 10780, 0, 2 },
+ { 10782, 0, 2 },
+ { 65326, 0, 2 },
+ { 65330, 0, 2 },
+ { 65331, 0, 2 },
+ { 65334, 0, 2 },
+ { 65333, 0, 2 },
+ { 42319, 0, 2 },
+ { 42315, 0, 2 },
+ { 65329, 0, 2 },
+ { 42280, 0, 2 },
+ { 42308, 0, 2 },
+ { 65327, 0, 2 },
+ { 65325, 0, 2 },
+ { 10743, 0, 2 },
+ { 42305, 0, 2 },
+ { 10749, 0, 2 },
+ { 65323, 0, 2 },
+ { 65322, 0, 2 },
+ { 10727, 0, 2 },
+ { 65318, 0, 2 },
+ { 42282, 0, 2 },
+ { 65467, 0, 2 },
+ { 65319, 0, 2 },
+ { 65465, 0, 2 },
+ { 65317, 0, 2 },
+ { 42261, 0, 2 },
+ { 42258, 0, 2 },
+ { 84, 0, 4 },
+ { 0, 116, 2 },
+ { 0, 38, 2 },
+ { 0, 37, 2 },
+ { 0, 64, 2 },
+ { 0, 63, 2 },
+ { 65498, 0, 2 },
+ { 65499, 0, 2 },
+ { 65505, 0, 2 },
+ { 65472, 0, 2 },
+ { 65473, 0, 2 },
+ { 0, 8, 2 },
+ { 65474, 0, 2 },
+ { 65479, 0, 2 },
+ { 65489, 0, 2 },
+ { 65482, 0, 2 },
+ { 65528, 0, 2 },
+ { 65450, 0, 2 },
+ { 65456, 0, 2 },
+ { 7, 0, 2 },
+ { 65420, 0, 2 },
+ { 0, 65476, 2 },
+ { 65440, 0, 2 },
+ { 0, 65529, 2 },
+ { 0, 80, 2 },
+ { 0, 15, 2 },
+ { 65521, 0, 2 },
+ { 0, 48, 2 },
+ { 65488, 0, 2 },
+ { 0, 7264, 2 },
+ { 3008, 0, 2 },
+ { 0, 38864, 2 },
+ { 59282, 0, 2 },
+ { 59283, 0, 2 },
+ { 59292, 0, 2 },
+ { 59294, 0, 2 },
+ { 59293, 0, 2 },
+ { 59300, 0, 2 },
+ { 59355, 0, 2 },
+ { 35266, 0, 2 },
+ { 0, 62528, 2 },
+ { 35332, 0, 2 },
+ { 3814, 0, 2 },
+ { 65477, 0, 2 },
+ { 0, 57921, 2 },
+ { 8, 0, 2 },
+ { 0, 65528, 2 },
+ { 74, 0, 2 },
+ { 86, 0, 2 },
+ { 100, 0, 2 },
+ { 128, 0, 2 },
+ { 112, 0, 2 },
+ { 126, 0, 2 },
+ { 9, 0, 2 },
+ { 0, 65462, 2 },
+ { 0, 65527, 2 },
+ { 58331, 0, 2 },
+ { 0, 65450, 2 },
+ { 0, 65436, 2 },
+ { 0, 65424, 2 },
+ { 0, 65408, 2 },
+ { 0, 65410, 2 },
+ { 0, 58019, 2 },
+ { 0, 57153, 2 },
+ { 0, 57274, 2 },
+ { 0, 28, 2 },
+ { 65508, 0, 2 },
+ { 0, 16, 2 },
+ { 65520, 0, 2 },
+ { 0, 26, 0 },
+ { 65510, 0, 0 },
+ { 0, 54793, 2 },
+ { 0, 61722, 2 },
+ { 0, 54809, 2 },
+ { 54741, 0, 2 },
+ { 54744, 0, 2 },
+ { 0, 54756, 2 },
+ { 0, 54787, 2 },
+ { 0, 54753, 2 },
+ { 0, 54754, 2 },
+ { 0, 54721, 2 },
+ { 58272, 0, 2 },
+ { 0, 30204, 2 },
+ { 0, 23256, 2 },
+ { 0, 23228, 2 },
+ { 0, 23217, 2 },
+ { 0, 23221, 2 },
+ { 0, 23231, 2 },
+ { 0, 23278, 2 },
+ { 0, 23254, 2 },
+ { 0, 23275, 2 },
+ { 0, 928, 2 },
+ { 64608, 0, 2 },
+ { 26672, 0, 2 },
};
const uint8_t unicode::index1[] = {
@@ -928,141 +928,141 @@ const uint8_t unicode::index2[] = {
};
const CodepointsWithSameUpperCaseInfo unicode::js_codepoints_with_same_upper_info[] = {
- {0, 0, 0},
- {32, 0, 0},
- {32, 232, 0},
- {32, 300, 0},
- {0, 200, 0},
- {0, 268, 0},
- {0, 775, 0},
- {1, 0, 0},
- {65336, 0, 0},
- {65415, 0, 0},
- {65268, 0, 0},
- {210, 0, 0},
- {206, 0, 0},
- {205, 0, 0},
- {79, 0, 0},
- {202, 0, 0},
- {203, 0, 0},
- {207, 0, 0},
- {211, 0, 0},
- {209, 0, 0},
- {213, 0, 0},
- {214, 0, 0},
- {218, 0, 0},
- {217, 0, 0},
- {219, 0, 0},
- {1, 2, 0},
- {0, 1, 0},
- {65535, 0, 0},
- {65439, 0, 0},
- {65480, 0, 0},
- {65406, 0, 0},
- {10795, 0, 0},
- {65373, 0, 0},
- {10792, 0, 0},
- {65341, 0, 0},
- {69, 0, 0},
- {71, 0, 0},
- {0, 116, 7289},
- {116, 0, 0},
- {38, 0, 0},
- {37, 0, 0},
- {64, 0, 0},
- {63, 0, 0},
- {32, 62, 0},
- {32, 96, 0},
- {32, 57, 0},
- {65452, 32, 7205},
- {32, 86, 0},
- {64793, 32, 0},
- {32, 54, 0},
- {32, 80, 0},
- {31, 32, 0},
- {32, 47, 0},
- {0, 30, 0},
- {0, 64, 0},
- {0, 25, 0},
- {65420, 0, 7173},
- {0, 54, 0},
- {64761, 0, 0},
- {0, 22, 0},
- {0, 48, 0},
- {0, 15, 0},
- {8, 0, 0},
- {65506, 0, 0},
- {65511, 0, 0},
- {65521, 0, 0},
- {65514, 0, 0},
- {65482, 0, 0},
- {65488, 0, 0},
- {65472, 0, 0},
- {65529, 0, 0},
- {80, 0, 0},
- {32, 6254, 0},
- {32, 6253, 0},
- {32, 6244, 0},
- {32, 6242, 0},
- {32, 6242, 6243},
- {32, 6236, 0},
- {0, 6222, 0},
- {0, 6221, 0},
- {0, 6212, 0},
- {0, 6210, 0},
- {0, 6210, 6211},
- {0, 6204, 0},
- {1, 6181, 0},
- {0, 6180, 0},
- {15, 0, 0},
- {48, 0, 0},
- {7264, 0, 0},
- {38864, 0, 0},
- {59314, 0, 0},
- {59315, 0, 0},
- {59324, 0, 0},
- {59326, 0, 0},
- {59326, 0, 1},
- {59325, 65535, 0},
- {59332, 0, 0},
- {59356, 0, 0},
- {0, 35267, 0},
- {62528, 0, 0},
- {1, 59, 0},
- {0, 58, 0},
- {65478, 0, 0},
- {65528, 0, 0},
- {65462, 0, 0},
- {65527, 0, 0},
- {58247, 58363, 0},
- {65450, 0, 0},
- {65436, 0, 0},
- {65424, 0, 0},
- {65408, 0, 0},
- {65410, 0, 0},
- {28, 0, 0},
- {16, 0, 0},
- {26, 0, 0},
- {54793, 0, 0},
- {61722, 0, 0},
- {54809, 0, 0},
- {54756, 0, 0},
- {54787, 0, 0},
- {54753, 0, 0},
- {54754, 0, 0},
- {54721, 0, 0},
- {30270, 1, 0},
- {30269, 0, 0},
- {30204, 0, 0},
- {23256, 0, 0},
- {23228, 0, 0},
- {23217, 0, 0},
- {23221, 0, 0},
- {23231, 0, 0},
- {23278, 0, 0},
- {23254, 0, 0},
- {23275, 0, 0},
- {928, 0, 0},
+ { 0, 0, 0 },
+ { 32, 0, 0 },
+ { 32, 232, 0 },
+ { 32, 300, 0 },
+ { 0, 200, 0 },
+ { 0, 268, 0 },
+ { 0, 775, 0 },
+ { 1, 0, 0 },
+ { 65336, 0, 0 },
+ { 65415, 0, 0 },
+ { 65268, 0, 0 },
+ { 210, 0, 0 },
+ { 206, 0, 0 },
+ { 205, 0, 0 },
+ { 79, 0, 0 },
+ { 202, 0, 0 },
+ { 203, 0, 0 },
+ { 207, 0, 0 },
+ { 211, 0, 0 },
+ { 209, 0, 0 },
+ { 213, 0, 0 },
+ { 214, 0, 0 },
+ { 218, 0, 0 },
+ { 217, 0, 0 },
+ { 219, 0, 0 },
+ { 1, 2, 0 },
+ { 0, 1, 0 },
+ { 65535, 0, 0 },
+ { 65439, 0, 0 },
+ { 65480, 0, 0 },
+ { 65406, 0, 0 },
+ { 10795, 0, 0 },
+ { 65373, 0, 0 },
+ { 10792, 0, 0 },
+ { 65341, 0, 0 },
+ { 69, 0, 0 },
+ { 71, 0, 0 },
+ { 0, 116, 7289 },
+ { 116, 0, 0 },
+ { 38, 0, 0 },
+ { 37, 0, 0 },
+ { 64, 0, 0 },
+ { 63, 0, 0 },
+ { 32, 62, 0 },
+ { 32, 96, 0 },
+ { 32, 57, 0 },
+ { 65452, 32, 7205 },
+ { 32, 86, 0 },
+ { 64793, 32, 0 },
+ { 32, 54, 0 },
+ { 32, 80, 0 },
+ { 31, 32, 0 },
+ { 32, 47, 0 },
+ { 0, 30, 0 },
+ { 0, 64, 0 },
+ { 0, 25, 0 },
+ { 65420, 0, 7173 },
+ { 0, 54, 0 },
+ { 64761, 0, 0 },
+ { 0, 22, 0 },
+ { 0, 48, 0 },
+ { 0, 15, 0 },
+ { 8, 0, 0 },
+ { 65506, 0, 0 },
+ { 65511, 0, 0 },
+ { 65521, 0, 0 },
+ { 65514, 0, 0 },
+ { 65482, 0, 0 },
+ { 65488, 0, 0 },
+ { 65472, 0, 0 },
+ { 65529, 0, 0 },
+ { 80, 0, 0 },
+ { 32, 6254, 0 },
+ { 32, 6253, 0 },
+ { 32, 6244, 0 },
+ { 32, 6242, 0 },
+ { 32, 6242, 6243 },
+ { 32, 6236, 0 },
+ { 0, 6222, 0 },
+ { 0, 6221, 0 },
+ { 0, 6212, 0 },
+ { 0, 6210, 0 },
+ { 0, 6210, 6211 },
+ { 0, 6204, 0 },
+ { 1, 6181, 0 },
+ { 0, 6180, 0 },
+ { 15, 0, 0 },
+ { 48, 0, 0 },
+ { 7264, 0, 0 },
+ { 38864, 0, 0 },
+ { 59314, 0, 0 },
+ { 59315, 0, 0 },
+ { 59324, 0, 0 },
+ { 59326, 0, 0 },
+ { 59326, 0, 1 },
+ { 59325, 65535, 0 },
+ { 59332, 0, 0 },
+ { 59356, 0, 0 },
+ { 0, 35267, 0 },
+ { 62528, 0, 0 },
+ { 1, 59, 0 },
+ { 0, 58, 0 },
+ { 65478, 0, 0 },
+ { 65528, 0, 0 },
+ { 65462, 0, 0 },
+ { 65527, 0, 0 },
+ { 58247, 58363, 0 },
+ { 65450, 0, 0 },
+ { 65436, 0, 0 },
+ { 65424, 0, 0 },
+ { 65408, 0, 0 },
+ { 65410, 0, 0 },
+ { 28, 0, 0 },
+ { 16, 0, 0 },
+ { 26, 0, 0 },
+ { 54793, 0, 0 },
+ { 61722, 0, 0 },
+ { 54809, 0, 0 },
+ { 54756, 0, 0 },
+ { 54787, 0, 0 },
+ { 54753, 0, 0 },
+ { 54754, 0, 0 },
+ { 54721, 0, 0 },
+ { 30270, 1, 0 },
+ { 30269, 0, 0 },
+ { 30204, 0, 0 },
+ { 23256, 0, 0 },
+ { 23228, 0, 0 },
+ { 23217, 0, 0 },
+ { 23221, 0, 0 },
+ { 23231, 0, 0 },
+ { 23278, 0, 0 },
+ { 23254, 0, 0 },
+ { 23275, 0, 0 },
+ { 928, 0, 0 },
};
const uint8_t unicode::codepoints_with_same_upper_index1[] = {
@@ -1289,220 +1289,220 @@ const uint8_t unicode::codepoints_with_same_upper_index2[] = {
};
const FoldingInfo unicode::js_foldinfo[] = {
- {0, 0, 0, 0},
- {32, 0, 0, 0},
- {32, 8415, 0, 0},
- {32, 300, 0, 0},
- {0, 65504, 0, 0},
- {0, 65504, 8383, 0},
- {0, 65504, 268, 0},
- {775, 743, 0, 0},
- {32, 8294, 0, 0},
- {0, 7615, 0, 0},
- {0, 65504, 8262, 0},
- {0, 121, 0, 0},
- {1, 0, 0, 0},
- {0, 65535, 0, 0},
- {65415, 0, 0, 0},
- {65268, 65236, 0, 0},
- {0, 195, 0, 0},
- {210, 0, 0, 0},
- {206, 0, 0, 0},
- {205, 0, 0, 0},
- {79, 0, 0, 0},
- {202, 0, 0, 0},
- {203, 0, 0, 0},
- {207, 0, 0, 0},
- {0, 97, 0, 0},
- {211, 0, 0, 0},
- {209, 0, 0, 0},
- {0, 163, 0, 0},
- {213, 0, 0, 0},
- {0, 130, 0, 0},
- {214, 0, 0, 0},
- {218, 0, 0, 0},
- {217, 0, 0, 0},
- {219, 0, 0, 0},
- {0, 56, 0, 0},
- {2, 1, 0, 0},
- {1, 65535, 0, 0},
- {0, 65534, 65535, 0},
- {0, 65457, 0, 0},
- {65439, 0, 0, 0},
- {65480, 0, 0, 0},
- {65406, 0, 0, 0},
- {10795, 0, 0, 0},
- {65373, 0, 0, 0},
- {10792, 0, 0, 0},
- {0, 10815, 0, 0},
- {65341, 0, 0, 0},
- {69, 0, 0, 0},
- {71, 0, 0, 0},
- {0, 10783, 0, 0},
- {0, 10780, 0, 0},
- {0, 10782, 0, 0},
- {0, 65326, 0, 0},
- {0, 65330, 0, 0},
- {0, 65331, 0, 0},
- {0, 65334, 0, 0},
- {0, 65333, 0, 0},
- {0, 42319, 0, 0},
- {0, 42315, 0, 0},
- {0, 65329, 0, 0},
- {0, 42280, 0, 0},
- {0, 42308, 0, 0},
- {0, 65327, 0, 0},
- {0, 65325, 0, 0},
- {0, 10743, 0, 0},
- {0, 42305, 0, 0},
- {0, 10749, 0, 0},
- {0, 65323, 0, 0},
- {0, 65322, 0, 0},
- {0, 10727, 0, 0},
- {0, 65318, 0, 0},
- {0, 42282, 0, 0},
- {0, 65467, 0, 0},
- {0, 65319, 0, 0},
- {0, 65465, 0, 0},
- {0, 65317, 0, 0},
- {0, 42261, 0, 0},
- {0, 42258, 0, 0},
- {116, 84, 7289, 0},
- {116, 0, 0, 0},
- {38, 0, 0, 0},
- {37, 0, 0, 0},
- {64, 0, 0, 0},
- {63, 0, 0, 0},
- {32, 62, 0, 0},
- {32, 96, 0, 0},
- {32, 57, 92, 0},
- {32, 65452, 7205, 0},
- {32, 86, 0, 0},
- {32, 64793, 0, 0},
- {32, 54, 0, 0},
- {32, 80, 0, 0},
- {32, 31, 0, 0},
- {32, 47, 0, 0},
- {32, 7549, 0, 0},
- {0, 65498, 0, 0},
- {0, 65499, 0, 0},
- {0, 65504, 30, 0},
- {0, 65504, 64, 0},
- {0, 65504, 25, 60},
- {0, 65420, 65504, 7173},
- {0, 65504, 54, 0},
- {0, 64761, 65504, 0},
- {0, 65504, 22, 0},
- {0, 65504, 48, 0},
- {1, 65505, 0, 0},
- {0, 65504, 65535, 0},
- {0, 65504, 15, 0},
- {0, 65504, 7517, 0},
- {0, 65472, 0, 0},
- {0, 65473, 0, 0},
- {8, 0, 0, 0},
- {65506, 65474, 0, 0},
- {65511, 65479, 35, 0},
- {65521, 65489, 0, 0},
- {65514, 65482, 0, 0},
- {0, 65528, 0, 0},
- {65482, 65450, 0, 0},
- {65488, 65456, 0, 0},
- {0, 7, 0, 0},
- {0, 65420, 0, 0},
- {65476, 65444, 65501, 0},
- {65472, 65440, 0, 0},
- {65529, 0, 0, 0},
- {80, 0, 0, 0},
- {32, 6254, 0, 0},
- {32, 6253, 0, 0},
- {32, 6244, 0, 0},
- {32, 6242, 0, 0},
- {32, 6242, 6243, 0},
- {32, 6236, 0, 0},
- {0, 65504, 6222, 0},
- {0, 65504, 6221, 0},
- {0, 65504, 6212, 0},
- {0, 65504, 6210, 0},
- {0, 65504, 6210, 6211},
- {0, 65504, 6204, 0},
- {0, 65456, 0, 0},
- {1, 6181, 0, 0},
- {0, 65535, 6180, 0},
- {15, 0, 0, 0},
- {0, 65521, 0, 0},
- {48, 0, 0, 0},
- {0, 65488, 0, 0},
- {7264, 0, 0, 0},
- {0, 3008, 0, 0},
- {0, 38864, 0, 0},
- {0, 8, 0, 0},
- {65528, 0, 0, 0},
- {59314, 59282, 0, 0},
- {59315, 59283, 0, 0},
- {59324, 59292, 0, 0},
- {59326, 59294, 0, 0},
- {59326, 59294, 1, 0},
- {59325, 59293, 65535, 0},
- {59332, 59300, 0, 0},
- {59356, 59355, 0, 0},
- {35267, 35266, 0, 0},
- {62528, 0, 0, 0},
- {0, 35332, 0, 0},
- {0, 3814, 0, 0},
- {1, 59, 0, 0},
- {0, 65535, 58, 0},
- {65478, 65477, 0, 0},
- {57921, 0, 0, 0},
- {0, 74, 0, 0},
- {0, 86, 0, 0},
- {0, 100, 0, 0},
- {0, 128, 0, 0},
- {0, 112, 0, 0},
- {0, 126, 0, 0},
- {0, 9, 0, 0},
- {65462, 0, 0, 0},
- {65527, 0, 0, 0},
- {58363, 58247, 58331, 0},
- {65450, 0, 0, 0},
- {65436, 0, 0, 0},
- {65424, 0, 0, 0},
- {65408, 0, 0, 0},
- {65410, 0, 0, 0},
- {58019, 57987, 0, 0},
- {57153, 57121, 0, 0},
- {57274, 57242, 0, 0},
- {28, 0, 0, 0},
- {0, 65508, 0, 0},
- {16, 0, 0, 0},
- {0, 65520, 0, 0},
- {26, 0, 0, 0},
- {0, 65510, 0, 0},
- {54793, 0, 0, 0},
- {61722, 0, 0, 0},
- {54809, 0, 0, 0},
- {0, 54741, 0, 0},
- {0, 54744, 0, 0},
- {54756, 0, 0, 0},
- {54787, 0, 0, 0},
- {54753, 0, 0, 0},
- {54754, 0, 0, 0},
- {54721, 0, 0, 0},
- {0, 58272, 0, 0},
- {1, 30270, 0, 0},
- {0, 30269, 65535, 0},
- {30204, 0, 0, 0},
- {23256, 0, 0, 0},
- {23228, 0, 0, 0},
- {23217, 0, 0, 0},
- {23221, 0, 0, 0},
- {23231, 0, 0, 0},
- {23278, 0, 0, 0},
- {23254, 0, 0, 0},
- {23275, 0, 0, 0},
- {928, 0, 0, 0},
- {0, 64608, 0, 0},
- {26672, 0, 0, 0},
+ { 0, 0, 0, 0 },
+ { 32, 0, 0, 0 },
+ { 32, 8415, 0, 0 },
+ { 32, 300, 0, 0 },
+ { 0, 65504, 0, 0 },
+ { 0, 65504, 8383, 0 },
+ { 0, 65504, 268, 0 },
+ { 775, 743, 0, 0 },
+ { 32, 8294, 0, 0 },
+ { 0, 7615, 0, 0 },
+ { 0, 65504, 8262, 0 },
+ { 0, 121, 0, 0 },
+ { 1, 0, 0, 0 },
+ { 0, 65535, 0, 0 },
+ { 65415, 0, 0, 0 },
+ { 65268, 65236, 0, 0 },
+ { 0, 195, 0, 0 },
+ { 210, 0, 0, 0 },
+ { 206, 0, 0, 0 },
+ { 205, 0, 0, 0 },
+ { 79, 0, 0, 0 },
+ { 202, 0, 0, 0 },
+ { 203, 0, 0, 0 },
+ { 207, 0, 0, 0 },
+ { 0, 97, 0, 0 },
+ { 211, 0, 0, 0 },
+ { 209, 0, 0, 0 },
+ { 0, 163, 0, 0 },
+ { 213, 0, 0, 0 },
+ { 0, 130, 0, 0 },
+ { 214, 0, 0, 0 },
+ { 218, 0, 0, 0 },
+ { 217, 0, 0, 0 },
+ { 219, 0, 0, 0 },
+ { 0, 56, 0, 0 },
+ { 2, 1, 0, 0 },
+ { 1, 65535, 0, 0 },
+ { 0, 65534, 65535, 0 },
+ { 0, 65457, 0, 0 },
+ { 65439, 0, 0, 0 },
+ { 65480, 0, 0, 0 },
+ { 65406, 0, 0, 0 },
+ { 10795, 0, 0, 0 },
+ { 65373, 0, 0, 0 },
+ { 10792, 0, 0, 0 },
+ { 0, 10815, 0, 0 },
+ { 65341, 0, 0, 0 },
+ { 69, 0, 0, 0 },
+ { 71, 0, 0, 0 },
+ { 0, 10783, 0, 0 },
+ { 0, 10780, 0, 0 },
+ { 0, 10782, 0, 0 },
+ { 0, 65326, 0, 0 },
+ { 0, 65330, 0, 0 },
+ { 0, 65331, 0, 0 },
+ { 0, 65334, 0, 0 },
+ { 0, 65333, 0, 0 },
+ { 0, 42319, 0, 0 },
+ { 0, 42315, 0, 0 },
+ { 0, 65329, 0, 0 },
+ { 0, 42280, 0, 0 },
+ { 0, 42308, 0, 0 },
+ { 0, 65327, 0, 0 },
+ { 0, 65325, 0, 0 },
+ { 0, 10743, 0, 0 },
+ { 0, 42305, 0, 0 },
+ { 0, 10749, 0, 0 },
+ { 0, 65323, 0, 0 },
+ { 0, 65322, 0, 0 },
+ { 0, 10727, 0, 0 },
+ { 0, 65318, 0, 0 },
+ { 0, 42282, 0, 0 },
+ { 0, 65467, 0, 0 },
+ { 0, 65319, 0, 0 },
+ { 0, 65465, 0, 0 },
+ { 0, 65317, 0, 0 },
+ { 0, 42261, 0, 0 },
+ { 0, 42258, 0, 0 },
+ { 116, 84, 7289, 0 },
+ { 116, 0, 0, 0 },
+ { 38, 0, 0, 0 },
+ { 37, 0, 0, 0 },
+ { 64, 0, 0, 0 },
+ { 63, 0, 0, 0 },
+ { 32, 62, 0, 0 },
+ { 32, 96, 0, 0 },
+ { 32, 57, 92, 0 },
+ { 32, 65452, 7205, 0 },
+ { 32, 86, 0, 0 },
+ { 32, 64793, 0, 0 },
+ { 32, 54, 0, 0 },
+ { 32, 80, 0, 0 },
+ { 32, 31, 0, 0 },
+ { 32, 47, 0, 0 },
+ { 32, 7549, 0, 0 },
+ { 0, 65498, 0, 0 },
+ { 0, 65499, 0, 0 },
+ { 0, 65504, 30, 0 },
+ { 0, 65504, 64, 0 },
+ { 0, 65504, 25, 60 },
+ { 0, 65420, 65504, 7173 },
+ { 0, 65504, 54, 0 },
+ { 0, 64761, 65504, 0 },
+ { 0, 65504, 22, 0 },
+ { 0, 65504, 48, 0 },
+ { 1, 65505, 0, 0 },
+ { 0, 65504, 65535, 0 },
+ { 0, 65504, 15, 0 },
+ { 0, 65504, 7517, 0 },
+ { 0, 65472, 0, 0 },
+ { 0, 65473, 0, 0 },
+ { 8, 0, 0, 0 },
+ { 65506, 65474, 0, 0 },
+ { 65511, 65479, 35, 0 },
+ { 65521, 65489, 0, 0 },
+ { 65514, 65482, 0, 0 },
+ { 0, 65528, 0, 0 },
+ { 65482, 65450, 0, 0 },
+ { 65488, 65456, 0, 0 },
+ { 0, 7, 0, 0 },
+ { 0, 65420, 0, 0 },
+ { 65476, 65444, 65501, 0 },
+ { 65472, 65440, 0, 0 },
+ { 65529, 0, 0, 0 },
+ { 80, 0, 0, 0 },
+ { 32, 6254, 0, 0 },
+ { 32, 6253, 0, 0 },
+ { 32, 6244, 0, 0 },
+ { 32, 6242, 0, 0 },
+ { 32, 6242, 6243, 0 },
+ { 32, 6236, 0, 0 },
+ { 0, 65504, 6222, 0 },
+ { 0, 65504, 6221, 0 },
+ { 0, 65504, 6212, 0 },
+ { 0, 65504, 6210, 0 },
+ { 0, 65504, 6210, 6211 },
+ { 0, 65504, 6204, 0 },
+ { 0, 65456, 0, 0 },
+ { 1, 6181, 0, 0 },
+ { 0, 65535, 6180, 0 },
+ { 15, 0, 0, 0 },
+ { 0, 65521, 0, 0 },
+ { 48, 0, 0, 0 },
+ { 0, 65488, 0, 0 },
+ { 7264, 0, 0, 0 },
+ { 0, 3008, 0, 0 },
+ { 0, 38864, 0, 0 },
+ { 0, 8, 0, 0 },
+ { 65528, 0, 0, 0 },
+ { 59314, 59282, 0, 0 },
+ { 59315, 59283, 0, 0 },
+ { 59324, 59292, 0, 0 },
+ { 59326, 59294, 0, 0 },
+ { 59326, 59294, 1, 0 },
+ { 59325, 59293, 65535, 0 },
+ { 59332, 59300, 0, 0 },
+ { 59356, 59355, 0, 0 },
+ { 35267, 35266, 0, 0 },
+ { 62528, 0, 0, 0 },
+ { 0, 35332, 0, 0 },
+ { 0, 3814, 0, 0 },
+ { 1, 59, 0, 0 },
+ { 0, 65535, 58, 0 },
+ { 65478, 65477, 0, 0 },
+ { 57921, 0, 0, 0 },
+ { 0, 74, 0, 0 },
+ { 0, 86, 0, 0 },
+ { 0, 100, 0, 0 },
+ { 0, 128, 0, 0 },
+ { 0, 112, 0, 0 },
+ { 0, 126, 0, 0 },
+ { 0, 9, 0, 0 },
+ { 65462, 0, 0, 0 },
+ { 65527, 0, 0, 0 },
+ { 58363, 58247, 58331, 0 },
+ { 65450, 0, 0, 0 },
+ { 65436, 0, 0, 0 },
+ { 65424, 0, 0, 0 },
+ { 65408, 0, 0, 0 },
+ { 65410, 0, 0, 0 },
+ { 58019, 57987, 0, 0 },
+ { 57153, 57121, 0, 0 },
+ { 57274, 57242, 0, 0 },
+ { 28, 0, 0, 0 },
+ { 0, 65508, 0, 0 },
+ { 16, 0, 0, 0 },
+ { 0, 65520, 0, 0 },
+ { 26, 0, 0, 0 },
+ { 0, 65510, 0, 0 },
+ { 54793, 0, 0, 0 },
+ { 61722, 0, 0, 0 },
+ { 54809, 0, 0, 0 },
+ { 0, 54741, 0, 0 },
+ { 0, 54744, 0, 0 },
+ { 54756, 0, 0, 0 },
+ { 54787, 0, 0, 0 },
+ { 54753, 0, 0, 0 },
+ { 54754, 0, 0, 0 },
+ { 54721, 0, 0, 0 },
+ { 0, 58272, 0, 0 },
+ { 1, 30270, 0, 0 },
+ { 0, 30269, 65535, 0 },
+ { 30204, 0, 0, 0 },
+ { 23256, 0, 0, 0 },
+ { 23228, 0, 0, 0 },
+ { 23217, 0, 0, 0 },
+ { 23221, 0, 0, 0 },
+ { 23231, 0, 0, 0 },
+ { 23278, 0, 0, 0 },
+ { 23254, 0, 0, 0 },
+ { 23275, 0, 0, 0 },
+ { 928, 0, 0, 0 },
+ { 0, 64608, 0, 0 },
+ { 26672, 0, 0, 0 },
};
const uint8_t unicode::folding_index1[] = {
@@ -1756,439 +1756,439 @@ const uint8_t unicode::folding_index2[] = {
bool
js::unicode::IsIdentifierStartNonBMP(uint32_t codePoint)
{
- if (codePoint >= 0x10000 && codePoint <= 0x1000b)
+ if (codePoint >= 0x10000 && codePoint <= 0x1000B) // LINEAR B SYLLABLE B008 A .. LINEAR B SYLLABLE B046 JE
return true;
- if (codePoint >= 0x1000d && codePoint <= 0x10026)
+ if (codePoint >= 0x1000D && codePoint <= 0x10026) // LINEAR B SYLLABLE B036 JO .. LINEAR B SYLLABLE B032 QO
return true;
- if (codePoint >= 0x10028 && codePoint <= 0x1003a)
+ if (codePoint >= 0x10028 && codePoint <= 0x1003A) // LINEAR B SYLLABLE B060 RA .. LINEAR B SYLLABLE B042 WO
return true;
- if (codePoint >= 0x1003c && codePoint <= 0x1003d)
+ if (codePoint >= 0x1003C && codePoint <= 0x1003D) // LINEAR B SYLLABLE B017 ZA .. LINEAR B SYLLABLE B074 ZE
return true;
- if (codePoint >= 0x1003f && codePoint <= 0x1004d)
+ if (codePoint >= 0x1003F && codePoint <= 0x1004D) // LINEAR B SYLLABLE B020 ZO .. LINEAR B SYLLABLE B091 TWO
return true;
- if (codePoint >= 0x10050 && codePoint <= 0x1005d)
+ if (codePoint >= 0x10050 && codePoint <= 0x1005D) // LINEAR B SYMBOL B018 .. LINEAR B SYMBOL B089
return true;
- if (codePoint >= 0x10080 && codePoint <= 0x100fa)
+ if (codePoint >= 0x10080 && codePoint <= 0x100FA) // LINEAR B IDEOGRAM B100 MAN .. LINEAR B IDEOGRAM VESSEL B305
return true;
- if (codePoint >= 0x10140 && codePoint <= 0x10174)
+ if (codePoint >= 0x10140 && codePoint <= 0x10174) // GREEK ACROPHONIC ATTIC ONE QUARTER .. GREEK ACROPHONIC STRATIAN FIFTY MNAS
return true;
- if (codePoint >= 0x10280 && codePoint <= 0x1029c)
+ if (codePoint >= 0x10280 && codePoint <= 0x1029C) // LYCIAN LETTER A .. LYCIAN LETTER X
return true;
- if (codePoint >= 0x102a0 && codePoint <= 0x102d0)
+ if (codePoint >= 0x102A0 && codePoint <= 0x102D0) // CARIAN LETTER A .. CARIAN LETTER UUU3
return true;
- if (codePoint >= 0x10300 && codePoint <= 0x1031f)
+ if (codePoint >= 0x10300 && codePoint <= 0x1031F) // OLD ITALIC LETTER A .. OLD ITALIC LETTER ESS
return true;
- if (codePoint >= 0x1032d && codePoint <= 0x1034a)
+ if (codePoint >= 0x1032D && codePoint <= 0x1034A) // OLD ITALIC LETTER YE .. GOTHIC LETTER NINE HUNDRED
return true;
- if (codePoint >= 0x10350 && codePoint <= 0x10375)
+ if (codePoint >= 0x10350 && codePoint <= 0x10375) // OLD PERMIC LETTER AN .. OLD PERMIC LETTER IA
return true;
- if (codePoint >= 0x10380 && codePoint <= 0x1039d)
+ if (codePoint >= 0x10380 && codePoint <= 0x1039D) // UGARITIC LETTER ALPA .. UGARITIC LETTER SSU
return true;
- if (codePoint >= 0x103a0 && codePoint <= 0x103c3)
+ if (codePoint >= 0x103A0 && codePoint <= 0x103C3) // OLD PERSIAN SIGN A .. OLD PERSIAN SIGN HA
return true;
- if (codePoint >= 0x103c8 && codePoint <= 0x103cf)
+ if (codePoint >= 0x103C8 && codePoint <= 0x103CF) // OLD PERSIAN SIGN AURAMAZDAA .. OLD PERSIAN SIGN BUUMISH
return true;
- if (codePoint >= 0x103d1 && codePoint <= 0x103d5)
+ if (codePoint >= 0x103D1 && codePoint <= 0x103D5) // OLD PERSIAN NUMBER ONE .. OLD PERSIAN NUMBER HUNDRED
return true;
- if (codePoint >= 0x10400 && codePoint <= 0x1049d)
+ if (codePoint >= 0x10400 && codePoint <= 0x1049D) // DESERET CAPITAL LETTER LONG I .. OSMANYA LETTER OO
return true;
- if (codePoint >= 0x104b0 && codePoint <= 0x104d3)
+ if (codePoint >= 0x104B0 && codePoint <= 0x104D3) // OSAGE CAPITAL LETTER A .. OSAGE CAPITAL LETTER ZHA
return true;
- if (codePoint >= 0x104d8 && codePoint <= 0x104fb)
+ if (codePoint >= 0x104D8 && codePoint <= 0x104FB) // OSAGE SMALL LETTER A .. OSAGE SMALL LETTER ZHA
return true;
- if (codePoint >= 0x10500 && codePoint <= 0x10527)
+ if (codePoint >= 0x10500 && codePoint <= 0x10527) // ELBASAN LETTER A .. ELBASAN LETTER KHE
return true;
- if (codePoint >= 0x10530 && codePoint <= 0x10563)
+ if (codePoint >= 0x10530 && codePoint <= 0x10563) // CAUCASIAN ALBANIAN LETTER ALT .. CAUCASIAN ALBANIAN LETTER KIW
return true;
- if (codePoint >= 0x10600 && codePoint <= 0x10736)
+ if (codePoint >= 0x10600 && codePoint <= 0x10736) // LINEAR A SIGN AB001 .. LINEAR A SIGN A664
return true;
- if (codePoint >= 0x10740 && codePoint <= 0x10755)
+ if (codePoint >= 0x10740 && codePoint <= 0x10755) // LINEAR A SIGN A701 A .. LINEAR A SIGN A732 JE
return true;
- if (codePoint >= 0x10760 && codePoint <= 0x10767)
+ if (codePoint >= 0x10760 && codePoint <= 0x10767) // LINEAR A SIGN A800 .. LINEAR A SIGN A807
return true;
- if (codePoint >= 0x10800 && codePoint <= 0x10805)
+ if (codePoint >= 0x10800 && codePoint <= 0x10805) // CYPRIOT SYLLABLE A .. CYPRIOT SYLLABLE JA
return true;
- if (codePoint >= 0x10808 && codePoint <= 0x10808)
+ if (codePoint >= 0x10808 && codePoint <= 0x10808) // CYPRIOT SYLLABLE JO .. CYPRIOT SYLLABLE JO
return true;
- if (codePoint >= 0x1080a && codePoint <= 0x10835)
+ if (codePoint >= 0x1080A && codePoint <= 0x10835) // CYPRIOT SYLLABLE KA .. CYPRIOT SYLLABLE WO
return true;
- if (codePoint >= 0x10837 && codePoint <= 0x10838)
+ if (codePoint >= 0x10837 && codePoint <= 0x10838) // CYPRIOT SYLLABLE XA .. CYPRIOT SYLLABLE XE
return true;
- if (codePoint >= 0x1083c && codePoint <= 0x1083c)
+ if (codePoint >= 0x1083C && codePoint <= 0x1083C) // CYPRIOT SYLLABLE ZA .. CYPRIOT SYLLABLE ZA
return true;
- if (codePoint >= 0x1083f && codePoint <= 0x10855)
+ if (codePoint >= 0x1083F && codePoint <= 0x10855) // CYPRIOT SYLLABLE ZO .. IMPERIAL ARAMAIC LETTER TAW
return true;
- if (codePoint >= 0x10860 && codePoint <= 0x10876)
+ if (codePoint >= 0x10860 && codePoint <= 0x10876) // PALMYRENE LETTER ALEPH .. PALMYRENE LETTER TAW
return true;
- if (codePoint >= 0x10880 && codePoint <= 0x1089e)
+ if (codePoint >= 0x10880 && codePoint <= 0x1089E) // NABATAEAN LETTER FINAL ALEPH .. NABATAEAN LETTER TAW
return true;
- if (codePoint >= 0x108e0 && codePoint <= 0x108f2)
+ if (codePoint >= 0x108E0 && codePoint <= 0x108F2) // HATRAN LETTER ALEPH .. HATRAN LETTER QOPH
return true;
- if (codePoint >= 0x108f4 && codePoint <= 0x108f5)
+ if (codePoint >= 0x108F4 && codePoint <= 0x108F5) // HATRAN LETTER SHIN .. HATRAN LETTER TAW
return true;
- if (codePoint >= 0x10900 && codePoint <= 0x10915)
+ if (codePoint >= 0x10900 && codePoint <= 0x10915) // PHOENICIAN LETTER ALF .. PHOENICIAN LETTER TAU
return true;
- if (codePoint >= 0x10920 && codePoint <= 0x10939)
+ if (codePoint >= 0x10920 && codePoint <= 0x10939) // LYDIAN LETTER A .. LYDIAN LETTER C
return true;
- if (codePoint >= 0x10980 && codePoint <= 0x109b7)
+ if (codePoint >= 0x10980 && codePoint <= 0x109B7) // MEROITIC HIEROGLYPHIC LETTER A .. MEROITIC CURSIVE LETTER DA
return true;
- if (codePoint >= 0x109be && codePoint <= 0x109bf)
+ if (codePoint >= 0x109BE && codePoint <= 0x109BF) // MEROITIC CURSIVE LOGOGRAM RMT .. MEROITIC CURSIVE LOGOGRAM IMN
return true;
- if (codePoint >= 0x10a00 && codePoint <= 0x10a00)
+ if (codePoint >= 0x10A00 && codePoint <= 0x10A00) // KHAROSHTHI LETTER A .. KHAROSHTHI LETTER A
return true;
- if (codePoint >= 0x10a10 && codePoint <= 0x10a13)
+ if (codePoint >= 0x10A10 && codePoint <= 0x10A13) // KHAROSHTHI LETTER KA .. KHAROSHTHI LETTER GHA
return true;
- if (codePoint >= 0x10a15 && codePoint <= 0x10a17)
+ if (codePoint >= 0x10A15 && codePoint <= 0x10A17) // KHAROSHTHI LETTER CA .. KHAROSHTHI LETTER JA
return true;
- if (codePoint >= 0x10a19 && codePoint <= 0x10a35)
+ if (codePoint >= 0x10A19 && codePoint <= 0x10A35) // KHAROSHTHI LETTER NYA .. KHAROSHTHI LETTER VHA
return true;
- if (codePoint >= 0x10a60 && codePoint <= 0x10a7c)
+ if (codePoint >= 0x10A60 && codePoint <= 0x10A7C) // OLD SOUTH ARABIAN LETTER HE .. OLD SOUTH ARABIAN LETTER THETH
return true;
- if (codePoint >= 0x10a80 && codePoint <= 0x10a9c)
+ if (codePoint >= 0x10A80 && codePoint <= 0x10A9C) // OLD NORTH ARABIAN LETTER HEH .. OLD NORTH ARABIAN LETTER ZAH
return true;
- if (codePoint >= 0x10ac0 && codePoint <= 0x10ac7)
+ if (codePoint >= 0x10AC0 && codePoint <= 0x10AC7) // MANICHAEAN LETTER ALEPH .. MANICHAEAN LETTER WAW
return true;
- if (codePoint >= 0x10ac9 && codePoint <= 0x10ae4)
+ if (codePoint >= 0x10AC9 && codePoint <= 0x10AE4) // MANICHAEAN LETTER ZAYIN .. MANICHAEAN LETTER TAW
return true;
- if (codePoint >= 0x10b00 && codePoint <= 0x10b35)
+ if (codePoint >= 0x10B00 && codePoint <= 0x10B35) // AVESTAN LETTER A .. AVESTAN LETTER HE
return true;
- if (codePoint >= 0x10b40 && codePoint <= 0x10b55)
+ if (codePoint >= 0x10B40 && codePoint <= 0x10B55) // INSCRIPTIONAL PARTHIAN LETTER ALEPH .. INSCRIPTIONAL PARTHIAN LETTER TAW
return true;
- if (codePoint >= 0x10b60 && codePoint <= 0x10b72)
+ if (codePoint >= 0x10B60 && codePoint <= 0x10B72) // INSCRIPTIONAL PAHLAVI LETTER ALEPH .. INSCRIPTIONAL PAHLAVI LETTER TAW
return true;
- if (codePoint >= 0x10b80 && codePoint <= 0x10b91)
+ if (codePoint >= 0x10B80 && codePoint <= 0x10B91) // PSALTER PAHLAVI LETTER ALEPH .. PSALTER PAHLAVI LETTER TAW
return true;
- if (codePoint >= 0x10c00 && codePoint <= 0x10c48)
+ if (codePoint >= 0x10C00 && codePoint <= 0x10C48) // OLD TURKIC LETTER ORKHON A .. OLD TURKIC LETTER ORKHON BASH
return true;
- if (codePoint >= 0x10c80 && codePoint <= 0x10cb2)
+ if (codePoint >= 0x10C80 && codePoint <= 0x10CB2) // OLD HUNGARIAN CAPITAL LETTER A .. OLD HUNGARIAN CAPITAL LETTER US
return true;
- if (codePoint >= 0x10cc0 && codePoint <= 0x10cf2)
+ if (codePoint >= 0x10CC0 && codePoint <= 0x10CF2) // OLD HUNGARIAN SMALL LETTER A .. OLD HUNGARIAN SMALL LETTER US
return true;
- if (codePoint >= 0x10d00 && codePoint <= 0x10d23)
+ if (codePoint >= 0x10D00 && codePoint <= 0x10D23) // HANIFI ROHINGYA LETTER A .. HANIFI ROHINGYA MARK NA KHONNA
return true;
- if (codePoint >= 0x10f00 && codePoint <= 0x10f1c)
+ if (codePoint >= 0x10F00 && codePoint <= 0x10F1C) // OLD SOGDIAN LETTER ALEPH .. OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
return true;
- if (codePoint >= 0x10f27 && codePoint <= 0x10f27)
+ if (codePoint >= 0x10F27 && codePoint <= 0x10F27) // OLD SOGDIAN LIGATURE AYIN-DALETH .. OLD SOGDIAN LIGATURE AYIN-DALETH
return true;
- if (codePoint >= 0x10f30 && codePoint <= 0x10f45)
+ if (codePoint >= 0x10F30 && codePoint <= 0x10F45) // SOGDIAN LETTER ALEPH .. SOGDIAN INDEPENDENT SHIN
return true;
- if (codePoint >= 0x11003 && codePoint <= 0x11037)
+ if (codePoint >= 0x11003 && codePoint <= 0x11037) // BRAHMI SIGN JIHVAMULIYA .. BRAHMI LETTER OLD TAMIL NNNA
return true;
- if (codePoint >= 0x11083 && codePoint <= 0x110af)
+ if (codePoint >= 0x11083 && codePoint <= 0x110AF) // KAITHI LETTER A .. KAITHI LETTER HA
return true;
- if (codePoint >= 0x110d0 && codePoint <= 0x110e8)
+ if (codePoint >= 0x110D0 && codePoint <= 0x110E8) // SORA SOMPENG LETTER SAH .. SORA SOMPENG LETTER MAE
return true;
- if (codePoint >= 0x11103 && codePoint <= 0x11126)
+ if (codePoint >= 0x11103 && codePoint <= 0x11126) // CHAKMA LETTER AA .. CHAKMA LETTER HAA
return true;
- if (codePoint >= 0x11144 && codePoint <= 0x11144)
+ if (codePoint >= 0x11144 && codePoint <= 0x11144) // CHAKMA LETTER LHAA .. CHAKMA LETTER LHAA
return true;
- if (codePoint >= 0x11150 && codePoint <= 0x11172)
+ if (codePoint >= 0x11150 && codePoint <= 0x11172) // MAHAJANI LETTER A .. MAHAJANI LETTER RRA
return true;
- if (codePoint >= 0x11176 && codePoint <= 0x11176)
+ if (codePoint >= 0x11176 && codePoint <= 0x11176) // MAHAJANI LIGATURE SHRI .. MAHAJANI LIGATURE SHRI
return true;
- if (codePoint >= 0x11183 && codePoint <= 0x111b2)
+ if (codePoint >= 0x11183 && codePoint <= 0x111B2) // SHARADA LETTER A .. SHARADA LETTER HA
return true;
- if (codePoint >= 0x111c1 && codePoint <= 0x111c4)
+ if (codePoint >= 0x111C1 && codePoint <= 0x111C4) // SHARADA SIGN AVAGRAHA .. SHARADA OM
return true;
- if (codePoint >= 0x111da && codePoint <= 0x111da)
+ if (codePoint >= 0x111DA && codePoint <= 0x111DA) // SHARADA EKAM .. SHARADA EKAM
return true;
- if (codePoint >= 0x111dc && codePoint <= 0x111dc)
+ if (codePoint >= 0x111DC && codePoint <= 0x111DC) // SHARADA HEADSTROKE .. SHARADA HEADSTROKE
return true;
- if (codePoint >= 0x11200 && codePoint <= 0x11211)
+ if (codePoint >= 0x11200 && codePoint <= 0x11211) // KHOJKI LETTER A .. KHOJKI LETTER JJA
return true;
- if (codePoint >= 0x11213 && codePoint <= 0x1122b)
+ if (codePoint >= 0x11213 && codePoint <= 0x1122B) // KHOJKI LETTER NYA .. KHOJKI LETTER LLA
return true;
- if (codePoint >= 0x11280 && codePoint <= 0x11286)
+ if (codePoint >= 0x11280 && codePoint <= 0x11286) // MULTANI LETTER A .. MULTANI LETTER GA
return true;
- if (codePoint >= 0x11288 && codePoint <= 0x11288)
+ if (codePoint >= 0x11288 && codePoint <= 0x11288) // MULTANI LETTER GHA .. MULTANI LETTER GHA
return true;
- if (codePoint >= 0x1128a && codePoint <= 0x1128d)
+ if (codePoint >= 0x1128A && codePoint <= 0x1128D) // MULTANI LETTER CA .. MULTANI LETTER JJA
return true;
- if (codePoint >= 0x1128f && codePoint <= 0x1129d)
+ if (codePoint >= 0x1128F && codePoint <= 0x1129D) // MULTANI LETTER NYA .. MULTANI LETTER BA
return true;
- if (codePoint >= 0x1129f && codePoint <= 0x112a8)
+ if (codePoint >= 0x1129F && codePoint <= 0x112A8) // MULTANI LETTER BHA .. MULTANI LETTER RHA
return true;
- if (codePoint >= 0x112b0 && codePoint <= 0x112de)
+ if (codePoint >= 0x112B0 && codePoint <= 0x112DE) // KHUDAWADI LETTER A .. KHUDAWADI LETTER HA
return true;
- if (codePoint >= 0x11305 && codePoint <= 0x1130c)
+ if (codePoint >= 0x11305 && codePoint <= 0x1130C) // GRANTHA LETTER A .. GRANTHA LETTER VOCALIC L
return true;
- if (codePoint >= 0x1130f && codePoint <= 0x11310)
+ if (codePoint >= 0x1130F && codePoint <= 0x11310) // GRANTHA LETTER EE .. GRANTHA LETTER AI
return true;
- if (codePoint >= 0x11313 && codePoint <= 0x11328)
+ if (codePoint >= 0x11313 && codePoint <= 0x11328) // GRANTHA LETTER OO .. GRANTHA LETTER NA
return true;
- if (codePoint >= 0x1132a && codePoint <= 0x11330)
+ if (codePoint >= 0x1132A && codePoint <= 0x11330) // GRANTHA LETTER PA .. GRANTHA LETTER RA
return true;
- if (codePoint >= 0x11332 && codePoint <= 0x11333)
+ if (codePoint >= 0x11332 && codePoint <= 0x11333) // GRANTHA LETTER LA .. GRANTHA LETTER LLA
return true;
- if (codePoint >= 0x11335 && codePoint <= 0x11339)
+ if (codePoint >= 0x11335 && codePoint <= 0x11339) // GRANTHA LETTER VA .. GRANTHA LETTER HA
return true;
- if (codePoint >= 0x1133d && codePoint <= 0x1133d)
+ if (codePoint >= 0x1133D && codePoint <= 0x1133D) // GRANTHA SIGN AVAGRAHA .. GRANTHA SIGN AVAGRAHA
return true;
- if (codePoint >= 0x11350 && codePoint <= 0x11350)
+ if (codePoint >= 0x11350 && codePoint <= 0x11350) // GRANTHA OM .. GRANTHA OM
return true;
- if (codePoint >= 0x1135d && codePoint <= 0x11361)
+ if (codePoint >= 0x1135D && codePoint <= 0x11361) // GRANTHA SIGN PLUTA .. GRANTHA LETTER VOCALIC LL
return true;
- if (codePoint >= 0x11400 && codePoint <= 0x11434)
+ if (codePoint >= 0x11400 && codePoint <= 0x11434) // NEWA LETTER A .. NEWA LETTER HA
return true;
- if (codePoint >= 0x11447 && codePoint <= 0x1144a)
+ if (codePoint >= 0x11447 && codePoint <= 0x1144A) // NEWA SIGN AVAGRAHA .. NEWA SIDDHI
return true;
- if (codePoint >= 0x11480 && codePoint <= 0x114af)
+ if (codePoint >= 0x11480 && codePoint <= 0x114AF) // TIRHUTA ANJI .. TIRHUTA LETTER HA
return true;
- if (codePoint >= 0x114c4 && codePoint <= 0x114c5)
+ if (codePoint >= 0x114C4 && codePoint <= 0x114C5) // TIRHUTA SIGN AVAGRAHA .. TIRHUTA GVANG
return true;
- if (codePoint >= 0x114c7 && codePoint <= 0x114c7)
+ if (codePoint >= 0x114C7 && codePoint <= 0x114C7) // TIRHUTA OM .. TIRHUTA OM
return true;
- if (codePoint >= 0x11580 && codePoint <= 0x115ae)
+ if (codePoint >= 0x11580 && codePoint <= 0x115AE) // SIDDHAM LETTER A .. SIDDHAM LETTER HA
return true;
- if (codePoint >= 0x115d8 && codePoint <= 0x115db)
+ if (codePoint >= 0x115D8 && codePoint <= 0x115DB) // SIDDHAM LETTER THREE-CIRCLE ALTERNATE I .. SIDDHAM LETTER ALTERNATE U
return true;
- if (codePoint >= 0x11600 && codePoint <= 0x1162f)
+ if (codePoint >= 0x11600 && codePoint <= 0x1162F) // MODI LETTER A .. MODI LETTER LLA
return true;
- if (codePoint >= 0x11644 && codePoint <= 0x11644)
+ if (codePoint >= 0x11644 && codePoint <= 0x11644) // MODI SIGN HUVA .. MODI SIGN HUVA
return true;
- if (codePoint >= 0x11680 && codePoint <= 0x116aa)
+ if (codePoint >= 0x11680 && codePoint <= 0x116AA) // TAKRI LETTER A .. TAKRI LETTER RRA
return true;
- if (codePoint >= 0x11700 && codePoint <= 0x1171a)
+ if (codePoint >= 0x11700 && codePoint <= 0x1171A) // AHOM LETTER KA .. AHOM LETTER ALTERNATE BA
return true;
- if (codePoint >= 0x11800 && codePoint <= 0x1182b)
+ if (codePoint >= 0x11800 && codePoint <= 0x1182B) // DOGRA LETTER A .. DOGRA LETTER RRA
return true;
- if (codePoint >= 0x118a0 && codePoint <= 0x118df)
+ if (codePoint >= 0x118A0 && codePoint <= 0x118DF) // WARANG CITI CAPITAL LETTER NGAA .. WARANG CITI SMALL LETTER VIYO
return true;
- if (codePoint >= 0x118ff && codePoint <= 0x118ff)
+ if (codePoint >= 0x118FF && codePoint <= 0x118FF) // WARANG CITI OM .. WARANG CITI OM
return true;
- if (codePoint >= 0x11a00 && codePoint <= 0x11a00)
+ if (codePoint >= 0x11A00 && codePoint <= 0x11A00) // ZANABAZAR SQUARE LETTER A .. ZANABAZAR SQUARE LETTER A
return true;
- if (codePoint >= 0x11a0b && codePoint <= 0x11a32)
+ if (codePoint >= 0x11A0B && codePoint <= 0x11A32) // ZANABAZAR SQUARE LETTER KA .. ZANABAZAR SQUARE LETTER KSSA
return true;
- if (codePoint >= 0x11a3a && codePoint <= 0x11a3a)
+ if (codePoint >= 0x11A3A && codePoint <= 0x11A3A) // ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA .. ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
return true;
- if (codePoint >= 0x11a50 && codePoint <= 0x11a50)
+ if (codePoint >= 0x11A50 && codePoint <= 0x11A50) // SOYOMBO LETTER A .. SOYOMBO LETTER A
return true;
- if (codePoint >= 0x11a5c && codePoint <= 0x11a83)
+ if (codePoint >= 0x11A5C && codePoint <= 0x11A83) // SOYOMBO LETTER KA .. SOYOMBO LETTER KSSA
return true;
- if (codePoint >= 0x11a86 && codePoint <= 0x11a89)
+ if (codePoint >= 0x11A86 && codePoint <= 0x11A89) // SOYOMBO CLUSTER-INITIAL LETTER RA .. SOYOMBO CLUSTER-INITIAL LETTER SA
return true;
- if (codePoint >= 0x11a9d && codePoint <= 0x11a9d)
+ if (codePoint >= 0x11A9D && codePoint <= 0x11A9D) // SOYOMBO MARK PLUTA .. SOYOMBO MARK PLUTA
return true;
- if (codePoint >= 0x11ac0 && codePoint <= 0x11af8)
+ if (codePoint >= 0x11AC0 && codePoint <= 0x11AF8) // PAU CIN HAU LETTER PA .. PAU CIN HAU GLOTTAL STOP FINAL
return true;
- if (codePoint >= 0x11c00 && codePoint <= 0x11c08)
+ if (codePoint >= 0x11C00 && codePoint <= 0x11C08) // BHAIKSUKI LETTER A .. BHAIKSUKI LETTER VOCALIC L
return true;
- if (codePoint >= 0x11c0a && codePoint <= 0x11c2e)
+ if (codePoint >= 0x11C0A && codePoint <= 0x11C2E) // BHAIKSUKI LETTER E .. BHAIKSUKI LETTER HA
return true;
- if (codePoint >= 0x11c40 && codePoint <= 0x11c40)
+ if (codePoint >= 0x11C40 && codePoint <= 0x11C40) // BHAIKSUKI SIGN AVAGRAHA .. BHAIKSUKI SIGN AVAGRAHA
return true;
- if (codePoint >= 0x11c72 && codePoint <= 0x11c8f)
+ if (codePoint >= 0x11C72 && codePoint <= 0x11C8F) // MARCHEN LETTER KA .. MARCHEN LETTER A
return true;
- if (codePoint >= 0x11d00 && codePoint <= 0x11d06)
+ if (codePoint >= 0x11D00 && codePoint <= 0x11D06) // MASARAM GONDI LETTER A .. MASARAM GONDI LETTER E
return true;
- if (codePoint >= 0x11d08 && codePoint <= 0x11d09)
+ if (codePoint >= 0x11D08 && codePoint <= 0x11D09) // MASARAM GONDI LETTER AI .. MASARAM GONDI LETTER O
return true;
- if (codePoint >= 0x11d0b && codePoint <= 0x11d30)
+ if (codePoint >= 0x11D0B && codePoint <= 0x11D30) // MASARAM GONDI LETTER AU .. MASARAM GONDI LETTER TRA
return true;
- if (codePoint >= 0x11d46 && codePoint <= 0x11d46)
+ if (codePoint >= 0x11D46 && codePoint <= 0x11D46) // MASARAM GONDI REPHA .. MASARAM GONDI REPHA
return true;
- if (codePoint >= 0x11d60 && codePoint <= 0x11d65)
+ if (codePoint >= 0x11D60 && codePoint <= 0x11D65) // GUNJALA GONDI LETTER A .. GUNJALA GONDI LETTER UU
return true;
- if (codePoint >= 0x11d67 && codePoint <= 0x11d68)
+ if (codePoint >= 0x11D67 && codePoint <= 0x11D68) // GUNJALA GONDI LETTER EE .. GUNJALA GONDI LETTER AI
return true;
- if (codePoint >= 0x11d6a && codePoint <= 0x11d89)
+ if (codePoint >= 0x11D6A && codePoint <= 0x11D89) // GUNJALA GONDI LETTER OO .. GUNJALA GONDI LETTER SA
return true;
- if (codePoint >= 0x11d98 && codePoint <= 0x11d98)
+ if (codePoint >= 0x11D98 && codePoint <= 0x11D98) // GUNJALA GONDI OM .. GUNJALA GONDI OM
return true;
- if (codePoint >= 0x11ee0 && codePoint <= 0x11ef2)
+ if (codePoint >= 0x11EE0 && codePoint <= 0x11EF2) // MAKASAR LETTER KA .. MAKASAR ANGKA
return true;
- if (codePoint >= 0x12000 && codePoint <= 0x12399)
+ if (codePoint >= 0x12000 && codePoint <= 0x12399) // CUNEIFORM SIGN A .. CUNEIFORM SIGN U U
return true;
- if (codePoint >= 0x12400 && codePoint <= 0x1246e)
+ if (codePoint >= 0x12400 && codePoint <= 0x1246E) // CUNEIFORM NUMERIC SIGN TWO ASH .. CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
return true;
- if (codePoint >= 0x12480 && codePoint <= 0x12543)
+ if (codePoint >= 0x12480 && codePoint <= 0x12543) // CUNEIFORM SIGN AB TIMES NUN TENU .. CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
return true;
- if (codePoint >= 0x13000 && codePoint <= 0x1342e)
+ if (codePoint >= 0x13000 && codePoint <= 0x1342E) // EGYPTIAN HIEROGLYPH A001 .. EGYPTIAN HIEROGLYPH AA032
return true;
- if (codePoint >= 0x14400 && codePoint <= 0x14646)
+ if (codePoint >= 0x14400 && codePoint <= 0x14646) // ANATOLIAN HIEROGLYPH A001 .. ANATOLIAN HIEROGLYPH A530
return true;
- if (codePoint >= 0x16800 && codePoint <= 0x16a38)
+ if (codePoint >= 0x16800 && codePoint <= 0x16A38) // BAMUM LETTER PHASE-A NGKUE MFON .. BAMUM LETTER PHASE-F VUEQ
return true;
- if (codePoint >= 0x16a40 && codePoint <= 0x16a5e)
+ if (codePoint >= 0x16A40 && codePoint <= 0x16A5E) // MRO LETTER TA .. MRO LETTER TEK
return true;
- if (codePoint >= 0x16ad0 && codePoint <= 0x16aed)
+ if (codePoint >= 0x16AD0 && codePoint <= 0x16AED) // BASSA VAH LETTER ENNI .. BASSA VAH LETTER I
return true;
- if (codePoint >= 0x16b00 && codePoint <= 0x16b2f)
+ if (codePoint >= 0x16B00 && codePoint <= 0x16B2F) // PAHAWH HMONG VOWEL KEEB .. PAHAWH HMONG CONSONANT CAU
return true;
- if (codePoint >= 0x16b40 && codePoint <= 0x16b43)
+ if (codePoint >= 0x16B40 && codePoint <= 0x16B43) // PAHAWH HMONG SIGN VOS SEEV .. PAHAWH HMONG SIGN IB YAM
return true;
- if (codePoint >= 0x16b63 && codePoint <= 0x16b77)
+ if (codePoint >= 0x16B63 && codePoint <= 0x16B77) // PAHAWH HMONG SIGN VOS LUB .. PAHAWH HMONG SIGN CIM NRES TOS
return true;
- if (codePoint >= 0x16b7d && codePoint <= 0x16b8f)
+ if (codePoint >= 0x16B7D && codePoint <= 0x16B8F) // PAHAWH HMONG CLAN SIGN TSHEEJ .. PAHAWH HMONG CLAN SIGN VWJ
return true;
- if (codePoint >= 0x16e40 && codePoint <= 0x16e7f)
+ if (codePoint >= 0x16E40 && codePoint <= 0x16E7F) // MEDEFAIDRIN CAPITAL LETTER M .. MEDEFAIDRIN SMALL LETTER Y
return true;
- if (codePoint >= 0x16f00 && codePoint <= 0x16f44)
+ if (codePoint >= 0x16F00 && codePoint <= 0x16F44) // MIAO LETTER PA .. MIAO LETTER HHA
return true;
- if (codePoint >= 0x16f50 && codePoint <= 0x16f50)
+ if (codePoint >= 0x16F50 && codePoint <= 0x16F50) // MIAO LETTER NASALIZATION .. MIAO LETTER NASALIZATION
return true;
- if (codePoint >= 0x16f93 && codePoint <= 0x16f9f)
+ if (codePoint >= 0x16F93 && codePoint <= 0x16F9F) // MIAO LETTER TONE-2 .. MIAO LETTER REFORMED TONE-8
return true;
- if (codePoint >= 0x16fe0 && codePoint <= 0x16fe1)
+ if (codePoint >= 0x16FE0 && codePoint <= 0x16FE1) // TANGUT ITERATION MARK .. NUSHU ITERATION MARK
return true;
- if (codePoint >= 0x17000 && codePoint <= 0x187f1)
+ if (codePoint >= 0x17000 && codePoint <= 0x187F1) // Tangut Ideograph .. Tangut Ideograph
return true;
- if (codePoint >= 0x18800 && codePoint <= 0x18af2)
+ if (codePoint >= 0x18800 && codePoint <= 0x18AF2) // TANGUT COMPONENT-001 .. TANGUT COMPONENT-755
return true;
- if (codePoint >= 0x1b000 && codePoint <= 0x1b11e)
+ if (codePoint >= 0x1B000 && codePoint <= 0x1B11E) // KATAKANA LETTER ARCHAIC E .. HENTAIGANA LETTER N-MU-MO-2
return true;
- if (codePoint >= 0x1b170 && codePoint <= 0x1b2fb)
+ if (codePoint >= 0x1B170 && codePoint <= 0x1B2FB) // NUSHU CHARACTER-1B170 .. NUSHU CHARACTER-1B2FB
return true;
- if (codePoint >= 0x1bc00 && codePoint <= 0x1bc6a)
+ if (codePoint >= 0x1BC00 && codePoint <= 0x1BC6A) // DUPLOYAN LETTER H .. DUPLOYAN LETTER VOCALIC M
return true;
- if (codePoint >= 0x1bc70 && codePoint <= 0x1bc7c)
+ if (codePoint >= 0x1BC70 && codePoint <= 0x1BC7C) // DUPLOYAN AFFIX LEFT HORIZONTAL SECANT .. DUPLOYAN AFFIX ATTACHED TANGENT HOOK
return true;
- if (codePoint >= 0x1bc80 && codePoint <= 0x1bc88)
+ if (codePoint >= 0x1BC80 && codePoint <= 0x1BC88) // DUPLOYAN AFFIX HIGH ACUTE .. DUPLOYAN AFFIX HIGH VERTICAL
return true;
- if (codePoint >= 0x1bc90 && codePoint <= 0x1bc99)
+ if (codePoint >= 0x1BC90 && codePoint <= 0x1BC99) // DUPLOYAN AFFIX LOW ACUTE .. DUPLOYAN AFFIX LOW ARROW
return true;
- if (codePoint >= 0x1d400 && codePoint <= 0x1d454)
+ if (codePoint >= 0x1D400 && codePoint <= 0x1D454) // MATHEMATICAL BOLD CAPITAL A .. MATHEMATICAL ITALIC SMALL G
return true;
- if (codePoint >= 0x1d456 && codePoint <= 0x1d49c)
+ if (codePoint >= 0x1D456 && codePoint <= 0x1D49C) // MATHEMATICAL ITALIC SMALL I .. MATHEMATICAL SCRIPT CAPITAL A
return true;
- if (codePoint >= 0x1d49e && codePoint <= 0x1d49f)
+ if (codePoint >= 0x1D49E && codePoint <= 0x1D49F) // MATHEMATICAL SCRIPT CAPITAL C .. MATHEMATICAL SCRIPT CAPITAL D
return true;
- if (codePoint >= 0x1d4a2 && codePoint <= 0x1d4a2)
+ if (codePoint >= 0x1D4A2 && codePoint <= 0x1D4A2) // MATHEMATICAL SCRIPT CAPITAL G .. MATHEMATICAL SCRIPT CAPITAL G
return true;
- if (codePoint >= 0x1d4a5 && codePoint <= 0x1d4a6)
+ if (codePoint >= 0x1D4A5 && codePoint <= 0x1D4A6) // MATHEMATICAL SCRIPT CAPITAL J .. MATHEMATICAL SCRIPT CAPITAL K
return true;
- if (codePoint >= 0x1d4a9 && codePoint <= 0x1d4ac)
+ if (codePoint >= 0x1D4A9 && codePoint <= 0x1D4AC) // MATHEMATICAL SCRIPT CAPITAL N .. MATHEMATICAL SCRIPT CAPITAL Q
return true;
- if (codePoint >= 0x1d4ae && codePoint <= 0x1d4b9)
+ if (codePoint >= 0x1D4AE && codePoint <= 0x1D4B9) // MATHEMATICAL SCRIPT CAPITAL S .. MATHEMATICAL SCRIPT SMALL D
return true;
- if (codePoint >= 0x1d4bb && codePoint <= 0x1d4bb)
+ if (codePoint >= 0x1D4BB && codePoint <= 0x1D4BB) // MATHEMATICAL SCRIPT SMALL F .. MATHEMATICAL SCRIPT SMALL F
return true;
- if (codePoint >= 0x1d4bd && codePoint <= 0x1d4c3)
+ if (codePoint >= 0x1D4BD && codePoint <= 0x1D4C3) // MATHEMATICAL SCRIPT SMALL H .. MATHEMATICAL SCRIPT SMALL N
return true;
- if (codePoint >= 0x1d4c5 && codePoint <= 0x1d505)
+ if (codePoint >= 0x1D4C5 && codePoint <= 0x1D505) // MATHEMATICAL SCRIPT SMALL P .. MATHEMATICAL FRAKTUR CAPITAL B
return true;
- if (codePoint >= 0x1d507 && codePoint <= 0x1d50a)
+ if (codePoint >= 0x1D507 && codePoint <= 0x1D50A) // MATHEMATICAL FRAKTUR CAPITAL D .. MATHEMATICAL FRAKTUR CAPITAL G
return true;
- if (codePoint >= 0x1d50d && codePoint <= 0x1d514)
+ if (codePoint >= 0x1D50D && codePoint <= 0x1D514) // MATHEMATICAL FRAKTUR CAPITAL J .. MATHEMATICAL FRAKTUR CAPITAL Q
return true;
- if (codePoint >= 0x1d516 && codePoint <= 0x1d51c)
+ if (codePoint >= 0x1D516 && codePoint <= 0x1D51C) // MATHEMATICAL FRAKTUR CAPITAL S .. MATHEMATICAL FRAKTUR CAPITAL Y
return true;
- if (codePoint >= 0x1d51e && codePoint <= 0x1d539)
+ if (codePoint >= 0x1D51E && codePoint <= 0x1D539) // MATHEMATICAL FRAKTUR SMALL A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
return true;
- if (codePoint >= 0x1d53b && codePoint <= 0x1d53e)
+ if (codePoint >= 0x1D53B && codePoint <= 0x1D53E) // MATHEMATICAL DOUBLE-STRUCK CAPITAL D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
return true;
- if (codePoint >= 0x1d540 && codePoint <= 0x1d544)
+ if (codePoint >= 0x1D540 && codePoint <= 0x1D544) // MATHEMATICAL DOUBLE-STRUCK CAPITAL I .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
return true;
- if (codePoint >= 0x1d546 && codePoint <= 0x1d546)
+ if (codePoint >= 0x1D546 && codePoint <= 0x1D546) // MATHEMATICAL DOUBLE-STRUCK CAPITAL O .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
return true;
- if (codePoint >= 0x1d54a && codePoint <= 0x1d550)
+ if (codePoint >= 0x1D54A && codePoint <= 0x1D550) // MATHEMATICAL DOUBLE-STRUCK CAPITAL S .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
return true;
- if (codePoint >= 0x1d552 && codePoint <= 0x1d6a5)
+ if (codePoint >= 0x1D552 && codePoint <= 0x1D6A5) // MATHEMATICAL DOUBLE-STRUCK SMALL A .. MATHEMATICAL ITALIC SMALL DOTLESS J
return true;
- if (codePoint >= 0x1d6a8 && codePoint <= 0x1d6c0)
+ if (codePoint >= 0x1D6A8 && codePoint <= 0x1D6C0) // MATHEMATICAL BOLD CAPITAL ALPHA .. MATHEMATICAL BOLD CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d6c2 && codePoint <= 0x1d6da)
+ if (codePoint >= 0x1D6C2 && codePoint <= 0x1D6DA) // MATHEMATICAL BOLD SMALL ALPHA .. MATHEMATICAL BOLD SMALL OMEGA
return true;
- if (codePoint >= 0x1d6dc && codePoint <= 0x1d6fa)
+ if (codePoint >= 0x1D6DC && codePoint <= 0x1D6FA) // MATHEMATICAL BOLD EPSILON SYMBOL .. MATHEMATICAL ITALIC CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d6fc && codePoint <= 0x1d714)
+ if (codePoint >= 0x1D6FC && codePoint <= 0x1D714) // MATHEMATICAL ITALIC SMALL ALPHA .. MATHEMATICAL ITALIC SMALL OMEGA
return true;
- if (codePoint >= 0x1d716 && codePoint <= 0x1d734)
+ if (codePoint >= 0x1D716 && codePoint <= 0x1D734) // MATHEMATICAL ITALIC EPSILON SYMBOL .. MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d736 && codePoint <= 0x1d74e)
+ if (codePoint >= 0x1D736 && codePoint <= 0x1D74E) // MATHEMATICAL BOLD ITALIC SMALL ALPHA .. MATHEMATICAL BOLD ITALIC SMALL OMEGA
return true;
- if (codePoint >= 0x1d750 && codePoint <= 0x1d76e)
+ if (codePoint >= 0x1D750 && codePoint <= 0x1D76E) // MATHEMATICAL BOLD ITALIC EPSILON SYMBOL .. MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d770 && codePoint <= 0x1d788)
+ if (codePoint >= 0x1D770 && codePoint <= 0x1D788) // MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA .. MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
return true;
- if (codePoint >= 0x1d78a && codePoint <= 0x1d7a8)
+ if (codePoint >= 0x1D78A && codePoint <= 0x1D7A8) // MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL .. MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d7aa && codePoint <= 0x1d7c2)
+ if (codePoint >= 0x1D7AA && codePoint <= 0x1D7C2) // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA .. MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
return true;
- if (codePoint >= 0x1d7c4 && codePoint <= 0x1d7cb)
+ if (codePoint >= 0x1D7C4 && codePoint <= 0x1D7CB) // MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL .. MATHEMATICAL BOLD SMALL DIGAMMA
return true;
- if (codePoint >= 0x1e800 && codePoint <= 0x1e8c4)
+ if (codePoint >= 0x1E800 && codePoint <= 0x1E8C4) // MENDE KIKAKUI SYLLABLE M001 KI .. MENDE KIKAKUI SYLLABLE M060 NYON
return true;
- if (codePoint >= 0x1e900 && codePoint <= 0x1e943)
+ if (codePoint >= 0x1E900 && codePoint <= 0x1E943) // ADLAM CAPITAL LETTER ALIF .. ADLAM SMALL LETTER SHA
return true;
- if (codePoint >= 0x1ee00 && codePoint <= 0x1ee03)
+ if (codePoint >= 0x1EE00 && codePoint <= 0x1EE03) // ARABIC MATHEMATICAL ALEF .. ARABIC MATHEMATICAL DAL
return true;
- if (codePoint >= 0x1ee05 && codePoint <= 0x1ee1f)
+ if (codePoint >= 0x1EE05 && codePoint <= 0x1EE1F) // ARABIC MATHEMATICAL WAW .. ARABIC MATHEMATICAL DOTLESS QAF
return true;
- if (codePoint >= 0x1ee21 && codePoint <= 0x1ee22)
+ if (codePoint >= 0x1EE21 && codePoint <= 0x1EE22) // ARABIC MATHEMATICAL INITIAL BEH .. ARABIC MATHEMATICAL INITIAL JEEM
return true;
- if (codePoint >= 0x1ee24 && codePoint <= 0x1ee24)
+ if (codePoint >= 0x1EE24 && codePoint <= 0x1EE24) // ARABIC MATHEMATICAL INITIAL HEH .. ARABIC MATHEMATICAL INITIAL HEH
return true;
- if (codePoint >= 0x1ee27 && codePoint <= 0x1ee27)
+ if (codePoint >= 0x1EE27 && codePoint <= 0x1EE27) // ARABIC MATHEMATICAL INITIAL HAH .. ARABIC MATHEMATICAL INITIAL HAH
return true;
- if (codePoint >= 0x1ee29 && codePoint <= 0x1ee32)
+ if (codePoint >= 0x1EE29 && codePoint <= 0x1EE32) // ARABIC MATHEMATICAL INITIAL YEH .. ARABIC MATHEMATICAL INITIAL QAF
return true;
- if (codePoint >= 0x1ee34 && codePoint <= 0x1ee37)
+ if (codePoint >= 0x1EE34 && codePoint <= 0x1EE37) // ARABIC MATHEMATICAL INITIAL SHEEN .. ARABIC MATHEMATICAL INITIAL KHAH
return true;
- if (codePoint >= 0x1ee39 && codePoint <= 0x1ee39)
+ if (codePoint >= 0x1EE39 && codePoint <= 0x1EE39) // ARABIC MATHEMATICAL INITIAL DAD .. ARABIC MATHEMATICAL INITIAL DAD
return true;
- if (codePoint >= 0x1ee3b && codePoint <= 0x1ee3b)
+ if (codePoint >= 0x1EE3B && codePoint <= 0x1EE3B) // ARABIC MATHEMATICAL INITIAL GHAIN .. ARABIC MATHEMATICAL INITIAL GHAIN
return true;
- if (codePoint >= 0x1ee42 && codePoint <= 0x1ee42)
+ if (codePoint >= 0x1EE42 && codePoint <= 0x1EE42) // ARABIC MATHEMATICAL TAILED JEEM .. ARABIC MATHEMATICAL TAILED JEEM
return true;
- if (codePoint >= 0x1ee47 && codePoint <= 0x1ee47)
+ if (codePoint >= 0x1EE47 && codePoint <= 0x1EE47) // ARABIC MATHEMATICAL TAILED HAH .. ARABIC MATHEMATICAL TAILED HAH
return true;
- if (codePoint >= 0x1ee49 && codePoint <= 0x1ee49)
+ if (codePoint >= 0x1EE49 && codePoint <= 0x1EE49) // ARABIC MATHEMATICAL TAILED YEH .. ARABIC MATHEMATICAL TAILED YEH
return true;
- if (codePoint >= 0x1ee4b && codePoint <= 0x1ee4b)
+ if (codePoint >= 0x1EE4B && codePoint <= 0x1EE4B) // ARABIC MATHEMATICAL TAILED LAM .. ARABIC MATHEMATICAL TAILED LAM
return true;
- if (codePoint >= 0x1ee4d && codePoint <= 0x1ee4f)
+ if (codePoint >= 0x1EE4D && codePoint <= 0x1EE4F) // ARABIC MATHEMATICAL TAILED NOON .. ARABIC MATHEMATICAL TAILED AIN
return true;
- if (codePoint >= 0x1ee51 && codePoint <= 0x1ee52)
+ if (codePoint >= 0x1EE51 && codePoint <= 0x1EE52) // ARABIC MATHEMATICAL TAILED SAD .. ARABIC MATHEMATICAL TAILED QAF
return true;
- if (codePoint >= 0x1ee54 && codePoint <= 0x1ee54)
+ if (codePoint >= 0x1EE54 && codePoint <= 0x1EE54) // ARABIC MATHEMATICAL TAILED SHEEN .. ARABIC MATHEMATICAL TAILED SHEEN
return true;
- if (codePoint >= 0x1ee57 && codePoint <= 0x1ee57)
+ if (codePoint >= 0x1EE57 && codePoint <= 0x1EE57) // ARABIC MATHEMATICAL TAILED KHAH .. ARABIC MATHEMATICAL TAILED KHAH
return true;
- if (codePoint >= 0x1ee59 && codePoint <= 0x1ee59)
+ if (codePoint >= 0x1EE59 && codePoint <= 0x1EE59) // ARABIC MATHEMATICAL TAILED DAD .. ARABIC MATHEMATICAL TAILED DAD
return true;
- if (codePoint >= 0x1ee5b && codePoint <= 0x1ee5b)
+ if (codePoint >= 0x1EE5B && codePoint <= 0x1EE5B) // ARABIC MATHEMATICAL TAILED GHAIN .. ARABIC MATHEMATICAL TAILED GHAIN
return true;
- if (codePoint >= 0x1ee5d && codePoint <= 0x1ee5d)
+ if (codePoint >= 0x1EE5D && codePoint <= 0x1EE5D) // ARABIC MATHEMATICAL TAILED DOTLESS NOON .. ARABIC MATHEMATICAL TAILED DOTLESS NOON
return true;
- if (codePoint >= 0x1ee5f && codePoint <= 0x1ee5f)
+ if (codePoint >= 0x1EE5F && codePoint <= 0x1EE5F) // ARABIC MATHEMATICAL TAILED DOTLESS QAF .. ARABIC MATHEMATICAL TAILED DOTLESS QAF
return true;
- if (codePoint >= 0x1ee61 && codePoint <= 0x1ee62)
+ if (codePoint >= 0x1EE61 && codePoint <= 0x1EE62) // ARABIC MATHEMATICAL STRETCHED BEH .. ARABIC MATHEMATICAL STRETCHED JEEM
return true;
- if (codePoint >= 0x1ee64 && codePoint <= 0x1ee64)
+ if (codePoint >= 0x1EE64 && codePoint <= 0x1EE64) // ARABIC MATHEMATICAL STRETCHED HEH .. ARABIC MATHEMATICAL STRETCHED HEH
return true;
- if (codePoint >= 0x1ee67 && codePoint <= 0x1ee6a)
+ if (codePoint >= 0x1EE67 && codePoint <= 0x1EE6A) // ARABIC MATHEMATICAL STRETCHED HAH .. ARABIC MATHEMATICAL STRETCHED KAF
return true;
- if (codePoint >= 0x1ee6c && codePoint <= 0x1ee72)
+ if (codePoint >= 0x1EE6C && codePoint <= 0x1EE72) // ARABIC MATHEMATICAL STRETCHED MEEM .. ARABIC MATHEMATICAL STRETCHED QAF
return true;
- if (codePoint >= 0x1ee74 && codePoint <= 0x1ee77)
+ if (codePoint >= 0x1EE74 && codePoint <= 0x1EE77) // ARABIC MATHEMATICAL STRETCHED SHEEN .. ARABIC MATHEMATICAL STRETCHED KHAH
return true;
- if (codePoint >= 0x1ee79 && codePoint <= 0x1ee7c)
+ if (codePoint >= 0x1EE79 && codePoint <= 0x1EE7C) // ARABIC MATHEMATICAL STRETCHED DAD .. ARABIC MATHEMATICAL STRETCHED DOTLESS BEH
return true;
- if (codePoint >= 0x1ee7e && codePoint <= 0x1ee7e)
+ if (codePoint >= 0x1EE7E && codePoint <= 0x1EE7E) // ARABIC MATHEMATICAL STRETCHED DOTLESS FEH .. ARABIC MATHEMATICAL STRETCHED DOTLESS FEH
return true;
- if (codePoint >= 0x1ee80 && codePoint <= 0x1ee89)
+ if (codePoint >= 0x1EE80 && codePoint <= 0x1EE89) // ARABIC MATHEMATICAL LOOPED ALEF .. ARABIC MATHEMATICAL LOOPED YEH
return true;
- if (codePoint >= 0x1ee8b && codePoint <= 0x1ee9b)
+ if (codePoint >= 0x1EE8B && codePoint <= 0x1EE9B) // ARABIC MATHEMATICAL LOOPED LAM .. ARABIC MATHEMATICAL LOOPED GHAIN
return true;
- if (codePoint >= 0x1eea1 && codePoint <= 0x1eea3)
+ if (codePoint >= 0x1EEA1 && codePoint <= 0x1EEA3) // ARABIC MATHEMATICAL DOUBLE-STRUCK BEH .. ARABIC MATHEMATICAL DOUBLE-STRUCK DAL
return true;
- if (codePoint >= 0x1eea5 && codePoint <= 0x1eea9)
+ if (codePoint >= 0x1EEA5 && codePoint <= 0x1EEA9) // ARABIC MATHEMATICAL DOUBLE-STRUCK WAW .. ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
return true;
- if (codePoint >= 0x1eeab && codePoint <= 0x1eebb)
+ if (codePoint >= 0x1EEAB && codePoint <= 0x1EEBB) // ARABIC MATHEMATICAL DOUBLE-STRUCK LAM .. ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
return true;
- if (codePoint >= 0x20000 && codePoint <= 0x2a6d6)
+ if (codePoint >= 0x20000 && codePoint <= 0x2A6D6) // CJK Ideograph Extension B .. CJK Ideograph Extension B
return true;
- if (codePoint >= 0x2a700 && codePoint <= 0x2b734)
+ if (codePoint >= 0x2A700 && codePoint <= 0x2B734) // CJK Ideograph Extension C .. CJK Ideograph Extension C
return true;
- if (codePoint >= 0x2b740 && codePoint <= 0x2b81d)
+ if (codePoint >= 0x2B740 && codePoint <= 0x2B81D) // CJK Ideograph Extension D .. CJK Ideograph Extension D
return true;
- if (codePoint >= 0x2b820 && codePoint <= 0x2cea1)
+ if (codePoint >= 0x2B820 && codePoint <= 0x2CEA1) // CJK Ideograph Extension E .. CJK Ideograph Extension E
return true;
- if (codePoint >= 0x2ceb0 && codePoint <= 0x2ebe0)
+ if (codePoint >= 0x2CEB0 && codePoint <= 0x2EBE0) // CJK Ideograph Extension F .. CJK Ideograph Extension F
return true;
- if (codePoint >= 0x2f800 && codePoint <= 0x2fa1d)
+ if (codePoint >= 0x2F800 && codePoint <= 0x2FA1D) // CJK COMPATIBILITY IDEOGRAPH-2F800 .. CJK COMPATIBILITY IDEOGRAPH-2FA1D
return true;
return false;
}
@@ -2196,549 +2196,1149 @@ js::unicode::IsIdentifierStartNonBMP(uint32_t codePoint)
bool
js::unicode::IsIdentifierPartNonBMP(uint32_t codePoint)
{
- if (codePoint >= 0x10000 && codePoint <= 0x1000b)
+ if (codePoint >= 0x10000 && codePoint <= 0x1000B) // LINEAR B SYLLABLE B008 A .. LINEAR B SYLLABLE B046 JE
return true;
- if (codePoint >= 0x1000d && codePoint <= 0x10026)
+ if (codePoint >= 0x1000D && codePoint <= 0x10026) // LINEAR B SYLLABLE B036 JO .. LINEAR B SYLLABLE B032 QO
return true;
- if (codePoint >= 0x10028 && codePoint <= 0x1003a)
+ if (codePoint >= 0x10028 && codePoint <= 0x1003A) // LINEAR B SYLLABLE B060 RA .. LINEAR B SYLLABLE B042 WO
return true;
- if (codePoint >= 0x1003c && codePoint <= 0x1003d)
+ if (codePoint >= 0x1003C && codePoint <= 0x1003D) // LINEAR B SYLLABLE B017 ZA .. LINEAR B SYLLABLE B074 ZE
return true;
- if (codePoint >= 0x1003f && codePoint <= 0x1004d)
+ if (codePoint >= 0x1003F && codePoint <= 0x1004D) // LINEAR B SYLLABLE B020 ZO .. LINEAR B SYLLABLE B091 TWO
return true;
- if (codePoint >= 0x10050 && codePoint <= 0x1005d)
+ if (codePoint >= 0x10050 && codePoint <= 0x1005D) // LINEAR B SYMBOL B018 .. LINEAR B SYMBOL B089
return true;
- if (codePoint >= 0x10080 && codePoint <= 0x100fa)
+ if (codePoint >= 0x10080 && codePoint <= 0x100FA) // LINEAR B IDEOGRAM B100 MAN .. LINEAR B IDEOGRAM VESSEL B305
return true;
- if (codePoint >= 0x10140 && codePoint <= 0x10174)
+ if (codePoint >= 0x10140 && codePoint <= 0x10174) // GREEK ACROPHONIC ATTIC ONE QUARTER .. GREEK ACROPHONIC STRATIAN FIFTY MNAS
return true;
- if (codePoint >= 0x101fd && codePoint <= 0x101fd)
+ if (codePoint >= 0x101FD && codePoint <= 0x101FD) // PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE .. PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
return true;
- if (codePoint >= 0x10280 && codePoint <= 0x1029c)
+ if (codePoint >= 0x10280 && codePoint <= 0x1029C) // LYCIAN LETTER A .. LYCIAN LETTER X
return true;
- if (codePoint >= 0x102a0 && codePoint <= 0x102d0)
+ if (codePoint >= 0x102A0 && codePoint <= 0x102D0) // CARIAN LETTER A .. CARIAN LETTER UUU3
return true;
- if (codePoint >= 0x102e0 && codePoint <= 0x102e0)
+ if (codePoint >= 0x102E0 && codePoint <= 0x102E0) // COPTIC EPACT THOUSANDS MARK .. COPTIC EPACT THOUSANDS MARK
return true;
- if (codePoint >= 0x10300 && codePoint <= 0x1031f)
+ if (codePoint >= 0x10300 && codePoint <= 0x1031F) // OLD ITALIC LETTER A .. OLD ITALIC LETTER ESS
return true;
- if (codePoint >= 0x1032d && codePoint <= 0x1034a)
+ if (codePoint >= 0x1032D && codePoint <= 0x1034A) // OLD ITALIC LETTER YE .. GOTHIC LETTER NINE HUNDRED
return true;
- if (codePoint >= 0x10350 && codePoint <= 0x1037a)
+ if (codePoint >= 0x10350 && codePoint <= 0x1037A) // OLD PERMIC LETTER AN .. COMBINING OLD PERMIC LETTER SII
return true;
- if (codePoint >= 0x10380 && codePoint <= 0x1039d)
+ if (codePoint >= 0x10380 && codePoint <= 0x1039D) // UGARITIC LETTER ALPA .. UGARITIC LETTER SSU
return true;
- if (codePoint >= 0x103a0 && codePoint <= 0x103c3)
+ if (codePoint >= 0x103A0 && codePoint <= 0x103C3) // OLD PERSIAN SIGN A .. OLD PERSIAN SIGN HA
return true;
- if (codePoint >= 0x103c8 && codePoint <= 0x103cf)
+ if (codePoint >= 0x103C8 && codePoint <= 0x103CF) // OLD PERSIAN SIGN AURAMAZDAA .. OLD PERSIAN SIGN BUUMISH
return true;
- if (codePoint >= 0x103d1 && codePoint <= 0x103d5)
+ if (codePoint >= 0x103D1 && codePoint <= 0x103D5) // OLD PERSIAN NUMBER ONE .. OLD PERSIAN NUMBER HUNDRED
return true;
- if (codePoint >= 0x10400 && codePoint <= 0x1049d)
+ if (codePoint >= 0x10400 && codePoint <= 0x1049D) // DESERET CAPITAL LETTER LONG I .. OSMANYA LETTER OO
return true;
- if (codePoint >= 0x104a0 && codePoint <= 0x104a9)
+ if (codePoint >= 0x104A0 && codePoint <= 0x104A9) // OSMANYA DIGIT ZERO .. OSMANYA DIGIT NINE
return true;
- if (codePoint >= 0x104b0 && codePoint <= 0x104d3)
+ if (codePoint >= 0x104B0 && codePoint <= 0x104D3) // OSAGE CAPITAL LETTER A .. OSAGE CAPITAL LETTER ZHA
return true;
- if (codePoint >= 0x104d8 && codePoint <= 0x104fb)
+ if (codePoint >= 0x104D8 && codePoint <= 0x104FB) // OSAGE SMALL LETTER A .. OSAGE SMALL LETTER ZHA
return true;
- if (codePoint >= 0x10500 && codePoint <= 0x10527)
+ if (codePoint >= 0x10500 && codePoint <= 0x10527) // ELBASAN LETTER A .. ELBASAN LETTER KHE
return true;
- if (codePoint >= 0x10530 && codePoint <= 0x10563)
+ if (codePoint >= 0x10530 && codePoint <= 0x10563) // CAUCASIAN ALBANIAN LETTER ALT .. CAUCASIAN ALBANIAN LETTER KIW
return true;
- if (codePoint >= 0x10600 && codePoint <= 0x10736)
+ if (codePoint >= 0x10600 && codePoint <= 0x10736) // LINEAR A SIGN AB001 .. LINEAR A SIGN A664
return true;
- if (codePoint >= 0x10740 && codePoint <= 0x10755)
+ if (codePoint >= 0x10740 && codePoint <= 0x10755) // LINEAR A SIGN A701 A .. LINEAR A SIGN A732 JE
return true;
- if (codePoint >= 0x10760 && codePoint <= 0x10767)
+ if (codePoint >= 0x10760 && codePoint <= 0x10767) // LINEAR A SIGN A800 .. LINEAR A SIGN A807
return true;
- if (codePoint >= 0x10800 && codePoint <= 0x10805)
+ if (codePoint >= 0x10800 && codePoint <= 0x10805) // CYPRIOT SYLLABLE A .. CYPRIOT SYLLABLE JA
return true;
- if (codePoint >= 0x10808 && codePoint <= 0x10808)
+ if (codePoint >= 0x10808 && codePoint <= 0x10808) // CYPRIOT SYLLABLE JO .. CYPRIOT SYLLABLE JO
return true;
- if (codePoint >= 0x1080a && codePoint <= 0x10835)
+ if (codePoint >= 0x1080A && codePoint <= 0x10835) // CYPRIOT SYLLABLE KA .. CYPRIOT SYLLABLE WO
return true;
- if (codePoint >= 0x10837 && codePoint <= 0x10838)
+ if (codePoint >= 0x10837 && codePoint <= 0x10838) // CYPRIOT SYLLABLE XA .. CYPRIOT SYLLABLE XE
return true;
- if (codePoint >= 0x1083c && codePoint <= 0x1083c)
+ if (codePoint >= 0x1083C && codePoint <= 0x1083C) // CYPRIOT SYLLABLE ZA .. CYPRIOT SYLLABLE ZA
return true;
- if (codePoint >= 0x1083f && codePoint <= 0x10855)
+ if (codePoint >= 0x1083F && codePoint <= 0x10855) // CYPRIOT SYLLABLE ZO .. IMPERIAL ARAMAIC LETTER TAW
return true;
- if (codePoint >= 0x10860 && codePoint <= 0x10876)
+ if (codePoint >= 0x10860 && codePoint <= 0x10876) // PALMYRENE LETTER ALEPH .. PALMYRENE LETTER TAW
return true;
- if (codePoint >= 0x10880 && codePoint <= 0x1089e)
+ if (codePoint >= 0x10880 && codePoint <= 0x1089E) // NABATAEAN LETTER FINAL ALEPH .. NABATAEAN LETTER TAW
return true;
- if (codePoint >= 0x108e0 && codePoint <= 0x108f2)
+ if (codePoint >= 0x108E0 && codePoint <= 0x108F2) // HATRAN LETTER ALEPH .. HATRAN LETTER QOPH
return true;
- if (codePoint >= 0x108f4 && codePoint <= 0x108f5)
+ if (codePoint >= 0x108F4 && codePoint <= 0x108F5) // HATRAN LETTER SHIN .. HATRAN LETTER TAW
return true;
- if (codePoint >= 0x10900 && codePoint <= 0x10915)
+ if (codePoint >= 0x10900 && codePoint <= 0x10915) // PHOENICIAN LETTER ALF .. PHOENICIAN LETTER TAU
return true;
- if (codePoint >= 0x10920 && codePoint <= 0x10939)
+ if (codePoint >= 0x10920 && codePoint <= 0x10939) // LYDIAN LETTER A .. LYDIAN LETTER C
return true;
- if (codePoint >= 0x10980 && codePoint <= 0x109b7)
+ if (codePoint >= 0x10980 && codePoint <= 0x109B7) // MEROITIC HIEROGLYPHIC LETTER A .. MEROITIC CURSIVE LETTER DA
return true;
- if (codePoint >= 0x109be && codePoint <= 0x109bf)
+ if (codePoint >= 0x109BE && codePoint <= 0x109BF) // MEROITIC CURSIVE LOGOGRAM RMT .. MEROITIC CURSIVE LOGOGRAM IMN
return true;
- if (codePoint >= 0x10a00 && codePoint <= 0x10a03)
+ if (codePoint >= 0x10A00 && codePoint <= 0x10A03) // KHAROSHTHI LETTER A .. KHAROSHTHI VOWEL SIGN VOCALIC R
return true;
- if (codePoint >= 0x10a05 && codePoint <= 0x10a06)
+ if (codePoint >= 0x10A05 && codePoint <= 0x10A06) // KHAROSHTHI VOWEL SIGN E .. KHAROSHTHI VOWEL SIGN O
return true;
- if (codePoint >= 0x10a0c && codePoint <= 0x10a13)
+ if (codePoint >= 0x10A0C && codePoint <= 0x10A13) // KHAROSHTHI VOWEL LENGTH MARK .. KHAROSHTHI LETTER GHA
return true;
- if (codePoint >= 0x10a15 && codePoint <= 0x10a17)
+ if (codePoint >= 0x10A15 && codePoint <= 0x10A17) // KHAROSHTHI LETTER CA .. KHAROSHTHI LETTER JA
return true;
- if (codePoint >= 0x10a19 && codePoint <= 0x10a35)
+ if (codePoint >= 0x10A19 && codePoint <= 0x10A35) // KHAROSHTHI LETTER NYA .. KHAROSHTHI LETTER VHA
return true;
- if (codePoint >= 0x10a38 && codePoint <= 0x10a3a)
+ if (codePoint >= 0x10A38 && codePoint <= 0x10A3A) // KHAROSHTHI SIGN BAR ABOVE .. KHAROSHTHI SIGN DOT BELOW
return true;
- if (codePoint >= 0x10a3f && codePoint <= 0x10a3f)
+ if (codePoint >= 0x10A3F && codePoint <= 0x10A3F) // KHAROSHTHI VIRAMA .. KHAROSHTHI VIRAMA
return true;
- if (codePoint >= 0x10a60 && codePoint <= 0x10a7c)
+ if (codePoint >= 0x10A60 && codePoint <= 0x10A7C) // OLD SOUTH ARABIAN LETTER HE .. OLD SOUTH ARABIAN LETTER THETH
return true;
- if (codePoint >= 0x10a80 && codePoint <= 0x10a9c)
+ if (codePoint >= 0x10A80 && codePoint <= 0x10A9C) // OLD NORTH ARABIAN LETTER HEH .. OLD NORTH ARABIAN LETTER ZAH
return true;
- if (codePoint >= 0x10ac0 && codePoint <= 0x10ac7)
+ if (codePoint >= 0x10AC0 && codePoint <= 0x10AC7) // MANICHAEAN LETTER ALEPH .. MANICHAEAN LETTER WAW
return true;
- if (codePoint >= 0x10ac9 && codePoint <= 0x10ae6)
+ if (codePoint >= 0x10AC9 && codePoint <= 0x10AE6) // MANICHAEAN LETTER ZAYIN .. MANICHAEAN ABBREVIATION MARK BELOW
return true;
- if (codePoint >= 0x10b00 && codePoint <= 0x10b35)
+ if (codePoint >= 0x10B00 && codePoint <= 0x10B35) // AVESTAN LETTER A .. AVESTAN LETTER HE
return true;
- if (codePoint >= 0x10b40 && codePoint <= 0x10b55)
+ if (codePoint >= 0x10B40 && codePoint <= 0x10B55) // INSCRIPTIONAL PARTHIAN LETTER ALEPH .. INSCRIPTIONAL PARTHIAN LETTER TAW
return true;
- if (codePoint >= 0x10b60 && codePoint <= 0x10b72)
+ if (codePoint >= 0x10B60 && codePoint <= 0x10B72) // INSCRIPTIONAL PAHLAVI LETTER ALEPH .. INSCRIPTIONAL PAHLAVI LETTER TAW
return true;
- if (codePoint >= 0x10b80 && codePoint <= 0x10b91)
+ if (codePoint >= 0x10B80 && codePoint <= 0x10B91) // PSALTER PAHLAVI LETTER ALEPH .. PSALTER PAHLAVI LETTER TAW
return true;
- if (codePoint >= 0x10c00 && codePoint <= 0x10c48)
+ if (codePoint >= 0x10C00 && codePoint <= 0x10C48) // OLD TURKIC LETTER ORKHON A .. OLD TURKIC LETTER ORKHON BASH
return true;
- if (codePoint >= 0x10c80 && codePoint <= 0x10cb2)
+ if (codePoint >= 0x10C80 && codePoint <= 0x10CB2) // OLD HUNGARIAN CAPITAL LETTER A .. OLD HUNGARIAN CAPITAL LETTER US
return true;
- if (codePoint >= 0x10cc0 && codePoint <= 0x10cf2)
+ if (codePoint >= 0x10CC0 && codePoint <= 0x10CF2) // OLD HUNGARIAN SMALL LETTER A .. OLD HUNGARIAN SMALL LETTER US
return true;
- if (codePoint >= 0x10d00 && codePoint <= 0x10d27)
+ if (codePoint >= 0x10D00 && codePoint <= 0x10D27) // HANIFI ROHINGYA LETTER A .. HANIFI ROHINGYA SIGN TASSI
return true;
- if (codePoint >= 0x10d30 && codePoint <= 0x10d39)
+ if (codePoint >= 0x10D30 && codePoint <= 0x10D39) // HANIFI ROHINGYA DIGIT ZERO .. HANIFI ROHINGYA DIGIT NINE
return true;
- if (codePoint >= 0x10f00 && codePoint <= 0x10f1c)
+ if (codePoint >= 0x10F00 && codePoint <= 0x10F1C) // OLD SOGDIAN LETTER ALEPH .. OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
return true;
- if (codePoint >= 0x10f27 && codePoint <= 0x10f27)
+ if (codePoint >= 0x10F27 && codePoint <= 0x10F27) // OLD SOGDIAN LIGATURE AYIN-DALETH .. OLD SOGDIAN LIGATURE AYIN-DALETH
return true;
- if (codePoint >= 0x10f30 && codePoint <= 0x10f50)
+ if (codePoint >= 0x10F30 && codePoint <= 0x10F50) // SOGDIAN LETTER ALEPH .. SOGDIAN COMBINING STROKE BELOW
return true;
- if (codePoint >= 0x11000 && codePoint <= 0x11046)
+ if (codePoint >= 0x11000 && codePoint <= 0x11046) // BRAHMI SIGN CANDRABINDU .. BRAHMI VIRAMA
return true;
- if (codePoint >= 0x11066 && codePoint <= 0x1106f)
+ if (codePoint >= 0x11066 && codePoint <= 0x1106F) // BRAHMI DIGIT ZERO .. BRAHMI DIGIT NINE
return true;
- if (codePoint >= 0x1107f && codePoint <= 0x110ba)
+ if (codePoint >= 0x1107F && codePoint <= 0x110BA) // BRAHMI NUMBER JOINER .. KAITHI SIGN NUKTA
return true;
- if (codePoint >= 0x110d0 && codePoint <= 0x110e8)
+ if (codePoint >= 0x110D0 && codePoint <= 0x110E8) // SORA SOMPENG LETTER SAH .. SORA SOMPENG LETTER MAE
return true;
- if (codePoint >= 0x110f0 && codePoint <= 0x110f9)
+ if (codePoint >= 0x110F0 && codePoint <= 0x110F9) // SORA SOMPENG DIGIT ZERO .. SORA SOMPENG DIGIT NINE
return true;
- if (codePoint >= 0x11100 && codePoint <= 0x11134)
+ if (codePoint >= 0x11100 && codePoint <= 0x11134) // CHAKMA SIGN CANDRABINDU .. CHAKMA MAAYYAA
return true;
- if (codePoint >= 0x11136 && codePoint <= 0x1113f)
+ if (codePoint >= 0x11136 && codePoint <= 0x1113F) // CHAKMA DIGIT ZERO .. CHAKMA DIGIT NINE
return true;
- if (codePoint >= 0x11144 && codePoint <= 0x11146)
+ if (codePoint >= 0x11144 && codePoint <= 0x11146) // CHAKMA LETTER LHAA .. CHAKMA VOWEL SIGN EI
return true;
- if (codePoint >= 0x11150 && codePoint <= 0x11173)
+ if (codePoint >= 0x11150 && codePoint <= 0x11173) // MAHAJANI LETTER A .. MAHAJANI SIGN NUKTA
return true;
- if (codePoint >= 0x11176 && codePoint <= 0x11176)
+ if (codePoint >= 0x11176 && codePoint <= 0x11176) // MAHAJANI LIGATURE SHRI .. MAHAJANI LIGATURE SHRI
return true;
- if (codePoint >= 0x11180 && codePoint <= 0x111c4)
+ if (codePoint >= 0x11180 && codePoint <= 0x111C4) // SHARADA SIGN CANDRABINDU .. SHARADA OM
return true;
- if (codePoint >= 0x111c9 && codePoint <= 0x111cc)
+ if (codePoint >= 0x111C9 && codePoint <= 0x111CC) // SHARADA SANDHI MARK .. SHARADA EXTRA SHORT VOWEL MARK
return true;
- if (codePoint >= 0x111d0 && codePoint <= 0x111da)
+ if (codePoint >= 0x111D0 && codePoint <= 0x111DA) // SHARADA DIGIT ZERO .. SHARADA EKAM
return true;
- if (codePoint >= 0x111dc && codePoint <= 0x111dc)
+ if (codePoint >= 0x111DC && codePoint <= 0x111DC) // SHARADA HEADSTROKE .. SHARADA HEADSTROKE
return true;
- if (codePoint >= 0x11200 && codePoint <= 0x11211)
+ if (codePoint >= 0x11200 && codePoint <= 0x11211) // KHOJKI LETTER A .. KHOJKI LETTER JJA
return true;
- if (codePoint >= 0x11213 && codePoint <= 0x11237)
+ if (codePoint >= 0x11213 && codePoint <= 0x11237) // KHOJKI LETTER NYA .. KHOJKI SIGN SHADDA
return true;
- if (codePoint >= 0x1123e && codePoint <= 0x1123e)
+ if (codePoint >= 0x1123E && codePoint <= 0x1123E) // KHOJKI SIGN SUKUN .. KHOJKI SIGN SUKUN
return true;
- if (codePoint >= 0x11280 && codePoint <= 0x11286)
+ if (codePoint >= 0x11280 && codePoint <= 0x11286) // MULTANI LETTER A .. MULTANI LETTER GA
return true;
- if (codePoint >= 0x11288 && codePoint <= 0x11288)
+ if (codePoint >= 0x11288 && codePoint <= 0x11288) // MULTANI LETTER GHA .. MULTANI LETTER GHA
return true;
- if (codePoint >= 0x1128a && codePoint <= 0x1128d)
+ if (codePoint >= 0x1128A && codePoint <= 0x1128D) // MULTANI LETTER CA .. MULTANI LETTER JJA
return true;
- if (codePoint >= 0x1128f && codePoint <= 0x1129d)
+ if (codePoint >= 0x1128F && codePoint <= 0x1129D) // MULTANI LETTER NYA .. MULTANI LETTER BA
return true;
- if (codePoint >= 0x1129f && codePoint <= 0x112a8)
+ if (codePoint >= 0x1129F && codePoint <= 0x112A8) // MULTANI LETTER BHA .. MULTANI LETTER RHA
return true;
- if (codePoint >= 0x112b0 && codePoint <= 0x112ea)
+ if (codePoint >= 0x112B0 && codePoint <= 0x112EA) // KHUDAWADI LETTER A .. KHUDAWADI SIGN VIRAMA
return true;
- if (codePoint >= 0x112f0 && codePoint <= 0x112f9)
+ if (codePoint >= 0x112F0 && codePoint <= 0x112F9) // KHUDAWADI DIGIT ZERO .. KHUDAWADI DIGIT NINE
return true;
- if (codePoint >= 0x11300 && codePoint <= 0x11303)
+ if (codePoint >= 0x11300 && codePoint <= 0x11303) // GRANTHA SIGN COMBINING ANUSVARA ABOVE .. GRANTHA SIGN VISARGA
return true;
- if (codePoint >= 0x11305 && codePoint <= 0x1130c)
+ if (codePoint >= 0x11305 && codePoint <= 0x1130C) // GRANTHA LETTER A .. GRANTHA LETTER VOCALIC L
return true;
- if (codePoint >= 0x1130f && codePoint <= 0x11310)
+ if (codePoint >= 0x1130F && codePoint <= 0x11310) // GRANTHA LETTER EE .. GRANTHA LETTER AI
return true;
- if (codePoint >= 0x11313 && codePoint <= 0x11328)
+ if (codePoint >= 0x11313 && codePoint <= 0x11328) // GRANTHA LETTER OO .. GRANTHA LETTER NA
return true;
- if (codePoint >= 0x1132a && codePoint <= 0x11330)
+ if (codePoint >= 0x1132A && codePoint <= 0x11330) // GRANTHA LETTER PA .. GRANTHA LETTER RA
return true;
- if (codePoint >= 0x11332 && codePoint <= 0x11333)
+ if (codePoint >= 0x11332 && codePoint <= 0x11333) // GRANTHA LETTER LA .. GRANTHA LETTER LLA
return true;
- if (codePoint >= 0x11335 && codePoint <= 0x11339)
+ if (codePoint >= 0x11335 && codePoint <= 0x11339) // GRANTHA LETTER VA .. GRANTHA LETTER HA
return true;
- if (codePoint >= 0x1133b && codePoint <= 0x11344)
+ if (codePoint >= 0x1133B && codePoint <= 0x11344) // COMBINING BINDU BELOW .. GRANTHA VOWEL SIGN VOCALIC RR
return true;
- if (codePoint >= 0x11347 && codePoint <= 0x11348)
+ if (codePoint >= 0x11347 && codePoint <= 0x11348) // GRANTHA VOWEL SIGN EE .. GRANTHA VOWEL SIGN AI
return true;
- if (codePoint >= 0x1134b && codePoint <= 0x1134d)
+ if (codePoint >= 0x1134B && codePoint <= 0x1134D) // GRANTHA VOWEL SIGN OO .. GRANTHA SIGN VIRAMA
return true;
- if (codePoint >= 0x11350 && codePoint <= 0x11350)
+ if (codePoint >= 0x11350 && codePoint <= 0x11350) // GRANTHA OM .. GRANTHA OM
return true;
- if (codePoint >= 0x11357 && codePoint <= 0x11357)
+ if (codePoint >= 0x11357 && codePoint <= 0x11357) // GRANTHA AU LENGTH MARK .. GRANTHA AU LENGTH MARK
return true;
- if (codePoint >= 0x1135d && codePoint <= 0x11363)
+ if (codePoint >= 0x1135D && codePoint <= 0x11363) // GRANTHA SIGN PLUTA .. GRANTHA VOWEL SIGN VOCALIC LL
return true;
- if (codePoint >= 0x11366 && codePoint <= 0x1136c)
+ if (codePoint >= 0x11366 && codePoint <= 0x1136C) // COMBINING GRANTHA DIGIT ZERO .. COMBINING GRANTHA DIGIT SIX
return true;
- if (codePoint >= 0x11370 && codePoint <= 0x11374)
+ if (codePoint >= 0x11370 && codePoint <= 0x11374) // COMBINING GRANTHA LETTER A .. COMBINING GRANTHA LETTER PA
return true;
- if (codePoint >= 0x11400 && codePoint <= 0x1144a)
+ if (codePoint >= 0x11400 && codePoint <= 0x1144A) // NEWA LETTER A .. NEWA SIDDHI
return true;
- if (codePoint >= 0x11450 && codePoint <= 0x11459)
+ if (codePoint >= 0x11450 && codePoint <= 0x11459) // NEWA DIGIT ZERO .. NEWA DIGIT NINE
return true;
- if (codePoint >= 0x1145e && codePoint <= 0x1145e)
+ if (codePoint >= 0x1145E && codePoint <= 0x1145E) // NEWA SANDHI MARK .. NEWA SANDHI MARK
return true;
- if (codePoint >= 0x11480 && codePoint <= 0x114c5)
+ if (codePoint >= 0x11480 && codePoint <= 0x114C5) // TIRHUTA ANJI .. TIRHUTA GVANG
return true;
- if (codePoint >= 0x114c7 && codePoint <= 0x114c7)
+ if (codePoint >= 0x114C7 && codePoint <= 0x114C7) // TIRHUTA OM .. TIRHUTA OM
return true;
- if (codePoint >= 0x114d0 && codePoint <= 0x114d9)
+ if (codePoint >= 0x114D0 && codePoint <= 0x114D9) // TIRHUTA DIGIT ZERO .. TIRHUTA DIGIT NINE
return true;
- if (codePoint >= 0x11580 && codePoint <= 0x115b5)
+ if (codePoint >= 0x11580 && codePoint <= 0x115B5) // SIDDHAM LETTER A .. SIDDHAM VOWEL SIGN VOCALIC RR
return true;
- if (codePoint >= 0x115b8 && codePoint <= 0x115c0)
+ if (codePoint >= 0x115B8 && codePoint <= 0x115C0) // SIDDHAM VOWEL SIGN E .. SIDDHAM SIGN NUKTA
return true;
- if (codePoint >= 0x115d8 && codePoint <= 0x115dd)
+ if (codePoint >= 0x115D8 && codePoint <= 0x115DD) // SIDDHAM LETTER THREE-CIRCLE ALTERNATE I .. SIDDHAM VOWEL SIGN ALTERNATE UU
return true;
- if (codePoint >= 0x11600 && codePoint <= 0x11640)
+ if (codePoint >= 0x11600 && codePoint <= 0x11640) // MODI LETTER A .. MODI SIGN ARDHACANDRA
return true;
- if (codePoint >= 0x11644 && codePoint <= 0x11644)
+ if (codePoint >= 0x11644 && codePoint <= 0x11644) // MODI SIGN HUVA .. MODI SIGN HUVA
return true;
- if (codePoint >= 0x11650 && codePoint <= 0x11659)
+ if (codePoint >= 0x11650 && codePoint <= 0x11659) // MODI DIGIT ZERO .. MODI DIGIT NINE
return true;
- if (codePoint >= 0x11680 && codePoint <= 0x116b7)
+ if (codePoint >= 0x11680 && codePoint <= 0x116B7) // TAKRI LETTER A .. TAKRI SIGN NUKTA
return true;
- if (codePoint >= 0x116c0 && codePoint <= 0x116c9)
+ if (codePoint >= 0x116C0 && codePoint <= 0x116C9) // TAKRI DIGIT ZERO .. TAKRI DIGIT NINE
return true;
- if (codePoint >= 0x11700 && codePoint <= 0x1171a)
+ if (codePoint >= 0x11700 && codePoint <= 0x1171A) // AHOM LETTER KA .. AHOM LETTER ALTERNATE BA
return true;
- if (codePoint >= 0x1171d && codePoint <= 0x1172b)
+ if (codePoint >= 0x1171D && codePoint <= 0x1172B) // AHOM CONSONANT SIGN MEDIAL LA .. AHOM SIGN KILLER
return true;
- if (codePoint >= 0x11730 && codePoint <= 0x11739)
+ if (codePoint >= 0x11730 && codePoint <= 0x11739) // AHOM DIGIT ZERO .. AHOM DIGIT NINE
return true;
- if (codePoint >= 0x11800 && codePoint <= 0x1183a)
+ if (codePoint >= 0x11800 && codePoint <= 0x1183A) // DOGRA LETTER A .. DOGRA SIGN NUKTA
return true;
- if (codePoint >= 0x118a0 && codePoint <= 0x118e9)
+ if (codePoint >= 0x118A0 && codePoint <= 0x118E9) // WARANG CITI CAPITAL LETTER NGAA .. WARANG CITI DIGIT NINE
return true;
- if (codePoint >= 0x118ff && codePoint <= 0x118ff)
+ if (codePoint >= 0x118FF && codePoint <= 0x118FF) // WARANG CITI OM .. WARANG CITI OM
return true;
- if (codePoint >= 0x11a00 && codePoint <= 0x11a3e)
+ if (codePoint >= 0x11A00 && codePoint <= 0x11A3E) // ZANABAZAR SQUARE LETTER A .. ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
return true;
- if (codePoint >= 0x11a47 && codePoint <= 0x11a47)
+ if (codePoint >= 0x11A47 && codePoint <= 0x11A47) // ZANABAZAR SQUARE SUBJOINER .. ZANABAZAR SQUARE SUBJOINER
return true;
- if (codePoint >= 0x11a50 && codePoint <= 0x11a83)
+ if (codePoint >= 0x11A50 && codePoint <= 0x11A83) // SOYOMBO LETTER A .. SOYOMBO LETTER KSSA
return true;
- if (codePoint >= 0x11a86 && codePoint <= 0x11a99)
+ if (codePoint >= 0x11A86 && codePoint <= 0x11A99) // SOYOMBO CLUSTER-INITIAL LETTER RA .. SOYOMBO SUBJOINER
return true;
- if (codePoint >= 0x11a9d && codePoint <= 0x11a9d)
+ if (codePoint >= 0x11A9D && codePoint <= 0x11A9D) // SOYOMBO MARK PLUTA .. SOYOMBO MARK PLUTA
return true;
- if (codePoint >= 0x11ac0 && codePoint <= 0x11af8)
+ if (codePoint >= 0x11AC0 && codePoint <= 0x11AF8) // PAU CIN HAU LETTER PA .. PAU CIN HAU GLOTTAL STOP FINAL
return true;
- if (codePoint >= 0x11c00 && codePoint <= 0x11c08)
+ if (codePoint >= 0x11C00 && codePoint <= 0x11C08) // BHAIKSUKI LETTER A .. BHAIKSUKI LETTER VOCALIC L
return true;
- if (codePoint >= 0x11c0a && codePoint <= 0x11c36)
+ if (codePoint >= 0x11C0A && codePoint <= 0x11C36) // BHAIKSUKI LETTER E .. BHAIKSUKI VOWEL SIGN VOCALIC L
return true;
- if (codePoint >= 0x11c38 && codePoint <= 0x11c40)
+ if (codePoint >= 0x11C38 && codePoint <= 0x11C40) // BHAIKSUKI VOWEL SIGN E .. BHAIKSUKI SIGN AVAGRAHA
return true;
- if (codePoint >= 0x11c50 && codePoint <= 0x11c59)
+ if (codePoint >= 0x11C50 && codePoint <= 0x11C59) // BHAIKSUKI DIGIT ZERO .. BHAIKSUKI DIGIT NINE
return true;
- if (codePoint >= 0x11c72 && codePoint <= 0x11c8f)
+ if (codePoint >= 0x11C72 && codePoint <= 0x11C8F) // MARCHEN LETTER KA .. MARCHEN LETTER A
return true;
- if (codePoint >= 0x11c92 && codePoint <= 0x11ca7)
+ if (codePoint >= 0x11C92 && codePoint <= 0x11CA7) // MARCHEN SUBJOINED LETTER KA .. MARCHEN SUBJOINED LETTER ZA
return true;
- if (codePoint >= 0x11ca9 && codePoint <= 0x11cb6)
+ if (codePoint >= 0x11CA9 && codePoint <= 0x11CB6) // MARCHEN SUBJOINED LETTER YA .. MARCHEN SIGN CANDRABINDU
return true;
- if (codePoint >= 0x11d00 && codePoint <= 0x11d06)
+ if (codePoint >= 0x11D00 && codePoint <= 0x11D06) // MASARAM GONDI LETTER A .. MASARAM GONDI LETTER E
return true;
- if (codePoint >= 0x11d08 && codePoint <= 0x11d09)
+ if (codePoint >= 0x11D08 && codePoint <= 0x11D09) // MASARAM GONDI LETTER AI .. MASARAM GONDI LETTER O
return true;
- if (codePoint >= 0x11d0b && codePoint <= 0x11d36)
+ if (codePoint >= 0x11D0B && codePoint <= 0x11D36) // MASARAM GONDI LETTER AU .. MASARAM GONDI VOWEL SIGN VOCALIC R
return true;
- if (codePoint >= 0x11d3a && codePoint <= 0x11d3a)
+ if (codePoint >= 0x11D3A && codePoint <= 0x11D3A) // MASARAM GONDI VOWEL SIGN E .. MASARAM GONDI VOWEL SIGN E
return true;
- if (codePoint >= 0x11d3c && codePoint <= 0x11d3d)
+ if (codePoint >= 0x11D3C && codePoint <= 0x11D3D) // MASARAM GONDI VOWEL SIGN AI .. MASARAM GONDI VOWEL SIGN O
return true;
- if (codePoint >= 0x11d3f && codePoint <= 0x11d47)
+ if (codePoint >= 0x11D3F && codePoint <= 0x11D47) // MASARAM GONDI VOWEL SIGN AU .. MASARAM GONDI RA-KARA
return true;
- if (codePoint >= 0x11d50 && codePoint <= 0x11d59)
+ if (codePoint >= 0x11D50 && codePoint <= 0x11D59) // MASARAM GONDI DIGIT ZERO .. MASARAM GONDI DIGIT NINE
return true;
- if (codePoint >= 0x11d60 && codePoint <= 0x11d65)
+ if (codePoint >= 0x11D60 && codePoint <= 0x11D65) // GUNJALA GONDI LETTER A .. GUNJALA GONDI LETTER UU
return true;
- if (codePoint >= 0x11d67 && codePoint <= 0x11d68)
+ if (codePoint >= 0x11D67 && codePoint <= 0x11D68) // GUNJALA GONDI LETTER EE .. GUNJALA GONDI LETTER AI
return true;
- if (codePoint >= 0x11d6a && codePoint <= 0x11d8e)
+ if (codePoint >= 0x11D6A && codePoint <= 0x11D8E) // GUNJALA GONDI LETTER OO .. GUNJALA GONDI VOWEL SIGN UU
return true;
- if (codePoint >= 0x11d90 && codePoint <= 0x11d91)
+ if (codePoint >= 0x11D90 && codePoint <= 0x11D91) // GUNJALA GONDI VOWEL SIGN EE .. GUNJALA GONDI VOWEL SIGN AI
return true;
- if (codePoint >= 0x11d93 && codePoint <= 0x11d98)
+ if (codePoint >= 0x11D93 && codePoint <= 0x11D98) // GUNJALA GONDI VOWEL SIGN OO .. GUNJALA GONDI OM
return true;
- if (codePoint >= 0x11da0 && codePoint <= 0x11da9)
+ if (codePoint >= 0x11DA0 && codePoint <= 0x11DA9) // GUNJALA GONDI DIGIT ZERO .. GUNJALA GONDI DIGIT NINE
return true;
- if (codePoint >= 0x11ee0 && codePoint <= 0x11ef6)
+ if (codePoint >= 0x11EE0 && codePoint <= 0x11EF6) // MAKASAR LETTER KA .. MAKASAR VOWEL SIGN O
return true;
- if (codePoint >= 0x12000 && codePoint <= 0x12399)
+ if (codePoint >= 0x12000 && codePoint <= 0x12399) // CUNEIFORM SIGN A .. CUNEIFORM SIGN U U
return true;
- if (codePoint >= 0x12400 && codePoint <= 0x1246e)
+ if (codePoint >= 0x12400 && codePoint <= 0x1246E) // CUNEIFORM NUMERIC SIGN TWO ASH .. CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
return true;
- if (codePoint >= 0x12480 && codePoint <= 0x12543)
+ if (codePoint >= 0x12480 && codePoint <= 0x12543) // CUNEIFORM SIGN AB TIMES NUN TENU .. CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
return true;
- if (codePoint >= 0x13000 && codePoint <= 0x1342e)
+ if (codePoint >= 0x13000 && codePoint <= 0x1342E) // EGYPTIAN HIEROGLYPH A001 .. EGYPTIAN HIEROGLYPH AA032
return true;
- if (codePoint >= 0x14400 && codePoint <= 0x14646)
+ if (codePoint >= 0x14400 && codePoint <= 0x14646) // ANATOLIAN HIEROGLYPH A001 .. ANATOLIAN HIEROGLYPH A530
return true;
- if (codePoint >= 0x16800 && codePoint <= 0x16a38)
+ if (codePoint >= 0x16800 && codePoint <= 0x16A38) // BAMUM LETTER PHASE-A NGKUE MFON .. BAMUM LETTER PHASE-F VUEQ
return true;
- if (codePoint >= 0x16a40 && codePoint <= 0x16a5e)
+ if (codePoint >= 0x16A40 && codePoint <= 0x16A5E) // MRO LETTER TA .. MRO LETTER TEK
return true;
- if (codePoint >= 0x16a60 && codePoint <= 0x16a69)
+ if (codePoint >= 0x16A60 && codePoint <= 0x16A69) // MRO DIGIT ZERO .. MRO DIGIT NINE
return true;
- if (codePoint >= 0x16ad0 && codePoint <= 0x16aed)
+ if (codePoint >= 0x16AD0 && codePoint <= 0x16AED) // BASSA VAH LETTER ENNI .. BASSA VAH LETTER I
return true;
- if (codePoint >= 0x16af0 && codePoint <= 0x16af4)
+ if (codePoint >= 0x16AF0 && codePoint <= 0x16AF4) // BASSA VAH COMBINING HIGH TONE .. BASSA VAH COMBINING HIGH-LOW TONE
return true;
- if (codePoint >= 0x16b00 && codePoint <= 0x16b36)
+ if (codePoint >= 0x16B00 && codePoint <= 0x16B36) // PAHAWH HMONG VOWEL KEEB .. PAHAWH HMONG MARK CIM TAUM
return true;
- if (codePoint >= 0x16b40 && codePoint <= 0x16b43)
+ if (codePoint >= 0x16B40 && codePoint <= 0x16B43) // PAHAWH HMONG SIGN VOS SEEV .. PAHAWH HMONG SIGN IB YAM
return true;
- if (codePoint >= 0x16b50 && codePoint <= 0x16b59)
+ if (codePoint >= 0x16B50 && codePoint <= 0x16B59) // PAHAWH HMONG DIGIT ZERO .. PAHAWH HMONG DIGIT NINE
return true;
- if (codePoint >= 0x16b63 && codePoint <= 0x16b77)
+ if (codePoint >= 0x16B63 && codePoint <= 0x16B77) // PAHAWH HMONG SIGN VOS LUB .. PAHAWH HMONG SIGN CIM NRES TOS
return true;
- if (codePoint >= 0x16b7d && codePoint <= 0x16b8f)
+ if (codePoint >= 0x16B7D && codePoint <= 0x16B8F) // PAHAWH HMONG CLAN SIGN TSHEEJ .. PAHAWH HMONG CLAN SIGN VWJ
return true;
- if (codePoint >= 0x16e40 && codePoint <= 0x16e7f)
+ if (codePoint >= 0x16E40 && codePoint <= 0x16E7F) // MEDEFAIDRIN CAPITAL LETTER M .. MEDEFAIDRIN SMALL LETTER Y
return true;
- if (codePoint >= 0x16f00 && codePoint <= 0x16f44)
+ if (codePoint >= 0x16F00 && codePoint <= 0x16F44) // MIAO LETTER PA .. MIAO LETTER HHA
return true;
- if (codePoint >= 0x16f50 && codePoint <= 0x16f7e)
+ if (codePoint >= 0x16F50 && codePoint <= 0x16F7E) // MIAO LETTER NASALIZATION .. MIAO VOWEL SIGN NG
return true;
- if (codePoint >= 0x16f8f && codePoint <= 0x16f9f)
+ if (codePoint >= 0x16F8F && codePoint <= 0x16F9F) // MIAO TONE RIGHT .. MIAO LETTER REFORMED TONE-8
return true;
- if (codePoint >= 0x16fe0 && codePoint <= 0x16fe1)
+ if (codePoint >= 0x16FE0 && codePoint <= 0x16FE1) // TANGUT ITERATION MARK .. NUSHU ITERATION MARK
return true;
- if (codePoint >= 0x17000 && codePoint <= 0x187f1)
+ if (codePoint >= 0x17000 && codePoint <= 0x187F1) // Tangut Ideograph .. Tangut Ideograph
return true;
- if (codePoint >= 0x18800 && codePoint <= 0x18af2)
+ if (codePoint >= 0x18800 && codePoint <= 0x18AF2) // TANGUT COMPONENT-001 .. TANGUT COMPONENT-755
return true;
- if (codePoint >= 0x1b000 && codePoint <= 0x1b11e)
+ if (codePoint >= 0x1B000 && codePoint <= 0x1B11E) // KATAKANA LETTER ARCHAIC E .. HENTAIGANA LETTER N-MU-MO-2
return true;
- if (codePoint >= 0x1b170 && codePoint <= 0x1b2fb)
+ if (codePoint >= 0x1B170 && codePoint <= 0x1B2FB) // NUSHU CHARACTER-1B170 .. NUSHU CHARACTER-1B2FB
return true;
- if (codePoint >= 0x1bc00 && codePoint <= 0x1bc6a)
+ if (codePoint >= 0x1BC00 && codePoint <= 0x1BC6A) // DUPLOYAN LETTER H .. DUPLOYAN LETTER VOCALIC M
return true;
- if (codePoint >= 0x1bc70 && codePoint <= 0x1bc7c)
+ if (codePoint >= 0x1BC70 && codePoint <= 0x1BC7C) // DUPLOYAN AFFIX LEFT HORIZONTAL SECANT .. DUPLOYAN AFFIX ATTACHED TANGENT HOOK
return true;
- if (codePoint >= 0x1bc80 && codePoint <= 0x1bc88)
+ if (codePoint >= 0x1BC80 && codePoint <= 0x1BC88) // DUPLOYAN AFFIX HIGH ACUTE .. DUPLOYAN AFFIX HIGH VERTICAL
return true;
- if (codePoint >= 0x1bc90 && codePoint <= 0x1bc99)
+ if (codePoint >= 0x1BC90 && codePoint <= 0x1BC99) // DUPLOYAN AFFIX LOW ACUTE .. DUPLOYAN AFFIX LOW ARROW
return true;
- if (codePoint >= 0x1bc9d && codePoint <= 0x1bc9e)
+ if (codePoint >= 0x1BC9D && codePoint <= 0x1BC9E) // DUPLOYAN THICK LETTER SELECTOR .. DUPLOYAN DOUBLE MARK
return true;
- if (codePoint >= 0x1d165 && codePoint <= 0x1d169)
+ if (codePoint >= 0x1D165 && codePoint <= 0x1D169) // MUSICAL SYMBOL COMBINING STEM .. MUSICAL SYMBOL COMBINING TREMOLO-3
return true;
- if (codePoint >= 0x1d16d && codePoint <= 0x1d172)
+ if (codePoint >= 0x1D16D && codePoint <= 0x1D172) // MUSICAL SYMBOL COMBINING AUGMENTATION DOT .. MUSICAL SYMBOL COMBINING FLAG-5
return true;
- if (codePoint >= 0x1d17b && codePoint <= 0x1d182)
+ if (codePoint >= 0x1D17B && codePoint <= 0x1D182) // MUSICAL SYMBOL COMBINING ACCENT .. MUSICAL SYMBOL COMBINING LOURE
return true;
- if (codePoint >= 0x1d185 && codePoint <= 0x1d18b)
+ if (codePoint >= 0x1D185 && codePoint <= 0x1D18B) // MUSICAL SYMBOL COMBINING DOIT .. MUSICAL SYMBOL COMBINING TRIPLE TONGUE
return true;
- if (codePoint >= 0x1d1aa && codePoint <= 0x1d1ad)
+ if (codePoint >= 0x1D1AA && codePoint <= 0x1D1AD) // MUSICAL SYMBOL COMBINING DOWN BOW .. MUSICAL SYMBOL COMBINING SNAP PIZZICATO
return true;
- if (codePoint >= 0x1d242 && codePoint <= 0x1d244)
+ if (codePoint >= 0x1D242 && codePoint <= 0x1D244) // COMBINING GREEK MUSICAL TRISEME .. COMBINING GREEK MUSICAL PENTASEME
return true;
- if (codePoint >= 0x1d400 && codePoint <= 0x1d454)
+ if (codePoint >= 0x1D400 && codePoint <= 0x1D454) // MATHEMATICAL BOLD CAPITAL A .. MATHEMATICAL ITALIC SMALL G
return true;
- if (codePoint >= 0x1d456 && codePoint <= 0x1d49c)
+ if (codePoint >= 0x1D456 && codePoint <= 0x1D49C) // MATHEMATICAL ITALIC SMALL I .. MATHEMATICAL SCRIPT CAPITAL A
return true;
- if (codePoint >= 0x1d49e && codePoint <= 0x1d49f)
+ if (codePoint >= 0x1D49E && codePoint <= 0x1D49F) // MATHEMATICAL SCRIPT CAPITAL C .. MATHEMATICAL SCRIPT CAPITAL D
return true;
- if (codePoint >= 0x1d4a2 && codePoint <= 0x1d4a2)
+ if (codePoint >= 0x1D4A2 && codePoint <= 0x1D4A2) // MATHEMATICAL SCRIPT CAPITAL G .. MATHEMATICAL SCRIPT CAPITAL G
return true;
- if (codePoint >= 0x1d4a5 && codePoint <= 0x1d4a6)
+ if (codePoint >= 0x1D4A5 && codePoint <= 0x1D4A6) // MATHEMATICAL SCRIPT CAPITAL J .. MATHEMATICAL SCRIPT CAPITAL K
return true;
- if (codePoint >= 0x1d4a9 && codePoint <= 0x1d4ac)
+ if (codePoint >= 0x1D4A9 && codePoint <= 0x1D4AC) // MATHEMATICAL SCRIPT CAPITAL N .. MATHEMATICAL SCRIPT CAPITAL Q
return true;
- if (codePoint >= 0x1d4ae && codePoint <= 0x1d4b9)
+ if (codePoint >= 0x1D4AE && codePoint <= 0x1D4B9) // MATHEMATICAL SCRIPT CAPITAL S .. MATHEMATICAL SCRIPT SMALL D
return true;
- if (codePoint >= 0x1d4bb && codePoint <= 0x1d4bb)
+ if (codePoint >= 0x1D4BB && codePoint <= 0x1D4BB) // MATHEMATICAL SCRIPT SMALL F .. MATHEMATICAL SCRIPT SMALL F
return true;
- if (codePoint >= 0x1d4bd && codePoint <= 0x1d4c3)
+ if (codePoint >= 0x1D4BD && codePoint <= 0x1D4C3) // MATHEMATICAL SCRIPT SMALL H .. MATHEMATICAL SCRIPT SMALL N
return true;
- if (codePoint >= 0x1d4c5 && codePoint <= 0x1d505)
+ if (codePoint >= 0x1D4C5 && codePoint <= 0x1D505) // MATHEMATICAL SCRIPT SMALL P .. MATHEMATICAL FRAKTUR CAPITAL B
return true;
- if (codePoint >= 0x1d507 && codePoint <= 0x1d50a)
+ if (codePoint >= 0x1D507 && codePoint <= 0x1D50A) // MATHEMATICAL FRAKTUR CAPITAL D .. MATHEMATICAL FRAKTUR CAPITAL G
return true;
- if (codePoint >= 0x1d50d && codePoint <= 0x1d514)
+ if (codePoint >= 0x1D50D && codePoint <= 0x1D514) // MATHEMATICAL FRAKTUR CAPITAL J .. MATHEMATICAL FRAKTUR CAPITAL Q
return true;
- if (codePoint >= 0x1d516 && codePoint <= 0x1d51c)
+ if (codePoint >= 0x1D516 && codePoint <= 0x1D51C) // MATHEMATICAL FRAKTUR CAPITAL S .. MATHEMATICAL FRAKTUR CAPITAL Y
return true;
- if (codePoint >= 0x1d51e && codePoint <= 0x1d539)
+ if (codePoint >= 0x1D51E && codePoint <= 0x1D539) // MATHEMATICAL FRAKTUR SMALL A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
return true;
- if (codePoint >= 0x1d53b && codePoint <= 0x1d53e)
+ if (codePoint >= 0x1D53B && codePoint <= 0x1D53E) // MATHEMATICAL DOUBLE-STRUCK CAPITAL D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
return true;
- if (codePoint >= 0x1d540 && codePoint <= 0x1d544)
+ if (codePoint >= 0x1D540 && codePoint <= 0x1D544) // MATHEMATICAL DOUBLE-STRUCK CAPITAL I .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
return true;
- if (codePoint >= 0x1d546 && codePoint <= 0x1d546)
+ if (codePoint >= 0x1D546 && codePoint <= 0x1D546) // MATHEMATICAL DOUBLE-STRUCK CAPITAL O .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
return true;
- if (codePoint >= 0x1d54a && codePoint <= 0x1d550)
+ if (codePoint >= 0x1D54A && codePoint <= 0x1D550) // MATHEMATICAL DOUBLE-STRUCK CAPITAL S .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
return true;
- if (codePoint >= 0x1d552 && codePoint <= 0x1d6a5)
+ if (codePoint >= 0x1D552 && codePoint <= 0x1D6A5) // MATHEMATICAL DOUBLE-STRUCK SMALL A .. MATHEMATICAL ITALIC SMALL DOTLESS J
return true;
- if (codePoint >= 0x1d6a8 && codePoint <= 0x1d6c0)
+ if (codePoint >= 0x1D6A8 && codePoint <= 0x1D6C0) // MATHEMATICAL BOLD CAPITAL ALPHA .. MATHEMATICAL BOLD CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d6c2 && codePoint <= 0x1d6da)
+ if (codePoint >= 0x1D6C2 && codePoint <= 0x1D6DA) // MATHEMATICAL BOLD SMALL ALPHA .. MATHEMATICAL BOLD SMALL OMEGA
return true;
- if (codePoint >= 0x1d6dc && codePoint <= 0x1d6fa)
+ if (codePoint >= 0x1D6DC && codePoint <= 0x1D6FA) // MATHEMATICAL BOLD EPSILON SYMBOL .. MATHEMATICAL ITALIC CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d6fc && codePoint <= 0x1d714)
+ if (codePoint >= 0x1D6FC && codePoint <= 0x1D714) // MATHEMATICAL ITALIC SMALL ALPHA .. MATHEMATICAL ITALIC SMALL OMEGA
return true;
- if (codePoint >= 0x1d716 && codePoint <= 0x1d734)
+ if (codePoint >= 0x1D716 && codePoint <= 0x1D734) // MATHEMATICAL ITALIC EPSILON SYMBOL .. MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d736 && codePoint <= 0x1d74e)
+ if (codePoint >= 0x1D736 && codePoint <= 0x1D74E) // MATHEMATICAL BOLD ITALIC SMALL ALPHA .. MATHEMATICAL BOLD ITALIC SMALL OMEGA
return true;
- if (codePoint >= 0x1d750 && codePoint <= 0x1d76e)
+ if (codePoint >= 0x1D750 && codePoint <= 0x1D76E) // MATHEMATICAL BOLD ITALIC EPSILON SYMBOL .. MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d770 && codePoint <= 0x1d788)
+ if (codePoint >= 0x1D770 && codePoint <= 0x1D788) // MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA .. MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
return true;
- if (codePoint >= 0x1d78a && codePoint <= 0x1d7a8)
+ if (codePoint >= 0x1D78A && codePoint <= 0x1D7A8) // MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL .. MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
return true;
- if (codePoint >= 0x1d7aa && codePoint <= 0x1d7c2)
+ if (codePoint >= 0x1D7AA && codePoint <= 0x1D7C2) // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA .. MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
return true;
- if (codePoint >= 0x1d7c4 && codePoint <= 0x1d7cb)
+ if (codePoint >= 0x1D7C4 && codePoint <= 0x1D7CB) // MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL .. MATHEMATICAL BOLD SMALL DIGAMMA
return true;
- if (codePoint >= 0x1d7ce && codePoint <= 0x1d7ff)
+ if (codePoint >= 0x1D7CE && codePoint <= 0x1D7FF) // MATHEMATICAL BOLD DIGIT ZERO .. MATHEMATICAL MONOSPACE DIGIT NINE
return true;
- if (codePoint >= 0x1da00 && codePoint <= 0x1da36)
+ if (codePoint >= 0x1DA00 && codePoint <= 0x1DA36) // SIGNWRITING HEAD RIM .. SIGNWRITING AIR SUCKING IN
return true;
- if (codePoint >= 0x1da3b && codePoint <= 0x1da6c)
+ if (codePoint >= 0x1DA3B && codePoint <= 0x1DA6C) // SIGNWRITING MOUTH CLOSED NEUTRAL .. SIGNWRITING EXCITEMENT
return true;
- if (codePoint >= 0x1da75 && codePoint <= 0x1da75)
+ if (codePoint >= 0x1DA75 && codePoint <= 0x1DA75) // SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS .. SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS
return true;
- if (codePoint >= 0x1da84 && codePoint <= 0x1da84)
+ if (codePoint >= 0x1DA84 && codePoint <= 0x1DA84) // SIGNWRITING LOCATION HEAD NECK .. SIGNWRITING LOCATION HEAD NECK
return true;
- if (codePoint >= 0x1da9b && codePoint <= 0x1da9f)
+ if (codePoint >= 0x1DA9B && codePoint <= 0x1DA9F) // SIGNWRITING FILL MODIFIER-2 .. SIGNWRITING FILL MODIFIER-6
return true;
- if (codePoint >= 0x1daa1 && codePoint <= 0x1daaf)
+ if (codePoint >= 0x1DAA1 && codePoint <= 0x1DAAF) // SIGNWRITING ROTATION MODIFIER-2 .. SIGNWRITING ROTATION MODIFIER-16
return true;
- if (codePoint >= 0x1e000 && codePoint <= 0x1e006)
+ if (codePoint >= 0x1E000 && codePoint <= 0x1E006) // COMBINING GLAGOLITIC LETTER AZU .. COMBINING GLAGOLITIC LETTER ZHIVETE
return true;
- if (codePoint >= 0x1e008 && codePoint <= 0x1e018)
+ if (codePoint >= 0x1E008 && codePoint <= 0x1E018) // COMBINING GLAGOLITIC LETTER ZEMLJA .. COMBINING GLAGOLITIC LETTER HERU
return true;
- if (codePoint >= 0x1e01b && codePoint <= 0x1e021)
+ if (codePoint >= 0x1E01B && codePoint <= 0x1E021) // COMBINING GLAGOLITIC LETTER SHTA .. COMBINING GLAGOLITIC LETTER YATI
return true;
- if (codePoint >= 0x1e023 && codePoint <= 0x1e024)
+ if (codePoint >= 0x1E023 && codePoint <= 0x1E024) // COMBINING GLAGOLITIC LETTER YU .. COMBINING GLAGOLITIC LETTER SMALL YUS
return true;
- if (codePoint >= 0x1e026 && codePoint <= 0x1e02a)
+ if (codePoint >= 0x1E026 && codePoint <= 0x1E02A) // COMBINING GLAGOLITIC LETTER YO .. COMBINING GLAGOLITIC LETTER FITA
return true;
- if (codePoint >= 0x1e800 && codePoint <= 0x1e8c4)
+ if (codePoint >= 0x1E800 && codePoint <= 0x1E8C4) // MENDE KIKAKUI SYLLABLE M001 KI .. MENDE KIKAKUI SYLLABLE M060 NYON
return true;
- if (codePoint >= 0x1e8d0 && codePoint <= 0x1e8d6)
+ if (codePoint >= 0x1E8D0 && codePoint <= 0x1E8D6) // MENDE KIKAKUI COMBINING NUMBER TEENS .. MENDE KIKAKUI COMBINING NUMBER MILLIONS
return true;
- if (codePoint >= 0x1e900 && codePoint <= 0x1e94a)
+ if (codePoint >= 0x1E900 && codePoint <= 0x1E94A) // ADLAM CAPITAL LETTER ALIF .. ADLAM NUKTA
return true;
- if (codePoint >= 0x1e950 && codePoint <= 0x1e959)
+ if (codePoint >= 0x1E950 && codePoint <= 0x1E959) // ADLAM DIGIT ZERO .. ADLAM DIGIT NINE
return true;
- if (codePoint >= 0x1ee00 && codePoint <= 0x1ee03)
+ if (codePoint >= 0x1EE00 && codePoint <= 0x1EE03) // ARABIC MATHEMATICAL ALEF .. ARABIC MATHEMATICAL DAL
return true;
- if (codePoint >= 0x1ee05 && codePoint <= 0x1ee1f)
+ if (codePoint >= 0x1EE05 && codePoint <= 0x1EE1F) // ARABIC MATHEMATICAL WAW .. ARABIC MATHEMATICAL DOTLESS QAF
return true;
- if (codePoint >= 0x1ee21 && codePoint <= 0x1ee22)
+ if (codePoint >= 0x1EE21 && codePoint <= 0x1EE22) // ARABIC MATHEMATICAL INITIAL BEH .. ARABIC MATHEMATICAL INITIAL JEEM
return true;
- if (codePoint >= 0x1ee24 && codePoint <= 0x1ee24)
+ if (codePoint >= 0x1EE24 && codePoint <= 0x1EE24) // ARABIC MATHEMATICAL INITIAL HEH .. ARABIC MATHEMATICAL INITIAL HEH
return true;
- if (codePoint >= 0x1ee27 && codePoint <= 0x1ee27)
+ if (codePoint >= 0x1EE27 && codePoint <= 0x1EE27) // ARABIC MATHEMATICAL INITIAL HAH .. ARABIC MATHEMATICAL INITIAL HAH
return true;
- if (codePoint >= 0x1ee29 && codePoint <= 0x1ee32)
+ if (codePoint >= 0x1EE29 && codePoint <= 0x1EE32) // ARABIC MATHEMATICAL INITIAL YEH .. ARABIC MATHEMATICAL INITIAL QAF
return true;
- if (codePoint >= 0x1ee34 && codePoint <= 0x1ee37)
+ if (codePoint >= 0x1EE34 && codePoint <= 0x1EE37) // ARABIC MATHEMATICAL INITIAL SHEEN .. ARABIC MATHEMATICAL INITIAL KHAH
return true;
- if (codePoint >= 0x1ee39 && codePoint <= 0x1ee39)
+ if (codePoint >= 0x1EE39 && codePoint <= 0x1EE39) // ARABIC MATHEMATICAL INITIAL DAD .. ARABIC MATHEMATICAL INITIAL DAD
return true;
- if (codePoint >= 0x1ee3b && codePoint <= 0x1ee3b)
+ if (codePoint >= 0x1EE3B && codePoint <= 0x1EE3B) // ARABIC MATHEMATICAL INITIAL GHAIN .. ARABIC MATHEMATICAL INITIAL GHAIN
return true;
- if (codePoint >= 0x1ee42 && codePoint <= 0x1ee42)
+ if (codePoint >= 0x1EE42 && codePoint <= 0x1EE42) // ARABIC MATHEMATICAL TAILED JEEM .. ARABIC MATHEMATICAL TAILED JEEM
return true;
- if (codePoint >= 0x1ee47 && codePoint <= 0x1ee47)
+ if (codePoint >= 0x1EE47 && codePoint <= 0x1EE47) // ARABIC MATHEMATICAL TAILED HAH .. ARABIC MATHEMATICAL TAILED HAH
return true;
- if (codePoint >= 0x1ee49 && codePoint <= 0x1ee49)
+ if (codePoint >= 0x1EE49 && codePoint <= 0x1EE49) // ARABIC MATHEMATICAL TAILED YEH .. ARABIC MATHEMATICAL TAILED YEH
return true;
- if (codePoint >= 0x1ee4b && codePoint <= 0x1ee4b)
+ if (codePoint >= 0x1EE4B && codePoint <= 0x1EE4B) // ARABIC MATHEMATICAL TAILED LAM .. ARABIC MATHEMATICAL TAILED LAM
return true;
- if (codePoint >= 0x1ee4d && codePoint <= 0x1ee4f)
+ if (codePoint >= 0x1EE4D && codePoint <= 0x1EE4F) // ARABIC MATHEMATICAL TAILED NOON .. ARABIC MATHEMATICAL TAILED AIN
return true;
- if (codePoint >= 0x1ee51 && codePoint <= 0x1ee52)
+ if (codePoint >= 0x1EE51 && codePoint <= 0x1EE52) // ARABIC MATHEMATICAL TAILED SAD .. ARABIC MATHEMATICAL TAILED QAF
return true;
- if (codePoint >= 0x1ee54 && codePoint <= 0x1ee54)
+ if (codePoint >= 0x1EE54 && codePoint <= 0x1EE54) // ARABIC MATHEMATICAL TAILED SHEEN .. ARABIC MATHEMATICAL TAILED SHEEN
return true;
- if (codePoint >= 0x1ee57 && codePoint <= 0x1ee57)
+ if (codePoint >= 0x1EE57 && codePoint <= 0x1EE57) // ARABIC MATHEMATICAL TAILED KHAH .. ARABIC MATHEMATICAL TAILED KHAH
return true;
- if (codePoint >= 0x1ee59 && codePoint <= 0x1ee59)
+ if (codePoint >= 0x1EE59 && codePoint <= 0x1EE59) // ARABIC MATHEMATICAL TAILED DAD .. ARABIC MATHEMATICAL TAILED DAD
return true;
- if (codePoint >= 0x1ee5b && codePoint <= 0x1ee5b)
+ if (codePoint >= 0x1EE5B && codePoint <= 0x1EE5B) // ARABIC MATHEMATICAL TAILED GHAIN .. ARABIC MATHEMATICAL TAILED GHAIN
return true;
- if (codePoint >= 0x1ee5d && codePoint <= 0x1ee5d)
+ if (codePoint >= 0x1EE5D && codePoint <= 0x1EE5D) // ARABIC MATHEMATICAL TAILED DOTLESS NOON .. ARABIC MATHEMATICAL TAILED DOTLESS NOON
return true;
- if (codePoint >= 0x1ee5f && codePoint <= 0x1ee5f)
+ if (codePoint >= 0x1EE5F && codePoint <= 0x1EE5F) // ARABIC MATHEMATICAL TAILED DOTLESS QAF .. ARABIC MATHEMATICAL TAILED DOTLESS QAF
return true;
- if (codePoint >= 0x1ee61 && codePoint <= 0x1ee62)
+ if (codePoint >= 0x1EE61 && codePoint <= 0x1EE62) // ARABIC MATHEMATICAL STRETCHED BEH .. ARABIC MATHEMATICAL STRETCHED JEEM
return true;
- if (codePoint >= 0x1ee64 && codePoint <= 0x1ee64)
+ if (codePoint >= 0x1EE64 && codePoint <= 0x1EE64) // ARABIC MATHEMATICAL STRETCHED HEH .. ARABIC MATHEMATICAL STRETCHED HEH
return true;
- if (codePoint >= 0x1ee67 && codePoint <= 0x1ee6a)
+ if (codePoint >= 0x1EE67 && codePoint <= 0x1EE6A) // ARABIC MATHEMATICAL STRETCHED HAH .. ARABIC MATHEMATICAL STRETCHED KAF
return true;
- if (codePoint >= 0x1ee6c && codePoint <= 0x1ee72)
+ if (codePoint >= 0x1EE6C && codePoint <= 0x1EE72) // ARABIC MATHEMATICAL STRETCHED MEEM .. ARABIC MATHEMATICAL STRETCHED QAF
return true;
- if (codePoint >= 0x1ee74 && codePoint <= 0x1ee77)
+ if (codePoint >= 0x1EE74 && codePoint <= 0x1EE77) // ARABIC MATHEMATICAL STRETCHED SHEEN .. ARABIC MATHEMATICAL STRETCHED KHAH
return true;
- if (codePoint >= 0x1ee79 && codePoint <= 0x1ee7c)
+ if (codePoint >= 0x1EE79 && codePoint <= 0x1EE7C) // ARABIC MATHEMATICAL STRETCHED DAD .. ARABIC MATHEMATICAL STRETCHED DOTLESS BEH
return true;
- if (codePoint >= 0x1ee7e && codePoint <= 0x1ee7e)
+ if (codePoint >= 0x1EE7E && codePoint <= 0x1EE7E) // ARABIC MATHEMATICAL STRETCHED DOTLESS FEH .. ARABIC MATHEMATICAL STRETCHED DOTLESS FEH
return true;
- if (codePoint >= 0x1ee80 && codePoint <= 0x1ee89)
+ if (codePoint >= 0x1EE80 && codePoint <= 0x1EE89) // ARABIC MATHEMATICAL LOOPED ALEF .. ARABIC MATHEMATICAL LOOPED YEH
return true;
- if (codePoint >= 0x1ee8b && codePoint <= 0x1ee9b)
+ if (codePoint >= 0x1EE8B && codePoint <= 0x1EE9B) // ARABIC MATHEMATICAL LOOPED LAM .. ARABIC MATHEMATICAL LOOPED GHAIN
return true;
- if (codePoint >= 0x1eea1 && codePoint <= 0x1eea3)
+ if (codePoint >= 0x1EEA1 && codePoint <= 0x1EEA3) // ARABIC MATHEMATICAL DOUBLE-STRUCK BEH .. ARABIC MATHEMATICAL DOUBLE-STRUCK DAL
return true;
- if (codePoint >= 0x1eea5 && codePoint <= 0x1eea9)
+ if (codePoint >= 0x1EEA5 && codePoint <= 0x1EEA9) // ARABIC MATHEMATICAL DOUBLE-STRUCK WAW .. ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
return true;
- if (codePoint >= 0x1eeab && codePoint <= 0x1eebb)
+ if (codePoint >= 0x1EEAB && codePoint <= 0x1EEBB) // ARABIC MATHEMATICAL DOUBLE-STRUCK LAM .. ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
return true;
- if (codePoint >= 0x20000 && codePoint <= 0x2a6d6)
+ if (codePoint >= 0x20000 && codePoint <= 0x2A6D6) // CJK Ideograph Extension B .. CJK Ideograph Extension B
return true;
- if (codePoint >= 0x2a700 && codePoint <= 0x2b734)
+ if (codePoint >= 0x2A700 && codePoint <= 0x2B734) // CJK Ideograph Extension C .. CJK Ideograph Extension C
return true;
- if (codePoint >= 0x2b740 && codePoint <= 0x2b81d)
+ if (codePoint >= 0x2B740 && codePoint <= 0x2B81D) // CJK Ideograph Extension D .. CJK Ideograph Extension D
return true;
- if (codePoint >= 0x2b820 && codePoint <= 0x2cea1)
+ if (codePoint >= 0x2B820 && codePoint <= 0x2CEA1) // CJK Ideograph Extension E .. CJK Ideograph Extension E
return true;
- if (codePoint >= 0x2ceb0 && codePoint <= 0x2ebe0)
+ if (codePoint >= 0x2CEB0 && codePoint <= 0x2EBE0) // CJK Ideograph Extension F .. CJK Ideograph Extension F
return true;
- if (codePoint >= 0x2f800 && codePoint <= 0x2fa1d)
+ if (codePoint >= 0x2F800 && codePoint <= 0x2FA1D) // CJK COMPATIBILITY IDEOGRAPH-2F800 .. CJK COMPATIBILITY IDEOGRAPH-2FA1D
return true;
- if (codePoint >= 0xe0100 && codePoint <= 0xe01ef)
+ if (codePoint >= 0xE0100 && codePoint <= 0xE01EF) // VARIATION SELECTOR-17 .. VARIATION SELECTOR-256
return true;
return false;
}
+
+bool
+js::unicode::CanUpperCaseSpecialCasing(char16_t ch)
+{
+ if (ch < 0x00DF || ch > 0xFB17)
+ return false;
+ if (ch <= 0x0587) {
+ // U+00DF LATIN SMALL LETTER SHARP S
+ // U+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N)
+ // U+01F0 LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK)
+ // U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS)
+ // U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS)
+ // U+0587 ARMENIAN SMALL LIGATURE ECH YIWN
+ return ch == 0x00DF || ch == 0x0149 || ch == 0x01F0 || ch == 0x0390 || ch == 0x03B0 ||
+ ch == 0x0587;
+ }
+ if (ch <= 0x1FFC) {
+ // U+1E96 LATIN SMALL LETTER H WITH LINE BELOW .. U+1E9A LATIN SMALL LETTER A WITH RIGHT HALF RING
+ if (ch <= 0x1E9A)
+ return ch >= 0x1E96;
+ if (ch < 0x1F50)
+ return false;
+ // U+1F50 GREEK SMALL LETTER UPSILON WITH PSILI
+ // U+1F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+ // U+1F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+ // U+1F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+ // U+1F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI .. U+1FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ // U+1FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI .. U+1FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+ // U+1FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI .. U+1FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+ // U+1FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+ // U+1FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI .. U+1FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+ // U+1FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI .. U+1FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+ // U+1FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+ // U+1FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA .. U+1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+ // U+1FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI .. U+1FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+ // U+1FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA .. U+1FE4 GREEK SMALL LETTER RHO WITH PSILI
+ // U+1FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI .. U+1FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+ // U+1FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI .. U+1FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+ // U+1FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI .. U+1FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+ // U+1FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+ return ch == 0x1F50 || ch == 0x1F52 || ch == 0x1F54 || ch == 0x1F56 ||
+ (ch >= 0x1F80 && ch <= 0x1FAF) || (ch >= 0x1FB2 && ch <= 0x1FB4) ||
+ (ch >= 0x1FB6 && ch <= 0x1FB7) || ch == 0x1FBC || (ch >= 0x1FC2 && ch <= 0x1FC4) ||
+ (ch >= 0x1FC6 && ch <= 0x1FC7) || ch == 0x1FCC || (ch >= 0x1FD2 && ch <= 0x1FD3) ||
+ (ch >= 0x1FD6 && ch <= 0x1FD7) || (ch >= 0x1FE2 && ch <= 0x1FE4) ||
+ (ch >= 0x1FE6 && ch <= 0x1FE7) || (ch >= 0x1FF2 && ch <= 0x1FF4) ||
+ (ch >= 0x1FF6 && ch <= 0x1FF7) || ch == 0x1FFC;
+ }
+ if (ch < 0xFB00)
+ return false;
+ // U+FB00 LATIN SMALL LIGATURE FF .. U+FB06 LATIN SMALL LIGATURE ST
+ // U+FB13 ARMENIAN SMALL LIGATURE MEN NOW .. U+FB17 ARMENIAN SMALL LIGATURE MEN XEH
+ return (ch >= 0xFB00 && ch <= 0xFB06) || (ch >= 0xFB13 && ch <= 0xFB17);
+}
+
+size_t
+js::unicode::LengthUpperCaseSpecialCasing(char16_t ch)
+{
+ switch(ch) {
+ case 0x00DF: return 2; // LATIN SMALL LETTER SHARP S
+ case 0x0149: return 2; // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N)
+ case 0x01F0: return 2; // LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK)
+ case 0x0390: return 3; // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS)
+ case 0x03B0: return 3; // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS)
+ case 0x0587: return 2; // ARMENIAN SMALL LIGATURE ECH YIWN
+ case 0x1E96: return 2; // LATIN SMALL LETTER H WITH LINE BELOW
+ case 0x1E97: return 2; // LATIN SMALL LETTER T WITH DIAERESIS
+ case 0x1E98: return 2; // LATIN SMALL LETTER W WITH RING ABOVE
+ case 0x1E99: return 2; // LATIN SMALL LETTER Y WITH RING ABOVE
+ case 0x1E9A: return 2; // LATIN SMALL LETTER A WITH RIGHT HALF RING
+ case 0x1F50: return 2; // GREEK SMALL LETTER UPSILON WITH PSILI
+ case 0x1F52: return 3; // GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+ case 0x1F54: return 3; // GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+ case 0x1F56: return 3; // GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+ case 0x1F80: return 2; // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+ case 0x1F81: return 2; // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+ case 0x1F82: return 2; // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ case 0x1F83: return 2; // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ case 0x1F84: return 2; // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ case 0x1F85: return 2; // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ case 0x1F86: return 2; // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1F87: return 2; // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1F88: return 2; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+ case 0x1F89: return 2; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+ case 0x1F8A: return 2; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ case 0x1F8B: return 2; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ case 0x1F8C: return 2; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ case 0x1F8D: return 2; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ case 0x1F8E: return 2; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ case 0x1F8F: return 2; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ case 0x1F90: return 2; // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+ case 0x1F91: return 2; // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+ case 0x1F92: return 2; // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ case 0x1F93: return 2; // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ case 0x1F94: return 2; // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ case 0x1F95: return 2; // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ case 0x1F96: return 2; // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1F97: return 2; // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1F98: return 2; // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+ case 0x1F99: return 2; // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+ case 0x1F9A: return 2; // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ case 0x1F9B: return 2; // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ case 0x1F9C: return 2; // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ case 0x1F9D: return 2; // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ case 0x1F9E: return 2; // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ case 0x1F9F: return 2; // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ case 0x1FA0: return 2; // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+ case 0x1FA1: return 2; // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+ case 0x1FA2: return 2; // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ case 0x1FA3: return 2; // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ case 0x1FA4: return 2; // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ case 0x1FA5: return 2; // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ case 0x1FA6: return 2; // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1FA7: return 2; // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1FA8: return 2; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+ case 0x1FA9: return 2; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+ case 0x1FAA: return 2; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ case 0x1FAB: return 2; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ case 0x1FAC: return 2; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ case 0x1FAD: return 2; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ case 0x1FAE: return 2; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ case 0x1FAF: return 2; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ case 0x1FB2: return 2; // GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+ case 0x1FB3: return 2; // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+ case 0x1FB4: return 2; // GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+ case 0x1FB6: return 2; // GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+ case 0x1FB7: return 3; // GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1FBC: return 2; // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+ case 0x1FC2: return 2; // GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+ case 0x1FC3: return 2; // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+ case 0x1FC4: return 2; // GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+ case 0x1FC6: return 2; // GREEK SMALL LETTER ETA WITH PERISPOMENI
+ case 0x1FC7: return 3; // GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1FCC: return 2; // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+ case 0x1FD2: return 3; // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+ case 0x1FD3: return 3; // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+ case 0x1FD6: return 2; // GREEK SMALL LETTER IOTA WITH PERISPOMENI
+ case 0x1FD7: return 3; // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+ case 0x1FE2: return 3; // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+ case 0x1FE3: return 3; // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+ case 0x1FE4: return 2; // GREEK SMALL LETTER RHO WITH PSILI
+ case 0x1FE6: return 2; // GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+ case 0x1FE7: return 3; // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+ case 0x1FF2: return 2; // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+ case 0x1FF3: return 2; // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+ case 0x1FF4: return 2; // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+ case 0x1FF6: return 2; // GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+ case 0x1FF7: return 3; // GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+ case 0x1FFC: return 2; // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+ case 0xFB00: return 2; // LATIN SMALL LIGATURE FF
+ case 0xFB01: return 2; // LATIN SMALL LIGATURE FI
+ case 0xFB02: return 2; // LATIN SMALL LIGATURE FL
+ case 0xFB03: return 3; // LATIN SMALL LIGATURE FFI
+ case 0xFB04: return 3; // LATIN SMALL LIGATURE FFL
+ case 0xFB05: return 2; // LATIN SMALL LIGATURE LONG S T
+ case 0xFB06: return 2; // LATIN SMALL LIGATURE ST
+ case 0xFB13: return 2; // ARMENIAN SMALL LIGATURE MEN NOW
+ case 0xFB14: return 2; // ARMENIAN SMALL LIGATURE MEN ECH
+ case 0xFB15: return 2; // ARMENIAN SMALL LIGATURE MEN INI
+ case 0xFB16: return 2; // ARMENIAN SMALL LIGATURE VEW NOW
+ case 0xFB17: return 2; // ARMENIAN SMALL LIGATURE MEN XEH
+ }
+
+ MOZ_ASSERT_UNREACHABLE("Bad character input.");
+ return 0;
+}
+
+void
+js::unicode::AppendUpperCaseSpecialCasing(char16_t ch, char16_t* elements, size_t* index)
+{
+ switch(ch) {
+ case 0x00DF: // LATIN SMALL LETTER SHARP S
+ elements[(*index)++] = 0x0053; // LATIN CAPITAL LETTER S
+ elements[(*index)++] = 0x0053; // LATIN CAPITAL LETTER S
+ return;
+ case 0x0149: // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N)
+ elements[(*index)++] = 0x02BC; // MODIFIER LETTER APOSTROPHE
+ elements[(*index)++] = 0x004E; // LATIN CAPITAL LETTER N
+ return;
+ case 0x01F0: // LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK)
+ elements[(*index)++] = 0x004A; // LATIN CAPITAL LETTER J
+ elements[(*index)++] = 0x030C; // COMBINING CARON (NON-SPACING HACEK)
+ return;
+ case 0x0390: // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS)
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
+ return;
+ case 0x03B0: // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS)
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
+ return;
+ case 0x0587: // ARMENIAN SMALL LIGATURE ECH YIWN
+ elements[(*index)++] = 0x0535; // ARMENIAN CAPITAL LETTER ECH
+ elements[(*index)++] = 0x0552; // ARMENIAN CAPITAL LETTER YIWN
+ return;
+ case 0x1E96: // LATIN SMALL LETTER H WITH LINE BELOW
+ elements[(*index)++] = 0x0048; // LATIN CAPITAL LETTER H
+ elements[(*index)++] = 0x0331; // COMBINING MACRON BELOW (NON-SPACING MACRON BELOW)
+ return;
+ case 0x1E97: // LATIN SMALL LETTER T WITH DIAERESIS
+ elements[(*index)++] = 0x0054; // LATIN CAPITAL LETTER T
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ return;
+ case 0x1E98: // LATIN SMALL LETTER W WITH RING ABOVE
+ elements[(*index)++] = 0x0057; // LATIN CAPITAL LETTER W
+ elements[(*index)++] = 0x030A; // COMBINING RING ABOVE (NON-SPACING RING ABOVE)
+ return;
+ case 0x1E99: // LATIN SMALL LETTER Y WITH RING ABOVE
+ elements[(*index)++] = 0x0059; // LATIN CAPITAL LETTER Y
+ elements[(*index)++] = 0x030A; // COMBINING RING ABOVE (NON-SPACING RING ABOVE)
+ return;
+ case 0x1E9A: // LATIN SMALL LETTER A WITH RIGHT HALF RING
+ elements[(*index)++] = 0x0041; // LATIN CAPITAL LETTER A
+ elements[(*index)++] = 0x02BE; // MODIFIER LETTER RIGHT HALF RING
+ return;
+ case 0x1F50: // GREEK SMALL LETTER UPSILON WITH PSILI
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
+ return;
+ case 0x1F52: // GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
+ elements[(*index)++] = 0x0300; // COMBINING GRAVE ACCENT (NON-SPACING GRAVE)
+ return;
+ case 0x1F54: // GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
+ elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
+ return;
+ case 0x1F56: // GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ return;
+ case 0x1F80: // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F08; // GREEK CAPITAL LETTER ALPHA WITH PSILI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F81: // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F09; // GREEK CAPITAL LETTER ALPHA WITH DASIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F82: // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F0A; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F83: // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F0B; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F84: // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F0C; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F85: // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F0D; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F86: // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F0E; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F87: // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F0F; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F88: // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F08; // GREEK CAPITAL LETTER ALPHA WITH PSILI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F89: // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F09; // GREEK CAPITAL LETTER ALPHA WITH DASIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F8A: // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F0A; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F8B: // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F0B; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F8C: // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F0C; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F8D: // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F0D; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F8E: // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F0E; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F8F: // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F0F; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F90: // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F28; // GREEK CAPITAL LETTER ETA WITH PSILI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F91: // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F29; // GREEK CAPITAL LETTER ETA WITH DASIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F92: // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F2A; // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F93: // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F2B; // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F94: // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F2C; // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F95: // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F2D; // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F96: // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F2E; // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F97: // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F2F; // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F98: // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F28; // GREEK CAPITAL LETTER ETA WITH PSILI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F99: // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F29; // GREEK CAPITAL LETTER ETA WITH DASIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F9A: // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F2A; // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F9B: // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F2B; // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F9C: // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F2C; // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F9D: // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F2D; // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F9E: // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F2E; // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1F9F: // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F2F; // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA0: // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F68; // GREEK CAPITAL LETTER OMEGA WITH PSILI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA1: // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F69; // GREEK CAPITAL LETTER OMEGA WITH DASIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA2: // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F6A; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA3: // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F6B; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA4: // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F6C; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA5: // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F6D; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA6: // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F6E; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA7: // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1F6F; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA8: // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F68; // GREEK CAPITAL LETTER OMEGA WITH PSILI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FA9: // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F69; // GREEK CAPITAL LETTER OMEGA WITH DASIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FAA: // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F6A; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FAB: // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F6B; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FAC: // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F6C; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FAD: // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F6D; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FAE: // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F6E; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FAF: // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ elements[(*index)++] = 0x1F6F; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FB2: // GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1FBA; // GREEK CAPITAL LETTER ALPHA WITH VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FB3: // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+ elements[(*index)++] = 0x0391; // GREEK CAPITAL LETTER ALPHA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FB4: // GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x0386; // GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS)
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FB6: // GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+ elements[(*index)++] = 0x0391; // GREEK CAPITAL LETTER ALPHA
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ return;
+ case 0x1FB7: // GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x0391; // GREEK CAPITAL LETTER ALPHA
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FBC: // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+ elements[(*index)++] = 0x0391; // GREEK CAPITAL LETTER ALPHA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FC2: // GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1FCA; // GREEK CAPITAL LETTER ETA WITH VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FC3: // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+ elements[(*index)++] = 0x0397; // GREEK CAPITAL LETTER ETA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FC4: // GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x0389; // GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS)
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FC6: // GREEK SMALL LETTER ETA WITH PERISPOMENI
+ elements[(*index)++] = 0x0397; // GREEK CAPITAL LETTER ETA
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ return;
+ case 0x1FC7: // GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x0397; // GREEK CAPITAL LETTER ETA
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FCC: // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+ elements[(*index)++] = 0x0397; // GREEK CAPITAL LETTER ETA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FD2: // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ elements[(*index)++] = 0x0300; // COMBINING GRAVE ACCENT (NON-SPACING GRAVE)
+ return;
+ case 0x1FD3: // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
+ return;
+ case 0x1FD6: // GREEK SMALL LETTER IOTA WITH PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ return;
+ case 0x1FD7: // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ return;
+ case 0x1FE2: // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ elements[(*index)++] = 0x0300; // COMBINING GRAVE ACCENT (NON-SPACING GRAVE)
+ return;
+ case 0x1FE3: // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
+ return;
+ case 0x1FE4: // GREEK SMALL LETTER RHO WITH PSILI
+ elements[(*index)++] = 0x03A1; // GREEK CAPITAL LETTER RHO
+ elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
+ return;
+ case 0x1FE6: // GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ return;
+ case 0x1FE7: // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+ elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
+ elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ return;
+ case 0x1FF2: // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x1FFA; // GREEK CAPITAL LETTER OMEGA WITH VARIA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FF3: // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+ elements[(*index)++] = 0x03A9; // GREEK CAPITAL LETTER OMEGA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FF4: // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x038F; // GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS)
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FF6: // GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+ elements[(*index)++] = 0x03A9; // GREEK CAPITAL LETTER OMEGA
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ return;
+ case 0x1FF7: // GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+ elements[(*index)++] = 0x03A9; // GREEK CAPITAL LETTER OMEGA
+ elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0x1FFC: // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+ elements[(*index)++] = 0x03A9; // GREEK CAPITAL LETTER OMEGA
+ elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
+ return;
+ case 0xFB00: // LATIN SMALL LIGATURE FF
+ elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
+ elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
+ return;
+ case 0xFB01: // LATIN SMALL LIGATURE FI
+ elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
+ elements[(*index)++] = 0x0049; // LATIN CAPITAL LETTER I
+ return;
+ case 0xFB02: // LATIN SMALL LIGATURE FL
+ elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
+ elements[(*index)++] = 0x004C; // LATIN CAPITAL LETTER L
+ return;
+ case 0xFB03: // LATIN SMALL LIGATURE FFI
+ elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
+ elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
+ elements[(*index)++] = 0x0049; // LATIN CAPITAL LETTER I
+ return;
+ case 0xFB04: // LATIN SMALL LIGATURE FFL
+ elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
+ elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
+ elements[(*index)++] = 0x004C; // LATIN CAPITAL LETTER L
+ return;
+ case 0xFB05: // LATIN SMALL LIGATURE LONG S T
+ elements[(*index)++] = 0x0053; // LATIN CAPITAL LETTER S
+ elements[(*index)++] = 0x0054; // LATIN CAPITAL LETTER T
+ return;
+ case 0xFB06: // LATIN SMALL LIGATURE ST
+ elements[(*index)++] = 0x0053; // LATIN CAPITAL LETTER S
+ elements[(*index)++] = 0x0054; // LATIN CAPITAL LETTER T
+ return;
+ case 0xFB13: // ARMENIAN SMALL LIGATURE MEN NOW
+ elements[(*index)++] = 0x0544; // ARMENIAN CAPITAL LETTER MEN
+ elements[(*index)++] = 0x0546; // ARMENIAN CAPITAL LETTER NOW
+ return;
+ case 0xFB14: // ARMENIAN SMALL LIGATURE MEN ECH
+ elements[(*index)++] = 0x0544; // ARMENIAN CAPITAL LETTER MEN
+ elements[(*index)++] = 0x0535; // ARMENIAN CAPITAL LETTER ECH
+ return;
+ case 0xFB15: // ARMENIAN SMALL LIGATURE MEN INI
+ elements[(*index)++] = 0x0544; // ARMENIAN CAPITAL LETTER MEN
+ elements[(*index)++] = 0x053B; // ARMENIAN CAPITAL LETTER INI
+ return;
+ case 0xFB16: // ARMENIAN SMALL LIGATURE VEW NOW
+ elements[(*index)++] = 0x054E; // ARMENIAN CAPITAL LETTER VEW
+ elements[(*index)++] = 0x0546; // ARMENIAN CAPITAL LETTER NOW
+ return;
+ case 0xFB17: // ARMENIAN SMALL LIGATURE MEN XEH
+ elements[(*index)++] = 0x0544; // ARMENIAN CAPITAL LETTER MEN
+ elements[(*index)++] = 0x053D; // ARMENIAN CAPITAL LETTER XEH
+ return;
+ }
+
+ MOZ_ASSERT_UNREACHABLE("Bad character input.");
+ return;
+}
diff --git a/js/src/vm/Unicode.h b/js/src/vm/Unicode.h
index d8807a4deb..3f87e47fb6 100644
--- a/js/src/vm/Unicode.h
+++ b/js/src/vm/Unicode.h
@@ -62,8 +62,16 @@ namespace CharFlag {
const uint8_t UNICODE_ID_CONTINUE = UNICODE_ID_START + UNICODE_ID_CONTINUE_ONLY;
}
+const char16_t NO_BREAK_SPACE = 0x00A0;
+const char16_t MICRO_SIGN = 0x00B5;
+const char16_t LATIN_SMALL_LETTER_SHARP_S = 0x00DF;
+const char16_t LATIN_SMALL_LETTER_Y_WITH_DIAERESIS = 0x00FF;
+const char16_t LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE = 0x0130;
+const char16_t COMBINING_DOT_ABOVE = 0x0307;
+const char16_t GREEK_CAPITAL_LETTER_SIGMA = 0x03A3;
+const char16_t GREEK_SMALL_LETTER_FINAL_SIGMA = 0x03C2;
+const char16_t GREEK_SMALL_LETTER_SIGMA = 0x03C3;
const char16_t BYTE_ORDER_MARK2 = 0xFFFE;
-const char16_t NO_BREAK_SPACE = 0x00A0;
const char16_t LeadSurrogateMin = 0xD800;
const char16_t LeadSurrogateMax = 0xDBFF;
@@ -239,6 +247,10 @@ IsSpaceOrBOM2(char16_t ch)
return CharInfo(ch).isSpace();
}
+/*
+ * Returns the simple upper case mapping (see CanUpperCaseSpecialCasing for
+ * details) of the given UTF-16 code unit.
+ */
inline char16_t
ToUpperCase(char16_t ch)
{
@@ -253,6 +265,10 @@ ToUpperCase(char16_t ch)
return uint16_t(ch) + info.upperCase;
}
+/*
+ * Returns the simple lower case mapping (see CanUpperCaseSpecialCasing for
+ * details) of the given UTF-16 code unit.
+ */
inline char16_t
ToLowerCase(char16_t ch)
{
@@ -330,6 +346,43 @@ ToLowerCaseNonBMPTrail(char16_t lead, char16_t trail)
}
/*
+ * Returns true if the given UTF-16 code unit has a language-independent,
+ * unconditional or conditional special upper case mapping.
+ *
+ * Unicode defines two case mapping modes:
+ * 1. "simple case mappings" for one-to-one mappings which are independent of
+ * context and language (defined in UnicodeData.txt).
+ * 2. "special case mappings" for mappings which can increase or decrease the
+ * string length; or are dependent on context or locale (defined in
+ * SpecialCasing.txt).
+ *
+ * The CanUpperCase() method defined above only supports simple case mappings.
+ * In order to support the full case mappings of all Unicode characters,
+ * callers need to check this method in addition to CanUpperCase().
+ *
+ * NOTE: All special upper case mappings are unconditional in Unicode 9.
+ */
+bool
+CanUpperCaseSpecialCasing(char16_t ch);
+
+/*
+ * Returns the length of the upper case mapping of |ch|.
+ *
+ * This function asserts if |ch| doesn't have a special upper case mapping.
+ */
+size_t
+LengthUpperCaseSpecialCasing(char16_t ch);
+
+/*
+ * Appends the upper case mapping of |ch| to the given output buffer,
+ * starting at the provided index.
+ *
+ * This function asserts if |ch| doesn't have a special upper case mapping.
+ */
+void
+AppendUpperCaseSpecialCasing(char16_t ch, char16_t* elements, size_t* index);
+
+/*
* For a codepoint C, CodepointsWithSameUpperCaseInfo stores three offsets
* from C to up to three codepoints with same uppercase (no codepoint in
* UnicodeData.txt has more than three such codepoints).
@@ -504,7 +557,7 @@ UTF16Encode(uint32_t codePoint, char16_t* lead, char16_t* trail)
*trail = TrailSurrogate(codePoint);
}
-static inline void
+inline void
UTF16Encode(uint32_t codePoint, char16_t* elements, unsigned* index)
{
if (!IsSupplementary(codePoint)) {
diff --git a/js/src/vm/UnicodeNonBMP.h b/js/src/vm/UnicodeNonBMP.h
index 687c1851e6..8b9fb2a4f2 100644
--- a/js/src/vm/UnicodeNonBMP.h
+++ b/js/src/vm/UnicodeNonBMP.h
@@ -19,6 +19,12 @@
// DIFF: the difference between the code point in the range and
// converted code point
+// U+10400 DESERET CAPITAL LETTER LONG I .. U+10427 DESERET CAPITAL LETTER EW
+// U+104B0 OSAGE CAPITAL LETTER A .. U+104D3 OSAGE CAPITAL LETTER ZHA
+// U+10C80 OLD HUNGARIAN CAPITAL LETTER A .. U+10CB2 OLD HUNGARIAN CAPITAL LETTER US
+// U+118A0 WARANG CITI CAPITAL LETTER NGAA .. U+118BF WARANG CITI CAPITAL LETTER VIYO
+// U+16E40 MEDEFAIDRIN CAPITAL LETTER M .. U+16E5F MEDEFAIDRIN CAPITAL LETTER Y
+// U+1E900 ADLAM CAPITAL LETTER ALIF .. U+1E921 ADLAM CAPITAL LETTER SHA
#define FOR_EACH_NON_BMP_LOWERCASE(macro) \
macro(0x10400, 0x10427, 0xd801, 0xdc00, 0xdc27, 40) \
macro(0x104b0, 0x104d3, 0xd801, 0xdcb0, 0xdcd3, 40) \
@@ -27,6 +33,12 @@
macro(0x16e40, 0x16e5f, 0xd81b, 0xde40, 0xde5f, 32) \
macro(0x1e900, 0x1e921, 0xd83a, 0xdd00, 0xdd21, 34)
+// U+10428 DESERET SMALL LETTER LONG I .. U+1044F DESERET SMALL LETTER EW
+// U+104D8 OSAGE SMALL LETTER A .. U+104FB OSAGE SMALL LETTER ZHA
+// U+10CC0 OLD HUNGARIAN SMALL LETTER A .. U+10CF2 OLD HUNGARIAN SMALL LETTER US
+// U+118C0 WARANG CITI SMALL LETTER NGAA .. U+118DF WARANG CITI SMALL LETTER VIYO
+// U+16E60 MEDEFAIDRIN SMALL LETTER M .. U+16E7F MEDEFAIDRIN SMALL LETTER Y
+// U+1E922 ADLAM SMALL LETTER ALIF .. U+1E943 ADLAM SMALL LETTER SHA
#define FOR_EACH_NON_BMP_UPPERCASE(macro) \
macro(0x10428, 0x1044f, 0xd801, 0xdc28, 0xdc4f, -40) \
macro(0x104d8, 0x104fb, 0xd801, 0xdcd8, 0xdcfb, -40) \
@@ -35,6 +47,12 @@
macro(0x16e60, 0x16e7f, 0xd81b, 0xde60, 0xde7f, -32) \
macro(0x1e922, 0x1e943, 0xd83a, 0xdd22, 0xdd43, -34)
+// U+10400 DESERET CAPITAL LETTER LONG I .. U+10427 DESERET CAPITAL LETTER EW
+// U+104B0 OSAGE CAPITAL LETTER A .. U+104D3 OSAGE CAPITAL LETTER ZHA
+// U+10C80 OLD HUNGARIAN CAPITAL LETTER A .. U+10CB2 OLD HUNGARIAN CAPITAL LETTER US
+// U+118A0 WARANG CITI CAPITAL LETTER NGAA .. U+118BF WARANG CITI CAPITAL LETTER VIYO
+// U+16E40 MEDEFAIDRIN CAPITAL LETTER M .. U+16E5F MEDEFAIDRIN CAPITAL LETTER Y
+// U+1E900 ADLAM CAPITAL LETTER ALIF .. U+1E921 ADLAM CAPITAL LETTER SHA
#define FOR_EACH_NON_BMP_CASE_FOLDING(macro) \
macro(0x10400, 0x10427, 0xd801, 0xdc00, 0xdc27, 40) \
macro(0x104b0, 0x104d3, 0xd801, 0xdcb0, 0xdcd3, 40) \
@@ -43,6 +61,12 @@
macro(0x16e40, 0x16e5f, 0xd81b, 0xde40, 0xde5f, 32) \
macro(0x1e900, 0x1e921, 0xd83a, 0xdd00, 0xdd21, 34)
+// U+10428 DESERET SMALL LETTER LONG I .. U+1044F DESERET SMALL LETTER EW
+// U+104D8 OSAGE SMALL LETTER A .. U+104FB OSAGE SMALL LETTER ZHA
+// U+10CC0 OLD HUNGARIAN SMALL LETTER A .. U+10CF2 OLD HUNGARIAN SMALL LETTER US
+// U+118C0 WARANG CITI SMALL LETTER NGAA .. U+118DF WARANG CITI SMALL LETTER VIYO
+// U+16E60 MEDEFAIDRIN SMALL LETTER M .. U+16E7F MEDEFAIDRIN SMALL LETTER Y
+// U+1E922 ADLAM SMALL LETTER ALIF .. U+1E943 ADLAM SMALL LETTER SHA
#define FOR_EACH_NON_BMP_REV_CASE_FOLDING(macro) \
macro(0x10428, 0x1044f, 0xd801, 0xdc28, 0xdc4f, -40) \
macro(0x104d8, 0x104fb, 0xd801, 0xdcd8, 0xdcfb, -40) \
diff --git a/js/src/vm/make_unicode.py b/js/src/vm/make_unicode.py
index b55b1940e4..8568ccb64c 100755
--- a/js/src/vm/make_unicode.py
+++ b/js/src/vm/make_unicode.py
@@ -26,6 +26,18 @@ import re
import os
import sys
from contextlib import closing
+from functools import partial
+from itertools import chain, groupby, ifilter, imap, izip_longest, tee
+from operator import is_not, itemgetter
+
+class codepoint_dict(dict):
+ def name(self, code_point):
+ (_, _, name, alias) = self[code_point]
+ return '{}{}'.format(name, (' (' + alias + ')' if alias else ''))
+
+ def full_name(self, code_point):
+ (_, _, name, alias) = self[code_point]
+ return 'U+{:04X} {}{}'.format(code_point, name, (' (' + alias + ')' if alias else ''))
# ECMAScript 2016
# §11.2 White Space
@@ -132,10 +144,32 @@ def read_derived_core_properties(derived_core_properties):
for char in range(int(start, 16), int(end, 16) + 1):
yield (char, char_property)
+def read_special_casing(special_casing):
+ # Format:
+ # <code>; <lower>; <title>; <upper>; (<condition_list>;)? # <comment>
+ for line in special_casing:
+ if line == '\n' or line.startswith('#'):
+ continue
+ row = line.split('#')[0].split(';')
+ code = int(row[0].strip(), 16)
+ lower = row[1].strip()
+ lower = [int(c, 16) for c in lower.split(' ')] if lower else []
+ upper = row[3].strip()
+ upper = [int(c, 16) for c in upper.split(' ')] if upper else []
+ languages = []
+ contexts = []
+ condition = row[4].strip()
+ if condition:
+ for cond in condition.split(' '):
+ if cond[0].islower():
+ languages.append(cond)
+ else:
+ contexts.append(cond)
+ pass
+ yield (code, lower, upper, languages, contexts)
+
def int_ranges(ints):
""" Yields consecutive ranges (inclusive) from integer values. """
- from itertools import tee, izip_longest
-
(a, b) = tee(sorted(ints))
start = next(b)
for (curr, succ) in izip_longest(a, b):
@@ -153,7 +187,7 @@ def utf16_encode(code):
return lead, trail
-def make_non_bmp_convert_macro(out_file, name, convert_map):
+def make_non_bmp_convert_macro(out_file, name, convert_map, codepoint_table):
# Find continuous range in convert_map.
convert_list = []
entry = None
@@ -179,6 +213,7 @@ def make_non_bmp_convert_macro(out_file, name, convert_map):
# Generate macro call for each range.
lines = []
+ comment = []
for entry in convert_list:
from_code = entry['code']
to_code = entry['code'] + entry['length'] - 1
@@ -190,29 +225,15 @@ def make_non_bmp_convert_macro(out_file, name, convert_map):
lines.append(' macro(0x{:x}, 0x{:x}, 0x{:x}, 0x{:x}, 0x{:x}, {:d})'.format(
from_code, to_code, lead, from_trail, to_trail, diff))
+ comment.append('// {} .. {}'.format(codepoint_table.full_name(from_code),
+ codepoint_table.full_name(to_code)))
+ out_file.write('\n'.join(comment))
+ out_file.write('\n')
out_file.write('#define FOR_EACH_NON_BMP_{}(macro) \\\n'.format(name))
out_file.write(' \\\n'.join(lines))
out_file.write('\n')
-def for_each_non_bmp_group(group_set):
- # Find continuous range in group_set.
- group_list = []
- entry = None
- for code in sorted(group_set.keys()):
- if entry and code == entry['code'] + entry['length']:
- entry['length'] += 1
- continue
-
- entry = {
- 'code': code,
- 'length': 1
- }
- group_list.append(entry)
-
- for entry in group_list:
- yield (entry['code'], entry['code'] + entry['length'] - 1)
-
def process_derived_core_properties(derived_core_properties):
id_start = set()
id_continue = set()
@@ -236,7 +257,7 @@ def process_unicode_data(unicode_data, derived_core_properties):
same_upper_cache = {same_upper_dummy: 0}
same_upper_index = [0] * (MAX_BMP + 1)
- test_table = {}
+ codepoint_table = codepoint_dict()
test_space_table = []
non_bmp_lower_map = {}
@@ -254,15 +275,9 @@ def process_unicode_data(unicode_data, derived_core_properties):
alias = row[-5]
uppercase = row[-3]
lowercase = row[-2]
- flags = 0
if uppercase:
upper = int(uppercase, 16)
-
- if upper not in same_upper_map:
- same_upper_map[upper] = [code]
- else:
- same_upper_map[upper].append(code)
else:
upper = code
@@ -271,6 +286,8 @@ def process_unicode_data(unicode_data, derived_core_properties):
else:
lower = code
+ codepoint_table[code] = (upper, lower, name, alias)
+
if code > MAX_BMP:
if code != lower:
non_bmp_lower_map[code] = lower
@@ -285,6 +302,16 @@ def process_unicode_data(unicode_data, derived_core_properties):
non_bmp_id_cont_set[code] = 1
continue
+ assert lower <= MAX_BMP and upper <= MAX_BMP
+
+ if code != upper:
+ if upper not in same_upper_map:
+ same_upper_map[upper] = [code]
+ else:
+ same_upper_map[upper].append(code)
+
+ flags = 0
+
# we combine whitespace and lineterminators because in pratice we don't need them separated
if category == 'Zs' or code in whitespace or code in line_terminator:
flags |= FLAG_SPACE
@@ -298,8 +325,6 @@ def process_unicode_data(unicode_data, derived_core_properties):
elif code in id_continue or code in compatibility_identifier_part:
flags |= FLAG_UNICODE_ID_CONTINUE_ONLY
- test_table[code] = (upper, lower, name, alias)
-
up_d = upper - code
low_d = lower - code
@@ -319,12 +344,12 @@ def process_unicode_data(unicode_data, derived_core_properties):
index[code] = i
for code in range(0, MAX_BMP + 1):
- entry = test_table.get(code)
+ entry = codepoint_table.get(code)
if not entry:
continue
- (upper, lower, name, alias) = entry
+ (upper, _, _, _) = entry
if upper not in same_upper_map:
continue
@@ -354,7 +379,7 @@ def process_unicode_data(unicode_data, derived_core_properties):
non_bmp_lower_map, non_bmp_upper_map,
non_bmp_space_set,
non_bmp_id_start_set, non_bmp_id_cont_set,
- test_table, test_space_table,
+ codepoint_table, test_space_table,
)
def process_case_folding(case_folding):
@@ -438,9 +463,149 @@ def process_case_folding(case_folding):
folding_tests
)
+def process_special_casing(special_casing, table, index):
+ # Unconditional special casing.
+ unconditional_tolower = {}
+ unconditional_toupper = {}
+
+ # Conditional special casing, language independent.
+ conditional_tolower = {}
+ conditional_toupper = {}
+
+ # Conditional special casing, language dependent.
+ lang_conditional_tolower = {}
+ lang_conditional_toupper = {}
+
+ def caseInfo(code):
+ (upper, lower, flags) = table[index[code]]
+ return ((code + lower) & 0xffff, (code + upper) & 0xffff)
+
+ for (code, lower, upper, languages, contexts) in read_special_casing(special_casing):
+ assert code <= MAX_BMP, 'Unexpected character outside of BMP: %s' % code
+ assert len(languages) <= 1, 'Expected zero or one language ids: %s' % languages
+ assert len(contexts) <= 1, 'Expected zero or one casing contexts: %s' % languages
+
+ (default_lower, default_upper) = caseInfo(code)
+ special_lower = len(lower) != 1 or lower[0] != default_lower
+ special_upper = len(upper) != 1 or upper[0] != default_upper
+
+ # Invariant: If |code| has casing per UnicodeData.txt, then it also has
+ # casing rules in SpecialCasing.txt.
+ assert code == default_lower or len(lower) != 1 or code != lower[0]
+ assert code == default_upper or len(upper) != 1 or code != upper[0]
+
+ language = languages[0] if languages else None
+ context = contexts[0] if contexts else None
+
+ if not language and not context:
+ if special_lower:
+ unconditional_tolower[code] = lower
+ if special_upper:
+ unconditional_toupper[code] = upper
+ elif not language and context:
+ if special_lower:
+ conditional_tolower[code] = (lower, context)
+ if special_upper:
+ conditional_toupper[code] = (upper, context)
+ else:
+ if language not in lang_conditional_tolower:
+ lang_conditional_tolower[language] = {}
+ lang_conditional_toupper[language] = {}
+ if special_lower:
+ lang_conditional_tolower[language][code] = (lower, context)
+ if special_upper:
+ lang_conditional_toupper[language][code] = (upper, context)
+
+ # Certain special casing rules are inlined in jsstr.cpp, ensure these cases
+ # still match the current SpecialCasing.txt file.
+ def lowerCase(code):
+ (lower, _) = caseInfo(code)
+ return lower
+
+ def upperCase(code):
+ (_, upper) = caseInfo(code)
+ return upper
+
+ def ascii(char_dict):
+ return ifilter(lambda ch: ch <= 0x7f, char_dict.iterkeys())
+
+ def latin1(char_dict):
+ return ifilter(lambda ch: ch <= 0xff, char_dict.iterkeys())
+
+ def is_empty(iterable):
+ return not any(True for _ in iterable)
+
+ def is_equals(iter1, iter2):
+ return all(x == y for (x, y) in izip_longest(iter1, iter2))
+
+ # Ensure no ASCII characters have special case mappings.
+ assert is_empty(ascii(unconditional_tolower))
+ assert is_empty(ascii(unconditional_toupper))
+ assert is_empty(ascii(conditional_tolower))
+ assert is_empty(ascii(conditional_toupper))
+
+ # Ensure no Latin1 characters have special lower case mappings.
+ assert is_empty(latin1(unconditional_tolower))
+ assert is_empty(latin1(conditional_tolower))
+
+ # Ensure no Latin1 characters have conditional special upper case mappings.
+ assert is_empty(latin1(conditional_toupper))
+
+ # Ensure U+00DF is the only Latin1 character with a special upper case mapping.
+ assert is_equals([0x00DF], latin1(unconditional_toupper))
+
+ # Ensure U+0130 is the only character with a special lower case mapping.
+ assert is_equals([0x0130], unconditional_tolower)
+
+ # Ensure no characters have language independent conditional upper case mappings.
+ assert is_empty(conditional_toupper)
+
+ # Ensure U+03A3 is the only character with language independent conditional lower case mapping.
+ assert is_equals([0x03A3], conditional_tolower)
+
+ # Verify U+0130 and U+03A3 have simple lower case mappings.
+ assert all(ch != lowerCase(ch) for ch in [0x0130, 0x03A3])
+
+ # Ensure Azeri, Lithuanian, and Turkish are the only languages with conditional case mappings.
+ assert is_equals(["az", "lt", "tr"], sorted(lang_conditional_tolower.iterkeys()))
+ assert is_equals(["az", "lt", "tr"], sorted(lang_conditional_toupper.iterkeys()))
+
+ # Maximum case mapping length is three characters.
+ itervals = lambda d: d.itervalues()
+ assert max(imap(len, chain(
+ itervals(unconditional_tolower),
+ itervals(unconditional_toupper),
+ imap(itemgetter(0), itervals(conditional_tolower)),
+ imap(itemgetter(0), itervals(conditional_toupper)),
+ imap(itemgetter(0), chain.from_iterable(imap(itervals, itervals(lang_conditional_tolower)))),
+ imap(itemgetter(0), chain.from_iterable(imap(itervals, itervals(lang_conditional_toupper)))),
+ ))) <= 3
+
+ # Ensure all case mapping contexts are known (see Unicode 9.0, §3.13 Default Case Algorithms).
+ assert set([
+ 'After_I', 'After_Soft_Dotted', 'Final_Sigma', 'More_Above', 'Not_Before_Dot',
+ ]).issuperset(set(ifilter(partial(is_not, None), chain(
+ imap(itemgetter(1), itervals(conditional_tolower)),
+ imap(itemgetter(1), itervals(conditional_toupper)),
+ imap(itemgetter(1), chain.from_iterable(imap(itervals, itervals(lang_conditional_tolower)))),
+ imap(itemgetter(1), chain.from_iterable(imap(itervals, itervals(lang_conditional_toupper)))),
+ ))))
+
+ # Special casing for U+00DF (LATIN SMALL LETTER SHARP S).
+ assert upperCase(0x00DF) == 0x00DF and unconditional_toupper[0x00DF] == [0x0053, 0x0053];
+
+ # Special casing for U+0130 (LATIN CAPITAL LETTER I WITH DOT ABOVE).
+ assert unconditional_tolower[0x0130] == [0x0069, 0x0307]
+
+ # Special casing for U+03A3 (GREEK CAPITAL LETTER SIGMA).
+ assert lowerCase(0x03A3) == 0x03C3 and conditional_tolower[0x03A3] == ([0x03C2], 'Final_Sigma');
+
+ return (unconditional_tolower, unconditional_toupper)
+
def make_non_bmp_file(version,
non_bmp_lower_map, non_bmp_upper_map,
- non_bmp_folding_map, non_bmp_rev_folding_map):
+ non_bmp_folding_map, non_bmp_rev_folding_map,
+ codepoint_table):
file_name = 'UnicodeNonBMP.h';
with io.open(file_name, mode='wb') as non_bmp_file:
non_bmp_file.write(mpl_license)
@@ -463,77 +628,277 @@ def make_non_bmp_file(version,
""")
- make_non_bmp_convert_macro(non_bmp_file, 'LOWERCASE', non_bmp_lower_map)
+ make_non_bmp_convert_macro(non_bmp_file, 'LOWERCASE', non_bmp_lower_map, codepoint_table)
non_bmp_file.write('\n')
- make_non_bmp_convert_macro(non_bmp_file, 'UPPERCASE', non_bmp_upper_map)
+ make_non_bmp_convert_macro(non_bmp_file, 'UPPERCASE', non_bmp_upper_map, codepoint_table)
non_bmp_file.write('\n')
- make_non_bmp_convert_macro(non_bmp_file, 'CASE_FOLDING', non_bmp_folding_map)
+ make_non_bmp_convert_macro(non_bmp_file, 'CASE_FOLDING', non_bmp_folding_map, codepoint_table)
non_bmp_file.write('\n')
- make_non_bmp_convert_macro(non_bmp_file, 'REV_CASE_FOLDING', non_bmp_rev_folding_map)
+ make_non_bmp_convert_macro(non_bmp_file, 'REV_CASE_FOLDING', non_bmp_rev_folding_map, codepoint_table)
non_bmp_file.write("""
#endif /* vm_UnicodeNonBMP_h */
""")
-def make_bmp_mapping_test(version, test_table):
+def write_special_casing_methods(unconditional_toupper, codepoint_table, println):
+ def hexlit(n):
+ """ Returns C++ hex-literal for |n|. """
+ return '0x{:04X}'.format(n)
+
+ def describe_range(ranges, depth):
+ indent = depth * ' '
+ for (start, end) in ranges:
+ if start == end:
+ println(indent, '// {}'.format(codepoint_table.full_name(start)))
+ else:
+ println(indent, '// {} .. {}'.format(codepoint_table.full_name(start),
+ codepoint_table.full_name(end)))
+
+ def out_range(start, end):
+ """ Tests if the input character isn't a member of the set {x | start <= x <= end}. """
+ if (start == end):
+ return 'ch != {}'.format(hexlit(start))
+ return 'ch < {} || ch > {}'.format(hexlit(start), hexlit(end))
+
+ def in_range(start, end, parenthesize=False):
+ """ Tests if the input character is in the set {x | start <= x <= end}. """
+ if (start == end):
+ return 'ch == {}'.format(hexlit(start))
+ (left, right) = ('(', ')') if parenthesize else ('', '')
+ return '{}ch >= {} && ch <= {}{}'.format(left, hexlit(start), hexlit(end), right)
+
+ def in_any_range(ranges, spaces):
+ """ Tests if the input character is included in any of the given ranges. """
+ lines = [[]]
+ for (start, end) in ranges:
+ expr = in_range(start, end, parenthesize=True)
+ line = ' || '.join(lines[-1] + [expr])
+ if len(line) < (100 - len(spaces) - len(' ||')):
+ lines[-1].append(expr)
+ else:
+ lines.append([expr])
+ return ' ||\n{}'.format(spaces).join(imap(lambda t: ' || '.join(t), lines))
+
+ def write_range_accept(parent_list, child_list, depth):
+ """ Accepts the input character if it matches any code unit in |child_list|. """
+ (min_parent, max_parent) = (parent_list[0], parent_list[-1])
+ (min_child, max_child) = (child_list[0], child_list[-1])
+ assert min_child >= min_parent
+ assert max_child <= max_parent
+ indent = depth * ' '
+
+ child_ranges = list(int_ranges(child_list))
+ has_successor = max_child != max_parent
+
+ # If |child_list| is a contiguous list of code units, emit a simple
+ # range check: |min_child <= input <= max_child|.
+ if len(child_ranges) == 1:
+ describe_range(child_ranges, depth)
+ if has_successor:
+ println(indent, 'if (ch <= {})'.format(hexlit(max_child)))
+ println(indent, ' return ch >= {};'.format(hexlit(min_child)))
+ else:
+ println(indent, 'return {};'.format(in_range(min_child, max_child)))
+ return
+
+ # Otherwise create a disjunction over the subranges in |child_ranges|.
+ if not has_successor:
+ spaces = indent + len('return ') * ' '
+ else:
+ spaces = indent + len(' return ') * ' '
+ range_test_expr = in_any_range(child_ranges, spaces)
+
+ if min_child != min_parent:
+ println(indent, 'if (ch < {})'.format(hexlit(min_child)))
+ println(indent, ' return false;')
+
+ # If there's no successor block, we can omit the |input <= max_child| check,
+ # because it was already checked when we emitted the parent range test.
+ if not has_successor:
+ describe_range(child_ranges, depth)
+ println(indent, 'return {};'.format(range_test_expr))
+ else:
+ println(indent, 'if (ch <= {}) {{'.format(hexlit(max_child)))
+ describe_range(child_ranges, depth + 1)
+ println(indent, ' return {};'.format(range_test_expr))
+ println(indent, '}')
+
+ def write_CanUpperCaseSpecialCasing():
+ """ Checks if the input has a special upper case mapping. """
+ println('bool')
+ println('js::unicode::CanUpperCaseSpecialCasing(char16_t ch)')
+ println('{')
+
+ assert unconditional_toupper, "|unconditional_toupper| is not empty"
+
+ # Sorted list of code units with special upper case mappings.
+ code_list = sorted(unconditional_toupper.iterkeys())
+
+ # Fail-fast if the input character isn't a special casing character.
+ println(' if ({})'.format(out_range(code_list[0], code_list[-1])))
+ println(' return false;')
+
+ for i in range(0, 16):
+ # Check if the input characters is in the range:
+ # |start_point <= input < end_point|.
+ start_point = i << 12
+ end_point = (i + 1) << 12
+ matches = [cu for cu in code_list if start_point <= cu < end_point]
+
+ # Skip empty ranges.
+ if not matches:
+ continue
+
+ # If |matches| consists of only a few characters, directly check
+ # the input against the characters in |matches|.
+ if len(matches) <= 8:
+ write_range_accept(code_list, matches, depth=1)
+ continue
+
+ # Otherwise split into further subranges.
+
+ # Only enter the if-block if the input is less-or-equals to the
+ # largest value in the current range.
+ is_last_block = matches[-1] == code_list[-1]
+ if not is_last_block:
+ println(' if (ch <= {}) {{'.format(hexlit(matches[-1])))
+ else:
+ println(' if (ch < {})'.format(hexlit(matches[0])))
+ println(' return false;')
+
+ for j in range(0, 16):
+ inner_start = start_point + (j << 8)
+ inner_end = start_point + ((j + 1) << 8)
+ inner_matches = [cu for cu in matches if inner_start <= cu < inner_end]
+
+ if inner_matches:
+ d = 1 if is_last_block else 2
+ write_range_accept(matches, inner_matches, depth=d)
+
+ if not is_last_block:
+ println(' }')
+
+ println('}')
+
+ def write_LengthUpperCaseSpecialCasing():
+ """ Slow case: Special casing character was found, returns its mapping length. """
+ println('size_t')
+ println('js::unicode::LengthUpperCaseSpecialCasing(char16_t ch)')
+ println('{')
+
+ println(' switch(ch) {')
+ for (code, converted) in sorted(unconditional_toupper.iteritems(), key=itemgetter(0)):
+ println(' case {}: return {}; // {}'.format(hexlit(code), len(converted),
+ codepoint_table.name(code)))
+ println(' }')
+ println('')
+ println(' MOZ_ASSERT_UNREACHABLE("Bad character input.");')
+ println(' return 0;')
+
+ println('}')
+
+ def write_AppendUpperCaseSpecialCasing():
+ """ Slow case: Special casing character was found, append its mapping characters. """
+ println('void')
+ println('js::unicode::AppendUpperCaseSpecialCasing(char16_t ch, char16_t* elements, size_t* index)')
+ println('{')
+
+ println(' switch(ch) {')
+ for (code, converted) in sorted(unconditional_toupper.iteritems(), key=itemgetter(0)):
+ println(' case {}: // {}'.format(hexlit(code), codepoint_table.name(code)))
+ for ch in converted:
+ println(' elements[(*index)++] = {}; // {}'.format(hexlit(ch),
+ codepoint_table.name(ch)))
+ println(' return;')
+ println(' }')
+ println('')
+ println(' MOZ_ASSERT_UNREACHABLE("Bad character input.");')
+ println(' return;')
+
+ println('}')
+
+ write_CanUpperCaseSpecialCasing()
+ println('')
+ write_LengthUpperCaseSpecialCasing()
+ println('')
+ write_AppendUpperCaseSpecialCasing()
+
+def make_bmp_mapping_test(version, codepoint_table, unconditional_tolower, unconditional_toupper):
+ def unicodeEsc(n):
+ return '\u{:04X}'.format(n)
+
file_name = '../tests/ecma_5/String/string-upper-lower-mapping.js'
- with io.open(file_name, mode='wb') as test_mapping:
- test_mapping.write(warning_message)
- test_mapping.write(unicode_version_message.format(version))
- test_mapping.write(public_domain)
- test_mapping.write('var mapping = [\n')
+ with io.open(file_name, mode='wb') as output:
+ write = partial(print, file=output, sep='', end='')
+ println = partial(print, file=output, sep='', end='\n')
+
+ write(warning_message)
+ write(unicode_version_message.format(version))
+ write(public_domain)
+ println('var mapping = [')
for code in range(0, MAX_BMP + 1):
- entry = test_table.get(code)
+ entry = codepoint_table.get(code)
if entry:
- (upper, lower, name, alias) = entry
- test_mapping.write(' [' + hex(upper) + ', ' + hex(lower) + '], /* ' +
- name + (' (' + alias + ')' if alias else '') + ' */\n')
+ (upper, lower, _, _) = entry
+ upper = unconditional_toupper[code] if code in unconditional_toupper else [upper]
+ lower = unconditional_tolower[code] if code in unconditional_tolower else [lower]
+ println(' ["{}", "{}"], /* {} */'.format("".join(imap(unicodeEsc, upper)),
+ "".join(imap(unicodeEsc, lower)),
+ codepoint_table.name(code)))
else:
- test_mapping.write(' [' + hex(code) + ', ' + hex(code) + '],\n')
- test_mapping.write('];')
- test_mapping.write("""
+ println(' ["{0}", "{0}"],'.format(unicodeEsc(code)))
+ println('];')
+ write("""
assertEq(mapping.length, 0x10000);
for (var i = 0; i <= 0xffff; i++) {
var char = String.fromCharCode(i);
var info = mapping[i];
- assertEq(char.toUpperCase().charCodeAt(0), info[0]);
- assertEq(char.toLowerCase().charCodeAt(0), info[1]);
+ assertEq(char.toUpperCase(), info[0]);
+ assertEq(char.toLowerCase(), info[1]);
}
if (typeof reportCompare === "function")
reportCompare(true, true);
""")
-def make_non_bmp_mapping_test(version, non_bmp_upper_map, non_bmp_lower_map):
+def make_non_bmp_mapping_test(version, non_bmp_upper_map, non_bmp_lower_map, codepoint_table):
file_name = '../tests/ecma_6/String/string-code-point-upper-lower-mapping.js'
with io.open(file_name, mode='wb') as test_non_bmp_mapping:
test_non_bmp_mapping.write(warning_message)
test_non_bmp_mapping.write(unicode_version_message.format(version))
test_non_bmp_mapping.write(public_domain)
+
for code in sorted(non_bmp_upper_map.keys()):
test_non_bmp_mapping.write("""\
-assertEq(String.fromCodePoint(0x{:x}).toUpperCase().codePointAt(0), 0x{:x});
-""".format(code, non_bmp_upper_map[code]))
+assertEq(String.fromCodePoint(0x{:04X}).toUpperCase().codePointAt(0), 0x{:04X}); // {}, {}
+""".format(code, non_bmp_upper_map[code],
+ codepoint_table.name(code), codepoint_table.name(non_bmp_upper_map[code])))
+
for code in sorted(non_bmp_lower_map.keys()):
test_non_bmp_mapping.write("""\
-assertEq(String.fromCodePoint(0x{:x}).toLowerCase().codePointAt(0), 0x{:x});
-""".format(code, non_bmp_lower_map[code]))
+assertEq(String.fromCodePoint(0x{:04X}).toLowerCase().codePointAt(0), 0x{:04X}); // {}, {}
+""".format(code, non_bmp_lower_map[code],
+ codepoint_table.name(code), codepoint_table.name(non_bmp_lower_map[code])))
test_non_bmp_mapping.write("""
if (typeof reportCompare === "function")
reportCompare(true, true);
""")
-def make_space_test(version, test_space_table):
+def make_space_test(version, test_space_table, codepoint_table):
+ def hex_and_name(c):
+ return ' 0x{:04X} /* {} */'.format(c, codepoint_table.name(c))
+
file_name = '../tests/ecma_5/String/string-space-trim.js'
with io.open(file_name, mode='wb') as test_space:
test_space.write(warning_message)
test_space.write(unicode_version_message.format(version))
test_space.write(public_domain)
- test_space.write('var onlySpace = String.fromCharCode(' +
- ', '.join(map(lambda c: hex(c), test_space_table)) + ');\n')
+ test_space.write('var onlySpace = String.fromCharCode(\n')
+ test_space.write(',\n'.join(map(hex_and_name, test_space_table)))
+ test_space.write('\n);\n')
test_space.write("""
assertEq(onlySpace.trim(), "");
assertEq((onlySpace + 'aaaa').trim(), 'aaaa');
@@ -544,7 +909,10 @@ if (typeof reportCompare === "function")
reportCompare(true, true);
""")
-def make_icase_test(version, folding_tests):
+def make_icase_test(version, folding_tests, codepoint_table):
+ def char_hex(c):
+ return '0x{:04X}'.format(c)
+
file_name = '../tests/ecma_6/RegExp/unicode-ignoreCase.js'
with io.open(file_name, mode='wb') as test_icase:
test_icase.write(warning_message)
@@ -565,7 +933,8 @@ function test(code, ...equivs) {
}
""")
for args in folding_tests:
- test_icase.write('test(' + ','.join([hex(c) for c in args]) + ');\n')
+ test_icase.write('test({}); // {}\n'.format(', '.join(map(char_hex, args)),
+ ', '.join(map(codepoint_table.name, args))))
test_icase.write("""
if (typeof reportCompare === "function")
reportCompare(true, true);
@@ -576,7 +945,9 @@ def make_unicode_file(version,
same_upper_table, same_upper_index,
folding_table, folding_index,
non_bmp_space_set,
- non_bmp_id_start_set, non_bmp_id_cont_set):
+ non_bmp_id_start_set, non_bmp_id_cont_set,
+ unconditional_toupper,
+ codepoint_table):
index1, index2, shift = splitbins(index)
# Don't forget to update CharInfo in Unicode.h if you need to change this
@@ -665,8 +1036,8 @@ def make_unicode_file(version,
* stop if you found the best shift
*/
"""
- def dump(data, name, file):
- file.write('const uint8_t unicode::' + name + '[] = {\n')
+ def dump(data, name, println):
+ println('const uint8_t unicode::{}[] = {{'.format(name))
line = pad = ' ' * 4
lines = []
@@ -682,93 +1053,79 @@ def make_unicode_file(version,
line = line + s + ', '
lines.append(line.rstrip())
- file.write('\n'.join(lines))
- file.write('\n};\n')
+ println('\n'.join(lines))
+ println('};')
+
+ def write_table(data_type, name, tbl, idx1_name, idx1, idx2_name, idx2, println):
+ println('const {} unicode::{}[] = {{'.format(data_type, name))
+ for d in tbl:
+ println(' {{ {} }},'.format(', '.join(str(e) for e in d)))
+ println('};')
+ println('')
+
+ dump(idx1, idx1_name, println)
+ println('')
+ dump(idx2, idx2_name, println)
+ println('')
+
+ def write_supplemental_identifier_method(name, group_set, println):
+ println('bool')
+ println('js::unicode::{}(uint32_t codePoint)'.format(name))
+ println('{')
+ for (from_code, to_code) in int_ranges(group_set.keys()):
+ println(' if (codePoint >= 0x{:X} && codePoint <= 0x{:X}) // {} .. {}'.format(from_code,
+ to_code,
+ codepoint_table.name(from_code),
+ codepoint_table.name(to_code)))
+ println(' return true;')
+ println(' return false;')
+ println('}')
+ println('')
file_name = 'Unicode.cpp'
with io.open(file_name, 'wb') as data_file:
- data_file.write(warning_message)
- data_file.write(unicode_version_message.format(version))
- data_file.write(public_domain)
- data_file.write('#include "vm/Unicode.h"\n\n')
- data_file.write('using namespace js;\n')
- data_file.write('using namespace js::unicode;\n')
- data_file.write(comment)
- data_file.write('const CharacterInfo unicode::js_charinfo[] = {\n')
- for d in table:
- data_file.write(' {')
- data_file.write(', '.join((str(e) for e in d)))
- data_file.write('},\n')
- data_file.write('};\n')
- data_file.write('\n')
-
- dump(index1, 'index1', data_file)
- data_file.write('\n')
- dump(index2, 'index2', data_file)
- data_file.write('\n')
-
- data_file.write('const CodepointsWithSameUpperCaseInfo unicode::js_codepoints_with_same_upper_info[] = {\n')
- for d in same_upper_table:
- data_file.write(' {')
- data_file.write(', '.join((str(e) for e in d)))
- data_file.write('},\n')
- data_file.write('};\n')
- data_file.write('\n')
-
- dump(same_upper_index1, 'codepoints_with_same_upper_index1', data_file)
- data_file.write('\n')
- dump(same_upper_index2, 'codepoints_with_same_upper_index2', data_file)
- data_file.write('\n')
-
- data_file.write('const FoldingInfo unicode::js_foldinfo[] = {\n')
- for d in folding_table:
- data_file.write(' {')
- data_file.write(', '.join((str(e) for e in d)))
- data_file.write('},\n')
- data_file.write('};\n')
- data_file.write('\n')
-
- dump(folding_index1, 'folding_index1', data_file)
- data_file.write('\n')
- dump(folding_index2, 'folding_index2', data_file)
- data_file.write('\n')
+ write = partial(print, file=data_file, sep='', end='')
+ println = partial(print, file=data_file, sep='', end='\n')
+
+ write(warning_message)
+ write(unicode_version_message.format(version))
+ write(public_domain)
+ println('#include "vm/Unicode.h"')
+ println('')
+ println('using namespace js;')
+ println('using namespace js::unicode;')
+ write(comment)
+
+ write_table('CharacterInfo',
+ 'js_charinfo', table,
+ 'index1', index1,
+ 'index2', index2,
+ println)
+
+ write_table('CodepointsWithSameUpperCaseInfo',
+ 'js_codepoints_with_same_upper_info', same_upper_table,
+ 'codepoints_with_same_upper_index1', same_upper_index1,
+ 'codepoints_with_same_upper_index2', same_upper_index2,
+ println)
+
+ write_table('FoldingInfo',
+ 'js_foldinfo', folding_table,
+ 'folding_index1', folding_index1,
+ 'folding_index2', folding_index2,
+ println)
# If the following assert fails, it means space character is added to
# non-BMP area. In that case the following code should be uncommented
# and the corresponding code should be added to frontend.
assert len(non_bmp_space_set.keys()) == 0
- data_file.write("""\
-bool
-js::unicode::IsIdentifierStartNonBMP(uint32_t codePoint)
-{
-""")
-
- for (from_code, to_code) in for_each_non_bmp_group(non_bmp_id_start_set):
- data_file.write("""\
- if (codePoint >= 0x{:x} && codePoint <= 0x{:x})
- return true;
-""".format(from_code, to_code))
-
- data_file.write("""\
- return false;
-}
-
-bool
-js::unicode::IsIdentifierPartNonBMP(uint32_t codePoint)
-{
-""")
+ write_supplemental_identifier_method('IsIdentifierStartNonBMP', non_bmp_id_start_set,
+ println)
- for (from_code, to_code) in for_each_non_bmp_group(non_bmp_id_cont_set):
- data_file.write("""\
- if (codePoint >= 0x{:x} && codePoint <= 0x{:x})
- return true;
-""".format(from_code, to_code))
+ write_supplemental_identifier_method('IsIdentifierPartNonBMP', non_bmp_id_cont_set,
+ println)
- data_file.write("""\
- return false;
-}
-""")
+ write_special_casing_methods(unconditional_toupper, codepoint_table, println)
def getsize(data):
""" return smallest possible integer size for the given array """
@@ -842,10 +1199,8 @@ def splitbins(t):
def make_irregexp_tables(version,
table, index,
folding_table, folding_index,
- test_table):
+ codepoint_table):
import string
- from functools import partial
- from itertools import chain, ifilter, imap
MAX_ASCII = 0x7F
MAX_LATIN1 = 0xFF
@@ -894,13 +1249,13 @@ def make_irregexp_tables(version,
def char_name(code):
assert 0 <= code and code <= MAX_BMP
- if code not in test_table:
+ if code not in codepoint_table:
return '<Unused>'
if code == LEAD_SURROGATE_MIN:
return '<Lead Surrogate Min>'
if code == TRAIL_SURROGATE_MAX:
return '<Trail Surrogate Max>'
- (_, _, name, alias) = test_table[code]
+ (_, _, name, alias) = codepoint_table[code]
return name if not name.startswith('<') else alias
def write_character_range(println, name, characters):
@@ -1080,7 +1435,8 @@ def update_unicode(args):
with download_or_open('UnicodeData.txt') as unicode_data, \
download_or_open('CaseFolding.txt') as case_folding, \
- download_or_open('DerivedCoreProperties.txt') as derived_core_properties:
+ download_or_open('DerivedCoreProperties.txt') as derived_core_properties, \
+ download_or_open('SpecialCasing.txt') as special_casing:
unicode_version = version_from_file(derived_core_properties, 'DerivedCoreProperties')
print('Processing...')
@@ -1090,13 +1446,16 @@ def update_unicode(args):
non_bmp_lower_map, non_bmp_upper_map,
non_bmp_space_set,
non_bmp_id_start_set, non_bmp_id_cont_set,
- test_table, test_space_table
+ codepoint_table, test_space_table
) = process_unicode_data(unicode_data, derived_core_properties)
(
folding_table, folding_index,
non_bmp_folding_map, non_bmp_rev_folding_map,
folding_tests
) = process_case_folding(case_folding)
+ (
+ unconditional_tolower, unconditional_toupper
+ ) = process_special_casing(special_casing, table, index)
print('Generating...')
make_unicode_file(unicode_version,
@@ -1104,19 +1463,23 @@ def update_unicode(args):
same_upper_table, same_upper_index,
folding_table, folding_index,
non_bmp_space_set,
- non_bmp_id_start_set, non_bmp_id_cont_set)
+ non_bmp_id_start_set, non_bmp_id_cont_set,
+ unconditional_toupper,
+ codepoint_table)
make_non_bmp_file(unicode_version,
non_bmp_lower_map, non_bmp_upper_map,
- non_bmp_folding_map, non_bmp_rev_folding_map)
+ non_bmp_folding_map, non_bmp_rev_folding_map,
+ codepoint_table)
make_irregexp_tables(unicode_version,
table, index,
folding_table, folding_index,
- test_table)
+ codepoint_table)
- make_bmp_mapping_test(unicode_version, test_table)
- make_non_bmp_mapping_test(unicode_version, non_bmp_upper_map, non_bmp_lower_map)
- make_space_test(unicode_version, test_space_table)
- make_icase_test(unicode_version, folding_tests)
+ make_bmp_mapping_test(unicode_version,
+ codepoint_table, unconditional_tolower, unconditional_toupper)
+ make_non_bmp_mapping_test(unicode_version, non_bmp_upper_map, non_bmp_lower_map, codepoint_table)
+ make_space_test(unicode_version, test_space_table, codepoint_table)
+ make_icase_test(unicode_version, folding_tests, codepoint_table)
if __name__ == '__main__':
import argparse
diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp
index 1483eb0a11..f66415ea9e 100644
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -137,6 +137,22 @@ struct CSSParserInputState {
bool mHavePushBack;
};
+struct ReduceNumberCalcOps : public mozilla::css::BasicFloatCalcOps,
+ public mozilla::css::CSSValueInputCalcOps
+{
+ result_type ComputeLeafValue(const nsCSSValue& aValue)
+ {
+ // FIXME: Restore this assertion once ParseColor no longer uses this class.
+ //MOZ_ASSERT(aValue.GetUnit() == eCSSUnit_Number, "unexpected unit");
+ return aValue.GetFloatValue();
+ }
+
+ float ComputeNumber(const nsCSSValue& aValue)
+ {
+ return mozilla::css::ComputeCalc(aValue, *this);
+ }
+};
+
static_assert(css::eAuthorSheetFeatures == 0 &&
css::eUserSheetFeatures == 1 &&
css::eAgentSheetFeatures == 2,
@@ -660,6 +676,11 @@ protected:
bool SkipAtRule(bool aInsideBlock);
bool SkipDeclaration(bool aCheckForBraces);
+ // Returns true when the target token type is found, and false for the
+ // end of declaration, start of !important flag, end of declaration
+ // block, or EOF.
+ bool LookForTokenType(nsCSSTokenType aType);
+
void PushGroup(css::GroupRule* aRule);
void PopGroup();
@@ -895,6 +916,7 @@ protected:
};
bool IsFunctionTokenValidForImageLayerImage(const nsCSSToken& aToken) const;
+ bool IsCalcFunctionToken(const nsCSSToken& aToken) const;
bool ParseImageLayersItem(ImageLayersShorthandParseState& aState,
const nsCSSPropertyID aTable[]);
@@ -5402,6 +5424,32 @@ CSSParserImpl::SkipDeclaration(bool aCheckForBraces)
return true;
}
+bool
+CSSParserImpl::LookForTokenType(nsCSSTokenType aType) {
+ bool rv = false;
+ CSSParserInputState stateBeforeValue;
+ SaveInputState(stateBeforeValue);
+
+ const char16_t stopChars[] = { ';', '!', '}', 0 };
+ nsDependentString stopSymbolChars(stopChars);
+ while (GetToken(true)) {
+ if (mToken.mType == aType) {
+ rv = true;
+ break;
+ }
+ // Stop looking if we're at the end of the declaration, encountered an
+ // !important flag, or at the end of the declaration block.
+ if (mToken.mType == eCSSToken_Symbol &&
+ stopSymbolChars.FindChar(mToken.mSymbol) != -1) {
+ rv = false;
+ break;
+ }
+ }
+
+ RestoreSavedInputState(stateBeforeValue);
+ return rv;
+}
+
void
CSSParserImpl::SkipRuleSet(bool aInsideBraces)
{
@@ -6983,7 +7031,15 @@ CSSParserImpl::ParseColor(nsCSSValue& aValue)
if (GetToken(true)) {
UngetToken();
}
- if (mToken.mType == eCSSToken_Number) { // <number>
+
+ bool isNumber = mToken.mType == eCSSToken_Number;
+
+ // Check first if we have percentage values inside the function.
+ if (mToken.mType == eCSSToken_Function) {
+ isNumber = !LookForTokenType(eCSSToken_Percentage);
+ }
+
+ if (isNumber) { // <number>
uint8_t r, g, b, a;
if (ParseRGBColor(r, g, b, a)) {
@@ -7090,14 +7146,22 @@ CSSParserImpl::ParseColorComponent(uint8_t& aComponent, Maybe<char> aSeparator)
return false;
}
- if (mToken.mType != eCSSToken_Number) {
+ float value;
+ if (mToken.mType == eCSSToken_Number) {
+ value = mToken.mNumber;
+ } else if (IsCalcFunctionToken(mToken)) {
+ nsCSSValue aValue;
+ if (!ParseCalc(aValue, VARIANT_LPN | VARIANT_CALC)) {
+ return false;
+ }
+ ReduceNumberCalcOps ops;
+ value = mozilla::css::ComputeCalc(aValue, ops);
+ } else {
REPORT_UNEXPECTED_TOKEN(PEExpectedNumber);
UngetToken();
return false;
}
- float value = mToken.mNumber;
-
if (aSeparator && !ExpectSymbol(*aSeparator, true)) {
REPORT_UNEXPECTED_TOKEN_CHAR(PEColorComponentBadTerm, *aSeparator);
return false;
@@ -7118,14 +7182,22 @@ CSSParserImpl::ParseColorComponent(float& aComponent, Maybe<char> aSeparator)
return false;
}
- if (mToken.mType != eCSSToken_Percentage) {
+ float value;
+ if (mToken.mType == eCSSToken_Percentage) {
+ value = mToken.mNumber;
+ } else if (IsCalcFunctionToken(mToken)) {
+ nsCSSValue aValue;
+ if (!ParseCalc(aValue, VARIANT_LPN | VARIANT_CALC)) {
+ return false;
+ }
+ ReduceNumberCalcOps ops;
+ value = mozilla::css::ComputeCalc(aValue, ops);
+ } else {
REPORT_UNEXPECTED_TOKEN(PEExpectedPercent);
UngetToken();
return false;
}
- float value = mToken.mNumber;
-
if (aSeparator && !ExpectSymbol(*aSeparator, true)) {
REPORT_UNEXPECTED_TOKEN_CHAR(PEColorComponentBadTerm, *aSeparator);
return false;
@@ -7867,14 +7939,6 @@ CSSParserImpl::ParseOneOrLargerVariant(nsCSSValue& aValue,
return result;
}
-static bool
-IsCSSTokenCalcFunction(const nsCSSToken& aToken)
-{
- return aToken.mType == eCSSToken_Function &&
- (aToken.mIdent.LowerCaseEqualsLiteral("calc") ||
- aToken.mIdent.LowerCaseEqualsLiteral("-moz-calc"));
-}
-
// Assigns to aValue iff it returns CSSParseResult::Ok.
CSSParseResult
CSSParserImpl::ParseVariant(nsCSSValue& aValue,
@@ -8174,7 +8238,7 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue,
}
}
if ((aVariantMask & VARIANT_CALC) &&
- IsCSSTokenCalcFunction(*tk)) {
+ IsCalcFunctionToken(*tk)) {
// calc() currently allows only lengths and percents and number inside it.
// And note that in current implementation, number cannot be mixed with
// length and percent.
@@ -12438,6 +12502,14 @@ CSSParserImpl::IsFunctionTokenValidForImageLayerImage(
funcName.LowerCaseEqualsLiteral("-webkit-repeating-radial-gradient")));
}
+bool
+CSSParserImpl::IsCalcFunctionToken(const nsCSSToken& aToken) const
+{
+ return aToken.mType == eCSSToken_Function &&
+ (aToken.mIdent.LowerCaseEqualsLiteral("calc") ||
+ aToken.mIdent.LowerCaseEqualsLiteral("-moz-calc"));
+}
+
// Parse one item of the background shorthand property.
bool
CSSParserImpl::ParseImageLayersItem(
@@ -13830,21 +13902,6 @@ CSSParserImpl::ParseCalcAdditiveExpression(nsCSSValue& aValue,
}
}
-struct ReduceNumberCalcOps : public mozilla::css::BasicFloatCalcOps,
- public mozilla::css::CSSValueInputCalcOps
-{
- result_type ComputeLeafValue(const nsCSSValue& aValue)
- {
- MOZ_ASSERT(aValue.GetUnit() == eCSSUnit_Number, "unexpected unit");
- return aValue.GetFloatValue();
- }
-
- float ComputeNumber(const nsCSSValue& aValue)
- {
- return mozilla::css::ComputeCalc(aValue, *this);
- }
-};
-
// * If aVariantMask is VARIANT_NUMBER, this function parses the
// <number-multiplicative-expression> production.
// * If aVariantMask does not contain VARIANT_NUMBER, this function
@@ -13965,7 +14022,7 @@ CSSParserImpl::ParseCalcTerm(nsCSSValue& aValue, uint32_t& aVariantMask)
// Either an additive expression in parentheses...
if (mToken.IsSymbol('(') ||
// Treat nested calc() as plain parenthesis.
- IsCSSTokenCalcFunction(mToken)) {
+ IsCalcFunctionToken(mToken)) {
if (!ParseCalcAdditiveExpression(aValue, aVariantMask) ||
!ExpectSymbol(')', true)) {
SkipUntil(')');
diff --git a/mfbt/Assertions.h b/mfbt/Assertions.h
index cc4735071d..df41795c12 100644
--- a/mfbt/Assertions.h
+++ b/mfbt/Assertions.h
@@ -597,6 +597,8 @@ struct AssertionConditionType
/* Do nothing. */ \
} \
} while (0)
+# define MOZ_ALWAYS_OK(expr) MOZ_ASSERT((expr).isOk())
+# define MOZ_ALWAYS_ERR(expr) MOZ_ASSERT((expr).isErr())
#else
# define MOZ_ALWAYS_TRUE(expr) \
do { \
@@ -610,6 +612,18 @@ struct AssertionConditionType
/* Silence MOZ_MUST_USE. */ \
} \
} while (0)
+# define MOZ_ALWAYS_OK(expr) \
+ do { \
+ if ((expr).isOk()) { \
+ /* Silence MOZ_MUST_USE. */ \
+ } \
+ } while (0)
+# define MOZ_ALWAYS_ERR(expr) \
+ do { \
+ if ((expr).isErr()) { \
+ /* Silence MOZ_MUST_USE. */ \
+ } \
+ } while (0)
#endif
#undef MOZ_DUMP_ASSERTION_STACK
diff --git a/mfbt/FloatingPoint.h b/mfbt/FloatingPoint.h
index 6a0e454ae7..7d73d7e848 100644
--- a/mfbt/FloatingPoint.h
+++ b/mfbt/FloatingPoint.h
@@ -396,6 +396,20 @@ NumbersAreIdentical(T aValue1, T aValue2)
return BitwiseCast<Bits>(aValue1) == BitwiseCast<Bits>(aValue2);
}
+/**
+ * Return true if |aValue| and |aValue2| are equal (ignoring sign if both are
+ * zero) or both NaN.
+ */
+template <typename T>
+static inline bool
+EqualOrBothNaN(T aValue1, T aValue2)
+{
+ if (IsNaN(aValue1)) {
+ return IsNaN(aValue2);
+ }
+ return aValue1 == aValue2;
+}
+
namespace detail {
template<typename T>
diff --git a/mfbt/Maybe.h b/mfbt/Maybe.h
index 79df8d2518..bc123b047f 100644
--- a/mfbt/Maybe.h
+++ b/mfbt/Maybe.h
@@ -102,16 +102,11 @@ public:
}
/**
- * Maybe<T*> can be copy-constructed from a Maybe<U*> if U* and T* are
- * compatible, or from Maybe<decltype(nullptr)>.
+ * Maybe<T> can be copy-constructed from a Maybe<U> if U is convertible to T.
*/
template<typename U,
typename =
- typename std::enable_if<std::is_pointer<T>::value &&
- (std::is_same<U, decltype(nullptr)>::value ||
- (std::is_pointer<U>::value &&
- std::is_base_of<typename std::remove_pointer<T>::type,
- typename std::remove_pointer<U>::type>::value))>::type>
+ typename std::enable_if<std::is_convertible<U, T>::value>::type>
MOZ_IMPLICIT
Maybe(const Maybe<U>& aOther)
: mIsSome(false)
@@ -131,16 +126,11 @@ public:
}
/**
- * Maybe<T*> can be move-constructed from a Maybe<U*> if U* and T* are
- * compatible, or from Maybe<decltype(nullptr)>.
+ * Maybe<T> can be move-constructed from a Maybe<U> if U is convertible to T.
*/
template<typename U,
typename =
- typename std::enable_if<std::is_pointer<T>::value &&
- (std::is_same<U, decltype(nullptr)>::value ||
- (std::is_pointer<U>::value &&
- std::is_base_of<typename std::remove_pointer<T>::type,
- typename std::remove_pointer<U>::type>::value))>::type>
+ typename std::enable_if<std::is_convertible<U, T>::value>::type>
MOZ_IMPLICIT
Maybe(Maybe<U>&& aOther)
: mIsSome(false)
@@ -156,13 +146,7 @@ public:
if (&aOther != this) {
if (aOther.mIsSome) {
if (mIsSome) {
- // XXX(seth): The correct code for this branch, below, can't be used
- // due to a bug in Visual Studio 2010. See bug 1052940.
- /*
ref() = aOther.ref();
- */
- reset();
- emplace(*aOther);
} else {
emplace(*aOther);
}
@@ -173,6 +157,23 @@ public:
return *this;
}
+ template<typename U,
+ typename =
+ typename std::enable_if<std::is_convertible<U, T>::value>::type>
+ Maybe& operator=(const Maybe<U>& aOther)
+ {
+ if (aOther.isSome()) {
+ if (mIsSome) {
+ ref() = aOther.ref();
+ } else {
+ emplace(*aOther);
+ }
+ } else {
+ reset();
+ }
+ return *this;
+ }
+
Maybe& operator=(Maybe&& aOther)
{
MOZ_ASSERT(this != &aOther, "Self-moves are prohibited");
@@ -191,6 +192,25 @@ public:
return *this;
}
+ template<typename U,
+ typename =
+ typename std::enable_if<std::is_convertible<U, T>::value>::type>
+ Maybe& operator=(Maybe<U>&& aOther)
+ {
+ if (aOther.isSome()) {
+ if (mIsSome) {
+ ref() = Move(aOther.ref());
+ } else {
+ emplace(Move(*aOther));
+ }
+ aOther.reset();
+ } else {
+ reset();
+ }
+
+ return *this;
+ }
+
/* Methods that check whether this Maybe contains a value */
explicit operator bool() const { return isSome(); }
bool isSome() const { return mIsSome; }
@@ -443,11 +463,12 @@ public:
* if you need to construct a Maybe value that holds a const, volatile, or
* reference value, you need to use emplace() instead.
*/
-template<typename T>
-Maybe<typename RemoveCV<typename RemoveReference<T>::Type>::Type>
+template<typename T,
+ typename U = typename std::remove_cv<
+ typename std::remove_reference<T>::type>::type>
+Maybe<U>
Some(T&& aValue)
{
- typedef typename RemoveCV<typename RemoveReference<T>::Type>::Type U;
Maybe<U> value;
value.emplace(Forward<T>(aValue));
return value;
diff --git a/mfbt/Result.h b/mfbt/Result.h
new file mode 100644
index 0000000000..780041ffff
--- /dev/null
+++ b/mfbt/Result.h
@@ -0,0 +1,312 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* A type suitable for returning either a value or an error from a function. */
+
+#ifndef mozilla_Result_h
+#define mozilla_Result_h
+
+#include "mozilla/Alignment.h"
+#include "mozilla/Assertions.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/Types.h"
+#include "mozilla/TypeTraits.h"
+#include "mozilla/Variant.h"
+
+namespace mozilla {
+
+/**
+ * Empty struct, indicating success for operations that have no return value.
+ * For example, if you declare another empty struct `struct OutOfMemory {};`,
+ * then `Result<Ok, OutOfMemory>` represents either success or OOM.
+ */
+struct Ok {};
+
+template <typename E> class GenericErrorResult;
+
+namespace detail {
+
+enum class VEmptiness { IsEmpty, IsNotEmpty };
+enum class Alignedness { IsAligned, IsNotAligned };
+
+template <typename V, typename E, VEmptiness EmptinessOfV, Alignedness Aligned>
+class ResultImplementation
+{
+ mozilla::Variant<V, E> mStorage;
+
+public:
+ explicit ResultImplementation(V aValue) : mStorage(aValue) {}
+ explicit ResultImplementation(E aErrorValue) : mStorage(aErrorValue) {}
+
+ bool isOk() const { return mStorage.template is<V>(); }
+
+ // The callers of these functions will assert isOk() has the proper value, so
+ // these functions (in all ResultImplementation specializations) don't need
+ // to do so.
+ V unwrap() const { return mStorage.template as<V>(); }
+ E unwrapErr() const { return mStorage.template as<E>(); }
+};
+
+/**
+ * mozilla::Variant doesn't like storing a reference. This is a specialization
+ * to store E as pointer if it's a reference.
+ */
+template <typename V, typename E, VEmptiness EmptinessOfV, Alignedness Aligned>
+class ResultImplementation<V, E&, EmptinessOfV, Aligned>
+{
+ mozilla::Variant<V, E*> mStorage;
+
+public:
+ explicit ResultImplementation(V aValue) : mStorage(aValue) {}
+ explicit ResultImplementation(E& aErrorValue) : mStorage(&aErrorValue) {}
+
+ bool isOk() const { return mStorage.template is<V>(); }
+ V unwrap() const { return mStorage.template as<V>(); }
+ E& unwrapErr() const { return *mStorage.template as<E*>(); }
+};
+
+/**
+ * Specialization for when the success type is Ok (or another empty class) and
+ * the error type is a reference.
+ */
+template <typename V, typename E, Alignedness Aligned>
+class ResultImplementation<V, E&, VEmptiness::IsEmpty, Aligned>
+{
+ E* mErrorValue;
+
+public:
+ explicit ResultImplementation(V) : mErrorValue(nullptr) {}
+ explicit ResultImplementation(E& aErrorValue) : mErrorValue(&aErrorValue) {}
+
+ bool isOk() const { return mErrorValue == nullptr; }
+
+ V unwrap() const { return V(); }
+ E& unwrapErr() const { return *mErrorValue; }
+};
+
+/**
+ * Specialization for when alignment permits using the least significant bit as
+ * a tag bit.
+ */
+template <typename V, typename E, VEmptiness EmptinessOfV>
+class ResultImplementation<V*, E&, EmptinessOfV, Alignedness::IsAligned>
+{
+ uintptr_t mBits;
+
+public:
+ explicit ResultImplementation(V* aValue)
+ : mBits(reinterpret_cast<uintptr_t>(aValue))
+ {
+ MOZ_ASSERT((uintptr_t(aValue) % MOZ_ALIGNOF(V)) == 0,
+ "Result value pointers must not be misaligned");
+ }
+ explicit ResultImplementation(E& aErrorValue)
+ : mBits(reinterpret_cast<uintptr_t>(&aErrorValue) | 1)
+ {
+ MOZ_ASSERT((uintptr_t(&aErrorValue) % MOZ_ALIGNOF(E)) == 0,
+ "Result errors must not be misaligned");
+ }
+
+ bool isOk() const { return (mBits & 1) == 0; }
+
+ V* unwrap() const { return reinterpret_cast<V*>(mBits); }
+ E& unwrapErr() const { return *reinterpret_cast<E*>(mBits & ~uintptr_t(1)); }
+};
+
+// A bit of help figuring out which of the above specializations to use.
+//
+// We begin by safely assuming types don't have a spare bit.
+template <typename T> struct HasFreeLSB { static const bool value = false; };
+
+// The lowest bit of a properly-aligned pointer is always zero if the pointee
+// type is greater than byte-aligned. That bit is free to use if it's masked
+// out of such pointers before they're dereferenced.
+template <typename T> struct HasFreeLSB<T*> {
+ static const bool value = (MOZ_ALIGNOF(T) & 1) == 0;
+};
+
+// We store references as pointers, so they have a free bit if a pointer would
+// have one.
+template <typename T> struct HasFreeLSB<T&> {
+ static const bool value = HasFreeLSB<T*>::value;
+};
+
+} // namespace detail
+
+/**
+ * Result<V, E> represents the outcome of an operation that can either succeed
+ * or fail. It contains either a success value of type V or an error value of
+ * type E.
+ *
+ * All Result methods are const, so results are basically immutable.
+ * This is just like Variant<V, E> but with a slightly different API, and the
+ * following cases are optimized so Result can be stored more efficiently:
+ *
+ * - If the success type is Ok (or another empty class) and the error type is a
+ * reference, Result<V, E&> is guaranteed to be pointer-sized and all zero
+ * bits on success. Do not change this representation! There is JIT code that
+ * depends on it.
+ *
+ * - If the success type is a pointer type and the error type is a reference
+ * type, and the least significant bit is unused for both types when stored
+ * as a pointer (due to alignment rules), Result<V*, E&> is guaranteed to be
+ * pointer-sized. In this case, we use the lowest bit as tag bit: 0 to
+ * indicate the Result's bits are a V, 1 to indicate the Result's bits (with
+ * the 1 masked out) encode an E*.
+ *
+ * The purpose of Result is to reduce the screwups caused by using `false` or
+ * `nullptr` to indicate errors.
+ * What screwups? See <https://bugzilla.mozilla.org/show_bug.cgi?id=912928> for
+ * a partial list.
+ */
+template <typename V, typename E>
+class MOZ_MUST_USE_TYPE Result final
+{
+ using Impl =
+ detail::ResultImplementation<V, E,
+ IsEmpty<V>::value
+ ? detail::VEmptiness::IsEmpty
+ : detail::VEmptiness::IsNotEmpty,
+ (detail::HasFreeLSB<V>::value &&
+ detail::HasFreeLSB<E>::value)
+ ? detail::Alignedness::IsAligned
+ : detail::Alignedness::IsNotAligned>;
+ Impl mImpl;
+
+public:
+ /**
+ * Create a success result.
+ */
+ MOZ_IMPLICIT Result(V aValue) : mImpl(aValue) { MOZ_ASSERT(isOk()); }
+
+ /**
+ * Create an error result.
+ */
+ explicit Result(E aErrorValue) : mImpl(aErrorValue) { MOZ_ASSERT(isErr()); }
+
+ /**
+ * Implementation detail of MOZ_TRY().
+ * Create an error result from another error result.
+ */
+ template <typename E2>
+ MOZ_IMPLICIT Result(const GenericErrorResult<E2>& aErrorResult)
+ : mImpl(aErrorResult.mErrorValue)
+ {
+ static_assert(mozilla::IsConvertible<E2, E>::value,
+ "E2 must be convertible to E");
+ MOZ_ASSERT(isErr());
+ }
+
+ Result(const Result&) = default;
+ Result& operator=(const Result&) = default;
+
+ /** True if this Result is a success result. */
+ bool isOk() const { return mImpl.isOk(); }
+
+ /** True if this Result is an error result. */
+ bool isErr() const { return !mImpl.isOk(); }
+
+ /** Get the success value from this Result, which must be a success result. */
+ V unwrap() const {
+ MOZ_ASSERT(isOk());
+ return mImpl.unwrap();
+ }
+
+ /** Get the error value from this Result, which must be an error result. */
+ E unwrapErr() const {
+ MOZ_ASSERT(isErr());
+ return mImpl.unwrapErr();
+ }
+
+ /**
+ * Map a function V -> W over this result's success variant. If this result is
+ * an error, do not invoke the function and return a copy of the error.
+ *
+ * Mapping over success values invokes the function to produce a new success
+ * value:
+ *
+ * // Map Result<int, E> to another Result<int, E>
+ * Result<int, E> res(5);
+ * Result<int, E> res2 = res.map([](int x) { return x * x; });
+ * MOZ_ASSERT(res2.unwrap() == 25);
+ *
+ * // Map Result<const char*, E> to Result<size_t, E>
+ * Result<const char*, E> res("hello, map!");
+ * Result<size_t, E> res2 = res.map(strlen);
+ * MOZ_ASSERT(res2.unwrap() == 11);
+ *
+ * Mapping over an error does not invoke the function and copies the error:
+ *
+ * Result<V, int> res(5);
+ * MOZ_ASSERT(res.isErr());
+ * Result<W, int> res2 = res.map([](V v) { ... });
+ * MOZ_ASSERT(res2.isErr());
+ * MOZ_ASSERT(res2.unwrapErr() == 5);
+ */
+ template<typename F>
+ auto map(F f) const -> Result<decltype(f(*((V*) nullptr))), E> {
+ using RetResult = Result<decltype(f(*((V*) nullptr))), E>;
+ return isOk() ? RetResult(f(unwrap())) : RetResult(unwrapErr());
+ }
+};
+
+/**
+ * A type that auto-converts to an error Result. This is like a Result without
+ * a success type. It's the best return type for functions that always return
+ * an error--functions designed to build and populate error objects. It's also
+ * useful in error-handling macros; see MOZ_TRY for an example.
+ */
+template <typename E>
+class MOZ_MUST_USE_TYPE GenericErrorResult
+{
+ E mErrorValue;
+
+ template<typename V, typename E2> friend class Result;
+
+public:
+ explicit GenericErrorResult(E aErrorValue) : mErrorValue(aErrorValue) {}
+};
+
+template <typename E>
+inline GenericErrorResult<E>
+MakeGenericErrorResult(E&& aErrorValue)
+{
+ return GenericErrorResult<E>(aErrorValue);
+}
+
+} // namespace mozilla
+
+/**
+ * MOZ_TRY(expr) is the C++ equivalent of Rust's `try!(expr);`. First, it
+ * evaluates expr, which must produce a Result value. On success, it
+ * discards the result altogether. On error, it immediately returns an error
+ * Result from the enclosing function.
+ */
+#define MOZ_TRY(expr) \
+ do { \
+ auto mozTryTempResult_ = (expr); \
+ if (mozTryTempResult_.isErr()) { \
+ return ::mozilla::MakeGenericErrorResult(mozTryTempResult_.unwrapErr()); \
+ } \
+ } while (0)
+
+/**
+ * MOZ_TRY_VAR(target, expr) is the C++ equivalent of Rust's `target = try!(expr);`.
+ * First, it evaluates expr, which must produce a Result value.
+ * On success, the result's success value is assigned to target.
+ * On error, immediately returns the error result.
+ * |target| must evaluate to a reference without any side effects.
+ */
+#define MOZ_TRY_VAR(target, expr) \
+ do { \
+ auto mozTryVarTempResult_ = (expr); \
+ if (mozTryVarTempResult_.isErr()) { \
+ return ::mozilla::MakeGenericErrorResult( \
+ mozTryVarTempResult_.unwrapErr()); \
+ } \
+ (target) = mozTryVarTempResult_.unwrap(); \
+ } while (0)
+
+#endif // mozilla_Result_h
diff --git a/mfbt/TextUtils.h b/mfbt/TextUtils.h
index 84889b5ef4..66442a0d0b 100644
--- a/mfbt/TextUtils.h
+++ b/mfbt/TextUtils.h
@@ -35,6 +35,86 @@ public:
} // namespace detail
+// The overloads below are not templated in order to make
+// implicit conversions to span work as expected for the Span
+// overloads.
+
+/** Returns true iff |aChar| is ASCII, i.e. in the range [0, 0x80). */
+inline constexpr bool IsAscii(unsigned char aChar) { return aChar < 0x80; }
+
+/** Returns true iff |aChar| is ASCII, i.e. in the range [0, 0x80). */
+inline constexpr bool IsAscii(signed char aChar) {
+ return IsAscii(static_cast<unsigned char>(aChar));
+}
+
+/** Returns true iff |aChar| is ASCII, i.e. in the range [0, 0x80). */
+inline constexpr bool IsAscii(char aChar) {
+ return IsAscii(static_cast<unsigned char>(aChar));
+}
+
+/** Returns true iff |aChar| is ASCII, i.e. in the range [0, 0x80). */
+inline constexpr bool IsAscii(char16_t aChar) { return aChar < 0x80; }
+
+/** Returns true iff |aChar| is ASCII, i.e. in the range [0, 0x80). */
+inline constexpr bool IsAscii(char32_t aChar) { return aChar < 0x80; }
+
+/**
+ * Returns true iff every character in the null-terminated string pointed to by
+ * |aChar| is ASCII, i.e. in the range [0, 0x80).
+ */
+template <typename Char>
+constexpr bool IsAsciiNullTerminated(const Char* aChar) {
+ while (Char c = *aChar++) {
+ if (!IsAscii(c)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/**
+ * Returns true iff |aChar| matches Ascii Whitespace.
+ *
+ * This function is intended to match the Infra standard
+ * (https://infra.spec.whatwg.org/#ascii-whitespace)
+ */
+template <typename Char>
+constexpr bool IsAsciiWhitespace(Char aChar) {
+ using UnsignedChar = typename detail::MakeUnsignedChar<Char>::Type;
+ auto uc = static_cast<UnsignedChar>(aChar);
+ return uc == 0x9 || uc == 0xA || uc == 0xC || uc == 0xD || uc == 0x20;
+}
+
+/**
+ * Returns true iff |aChar| matches [a-z].
+ *
+ * This function is basically what you thought islower was, except its behavior
+ * doesn't depend on the user's current locale.
+ */
+template<typename Char>
+constexpr bool
+IsAsciiLowercaseAlpha(Char aChar)
+{
+ using UnsignedChar = typename detail::MakeUnsignedChar<Char>::Type;
+ auto uc = static_cast<UnsignedChar>(aChar);
+ return 'a' <= uc && uc <= 'z';
+}
+
+/**
+ * Returns true iff |aChar| matches [A-Z].
+ *
+ * This function is basically what you thought isupper was, except its behavior
+ * doesn't depend on the user's current locale.
+ */
+template<typename Char>
+constexpr bool
+IsAsciiUppercaseAlpha(Char aChar)
+{
+ using UnsignedChar = typename detail::MakeUnsignedChar<Char>::Type;
+ auto uc = static_cast<UnsignedChar>(aChar);
+ return 'A' <= uc && uc <= 'Z';
+}
+
/**
* Returns true iff |aChar| matches [a-zA-Z].
*
@@ -45,11 +125,72 @@ template<typename Char>
constexpr bool
IsAsciiAlpha(Char aChar)
{
+ return IsAsciiLowercaseAlpha(aChar) || IsAsciiUppercaseAlpha(aChar);
+}
+
+/**
+ * Returns true iff |aChar| matches [0-9].
+ *
+ * This function is basically what you thought isdigit was, except its behavior
+ * doesn't depend on the user's current locale.
+ */
+template<typename Char>
+constexpr bool
+IsAsciiDigit(Char aChar)
+{
using UnsignedChar = typename detail::MakeUnsignedChar<Char>::Type;
- return ('a' <= static_cast<UnsignedChar>(aChar) &&
- static_cast<UnsignedChar>(aChar) <= 'z') ||
- ('A' <= static_cast<UnsignedChar>(aChar) &&
- static_cast<UnsignedChar>(aChar) <= 'Z');
+ auto uc = static_cast<UnsignedChar>(aChar);
+ return '0' <= uc && uc <= '9';
+}
+
+/**
+ * Returns true iff |aChar| matches [0-9a-fA-F].
+ *
+ * This function is basically isxdigit, but guaranteed to be only for ASCII.
+ */
+template <typename Char>
+constexpr bool IsAsciiHexDigit(Char aChar) {
+ using UnsignedChar = typename detail::MakeUnsignedChar<Char>::Type;
+ auto uc = static_cast<UnsignedChar>(aChar);
+ return ('0' <= uc && uc <= '9') || ('a' <= uc && uc <= 'f') ||
+ ('A' <= uc && uc <= 'F');
+}
+
+/**
+ * Returns true iff |aChar| matches [a-zA-Z0-9].
+ *
+ * This function is basically what you thought isalnum was, except its behavior
+ * doesn't depend on the user's current locale.
+ */
+template <typename Char>
+constexpr bool IsAsciiAlphanumeric(Char aChar) {
+ return IsAsciiDigit(aChar) || IsAsciiAlpha(aChar);
+}
+
+/**
+ * Converts an ASCII alphanumeric digit [0-9a-zA-Z] to number as if in base-36.
+ * (This function therefore works for decimal, hexadecimal, etc.).
+ */
+template <typename Char>
+uint8_t AsciiAlphanumericToNumber(Char aChar) {
+ using UnsignedChar = typename detail::MakeUnsignedChar<Char>::Type;
+ auto uc = static_cast<UnsignedChar>(aChar);
+
+ if ('0' <= uc && uc <= '9') {
+ return uc - '0';
+ }
+
+ if ('A' <= uc && uc <= 'Z') {
+ return uc - 'A' + 10;
+ }
+
+ // Ideally this function would be constexpr, but unfortunately gcc at least as
+ // of 6.4 forbids non-constexpr function calls in unevaluated constexpr
+ // function calls. See bug 1453456. So for now, just assert and leave the
+ // entire function non-constexpr.
+ MOZ_ASSERT('a' <= uc && uc <= 'z',
+ "non-ASCII alphanumeric character can't be converted to number");
+ return uc - 'a' + 10;
}
} // namespace mozilla
diff --git a/mfbt/Vector.h b/mfbt/Vector.h
index 1fcd77242b..6d5c769e9d 100644
--- a/mfbt/Vector.h
+++ b/mfbt/Vector.h
@@ -18,6 +18,7 @@
#include "mozilla/Move.h"
#include "mozilla/OperatorNewExtensions.h"
#include "mozilla/ReentrancyGuard.h"
+#include "mozilla/Span.h"
#include "mozilla/TemplateLib.h"
#include "mozilla/TypeTraits.h"
@@ -553,6 +554,16 @@ public:
return *(end() - 1);
}
+ operator mozilla::Span<const T>() const
+ {
+ return mozilla::MakeSpan(mBegin, mLength);
+ }
+
+ operator mozilla::Span<T>()
+ {
+ return mozilla::MakeSpan(mBegin, mLength);
+ }
+
class Range
{
friend class Vector;
diff --git a/mfbt/moz.build b/mfbt/moz.build
index 4c2f903fb9..20c7234dd3 100644
--- a/mfbt/moz.build
+++ b/mfbt/moz.build
@@ -73,6 +73,7 @@ EXPORTS.mozilla = [
'RefCounted.h',
'RefCountType.h',
'RefPtr.h',
+ 'Result.h',
'ReverseIterator.h',
'RollingMean.h',
'Saturate.h',
diff --git a/mfbt/tests/TestResult.cpp b/mfbt/tests/TestResult.cpp
new file mode 100644
index 0000000000..b02e710003
--- /dev/null
+++ b/mfbt/tests/TestResult.cpp
@@ -0,0 +1,212 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <string.h>
+#include "mozilla/Result.h"
+
+using mozilla::GenericErrorResult;
+using mozilla::MakeGenericErrorResult;
+using mozilla::Ok;
+using mozilla::Result;
+
+struct Failed
+{
+ int x;
+};
+
+static_assert(sizeof(Result<Ok, Failed&>) == sizeof(uintptr_t),
+ "Result with empty value type should be pointer-sized");
+static_assert(sizeof(Result<int*, Failed&>) == sizeof(uintptr_t),
+ "Result with two aligned pointer types should be pointer-sized");
+static_assert(sizeof(Result<char*, Failed*>) > sizeof(char*),
+ "Result with unaligned success type `char*` must not be pointer-sized");
+static_assert(sizeof(Result<int*, char*>) > sizeof(char*),
+ "Result with unaligned error type `char*` must not be pointer-sized");
+
+static GenericErrorResult<Failed&>
+Fail()
+{
+ static Failed failed;
+ return MakeGenericErrorResult<Failed&>(failed);
+}
+
+static Result<Ok, Failed&>
+Task1(bool pass)
+{
+ if (!pass) {
+ return Fail(); // implicit conversion from GenericErrorResult to Result
+ }
+ return Ok();
+}
+
+static Result<int, Failed&>
+Task2(bool pass, int value)
+{
+ MOZ_TRY(Task1(pass)); // converts one type of result to another in the error case
+ return value; // implicit conversion from T to Result<T, E>
+}
+
+static Result<int, Failed&>
+Task3(bool pass1, bool pass2, int value)
+{
+ int x, y;
+ MOZ_TRY_VAR(x, Task2(pass1, value));
+ MOZ_TRY_VAR(y, Task2(pass2, value));
+ return x + y;
+}
+
+static void
+BasicTests()
+{
+ MOZ_RELEASE_ASSERT(Task1(true).isOk());
+ MOZ_RELEASE_ASSERT(!Task1(true).isErr());
+ MOZ_RELEASE_ASSERT(!Task1(false).isOk());
+ MOZ_RELEASE_ASSERT(Task1(false).isErr());
+
+ // MOZ_TRY works.
+ MOZ_RELEASE_ASSERT(Task2(true, 3).isOk());
+ MOZ_RELEASE_ASSERT(Task2(true, 3).unwrap() == 3);
+ MOZ_RELEASE_ASSERT(Task2(false, 3).isErr());
+
+ // MOZ_TRY_VAR works.
+ MOZ_RELEASE_ASSERT(Task3(true, true, 3).isOk());
+ MOZ_RELEASE_ASSERT(Task3(true, true, 3).unwrap() == 6);
+ MOZ_RELEASE_ASSERT(Task3(true, false, 3).isErr());
+ MOZ_RELEASE_ASSERT(Task3(false, true, 3).isErr());
+
+ // Lvalues should work too.
+ {
+ Result<Ok, Failed&> res = Task1(true);
+ MOZ_RELEASE_ASSERT(res.isOk());
+ MOZ_RELEASE_ASSERT(!res.isErr());
+
+ res = Task1(false);
+ MOZ_RELEASE_ASSERT(!res.isOk());
+ MOZ_RELEASE_ASSERT(res.isErr());
+ }
+
+ {
+ Result<int, Failed&> res = Task2(true, 3);
+ MOZ_RELEASE_ASSERT(res.isOk());
+ MOZ_RELEASE_ASSERT(res.unwrap() == 3);
+
+ res = Task2(false, 4);
+ MOZ_RELEASE_ASSERT(res.isErr());
+ }
+
+ // Some tests for pointer tagging.
+ {
+ int i = 123;
+ double d = 3.14;
+
+ Result<int*, double&> res = &i;
+ static_assert(sizeof(res) == sizeof(uintptr_t),
+ "should use pointer tagging to fit in a word");
+
+ MOZ_RELEASE_ASSERT(res.isOk());
+ MOZ_RELEASE_ASSERT(*res.unwrap() == 123);
+
+ res = MakeGenericErrorResult(d);
+ MOZ_RELEASE_ASSERT(res.isErr());
+ MOZ_RELEASE_ASSERT(&res.unwrapErr() == &d);
+ MOZ_RELEASE_ASSERT(res.unwrapErr() == 3.14);
+ }
+}
+
+
+/* * */
+
+struct Snafu : Failed {};
+
+static Result<Ok, Snafu*>
+Explode()
+{
+ static Snafu snafu;
+ return MakeGenericErrorResult(&snafu);
+}
+
+static Result<Ok, Failed*>
+ErrorGeneralization()
+{
+ MOZ_TRY(Explode()); // change error type from Snafu* to more general Failed*
+ return Ok();
+}
+
+static void
+TypeConversionTests()
+{
+ MOZ_RELEASE_ASSERT(ErrorGeneralization().isErr());
+}
+
+static void
+EmptyValueTest()
+{
+ struct Fine {};
+ mozilla::Result<Fine, int&> res((Fine()));
+ res.unwrap();
+ MOZ_RELEASE_ASSERT(res.isOk());
+ static_assert(sizeof(res) == sizeof(uintptr_t),
+ "Result with empty value type should be pointer-sized");
+}
+
+static void
+ReferenceTest()
+{
+ struct MyError { int x = 0; };
+ MyError merror;
+ Result<int, MyError&> res(merror);
+ MOZ_RELEASE_ASSERT(&res.unwrapErr() == &merror);
+}
+
+static void
+MapTest()
+{
+ struct MyError {
+ int x;
+
+ explicit MyError(int y) : x(y) { }
+ };
+
+ // Mapping over success values.
+ Result<int, MyError> res(5);
+ bool invoked = false;
+ auto res2 = res.map([&invoked](int x) {
+ MOZ_RELEASE_ASSERT(x == 5);
+ invoked = true;
+ return "hello";
+ });
+ MOZ_RELEASE_ASSERT(res2.isOk());
+ MOZ_RELEASE_ASSERT(invoked);
+ MOZ_RELEASE_ASSERT(strcmp(res2.unwrap(), "hello") == 0);
+
+ // Mapping over error values.
+ MyError err(1);
+ Result<char, MyError> res3(err);
+ MOZ_RELEASE_ASSERT(res3.isErr());
+ Result<char, MyError> res4 = res3.map([](int x) {
+ MOZ_RELEASE_ASSERT(false);
+ return 'a';
+ });
+ MOZ_RELEASE_ASSERT(res4.isErr());
+ MOZ_RELEASE_ASSERT(res4.unwrapErr().x == err.x);
+
+ // Function pointers instead of lamdbas as the mapping function.
+ Result<const char*, MyError> res5("hello");
+ auto res6 = res5.map(strlen);
+ MOZ_RELEASE_ASSERT(res6.isOk());
+ MOZ_RELEASE_ASSERT(res6.unwrap() == 5);
+}
+
+/* * */
+
+int main()
+{
+ BasicTests();
+ TypeConversionTests();
+ EmptyValueTest();
+ ReferenceTest();
+ MapTest();
+ return 0;
+}
diff --git a/mfbt/tests/moz.build b/mfbt/tests/moz.build
index 491e4f3396..1e1ac6975f 100644
--- a/mfbt/tests/moz.build
+++ b/mfbt/tests/moz.build
@@ -39,6 +39,7 @@ CppUnitTests([
'TestPair',
'TestRange',
'TestRefPtr',
+ 'TestResult',
'TestRollingMean',
'TestSaturate',
'TestScopeExit',
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
index 5e65557d9c..267cb39d6d 100644
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -2471,15 +2471,6 @@ pref("layout.css.scroll-snap.prediction-sensitivity", "0.750");
// Is support for basic shapes in clip-path enabled?
pref("layout.css.clip-path-shapes.enabled", true);
-// Is support for DOMPoint enabled?
-pref("layout.css.DOMPoint.enabled", true);
-
-// Is support for DOMQuad enabled?
-pref("layout.css.DOMQuad.enabled", true);
-
-// Is support for DOMMatrix enabled?
-pref("layout.css.DOMMatrix.enabled", true);
-
// Is support for GeometryUtils.getBoxQuads enabled?
pref("layout.css.getBoxQuads.enabled", true);
diff --git a/moz.configure b/moz.configure
index f3718f9493..eed4b87d5d 100644
--- a/moz.configure
+++ b/moz.configure
@@ -43,6 +43,8 @@ include('build/moz.configure/headers.configure',
when='--enable-compile-environment')
include('build/moz.configure/warnings.configure',
when='--enable-compile-environment')
+include('build/moz.configure/flags.configure',
+ when='--enable-compile-environment')
include(include_project_configure)
diff --git a/netwerk/protocol/http/nsCORSListenerProxy.cpp b/netwerk/protocol/http/nsCORSListenerProxy.cpp
index 499c03094b..d2c37415e5 100644
--- a/netwerk/protocol/http/nsCORSListenerProxy.cpp
+++ b/netwerk/protocol/http/nsCORSListenerProxy.cpp
@@ -1344,7 +1344,7 @@ nsCORSPreflightListener::CheckPreflightRequestApproved(nsIRequest* aRequest)
headerVal);
nsTArray<nsCString> headers;
nsCCharSeparatedTokenizer headerTokens(headerVal, ',');
- bool allowAllHeaders = false;
+ bool wildcard = false;
while(headerTokens.hasMoreTokens()) {
const nsDependentCSubstring& header = headerTokens.nextToken();
if (header.IsEmpty()) {
@@ -1356,19 +1356,31 @@ nsCORSPreflightListener::CheckPreflightRequestApproved(nsIRequest* aRequest)
return NS_ERROR_DOM_BAD_URI;
}
if (header.EqualsLiteral("*") && !mWithCredentials) {
- allowAllHeaders = true;
+ wildcard = true;
} else {
headers.AppendElement(header);
}
}
- if (!allowAllHeaders) {
- for (uint32_t i = 0; i < mPreflightHeaders.Length(); ++i) {
- if (!headers.Contains(mPreflightHeaders[i],
- nsCaseInsensitiveCStringArrayComparator())) {
- LogBlockedRequest(aRequest, "CORSMissingAllowHeaderFromPreflight",
- NS_ConvertUTF8toUTF16(mPreflightHeaders[i]).get());
- return NS_ERROR_DOM_BAD_URI;
- }
+ for (uint32_t i = 0; i < mPreflightHeaders.Length(); ++i) {
+ if (wildcard
+ // Access-Control-Allow-Headers is '*', so we should skip these checks.
+#if 0
+ && !mPreflightHeaders[i].LowerCaseEqualsASCII("authorization")
+ // However, according to the spec, 'Authorization' isn't allowed to be
+ // wildcarded here and must always be explicitly mentioned.
+ // Fixme: Mainstream keeps this disabled because nobody obeys this rule.
+ // This should be flipped on when either mainstream does or when there's enough
+ // effort to make websites adhere to the spec, to keep our implementation
+ // in line with the consensus on the web.
+#endif
+ ) {
+ continue;
+ }
+ if (!headers.Contains(mPreflightHeaders[i],
+ nsCaseInsensitiveCStringArrayComparator())) {
+ LogBlockedRequest(aRequest, "CORSMissingAllowHeaderFromPreflight",
+ NS_ConvertUTF8toUTF16(mPreflightHeaders[i]).get());
+ return NS_ERROR_DOM_BAD_URI;
}
}
diff --git a/old-configure.in b/old-configure.in
index e2da8b8f6c..d351b81752 100644
--- a/old-configure.in
+++ b/old-configure.in
@@ -4902,10 +4902,12 @@ MOZ_CONFIG_ICU()
dnl Echo the CFLAGS to remove extra whitespace.
CFLAGS=`echo \
$_WARNINGS_CFLAGS \
+ $_COMPILATION_CFLAGS \
$CFLAGS`
CXXFLAGS=`echo \
$_WARNINGS_CXXFLAGS \
+ $_COMPILATION_CXXFLAGS \
$CXXFLAGS`
COMPILE_CFLAGS=`echo \
diff --git a/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py b/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
index c58fde86e8..be3670e53e 100644
--- a/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
+++ b/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
@@ -324,7 +324,7 @@ class LinuxToolchainTest(BaseToolchainTest):
language='C',
)
GXX_4_9_RESULT = CompilerResult(
- flags=['-std=gnu++11'],
+ flags=['-std=gnu++14'],
version='4.9.3',
type='gcc',
compiler='/usr/bin/g++',
@@ -338,7 +338,7 @@ class LinuxToolchainTest(BaseToolchainTest):
language='C',
)
GXX_5_RESULT = CompilerResult(
- flags=['-std=gnu++11'],
+ flags=['-std=gnu++14'],
version='5.2.1',
type='gcc',
compiler='/usr/bin/g++-5',
@@ -360,7 +360,7 @@ class LinuxToolchainTest(BaseToolchainTest):
language='C',
)
CLANGXX_3_6_RESULT = CompilerResult(
- flags=['-std=gnu++11'],
+ flags=['-std=gnu++14'],
version='3.6.2',
type='clang',
compiler='/usr/bin/clang++',
diff --git a/toolkit/locales/en-US/chrome/global/aboutSupport.dtd b/toolkit/locales/en-US/chrome/global/aboutSupport.dtd
index 02eb34664a..f827268b43 100644
--- a/toolkit/locales/en-US/chrome/global/aboutSupport.dtd
+++ b/toolkit/locales/en-US/chrome/global/aboutSupport.dtd
@@ -25,15 +25,6 @@ This is likely the same like id.heading in crashes.dtd. -->
<!ENTITY aboutSupport.extensionVersion "Version">
<!ENTITY aboutSupport.extensionId "ID">
-<!ENTITY aboutSupport.experimentsTitle "Experimental Features">
-<!ENTITY aboutSupport.experimentName "Name">
-<!ENTITY aboutSupport.experimentId "ID">
-<!ENTITY aboutSupport.experimentDescription "Description">
-<!ENTITY aboutSupport.experimentActive "Active">
-<!ENTITY aboutSupport.experimentEndDate "End Date">
-<!ENTITY aboutSupport.experimentHomepage "Homepage">
-<!ENTITY aboutSupport.experimentBranch "Branch">
-
<!ENTITY aboutSupport.appBasicsTitle "Application Basics">
<!ENTITY aboutSupport.appBasicsName "Name">
<!ENTITY aboutSupport.appBasicsVersion "Version">
diff --git a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
index 9ec6eaa12d..34c60d36a9 100644
--- a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
+++ b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
@@ -219,15 +219,4 @@
<!ENTITY settings.path.button.label "Browse…">
-<!-- LOCALIZATION NOTE (experiment.info.label): The strings related to
- experiments are present on the "Experiments" tab of the add-ons manager.
- This tab won't be displayed unless an Experiment add-on is installed.
- Install https://people.mozilla.org/~gszorc/dummy-experiment-addon.xpi
- to cause this tab to appear. -->
-<!ENTITY experiment.info.label "What's this? Telemetry may install and run experiments from time to time.">
-<!ENTITY experiment.info.learnmore "Learn More">
-<!ENTITY experiment.info.learnmore.accesskey "L">
-<!ENTITY experiment.info.changetelemetry "Telemetry Settings">
-<!ENTITY experiment.info.changetelemetry.accesskey "T">
-
<!ENTITY setting.learnmore "Learn More…">
diff --git a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.properties b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.properties
index 370198f569..c5de4f0c04 100644
--- a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.properties
@@ -103,44 +103,6 @@ details.notification.upgrade=%1$S will be updated after you restart %2$S.
#LOCALIZATION NOTE (details.notification.gmpPending) %1$S is the add-on name
details.notification.gmpPending=%1$S will be installed shortly.
-# LOCALIZATION NOTE (details.experiment.time.daysRemaining):
-# Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of days from now that the experiment will remain active (detail view).
-details.experiment.time.daysRemaining=#1 day remaining;#1 days remaining
-#LOCALIZATION NOTE (details.experiment.time.endsToday) The experiment will end in less than a day (detail view).
-details.experiment.time.endsToday=Less than a day remaining
-# LOCALIZATION NOTE (details.experiment.time.daysPassed):
-# Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of days since the experiment ran (detail view).
-details.experiment.time.daysPassed=#1 day ago;#1 days ago
-#LOCALIZATION NOTE (details.experiment.time.endedToday) The experiment ended less than a day ago (detail view).
-details.experiment.time.endedToday=Less than a day ago
-#LOCALIZATION NOTE (details.experiment.state.active) This experiment is active (detail view).
-details.experiment.state.active=Active
-#LOCALIZATION NOTE (details.experiment.state.complete) This experiment is complete (it was previously active) (detail view).
-details.experiment.state.complete=Complete
-
-# LOCALIZATION NOTE (experiment.time.daysRemaining):
-# Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of days from now that the experiment will remain active (list view item).
-experiment.time.daysRemaining=#1 day remaining;#1 days remaining
-#LOCALIZATION NOTE (experiment.time.endsToday) The experiment will end in less than a day (list view item).
-experiment.time.endsToday=Less than a day remaining
-# LOCALIZATION NOTE (experiment.time.daysPassed):
-# Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of days since the experiment ran (list view item).
-experiment.time.daysPassed=#1 day ago;#1 days ago
-#LOCALIZATION NOTE (experiment.time.endedToday) The experiment ended less than a day ago (list view item).
-experiment.time.endedToday=Less than a day ago
-#LOCALIZATION NOTE (experiment.state.active) This experiment is active (list view item).
-experiment.state.active=Active
-#LOCALIZATION NOTE (experiment.state.complete) This experiment is complete (it was previously active) (list view item).
-experiment.state.complete=Complete
-
installFromFile.dialogTitle=Select add-on to install
installFromFile.filterName=Add-ons
@@ -174,4 +136,3 @@ type.locale.name=Languages
type.plugin.name=Plugins
type.dictionary.name=Dictionaries
type.service.name=Services
-type.experiment.name=Experiments
diff --git a/toolkit/mozapps/extensions/content/extensions.css b/toolkit/mozapps/extensions/content/extensions.css
index 41c1405657..3eeb173bde 100644
--- a/toolkit/mozapps/extensions/content/extensions.css
+++ b/toolkit/mozapps/extensions/content/extensions.css
@@ -202,10 +202,6 @@ setting[type="menulist"] {
display: none;
}
-#addons-page .view-pane:not([type="experiment"]) .experiment-info-container {
- display: none;
-}
-
.addon .relnotes {
-moz-user-select: text;
}
@@ -236,36 +232,6 @@ richlistitem:not([selected]) * {
display: none;
}
-#experiments-learn-more[disabled="true"] {
- display: none;
-}
-
-#experiments-change-telemetry[disabled="true"] {
- display: none;
-}
-
-.view-pane[type="experiment"] .error,
-.view-pane[type="experiment"] .warning,
-.view-pane[type="experiment"] .addon:not([pending="uninstall"]) .pending,
-.view-pane[type="experiment"] .disabled-postfix,
-.view-pane[type="experiment"] .update-postfix,
-.view-pane[type="experiment"] .version,
-#detail-view[type="experiment"] .alert-container,
-#detail-view[type="experiment"] #detail-version,
-#detail-view[type="experiment"] #detail-creator {
- display: none;
-}
-
-.view-pane:not([type="experiment"]) .experiment-container,
-.view-pane:not([type="experiment"]) #detail-experiment-container {
- display: none;
-}
-
-.addon[type="experiment"][status="installing"] .experiment-time,
-.addon[type="experiment"][status="installing"] .experiment-state {
- display: none;
-}
-
/* Indicator style for extension target application */
.addon[native] .nativeIndicator {
margin-left: 5pt;
diff --git a/toolkit/mozapps/extensions/content/extensions.xml b/toolkit/mozapps/extensions/content/extensions.xml
index 721b134191..94b12682d9 100644
--- a/toolkit/mozapps/extensions/content/extensions.xml
+++ b/toolkit/mozapps/extensions/content/extensions.xml
@@ -868,15 +868,6 @@
<xul:label anonid="date-updated" class="date-updated"
unknown="&addon.unknownDate;"/>
</xul:hbox>
- <xul:hbox class="experiment-container">
- <svg width="6" height="6" viewBox="0 0 6 6" version="1.1"
- xmlns="http://www.w3.org/2000/svg"
- class="experiment-bullet-container">
- <circle cx="3" cy="3" r="3" class="experiment-bullet"/>
- </svg>
- <xul:label anonid="experiment-state" class="experiment-state"/>
- <xul:label anonid="experiment-time" class="experiment-time"/>
- </xul:hbox>
<xul:hbox class="advancedinfo-container" flex="1">
<xul:vbox class="description-outer-container" flex="1">
@@ -1042,12 +1033,6 @@
<field name="_version">
document.getAnonymousElementByAttribute(this, "anonid", "version");
</field>
- <field name="_experimentState">
- document.getAnonymousElementByAttribute(this, "anonid", "experiment-state");
- </field>
- <field name="_experimentTime">
- document.getAnonymousElementByAttribute(this, "anonid", "experiment-time");
- </field>
<field name="_icon">
document.getAnonymousElementByAttribute(this, "anonid", "icon");
</field>
@@ -1419,37 +1404,6 @@
var showProgress = this.mAddon.purchaseURL || (this.mAddon.install &&
this.mAddon.install.state != AddonManager.STATE_INSTALLED);
this._showStatus(showProgress ? "progress" : "none");
-
- if (this.mAddon.type == "experiment") {
- this.removeAttribute("notification");
- let prefix = "experiment.";
- let active = this.mAddon.isActive;
-
- if (!showProgress) {
- let stateKey = prefix + "state." + (active ? "active" : "complete");
- this._experimentState.value = gStrings.ext.GetStringFromName(stateKey);
-
- let now = Date.now();
- let end = this.endDate;
- let days = Math.abs(end - now) / (24 * 60 * 60 * 1000);
-
- let timeKey = prefix + "time.";
- let timeMessage;
-
- if (days < 1) {
- timeKey += (active ? "endsToday" : "endedToday");
- timeMessage = gStrings.ext.GetStringFromName(timeKey);
- } else {
- timeKey += (active ? "daysRemaining" : "daysPassed");
- days = Math.round(days);
- let timeString = gStrings.ext.GetStringFromName(timeKey);
- timeMessage = PluralForm.get(days, timeString)
- .replace("#1", days);
- }
-
- this._experimentTime.value = timeMessage;
- }
- }
]]></body>
</method>
diff --git a/toolkit/mozapps/extensions/content/extensions.xul b/toolkit/mozapps/extensions/content/extensions.xul
index 70ce55fa26..a61bb61627 100644
--- a/toolkit/mozapps/extensions/content/extensions.xul
+++ b/toolkit/mozapps/extensions/content/extensions.xul
@@ -91,8 +91,6 @@
<command id="cmd_enableUpdateSecurity"/>
<command id="cmd_toggleAutoUpdateDefault"/>
<command id="cmd_resetAddonAutoUpdate"/>
- <command id="cmd_experimentsLearnMore"/>
- <command id="cmd_experimentsOpenTelemetryPreferences"/>
</commandset>
<!-- view commands - these act on the selected addon -->
@@ -354,22 +352,6 @@
<spacer flex="5000"/> <!-- Necessary to allow the message to wrap -->
</hbox>
</hbox>
- <hbox class="view-header global-info-container experiment-info-container">
- <hbox class="global-info" flex="1" align="center">
- <label value="&experiment.info.label;"/>
- <button id="experiments-learn-more"
- label="&experiment.info.learnmore;"
- tooltiptext="&experiment.info.learnmore;"
- accesskey="&experiment.info.learnmore.accesskey;"
- command="cmd_experimentsLearnMore"/>
- <button id="experiments-change-telemetry"
- label="&experiment.info.changetelemetry;"
- tooltiptext="&experiment.info.changetelemetry;"
- accesskey="&experiment.info.changetelemetry.accesskey;"
- command="cmd_experimentsOpenTelemetryPreferences"/>
- <spacer flex="5000"/> <!-- Necessary to allow the message to wrap. -->
- </hbox>
- </hbox>
<vbox id="addon-list-empty" class="alert-container"
flex="1" hidden="true">
<spacer class="alert-spacer-before"/>
@@ -530,15 +512,6 @@
<label id="detail-creator" class="creator"/>
<label id="detail-translators" class="translators"/>
</vbox>
- <hbox id="detail-experiment-container">
- <svg width="8" height="8" viewBox="0 0 8 8" version="1.1"
- xmlns="http://www.w3.org/2000/svg"
- id="detail-experiment-bullet-container">
- <circle cx="4" cy="4" r="4" id="detail-experiment-bullet"/>
- </svg>
- <label id="detail-experiment-state"/>
- <label id="detail-experiment-time"/>
- </hbox>
<hbox id="detail-desc-container" align="start">
<vbox pack="center"> <!-- Necessary to work around bug 394738 -->
<image id="detail-screenshot" hidden="true"/>
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
index add3f3d727..4249e3a0bd 100644
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -196,12 +196,10 @@ const TYPES = {
locale: 8,
multipackage: 32,
dictionary: 64,
- experiment: 128,
};
const RESTARTLESS_TYPES = new Set([
"dictionary",
- "experiment",
"locale",
]);
@@ -943,30 +941,13 @@ function loadManifestFromRDF(aUri, aStream) {
if (addon.type == "theme") {
addon.userDisabled = !!LightweightThemeManager.currentTheme ||
addon.internalName != XPIProvider.selectedSkin;
- }
- // Experiments are disabled by default. It is up to the Experiments Manager
- // to enable them (it drives installation).
- else if (addon.type == "experiment") {
- addon.userDisabled = true;
- }
- else {
+ } else {
addon.userDisabled = false;
addon.softDisabled = addon.blocklistState == Blocklist.STATE_SOFTBLOCKED;
}
addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;
- // Experiments are managed and updated through an external "experiments
- // manager." So disable some built-in mechanisms.
- if (addon.type == "experiment") {
- addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE;
- addon.updateURL = null;
- addon.updateKey = null;
-
- addon.targetApplications = [];
- addon.targetPlatforms = [];
- }
-
// Load the storage service before NSS (nsIRandomGenerator),
// to avoid a SQLite initialization error (bug 717904).
let storage = Services.storage;
@@ -1827,8 +1808,6 @@ this.XPIProvider = {
// Keep track of the newest file in each add-on, in case we want to
// report it.
_mostRecentlyModifiedFile: {},
- // Experiments are disabled by default. Track ones that are locally enabled.
- _enabledExperiments: null,
// A Map from an add-on install to its ID
_addonFileMap: new Map(),
#ifdef MOZ_DEVTOOLS
@@ -2002,8 +1981,6 @@ this.XPIProvider = {
this.installLocationsByName = {};
// Hook for tests to detect when saving database at shutdown time fails
this._shutdownError = null;
- // Clear the set of enabled experiments (experiments disabled by default).
- this._enabledExperiments = new Set();
let hasRegistry = ("nsIWindowsRegKey" in Ci);
@@ -2316,19 +2293,8 @@ this.XPIProvider = {
* Persists changes to XPIProvider.bootstrappedAddons to its store (a pref).
*/
persistBootstrappedAddons: function XPI_persistBootstrappedAddons() {
- // Experiments are disabled upon app load, so don't persist references.
- let filtered = {};
- for (let id in this.bootstrappedAddons) {
- let entry = this.bootstrappedAddons[id];
- if (entry.type == "experiment") {
- continue;
- }
-
- filtered[id] = entry;
- }
-
Services.prefs.setCharPref(PREF_BOOTSTRAP_ADDONS,
- JSON.stringify(filtered));
+ JSON.stringify(this.bootstrappedAddons));
},
/**
@@ -4486,15 +4452,11 @@ this.XPIProvider = {
let appDisabledChanged = aAddon.appDisabled != appDisabled;
// Update the properties in the database.
- // We never persist this for experiments because the disabled flags
- // are controlled by the Experiments Manager.
- if (aAddon.type != "experiment") {
- XPIDatabase.setAddonProperties(aAddon, {
- userDisabled: aUserDisabled,
- appDisabled: appDisabled,
- softDisabled: aSoftDisabled
- });
- }
+ XPIDatabase.setAddonProperties(aAddon, {
+ userDisabled: aUserDisabled,
+ appDisabled: appDisabled,
+ softDisabled: aSoftDisabled
+ });
if (appDisabledChanged) {
AddonManagerPrivate.callAddonListeners("onPropertyChanged",
@@ -6383,17 +6345,6 @@ AddonInternal.prototype = {
},
isCompatibleWith: function AddonInternal_isCompatibleWith(aAppVersion, aPlatformVersion) {
- // Experiments are installed through an external mechanism that
- // limits target audience to compatible clients. We trust it knows what
- // it's doing and skip compatibility checks.
- //
- // This decision does forfeit defense in depth. If the experiments system
- // is ever wrong about targeting an add-on to a specific application
- // or platform, the client will likely see errors.
- if (this.type == "experiment") {
- return true;
- }
-
let app = this.matchingTargetApplication;
if (!app)
return false;
@@ -6607,13 +6558,6 @@ AddonInternal.prototype = {
if (!(this.inDatabase))
return permissions;
- // Experiments can only be uninstalled. An uninstall reflects the user
- // intent of "disable this experiment." This is partially managed by the
- // experiments manager.
- if (this.type == "experiment") {
- return AddonManager.PERM_CAN_UNINSTALL;
- }
-
if (!this.appDisabled) {
if (this.userDisabled || this.softDisabled) {
permissions |= AddonManager.PERM_CAN_ENABLE;
@@ -6876,11 +6820,6 @@ function AddonWrapper(aAddon) {
return aAddon.applyBackgroundUpdates;
});
this.__defineSetter__("applyBackgroundUpdates", function AddonWrapper_applyBackgroundUpdatesSetter(val) {
- if (this.type == "experiment") {
- logger.warn("Setting applyBackgroundUpdates on an experiment is not supported.");
- return;
- }
-
if (val != AddonManager.AUTOUPDATE_DEFAULT &&
val != AddonManager.AUTOUPDATE_DISABLE &&
val != AddonManager.AUTOUPDATE_ENABLE) {
@@ -6945,15 +6884,10 @@ function AddonWrapper(aAddon) {
return AddonManager.PENDING_UNINSTALL;
}
- // Extensions have an intentional inconsistency between what the DB says is
- // enabled and what we say to the ouside world. so we need to cover up that
- // lie here as well.
- if (aAddon.type != "experiment") {
- if (aAddon.active && aAddon.disabled)
- pending |= AddonManager.PENDING_DISABLE;
- else if (!aAddon.active && !aAddon.disabled)
- pending |= AddonManager.PENDING_ENABLE;
- }
+ if (aAddon.active && aAddon.disabled)
+ pending |= AddonManager.PENDING_DISABLE;
+ else if (!aAddon.active && !aAddon.disabled)
+ pending |= AddonManager.PENDING_ENABLE;
if (aAddon.pendingUpgrade)
pending |= AddonManager.PENDING_UPGRADE;
@@ -6990,10 +6924,6 @@ function AddonWrapper(aAddon) {
});
this.__defineGetter__("userDisabled", function AddonWrapper_userDisabledGetter() {
- if (XPIProvider._enabledExperiments.has(aAddon.id)) {
- return false;
- }
-
return aAddon.softDisabled || aAddon.userDisabled;
});
this.__defineSetter__("userDisabled", function AddonWrapper_userDisabledSetter(val) {
@@ -7001,14 +6931,6 @@ function AddonWrapper(aAddon) {
return val;
}
- if (aAddon.type == "experiment") {
- if (val) {
- XPIProvider._enabledExperiments.delete(aAddon.id);
- } else {
- XPIProvider._enabledExperiments.add(aAddon.id);
- }
- }
-
if (aAddon.inDatabase) {
if (aAddon.type == "theme" && val) {
if (aAddon.internalName == XPIProvider.defaultSkin)
@@ -7066,14 +6988,6 @@ function AddonWrapper(aAddon) {
};
this.findUpdates = function AddonWrapper_findUpdates(aListener, aReason, aAppVersion, aPlatformVersion) {
- // Short-circuit updates for experiments because updates are handled
- // through the Experiments Manager.
- if (this.type == "experiment") {
- AddonManagerPrivate.callNoUpdateListeners(this, aListener, aReason,
- aAppVersion, aPlatformVersion);
- return;
- }
-
new UpdateChecker(aAddon, aListener, aReason, aAppVersion, aPlatformVersion);
};
@@ -7810,17 +7724,4 @@ var addonTypes = [
AddonManager.TYPE_UI_HIDE_EMPTY | AddonManager.TYPE_SUPPORTS_UNDO_RESTARTLESS_UNINSTALL),
];
-// We only register experiments support if the application supports them.
-// Ideally, we would install an observer to watch the pref. Installing
-// an observer for this pref is not necessary here and may be buggy with
-// regards to registering this XPIProvider twice.
-if (Preferences.get("experiments.supported", false)) {
- addonTypes.push(
- new AddonManagerPrivate.AddonType("experiment",
- URI_EXTENSION_STRINGS,
- STRING_TYPE_NAME,
- AddonManager.VIEW_TYPE_LIST, 11000,
- AddonManager.TYPE_UI_HIDE_EMPTY | AddonManager.TYPE_SUPPORTS_UNDO_RESTARTLESS_UNINSTALL));
-}
-
AddonManagerPrivate.registerProvider(XPIProvider, addonTypes);
diff --git a/toolkit/themes/linux/mozapps/extensions/category-experiments.png b/toolkit/themes/linux/mozapps/extensions/category-experiments.png
deleted file mode 100644
index a9d00545ef..0000000000
--- a/toolkit/themes/linux/mozapps/extensions/category-experiments.png
+++ /dev/null
Binary files differ
diff --git a/toolkit/themes/linux/mozapps/extensions/experimentGeneric.png b/toolkit/themes/linux/mozapps/extensions/experimentGeneric.png
deleted file mode 100644
index a9d00545ef..0000000000
--- a/toolkit/themes/linux/mozapps/extensions/experimentGeneric.png
+++ /dev/null
Binary files differ
diff --git a/toolkit/themes/linux/mozapps/extensions/extensions.css b/toolkit/themes/linux/mozapps/extensions/extensions.css
index 5c642fbbf1..577c65e654 100644
--- a/toolkit/themes/linux/mozapps/extensions/extensions.css
+++ b/toolkit/themes/linux/mozapps/extensions/extensions.css
@@ -226,9 +226,6 @@
#category-dictionary > .category-icon {
list-style-image: url("chrome://mozapps/skin/extensions/category-dictionaries.png");
}
-#category-experiment > .category-icon {
- list-style-image: url("chrome://mozapps/skin/extensions/category-experiments.png");
-}
#category-availableUpdates > .category-icon {
list-style-image: url("chrome://mozapps/skin/extensions/category-available.png");
}
@@ -420,10 +417,6 @@
list-style-image: url("chrome://mozapps/skin/extensions/dictionaryGeneric.png");
}
-.addon-view[type="experiment"] .icon {
- list-style-image: url("chrome://mozapps/skin/extensions/experimentGeneric.png");
-}
-
.name-container {
font-size: 150%;
margin-bottom: 0;
@@ -927,30 +920,3 @@ setting[type="radio"] > radiogroup {
.header-button .toolbarbutton-text {
display: none;
}
-
-/*** telemetry experiments ***/
-
-#detail-experiment-container {
- font-size: 80%;
- margin-bottom: 1em;
-}
-
-#detail-experiment-bullet-container,
-#detail-experiment-state,
-#detail-experiment-time,
-.experiment-bullet-container,
-.experiment-state,
-.experiment-time {
- vertical-align: middle;
- display: inline-block;
-}
-
-.addon .experiment-bullet,
-#detail-experiment-bullet {
- fill: rgb(158, 158, 158);
-}
-
-.addon[active="true"] .experiment-bullet,
-#detail-view[active="true"] #detail-experiment-bullet {
- fill: rgb(106, 201, 20);
-}
diff --git a/toolkit/themes/linux/mozapps/jar.mn b/toolkit/themes/linux/mozapps/jar.mn
index 0931d1823d..3cd92a4a78 100644
--- a/toolkit/themes/linux/mozapps/jar.mn
+++ b/toolkit/themes/linux/mozapps/jar.mn
@@ -15,14 +15,12 @@ toolkit.jar:
skin/classic/mozapps/extensions/category-plugins.png (extensions/category-plugins.png)
skin/classic/mozapps/extensions/category-service.png (extensions/category-service.png)
skin/classic/mozapps/extensions/category-dictionaries.png (extensions/category-dictionaries.png)
- skin/classic/mozapps/extensions/category-experiments.png (extensions/category-experiments.png)
skin/classic/mozapps/extensions/category-recent.png (extensions/category-recent.png)
skin/classic/mozapps/extensions/category-available.png (extensions/category-available.png)
skin/classic/mozapps/extensions/extensionGeneric.png (extensions/extensionGeneric.png)
skin/classic/mozapps/extensions/extensionGeneric-16.png (extensions/extensionGeneric-16.png)
skin/classic/mozapps/extensions/dictionaryGeneric.png (extensions/dictionaryGeneric.png)
skin/classic/mozapps/extensions/dictionaryGeneric-16.png (extensions/dictionaryGeneric-16.png)
- skin/classic/mozapps/extensions/experimentGeneric.png (extensions/experimentGeneric.png)
skin/classic/mozapps/extensions/themeGeneric.png (extensions/themeGeneric.png)
skin/classic/mozapps/extensions/themeGeneric-16.png (extensions/themeGeneric-16.png)
skin/classic/mozapps/extensions/localeGeneric.png (extensions/localeGeneric.png)
diff --git a/toolkit/themes/osx/mozapps/extensions/category-experiments.png b/toolkit/themes/osx/mozapps/extensions/category-experiments.png
deleted file mode 100644
index a9d00545ef..0000000000
--- a/toolkit/themes/osx/mozapps/extensions/category-experiments.png
+++ /dev/null
Binary files differ
diff --git a/toolkit/themes/osx/mozapps/extensions/experimentGeneric.png b/toolkit/themes/osx/mozapps/extensions/experimentGeneric.png
deleted file mode 100644
index a9d00545ef..0000000000
--- a/toolkit/themes/osx/mozapps/extensions/experimentGeneric.png
+++ /dev/null
Binary files differ
diff --git a/toolkit/themes/osx/mozapps/extensions/extensions.css b/toolkit/themes/osx/mozapps/extensions/extensions.css
index 474cb12d10..80ca44c191 100644
--- a/toolkit/themes/osx/mozapps/extensions/extensions.css
+++ b/toolkit/themes/osx/mozapps/extensions/extensions.css
@@ -258,9 +258,6 @@
#category-dictionary > .category-icon {
list-style-image: url("chrome://mozapps/skin/extensions/category-dictionaries.png");
}
-#category-experiment > .category-icon {
- list-style-image: url("chrome://mozapps/skin/extensions/category-experiments.png");
-}
#category-availableUpdates > .category-icon {
list-style-image: url("chrome://mozapps/skin/extensions/category-available.png");
}
@@ -485,10 +482,6 @@
list-style-image: url("chrome://mozapps/skin/extensions/dictionaryGeneric.png");
}
-.addon-view[type="experiment"] .icon {
- list-style-image: url("chrome://mozapps/skin/extensions/experimentGeneric.png");
-}
-
.name-container {
font-size: 150%;
margin-bottom: 0;
@@ -1177,30 +1170,3 @@ button.button-link:not([disabled="true"]):active:hover {
box-shadow: inset 0 0 4px rgb(45,54,71), 0 1px rgba(255,255,255,0.25);
background-image: linear-gradient(rgba(45,54,71,0.6), transparent);
}
-
-/*** telemetry experiments ***/
-
-#detail-experiment-container {
- font-size: 80%;
- margin-bottom: 1em;
-}
-
-#detail-experiment-bullet-container,
-#detail-experiment-state,
-#detail-experiment-time,
-.experiment-bullet-container,
-.experiment-state,
-.experiment-time {
- vertical-align: middle;
- display: inline-block;
-}
-
-.addon .experiment-bullet,
-#detail-experiment-bullet {
- fill: rgb(158, 158, 158);
-}
-
-.addon[active="true"] .experiment-bullet,
-#detail-view[active="true"] #detail-experiment-bullet {
- fill: rgb(106, 201, 20);
-}
diff --git a/toolkit/themes/osx/mozapps/jar.mn b/toolkit/themes/osx/mozapps/jar.mn
index eabd2eddb5..c0c66225f3 100644
--- a/toolkit/themes/osx/mozapps/jar.mn
+++ b/toolkit/themes/osx/mozapps/jar.mn
@@ -17,7 +17,6 @@ toolkit.jar:
skin/classic/mozapps/extensions/category-plugins.png (extensions/category-plugins.png)
skin/classic/mozapps/extensions/category-service.png (extensions/category-service.png)
skin/classic/mozapps/extensions/category-dictionaries.png (extensions/category-dictionaries.png)
- skin/classic/mozapps/extensions/category-experiments.png (extensions/category-experiments.png)
skin/classic/mozapps/extensions/category-recent.png (extensions/category-recent.png)
skin/classic/mozapps/extensions/category-available.png (extensions/category-available.png)
skin/classic/mozapps/extensions/discover-logo.png (extensions/discover-logo.png)
@@ -27,7 +26,6 @@ toolkit.jar:
skin/classic/mozapps/extensions/themeGeneric-16.png (extensions/themeGeneric-16.png)
skin/classic/mozapps/extensions/dictionaryGeneric.png (extensions/dictionaryGeneric.png)
skin/classic/mozapps/extensions/dictionaryGeneric-16.png (extensions/dictionaryGeneric-16.png)
- skin/classic/mozapps/extensions/experimentGeneric.png (extensions/experimentGeneric.png)
skin/classic/mozapps/extensions/localeGeneric.png (extensions/localeGeneric.png)
skin/classic/mozapps/extensions/rating-won.png (extensions/rating-won.png)
skin/classic/mozapps/extensions/rating-not-won.png (extensions/rating-not-won.png)
diff --git a/toolkit/themes/windows/mozapps/extensions/experimentGeneric.png b/toolkit/themes/windows/mozapps/extensions/experimentGeneric.png
deleted file mode 100644
index a9d00545ef..0000000000
--- a/toolkit/themes/windows/mozapps/extensions/experimentGeneric.png
+++ /dev/null
Binary files differ
diff --git a/toolkit/themes/windows/mozapps/extensions/extensions.css b/toolkit/themes/windows/mozapps/extensions/extensions.css
index f350f7ca64..51d95af86b 100644
--- a/toolkit/themes/windows/mozapps/extensions/extensions.css
+++ b/toolkit/themes/windows/mozapps/extensions/extensions.css
@@ -276,9 +276,6 @@
#category-dictionary > .category-icon {
list-style-image: url("chrome://mozapps/skin/extensions/category-dictionaries.png");
}
-#category-experiment > .category-icon {
- list-style-image: url("chrome://mozapps/skin/extensions/category-experiments.png");
-}
#category-availableUpdates > .category-icon {
list-style-image: url("chrome://mozapps/skin/extensions/category-available.png");
}
@@ -499,10 +496,6 @@
list-style-image: url("chrome://mozapps/skin/extensions/dictionaryGeneric.png");
}
-.addon-view[type="experiment"] .icon {
- list-style-image: url("chrome://mozapps/skin/extensions/experimentGeneric.png");
-}
-
.name-container {
font-size: 150%;
font-weight: bold;
@@ -1205,30 +1198,3 @@ button.button-link:not([disabled="true"]):active:hover {
.header-button > .toolbarbutton-text {
display: none;
}
-
-/*** telemetry experiments ***/
-
-#detail-experiment-container {
- font-size: 80%;
- margin-bottom: 1em;
-}
-
-#detail-experiment-bullet-container,
-#detail-experiment-state,
-#detail-experiment-time,
-.experiment-bullet-container,
-.experiment-state,
-.experiment-time {
- vertical-align: middle;
- display: inline-block;
-}
-
-.addon .experiment-bullet,
-#detail-experiment-bullet {
- fill: rgb(158, 158, 158);
-}
-
-.addon[active="true"] .experiment-bullet,
-#detail-view[active="true"] #detail-experiment-bullet {
- fill: rgb(106, 201, 20);
-}
diff --git a/toolkit/themes/windows/mozapps/jar.mn b/toolkit/themes/windows/mozapps/jar.mn
index 9f7562995f..b45fcb5a71 100644
--- a/toolkit/themes/windows/mozapps/jar.mn
+++ b/toolkit/themes/windows/mozapps/jar.mn
@@ -30,7 +30,6 @@ toolkit.jar:
skin/classic/mozapps/extensions/themeGeneric-16.png (extensions/themeGeneric-16.png)
skin/classic/mozapps/extensions/dictionaryGeneric.png (extensions/dictionaryGeneric.png)
skin/classic/mozapps/extensions/dictionaryGeneric-16.png (extensions/dictionaryGeneric-16.png)
- skin/classic/mozapps/extensions/experimentGeneric.png (extensions/experimentGeneric.png)
skin/classic/mozapps/extensions/localeGeneric.png (extensions/localeGeneric.png)
skin/classic/mozapps/extensions/rating-won.png (extensions/rating-won.png)
skin/classic/mozapps/extensions/rating-not-won.png (extensions/rating-not-won.png)
diff --git a/xpcom/base/nsCycleCollector.cpp b/xpcom/base/nsCycleCollector.cpp
index 2e5804929e..3d4d33a7df 100644
--- a/xpcom/base/nsCycleCollector.cpp
+++ b/xpcom/base/nsCycleCollector.cpp
@@ -622,13 +622,12 @@ PtrInfo::AnnotatedReleaseAssert(bool aCondition, const char* aMessage)
return;
}
-#ifdef MOZ_CRASHREPORTER
+#ifdef MOZ_DEBUG
const char* piName = "Unknown";
if (mParticipant) {
piName = mParticipant->ClassName();
}
- nsPrintfCString msg("%s, for class %s", aMessage, piName);
- CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("CycleCollector"), msg);
+ printf("cc: %s, for class %s\n", aMessage, piName);
#endif
MOZ_CRASH();
diff --git a/xpcom/io/nsLocalFileWin.cpp b/xpcom/io/nsLocalFileWin.cpp
index 2ff05666b1..42bd83d45e 100644
--- a/xpcom/io/nsLocalFileWin.cpp
+++ b/xpcom/io/nsLocalFileWin.cpp
@@ -3024,6 +3024,8 @@ nsLocalFile::IsExecutable(bool* aResult)
"com",
"cpl",
"crt",
+ "der",
+ "diagcab",
"exe",
"fxp", // FoxPro compiled app
"hlp",